ZGlmZiAtLWdpdCBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtLy5jbGFzc3BhdGggYi9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5wbGF0Zm9ybS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTA1YTA3Li4wMDAwMDAwCi0tLSBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBvdXRwdXQ9ImJpbi1pbnRybyIga2luZD0ic3JjIiBwYXRoPSJzcmMtaW50cm8iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS40Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtLy5jdnNpZ25vcmUgYi9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5wbGF0Zm9ybS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjZkNWE1Li4wMDAwMDAwCi0tLSBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWJpbgotYmluLWludHJvCmRpZmYgLS1naXQgYS9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5wbGF0Zm9ybS8ucHJvamVjdCBiL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjAxNTM4Li4wMDAwMDAwCi0tLSBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UucGxhdGZvcm08L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmY0NjViLi4wMDAwMDAwCi0tLSBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDI1MyArMCwwIEBACi0jTW9uIE9jdCAzMCAxNzowMjo1MSBFU1QgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWduX3R5cGVfbWVtYmVyc19vbl9jb2x1bW5zPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZW51bV9jb25zdGFudD0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2V4cGxpY2l0X2NvbnN0cnVjdG9yX2NhbGw9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9tZXRob2RfaW52b2NhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX3F1YWxpZmllZF9hbGxvY2F0aW9uX2V4cHJlc3Npb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2Fzc2lnbm1lbnQ9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYmluYXJ5X2V4cHJlc3Npb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbXBhY3RfaWY9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbmRpdGlvbmFsX2V4cHJlc3Npb249ODAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2VudW1fY29uc3RhbnRzPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2V4cHJlc3Npb25zX2luX2FycmF5X2luaXRpYWxpemVyPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9tdWx0aXBsZV9maWVsZHM9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3BhcmFtZXRlcnNfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3BhcmFtZXRlcnNfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zZWxlY3Rvcl9pbl9tZXRob2RfaW52b2NhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJjbGFzc19pbl90eXBlX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmludGVyZmFjZXNfaW5fZW51bV9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJpbnRlcmZhY2VzX2luX3R5cGVfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Rocm93c19jbGF1c2VfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Rocm93c19jbGF1c2VfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYWZ0ZXJfaW1wb3J0cz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYWZ0ZXJfcGFja2FnZT0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ZpZWxkPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmlyc3RfY2xhc3NfYm9keV9kZWNsYXJhdGlvbj0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ltcG9ydHM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9tZW1iZXJfdHlwZT0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX21ldGhvZD0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX25ld19jaHVuaz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX3BhY2thZ2U9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JldHdlZW5fdHlwZV9kZWNsYXJhdGlvbnM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYXJyYXlfaW5pdGlhbGl6ZXI9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYmxvY2s9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYmxvY2tfaW5fY2FzZT1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9lbnVtX2NvbnN0YW50PWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfbWV0aG9kX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX3N3aXRjaD1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl90eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lcz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2NvbW1lbnRzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfaGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9odG1sPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9zb3VyY2VfY29kZT10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbmRlbnRfcGFyYW1ldGVyX2Rlc2NyaXB0aW9uPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbmRlbnRfcm9vdF90YWdzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lmluc2VydF9uZXdfbGluZV9iZWZvcmVfcm9vdF90YWdzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2Zvcl9wYXJhbWV0ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQubGluZV9sZW5ndGg9ODAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21wYWN0X2Vsc2VfaWY9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbj0yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplcj0yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuZm9ybWF0X2d1YXJkaWFuX2NsYXVzZV9vbl9vbmVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2Fubm90YXRpb25fZGVjbGFyYXRpb25faGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19lbnVtX2NvbnN0YW50X2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fZW51bV9kZWNsYXJhdGlvbl9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX3R5cGVfaGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYnJlYWtzX2NvbXBhcmVfdG9fY2FzZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9lbXB0eV9saW5lcz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zdGF0ZW1lbnRzX2NvbXBhcmVfdG9fYmxvY2s9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zdGF0ZW1lbnRzX2NvbXBhcmVfdG9fYm9keT10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19jYXNlcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19zd2l0Y2g9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudGF0aW9uLnNpemU9NAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYXRfZW5kX29mX2ZpbGVfaWZfbWlzc2luZz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9jYXRjaF9pbl90cnlfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2Nsb3NpbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfZWxzZV9pbl9pZl9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfZmluYWxseV9pbl90cnlfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX3doaWxlX2luX2RvX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Fubm90YXRpb25fZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYmxvY2s9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2VudW1fY29uc3RhbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2VudW1fZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X21ldGhvZF9ib2R5PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hbmRfaW5fdHlwZV9wYXJhbWV0ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Fzc2lnbm1lbnRfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2F0X2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hdF9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9iaW5hcnlfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19icmFjZV9pbl9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19wYXJlbl9pbl9jYXN0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9hc3NlcnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Nhc2U9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2xhYmVsZWRfc3RhdGVtZW50PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Fubm90YXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2FycmF5X2luaXRpYWxpemVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl90aHJvd3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2VudW1fY29uc3RhbnRfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9lbnVtX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZXhwbGljaXRjb25zdHJ1Y3RvcmNhbGxfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9mb3JfaW5jcmVtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZm9yX2luaXRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3Rocm93cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2ludm9jYXRpb25fYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tdWx0aXBsZV9maWVsZF9kZWNsYXJhdGlvbnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX211bHRpcGxlX2xvY2FsX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fc3VwZXJpbnRlcmZhY2VzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fdHlwZV9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9lbGxpcHNpcz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jYXN0PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jYXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5faWY9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3doaWxlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcG9zdGZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3ByZWZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3F1ZXN0aW9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9xdWVzdGlvbl9pbl93aWxkY2FyZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3NlbWljb2xvbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3VuYXJ5X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2FuZF9pbl90eXBlX3BhcmFtZXRlcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Fzc2lnbm1lbnRfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hdF9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9iaW5hcnlfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jYXN0PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY2F0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9mb3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9pZj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3dpdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fd2hpbGU9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fYXNzZXJ0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fY2FzZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fZGVmYXVsdD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2xhYmVsZWRfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fdGhyb3dzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2VudW1fY29uc3RhbnRfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2VudW1fZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2V4cGxpY2l0Y29uc3RydWN0b3JjYWxsX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9mb3JfaW5jcmVtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9mb3JfaW5pdHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3Rocm93cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfaW52b2NhdGlvbl9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbXVsdGlwbGVfZmllbGRfZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX211bHRpcGxlX2xvY2FsX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3N1cGVyaW50ZXJmYWNlcz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfZWxsaXBzaXM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYmxvY2s9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9lbnVtX2NvbnN0YW50PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9lbnVtX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9tZXRob2RfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX3N3aXRjaD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbl90eXBlX21lbWJlcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2NhdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2lmPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3N3aXRjaD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl93aGlsZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbl9pbl9yZXR1cm49aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wb3N0Zml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3ByZWZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9xdWVzdGlvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3F1ZXN0aW9uX2luX3dpbGRjYXJkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb25faW5fZm9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3VuYXJ5X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9icmFja2V0c19pbl9hcnJheV90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfYnJhY2VzX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9icmFja2V0c19pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9hbm5vdGF0aW9uX3R5cGVfbWVtYmVyX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfZWxzZV9zdGF0ZW1lbnRfb25fc2FtZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9lbXB0eV9hcnJheV9pbml0aWFsaXplcl9vbl9vbmVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfaW1wbGVfaWZfb25fb25lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX3RoZW5fc3RhdGVtZW50X29uX3NhbWVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmxpbmVTcGxpdD04MDAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5udW1iZXJfb2ZfYmxhbmtfbGluZXNfYXRfYmVnaW5uaW5nX29mX21ldGhvZF9ib2R5PTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5udW1iZXJfb2ZfZW1wdHlfbGluZXNfdG9fcHJlc2VydmU9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnB1dF9lbXB0eV9zdGF0ZW1lbnRfb25fbmV3X2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLmNoYXI9dGFiCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5zaXplPTQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci51c2VfdGFic19vbmx5X2Zvcl9sZWFkaW5nX2luZGVudGF0aW9ucz1mYWxzZQpkaWZmIC0tZ2l0IGEvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmZGQyNDUuLjAwMDAwMDAKLS0tIGEvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotI01vbiBPY3QgMzAgMTc6MDI6NTEgRVNUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1mb3JtYXR0ZXJfcHJvZmlsZT1fY29yZQotZm9ybWF0dGVyX3NldHRpbmdzX3ZlcnNpb249MTAKZGlmZiAtLWdpdCBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtLzNfMVNwbGFzaFBzZC56aXAgYi9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5wbGF0Zm9ybS8zXzFTcGxhc2hQc2QuemlwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjAwNjA1Li4wMDAwMDAwCi0tLSBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtLzNfMVNwbGFzaFBzZC56aXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5wbGF0Zm9ybS9FY2xpcHNlU3BsYXNoXzMuMi5wc2QgYi9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5wbGF0Zm9ybS9FY2xpcHNlU3BsYXNoXzMuMi5wc2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkODk1NGQuLjAwMDAwMDAKLS0tIGEvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vRWNsaXBzZVNwbGFzaF8zLjIucHNkCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5wbGF0Zm9ybS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk2MjExNC4uMDAwMDAwMAotLS0gYS9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5wbGF0Zm9ybS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5wbGF0Zm9ybTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMy4yLjEwMC5xdWFsaWZpZXIKLUJ1bmRsZS1DbGFzc1BhdGg6IHN0YXJ0dXAuamFyLAotIHBsYXRmb3JtLmphcgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWkuaW50cm87YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLmNoZWF0c2hlZXRzO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIjtyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSBvcmcuZWNsaXBzZS51aS5mb3JtcztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSI7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCi0gb3JnLmVjbGlwc2UudWk7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiO3Jlc29sdXRpb246PW9wdGlvbmFsLAotIG9yZy5lY2xpcHNlLnVwZGF0ZS51aTtidW5kbGUtdmVyc2lvbj0iWzMuMS4wLDQuMC4wKSI7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCi0gb3JnLmVjbGlwc2UudWkuaW50cm8udW5pdmVyc2FsO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLmlkZS5hcHBsaWNhdGlvbjtidW5kbGUtdmVyc2lvbj0iWzEuMC4wLDIuMC4wKSIKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjQsCi0gQ0RDLTEuMC9Gb3VuZGF0aW9uLTEuMCwKLSBKMlNFLTEuMwotSW1wb3J0LVBhY2thZ2U6IGphdmF4LnhtbC5wYXJzZXJzLAotIG9yZy54bWwuc2F4LAotIG9yZy54bWwuc2F4LmhlbHBlcnMKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5jb3JlLmxhdW5jaGVyLAotIG9yZy5lY2xpcHNlLnBsYXRmb3JtLmludGVybmFsO3gtaW50ZXJuYWw6PXRydWUKZGlmZiAtLWdpdCBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL2Fib3V0Lmh0bWwgYi9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5wbGF0Zm9ybS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTg5ZjUzLi4wMDAwMDAwCi0tLSBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+TWF5IDExLCAyMDA2PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vYWJvdXQuaW5pIGIvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vYWJvdXQuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjdmNTA2Li4wMDAwMDAwCi0tLSBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL2Fib3V0LmluaQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLSMgYWJvdXQuaW5pCi0jIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZmVhdHVyZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcwotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0jIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciBmZWF0dXJlIGRldGFpbHMgaW4gdGhlICJBYm91dCIgCi0jIGRpYWxvZyAodHJhbnNsYXRlZCkuICBNYXhpbXVtIDE1IGxpbmVzIGFuZCA3NSBjaGFyYWN0ZXJzIHBlciBsaW5lLgotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJmZWF0dXJlSW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gZmVhdHVyZSBpbWFnZSAoMzJ4MzIpCi1mZWF0dXJlSW1hZ2U9ZWNsaXBzZTMyLnBuZwotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGFnZSIgY29udGFpbnMgcGF0aCB0byB3ZWxjb21lIHBhZ2UgKHNwZWNpYWwgWE1MLWJhc2VkIGZvcm1hdCkKLSMgKCRubCQvIHByZWZpeCB0byBwZXJtaXQgbG9jYWxlLXNwZWNpZmljIHRyYW5zbGF0aW9ucyBvZiBlbnRpcmUgZmlsZSkKLXdlbGNvbWVQYWdlPSRubCQvd2VsY29tZS54bWwKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBlcnNwZWN0aXZlIiBjb250YWlucyB0aGUgaWQgb2YgdGhlIHBlcnNwZWN0aXZlIGluIHdoaWNoIHRoZQotIyB3ZWxjb21lIHBhZ2UgaXMgdG8gYmUgb3BlbmVkLgotIyBvcHRpb25hbAotCi0jIFByb3BlcnR5ICJ0aXBzQW5kVHJpY2tzSHJlZiIgY29udGFpbnMgdGhlIEhlbHAgdG9waWMgaHJlZiB0byBhIHRpcHMgYW5kIHRyaWNrcyBwYWdlIAotIyBvcHRpb25hbAotdGlwc0FuZFRyaWNrc0hyZWY9L29yZy5lY2xpcHNlLnBsYXRmb3JtLmRvYy51c2VyL3RpcHMvcGxhdGZvcm1fdGlwcy5odG1sCi0KZGlmZiAtLWdpdCBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL2Fib3V0Lm1hcHBpbmdzIGIvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkZGFhYjQuLjAwMDAwMDAKLS0tIGEvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MKLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotMD1AYnVpbGRAClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vYWJvdXQucHJvcGVydGllcyBiL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhZmQzMjAuLjAwMDAwMDAKLS0tIGEvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0jCi0jIERvIG5vdCB0cmFuc2xhdGUgYW55IHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHt9Ci0KLWJsdXJiPUVjbGlwc2UgUGxhdGZvcm1cblwKLVxuXAotVmVyc2lvbjoge2ZlYXR1cmVWZXJzaW9ufVxuXAotQnVpbGQgaWQ6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwMCwgMjAwNi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCi1WaXNpdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3BsYXRmb3JtXG5cCi1cblwKLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlXG5cCi1BcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvCmRpZmYgLS1naXQgYS9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5wbGF0Zm9ybS9ib29rLmNzcyBiL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL2Jvb2suY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTgyMmIwLi4wMDAwMDAwCi0tLSBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL2Jvb2suY3NzCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLVAuQ29kZSB7DQotCWRpc3BsYXk6IGJsb2NrOw0KLQl0ZXh0LWFsaWduOiBsZWZ0Ow0KLQl0ZXh0LWluZGVudDogMC4wMHB0Ow0KLQltYXJnaW4tdG9wOiAwLjAwMDAwMHB0Ow0KLQltYXJnaW4tYm90dG9tOiAwLjAwMDAwMHB0Ow0KLQltYXJnaW4tcmlnaHQ6IDAuMDAwMDAwcHQ7DQotCW1hcmdpbi1sZWZ0OiAxNXB0Ow0KLQlmb250LXdlaWdodDogbm9ybWFsOw0KLQlmb250LXN0eWxlOiBub3JtYWw7DQotCWNvbG9yOiAjNDQ0NENDOw0KLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7DQotCXZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTsNCi0JdGV4dC10cmFuc2Zvcm06IG5vbmU7DQotCWZvbnQtZmFtaWx5OiAiQ291cmllciBOZXciLCBDb3VyaWVyLCBtb25vc3BhY2U7DQotfQ0KLUg2LkNhcHRpb25GaWdDb2x1bW4gew0KLQlkaXNwbGF5OiBibG9jazsNCi0JdGV4dC1hbGlnbjogbGVmdDsNCi0JdGV4dC1pbmRlbnQ6IDAuMDAwMDAwcHQ7DQotCW1hcmdpbi10b3A6IDMuMDAwMDAwcHQ7DQotCW1hcmdpbi1ib3R0b206IDExLjAwMDAwMHB0Ow0KLQltYXJnaW4tcmlnaHQ6IDAuMDAwMDAwcHQ7DQotCW1hcmdpbi1sZWZ0OiAwLjAwMDAwMHB0Ow0KLQlmb250LXNpemU6IDc1JTsNCi0JZm9udC13ZWlnaHQ6IGJvbGQ7DQotCWZvbnQtc3R5bGU6IEl0YWxpYzsNCi0JY29sb3I6ICMwMDAwMDA7DQotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsNCi0JdmVydGljYWwtYWxpZ246IGJhc2VsaW5lOw0KLQl0ZXh0LXRyYW5zZm9ybTogbm9uZTsNCi19DQotUC5Ob3RlIHsNCi0JZGlzcGxheTogYmxvY2s7DQotCXRleHQtYWxpZ246IGxlZnQ7DQotCXRleHQtaW5kZW50OiAwcHQ7DQotCW1hcmdpbi10b3A6IDE5LjUwMDAwMHB0Ow0KLQltYXJnaW4tYm90dG9tOiAxOS41MDAwMDBwdDsNCi0JbWFyZ2luLXJpZ2h0OiAwLjAwMDAwMHB0Ow0KLQltYXJnaW4tbGVmdDogMzBwdDsNCi0JZm9udC1zaXplOiAxMTAlOw0KLQlmb250LXdlaWdodDogbm9ybWFsOw0KLQlmb250LXN0eWxlOiBJdGFsaWM7DQotCWNvbG9yOiAjMDAwMDAwOw0KLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7DQotCXZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTsNCi0JdGV4dC10cmFuc2Zvcm06IG5vbmU7DQotfQ0KLUVNLlVJTGFiZWwgew0KLQlmb250LXdlaWdodDogQm9sZDsNCi0JZm9udC1zdHlsZTogbm9ybWFsOw0KLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7DQotCXZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTsNCi0JdGV4dC10cmFuc2Zvcm06IG5vbmU7DQotfQ0KLUVNLkNvZGVOYW1lIHsNCi0JZm9udC13ZWlnaHQ6IEJvbGQ7DQotCWZvbnQtc3R5bGU6IG5vcm1hbDsNCi0JdGV4dC1kZWNvcmF0aW9uOiBub25lOw0KLQl2ZXJ0aWNhbC1hbGlnbjogYmFzZWxpbmU7DQotCXRleHQtdHJhbnNmb3JtOiBub25lOw0KLQlmb250LWZhbWlseTogIkNvdXJpZXIgTmV3IiwgQ291cmllciwgbW9ub3NwYWNlOw0KLX0NCi1VTC5OYXZMaXN0IHsNCi0JbWFyZ2luLWxlZnQ6IDEuNWVtOw0KLQlwYWRkaW5nLWxlZnQ6IDBweDsNCi0JbGlzdC1zdHlsZS10eXBlOiBub25lOw0KLX0NCi0NCi1ib2R5LCBodG1sIHsgYm9yZGVyOiAwcHggfQ0KLQ0KLQ0KLS8qIGZvbGxvd2luZyBmb250IGZhY2UgZGVjbGFyYXRpb25zIG5lZWQgdG8gYmUgcmVtb3ZlZCBmb3IgREJDUyAqLw0KLQ0KLWJvZHksIGgxLCBoMiwgaDMsIGg0LCBoNSwgaDYsIHAsIHRhYmxlLCB0ZCwgY2FwdGlvbiwgdGgsIHVsLCBvbCwgZGwsIGxpLCBkZCwgZHQge2ZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBjb2xvcjogIzAwMDAwMH0NCi1wcmUsIGNvZGUJCXsgZm9udC1mYW1pbHk6ICJDb3VyaWVyIE5ldyIsIENvdXJpZXIsIG1vbm9zcGFjZTt9DQotDQotLyogZW5kIGZvbnQgZmFjZSBkZWNsYXJhdGlvbnMgKi8NCi0NCi1AbWVkaWEgcHJpbnQgew0KLQlodG1sIHsgZm9udC1zaXplOiAxMnB0IH0NCi19DQotDQotYm9keQkgICAgIHsgZm9udC1zaXplOiA4MyU7IGJhY2tncm91bmQ6ICNGRkZGRkY7IG1hcmdpbi1ib3R0b206IDFlbSB9DQotaDEgICAgICAgICAgIHsgZm9udC1zaXplOiAxODAlOyBtYXJnaW4tdG9wOiA1cHg7IG1hcmdpbi1ib3R0b206IDFweCB9CQ0KLWgyICAgICAgICAgICB7IGZvbnQtc2l6ZTogMTQwJTsgbWFyZ2luLXRvcDogMjVweDsgbWFyZ2luLWJvdHRvbTogM3B4IH0NCi1oMyAgICAgICAgICAgeyBmb250LXNpemU6IDExMCU7IG1hcmdpbi10b3A6IDIwcHg7IG1hcmdpbi1ib3R0b206IDNweCB9DQotaDQgICAgICAgICAgIHsgZm9udC1zaXplOiAxMDAlOyBtYXJnaW4tdG9wOiAyMHB4OyBtYXJnaW4tYm90dG9tOiAzcHg7IGZvbnQtc3R5bGU6IGl0YWxpYyB9DQotcCAgICAgICAgICAgIHsgbWFyZ2luLXRvcDogMTBweDsgbWFyZ2luLWJvdHRvbTogMTBweCB9DQotcHJlICAgICAgICAgIHsgZm9udC1zaXplOiA5MyU7IG1hcmdpbi1sZWZ0OiA2OyBjb2xvcjogIzQ0NDRDQyB9DQotY29kZSAgICAgICAgIHsgZm9udC1zaXplOiA5MyU7IH0gDQotdGFibGUgICAgICAgIHsgZm9udC1zaXplOiAxMDAlIH0gLyogbmVlZGVkIGZvciBxdWlya3MgbW9kZSAqLw0KLWE6bGluawkgICAgIHsgY29sb3I6ICMwMDAwRkYgfQ0KLWE6aG92ZXIJICAgICB7IGNvbG9yOiAjMDAwMDgwIH0NCi1hOnZpc2l0ZWQgICAgeyB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZSB9DQotdWwJICAgICB7IG1hcmdpbi10b3A6IDEwcHg7IG1hcmdpbi1ib3R0b206IDEwcHg7IH0NCi1saQkgICAgIHsgbWFyZ2luLXRvcDogNXB4OyBtYXJnaW4tYm90dG9tOiA1cHg7IH0gDQotbGkgcAkgICAgIHsgbWFyZ2luLXRvcDogNXB4OyBtYXJnaW4tYm90dG9tOiA1cHg7IH0NCi1vbAkgICAgIHsgbWFyZ2luLXRvcDogMTBweDsgbWFyZ2luLWJvdHRvbTogMTBweDsgfQ0KLWRsCSAgICAgeyBtYXJnaW4tdG9wOiAxMHB4OyBtYXJnaW4tYm90dG9tOiAxMHB4OyB9DQotZHQJICAgICB7IG1hcmdpbi10b3A6IDVweDsgbWFyZ2luLWJvdHRvbTogNXB4OyBmb250LXdlaWdodDogYm9sZDsgfQ0KLWRkCSAgICAgeyBtYXJnaW4tdG9wOiA1cHg7IG1hcmdpbi1ib3R0b206IDVweDsgfQ0KLXN0cm9uZwkgICAgIHsgZm9udC13ZWlnaHQ6IGJvbGR9DQotZW0JICAgICB7IGZvbnQtc3R5bGU6IGl0YWxpY30NCi12YXIJICAgICB7IGZvbnQtc3R5bGU6IGl0YWxpY30NCi1kaXYucmV2aXNpb24geyBib3JkZXItbGVmdC1zdHlsZTogc29saWQ7IGJvcmRlci1sZWZ0LXdpZHRoOiB0aGluOyANCi0JCQkJICAgYm9yZGVyLWxlZnQtY29sb3I6ICM3QjY4RUU7IHBhZGRpbmctbGVmdDo1IH0NCi10aAkgICAgIHsgZm9udC13ZWlnaHQ6IGJvbGQgfQ0KZGlmZiAtLWdpdCBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL2J1aWxkLnByb3BlcnRpZXMgYi9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5wbGF0Zm9ybS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTVhMWJiLi4wMDAwMDAwCi0tLSBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0LmluaSxcCi0gICAgICAgICAgICAgICBhYm91dC5tYXBwaW5ncyxcCi0gICAgICAgICAgICAgICBhYm91dC5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfbGcuZ2lmLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2UucG5nLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2UzMi5wbmcsXAotICAgICAgICAgICAgICAgZWNsaXBzZTQ4LnBuZyxcCi0gICAgICAgICAgICAgICBlY2xpcHNlLmdpZixcCi0gICAgICAgICAgICAgICBlY2xpcHNlMzIuZ2lmLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2U0OC5naWYsXAotICAgICAgICAgICAgICAgcGx1Z2luX2N1c3RvbWl6YXRpb24uaW5pLFwKLSAgICAgICAgICAgICAgIHBsdWdpbl9jdXN0b21pemF0aW9uLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBzcGxhc2guYm1wLFwKLSAgICAgICAgICAgICAgIGNoZWF0c2hlZXRzLyxcCi0gICAgICAgICAgICAgICBpbnRyby8sXAotICAgICAgICAgICAgICAgcGxhdGZvcm0uamFyLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBuYXJyb3dfYm9vay5jc3MsXAotICAgICAgICAgICAgICAgZGlzYWJsZWRfYm9vay5jc3MsXAotICAgICAgICAgICAgICAgYm9vay5jc3MsXAotICAgICAgICAgICAgICAgbWFjb3N4X25hcnJvd19ib29rLmNzcyxcCi0gICAgICAgICAgICAgICBpbnRyby1lY2xpcHNlLnBuZyxcCi0gICAgICAgICAgICAgICBpbnRyb0RhdGEueG1sLFwKLSAgICAgICAgICAgICAgIGhlbHBEYXRhLnhtbCxcCi0gICAgICAgICAgICAgICBpbWFnZXMvCi1zcmMuaW5jbHVkZXMgPSBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIGxhdW5jaGVyc3JjLnppcCxcCi0gICAgICAgICAgICAgICBwbGF0Zm9ybXNyYy56aXAKLXNvdXJjZS5zdGFydHVwLmphciA9IHNyYy8KLXNvdXJjZS5wbGF0Zm9ybS5qYXIgPSBzcmMtaW50cm8vCi1tYW5pZmVzdC5zdGFydHVwLmphciA9IE1FVEEtSU5GL01BTklGRVNULk1GCmRpZmYgLS1naXQgYS9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5wbGF0Zm9ybS9jaGVhdHNoZWV0cy9jdnNfY2hlY2tvdXQueG1sIGIvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vY2hlYXRzaGVldHMvY3ZzX2NoZWNrb3V0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg3MjI2Zi4uMDAwMDAwMAotLS0gYS9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5wbGF0Zm9ybS9jaGVhdHNoZWV0cy9jdnNfY2hlY2tvdXQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+IAotPGNoZWF0c2hlZXQgdGl0bGU9IkNoZWNrIG91dCBhIENWUyBwcm9qZWN0Ij4KLQotICA8aW50cm8gCi0gICAgICBocmVmPSIvb3JnLmVjbGlwc2UucGxhdGZvcm0uZG9jLnVzZXIvcmVmZXJlbmNlL3JlZi1jaGVhdHNoZWV0cy5odG0iPgotICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgIFRoaXMgY2hlYXQgc2hlZXQgc2hvd3MgeW91IGhvdyB0byBleHBsb3JlIGEgQ1ZTIHJlcG9zaXRvcnkgYW5kIGNoZWNrIG91dAotICAgICAgYSBwcm9qZWN0LiBJZiB5b3UgbmVlZCBoZWxwIGF0IGFueSBzdGVwLCBjbGljayBvbiB0aGUgKD8pIGljb24gdG8gdGhlCi0gICAgICByaWdodC4KLSAgICA8L2Rlc2NyaXB0aW9uPgotICA8L2ludHJvPgotCi0gIDxpdGVtCi0gICAgICB0aXRsZT0iT3BlbiB0aGUgQ1ZTIFJlcG9zaXRvcnkgRXhwbG9yaW5nIHBlcnNwZWN0aXZlIgotICAgICAgaHJlZj0iL29yZy5lY2xpcHNlLnBsYXRmb3JtLmRvYy51c2VyL3Rhc2tzL3Rhc2tzLTFoLmh0bSI+Ci0gICAgPGRlc2NyaXB0aW9uPgotICAgICAgRnJvbSB0aGUgbWFpbiBtZW51LCBzZWxlY3QgV2luZG93ICZndDsgT3BlbiBQZXJzcGVjdGl2ZSAmZ3Q7IE90aGVyLi4uLAotICAgICAgdGhlbiBzZWxlY3QgdGhlIDxiPkNWUyBSZXBvc2l0b3J5IEV4cGxvcmluZzwvYj4gcGVyc3BlY3RpdmUuCi0gICAgPC9kZXNjcmlwdGlvbj4KLSAgICA8Y29tbWFuZAotICAgICAgICBzZXJpYWxpemF0aW9uPSJvcmcuZWNsaXBzZS51aS5wZXJzcGVjdGl2ZXMuc2hvd1BlcnNwZWN0aXZlKG9yZy5lY2xpcHNlLnVpLnBlcnNwZWN0aXZlcy5zaG93UGVyc3BlY3RpdmUucGVyc3BlY3RpdmVJZD1vcmcuZWNsaXBzZS50ZWFtLmN2cy51aS5jdnNQZXJzcGVjdGl2ZSkiCi0gICAgICAgIGNvbmZpcm09InRydWUiPgotICAgIDwvY29tbWFuZD4KLSAgPC9pdGVtPgotCi0gIDxpdGVtCi0gICAgICB0aXRsZT0iQWRkIGEgQ1ZTIHJlcG9zaXRvcnkiCi0gICAgICBocmVmPSIvb3JnLmVjbGlwc2UucGxhdGZvcm0uZG9jLnVzZXIvdGFza3MvdGFza3MtOTIuaHRtIj4KLSAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICBJbiB0aGUgQ1ZTIFJlcG9zaXRvcmllcyB2aWV3LCBjbGljayBvbiB0aGUgPGI+QWRkIENWUyBSZXBvc2l0b3J5PC9iPgotICAgICAgdG9vbGJhciBidXR0b24uIEVudGVyIHRoZSBsb2NhdGlvbiBhbmQgYXV0aGVudGljYXRpb24gaW5mb3JtYXRpb24gZm9yCi0gICAgICB0aGUgcmVwb3NpdG9yeS4gRm9yIGV4YW1wbGUsIGZvciB0aGUgPGI+ZWNsaXBzZTwvYj4gcmVwb3NpdG9yeSwgZW50ZXIgdGhlCi0gICAgICBmb2xsb3dpbmc6PGJyLz4KLSAgICAgIDxici8+Ci0gICAgICBIb3N0OiBkZXYuZWNsaXBzZS5vcmc8YnIvPgotICAgICAgUmVwb3NpdG9yeSBwYXRoOiAvY3Zzcm9vdC9lY2xpcHNlPGJyLz4KLSAgICAgIFVzZXI6IGFub255bW91czxici8+Ci0gICAgICBDb25uZWN0aW9uIHR5cGU6IHBzZXJ2ZXI8YnIvPgotICAgICAgPGJyLz4KLSAgICAgIFVzZSBkZWZhdWx0cyBmb3IgdGhlIHJlc3QsIHRoZW4gY2xpY2sgRmluaXNoLgotICAgIDwvZGVzY3JpcHRpb24+Ci0gIDwvaXRlbT4KLQotICA8aXRlbQotICAgICAgdGl0bGU9IkxvY2F0ZSB0aGUgcHJvamVjdCIKLSAgICAgIGhyZWY9Ii9vcmcuZWNsaXBzZS5wbGF0Zm9ybS5kb2MudXNlci90YXNrcy90YXNrcy0xaS5odG0iPgotICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgIEV4cGFuZCB0aGUgPGI+SEVBRDwvYj4gbm9kZSB1bmRlciB0aGUgbmV3bHkgYWRkZWQgcmVwb3NpdG9yeSwgYW5kIGxvY2F0ZQotICAgICAgdGhlIHByb2plY3QgeW91IHdpc2ggdG8gY2hlY2sgb3V0IChlLmcuIHRvIGZpbmQgdGhlIHNvdXJjZSBjb2RlIGZvciB0aGUKLSAgICAgIGNoZWF0IHNoZWV0IHZpZXcsIHRoaXMgaXMgaW4gb3JnLmVjbGlwc2UudWkuY2hlYXRzaGVldHMpCi0gICAgPC9kZXNjcmlwdGlvbj4KLSAgPC9pdGVtPgotCi0gIDxpdGVtCi0gICAgICB0aXRsZT0iQ2hlY2sgb3V0IHRoZSBwcm9qZWN0IgotICAgICAgaHJlZj0iL29yZy5lY2xpcHNlLnBsYXRmb3JtLmRvYy51c2VyL3Rhc2tzL3Rhc2tzLTk2Lmh0bSI+Ci0gICAgPGRlc2NyaXB0aW9uPgotICAgICAgUmlnaHQgY2xpY2sgb24gdGhlIHByb2plY3QgeW91IHdpc2ggdG8gY2hlY2sgb3V0IGFuZCBzZWxlY3QgPGI+Q2hlY2sKLSAgICAgIE91dDwvYj4uIFRoaXMgd2lsbCBkb3dubG9hZCB0aGUgbGF0ZXN0IGNvbnRlbnQgZnJvbSB0aGUgcmVwb3NpdG9yeSBpbnRvCi0gICAgICB5b3VyIHdvcmtzcGFjZS4KLSAgICA8L2Rlc2NyaXB0aW9uPgotICA8L2l0ZW0+Ci0KLSAgPGl0ZW0KLSAgICAgIHRpdGxlPSJWaWV3IHRoZSB3b3Jrc3BhY2UiCi0gICAgICBocmVmPSIvb3JnLmVjbGlwc2UucGxhdGZvcm0uZG9jLmlzdi9ndWlkZS9yZXNJbnRfd29ya3NwYWNlLmh0bSI+Ci0gICAgPGRlc2NyaXB0aW9uPgotICAgICAgVG8gc2VlIHRoZSBwcm9qZWN0IGluIHlvdXIgd29ya3NwYWNlLCBzd2l0Y2ggdG8gdGhlIDxiPlJlc291cmNlPC9iPgotICAgICAgcGVyc3BlY3RpdmUgdmlhIFdpbmRvdyAmZ3Q7IE9wZW4gUGVyc3BlY3RpdmUgJmd0OyBSZXNvdXJjZSB0byBzZWUgdGhlCi0gICAgICBwcm9qZWN0IGluIHRoZSA8Yj5OYXZpZ2F0b3I8L2I+IHZpZXcuIFlvdSBjYW4gbm93IHZpZXcgYW5kIHdvcmsgd2l0aCB0aGUKLSAgICAgIGNvbnRlbnRzIG9mIHRoZSBwcm9qZWN0LgotICAgIDwvZGVzY3JpcHRpb24+Ci0gIDwvaXRlbT4KLQotPC9jaGVhdHNoZWV0PgpkaWZmIC0tZ2l0IGEvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vY2hlYXRzaGVldHMvY3ZzX21lcmdlLnhtbCBiL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL2NoZWF0c2hlZXRzL2N2c19tZXJnZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzM2Y1MGIuLjAwMDAwMDAKLS0tIGEvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vY2hlYXRzaGVldHMvY3ZzX21lcmdlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/PiAKLTxjaGVhdHNoZWV0IHRpdGxlPSJNZXJnZSBDVlMgYnJhbmNoZXMiPgotCi0gIDxpbnRybyAKLSAgICAgIGhyZWY9Ii9vcmcuZWNsaXBzZS5wbGF0Zm9ybS5kb2MudXNlci9yZWZlcmVuY2UvcmVmLWNoZWF0c2hlZXRzLmh0bSI+Ci0gICAgPGRlc2NyaXB0aW9uPgotICAgICAgVGhpcyBjaGVhdCBzaGVldCBzaG93cyB5b3UgdGhlIHN0ZXBzIHRvIG1lcmdlIGNoYW5nZXMgZnJvbSBvbmUgQ1ZTIGJyYW5jaAotICAgICAgaW50byBhbm90aGVyLCBvciBpbnRvIEhFQUQuIElmIHlvdSBuZWVkIGhlbHAgYXQgYW55IHN0ZXAsIGNsaWNrIG9uIHRoZSAoPykKLSAgICAgIGljb24gdG8gdGhlIHJpZ2h0LgotICAgIDwvZGVzY3JpcHRpb24+Ci0gIDwvaW50cm8+Ci0KLSAgPGl0ZW0KLSAgICAgIGhyZWY9Ii9vcmcuZWNsaXBzZS5wbGF0Zm9ybS5kb2MudXNlci90YXNrcy90YXNrcy0xMDBiLmh0bSIKLSAgICAgIHRpdGxlPSJEZXRlcm1pbmUgYnJhbmNoIGFuZCB2ZXJzaW9uIGluZm9ybWF0aW9uIj4KLSAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICBUaGUgZmlyc3Qgc3RlcCBpcyB0byBkZWNpZGUgPGI+d2hpY2g8L2I+IHR3byBicmFuY2hlcyB3aWxsIGJlIG1lcmdlZCwgYXQKLSAgICAgIHdoaWNoIDxiPnZlcnNpb248L2I+IHRoZSBjb250ZW50IHdhcyBicmFuY2hlZCwgYW5kIHdoYXQgdGhlCi0gICAgICA8Yj5kZXN0aW5hdGlvbjwvYj4gYnJhbmNoIHdpbGwgYmUgKHdoZXJlIHRoZSByZXN1bHQgb2YgdGhlIG1lcmdlIHdpbGwgZ28pLgotICAgICAgT25jZSB5b3UgaGF2ZSB0aGlzIGluZm9ybWF0aW9uLCB5b3UgY2FuIG1vdmUgb24gdG8gdGhlIG5leHQgc3RlcC4KLSAgICA8L2Rlc2NyaXB0aW9uPgotICA8L2l0ZW0+Ci0KLSAgPGl0ZW0KLSAgICAgIGhyZWY9Ii9vcmcuZWNsaXBzZS5wbGF0Zm9ybS5kb2MudXNlci90YXNrcy90YXNrcy05Ni5odG0iCi0gICAgICB0aXRsZT0iQ2hlY2sgb3V0IHRoZSBwcm9qZWN0Ij4KLSAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICBCZWZvcmUgbWVyZ2luZywgeW91IG11c3QgPGI+Y2hlY2sgb3V0PC9iPiB0aGUgcHJvamVjdCB5b3Ugd2lzaCB0byBtZXJnZQotICAgICAgYW5kIGJyaW5nIGl0IGludG8geW91ciB3b3Jrc3BhY2UuIFlvdSBjYW4gZG8gdGhpcyBlaXRoZXIgdmlhIHRoZSBpbXBvcnQKLSAgICAgIHdpemFyZCBvciBieSBhZGRpbmcgeW91ciByZXBvc2l0b3J5IGZyb20gdGhlIENWUyBSZXBvc2l0b3J5IEV4cGxvcmluZwotICAgICAgcGVyc3BlY3RpdmUsIG9yIGNsaWNrIHRoZSAoPykgYnV0dG9uIGZvciBoZWxwLgotICAgIDwvZGVzY3JpcHRpb24+Ci0gIDwvaXRlbT4KLQotICA8aXRlbQotICAgICAgaHJlZj0iL29yZy5lY2xpcHNlLnBsYXRmb3JtLmRvYy51c2VyL3Rhc2tzL3Rhc2tzLTEwMy5odG0iCi0gICAgICB0aXRsZT0iTG9hZCB0aGUgZGVzdGluYXRpb24gaW50byB5b3VyIHdvcmtzcGFjZSI+Ci0gICAgPGRlc2NyaXB0aW9uPgotICAgICAgSW4gdGhlIG5hdmlnYXRvciwgcmlnaHQtY2xpY2sgb24gdGhlIHByb2plY3QgYW5kIHNlbGVjdCBSZXBsYWNlIFdpdGggJmd0OwotICAgICAgQW5vdGhlciBCcmFuY2ggb3IgVmVyc2lvbi4gU2VsZWN0IHRoZSBkZXN0aW5hdGlvbiBicmFuY2guIFRoaXMgd2lsbCBsb2FkCi0gICAgICB0aGUgYnJhbmNoJ3MgbGF0ZXN0IGNvbnRlbnQgaW50byB5b3VyIHdvcmtzcGFjZS4KLSAgICA8L2Rlc2NyaXB0aW9uPgotICA8L2l0ZW0+Ci0KLSAgPGl0ZW0KLSAgICAgIGhyZWY9Ii9vcmcuZWNsaXBzZS5wbGF0Zm9ybS5kb2MudXNlci90YXNrcy90YXNrcy0xMDBiLmh0bSIKLSAgICAgIHRpdGxlPSJNZXJnZSBkZXRhaWxzIj4KLSAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICBBZ2FpbiBpbiB0aGUgbmF2aWdhdG9yLCByaWdodC1jbGljayBvbiB0aGUgcHJvamVjdCBhbmQgc2VsZWN0IDxiPlRlYW08L2I+Ci0gICAgICAmZ3Q7IDxiPk1lcmdlPC9iPiBhbmQgY29tcGxldGUgdGhlIHN0ZXBzIGluIHRoZSB3aXphcmQuIEluIHRoaXMgd2l6YXJkIHlvdQotICAgICAgc3BlY2lmeSB0aGUgZGV0YWlscyBvZiB0aGUgbWVyZ2UuCi0gICAgPC9kZXNjcmlwdGlvbj4KLSAgPC9pdGVtPgotCi0gIDxpdGVtCi0gICAgICBocmVmPSIvb3JnLmVjbGlwc2UucGxhdGZvcm0uZG9jLnVzZXIvdGFza3MvdGFza3MtMTAwYi5odG0iCi0gICAgICB0aXRsZT0iV29yayB3aXRoIHRoZSBNZXJnZSBlZGl0b3IiPgotICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgIEluIHRoZSBNZXJnZSBlZGl0b3IgbWFudWFsbHkgbWVyZ2UgdGhlIGNoYW5nZXMuIFRoaXMgc3RlcCBsb2FkcyB0aGUKLSAgICAgIHJlcXVpcmVkIGNoYW5nZXMgaW50byB0aGUgd29ya3NwYWNlLiBPbmNlIHlvdSd2ZSBtZXJnZWQgYWxsIHRoZSBjaGFuZ2VzCi0gICAgICBhbmQgYXJlIHNhdGlzZmllZCB3aXRoIHRoZSByZXN1bHQsIG1vdmUgb24gdG8gdGhlIG5leHQgc3RlcC4KLSAgICA8L2Rlc2NyaXB0aW9uPgotICA8L2l0ZW0+Ci0KLSAgPGl0ZW0KLSAgICAgIGhyZWY9Ii9vcmcuZWNsaXBzZS5wbGF0Zm9ybS5kb2MudXNlci90YXNrcy90YXNrcy0xMTQuaHRtIgotICAgICAgdGl0bGU9IkNvbW1pdCB5b3VyIGNoYW5nZXMiPgotICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgIFJpZ2h0LWNsaWNrIG9uIHRoZSBwcm9qZWN0IGFuZCBzZWxlY3QgPGI+VGVhbTwvYj4gJmd0OyA8Yj5TeW5jaHJvbml6ZSB3aXRoCi0gICAgICBSZXBvc2l0b3J5PC9iPiBhbmQgdGhlbiBjb21taXQgYWxsIHRoZSBjaGFuZ2VzIHRvIHRoZSByZXBvc2l0b3J5LiBUaGlzCi0gICAgICBzdGVwIGZpbmFsaXplcyB0aGUgdHJhbnNmZXIgb2YgdGhlIGNoYW5nZXMgZnJvbSB0aGUgd29ya3NwYWNlIHRvIHRoZSBDVlMKLSAgICAgIHJlcG9zaXRvcnksIGFuZCBmaW5hbGl6ZXMgdGhlIG1lcmdlLgotICAgIDwvZGVzY3JpcHRpb24+Ci0gIDwvaXRlbT4KLQotPC9jaGVhdHNoZWV0PgpkaWZmIC0tZ2l0IGEvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vZGlzYWJsZWRfYm9vay5jc3MgYi9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5wbGF0Zm9ybS9kaXNhYmxlZF9ib29rLmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFiZDAwNC4uMDAwMDAwMAotLS0gYS9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5wbGF0Zm9ybS9kaXNhYmxlZF9ib29rLmNzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL2VjbGlwc2UuZ2lmIGIvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vZWNsaXBzZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkN2UzMmIuLjAwMDAwMDAKLS0tIGEvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vZWNsaXBzZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5wbGF0Zm9ybS9lY2xpcHNlLnBuZyBiL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL2VjbGlwc2UucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWUzYmI1Li4wMDAwMDAwCi0tLSBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL2VjbGlwc2UucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vZWNsaXBzZTI0LmdpZiBiL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL2VjbGlwc2UyNC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0Mjk2YWMuLjAwMDAwMDAKLS0tIGEvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vZWNsaXBzZTI0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL2VjbGlwc2UzMi5naWYgYi9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5wbGF0Zm9ybS9lY2xpcHNlMzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmFkN2NjLi4wMDAwMDAwCi0tLSBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL2VjbGlwc2UzMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5wbGF0Zm9ybS9lY2xpcHNlMzIucG5nIGIvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vZWNsaXBzZTMyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY4ZmFjMS4uMDAwMDAwMAotLS0gYS9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5wbGF0Zm9ybS9lY2xpcHNlMzIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vZWNsaXBzZTQ4LmdpZiBiL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL2VjbGlwc2U0OC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwYTQwZDYuLjAwMDAwMDAKLS0tIGEvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vZWNsaXBzZTQ4LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL2VjbGlwc2U0OC5wbmcgYi9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5wbGF0Zm9ybS9lY2xpcHNlNDgucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzkzOWM4Li4wMDAwMDAwCi0tLSBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL2VjbGlwc2U0OC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5wbGF0Zm9ybS9lY2xpcHNlX2xnLmdpZiBiL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL2VjbGlwc2VfbGcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjhiODcyLi4wMDAwMDAwCi0tLSBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL2VjbGlwc2VfbGcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vaGVscERhdGEueG1sIGIvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vaGVscERhdGEueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODM4NjA1Li4wMDAwMDAwCi0tLSBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL2hlbHBEYXRhLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08ZXh0ZW5zaW9ucz4KLQk8dG9jT3JkZXI+Ci0JCTx0b2MgaWQ9Ii9vcmcuZWNsaXBzZS5wbGF0Zm9ybS5kb2MudXNlci90b2MueG1sIi8+Ci0JCTx0b2MgaWQ9Ii9vcmcuZWNsaXBzZS5qZHQuZG9jLnVzZXIvdG9jLnhtbCIvPgotCQk8dG9jIGlkPSIvb3JnLmVjbGlwc2UucGxhdGZvcm0uZG9jLmlzdi90b2MueG1sIi8+Ci0JCTx0b2MgaWQ9Ii9vcmcuZWNsaXBzZS5qZHQuZG9jLmlzdi90b2MueG1sIi8+Ci0JCTx0b2MgaWQ9Ii9vcmcuZWNsaXBzZS5wZGUuZG9jLnVzZXIvdG9jLnhtbCIvPgotCTwvdG9jT3JkZXI+Ci08L2V4dGVuc2lvbnM+CmRpZmYgLS1naXQgYS9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5wbGF0Zm9ybS9pbWFnZXMvdG9waWNsYWJlbC9hcnJvdy5naWYgYi9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5wbGF0Zm9ybS9pbWFnZXMvdG9waWNsYWJlbC9hcnJvdy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzOGMzZDYuLjAwMDAwMDAKLS0tIGEvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vaW1hZ2VzL3RvcGljbGFiZWwvYXJyb3cuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vaW1hZ2VzL3RvcGljbGFiZWwvb3ZfdGVhbXN1cDQ4LmdpZiBiL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL2ltYWdlcy90b3BpY2xhYmVsL292X3RlYW1zdXA0OC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkOTNkYjAuLjAwMDAwMDAKLS0tIGEvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vaW1hZ2VzL3RvcGljbGFiZWwvb3ZfdGVhbXN1cDQ4LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL2ltYWdlcy90b3BpY2xhYmVsL292X3RlYW1zdXA0OF9ob3YuZ2lmIGIvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vaW1hZ2VzL3RvcGljbGFiZWwvb3ZfdGVhbXN1cDQ4X2hvdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2NGU5YWYuLjAwMDAwMDAKLS0tIGEvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vaW1hZ2VzL3RvcGljbGFiZWwvb3ZfdGVhbXN1cDQ4X2hvdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5wbGF0Zm9ybS9pbWFnZXMvdG9waWNsYWJlbC9vdl93YmJhc2ljczQ4LmdpZiBiL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL2ltYWdlcy90b3BpY2xhYmVsL292X3diYmFzaWNzNDguZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDEwMmM5Li4wMDAwMDAwCi0tLSBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL2ltYWdlcy90b3BpY2xhYmVsL292X3diYmFzaWNzNDguZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vaW1hZ2VzL3RvcGljbGFiZWwvb3Zfd2JiYXNpY3M0OF9ob3YuZ2lmIGIvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vaW1hZ2VzL3RvcGljbGFiZWwvb3Zfd2JiYXNpY3M0OF9ob3YuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzgzMGIwLi4wMDAwMDAwCi0tLSBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL2ltYWdlcy90b3BpY2xhYmVsL292X3diYmFzaWNzNDhfaG92LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL2ltYWdlcy90b3BpY2xhYmVsL3R1X2NoZWNrb3V0NDguZ2lmIGIvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vaW1hZ2VzL3RvcGljbGFiZWwvdHVfY2hlY2tvdXQ0OC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzZGU0ZDIuLjAwMDAwMDAKLS0tIGEvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vaW1hZ2VzL3RvcGljbGFiZWwvdHVfY2hlY2tvdXQ0OC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5wbGF0Zm9ybS9pbWFnZXMvdG9waWNsYWJlbC90dV9jaGVja291dDQ4X2hvdi5naWYgYi9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5wbGF0Zm9ybS9pbWFnZXMvdG9waWNsYWJlbC90dV9jaGVja291dDQ4X2hvdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmYTg2ZjkuLjAwMDAwMDAKLS0tIGEvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vaW1hZ2VzL3RvcGljbGFiZWwvdHVfY2hlY2tvdXQ0OF9ob3YuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vaW1hZ2VzL3RvcGljbGFiZWwvdHVfbWVyZ2U0OC5naWYgYi9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5wbGF0Zm9ybS9pbWFnZXMvdG9waWNsYWJlbC90dV9tZXJnZTQ4LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ5M2RiMC4uMDAwMDAwMAotLS0gYS9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5wbGF0Zm9ybS9pbWFnZXMvdG9waWNsYWJlbC90dV9tZXJnZTQ4LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL2ltYWdlcy90b3BpY2xhYmVsL3R1X21lcmdlNDhfaG92LmdpZiBiL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL2ltYWdlcy90b3BpY2xhYmVsL3R1X21lcmdlNDhfaG92LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDY0ZTlhZi4uMDAwMDAwMAotLS0gYS9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5wbGF0Zm9ybS9pbWFnZXMvdG9waWNsYWJlbC90dV9tZXJnZTQ4X2hvdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5wbGF0Zm9ybS9pbWFnZXMvdG9waWNsYWJlbC93bl9lY2xjb21tdW5pdHk0OC5naWYgYi9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5wbGF0Zm9ybS9pbWFnZXMvdG9waWNsYWJlbC93bl9lY2xjb21tdW5pdHk0OC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3NWNmYWEuLjAwMDAwMDAKLS0tIGEvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vaW1hZ2VzL3RvcGljbGFiZWwvd25fZWNsY29tbXVuaXR5NDguZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vaW1hZ2VzL3RvcGljbGFiZWwvd25fZWNsY29tbXVuaXR5NDhfaG92LmdpZiBiL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL2ltYWdlcy90b3BpY2xhYmVsL3duX2VjbGNvbW11bml0eTQ4X2hvdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlYzJjY2UuLjAwMDAwMDAKLS0tIGEvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vaW1hZ2VzL3RvcGljbGFiZWwvd25fZWNsY29tbXVuaXR5NDhfaG92LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL2ltYWdlcy90b3BpY2xhYmVsL3duX2VjbHBsYXRmb3JtNDguZ2lmIGIvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vaW1hZ2VzL3RvcGljbGFiZWwvd25fZWNscGxhdGZvcm00OC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2ZmE1OWYuLjAwMDAwMDAKLS0tIGEvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vaW1hZ2VzL3RvcGljbGFiZWwvd25fZWNscGxhdGZvcm00OC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5wbGF0Zm9ybS9pbWFnZXMvdG9waWNsYWJlbC93bl9lY2xwbGF0Zm9ybTQ4X2hvdi5naWYgYi9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5wbGF0Zm9ybS9pbWFnZXMvdG9waWNsYWJlbC93bl9lY2xwbGF0Zm9ybTQ4X2hvdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2MjRmYzEuLjAwMDAwMDAKLS0tIGEvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vaW1hZ2VzL3RvcGljbGFiZWwvd25fZWNscGxhdGZvcm00OF9ob3YuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vaW1hZ2VzL3RvcGljbGFiZWwvd25fbWlncmF0ZTQ4LmdpZiBiL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL2ltYWdlcy90b3BpY2xhYmVsL3duX21pZ3JhdGU0OC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzZGU0ZDIuLjAwMDAwMDAKLS0tIGEvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vaW1hZ2VzL3RvcGljbGFiZWwvd25fbWlncmF0ZTQ4LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL2ltYWdlcy90b3BpY2xhYmVsL3duX21pZ3JhdGU0OF9ob3YuZ2lmIGIvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vaW1hZ2VzL3RvcGljbGFiZWwvd25fbWlncmF0ZTQ4X2hvdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmYTg2ZjkuLjAwMDAwMDAKLS0tIGEvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vaW1hZ2VzL3RvcGljbGFiZWwvd25fbWlncmF0ZTQ4X2hvdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5wbGF0Zm9ybS9pbWFnZXMvdG9waWNsYWJlbC93bl91cGRhdGVzNDguZ2lmIGIvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vaW1hZ2VzL3RvcGljbGFiZWwvd25fdXBkYXRlczQ4LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJmODBkOC4uMDAwMDAwMAotLS0gYS9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5wbGF0Zm9ybS9pbWFnZXMvdG9waWNsYWJlbC93bl91cGRhdGVzNDguZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vaW1hZ2VzL3RvcGljbGFiZWwvd25fdXBkYXRlczQ4X2hvdi5naWYgYi9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5wbGF0Zm9ybS9pbWFnZXMvdG9waWNsYWJlbC93bl91cGRhdGVzNDhfaG92LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhmYmJlZC4uMDAwMDAwMAotLS0gYS9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5wbGF0Zm9ybS9pbWFnZXMvdG9waWNsYWJlbC93bl91cGRhdGVzNDhfaG92LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL2ludHJvLWVjbGlwc2UucG5nIGIvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vaW50cm8tZWNsaXBzZS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NjEyNjguLjAwMDAwMDAKLS0tIGEvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vaW50cm8tZWNsaXBzZS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5wbGF0Zm9ybS9pbnRyby9jc3Mvb3ZlcnZpZXcuY3NzIGIvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vaW50cm8vY3NzL292ZXJ2aWV3LmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M1ZDZhZC4uMDAwMDAwMAotLS0gYS9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5wbGF0Zm9ybS9pbnRyby9jc3Mvb3ZlcnZpZXcuY3NzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1hI2Jhc2ljcyBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKCcuLi8uLi9pbWFnZXMvdG9waWNsYWJlbC9vdl93YmJhc2ljczQ4LmdpZicpOyB9Ci1hI2Jhc2ljczpob3ZlciBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKCcuLi8uLi9pbWFnZXMvdG9waWNsYWJlbC9vdl93YmJhc2ljczQ4X2hvdi5naWYnKTsgfQotCi1hI3RlYW0gaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybCgnLi4vLi4vaW1hZ2VzL3RvcGljbGFiZWwvb3ZfdGVhbXN1cDQ4LmdpZicpOyB9Ci1hI3RlYW06aG92ZXIgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybCgnLi4vLi4vaW1hZ2VzL3RvcGljbGFiZWwvb3ZfdGVhbXN1cDQ4X2hvdi5naWYnKTsgfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL2ludHJvL2Nzcy9vdmVydmlldy5wcm9wZXJ0aWVzIGIvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vaW50cm8vY3NzL292ZXJ2aWV3LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3ZTMzZTcuLjAwMDAwMDAKLS0tIGEvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vaW50cm8vY3NzL292ZXJ2aWV3LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1vdmVydmlldy5wYWdlLWNvbnRlbnQub3ZlcnZpZXctbGlua3MubGF5b3V0LnZzcGFjaW5nID0gMzUKLQotb3ZlcnZpZXcuYmFzaWNzLmxpbmstaWNvbiA9IGltYWdlcy90b3BpY2xhYmVsL292X3diYmFzaWNzNDguZ2lmCi1vdmVydmlldy5iYXNpY3MuaG92ZXItaWNvbiA9IGltYWdlcy90b3BpY2xhYmVsL292X3diYmFzaWNzNDhfaG92LmdpZgotCi1vdmVydmlldy50ZWFtLmxpbmstaWNvbiA9IGltYWdlcy90b3BpY2xhYmVsL292X3RlYW1zdXA0OC5naWYKLW92ZXJ2aWV3LnRlYW0uaG92ZXItaWNvbiA9IGltYWdlcy90b3BpY2xhYmVsL292X3RlYW1zdXA0OF9ob3YuZ2lmCi0KLW92ZXJ2aWV3LnN1YnRpdGxlLWlkID0gb3ZlcnZpZXcvcGFnZS1jb250ZW50L3BhZ2UtdGl0bGUKLW92ZXJ2aWV3LmRlc2NyaXB0aW9uLWlkID0gb3ZlcnZpZXcvcGFnZS1jb250ZW50L3BhZ2UtZGVzY3JpcHRpb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5wbGF0Zm9ybS9pbnRyby9jc3MvdHV0b3JpYWxzLmNzcyBiL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL2ludHJvL2Nzcy90dXRvcmlhbHMuY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Mjc3MGUyLi4wMDAwMDAwCi0tLSBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL2ludHJvL2Nzcy90dXRvcmlhbHMuY3NzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1hI2N2c19jaGVja291dCBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKCcuLi8uLi9pbWFnZXMvdG9waWNsYWJlbC90dV9jaGVja291dDQ4LmdpZicpOyB9Ci1hI2N2c19jaGVja291dDpob3ZlciBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKCcuLi8uLi9pbWFnZXMvdG9waWNsYWJlbC90dV9jaGVja291dDQ4X2hvdi5naWYnKTsgfQotCi1hI2N2c19tZXJnZSBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKCcuLi8uLi9pbWFnZXMvdG9waWNsYWJlbC90dV9tZXJnZTQ4LmdpZicpOyB9Ci1hI2N2c19tZXJnZTpob3ZlciBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKCcuLi8uLi9pbWFnZXMvdG9waWNsYWJlbC90dV9tZXJnZTQ4X2hvdi5naWYnKTsgfQpkaWZmIC0tZ2l0IGEvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vaW50cm8vY3NzL3R1dG9yaWFscy5wcm9wZXJ0aWVzIGIvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vaW50cm8vY3NzL3R1dG9yaWFscy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODE0ZmEyLi4wMDAwMDAwCi0tLSBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL2ludHJvL2Nzcy90dXRvcmlhbHMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotdHV0b3JpYWxzLmN2c19jaGVja291dC5saW5rLWljb24gPSBpbWFnZXMvdG9waWNsYWJlbC90dV9jaGVja291dDQ4LmdpZgotdHV0b3JpYWxzLmN2c19jaGVja291dC5ob3Zlci1pY29uID0gaW1hZ2VzL3RvcGljbGFiZWwvdHVfY2hlY2tvdXQ0OF9ob3YuZ2lmCi0KLXR1dG9yaWFscy5jdnNfbWVyZ2UubGluay1pY29uID0gaW1hZ2VzL3RvcGljbGFiZWwvdHVfbWVyZ2U0OC5naWYKLXR1dG9yaWFscy5jdnNfbWVyZ2UuaG92ZXItaWNvbiA9IGltYWdlcy90b3BpY2xhYmVsL3R1X21lcmdlNDhfaG92LmdpZgotCi10dXRvcmlhbHMuc3VidGl0bGUtaWQgPSB0dXRvcmlhbHMvcGFnZS1jb250ZW50L3BhZ2UtdGl0bGUKLXR1dG9yaWFscy5kZXNjcmlwdGlvbi1pZCA9IHR1dG9yaWFscy9wYWdlLWNvbnRlbnQvcGFnZS1kZXNjcmlwdGlvbgpkaWZmIC0tZ2l0IGEvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vaW50cm8vY3NzL3doYXRzbmV3LmNzcyBiL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL2ludHJvL2Nzcy93aGF0c25ldy5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1MTVjYWEuLjAwMDAwMDAKLS0tIGEvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vaW50cm8vY3NzL3doYXRzbmV3LmNzcworKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLQotYSNwbGF0Zm9ybS1ub3Rld29ydGh5IGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoLi4vLi4vaW1hZ2VzL3RvcGljbGFiZWwvd25fZWNscGxhdGZvcm00OC5naWYpOyB9Ci1hI3BsYXRmb3JtLW5vdGV3b3J0aHk6aG92ZXIgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybCguLi8uLi9pbWFnZXMvdG9waWNsYWJlbC93bl9lY2xwbGF0Zm9ybTQ4X2hvdi5naWYpOyB9Ci0KLWEjdXBkYXRlcyBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKC4uLy4uL2ltYWdlcy90b3BpY2xhYmVsL3duX3VwZGF0ZXM0OC5naWYpOyB9Ci1hI3VwZGF0ZXM6aG92ZXIgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybCguLi8uLi9pbWFnZXMvdG9waWNsYWJlbC93bl91cGRhdGVzNDhfaG92LmdpZik7IH0KLQotYSNlY2xpcHNlIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoLi4vLi4vaW1hZ2VzL3RvcGljbGFiZWwvd25fZWNsY29tbXVuaXR5NDguZ2lmKTsgfQotYSNlY2xpcHNlOmhvdmVyIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoLi4vLi4vaW1hZ2VzL3RvcGljbGFiZWwvd25fZWNsY29tbXVuaXR5NDhfaG92LmdpZik7IH0KLQotYSNtaWdyYXRpb24gaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybCguLi8uLi9pbWFnZXMvdG9waWNsYWJlbC93bl9taWdyYXRlNDguZ2lmKTsgfQotYSNtaWdyYXRpb246aG92ZXIgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybCguLi8uLi9pbWFnZXMvdG9waWNsYWJlbC93bl9taWdyYXRlNDhfaG92LmdpZik7IH0KLQotZGl2I3Jzcy1uZXdzIHsKLQlwb3NpdGlvbjogcmVsYXRpdmU7Ci0JdG9wOiAtMjVweDsKLQltYXJnaW4tYm90dG9tOiAtMjVweDsKLQltYXJnaW4tbGVmdDogNTJweDsKLX0KLQotI3Jzcy1uZXdzIC5kaXYtbGFiZWwgewotCWZvbnQtc2l6ZTogOXB0OwotfQotCi0jcnNzLW5ld3MgLnByb3ZpZGVkLWNvbnRlbnQgewotfQotCi0jcnNzLW5ld3MgLnN0YXR1cy10ZXh0IHsKLQlmb250LXdlaWdodDogbm9ybWFsOwotCWNvbG9yOiAjOTA5MDkwOwotCWZvbnQtc2l6ZTogOHB0OwotfQotCi11bCNlY2xpcHNlLW5ld3MgewotCWxpc3Qtc3R5bGUtdHlwZTogbm9uZTsKLQlsaXN0LXN0eWxlLWltYWdlOiB1cmwoIi4uLy4uL2ltYWdlcy90b3BpY2xhYmVsL2Fycm93LmdpZiIpOwotCW1hcmdpbi1sZWZ0OiAxMHB4OwotCW1hcmdpbi10b3A6IDVweDsKLX0KLQotdWwjZWNsaXBzZS1uZXdzIGxpIHsKLX0KLQotdWwjZWNsaXBzZS1uZXdzIGEgewotCWZvbnQtd2VpZ2h0OiBub3JtYWw7Ci19Ci0KLXVsI2VjbGlwc2UtbmV3cyBhOmhvdmVyIHsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5wbGF0Zm9ybS9pbnRyby9jc3Mvd2hhdHNuZXcucHJvcGVydGllcyBiL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL2ludHJvL2Nzcy93aGF0c25ldy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGIwZjFjLi4wMDAwMDAwCi0tLSBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL2ludHJvL2Nzcy93aGF0c25ldy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi13aGF0c25ldy5wbGF0Zm9ybS1ub3Rld29ydGh5LmxpbmstaWNvbiA9IGltYWdlcy90b3BpY2xhYmVsL3duX2VjbHBsYXRmb3JtNDguZ2lmCi13aGF0c25ldy5wbGF0Zm9ybS1ub3Rld29ydGh5LmhvdmVyLWljb24gPSBpbWFnZXMvdG9waWNsYWJlbC93bl9lY2xwbGF0Zm9ybTQ4X2hvdi5naWYKLQotd2hhdHNuZXcudXBkYXRlcy5saW5rLWljb24gPSBpbWFnZXMvdG9waWNsYWJlbC93bl91cGRhdGVzNDguZ2lmCi13aGF0c25ldy51cGRhdGVzLmhvdmVyLWljb24gPSBpbWFnZXMvdG9waWNsYWJlbC93bl91cGRhdGVzNDhfaG92LmdpZgotCi13aGF0c25ldy5lY2xpcHNlLmxpbmstaWNvbiA9IGltYWdlcy90b3BpY2xhYmVsL3duX2VjbGNvbW11bml0eTQ4LmdpZgotd2hhdHNuZXcuZWNsaXBzZS5ob3Zlci1pY29uID0gaW1hZ2VzL3RvcGljbGFiZWwvd25fZWNsY29tbXVuaXR5NDhfaG92LmdpZgotCi13aGF0c25ldy5taWdyYXRpb24ubGluay1pY29uID0gaW1hZ2VzL3RvcGljbGFiZWwvd25fbWlncmF0ZTQ4LmdpZgotd2hhdHNuZXcubWlncmF0aW9uLmhvdmVyLWljb24gPSBpbWFnZXMvdG9waWNsYWJlbC93bl9taWdyYXRlNDhfaG92LmdpZgotCi13aGF0c25ldy5wYWdlLWNvbnRlbnQubGF5b3V0LnZzcGFjaW5nID0gNDAgCi0KLXdoYXRzbmV3LnN1YnRpdGxlLWlkID0gbmV3cy9wYWdlLWNvbnRlbnQvcGFnZS10aXRsZQpkaWZmIC0tZ2l0IGEvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vaW50cm8vb3ZlcnZpZXdFeHRlbnNpb25Db250ZW50LnhtbCBiL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL2ludHJvL292ZXJ2aWV3RXh0ZW5zaW9uQ29udGVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmNmJkMzIuLjAwMDAwMDAKLS0tIGEvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vaW50cm8vb3ZlcnZpZXdFeHRlbnNpb25Db250ZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04IiA/PgotPGludHJvQ29udGVudD4KLSAgCTxleHRlbnNpb25Db250ZW50IGlkPSJvcmcuZWNsaXBzZS51aS53b3JrYmVuY2giIG5hbWU9IldvcmtiZW5jaCIgYWx0LXN0eWxlPSJjc3Mvb3ZlcnZpZXcucHJvcGVydGllcyIgc3R5bGU9ImNzcy9vdmVydmlldy5jc3MiIHBhdGg9Im92ZXJ2aWV3L0AiPgotICAJCTxncm91cCBzdHlsZS1pZD0iY29udGVudC1ncm91cCIgaWQ9ImNvbnRlbnQtZ3JvdXAiPgotCQkJPGxpbmsgc3R5bGUtaWQ9ImNvbnRlbnQtbGluayIgbGFiZWw9IldvcmtiZW5jaCBiYXNpY3MiIHVybD0iaHR0cDovL29yZy5lY2xpcHNlLnVpLmludHJvL3Nob3dIZWxwVG9waWM/aWQ9L29yZy5lY2xpcHNlLnBsYXRmb3JtLmRvYy51c2VyL2dldHRpbmdTdGFydGVkL2ludHJvL292ZXJ2aWV3Lmh0bSIgaWQ9ImJhc2ljcyI+Ci0gICAgICAgICAgCQk8dGV4dD5MZWFybiBhYm91dCBiYXNpYyBFY2xpcHNlIHdvcmtiZW5jaCBjb25jZXB0czwvdGV4dD4KLSAgICAgICAJCTwvbGluaz4KLSAgICAgICAJCTxsaW5rIHN0eWxlLWlkPSJjb250ZW50LWxpbmsiIGxhYmVsPSJUZWFtIHN1cHBvcnQiIHVybD0iaHR0cDovL29yZy5lY2xpcHNlLnVpLmludHJvL3Nob3dIZWxwVG9waWM/aWQ9L29yZy5lY2xpcHNlLnBsYXRmb3JtLmRvYy51c2VyL2NvbmNlcHRzL2NvbmNlcHRzLTI2Lmh0bSIgaWQ9InRlYW0iPgotICAgICAgICAgIAkJPHRleHQ+RmluZCBvdXQgaG93IHRvIGNvbGxhYm9yYXRlIHdpdGggb3RoZXIgZGV2ZWxvcGVyczwvdGV4dD4KLSAgICAgICAJCTwvbGluaz4KLSAgICAgICAJPC9ncm91cD4KLSAgCTwvZXh0ZW5zaW9uQ29udGVudD4KLTwvaW50cm9Db250ZW50PgpkaWZmIC0tZ2l0IGEvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vaW50cm8vdHV0b3JpYWxzRXh0ZW5zaW9uQ29udGVudC54bWwgYi9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5wbGF0Zm9ybS9pbnRyby90dXRvcmlhbHNFeHRlbnNpb25Db250ZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhjNjE0NS4uMDAwMDAwMAotLS0gYS9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5wbGF0Zm9ybS9pbnRyby90dXRvcmlhbHNFeHRlbnNpb25Db250ZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/PgotPGludHJvQ29udGVudD4KLSAgPCEtLSBFeHRlbnNpb24gdG8gdGhlIFNESyBUdXRvcmlhbHMgUGFnZS4gLS0+Ci0gIDxleHRlbnNpb25Db250ZW50IGlkPSJvcmcuZWNsaXBzZS50ZWFtIiBuYW1lPSJUZWFtL0NWUyIgYWx0LXN0eWxlPSJjc3MvdHV0b3JpYWxzLnByb3BlcnRpZXMiIHN0eWxlPSJjc3MvdHV0b3JpYWxzLmNzcyIgcGF0aD0idHV0b3JpYWxzL0AiPgotICAgIDxncm91cCBsYWJlbD0iVGVhbS9DVlMiIGlkPSJ0ZWFtIiBzdHlsZS1pZD0iY29udGVudC1ncm91cCI+Ci0gICAgICA8bGluayB1cmw9Imh0dHA6Ly9vcmcuZWNsaXBzZS51aS5pbnRyby9zaG93U3RhbmRieT9wYXJ0SWQ9b3JnLmVjbGlwc2UucGxhdGZvcm0uY2hlYXRzaGVldCZhbXA7aW5wdXQ9b3JnLmVjbGlwc2UucGxhdGZvcm0uY3ZzLmNoZWNrb3V0IiBsYWJlbD0iQ2hlY2sgb3V0IGEgQ1ZTIHByb2plY3QiIGlkPSJjdnNfY2hlY2tvdXQiIHN0eWxlLWlkPSJjb250ZW50LWxpbmsiPgotICAgICAgICA8dGV4dD5MZWFybiBob3cgdG8gY29ubmVjdCB0byBhIENWUyByZXBvc2l0b3J5IGFuZCBjaGVjayBvdXQgYSBwcm9qZWN0LjwvdGV4dD4KLSAgICAgIDwvbGluaz4KLSAgICAgIDxsaW5rIHVybD0iaHR0cDovL29yZy5lY2xpcHNlLnVpLmludHJvL3Nob3dTdGFuZGJ5P3BhcnRJZD1vcmcuZWNsaXBzZS5wbGF0Zm9ybS5jaGVhdHNoZWV0JmFtcDtpbnB1dD1vcmcuZWNsaXBzZS5wbGF0Zm9ybS5jdnMubWVyZ2UiIGxhYmVsPSJNZXJnZSBDVlMgYnJhbmNoZXMiIGlkPSJjdnNfbWVyZ2UiIHN0eWxlLWlkPSJjb250ZW50LWxpbmsiPgotICAgICAgICA8dGV4dD5Gb2xsb3cgdGhlIHN0ZXBzIGZvciBtZXJnaW5nIGNoYW5nZXMgZnJvbSBvbmUgQ1ZTIGJyYW5jaCBpbnRvIGFub3RoZXIuPC90ZXh0PgotICAgICAgPC9saW5rPgotICAgIDwvZ3JvdXA+Ci0gIDwvZXh0ZW5zaW9uQ29udGVudD4KLTwvaW50cm9Db250ZW50PgpkaWZmIC0tZ2l0IGEvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vaW50cm8vd2hhdHNuZXdFeHRlbnNpb25Db250ZW50MS54bWwgYi9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5wbGF0Zm9ybS9pbnRyby93aGF0c25ld0V4dGVuc2lvbkNvbnRlbnQxLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwMDI2OS4uMDAwMDAwMAotLS0gYS9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5wbGF0Zm9ybS9pbnRyby93aGF0c25ld0V4dGVuc2lvbkNvbnRlbnQxLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04IiA/PgotPGludHJvQ29udGVudD4KLSAgCTxleHRlbnNpb25Db250ZW50IGlkPSJvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gubmV3cyIgbmFtZT0iRWNsaXBzZSBQbGF0Zm9ybSIgYWx0LXN0eWxlPSJjc3Mvd2hhdHNuZXcucHJvcGVydGllcyIgc3R5bGU9ImNzcy93aGF0c25ldy5jc3MiIHBhdGg9IndoYXRzbmV3L0AiPgotCQk8Z3JvdXAgc3R5bGUtaWQ9ImNvbnRlbnQtZ3JvdXAiIGlkPSJjb250ZW50LWdyb3VwIj4KLSAgICAgICAJCTxsaW5rIGxhYmVsPSJFY2xpcHNlIFBsYXRmb3JtIiB1cmw9Imh0dHA6Ly9vcmcuZWNsaXBzZS51aS5pbnRyby9zaG93SGVscFRvcGljP2lkPS9vcmcuZWNsaXBzZS5wbGF0Zm9ybS5kb2MudXNlci93aGF0c05ldy9wbGF0Zm9ybV93aGF0c25ldy5odG1sIiBpZD0icGxhdGZvcm0tbm90ZXdvcnRoeSIgc3R5bGUtaWQ9ImNvbnRlbnQtbGluayI+Ci0gICAgICAgICAgCQk8dGV4dD5GaW5kIG91dCBhYm91dCB0aGUgbWFqb3IgbmV3IGZlYXR1cmVzIGluIHRoaXMgcmVsZWFzZTwvdGV4dD4KLSAgICAgICAJCTwvbGluaz4KLSAgICAgICAJPC9ncm91cD4KLSAgCTwvZXh0ZW5zaW9uQ29udGVudD4KLTwvaW50cm9Db250ZW50PgpkaWZmIC0tZ2l0IGEvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vaW50cm8vd2hhdHNuZXdFeHRlbnNpb25Db250ZW50Mi54bWwgYi9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5wbGF0Zm9ybS9pbnRyby93aGF0c25ld0V4dGVuc2lvbkNvbnRlbnQyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ1NGU0MS4uMDAwMDAwMAotLS0gYS9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5wbGF0Zm9ybS9pbnRyby93aGF0c25ld0V4dGVuc2lvbkNvbnRlbnQyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04IiA/PgotPGludHJvQ29udGVudD4KLSAgCTxleHRlbnNpb25Db250ZW50IGlkPSJvcmcuZWNsaXBzZS51aS53b3JrYmVuY2giIG5hbWU9IlVwZGF0ZXMgYW5kIEVjbGlwc2Uub3JnIiBhbHQtc3R5bGU9ImNzcy93aGF0c25ldy5wcm9wZXJ0aWVzIiBzdHlsZT0iY3NzL3doYXRzbmV3LmNzcyIgcGF0aD0id2hhdHNuZXcvQCI+Ci0gIAkgICA8Z3JvdXAgc3R5bGUtaWQ9ImNvbnRlbnQtZ3JvdXAiIGlkPSJjb250ZW50LWdyb3VwIj4KLSAgICAgICAJCTxsaW5rIHN0eWxlLWlkPSJjb250ZW50LWxpbmsiIGxhYmVsPSJOZXcgVXBkYXRlcyIgdXJsPSJodHRwOi8vb3JnLmVjbGlwc2UudWkuaW50cm8vcnVuQWN0aW9uP3BsdWdpbklkPW9yZy5lY2xpcHNlLnBsYXRmb3JtJmFtcDtjbGFzcz1vcmcuZWNsaXBzZS5wbGF0Zm9ybS5pbnRlcm5hbC5MYXVuY2hVcGRhdGVJbnRyb0FjdGlvbiIgaWQ9InVwZGF0ZXMiPgotICAgICAgICAgIAkJPHRleHQ+R2V0IHRoZSBsYXRlc3QgdXBkYXRlcyBmcm9tIEVjbGlwc2Uub3JnPC90ZXh0PgotICAgICAgIAkJPC9saW5rPgotICAgICAgIAkJPGxpbmsgc3R5bGUtaWQ9ImNvbnRlbnQtbGluayIgbGFiZWw9IkVjbGlwc2UgY29tbXVuaXR5IiB1cmw9Imh0dHA6Ly9vcmcuZWNsaXBzZS51aS5pbnRyby9vcGVuQnJvd3Nlcj91cmw9aHR0cDovL3d3dy5lY2xpcHNlLm9yZyIgaWQ9ImVjbGlwc2UiPgotICAgICAgICAgIAkJPHRleHQ+Sm9pbiB0aGUgY29tbXVuaXR5LCByZWFkIGFydGljbGVzIGFuZCBuZXdzIG9uIEVjbGlwc2Uub3JnPC90ZXh0PgotICAgICAgIAkJPC9saW5rPgotCQkJPGdyb3VwIGlkPSJyc3MtbmV3cyIgbGFiZWw9IkxhdGVzdCBOZXdzIiBleHBhbmRhYmxlPSJ0cnVlIiBleHBhbmRlZD0idHJ1ZSI+Ci0JCQkJPGNvbnRlbnRQcm92aWRlciBpZD0icnNzLXZpZXdlciIgcGx1Z2luSWQ9Im9yZy5lY2xpcHNlLnBsYXRmb3JtIiBjbGFzcz0ib3JnLmVjbGlwc2UucGxhdGZvcm0uaW50ZXJuYWwuRWNsaXBzZVJTU1ZpZXdlciI+Ci0JCQkJPC9jb250ZW50UHJvdmlkZXI+Ci0JCQk8L2dyb3VwPgotICAgICAgIDwvZ3JvdXA+Ci0gIAk8L2V4dGVuc2lvbkNvbnRlbnQ+Ci08L2ludHJvQ29udGVudD4KZGlmZiAtLWdpdCBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL2ludHJvL3doYXRzbmV3RXh0ZW5zaW9uQ29udGVudDMueG1sIGIvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vaW50cm8vd2hhdHNuZXdFeHRlbnNpb25Db250ZW50My54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3ZTQ1ZGEuLjAwMDAwMDAKLS0tIGEvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vaW50cm8vd2hhdHNuZXdFeHRlbnNpb25Db250ZW50My54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCIgPz4KLTxpbnRyb0NvbnRlbnQ+Ci0gIAk8ZXh0ZW5zaW9uQ29udGVudCBpZD0ib3JnLmVjbGlwc2UudWkud29ya2JlbmNoLm1pZ3JhdGlvbiIgbmFtZT0iUG9ydGluZyBHdWlkZSIgYWx0LXN0eWxlPSJjc3Mvd2hhdHNuZXcucHJvcGVydGllcyIgc3R5bGU9ImNzcy93aGF0c25ldy5jc3MiIHBhdGg9IndoYXRzbmV3L0AiPgotCQk8Z3JvdXAgZmlsdGVyPSJwbHVnaW49b3JnLmVjbGlwc2UucGxhdGZvcm0uZG9jLmlzdiIgc3R5bGUtaWQ9ImNvbnRlbnQtZ3JvdXAiIGlkPSJjb250ZW50LWdyb3VwIj4KLSAgICAgICAJCTxsaW5rIGxhYmVsPSJNaWdyYXRpb24gZnJvbSB0aGUgcHJldmlvdXMgcmVsZWFzZSIgdXJsPSJodHRwOi8vb3JnLmVjbGlwc2UudWkuaW50cm8vc2hvd0hlbHBUb3BpYz9pZD0vb3JnLmVjbGlwc2UucGxhdGZvcm0uZG9jLmlzdi9wb3J0aW5nL2VjbGlwc2VfM18yX3BvcnRpbmdfZ3VpZGUuaHRtbCIgaWQ9Im1pZ3JhdGlvbiIgc3R5bGUtaWQ9ImNvbnRlbnQtbGluayI+Ci0gICAgICAgICAgCQk8dGV4dD5MZWFybiB3aGF0IHlvdSBuZWVkIHRvIGRvIHRvIG1ha2UgeW91ciBvbGQgY29kZSB3b3JrIGluIEVjbGlwc2UgMy4yPC90ZXh0PgotICAgICAgIAkJPC9saW5rPgotICAgICAgIAk8L2dyb3VwPgotICAJPC9leHRlbnNpb25Db250ZW50PgotPC9pbnRyb0NvbnRlbnQ+CmRpZmYgLS1naXQgYS9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5wbGF0Zm9ybS9pbnRyb0RhdGEueG1sIGIvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vaW50cm9EYXRhLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmIxYzAwMi4uMDAwMDAwMAotLS0gYS9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5wbGF0Zm9ybS9pbnRyb0RhdGEueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+Ci08ZXh0ZW5zaW9ucz4KLSAgIDxwYWdlIGlkPSJ0dXRvcmlhbHMiPgotICAgICAgPGdyb3VwIHBhdGg9InBhZ2UtY29udGVudC9ib3R0b20tbGVmdCIgZGVmYXVsdD0idHJ1ZSI+Ci0gICAgICA8L2dyb3VwPgotICAgICAgPGdyb3VwIHBhdGg9InBhZ2UtY29udGVudC9ib3R0b20tcmlnaHQiIGRlZmF1bHQ9InRydWUiPgotICAgICAgPC9ncm91cD4KLSAgICAgIDxncm91cCBwYXRoPSJwYWdlLWNvbnRlbnQvdG9wLWxlZnQiPgotICAgICAgICAgPGV4dGVuc2lvbiBpZD0ib3JnLmVjbGlwc2UuamR0IiBpbXBvcnRhbmNlPSJsb3ciLz4KLSAgICAgICAgIDxleHRlbnNpb24gaWQ9Im9yZy5lY2xpcHNlLnRlYW0iIGltcG9ydGFuY2U9ImxvdyIvPgotICAgICAgPC9ncm91cD4KLSAgICAgIDxncm91cCBwYXRoPSJwYWdlLWNvbnRlbnQvdG9wLXJpZ2h0Ij4KLSAgICAgICAgIDxleHRlbnNpb24gaWQ9Im9yZy5lY2xpcHNlLnBkZSIgaW1wb3J0YW5jZT0ibG93Ii8+Ci0gICAgICA8L2dyb3VwPgotICAgPC9wYWdlPgotICAgPHBhZ2UgaWQ9IndoYXRzbmV3Ij4KLSAgICAgIDxncm91cCBwYXRoPSJwYWdlLWNvbnRlbnQvYm90dG9tLWxlZnQiIGRlZmF1bHQ9InRydWUiPgotICAgICAgPC9ncm91cD4KLSAgICAgIDxncm91cCBwYXRoPSJwYWdlLWNvbnRlbnQvYm90dG9tLXJpZ2h0IiBkZWZhdWx0PSJ0cnVlIj4KLSAgICAgIDwvZ3JvdXA+Ci0gICAgICA8Z3JvdXAgcGF0aD0icGFnZS1jb250ZW50L3RvcC1sZWZ0Ij4KLSAgICAgICAgIDxleHRlbnNpb24gaWQ9Im9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC5uZXdzIiBpbXBvcnRhbmNlPSJsb3ciLz4KLSAgICAgICAgIDxleHRlbnNpb24gaWQ9Im9yZy5lY2xpcHNlLmpkdCIgaW1wb3J0YW5jZT0ibG93Ii8+Ci0gICAgICAgICA8ZXh0ZW5zaW9uIGlkPSJvcmcuZWNsaXBzZS5wZGUuY2hhbmdlcyIgaW1wb3J0YW5jZT0ibG93Ii8+Ci0gICAgICAgICA8ZXh0ZW5zaW9uIGlkPSJvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gubWlncmF0aW9uIiBpbXBvcnRhbmNlPSJjYWxsb3V0Ii8+Ci0gICAgICA8L2dyb3VwPgotICAgICAgPGdyb3VwIHBhdGg9InBhZ2UtY29udGVudC90b3AtcmlnaHQiPgotICAgICAgICAgPGV4dGVuc2lvbiBpZD0ib3JnLmVjbGlwc2UudWkud29ya2JlbmNoIiBpbXBvcnRhbmNlPSJsb3ciLz4KLSAgICAgIDwvZ3JvdXA+Ci0gICA8L3BhZ2U+Ci0gICA8cGFnZSBpZD0ic2FtcGxlcyI+Ci0gICAgICA8Z3JvdXAgcGF0aD0icGFnZS1jb250ZW50L2JvdHRvbS1sZWZ0IiBkZWZhdWx0PSJ0cnVlIj4KLSAgICAgIDwvZ3JvdXA+Ci0gICAgICA8Z3JvdXAgcGF0aD0icGFnZS1jb250ZW50L2JvdHRvbS1yaWdodCIgZGVmYXVsdD0idHJ1ZSI+Ci0gICAgICA8L2dyb3VwPgotICAgICAgPGdyb3VwIHBhdGg9InBhZ2UtY29udGVudC90b3AtbGVmdCI+Ci0gICAgICAgICA8ZXh0ZW5zaW9uIGlkPSJvcmcuZWNsaXBzZS5wZGUud29ya2JlbmNoIiBpbXBvcnRhbmNlPSJsb3ciLz4KLSAgICAgIDwvZ3JvdXA+Ci0gICAgICA8Z3JvdXAgcGF0aD0icGFnZS1jb250ZW50L3RvcC1yaWdodCI+Ci0gICAgICAgICA8ZXh0ZW5zaW9uIGlkPSJvcmcuZWNsaXBzZS5qZHQiIGltcG9ydGFuY2U9ImxvdyIvPgotICAgICAgICAgPGV4dGVuc2lvbiBpZD0ib3JnLmVjbGlwc2UucGRlLnN3dCIgaW1wb3J0YW5jZT0ibG93Ii8+Ci0gICAgICA8L2dyb3VwPgotICAgPC9wYWdlPgotICAgPHBhZ2UgaWQ9Im92ZXJ2aWV3Ij4KLSAgICAgIDxncm91cCBwYXRoPSJwYWdlLWNvbnRlbnQvYm90dG9tLWxlZnQiIGRlZmF1bHQ9InRydWUiPgotICAgICAgPC9ncm91cD4KLSAgICAgIDxncm91cCBwYXRoPSJwYWdlLWNvbnRlbnQvYm90dG9tLXJpZ2h0IiBkZWZhdWx0PSJ0cnVlIj4KLSAgICAgIDwvZ3JvdXA+Ci0gICAgICA8Z3JvdXAgcGF0aD0icGFnZS1jb250ZW50L3RvcC1sZWZ0Ij4KLSAgICAgICAgIDxleHRlbnNpb24gaWQ9Im9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaCIgaW1wb3J0YW5jZT0ibG93Ii8+Ci0gICAgICA8L2dyb3VwPgotICAgICAgPGdyb3VwIHBhdGg9InBhZ2UtY29udGVudC90b3AtcmlnaHQiPgotICAgICAgICAgPGV4dGVuc2lvbiBpZD0ib3JnLmVjbGlwc2UuamR0IiBpbXBvcnRhbmNlPSJsb3ciLz4KLSAgICAgICAgIDxleHRlbnNpb24gaWQ9Im9yZy5lY2xpcHNlLnBkZSIgaW1wb3J0YW5jZT0ibG93Ii8+Ci0gICAgICA8L2dyb3VwPgotICAgPC9wYWdlPgotPC9leHRlbnNpb25zPgpkaWZmIC0tZ2l0IGEvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vbWFjb3N4X25hcnJvd19ib29rLmNzcyBiL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL21hY29zeF9uYXJyb3dfYm9vay5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0NGU1ZTQuLjAwMDAwMDAKLS0tIGEvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vbWFjb3N4X25hcnJvd19ib29rLmNzcworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWgxLGgyICAgICAgICAgICB7IGNvbG9yOiBCbGFjayB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vbmFycm93X2Jvb2suY3NzIGIvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vbmFycm93X2Jvb2suY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTE5YmYzLi4wMDAwMDAwCi0tLSBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL25hcnJvd19ib29rLmNzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3Mzg1YmEuLjAwMDAwMDAKLS0tIGEvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wbHVnaW5OYW1lPUVjbGlwc2UgUGxhdGZvcm0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi1wcm9kdWN0TmFtZT1FY2xpcHNlIFBsYXRmb3JtCi1wcm9kdWN0Qmx1cmI9RWNsaXBzZSBQbGF0Zm9ybVxuXAotXG5cCi1WZXJzaW9uOiAzLjIuMTAwXG5cCi1CdWlsZCBpZDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDAwLCAyMDA3LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvcGxhdGZvcm1cblwKLVxuXAotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGVcblwKLUFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8KLQotY2hlYXRzaGVldC5hY3Rpb25zZXQgPSBDaGVhdCBTaGVldHMKLWNoZWF0c2hlZXQuaXRlbSA9ICZDaGVhdCBTaGVldHMuLi4KLWNoZWF0c2hlZXQuY2F0ZWdvcnkudGVhbSA9IFRlYW0vQ1ZTCi1jaGVhdHNoZWV0LmN2cy5jaGVja291dC5uYW1lPSBDaGVjayBvdXQgYSBDVlMgcHJvamVjdAotY2hlYXRzaGVldC5jdnMuY2hlY2tvdXQuZGVzYz0gTGVhcm4gaG93IHRvIGNvbm5lY3QgdG8gYSBDVlMgcmVwb3NpdG9yeSBhbmQgY2hlY2sgb3V0IGEgcHJvamVjdC4KLWNoZWF0c2hlZXQuY3ZzLm1lcmdlLm5hbWU9IE1lcmdlIENWUyBicmFuY2hlcwotY2hlYXRzaGVldC5jdnMubWVyZ2UuZGVzYz0gRm9sbG93IHRoZSBzdGVwcyBmb3IgbWVyZ2luZyBjaGFuZ2VzIGZyb20gb25lIENWUyBicmFuY2ggaW50byBhbm90aGVyLgotc2hvcnRjdXQub3ZlcnZpZXcudG9vbHRpcCA9IE92ZXJ2aWV3Ci1zaG9ydGN1dC50dXRvcmlhbHMudG9vbHRpcCA9IFR1dG9yaWFscwotc2hvcnRjdXQuc2FtcGxlcy50b29sdGlwID0gU2FtcGxlcwotc2hvcnRjdXQud2hhdHNuZXcudG9vbHRpcCA9IFdoYXQncyBOZXcKLQotaW50cm9DdXN0b21pemF0aW9uUHJlZmVyZW5jZS5uYW1lID0gV2VsY29tZQotCi1wcm9kdWN0SW50cm9UaXRsZSA9IFdlbGNvbWUgdG8gRWNsaXBzZSAzLjIKLXByb2R1Y3RJbnRyb0JyYW5kaW5nVGV4dCA9IEVjbGlwc2UgUHJvamVjdAotaW50cm9EZXNjcmlwdGlvbi1vdmVydmlldyA9IEVjbGlwc2UgaXMgYSBraW5kIG9mIHVuaXZlcnNhbCB0b29sIHBsYXRmb3JtIC0gYW4gb3BlbiBleHRlbnNpYmxlIElERSBmb3IgYW55dGhpbmcgYW5kIG5vdGhpbmcgaW4gcGFydGljdWxhci4gSXQgcHJvdmlkZXMgYSBmZWF0dXJlLXJpY2ggZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQgdGhhdCBhbGxvd3MgdGhlIGRldmVsb3BlciB0byBlZmZpY2llbnRseSBjcmVhdGUgdG9vbHMgdGhhdCBpbnRlZ3JhdGUgc2VhbWxlc3NseSBpbnRvIHRoZSBFY2xpcHNlIFBsYXRmb3JtLgotaW50cm9EZXNjcmlwdGlvbi10dXRvcmlhbHMgPSBMZWFybiBob3cgdG8gYmUgcHJvZHVjdGl2ZSB1c2luZyBFY2xpcHNlIGJ5IGNvbXBsZXRpbmcgZW5kLXRvLWVuZCB0dXRvcmlhbHMgdGhhdCB3aWxsIGd1aWRlIHlvdSBhbG9uZyB0aGUgd2F5LgotaW50cm9EZXNjcmlwdGlvbi1zYW1wbGVzID0gRXhwbG9yZSBFY2xpcHNlIGJ5IGluc3RhbGxpbmcgcHJlZmFicmljYXRlZCBzYW1wbGVzIChtYXkgcmVxdWlyZSBJbnRlcm5ldCBjb25uZWN0aW9uKS4KZGlmZiAtLWdpdCBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL3BsdWdpbi54bWwgYi9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5wbGF0Zm9ybS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTBlYzRkLi4wMDAwMDAwCi0tLSBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLSAgICAgPGV4dGVuc2lvbiBpZD0iaWRlIiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByb2R1Y3RzIj4gCi0gICAgICA8cHJvZHVjdCBuYW1lPSIlcHJvZHVjdE5hbWUiIGFwcGxpY2F0aW9uPSJvcmcuZWNsaXBzZS51aS5pZGUud29ya2JlbmNoIiBkZXNjcmlwdGlvbj0iJXByb2R1Y3RCbHVyYiI+IAotICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ3aW5kb3dJbWFnZXMiIHZhbHVlPSJlY2xpcHNlLmdpZixlY2xpcHNlMzIuZ2lmLGVjbGlwc2U0OC5naWYsZWNsaXBzZS5wbmcsZWNsaXBzZTMyLnBuZyxlY2xpcHNlNDgucG5nIi8+IAotICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJhYm91dEltYWdlIiB2YWx1ZT0iZWNsaXBzZV9sZy5naWYiLz4gCi0gICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImFib3V0VGV4dCIgdmFsdWU9IiVwcm9kdWN0Qmx1cmIiLz4gCi0gICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImFwcE5hbWUiIHZhbHVlPSJFY2xpcHNlIi8+IAotICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwcmVmZXJlbmNlQ3VzdG9taXphdGlvbiIgdmFsdWU9InBsdWdpbl9jdXN0b21pemF0aW9uLmluaSIvPiAKLSAgICAgICAgICA8cHJvcGVydHkKLSAgICAgICAgICAgICAgICBuYW1lPSJzdGFydHVwRm9yZWdyb3VuZENvbG9yIgotICAgICAgICAgICAgICAgIHZhbHVlPSJDOEQ1RUEiLz4KLSAgICAgICAgICA8cHJvcGVydHkKLSAgICAgICAgICAgICAgICBuYW1lPSJzdGFydHVwTWVzc2FnZVJlY3QiCi0gICAgICAgICAgICAgICAgdmFsdWU9IjcsMjIwLDQ0MSwyMCIvPgotICAgICAgICAgIDxwcm9wZXJ0eQotICAgICAgICAgICAgICAgIG5hbWU9InN0YXJ0dXBQcm9ncmVzc1JlY3QiCi0gICAgICAgICAgICAgICAgdmFsdWU9IjAsMjgwLDQ1NSwxNSIvPgotICAgICAgICAgPHByb3BlcnR5Ci0gICAgICAgICAgCQluYW1lPSJpbnRyb1RpdGxlIgotICAgICAgICAgIAkJdmFsdWU9IiVwcm9kdWN0SW50cm9UaXRsZSIvPgotICAgICAgICAgIDxwcm9wZXJ0eQotICAgICAgICAgIAkJbmFtZT0iaW50cm9CcmFuZGluZ0ltYWdlIgotICAgICAgICAgIAkJdmFsdWU9InByb2R1Y3Q6aW50cm8tZWNsaXBzZS5wbmciLz4KLSAgICAgICAgICA8cHJvcGVydHkKLSAgICAgICAgICAJCW5hbWU9ImludHJvQnJhbmRpbmdJbWFnZVRleHQiCi0gICAgICAgICAgCQl2YWx1ZT0iJXByb2R1Y3RJbnRyb0JyYW5kaW5nVGV4dCIvPgotCQkgIDxwcm9wZXJ0eQotCQkJCW5hbWU9ImludHJvRGVzY3JpcHRpb24tb3ZlcnZpZXciCi0JCQkJdmFsdWU9IiVpbnRyb0Rlc2NyaXB0aW9uLW92ZXJ2aWV3Ii8+Ci0JCSAgPHByb3BlcnR5Ci0JCQkJbmFtZT0iaW50cm9EZXNjcmlwdGlvbi10dXRvcmlhbHMiCi0JCQkJdmFsdWU9IiVpbnRyb0Rlc2NyaXB0aW9uLXR1dG9yaWFscyIvPgotCQkgIDxwcm9wZXJ0eQotCQkJCW5hbWU9ImludHJvRGVzY3JpcHRpb24tc2FtcGxlcyIKLQkJCQl2YWx1ZT0iJWludHJvRGVzY3JpcHRpb24tc2FtcGxlcyIvPiAgICAgICAgICAgICAgICAKLSAgICAgIDwvcHJvZHVjdD4gCi0gICA8L2V4dGVuc2lvbj4gCi0gICAKLSAgIAk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS51aS5pbnRybyI+Ci0gICAgICA8aW50cm9Qcm9kdWN0QmluZGluZwotICAgICAgICAgICAgaW50cm9JZD0ib3JnLmVjbGlwc2UudWkuaW50cm8udW5pdmVyc2FsIgotICAgICAgICAgICAgcHJvZHVjdElkPSJvcmcuZWNsaXBzZS5wbGF0Zm9ybS5pZGUiPgotICAgICAgPC9pbnRyb1Byb2R1Y3RCaW5kaW5nPgotICAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuY2hlYXRzaGVldHMuY2hlYXRTaGVldENvbnRlbnQiPgotICAgICAgPGNhdGVnb3J5Ci0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UucGxhdGZvcm0udGVhbSIKLSAgICAgICAgICAgIG5hbWU9IiVjaGVhdHNoZWV0LmNhdGVnb3J5LnRlYW0iPgotICAgICAgPC9jYXRlZ29yeT4KLSAgICAgIDxjaGVhdHNoZWV0Ci0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UucGxhdGZvcm0udGVhbSIKLSAgICAgICAgICAgIGNvbnRlbnRGaWxlPSIkbmwkL2NoZWF0c2hlZXRzL2N2c19jaGVja291dC54bWwiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UucGxhdGZvcm0uY3ZzLmNoZWNrb3V0IgotICAgICAgICAgICAgbmFtZT0iJWNoZWF0c2hlZXQuY3ZzLmNoZWNrb3V0Lm5hbWUiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgJWNoZWF0c2hlZXQuY3ZzLmNoZWNrb3V0LmRlc2MKLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2NoZWF0c2hlZXQ+Ci0gICAgICA8Y2hlYXRzaGVldAotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnBsYXRmb3JtLnRlYW0iCi0gICAgICAgICAgICBjb250ZW50RmlsZT0iJG5sJC9jaGVhdHNoZWV0cy9jdnNfbWVyZ2UueG1sIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnBsYXRmb3JtLmN2cy5tZXJnZSIKLSAgICAgICAgICAgIG5hbWU9IiVjaGVhdHNoZWV0LmN2cy5tZXJnZS5uYW1lIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICVjaGVhdHNoZWV0LmN2cy5tZXJnZS5kZXNjCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9jaGVhdHNoZWV0PgotICAgPC9leHRlbnNpb24+Ci0gICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICAtLT4KLSAgIDwhLS0gU3RhbmRieSBDb250ZW50IFBhcnQgY29udHJpYnV0aW9ucyAgICAgICAgICAgICAgICAgICAgIC0tPgotICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAgLS0+Ci0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5pbnRyby5jb25maWdFeHRlbnNpb24iPgotICAgICAgPHN0YW5kYnlDb250ZW50UGFydAotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnBsYXRmb3JtLmNoZWF0c2hlZXQiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UucGxhdGZvcm0uaW50ZXJuYWwuQ2hlYXRTaGVldFN0YW5kYnlDb250ZW50IgotICAgICAgICAgICAgcGx1Z2luSWQ9Im9yZy5lY2xpcHNlLnBsYXRmb3JtIi8+Ci0gICAgICA8Y29uZmlnRXh0ZW5zaW9uCi0gICAgICAgICAgICBjb25maWdJZD0ib3JnLmVjbGlwc2UudWkuaW50cm8udW5pdmVyc2FsQ29uZmlnIgotICAgICAgICAgICAgY29udGVudD0iJG5sJC9pbnRyby9vdmVydmlld0V4dGVuc2lvbkNvbnRlbnQueG1sIi8+Ci0gICAgICA8Y29uZmlnRXh0ZW5zaW9uCi0gICAgICAgICAgICBjb25maWdJZD0ib3JnLmVjbGlwc2UudWkuaW50cm8udW5pdmVyc2FsQ29uZmlnIgotICAgICAgICAgICAgY29udGVudD0iJG5sJC9pbnRyby90dXRvcmlhbHNFeHRlbnNpb25Db250ZW50LnhtbCIvPgotICAgICAgPGNvbmZpZ0V4dGVuc2lvbgotICAgICAgICAgICAgY29uZmlnSWQ9Im9yZy5lY2xpcHNlLnVpLmludHJvLnVuaXZlcnNhbENvbmZpZyIKLSAgICAgICAgICAgIGNvbnRlbnQ9IiRubCQvaW50cm8vd2hhdHNuZXdFeHRlbnNpb25Db250ZW50MS54bWwiLz4KLSAgICAgIDxjb25maWdFeHRlbnNpb24KLSAgICAgICAgICAgIGNvbmZpZ0lkPSJvcmcuZWNsaXBzZS51aS5pbnRyby51bml2ZXJzYWxDb25maWciCi0gICAgICAgICAgICBjb250ZW50PSIkbmwkL2ludHJvL3doYXRzbmV3RXh0ZW5zaW9uQ29udGVudDIueG1sIi8+Ci0gICAgICA8Y29uZmlnRXh0ZW5zaW9uCi0gICAgICAgICAgICBjb25maWdJZD0ib3JnLmVjbGlwc2UudWkuaW50cm8udW5pdmVyc2FsQ29uZmlnIgotICAgICAgICAgICAgY29udGVudD0iJG5sJC9pbnRyby93aGF0c25ld0V4dGVuc2lvbkNvbnRlbnQzLnhtbCIvPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlUGFnZXMiPgotICAgICAgPHBhZ2UKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlUGFnZXMuV29ya2JlbmNoIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLmludHJvLnVuaXZlcnNhbC5FeHRlbnNpb25GYWN0b3J5OndlbGNvbWVDdXN0b21pemF0aW9uIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnBsYXRmb3JtLmludHJvQ3VzdG9taXphdGlvbiIKLSAgICAgICAgICAgIG5hbWU9IiVpbnRyb0N1c3RvbWl6YXRpb25QcmVmZXJlbmNlLm5hbWUiPgotICAgICAgICAgPGtleXdvcmRSZWZlcmVuY2UgaWQ9Im9yZy5lY2xpcHNlLnVpLmlkZS5hcHBlYXJhbmNlIi8+Ci0gICAgICA8L3BhZ2U+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmFjdGlvblNldHMiPgotICAgICAgPGFjdGlvblNldAotICAgICAgICAgICAgbGFiZWw9IiVjaGVhdHNoZWV0LmFjdGlvbnNldCIKLSAgICAgICAgICAgIHZpc2libGU9InRydWUiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuY2hlYXRzaGVldHMuYWN0aW9uU2V0Ij4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlY2hlYXRzaGVldC5pdGVtIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLmNoZWF0c2hlZXRzLkNoZWF0U2hlZXRFeHRlbnNpb25GYWN0b3J5OmhlbHBNZW51QWN0aW9uIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9ImhlbHAvZ3JvdXAudHV0b3JpYWxzIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmNoZWF0c2hlZXRzLmFjdGlvbnMuQ2hlYXRTaGVldEhlbHBNZW51QWN0aW9uIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgPC9hY3Rpb25TZXQ+Ci0gICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5wbGF0Zm9ybS9wbHVnaW5fY3VzdG9taXphdGlvbi5pbmkgYi9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5wbGF0Zm9ybS9wbHVnaW5fY3VzdG9taXphdGlvbi5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjZTM2MmQuLjAwMDAwMDAKLS0tIGEvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vcGx1Z2luX2N1c3RvbWl6YXRpb24uaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotIyBwbHVnaW5fY3VzdG9taXphdGlvbi5pbmkgCi0jIHNldHMgZGVmYXVsdCB2YWx1ZXMgZm9yIHBsdWctaW4tc3BlY2lmaWMgcHJlZmVyZW5jZXMKLSMga2V5cyBhcmUgcXVhbGlmaWVkIGJ5IHBsdWctaW4gaWQKLSMgZS5nLiwgY29tLmV4YW1wbGUuYWNtZXBsdWdpbi9teXByb3BlcnR5PW15dmFsdWUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIHBsdWdpbl9jdXN0b21pemF0aW9uLnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBXQVJOSU5HOiBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgcHJlZmVyZW5jZSBvdmVycmlkZXMgZm9yIHRoZSBQbGF0Zm9ybSBidWlsZCAKLSMgKHRoZSBvbmUgd2l0aCBubyBKRFQgb3IgUERFKSwgbm90IHRoZSBTREsgYnVpbGQgKGFrYSB0aGUgSURFKS4gIAotIyBGb3IgdGhlIFNESyBidWlsZCwgdXNlIHRoZSBwbHVnaW5fY3VzdG9taXphdGlvbi5pbmkgZmlsZSBpbiB0aGUgCi0jIG9yZy5lY2xpcHNlLnNkayBwbHVnLWluIGluc3RlYWQuCi0KLSMgUHJvcGVydHkgIm9yZy5lY2xpcHNlLnVpL2RlZmF1bHRQZXJzcGVjdGl2ZUlkIiBjb250cm9scyB0aGUgCi0jIHBlcnNwZWN0aXZlIHRoYXQgdGhlIHdvcmtiZW5jaCBvcGVucyBpbml0aWFsbHkKLW9yZy5lY2xpcHNlLnVpL2RlZmF1bHRQZXJzcGVjdGl2ZUlkPW9yZy5lY2xpcHNlLnVpLnJlc291cmNlUGVyc3BlY3RpdmUKLQotIyBuZXctc3R5bGUgdGFicyBieSBkZWZhdWx0Ci1vcmcuZWNsaXBzZS51aS9TSE9XX1RSQURJVElPTkFMX1NUWUxFX1RBQlM9ZmFsc2UKLQotIyBwdXQgdGhlIHBlcnNwZWN0aXZlIHN3aXRjaGVyIG9uIHRoZSB0b3AgcmlnaHQKLW9yZy5lY2xpcHNlLnVpL0RPQ0tfUEVSU1BFQ1RJVkVfQkFSPXRvcFJpZ2h0Ci0KLSMgc2hvdyBwcm9ncmVzcyBvbiBzdGFydHVwCi1vcmcuZWNsaXBzZS51aS9TSE9XX1BST0dSRVNTX09OX1NUQVJUVVA9dHJ1ZQotCi0jIFdlbGNvbWUgdGhlbWUgdG8gdXNlCi1vcmcuZWNsaXBzZS51aS5pbnRyby9JTlRST19USEVNRSA9IG9yZy5lY2xpcHNlLnVpLmludHJvLnVuaXZlcnNhbC5jaXJjbGVzCi0KLSMgUm9vdCBwYWdlIGxpbmtzIHRvIHNob3cgaW4gdGhlIFVuaXZlcnNhbCBXZWxjb21lCi1vcmcuZWNsaXBzZS51aS5pbnRyby51bml2ZXJzYWwvSU5UUk9fUk9PVF9QQUdFUyA9IG92ZXJ2aWV3LHR1dG9yaWFscyxzYW1wbGVzLHdoYXRzbmV3Ci0KLSMgSW5pdGlhbCBwYWdlIGxheW91dCBvZiB0aGUgVW5pdmVyc2FsIFdlbGNvbWUKLW9yZy5lY2xpcHNlLnVpLmludHJvLnVuaXZlcnNhbC9JTlRST19EQVRBID0gcHJvZHVjdDppbnRyb0RhdGEueG1sCi0KLSMgT3JkZXIgaGVscCBib29rcyBpbiB0YWJsZSBvZiBjb250ZW50cwotb3JnLmVjbGlwc2UuaGVscC9IRUxQX0RBVEEgPSBoZWxwRGF0YS54bWwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5wbGF0Zm9ybS9wbHVnaW5fY3VzdG9taXphdGlvbi5wcm9wZXJ0aWVzIGIvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vcGx1Z2luX2N1c3RvbWl6YXRpb24ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJmMzUxNy4uMDAwMDAwMAotLS0gYS9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5wbGF0Zm9ybS9wbHVnaW5fY3VzdG9taXphdGlvbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBwbHVnaW5fY3VzdG9taXphdGlvbi5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBwbHVnaW5fY3VzdG9taXphdGlvbi5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgpkaWZmIC0tZ2l0IGEvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vc3BsYXNoLmJtcCBiL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL3NwbGFzaC5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlNzE5MTEuLjAwMDAwMDAKLS0tIGEvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vc3BsYXNoLmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL3NyYy1pbnRyby9vcmcvZWNsaXBzZS9wbGF0Zm9ybS9pbnRlcm5hbC9DaGVhdFNoZWV0U3RhbmRieUNvbnRlbnQuamF2YSBiL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL3NyYy1pbnRyby9vcmcvZWNsaXBzZS9wbGF0Zm9ybS9pbnRlcm5hbC9DaGVhdFNoZWV0U3RhbmRieUNvbnRlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmUwNTZiNC4uMDAwMDAwMAotLS0gYS9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5wbGF0Zm9ybS9zcmMtaW50cm8vb3JnL2VjbGlwc2UvcGxhdGZvcm0vaW50ZXJuYWwvQ2hlYXRTaGVldFN0YW5kYnlDb250ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnBsYXRmb3JtLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5jaGVhdHNoZWV0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRyby4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludHJvLmNvbmZpZy4qOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgQ2hlYXRTaGVldFN0YW5kYnlDb250ZW50IGltcGxlbWVudHMgSVN0YW5kYnlDb250ZW50UGFydCB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgTUVNRU5UT19DSEVBVFNIRUVUX0lEX0FUVCA9ICJjaGVhdHNoZWV0SWQiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvL3ByaXZhdGUgSUludHJvUGFydCBpbnRyb1BhcnQ7Ci0gICAgcHJpdmF0ZSBJQ2hlYXRTaGVldFZpZXdlciB2aWV3ZXI7Ci0gICAgcHJpdmF0ZSBDb21wb3NpdGUgY29udGFpbmVyOwotICAgIHByaXZhdGUgU3RyaW5nIGlucHV0OwotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5pbnRyby5pbnRlcm5hbC5wYXJ0cy5JU3RhbmRieUNvbnRlbnRQYXJ0I2luaXQob3JnLmVjbGlwc2UudWkuaW50cm8uSUludHJvUGFydCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbml0KElJbnRyb1BhcnQgaW50cm9QYXJ0LCBJTWVtZW50byBtZW1lbnRvKSB7Ci0gICAgICAgIC8vdGhpcy5pbnRyb1BhcnQgPSBpbnRyb1BhcnQ7Ci0gICAgICAgIC8vIHRyeSB0byByZXN0b3JlIGxhc3Qgc3RhdGUuCi0gICAgICAgIGlucHV0ID0gZ2V0Q2FjaGVkSW5wdXQobWVtZW50byk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5pbnRyby5pbnRlcm5hbC5wYXJ0cy5JU3RhbmRieUNvbnRlbnRQYXJ0I2NyZWF0ZUNvbnRyb2wob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLAotICAgICAqICAgICAgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgcGFyZW50LCBGb3JtVG9vbGtpdCB0b29sa2l0KSB7Ci0gICAgICAgIGNvbnRhaW5lciA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKHBhcmVudCk7Ci0gICAgICAgIEZpbGxMYXlvdXQgbGF5b3V0ID0gbmV3IEZpbGxMYXlvdXQoKTsKLSAgICAgICAgbGF5b3V0Lm1hcmdpbldpZHRoID0gbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0gICAgICAgIGNvbnRhaW5lci5zZXRMYXlvdXQobGF5b3V0KTsKLQotICAgICAgICB2aWV3ZXIgPSBDaGVhdFNoZWV0Vmlld2VyRmFjdG9yeS5jcmVhdGVDaGVhdFNoZWV0VmlldygpOwotICAgICAgICB2aWV3ZXIuY3JlYXRlUGFydENvbnRyb2woY29udGFpbmVyKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmludHJvLmludGVybmFsLnBhcnRzLklTdGFuZGJ5Q29udGVudFBhcnQjZ2V0Q29udHJvbCgpCi0gICAgICovCi0gICAgcHVibGljIENvbnRyb2wgZ2V0Q29udHJvbCgpIHsKLSAgICAgICAgcmV0dXJuIGNvbnRhaW5lcjsKLSAgICB9Ci0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkuaW50cm8uaW50ZXJuYWwucGFydHMuSVN0YW5kYnlDb250ZW50UGFydCNzZXRJbnB1dChqYXZhLmxhbmcuT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldElucHV0KE9iamVjdCBpbnB1dCkgewotICAgICAgICAvLyBpZiB0aGUgbmV3IGlucHV0IGlzIG51bGwsIHVzZSBjYWNjaGVkIGlucHV0IGZyb20gbW9tZW50by4KLSAgICAgICAgaWYgKGlucHV0ICE9IG51bGwpCi0gICAgICAgICAgICB0aGlzLmlucHV0ID0gKFN0cmluZykgaW5wdXQ7Ci0gICAgICAgIHZpZXdlci5zZXRJbnB1dCh0aGlzLmlucHV0KTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmludHJvLmludGVybmFsLnBhcnRzLklTdGFuZGJ5Q29udGVudFBhcnQjc2V0Rm9jdXMoKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotICAgICAgICB2aWV3ZXIuc2V0Rm9jdXMoKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmludHJvLmludGVybmFsLnBhcnRzLklTdGFuZGJ5Q29udGVudFBhcnQjZGlzcG9zZSgpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkuaW50cm8uY29uZmlnLklTdGFuZGJ5Q29udGVudFBhcnQjc2F2ZVN0YXRlKG9yZy5lY2xpcHNlLnVpLklNZW1lbnRvKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNhdmVTdGF0ZShJTWVtZW50byBtZW1lbnRvKSB7Ci0gICAgICAgIFN0cmluZyBjdXJyZW50Q2hlYXRTaGVldElkID0gdmlld2VyLmdldENoZWF0U2hlZXRJRCgpOwotICAgICAgICBpZiAoY3VycmVudENoZWF0U2hlZXRJZCAhPSBudWxsKQotICAgICAgICAgICAgbWVtZW50by5wdXRTdHJpbmcoTUVNRU5UT19DSEVBVFNIRUVUX0lEX0FUVCwgY3VycmVudENoZWF0U2hlZXRJZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVHJpZXMgdG8gY3JlYXRlIHRoZSBsYXN0IGNvbnRlbnQgcGFydCB2aWV3ZWQsIGJhc2VkIG9uIGNvbnRlbnQgcGFydCBpZC4uCi0gICAgICogCi0gICAgICogQHBhcmFtIG1lbWVudG8KLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0Q2FjaGVkSW5wdXQoSU1lbWVudG8gbWVtZW50bykgewotICAgICAgICBpZiAobWVtZW50byA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIHJldHVybiBtZW1lbnRvLmdldFN0cmluZyhNRU1FTlRPX0NIRUFUU0hFRVRfSURfQVRUKTsKLQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vc3JjLWludHJvL29yZy9lY2xpcHNlL3BsYXRmb3JtL2ludGVybmFsL0VjbGlwc2VSU1NWaWV3ZXIuamF2YSBiL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL3NyYy1pbnRyby9vcmcvZWNsaXBzZS9wbGF0Zm9ybS9pbnRlcm5hbC9FY2xpcHNlUlNTVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2YTk4NzQuLjAwMDAwMDAKLS0tIGEvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vc3JjLWludHJvL29yZy9lY2xpcHNlL3BsYXRmb3JtL2ludGVybmFsL0VjbGlwc2VSU1NWaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnBsYXRmb3JtLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5VUkxFbmNvZGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkZpbGVMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5icm93c2VyLklXb3JrYmVuY2hCcm93c2VyU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5ldmVudHMuSHlwZXJsaW5rQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5ldmVudHMuSHlwZXJsaW5rRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1Ub29sa2l0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2Nyb2xsZWRGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludHJvLmNvbmZpZy5JSW50cm9Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50cm8uY29uZmlnLklJbnRyb0NvbnRlbnRQcm92aWRlclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50cm8uY29uZmlnLklJbnRyb1VSTDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRyby5jb25maWcuSW50cm9VUkxGYWN0b3J5OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci1pbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlcjsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VSU1NWaWV3ZXIgaW1wbGVtZW50cyBJSW50cm9Db250ZW50UHJvdmlkZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBORVdTX1VSTCA9ICJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2hvbWUvZWNsaXBzZW5ld3MucnNzIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTlRST19TSE9XX0lOX0JST1dTRVIgPSAiaHR0cDovL29yZy5lY2xpcHNlLnVpLmludHJvL29wZW5Ccm93c2VyP3VybD0iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9ORVdTX0lURU1TID0gNTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFJFRl9CVUxMRVQgPSAiYnVsbGV0IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBJSW50cm9Db250ZW50UHJvdmlkZXJTaXRlIHNpdGU7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZGlzcG9zZWQ7Ci0KLQlwcml2YXRlIFN0cmluZyBpZDsKLQotCXByaXZhdGUgRm9ybVRvb2xraXQgdG9vbGtpdDsKLQotCXByaXZhdGUgQ29tcG9zaXRlIHBhcmVudDsKLQotCXByaXZhdGUgSW1hZ2UgYnVsbGV0SW1hZ2U7Ci0KLQlwcml2YXRlIExpc3QgaXRlbXM7Ci0KLQlwcml2YXRlIEZvcm1UZXh0IGZvcm1UZXh0OwotCi0Jc3RhdGljIGNsYXNzIE5ld3NJdGVtIHsKLQkJU3RyaW5nIGxhYmVsOwotCi0JCVN0cmluZyB1cmw7Ci0KLQkJdm9pZCBzZXRMYWJlbChTdHJpbmcgbGFiZWwpIHsKLQkJCXRoaXMubGFiZWwgPSBsYWJlbDsKLQkJfQotCi0JCXZvaWQgc2V0VXJsKFN0cmluZyB1cmwpIHsKLQkJCXRoaXMudXJsID0gdXJsOwotCQl9Ci0JfQotCi0JY2xhc3MgTmV3c0ZlZWQgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCS8vIGltcG9ydGFudDogZG9uJ3QgZG8gdGhlIHdvcmsgaWYgdGhlCi0JCQkvLyBwYXJ0IGdldHMgZGlzcG9zZWQgaW4gdGhlIHByb2Nlc3MKLQkJCWlmIChkaXNwb3NlZCkKLQkJCQlyZXR1cm47Ci0JCQljcmVhdGVOZXdzSXRlbXMoKTsKLQkJCWlmIChkaXNwb3NlZCkKLQkJCQlyZXR1cm47Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERpc3BsYXkoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCQkJCS8vIHdlIG11c3QgcmVjcmVhdGUgdGhlIGNvbnRlbnQKLQkJCQkJCS8vIGZvciBTV1QgYmVjYXVzZSB3ZSB3aWxsIHVzZQotCQkJCQkJLy8gYSBnZW50bGUgaW5jcmVtZW50YWwgcmVmbG93LgotCQkJCQkJLy8gSFRNTCByZWZsb3cgd2lsbCBzaW1wbHkgcmVsb2FkIHRoZSBwYWdlLgotCQkJCQkJY3JlYXRlQ29udGVudChpZCwgcGFyZW50LCB0b29sa2l0KTsKLQkJCQkJCXJlZmxvdyhmb3JtVGV4dCk7Ci0JCQkJCX0KLQkJCQkJc2l0ZS5yZWZsb3coRWNsaXBzZVJTU1ZpZXdlci50aGlzLCB0cnVlKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEhhbmRsZXMgUlNTIFhNTCBhbmQgcG9wdWxhdGVzIHRoZSBpdGVtcyBsaXN0IHdpdGggYXQgbW9zdAotCSAqIE1BWF9ORVdTX0lURU1TIGl0ZW1zLgotCSAqLwotCXByaXZhdGUgY2xhc3MgUlNTSGFuZGxlciBleHRlbmRzIERlZmF1bHRIYW5kbGVyIHsKLQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9SU1MgPSAicnNzIjsgLy8kTk9OLU5MUy0xJAotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9DSEFOTkVMID0gImNoYW5uZWwiOyAvLyROT04tTkxTLTEkCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX0lURU0gPSAiaXRlbSI7IC8vJE5PTi1OTFMtMSQKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfVElUTEUgPSAidGl0bGUiOyAvLyROT04tTkxTLTEkCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX0xJTksgPSAibGluayI7IC8vJE5PTi1OTFMtMSQKLQotCQlwcml2YXRlIFN0YWNrIHN0YWNrID0gbmV3IFN0YWNrKCk7Ci0JCXByaXZhdGUgU3RyaW5nQnVmZmVyIGJ1ZjsKLQkJcHJpdmF0ZSBOZXdzSXRlbSBpdGVtOwotCQkKLQkJcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxTmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJCXN0YWNrLnB1c2gocU5hbWUpOwotCQkJLy8gaXQncyBhIHRpdGxlL2xpbmsgaW4gYW4gaXRlbQotCQkJaWYgKChFTEVNRU5UX1RJVExFLmVxdWFscyhxTmFtZSkgfHwgRUxFTUVOVF9MSU5LLmVxdWFscyhxTmFtZSkpCi0JCQkJCSYmIChpdGVtICE9IG51bGwpKSB7Ci0JCQkJLy8gcHJlcGFyZSB0aGUgYnVmZmVyOyB3ZSdyZSBleHBlY3RpbmcgY2hhcnMKLQkJCQlidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQl9Ci0JCQkvLyBpdCdzIGFuIGl0ZW0gaW4gYSBjaGFubmVsIGluIHJzcwotCQkJZWxzZSBpZiAoRUxFTUVOVF9JVEVNLmVxdWFscyhxTmFtZSkKLQkJCQkJJiYgKEVMRU1FTlRfQ0hBTk5FTC5lcXVhbHMoc3RhY2suZ2V0KDEpKSkKLQkJCQkJJiYgKEVMRU1FTlRfUlNTLmVxdWFscyhzdGFjay5nZXQoMCkpKQotCQkJCQkmJiAoc3RhY2suc2l6ZSgpID09IDMpCi0JCQkJCSYmIChpdGVtcy5zaXplKCkgPCBNQVhfTkVXU19JVEVNUykpIHsKLQkJCQkvLyBwcmVwYXJlIHRoZSBpdGVtCi0JCQkJaXRlbSA9IG5ldyBOZXdzSXRlbSgpOwotCQkJfQotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBlbmRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxTmFtZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCQlzdGFjay5wb3AoKTsKLQkJCWlmIChpdGVtICE9IG51bGwpIHsKLQkJCQlpZiAoYnVmICE9IG51bGwpIHsKLQkJCQkJaWYgKEVMRU1FTlRfVElUTEUuZXF1YWxzKHFOYW1lKSkgewotCQkJCQkJaXRlbS5zZXRMYWJlbChidWYudG9TdHJpbmcoKS50cmltKCkpOwotCQkJCQkJYnVmID0gbnVsbDsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChFTEVNRU5UX0xJTksuZXF1YWxzKHFOYW1lKSkgewotCQkJCQkJaXRlbS5zZXRVcmwoYnVmLnRvU3RyaW5nKCkudHJpbSgpKTsKLQkJCQkJCWJ1ZiA9IG51bGw7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWlmIChFTEVNRU5UX0lURU0uZXF1YWxzKHFOYW1lKSkgewotCQkJCQkJLy8gZW5zdXJlIHdlIGhhdmUgYSB2YWxpZCBpdGVtCi0JCQkJCQlpZiAoaXRlbS5sYWJlbCAhPSBudWxsICYmIGl0ZW0ubGFiZWwubGVuZ3RoKCkgPiAwICYmCi0JCQkJCQkJCWl0ZW0udXJsICE9IG51bGwgJiYgaXRlbS51cmwubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQkJaXRlbXMuYWRkKGl0ZW0pOwotCQkJCQkJfQotCQkJCQkJaXRlbSA9IG51bGw7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIGNoYXJhY3RlcnMoY2hhcltdIGNoLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQkJLy8gd2VyZSB3ZSBleHBlY3RpbmcgY2hhcnM/Ci0JCQlpZiAoYnVmICE9IG51bGwpIHsKLQkJCQlidWYuYXBwZW5kKG5ldyBTdHJpbmcoY2gsIHN0YXJ0LCBsZW5ndGgpKTsKLQkJCX0KLQkJfQotCX0KLQotCQotCXB1YmxpYyB2b2lkIGluaXQoSUludHJvQ29udGVudFByb3ZpZGVyU2l0ZSBzaXRlKSB7Ci0JCXRoaXMuc2l0ZSA9IHNpdGU7Ci0JCVRocmVhZCBuZXdzV29ya2VyID0gbmV3IFRocmVhZChuZXcgTmV3c0ZlZWQoKSk7Ci0JCW5ld3NXb3JrZXIuc3RhcnQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250ZW50KFN0cmluZyBpZCwgUHJpbnRXcml0ZXIgb3V0KSB7Ci0JCWlmIChkaXNwb3NlZCkKLQkJCXJldHVybjsKLQkJdGhpcy5pZCA9IGlkOwotCQlpZiAoaXRlbXMgPT0gbnVsbCkgewotCQkJb3V0LnByaW50KCI8cCBjbGFzcz1cInN0YXR1cy10ZXh0XCI+Iik7IC8vJE5PTi1OTFMtMSQKLQkJCW91dC5wcmludChNZXNzYWdlcy5nZXRTdHJpbmcoIkVjbGlwc2VSU1NWaWV3ZXJfbG9hZGluZyIpKTsgLy8kTk9OLU5MUy0xJAotCQkJb3V0LnByaW50bG4oIjwvcD4iKTsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgewotCQkJaWYgKGl0ZW1zLnNpemUoKSA+IDApIHsKLQkJCQlvdXQucHJpbnRsbigiPHVsIGlkPVwiZWNsaXBzZS1uZXdzXCI+Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLnNpemUoKTsgaSsrKSB7Ci0JCQkJCU5ld3NJdGVtIGl0ZW0gPSAoTmV3c0l0ZW0pIGl0ZW1zLmdldChpKTsKLQkJCQkJb3V0LnByaW50KCI8bGk+Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJb3V0LnByaW50KCI8YSBjbGFzcz1cInRvcGljTGlzdFwiIGhyZWY9XCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlvdXQucHJpbnQoY3JlYXRlRXh0ZXJuYWxVUkwoaXRlbS51cmwpKTsKLQkJCQkJb3V0LnByaW50KCJcIj4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlvdXQucHJpbnQoaXRlbS5sYWJlbCk7Ci0JCQkJCW91dC5wcmludCgiPC9hPiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCW91dC5wcmludGxuKCI8L2xpPiIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlvdXQucHJpbnQoIjxwIGNsYXNzPVwic3RhdHVzLXRleHRcIj4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCW91dC5wcmludChNZXNzYWdlcy5nZXRTdHJpbmcoIkVjbGlwc2VSU1NWaWV3ZXJfbm9OZXdzIikpOyAvLyROT04tTkxTLTEkCi0JCQkJb3V0LnByaW50bG4oIjwvcD4iKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJb3V0LnByaW50bG4oIjwvdWw+Iik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRlbnQoU3RyaW5nIGlkLCBDb21wb3NpdGUgcGFyZW50LCBGb3JtVG9vbGtpdCB0b29sa2l0KSB7Ci0JCWlmIChkaXNwb3NlZCkKLQkJCXJldHVybjsKLQkJaWYgKGZvcm1UZXh0ID09IG51bGwpIHsKLQkJCS8vIGEgb25lLXRpbWUgcGFzcwotCQkJZm9ybVRleHQgPSB0b29sa2l0LmNyZWF0ZUZvcm1UZXh0KHBhcmVudCwgdHJ1ZSk7Ci0JCQlmb3JtVGV4dC5hZGRIeXBlcmxpbmtMaXN0ZW5lcihuZXcgSHlwZXJsaW5rQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBsaW5rQWN0aXZhdGVkKEh5cGVybGlua0V2ZW50IGUpIHsKLQkJCQkJZG9OYXZpZ2F0ZSgoU3RyaW5nKSBlLmdldEhyZWYoKSk7Ci0JCQkJfQotCQkJfSk7Ci0JCQlidWxsZXRJbWFnZSA9IGNyZWF0ZUltYWdlKG5ldyBQYXRoKCJpbnRyby9jc3MvZ3JhcGhpY3MvYXJyb3cuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoYnVsbGV0SW1hZ2UhPW51bGwpCi0JCQkJZm9ybVRleHQuc2V0SW1hZ2UoSFJFRl9CVUxMRVQsIGJ1bGxldEltYWdlKTsKLQkJCXRoaXMucGFyZW50ID0gcGFyZW50OwotCQkJdGhpcy50b29sa2l0ID0gdG9vbGtpdDsKLQkJCXRoaXMuaWQgPSBpZDsKLQkJfQotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWZmZXIuYXBwZW5kKCI8Zm9ybT4iKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoaXRlbXMgPT0gbnVsbCkgewotCQkJYnVmZmVyLmFwcGVuZCgiPHA+Iik7IC8vJE5PTi1OTFMtMSQKLQkJCWJ1ZmZlci5hcHBlbmQoTWVzc2FnZXMuZ2V0U3RyaW5nKCJFY2xpcHNlUlNTVmlld2VyX2xvYWRpbmciKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWJ1ZmZlci5hcHBlbmQoIjwvcD4iKTsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgewotCQkJaWYgKGl0ZW1zLnNpemUoKSA+IDApIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLnNpemUoKTsgaSsrKSB7Ci0JCQkJCU5ld3NJdGVtIGl0ZW0gPSAoTmV3c0l0ZW0pIGl0ZW1zLmdldChpKTsKLQkJCQkJYnVmZmVyLmFwcGVuZCgiPGxpIHN0eWxlPVwiaW1hZ2VcIiB2YWx1ZT1cIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWJ1ZmZlci5hcHBlbmQoSFJFRl9CVUxMRVQpOwotCQkJCQlidWZmZXIuYXBwZW5kKCJcIj4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlidWZmZXIuYXBwZW5kKCI8YSBocmVmPVwiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYnVmZmVyLmFwcGVuZChpdGVtLnVybCk7Ci0JCQkJCWJ1ZmZlci5hcHBlbmQoIlwiPiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWJ1ZmZlci5hcHBlbmQoaXRlbS5sYWJlbCk7Ci0JCQkJCWJ1ZmZlci5hcHBlbmQoIjwvYT4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlidWZmZXIuYXBwZW5kKCI8L2xpPiIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlidWZmZXIuYXBwZW5kKCI8cD4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCWJ1ZmZlci5hcHBlbmQoTWVzc2FnZXMuZ2V0U3RyaW5nKCJFY2xpcHNlUlNTVmlld2VyX25vTmV3cyIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCWJ1ZmZlci5hcHBlbmQoIjwvcD4iKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCWJ1ZmZlci5hcHBlbmQoIjwvZm9ybT4iKTsgLy8kTk9OLU5MUy0xJAotCQlmb3JtVGV4dC5zZXRUZXh0KGJ1ZmZlci50b1N0cmluZygpLCB0cnVlLCBmYWxzZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgY3JlYXRlRXh0ZXJuYWxVUkwoU3RyaW5nIHVybCkgewotCQkvL1RPRE8gZG9uJ3Qga25vdyB3aGljaCBlbmNvZGluZyB0byBwYXNzIGhlcmUgLSByZXZpc2l0Ci0JCXJldHVybiBJTlRST19TSE9XX0lOX0JST1dTRVIrCi0JCQkJCQkJVVJMRW5jb2Rlci5lbmNvZGUodXJsKTsKLQl9Ci0KLQlwcml2YXRlIEltYWdlIGNyZWF0ZUltYWdlKElQYXRoIHBhdGgpIHsKLQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZSgib3JnLmVjbGlwc2UucGxhdGZvcm0iKTsgLy8kTk9OLU5MUy0xJAotCQlVUkwgdXJsID0gRmlsZUxvY2F0b3IuZmluZChidW5kbGUsIHBhdGgsIG51bGwpOwotCQl0cnkgewotCQkJdXJsID0gRmlsZUxvY2F0b3IudG9GaWxlVVJMKHVybCk7Ci0JCQlJbWFnZURlc2NyaXB0b3IgZGVzYyA9IEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKHVybCk7Ci0JCQlyZXR1cm4gZGVzYy5jcmVhdGVJbWFnZSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBkb05hdmlnYXRlKGZpbmFsIFN0cmluZyB1cmwpIHsKLQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXREaXNwbGF5KCksCi0JCQkJbmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlJSW50cm9VUkwgaW50cm9VcmwgPSBJbnRyb1VSTEZhY3RvcnkKLQkJCQkJCQkJLmNyZWF0ZUludHJvVVJMKHVybCk7Ci0JCQkJCQlpZiAoaW50cm9VcmwgIT0gbnVsbCkgewotCQkJCQkJCS8vIGV4ZWN1dGUgdGhlIGFjdGlvbiBlbWJlZGRlZCBpbiB0aGUgSW50cm9VUkwKLQkJCQkJCQlpbnRyb1VybC5leGVjdXRlKCk7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQkJLy8gZGVsZWdhdGUgdG8gdGhlIGJyb3dzZXIgc3VwcG9ydAotCQkJCQkJb3BlbkJyb3dzZXIodXJsKTsKLQkJCQkJfQotCQkJCX0pOwotCX0KLQotCXByaXZhdGUgdm9pZCBvcGVuQnJvd3NlcihTdHJpbmcgaHJlZikgewotCQl0cnkgewotCQkJVVJMIHVybCA9IG5ldyBVUkwoaHJlZik7Ci0JCQlJV29ya2JlbmNoQnJvd3NlclN1cHBvcnQgc3VwcG9ydCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkJLmdldEJyb3dzZXJTdXBwb3J0KCk7Ci0JCQlzdXBwb3J0LmdldEV4dGVybmFsQnJvd3NlcigpLm9wZW5VUkwodXJsKTsKLQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZU5ld3NJdGVtcygpIHsKLQkJaXRlbXMgPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRMaXN0KG5ldyBBcnJheUxpc3QoKSk7Ci0JCUlucHV0U3RyZWFtIGluID0gbnVsbDsKLQkJdHJ5IHsKLQkJCVVSTCB1cmwgPSBuZXcgVVJMKE5FV1NfVVJMKTsKLQkJCWluID0gdXJsLm9wZW5TdHJlYW0oKTsKLQkJCVNBWFBhcnNlciBwYXJzZXIgPSBTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3U0FYUGFyc2VyKCk7Ci0JCQlwYXJzZXIucGFyc2UoaW4sIG5ldyBSU1NIYW5kbGVyKCkpOwotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWYgYW55dGhpbmcgZ29lcyB3cm9uZywgZmFpbCBzaWxlbnRseTsgaXQgd2lsbCBzaG93IGEKLQkJCS8vICJubyBuZXdzIGF2YWlsYWJsZSIgbWVzc2FnZS4KLQkJfQotCQlmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJaWYgKGluICE9IG51bGwpIHsKLQkJCQkJaW4uY2xvc2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCS8vIG5vdGhpbmcgd2UgY2FuIGRvIGhlcmUKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogVGhpcyBtZXRob2QgaXMgY29waWVkIGZyb20gU2VjdGlvbiBhbmQgc2VlbXMgdXNlZnVsIGluIGdlbmVyYWwuIFBlcmhhcHMKLQkgKiB3ZSBzaG91bGQgbW92ZSBpdCBpbnRvIGNvbnRlbnQgcHJvdmlkZXIgc2l0ZSwgc29tZXRoaW5nIGxpa2UKLQkgKiAncmVmbG93KENvbnRyb2wgc3RhcnRpbmdDb250cm9sKScKLQkgKi8KLQotCXByaXZhdGUgdm9pZCByZWZsb3coQ29udHJvbCBpbml0aWF0b3IpIHsKLQkJQ29udHJvbCBjID0gaW5pdGlhdG9yOwotCQl3aGlsZSAoYyAhPSBudWxsKSB7Ci0JCQljLnNldFJlZHJhdyhmYWxzZSk7Ci0JCQljID0gYy5nZXRQYXJlbnQoKTsKLQkJCWlmIChjIGluc3RhbmNlb2YgU2Nyb2xsZWRGb3JtKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJYyA9IGluaXRpYXRvcjsKLQkJd2hpbGUgKGMgIT0gbnVsbCkgewotCQkJaWYgKGMgaW5zdGFuY2VvZiBDb21wb3NpdGUpCi0JCQkJKChDb21wb3NpdGUpIGMpLmxheW91dCh0cnVlKTsKLQkJCWMgPSBjLmdldFBhcmVudCgpOwotCQkJaWYgKGMgaW5zdGFuY2VvZiBTY3JvbGxlZEZvcm0pIHsKLQkJCQkoKFNjcm9sbGVkRm9ybSkgYykucmVmbG93KHRydWUpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWMgPSBpbml0aWF0b3I7Ci0JCXdoaWxlIChjICE9IG51bGwpIHsKLQkJCWMuc2V0UmVkcmF3KHRydWUpOwotCQkJYyA9IGMuZ2V0UGFyZW50KCk7Ci0JCQlpZiAoYyBpbnN0YW5jZW9mIFNjcm9sbGVkRm9ybSkgewotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGJ1bGxldEltYWdlICE9IG51bGwpIHsKLQkJCWJ1bGxldEltYWdlLmRpc3Bvc2UoKTsKLQkJCWJ1bGxldEltYWdlID0gbnVsbDsKLQkJfQotCQlkaXNwb3NlZCA9IHRydWU7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL3NyYy1pbnRyby9vcmcvZWNsaXBzZS9wbGF0Zm9ybS9pbnRlcm5hbC9MYXVuY2hVcGRhdGVJbnRyb0FjdGlvbi5qYXZhIGIvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vc3JjLWludHJvL29yZy9lY2xpcHNlL3BsYXRmb3JtL2ludGVybmFsL0xhdW5jaFVwZGF0ZUludHJvQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmY2JmMzQuLjAwMDAwMDAKLS0tIGEvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vc3JjLWludHJvL29yZy9lY2xpcHNlL3BsYXRmb3JtL2ludGVybmFsL0xhdW5jaFVwZGF0ZUludHJvQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wbGF0Zm9ybS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRyby5JSW50cm9TaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludHJvLmNvbmZpZy5JSW50cm9BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnVpLlVwZGF0ZU1hbmFnZXJVSTsKLQotcHVibGljIGNsYXNzIExhdW5jaFVwZGF0ZUludHJvQWN0aW9uIGltcGxlbWVudHMgSUludHJvQWN0aW9uIHsKLQotICAgIHB1YmxpYyBMYXVuY2hVcGRhdGVJbnRyb0FjdGlvbigpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBydW4oSUludHJvU2l0ZSBzaXRlLCBQcm9wZXJ0aWVzIHBhcmFtcykgewotCi0gICAgICAgIFJ1bm5hYmxlIHIgPSBuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgU2hlbGwgY3VycmVudFNoZWxsID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotICAgICAgICAgICAgICAgICAgICAuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKTsKLSAgICAgICAgICAgICAgICBVcGRhdGVNYW5hZ2VyVUkub3Blbkluc3RhbGxlcihjdXJyZW50U2hlbGwpOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotCi0gICAgICAgIFNoZWxsIGN1cnJlbnRTaGVsbCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLSAgICAgICAgICAgIC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpOwotICAgICAgICBjdXJyZW50U2hlbGwuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhyKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5wbGF0Zm9ybS9zcmMtaW50cm8vb3JnL2VjbGlwc2UvcGxhdGZvcm0vaW50ZXJuYWwvTWVzc2FnZXMuamF2YSBiL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL3NyYy1pbnRyby9vcmcvZWNsaXBzZS9wbGF0Zm9ybS9pbnRlcm5hbC9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNThiZjhkLi4wMDAwMDAwCi0tLSBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL3NyYy1pbnRyby9vcmcvZWNsaXBzZS9wbGF0Zm9ybS9pbnRlcm5hbC9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnBsYXRmb3JtLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLXB1YmxpYyBjbGFzcyBNZXNzYWdlcyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLnBsYXRmb3JtLmludGVybmFsLm1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVzb3VyY2VCdW5kbGUgUkVTT1VSQ0VfQlVORExFID0gUmVzb3VyY2VCdW5kbGUKLQkJCS5nZXRCdW5kbGUoQlVORExFX05BTUUpOwotCi0JcHJpdmF0ZSBNZXNzYWdlcygpIHsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgewotCQl0cnkgewotCQkJcmV0dXJuIFJFU09VUkNFX0JVTkRMRS5nZXRTdHJpbmcoa2V5KTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAnIScgKyBrZXkgKyAnISc7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5wbGF0Zm9ybS9zcmMtaW50cm8vb3JnL2VjbGlwc2UvcGxhdGZvcm0vaW50ZXJuYWwvbWVzc2FnZXMucHJvcGVydGllcyBiL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL3NyYy1pbnRyby9vcmcvZWNsaXBzZS9wbGF0Zm9ybS9pbnRlcm5hbC9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDQyMmMzLi4wMDAwMDAwCi0tLSBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL3NyYy1pbnRyby9vcmcvZWNsaXBzZS9wbGF0Zm9ybS9pbnRlcm5hbC9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotRWNsaXBzZVJTU1ZpZXdlcl9sb2FkaW5nPUxvYWRpbmcgdGhlIG5ld3MuLi4KLUVjbGlwc2VSU1NWaWV3ZXJfbm9OZXdzPU5vIG5ld3MgYXQgdGhpcyB0aW1lLgpkaWZmIC0tZ2l0IGEvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vc3JjL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vc3JjL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTg3N2VlLi4wMDAwMDAwCi0tLSBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL3NyYy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1NYWluLUNsYXNzOiBvcmcuZWNsaXBzZS5jb3JlLmxhdW5jaGVyLk1haW4KZGlmZiAtLWdpdCBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL3NyYy9vcmcvZWNsaXBzZS9jb3JlL2xhdW5jaGVyL01haW4uamF2YSBiL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL3NyYy9vcmcvZWNsaXBzZS9jb3JlL2xhdW5jaGVyL01haW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZjZTUzMS4uMDAwMDAwMAotLS0gYS9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5wbGF0Zm9ybS9zcmMvb3JnL2VjbGlwc2UvY29yZS9sYXVuY2hlci9NYWluLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5jb3JlLmxhdW5jaGVyOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEubmV0Lio7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBGaWxlOwotCi0vKioKLSAqIFRoZSBsYXVuY2hlciBmb3IgRWNsaXBzZS4KLSAqLwotcHVibGljIGNsYXNzIE1haW4gewotICAgIC8qKgotICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgaW5zdGFuY2UgaXMgcnVubmluZyBpbiBkZWJ1ZyBtb2RlLgotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGRlYnVnID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbG9jYXRpb24gb2YgdGhlIGxhdW5jaGVyIHRvIHJ1bi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGJvb3RMb2NhdGlvbiA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbG9jYXRpb24gb2YgdGhlIGluc3RhbGwgcm9vdAotICAgICAqLwotICAgIHByb3RlY3RlZCBVUkwgaW5zdGFsbExvY2F0aW9uID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIFRoZSBsb2NhdGlvbiBvZiB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhpcyBpbnN0YW5jZQotICAgICAqLwotICAgIHByb3RlY3RlZCBVUkwgY29uZmlndXJhdGlvbkxvY2F0aW9uID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIFRoZSBsb2NhdGlvbiBvZiB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBpbiB0aGUgaW5zdGFsbCByb290Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBwYXJlbnRDb25maWd1cmF0aW9uTG9jYXRpb24gPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogVGhlIGlkIG9mIHRoZSBidW5kbGUgdGhhdCB3aWxsIGNvbnRhaW4gdGhlIGZyYW1ld29yayB0byBydW4uICBEZWZhdWx0cyB0byBvcmcuZWNsaXBzZS5vc2dpLgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZnJhbWV3b3JrID0gT1NHSTsKLQotICAgIC8qKgotICAgICAqIFRoZSBleHRyYSBkZXZlbG9wbWVudCB0aW1lIGNsYXNzIHBhdGggZW50cmllcyBmb3IgdGhlIGZyYW1ld29yay4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGRldkNsYXNzUGF0aCA9IG51bGw7Ci0KLSAgICAvKgotICAgICAqIFRoZSBleHRyYSBkZXZlbG9wbWVudCB0aW1lIGNsYXNzIHBhdGggZW50cmllcyBmb3IgYWxsIGJ1bmRsZXMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBQcm9wZXJ0aWVzIGRldkNsYXNzUGF0aFByb3BzID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgaW5zdGFuY2UgaXMgcnVubmluZyBpbiBkZXZlbG9wbWVudCBtb2RlLgotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGluRGV2ZWxvcG1lbnRNb2RlID0gZmFsc2U7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBleGl0RGF0YSA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZSA9IG51bGw7IC8vIFRoZSBuYW1lIHRvIGJyYW5kIHRoZSBsYXVuY2hlcgotICAgIHByaXZhdGUgU3RyaW5nIGxhdW5jaGVyID0gbnVsbDsgLy8gVGhlIGZ1bGwgcGF0aCB0byB0aGUgbGF1bmNoZXIKLQotICAgIHByaXZhdGUgU3RyaW5nIHZtID0gbnVsbDsKLSAgICBwcml2YXRlIFN0cmluZ1tdIHZtYXJncyA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTdHJpbmdbXSBjb21tYW5kcyA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTdHJpbmdbXSBleHRlbnNpb25QYXRocyA9IG51bGw7Ci0KLSAgICAvLyBzcGxhc2ggaGFuZGxpbmcKLSAgICBwcml2YXRlIFN0cmluZyBzaG93U3BsYXNoID0gbnVsbDsKLSAgICBwcml2YXRlIFN0cmluZyBlbmRTcGxhc2ggPSBudWxsOwotICAgIHByaXZhdGUgYm9vbGVhbiBpbml0aWFsaXplID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBQcm9jZXNzIHNob3dQcm9jZXNzID0gbnVsbDsKLSAgICBwcml2YXRlIGJvb2xlYW4gc3BsYXNoRG93biA9IGZhbHNlOwotICAgIHB1YmxpYyBmaW5hbCBjbGFzcyBFbmRTcGxhc2hIYW5kbGVyIGV4dGVuZHMgVGhyZWFkIHsKLSAgICAJcHVibGljIHZvaWQgcnVuKCkgewotICAgIAkJdGFrZURvd25TcGxhc2goKTsKLSAgICAJfQotICAgIAlwdWJsaWMgT3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbSgpIHsKLQkJCXJldHVybiBzaG93UHJvY2VzcyA9PSBudWxsID8gbnVsbCA6IHNob3dQcm9jZXNzLmdldE91dHB1dFN0cmVhbSgpOwotCQl9Ci0gICAgfQotICAgIHByaXZhdGUgZmluYWwgVGhyZWFkIGVuZFNwbGFzaEhhbmRsZXIgPSBuZXcgRW5kU3BsYXNoSGFuZGxlcigpOwotCi0gICAgLy8gY29tbWFuZCBsaW5lIGFyZ3MKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRlJBTUVXT1JLID0gIi1mcmFtZXdvcmsiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOU1RBTEwgPSAiLWluc3RhbGwiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOSVRJQUxJWkUgPSAiLWluaXRpYWxpemUiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZNID0gIi12bSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVk1BUkdTID0gIi12bWFyZ3MiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFQlVHID0gIi1kZWJ1ZyI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVWID0gIi1kZXYiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR1VSQVRJT04gPSAiLWNvbmZpZ3VyYXRpb24iOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYSVREQVRBID0gIi1leGl0ZGF0YSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9TUExBU0ggPSAiLW5vc3BsYXNoIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTSE9XU1BMQVNIID0gIi1zaG93c3BsYXNoIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FID0gIi1uYW1lIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMQVVOQ0hFUiA9ICItbGF1bmNoZXIiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5MID0gIi1ubCI7ICAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVORFNQTEFTSCA9ICItZW5kc3BsYXNoIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTUExBU0hfSU1BR0UgPSAic3BsYXNoLmJtcCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xFQU4gPSAiLWNsZWFuIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOT0VYSVQgPSAiLW5vRXhpdCI7ICAvLyROT04tTkxTLTEkCi0JCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9TR0kgPSAib3JnLmVjbGlwc2Uub3NnaSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBUlRFUiA9ICJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuYWRhcHRvci5FY2xpcHNlU3RhcnRlciI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExBVEZPUk1fVVJMID0gInBsYXRmb3JtOi9iYXNlLyI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRV9QUk9QRVJUSUVTID0gImVjbGlwc2UucHJvcGVydGllcyI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRV9TQ0hFTUUgPSAiZmlsZToiOyAvLyROT04tTkxTLTEkICAgIAotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRkVSRU5DRV9TQ0hFTUUgPSAicmVmZXJlbmNlOiI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBKQVJfU0NIRU1FID0gImphcjoiOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfSlJFX1JFUVVJUkVEID0gIjEuNC4xIjsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIC8vIGNvbnN0YW50czogY29uZmlndXJhdGlvbiBmaWxlIGxvY2F0aW9uCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR19ESVIgPSAiY29uZmlndXJhdGlvbi8iOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR19GSUxFID0gImNvbmZpZy5pbmkiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR19GSUxFX1RFTVBfU1VGRklYID0gIi50bXAiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR19GSUxFX0JBS19TVUZGSVggPSAiLmJhayI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRSA9ICJlY2xpcHNlIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9EVUNUX1NJVEVfTUFSS0VSID0gIi5lY2xpcHNlcHJvZHVjdCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPRFVDVF9TSVRFX0lEID0gImlkIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9EVUNUX1NJVEVfVkVSU0lPTiA9ICJ2ZXJzaW9uIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLy8gY29uc3RhbnRzOiBTeXN0ZW0gcHJvcGVydHkga2V5cyBhbmQvb3IgY29uZmlndXJhdGlvbiBmaWxlIGVsZW1lbnRzCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfVVNFUl9IT01FID0gInVzZXIuaG9tZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9VU0VSX0RJUiA9ICJ1c2VyLmRpciI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9JTlNUQUxMX0FSRUEgPSAib3NnaS5pbnN0YWxsLmFyZWEiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfQ09ORklHX0FSRUEgPSAib3NnaS5jb25maWd1cmF0aW9uLmFyZWEiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfQ09ORklHX0FSRUFfREVGQVVMVCA9ICJvc2dpLmNvbmZpZ3VyYXRpb24uYXJlYS5kZWZhdWx0IjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0JBU0VfQ09ORklHX0FSRUEgPSAib3NnaS5iYXNlQ29uZmlndXJhdGlvbi5hcmVhIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX1NIQVJFRF9DT05GSUdfQVJFQSA9ICJvc2dpLnNoYXJlZENvbmZpZ3VyYXRpb24uYXJlYSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9DT05GSUdfQ0FTQ0FERUQgPSAib3NnaS5jb25maWd1cmF0aW9uLmNhc2NhZGVkIjsgLy8kTk9OLU5MUy0xJAotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfRlJBTUVXT1JLID0gIm9zZ2kuZnJhbWV3b3JrIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX1NQTEFTSFBBVEggPSAib3NnaS5zcGxhc2hQYXRoIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX1NQTEFTSExPQ0FUSU9OID0gIm9zZ2kuc3BsYXNoTG9jYXRpb24iOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfQ0xBU1NQQVRIID0gIm9zZ2kuZnJhbWV3b3JrQ2xhc3NQYXRoIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0VYVEVOU0lPTlMgPSAib3NnaS5mcmFtZXdvcmsuZXh0ZW5zaW9ucyI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9GUkFNRVdPUktfU1lTUEFUSCA9ICJvc2dpLnN5c3BhdGgiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfRlJBTUVXT1JLX1NIQVBFID0gIm9zZ2kuZnJhbWV3b3JrLnNoYXBlIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0xPR0ZJTEUgPSAib3NnaS5sb2dmaWxlIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX1JFUVVJUkVEX0pBVkFfVkVSU0lPTiA9ICJvc2dpLnJlcXVpcmVkSmF2YVZlcnNpb24iOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfUEFSRU5UX0NMQVNTTE9BREVSID0gIm9zZ2kucGFyZW50Q2xhc3Nsb2FkZXIiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfTkwgPSAib3NnaS5ubCI7ICAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfTk9TSFVURE9XTiA9ICJvc2dpLm5vU2h1dGRvd24iOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfREVCVUcgPSAib3NnaS5kZWJ1ZyI7IC8vJE5PTi1OTFMtMSQJCi0JCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfRVhJVENPREUgPSAiZWNsaXBzZS5leGl0Y29kZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9FWElUREFUQSA9ICJlY2xpcHNlLmV4aXRkYXRhIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfVk0gPSAiZWNsaXBzZS52bSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9WTUFSR1MgPSAiZWNsaXBzZS52bWFyZ3MiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfQ09NTUFORFMgPSAiZWNsaXBzZS5jb21tYW5kcyI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9FQ0xJUFNFU0VDVVJJVFkgPSAiZWNsaXBzZS5zZWN1cml0eSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8vIERhdGEgbW9kZSBjb25zdGFudHMgZm9yIHVzZXIsIGNvbmZpZ3VyYXRpb24gYW5kIGRhdGEgbG9jYXRpb25zLgotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOT05FID0gIkBub25lIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOT19ERUZBVUxUID0gIkBub0RlZmF1bHQiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRVJfSE9NRSA9ICJAdXNlci5ob21lIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VSX0RJUiA9ICJAdXNlci5kaXIiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvLyB0eXBlcyBvZiBwYXJlbnQgY2xhc3Nsb2FkZXJzIHRoZSBmcmFtZXdvcmsgY2FuIGhhdmUKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSRU5UX0NMQVNTTE9BREVSX0FQUCA9ICJhcHAiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkVOVF9DTEFTU0xPQURFUl9FWFQgPSAiZXh0IjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJFTlRfQ0xBU1NMT0FERVJfQk9PVCA9ICJib290IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLy8gbG9nIGZpbGUgaGFuZGxpbmcKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTRVNTSU9OID0gIiFTRVNTSU9OIjsgLy8kTk9OLU5MUy0xJAotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVFJZID0gIiFFTlRSWSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBNRVNTQUdFID0gIiFNRVNTQUdFIjsgLy8kTk9OLU5MUy0xJAotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQUNLID0gIiFTVEFDSyI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBFUlJPUiA9IDQ7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmNvcmUubGF1bmNoZXIiOyAvLyROT04tTkxTLTEkCi0gICAgcHJvdGVjdGVkIEZpbGUgbG9nRmlsZSA9IG51bGw7Ci0gICAgcHJvdGVjdGVkIEJ1ZmZlcmVkV3JpdGVyIGxvZyA9IG51bGw7Ci0gICAgcHJvdGVjdGVkIGJvb2xlYW4gbmV3U2Vzc2lvbiA9IHRydWU7Ci0KLSAgICAvKioKLSAgICAgKiBBIHN0cnVjdHVyZWQgZm9ybSBmb3IgYSB2ZXJzaW9uIGlkZW50aWZpZXIuCi0gICAgICogCi0gICAgICogQHNlZSBodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvdmVyc2lvbmluZ19uYW1pbmcuaHRtbCBmb3IgaW5mb3JtYXRpb24gb24gdmFsaWQgdmVyc2lvbiBzdHJpbmdzCi0gICAgICovCi0gICAgc3RhdGljIGNsYXNzIElkZW50aWZpZXIgewotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMSU0gPSAiLiBfLSI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgcHJpdmF0ZSBpbnQgbWFqb3IsIG1pbm9yLCBzZXJ2aWNlOwotICAgICAgICBJZGVudGlmaWVyKGludCBtYWpvciwgaW50IG1pbm9yLCBpbnQgc2VydmljZSkgewotICAgICAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgICAgIHRoaXMubWFqb3IgPSBtYWpvcjsKLSAgICAgICAgICAgIHRoaXMubWlub3IgPSBtaW5vcjsKLSAgICAgICAgICAgIHRoaXMuc2VydmljZSA9IHNlcnZpY2U7Ci0gICAgICAgIH0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGlmIGNhbm5vdCBwYXJzZSB0aGUgbWFqb3IgYW5kIG1pbm9yIHZlcnNpb24gY29tcG9uZW50cwotICAgICAgICAgKi8KLSAgICAgICAgSWRlbnRpZmllcihTdHJpbmcgdmVyc2lvblN0cmluZykgewotICAgICAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgICAgIFN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHZlcnNpb25TdHJpbmcsIERFTElNKTsKLQotICAgICAgICAgICAgLy8gbWFqb3IKLSAgICAgICAgICAgIGlmICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKQotICAgICAgICAgICAgICAgIG1ham9yID0gSW50ZWdlci5wYXJzZUludCh0b2tlbml6ZXIubmV4dFRva2VuKCkpOwotCi0gICAgICAgICAgICAvLyBtaW5vcgotICAgICAgICAgICAgaWYgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpCi0gICAgICAgICAgICAgICAgbWlub3IgPSBJbnRlZ2VyLnBhcnNlSW50KHRva2VuaXplci5uZXh0VG9rZW4oKSk7Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgLy8gc2VydmljZQotICAgICAgICAgICAgICAgIGlmICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKQotICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlID0gSW50ZWdlci5wYXJzZUludCh0b2tlbml6ZXIubmV4dFRva2VuKCkpOwotICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkgewotICAgICAgICAgICAgICAgIC8vIGlnbm9yZSB0aGUgc2VydmljZSBxdWFsaWZpZXIgaW4gdGhhdCBjYXNlIGFuZCBkZWZhdWx0IHRvIDAKLSAgICAgICAgICAgICAgICAvLyB0aGlzIHdpbGwgYWxsb3cgdXMgdG8gdG9sZXJhdGUgb3RoZXIgbm9uLWNvbnZlbnRpb25hbCB2ZXJzaW9uIG51bWJlcnMgCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGlkIGlzIGNvbnNpZGVyZWQgdG8gYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBnaXZlbiBiYXNlbGluZS4KLSAgICAgICAgICogZS5nLiAKLSAgICAgICAgICogMS4yLjkgPj0gMS4zLjEgLT4gZmFsc2UKLSAgICAgICAgICogMS4zLjAgPj0gMS4zLjEgLT4gZmFsc2UKLSAgICAgICAgICogMS4zLjEgPj0gMS4zLjEgLT4gdHJ1ZQotICAgICAgICAgKiAxLjMuMiA+PSAxLjMuMSAtPiB0cnVlCi0gICAgICAgICAqIDIuMC4wID49IDEuMy4xIC0+IHRydWUKLSAgICAgICAgICovCi0gICAgICAgIGJvb2xlYW4gaXNHcmVhdGVyRXF1YWxUbyhJZGVudGlmaWVyIG1pbmltdW0pIHsKLSAgICAgICAgICAgIGlmIChtYWpvciA8IG1pbmltdW0ubWFqb3IpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgaWYgKG1ham9yID4gbWluaW11bS5tYWpvcikKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIC8vIG1ham9yIG51bWJlcnMgYXJlIGVxdWl2YWxlbnQgc28gY2hlY2sgbWlub3IKLSAgICAgICAgICAgIGlmIChtaW5vciA8IG1pbmltdW0ubWlub3IpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgaWYgKG1pbm9yID4gbWluaW11bS5taW5vcikKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIC8vIG1pbm9yIG51bWJlcnMgYXJlIGVxdWl2YWxlbnQgc28gY2hlY2sgc2VydmljZQotICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2UgPj0gbWluaW11bS5zZXJ2aWNlOwotICAgICAgICB9Ci0gICAgfSAgIAotCi0gICAgLyoqCi0gICAgICogRXhlY3V0ZXMgdGhlIGxhdW5jaC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYXJncyBjb21tYW5kLWxpbmUgYXJndW1lbnRzCi0gICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gdGhyb3duIGlmIGEgcHJvYmxlbSBvY2N1cnMgZHVyaW5nIHRoZSBsYXVuY2gKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBiYXNpY1J1bihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3lzdGVtLmdldFByb3BlcnRpZXMoKS5wdXQoImVjbGlwc2Uuc3RhcnRUaW1lIiwgTG9uZy50b1N0cmluZyhTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGNvbW1hbmRzID0gYXJnczsKLSAgICAgICAgU3RyaW5nW10gcGFzc1RocnVBcmdzID0gcHJvY2Vzc0NvbW1hbmRMaW5lKGFyZ3MpOwotICAgICAgICBpZiAoIWRlYnVnKQotICAgICAgICAJLy8gZGVidWcgY2FuIGJlIHNwZWNpZmllZCBhcyBzeXN0ZW0gcHJvcGVydHkgYXMgd2VsbAotICAgICAgICAJZGVidWcgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoUFJPUF9ERUJVRykgIT0gbnVsbDsKLSAgICAgICAgc2V0dXBWTVByb3BlcnRpZXMoKTsKLSAgICAgICAgcHJvY2Vzc0NvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgCi0gICAgICAgIC8vZW5zdXJlIG1pbmltdW0gSmF2YSB2ZXJzaW9uCi0gICAgICAgIGlmICghY2hlY2tWZXJzaW9uKFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS52ZXJzaW9uIiksIFN5c3RlbS5nZXRQcm9wZXJ0eShQUk9QX1JFUVVJUkVEX0pBVkFfVkVSU0lPTiwgREVGQVVMVF9KUkVfUkVRVUlSRUQpKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAKLSAgICAgICAgLy8gbmVlZCB0byBlbnN1cmUgdGhhdCBnZXRJbnN0YWxsTG9jYXRpb24gaXMgY2FsbGVkIGF0IGxlYXN0IG9uY2UgdG8gaW5pdGlhbGl6ZSB0aGUgdmFsdWUuCi0gICAgICAgIC8vIERvIHRoaXMgQUZURVIgcHJvY2Vzc2luZyB0aGUgY29uZmlndXJhdGlvbiB0byBhbGxvdyB0aGUgY29uZmlndXJhdGlvbiB0byBzZXQKLSAgICAgICAgLy8gdGhlIGluc3RhbGwgbG9jYXRpb24uICAKLSAgICAgICAgZ2V0SW5zdGFsbExvY2F0aW9uKCk7Ci0KLSAgICAgICAgLy8gbG9jYXRlIGJvb3QgcGx1Z2luIChtYXkgcmV0dXJuIC1kZXYgbW9kZSB2YXJpYXRpb25zKQotICAgICAgICBVUkxbXSBib290UGF0aCA9IGdldEJvb3RQYXRoKGJvb3RMb2NhdGlvbik7Ci0gICAgICAgIHNldFNlY3VyaXR5UG9saWN5KGJvb3RQYXRoKTsKLSAgICAgICAgLy8gc3BsYXNoIGhhbmRsaW5nIGlzIGRvbmUgaGVyZSwgYmVjYXVzZSB0aGUgZGVmYXVsdCBjYXNlIG5lZWRzIHRvIGtub3cKLSAgICAgICAgLy8gdGhlIGxvY2F0aW9uIG9mIHRoZSBib290IHBsdWdpbiB3ZSBhcmUgZ29pbmcgdG8gdXNlCi0gICAgICAgIGhhbmRsZVNwbGFzaChib290UGF0aCk7Ci0KLSAgICAgICAgaW52b2tlRnJhbWV3b3JrKHBhc3NUaHJ1QXJncywgYm9vdFBhdGgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFNlY3VyaXR5UG9saWN5KFVSTFtdIGJvb3RQYXRoKSB7Ci0gICAgICAgIFN0cmluZyBlY2xpcHNlU2VjdXJpdHkgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoUFJPUF9FQ0xJUFNFU0VDVVJJVFkpOwotICAgICAgICBpZiAoZWNsaXBzZVNlY3VyaXR5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIFNlY3VyaXR5TWFuYWdlciBzbSA9IFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKTsKLSAgICAgICAgICAgIGJvb2xlYW4gc2V0U00gPSBmYWxzZTsKLSAgICAgICAgICAgIGlmIChzbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGVjbGlwc2VTZWN1cml0eS5sZW5ndGgoKSA8IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgZWNsaXBzZVNlY3VyaXR5ID0gImphdmEubGFuZy5TZWN1cml0eU1hbmFnZXIiOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIENsYXNzIGNsYXp6ID0gQ2xhc3MuZm9yTmFtZShlY2xpcHNlU2VjdXJpdHkpOwotICAgICAgICAgICAgICAgICAgICBzbSA9IChTZWN1cml0eU1hbmFnZXIpIGNsYXp6Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIHNldFNNID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkucHV0KCJqYXZhLnNlY3VyaXR5Lm1hbmFnZXIiLCBlY2xpcHNlU2VjdXJpdHkpOyAvLyBsZXQgdGhlIGZyYW1ld29yayB0cnkgdG8gbG9hZCBpdCBsYXRlci4gLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgUHJvdGVjdGlvbkRvbWFpbiBkb21haW4gPSBNYWluLmNsYXNzLmdldFByb3RlY3Rpb25Eb21haW4oKTsKLSAgICAgICAgICAgIENvZGVTb3VyY2Ugc291cmNlID0gbnVsbDsgCi0gICAgICAgICAgICBpZiAoZG9tYWluICE9IG51bGwpCi0gICAgICAgICAgICAJc291cmNlID0gTWFpbi5jbGFzcy5nZXRQcm90ZWN0aW9uRG9tYWluKCkuZ2V0Q29kZVNvdXJjZSgpOwotCQkJaWYgKGRvbWFpbiA9PSBudWxsIHx8IHNvdXJjZSA9PSBudWxsKSB7Ci0JCQkJbG9nKCJDYW4gbm90IGF1dG9tYXRpY2FsbHkgc2V0IHRoZSBzZWN1cml0eSBtYW5hZ2VyLiBQbGVhc2UgdXNlIGEgcG9saWN5IGZpbGUuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm47Ci0JCQl9Ci0gICAgICAgICAgICAvLyBnZXQgdGhlIGxpc3Qgb2YgY29kZXNvdXJjZSBVUkxzIHRvIGdyYW50IEFsbFBlcm1pc3Npb24gdG8KLSAgICAgICAgICAgIFVSTFtdIHJvb3RVUkxzID0gbmV3IFVSTFtib290UGF0aC5sZW5ndGggKyAxXTsKLQkJCXJvb3RVUkxzWzBdID0gc291cmNlLmdldExvY2F0aW9uKCk7Ci0gICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJvb3RQYXRoLCAwLCByb290VVJMcywgMSwgYm9vdFBhdGgubGVuZ3RoKTsKLSAgICAgICAgICAgIC8vIHJlcGxhY2UgdGhlIHNlY3VyaXR5IHBvbGljeQotICAgICAgICAgICAgUG9saWN5IGVjbGlwc2VQb2xpY3kgPSBuZXcgRWNsaXBzZVBvbGljeShQb2xpY3kuZ2V0UG9saWN5KCksIHJvb3RVUkxzKTsKLSAgICAgICAgICAgIFBvbGljeS5zZXRQb2xpY3koZWNsaXBzZVBvbGljeSk7Ci0gICAgICAgICAgICBpZiAoc2V0U00pCi0gICAgICAgICAgICAgICAgU3lzdGVtLnNldFNlY3VyaXR5TWFuYWdlcihzbSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW52b2tlRnJhbWV3b3JrKFN0cmluZ1tdIHBhc3NUaHJ1QXJncywgVVJMW10gYm9vdFBhdGgpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLCBOb1N1Y2hNZXRob2RFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIEVycm9yLCBFeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgdHlwZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eShQUk9QX1BBUkVOVF9DTEFTU0xPQURFUiwgUEFSRU5UX0NMQVNTTE9BREVSX0JPT1QpOwotICAgICAgICBDbGFzc0xvYWRlciBwYXJlbnQgPSBudWxsOwotICAgICAgICBpZiAoUEFSRU5UX0NMQVNTTE9BREVSX0FQUC5lcXVhbHNJZ25vcmVDYXNlKHR5cGUpKQotICAgICAgICAgICAgcGFyZW50ID0gQ2xhc3NMb2FkZXIuZ2V0U3lzdGVtQ2xhc3NMb2FkZXIoKTsKLSAgICAgICAgZWxzZSBpZiAoUEFSRU5UX0NMQVNTTE9BREVSX0VYVC5lcXVhbHNJZ25vcmVDYXNlKHR5cGUpKSB7Ci0gICAgICAgICAgICBDbGFzc0xvYWRlciBhcHBDTCA9IENsYXNzTG9hZGVyLmdldFN5c3RlbUNsYXNzTG9hZGVyKCk7Ci0gICAgICAgICAgICBpZiAoYXBwQ0wgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBwYXJlbnQgPSBhcHBDTC5nZXRQYXJlbnQoKTsKLSAgICAgICAgfQotICAgICAgICBVUkxDbGFzc0xvYWRlciBsb2FkZXIgPSBuZXcgU3RhcnR1cENsYXNzTG9hZGVyKGJvb3RQYXRoLCBwYXJlbnQpOwotICAgICAgICBDbGFzcyBjbGF6eiA9IGxvYWRlci5sb2FkQ2xhc3MoU1RBUlRFUik7Ci0gICAgICAgIE1ldGhvZCBtZXRob2QgPSBjbGF6ei5nZXREZWNsYXJlZE1ldGhvZCgicnVuIiwgbmV3IENsYXNzW10ge1N0cmluZ1tdLmNsYXNzLCBSdW5uYWJsZS5jbGFzc30pOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtZXRob2QuaW52b2tlKGNsYXp6LCBuZXcgT2JqZWN0W10ge3Bhc3NUaHJ1QXJncywgZW5kU3BsYXNoSGFuZGxlcn0pOwotICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlmIChlLmdldFRhcmdldEV4Y2VwdGlvbigpIGluc3RhbmNlb2YgRXJyb3IpCi0gICAgICAgICAgICAgICAgdGhyb3cgKEVycm9yKSBlLmdldFRhcmdldEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgZWxzZSBpZiAoZS5nZXRUYXJnZXRFeGNlcHRpb24oKSBpbnN0YW5jZW9mIEV4Y2VwdGlvbikKLSAgICAgICAgICAgICAgICB0aHJvdyAoRXhjZXB0aW9uKSBlLmdldFRhcmdldEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIC8vY291bGQgYmUgYSBzdWJjbGFzcyBvZiBUaHJvd2FibGUhCi0gICAgICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBhdmFpbGFibGUgdmVyc2lvbiBpcyBncmVhdGVyIG9yIGVxdWFsIHRvIHRoZSAKLSAgICAgKiBnaXZlbiByZXF1aXJlZCB2ZXJzaW9uLgotICAgICAqIDxwPldpbGwgc2V0IFBST1BfRVhJVENPREUvUFJPUF9FWElUREFUQSBhY2NvcmRpbmdseSBpZiBjaGVjayBmYWlscy48L3A+Ci0gICAgICogICAKLSAgICAgKiBAcmV0dXJuIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGNoZWNraW5nIHBhc3NlZCAKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjaGVja1ZlcnNpb24oU3RyaW5nIGF2YWlsYWJsZVZlcnNpb24sIFN0cmluZyByZXF1aXJlZFZlcnNpb24pIHsKLSAgICAgICAgaWYgKHJlcXVpcmVkVmVyc2lvbiA9PSBudWxsIHx8IGF2YWlsYWJsZVZlcnNpb24gPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgSWRlbnRpZmllciByZXF1aXJlZCA9IG5ldyBJZGVudGlmaWVyKHJlcXVpcmVkVmVyc2lvbik7Ci0gICAgICAgICAgICBJZGVudGlmaWVyIGF2YWlsYWJsZSA9IG5ldyBJZGVudGlmaWVyKGF2YWlsYWJsZVZlcnNpb24pOwotICAgICAgICAgICAgYm9vbGVhbiBjb21wYXRpYmxlID0gYXZhaWxhYmxlLmlzR3JlYXRlckVxdWFsVG8ocmVxdWlyZWQpOwotICAgICAgICAgICAgaWYgKCFjb21wYXRpYmxlKSB7Ci0gICAgICAgICAgICAgICAgLy8gYW55IG5vbi16ZXJvIHZhbHVlIHNob3VsZCBkbyBpdCAtIDE0IHVzZWQgdG8gYmUgdXNlZCBmb3IgdmVyc2lvbiBpbmNvbXBhdGliaWxpdHkgaW4gRWNsaXBzZSAyLjEgCi0gICAgICAgICAgICAgICAgU3lzdGVtLmdldFByb3BlcnRpZXMoKS5wdXQoUFJPUF9FWElUQ09ERSwgIjE0Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydGllcygpLnB1dChQUk9QX0VYSVREQVRBLCAiPHRpdGxlPkluY29tcGF0aWJsZSBKVk08L3RpdGxlPlZlcnNpb24gIiArIGF2YWlsYWJsZVZlcnNpb24gKyAiIG9mIHRoZSBKVk0gaXMgbm90IHN1aXRhYmxlIGZvciB0aGlzIHByb2R1Y3QuIFZlcnNpb246ICIrIHJlcXVpcmVkVmVyc2lvbiArICIgb3IgZ3JlYXRlciBpcyByZXF1aXJlZC4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBjb21wYXRpYmxlOwotICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBJZiB0aGUgc2VjdXJpdHkgbWFuYWdlciB3b24ndCBhbGxvdyB1cyB0byBnZXQgdGhlIHN5c3RlbSBwcm9wZXJ0eSwgY29udGludWUgZm9yCi0gICAgICAgICAgICAvLyBub3cgYW5kIGxldCB0aGluZ3MgZmFpbCBsYXRlciBvbiB0aGVpciBvd24gaWYgbmVjZXNzYXJ5LgotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBJZiB0aGUgdmVyc2lvbiBzdHJpbmcgd2FzIGluIGEgZm9ybWF0IHRoYXQgd2UgZG9uJ3QgdW5kZXJzdGFuZCwgY29udGludWUgYW5kCi0gICAgICAgICAgICAvLyBsZXQgdGhpbmdzIGZhaWwgbGF0ZXIgb24gdGhlaXIgb3duIGlmIG5lY2Vzc2FyeS4KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIFVSTCBTdHJpbmcuICBUaGlzIGNvbnZlcnRzCi0gICAgICogZXNjYXBlZCBzZXF1ZW5jZXMgKCUuLikgaW4gdGhlIFVSTCBpbnRvIHRoZSBhcHByb3ByaWF0ZSBjaGFyYWN0ZXJzLgotICAgICAqIE5PVEU6IGR1ZSB0byBjbGFzcyB2aXNpYmlsaXR5IHRoZXJlIGlzIGEgY29weSBvZiB0aGlzIG1ldGhvZAotICAgICAqICAgICAgIGluIEludGVybmFsQm9vdExvYWRlcgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZGVjb2RlKFN0cmluZyB1cmxTdHJpbmcpIHsKLSAgICAgICAgLy90cnkgdG8gdXNlIEphdmEgMS40IG1ldGhvZCBpZiBhdmFpbGFibGUKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIENsYXNzIGNsYXp6ID0gVVJMRGVjb2Rlci5jbGFzczsKLSAgICAgICAgICAgIE1ldGhvZCBtZXRob2QgPSBjbGF6ei5nZXREZWNsYXJlZE1ldGhvZCgiZGVjb2RlIiwgbmV3IENsYXNzW10ge1N0cmluZy5jbGFzcywgU3RyaW5nLmNsYXNzfSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIC8vZmlyc3QgZW5jb2RlICcrJyBjaGFyYWN0ZXJzLCBiZWNhdXNlIFVSTERlY29kZXIgaW5jb3JyZWN0bHkgY29udmVydHMgCi0gICAgICAgICAgICAvL3RoZW0gdG8gc3BhY2VzIG9uIGNlcnRhaW4gY2xhc3MgbGlicmFyeSBpbXBsZW1lbnRhdGlvbnMuCi0gICAgICAgICAgICBpZiAodXJsU3RyaW5nLmluZGV4T2YoJysnKSA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgaW50IGxlbiA9IHVybFN0cmluZy5sZW5ndGgoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcihsZW4pOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgY2hhciBjID0gdXJsU3RyaW5nLmNoYXJBdChpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGMgPT0gJysnKQotICAgICAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiJTJCIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZChjKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdXJsU3RyaW5nID0gYnVmLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBPYmplY3QgcmVzdWx0ID0gbWV0aG9kLmludm9rZShudWxsLCBuZXcgT2JqZWN0W10ge3VybFN0cmluZywgIlVURi04In0pOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIChTdHJpbmcpIHJlc3VsdDsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vSkRLIDEuNCBtZXRob2Qgbm90IGZvdW5kIC0tIGZhbGwgdGhyb3VnaCBhbmQgZGVjb2RlIGJ5IGhhbmQKLSAgICAgICAgfQotICAgICAgICAvL2RlY29kZSBVUkwgYnkgaGFuZAotICAgICAgICBib29sZWFuIHJlcGxhY2VkID0gZmFsc2U7Ci0gICAgICAgIGJ5dGVbXSBlbmNvZGVkQnl0ZXMgPSB1cmxTdHJpbmcuZ2V0Qnl0ZXMoKTsKLSAgICAgICAgaW50IGVuY29kZWRMZW5ndGggPSBlbmNvZGVkQnl0ZXMubGVuZ3RoOwotICAgICAgICBieXRlW10gZGVjb2RlZEJ5dGVzID0gbmV3IGJ5dGVbZW5jb2RlZExlbmd0aF07Ci0gICAgICAgIGludCBkZWNvZGVkTGVuZ3RoID0gMDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbmNvZGVkTGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGJ5dGUgYiA9IGVuY29kZWRCeXRlc1tpXTsKLSAgICAgICAgICAgIGlmIChiID09ICclJykgewotICAgICAgICAgICAgCWlmKGkrMiA+PSBlbmNvZGVkTGVuZ3RoKQotICAgICAgICAgICAgCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJNYWxmb3JtZWQgVVJMIChcIiIrdXJsU3RyaW5nKyJcIik6ICUgbXVzdCBiZSBmb2xsb3dlZCBieSAyIGRpZ2l0cy4iKTsgIC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0gICAgICAgICAgICAgICAgYnl0ZSBlbmMxID0gZW5jb2RlZEJ5dGVzWysraV07Ci0gICAgICAgICAgICAgICAgYnl0ZSBlbmMyID0gZW5jb2RlZEJ5dGVzWysraV07Ci0gICAgICAgICAgICAgICAgYiA9IChieXRlKSAoKGhleFRvQnl0ZShlbmMxKSA8PCA0KSArIGhleFRvQnl0ZShlbmMyKSk7Ci0gICAgICAgICAgICAgICAgcmVwbGFjZWQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVjb2RlZEJ5dGVzW2RlY29kZWRMZW5ndGgrK10gPSBiOwotICAgICAgICB9Ci0gICAgICAgIGlmICghcmVwbGFjZWQpCi0gICAgICAgICAgICByZXR1cm4gdXJsU3RyaW5nOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoZGVjb2RlZEJ5dGVzLCAwLCBkZWNvZGVkTGVuZ3RoLCAiVVRGLTgiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vdXNlIGRlZmF1bHQgZW5jb2RpbmcKLSAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKGRlY29kZWRCeXRlcywgMCwgZGVjb2RlZExlbmd0aCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgY29udmVydGluZyBhIGxpc3Qgb2YgY29tbWEtc2VwYXJhdGVkIHRva2VucyBpbnRvIGFuIGFycmF5Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgYXJyYXkgb2Ygc3RyaW5nIHRva2VucwotICAgICAqIEBwYXJhbSBwcm9wIHRoZSBpbml0aWFsIGNvbW1hLXNlcGFyYXRlZCBzdHJpbmcKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0QXJyYXlGcm9tTGlzdChTdHJpbmcgcHJvcCkgewotICAgICAgICBpZiAocHJvcCA9PSBudWxsIHx8IHByb3AudHJpbSgpLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nWzBdOwotICAgICAgICBWZWN0b3IgbGlzdCA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgU3RyaW5nVG9rZW5pemVyIHRva2VucyA9IG5ldyBTdHJpbmdUb2tlbml6ZXIocHJvcCwgIiwiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB3aGlsZSAodG9rZW5zLmhhc01vcmVUb2tlbnMoKSkgewotICAgICAgICAgICAgU3RyaW5nIHRva2VuID0gdG9rZW5zLm5leHRUb2tlbigpLnRyaW0oKTsKLSAgICAgICAgICAgIGlmICghdG9rZW4uZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIGxpc3QuYWRkRWxlbWVudCh0b2tlbik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGxpc3QuaXNFbXB0eSgpID8gbmV3IFN0cmluZ1swXSA6IChTdHJpbmdbXSkgbGlzdC50b0FycmF5KG5ldyBTdHJpbmdbbGlzdC5zaXplKCldKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSA8Y29kZT5VUkw8L2NvZGU+LWJhc2VkIGNsYXNzIHBhdGggZGVzY3JpYmluZyB3aGVyZSB0aGUgYm9vdCBjbGFzc2VzCi0gICAgICogYXJlIGxvY2F0ZWQgd2hlbiBydW5uaW5nIGluIGRldmVsb3BtZW50IG1vZGUuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdXJsLWJhc2VkIGNsYXNzIHBhdGgKLSAgICAgKiBAcGFyYW0gYmFzZSB0aGUgYmFzZSBsb2NhdGlvbgotICAgICAqIEBleGNlcHRpb24gTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGlmIGEgcHJvYmxlbSBvY2N1cnMgY29tcHV0aW5nIHRoZSBjbGFzcyBwYXRoCi0gICAgICovCi0gICAgcHJpdmF0ZSBVUkxbXSBnZXREZXZQYXRoKFVSTCBiYXNlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBBcnJheUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCg1KTsKLSAgICAgICAgaWYgKGluRGV2ZWxvcG1lbnRNb2RlKQotICAgICAgICAgICAgYWRkRGV2RW50cmllcyhiYXNlLCByZXN1bHQsIE9TR0kpOwotICAgICAgICAvL1RoZSBqYXJzIGZyb20gdGhlIGJhc2UgYWx3YXlzIG5lZWQgdG8gYmUgYWRkZWQsIGV2ZW4gd2hlbiBydW5uaW5nIGluIGRldiBtb2RlIChidWcgNDY3NzIpCi0gICAgICAgIGFkZEJhc2VKYXJzKGJhc2UsIHJlc3VsdCk7Ci0gICAgICAgIHJldHVybiAoVVJMW10pIHJlc3VsdC50b0FycmF5KG5ldyBVUkxbcmVzdWx0LnNpemUoKV0pOwotICAgIH0KLQotICAgIFVSTCBjb25zdHJ1Y3RVUkwoVVJMIHVybCwgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgLy9SZWNvZ25pemUgdGhlIGZvbGxvd2luZyBVUkxzCi0gICAgICAgIC8vdXJsOiBmaWxlOmZvby9kaXIvCi0gICAgICAgIC8vdXJsOiBmaWxlOmZvby9maWxlLmphcgotICAgICAgICAKLSAgICAgICAgU3RyaW5nIGV4dGVybmFsRm9ybSA9IHVybC50b0V4dGVybmFsRm9ybSgpOwotICAgICAgICBpZiAoZXh0ZXJuYWxGb3JtLmVuZHNXaXRoKCIuamFyIikpIHsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFVSTChKQVJfU0NIRU1FICsgdXJsICsgIiEvIiArIG5hbWUpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vSWdub3JlCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFVSTCh1cmwsIG5hbWUpOwotICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy9JZ25vcmUKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotICAgIHByaXZhdGUgdm9pZCByZWFkRnJhbWV3b3JrRXh0ZW5zaW9ucyhVUkwgYmFzZSwgQXJyYXlMaXN0IHJlc3VsdCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nW10gZXh0ZW5zaW9ucyA9IGdldEFycmF5RnJvbUxpc3QoU3lzdGVtLmdldFByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0eShQUk9QX0VYVEVOU0lPTlMpKTsKLSAgICAgICAgU3RyaW5nIHBhcmVudCA9IG5ldyBGaWxlKGJhc2UuZ2V0RmlsZSgpKS5nZXRQYXJlbnQoKS50b1N0cmluZygpOwotICAgICAgICBBcnJheUxpc3QgZXh0ZW5zaW9uUmVzdWx0cyA9IG5ldyBBcnJheUxpc3QoZXh0ZW5zaW9ucy5sZW5ndGgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIC8vU2VhcmNoIHRoZSBleHRlbnNpb24gcmVsYXRpdmVseSB0byB0aGUgb3NnaSBwbHVnaW4gCi0gICAgICAgICAgICBTdHJpbmcgcGF0aCA9IHNlYXJjaEZvcihleHRlbnNpb25zW2ldLCBwYXJlbnQpOwotICAgICAgICAgICAgaWYgKHBhdGggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGxvZygiQ291bGQgbm90IGZpbmQgZXh0ZW5zaW9uOiAiICsgZXh0ZW5zaW9uc1tpXSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChkZWJ1ZykKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkxvYWRpbmcgZXh0ZW5zaW9uOiAiICsgZXh0ZW5zaW9uc1tpXSk7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICAgICAgVVJMIGV4dGVuc2lvblVSTCA9IG51bGw7Ci0gICAgICAgICAgICBpZiAoaW5zdGFsbExvY2F0aW9uLmdldFByb3RvY29sKCkuZXF1YWxzKCJmaWxlIikpIHsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIGV4dGVuc2lvblJlc3VsdHMuYWRkKHBhdGgpOwotICAgICAgICAgICAgICAgIGV4dGVuc2lvblVSTCA9IG5ldyBGaWxlKHBhdGgpLnRvVVJMKCk7Ci0gICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICBleHRlbnNpb25VUkwgPSBuZXcgVVJMKGluc3RhbGxMb2NhdGlvbi5nZXRQcm90b2NvbCgpLCBpbnN0YWxsTG9jYXRpb24uZ2V0SG9zdCgpLCBpbnN0YWxsTG9jYXRpb24uZ2V0UG9ydCgpLCBwYXRoKTsKLQotICAgICAgICAgICAgLy9Mb2FkIGEgcHJvcGVydHkgZmlsZSBvZiB0aGUgZXh0ZW5zaW9uLCBtZXJnZSBpdHMgY29udGVudCwgYW5kIGluIGNhc2Ugb2YgZGV2IG1vZGUgYWRkIHRoZSBiaW4gZW50cmllcwotICAgICAgICAgICAgUHJvcGVydGllcyBleHRlbnNpb25Qcm9wZXJ0aWVzID0gbnVsbDsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZXh0ZW5zaW9uUHJvcGVydGllcyA9IGxvYWRQcm9wZXJ0aWVzKGNvbnN0cnVjdFVSTChleHRlbnNpb25VUkwsIEVDTElQU0VfUFJPUEVSVElFUykpOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGlmIChkZWJ1ZykKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcdCIgKyBFQ0xJUFNFX1BST1BFUlRJRVMgKyAiIG5vdCBmb3VuZCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFN0cmluZyBleHRlbnNpb25DbGFzc1BhdGggPSBudWxsOwotICAgICAgICAgICAgaWYgKGV4dGVuc2lvblByb3BlcnRpZXMgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBleHRlbnNpb25DbGFzc1BhdGggPSBleHRlbnNpb25Qcm9wZXJ0aWVzLmdldFByb3BlcnR5KFBST1BfQ0xBU1NQQVRIKTsKLSAgICAgICAgICAgIGVsc2UgLy8gdGhpcyBpcyBhICJub3JtYWwiIFJGQyAxMDEgZnJhbWV3b3JrIGV4dGVuc2lvbiBidW5kbGUganVzdCBwdXQgdGhlIGJhc2UgcGF0aCBvbiB0aGUgY2xhc3NwYXRoCi0gICAgICAgICAgICAgICAgZXh0ZW5zaW9uUHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0gICAgICAgICAgICBTdHJpbmdbXSBlbnRyaWVzID0gZXh0ZW5zaW9uQ2xhc3NQYXRoID09IG51bGwgfHwgZXh0ZW5zaW9uQ2xhc3NQYXRoLmxlbmd0aCgpID09IDAgPyBuZXcgU3RyaW5nW10geyIifSA6IGdldEFycmF5RnJvbUxpc3QoZXh0ZW5zaW9uQ2xhc3NQYXRoKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgU3RyaW5nIHF1YWxpZmllZFBhdGg7Ci0JCQlpZiAoU3lzdGVtLmdldFByb3BlcnR5KFBST1BfQ0xBU1NQQVRIKT09bnVsbCkKLQkJCQlxdWFsaWZpZWRQYXRoID0gIi4iOyAvLyROT04tTkxTLTEkCi0JCQllbHNlCi0JCQkJcXVhbGlmaWVkUGF0aCA9ICIiOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGVudHJpZXMubGVuZ3RoOyBqKyspCi0gICAgICAgICAgICAgICAgcXVhbGlmaWVkUGF0aCArPSAiLCAiICsgRklMRV9TQ0hFTUUgKyBwYXRoICsgZW50cmllc1tqXTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgZXh0ZW5zaW9uUHJvcGVydGllcy5wdXQoUFJPUF9DTEFTU1BBVEgsIHF1YWxpZmllZFBhdGgpOwotICAgICAgICAgICAgbWVyZ2VQcm9wZXJ0aWVzKFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCksIGV4dGVuc2lvblByb3BlcnRpZXMpOwotICAgICAgICAgICAgaWYgKGluRGV2ZWxvcG1lbnRNb2RlKSAKLSAgICAgICAgICAgICAgICBhZGREZXZFbnRyaWVzKGV4dGVuc2lvblVSTCwgcmVzdWx0LCBleHRlbnNpb25zW2ldKTsKLSAgICAgICAgfQotICAgICAgICBleHRlbnNpb25QYXRocyA9IChTdHJpbmdbXSkgZXh0ZW5zaW9uUmVzdWx0cy50b0FycmF5KG5ldyBTdHJpbmdbZXh0ZW5zaW9uUmVzdWx0cy5zaXplKCldKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkQmFzZUphcnMoVVJMIGJhc2UsIEFycmF5TGlzdCByZXN1bHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBiYXNlSmFyTGlzdCA9IFN5c3RlbS5nZXRQcm9wZXJ0eShQUk9QX0NMQVNTUEFUSCk7Ci0gICAgICAgIGlmIChiYXNlSmFyTGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZWFkRnJhbWV3b3JrRXh0ZW5zaW9ucyhiYXNlLCByZXN1bHQpOwotICAgICAgICAgICAgYmFzZUphckxpc3QgPSBTeXN0ZW0uZ2V0UHJvcGVydGllcygpLmdldFByb3BlcnR5KFBST1BfQ0xBU1NQQVRIKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgRmlsZSBmd2tGaWxlID0gbmV3IEZpbGUoYmFzZS5nZXRGaWxlKCkpOwotICAgICAgICBib29sZWFuIGZ3a0lzRGlyZWN0b3J5ID0gZndrRmlsZS5pc0RpcmVjdG9yeSgpOwotICAgICAgICAvL1dlIGZvdW5kIHdoZXJlIHRoZSBmd2sgaXMsIHJlbWVtYmVyIGl0IGFuZCBpdHMgc2hhcGUKLSAgICAgICAgaWYgKGZ3a0lzRGlyZWN0b3J5KSB7Ci0gICAgICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydGllcygpLnB1dChQUk9QX0ZSQU1FV09SS19TSEFQRSwgImZvbGRlciIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkucHV0KFBST1BfRlJBTUVXT1JLX1NIQVBFLCAiamFyIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0JICAgIFN0cmluZyBmd2tQYXRoID0gbmV3IEZpbGUobmV3IEZpbGUoYmFzZS5nZXRGaWxlKCkpLmdldFBhcmVudCgpKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJaWYgKENoYXJhY3Rlci5pc1VwcGVyQ2FzZShmd2tQYXRoLmNoYXJBdCgwKSkpIHsKLQkJCWNoYXJbXSBjaGFycyA9IGZ3a1BhdGgudG9DaGFyQXJyYXkoKTsKLQkJCWNoYXJzWzBdID0gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKGNoYXJzWzBdKTsKLQkJCWZ3a1BhdGggPSBuZXcgU3RyaW5nKGNoYXJzKTsKLQkJfQotICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydGllcygpLnB1dChQUk9QX0ZSQU1FV09SS19TWVNQQVRILCBmd2tQYXRoKTsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZ1tdIGJhc2VKYXJzID0gZ2V0QXJyYXlGcm9tTGlzdChiYXNlSmFyTGlzdCk7Ci0gICAgICAgIGlmIChiYXNlSmFycy5sZW5ndGggPT0gMCkgewotICAgICAgICAgICAgaWYgKCFpbkRldmVsb3BtZW50TW9kZSAmJiBuZXcgRmlsZShiYXNlLmdldEZpbGUoKSkuaXNEaXJlY3RvcnkoKSkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlVuYWJsZSB0byBpbml0aWFsaXplICIgKyBQUk9QX0NMQVNTUEFUSCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIGFkZEVudHJ5KGJhc2UsIHJlc3VsdCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBiYXNlSmFycy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgU3RyaW5nIHN0cmluZyA9IGJhc2VKYXJzW2ldOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAvLyBpZiB0aGUgc3RyaW5nIGlzIGEgZmlsZTogVVJMIHRoZW4gKmNhcmVmdWxseSogY29uc3RydWN0IHRoZQotICAgICAgICAgICAgICAgIC8vIFVSTC4gT3RoZXJ3aXNlanVzdCB0cnkgdG8gYnVpbGQgYSBVUkwuIEluIGVpdGhlciBjYXNlLCBpZiB3ZSBmYWlsLCB1c2UKLSAgICAgICAgICAgICAgICAvLyBzdHJpbmcgYXMgc29tZXRoaW5nIHRvIHRhY2sgb24gdGhlIGVuZCBvZiB0aGUgYmFzZS4KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAoc3RyaW5nLmVxdWFscygiLiIpKSB7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgYWRkRW50cnkoYmFzZSwgcmVzdWx0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgVVJMIHVybCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgaWYgKHN0cmluZy5zdGFydHNXaXRoKEZJTEVfU0NIRU1FKSkKLSAgICAgICAgICAgICAgICAgICAgdXJsID0gbmV3IEZpbGUoc3RyaW5nLnN1YnN0cmluZyg1KSkudG9VUkwoKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHVybCA9IG5ldyBVUkwoc3RyaW5nKTsKLSAgICAgICAgICAgICAgICBhZGRFbnRyeSh1cmwsIHJlc3VsdCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGFkZEVudHJ5KG5ldyBVUkwoYmFzZSwgc3RyaW5nKSwgcmVzdWx0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotCXByb3RlY3RlZCB2b2lkIGFkZEVudHJ5KFVSTCB1cmwsIExpc3QgcmVzdWx0KSB7Ci0gICAgICAgIGlmIChuZXcgRmlsZSh1cmwuZ2V0RmlsZSgpKS5leGlzdHMoKSkKLSAgICAgICAgICAgIHJlc3VsdC5hZGQodXJsKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkRGV2RW50cmllcyhVUkwgYmFzZSwgTGlzdCByZXN1bHQsIFN0cmluZyBzeW1ib2xpY05hbWUpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gewotICAgIAlpZiAoZGV2Q2xhc3NQYXRoUHJvcHMgPT0gbnVsbCkKLSAgICAJCXJldHVybjsgLy8gZG8gbm90aGluZwotICAgCQlTdHJpbmcgZGV2UGF0aExpc3QgPSBkZXZDbGFzc1BhdGhQcm9wcy5nZXRQcm9wZXJ0eShzeW1ib2xpY05hbWUpOwotICAgCQlpZiAoZGV2UGF0aExpc3QgPT0gbnVsbCkKLSAgIAkJCWRldlBhdGhMaXN0ID0gZGV2Q2xhc3NQYXRoUHJvcHMuZ2V0UHJvcGVydHkoIioiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBTdHJpbmdbXSBsb2NhdGlvbnMgPSBnZXRBcnJheUZyb21MaXN0KGRldlBhdGhMaXN0KTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsb2NhdGlvbnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFN0cmluZyBsb2NhdGlvbiA9IGxvY2F0aW9uc1tpXTsKLSAgICAgICAgICAgIEZpbGUgcGF0aCA9IG5ldyBGaWxlKGxvY2F0aW9uKTsKLSAgICAgICAgICAgIFVSTCB1cmw7Ci0gICAgICAgICAgICBpZiAocGF0aC5pc0Fic29sdXRlKCkpCi0gICAgICAgICAgICAgICAgdXJsID0gcGF0aC50b1VSTCgpOwotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gZGV2IHBhdGggaXMgcmVsYXRpdmUsIGNvbWJpbmUgd2l0aCBiYXNlIGxvY2F0aW9uCi0gICAgICAgICAgICAgICAgY2hhciBsYXN0Q2hhciA9IGxvY2F0aW9uLmNoYXJBdChsb2NhdGlvbi5sZW5ndGgoKSAtIDEpOwotICAgICAgICAgICAgICAgIGlmICgobG9jYXRpb24uZW5kc1dpdGgoIi5qYXIiKSB8fCAobGFzdENoYXIgPT0gJy8nIHx8IGxhc3RDaGFyID09ICdcXCcpKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICB1cmwgPSBuZXcgVVJMKGJhc2UsIGxvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHVybCA9IG5ldyBVUkwoYmFzZSwgbG9jYXRpb24gKyAiLyIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhZGRFbnRyeSh1cmwsIHJlc3VsdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSA8Y29kZT5VUkw8L2NvZGU+LWJhc2VkIGNsYXNzIHBhdGggZGVzY3JpYmluZyB3aGVyZSB0aGUgYm9vdCBjbGFzc2VzIGFyZSBsb2NhdGVkLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHVybC1iYXNlZCBjbGFzcyBwYXRoCi0gICAgICogQHBhcmFtIGJhc2UgdGhlIGJhc2UgbG9jYXRpb24KLSAgICAgKiBAZXhjZXB0aW9uIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBpZiBhIHByb2JsZW0gb2NjdXJzIGNvbXB1dGluZyB0aGUgY2xhc3MgcGF0aAotICAgICAqLwotICAgIHByb3RlY3RlZCBVUkxbXSBnZXRCb290UGF0aChTdHJpbmcgYmFzZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgVVJMIHVybCA9IG51bGw7Ci0gICAgICAgIGlmIChiYXNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHVybCA9IGJ1aWxkVVJMKGJhc2UsIHRydWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gc2VhcmNoIGluIHRoZSByb290IGxvY2F0aW9uCi0gICAgICAgICAgICB1cmwgPSBnZXRJbnN0YWxsTG9jYXRpb24oKTsKLSAgICAgICAgICAgIFN0cmluZyBwYXRoID0gbmV3IEZpbGUodXJsLmdldEZpbGUoKSwgInBsdWdpbnMiKS50b1N0cmluZygpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBwYXRoID0gc2VhcmNoRm9yKGZyYW1ld29yaywgcGF0aCk7Ci0gICAgICAgICAgICBpZiAocGF0aCA9PSBudWxsKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDb3VsZCBub3QgZmluZCBmcmFtZXdvcmsiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgaWYgKHVybC5nZXRQcm90b2NvbCgpLmVxdWFscygiZmlsZSIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgdXJsID0gbmV3IEZpbGUocGF0aCkudG9VUkwoKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB1cmwgPSBuZXcgVVJMKHVybC5nZXRQcm90b2NvbCgpLCB1cmwuZ2V0SG9zdCgpLCB1cmwuZ2V0UG9ydCgpLCBwYXRoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoU3lzdGVtLmdldFByb3BlcnR5KFBST1BfRlJBTUVXT1JLKSA9PSBudWxsKQotICAgICAgICAgICAgU3lzdGVtLmdldFByb3BlcnRpZXMoKS5wdXQoUFJPUF9GUkFNRVdPUkssIHVybC50b0V4dGVybmFsRm9ybSgpKTsKLSAgICAgICAgaWYgKGRlYnVnKQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJGcmFtZXdvcmsgbG9jYXRlZDpcbiAgICAiICsgdXJsLnRvRXh0ZXJuYWxGb3JtKCkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIC8vIGFkZCBvbiBhbnkgZGV2IHBhdGggZWxlbWVudHMKLSAgICAgICAgVVJMW10gcmVzdWx0ID0gZ2V0RGV2UGF0aCh1cmwpOwotICAgICAgICBpZiAoZGVidWcpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRnJhbWV3b3JrIGNsYXNzcGF0aDoiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgICAgIiArIHJlc3VsdFtpXS50b0V4dGVybmFsRm9ybSgpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VhcmNoZXMgZm9yIHRoZSBnaXZlbiB0YXJnZXQgZGlyZWN0b3J5IHN0YXJ0aW5nIGluIHRoZSAicGx1Z2lucyIgc3ViZGlyZWN0b3J5Ci0gICAgICogb2YgdGhlIGdpdmVuIGxvY2F0aW9uLiAgSWYgb25lIGlzIGZvdW5kIHRoZW4gdGhpcyBsb2NhdGlvbiBpcyByZXR1cm5lZDsgCi0gICAgICogb3RoZXJ3aXNlIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24uCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbG9jYXRpb24gd2hlcmUgdGFyZ2V0IGRpcmVjdG9yeSB3YXMgZm91bmQKLSAgICAgKiBAcGFyYW0gc3RhcnQgdGhlIGxvY2F0aW9uIHRvIGJlZ2luIHNlYXJjaGluZwotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgc2VhcmNoRm9yKGZpbmFsIFN0cmluZyB0YXJnZXQsIFN0cmluZyBzdGFydCkgewotICAgIAkvLyBOb3RlIHRoYXQgRmlsZS5saXN0IG9ubHkgZ2l2ZXMgeW91IGZpbGUgbmFtZXMgbm90IHRoZSBjb21wbGV0ZSBwYXRoIGZyb20gc3RhcnQKLSAgICAgICAgU3RyaW5nW10gY2FuZGlkYXRlcyA9IG5ldyBGaWxlKHN0YXJ0KS5saXN0KCk7Ci0gICAgICAgIGlmIChjYW5kaWRhdGVzID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgCi0gICAgICAgIEFycmF5TGlzdCBtYXRjaGVzID0gbmV3IEFycmF5TGlzdCgyKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjYW5kaWRhdGVzLmxlbmd0aDsgaSsrKQotICAgICAgICAJaWYgKGNhbmRpZGF0ZXNbaV0uZXF1YWxzKHRhcmdldCkgfHwgY2FuZGlkYXRlc1tpXS5zdGFydHNXaXRoKHRhcmdldCArICJfIikpICAvLyROT04tTkxTLTEkCi0gICAgICAgIAkJbWF0Y2hlcy5hZGQoY2FuZGlkYXRlc1tpXSk7Ci0gICAgICAgIFN0cmluZ1tdIG5hbWVzID0gKFN0cmluZ1tdKSBtYXRjaGVzLnRvQXJyYXkobmV3IFN0cmluZ1ttYXRjaGVzLnNpemUoKV0pOwotICAgICAgICBpbnQgcmVzdWx0ID0gZmluZE1heChuYW1lcyk7Ci0gICAgICAgIGlmIChyZXN1bHQgPT0gLTEpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgRmlsZSBjYW5kaWRhdGUgPSBuZXcgRmlsZShzdGFydCwgbmFtZXNbcmVzdWx0XSk7Ci0gICAgICAgIHJldHVybiBjYW5kaWRhdGUuZ2V0QWJzb2x1dGVQYXRoKCkucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsICcvJykgKyAoY2FuZGlkYXRlLmlzRGlyZWN0b3J5KCkgPyAiLyIgOiAiIik7ICAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotICAgIH0KLQotICAgIHByb3RlY3RlZCBpbnQgZmluZE1heChTdHJpbmdbXSBjYW5kaWRhdGVzKSB7Ci0gICAgICAgIGludCByZXN1bHQgPSAtMTsKLSAgICAgICAgT2JqZWN0IG1heFZlcnNpb24gPSBudWxsOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNhbmRpZGF0ZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gY2FuZGlkYXRlc1tpXTsKLSAgICAgICAgICAgIFN0cmluZyB2ZXJzaW9uID0gIiI7IC8vJE5PTi1OTFMtMSQgLy8gTm90ZTogZGlyZWN0b3J5IHdpdGggdmVyc2lvbiBzdWZmaXggaXMgYWx3YXlzID4gdGhhbiBkaXJlY3Rvcnkgd2l0aG91dCB2ZXJzaW9uIHN1ZmZpeAotICAgICAgICAgICAgaW50IGluZGV4ID0gbmFtZS5pbmRleE9mKCdfJyk7Ci0gICAgICAgICAgICBpZiAoaW5kZXggIT0gLTEpCi0gICAgICAgICAgICAgICAgdmVyc2lvbiA9IG5hbWUuc3Vic3RyaW5nKGluZGV4ICsgMSk7Ci0gICAgICAgICAgICBPYmplY3QgY3VycmVudFZlcnNpb24gPSBnZXRWZXJzaW9uRWxlbWVudHModmVyc2lvbik7Ci0gICAgICAgICAgICBpZiAobWF4VmVyc2lvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gaTsKLSAgICAgICAgICAgICAgICBtYXhWZXJzaW9uID0gY3VycmVudFZlcnNpb247Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChjb21wYXJlVmVyc2lvbigoT2JqZWN0W10pIG1heFZlcnNpb24sIChPYmplY3RbXSkgY3VycmVudFZlcnNpb24pIDwgMCkgewotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBpOwotICAgICAgICAgICAgICAgICAgICBtYXhWZXJzaW9uID0gY3VycmVudFZlcnNpb247Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIC8qKgotICAgICAqIENvbXBhcmVzIHZlcnNpb24gc3RyaW5ncy4gCi0gICAgICogQHJldHVybiByZXN1bHQgb2YgY29tcGFyaXNvbiwgYXMgaW50ZWdlcjsKLSAgICAgKiA8Y29kZT48MDwvY29kZT4gaWYgbGVmdCA8IHJpZ2h0OwotICAgICAqIDxjb2RlPjA8L2NvZGU+IGlmIGxlZnQgPT0gcmlnaHQ7Ci0gICAgICogPGNvZGU+PjA8L2NvZGU+IGlmIGxlZnQgPiByaWdodDsKLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBjb21wYXJlVmVyc2lvbihPYmplY3RbXSBsZWZ0LCBPYmplY3RbXSByaWdodCkgewotCi0gICAgICAgIGludCByZXN1bHQgPSAoKEludGVnZXIpIGxlZnRbMF0pLmNvbXBhcmVUbygoSW50ZWdlcikgcmlnaHRbMF0pOyAvLyBjb21wYXJlIG1ham9yCi0gICAgICAgIGlmIChyZXN1bHQgIT0gMCkKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0KLSAgICAgICAgcmVzdWx0ID0gKChJbnRlZ2VyKSBsZWZ0WzFdKS5jb21wYXJlVG8oKEludGVnZXIpIHJpZ2h0WzFdKTsgLy8gY29tcGFyZSBtaW5vcgotICAgICAgICBpZiAocmVzdWx0ICE9IDApCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotCi0gICAgICAgIHJlc3VsdCA9ICgoSW50ZWdlcikgbGVmdFsyXSkuY29tcGFyZVRvKChJbnRlZ2VyKSByaWdodFsyXSk7IC8vIGNvbXBhcmUgc2VydmljZQotICAgICAgICBpZiAocmVzdWx0ICE9IDApCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotCi0gICAgICAgIHJldHVybiAoKFN0cmluZykgbGVmdFszXSkuY29tcGFyZVRvKChTdHJpbmcpIHJpZ2h0WzNdKTsgLy8gY29tcGFyZSBxdWFsaWZpZXIKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEbyBhIHF1aWNrIHBhcnNlIG9mIHZlcnNpb24gaWRlbnRpZmllciBzbyBpdHMgZWxlbWVudHMgY2FuIGJlIGNvcnJlY3RseSBjb21wYXJlZC4KLSAgICAgKiBJZiB3ZSBhcmUgdW5hYmxlIHRvIHBhcnNlIHRoZSBmdWxsIHZlcnNpb24sIHJlbWFpbmluZyBlbGVtZW50cyBhcmUgaW5pdGlhbGl6ZWQKLSAgICAgKiB3aXRoIHN1aXRhYmxlIGRlZmF1bHRzLgotICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2Ygc2l6ZSA0OyBmaXJzdCB0aHJlZSBlbGVtZW50cyBhcmUgb2YgdHlwZSBJbnRlZ2VyIChyZXByZXNlbnRpbmcKLSAgICAgKiBtYWpvciwgbWlub3IgYW5kIHNlcnZpY2UpIGFuZCB0aGUgZm91cnRoIGVsZW1lbnQgaXMgb2YgdHlwZSBTdHJpbmcgKHJlcHJlc2VudGluZwotICAgICAqIHF1YWxpZmllcikuIE5vdGUsIHRoYXQgcmV0dXJuaW5nIGFueXRoaW5nIGVsc2Ugd2lsbCBjYXVzZSBleGNlcHRpb25zIGluIHRoZSBjYWxsZXIuCi0gICAgICovCi0gICAgcHJpdmF0ZSBPYmplY3RbXSBnZXRWZXJzaW9uRWxlbWVudHMoU3RyaW5nIHZlcnNpb24pIHsKLSAgICAgICAgaWYgKHZlcnNpb24uZW5kc1dpdGgoIi5qYXIiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgdmVyc2lvbiA9IHZlcnNpb24uc3Vic3RyaW5nKDAsIHZlcnNpb24ubGVuZ3RoKCkgLSA0KTsKLSAgICAgICAgT2JqZWN0W10gcmVzdWx0ID0ge25ldyBJbnRlZ2VyKDApLCBuZXcgSW50ZWdlcigwKSwgbmV3IEludGVnZXIoMCksICIifTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBTdHJpbmdUb2tlbml6ZXIgdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodmVyc2lvbiwgIi4iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBTdHJpbmcgdG9rZW47Ci0gICAgICAgIGludCBpID0gMDsKLSAgICAgICAgd2hpbGUgKHQuaGFzTW9yZVRva2VucygpICYmIGkgPCA0KSB7Ci0gICAgICAgICAgICB0b2tlbiA9IHQubmV4dFRva2VuKCk7Ci0gICAgICAgICAgICBpZiAoaSA8IDMpIHsKLSAgICAgICAgICAgICAgICAvLyBtYWpvciwgbWlub3Igb3Igc2VydmljZSAuLi4gbnVtZXJpYyB2YWx1ZXMKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICByZXN1bHRbaSsrXSA9IG5ldyBJbnRlZ2VyKHRva2VuKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAvLyBpbnZhbGlkIG51bWJlciBmb3JtYXQgLSB1c2UgZGVmYXVsdCBudW1iZXJzICgwKSBmb3IgdGhlIHJlc3QKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBxdWFsaWZpZXIgLi4uIHN0cmluZyB2YWx1ZQotICAgICAgICAgICAgICAgIHJlc3VsdFtpKytdID0gdG9rZW47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBVUkwgYnVpbGRVUkwoU3RyaW5nIHNwZWMsIGJvb2xlYW4gdHJhaWxpbmdTbGFzaCkgewotICAgICAgICBpZiAoc3BlYyA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIGJvb2xlYW4gaXNGaWxlID0gc3BlYy5zdGFydHNXaXRoKEZJTEVfU0NIRU1FKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChpc0ZpbGUpIHsKLSAgICAgICAgICAgICAgICBGaWxlIHRvQWRqdXN0ID0gbmV3IEZpbGUoc3BlYy5zdWJzdHJpbmcoNSkpOwotICAgICAgICAgICAgICAgIGlmICh0b0FkanVzdC5pc0RpcmVjdG9yeSgpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWRqdXN0VHJhaWxpbmdTbGFzaCh0b0FkanVzdC50b1VSTCgpLCB0cmFpbGluZ1NsYXNoKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0b0FkanVzdC50b1VSTCgpOwotICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBVUkwoc3BlYyk7Ci0gICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBpZiB3ZSBmYWlsZWQgYW5kIGl0IGlzIGEgZmlsZSBzcGVjLCB0aGVyZSBpcyBub3RoaW5nIG1vcmUgd2UgY2FuIGRvCi0gICAgICAgICAgICAvLyBvdGhlcndpc2UsIHRyeSB0byBtYWtlIHRoZSBzcGVjIGludG8gYSBmaWxlIFVSTC4KLSAgICAgICAgICAgIGlmIChpc0ZpbGUpCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIEZpbGUgdG9BZGp1c3QgPSBuZXcgRmlsZShzcGVjKTsKLSAgICAgICAgICAgICAgICBpZiAodG9BZGp1c3QuaXNEaXJlY3RvcnkoKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFkanVzdFRyYWlsaW5nU2xhc2godG9BZGp1c3QudG9VUkwoKSwgdHJhaWxpbmdTbGFzaCk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9BZGp1c3QudG9VUkwoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlMSkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgVVJMIGFkanVzdFRyYWlsaW5nU2xhc2goVVJMIHVybCwgYm9vbGVhbiB0cmFpbGluZ1NsYXNoKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGZpbGUgPSB1cmwuZ2V0RmlsZSgpOwotICAgICAgICBpZiAodHJhaWxpbmdTbGFzaCA9PSAoZmlsZS5lbmRzV2l0aCgiLyIpKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgcmV0dXJuIHVybDsKLSAgICAgICAgZmlsZSA9IHRyYWlsaW5nU2xhc2ggPyBmaWxlICsgIi8iIDogZmlsZS5zdWJzdHJpbmcoMCwgZmlsZS5sZW5ndGgoKSAtIDEpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybiBuZXcgVVJMKHVybC5nZXRQcm90b2NvbCgpLCB1cmwuZ2V0SG9zdCgpLCBmaWxlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFVSTCBidWlsZExvY2F0aW9uKFN0cmluZyBwcm9wZXJ0eSwgVVJMIGRlZmF1bHRMb2NhdGlvbiwgU3RyaW5nIHVzZXJEZWZhdWx0QXBwZW5kYWdlKSB7Ci0gICAgICAgIFVSTCByZXN1bHQgPSBudWxsOwotICAgICAgICBTdHJpbmcgbG9jYXRpb24gPSBTeXN0ZW0uZ2V0UHJvcGVydHkocHJvcGVydHkpOwotICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydGllcygpLnJlbW92ZShwcm9wZXJ0eSk7Ci0gICAgICAgIC8vIGlmIHRoZSBpbnN0YW5jZSBsb2NhdGlvbiBpcyBub3Qgc2V0LCBwcmVkaWN0IHdoZXJlIHRoZSB3b3Jrc3BhY2Ugd2lsbCBiZSBhbmQgCi0gICAgICAgIC8vIHB1dCB0aGUgaW5zdGFuY2UgYXJlYSBpbnNpZGUgdGhlIHdvcmtzcGFjZSBtZXRhIGFyZWEuCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAobG9jYXRpb24gPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBkZWZhdWx0TG9jYXRpb247Ci0gICAgICAgICAgICBlbHNlIGlmIChsb2NhdGlvbi5lcXVhbHNJZ25vcmVDYXNlKE5PTkUpKQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgZWxzZSBpZiAobG9jYXRpb24uZXF1YWxzSWdub3JlQ2FzZShOT19ERUZBVUxUKSkKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBidWlsZFVSTChsb2NhdGlvbiwgdHJ1ZSk7Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAobG9jYXRpb24uc3RhcnRzV2l0aChVU0VSX0hPTUUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBiYXNlID0gc3Vic3RpdHV0ZVZhcihsb2NhdGlvbiwgVVNFUl9IT01FLCBQUk9QX1VTRVJfSE9NRSk7Ci0gICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uID0gbmV3IEZpbGUoYmFzZSwgdXNlckRlZmF1bHRBcHBlbmRhZ2UpLmdldEFic29sdXRlUGF0aCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobG9jYXRpb24uc3RhcnRzV2l0aChVU0VSX0RJUikpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGJhc2UgPSBzdWJzdGl0dXRlVmFyKGxvY2F0aW9uLCBVU0VSX0RJUiwgUFJPUF9VU0VSX0RJUik7Ci0gICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uID0gbmV3IEZpbGUoYmFzZSwgdXNlckRlZmF1bHRBcHBlbmRhZ2UpLmdldEFic29sdXRlUGF0aCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXN1bHQgPSBidWlsZFVSTChsb2NhdGlvbiwgdHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgU3lzdGVtLmdldFByb3BlcnRpZXMoKS5wdXQocHJvcGVydHksIHJlc3VsdC50b0V4dGVybmFsRm9ybSgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIHN1YnN0aXR1dGVWYXIoU3RyaW5nIHNvdXJjZSwgU3RyaW5nIHZhciwgU3RyaW5nIHByb3ApIHsKLSAgICAgICAgU3RyaW5nIHZhbHVlID0gU3lzdGVtLmdldFByb3BlcnR5KHByb3AsICIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm4gdmFsdWUgKyBzb3VyY2Uuc3Vic3RyaW5nKHZhci5sZW5ndGgoKSk7Ci0gICAgfQotCi0gICAgLyoqIAotICAgICAqIFJldHVucyB0aGUgZGVmYXVsdCBmaWxlIHN5c3RlbSBwYXRoIGZvciB0aGUgY29uZmlndXJhdGlvbiBsb2NhdGlvbi4KLSAgICAgKiBCeSBkZWZhdWx0IHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGlzIGluIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0b3J5Ci0gICAgICogaWYgdGhpcyBpcyB3cml0ZWFibGUuICBPdGhlcndpc2UgaXQgaXMgbG9jYXRlZCBzb21ld2hlcmUgaW4gdGhlIHVzZXIuaG9tZQotICAgICAqIGFyZWEgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgcHJvZHVjdC4gCi0gICAgICogQHJldHVybiB0aGUgZGVmYXVsdCBmaWxlIHN5c3RlbSBwYXRoIGZvciB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGNvbXB1dGVEZWZhdWx0Q29uZmlndXJhdGlvbkxvY2F0aW9uKCkgewotICAgICAgICAvLyAxKSBXZSBzdG9yZSB0aGUgY29uZmlnIHN0YXRlIHJlbGF0aXZlIHRvIHRoZSAnZWNsaXBzZScgZGlyZWN0b3J5IGlmIHBvc3NpYmxlCi0gICAgICAgIC8vIDIpIElmIHRoaXMgZGlyZWN0b3J5IGlzIHJlYWQtb25seSAKLSAgICAgICAgLy8gICAgd2Ugc3RvcmUgdGhlIHN0YXRlIGluIDx1c2VyLmhvbWU+Ly5lY2xpcHNlLzxhcHBsaWNhdGlvbi1pZD5fPHZlcnNpb24+IHdoZXJlIDx1c2VyLmhvbWU+IAotICAgICAgICAvLyAgICBpcyB1bmlxdWUgZm9yIGVhY2ggbG9jYWwgdXNlciwgYW5kIDxhcHBsaWNhdGlvbi1pZD4gaXMgdGhlIG9uZSAKLSAgICAgICAgLy8gICAgZGVmaW5lZCBpbiAuZWNsaXBzZXByb2R1Y3QgbWFya2VyIGZpbGUuIElmIC5lY2xpcHNlcHJvZHVjdCBkb2VzIG5vdAotICAgICAgICAvLyAgICBleGlzdCwgdXNlICJlY2xpcHNlIiBhcyB0aGUgYXBwbGljYXRpb24taWQuCi0KLSAgICAgICAgVVJMIGluc3RhbGwgPSBnZXRJbnN0YWxsTG9jYXRpb24oKTsKLSAgICAgICAgLy8gVE9ETyBhIGxpdHRsZSBkYW5nZXJvdXMgaGVyZS4gIEJhc2ljYWxseSB3ZSBoYXZlIHRvIGFzc3VtZSB0aGF0IGl0IGlzIGEgZmlsZSBVUkwuCi0gICAgICAgIGlmIChpbnN0YWxsLmdldFByb3RvY29sKCkuZXF1YWxzKCJmaWxlIikpIHsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgRmlsZSBpbnN0YWxsRGlyID0gbmV3IEZpbGUoaW5zdGFsbC5nZXRGaWxlKCkpOwotICAgICAgICAgICAgaWYgKGNhbldyaXRlKGluc3RhbGxEaXIpKQotICAgICAgICAgICAgICAgIHJldHVybiBpbnN0YWxsRGlyLmdldEFic29sdXRlUGF0aCgpICsgRmlsZS5zZXBhcmF0b3IgKyBDT05GSUdfRElSOwotICAgICAgICB9Ci0gICAgICAgIC8vIFdlIGNhbid0IHdyaXRlIGluIHRoZSBlY2xpcHNlIGluc3RhbGwgZGlyIHNvIHRyeSBmb3Igc29tZSBwbGFjZSBpbiB0aGUgdXNlcidzIGhvbWUgZGlyCi0gICAgICAgIHJldHVybiBjb21wdXRlRGVmYXVsdFVzZXJBcmVhTG9jYXRpb24oQ09ORklHX0RJUik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjYW5Xcml0ZShGaWxlIGluc3RhbGxEaXIpIHsKLSAgICAgICAgaWYgKGluc3RhbGxEaXIuY2FuV3JpdGUoKSA9PSBmYWxzZSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBpZiAoIWluc3RhbGxEaXIuaXNEaXJlY3RvcnkoKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBGaWxlIGZpbGVUZXN0ID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZpbGVUZXN0ID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgid3JpdHRhYmxlQXJlYSIsIG51bGwsIGluc3RhbGxEaXIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vSWYgYW4gZXhjZXB0aW9uIG9jY3VyZWQgd2hpbGUgdHJ5aW5nIHRvIGNyZWF0ZSB0aGUgZmlsZSwgaXQgbWVhbnMgdGhhdCBpdCBpcyBub3Qgd3JpdHRhYmxlCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoZmlsZVRlc3QgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBmaWxlVGVzdC5kZWxldGUoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGZpbGVzIHN5c3RlbSBwYXRoIGZvciBhbiBhcmVhIGluIHRoZSB1c2VyLmhvbWUgcmVnaW9uIHJlbGF0ZWQgdG8gdGhlCi0gICAgICogY3VycmVudCBwcm9kdWN0LiAgVGhlIGdpdmVuIGFwcGVuZGFnZSBpcyBhZGRlZCB0byB0aGlzIGJhc2UgbG9jYXRpb24KLSAgICAgKiBAcGFyYW0gcGF0aEFwcGVuZGFnZSB0aGUgcGF0aCBzZWdtZW50cyB0byBhZGQgdG8gY29tcHV0ZWQgYmFzZQotICAgICAqIEByZXR1cm4gYSBmaWxlIHN5c3RlbSBsb2NhdGlvbiBpbiB0aGUgdXNlci5ob21lIGFyZWEgcmVsYXRlZCB0aGUgdGhlIGN1cnJlbnQKLSAgICAgKiAgIHByb2R1Y3QgYW5kIHRoZSBnaXZlbiBhcHBlbmRhZ2UKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBjb21wdXRlRGVmYXVsdFVzZXJBcmVhTG9jYXRpb24oU3RyaW5nIHBhdGhBcHBlbmRhZ2UpIHsKLSAgICAgICAgLy8gICAgd2Ugc3RvcmUgdGhlIHN0YXRlIGluIDx1c2VyLmhvbWU+Ly5lY2xpcHNlLzxhcHBsaWNhdGlvbi1pZD5fPHZlcnNpb24+IHdoZXJlIDx1c2VyLmhvbWU+IAotICAgICAgICAvLyAgICBpcyB1bmlxdWUgZm9yIGVhY2ggbG9jYWwgdXNlciwgYW5kIDxhcHBsaWNhdGlvbi1pZD4gaXMgdGhlIG9uZSAKLSAgICAgICAgLy8gICAgZGVmaW5lZCBpbiAuZWNsaXBzZXByb2R1Y3QgbWFya2VyIGZpbGUuIElmIC5lY2xpcHNlcHJvZHVjdCBkb2VzIG5vdAotICAgICAgICAvLyAgICBleGlzdCwgdXNlICJlY2xpcHNlIiBhcyB0aGUgYXBwbGljYXRpb24taWQuCi0gICAgICAgIFVSTCBpbnN0YWxsVVJMID0gZ2V0SW5zdGFsbExvY2F0aW9uKCk7Ci0gICAgICAgIGlmIChpbnN0YWxsVVJMID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgRmlsZSBpbnN0YWxsRGlyID0gbmV3IEZpbGUoaW5zdGFsbFVSTC5nZXRGaWxlKCkpOwotICAgICAgICBTdHJpbmcgYXBwTmFtZSA9ICIuIiArIEVDTElQU0U7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgRmlsZSBlY2xpcHNlUHJvZHVjdCA9IG5ldyBGaWxlKGluc3RhbGxEaXIsIFBST0RVQ1RfU0lURV9NQVJLRVIpOwotICAgICAgICBpZiAoZWNsaXBzZVByb2R1Y3QuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIFByb3BlcnRpZXMgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBwcm9wcy5sb2FkKG5ldyBGaWxlSW5wdXRTdHJlYW0oZWNsaXBzZVByb2R1Y3QpKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgYXBwSWQgPSBwcm9wcy5nZXRQcm9wZXJ0eShQUk9EVUNUX1NJVEVfSUQpOwotICAgICAgICAgICAgICAgIGlmIChhcHBJZCA9PSBudWxsIHx8IGFwcElkLnRyaW0oKS5sZW5ndGgoKSA9PSAwKQotICAgICAgICAgICAgICAgICAgICBhcHBJZCA9IEVDTElQU0U7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGFwcFZlcnNpb24gPSBwcm9wcy5nZXRQcm9wZXJ0eShQUk9EVUNUX1NJVEVfVkVSU0lPTik7Ci0gICAgICAgICAgICAgICAgaWYgKGFwcFZlcnNpb24gPT0gbnVsbCB8fCBhcHBWZXJzaW9uLnRyaW0oKS5sZW5ndGgoKSA9PSAwKQotICAgICAgICAgICAgICAgICAgICBhcHBWZXJzaW9uID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBhcHBOYW1lICs9IEZpbGUuc2VwYXJhdG9yICsgYXBwSWQgKyAiXyIgKyBhcHBWZXJzaW9uOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gRG8gbm90aGluZyBpZiB3ZSBnZXQgYW4gZXhjZXB0aW9uLiAgV2Ugd2lsbCBkZWZhdWx0IHRvIGEgc3RhbmRhcmQgbG9jYXRpb24gCi0gICAgICAgICAgICAgICAgLy8gaW4gdGhlIHVzZXIncyBob21lIGRpci4KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgdXNlckhvbWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoUFJPUF9VU0VSX0hPTUUpOwotICAgICAgICByZXR1cm4gbmV3IEZpbGUodXNlckhvbWUsIGFwcE5hbWUgKyAiLyIgKyBwYXRoQXBwZW5kYWdlKS5nZXRBYnNvbHV0ZVBhdGgoKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJ1bnMgdGhpcyBsYXVuY2hlciB3aXRoIHRoZSBhcmd1bWVudHMgc3BlY2lmaWVkIGluIHRoZSBnaXZlbiBzdHJpbmcuCi0gICAgICogCi0gICAgICogQHBhcmFtIGFyZ1N0cmluZyB0aGUgYXJndW1lbnRzIHN0cmluZwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmdTdHJpbmcpIHsKLSAgICAgICAgVmVjdG9yIGxpc3QgPSBuZXcgVmVjdG9yKDUpOwotICAgICAgICBmb3IgKFN0cmluZ1Rva2VuaXplciB0b2tlbnMgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGFyZ1N0cmluZywgIiAiKTsgdG9rZW5zLmhhc01vcmVFbGVtZW50cygpOykgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgbGlzdC5hZGRFbGVtZW50KHRva2Vucy5uZXh0RWxlbWVudCgpKTsKLSAgICAgICAgbWFpbigoU3RyaW5nW10pIGxpc3QudG9BcnJheShuZXcgU3RyaW5nW2xpc3Quc2l6ZSgpXSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJ1bnMgdGhlIHBsYXRmb3JtIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50cy4gIFRoZSBhcmd1bWVudHMgbXVzdCBpZGVudGlmeQotICAgICAqIGFuIGFwcGxpY2F0aW9uIHRvIHJ1biAoZS5nLiwgPGNvZGU+LWFwcGxpY2F0aW9uIGNvbS5leGFtcGxlLmFwcGxpY2F0aW9uPC9jb2RlPikuCi0gICAgICogQWZ0ZXIgcnVubmluZyB0aGUgYXBwbGljYXRpb24gPGNvZGU+U3lzdGVtLmV4aXQoTik8L2NvZGU+IGlzIGV4ZWN1dGVkLgotICAgICAqIFRoZSB2YWx1ZSBvZiBOIGlzIGRlcml2ZWQgZnJvbSB0aGUgdmFsdWUgcmV0dXJuZWQgZnJvbSBydW5uaW5nIHRoZSBhcHBsaWNhdGlvbi4KLSAgICAgKiBJZiB0aGUgYXBwbGljYXRpb24ncyByZXR1cm4gdmFsdWUgaXMgYW4gPGNvZGU+SW50ZWdlcjwvY29kZT4sIE4gaXMgdGhpcyB2YWx1ZS4KLSAgICAgKiBJbiBhbGwgb3RoZXIgY2FzZXMsIE4gPSAwLgotICAgICAqIDxwPgotICAgICAqIENsaWVudHMgd2lzaGluZyB0byBydW4gdGhlIHBsYXRmb3JtIHdpdGhvdXQgYSBmb2xsb3dpbmcgPGNvZGU+U3lzdGVtLmV4aXQ8L2NvZGU+Ci0gICAgICogY2FsbCBzaG91bGQgdXNlIDxjb2RlPnJ1bigpPC9jb2RlPi4KLSAgICAgKiA8L3A+Ci0gICAgICogCi0gICAgICogQHBhcmFtIGFyZ3MgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMKLSAgICAgKiBAc2VlICNydW4oU3RyaW5nW10pCi0gICAgICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlpbnQgcmVzdWx0ID0gMDsKLQkJdHJ5IHsKLQkJCXJlc3VsdCA9IG5ldyBNYWluKCkucnVuKGFyZ3MpOwotCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJLy8gVGhpcyBpcyAqcmVhbGx5KiB1bmxpa2VseSB0byBoYXBwZW4gLSBydW4oKSB0YWtlcyBjYXJlIG9mIGV4Y2VwdGlvbmFsIHNpdHVhdGlvbnMuCi0JCQkvLyBJbiBjYXNlIHNvbWV0aGluZyB3ZWlyZCBoYXBwZW5zLCBqdXN0IGR1bXAgc3RhY2sgLSBsb2dnaW5nIGlzIG5vdCBhdmFpbGFibGUgYXQgdGhpcyBwb2ludAotCQkJdC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmICghQm9vbGVhbi5nZXRCb29sZWFuKFBST1BfTk9TSFVURE9XTikpCi0JCQkvLyBtYWtlIHN1cmUgd2UgYWx3YXlzIHRlcm1pbmF0ZSB0aGUgVk0KLQkJCQlTeXN0ZW0uZXhpdChyZXN1bHQpOwotCQl9Ci0JfQotCi0KLSAgICAvKioKLSAgICAgKiBSdW5zIHRoZSBwbGF0Zm9ybSB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMuICBUaGUgYXJndW1lbnRzIG11c3QgaWRlbnRpZnkKLSAgICAgKiBhbiBhcHBsaWNhdGlvbiB0byBydW4gKGUuZy4sIDxjb2RlPi1hcHBsaWNhdGlvbiBjb20uZXhhbXBsZS5hcHBsaWNhdGlvbjwvY29kZT4pLgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIHJldHVybmVkIGZyb20gcnVubmluZyB0aGUgYXBwbGljYXRpb24uCi0gICAgICogSWYgdGhlIGFwcGxpY2F0aW9uJ3MgcmV0dXJuIHZhbHVlIGlzIGFuIDxjb2RlPkludGVnZXI8L2NvZGU+LCBOIGlzIHRoaXMgdmFsdWUuCi0gICAgICogSW4gYWxsIG90aGVyIGNhc2VzLCBOID0gMC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhcmdzIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzCi0gICAgICovCi0gICAgcHVibGljIGludCBydW4oU3RyaW5nW10gYXJncykgewotICAgICAgICBpbnQgcmVzdWx0ID0gMDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJhc2ljUnVuKGFyZ3MpOwotICAgICAgICAgICAgU3RyaW5nIGV4aXRDb2RlID0gU3lzdGVtLmdldFByb3BlcnR5KFBST1BfRVhJVENPREUpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBleGl0Q29kZSA9PSBudWxsID8gMCA6IEludGVnZXIucGFyc2VJbnQoZXhpdENvZGUpOwotICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSAxNzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLSAgICAgICAgICAgIC8vIG9ubHkgbG9nIHRoZSBleGNlcHRpb25zIGlmIHRoZXkgaGF2ZSBub3QgYmVlbiBjYXVnaHQgYnkgdGhlIAotICAgICAgICAgICAgLy8gRWNsaXBzZVN0YXJ0ZXIgKGkuZS4sIGlmIHRoZSBleGl0Q29kZSBpcyBub3QgMTMpIAotICAgICAgICAgICAgaWYgKCEiMTMiLmVxdWFscyhTeXN0ZW0uZ2V0UHJvcGVydHkoUFJPUF9FWElUQ09ERSkpKSB7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBsb2coIkV4Y2VwdGlvbiBsYXVuY2hpbmcgdGhlIEVjbGlwc2UgUGxhdGZvcm06Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBsb2coZSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAiQW4gZXJyb3IgaGFzIG9jY3VycmVkIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIGlmIChsb2dGaWxlID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgKz0gIiBhbmQgY291bGQgbm90IGJlIGxvZ2dlZDogXG4iICsgZS5nZXRNZXNzYWdlKCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgKz0gIi4gIFNlZSB0aGUgbG9nIGZpbGVcbiIgKyBsb2dGaWxlLmdldEFic29sdXRlUGF0aCgpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgU3lzdGVtLmdldFByb3BlcnRpZXMoKS5wdXQoUFJPUF9FWElUREFUQSwgbWVzc2FnZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBSZXR1cm4gInVubHVja3kiIDEzIGFzIHRoZSBleGl0IGNvZGUuIFRoZSBleGVjdXRhYmxlIHdpbGwgcmVjb2duaXplCi0gICAgICAgICAgICAvLyB0aGlzIGNvbnN0YW50IGFuZCBkaXNwbGF5IGEgbWVzc2FnZSB0byB0aGUgdXNlciB0ZWxsaW5nIHRoZW0gdGhhdAotICAgICAgICAgICAgLy8gdGhlcmUgaXMgaW5mb3JtYXRpb24gaW4gdGhlaXIgbG9nIGZpbGUuCi0gICAgICAgICAgICByZXN1bHQgPSAxMzsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIC8vIGFsd2F5cyB0cnkgcHV0dGluZyBkb3duIHRoZSBzcGxhc2ggc2NyZWVuIGp1c3QgaW4gY2FzZSB0aGUgYXBwbGljYXRpb24gZmFpbGVkIHRvIGRvIHNvCi0gICAgICAgICAgICB0YWtlRG93blNwbGFzaCgpOyAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgLy8gUmV0dXJuIGFuIGludCBleGl0IGNvZGUgYW5kIGVuc3VyZSB0aGUgc3lzdGVtIHByb3BlcnR5IGlzIHNldC4KLSAgICAgICAgU3lzdGVtLmdldFByb3BlcnRpZXMoKS5wdXQoUFJPUF9FWElUQ09ERSwgSW50ZWdlci50b1N0cmluZyhyZXN1bHQpKTsKLSAgICAgICAgc2V0RXhpdERhdGEoKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2V0RXhpdERhdGEoKSB7Ci0gICAgICAgIFN0cmluZyBkYXRhID0gU3lzdGVtLmdldFByb3BlcnR5KFBST1BfRVhJVERBVEEpOwotICAgICAgICBpZiAoZXhpdERhdGEgPT0gbnVsbCB8fCBkYXRhID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIC8vIHN5bmMgY2FsbCB0byB0aGUgbGF1bmNoZXIKLSAgICAgICAgcnVuQ29tbWFuZCh0cnVlLCBuZXcgU3RyaW5nW10ge0VYSVREQVRBLCBleGl0RGF0YSwgZGF0YX0pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByb2Nlc3NlcyB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4gIFRoZSBnZW5lcmFsIHByaW5jaXBsZSBpcyB0byBOT1QKLSAgICAgKiBjb25zdW1lIHRoZSBhcmd1bWVudHMgYW5kIGxlYXZlIHRoZW0gdG8gYmUgcHJvY2Vzc2VkIGJ5IEVjbGlwc2UgcHJvcGVyLgotICAgICAqIFRoZXJlIGFyZSBhIGZldyBhcmdzIHdoaWNoIGFyZSBkaXJlY3RlZCB0b3dhcmRzIG1haW4oKSBhbmQgYSBmZXcgb3RoZXJzCi0gICAgICogd2hpY2ggd2UgbmVlZCB0byBrbm93IGFib3V0LiBWZXJ5IGZldyBzaG91bGQgYWN0dWFsbHkgYmUgY29uc3VtZWQgaGVyZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBhcmd1bWVudHMgdG8gcGFzcyB0aHJvdWdoIHRvIHRoZSBsYXVuY2hlZCBhcHBsaWNhdGlvbgotICAgICAqIEBwYXJhbSBhcmdzIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZ1tdIHByb2Nlc3NDb21tYW5kTGluZShTdHJpbmdbXSBhcmdzKSB7Ci0gICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIGFyZ3M7Ci0gICAgICAgIGludFtdIGNvbmZpZ0FyZ3MgPSBuZXcgaW50W2FyZ3MubGVuZ3RoXTsKLSAgICAgICAgY29uZmlnQXJnc1swXSA9IC0xOyAvLyBuZWVkIHRvIGluaXRpYWxpemUgdGhlIGZpcnN0IGVsZW1lbnQgdG8gc29tZXRoaW5nIHRoYXQgY291bGQgbm90IGJlIGFuIGluZGV4LgotICAgICAgICBpbnQgY29uZmlnQXJnSW5kZXggPSAwOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLSAgICAgICAgICAgIC8vIGNoZWNrIGZvciBhcmdzIHdpdGhvdXQgcGFyYW1ldGVycyAoaS5lLiwgYSBmbGFnIGFyZykKLSAgICAgICAgICAgIC8vIGNoZWNrIGlmIGRlYnVnIHNob3VsZCBiZSBlbmFibGVkIGZvciB0aGUgZW50aXJlIHBsYXRmb3JtCi0gICAgICAgICAgICBpZiAoYXJnc1tpXS5lcXVhbHNJZ25vcmVDYXNlKERFQlVHKSkgewotICAgICAgICAgICAgICAgIGRlYnVnID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAvLyBwYXNzZWQgdGhydSB0aGlzIGFyZyAoaS5lLiwgZG8gbm90IHNldCBmb3VuZCA9IHRydWUpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGxvb2sgZm9yIGFuZCBjb25zdW1lIHRoZSBub3NwbGFzaCBkaXJlY3RpdmUuICBUaGlzIHN1cGVyY2VkZXMgYW55Ci0gICAgICAgICAgICAvLyAtc2hvd3NwbGFzaCBjb21tYW5kIHRoYXQgbWlnaHQgYmUgcHJlc2VudC4KLSAgICAgICAgICAgIGlmIChhcmdzW2ldLmVxdWFsc0lnbm9yZUNhc2UoTk9TUExBU0gpKSB7Ci0gICAgICAgICAgICAgICAgc3BsYXNoRG93biA9IHRydWU7Ci0gICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoYXJnc1tpXS5lcXVhbHNJZ25vcmVDYXNlKE5PRVhJVCkpIHsKLSAgICAgICAgICAgIAlTeXN0ZW0uZ2V0UHJvcGVydGllcygpLnB1dChQUk9QX05PU0hVVERPV04sICJ0cnVlIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIAlmb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoaXMgaXMgaW5pdGlhbGl6YXRpb24gcGFzcwotICAgICAgICAgICAgaWYgKGFyZ3NbaV0uZXF1YWxzSWdub3JlQ2FzZShJTklUSUFMSVpFKSkgewotICAgICAgICAgICAgICAgIGluaXRpYWxpemUgPSB0cnVlOwotICAgICAgICAgICAgICAgIC8vIHBhc3NlZCB0aHJ1IHRoaXMgYXJnIChpLmUuLCBkbyBub3Qgc2V0IGZvdW5kID0gdHJ1ZSkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gY2hlY2sgaWYgZGV2ZWxvcG1lbnQgbW9kZSBzaG91bGQgYmUgZW5hYmxlZCBmb3IgdGhlIGVudGlyZSBwbGF0Zm9ybQotICAgICAgICAgICAgLy8gSWYgdGhpcyBpcyB0aGUgbGFzdCBhcmcgb3IgdGhlcmUgaXMgYSBmb2xsb3dpbmcgYXJnIChpLmUuLCBhcmcrMSBoYXMgYSBsZWFkaW5nIC0pLCAKLSAgICAgICAgICAgIC8vIHNpbXBseSBlbmFibGUgZGV2ZWxvcG1lbnQgbW9kZS4gIE90aGVyd2lzZSwgYXNzdW1lIHRoYXQgdGhhdCB0aGUgZm9sbG93aW5nIGFyZyBpcwotICAgICAgICAgICAgLy8gYWN0dWFsbHkgc29tZSBhZGRpdGlvbmFsIGRldmVsb3BtZW50IHRpbWUgY2xhc3MgcGF0aCBlbnRyaWVzLiAgVGhpcyB3aWxsIGJlIHByb2Nlc3NlZCBiZWxvdy4KLSAgICAgICAgICAgIGlmIChhcmdzW2ldLmVxdWFsc0lnbm9yZUNhc2UoREVWKSAmJiAoKGkgKyAxID09IGFyZ3MubGVuZ3RoKSB8fCAoKGkgKyAxIDwgYXJncy5sZW5ndGgpICYmIChhcmdzW2kgKyAxXS5zdGFydHNXaXRoKCItIikpKSkpIHsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIGluRGV2ZWxvcG1lbnRNb2RlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAvLyBkbyBub3QgbWFyayB0aGUgYXJnIGFzIGZvdW5kIHNvIGl0IHdpbGwgYmUgcGFzc2VkIHRocm91Z2gKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gZG9uZSBjaGVja2luZyBmb3IgYXJncy4gIFJlbWVtYmVyIHdoZXJlIGFuIGFyZyB3YXMgZm91bmQgCi0gICAgICAgICAgICBpZiAoZm91bmQpIHsKLSAgICAgICAgICAgICAgICBjb25maWdBcmdzW2NvbmZpZ0FyZ0luZGV4KytdID0gaTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gbG9vayBmb3IgdGhlIFZNIGFyZ3MgYXJnLiAgV2UgaGF2ZSB0byBkbyB0aGF0IGJlZm9yZSBsb29raW5nIHRvIHNlZQotICAgICAgICAgICAgLy8gaWYgdGhlIG5leHQgZWxlbWVudCBpcyBhIC1hcmcgYXMgdGhlIHRoaW5nIGZvbGxvd2luZyAtdm1hcmdzIG1heSBpbgotICAgICAgICAgICAgLy8gZmFjdCBiZSBhbm90aGVyIC1hcmcuCi0gICAgICAgICAgICBpZiAoYXJnc1tpXS5lcXVhbHNJZ25vcmVDYXNlKFZNQVJHUykpIHsKLSAgICAgICAgICAgICAgICAvLyBjb25zdW1lIHRoZSAtdm1hcmdzIGFyZyBpdHNlbGYKLSAgICAgICAgICAgICAgICBhcmdzW2ldID0gbnVsbDsKLSAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgICAgdm1hcmdzID0gbmV3IFN0cmluZ1thcmdzLmxlbmd0aCAtIGldOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICB2bWFyZ3NbaisrXSA9IGFyZ3NbaV07Ci0gICAgICAgICAgICAgICAgICAgIGFyZ3NbaV0gPSBudWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gY2hlY2sgZm9yIGFyZ3Mgd2l0aCBwYXJhbWV0ZXJzLiBJZiB3ZSBhcmUgYXQgdGhlIGxhc3QgYXJndW1lbnQgb3IgaWYgdGhlIG5leHQgb25lCi0gICAgICAgICAgICAvLyBoYXMgYSAnLScgYXMgdGhlIGZpcnN0IGNoYXJhY3RlciwgdGhlbiB3ZSBjYW4ndCBoYXZlIGFuIGFyZyB3aXRoIGEgcGFybSBzbyBjb250aW51ZS4KLSAgICAgICAgICAgIGlmIChpID09IGFyZ3MubGVuZ3RoIC0gMSB8fCBhcmdzW2kgKyAxXS5zdGFydHNXaXRoKCItIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIFN0cmluZyBhcmcgPSBhcmdzWysraV07Ci0KLSAgICAgICAgICAgIC8vIGxvb2sgZm9yIHRoZSBkZXZlbG9wbWVudCBtb2RlIGFuZCBjbGFzcyBwYXRoIGVudHJpZXMuICAKLSAgICAgICAgICAgIGlmIChhcmdzW2kgLSAxXS5lcXVhbHNJZ25vcmVDYXNlKERFVikpIHsKLSAgICAgICAgICAgICAgICBpbkRldmVsb3BtZW50TW9kZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgZGV2Q2xhc3NQYXRoUHJvcHMgPSBwcm9jZXNzRGV2QXJnKGFyZyk7Ci0gICAgICAgICAgICAgICAgaWYgKGRldkNsYXNzUGF0aFByb3BzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAJZGV2Q2xhc3NQYXRoID0gZGV2Q2xhc3NQYXRoUHJvcHMuZ2V0UHJvcGVydHkoT1NHSSk7Ci0gICAgICAgICAgICAgICAgCWlmIChkZXZDbGFzc1BhdGggPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAJCWRldkNsYXNzUGF0aCA9IGRldkNsYXNzUGF0aFByb3BzLmdldFByb3BlcnR5KCIqIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGxvb2sgZm9yIHRoZSBmcmFtZXdvcmsgdG8gcnVuCi0gICAgICAgICAgICBpZiAoYXJnc1tpIC0gMV0uZXF1YWxzSWdub3JlQ2FzZShGUkFNRVdPUkspKSB7Ci0gICAgICAgICAgICAgICAgZnJhbWV3b3JrID0gYXJnOwotICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gbG9vayBmb3IgZXhwbGljaXRseSBzZXQgaW5zdGFsbCByb290Ci0gICAgICAgICAgICAvLyBDb25zdW1lIHRoZSBhcmcgaGVyZSB0byBlbnN1cmUgdGhhdCB0aGUgbGF1bmNoZXIgYW5kIEVjbGlwc2UgZ2V0IHRoZSAKLSAgICAgICAgICAgIC8vIHNhbWUgdmFsdWUgYXMgZWFjaCBvdGhlci4gIAotICAgICAgICAgICAgaWYgKGFyZ3NbaSAtIDFdLmVxdWFsc0lnbm9yZUNhc2UoSU5TVEFMTCkpIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydGllcygpLnB1dChQUk9QX0lOU1RBTExfQVJFQSwgYXJnKTsKLSAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGxvb2sgZm9yIHRoZSBjb25maWd1cmF0aW9uIHRvIHVzZS4gIAotICAgICAgICAgICAgLy8gQ29uc3VtZSB0aGUgYXJnIGhlcmUgdG8gZW5zdXJlIHRoYXQgdGhlIGxhdW5jaGVyIGFuZCBFY2xpcHNlIGdldCB0aGUgCi0gICAgICAgICAgICAvLyBzYW1lIHZhbHVlIGFzIGVhY2ggb3RoZXIuICAKLSAgICAgICAgICAgIGlmIChhcmdzW2kgLSAxXS5lcXVhbHNJZ25vcmVDYXNlKENPTkZJR1VSQVRJT04pKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmdldFByb3BlcnRpZXMoKS5wdXQoUFJPUF9DT05GSUdfQVJFQSwgYXJnKTsKLSAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGxvb2sgZm9yIHRoZSBjb21tYW5kIHRvIHVzZSB0byBzZXQgZXhpdCBkYXRhIGluIHRoZSBsYXVuY2hlcgotICAgICAgICAgICAgaWYgKGFyZ3NbaSAtIDFdLmVxdWFsc0lnbm9yZUNhc2UoRVhJVERBVEEpKSB7Ci0gICAgICAgICAgICAgICAgZXhpdERhdGEgPSBhcmc7Ci0gICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBsb29rIGZvciB0aGUgY29tbWFuZCB0byB1c2UgdG8gc2hvdyB0aGUgc3BsYXNoIHNjcmVlbgotICAgICAgICAgICAgaWYgKGFyZ3NbaSAtIDFdLmVxdWFsc0lnbm9yZUNhc2UoU0hPV1NQTEFTSCkpIHsKLSAgICAgICAgICAgICAgICBzaG93U3BsYXNoID0gYXJnOwotICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gbG9vayBmb3IgdGhlIG5hbWUgdG8gdXNlIGJ5IHRoZSBsYXVuY2hlcgotICAgICAgICAgICAgaWYgKGFyZ3NbaSAtIDFdLmVxdWFsc0lnbm9yZUNhc2UoTkFNRSkpIHsKLSAgICAgICAgICAgICAgICBuYW1lID0gYXJnOwotICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gbG9vayBmb3IgdGhlIGxhdW5jaGVyIGxvY2F0aW9uCi0gICAgICAgICAgICBpZiAoYXJnc1tpIC0gMV0uZXF1YWxzSWdub3JlQ2FzZShMQVVOQ0hFUikpIHsKLSAgICAgICAgICAgICAgICBsYXVuY2hlciA9IGFyZzsKLSAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIGxvb2sgZm9yIHRoZSBjb21tYW5kIHRvIHVzZSB0byBlbmQgdGhlIHNwbGFzaCBzY3JlZW4KLSAgICAgICAgICAgIGlmIChhcmdzW2kgLSAxXS5lcXVhbHNJZ25vcmVDYXNlKEVORFNQTEFTSCkpIHsKLSAgICAgICAgICAgICAgICBlbmRTcGxhc2ggPSBhcmc7Ci0gICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBsb29rIGZvciB0aGUgVk0gbG9jYXRpb24gYXJnCi0gICAgICAgICAgICBpZiAoYXJnc1tpIC0gMV0uZXF1YWxzSWdub3JlQ2FzZShWTSkpIHsKLSAgICAgICAgICAgICAgICB2bSA9IGFyZzsKLSAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0KLQkJCS8vbG9vayBmb3IgdGhlIG5sIHNldHRpbmcKLQkJCWlmIChhcmdzW2kgLSAxXS5lcXVhbHNJZ25vcmVDYXNlKE5MKSkgewotCQkJCVN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkucHV0KFBST1BfTkwsIGFyZyk7Ci0JCQkJZm91bmQgPSB0cnVlOwotCQkJfQotCQkJCi0gICAgICAgICAgICAvLyBkb25lIGNoZWNraW5nIGZvciBhcmdzLiAgUmVtZW1iZXIgd2hlcmUgYW4gYXJnIHdhcyBmb3VuZCAKLSAgICAgICAgICAgIGlmIChmb3VuZCkgewotICAgICAgICAgICAgICAgIGNvbmZpZ0FyZ3NbY29uZmlnQXJnSW5kZXgrK10gPSBpIC0gMTsKLSAgICAgICAgICAgICAgICBjb25maWdBcmdzW2NvbmZpZ0FyZ0luZGV4KytdID0gaTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyByZW1vdmUgYWxsIHRoZSBhcmd1bWVudHMgY29uc3VtZWQgYnkgdGhpcyBhcmd1bWVudCBwYXJzaW5nCi0gICAgICAgIFN0cmluZ1tdIHBhc3NUaHJ1QXJncyA9IG5ldyBTdHJpbmdbYXJncy5sZW5ndGggLSBjb25maWdBcmdJbmRleCAtICh2bWFyZ3MgPT0gbnVsbCA/IDAgOiB2bWFyZ3MubGVuZ3RoICsgMSldOwotICAgICAgICBjb25maWdBcmdJbmRleCA9IDA7Ci0gICAgICAgIGludCBqID0gMDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoaSA9PSBjb25maWdBcmdzW2NvbmZpZ0FyZ0luZGV4XSkKLSAgICAgICAgICAgICAgICBjb25maWdBcmdJbmRleCsrOwotICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSAhPSBudWxsKQotICAgICAgICAgICAgICAgIHBhc3NUaHJ1QXJnc1tqKytdID0gYXJnc1tpXTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcGFzc1RocnVBcmdzOwotICAgIH0KLQotICAgIHByaXZhdGUgUHJvcGVydGllcyBwcm9jZXNzRGV2QXJnKFN0cmluZyBhcmcpIHsKLSAgICAgICAgaWYgKGFyZyA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBVUkwgbG9jYXRpb24gPSBuZXcgVVJMKGFyZyk7Ci0gICAgICAgICAgICByZXR1cm4gbG9hZChsb2NhdGlvbiwgbnVsbCk7Ci0gICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyB0aGUgYXJnIHdhcyBub3QgYSBVUkwgc28gdXNlIGl0IGFzIGlzLgotICAgICAgICAJUHJvcGVydGllcyByZXN1bHQgPSBuZXcgUHJvcGVydGllcygpOwotICAgICAgICAJcmVzdWx0LnB1dCgiKiIsIGFyZyk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIFRPRE8gY29uc2lkZXIgbG9nZ2luZyBoZXJlCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgVVJMIGdldENvbmZpZ3VyYXRpb25Mb2NhdGlvbigpIHsKLSAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb25Mb2NhdGlvbiAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGNvbmZpZ3VyYXRpb25Mb2NhdGlvbjsKLSAgICAgICAgY29uZmlndXJhdGlvbkxvY2F0aW9uID0gYnVpbGRMb2NhdGlvbihQUk9QX0NPTkZJR19BUkVBLCBudWxsLCAiIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb25Mb2NhdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBjb25maWd1cmF0aW9uTG9jYXRpb24gPSBidWlsZExvY2F0aW9uKFBST1BfQ09ORklHX0FSRUFfREVGQVVMVCwgbnVsbCwgIiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbkxvY2F0aW9uID09IG51bGwpCi0gICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbkxvY2F0aW9uID0gYnVpbGRVUkwoY29tcHV0ZURlZmF1bHRDb25maWd1cmF0aW9uTG9jYXRpb24oKSwgdHJ1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb25Mb2NhdGlvbiAhPSBudWxsKQotICAgICAgICAgICAgU3lzdGVtLmdldFByb3BlcnRpZXMoKS5wdXQoUFJPUF9DT05GSUdfQVJFQSwgY29uZmlndXJhdGlvbkxvY2F0aW9uLnRvRXh0ZXJuYWxGb3JtKCkpOwotICAgICAgICBpZiAoZGVidWcpCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNvbmZpZ3VyYXRpb24gbG9jYXRpb246XG4gICAgIiArIGNvbmZpZ3VyYXRpb25Mb2NhdGlvbik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmV0dXJuIGNvbmZpZ3VyYXRpb25Mb2NhdGlvbjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0NvbmZpZ3VyYXRpb24oKSB7Ci0gICAgICAgIC8vIGlmIHRoZSBjb25maWd1cmF0aW9uIGFyZWEgaXMgbm90IGFscmVhZHkgZGVmaW5lZCwgZGlzY292ZXIgdGhlIGNvbmZpZyBhcmVhIGJ5Ci0gICAgICAgIC8vIHRyeWluZyB0byBmaW5kIGEgYmFzZSBjb25maWcgYXJlYS4gIFRoaXMgaXMgZWl0aGVyIGRlZmluZWQgaW4gYSBzeXN0ZW0gcHJvcGVydHkgb3IKLSAgICAgICAgLy8gaXMgY29tcHV0ZWQgcmVsYXRpdmUgdG8gdGhlIGluc3RhbGwgbG9jYXRpb24uCi0gICAgICAgIC8vIE5vdGUgdGhhdCB0aGUgY29uZmlnIGluZm8gcmVhZCBoZXJlIGlzIG9ubHkgdXNlZCB0byBkZXRlcm1pbmUgYSB2YWx1ZSAKLSAgICAgICAgLy8gZm9yIHRoZSB1c2VyIGNvbmZpZ3VyYXRpb24gYXJlYQotICAgICAgICBVUkwgYmFzZUNvbmZpZ3VyYXRpb25Mb2NhdGlvbiA9IG51bGw7Ci0gICAgICAgIFByb3BlcnRpZXMgYmFzZUNvbmZpZ3VyYXRpb24gPSBudWxsOwotICAgICAgICBpZiAoU3lzdGVtLmdldFByb3BlcnR5KFBST1BfQ09ORklHX0FSRUEpID09IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyBiYXNlTG9jYXRpb24gPSBTeXN0ZW0uZ2V0UHJvcGVydHkoUFJPUF9CQVNFX0NPTkZJR19BUkVBKTsKLSAgICAgICAgICAgIGlmIChiYXNlTG9jYXRpb24gIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAvLyBoZXJlIHRoZSBiYXNlIGNvbmZpZyBjYW5ub3QgaGF2ZSBhbnkgc3ltYm9saWMgKGUuLmcsIEB4eHgpIGVudHJpZXMuICBJdCBtdXN0IGp1c3QKLSAgICAgICAgICAgICAgICAvLyBwb2ludCB0byB0aGUgY29uZmlnIGZpbGUuCi0gICAgICAgICAgICAgICAgYmFzZUNvbmZpZ3VyYXRpb25Mb2NhdGlvbiA9IGJ1aWxkVVJMKGJhc2VMb2NhdGlvbiwgdHJ1ZSk7Ci0gICAgICAgICAgICBpZiAoYmFzZUNvbmZpZ3VyYXRpb25Mb2NhdGlvbiA9PSBudWxsKQotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGhlcmUgd2UgYWNjZXNzIHRoZSBpbnN0YWxsIGxvY2F0aW9uIGJ1dCB0aGlzIGlzIHZlcnkgZWFybHkuICBUaGlzIGNhc2Ugd2lsbCBvbmx5IGhhcHBlbiBpZgotICAgICAgICAgICAgICAgICAgICAvLyB0aGUgY29uZmlnIGFyZWEgaXMgbm90IHNldCBhbmQgdGhlIGJhc2UgY29uZmlnIGFyZWEgaXMgbm90IHNldCAob3IgaXMgYm9ndXMpLgotICAgICAgICAgICAgICAgICAgICAvLyBJbiB0aGlzIGNhc2Ugd2UgY29tcHV0ZSBiYXNlZCBvbiB0aGUgaW5zdGFsbCBsb2NhdGlvbi4KLSAgICAgICAgICAgICAgICAgICAgYmFzZUNvbmZpZ3VyYXRpb25Mb2NhdGlvbiA9IG5ldyBVUkwoZ2V0SW5zdGFsbExvY2F0aW9uKCksIENPTkZJR19ESVIpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGxlYXZlIGJhc2VDb25maWd1cmF0aW9uTG9jYXRpb24gbnVsbAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJhc2VDb25maWd1cmF0aW9uID0gbG9hZENvbmZpZ3VyYXRpb24oYmFzZUNvbmZpZ3VyYXRpb25Mb2NhdGlvbik7Ci0gICAgICAgICAgICBpZiAoYmFzZUNvbmZpZ3VyYXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBiYXNlIHNldHMgdGhlIGluc3RhbGwgYXJlYSB0aGVuIHVzZSB0aGF0IHZhbHVlIGlmIHRoZSBwcm9wZXJ0eS4gIFdlIGtub3cgdGhlIAotICAgICAgICAgICAgICAgIC8vIHByb3BlcnR5IGlzIG5vdCBhbHJlYWR5IHNldC4KLSAgICAgICAgICAgICAgICBTdHJpbmcgbG9jYXRpb24gPSBiYXNlQ29uZmlndXJhdGlvbi5nZXRQcm9wZXJ0eShQUk9QX0NPTkZJR19BUkVBKTsKLSAgICAgICAgICAgICAgICBpZiAobG9jYXRpb24gIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmdldFByb3BlcnRpZXMoKS5wdXQoUFJPUF9DT05GSUdfQVJFQSwgbG9jYXRpb24pOwotICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBiYXNlIHNldHMgdGhlIGluc3RhbGwgYXJlYSB0aGVuIHVzZSB0aGF0IHZhbHVlIGlmIHRoZSBwcm9wZXJ0eSBpcyBub3QgYWxyZWFkeSBzZXQuCi0gICAgICAgICAgICAgICAgLy8gVGhpcyBoZWxwcyBpbiBzZWxmaG9zdGluZyBjYXNlcyB3aGVyZSB5b3UgY2Fubm90IGVhc2lseSBjb21wdXRlIHRoZSBpbnN0YWxsIGxvY2F0aW9uCi0gICAgICAgICAgICAgICAgLy8gZnJvbSB0aGUgY29kZSBiYXNlLgotICAgICAgICAgICAgICAgIGxvY2F0aW9uID0gYmFzZUNvbmZpZ3VyYXRpb24uZ2V0UHJvcGVydHkoUFJPUF9JTlNUQUxMX0FSRUEpOwotICAgICAgICAgICAgICAgIGlmIChsb2NhdGlvbiAhPSBudWxsICYmIFN5c3RlbS5nZXRQcm9wZXJ0eShQUk9QX0lOU1RBTExfQVJFQSkgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmdldFByb3BlcnRpZXMoKS5wdXQoUFJPUF9JTlNUQUxMX0FSRUEsIGxvY2F0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIE5vdyB3ZSBrbm93IHdoZXJlIHRoZSBiYXNlIGNvbmZpZ3VyYXRpb24gaXMgc3VwcG9zZWQgdG8gYmUuICBHbyBhaGVhZCBhbmQgbG9hZAotICAgICAgICAvLyBpdCBhbmQgbWVyZ2UgaW50byB0aGUgU3lzdGVtIHByb3BlcnRpZXMuICBUaGVuLCBpZiBjYXNjYWRlZCwgcmVhZCB0aGUgcGFyZW50IGNvbmZpZ3VyYXRpb24KLSAgICAgICAgLy8gTm90ZSB0aGF0IHRoZSBwYXJlbnQgbWF5IG9yIG1heSBub3QgYmUgdGhlIHNhbWUgcGFyZW50IGFzIHdlIHJlYWQgYWJvdmUgc2luY2UgdGhlIAotICAgICAgICAvLyBiYXNlIGNhbiBkZWZpbmUgaXRzIHBhcmVudC4gIFRoZSBmaXJzdCBwYXJlbnQgd2UgcmVhZCB3YXMgZWl0aGVyIGRlZmluZWQgYnkgdGhlIHVzZXIKLSAgICAgICAgLy8gb24gdGhlIGNvbW1hbmQgbGluZSBvciB3YXMgdGhlIG9uZSBpbiB0aGUgaW5zdGFsbCBkaXIuICAKLSAgICAgICAgLy8gaWYgdGhlIGNvbmZpZyBvciBwYXJlbnQgd2UgYXJlIGFib3V0IHRvIHJlYWQgaXMgdGhlIHNhbWUgYXMgdGhlIGJhc2UgY29uZmlnIHdlIHJlYWQgYWJvdmUsCi0gICAgICAgIC8vIGp1c3QgcmV1c2UgdGhlIGJhc2UKLSAgICAgICAgUHJvcGVydGllcyBjb25maWd1cmF0aW9uID0gYmFzZUNvbmZpZ3VyYXRpb247Ci0gICAgICAgIGlmIChjb25maWd1cmF0aW9uID09IG51bGwgfHwgIWdldENvbmZpZ3VyYXRpb25Mb2NhdGlvbigpLmVxdWFscyhiYXNlQ29uZmlndXJhdGlvbkxvY2F0aW9uKSkKLSAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gPSBsb2FkQ29uZmlndXJhdGlvbihnZXRDb25maWd1cmF0aW9uTG9jYXRpb24oKSk7Ci0gICAgICAgIG1lcmdlUHJvcGVydGllcyhTeXN0ZW0uZ2V0UHJvcGVydGllcygpLCBjb25maWd1cmF0aW9uKTsKLSAgICAgICAgaWYgKCJmYWxzZSIuZXF1YWxzSWdub3JlQ2FzZShTeXN0ZW0uZ2V0UHJvcGVydHkoUFJPUF9DT05GSUdfQ0FTQ0FERUQpKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgLy8gaWYgd2UgYXJlIG5vdCBjYXNjYWRlZCB0aGVuIHJlbW92ZSB0aGUgcGFyZW50IHByb3BlcnR5IGV2ZW4gaWYgaXQgd2FzIHNldC4KLSAgICAgICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkucmVtb3ZlKFBST1BfU0hBUkVEX0NPTkZJR19BUkVBKTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgIAllbnN1cmVBYnNvbHV0ZShQUk9QX1NIQVJFRF9DT05GSUdfQVJFQSk7Ci0gICAgICAgICAgICBVUkwgc2hhcmVkQ29uZmlnVVJMID0gYnVpbGRMb2NhdGlvbihQUk9QX1NIQVJFRF9DT05GSUdfQVJFQSwgbnVsbCwgIiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBpZiAoc2hhcmVkQ29uZmlnVVJMID09IG51bGwpCi0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgLy8gdGhlcmUgaXMgbm8gc2hhcmVkIGNvbmZpZyB2YWx1ZSBzbyBjb21wdXRlIG9uZQotICAgICAgICAgICAgICAgICAgICBzaGFyZWRDb25maWdVUkwgPSBuZXcgVVJMKGdldEluc3RhbGxMb2NhdGlvbigpLCBDT05GSUdfRElSKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAvLyBsZWF2ZSBzaGFyZWRDb25maWd1cmF0aW9uTG9jYXRpb24gbnVsbAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGlmIHRoZSBwYXJlbnQgbG9jYXRpb24gaXMgZGlmZmVyZW50IGZyb20gdGhlIGNvbmZpZyBsb2NhdGlvbiwgcmVhZCBpdCB0b28uCi0gICAgICAgICAgICBpZiAoc2hhcmVkQ29uZmlnVVJMICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoc2hhcmVkQ29uZmlnVVJMLmVxdWFscyhnZXRDb25maWd1cmF0aW9uTG9jYXRpb24oKSkpCi0gICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSB0aGUgcHJvcGVydHkgdG8gc2hvdyB0aGF0IHdlIGRvIG5vdCBoYXZlIGEgcGFyZW50LgotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydGllcygpLnJlbW92ZShQUk9QX1NIQVJFRF9DT05GSUdfQVJFQSk7Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBwYXJlbnQgd2UgYXJlIGFib3V0IHRvIHJlYWQgaXMgdGhlIHNhbWUgYXMgdGhlIGJhc2UgY29uZmlnIHdlIHJlYWQgYWJvdmUsCi0gICAgICAgICAgICAgICAgICAgIC8vIGp1c3QgcmV1c2UgdGhlIGJhc2UKLSAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiA9IGJhc2VDb25maWd1cmF0aW9uOwotICAgICAgICAgICAgICAgICAgICBpZiAoIXNoYXJlZENvbmZpZ1VSTC5lcXVhbHMoYmFzZUNvbmZpZ3VyYXRpb25Mb2NhdGlvbikpCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uID0gbG9hZENvbmZpZ3VyYXRpb24oc2hhcmVkQ29uZmlnVVJMKTsKLSAgICAgICAgICAgICAgICAgICAgbWVyZ2VQcm9wZXJ0aWVzKFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCksIGNvbmZpZ3VyYXRpb24pOwotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydGllcygpLnB1dChQUk9QX1NIQVJFRF9DT05GSUdfQVJFQSwgc2hhcmVkQ29uZmlnVVJMLnRvRXh0ZXJuYWxGb3JtKCkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZGVidWcpCi0gICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNoYXJlZCBjb25maWd1cmF0aW9uIGxvY2F0aW9uOlxuICAgICIgKyBzaGFyZWRDb25maWdVUkwudG9FeHRlcm5hbEZvcm0oKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gc2V0dXAgdGhlIHBhdGggdG8gdGhlIGZyYW1ld29yawotICAgICAgICBTdHJpbmcgdXJsU3RyaW5nID0gU3lzdGVtLmdldFByb3BlcnR5KFBST1BfRlJBTUVXT1JLLCBudWxsKTsKLSAgICAgICAgaWYgKHVybFN0cmluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBVUkwgdXJsID0gYnVpbGRVUkwodXJsU3RyaW5nLCB0cnVlKTsKLSAgICAgICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkucHV0KFBST1BfRlJBTUVXT1JLLCB1cmwudG9FeHRlcm5hbEZvcm0oKSk7Ci0gICAgICAgICAgICBib290TG9jYXRpb24gPSByZXNvbHZlKHVybFN0cmluZyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLQkgKiBFbnN1cmVzIHRoZSB2YWx1ZSBmb3IgYSBzeXN0ZW0gcHJvcGVydHkgaXMgYW4gYWJzb2x1dGUgVVJMLiBSZWxhdGl2ZSBVUkxzIGFyZSB0cmFuc2xhdGVkIHRvCi0JICogYWJzb2x1dGUgVVJMcyBieSB0YWtpbmcgdGhlIGluc3RhbGwgVVJMIGFzIHJlZmVyZW5jZS4KLQkgKiAgIAotCSAqIEBwYXJhbSBsb2NhdGlvblByb3BlcnR5IHRoZSBrZXkgZm9yIGEgc3lzdGVtIHByb3BlcnR5IGNvbnRhaW5pbmcgYSBVUkwKLQkgKi8KLQlwcml2YXRlIHZvaWQgZW5zdXJlQWJzb2x1dGUoU3RyaW5nIGxvY2F0aW9uUHJvcGVydHkpIHsKLQkJU3RyaW5nIHByb3BlcnR5VmFsdWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkobG9jYXRpb25Qcm9wZXJ0eSk7Ci0JCWlmIChwcm9wZXJ0eVZhbHVlID09IG51bGwpCi0JCQkvLyBwcm9wZXJ0eSBub3QgZGVmaW5lZAotCQkJcmV0dXJuOwotCQlVUkwgbG9jYXRpb25VUkwgPSBudWxsOwotCQl0cnkgewotCQkJbG9jYXRpb25VUkwgPSBuZXcgVVJMKHByb3BlcnR5VmFsdWUpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJLy8gcHJvcGVydHkgaXMgbm90IGEgdmFsaWQgVVJMCi0JCQlyZXR1cm47Ci0JCX0KLQkJU3RyaW5nIGxvY2F0aW9uUGF0aCA9IGxvY2F0aW9uVVJMLmdldFBhdGgoKTsKLQkJaWYgKGxvY2F0aW9uUGF0aC5zdGFydHNXaXRoKCIvIikpIC8vJE5PTi1OTFMtMSQKLQkJCS8vIHByb3BlcnR5IHZhbHVlIGlzIGFic29sdXRlCi0JCQlyZXR1cm47Ci0JCVVSTCBpbnN0YWxsVVJMID0gZ2V0SW5zdGFsbExvY2F0aW9uKCk7Ci0JCWlmICghbG9jYXRpb25VUkwuZ2V0UHJvdG9jb2woKS5lcXVhbHMoaW5zdGFsbFVSTC5nZXRQcm90b2NvbCgpKSkKLQkJCS8vIG5vdCBzYW1lIHByb3RvY29sCi0JCQlyZXR1cm47Ci0JCXRyeSB7Ci0JCQlVUkwgYWJzb2x1dGVVUkwgPSBuZXcgVVJMKGluc3RhbGxVUkwsIGxvY2F0aW9uUGF0aCk7Ci0JCQlTeXN0ZW0uZ2V0UHJvcGVydGllcygpLnB1dChsb2NhdGlvblByb3BlcnR5LCBhYnNvbHV0ZVVSTC50b0V4dGVybmFsRm9ybSgpKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCS8vIHNob3VsZCBub3QgaGFwcGVuIC0gdGhlIHJlbGF0aXZlIFVSTCBpcyBrbm93biB0byBiZSB2YWxpZAotCQl9Ci0JfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB1cmwgb2YgdGhlIGxvY2F0aW9uIHRoaXMgY2xhc3Mgd2FzIGxvYWRlZCBmcm9tCi0gICAgICovCi0gICAgcHJpdmF0ZSBVUkwgZ2V0SW5zdGFsbExvY2F0aW9uKCkgewotICAgICAgICBpZiAoaW5zdGFsbExvY2F0aW9uICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gaW5zdGFsbExvY2F0aW9uOwotCi0gICAgICAgIC8vIHZhbHVlIGlzIG5vdCBzZXQgc28gY29tcHV0ZSB0aGUgZGVmYXVsdCBhbmQgc2V0IHRoZSB2YWx1ZQotICAgICAgICBTdHJpbmcgaW5zdGFsbEFyZWEgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoUFJPUF9JTlNUQUxMX0FSRUEpOwotICAgICAgICBpZiAoaW5zdGFsbEFyZWEgIT0gbnVsbCkgewotICAgICAgICAgICAgaW5zdGFsbExvY2F0aW9uID0gYnVpbGRVUkwoaW5zdGFsbEFyZWEsIHRydWUpOwotICAgICAgICAgICAgaWYgKGluc3RhbGxMb2NhdGlvbiA9PSBudWxsKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkluc3RhbGwgbG9jYXRpb24gaXMgaW52YWxpZDogIiArIGluc3RhbGxBcmVhKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgU3lzdGVtLmdldFByb3BlcnRpZXMoKS5wdXQoUFJPUF9JTlNUQUxMX0FSRUEsIGluc3RhbGxMb2NhdGlvbi50b0V4dGVybmFsRm9ybSgpKTsKLSAgICAgICAgICAgIGlmIChkZWJ1ZykKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkluc3RhbGwgbG9jYXRpb246XG4gICAgIiArIGluc3RhbGxMb2NhdGlvbik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIHJldHVybiBpbnN0YWxsTG9jYXRpb247Ci0gICAgICAgIH0KLQotICAgICAgICBQcm90ZWN0aW9uRG9tYWluIGRvbWFpbiA9IE1haW4uY2xhc3MuZ2V0UHJvdGVjdGlvbkRvbWFpbigpOwotICAgICAgICBDb2RlU291cmNlIHNvdXJjZSA9IG51bGw7Ci0JCVVSTCByZXN1bHQgPSBudWxsOwotICAgICAgICBpZiAoZG9tYWluICE9IG51bGwpCi0gICAgICAgIAlzb3VyY2UgPSBkb21haW4uZ2V0Q29kZVNvdXJjZSgpOwotICAgICAgICBpZiAoc291cmNlID09IG51bGwgfHwgZG9tYWluID09IG51bGwpIHsKLQkJCWlmIChkZWJ1ZykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNvZGVTb3VyY2UgbG9jYXRpb24gaXMgbnVsbC4gRGVmYXVsdGluZyB0aGUgaW5zdGFsbCBsb2NhdGlvbiB0byBmaWxlOnN0YXJ0dXAuamFyIik7IC8vJE5PTi1OTFMtMSQKLQkJCXRyeSB7Ci0JCQkJcmVzdWx0ID0gbmV3IFVSTCgiZmlsZTpzdGFydHVwLmphciIpOyAvLyROT04tTkxTLTEkCi0JCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZTIpIHsKLQkJCQkvL0lnbm9yZQotCQkJfQotICAgICAgICB9Ci0JCWlmIChzb3VyY2UgIT0gbnVsbCkKLQkJCXJlc3VsdCA9IHNvdXJjZS5nZXRMb2NhdGlvbigpOwotCQkKLSAgICAgICAgU3RyaW5nIHBhdGggPSBkZWNvZGUocmVzdWx0LmdldEZpbGUoKSk7Ci0gICAgICAgIC8vIG5vcm1hbGl6ZSB0byBub3QgaGF2ZSBsZWFkaW5nIC8gc28gd2UgY2FuIGNoZWNrIHRoZSBmb3JtCi0gICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKHBhdGgpOwotICAgICAgICBwYXRoID0gZmlsZS50b1N0cmluZygpLnJlcGxhY2UoJ1xcJywgJy8nKTsKLSAgICAgICAgLy8gVE9ETyBuZWVkIGEgYmV0dGVyIHRlc3QgZm9yIHdpbmRvd3MKLSAgICAgICAgLy8gSWYgb24gV2luZG93cyB0aGVuIGNhbm9uaWNhbGl6ZSB0aGUgZHJpdmUgbGV0dGVyIHRvIGJlIGxvd2VyY2FzZS4KLSAgICAgICAgLy8gcmVtZW1iZXIgdGhhdCB0aGVyZSBtYXkgYmUgVU5DIHBhdGhzIAotICAgICAgICBpZiAoRmlsZS5zZXBhcmF0b3JDaGFyID09ICdcXCcpCi0gICAgICAgICAgICBpZiAoQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKHBhdGguY2hhckF0KDApKSkgewotICAgICAgICAgICAgICAgIGNoYXJbXSBjaGFycyA9IHBhdGgudG9DaGFyQXJyYXkoKTsKLSAgICAgICAgICAgICAgICBjaGFyc1swXSA9IENoYXJhY3Rlci50b0xvd2VyQ2FzZShjaGFyc1swXSk7Ci0gICAgICAgICAgICAgICAgcGF0aCA9IG5ldyBTdHJpbmcoY2hhcnMpOwotICAgICAgICAgICAgfQotICAgICAgICBpZiAocGF0aC50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCIuamFyIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIHBhdGggPSBwYXRoLnN1YnN0cmluZygwLCBwYXRoLmxhc3RJbmRleE9mKCIvIikgKyAxKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB0cnkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAvLyBjcmVhdGUgYSBmaWxlIFVSTCAodmlhIEZpbGUpIHRvIG5vcm1hbGl6ZSB0aGUgZm9ybSAoZS5nLiwgcHV0IAotICAgICAgICAgICAgICAgIC8vIHRoZSBsZWFkaW5nIC8gb24gaWYgbmVjZXNzYXJ5KQotICAgICAgICAgICAgICAgIHBhdGggPSBuZXcgRmlsZShwYXRoKS50b1VSTCgpLmdldEZpbGUoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlMSkgewotICAgICAgICAgICAgICAgIC8vIHdpbGwgbmV2ZXIgaGFwcGVuLiAgVGhlIHBhdGggaXMgc3RyYWlnaHQgZnJvbSBhIFVSTC4gIAotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW5zdGFsbExvY2F0aW9uID0gbmV3IFVSTChyZXN1bHQuZ2V0UHJvdG9jb2woKSwgcmVzdWx0LmdldEhvc3QoKSwgcmVzdWx0LmdldFBvcnQoKSwgcGF0aCk7Ci0gICAgICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydGllcygpLnB1dChQUk9QX0lOU1RBTExfQVJFQSwgaW5zdGFsbExvY2F0aW9uLnRvRXh0ZXJuYWxGb3JtKCkpOwotICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gVE9ETyBWZXJ5IHVubGlrZWx5IGNhc2UuICBsb2cgaGVyZS4gIAotICAgICAgICB9Ci0gICAgICAgIGlmIChkZWJ1ZykKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSW5zdGFsbCBsb2NhdGlvbjpcbiAgICAiICsgaW5zdGFsbExvY2F0aW9uKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm4gaW5zdGFsbExvY2F0aW9uOwotICAgIH0KLQotICAgIC8qCi0gICAgICogTG9hZCB0aGUgZ2l2ZW4gY29uZmlndXJhdGlvbiBmaWxlCi0gICAgICovCi0gICAgcHJpdmF0ZSBQcm9wZXJ0aWVzIGxvYWRDb25maWd1cmF0aW9uKFVSTCB1cmwpIHsKLSAgICAgICAgUHJvcGVydGllcyByZXN1bHQgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgdXJsID0gbmV3IFVSTCh1cmwsIENPTkZJR19GSUxFKTsKLSAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoZGVidWcpCi0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiQ29uZmlndXJhdGlvbiBmaWxlOlxuICAgICIgKyB1cmwudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIHJlc3VsdCA9IGxvYWRQcm9wZXJ0aWVzKHVybCk7Ci0gICAgICAgICAgICBpZiAoZGVidWcpCi0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgbG9hZGVkIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaWYgKGRlYnVnKQotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiIG5vdCBmb3VuZCBvciBub3QgcmVhZCIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFByb3BlcnRpZXMgbG9hZFByb3BlcnRpZXMoVVJMIHVybCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gdHJ5IHRvIGxvYWQgc2F2ZWQgY29uZmlndXJhdGlvbiBmaWxlICh3YXRjaCBmb3IgZmFpbGVkIHByaW9yIHNhdmUoKSkKLSAgICAgICAgaWYgKHVybCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIFByb3BlcnRpZXMgcmVzdWx0ID0gbnVsbDsKLSAgICAgICAgSU9FeGNlcHRpb24gb3JpZ2luYWxFeGNlcHRpb24gPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmVzdWx0ID0gbG9hZCh1cmwsIG51bGwpOyAvLyB0cnkgdG8gbG9hZCBjb25maWcgZmlsZQotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlMSkgewotICAgICAgICAgICAgb3JpZ2luYWxFeGNlcHRpb24gPSBlMTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gbG9hZCh1cmwsIENPTkZJR19GSUxFX1RFTVBfU1VGRklYKTsgLy8gY2hlY2sgZm9yIGZhaWx1cmVzIG9uIHNhdmUKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUyKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbG9hZCh1cmwsIENPTkZJR19GSUxFX0JBS19TVUZGSVgpOyAvLyBjaGVjayBmb3IgZmFpbHVyZXMgb24gc2F2ZQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUzKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG9yaWdpbmFsRXhjZXB0aW9uOyAvLyB3ZSB0cmllZCwgYnV0IG5vIGNvbmZpZyBoZXJlIC4uLgotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qCi0gICAgICogTG9hZCB0aGUgY29uZmlndXJhdGlvbiAgCi0gICAgICovCi0gICAgcHJpdmF0ZSBQcm9wZXJ0aWVzIGxvYWQoVVJMIHVybCwgU3RyaW5nIHN1ZmZpeCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gZmlndXJlIG91dCB3aGF0IHdlIHdpbGwgYmUgbG9hZGluZwotICAgICAgICBpZiAoc3VmZml4ICE9IG51bGwgJiYgIXN1ZmZpeC5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB1cmwgPSBuZXcgVVJMKHVybC5nZXRQcm90b2NvbCgpLCB1cmwuZ2V0SG9zdCgpLCB1cmwuZ2V0UG9ydCgpLCB1cmwuZ2V0RmlsZSgpICsgc3VmZml4KTsKLQotICAgICAgICAvLyB0cnkgdG8gbG9hZCBzYXZlZCBjb25maWd1cmF0aW9uIGZpbGUKLSAgICAgICAgUHJvcGVydGllcyBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0gICAgICAgIElucHV0U3RyZWFtIGlzID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlzID0gdXJsLm9wZW5TdHJlYW0oKTsKLSAgICAgICAgICAgIHByb3BzLmxvYWQoaXMpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKGlzICE9IG51bGwpCi0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaXMuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vaWdub3JlIGZhaWx1cmUgdG8gY2xvc2UKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHByb3BzOwotICAgIH0KLQotICAgIC8qCi0gICAgICogSGFuZGxlIHNwbGFzaCBzY3JlZW4uCi0gICAgICogV2Ugc3VwcG9ydCAyIHN0YXJ0dXAgc2NlbmFyaW9zOgotICAgICAqIAotICAgICAqICgxKSB0aGUgZXhlY3V0YWJsZSBsYXVuY2hlciBwdXQgdXAgdGhlIHNwbGFzaCBzY3JlZW4uIEluIHRoYXQKLSAgICAgKiAgICAgc2NlbmFyaW8gd2UgYXJlIGludm9rZWQgd2l0aCAtZW5kc3BsYXNoIGNvbW1hbmQgd2hpY2ggaXMKLSAgICAgKiAgICAgZnVsbHkgZm9ybWVkIHRvIHRha2UgZG93biB0aGUgc3BsYXNoIHNjcmVlbgotICAgICAqIAotICAgICAqICgyKSB0aGUgZXhlY3V0YWJsZSBsYXVuY2hlciBkaWQgbm90IHB1dCB1cCB0aGUgc3BsYXNoIHNjcmVlbiwKLSAgICAgKiAgICAgYnV0IGludm9rZXMgRWNsaXBzZSB3aXRoIHBhcnRpYWxseSBmb3JtZWQgLXNob3dzcGxhc2ggY29tbWFuZC4KLSAgICAgKiAgICAgSW4gdGhpcyBzY2VuYXJpbyB3ZSBkZXRlcm1pbmUgd2hpY2ggc3BsYXNoIHRvIGRpc3BsYXkgKGJhc2VkIG9uIAotICAgICAqICAgICBmZWF0dXJlIGluZm9ybWF0aW9uKSBhbmQgdGhlbiBjYWxsIC1zaG93c3BsYXNoIGNvbW1hbmQuIAotICAgICAqIAotICAgICAqIEluIGJvdGggc2NlbmFyaW9zIHdlIHBhc3MgYSBoYW5kbGVyIChSdW5uYWJsZSkgdG8gdGhlIHBsYXRmb3JtLgotICAgICAqIFRoZSBoYW5kbGVyIGlzIGNhbGxlZCBhcyBhIHJlc3VsdCBvZiB0aGUgbGF1bmNoZWQgYXBwbGljYXRpb24gY2FsbGluZwotICAgICAqIFBsYXRmb3JtLmVuZFNwbGFzaCgpLiBJbiB0aGUgZmlyc3Qgc2NlbmFyaW8gdGhpcyByZXN1bHRzIGluIHRoZQotICAgICAqIC1lbmRzcGxhc2ggY29tbWFuZCBiZWluZyBleGVjdXRlZC4gSW4gdGhlIHNlY29uZCBzY2VuYXJpbyB0aGlzCi0gICAgICogcmVzdWx0cyBpbiB0aGUgcHJvY2VzcyBjcmVhdGVkIGFzIGEgcmVzdWx0IG9mIHRoZSAtc2hvd3NwbGFzaCBjb21tYW5kCi0gICAgICogYmVpbmcgZGVzdHJveWVkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBkZWZhdWx0UGF0aCBzZWFyY2ggcGF0aCBmb3IgdGhlIGJvb3QgcGx1Z2luCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVNwbGFzaChVUkxbXSBkZWZhdWx0UGF0aCkgewotICAgICAgICAvLyBydW4gd2l0aG91dCBzcGxhc2ggaWYgd2UgYXJlIGluaXRpYWxpemluZyBvciBub3NwbGFzaCAKLSAgICAgICAgLy8gd2FzIHNwZWNpZmllZCAoc3BsYXNoZG93biA9IHRydWUpCi0gICAgICAgIGlmIChpbml0aWFsaXplIHx8IHNwbGFzaERvd24pIHsKLSAgICAgICAgICAgIHNob3dTcGxhc2ggPSBudWxsOwotICAgICAgICAgICAgZW5kU3BsYXNoID0gbnVsbDsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKHNob3dTcGxhc2ggIT0gbnVsbCB8fCBlbmRTcGxhc2ggIT0gbnVsbCkgewotICAgICAgICAJLy8gUmVnaXN0ZXIgdGhlIGVuZFNwbGFzaEhhbmRsZXIgdG8gYmUgcnVuIGF0IFZNIHNodXRkb3duLiBUaGlzIGhvb2sgd2lsbCBiZSAKLSAgICAgICAgCS8vIHJlbW92ZWQgb25jZSB0aGUgc3BsYXNoIHNjcmVlbiBoYXMgYmVlbiB0YWtlbiBkb3duLgotICAgICAgICAJdHJ5IHsKLSAgICAgICAgCQlSdW50aW1lLmdldFJ1bnRpbWUoKS5hZGRTaHV0ZG93bkhvb2soZW5kU3BsYXNoSGFuZGxlcik7Ci0gICAgICAgIAl9IGNhdGNoKFRocm93YWJsZSBleCkgewotICAgICAgICAJCS8vIEJlc3QgZWZmb3J0IHRvIHJlZ2lzdGVyIHRoZSBoYW5kbGVyCi0gICAgICAgIAl9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBpZiAtZW5kc3BsYXNoIGlzIHNwZWNpZmllZCwgdXNlIGl0IGFuZCBpZ25vcmUgYW55IC1zaG93c3BsYXNoIGNvbW1hbmQKLSAgICAgICAgaWYgKGVuZFNwbGFzaCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzaG93U3BsYXNoID0gbnVsbDsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNoZWNrIGlmIHdlIGFyZSBydW5uaW5nIHdpdGhvdXQgYSBzcGxhc2ggc2NyZWVuCi0gICAgICAgIGlmIChzaG93U3BsYXNoID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgLy8gZGV0ZXJtaW5lIHRoZSBzcGxhc2ggbG9jYXRpb24KLSAgICAgICAgU3RyaW5nIGxvY2F0aW9uID0gZ2V0U3BsYXNoTG9jYXRpb24oZGVmYXVsdFBhdGgpOwotICAgICAgICBpZiAoZGVidWcpCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNwbGFzaCBsb2NhdGlvbjpcbiAgICAiICsgbG9jYXRpb24pOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGlmIChsb2NhdGlvbiA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAvLyBhc3luYyBjYWxsIHRvIHRoZSBsYXVuY2hlcgotICAgICAgICBzaG93UHJvY2VzcyA9IHJ1bkNvbW1hbmQoZmFsc2UsIG5ldyBTdHJpbmdbXSB7U0hPV1NQTEFTSCwgc2hvd1NwbGFzaCwgbG9jYXRpb259KTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBQcm9jZXNzIHJ1bkNvbW1hbmQoYm9vbGVhbiBibG9jaywgU3RyaW5nW10gZXh0cmFBcmdzKSB7Ci0gICAgICAgIGZpbmFsIGludCBOQlJfREVGQVVMVF9BUkdTID0gMzsKLSAgICAgICAgU3RyaW5nW10gYXJncyA9IG5ldyBTdHJpbmdbTkJSX0RFRkFVTFRfQVJHUyArIGV4dHJhQXJncy5sZW5ndGhdOwotICAgICAgICBhcmdzWzBdID0gbGF1bmNoZXI7Ci0gICAgICAgIGFyZ3NbMV0gPSBOQU1FOwotICAgICAgICBhcmdzWzJdID0gbmFtZTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4dHJhQXJncy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgYXJnc1tpICsgTkJSX0RFRkFVTFRfQVJHU10gPSBleHRyYUFyZ3NbaV07Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZGVidWcpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInJ1bkNvbW1hbmQ6XG4gICAgIik7Ly8kTk9OLU5MUy0xJCAKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoJzwnICsgYXJnc1tpXSArICc+Jyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oKTsKLSAgICAgICAgfQotCi0gICAgICAgIFByb2Nlc3MgcmVzdWx0ID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJlc3VsdCA9IFJ1bnRpbWUuZ2V0UnVudGltZSgpLmV4ZWMoYXJncyk7Ci0gICAgICAgICAgICBpZiAoYmxvY2spCi0gICAgICAgICAgICAgICAgcmVzdWx0LndhaXRGb3IoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGxvZygiRXhjZXB0aW9uIHJ1bm5pbmcgY29tbWFuZDogIiArIGV4dHJhQXJncyAhPSBudWxsICYmIGV4dHJhQXJncy5sZW5ndGggPiAwID8gZXh0cmFBcmdzWzBdIDogbnVsbCk7IC8vJE5PTi1OTFMtMSQgCi0gICAgICAgICAgICBsb2coZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFRha2UgZG93biB0aGUgc3BsYXNoIHNjcmVlbi4gVHJ5IGJvdGggdGFrZS1kb3duIG1ldGhvZHMganVzdCBpbiBjYXNlCi0gICAgICogKG9ubHkgb25lIHNob3VsZCBldmVyIGJlIHNldCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB0YWtlRG93blNwbGFzaCgpIHsKLSAgICAgICAgaWYgKHNwbGFzaERvd24pIC8vIHNwbGFzaCBpcyBhbHJlYWR5IGRvd24KLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAvLyBjaGVjayBpZiAtZW5kc3BsYXNoIHdhcyBzcGVjaWZpZWQKLSAgICAgICAgaWYgKGVuZFNwbGFzaCAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIFJ1bnRpbWUuZ2V0UnVudGltZSgpLmV4ZWMoZW5kU3BsYXNoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy9pZ25vcmUgZmFpbHVyZSB0byBlbmQgc3BsYXNoCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjaGVjayBpZiAtc2hvd3NwbGFzaCB3YXMgc3BlY2lmaWVkIGFuZCBleGVjdXRlZAotICAgICAgICBpZiAoc2hvd1Byb2Nlc3MgIT0gbnVsbCkgewotICAgICAgICAgICAgc2hvd1Byb2Nlc3MuZGVzdHJveSgpOwotICAgICAgICAgICAgc2hvd1Byb2Nlc3MgPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHNwbGFzaERvd24gPSB0cnVlOwotICAgICAgICAKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgCVJ1bnRpbWUuZ2V0UnVudGltZSgpLnJlbW92ZVNodXRkb3duSG9vayhlbmRTcGxhc2hIYW5kbGVyKTsKLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLSAgICAgICAgCS8vIE9LIHRvIGlnbm9yZSB0aGlzLCBoYXBwZW5zIHdoZW4gdGhlIFZNIGlzIGFscmVhZHkgc2h1dHRpbmcgZG93bgotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBSZXR1cm4gcGF0aCBvZiB0aGUgc3BsYXNoIGltYWdlIHRvIHVzZS4gIEZpcnN0IHNlYXJjaCB0aGUgZGVmaW5lZCBzcGxhc2ggcGF0aC4KLSAgICAgKiBJZiB0aGF0IGRvZXMgbm90IHdvcmssIGxvb2sgZm9yIGEgZGVmYXVsdCBzcGxhc2guICBDdXJyZW50bHkgdGhlIHNwbGFzaCBtdXN0IGJlIGluIHRoZSBmaWxlIHN5c3RlbQotICAgICAqIHNvIHRoZSByZXR1cm4gdmFsdWUgaGVyZSBpcyB0aGUgZmlsZSBzeXN0ZW0gcGF0aC4KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBnZXRTcGxhc2hMb2NhdGlvbihVUkxbXSBib290UGF0aCkgewotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gU3lzdGVtLmdldFByb3BlcnR5KFBST1BfU1BMQVNITE9DQVRJT04pOwotICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICBTdHJpbmcgc3BsYXNoUGF0aCA9IFN5c3RlbS5nZXRQcm9wZXJ0eShQUk9QX1NQTEFTSFBBVEgpOwotICAgICAgICBpZiAoc3BsYXNoUGF0aCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmdbXSBlbnRyaWVzID0gZ2V0QXJyYXlGcm9tTGlzdChzcGxhc2hQYXRoKTsKLSAgICAgICAgICAgIEFycmF5TGlzdCBwYXRoID0gbmV3IEFycmF5TGlzdChlbnRyaWVzLmxlbmd0aCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZW50cnkgPSByZXNvbHZlKGVudHJpZXNbaV0pOwotICAgICAgICAgICAgICAgIGlmIChlbnRyeSA9PSBudWxsIHx8IGVudHJ5LnN0YXJ0c1dpdGgoRklMRV9TQ0hFTUUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEZpbGUgZW50cnlGaWxlID0gbmV3IEZpbGUoZW50cnkuc3Vic3RyaW5nKDUpLnJlcGxhY2UoJy8nLCBGaWxlLnNlcGFyYXRvckNoYXIpKTsKLSAgICAgICAgICAgICAgICAgICAgZW50cnkgPSBzZWFyY2hGb3IoZW50cnlGaWxlLmdldE5hbWUoKSwgZW50cnlGaWxlLmdldFBhcmVudCgpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICBwYXRoLmFkZChlbnRyeSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGxvZygiSW52YWxpZCBzcGxhc2ggcGF0aCBlbnRyeTogIiArIGVudHJpZXNbaV0pOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBzZWUgaWYgd2UgY2FuIGdldCBhIHNwbGFzaCBnaXZlbiB0aGUgc3BsYXNoIHBhdGgKLSAgICAgICAgICAgIHJlc3VsdCA9IHNlYXJjaEZvclNwbGFzaCgoU3RyaW5nW10pIHBhdGgudG9BcnJheShuZXcgU3RyaW5nW3BhdGguc2l6ZSgpXSkpOwotICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmdldFByb3BlcnRpZXMoKS5wdXQoUFJPUF9TUExBU0hMT0NBVElPTiwgcmVzdWx0KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY2FuJ3QgZmluZCBpdCBvbiB0aGUgc3BsYXNoUGF0aCBzbyBsb29rIGZvciBhIGRlZmF1bHQgc3BsYXNoCi0gICAgICAgIFN0cmluZyB0ZW1wID0gYm9vdFBhdGhbMF0uZ2V0RmlsZSgpOyAvLyB0YWtlIHRoZSBmaXJzdCBwYXRoIGVsZW1lbnQKLSAgICAgICAgdGVtcCA9IHRlbXAucmVwbGFjZSgnLycsIEZpbGUuc2VwYXJhdG9yQ2hhcik7Ci0gICAgICAgIGludCBpeCA9IHRlbXAubGFzdEluZGV4T2YoInBsdWdpbnMiICsgRmlsZS5zZXBhcmF0b3IpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGlmIChpeCAhPSAtMSkgewotICAgICAgICAgICAgaW50IHBpeCA9IHRlbXAuaW5kZXhPZihGaWxlLnNlcGFyYXRvciwgaXggKyA4KTsKLSAgICAgICAgICAgIGlmIChwaXggIT0gLTEpIHsKLSAgICAgICAgICAgICAgICB0ZW1wID0gdGVtcC5zdWJzdHJpbmcoMCwgcGl4KTsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBzZWFyY2hGb3JTcGxhc2gobmV3IFN0cmluZ1tdIHt0ZW1wfSk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydGllcygpLnB1dChQUk9QX1NQTEFTSExPQ0FUSU9OLCByZXN1bHQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBEbyBhIGxvY2FsZS1zZW5zaXRpdmUgbG9va3VwIG9mIHNwbGFzaCBpbWFnZQotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIHNlYXJjaEZvclNwbGFzaChTdHJpbmdbXSBzZWFyY2hQYXRoKSB7Ci0gICAgICAgIGlmIChzZWFyY2hQYXRoID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICAvLyBHZXQgdGhlIHNwbGFzaCBzY3JlZW4gZm9yIHRoZSBzcGVjaWZpZWQgbG9jYWxlCi0JCVN0cmluZyBsb2NhbGUgPSAoU3RyaW5nKSBTeXN0ZW0uZ2V0UHJvcGVydGllcygpLmdldChQUk9QX05MKTsKLQkJaWYgKGxvY2FsZSA9PSBudWxsKQotCQkJbG9jYWxlID0gTG9jYWxlLmdldERlZmF1bHQoKS50b1N0cmluZygpOwotCQlTdHJpbmdbXSBubFZhcmlhbnRzID0gYnVpbGROTFZhcmlhbnRzKGxvY2FsZSk7Ci0KLQkJZm9yIChpbnQgaT0wOyBpPG5sVmFyaWFudHMubGVuZ3RoOyBpKyspIHsKLQkJCWZvciAoaW50IGo9MDsgajxzZWFyY2hQYXRoLmxlbmd0aDsgaisrKSB7Ci0JCQkJLy8gZG8gd2UgaGF2ZSBhIEpBUj8KLQkJCQlpZiAoaXNKQVIoc2VhcmNoUGF0aFtqXSkpIHsKLQkJCQkJU3RyaW5nIHJlc3VsdCA9IGV4dHJhY3RTcGxhc2hGcm9tSkFSKHNlYXJjaFBhdGhbal0sIG5sVmFyaWFudHNbaV0pOwotCQkJCQlpZiAocmVzdWx0ICE9IG51bGwpCi0JCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIHdlIGhhdmUgYSBmaWxlIG9yIGEgZGlyZWN0b3J5Ci0JICAgICAgICAgICAgICAgIFN0cmluZyBwYXRoID0gc2VhcmNoUGF0aFtqXTsKLQkgICAgICAgICAgICAgICAgaWYgKCFwYXRoLmVuZHNXaXRoKEZpbGUuc2VwYXJhdG9yKSkKLQkgICAgICAgICAgICAgICAgICAgIHBhdGggKz0gRmlsZS5zZXBhcmF0b3I7Ci0JICAgICAgICAgICAgICAgIHBhdGggKz0gbmxWYXJpYW50c1tpXTsKLQkgICAgICAgICAgICAgICAgRmlsZSByZXN1bHQgPSBuZXcgRmlsZShwYXRoKTsKLQkgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5leGlzdHMoKSkKLQkgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQuZ2V0QWJzb2x1dGVQYXRoKCk7IC8vIHJldHVybiB0aGUgZmlyc3QgbWF0Y2ggZm91bmQgWzIwMDYzXQotCQkJCX0KLQkJCX0KLQkJfQotCi0gICAgICAgIC8vIHNvcnJ5LCBjb3VsZCBub3QgZmluZCBzcGxhc2ggaW1hZ2UKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0JLyoqCi0JICogVHJhbnNmZXJzIGFsbCBhdmFpbGFibGUgYnl0ZXMgZnJvbSB0aGUgZ2l2ZW4gaW5wdXQgc3RyZWFtIHRvIHRoZSBnaXZlbiBvdXRwdXQgc3RyZWFtLiAKLQkgKiBSZWdhcmRsZXNzIG9mIGZhaWx1cmUsIHRoaXMgbWV0aG9kIGNsb3NlcyBib3RoIHN0cmVhbXMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCB0cmFuc2ZlclN0cmVhbXMoSW5wdXRTdHJlYW0gc291cmNlLCBPdXRwdXRTdHJlYW0gZGVzdGluYXRpb24pIHsKLQkJYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlWzgwOTZdOwotCQl0cnkgewotCQkJd2hpbGUgKHRydWUpIHsKLQkJCQlpbnQgYnl0ZXNSZWFkID0gLTE7Ci0JCQkJdHJ5IHsKLQkJCQkJYnl0ZXNSZWFkID0gc291cmNlLnJlYWQoYnVmZmVyKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJaWYgKGJ5dGVzUmVhZCA9PSAtMSkKLQkJCQkJYnJlYWs7Ci0JCQkJdHJ5IHsKLQkJCQkJZGVzdGluYXRpb24ud3JpdGUoYnVmZmVyLCAwLCBieXRlc1JlYWQpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJc291cmNlLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9IGZpbmFsbHkgewotCQkJCS8vY2xvc2UgZGVzdGluYXRpb24gaW4gZmluYWxseSBpbiBjYXNlIHNvdXJjZS5jbG9zZSBmYWlscwotCQkJCXRyeSB7Ci0JCQkJCWRlc3RpbmF0aW9uLmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkvLyBpZ25vcmUKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIExvb2sgZm9yIHRoZSBzcGVjaWZpZWQgc3Bhc2ggZmlsZSBpbiB0aGUgZ2l2ZW4gSkFSIGFuZCBleHRyYWN0IGl0IHRvIHRoZSBjb25maWcgCi0JICogYXJlYSBmb3IgY2FjaGluZyBwdXJwb3Nlcy4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBleHRyYWN0U3BsYXNoRnJvbUpBUihTdHJpbmcgamFyUGF0aCwgU3RyaW5nIHNwbGFzaFBhdGgpIHsKLQkJU3RyaW5nIGNvbmZpZ0xvY2F0aW9uID0gU3lzdGVtLmdldFByb3BlcnR5KFBST1BfQ09ORklHX0FSRUEpOwotCQlpZiAoY29uZmlnTG9jYXRpb24gPT0gbnVsbCkgewotCQkJbG9nKCJDb25maWd1cmF0aW9uIGFyZWEgbm90IHNldCB5ZXQuIFVuYWJsZSB0byBleHRyYWN0IHNwbGFzaCBmcm9tIEpBUidkIHBsdWctaW46ICIgKyBqYXJQYXRoKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJVVJMIGNvbmZpZ1VSTCA9IGJ1aWxkVVJMKGNvbmZpZ0xvY2F0aW9uLCBmYWxzZSk7Ci0JCWlmIChjb25maWdVUkwgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkvLyBjYWNoZSB0aGUgc3BsYXNoIGluIHRoZSBPU0dpIHN1Yi1kaXIgaW4gdGhlIGNvbmZpZyBhcmVhCi0JCUZpbGUgc3BsYXNoID0gbmV3IEZpbGUoY29uZmlnVVJMLmdldFBhdGgoKSwgT1NHSSk7Ci0JCXNwbGFzaCA9IG5ldyBGaWxlKHNwbGFzaCwgc3BsYXNoUGF0aCk7Ci0JCS8vIGlmIHdlIGhhdmUgYWxyZWFkeSBleHRyYWN0ZWQgdGhpcyBmaWxlIGJlZm9yZSwgdGhlbiByZXR1cm4KLQkJaWYgKHNwbGFzaC5leGlzdHMoKSkgewotCQkJLy8gaWYgd2UgYXJlIHJ1bm5pbmcgd2l0aCAtY2xlYW4gdGhlbiBkZWxldGUgdGhlIGNhY2hlZCBzcGxhc2ggZmlsZQotCQkJYm9vbGVhbiBjbGVhbiA9IGZhbHNlOwotCQkJZm9yIChpbnQgaT0wOyBpPGNvbW1hbmRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKENMRUFOLmVxdWFsc0lnbm9yZUNhc2UoY29tbWFuZHNbaV0pKSB7Ci0JCQkJCWNsZWFuID0gdHJ1ZTsKLQkJCQkJc3BsYXNoLmRlbGV0ZSgpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIWNsZWFuKQotCQkJCXJldHVybiBzcGxhc2guZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCX0KLQkJWmlwRmlsZSBmaWxlOwotCQl0cnkgewotCQkJZmlsZSA9IG5ldyBaaXBGaWxlKGphclBhdGgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlsb2coIkV4Y2VwdGlvbiBsb29raW5nIGZvciBzcGxhc2ggIGluIEpBUiBmaWxlOiAiICsgamFyUGF0aCk7IC8vJE5PTi1OTFMtMSQKLQkJCWxvZyhlKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVppcEVudHJ5IGVudHJ5ID0gZmlsZS5nZXRFbnRyeShzcGxhc2hQYXRoLnJlcGxhY2UoRmlsZS5zZXBhcmF0b3JDaGFyLCAnLycpKTsKLQkJaWYgKGVudHJ5ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSW5wdXRTdHJlYW0gaW5wdXQgPSBudWxsOwotCQl0cnkgewotCQkJaW5wdXQgPSBmaWxlLmdldElucHV0U3RyZWFtKGVudHJ5KTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJbG9nKCJFeGNlcHRpb24gb3BlbmluZyBzcGxhc2g6ICIgKyBlbnRyeS5nZXROYW1lKCkgKyAiIGluIEpBUiBmaWxlOiAiICsgamFyUGF0aCk7ICAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWxvZyhlKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCW5ldyBGaWxlKHNwbGFzaC5nZXRQYXJlbnQoKSkubWtkaXJzKCk7Ci0JCU91dHB1dFN0cmVhbSBvdXRwdXQ7Ci0JCXRyeSB7Ci0JCQlvdXRwdXQgPSBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0oc3BsYXNoKSk7Ci0JCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQl0cnkgewotCQkJCWlucHV0LmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlMSkgewotCQkJCS8vIGlnbm9yZQotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJdHJhbnNmZXJTdHJlYW1zKGlucHV0LCBvdXRwdXQpOwotCQlyZXR1cm4gc3BsYXNoLmV4aXN0cygpID8gc3BsYXNoLmdldEFic29sdXRlUGF0aCgpIDogbnVsbDsKLQl9Ci0KLQkvKgotCSAqIFJldHVybiBhIGJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIG9yIG5vdCB0aGUgZ2l2ZW4KLQkgKiBwYXRoIHJlcHJlc2VudHMgYSBKQVIgZmlsZS4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNKQVIoU3RyaW5nIHBhdGgpIHsKLQkJaWYgKHBhdGguZW5kc1dpdGgoRmlsZS5zZXBhcmF0b3IpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpbnQgaW5kZXggPSBwYXRoLmxhc3RJbmRleE9mKCcuJyk7Ci0JCWlmIChpbmRleCA9PSAtMSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaW5kZXgrKzsKLQkJLy8gaGFuZGxlIHRoZSBjYXNlIHdoZXJlIHdlIGhhdmUgYSAnLicgYXQgdGhlIGVuZAotCQlpZiAoaW5kZXggPj0gcGF0aC5sZW5ndGgoKSkgCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiAiSkFSIi5lcXVhbHNJZ25vcmVDYXNlKHBhdGguc3Vic3RyaW5nKGluZGV4KSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIEJ1aWxkIGFuIGFycmF5IG9mIHBhdGggc3VmZml4ZXMgYmFzZWQgb24gdGhlIGdpdmVuIE5MIHdoaWNoIGlzIHN1aXRhYmxlCi0JICogZm9yIHNwbGFzaCBwYXRoIHNlYXJjaGluZy4gIFRoZSByZXR1cm5lZCBhcnJheSBjb250YWlucyBwYXRocyBpbiBvcmRlciAKLQkgKiBmcm9tIG1vc3Qgc3BlY2lmaWMgdG8gbW9zdCBnZW5lcmljLiBTbywgaW4gdGhlIEZSX2ZyIGxvY2FsZSwgaXQgd2lsbCByZXR1cm4gCi0JICogIm5sL2ZyL0ZSL3NwbGFzaC5ibXAiLCB0aGVuICJubC9mci9zcGxhc2guYm1wIiwgYW5kIGZpbmFsbHkgInNwbGFzaC5ibXAiLiAKLQkgKiAod2UgYWx3YXlzIHNlYXJjaCB0aGUgcm9vdCkKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBidWlsZE5MVmFyaWFudHMoU3RyaW5nIGxvY2FsZSkgewotCQkvL2J1aWxkIGxpc3Qgb2Ygc3VmZml4ZXMgZm9yIGxvYWRpbmcgcmVzb3VyY2UgYnVuZGxlcwotCQlTdHJpbmcgbmwgPSBsb2NhbGU7Ci0JCUFycmF5TGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KDQpOwotCQlpbnQgbGFzdFNlcGFyYXRvcjsKLQkJd2hpbGUgKHRydWUpIHsKLQkJCXJlc3VsdC5hZGQoIm5sIiArIEZpbGUuc2VwYXJhdG9yQ2hhciArIG5sLnJlcGxhY2UoJ18nLCBGaWxlLnNlcGFyYXRvckNoYXIpICsgRmlsZS5zZXBhcmF0b3JDaGFyICsgU1BMQVNIX0lNQUdFKTsgLy8kTk9OLU5MUy0xJAotCQkJbGFzdFNlcGFyYXRvciA9IG5sLmxhc3RJbmRleE9mKCdfJyk7Ci0JCQlpZiAobGFzdFNlcGFyYXRvciA9PSAtMSkKLQkJCQlicmVhazsKLQkJCW5sID0gbmwuc3Vic3RyaW5nKDAsIGxhc3RTZXBhcmF0b3IpOwotCQl9Ci0JCS8vYWRkIHRoZSBlbXB0eSBzdWZmaXggbGFzdCAobW9zdCBnZW5lcmFsKQotCQlyZXN1bHQuYWRkKFNQTEFTSF9JTUFHRSk7Ci0JCXJldHVybiAoU3RyaW5nW10pIHJlc3VsdC50b0FycmF5KG5ldyBTdHJpbmdbcmVzdWx0LnNpemUoKV0pOwotCX0KLQotICAgIC8qCi0gICAgICogcmVzb2x2ZSBwbGF0Zm9ybTovYmFzZS8gVVJMcwotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIHJlc29sdmUoU3RyaW5nIHVybFN0cmluZykgewotICAgICAgICAvLyBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgcGVvcGxlIG1pc3Rha2VubHkgc3BlYyBhIHJlZmVyZXJlbmNlOiB1cmwuCi0gICAgICAgIGlmICh1cmxTdHJpbmcuc3RhcnRzV2l0aChSRUZFUkVOQ0VfU0NIRU1FKSkgewotICAgICAgICAgICAgdXJsU3RyaW5nID0gdXJsU3RyaW5nLnN1YnN0cmluZygxMCk7Ci0gICAgICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydGllcygpLnB1dChQUk9QX0ZSQU1FV09SSywgdXJsU3RyaW5nKTsKLSAgICAgICAgfQotICAgICAgICBpZiAodXJsU3RyaW5nLnN0YXJ0c1dpdGgoUExBVEZPUk1fVVJMKSkgewotICAgICAgICAgICAgU3RyaW5nIHBhdGggPSB1cmxTdHJpbmcuc3Vic3RyaW5nKFBMQVRGT1JNX1VSTC5sZW5ndGgoKSk7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0SW5zdGFsbExvY2F0aW9uKCkgKyBwYXRoOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIHJldHVybiB1cmxTdHJpbmc7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBFbnRyeSBwb2ludCBmb3IgbG9nZ2luZy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgbG9nKE9iamVjdCBvYmopIHsKLSAgICAgICAgaWYgKG9iaiA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgb3BlbkxvZ0ZpbGUoKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaWYgKG5ld1Nlc3Npb24pIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLndyaXRlKFNFU1NJT04pOwotICAgICAgICAgICAgICAgICAgICBsb2cud3JpdGUoJyAnKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRpbWVzdGFtcCA9IG5ldyBEYXRlKCkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgbG9nLndyaXRlKHRpbWVzdGFtcCk7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy53cml0ZSgnICcpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gU0VTU0lPTi5sZW5ndGgoKSArIHRpbWVzdGFtcC5sZW5ndGgoKTsgaSA8IDc4OyBpKyspCi0gICAgICAgICAgICAgICAgICAgICAgICBsb2cud3JpdGUoJy0nKTsKLSAgICAgICAgICAgICAgICAgICAgbG9nLm5ld0xpbmUoKTsKLSAgICAgICAgICAgICAgICAgICAgbmV3U2Vzc2lvbiA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB3cml0ZShvYmopOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICBpZiAobG9nRmlsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsb2cgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5mbHVzaCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgICAgICBjbG9zZUxvZ0ZpbGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiQW4gZXhjZXB0aW9uIG9jY3VycmVkIHdoaWxlIHdyaXRpbmcgdG8gdGhlIHBsYXRmb3JtIGxvZzoiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLmVycik7Ci0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkxvZ2dpbmcgdG8gdGhlIGNvbnNvbGUgaW5zdGVhZC4iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgLy93ZSBmYWlsZWQgdG8gd3JpdGUsIHNvIGR1bXAgbG9nIGVudHJ5IHRvIGNvbnNvbGUgaW5zdGVhZAotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBsb2cgPSBsb2dGb3JTdHJlYW0oU3lzdGVtLmVycik7Ci0gICAgICAgICAgICAgICAgd3JpdGUob2JqKTsKLSAgICAgICAgICAgICAgICBsb2cuZmx1c2goKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlMikgewotICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiQW4gZXhjZXB0aW9uIG9jY3VycmVkIHdoaWxlIGxvZ2dpbmcgdG8gdGhlIGNvbnNvbGU6Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBlMi5wcmludFN0YWNrVHJhY2UoU3lzdGVtLmVycik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBsb2cgPSBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBmcm9tICNsb2coKQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB3cml0ZShPYmplY3Qgb2JqKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBpZiAob2JqID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBUaHJvd2FibGUpIHsKLSAgICAgICAgICAgIGxvZy53cml0ZShTVEFDSyk7Ci0gICAgICAgICAgICBsb2cubmV3TGluZSgpOwotICAgICAgICAgICAgKChUaHJvd2FibGUpIG9iaikucHJpbnRTdGFja1RyYWNlKG5ldyBQcmludFdyaXRlcihsb2cpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGxvZy53cml0ZShFTlRSWSk7Ci0gICAgICAgICAgICBsb2cud3JpdGUoJyAnKTsKLSAgICAgICAgICAgIGxvZy53cml0ZShQTFVHSU5fSUQpOwotICAgICAgICAgICAgbG9nLndyaXRlKCcgJyk7Ci0gICAgICAgICAgICBsb2cud3JpdGUoU3RyaW5nLnZhbHVlT2YoRVJST1IpKTsKLSAgICAgICAgICAgIGxvZy53cml0ZSgnICcpOwotICAgICAgICAgICAgbG9nLndyaXRlKFN0cmluZy52YWx1ZU9mKDApKTsKLSAgICAgICAgICAgIGxvZy53cml0ZSgnICcpOwotICAgICAgICAgICAJbG9nLndyaXRlKGdldERhdGUobmV3IERhdGUoKSkpOwotICAgICAgICAgICAgbG9nLm5ld0xpbmUoKTsKLSAgICAgICAgICAgIGxvZy53cml0ZShNRVNTQUdFKTsKLSAgICAgICAgICAgIGxvZy53cml0ZSgnICcpOwotICAgICAgICAgICAgbG9nLndyaXRlKFN0cmluZy52YWx1ZU9mKG9iaikpOwotICAgICAgICB9Ci0gICAgICAgIGxvZy5uZXdMaW5lKCk7Ci0gICAgfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREYXRlKERhdGUgZGF0ZSkgewotCQlDYWxlbmRhciBjID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKTsKLQkJYy5zZXRUaW1lKGRhdGUpOwotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWFwcGVuZFBhZGRlZEludChjLmdldChDYWxlbmRhci5ZRUFSKSwgNCwgc2IpLmFwcGVuZCgnLScpOwotCQlhcHBlbmRQYWRkZWRJbnQoYy5nZXQoQ2FsZW5kYXIuTU9OVEgpICsgMSwgMiwgc2IpLmFwcGVuZCgnLScpOwotCQlhcHBlbmRQYWRkZWRJbnQoYy5nZXQoQ2FsZW5kYXIuREFZX09GX01PTlRIKSwgMiwgc2IpLmFwcGVuZCgnICcpOwotCQlhcHBlbmRQYWRkZWRJbnQoYy5nZXQoQ2FsZW5kYXIuSE9VUl9PRl9EQVkpLCAyLCBzYikuYXBwZW5kKCc6Jyk7Ci0JCWFwcGVuZFBhZGRlZEludChjLmdldChDYWxlbmRhci5NSU5VVEUpLCAyLCBzYikuYXBwZW5kKCc6Jyk7Ci0JCWFwcGVuZFBhZGRlZEludChjLmdldChDYWxlbmRhci5TRUNPTkQpLCAyLCBzYikuYXBwZW5kKCcuJyk7Ci0JCWFwcGVuZFBhZGRlZEludChjLmdldChDYWxlbmRhci5NSUxMSVNFQ09ORCksIDMsIHNiKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmdCdWZmZXIgYXBwZW5kUGFkZGVkSW50KGludCB2YWx1ZSwgaW50IHBhZCwgU3RyaW5nQnVmZmVyIGJ1ZmZlcikgewotCQlwYWQgPSBwYWQgLSAxOwotCQlpZiAocGFkID09IDApCi0JCQlyZXR1cm4gYnVmZmVyLmFwcGVuZChJbnRlZ2VyLnRvU3RyaW5nKHZhbHVlKSk7Ci0JCWludCBwYWRkaW5nID0gKGludCkgTWF0aC5wb3coMTAsIHBhZCk7Ci0JCWlmICh2YWx1ZSA+PSBwYWRkaW5nKQotCQkJcmV0dXJuIGJ1ZmZlci5hcHBlbmQoSW50ZWdlci50b1N0cmluZyh2YWx1ZSkpOwotCQl3aGlsZSAocGFkZGluZyA+IHZhbHVlICYmIHBhZGRpbmcgPiAxKSB7Ci0JCQlidWZmZXIuYXBwZW5kKCcwJyk7Ci0JCQlwYWRkaW5nID0gcGFkZGluZyAvIDEwOwotCQl9Ci0JCWJ1ZmZlci5hcHBlbmQodmFsdWUpOwotCQlyZXR1cm4gYnVmZmVyOwotCX0KLQotICAgIHByaXZhdGUgdm9pZCBjb21wdXRlTG9nRmlsZUxvY2F0aW9uKCkgewotICAgICAgICBTdHJpbmcgbG9nRmlsZVByb3AgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoUFJPUF9MT0dGSUxFKTsKLSAgICAgICAgaWYgKGxvZ0ZpbGVQcm9wICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChsb2dGaWxlID09IG51bGwgfHwgIWxvZ0ZpbGVQcm9wLmVxdWFscyhsb2dGaWxlLmdldEFic29sdXRlUGF0aCgpKSkgewotICAgICAgICAgICAgICAgIGxvZ0ZpbGUgPSBuZXcgRmlsZShsb2dGaWxlUHJvcCk7Ci0gICAgICAgICAgICAgICAgbmV3IEZpbGUobG9nRmlsZS5nZXRQYXJlbnQoKSkubWtkaXJzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjb21wdXRlIHRoZSBiYXNlIGxvY2F0aW9uIGFuZCB0aGVuIGFwcGVuZCB0aGUgbmFtZSBvZiB0aGUgbG9nIGZpbGUKLSAgICAgICAgVVJMIGJhc2UgPSBidWlsZFVSTChTeXN0ZW0uZ2V0UHJvcGVydHkoUFJPUF9DT05GSUdfQVJFQSksIGZhbHNlKTsKLSAgICAgICAgaWYgKGJhc2UgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgbG9nRmlsZSA9IG5ldyBGaWxlKGJhc2UuZ2V0UGF0aCgpLCBMb25nLnRvU3RyaW5nKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKSArICIubG9nIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgbmV3IEZpbGUobG9nRmlsZS5nZXRQYXJlbnQoKSkubWtkaXJzKCk7Ci0gICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkucHV0KFBST1BfTE9HRklMRSwgbG9nRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgYW4gQVNDSUkgY2hhcmFjdGVyIHJlcHJlc2VudGluZyBhIGhleGFkZWNpbWFsCi0gICAgICogdmFsdWUgaW50byBpdHMgaW50ZWdlciBlcXVpdmFsZW50LgotICAgICAqLwotICAgIHByaXZhdGUgaW50IGhleFRvQnl0ZShieXRlIGIpIHsKLSAgICAgICAgc3dpdGNoIChiKSB7Ci0gICAgICAgICAgICBjYXNlICcwJyA6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICBjYXNlICcxJyA6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgICAgICBjYXNlICcyJyA6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDI7Ci0gICAgICAgICAgICBjYXNlICczJyA6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDM7Ci0gICAgICAgICAgICBjYXNlICc0JyA6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDQ7Ci0gICAgICAgICAgICBjYXNlICc1JyA6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDU7Ci0gICAgICAgICAgICBjYXNlICc2JyA6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDY7Ci0gICAgICAgICAgICBjYXNlICc3JyA6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDc7Ci0gICAgICAgICAgICBjYXNlICc4JyA6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDg7Ci0gICAgICAgICAgICBjYXNlICc5JyA6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDk7Ci0gICAgICAgICAgICBjYXNlICdBJyA6Ci0gICAgICAgICAgICBjYXNlICdhJyA6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDEwOwotICAgICAgICAgICAgY2FzZSAnQicgOgotICAgICAgICAgICAgY2FzZSAnYicgOgotICAgICAgICAgICAgICAgIHJldHVybiAxMTsKLSAgICAgICAgICAgIGNhc2UgJ0MnIDoKLSAgICAgICAgICAgIGNhc2UgJ2MnIDoKLSAgICAgICAgICAgICAgICByZXR1cm4gMTI7Ci0gICAgICAgICAgICBjYXNlICdEJyA6Ci0gICAgICAgICAgICBjYXNlICdkJyA6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDEzOwotICAgICAgICAgICAgY2FzZSAnRScgOgotICAgICAgICAgICAgY2FzZSAnZScgOgotICAgICAgICAgICAgICAgIHJldHVybiAxNDsKLSAgICAgICAgICAgIGNhc2UgJ0YnIDoKLSAgICAgICAgICAgIGNhc2UgJ2YnIDoKLSAgICAgICAgICAgICAgICByZXR1cm4gMTU7Ci0gICAgICAgICAgICBkZWZhdWx0IDoKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTd2l0Y2ggZXJyb3IgZGVjb2RpbmcgVVJMIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBvcGVuTG9nRmlsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGNvbXB1dGVMb2dGaWxlTG9jYXRpb24oKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGxvZyA9IG5ldyBCdWZmZXJlZFdyaXRlcihuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG5ldyBGaWxlT3V0cHV0U3RyZWFtKGxvZ0ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIHRydWUpLCAiVVRGLTgiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbG9nRmlsZSA9IG51bGw7Ci0gICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBCdWZmZXJlZFdyaXRlciBsb2dGb3JTdHJlYW0oT3V0cHV0U3RyZWFtIG91dHB1dCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBCdWZmZXJlZFdyaXRlcihuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG91dHB1dCwgIlVURi04IikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBCdWZmZXJlZFdyaXRlcihuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG91dHB1dCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNsb3NlTG9nRmlsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAobG9nICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBsb2cuZmx1c2goKTsKLSAgICAgICAgICAgICAgICBsb2cuY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGxvZyA9IG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgbWVyZ2VQcm9wZXJ0aWVzKFByb3BlcnRpZXMgZGVzdGluYXRpb24sIFByb3BlcnRpZXMgc291cmNlKSB7Ci0JCWlmIChkZXN0aW5hdGlvbiA9PSBudWxsIHx8IHNvdXJjZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlmb3IgKEVudW1lcmF0aW9uIGUgPSBzb3VyY2Uua2V5cygpOyBlLmhhc01vcmVFbGVtZW50cygpOykgewotCQkJU3RyaW5nIGtleSA9IChTdHJpbmcpIGUubmV4dEVsZW1lbnQoKTsKLQkJCWlmIChrZXkuZXF1YWxzKFBST1BfQ0xBU1NQQVRIKSkgewotCQkJCVN0cmluZyBkZXN0aW5hdGlvbkNsYXNzcGF0aCA9IGRlc3RpbmF0aW9uLmdldFByb3BlcnR5KFBST1BfQ0xBU1NQQVRIKTsKLQkJCQlTdHJpbmcgc291cmNlQ2xhc3NwYXRoID0gc291cmNlLmdldFByb3BlcnR5KFBST1BfQ0xBU1NQQVRIKTsKLQkJCQlpZiAoZGVzdGluYXRpb25DbGFzc3BhdGggPT0gbnVsbCkKLQkJCQkJZGVzdGluYXRpb25DbGFzc3BhdGggPSBzb3VyY2VDbGFzc3BhdGg7Ci0JCQkJZWxzZQotCQkJCQlkZXN0aW5hdGlvbkNsYXNzcGF0aCA9IGRlc3RpbmF0aW9uQ2xhc3NwYXRoICsgc291cmNlQ2xhc3NwYXRoOwotCQkJCWRlc3RpbmF0aW9uLnB1dChQUk9QX0NMQVNTUEFUSCwgZGVzdGluYXRpb25DbGFzc3BhdGgpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJU3RyaW5nIHZhbHVlID0gc291cmNlLmdldFByb3BlcnR5KGtleSk7Ci0JCQlpZiAoZGVzdGluYXRpb24uZ2V0UHJvcGVydHkoa2V5KSA9PSBudWxsKQotCQkJCWRlc3RpbmF0aW9uLnB1dChrZXksIHZhbHVlKTsKLQkJfQotCX0KLQotICAgIHByaXZhdGUgdm9pZCBzZXR1cFZNUHJvcGVydGllcygpIHsKLSAgICAgICAgaWYgKHZtICE9IG51bGwpCi0gICAgICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydGllcygpLnB1dChQUk9QX1ZNLCB2bSk7Ci0gICAgICAgIHNldE11bHRpVmFsdWVQcm9wZXJ0eShQUk9QX1ZNQVJHUywgdm1hcmdzKTsKLSAgICAgICAgc2V0TXVsdGlWYWx1ZVByb3BlcnR5KFBST1BfQ09NTUFORFMsIGNvbW1hbmRzKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2V0TXVsdGlWYWx1ZVByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eSwgU3RyaW5nW10gdmFsdWUpIHsKLSAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKDMwMCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHZhbHVlW2ldICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCh2YWx1ZVtpXSk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoJ1xuJyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgU3lzdGVtLmdldFByb3BlcnRpZXMoKS5wdXQocHJvcGVydHksIHJlc3VsdC50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogTk9URTogSXQgaXMgb2sgaGVyZSBmb3IgRWNsaXBzZVBvbGljeSB0byB1c2UgMS40IG1ldGhvZHMgYmVjYXVzZSB0aGUgbWV0aG9kcwotICAgICAqIHRoYXQgaXQgY2FsbHMgdGhlbSBmcm9tIGRvbid0IGV4aXN0IGluIEZvdW5kYXRpb24gc28gdGhleSB3aWxsIG5ldmVyIGJlIGNhbGxlZC4gQSBtb3JlCi0gICAgICogZGV0YWlsZWQgZXhwbGFuYXRpb24gZnJvbSBUb206Ci0gICAgICogCi0gICAgICogVGhleSB3aWxsIG5ldmVyIGdldCBjYWxsZWQgYmVjYXVzZSBpbiBhIHByZSAxLjQgVk0gdGhlIG1ldGhvZHMgCi0gICAgICogZ2V0UGVybWlzc2lvbnMoQ29kZVNvdXJjZSkgYW5kIGltcGxpZXMoUHJvdGVjdGlvbkRvbWFpbiwgUGVybWlzc2lvbikgYXJlIAotICAgICAqIHVuZGVmaW5lZCBvbiB0aGUgUG9saWN5IGNsYXNzIHdoaWNoIGlzIHdoYXQgRWNsaXBzZVBvbGljeSBleHRlbmRzLiAgRWNsaXBzZVBvbGljeSAKLSAgICAgKiBpbXBsZW1lbnRzIHRoZXNlIHR3byBtZXRob2RzIHNvIGl0IGNhbiBwcm94eSB0aGVtIHRvIHRoZSBwYXJlbnQgUG9saWN5LiAgCi0gICAgICogQnV0IHNpbmNlIHRoZXNlIG1ldGhvZHMgYXJlIG5vdCBhY3R1YWxseSBkZWZpbmVkIG9uIFBvbGljeSBpbiBhIHByZS0xLjQgVk0gCi0gICAgICogbm9ib2R5IHdpbGwgYWN0dWFsbHkgY2FsbCB0aGVtICh1bmxlc3MgdGhleSBjYXN0ZWQgdGhlIHBvbGljeSB0byBFY2xpcHNlUG9saWN5IGFuZCAKLSAgICAgKiBjYWxsZWQgb3VyIG1ldGhvZHMpCi0gICAgICovCi0gICAgcHJpdmF0ZSBjbGFzcyBFY2xpcHNlUG9saWN5IGV4dGVuZHMgUG9saWN5IHsKLSAgICAgICAgLy8gVGhlIHBvbGljeSB0aGF0IHRoaXMgRWNsaXBzZVBvbGljeSBpcyByZXBsYWNpbmcKLSAgICAgICAgcHJpdmF0ZSBQb2xpY3kgcG9saWN5OwotCi0gICAgICAgIC8vIFRoZSBzZXQgb2YgVVJMcyB0byBnaXZlIEFsbFBlcm1pc3Npb25zIHRvOyB0aGlzIGlzIHRoZSBzZXQgb2YgYm9vdFVSTHMKLSAgICAgICAgcHJpdmF0ZSBVUkxbXSB1cmxzOwotCi0gICAgICAgIC8vIFRoZSBBbGxQZXJtaXNzaW9ucyBjb2xsZWN0aW9uCi0gICAgICAgIHByaXZhdGUgUGVybWlzc2lvbkNvbGxlY3Rpb24gYWxsUGVybWlzc2lvbnM7Ci0KLSAgICAgICAgLy8gVGhlIEFsbFBlcm1pc3Npb24gcGVybWlzc2lvbgotICAgICAgICBwcml2YXRlIFBlcm1pc3Npb24gYWxsUGVybWlzc2lvbiA9IG5ldyBBbGxQZXJtaXNzaW9uKCk7Ci0KLSAgICAgICAgRWNsaXBzZVBvbGljeShQb2xpY3kgcG9saWN5LCBVUkxbXSB1cmxzKSB7Ci0gICAgICAgICAgICB0aGlzLnBvbGljeSA9IHBvbGljeTsKLSAgICAgICAgICAgIHRoaXMudXJscyA9IHVybHM7Ci0gICAgICAgICAgICBhbGxQZXJtaXNzaW9ucyA9IG5ldyBQZXJtaXNzaW9uQ29sbGVjdGlvbigpIHsKLSAgICAgICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzMjU4MTMxMzQ5NDk0NzA4Mjc3TDsKLQotICAgICAgICAgICAgICAgIC8vIEEgc2ltcGxlIFBlcm1pc3Npb25Db2xsZWN0aW9uIHRoYXQgb25seSBoYXMgQWxsUGVybWlzc2lvbgotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFkZChQZXJtaXNzaW9uIHBlcm1pc3Npb24pIHsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBpbXBsaWVzKFBlcm1pc3Npb24gcGVybWlzc2lvbikgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgRW51bWVyYXRpb24gZWxlbWVudHMoKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRW51bWVyYXRpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgY3VyID0gMDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTW9yZUVsZW1lbnRzKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjdXIgPCAxOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IG5leHRFbGVtZW50KCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXIgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXIgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWxsUGVybWlzc2lvbjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFBlcm1pc3Npb25Db2xsZWN0aW9uIGdldFBlcm1pc3Npb25zKENvZGVTb3VyY2UgY29kZXNvdXJjZSkgewotICAgICAgICAgICAgaWYgKGNvbnRhaW5zKGNvZGVzb3VyY2UuZ2V0TG9jYXRpb24oKSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGFsbFBlcm1pc3Npb25zOwotICAgICAgICAgICAgcmV0dXJuIHBvbGljeSA9PSBudWxsID8gYWxsUGVybWlzc2lvbnMgOiBwb2xpY3kuZ2V0UGVybWlzc2lvbnMoY29kZXNvdXJjZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgUGVybWlzc2lvbkNvbGxlY3Rpb24gZ2V0UGVybWlzc2lvbnMoUHJvdGVjdGlvbkRvbWFpbiBkb21haW4pIHsKLSAgICAgICAgICAgIGlmIChjb250YWlucyhkb21haW4uZ2V0Q29kZVNvdXJjZSgpLmdldExvY2F0aW9uKCkpKQotICAgICAgICAgICAgICAgIHJldHVybiBhbGxQZXJtaXNzaW9uczsKLSAgICAgICAgICAgIHJldHVybiBwb2xpY3kgPT0gbnVsbCA/IGFsbFBlcm1pc3Npb25zIDogcG9saWN5LmdldFBlcm1pc3Npb25zKGRvbWFpbik7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpbXBsaWVzKFByb3RlY3Rpb25Eb21haW4gZG9tYWluLCBQZXJtaXNzaW9uIHBlcm1pc3Npb24pIHsKLSAgICAgICAgICAgIGlmIChjb250YWlucyhkb21haW4uZ2V0Q29kZVNvdXJjZSgpLmdldExvY2F0aW9uKCkpKQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgcmV0dXJuIHBvbGljeSA9PSBudWxsID8gdHJ1ZSA6IHBvbGljeS5pbXBsaWVzKGRvbWFpbiwgcGVybWlzc2lvbik7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotICAgICAgICAgICAgaWYgKHBvbGljeSAhPSBudWxsKQotICAgICAgICAgICAgICAgIHBvbGljeS5yZWZyZXNoKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gY29udGFpbnMoVVJMIHVybCkgewotICAgICAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoaXMgVVJMIGlzIGluIG91ciBzZXQgb2YgVVJMcyB0byBnaXZlIEFsbFBlcm1pc3Npb25zIHRvLgotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB1cmxzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgLy8gV2UgZG8gc2ltcGxlIGVxdWFscyB0ZXN0IGhlcmUgYmVjYXVzZSB3ZSBhc3N1bWUgdGhlIFVSTHMgd2lsbCBiZSB0aGUgc2FtZSBvYmplY3RzLgotICAgICAgICAgICAgICAgIGlmICh1cmxzW2ldID09IHVybCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIFN0YXJ0dXBDbGFzc0xvYWRlciBleHRlbmRzIFVSTENsYXNzTG9hZGVyIHsKLQotICAgICAgICBwdWJsaWMgU3RhcnR1cENsYXNzTG9hZGVyKFVSTFtdIHVybHMpIHsKLSAgICAgICAgICAgIHN1cGVyKHVybHMpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0YXJ0dXBDbGFzc0xvYWRlcihVUkxbXSB1cmxzLCBDbGFzc0xvYWRlciBwYXJlbnQpIHsKLSAgICAgICAgICAgIHN1cGVyKHVybHMsIHBhcmVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RhcnR1cENsYXNzTG9hZGVyKFVSTFtdIHVybHMsIENsYXNzTG9hZGVyIHBhcmVudCwgVVJMU3RyZWFtSGFuZGxlckZhY3RvcnkgZmFjdG9yeSkgewotICAgICAgICAgICAgc3VwZXIodXJscywgcGFyZW50LCBmYWN0b3J5KTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCBTdHJpbmcgZmluZExpYnJhcnkoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgICAgIGlmIChleHRlbnNpb25QYXRocyA9PSAgbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIuZmluZExpYnJhcnkobmFtZSk7Ci0gICAgICAgICAgICBTdHJpbmcgbGliTmFtZSA9IFN5c3RlbS5tYXBMaWJyYXJ5TmFtZShuYW1lKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9uUGF0aHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBGaWxlIGxpYkZpbGUgPSBuZXcgRmlsZShleHRlbnNpb25QYXRoc1tpXSwgbGliTmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGxpYkZpbGUuaXNGaWxlKCkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBsaWJGaWxlLmdldEFic29sdXRlUGF0aCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmZpbmRMaWJyYXJ5KG5hbWUpOwotICAgICAgICB9ICAgICAgIAotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL3NyYy9vcmcvZWNsaXBzZS9jb3JlL2xhdW5jaGVyL1dlYlN0YXJ0TWFpbi5qYXZhIGIvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vc3JjL29yZy9lY2xpcHNlL2NvcmUvbGF1bmNoZXIvV2ViU3RhcnRNYWluLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjNTM3MGIuLjAwMDAwMDAKLS0tIGEvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vc3JjL29yZy9lY2xpcHNlL2NvcmUvbGF1bmNoZXIvV2ViU3RhcnRNYWluLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmNvcmUubGF1bmNoZXI7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS51dGlsLmphci5KYXJGaWxlOwotaW1wb3J0IGphdmEudXRpbC5qYXIuTWFuaWZlc3Q7Ci0KLS8qKgotICogVGhlIGxhdW5jaGVyIG90IHN0YXJ0IGVjbGlwc2UgdXNpbmcgd2Vic3RhcnQuCi0gKiBUbyB1c2UgdGhpcyBsYXVuY2hlciwgdGhlIGNsaWVudCBtdXN0IGFjY2VwdCB0byBnaXZlIGFsbCBzZWN1cml0eSBwZXJtaXNzaW9ucy4gCi0gKi8KLS8vVGhlIGJ1bmRsZXMgYXJlIGRpc2NvdmVyZWQgYnkgZmluZGluZyBhbGwgdGhlIGphcnMgb24gdGhlIGNsYXNzcGF0aC4gVGhlbiB0aGV5IGFyZSBhZGRlZCB3aXRoIHRoZWlyIGZ1bGwgcGF0aCB0byB0aGUgb3NnaS5idW5kbGVzIGxpc3QuCi1wdWJsaWMgY2xhc3MgV2ViU3RhcnRNYWluIGV4dGVuZHMgTWFpbiB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfV0VCU1RBUlRfQVVUT01BVElDX0lOU1RBTExBVElPTiA9ICJlY2xpcHNlLndlYnN0YXJ0LmF1dG9tYXRpY0luc3RhbGxhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9PU0dJX0JVTkRMRVMgPSAib3JnLmVjbGlwc2UuZXF1aW5veC5jb21tb25AMjpzdGFydCwgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lQHN0YXJ0IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX09TR0lfQlVORExFUyA9ICJvc2dpLmJ1bmRsZXMiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfV0VCU1RBUlRfUFJFQ0lTRV9CVU5ETEVJRCA9ICJlY2xpcHNlLndlYnN0YXJ0LnByZWNpc2VCdW5kbGVJZCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQV82ID0gIjEuNiI7Ci0JCi0JcHJpdmF0ZSBTdHJpbmdbXSBhbGxKYXJzID0gbnVsbDsgCS8vTGlzdCBhbGwgdGhlIGphcnMgdGhhdCBhcmUgb24gdGhlIGNsYXNzcGF0aAotCXByaXZhdGUgTWFwIGJ1bmRsZUxpc3QgPSBudWxsOyAvL01hcCBhbiBlbnRyeSAodGhlIHBhcnQgYmVmb3JlIHRoZSBAKSBmcm9tIHRoZSBvc2dpLmJ1bmRsZXMgbGlzdCB0byBhIGxpc3Qgb2YgVVJMcy4gSWU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSAtLT4gZmlsZTpjOi9mb28vb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lXzMuMS4wLy4uLiwgZmlsZTpjOi9iYXIvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLy4uLiAKLQlwcml2YXRlIE1hcCBidW5kbGVTdGFydEluZm8gPSBudWxsOyAvL0tlZXAgdHJhY2sgb2YgdGhlIHN0YXJ0IGxldmVsIGluZm8gZm9yIGVhY2ggYnVuZGxlIGZyb20gdGhlIG9zZ2kuYnVuZGxlIGxpc3QuCi0JCi0JcHJpdmF0ZSBib29sZWFuIHByZWNpc2VJZEV4dHJhY3Rpb24gPSBmYWxzZTsgLy9GbGFnIGluZGljYXRpbmcgaWYgdGhlIGV4dHJhY3Rpb24gb2YgdGhlIGlkIG11c3QgYmUgZG9uZSBieSBsb29raW5nIGF0IGJ1bmRsZSBpZHMuCi0JCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlTeXN0ZW0uc2V0U2VjdXJpdHlNYW5hZ2VyKG51bGwpOyAvL1RPRE8gSGFjayBzbyB0aGF0IHdoZW4gdGhlIGNsYXNzbG9hZGVyIGxvYWRpbmcgdGhlIGZ3ayBpcyBjcmVhdGVkIHdlIGRvbid0IGhhdmUgZnVubnkgcGVybWlzc2lvbnMuIFRoaXMgc2hvdWxkIGJlIHJldmlzaXRlZC4gCi0JCWludCByZXN1bHQgPSBuZXcgV2ViU3RhcnRNYWluKCkucnVuKGFyZ3MpOwotCQlTeXN0ZW0uZXhpdChyZXN1bHQpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXREZWZhdWx0QnVuZGxlcygpIHsKLQkJaWYgKFN5c3RlbS5nZXRQcm9wZXJ0eShQUk9QX09TR0lfQlVORExFUykgIT0gbnVsbCkKLQkJCXJldHVybjsKLQkJU3lzdGVtLmdldFByb3BlcnRpZXMoKS5wdXQoUFJPUF9PU0dJX0JVTkRMRVMsIERFRkFVTFRfT1NHSV9CVU5ETEVTKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBiYXNpY1J1bihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcHJlY2lzZUlkRXh0cmFjdGlvbiA9IEJvb2xlYW4uZ2V0Qm9vbGVhbihQUk9QX1dFQlNUQVJUX1BSRUNJU0VfQlVORExFSUQpOwotCQlpZiAoY2hlY2tWZXJzaW9uKFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS52ZXJzaW9uIiksIEpBVkFfNikpCi0JCQlwcmVjaXNlSWRFeHRyYWN0aW9uID0gdHJ1ZTsKLQkJc2V0RGVmYXVsdEJ1bmRsZXMoKTsKLQkJYWRkT1NHaUJ1bmRsZSgpOwotCQlpbml0aWFsaXplQnVuZGxlTGlzdFN0cnVjdHVyZSgpOwotCQltYXBVUkxzVG9CdW5kbGVMaXN0KCk7Ci0JCS8vU2V0IHRoZSBmd2sgbG9jYXRpb24gc2luY2UgdGhlIHJlZ3VsYXIgbG9va3VwIHdvdWxkIG5vdCBmaW5kIGl0Ci0JCVN0cmluZyBmd2tVUkwgPSBzZWFyY2hGb3IoZnJhbWV3b3JrLCBudWxsKTsKLQkJU3lzdGVtLmdldFByb3BlcnRpZXMoKS5wdXQoUFJPUF9GUkFNRVdPUkssIGZ3a1VSTCk7Ci0JCXN1cGVyLmJhc2ljUnVuKGFyZ3MpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRPU0dpQnVuZGxlKCkgewotCQkvL0FkZCBvc2dpIHRvIHRoZSBidW5kbGUgbGlzdCwgc28gd2UgY2FuIGJlbmVmaWNpYXRlIG9mIHRoZSBpbmZyYXN0cnVjdHVyZSB0byBmaW5kIGl0cyBsb2NhdGlvbi4gSXQgd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIGxpc3QgbGF0ZXIgb24gCi0JCVN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkucHV0KFBST1BfT1NHSV9CVU5ETEVTLCBTeXN0ZW0uZ2V0UHJvcGVydHkoUFJPUF9PU0dJX0JVTkRMRVMpICsgJywnICsgZnJhbWV3b3JrKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVVJMW10gZ2V0Qm9vdFBhdGgoU3RyaW5nIGJhc2UpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVVSTFtdIHJlc3VsdCA9IHN1cGVyLmdldEJvb3RQYXRoKGJhc2UpOwotCQlidWlsZE9TR2lCdW5kbGVMaXN0KCk7Ci0JCWNsZWFudXAoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKgotCSAqIE51bGwgb3V0IGFsbCB0aGUgZmllbGRzIGNvbnRhaW5pbmcgZGF0YSAKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2xlYW51cCgpIHsKLQkJYWxsSmFycyA9IG51bGw7Ci0JCWJ1bmRsZUxpc3QgPSBudWxsOwotCQlidW5kbGVTdGFydEluZm8gPSBudWxsOwotCX0KLQotCS8qCi0JICogRmluZCB0aGUgdGFyZ2V0IGJ1bmRsZSBhbW9uZyBhbGwgdGhlIGphcnMgdGhhdCBhcmUgb24gdGhlIGNsYXNzcGF0aC4KLQkgKiBUaGUgc3RhcnQgcGFyYW1ldGVyIGlzIG5vdCB1c2VkIGluIHRoaXMgY29udGV4dAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgc2VhcmNoRm9yKGZpbmFsIFN0cmluZyB0YXJnZXQsIFN0cmluZyBzdGFydCkgewotCQlBcnJheUxpc3QgbWF0Y2hlcyA9IChBcnJheUxpc3QpIGJ1bmRsZUxpc3QuZ2V0KHRhcmdldCk7Ci0JCWludCBudW1iZXJPZlVSTHMgPSBtYXRjaGVzLnNpemUoKTsKLQkJaWYgKG51bWJlck9mVVJMcyA9PSAxKSB7Ci0JCQlyZXR1cm4gZXh0cmFjdElubmVyVVJMKChTdHJpbmcpIG1hdGNoZXMuZ2V0KDApKTsKLQkJfQotCQlpZiAobnVtYmVyT2ZVUkxzID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nIHVybHNbXSA9IG5ldyBTdHJpbmdbbnVtYmVyT2ZVUkxzXTsKLQkJcmV0dXJuIGV4dHJhY3RJbm5lclVSTCh1cmxzW2ZpbmRNYXgoKFN0cmluZ1tdKSBtYXRjaGVzLnRvQXJyYXkodXJscykpXSk7Ci0JfQotCi0JLyogCi0JICogR2V0IGFsbCB0aGUgamFycyBhdmFpbGFibGUgb24gdGhlIHdlYnN0YXJ0IGNsYXNzcGF0aAotCSAqLwotCXByaXZhdGUgU3RyaW5nW10gZ2V0QWxsSmFycygpIHsKLQkJaWYgKGFsbEphcnMgIT0gbnVsbCkKLQkJCXJldHVybiBhbGxKYXJzOwotCi0JCUFycmF5TGlzdCBjb2xsZWN0b3IgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXRyeSB7Ci0JCQlFbnVtZXJhdGlvbiByZXNvdXJjZXMgPSBXZWJTdGFydE1haW4uY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKS5nZXRSZXNvdXJjZXMoSmFyRmlsZS5NQU5JRkVTVF9OQU1FKTsKLQkJCXdoaWxlIChyZXNvdXJjZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCQljb2xsZWN0b3IuYWRkKCgoVVJMKSByZXNvdXJjZXMubmV4dEVsZW1lbnQoKSkudG9FeHRlcm5hbEZvcm0oKSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJYWxsSmFycyA9IG5ldyBTdHJpbmdbY29sbGVjdG9yLnNpemUoKV07Ci0JCWNvbGxlY3Rvci50b0FycmF5KGFsbEphcnMpOwotCQlpZiAoZGVidWcpCi0JCQlwcmludEFycmF5KCJKYXJzIGZvdW5kIG9uIHRoZSB3ZWJzdGFydCBwYXRoOlxuIiwgYWxsSmFycyk7IC8vJE5PTi0vLyROT04tTkxTLTEkCi0KLQkJcmV0dXJuIGFsbEphcnM7Ci0JfQotCi0JLyoKLQkgKiBFeHRyYWN0IHRoZSBpbm5lciBVUkwgZnJvbSBhIHN0cmluZyByZXByZXNlbnRpbmcgYSBKQVIgdXJsIHN0cmluZy4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBleHRyYWN0SW5uZXJVUkwoU3RyaW5nIHVybCkgewotCQlpZiAodXJsLnN0YXJ0c1dpdGgoSkFSX1NDSEVNRSkpIHsKLQkJCXVybCA9IHVybC5zdWJzdHJpbmcodXJsLmluZGV4T2YoSkFSX1NDSEVNRSkgKyA0KTsKLQkJfQotCQlpbnQgbGFzdEJhbmcgPSB1cmwubGFzdEluZGV4T2YoJyEnKTsKLQkJaWYgKGxhc3RCYW5nICE9IC0xKSB7Ci0JCQl1cmwgPSB1cmwuc3Vic3RyaW5nKDAsIGxhc3RCYW5nKTsKLQkJfQotCQlyZXR1cm4gZGVjb2RlKHVybCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50QXJyYXkoU3RyaW5nIGhlYWRlciwgU3RyaW5nW10gdmFsdWVzKSB7Ci0JCVN5c3RlbS5lcnIucHJpbnRsbihoZWFkZXIpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewotCQkJU3lzdGVtLmVyci5wcmludGxuKCJcdCIgKyB2YWx1ZXNbaV0pOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQotCS8qCi0JICogSW5pdGlhbGl6ZSB0aGUgZGF0YSBzdHJ1Y3R1cmUgY29ycmVzcG9uZGluZyB0byB0aGUgb3NnaS5idW5kbGVzIGxpc3QKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUJ1bmRsZUxpc3RTdHJ1Y3R1cmUoKSB7Ci0JCWZpbmFsIGNoYXIgU1RBUlRMRVZFTF9TRVBBUkFUT1IgPSAnQCc7Ci0KLQkJLy9JbiB3ZWJzdGFydCB0aGUgYnVuZGxlcyBsaXN0IGNhbiBvbmx5IGNvbnRhaW4gYnVuZGxlIG5hbWVzIHdpdGggb3Igd2l0aG91dCBhIHZlcnNpb24uCi0JCVN0cmluZyBwcm9wID0gU3lzdGVtLmdldFByb3BlcnR5KFBST1BfT1NHSV9CVU5ETEVTKTsKLQkJaWYgKHByb3AgPT0gbnVsbCB8fCBwcm9wLnRyaW0oKS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCWJ1bmRsZUxpc3QgPSBuZXcgSGFzaE1hcCgwKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWJ1bmRsZUxpc3QgPSBuZXcgSGFzaE1hcCgxMCk7Ci0JCWJ1bmRsZVN0YXJ0SW5mbyA9IG5ldyBIYXNoTWFwKDEwKTsKLQkJU3RyaW5nVG9rZW5pemVyIHRva2VucyA9IG5ldyBTdHJpbmdUb2tlbml6ZXIocHJvcCwgIiwiKTsgLy8kTk9OLU5MUy0xJAotCQl3aGlsZSAodG9rZW5zLmhhc01vcmVUb2tlbnMoKSkgewotCQkJU3RyaW5nIHRva2VuID0gdG9rZW5zLm5leHRUb2tlbigpLnRyaW0oKTsKLQkJCVN0cmluZyBidW5kbGVJZCA9IHRva2VuOwotCQkJaWYgKHRva2VuLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLQkJCQljb250aW51ZTsKLQkJCWludCBzdGFydExldmVsU2VwYXJhdG9yOwotCQkJaWYgKChzdGFydExldmVsU2VwYXJhdG9yID0gdG9rZW4ubGFzdEluZGV4T2YoU1RBUlRMRVZFTF9TRVBBUkFUT1IpKSAhPSAtMSkgewotCQkJCWJ1bmRsZUlkID0gdG9rZW4uc3Vic3RyaW5nKDAsIHN0YXJ0TGV2ZWxTZXBhcmF0b3IpOwotCQkJCWJ1bmRsZVN0YXJ0SW5mby5wdXQoYnVuZGxlSWQsIHRva2VuLnN1YnN0cmluZyhzdGFydExldmVsU2VwYXJhdG9yKSk7Ci0JCQl9Ci0JCQlidW5kbGVMaXN0LnB1dChidW5kbGVJZCwgbmV3IEFycmF5TGlzdCgxKSk7IC8vIHB1dCBhIGxpc3Qgd2l0aCBvbmUgZWxlbWVudCBhcyBpdCBpcyBsaWtlbHkgdGhhdCB0aGUgZWxlbWVudCB3aWxsIGJlIHByZXNlbnQKLQkJfQotCQkKLQl9Ci0KLQkvKgotCSAqIEFzc29jaWF0ZSB1cmxzIGZyb20gdGhlIGxpc3Qgb2YgamFycyB3aXRoIGEgYnVuZGxlIGZyb20gdGhlIGJ1bmRsZSBsaXN0Ci0JICovCi0JcHJpdmF0ZSB2b2lkIG1hcFVSTHNUb0J1bmRsZUxpc3QoKSB7Ci0JCVN0cmluZ1tdIGFsbEphcnMgPSBnZXRBbGxKYXJzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYWxsSmFycy5sZW5ndGg7IGkrKykgewotCQkJT2JqZWN0W10gYnVuZGxlSW5mbyA9IGV4dHJhY3RCdW5kbGVJZChhbGxKYXJzW2ldKTsKLQkJCWlmIChidW5kbGVJbmZvID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQlTdHJpbmcgYnNuID0gKFN0cmluZykgYnVuZGxlSW5mb1swXTsKLQkJCWlmIChic24gPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCVN0cmluZyB2ZXJzaW9uID0gKFN0cmluZykgYnVuZGxlSW5mb1sxXTsKLQkJCUFycmF5TGlzdCBidW5kbGVVUkxzID0gbnVsbDsKLQkJCWlmIChic24gIT0gbnVsbCAmJiB2ZXJzaW9uICE9IG51bGwpIHsKLQkJCQlidW5kbGVVUkxzID0gKEFycmF5TGlzdCkgYnVuZGxlTGlzdC5nZXQoYnNuKyAnXycgKyB2ZXJzaW9uKTsKLQkJCX0KLQkJCQotCQkJaWYgKGJ1bmRsZVVSTHMgPT0gbnVsbCkgewotCQkJCWJ1bmRsZVVSTHMgPSAoQXJyYXlMaXN0KSBidW5kbGVMaXN0LmdldChic24pOwotCQkJCWlmIChidW5kbGVVUkxzID09IG51bGwpCi0JCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJYnVuZGxlVVJMcy5hZGQoYWxsSmFyc1tpXSk7Ci0JCQlhbGxKYXJzW2ldID0gbnVsbDsgLy9SZW1vdmUgdGhlIGVudHJ5IGZyb20gdGhlIGxpc3QKLQkJfQotCX0KLQotCS8qCi0JICogcmV0dXJuIGEgc3RyaW5nIG9mIHRoZSBmb3JtIDxidW5kbGU+Xzx2ZXJzaW9uPgotCSAqLwotCXByaXZhdGUgT2JqZWN0W10gZXh0cmFjdEJ1bmRsZUlkKFN0cmluZyB1cmwpIHsKLQkJaWYgKHByZWNpc2VJZEV4dHJhY3Rpb24pCi0JCQlyZXR1cm4gZXh0cmFjdEJ1bmRsZUlkRnJvbU1hbmlmZXN0KHVybCk7Ci0JCWVsc2UgCi0JCQlyZXR1cm4gZXh0cmFjdEJ1bmRsZUlkRnJvbUJ1bmRsZVVSTCh1cmwpOwotCX0KLQotCXByaXZhdGUgT2JqZWN0W10gZXh0cmFjdEJ1bmRsZUlkRnJvbU1hbmlmZXN0KFN0cmluZyB1cmwpIHsKLQkJZmluYWwgU3RyaW5nIEJVTkRMRV9TWU1CT0xJQ05BTUUgPSAiQnVuZGxlLVN5bWJvbGljTmFtZSI7IC8vJE5PTi1OTFMtMSQKLQkJZmluYWwgU3RyaW5nIEJVTkRMRV9WRVJTSU9OID0gIkJ1bmRsZS1WZXJzaW9uIjsgLy8kTk9OLU5MUy0xJAotCQkKLQkJTWFuaWZlc3QgbWY7Ci0JCXRyeSB7Ci0JCQltZiA9IG5ldyBNYW5pZmVzdChuZXcgVVJMKHVybCkub3BlblN0cmVhbSgpKTsgCi0JCQlTdHJpbmcgc3ltYm9saWNOYW1lU3RyaW5nID0gbWYuZ2V0TWFpbkF0dHJpYnV0ZXMoKS5nZXRWYWx1ZShCVU5ETEVfU1lNQk9MSUNOQU1FKTsKLQkJCWlmIChzeW1ib2xpY05hbWVTdHJpbmc9PW51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQkKLQkJCVN0cmluZyBidW5kbGVWZXJzaW9uID0gbWYuZ2V0TWFpbkF0dHJpYnV0ZXMoKS5nZXRWYWx1ZShCVU5ETEVfVkVSU0lPTik7Ci0JCQkKLQkJCWludCBwb3MgPSBzeW1ib2xpY05hbWVTdHJpbmcubGFzdEluZGV4T2YoJzsnKTsKLQkJCWlmIChwb3MgIT0gLTEpCi0JCQkJcmV0dXJuIG5ldyBPYmplY3RbXSB7c3ltYm9saWNOYW1lU3RyaW5nLnN1YnN0cmluZygwLCBwb3MpLCBidW5kbGVWZXJzaW9ufTsKLQkJCXJldHVybiBuZXcgT2JqZWN0W10ge3N5bWJvbGljTmFtZVN0cmluZywgYnVuZGxlVmVyc2lvbn07Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJLy9JZ25vcmUKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkge2UucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkvL0lnbm9yZQotCQl9Ci0JCXJldHVybiBudWxsOwotCi0JfQotCi0JcHJpdmF0ZSBPYmplY3RbXSBleHRyYWN0QnVuZGxlSWRGcm9tQnVuZGxlVVJMKFN0cmluZyB1cmwpIHsKLQkJLy9GaXJzdCBleHRyYWN0IHRoZSByZWxldmFudCBwYXJ0IG9mIHRoZSBVUkwKLQkJaW50IGxhc3RCYW5nID0gdXJsLmxhc3RJbmRleE9mKCchJyk7Ci0JCWlmIChsYXN0QmFuZyA9PSAtMSkKLQkJCXJldHVybiBudWxsOwotCQlib29sZWFuIGphclN1ZmZpeCA9IHVybC5yZWdpb25NYXRjaGVzKHRydWUsIGxhc3RCYW5nIC0gNCwgIi5qYXIiLCAwLCA0KTsgLy8kTk9OLU5MUy0xJAotCQlpbnQgYnVuZGxlSWRTdGFydCA9IHVybC5sYXN0SW5kZXhPZignLycsIGxhc3RCYW5nKTsKLQkJU3RyaW5nIGZpbGVOYW1lID0gdXJsLnN1YnN0cmluZyhidW5kbGVJZFN0YXJ0ICsgMywgbGFzdEJhbmcgLSAoamFyU3VmZml4ID8gNCA6IDApKTsgLy8gKyAzIGJlY2F1c2UgVVJMcyBmcm9tIHdlYnN0YXJ0IGhhdmUgYSBmdW5ueSBwcmVmaXgKLQkJCi0JCS8vU2VwYXJhdGUgdGhlIHZlcnNpb24gZnJvbSB0aGUgYnNuCi0JCVN0cmluZyBic24gPSBudWxsOwotCQlTdHJpbmcgdmVyc2lvbiA9IG51bGw7Ci0JCWludCB1bmRlclNjb3JlID0gZmlsZU5hbWUuaW5kZXhPZignXycpOwotCQl3aGlsZSAodW5kZXJTY29yZSA+PSAwKSB7Ci0JCQlic24gPSBmaWxlTmFtZS5zdWJzdHJpbmcoMCwgdW5kZXJTY29yZSk7Ci0JCQl2ZXJzaW9uID0gZmlsZU5hbWUuc3Vic3RyaW5nKHVuZGVyU2NvcmUgKyAxKTsKLQkJCWlmICghIGlzVmFsaWRWZXJzaW9uKHZlcnNpb24pKSB7Ci0JCQkJdW5kZXJTY29yZSA9IGZpbGVOYW1lLmluZGV4T2YoJ18nLCB1bmRlclNjb3JlICsgMSk7Ci0JCQl9IGVsc2UgewotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiBuZXcgT2JqZWN0W10ge2JzbiwgdmVyc2lvbn07Ci0JfQotCQotCXByaXZhdGUgdm9pZCBidWlsZE9TR2lCdW5kbGVMaXN0KCkgewotCQkvL1JlbW92ZSB0aGUgZnJhbWV3b3JrIGZyb20gdGhlIGJ1bmRsZSBsaXN0IGJlY2F1c2UgaXQgZG9lcyBub3QgbmVlZCB0byBiZSBpbnN0YWxsZWQuIFNlZSBhZGRPU0dpQnVuZGxlCi0JCWJ1bmRsZUxpc3QucmVtb3ZlKGZyYW1ld29yayk7Ci0KLQkJU3RyaW5nW10gamFyc09uQ2xhc3NwYXRoID0gZ2V0QWxsSmFycygpOwotCQlTdHJpbmdCdWZmZXIgZmluYWxCdW5kbGVMaXN0ID0gbmV3IFN0cmluZ0J1ZmZlcihqYXJzT25DbGFzc3BhdGgubGVuZ3RoICogMjUpOwotCQkKLQkJLy9BZGQgdGhlIGJ1bmRsZXMgZnJvbSB0aGUgYnVuZGxlIGxpc3QuCi0JCUNvbGxlY3Rpb24gYWxsU2VsZWN0ZWRCdW5kbGVzID0gYnVuZGxlTGlzdC5lbnRyeVNldCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhbGxTZWxlY3RlZEJ1bmRsZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCUFycmF5TGlzdCBtYXRjaGVzID0gKEFycmF5TGlzdCkgZW50cnkuZ2V0VmFsdWUoKTsKLQkJCWludCBudW1iZXJPZlVSTHMgPSBtYXRjaGVzLnNpemUoKTsKLQkJCQotCQkJLy9HZXQgdGhlIHN0YXJ0IGluZm8KLQkJCVN0cmluZyBzdGFydEluZm8gPSAoU3RyaW5nKSBidW5kbGVTdGFydEluZm8uZ2V0KGVudHJ5LmdldEtleSgpKTsKLQkJCWlmIChzdGFydEluZm8gPT0gbnVsbCkKLQkJCQlzdGFydEluZm8gPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCi0JCQlpZiAobnVtYmVyT2ZVUkxzID09IDEpIHsKLQkJCQlmaW5hbEJ1bmRsZUxpc3QuYXBwZW5kKFJFRkVSRU5DRV9TQ0hFTUUpLmFwcGVuZChleHRyYWN0SW5uZXJVUkwoKFN0cmluZykgbWF0Y2hlcy5nZXQoMCkpKS5hcHBlbmQoc3RhcnRJbmZvKS5hcHBlbmQoJywnKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmIChudW1iZXJPZlVSTHMgPT0gMCkKLQkJCQljb250aW51ZTsKLQkJCVN0cmluZyB1cmxzW10gPSBuZXcgU3RyaW5nW251bWJlck9mVVJMc107Ci0JCQlpbnQgZm91bmQgPSBmaW5kTWF4KChTdHJpbmdbXSkgbWF0Y2hlcy50b0FycmF5KHVybHMpKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdXJscy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChpICE9IGZvdW5kKQotCQkJCQljb250aW51ZTsKLQkJCQlmaW5hbEJ1bmRsZUxpc3QuYXBwZW5kKFJFRkVSRU5DRV9TQ0hFTUUpLmFwcGVuZChleHRyYWN0SW5uZXJVUkwoKFN0cmluZykgdXJsc1tmb3VuZF0pKS5hcHBlbmQoc3RhcnRJbmZvKS5hcHBlbmQoJywnKTsKLQkJCX0KLQkJfQotCQkKLQkJLy9BZGQgYWxsIHRoZSBvdGhlciBidW5kbGVzIGlmIHJlcXVpcmVkIC0gdGhlIGNvbW1vbiBjYXNlIGlzIHRvIGFkZCB0aG9zZQotCQlpZiAoISBCb29sZWFuLkZBTFNFLnRvU3RyaW5nKCkuZXF1YWxzSWdub3JlQ2FzZShTeXN0ZW0uZ2V0UHJvcGVydGllcygpLmdldFByb3BlcnR5KFBST1BfV0VCU1RBUlRfQVVUT01BVElDX0lOU1RBTExBVElPTikpKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGphcnNPbkNsYXNzcGF0aC5sZW5ndGg7IGkrKykgewotCQkJCWlmIChqYXJzT25DbGFzc3BhdGhbaV0gIT0gbnVsbCkKLQkJCQkJZmluYWxCdW5kbGVMaXN0LmFwcGVuZChSRUZFUkVOQ0VfU0NIRU1FKS5hcHBlbmQoZXh0cmFjdElubmVyVVJMKGphcnNPbkNsYXNzcGF0aFtpXSkpLmFwcGVuZCgnLCcpOwotCQkJfQkJCQotCQl9Ci0KLQkJU3lzdGVtLmdldFByb3BlcnRpZXMoKS5wdXQoUFJPUF9PU0dJX0JVTkRMRVMsIGZpbmFsQnVuZGxlTGlzdC50b1N0cmluZygpKTsKLQkJaWYgKGRlYnVnKQotCQkJbG9nKGZpbmFsQnVuZGxlTGlzdC50b1N0cmluZygpKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNWYWxpZFZlcnNpb24oU3RyaW5nIHZlcnNpb24pIHsKLQkJaW50IG1ham9yID0gMDsKLQkJaW50IG1pbm9yID0gMDsKLQkJaW50IG1pY3JvID0gMDsKLQkJU3RyaW5nIHF1YWxpZmllciA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWZpbmFsIFN0cmluZyBTRVBBUkFUT1IgPSAiLiI7Ci0JCQotCQl0cnkgewotCQkJU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcih2ZXJzaW9uLCBTRVBBUkFUT1IsIHRydWUpOwotCQkJbWFqb3IgPSBJbnRlZ2VyLnBhcnNlSW50KHN0Lm5leHRUb2tlbigpKTsKLQkKLQkJCWlmIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQlzdC5uZXh0VG9rZW4oKTsgLy8gY29uc3VtZSBkZWxpbWl0ZXIKLQkJCQltaW5vciA9IEludGVnZXIucGFyc2VJbnQoc3QubmV4dFRva2VuKCkpOwotCQotCQkJCWlmIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQkJc3QubmV4dFRva2VuKCk7IC8vIGNvbnN1bWUgZGVsaW1pdGVyCi0JCQkJCW1pY3JvID0gSW50ZWdlci5wYXJzZUludChzdC5uZXh0VG9rZW4oKSk7Ci0JCi0JCQkJCWlmIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQkJCXN0Lm5leHRUb2tlbigpOyAvLyBjb25zdW1lIGRlbGltaXRlcgotCQkJCQkJcXVhbGlmaWVyID0gc3QubmV4dFRva2VuKCk7Ci0JCi0JCQkJCQlpZiAoc3QuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQljYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQotCQlyZXR1cm4gaXNWYWxpZFZlcnNpb25TZWdtZW50KG1ham9yLCBtaW5vciwgbWljcm8sIHF1YWxpZmllcik7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkVmVyc2lvblNlZ21lbnQoaW50IG1ham9yLCBpbnQgbWlub3IsIGludCBtaWNybywgU3RyaW5nIHF1YWxpZmllcikgewotCQlpZiAobWFqb3IgPCAwKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKG1pbm9yIDwgMCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmIChtaWNybyA8IDApIHsKLQkJfQotCQlpbnQgbGVuZ3RoID0gcXVhbGlmaWVyLmxlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Xy0iLmluZGV4T2YocXVhbGlmaWVyLmNoYXJBdChpKSkgPT0gLTEpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5wbGF0Zm9ybS9zcmMvb3JnL2VjbGlwc2UvY29yZS9sYXVuY2hlci9wYWNrYWdlLmh0bWwgYi9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5wbGF0Zm9ybS9zcmMvb3JnL2VjbGlwc2UvY29yZS9sYXVuY2hlci9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhMmU3Y2UuLjAwMDAwMDAKLS0tIGEvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vc3JjL29yZy9lY2xpcHNlL2NvcmUvbGF1bmNoZXIvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotPCFkb2N0eXBlIGh0bWwgcHVibGljICItLy93M2MvL2R0ZCBodG1sIDQuMCB0cmFuc2l0aW9uYWwvL2VuIj4KLTxodG1sPgotPGhlYWQ+Ci0gICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLSAgIDxtZXRhIG5hbWU9IkF1dGhvciIgY29udGVudD0iSUJNIj4KLSAgIDxtZXRhIG5hbWU9IkdFTkVSQVRPUiIgY29udGVudD0iTW96aWxsYS80Ljc1IFtlbl0gKFdpbmRvd3MgTlQgNS4wOyBVKSBbTmV0c2NhcGVdIj4KLSAgIDx0aXRsZT5QYWNrYWdlLWxldmVsIEphdmFkb2M8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci1MYXVuY2hlcyB0aGUgRWNsaXBzZSBQbGF0Zm9ybS4KLTxoMj4KLVBhY2thZ2UgU3BlY2lmaWNhdGlvbjwvaDI+Ci0KLVRoaXMgcGFja2FnZSBpcyB0aGUgbWFpbiBlbnRyeSBwb2ludCB0byB0aGUgRWNsaXBzZSBQbGF0Zm9ybS4gIFRvIHN0YXJ0IHRoZSBwbGF0Zm9ybSBpbnZva2UgdGhlIE1haW4KLWNsYXNzIGluIHRoaXMgcGFja2FnZS4KLTxicj4mbmJzcDsKLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnNkay8ucHJvamVjdCBiL3BsYXRmb3JtL29yZy5lY2xpcHNlLnNkay8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmU0OThjMi4uMDAwMDAwMAotLS0gYS9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5zZGsvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5zZGs8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5zZGsvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5zZGsvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzYTYwN2YuLjAwMDAwMDAKLS0tIGEvcGxhdGZvcm0vb3JnLmVjbGlwc2Uuc2RrL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLnNkazsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMy4zLjAucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS51aTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuaGVscC51aTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuaGVscC5iYXNlO2J1bmRsZS12ZXJzaW9uPSJbMy4xLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS5jaGVhdHNoZWV0cztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkuaWRlLmFwcGxpY2F0aW9uO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjAsMi4wLjApIgotRWNsaXBzZS1BdXRvU3RhcnQ6IHRydWUKZGlmZiAtLWdpdCBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnNkay9hYm91dC5odG1sIGIvcGxhdGZvcm0vb3JnLmVjbGlwc2Uuc2RrL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2MDIzMzAuLjAwMDAwMDAKLS0tIGEvcGxhdGZvcm0vb3JnLmVjbGlwc2Uuc2RrL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+SnVuZSAyLCAyMDA2PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGxhdGZvcm0vb3JnLmVjbGlwc2Uuc2RrL2Fib3V0LmluaSBiL3BsYXRmb3JtL29yZy5lY2xpcHNlLnNkay9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4ODg5NmIuLjAwMDAwMDAKLS0tIGEvcGxhdGZvcm0vb3JnLmVjbGlwc2Uuc2RrL2Fib3V0LmluaQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSMgYWJvdXQuaW5pCi0jIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZmVhdHVyZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcwotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0jIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciAiQWJvdXQiIGRpYWxvZyAodHJhbnNsYXRlZCkKLWFib3V0VGV4dD0lYmx1cmIKLQotIyBQcm9wZXJ0eSAid2luZG93SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2luZG93IGljb24gKDE2eDE2KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJmZWF0dXJlSW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gZmVhdHVyZSBpbWFnZSAoMzJ4MzIpCi1mZWF0dXJlSW1hZ2U9ZWNsaXBzZTMyLnBuZwotCi0jIFByb3BlcnR5ICJhYm91dEltYWdlIiBjb250YWlucyBwYXRoIHRvIHByb2R1Y3QgaW1hZ2UgKDUwMHgzMzAgb3IgMTE1eDE2NCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiYXBwTmFtZSIgY29udGFpbnMgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gKHRyYW5zbGF0ZWQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgIndlbGNvbWVQYWdlIiBjb250YWlucyBwYXRoIHRvIHdlbGNvbWUgcGFnZSAoc3BlY2lhbCBYTUwtYmFzZWQgZm9ybWF0KQotIyBvcHRpb25hbAotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGVyc3BlY3RpdmUiIGNvbnRhaW5zIHRoZSBpZCBvZiB0aGUgcGVyc3BlY3RpdmUgaW4gd2hpY2ggdGhlCi0jIHdlbGNvbWUgcGFnZSBpcyB0byBiZSBvcGVuZWQuCi0jIG9wdGlvbmFsCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnNkay9hYm91dC5tYXBwaW5ncyBiL3BsYXRmb3JtL29yZy5lY2xpcHNlLnNkay9hYm91dC5tYXBwaW5ncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRkYWFiNC4uMDAwMDAwMAotLS0gYS9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5zZGsvYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MKLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotMD1AYnVpbGRAClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGxhdGZvcm0vb3JnLmVjbGlwc2Uuc2RrL2Fib3V0LnByb3BlcnRpZXMgYi9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5zZGsvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFiYTEzNS4uMDAwMDAwMAotLS0gYS9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5zZGsvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi1ibHVyYj1FY2xpcHNlIFByb2plY3QgU0RLXG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDAsIDIwMDcuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlCi0KZGlmZiAtLWdpdCBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnNkay9ib29rLmNzcyBiL3BsYXRmb3JtL29yZy5lY2xpcHNlLnNkay9ib29rLmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJlY2M5ZS4uMDAwMDAwMAotLS0gYS9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5zZGsvYm9vay5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotUC5Db2RlIHsKLQlkaXNwbGF5OiBibG9jazsKLQl0ZXh0LWFsaWduOiBsZWZ0OwotCXRleHQtaW5kZW50OiAwLjAwcHQ7Ci0JbWFyZ2luLXRvcDogMC4wMDAwMDBwdDsKLQltYXJnaW4tYm90dG9tOiAwLjAwMDAwMHB0OwotCW1hcmdpbi1yaWdodDogMC4wMDAwMDBwdDsKLQltYXJnaW4tbGVmdDogMTVwdDsKLQlmb250LXdlaWdodDogbm9ybWFsOwotCWZvbnQtc3R5bGU6IG5vcm1hbDsKLQljb2xvcjogIzQ0NDRDQzsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0JdmVydGljYWwtYWxpZ246IGJhc2VsaW5lOwotCXRleHQtdHJhbnNmb3JtOiBub25lOwotCWZvbnQtZmFtaWx5OiAiQ291cmllciBOZXciLCBDb3VyaWVyLCBtb25vc3BhY2U7Ci19Ci1INi5DYXB0aW9uRmlnQ29sdW1uIHsKLQlkaXNwbGF5OiBibG9jazsKLQl0ZXh0LWFsaWduOiBsZWZ0OwotCXRleHQtaW5kZW50OiAwLjAwMDAwMHB0OwotCW1hcmdpbi10b3A6IDMuMDAwMDAwcHQ7Ci0JbWFyZ2luLWJvdHRvbTogMTEuMDAwMDAwcHQ7Ci0JbWFyZ2luLXJpZ2h0OiAwLjAwMDAwMHB0OwotCW1hcmdpbi1sZWZ0OiAwLjAwMDAwMHB0OwotCWZvbnQtc2l6ZTogNzUlOwotCWZvbnQtd2VpZ2h0OiBib2xkOwotCWZvbnQtc3R5bGU6IEl0YWxpYzsKLQljb2xvcjogIzAwMDAwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0JdmVydGljYWwtYWxpZ246IGJhc2VsaW5lOwotCXRleHQtdHJhbnNmb3JtOiBub25lOwotfQotUC5Ob3RlIHsKLQlkaXNwbGF5OiBibG9jazsKLQl0ZXh0LWFsaWduOiBsZWZ0OwotCXRleHQtaW5kZW50OiAwcHQ7Ci0JbWFyZ2luLXRvcDogMTkuNTAwMDAwcHQ7Ci0JbWFyZ2luLWJvdHRvbTogMTkuNTAwMDAwcHQ7Ci0JbWFyZ2luLXJpZ2h0OiAwLjAwMDAwMHB0OwotCW1hcmdpbi1sZWZ0OiAzMHB0OwotCWZvbnQtc2l6ZTogMTEwJTsKLQlmb250LXdlaWdodDogbm9ybWFsOwotCWZvbnQtc3R5bGU6IEl0YWxpYzsKLQljb2xvcjogIzAwMDAwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0JdmVydGljYWwtYWxpZ246IGJhc2VsaW5lOwotCXRleHQtdHJhbnNmb3JtOiBub25lOwotfQotRU0uVUlMYWJlbCB7Ci0JZm9udC13ZWlnaHQ6IEJvbGQ7Ci0JZm9udC1zdHlsZTogbm9ybWFsOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLQl2ZXJ0aWNhbC1hbGlnbjogYmFzZWxpbmU7Ci0JdGV4dC10cmFuc2Zvcm06IG5vbmU7Ci19Ci1FTS5Db2RlTmFtZSB7Ci0JZm9udC13ZWlnaHQ6IEJvbGQ7Ci0JZm9udC1zdHlsZTogbm9ybWFsOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLQl2ZXJ0aWNhbC1hbGlnbjogYmFzZWxpbmU7Ci0JdGV4dC10cmFuc2Zvcm06IG5vbmU7Ci0JZm9udC1mYW1pbHk6ICJDb3VyaWVyIE5ldyIsIENvdXJpZXIsIG1vbm9zcGFjZTsKLX0KLVVMLk5hdkxpc3QgewotCW1hcmdpbi1sZWZ0OiAxLjVlbTsKLQlwYWRkaW5nLWxlZnQ6IDBweDsKLQlsaXN0LXN0eWxlLXR5cGU6IG5vbmU7Ci19Ci0KLWJvZHksIGh0bWwgeyBib3JkZXI6IDBweCB9Ci0KLQotLyogZm9sbG93aW5nIGZvbnQgZmFjZSBkZWNsYXJhdGlvbnMgbmVlZCB0byBiZSByZW1vdmVkIGZvciBEQkNTICovCi0KLWJvZHksIGgxLCBoMiwgaDMsIGg0LCBoNSwgaDYsIHAsIHRhYmxlLCB0ZCwgY2FwdGlvbiwgdGgsIHVsLCBvbCwgZGwsIGxpLCBkZCwgZHQge2ZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBjb2xvcjogIzAwMDAwMH0KLXByZSwgY29kZQkJeyBmb250LWZhbWlseTogIkNvdXJpZXIgTmV3IiwgQ291cmllciwgbW9ub3NwYWNlO30KLQotLyogZW5kIGZvbnQgZmFjZSBkZWNsYXJhdGlvbnMgKi8KLQotQG1lZGlhIHByaW50IHsKLQlodG1sIHsgZm9udC1zaXplOiAxMnB0IH0KLX0KLQotYm9keQkgICAgIHsgZm9udC1zaXplOiA4MyU7IGJhY2tncm91bmQ6ICNGRkZGRkY7IG1hcmdpbi1ib3R0b206IDFlbSB9Ci1oMSAgICAgICAgICAgeyBmb250LXNpemU6IDE4MCU7IG1hcmdpbi10b3A6IDVweDsgbWFyZ2luLWJvdHRvbTogMXB4IH0JCi1oMiAgICAgICAgICAgeyBmb250LXNpemU6IDE0MCU7IG1hcmdpbi10b3A6IDI1cHg7IG1hcmdpbi1ib3R0b206IDNweCB9Ci1oMyAgICAgICAgICAgeyBmb250LXNpemU6IDExMCU7IG1hcmdpbi10b3A6IDIwcHg7IG1hcmdpbi1ib3R0b206IDNweCB9Ci1oNCAgICAgICAgICAgeyBmb250LXNpemU6IDEwMCU7IG1hcmdpbi10b3A6IDIwcHg7IG1hcmdpbi1ib3R0b206IDNweDsgZm9udC1zdHlsZTogaXRhbGljIH0KLXAgICAgICAgICAgICB7IG1hcmdpbi10b3A6IDEwcHg7IG1hcmdpbi1ib3R0b206IDEwcHggfQotcHJlICAgICAgICAgIHsgZm9udC1zaXplOiA5MyU7IG1hcmdpbi1sZWZ0OiA2OyBjb2xvcjogIzQ0NDRDQyB9Ci1jb2RlICAgICAgICAgeyBmb250LXNpemU6IDkzJTsgfSAKLXRhYmxlICAgICAgICB7IGZvbnQtc2l6ZTogMTAwJSB9IC8qIG5lZWRlZCBmb3IgcXVpcmtzIG1vZGUgKi8KLWE6bGluawkgICAgIHsgY29sb3I6ICMwMDAwRkYgfQotYTpob3ZlcgkgICAgIHsgY29sb3I6ICMwMDAwODAgfQotYTp2aXNpdGVkICAgIHsgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmUgfQotdWwJICAgICB7IG1hcmdpbi10b3A6IDEwcHg7IG1hcmdpbi1ib3R0b206IDEwcHg7IH0KLWxpCSAgICAgeyBtYXJnaW4tdG9wOiA1cHg7IG1hcmdpbi1ib3R0b206IDVweDsgfSAKLWxpIHAJICAgICB7IG1hcmdpbi10b3A6IDVweDsgbWFyZ2luLWJvdHRvbTogNXB4OyB9Ci1vbAkgICAgIHsgbWFyZ2luLXRvcDogMTBweDsgbWFyZ2luLWJvdHRvbTogMTBweDsgfQotZGwJICAgICB7IG1hcmdpbi10b3A6IDEwcHg7IG1hcmdpbi1ib3R0b206IDEwcHg7IH0KLWR0CSAgICAgeyBtYXJnaW4tdG9wOiA1cHg7IG1hcmdpbi1ib3R0b206IDVweDsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KLWRkCSAgICAgeyBtYXJnaW4tdG9wOiA1cHg7IG1hcmdpbi1ib3R0b206IDVweDsgfQotc3Ryb25nCSAgICAgeyBmb250LXdlaWdodDogYm9sZH0KLWVtCSAgICAgeyBmb250LXN0eWxlOiBpdGFsaWN9Ci12YXIJICAgICB7IGZvbnQtc3R5bGU6IGl0YWxpY30KLWRpdi5yZXZpc2lvbiB7IGJvcmRlci1sZWZ0LXN0eWxlOiBzb2xpZDsgYm9yZGVyLWxlZnQtd2lkdGg6IHRoaW47IAotCQkJCSAgIGJvcmRlci1sZWZ0LWNvbG9yOiAjN0I2OEVFOyBwYWRkaW5nLWxlZnQ6NSB9Ci10aAkgICAgIHsgZm9udC13ZWlnaHQ6IGJvbGQgfQotCi1hLmNvbW1hbmQtbGluayB7Ci19Ci1hLmNvbW1hbmQtbGluayBpbWcgewotCWJvcmRlci13aWR0aDogMHB4OwotCWJvcmRlci1zdHlsZTogbm9uZTsKLQl2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnNkay9idWlsZC5wcm9wZXJ0aWVzIGIvcGxhdGZvcm0vb3JnLmVjbGlwc2Uuc2RrL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5NDQyOGMuLjAwMDAwMDAKLS0tIGEvcGxhdGZvcm0vb3JnLmVjbGlwc2Uuc2RrL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0LmluaSxcCi0gICAgICAgICAgICAgICBhYm91dC5tYXBwaW5ncyxcCi0gICAgICAgICAgICAgICBhYm91dC5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2UucG5nLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2UzMi5wbmcsXAotICAgICAgICAgICAgICAgZWNsaXBzZTQ4LnBuZyxcCi0gICAgICAgICAgICAgICBlY2xpcHNlLmdpZixcCi0gICAgICAgICAgICAgICBlY2xpcHNlMzIuZ2lmLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2U0OC5naWYsXAotICAgICAgICAgICAgICAgZWNsaXBzZV9sZy5naWYsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW5fY3VzdG9taXphdGlvbi5pbmksXAotICAgICAgICAgICAgICAgcGx1Z2luX2N1c3RvbWl6YXRpb24ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYm9vay5jc3MsXAotICAgICAgICAgICAgICAgZGlzYWJsZWRfYm9vay5jc3MsXAotICAgICAgICAgICAgICAgbmFycm93X2Jvb2suY3NzLFwKLSAgICAgICAgICAgICAgIG1hY29zeF9uYXJyb3dfYm9vay5jc3MsXAotICAgICAgICAgICAgICAgaW50cm9EYXRhLnhtbCxcCi0gICAgICAgICAgICAgICBpbnRyby1lY2xpcHNlLnBuZyxcCi0gICAgICAgICAgICAgICBoZWxwRGF0YS54bWwKZGlmZiAtLWdpdCBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnNkay9kaXNhYmxlZF9ib29rLmNzcyBiL3BsYXRmb3JtL29yZy5lY2xpcHNlLnNkay9kaXNhYmxlZF9ib29rLmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFiZDAwNC4uMDAwMDAwMAotLS0gYS9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5zZGsvZGlzYWJsZWRfYm9vay5jc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5zZGsvZWNsaXBzZS5naWYgYi9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5zZGsvZWNsaXBzZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkN2UzMmIuLjAwMDAwMDAKLS0tIGEvcGxhdGZvcm0vb3JnLmVjbGlwc2Uuc2RrL2VjbGlwc2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGxhdGZvcm0vb3JnLmVjbGlwc2Uuc2RrL2VjbGlwc2UucG5nIGIvcGxhdGZvcm0vb3JnLmVjbGlwc2Uuc2RrL2VjbGlwc2UucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWUzYmI1Li4wMDAwMDAwCi0tLSBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnNkay9lY2xpcHNlLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnNkay9lY2xpcHNlMjQuZ2lmIGIvcGxhdGZvcm0vb3JnLmVjbGlwc2Uuc2RrL2VjbGlwc2UyNC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0Mjk2YWMuLjAwMDAwMDAKLS0tIGEvcGxhdGZvcm0vb3JnLmVjbGlwc2Uuc2RrL2VjbGlwc2UyNC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5zZGsvZWNsaXBzZTMyLmdpZiBiL3BsYXRmb3JtL29yZy5lY2xpcHNlLnNkay9lY2xpcHNlMzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTFlY2NiLi4wMDAwMDAwCi0tLSBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnNkay9lY2xpcHNlMzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGxhdGZvcm0vb3JnLmVjbGlwc2Uuc2RrL2VjbGlwc2UzMi5wbmcgYi9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5zZGsvZWNsaXBzZTMyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY4ZmFjMS4uMDAwMDAwMAotLS0gYS9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5zZGsvZWNsaXBzZTMyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnNkay9lY2xpcHNlNDguZ2lmIGIvcGxhdGZvcm0vb3JnLmVjbGlwc2Uuc2RrL2VjbGlwc2U0OC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwYTQwZDYuLjAwMDAwMDAKLS0tIGEvcGxhdGZvcm0vb3JnLmVjbGlwc2Uuc2RrL2VjbGlwc2U0OC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5zZGsvZWNsaXBzZTQ4LnBuZyBiL3BsYXRmb3JtL29yZy5lY2xpcHNlLnNkay9lY2xpcHNlNDgucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzkzOWM4Li4wMDAwMDAwCi0tLSBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnNkay9lY2xpcHNlNDgucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGxhdGZvcm0vb3JnLmVjbGlwc2Uuc2RrL2VjbGlwc2VfbGcuZ2lmIGIvcGxhdGZvcm0vb3JnLmVjbGlwc2Uuc2RrL2VjbGlwc2VfbGcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjhiODcyLi4wMDAwMDAwCi0tLSBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnNkay9lY2xpcHNlX2xnLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnNkay9oZWxwRGF0YS54bWwgYi9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5zZGsvaGVscERhdGEueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODM4NjA1Li4wMDAwMDAwCi0tLSBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnNkay9oZWxwRGF0YS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPGV4dGVuc2lvbnM+Ci0JPHRvY09yZGVyPgotCQk8dG9jIGlkPSIvb3JnLmVjbGlwc2UucGxhdGZvcm0uZG9jLnVzZXIvdG9jLnhtbCIvPgotCQk8dG9jIGlkPSIvb3JnLmVjbGlwc2UuamR0LmRvYy51c2VyL3RvYy54bWwiLz4KLQkJPHRvYyBpZD0iL29yZy5lY2xpcHNlLnBsYXRmb3JtLmRvYy5pc3YvdG9jLnhtbCIvPgotCQk8dG9jIGlkPSIvb3JnLmVjbGlwc2UuamR0LmRvYy5pc3YvdG9jLnhtbCIvPgotCQk8dG9jIGlkPSIvb3JnLmVjbGlwc2UucGRlLmRvYy51c2VyL3RvYy54bWwiLz4KLQk8L3RvY09yZGVyPgotPC9leHRlbnNpb25zPgpkaWZmIC0tZ2l0IGEvcGxhdGZvcm0vb3JnLmVjbGlwc2Uuc2RrL2ludHJvLWVjbGlwc2UucG5nIGIvcGxhdGZvcm0vb3JnLmVjbGlwc2Uuc2RrL2ludHJvLWVjbGlwc2UucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjYxMjY4Li4wMDAwMDAwCi0tLSBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnNkay9pbnRyby1lY2xpcHNlLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnNkay9pbnRyb0RhdGEueG1sIGIvcGxhdGZvcm0vb3JnLmVjbGlwc2Uuc2RrL2ludHJvRGF0YS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiMWMwMDIuLjAwMDAwMDAKLS0tIGEvcGxhdGZvcm0vb3JnLmVjbGlwc2Uuc2RrL2ludHJvRGF0YS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCIgPz4KLTxleHRlbnNpb25zPgotICAgPHBhZ2UgaWQ9InR1dG9yaWFscyI+Ci0gICAgICA8Z3JvdXAgcGF0aD0icGFnZS1jb250ZW50L2JvdHRvbS1sZWZ0IiBkZWZhdWx0PSJ0cnVlIj4KLSAgICAgIDwvZ3JvdXA+Ci0gICAgICA8Z3JvdXAgcGF0aD0icGFnZS1jb250ZW50L2JvdHRvbS1yaWdodCIgZGVmYXVsdD0idHJ1ZSI+Ci0gICAgICA8L2dyb3VwPgotICAgICAgPGdyb3VwIHBhdGg9InBhZ2UtY29udGVudC90b3AtbGVmdCI+Ci0gICAgICAgICA8ZXh0ZW5zaW9uIGlkPSJvcmcuZWNsaXBzZS5qZHQiIGltcG9ydGFuY2U9ImxvdyIvPgotICAgICAgICAgPGV4dGVuc2lvbiBpZD0ib3JnLmVjbGlwc2UudGVhbSIgaW1wb3J0YW5jZT0ibG93Ii8+Ci0gICAgICA8L2dyb3VwPgotICAgICAgPGdyb3VwIHBhdGg9InBhZ2UtY29udGVudC90b3AtcmlnaHQiPgotICAgICAgICAgPGV4dGVuc2lvbiBpZD0ib3JnLmVjbGlwc2UucGRlIiBpbXBvcnRhbmNlPSJsb3ciLz4KLSAgICAgIDwvZ3JvdXA+Ci0gICA8L3BhZ2U+Ci0gICA8cGFnZSBpZD0id2hhdHNuZXciPgotICAgICAgPGdyb3VwIHBhdGg9InBhZ2UtY29udGVudC9ib3R0b20tbGVmdCIgZGVmYXVsdD0idHJ1ZSI+Ci0gICAgICA8L2dyb3VwPgotICAgICAgPGdyb3VwIHBhdGg9InBhZ2UtY29udGVudC9ib3R0b20tcmlnaHQiIGRlZmF1bHQ9InRydWUiPgotICAgICAgPC9ncm91cD4KLSAgICAgIDxncm91cCBwYXRoPSJwYWdlLWNvbnRlbnQvdG9wLWxlZnQiPgotICAgICAgICAgPGV4dGVuc2lvbiBpZD0ib3JnLmVjbGlwc2UudWkud29ya2JlbmNoLm5ld3MiIGltcG9ydGFuY2U9ImxvdyIvPgotICAgICAgICAgPGV4dGVuc2lvbiBpZD0ib3JnLmVjbGlwc2UuamR0IiBpbXBvcnRhbmNlPSJsb3ciLz4KLSAgICAgICAgIDxleHRlbnNpb24gaWQ9Im9yZy5lY2xpcHNlLnBkZS5jaGFuZ2VzIiBpbXBvcnRhbmNlPSJsb3ciLz4KLSAgICAgICAgIDxleHRlbnNpb24gaWQ9Im9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC5taWdyYXRpb24iIGltcG9ydGFuY2U9ImNhbGxvdXQiLz4KLSAgICAgIDwvZ3JvdXA+Ci0gICAgICA8Z3JvdXAgcGF0aD0icGFnZS1jb250ZW50L3RvcC1yaWdodCI+Ci0gICAgICAgICA8ZXh0ZW5zaW9uIGlkPSJvcmcuZWNsaXBzZS51aS53b3JrYmVuY2giIGltcG9ydGFuY2U9ImxvdyIvPgotICAgICAgPC9ncm91cD4KLSAgIDwvcGFnZT4KLSAgIDxwYWdlIGlkPSJzYW1wbGVzIj4KLSAgICAgIDxncm91cCBwYXRoPSJwYWdlLWNvbnRlbnQvYm90dG9tLWxlZnQiIGRlZmF1bHQ9InRydWUiPgotICAgICAgPC9ncm91cD4KLSAgICAgIDxncm91cCBwYXRoPSJwYWdlLWNvbnRlbnQvYm90dG9tLXJpZ2h0IiBkZWZhdWx0PSJ0cnVlIj4KLSAgICAgIDwvZ3JvdXA+Ci0gICAgICA8Z3JvdXAgcGF0aD0icGFnZS1jb250ZW50L3RvcC1sZWZ0Ij4KLSAgICAgICAgIDxleHRlbnNpb24gaWQ9Im9yZy5lY2xpcHNlLnBkZS53b3JrYmVuY2giIGltcG9ydGFuY2U9ImxvdyIvPgotICAgICAgPC9ncm91cD4KLSAgICAgIDxncm91cCBwYXRoPSJwYWdlLWNvbnRlbnQvdG9wLXJpZ2h0Ij4KLSAgICAgICAgIDxleHRlbnNpb24gaWQ9Im9yZy5lY2xpcHNlLmpkdCIgaW1wb3J0YW5jZT0ibG93Ii8+Ci0gICAgICAgICA8ZXh0ZW5zaW9uIGlkPSJvcmcuZWNsaXBzZS5wZGUuc3d0IiBpbXBvcnRhbmNlPSJsb3ciLz4KLSAgICAgIDwvZ3JvdXA+Ci0gICA8L3BhZ2U+Ci0gICA8cGFnZSBpZD0ib3ZlcnZpZXciPgotICAgICAgPGdyb3VwIHBhdGg9InBhZ2UtY29udGVudC9ib3R0b20tbGVmdCIgZGVmYXVsdD0idHJ1ZSI+Ci0gICAgICA8L2dyb3VwPgotICAgICAgPGdyb3VwIHBhdGg9InBhZ2UtY29udGVudC9ib3R0b20tcmlnaHQiIGRlZmF1bHQ9InRydWUiPgotICAgICAgPC9ncm91cD4KLSAgICAgIDxncm91cCBwYXRoPSJwYWdlLWNvbnRlbnQvdG9wLWxlZnQiPgotICAgICAgICAgPGV4dGVuc2lvbiBpZD0ib3JnLmVjbGlwc2UudWkud29ya2JlbmNoIiBpbXBvcnRhbmNlPSJsb3ciLz4KLSAgICAgIDwvZ3JvdXA+Ci0gICAgICA8Z3JvdXAgcGF0aD0icGFnZS1jb250ZW50L3RvcC1yaWdodCI+Ci0gICAgICAgICA8ZXh0ZW5zaW9uIGlkPSJvcmcuZWNsaXBzZS5qZHQiIGltcG9ydGFuY2U9ImxvdyIvPgotICAgICAgICAgPGV4dGVuc2lvbiBpZD0ib3JnLmVjbGlwc2UucGRlIiBpbXBvcnRhbmNlPSJsb3ciLz4KLSAgICAgIDwvZ3JvdXA+Ci0gICA8L3BhZ2U+Ci08L2V4dGVuc2lvbnM+CmRpZmYgLS1naXQgYS9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5zZGsvbWFjb3N4X25hcnJvd19ib29rLmNzcyBiL3BsYXRmb3JtL29yZy5lY2xpcHNlLnNkay9tYWNvc3hfbmFycm93X2Jvb2suY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDRlNWU0Li4wMDAwMDAwCi0tLSBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnNkay9tYWNvc3hfbmFycm93X2Jvb2suY3NzCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotaDEsaDIgICAgICAgICAgIHsgY29sb3I6IEJsYWNrIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5zZGsvbmFycm93X2Jvb2suY3NzIGIvcGxhdGZvcm0vb3JnLmVjbGlwc2Uuc2RrL25hcnJvd19ib29rLmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWExOWJmMy4uMDAwMDAwMAotLS0gYS9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5zZGsvbmFycm93X2Jvb2suY3NzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGxhdGZvcm0vb3JnLmVjbGlwc2Uuc2RrL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGxhdGZvcm0vb3JnLmVjbGlwc2Uuc2RrL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkY2MwMzFhLi4wMDAwMDAwCi0tLSBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnNkay9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wbHVnaW5OYW1lPUVjbGlwc2UgUHJvamVjdCBTREsKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi1wcm9kdWN0TmFtZT1FY2xpcHNlIFNESwotcHJvZHVjdEJsdXJiPUVjbGlwc2UgU0RLXG5cCi1cblwKLVZlcnNpb246IDMuMy4wXG5cCi1CdWlsZCBpZDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDAwLCAyMDA3LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvcGxhdGZvcm1cblwKLVxuXAotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGVcblwKLUFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8KLQotYWN0aXZpdHkuamF2YT1KYXZhIERldmVsb3BtZW50Ci1hY3Rpdml0eS5qYXZhLmRlc2M9RGV2ZWxvcCBKYXZhIGFwcGxpY2F0aW9ucy4KLWFjdGl2aXR5LnBsdWdpbj1QbHVnLWluIERldmVsb3BtZW50Ci1hY3Rpdml0eS5wbHVnaW4uZGVzYz1EZXZlbG9wIHBsdWctaW5zLCBmcmFnbWVudHMsIGFuZCBmZWF0dXJlcyBmb3IgRWNsaXBzZS4KLQotYWN0aXZpdHkudGVhbS5jdnM9Q1ZTIFN1cHBvcnQKLWFjdGl2aXR5LnRlYW0uY3ZzLmRlc2M9VXNlIHRoZSBDb25jdXJyZW50IFZlcnNpb25zIFN5c3RlbSAoQ1ZTKSB0byBtYW5hZ2UgcmVzb3VyY2VzLgotYWN0aXZpdHkudGVhbT1Db3JlIFRlYW0gU3VwcG9ydAotYWN0aXZpdHkudGVhbS5kZXNjPVNoYXJlIHByb2plY3RzIHVzaW5nIGNvbmZpZ3VyYXRpb24gbWFuYWdlbWVudCBzeXN0ZW1zLgotCi1hY3Rpdml0eS5jYXQuZGV2ZWxvcG1lbnQ9RGV2ZWxvcG1lbnQKLWFjdGl2aXR5LmNhdC5kZXZlbG9wbWVudC5kZXNjPVVzZSB0aGUgRWNsaXBzZSBTREsgdG8gZGV2ZWxvcCBhcHBsaWNhdGlvbnMuCi1hY3Rpdml0eS5jYXQudGVhbT1UZWFtCi1hY3Rpdml0eS5jYXQudGVhbS5kZXNjPVVzZSBjb25maWd1cmF0aW9uIG1hbmFnZW1lbnQgc3lzdGVtcyB0byBtYW5hZ2UgcmVzb3VyY2VzLgotCi1QcmVmZXJlbmNlUGFnZXMuQ2FwYWJpbGl0aWVzID0gQ2FwYWJpbGl0aWVzCi1QcmVmZXJlbmNlUGFnZXMuQ2FwYWJpbGl0aWVzLmFjdGl2aXR5TmFtZSA9ICZDYXBhYmlsaXRpZXMKLVByZWZlcmVuY2VQYWdlcy5DYXBhYmlsaXRpZXMuY2F0ZWdvcnlOYW1lID0gJkNhcGFiaWxpdGllcwotUHJlZmVyZW5jZVBhZ2VzLkNhcGFiaWxpdGllcy5hY3Rpdml0eVByb21wdEJ1dHRvbiA9ICZQcm9tcHQgd2hlbiBlbmFibGluZyBjYXBhYmlsaXRpZXMKLVByZWZlcmVuY2VQYWdlcy5DYXBhYmlsaXRpZXMuYWN0aXZpdHlQcm9tcHRCdXR0b25Ub29sdGlwID0gUHJvbXB0IHdoZW4gYSBmZWF0dXJlIGlzIGZpcnN0IHVzZWQgdGhhdCByZXF1aXJlcyBlbmFibGVtZW50IG9mIGNhcGFiaWxpdGllcwotUHJlZmVyZW5jZVBhZ2VzLkNhcGFiaWxpdGllcy5jYXB0aW9uTWVzc2FnZSA9IENhcGFiaWxpdGllcyBhbGxvdyB5b3UgdG8gZW5hYmxlIG9yIGRpc2FibGUgdmFyaW91cyBwcm9kdWN0IGNvbXBvbmVudHMuICBUaGVzZSBjYXBhYmlsaXRpZXMgYXJlIGdyb3VwZWQgYWNjb3JkaW5nIHRvIGEgc2V0IG9mIHByZWRlZmluZWQgY2F0ZWdvcmllcy4KLQotaGVscEFjdGl2aXR5U3VwcG9ydC5zaG93QWxsTWVzc2FnZSA9IFdoaWxlIHNob3dpbmcgYWxsIHRvcGljcywgZG9jdW1lbnRhdGlvbiBhYm91dCBkaXNhYmxlZCBjYXBhYmlsaXRpZXMgaXMgYWxzbyBzaG93biBpbiB0aGUgdGFibGUgb2YgY29udGVudHMgYW5kIHNlYXJjaCByZXN1bHRzLiBTb21lIGRvY3VtZW50cyBtYXkgcmVmZXIgdG8gdXNlciBpbnRlcmZhY2UgZWxlbWVudHMgdGhhdCBhcmUgbm90IHZpc2libGUuIFRvIG1hbnVhbGx5IGVuYWJsZSBjYXBhYmlsaXRpZXMsIHVzZSB0aGUgIkdlbmVyYWwgLT4gQ2FwYWJpbGl0aWVzIiBwcmVmZXJlbmNlIHBhZ2UuCi1oZWxwQWN0aXZpdHlTdXBwb3J0LmRvY3VtZW50TWVzc2FnZSA9IFRoaXMgdG9waWMgYmVsb25ncyB0byBhIGNhcGFiaWxpdHkgdGhhdCBcCi1pcyBjdXJyZW50bHkgZGlzYWJsZWQuIEl0IG1heSByZWZlciB0byB1c2VyIGludGVyZmFjZSBlbGVtZW50cyB0aGF0IGFyZSBcCi1ub3QgdmlzaWJsZS48YnI+PGJyPlwKLVRvIG1hbnVhbGx5IGVuYWJsZSBjYXBhYmlsaXRpZXMsIHVzZVwKLSZuYnNwOzxhIGhyZWY9J0FDVElWSVRZX0VESVRPUic+Q2FwYWJpbGl0aWVzIHByZWZlcmVuY2UgcGFnZS48L2E+Ci0KLVRyaWdnZXJQb2ludEFkdmlzb3IucHJvY2VlZE11bHRpID0gRW5hYmxlIHRoZSBzZWxlY3RlZCBjYXBhYmlsaXRpZXM/Ci1UcmlnZ2VyUG9pbnRBZHZpc29yLnByb2NlZWRTaW5nbGUgPSBFbmFibGUgdGhlIHJlcXVpcmVkIGNhcGFiaWxpdHk/Ci1UcmlnZ2VyUG9pbnRBZHZpc29yLmRvbnRBc2sgPSAmQWx3YXlzIGVuYWJsZSBjYXBhYmlsaXRpZXMgYW5kIGRvbid0IGFzayBtZSBhZ2FpbgotVHJpZ2dlclBvaW50QWR2aXNvci5ub0RldGFpbHMgPSBTZWxlY3QgYSBjYXBhYmlsaXR5IHRvIHZpZXcgaXRzIGRlc2NyaXB0aW9uLgotCi1zZWFyY2guR29vZ2xlLmxhYmVsID0gR29vZ2xlCi1zZWFyY2guR29vZ2xlLmRlc2MgPSBQZXJmb3JtcyBhIEdvb2dsZSB3ZWIgc2VhcmNoCi0KLXNlYXJjaC5FY2xpcHNlLmxhYmVsID0gRWNsaXBzZS5vcmcgCi1zZWFyY2guRWNsaXBzZS5kZXNjID0gU2VhcmNoZXMgbWFpbGluZyBsaXN0cywgbmV3cyBncm91cHMsIGFydGljbGVzIGFuZCBvdGhlciBkb2N1bWVudHMgb24gRWNsaXBzZS5vcmcKLQotcHJvZHVjdEludHJvVGl0bGUgPSBXZWxjb21lIHRvIEVjbGlwc2UgMy4zCi1wcm9kdWN0SW50cm9CcmFuZGluZ1RleHQgPSBFY2xpcHNlIFByb2plY3QKLWludHJvRGVzY3JpcHRpb24tb3ZlcnZpZXcgPSBFY2xpcHNlIGlzIGEga2luZCBvZiB1bml2ZXJzYWwgdG9vbCBwbGF0Zm9ybSAtIGFuIG9wZW4gZXh0ZW5zaWJsZSBJREUgZm9yIGFueXRoaW5nIGFuZCBub3RoaW5nIGluIHBhcnRpY3VsYXIuIEl0IHByb3ZpZGVzIGEgZmVhdHVyZS1yaWNoIGRldmVsb3BtZW50IGVudmlyb25tZW50IHRoYXQgYWxsb3dzIHRoZSBkZXZlbG9wZXIgdG8gZWZmaWNpZW50bHkgY3JlYXRlIHRvb2xzIHRoYXQgaW50ZWdyYXRlIHNlYW1sZXNzbHkgaW50byB0aGUgRWNsaXBzZSBQbGF0Zm9ybS4KLWludHJvRGVzY3JpcHRpb24tdHV0b3JpYWxzID0gTGVhcm4gaG93IHRvIGJlIHByb2R1Y3RpdmUgdXNpbmcgRWNsaXBzZSBieSBjb21wbGV0aW5nIGVuZC10by1lbmQgdHV0b3JpYWxzIHRoYXQgd2lsbCBndWlkZSB5b3UgYWxvbmcgdGhlIHdheS4KLWludHJvRGVzY3JpcHRpb24tc2FtcGxlcyA9IEV4cGxvcmUgRWNsaXBzZSBieSBpbnN0YWxsaW5nIHByZWZhYnJpY2F0ZWQgc2FtcGxlcyAobWF5IHJlcXVpcmUgYW4gSW50ZXJuZXQgY29ubmVjdGlvbikuCi0KZGlmZiAtLWdpdCBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnNkay9wbHVnaW4ueG1sIGIvcGxhdGZvcm0vb3JnLmVjbGlwc2Uuc2RrL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxODBmOGQuLjAwMDAwMDAKLS0tIGEvcGxhdGZvcm0vb3JnLmVjbGlwc2Uuc2RrL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLSAgICA8ZXh0ZW5zaW9uIGlkPSJpZGUiIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJvZHVjdHMiPiAKLSAgICAgIDxwcm9kdWN0IG5hbWU9IiVwcm9kdWN0TmFtZSIgYXBwbGljYXRpb249Im9yZy5lY2xpcHNlLnVpLmlkZS53b3JrYmVuY2giIGRlc2NyaXB0aW9uPSIlcHJvZHVjdEJsdXJiIj4gCi0gICAgICAgICAgPHByb3BlcnR5IG5hbWU9IndpbmRvd0ltYWdlcyIgdmFsdWU9ImVjbGlwc2UuZ2lmLGVjbGlwc2UzMi5naWYsZWNsaXBzZTQ4LmdpZixlY2xpcHNlLnBuZyxlY2xpcHNlMzIucG5nLGVjbGlwc2U0OC5wbmciLz4gCi0gICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImFib3V0SW1hZ2UiIHZhbHVlPSJlY2xpcHNlX2xnLmdpZiIvPiAKLSAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iYWJvdXRUZXh0IiB2YWx1ZT0iJXByb2R1Y3RCbHVyYiIvPiAKLSAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iYXBwTmFtZSIgdmFsdWU9IkVjbGlwc2UiLz4gCi0gICAgICAgICAgPHByb3BlcnR5IG5hbWU9InByZWZlcmVuY2VDdXN0b21pemF0aW9uIiB2YWx1ZT0icGx1Z2luX2N1c3RvbWl6YXRpb24uaW5pIi8+Ci0gICAgICAgICAgPHByb3BlcnR5Ci0gICAgICAgICAgICAgICAgbmFtZT0ic3RhcnR1cEZvcmVncm91bmRDb2xvciIKLSAgICAgICAgICAgICAgICB2YWx1ZT0iQzhENUVBIi8+Ci0gICAgICAgICAgPHByb3BlcnR5Ci0gICAgICAgICAgICAgICAgbmFtZT0ic3RhcnR1cE1lc3NhZ2VSZWN0IgotICAgICAgICAgICAgICAgIHZhbHVlPSI3LDIyMCw0NDEsMjAiLz4KLSAgICAgICAgICA8cHJvcGVydHkKLSAgICAgICAgICAgICAgICBuYW1lPSJzdGFydHVwUHJvZ3Jlc3NSZWN0IgotICAgICAgICAgICAgICAgIHZhbHVlPSIwLDI4MCw0NTUsMTUiLz4gCi0gICAgICAgICAgPHByb3BlcnR5Ci0gICAgICAgICAgCQluYW1lPSJpbnRyb1RpdGxlIgotICAgICAgICAgIAkJdmFsdWU9IiVwcm9kdWN0SW50cm9UaXRsZSIvPgotICAgICAgICAgIDxwcm9wZXJ0eQotICAgICAgICAgIAkJbmFtZT0iaW50cm9CcmFuZGluZ0ltYWdlIgotICAgICAgICAgIAkJdmFsdWU9InByb2R1Y3Q6aW50cm8tZWNsaXBzZS5wbmciLz4KLSAgICAgICAgICA8cHJvcGVydHkKLSAgICAgICAgICAJCW5hbWU9ImludHJvQnJhbmRpbmdJbWFnZVRleHQiCi0gICAgICAgICAgCQl2YWx1ZT0iJXByb2R1Y3RJbnRyb0JyYW5kaW5nVGV4dCIvPgotCQkgIDxwcm9wZXJ0eQotCQkJCW5hbWU9ImludHJvRGVzY3JpcHRpb24tb3ZlcnZpZXciCi0JCQkJdmFsdWU9IiVpbnRyb0Rlc2NyaXB0aW9uLW92ZXJ2aWV3Ii8+Ci0JCSAgPHByb3BlcnR5Ci0JCQkJbmFtZT0iaW50cm9EZXNjcmlwdGlvbi10dXRvcmlhbHMiCi0JCQkJdmFsdWU9IiVpbnRyb0Rlc2NyaXB0aW9uLXR1dG9yaWFscyIvPgotCQkgIDxwcm9wZXJ0eQotCQkJCW5hbWU9ImludHJvRGVzY3JpcHRpb24tc2FtcGxlcyIKLQkJCQl2YWx1ZT0iJWludHJvRGVzY3JpcHRpb24tc2FtcGxlcyIvPgotICAgICAgPC9wcm9kdWN0PiAKLSAgICA8L2V4dGVuc2lvbj4gCi0KLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS51aS5pbnRybyI+Ci0gICAgICA8aW50cm9Qcm9kdWN0QmluZGluZwotICAgICAgICAgICAgaW50cm9JZD0ib3JnLmVjbGlwc2UudWkuaW50cm8udW5pdmVyc2FsIgotICAgICAgICAgICAgcHJvZHVjdElkPSJvcmcuZWNsaXBzZS5zZGsuaWRlIj4KLSAgICAgIDwvaW50cm9Qcm9kdWN0QmluZGluZz4KLSAgICA8L2V4dGVuc2lvbj4KLQotICAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5hY3Rpdml0aWVzIj4KLSAgCi0gICAgICA8YWN0aXZpdHkKLSAgICAgICAgICAgIG5hbWU9IiVhY3Rpdml0eS5qYXZhIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IiVhY3Rpdml0eS5qYXZhLmRlc2MiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuamF2YURldmVsb3BtZW50Ij4KLSAgICAgIDwvYWN0aXZpdHk+Ci0gICAgICAKLSAgICAgIDxhY3Rpdml0eQotICAgICAgICAgICAgbmFtZT0iJWFjdGl2aXR5LnBsdWdpbiIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlYWN0aXZpdHkucGx1Z2luLmRlc2MiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UucGx1Z0luRGV2ZWxvcG1lbnQiPgotICAgICAgPC9hY3Rpdml0eT4KLSAgICAgIAotICAgICAgPGFjdGl2aXR5UmVxdWlyZW1lbnRCaW5kaW5nCi0gICAgICAgICAgICBhY3Rpdml0eUlkPSJvcmcuZWNsaXBzZS5wbHVnSW5EZXZlbG9wbWVudCIKLSAgICAgICAgICAgIHJlcXVpcmVkQWN0aXZpdHlJZD0ib3JnLmVjbGlwc2UuamF2YURldmVsb3BtZW50Ij4KLSAgICAgIDwvYWN0aXZpdHlSZXF1aXJlbWVudEJpbmRpbmc+Ci0gIAotICAgICAgPGFjdGl2aXR5Ci0gICAgICAgICAgICBuYW1lPSIlYWN0aXZpdHkudGVhbS5jdnMiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iJWFjdGl2aXR5LnRlYW0uY3ZzLmRlc2MiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudGVhbS5jdnMiPgotICAgICAgPC9hY3Rpdml0eT4gCi0gICAgICAKLSAgICAgIDxhY3Rpdml0eQotICAgICAgICAgICAgbmFtZT0iJWFjdGl2aXR5LnRlYW0iCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iJWFjdGl2aXR5LnRlYW0uZGVzYyIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS50ZWFtIj4KLSAgICAgIDwvYWN0aXZpdHk+IAotICAgICAgCi0gICAgICA8YWN0aXZpdHlSZXF1aXJlbWVudEJpbmRpbmcKLSAgICAgICAgICAgIGFjdGl2aXR5SWQ9Im9yZy5lY2xpcHNlLnRlYW0uY3ZzIgotICAgICAgICAgICAgcmVxdWlyZWRBY3Rpdml0eUlkPSJvcmcuZWNsaXBzZS50ZWFtIj4KLSAgICAgIDwvYWN0aXZpdHlSZXF1aXJlbWVudEJpbmRpbmc+Ci0gICAgICAKLSAgICAgIDxhY3Rpdml0eVBhdHRlcm5CaW5kaW5nCi0gICAgICAgICAgICBhY3Rpdml0eUlkPSJvcmcuZWNsaXBzZS5qYXZhRGV2ZWxvcG1lbnQiCi0gICAgICAgICAgICBwYXR0ZXJuPSJvcmdcLmVjbGlwc2VcLmpkdFwuZGVidWcvZGVidWdNb2RlbCI+Ci0gICAgICA8L2FjdGl2aXR5UGF0dGVybkJpbmRpbmc+Ci0gICAgICAKLSAgICAgIDxhY3Rpdml0eVBhdHRlcm5CaW5kaW5nCi0gICAgICAgICAgICBhY3Rpdml0eUlkPSJvcmcuZWNsaXBzZS5qYXZhRGV2ZWxvcG1lbnQiCi0gICAgICAgICAgICBwYXR0ZXJuPSJvcmdcLmVjbGlwc2VcLmpkdFwuLiovLioiPgotICAgICAgPC9hY3Rpdml0eVBhdHRlcm5CaW5kaW5nPgotICAgICAgCi0gICAgICA8YWN0aXZpdHlQYXR0ZXJuQmluZGluZwotICAgICAgICAgICAgYWN0aXZpdHlJZD0ib3JnLmVjbGlwc2UuamF2YURldmVsb3BtZW50IgotICAgICAgICAgICAgcGF0dGVybj0ib3JnXC5lY2xpcHNlXC5qZHQvLioiPgotICAgICAgPC9hY3Rpdml0eVBhdHRlcm5CaW5kaW5nPgotICAgICAgCi0gICAgICA8YWN0aXZpdHlQYXR0ZXJuQmluZGluZwotICAgICAgICAgICAgYWN0aXZpdHlJZD0ib3JnLmVjbGlwc2UuamF2YURldmVsb3BtZW50IgotICAgICAgICAgICAgcGF0dGVybj0ib3JnXC5lY2xpcHNlXC5qZHRcLmNvcmUvamF2YW5hdHVyZSI+Ci0KLSAgICAgIDwvYWN0aXZpdHlQYXR0ZXJuQmluZGluZz4KLSAgICAgIAotICAgICAgPGFjdGl2aXR5UGF0dGVybkJpbmRpbmcKLSAgICAgICAgICAgIGFjdGl2aXR5SWQ9Im9yZy5lY2xpcHNlLnBsdWdJbkRldmVsb3BtZW50IgotICAgICAgICAgICAgcGF0dGVybj0ib3JnXC5lY2xpcHNlXC5wZGVcLi4qLy4qIj4KLSAgICAgIDwvYWN0aXZpdHlQYXR0ZXJuQmluZGluZz4KLSAgICAgIAotICAgICAgPGFjdGl2aXR5UGF0dGVybkJpbmRpbmcKLSAgICAgICAgICAgIGFjdGl2aXR5SWQ9Im9yZy5lY2xpcHNlLnBsdWdJbkRldmVsb3BtZW50IgotICAgICAgICAgICAgcGF0dGVybj0ib3JnXC5lY2xpcHNlXC5wZGUvLioiPgotICAgICAgPC9hY3Rpdml0eVBhdHRlcm5CaW5kaW5nPgotICAgICAgCi0gICAgICA8YWN0aXZpdHlQYXR0ZXJuQmluZGluZwotICAgICAgICAgICAgYWN0aXZpdHlJZD0ib3JnLmVjbGlwc2UucGx1Z0luRGV2ZWxvcG1lbnQiCi0gICAgICAgICAgICBwYXR0ZXJuPSJvcmdcLmVjbGlwc2VcLnBkZS9QbHVnaW5OYXR1cmUiPgotICAgICAgPC9hY3Rpdml0eVBhdHRlcm5CaW5kaW5nPgotICAgICAgPGFjdGl2aXR5UGF0dGVybkJpbmRpbmcKLSAgICAgICAgICAgIGFjdGl2aXR5SWQ9Im9yZy5lY2xpcHNlLnRlYW0iCi0gICAgICAgICAgICBwYXR0ZXJuPSJvcmdcLmVjbGlwc2VcLnRlYW1cLnVpL29yZy4qIj4KLSAgICAgIDwvYWN0aXZpdHlQYXR0ZXJuQmluZGluZz4gCi0gICAgICA8YWN0aXZpdHlQYXR0ZXJuQmluZGluZwotICAgICAgICAgICAgYWN0aXZpdHlJZD0ib3JnLmVjbGlwc2UudGVhbSIKLSAgICAgICAgICAgIHBhdHRlcm49Im9yZ1wuZWNsaXBzZVwuY29tcGFyZS9jb21wYXJlV2l0aFBhdGNoIj4KLSAgICAgIDwvYWN0aXZpdHlQYXR0ZXJuQmluZGluZz4gICAgICAgICAgIAotICAgICAgPGFjdGl2aXR5UGF0dGVybkJpbmRpbmcKLSAgICAgICAgICAgIGFjdGl2aXR5SWQ9Im9yZy5lY2xpcHNlLnRlYW0uY3ZzIgotICAgICAgICAgICAgcGF0dGVybj0ib3JnXC5lY2xpcHNlXC50ZWFtXC5jdnNcLnVpLy4qIj4KLSAgICAgIDwvYWN0aXZpdHlQYXR0ZXJuQmluZGluZz4KLSAgICAgIDxhY3Rpdml0eVBhdHRlcm5CaW5kaW5nCi0gICAgICAgICAgICBhY3Rpdml0eUlkPSJvcmcuZWNsaXBzZS50ZWFtLmN2cyIKLSAgICAgICAgICAgIHBhdHRlcm49Im9yZ1wuZWNsaXBzZVwudGVhbVwuY3ZzXC5jb3JlLy4qY3ZzbmF0dXJlIj4KLSAgICAgIDwvYWN0aXZpdHlQYXR0ZXJuQmluZGluZz4KLSAgICAgIAotICAgICAgPGNhdGVnb3J5Ci0gICAgICAgICAgICBuYW1lPSIlYWN0aXZpdHkuY2F0LmRldmVsb3BtZW50IgotICAgICAgICAgICAgZGVzY3JpcHRpb249IiVhY3Rpdml0eS5jYXQuZGV2ZWxvcG1lbnQuZGVzYyIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jYXRlZ29yaWVzLmRldmVsb3BtZW50Q2F0ZWdvcnkiPgotICAgICAgPC9jYXRlZ29yeT4KLQotIAkgIDxjYXRlZ29yeQotICAgICAgICAgICAgbmFtZT0iJWFjdGl2aXR5LmNhdC50ZWFtIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IiVhY3Rpdml0eS5jYXQudGVhbS5kZXNjIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNhdGVnb3JpZXMudGVhbUNhdGVnb3J5Ij4KLQotICAgICAgPC9jYXRlZ29yeT4KLSAgICAgIAotICAgICAgPGNhdGVnb3J5QWN0aXZpdHlCaW5kaW5nCi0gICAgICAgICAgICBhY3Rpdml0eUlkPSJvcmcuZWNsaXBzZS5qYXZhRGV2ZWxvcG1lbnQiCi0gICAgICAgICAgICBjYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS5jYXRlZ29yaWVzLmRldmVsb3BtZW50Q2F0ZWdvcnkiPgotICAgICAgPC9jYXRlZ29yeUFjdGl2aXR5QmluZGluZz4KLSAgICAgIAotICAgICAgPGNhdGVnb3J5QWN0aXZpdHlCaW5kaW5nCi0gICAgICAgICAgICBhY3Rpdml0eUlkPSJvcmcuZWNsaXBzZS5wbHVnSW5EZXZlbG9wbWVudCIKLSAgICAgICAgICAgIGNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLmNhdGVnb3JpZXMuZGV2ZWxvcG1lbnRDYXRlZ29yeSI+Ci0gICAgICA8L2NhdGVnb3J5QWN0aXZpdHlCaW5kaW5nPgotCi0gICAgICA8Y2F0ZWdvcnlBY3Rpdml0eUJpbmRpbmcKLSAgICAgICAgICAgIGFjdGl2aXR5SWQ9Im9yZy5lY2xpcHNlLnRlYW0iCi0gICAgICAgICAgICBjYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS5jYXRlZ29yaWVzLnRlYW1DYXRlZ29yeSI+Ci0gICAgICA8L2NhdGVnb3J5QWN0aXZpdHlCaW5kaW5nPiAgICAgICAgCi0gICAgICAKLSAgICAgIDxjYXRlZ29yeUFjdGl2aXR5QmluZGluZwotICAgICAgICAgICAgYWN0aXZpdHlJZD0ib3JnLmVjbGlwc2UudGVhbS5jdnMiCi0gICAgICAgICAgICBjYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS5jYXRlZ29yaWVzLnRlYW1DYXRlZ29yeSI+Ci0gICAgICA8L2NhdGVnb3J5QWN0aXZpdHlCaW5kaW5nPgotICAKLSAgICAgIDwhLS0gYmluZCBhbGwgZWxlbWVudHMgdGhhdCBzdGFydCB3aXRoICJvcmciIC0tPiAgICAgIAotICAgICAgIAotICAgICAgPGRlZmF1bHRFbmFibGVtZW50Ci0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuamF2YURldmVsb3BtZW50Ij4KLSAgICAgIDwvZGVmYXVsdEVuYWJsZW1lbnQ+Ci0gICAgICAKLSAgICAgIDxkZWZhdWx0RW5hYmxlbWVudAotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnBsdWdJbkRldmVsb3BtZW50Ij4KLSAgICAgIDwvZGVmYXVsdEVuYWJsZW1lbnQ+Ci0gICAgICAKLSAgICAgIDxkZWZhdWx0RW5hYmxlbWVudAotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnRlYW0iPgotICAgICAgPC9kZWZhdWx0RW5hYmxlbWVudD4gICAgIAotICAgICAgCi0gICAgICA8ZGVmYXVsdEVuYWJsZW1lbnQKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS50ZWFtLmN2cyI+Ci0gICAgICA8L2RlZmF1bHRFbmFibGVtZW50PgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5uZXdXaXphcmRzIj4KLSAgICAgIDxwcmltYXJ5V2l6YXJkCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuamR0LnVpLndpemFyZHMuSmF2YVByb2plY3RXaXphcmQiPgotICAgICAgPC9wcmltYXJ5V2l6YXJkPgotICAgICAgPHByaW1hcnlXaXphcmQKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wZGUudWkuTmV3UHJvamVjdFdpemFyZCI+Ci0gICAgICA8L3ByaW1hcnlXaXphcmQ+Ci0gICAgICA8cHJpbWFyeVdpemFyZAotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpkdC51aS53aXphcmRzLk5ld0NsYXNzQ3JlYXRpb25XaXphcmQiPgotICAgICAgPC9wcmltYXJ5V2l6YXJkPgotICAgICAgPHByaW1hcnlXaXphcmQKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZHQudWkud2l6YXJkcy5OZXdJbnRlcmZhY2VDcmVhdGlvbldpemFyZCI+Ci0gICAgICA8L3ByaW1hcnlXaXphcmQ+Ci0gICAgICA8cHJpbWFyeVdpemFyZAotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmFudC51aS53aXphcmRzLkphdmFQcm9qZWN0V2l6YXJkIj4KLSAgICAgIDwvcHJpbWFyeVdpemFyZD4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcyI+Ci0JICA8cGFnZSAgICAgICAgICAgIAotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcy5Xb3JrYmVuY2giCi0gICAgICAgICAgICBuYW1lPSIlUHJlZmVyZW5jZVBhZ2VzLkNhcGFiaWxpdGllcyIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zZGsuY2FwYWJpbGl0aWVzIj4KLSAgICAgICAgICAgIDxjbGFzcyBjbGFzcz0ib3JnLmVjbGlwc2UudWkuYWN0aXZpdGllcy5BY3Rpdml0eUNhdGVnb3J5UHJlZmVyZW5jZVBhZ2UiPgotICAgICAgICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iYWxsb3dBZHZhbmNlZCIgdmFsdWU9InRydWUiLz4KLSAgICAgICAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9ImNhcHRpb25NZXNzYWdlIiB2YWx1ZT0iJVByZWZlcmVuY2VQYWdlcy5DYXBhYmlsaXRpZXMuY2FwdGlvbk1lc3NhZ2UiIC8+Ci0gICAgICAgICAgICAJPHBhcmFtZXRlciBuYW1lPSJhY3Rpdml0eU5hbWUiIHZhbHVlPSIlUHJlZmVyZW5jZVBhZ2VzLkNhcGFiaWxpdGllcy5hY3Rpdml0eU5hbWUiIC8+Ci0gICAgICAgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJjYXRlZ29yeU5hbWUiIHZhbHVlPSIlUHJlZmVyZW5jZVBhZ2VzLkNhcGFiaWxpdGllcy5jYXRlZ29yeU5hbWUiIC8+Ci0gICAgICAgICAgICAJPHBhcmFtZXRlciBuYW1lPSJhY3Rpdml0eVByb21wdEJ1dHRvbiIgdmFsdWU9IiVQcmVmZXJlbmNlUGFnZXMuQ2FwYWJpbGl0aWVzLmFjdGl2aXR5UHJvbXB0QnV0dG9uIi8+Ci0gICAgICAgICAgICAJPHBhcmFtZXRlciBuYW1lPSJhY3Rpdml0eVByb21wdEJ1dHRvblRvb2x0aXAiIHZhbHVlPSIlUHJlZmVyZW5jZVBhZ2VzLkNhcGFiaWxpdGllcy5hY3Rpdml0eVByb21wdEJ1dHRvblRvb2x0aXAiLz4KLSAgICAgICAgICAgIDwvY2xhc3M+Ci0gICAgICA8L3BhZ2U+ICAgCi0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPGV4dGVuc2lvbgotICAgCQlwb2ludD0ib3JnLmVjbGlwc2UuaGVscC5iYXNlLmFjdGl2aXR5U3VwcG9ydCI+Ci0gICAgICA8c3VwcG9ydCBwcm9kdWN0SWQ9Im9yZy5lY2xpcHNlLnNkay5pZGUiPgotICAgICAgICAgPHNob3dBbGxNZXNzYWdlPgotICAgICAgICAgICAgJWhlbHBBY3Rpdml0eVN1cHBvcnQuc2hvd0FsbE1lc3NhZ2UKLSAgICAgICAgIDwvc2hvd0FsbE1lc3NhZ2U+Ci0gICAgICAgICA8ZG9jdW1lbnRNZXNzYWdlCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuaGVscC51aS5pbnRlcm5hbC5TaG93Q2FwYWJpbGl0aWVzUHJlZmVyZW5jZUFjdGlvbiIKLSAgICAgICAgICAgICAgIHBsdWdpbklkPSJvcmcuZWNsaXBzZS5oZWxwLnVpIj4KLSAgICAgICAgICAgICVoZWxwQWN0aXZpdHlTdXBwb3J0LmRvY3VtZW50TWVzc2FnZQotICAgICAgICAgPC9kb2N1bWVudE1lc3NhZ2U+Ci0gICAgICA8L3N1cHBvcnQ+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgICAgPGV4dGVuc2lvbgotICAgICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmFjdGl2aXR5U3VwcG9ydCI+Ci0gICAgICA8dHJpZ2dlclBvaW50QWR2aXNvcgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmlkZS50cmlnZ2VyUG9pbnRBZHZpc29yIj4KLSAgICAgICAgICAgIDxjbGFzcyBjbGFzcz0ib3JnLmVjbGlwc2UudWkuYWN0aXZpdGllcy5Xb3JrYmVuY2hUcmlnZ2VyUG9pbnRBZHZpc29yIj4KLSAgICAgICAgICAgIAk8cGFyYW1ldGVyIG5hbWU9InByb2NlZWRNdWx0aSIgdmFsdWU9IiVUcmlnZ2VyUG9pbnRBZHZpc29yLnByb2NlZWRNdWx0aSIgLz4KLSAgICAgICAgICAgIAk8cGFyYW1ldGVyIG5hbWU9InByb2NlZWRTaW5nbGUiIHZhbHVlPSIlVHJpZ2dlclBvaW50QWR2aXNvci5wcm9jZWVkU2luZ2xlIiAvPgotICAgICAgICAgICAgCTxwYXJhbWV0ZXIgbmFtZT0iZG9udEFzayIgdmFsdWU9IiVUcmlnZ2VyUG9pbnRBZHZpc29yLmRvbnRBc2siIC8+Ci0gICAgICAgICAgICAJPHBhcmFtZXRlciBuYW1lPSJub0RldGFpbHMiIHZhbHVlPSIlVHJpZ2dlclBvaW50QWR2aXNvci5ub0RldGFpbHMiIC8+Ci0gICAgICAgICAgICA8L2NsYXNzPgotICAgICAgPC90cmlnZ2VyUG9pbnRBZHZpc29yPgotICAgPC9leHRlbnNpb24+ICAgCi0gICAKLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5hY3Rpdml0eVN1cHBvcnQiPgotICAgICAgPHRyaWdnZXJQb2ludEFkdmlzb3JQcm9kdWN0QmluZGluZwotICAgICAgICAgICAgcHJvZHVjdElkPSJvcmcuZWNsaXBzZS5zZGsuaWRlIgotICAgICAgICAgICAgdHJpZ2dlclBvaW50QWR2aXNvcklkPSJvcmcuZWNsaXBzZS51aS5pZGUudHJpZ2dlclBvaW50QWR2aXNvciIvPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLnVpLnNlYXJjaEVuZ2luZSI+Ci0gICAgICA8ZW5naW5lCi0gICAgICAgICAgICBlbmFibGVkPSJ0cnVlIgotICAgICAgICAgICAgZW5naW5lVHlwZUlkPSJvcmcuZWNsaXBzZS5oZWxwLnVpLndlYiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zZGsuR29vZ2xlIgotICAgICAgICAgICAgbGFiZWw9IiVzZWFyY2guR29vZ2xlLmxhYmVsIj4KLSAgICAgIAkJPGRlc2NyaXB0aW9uPgotCSAgICAgIAkJJXNlYXJjaC5Hb29nbGUuZGVzYwotICAgICAgCQk8L2Rlc2NyaXB0aW9uPgotICAgICAgCQk8cGFyYW0gCi0gICAgICAJCQluYW1lPSJ1cmwiIAotICAgICAgCQkJdmFsdWU9Imh0dHA6Ly93d3cuZ29vZ2xlLmNvbS9zZWFyY2g/aGw9ZW4mYW1wO3E9e2V4cHJlc3Npb259JmFtcDtidG5HPUdvb2dsZStTZWFyY2gmYW1wO21ldGE9Ij4KLSAgICAgIAkJPC9wYXJhbT4KLSAgICAgIDwvZW5naW5lPgotICAgICAgPGVuZ2luZQotICAgICAgICAgICAgZW5hYmxlZD0idHJ1ZSIKLSAgICAgICAgICAgIGVuZ2luZVR5cGVJZD0ib3JnLmVjbGlwc2UuaGVscC51aS53ZWIiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc2RrLkVjbGlwc2UiCi0gICAgICAgICAgICBsYWJlbD0iJXNlYXJjaC5FY2xpcHNlLmxhYmVsIj4KLSAgICAgIAkJPGRlc2NyaXB0aW9uPgotCSAgICAgIAkJJXNlYXJjaC5FY2xpcHNlLmRlc2MKLSAgICAgIAkJPC9kZXNjcmlwdGlvbj4KLSAgICAgIAkJPHBhcmFtIAotICAgICAgCQkJbmFtZT0idXJsIiAKLSAgICAgIAkJCXZhbHVlPSJodHRwOi8vZWNsaXBzZS5vcmcvc2VhcmNoL3NlYXJjaC5jZ2k/cT17ZXhwcmVzc2lvbn0mYW1wO3VsPSZhbXA7cHM9MjAmYW1wO209YWxsIj4KLSAgICAgIAkJPC9wYXJhbT4KLSAgICAgIDwvZW5naW5lPgotICAgIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnNkay9wbHVnaW5fY3VzdG9taXphdGlvbi5pbmkgYi9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5zZGsvcGx1Z2luX2N1c3RvbWl6YXRpb24uaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTI4ZjQ5Li4wMDAwMDAwCi0tLSBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnNkay9wbHVnaW5fY3VzdG9taXphdGlvbi5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0jIHBsdWdpbl9jdXN0b21pemF0aW9uLmluaSANCi0jIHNldHMgZGVmYXVsdCB2YWx1ZXMgZm9yIHBsdWctaW4tc3BlY2lmaWMgcHJlZmVyZW5jZXMNCi0jIGtleXMgYXJlIHF1YWxpZmllZCBieSBwbHVnLWluIGlkDQotIyBlLmcuLCBjb20uZXhhbXBsZS5hY21lcGx1Z2luL215cHJvcGVydHk9bXl2YWx1ZQ0KLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykNCi0jICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBwbHVnaW5fY3VzdG9taXphdGlvbi5wcm9wZXJ0aWVzDQotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLg0KLQ0KLSMgUHJvcGVydHkgIm9yZy5lY2xpcHNlLnVpL2RlZmF1bHRQZXJzcGVjdGl2ZUlkIiBjb250cm9scyB0aGUgDQotIyBwZXJzcGVjdGl2ZSB0aGF0IHRoZSB3b3JrYmVuY2ggb3BlbnMgaW5pdGlhbGx5DQotb3JnLmVjbGlwc2UudWkvZGVmYXVsdFBlcnNwZWN0aXZlSWQ9b3JnLmVjbGlwc2UuamR0LnVpLkphdmFQZXJzcGVjdGl2ZQ0KLQ0KLSMgbmV3LXN0eWxlIHRhYnMgYnkgZGVmYXVsdA0KLW9yZy5lY2xpcHNlLnVpL1NIT1dfVFJBRElUSU9OQUxfU1RZTEVfVEFCUz1mYWxzZQ0KLQ0KLSMgcHV0IHRoZSBwZXJzcGVjdGl2ZSBzd2l0Y2hlciBvbiB0aGUgdG9wIHJpZ2h0DQotb3JnLmVjbGlwc2UudWkvRE9DS19QRVJTUEVDVElWRV9CQVI9dG9wUmlnaHQNCi0NCi0jIHNob3cgcHJvZ3Jlc3Mgb24gc3RhcnR1cA0KLW9yZy5lY2xpcHNlLnVpL1NIT1dfUFJPR1JFU1NfT05fU1RBUlRVUD10cnVlDQotDQotIyBzaG93IGJ1aWxkIGlkIGluIHRoZSBzcGxhc2ggLSBvbmx5IGZvciBuaWdodGx5LCBpbnRlZ3JhdGlvbiwgYW5kIG1pbGVzdG9uZSBidWlsZHMNCi1vcmcuZWNsaXBzZS51aS53b3JrYmVuY2gvU0hPV19CVUlMRElEX09OX1NUQVJUVVA9dHJ1ZQ0KLQ0KLSMgdXNlIHRoZSB3aW5kb3cgc2V0IGJ5IGRlZmF1bHQNCi1vcmcuZWNsaXBzZS51aS9VU0VfV0lORE9XX1dPUktJTkdfU0VUX0JZX0RFRkFVTFQ9dHJ1ZQ0KLQ0KLSMgSW50cm8tcmVsYXRlZCBwcmVmZXJlbmNlcyAoc2luY2UgMy4yKQ0KLQ0KLSMgV2VsY29tZSB0aGVtZSB0byB1c2UNCi1vcmcuZWNsaXBzZS51aS5pbnRyby9JTlRST19USEVNRSA9IG9yZy5lY2xpcHNlLnVpLmludHJvLnVuaXZlcnNhbC5jaXJjbGVzDQotDQotIyBSb290IHBhZ2UgbGlua3MgdG8gc2hvdyBpbiB0aGUgVW5pdmVyc2FsIFdlbGNvbWUNCi1vcmcuZWNsaXBzZS51aS5pbnRyby51bml2ZXJzYWwvSU5UUk9fUk9PVF9QQUdFUyA9IG92ZXJ2aWV3LHR1dG9yaWFscyxzYW1wbGVzLHdoYXRzbmV3DQotDQotIyBJbml0aWFsIHBhZ2UgbGF5b3V0IG9mIHRoZSBVbml2ZXJzYWwgV2VsY29tZQ0KLW9yZy5lY2xpcHNlLnVpLmludHJvLnVuaXZlcnNhbC9JTlRST19EQVRBID0gcHJvZHVjdDppbnRyb0RhdGEueG1sDQotDQotIyBPcmRlciBoZWxwIGJvb2tzIGluIHRhYmxlIG9mIGNvbnRlbnRzDQotb3JnLmVjbGlwc2UuaGVscC9IRUxQX0RBVEEgPSBoZWxwRGF0YS54bWwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5zZGsvcGx1Z2luX2N1c3RvbWl6YXRpb24ucHJvcGVydGllcyBiL3BsYXRmb3JtL29yZy5lY2xpcHNlLnNkay9wbHVnaW5fY3VzdG9taXphdGlvbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTQzMTAxLi4wMDAwMDAwCi0tLSBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnNkay9wbHVnaW5fY3VzdG9taXphdGlvbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBwbHVnaW5fY3VzdG9taXphdGlvbi5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBwbHVnaW5fY3VzdG9taXphdGlvbi5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb25maWd1cmF0b3IvQ29uZmlndXJhdGlvbi5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb25maWd1cmF0b3IvQ29uZmlndXJhdGlvbi5qYXZhCmluZGV4IGM5ODNlZjYuLjJiZWZhYTMgMTAwNjQ0Ci0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29uZmlndXJhdG9yL0NvbmZpZ3VyYXRpb24uamF2YQorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvbmZpZ3VyYXRvci9Db25maWd1cmF0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtNywxMiArNyw5IEBACiAgKgogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEphbWVzIEQgTWlsZXMgKElCTSBDb3JwLikgLSBidWcgMTc2MjUwLCBDb25maWd1cmF0b3IgbmVlZHMgdG8gaGFuZGxlIG1vcmUgcGxhdGZvcm0gdXJscyAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29uZmlndXJhdG9yOwogCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5uZXQuKjsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5EYXRlOwpAQCAtMjYsNyArMjMsNiBAQAogcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb24gaW1wbGVtZW50cyBJQ29uZmlndXJhdGlvbkNvbnN0YW50cyB7CiAJCiAJcHJpdmF0ZSBIYXNoTWFwIHNpdGVzID0gbmV3IEhhc2hNYXAoKTsKLQlwcml2YXRlIEhhc2hNYXAgcGxhdGZvcm1VUkxzID0gbmV3IEhhc2hNYXAoKTsKIAlwcml2YXRlIERhdGUgZGF0ZTsKIAlwcml2YXRlIGxvbmcgbGFzdE1vZGlmaWVkOyAvLyBuZWVkZWQgdG8gYWNjb3VudCBmb3IgZmlsZSBzeXN0ZW0gbGltaXRhdGlvbnMKIAlwcml2YXRlIFVSTCB1cmw7CkBAIC04MCwzNCArNzYsMTIgQEAKIAkJaWYgKHNpdGVzLmdldCh1cmwpID09IG51bGwgJiYgKGxpbmtlZENvbmZpZyA9PSBudWxsIHx8IGxpbmtlZENvbmZpZy5zaXRlcy5nZXQodXJsKSA9PSBudWxsKSkgewogCQkJc2l0ZS5zZXRDb25maWcodGhpcyk7CiAJCQlzaXRlcy5wdXQodXJsLCBzaXRlKTsKLQkJCWlmKHVybC5zdGFydHNXaXRoKCJwbGF0Zm9ybToiKSl7Ly8kTk9OLU5MUy0xJAotCQkJCVVSTCBwVVJMOwotCQkJCXRyeSB7Ci0JCQkJCXBVUkwgPSBuZXcgVVJMKHVybCk7Ci0JCQkJCVVSTCByVVJMID0gUGxhdGZvcm1Db25maWd1cmF0aW9uLnJlc29sdmVQbGF0Zm9ybVVSTChwVVJMKTsKLQkJCQkJU3RyaW5nIHJlc29sdmVkVVJMID0gclVSTC50b0V4dGVybmFsRm9ybSgpOwotCQkJCQlwbGF0Zm9ybVVSTHMucHV0KHJlc29sdmVkVVJMLCBwVVJMKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIGNhbid0IHJlc29sdmUgc28gY2FuJ3QgaGF2ZSBsb29rIHVwLgotCQkJCX0KLQkJCX0KIAkJfQogCX0KIAkKIAlwdWJsaWMgdm9pZCByZW1vdmVTaXRlRW50cnkoU3RyaW5nIHVybCkgewogCQl1cmwgPVV0aWxzLmNhbm9uaWNhbGl6ZVVSTCh1cmwpOwkJCiAJCXNpdGVzLnJlbW92ZSh1cmwpOwotCQlpZih1cmwuc3RhcnRzV2l0aCgicGxhdGZvcm06IikpeyAvLyROT04tTkxTLTEkCi0JCQlVUkwgcFVSTDsKLQkJCXRyeSB7Ci0JCQkJcFVSTCA9IG5ldyBVUkwodXJsKTsKLQkJCQlVUkwgclVSTCA9IFBsYXRmb3JtQ29uZmlndXJhdGlvbi5yZXNvbHZlUGxhdGZvcm1VUkwocFVSTCk7Ci0JCQkJU3RyaW5nIHJlc29sdmVkVVJMID0gclVSTC50b0V4dGVybmFsRm9ybSgpOwotCQkJCXBsYXRmb3JtVVJMcy5yZW1vdmUocmVzb2x2ZWRVUkwpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCS8vIGNhbid0IHJlc29sdmUgc28gY2FuJ3QgaGF2ZSBsb29rIHVwLgotCQkJfQotCQl9CiAJfQogCQogCXB1YmxpYyBTaXRlRW50cnkgZ2V0U2l0ZUVudHJ5KFN0cmluZyB1cmwpIHsKQEAgLTE4NywyNSArMTYxLDQgQEAKIAlwdWJsaWMgbG9uZyBsYXN0TW9kaWZpZWQoKSB7CiAJCXJldHVybiAobGFzdE1vZGlmaWVkICE9IDApID8gbGFzdE1vZGlmaWVkIDogZGF0ZS5nZXRUaW1lKCk7CiAJfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHVybCBhcyBhIHBsYXRmb3JtOi8gdXJsLCBpZiBwb3NzaWJsZSwgZWxzZSBsZWF2ZXMgaXQgdW5jaGFuZ2VkCi0JICogQHBhcmFtIHVybAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgVVJMIGFzUGxhdGZvcm1VUkwoVVJMIHVybCkgewotCQl0cnkgewotCQkJaWYgKHVybC5nZXRQcm90b2NvbCgpLmVxdWFscygiZmlsZSIpKSB7Ly8kTk9OLU5MUy0xJAotCQkJCVN0cmluZyByVXJsID0gdXJsLnRvRXh0ZXJuYWxGb3JtKCk7Ci0JCQkJVVJMIHBVcmwgPSAoVVJMKXBsYXRmb3JtVVJMcy5nZXQoclVybCk7Ci0JCQkJaWYocFVybCA9PSBudWxsKQotCQkJCQlyZXR1cm4gdXJsOwotCQkJCXJldHVybiBwVXJsOwotCQkJfQotCQkJcmV0dXJuIHVybDsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiB1cmw7Ci0JCX0KLQl9Ci0JCiB9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvbmZpZ3VyYXRvci9QbGF0Zm9ybUNvbmZpZ3VyYXRpb24uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29uZmlndXJhdG9yL1BsYXRmb3JtQ29uZmlndXJhdGlvbi5qYXZhCmluZGV4IDUyY2VlZmQuLmFmZDc2YjkgMTAwNjQ0Ci0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29uZmlndXJhdG9yL1BsYXRmb3JtQ29uZmlndXJhdGlvbi5qYXZhCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29uZmlndXJhdG9yL1BsYXRmb3JtQ29uZmlndXJhdGlvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTcsNyArNyw2IEBACiAgKgogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEphbWVzIEQgTWlsZXMgKElCTSBDb3JwLikgLSBidWcgMTc2MjUwLCBDb25maWd1cmF0b3IgbmVlZHMgdG8gaGFuZGxlIG1vcmUgcGxhdGZvcm0gdXJscyAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29uZmlndXJhdG9yOwogCkBAIC0yNzksNyArMjc4LDcgQEAKIAkJCQogCQlpZiAocmVzdWx0ID09IG51bGwgJiYgY2hlY2tQbGF0Zm9ybVVSTCkgewogCQkJdHJ5IHsKLQkJCQlyZXN1bHQgPSBmaW5kQ29uZmlndXJlZFNpdGUoY29uZmlnLmFzUGxhdGZvcm1VUkwodXJsKSwgZmFsc2UpOworCQkJCXJlc3VsdCA9IGZpbmRDb25maWd1cmVkU2l0ZShVdGlscy5hc1BsYXRmb3JtVVJMKHVybCksIGZhbHNlKTsKIAkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAJCQkJLy9pZ25vcmUKIAkJCX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29uZmlndXJhdG9yL1V0aWxzLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvbmZpZ3VyYXRvci9VdGlscy5qYXZhCmluZGV4IDEzNDllZjcuLjY4MTE4OGQgMTAwNjQ0Ci0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29uZmlndXJhdG9yL1V0aWxzLmphdmEKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb25maWd1cmF0b3IvVXRpbHMuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC03LDcgKzcsNiBAQAogICoKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKYW1lcyBEIE1pbGVzIChJQk0gQ29ycC4pIC0gYnVnIDE3NjI1MCwgQ29uZmlndXJhdG9yIG5lZWRzIHRvIGhhbmRsZSBtb3JlIHBsYXRmb3JtIHVybHMgCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvbmZpZ3VyYXRvcjsKIApAQCAtMTE2LDYgKzExNSwyOCBAQAogCX0KIAkKIAkvKioKKwkgKiBSZXR1cm5zIHRoZSB1cmwgYXMgYSBwbGF0Zm9ybTovIHVybCwgaWYgcG9zc2libGUsIGVsc2UgbGVhdmVzIGl0IHVuY2hhbmdlZAorCSAqIEBwYXJhbSB1cmwKKwkgKiBAcmV0dXJuCisJICovCisJcHVibGljIHN0YXRpYyBVUkwgYXNQbGF0Zm9ybVVSTChVUkwgdXJsKSB7CisJCXRyeSB7CisJCQlVUkwgcGxhdGZvcm1VUkwgPSBuZXcgVVJMKCJwbGF0Zm9ybTovYmFzZS8iKTsgLy8kTk9OLU5MUy0xJCAgLy8gdHJ5IHVzaW5nIHBsYXRmb3JtLXJlbGF0aXZlIFVSTAorCQkJVVJMIHJlc29sdmVkUGxhdGZvcm1VUkwgPSBGaWxlTG9jYXRvci50b0ZpbGVVUkwocGxhdGZvcm1VUkwpOworCQkJLy8gVE9ETyB3b3JrYXJvdW5kIGJ1ZyBpbiBwbGF0Zm9ybSB1cmwgcmVzb2x1dGlvbgorCQkJaWYgKHJlc29sdmVkUGxhdGZvcm1VUkwuZ2V0UHJvdG9jb2woKS5lcXVhbHMoImZpbGUiKSkgLy8kTk9OLU5MUy0xJAorCQkJCXJlc29sdmVkUGxhdGZvcm1VUkwgPSBuZXcgRmlsZShyZXNvbHZlZFBsYXRmb3JtVVJMLmdldEZpbGUoKSkudG9VUkwoKTsKKwkJCVN0cmluZyBwbGF0Zm9ybVVSTEFzU3RyaW5nID0gcmVzb2x2ZWRQbGF0Zm9ybVVSTC50b0V4dGVybmFsRm9ybSgpOworCQkJU3RyaW5nIHVybEFzU3RyaW5nID0gdXJsLnRvRXh0ZXJuYWxGb3JtKCk7CisJCQlpZiAodXJsQXNTdHJpbmcuc3RhcnRzV2l0aChwbGF0Zm9ybVVSTEFzU3RyaW5nKSkKKwkJCQlyZXR1cm4gbmV3IFVSTChwbGF0Zm9ybVVSTC50b0V4dGVybmFsRm9ybSgpICsgdXJsQXNTdHJpbmcuc3Vic3RyaW5nKHBsYXRmb3JtVVJMQXNTdHJpbmcubGVuZ3RoKCkpICk7CisJCQlyZXR1cm4gdXJsOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJcmV0dXJuIHVybDsKKwkJfQorCX0KKwkJCisJLyoqCiAJICogQ2xvc2UgdGhlIHNlcnZpY2VzIHRoYXQgd2Ugd2VyZSBsaXN0ZW5pbmcgdG8uCiAJICovCiAJLypwYWNrYWdlKi8gc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIHNodXRkb3duKCkgewpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmxpbnV4Ly5jbGFzc3BhdGggYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubGludXgvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg0ODI0OS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubGludXgvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08Y2xhc3NwYXRoPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCi08L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubGludXgvLmN2c2lnbm9yZSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5saW51eC8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWU4MmQ3Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5saW51eC8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmxpbnV4Ly5wcm9qZWN0IGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmxpbnV4Ly5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzhlMmI3Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5saW51eC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHByb2plY3REZXNjcmlwdGlvbj4NCi0JPG5hbWU+b3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubGludXg8L25hbWU+DQotCTxjb21tZW50PjwvY29tbWVudD4NCi0JPHByb2plY3RzPg0KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuY29yZS5ib290PC9wcm9qZWN0Pg0KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuY29yZS5ydW50aW1lPC9wcm9qZWN0Pg0KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbXBhdGliaWxpdHk8L3Byb2plY3Q+DQotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yPC9wcm9qZWN0Pg0KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UudXBkYXRlLmNvcmU8L3Byb2plY3Q+DQotCTwvcHJvamVjdHM+DQotCTxidWlsZFNwZWM+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JPC9idWlsZFNwZWM+DQotCTxuYXR1cmVzPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4NCi0JPC9uYXR1cmVzPg0KLTwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5saW51eC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5saW51eC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVhMjRjMy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubGludXgvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVmcmFnbWVudE5hbWVMaW51eAotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubGludXgKLUJ1bmRsZS1WZXJzaW9uOiAzLjIuMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUZyYWdtZW50LUhvc3Q6IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy4wLjAsNC4wLjApIgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FY2xpcHNlLVBsYXRmb3JtRmlsdGVyOiAob3NnaS5vcz1saW51eCkKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5saW51eC9hYm91dC5odG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmxpbnV4L2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2MDIzMzAuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmxpbnV4L2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+SnVuZSAyLCAyMDA2PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmxpbnV4L2J1aWxkLnByb3BlcnRpZXMgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubGludXgvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Q5NWEyZS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubGludXgvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IG9zLyxcCi0gICAgICAgICAgICAgICBmcmFnbWVudC5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvCi1zcmMuaW5jbHVkZXMgPSBzcmMvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5saW51eC9vcy9saW51eC94ODYvbGlidXBkYXRlLnNvIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmxpbnV4L29zL2xpbnV4L3g4Ni9saWJ1cGRhdGUuc28KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3MGE5ZTkuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmxpbnV4L29zL2xpbnV4L3g4Ni9saWJ1cGRhdGUuc28KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubGludXgvc3JjL2J1aWxkLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5saW51eC9zcmMvYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGY5NmJlLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5saW51eC9zcmMvYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0IG5hbWU9ImJ1aWxkbGlicmFyeSIgZGVmYXVsdD0icnVuIiBiYXNlZGlyPSIuIj4gCi0gIAotICA8IS0tIFRoZSBwcm9wZXJ0aWVzICR7ZWNsaXBzZS1ob21lfSAke2pkay1wYXRofSBzaG91bGQgYmUgcGFzc2VkIGludG8gdGhpcyBzY3JpcHQgLS0+Ci0gIDwhLS0gU2V0IGEgbWVhbmluZ2Z1bCBkZWZhdWx0IHZhbHVlIGZvciB3aGVuIGl0IGlzIG5vdC4gLS0+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJlY2xpcHNlLWhvbWUiIHZhbHVlPSIke2Jhc2VkaXJ9Ly4uLy4uIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJqZGstcGF0aCIgdmFsdWU9IiR7amF2YS5ob21lfSIvPiAgCi0gIDxwcm9wZXJ0eSBuYW1lPSJkZXN0aW5hdGlvbiIgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5saW51eC9vcy9saW51eC94ODYvIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJvYmotcGF0aCIgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5saW51eC9zcmMvIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJzcmMtcGF0aCIgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5saW51eC9zcmMvIi8+ICAKLSAgCi0gIDwhLS0gc2V0cyB0aGUgcHJvcGVydGllcyAtLT4KLSAgPHByb3BlcnR5IG5hbWU9ImxpYnJhcnktbmFtZSIgdmFsdWU9ImxpYnVwZGF0ZSIvPiAgCi0gIDxwcm9wZXJ0eSBuYW1lPSJsaWJyYXJ5LXBsYXRmb3JtIiB2YWx1ZT0ic28iLz4gICAgCi0gIDxwcm9wZXJ0eSBuYW1lPSJsaWJyYXJ5LWZpbGUiIHZhbHVlPSIke2xpYnJhcnktbmFtZX0uJHtsaWJyYXJ5LXBsYXRmb3JtfSIvPgotICAKLSAgPCEtLSBUaGlzIHRhcmdldCBob2xkcyBhbGwgaW5pdGlhbGl6YXRpb24gY29kZSB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgZm9yIC0tPgotICA8IS0tIGFsbCB0ZXN0cyB0aGF0IGFyZSB0byBiZSBydW4uIEluaXRpYWxpemF0aW9uIGZvciBpbmRpdmlkdWFsIHRlc3RzIC0tPgotICA8IS0tIHNob3VsZCBiZSBkb25lIHdpdGhpbiB0aGUgYm9keSBvZiB0aGUgc3VpdGUgdGFyZ2V0LiAtLT4KLSAgPHRhcmdldCBuYW1lPSJpbml0Ij4KLSAgICA8dHN0YW1wLz4KLSAgICA8ZGVsZXRlPgotICAgICAgPGZpbGVzZXQgZGlyPSIke29iai1wYXRofSIgaW5jbHVkZXM9IiR7bGlicmFyeS1maWxlfSIvPgotICAgICAgPGZpbGVzZXQgZGlyPSIke29iai1wYXRofSIgaW5jbHVkZXM9IiR7bGlicmFyeS1uYW1lfS5vIi8+Ci0gICAgPC9kZWxldGU+Ci0gIDwvdGFyZ2V0PgotICAKLSAgPCEtLSBUaGlzIHRhcmdldCBob2xkcyBjb2RlIHRvIGNsZWFudXAgdGhlIHRlc3RpbmcgZW52aXJvbm1lbnQgYWZ0ZXIgLS0+Ci0gIDwhLS0gYWZ0ZXIgYWxsIG9mIHRoZSB0ZXN0cyBoYXZlIGJlZW4gcnVuLiBZb3UgY2FuIHVzZSB0aGlzIHRhcmdldCB0byAtLT4KLSAgPCEtLSBkZWxldGUgdGVtcG9yYXJ5IGZpbGVzIHRoYXQgaGF2ZSBiZWVuIGNyZWF0ZWQuIC0tPgotICA8dGFyZ2V0IG5hbWU9ImNsZWFudXAiPgotICAgICAgPGRlbGV0ZT4KLSAgICAgIDxmaWxlc2V0IGRpcj0iJHtvYmotcGF0aH0iIGluY2x1ZGVzPSIke2xpYnJhcnktZmlsZX0iLz4KLSAgICAgIDxmaWxlc2V0IGRpcj0iJHtvYmotcGF0aH0iIGluY2x1ZGVzPSIke2xpYnJhcnktbmFtZX0ubyIvPgotICAgIDwvZGVsZXRlPgotICA8L3RhcmdldD4KLSAgCi0gIAotICA8IS0tIFRoaXMgdGFyZ2V0IHJ1bnMgdGhlIGJ1aWxkLiAtLT4KLSAgPHRhcmdldCBuYW1lPSJydW4iIGRlcGVuZHM9ImluaXQsYnVpbGQsY2xlYW51cCI+Ci0gIDwvdGFyZ2V0PgotICAKLSAgPCEtLSBUaGlzIHRhcmdldCBidWlsZCB0aGUgbGlicmFyeSAtLT4KLSAgPHRhcmdldCBuYW1lPSJidWlsZCI+Ci0gICAgPGVjaG8gbWVzc2FnZT0iQnVpbGRpbmcgJHtsaWJyYXJ5LWZpbGV9Ii8+Ci0KLSAgICA8cHJvcGVydHkgbmFtZT0iaGVhZGVyLXBhdGgiIHZhbHVlPSIke2pkay1wYXRofS8uLi9pbmNsdWRlIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImhlYWRlci1saW51eC1wYXRoIiB2YWx1ZT0iJHtoZWFkZXItcGF0aH0vbGludXgiIC8+Ci0KLQk8ZWNobyBtZXNzYWdlPSJnY2MgLW8gICR7bGlicmFyeS1maWxlfSAtc2hhcmVkIC1JJHtzcmMtcGF0aH0gLUkke2hlYWRlci1saW51eC1wYXRofSAtZlBJQyAke2xpYnJhcnktZmlsZX0iLz4KLQotICAgIDxhcHBseSBleGVjdXRhYmxlPSJnY2MiIGRlc3Q9IiR7ZWNsaXBzZS1ob21lfS8iIHBhcmFsbGVsPSJmYWxzZSI+Ci0gICAgICA8YXJnIHZhbHVlPSItbyIvPgotICAgICAgPGFyZyB2YWx1ZT0iJHtsaWJyYXJ5LWZpbGV9Ii8+Ci0gICAgICA8YXJnIHZhbHVlPSItc2hhcmVkIi8+Ci0gICAgICA8YXJnIHZhbHVlPSItSSR7c3JjLXBhdGh9Ii8+Ci0gICAgICA8YXJnIHZhbHVlPSItSSR7aGVhZGVyLXBhdGh9Ii8+ICAgICAgCi0gICAgICA8YXJnIHZhbHVlPSItSSR7aGVhZGVyLWxpbnV4LXBhdGh9Ii8+Ci0gICAgICA8YXJnIHZhbHVlPSItZlBJQyIvPgotCSAgPHNyY2ZpbGUvPgotICAgICAgPGZpbGVzZXQgZGlyPSIke3NyYy1wYXRofSIgaW5jbHVkZXM9IiouYyIvPgotICAgICAgPG1hcHBlciB0eXBlPSJnbG9iIiBmcm9tPSIqLmMiIHRvPSIqLm8iLz4KLSAgICA8L2FwcGx5PgotICAgIAotCTxtb3ZlIGZpbGU9IiR7bGlicmFyeS1maWxlfSIgdG9kaXI9IiR7ZGVzdGluYXRpb259Ii8+Ci0gIDwvdGFyZ2V0PgotICAKLSAgCi08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmxpbnV4L3NyYy91cGRhdGUuYyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5saW51eC9zcmMvdXBkYXRlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyYWNjMjYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmxpbnV4L3NyYy91cGRhdGUuYworKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLaAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLQ0KLS8qIGJ1ZyA4MjUyMCA6IG5lZWQgdG8gaW5jbHVkZSBzdGRsaWIuaCAqLw0KLSMgaW5jbHVkZSA8c3RkbGliLmg+DQotIyBpbmNsdWRlIDxzeXMvdHlwZXMuaD4NCi0jIGluY2x1ZGUgPHN5cy9zdGF0ZnMuaD4NCi0jIGluY2x1ZGUgPHVwZGF0ZS5oPg0KLQ0KLS8qDQotICogQ2xhc3M6ICAgICBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm8NCi0gKiBNZXRob2Q6ICAgIG5hdGl2ZUdldEZyZWVTcGFjZQ0KLSAqIFNpZ25hdHVyZTogKExqYXZhL2lvL0ZpbGU7KUoNCi0gKi8NCi1KTklFWFBPUlQgamxvbmcgSk5JQ0FMTCBKYXZhX29yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19uYXRpdmVHZXRGcmVlU3BhY2UoDQotCUpOSUVudiAqIGpuaWVudiwNCi0JamNsYXNzIGphdmFDbGFzcywNCi0Jam9iamVjdCBmaWxlKSB7DQotDQotCS8vIHRvIHJldHJpdmUgdGhlIFN0cmluZw0KLQlqY2xhc3MgY2xzOw0KLQlqbWV0aG9kSUQgaWQ7DQotCWpvYmplY3Qgb2JqOw0KLQ0KLQkvLyBqYXZhLmlvLkZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkNCi0JY29uc3QgY2hhciAqIGxwRGlyZWN0b3J5TmFtZTsNCi0NCi0JLy8gTGludXggUGFyYW1ldGVycw0KLQlzdHJ1Y3Qgc3RhdGZzIGJ1ZmZlcjsNCi0NCi0JLy8gdGhlIHJlc3VsdA0KLQlqbG9uZyByZXN1bHQgPSBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fU0laRV9VTktOT1dOOw0KLQ0KLQljbHMgPSAoKmpuaWVudikgLT4gR2V0T2JqZWN0Q2xhc3Moam5pZW52LCBmaWxlKTsNCi0JaWQgPSAoKmpuaWVudikgLT4gR2V0TWV0aG9kSUQoam5pZW52LCBjbHMsICJnZXRBYnNvbHV0ZVBhdGgiLCAiKClMamF2YS9sYW5nL1N0cmluZzsiKTsNCi0Jb2JqID0gKCpqbmllbnYpIC0+IENhbGxPYmplY3RNZXRob2Qoam5pZW52LCBmaWxlLCBpZCk7DQotCWxwRGlyZWN0b3J5TmFtZSA9ICgqam5pZW52KSAtPiBHZXRTdHJpbmdVVEZDaGFycyhqbmllbnYsIChqc3RyaW5nKSBvYmosIDApOw0KLQ0KLQkvLyBjYXN0IG9uZSBhcmd1bWVudCBhcyBqbG9uZyB0byBoYXZlIGEgamxvbmcgcmVzdWx0DQotCWludCBlcnIgPSBzdGF0ZnMobHBEaXJlY3RvcnlOYW1lLCZidWZmZXIpOw0KLQlpZiAoZXJyPT0wKXsNCi0JCWxvbmcgc2l6ZSA9IGJ1ZmZlci5mX2JzaXplOw0KLQkJamxvbmcgZnJlZSA9IGJ1ZmZlci5mX2JmcmVlOw0KLQkJcmVzdWx0ID0gc2l6ZSpmcmVlOw0KLQl9DQotDQotCXJldHVybiByZXN1bHQ7DQotfQ0KLQ0KLS8qDQotICogQ2xhc3M6ICAgICBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm8NCi0gKiBNZXRob2Q6ICAgIG5hdGl2ZUdldExhYmVsDQotICogU2lnbmF0dXJlOiAoTGphdmEvaW8vRmlsZTspTGphdmEvbGFuZy9TdHJpbmc7DQotICovDQotSk5JRVhQT1JUIGpzdHJpbmcgSk5JQ0FMTCBKYXZhX29yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19uYXRpdmVHZXRMYWJlbCgNCi0JSk5JRW52ICogam5pZW52LA0KLQlqY2xhc3MgamF2YUNsYXNzLA0KLQlqb2JqZWN0IGZpbGUpIHsNCi0NCi0JLy8gdG8gcmV0cml2ZSB0aGUgU3RyaW5nDQotCWpjbGFzcyBjbHM7DQotCWptZXRob2RJRCBpZDsNCi0Jam9iamVjdCBvYmo7DQotDQotCS8vIGphdmEuaW8uRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKQ0KLQljb25zdCBjaGFyICogbHBEaXJlY3RvcnlOYW1lOw0KLQ0KLQkvLyBvYnRhaW4gdGhlIFN0cmluZyBmcm9tIHRoZSBwYXJhbWV0ZXINCi0JY2xzID0gKCpqbmllbnYpIC0+IEdldE9iamVjdENsYXNzKGpuaWVudiwgZmlsZSk7DQotCWlkID0gKCpqbmllbnYpIC0+IEdldE1ldGhvZElEKGpuaWVudiwgY2xzLCAiZ2V0QWJzb2x1dGVQYXRoIiwgIigpTGphdmEvbGFuZy9TdHJpbmc7Iik7DQotCW9iaiA9ICgqam5pZW52KSAtPiBDYWxsT2JqZWN0TWV0aG9kKGpuaWVudiwgZmlsZSwgaWQpOw0KLQlscERpcmVjdG9yeU5hbWUgPSAoKmpuaWVudikgLT4gR2V0U3RyaW5nVVRGQ2hhcnMoam5pZW52LCAoanN0cmluZykgb2JqLCAwKTsNCi0NCi0JanN0cmluZyByZXN1bHQgPSBOVUxMOw0KLQ0KLQkvLyBMaW51eCBpbXBsZW1lbnRhdGlvbiBmb2xsb3dpbmcNCi0NCi0JcmV0dXJuIHJlc3VsdDsNCi19DQotDQotLyoNCi0gKiBDbGFzczogICAgIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mbw0KLSAqIE1ldGhvZDogICAgbmF0aXZlR2V0VHlwZQ0KLSAqIFNpZ25hdHVyZTogKExqYXZhL2lvL0ZpbGU7KUkNCi0gKi8NCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX25hdGl2ZUdldFR5cGUoDQotCUpOSUVudiAqIGpuaWVudiwNCi0JamNsYXNzIGphdmFDbGFzcywNCi0Jam9iamVjdCBmaWxlKSB7DQotDQotCS8vIHRvIHJldHJpdmUgdGhlIFN0cmluZw0KLQlqY2xhc3MgY2xzOw0KLQlqbWV0aG9kSUQgaWQ7DQotCWpvYmplY3Qgb2JqOw0KLQ0KLQkvLyBqYXZhLmlvLkZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkNCi0JY29uc3QgY2hhciAqIGxwRGlyZWN0b3J5TmFtZTsNCi0NCi0JLy8gb2J0YWluIHRoZSBTdHJpbmcgZnJvbSB0aGUgcGFyYW1ldGVyDQotCWNscyA9ICgqam5pZW52KSAtPiBHZXRPYmplY3RDbGFzcyhqbmllbnYsIGZpbGUpOw0KLQlpZCA9ICgqam5pZW52KSAtPiBHZXRNZXRob2RJRChqbmllbnYsIGNscywgImdldEFic29sdXRlUGF0aCIsICIoKUxqYXZhL2xhbmcvU3RyaW5nOyIpOw0KLQlvYmogPSAoKmpuaWVudikgLT4gQ2FsbE9iamVjdE1ldGhvZChqbmllbnYsIGZpbGUsIGlkKTsNCi0JbHBEaXJlY3RvcnlOYW1lID0gKCpqbmllbnYpIC0+IEdldFN0cmluZ1VURkNoYXJzKGpuaWVudiwgKGpzdHJpbmcpIG9iaiwgMCk7DQotDQotCWludCByZXN1bHQ7DQotCQ0KLQkvLyBMaW51eCBpbXBsZW1hbnRhdGlvbg0KLQ0KLQlyZXN1bHQgPSBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fVk9MVU1FX0lOVkFMSURfUEFUSDsNCi0JcmV0dXJuIHJlc3VsdDsNCi19DQotDQotLyoNCi0gKiBDbGFzczogICAgIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mbw0KLSAqIE1ldGhvZDogICAgbmF0aXZlTGlzdE1vdW50UG9pbnRzDQotICogU2lnbmF0dXJlOiAoKVtMamF2YS9sYW5nL1N0cmluZzsNCi0gKi8NCi1KTklFWFBPUlQgam9iamVjdEFycmF5IEpOSUNBTEwgSmF2YV9vcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fbmF0aXZlTGlzdE1vdW50UG9pbnRzKA0KLQlKTklFbnYgKiBqbmllbnYsDQotCWpjbGFzcyBqYXZhQ2xhc3MpIHsNCi0NCi0JLy8NCi0JaW50IGRyaXZlOw0KLQljaGFyIGRyaXZlTmFtZVsxMDBdOw0KLQlqb2JqZWN0QXJyYXkgcmV0dXJuQXJyYXk7DQotCWludCBuRHJpdmUgPSAwOw0KLQ0KLQkvLyANCi0JamNsYXNzIHN0cmluZ0NsYXNzOw0KLQlqb2JqZWN0IGVtcHR5Ow0KLQlpbnQgaW5kZXggPSAwOw0KLQlqb2JqZWN0IHN0cjsNCi0NCi0JLy8gTGludXggaW1wbGVtZW50YXRpb24NCi0JLy8gZmluZCBtb3VudCBwb2ludHMNCi0NCi0JZHJpdmUgPSAwOw0KLQlzdHJpbmdDbGFzcyA9ICgqam5pZW52KSAtPiBGaW5kQ2xhc3Moam5pZW52LCAiamF2YS9sYW5nL1N0cmluZyIpOw0KLQllbXB0eSA9ICgqam5pZW52KSAtPiBOZXdTdHJpbmdVVEYoam5pZW52LCAiIik7DQotCS8vcmV0dXJuQXJyYXkgPSAoKmpuaWVudikgLT4gTmV3T2JqZWN0QXJyYXkoam5pZW52LCBuRHJpdmUsIHN0cmluZ0NsYXNzLCBlbXB0eSk7DQotDQotCS8vIGZvciBub3cgcmV0dXJuIG51bGwgYXMgbWV0aG9kIGlzIG5vdCBpbXBsZW1lbnRlZA0KLQlyZXR1cm5BcnJheSA9IE5VTEw7DQotDQotCWludCBpOw0KLQlmb3IgKGkgPSAwOyBpIDwgZHJpdmU7IGkrKykgew0KLQkJLy8gTGludXggaW1wbGVtZW50YXRpb24sIGNyZWF0ZSBTdHJpbmcgZm9yIGVhY2ggbW91bnQgcG9pbnQNCi0NCi0JCXN0ciA9ICgqam5pZW52KSAtPiBOZXdTdHJpbmdVVEYoam5pZW52LCBkcml2ZU5hbWUpOw0KLQkJKCpqbmllbnYpIC0+IFNldE9iamVjdEFycmF5RWxlbWVudChqbmllbnYsIHJldHVybkFycmF5LCBpbmRleCwgc3RyKTsNCi0NCi0JCWluZGV4Kys7DQotCX0NCi0NCi0JcmV0dXJuIHJldHVybkFycmF5Ow0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubGludXgvc3JjL3VwZGF0ZS5oIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmxpbnV4L3NyYy91cGRhdGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNkZGI4Yy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubGludXgvc3JjL3VwZGF0ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyogRE8gTk9UIEVESVQgVEhJUyBGSUxFIC0gaXQgaXMgbWFjaGluZSBnZW5lcmF0ZWQgKi8NCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLaAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLSANCi0jaW5jbHVkZSA8am5pLmg+DQotLyogSGVhZGVyIGZvciBjbGFzcyBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm8gKi8NCi0NCi0jaWZuZGVmIF9JbmNsdWRlZF9vcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm8NCi0jZGVmaW5lIF9JbmNsdWRlZF9vcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm8NCi0jaWZkZWYgX19jcGx1c3BsdXMNCi1leHRlcm4gIkMiIHsNCi0jZW5kaWYNCi0jdW5kZWYgb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1NJWkVfVU5LTk9XTg0KLSNkZWZpbmUgb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1NJWkVfVU5LTk9XTiAtMUwNCi0jdW5kZWYgb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1ZPTFVNRV9VTktOT1dODQotI2RlZmluZSBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fVk9MVU1FX1VOS05PV04gLTFMDQotI3VuZGVmIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19WT0xVTUVfSU5WQUxJRF9QQVRIDQotI2RlZmluZSBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fVk9MVU1FX0lOVkFMSURfUEFUSCAtMkwNCi0jdW5kZWYgb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1ZPTFVNRV9SRU1PVkFCTEUNCi0jZGVmaW5lIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19WT0xVTUVfUkVNT1ZBQkxFIDFMDQotI3VuZGVmIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19WT0xVTUVfRklYRUQNCi0jZGVmaW5lIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19WT0xVTUVfRklYRUQgMkwNCi0jdW5kZWYgb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1ZPTFVNRV9SRU1PVEUNCi0jZGVmaW5lIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19WT0xVTUVfUkVNT1RFIDNMDQotI3VuZGVmIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19WT0xVTUVfQ0RST00NCi0jZGVmaW5lIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19WT0xVTUVfQ0RST00gNEwNCi0jdW5kZWYgb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1ZPTFVNRV9SQU1ESVNLDQotI2RlZmluZSBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fVk9MVU1FX1JBTURJU0sgNUwNCi0vKiBJbmFjY2Vzc2libGUgc3RhdGljOiBsaXN0ZW5lcnMgKi8NCi0vKiBJbmFjY2Vzc2libGUgc3RhdGljOiBoYXNOYXRpdmVzICovDQotLyoNCi0gKiBDbGFzczogICAgIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mbw0KLSAqIE1ldGhvZDogICAgbmF0aXZlR2V0RnJlZVNwYWNlDQotICogU2lnbmF0dXJlOiAoTGphdmEvaW8vRmlsZTspSg0KLSAqLw0KLUpOSUVYUE9SVCBqbG9uZyBKTklDQUxMIEphdmFfb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX25hdGl2ZUdldEZyZWVTcGFjZQ0KLSAgKEpOSUVudiAqLCBqY2xhc3MsIGpvYmplY3QpOw0KLQ0KLS8qDQotICogQ2xhc3M6ICAgICBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm8NCi0gKiBNZXRob2Q6ICAgIG5hdGl2ZUdldExhYmVsDQotICogU2lnbmF0dXJlOiAoTGphdmEvaW8vRmlsZTspTGphdmEvbGFuZy9TdHJpbmc7DQotICovDQotSk5JRVhQT1JUIGpzdHJpbmcgSk5JQ0FMTCBKYXZhX29yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19uYXRpdmVHZXRMYWJlbA0KLSAgKEpOSUVudiAqLCBqY2xhc3MsIGpvYmplY3QpOw0KLQ0KLS8qDQotICogQ2xhc3M6ICAgICBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm8NCi0gKiBNZXRob2Q6ICAgIG5hdGl2ZUdldFR5cGUNCi0gKiBTaWduYXR1cmU6IChMamF2YS9pby9GaWxlOylJDQotICovDQotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBKYXZhX29yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19uYXRpdmVHZXRUeXBlDQotICAoSk5JRW52ICosIGpjbGFzcywgam9iamVjdCk7DQotDQotLyoNCi0gKiBDbGFzczogICAgIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mbw0KLSAqIE1ldGhvZDogICAgbmF0aXZlTGlzdE1vdW50UG9pbnRzDQotICogU2lnbmF0dXJlOiAoKVtMamF2YS9sYW5nL1N0cmluZzsNCi0gKi8NCi1KTklFWFBPUlQgam9iamVjdEFycmF5IEpOSUNBTEwgSmF2YV9vcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fbmF0aXZlTGlzdE1vdW50UG9pbnRzDQotICAoSk5JRW52ICosIGpjbGFzcyk7DQotDQotI2lmZGVmIF9fY3BsdXNwbHVzDQotfQ0KLQ0KLSNlbmRpZg0KLSNlbmRpZg0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS53aW4zMi8ucHJvamVjdCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS53aW4zMi8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM5YjI4Zi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUud2luMzIvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxwcm9qZWN0RGVzY3JpcHRpb24+DQotCTxuYW1lPm9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLndpbjMyPC9uYW1lPg0KLQk8Y29tbWVudD48L2NvbW1lbnQ+DQotCTxwcm9qZWN0cz4NCi0JPC9wcm9qZWN0cz4NCi0JPGJ1aWxkU3BlYz4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JPC9idWlsZFNwZWM+DQotCTxuYXR1cmVzPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+DQotCTwvbmF0dXJlcz4NCi08L3Byb2plY3REZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUud2luMzIvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUud2luMzIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwOTE1OTAuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLndpbjMyL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlZnJhZ21lbnROYW1lV2luCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS53aW4zMgotQnVuZGxlLVZlcnNpb246IDMuMi4xMDAucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1GcmFnbWVudC1Ib3N0OiBvcmcuZWNsaXBzZS51cGRhdGUuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuMC4wLDQuMC4wKSIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRWNsaXBzZS1QbGF0Zm9ybUZpbHRlcjogKG9zZ2kub3M9d2luMzIpCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUud2luMzIvYWJvdXQuaHRtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS53aW4zMi9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjAyMzMwLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS53aW4zMi9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkp1bmUgMiwgMjAwNjwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS53aW4zMi9idWlsZC5wcm9wZXJ0aWVzIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLndpbjMyL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0ZjBiYjcuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLndpbjMyL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBvcy8sXAotICAgICAgICAgICAgICAgZnJhZ21lbnQucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLwotc3JjLmluY2x1ZGVzID0gYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBzcmMvCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUud2luMzIvb3Mvd2luMzIveDg2L3VwZGF0ZS5kbGwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUud2luMzIvb3Mvd2luMzIveDg2L3VwZGF0ZS5kbGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiMTk0ZDIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLndpbjMyL29zL3dpbjMyL3g4Ni91cGRhdGUuZGxsCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLndpbjMyL3NyYy9idWlsZC54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUud2luMzIvc3JjL2J1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTIyODZiNy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUud2luMzIvc3JjL2J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdCBuYW1lPSJidWlsZGxpYnJhcnkiIGRlZmF1bHQ9InJ1biIgYmFzZWRpcj0iLiI+IAotICAKLSAgPCEtLSBUaGUgcHJvcGVydGllcyAke2VjbGlwc2UtaG9tZX0gJHtqZGstcGF0aH0gc2hvdWxkIGJlIHBhc3NlZCBpbnRvIHRoaXMgc2NyaXB0IC0tPgotICA8IS0tIFRoZSBQYXRoIHNob3VsZCBwb2ludCB0byB0aGUgYmluIGRpcmVjdG9yeSBvZiBCQ0M1NSAtLT4KLSAgPCEtLSBodHRwOi8vd3d3LmJvcmxhbmQuY29tL3Byb2R1Y3RzL2Rvd25sb2Fkcy9kb3dubG9hZF9jYnVpbGRlci5odG1sIC0tPgotICAKLSAgPCEtLSBTZXQgYSBtZWFuaW5nZnVsIGRlZmF1bHQgdmFsdWUgZm9yIHdoZW4gaXQgaXMgbm90LiAtLT4KLSAgPHByb3BlcnR5IG5hbWU9ImVjbGlwc2UtaG9tZSIgdmFsdWU9IiR7YmFzZWRpcn0vLi4vLi4iLz4KLSAgPHByb3BlcnR5IG5hbWU9Impkay1wYXRoIiB2YWx1ZT0iJHtqYXZhLmhvbWV9Ii8+ICAKLSAgPHByb3BlcnR5IG5hbWU9ImRlc3RpbmF0aW9uIiB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLndpbjMyL29zL3dpbjMyL3g4Ni8iLz4KLSAgPHByb3BlcnR5IG5hbWU9Im9iai1wYXRoIiB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLndpbjMyL3NyYyIvPgotICA8cHJvcGVydHkgbmFtZT0ic3JjLXBhdGgiIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUud2luMzIvc3JjLyIvPiAgCi0gIAotICA8IS0tIHNldHMgdGhlIHByb3BlcnRpZXMgLS0+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJsaWJyYXJ5LW5hbWUiIHZhbHVlPSJ1cGRhdGUiLz4gIAotICA8cHJvcGVydHkgbmFtZT0ibGlicmFyeS1wbGF0Zm9ybSIgdmFsdWU9ImRsbCIvPiAgICAKLSAgPHByb3BlcnR5IG5hbWU9ImxpYnJhcnktZmlsZSIgdmFsdWU9IiR7bGlicmFyeS1uYW1lfS4ke2xpYnJhcnktcGxhdGZvcm19Ii8+Ci0gIAotICA8IS0tIFRoaXMgdGFyZ2V0IGhvbGRzIGFsbCBpbml0aWFsaXphdGlvbiBjb2RlIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSBmb3IgLS0+Ci0gIDwhLS0gYWxsIHRlc3RzIHRoYXQgYXJlIHRvIGJlIHJ1bi4gSW5pdGlhbGl6YXRpb24gZm9yIGluZGl2aWR1YWwgdGVzdHMgLS0+Ci0gIDwhLS0gc2hvdWxkIGJlIGRvbmUgd2l0aGluIHRoZSBib2R5IG9mIHRoZSBzdWl0ZSB0YXJnZXQuIC0tPgotICA8dGFyZ2V0IG5hbWU9ImluaXQiPgotICAgIDx0c3RhbXAvPgotICAgIDxkZWxldGU+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7b2JqLXBhdGh9IiBpbmNsdWRlcz0iJHtsaWJyYXJ5LWZpbGV9Ii8+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7b2JqLXBhdGh9IiBpbmNsdWRlcz0iJHtsaWJyYXJ5LW5hbWV9Lm9iaiIvPgotICAgICAgPGZpbGVzZXQgZGlyPSIke29iai1wYXRofSIgaW5jbHVkZXM9IiR7bGlicmFyeS1uYW1lfS50ZHMiLz4gICAgICAgICAgICAKLSAgICA8L2RlbGV0ZT4KLSAgPC90YXJnZXQ+Ci0gIAotICA8IS0tIFRoaXMgdGFyZ2V0IGhvbGRzIGNvZGUgdG8gY2xlYW51cCB0aGUgdGVzdGluZyBlbnZpcm9ubWVudCBhZnRlciAtLT4KLSAgPCEtLSBhZnRlciBhbGwgb2YgdGhlIHRlc3RzIGhhdmUgYmVlbiBydW4uIFlvdSBjYW4gdXNlIHRoaXMgdGFyZ2V0IHRvIC0tPgotICA8IS0tIGRlbGV0ZSB0ZW1wb3JhcnkgZmlsZXMgdGhhdCBoYXZlIGJlZW4gY3JlYXRlZC4gLS0+Ci0gIDx0YXJnZXQgbmFtZT0iY2xlYW51cCI+Ci0gICAgICA8ZGVsZXRlPgotICAgICAgPGZpbGVzZXQgZGlyPSIke29iai1wYXRofSIgaW5jbHVkZXM9IiR7bGlicmFyeS1maWxlfSIvPgotICAgICAgPGZpbGVzZXQgZGlyPSIke29iai1wYXRofSIgaW5jbHVkZXM9IiR7bGlicmFyeS1uYW1lfS5vYmoiLz4KLSAgICAgIDxmaWxlc2V0IGRpcj0iJHtvYmotcGF0aH0iIGluY2x1ZGVzPSIke2xpYnJhcnktbmFtZX0udGRzIi8+ICAgICAgICAgICAgCi0gICAgPC9kZWxldGU+Ci0gIDwvdGFyZ2V0PgotICAKLSAgCi0gIDwhLS0gVGhpcyB0YXJnZXQgcnVucyB0aGUgdGVzdCBzdWl0ZS4gQW55IGFjdGlvbnMgdGhhdCBuZWVkIHRvIGhhcHBlbiAtLT4KLSAgPCEtLSBhZnRlciBhbGwgdGhlIHRlc3RzIGhhdmUgYmVlbiBydW4gc2hvdWxkIGdvIGhlcmUuIC0tPgotICA8dGFyZ2V0IG5hbWU9InJ1biIgZGVwZW5kcz0iaW5pdCxidWlsZCxjbGVhbnVwIj4KLSAgPC90YXJnZXQ+Ci0gIAotICA8IS0tIFRoaXMgdGFyZ2V0IGJ1aWxkIHRoZSBkbGwgLS0+Ci0gIDx0YXJnZXQgbmFtZT0iYnVpbGQiPgotICAgIDxlY2hvIG1lc3NhZ2U9IkJ1aWxkaW5nICR7bGlicmFyeS1maWxlfSIvPgotCi0gICAgPHByb3BlcnR5IG5hbWU9ImhlYWRlci1wYXRoIiB2YWx1ZT0iJHtqZGstcGF0aH0vaW5jbHVkZSIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJoZWFkZXItd2luZG93cy1wYXRoIiB2YWx1ZT0iJHtoZWFkZXItcGF0aH0vd2luMzIiIC8+Ci0KLQk8ZWNobyBtZXNzYWdlPSJiY2MzMiAtSSR7c3JjLXBhdGh9IC1JJHtoZWFkZXItd2luZG93cy1wYXRofSAtV0QiLz4KLQotICAgIDxhcHBseSBleGVjdXRhYmxlPSJiY2MzMiIgZGVzdD0iJHtlY2xpcHNlLWhvbWV9LyIgcGFyYWxsZWw9ImZhbHNlIj4KLSAgICAgIDxhcmcgdmFsdWU9Ii1JJHtzcmMtcGF0aH0iLz4KLSAgICAgIDxhcmcgdmFsdWU9Ii1JJHtoZWFkZXItcGF0aH0iLz4gICAgICAKLSAgICAgIDxhcmcgdmFsdWU9Ii1JJHtoZWFkZXItd2luZG93cy1wYXRofSIvPiAKLSAgICAgIDwhLS0gYXJnIHZhbHVlPSItRFVOSUNPREUiIC0tPiAKLQkgIDxhcmcgdmFsdWU9Ii13LTgwNTciLz4gICAgICAgICAgIAotICAgICAgPGFyZyB2YWx1ZT0iLVdEIi8+Ci0JICA8c3JjZmlsZS8+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7c3JjLXBhdGh9IiBpbmNsdWRlcz0iKi5jcHAiLz4KLSAgICAgIDxtYXBwZXIgdHlwZT0iZ2xvYiIgZnJvbT0iKi5jcHAiIHRvPSIqLm9iaiIvPgotICAgIDwvYXBwbHk+Ci0gICAgCi0JPG1vdmUgZmlsZT0iJHtsaWJyYXJ5LWZpbGV9IiB0b2Rpcj0iJHtkZXN0aW5hdGlvbn0iLz4KLSAgPC90YXJnZXQ+Ci0gIAotICAKLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUud2luMzIvc3JjL21ha2UuYmF0IGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLndpbjMyL3NyYy9tYWtlLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVhYTMyZi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUud2luMzIvc3JjL21ha2UuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1kZWwgdXBkYXRlLm9iagotZGVsIHVwZGF0ZS5kbGwKLXNldCB3aW5faW5jbHVkZT1rOlxtc3ZjNjBcdmM5OFxpbmNsdWRlCi1zZXQgbGliX2luY2x1ZGVzPUs6XE1zdmM2MFxWQzk4XExpYlxVVUlELkxJQiBLOlxNc3ZjNjBcVkM5OFxMaWJcTElCQ01ULkxJQiBLOlxNc3ZjNjBcVkM5OFxMaWJcT0xETkFNRVMuTElCIEs6XE1zdmM2MFxWQzk4XExpYlxLRVJORUwzMi5MSUIKLXNldCBqZGtfaW5jbHVkZT1kOlx2bVxqZGsxLjQuMlxpbmNsdWRlCi1zZXQgZGxsX25hbWU9dXBkYXRlCi1jbCAtSSV3aW5faW5jbHVkZSUgLUklamRrX2luY2x1ZGUlIC1JJWpka19pbmNsdWRlJVx3aW4zMiAtTEQgdXBkYXRlLmNwcCAtRmUlZGxsX25hbWUlIC9saW5rICVsaWJfaW5jbHVkZXMlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUud2luMzIvc3JjL3NldHVwLmJhdCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS53aW4zMi9zcmMvc2V0dXAuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OWYyNWNiLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS53aW4zMi9zcmMvc2V0dXAuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1zZXQgcGF0aD0lcGF0aCU7SzpcbXN2YzYwXHZjOThcYmluO0s6XG1zdmM2MFxDb21tb25cTVNEZXY5OFxCaW4KLXNldCB0ZW1wPWQ6XHRlbXAKLXNldCB0bXA9ZDpcdGVtcApkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLndpbjMyL3NyYy91cGRhdGUuY3BwIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLndpbjMyL3NyYy91cGRhdGUuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzI2NTAwLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS53aW4zMi9zcmMvdXBkYXRlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLaAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLQ0KLSMgaW5jbHVkZSAidXBkYXRlLmgiDQotIyBpbmNsdWRlIDx3aW5kb3dzLmg+DQotIyBpbmNsdWRlIDx3aW5pb2N0bC5oPiAvLyBJT0NUTCBjb2RlczogTWVkaWFUeXBlDQotDQotLy8gc2V0IHRvIDEgZm9yIERFQlVHDQotaW50IERFQlVHID0gMDsNCi0NCi0vLyBHTE9CQUwgTUVUSE9EUw0KLS8vIC0tLS0tLS0tLS0tLS0tLQ0KLQ0KLS8qDQotICoNCi0gKi8NCi1qc3RyaW5nIFdpbmRvd3NUb2pzdHJpbmcoIEpOSUVudiogam5pZW52LCBjaGFyKiBidWYgKQ0KLXsNCi0gIGpzdHJpbmcgcnRuID0gMDsNCi0gIHdjaGFyX3QqIGJ1ZmZlciA9IDA7DQotICBpbnQgYnVmZmVyTGVuID0gc3RybGVuKGJ1Zik7ICANCi0gIGlmKCBidWZmZXJMZW4gPT0gMCApew0KLSAgICBydG4gPSBqbmllbnYgLT5OZXdTdHJpbmdVVEYoYnVmKTsNCi0JaWYgKERFQlVHKQ0KLQkJcHJpbnRmKCJXaW5kb3dzVG9KU3RyaW5nIEJ1ZmZlciBpcyBlbXB0eVxuIik7ICAgIA0KLSAgfSBlbHNlIHsNCi0gICAgaW50IGxlbmd0aCA9IE11bHRpQnl0ZVRvV2lkZUNoYXIoIENQX0FDUCwgMCwgKExQQ1NUUilidWYsIGJ1ZmZlckxlbiwgTlVMTCwgMCApOw0KLSAgICBidWZmZXIgPSAod2NoYXJfdCopbWFsbG9jKCBsZW5ndGgqMiArIDEgKTsNCi0gICAgaWYoaW50IGVycj1NdWx0aUJ5dGVUb1dpZGVDaGFyKCBDUF9BQ1AsIDAsIChMUENTVFIpYnVmLCBidWZmZXJMZW4sIChMUFdTVFIpYnVmZmVyLCBsZW5ndGggKSA+MCApew0KLSAgICAgIHJ0biA9IGpuaWVudi0+TmV3U3RyaW5nKChqY2hhciopYnVmZmVyLCBsZW5ndGggKTsNCi0gICAgfSBlbHNlIHsNCi0JCWlmIChERUJVRykNCi0JCQlwcmludGYoIk11bHRpQnl0ZVRvV2lkZUNoYXIgJWlcbiIsZXJyKTsgICAgDQotICAgIH0NCi0gIH0NCi0gIGlmKCBidWZmZXIgKQ0KLSAgIGZyZWUoIGJ1ZmZlciApOw0KLSAgcmV0dXJuIHJ0bjsNCi19DQotDQotDQotDQotLyoNCi0gKiBjYWxscyBHZXRWb2x1bWVJbmZvcm1hdGlvbiB0byByZXRyaXZlIHRoZSBsYWJlbCBvZiB0aGUgdm9sdW1lDQotICogUmV0dXJucyBOVUxMIGlmIGFuIGVycm9yIG9jY3Vycw0KLSAqIEBwYXJhbSBkcml2ZUxldHRlciBwYXRoIHRvIHRoZSBkcml2ZSAiYzpcXCINCi0gKiBAcHJhbWEgam5pZW52IEpOSUVudmlyb25tZW50DQotICovDQotanN0cmluZyBnZXRMYWJlbChUQ0hBUiBkcml2ZUxldHRlcltdLEpOSUVudiAqIGpuaWVudil7DQotDQotCWpzdHJpbmcgcmVzdWx0ID0gTlVMTDsNCi0JVENIQVIgYnVmWzEyOF07CQ0KLQkNCi0JLy8gYWx3YXlzIHJldHVybiBudWxsIGFzIFVOSUNPREUgaXMgbm90IGltcGxlbWVudGVkDQotCS8vIGhvdyBjYW4gd2UgZ2V0IHRoZSBsYWJlbCBvZiBhIHZvbHVtZSBhcyBVTklDT0RFIGNoYXIgPw0KLQlyZXR1cm4gcmVzdWx0Ow0KLQkNCi0JaW50IGVyciA9IEdldFZvbHVtZUluZm9ybWF0aW9uKA0KLQkJZHJpdmVMZXR0ZXIsDQotCQlidWYsDQotCQlzaXplb2YoYnVmKSAtIDEsDQotCQlOVUxMLA0KLQkJTlVMTCwNCi0JCU5VTEwsDQotCQlOVUxMLA0KLQkJMCk7DQotCWlmIChlcnIpew0KLQkJcmVzdWx0ID0gV2luZG93c1RvanN0cmluZyhqbmllbnYsIGJ1Zik7DQotCX0gZWxzZSB7DQotCQlpZiAoREVCVUcpDQotCQkJcHJpbnRmKCJFcnJvciBHZXRWb2x1bWVJbmZvcm1hdGlvbiAlaVxuIixlcnIpOwkJCQkNCi0gCX0NCi0JcmV0dXJuIHJlc3VsdDsNCi19DQotDQotLyoNCi0gKiBSZXR1cm5zIHRoZSB0eXBlIG9mIFJlbW92YWJsZSBEcml2ZSANCi0gKiBSZXR1cm5zIA0KLSAqIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19WT0xVTUVfRkxPUFBZXzMNCi0gKiBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fVk9MVU1FX0ZMT1BQWV81DQotICogb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1ZPTFVNRV9SRU1PVkFCTEUNCi0gKi8NCi1qbG9uZyBnZXRGbG9wcHkoVENIQVIgZHJpdmVMZXR0ZXJbXSl7DQotDQotCVRDSEFSIGZsb3BweVBhdGhbOF07DQotCUhBTkRMRSBoYW5kbGU7DQotCURJU0tfR0VPTUVUUlkgZ2VvbWV0cnlbMjBdOw0KLQlEV09SRCBkdzsNCi0JamxvbmcgVU5LTk9XTiA9IG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19WT0xVTUVfUkVNT1ZBQkxFOw0KLQ0KLQlzcHJpbnRmKGZsb3BweVBhdGgsICJcXFxcLlxcJWM6IiwgZHJpdmVMZXR0ZXJbMF0pOw0KLQlpZiAoREVCVUcpDQotCQlwcmludGYoIlBhdGggJXNcbiIsZmxvcHB5UGF0aCk7DQotCS8vIEJVRyAyNTcxOQ0KLSAgICBTZXRFcnJvck1vZGUoIFNFTV9GQUlMQ1JJVElDQUxFUlJPUlMgKTsgCQkNCi0JaGFuZGxlPUNyZWF0ZUZpbGUoZmxvcHB5UGF0aCwwLEZJTEVfU0hBUkVfUkVBRCxOVUxMLE9QRU5fQUxXQVlTLDAsTlVMTCk7DQotCWlmIChoYW5kbGU9PUlOVkFMSURfSEFORExFX1ZBTFVFKXsNCi0JCWlmIChERUJVRykNCi0JCQlwcmludGYoIkludmFsaWQgSGFuZGxlICVzXG4iLGZsb3BweVBhdGgpOw0KLQkJcmV0dXJuIFVOS05PV047DQotCX0gZWxzZSB7DQotCQlpZihEZXZpY2VJb0NvbnRyb2woaGFuZGxlLA0KLQkJCUlPQ1RMX0RJU0tfR0VUX01FRElBX1RZUEVTLDAsMCwNCi0JCQlnZW9tZXRyeSxzaXplb2YoZ2VvbWV0cnkpLCZkdywwKSANCi0JCQkmJiBkdz4wKSB7DQotCQkJc3dpdGNoKGdlb21ldHJ5WzBdLk1lZGlhVHlwZSl7DQotCQkJIGNhc2UgRjVfMTYwXzUxMjoNCi0JCQkgY2FzZSBGNV8xODBfNTEyOg0KLQkJCSBjYXNlIEY1XzMyMF81MTI6DQotCQkJIGNhc2UgRjVfMzIwXzEwMjQ6DQotCQkJIGNhc2UgRjVfMzYwXzUxMjoNCi0JCQkgY2FzZSBGNV8xUHQyXzUxMjoNCi0JCQkJaWYgKERFQlVHKQ0KLQkJCQkJcHJpbnRmKCJGb3VuZCA1IDEvNCBEcml2ZVxuIik7CQkJCSAJDQotCQkJIAlyZXR1cm4gb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1ZPTFVNRV9GTE9QUFlfNTsNCi0JCQkgY2FzZSBGM183MjBfNTEyOgkJCSAJCQkJIAkJCQkgCQkJCSAJCQkJIA0KLQkJCSBjYXNlIEYzXzFQdDQ0XzUxMjoNCi0JCQkgY2FzZSBGM18yUHQ4OF81MTI6DQotCQkJIGNhc2UgRjNfMjBQdDhfNTEyOgkJCQkgCQkJCSAJCQkJIA0KLQkJCQlpZiAoREVCVUcpDQotCQkJCQlwcmludGYoIkZvdW5kIDMgMS8yIERyaXZlXG4iKTsJCQkJIAkNCi0JCQkgCXJldHVybiBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fVk9MVU1FX0ZMT1BQWV8zOw0KLQkJCSBkZWZhdWx0Og0KLQkJCSAJcmV0dXJuIFVOS05PV047DQotCQkJfQ0KLQkJfQ0KLQl9DQotCXJldHVybiBVTktOT1dOOwkNCi19DQotDQotLyoNCi0gKiBSZXR1cm5zIHRoZSBVTkMgbmFtZSBvZiBhIHJlbW90ZSBkcml2ZQ0KLSAqIChcXE1hY2hpbmVccGF0aFxwYXRoMVxwYXRoMiQpDQotICogcmV0dXJucyBOVUxMIGlmIGFuIGVycm9yIG9jY3Vycw0KLSAqLw0KLSBqc3RyaW5nIGdldFJlbW90ZU5ldHdvcmtOYW1lKFRDSEFSIGRyaXZlTGV0dGVyW10sSk5JRW52ICogam5pZW52KXsNCi0gCQ0KLSAJdW5zaWduZWQgbG9uZyBzaXplID0yNTY7DQotIAlUQ0hBUiBidWZbMjU2XTsJDQotIAlUQ0hBUiBkcml2ZVBhdGhbMl07DQotIAlEV09SRCBlcnI7DQotIAlqc3RyaW5nIHJlc3VsdCA9IE5VTEw7DQotIAkNCi0gCS8vIGFsd2F5cyByZXR1cm4gTlVMTCBhcyBVTklDT0RFIG5vdCBpbXBsZW1lbnRlZA0KLQkvLyBob3cgY2FuIHdlIGdldCB0aGUgbGFiZWwgb2YgYSByZW1vdGUgbmV0d29yayBuYW1lIGFzIFVOSUNPREUgY2hhciA/IAkNCi0gCXJldHVybiByZXN1bHQ7DQotIAkNCi0Jc3ByaW50Zihkcml2ZVBhdGgsICIlYzoiLCBkcml2ZUxldHRlclswXSk7IAkNCi0gCWVyciA9IFdOZXRHZXRDb25uZWN0aW9uKGRyaXZlUGF0aCxidWYsJnNpemUpOw0KLSAJDQotIAlpZiAoZXJyPT1XTl9TVUNDRVNTKXsNCi0JCXJlc3VsdCA9IFdpbmRvd3NUb2pzdHJpbmcoam5pZW52LGJ1Zik7DQotCX0gZWxzZSB7DQotCQlpZiAoREVCVUcpDQotCQkJcHJpbnRmKCJFcnJvciBXTkV0R2V0Q29ubmVjdGlvbiAlaSIsZXJyKTsJCQkJDQotIAl9DQotCXJldHVybiByZXN1bHQ7DQotIH0NCi0NCi0NCi0vLyBKTkkgTUVUSE9EUw0KLS8vIC0tLS0tLS0tLS0tLS0tLQ0KLQ0KLS8qDQotICogQ2xhc3M6ICAgICBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm8NCi0gKiBNZXRob2Q6ICAgIG5hdGl2ZUdldEZyZWVTcGFjZQ0KLSAqIFNpZ25hdHVyZTogKExqYXZhL2lvL0ZpbGU7KUoNCi0gKi8NCi1KTklFWFBPUlQgamxvbmcgSk5JQ0FMTCBKYXZhX29yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19uYXRpdmVHZXRGcmVlU3BhY2UoDQotCUpOSUVudiAqIGpuaWVudiwNCi0JamNsYXNzIGphdmFDbGFzcywNCi0Jam9iamVjdCBmaWxlKSB7DQotDQotCS8vIHRvIHJldHJpdmUgdGhlIFN0cmluZw0KLQlqY2xhc3MgY2xzOw0KLQlqbWV0aG9kSUQgaWQ7DQotCWpvYmplY3Qgb2JqOw0KLQ0KLQkvLyBqYXZhLmlvLkZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkNCi0JY29uc3QgVENIQVIgKiBscERpcmVjdG9yeU5hbWU7DQotDQotCS8vIFdpbmRvd3MgUGFyYW1ldGVycw0KLQlfX2ludDY0IGk2NEZyZWVCeXRlc0F2YWlsYWJsZVRvQ2FsbGVyOw0KLQlfX2ludDY0IGk2NFRvdGFsTnVtYmVyT2ZCeXRlczsNCi0JX19pbnQ2NCBpNjRUb3RhbE51bWJlck9mRnJlZUJ5dGVzOw0KLQ0KLQkvLyBmaXJzdCwgb2J0YWluIHRoZSBQYXRoIGZyb20gdGhlIGphdmEuaW8uRmlsZSBwYXJhbWV0ZXINCi0JY2xzID0gam5pZW52IC0+IEdldE9iamVjdENsYXNzKGZpbGUpOw0KLQlpZCA9IGpuaWVudiAtPiBHZXRNZXRob2RJRChjbHMsICJnZXRBYnNvbHV0ZVBhdGgiLCAiKClMamF2YS9sYW5nL1N0cmluZzsiKTsNCi0Jb2JqID0gam5pZW52IC0+IENhbGxPYmplY3RNZXRob2QoZmlsZSwgaWQpOw0KLQlscERpcmVjdG9yeU5hbWUgPSBqbmllbnYgLT4gR2V0U3RyaW5nVVRGQ2hhcnMoKGpzdHJpbmcpIG9iaiwgMCk7DQotCWlmIChERUJVRykNCi0JCXByaW50ZigiRGlyZWN0b3J5OiBbJXNdXG4iLGxwRGlyZWN0b3J5TmFtZSk7DQotDQotCWludCBzdWNjZXNzID0gR2V0RGlza0ZyZWVTcGFjZUV4KA0KLQkJCQlscERpcmVjdG9yeU5hbWUsDQotCQkJCShQVUxBUkdFX0lOVEVHRVIpICYgaTY0RnJlZUJ5dGVzQXZhaWxhYmxlVG9DYWxsZXIsDQotCQkJCShQVUxBUkdFX0lOVEVHRVIpICYgaTY0VG90YWxOdW1iZXJPZkJ5dGVzLA0KLQkJCQkoUFVMQVJHRV9JTlRFR0VSKSAmIGk2NFRvdGFsTnVtYmVyT2ZGcmVlQnl0ZXMpOw0KLQkJCQ0KLQlpZiAoc3VjY2Vzcykgew0KLQkJcmV0dXJuIChqbG9uZykgaTY0RnJlZUJ5dGVzQXZhaWxhYmxlVG9DYWxsZXI7DQotCX0gZWxzZSB7DQotCQlyZXR1cm4gb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1NJWkVfVU5LTk9XTjsNCi0JfQ0KLX0NCi0NCi0vKg0KLSAqIENsYXNzOiAgICAgb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvDQotICogTWV0aG9kOiAgICBuYXRpdmVHZXRMYWJlbA0KLSAqIFNpZ25hdHVyZTogKExqYXZhL2lvL0ZpbGU7KUxqYXZhL2xhbmcvU3RyaW5nOw0KLSAqLw0KLUpOSUVYUE9SVCBqc3RyaW5nIEpOSUNBTEwgSmF2YV9vcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fbmF0aXZlR2V0TGFiZWwoDQotCUpOSUVudiAqIGpuaWVudiwNCi0JamNsYXNzIGphdmFDbGFzcywNCi0Jam9iamVjdCBmaWxlKSB7DQotDQotCS8vIHRvIHJldHJpdmUgdGhlIFN0cmluZw0KLQlqY2xhc3MgY2xzOw0KLQlqbWV0aG9kSUQgaWQ7DQotCWpvYmplY3Qgb2JqOw0KLQ0KLQkvLyBqYXZhLmlvLkZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkNCi0JY29uc3QgVENIQVIgKiBscERpcmVjdG9yeU5hbWU7DQotDQotCS8vIG9idGFpbiB0aGUgU3RyaW5nIGZyb20gdGhlIHBhcmFtZXRlcg0KLQljbHMgPSBqbmllbnYgLT4gR2V0T2JqZWN0Q2xhc3MoZmlsZSk7DQotCWlkID0gam5pZW52IC0+IEdldE1ldGhvZElEKGNscywgImdldEFic29sdXRlUGF0aCIsICIoKUxqYXZhL2xhbmcvU3RyaW5nOyIpOw0KLQlvYmogPSBqbmllbnYgLT4gQ2FsbE9iamVjdE1ldGhvZChmaWxlLCBpZCk7DQotCWxwRGlyZWN0b3J5TmFtZSA9IGpuaWVudiAtPiBHZXRTdHJpbmdVVEZDaGFycygoanN0cmluZykgb2JqLCAwKTsNCi0JaWYgKERFQlVHKQ0KLQkJcHJpbnRmKCJEaXJlY3Rvcnk6IFslc11cbiIsbHBEaXJlY3RvcnlOYW1lKTsNCi0NCi0JLy8NCi0JanN0cmluZyByZXN1bHQgPSBOVUxMOw0KLQkNCi0JLy8gTWFrZSBzdXJlIHdlIGhhdmUgYSBTdHJpbmcgb2YgdGhlIEZvcm06IDxsZXR0ZXI+Og0KLQlpZiAoJzonID09IGxwRGlyZWN0b3J5TmFtZVsxXSkgew0KLQkJVENIQVIgZHJpdmVMZXR0ZXJbNF07IC8vIEM6XFwgZm9yIGV4YW1wbGUNCi0JCW1lbWNweShkcml2ZUxldHRlciwgbHBEaXJlY3RvcnlOYW1lLCAyKTsNCi0JCXN0cmNweShkcml2ZUxldHRlciArIDIsICJcXCIpOw0KLQkJc3dpdGNoIChHZXREcml2ZVR5cGUoZHJpdmVMZXR0ZXIpKSB7DQotCQkJY2FzZSBEUklWRV9SRU1PVEUgOg0KLQkJCQkvLyBjaGVjayBuYW1lIG9mIG1hY2hpbmUgYW5kIHBhdGggb2YgcmVtb3RlDQotCQkJCWlmIChERUJVRykNCi0JCQkJCXByaW50ZigiUmVtb3RlIERyaXZlIik7DQotCQkJCXJlc3VsdCA9IGdldFJlbW90ZU5ldHdvcmtOYW1lKGRyaXZlTGV0dGVyLGpuaWVudik7CQkJCQ0KLQkJCQlicmVhazsNCi0JCQlkZWZhdWx0IDoNCi0JCQkJaWYgKERFQlVHKQ0KLQkJCQkJcHJpbnRmKCJBbm90aGVyIERyaXZlIGF0ICVzIiwgZHJpdmVMZXR0ZXIpOw0KLQkJCQlyZXN1bHQgPSBnZXRMYWJlbChkcml2ZUxldHRlcixqbmllbnYpOw0KLQkJCQlicmVhazsNCi0JCX0gDQotCX0gDQotDQotCXJldHVybiByZXN1bHQ7DQotfQ0KLQ0KLS8qDQotICogQ2xhc3M6ICAgICBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm8NCi0gKiBNZXRob2Q6ICAgIG5hdGl2ZUdldFR5cGUNCi0gKiBTaWduYXR1cmU6IChMamF2YS9pby9GaWxlOylJDQotICovDQotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBKYXZhX29yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19uYXRpdmVHZXRUeXBlKA0KLQlKTklFbnYgKiBqbmllbnYsDQotCWpjbGFzcyBqYXZhQ2xhc3MsDQotCWpvYmplY3QgZmlsZSkgew0KLQ0KLQkvLyB0byByZXRyaXZlIHRoZSBTdHJpbmcNCi0JamNsYXNzIGNsczsNCi0Jam1ldGhvZElEIGlkOw0KLQlqb2JqZWN0IG9iajsNCi0NCi0JLy8gamF2YS5pby5GaWxlLmdldEFic29sdXRlUGF0aCgpDQotCWNvbnN0IFRDSEFSICogbHBEaXJlY3RvcnlOYW1lOw0KLQ0KLQkvLyBvYnRhaW4gdGhlIFN0cmluZyBmcm9tIHRoZSBwYXJhbWV0ZXINCi0JY2xzID0gam5pZW52IC0+IEdldE9iamVjdENsYXNzKGZpbGUpOw0KLQlpZCA9IGpuaWVudiAtPiBHZXRNZXRob2RJRChjbHMsICJnZXRBYnNvbHV0ZVBhdGgiLCAiKClMamF2YS9sYW5nL1N0cmluZzsiKTsNCi0Jb2JqID0gam5pZW52IC0+IENhbGxPYmplY3RNZXRob2QoZmlsZSwgaWQpOw0KLQlscERpcmVjdG9yeU5hbWUgPSBqbmllbnYgLT4gR2V0U3RyaW5nVVRGQ2hhcnMoKGpzdHJpbmcpIG9iaiwgMCk7DQotCWlmIChERUJVRykNCi0JCXByaW50ZigiRGlyZWN0b3J5OiBbJXNdXG4iLGxwRGlyZWN0b3J5TmFtZSk7DQotDQotCWludCByZXN1bHQgPSBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fVk9MVU1FX1VOS05PV047DQotCQ0KLQkvLyBNYWtlIHN1cmUgd2UgaGF2ZSBhIFN0cmluZyBvZiB0aGUgRm9ybTogPGxldHRlcj46DQotCWlmICgnOicgPT0gbHBEaXJlY3RvcnlOYW1lWzFdKSB7DQotCQlUQ0hBUiBkcml2ZUxldHRlcls0XTsgLy9DOlxcIGZvciBleGFtcGxlDQotCQltZW1jcHkoZHJpdmVMZXR0ZXIsIGxwRGlyZWN0b3J5TmFtZSwgMik7DQotCQlzdHJjcHkoZHJpdmVMZXR0ZXIgKyAyLCAiXFwiKTsNCi0NCi0JCXN3aXRjaCAoR2V0RHJpdmVUeXBlKGRyaXZlTGV0dGVyKSkgew0KLQkJCWNhc2UgRFJJVkVfUkVNT1ZBQkxFIDoNCi0JCQkJLy8gY2hlY2sgaWYgZmxvcHB5IDMuNSwgZmxvcHB5IDUuMjUJDQotCQkJCS8vIG9yIG90aGVyIHJlbW92YWJsZSBkZXZpY2UgKFVTQixQQ01DSUEgLi4uKQ0KLQkJCQlpZiAoREVCVUcpDQotCQkJCQlwcmludGYoIlJlbW92YWJsZSBEZXZpY2UiKTsNCi0JCQkJcmVzdWx0ID0gZ2V0RmxvcHB5KGRyaXZlTGV0dGVyKTsJCQkJCQ0KLQkJCQlicmVhazsNCi0JCQljYXNlIERSSVZFX0NEUk9NIDoNCi0JCQkJcmVzdWx0ID0gb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1ZPTFVNRV9DRFJPTTsNCi0JCQkJYnJlYWs7DQotCQkJY2FzZSBEUklWRV9GSVhFRCA6DQotCQkJCXJlc3VsdCA9IG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19WT0xVTUVfRklYRUQ7DQotCQkJCWJyZWFrOw0KLQkJCWNhc2UgRFJJVkVfUkVNT1RFIDoNCi0JCQkJcmVzdWx0ID0gb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1ZPTFVNRV9SRU1PVEU7DQotCQkJCWJyZWFrOw0KLQkJCWNhc2UgRFJJVkVfTk9fUk9PVF9ESVIgOg0KLQkJCQlyZXN1bHQgPSBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fVk9MVU1FX0lOVkFMSURfUEFUSDsNCi0JCQkJYnJlYWs7DQotCQkJY2FzZSBEUklWRV9SQU1ESVNLIDoNCi0JCQkJcmVzdWx0ID0gb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1ZPTFVNRV9SQU1ESVNLOw0KLQkJCQlicmVhazsJCQkNCi0JCQljYXNlIERSSVZFX1VOS05PV04gOg0KLQkJCWRlZmF1bHQgOg0KLQkJCQlyZXN1bHQgPSBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fVk9MVU1FX1VOS05PV047DQotCQkJCWJyZWFrOw0KLQkJfQ0KLQl9IGVsc2Ugew0KLQkJcmVzdWx0ID0gb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1ZPTFVNRV9JTlZBTElEX1BBVEg7DQotCX0NCi0NCi0JcmV0dXJuIHJlc3VsdDsNCi19DQotDQotLyoNCi0gKiBDbGFzczogICAgIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mbw0KLSAqIE1ldGhvZDogICAgbmF0aXZlTGlzdE1vdW50UG9pbnRzDQotICogU2lnbmF0dXJlOiAoKVtMamF2YS9sYW5nL1N0cmluZzsNCi0gKi8NCi1KTklFWFBPUlQgam9iamVjdEFycmF5IEpOSUNBTEwgSmF2YV9vcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fbmF0aXZlTGlzdE1vdW50UG9pbnRzKA0KLQlKTklFbnYgKiBqbmllbnYsDQotCWpjbGFzcyBqYXZhQ2xhc3MpIHsNCi0NCi0JLy8NCi0JRFdPUkQgbG9nRHJpdmVzOw0KLQlVSU5UIGRyaXZlOw0KLQlUQ0hBUiBkcml2ZU5hbWVbMTAwXTsNCi0Jam9iamVjdEFycmF5IHJldHVybkFycmF5Ow0KLQlpbnQgbkRyaXZlID0gMDsNCi0NCi0JLy8gDQotCWpjbGFzcyBzdHJpbmdDbGFzczsNCi0Jam9iamVjdCBlbXB0eTsNCi0JaW50IGluZGV4ID0gMDsNCi0Jam9iamVjdCBzdHI7DQotDQotDQotCWxvZ0RyaXZlcyA9IEdldExvZ2ljYWxEcml2ZXMoKTsNCi0JZm9yIChkcml2ZSA9IDA7IGRyaXZlIDwgMzI7IGRyaXZlKyspIHsNCi0JCWlmIChsb2dEcml2ZXMgJiAoMSA8PCBkcml2ZSkpIHsNCi0JCQluRHJpdmUrKzsNCi0JCX0NCi0JfQ0KLQ0KLQlzdHJpbmdDbGFzcyA9IGpuaWVudiAtPiBGaW5kQ2xhc3MoImphdmEvbGFuZy9TdHJpbmciKTsNCi0JZW1wdHkgPSBqbmllbnYgLT4gTmV3U3RyaW5nVVRGKCIiKTsNCi0JcmV0dXJuQXJyYXkgPSBqbmllbnYgLT4gTmV3T2JqZWN0QXJyYXkobkRyaXZlLCBzdHJpbmdDbGFzcywgZW1wdHkpOw0KLQ0KLQlmb3IgKGRyaXZlID0gMDsgZHJpdmUgPCAzMjsgZHJpdmUrKykgew0KLQkJaWYgKGxvZ0RyaXZlcyAmICgxIDw8IGRyaXZlKSkgew0KLQkJCXNwcmludGYoZHJpdmVOYW1lLCAiJWM6XFwiLCBkcml2ZSArICdBJyk7DQotCQkJc3RyID0gam5pZW52IC0+IE5ld1N0cmluZ1VURihkcml2ZU5hbWUpOw0KLQkJCWpuaWVudiAtPiBTZXRPYmplY3RBcnJheUVsZW1lbnQocmV0dXJuQXJyYXksIGluZGV4LCBzdHIpOw0KLQkJCWluZGV4Kys7DQotCQl9DQotCX0NCi0NCi0JcmV0dXJuIHJldHVybkFycmF5Ow0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUud2luMzIvc3JjL3VwZGF0ZS5oIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLndpbjMyL3NyYy91cGRhdGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNjYTdlMC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUud2luMzIvc3JjL3VwZGF0ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyogRE8gTk9UIEVESVQgVEhJUyBGSUxFIC0gaXQgaXMgbWFjaGluZSBnZW5lcmF0ZWQgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi2gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpbmNsdWRlIDxqbmkuaD4NCi0vKiBIZWFkZXIgZm9yIGNsYXNzIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mbyAqLwotCi0jaWZuZGVmIF9JbmNsdWRlZF9vcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm8KLSNkZWZpbmUgX0luY2x1ZGVkX29yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mbw0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYNCi0jdW5kZWYgb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1NJWkVfVU5LTk9XTgotI2RlZmluZSBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fU0laRV9VTktOT1dOIC0xTA0KLSN1bmRlZiBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fVk9MVU1FX1VOS05PV04KLSNkZWZpbmUgb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1ZPTFVNRV9VTktOT1dOIC0xTA0KLSN1bmRlZiBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fVk9MVU1FX0lOVkFMSURfUEFUSAotI2RlZmluZSBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fVk9MVU1FX0lOVkFMSURfUEFUSCAtMkwNCi0jdW5kZWYgb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1ZPTFVNRV9SRU1PVkFCTEUKLSNkZWZpbmUgb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1ZPTFVNRV9SRU1PVkFCTEUgMUwNCi0jdW5kZWYgb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1ZPTFVNRV9GSVhFRAotI2RlZmluZSBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fVk9MVU1FX0ZJWEVEIDJMDQotI3VuZGVmIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19WT0xVTUVfUkVNT1RFCi0jZGVmaW5lIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19WT0xVTUVfUkVNT1RFIDNMCi0jdW5kZWYgb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1ZPTFVNRV9DRFJPTQotI2RlZmluZSBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fVk9MVU1FX0NEUk9NIDRMCi0jdW5kZWYgb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1ZPTFVNRV9SQU1ESVNLCi0jZGVmaW5lIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19WT0xVTUVfUkFNRElTSyA1TAotI3VuZGVmIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19WT0xVTUVfRkxPUFBZXzUKLSNkZWZpbmUgb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1ZPTFVNRV9GTE9QUFlfNSA2TAotI3VuZGVmIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19WT0xVTUVfRkxPUFBZXzMKLSNkZWZpbmUgb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1ZPTFVNRV9GTE9QUFlfMyA3TA0KLS8qIEluYWNjZXNzaWJsZSBzdGF0aWM6IGxpc3RlbmVycyAqLw0KLS8qIEluYWNjZXNzaWJsZSBzdGF0aWM6IGhhc05hdGl2ZXMgKi8NCi0vKg0KLSAqIENsYXNzOiAgICAgb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvDQotICogTWV0aG9kOiAgICBuYXRpdmVHZXRGcmVlU3BhY2UNCi0gKiBTaWduYXR1cmU6IChMamF2YS9pby9GaWxlOylKDQotICovDQotSk5JRVhQT1JUIGpsb25nIEpOSUNBTEwgSmF2YV9vcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fbmF0aXZlR2V0RnJlZVNwYWNlDQotICAoSk5JRW52ICosIGpjbGFzcywgam9iamVjdCk7Ci0NCi0vKg0KLSAqIENsYXNzOiAgICAgb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvDQotICogTWV0aG9kOiAgICBuYXRpdmVHZXRMYWJlbA0KLSAqIFNpZ25hdHVyZTogKExqYXZhL2lvL0ZpbGU7KUxqYXZhL2xhbmcvU3RyaW5nOw0KLSAqLw0KLUpOSUVYUE9SVCBqc3RyaW5nIEpOSUNBTEwgSmF2YV9vcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fbmF0aXZlR2V0TGFiZWwNCi0gIChKTklFbnYgKiwgamNsYXNzLCBqb2JqZWN0KTsKLQ0KLS8qDQotICogQ2xhc3M6ICAgICBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm8NCi0gKiBNZXRob2Q6ICAgIG5hdGl2ZUdldFR5cGUNCi0gKiBTaWduYXR1cmU6IChMamF2YS9pby9GaWxlOylJDQotICovDQotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBKYXZhX29yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19uYXRpdmVHZXRUeXBlDQotICAoSk5JRW52ICosIGpjbGFzcywgam9iamVjdCk7Ci0NCi0vKg0KLSAqIENsYXNzOiAgICAgb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvDQotICogTWV0aG9kOiAgICBuYXRpdmVMaXN0TW91bnRQb2ludHMNCi0gKiBTaWduYXR1cmU6ICgpW0xqYXZhL2xhbmcvU3RyaW5nOw0KLSAqLw0KLUpOSUVYUE9SVCBqb2JqZWN0QXJyYXkgSk5JQ0FMTCBKYXZhX29yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19uYXRpdmVMaXN0TW91bnRQb2ludHMNCi0gIChKTklFbnYgKiwgamNsYXNzKTsKLQ0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotCi0jZW5kaWYNCi0jZW5kaWYNCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwppbmRleCBiZTQwNjBkLi5hZDA3ODA4IDEwMDY0NAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKQEAgLTEsNzMgKzEsOCBAQAotI01vbiBBcHIgMTYgMTc6MTQ6NDUgRURUIDIwMDcKKyNUaHUgTWF5IDA0IDE2OjI5OjQ0IEVEVCAyMDA2CiBlY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZAogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kb2MuY29tbWVudC5zdXBwb3J0PWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZwogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhbGx0aHJvdWdoQ2FzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmF0YWxPcHRpb25hbEVycm9yPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFncz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NEZXByZWNhdGVkUmVmPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc05vdFZpc2libGVSZWY9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wdWJsaWMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c092ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXB1YmxpYwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubnVsbFJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucGFyYW1ldGVyQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvdGVudGlhbE51bGxSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJhd1R5cGVSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yZWR1bmRhbnROdWxsQ2hlY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyYWViNTkKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpAQCAtMCwwICsxLDMgQEAKKyNUaHUgTWF5IDA0IDEzOjQ4OjE4IEVEVCAyMDA2CitlY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQoraW50ZXJuYWwuZGVmYXVsdC5jb21wbGlhbmNlPWRlZmF1bHQKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL0luY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZS5qYXZhCmluZGV4IDYxMWZlODAuLjQzY2VmYWQgMTAwNjQ0Ci0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlLmphdmEKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9JbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2UuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC03LDcgKzcsNiBAQAogICoKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKYW1lcyBEIE1pbGVzIChJQk0gQ29ycC4pIC0gYnVnIDE4MjYyNSwgTWlzc2luZyBjb25zdHJ1Y3RvcgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlOwogCkBAIC02NiwxMCArNjUsNiBAQAogCXB1YmxpYyBJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2UoSUZlYXR1cmVSZWZlcmVuY2UgZmVhdHVyZVJlZmVyZW5jZSkgewogCQlzdXBlcihmZWF0dXJlUmVmZXJlbmNlKTsKIAl9Ci0JCi0JcHVibGljIEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZShJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VNb2RlbCBpbmNsdWRlZEZlYXR1cmVSZWZNb2RlbCl7Ci0JCXN1cGVyKGluY2x1ZGVkRmVhdHVyZVJlZk1vZGVsKTsKLQl9CiAKIAkvKgogCSAqIE1ldGhvZCBpc0Rpc2FibGVkLgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9VcGRhdGVDb3JlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1VwZGF0ZUNvcmUuamF2YQppbmRleCAxNDhlYTVhLi5kYTY1N2NlIDEwMDY0NAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1VwZGF0ZUNvcmUuamF2YQorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1VwZGF0ZUNvcmUuamF2YQpAQCAtMjYsOSArMjYsMTEgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZTsKIGltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JSW1wb3J0OwogaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLkphckNvbnRlbnRSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuU2l0ZU1hbmFnZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuVXRpbGl0aWVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLmNvbm5lY3Rpb24uQ29ubmVjdGlvblRocmVhZE1hbmFnZXJGYWN0b3J5OwogaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OworaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5TZXJ2aWNlUmVnaXN0cmF0aW9uOwogaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UucGFja2FnZWFkbWluLlBhY2thZ2VBZG1pbjsKIGltcG9ydCBvcmcub3NnaS51dGlsLnRyYWNrZXIuU2VydmljZVRyYWNrZXI7CiAKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvVXBkYXRlTWFuYWdlclV0aWxzLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1VwZGF0ZU1hbmFnZXJVdGlscy5qYXZhCmluZGV4IGUyZjI3MGYuLjI5YmMwNjEgMTAwNjQ0Ci0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvVXBkYXRlTWFuYWdlclV0aWxzLmphdmEKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9VcGRhdGVNYW5hZ2VyVXRpbHMuamF2YQpAQCAtNTIsNiArNTIsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLlV0aWxpdGllczsKIGltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC5JbnN0YWxsQWJvcnRlZEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5jb25uZWN0aW9uLkNvbm5lY3Rpb25GYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLmNvbm5lY3Rpb24uSHR0cFJlc3BvbnNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLmNvbm5lY3Rpb24uSVJlc3BvbnNlOwogaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7CiBpbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkNvbnN0YW50czsKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvLmNsYXNzcGF0aCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ4ZmUyYS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMvIi8+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iL29yZy5lY2xpcHNlLmNvcmUucnVudGltZSIvPgotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9Ii9vcmcuYXBhY2hlLnhlcmNlcyIvPgotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9Ii9vcmcuZWNsaXBzZS5jb3JlLmJvb3QiLz4KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSIvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUiLz4KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0idmFyIiBwYXRoPSJKUkVfTElCIiByb290cGF0aD0iSlJFX1NSQ1JPT1QiIHNvdXJjZXBhdGg9IkpSRV9TUkMiLz4KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy8uY3ZzaWdub3JlIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWU4MmQ3Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvLnByb2plY3QgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWNiNTRhLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxwcm9qZWN0RGVzY3JpcHRpb24+DQotCTxuYW1lPm9yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlczwvbmFtZT4NCi0JPGNvbW1lbnQ+PC9jb21tZW50Pg0KLQk8cHJvamVjdHM+DQotCQk8cHJvamVjdD5vcmcuYXBhY2hlLnhlcmNlczwvcHJvamVjdD4NCi0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmNvcmUuYm9vdDwvcHJvamVjdD4NCi0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmNvcmUucnVudGltZTwvcHJvamVjdD4NCi0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlPC9wcm9qZWN0Pg0KLQk8L3Byb2plY3RzPg0KLQk8YnVpbGRTcGVjPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS51aS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUudWkuU2NoZW1hQnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCTwvYnVpbGRTcGVjPg0KLQk8bmF0dXJlcz4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUudWkuUGx1Z2luTmF0dXJlPC9uYXR1cmU+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnRlYW0uY3ZzLmNvcmUuY3ZzbmF0dXJlPC9uYXR1cmU+DQotCTwvbmF0dXJlcz4NCi08L3Byb2plY3REZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL1NjcmFwYm9vazIuanBhZ2UgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL1NjcmFwYm9vazIuanBhZ2UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1ZGE5OWEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9TY3JhcGJvb2syLmpwYWdlCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLVNpdGVNYW5hZ2VyLmdldFNpdGUoVVJMKXRocm93cyBDb3JlRXhjZXB0aW9uDQotICBTdHJpbmcgdHlwZSA9IGdldFR5cGVGb3Jwcm90b2NvbChVUkwuZ2V0cHJvdG9jb2wpOw0KLSAgdHJ5IHsNCi0gICAgaWYgKHR5cGUgIT0gbnVsbCl7DQotCWF0dGVtcHRDcmVhdGlvblNpdGUodHlwZSxVUkwpOw0KLSAgICB9IGVsc2Ugew0KLQlhdHRlbXB0Q3JlYXRpb25TaXRlKCJodHRwIixVUkwpOw0KLSAgICB9DQotICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpew0KLSAgICB0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbigiQ2Fubm90IGNyZWF0ZSBzaXRlIixlLmdldE1lc3NhZ2UoKSk7DQotICB9DQotDQotU2l0ZU1hbmFnZXIuYXR0ZW1wdENyZWF0aW9uU2l0ZSh0eXBlLFVSTCl0aHJvd3MgQ29yZUV4Y2VwdGlvbg0KLSAgdHJ5IHsNCi0gICAgY3JlYXRlU2l0ZSh0eXBlLFVSTCk7DQotICB9IGNhdGNoIChJbnZhbGlkVHlwZUV4Y2VwdGlvbiBlKXsNCi0gICAgdHJ5IHsNCi0gICAgICBjcmVhdGVTaXRlKGUuZ2V0UmVhbFR5cGUoKSxVUkwpOw0KLSAgICB9IGNhdGNoIChJbnZhbGlkU2l0ZUV4ZXB0aW9uIGUpew0KLSAgICAgIHRocm93IG5ldyBDb3JlRXhjZXB0aW9uKCJXcm9uZyBzaXRlIHR5cGUiKTsNCi0gICAgfQ0KLSAgfQ0KLQ0KLVNpdGVNYW5hZ2VyLmNyZWF0ZVNpdGUodHlwZSxVUkwpIHRocm93cyBDb3JlRXhlcHRpb24sIEludmFsaWRTaXRlVHlwZUV4Y2VwdGlvbg0KLQ0KLQ0KLXRyeSB7DQotCQkJDQotCWZhY3RvcnkuY3JlYXRlU2l0ZSh1cmwsIGZvcmNlQ3JlYXRpb24pOw0KLQkNCi19IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7DQotCS8vIGlmIHRoZSBVUkwgaXMgcG9pbnRpbmcgdG8gZWl0aGVyIGEgZmlsZSANCi0vLyBvciBhIGRpcmVjdG9yeSwgd2l0aG91dCByZWZlcmVuY2UJCQkNCi1pZiAodXJsLmdldFJlZigpICE9IG51bGwpIHsNCi0JLy8gNCBub3RoaW5nIHdlIGNhbiBkbw0KLQl0aHJvdyBuZXdDb3JlRXhjZXB0aW9uKCJFcnJvciBhY2Nlc3NpbmcgdXJsOiIrdXJsLnRvRXh0ZXJuYWxGb3JtKCkrIlxyXG4iK2UuZ2V0TWVzc2FnZSgpLGUpOw0KLX0gZWxzZSBpZiAodXJsLmdldEZpbGUoKS5lbmRzV2l0aCgiLyIpKSB7DQotCS8vIDEgdHJ5IHRvIGFkZCBzaXRlLnhtbA0KLQl0cnkgew0KLQkJdXJsID0gbmV3IFVSTCh1cmwsU2l0ZS5TSVRFX1hNTCk7DQotCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlMSl7DQotCQl0aHJvdyBuZXdDb3JlRXhjZXB0aW9uKCJDYW5ub3QgY3JlYXRlIFVSTDoiK3VybC50b0V4dGVybmFsRm9ybSgpKyIrIitTaXRlLlNJVEVfWE1MLGUxKTsNCi0JfQ0KLQl0cnkgew0KLQkJc2l0ZSA9IGZhY3RvcnkuY3JlYXRlU2l0ZSh1cmwsIGZvcmNlQ3JlYXRpb24pOw0KLQl9IGNhdGNoIChQYXJzaW5nRXhjZXB0aW9uIGUxKXsNCi0JCXRocm93IG5ld0NvcmVFeGNlcHRpb24oIkVycm9yIHBhcnNpbmcgVVJMOiIrdXJsLnRvRXh0ZXJuYWxGb3JtKCkrIlxyXG4iK2UxLmdldE1lc3NhZ2UoKSxlMSk7CQkJCQkNCi0JfSBjYXRjaCAoSU9FeGNlcHRpb24gZTEpew0KLQkJdGhyb3cgbmV3Q29yZUV4Y2VwdGlvbigiRXJyb3IgYWNjZXNzaW5nIHVybDoiK3VybC50b0V4dGVybmFsRm9ybSgpKyJcclxuIitlMS5nZXRNZXNzYWdlKCksZTEpOwkJCQkJDQotCX0NCi19IGVsc2UgaWYgKHVybC5nZXRGaWxlKCkuZW5kc1dpdGgoU2l0ZS5TSVRFX1hNTCkpIHsNCi0JLy8gMyBub3RoaW5nIHdlIGNhbiBkbw0KLQl0aHJvdyBuZXdDb3JlRXhjZXB0aW9uKCJFcnJvciBhY2Nlc3NpbmcgdXJsOiIrdXJsLnRvRXh0ZXJuYWxGb3JtKCkrIlxyXG4iK2UuZ2V0TWVzc2FnZSgpLGUpOw0KLX0gZWxzZSB7DQotCS8vIDIgdHJ5IHRvIGFkZCAvc2l0ZS54bWwNCi0JdHJ5IHsNCi0JCXVybCA9IG5ldyBVUkwodXJsLmdldFByb3RvY29sKCksdXJsLmdldEhvc3QoKSwgdXJsLmdldFBvcnQoKSwgdXJsLmdldEZpbGUoKSsiLyIrU2l0ZS5TSVRFX1hNTCk7DQotCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlMSl7DQotCQl0aHJvdyBuZXdDb3JlRXhjZXB0aW9uKCJDYW5ub3QgY3JlYXRlIFVSTDoiK3VybC50b0V4dGVybmFsRm9ybSgpKyIrIitTaXRlLlNJVEVfWE1MLGUxKTsNCi0JfQ0KLQkNCi0JdHJ5IHsNCi0JCXNpdGUgPSBmYWN0b3J5LmNyZWF0ZVNpdGUodXJsLCBmb3JjZUNyZWF0aW9uKTsNCi0JfSBjYXRjaCAoUGFyc2luZ0V4Y2VwdGlvbiBlMSl7DQotCQl0aHJvdyBuZXdDb3JlRXhjZXB0aW9uKCJFcnJvciBwYXJzaW5nIFVSTDoiK3VybC50b0V4dGVybmFsRm9ybSgpKyJcclxuIitlMS5nZXRNZXNzYWdlKCkrIlxyXG5QcmV2aW91cyBJbnB1dC9PdXRwdXQgRXJyb3I6IitlLmdldE1lc3NhZ2UoKSxlMSk7CQkJCQkNCi0JfSBjYXRjaCAoSU9FeGNlcHRpb24gZTEpew0KLQkJdGhyb3cgbmV3Q29yZUV4Y2VwdGlvbigiRXJyb3IgYWNjZXNzaW5nIHVybDoiK3VybC50b0V4dGVybmFsRm9ybSgpKyJcclxuIitlMS5nZXRNZXNzYWdlKCkrIlxyXG5QcmV2aW91cyBJbnB1dC9PdXRwdXQgRXJyb3I6IitlLmdldE1lc3NhZ2UoKSxlMSk7CQkJCQkNCi0JCQkJfQkJCQkNCi0JCQl9DQotDQotCQl9IGNhdGNoIChQYXJzaW5nRXhjZXB0aW9uIGUpIHsNCi0JCQkNCi0JCQkvLyBpZiB0aGUgVVJMIGlzIHBvaW50aW5nIHRvIGVpdGhlciBhIGZpbGUgDQotLy8gb3IgYSBkaXJlY3RvcnksIHdpdGhvdXQgcmVmZXJlbmNlCQkJDQotaWYgKHVybC5nZXRSZWYoKSAhPSBudWxsKSB7DQotCS8vIDQgbm90aGluZyB3ZSBjYW4gZG8NCi0JdGhyb3cgbmV3Q29yZUV4Y2VwdGlvbigiRXJyb3IgcGFyc2luZyBVUkw6Iit1cmwudG9FeHRlcm5hbEZvcm0oKSsiXHJcbiIrZS5nZXRNZXNzYWdlKCksZSk7DQotfSBlbHNlIGlmICh1cmwuZ2V0RmlsZSgpLmVuZHNXaXRoKCIvIikpIHsNCi0JLy8gMSB0cnkgdG8gYWRkIHNpdGUueG1sDQotCXRyeSB7DQotCQl1cmwgPSBuZXcgVVJMKHVybCxTaXRlLlNJVEVfWE1MKTsNCi0JfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUxKXsNCi0JCXRocm93IG5ld0NvcmVFeGNlcHRpb24oIkNhbm5vdCBjcmVhdGUgVVJMOiIrdXJsLnRvRXh0ZXJuYWxGb3JtKCkrIisiK1NpdGUuU0lURV9YTUwsZTEpOw0KLQl9DQotCXRyeSB7DQotCQlzaXRlID0gZmFjdG9yeS5jcmVhdGVTaXRlKHVybCwgZm9yY2VDcmVhdGlvbik7DQotCX0gY2F0Y2ggKFBhcnNpbmdFeGNlcHRpb24gZTEpew0KLQkJdGhyb3cgbmV3Q29yZUV4Y2VwdGlvbigiRXJyb3IgcGFyc2luZyBVUkw6Iit1cmwudG9FeHRlcm5hbEZvcm0oKSsiXHJcbiIrZTEuZ2V0TWVzc2FnZSgpLGUxKTsJCQkJCQ0KLQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlMSl7DQotCQl0aHJvdyBuZXdDb3JlRXhjZXB0aW9uKCJFcnJvciBhY2Nlc3NpbmcgdXJsOiIrdXJsLnRvRXh0ZXJuYWxGb3JtKCkrIlxyXG4iK2UxLmdldE1lc3NhZ2UoKSxlMSk7DQotCQkJCX0JCQkJDQotDQotCQkJfSBlbHNlIGlmICh1cmwuZ2V0RmlsZSgpLmVuZHNXaXRoKFNpdGUuU0lURV9YTUwpKSB7DQotCQkJCS8vIDMgbm90aGluZyB3ZSBjYW4gZG8NCi0JdGhyb3cgbmV3Q29yZUV4Y2VwdGlvbigiRXJyb3IgcGFyc2luZyBVUkw6Iit1cmwudG9FeHRlcm5hbEZvcm0oKSsiXHJcbiIrZS5nZXRNZXNzYWdlKCksZSk7CQkJCQkNCi19IGVsc2Ugew0KLQkvLyAyIHRyeSB0byBhZGQgL3NpdGUueG1sDQotCQ0KLQl0cnkgew0KLQkJdXJsID0gbmV3IFVSTCh1cmwuZ2V0UHJvdG9jb2woKSx1cmwuZ2V0SG9zdCgpLCB1cmwuZ2V0UG9ydCgpLCB1cmwuZ2V0RmlsZSgpKyIvIitTaXRlLlNJVEVfWE1MKTsNCi0JfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUxKXsNCi0JCXRocm93IG5ld0NvcmVFeGNlcHRpb24oIkNhbm5vdCBjcmVhdGUgVVJMOiIrdXJsLnRvRXh0ZXJuYWxGb3JtKCkrIisiK1NpdGUuU0lURV9YTUwsZTEpOw0KLQl9DQotCXRyeSB7DQotCQlzaXRlID0gZmFjdG9yeS5jcmVhdGVTaXRlKHVybCwgZm9yY2VDcmVhdGlvbik7DQotCX0gY2F0Y2ggKFBhcnNpbmdFeGNlcHRpb24gZTEpew0KLQkJdGhyb3cgbmV3Q29yZUV4Y2VwdGlvbigiRXJyb3IgcGFyc2luZyBVUkw6Iit1cmwudG9FeHRlcm5hbEZvcm0oKSsiXHJcbiIrZTEuZ2V0TWVzc2FnZSgpKyJcclxuUHJldmlvdXMgUGFyc2luZyBlcnJvcjoiK2UuZ2V0TWVzc2FnZSgpLGUxKTsJCQkJCQ0KLQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlMSl7DQotCQl0aHJvdyBuZXdDb3JlRXhjZXB0aW9uKCJFcnJvciBhY2Nlc3NpbmcgdXJsOiIrdXJsLnRvRXh0ZXJuYWxGb3JtKCkrIlxyXG4iK2UxLmdldE1lc3NhZ2UoKSsiXHJcblByZXZpb3VzIFBhcnNpbmcgZXJyb3I6IitlLmdldE1lc3NhZ2UoKSxlMSk7DQotCQ0KLQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvYWJvdXQuaHRtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY4MzI0ZS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi08aHRtbD4NCi08aGVhZD4NCi08dGl0bGU+QWJvdXQ8L3RpdGxlPg0KLTxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQotcCwgdGFibGUsIHRkLCB0aCB7IGZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBnZW5ldmE7IGZvbnQtc2l6ZTogMTBwdH0NCi1wcmUgeyBmb250LWZhbWlseTogIkNvdXJpZXIgTmV3IiwgQ291cmllciwgbW9ubzsgZm9udC1zaXplOiAxMHB0fQ0KLWgyIHsgZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIGdlbmV2YTsgZm9udC1zaXplOiAxOHB0OyBmb250LXdlaWdodDogYm9sZCA7IGxpbmUtaGVpZ2h0OiAxNHB4fQ0KLWNvZGUgeyBmb250LWZhbWlseTogIkNvdXJpZXIgTmV3IiwgQ291cmllciwgbW9ubzsgZm9udC1zaXplOiAxMHB0fQ0KLXN1cCB7IGZvbnQtZmFtaWx5OiBhcmlhbCxoZWx2ZXRpY2EsZ2VuZXZhOyBmb250LXNpemU6IDEwcHh9DQotaDMgeyBmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgZ2VuZXZhOyBmb250LXNpemU6IDE0cHQ7IGZvbnQtd2VpZ2h0OiBib2xkfQ0KLWxpIHsgZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIGdlbmV2YTsgZm9udC1zaXplOiAxMHB0fQ0KLWgxIHsgZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIGdlbmV2YTsgZm9udC1zaXplOiAyOHB4OyBmb250LXdlaWdodDogYm9sZH0NCi1ib2R5IHsgZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIGdlbmV2YTsgZm9udC1zaXplOiAxMHB0OyBjbGlwOiByZWN0KCAgICk7IG1hcmdpbi10b3A6IDVtbTsgbWFyZ2luLWxlZnQ6IDNtbX0NCi08L3N0eWxlPg0KLTwvaGVhZD4NCi08Ym9keSBsYW5nPSJFTi1VUyIgbGluaz0iYmx1ZSIgdmxpbms9InB1cnBsZSI+DQotPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjUiIGNlbGxwYWRkaW5nPSIyIiB3aWR0aD0iMTAwJSIgPg0KLSAgPHRyPiANCi0gICAgPHRkIGFsaWduPSJMRUZUIiB2YWxpZ249IlRPUCIgY29sc3Bhbj0iMiIgYmdjb2xvcj0iIzAwODBDMCI+PGI+PGZvbnQgY29sb3I9IiNGRkZGRkYiPkFib3V0IFRoaXMgQ29udGVudDwvZm9udD48L2I+PC90ZD4NCi0gIDwvdHI+DQotICA8dHI+IA0KLSAgICA8dGQ+IA0KLTxwPjExdGggRGVjZW1iZXIsIDIwMDE8L3A+CQ0KLTxoMz5MaWNlbnNlPC9oMz4NCi08cD5FY2xpcHNlLm9yZyBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICZxdW90O0NvbnRlbnQmcXVvdDsuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUNCi08YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbCI+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMC41PC9hPiAmcXVvdDtDUEwmcXVvdDsuICBGb3IgcHVycG9zZXMgb2YgdGhlIENQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPg0KLQ0KLTxoMz5Db250cmlidXRpb25zPC9oMz4NCi0NCi08cD5JZiB0aGlzIENvbnRlbnQgaXMgbGljZW5zZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQ1BMLCBhbnkgQ29udHJpYnV0aW9ucywgYXMgZGVmaW5lZCBpbiB0aGUgQ1BMLCB1cGxvYWRlZCwgc3VibWl0dGVkLCBvciBvdGhlcndpc2UNCi1tYWRlIGF2YWlsYWJsZSB0byBFY2xpcHNlLm9yZywgbWVtYmVycyBvZiBFY2xpcHNlLm9yZyBhbmQvb3IgdGhlIGhvc3Qgb2YgRWNsaXBzZS5vcmcgd2ViIHNpdGUsIGJ5IHlvdSB0aGF0IHJlbGF0ZSB0byBzdWNoDQotQ29udGVudCBhcmUgcHJvdmlkZWQgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBDUEwgYW5kIGNhbiBiZSBtYWRlIGF2YWlsYWJsZSB0byBvdGhlcnMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDUEwuPC9wPg0KLQ0KLTxwPklmIHRoaXMgQ29udGVudCBpcyBsaWNlbnNlZCB0byB5b3UgdW5kZXIgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvdGhlciB0aGFuIHRoZSBDUEwgJnF1b3Q7T3RoZXIgTGljZW5zZSZxdW90OywgYW55IG1vZGlmaWNhdGlvbnMsIGVuaGFuY2VtZW50cyBhbmQvb3INCi1vdGhlciBjb2RlIGFuZC9vciBkb2N1bWVudGF0aW9uICZxdW90O01vZGlmaWNhdGlvbnMmcXVvdDsgdXBsb2FkZWQsIHN1Ym1pdHRlZCwgb3Igb3RoZXJ3aXNlIG1hZGUgYXZhaWxhYmxlIHRvIEVjbGlwc2Uub3JnLCBtZW1iZXJzIG9mIEVjbGlwc2Uub3JnIGFuZC9vciB0aGUNCi1ob3N0IG9mIEVjbGlwc2Uub3JnLCBieSB5b3UgdGhhdCByZWxhdGUgdG8gc3VjaCBDb250ZW50IGFyZSBwcm92aWRlZCB1bmRlciB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgT3RoZXIgTGljZW5zZSBhbmQgY2FuIGJlIG1hZGUgYXZhaWxhYmxlDQotdG8gb3RoZXJzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3RoZXIgTGljZW5zZS4gIEluIGFkZGl0aW9uLCB3aXRoIHJlZ2FyZCB0byBNb2RpZmljYXRpb25zIGZvciB3aGljaCB5b3UgYXJlIHRoZSBjb3B5cmlnaHQgaG9sZGVyLCB5b3UgYXJlIGFsc28NCi1wcm92aWRpbmcgdGhlIE1vZGlmaWNhdGlvbnMgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBDUEwgYW5kIHN1Y2ggTW9kaWZpY2F0aW9ucyBjYW4gYmUgbWFkZSBhdmFpbGFibGUgdG8gb3RoZXJzIHVuZGVyIHRoZSB0ZXJtcyBvZg0KLXRoZSBDUEwuPC9wPg0KLTwvdGQ+PC90cj48L3RhYmxlPg0KLTwvYm9keT4NCi08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9idWlsZC5wcm9wZXJ0aWVzIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGEyMWE2Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotc291cmNlLnVwZGF0ZWV4YW1wbGVzY29yZS5qYXIgPSBzcmMvDQotc3JjLmluY2x1ZGVzPWFib3V0Lmh0bWwNCi1iaW4uaW5jbHVkZXM9cGx1Z2luLnhtbCxwbHVnaW4ucHJvcGVydGllcywqLmphcixhYm91dC5odG1sDQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9wbHVnaW4ucHJvcGVydGllcyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhMzFmOGMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotDQotbmFtZSA9IEluc3RhbGwvVXBkYXRlIEJ1aWxkWmlwIEV4YW1wbGUNCi1wcm92aWRlci1uYW1lID0gRWNsaXBzZS5vcmcKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3BsdWdpbi54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4YjQwOTIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cGx1Z2luDQotICAgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcyINCi0gICBuYW1lPSIlbmFtZSINCi0gICB2ZXJzaW9uPSIyLjAuMCINCi0gICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXItbmFtZSI+DQotDQotICAgPHJ1bnRpbWU+DQotICAgICAgPGxpYnJhcnkgbmFtZT0idXBkYXRlZXhhbXBsZXMuamFyIj4NCi0gICAgICAgICA8ZXhwb3J0IG5hbWU9IioiLz4NCi0gICAgICA8L2xpYnJhcnk+DQotICAgPC9ydW50aW1lPg0KLSAgIDxyZXF1aXJlcz4NCi0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIi8+DQotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5hcGFjaGUueGVyY2VzIi8+DQotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUuYm9vdCIvPg0KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZSIvPg0KLSAgIDwvcmVxdWlyZXM+DQotDQotDQotICAgPGV4dGVuc2lvbg0KLSAgICAgICAgIGlkPSJ6aXAiDQotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZlYXR1cmVUeXBlcyI+DQotICAgICAgPGZlYXR1cmUtZmFjdG9yeQ0KLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMuYnVpbGR6aXAuQnVpbGRaaXBGZWF0dXJlRmFjdG9yeSI+DQotICAgICAgPC9mZWF0dXJlLWZhY3Rvcnk+DQotICAgPC9leHRlbnNpb24+DQotICAgPGV4dGVuc2lvbg0KLSAgICAgICAgIGlkPSJzaXRlLnppcCINCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuc2l0ZVR5cGVzIj4NCi0gICAgICA8c2l0ZS1mYWN0b3J5DQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy5idWlsZHppcC5CdWlsZFppcFNpdGVGYWN0b3J5Ij4NCi0gICAgICA8L3NpdGUtZmFjdG9yeT4NCi0gICA8L2V4dGVuc2lvbj4NCi0gICA8ZXh0ZW5zaW9uDQotICAgICAgICAgaWQ9InNpdGUuZnJlZWZvcm0iDQotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnNpdGVUeXBlcyI+DQotICAgICAgPHNpdGUtZmFjdG9yeQ0KLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMuZnJlZWZvcm0uRnJlZUZvcm1TaXRlRmFjdG9yeSI+DQotICAgICAgPC9zaXRlLWZhY3Rvcnk+DQotICAgPC9leHRlbnNpb24+DQotDQotPC9wbHVnaW4+DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9zaXRlL2ZlYXR1cmVzL2NvbS5yZWRkb3QucmVkZG90XzEuMC4wLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvc2l0ZS9mZWF0dXJlcy9jb20ucmVkZG90LnJlZGRvdF8xLjAuMC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NTA3YTcuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9zaXRlL2ZlYXR1cmVzL2NvbS5yZWRkb3QucmVkZG90XzEuMC4wLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvc2l0ZS9mZWF0dXJlcy9jb20ucmVkZG90LnJlZGRvdF8yLjAuMC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NpdGUvZmVhdHVyZXMvY29tLnJlZGRvdC5yZWRkb3RfMi4wLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjM2ODE1Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvc2l0ZS9mZWF0dXJlcy9jb20ucmVkZG90LnJlZGRvdF8yLjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NpdGUvaW5mby9pbWFnZXMvcmVkRG90LmpwZyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvc2l0ZS9pbmZvL2ltYWdlcy9yZWREb3QuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGZiNWMzLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvc2l0ZS9pbmZvL2ltYWdlcy9yZWREb3QuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9zaXRlL2luZm8vc2l0ZUluZm8uaHRtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvc2l0ZS9pbmZvL3NpdGVJbmZvLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlY2E5N2QuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9zaXRlL2luZm8vc2l0ZUluZm8uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci08IS0tIHNhdmVkIGZyb20gdXJsPSgwMDQwKWh0dHA6Ly9kZWphbi90ZXN0U2l0ZS9pbmZvL3NpdGVJbmZvLmh0bWwgLS0+Ci08SFRNTD48SEVBRD4KLTxNRVRBIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPE1FVEEgY29udGVudD0iTVNIVE1MIDUuNTAuNDgwNy4yMzAwIiBuYW1lPUdFTkVSQVRPUj48L0hFQUQ+Ci08Qk9EWT4KLTxIMSBhbGlnbj1sZWZ0PjxJTUcgaGVpZ2h0PTU1IHNyYz0iaW1hZ2VzL3JlZERvdC5qcGciIHdpZHRoPTU2IAotYWxpZ249Y2VudGVyIGJvcmRlcj0wPiA8Rk9OVCBjb2xvcj0jYzBjMGMwPkZvbGxvdyB0aGUgUmVkIERvdCZuYnNwOzwvRk9OVD48L0gxPgotPFA+V2VsY29tZSB0byB0aGUgPEI+PEZPTlQgY29sb3I9IzgwMDAwMD5SZWQgRG90PC9GT05UPiA8L0I+dXBkYXRlIHNpdGUuIFVzZSAKLXlvdXIgRWNsaXBzZSA8Qj5VcGRhdGUgU2l0ZXM8L0I+IHZpZXcgdG8gbG9jYXRlIHRoZSBmZWF0dXJlIHZlcnNpb24geW91IHdhbnQgdG8gCi1pbnN0YWxsIG9yIHVwZGF0ZSB0by48L1A+Ci08SDI+QWJvdXQgUmVkIERvdCBGZWF0dXJlPC9IMj4KLTxQPk91ciByZXZvbHV0aW9uYXJ5IFJlZCBEb3QgRWNsaXBzZSBmZWF0dXJlIGNoYW5nZWQgYWxsIHByZWNvbmNlcHRpb25zIGFib3V0IAotd2hhdCBFY2xpcHNlIGZlYXR1cmVzIGNhbiBhbmQgY2Fubm90IGRvLiBVc2luZyBvdXIgc3RyaWtpbmdseSBzaW1wbGUgY29uY2VwdCBvZiAKLWFkZGluZyBidXR0b25zIHRvIHRoZSBFY2xpcHNlIHRvb2wgYmFyLCB3ZSBhbGxvdyB5b3UgdG8gb3BlbiBkaWFsb2dzIHRoYXQgc2hvdyAKLXlvdSB0aGUgdmVyc2lvbiBvZiB0aGUgUmVkIERvdCBmZWF0dXJlLiBUaGUgYmVhdXR5IG9mIHRoZSBjb25jZXB0IHN0ZW1zIGZyb20gaXRzIAotc2ltcGxpY2l0eSwgZWFzZSBvZiB1c2UsIGhpZ2ggcGVyZm9ybWFuY2UgYW5kIHNtYWxsIGZvb3RwcmludC4gTmV2ZXIgYmVmb3JlIHdhcyAKLWl0IHNvIGVhc3kgdG8gcHJlc3MgYSBidXR0b24gb24gdGhlIHRvb2wgYmFyIHRvIGdldCBzb21lIHRleHQgc2hvd24gaW4gdGhlIAotZGlhbG9nLjwvUD4KLTxIMj5OZXdzPC9IMj4KLTxVTD4KLSAgPExJPjxCPk5vdmVtYmVyIDIwMDE8L0I+IC0gdmVyc2lvbiAyLjAuMCBvZiB0aGUgUmVkIERvdCBmZWF0dXJlIGlzIGF2YWlsYWJsZSAKLSAgZm9yIGRvd25sb2FkLiBUaGlzIHZlcnNpb24gYnJpbmdzIGltcHJvdmVtZW50cyBhY3Jvc3MgdGhlIGJvYXJkLCBmdXJ0aGVyIAotICBzdHJlbmd0aGVuaW5nIGFuIGFscmVhZHkgZXN0YWJsaXNoZWQgRWNsaXBzZSBmZWF0dXJlIGNsYXNzaWMuIEltcHJvdmVtZW50cyAKLSAgd2lsbCBiZSB2aXNpYmxlIHRoZSBtb21lbnQgeW91IHVwZGF0ZSB5b3VyIGZlYXR1cmUgLSBvdXIgZmFtb3VzIHJlZCBkb3QgdG9vbCAKLSAgYmFyIGJ1dHRvbiBpcyBub3cgPEI+MjUlIG1vcmUgcmVkPC9CPiwgbWFraW5nIGl0IGV2ZW4gZWFzaWVyIHRvIHNwb3QgYW1vbmcgCi0gIG90aGVyIGJ1dHRvbnMuIAotICA8TEk+PEI+T2N0b2JlciAyMDAxPC9CPiAtIHZlcnNpb24gMS4wLjAgb2YgdGhlIFJlZCBEb3QgZmVhdHVyZSBpcyBhdmFpbGFibGUgCi0gIGZvciBkb3dubG9hZC4gU2VsZWN0IGl0IGluIHRoZSAnU2l0ZXMnIHZpZXcgb2YgdGhlIFVwZGF0ZSBNYW5hZ2VyIGFuZCBwcmVzcyAKLSAgJ0luc3RhbGwnIGJ1dHRvbi4gPC9MST48L1VMPgotPEhSPgotPEk+Q29weXJpZ2h0IDIwMDEgUmVkIERvdCBDb3Jwb3JhdGlvbiBMdGQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9JPiAKLTwvQk9EWT48L0hUTUw+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NpdGUvcGx1Z2lucy9jb20ucmVkZG90LnJlZGRvdF8xLjAuMC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NpdGUvcGx1Z2lucy9jb20ucmVkZG90LnJlZGRvdF8xLjAuMC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4OGI3OTMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9zaXRlL3BsdWdpbnMvY29tLnJlZGRvdC5yZWRkb3RfMS4wLjAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9zaXRlL3BsdWdpbnMvY29tLnJlZGRvdC5yZWRkb3RfMi4wLjAuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9zaXRlL3BsdWdpbnMvY29tLnJlZGRvdC5yZWRkb3RfMi4wLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTMxYWQzLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvc2l0ZS9wbHVnaW5zL2NvbS5yZWRkb3QucmVkZG90XzIuMC4wLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvc2l0ZS9zaXRlLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvc2l0ZS9zaXRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA5MTMyNC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NpdGUvc2l0ZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4KLTxzaXRlPgotICAgPGRlc2NyaXB0aW9uIHVybD0iaW5mby9zaXRlSW5mby5odG1sIi8+Ci0KLSAgIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvY29tLnJlZGRvdC5yZWRkb3RfMS4wLjAuamFyIj4KLSAgICAgIDxjYXRlZ29yeSBuYW1lPSJyZWRkb3QiLz4KLSAgIDwvZmVhdHVyZT4KLQotICAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9jb20ucmVkZG90LnJlZGRvdF8yLjAuMC5qYXIiPgotICAgICAgPGNhdGVnb3J5IG5hbWU9InJlZGRvdCIvPgotICAgPC9mZWF0dXJlPgotCi0gICA8Y2F0ZWdvcnktZGVmIGxhYmVsPSJSZWQgRG90IFZlcnNpb25zIiBuYW1lPSJyZWRkb3QiPgotICAgICAgPGRlc2NyaXB0aW9uIHVybD0iaW5mby9SZWREb3RWZXJzaW9ucy5odG1sIj4KLSAgICAgICAgIFRoaXMgY2F0ZWdvcnkgY29udGFpbnMgYWxsIG9mIHRoZSBjdXJyZW50bHkgYXZhaWxhYmxlIHZlcnNpb25zIG9mIFJlZCBEb3QgZmVhdHVyZS4KLSAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICA8L2NhdGVnb3J5LWRlZj4KLQotPC9zaXRlPiAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9leGFtcGxlcy9idWlsZHppcC9CdWlsZFppcENvbnZlcnRlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2V4YW1wbGVzL2J1aWxkemlwL0J1aWxkWmlwQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4MWVjMmEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2V4YW1wbGVzL2J1aWxkemlwL0J1aWxkWmlwQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMuYnVpbGR6aXA7DQotDQotLyoNCi0gKiAoYykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAwLCAyMDAyLg0KLSAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQotICovIA0KLSANCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07DQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07DQotaW1wb3J0IGphdmEuaW8uU3RyaW5nQnVmZmVySW5wdXRTdHJlYW07DQotaW1wb3J0IGphdmEubmV0LlVSTDsNCi1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7DQotaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyRW50cnk7DQotaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyT3V0cHV0U3RyZWFtOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5Db250ZW50UmVmZXJlbmNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUZlYXR1cmVDb250ZW50UHJvdmlkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklQbHVnaW5FbnRyeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSmFyQ29udGVudFJlZmVyZW5jZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuSW5zdGFsbEFib3J0ZWRFeGNlcHRpb247DQotDQotLyoqDQotICogQ29udmVydHMgZWNsaXBzZSBidWlsZCAuemlwIGZpbGVzIGludG8gcGFja2FnZWQgZmVhdHVyZQ0KLSAqLw0KLXB1YmxpYyBjbGFzcyBCdWlsZFppcENvbnZlcnRlciB7DQotDQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsNCi0JCWlmIChhcmdzLmxlbmd0aCA8PTApIHsNCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlVzYWdlOiAgICAgQnVpbGRaaXBDb252ZXJ0ZXIgPHBhdGggdG8gdGhlIHppcCBmaWxlPi5cclxuRXhhbXBsZTogQnVpbGRaaXBDb252ZXJ0ZXIgZDovZG93bmxvYWQvaW50ZWdyYXRpb24tZWNsaXBzZS1TREstMjAwMjAxMDktd2luMzIuemlwIik7DQotCQkJcmV0dXJuOw0KLQkJfQ0KLQkJdHJ5IHsNCi0JCQlVUkwgYnVpbGR6aXAgPSBuZXcgVVJMKCgiZmlsZToiK2FyZ3NbMF0pLnJlcGxhY2UoRmlsZS5zZXBhcmF0b3JDaGFyLCAnLycpKTsNCi0JCQlCdWlsZFppcEZlYXR1cmVGYWN0b3J5IGZhY3RvcnkgPSBuZXcgQnVpbGRaaXBGZWF0dXJlRmFjdG9yeSgpOw0KLQkJCUlGZWF0dXJlIGZlYXR1cmUgPSBmYWN0b3J5LmNyZWF0ZUZlYXR1cmUoYnVpbGR6aXAsIG51bGwpOw0KLQkJCUlGZWF0dXJlQ29udGVudFByb3ZpZGVyIHByb3ZpZGVyID0gZmVhdHVyZS5nZXRGZWF0dXJlQ29udGVudFByb3ZpZGVyKCk7DQotCQkJDQotCQkJQ29udGVudFJlZmVyZW5jZVtdIHJlZnMgPSBwcm92aWRlci5nZXRGZWF0dXJlRW50cnlDb250ZW50UmVmZXJlbmNlcyhudWxsKTsNCi0JCQkNCi0JCQlGaWxlIHNpdGUgPSBuZXcgRmlsZSgoYXJnc1swXSsiLnBhY2thZ2VkLyIpLnJlcGxhY2UoJy8nLEZpbGUuc2VwYXJhdG9yQ2hhcikpOw0KLQkJCXNpdGUubWtkaXJzKCk7DQotCQkJRmlsZSBmZWF0dXJlc0RpciA9IG5ldyBGaWxlKHNpdGUsImZlYXR1cmVzIik7DQotCQkJZmVhdHVyZXNEaXIubWtkaXJzKCk7DQotCQkJRmlsZSBwbHVnaW5zRGlyID0gbmV3IEZpbGUoc2l0ZSwgInBsdWdpbnMiKTsNCi0JCQlwbHVnaW5zRGlyLm1rZGlycygpOw0KLQkJCQ0KLQkJCUZpbGUgamFyRmlsZSA9IG5ldyBGaWxlKGZlYXR1cmVzRGlyLGZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpKyIuamFyIik7DQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJ3cml0aW5nIGZlYXR1cmUgYXJjaGl2ZTogIitmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSsiLmphciIpOw0KLQkJCXdyaXRlSmFyKGphckZpbGUsIHJlZnMsIGZlYXR1cmUsIG51bGwsIG51bGwpOw0KLQkJCUphckNvbnRlbnRSZWZlcmVuY2UgamFyID0gbmV3IEphckNvbnRlbnRSZWZlcmVuY2UoImJ1aWxkLnppcCIsYnVpbGR6aXApOw0KLQkJCVByb3BlcnRpZXMgbWFuaWZlc3QgPSBnZXRCdWlsZE1hbmlmZXN0KGphcik7DQotCQkJDQotCQkJSVBsdWdpbkVudHJ5W10gcGx1Z2lucyA9IGZlYXR1cmUuZ2V0UGx1Z2luRW50cmllcygpOw0KLQkJCWZvciAoaW50IGk9MDsgaTxwbHVnaW5zLmxlbmd0aDsgaSsrKSB7DQotCQkJCXJlZnMgPSBwcm92aWRlci5nZXRQbHVnaW5FbnRyeUNvbnRlbnRSZWZlcmVuY2VzKHBsdWdpbnNbaV0sIG51bGwpOw0KLQkJCQlqYXJGaWxlID0gbmV3IEZpbGUocGx1Z2luc0RpcixwbHVnaW5zW2ldLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSsiLmphciIpOw0KLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIndyaXRpbmcgcGx1Z2luIGFyY2hpdmU6ICIrcGx1Z2luc1tpXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkrIi5qYXIiKTsNCi0JCQkJd3JpdGVKYXIoamFyRmlsZSwgcmVmcywgZmVhdHVyZSwgcGx1Z2luc1tpXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0SWRlbnRpZmllcigpLCBtYW5pZmVzdCk7DQotCQkJfQ0KLQkJCQ0KLQkJCXdyaXRlU2l0ZU1hbmlmZXN0KHNpdGUsIGZlYXR1cmUpOw0KLQkJfSBjYXRjaChFeGNlcHRpb24gZSkgew0KLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7DQotCQl9DQotCX0NCi0JDQotCXB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZUphcihGaWxlIGphckZpbGUsQ29udGVudFJlZmVyZW5jZVtdIHJlZnMsIElGZWF0dXJlIGZlYXR1cmUsIFN0cmluZyBwbHVnaW5JZCwgUHJvcGVydGllcyBtYW5pZmVzdCkgew0KLQkJCQ0KLQkJSmFyT3V0cHV0U3RyZWFtIGpvcyA9IG51bGw7DQotCQlGaWxlT3V0cHV0U3RyZWFtIG9zID0gbnVsbDsNCi0JCUlucHV0U3RyZWFtIGlzID0gbnVsbDsNCi0JCQ0KLQkJdHJ5IHsNCi0JCQlvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGphckZpbGUpOw0KLQkJCWpvcyA9IG5ldyBKYXJPdXRwdXRTdHJlYW0ob3MpOw0KLQkJCUphckVudHJ5IGVudHJ5ID0gbnVsbDsNCi0JCQlTdHJpbmcgYnVmID0gbnVsbDsNCi0JCQlTdHJpbmdCdWZmZXJJbnB1dFN0cmVhbSBzYmlzID0gbnVsbDsNCi0JCQkNCi0JCQkvLyB3cml0ZSBqYXIgbWFuaWZlc3QgKGZpcnN0IGVudHJ5IGluIG91dHB1dCBzdHJlYW0pDQotCQkJYnVmID0gIk1hbmlmZXN0LVZlcnNpb246IDEuMFxuQ3JlYXRlZC1CeTogMi4wLjAgKHd3dy5lY2xpcHNlLm9yZyBGZWF0dXJlIFBhY2thZ2VyKVxuIjsNCi0JCQlzYmlzID0gbmV3IFN0cmluZ0J1ZmZlcklucHV0U3RyZWFtKGJ1Zik7DQotCQkJZW50cnkgPSBuZXcgSmFyRW50cnkoIk1FVEEtSU5GL01BTklGRVNULk1GIik7DQotCQkJam9zLnB1dE5leHRFbnRyeShlbnRyeSk7DQotCQkJVXRpbGl0aWVzLmNvcHkoc2Jpcyxqb3MsbnVsbCk7DQotCQkJc2Jpcy5jbG9zZSgpOw0KLQkJCQ0KLQkJCS8vIGphciB1cCB0aGUgcmVmZXJlbmNlcw0KLQkJCWZvciAoaW50IGk9MDsgaTxyZWZzLmxlbmd0aDsgaSsrKSB7DQotCQkJCVN0cmluZyBpZCA9IHJlZnNbaV0uZ2V0SWRlbnRpZmllcigpOw0KLQkJCQllbnRyeSA9IG5ldyBKYXJFbnRyeShpZCk7DQotCQkJCWpvcy5wdXROZXh0RW50cnkoZW50cnkpOw0KLQkJCQlpcyA9IHJlZnNbaV0uZ2V0SW5wdXRTdHJlYW0oKTsNCi0JCQkJVXRpbGl0aWVzLmNvcHkoaXMsam9zLG51bGwpOw0KLQkJCQlpcy5jbG9zZSgpOyBpcyA9IG51bGw7DQotCQkJfQ0KLQkJCQ0KLQkJCS8vIGZvciBwbHVnaW4gamFycywgd3JpdGUgYnVpbGQgbWFuaWZlc3QNCi0JCQlpZiAocGx1Z2luSWQgIT0gbnVsbCAmJiBtYW5pZmVzdCAhPSBudWxsKSB7DQotCQkJCVN0cmluZyBrZXkgPSAicGx1Z2luQCIrcGx1Z2luSWQ7DQotCQkJCVN0cmluZyB2YWx1ZSA9IG1hbmlmZXN0LmdldFByb3BlcnR5KGtleSk7DQotCQkJCWlmICh2YWx1ZSAhPSBudWxsKSB7DQotCQkJCQlpZiAodmFsdWUuZXF1YWxzKCJIRUFEIikpIHsNCi0JCQkJCQl2YWx1ZSArPSAiLSIgKyBmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRWZXJzaW9uKCkuZ2V0TWFqb3JDb21wb25lbnQoKTsNCi0JCQkJCX0NCi0JCQkJCWJ1ZiA9IGtleSArICI9IiArIHZhbHVlOw0KLQkJCQkJc2JpcyA9IG5ldyBTdHJpbmdCdWZmZXJJbnB1dFN0cmVhbShidWYpOw0KLQkJCQkJZW50cnkgPSBuZXcgSmFyRW50cnkoImJ1aWxkbWFuaWZlc3QucHJvcGVydGllcyIpOw0KLQkJCQkJam9zLnB1dE5leHRFbnRyeShlbnRyeSk7DQotCQkJCQlVdGlsaXRpZXMuY29weShzYmlzLGpvcyxudWxsKTsNCi0JCQkJCXNiaXMuY2xvc2UoKTsNCi0JCQkJfQ0KLQkJCX0NCi0JCQkNCi0JCQkvLyBjbG9zZSBqYXINCi0JCQlqb3MuY2xvc2UoKTsgam9zID0gbnVsbDsgb3MgPSBudWxsOw0KLQkJfSBjYXRjaChFeGNlcHRpb24gZSkgew0KLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7DQotCQl9IGZpbmFsbHkgew0KLQkJCWlmIChpcyAhPSBudWxsKSANCi0JCQkJdHJ5IHtpcy5jbG9zZSgpO30gY2F0Y2goSU9FeGNlcHRpb24gZSkge30NCi0JCQkJDQotCQkJaWYgKGpvcyAhPSBudWxsKSANCi0JCQkJdHJ5IHtqb3MuY2xvc2UoKTt9IGNhdGNoKElPRXhjZXB0aW9uIGUpIHt9DQotCQkJZWxzZSBpZiAob3MgIT0gbnVsbCkNCi0JCQkJdHJ5IHtvcy5jbG9zZSgpO30gY2F0Y2goSU9FeGNlcHRpb24gZSkge30NCi0JCX0JCQ0KLQl9DQotCQ0KLQlwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVTaXRlTWFuaWZlc3QoRmlsZSBzaXRlLCBJRmVhdHVyZSBmZWF0dXJlKSB0aHJvd3MgSU9FeGNlcHRpb24sIEluc3RhbGxBYm9ydGVkRXhjZXB0aW9uIHsNCi0JCUZpbGUgbWFuaWZlc3QgPSBuZXcgRmlsZShzaXRlLCAic2l0ZS54bWwiKTsNCi0JCUZpbGVPdXRwdXRTdHJlYW0gb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShtYW5pZmVzdCk7DQotCQlTdHJpbmcgc2l0ZVhNTCA9ICI8c2l0ZT5cbiAgIDxmZWF0dXJlIHVybD1cImZlYXR1cmVzLyIrZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSsiLmphclwiLz5cbjwvc2l0ZT4iOw0KLQkJU3RyaW5nQnVmZmVySW5wdXRTdHJlYW0gc2JpcyA9IG5ldyBTdHJpbmdCdWZmZXJJbnB1dFN0cmVhbShzaXRlWE1MKTsNCi0JCVV0aWxpdGllcy5jb3B5KHNiaXMsb3MsbnVsbCk7DQotCQlvcy5jbG9zZSgpOw0KLQkJc2Jpcy5jbG9zZSgpOw0KLQl9DQotCQ0KLQlwdWJsaWMgc3RhdGljIFByb3BlcnRpZXMgZ2V0QnVpbGRNYW5pZmVzdChKYXJDb250ZW50UmVmZXJlbmNlIGphcikgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0JCUNvbnRlbnRSZWZlcmVuY2UgbWFuaWZlc3RFbnRyeSA9IGphci5wZWVrKCJlY2xpcHNlL2J1aWxkbWFuaWZlc3QucHJvcGVydGllcyIsbnVsbC8qQ29udGVudFNlbGVjdG9yKi8sIG51bGwvKlByb2dyZXNzTW9uaXRvciovKTsNCi0JCUlucHV0U3RyZWFtIGlzID0gbnVsbDsNCi0JCVByb3BlcnRpZXMgcHJvcHMgPSBudWxsOw0KLQkJdHJ5IHsNCi0JCQlwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7DQotCQkJaXMgPSBtYW5pZmVzdEVudHJ5LmdldElucHV0U3RyZWFtKCk7DQotCQkJcHJvcHMubG9hZChpcyk7DQotCQl9IGZpbmFsbHkgew0KLQkJCWlmIChpcyAhPSBudWxsKSB0cnl7IGlzLmNsb3NlKCk7IH0gY2F0Y2goSU9FeGNlcHRpb24gZSkge30NCi0JCX0NCi0JCXJldHVybiBwcm9wczsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvZXhhbXBsZXMvYnVpbGR6aXAvQnVpbGRaaXBGZWF0dXJlQ29udGVudFByb3ZpZGVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvZXhhbXBsZXMvYnVpbGR6aXAvQnVpbGRaaXBGZWF0dXJlQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwZjFjMGUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2V4YW1wbGVzL2J1aWxkemlwL0J1aWxkWmlwRmVhdHVyZUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU2ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzLmJ1aWxkemlwOw0KLQ0KLS8qDQotICogKGMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMCwgMjAwMi4NCi0gKiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KLSAqLyANCi0NCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07DQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQotaW1wb3J0IGphdmEubmV0LlVSTDsNCi1pbXBvcnQgamF2YS51dGlsLmphci5KYXJFbnRyeTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5Db250ZW50UmVmZXJlbmNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5GZWF0dXJlQ29udGVudFByb3ZpZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZUNvbnRlbnRQcm92aWRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSU5vblBsdWdpbkVudHJ5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JUGx1Z2luRW50cnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklWZXJpZmllcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSW5zdGFsbE1vbml0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLkphckNvbnRlbnRSZWZlcmVuY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLkphckNvbnRlbnRSZWZlcmVuY2UuQ29udGVudFNlbGVjdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC5GZWF0dXJlTW9kZWw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLkluc3RhbGxBYm9ydGVkRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEFuIGV4YW1wbGUgZmVhdHVyZSBjb250ZW50IHByb3ZpZGVyLiBJdCBoYW5kbGVzIGZlYXR1cmVzIHBhY2thZ2VkIGFzDQotICogYnVpbGQgemlwJ3MgdXNpbmcgdGhlIGZvcm1hdCB1c2VkIGZvciBpbnRlZ3JhdGlvbiBhbmQgc3RhYmxlIGJ1aWxkcw0KLSAqIHBvc3RlZCBvbiB0aGUgZG93bmxvYWRzIHBhZ2VzIGF0IHd3dy5lY2xpcHNlLm9yZw0KLSAqIDwvcD4NCi0gKiBAc2luY2UgMi4wDQotICovDQotDQotcHVibGljIGNsYXNzIEJ1aWxkWmlwRmVhdHVyZUNvbnRlbnRQcm92aWRlciBleHRlbmRzIEZlYXR1cmVDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJRmVhdHVyZUNvbnRlbnRQcm92aWRlciB7DQotDQotCXByaXZhdGUgSmFyQ29udGVudFJlZmVyZW5jZSBiYXNlUmVmZXJlbmNlOw0KLQlwcml2YXRlIENvbnRlbnRSZWZlcmVuY2UgZ2VuZXJhdGVkRmVhdHVyZU1hbmlmZXN0OwkNCi0JcHJpdmF0ZSBDb250ZW50UmVmZXJlbmNlW10gZmVhdHVyZUVudHJ5Q29udGVudFJlZmVyZW5jZXM7DQotCXByaXZhdGUgSVBsdWdpbkVudHJ5IGN1cnJlbnRQbHVnaW5FbnRyeTsNCi0JcHJpdmF0ZSBJTm9uUGx1Z2luRW50cnkgY3VycmVudE5vblBsdWdpbkVudHJ5Ow0KLQkNCi0JcHVibGljIEJ1aWxkWmlwRmVhdHVyZUNvbnRlbnRQcm92aWRlcihVUkwgYmFzZSkgew0KLQkJc3VwZXIoYmFzZSk7DQotCQl0aGlzLmJhc2VSZWZlcmVuY2UgPSBuZXcgSmFyQ29udGVudFJlZmVyZW5jZSgiYnVpbGQuemlwIixiYXNlKTsNCi0JfQ0KLQkNCi0JLyoNCi0JICogQHNlZSBJRmVhdHVyZUNvbnRlbnRQcm92aWRlciNnZXRGZWF0dXJlTWFuaWZlc3QoKQ0KLQkgKi8NCi0JcHVibGljIENvbnRlbnRSZWZlcmVuY2UgZ2V0RmVhdHVyZU1hbmlmZXN0UmVmZXJlbmNlKEluc3RhbGxNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JCWlmIChnZW5lcmF0ZWRGZWF0dXJlTWFuaWZlc3QgPT0gbnVsbCkgew0KLQkJCXRocm93IG5ld0NvcmVFeGNlcHRpb24oIkZlYXR1cmUgbWFuaWZlc3QgaXMgbm90IGF2YWlsYWJsZSIsbnVsbCk7DQotCQl9DQotCQllbHNlDQotCQkJcmV0dXJuIGdlbmVyYXRlZEZlYXR1cmVNYW5pZmVzdDsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIElGZWF0dXJlQ29udGVudFByb3ZpZGVyI2dldEFyY2hpdmVSZWZlcmVuY2VzKCkNCi0JICovDQotCXB1YmxpYyBDb250ZW50UmVmZXJlbmNlW10gZ2V0QXJjaGl2ZVJlZmVyZW5jZXMoSW5zdGFsbE1vbml0b3IgbW9uaXRvcikgew0KLQkJLy8gdGhlIGZlYXR1cmUgYW5kIGFsbCBpdHMgcGx1Z2lucyBmaWxlcyBhcmUgcGFja2FnZWQgaW4gYSBzaW5nbGUgYXJjaGl2ZQ0KLQkJcmV0dXJuIG5ldyBDb250ZW50UmVmZXJlbmNlW10geyBiYXNlUmVmZXJlbmNlIH07DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBJRmVhdHVyZUNvbnRlbnRQcm92aWRlciNnZXRGZWF0dXJlRW50cnlBcmNoaXZlUmVmZXJlbmNlcygpDQotCSAqLw0KLQlwdWJsaWMgQ29udGVudFJlZmVyZW5jZVtdIGdldEZlYXR1cmVFbnRyeUFyY2hpdmVSZWZlcmVuY2VzKEluc3RhbGxNb25pdG9yIG1vbml0b3IpIHsNCi0JCS8vIHRoZSBmZWF0dXJlIGFuZCBhbGwgaXRzIHBsdWdpbnMgZmlsZXMgYXJlIHBhY2thZ2VkIGluIGEgc2luZ2xlIGFyY2hpdmUNCi0JCXJldHVybiBuZXcgQ29udGVudFJlZmVyZW5jZVtdIHsgYmFzZVJlZmVyZW5jZSB9Ow0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSUZlYXR1cmVDb250ZW50UHJvdmlkZXIjZ2V0UGx1Z2luRW50cnlBcmNoaXZlUmVmZXJlbmNlcyhJUGx1Z2luRW50cnkpDQotCSAqLw0KLQlwdWJsaWMgQ29udGVudFJlZmVyZW5jZVtdIGdldFBsdWdpbkVudHJ5QXJjaGl2ZVJlZmVyZW5jZXMoSVBsdWdpbkVudHJ5IHBsdWdpbkVudHJ5LCBJbnN0YWxsTW9uaXRvciBtb25pdG9yKSB7DQotCQkvLyB0aGUgZmVhdHVyZSBhbmQgYWxsIGl0cyBwbHVnaW5zIGZpbGVzIGFyZSBwYWNrYWdlZCBpbiBhIHNpbmdsZSBhcmNoaXZlDQotCQlyZXR1cm4gbmV3IENvbnRlbnRSZWZlcmVuY2VbXSB7IGJhc2VSZWZlcmVuY2UgfTsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIElGZWF0dXJlQ29udGVudFByb3ZpZGVyI2dldE5vblBsdWdpbkVudHJ5QXJjaGl2ZVJlZmVyZW5jZXMoSU5vblBsdWdpbkVudHJ5KQ0KLQkgKi8NCi0JcHVibGljIENvbnRlbnRSZWZlcmVuY2VbXSBnZXROb25QbHVnaW5FbnRyeUFyY2hpdmVSZWZlcmVuY2VzKElOb25QbHVnaW5FbnRyeSBub25QbHVnaW5FbnRyeSwgSW5zdGFsbE1vbml0b3IgbW9uaXRvcikgDQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQl0cnkgew0KLQkJCXJldHVybiBwZWVrTm9uUGx1Z2luRW50cnlDb250ZW50KG5vblBsdWdpbkVudHJ5LG1vbml0b3IpOw0KLQkJfSBjYXRjaChJT0V4Y2VwdGlvbiBlKSB7DQotCQkJdGhyb3cgbmV3Q29yZUV4Y2VwdGlvbigiVW5hYmxlIHRvIHJldHVybiBjb250ZW50IGZvciBub24gcGx1Z2luIGVudHJ5ICIrbm9uUGx1Z2luRW50cnkuZ2V0SWRlbnRpZmllcigpLGUpOw0KLQkJfQ0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSUZlYXR1cmVDb250ZW50UHJvdmlkZXIjZ2V0RmVhdHVyZUVudHJ5Q29udGVudFJlZmVyZW5jZXMoKQ0KLQkgKi8NCi0JcHVibGljIENvbnRlbnRSZWZlcmVuY2VbXSBnZXRGZWF0dXJlRW50cnlDb250ZW50UmVmZXJlbmNlcyhJbnN0YWxsTW9uaXRvciBtb25pdG9yKSB7DQotCQlpZiAoZmVhdHVyZUVudHJ5Q29udGVudFJlZmVyZW5jZXMgPT0gbnVsbCkNCi0JCQlyZXR1cm4gbmV3IENvbnRlbnRSZWZlcmVuY2VbMF07DQotCQllbHNlDQotCQkJcmV0dXJuICBmZWF0dXJlRW50cnlDb250ZW50UmVmZXJlbmNlczsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIElGZWF0dXJlQ29udGVudFByb3ZpZGVyI2dldFBsdWdpbkVudHJ5Q29udGVudFJlZmVyZW5jZXMoSVBsdWdpbkVudHJ5KQ0KLQkgKi8NCi0JcHVibGljIENvbnRlbnRSZWZlcmVuY2VbXSBnZXRQbHVnaW5FbnRyeUNvbnRlbnRSZWZlcmVuY2VzKElQbHVnaW5FbnRyeSBwbHVnaW5FbnRyeSwgSW5zdGFsbE1vbml0b3IgbW9uaXRvcikNCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JCXRyeSB7DQotCQkJcmV0dXJuIHBlZWtQbHVnaW5FbnRyeUNvbnRlbnQocGx1Z2luRW50cnksIG1vbml0b3IpOw0KLQkJfSBjYXRjaChJT0V4Y2VwdGlvbiBlKSB7DQotCQkJdGhyb3cgbmV3Q29yZUV4Y2VwdGlvbigiVW5hYmxlIHRvIHJldHVybiBjb250ZW50IGZvciBwbHVnaW4gZW50cnkgIitwbHVnaW5FbnRyeS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCksZSk7DQotCQl9DQotCX0NCi0JDQotCXB1YmxpYyBVUkwgZ2V0RmVhdHVyZUJhc2VVUkwoKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLQkJcmV0dXJuIGdldFdvcmtpbmdEaXJlY3RvcnkoKS50b1VSTCgpOw0KLQkJCQ0KLQl9DQotDQotCUNvbnRlbnRSZWZlcmVuY2UgZ2V0RmVhdHVyZUJ1aWxkTWFuaWZlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0JCXJldHVybiBiYXNlUmVmZXJlbmNlLnBlZWsoImVjbGlwc2UvYnVpbGRtYW5pZmVzdC5wcm9wZXJ0aWVzIixudWxsLypDb250ZW50U2VsZWN0b3IqLywgbnVsbC8qUHJvZ3Jlc3NNb25pdG9yKi8pOw0KLQl9DQotDQotCUNvbnRlbnRSZWZlcmVuY2UgZ2V0UGx1Z2luTWFuaWZlc3QoU3RyaW5nIHBsdWdpbklkLCBib29sZWFuIGlzRnJhZ21lbnQpIHRocm93cyBFeGNlcHRpb24gewkJCQ0KLQkJU3RyaW5nIG1hbmlmZXN0TmFtZSA9ICJlY2xpcHNlL3BsdWdpbnMvIiArIHBsdWdpbklkICsgIi8iICsgKGlzRnJhZ21lbnQgPyAiZnJhZ21lbnQueG1sIiA6ICJwbHVnaW4ueG1sIik7DQotCQlyZXR1cm4gYmFzZVJlZmVyZW5jZS5wZWVrKG1hbmlmZXN0TmFtZSwgbnVsbC8qQ29udGVudFNlbGVjdG9yKi8sIG51bGwvKlByb2dyZXNzTW9uaXRvciovKTsNCi0JfQ0KLQkNCi0Jdm9pZCB1bnBhY2tGZWF0dXJlRW50cnlDb250ZW50KEZlYXR1cmVNb2RlbCBmZWF0dXJlLCBJbnN0YWxsTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24sIEluc3RhbGxBYm9ydGVkRXhjZXB0aW9uIHsNCi0JCQkNCi0JCS8vIGRlZmluZSBzZWxlY3RvciBmb3IgZmVhdHVyZSBlbnRyeSBmaWxlcw0KLQkJQ29udGVudFNlbGVjdG9yIHNlbGVjdG9yID0gbmV3IENvbnRlbnRTZWxlY3RvcigpIHsNCi0JCQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKEphckVudHJ5IGphckVudHJ5KSB7DQotCQkJCWlmIChqYXJFbnRyeS5pc0RpcmVjdG9yeSgpKQ0KLQkJCQkJcmV0dXJuIGZhbHNlOwkJCQkJDQotCQkJCVN0cmluZyBlbnRyeSA9IGphckVudHJ5LmdldE5hbWUoKTsNCi0JCQkJaWYgKGVudHJ5LnN0YXJ0c1dpdGgoImVjbGlwc2UvcmVhZG1lLyIpKQ0KLQkJCQkJcmV0dXJuIHRydWU7DQotCQkJCWVsc2UgaWYgKGVudHJ5LnN0YXJ0c1dpdGgoImVjbGlwc2Uvc3BsYXNoLyIpKQ0KLQkJCQkJcmV0dXJuIHRydWU7DQotCQkJCWVsc2UgaWYgKGVudHJ5LnN0YXJ0c1dpdGgoImVjbGlwc2UvIikgJiYgZW50cnkuaW5kZXhPZigiLyIsOCk9PS0xICYmIGVudHJ5LmVuZHNXaXRoKCIuaHRtbCIpKQ0KLQkJCQkJcmV0dXJuIHRydWU7DQotCQkJCWVsc2UNCi0JCQkJCXJldHVybiBmYWxzZTsJDQotCQkJfQ0KLQkJCXB1YmxpYyBTdHJpbmcgZGVmaW5lSWRlbnRpZmllcihKYXJFbnRyeSBqYXJFbnRyeSkgew0KLQkJCQlTdHJpbmcgZW50cnkgPSBqYXJFbnRyeS5nZXROYW1lKCk7DQotCQkJCWlmIChlbnRyeS5zdGFydHNXaXRoKCJlY2xpcHNlLyIpKQ0KLQkJCQkJcmV0dXJuIGVudHJ5LnN1YnN0cmluZyg4KTsNCi0JCQkJZWxzZQ0KLQkJCQkJcmV0dXJuIGVudHJ5Ow0KLQkJCX0NCi0JCX07DQotCQkNCi0JCS8vIHVucGFjayBmZWF0dXJlIGVudHJ5IGZpbGVzDQotCQlGaWxlIHRtcERpciA9IGdldFdvcmtpbmdEaXJlY3RvcnkoKTsNCi0JCUNvbnRlbnRSZWZlcmVuY2VbXSByZWZzID0gYmFzZVJlZmVyZW5jZS51bnBhY2sodG1wRGlyLCBzZWxlY3RvciwgbW9uaXRvcik7DQotCQkNCi0JCS8vIHdyaXRlIG91dCBmZWF0dXJlIG1hbmlmZXN0IChmZWF0dXJlLnhtbCk7DQotCQlGaWxlIG1hbmlmZXN0ID0gVXRpbGl0aWVzLmNyZWF0ZUxvY2FsRmlsZSh0bXBEaXIsImZlYXR1cmUueG1sIik7DQotCQlDb250ZW50UmVmZXJlbmNlIG1hbmlmZXN0UmVmZXJlbmNlID0gbmV3IENvbnRlbnRSZWZlcmVuY2UoImZlYXR1cmUueG1sIiwgbWFuaWZlc3QpOw0KLQkJRGVmYXVsdE1vZGVsV3JpdGVyIHcgPSBuZXcgRGVmYXVsdE1vZGVsV3JpdGVyKGZlYXR1cmUpOw0KLQkJRmlsZU91dHB1dFN0cmVhbSBvcyA9IG51bGw7DQotCQl0cnkgew0KLQkJCW9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0obWFuaWZlc3QpOw0KLQkJCXcud3JpdGVGZWF0dXJlTWFuaWZlc3Qob3MpOw0KLQkJfSBmaW5hbGx5IHsNCi0JCQlpZiAob3MgIT0gbnVsbCkgdHJ5IHsgb3MuY2xvc2UoKTsgfSBjYXRjaChJT0V4Y2VwdGlvbiBlKSB7fQ0KLQkJfQ0KLQkJdGhpcy5nZW5lcmF0ZWRGZWF0dXJlTWFuaWZlc3QgPSBtYW5pZmVzdFJlZmVyZW5jZTsNCi0JCQ0KLQkJLy8gc2F2ZSByZWZlcmVuY2VzIChuZXdseS13cml0dGVuIGZlYXR1cmUueG1sIHBsdXMgcmVzdCBvZiBzZWxlY3RlZCBmZWF0dXJlIGZpbGVzKQ0KLQkJQ29udGVudFJlZmVyZW5jZVtdIGFsbFJlZnMgPSBuZXcgQ29udGVudFJlZmVyZW5jZVtyZWZzLmxlbmd0aCsxXTsNCi0JCWFsbFJlZnNbMF0gPSBtYW5pZmVzdFJlZmVyZW5jZTsNCi0JCVN5c3RlbS5hcnJheWNvcHkocmVmcywwLGFsbFJlZnMsMSxyZWZzLmxlbmd0aCk7DQotCQlmZWF0dXJlRW50cnlDb250ZW50UmVmZXJlbmNlcyA9IGFsbFJlZnM7DQotCX0NCi0JCQ0KLQlDb250ZW50UmVmZXJlbmNlW10gcGVla1BsdWdpbkVudHJ5Q29udGVudChJUGx1Z2luRW50cnkgcGx1Z2luLCBJbnN0YWxsTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLQkJDQotCQkvLyBkZWZpbmUgc2VsZWN0b3IgZm9yIHBsdWdpbiBlbnRyeSBmaWxlcw0KLQkJQ29udGVudFNlbGVjdG9yIHNlbGVjdG9yID0gbmV3IENvbnRlbnRTZWxlY3RvcigpIHsNCi0JCQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKEphckVudHJ5IGphckVudHJ5KSB7DQotCQkJCWlmIChqYXJFbnRyeS5pc0RpcmVjdG9yeSgpKQ0KLQkJCQkJcmV0dXJuIGZhbHNlOw0KLQkJCQlTdHJpbmcgZW50cnkgPSBqYXJFbnRyeS5nZXROYW1lKCk7DQotCQkJCVN0cmluZyBpZCA9IGN1cnJlbnRQbHVnaW5FbnRyeS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0SWRlbnRpZmllcigpOw0KLQkJCQlpZiAoaWQ9PW51bGwpDQotCQkJCQlyZXR1cm4gZmFsc2U7DQotCQkJCWVsc2UgaWYgKGVudHJ5LnN0YXJ0c1dpdGgoImVjbGlwc2UvcGx1Z2lucy8iK2lkKyIvIikpDQotCQkJCQlyZXR1cm4gdHJ1ZTsNCi0JCQkJZWxzZQ0KLQkJCQkJcmV0dXJuIGZhbHNlOwkNCi0JCQl9DQotCQkJcHVibGljIFN0cmluZyBkZWZpbmVJZGVudGlmaWVyKEphckVudHJ5IGphckVudHJ5KSB7DQotCQkJCVN0cmluZyBlbnRyeSA9IGphckVudHJ5LmdldE5hbWUoKTsNCi0JCQkJaW50IGl4ID0gZW50cnkuaW5kZXhPZigiLyIsMTYpOw0KLQkJCQlpZiAoaXggIT0gLTEpIHsNCi0JCQkJCXJldHVybiBlbnRyeS5zdWJzdHJpbmcoaXgrMSk7DQotCQkJCX0gZWxzZSB7DQotCQkJCQlyZXR1cm4gZW50cnk7DQotCQkJCX0NCi0JCQl9DQotCQl9Ow0KLQkJDQotCQkvLyB1bnBhY2sgcGx1Z2luIGVudHJ5IGZpbGVzDQotCQljdXJyZW50UGx1Z2luRW50cnkgPSBwbHVnaW47DQotCQlyZXR1cm4gYmFzZVJlZmVyZW5jZS5wZWVrKHNlbGVjdG9yLCBtb25pdG9yKTsNCi0JfQ0KLQkJDQotCUNvbnRlbnRSZWZlcmVuY2VbXSBwZWVrTm9uUGx1Z2luRW50cnlDb250ZW50KElOb25QbHVnaW5FbnRyeSBkYXRhLCBJbnN0YWxsTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLQkJDQotCQkvLyBkZWZpbmUgc2VsZWN0b3IgZm9yIG5vbiBwbHVnaW4gZW50cnkgZmlsZXMNCi0JCUNvbnRlbnRTZWxlY3RvciBzZWxlY3RvciA9IG5ldyBDb250ZW50U2VsZWN0b3IoKSB7DQotCQkJcHVibGljIGJvb2xlYW4gaW5jbHVkZShKYXJFbnRyeSBqYXJFbnRyeSkgew0KLQkJCQlpZiAoamFyRW50cnkuaXNEaXJlY3RvcnkoKSkNCi0JCQkJCXJldHVybiBmYWxzZTsNCi0JCQkJU3RyaW5nIGVudHJ5ID0gamFyRW50cnkuZ2V0TmFtZSgpOw0KLQkJCQlTdHJpbmcgaWQgPSBjdXJyZW50Tm9uUGx1Z2luRW50cnkuZ2V0SWRlbnRpZmllcigpOw0KLQkJCQlpZiAoIWlkLmVxdWFscygicm9vdCIpKQ0KLQkJCQkJcmV0dXJuIGZhbHNlOw0KLQkJCQllbHNlIGlmICghZW50cnkuc3RhcnRzV2l0aCgiZWNsaXBzZS9wbHVnaW5zLyIpKQ0KLQkJCQkJcmV0dXJuIHRydWU7DQotCQkJCWVsc2UNCi0JCQkJCXJldHVybiBmYWxzZTsJDQotCQkJfQ0KLQkJCXB1YmxpYyBTdHJpbmcgZGVmaW5lSWRlbnRpZmllcihKYXJFbnRyeSBqYXJFbnRyeSkgew0KLQkJCQlTdHJpbmcgZW50cnkgPSBqYXJFbnRyeS5nZXROYW1lKCk7DQotCQkJCWlmIChlbnRyeS5zdGFydHNXaXRoKCJlY2xpcHNlLyIpKQ0KLQkJCQkJcmV0dXJuIGVudHJ5LnN1YnN0cmluZyg4KTsNCi0JCQkJZWxzZQ0KLQkJCQkJcmV0dXJuIGVudHJ5Ow0KLQkJCX0NCi0JCX07DQotCQkNCi0JCS8vIHVucGFjayBub24gcGx1Z2luIGVudHJ5IGZpbGVzDQotCQljdXJyZW50Tm9uUGx1Z2luRW50cnkgPSBkYXRhOw0KLQkJcmV0dXJuIGJhc2VSZWZlcmVuY2UucGVlayhzZWxlY3RvciwgbW9uaXRvcik7DQotCX0NCi0JDQotCXByaXZhdGUgQ29yZUV4Y2VwdGlvbiBuZXdDb3JlRXhjZXB0aW9uKFN0cmluZyBzLCBUaHJvd2FibGUgZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQkJcmV0dXJuIG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwib3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzIiwwLHMsZSkpOw0KLQl9DQotCS8qDQotCSAqIEBzZWUgSUZlYXR1cmVDb250ZW50UHJvdmlkZXIjZ2V0VmVyaWZpZXIoKQ0KLQkgKi8NCi0JcHVibGljIElWZXJpZmllciBnZXRWZXJpZmllcigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9leGFtcGxlcy9idWlsZHppcC9CdWlsZFppcEZlYXR1cmVGYWN0b3J5LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvZXhhbXBsZXMvYnVpbGR6aXAvQnVpbGRaaXBGZWF0dXJlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjE1MGI3Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9leGFtcGxlcy9idWlsZHppcC9CdWlsZFppcEZlYXR1cmVGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy5idWlsZHppcDsNCi0NCi0vKg0KLSAqIChjKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDAsIDIwMDIuDQotICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCi0gKi8gDQotDQotaW1wb3J0IGphdmEubmV0LlVSTDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuQmFzZUZlYXR1cmVGYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5GZWF0dXJlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUZlYXR1cmVGYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JU2l0ZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuRmVhdHVyZU1vZGVsOw0KLQ0KLS8qKg0KLSAqIEFuIGV4YW1wbGUgZmVhdHVyZSBmYWN0b3J5IGJhc2VkIG9uIHRoZSBwYWNrYWdpbmcgDQotICogZm9ybWF0IHVzZWQgZm9yIGludGVncmF0aW9uIGFuZCBzdGFibGUgYnVpbGRzDQotICogcG9zdGVkIG9uIHRoZSBkb3dubG9hZHMgcGFnZXMgYXQgd3d3LmVjbGlwc2Uub3JnDQotICogPC9wPg0KLSAqIEBzaW5jZSAyLjANCi0gKi8NCi0NCi1wdWJsaWMgY2xhc3MgQnVpbGRaaXBGZWF0dXJlRmFjdG9yeQ0KLQlleHRlbmRzIEJhc2VGZWF0dXJlRmFjdG9yeQ0KLQlpbXBsZW1lbnRzIElGZWF0dXJlRmFjdG9yeSB7DQotDQotCS8qDQotCSAqIEBzZWUgSUZlYXR1cmVGYWN0b3J5I2NyZWF0ZUZlYXR1cmUoVVJMLCBJU2l0ZSwgSVByb2dyZXNzTW9uaXRvcikNCi0JICovDQotCXB1YmxpYyBJRmVhdHVyZSBjcmVhdGVGZWF0dXJlKFVSTCB1cmwsIElTaXRlIHNpdGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQkJdHJ5IHsNCi0JCQkvLyBjcmVhdGUgY29udGVudCBwcm92aWRlciBmb3IgZmVhdHVyZQ0KLQkJCUJ1aWxkWmlwRmVhdHVyZUNvbnRlbnRQcm92aWRlciBjcCA9IG5ldyBCdWlsZFppcEZlYXR1cmVDb250ZW50UHJvdmlkZXIodXJsKTsNCi0JCQlGZWF0dXJlIGZlYXR1cmUgPSBudWxsOw0KLQkJCQ0KLQkJCS8vIHBhcnNlIHRoZSBmZWF0dXJlDQotCQkJZmVhdHVyZSA9IChGZWF0dXJlKSBwYXJzZUZlYXR1cmUoY3ApOw0KLQkJCQ0KLQkJCS8vIGluaXRpYWxpemUgZmVhdHVyZQ0KLQkJCWZlYXR1cmUuc2V0RmVhdHVyZUNvbnRlbnRQcm92aWRlcihjcCk7DQotCQkJZmVhdHVyZS5zZXRTaXRlKHNpdGUpOw0KLQkJCWZlYXR1cmUucmVzb2x2ZShjcC5nZXRGZWF0dXJlQmFzZVVSTCgpLCBudWxsKTsgDQotCQkJZmVhdHVyZS5tYXJrUmVhZE9ubHkoKTsNCi0JCQlyZXR1cm4gZmVhdHVyZTsNCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCJvcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMuYnVpbGR6aXAiLDAsIlVuYWJsZSB0byBjcmVhdGUgZmVhdHVyZSIsZSkpOw0KLQkJfQ0KLQl9DQotDQotCS8qDQotCSAqIHBhcnNlIHRoZSBidWlsZCB6aXAgdG8gcmVjb25zdHJ1Y3QgYSBmZWF0dXJlIG1vZGVsDQotCSAqLw0KLQlwdWJsaWMgRmVhdHVyZU1vZGVsIHBhcnNlRmVhdHVyZShCdWlsZFppcEZlYXR1cmVDb250ZW50UHJvdmlkZXIgY3ApIHRocm93cyBFeGNlcHRpb24gew0KLQkJcmV0dXJuIChuZXcgQnVpbGRaaXBGZWF0dXJlUGFyc2VyKHRoaXMpKS5wYXJzZShjcCk7DQotCX0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2V4YW1wbGVzL2J1aWxkemlwL0J1aWxkWmlwRmVhdHVyZVBhcnNlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2V4YW1wbGVzL2J1aWxkemlwL0J1aWxkWmlwRmVhdHVyZVBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzQ4ZGVkLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9leGFtcGxlcy9idWlsZHppcC9CdWlsZFppcEZlYXR1cmVQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy5idWlsZHppcDsNCi0NCi0vKg0KLSAqIChjKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDAsIDIwMDIuDQotICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCi0gKi8gDQotIA0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLm5ldC5VUkxEZWNvZGVyOw0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247DQotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOw0KLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luVmVyc2lvbklkZW50aWZpZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLkNvbnRlbnRSZWZlcmVuY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLkZlYXR1cmVNb2RlbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuUGx1Z2luRW50cnlNb2RlbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuVVJMRW50cnlNb2RlbDsNCi0NCi0vKioNCi0gKiBBbiBleGFtcGxlIGZlYXR1cmUgcGFyc2VyLiBJdCBoYW5kbGVzIGZlYXR1cmVzIHBhY2thZ2VkIGFzDQotICogYnVpbGQgemlwJ3MgdXNpbmcgdGhlIGZvcm1hdCB1c2VkIGZvciBpbnRlZ3JhdGlvbiBhbmQgc3RhYmxlIGJ1aWxkcw0KLSAqIHBvc3RlZCBvbiB0aGUgZG93bmxvYWRzIHBhZ2VzIGF0IHd3dy5lY2xpcHNlLm9yZw0KLSAqIDwvcD4NCi0gKiBAc2luY2UgMi4wDQotICovDQotDQotcHVibGljIGNsYXNzIEJ1aWxkWmlwRmVhdHVyZVBhcnNlciB7CQ0KLQkNCi0JcHJpdmF0ZSBCdWlsZFppcEZlYXR1cmVGYWN0b3J5IGZhY3Rvcnk7DQotCXByaXZhdGUgQnVpbGRaaXBQbHVnaW5QYXJzZXIgcGx1Z2luUGFyc2VyOw0KLQkNCi0JcHVibGljIEJ1aWxkWmlwRmVhdHVyZVBhcnNlcihCdWlsZFppcEZlYXR1cmVGYWN0b3J5IGZhY3RvcnkpIHsNCi0JCXRoaXMuZmFjdG9yeSA9IGZhY3Rvcnk7DQotCX0NCi0JDQotCXB1YmxpYyBGZWF0dXJlTW9kZWwgcGFyc2UoQnVpbGRaaXBGZWF0dXJlQ29udGVudFByb3ZpZGVyIGNwKSB0aHJvd3MgRXhjZXB0aW9uIHsJCQkJDQotCQlyZXR1cm4gcGFyc2VGZWF0dXJlKGNwKTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBGZWF0dXJlTW9kZWwgcGFyc2VGZWF0dXJlKEJ1aWxkWmlwRmVhdHVyZUNvbnRlbnRQcm92aWRlciBjcCkgdGhyb3dzIEV4Y2VwdGlvbiB7CQkNCi0JCQ0KLQkJLy8gZ2V0IHJlZmVyZW5jZSB0byB0aGUgYnVpbGQgbWFuaWZlc3QNCi0JCUNvbnRlbnRSZWZlcmVuY2UgbWFuaWZlc3RSZWYgPSBjcC5nZXRGZWF0dXJlQnVpbGRNYW5pZmVzdCgpOw0KLQkJSW5wdXRTdHJlYW0gaXMgPSBtYW5pZmVzdFJlZi5nZXRJbnB1dFN0cmVhbSgpOwkJDQotCQkNCi0JCS8vIGxvYWQgYnVpbGRtYW5pZmVzdC5wcm9wZXJ0aWVzDQotCQlQcm9wZXJ0aWVzIG1hbmlmZXN0ID0gbmV3IFByb3BlcnRpZXMoKTsNCi0JCXRyeSB7DQotCQkJbWFuaWZlc3QubG9hZChpcyk7DQotCQl9IGZpbmFsbHkgew0KLQkJCWlmIChpcyE9bnVsbCkgdHJ5IHsgaXMuY2xvc2UoKTsgfSBjYXRjaChJT0V4Y2VwdGlvbiBlKSB7fQ0KLQkJfQ0KLQkJDQotCQkvLyBwb3B1bGF0ZSBmZWF0dXJlIG1vZGVsDQotCQlGZWF0dXJlTW9kZWwgZmVhdHVyZSA9IGZhY3RvcnkuY3JlYXRlRmVhdHVyZU1vZGVsKCk7DQotCQlwYXJzZUZlYXR1cmVFbnRyeShjcCwgZmVhdHVyZSwgbWFuaWZlc3QpOw0KLQkJDQotCQkvLyBwYXJzZSBwbHVnaW4gZW50cmllcw0KLQkJcGFyc2VQbHVnaW5FbnRyaWVzKGNwLCBmZWF0dXJlLCBtYW5pZmVzdCk7IA0KLQkJDQotCQkvLyBwYXJzZSBub24tcGx1Z2luIGVudHJpZXMNCi0JCXBhcnNlTm9uUGx1Z2luRW50cmllcyhjcCwgZmVhdHVyZSwgbWFuaWZlc3QpOw0KLQkJDQotCQkvLyB1bnBhY2sgZmVhdHVyZSBlbnRyeSBjb250ZW50DQotCQljcC51bnBhY2tGZWF0dXJlRW50cnlDb250ZW50KGZlYXR1cmUsIG51bGwvKklQcm9ncmVzc01vbml0b3IqLyk7DQotCQkNCi0JCXJldHVybiBmZWF0dXJlOw0KLQl9DQotCQ0KLQlwcml2YXRlIHZvaWQgcGFyc2VGZWF0dXJlRW50cnkoQnVpbGRaaXBGZWF0dXJlQ29udGVudFByb3ZpZGVyIGNwLCBGZWF0dXJlTW9kZWwgZmVhdHVyZSwgUHJvcGVydGllcyBtYW5pZmVzdCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotCQkNCi0JCS8vIHBhcnNlIG91dCBidWlsZCB6aXAgZmlsZSBuYW1lLiBJdCBpcyBhc3N1bWVkIHRvIGJlIGluIHRoZQ0KLQkJLy8gZm9ybSA8cGFja2FnZSBpZGVudGlmaWVyPi08YnVpbGQgZGF0ZT4tPHRhcmdldCBwbGF0Zm9ybT4uemlwLA0KLQkJLy8gd2hlcmUNCi0JCS8vCQk8cGFja2FnZSBpZGVudGlmaWVyPiBpcyBoeXBoZW4gKC0pIHNlcGFyYXRlcmQgdG9rZW4gbGlzdA0KLQkJLy8JCTxidWlsZCBkYXRlPiBpcyBzaW5nbGUgYWxsLW51bWVyaWMgdG9rZW4NCi0JCS8vCQk8dGFyZ2V0IHBsYXRmb3JtPiBpcyBoeXBoZW4gKC0pIHNlcGFyYXRlcmQgdG9rZW4gbGlzdA0KLQkJDQotCQlTdHJpbmcgcGtnSWQgPSAiIjsNCi0JCVN0cmluZyB0YXJnZXQgPSAiIjsNCi0JCVN0cmluZyBidWlsZCA9ICIiOw0KLQkJU3RyaW5nIHN0YXRlID0gIklEIjsNCi0JCWJvb2xlYW4gZmlyc3RUb2tlbiA9IHRydWU7DQotCQlTdHJpbmcgemlwTmFtZSA9IFVSTERlY29kZXIuZGVjb2RlKGNwLmdldFVSTCgpLmdldEZpbGUoKSk7DQotCQlpbnQgaXggPSB6aXBOYW1lLmxhc3RJbmRleE9mKCIvIik7DQotCQlpZiAoaXggIT0gLTEpDQotCQkJemlwTmFtZSA9IHppcE5hbWUuc3Vic3RyaW5nKGl4KzEpOw0KLQkJaWYgKHppcE5hbWUuZW5kc1dpdGgoIi56aXAiKSkgew0KLQkJCXppcE5hbWUgPSB6aXBOYW1lLnN1YnN0cmluZygwLHppcE5hbWUubGVuZ3RoKCktNCk7DQotCQl9DQotCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcih6aXBOYW1lLCItIixmYWxzZSk7DQotCQlTdHJpbmcgdG9rZW47DQotCQl3aGlsZSh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7DQotCQkJdG9rZW4gPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7DQotCQkJdHJ5IHsNCi0JCQkJTG9uZy5wYXJzZUxvbmcodG9rZW4pOw0KLQkJCQlzdGF0ZSA9ICJUQVJHRVQiOw0KLQkJCQl0YXJnZXQgPSAiIjsNCi0JCQkJZmlyc3RUb2tlbiA9IHRydWU7DQotCQkJCWJ1aWxkID0gdG9rZW4rIi4wLjAiOw0KLQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7DQotCQkJCWlmIChzdGF0ZS5lcXVhbHMoIklEIikpIHsNCi0JCQkJCXBrZ0lkICs9IChmaXJzdFRva2VuID8gIiIgOiAiICIpICsgdG9rZW47DQotCQkJCX0gZWxzZSB7DQotCQkJCQl0YXJnZXQgKz0gKGZpcnN0VG9rZW4gPyAiIiA6ICIgIikgKyB0b2tlbjsNCi0JCQkJfQ0KLQkJCQlmaXJzdFRva2VuID0gZmFsc2U7DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQkvLyBnZW5lcmF0ZSBiYXNlIGZlYXR1cmUgYXR0cmlidXRlcw0KLQkJZmVhdHVyZS5zZXRGZWF0dXJlSWRlbnRpZmllcihwa2dJZC5yZXBsYWNlKCcgJywnLicpKTsNCi0JCWZlYXR1cmUuc2V0RmVhdHVyZVZlcnNpb24oYnVpbGQpOw0KLQkJZmVhdHVyZS5zZXRMYWJlbChwa2dJZC5zdWJzdHJpbmcoMCwxKS50b1VwcGVyQ2FzZSgpICsgcGtnSWQuc3Vic3RyaW5nKDEpICsgIiBmb3IgIiArIHRhcmdldCk7DQotCQlmZWF0dXJlLnNldFByb3ZpZGVyKCJ3d3cuZWNsaXBzZS5vcmciKTsNCi0JCWZlYXR1cmUuc2V0SW1hZ2VVUkxTdHJpbmcoInNwbGFzaC9zcGxhc2hfZnVsbC5ibXAiKTsNCi0JCWZlYXR1cmUuc2V0T1ModGFyZ2V0LnJlcGxhY2UoJyAnLCctJykpOwkNCi0JCQ0KLQkJLy8gYWRkIGRlc2NyaXB0aW9uDQotCQlVUkxFbnRyeU1vZGVsIGRlc2NyaXB0aW9uID0gZmFjdG9yeS5jcmVhdGVVUkxFbnRyeU1vZGVsKCk7DQotCQlkZXNjcmlwdGlvbi5zZXRVUkxTdHJpbmcoInJlYWRtZS9yZWFkbWUuaHRtbCIpOw0KLQkJZGVzY3JpcHRpb24uc2V0QW5ub3RhdGlvbigieCIpOw0KLQkJZmVhdHVyZS5zZXREZXNjcmlwdGlvbk1vZGVsKGRlc2NyaXB0aW9uKTsNCi0JCQ0KLQkJLy8gYWRkIGxpY2Vuc2UNCi0JCVVSTEVudHJ5TW9kZWwgbGljZW5zZSA9IGZhY3RvcnkuY3JlYXRlVVJMRW50cnlNb2RlbCgpOw0KLQkJbGljZW5zZS5zZXRVUkxTdHJpbmcoImFib3V0Lmh0bWwiKTsNCi0JCWxpY2Vuc2Uuc2V0QW5ub3RhdGlvbigiWW91IG11c3QgdmlldyB0aGUgZnVsbCBsaWNlbnNlIGJ5IGZvbGxvd2luZyB0aGUgXCJMaWNlbnNlXCIgbGluayBpbiB0aGUgZmVhdHVyZSBwcmV2aWV3LlxuU2VsZWN0aW5nIFwiQWNjZXB0XCIgaW5kaWNhdGVzIHRoYXQgeW91IGhhdmUgdmlld2VkIGFuZCBhY2NlcHRlZCB0aGUgZmVhdHVyZSBsaWNlbnNlLiIpOw0KLQkJZmVhdHVyZS5zZXRMaWNlbnNlTW9kZWwobGljZW5zZSk7DQotCQkNCi0JCS8vIGFkZCBjb3B5cmlnaHQNCi0JCVVSTEVudHJ5TW9kZWwgY29weXJpZ2h0ID0gZmFjdG9yeS5jcmVhdGVVUkxFbnRyeU1vZGVsKCk7DQotCQljb3B5cmlnaHQuc2V0VVJMU3RyaW5nKCJub3RpY2UuaHRtbCIpOw0KLQkJY29weXJpZ2h0LnNldEFubm90YXRpb24oIngiKTsNCi0JCWZlYXR1cmUuc2V0Q29weXJpZ2h0TW9kZWwoY29weXJpZ2h0KTsNCi0JfQkNCi0JDQotCXByaXZhdGUgdm9pZCBwYXJzZVBsdWdpbkVudHJpZXMoQnVpbGRaaXBGZWF0dXJlQ29udGVudFByb3ZpZGVyIGNwLCBGZWF0dXJlTW9kZWwgZmVhdHVyZSwgUHJvcGVydGllcyBtYW5pZmVzdCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotCQkNCi0JCUVudW1lcmF0aW9uIGVudHJpZXMgPSBtYW5pZmVzdC5rZXlzKCk7DQotCQlTdHJpbmcgcGx1Z2luOw0KLQkJU3RyaW5nIHBsdWdpbklkOw0KLQkJU3RyaW5nIHBsdWdpblZlcnNpb247DQotCQlTdHJpbmcgcGx1Z2luQnVpbGRWZXJzaW9uOw0KLQkJUGx1Z2luRW50cnlNb2RlbCBwbHVnaW5FbnRyeTsNCi0JCXdoaWxlKGVudHJpZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsNCi0JCQlwbHVnaW4gPSAoU3RyaW5nKSBlbnRyaWVzLm5leHRFbGVtZW50KCk7DQotCQkJaWYgKHBsdWdpbi5zdGFydHNXaXRoKCJwbHVnaW5AIikpIHsNCi0JCQkJcGx1Z2luSWQgPSBwbHVnaW4uc3Vic3RyaW5nKDcpOw0KLQkJCQlwbHVnaW5CdWlsZFZlcnNpb24gPSBtYW5pZmVzdC5nZXRQcm9wZXJ0eShwbHVnaW4pOw0KLQkJCQlpZiAocGx1Z2luQnVpbGRWZXJzaW9uLmVxdWFscygiSEVBRCIpKSB7DQotCQkJCQlTdHJpbmcgZmVhdHVyZVZlcnNpb24gPSBmZWF0dXJlLmdldEZlYXR1cmVWZXJzaW9uKCk7DQotCQkJCQlpbnQgaXggPSBmZWF0dXJlVmVyc2lvbi5pbmRleE9mKCIuIik7DQotCQkJCQlTdHJpbmcgZmVhdHVyZU1ham9yID0gaXg9PS0xID8gZmVhdHVyZVZlcnNpb24gOiBmZWF0dXJlVmVyc2lvbi5zdWJzdHJpbmcoMCxpeCk7DQotCQkJCQlwbHVnaW5CdWlsZFZlcnNpb24gKz0gIi0iICsgZmVhdHVyZU1ham9yOw0KLQkJCQl9DQotCQkJCXBsdWdpbkVudHJ5ID0gZmFjdG9yeS5jcmVhdGVQbHVnaW5FbnRyeU1vZGVsKCk7DQotCQkJCXBsdWdpblZlcnNpb24gPSBwYXJzZVBsdWdpblZlcnNpb25Jbk1hbmlmZXN0KGNwLCBwbHVnaW5JZCwgcGx1Z2luRW50cnkpOw0KLQkJCQlpZiAocGx1Z2luVmVyc2lvbiAhPSBudWxsKSB7DQotCQkJCQlwbHVnaW5FbnRyeS5zZXRQbHVnaW5JZGVudGlmaWVyKHBsdWdpbklkKTsNCi0JCQkJCXBsdWdpbkVudHJ5LnNldFBsdWdpblZlcnNpb24oKG5ldyBQbHVnaW5WZXJzaW9uSWRlbnRpZmllcihwbHVnaW5WZXJzaW9uKSkudG9TdHJpbmcoKSsiLiIrcGx1Z2luQnVpbGRWZXJzaW9uKTsNCi0JCQkJCWZlYXR1cmUuYWRkUGx1Z2luRW50cnlNb2RlbChwbHVnaW5FbnRyeSk7DQotCQkJCX0NCi0JCQl9DQotCQl9CQkNCi0JfQ0KLQkNCi0JcHJpdmF0ZSB2b2lkIHBhcnNlTm9uUGx1Z2luRW50cmllcyhCdWlsZFppcEZlYXR1cmVDb250ZW50UHJvdmlkZXIgY3AsIEZlYXR1cmVNb2RlbCBmZWF0dXJlLCBQcm9wZXJ0aWVzIG1hbmlmZXN0KSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0JLy8JTm9uUGx1Z2luRW50cnlNb2RlbCBub25QbHVnaW5FbnRyeSA9IGZhY3RvcnkuY3JlYXRlTm9uUGx1Z2luRW50cnlNb2RlbCgpOw0KLQkvLwlub25QbHVnaW5FbnRyeS5zZXRJZGVudGlmaWVyKCJyb290Iik7DQotCS8vCWZlYXR1cmUuYWRkTm9uUGx1Z2luRW50cnlNb2RlbChub25QbHVnaW5FbnRyeSk7DQotCX0NCi0JDQotCXByaXZhdGUgU3RyaW5nIHBhcnNlUGx1Z2luVmVyc2lvbkluTWFuaWZlc3QoQnVpbGRaaXBGZWF0dXJlQ29udGVudFByb3ZpZGVyIGNwLCBTdHJpbmcgcGx1Z2luSWQsIFBsdWdpbkVudHJ5TW9kZWwgcGx1Z2luRW50cnkpIHsNCi0NCi0JCWlmIChwbHVnaW5QYXJzZXIgPT0gbnVsbCkNCi0JCQlwbHVnaW5QYXJzZXIgPSBuZXcgQnVpbGRaaXBQbHVnaW5QYXJzZXIoKTsNCi0JCQkJDQotCQlJbnB1dFN0cmVhbSBpcyA9IG51bGw7CQkJCQ0KLQkJQ29udGVudFJlZmVyZW5jZSBwbHVnaW5NYW5pZmVzdDsNCi0JCXRyeSB7DQotCQkJLy8gdHJ5IHBsdWdpbi54bWwNCi0JCQlwbHVnaW5NYW5pZmVzdCAgPSBjcC5nZXRQbHVnaW5NYW5pZmVzdChwbHVnaW5JZCwgZmFsc2UpOw0KLQkJCWlzID0gcGx1Z2luTWFuaWZlc3QuZ2V0SW5wdXRTdHJlYW0oKTsNCi0JCQlyZXR1cm4gcGx1Z2luUGFyc2VyLnBhcnNlKGlzKTsNCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotCQkJdHJ5IHsNCi0JCQkJLy8gcmV0cnkgd2l0aCBmZWF0dXJlLnhtbA0KLQkJCQlwbHVnaW5NYW5pZmVzdCAgPSBjcC5nZXRQbHVnaW5NYW5pZmVzdChwbHVnaW5JZCwgdHJ1ZSk7DQotCQkJCWlzID0gcGx1Z2luTWFuaWZlc3QuZ2V0SW5wdXRTdHJlYW0oKTsNCi0JCQkJU3RyaW5nIHJlc3VsdCA9IHBsdWdpblBhcnNlci5wYXJzZShpcyk7DQotCQkJCXBsdWdpbkVudHJ5LmlzRnJhZ21lbnQodHJ1ZSk7DQotCQkJCXJldHVybiByZXN1bHQ7DQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUyKSB7DQotCQkJCXJldHVybiBudWxsOw0KLQkJCX0NCi0JCX0gZmluYWxseSB7DQotCQkJaWYgKGlzICE9IG51bGwpIHRyeSB7IGlzLmNsb3NlKCk7IH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHt9DQotCQl9DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2V4YW1wbGVzL2J1aWxkemlwL0J1aWxkWmlwUGx1Z2luUGFyc2VyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvZXhhbXBsZXMvYnVpbGR6aXAvQnVpbGRaaXBQbHVnaW5QYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTBlMWQxZi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvZXhhbXBsZXMvYnVpbGR6aXAvQnVpbGRaaXBQbHVnaW5QYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzLmJ1aWxkemlwOw0KLQ0KLS8qDQotICogKGMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMCwgMjAwMi4NCi0gKiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KLSAqLw0KLQ0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy5wYXJzZXJzLlNBWFBhcnNlcjsNCi1pbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsNCi1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7DQotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlcjsNCi0NCi0vKioNCi0gKiBQYXJzZSBkZWZhdWx0IGZlYXR1cmUueG1sDQotICovDQotDQotcHVibGljIGNsYXNzIEJ1aWxkWmlwUGx1Z2luUGFyc2VyIGV4dGVuZHMgRGVmYXVsdEhhbmRsZXIgew0KLQ0KLQlwcml2YXRlIFNBWFBhcnNlciBwYXJzZXI7DQotCXByaXZhdGUgU3RyaW5nIHZlcnNpb247DQotCQ0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOID0gInBsdWdpbiI7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGUkFHTUVOVCA9ICJmcmFnbWVudCI7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJpZCI7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OID0gInZlcnNpb24iOwkNCi0JDQotCXByaXZhdGUgY2xhc3MgUGFyc2VDb21wbGV0ZUV4Y2VwdGlvbiBleHRlbmRzIFNBWEV4Y2VwdGlvbiB7DQotCQlwdWJsaWMgUGFyc2VDb21wbGV0ZUV4Y2VwdGlvbihTdHJpbmcgYXJnMCkgew0KLQkJCXN1cGVyKGFyZzApOw0KLQkJfQ0KLQl9DQotDQotCS8qKg0KLQkgKiBDb25zdHJ1Y3RvciBmb3IgRGVmYXVsdEZlYXR1cmVQYXJzZXINCi0JICovDQotCXB1YmxpYyBCdWlsZFppcFBsdWdpblBhcnNlcigpIHsNCi0JCXN1cGVyKCk7DQotCQl0aGlzLnBhcnNlciA9IG5ldyBTQVhQYXJzZXIoKTsNCi0JCXRoaXMucGFyc2VyLnNldENvbnRlbnRIYW5kbGVyKHRoaXMpOw0KLQl9DQotCQ0KLQkvKioNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmcgcGFyc2UoSW5wdXRTdHJlYW0gaW4pIHRocm93cyBTQVhFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsNCi0JCXRyeSB7DQotCQkJdmVyc2lvbiA9IG51bGw7DQotCQkJcGFyc2VyLnBhcnNlKG5ldyBJbnB1dFNvdXJjZShpbikpOw0KLQkJfSBjYXRjaChQYXJzZUNvbXBsZXRlRXhjZXB0aW9uIGUpIHsNCi0JCX0NCi0JCXJldHVybiB2ZXJzaW9uOw0KLQl9DQotCQ0KLQkvKioNCi0JICogQHNlZSBEZWZhdWx0SGFuZGxlciNzdGFydEVsZW1lbnQoU3RyaW5nLCBTdHJpbmcsIFN0cmluZywgQXR0cmlidXRlcykNCi0JICovDQotCXB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lLFN0cmluZyBxTmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsNCi0JCQ0KLQkJU3RyaW5nIHRhZyA9IGxvY2FsTmFtZS50cmltKCk7DQotCQ0KLQkJaWYgKHRhZy5lcXVhbHNJZ25vcmVDYXNlKFBMVUdJTikpIHsNCi0JCQlwcm9jZXNzUGx1Z2luKGF0dHJpYnV0ZXMpOw0KLQkJCXJldHVybjsNCi0JCX0NCi0JDQotCQlpZiAodGFnLmVxdWFsc0lnbm9yZUNhc2UoRlJBR01FTlQpKSB7DQotCQkJcHJvY2Vzc1BsdWdpbihhdHRyaWJ1dGVzKTsNCi0JCQlyZXR1cm47DQotCQl9DQotCX0NCi0JDQotCS8qKiANCi0JICogcHJvY2VzcyBwbHVnaW4gZW50cnkgaW5mbw0KLQkgKi8NCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NQbHVnaW4oQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB0aHJvd3MgUGFyc2VDb21wbGV0ZUV4Y2VwdGlvbiB7DQotCQl2ZXJzaW9uID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgidmVyc2lvbiIpOw0KLQkJdGhyb3cgbmV3IFBhcnNlQ29tcGxldGVFeGNlcHRpb24oIiIpOw0KLQl9DQotfQ0KLQ0KLQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9leGFtcGxlcy9idWlsZHppcC9CdWlsZFppcFNpdGVDb250ZW50UHJvdmlkZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9leGFtcGxlcy9idWlsZHppcC9CdWlsZFppcFNpdGVDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVlYzAzMi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvZXhhbXBsZXMvYnVpbGR6aXAvQnVpbGRaaXBTaXRlQ29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy5idWlsZHppcDsNCi0NCi0vKg0KLSAqIChjKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDAsIDIwMDIuDQotICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCi0gKi8NCi0NCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuU2l0ZUNvbnRlbnRQcm92aWRlcjsNCi0NCi1wdWJsaWMgY2xhc3MgQnVpbGRaaXBTaXRlQ29udGVudFByb3ZpZGVyIGV4dGVuZHMgU2l0ZUNvbnRlbnRQcm92aWRlciB7DQotDQotCS8qKg0KLQkgKiBDb25zdHJ1Y3RvciBmb3IgU2l0ZUNvbnRlbnRQcm92aWRlci4NCi0JICovDQotCXB1YmxpYyBCdWlsZFppcFNpdGVDb250ZW50UHJvdmlkZXIoVVJMIHVybCkgew0KLQkJc3VwZXIodXJsKTsNCi0JfQ0KLQkNCi0JLyoNCi0JICogQHNlZSBJU2l0ZUNvbnRlbnRQcm92aWRlciNnZXRBcmNoaXZlUmVmZXJlbmNlKFN0cmluZykNCi0JICovDQotCXB1YmxpYyBVUkwgZ2V0QXJjaGl2ZVJlZmVyZW5jZShTdHJpbmcgaWQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JCS8vIGJ1aWxkIHppcCBmZWF0dXJlcyBkbyBub3QgaGF2ZSBhc3NvY2lhdGVkIGFyY2hpdmVzDQotCQkvLyB0aGUgemlwIGZpbGUgYWxzbyBjb250YWlucyB0aGUgYXJjaGl2ZXMgZmlsZXMNCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9leGFtcGxlcy9idWlsZHppcC9CdWlsZFppcFNpdGVGYWN0b3J5LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvZXhhbXBsZXMvYnVpbGR6aXAvQnVpbGRaaXBTaXRlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjkxOTZiLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9leGFtcGxlcy9idWlsZHppcC9CdWlsZFppcFNpdGVGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy5idWlsZHppcDsNCi0NCi0vKg0KLSAqIChjKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDAsIDIwMDIuDQotICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCi0gKi8NCi0NCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLWltcG9ydCBqYXZhLmlvLkZpbGVGaWx0ZXI7DQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLWltcG9ydCBqYXZhLm5ldC5VUkxEZWNvZGVyOw0KLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5Ow0KLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEZpbGU7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5CYXNlU2l0ZUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklTaXRlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5TaXRlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC5JbnZhbGlkU2l0ZVR5cGVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLkNhdGVnb3J5TW9kZWw7DQotDQotcHVibGljIGNsYXNzIEJ1aWxkWmlwU2l0ZUZhY3RvcnkgZXh0ZW5kcyBCYXNlU2l0ZUZhY3Rvcnkgew0KLQ0KLQkvKg0KLQkgKiBAc2VlIElTaXRlRmFjdG9yeSNjcmVhdGVTaXRlKFVSTCkNCi0JICovDQotCXB1YmxpYyBJU2l0ZSBjcmVhdGVTaXRlKFVSTCB1cmwpIHRocm93cyBDb3JlRXhjZXB0aW9uLEludmFsaWRTaXRlVHlwZUV4Y2VwdGlvbiB7DQotDQotCQlTaXRlIHNpdGUgPSBudWxsOw0KLQ0KLQkJLy8gY3JlYXRlIHNpdGUgYW5kIGFkZCBjYXRlZ29yeQ0KLQkJc2l0ZSA9IChTaXRlKSBjcmVhdGVTaXRlTWFwTW9kZWwoKTsNCi0JCUNhdGVnb3J5TW9kZWwgY2F0ZWdvcnkgPSBjcmVhdGVTaXRlQ2F0ZWdvcnlNb2RlbCgpOw0KLQkJY2F0ZWdvcnkuc2V0TmFtZSgiZWNsaXBzZS1idWlsZHMiKTsNCi0JCWNhdGVnb3J5LnNldExhYmVsKCJFY2xpcHNlIEJ1aWxkcyIpOw0KLQkJc2l0ZS5hZGRDYXRlZ29yeU1vZGVsKGNhdGVnb3J5KTsNCi0NCi0JCS8vIHNldCBjb250ZW50IHByb3ZpZGVyDQotCQlCdWlsZFppcFNpdGVDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyID0gbmV3IEJ1aWxkWmlwU2l0ZUNvbnRlbnRQcm92aWRlcih1cmwpOw0KLQkJc2l0ZS5zZXRTaXRlQ29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7DQotDQotCQkvLyBnZXQgYWxsIG1hdGNoaW5nIHppcCBmaWxlcyBvbiB0aGUgc2l0ZQ0KLQkJRmlsZUZpbHRlciBmaWx0ZXIgPSBuZXcgRmlsZUZpbHRlcigpIHsNCi0JCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBmaWxlKSB7DQotCQkJCWlmIChmaWxlLmdldE5hbWUoKS5lbmRzV2l0aCgiLnppcCIpKSB7DQotCQkJCQl0cnkgew0KLQkJCQkJCVppcEZpbGUgemlwID0gbmV3IFppcEZpbGUoZmlsZSk7DQotCQkJCQkJWmlwRW50cnkgZW50cnkgPSB6aXAuZ2V0RW50cnkoImVjbGlwc2UvYnVpbGRtYW5pZmVzdC5wcm9wZXJ0aWVzIik7DQotCQkJCQkJaWYgKGVudHJ5ID09IG51bGwpDQotCQkJCQkJCXJldHVybiBmYWxzZTsNCi0JCQkJCQllbHNlDQotCQkJCQkJCXJldHVybiB0cnVlOw0KLQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KLQkJCQkJCXJldHVybiBmYWxzZTsNCi0JCQkJCX0NCi0JCQkJfSBlbHNlDQotCQkJCQlyZXR1cm4gZmFsc2U7DQotCQkJfQ0KLQkJfTsNCi0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKFVSTERlY29kZXIuZGVjb2RlKHVybC5nZXRGaWxlKCkpKTsNCi0JCUZpbGVbXSB6aXBzID0gZmlsZS5saXN0RmlsZXMoZmlsdGVyKTsNCi0NCi0JCS8vIGNyZWF0ZSBhIHJlZmVyZW5jZSBmb3IgZWFjaCBtYXRjaGluZyB6aXANCi0JCVNpdGVGZWF0dXJlUmVmZXJlbmNlTW9kZWwgcmVmID0gbnVsbDsNCi0JCWZvciAoaW50IGkgPSAwOyB6aXBzICE9IG51bGwgJiYgaSA8IHppcHMubGVuZ3RoOyBpKyspIHsNCi0JCQlyZWYgPSBjcmVhdGVGZWF0dXJlUmVmZXJlbmNlTW9kZWwoKTsNCi0JCQlyZWYuc2V0VHlwZSgib3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzLnppcCIpOw0KLQkJCXJlZi5zZXRTaXRlTW9kZWwoc2l0ZSk7DQotCQkJcmVmLnNldFVSTFN0cmluZygiZmlsZToiICsgemlwc1tpXS5nZXRBYnNvbHV0ZVBhdGgoKSk7DQotCQkJcmVmLnNldENhdGVnb3J5TmFtZXMobmV3IFN0cmluZ1tdIHsgImVjbGlwc2UtYnVpbGRzIiB9KTsNCi0JCQlzaXRlLmFkZEZlYXR1cmVSZWZlcmVuY2VNb2RlbChyZWYpOw0KLQkJfQ0KLQkJdHJ5IHsNCi0JCQlzaXRlLnJlc29sdmUodXJsLCBudWxsKTsgLy8gcmVzb2x2ZSBhbnkgVVJMcyByZWxhdGl2ZSB0byB0aGUgc2l0ZQ0KLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpew0KLQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKCIiLGUpOw0KLQkJfQ0KLQ0KLQkJcmV0dXJuIHNpdGU7DQotCX0NCi0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2V4YW1wbGVzL2J1aWxkemlwL0RlZmF1bHRNb2RlbFdyaXRlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2V4YW1wbGVzL2J1aWxkemlwL0RlZmF1bHRNb2RlbFdyaXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2E4YmM0Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9leGFtcGxlcy9idWlsZHppcC9EZWZhdWx0TW9kZWxXcml0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyOCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy5idWlsZHppcDsKLQotLyoKLSAqIChjKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDAsIDIwMDIuCi0gKiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICovIAotIAotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC4qOwotCi0vKioKLSAqIFdyaXRlIHN0YW5kYXJkIGZlYXR1cmUgbWFuaWZlc3QgKGZlYXR1cmUueG1sKSBmcm9tIG1vZGVsLgotICogPC9wPgotICogQHNpbmNlIDIuMAotICovCi0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0TW9kZWxXcml0ZXIgewotCQotCXByaXZhdGUgRmVhdHVyZU1vZGVsIGZlYXR1cmU7Ci0JCi0JLyoqCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBEZWZhdWx0TW9kZWxXcml0ZXIoRmVhdHVyZU1vZGVsIGZlYXR1cmUpIHsKLQkJdGhpcy5mZWF0dXJlID0gZmVhdHVyZTsKLQl9Ci0JCi0JLyoqCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyB2b2lkIHdyaXRlRmVhdHVyZU1hbmlmZXN0KE91dHB1dFN0cmVhbSBvcykgewotCQlQcmludFdyaXRlciB3ID0gbmV3IFByaW50V3JpdGVyKG9zKTsKLQkJd3JpdGVGZWF0dXJlKHcsMCxmZWF0dXJlKTsKLQkJdy5mbHVzaCgpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgd3JpdGVGZWF0dXJlKFByaW50V3JpdGVyIHcsIGludCBsZXZlbCwgRmVhdHVyZU1vZGVsIGZlYXR1cmUpIHsKLQkJaWYgKGZlYXR1cmUgPT0gbnVsbCkgcmV0dXJuOwotCQkKLQkJU3RyaW5nIGluID0gZ2V0SW5kZW50KGxldmVsKTsKLQkJdy5wcmludGxuKGluKyI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz4iKTsKLQkJCi0JCXcucHJpbnRsbihpbisiPGZlYXR1cmUiKTsKLQkJaWYgKGZlYXR1cmUuZ2V0RmVhdHVyZUlkZW50aWZpZXIoKSE9bnVsbCkKLQkJCXcucHJpbnRsbihpbisiICAgIisiaWQ9XCIiK2ZlYXR1cmUuZ2V0RmVhdHVyZUlkZW50aWZpZXIoKSsiXCIiKTsKLQkJaWYgKGZlYXR1cmUuZ2V0RmVhdHVyZVZlcnNpb24oKSE9bnVsbCkKLQkJCXcucHJpbnRsbihpbisiICAgIisidmVyc2lvbj1cIiIrZmVhdHVyZS5nZXRGZWF0dXJlVmVyc2lvbigpKyJcIiIpOwotCQlpZiAoZmVhdHVyZS5nZXRMYWJlbE5vbkxvY2FsaXplZCgpIT1udWxsKQotCQkJdy5wcmludGxuKGluKyIgICAiKyJsYWJlbD1cIiIrZmVhdHVyZS5nZXRMYWJlbE5vbkxvY2FsaXplZCgpKyJcIiIpOwotCQlpZiAoZmVhdHVyZS5nZXRQcm92aWRlck5vbkxvY2FsaXplZCgpIT1udWxsKQotCQkJdy5wcmludGxuKGluKyIgICAiKyJwcm92aWRlci1uYW1lPVwiIitmZWF0dXJlLmdldFByb3ZpZGVyTm9uTG9jYWxpemVkKCkrIlwiIik7Ci0JCWlmIChmZWF0dXJlLmdldEltYWdlVVJMU3RyaW5nKCkhPW51bGwpCi0JCQl3LnByaW50bG4oaW4rIiAgICIrImltYWdlPVwiIitmZWF0dXJlLmdldEltYWdlVVJMU3RyaW5nKCkrIlwiIik7Ci0JCWlmIChmZWF0dXJlLmdldE9TKCkhPW51bGwpCi0JCQl3LnByaW50bG4oaW4rIiAgICIrIm9zPVwiIitmZWF0dXJlLmdldE9TKCkrIlwiIik7Ci0JCWlmIChmZWF0dXJlLmdldFdTKCkhPW51bGwpCi0JCQl3LnByaW50bG4oaW4rIiAgICIrIndzPVwiIitmZWF0dXJlLmdldFdTKCkrIlwiIik7Ci0JCWlmIChmZWF0dXJlLmdldE5MKCkhPW51bGwpCi0JCQl3LnByaW50bG4oaW4rIiAgICIrIm5sPVwiIitmZWF0dXJlLmdldE5MKCkrIlwiIik7Ci0JCWlmIChmZWF0dXJlLmdldEFwcGxpY2F0aW9uKCkhPW51bGwpCi0JCQl3LnByaW50bG4oaW4rIiAgICIrImFwcGxpY2F0aW9uPVwiIitmZWF0dXJlLmdldEFwcGxpY2F0aW9uKCkrIlwiIik7Ci0JCXcucHJpbnRsbihpbisiICAgIisiPiIpOwotCQkKLQkJd3JpdGVEZXNjcmlwdGlvbih3LCBsZXZlbCsxLCBmZWF0dXJlLmdldERlc2NyaXB0aW9uTW9kZWwoKSk7Ci0JCXdyaXRlQ29weXJpZ2h0KHcsIGxldmVsKzEsIGZlYXR1cmUuZ2V0Q29weXJpZ2h0TW9kZWwoKSk7Ci0JCXdyaXRlTGljZW5zZSh3LCBsZXZlbCsxLCBmZWF0dXJlLmdldExpY2Vuc2VNb2RlbCgpKTsKLQkJd3JpdGVVUkxzKHcsIGxldmVsKzEsIGZlYXR1cmUpOwotCQl3cml0ZVByZXJlcXModywgbGV2ZWwrMSwgZmVhdHVyZSk7Ci0JCXdyaXRlUGx1Z2luRW50cmllcyh3LCBsZXZlbCsxLCBmZWF0dXJlKTsKLQkJd3JpdGVOb25QbHVnaW5FbnRyaWVzKHcsIGxldmVsKzEsIGZlYXR1cmUpOwotICAgICAgICAgCi0gICAgICAgIHcucHJpbnRsbigiIik7Ci0gICAgICAgIHcucHJpbnRsbihpbisiPC9mZWF0dXJlPiIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgd3JpdGVEZXNjcmlwdGlvbihQcmludFdyaXRlciB3LCBpbnQgbGV2ZWwsIFVSTEVudHJ5TW9kZWwgdWUpIHsKLQkJd3JpdGVEZXNjcmlwdGlvbkVudHJ5KHcsbGV2ZWwsIHVlLCAiZGVzY3JpcHRpb24iKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHdyaXRlQ29weXJpZ2h0KFByaW50V3JpdGVyIHcsIGludCBsZXZlbCwgVVJMRW50cnlNb2RlbCB1ZSkgewotCQl3cml0ZURlc2NyaXB0aW9uRW50cnkodyxsZXZlbCwgdWUsICJjb3B5cmlnaHQiKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHdyaXRlTGljZW5zZShQcmludFdyaXRlciB3LCBpbnQgbGV2ZWwsIFVSTEVudHJ5TW9kZWwgdWUpIHsKLQkJd3JpdGVEZXNjcmlwdGlvbkVudHJ5KHcsbGV2ZWwsIHVlLCAibGljZW5zZSIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgd3JpdGVEZXNjcmlwdGlvbkVudHJ5KFByaW50V3JpdGVyIHcsIGludCBsZXZlbCwgVVJMRW50cnlNb2RlbCB1ZSwgU3RyaW5nIHRhZykgewotCQlpZiAodWUgPT0gbnVsbCkgcmV0dXJuOwotCQlTdHJpbmcgdXJsID0gdWUuZ2V0VVJMU3RyaW5nKCk7Ci0JCVN0cmluZyB0eHQgPSB1ZS5nZXRBbm5vdGF0aW9uTm9uTG9jYWxpemVkKCk7Ci0JCWlmICh1cmw9PW51bGwgJiYgdHh0PT1udWxsKSByZXR1cm47Ci0JCQotCQlTdHJpbmcgaW4gPSBnZXRJbmRlbnQobGV2ZWwpOwotCQl3LnByaW50bG4oIiIpOwotCQlpZiAodXJsPT1udWxsKQotCQkJdy5wcmludGxuKGluKyI8Iit0YWcrIj4iKTsKLQkJZWxzZSB7Ci0JCQl3LnByaW50KGluKyI8Iit0YWcrIiB1cmw9XCIiK3VlLmdldFVSTFN0cmluZygpKyJcIiIpOwotCQkJaWYgKHR4dD09bnVsbCkKLQkJCQl3LnByaW50bG4oIi8+Iik7Ci0JCQllbHNlCi0JCQkJdy5wcmludGxuKCI+Iik7Ci0JCX0KLQkJaWYgKHR4dCE9bnVsbCkgewotCQkJdy5wcmludGxuKGluICsgdHh0KTsKLQkJCXcucHJpbnRsbihpbisiPC8iK3RhZysiPiIpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCB3cml0ZVVSTHMoUHJpbnRXcml0ZXIgdywgaW50IGxldmVsLCBGZWF0dXJlTW9kZWwgZmVhdHVyZSkgewkKLQkJVVJMRW50cnlNb2RlbCB1cGRhdGUgPSBmZWF0dXJlLmdldFVwZGF0ZVNpdGVFbnRyeU1vZGVsKCk7Ci0JCVVSTEVudHJ5TW9kZWxbXSBkaXNjb3ZlcnkgPSBmZWF0dXJlLmdldERpc2NvdmVyeVNpdGVFbnRyeU1vZGVscygpOwkJCi0JCWlmICh1cGRhdGUgPT0gbnVsbCAmJiAoZGlzY292ZXJ5ID09IG51bGwgfHwgZGlzY292ZXJ5Lmxlbmd0aD09MCkpIHJldHVybjsKLQkJCi0JCVN0cmluZyBpbiA9IGdldEluZGVudChsZXZlbCk7Ci0JCVN0cmluZyBpbjIgPSBnZXRJbmRlbnQobGV2ZWwrMSk7CQkKLQkJdy5wcmludGxuKCIiKTsKLQkJdy5wcmludGxuKGluKyI8dXJsPiIpOwotCQkKLQkJaWYgKHVwZGF0ZSAhPSBudWxsKSB7Ci0JCQl3LnByaW50bG4oaW4yKyI8dXBkYXRlIik7Ci0JCQlpZiAodXBkYXRlLmdldFVSTFN0cmluZygpIT1udWxsKQotCQkJCXcucHJpbnRsbihpbjIrIiAgICIrInVybD1cIiIrdXBkYXRlLmdldFVSTFN0cmluZygpKyJcIiIpOwotCQkJaWYgKHVwZGF0ZS5nZXRBbm5vdGF0aW9uTm9uTG9jYWxpemVkKCkhPW51bGwpCi0JCQkJdy5wcmludGxuKGluMisiICAgIisibGFiZWw9XCIiK3VwZGF0ZS5nZXRBbm5vdGF0aW9uTm9uTG9jYWxpemVkKCkrIlwiIik7Ci0JCQl3LnByaW50bG4oaW4yKyIgICAiKyIvPiIpOwotCQl9Ci0JCQotCQlmb3IgKGludCBpPTA7IGRpc2NvdmVyeSE9bnVsbCAmJiBpPGRpc2NvdmVyeS5sZW5ndGg7IGkrKykgewotCQkJdy5wcmludGxuKGluMisiPGRpc2NvdmVyeSIpOwotCQkJaWYgKGRpc2NvdmVyeVtpXS5nZXRVUkxTdHJpbmcoKSE9bnVsbCkJCi0JCQkJdy5wcmludGxuKGluMisiICAgIisidXJsPVwiIitkaXNjb3ZlcnlbaV0uZ2V0VVJMU3RyaW5nKCkrIlwiIik7Ci0JCQlpZiAoZGlzY292ZXJ5W2ldLmdldEFubm90YXRpb25Ob25Mb2NhbGl6ZWQoKSE9bnVsbCkKLQkJCQl3LnByaW50bG4oaW4yKyIgICAiKyJsYWJlbD1cIiIrZGlzY292ZXJ5W2ldLmdldEFubm90YXRpb25Ob25Mb2NhbGl6ZWQoKSsiXCIiKTsKLQkJCXcucHJpbnRsbihpbjIrIiAgICIrIi8+Iik7Ci0JCX0KLQkJCi0JCXcucHJpbnRsbihpbisiPC91cmw+Iik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCB3cml0ZVByZXJlcXMoUHJpbnRXcml0ZXIgdywgaW50IGxldmVsLCBGZWF0dXJlTW9kZWwgZmVhdHVyZSkgewkKLQkJSW1wb3J0TW9kZWxbXSBpbXAgPSBmZWF0dXJlLmdldEltcG9ydE1vZGVscygpOwkKLQkJaWYgKGltcCA9PSBudWxsIHx8IGltcC5sZW5ndGggPT0gMCkgcmV0dXJuOwotCQkKLQkJU3RyaW5nIGluID0gZ2V0SW5kZW50KGxldmVsKTsKLQkJU3RyaW5nIGluMiA9IGdldEluZGVudChsZXZlbCsxKTsKLQkJdy5wcmludGxuKCIiKTsKLQkJdy5wcmludGxuKGluKyI8cmVxdWlyZXM+Iik7Ci0JCQotCQlmb3IgKGludCBpPTA7IGltcCE9bnVsbCAmJiBpPGltcC5sZW5ndGg7IGkrKykgewotCQkJdy5wcmludGxuKGluMisiPGltcG9ydCIpOwotCQkJaWYgKGltcFtpXS5nZXRJZGVudGlmaWVyKCkhPW51bGwpCi0JCQkJdy5wcmludGxuKGluMisiICAgIisicGx1Z2luPVwiIitpbXBbaV0uZ2V0SWRlbnRpZmllcigpKyJcIiIpOwotCQkJaWYgKGltcFtpXS5nZXRWZXJzaW9uKCkhPW51bGwpCi0JCQkJdy5wcmludGxuKGluMisiICAgIisidmVyc2lvbj1cIiIraW1wW2ldLmdldFZlcnNpb24oKSsiXCIiKTsKLQkJCWlmIChpbXBbaV0uZ2V0TWF0Y2hpbmdSdWxlTmFtZSgpIT1udWxsKQotCQkJCXcucHJpbnRsbihpbjIrIiAgICIrIm1hdGNoPVwiIitpbXBbaV0uZ2V0TWF0Y2hpbmdSdWxlTmFtZSgpKyJcIiIpOwotCQkJdy5wcmludGxuKGluMisiICAgIisiLz4iKTsKLQkJfQotCQkKLQkJdy5wcmludGxuKGluKyI8L3JlcXVpcmVzPiIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgd3JpdGVQbHVnaW5FbnRyaWVzKFByaW50V3JpdGVyIHcsIGludCBsZXZlbCwgRmVhdHVyZU1vZGVsIGZlYXR1cmUpIHsKLQkJUGx1Z2luRW50cnlNb2RlbFtdIHBsdWdpbiA9IGZlYXR1cmUuZ2V0UGx1Z2luRW50cnlNb2RlbHMoKTsKLQkJaWYgKHBsdWdpbiA9PSBudWxsIHx8IHBsdWdpbi5sZW5ndGggPT0gMCkgcmV0dXJuOwotCQkKLQkJU3RyaW5nIGluID0gZ2V0SW5kZW50KGxldmVsKTsKLQkJdy5wcmludGxuKCIiKTsKLQkJCi0JCWZvciAoaW50IGk9MDsgaTxwbHVnaW4ubGVuZ3RoOyBpKyspIHsKLQkJCXcucHJpbnRsbihpbisiPHBsdWdpbiIpOwotCQkJaWYgKHBsdWdpbltpXS5nZXRQbHVnaW5JZGVudGlmaWVyKCkhPW51bGwpCi0JCQkJdy5wcmludGxuKGluKyIgICAiKyJpZD1cIiIrcGx1Z2luW2ldLmdldFBsdWdpbklkZW50aWZpZXIoKSsiXCIiKTsKLQkJCWlmIChwbHVnaW5baV0uZ2V0UGx1Z2luVmVyc2lvbigpIT1udWxsKQotCQkJCXcucHJpbnRsbihpbisiICAgIisidmVyc2lvbj1cIiIrcGx1Z2luW2ldLmdldFBsdWdpblZlcnNpb24oKSsiXCIiKTsKLQkJCWlmIChwbHVnaW5baV0uaXNGcmFnbWVudCgpKQotCQkJCXcucHJpbnRsbihpbisiICAgIisiZnJhZ21lbnQ9XCIiK3BsdWdpbltpXS5pc0ZyYWdtZW50KCkrIlwiIik7Ci0JCQlpZiAocGx1Z2luW2ldLmdldE9TKCkhPW51bGwpCi0JCQkJdy5wcmludGxuKGluKyIgICAiKyJvcz1cIiIrcGx1Z2luW2ldLmdldE9TKCkrIlwiIik7Ci0JCQlpZiAocGx1Z2luW2ldLmdldFdTKCkhPW51bGwpCi0JCQkJdy5wcmludGxuKGluKyIgICAiKyJ3cz1cIiIrcGx1Z2luW2ldLmdldFdTKCkrIlwiIik7Ci0JCQlpZiAocGx1Z2luW2ldLmdldE5MKCkhPW51bGwpCi0JCQkJdy5wcmludGxuKGluKyIgICAiKyJubD1cIiIrcGx1Z2luW2ldLmdldE5MKCkrIlwiIik7Ci0JCQlpZiAocGx1Z2luW2ldLmdldERvd25sb2FkU2l6ZSgpIT1Db250ZW50RW50cnlNb2RlbC5VTktOT1dOX1NJWkUpCi0JCQkJdy5wcmludGxuKGluKyIgICAiKyJkb3dubG9hZC1zaXplPVwiIitwbHVnaW5baV0uZ2V0RG93bmxvYWRTaXplKCkrIlwiIik7Ci0JCQlpZiAocGx1Z2luW2ldLmdldEluc3RhbGxTaXplKCkhPUNvbnRlbnRFbnRyeU1vZGVsLlVOS05PV05fU0laRSkKLQkJCQl3LnByaW50bG4oaW4rIiAgICIrImluc3RhbGwtc2l6ZT1cIiIrcGx1Z2luW2ldLmdldEluc3RhbGxTaXplKCkrIlwiIik7Ci0JCQl3LnByaW50bG4oaW4rIiAgICIrIi8+Iik7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHdyaXRlTm9uUGx1Z2luRW50cmllcyhQcmludFdyaXRlciB3LCBpbnQgbGV2ZWwsIEZlYXR1cmVNb2RlbCBmZWF0dXJlKSB7Ci0JCU5vblBsdWdpbkVudHJ5TW9kZWxbXSBkYXRhID0gZmVhdHVyZS5nZXROb25QbHVnaW5FbnRyeU1vZGVscygpOwotCQlpZiAoZGF0YSA9PSBudWxsIHx8IGRhdGEubGVuZ3RoID09IDApIHJldHVybjsKLQkJCi0JCVN0cmluZyBpbiA9IGdldEluZGVudChsZXZlbCk7Ci0JCXcucHJpbnRsbigiIik7Ci0JCQotCQlmb3IgKGludCBpPTA7IGk8ZGF0YS5sZW5ndGg7IGkrKykgewotCQkJdy5wcmludGxuKGluKyI8ZGF0YSIpOwotCQkJaWYgKGRhdGFbaV0uZ2V0SWRlbnRpZmllcigpIT1udWxsKQotCQkJCXcucHJpbnRsbihpbisiICAgIisiaWQ9XCIiK2RhdGFbaV0uZ2V0SWRlbnRpZmllcigpKyJcIiIpOwotCQkJaWYgKGRhdGFbaV0uZ2V0T1MoKSE9bnVsbCkKLQkJCQl3LnByaW50bG4oaW4rIiAgICIrIm9zPVwiIitkYXRhW2ldLmdldE9TKCkrIlwiIik7Ci0JCQlpZiAoZGF0YVtpXS5nZXRXUygpIT1udWxsKQotCQkJCXcucHJpbnRsbihpbisiICAgIisid3M9XCIiK2RhdGFbaV0uZ2V0V1MoKSsiXCIiKTsKLQkJCWlmIChkYXRhW2ldLmdldE5MKCkhPW51bGwpCi0JCQkJdy5wcmludGxuKGluKyIgICAiKyJubD1cIiIrZGF0YVtpXS5nZXROTCgpKyJcIiIpOwotCQkJaWYgKGRhdGFbaV0uZ2V0RG93bmxvYWRTaXplKCkhPUNvbnRlbnRFbnRyeU1vZGVsLlVOS05PV05fU0laRSkKLQkJCQl3LnByaW50bG4oaW4rIiAgICIrImRvd25sb2FkLXNpemU9XCIiK2RhdGFbaV0uZ2V0RG93bmxvYWRTaXplKCkrIlwiIik7Ci0JCQlpZiAoZGF0YVtpXS5nZXRJbnN0YWxsU2l6ZSgpIT1Db250ZW50RW50cnlNb2RlbC5VTktOT1dOX1NJWkUpCi0JCQkJdy5wcmludGxuKGluKyIgICAiKyJpbnN0YWxsLXNpemU9XCIiK2RhdGFbaV0uZ2V0SW5zdGFsbFNpemUoKSsiXCIiKTsKLQkJCXcucHJpbnRsbihpbisiICAgIisiLz4iKTsKLQkJfQotCX0KLQkKLQkKLQlwcml2YXRlIFN0cmluZyBnZXRJbmRlbnQoaW50IGxldmVsKSB7Ci0JCVN0cmluZyBpbmRlbnQgPSAiIjsKLQkJZm9yIChpbnQgaT0wOyBpPGxldmVsOyBpKyspIAotCQkJaW5kZW50ICs9ICIgICAiOwotCQlyZXR1cm4gaW5kZW50OwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9leGFtcGxlcy9idWlsZHppcC9UZXN0LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvZXhhbXBsZXMvYnVpbGR6aXAvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTE4OWRmLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9leGFtcGxlcy9idWlsZHppcC9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy5idWlsZHppcDsNCi0NCi0vKg0KLSAqIChjKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDAsIDIwMDIuDQotICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCi0gKi8gDQotDQotaW1wb3J0IGphdmEubmV0LlVSTDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsNCi0gDQotLyoqDQotICogdW5pdCB0ZXN0IGhhcm5lc3MNCi0gKi8NCi0NCi1wdWJsaWMgY2xhc3MgVGVzdCB7DQotDQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsNCi0JCQ0KLQkJdHJ5IHsNCi0JCQlVUkwgdXJsID0gbmV3IFVSTCgiZmlsZTpkOi9kb3dubG9hZHMvZWNsaXBzZSAyLjAvaW50ZWdyYXRpb24tZWNsaXBzZS1TREstMjAwMjAxMDktd2luMzIuemlwIik7DQotCQkJQnVpbGRaaXBGZWF0dXJlRmFjdG9yeSBmYWN0b3J5ID0gbmV3IEJ1aWxkWmlwRmVhdHVyZUZhY3RvcnkoKTsNCi0JCQlGZWF0dXJlIGZlYXR1cmUgPSAoRmVhdHVyZSkgZmFjdG9yeS5jcmVhdGVGZWF0dXJlKHVybCxudWxsLypJU2l0ZSovKTsNCi0JCQlEZWZhdWx0TW9kZWxXcml0ZXIgdyA9IG5ldyBEZWZhdWx0TW9kZWxXcml0ZXIoZmVhdHVyZSk7DQotCQkJdy53cml0ZUZlYXR1cmVNYW5pZmVzdChTeXN0ZW0ub3V0KTsNCi0JCQkNCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiIpOw0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRmVhdHVyZSBlbnRyeSByZWZlcmVuY2VzIik7DQotCQkJQ29udGVudFJlZmVyZW5jZVtdIHJlZnMgPSBmZWF0dXJlLmdldEZlYXR1cmVDb250ZW50UHJvdmlkZXIoKS5nZXRGZWF0dXJlRW50cnlDb250ZW50UmVmZXJlbmNlcyhudWxsKTsNCi0JCQlmb3IgKGludCBpPTA7IGk8IHJlZnMubGVuZ3RoOyBpKyspIHsNCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICAiK3JlZnNbaV0uZ2V0SWRlbnRpZmllcigpKTsNCi0JCQl9DQotCQkJDQotCQkJU3lzdGVtLm91dC5wcmludGxuKCIiKTsNCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlBsdWctaW4gZW50cnkgcmVmZXJlbmNlcyIpOw0KLQkJCUlQbHVnaW5FbnRyeVtdIGVudHJ5ID0gZmVhdHVyZS5nZXRQbHVnaW5FbnRyaWVzKCk7DQotCQkJcmVmcyA9IGZlYXR1cmUuZ2V0RmVhdHVyZUNvbnRlbnRQcm92aWRlcigpLmdldFBsdWdpbkVudHJ5Q29udGVudFJlZmVyZW5jZXMoZW50cnlbMF0sIG51bGwpOw0KLQkJCWZvciAoaW50IGk9MDsgaTwgcmVmcy5sZW5ndGg7IGkrKykgew0KLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICIrcmVmc1tpXS5nZXRJZGVudGlmaWVyKCkpOw0KLQkJCX0JCQkNCi0JCQkNCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiIpOw0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTm9uLXBsdWctaW4gZW50cnkgcmVmZXJlbmNlcyIpOw0KLQkJCUlOb25QbHVnaW5FbnRyeVtdIGRhdGEgPSBmZWF0dXJlLmdldE5vblBsdWdpbkVudHJpZXMoKTsNCi0JCQlyZWZzID0gZmVhdHVyZS5nZXRGZWF0dXJlQ29udGVudFByb3ZpZGVyKCkuZ2V0Tm9uUGx1Z2luRW50cnlBcmNoaXZlUmVmZXJlbmNlcyhkYXRhWzBdLCBudWxsKTsNCi0JCQlmb3IgKGludCBpPTA7IGk8IHJlZnMubGVuZ3RoOyBpKyspIHsNCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICAiK3JlZnNbaV0uZ2V0SWRlbnRpZmllcigpKTsNCi0JCQl9CQkJDQotCQkJDQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJEb25lIC4uLiIpOw0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOw0KLQkJfQkJDQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2V4YW1wbGVzL2J1aWxkemlwL2phdmEucGFnZS5qcGFnZSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9leGFtcGxlcy9idWlsZHppcC9qYXZhLnBhZ2UuanBhZ2UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjYjI0YmQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2V4YW1wbGVzL2J1aWxkemlwL2phdmEucGFnZS5qcGFnZQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLQ0KLQ0KLWphdmEudXRpbC5Qcm9wZXJ0aWVzIHAgPSBTeXN0ZW0uZ2V0UHJvcGVydGllcygpOw0KLWphdmEudXRpbC5FbnVtZXJhdGlvbiBrZXlzID0gcC5rZXlzKCk7DQotd2hpbGUgKGtleXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsNCi0JU3RyaW5nIGtleSA9IChTdHJpbmcpa2V5cy5uZXh0RWxlbWVudCgpOw0KLQlTeXN0ZW0ub3V0LnByaW50bG4oa2V5ICsgIiA9ICIgKyAoU3RyaW5nKXAuZ2V0KGtleSkpOw0KLX0NCi0NCi0NCi0NCi0NCi0NCi1TdHJpbmcgZmlsZU5hbWUgPSAiZDpcXGRvd25sb2Fkc1xcZWNsaXBzZSAyLjBcXGludGVncmF0aW9uLWVjbGlwc2UtU0RLLTIwMDIwMTA5LXdpbjMyLnppcCI7DQotamF2YS5pby5GaWxlIGFyY2hpdmVGaWxlID0gbmV3IGphdmEuaW8uRmlsZShmaWxlTmFtZSk7DQotamF2YS51dGlsLmphci5KYXJGaWxlIGphckFyY2hpdmUgPSBuZXcgamF2YS51dGlsLmphci5KYXJGaWxlKGFyY2hpdmVGaWxlKTsNCi1qYXZhLnV0aWwuamFyLkphckVudHJ5IGVudHJ5Ow0KLWphdmEudXRpbC5FbnVtZXJhdGlvbiBlbnRyaWVzID0gamFyQXJjaGl2ZS5lbnRyaWVzKCk7DQotd2hpbGUoZW50cmllcy5oYXNNb3JlRWxlbWVudHMoKSkgew0KLQllbnRyeSA9IChqYXZhLnV0aWwuamFyLkphckVudHJ5KSBlbnRyaWVzLm5leHRFbGVtZW50KCk7DQotCVN5c3RlbS5vdXQucHJpbnRsbihlbnRyeS5nZXROYW1lKCkpOw0KLX0NCi0NCi0NCi1TdHJpbmcgYSA9ICIyMjMiOw0KLVN0cmluZyBiID0gIjEyMyI7DQotYS5jb21wYXJlVG8oYik7DQotDQotDQotb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuVmVyc2lvbiB2MSA9IA0KLQluZXcgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuVmVyc2lvbigxLDIsMywiYnVpbGQgMTI3SiIpOw0KLW9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLlZlcnNpb24gdjIgPSANCi0JbmV3IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLlZlcnNpb24oMSwyLDMsImJ1aWxkIDEyN0oiKTsNCi12MS5jb21wYXJlKHYyKTsNCi0NCi0NCi1qYXZhLmlvLkZpbGUgZiA9IG5ldyBqYXZhLmlvLkZpbGUoImQ6XFxkb3dubG9hZHNcXGVjbGlwc2UgMi4wXFx4XFwiKTsNCi1mLmlzRGlyZWN0b3J5KCk7DQotDQotDQotU3RyaW5nIHMgPSAiaGVsbG8iOw0KLU9iamVjdCBhID0gamF2YS5sYW5nLnJlZmxlY3QuQXJyYXkubmV3SW5zdGFuY2Uocy5nZXRDbGFzcygpLDApOw0KLVN5c3RlbS5vdXQucHJpbnRsbihhLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsNCi0NCi0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvZXhhbXBsZXMvZnJlZWZvcm0vRnJlZUZvcm1TaXRlQ29udGVudFByb3ZpZGVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvZXhhbXBsZXMvZnJlZWZvcm0vRnJlZUZvcm1TaXRlQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjYmVhYjQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2V4YW1wbGVzL2ZyZWVmb3JtL0ZyZWVGb3JtU2l0ZUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMuZnJlZWZvcm07DQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLlNpdGVDb250ZW50UHJvdmlkZXI7DQotDQotcHVibGljIGNsYXNzIEZyZWVGb3JtU2l0ZUNvbnRlbnRQcm92aWRlciBleHRlbmRzIFNpdGVDb250ZW50UHJvdmlkZXIgew0KLQ0KLQkvKioNCi0JICogQ29uc3RydWN0b3IgZm9yIFNpdGVDb250ZW50UHJvdmlkZXIuDQotCSAqLw0KLQlwdWJsaWMgRnJlZUZvcm1TaXRlQ29udGVudFByb3ZpZGVyKFVSTCB1cmwpIHsNCi0JCXN1cGVyKHVybCk7DQotCX0NCi0JDQotCS8qDQotCSAqIEBzZWUgSVNpdGVDb250ZW50UHJvdmlkZXIjZ2V0QXJjaGl2ZVJlZmVyZW5jZShTdHJpbmcpDQotCSAqLw0KLQlwdWJsaWMgVVJMIGdldEFyY2hpdmVSZWZlcmVuY2UoU3RyaW5nIGlkKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQl0cnkgew0KLQkJCXJldHVybiBuZXcgVVJMKGdldFVSTCgpLGlkKTsNCi0JCX0gY2F0Y2goTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsNCi0JCQl0aHJvdyBuZXdDb3JlRXhjZXB0aW9uKCJVbmFibGUgdG8gcmV0dXJuIGFyY2hpdmUgVVJMIixlKTsNCi0JCX0NCi0JfQ0KLQkNCi0JcHJpdmF0ZSBDb3JlRXhjZXB0aW9uIG5ld0NvcmVFeGNlcHRpb24oU3RyaW5nIHMsIFRocm93YWJsZSBlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQlyZXR1cm4gbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCJvcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMiLDAscyxlKSk7DQotCX0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2V4YW1wbGVzL2ZyZWVmb3JtL0ZyZWVGb3JtU2l0ZUZhY3RvcnkuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9leGFtcGxlcy9mcmVlZm9ybS9GcmVlRm9ybVNpdGVGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiM2M3ZmMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2V4YW1wbGVzL2ZyZWVmb3JtL0ZyZWVGb3JtU2l0ZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzLmZyZWVmb3JtOw0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247DQotaW1wb3J0IGphdmEubmV0LlVSTDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLkJhc2VTaXRlRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSVNpdGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLlNpdGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLkludmFsaWRTaXRlVHlwZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuVVJMRW50cnlNb2RlbDsNCi0NCi1wdWJsaWMgY2xhc3MgRnJlZUZvcm1TaXRlRmFjdG9yeSBleHRlbmRzIEJhc2VTaXRlRmFjdG9yeSB7DQotDQotCS8qDQotCSAqIEBzZWUgSVNpdGVGYWN0b3J5I2NyZWF0ZVNpdGUoVVJMKQ0KLQkgKi8NCi0JcHVibGljIElTaXRlIGNyZWF0ZVNpdGUoVVJMIHVybCkNCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uLCBJbnZhbGlkU2l0ZVR5cGVFeGNlcHRpb24gew0KLQ0KLQkJLy8gQ3JlYXRlIHNpdGUNCi0JCVNpdGUgc2l0ZSA9IG51bGw7DQotCQlJbnB1dFN0cmVhbSBpcyA9IG51bGw7DQotCQl0cnkgew0KLQkJCWlzID0gdXJsLm9wZW5TdHJlYW0oKTsNCi0JCQlzaXRlID0gKFNpdGUpIHBhcnNlU2l0ZShpcyk7DQotDQotCQkJVVJMRW50cnlNb2RlbCByZWFsU2l0ZVJlZiA9IHNpdGUuZ2V0RGVzY3JpcHRpb25Nb2RlbCgpOw0KLQkJCWlmIChyZWFsU2l0ZVJlZiA9PSBudWxsKQ0KLQkJCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbigNCi0JCQkJCSJVbmFibGUgdG8gb2J0YWluIHVwZGF0ZSBzaXRlIHJlZmVyZW5jZSIsDQotCQkJCQludWxsKTsNCi0JCQlTdHJpbmcgc2l0ZVVSTFN0cmluZyA9IHJlYWxTaXRlUmVmLmdldFVSTFN0cmluZygpOw0KLQkJCWlmIChzaXRlVVJMU3RyaW5nID09IG51bGwpDQotCQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKA0KLQkJCQkJIlVuYWJsZSB0byBvYnRhaW4gdXBkYXRlIHNpdGUgcmVmZXJlbmNlIiwNCi0JCQkJCW51bGwpOw0KLQkJCVVSTCBzaXRlVVJMID0gbmV3IFVSTChzaXRlVVJMU3RyaW5nKTsNCi0JCQlGcmVlRm9ybVNpdGVDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyID0NCi0JCQkJbmV3IEZyZWVGb3JtU2l0ZUNvbnRlbnRQcm92aWRlcihzaXRlVVJMKTsNCi0JCQlzaXRlLnNldFNpdGVDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsNCi0JCQlzaXRlLnJlc29sdmUoc2l0ZVVSTCwgbnVsbCk7IC8vIHJlc29sdmUgYW55IFVSTHMgcmVsYXRpdmUgdG8gdGhlIHNpdGUNCi0NCi0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKXsNCi0JCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbigiVW5hYmxlIHRvIGNyZWF0ZSBVUkwiLGUpOw0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSl7DQotCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oIlVuYWJsZSB0byBhY2Nlc3MgVVJMIixlKTsNCi0JCX0gZmluYWxseSB7DQotCQkJaWYgKGlzICE9IG51bGwpDQotCQkJCXRyeSB7DQotCQkJCQlpcy5jbG9zZSgpOw0KLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7DQotCQkJCX0NCi0JCX0NCi0NCi0JCXJldHVybiBzaXRlOw0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgU2l0ZU1vZGVsRmFjdG9yeSNjYW5QYXJzZVNpdGVUeXBlKFN0cmluZykNCi0JICovDQotCXB1YmxpYyBib29sZWFuIGNhblBhcnNlU2l0ZVR5cGUoU3RyaW5nIHR5cGUpIHsNCi0JCXJldHVybiB0eXBlICE9IG51bGwNCi0JCQkmJiB0eXBlLmVxdWFscygib3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzLnNpdGUuZnJlZWZvcm0iKTsNCi0JfQ0KLQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnNjaGVkdWxlci8uY2xhc3NwYXRoIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5zY2hlZHVsZXIvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2UwYzdhNS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnNjaGVkdWxlci8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0NEQy0xLjAlRm91bmRhdGlvbi0xLjAiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5zY2hlZHVsZXIvLmN2c2lnbm9yZSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuc2NoZWR1bGVyLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMDc3YTQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5zY2hlZHVsZXIvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5zY2hlZHVsZXIvLnByb2plY3QgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnNjaGVkdWxlci8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQyMTM2NC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnNjaGVkdWxlci8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnVwZGF0ZS5zY2hlZHVsZXI8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5zY2hlZHVsZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5zY2hlZHVsZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTM0NmMzLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuc2NoZWR1bGVyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotI1dlZCBBcHIgMjYgMTQ6MzQ6MDMgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnNjaGVkdWxlci9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuc2NoZWR1bGVyL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjQ3MGVhLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuc2NoZWR1bGVyL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLnVwZGF0ZS5zY2hlZHVsZXI7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDMuMi4xMDAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuc2NoZWR1bGVyLlVwZGF0ZVNjaGVkdWxlclBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnNjaGVkdWxlcjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5zY2hlZHVsZXIucHJlZmVyZW5jZXM7eC1pbnRlcm5hbDo9dHJ1ZQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuMS4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudXBkYXRlLmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjEuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVwZGF0ZS51aTtidW5kbGUtdmVyc2lvbj0iWzMuMS4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWk7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3I7YnVuZGxlLXZlcnNpb249IlszLjEuMTAwLDQuMC4wKSIKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogQ0RDLTEuMC9Gb3VuZGF0aW9uLTEuMCwKLSBKMlNFLTEuMwpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5zY2hlZHVsZXIvYWJvdXQuaHRtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuc2NoZWR1bGVyL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2MDIzMzAuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5zY2hlZHVsZXIvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5KdW5lIDIsIDIwMDY8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKLWluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKLXByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnNjaGVkdWxlci9idWlsZC5wcm9wZXJ0aWVzIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5zY2hlZHVsZXIvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZmY2FhNy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnNjaGVkdWxlci9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvCi1zcmMuaW5jbHVkZXMgPSBhYm91dC5odG1sCi1zb3VyY2UuLiA9IHNyYy8KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuc2NoZWR1bGVyL3BsdWdpbi5wcm9wZXJ0aWVzIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5zY2hlZHVsZXIvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyNWJhOWMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5zY2hlZHVsZXIvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jIFVwZGF0ZSBTY2hlZHVsZXIgcGx1Z2luLnhtbCByZXNvdXJjZXMKLSMKLXBsdWdpbk5hbWUgPSBBdXRvbWF0aWMgVXBkYXRlcyBTY2hlZHVsZXIKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCi1hdXRvbWF0aWNVcGRhdGVzUHJlZlBhZ2UgPSBBdXRvbWF0aWMgVXBkYXRlcwotcHJlZmVyZW5jZXMgPSBVcGRhdGVzIFNjaGVkdWxlciBQcmVmZXJlbmNlcwotcHJlZmVyZW5jZUtleXdvcmRzLmdlbmVyYWw9YXV0b21hdGljIHVwZGF0ZSBzY2hlZHVsZSBkb3dubG9hZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuc2NoZWR1bGVyL3BsdWdpbi54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnNjaGVkdWxlci9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWVlNzMzLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuc2NoZWR1bGVyL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotICAgIAk8ZXh0ZW5zaW9uIGlkPSJwcmVmZXJlbmNlcyIgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcyIgbmFtZT0iJXByZWZlcmVuY2VzIj4KLQkJPGluaXRpYWxpemVyIGNsYXNzPSJvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuc2NoZWR1bGVyLnByZWZlcmVuY2VzLlByZWZlcmVuY2VJbml0aWFsaXplciIvPgotCTwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnN0YXJ0dXAiPgotICAgICAgPHN0YXJ0dXAgY2xhc3M9Im9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5zY2hlZHVsZXIuU2NoZWR1bGVyU3RhcnR1cCI+Ci0gICAgICA8L3N0YXJ0dXA+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5zdGFydHVwIj4KLSAgICAgIDxzdGFydHVwIGNsYXNzPSJvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuc2NoZWR1bGVyLlNjaGVkdWxlZFBsdWdpblVuaW5zdGFsbCI+Ci0gICAgICA8L3N0YXJ0dXA+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlUGFnZXMiPgotICAgICAgPHBhZ2UKLSAgICAgICAgICAgIG5hbWU9IiVhdXRvbWF0aWNVcGRhdGVzUHJlZlBhZ2UiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnByZWZlcmVuY2VzLk1haW5QcmVmZXJlbmNlUGFnZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuc2NoZWR1bGVyLnByZWZlcmVuY2VzLkF1dG9tYXRpY1VwZGF0ZXNQcmVmZXJlbmNlUGFnZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuc2NoZWR1bGVyLkF1dG9tYXRpY1VwZGF0ZXNQcmVmZXJlbmNlUGFnZSI+Ci0gICAgICAgICAgICA8a2V5d29yZFJlZmVyZW5jZSBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLnNjaGVkdWxlci5nZW5lcmFsIi8+Ci0gICAgICA8L3BhZ2U+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgICAgPGV4dGVuc2lvbgotICAgCQlwb2ludD0ib3JnLmVjbGlwc2UudWkua2V5d29yZHMiPgotICAgICAgPGtleXdvcmQKLSAgICAgICAgICAgIGxhYmVsPSIlcHJlZmVyZW5jZUtleXdvcmRzLmdlbmVyYWwiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLnNjaGVkdWxlci5nZW5lcmFsIi8+Ci0gICAgICA8L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5zY2hlZHVsZXIvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9zY2hlZHVsZXIvQXV0b21hdGljVXBkYXRlSm9iLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnNjaGVkdWxlci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NjaGVkdWxlci9BdXRvbWF0aWNVcGRhdGVKb2IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZhZmQ5YS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnNjaGVkdWxlci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NjaGVkdWxlci9BdXRvbWF0aWNVcGRhdGVKb2IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuc2NoZWR1bGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnNlYXJjaC5VcGRhdGVTZWFyY2hSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5VcGRhdGVKb2I7Ci0KLWNsYXNzIEF1dG9tYXRpY1VwZGF0ZUpvYiBleHRlbmRzIFVwZGF0ZUpvYiB7Ci0KLQlwdWJsaWMgQXV0b21hdGljVXBkYXRlSm9iKFN0cmluZyBuYW1lLCBib29sZWFuIGlzQXV0b21hdGljLCBib29sZWFuIGRvd25sb2FkKSB7Ci0JCXN1cGVyKG5hbWUsIGlzQXV0b21hdGljLCBkb3dubG9hZCk7Ci0JfQotCi0JcHVibGljIEF1dG9tYXRpY1VwZGF0ZUpvYihTdHJpbmcgbmFtZSwgVXBkYXRlU2VhcmNoUmVxdWVzdCBzZWFyY2hSZXF1ZXN0KSB7Ci0JCXN1cGVyKG5hbWUsIHNlYXJjaFJlcXVlc3QpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGJlbG9uZ3NUbyhPYmplY3QgZmFtaWx5KSB7Ci0JCXJldHVybiBTY2hlZHVsZXJTdGFydHVwLmF1dG9tYXRpY0pvYkZhbWlseSA9PSBmYW1pbHk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuc2NoZWR1bGVyL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvc2NoZWR1bGVyL1NjaGVkdWxlZFBsdWdpblVuaW5zdGFsbC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5zY2hlZHVsZXIvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9zY2hlZHVsZXIvU2NoZWR1bGVkUGx1Z2luVW5pbnN0YWxsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxOTJmNjguLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5zY2hlZHVsZXIvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9zY2hlZHVsZXIvU2NoZWR1bGVkUGx1Z2luVW5pbnN0YWxsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnNjaGVkdWxlcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVN0YXJ0dXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uSUNvbmZpZ3VyZWRTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IuQ29uZmlndXJhdG9yVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUZlYXR1cmVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuU2l0ZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm9wZXJhdGlvbnMuT3BlcmF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy5JT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLk9wZXJhdGlvbnNNYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgU2NoZWR1bGVkUGx1Z2luVW5pbnN0YWxsIGltcGxlbWVudHMgSVN0YXJ0dXAgewotCi0JcHVibGljIHZvaWQgZWFybHlTdGFydHVwKCkgewotCQlVUkwgcGxhdGZvcm1YTUwgPSBDb25maWd1cmF0b3JVdGlscy5nZXRDdXJyZW50UGxhdGZvcm1Db25maWd1cmF0aW9uKCkuZ2V0Q29uZmlndXJhdGlvbkxvY2F0aW9uKCk7Ci0JCQotCQlGaWxlIGYgPSBuZXcgRmlsZShwbGF0Zm9ybVhNTC5nZXRGaWxlKCkpOwotCi0JCWYgPSBuZXcgRmlsZShmLmdldFBhcmVudEZpbGUoKSwgInRvQmVVbmluc3RhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JCXRyeSB7Ci0JCQlpZiAoIWYuZXhpc3RzKCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlGaWxlSW5wdXRTdHJlYW0gZmlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmKTsKLQkJCVByb3BlcnRpZXMgdG9CZVVuaW5zdGFsbGVkID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJCXRvQmVVbmluc3RhbGxlZC5sb2FkKGZpcyk7Ci0JCQlmaXMuY2xvc2UoKTsKLQotCQkJSUZlYXR1cmVbXSBmZWF0dXJlcyA9IG5ldyBJRmVhdHVyZVt0b0JlVW5pbnN0YWxsZWQuc2l6ZSgpXTsKLQkJCUlDb25maWd1cmVkU2l0ZVtdIGNvbmZpZ3VyZWRTaXRlcyA9IG5ldyBJQ29uZmlndXJlZFNpdGVbdG9CZVVuaW5zdGFsbGVkLnNpemUoKV07Ci0KLQkJCUlDb25maWd1cmVkU2l0ZVtdIHNpdGVzID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKS5nZXRDb25maWd1cmVkU2l0ZXMoKTsKLQotCQkJRW51bWVyYXRpb24gZmVhdHVyZXNUb0JlRGVsZXRlZCA9IHRvQmVVbmluc3RhbGxlZC5lbGVtZW50cygpOwotCQkJaW50IGkgPSAwOwotCQkJd2hpbGUoZmVhdHVyZXNUb0JlRGVsZXRlZC5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJCVN0cmluZyB0ZW1wID0gKFN0cmluZylmZWF0dXJlc1RvQmVEZWxldGVkLm5leHRFbGVtZW50KCk7Ci0JCQkJU3RyaW5nVG9rZW5pemVyIHN0ayA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoIHRlbXAsICI7Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQlTdHJpbmcgdGFyZ2V0U2l0ZSA9IHN0ay5uZXh0VG9rZW4oKTsKLQkJCQlTdHJpbmcgZmVhdHVyZU5hbWUgPSBzdGsubmV4dFRva2VuKCk7Ci0JCQkJZm9yKGludCBqID0gMDsgaiA8IHNpdGVzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCWlmIChzaXRlc1tqXS5nZXRTaXRlKCkuZ2V0VVJMKCkudG9TdHJpbmcoKS5lcXVhbHModGFyZ2V0U2l0ZSkpIHsKLQkJCQkJCWNvbmZpZ3VyZWRTaXRlc1tpXSA9IHNpdGVzW2pdOwotCQkJCQkJSUZlYXR1cmVSZWZlcmVuY2VbXSBzaXRlRmVhdHVyZXMgPSBjb25maWd1cmVkU2l0ZXNbaV0uZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKTsKLQkJCQkJCWZvcihpbnQgayA9IDA7IGsgPCBzaXRlRmVhdHVyZXMubGVuZ3RoOyBrKyspIHsKLQkJCQkJCQlpZiAoc2l0ZUZlYXR1cmVzW2tdLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpLmVxdWFscyhmZWF0dXJlTmFtZSkpIHsKLQkJCQkJCQkJZmVhdHVyZXNbaV0gPSBzaXRlRmVhdHVyZXNba10uZ2V0RmVhdHVyZShudWxsKTsKLQkJCQkJCQkJCi0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCQotCQkJCQl9Ci0JCQkJfQotCQkJCWkrKzsKLQkJCX0KLQkJCQotCi0JCQlJT3BlcmF0aW9uIHVuaW5zdGFsbEZlYXR1cmVzT3BlcmF0aW9uID0KLQkJCQkoKE9wZXJhdGlvbkZhY3RvcnkpT3BlcmF0aW9uc01hbmFnZXIuZ2V0T3BlcmF0aW9uRmFjdG9yeSgpKS5jcmVhdGVVbmluc3RhbGxGZWF0dXJlc09wZXJhdGlvbiggY29uZmlndXJlZFNpdGVzLCBmZWF0dXJlcyk7Ci0KLQkJCXVuaW5zdGFsbEZlYXR1cmVzT3BlcmF0aW9uLmV4ZWN1dGUobnVsbCwgbnVsbCk7Ci0JCQkKLQkJCWYuZGVsZXRlKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotCQkJCi0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCQotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnNjaGVkdWxlci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NjaGVkdWxlci9TY2hlZHVsZXJTdGFydHVwLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnNjaGVkdWxlci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NjaGVkdWxlci9TY2hlZHVsZXJTdGFydHVwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxNjExZDIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5zY2hlZHVsZXIvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9zY2hlZHVsZXIvU2NoZWR1bGVyU3RhcnR1cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuc2NoZWR1bGVyOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklKb2JDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVN0YXJ0dXA7Ci0KLS8qKgotICogVGhpcyBwbHVnLWluIGlzIGxvYWRlZCBvbiBzdGFydHVwIHRvIGZvcmsgYSBqb2IgdGhhdCBzZWFyY2hlcyBmb3IgbmV3Ci0gKiBwbHVnLWlucy4KLSAqLwotcHVibGljIGNsYXNzIFNjaGVkdWxlclN0YXJ0dXAgaW1wbGVtZW50cyBJU3RhcnR1cCB7Ci0JLy8gUHJlZmVyZW5jZXMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQX0VOQUJMRUQgPSAiZW5hYmxlZCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBfU0NIRURVTEUgPSAic2NoZWR1bGUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9PTl9TVEFSVFVQID0gIm9uLXN0YXJ0dXAiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9PTl9TQ0hFRFVMRSA9ICJvbi1zY2hlZHVsZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBfRE9XTkxPQUQgPSAiZG93bmxvYWQiOyAvLyB2YWx1ZSBpcyB0cnVlIG9yIGZhbHNlLCBkZWZhdWx0IGlzZmFsc2UgLy8kTk9OLU5MUy0xJAotCi0JLy8gdmFsdWVzIGFyZSB0byBiZSBwaWNrZWQgdXAgZnJvbSB0aGUgYXJyeWFzIERBWVMgYW5kIEhPVVJTCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUF9EQVkgPSAiZGF5IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUF9IT1VSID0gImhvdXIiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBLZWVwcyB0cmFjayBvZiB0aGUgcnVubmluZyBqb2IKLQlwcml2YXRlIEpvYiBqb2I7Ci0KLQlzdGF0aWMgZmluYWwgT2JqZWN0IGF1dG9tYXRpY0pvYkZhbWlseSA9IG5ldyBPYmplY3QoKTsKLQotCS8vIExpc3RlbmVyIGZvciBqb2IgY2hhbmdlcwotCXByaXZhdGUgSUpvYkNoYW5nZUxpc3RlbmVyIGpvYkxpc3RlbmVyOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBEQVlTID0gewotCQkJVXBkYXRlU2NoZWR1bGVyTWVzc2FnZXMuU2NoZWR1bGVyU3RhcnR1cF9kYXksCi0JCQlVcGRhdGVTY2hlZHVsZXJNZXNzYWdlcy5TY2hlZHVsZXJTdGFydHVwX01vbmRheSwKLQkJCVVwZGF0ZVNjaGVkdWxlck1lc3NhZ2VzLlNjaGVkdWxlclN0YXJ0dXBfVHVlc2RheSwKLQkJCVVwZGF0ZVNjaGVkdWxlck1lc3NhZ2VzLlNjaGVkdWxlclN0YXJ0dXBfV2VkbmVzZGF5LAotCQkJVXBkYXRlU2NoZWR1bGVyTWVzc2FnZXMuU2NoZWR1bGVyU3RhcnR1cF9UaHVyc2RheSwKLQkJCVVwZGF0ZVNjaGVkdWxlck1lc3NhZ2VzLlNjaGVkdWxlclN0YXJ0dXBfRnJpZGF5LAotCQkJVXBkYXRlU2NoZWR1bGVyTWVzc2FnZXMuU2NoZWR1bGVyU3RhcnR1cF9TYXR1cmRheSwKLQkJCVVwZGF0ZVNjaGVkdWxlck1lc3NhZ2VzLlNjaGVkdWxlclN0YXJ0dXBfU3VuZGF5IH07Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEhPVVJTID0gewotCQkJVXBkYXRlU2NoZWR1bGVyTWVzc2FnZXMuU2NoZWR1bGVyU3RhcnR1cF8xQU0sCi0JCQlVcGRhdGVTY2hlZHVsZXJNZXNzYWdlcy5TY2hlZHVsZXJTdGFydHVwXzJBTSwKLQkJCVVwZGF0ZVNjaGVkdWxlck1lc3NhZ2VzLlNjaGVkdWxlclN0YXJ0dXBfM0FNLAotCQkJVXBkYXRlU2NoZWR1bGVyTWVzc2FnZXMuU2NoZWR1bGVyU3RhcnR1cF80QU0sCi0JCQlVcGRhdGVTY2hlZHVsZXJNZXNzYWdlcy5TY2hlZHVsZXJTdGFydHVwXzVBTSwKLQkJCVVwZGF0ZVNjaGVkdWxlck1lc3NhZ2VzLlNjaGVkdWxlclN0YXJ0dXBfNkFNLAotCQkJVXBkYXRlU2NoZWR1bGVyTWVzc2FnZXMuU2NoZWR1bGVyU3RhcnR1cF83QU0sCi0JCQlVcGRhdGVTY2hlZHVsZXJNZXNzYWdlcy5TY2hlZHVsZXJTdGFydHVwXzhBTSwKLQkJCVVwZGF0ZVNjaGVkdWxlck1lc3NhZ2VzLlNjaGVkdWxlclN0YXJ0dXBfOUFNLAotCQkJVXBkYXRlU2NoZWR1bGVyTWVzc2FnZXMuU2NoZWR1bGVyU3RhcnR1cF8xMEFNLAotCQkJVXBkYXRlU2NoZWR1bGVyTWVzc2FnZXMuU2NoZWR1bGVyU3RhcnR1cF8xMUFNLAotCQkJVXBkYXRlU2NoZWR1bGVyTWVzc2FnZXMuU2NoZWR1bGVyU3RhcnR1cF8xMlBNLAotCQkJVXBkYXRlU2NoZWR1bGVyTWVzc2FnZXMuU2NoZWR1bGVyU3RhcnR1cF8xUE0sCi0JCQlVcGRhdGVTY2hlZHVsZXJNZXNzYWdlcy5TY2hlZHVsZXJTdGFydHVwXzJQTSwKLQkJCVVwZGF0ZVNjaGVkdWxlck1lc3NhZ2VzLlNjaGVkdWxlclN0YXJ0dXBfM1BNLAotCQkJVXBkYXRlU2NoZWR1bGVyTWVzc2FnZXMuU2NoZWR1bGVyU3RhcnR1cF80UE0sCi0JCQlVcGRhdGVTY2hlZHVsZXJNZXNzYWdlcy5TY2hlZHVsZXJTdGFydHVwXzVQTSwKLQkJCVVwZGF0ZVNjaGVkdWxlck1lc3NhZ2VzLlNjaGVkdWxlclN0YXJ0dXBfNlBNLAotCQkJVXBkYXRlU2NoZWR1bGVyTWVzc2FnZXMuU2NoZWR1bGVyU3RhcnR1cF83UE0sCi0JCQlVcGRhdGVTY2hlZHVsZXJNZXNzYWdlcy5TY2hlZHVsZXJTdGFydHVwXzhQTSwKLQkJCVVwZGF0ZVNjaGVkdWxlck1lc3NhZ2VzLlNjaGVkdWxlclN0YXJ0dXBfOVBNLAotCQkJVXBkYXRlU2NoZWR1bGVyTWVzc2FnZXMuU2NoZWR1bGVyU3RhcnR1cF8xMFBNLAotCQkJVXBkYXRlU2NoZWR1bGVyTWVzc2FnZXMuU2NoZWR1bGVyU3RhcnR1cF8xMVBNLAotCQkJVXBkYXRlU2NoZWR1bGVyTWVzc2FnZXMuU2NoZWR1bGVyU3RhcnR1cF8xMkFNLCB9OwotCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBTY2hlZHVsZXJTdGFydHVwKCkgewotCQlVcGRhdGVTY2hlZHVsZXJQbHVnaW4uc2V0U2NoZWR1bGVyKHRoaXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIGVhcmx5U3RhcnR1cCgpIHsKLQkJc2NoZWR1bGVVcGRhdGVKb2IoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzY2hlZHVsZVVwZGF0ZUpvYigpIHsKLQkJUHJlZmVyZW5jZXMgcHJlZiA9IFVwZGF0ZVNjaGVkdWxlclBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJLy8gU2VlIGlmIGF1dG9tYXRpYyBzZWFyY2ggaXMgZW5hYmxlZCBhdCBhbGwKLQkJaWYgKHByZWYuZ2V0Qm9vbGVhbihQX0VOQUJMRUQpID09IGZhbHNlKQotCQkJcmV0dXJuOwotCi0JCVN0cmluZyBzY2hlZHVsZSA9IHByZWYuZ2V0U3RyaW5nKFBfU0NIRURVTEUpOwotCQlsb25nIGRlbGF5ID0gLTFMOwotCQlpZiAoc2NoZWR1bGUuZXF1YWxzKFZBTFVFX09OX1NUQVJUVVApKQotCQkJLy8gaGF2ZSB3ZSBhbHJlYWR5IHN0YXJ0ZWQgYSBqb2IgPwotCQkJaWYgKGpvYiA9PSBudWxsKQotCQkJCWRlbGF5ID0gMEw7Ci0JCQllbHNlCi0JCQkJZGVsYXkgPSAtMUw7Ci0JCWVsc2UKLQkJCWRlbGF5ID0gY29tcHV0ZURlbGF5KHByZWYpOwotCQlpZiAoZGVsYXkgPT0gLTFMKQotCQkJcmV0dXJuOwotCQlzdGFydFNlYXJjaChkZWxheSk7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgZ2V0RGF5KFByZWZlcmVuY2VzIHByZWYpIHsKLQkJU3RyaW5nIGRheSA9IHByZWYuZ2V0U3RyaW5nKFBfREFZKTsKLQkJZm9yIChpbnQgZCA9IDA7IGQgPCBEQVlTLmxlbmd0aDsgZCsrKQotCQkJaWYgKERBWVNbZF0uZXF1YWxzKGRheSkpCi0JCQkJc3dpdGNoIChkKSB7Ci0JCQkJY2FzZSAwOgotCQkJCQlyZXR1cm4gLTE7Ci0JCQkJY2FzZSAxOgotCQkJCQlyZXR1cm4gQ2FsZW5kYXIuTU9OREFZOwotCQkJCWNhc2UgMjoKLQkJCQkJcmV0dXJuIENhbGVuZGFyLlRVRVNEQVk7Ci0JCQkJY2FzZSAzOgotCQkJCQlyZXR1cm4gQ2FsZW5kYXIuV0VETkVTREFZOwotCQkJCWNhc2UgNDoKLQkJCQkJcmV0dXJuIENhbGVuZGFyLlRIVVJTREFZOwotCQkJCWNhc2UgNToKLQkJCQkJcmV0dXJuIENhbGVuZGFyLkZSSURBWTsKLQkJCQljYXNlIDY6Ci0JCQkJCXJldHVybiBDYWxlbmRhci5TQVRVUkRBWTsKLQkJCQljYXNlIDc6Ci0JCQkJCXJldHVybiBDYWxlbmRhci5TVU5EQVk7Ci0JCQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgZ2V0SG91cihQcmVmZXJlbmNlcyBwcmVmKSB7Ci0JCVN0cmluZyBob3VyID0gcHJlZi5nZXRTdHJpbmcoUF9IT1VSKTsKLQkJZm9yIChpbnQgaCA9IDA7IGggPCBIT1VSUy5sZW5ndGg7IGgrKykKLQkJCWlmIChIT1VSU1toXS5lcXVhbHMoaG91cikpCi0JCQkJcmV0dXJuIGggKyAxOwotCQlyZXR1cm4gMTsKLQl9Ci0KLQkvKgotCSAqIENvbXB1dGVzIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGZyb20gdGhpcyBtb21lbnQgdG8gdGhlIG5leHQKLQkgKiBzY2hlZHVsZWQgc2VhcmNoLiBJZiB0aGF0IG1vbWVudCBoYXMgYWxyZWFkeSBwYXNzZWQsIHJldHVybnMgMEwgKHN0YXJ0Ci0JICogaW1tZWRpYXRlbHkpLgotCSAqLwotCXByaXZhdGUgbG9uZyBjb21wdXRlRGVsYXkoUHJlZmVyZW5jZXMgcHJlZikgewotCi0JCWludCB0YXJnZXRfZCA9IGdldERheShwcmVmKTsKLQkJaW50IHRhcmdldF9oID0gZ2V0SG91cihwcmVmKTsKLQotCQlDYWxlbmRhciBjYWxlbmRhciA9IENhbGVuZGFyLmdldEluc3RhbmNlKCk7Ci0JCS8vIG1heSBuZWVkIHRvIHVzZSB0aGUgQm9vdExvYWRlciBsb2NhbGUKLQkJaW50IGN1cnJlbnRfZCA9IGNhbGVuZGFyLmdldChDYWxlbmRhci5EQVlfT0ZfV0VFSyk7Ci0JCS8vIHN0YXJ0cyB3aXRoIFNVTkRBWQotCQlpbnQgY3VycmVudF9oID0gY2FsZW5kYXIuZ2V0KENhbGVuZGFyLkhPVVJfT0ZfREFZKTsKLQkJaW50IGN1cnJlbnRfbSA9IGNhbGVuZGFyLmdldChDYWxlbmRhci5NSU5VVEUpOwotCQlpbnQgY3VycmVudF9zID0gY2FsZW5kYXIuZ2V0KENhbGVuZGFyLlNFQ09ORCk7Ci0JCWludCBjdXJyZW50X21zID0gY2FsZW5kYXIuZ2V0KENhbGVuZGFyLk1JTExJU0VDT05EKTsKLQotCQlsb25nIGRlbGF5ID0gMEw7IC8vIG1pbGxpc2Vjb25kcwotCi0JCWlmICh0YXJnZXRfZCA9PSAtMSkgewotCQkJLy8gQ29tcHV0ZSB0aGUgZGVsYXkgZm9yICJldmVyeSBkYXkgYXQgeCBvJ2Nsb2NrIgotCQkJLy8gSXMgaXQgbm93ID8KLQkJCWlmICh0YXJnZXRfaCA9PSBjdXJyZW50X2ggJiYgY3VycmVudF9tID09IDAgJiYgY3VycmVudF9zID09IDApCi0JCQkJcmV0dXJuIGRlbGF5OwotCi0JCQlpbnQgZGVsdGFfaCA9IHRhcmdldF9oIC0gY3VycmVudF9oOwotCQkJaWYgKHRhcmdldF9oIDw9IGN1cnJlbnRfaCkKLQkJCQlkZWx0YV9oICs9IDI0OwotCQkJZGVsYXkgPSAoKGRlbHRhX2ggKiA2MCAtIGN1cnJlbnRfbSkgKiA2MCAtIGN1cnJlbnRfcykgKiAxMDAwCi0JCQkJCS0gY3VycmVudF9tczsKLQkJCXJldHVybiBkZWxheTsKLQkJfSBlbHNlIHsKLQkJCS8vIENvbXB1dGUgdGhlIGRlbGF5IGZvciAiZXZlcnkgWGRheSBhdCB4IG8nY2xvY2siCi0JCQkvLyBJcyBpdCBub3cgPwotCQkJaWYgKHRhcmdldF9kID09IGN1cnJlbnRfZCAmJiB0YXJnZXRfaCA9PSBjdXJyZW50X2gKLQkJCQkJJiYgY3VycmVudF9tID09IDAgJiYgY3VycmVudF9zID09IDApCi0JCQkJcmV0dXJuIGRlbGF5OwotCi0JCQlpbnQgZGVsdGFfZCA9IHRhcmdldF9kIC0gY3VycmVudF9kOwotCQkJaWYgKHRhcmdldF9kIDwgY3VycmVudF9kCi0JCQkJCXx8IHRhcmdldF9kID09IGN1cnJlbnRfZAotCQkJCQkmJiAodGFyZ2V0X2ggPCBjdXJyZW50X2ggfHwgdGFyZ2V0X2ggPT0gY3VycmVudF9oCi0JCQkJCQkJJiYgY3VycmVudF9tID4gMCkpCi0JCQkJZGVsdGFfZCArPSA3OwotCi0JCQlkZWxheSA9ICgoKGRlbHRhX2QgKiAyNCArIHRhcmdldF9oIC0gY3VycmVudF9oKSAqIDYwIC0gY3VycmVudF9tKSAqIDYwIC0gY3VycmVudF9zKQotCQkJCQkqIDEwMDAgLSBjdXJyZW50X21zOwotCi0JCQlyZXR1cm4gZGVsYXk7Ci0JCX0KLQkJLy8gcmV0dXJuIC0xTDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3RhcnRTZWFyY2gobG9uZyBkZWxheSkgewotCQlpZiAoam9iICE9IG51bGwpIHsKLQkJCS8vIGNhbmNlbCBvbGQgam9iLgotCQkJLy8gV2UgbmVlZCB0byBkZXJlZ2lzdGVyIHRoZSBsaXN0ZW5lciBmaXJzdCxzbyB3ZSB3b24ndAotCQkJLy8gYXV0b21hdGljYWxseSBzdGFydCBhbm90aGVyIGpvYgotCQkJaWYgKGpvYkxpc3RlbmVyICE9IG51bGwpCi0JCQkJSm9iLmdldEpvYk1hbmFnZXIoKS5yZW1vdmVKb2JDaGFuZ2VMaXN0ZW5lcihqb2JMaXN0ZW5lcik7Ci0JCQlKb2IuZ2V0Sm9iTWFuYWdlcigpLmNhbmNlbChhdXRvbWF0aWNKb2JGYW1pbHkpOwotCQl9Ci0JCWlmIChqb2JMaXN0ZW5lciA9PSBudWxsKSB7Ci0JCQkvLyB1c2luZyByZWZsZWN0aW9uIHRvIGF2b2lkIHByZW1hdHVyZSBjbGFzcyBsb2FkaW5nCi0JCQlqb2JMaXN0ZW5lciA9IGNyZWF0ZUpvYkNoYW5nZUFkYXB0ZXIoKTsKLQkJCWlmIChqb2JMaXN0ZW5lciA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJfQotCQlKb2IuZ2V0Sm9iTWFuYWdlcigpLmFkZEpvYkNoYW5nZUxpc3RlbmVyKGpvYkxpc3RlbmVyKTsKLQkJU3RyaW5nIGpvYk5hbWUgPSBVcGRhdGVTY2hlZHVsZXJNZXNzYWdlcy5BdXRvbWF0aWNVcGRhdGVzSm9iX0F1dG9tYXRpY1VwZGF0ZVNlYXJjaDsgLy8pOwotCQlib29sZWFuIGRvd25sb2FkID0gVXBkYXRlU2NoZWR1bGVyUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldEJvb2xlYW4oCi0JCQkJCQlVcGRhdGVTY2hlZHVsZXJQbHVnaW4uUF9ET1dOTE9BRCk7Ci0JCWpvYiA9IGNyZWF0ZVVwZGF0ZUpvYihqb2JOYW1lLCBkb3dubG9hZCk7Ci0JCWlmIChqb2IgIT0gbnVsbCkKLQkJCWpvYi5zY2hlZHVsZShkZWxheSk7Ci0KLQl9Ci0KLQkvKgotCSAqIExvYWRzIHRoZSB1cGRhdGUgam9iIHVzaW5nIHJlZmxlY3Rpb24gdG8gYXZvaWQgcHJlbWF0dXJlIHN0YXJ0dXAgb2YgdGhlCi0JICogVXBkYXRlIFVJIHBsdWctaW4uCi0JICovCi0KLQlwcml2YXRlIEpvYiBjcmVhdGVVcGRhdGVKb2IoU3RyaW5nIG5hbWUsIGJvb2xlYW4gZG93bmxvYWQpIHsKLQkJdHJ5IHsKLQkJCUNsYXNzIHRoZUNsYXNzID0gQ2xhc3MKLQkJCQkJLmZvck5hbWUoIm9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5zY2hlZHVsZXIuQXV0b21hdGljVXBkYXRlSm9iIik7IC8vJE5PTi1OTFMtMSQKLQkJCUNvbnN0cnVjdG9yIGNvbnN0cnVjdG9yID0gdGhlQ2xhc3MuZ2V0Q29uc3RydWN0b3IobmV3IENsYXNzW10gewotCQkJCQlTdHJpbmcuY2xhc3MsIEJvb2xlYW4uVFlQRSwgQm9vbGVhbi5UWVBFIH0pOwotCQkJcmV0dXJuIChKb2IpIGNvbnN0cnVjdG9yLm5ld0luc3RhbmNlKG5ldyBPYmplY3RbXSB7IG5hbWUsCi0JCQkJCUJvb2xlYW4uVFJVRSwgbmV3IEJvb2xlYW4oZG93bmxvYWQpIH0pOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVXBkYXRlU2NoZWR1bGVyUGx1Z2luLmxvZ0V4Y2VwdGlvbihlLCBmYWxzZSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qCi0JICogTG9hZHMgdGhlIGpvYiBsaXN0ZW5lciB1c2luZyByZWZsZWN0aW9uIHRvIGF2b2lkIHByZW1hdHVyZSBzdGFydHVwIG9mIHRoZQotCSAqIFVwZGF0ZSBVSSBwbHVnLWluLgotCSAqLwotCXByaXZhdGUgSUpvYkNoYW5nZUxpc3RlbmVyIGNyZWF0ZUpvYkNoYW5nZUFkYXB0ZXIoKSB7Ci0JCXRyeSB7Ci0JCQlDbGFzcyB0aGVDbGFzcyA9IENsYXNzCi0JCQkJCS5mb3JOYW1lKCJvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuc2NoZWR1bGVyLlVwZGF0ZUpvYkNoYW5nZUFkYXB0ZXIiKTsgLy8kTk9OLU5MUy0xJAotCQkJQ29uc3RydWN0b3IgY29uc3RydWN0b3IgPSB0aGVDbGFzcwotCQkJCQkuZ2V0Q29uc3RydWN0b3IobmV3IENsYXNzW10geyBTY2hlZHVsZXJTdGFydHVwLmNsYXNzIH0pOwotCQkJcmV0dXJuIChJSm9iQ2hhbmdlTGlzdGVuZXIpIGNvbnN0cnVjdG9yCi0JCQkJCS5uZXdJbnN0YW5jZShuZXcgT2JqZWN0W10geyB0aGlzIH0pOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVXBkYXRlU2NoZWR1bGVyUGx1Z2luLmxvZ0V4Y2VwdGlvbihlLCBmYWxzZSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCUpvYiBnZXRKb2IoKSB7Ci0JCXJldHVybiBqb2I7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuc2NoZWR1bGVyL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvc2NoZWR1bGVyL1VwZGF0ZUpvYkNoYW5nZUFkYXB0ZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuc2NoZWR1bGVyL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvc2NoZWR1bGVyL1VwZGF0ZUpvYkNoYW5nZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ0NzNjNC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnNjaGVkdWxlci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NjaGVkdWxlci9VcGRhdGVKb2JDaGFuZ2VBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5zY2hlZHVsZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JSm9iQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iQ2hhbmdlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLlVwZGF0ZVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS53aXphcmRzLkluc3RhbGxXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLndpemFyZHMuSW5zdGFsbFdpemFyZDI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLndpemFyZHMuUmVzaXphYmxlSW5zdGFsbFdpemFyZERpYWxvZzsKLQotY2xhc3MgVXBkYXRlSm9iQ2hhbmdlQWRhcHRlciBleHRlbmRzIEpvYkNoYW5nZUFkYXB0ZXIgewotCXByaXZhdGUgU2NoZWR1bGVyU3RhcnR1cCBzdGFydHVwOwotCi0JcHVibGljIFVwZGF0ZUpvYkNoYW5nZUFkYXB0ZXIoU2NoZWR1bGVyU3RhcnR1cCBzdGFydHVwKSB7Ci0JCXRoaXMuc3RhcnR1cCA9IHN0YXJ0dXA7Ci0JfQotCi0JcHVibGljIHZvaWQgZG9uZShJSm9iQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50LmdldEpvYigpID09IHN0YXJ0dXAuZ2V0Sm9iKCkpIHsKLQotCQkJLy8gcHJvbXB0IHRoZSB1c2VyCi0JCQlpZiAoKChBdXRvbWF0aWNVcGRhdGVKb2IpIHN0YXJ0dXAuZ2V0Sm9iKCkpLmdldFVwZGF0ZXMoKS5sZW5ndGggPiAwCi0JCQkJCSYmICFJbnN0YWxsV2l6YXJkLmlzUnVubmluZygpKSB7Ci0JCQkJaWYgKFVwZGF0ZVNjaGVkdWxlclBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKQotCQkJCQkJLmdldEJvb2xlYW4oVXBkYXRlU2NoZWR1bGVyUGx1Z2luLlBfRE9XTkxPQUQpKSB7Ci0JCQkJCVVwZGF0ZVVJLmdldFN0YW5kYXJkRGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJYXN5bmNOb3RpZnlEb3dubG9hZFVzZXIoKTsKLQkJCQkJCQlzdGFydHVwLnNjaGVkdWxlVXBkYXRlSm9iKCk7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCX0gZWxzZSB7Ci0JCQkJCVVwZGF0ZVVJLmdldFN0YW5kYXJkRGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJYXN5bmNOb3RpZnlVc2VyKCk7Ci0JCQkJCQkJc3RhcnR1cC5zY2hlZHVsZVVwZGF0ZUpvYigpOwotCQkJCQkJfQotCQkJCQl9KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYXN5bmNOb3RpZnlVc2VyKCkgewotCQkvLyBhc2sgdGhlIHVzZXIgdG8gaW5zdGFsbCB1cGRhdGVzCi0JCVVwZGF0ZVVJLmdldFN0YW5kYXJkRGlzcGxheSgpLmJlZXAoKTsKLQkJaWYgKE1lc3NhZ2VEaWFsb2cub3BlblF1ZXN0aW9uKFVwZGF0ZVVJLmdldEFjdGl2ZVdvcmtiZW5jaFNoZWxsKCksCi0JCQkJVXBkYXRlVUlNZXNzYWdlcy5BdXRvbWF0aWNVcGRhdGVzSm9iX0VjbGlwc2VVcGRhdGVzMSwKLQkJCQlVcGRhdGVVSU1lc3NhZ2VzLkF1dG9tYXRpY1VwZGF0ZXNKb2JfVXBkYXRlc0F2YWlsYWJsZSkpIHsKLQkJCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKFVwZGF0ZVVJLmdldFN0YW5kYXJkRGlzcGxheSgpLAotCQkJCQluZXcgUnVubmFibGUoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJb3Blbkluc3RhbGxXaXphcmQyKCk7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQl9Ci0JCS8vIG5vdGlmeSB0aGUgbWFuYWdlciB0aGF0IHRoZSBqb2IgaXMgZG9uZQotCQkvLyBqb2IuZG9uZShTdGF0dXMuT0tfU1RBVFVTKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYXN5bmNOb3RpZnlEb3dubG9hZFVzZXIoKSB7Ci0JCS8vIGFzayB0aGUgdXNlciB0byBpbnN0YWxsIHVwZGF0ZXMKLQkJVXBkYXRlVUkuZ2V0U3RhbmRhcmREaXNwbGF5KCkuYmVlcCgpOwotCQlpZiAoTWVzc2FnZURpYWxvZy5vcGVuUXVlc3Rpb24oVXBkYXRlVUkuZ2V0QWN0aXZlV29ya2JlbmNoU2hlbGwoKSwKLQkJCQlVcGRhdGVVSU1lc3NhZ2VzLkF1dG9tYXRpY1VwZGF0ZXNKb2JfRWNsaXBzZVVwZGF0ZXMyLAotCQkJCVVwZGF0ZVVJTWVzc2FnZXMuQXV0b21hdGljVXBkYXRlc0pvYl9VcGRhdGVzRG93bmxvYWRlZCkpIHsKLQkJCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKFVwZGF0ZVVJLmdldFN0YW5kYXJkRGlzcGxheSgpLAotCQkJCQluZXcgUnVubmFibGUoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJb3Blbkluc3RhbGxXaXphcmQyKCk7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQl9IGVsc2UgewotCQkJLy8gRG9uJ3QgZGlzY2FyZCBkb3dubG9hZGVkIGRhdGEsIGFzIG5leHQgdGltZSB3ZSBjb21wYXJlCi0JCQkvLyB0aW1lc3RhbXBzLgotCi0JCQkvLyBkaXNjYXJkIGFsbCB0aGUgZG93bmxvYWRlZCBkYXRhIGZyb20gY2FjaGUgKG1heSBpbmNsdWRlIG9sZAotCQkJLy8gZGF0YSBhcyB3ZWxsKQotCQkJLy8gVXRpbGl0aWVzLmZsdXNoTG9jYWxGaWxlKCk7Ci0JCX0KLQkJLy8gbm90aWZ5IHRoZSBtYW5hZ2VyIHRoYXQgdGhlIGpvYiBpcyBkb25lCi0JCS8vIGpvYi5kb25lKFN0YXR1cy5PS19TVEFUVVMpOwotCX0KLQotCXByaXZhdGUgdm9pZCBvcGVuSW5zdGFsbFdpemFyZDIoKSB7Ci0JCWlmIChJbnN0YWxsV2l6YXJkLmlzUnVubmluZygpKQotCQkJLy8gam9iIGVuZHMgYW5kIGEgbmV3IG9uZSBpcyByZXNjaGVkdWxlZAotCQkJcmV0dXJuOwotCQlBdXRvbWF0aWNVcGRhdGVKb2IgdWpvYiA9IChBdXRvbWF0aWNVcGRhdGVKb2IpIHN0YXJ0dXAuZ2V0Sm9iKCk7Ci0JCUluc3RhbGxXaXphcmQyIHdpemFyZCA9IG5ldyBJbnN0YWxsV2l6YXJkMih1am9iLmdldFNlYXJjaFJlcXVlc3QoKSwKLQkJCQl1am9iLmdldFVwZGF0ZXMoKSwgdHJ1ZSk7Ci0JCVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgUmVzaXphYmxlSW5zdGFsbFdpemFyZERpYWxvZyhVcGRhdGVVSQotCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hTaGVsbCgpLCB3aXphcmQsCi0JCQkJVXBkYXRlVUlNZXNzYWdlcy5BdXRvbWF0aWNVcGRhdGVzSm9iX1VwZGF0ZXMpOwotCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCWRpYWxvZy5vcGVuKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnNjaGVkdWxlci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NjaGVkdWxlci9VcGRhdGVTY2hlZHVsZXJNZXNzYWdlcy5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5zY2hlZHVsZXIvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9zY2hlZHVsZXIvVXBkYXRlU2NoZWR1bGVyTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg4YWY4MC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnNjaGVkdWxlci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NjaGVkdWxlci9VcGRhdGVTY2hlZHVsZXJNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5zY2hlZHVsZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgVXBkYXRlU2NoZWR1bGVyTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5zY2hlZHVsZXIuVXBkYXRlU2NoZWR1bGVyUmVzb3VyY2VzIjsvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFVwZGF0ZVNjaGVkdWxlck1lc3NhZ2VzKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTY2hlZHVsZXJTdGFydHVwX2RheTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTY2hlZHVsZXJTdGFydHVwX01vbmRheTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTY2hlZHVsZXJTdGFydHVwX1R1ZXNkYXk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2NoZWR1bGVyU3RhcnR1cF9XZWRuZXNkYXk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2NoZWR1bGVyU3RhcnR1cF9UaHVyc2RheTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTY2hlZHVsZXJTdGFydHVwX0ZyaWRheTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTY2hlZHVsZXJTdGFydHVwX1NhdHVyZGF5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNjaGVkdWxlclN0YXJ0dXBfU3VuZGF5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNjaGVkdWxlclN0YXJ0dXBfMUFNOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNjaGVkdWxlclN0YXJ0dXBfMkFNOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNjaGVkdWxlclN0YXJ0dXBfM0FNOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNjaGVkdWxlclN0YXJ0dXBfNEFNOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNjaGVkdWxlclN0YXJ0dXBfNUFNOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNjaGVkdWxlclN0YXJ0dXBfNkFNOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNjaGVkdWxlclN0YXJ0dXBfN0FNOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNjaGVkdWxlclN0YXJ0dXBfOEFNOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNjaGVkdWxlclN0YXJ0dXBfOUFNOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNjaGVkdWxlclN0YXJ0dXBfMTBBTTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTY2hlZHVsZXJTdGFydHVwXzExQU07Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2NoZWR1bGVyU3RhcnR1cF8xMlBNOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNjaGVkdWxlclN0YXJ0dXBfMVBNOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNjaGVkdWxlclN0YXJ0dXBfMlBNOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNjaGVkdWxlclN0YXJ0dXBfM1BNOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNjaGVkdWxlclN0YXJ0dXBfNFBNOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNjaGVkdWxlclN0YXJ0dXBfNVBNOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNjaGVkdWxlclN0YXJ0dXBfNlBNOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNjaGVkdWxlclN0YXJ0dXBfN1BNOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNjaGVkdWxlclN0YXJ0dXBfOFBNOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNjaGVkdWxlclN0YXJ0dXBfOVBNOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNjaGVkdWxlclN0YXJ0dXBfMTBQTTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTY2hlZHVsZXJTdGFydHVwXzExUE07Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2NoZWR1bGVyU3RhcnR1cF8xMkFNOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF1dG9tYXRpY1VwZGF0ZXNKb2JfQXV0b21hdGljVXBkYXRlU2VhcmNoOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF1dG9tYXRpY1VwZGF0ZXNQcmVmZXJlbmNlUGFnZV9maW5kVXBkYXRlczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdXRvbWF0aWNVcGRhdGVzUHJlZmVyZW5jZVBhZ2VfVXBkYXRlU2NoZWR1bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXV0b21hdGljVXBkYXRlc1ByZWZlcmVuY2VQYWdlX2ZpbmRPblN0YXJ0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF1dG9tYXRpY1VwZGF0ZXNQcmVmZXJlbmNlUGFnZV9maW5kT25TY2hlZHVsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdXRvbWF0aWNVcGRhdGVzUHJlZmVyZW5jZVBhZ2VfZG93bmxvYWRPcHRpb25zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF1dG9tYXRpY1VwZGF0ZXNQcmVmZXJlbmNlUGFnZV9zZWFyY2hBbmROb3RpZnk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXV0b21hdGljVXBkYXRlc1ByZWZlcmVuY2VQYWdlX2Rvd25sb2FkQW5kTm90aWZ5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF1dG9tYXRpY1VwZGF0ZXNKb2JfRWNsaXBzZVVwZGF0ZXMxOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF1dG9tYXRpY1VwZGF0ZXNKb2JfVXBkYXRlc0F2YWlsYWJsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdXRvbWF0aWNVcGRhdGVzSm9iX0VjbGlwc2VVcGRhdGVzMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdXRvbWF0aWNVcGRhdGVzUHJlZmVyZW5jZVBhZ2VfYXQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXV0b21hdGljVXBkYXRlc0pvYl9VcGRhdGVzRG93bmxvYWRlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdXRvbWF0aWNVcGRhdGVzSm9iX1VwZGF0ZXM7Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBVcGRhdGVTY2hlZHVsZXJNZXNzYWdlcy5jbGFzcyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuc2NoZWR1bGVyL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvc2NoZWR1bGVyL1VwZGF0ZVNjaGVkdWxlclBsdWdpbi5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5zY2hlZHVsZXIvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9zY2hlZHVsZXIvVXBkYXRlU2NoZWR1bGVyUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyZDU2YmIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5zY2hlZHVsZXIvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9zY2hlZHVsZXIvVXBkYXRlU2NoZWR1bGVyUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5zY2hlZHVsZXI7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC4qOwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uKjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuKjsKLQotLyoqCi0gKiBUaGlzIHBsdWctaW4gaXMgbG9hZGVkIG9uIHN0YXJ0dXAgdG8gZm9yayBhIGpvYiB0aGF0Ci0gKiBzZWFyY2hlcyBmb3IgbmV3IHBsdWctaW5zLgotICovCi1wdWJsaWMgY2xhc3MgVXBkYXRlU2NoZWR1bGVyUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbnsKLQkvLyBQcmVmZXJlbmNlcwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBfRU5BQkxFRCA9ICJlbmFibGVkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBfU0NIRURVTEUgPSAic2NoZWR1bGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfT05fU1RBUlRVUCA9ICJvbi1zdGFydHVwIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX09OX1NDSEVEVUxFID0gIm9uLXNjaGVkdWxlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBfRE9XTkxPQUQgPSAiZG93bmxvYWQiOyAvLyB2YWx1ZSBpcyB0cnVlIG9yIGZhbHNlLCBkZWZhdWx0IGlzIGZhbHNlIC8vJE5PTi1OTFMtMSQKLQotCS8vVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBVcGRhdGVTY2hlZHVsZXJQbHVnaW4gcGx1Z2luOwotCS8vUmVzb3VyY2UgYnVuZGxlLgotCXByaXZhdGUgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGU7Ci0JCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgU2NoZWR1bGVyU3RhcnR1cCBzY2hlZHVsZXI7Ci0KLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIFVwZGF0ZVNjaGVkdWxlclBsdWdpbigpIHsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQotCXB1YmxpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKLQkJaWYgKHJlc291cmNlQnVuZGxlID09IG51bGwpCi0JCQl0cnkgewotCQkJCXJlc291cmNlQnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuc2NoZWR1bGVyLlVwZGF0ZVNjaGVkdWxlclJlc291cmNlcyIpOyAvLyROT04tTkxTLTEkCi0JCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24geCkgewotCQkJCXJlc291cmNlQnVuZGxlID0gbnVsbDsKLQkJCX0KLQkJcmV0dXJuIHJlc291cmNlQnVuZGxlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFVwZGF0ZVNjaGVkdWxlclBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFBsdWdpbklkKCkgewotCQlyZXR1cm4gZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFeGNlcHRpb24oVGhyb3dhYmxlIGUpIHsKLQkJbG9nRXhjZXB0aW9uKGUsIHRydWUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFeGNlcHRpb24oVGhyb3dhYmxlIGUsIGJvb2xlYW4gc2hvd0Vycm9yRGlhbG9nKSB7Ci0JCWlmIChlIGluc3RhbmNlb2YgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbikgewotCQkJZSA9ICgoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbikgZSkuZ2V0VGFyZ2V0RXhjZXB0aW9uKCk7Ci0JCX0KLQotCQlJU3RhdHVzIHN0YXR1cyA9IG51bGw7Ci0JCWlmIChlIGluc3RhbmNlb2YgQ29yZUV4Y2VwdGlvbikgewotCQkJc3RhdHVzID0gKChDb3JlRXhjZXB0aW9uKSBlKS5nZXRTdGF0dXMoKTsKLQkJfSBlbHNlIHsKLQkJCVN0cmluZyBtZXNzYWdlID0gZS5nZXRNZXNzYWdlKCk7Ci0JCQlpZiAobWVzc2FnZSA9PSBudWxsKQotCQkJCW1lc3NhZ2UgPSBlLnRvU3RyaW5nKCk7Ci0JCQlzdGF0dXMgPQotCQkJCW5ldyBTdGF0dXMoCi0JCQkJCUlTdGF0dXMuRVJST1IsCi0JCQkJCWdldFBsdWdpbklkKCksCi0JCQkJCUlTdGF0dXMuT0ssCi0JCQkJCW1lc3NhZ2UsCi0JCQkJCWUpOwotCQl9Ci0JCWxvZyhzdGF0dXMsIHNob3dFcnJvckRpYWxvZyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhJU3RhdHVzIHN0YXR1cywgYm9vbGVhbiBzaG93RXJyb3JEaWFsb2cpIHsKLQkJaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpICE9IElTdGF0dXMuSU5GTykgewotCQkJaWYgKHNob3dFcnJvckRpYWxvZykKLQkJCQlFcnJvckRpYWxvZy5vcGVuRXJyb3IoCi0JCQkJCWdldEFjdGl2ZVdvcmtiZW5jaFNoZWxsKCksCi0JCQkJCW51bGwsCi0JCQkJCW51bGwsCi0JCQkJCXN0YXR1cyk7Ci0vLwkJCSBTaG91bGQgbG9nIG9uIHRoZSB1cGRhdGUgcGx1Z2luJ3MgbG9nCi0vLwkJCVBsYXRmb3JtLmdldFBsdWdpbigib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIikuZ2V0TG9nKCkubG9nKHN0YXR1cyk7IC8vJE5PTi1OTFMtMSQKLQkJCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoIm9yZy5lY2xpcHNlLnVwZGF0ZS5zY2hlZHVsZXIiKTsgIC8vJE5PTi1OTFMtMSQKLQkJCVBsYXRmb3JtLmdldExvZyhidW5kbGUpLmxvZyhzdGF0dXMpOwotCQl9IGVsc2UgewotCQkJTWVzc2FnZURpYWxvZy5vcGVuSW5mb3JtYXRpb24oCi0JCQkJZ2V0QWN0aXZlV29ya2JlbmNoU2hlbGwoKSwKLQkJCQludWxsLAotCQkJCXN0YXR1cy5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJV29ya2JlbmNoUGFnZSBnZXRBY3RpdmVQYWdlKCkgewotCQlVcGRhdGVTY2hlZHVsZXJQbHVnaW4gcGx1Z2luID0gZ2V0RGVmYXVsdCgpOwotCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9Ci0JCQlwbHVnaW4uZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCWlmICh3aW5kb3cgIT0gbnVsbCkKLQkJCXJldHVybiB3aW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFNoZWxsIGdldEFjdGl2ZVdvcmtiZW5jaFNoZWxsKCkgewotCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IGdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQlyZXR1cm4gd2luZG93ICE9IG51bGwgPyB3aW5kb3cuZ2V0U2hlbGwoKSA6IG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJV29ya2JlbmNoV2luZG93IGdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpIHsKLQkJcmV0dXJuIGdldERlZmF1bHQoKS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQWN0aXZhdG9yI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFNjaGVkdWxlclN0YXJ0dXAgZ2V0U2NoZWR1bGVyKCkgewotCQkvLyBJZiB0aGUgc2NoZWR1bGVyIHdhcyBkaXNhYmxlZCwgaXQgZG9lcyBub3QgZ2V0IGluaXRpYWxpemVkCi0JCWlmIChzY2hlZHVsZXIgPT0gbnVsbCkKLQkJCXNjaGVkdWxlciA9IG5ldyBTY2hlZHVsZXJTdGFydHVwKCk7Ci0JCXJldHVybiBzY2hlZHVsZXI7Ci0JfQotCQotCXN0YXRpYyB2b2lkIHNldFNjaGVkdWxlcihTY2hlZHVsZXJTdGFydHVwIHNjaGVkdWxlcikgewotCQlVcGRhdGVTY2hlZHVsZXJQbHVnaW4uc2NoZWR1bGVyID0gc2NoZWR1bGVyOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuc2NoZWR1bGVyL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvc2NoZWR1bGVyL1VwZGF0ZVNjaGVkdWxlclJlc291cmNlcy5wcm9wZXJ0aWVzIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5zY2hlZHVsZXIvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9zY2hlZHVsZXIvVXBkYXRlU2NoZWR1bGVyUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwYTQ2NWEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5zY2hlZHVsZXIvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9zY2hlZHVsZXIvVXBkYXRlU2NoZWR1bGVyUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jTWVzc2FnZXMgZm9yIFVwZGF0ZSBTY2hlZHVsZXIgcGx1Zy1pbgotCi1TY2hlZHVsZXJTdGFydHVwX2RheT1FdmVyeSBkYXkKLVNjaGVkdWxlclN0YXJ0dXBfTW9uZGF5PUV2ZXJ5IE1vbmRheQotU2NoZWR1bGVyU3RhcnR1cF9UdWVzZGF5PUV2ZXJ5IFR1ZXNkYXkKLVNjaGVkdWxlclN0YXJ0dXBfV2VkbmVzZGF5PUV2ZXJ5IFdlZG5lc2RheQotU2NoZWR1bGVyU3RhcnR1cF9UaHVyc2RheT1FdmVyeSBUaHVyc2RheQotU2NoZWR1bGVyU3RhcnR1cF9GcmlkYXk9RXZlcnkgRnJpZGF5Ci1TY2hlZHVsZXJTdGFydHVwX1NhdHVyZGF5PUV2ZXJ5IFNhdHVyZGF5Ci1TY2hlZHVsZXJTdGFydHVwX1N1bmRheT1FdmVyeSBTdW5kYXkKLVNjaGVkdWxlclN0YXJ0dXBfMUFNPTE6MDAgQU0KLVNjaGVkdWxlclN0YXJ0dXBfMkFNPTI6MDAgQU0KLVNjaGVkdWxlclN0YXJ0dXBfM0FNPTM6MDAgQU0KLVNjaGVkdWxlclN0YXJ0dXBfNEFNPTQ6MDAgQU0KLVNjaGVkdWxlclN0YXJ0dXBfNUFNPTU6MDAgQU0KLVNjaGVkdWxlclN0YXJ0dXBfNkFNPTY6MDAgQU0KLVNjaGVkdWxlclN0YXJ0dXBfN0FNPTc6MDAgQU0KLVNjaGVkdWxlclN0YXJ0dXBfOEFNPTg6MDAgQU0KLVNjaGVkdWxlclN0YXJ0dXBfOUFNPTk6MDAgQU0KLVNjaGVkdWxlclN0YXJ0dXBfMTBBTT0xMDowMCBBTQotU2NoZWR1bGVyU3RhcnR1cF8xMUFNPTExOjAwIEFNCi1TY2hlZHVsZXJTdGFydHVwXzEyUE09MTI6MDAgUE0KLVNjaGVkdWxlclN0YXJ0dXBfMVBNPTE6MDAgUE0KLVNjaGVkdWxlclN0YXJ0dXBfMlBNPTI6MDAgUE0KLVNjaGVkdWxlclN0YXJ0dXBfM1BNPTM6MDAgUE0KLVNjaGVkdWxlclN0YXJ0dXBfNFBNPTQ6MDAgUE0KLVNjaGVkdWxlclN0YXJ0dXBfNVBNPTU6MDAgUE0KLVNjaGVkdWxlclN0YXJ0dXBfNlBNPTY6MDAgUE0KLVNjaGVkdWxlclN0YXJ0dXBfN1BNPTc6MDAgUE0KLVNjaGVkdWxlclN0YXJ0dXBfOFBNPTg6MDAgUE0KLVNjaGVkdWxlclN0YXJ0dXBfOVBNPTk6MDAgUE0KLVNjaGVkdWxlclN0YXJ0dXBfMTBQTT0xMDowMCBQTQotU2NoZWR1bGVyU3RhcnR1cF8xMVBNPTExOjAwIFBNCi1TY2hlZHVsZXJTdGFydHVwXzEyQU09MTI6MDAgQU0KLUF1dG9tYXRpY1VwZGF0ZXNKb2JfQXV0b21hdGljVXBkYXRlU2VhcmNoPUF1dG9tYXRpYyBVcGRhdGUgU2VhcmNoCi1BdXRvbWF0aWNVcGRhdGVzUHJlZmVyZW5jZVBhZ2VfZmluZFVwZGF0ZXM9QXV0b21hdGljYWxseSAmZmluZCBuZXcgdXBkYXRlcyBhbmQgbm90aWZ5IG1lCi1BdXRvbWF0aWNVcGRhdGVzUHJlZmVyZW5jZVBhZ2VfVXBkYXRlU2NoZWR1bGU9VXBkYXRlICZTY2hlZHVsZQotQXV0b21hdGljVXBkYXRlc1ByZWZlcmVuY2VQYWdlX2ZpbmRPblN0YXJ0PUxvb2sgZm9yIHVwZGF0ZXMgZWFjaCB0aW1lICZwbGF0Zm9ybSBpcyBzdGFydGVkCi1BdXRvbWF0aWNVcGRhdGVzUHJlZmVyZW5jZVBhZ2VfZmluZE9uU2NoZWR1bGU9Jkxvb2sgZm9yIHVwZGF0ZXMgb24gdGhlIGZvbGxvd2luZyBzY2hlZHVsZToKLUF1dG9tYXRpY1VwZGF0ZXNQcmVmZXJlbmNlUGFnZV9kb3dubG9hZE9wdGlvbnM9RG93bmxvYWQgJk9wdGlvbnMKLUF1dG9tYXRpY1VwZGF0ZXNQcmVmZXJlbmNlUGFnZV9zZWFyY2hBbmROb3RpZnk9U2VhcmNoIGZvciB1cGRhdGVzIGFuZCAmbm90aWZ5IG1lIHdoZW4gdGhleSBhcmUgYXZhaWxhYmxlCi1BdXRvbWF0aWNVcGRhdGVzUHJlZmVyZW5jZVBhZ2VfZG93bmxvYWRBbmROb3RpZnk9RG93bmxvYWQgbmV3ICZ1cGRhdGVzIGF1dG9tYXRpY2FsbHkgYW5kIG5vdGlmeSBtZSB3aGVuIHJlYWR5IHRvIGluc3RhbGwgdGhlbQotQXV0b21hdGljVXBkYXRlc0pvYl9FY2xpcHNlVXBkYXRlczE9QXV0b21hdGljIFVwZGF0ZXMKLUF1dG9tYXRpY1VwZGF0ZXNKb2JfVXBkYXRlc0F2YWlsYWJsZT1OZXcgdXBkYXRlcyBhcmUgYXZhaWxhYmxlLiBEbyB5b3Ugd2FudCB0byByZXZpZXcgYW5kIGluc3RhbGwgdGhlbSBub3c/Ci1BdXRvbWF0aWNVcGRhdGVzSm9iX0VjbGlwc2VVcGRhdGVzMj1BdXRvbWF0aWMgVXBkYXRlcwotQXV0b21hdGljVXBkYXRlc1ByZWZlcmVuY2VQYWdlX2F0PWF0Ci1BdXRvbWF0aWNVcGRhdGVzSm9iX1VwZGF0ZXNEb3dubG9hZGVkPU5ldyB1cGRhdGVzIGFyZSBhdmFpbGFibGUgYW5kIGRvd25sb2FkZWQuIERvIHlvdSB3YW50IHRvIHJldmlldyBhbmQgaW5zdGFsbCB0aGVtIG5vdz8KLUF1dG9tYXRpY1VwZGF0ZXNKb2JfVXBkYXRlcz1VcGRhdGVzCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnNjaGVkdWxlci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NjaGVkdWxlci9wcmVmZXJlbmNlcy9BdXRvbWF0aWNVcGRhdGVzUHJlZmVyZW5jZVBhZ2UuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuc2NoZWR1bGVyL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvc2NoZWR1bGVyL3ByZWZlcmVuY2VzL0F1dG9tYXRpY1VwZGF0ZXNQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2U3YjBhLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuc2NoZWR1bGVyL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvc2NoZWR1bGVyL3ByZWZlcmVuY2VzL0F1dG9tYXRpY1VwZGF0ZXNQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuc2NoZWR1bGVyLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuc2NoZWR1bGVyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnNjaGVkdWxlci5VcGRhdGVTY2hlZHVsZXJQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBBdXRvbWF0aWNVcGRhdGVzUHJlZmVyZW5jZVBhZ2UKLQlleHRlbmRzIFByZWZlcmVuY2VQYWdlCi0JaW1wbGVtZW50cyBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UgewotCi0JcHJpdmF0ZSBCdXR0b24gZW5hYmxlZENoZWNrOwotCXByaXZhdGUgQnV0dG9uIG9uU3RhcnR1cFJhZGlvOwotCXByaXZhdGUgQnV0dG9uIG9uU2NoZWR1bGVSYWRpbzsKLQlwcml2YXRlIENvbWJvIGRheUNvbWJvOwotCXByaXZhdGUgTGFiZWwgYXRMYWJlbDsKLQlwcml2YXRlIENvbWJvIGhvdXJDb21ibzsKLQlwcml2YXRlIEJ1dHRvbiBzZWFyY2hPbmx5UmFkaW87Ci0JcHJpdmF0ZSBCdXR0b24gc2VhcmNoQW5kRG93bmxvYWRSYWRpbzsKLQlwcml2YXRlIEdyb3VwIHVwZGF0ZVNjaGVkdWxlR3JvdXA7Ci0JcHJpdmF0ZSBHcm91cCBkb3dubG9hZEdyb3VwOwotCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCkgewotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQllbmFibGVkQ2hlY2sgPSBuZXcgQnV0dG9uKGNvbnRhaW5lciwgU1dULkNIRUNLKTsKLQkJZW5hYmxlZENoZWNrLnNldFRleHQoVXBkYXRlU2NoZWR1bGVyTWVzc2FnZXMuQXV0b21hdGljVXBkYXRlc1ByZWZlcmVuY2VQYWdlX2ZpbmRVcGRhdGVzKTsgCi0KLQkJY3JlYXRlU3BhY2VyKGNvbnRhaW5lciwgMSk7Ci0KLQkJdXBkYXRlU2NoZWR1bGVHcm91cCA9IG5ldyBHcm91cChjb250YWluZXIsIFNXVC5OT05FKTsKLQkJdXBkYXRlU2NoZWR1bGVHcm91cC5zZXRUZXh0KFVwZGF0ZVNjaGVkdWxlck1lc3NhZ2VzLkF1dG9tYXRpY1VwZGF0ZXNQcmVmZXJlbmNlUGFnZV9VcGRhdGVTY2hlZHVsZSk7IAotCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0JCXVwZGF0ZVNjaGVkdWxlR3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCXVwZGF0ZVNjaGVkdWxlR3JvdXAuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJb25TdGFydHVwUmFkaW8gPSBuZXcgQnV0dG9uKHVwZGF0ZVNjaGVkdWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCW9uU3RhcnR1cFJhZGlvLnNldFRleHQoCi0JCQlVcGRhdGVTY2hlZHVsZXJNZXNzYWdlcy5BdXRvbWF0aWNVcGRhdGVzUHJlZmVyZW5jZVBhZ2VfZmluZE9uU3RhcnQpOyAKLQkJZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlvblN0YXJ0dXBSYWRpby5zZXRMYXlvdXREYXRhKGdkKTsKLQkJb25TdGFydHVwUmFkaW8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJcGFnZUNoYW5nZWQoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJb25TY2hlZHVsZVJhZGlvID0gbmV3IEJ1dHRvbih1cGRhdGVTY2hlZHVsZUdyb3VwLCBTV1QuUkFESU8pOwotCQlvblNjaGVkdWxlUmFkaW8uc2V0VGV4dChVcGRhdGVTY2hlZHVsZXJNZXNzYWdlcy5BdXRvbWF0aWNVcGRhdGVzUHJlZmVyZW5jZVBhZ2VfZmluZE9uU2NoZWR1bGUpOyAKLQkJZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlvblNjaGVkdWxlUmFkaW8uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCW9uU2NoZWR1bGVSYWRpby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlwYWdlQ2hhbmdlZCgpOwotCQkJfQotCQl9KTsKLQotCQlkYXlDb21ibyA9IG5ldyBDb21ibyh1cGRhdGVTY2hlZHVsZUdyb3VwLCBTV1QuUkVBRF9PTkxZKTsKLQkJZGF5Q29tYm8uc2V0SXRlbXMoU2NoZWR1bGVyU3RhcnR1cC5EQVlTKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ2Qud2lkdGhIaW50ID0gMjAwOwotCQlnZC5ob3Jpem9udGFsSW5kZW50ID0gMzA7Ci0JCWRheUNvbWJvLnNldExheW91dERhdGEoZ2QpOwotCQkKLQkJYXRMYWJlbCA9IG5ldyBMYWJlbCh1cGRhdGVTY2hlZHVsZUdyb3VwLCBTV1QuTlVMTCk7Ci0JCWF0TGFiZWwuc2V0VGV4dChVcGRhdGVTY2hlZHVsZXJNZXNzYWdlcy5BdXRvbWF0aWNVcGRhdGVzUHJlZmVyZW5jZVBhZ2VfYXQpOyAKLQkJCi0JCWhvdXJDb21ibyA9IG5ldyBDb21ibyh1cGRhdGVTY2hlZHVsZUdyb3VwLCBTV1QuUkVBRF9PTkxZKTsKLQkJaG91ckNvbWJvLnNldEl0ZW1zKFNjaGVkdWxlclN0YXJ0dXAuSE9VUlMpOwotCQlnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQlnZC53aWR0aEhpbnQgPSAxMDA7Ci0JCWhvdXJDb21iby5zZXRMYXlvdXREYXRhKGdkKTsKLQkKLQkJY3JlYXRlU3BhY2VyKGNvbnRhaW5lciwgMSk7Ci0JCQotCQlkb3dubG9hZEdyb3VwID0gbmV3IEdyb3VwKGNvbnRhaW5lciwgU1dULk5PTkUpOwotCQlkb3dubG9hZEdyb3VwLnNldFRleHQoVXBkYXRlU2NoZWR1bGVyTWVzc2FnZXMuQXV0b21hdGljVXBkYXRlc1ByZWZlcmVuY2VQYWdlX2Rvd25sb2FkT3B0aW9ucyk7IAotCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0JCWRvd25sb2FkR3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRvd25sb2FkR3JvdXAuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJc2VhcmNoT25seVJhZGlvID0gbmV3IEJ1dHRvbihkb3dubG9hZEdyb3VwLCBTV1QuUkFESU8pOwotCQlzZWFyY2hPbmx5UmFkaW8uc2V0VGV4dCgKLQkJCVVwZGF0ZVNjaGVkdWxlck1lc3NhZ2VzLkF1dG9tYXRpY1VwZGF0ZXNQcmVmZXJlbmNlUGFnZV9zZWFyY2hBbmROb3RpZnkpOyAKLQkJZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlzZWFyY2hPbmx5UmFkaW8uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXNlYXJjaE9ubHlSYWRpby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlwYWdlQ2hhbmdlZCgpOwotCQkJfQotCQl9KTsKLQotCQlzZWFyY2hBbmREb3dubG9hZFJhZGlvID0gbmV3IEJ1dHRvbihkb3dubG9hZEdyb3VwLCBTV1QuUkFESU8pOwotCQlzZWFyY2hBbmREb3dubG9hZFJhZGlvLnNldFRleHQoVXBkYXRlU2NoZWR1bGVyTWVzc2FnZXMuQXV0b21hdGljVXBkYXRlc1ByZWZlcmVuY2VQYWdlX2Rvd25sb2FkQW5kTm90aWZ5KTsgCi0JCWdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMzsKLQkJc2VhcmNoQW5kRG93bmxvYWRSYWRpby5zZXRMYXlvdXREYXRhKGdkKTsKLQkJc2VhcmNoQW5kRG93bmxvYWRSYWRpby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlwYWdlQ2hhbmdlZCgpOwotCQkJfQotCQl9KTsKLQkJCQotCQlpbml0aWFsaXplKCk7Ci0KLQkJZW5hYmxlZENoZWNrLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXBhZ2VDaGFuZ2VkKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQoY29udGFpbmVyKTsKLQkJcmV0dXJuIGNvbnRhaW5lcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVTcGFjZXIoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgaW50IGNvbHVtblNwYW4pIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gY29sdW1uU3BhbjsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCVByZWZlcmVuY2VzIHByZWYgPSBVcGRhdGVTY2hlZHVsZXJQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCWVuYWJsZWRDaGVjay5zZXRTZWxlY3Rpb24ocHJlZi5nZXRCb29sZWFuKFVwZGF0ZVNjaGVkdWxlclBsdWdpbi5QX0VOQUJMRUQpKTsKLQkJc2V0U2NoZWR1bGUocHJlZi5nZXRTdHJpbmcoVXBkYXRlU2NoZWR1bGVyUGx1Z2luLlBfU0NIRURVTEUpKTsKLQotCQlkYXlDb21iby5zZXRUZXh0KFNjaGVkdWxlclN0YXJ0dXAuREFZU1tnZXREYXkocHJlZiwgZmFsc2UpXSk7Ci0JCWhvdXJDb21iby5zZXRUZXh0KFNjaGVkdWxlclN0YXJ0dXAuSE9VUlNbZ2V0SG91cihwcmVmLCBmYWxzZSldKTsKLQkJCi0JCXNlYXJjaE9ubHlSYWRpby5zZXRTZWxlY3Rpb24oIXByZWYuZ2V0Qm9vbGVhbihVcGRhdGVTY2hlZHVsZXJQbHVnaW4uUF9ET1dOTE9BRCkpOwotCQlzZWFyY2hBbmREb3dubG9hZFJhZGlvLnNldFNlbGVjdGlvbihwcmVmLmdldEJvb2xlYW4oVXBkYXRlU2NoZWR1bGVyUGx1Z2luLlBfRE9XTkxPQUQpKTsKLQotCQlwYWdlQ2hhbmdlZCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRTY2hlZHVsZShTdHJpbmcgdmFsdWUpIHsKLQkJaWYgKHZhbHVlLmVxdWFscyhVcGRhdGVTY2hlZHVsZXJQbHVnaW4uVkFMVUVfT05fU1RBUlRVUCkpCi0JCQlvblN0YXJ0dXBSYWRpby5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCWVsc2UKLQkJCW9uU2NoZWR1bGVSYWRpby5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBhZ2VDaGFuZ2VkKCkgewotCQlib29sZWFuIG1hc3RlciA9IGVuYWJsZWRDaGVjay5nZXRTZWxlY3Rpb24oKTsKLQkJdXBkYXRlU2NoZWR1bGVHcm91cC5zZXRFbmFibGVkKG1hc3Rlcik7Ci0JCW9uU3RhcnR1cFJhZGlvLnNldEVuYWJsZWQobWFzdGVyKTsKLQkJb25TY2hlZHVsZVJhZGlvLnNldEVuYWJsZWQobWFzdGVyKTsKLQkJZGF5Q29tYm8uc2V0RW5hYmxlZChtYXN0ZXIgJiYgb25TY2hlZHVsZVJhZGlvLmdldFNlbGVjdGlvbigpKTsKLQkJYXRMYWJlbC5zZXRFbmFibGVkKG1hc3RlciAmJiBvblNjaGVkdWxlUmFkaW8uZ2V0U2VsZWN0aW9uKCkpOwotCQlob3VyQ29tYm8uc2V0RW5hYmxlZChtYXN0ZXIgJiYgb25TY2hlZHVsZVJhZGlvLmdldFNlbGVjdGlvbigpKTsKLQkJZG93bmxvYWRHcm91cC5zZXRFbmFibGVkKG1hc3Rlcik7Ci0JCXNlYXJjaE9ubHlSYWRpby5zZXRFbmFibGVkKG1hc3Rlcik7Ci0JCXNlYXJjaEFuZERvd25sb2FkUmFkaW8uc2V0RW5hYmxlZChtYXN0ZXIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0JCVByZWZlcmVuY2VzIHByZWYgPSBVcGRhdGVTY2hlZHVsZXJQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCWVuYWJsZWRDaGVjay5zZXRTZWxlY3Rpb24ocHJlZi5nZXREZWZhdWx0Qm9vbGVhbihVcGRhdGVTY2hlZHVsZXJQbHVnaW4uUF9FTkFCTEVEKSk7CQkKLQkJCi0JCXNldFNjaGVkdWxlKHByZWYuZ2V0RGVmYXVsdFN0cmluZyhVcGRhdGVTY2hlZHVsZXJQbHVnaW4uUF9TQ0hFRFVMRSkpOwotCQlvblNjaGVkdWxlUmFkaW8uc2V0U2VsZWN0aW9uKHByZWYuZ2V0RGVmYXVsdEJvb2xlYW4oVXBkYXRlU2NoZWR1bGVyUGx1Z2luLlBfU0NIRURVTEUpKTsKLQkJCi0JCWRheUNvbWJvLnNldFRleHQoU2NoZWR1bGVyU3RhcnR1cC5EQVlTW2dldERheShwcmVmLCB0cnVlKV0pOwotCQlob3VyQ29tYm8uc2V0VGV4dChTY2hlZHVsZXJTdGFydHVwLkhPVVJTW2dldEhvdXIocHJlZiwgdHJ1ZSldKTsKLQkJCi0JCXNlYXJjaE9ubHlSYWRpby5zZXRTZWxlY3Rpb24oIXByZWYuZ2V0RGVmYXVsdEJvb2xlYW4oVXBkYXRlU2NoZWR1bGVyUGx1Z2luLlBfRE9XTkxPQUQpKTsKLQkJc2VhcmNoQW5kRG93bmxvYWRSYWRpby5zZXRTZWxlY3Rpb24ocHJlZi5nZXREZWZhdWx0Qm9vbGVhbihVcGRhdGVTY2hlZHVsZXJQbHVnaW4uUF9ET1dOTE9BRCkpOwotCQlwYWdlQ2hhbmdlZCgpOwotCX0KLQotCS8qKiAKLQkgKiBNZXRob2QgZGVjbGFyZWQgb24gSVByZWZlcmVuY2VQYWdlLgotCSAqIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotCQlQcmVmZXJlbmNlcyBwcmVmID0gVXBkYXRlU2NoZWR1bGVyUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlwcmVmLnNldFZhbHVlKFVwZGF0ZVNjaGVkdWxlclBsdWdpbi5QX0VOQUJMRUQsIGVuYWJsZWRDaGVjay5nZXRTZWxlY3Rpb24oKSk7Ci0JCWlmIChvblN0YXJ0dXBSYWRpby5nZXRTZWxlY3Rpb24oKSkKLQkJCXByZWYuc2V0VmFsdWUoVXBkYXRlU2NoZWR1bGVyUGx1Z2luLlBfU0NIRURVTEUsIFVwZGF0ZVNjaGVkdWxlclBsdWdpbi5WQUxVRV9PTl9TVEFSVFVQKTsKLQkJZWxzZSAKLQkJCXByZWYuc2V0VmFsdWUoVXBkYXRlU2NoZWR1bGVyUGx1Z2luLlBfU0NIRURVTEUsIFVwZGF0ZVNjaGVkdWxlclBsdWdpbi5WQUxVRV9PTl9TQ0hFRFVMRSk7Ci0JCQkKLQkJcHJlZi5zZXRWYWx1ZShTY2hlZHVsZXJTdGFydHVwLlBfREFZLCBkYXlDb21iby5nZXRUZXh0KCkpOwotCQlwcmVmLnNldFZhbHVlKFNjaGVkdWxlclN0YXJ0dXAuUF9IT1VSLCBob3VyQ29tYm8uZ2V0VGV4dCgpKTsKLQkJCi0JCXByZWYuc2V0VmFsdWUoVXBkYXRlU2NoZWR1bGVyUGx1Z2luLlBfRE9XTkxPQUQsIHNlYXJjaEFuZERvd25sb2FkUmFkaW8uZ2V0U2VsZWN0aW9uKCkpOwotCQkKLQkJVXBkYXRlU2NoZWR1bGVyUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJCi0JCVVwZGF0ZVNjaGVkdWxlclBsdWdpbi5nZXRTY2hlZHVsZXIoKS5zY2hlZHVsZVVwZGF0ZUpvYigpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHJpdmF0ZSBpbnQgZ2V0RGF5KFByZWZlcmVuY2VzIHByZWYsIGJvb2xlYW4gdXNlRGVmYXVsdCkgewotCQlTdHJpbmcgZGF5ID0gdXNlRGVmYXVsdD8gcHJlZi5nZXREZWZhdWx0U3RyaW5nKFNjaGVkdWxlclN0YXJ0dXAuUF9EQVkpOiBwcmVmLmdldFN0cmluZyhTY2hlZHVsZXJTdGFydHVwLlBfREFZKTsKLQkJZm9yIChpbnQgaT0wOyBpPFNjaGVkdWxlclN0YXJ0dXAuREFZUy5sZW5ndGg7IGkrKykKLQkJCWlmIChTY2hlZHVsZXJTdGFydHVwLkRBWVNbaV0uZXF1YWxzKGRheSkpCi0JCQkJcmV0dXJuIGk7Ci0JCXJldHVybiAwOwotCX0KLQkKLQlwcml2YXRlIGludCBnZXRIb3VyKFByZWZlcmVuY2VzIHByZWYsIGJvb2xlYW4gdXNlRGVmYXVsdCkgewotCQlTdHJpbmcgaG91ciA9IHVzZURlZmF1bHQ/IHByZWYuZ2V0RGVmYXVsdFN0cmluZyhTY2hlZHVsZXJTdGFydHVwLlBfSE9VUik6IHByZWYuZ2V0U3RyaW5nKFNjaGVkdWxlclN0YXJ0dXAuUF9IT1VSKTsKLQkJZm9yIChpbnQgaT0wOyBpPFNjaGVkdWxlclN0YXJ0dXAuSE9VUlMubGVuZ3RoOyBpKyspCi0JCQlpZiAoU2NoZWR1bGVyU3RhcnR1cC5IT1VSU1tpXS5lcXVhbHMoaG91cikpCi0JCQkJcmV0dXJuIGk7Ci0JCXJldHVybiAwOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuc2NoZWR1bGVyL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvc2NoZWR1bGVyL3ByZWZlcmVuY2VzL1ByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5zY2hlZHVsZXIvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9zY2hlZHVsZXIvcHJlZmVyZW5jZXMvUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiMjk3MzguLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5zY2hlZHVsZXIvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9zY2hlZHVsZXIvcHJlZmVyZW5jZXMvUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnNjaGVkdWxlci5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuRGVmYXVsdFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5zY2hlZHVsZXIuVXBkYXRlU2NoZWR1bGVyUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UucHJlZnMuUHJlZmVyZW5jZXM7Ci0KLQotLyoqCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBjbGFzcyBQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgZXh0ZW5kcyBBYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciB7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXIjaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpIHsKLQkJUHJlZmVyZW5jZXMgbm9kZSA9IG5ldyBEZWZhdWx0U2NvcGUoKS5nZXROb2RlKCJvcmcuZWNsaXBzZS51cGRhdGUuc2NoZWR1bGVyIik7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZS5wdXRCb29sZWFuKFVwZGF0ZVNjaGVkdWxlclBsdWdpbi5QX0VOQUJMRUQsIGZhbHNlKTsKLQkJbm9kZS5wdXQoVXBkYXRlU2NoZWR1bGVyUGx1Z2luLlBfU0NIRURVTEUsIFVwZGF0ZVNjaGVkdWxlclBsdWdpbi5WQUxVRV9PTl9TVEFSVFVQKTsKLQkJbm9kZS5wdXRCb29sZWFuKFVwZGF0ZVNjaGVkdWxlclBsdWdpbi5QX0RPV05MT0FELCBmYWxzZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvLmNsYXNzcGF0aCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODQ4MjQ5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxjbGFzc3BhdGg+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPg0KLTwvY2xhc3NwYXRoPg0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS8uY3ZzaWdub3JlIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1ZTgyZDcuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvLnByb2plY3QgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwNDI2MjQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cHJvamVjdERlc2NyaXB0aW9uPg0KLQk8bmFtZT5vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZTwvbmFtZT4NCi0JPGNvbW1lbnQ+PC9jb21tZW50Pg0KLQk8cHJvamVjdHM+DQotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5jb3JlLmJvb3Q8L3Byb2plY3Q+DQotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlczwvcHJvamVjdD4NCi0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmNvcmUucnVudGltZTwvcHJvamVjdD4NCi0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb21wYXRpYmlsaXR5PC9wcm9qZWN0Pg0KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuaGVscC5hcHBzZXJ2ZXI8L3Byb2plY3Q+DQotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS50b21jYXQ8L3Byb2plY3Q+DQotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yPC9wcm9qZWN0Pg0KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UudXBkYXRlLmNvcmU8L3Byb2plY3Q+DQotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5saW51eDwvcHJvamVjdD4NCi0JCTxwcm9qZWN0Pm9yZy5qdW5pdDwvcHJvamVjdD4NCi0JPC9wcm9qZWN0cz4NCi0JPGJ1aWxkU3BlYz4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQk8L2J1aWxkU3BlYz4NCi0JPG5hdHVyZXM+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPg0KLQk8L25hdHVyZXM+DQotPC9wcm9qZWN0RGVzY3JpcHRpb24+DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmMjBlNzguLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotI0ZyaSBBdWcgMTIgMTU6NTY6MjIgRURUIDIwMDUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzA2NjEzLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVuYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMy4yLjAKLUJ1bmRsZS1DbGFzc1BhdGg6IHVwZGF0ZXRlc3RzLmphcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLlVwZGF0ZVRlc3RzUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXItbmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLAotIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5hcGksCi0gb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmJyYW5kaW5nLAotIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb25maWd1cmF0aW9ucywKLSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS5ib290LAotIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5pbXBsZW1lbnRhdGlvbiwKLSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMubWlycm9yLAotIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5tb2RlbCwKLSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMubmF0aXZlVGVzdHMsCi0gb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLm5lc3RlZGZlYXR1cmVzLAotIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5wYXJzZXIsCi0gb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnBlcmZtcywKLSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMucmVjb25jaWxpYXRpb24sCi0gb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnJlZ3VsYXJJbnN0YWxsLAotIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5yZWd1bGFyUmVtb3ZlLAotIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5zaXRldmFsaWRhdGlvbiwKLSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuc3RhbmRhbG9uZSwKLSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMudHlwZXMsCi0gb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnVpdmFsdWVzCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5qdW5pdCwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcywKLSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZSwKLSBvcmcuZWNsaXBzZS50b21jYXQsCi0gb3JnLmVjbGlwc2UuaGVscC5hcHBzZXJ2ZXIsCi0gb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvciwKLSBvcmcuZWNsaXBzZS50ZXN0LnBlcmZvcm1hbmNlCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2Fib3V0Lmh0bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYwMjMzMC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5KdW5lIDIsIDIwMDY8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKLWluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKLXByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvYnVpbGQucHJvcGVydGllcyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODY3MWYzLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLXNvdXJjZS51cGRhdGV0ZXN0cy5qYXI9c3JjLw0KLWJpbi5pbmNsdWRlcyA9ICouamFyLFwNCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwNCi0gICAgICAgICAgICAgICB0ZXN0LnhtbCxcDQotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcDQotICAgICAgICAgICAgICAgZGF0YS8sXA0KLSAgICAgICAgICAgICAgIHdlYnNlcnZlci8sXA0KLSAgICAgICAgICAgICAgIE1FVEEtSU5GLw0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0V4ZWN1dGFibGVGZWF0dXJlUGFja2FnZWRTaXRlL2RhdGEvZmVhdHVyZXMvZmVhdHVyZTMvZmVhdHVyZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9FeGVjdXRhYmxlRmVhdHVyZVBhY2thZ2VkU2l0ZS9kYXRhL2ZlYXR1cmVzL2ZlYXR1cmUzL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjY0OWM2Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0V4ZWN1dGFibGVGZWF0dXJlUGFja2FnZWRTaXRlL2RhdGEvZmVhdHVyZXMvZmVhdHVyZTMvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMyIgaW1hZ2U9ImZlYXR1cmUxLmdpZiIgbGFiZWw9IlRoaXJkIEZlYXR1cmUiIHByb3ZpZGVyLW5hbWU9IlNtYXJ0IENvbXBhbnkiIHZlcnNpb249IjEuMC4wIiA+DQotICA8ZGVzY3JpcHRpb24+RGVzY3JpcHRpb248L2Rlc2NyaXB0aW9uPg0KLSAgPGNvcHlyaWdodD5jb3B5cmlnaHQ8L2NvcHlyaWdodD4NCi0gIDxsaWNlbnNlPmxpY2Vuc2U8L2xpY2Vuc2U+DQotICA8dXJsPg0KLSAgICA8dXBkYXRlIGxhYmVsPSJVUkwgdG8gdXBkYXRlIHRoZSBmZWF0dXJlIiB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvcGF0aC9mZWF0dXJlMS8iLz4NCi0gICAgPGRpc2NvdmVyeSBsYWJlbD0iRGlzY292ZXJ5IDEiIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyIvPg0KLSAgICA8ZGlzY292ZXJ5IGxhYmVsPSJEaXNjb3ZlcnkgMiIgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIi8+DQotICA8L3VybD4NCi0gIDxwbHVnaW4gZG93bmxvYWQtc2l6ZT0iMTUwMCIgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjEiIGluc3RhbGwtc2l6ZT0iMTAwMCIgZnJhZ21lbnQ9ImZhbHNlIiBubD0iZW4iIG9zPSJXSU4zMixMSU5VWCxIUFVYLE1BQ09TWCxBSVgsU09MQVJJUyxRTlgsVU5LTk9XTiIgdmVyc2lvbj0iMy41LjYiIHdzPSJXSU4zMixNT1RJRixHVEssQ0FSQk9OLFBIT1RPTixVTktOT1dOIi8+DQotPC9mZWF0dXJlPg0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0V4ZWN1dGFibGVGZWF0dXJlUGFja2FnZWRTaXRlL2RhdGEvcGx1Z2lucy9QZGVfY29yZS5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9FeGVjdXRhYmxlRmVhdHVyZVBhY2thZ2VkU2l0ZS9kYXRhL3BsdWdpbnMvUGRlX2NvcmUuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTA3MjE3Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0V4ZWN1dGFibGVGZWF0dXJlUGFja2FnZWRTaXRlL2RhdGEvcGx1Z2lucy9QZGVfY29yZS5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9FeGVjdXRhYmxlRmVhdHVyZVBhY2thZ2VkU2l0ZS9kYXRhL3BsdWdpbnMvaGVscC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9FeGVjdXRhYmxlRmVhdHVyZVBhY2thZ2VkU2l0ZS9kYXRhL3BsdWdpbnMvaGVscC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1ODRmNjYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YS9wbHVnaW5zL2hlbHAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YS9wbHVnaW5zL2p1bml0XzMuNy5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9FeGVjdXRhYmxlRmVhdHVyZVBhY2thZ2VkU2l0ZS9kYXRhL3BsdWdpbnMvanVuaXRfMy43LmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc1ODdiMi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9FeGVjdXRhYmxlRmVhdHVyZVBhY2thZ2VkU2l0ZS9kYXRhL3BsdWdpbnMvanVuaXRfMy43LmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0V4ZWN1dGFibGVGZWF0dXJlUGFja2FnZWRTaXRlL2RhdGEvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMV8xLjEuMS9wbHVnaW4ueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YS9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5wbHVnaW4xXzEuMS4xL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmMDVkODIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YS9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5wbHVnaW4xXzEuMS4xL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHBsdWdpbiBuYW1lPSJKVW5pdCBUZXN0IEZyYW1ld29yayIgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjEiIHZlcnNpb249IjMuNS42IiB2ZW5kb3ItbmFtZT0ianVuaXQub3JnIj4NCi0gIDxydW50aW1lPg0KLSAgICA8bGlicmFyeSBuYW1lPSJqdW5pdC5qYXIiPg0KLSAgICAgIDxleHBvcnQgbmFtZT0iKiIvPg0KLSAgICA8L2xpYnJhcnk+DQotICA8L3J1bnRpbWU+DQotPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YS9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5wbHVnaW4xXzEuMS4xL3NyYy5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9FeGVjdXRhYmxlRmVhdHVyZVBhY2thZ2VkU2l0ZS9kYXRhL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLnBsdWdpbjFfMS4xLjEvc3JjLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ0ZDYwOS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9FeGVjdXRhYmxlRmVhdHVyZVBhY2thZ2VkU2l0ZS9kYXRhL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLnBsdWdpbjFfMS4xLjEvc3JjLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0V4ZWN1dGFibGVGZWF0dXJlUGFja2FnZWRTaXRlL2RhdGEyL2ZlYXR1cmVzL2ZlYXR1cmUzL2ZlYXR1cmUueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YTIvZmVhdHVyZXMvZmVhdHVyZTMvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxY2JjM2MuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YTIvZmVhdHVyZXMvZmVhdHVyZTMvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMyIgaW1hZ2U9ImZlYXR1cmUxLmdpZiIgbGFiZWw9IlRoaXJkIEZlYXR1cmUiIHByb3ZpZGVyLW5hbWU9IlNtYXJ0IENvbXBhbnkiIHZlcnNpb249IjEuMC4wIiA+DQotICA8ZGVzY3JpcHRpb24+RGVzY3JpcHRpb248L2Rlc2NyaXB0aW9uPg0KLSAgPGNvcHlyaWdodD5jb3B5cmlnaHQ8L2NvcHlyaWdodD4NCi0gIDxsaWNlbnNlPmxpY2Vuc2U8L2xpY2Vuc2U+DQotICA8dXJsPg0KLSAgICA8dXBkYXRlIGxhYmVsPSJVUkwgdG8gdXBkYXRlIHRoZSBmZWF0dXJlIiB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvcGF0aC9mZWF0dXJlMS8iLz4NCi0gICAgPGRpc2NvdmVyeSBsYWJlbD0iRGlzY292ZXJ5IDEiIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyIvPg0KLSAgICA8ZGlzY292ZXJ5IGxhYmVsPSJEaXNjb3ZlcnkgMiIgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIi8+DQotICA8L3VybD4NCi0gIDxwbHVnaW4gZG93bmxvYWQtc2l6ZT0iMTUwMCIgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5wbHVnaW4xIiBpbnN0YWxsLXNpemU9IjEwMDAiIGZyYWdtZW50PSJmYWxzZSIgbmw9ImVuLGZyIiBvcz0iV0lOMzIsTElOVVgsSFBVWCxNQUNPU1gsQUlYLFNPTEFSSVMsUU5YLFVOS05PV04iIHZlcnNpb249IjEuMS4xIiB3cz0iV0lOMzIsTU9USUYsR1RLLENBUkJPTixQSE9UT04sVU5LTk9XTiIvPg0KLTwvZmVhdHVyZT4NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9FeGVjdXRhYmxlRmVhdHVyZVBhY2thZ2VkU2l0ZS9kYXRhMi9mZWF0dXJlcy9oZWxwRmVhdHVyZS5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9FeGVjdXRhYmxlRmVhdHVyZVBhY2thZ2VkU2l0ZS9kYXRhMi9mZWF0dXJlcy9oZWxwRmVhdHVyZS5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4NjFkMmYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YTIvZmVhdHVyZXMvaGVscEZlYXR1cmUuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YTIvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGRlLmZlYXR1cmVfMS4wLjAuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YTIvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGRlLmZlYXR1cmVfMS4wLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTIzY2FiLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0V4ZWN1dGFibGVGZWF0dXJlUGFja2FnZWRTaXRlL2RhdGEyL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnBkZS5mZWF0dXJlXzEuMC4wLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0V4ZWN1dGFibGVGZWF0dXJlUGFja2FnZWRTaXRlL2RhdGEyL2luZm8vaW1nL3RvcF90aXRsc20uZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YTIvaW5mby9pbWcvdG9wX3RpdGxzbS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5MTdiYjYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YTIvaW5mby9pbWcvdG9wX3RpdGxzbS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9FeGVjdXRhYmxlRmVhdHVyZVBhY2thZ2VkU2l0ZS9kYXRhMi9pbmZvL2ltZy93ZWxfbWwuanBnIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YTIvaW5mby9pbWcvd2VsX21sLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFlMzNkZi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9FeGVjdXRhYmxlRmVhdHVyZVBhY2thZ2VkU2l0ZS9kYXRhMi9pbmZvL2ltZy93ZWxfbWwuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YTIvaW5mby9zaXRlSW5mby5odG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YTIvaW5mby9zaXRlSW5mby5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDY1YWEzLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0V4ZWN1dGFibGVGZWF0dXJlUGFja2FnZWRTaXRlL2RhdGEyL2luZm8vc2l0ZUluZm8uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KLTxodG1sPg0KLTxoZWFkPg0KLTwvaGVhZD4NCi0gIDxib2R5Pg0KLTxpbWcgc3JjPSJpbWcvdG9wX3RpdGxzbS5naWYiIGFsdD0iIiB3aWR0aD0iNDYwIiBoZWlnaHQ9IjUwIj4NCi08YnI+DQotPGJyPg0KLSAgICAgSXQgc3RhcnRlZCB3aXRoIFNtYWxsdGFsazxicj4NCi0gICAgT1RJIGhhcyBiZWVuIGJ1aWxkaW5nIHRvb2xzIGZvciBwbGF0Zm9ybS1pbmRlcGVuZGVudCBPTyBkZXZlbG9wbWVudCBzaW5jZQ0KLSAgMTk4OC4gT3VyIEVOVlkmcmVnOyB0ZWNobm9sb2d5IGZpcnN0IGJyb3VnaHQgY29sbGFib3JhdGl2ZSBzb2Z0d2FyZSBkZXZlbG9wbWVudCwNCi0gIHZlcnNpb24gbWFuYWdlbWVudCBhbmQgc2hhcmVkIHJlcG9zaXRvcmllcyB0byBTbWFsbHRhbGsuIElCTSBpcyBvbmUgb2YNCi1tYW55ICAgY29tcGFuaWVzIHRvIGxpY2Vuc2UgRU5WWSwgd2hpY2ggY29udGludWVzIHRvIGJlIHRoZSBmb3VuZGF0aW9uIG9mDQotVmlzdWFsQWdlJnJlZzsgICBTbWFsbHRhbGsuPGJyPg0KLTxicj4NCi08YnI+DQotPGJyPg0KLSAgICAgIE5leHQgY2FtZSBKYXZhJiM4NDgyOzxicj4NCi0gICAgQmVjYXVzZSBvZiBvdXIgZXhwZXJ0aXNlIGluIE9PIHRlY2hub2xvZ3ksIElCTSB0dXJuZWQgdG8gT1RJIGZvciBhIG5leHQtZ2VuZXJhdGlvbg0KLSAgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQgZm9yIEphdmEuIFRoZSByZXN1bHQgaXMgVmlzdWFsQWdlIGZvciBKYXZhLCB3aGljaA0KLSAgY29udGludWVzIHRvIHdpbiBhd2FyZHMgZm9yIGl0cyBpbm5vdmF0aXZlIElERSBhbmQgdGVhbSBzdXBwb3J0LiBJbmZvV29ybGQNCi0gIGhhcyBjaG9zZW4gVmlzdWFsQWdlIGZvciBKYXZhIGFzIGRldmVsb3BtZW50IHRvb2wgb2YgdGhlIHllYXIgLSB5ZWFyIGFmdGVyDQotICB5ZWFyIGFmdGVyIHllYXIhPGJyPg0KLTxicj4NCi08YnI+DQotPGJyPg0KLSAgICAgIFRoZW4gcGVydmFzaXZlIGNvbXB1dGluZzxicj4NCi0gICAgT1RJIGNvbnRpbnVlcyBpdHMgZGV2ZWxvcG1lbnQgb2YgSUJNJ3MgVmlzdWFsQWdlIE1pY3JvIEVkaXRpb24sIGEgc3RhdGUtb2YtdGhlLWFydA0KLSAgcGxhdGZvcm0gZm9yIGNvbGxhYm9yYXRpdmUgZGV2ZWxvcG1lbnQgb2YgZW1iZWRkZWQgYXBwbGljYXRpb25zIGFuZCBzeXN0ZW1zDQotICB0aGF0IGFyZSB2ZXJ5IGxlYW4uIEFzIHRoZSBzdGVhZHkgc3RyZWFtIG9mIHByZXNzIHJlbGVhc2VzIGF0dGVzdHMsIFZpc3VhbEFnZQ0KLSAgTWljcm8gRWRpdGlvbiBpcyBhbHJlYWR5IGxpY2Vuc2VkIHRvIHRoZSBsZWFkaW5nIG1pY3JvY2hpcCBtYW51ZmFjdHVyZXJzLA0KLSAgbWljcm9rZXJuZWwgZGV2ZWxvcGVycywgYW5kIHByb2R1Y2VycyBvZiBoYW5kaGVsZCBhbmQgY29uc3VtZXIgZGV2aWNlcy48YnI+DQotPGJyPg0KLTxicj4NCi08YnI+DQotICAgICAgTm93IGl0J3MgRWNsaXBzZTxicj4NCi0gICAgT1RJIGhhcyBidWlsdCB0aGUgbmV4dCBnZW5lcmF0aW9uIElCTSBhcHBsaWNhdGlvbiBkZXZlbG9wbWVudCB0b29scyBwbGF0Zm9ybS4NCi0gIEVjbGlwc2UgaXMgYSBraW5kIG9mIHVuaXZlcnNhbCB0b29sIHBsYXRmb3JtIC0gYW4gb3BlbiBleHRlbnNpYmxlIElERSBmb3INCi0gIGFueXRoaW5nIGFuZCBub3RoaW5nIGluIHBhcnRpY3VsYXIuIFRoZSByZWFsIHZhbHVlIGNvbWVzIGZyb20gdG9vbCBwbHVnLWlucw0KLSAgdGhhdCAidGVhY2giIEVjbGlwc2UgaG93IHRvIHdvcmsgd2l0aCB0aGluZ3MgLSBqYXZhIGZpbGVzLCB3ZWIgY29udGVudCwNCi1ncmFwaGljcywgIHZpZGVvIC0gYWxtb3N0IGFueXRoaW5nIHlvdSBjYW4gaW1hZ2luZS4gRWNsaXBzZSBhbGxvd3MgeW91IHRvDQotaW5kZXBlbmRlbnRseSAgZGV2ZWxvcCB0b29scyB0aGF0IGludGVncmF0ZSB3aXRoIG90aGVyIHBlb3BsZSdzIHRvb2xzIHNvDQotc2VhbWxlc3NseSB5b3Ugd29uJ3Qga25vdyB3aGVyZSBvbmUgdG9vbCBlbmRzIGFuZCBhbm90aGVyIHN0YXJ0cy4gVGhlIElCTQ0KLXN1cHBvcnRlZCB2ZXJzaW9uIG9mIHRoaXMgdGVjaG5vbG9neSwgV2ViU3BoZXJlIFN0dWRpbyBXb3JrYmVuY2gsIHdpbGwgYmUNCi10aGUgY29yZSBvZiB0aGUgbmV4dCAgZ2VuZXJhdGlvbiBvZiBJQk0gYW5kIElCTSBCdXNpbmVzcyBQYXJ0bmVyIGUtYnVzaW5lc3MNCi10b29scyBvcHRpbWl6ZWQgZm9yICB0aGUgV2ViU3BoZXJlIHNvZnR3YXJlIHBsYXRmb3JtLjxicj4NCi08YnI+DQotPGJyPg0KLTxicj4NCi0gICAgICBTbyB3aGF0J3MgbmV4dD88YnI+DQotICAgIE9USSBjb250aW51ZXMgdG8gZGVsaXZlciBvYmplY3Qtb3JpZW50ZWQgdGVjaG5vbG9neSB0aGF0IHNjYWxlcyBhY3Jvc3MNCi0gcGxhdGZvcm1zLCAgYWNyb3NzIHRlYW1zIGFuZCBhY3Jvc3MgcHJvamVjdCBzaXplLiBGcm9tIGEgbWFpbmZyYW1lIHRvIGENCi13YXRjaCAgLSB3ZSdyZSAgY2xvc2luZyBpbiBvbiB0aGF0IHZpc2lvbi48YnI+DQotPGJyPg0KLTxpbWcgc3JjPSJpbWcvd2VsX21sLmpwZyIgd2lkdGg9IjQ2MCIgaGVpZ2h0PSI0NjAiIGFsdD0iIj4NCi08YnI+DQotPGJyPg0KLTxicj4NCi08YnI+DQotPGJyPg0KLTxicj4NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0V4ZWN1dGFibGVGZWF0dXJlUGFja2FnZWRTaXRlL2RhdGEyL3BsdWdpbnMvUGRlX2NvcmUuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YTIvcGx1Z2lucy9QZGVfY29yZS5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxMDcyMTcuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YTIvcGx1Z2lucy9QZGVfY29yZS5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9FeGVjdXRhYmxlRmVhdHVyZVBhY2thZ2VkU2l0ZS9kYXRhMi9wbHVnaW5zL2hlbHAuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YTIvcGx1Z2lucy9oZWxwLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU4NGY2Ni4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9FeGVjdXRhYmxlRmVhdHVyZVBhY2thZ2VkU2l0ZS9kYXRhMi9wbHVnaW5zL2hlbHAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YTIvcGx1Z2lucy9qdW5pdF8zLjcuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YTIvcGx1Z2lucy9qdW5pdF8zLjcuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzU4N2IyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0V4ZWN1dGFibGVGZWF0dXJlUGFja2FnZWRTaXRlL2RhdGEyL3BsdWdpbnMvanVuaXRfMy43LmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0V4ZWN1dGFibGVGZWF0dXJlUGFja2FnZWRTaXRlL2RhdGEyL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLnBsdWdpbjFfMS4xLjEvcGx1Z2luLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0V4ZWN1dGFibGVGZWF0dXJlUGFja2FnZWRTaXRlL2RhdGEyL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLnBsdWdpbjFfMS4xLjEvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2YwNWQ4Mi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9FeGVjdXRhYmxlRmVhdHVyZVBhY2thZ2VkU2l0ZS9kYXRhMi9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5wbHVnaW4xXzEuMS4xL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHBsdWdpbiBuYW1lPSJKVW5pdCBUZXN0IEZyYW1ld29yayIgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjEiIHZlcnNpb249IjMuNS42IiB2ZW5kb3ItbmFtZT0ianVuaXQub3JnIj4NCi0gIDxydW50aW1lPg0KLSAgICA8bGlicmFyeSBuYW1lPSJqdW5pdC5qYXIiPg0KLSAgICAgIDxleHBvcnQgbmFtZT0iKiIvPg0KLSAgICA8L2xpYnJhcnk+DQotICA8L3J1bnRpbWU+DQotPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YTIvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMV8xLjEuMS9zcmMuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YTIvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMV8xLjEuMS9zcmMuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDRkNjA5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0V4ZWN1dGFibGVGZWF0dXJlUGFja2FnZWRTaXRlL2RhdGEyL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLnBsdWdpbjFfMS4xLjEvc3JjLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0V4ZWN1dGFibGVGZWF0dXJlUGFja2FnZWRTaXRlL2RhdGEyL3NpdGUueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YTIvc2l0ZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2MjExYTguLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YTIvc2l0ZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxzaXRlIHR5cGU9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZpbGUiPg0KLTxkZXNjcmlwdGlvbiB1cmw9ImluZm8vc2l0ZUluZm8uaHRtbCIvPg0KLSAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9oZWxwRmVhdHVyZS5qYXIiIHR5cGU9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnBhY2thZ2VkIj4NCi0gICAgPGNhdGVnb3J5IG5hbWU9ImVjbGlwc2UvVU1MIi8+DQotICA8L2ZlYXR1cmU+DQotICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLnBkZS5mZWF0dXJlXzEuMC4wLmphciIgdHlwZT0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUucGFja2FnZWQiPg0KLSAgICA8Y2F0ZWdvcnkgbmFtZT0iZWNsaXBzZS9KMkVFIi8+DQotICA8L2ZlYXR1cmU+DQotICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL2ZlYXR1cmUzLyIgb3M9IkxJTlVYIj4NCi0gICAgPGNhdGVnb3J5IG5hbWU9ImVjbGlwc2UiLz4NCi0gIDwvZmVhdHVyZT4NCi0gIDxhcmNoaXZlIHBhdGg9InBsdWdpbnMvb3JnLmVjbGlwc2UuaGVscF8xLjAuMC5qYXIiIHVybD0icGx1Z2lucy9oZWxwLmphciIvPg0KLSAgPGFyY2hpdmUgcGF0aD0icGx1Z2lucy9vcmcuZWNsaXBzZS5wZGUuY29yZV8xLjAuMC5qYXIiIHVybD0icGx1Z2lucy9QZGVfY29yZS5qYXIiLz4NCi0gIDxhcmNoaXZlIHBhdGg9InBsdWdpbnMvb3JnLmp1bml0XzMuNS4wLmphciIgdXJsPSJwbHVnaW5zL2p1bml0XzMuNy5qYXIiLz4NCi0gIDxhcmNoaXZlIHBhdGg9InBsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLnBsdWdpbjFfMS4xLjEuamFyIiB1cmw9InBsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLnBsdWdpbjFfMS4xLjEiLz4gIA0KLSAgPGNhdGVnb3J5LWRlZiBsYWJlbD0iSUJNIFdTQUQgVG9vbHMiIG5hbWU9ImVjbGlwc2UiLz4NCi0gIDxjYXRlZ29yeS1kZWYgbGFiZWw9IkoyRUUgdG9vbHMiIG5hbWU9ImVjbGlwc2UvSjJFRSIvPg0KLSAgPGNhdGVnb3J5LWRlZiBsYWJlbD0iRUpCIFRvb2xzIiBuYW1lPSJlY2xpcHNlL0oyRUUvRUpCIi8+DQotICA8Y2F0ZWdvcnktZGVmIGxhYmVsPSJVTUwgdG9vbHMiIG5hbWU9ImVjbGlwc2UvVU1MIi8+DQotICA8Y2F0ZWdvcnktZGVmIGxhYmVsPSJNZXNzYWdpbmcgVG9vbHMiIG5hbWU9IkIyQiIvPiAgDQotPC9zaXRlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0ZUUExpa2VTaXRlL3NpdGUueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRlRQTGlrZVNpdGUvc2l0ZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhNjJlMmUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRlRQTGlrZVNpdGUvc2l0ZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHNpdGUgdHlwZT0ib3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUuZnRwIj4NCi0gIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvZmVhdHVyZTMvZmVhdHVyZXMyLmphcmZpbGUiLz4NCi08L3NpdGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRmVhdHVyZVR5cGVFeGFtcGxlcy9zaXRlMS9mZWF0dXJlcy9mZWF0dXJlMy9mZWF0dXJlLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0ZlYXR1cmVUeXBlRXhhbXBsZXMvc2l0ZTEvZmVhdHVyZXMvZmVhdHVyZTMvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjOThmNDIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRmVhdHVyZVR5cGVFeGFtcGxlcy9zaXRlMS9mZWF0dXJlcy9mZWF0dXJlMy9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUzIiBpbWFnZT0iZmVhdHVyZTEuZ2lmIiBsYWJlbD0iVGhpcmQgRmVhdHVyZSIgcHJvdmlkZXItbmFtZT0iU21hcnQgQ29tcGFueSIgdmVyc2lvbj0iMS4wLjAiPg0KLSAgPGRlc2NyaXB0aW9uPkRlc2NyaXB0aW9uPC9kZXNjcmlwdGlvbj4NCi0gIDxjb3B5cmlnaHQ+Y29weXJpZ2h0PC9jb3B5cmlnaHQ+DQotICA8bGljZW5zZT5saWNlbnNlPC9saWNlbnNlPg0KLSAgPHVybD4NCi0gICAgPHVwZGF0ZSBsYWJlbD0iVVJMIHRvIHVwZGF0ZSB0aGUgZmVhdHVyZSIgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3BhdGgvZmVhdHVyZTEvIi8+DQotICAgIDxkaXNjb3ZlcnkgbGFiZWw9IkRpc2NvdmVyeSAxIiB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciLz4NCi0gICAgPGRpc2NvdmVyeSBsYWJlbD0iRGlzY292ZXJ5IDIiIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyIvPg0KLSAgPC91cmw+DQotICA8cGx1Z2luIGRvd25sb2FkLXNpemU9IjE1MDAiIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMSIgaW5zdGFsbC1zaXplPSIxMDAwIiBmcmFnbWVudD0iZmFsc2UiIG9zPSJXSU4zMixMSU5VWCIgdmVyc2lvbj0iMS4xLjEiIHdzPSJXSU4zMixNT1RJRixHVEsiLz4NCi08L2ZlYXR1cmU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRmVhdHVyZVR5cGVFeGFtcGxlcy9zaXRlMS9zaXRlLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0ZlYXR1cmVUeXBlRXhhbXBsZXMvc2l0ZTEvc2l0ZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4NmQxMTkuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRmVhdHVyZVR5cGVFeGFtcGxlcy9zaXRlMS9zaXRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08c2l0ZSB0eXBlPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5maWxlIj4NCi0gIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvZmVhdHVyZTMiIHR5cGU9Im9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlLmZlYXR1cmUxIi8+DQotPC9zaXRlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0ZlYXR1cmVUeXBlRXhhbXBsZXMvc2l0ZTIvZmVhdHVyZXMvZmVhdHVyZTMvZmVhdHVyZXMyLmphcmZpbGUgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9GZWF0dXJlVHlwZUV4YW1wbGVzL3NpdGUyL2ZlYXR1cmVzL2ZlYXR1cmUzL2ZlYXR1cmVzMi5qYXJmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDBhYjRmLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0ZlYXR1cmVUeXBlRXhhbXBsZXMvc2l0ZTIvZmVhdHVyZXMvZmVhdHVyZTMvZmVhdHVyZXMyLmphcmZpbGUKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9GZWF0dXJlVHlwZUV4YW1wbGVzL3NpdGUyL3NpdGUueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRmVhdHVyZVR5cGVFeGFtcGxlcy9zaXRlMi9zaXRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI1ZmUwZS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9GZWF0dXJlVHlwZUV4YW1wbGVzL3NpdGUyL3NpdGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxzaXRlIHR5cGU9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZpbGUiPg0KLSAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9mZWF0dXJlMy9mZWF0dXJlczIuamFyZmlsZSIgdHlwZT0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUucGFja2FnZWQiLz4NCi08L3NpdGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRmVhdHVyZVR5cGVFeGFtcGxlcy9zaXRlMy9mZWF0dXJlcy9mZWF0dXJlMy9mZWF0dXJlczIuamFyZmlsZSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0ZlYXR1cmVUeXBlRXhhbXBsZXMvc2l0ZTMvZmVhdHVyZXMvZmVhdHVyZTMvZmVhdHVyZXMyLmphcmZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0MGFiNGYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRmVhdHVyZVR5cGVFeGFtcGxlcy9zaXRlMy9mZWF0dXJlcy9mZWF0dXJlMy9mZWF0dXJlczIuamFyZmlsZQorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0ZlYXR1cmVUeXBlRXhhbXBsZXMvc2l0ZTMvc2l0ZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9GZWF0dXJlVHlwZUV4YW1wbGVzL3NpdGUzL3NpdGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWYzNzJkLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0ZlYXR1cmVUeXBlRXhhbXBsZXMvc2l0ZTMvc2l0ZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHNpdGUgdHlwZT0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmlsZSI+DQotICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL2ZlYXR1cmUzL2ZlYXR1cmVzMi5qYXJmaWxlIiB0eXBlPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS51bmtub3dudHlwZS5qYXIiLz4NCi08L3NpdGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZSB3aXRoIHNwYWNlL2ZlYXR1cmVzIHNwYWNlL2hlbHBGZWF0dXJlLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGUgd2l0aCBzcGFjZS9mZWF0dXJlcyBzcGFjZS9oZWxwRmVhdHVyZS5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwMGJmZDguLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZSB3aXRoIHNwYWNlL2ZlYXR1cmVzIHNwYWNlL2hlbHBGZWF0dXJlLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGUgd2l0aCBzcGFjZS9mZWF0dXJlcyBzcGFjZS9zcGFjZSBmZWF0dXJlLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGUgd2l0aCBzcGFjZS9mZWF0dXJlcyBzcGFjZS9zcGFjZSBmZWF0dXJlLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAzMjNiMC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlIHdpdGggc3BhY2UvZmVhdHVyZXMgc3BhY2Uvc3BhY2UgZmVhdHVyZS5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlIHdpdGggc3BhY2UvaW5mby9pbWcvdG9wX3RpdGxzbS5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlIHdpdGggc3BhY2UvaW5mby9pbWcvdG9wX3RpdGxzbS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5MTdiYjYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZSB3aXRoIHNwYWNlL2luZm8vaW1nL3RvcF90aXRsc20uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZSB3aXRoIHNwYWNlL2luZm8vaW1nL3dlbF9tbC5qcGcgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlIHdpdGggc3BhY2UvaW5mby9pbWcvd2VsX21sLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFlMzNkZi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlIHdpdGggc3BhY2UvaW5mby9pbWcvd2VsX21sLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGUgd2l0aCBzcGFjZS9pbmZvL3NpdGVJbmZvLmh0bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlIHdpdGggc3BhY2UvaW5mby9zaXRlSW5mby5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDY1YWEzLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGUgd2l0aCBzcGFjZS9pbmZvL3NpdGVJbmZvLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCi08aHRtbD4NCi08aGVhZD4NCi08L2hlYWQ+DQotICA8Ym9keT4NCi08aW1nIHNyYz0iaW1nL3RvcF90aXRsc20uZ2lmIiBhbHQ9IiIgd2lkdGg9IjQ2MCIgaGVpZ2h0PSI1MCI+DQotPGJyPg0KLTxicj4NCi0gICAgIEl0IHN0YXJ0ZWQgd2l0aCBTbWFsbHRhbGs8YnI+DQotICAgIE9USSBoYXMgYmVlbiBidWlsZGluZyB0b29scyBmb3IgcGxhdGZvcm0taW5kZXBlbmRlbnQgT08gZGV2ZWxvcG1lbnQgc2luY2UNCi0gIDE5ODguIE91ciBFTlZZJnJlZzsgdGVjaG5vbG9neSBmaXJzdCBicm91Z2h0IGNvbGxhYm9yYXRpdmUgc29mdHdhcmUgZGV2ZWxvcG1lbnQsDQotICB2ZXJzaW9uIG1hbmFnZW1lbnQgYW5kIHNoYXJlZCByZXBvc2l0b3JpZXMgdG8gU21hbGx0YWxrLiBJQk0gaXMgb25lIG9mDQotbWFueSAgIGNvbXBhbmllcyB0byBsaWNlbnNlIEVOVlksIHdoaWNoIGNvbnRpbnVlcyB0byBiZSB0aGUgZm91bmRhdGlvbiBvZg0KLVZpc3VhbEFnZSZyZWc7ICAgU21hbGx0YWxrLjxicj4NCi08YnI+DQotPGJyPg0KLTxicj4NCi0gICAgICBOZXh0IGNhbWUgSmF2YSYjODQ4Mjs8YnI+DQotICAgIEJlY2F1c2Ugb2Ygb3VyIGV4cGVydGlzZSBpbiBPTyB0ZWNobm9sb2d5LCBJQk0gdHVybmVkIHRvIE9USSBmb3IgYSBuZXh0LWdlbmVyYXRpb24NCi0gIGRldmVsb3BtZW50IGVudmlyb25tZW50IGZvciBKYXZhLiBUaGUgcmVzdWx0IGlzIFZpc3VhbEFnZSBmb3IgSmF2YSwgd2hpY2gNCi0gIGNvbnRpbnVlcyB0byB3aW4gYXdhcmRzIGZvciBpdHMgaW5ub3ZhdGl2ZSBJREUgYW5kIHRlYW0gc3VwcG9ydC4gSW5mb1dvcmxkDQotICBoYXMgY2hvc2VuIFZpc3VhbEFnZSBmb3IgSmF2YSBhcyBkZXZlbG9wbWVudCB0b29sIG9mIHRoZSB5ZWFyIC0geWVhciBhZnRlcg0KLSAgeWVhciBhZnRlciB5ZWFyITxicj4NCi08YnI+DQotPGJyPg0KLTxicj4NCi0gICAgICBUaGVuIHBlcnZhc2l2ZSBjb21wdXRpbmc8YnI+DQotICAgIE9USSBjb250aW51ZXMgaXRzIGRldmVsb3BtZW50IG9mIElCTSdzIFZpc3VhbEFnZSBNaWNybyBFZGl0aW9uLCBhIHN0YXRlLW9mLXRoZS1hcnQNCi0gIHBsYXRmb3JtIGZvciBjb2xsYWJvcmF0aXZlIGRldmVsb3BtZW50IG9mIGVtYmVkZGVkIGFwcGxpY2F0aW9ucyBhbmQgc3lzdGVtcw0KLSAgdGhhdCBhcmUgdmVyeSBsZWFuLiBBcyB0aGUgc3RlYWR5IHN0cmVhbSBvZiBwcmVzcyByZWxlYXNlcyBhdHRlc3RzLCBWaXN1YWxBZ2UNCi0gIE1pY3JvIEVkaXRpb24gaXMgYWxyZWFkeSBsaWNlbnNlZCB0byB0aGUgbGVhZGluZyBtaWNyb2NoaXAgbWFudWZhY3R1cmVycywNCi0gIG1pY3Jva2VybmVsIGRldmVsb3BlcnMsIGFuZCBwcm9kdWNlcnMgb2YgaGFuZGhlbGQgYW5kIGNvbnN1bWVyIGRldmljZXMuPGJyPg0KLTxicj4NCi08YnI+DQotPGJyPg0KLSAgICAgIE5vdyBpdCdzIEVjbGlwc2U8YnI+DQotICAgIE9USSBoYXMgYnVpbHQgdGhlIG5leHQgZ2VuZXJhdGlvbiBJQk0gYXBwbGljYXRpb24gZGV2ZWxvcG1lbnQgdG9vbHMgcGxhdGZvcm0uDQotICBFY2xpcHNlIGlzIGEga2luZCBvZiB1bml2ZXJzYWwgdG9vbCBwbGF0Zm9ybSAtIGFuIG9wZW4gZXh0ZW5zaWJsZSBJREUgZm9yDQotICBhbnl0aGluZyBhbmQgbm90aGluZyBpbiBwYXJ0aWN1bGFyLiBUaGUgcmVhbCB2YWx1ZSBjb21lcyBmcm9tIHRvb2wgcGx1Zy1pbnMNCi0gIHRoYXQgInRlYWNoIiBFY2xpcHNlIGhvdyB0byB3b3JrIHdpdGggdGhpbmdzIC0gamF2YSBmaWxlcywgd2ViIGNvbnRlbnQsDQotZ3JhcGhpY3MsICB2aWRlbyAtIGFsbW9zdCBhbnl0aGluZyB5b3UgY2FuIGltYWdpbmUuIEVjbGlwc2UgYWxsb3dzIHlvdSB0bw0KLWluZGVwZW5kZW50bHkgIGRldmVsb3AgdG9vbHMgdGhhdCBpbnRlZ3JhdGUgd2l0aCBvdGhlciBwZW9wbGUncyB0b29scyBzbw0KLXNlYW1sZXNzbHkgeW91IHdvbid0IGtub3cgd2hlcmUgb25lIHRvb2wgZW5kcyBhbmQgYW5vdGhlciBzdGFydHMuIFRoZSBJQk0NCi1zdXBwb3J0ZWQgdmVyc2lvbiBvZiB0aGlzIHRlY2hub2xvZ3ksIFdlYlNwaGVyZSBTdHVkaW8gV29ya2JlbmNoLCB3aWxsIGJlDQotdGhlIGNvcmUgb2YgdGhlIG5leHQgIGdlbmVyYXRpb24gb2YgSUJNIGFuZCBJQk0gQnVzaW5lc3MgUGFydG5lciBlLWJ1c2luZXNzDQotdG9vbHMgb3B0aW1pemVkIGZvciAgdGhlIFdlYlNwaGVyZSBzb2Z0d2FyZSBwbGF0Zm9ybS48YnI+DQotPGJyPg0KLTxicj4NCi08YnI+DQotICAgICAgU28gd2hhdCdzIG5leHQ/PGJyPg0KLSAgICBPVEkgY29udGludWVzIHRvIGRlbGl2ZXIgb2JqZWN0LW9yaWVudGVkIHRlY2hub2xvZ3kgdGhhdCBzY2FsZXMgYWNyb3NzDQotIHBsYXRmb3JtcywgIGFjcm9zcyB0ZWFtcyBhbmQgYWNyb3NzIHByb2plY3Qgc2l6ZS4gRnJvbSBhIG1haW5mcmFtZSB0byBhDQotd2F0Y2ggIC0gd2UncmUgIGNsb3NpbmcgaW4gb24gdGhhdCB2aXNpb24uPGJyPg0KLTxicj4NCi08aW1nIHNyYz0iaW1nL3dlbF9tbC5qcGciIHdpZHRoPSI0NjAiIGhlaWdodD0iNDYwIiBhbHQ9IiI+DQotPGJyPg0KLTxicj4NCi08YnI+DQotPGJyPg0KLTxicj4NCi08YnI+DQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlIHdpdGggc3BhY2UvaW5zdGFsbC9mZWF0dXJlcyBzcGFjZS9mZWF0dXJlMy9mZWF0dXJlLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGUgd2l0aCBzcGFjZS9pbnN0YWxsL2ZlYXR1cmVzIHNwYWNlL2ZlYXR1cmUzL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGE5MGYzLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGUgd2l0aCBzcGFjZS9pbnN0YWxsL2ZlYXR1cmVzIHNwYWNlL2ZlYXR1cmUzL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMyIgaW1hZ2U9ImZlYXR1cmUxLmdpZiIgbGFiZWw9IlRoaXJkIEZlYXR1cmUiIHByb3ZpZGVyLW5hbWU9IlNtYXJ0IENvbXBhbnkiIHZlcnNpb249IjEuMC4wIiA+Ci0gIDxkZXNjcmlwdGlvbj5EZXNjcmlwdGlvbjwvZGVzY3JpcHRpb24+Ci0gIDxjb3B5cmlnaHQ+Y29weXJpZ2h0PC9jb3B5cmlnaHQ+Ci0gIDxsaWNlbnNlPmxpY2Vuc2U8L2xpY2Vuc2U+Ci0gIDx1cmw+Ci0gICAgPHVwZGF0ZSBsYWJlbD0iVVJMIHRvIHVwZGF0ZSB0aGUgZmVhdHVyZSIgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3BhdGgvZmVhdHVyZTEvIi8+Ci0gICAgPGRpc2NvdmVyeSBsYWJlbD0iRGlzY292ZXJ5IDEiIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyIvPgotICAgIDxkaXNjb3ZlcnkgbGFiZWw9IkRpc2NvdmVyeSAyIiB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciLz4KLSAgPC91cmw+Ci0gIDxwbHVnaW4gZG93bmxvYWQtc2l6ZT0iMTUwMCIgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5wbHVnaW4xIiBpbnN0YWxsLXNpemU9IjEwMDAiIGZyYWdtZW50PSJmYWxzZSIgbmw9ImVuLGZyIiBvcz0iV0lOMzIsTElOVVgsSFBVWCxNQUNPU1giIHZlcnNpb249IjEuMS4xIiB3cz0iV0lOMzIsTU9USUYsR1RLLENBUkJPTiIvPgotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZSB3aXRoIHNwYWNlL3BsdWdpbnMgc3BhY2UvUGRlX2NvcmUuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZSB3aXRoIHNwYWNlL3BsdWdpbnMgc3BhY2UvUGRlX2NvcmUuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTA3MjE3Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGUgd2l0aCBzcGFjZS9wbHVnaW5zIHNwYWNlL1BkZV9jb3JlLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGUgd2l0aCBzcGFjZS9wbHVnaW5zIHNwYWNlL2hlbHAuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZSB3aXRoIHNwYWNlL3BsdWdpbnMgc3BhY2UvaGVscC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1ODRmNjYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZSB3aXRoIHNwYWNlL3BsdWdpbnMgc3BhY2UvaGVscC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlIHdpdGggc3BhY2UvcGx1Z2lucyBzcGFjZS9qdW5pdF8zLjcuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZSB3aXRoIHNwYWNlL3BsdWdpbnMgc3BhY2UvanVuaXRfMy43LmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc1ODdiMi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlIHdpdGggc3BhY2UvcGx1Z2lucyBzcGFjZS9qdW5pdF8zLjcuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZSB3aXRoIHNwYWNlL3BsdWdpbnMgc3BhY2Uvb3JnLmVjbGlwc2UudXBkYXRlLnBsdWdpbjFfMS4xLjEvcGx1Z2luLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGUgd2l0aCBzcGFjZS9wbHVnaW5zIHNwYWNlL29yZy5lY2xpcHNlLnVwZGF0ZS5wbHVnaW4xXzEuMS4xL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwMTg0NmMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZSB3aXRoIHNwYWNlL3BsdWdpbnMgc3BhY2Uvb3JnLmVjbGlwc2UudXBkYXRlLnBsdWdpbjFfMS4xLjEvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwbHVnaW4gbmFtZT0iSlVuaXQgVGVzdCBGcmFtZXdvcmsiIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4xIiB2ZXJzaW9uPSIzLjUuNiIgdmVuZG9yLW5hbWU9Imp1bml0Lm9yZyI+Ci0gIDxydW50aW1lPgotICAgIDxsaWJyYXJ5IG5hbWU9Imp1bml0LmphciI+Ci0gICAgICA8ZXhwb3J0IG5hbWU9IioiLz4KLSAgICA8L2xpYnJhcnk+Ci0gIDwvcnVudGltZT4KLTwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGUgd2l0aCBzcGFjZS9wbHVnaW5zIHNwYWNlL29yZy5lY2xpcHNlLnVwZGF0ZS5wbHVnaW4xXzEuMS4xL3NyYy5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlIHdpdGggc3BhY2UvcGx1Z2lucyBzcGFjZS9vcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMV8xLjEuMS9zcmMuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDRkNjA5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGUgd2l0aCBzcGFjZS9wbHVnaW5zIHNwYWNlL29yZy5lY2xpcHNlLnVwZGF0ZS5wbHVnaW4xXzEuMS4xL3NyYy5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlIHdpdGggc3BhY2Uvc2l0ZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlIHdpdGggc3BhY2Uvc2l0ZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0OTI4ZmIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZSB3aXRoIHNwYWNlL3NpdGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08c2l0ZSB0eXBlPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5maWxlIj4NCi08ZGVzY3JpcHRpb24gdXJsPSJpbmZvL3NpdGVJbmZvLmh0bWwiLz4NCi0gIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMgc3BhY2UvaGVscEZlYXR1cmUuamFyIiB0eXBlPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5wYWNrYWdlZCI+DQotICAgIDxjYXRlZ29yeSBuYW1lPSJlY2xpcHNlL1VNTCIvPg0KLSAgPC9mZWF0dXJlPg0KLSAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcyBzcGFjZS9zcGFjZSBmZWF0dXJlLmphciIgdHlwZT0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUucGFja2FnZWQiPg0KLSAgICA8Y2F0ZWdvcnkgbmFtZT0iZWNsaXBzZS9KMkVFIi8+DQotICA8L2ZlYXR1cmU+DQotICA8ZmVhdHVyZSB1cmw9Imluc3RhbGwvZmVhdHVyZXMgc3BhY2UvZmVhdHVyZTMvIj4NCi0gICAgPGNhdGVnb3J5IG5hbWU9ImVjbGlwc2UiLz4NCi0gIDwvZmVhdHVyZT4NCi0gIDxhcmNoaXZlIHBhdGg9InBsdWdpbnMvb3JnLmVjbGlwc2UuaGVscF8xLjAuMC5qYXIiIHVybD0icGx1Z2lucyBzcGFjZS9oZWxwLmphciIvPg0KLSAgPGFyY2hpdmUgcGF0aD0icGx1Z2lucy9vcmcuZWNsaXBzZS5wZGUuY29yZV8xLjAuMC5qYXIiIHVybD0icGx1Z2lucyBzcGFjZS9QZGVfY29yZS5qYXIiLz4NCi0gIDxhcmNoaXZlIHBhdGg9InBsdWdpbnMvb3JnLmp1bml0XzMuNS4wLmphciIgdXJsPSJwbHVnaW5zIHNwYWNlL2p1bml0XzMuNy5qYXIiLz4NCi0gIDxhcmNoaXZlIHBhdGg9InBsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLnBsdWdpbjFfMS4xLjEuamFyIiB1cmw9InBsdWdpbnMgc3BhY2Uvb3JnLmVjbGlwc2UudXBkYXRlLnBsdWdpbjFfMS4xLjEiLz4gIA0KLSAgPGNhdGVnb3J5LWRlZiBsYWJlbD0iSUJNIFdTQUQgVG9vbHMiIG5hbWU9ImVjbGlwc2UiLz4NCi0gIDxjYXRlZ29yeS1kZWYgbGFiZWw9IkoyRUUgdG9vbHMiIG5hbWU9ImVjbGlwc2UvSjJFRSIvPg0KLSAgPGNhdGVnb3J5LWRlZiBsYWJlbD0iRUpCIFRvb2xzIiBuYW1lPSJlY2xpcHNlL0oyRUUvRUpCIi8+DQotICA8Y2F0ZWdvcnktZGVmIGxhYmVsPSJVTUwgdG9vbHMiIG5hbWU9ImVjbGlwc2UvVU1MIi8+DQotICA8Y2F0ZWdvcnktZGVmIGxhYmVsPSJNZXNzYWdpbmcgVG9vbHMiIG5hbWU9IkIyQiIvPiAgDQotPC9zaXRlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGVUeXBlRXhhbXBsZXMvc2l0ZTEvZmVhdHVyZXMvZmVhdHVyZTMvZmVhdHVyZXMyLmphcmZpbGUgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlVHlwZUV4YW1wbGVzL3NpdGUxL2ZlYXR1cmVzL2ZlYXR1cmUzL2ZlYXR1cmVzMi5qYXJmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDBhYjRmLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGVUeXBlRXhhbXBsZXMvc2l0ZTEvZmVhdHVyZXMvZmVhdHVyZTMvZmVhdHVyZXMyLmphcmZpbGUKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlVHlwZUV4YW1wbGVzL3NpdGUxL3NpdGUueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZVR5cGVFeGFtcGxlcy9zaXRlMS9zaXRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY3MTY1YS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlVHlwZUV4YW1wbGVzL3NpdGUxL3NpdGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxzaXRlIHR5cGU9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmh0dHAiPg0KLSAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9mZWF0dXJlMy9mZWF0dXJlczIuamFyZmlsZSIvPg0KLTwvc2l0ZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlVVJMVGVzdC9kYXRhL2FydGlmYWN0cy9mZWF0dXJlcy9oZWxwRmVhdHVyZS5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlVVJMVGVzdC9kYXRhL2FydGlmYWN0cy9mZWF0dXJlcy9oZWxwRmVhdHVyZS5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4MDk3MTMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZVVSTFRlc3QvZGF0YS9hcnRpZmFjdHMvZmVhdHVyZXMvaGVscEZlYXR1cmUuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZVVSTFRlc3QvZGF0YS9hcnRpZmFjdHMvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGRlLmZlYXR1cmVfMS4wLjAuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZVVSTFRlc3QvZGF0YS9hcnRpZmFjdHMvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGRlLmZlYXR1cmVfMS4wLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTkyYzFkLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGVVUkxUZXN0L2RhdGEvYXJ0aWZhY3RzL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnBkZS5mZWF0dXJlXzEuMC4wLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGVVUkxUZXN0L2RhdGEvYXJ0aWZhY3RzL3BsdWdpbnMvUGRlX2NvcmUuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZVVSTFRlc3QvZGF0YS9hcnRpZmFjdHMvcGx1Z2lucy9QZGVfY29yZS5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxMDcyMTcuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZVVSTFRlc3QvZGF0YS9hcnRpZmFjdHMvcGx1Z2lucy9QZGVfY29yZS5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlVVJMVGVzdC9kYXRhL2FydGlmYWN0cy9wbHVnaW5zL2hlbHAuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZVVSTFRlc3QvZGF0YS9hcnRpZmFjdHMvcGx1Z2lucy9oZWxwLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU4NGY2Ni4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlVVJMVGVzdC9kYXRhL2FydGlmYWN0cy9wbHVnaW5zL2hlbHAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZVVSTFRlc3QvZGF0YS9hcnRpZmFjdHMvcGx1Z2lucy9qdW5pdF8zLjcuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZVVSTFRlc3QvZGF0YS9hcnRpZmFjdHMvcGx1Z2lucy9qdW5pdF8zLjcuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzU4N2IyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGVVUkxUZXN0L2RhdGEvYXJ0aWZhY3RzL3BsdWdpbnMvanVuaXRfMy43LmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGVVUkxUZXN0L2RhdGEvaW5mby9pbWcvdG9wX3RpdGxzbS5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlVVJMVGVzdC9kYXRhL2luZm8vaW1nL3RvcF90aXRsc20uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTE3YmI2Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGVVUkxUZXN0L2RhdGEvaW5mby9pbWcvdG9wX3RpdGxzbS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlVVJMVGVzdC9kYXRhL2luZm8vaW1nL3dlbF9tbC5qcGcgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlVVJMVGVzdC9kYXRhL2luZm8vaW1nL3dlbF9tbC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxZTMzZGYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZVVSTFRlc3QvZGF0YS9pbmZvL2ltZy93ZWxfbWwuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZVVSTFRlc3QvZGF0YS9pbmZvL3NpdGVJbmZvLmh0bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlVVJMVGVzdC9kYXRhL2luZm8vc2l0ZUluZm8uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA2NWFhMy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlVVJMVGVzdC9kYXRhL2luZm8vc2l0ZUluZm8uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KLTxodG1sPg0KLTxoZWFkPg0KLTwvaGVhZD4NCi0gIDxib2R5Pg0KLTxpbWcgc3JjPSJpbWcvdG9wX3RpdGxzbS5naWYiIGFsdD0iIiB3aWR0aD0iNDYwIiBoZWlnaHQ9IjUwIj4NCi08YnI+DQotPGJyPg0KLSAgICAgSXQgc3RhcnRlZCB3aXRoIFNtYWxsdGFsazxicj4NCi0gICAgT1RJIGhhcyBiZWVuIGJ1aWxkaW5nIHRvb2xzIGZvciBwbGF0Zm9ybS1pbmRlcGVuZGVudCBPTyBkZXZlbG9wbWVudCBzaW5jZQ0KLSAgMTk4OC4gT3VyIEVOVlkmcmVnOyB0ZWNobm9sb2d5IGZpcnN0IGJyb3VnaHQgY29sbGFib3JhdGl2ZSBzb2Z0d2FyZSBkZXZlbG9wbWVudCwNCi0gIHZlcnNpb24gbWFuYWdlbWVudCBhbmQgc2hhcmVkIHJlcG9zaXRvcmllcyB0byBTbWFsbHRhbGsuIElCTSBpcyBvbmUgb2YNCi1tYW55ICAgY29tcGFuaWVzIHRvIGxpY2Vuc2UgRU5WWSwgd2hpY2ggY29udGludWVzIHRvIGJlIHRoZSBmb3VuZGF0aW9uIG9mDQotVmlzdWFsQWdlJnJlZzsgICBTbWFsbHRhbGsuPGJyPg0KLTxicj4NCi08YnI+DQotPGJyPg0KLSAgICAgIE5leHQgY2FtZSBKYXZhJiM4NDgyOzxicj4NCi0gICAgQmVjYXVzZSBvZiBvdXIgZXhwZXJ0aXNlIGluIE9PIHRlY2hub2xvZ3ksIElCTSB0dXJuZWQgdG8gT1RJIGZvciBhIG5leHQtZ2VuZXJhdGlvbg0KLSAgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQgZm9yIEphdmEuIFRoZSByZXN1bHQgaXMgVmlzdWFsQWdlIGZvciBKYXZhLCB3aGljaA0KLSAgY29udGludWVzIHRvIHdpbiBhd2FyZHMgZm9yIGl0cyBpbm5vdmF0aXZlIElERSBhbmQgdGVhbSBzdXBwb3J0LiBJbmZvV29ybGQNCi0gIGhhcyBjaG9zZW4gVmlzdWFsQWdlIGZvciBKYXZhIGFzIGRldmVsb3BtZW50IHRvb2wgb2YgdGhlIHllYXIgLSB5ZWFyIGFmdGVyDQotICB5ZWFyIGFmdGVyIHllYXIhPGJyPg0KLTxicj4NCi08YnI+DQotPGJyPg0KLSAgICAgIFRoZW4gcGVydmFzaXZlIGNvbXB1dGluZzxicj4NCi0gICAgT1RJIGNvbnRpbnVlcyBpdHMgZGV2ZWxvcG1lbnQgb2YgSUJNJ3MgVmlzdWFsQWdlIE1pY3JvIEVkaXRpb24sIGEgc3RhdGUtb2YtdGhlLWFydA0KLSAgcGxhdGZvcm0gZm9yIGNvbGxhYm9yYXRpdmUgZGV2ZWxvcG1lbnQgb2YgZW1iZWRkZWQgYXBwbGljYXRpb25zIGFuZCBzeXN0ZW1zDQotICB0aGF0IGFyZSB2ZXJ5IGxlYW4uIEFzIHRoZSBzdGVhZHkgc3RyZWFtIG9mIHByZXNzIHJlbGVhc2VzIGF0dGVzdHMsIFZpc3VhbEFnZQ0KLSAgTWljcm8gRWRpdGlvbiBpcyBhbHJlYWR5IGxpY2Vuc2VkIHRvIHRoZSBsZWFkaW5nIG1pY3JvY2hpcCBtYW51ZmFjdHVyZXJzLA0KLSAgbWljcm9rZXJuZWwgZGV2ZWxvcGVycywgYW5kIHByb2R1Y2VycyBvZiBoYW5kaGVsZCBhbmQgY29uc3VtZXIgZGV2aWNlcy48YnI+DQotPGJyPg0KLTxicj4NCi08YnI+DQotICAgICAgTm93IGl0J3MgRWNsaXBzZTxicj4NCi0gICAgT1RJIGhhcyBidWlsdCB0aGUgbmV4dCBnZW5lcmF0aW9uIElCTSBhcHBsaWNhdGlvbiBkZXZlbG9wbWVudCB0b29scyBwbGF0Zm9ybS4NCi0gIEVjbGlwc2UgaXMgYSBraW5kIG9mIHVuaXZlcnNhbCB0b29sIHBsYXRmb3JtIC0gYW4gb3BlbiBleHRlbnNpYmxlIElERSBmb3INCi0gIGFueXRoaW5nIGFuZCBub3RoaW5nIGluIHBhcnRpY3VsYXIuIFRoZSByZWFsIHZhbHVlIGNvbWVzIGZyb20gdG9vbCBwbHVnLWlucw0KLSAgdGhhdCAidGVhY2giIEVjbGlwc2UgaG93IHRvIHdvcmsgd2l0aCB0aGluZ3MgLSBqYXZhIGZpbGVzLCB3ZWIgY29udGVudCwNCi1ncmFwaGljcywgIHZpZGVvIC0gYWxtb3N0IGFueXRoaW5nIHlvdSBjYW4gaW1hZ2luZS4gRWNsaXBzZSBhbGxvd3MgeW91IHRvDQotaW5kZXBlbmRlbnRseSAgZGV2ZWxvcCB0b29scyB0aGF0IGludGVncmF0ZSB3aXRoIG90aGVyIHBlb3BsZSdzIHRvb2xzIHNvDQotc2VhbWxlc3NseSB5b3Ugd29uJ3Qga25vdyB3aGVyZSBvbmUgdG9vbCBlbmRzIGFuZCBhbm90aGVyIHN0YXJ0cy4gVGhlIElCTQ0KLXN1cHBvcnRlZCB2ZXJzaW9uIG9mIHRoaXMgdGVjaG5vbG9neSwgV2ViU3BoZXJlIFN0dWRpbyBXb3JrYmVuY2gsIHdpbGwgYmUNCi10aGUgY29yZSBvZiB0aGUgbmV4dCAgZ2VuZXJhdGlvbiBvZiBJQk0gYW5kIElCTSBCdXNpbmVzcyBQYXJ0bmVyIGUtYnVzaW5lc3MNCi10b29scyBvcHRpbWl6ZWQgZm9yICB0aGUgV2ViU3BoZXJlIHNvZnR3YXJlIHBsYXRmb3JtLjxicj4NCi08YnI+DQotPGJyPg0KLTxicj4NCi0gICAgICBTbyB3aGF0J3MgbmV4dD88YnI+DQotICAgIE9USSBjb250aW51ZXMgdG8gZGVsaXZlciBvYmplY3Qtb3JpZW50ZWQgdGVjaG5vbG9neSB0aGF0IHNjYWxlcyBhY3Jvc3MNCi0gcGxhdGZvcm1zLCAgYWNyb3NzIHRlYW1zIGFuZCBhY3Jvc3MgcHJvamVjdCBzaXplLiBGcm9tIGEgbWFpbmZyYW1lIHRvIGENCi13YXRjaCAgLSB3ZSdyZSAgY2xvc2luZyBpbiBvbiB0aGF0IHZpc2lvbi48YnI+DQotPGJyPg0KLTxpbWcgc3JjPSJpbWcvd2VsX21sLmpwZyIgd2lkdGg9IjQ2MCIgaGVpZ2h0PSI0NjAiIGFsdD0iIj4NCi08YnI+DQotPGJyPg0KLTxicj4NCi08YnI+DQotPGJyPg0KLTxicj4NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGVVUkxUZXN0L2RhdGEvc2l0ZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlVVJMVGVzdC9kYXRhL3NpdGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2VhNjg0Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGVVUkxUZXN0L2RhdGEvc2l0ZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHNpdGUgdXJsID0gImFydGlmYWN0cy8iPgotPGRlc2NyaXB0aW9uIHVybD0iaW5mby9zaXRlSW5mby5odG1sIi8+Ci0gIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvaGVscEZlYXR1cmUuamFyIiB0eXBlPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5wYWNrYWdlZCI+Ci0gICAgPGNhdGVnb3J5IG5hbWU9ImVjbGlwc2UvVU1MIi8+Ci0gIDwvZmVhdHVyZT4KLSAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5wZGUuZmVhdHVyZV8xLjAuMC5qYXIiIHR5cGU9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnBhY2thZ2VkIj4KLSAgICA8Y2F0ZWdvcnkgbmFtZT0iZWNsaXBzZS9KMkVFIi8+Ci0gIDwvZmVhdHVyZT4KLSAgPGFyY2hpdmUgcGF0aD0icGx1Z2lucy9vcmcuZWNsaXBzZS5oZWxwXzEuMC4wLmphciIgdXJsPSJwbHVnaW5zL2hlbHAuamFyIi8+Ci0gIDxhcmNoaXZlIHBhdGg9InBsdWdpbnMvb3JnLmVjbGlwc2UucGRlLmNvcmVfMS4wLjAuamFyIiB1cmw9InBsdWdpbnMvUGRlX2NvcmUuamFyIi8+Ci0gIDxhcmNoaXZlIHBhdGg9InBsdWdpbnMvb3JnLmp1bml0XzMuNS4wLmphciIgdXJsPSJwbHVnaW5zL2p1bml0XzMuNy5qYXIiLz4KLSAgPGNhdGVnb3J5LWRlZiBsYWJlbD0iSUJNIFdTQUQgVG9vbHMiIG5hbWU9ImVjbGlwc2UiLz4KLSAgPGNhdGVnb3J5LWRlZiBsYWJlbD0iSjJFRSB0b29scyIgbmFtZT0iZWNsaXBzZS9KMkVFIi8+Ci0gIDxjYXRlZ29yeS1kZWYgbGFiZWw9IkVKQiBUb29scyIgbmFtZT0iZWNsaXBzZS9KMkVFL0VKQiIvPgotICA8Y2F0ZWdvcnktZGVmIGxhYmVsPSJVTUwgdG9vbHMiIG5hbWU9ImVjbGlwc2UvVU1MIi8+Ci0gIDxjYXRlZ29yeS1kZWYgbGFiZWw9Ik1lc3NhZ2luZyBUb29scyIgbmFtZT0iQjJCIi8+ICAKLTwvc2l0ZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9kYXRhRW50cnlTaXRlVGVzdC9zaXRlMS9maWxlMS56aXAgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9kYXRhRW50cnlTaXRlVGVzdC9zaXRlMS9maWxlMS56aXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhNzBiN2UuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvZGF0YUVudHJ5U2l0ZVRlc3Qvc2l0ZTEvZmlsZTEuemlwCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvZGF0YUVudHJ5U2l0ZVRlc3Qvc2l0ZTEvaW5zdGFsbC9mZWF0dXJlcy9mZWF0dXJlMy9mZWF0dXJlLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL2RhdGFFbnRyeVNpdGVUZXN0L3NpdGUxL2luc3RhbGwvZmVhdHVyZXMvZmVhdHVyZTMvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiNDU0ZWMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvZGF0YUVudHJ5U2l0ZVRlc3Qvc2l0ZTEvaW5zdGFsbC9mZWF0dXJlcy9mZWF0dXJlMy9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTMiIGltYWdlPSJmZWF0dXJlMS5naWYiIGxhYmVsPSJUaGlyZCBGZWF0dXJlIiBwcm92aWRlci1uYW1lPSJTbWFydCBDb21wYW55IiB2ZXJzaW9uPSIxLjAuMCI+DQotCTxpbnN0YWxsLWhhbmRsZXIgaGFuZGxlcj0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuRGVmYXVsdEluc3RhbGxIYW5kbGVyIi8+DQotICAJPGRhdGEgZG93bmxvYWQtc2l6ZT0iMTUwMCIgaWQ9ImZpbGUuemlwIiBpbnN0YWxsLXNpemU9IjEwMDAiLz4NCi08L2ZlYXR1cmU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvZGF0YUVudHJ5U2l0ZVRlc3Qvc2l0ZTEvc2l0ZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9kYXRhRW50cnlTaXRlVGVzdC9zaXRlMS9zaXRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQxZjIxZC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9kYXRhRW50cnlTaXRlVGVzdC9zaXRlMS9zaXRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08c2l0ZSB0eXBlPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5maWxlIj4NCi08ZGVzY3JpcHRpb24gdXJsPSJpbmZvL3NpdGVJbmZvLmh0bWwiLz4NCi0gIDxmZWF0dXJlIHVybD0iaW5zdGFsbC9mZWF0dXJlcy9mZWF0dXJlMyI+DQotICA8L2ZlYXR1cmU+DQotICA8YXJjaGl2ZSBwYXRoPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlM18xLjAuMC9maWxlLnppcCIgdXJsPSJmaWxlMS56aXAiLz4NCi08L3NpdGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvZGF0YUVudHJ5U2l0ZVRlc3Qvc2l0ZTIvZmVhdHVyZXMvZmVhdHVyZXMzLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL2RhdGFFbnRyeVNpdGVUZXN0L3NpdGUyL2ZlYXR1cmVzL2ZlYXR1cmVzMy5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0YzZlY2EuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvZGF0YUVudHJ5U2l0ZVRlc3Qvc2l0ZTIvZmVhdHVyZXMvZmVhdHVyZXMzLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL2RhdGFFbnRyeVNpdGVUZXN0L3NpdGUyL25vbiBkYXRhL2Fub3RoZXIgZmlsZS56aXAgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9kYXRhRW50cnlTaXRlVGVzdC9zaXRlMi9ub24gZGF0YS9hbm90aGVyIGZpbGUuemlwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTcwYjdlLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL2RhdGFFbnRyeVNpdGVUZXN0L3NpdGUyL25vbiBkYXRhL2Fub3RoZXIgZmlsZS56aXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9kYXRhRW50cnlTaXRlVGVzdC9zaXRlMi9zaXRlLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL2RhdGFFbnRyeVNpdGVUZXN0L3NpdGUyL3NpdGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDA5NDNjLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL2RhdGFFbnRyeVNpdGVUZXN0L3NpdGUyL3NpdGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxzaXRlIHR5cGU9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZpbGUiPg0KLTxkZXNjcmlwdGlvbiB1cmw9ImluZm8vc2l0ZUluZm8uaHRtbCIvPg0KLSAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9mZWF0dXJlczMuamFyIiB0eXBlPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5wYWNrYWdlZCI+DQotICA8L2ZlYXR1cmU+DQotICA8YXJjaGl2ZSBwYXRoPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlM18xLjAuMC9maWxlLnppcCIgdXJsPSJub24gZGF0YS9hbm90aGVyIGZpbGUuemlwIi8+DQotPC9zaXRlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL2ZlYXR1cmVzL2ZlYXR1cmVzMi5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9mZWF0dXJlcy9mZWF0dXJlczIuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGQwMDRkLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL2ZlYXR1cmVzL2ZlYXR1cmVzMi5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9mZWF0dXJlcy9vcmcuZWNsaXBzZS50ZXN0LmZlYXR1cmVfMS4wLjAuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UudGVzdC5mZWF0dXJlXzEuMC4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODcwYTcwZC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9mZWF0dXJlcy9vcmcuZWNsaXBzZS50ZXN0LmZlYXR1cmVfMS4wLjAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTFfMS4wLjQuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTFfMS4wLjQuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWM3MTUzLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxXzEuMC40LmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL2ZlYXR1cmVzL29yZy5lY2xpcHNlX3Rlc3RfZmVhdHVyZS5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9mZWF0dXJlcy9vcmcuZWNsaXBzZV90ZXN0X2ZlYXR1cmUuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzhkZGM0Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL2ZlYXR1cmVzL29yZy5lY2xpcHNlX3Rlc3RfZmVhdHVyZS5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMS8ucHJvamVjdCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUxLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDUyMDY5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUxLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+dXBkYXRlLXNpdGUxPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlVwZGF0ZVNpdGVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuVXBkYXRlU2l0ZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTEvLnNpdGVidWlsZC9idWlsZC5sb2cgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMS8uc2l0ZWJ1aWxkL2J1aWxkLmxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JjZTE5NC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMS8uc2l0ZWJ1aWxkL2J1aWxkLmxvZworKysgL2Rldi9udWxsCkBAIC0xLDMxOCArMCwwIEBACi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBidWlsZC51cGRhdGUuamFyDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogYWxsLmZlYXR1cmVzDQotVGFyZ2V0IGZpbmlzaGVkOiBhbGwuZmVhdHVyZXMNCi1UYXJnZXQgc3RhcnRlZDogYWxsLnBsdWdpbnMNCi1UYXNrIHN0YXJ0ZWQ6IGFudA0KLVRhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogYnVpbGQudXBkYXRlLmphcg0KLVRhc2sgc3RhcnRlZDogZGVsZXRlDQotVGFzayBmaW5pc2hlZDogZGVsZXRlDQotVGFzayBzdGFydGVkOiBta2Rpcg0KLVRhc2sgZmluaXNoZWQ6IG1rZGlyDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBidWlsZC5qYXJzDQotVGFzayBzdGFydGVkOiBhdmFpbGFibGUNCi1UYXNrIGZpbmlzaGVkOiBhdmFpbGFibGUNCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IHBsdWdpbjMuamFyDQotVGFzayBzdGFydGVkOiBkZWxldGUNCi1UYXNrIGZpbmlzaGVkOiBkZWxldGUNCi1UYXNrIHN0YXJ0ZWQ6IG1rZGlyDQotVGFzayBmaW5pc2hlZDogbWtkaXINCi1UYXNrIHN0YXJ0ZWQ6IGphdmFjDQotTWVzc2FnZSBsb2dnZWQ6IENvbXBpbGUgZmFpbGVkOyBzZWUgdGhlIGNvbXBpbGVyIGVycm9yIG91dHB1dCBmb3IgZGV0YWlscy4NCi1UYXNrIGZpbmlzaGVkOiBqYXZhYw0KLVRhc2sgc3RhcnRlZDogY29weQ0KLVRhc2sgZmluaXNoZWQ6IGNvcHkNCi1UYXNrIHN0YXJ0ZWQ6IG1rZGlyDQotVGFzayBmaW5pc2hlZDogbWtkaXINCi1UYXNrIHN0YXJ0ZWQ6IGphcg0KLVRhc2sgZmluaXNoZWQ6IGphcg0KLVRhc2sgc3RhcnRlZDogZGVsZXRlDQotVGFzayBmaW5pc2hlZDogZGVsZXRlDQotVGFyZ2V0IGZpbmlzaGVkOiBwbHVnaW4zLmphcg0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXJnZXQgZmluaXNoZWQ6IGJ1aWxkLmphcnMNCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBnYXRoZXIuYmluLnBhcnRzDQotVGFzayBzdGFydGVkOiBta2Rpcg0KLVRhc2sgZmluaXNoZWQ6IG1rZGlyDQotVGFzayBzdGFydGVkOiBjb3B5DQotVGFzayBmaW5pc2hlZDogY29weQ0KLVRhc2sgc3RhcnRlZDogY29weQ0KLVRhc2sgZmluaXNoZWQ6IGNvcHkNCi1UYXJnZXQgZmluaXNoZWQ6IGdhdGhlci5iaW4ucGFydHMNCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFzayBzdGFydGVkOiB6aXANCi1UYXNrIGZpbmlzaGVkOiB6aXANCi1UYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KLVRhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KLVRhcmdldCBmaW5pc2hlZDogYnVpbGQudXBkYXRlLmphcg0KLVRhc2sgZmluaXNoZWQ6IGFudA0KLVRhc2sgc3RhcnRlZDogYW50DQotVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBidWlsZC51cGRhdGUuamFyDQotVGFzayBzdGFydGVkOiBkZWxldGUNCi1UYXNrIGZpbmlzaGVkOiBkZWxldGUNCi1UYXNrIHN0YXJ0ZWQ6IG1rZGlyDQotVGFzayBmaW5pc2hlZDogbWtkaXINCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGJ1aWxkLmphcnMNCi1UYXNrIHN0YXJ0ZWQ6IGF2YWlsYWJsZQ0KLVRhc2sgZmluaXNoZWQ6IGF2YWlsYWJsZQ0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogcGx1Z2luNC5qYXINCi1UYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KLVRhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KLVRhc2sgc3RhcnRlZDogbWtkaXINCi1UYXNrIGZpbmlzaGVkOiBta2Rpcg0KLVRhc2sgc3RhcnRlZDogamF2YWMNCi1NZXNzYWdlIGxvZ2dlZDogQ29tcGlsZSBmYWlsZWQ7IHNlZSB0aGUgY29tcGlsZXIgZXJyb3Igb3V0cHV0IGZvciBkZXRhaWxzLg0KLVRhc2sgZmluaXNoZWQ6IGphdmFjDQotVGFzayBzdGFydGVkOiBjb3B5DQotVGFzayBmaW5pc2hlZDogY29weQ0KLVRhc2sgc3RhcnRlZDogbWtkaXINCi1UYXNrIGZpbmlzaGVkOiBta2Rpcg0KLVRhc2sgc3RhcnRlZDogamFyDQotVGFzayBmaW5pc2hlZDogamFyDQotVGFzayBzdGFydGVkOiBkZWxldGUNCi1UYXNrIGZpbmlzaGVkOiBkZWxldGUNCi1UYXJnZXQgZmluaXNoZWQ6IHBsdWdpbjQuamFyDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhcmdldCBmaW5pc2hlZDogYnVpbGQuamFycw0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGdhdGhlci5iaW4ucGFydHMNCi1UYXNrIHN0YXJ0ZWQ6IG1rZGlyDQotVGFzayBmaW5pc2hlZDogbWtkaXINCi1UYXNrIHN0YXJ0ZWQ6IGNvcHkNCi1UYXNrIGZpbmlzaGVkOiBjb3B5DQotVGFzayBzdGFydGVkOiBjb3B5DQotVGFzayBmaW5pc2hlZDogY29weQ0KLVRhcmdldCBmaW5pc2hlZDogZ2F0aGVyLmJpbi5wYXJ0cw0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXNrIHN0YXJ0ZWQ6IHppcA0KLVRhc2sgZmluaXNoZWQ6IHppcA0KLVRhc2sgc3RhcnRlZDogZGVsZXRlDQotVGFzayBmaW5pc2hlZDogZGVsZXRlDQotVGFyZ2V0IGZpbmlzaGVkOiBidWlsZC51cGRhdGUuamFyDQotVGFzayBmaW5pc2hlZDogYW50DQotVGFyZ2V0IGZpbmlzaGVkOiBhbGwucGx1Z2lucw0KLVRhcmdldCBzdGFydGVkOiB1cGRhdGUuZmVhdHVyZQ0KLVRhcmdldCBmaW5pc2hlZDogdXBkYXRlLmZlYXR1cmUNCi1UYXJnZXQgc3RhcnRlZDogYWxsLmNoaWxkcmVuDQotVGFyZ2V0IGZpbmlzaGVkOiBhbGwuY2hpbGRyZW4NCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBkZWxldGUNCi1UYXNrIGZpbmlzaGVkOiBkZWxldGUNCi1UYXNrIHN0YXJ0ZWQ6IG1rZGlyDQotVGFzayBmaW5pc2hlZDogbWtkaXINCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBnYXRoZXIuYmluLnBhcnRzDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IGNoaWxkcmVuDQotVGFyZ2V0IGZpbmlzaGVkOiBjaGlsZHJlbg0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXNrIHN0YXJ0ZWQ6IG1rZGlyDQotVGFzayBmaW5pc2hlZDogbWtkaXINCi1UYXNrIHN0YXJ0ZWQ6IGNvcHkNCi1UYXNrIGZpbmlzaGVkOiBjb3B5DQotVGFzayBzdGFydGVkOiBlY2xpcHNlLmlkUmVwbGFjZXINCi1UYXNrIGZpbmlzaGVkOiBlY2xpcHNlLmlkUmVwbGFjZXINCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogUk9PVEZJTEVTKl8qXyoNCi1UYXJnZXQgZmluaXNoZWQ6IFJPT1RGSUxFUypfKl8qDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhcmdldCBmaW5pc2hlZDogZ2F0aGVyLmJpbi5wYXJ0cw0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXNrIHN0YXJ0ZWQ6IGphcg0KLVRhc2sgZmluaXNoZWQ6IGphcg0KLVRhc2sgc3RhcnRlZDogZGVsZXRlDQotVGFzayBmaW5pc2hlZDogZGVsZXRlDQotVGFyZ2V0IGZpbmlzaGVkOiBidWlsZC51cGRhdGUuamFyDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogcmVmcmVzaA0KLVRhc2sgc3RhcnRlZDogZWNsaXBzZS5jb252ZXJ0UGF0aA0KLVRhc2sgZmluaXNoZWQ6IGVjbGlwc2UuY29udmVydFBhdGgNCi1UYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UucmVmcmVzaExvY2FsDQotTWVzc2FnZSBsb2dnZWQ6IFByb2plY3QgJHt1cGRhdGUuZmVhdHVyZTNfMS4wLjB9IGRvZXMgbm90IGV4aXN0IGFuZCBjYW5ub3QgYmUgcmVmcmVzaGVkLg0KLVRhc2sgZmluaXNoZWQ6IGVjbGlwc2UucmVmcmVzaExvY2FsDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogYWxsLmZlYXR1cmVzDQotVGFyZ2V0IGZpbmlzaGVkOiBhbGwuZmVhdHVyZXMNCi1UYXJnZXQgc3RhcnRlZDogYWxsLnBsdWdpbnMNCi1UYXNrIHN0YXJ0ZWQ6IGFudA0KLVRhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogcmVmcmVzaA0KLVRhc2sgc3RhcnRlZDogZWNsaXBzZS5jb252ZXJ0UGF0aA0KLVRhc2sgZmluaXNoZWQ6IGVjbGlwc2UuY29udmVydFBhdGgNCi1UYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UucmVmcmVzaExvY2FsDQotVGFzayBmaW5pc2hlZDogZWNsaXBzZS5yZWZyZXNoTG9jYWwNCi1UYXJnZXQgZmluaXNoZWQ6IHJlZnJlc2gNCi1UYXNrIGZpbmlzaGVkOiBhbnQNCi1UYXNrIHN0YXJ0ZWQ6IGFudA0KLVRhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogcmVmcmVzaA0KLVRhc2sgc3RhcnRlZDogZWNsaXBzZS5jb252ZXJ0UGF0aA0KLVRhc2sgZmluaXNoZWQ6IGVjbGlwc2UuY29udmVydFBhdGgNCi1UYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UucmVmcmVzaExvY2FsDQotVGFzayBmaW5pc2hlZDogZWNsaXBzZS5yZWZyZXNoTG9jYWwNCi1UYXJnZXQgZmluaXNoZWQ6IHJlZnJlc2gNCi1UYXNrIGZpbmlzaGVkOiBhbnQNCi1UYXJnZXQgZmluaXNoZWQ6IGFsbC5wbHVnaW5zDQotVGFyZ2V0IHN0YXJ0ZWQ6IHVwZGF0ZS5mZWF0dXJlDQotVGFyZ2V0IGZpbmlzaGVkOiB1cGRhdGUuZmVhdHVyZQ0KLVRhcmdldCBzdGFydGVkOiBhbGwuY2hpbGRyZW4NCi1UYXJnZXQgZmluaXNoZWQ6IGFsbC5jaGlsZHJlbg0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXJnZXQgZmluaXNoZWQ6IHJlZnJlc2gNCi1CdWlsZCBmaW5pc2hlZC4NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMS8uc2l0ZWJ1aWxkL3NpdGVidWlsZC54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMS8uc2l0ZWJ1aWxkL3NpdGVidWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlNzAwYjkuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTEvLnNpdGVidWlsZC9zaXRlYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxzaXRlLWJ1aWxkCi0gICAgICBmZWF0dXJlLWxvY2F0aW9uPSJmZWF0dXJlcyIKLSAgICAgIHBsdWdpbi1sb2NhdGlvbj0icGx1Z2lucyIKLSAgICAgIGF1dG9idWlsZD0iZmFsc2UiCi0gICAgICBzY3J1Yi1vdXRwdXQ9ImZhbHNlIgotICAgICAgdXNlLWNvbnNvbGU9InRydWUiPgotICAgPGZlYXR1cmUgaWQ9InVwZGF0ZS5mZWF0dXJlMSIgdmVyc2lvbj0iMS4wLjAiLz4KLSAgIDxmZWF0dXJlIGlkPSJ1cGRhdGUuZmVhdHVyZTIiIHZlcnNpb249IjEuMC4wIi8+Ci0gICA8ZmVhdHVyZSBpZD0idXBkYXRlLmZlYXR1cmUzIiB2ZXJzaW9uPSIxLjAuMCIvPgotPC9zaXRlLWJ1aWxkPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTEvZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUxXzEuMC4wLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUxL2ZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlMV8xLjAuMC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4MTJiMGIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTEvZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUxXzEuMC4wLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUxL2ZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlMl8xLjAuMC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMS9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTJfMS4wLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmYxNzU0Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUxL2ZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlMl8xLjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMS9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTNfMS4wLjAuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTEvZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUzXzEuMC4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY4MmE2Mi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMS9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTNfMS4wLjAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTEvcGx1Z2lucy9jb20ucGx1Z2luMV8xLjAuMC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMS9wbHVnaW5zL2NvbS5wbHVnaW4xXzEuMC4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJiYzdmMy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMS9wbHVnaW5zL2NvbS5wbHVnaW4xXzEuMC4wLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUxL3BsdWdpbnMvY29tLnBsdWdpbjJfMS4wLjAuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTEvcGx1Z2lucy9jb20ucGx1Z2luMl8xLjAuMC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkNDI1ODMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTEvcGx1Z2lucy9jb20ucGx1Z2luMl8xLjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMS9wbHVnaW5zL2NvbS5wbHVnaW4zXzEuMC4wLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUxL3BsdWdpbnMvY29tLnBsdWdpbjNfMS4wLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTk0ZTUyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUxL3BsdWdpbnMvY29tLnBsdWdpbjNfMS4wLjAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTEvcGx1Z2lucy9jb20ucGx1Z2luNF8xLjAuMC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMS9wbHVnaW5zL2NvbS5wbHVnaW40XzEuMC4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhjY2EyOC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMS9wbHVnaW5zL2NvbS5wbHVnaW40XzEuMC4wLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUxL3NpdGUueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTEvc2l0ZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2M2Y3YmIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTEvc2l0ZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHNpdGU+Ci0gICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlMV8xLjAuMC5qYXIiIGlkPSJ1cGRhdGUuZmVhdHVyZTEiIHZlcnNpb249IjEuMC4wIj4KLSAgICAgIDxjYXRlZ29yeSBuYW1lPSJTaXRlMS1DYXRlZ29yeTEiLz4KLSAgIDwvZmVhdHVyZT4KLSAgIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUyXzEuMC4wLmphciIgaWQ9InVwZGF0ZS5mZWF0dXJlMiIgdmVyc2lvbj0iMS4wLjAiPgotICAgICAgPGNhdGVnb3J5IG5hbWU9IlNpdGUxLUNhdGVnb3J5MiIvPgotICAgPC9mZWF0dXJlPgotICAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy91cGRhdGUuZmVhdHVyZTNfMS4wLjAuamFyIiBpZD0idXBkYXRlLmZlYXR1cmUzIiB2ZXJzaW9uPSIxLjAuMCI+Ci0gICAgICA8Y2F0ZWdvcnkgbmFtZT0iU2l0ZTEtQ2F0ZWdvcnkzIi8+Ci0gICA8L2ZlYXR1cmU+Ci0gICA8Y2F0ZWdvcnktZGVmIG5hbWU9IlNpdGUxLUNhdGVnb3J5MSIgbGFiZWw9IlNpdGUxLUNhdGVnb3J5MS1MYWJlbCI+Ci0gICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICBlY2V0ZXJhLgotICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgIDwvY2F0ZWdvcnktZGVmPgotICAgPGNhdGVnb3J5LWRlZiBuYW1lPSJTaXRlMS1DYXRlZ29yeTIiIGxhYmVsPSJTaXRlMS1DYXRlZ29yeTItTGFiZWwiPgotICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgZWNldGVyYS4KLSAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICA8L2NhdGVnb3J5LWRlZj4KLSAgIDxjYXRlZ29yeS1kZWYgbmFtZT0iU2l0ZTEtQ2F0ZWdvcnkzIiBsYWJlbD0iU2l0ZTEtQ2F0ZWdvcnkzLUxhYmVsIj4KLSAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgIGVjZXRlcmEuCi0gICAgICA8L2Rlc2NyaXB0aW9uPgotICAgPC9jYXRlZ29yeS1kZWY+Ci08L3NpdGU+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMi8ucHJvamVjdCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUyLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGI2ODdlLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUyLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+dXBkYXRlLXNpdGUyPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlVwZGF0ZVNpdGVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuVXBkYXRlU2l0ZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTIvLnNpdGVidWlsZC9idWlsZC5sb2cgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMi8uc2l0ZWJ1aWxkL2J1aWxkLmxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk3Nzg1MC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMi8uc2l0ZWJ1aWxkL2J1aWxkLmxvZworKysgL2Rldi9udWxsCkBAIC0xLDIwMyArMCwwIEBACi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBidWlsZC51cGRhdGUuamFyDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogYWxsLmZlYXR1cmVzDQotVGFyZ2V0IGZpbmlzaGVkOiBhbGwuZmVhdHVyZXMNCi1UYXJnZXQgc3RhcnRlZDogYWxsLnBsdWdpbnMNCi1UYXNrIHN0YXJ0ZWQ6IGFudA0KLVRhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogYnVpbGQudXBkYXRlLmphcg0KLVRhc2sgc3RhcnRlZDogZGVsZXRlDQotVGFzayBmaW5pc2hlZDogZGVsZXRlDQotVGFzayBzdGFydGVkOiBta2Rpcg0KLVRhc2sgZmluaXNoZWQ6IG1rZGlyDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBidWlsZC5qYXJzDQotVGFzayBzdGFydGVkOiBhdmFpbGFibGUNCi1UYXNrIGZpbmlzaGVkOiBhdmFpbGFibGUNCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IHBsdWdpbjIuamFyDQotVGFzayBzdGFydGVkOiBkZWxldGUNCi1UYXNrIGZpbmlzaGVkOiBkZWxldGUNCi1UYXNrIHN0YXJ0ZWQ6IG1rZGlyDQotVGFzayBmaW5pc2hlZDogbWtkaXINCi1UYXNrIHN0YXJ0ZWQ6IGphdmFjDQotTWVzc2FnZSBsb2dnZWQ6IENvbXBpbGUgZmFpbGVkOyBzZWUgdGhlIGNvbXBpbGVyIGVycm9yIG91dHB1dCBmb3IgZGV0YWlscy4NCi1UYXNrIGZpbmlzaGVkOiBqYXZhYw0KLVRhc2sgc3RhcnRlZDogY29weQ0KLVRhc2sgZmluaXNoZWQ6IGNvcHkNCi1UYXNrIHN0YXJ0ZWQ6IG1rZGlyDQotVGFzayBmaW5pc2hlZDogbWtkaXINCi1UYXNrIHN0YXJ0ZWQ6IGphcg0KLVRhc2sgZmluaXNoZWQ6IGphcg0KLVRhc2sgc3RhcnRlZDogZGVsZXRlDQotVGFzayBmaW5pc2hlZDogZGVsZXRlDQotVGFyZ2V0IGZpbmlzaGVkOiBwbHVnaW4yLmphcg0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXJnZXQgZmluaXNoZWQ6IGJ1aWxkLmphcnMNCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBnYXRoZXIuYmluLnBhcnRzDQotVGFzayBzdGFydGVkOiBta2Rpcg0KLVRhc2sgZmluaXNoZWQ6IG1rZGlyDQotVGFzayBzdGFydGVkOiBjb3B5DQotVGFzayBmaW5pc2hlZDogY29weQ0KLVRhc2sgc3RhcnRlZDogY29weQ0KLVRhc2sgZmluaXNoZWQ6IGNvcHkNCi1UYXJnZXQgZmluaXNoZWQ6IGdhdGhlci5iaW4ucGFydHMNCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFzayBzdGFydGVkOiB6aXANCi1UYXNrIGZpbmlzaGVkOiB6aXANCi1UYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KLVRhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KLVRhcmdldCBmaW5pc2hlZDogYnVpbGQudXBkYXRlLmphcg0KLVRhc2sgZmluaXNoZWQ6IGFudA0KLVRhcmdldCBmaW5pc2hlZDogYWxsLnBsdWdpbnMNCi1UYXJnZXQgc3RhcnRlZDogdXBkYXRlLmZlYXR1cmUNCi1UYXJnZXQgZmluaXNoZWQ6IHVwZGF0ZS5mZWF0dXJlDQotVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5jaGlsZHJlbg0KLVRhcmdldCBmaW5pc2hlZDogYWxsLmNoaWxkcmVuDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogZGVsZXRlDQotVGFzayBmaW5pc2hlZDogZGVsZXRlDQotVGFzayBzdGFydGVkOiBta2Rpcg0KLVRhc2sgZmluaXNoZWQ6IG1rZGlyDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogZ2F0aGVyLmJpbi5wYXJ0cw0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBjaGlsZHJlbg0KLVRhcmdldCBmaW5pc2hlZDogY2hpbGRyZW4NCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFzayBzdGFydGVkOiBta2Rpcg0KLVRhc2sgZmluaXNoZWQ6IG1rZGlyDQotVGFzayBzdGFydGVkOiBjb3B5DQotVGFzayBmaW5pc2hlZDogY29weQ0KLVRhc2sgc3RhcnRlZDogZWNsaXBzZS5pZFJlcGxhY2VyDQotVGFzayBmaW5pc2hlZDogZWNsaXBzZS5pZFJlcGxhY2VyDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IFJPT1RGSUxFUypfKl8qDQotVGFyZ2V0IGZpbmlzaGVkOiBST09URklMRVMqXypfKg0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXJnZXQgZmluaXNoZWQ6IGdhdGhlci5iaW4ucGFydHMNCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFzayBzdGFydGVkOiBqYXINCi1UYXNrIGZpbmlzaGVkOiBqYXINCi1UYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KLVRhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KLVRhcmdldCBmaW5pc2hlZDogYnVpbGQudXBkYXRlLmphcg0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IHJlZnJlc2gNCi1UYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UuY29udmVydFBhdGgNCi1UYXNrIGZpbmlzaGVkOiBlY2xpcHNlLmNvbnZlcnRQYXRoDQotVGFzayBzdGFydGVkOiBlY2xpcHNlLnJlZnJlc2hMb2NhbA0KLU1lc3NhZ2UgbG9nZ2VkOiBQcm9qZWN0ICR7dXBkYXRlLmZlYXR1cmUyXzEuMC4wfSBkb2VzIG5vdCBleGlzdCBhbmQgY2Fubm90IGJlIHJlZnJlc2hlZC4NCi1UYXNrIGZpbmlzaGVkOiBlY2xpcHNlLnJlZnJlc2hMb2NhbA0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5mZWF0dXJlcw0KLVRhcmdldCBmaW5pc2hlZDogYWxsLmZlYXR1cmVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5wbHVnaW5zDQotVGFzayBzdGFydGVkOiBhbnQNCi1UYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IHJlZnJlc2gNCi1UYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UuY29udmVydFBhdGgNCi1UYXNrIGZpbmlzaGVkOiBlY2xpcHNlLmNvbnZlcnRQYXRoDQotVGFzayBzdGFydGVkOiBlY2xpcHNlLnJlZnJlc2hMb2NhbA0KLVRhc2sgZmluaXNoZWQ6IGVjbGlwc2UucmVmcmVzaExvY2FsDQotVGFyZ2V0IGZpbmlzaGVkOiByZWZyZXNoDQotVGFzayBmaW5pc2hlZDogYW50DQotVGFyZ2V0IGZpbmlzaGVkOiBhbGwucGx1Z2lucw0KLVRhcmdldCBzdGFydGVkOiB1cGRhdGUuZmVhdHVyZQ0KLVRhcmdldCBmaW5pc2hlZDogdXBkYXRlLmZlYXR1cmUNCi1UYXJnZXQgc3RhcnRlZDogYWxsLmNoaWxkcmVuDQotVGFyZ2V0IGZpbmlzaGVkOiBhbGwuY2hpbGRyZW4NCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFyZ2V0IGZpbmlzaGVkOiByZWZyZXNoDQotQnVpbGQgZmluaXNoZWQuDQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTIvLnNpdGVidWlsZC9zaXRlYnVpbGQueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTIvLnNpdGVidWlsZC9zaXRlYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjU4ODIwLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUyLy5zaXRlYnVpbGQvc2l0ZWJ1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08c2l0ZS1idWlsZAotICAgICAgZmVhdHVyZS1sb2NhdGlvbj0iZmVhdHVyZXMiCi0gICAgICBwbHVnaW4tbG9jYXRpb249InBsdWdpbnMiCi0gICAgICBhdXRvYnVpbGQ9ImZhbHNlIgotICAgICAgc2NydWItb3V0cHV0PSJmYWxzZSIKLSAgICAgIHVzZS1jb25zb2xlPSJ0cnVlIj4KLSAgIDxmZWF0dXJlIGlkPSJ1cGRhdGUuZmVhdHVyZTEiIHZlcnNpb249IjEuMC4xIi8+Ci0gICA8ZmVhdHVyZSBpZD0idXBkYXRlLmZlYXR1cmUyIiB2ZXJzaW9uPSIxLjAuMSIvPgotPC9zaXRlLWJ1aWxkPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTIvZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUxXzEuMC4wLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUyL2ZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlMV8xLjAuMC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxNzViNGEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTIvZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUxXzEuMC4wLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUyL2ZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlMl8xLjAuMC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMi9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTJfMS4wLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTY2MGI5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUyL2ZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlMl8xLjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMi9wbHVnaW5zL2NvbS5wbHVnaW4xXzEuMC4wLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUyL3BsdWdpbnMvY29tLnBsdWdpbjFfMS4wLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODE1ZjIwLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUyL3BsdWdpbnMvY29tLnBsdWdpbjFfMS4wLjAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTIvcGx1Z2lucy9jb20ucGx1Z2luMl8xLjAuMC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMi9wbHVnaW5zL2NvbS5wbHVnaW4yXzEuMC4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGVjNWY0Yy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMi9wbHVnaW5zL2NvbS5wbHVnaW4yXzEuMC4wLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUyL3NpdGUueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTIvc2l0ZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxZDRiNzEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTIvc2l0ZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08c2l0ZT4KLSAgIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUxXzEuMC4xLmphciIgaWQ9InVwZGF0ZS5mZWF0dXJlMSIgdmVyc2lvbj0iMS4wLjEiLz4KLSAgIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUyXzEuMC4xLmphciIgaWQ9InVwZGF0ZS5mZWF0dXJlMiIgdmVyc2lvbj0iMS4wLjEiLz4KLTwvc2l0ZT4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUzLy5wcm9qZWN0IGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkZGI2YjcuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT51cGRhdGUtc2l0ZTM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuVXBkYXRlU2l0ZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5VcGRhdGVTaXRlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMy8uc2l0ZWJ1aWxkL2J1aWxkLmxvZyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUzLy5zaXRlYnVpbGQvYnVpbGQubG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTJlZTAxLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUzLy5zaXRlYnVpbGQvYnVpbGQubG9nCisrKyAvZGV2L251bGwKQEAgLTEsMzE4ICswLDAgQEAKLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGJ1aWxkLnVwZGF0ZS5qYXINCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBhbGwuZmVhdHVyZXMNCi1UYXJnZXQgZmluaXNoZWQ6IGFsbC5mZWF0dXJlcw0KLVRhcmdldCBzdGFydGVkOiBhbGwucGx1Z2lucw0KLVRhc2sgc3RhcnRlZDogYW50DQotVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBidWlsZC51cGRhdGUuamFyDQotVGFzayBzdGFydGVkOiBkZWxldGUNCi1UYXNrIGZpbmlzaGVkOiBkZWxldGUNCi1UYXNrIHN0YXJ0ZWQ6IG1rZGlyDQotVGFzayBmaW5pc2hlZDogbWtkaXINCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGJ1aWxkLmphcnMNCi1UYXNrIHN0YXJ0ZWQ6IGF2YWlsYWJsZQ0KLVRhc2sgZmluaXNoZWQ6IGF2YWlsYWJsZQ0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogcGx1Z2luMmEuamFyDQotVGFzayBzdGFydGVkOiBkZWxldGUNCi1UYXNrIGZpbmlzaGVkOiBkZWxldGUNCi1UYXNrIHN0YXJ0ZWQ6IG1rZGlyDQotVGFzayBmaW5pc2hlZDogbWtkaXINCi1UYXNrIHN0YXJ0ZWQ6IGphdmFjDQotTWVzc2FnZSBsb2dnZWQ6IENvbXBpbGUgZmFpbGVkOyBzZWUgdGhlIGNvbXBpbGVyIGVycm9yIG91dHB1dCBmb3IgZGV0YWlscy4NCi1UYXNrIGZpbmlzaGVkOiBqYXZhYw0KLVRhc2sgc3RhcnRlZDogY29weQ0KLVRhc2sgZmluaXNoZWQ6IGNvcHkNCi1UYXNrIHN0YXJ0ZWQ6IG1rZGlyDQotVGFzayBmaW5pc2hlZDogbWtkaXINCi1UYXNrIHN0YXJ0ZWQ6IGphcg0KLVRhc2sgZmluaXNoZWQ6IGphcg0KLVRhc2sgc3RhcnRlZDogZGVsZXRlDQotVGFzayBmaW5pc2hlZDogZGVsZXRlDQotVGFyZ2V0IGZpbmlzaGVkOiBwbHVnaW4yYS5qYXINCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFyZ2V0IGZpbmlzaGVkOiBidWlsZC5qYXJzDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogZ2F0aGVyLmJpbi5wYXJ0cw0KLVRhc2sgc3RhcnRlZDogbWtkaXINCi1UYXNrIGZpbmlzaGVkOiBta2Rpcg0KLVRhc2sgc3RhcnRlZDogY29weQ0KLVRhc2sgZmluaXNoZWQ6IGNvcHkNCi1UYXNrIHN0YXJ0ZWQ6IGNvcHkNCi1UYXNrIGZpbmlzaGVkOiBjb3B5DQotVGFyZ2V0IGZpbmlzaGVkOiBnYXRoZXIuYmluLnBhcnRzDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhc2sgc3RhcnRlZDogemlwDQotVGFzayBmaW5pc2hlZDogemlwDQotVGFzayBzdGFydGVkOiBkZWxldGUNCi1UYXNrIGZpbmlzaGVkOiBkZWxldGUNCi1UYXJnZXQgZmluaXNoZWQ6IGJ1aWxkLnVwZGF0ZS5qYXINCi1UYXNrIGZpbmlzaGVkOiBhbnQNCi1UYXNrIHN0YXJ0ZWQ6IGFudA0KLVRhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogYnVpbGQudXBkYXRlLmphcg0KLVRhc2sgc3RhcnRlZDogZGVsZXRlDQotVGFzayBmaW5pc2hlZDogZGVsZXRlDQotVGFzayBzdGFydGVkOiBta2Rpcg0KLVRhc2sgZmluaXNoZWQ6IG1rZGlyDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBidWlsZC5qYXJzDQotVGFzayBzdGFydGVkOiBhdmFpbGFibGUNCi1UYXNrIGZpbmlzaGVkOiBhdmFpbGFibGUNCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IHBsdWdpbjIuamFyDQotVGFzayBzdGFydGVkOiBkZWxldGUNCi1UYXNrIGZpbmlzaGVkOiBkZWxldGUNCi1UYXNrIHN0YXJ0ZWQ6IG1rZGlyDQotVGFzayBmaW5pc2hlZDogbWtkaXINCi1UYXNrIHN0YXJ0ZWQ6IGphdmFjDQotTWVzc2FnZSBsb2dnZWQ6IENvbXBpbGUgZmFpbGVkOyBzZWUgdGhlIGNvbXBpbGVyIGVycm9yIG91dHB1dCBmb3IgZGV0YWlscy4NCi1UYXNrIGZpbmlzaGVkOiBqYXZhYw0KLVRhc2sgc3RhcnRlZDogY29weQ0KLVRhc2sgZmluaXNoZWQ6IGNvcHkNCi1UYXNrIHN0YXJ0ZWQ6IG1rZGlyDQotVGFzayBmaW5pc2hlZDogbWtkaXINCi1UYXNrIHN0YXJ0ZWQ6IGphcg0KLVRhc2sgZmluaXNoZWQ6IGphcg0KLVRhc2sgc3RhcnRlZDogZGVsZXRlDQotVGFzayBmaW5pc2hlZDogZGVsZXRlDQotVGFyZ2V0IGZpbmlzaGVkOiBwbHVnaW4yLmphcg0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXJnZXQgZmluaXNoZWQ6IGJ1aWxkLmphcnMNCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBnYXRoZXIuYmluLnBhcnRzDQotVGFzayBzdGFydGVkOiBta2Rpcg0KLVRhc2sgZmluaXNoZWQ6IG1rZGlyDQotVGFzayBzdGFydGVkOiBjb3B5DQotVGFzayBmaW5pc2hlZDogY29weQ0KLVRhc2sgc3RhcnRlZDogY29weQ0KLVRhc2sgZmluaXNoZWQ6IGNvcHkNCi1UYXJnZXQgZmluaXNoZWQ6IGdhdGhlci5iaW4ucGFydHMNCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFzayBzdGFydGVkOiB6aXANCi1UYXNrIGZpbmlzaGVkOiB6aXANCi1UYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KLVRhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KLVRhcmdldCBmaW5pc2hlZDogYnVpbGQudXBkYXRlLmphcg0KLVRhc2sgZmluaXNoZWQ6IGFudA0KLVRhcmdldCBmaW5pc2hlZDogYWxsLnBsdWdpbnMNCi1UYXJnZXQgc3RhcnRlZDogdXBkYXRlLmZlYXR1cmUNCi1UYXJnZXQgZmluaXNoZWQ6IHVwZGF0ZS5mZWF0dXJlDQotVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5jaGlsZHJlbg0KLVRhcmdldCBmaW5pc2hlZDogYWxsLmNoaWxkcmVuDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogZGVsZXRlDQotVGFzayBmaW5pc2hlZDogZGVsZXRlDQotVGFzayBzdGFydGVkOiBta2Rpcg0KLVRhc2sgZmluaXNoZWQ6IG1rZGlyDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogZ2F0aGVyLmJpbi5wYXJ0cw0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBjaGlsZHJlbg0KLVRhcmdldCBmaW5pc2hlZDogY2hpbGRyZW4NCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFzayBzdGFydGVkOiBta2Rpcg0KLVRhc2sgZmluaXNoZWQ6IG1rZGlyDQotVGFzayBzdGFydGVkOiBjb3B5DQotVGFzayBmaW5pc2hlZDogY29weQ0KLVRhc2sgc3RhcnRlZDogZWNsaXBzZS5pZFJlcGxhY2VyDQotVGFzayBmaW5pc2hlZDogZWNsaXBzZS5pZFJlcGxhY2VyDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IFJPT1RGSUxFUypfKl8qDQotVGFyZ2V0IGZpbmlzaGVkOiBST09URklMRVMqXypfKg0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXJnZXQgZmluaXNoZWQ6IGdhdGhlci5iaW4ucGFydHMNCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFzayBzdGFydGVkOiBqYXINCi1UYXNrIGZpbmlzaGVkOiBqYXINCi1UYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KLVRhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KLVRhcmdldCBmaW5pc2hlZDogYnVpbGQudXBkYXRlLmphcg0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IHJlZnJlc2gNCi1UYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UuY29udmVydFBhdGgNCi1UYXNrIGZpbmlzaGVkOiBlY2xpcHNlLmNvbnZlcnRQYXRoDQotVGFzayBzdGFydGVkOiBlY2xpcHNlLnJlZnJlc2hMb2NhbA0KLU1lc3NhZ2UgbG9nZ2VkOiBQcm9qZWN0ICR7dXBkYXRlLmZlYXR1cmUyYl8yLjAuMH0gZG9lcyBub3QgZXhpc3QgYW5kIGNhbm5vdCBiZSByZWZyZXNoZWQuDQotVGFzayBmaW5pc2hlZDogZWNsaXBzZS5yZWZyZXNoTG9jYWwNCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBhbGwuZmVhdHVyZXMNCi1UYXJnZXQgZmluaXNoZWQ6IGFsbC5mZWF0dXJlcw0KLVRhcmdldCBzdGFydGVkOiBhbGwucGx1Z2lucw0KLVRhc2sgc3RhcnRlZDogYW50DQotVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiByZWZyZXNoDQotVGFzayBzdGFydGVkOiBlY2xpcHNlLmNvbnZlcnRQYXRoDQotVGFzayBmaW5pc2hlZDogZWNsaXBzZS5jb252ZXJ0UGF0aA0KLVRhc2sgc3RhcnRlZDogZWNsaXBzZS5yZWZyZXNoTG9jYWwNCi1UYXNrIGZpbmlzaGVkOiBlY2xpcHNlLnJlZnJlc2hMb2NhbA0KLVRhcmdldCBmaW5pc2hlZDogcmVmcmVzaA0KLVRhc2sgZmluaXNoZWQ6IGFudA0KLVRhc2sgc3RhcnRlZDogYW50DQotVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiByZWZyZXNoDQotVGFzayBzdGFydGVkOiBlY2xpcHNlLmNvbnZlcnRQYXRoDQotVGFzayBmaW5pc2hlZDogZWNsaXBzZS5jb252ZXJ0UGF0aA0KLVRhc2sgc3RhcnRlZDogZWNsaXBzZS5yZWZyZXNoTG9jYWwNCi1UYXNrIGZpbmlzaGVkOiBlY2xpcHNlLnJlZnJlc2hMb2NhbA0KLVRhcmdldCBmaW5pc2hlZDogcmVmcmVzaA0KLVRhc2sgZmluaXNoZWQ6IGFudA0KLVRhcmdldCBmaW5pc2hlZDogYWxsLnBsdWdpbnMNCi1UYXJnZXQgc3RhcnRlZDogdXBkYXRlLmZlYXR1cmUNCi1UYXJnZXQgZmluaXNoZWQ6IHVwZGF0ZS5mZWF0dXJlDQotVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5jaGlsZHJlbg0KLVRhcmdldCBmaW5pc2hlZDogYWxsLmNoaWxkcmVuDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhcmdldCBmaW5pc2hlZDogcmVmcmVzaA0KLUJ1aWxkIGZpbmlzaGVkLg0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUzLy5zaXRlYnVpbGQvc2l0ZWJ1aWxkLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUzLy5zaXRlYnVpbGQvc2l0ZWJ1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM1MTBiMC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMy8uc2l0ZWJ1aWxkL3NpdGVidWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHNpdGUtYnVpbGQKLSAgICAgIGZlYXR1cmUtbG9jYXRpb249ImZlYXR1cmVzIgotICAgICAgcGx1Z2luLWxvY2F0aW9uPSJwbHVnaW5zIgotICAgICAgYXV0b2J1aWxkPSJmYWxzZSIKLSAgICAgIHNjcnViLW91dHB1dD0iZmFsc2UiCi0gICAgICB1c2UtY29uc29sZT0idHJ1ZSI+Ci0gICA8ZmVhdHVyZSBpZD0idXBkYXRlLmZlYXR1cmUxYiIgdmVyc2lvbj0iMi4wLjAiLz4KLSAgIDxmZWF0dXJlIGlkPSJ1cGRhdGUuZmVhdHVyZTJiIiB2ZXJzaW9uPSIyLjAuMCIvPgotPC9zaXRlLWJ1aWxkPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTMvZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUxYl8yLjAuMC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMy9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTFiXzIuMC4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI5YTg3Ni4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMy9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTFiXzIuMC4wLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUzL2ZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlMmJfMi4wLjAuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTMvZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUyYl8yLjAuMC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3YmI3MGYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTMvZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUyYl8yLjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMy9wbHVnaW5zL2NvbS5wbHVnaW4xXzEuMC4wLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUzL3BsdWdpbnMvY29tLnBsdWdpbjFfMS4wLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTJkNDFkLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUzL3BsdWdpbnMvY29tLnBsdWdpbjFfMS4wLjAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTMvcGx1Z2lucy9jb20ucGx1Z2luMWFfMS4wLjEuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTMvcGx1Z2lucy9jb20ucGx1Z2luMWFfMS4wLjEuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzE4M2M3Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUzL3BsdWdpbnMvY29tLnBsdWdpbjFhXzEuMC4xLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUzL3BsdWdpbnMvY29tLnBsdWdpbjJfMS4wLjAuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTMvcGx1Z2lucy9jb20ucGx1Z2luMl8xLjAuMC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzMWIyOGUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTMvcGx1Z2lucy9jb20ucGx1Z2luMl8xLjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMy9wbHVnaW5zL2NvbS5wbHVnaW4yYV8xLjAuMS5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMy9wbHVnaW5zL2NvbS5wbHVnaW4yYV8xLjAuMS5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1N2JhNWQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTMvcGx1Z2lucy9jb20ucGx1Z2luMmFfMS4wLjEuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTMvc2l0ZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMy9zaXRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI4NTA2Yi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMy9zaXRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08c2l0ZT4KLSAgIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUxYl8yLjAuMC5qYXIiIGlkPSJ1cGRhdGUuZmVhdHVyZTFiIiB2ZXJzaW9uPSIyLjAuMCI+Ci0gICAgICA8Y2F0ZWdvcnkgbmFtZT0iU2l0ZTMtQ2F0ZWdvcnkxIi8+Ci0gICA8L2ZlYXR1cmU+Ci0gICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlMmJfMi4wLjAuamFyIiBpZD0idXBkYXRlLmZlYXR1cmUyYiIgdmVyc2lvbj0iMi4wLjAiPgotICAgICAgPGNhdGVnb3J5IG5hbWU9IlNpdGUzLUNhdGVnb3J5MiIvPgotICAgPC9mZWF0dXJlPgotICAgPGNhdGVnb3J5LWRlZiBuYW1lPSJTaXRlMy1DYXRlZ29yeTEiIGxhYmVsPSJTaXRlMy1DYXRlZ29yeTEtTGFiZWwiPgotICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgZWNldGVyYS4KLSAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICA8L2NhdGVnb3J5LWRlZj4KLSAgIDxjYXRlZ29yeS1kZWYgbmFtZT0iU2l0ZTMtQ2F0ZWdvcnkyIiBsYWJlbD0iU2l0ZTMtQ2F0ZWdvcnkyLUxhYmVsIj4KLSAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgIGVjZXRlcmEuCi0gICAgICA8L2Rlc2NyaXB0aW9uPgotICAgPC9jYXRlZ29yeS1kZWY+Ci08L3NpdGU+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNC8ucHJvamVjdCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU0Ly5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTA3YWFmLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU0Ly5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+dXBkYXRlLXNpdGU0PC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlVwZGF0ZVNpdGVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuVXBkYXRlU2l0ZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTQvLnNpdGVidWlsZC9idWlsZC5sb2cgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNC8uc2l0ZWJ1aWxkL2J1aWxkLmxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNmZThlMy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNC8uc2l0ZWJ1aWxkL2J1aWxkLmxvZworKysgL2Rldi9udWxsCkBAIC0xLDc5MSArMCwwIEBACi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBidWlsZC51cGRhdGUuamFyDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogYWxsLmZlYXR1cmVzDQotVGFzayBzdGFydGVkOiBhbnQNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBidWlsZC51cGRhdGUuamFyDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogYWxsLmZlYXR1cmVzDQotVGFyZ2V0IGZpbmlzaGVkOiBhbGwuZmVhdHVyZXMNCi1UYXJnZXQgc3RhcnRlZDogYWxsLnBsdWdpbnMNCi1UYXNrIHN0YXJ0ZWQ6IGFudA0KLVRhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogYnVpbGQudXBkYXRlLmphcg0KLVRhc2sgc3RhcnRlZDogZGVsZXRlDQotVGFzayBmaW5pc2hlZDogZGVsZXRlDQotVGFzayBzdGFydGVkOiBta2Rpcg0KLVRhc2sgZmluaXNoZWQ6IG1rZGlyDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBidWlsZC5qYXJzDQotVGFzayBzdGFydGVkOiBhdmFpbGFibGUNCi1UYXNrIGZpbmlzaGVkOiBhdmFpbGFibGUNCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IHBsdWdpbjEuamFyDQotVGFzayBzdGFydGVkOiBkZWxldGUNCi1UYXNrIGZpbmlzaGVkOiBkZWxldGUNCi1UYXNrIHN0YXJ0ZWQ6IG1rZGlyDQotVGFzayBmaW5pc2hlZDogbWtkaXINCi1UYXNrIHN0YXJ0ZWQ6IGphdmFjDQotTWVzc2FnZSBsb2dnZWQ6IENvbXBpbGUgZmFpbGVkOyBzZWUgdGhlIGNvbXBpbGVyIGVycm9yIG91dHB1dCBmb3IgZGV0YWlscy4NCi1UYXNrIGZpbmlzaGVkOiBqYXZhYw0KLVRhc2sgc3RhcnRlZDogY29weQ0KLVRhc2sgZmluaXNoZWQ6IGNvcHkNCi1UYXNrIHN0YXJ0ZWQ6IG1rZGlyDQotVGFzayBmaW5pc2hlZDogbWtkaXINCi1UYXNrIHN0YXJ0ZWQ6IGphcg0KLVRhc2sgZmluaXNoZWQ6IGphcg0KLVRhc2sgc3RhcnRlZDogZGVsZXRlDQotVGFzayBmaW5pc2hlZDogZGVsZXRlDQotVGFyZ2V0IGZpbmlzaGVkOiBwbHVnaW4xLmphcg0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXJnZXQgZmluaXNoZWQ6IGJ1aWxkLmphcnMNCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBnYXRoZXIuYmluLnBhcnRzDQotVGFzayBzdGFydGVkOiBta2Rpcg0KLVRhc2sgZmluaXNoZWQ6IG1rZGlyDQotVGFzayBzdGFydGVkOiBjb3B5DQotVGFzayBmaW5pc2hlZDogY29weQ0KLVRhc2sgc3RhcnRlZDogY29weQ0KLVRhc2sgZmluaXNoZWQ6IGNvcHkNCi1UYXJnZXQgZmluaXNoZWQ6IGdhdGhlci5iaW4ucGFydHMNCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFzayBzdGFydGVkOiB6aXANCi1UYXNrIGZpbmlzaGVkOiB6aXANCi1UYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KLVRhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KLVRhcmdldCBmaW5pc2hlZDogYnVpbGQudXBkYXRlLmphcg0KLVRhc2sgZmluaXNoZWQ6IGFudA0KLVRhcmdldCBmaW5pc2hlZDogYWxsLnBsdWdpbnMNCi1UYXJnZXQgc3RhcnRlZDogdXBkYXRlLmZlYXR1cmUNCi1UYXJnZXQgZmluaXNoZWQ6IHVwZGF0ZS5mZWF0dXJlDQotVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5jaGlsZHJlbg0KLVRhcmdldCBmaW5pc2hlZDogYWxsLmNoaWxkcmVuDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogZGVsZXRlDQotVGFzayBmaW5pc2hlZDogZGVsZXRlDQotVGFzayBzdGFydGVkOiBta2Rpcg0KLVRhc2sgZmluaXNoZWQ6IG1rZGlyDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogZ2F0aGVyLmJpbi5wYXJ0cw0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBjaGlsZHJlbg0KLVRhcmdldCBmaW5pc2hlZDogY2hpbGRyZW4NCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFzayBzdGFydGVkOiBta2Rpcg0KLVRhc2sgZmluaXNoZWQ6IG1rZGlyDQotVGFzayBzdGFydGVkOiBjb3B5DQotVGFzayBmaW5pc2hlZDogY29weQ0KLVRhc2sgc3RhcnRlZDogZWNsaXBzZS5pZFJlcGxhY2VyDQotVGFzayBmaW5pc2hlZDogZWNsaXBzZS5pZFJlcGxhY2VyDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IFJPT1RGSUxFUypfKl8qDQotVGFyZ2V0IGZpbmlzaGVkOiBST09URklMRVMqXypfKg0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXJnZXQgZmluaXNoZWQ6IGdhdGhlci5iaW4ucGFydHMNCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFzayBzdGFydGVkOiBqYXINCi1UYXNrIGZpbmlzaGVkOiBqYXINCi1UYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KLVRhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KLVRhcmdldCBmaW5pc2hlZDogYnVpbGQudXBkYXRlLmphcg0KLVRhc2sgZmluaXNoZWQ6IGFudA0KLVRhc2sgc3RhcnRlZDogYW50DQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogYnVpbGQudXBkYXRlLmphcg0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5mZWF0dXJlcw0KLVRhcmdldCBmaW5pc2hlZDogYWxsLmZlYXR1cmVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5wbHVnaW5zDQotVGFzayBzdGFydGVkOiBhbnQNCi1UYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGJ1aWxkLnVwZGF0ZS5qYXINCi1UYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KLVRhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KLVRhc2sgc3RhcnRlZDogbWtkaXINCi1UYXNrIGZpbmlzaGVkOiBta2Rpcg0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogYnVpbGQuamFycw0KLVRhc2sgc3RhcnRlZDogYXZhaWxhYmxlDQotVGFzayBmaW5pc2hlZDogYXZhaWxhYmxlDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBwbHVnaW4xLmphcg0KLVRhcmdldCBmaW5pc2hlZDogcGx1Z2luMS5qYXINCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFyZ2V0IGZpbmlzaGVkOiBidWlsZC5qYXJzDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogZ2F0aGVyLmJpbi5wYXJ0cw0KLVRhc2sgc3RhcnRlZDogbWtkaXINCi1UYXNrIGZpbmlzaGVkOiBta2Rpcg0KLVRhc2sgc3RhcnRlZDogY29weQ0KLVRhc2sgZmluaXNoZWQ6IGNvcHkNCi1UYXNrIHN0YXJ0ZWQ6IGNvcHkNCi1UYXNrIGZpbmlzaGVkOiBjb3B5DQotVGFyZ2V0IGZpbmlzaGVkOiBnYXRoZXIuYmluLnBhcnRzDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhc2sgc3RhcnRlZDogemlwDQotVGFzayBmaW5pc2hlZDogemlwDQotVGFzayBzdGFydGVkOiBkZWxldGUNCi1UYXNrIGZpbmlzaGVkOiBkZWxldGUNCi1UYXJnZXQgZmluaXNoZWQ6IGJ1aWxkLnVwZGF0ZS5qYXINCi1UYXNrIGZpbmlzaGVkOiBhbnQNCi1UYXJnZXQgZmluaXNoZWQ6IGFsbC5wbHVnaW5zDQotVGFyZ2V0IHN0YXJ0ZWQ6IHVwZGF0ZS5mZWF0dXJlDQotVGFyZ2V0IGZpbmlzaGVkOiB1cGRhdGUuZmVhdHVyZQ0KLVRhcmdldCBzdGFydGVkOiBhbGwuY2hpbGRyZW4NCi1UYXJnZXQgZmluaXNoZWQ6IGFsbC5jaGlsZHJlbg0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KLVRhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KLVRhc2sgc3RhcnRlZDogbWtkaXINCi1UYXNrIGZpbmlzaGVkOiBta2Rpcg0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGdhdGhlci5iaW4ucGFydHMNCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogY2hpbGRyZW4NCi1UYXJnZXQgZmluaXNoZWQ6IGNoaWxkcmVuDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhc2sgc3RhcnRlZDogbWtkaXINCi1UYXNrIGZpbmlzaGVkOiBta2Rpcg0KLVRhc2sgc3RhcnRlZDogY29weQ0KLVRhc2sgZmluaXNoZWQ6IGNvcHkNCi1UYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UuaWRSZXBsYWNlcg0KLVRhc2sgZmluaXNoZWQ6IGVjbGlwc2UuaWRSZXBsYWNlcg0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBST09URklMRVMqXypfKg0KLVRhcmdldCBmaW5pc2hlZDogUk9PVEZJTEVTKl8qXyoNCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFyZ2V0IGZpbmlzaGVkOiBnYXRoZXIuYmluLnBhcnRzDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhc2sgc3RhcnRlZDogamFyDQotVGFzayBmaW5pc2hlZDogamFyDQotVGFzayBzdGFydGVkOiBkZWxldGUNCi1UYXNrIGZpbmlzaGVkOiBkZWxldGUNCi1UYXJnZXQgZmluaXNoZWQ6IGJ1aWxkLnVwZGF0ZS5qYXINCi1UYXNrIGZpbmlzaGVkOiBhbnQNCi1UYXNrIHN0YXJ0ZWQ6IGFudA0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGJ1aWxkLnVwZGF0ZS5qYXINCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBhbGwuZmVhdHVyZXMNCi1UYXJnZXQgZmluaXNoZWQ6IGFsbC5mZWF0dXJlcw0KLVRhcmdldCBzdGFydGVkOiBhbGwucGx1Z2lucw0KLVRhc2sgc3RhcnRlZDogYW50DQotVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBidWlsZC51cGRhdGUuamFyDQotVGFzayBzdGFydGVkOiBkZWxldGUNCi1UYXNrIGZpbmlzaGVkOiBkZWxldGUNCi1UYXNrIHN0YXJ0ZWQ6IG1rZGlyDQotVGFzayBmaW5pc2hlZDogbWtkaXINCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGJ1aWxkLmphcnMNCi1UYXNrIHN0YXJ0ZWQ6IGF2YWlsYWJsZQ0KLVRhc2sgZmluaXNoZWQ6IGF2YWlsYWJsZQ0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogcGx1Z2luMS5qYXINCi1UYXJnZXQgZmluaXNoZWQ6IHBsdWdpbjEuamFyDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhcmdldCBmaW5pc2hlZDogYnVpbGQuamFycw0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGdhdGhlci5iaW4ucGFydHMNCi1UYXNrIHN0YXJ0ZWQ6IG1rZGlyDQotVGFzayBmaW5pc2hlZDogbWtkaXINCi1UYXNrIHN0YXJ0ZWQ6IGNvcHkNCi1UYXNrIGZpbmlzaGVkOiBjb3B5DQotVGFzayBzdGFydGVkOiBjb3B5DQotVGFzayBmaW5pc2hlZDogY29weQ0KLVRhcmdldCBmaW5pc2hlZDogZ2F0aGVyLmJpbi5wYXJ0cw0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXNrIHN0YXJ0ZWQ6IHppcA0KLVRhc2sgZmluaXNoZWQ6IHppcA0KLVRhc2sgc3RhcnRlZDogZGVsZXRlDQotVGFzayBmaW5pc2hlZDogZGVsZXRlDQotVGFyZ2V0IGZpbmlzaGVkOiBidWlsZC51cGRhdGUuamFyDQotVGFzayBmaW5pc2hlZDogYW50DQotVGFzayBzdGFydGVkOiBhbnQNCi1UYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGJ1aWxkLnVwZGF0ZS5qYXINCi1UYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KLVRhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KLVRhc2sgc3RhcnRlZDogbWtkaXINCi1UYXNrIGZpbmlzaGVkOiBta2Rpcg0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogYnVpbGQuamFycw0KLVRhc2sgc3RhcnRlZDogYXZhaWxhYmxlDQotVGFzayBmaW5pc2hlZDogYXZhaWxhYmxlDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBwbHVnaW4xYS5qYXINCi1UYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KLVRhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KLVRhc2sgc3RhcnRlZDogbWtkaXINCi1UYXNrIGZpbmlzaGVkOiBta2Rpcg0KLVRhc2sgc3RhcnRlZDogamF2YWMNCi1NZXNzYWdlIGxvZ2dlZDogQ29tcGlsZSBmYWlsZWQ7IHNlZSB0aGUgY29tcGlsZXIgZXJyb3Igb3V0cHV0IGZvciBkZXRhaWxzLg0KLVRhc2sgZmluaXNoZWQ6IGphdmFjDQotVGFzayBzdGFydGVkOiBjb3B5DQotVGFzayBmaW5pc2hlZDogY29weQ0KLVRhc2sgc3RhcnRlZDogbWtkaXINCi1UYXNrIGZpbmlzaGVkOiBta2Rpcg0KLVRhc2sgc3RhcnRlZDogamFyDQotVGFzayBmaW5pc2hlZDogamFyDQotVGFzayBzdGFydGVkOiBkZWxldGUNCi1UYXNrIGZpbmlzaGVkOiBkZWxldGUNCi1UYXJnZXQgZmluaXNoZWQ6IHBsdWdpbjFhLmphcg0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXJnZXQgZmluaXNoZWQ6IGJ1aWxkLmphcnMNCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBnYXRoZXIuYmluLnBhcnRzDQotVGFzayBzdGFydGVkOiBta2Rpcg0KLVRhc2sgZmluaXNoZWQ6IG1rZGlyDQotVGFzayBzdGFydGVkOiBjb3B5DQotVGFzayBmaW5pc2hlZDogY29weQ0KLVRhc2sgc3RhcnRlZDogY29weQ0KLVRhc2sgZmluaXNoZWQ6IGNvcHkNCi1UYXJnZXQgZmluaXNoZWQ6IGdhdGhlci5iaW4ucGFydHMNCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFzayBzdGFydGVkOiB6aXANCi1UYXNrIGZpbmlzaGVkOiB6aXANCi1UYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KLVRhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KLVRhcmdldCBmaW5pc2hlZDogYnVpbGQudXBkYXRlLmphcg0KLVRhc2sgZmluaXNoZWQ6IGFudA0KLVRhcmdldCBmaW5pc2hlZDogYWxsLnBsdWdpbnMNCi1UYXJnZXQgc3RhcnRlZDogdXBkYXRlLmZlYXR1cmUNCi1UYXJnZXQgZmluaXNoZWQ6IHVwZGF0ZS5mZWF0dXJlDQotVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5jaGlsZHJlbg0KLVRhcmdldCBmaW5pc2hlZDogYWxsLmNoaWxkcmVuDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogZGVsZXRlDQotVGFzayBmaW5pc2hlZDogZGVsZXRlDQotVGFzayBzdGFydGVkOiBta2Rpcg0KLVRhc2sgZmluaXNoZWQ6IG1rZGlyDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogZ2F0aGVyLmJpbi5wYXJ0cw0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBjaGlsZHJlbg0KLVRhcmdldCBmaW5pc2hlZDogY2hpbGRyZW4NCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFzayBzdGFydGVkOiBta2Rpcg0KLVRhc2sgZmluaXNoZWQ6IG1rZGlyDQotVGFzayBzdGFydGVkOiBjb3B5DQotVGFzayBmaW5pc2hlZDogY29weQ0KLVRhc2sgc3RhcnRlZDogZWNsaXBzZS5pZFJlcGxhY2VyDQotVGFzayBmaW5pc2hlZDogZWNsaXBzZS5pZFJlcGxhY2VyDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IFJPT1RGSUxFUypfKl8qDQotVGFyZ2V0IGZpbmlzaGVkOiBST09URklMRVMqXypfKg0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXJnZXQgZmluaXNoZWQ6IGdhdGhlci5iaW4ucGFydHMNCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFzayBzdGFydGVkOiBqYXINCi1UYXNrIGZpbmlzaGVkOiBqYXINCi1UYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KLVRhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KLVRhcmdldCBmaW5pc2hlZDogYnVpbGQudXBkYXRlLmphcg0KLVRhc2sgZmluaXNoZWQ6IGFudA0KLVRhcmdldCBmaW5pc2hlZDogYWxsLmZlYXR1cmVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5wbHVnaW5zDQotVGFyZ2V0IGZpbmlzaGVkOiBhbGwucGx1Z2lucw0KLVRhcmdldCBzdGFydGVkOiB1cGRhdGUuZmVhdHVyZQ0KLVRhcmdldCBmaW5pc2hlZDogdXBkYXRlLmZlYXR1cmUNCi1UYXJnZXQgc3RhcnRlZDogYWxsLmNoaWxkcmVuDQotVGFyZ2V0IGZpbmlzaGVkOiBhbGwuY2hpbGRyZW4NCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBkZWxldGUNCi1UYXNrIGZpbmlzaGVkOiBkZWxldGUNCi1UYXNrIHN0YXJ0ZWQ6IG1rZGlyDQotVGFzayBmaW5pc2hlZDogbWtkaXINCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBnYXRoZXIuYmluLnBhcnRzDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IGNoaWxkcmVuDQotVGFyZ2V0IGZpbmlzaGVkOiBjaGlsZHJlbg0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXNrIHN0YXJ0ZWQ6IG1rZGlyDQotVGFzayBmaW5pc2hlZDogbWtkaXINCi1UYXNrIHN0YXJ0ZWQ6IGNvcHkNCi1UYXNrIGZpbmlzaGVkOiBjb3B5DQotVGFzayBzdGFydGVkOiBlY2xpcHNlLmlkUmVwbGFjZXINCi1UYXNrIGZpbmlzaGVkOiBlY2xpcHNlLmlkUmVwbGFjZXINCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogUk9PVEZJTEVTKl8qXyoNCi1UYXJnZXQgZmluaXNoZWQ6IFJPT1RGSUxFUypfKl8qDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhcmdldCBmaW5pc2hlZDogZ2F0aGVyLmJpbi5wYXJ0cw0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXNrIHN0YXJ0ZWQ6IGphcg0KLVRhc2sgZmluaXNoZWQ6IGphcg0KLVRhc2sgc3RhcnRlZDogZGVsZXRlDQotVGFzayBmaW5pc2hlZDogZGVsZXRlDQotVGFyZ2V0IGZpbmlzaGVkOiBidWlsZC51cGRhdGUuamFyDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogcmVmcmVzaA0KLVRhc2sgc3RhcnRlZDogZWNsaXBzZS5jb252ZXJ0UGF0aA0KLVRhc2sgZmluaXNoZWQ6IGVjbGlwc2UuY29udmVydFBhdGgNCi1UYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UucmVmcmVzaExvY2FsDQotTWVzc2FnZSBsb2dnZWQ6IFByb2plY3QgJHt1cGRhdGUuZmVhdHVyZTFjXzMuMC4wfSBkb2VzIG5vdCBleGlzdCBhbmQgY2Fubm90IGJlIHJlZnJlc2hlZC4NCi1UYXNrIGZpbmlzaGVkOiBlY2xpcHNlLnJlZnJlc2hMb2NhbA0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5mZWF0dXJlcw0KLVRhc2sgc3RhcnRlZDogYW50DQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogcmVmcmVzaA0KLVRhc2sgc3RhcnRlZDogZWNsaXBzZS5jb252ZXJ0UGF0aA0KLVRhc2sgZmluaXNoZWQ6IGVjbGlwc2UuY29udmVydFBhdGgNCi1UYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UucmVmcmVzaExvY2FsDQotTWVzc2FnZSBsb2dnZWQ6IFByb2plY3QgJHt1cGRhdGUuZmVhdHVyZTFfMS4wLjB9IGRvZXMgbm90IGV4aXN0IGFuZCBjYW5ub3QgYmUgcmVmcmVzaGVkLg0KLVRhc2sgZmluaXNoZWQ6IGVjbGlwc2UucmVmcmVzaExvY2FsDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogYWxsLmZlYXR1cmVzDQotVGFyZ2V0IGZpbmlzaGVkOiBhbGwuZmVhdHVyZXMNCi1UYXJnZXQgc3RhcnRlZDogYWxsLnBsdWdpbnMNCi1UYXNrIHN0YXJ0ZWQ6IGFudA0KLVRhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogcmVmcmVzaA0KLVRhc2sgc3RhcnRlZDogZWNsaXBzZS5jb252ZXJ0UGF0aA0KLVRhc2sgZmluaXNoZWQ6IGVjbGlwc2UuY29udmVydFBhdGgNCi1UYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UucmVmcmVzaExvY2FsDQotVGFzayBmaW5pc2hlZDogZWNsaXBzZS5yZWZyZXNoTG9jYWwNCi1UYXJnZXQgZmluaXNoZWQ6IHJlZnJlc2gNCi1UYXNrIGZpbmlzaGVkOiBhbnQNCi1UYXJnZXQgZmluaXNoZWQ6IGFsbC5wbHVnaW5zDQotVGFyZ2V0IHN0YXJ0ZWQ6IHVwZGF0ZS5mZWF0dXJlDQotVGFyZ2V0IGZpbmlzaGVkOiB1cGRhdGUuZmVhdHVyZQ0KLVRhcmdldCBzdGFydGVkOiBhbGwuY2hpbGRyZW4NCi1UYXJnZXQgZmluaXNoZWQ6IGFsbC5jaGlsZHJlbg0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXJnZXQgZmluaXNoZWQ6IHJlZnJlc2gNCi1UYXNrIGZpbmlzaGVkOiBhbnQNCi1UYXNrIHN0YXJ0ZWQ6IGFudA0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IHJlZnJlc2gNCi1UYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UuY29udmVydFBhdGgNCi1UYXNrIGZpbmlzaGVkOiBlY2xpcHNlLmNvbnZlcnRQYXRoDQotVGFzayBzdGFydGVkOiBlY2xpcHNlLnJlZnJlc2hMb2NhbA0KLU1lc3NhZ2UgbG9nZ2VkOiBQcm9qZWN0ICR7dXBkYXRlLmZlYXR1cmUxXzEuMC4wfSBkb2VzIG5vdCBleGlzdCBhbmQgY2Fubm90IGJlIHJlZnJlc2hlZC4NCi1UYXNrIGZpbmlzaGVkOiBlY2xpcHNlLnJlZnJlc2hMb2NhbA0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5mZWF0dXJlcw0KLVRhcmdldCBmaW5pc2hlZDogYWxsLmZlYXR1cmVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5wbHVnaW5zDQotVGFzayBzdGFydGVkOiBhbnQNCi1UYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IHJlZnJlc2gNCi1UYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UuY29udmVydFBhdGgNCi1UYXNrIGZpbmlzaGVkOiBlY2xpcHNlLmNvbnZlcnRQYXRoDQotVGFzayBzdGFydGVkOiBlY2xpcHNlLnJlZnJlc2hMb2NhbA0KLVRhc2sgZmluaXNoZWQ6IGVjbGlwc2UucmVmcmVzaExvY2FsDQotVGFyZ2V0IGZpbmlzaGVkOiByZWZyZXNoDQotVGFzayBmaW5pc2hlZDogYW50DQotVGFyZ2V0IGZpbmlzaGVkOiBhbGwucGx1Z2lucw0KLVRhcmdldCBzdGFydGVkOiB1cGRhdGUuZmVhdHVyZQ0KLVRhcmdldCBmaW5pc2hlZDogdXBkYXRlLmZlYXR1cmUNCi1UYXJnZXQgc3RhcnRlZDogYWxsLmNoaWxkcmVuDQotVGFyZ2V0IGZpbmlzaGVkOiBhbGwuY2hpbGRyZW4NCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFyZ2V0IGZpbmlzaGVkOiByZWZyZXNoDQotVGFzayBmaW5pc2hlZDogYW50DQotVGFzayBzdGFydGVkOiBhbnQNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiByZWZyZXNoDQotVGFzayBzdGFydGVkOiBlY2xpcHNlLmNvbnZlcnRQYXRoDQotVGFzayBmaW5pc2hlZDogZWNsaXBzZS5jb252ZXJ0UGF0aA0KLVRhc2sgc3RhcnRlZDogZWNsaXBzZS5yZWZyZXNoTG9jYWwNCi1NZXNzYWdlIGxvZ2dlZDogUHJvamVjdCAke3VwZGF0ZS5mZWF0dXJlMWJfMi4wLjB9IGRvZXMgbm90IGV4aXN0IGFuZCBjYW5ub3QgYmUgcmVmcmVzaGVkLg0KLVRhc2sgZmluaXNoZWQ6IGVjbGlwc2UucmVmcmVzaExvY2FsDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogYWxsLmZlYXR1cmVzDQotVGFyZ2V0IGZpbmlzaGVkOiBhbGwuZmVhdHVyZXMNCi1UYXJnZXQgc3RhcnRlZDogYWxsLnBsdWdpbnMNCi1UYXNrIHN0YXJ0ZWQ6IGFudA0KLVRhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogcmVmcmVzaA0KLVRhc2sgc3RhcnRlZDogZWNsaXBzZS5jb252ZXJ0UGF0aA0KLVRhc2sgZmluaXNoZWQ6IGVjbGlwc2UuY29udmVydFBhdGgNCi1UYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UucmVmcmVzaExvY2FsDQotVGFzayBmaW5pc2hlZDogZWNsaXBzZS5yZWZyZXNoTG9jYWwNCi1UYXJnZXQgZmluaXNoZWQ6IHJlZnJlc2gNCi1UYXNrIGZpbmlzaGVkOiBhbnQNCi1UYXNrIHN0YXJ0ZWQ6IGFudA0KLVRhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogcmVmcmVzaA0KLVRhc2sgc3RhcnRlZDogZWNsaXBzZS5jb252ZXJ0UGF0aA0KLVRhc2sgZmluaXNoZWQ6IGVjbGlwc2UuY29udmVydFBhdGgNCi1UYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UucmVmcmVzaExvY2FsDQotVGFzayBmaW5pc2hlZDogZWNsaXBzZS5yZWZyZXNoTG9jYWwNCi1UYXJnZXQgZmluaXNoZWQ6IHJlZnJlc2gNCi1UYXNrIGZpbmlzaGVkOiBhbnQNCi1UYXJnZXQgZmluaXNoZWQ6IGFsbC5wbHVnaW5zDQotVGFyZ2V0IHN0YXJ0ZWQ6IHVwZGF0ZS5mZWF0dXJlDQotVGFyZ2V0IGZpbmlzaGVkOiB1cGRhdGUuZmVhdHVyZQ0KLVRhcmdldCBzdGFydGVkOiBhbGwuY2hpbGRyZW4NCi1UYXJnZXQgZmluaXNoZWQ6IGFsbC5jaGlsZHJlbg0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXJnZXQgZmluaXNoZWQ6IHJlZnJlc2gNCi1UYXNrIGZpbmlzaGVkOiBhbnQNCi1UYXJnZXQgZmluaXNoZWQ6IGFsbC5mZWF0dXJlcw0KLVRhcmdldCBzdGFydGVkOiBhbGwucGx1Z2lucw0KLVRhcmdldCBmaW5pc2hlZDogYWxsLnBsdWdpbnMNCi1UYXJnZXQgc3RhcnRlZDogdXBkYXRlLmZlYXR1cmUNCi1UYXJnZXQgZmluaXNoZWQ6IHVwZGF0ZS5mZWF0dXJlDQotVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5jaGlsZHJlbg0KLVRhcmdldCBmaW5pc2hlZDogYWxsLmNoaWxkcmVuDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhcmdldCBmaW5pc2hlZDogcmVmcmVzaA0KLUJ1aWxkIGZpbmlzaGVkLg0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU0Ly5zaXRlYnVpbGQvc2l0ZWJ1aWxkLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU0Ly5zaXRlYnVpbGQvc2l0ZWJ1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdjYjAxNy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNC8uc2l0ZWJ1aWxkL3NpdGVidWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08c2l0ZS1idWlsZAotICAgICAgZmVhdHVyZS1sb2NhdGlvbj0iZmVhdHVyZXMiCi0gICAgICBwbHVnaW4tbG9jYXRpb249InBsdWdpbnMiCi0gICAgICBhdXRvYnVpbGQ9ImZhbHNlIgotICAgICAgc2NydWItb3V0cHV0PSJmYWxzZSIKLSAgICAgIHVzZS1jb25zb2xlPSJ0cnVlIj4KLSAgIDxmZWF0dXJlIGlkPSJ1cGRhdGUuZmVhdHVyZTFjIiB2ZXJzaW9uPSIzLjAuMCIvPgotPC9zaXRlLWJ1aWxkPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTQvZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUxXzEuMC4wLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU0L2ZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlMV8xLjAuMC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4ZDJmMjguLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTQvZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUxXzEuMC4wLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU0L2ZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlMV8xLjAuMS5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNC9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTFfMS4wLjEuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWIwYjZmLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU0L2ZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlMV8xLjAuMS5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNC9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTFiXzIuMC4wLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU0L2ZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlMWJfMi4wLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWI2YmNiLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU0L2ZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlMWJfMi4wLjAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTQvZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUxY18zLjAuMC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNC9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTFjXzMuMC4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc1MzMwNS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNC9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTFjXzMuMC4wLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU0L3BsdWdpbnMvY29tLnBsdWdpbjFfMS4wLjAuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTQvcGx1Z2lucy9jb20ucGx1Z2luMV8xLjAuMC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlMDc2MGYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTQvcGx1Z2lucy9jb20ucGx1Z2luMV8xLjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNC9wbHVnaW5zL2NvbS5wbHVnaW4xYV8xLjAuMS5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNC9wbHVnaW5zL2NvbS5wbHVnaW4xYV8xLjAuMS5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzNGViMDcuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTQvcGx1Z2lucy9jb20ucGx1Z2luMWFfMS4wLjEuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTQvc2l0ZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNC9zaXRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM3M2NiZS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNC9zaXRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08c2l0ZT4KLSAgIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUxY18zLjAuMC5qYXIiIGlkPSJ1cGRhdGUuZmVhdHVyZTFjIiB2ZXJzaW9uPSIzLjAuMCI+Ci0gICAgICA8Y2F0ZWdvcnkgbmFtZT0iU2l0ZTQtQ2F0ZWdvcnkxIi8+Ci0gICA8L2ZlYXR1cmU+Ci0gICA8Y2F0ZWdvcnktZGVmIG5hbWU9IlNpdGU0LUNhdGVnb3J5MSIgbGFiZWw9IlNpdGU0LUNhdGVnb3J5MS1MYWJlbCI+Ci0gICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICBlY2V0ZXJhLgotICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgIDwvY2F0ZWdvcnktZGVmPgotPC9zaXRlPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTUvLnByb2plY3QgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE5MzMwMi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPnVwZGF0ZS1zaXRlNTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5VcGRhdGVTaXRlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlVwZGF0ZVNpdGVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU1Ly5zaXRlYnVpbGQvYnVpbGQubG9nIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTUvLnNpdGVidWlsZC9idWlsZC5sb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiNDRmYWEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTUvLnNpdGVidWlsZC9idWlsZC5sb2cKKysrIC9kZXYvbnVsbApAQCAtMSw3OTEgKzAsMCBAQAotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogYnVpbGQudXBkYXRlLmphcg0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5mZWF0dXJlcw0KLVRhc2sgc3RhcnRlZDogYW50DQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogYnVpbGQudXBkYXRlLmphcg0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5mZWF0dXJlcw0KLVRhcmdldCBmaW5pc2hlZDogYWxsLmZlYXR1cmVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5wbHVnaW5zDQotVGFzayBzdGFydGVkOiBhbnQNCi1UYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGJ1aWxkLnVwZGF0ZS5qYXINCi1UYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KLVRhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KLVRhc2sgc3RhcnRlZDogbWtkaXINCi1UYXNrIGZpbmlzaGVkOiBta2Rpcg0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogYnVpbGQuamFycw0KLVRhc2sgc3RhcnRlZDogYXZhaWxhYmxlDQotVGFzayBmaW5pc2hlZDogYXZhaWxhYmxlDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBwbHVnaW4yLmphcg0KLVRhc2sgc3RhcnRlZDogZGVsZXRlDQotVGFzayBmaW5pc2hlZDogZGVsZXRlDQotVGFzayBzdGFydGVkOiBta2Rpcg0KLVRhc2sgZmluaXNoZWQ6IG1rZGlyDQotVGFzayBzdGFydGVkOiBqYXZhYw0KLU1lc3NhZ2UgbG9nZ2VkOiBDb21waWxlIGZhaWxlZDsgc2VlIHRoZSBjb21waWxlciBlcnJvciBvdXRwdXQgZm9yIGRldGFpbHMuDQotVGFzayBmaW5pc2hlZDogamF2YWMNCi1UYXNrIHN0YXJ0ZWQ6IGNvcHkNCi1UYXNrIGZpbmlzaGVkOiBjb3B5DQotVGFzayBzdGFydGVkOiBta2Rpcg0KLVRhc2sgZmluaXNoZWQ6IG1rZGlyDQotVGFzayBzdGFydGVkOiBqYXINCi1UYXNrIGZpbmlzaGVkOiBqYXINCi1UYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KLVRhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KLVRhcmdldCBmaW5pc2hlZDogcGx1Z2luMi5qYXINCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFyZ2V0IGZpbmlzaGVkOiBidWlsZC5qYXJzDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogZ2F0aGVyLmJpbi5wYXJ0cw0KLVRhc2sgc3RhcnRlZDogbWtkaXINCi1UYXNrIGZpbmlzaGVkOiBta2Rpcg0KLVRhc2sgc3RhcnRlZDogY29weQ0KLVRhc2sgZmluaXNoZWQ6IGNvcHkNCi1UYXNrIHN0YXJ0ZWQ6IGNvcHkNCi1UYXNrIGZpbmlzaGVkOiBjb3B5DQotVGFyZ2V0IGZpbmlzaGVkOiBnYXRoZXIuYmluLnBhcnRzDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhc2sgc3RhcnRlZDogemlwDQotVGFzayBmaW5pc2hlZDogemlwDQotVGFzayBzdGFydGVkOiBkZWxldGUNCi1UYXNrIGZpbmlzaGVkOiBkZWxldGUNCi1UYXJnZXQgZmluaXNoZWQ6IGJ1aWxkLnVwZGF0ZS5qYXINCi1UYXNrIGZpbmlzaGVkOiBhbnQNCi1UYXJnZXQgZmluaXNoZWQ6IGFsbC5wbHVnaW5zDQotVGFyZ2V0IHN0YXJ0ZWQ6IHVwZGF0ZS5mZWF0dXJlDQotVGFyZ2V0IGZpbmlzaGVkOiB1cGRhdGUuZmVhdHVyZQ0KLVRhcmdldCBzdGFydGVkOiBhbGwuY2hpbGRyZW4NCi1UYXJnZXQgZmluaXNoZWQ6IGFsbC5jaGlsZHJlbg0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KLVRhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KLVRhc2sgc3RhcnRlZDogbWtkaXINCi1UYXNrIGZpbmlzaGVkOiBta2Rpcg0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGdhdGhlci5iaW4ucGFydHMNCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogY2hpbGRyZW4NCi1UYXJnZXQgZmluaXNoZWQ6IGNoaWxkcmVuDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhc2sgc3RhcnRlZDogbWtkaXINCi1UYXNrIGZpbmlzaGVkOiBta2Rpcg0KLVRhc2sgc3RhcnRlZDogY29weQ0KLVRhc2sgZmluaXNoZWQ6IGNvcHkNCi1UYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UuaWRSZXBsYWNlcg0KLVRhc2sgZmluaXNoZWQ6IGVjbGlwc2UuaWRSZXBsYWNlcg0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBST09URklMRVMqXypfKg0KLVRhcmdldCBmaW5pc2hlZDogUk9PVEZJTEVTKl8qXyoNCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFyZ2V0IGZpbmlzaGVkOiBnYXRoZXIuYmluLnBhcnRzDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhc2sgc3RhcnRlZDogamFyDQotVGFzayBmaW5pc2hlZDogamFyDQotVGFzayBzdGFydGVkOiBkZWxldGUNCi1UYXNrIGZpbmlzaGVkOiBkZWxldGUNCi1UYXJnZXQgZmluaXNoZWQ6IGJ1aWxkLnVwZGF0ZS5qYXINCi1UYXNrIGZpbmlzaGVkOiBhbnQNCi1UYXNrIHN0YXJ0ZWQ6IGFudA0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGJ1aWxkLnVwZGF0ZS5qYXINCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBhbGwuZmVhdHVyZXMNCi1UYXJnZXQgZmluaXNoZWQ6IGFsbC5mZWF0dXJlcw0KLVRhcmdldCBzdGFydGVkOiBhbGwucGx1Z2lucw0KLVRhc2sgc3RhcnRlZDogYW50DQotVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBidWlsZC51cGRhdGUuamFyDQotVGFzayBzdGFydGVkOiBkZWxldGUNCi1UYXNrIGZpbmlzaGVkOiBkZWxldGUNCi1UYXNrIHN0YXJ0ZWQ6IG1rZGlyDQotVGFzayBmaW5pc2hlZDogbWtkaXINCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGJ1aWxkLmphcnMNCi1UYXNrIHN0YXJ0ZWQ6IGF2YWlsYWJsZQ0KLVRhc2sgZmluaXNoZWQ6IGF2YWlsYWJsZQ0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogcGx1Z2luMi5qYXINCi1UYXJnZXQgZmluaXNoZWQ6IHBsdWdpbjIuamFyDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhcmdldCBmaW5pc2hlZDogYnVpbGQuamFycw0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGdhdGhlci5iaW4ucGFydHMNCi1UYXNrIHN0YXJ0ZWQ6IG1rZGlyDQotVGFzayBmaW5pc2hlZDogbWtkaXINCi1UYXNrIHN0YXJ0ZWQ6IGNvcHkNCi1UYXNrIGZpbmlzaGVkOiBjb3B5DQotVGFzayBzdGFydGVkOiBjb3B5DQotVGFzayBmaW5pc2hlZDogY29weQ0KLVRhcmdldCBmaW5pc2hlZDogZ2F0aGVyLmJpbi5wYXJ0cw0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXNrIHN0YXJ0ZWQ6IHppcA0KLVRhc2sgZmluaXNoZWQ6IHppcA0KLVRhc2sgc3RhcnRlZDogZGVsZXRlDQotVGFzayBmaW5pc2hlZDogZGVsZXRlDQotVGFyZ2V0IGZpbmlzaGVkOiBidWlsZC51cGRhdGUuamFyDQotVGFzayBmaW5pc2hlZDogYW50DQotVGFyZ2V0IGZpbmlzaGVkOiBhbGwucGx1Z2lucw0KLVRhcmdldCBzdGFydGVkOiB1cGRhdGUuZmVhdHVyZQ0KLVRhcmdldCBmaW5pc2hlZDogdXBkYXRlLmZlYXR1cmUNCi1UYXJnZXQgc3RhcnRlZDogYWxsLmNoaWxkcmVuDQotVGFyZ2V0IGZpbmlzaGVkOiBhbGwuY2hpbGRyZW4NCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBkZWxldGUNCi1UYXNrIGZpbmlzaGVkOiBkZWxldGUNCi1UYXNrIHN0YXJ0ZWQ6IG1rZGlyDQotVGFzayBmaW5pc2hlZDogbWtkaXINCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBnYXRoZXIuYmluLnBhcnRzDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IGNoaWxkcmVuDQotVGFyZ2V0IGZpbmlzaGVkOiBjaGlsZHJlbg0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXNrIHN0YXJ0ZWQ6IG1rZGlyDQotVGFzayBmaW5pc2hlZDogbWtkaXINCi1UYXNrIHN0YXJ0ZWQ6IGNvcHkNCi1UYXNrIGZpbmlzaGVkOiBjb3B5DQotVGFzayBzdGFydGVkOiBlY2xpcHNlLmlkUmVwbGFjZXINCi1UYXNrIGZpbmlzaGVkOiBlY2xpcHNlLmlkUmVwbGFjZXINCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogUk9PVEZJTEVTKl8qXyoNCi1UYXJnZXQgZmluaXNoZWQ6IFJPT1RGSUxFUypfKl8qDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhcmdldCBmaW5pc2hlZDogZ2F0aGVyLmJpbi5wYXJ0cw0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXNrIHN0YXJ0ZWQ6IGphcg0KLVRhc2sgZmluaXNoZWQ6IGphcg0KLVRhc2sgc3RhcnRlZDogZGVsZXRlDQotVGFzayBmaW5pc2hlZDogZGVsZXRlDQotVGFyZ2V0IGZpbmlzaGVkOiBidWlsZC51cGRhdGUuamFyDQotVGFzayBmaW5pc2hlZDogYW50DQotVGFzayBzdGFydGVkOiBhbnQNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBidWlsZC51cGRhdGUuamFyDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogYWxsLmZlYXR1cmVzDQotVGFyZ2V0IGZpbmlzaGVkOiBhbGwuZmVhdHVyZXMNCi1UYXJnZXQgc3RhcnRlZDogYWxsLnBsdWdpbnMNCi1UYXNrIHN0YXJ0ZWQ6IGFudA0KLVRhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogYnVpbGQudXBkYXRlLmphcg0KLVRhc2sgc3RhcnRlZDogZGVsZXRlDQotVGFzayBmaW5pc2hlZDogZGVsZXRlDQotVGFzayBzdGFydGVkOiBta2Rpcg0KLVRhc2sgZmluaXNoZWQ6IG1rZGlyDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBidWlsZC5qYXJzDQotVGFzayBzdGFydGVkOiBhdmFpbGFibGUNCi1UYXNrIGZpbmlzaGVkOiBhdmFpbGFibGUNCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IHBsdWdpbjJhLmphcg0KLVRhc2sgc3RhcnRlZDogZGVsZXRlDQotVGFzayBmaW5pc2hlZDogZGVsZXRlDQotVGFzayBzdGFydGVkOiBta2Rpcg0KLVRhc2sgZmluaXNoZWQ6IG1rZGlyDQotVGFzayBzdGFydGVkOiBqYXZhYw0KLU1lc3NhZ2UgbG9nZ2VkOiBDb21waWxlIGZhaWxlZDsgc2VlIHRoZSBjb21waWxlciBlcnJvciBvdXRwdXQgZm9yIGRldGFpbHMuDQotVGFzayBmaW5pc2hlZDogamF2YWMNCi1UYXNrIHN0YXJ0ZWQ6IGNvcHkNCi1UYXNrIGZpbmlzaGVkOiBjb3B5DQotVGFzayBzdGFydGVkOiBta2Rpcg0KLVRhc2sgZmluaXNoZWQ6IG1rZGlyDQotVGFzayBzdGFydGVkOiBqYXINCi1UYXNrIGZpbmlzaGVkOiBqYXINCi1UYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KLVRhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KLVRhcmdldCBmaW5pc2hlZDogcGx1Z2luMmEuamFyDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhcmdldCBmaW5pc2hlZDogYnVpbGQuamFycw0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGdhdGhlci5iaW4ucGFydHMNCi1UYXNrIHN0YXJ0ZWQ6IG1rZGlyDQotVGFzayBmaW5pc2hlZDogbWtkaXINCi1UYXNrIHN0YXJ0ZWQ6IGNvcHkNCi1UYXNrIGZpbmlzaGVkOiBjb3B5DQotVGFzayBzdGFydGVkOiBjb3B5DQotVGFzayBmaW5pc2hlZDogY29weQ0KLVRhcmdldCBmaW5pc2hlZDogZ2F0aGVyLmJpbi5wYXJ0cw0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXNrIHN0YXJ0ZWQ6IHppcA0KLVRhc2sgZmluaXNoZWQ6IHppcA0KLVRhc2sgc3RhcnRlZDogZGVsZXRlDQotVGFzayBmaW5pc2hlZDogZGVsZXRlDQotVGFyZ2V0IGZpbmlzaGVkOiBidWlsZC51cGRhdGUuamFyDQotVGFzayBmaW5pc2hlZDogYW50DQotVGFzayBzdGFydGVkOiBhbnQNCi1UYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGJ1aWxkLnVwZGF0ZS5qYXINCi1UYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KLVRhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KLVRhc2sgc3RhcnRlZDogbWtkaXINCi1UYXNrIGZpbmlzaGVkOiBta2Rpcg0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogYnVpbGQuamFycw0KLVRhc2sgc3RhcnRlZDogYXZhaWxhYmxlDQotVGFzayBmaW5pc2hlZDogYXZhaWxhYmxlDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBwbHVnaW4yLmphcg0KLVRhcmdldCBmaW5pc2hlZDogcGx1Z2luMi5qYXINCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFyZ2V0IGZpbmlzaGVkOiBidWlsZC5qYXJzDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogZ2F0aGVyLmJpbi5wYXJ0cw0KLVRhc2sgc3RhcnRlZDogbWtkaXINCi1UYXNrIGZpbmlzaGVkOiBta2Rpcg0KLVRhc2sgc3RhcnRlZDogY29weQ0KLVRhc2sgZmluaXNoZWQ6IGNvcHkNCi1UYXNrIHN0YXJ0ZWQ6IGNvcHkNCi1UYXNrIGZpbmlzaGVkOiBjb3B5DQotVGFyZ2V0IGZpbmlzaGVkOiBnYXRoZXIuYmluLnBhcnRzDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhc2sgc3RhcnRlZDogemlwDQotVGFzayBmaW5pc2hlZDogemlwDQotVGFzayBzdGFydGVkOiBkZWxldGUNCi1UYXNrIGZpbmlzaGVkOiBkZWxldGUNCi1UYXJnZXQgZmluaXNoZWQ6IGJ1aWxkLnVwZGF0ZS5qYXINCi1UYXNrIGZpbmlzaGVkOiBhbnQNCi1UYXJnZXQgZmluaXNoZWQ6IGFsbC5wbHVnaW5zDQotVGFyZ2V0IHN0YXJ0ZWQ6IHVwZGF0ZS5mZWF0dXJlDQotVGFyZ2V0IGZpbmlzaGVkOiB1cGRhdGUuZmVhdHVyZQ0KLVRhcmdldCBzdGFydGVkOiBhbGwuY2hpbGRyZW4NCi1UYXJnZXQgZmluaXNoZWQ6IGFsbC5jaGlsZHJlbg0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KLVRhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KLVRhc2sgc3RhcnRlZDogbWtkaXINCi1UYXNrIGZpbmlzaGVkOiBta2Rpcg0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGdhdGhlci5iaW4ucGFydHMNCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogY2hpbGRyZW4NCi1UYXJnZXQgZmluaXNoZWQ6IGNoaWxkcmVuDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhc2sgc3RhcnRlZDogbWtkaXINCi1UYXNrIGZpbmlzaGVkOiBta2Rpcg0KLVRhc2sgc3RhcnRlZDogY29weQ0KLVRhc2sgZmluaXNoZWQ6IGNvcHkNCi1UYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UuaWRSZXBsYWNlcg0KLVRhc2sgZmluaXNoZWQ6IGVjbGlwc2UuaWRSZXBsYWNlcg0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBST09URklMRVMqXypfKg0KLVRhcmdldCBmaW5pc2hlZDogUk9PVEZJTEVTKl8qXyoNCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFyZ2V0IGZpbmlzaGVkOiBnYXRoZXIuYmluLnBhcnRzDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhc2sgc3RhcnRlZDogamFyDQotVGFzayBmaW5pc2hlZDogamFyDQotVGFzayBzdGFydGVkOiBkZWxldGUNCi1UYXNrIGZpbmlzaGVkOiBkZWxldGUNCi1UYXJnZXQgZmluaXNoZWQ6IGJ1aWxkLnVwZGF0ZS5qYXINCi1UYXNrIGZpbmlzaGVkOiBhbnQNCi1UYXJnZXQgZmluaXNoZWQ6IGFsbC5mZWF0dXJlcw0KLVRhcmdldCBzdGFydGVkOiBhbGwucGx1Z2lucw0KLVRhcmdldCBmaW5pc2hlZDogYWxsLnBsdWdpbnMNCi1UYXJnZXQgc3RhcnRlZDogdXBkYXRlLmZlYXR1cmUNCi1UYXJnZXQgZmluaXNoZWQ6IHVwZGF0ZS5mZWF0dXJlDQotVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5jaGlsZHJlbg0KLVRhcmdldCBmaW5pc2hlZDogYWxsLmNoaWxkcmVuDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogZGVsZXRlDQotVGFzayBmaW5pc2hlZDogZGVsZXRlDQotVGFzayBzdGFydGVkOiBta2Rpcg0KLVRhc2sgZmluaXNoZWQ6IG1rZGlyDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogZ2F0aGVyLmJpbi5wYXJ0cw0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBjaGlsZHJlbg0KLVRhcmdldCBmaW5pc2hlZDogY2hpbGRyZW4NCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFzayBzdGFydGVkOiBta2Rpcg0KLVRhc2sgZmluaXNoZWQ6IG1rZGlyDQotVGFzayBzdGFydGVkOiBjb3B5DQotVGFzayBmaW5pc2hlZDogY29weQ0KLVRhc2sgc3RhcnRlZDogZWNsaXBzZS5pZFJlcGxhY2VyDQotVGFzayBmaW5pc2hlZDogZWNsaXBzZS5pZFJlcGxhY2VyDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IFJPT1RGSUxFUypfKl8qDQotVGFyZ2V0IGZpbmlzaGVkOiBST09URklMRVMqXypfKg0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXJnZXQgZmluaXNoZWQ6IGdhdGhlci5iaW4ucGFydHMNCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFzayBzdGFydGVkOiBqYXINCi1UYXNrIGZpbmlzaGVkOiBqYXINCi1UYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KLVRhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KLVRhcmdldCBmaW5pc2hlZDogYnVpbGQudXBkYXRlLmphcg0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IHJlZnJlc2gNCi1UYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UuY29udmVydFBhdGgNCi1UYXNrIGZpbmlzaGVkOiBlY2xpcHNlLmNvbnZlcnRQYXRoDQotVGFzayBzdGFydGVkOiBlY2xpcHNlLnJlZnJlc2hMb2NhbA0KLU1lc3NhZ2UgbG9nZ2VkOiBQcm9qZWN0ICR7dXBkYXRlLmZlYXR1cmUyY18zLjAuMH0gZG9lcyBub3QgZXhpc3QgYW5kIGNhbm5vdCBiZSByZWZyZXNoZWQuDQotVGFzayBmaW5pc2hlZDogZWNsaXBzZS5yZWZyZXNoTG9jYWwNCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBhbGwuZmVhdHVyZXMNCi1UYXNrIHN0YXJ0ZWQ6IGFudA0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IHJlZnJlc2gNCi1UYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UuY29udmVydFBhdGgNCi1UYXNrIGZpbmlzaGVkOiBlY2xpcHNlLmNvbnZlcnRQYXRoDQotVGFzayBzdGFydGVkOiBlY2xpcHNlLnJlZnJlc2hMb2NhbA0KLU1lc3NhZ2UgbG9nZ2VkOiBQcm9qZWN0ICR7dXBkYXRlLmZlYXR1cmUyXzEuMC4wfSBkb2VzIG5vdCBleGlzdCBhbmQgY2Fubm90IGJlIHJlZnJlc2hlZC4NCi1UYXNrIGZpbmlzaGVkOiBlY2xpcHNlLnJlZnJlc2hMb2NhbA0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5mZWF0dXJlcw0KLVRhcmdldCBmaW5pc2hlZDogYWxsLmZlYXR1cmVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5wbHVnaW5zDQotVGFzayBzdGFydGVkOiBhbnQNCi1UYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IHJlZnJlc2gNCi1UYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UuY29udmVydFBhdGgNCi1UYXNrIGZpbmlzaGVkOiBlY2xpcHNlLmNvbnZlcnRQYXRoDQotVGFzayBzdGFydGVkOiBlY2xpcHNlLnJlZnJlc2hMb2NhbA0KLVRhc2sgZmluaXNoZWQ6IGVjbGlwc2UucmVmcmVzaExvY2FsDQotVGFyZ2V0IGZpbmlzaGVkOiByZWZyZXNoDQotVGFzayBmaW5pc2hlZDogYW50DQotVGFyZ2V0IGZpbmlzaGVkOiBhbGwucGx1Z2lucw0KLVRhcmdldCBzdGFydGVkOiB1cGRhdGUuZmVhdHVyZQ0KLVRhcmdldCBmaW5pc2hlZDogdXBkYXRlLmZlYXR1cmUNCi1UYXJnZXQgc3RhcnRlZDogYWxsLmNoaWxkcmVuDQotVGFyZ2V0IGZpbmlzaGVkOiBhbGwuY2hpbGRyZW4NCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFyZ2V0IGZpbmlzaGVkOiByZWZyZXNoDQotVGFzayBmaW5pc2hlZDogYW50DQotVGFzayBzdGFydGVkOiBhbnQNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiByZWZyZXNoDQotVGFzayBzdGFydGVkOiBlY2xpcHNlLmNvbnZlcnRQYXRoDQotVGFzayBmaW5pc2hlZDogZWNsaXBzZS5jb252ZXJ0UGF0aA0KLVRhc2sgc3RhcnRlZDogZWNsaXBzZS5yZWZyZXNoTG9jYWwNCi1NZXNzYWdlIGxvZ2dlZDogUHJvamVjdCAke3VwZGF0ZS5mZWF0dXJlMl8xLjAuMH0gZG9lcyBub3QgZXhpc3QgYW5kIGNhbm5vdCBiZSByZWZyZXNoZWQuDQotVGFzayBmaW5pc2hlZDogZWNsaXBzZS5yZWZyZXNoTG9jYWwNCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBhbGwuZmVhdHVyZXMNCi1UYXJnZXQgZmluaXNoZWQ6IGFsbC5mZWF0dXJlcw0KLVRhcmdldCBzdGFydGVkOiBhbGwucGx1Z2lucw0KLVRhc2sgc3RhcnRlZDogYW50DQotVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiByZWZyZXNoDQotVGFzayBzdGFydGVkOiBlY2xpcHNlLmNvbnZlcnRQYXRoDQotVGFzayBmaW5pc2hlZDogZWNsaXBzZS5jb252ZXJ0UGF0aA0KLVRhc2sgc3RhcnRlZDogZWNsaXBzZS5yZWZyZXNoTG9jYWwNCi1UYXNrIGZpbmlzaGVkOiBlY2xpcHNlLnJlZnJlc2hMb2NhbA0KLVRhcmdldCBmaW5pc2hlZDogcmVmcmVzaA0KLVRhc2sgZmluaXNoZWQ6IGFudA0KLVRhcmdldCBmaW5pc2hlZDogYWxsLnBsdWdpbnMNCi1UYXJnZXQgc3RhcnRlZDogdXBkYXRlLmZlYXR1cmUNCi1UYXJnZXQgZmluaXNoZWQ6IHVwZGF0ZS5mZWF0dXJlDQotVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5jaGlsZHJlbg0KLVRhcmdldCBmaW5pc2hlZDogYWxsLmNoaWxkcmVuDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhcmdldCBmaW5pc2hlZDogcmVmcmVzaA0KLVRhc2sgZmluaXNoZWQ6IGFudA0KLVRhc2sgc3RhcnRlZDogYW50DQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogcmVmcmVzaA0KLVRhc2sgc3RhcnRlZDogZWNsaXBzZS5jb252ZXJ0UGF0aA0KLVRhc2sgZmluaXNoZWQ6IGVjbGlwc2UuY29udmVydFBhdGgNCi1UYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UucmVmcmVzaExvY2FsDQotTWVzc2FnZSBsb2dnZWQ6IFByb2plY3QgJHt1cGRhdGUuZmVhdHVyZTJiXzIuMC4wfSBkb2VzIG5vdCBleGlzdCBhbmQgY2Fubm90IGJlIHJlZnJlc2hlZC4NCi1UYXNrIGZpbmlzaGVkOiBlY2xpcHNlLnJlZnJlc2hMb2NhbA0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5mZWF0dXJlcw0KLVRhcmdldCBmaW5pc2hlZDogYWxsLmZlYXR1cmVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5wbHVnaW5zDQotVGFzayBzdGFydGVkOiBhbnQNCi1UYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IHJlZnJlc2gNCi1UYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UuY29udmVydFBhdGgNCi1UYXNrIGZpbmlzaGVkOiBlY2xpcHNlLmNvbnZlcnRQYXRoDQotVGFzayBzdGFydGVkOiBlY2xpcHNlLnJlZnJlc2hMb2NhbA0KLVRhc2sgZmluaXNoZWQ6IGVjbGlwc2UucmVmcmVzaExvY2FsDQotVGFyZ2V0IGZpbmlzaGVkOiByZWZyZXNoDQotVGFzayBmaW5pc2hlZDogYW50DQotVGFzayBzdGFydGVkOiBhbnQNCi1UYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IHJlZnJlc2gNCi1UYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UuY29udmVydFBhdGgNCi1UYXNrIGZpbmlzaGVkOiBlY2xpcHNlLmNvbnZlcnRQYXRoDQotVGFzayBzdGFydGVkOiBlY2xpcHNlLnJlZnJlc2hMb2NhbA0KLVRhc2sgZmluaXNoZWQ6IGVjbGlwc2UucmVmcmVzaExvY2FsDQotVGFyZ2V0IGZpbmlzaGVkOiByZWZyZXNoDQotVGFzayBmaW5pc2hlZDogYW50DQotVGFyZ2V0IGZpbmlzaGVkOiBhbGwucGx1Z2lucw0KLVRhcmdldCBzdGFydGVkOiB1cGRhdGUuZmVhdHVyZQ0KLVRhcmdldCBmaW5pc2hlZDogdXBkYXRlLmZlYXR1cmUNCi1UYXJnZXQgc3RhcnRlZDogYWxsLmNoaWxkcmVuDQotVGFyZ2V0IGZpbmlzaGVkOiBhbGwuY2hpbGRyZW4NCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFyZ2V0IGZpbmlzaGVkOiByZWZyZXNoDQotVGFzayBmaW5pc2hlZDogYW50DQotVGFyZ2V0IGZpbmlzaGVkOiBhbGwuZmVhdHVyZXMNCi1UYXJnZXQgc3RhcnRlZDogYWxsLnBsdWdpbnMNCi1UYXJnZXQgZmluaXNoZWQ6IGFsbC5wbHVnaW5zDQotVGFyZ2V0IHN0YXJ0ZWQ6IHVwZGF0ZS5mZWF0dXJlDQotVGFyZ2V0IGZpbmlzaGVkOiB1cGRhdGUuZmVhdHVyZQ0KLVRhcmdldCBzdGFydGVkOiBhbGwuY2hpbGRyZW4NCi1UYXJnZXQgZmluaXNoZWQ6IGFsbC5jaGlsZHJlbg0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXJnZXQgZmluaXNoZWQ6IHJlZnJlc2gNCi1CdWlsZCBmaW5pc2hlZC4NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNS8uc2l0ZWJ1aWxkL3NpdGVidWlsZC54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNS8uc2l0ZWJ1aWxkL3NpdGVidWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5MjQzZDMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTUvLnNpdGVidWlsZC9zaXRlYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxzaXRlLWJ1aWxkCi0gICAgICBmZWF0dXJlLWxvY2F0aW9uPSJmZWF0dXJlcyIKLSAgICAgIHBsdWdpbi1sb2NhdGlvbj0icGx1Z2lucyIKLSAgICAgIGF1dG9idWlsZD0iZmFsc2UiCi0gICAgICBzY3J1Yi1vdXRwdXQ9ImZhbHNlIgotICAgICAgdXNlLWNvbnNvbGU9InRydWUiPgotICAgPGZlYXR1cmUgaWQ9InVwZGF0ZS5mZWF0dXJlMWMiIHZlcnNpb249IjMuMC4wIi8+Ci0gICA8ZmVhdHVyZSBpZD0idXBkYXRlLmZlYXR1cmUyYyIgdmVyc2lvbj0iMy4wLjAiLz4KLTwvc2l0ZS1idWlsZD4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU1L2ZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlMV8xLjAuMC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNS9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTFfMS4wLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTJkOWUyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU1L2ZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlMV8xLjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNS9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTFfMS4wLjEuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTUvZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUxXzEuMC4xLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWViMGI2Zi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNS9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTFfMS4wLjEuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTUvZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUxYl8yLjAuMC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNS9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTFiXzIuMC4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDliMDc2NC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNS9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTFiXzIuMC4wLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU1L2ZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlMWNfMy4wLjAuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTUvZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUxY18zLjAuMC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0MjZmODYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTUvZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUxY18zLjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNS9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTJfMS4wLjAuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTUvZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUyXzEuMC4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA3MGNjZC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNS9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTJfMS4wLjAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTUvZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUyYl8yLjAuMC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNS9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTJiXzIuMC4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ4YWMwNS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNS9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTJiXzIuMC4wLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU1L2ZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlMmNfMy4wLjAuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTUvZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUyY18zLjAuMC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDM3ZGYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTUvZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUyY18zLjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNS9wbHVnaW5zL2NvbS5wbHVnaW4xXzEuMC4wLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU1L3BsdWdpbnMvY29tLnBsdWdpbjFfMS4wLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTQzNzQ5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU1L3BsdWdpbnMvY29tLnBsdWdpbjFfMS4wLjAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTUvcGx1Z2lucy9jb20ucGx1Z2luMWFfMS4wLjEuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTUvcGx1Z2lucy9jb20ucGx1Z2luMWFfMS4wLjEuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzJjYzNmLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU1L3BsdWdpbnMvY29tLnBsdWdpbjFhXzEuMC4xLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU1L3BsdWdpbnMvY29tLnBsdWdpbjJfMS4wLjAuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTUvcGx1Z2lucy9jb20ucGx1Z2luMl8xLjAuMC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiYzhhODguLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTUvcGx1Z2lucy9jb20ucGx1Z2luMl8xLjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNS9wbHVnaW5zL2NvbS5wbHVnaW4yYV8xLjAuMS5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNS9wbHVnaW5zL2NvbS5wbHVnaW4yYV8xLjAuMS5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzY2QwZmIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTUvcGx1Z2lucy9jb20ucGx1Z2luMmFfMS4wLjEuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTUvc2l0ZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNS9zaXRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmUyNmRiMS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNS9zaXRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08c2l0ZT4KLSAgIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUxY18zLjAuMC5qYXIiIGlkPSJ1cGRhdGUuZmVhdHVyZTFjIiB2ZXJzaW9uPSIzLjAuMCI+Ci0gICAgICA8Y2F0ZWdvcnkgbmFtZT0iU2l0ZTUtQ2F0ZWdvcnkxIi8+Ci0gICA8L2ZlYXR1cmU+Ci0gICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlMmNfMy4wLjAuamFyIiBpZD0idXBkYXRlLmZlYXR1cmUyYyIgdmVyc2lvbj0iMy4wLjAiPgotICAgICAgPGNhdGVnb3J5IG5hbWU9IlNpdGU1LUNhdGVnb3J5MiIvPgotICAgPC9mZWF0dXJlPgotICAgPGNhdGVnb3J5LWRlZiBuYW1lPSJTaXRlNS1DYXRlZ29yeTEiIGxhYmVsPSJTaXRlNS1DYXRlZ29yeTEtTGFiZWwiPgotICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgZWNldGVyYS4KLSAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICA8L2NhdGVnb3J5LWRlZj4KLSAgIDxjYXRlZ29yeS1kZWYgbmFtZT0iU2l0ZTUtQ2F0ZWdvcnkyIiBsYWJlbD0iU2l0ZTUtQ2F0ZWdvcnkyLUxhYmVsIj4KLSAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgIGVjZXRlcmEuCi0gICAgICA8L2Rlc2NyaXB0aW9uPgotICAgPC9jYXRlZ29yeS1kZWY+Ci08L3NpdGU+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QvZmVhdHVyZXMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuY2hpbGRyZW5mZWF0dXJlXzIuMC4wLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL25lc3RlZEZlYXR1cmVTaXRlVGVzdC9mZWF0dXJlcy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5jaGlsZHJlbmZlYXR1cmVfMi4wLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjU4MDM0Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL25lc3RlZEZlYXR1cmVTaXRlVGVzdC9mZWF0dXJlcy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5jaGlsZHJlbmZlYXR1cmVfMi4wLjAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0L2ZlYXR1cmVzL3Jvb3RmZWF0dXJlLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL25lc3RlZEZlYXR1cmVTaXRlVGVzdC9mZWF0dXJlcy9yb290ZmVhdHVyZS5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwMTEwNTAuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0L2ZlYXR1cmVzL3Jvb3RmZWF0dXJlLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL25lc3RlZEZlYXR1cmVTaXRlVGVzdC9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjFfMy41LjYuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0L3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMV8zLjUuNi5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkOWY1YmMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0L3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMV8zLjUuNi5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4yXzUuMC4wLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL25lc3RlZEZlYXR1cmVTaXRlVGVzdC9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjJfNS4wLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjRiMDRhLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL25lc3RlZEZlYXR1cmVTaXRlVGVzdC9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjJfNS4wLjAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0L3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMl81LjAuMS5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4yXzUuMC4xLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTIyMDhmZS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4yXzUuMC4xLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL25lc3RlZEZlYXR1cmVTaXRlVGVzdC9zaXRlLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL25lc3RlZEZlYXR1cmVTaXRlVGVzdC9zaXRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjIzY2IxYS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3Qvc2l0ZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08c2l0ZT4KLSAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9yb290ZmVhdHVyZS5qYXIiLz4KLTwvc2l0ZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QyL2ZlYXR1cmVzL2NoaWxkcmVuZmVhdHVyZS5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QyL2ZlYXR1cmVzL2NoaWxkcmVuZmVhdHVyZS5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlMDU3ZTYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0Mi9mZWF0dXJlcy9jaGlsZHJlbmZlYXR1cmUuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0Mi9mZWF0dXJlcy9yb290ZmVhdHVyZS5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QyL2ZlYXR1cmVzL3Jvb3RmZWF0dXJlLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhhMGEzYy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QyL2ZlYXR1cmVzL3Jvb3RmZWF0dXJlLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL25lc3RlZEZlYXR1cmVTaXRlVGVzdDIvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4xXzMuNS42LmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL25lc3RlZEZlYXR1cmVTaXRlVGVzdDIvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4xXzMuNS42LmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ5ZjViYy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QyL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMV8zLjUuNi5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QyL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMl81LjAuMC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QyL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMl81LjAuMC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiNGIwNGEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0Mi9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjJfNS4wLjAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0Mi9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjJfNS4wLjEuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0Mi9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjJfNS4wLjEuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjIwOGZlLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL25lc3RlZEZlYXR1cmVTaXRlVGVzdDIvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4yXzUuMC4xLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL25lc3RlZEZlYXR1cmVTaXRlVGVzdDIvc2l0ZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QyL3NpdGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzUyZGEyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL25lc3RlZEZlYXR1cmVTaXRlVGVzdDIvc2l0ZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08c2l0ZT4KLSAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9yb290ZmVhdHVyZS5qYXIiLz4KLSAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9jaGlsZHJlbmZlYXR1cmUuamFyIi8+ICAKLSAgCi0gIDxhcmNoaXZlIHBhdGg9ImZlYXR1cmVzL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmNoaWxkcmVuZmVhdHVyZV8yLjEuMC5qYXIiIHVybD0iZmVhdHVyZXMvY2hpbGRyZW5mZWF0dXJlLmphciIvPiAgCi08L3NpdGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0My9mZWF0dXJlcy9jaGlsZHJlbmZlYXR1cmUuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0My9mZWF0dXJlcy9jaGlsZHJlbmZlYXR1cmUuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmVlNGJhLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL25lc3RlZEZlYXR1cmVTaXRlVGVzdDMvZmVhdHVyZXMvY2hpbGRyZW5mZWF0dXJlLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL25lc3RlZEZlYXR1cmVTaXRlVGVzdDMvZmVhdHVyZXMvcm9vdGZlYXR1cmUuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0My9mZWF0dXJlcy9yb290ZmVhdHVyZS5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5OWJkZGEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0My9mZWF0dXJlcy9yb290ZmVhdHVyZS5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QzL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMV8zLjUuNi5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QzL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMV8zLjUuNi5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkOWY1YmMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0My9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjFfMy41LjYuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0My9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjJfNS4wLjAuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0My9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjJfNS4wLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjRiMDRhLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL25lc3RlZEZlYXR1cmVTaXRlVGVzdDMvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4yXzUuMC4wLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL25lc3RlZEZlYXR1cmVTaXRlVGVzdDMvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4yXzUuMC4xLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL25lc3RlZEZlYXR1cmVTaXRlVGVzdDMvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4yXzUuMC4xLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTIyMDhmZS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QzL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMl81LjAuMS5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QzL3NpdGUueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0My9zaXRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY2OTZiYS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QzL3NpdGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHNpdGU+Ci0gIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvcm9vdGZlYXR1cmUuamFyIi8+Ci0gIAotICA8YXJjaGl2ZSBwYXRoPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5jaGlsZHJlbmZlYXR1cmVfMi4xLjAuamFyIiB1cmw9ImZlYXR1cmVzL2NoaWxkcmVuZmVhdHVyZS5qYXIiLz4gIAotPC9zaXRlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BhcnNlcnRlc3RzL2ZlYXR1cmUxLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BhcnNlcnRlc3RzL2ZlYXR1cmUxLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNkNzA4MC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wYXJzZXJ0ZXN0cy9mZWF0dXJlMS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgIGlkPSJvcmcuZWNsaXBzZS5wbGF0Zm9ybSIKLSAgIHZlcnNpb249IjIuMS4wIgotICAgbGFiZWw9IkVjbGlwc2UgUGxhdGZvcm0iCi0gICBwcm92aWRlci1uYW1lPSJ3d3cuZWNsaXBzZS5vcmciCi0gICBpbWFnZT0ic3BsYXNoL3NwbGFzaF9mdWxsLmJtcCIKLSAgID4KLQotCTxsaWNlbnNlPgotICAgIAkgbGljZW5zZQotCTwvbGljZW5zZT4KLQotICAgPGNvcHlyaWdodCB1cmw9Im5vdGljZS5odG1sIi8+Ci0gICB4Ci0JCi0gICA8bGljZW5zZSB1cmw9ImFib3V0Lmh0bWwiPgotICAgeAotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSB1cmw9ImZpbGU6L0Q6LyIgbGFiZWw9IkVjbGlwc2UgVXBkYXRlIFNpdGUiLz4KLSAgIDwvdXJsPgotCi08L2ZlYXR1cmU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGFyc2VydGVzdHMvZmVhdHVyZTFiaXMueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGFyc2VydGVzdHMvZmVhdHVyZTFiaXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODU1Zjk3Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BhcnNlcnRlc3RzL2ZlYXR1cmUxYmlzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgaWQ9Im9yZy5lY2xpcHNlLnBsYXRmb3JtIgotICAgdmVyc2lvbj0iMi4xLjAiCi0gICBsYWJlbD0iRWNsaXBzZSBQbGF0Zm9ybSIKLSAgIHByb3ZpZGVyLW5hbWU9Ind3dy5lY2xpcHNlLm9yZyIKLSAgIGltYWdlPSJzcGxhc2gvc3BsYXNoX2Z1bGwuYm1wIgotICAgPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICBFY2xpcHNlIHBsYXRmb3JtIGZlYXR1cmUuCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0IHVybD0ibm90aWNlLmh0bWwiLz4KLSAgIDxibGFoIC8+Ci0JCi0gICA8bGljZW5zZSB1cmw9ImFib3V0Lmh0bWwiPgotCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIHVybD0iZmlsZTovRDovIiBsYWJlbD0iRWNsaXBzZSBVcGRhdGUgU2l0ZSIvPgotICAgPC91cmw+Ci0KLTwvZmVhdHVyZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wYXJzZXJ0ZXN0cy9mZWF0dXJlMi54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wYXJzZXJ0ZXN0cy9mZWF0dXJlMi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljMmRmOWIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGFyc2VydGVzdHMvZmVhdHVyZTIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICBpZD0ib3JnLmVjbGlwc2UucGxhdGZvcm0iCi0gICB2ZXJzaW9uPSIyLjEuMCIKLSAgIGxhYmVsPSJFY2xpcHNlIFBsYXRmb3JtIgotICAgcHJvdmlkZXItbmFtZT0id3d3LmVjbGlwc2Uub3JnIgotICAgaW1hZ2U9InNwbGFzaC9zcGxhc2hfZnVsbC5ibXAiCi0gICBibGFoPSJibGFoIgotICAgPgotCi0gICA8ZGVzY3JpcHRpb24gYmxhaD0iYmxhaCI+Ci0gICBFY2xpcHNlIHBsYXRmb3JtIGZlYXR1cmUuCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0IHVybD0ibm90aWNlLmh0bWwiIGJsYWg9ImJsYWgiLz4KLQkKLSAgIDxsaWNlbnNlIHVybD0iYWJvdXQuaHRtbCIgYmxhaD0iYmxhaCI+Ci0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmwgYmxhaD0iYmxhaCI+Ci0gICAgICA8dXBkYXRlIHVybD0iZmlsZTovRDovIiBsYWJlbD0iRWNsaXBzZSBVcGRhdGUgU2l0ZSIgYmxhaD0iYmxhaCIvPgotICAgPC91cmw+Ci0KLTwvZmVhdHVyZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wYXJzZXJ0ZXN0cy9mZWF0dXJlMy54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wYXJzZXJ0ZXN0cy9mZWF0dXJlMy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhNjYwYmUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGFyc2VydGVzdHMvZmVhdHVyZTMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICBpZD0ib3JnLmVjbGlwc2UucGxhdGZvcm0iCi0gICB2ZXJzaW9uPSIyLjEuMCIKLSAgIGxhYmVsPSJFY2xpcHNlIFBsYXRmb3JtIgotICAgcHJvdmlkZXItbmFtZT0id3d3LmVjbGlwc2Uub3JnIgotICAgaW1hZ2U9InNwbGFzaC9zcGxhc2hfZnVsbC5ibXAiCi0gICA+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgIEVjbGlwc2UgcGxhdGZvcm0gZmVhdHVyZS4KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQgdXJsPSIkb3MkLyR3cyQvbm90aWNlLmh0bWwiLz4KLSAgIHgKLQkKLSAgIDxsaWNlbnNlIHVybD0iYWJvdXQuaHRtbCI+Ci0gICB4Ci0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIHVybD0iZmlsZTovRDovIiBsYWJlbD0iRWNsaXBzZSBVcGRhdGUgU2l0ZSIvPgotICAgPC91cmw+Ci0KLTwvZmVhdHVyZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wYXJzZXJ0ZXN0cy9mZWF0dXJlNC54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wYXJzZXJ0ZXN0cy9mZWF0dXJlNC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3MTg3YzkuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGFyc2VydGVzdHMvZmVhdHVyZTQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICBpZD0ib3JnLmVjbGlwc2UucGxhdGZvcm0iCi0gICB2ZXJzaW9uPSIyLjEuMCIKLSAgIGxhYmVsPSJFY2xpcHNlIFBsYXRmb3JtIgotICAgcHJvdmlkZXItbmFtZT0id3d3LmVjbGlwc2Uub3JnIgotICAgaW1hZ2U9InNwbGFzaC9zcGxhc2hfZnVsbC5ibXAiCi0gICA+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgIEVjbGlwc2UgcGxhdGZvcm0gZmVhdHVyZS4KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQgdXJsPSIkb3MkLyR3cyQvbm90aWNlLmh0bWwiLz4KLSAgIHgKLQkKLSAgIDxsaWNlbnNlIHVybD0iYWJvdXQuaHRtbCI+Ci0gICB4Ci0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIHVybD0iZmlsZTovRDovIiBsYWJlbD0iRWNsaXBzZSBVcGRhdGUgU2l0ZSIvPgotICAgICAgPGRpc2NvdmVyeSB1cmw9ImZpbGU6L2M6LyIgbGFiZWwgPSAiRGlzY292ZXJ5IiB0eXBlPSJ3ZWIiLz4KLSAgIDwvdXJsPgotCi08L2ZlYXR1cmU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGFyc2VydGVzdHMvcmVkZG90LnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BhcnNlcnRlc3RzL3JlZGRvdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzZjE3MDEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGFyc2VydGVzdHMvcmVkZG90LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/Pg0KLTxzaXRlIHVybD0iaW5mby9zaXRlSW5mby5odG1sIj4NCi08ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL3JlZGRvdF8xLjAuMC5qYXIiPiANCi08Y2F0ZWdvcnkgbmFtZT0icmVkZG90Ii8+DQotPC9mZWF0dXJlPg0KLTxmZWF0dXJlIHVybD0iZmVhdHVyZXMvcmVkZG90XzIuMS4wLmphciI+DQotPGNhdGVnb3J5IG5hbWU9InJlZGRvdCIvPg0KLTwvZmVhdHVyZT4NCi08YXJjaGl2ZSBwYXRoPSJjb20ucmVkZG90LnJlZG90XzEuMC4wIiB1cmw9InBsdWdpbnMvY29tLnJlZGRvdC5yZWRkb3RfMS4wLjAuamFyIi8+DQotPGFyY2hpdmUgcGF0aD0iY29tLnJlZGRvdC5yZWRvdF8yLjEuMCIgdXJsPSJwbHVnaW5zL2NvbS5yZWRkb3QucmVkZG90XzIuMS4wLmphciIvPg0KLTxjYXRlZ29yeS1kZWYgbGFiZWw9IlJlZCBEb3QgVmVyc2lvbnMiIG5hbWU9InJlZGRvdCI+DQotPGRlc2NyaXB0aW9uIHVybD0iUmVkRG90VmVyc2lvbnMuaHRtbCI+DQotVGhpcyBjYXRlZ29yeSBjb250YWlucyBhbGwgb2YgdGhlICZsdDtjdXJyZW50bHkmZ3Q7IGF2YWlsYWJsZSB2ZXJzaW9ucyBvZiBSZWQgRG90IGZlYXR1cmUuDQotPCFbQ0RBVEFbPGdyZWV0aW5nPkhlbGxvLCB3b3JsZCE8L2dyZWV0aW5nPl1dPg0KLTwvZGVzY3JpcHRpb24+DQotPC9jYXRlZ29yeS1kZWY+DQotPC9zaXRlPg0KLQ0KLQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BhcnNlcnRlc3RzL3JlZGRvdDEueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGFyc2VydGVzdHMvcmVkZG90MS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3NDQ5MGUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGFyc2VydGVzdHMvcmVkZG90MS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4NCi08c2l0ZSB1cmw9ImluZm8vc2l0ZUluZm8uaHRtbCI+DQotPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9yZWRkb3RfMS4wLjAuamFyIj4gDQotPGNhdGVnb3J5IG5hbWU9InJlZGRvdCIvPg0KLTwvZmVhdHVyZT4NCi08ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL3JlZGRvdF8yLjEuMC5qYXIiPg0KLTxjYXRlZ29yeSBuYW1lPSJyZWRkb3QiLz4NCi08L2ZlYXR1cmU+DQotPGFyY2hpdmUgcGF0aD0iY29tLnJlZGRvdC5yZWRvdF8xLjAuMCIgdXJsPSJwbHVnaW5zL2NvbS5yZWRkb3QucmVkZG90XzEuMC4wLmphciIvPg0KLTxhcmNoaXZlIHBhdGg9ImNvbS5yZWRkb3QucmVkb3RfMi4xLjAiIHVybD0icGx1Z2lucy9jb20ucmVkZG90LnJlZGRvdF8yLjEuMC5qYXIiLz4NCi08Y2F0ZWdvcnktZGVmIGxhYmVsPSJSZWQgRG90IFZlcnNpb25zIiBuYW1lPSJyZWRkb3QiPg0KLTxkZXNjcmlwdGlvbiB1cmw9IlJlZERvdFZlcnNpb25zLmh0bWwiPg0KLVRoaXMgY2F0ZWdvcnkgY29udGFpbnMgYWxsIG9mIHRoZSAmbHQ7Y3VycmVudGx5Jmd0OyBhdmFpbGFibGUgdmVyc2lvbnMgb2YgUmVkIERvdCBmZWF0dXJlLg0KLTwvZGVzY3JpcHRpb24+DQotPC9jYXRlZ29yeS1kZWY+DQotPC9zaXRlPg0KLQ0KLQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BhcnNlcnRlc3RzL3NpdGUucHJvcGVydGllcyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BhcnNlcnRlc3RzL3NpdGUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODAyOWM4ZS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wYXJzZXJ0ZXN0cy9zaXRlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotZHJpdmVycz1SZXF1aXJlZCBEcml2ZXJzDQotc2VjdXJpdHk9U2VjdXJpdHkgRml4ZXMNCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wYXJzZXJ0ZXN0cy9zaXRlLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BhcnNlcnRlc3RzL3NpdGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDBkODMxLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BhcnNlcnRlc3RzL3NpdGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08c2l0ZSBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMiIG5hbWU9IlRlc3RzIiB2ZXJzaW9uPSIwLjAuMSIgdHlwZT0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmlsZSI+DQotICA8aGFuZGxlcj4NCi0gIAk8Ym9vIGNsYXNzID0idW5rbm93biIvPg0KLSAgPC9oYW5kbGVyPg0KLSAgDQotICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLnRlc3QuZmVhdHVyZV8xLjAuMC5qYXIiPg0KLSAgICA8Y2F0ZWdvcnkgbmFtZT0iY2F0ZWdvcnkxIi8+DQotICA8L2ZlYXR1cmU+DQotICANCi0gIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvZmVhdHVyZXMyLmphciI+DQotICAgIDxjYXRlZ29yeSBuYW1lPSJjYXRlZ29yeTEvc3ViY2F0MSIvPg0KLSAgICA8Y2F0ZWdvcnkgbmFtZT0iY2F0ZWdvcnkyIi8+DQotICA8L2ZlYXR1cmU+DQotICANCi0gIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTFfMS4wLjQuamFyIj4NCi0gICAgPGNhdGVnb3J5IG5hbWU9ImNhdGVnb3J5MSIvPg0KLSAgICA8Y2F0ZWdvcnkgbmFtZT0iY2F0ZWdvcnkyIi8+DQotICAgIDxibGFoLz4NCi0gIDwvZmVhdHVyZT4NCi0gIA0KLSAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZV90ZXN0X2ZlYXR1cmUuamFyIi8+DQotICANCi0gIDxmZWF0dXJlIHVybD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmVhdHVyZTJfMS4wLjAvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmVhdHVyZTJfMi4yLjIuamFyIj4NCi0gICAgPGNhdGVnb3J5IG5hbWU9ImNhdGVnb3J5MSIvPg0KLSAgPC9mZWF0dXJlPg0KLSAgDQotICA8ZmVhdHVyZSB1cmw9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZlYXR1cmUyXzEuMC4wL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZlYXR1cmUyXzIuMi4yLmphciI+DQotICA8L2ZlYXR1cmU+DQotICANCi0gIDxhcmNoaXZlIHBhdGg9InBsdWdpbnMvaGVsbG8iID4NCi0gIAk8ZGVmYXVsdC8+DQotICA8L2FyY2hpdmU+DQotDQotICA8Y2F0ZWdvcnktZGVmIG5hbWU9ImNhdGVnb3J5MiIgbGFiZWw9IiVzZWN1cml0eSIvPg0KLSAgPGNhdGVnb3J5LWRlZiBuYW1lPSJjYXRlZ29yeTEvc3ViY2F0MSIgbGFiZWw9IlNwZWNpYWwgRml4Ii8+DQotICA8Y2F0ZWdvcnktZGVmIG5hbWU9ImNhdGVnb3J5MSIgbGFiZWw9IiVkcml2ZXJzIi8+ICANCi0NCi0NCi08L3NpdGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGFyc2VydGVzdHMvc2l0ZTEwLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BhcnNlcnRlc3RzL3NpdGUxMC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0MjY4MGQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGFyc2VydGVzdHMvc2l0ZTEwLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08c2l0ZSBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMiIG5hbWU9IlRlc3RzIiB2ZXJzaW9uPSIwLjAuMSIgdHlwZT0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmlsZSIgYmxhaD0iYmxhaCI+Ci0gIAotICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLnRlc3QuZmVhdHVyZV8xLjAuMC5qYXIiIGJsYWg9ImJsYWgiIGlkPSJvcmcuZWNsaXBzZS50ZXN0LmZlYXR1cmUiIHZlcnNpb249IjEuMC4wIi8+Ci0gIAotICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL2ZlYXR1cmVzMi5qYXIiIGlkPSJ1bmtud29uLmlkIiB2ZXJzaW9uPSJiYWQgdmVyc2lvbiIvPgotICAKLSAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMV8xLjAuNC5qYXIiIGlkPSJvbmx5LmlkIi8+Ci0gICAgCi0gIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2VfdGVzdF9mZWF0dXJlLmphciIgdmVyc2lvbj0iMS4wLjAiLz4KLSAgCi08L3NpdGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGFyc2VydGVzdHMvc2l0ZTIueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGFyc2VydGVzdHMvc2l0ZTIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDc1NTBlLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BhcnNlcnRlc3RzL3NpdGUyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxzaXRlPgotICA8ZmVhdHVyZSBpZD0iY29tLmlibS5qZHQiIHVybD0iaHR0cDovL3d3dy5ub3QtZWNsaXBzZS5vcmcvZmVhdHVyZTMiIHZlcnNpb249IjEuMC4wIi8+Ci08L3NpdGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGFyc2VydGVzdHMvc2l0ZTMueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGFyc2VydGVzdHMvc2l0ZTMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmJiNjgyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BhcnNlcnRlc3RzL3NpdGUzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxzaXRlPgotICA8ZmVhdHVyZSBpZD0iY29tLmlibS5qZHQiIHVybD0iZmVhdHVyZTMvZmVhdHVyZS5qYXIiIHZlcnNpb249IjEuMC4wIj4KLSAgICAgICAgPGNhdGVnb3J5IG5hbWU9InVua25vd24iLz4KLSAgPC9mZWF0dXJlPgotPC9zaXRlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BhcnNlcnRlc3RzL3NpdGU0LnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BhcnNlcnRlc3RzL3NpdGU0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFiN2QxNi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wYXJzZXJ0ZXN0cy9zaXRlNC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4KLTxzaXRlPgotICAgPGRlc2NyaXB0aW9uIHVybD0iaW5mby9zaXRlSW5mby5odG1sIi8+Ci0KLSAgPGNhdGVnb3J5LWRlZiBsYWJlbD0iUmVkIERvdCBWZXJzaW9ucyIgbmFtZT0icmVkZG90Ij4KLSAgICAgIDxkZXNjcmlwdGlvbiB1cmw9IlJlZERvdFZlcnNpb25zLmh0bWwiPgotICAgICAgICAgVGhpcyBjYXRlZ29yeSBjb250YWlucyBhbGwgb2YgdGhlIGN1cnJlbnRseSBhdmFpbGFibGUgdmVyc2lvbnMgb2YgUmVkIERvdCBmZWF0dXJlLgotICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgIDwvY2F0ZWdvcnktZGVmPgotICAgCi0gICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL2NvbS5yZWRkb3QucmVkZG90XzEuMC4wLmphciI+Ci0gICAgICA8Y2F0ZWdvcnkgbmFtZT0icmVkZG90Ii8+Ci0gICA8L2ZlYXR1cmU+Ci0KLSAgIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvY29tLnJlZGRvdC5yZWRkb3RfMi4xLjAuamFyIj4KLSAgICAgIDxjYXRlZ29yeSBuYW1lPSJyZWRkb3QiLz4KLSAgIDwvZmVhdHVyZT4KLQotIAotPC9zaXRlPiAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BhcnNlcnRlc3RzL3NpdGU3LnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BhcnNlcnRlc3RzL3NpdGU3LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5MGQ3MC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wYXJzZXJ0ZXN0cy9zaXRlNy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHNpdGUgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzIiBuYW1lPSJUZXN0cyIgdmVyc2lvbj0iMC4wLjEiIHR5cGU9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZpbGUiPgotICA8aGFuZGxlcj4KLSAgCTxib28gY2xhc3MgPSJ1bmtub3duIi8+Ci0gIDwvaGFuZGxlcj4KLSAgCi0gIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UudGVzdC5mZWF0dXJlXzEuMC4wLmphciI+Ci0gICAgPGNhdGVnb3J5IG5hbWU9ImNhdGVnb3J5MSIvPgotICA8L2ZlYXR1cmU+Ci0gIAotICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL2ZlYXR1cmVzMi5qYXIiPgotICAgIDxjYXRlZ29yeSBuYW1lPSJjYXRlZ29yeTEvc3ViY2F0MSIvPgotICAgIDxjYXRlZ29yeSBuYW1lPSJjYXRlZ29yeTIiLz4KLSAgPC9mZWF0dXJlPgotICAKLSAgPGJsYWgvPgotICAKLSAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMV8xLjAuNC5qYXIiPgotICAgIDxjYXRlZ29yeSBuYW1lPSJjYXRlZ29yeTEiLz4KLSAgICA8Y2F0ZWdvcnkgbmFtZT0iY2F0ZWdvcnkyIi8+Ci0gICAgPGJsYWgvPgotICA8L2ZlYXR1cmU+Ci0gIAotICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlX3Rlc3RfZmVhdHVyZS5qYXIiLz4KLSAgCi0gIDxmZWF0dXJlIHVybD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmVhdHVyZTJfMS4wLjAvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmVhdHVyZTJfMi4yLjIuamFyIj4KLSAgICA8Y2F0ZWdvcnkgbmFtZT0iY2F0ZWdvcnkxIi8+Ci0gIDwvZmVhdHVyZT4KLSAgCi0gIDxmZWF0dXJlIHVybD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmVhdHVyZTJfMS4wLjAvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmVhdHVyZTJfMi4yLjIuamFyIj4KLSAgPC9mZWF0dXJlPgotICAKLSAgPGFyY2hpdmUgcGF0aD0icGx1Z2lucy9oZWxsbyIgPgotICAJPGRlZmF1bHQvPgotICA8L2FyY2hpdmU+Ci0KLSAgPGNhdGVnb3J5LWRlZiBuYW1lPSJjYXRlZ29yeTIiIGxhYmVsPSIlc2VjdXJpdHkiLz4KLSAgPGNhdGVnb3J5LWRlZiBuYW1lPSJjYXRlZ29yeTEvc3ViY2F0MSIgbGFiZWw9IlNwZWNpYWwgRml4Ii8+Ci0gIDxjYXRlZ29yeS1kZWYgbmFtZT0iY2F0ZWdvcnkxIiBsYWJlbD0iJWRyaXZlcnMiLz4gIAotCi0KLTwvc2l0ZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wYXJzZXJ0ZXN0cy9zaXRlOC54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wYXJzZXJ0ZXN0cy9zaXRlOC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmY2JhYTEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGFyc2VydGVzdHMvc2l0ZTgueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxzaXRlIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cyIgbmFtZT0iVGVzdHMiIHZlcnNpb249IjAuMC4xIiB0eXBlPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5maWxlIj4KLSAgPGhhbmRsZXI+Ci0gIAk8Ym9vIGNsYXNzID0idW5rbm93biIvPgotICA8L2hhbmRsZXI+Ci0gIAotICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLnRlc3QuZmVhdHVyZV8xLjAuMC5qYXIiPgotICAgIDxjYXRlZ29yeSBuYW1lPSJjYXRlZ29yeTEiLz4KLSAgPC9mZWF0dXJlPgotICAKLSAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9mZWF0dXJlczIuamFyIj4KLSAgICA8Y2F0ZWdvcnkgbmFtZT0iY2F0ZWdvcnkxL3N1YmNhdDEiLz4KLSAgICA8Y2F0ZWdvcnkgbmFtZT0iY2F0ZWdvcnkyIi8+Ci0gIDwvZmVhdHVyZT4KLSAgeGN4Z2ZzZGZnc2RzZAotICAKLSAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMV8xLjAuNC5qYXIiPgotICAgIDxjYXRlZ29yeSBuYW1lPSJjYXRlZ29yeTEiLz4KLSAgICA8Y2F0ZWdvcnkgbmFtZT0iY2F0ZWdvcnkyIi8+Ci0gICAgPGJsYWgvPgotICA8L2ZlYXR1cmU+Ci0gIAotICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlX3Rlc3RfZmVhdHVyZS5qYXIiLz4KLSAgCi0gIDxmZWF0dXJlIHVybD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmVhdHVyZTJfMS4wLjAvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmVhdHVyZTJfMi4yLjIuamFyIj4KLSAgICA8Y2F0ZWdvcnkgbmFtZT0iY2F0ZWdvcnkxIi8+Ci0gIDwvZmVhdHVyZT4KLSAgCi0gIDxmZWF0dXJlIHVybD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmVhdHVyZTJfMS4wLjAvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmVhdHVyZTJfMi4yLjIuamFyIj4KLSAgPC9mZWF0dXJlPgotICAKLSAgPGFyY2hpdmUgcGF0aD0icGx1Z2lucy9oZWxsbyIgPgotICAJPGRlZmF1bHQvPgotICA8L2FyY2hpdmU+Ci0KLSAgPGNhdGVnb3J5LWRlZiBuYW1lPSJjYXRlZ29yeTIiIGxhYmVsPSIlc2VjdXJpdHkiLz4KLSAgPGNhdGVnb3J5LWRlZiBuYW1lPSJjYXRlZ29yeTEvc3ViY2F0MSIgbGFiZWw9IlNwZWNpYWwgRml4Ii8+Ci0gIDxjYXRlZ29yeS1kZWYgbmFtZT0iY2F0ZWdvcnkxIiBsYWJlbD0iJWRyaXZlcnMiLz4gIAotCi0KLTwvc2l0ZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wYXJzZXJ0ZXN0cy9zaXRlOS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wYXJzZXJ0ZXN0cy9zaXRlOS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzOGM1YTQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGFyc2VydGVzdHMvc2l0ZTkueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxzaXRlIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cyIgbmFtZT0iVGVzdHMiIHZlcnNpb249IjAuMC4xIiB0eXBlPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5maWxlIiBibGFoPSJibGFoIj4KLSAgPGhhbmRsZXIgYmxhaD0iYmxhaCI+Ci0gIAk8Ym9vIGNsYXNzID0idW5rbm93biIgYmxhaD0iYmxhaCIvPgotICA8L2hhbmRsZXI+Ci0gIAotICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLnRlc3QuZmVhdHVyZV8xLjAuMC5qYXIiIGJsYWg9ImJsYWgiPgotICAgIDxjYXRlZ29yeSBuYW1lPSJjYXRlZ29yeTEiIGJsYWg9ImJsYWgiIC8+Ci0gIDwvZmVhdHVyZT4KLSAgCi0gIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvZmVhdHVyZXMyLmphciI+Ci0gICAgPGNhdGVnb3J5IG5hbWU9ImNhdGVnb3J5MS9zdWJjYXQxIi8+Ci0gICAgPGNhdGVnb3J5IG5hbWU9ImNhdGVnb3J5MiIvPgotICA8L2ZlYXR1cmU+Ci0gIAotICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxXzEuMC40LmphciI+Ci0gICAgPGNhdGVnb3J5IG5hbWU9ImNhdGVnb3J5MSIvPgotICAgIDxjYXRlZ29yeSBuYW1lPSJjYXRlZ29yeTIiLz4KLSAgICA8YmxhaC8+Ci0gIDwvZmVhdHVyZT4KLSAgCi0gIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2VfdGVzdF9mZWF0dXJlLmphciIvPgotICAKLSAgPGZlYXR1cmUgdXJsPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5mZWF0dXJlMl8xLjAuMC9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5mZWF0dXJlMl8yLjIuMi5qYXIiPgotICAgIDxjYXRlZ29yeSBuYW1lPSJjYXRlZ29yeTEiLz4KLSAgPC9mZWF0dXJlPgotICAKLSAgPGZlYXR1cmUgdXJsPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5mZWF0dXJlMl8xLjAuMC9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5mZWF0dXJlMl8yLjIuMi5qYXIiPgotICA8L2ZlYXR1cmU+Ci0gIAotICA8YXJjaGl2ZSBwYXRoPSJwbHVnaW5zL2hlbGxvIiBibGFoPSJibGFoIj4KLSAgCTxkZWZhdWx0IGJsYWg9ImJsYWgiLz4KLSAgPC9hcmNoaXZlPgotCi0gIDxjYXRlZ29yeS1kZWYgbmFtZT0iY2F0ZWdvcnkyIiBsYWJlbD0iJXNlY3VyaXR5IiBibGFoPSJibGFoIi8+Ci0gIDxjYXRlZ29yeS1kZWYgbmFtZT0iY2F0ZWdvcnkxL3N1YmNhdDEiIGxhYmVsPSJTcGVjaWFsIEZpeCIgYmxhaD0iYmxhaCIvPgotICA8Y2F0ZWdvcnktZGVmIG5hbWU9ImNhdGVnb3J5MSIgbGFiZWw9IiVkcml2ZXJzIi8+ICAKLQotCi08L3NpdGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGFyc2VydGVzdHMvc2l0ZWZ0cC54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wYXJzZXJ0ZXN0cy9zaXRlZnRwLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg4M2VjMC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wYXJzZXJ0ZXN0cy9zaXRlZnRwLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxzaXRlIHR5cGU9Im9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlLmZ0cCI+Ci0gIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvZmVhdHVyZTMvZmVhdHVyZXMyLmphcmZpbGUiLz4KLTwvc2l0ZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvRmVhdHVyZVdpdGhJbnN0YWxsSGFuZGxlci8uY2xhc3NwYXRoIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL0ZlYXR1cmVXaXRoSW5zdGFsbEhhbmRsZXIvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhhY2IzOS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvRmVhdHVyZVdpdGhJbnN0YWxsSGFuZGxlci8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSIvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSIvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iL29yZy5lY2xpcHNlLnVpIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9GZWF0dXJlV2l0aEluc3RhbGxIYW5kbGVyLy5wcm9qZWN0IGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL0ZlYXR1cmVXaXRoSW5zdGFsbEhhbmRsZXIvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlYmM1MDUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL0ZlYXR1cmVXaXRoSW5zdGFsbEhhbmRsZXIvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5GZWF0dXJlV2l0aEluc3RhbGxIYW5kbGVyPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9GZWF0dXJlV2l0aEluc3RhbGxIYW5kbGVyL0ZlYXR1cmVXaXRoSW5zdGFsbEhhbmRsZXJfMS4wLjAuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL0ZlYXR1cmVXaXRoSW5zdGFsbEhhbmRsZXIvRmVhdHVyZVdpdGhJbnN0YWxsSGFuZGxlcl8xLjAuMC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5NWI3MjIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL0ZlYXR1cmVXaXRoSW5zdGFsbEhhbmRsZXIvRmVhdHVyZVdpdGhJbnN0YWxsSGFuZGxlcl8xLjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvRmVhdHVyZVdpdGhJbnN0YWxsSGFuZGxlci9iaW4vSGFuZGxlcldpdGhVSSQxLmNsYXNzIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL0ZlYXR1cmVXaXRoSW5zdGFsbEhhbmRsZXIvYmluL0hhbmRsZXJXaXRoVUkkMS5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTcyOTFiMC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvRmVhdHVyZVdpdGhJbnN0YWxsSGFuZGxlci9iaW4vSGFuZGxlcldpdGhVSSQxLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL0ZlYXR1cmVXaXRoSW5zdGFsbEhhbmRsZXIvYmluL0hhbmRsZXJXaXRoVUkuY2xhc3MgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvRmVhdHVyZVdpdGhJbnN0YWxsSGFuZGxlci9iaW4vSGFuZGxlcldpdGhVSS5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU4ZTg4MS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvRmVhdHVyZVdpdGhJbnN0YWxsSGFuZGxlci9iaW4vSGFuZGxlcldpdGhVSS5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9GZWF0dXJlV2l0aEluc3RhbGxIYW5kbGVyL2J1aWxkLnByb3BlcnRpZXMgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvRmVhdHVyZVdpdGhJbnN0YWxsSGFuZGxlci9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmI3Y2M1Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9GZWF0dXJlV2l0aEluc3RhbGxIYW5kbGVyL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zb3VyY2UuaGFuZGxlci5qYXIgPSBzcmMvLFwKLSAgICAgICAgICAgICAgICAgICAgIGJpbi8KLW91dHB1dC5oYW5kbGVyLmphciA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGhhbmRsZXIuamFyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvRmVhdHVyZVdpdGhJbnN0YWxsSGFuZGxlci9mZWF0dXJlLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9GZWF0dXJlV2l0aEluc3RhbGxIYW5kbGVyL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjkwZWE3Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9GZWF0dXJlV2l0aEluc3RhbGxIYW5kbGVyL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0iRmVhdHVyZVdpdGhJbnN0YWxsSGFuZGxlciIKLSAgICAgIGxhYmVsPSJGZWF0dXJlV2l0aEluc3RhbGxIYW5kbGVyIgotICAgICAgdmVyc2lvbj0iMS4wLjAiPgotCi0gICA8aW5zdGFsbC1oYW5kbGVyIGxpYnJhcnk9ImhhbmRsZXIuamFyIiBoYW5kbGVyPSJIYW5kbGVyV2l0aFVJIiAvPgotCi0gICA8ZGVzY3JpcHRpb24gdXJsPSJbRW50ZXIgRmVhdHVyZSBVUkwgaGVyZS5dIj4KLSAgICAgIFtFbnRlciBGZWF0dXJlIERlc2NyaXB0aW9uIGhlcmUuXQotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodCB1cmw9IltFbnRlciBDb3B5cmlnaHQgVVJMIGhlcmUuXSI+Ci0gICAgICBbRW50ZXIgQ29weXJpZ2h0IERlc2NyaXB0aW9uIGhlcmUuXQotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0iW0VudGVyIExpY2Vuc2UgVVJMIGhlcmUuXSI+Ci0gICAgICBbRW50ZXIgTGljZW5zZSBEZXNjcmlwdGlvbiBoZXJlLl0KLSAgIDwvbGljZW5zZT4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5hcGFjaGUubHVjZW5lIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjEuMy4wIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9GZWF0dXJlV2l0aEluc3RhbGxIYW5kbGVyL2hhbmRsZXIuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL0ZlYXR1cmVXaXRoSW5zdGFsbEhhbmRsZXIvaGFuZGxlci5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3YmMyNDQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL0ZlYXR1cmVXaXRoSW5zdGFsbEhhbmRsZXIvaGFuZGxlci5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvRmVhdHVyZVdpdGhJbnN0YWxsSGFuZGxlci9zcmMvSGFuZGxlcldpdGhVSS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL0ZlYXR1cmVXaXRoSW5zdGFsbEhhbmRsZXIvc3JjL0hhbmRsZXJXaXRoVUkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhkZmJjMC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvRmVhdHVyZVdpdGhJbnN0YWxsSGFuZGxlci9zcmMvSGFuZGxlcldpdGhVSS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci0vKgotICogQ3JlYXRlZCBvbiBPY3QgMSwgMjAwNAotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLQotLyoqCi0gKiBAYXV0aG9yIGJpcnNhbgotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcHVibGljIGNsYXNzIEhhbmRsZXJXaXRoVUkgaW1wbGVtZW50cyBJSW5zdGFsbEhhbmRsZXIgewotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUluc3RhbGxIYW5kbGVyI2NvbXBsZXRlQ29uZmlndXJlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb21wbGV0ZUNvbmZpZ3VyZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlTeXN0ZW0ub3V0LnByaW50bG4oImNvbXBsZXRlQ29uZmlndXJlKCkiKTsKLQotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JSW5zdGFsbEhhbmRsZXIjY29tcGxldGVJbnN0YWxsKG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklGZWF0dXJlQ29udGVudENvbnN1bWVyKQotCSAqLwotCXB1YmxpYyB2b2lkIGNvbXBsZXRlSW5zdGFsbChJRmVhdHVyZUNvbnRlbnRDb25zdW1lciBjb25zdW1lcikKLQkJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlTeXN0ZW0ub3V0LnByaW50bG4oImNvbXBsZXRlSW5zdGFsbCgpIik7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklJbnN0YWxsSGFuZGxlciNjb21wbGV0ZVVuY29uZmlndXJlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb21wbGV0ZVVuY29uZmlndXJlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiY29tcGxldGVJbnN0YWxsKCkiKTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUluc3RhbGxIYW5kbGVyI2NvbXBsZXRlVW5pbnN0YWxsKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb21wbGV0ZVVuaW5zdGFsbCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlTeXN0ZW0ub3V0LnByaW50bG4oImNvbXBsZXRlVW5pbnN0YWxsKCkiKTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUluc3RhbGxIYW5kbGVyI2NvbmZpZ3VyZUNvbXBsZXRlZChib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIGNvbmZpZ3VyZUNvbXBsZXRlZChib29sZWFuIHN1Y2Nlc3MpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlTeXN0ZW0ub3V0LnByaW50bG4oImNvbmZpZ3VyZUNvbXBsZXRlZCgpIik7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklJbnN0YWxsSGFuZGxlciNjb25maWd1cmVJbml0aWF0ZWQoKQotCSAqLwotCXB1YmxpYyB2b2lkIGNvbmZpZ3VyZUluaXRpYXRlZCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlTeXN0ZW0ub3V0LnByaW50bG4oImNvbmZpZ3VyZUluaXRpYXRlZCgpIik7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklJbnN0YWxsSGFuZGxlciNpbml0aWFsaXplKGludCwgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUZlYXR1cmUsIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklJbnN0YWxsSGFuZGxlckVudHJ5LCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JbnN0YWxsTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKGludCB0eXBlLCBJRmVhdHVyZSBmZWF0dXJlLAotCQkJSUluc3RhbGxIYW5kbGVyRW50cnkgZW50cnksIEluc3RhbGxNb25pdG9yIG1vbml0b3IpCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJU3lzdGVtLm91dC5wcmludGxuKCJpbml0aWFsaXplKCkiKTsKLQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKCBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJTWVzc2FnZURpYWxvZy5vcGVuSW5mb3JtYXRpb24oRGlzcGxheS5nZXREZWZhdWx0KCkuZ2V0QWN0aXZlU2hlbGwoKSwgIkluc3RhbGxIYW5kbGVyIiwgIlRoaXMgaXMgYSBkdW1teSBtZXNzYWdlIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JSW5zdGFsbEhhbmRsZXIjaW5zdGFsbENvbXBsZXRlZChib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIGluc3RhbGxDb21wbGV0ZWQoYm9vbGVhbiBzdWNjZXNzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJU3lzdGVtLm91dC5wcmludGxuKCJpbnN0YWxsQ29tcGxldGVkKCkiKTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUluc3RhbGxIYW5kbGVyI2luc3RhbGxJbml0aWF0ZWQoKQotCSAqLwotCXB1YmxpYyB2b2lkIGluc3RhbGxJbml0aWF0ZWQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJU3lzdGVtLm91dC5wcmludGxuKCJpbnN0YWxsSW5pdGlhdGVkKCkiKTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUluc3RhbGxIYW5kbGVyI25vblBsdWdpbkRhdGFEb3dubG9hZGVkKG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklOb25QbHVnaW5FbnRyeVtdLCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JVmVyaWZpY2F0aW9uTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgbm9uUGx1Z2luRGF0YURvd25sb2FkZWQoSU5vblBsdWdpbkVudHJ5W10gbm9uUGx1Z2luRGF0YSwKLQkJCUlWZXJpZmljYXRpb25MaXN0ZW5lciBsaXN0ZW5lcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCVN5c3RlbS5vdXQucHJpbnRsbigibm9uUGx1Z2luRGF0YURvd25sb2FkZWQoKSIpOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JSW5zdGFsbEhhbmRsZXIjcGx1Z2luc0Rvd25sb2FkZWQob3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSVBsdWdpbkVudHJ5W10pCi0JICovCi0JcHVibGljIHZvaWQgcGx1Z2luc0Rvd25sb2FkZWQoSVBsdWdpbkVudHJ5W10gcGx1Z2lucykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCVN5c3RlbS5vdXQucHJpbnRsbigicGx1Z2luc0Rvd25sb2FkZWQoKSIpOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JSW5zdGFsbEhhbmRsZXIjdW5jb25maWd1cmVDb21wbGV0ZWQoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmNvbmZpZ3VyZUNvbXBsZXRlZChib29sZWFuIHN1Y2Nlc3MpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlTeXN0ZW0ub3V0LnByaW50bG4oInVuY29uZmlndXJlQ29tcGxldGVkKCkiKTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUluc3RhbGxIYW5kbGVyI3VuY29uZmlndXJlSW5pdGlhdGVkKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmNvbmZpZ3VyZUluaXRpYXRlZCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlTeXN0ZW0ub3V0LnByaW50bG4oInVuY29uZmlndXJlSW5pdGlhdGVkKCkiKTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUluc3RhbGxIYW5kbGVyI3VuaW5zdGFsbENvbXBsZXRlZChib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHVuaW5zdGFsbENvbXBsZXRlZChib29sZWFuIHN1Y2Nlc3MpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlTeXN0ZW0ub3V0LnByaW50bG4oInVuaW5zdGFsbENvbXBsZXRlZCgpIik7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklJbnN0YWxsSGFuZGxlciN1bmluc3RhbGxJbml0aWF0ZWQoKQotCSAqLwotCXB1YmxpYyB2b2lkIHVuaW5zdGFsbEluaXRpYXRlZCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlTeXN0ZW0ub3V0LnByaW50bG4oInVuaW5zdGFsbEluaXRpYXRlZCgpIik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5kb2NfMi4wLjAvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLmRvY18yLjAuMC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk0OTliYy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLmRvY18yLjAuMC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuZG9jXzIuMC4wL2NwbC12MTAuaHRtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuZG9jXzIuMC4wL2NwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU0MTZjMS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLmRvY18yLjAuMC9jcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNjYgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iSFRNTCBUaWR5LCBzZWUgd3d3LnczLm9yZyIgLz4KLTx0aXRsZT5Db21tb24gUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiCi1jb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSIgLz4KLTwvaGVhZD4KLTxib2R5IGJnY29sb3I9IiNGRkZGRkYiIHZsaW5rPSIjODAwMDAwIj4KLTxwIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsgdGV4dC1hbGlnbjogY2VudGVyIj5Db21tb24gUHVibGljCi1MaWNlbnNlIC0gdiAxLjA8L3A+Ci0KLTxwPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUiBUSEUgVEVSTVMgT0YgVEhJUwotQ09NTU9OIFBVQkxJQyBMSUNFTlNFICgiQUdSRUVNRU5UIikuIEFOWSBVU0UsIFJFUFJPRFVDVElPTiBPUgotRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UgT0YKLVRISVMgQUdSRUVNRU5ULjwvcD4KLQotPHAgc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkIj4xLiBERUZJTklUSU9OUzwvcD4KLQotPHA+IkNvbnRyaWJ1dGlvbiIgbWVhbnM6PC9wPgotCi08ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogMmVtIj5hKSBpbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbAotQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24gZGlzdHJpYnV0ZWQgdW5kZXIKLXRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9IkxFRlQiIC8+Ci1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9kaXY+Ci0KLTxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OiAyZW0iPmkpIGNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvZGl2PgotCi08ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogMmVtIj5paSkgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvZGl2PgotCi08ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogMmVtIj53aGVyZSBzdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucwotdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZCBieSB0aGF0Ci1wYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhCi1Db250cmlidXRvciBpZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvcgotaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24gc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucwotZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlCi1tb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIFByb2dyYW0KLXVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCi13b3JrcyBvZiB0aGUgUHJvZ3JhbS48L2Rpdj4KLQotPHA+IkNvbnRyaWJ1dG9yIiBtZWFucyBhbnkgcGVyc29uIG9yIGVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZQotUHJvZ3JhbS48L3A+Ci0KLTxwPiJMaWNlbnNlZCBQYXRlbnRzICIgbWVhbiBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUgYnkgYQotQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlIG9yIHNhbGUgb2YKLWl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLjwvcD4KLQotPHA+IlByb2dyYW0iIG1lYW5zIHRoZSBDb250cmlidXRpb25zIGRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aAotdGhpcyBBZ3JlZW1lbnQuPC9wPgotCi08cD4iUmVjaXBpZW50IiBtZWFucyBhbnlvbmUgd2hvIHJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMKLUFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9wPgotCi08cCBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQiPjIuIEdSQU5UIE9GIFJJR0hUUzwvcD4KLQotPGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDJlbSI+YSkgU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcwotQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50IGEKLW5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvCi1yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkKLXBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCi1Db250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQKLW9iamVjdCBjb2RlIGZvcm0uPC9kaXY+Ci0KLTxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OiAyZW0iPmIpIFN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMKLUFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudCBhCi1ub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBwYXRlbnQgbGljZW5zZSB1bmRlcgotTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydCBhbmQKLW90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4KLXNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5Ci10byB0aGUgY29tYmluYXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZQotdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkIGJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZgotdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbiB0byBiZSBjb3ZlcmVkIGJ5IHRoZQotTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0byBhbnkgb3RoZXIKLWNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcwotbGljZW5zZWQgaGVyZXVuZGVyLjwvZGl2PgotCi08ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogMmVtIj5jKSBSZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdAotYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cyBDb250cmlidXRpb25zCi1zZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IKLXRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkKLWxpYWJpbGl0eSB0byBSZWNpcGllbnQgZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQKLW9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYQotY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQgbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsCi1lYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5IHRvIHNlY3VyZSBhbnkKLW90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLCBpZgotYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8KLWRpc3RyaWJ1dGUgdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUKLXRoYXQgbGljZW5zZSBiZWZvcmUgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvZGl2PgotCi08ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogMmVtIj5kKSBFYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdAotdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQgcmlnaHRzIGluIGl0cwotQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KLXRoaXMgQWdyZWVtZW50LjwvZGl2PgotCi08cCBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQiPjMuIFJFUVVJUkVNRU5UUzwvcD4KLQotPHA+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaW4gb2JqZWN0Ci1jb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3A+Ci0KLTxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OiAyZW0iPmEpIGl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZAotY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9kaXY+Ci0KLTxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OiAyZW0iPmIpIGl0cyBsaWNlbnNlIGFncmVlbWVudDo8L2Rpdj4KLQotPGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDJlbSI+aSkgZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZgotYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQgY29uZGl0aW9ucywgZXhwcmVzcyBhbmQKLWltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUgYW5kCi1ub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YKLW1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7PC9kaXY+Ci0KLTxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OiAyZW0iPmlpKSBlZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YKLWFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGRpcmVjdCwKLWluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2ggYXMKLWxvc3QgcHJvZml0czs8L2Rpdj4KLQotPGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDJlbSI+aWlpKSBzdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaAotZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdCBDb250cmlidXRvciBhbG9uZQotYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvZGl2PgotCi08ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogMmVtIj5pdikgc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZQotUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQgaW5mb3JtcyBsaWNlbnNlZXMKLWhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEgbWVkaXVtCi1jdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48L2Rpdj4KLQotPHA+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UgY29kZSBmb3JtOjwvcD4KLQotPGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDJlbSI+YSkgaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlcgotdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvZGl2PgotCi08ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogMmVtIj5iKSBhIGNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZQotaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uPC9kaXY+Ci0KLTxwPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkgY29weXJpZ2h0IG5vdGljZXMKLWNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uPC9wPgotCi08cD5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZSBvcmlnaW5hdG9yIG9mIGl0cwotQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3Mgc3Vic2VxdWVudAotUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLjwvcD4KLQotPHAgc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkIj40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvcD4KLQotPHA+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5IGFjY2VwdCBjZXJ0YWluCi1yZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzIGFuZAotdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZQotY29tbWVyY2lhbCB1c2Ugb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lcgotd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbCBsaWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4KLVRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKLXByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCJDb21tZXJjaWFsIENvbnRyaWJ1dG9yIikKLWhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIgQ29udHJpYnV0b3IKLSgiSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IiKSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kIGNvc3RzCi0oY29sbGVjdGl2ZWx5ICJMb3NzZXMiKSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKLWxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkCi1Db250cmlidXRvciB0byB0aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaAotQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiBjb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzCi1zZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcyByZWxhdGluZyB0byBhbnkgYWN0dWFsCi1vciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyIHRvIHF1YWxpZnksCi1hbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciB0byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQgYW55IHJlbGF0ZWQgc2V0dGxlbWVudAotbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlIGluIGFueQotc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9wPgotCi08cD5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZSBQcm9ncmFtIGluIGEKLWNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQotQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMKLXBlcmZvcm1hbmNlIGNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsCi10aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbAotQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcyBzZWN0aW9uLCB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCi1vdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCi13YXJyYW50aWVzLCBhbmQgaWYgYSBjb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5Ci1hbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UKLWRhbWFnZXMuPC9wPgotCi08cCBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQiPjUuIE5PIFdBUlJBTlRZPC9wPgotCi08cD5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMKLVBST1ZJREVEIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GCi1BTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwKLUFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCi1NRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50Ci1pcyBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcKLWFuZCBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aAotaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGJ1dCBub3QKLWxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywgY29tcGxpYW5jZSB3aXRoCi1hcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yIGVxdWlwbWVudCwKLWFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy48L3A+Ci0KLTxwIHN0eWxlPSJmb250LXdlaWdodDogYm9sZCI+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3A+Ci0KLTxwPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBORUlUSEVSCi1SRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUiBBTlkKLURJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotREFNQUdFUyAoSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRAotQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKLUxJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCi1BTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBPUiBUSEUKLUVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKLVBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3A+Ci0KLTxwIHN0eWxlPSJmb250LXdlaWdodDogYm9sZCI+Ny4gR0VORVJBTDwvcD4KLQotPHA+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUKLXVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgotZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZAotd2l0aG91dCBmdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsCi1iZSByZWZvcm1lZCB0byB0aGUgbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24KLXZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3A+Ci0KLTxwPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYSBDb250cmlidXRvcgotd2l0aCByZXNwZWN0IHRvIGEgcGF0ZW50IGFwcGxpY2FibGUgdG8gc29mdHdhcmUgKGluY2x1ZGluZyBhCi1jcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCi1ncmFudGVkIGJ5IHRoYXQgQ29udHJpYnV0b3IgdG8gc3VjaCBSZWNpcGllbnQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKLXNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIEluCi1hZGRpdGlvbiwgaWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkKLWVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKLWFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZQotUHJvZ3JhbSB3aXRoIG90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncwotcGF0ZW50KHMpLCB0aGVuIHN1Y2ggUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpCi1zaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLjwvcD4KLQotPHA+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCBzaGFsbCB0ZXJtaW5hdGUgaWYKLWl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IgY29uZGl0aW9ucyBvZgotdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZQotcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwKLVJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMKLXRvIGNlYXNlIHVzZSBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseQotcHJhY3RpY2FibGUuIEhvd2V2ZXIsIFJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1hbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkgUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsCi1jb250aW51ZSBhbmQgc3Vydml2ZS48L3A+Ci0KLTxwPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGlzCi1BZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKLWNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlCi1BZ3JlZW1lbnQgU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMKLShpbmNsdWRpbmcgcmV2aXNpb25zKSBvZiB0aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lCi1vdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMgdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzCi1BZ3JlZW1lbnQuIElCTSBpcyB0aGUgaW5pdGlhbCBBZ3JlZW1lbnQgU3Rld2FyZC4gSUJNIG1heSBhc3NpZ24gdGhlCi1yZXNwb25zaWJpbGl0eSB0byBzZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZQotc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhCi1kaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0gKGluY2x1ZGluZwotQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3Ci12ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8KLWRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldwotdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQgaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKQotYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8gdGhlIGludGVsbGVjdHVhbAotcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCi1leHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlCi1Qcm9ncmFtIG5vdCBleHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUKLXJlc2VydmVkLjwvcD4KLQotPHA+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlIFN0YXRlIG9mIE5ldyBZb3JrCi1hbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EuCi1ObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKLUFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaAotcGFydHkgd2FpdmVzIGl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcKLWxpdGlnYXRpb24uPC9wPgotPC9ib2R5PgotPC9odG1sPgotCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLmRvY18yLjAuMC9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5kb2NfMi4wLjAvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhlM2UwMi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLmRvY18yLjAuMC9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5kb2NfMi4wLjAvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5kb2NfMi4wLjAvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGQyMjI0Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuZG9jXzIuMC4wL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIC8qKgotIyAgKiA8Y29weXJpZ2h0PgotIyAgKgotIyAgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0jICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jICAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0jICAqIAotIyAgKiBDb250cmlidXRvcnM6IAotIyAgKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyAgKgotIyAgKiA8L2NvcHlyaWdodD4KLSMgICoKLSMgICogJElkOiBmZWF0dXJlLnByb3BlcnRpZXMsdiAxLjEgMjAwNC8xMC8xOCAxNTo1MDo0MiBkYmlyc2FuIEV4cCAkCi0jICAqLwotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBEbyBub3QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUgbGFzdCBsaW5lIGNvbnRhaW5pbmc6Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBJbnN0ZWFkLCBlaXRoZXIgcmVkZWZpbmUgYW4gZXhpc3RpbmcgcHJvcGVydHksIG9yIGNyZWF0ZSBhIG5ldyBwcm9wZXJ0eSwKLSMgYXBwZW5kIGl0IHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUsIGFuZCBjaGFuZ2UgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgbmFtZS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgVGhpcyBmaWxlIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1FY2xpcHNlIE1vZGVsaW5nIEZyYW1ld29yayAoRU1GKSBEb2N1bWVudGF0aW9uCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1FY2xpcHNlLm9yZyB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249RWNsaXBzZSBNb2RlbGluZyBGcmFtZXdvcmsuIChkb2N1bWVudGF0aW9uKQotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFLk9SRyBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotMTR0aCBBdWd1c3QsIDIwMDNcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1FQ0xJUFNFLk9SRyBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSBFY2xpcHNlLm9yZ1xuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQ29tbW9uIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkNQTCIpLiBBIGNvcHkgb2YgdGhlIENQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBDUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLUNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50c1xuXAotKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS4gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvclxuXAotbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlXG5cCi1QbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCBhIEZlYXR1cmUuIFBsdWctaW5zIGFuZCBGcmFnbWVudHNcblwKLWFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIG5hbWVkICJwbHVnaW5zIiBhbmQgRmVhdHVyZXMgYXJlIGxvY2F0ZWQgaW5cblwKLWRpcmVjdG9yaWVzIG5hbWVkICJmZWF0dXJlcyIuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gU3ViZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IEVjbGlwc2Uub3JnIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIENQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IEVjbGlwc2Uub3JnIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgVGhlIGFib3ZlIHByb3BlcnRpZXMgaGF2ZSBiZWVuIHNoaXBwZWQgZm9yIHRyYW5zbGF0aW9uLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuZG9jXzIuMC4wL2ZlYXR1cmUueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5kb2NfMi4wLjAvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5MzYzZTcuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5kb2NfMi4wLjAvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogZmVhdHVyZS54bWwsdiAxLjEgMjAwNC8wMy8wNiAxNzozMTozMSBtYXJjZWxvcCBFeHAgJAotICovCi0tLT4KLQotPGZlYXR1cmUKLQlpZD0ib3JnLmVjbGlwc2UuZW1mLmRvYyIKLSAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgIHZlcnNpb249IjIuMC4wIgotICAgIGltYWdlPSAiZWNsaXBzZV91cGRhdGVfMTIwLmpwZyIKLSAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KLQotCTxkZXNjcmlwdGlvbj4KLSAgICAJJWRlc2NyaXB0aW9uCi0JPC9kZXNjcmlwdGlvbj4KLQotICAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotCQklbGljZW5zZQotCTwvbGljZW5zZT4KLQotCTx1cmw+Ci0JCTx1cGRhdGUgdXJsPSJodHRwOi8vdXBkYXRlLmVjbGlwc2Uub3JnL3VwZGF0ZXMiIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiLz4KLQk8L3VybD4KLQotCTxwbHVnaW4KLQkJaWQ9Im9yZy5lY2xpcHNlLmVtZi5kb2MiCi0gICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgIGluc3RhbGwtc2l6ZT0iMCIgICAJCQotCQl2ZXJzaW9uPSIyLjAuMCIvPgotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5kb2NfMi4wLjAvbGljZW5zZS5odG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5kb2NfMi4wLjAvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2E1ZTE4Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuZG9jXzIuMC4wL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJIVE1MIFRpZHksIHNlZSB3d3cudzMub3JnIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIgotY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiIC8+Ci08dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9ImJsdWUiIHZsaW5rPSJwdXJwbGUiPgotPGgyPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLQotPHA+MTR0aCBBdWd1c3QsIDIwMDM8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+RUNMSVBTRS5PUkcgTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTgotQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWQotIkNPTlRFTlQiKS4gVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQKLUNPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRgotTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZCi1VU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMKLUdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZCi1BUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VECi1CRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUwotQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRQotQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkKLU5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+Ci0KLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieQotRWNsaXBzZS5vcmcgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoIkNQTCIpLiBBIGNvcHkgb2YgdGhlIENQTCBpcwotcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhCi1ocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBDUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QKLWNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnCi1DVlMgcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZQotYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLjwvcD4KLQotPHA+Q29udGVudCBtYXkgYmUgYXBwb3J0aW9uZWQgaW50byBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4KLWZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLiBBIEZlYXR1cmUgaXMgYQotYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQKLW1hdGVyaWFsLiBGaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMKLWFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZAotd2l0aCBhIEZlYXR1cmUuIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMKLW5hbWVkICJwbHVnaW5zIiBhbmQgRmVhdHVyZXMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgbmFtZWQKLSJmZWF0dXJlcyIuPC9wPgotCi08cD5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4KLUZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQKLXZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L3A+Ci0KLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQKLWJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZQotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLgotQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYQotRG93bmxvYWQgb3IgTW9kdWxlIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcKLWxvY2F0aW9uczo8L3A+Ci0KLTx1bD4KLTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotCi08bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotCi08bGk+U3ViZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluCi1QbHVnLWluczwvbGk+Ci0KLTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+Ci0KLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSBFY2xpcHNlLm9yZyBpcyBpbnN0YWxsZWQKLXVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UKLSgiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZQotRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UKLXNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nCi10aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLgotRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YKLWZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcyBhbmQKLUZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvcgotcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZgotdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS48L3A+Ci0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWQotUkVGRVIgVE8gVEhFIENQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5ECi1DT05ESVRJT05TLiBTT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUCi1BUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KLQotPHVsPgotPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhCi1ocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0KLTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEKLWhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj4KLWh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgotCi08bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEKLWhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj4KLWh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotCi08bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhCi1ocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLTwvdWw+Ci0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5ECi1DT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUKLUxpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QKLUVjbGlwc2Uub3JnIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0Ci1wYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaAoteW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sCi1hbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbgotc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZQotY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi1wb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmCi10aGlzIGlzIHBlcm1pdHRlZC48L3A+Ci08L2JvZHk+Ci08L2h0bWw+Ci0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLmRvY18yLjAuMC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLmRvY18yLjAuMC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk0OTliYy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby5kb2NfMi4wLjAvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby5kb2NfMi4wLjAvY3BsLXYxMC5odG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uZG9jXzIuMC4wL2NwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZhYTIwOC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby5kb2NfMi4wLjAvY3BsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotPEhFQUQ+Ci08VElUTEU+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L1RJVExFPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IiNGRkZGRkYiIFZMSU5LPSIjODAwMDAwIj4KLQotCi08UCBBTElHTj0iQ0VOVEVSIj48Qj5Db21tb24gUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvQj4KLTxQPjxCPjwvQj48Rk9OVCBTSVpFPSIzIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIzIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSIFRIRSBURVJNUyBPRiBUSElTIENPTU1PTiBQVUJMSUMgTElDRU5TRSAoIkFHUkVFTUVOVCIpLiAgQU5ZIFVTRSwgUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFIE9GIFRISVMgQUdSRUVNRU5ULjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjxCPjEuICBERUZJTklUSU9OUzwvQj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj4iQ29udHJpYnV0aW9uIiBtZWFuczo8L0ZPTlQ+Ci0KLTxVTD48Rk9OVCBTSVpFPSIyIj5hKSBpbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbiBkaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPEJSIENMRUFSPSJMRUZUIj4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+aSkJIAljaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+aWkpCQlhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPndoZXJlIHN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQgYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPkEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IgaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24gc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5Db250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSB3aGljaDogIChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBQcm9ncmFtLiAgPC9GT05UPjwvVUw+Ci0KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPiJDb250cmlidXRvciIgbWVhbnMgYW55IHBlcnNvbiBvciBlbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+IkxpY2Vuc2VkIFBhdGVudHMgIiBtZWFuIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZSBvciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiAgPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj4iUHJvZ3JhbSIgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMgZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50LjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPiJSZWNpcGllbnQiIG1lYW5zIGFueW9uZSB3aG8gcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjxCPjwvQj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48Qj4yLiAgR1JBTlQgT0YgUklHSFRTPC9CPjwvRk9OVD4KLQotPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5hKQk8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+U3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50czwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiNGRjAwMDAiPiA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPmIpIAlTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDA4MDAwIj4gPC9GT05UPjxGT05UIFNJWkU9IjIiPnJveWFsdHktZnJlZSBwYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0IGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiAgVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQgYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24gdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8gYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uICBObyBoYXJkd2FyZSBwZXIgc2UgaXMgbGljZW5zZWQgaGVyZXVuZGVyLiAgIDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+YykJUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cyBDb250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvciB0aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiAgRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQgZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiAgQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZCBsaWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eSB0byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuICBGb3IgZXhhbXBsZSwgaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmQpCUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0IHJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4gdGhpcyBBZ3JlZW1lbnQuIDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KLQotPFA+PEZPTlQgU0laRT0iMiI+PEI+My4gIFJFUVVJUkVNRU5UUzwvQj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48Qj48L0I+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0OjwvRk9OVD4KLQotPFVMPjxGT05UIFNJWkU9IjIiPmEpCWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+YikJaXRzIGxpY2Vuc2UgYWdyZWVtZW50OjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5pKQllZmZlY3RpdmVseSBkaXNjbGFpbXM8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZCBjb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlIGFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmlpKSAJZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaCBhcyBsb3N0IHByb2ZpdHM7IDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5paWkpPC9GT05UPjxGT05UIFNJWkU9IjIiPglzdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0IENvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+aXYpCXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQgaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDAwMEZGIj4gPC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjRkYwMDAwIj48L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiNGRjAwMDAiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KLQotPFA+PEZPTlQgU0laRT0iMiI+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UgY29kZSBmb3JtOjwvRk9OVD4KLQotPFVMPjxGT05UIFNJWkU9IjIiPmEpCWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+YikJYSBjb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uICA8L0ZPTlQ+PC9VTD4KLQotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDAwMEZGIj48U1RSSUtFPjwvU1RSSUtFPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDAwMEZGIj48U1RSSUtFPjwvU1RSSUtFPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55IGNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uICA8L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZSBvcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cyBzdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gIDwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjxCPjQuICBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvQj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkgYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycyBhbmQgdGhlIGxpa2UuICBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2Ugb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwgbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuICAgVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgiQ29tbWVyY2lhbCBDb250cmlidXRvciIpIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIgQ29udHJpYnV0b3IgKCJJbmRlbW5pZmllZCBDb250cmlidXRvciIpIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQgY29zdHMgKGNvbGxlY3RpdmVseSAiTG9zc2VzIikgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyIGxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvIHRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4gY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcuICBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcyByZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gIEluIG9yZGVyIHRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB0byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZCBhbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUgaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhIENvbW1lcmNpYWwgQ29udHJpYnV0b3IuICBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZSBjbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiAgVW5kZXIgdGhpcyBzZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUgb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYSBjb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iIzAwMDBGRiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDAwRkYiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48Qj41LiAgTk8gV0FSUkFOVFk8L0I+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzPC9GT05UPjxGT05UIFNJWkU9IjIiPiBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+dGhlIFByb2dyYW08L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudDwvRk9OVD48Rk9OVCBTSVpFPSIyIj4sIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywgY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgPC9GT05UPjxGT05UIFNJWkU9IjIiPnByb2dyYW1zIG9yIGVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zPC9GT05UPjxGT05UIFNJWkU9IjIiPi4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PEI+Ni4gIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9CPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgPC9GT05UPjxGT05UIFNJWkU9IjIiPihJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksPC9GT05UPjxGT05UIFNJWkU9IjIiPiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjxCPjcuICBHRU5FUkFMPC9CPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0IGZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlIG1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGEgQ29udHJpYnV0b3Igd2l0aCByZXNwZWN0IHRvIGEgcGF0ZW50IGFwcGxpY2FibGUgdG8gc29mdHdhcmUgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpLCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMgZ3JhbnRlZCBieSB0aGF0IENvbnRyaWJ1dG9yIHRvIHN1Y2ggUmVjaXBpZW50IHVuZGVyIHRoaXMgQWdyZWVtZW50IHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuICBJbiBhZGRpdGlvbiwgaWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoIG90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaCBSZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlIHBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gIElmIGFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gIEhvd2V2ZXIsIFJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieSBSZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcyBjb3B5cmlnaHRlZCAgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50IFN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5wdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YgdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj50aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzIHRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIElCTSBpcyB0aGUgaW5pdGlhbCBBZ3JlZW1lbnQgU3Rld2FyZC4gICBJQk0gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8gc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPkVhY2ggbmV3IHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBUaGUgUHJvZ3JhbSAoaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgPC9GT05UPjxGT05UIFNJWkU9IjIiPnZlcnNpb24uICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+RXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQgaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0byB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlciBleHByZXNzbHksIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5ieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlPC9GT05UPjxGT05UIFNJWkU9IjIiPi48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+ICBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdCBleHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlIFN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzIEFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gIEVhY2ggcGFydHkgd2FpdmVzIGl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotCi08L0JPRFk+Ci0KLTwvSFRNTD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby5kb2NfMi4wLjAvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLmRvY18yLjAuMC9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTRkNjM5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLmRvY18yLjAuMC9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uZG9jXzIuMC4wL2ZlYXR1cmUucHJvcGVydGllcyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLmRvY18yLjAuMC9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkYTdkMWQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uZG9jXzIuMC4wL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIC8qKgotIyAgKiA8Y29weXJpZ2h0PgotIyAgKgotIyAgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0jICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jICAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0jICAqIAotIyAgKiBDb250cmlidXRvcnM6IAotIyAgKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyAgKgotIyAgKiA8L2NvcHlyaWdodD4KLSMgICoKLSMgICogJElkOiBmZWF0dXJlLnByb3BlcnRpZXMsdiAxLjEgMjAwNC8xMC8xOCAxNTo1MDo0MiBkYmlyc2FuIEV4cCAkIAotIyAgKi8KLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgRG8gbm90IGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlIGxhc3QgbGluZSBjb250YWluaW5nOgotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgSW5zdGVhZCwgZWl0aGVyIHJlZGVmaW5lIGFuIGV4aXN0aW5nIHByb3BlcnR5LCBvciBjcmVhdGUgYSBuZXcgcHJvcGVydHksCi0jIGFwcGVuZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLCBhbmQgY2hhbmdlIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IG5hbWUuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jIFRoaXMgZmlsZSBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9RU1GIFNlcnZpY2UgRGF0YSBPYmplY3RzIChTRE8pIERvY3VtZW50YXRpb24KLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPUVjbGlwc2Uub3JnIHVwZGF0ZSBzaXRlCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1FTUYgU2VydmljZSBEYXRhIE9iamVjdHMgKFNETykgRG9jdW1lbnRhdGlvbgotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFLk9SRyBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotMTR0aCBBdWd1c3QsIDIwMDNcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1FQ0xJUFNFLk9SRyBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSBFY2xpcHNlLm9yZ1xuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQ29tbW9uIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkNQTCIpLiBBIGNvcHkgb2YgdGhlIENQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBDUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLUNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50c1xuXAotKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS4gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvclxuXAotbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlXG5cCi1QbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCBhIEZlYXR1cmUuIFBsdWctaW5zIGFuZCBGcmFnbWVudHNcblwKLWFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIG5hbWVkICJwbHVnaW5zIiBhbmQgRmVhdHVyZXMgYXJlIGxvY2F0ZWQgaW5cblwKLWRpcmVjdG9yaWVzIG5hbWVkICJmZWF0dXJlcyIuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gU3ViZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IEVjbGlwc2Uub3JnIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIENQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IEVjbGlwc2Uub3JnIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgVGhlIGFib3ZlIHByb3BlcnRpZXMgaGF2ZSBiZWVuIHNoaXBwZWQgZm9yIHRyYW5zbGF0aW9uLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLmRvY18yLjAuMC9mZWF0dXJlLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLmRvY18yLjAuMC9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWRmYjQ0YS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby5kb2NfMi4wLjAvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogZmVhdHVyZS54bWwsdiAxLjIgMjAwNC8wMy8yNiAxNTozMjoxMyBtYXJjZWxvcCBFeHAgJAotICovCi0tLT4KLQotPGZlYXR1cmUKLQlpZD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby5kb2MiCi0gICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICB2ZXJzaW9uPSIyLjAuMCIKLSAgICBpbWFnZT0gImVjbGlwc2VfdXBkYXRlXzEyMC5qcGciCi0gICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+Ci0KLQk8ZGVzY3JpcHRpb24+Ci0gICAgCSVkZXNjcmlwdGlvbgotCTwvZGVzY3JpcHRpb24+Ci0KLSAgICA8bGljZW5zZSB1cmw9IiVsaWNlbnNlVVJMIj4KLQkJJWxpY2Vuc2UKLQk8L2xpY2Vuc2U+Ci0KLQk8dXJsPgotCQk8dXBkYXRlIHVybD0iaHR0cDovL3VwZGF0ZS5lY2xpcHNlLm9yZy91cGRhdGVzIiBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIi8+Ci0JPC91cmw+Ci0KLQk8cGx1Z2luCi0JCWlkPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLmRvYyIKLSAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgaW5zdGFsbC1zaXplPSIwIiAgIAkJCi0JCXZlcnNpb249IjIuMC4wIi8+Ci08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby5kb2NfMi4wLjAvbGljZW5zZS5odG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uZG9jXzIuMC4wL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY4YzM4MC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby5kb2NfMi4wLjAvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPgotPGgyPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPjE0dGggQXVndXN0LCAyMDAzPC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPkVDTElQU0UuT1JHIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+Ci0gICAKLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4gICAKLSAgIAotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IEVjbGlwc2Uub3JnIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCZxdW90O0NQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIENQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgQ1BMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gQ1ZTCi0gICBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLQotPHA+Q29udGVudCBtYXkgYmUgYXBwb3J0aW9uZWQgaW50byBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiBGaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCBhIEZlYXR1cmUuICAgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcwotICAgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90OyBhbmQgRmVhdHVyZXMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuPC9wPgotICAKLTxwPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gRmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvcD4KLSAgCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgotCi08dWw+Ci0JPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0JPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLQk8bGk+U3ViZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0JPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQkJCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgRWNsaXBzZS5vcmcgaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIENQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KLQotPHVsPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0JPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQotCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLTwvdWw+Ci0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgRWNsaXBzZS5vcmcgdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KLQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+Ci0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+Ci08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uc291cmNlXzIuMC4wL01FVEEtSU5GL01BTklGRVNULk1GIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uc291cmNlXzIuMC4wL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTQ5OWJjLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLnNvdXJjZV8yLjAuMC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLnNvdXJjZV8yLjAuMC9jcGwtdjEwLmh0bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby5zb3VyY2VfMi4wLjAvY3BsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmFhMjA4Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLnNvdXJjZV8yLjAuMC9jcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci08SEVBRD4KLTxUSVRMRT5Db21tb24gUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvVElUTEU+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0iI0ZGRkZGRiIgVkxJTks9IiM4MDAwMDAiPgotCi0KLTxQIEFMSUdOPSJDRU5URVIiPjxCPkNvbW1vbiBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9CPgotPFA+PEI+PC9CPjxGT05UIFNJWkU9IjMiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjMiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIgVEhFIFRFUk1TIE9GIFRISVMgQ09NTU9OIFBVQkxJQyBMSUNFTlNFICgiQUdSRUVNRU5UIikuICBBTlkgVVNFLCBSRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UgT0YgVEhJUyBBR1JFRU1FTlQuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PEI+MS4gIERFRklOSVRJT05TPC9CPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPiJDb250cmlidXRpb24iIG1lYW5zOjwvRk9OVD4KLQotPFVMPjxGT05UIFNJWkU9IjIiPmEpIGluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uIGRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8QlIgQ0xFQVI9IkxFRlQiPgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5pKQkgCWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5paSkJCWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+d2hlcmUgc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZCBieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+QSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvciBpZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbiBzdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPkNvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIHdoaWNoOiAgKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFByb2dyYW0uICA8L0ZPTlQ+PC9VTD4KLQotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+IkNvbnRyaWJ1dG9yIiBtZWFucyBhbnkgcGVyc29uIG9yIGVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj4iTGljZW5zZWQgUGF0ZW50cyAiIG1lYW4gcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlIG9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uICA8L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPiJQcm9ncmFtIiBtZWFucyB0aGUgQ29udHJpYnV0aW9ucyBkaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+IlJlY2lwaWVudCIgbWVhbnMgYW55b25lIHdobyByZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PEI+PC9CPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjxCPjIuICBHUkFOVCBPRiBSSUdIVFM8L0I+PC9GT05UPgotCi08VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPmEpCTwvRk9OVD48Rk9OVCBTSVpFPSIyIj5TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzPC9GT05UPjxGT05UIFNJWkU9IjIiPiBSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzwvRk9OVD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iI0ZGMDAwMCI+IDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+YikgCVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgPC9GT05UPjxGT05UIFNJWkU9IjIiPlJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDgwMDAiPiA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+cm95YWx0eS1mcmVlIHBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uICBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZCBieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbiB0byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiAgVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0byBhbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gIE5vIGhhcmR3YXJlIHBlciBzZSBpcyBsaWNlbnNlZCBoZXJldW5kZXIuICAgPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5jKQlSZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzIENvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yIHRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuICBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudCBmb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuICBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kIGxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5IHRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gIEZvciBleGFtcGxlLCBpZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+ZCkJRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQgcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbiB0aGlzIEFncmVlbWVudC4gPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48L1VMPgotCi08UD48Rk9OVCBTSVpFPSIyIj48Qj4zLiAgUkVRVUlSRU1FTlRTPC9CPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjxCPjwvQj5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9GT05UPgotCi08VUw+PEZPTlQgU0laRT0iMiI+YSkJaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5iKQlpdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmkpCWVmZmVjdGl2ZWx5IGRpc2NsYWltczwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kIGNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUgYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+aWkpIAllZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoIGFzIGxvc3QgcHJvZml0czsgPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmlpaSk8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+CXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQgQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5pdikJc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZCBpbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDAwRkYiPiA8L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiNGRjAwMDAiPjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iI0ZGMDAwMCI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48L1VMPgotCi08UD48Rk9OVCBTSVpFPSIyIj5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZSBjb2RlIGZvcm06PC9GT05UPgotCi08VUw+PEZPTlQgU0laRT0iMiI+YSkJaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5iKQlhIGNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gIDwvRk9OVD48L1VMPgotCi08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDAwRkYiPjxTVFJJS0U+PC9TVFJJS0U+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDAwRkYiPjxTVFJJS0U+PC9TVFJJS0U+PC9GT05UPjxGT05UIFNJWkU9IjIiPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkgY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gIDwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlIG9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzIHN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiAgPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PEI+NC4gIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9CPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heSBhY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzIGFuZCB0aGUgbGlrZS4gIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZSBvZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbCBsaWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gICBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCJDb21tZXJjaWFsIENvbnRyaWJ1dG9yIikgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlciBDb250cmlidXRvciAoIkluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIikgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZCBjb3N0cyAoY29sbGVjdGl2ZWx5ICJMb3NzZXMiKSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIgbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8gdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiBjb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZy4gIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzIHJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiAgSW4gb3JkZXIgdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kIGFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiAgVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZSBpbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiAgVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEgQ29tbWVyY2lhbCBDb250cmlidXRvci4gIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlIGNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuICBVbmRlciB0aGlzIHNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZSBvdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhIGNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDAwMEZGIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iIzAwMDBGRiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjxCPjUuICBOTyBXQVJSQU5UWTwvQj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXM8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj50aGUgUHJvZ3JhbTwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50PC9GT05UPjxGT05UIFNJWkU9IjIiPiwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLCBjb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+cHJvZ3JhbXMgb3IgZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnM8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+LiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48Qj42LiAgRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L0I+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+KElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSw8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PEI+Ny4gIEdFTkVSQUw8L0I+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQgZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUgbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYSBDb250cmlidXRvciB3aXRoIHJlc3BlY3QgdG8gYSBwYXRlbnQgYXBwbGljYWJsZSB0byBzb2Z0d2FyZSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCksIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcyBncmFudGVkIGJ5IHRoYXQgQ29udHJpYnV0b3IgdG8gc3VjaCBSZWNpcGllbnQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gIEluIGFkZGl0aW9uLCBpZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGggb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoIFJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCBzaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvciBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUgcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiAgSWYgYWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiAgSG93ZXZlciwgUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5IFJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzIGNvcHlyaWdodGVkICBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQgU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gPC9GT05UPjxGT05UIFNJWkU9IjIiPnB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZiB0aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gPC9GT05UPjxGT05UIFNJWkU9IjIiPnRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMgdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gSUJNIGlzIHRoZSBpbml0aWFsIEFncmVlbWVudCBTdGV3YXJkLiAgIElCTSBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0byBzZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+RWFjaCBuZXcgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIFRoZSBQcm9ncmFtIChpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+dmVyc2lvbi4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5FeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZCBpbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyIGV4cHJlc3NseSwgPC9GT05UPjxGT05UIFNJWkU9IjIiPmJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2U8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+LjwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90IGV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUgU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMgQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiAgRWFjaCBwYXJ0eSB3YWl2ZXMgaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci0KLTwvQk9EWT4KLQotPC9IVE1MPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLnNvdXJjZV8yLjAuMC9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uc291cmNlXzIuMC4wL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhNGQ2MzkuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uc291cmNlXzIuMC4wL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby5zb3VyY2VfMi4wLjAvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uc291cmNlXzIuMC4wL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNiYjFjYi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby5zb3VyY2VfMi4wLjAvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgLyoqCi0jICAqIDxjb3B5cmlnaHQ+Ci0jICAqCi0jICAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSMgICogCi0jICAqIENvbnRyaWJ1dG9yczogCi0jICAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jICAqCi0jICAqIDwvY29weXJpZ2h0PgotIyAgKgotIyAgKiAkSWQ6IGZlYXR1cmUucHJvcGVydGllcyx2IDEuMSAyMDA0LzEwLzE4IDE1OjUwOjQyIGRiaXJzYW4gRXhwICQgCi0jICAqLwotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBEbyBub3QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUgbGFzdCBsaW5lIGNvbnRhaW5pbmc6Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBJbnN0ZWFkLCBlaXRoZXIgcmVkZWZpbmUgYW4gZXhpc3RpbmcgcHJvcGVydHksIG9yIGNyZWF0ZSBhIG5ldyBwcm9wZXJ0eSwKLSMgYXBwZW5kIGl0IHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUsIGFuZCBjaGFuZ2UgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgbmFtZS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgVGhpcyBmaWxlIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1FTUYgU2VydmljZSBEYXRhIE9iamVjdHMgKFNETykgU291cmNlCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1FY2xpcHNlLm9yZyB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249RU1GIFNlcnZpY2UgRGF0YSBPYmplY3RzIChTRE8pIFNvdXJjZQotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFLk9SRyBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotMTR0aCBBdWd1c3QsIDIwMDNcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1FQ0xJUFNFLk9SRyBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSBFY2xpcHNlLm9yZ1xuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQ29tbW9uIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkNQTCIpLiBBIGNvcHkgb2YgdGhlIENQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBDUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLUNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50c1xuXAotKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS4gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvclxuXAotbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlXG5cCi1QbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCBhIEZlYXR1cmUuIFBsdWctaW5zIGFuZCBGcmFnbWVudHNcblwKLWFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIG5hbWVkICJwbHVnaW5zIiBhbmQgRmVhdHVyZXMgYXJlIGxvY2F0ZWQgaW5cblwKLWRpcmVjdG9yaWVzIG5hbWVkICJmZWF0dXJlcyIuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gU3ViZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IEVjbGlwc2Uub3JnIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIENQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IEVjbGlwc2Uub3JnIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgVGhlIGFib3ZlIHByb3BlcnRpZXMgaGF2ZSBiZWVuIHNoaXBwZWQgZm9yIHRyYW5zbGF0aW9uLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLnNvdXJjZV8yLjAuMC9mZWF0dXJlLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLnNvdXJjZV8yLjAuMC9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE1ZDg3ZC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby5zb3VyY2VfMi4wLjAvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUgcHJpbWFyeT0iZmFsc2UiICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIiAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIiAgaW1hZ2U9ImVjbGlwc2VfdXBkYXRlXzEyMC5qcGciIGlkPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLnNvdXJjZSIgIHZlcnNpb249IjIuMC4wIj4KLQk8ZGVzY3JpcHRpb24gPgotCQklZGVzY3JpcHRpb24KLQk8L2Rlc2NyaXB0aW9uPgotCTxjb3B5cmlnaHQgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+Ci0JCUNvcHlyaWdodCAoYykgMjAwMi0yMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0JPC9jb3B5cmlnaHQ+Ci0JPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0JCSVsaWNlbnNlCi0JPC9saWNlbnNlPgotCTx1cmw+Ci0JCTx1cGRhdGUgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vdXBkYXRlLmVjbGlwc2Uub3JnL3VwZGF0ZXMvIi8+Ci0JCTxkaXNjb3ZlcnkgbGFiZWw9IiVzZWNvbmRhcnlVcGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvdG9vbHMvZW1mL3VwZGF0ZXMvIi8+Ci0JPC91cmw+Ci0JPHBsdWdpbiAgICBmcmFnbWVudD0iZmFsc2UiICBkb3dubG9hZC1zaXplPSIwIiBpbnN0YWxsLXNpemU9IjAiIGlkPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLnNvdXJjZSIgdmVyc2lvbj0iMi4wLjAiLz4KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLnNvdXJjZV8yLjAuMC9saWNlbnNlLmh0bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby5zb3VyY2VfMi4wLjAvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjhjMzgwLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLnNvdXJjZV8yLjAuMC9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+Ci08aDI+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+MTR0aCBBdWd1c3QsIDIwMDM8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+RUNMSVBTRS5PUkcgTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLSAgIAotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIAotICAgCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgRWNsaXBzZS5vcmcgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7Q1BMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgQ1BMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBDUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMKLSAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotCi08cD5Db250ZW50IG1heSBiZSBhcHBvcnRpb25lZCBpbnRvIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS4gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiAgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIGEgRmVhdHVyZS4gICBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzCi0gICBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7IGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy48L3A+Ci0gIAotPHA+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBGaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9wPgotICAKLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+Ci0KLTx1bD4KLQk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotCTxsaT5TdWJkaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLQk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCQkKLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSBFY2xpcHNlLm9yZyBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90Oy4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+Ci0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgQ1BMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLQk8bGk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4JCi0JPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KLQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotPC91bD4KLQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCBFY2xpcHNlLm9yZyB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkb18yLjAuMC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvXzIuMC4wL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTQ5OWJjLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvXzIuMC4wL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG9fMi4wLjAvY3BsLXYxMC5odG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG9fMi4wLjAvY3BsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmFhMjA4Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvXzIuMC4wL2NwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLTxIRUFEPgotPFRJVExFPkNvbW1vbiBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9USVRMRT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSIjRkZGRkZGIiBWTElOSz0iIzgwMDAwMCI+Ci0KLQotPFAgQUxJR049IkNFTlRFUiI+PEI+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L0I+Ci08UD48Qj48L0I+PEZPTlQgU0laRT0iMyI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMyI+PC9GT05UPjxGT05UIFNJWkU9IjIiPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUiBUSEUgVEVSTVMgT0YgVEhJUyBDT01NT04gUFVCTElDIExJQ0VOU0UgKCJBR1JFRU1FTlQiKS4gIEFOWSBVU0UsIFJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRSBPRiBUSElTIEFHUkVFTUVOVC48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48Qj4xLiAgREVGSU5JVElPTlM8L0I+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+IkNvbnRyaWJ1dGlvbiIgbWVhbnM6PC9GT05UPgotCi08VUw+PEZPTlQgU0laRT0iMiI+YSkgaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24gZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxCUiBDTEVBUj0iTEVGVCI+Ci1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmkpCSAJY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmlpKQkJYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj53aGVyZSBzdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkIGJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5BIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yIGlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uIHN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+Q29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gd2hpY2g6ICAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgUHJvZ3JhbS4gIDwvRk9OVD48L1VMPgotCi08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj4iQ29udHJpYnV0b3IiIG1lYW5zIGFueSBwZXJzb24gb3IgZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPiJMaWNlbnNlZCBQYXRlbnRzICIgbWVhbiBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2Ugb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gIDwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IlByb2dyYW0iIG1lYW5zIHRoZSBDb250cmlidXRpb25zIGRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj4iUmVjaXBpZW50IiBtZWFucyBhbnlvbmUgd2hvIHJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48Qj48L0I+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PEI+Mi4gIEdSQU5UIE9GIFJJR0hUUzwvQj48L0ZPTlQ+Ci0KLTxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+YSkJPC9GT05UPjxGT05UIFNJWkU9IjIiPlN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHM8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IFJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjRkYwMDAwIj4gPC9GT05UPjxGT05UIFNJWkU9IjIiPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS48L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5iKSAJU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+UmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDwvRk9OVD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iIzAwODAwMCI+IDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5yb3lhbHR5LWZyZWUgcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkIGJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uIHRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuICBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvIGFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiAgTm8gaGFyZHdhcmUgcGVyIHNlIGlzIGxpY2Vuc2VkIGhlcmV1bmRlci4gICA8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmMpCVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMgQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IgdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50IGZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQgbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkgdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiAgRm9yIGV4YW1wbGUsIGlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZSBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5kKQlFYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodCByaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluIHRoaXMgQWdyZWVtZW50LiA8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjwvVUw+Ci0KLTxQPjxGT05UIFNJWkU9IjIiPjxCPjMuICBSRVFVSVJFTUVOVFM8L0I+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PEI+PC9CPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L0ZPTlQ+Ci0KLTxVTD48Rk9OVCBTSVpFPSIyIj5hKQlpdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmIpCWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+aSkJZWZmZWN0aXZlbHkgZGlzY2xhaW1zPC9GT05UPjxGT05UIFNJWkU9IjIiPiBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQgY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZSBhbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5paSkgCWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2ggYXMgbG9zdCBwcm9maXRzOyA8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+aWlpKTwvRk9OVD48Rk9OVCBTSVpFPSIyIj4Jc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdCBDb250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPml2KQlzdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kIGluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjwvRk9OVD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iIzAwMDBGRiI+IDwvRk9OVD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iI0ZGMDAwMCI+PC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjRkYwMDAwIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPjwvVUw+Ci0KLTxQPjxGT05UIFNJWkU9IjIiPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlIGNvZGUgZm9ybTo8L0ZPTlQ+Ci0KLTxVTD48Rk9OVCBTSVpFPSIyIj5hKQlpdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmIpCWEgY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiAgPC9GT05UPjwvVUw+Ci0KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iIzAwMDBGRiI+PFNUUklLRT48L1NUUklLRT48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iIzAwMDBGRiI+PFNUUklLRT48L1NUUklLRT48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueSBjb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiAgPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUgb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3Mgc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uICA8L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48Qj40LiAgQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L0I+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5IGFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMgYW5kIHRoZSBsaWtlLiAgV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlIG9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsIGxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiAgIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoIkNvbW1lcmNpYWwgQ29udHJpYnV0b3IiKSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyIENvbnRyaWJ1dG9yICgiSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IiKSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kIGNvc3RzIChjb2xsZWN0aXZlbHkgIkxvc3NlcyIpIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlciBsZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0byB0aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluIGNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLiAgVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMgcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuICBJbiBvcmRlciB0byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQgYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuICBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlIGluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguICBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yLiAgSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UgY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gIFVuZGVyIHRoaXMgc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlIG90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEgY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDAwRkYiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDAwMEZGIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PEI+NS4gIE5PIFdBUlJBTlRZPC9CPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpczwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgPC9GT05UPjxGT05UIFNJWkU9IjIiPnRoZSBQcm9ncmFtPC9GT05UPjxGT05UIFNJWkU9IjIiPiBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+LCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsIGNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5wcm9ncmFtcyBvciBlcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9uczwvRk9OVD48Rk9OVCBTSVpFPSIyIj4uICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjxCPjYuICBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvQj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj4oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLDwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48Qj43LiAgR0VORVJBTDwvQj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dCBmdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZSBtaW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhIENvbnRyaWJ1dG9yIHdpdGggcmVzcGVjdCB0byBhIHBhdGVudCBhcHBsaWNhYmxlIHRvIHNvZnR3YXJlIChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzIGdyYW50ZWQgYnkgdGhhdCBDb250cmlidXRvciB0byBzdWNoIFJlY2lwaWVudCB1bmRlciB0aGlzIEFncmVlbWVudCBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiAgSW4gYWRkaXRpb24sIGlmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aCBvdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2ggUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZSBwZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuICBJZiBhbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuICBIb3dldmVyLCBSZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkgUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMgY29weXJpZ2h0ZWQgIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudCBTdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+cHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mIHRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+dGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcyB0aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBJQk0gaXMgdGhlIGluaXRpYWwgQWdyZWVtZW50IFN0ZXdhcmQuICAgSUJNIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvIHNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5FYWNoIG5ldyB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiAgVGhlIFByb2dyYW0gKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAoaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IDwvRk9OVD48Rk9OVCBTSVpFPSIyIj52ZXJzaW9uLiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPkV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkIGluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8gdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIgZXhwcmVzc2x5LCA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+YnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZTwvRk9OVD48Rk9OVCBTSVpFPSIyIj4uPC9GT05UPjxGT05UIFNJWkU9IjIiPiAgQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QgZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZSBTdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcyBBZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuICBFYWNoIHBhcnR5IHdhaXZlcyBpdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLQotPC9CT0RZPgotCi08L0hUTUw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG9fMi4wLjAvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvXzIuMC4wL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhNGQ2MzkuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG9fMi4wLjAvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvXzIuMC4wL2ZlYXR1cmUucHJvcGVydGllcyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvXzIuMC4wL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQyZjNiOS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkb18yLjAuMC9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyAvKioKLSMgICogPGNvcHlyaWdodD4KLSMgICoKLSMgICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotIyAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyAgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotIyAgKiAKLSMgICogQ29udHJpYnV0b3JzOiAKLSMgICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgICoKLSMgICogPC9jb3B5cmlnaHQ+Ci0jICAqCi0jICAqICRpZCQKLSMgICovCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIERvIG5vdCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZSBsYXN0IGxpbmUgY29udGFpbmluZzoKLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIEluc3RlYWQsIGVpdGhlciByZWRlZmluZSBhbiBleGlzdGluZyBwcm9wZXJ0eSwgb3IgY3JlYXRlIGEgbmV3IHByb3BlcnR5LAotIyBhcHBlbmQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSwgYW5kIGNoYW5nZSB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBuYW1lLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyBUaGlzIGZpbGUgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPUVNRiBTZXJ2aWNlIERhdGEgT2JqZWN0cyAoU0RPKQotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9RWNsaXBzZS5vcmcgdXBkYXRlIHNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPUVNRiBTZXJ2aWNlIERhdGEgT2JqZWN0cyAoU0RPKS4KLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRS5PUkcgU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLTE0dGggQXVndXN0LCAyMDAzXG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotRUNMSVBTRS5PUkcgTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgRWNsaXBzZS5vcmdcblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIENvbW1vbiBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJDUEwiKS4gQSBjb3B5IG9mIHRoZSBDUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgQ1BMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi1Db250ZW50IG1heSBiZSBhcHBvcnRpb25lZCBpbnRvIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHNcblwKLSgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3JcblwKLW1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZVxuXAotUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiBQbHVnLWlucyBhbmQgRnJhZ21lbnRzXG5cCi1hcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAicGx1Z2lucyIgYW5kIEZlYXR1cmVzIGFyZSBsb2NhdGVkIGluXG5cCi1kaXJlY3RvcmllcyBuYW1lZCAiZmVhdHVyZXMiLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIFN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSBFY2xpcHNlLm9yZyBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBDUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCBFY2xpcHNlLm9yZyB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIFRoZSBhYm92ZSBwcm9wZXJ0aWVzIGhhdmUgYmVlbiBzaGlwcGVkIGZvciB0cmFuc2xhdGlvbi4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgInNlY29uZGFyeVVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgc2Vjb25kYXJ5IHVwZGF0ZSBzaXRlIChvbiBkb3dubG9hZC5lY2xpcHNlLm9yZykKLXNlY29uZGFyeVVwZGF0ZVNpdGVOYW1lPUVNRi9TRE8vWFNEIFNlY29uZGFyeSBVcGRhdGUgU2l0ZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG9fMi4wLjAvZmVhdHVyZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkb18yLjAuMC9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjA0NjYyYi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkb18yLjAuMC9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8iCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMi4wLjAiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgICAgaW1hZ2U9ImVjbGlwc2VfdXBkYXRlXzEyMC5qcGciPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+Ci0gICAgICBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLUFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vdXBkYXRlLmVjbGlwc2Uub3JnL3VwZGF0ZXMvIi8+Ci0gICAgICA8ZGlzY292ZXJ5IGxhYmVsPSIlc2Vjb25kYXJ5VXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3Rvb2xzL2VtZi91cGRhdGVzLyIvPgotICAgPC91cmw+Ci0KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcyIgdmVyc2lvbj0iMy4wLjAiIG1hdGNoPSJjb21wYXRpYmxlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlIiB2ZXJzaW9uPSIyLjAuMCIgbWF0Y2g9ImNvbXBhdGlibGUiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYuY29tbW9uai5zZG8iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMi4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMi4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uZWRpdCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIyLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby5lZGl0b3IiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMi4wLjAiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG9fMi4wLjAvbGljZW5zZS5odG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG9fMi4wLjAvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjhjMzgwLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvXzIuMC4wL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4KLTxoMj5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD4xNHRoIEF1Z3VzdCwgMjAwMzwvcD4KLQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgotCi08cD5FQ0xJUFNFLk9SRyBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotICAgCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+ICAgCi0gICAKLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSBFY2xpcHNlLm9yZyBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtDUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBDUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIENQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIENWUwotICAgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+Ci0KLTxwPkNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLiBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mICB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiAgIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMKLSAgIG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsgYW5kIEZlYXR1cmVzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LjwvcD4KLSAgCi08cD5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIEZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L3A+Ci0gIAotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0JPGxpPlN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgotCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+Ci0JCQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IEVjbGlwc2Uub3JnIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7LgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBDUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkKLQk8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IEVjbGlwc2Uub3JnIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuc2RrXzIuMC4wL01FVEEtSU5GL01BTklGRVNULk1GIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5zZGtfMi4wLjAvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5NDk5YmMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5zZGtfMi4wLjAvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLnNka18yLjAuMC9jcGwtdjEwLmh0bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLnNka18yLjAuMC9jcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1NDE2YzEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5zZGtfMi4wLjAvY3BsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjY2ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9IkhUTUwgVGlkeSwgc2VlIHd3dy53My5vcmciIC8+Ci08dGl0bGU+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIgotY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiIC8+Ci08L2hlYWQ+Ci08Ym9keSBiZ2NvbG9yPSIjRkZGRkZGIiB2bGluaz0iIzgwMDAwMCI+Ci08cCBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7IHRleHQtYWxpZ246IGNlbnRlciI+Q29tbW9uIFB1YmxpYwotTGljZW5zZSAtIHYgMS4wPC9wPgotCi08cD5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIgVEhFIFRFUk1TIE9GIFRISVMKLUNPTU1PTiBQVUJMSUMgTElDRU5TRSAoIkFHUkVFTUVOVCIpLiBBTlkgVVNFLCBSRVBST0RVQ1RJT04gT1IKLURJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFIE9GCi1USElTIEFHUkVFTUVOVC48L3A+Ci0KLTxwIHN0eWxlPSJmb250LXdlaWdodDogYm9sZCI+MS4gREVGSU5JVElPTlM8L3A+Ci0KLTxwPiJDb250cmlidXRpb24iIG1lYW5zOjwvcD4KLQotPGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDJlbSI+YSkgaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwKLUNvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uIGRpc3RyaWJ1dGVkIHVuZGVyCi10aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPSJMRUZUIiAvPgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvZGl2PgotCi08ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogMmVtIj5pKSBjaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L2Rpdj4KLQotPGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDJlbSI+aWkpIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L2Rpdj4KLQotPGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDJlbSI+d2hlcmUgc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMKLXRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQgYnkgdGhhdAotcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYQotQ29udHJpYnV0b3IgaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IKLWl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uIHN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMKLWRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZQotbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBQcm9ncmFtCi11bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQotd29ya3Mgb2YgdGhlIFByb2dyYW0uPC9kaXY+Ci0KLTxwPiJDb250cmlidXRvciIgbWVhbnMgYW55IHBlcnNvbiBvciBlbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUKLVByb2dyYW0uPC9wPgotCi08cD4iTGljZW5zZWQgUGF0ZW50cyAiIG1lYW4gcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlIGJ5IGEKLUNvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZSBvciBzYWxlIG9mCi1pdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS48L3A+Ci0KLTxwPiJQcm9ncmFtIiBtZWFucyB0aGUgQ29udHJpYnV0aW9ucyBkaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGgKLXRoaXMgQWdyZWVtZW50LjwvcD4KLQotPHA+IlJlY2lwaWVudCIgbWVhbnMgYW55b25lIHdobyByZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzCi1BZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvcD4KLQotPHAgc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkIj4yLiBHUkFOVCBPRiBSSUdIVFM8L3A+Ci0KLTxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OiAyZW0iPmEpIFN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMKLUFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudCBhCi1ub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bwotcmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5Ci1wZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kCi1vYmplY3QgY29kZSBmb3JtLjwvZGl2PgotCi08ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogMmVtIj5iKSBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzCi1BZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQgYQotbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgcGF0ZW50IGxpY2Vuc2UgdW5kZXIKLUxpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQgYW5kCi1vdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluCi1zb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseQotdG8gdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUKLXRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZCBieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YKLXRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24gdG8gYmUgY292ZXJlZCBieSB0aGUKLUxpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8gYW55IG90aGVyCi1jb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci48L2Rpdj4KLQotPGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDJlbSI+YykgUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQKLWFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMgQ29udHJpYnV0aW9ucwotc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCi10aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55Ci1saWFiaWxpdHkgdG8gUmVjaXBpZW50IGZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkCi1vbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEKLWNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kIGxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLAotZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eSB0byBzZWN1cmUgYW55Ci1vdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwgaWYKLWEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvCi1kaXN0cmlidXRlIHRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlCi10aGF0IGxpY2Vuc2UgYmVmb3JlIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L2Rpdj4KLQotPGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDJlbSI+ZCkgRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQKLXRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0IHJpZ2h0cyBpbiBpdHMKLUNvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCi10aGlzIEFncmVlbWVudC48L2Rpdj4KLQotPHAgc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkIj4zLiBSRVFVSVJFTUVOVFM8L3A+Ci0KLTxwPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGluIG9iamVjdAotY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9wPgotCi08ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogMmVtIj5hKSBpdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQKLWNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvZGl2PgotCi08ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogMmVtIj5iKSBpdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9kaXY+Ci0KLTxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OiAyZW0iPmkpIGVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YKLWFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kIGNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kCi1pbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlIGFuZAotbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mCi1tZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOzwvZGl2PgotCi08ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogMmVtIj5paSkgZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mCi1hbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBkaXJlY3QsCi1pbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoIGFzCi1sb3N0IHByb2ZpdHM7PC9kaXY+Ci0KLTxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OiAyZW0iPmlpaSkgc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2gKLWRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQgQ29udHJpYnV0b3IgYWxvbmUKLWFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L2Rpdj4KLQotPGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDJlbSI+aXYpIHN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUKLVByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kIGluZm9ybXMgbGljZW5zZWVzCi1ob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhIG1lZGl1bQotY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPC9kaXY+Ci0KLTxwPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlIGNvZGUgZm9ybTo8L3A+Ci0KLTxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OiAyZW0iPmEpIGl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIKLXRoaXMgQWdyZWVtZW50OyBhbmQ8L2Rpdj4KLQotPGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDJlbSI+YikgYSBjb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUKLWluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLjwvZGl2PgotCi08cD5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55IGNvcHlyaWdodCBub3RpY2VzCi1jb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLjwvcD4KLQotPHA+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUgb3JpZ2luYXRvciBvZiBpdHMKLUNvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzIHN1YnNlcXVlbnQKLVJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi48L3A+Ci0KLTxwIHN0eWxlPSJmb250LXdlaWdodDogYm9sZCI+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3A+Ci0KLTxwPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heSBhY2NlcHQgY2VydGFpbgotcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycyBhbmQKLXRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUKLWNvbW1lcmNpYWwgdXNlIG9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIKLXdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwgbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuCi1UaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgiQ29tbWVyY2lhbCBDb250cmlidXRvciIpCi1oZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyIENvbnRyaWJ1dG9yCi0oIkluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIikgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZCBjb3N0cwotKGNvbGxlY3RpdmVseSAiTG9zc2VzIikgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCi1sZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZAotQ29udHJpYnV0b3IgdG8gdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2gKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4gY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcwotc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMgcmVsYXRpbmcgdG8gYW55IGFjdHVhbAotb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlciB0byBxdWFsaWZ5LAotYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kIGFueSByZWxhdGVkIHNldHRsZW1lbnQKLW5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZSBpbiBhbnkKLXN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvcD4KLQotPHA+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUgUHJvZ3JhbSBpbiBhCi1jb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzCi1wZXJmb3JtYW5jZSBjbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLAotdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMgc2VjdGlvbiwgdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQotb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAotd2FycmFudGllcywgYW5kIGlmIGEgY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheQotYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlCi1kYW1hZ2VzLjwvcD4KLQotPHAgc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkIj41LiBOTyBXQVJSQU5UWTwvcD4KLQotPHA+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTCi1QUk9WSURFRCBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRgotQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sCi1BTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAotTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudAotaXMgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nCi1hbmQgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGgKLWl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBidXQgbm90Ci1saW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsIGNvbXBsaWFuY2Ugd2l0aAotYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvciBlcXVpcG1lbnQsCi1hbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuPC9wPgotCi08cCBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQiPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9wPgotCi08cD5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgTkVJVEhFUgotUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IgQU5ZCi1ESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLURBTUFHRVMgKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQKLUFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCi1MSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgotQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gT1IgVEhFCi1FWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCi1QT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9wPgotCi08cCBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQiPjcuIEdFTkVSQUw8L3A+Ci0KLTxwPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlCi11bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQKLXdpdGhvdXQgZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbAotYmUgcmVmb3JtZWQgdG8gdGhlIG1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uCi12YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9wPgotCi08cD5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGEgQ29udHJpYnV0b3IKLXdpdGggcmVzcGVjdCB0byBhIHBhdGVudCBhcHBsaWNhYmxlIHRvIHNvZnR3YXJlIChpbmNsdWRpbmcgYQotY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCksIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotZ3JhbnRlZCBieSB0aGF0IENvbnRyaWJ1dG9yIHRvIHN1Y2ggUmVjaXBpZW50IHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1zaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiBJbgotYWRkaXRpb24sIGlmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55Ci1lbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUKLVByb2dyYW0gd2l0aCBvdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MKLXBhdGVudChzKSwgdGhlbiBzdWNoIFJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKQotc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC48L3A+Ci0KLTxwPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgc2hhbGwgdGVybWluYXRlIGlmCi1pdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yIGNvbmRpdGlvbnMgb2YKLXRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKLXBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsCi1SZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzCi10byBjZWFzZSB1c2UgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkKLXByYWN0aWNhYmxlLiBIb3dldmVyLCBSZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudAotYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5IFJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbAotY29udGludWUgYW5kIHN1cnZpdmUuPC9wPgotCi08cD5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhpcwotQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZQotQWdyZWVtZW50IFN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zCi0oaW5jbHVkaW5nIHJldmlzaW9ucykgb2YgdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZQotb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzIHRoZSByaWdodCB0byBtb2RpZnkgdGhpcwotQWdyZWVtZW50LiBJQk0gaXMgdGhlIGluaXRpYWwgQWdyZWVtZW50IFN0ZXdhcmQuIElCTSBtYXkgYXNzaWduIHRoZQotcmVzcG9uc2liaWxpdHkgdG8gc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUKLXNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYQotZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtIChpbmNsdWRpbmcKLUNvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldwotdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvCi1kaXN0cmlidXRlIHRoZSBQcm9ncmFtIChpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcKLXZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkIGluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikKLWFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvIHRoZSBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgotZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZQotUHJvZ3JhbSBub3QgZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlCi1yZXNlcnZlZC48L3A+Ci0KLTxwPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZSBTdGF0ZSBvZiBOZXcgWW9yawotYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhLgotTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2gKLXBhcnR5IHdhaXZlcyBpdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nCi1saXRpZ2F0aW9uLjwvcD4KLTwvYm9keT4KLTwvaHRtbD4KLQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5zZGtfMi4wLjAvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuc2RrXzIuMC4wL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4ZTNlMDIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5zZGtfMi4wLjAvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuc2RrXzIuMC4wL2ZlYXR1cmUucHJvcGVydGllcyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuc2RrXzIuMC4wL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTk0Nzc1Yy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLnNka18yLjAuMC9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyAvKioKLSMgICogPGNvcHlyaWdodD4KLSMgICoKLSMgICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotIyAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyAgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotIyAgKiAKLSMgICogQ29udHJpYnV0b3JzOiAKLSMgICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgICoKLSMgICogPC9jb3B5cmlnaHQ+Ci0jICAqCi0jICAqICRJZDogZmVhdHVyZS5wcm9wZXJ0aWVzLHYgMS4xIDIwMDQvMTAvMTggMTU6NTA6NDIgZGJpcnNhbiBFeHAgJAotIyAgKi8KLQotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPUVNRiBTREsKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPUVjbGlwc2Uub3JnIHVwZGF0ZSBzaXRlCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1CaW5hcmllcyBhbmQgQVBJIGRvY3VtZW50YXRpb24gYW5kIHNvdXJjZSB6aXBzIGZvciBFTUYuCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UuT1JHIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi0xNHRoIEF1Z3VzdCwgMjAwM1xuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLUVDTElQU0UuT1JHIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IEVjbGlwc2Uub3JnXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBDb21tb24gUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiQ1BMIikuIEEgY29weSBvZiB0aGUgQ1BMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIENQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotQ29udGVudCBtYXkgYmUgYXBwb3J0aW9uZWQgaW50byBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzXG5cCi0oIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLiBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yXG5cCi1tb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGVcblwKLVBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIGEgRmVhdHVyZS4gUGx1Zy1pbnMgYW5kIEZyYWdtZW50c1xuXAotYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgbmFtZWQgInBsdWdpbnMiIGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpblxuXAotZGlyZWN0b3JpZXMgbmFtZWQgImZlYXR1cmVzIi5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBTdWJkaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgRWNsaXBzZS5vcmcgaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgQ1BMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgRWNsaXBzZS5vcmcgdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5zZGtfMi4wLjAvZmVhdHVyZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLnNka18yLjAuMC9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQxOGRlMi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLnNka18yLjAuMC9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLS8qKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBmZWF0dXJlLnhtbCx2IDEuMiAyMDA0LzAzLzI1IDE0OjA2OjM0IG1hcmNlbG9wIEV4cCAkCi0gKi8KLS0tPgotCi08ZmVhdHVyZQotICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYuc2RrIgotICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgdmVyc2lvbj0iMi4wLjAiCi0gICAgaW1hZ2U9ICJlY2xpcHNlX3VwZGF0ZV8xMjAuanBnIgotICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgotCi0JPGRlc2NyaXB0aW9uPgotICAgICAgICAlZGVzY3JpcHRpb24KLSAgICA8L2Rlc2NyaXB0aW9uPgotICAgCi0JPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0gICAgICAgICVsaWNlbnNlCi0gICAgPC9saWNlbnNlPgotCi0gICAgPHVybD4KLSAgICAgIDx1cGRhdGUgdXJsPSJodHRwOi8vdXBkYXRlLmVjbGlwc2Uub3JnL3VwZGF0ZXMiIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiLz4KLSAgICA8L3VybD4KLQotICAgIDxpbmNsdWRlcwotICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mIgotICAgICAgICB2ZXJzaW9uPSIyLjAuMCIKLSAgICAgICAgbWF0Y2g9ImNvbXBhdGlibGUiLz4gCi0gICAgICAgIAotICAgIDxpbmNsdWRlcwotICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLnNvdXJjZSIKLSAgICAgICAgdmVyc2lvbj0iMi4wLjAiCi0gICAgICAgIG1hdGNoPSJjb21wYXRpYmxlIi8+IAotCi0gICAgPGluY2x1ZGVzCi0gICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYuZG9jIgotICAgICAgICB2ZXJzaW9uPSIyLjAuMCIKLSAgICAgICAgbWF0Y2g9ImNvbXBhdGlibGUiLz4gICAKLQotICAgIDxpbmNsdWRlcwotICAgICAgICBpZD0ib3JnLmVjbGlwc2UueHNkIgotICAgICAgICB2ZXJzaW9uPSIyLjAuMCIKLSAgICAgICAgbWF0Y2g9ImNvbXBhdGlibGUiLz4gCi0KLSAgICA8aW5jbHVkZXMKLSAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnhzZC5zb3VyY2UiCi0gICAgICAgIHZlcnNpb249IjIuMC4wIgotICAgICAgICBtYXRjaD0iY29tcGF0aWJsZSIvPiAKLQotICAgIDxpbmNsdWRlcwotICAgICAgICBpZD0ib3JnLmVjbGlwc2UueHNkLmRvYyIKLSAgICAgICAgdmVyc2lvbj0iMi4wLjAiCi0gICAgICAgIG1hdGNoPSJjb21wYXRpYmxlIi8+IAotCi0gICAgPGluY2x1ZGVzCi0gICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvIgotICAgICAgICB2ZXJzaW9uPSIyLjAuMCIKLSAgICAgICAgbWF0Y2g9ImNvbXBhdGlibGUiLz4gCi0KLSAgICA8aW5jbHVkZXMKLSAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uc291cmNlIgotICAgICAgICB2ZXJzaW9uPSIyLjAuMCIKLSAgICAgICAgbWF0Y2g9ImNvbXBhdGlibGUiLz4gCi0KLSAgICA8aW5jbHVkZXMKLSAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uZG9jIgotICAgICAgICB2ZXJzaW9uPSIyLjAuMCIKLSAgICAgICAgbWF0Y2g9ImNvbXBhdGlibGUiLz4gCi0gICAgICAgCi08L2ZlYXR1cmU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5zZGtfMi4wLjAvbGljZW5zZS5odG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5zZGtfMi4wLjAvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2E1ZTE4Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuc2RrXzIuMC4wL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJIVE1MIFRpZHksIHNlZSB3d3cudzMub3JnIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIgotY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiIC8+Ci08dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9ImJsdWUiIHZsaW5rPSJwdXJwbGUiPgotPGgyPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLQotPHA+MTR0aCBBdWd1c3QsIDIwMDM8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+RUNMSVBTRS5PUkcgTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTgotQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWQotIkNPTlRFTlQiKS4gVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQKLUNPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRgotTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZCi1VU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMKLUdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZCi1BUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VECi1CRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUwotQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRQotQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkKLU5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+Ci0KLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieQotRWNsaXBzZS5vcmcgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoIkNQTCIpLiBBIGNvcHkgb2YgdGhlIENQTCBpcwotcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhCi1ocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBDUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QKLWNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnCi1DVlMgcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZQotYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLjwvcD4KLQotPHA+Q29udGVudCBtYXkgYmUgYXBwb3J0aW9uZWQgaW50byBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4KLWZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLiBBIEZlYXR1cmUgaXMgYQotYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQKLW1hdGVyaWFsLiBGaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMKLWFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZAotd2l0aCBhIEZlYXR1cmUuIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMKLW5hbWVkICJwbHVnaW5zIiBhbmQgRmVhdHVyZXMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgbmFtZWQKLSJmZWF0dXJlcyIuPC9wPgotCi08cD5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4KLUZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQKLXZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L3A+Ci0KLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQKLWJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZQotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLgotQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYQotRG93bmxvYWQgb3IgTW9kdWxlIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcKLWxvY2F0aW9uczo8L3A+Ci0KLTx1bD4KLTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotCi08bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotCi08bGk+U3ViZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluCi1QbHVnLWluczwvbGk+Ci0KLTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+Ci0KLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSBFY2xpcHNlLm9yZyBpcyBpbnN0YWxsZWQKLXVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UKLSgiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZQotRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UKLXNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nCi10aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLgotRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YKLWZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcyBhbmQKLUZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvcgotcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZgotdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS48L3A+Ci0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWQotUkVGRVIgVE8gVEhFIENQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5ECi1DT05ESVRJT05TLiBTT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUCi1BUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KLQotPHVsPgotPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhCi1ocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0KLTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEKLWhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj4KLWh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgotCi08bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEKLWhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj4KLWh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotCi08bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhCi1ocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLTwvdWw+Ci0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5ECi1DT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUKLUxpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QKLUVjbGlwc2Uub3JnIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0Ci1wYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaAoteW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sCi1hbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbgotc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZQotY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi1wb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmCi10aGlzIGlzIHBlcm1pdHRlZC48L3A+Ci08L2JvZHk+Ci08L2h0bWw+Ci0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuc291cmNlXzIuMC4wL01FVEEtSU5GL01BTklGRVNULk1GIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5zb3VyY2VfMi4wLjAvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5NDk5YmMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5zb3VyY2VfMi4wLjAvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLnNvdXJjZV8yLjAuMC9jcGwtdjEwLmh0bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLnNvdXJjZV8yLjAuMC9jcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1NDE2YzEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5zb3VyY2VfMi4wLjAvY3BsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjY2ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9IkhUTUwgVGlkeSwgc2VlIHd3dy53My5vcmciIC8+Ci08dGl0bGU+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIgotY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiIC8+Ci08L2hlYWQ+Ci08Ym9keSBiZ2NvbG9yPSIjRkZGRkZGIiB2bGluaz0iIzgwMDAwMCI+Ci08cCBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7IHRleHQtYWxpZ246IGNlbnRlciI+Q29tbW9uIFB1YmxpYwotTGljZW5zZSAtIHYgMS4wPC9wPgotCi08cD5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIgVEhFIFRFUk1TIE9GIFRISVMKLUNPTU1PTiBQVUJMSUMgTElDRU5TRSAoIkFHUkVFTUVOVCIpLiBBTlkgVVNFLCBSRVBST0RVQ1RJT04gT1IKLURJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFIE9GCi1USElTIEFHUkVFTUVOVC48L3A+Ci0KLTxwIHN0eWxlPSJmb250LXdlaWdodDogYm9sZCI+MS4gREVGSU5JVElPTlM8L3A+Ci0KLTxwPiJDb250cmlidXRpb24iIG1lYW5zOjwvcD4KLQotPGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDJlbSI+YSkgaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwKLUNvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uIGRpc3RyaWJ1dGVkIHVuZGVyCi10aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPSJMRUZUIiAvPgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvZGl2PgotCi08ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogMmVtIj5pKSBjaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L2Rpdj4KLQotPGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDJlbSI+aWkpIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L2Rpdj4KLQotPGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDJlbSI+d2hlcmUgc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMKLXRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQgYnkgdGhhdAotcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYQotQ29udHJpYnV0b3IgaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IKLWl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uIHN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMKLWRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZQotbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBQcm9ncmFtCi11bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQotd29ya3Mgb2YgdGhlIFByb2dyYW0uPC9kaXY+Ci0KLTxwPiJDb250cmlidXRvciIgbWVhbnMgYW55IHBlcnNvbiBvciBlbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUKLVByb2dyYW0uPC9wPgotCi08cD4iTGljZW5zZWQgUGF0ZW50cyAiIG1lYW4gcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlIGJ5IGEKLUNvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZSBvciBzYWxlIG9mCi1pdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS48L3A+Ci0KLTxwPiJQcm9ncmFtIiBtZWFucyB0aGUgQ29udHJpYnV0aW9ucyBkaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGgKLXRoaXMgQWdyZWVtZW50LjwvcD4KLQotPHA+IlJlY2lwaWVudCIgbWVhbnMgYW55b25lIHdobyByZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzCi1BZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvcD4KLQotPHAgc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkIj4yLiBHUkFOVCBPRiBSSUdIVFM8L3A+Ci0KLTxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OiAyZW0iPmEpIFN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMKLUFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudCBhCi1ub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bwotcmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5Ci1wZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kCi1vYmplY3QgY29kZSBmb3JtLjwvZGl2PgotCi08ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogMmVtIj5iKSBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzCi1BZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQgYQotbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgcGF0ZW50IGxpY2Vuc2UgdW5kZXIKLUxpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQgYW5kCi1vdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluCi1zb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseQotdG8gdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUKLXRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZCBieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YKLXRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24gdG8gYmUgY292ZXJlZCBieSB0aGUKLUxpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8gYW55IG90aGVyCi1jb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci48L2Rpdj4KLQotPGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDJlbSI+YykgUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQKLWFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMgQ29udHJpYnV0aW9ucwotc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCi10aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55Ci1saWFiaWxpdHkgdG8gUmVjaXBpZW50IGZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkCi1vbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEKLWNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kIGxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLAotZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eSB0byBzZWN1cmUgYW55Ci1vdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwgaWYKLWEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvCi1kaXN0cmlidXRlIHRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlCi10aGF0IGxpY2Vuc2UgYmVmb3JlIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L2Rpdj4KLQotPGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDJlbSI+ZCkgRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQKLXRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0IHJpZ2h0cyBpbiBpdHMKLUNvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCi10aGlzIEFncmVlbWVudC48L2Rpdj4KLQotPHAgc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkIj4zLiBSRVFVSVJFTUVOVFM8L3A+Ci0KLTxwPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGluIG9iamVjdAotY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9wPgotCi08ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogMmVtIj5hKSBpdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQKLWNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvZGl2PgotCi08ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogMmVtIj5iKSBpdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9kaXY+Ci0KLTxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OiAyZW0iPmkpIGVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YKLWFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kIGNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kCi1pbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlIGFuZAotbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mCi1tZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOzwvZGl2PgotCi08ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogMmVtIj5paSkgZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mCi1hbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBkaXJlY3QsCi1pbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoIGFzCi1sb3N0IHByb2ZpdHM7PC9kaXY+Ci0KLTxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OiAyZW0iPmlpaSkgc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2gKLWRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQgQ29udHJpYnV0b3IgYWxvbmUKLWFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L2Rpdj4KLQotPGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDJlbSI+aXYpIHN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUKLVByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kIGluZm9ybXMgbGljZW5zZWVzCi1ob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhIG1lZGl1bQotY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPC9kaXY+Ci0KLTxwPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlIGNvZGUgZm9ybTo8L3A+Ci0KLTxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OiAyZW0iPmEpIGl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIKLXRoaXMgQWdyZWVtZW50OyBhbmQ8L2Rpdj4KLQotPGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDJlbSI+YikgYSBjb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUKLWluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLjwvZGl2PgotCi08cD5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55IGNvcHlyaWdodCBub3RpY2VzCi1jb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLjwvcD4KLQotPHA+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUgb3JpZ2luYXRvciBvZiBpdHMKLUNvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzIHN1YnNlcXVlbnQKLVJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi48L3A+Ci0KLTxwIHN0eWxlPSJmb250LXdlaWdodDogYm9sZCI+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3A+Ci0KLTxwPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heSBhY2NlcHQgY2VydGFpbgotcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycyBhbmQKLXRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUKLWNvbW1lcmNpYWwgdXNlIG9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIKLXdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwgbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuCi1UaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgiQ29tbWVyY2lhbCBDb250cmlidXRvciIpCi1oZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyIENvbnRyaWJ1dG9yCi0oIkluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIikgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZCBjb3N0cwotKGNvbGxlY3RpdmVseSAiTG9zc2VzIikgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCi1sZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZAotQ29udHJpYnV0b3IgdG8gdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2gKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4gY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcwotc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMgcmVsYXRpbmcgdG8gYW55IGFjdHVhbAotb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlciB0byBxdWFsaWZ5LAotYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kIGFueSByZWxhdGVkIHNldHRsZW1lbnQKLW5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZSBpbiBhbnkKLXN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvcD4KLQotPHA+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUgUHJvZ3JhbSBpbiBhCi1jb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzCi1wZXJmb3JtYW5jZSBjbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLAotdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMgc2VjdGlvbiwgdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQotb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAotd2FycmFudGllcywgYW5kIGlmIGEgY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheQotYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlCi1kYW1hZ2VzLjwvcD4KLQotPHAgc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkIj41LiBOTyBXQVJSQU5UWTwvcD4KLQotPHA+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTCi1QUk9WSURFRCBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRgotQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sCi1BTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAotTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudAotaXMgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nCi1hbmQgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGgKLWl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBidXQgbm90Ci1saW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsIGNvbXBsaWFuY2Ugd2l0aAotYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvciBlcXVpcG1lbnQsCi1hbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuPC9wPgotCi08cCBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQiPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9wPgotCi08cD5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgTkVJVEhFUgotUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IgQU5ZCi1ESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLURBTUFHRVMgKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQKLUFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCi1MSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgotQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gT1IgVEhFCi1FWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCi1QT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9wPgotCi08cCBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQiPjcuIEdFTkVSQUw8L3A+Ci0KLTxwPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlCi11bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQKLXdpdGhvdXQgZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbAotYmUgcmVmb3JtZWQgdG8gdGhlIG1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uCi12YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9wPgotCi08cD5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGEgQ29udHJpYnV0b3IKLXdpdGggcmVzcGVjdCB0byBhIHBhdGVudCBhcHBsaWNhYmxlIHRvIHNvZnR3YXJlIChpbmNsdWRpbmcgYQotY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCksIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotZ3JhbnRlZCBieSB0aGF0IENvbnRyaWJ1dG9yIHRvIHN1Y2ggUmVjaXBpZW50IHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1zaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiBJbgotYWRkaXRpb24sIGlmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55Ci1lbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUKLVByb2dyYW0gd2l0aCBvdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MKLXBhdGVudChzKSwgdGhlbiBzdWNoIFJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKQotc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC48L3A+Ci0KLTxwPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgc2hhbGwgdGVybWluYXRlIGlmCi1pdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yIGNvbmRpdGlvbnMgb2YKLXRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKLXBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsCi1SZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzCi10byBjZWFzZSB1c2UgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkKLXByYWN0aWNhYmxlLiBIb3dldmVyLCBSZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudAotYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5IFJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbAotY29udGludWUgYW5kIHN1cnZpdmUuPC9wPgotCi08cD5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhpcwotQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZQotQWdyZWVtZW50IFN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zCi0oaW5jbHVkaW5nIHJldmlzaW9ucykgb2YgdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZQotb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzIHRoZSByaWdodCB0byBtb2RpZnkgdGhpcwotQWdyZWVtZW50LiBJQk0gaXMgdGhlIGluaXRpYWwgQWdyZWVtZW50IFN0ZXdhcmQuIElCTSBtYXkgYXNzaWduIHRoZQotcmVzcG9uc2liaWxpdHkgdG8gc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUKLXNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYQotZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtIChpbmNsdWRpbmcKLUNvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldwotdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvCi1kaXN0cmlidXRlIHRoZSBQcm9ncmFtIChpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcKLXZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkIGluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikKLWFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvIHRoZSBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgotZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZQotUHJvZ3JhbSBub3QgZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlCi1yZXNlcnZlZC48L3A+Ci0KLTxwPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZSBTdGF0ZSBvZiBOZXcgWW9yawotYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhLgotTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2gKLXBhcnR5IHdhaXZlcyBpdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nCi1saXRpZ2F0aW9uLjwvcD4KLTwvYm9keT4KLTwvaHRtbD4KLQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5zb3VyY2VfMi4wLjAvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuc291cmNlXzIuMC4wL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4ZTNlMDIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5zb3VyY2VfMi4wLjAvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuc291cmNlXzIuMC4wL2ZlYXR1cmUucHJvcGVydGllcyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuc291cmNlXzIuMC4wL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNmMDdlZC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLnNvdXJjZV8yLjAuMC9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyAvKioKLSMgICogPGNvcHlyaWdodD4KLSMgICoKLSMgICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotIyAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyAgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotIyAgKiAKLSMgICogQ29udHJpYnV0b3JzOiAKLSMgICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgICoKLSMgICogPC9jb3B5cmlnaHQ+Ci0jICAqCi0jICAqICRJZDogZmVhdHVyZS5wcm9wZXJ0aWVzLHYgMS4xIDIwMDQvMTAvMTggMTU6NTA6NDIgZGJpcnNhbiBFeHAgJAotIyAgKi8KLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgRG8gbm90IGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlIGxhc3QgbGluZSBjb250YWluaW5nOgotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgSW5zdGVhZCwgZWl0aGVyIHJlZGVmaW5lIGFuIGV4aXN0aW5nIHByb3BlcnR5LCBvciBjcmVhdGUgYSBuZXcgcHJvcGVydHksCi0jIGFwcGVuZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLCBhbmQgY2hhbmdlIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IG5hbWUuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jIFRoaXMgZmlsZSBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9RWNsaXBzZSBNb2RlbGluZyBGcmFtZXdvcmsgKEVNRikgU291cmNlCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1FY2xpcHNlLm9yZyB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249RWNsaXBzZSBNb2RlbGluZyBGcmFtZXdvcmsuIChzb3VyY2UgY29kZSkKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRS5PUkcgU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLTE0dGggQXVndXN0LCAyMDAzXG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotRUNMSVBTRS5PUkcgTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgRWNsaXBzZS5vcmdcblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIENvbW1vbiBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJDUEwiKS4gQSBjb3B5IG9mIHRoZSBDUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgQ1BMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi1Db250ZW50IG1heSBiZSBhcHBvcnRpb25lZCBpbnRvIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHNcblwKLSgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3JcblwKLW1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZVxuXAotUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiBQbHVnLWlucyBhbmQgRnJhZ21lbnRzXG5cCi1hcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAicGx1Z2lucyIgYW5kIEZlYXR1cmVzIGFyZSBsb2NhdGVkIGluXG5cCi1kaXJlY3RvcmllcyBuYW1lZCAiZmVhdHVyZXMiLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIFN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSBFY2xpcHNlLm9yZyBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBDUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCBFY2xpcHNlLm9yZyB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIFRoZSBhYm92ZSBwcm9wZXJ0aWVzIGhhdmUgYmVlbiBzaGlwcGVkIGZvciB0cmFuc2xhdGlvbi4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLnNvdXJjZV8yLjAuMC9mZWF0dXJlLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuc291cmNlXzIuMC4wL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjAwMjE0Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuc291cmNlXzIuMC4wL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlIHByaW1hcnk9ImZhbHNlIiAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIgIGltYWdlPSJlY2xpcHNlX3VwZGF0ZV8xMjAuanBnIiBpZD0ib3JnLmVjbGlwc2UuZW1mLnNvdXJjZSIgIHZlcnNpb249IjIuMC4wIj4KLQk8ZGVzY3JpcHRpb24gPgotCQklZGVzY3JpcHRpb24KLQk8L2Rlc2NyaXB0aW9uPgotCTxjb3B5cmlnaHQgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+Ci0JCUNvcHlyaWdodCAoYykgMjAwMi0yMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0JPC9jb3B5cmlnaHQ+Ci0JPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0JCSVsaWNlbnNlCi0JPC9saWNlbnNlPgotCTx1cmw+Ci0JCTx1cGRhdGUgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vdXBkYXRlLmVjbGlwc2Uub3JnL3VwZGF0ZXMvIi8+Ci0JCTxkaXNjb3ZlcnkgbGFiZWw9IiVzZWNvbmRhcnlVcGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvdG9vbHMvZW1mL3VwZGF0ZXMvIi8+Ci0JPC91cmw+Ci0JPHBsdWdpbiAgICBmcmFnbWVudD0iZmFsc2UiICBkb3dubG9hZC1zaXplPSIwIiBpbnN0YWxsLXNpemU9IjAiIGlkPSJvcmcuZWNsaXBzZS5lbWYuc291cmNlIiB2ZXJzaW9uPSIyLjAuMCIvPgotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5zb3VyY2VfMi4wLjAvbGljZW5zZS5odG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5zb3VyY2VfMi4wLjAvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2E1ZTE4Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuc291cmNlXzIuMC4wL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJIVE1MIFRpZHksIHNlZSB3d3cudzMub3JnIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIgotY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiIC8+Ci08dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9ImJsdWUiIHZsaW5rPSJwdXJwbGUiPgotPGgyPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLQotPHA+MTR0aCBBdWd1c3QsIDIwMDM8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+RUNMSVBTRS5PUkcgTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTgotQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWQotIkNPTlRFTlQiKS4gVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQKLUNPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRgotTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZCi1VU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMKLUdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZCi1BUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VECi1CRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUwotQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRQotQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkKLU5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+Ci0KLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieQotRWNsaXBzZS5vcmcgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoIkNQTCIpLiBBIGNvcHkgb2YgdGhlIENQTCBpcwotcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhCi1ocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBDUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QKLWNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnCi1DVlMgcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZQotYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLjwvcD4KLQotPHA+Q29udGVudCBtYXkgYmUgYXBwb3J0aW9uZWQgaW50byBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4KLWZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLiBBIEZlYXR1cmUgaXMgYQotYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQKLW1hdGVyaWFsLiBGaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMKLWFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZAotd2l0aCBhIEZlYXR1cmUuIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMKLW5hbWVkICJwbHVnaW5zIiBhbmQgRmVhdHVyZXMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgbmFtZWQKLSJmZWF0dXJlcyIuPC9wPgotCi08cD5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4KLUZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQKLXZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L3A+Ci0KLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQKLWJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZQotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLgotQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYQotRG93bmxvYWQgb3IgTW9kdWxlIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcKLWxvY2F0aW9uczo8L3A+Ci0KLTx1bD4KLTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotCi08bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotCi08bGk+U3ViZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluCi1QbHVnLWluczwvbGk+Ci0KLTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+Ci0KLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSBFY2xpcHNlLm9yZyBpcyBpbnN0YWxsZWQKLXVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UKLSgiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZQotRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UKLXNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nCi10aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLgotRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YKLWZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcyBhbmQKLUZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvcgotcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZgotdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS48L3A+Ci0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWQotUkVGRVIgVE8gVEhFIENQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5ECi1DT05ESVRJT05TLiBTT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUCi1BUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KLQotPHVsPgotPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhCi1ocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0KLTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEKLWhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj4KLWh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgotCi08bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEKLWhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj4KLWh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotCi08bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhCi1ocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLTwvdWw+Ci0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5ECi1DT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUKLUxpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QKLUVjbGlwc2Uub3JnIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0Ci1wYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaAoteW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sCi1hbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbgotc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZQotY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi1wb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmCi10aGlzIGlzIHBlcm1pdHRlZC48L3A+Ci08L2JvZHk+Ci08L2h0bWw+Ci0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWZfMi4wLjAvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mXzIuMC4wL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTQ5OWJjLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWZfMi4wLjAvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mXzIuMC4wL2NwbC12MTAuaHRtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWZfMi4wLjAvY3BsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTQxNmMxLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWZfMi4wLjAvY3BsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjY2ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9IkhUTUwgVGlkeSwgc2VlIHd3dy53My5vcmciIC8+Ci08dGl0bGU+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIgotY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiIC8+Ci08L2hlYWQ+Ci08Ym9keSBiZ2NvbG9yPSIjRkZGRkZGIiB2bGluaz0iIzgwMDAwMCI+Ci08cCBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7IHRleHQtYWxpZ246IGNlbnRlciI+Q29tbW9uIFB1YmxpYwotTGljZW5zZSAtIHYgMS4wPC9wPgotCi08cD5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIgVEhFIFRFUk1TIE9GIFRISVMKLUNPTU1PTiBQVUJMSUMgTElDRU5TRSAoIkFHUkVFTUVOVCIpLiBBTlkgVVNFLCBSRVBST0RVQ1RJT04gT1IKLURJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFIE9GCi1USElTIEFHUkVFTUVOVC48L3A+Ci0KLTxwIHN0eWxlPSJmb250LXdlaWdodDogYm9sZCI+MS4gREVGSU5JVElPTlM8L3A+Ci0KLTxwPiJDb250cmlidXRpb24iIG1lYW5zOjwvcD4KLQotPGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDJlbSI+YSkgaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwKLUNvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uIGRpc3RyaWJ1dGVkIHVuZGVyCi10aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPSJMRUZUIiAvPgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvZGl2PgotCi08ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogMmVtIj5pKSBjaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L2Rpdj4KLQotPGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDJlbSI+aWkpIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L2Rpdj4KLQotPGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDJlbSI+d2hlcmUgc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMKLXRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQgYnkgdGhhdAotcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYQotQ29udHJpYnV0b3IgaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IKLWl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uIHN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMKLWRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZQotbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBQcm9ncmFtCi11bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQotd29ya3Mgb2YgdGhlIFByb2dyYW0uPC9kaXY+Ci0KLTxwPiJDb250cmlidXRvciIgbWVhbnMgYW55IHBlcnNvbiBvciBlbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUKLVByb2dyYW0uPC9wPgotCi08cD4iTGljZW5zZWQgUGF0ZW50cyAiIG1lYW4gcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlIGJ5IGEKLUNvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZSBvciBzYWxlIG9mCi1pdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS48L3A+Ci0KLTxwPiJQcm9ncmFtIiBtZWFucyB0aGUgQ29udHJpYnV0aW9ucyBkaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGgKLXRoaXMgQWdyZWVtZW50LjwvcD4KLQotPHA+IlJlY2lwaWVudCIgbWVhbnMgYW55b25lIHdobyByZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzCi1BZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvcD4KLQotPHAgc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkIj4yLiBHUkFOVCBPRiBSSUdIVFM8L3A+Ci0KLTxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OiAyZW0iPmEpIFN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMKLUFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudCBhCi1ub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bwotcmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5Ci1wZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kCi1vYmplY3QgY29kZSBmb3JtLjwvZGl2PgotCi08ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogMmVtIj5iKSBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzCi1BZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQgYQotbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgcGF0ZW50IGxpY2Vuc2UgdW5kZXIKLUxpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQgYW5kCi1vdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluCi1zb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseQotdG8gdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUKLXRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZCBieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YKLXRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24gdG8gYmUgY292ZXJlZCBieSB0aGUKLUxpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8gYW55IG90aGVyCi1jb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci48L2Rpdj4KLQotPGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDJlbSI+YykgUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQKLWFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMgQ29udHJpYnV0aW9ucwotc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCi10aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55Ci1saWFiaWxpdHkgdG8gUmVjaXBpZW50IGZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkCi1vbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEKLWNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kIGxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLAotZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eSB0byBzZWN1cmUgYW55Ci1vdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwgaWYKLWEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvCi1kaXN0cmlidXRlIHRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlCi10aGF0IGxpY2Vuc2UgYmVmb3JlIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L2Rpdj4KLQotPGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDJlbSI+ZCkgRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQKLXRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0IHJpZ2h0cyBpbiBpdHMKLUNvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCi10aGlzIEFncmVlbWVudC48L2Rpdj4KLQotPHAgc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkIj4zLiBSRVFVSVJFTUVOVFM8L3A+Ci0KLTxwPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGluIG9iamVjdAotY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9wPgotCi08ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogMmVtIj5hKSBpdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQKLWNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvZGl2PgotCi08ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogMmVtIj5iKSBpdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9kaXY+Ci0KLTxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OiAyZW0iPmkpIGVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YKLWFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kIGNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kCi1pbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlIGFuZAotbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mCi1tZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOzwvZGl2PgotCi08ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogMmVtIj5paSkgZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mCi1hbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBkaXJlY3QsCi1pbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoIGFzCi1sb3N0IHByb2ZpdHM7PC9kaXY+Ci0KLTxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OiAyZW0iPmlpaSkgc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2gKLWRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQgQ29udHJpYnV0b3IgYWxvbmUKLWFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L2Rpdj4KLQotPGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDJlbSI+aXYpIHN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUKLVByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kIGluZm9ybXMgbGljZW5zZWVzCi1ob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhIG1lZGl1bQotY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPC9kaXY+Ci0KLTxwPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlIGNvZGUgZm9ybTo8L3A+Ci0KLTxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OiAyZW0iPmEpIGl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIKLXRoaXMgQWdyZWVtZW50OyBhbmQ8L2Rpdj4KLQotPGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDJlbSI+YikgYSBjb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUKLWluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLjwvZGl2PgotCi08cD5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55IGNvcHlyaWdodCBub3RpY2VzCi1jb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLjwvcD4KLQotPHA+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUgb3JpZ2luYXRvciBvZiBpdHMKLUNvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzIHN1YnNlcXVlbnQKLVJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi48L3A+Ci0KLTxwIHN0eWxlPSJmb250LXdlaWdodDogYm9sZCI+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3A+Ci0KLTxwPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heSBhY2NlcHQgY2VydGFpbgotcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycyBhbmQKLXRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUKLWNvbW1lcmNpYWwgdXNlIG9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIKLXdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwgbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuCi1UaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgiQ29tbWVyY2lhbCBDb250cmlidXRvciIpCi1oZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyIENvbnRyaWJ1dG9yCi0oIkluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIikgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZCBjb3N0cwotKGNvbGxlY3RpdmVseSAiTG9zc2VzIikgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCi1sZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZAotQ29udHJpYnV0b3IgdG8gdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2gKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4gY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcwotc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMgcmVsYXRpbmcgdG8gYW55IGFjdHVhbAotb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlciB0byBxdWFsaWZ5LAotYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kIGFueSByZWxhdGVkIHNldHRsZW1lbnQKLW5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZSBpbiBhbnkKLXN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvcD4KLQotPHA+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUgUHJvZ3JhbSBpbiBhCi1jb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzCi1wZXJmb3JtYW5jZSBjbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLAotdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMgc2VjdGlvbiwgdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQotb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAotd2FycmFudGllcywgYW5kIGlmIGEgY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheQotYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlCi1kYW1hZ2VzLjwvcD4KLQotPHAgc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkIj41LiBOTyBXQVJSQU5UWTwvcD4KLQotPHA+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTCi1QUk9WSURFRCBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRgotQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sCi1BTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAotTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudAotaXMgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nCi1hbmQgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGgKLWl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBidXQgbm90Ci1saW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsIGNvbXBsaWFuY2Ugd2l0aAotYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvciBlcXVpcG1lbnQsCi1hbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuPC9wPgotCi08cCBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQiPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9wPgotCi08cD5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgTkVJVEhFUgotUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IgQU5ZCi1ESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLURBTUFHRVMgKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQKLUFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCi1MSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgotQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gT1IgVEhFCi1FWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCi1QT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9wPgotCi08cCBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQiPjcuIEdFTkVSQUw8L3A+Ci0KLTxwPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlCi11bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQKLXdpdGhvdXQgZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbAotYmUgcmVmb3JtZWQgdG8gdGhlIG1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uCi12YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9wPgotCi08cD5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGEgQ29udHJpYnV0b3IKLXdpdGggcmVzcGVjdCB0byBhIHBhdGVudCBhcHBsaWNhYmxlIHRvIHNvZnR3YXJlIChpbmNsdWRpbmcgYQotY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCksIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotZ3JhbnRlZCBieSB0aGF0IENvbnRyaWJ1dG9yIHRvIHN1Y2ggUmVjaXBpZW50IHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1zaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiBJbgotYWRkaXRpb24sIGlmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55Ci1lbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUKLVByb2dyYW0gd2l0aCBvdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MKLXBhdGVudChzKSwgdGhlbiBzdWNoIFJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKQotc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC48L3A+Ci0KLTxwPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgc2hhbGwgdGVybWluYXRlIGlmCi1pdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yIGNvbmRpdGlvbnMgb2YKLXRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKLXBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsCi1SZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzCi10byBjZWFzZSB1c2UgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkKLXByYWN0aWNhYmxlLiBIb3dldmVyLCBSZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudAotYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5IFJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbAotY29udGludWUgYW5kIHN1cnZpdmUuPC9wPgotCi08cD5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhpcwotQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZQotQWdyZWVtZW50IFN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zCi0oaW5jbHVkaW5nIHJldmlzaW9ucykgb2YgdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZQotb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzIHRoZSByaWdodCB0byBtb2RpZnkgdGhpcwotQWdyZWVtZW50LiBJQk0gaXMgdGhlIGluaXRpYWwgQWdyZWVtZW50IFN0ZXdhcmQuIElCTSBtYXkgYXNzaWduIHRoZQotcmVzcG9uc2liaWxpdHkgdG8gc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUKLXNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYQotZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtIChpbmNsdWRpbmcKLUNvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldwotdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvCi1kaXN0cmlidXRlIHRoZSBQcm9ncmFtIChpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcKLXZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkIGluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikKLWFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvIHRoZSBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgotZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZQotUHJvZ3JhbSBub3QgZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlCi1yZXNlcnZlZC48L3A+Ci0KLTxwPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZSBTdGF0ZSBvZiBOZXcgWW9yawotYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhLgotTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2gKLXBhcnR5IHdhaXZlcyBpdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nCi1saXRpZ2F0aW9uLjwvcD4KLTwvYm9keT4KLTwvaHRtbD4KLQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZl8yLjAuMC9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZl8yLjAuMC9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGUzZTAyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWZfMi4wLjAvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWZfMi4wLjAvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZl8yLjAuMC9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjOTQ3YTQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZl8yLjAuMC9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyAvKioKLSMgICogPGNvcHlyaWdodD4KLSMgICoKLSMgICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotIyAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyAgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotIyAgKiAKLSMgICogQ29udHJpYnV0b3JzOiAKLSMgICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgICoKLSMgICogPC9jb3B5cmlnaHQ+Ci0jICAqCi0jICAqICRJZDogZmVhdHVyZS5wcm9wZXJ0aWVzLHYgMS4xIDIwMDQvMTAvMTggMTU6NTA6NDIgZGJpcnNhbiBFeHAgJAotIyAgKi8KLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgRG8gbm90IGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlIGxhc3QgbGluZSBjb250YWluaW5nOgotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgSW5zdGVhZCwgZWl0aGVyIHJlZGVmaW5lIGFuIGV4aXN0aW5nIHByb3BlcnR5LCBvciBjcmVhdGUgYSBuZXcgcHJvcGVydHksCi0jIGFwcGVuZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLCBhbmQgY2hhbmdlIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IG5hbWUuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jIFRoaXMgZmlsZSBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9RWNsaXBzZSBNb2RlbGluZyBGcmFtZXdvcmsgKEVNRikKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPUVjbGlwc2Uub3JnIHVwZGF0ZSBzaXRlCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1FY2xpcHNlIE1vZGVsaW5nIEZyYW1ld29yay4gKEJpbmFyeSBydW50aW1lKQotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFLk9SRyBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotMTR0aCBBdWd1c3QsIDIwMDNcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1FQ0xJUFNFLk9SRyBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSBFY2xpcHNlLm9yZ1xuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQ29tbW9uIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkNQTCIpLiBBIGNvcHkgb2YgdGhlIENQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBDUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLUNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50c1xuXAotKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS4gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvclxuXAotbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlXG5cCi1QbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCBhIEZlYXR1cmUuIFBsdWctaW5zIGFuZCBGcmFnbWVudHNcblwKLWFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIG5hbWVkICJwbHVnaW5zIiBhbmQgRmVhdHVyZXMgYXJlIGxvY2F0ZWQgaW5cblwKLWRpcmVjdG9yaWVzIG5hbWVkICJmZWF0dXJlcyIuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gU3ViZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IEVjbGlwc2Uub3JnIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIENQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IEVjbGlwc2Uub3JnIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgVGhlIGFib3ZlIHByb3BlcnRpZXMgaGF2ZSBiZWVuIHNoaXBwZWQgZm9yIHRyYW5zbGF0aW9uLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyAic2Vjb25kYXJ5VXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSBzZWNvbmRhcnkgdXBkYXRlIHNpdGUgKG9uIGRvd25sb2FkLmVjbGlwc2Uub3JnKQotc2Vjb25kYXJ5VXBkYXRlU2l0ZU5hbWU9RU1GL1NETy9YU0QgU2Vjb25kYXJ5IFVwZGF0ZSBTaXRlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mXzIuMC4wL2ZlYXR1cmUueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZl8yLjAuMC9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ1OWYzNy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mXzIuMC4wL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZiIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIyLjAuMCIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiCi0gICAgICBpbWFnZT0iZWNsaXBzZV91cGRhdGVfMTIwLmpwZyI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodCB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj4KLSAgICAgIENvcHlyaWdodCAoYykgMjAwMi0yMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly91cGRhdGUuZWNsaXBzZS5vcmcvdXBkYXRlcy8iLz4KLSAgICAgIDxkaXNjb3ZlcnkgbGFiZWw9IiVzZWNvbmRhcnlVcGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvdG9vbHMvZW1mL3VwZGF0ZXMvIi8+Ci0gICA8L3VybD4KLQotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzIiB2ZXJzaW9uPSIzLjAuMCIgbWF0Y2g9ImNvbXBhdGlibGUiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMi4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi5jb2RlZ2VuIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjIuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYuY29kZWdlbi51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIyLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLmNvZGVnZW4uZWNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMi4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi5jb2RlZ2VuLmVjb3JlLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjIuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYuY29tbW9uIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjIuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjIuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMi4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5lZGl0IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjIuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZWRpdG9yIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjIuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuY2hhbmdlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjIuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuY2hhbmdlLmVkaXQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMi4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMi4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi5lZGl0IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjIuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYuZWRpdC51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIyLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLm1hcHBpbmciCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMi4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi5tYXBwaW5nLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjIuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYubWFwcGluZy5lY29yZTJlY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIyLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLm1hcHBpbmcuZWNvcmUyZWNvcmUuZWRpdG9yIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjIuMC4wIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWZfMi4wLjAvbGljZW5zZS5odG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZl8yLjAuMC9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3YTVlMTguLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZl8yLjAuMC9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iSFRNTCBUaWR5LCBzZWUgd3d3LnczLm9yZyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIKLWNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIiAvPgotPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPSJibHVlIiB2bGluaz0icHVycGxlIj4KLTxoMj5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci0KLTxwPjE0dGggQXVndXN0LCAyMDAzPC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPkVDTElQU0UuT1JHIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04KLUFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkKLSJDT05URU5UIikuIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5ECi1DT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YKLUxJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWQotVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTCi1HT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWQotQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRAotQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMKLUFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UKLUFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZCi1OT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLQotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPgotCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkKLUVjbGlwc2Uub3JnIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLXRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJDUEwiKS4gQSBjb3B5IG9mIHRoZSBDUEwgaXMKLXByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YQotaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgQ1BMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0Ci1jb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZwotQ1ZTIHJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUKLWF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS48L3A+Ci0KLTxwPkNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluCi1mcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS4gQSBGZWF0dXJlIGlzIGEKLWJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkCi1tYXRlcmlhbC4gRmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzCi1hbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQKLXdpdGggYSBGZWF0dXJlLiBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzCi1uYW1lZCAicGx1Z2lucyIgYW5kIEZlYXR1cmVzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIG5hbWVkCi0iZmVhdHVyZXMiLjwvcD4KLQotPHA+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuCi1GaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kCi12ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9wPgotCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkCi1iZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmQKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4KLUFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEKLURvd25sb2FkIG9yIE1vZHVsZSBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nCi1sb2NhdGlvbnM6PC9wPgotCi08dWw+Ci08bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLQotPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLQotPGxpPlN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbgotUGx1Zy1pbnM8L2xpPgotCi08bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgRWNsaXBzZS5vcmcgaXMgaW5zdGFsbGVkCi11c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlCi0oIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUKLUZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlCi1zaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZwotdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4KLUZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mCi1maWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMgYW5kCi1GZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IKLXJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YKLXRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkKLVJFRkVSIFRPIFRIRSBDUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORAotQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVAotQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YQotaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotCi08bGk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxhCi1ocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+Ci1odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4KLQotPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhCi1ocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+Ci1odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KLQotPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YQotaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORAotQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlCi1MaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0Ci1FY2xpcHNlLm9yZyB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdAotcGFydGljdWxhciBDb250ZW50LjwvcD4KLQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+Ci0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2gKLXlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLAotYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24KLXNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUKLWNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZgotdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotPC9ib2R5PgotPC9odG1sPgotCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamR0LWZlYXR1cmUvLnByb2plY3QgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamR0LWZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3MmI4MjIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpkdC1mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuamR0LWZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamR0LWZlYXR1cmUvY3BsLXYxMC5odG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpkdC1mZWF0dXJlL2NwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZhYTIwOC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamR0LWZlYXR1cmUvY3BsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotPEhFQUQ+Ci08VElUTEU+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L1RJVExFPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IiNGRkZGRkYiIFZMSU5LPSIjODAwMDAwIj4KLQotCi08UCBBTElHTj0iQ0VOVEVSIj48Qj5Db21tb24gUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvQj4KLTxQPjxCPjwvQj48Rk9OVCBTSVpFPSIzIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIzIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSIFRIRSBURVJNUyBPRiBUSElTIENPTU1PTiBQVUJMSUMgTElDRU5TRSAoIkFHUkVFTUVOVCIpLiAgQU5ZIFVTRSwgUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFIE9GIFRISVMgQUdSRUVNRU5ULjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjxCPjEuICBERUZJTklUSU9OUzwvQj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj4iQ29udHJpYnV0aW9uIiBtZWFuczo8L0ZPTlQ+Ci0KLTxVTD48Rk9OVCBTSVpFPSIyIj5hKSBpbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbiBkaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPEJSIENMRUFSPSJMRUZUIj4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+aSkJIAljaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+aWkpCQlhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPndoZXJlIHN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQgYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPkEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IgaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24gc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5Db250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSB3aGljaDogIChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBQcm9ncmFtLiAgPC9GT05UPjwvVUw+Ci0KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPiJDb250cmlidXRvciIgbWVhbnMgYW55IHBlcnNvbiBvciBlbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+IkxpY2Vuc2VkIFBhdGVudHMgIiBtZWFuIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZSBvciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiAgPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj4iUHJvZ3JhbSIgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMgZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50LjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPiJSZWNpcGllbnQiIG1lYW5zIGFueW9uZSB3aG8gcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjxCPjwvQj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48Qj4yLiAgR1JBTlQgT0YgUklHSFRTPC9CPjwvRk9OVD4KLQotPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5hKQk8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+U3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50czwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiNGRjAwMDAiPiA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPmIpIAlTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDA4MDAwIj4gPC9GT05UPjxGT05UIFNJWkU9IjIiPnJveWFsdHktZnJlZSBwYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0IGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiAgVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQgYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24gdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8gYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uICBObyBoYXJkd2FyZSBwZXIgc2UgaXMgbGljZW5zZWQgaGVyZXVuZGVyLiAgIDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+YykJUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cyBDb250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvciB0aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiAgRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQgZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiAgQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZCBsaWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eSB0byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuICBGb3IgZXhhbXBsZSwgaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmQpCUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0IHJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4gdGhpcyBBZ3JlZW1lbnQuIDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KLQotPFA+PEZPTlQgU0laRT0iMiI+PEI+My4gIFJFUVVJUkVNRU5UUzwvQj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48Qj48L0I+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0OjwvRk9OVD4KLQotPFVMPjxGT05UIFNJWkU9IjIiPmEpCWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+YikJaXRzIGxpY2Vuc2UgYWdyZWVtZW50OjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5pKQllZmZlY3RpdmVseSBkaXNjbGFpbXM8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZCBjb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlIGFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmlpKSAJZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaCBhcyBsb3N0IHByb2ZpdHM7IDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5paWkpPC9GT05UPjxGT05UIFNJWkU9IjIiPglzdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0IENvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+aXYpCXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQgaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDAwMEZGIj4gPC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjRkYwMDAwIj48L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiNGRjAwMDAiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KLQotPFA+PEZPTlQgU0laRT0iMiI+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UgY29kZSBmb3JtOjwvRk9OVD4KLQotPFVMPjxGT05UIFNJWkU9IjIiPmEpCWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+YikJYSBjb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uICA8L0ZPTlQ+PC9VTD4KLQotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDAwMEZGIj48U1RSSUtFPjwvU1RSSUtFPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDAwMEZGIj48U1RSSUtFPjwvU1RSSUtFPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55IGNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uICA8L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZSBvcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cyBzdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gIDwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjxCPjQuICBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvQj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkgYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycyBhbmQgdGhlIGxpa2UuICBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2Ugb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwgbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuICAgVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgiQ29tbWVyY2lhbCBDb250cmlidXRvciIpIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIgQ29udHJpYnV0b3IgKCJJbmRlbW5pZmllZCBDb250cmlidXRvciIpIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQgY29zdHMgKGNvbGxlY3RpdmVseSAiTG9zc2VzIikgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyIGxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvIHRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4gY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcuICBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcyByZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gIEluIG9yZGVyIHRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB0byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZCBhbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUgaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhIENvbW1lcmNpYWwgQ29udHJpYnV0b3IuICBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZSBjbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiAgVW5kZXIgdGhpcyBzZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUgb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYSBjb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iIzAwMDBGRiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDAwRkYiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48Qj41LiAgTk8gV0FSUkFOVFk8L0I+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzPC9GT05UPjxGT05UIFNJWkU9IjIiPiBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+dGhlIFByb2dyYW08L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudDwvRk9OVD48Rk9OVCBTSVpFPSIyIj4sIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywgY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgPC9GT05UPjxGT05UIFNJWkU9IjIiPnByb2dyYW1zIG9yIGVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zPC9GT05UPjxGT05UIFNJWkU9IjIiPi4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PEI+Ni4gIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9CPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgPC9GT05UPjxGT05UIFNJWkU9IjIiPihJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksPC9GT05UPjxGT05UIFNJWkU9IjIiPiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjxCPjcuICBHRU5FUkFMPC9CPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0IGZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlIG1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGEgQ29udHJpYnV0b3Igd2l0aCByZXNwZWN0IHRvIGEgcGF0ZW50IGFwcGxpY2FibGUgdG8gc29mdHdhcmUgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpLCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMgZ3JhbnRlZCBieSB0aGF0IENvbnRyaWJ1dG9yIHRvIHN1Y2ggUmVjaXBpZW50IHVuZGVyIHRoaXMgQWdyZWVtZW50IHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuICBJbiBhZGRpdGlvbiwgaWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoIG90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaCBSZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlIHBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gIElmIGFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gIEhvd2V2ZXIsIFJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieSBSZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcyBjb3B5cmlnaHRlZCAgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50IFN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5wdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YgdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj50aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzIHRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIElCTSBpcyB0aGUgaW5pdGlhbCBBZ3JlZW1lbnQgU3Rld2FyZC4gICBJQk0gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8gc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPkVhY2ggbmV3IHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBUaGUgUHJvZ3JhbSAoaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgPC9GT05UPjxGT05UIFNJWkU9IjIiPnZlcnNpb24uICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+RXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQgaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0byB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlciBleHByZXNzbHksIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5ieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlPC9GT05UPjxGT05UIFNJWkU9IjIiPi48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+ICBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdCBleHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlIFN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzIEFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gIEVhY2ggcGFydHkgd2FpdmVzIGl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotCi08L0JPRFk+Ci0KLTwvSFRNTD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamR0LWZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZHQtZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGUzZTAyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZHQtZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpkdC1mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZHQtZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmZDNlMjMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpkdC1mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9RWNsaXBzZSBKYXZhIERldmVsb3BtZW50IFRvb2xzCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1FY2xpcHNlLm9yZyB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249RWNsaXBzZSBKYXZhIGRldmVsb3BtZW50IHRvb2xzLiAoQmluYXJ5IHJ1bnRpbWUgYW5kIHVzZXIgZG9jdW1lbnRhdGlvbi4pCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UuT1JHIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi0xNXRoIEp1bmUsIDIwMDRcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1FQ0xJUFNFLk9SRyBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSBFY2xpcHNlLm9yZ1xuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQ29tbW9uIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkNQTCIpLiBBIGNvcHkgb2YgdGhlIENQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBDUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLUNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50c1xuXAotKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS4gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvclxuXAotbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlXG5cCi1QbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCBhIEZlYXR1cmUuIFBsdWctaW5zIGFuZCBGcmFnbWVudHNcblwKLWFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIG5hbWVkICJwbHVnaW5zIiBhbmQgRmVhdHVyZXMgYXJlIGxvY2F0ZWQgaW5cblwKLWRpcmVjdG9yaWVzIG5hbWVkICJmZWF0dXJlcyIuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gU3ViZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IEVjbGlwc2Uub3JnIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIENQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IEVjbGlwc2Uub3JnIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpkdC1mZWF0dXJlL2ZlYXR1cmUueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpkdC1mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjBiNTMwLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZHQtZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZHQiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMy4xLjAiCi0gICAgICBpbWFnZT0gImVjbGlwc2VfdXBkYXRlXzEyMC5qcGciCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8bGljZW5zZSB1cmw9IiVsaWNlbnNlVVJMIj4KLSAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vdXBkYXRlLmVjbGlwc2Uub3JnL3VwZGF0ZXMvMy4wIi8+Ci0gICAgICA8ZGlzY292ZXJ5IGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL3VwZGF0ZS5lY2xpcHNlLm9yZy91cGRhdGVzLzMuMCIvPgotICAgPC91cmw+Ci0KLSAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnBsYXRmb3JtIiB2ZXJzaW9uPSIzLjEuMCIgbWF0Y2g9ImNvbXBhdGlibGUiIC8+Ci0gIDwvcmVxdWlyZXM+Ci0gIAotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpkdCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjEuMCI+Ci0gICA8L3BsdWdpbj4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmFudC51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjEuMCI+Ci0gICA8L3BsdWdpbj4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMS4wIj4KLSAgIDwvcGx1Z2luPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UubHRrLnVpLnJlZmFjdG9yaW5nIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMS4wIj4KLSAgIDwvcGx1Z2luPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4xLjAiPgotICAgPC9wbHVnaW4+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZHQuZGVidWcudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4xLjAiPgotICAgPC9wbHVnaW4+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZHQuZGVidWciCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4xLjAiPgotICAgPC9wbHVnaW4+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZHQuanVuaXQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4xLjAiPgotICAgPC9wbHVnaW4+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZHQuanVuaXQucnVudGltZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjEuMCI+Ci0gICA8L3BsdWdpbj4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmciCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4xLjAiPgotICAgPC9wbHVnaW4+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZHQudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4xLjAiPgotICAgPC9wbHVnaW4+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuanVuaXQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy44LjEiPgotICAgPC9wbHVnaW4+Ci0KLSAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpkdC5kb2MudXNlciIgdmVyc2lvbj0iMy4xLjAiLz4KLQotICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5tYWNvc3giIHZlcnNpb249IjMuMS4wIiAgb3M9Im1hY29zeCIgd3M9ImNhcmJvbiIvPiAgCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamR0LWZlYXR1cmUvbGljZW5zZS5odG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpkdC1mZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdkODUwMC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamR0LWZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPgotPGgyPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPjE1PHN1cD50aDwvc3VwPiBKdW5lLCAyMDA0PC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPkVDTElQU0UuT1JHIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+Ci0gICAKLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4gICAKLSAgIAotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IEVjbGlwc2Uub3JnIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCZxdW90O0NQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIENQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgQ1BMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gQ1ZTCi0gICBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLQotPHA+Q29udGVudCBtYXkgYmUgYXBwb3J0aW9uZWQgaW50byBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiBGaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCBhIEZlYXR1cmUuICAgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcwotICAgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90OyBhbmQgRmVhdHVyZXMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuPC9wPgotICAKLTxwPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gRmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvcD4KLSAgCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgotCi08dWw+Ci0JPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0JPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLQk8bGk+U3ViZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0JPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQkJCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgRWNsaXBzZS5vcmcgaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIENQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KLQotPHVsPgotCTxsaT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0JPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQotCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLTwvdWw+Ci0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgRWNsaXBzZS5vcmcgdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KLQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+Ci0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamR0LnNvdXJjZS1mZWF0dXJlLy5wcm9qZWN0IGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpkdC5zb3VyY2UtZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVhZjE4NC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamR0LnNvdXJjZS1mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuamR0LnNvdXJjZS1mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpkdC5zb3VyY2UtZmVhdHVyZS9jcGwtdjEwLmh0bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamR0LnNvdXJjZS1mZWF0dXJlL2NwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTU4ZDk5Yy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamR0LnNvdXJjZS1mZWF0dXJlL2NwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLTxIRUFEPgotPFRJVExFPkNvbW1vbiBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9USVRMRT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSIjRkZGRkZGIiBWTElOSz0iIzgwMDAwMCI+Ci0KLQotPFAgQUxJR049IkNFTlRFUiI+PEI+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L0I+Ci08UD48Qj48L0I+PEZPTlQgU0laRT0iMyI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMyI+PC9GT05UPjxGT05UIFNJWkU9IjIiPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUiBUSEUgVEVSTVMgT0YgVEhJUyBDT01NT04gUFVCTElDIExJQ0VOU0UgKCJBR1JFRU1FTlQiKS4gIEFOWSBVU0UsIFJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRSBPRiBUSElTIEFHUkVFTUVOVC48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48Qj4xLiAgREVGSU5JVElPTlM8L0I+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+IkNvbnRyaWJ1dGlvbiIgbWVhbnM6PC9GT05UPgotCi08VUw+PEZPTlQgU0laRT0iMiI+YSkgaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24gZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxCUiBDTEVBUj0iTEVGVCI+Ci1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmkpCSAJY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmlpKQkJYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj53aGVyZSBzdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkIGJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5BIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yIGlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uIHN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+Q29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gd2hpY2g6ICAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgUHJvZ3JhbS4gIDwvRk9OVD48L1VMPgotCi08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj4iQ29udHJpYnV0b3IiIG1lYW5zIGFueSBwZXJzb24gb3IgZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPiJMaWNlbnNlZCBQYXRlbnRzICIgbWVhbiBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2Ugb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gIDwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IlByb2dyYW0iIG1lYW5zIHRoZSBDb250cmlidXRpb25zIGRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj4iUmVjaXBpZW50IiBtZWFucyBhbnlvbmUgd2hvIHJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48Qj48L0I+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PEI+Mi4gIEdSQU5UIE9GIFJJR0hUUzwvQj48L0ZPTlQ+Ci0KLTxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+YSkJPC9GT05UPjxGT05UIFNJWkU9IjIiPlN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHM8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IFJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjRkYwMDAwIj4gPC9GT05UPjxGT05UIFNJWkU9IjIiPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS48L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5iKSAJU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+UmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDwvRk9OVD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iIzAwODAwMCI+IDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5yb3lhbHR5LWZyZWUgcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkIGJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uIHRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuICBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvIGFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiAgTm8gaGFyZHdhcmUgcGVyIHNlIGlzIGxpY2Vuc2VkIGhlcmV1bmRlci4gICA8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmMpCVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMgQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IgdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50IGZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQgbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkgdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiAgRm9yIGV4YW1wbGUsIGlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZSBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5kKQlFYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodCByaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluIHRoaXMgQWdyZWVtZW50LiA8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjwvVUw+Ci0KLTxQPjxGT05UIFNJWkU9IjIiPjxCPjMuICBSRVFVSVJFTUVOVFM8L0I+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PEI+PC9CPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L0ZPTlQ+Ci0KLTxVTD48Rk9OVCBTSVpFPSIyIj5hKQlpdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmIpCWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+aSkJZWZmZWN0aXZlbHkgZGlzY2xhaW1zPC9GT05UPjxGT05UIFNJWkU9IjIiPiBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQgY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZSBhbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5paSkgCWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2ggYXMgbG9zdCBwcm9maXRzOyA8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+aWlpKTwvRk9OVD48Rk9OVCBTSVpFPSIyIj4Jc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdCBDb250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPml2KQlzdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kIGluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjwvRk9OVD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iIzAwMDBGRiI+IDwvRk9OVD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iI0ZGMDAwMCI+PC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjRkYwMDAwIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPjwvVUw+Ci0KLTxQPjxGT05UIFNJWkU9IjIiPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlIGNvZGUgZm9ybTo8L0ZPTlQ+Ci0KLTxVTD48Rk9OVCBTSVpFPSIyIj5hKQlpdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmIpCWEgY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiAgPC9GT05UPjwvVUw+Ci0KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iIzAwMDBGRiI+PFNUUklLRT48L1NUUklLRT48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iIzAwMDBGRiI+PFNUUklLRT48L1NUUklLRT48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueSBjb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiAgPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUgb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3Mgc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uICA8L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48Qj40LiAgQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L0I+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5IGFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMgYW5kIHRoZSBsaWtlLiAgV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlIG9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsIGxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiAgIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoIkNvbW1lcmNpYWwgQ29udHJpYnV0b3IiKSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyIENvbnRyaWJ1dG9yICgiSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IiKSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kIGNvc3RzIChjb2xsZWN0aXZlbHkgIkxvc3NlcyIpIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlciBsZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0byB0aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluIGNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLiAgVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMgcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuICBJbiBvcmRlciB0byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQgYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuICBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlIGluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguICBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yLiAgSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UgY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gIFVuZGVyIHRoaXMgc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlIG90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEgY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDAwRkYiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDAwMEZGIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PEI+NS4gIE5PIFdBUlJBTlRZPC9CPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpczwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgPC9GT05UPjxGT05UIFNJWkU9IjIiPnRoZSBQcm9ncmFtPC9GT05UPjxGT05UIFNJWkU9IjIiPiBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+LCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsIGNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5wcm9ncmFtcyBvciBlcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9uczwvRk9OVD48Rk9OVCBTSVpFPSIyIj4uICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjxCPjYuICBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvQj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj4oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLDwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48Qj43LiAgR0VORVJBTDwvQj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dCBmdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZSBtaW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhIENvbnRyaWJ1dG9yIHdpdGggcmVzcGVjdCB0byBhIHBhdGVudCBhcHBsaWNhYmxlIHRvIHNvZnR3YXJlIChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzIGdyYW50ZWQgYnkgdGhhdCBDb250cmlidXRvciB0byBzdWNoIFJlY2lwaWVudCB1bmRlciB0aGlzIEFncmVlbWVudCBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiAgSW4gYWRkaXRpb24sIGlmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aCBvdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2ggUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZSBwZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuICBJZiBhbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuICBIb3dldmVyLCBSZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkgUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMgY29weXJpZ2h0ZWQgIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudCBTdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+cHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mIHRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+dGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcyB0aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBJQk0gaXMgdGhlIGluaXRpYWwgQWdyZWVtZW50IFN0ZXdhcmQuICAgSUJNIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvIHNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5FYWNoIG5ldyB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiAgVGhlIFByb2dyYW0gKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAoaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IDwvRk9OVD48Rk9OVCBTSVpFPSIyIj52ZXJzaW9uLiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPkV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkIGluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8gdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIgZXhwcmVzc2x5LCA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+YnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZTwvRk9OVD48Rk9OVCBTSVpFPSIyIj4uPC9GT05UPjxGT05UIFNJWkU9IjIiPiAgQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QgZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZSBTdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcyBBZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuICBFYWNoIHBhcnR5IHdhaXZlcyBpdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLQotPC9CT0RZPgotCi08L0hUTUw+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamR0LnNvdXJjZS1mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamR0LnNvdXJjZS1mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4ZTNlMDIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpkdC5zb3VyY2UtZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpkdC5zb3VyY2UtZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamR0LnNvdXJjZS1mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhlMWQxMS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamR0LnNvdXJjZS1mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9RWNsaXBzZSBKRFQgUGx1Zy1pbiBEZXZlbG9wZXIgUmVzb3VyY2VzCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1FY2xpcHNlLm9yZyB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249QVBJIGRvY3VtZW50YXRpb24gYW5kIHNvdXJjZSBjb2RlIHppcHMgZm9yIEVjbGlwc2UgSmF2YSBkZXZlbG9wbWVudCB0b29scy4KLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRS5PUkcgU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLTE1dGggSnVuZSwgMjAwNFxuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLUVDTElQU0UuT1JHIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IEVjbGlwc2Uub3JnXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBDb21tb24gUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiQ1BMIikuIEEgY29weSBvZiB0aGUgQ1BMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIENQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotQ29udGVudCBtYXkgYmUgYXBwb3J0aW9uZWQgaW50byBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzXG5cCi0oIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLiBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yXG5cCi1tb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGVcblwKLVBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIGEgRmVhdHVyZS4gUGx1Zy1pbnMgYW5kIEZyYWdtZW50c1xuXAotYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgbmFtZWQgInBsdWdpbnMiIGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpblxuXAotZGlyZWN0b3JpZXMgbmFtZWQgImZlYXR1cmVzIi5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBTdWJkaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgRWNsaXBzZS5vcmcgaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgQ1BMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgRWNsaXBzZS5vcmcgdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamR0LnNvdXJjZS1mZWF0dXJlL2ZlYXR1cmUueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpkdC5zb3VyY2UtZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM2YWM4Ni4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamR0LnNvdXJjZS1mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlIHByaW1hcnk9ImZhbHNlIiAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIgIGltYWdlPSJlY2xpcHNlX3VwZGF0ZV8xMjAuanBnIiBpZD0ib3JnLmVjbGlwc2UuamR0LnNvdXJjZSIgIHZlcnNpb249IjMuMS4wIj4KLQk8ZGVzY3JpcHRpb24gPgotCQklZGVzY3JpcHRpb24KLQk8L2Rlc2NyaXB0aW9uPgotCTxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotCQklbGljZW5zZQotCTwvbGljZW5zZT4KLQk8dXJsPgotCQk8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL3VwZGF0ZS5lY2xpcHNlLm9yZy91cGRhdGVzLzMuMCIvPgotCQk8ZGlzY292ZXJ5IGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL3VwZGF0ZS5lY2xpcHNlLm9yZy91cGRhdGVzLzMuMCIvPgotCTwvdXJsPgotCTxwbHVnaW4gICAgZnJhZ21lbnQ9ImZhbHNlIiAgZG93bmxvYWQtc2l6ZT0iMCIgaW5zdGFsbC1zaXplPSIwIiBpZD0ib3JnLmVjbGlwc2UuamR0LmRvYy5pc3YiIHZlcnNpb249IjMuMS4wIi8+Ci0JPHBsdWdpbiAgICBmcmFnbWVudD0iZmFsc2UiICBkb3dubG9hZC1zaXplPSIwIiBpbnN0YWxsLXNpemU9IjAiIGlkPSJvcmcuZWNsaXBzZS5qZHQuc291cmNlIiB2ZXJzaW9uPSIzLjEuMCIvPgotCTxwbHVnaW4gd3M9ImNhcmJvbiIgIG9zPSJtYWNvc3giIGZyYWdtZW50PSJ0cnVlIiBhcmNoPSJwcGMiIGRvd25sb2FkLXNpemU9IjAiIGluc3RhbGwtc2l6ZT0iMCIgaWQ9Im9yZy5lY2xpcHNlLmpkdC5zb3VyY2UubWFjb3N4LmNhcmJvbi5wcGMiIHZlcnNpb249IjMuMS4wIi8+Ci08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamR0LnNvdXJjZS1mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZHQuc291cmNlLWZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2Q4NTAwLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZHQuc291cmNlLWZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPgotPGgyPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPjE1PHN1cD50aDwvc3VwPiBKdW5lLCAyMDA0PC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPkVDTElQU0UuT1JHIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+Ci0gICAKLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4gICAKLSAgIAotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IEVjbGlwc2Uub3JnIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCZxdW90O0NQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIENQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgQ1BMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gQ1ZTCi0gICBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLQotPHA+Q29udGVudCBtYXkgYmUgYXBwb3J0aW9uZWQgaW50byBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiBGaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCBhIEZlYXR1cmUuICAgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcwotICAgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90OyBhbmQgRmVhdHVyZXMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuPC9wPgotICAKLTxwPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gRmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvcD4KLSAgCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgotCi08dWw+Ci0JPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0JPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLQk8bGk+U3ViZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0JPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQkJCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgRWNsaXBzZS5vcmcgaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIENQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KLQotPHVsPgotCTxsaT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0JPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQotCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLTwvdWw+Ci0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgRWNsaXBzZS5vcmcgdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KLQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+Ci0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGRlLWZlYXR1cmUvLnByb2plY3QgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGRlLWZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyM2EyNGQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnBkZS1mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UucGRlLWZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGRlLWZlYXR1cmUvY3BsLXYxMC5odG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnBkZS1mZWF0dXJlL2NwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZhYTIwOC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGRlLWZlYXR1cmUvY3BsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotPEhFQUQ+Ci08VElUTEU+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L1RJVExFPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IiNGRkZGRkYiIFZMSU5LPSIjODAwMDAwIj4KLQotCi08UCBBTElHTj0iQ0VOVEVSIj48Qj5Db21tb24gUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvQj4KLTxQPjxCPjwvQj48Rk9OVCBTSVpFPSIzIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIzIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSIFRIRSBURVJNUyBPRiBUSElTIENPTU1PTiBQVUJMSUMgTElDRU5TRSAoIkFHUkVFTUVOVCIpLiAgQU5ZIFVTRSwgUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFIE9GIFRISVMgQUdSRUVNRU5ULjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjxCPjEuICBERUZJTklUSU9OUzwvQj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj4iQ29udHJpYnV0aW9uIiBtZWFuczo8L0ZPTlQ+Ci0KLTxVTD48Rk9OVCBTSVpFPSIyIj5hKSBpbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbiBkaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPEJSIENMRUFSPSJMRUZUIj4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+aSkJIAljaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+aWkpCQlhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPndoZXJlIHN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQgYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPkEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IgaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24gc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5Db250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSB3aGljaDogIChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBQcm9ncmFtLiAgPC9GT05UPjwvVUw+Ci0KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPiJDb250cmlidXRvciIgbWVhbnMgYW55IHBlcnNvbiBvciBlbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+IkxpY2Vuc2VkIFBhdGVudHMgIiBtZWFuIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZSBvciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiAgPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj4iUHJvZ3JhbSIgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMgZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50LjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPiJSZWNpcGllbnQiIG1lYW5zIGFueW9uZSB3aG8gcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjxCPjwvQj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48Qj4yLiAgR1JBTlQgT0YgUklHSFRTPC9CPjwvRk9OVD4KLQotPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5hKQk8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+U3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50czwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiNGRjAwMDAiPiA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPmIpIAlTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDA4MDAwIj4gPC9GT05UPjxGT05UIFNJWkU9IjIiPnJveWFsdHktZnJlZSBwYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0IGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiAgVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQgYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24gdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8gYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uICBObyBoYXJkd2FyZSBwZXIgc2UgaXMgbGljZW5zZWQgaGVyZXVuZGVyLiAgIDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+YykJUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cyBDb250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvciB0aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiAgRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQgZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiAgQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZCBsaWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eSB0byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuICBGb3IgZXhhbXBsZSwgaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmQpCUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0IHJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4gdGhpcyBBZ3JlZW1lbnQuIDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KLQotPFA+PEZPTlQgU0laRT0iMiI+PEI+My4gIFJFUVVJUkVNRU5UUzwvQj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48Qj48L0I+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0OjwvRk9OVD4KLQotPFVMPjxGT05UIFNJWkU9IjIiPmEpCWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+YikJaXRzIGxpY2Vuc2UgYWdyZWVtZW50OjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5pKQllZmZlY3RpdmVseSBkaXNjbGFpbXM8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZCBjb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlIGFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmlpKSAJZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaCBhcyBsb3N0IHByb2ZpdHM7IDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5paWkpPC9GT05UPjxGT05UIFNJWkU9IjIiPglzdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0IENvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+aXYpCXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQgaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDAwMEZGIj4gPC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjRkYwMDAwIj48L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiNGRjAwMDAiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KLQotPFA+PEZPTlQgU0laRT0iMiI+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UgY29kZSBmb3JtOjwvRk9OVD4KLQotPFVMPjxGT05UIFNJWkU9IjIiPmEpCWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+YikJYSBjb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uICA8L0ZPTlQ+PC9VTD4KLQotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDAwMEZGIj48U1RSSUtFPjwvU1RSSUtFPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDAwMEZGIj48U1RSSUtFPjwvU1RSSUtFPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55IGNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uICA8L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZSBvcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cyBzdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gIDwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjxCPjQuICBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvQj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkgYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycyBhbmQgdGhlIGxpa2UuICBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2Ugb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwgbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuICAgVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgiQ29tbWVyY2lhbCBDb250cmlidXRvciIpIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIgQ29udHJpYnV0b3IgKCJJbmRlbW5pZmllZCBDb250cmlidXRvciIpIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQgY29zdHMgKGNvbGxlY3RpdmVseSAiTG9zc2VzIikgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyIGxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvIHRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4gY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcuICBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcyByZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gIEluIG9yZGVyIHRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB0byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZCBhbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUgaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhIENvbW1lcmNpYWwgQ29udHJpYnV0b3IuICBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZSBjbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiAgVW5kZXIgdGhpcyBzZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUgb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYSBjb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iIzAwMDBGRiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDAwRkYiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48Qj41LiAgTk8gV0FSUkFOVFk8L0I+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzPC9GT05UPjxGT05UIFNJWkU9IjIiPiBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+dGhlIFByb2dyYW08L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudDwvRk9OVD48Rk9OVCBTSVpFPSIyIj4sIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywgY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgPC9GT05UPjxGT05UIFNJWkU9IjIiPnByb2dyYW1zIG9yIGVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zPC9GT05UPjxGT05UIFNJWkU9IjIiPi4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PEI+Ni4gIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9CPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgPC9GT05UPjxGT05UIFNJWkU9IjIiPihJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksPC9GT05UPjxGT05UIFNJWkU9IjIiPiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjxCPjcuICBHRU5FUkFMPC9CPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0IGZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlIG1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGEgQ29udHJpYnV0b3Igd2l0aCByZXNwZWN0IHRvIGEgcGF0ZW50IGFwcGxpY2FibGUgdG8gc29mdHdhcmUgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpLCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMgZ3JhbnRlZCBieSB0aGF0IENvbnRyaWJ1dG9yIHRvIHN1Y2ggUmVjaXBpZW50IHVuZGVyIHRoaXMgQWdyZWVtZW50IHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuICBJbiBhZGRpdGlvbiwgaWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoIG90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaCBSZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlIHBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gIElmIGFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gIEhvd2V2ZXIsIFJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieSBSZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcyBjb3B5cmlnaHRlZCAgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50IFN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5wdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YgdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj50aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzIHRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIElCTSBpcyB0aGUgaW5pdGlhbCBBZ3JlZW1lbnQgU3Rld2FyZC4gICBJQk0gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8gc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPkVhY2ggbmV3IHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBUaGUgUHJvZ3JhbSAoaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgPC9GT05UPjxGT05UIFNJWkU9IjIiPnZlcnNpb24uICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+RXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQgaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0byB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlciBleHByZXNzbHksIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5ieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlPC9GT05UPjxGT05UIFNJWkU9IjIiPi48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+ICBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdCBleHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlIFN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzIEFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gIEVhY2ggcGFydHkgd2FpdmVzIGl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotCi08L0JPRFk+Ci0KLTwvSFRNTD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGRlLWZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wZGUtZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGUzZTAyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wZGUtZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnBkZS1mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wZGUtZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1YmI1ODcuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnBkZS1mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9RWNsaXBzZSBQbHVnLWluIERldmVsb3BtZW50IEVudmlyb25tZW50Ci0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1FY2xpcHNlLm9yZyB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249RWNsaXBzZSBwbHVnLWluIGRldmVsb3BtZW50IGVudmlyb25tZW50LgotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFLk9SRyBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotMTV0aCBKdW5lLCAyMDA0XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotRUNMSVBTRS5PUkcgTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgRWNsaXBzZS5vcmdcblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIENvbW1vbiBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJDUEwiKS4gQSBjb3B5IG9mIHRoZSBDUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgQ1BMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi1Db250ZW50IG1heSBiZSBhcHBvcnRpb25lZCBpbnRvIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHNcblwKLSgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3JcblwKLW1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZVxuXAotUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiBQbHVnLWlucyBhbmQgRnJhZ21lbnRzXG5cCi1hcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAicGx1Z2lucyIgYW5kIEZlYXR1cmVzIGFyZSBsb2NhdGVkIGluXG5cCi1kaXJlY3RvcmllcyBuYW1lZCAiZmVhdHVyZXMiLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIFN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSBFY2xpcHNlLm9yZyBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBDUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCBFY2xpcHNlLm9yZyB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wZGUtZmVhdHVyZS9mZWF0dXJlLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wZGUtZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQyMjI2Ni4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGRlLWZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5wZGUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMy4xLjAiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgICAgaW1hZ2U9ImVjbGlwc2VfdXBkYXRlXzEyMC5qcGciPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vdXBkYXRlLmVjbGlwc2Uub3JnL3VwZGF0ZXMvMy4wIi8+Ci0gICAgICA8ZGlzY292ZXJ5IGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL3VwZGF0ZS5lY2xpcHNlLm9yZy91cGRhdGVzLzMuMCIvPgotICAgPC91cmw+Ci0KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZHQiIHZlcnNpb249IjMuMC4wIiBtYXRjaD0iY29tcGF0aWJsZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnBsYXRmb3JtIiB2ZXJzaW9uPSIzLjAuMCIgbWF0Y2g9ImNvbXBhdGlibGUiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wZGUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4xLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnBkZS5idWlsZCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjEuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UucGRlLmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4xLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnBkZS5qdW5pdC5ydW50aW1lIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMS4wIi8+Ci0gICAgICAgICAKLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wZGUucnVudGltZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjEuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UucGRlLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMS4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wZGUuZG9jLnVzZXIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4xLjAiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnBkZS1mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wZGUtZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3ZDg1MDAuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnBkZS1mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4KLTxoMj5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD4xNTxzdXA+dGg8L3N1cD4gSnVuZSwgMjAwNDwvcD4KLQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgotCi08cD5FQ0xJUFNFLk9SRyBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotICAgCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+ICAgCi0gICAKLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSBFY2xpcHNlLm9yZyBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtDUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBDUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIENQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIENWUwotICAgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+Ci0KLTxwPkNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLiBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mICB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiAgIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMKLSAgIG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsgYW5kIEZlYXR1cmVzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LjwvcD4KLSAgCi08cD5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIEZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L3A+Ci0gIAotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0JPGxpPlN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgotCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+Ci0JCQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IEVjbGlwc2Uub3JnIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7LgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBDUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLQk8bGk+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkKLQk8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IEVjbGlwc2Uub3JnIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnBkZS5zb3VyY2UtZmVhdHVyZS8ucHJvamVjdCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wZGUuc291cmNlLWZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0YmNlN2IuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnBkZS5zb3VyY2UtZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5zb3VyY2UtZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wZGUuc291cmNlLWZlYXR1cmUvY3BsLXYxMC5odG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnBkZS5zb3VyY2UtZmVhdHVyZS9jcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2YWEyMDguLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnBkZS5zb3VyY2UtZmVhdHVyZS9jcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci08SEVBRD4KLTxUSVRMRT5Db21tb24gUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvVElUTEU+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0iI0ZGRkZGRiIgVkxJTks9IiM4MDAwMDAiPgotCi0KLTxQIEFMSUdOPSJDRU5URVIiPjxCPkNvbW1vbiBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9CPgotPFA+PEI+PC9CPjxGT05UIFNJWkU9IjMiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjMiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIgVEhFIFRFUk1TIE9GIFRISVMgQ09NTU9OIFBVQkxJQyBMSUNFTlNFICgiQUdSRUVNRU5UIikuICBBTlkgVVNFLCBSRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UgT0YgVEhJUyBBR1JFRU1FTlQuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PEI+MS4gIERFRklOSVRJT05TPC9CPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPiJDb250cmlidXRpb24iIG1lYW5zOjwvRk9OVD4KLQotPFVMPjxGT05UIFNJWkU9IjIiPmEpIGluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uIGRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8QlIgQ0xFQVI9IkxFRlQiPgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5pKQkgCWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5paSkJCWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+d2hlcmUgc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZCBieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+QSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvciBpZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbiBzdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPkNvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIHdoaWNoOiAgKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFByb2dyYW0uICA8L0ZPTlQ+PC9VTD4KLQotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+IkNvbnRyaWJ1dG9yIiBtZWFucyBhbnkgcGVyc29uIG9yIGVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj4iTGljZW5zZWQgUGF0ZW50cyAiIG1lYW4gcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlIG9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uICA8L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPiJQcm9ncmFtIiBtZWFucyB0aGUgQ29udHJpYnV0aW9ucyBkaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+IlJlY2lwaWVudCIgbWVhbnMgYW55b25lIHdobyByZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PEI+PC9CPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjxCPjIuICBHUkFOVCBPRiBSSUdIVFM8L0I+PC9GT05UPgotCi08VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPmEpCTwvRk9OVD48Rk9OVCBTSVpFPSIyIj5TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzPC9GT05UPjxGT05UIFNJWkU9IjIiPiBSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzwvRk9OVD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iI0ZGMDAwMCI+IDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+YikgCVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgPC9GT05UPjxGT05UIFNJWkU9IjIiPlJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDgwMDAiPiA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+cm95YWx0eS1mcmVlIHBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uICBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZCBieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbiB0byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiAgVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0byBhbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gIE5vIGhhcmR3YXJlIHBlciBzZSBpcyBsaWNlbnNlZCBoZXJldW5kZXIuICAgPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5jKQlSZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzIENvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yIHRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuICBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudCBmb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuICBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kIGxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5IHRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gIEZvciBleGFtcGxlLCBpZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+ZCkJRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQgcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbiB0aGlzIEFncmVlbWVudC4gPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48L1VMPgotCi08UD48Rk9OVCBTSVpFPSIyIj48Qj4zLiAgUkVRVUlSRU1FTlRTPC9CPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjxCPjwvQj5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9GT05UPgotCi08VUw+PEZPTlQgU0laRT0iMiI+YSkJaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5iKQlpdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmkpCWVmZmVjdGl2ZWx5IGRpc2NsYWltczwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kIGNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUgYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+aWkpIAllZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoIGFzIGxvc3QgcHJvZml0czsgPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmlpaSk8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+CXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQgQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5pdikJc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZCBpbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDAwRkYiPiA8L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiNGRjAwMDAiPjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iI0ZGMDAwMCI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48L1VMPgotCi08UD48Rk9OVCBTSVpFPSIyIj5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZSBjb2RlIGZvcm06PC9GT05UPgotCi08VUw+PEZPTlQgU0laRT0iMiI+YSkJaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5iKQlhIGNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gIDwvRk9OVD48L1VMPgotCi08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDAwRkYiPjxTVFJJS0U+PC9TVFJJS0U+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDAwRkYiPjxTVFJJS0U+PC9TVFJJS0U+PC9GT05UPjxGT05UIFNJWkU9IjIiPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkgY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gIDwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlIG9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzIHN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiAgPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PEI+NC4gIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9CPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heSBhY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzIGFuZCB0aGUgbGlrZS4gIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZSBvZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbCBsaWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gICBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCJDb21tZXJjaWFsIENvbnRyaWJ1dG9yIikgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlciBDb250cmlidXRvciAoIkluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIikgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZCBjb3N0cyAoY29sbGVjdGl2ZWx5ICJMb3NzZXMiKSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIgbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8gdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiBjb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZy4gIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzIHJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiAgSW4gb3JkZXIgdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kIGFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiAgVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZSBpbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiAgVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEgQ29tbWVyY2lhbCBDb250cmlidXRvci4gIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlIGNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuICBVbmRlciB0aGlzIHNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZSBvdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhIGNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDAwMEZGIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iIzAwMDBGRiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjxCPjUuICBOTyBXQVJSQU5UWTwvQj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXM8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj50aGUgUHJvZ3JhbTwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50PC9GT05UPjxGT05UIFNJWkU9IjIiPiwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLCBjb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+cHJvZ3JhbXMgb3IgZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnM8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+LiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48Qj42LiAgRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L0I+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+KElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSw8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PEI+Ny4gIEdFTkVSQUw8L0I+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQgZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUgbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYSBDb250cmlidXRvciB3aXRoIHJlc3BlY3QgdG8gYSBwYXRlbnQgYXBwbGljYWJsZSB0byBzb2Z0d2FyZSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCksIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcyBncmFudGVkIGJ5IHRoYXQgQ29udHJpYnV0b3IgdG8gc3VjaCBSZWNpcGllbnQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gIEluIGFkZGl0aW9uLCBpZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGggb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoIFJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCBzaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvciBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUgcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiAgSWYgYWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiAgSG93ZXZlciwgUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5IFJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzIGNvcHlyaWdodGVkICBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQgU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gPC9GT05UPjxGT05UIFNJWkU9IjIiPnB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZiB0aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gPC9GT05UPjxGT05UIFNJWkU9IjIiPnRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMgdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gSUJNIGlzIHRoZSBpbml0aWFsIEFncmVlbWVudCBTdGV3YXJkLiAgIElCTSBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0byBzZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+RWFjaCBuZXcgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIFRoZSBQcm9ncmFtIChpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+dmVyc2lvbi4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5FeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZCBpbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyIGV4cHJlc3NseSwgPC9GT05UPjxGT05UIFNJWkU9IjIiPmJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2U8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+LjwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90IGV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUgU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMgQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiAgRWFjaCBwYXJ0eSB3YWl2ZXMgaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci0KLTwvQk9EWT4KLQotPC9IVE1MPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wZGUuc291cmNlLWZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wZGUuc291cmNlLWZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhlM2UwMi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGRlLnNvdXJjZS1mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGRlLnNvdXJjZS1mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wZGUuc291cmNlLWZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2Q1MGI3Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wZGUuc291cmNlLWZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1FY2xpcHNlIFBERSBQbHVnLWluIERldmVsb3BlciBSZXNvdXJjZXMKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPUVjbGlwc2Uub3JnIHVwZGF0ZSBzaXRlCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1FY2xpcHNlIHBsdWctaW4gZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQsIGluY2x1ZGluZyBkb2N1bWVudGF0aW9uIGFuZCBzb3VyY2UgY29kZSB6aXBzLgotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFLk9SRyBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotMTV0aCBKdW5lLCAyMDA0XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotRUNMSVBTRS5PUkcgTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgRWNsaXBzZS5vcmdcblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIENvbW1vbiBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJDUEwiKS4gQSBjb3B5IG9mIHRoZSBDUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgQ1BMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi1Db250ZW50IG1heSBiZSBhcHBvcnRpb25lZCBpbnRvIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHNcblwKLSgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3JcblwKLW1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZVxuXAotUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiBQbHVnLWlucyBhbmQgRnJhZ21lbnRzXG5cCi1hcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAicGx1Z2lucyIgYW5kIEZlYXR1cmVzIGFyZSBsb2NhdGVkIGluXG5cCi1kaXJlY3RvcmllcyBuYW1lZCAiZmVhdHVyZXMiLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIFN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSBFY2xpcHNlLm9yZyBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBDUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCBFY2xpcHNlLm9yZyB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wZGUuc291cmNlLWZlYXR1cmUvZmVhdHVyZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGRlLnNvdXJjZS1mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWJiYmM3Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wZGUuc291cmNlLWZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUgcHJpbWFyeT0iZmFsc2UiICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIiAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIiAgaW1hZ2U9ImVjbGlwc2VfdXBkYXRlXzEyMC5qcGciIGlkPSJvcmcuZWNsaXBzZS5wZGUuc291cmNlIiAgdmVyc2lvbj0iMy4xLjAiPgotCTxkZXNjcmlwdGlvbiA+Ci0JCSVkZXNjcmlwdGlvbgotCTwvZGVzY3JpcHRpb24+Ci0JPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0JCSVsaWNlbnNlCi0JPC9saWNlbnNlPgotCTx1cmw+Ci0JCTx1cGRhdGUgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vdXBkYXRlLmVjbGlwc2Uub3JnL3VwZGF0ZXMvMy4wIi8+Ci0JCTxkaXNjb3ZlcnkgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vdXBkYXRlLmVjbGlwc2Uub3JnL3VwZGF0ZXMvMy4wIi8+Ci0JPC91cmw+Ci0JPHBsdWdpbiAgICBmcmFnbWVudD0iZmFsc2UiICBkb3dubG9hZC1zaXplPSIwIiBpbnN0YWxsLXNpemU9IjAiIGlkPSJvcmcuZWNsaXBzZS5wZGUuc291cmNlIiB2ZXJzaW9uPSIzLjEuMCIvPgotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnBkZS5zb3VyY2UtZmVhdHVyZS9saWNlbnNlLmh0bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGRlLnNvdXJjZS1mZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdkODUwMC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGRlLnNvdXJjZS1mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4KLTxoMj5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD4xNTxzdXA+dGg8L3N1cD4gSnVuZSwgMjAwNDwvcD4KLQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgotCi08cD5FQ0xJUFNFLk9SRyBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotICAgCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+ICAgCi0gICAKLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSBFY2xpcHNlLm9yZyBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtDUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBDUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIENQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIENWUwotICAgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+Ci0KLTxwPkNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLiBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mICB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiAgIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMKLSAgIG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsgYW5kIEZlYXR1cmVzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LjwvcD4KLSAgCi08cD5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIEZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L3A+Ci0gIAotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0JPGxpPlN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgotCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+Ci0JCQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IEVjbGlwc2Uub3JnIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7LgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBDUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLQk8bGk+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkKLQk8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IEVjbGlwc2Uub3JnIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnBsYXRmb3JtLWZlYXR1cmUvLnByb2plY3QgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGxhdGZvcm0tZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWY1M2M3MC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGxhdGZvcm0tZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnBsYXRmb3JtLWZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGxhdGZvcm0tZmVhdHVyZS9jcGwtdjEwLmh0bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGxhdGZvcm0tZmVhdHVyZS9jcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2YWEyMDguLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnBsYXRmb3JtLWZlYXR1cmUvY3BsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotPEhFQUQ+Ci08VElUTEU+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L1RJVExFPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IiNGRkZGRkYiIFZMSU5LPSIjODAwMDAwIj4KLQotCi08UCBBTElHTj0iQ0VOVEVSIj48Qj5Db21tb24gUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvQj4KLTxQPjxCPjwvQj48Rk9OVCBTSVpFPSIzIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIzIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSIFRIRSBURVJNUyBPRiBUSElTIENPTU1PTiBQVUJMSUMgTElDRU5TRSAoIkFHUkVFTUVOVCIpLiAgQU5ZIFVTRSwgUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFIE9GIFRISVMgQUdSRUVNRU5ULjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjxCPjEuICBERUZJTklUSU9OUzwvQj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj4iQ29udHJpYnV0aW9uIiBtZWFuczo8L0ZPTlQ+Ci0KLTxVTD48Rk9OVCBTSVpFPSIyIj5hKSBpbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbiBkaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPEJSIENMRUFSPSJMRUZUIj4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+aSkJIAljaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+aWkpCQlhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPndoZXJlIHN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQgYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPkEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IgaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24gc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5Db250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSB3aGljaDogIChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBQcm9ncmFtLiAgPC9GT05UPjwvVUw+Ci0KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPiJDb250cmlidXRvciIgbWVhbnMgYW55IHBlcnNvbiBvciBlbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+IkxpY2Vuc2VkIFBhdGVudHMgIiBtZWFuIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZSBvciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiAgPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj4iUHJvZ3JhbSIgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMgZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50LjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPiJSZWNpcGllbnQiIG1lYW5zIGFueW9uZSB3aG8gcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjxCPjwvQj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48Qj4yLiAgR1JBTlQgT0YgUklHSFRTPC9CPjwvRk9OVD4KLQotPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5hKQk8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+U3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50czwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiNGRjAwMDAiPiA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPmIpIAlTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDA4MDAwIj4gPC9GT05UPjxGT05UIFNJWkU9IjIiPnJveWFsdHktZnJlZSBwYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0IGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiAgVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQgYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24gdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8gYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uICBObyBoYXJkd2FyZSBwZXIgc2UgaXMgbGljZW5zZWQgaGVyZXVuZGVyLiAgIDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+YykJUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cyBDb250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvciB0aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiAgRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQgZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiAgQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZCBsaWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eSB0byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuICBGb3IgZXhhbXBsZSwgaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmQpCUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0IHJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4gdGhpcyBBZ3JlZW1lbnQuIDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KLQotPFA+PEZPTlQgU0laRT0iMiI+PEI+My4gIFJFUVVJUkVNRU5UUzwvQj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48Qj48L0I+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0OjwvRk9OVD4KLQotPFVMPjxGT05UIFNJWkU9IjIiPmEpCWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+YikJaXRzIGxpY2Vuc2UgYWdyZWVtZW50OjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5pKQllZmZlY3RpdmVseSBkaXNjbGFpbXM8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZCBjb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlIGFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmlpKSAJZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaCBhcyBsb3N0IHByb2ZpdHM7IDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5paWkpPC9GT05UPjxGT05UIFNJWkU9IjIiPglzdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0IENvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+aXYpCXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQgaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDAwMEZGIj4gPC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjRkYwMDAwIj48L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiNGRjAwMDAiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KLQotPFA+PEZPTlQgU0laRT0iMiI+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UgY29kZSBmb3JtOjwvRk9OVD4KLQotPFVMPjxGT05UIFNJWkU9IjIiPmEpCWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+YikJYSBjb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uICA8L0ZPTlQ+PC9VTD4KLQotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDAwMEZGIj48U1RSSUtFPjwvU1RSSUtFPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDAwMEZGIj48U1RSSUtFPjwvU1RSSUtFPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55IGNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uICA8L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZSBvcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cyBzdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gIDwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjxCPjQuICBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvQj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkgYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycyBhbmQgdGhlIGxpa2UuICBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2Ugb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwgbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuICAgVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgiQ29tbWVyY2lhbCBDb250cmlidXRvciIpIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIgQ29udHJpYnV0b3IgKCJJbmRlbW5pZmllZCBDb250cmlidXRvciIpIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQgY29zdHMgKGNvbGxlY3RpdmVseSAiTG9zc2VzIikgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyIGxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvIHRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4gY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcuICBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcyByZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gIEluIG9yZGVyIHRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB0byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZCBhbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUgaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhIENvbW1lcmNpYWwgQ29udHJpYnV0b3IuICBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZSBjbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiAgVW5kZXIgdGhpcyBzZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUgb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYSBjb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iIzAwMDBGRiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDAwRkYiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48Qj41LiAgTk8gV0FSUkFOVFk8L0I+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzPC9GT05UPjxGT05UIFNJWkU9IjIiPiBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+dGhlIFByb2dyYW08L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudDwvRk9OVD48Rk9OVCBTSVpFPSIyIj4sIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywgY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgPC9GT05UPjxGT05UIFNJWkU9IjIiPnByb2dyYW1zIG9yIGVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zPC9GT05UPjxGT05UIFNJWkU9IjIiPi4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PEI+Ni4gIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9CPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgPC9GT05UPjxGT05UIFNJWkU9IjIiPihJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksPC9GT05UPjxGT05UIFNJWkU9IjIiPiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjxCPjcuICBHRU5FUkFMPC9CPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0IGZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlIG1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGEgQ29udHJpYnV0b3Igd2l0aCByZXNwZWN0IHRvIGEgcGF0ZW50IGFwcGxpY2FibGUgdG8gc29mdHdhcmUgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpLCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMgZ3JhbnRlZCBieSB0aGF0IENvbnRyaWJ1dG9yIHRvIHN1Y2ggUmVjaXBpZW50IHVuZGVyIHRoaXMgQWdyZWVtZW50IHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuICBJbiBhZGRpdGlvbiwgaWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoIG90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaCBSZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlIHBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gIElmIGFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gIEhvd2V2ZXIsIFJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieSBSZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcyBjb3B5cmlnaHRlZCAgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50IFN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5wdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YgdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj50aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzIHRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIElCTSBpcyB0aGUgaW5pdGlhbCBBZ3JlZW1lbnQgU3Rld2FyZC4gICBJQk0gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8gc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPkVhY2ggbmV3IHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBUaGUgUHJvZ3JhbSAoaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgPC9GT05UPjxGT05UIFNJWkU9IjIiPnZlcnNpb24uICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+RXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQgaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0byB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlciBleHByZXNzbHksIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5ieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlPC9GT05UPjxGT05UIFNJWkU9IjIiPi48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+ICBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdCBleHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlIFN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzIEFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gIEVhY2ggcGFydHkgd2FpdmVzIGl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotCi08L0JPRFk+Ci0KLTwvSFRNTD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGxhdGZvcm0tZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnBsYXRmb3JtLWZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhlM2UwMi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGxhdGZvcm0tZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnBsYXRmb3JtLWZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnBsYXRmb3JtLWZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWQ5ODllLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wbGF0Zm9ybS1mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9RWNsaXBzZSBQbGF0Zm9ybQotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9RWNsaXBzZS5vcmcgdXBkYXRlIHNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPUNvbW1vbiBPUy1pbmRlcGVuZGVudCBiYXNlIG9mIHRoZSBFY2xpcHNlIHBsYXRmb3JtLiAoQmluYXJ5IHJ1bnRpbWUgYW5kIHVzZXIgZG9jdW1lbnRhdGlvbi4pCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UuT1JHIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi0xNXRoIEp1bmUsIDIwMDRcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1FQ0xJUFNFLk9SRyBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSBFY2xpcHNlLm9yZ1xuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQ29tbW9uIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkNQTCIpLiBBIGNvcHkgb2YgdGhlIENQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBDUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLUNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50c1xuXAotKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS4gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvclxuXAotbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlXG5cCi1QbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCBhIEZlYXR1cmUuIFBsdWctaW5zIGFuZCBGcmFnbWVudHNcblwKLWFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIG5hbWVkICJwbHVnaW5zIiBhbmQgRmVhdHVyZXMgYXJlIGxvY2F0ZWQgaW5cblwKLWRpcmVjdG9yaWVzIG5hbWVkICJmZWF0dXJlcyIuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gU3ViZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IEVjbGlwc2Uub3JnIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIENQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IEVjbGlwc2Uub3JnIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnBsYXRmb3JtLWZlYXR1cmUvZmVhdHVyZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGxhdGZvcm0tZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODcyZjVjYi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGxhdGZvcm0tZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM4NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAKLUluIHRoZSBmb2xsb3dpbmcgbWFya3VwLCBpZ25vcmUgdGhlICJwcmltYXJ5IiBhbmQgImFwcGxpY2F0aW9uIiBhdHRyaWJ1dGVzLgotU2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02ODM1MSBmb3IgbW9yZSBkZXRhaWxzLgotLS0+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLnBsYXRmb3JtIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjMuMS4wIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgICAgIHBsdWdpbj0iIgotICAgICAgaW1hZ2U9ImVjbGlwc2VfdXBkYXRlXzEyMC5qcGciCi0gICAgICBwcmltYXJ5PSJ0cnVlIgotICAgICAgYXBwbGljYXRpb249Im9yZy5lY2xpcHNlLnVpLmlkZS53b3JrYmVuY2giPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vdXBkYXRlLmVjbGlwc2Uub3JnL3VwZGF0ZXMvMy4wIi8+Ci0gICAgICA8ZGlzY292ZXJ5IGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL3VwZGF0ZS5lY2xpcHNlLm9yZy91cGRhdGVzLzMuMCIvPgotICAgPC91cmw+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuYXBhY2hlLmFudCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIxLjYuMiIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmFwYWNoZS5sdWNlbmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMS4zLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmFudC5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMS4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb21wYXJlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMS4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb3JlLmJvb3QiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4wLjAiLz4KLSAgICAgICAgIAotICAgPHBsdWdpbgotICAgCQkgaWQ9Im9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMiCi0gICAJCSBkb3dubG9hZC1zaXplPSIwIgotICAgCQkgaW5zdGFsbC1zaXplPSIwIgotICAgCQkgdmVyc2lvbj0iMy4xLjAiLz4KLSAgIAotICAgPHBsdWdpbgotICAgCQkgaWQ9Im9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMiCi0gICAJCSBkb3dubG9hZC1zaXplPSIwIgotICAgCQkgaW5zdGFsbC1zaXplPSIwIgotICAgCQkgdmVyc2lvbj0iMy4xLjAiLz4KLSAgIAotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMS4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4xLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb21wYXRpYmlsaXR5IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5vc2dpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMS4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5vc2dpLnV0aWwiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUudmFyaWFibGVzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMC4wIi8+Ci0gICAgICAgICAKLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMS4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5kZWJ1Zy51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjEuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuaGVscCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuaGVscC53ZWJhcHAiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmhlbHAuYmFzZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuaGVscC51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuaGVscC5hcHBzZXJ2ZXIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmhlbHAuaWRlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wbGF0Zm9ybSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjEuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UucGxhdGZvcm0uZG9jLnVzZXIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4xLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnNlYXJjaCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjEuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMS4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS50ZWFtLmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4xLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnRlYW0uY3ZzLmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4xLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnRlYW0uY3ZzLnNzaCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjEuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudGVhbS5jdnMuc3NoMiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjEuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudGVhbS5jdnMudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4xLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnRlYW0udWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4xLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnRvbWNhdCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSI0LjEuMzAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnRleHQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4xLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpmYWNlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMS4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZmFjZS50ZXh0IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMS4wIi8+Ci0JCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuY29uc29sZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjEuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkucHJlc2VudGF0aW9ucy5yMjEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4xLjAiLz4KLSAgICAgICAgICAgIAotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmludHJvIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMS4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5jaGVhdHNoZWV0cyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjAuMCIvPgotICAgICAgICAgICAgCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkud29ya2JlbmNoIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMS4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjEuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudmlld3MiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4xLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4xLjAiLz4KLSAgICAgICAgIAotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmZvcm1zIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMC4wIi8+Ci0gICAgICAgICAKLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjEuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjEuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuaWRlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMS4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLnNjaGVkdWxlciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMC4wIi8+Ci0gICAgICAgIAotICA8IS0tIFByZS0zLjAgYmluYXJ5IGNvbXBhdGliaWxpdHkgLS0+Ci0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkud29ya2JlbmNoLmNvbXBhdGliaWxpdHkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4xLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIvPgotCi0gIDwhLS1BaXggcGxhdGZvcm0gaW5jbHVzaW9uIC0tPgotICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5zd3QubW90aWYiIGRvd25sb2FkLXNpemU9IjAiIGluc3RhbGwtc2l6ZT0iMCIgdmVyc2lvbj0iMy4xLjAiIGZyYWdtZW50PSJ0cnVlIiBvcz0iYWl4IiB3cz0ibW90aWYiLz4KLSAgCi0gIDwhLS0gSFBVWCBQbGF0Zm9ybSBzcGVjaWZpY3MgLS0+Ci0gIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnN3dC5tb3RpZiIgZG93bmxvYWQtc2l6ZT0iMCIgaW5zdGFsbC1zaXplPSIwIiB2ZXJzaW9uPSIzLjEuMCIgZnJhZ21lbnQ9InRydWUiIG9zPSJocHV4IiB3cz0ibW90aWYiLz4KLSAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuaHB1eCIgZG93bmxvYWQtc2l6ZT0iMCIgaW5zdGFsbC1zaXplPSIwIiB2ZXJzaW9uPSIzLjAuMCIgZnJhZ21lbnQ9InRydWUiIG9zPSJocHV4Ii8+Ci0KLSAgPCEtLSBMSU5VWCBHVEstLT4gIAotICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5zd3QuZ3RrIiBkb3dubG9hZC1zaXplPSIwIiBpbnN0YWxsLXNpemU9IjAiIHZlcnNpb249IjMuMS4wIiAgZnJhZ21lbnQ9InRydWUiIG9zPSJsaW51eCIgd3M9Imd0ayIgYXJjaD0ieDg2IiAvPgotICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5zd3QuZ3RrIiBkb3dubG9hZC1zaXplPSIwIiBpbnN0YWxsLXNpemU9IjAiIHZlcnNpb249IjMuMS4wIiAgZnJhZ21lbnQ9InRydWUiIG9zPSJsaW51eCIgd3M9Imd0ayIgYXJjaD0icHBjIiAvPgotICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5saW51eCIgZG93bmxvYWQtc2l6ZT0iMCIgaW5zdGFsbC1zaXplPSIwIiB2ZXJzaW9uPSIzLjAuMCIgZnJhZ21lbnQ9InRydWUiIG9zPSJsaW51eCIvPgotICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5saW51eCIgZG93bmxvYWQtc2l6ZT0iMCIgaW5zdGFsbC1zaXplPSIwIiB2ZXJzaW9uPSIzLjAuMCIgZnJhZ21lbnQ9InRydWUiIG9zPSJsaW51eCIgLz4KLQotICA8IS0tIExJTlVYIEdUSyBBTUQ2NC0tPgotICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5zd3QuZ3RrNjQiIGRvd25sb2FkLXNpemU9IjAiIGluc3RhbGwtc2l6ZT0iMCIgdmVyc2lvbj0iMy4xLjAiICBmcmFnbWVudD0idHJ1ZSIgb3M9ImxpbnV4IiB3cz0iZ3RrIiBhcmNoPSJhbWQ2NCIgLz4KLQotICA8IS0tIExJTlVYIE1vdGlmLS0+ICAgIAotICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5zd3QubW90aWYiIGRvd25sb2FkLXNpemU9IjAiIGluc3RhbGwtc2l6ZT0iMCIgdmVyc2lvbj0iMy4xLjAiIGZyYWdtZW50PSJ0cnVlIiBvcz0ibGludXgiIHdzPSJtb3RpZiIvPgotICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5saW51eCIgZG93bmxvYWQtc2l6ZT0iMCIgaW5zdGFsbC1zaXplPSIwIiB2ZXJzaW9uPSIzLjAuMCIgZnJhZ21lbnQ9InRydWUiIG9zPSJsaW51eCIvPgotICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5saW51eCIgZG93bmxvYWQtc2l6ZT0iMCIgaW5zdGFsbC1zaXplPSIwIiB2ZXJzaW9uPSIzLjAuMCIgZnJhZ21lbnQ9InRydWUiIG9zPSJsaW51eCIgLz4KLQotICA8IS0tIE1hY09TIFggQ2FyYm9uIC0tPiAgCi0gIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnN3dC5jYXJib24iIGRvd25sb2FkLXNpemU9IjAiIGluc3RhbGwtc2l6ZT0iMCIgdmVyc2lvbj0iMy4xLjAiICBmcmFnbWVudD0idHJ1ZSIgb3M9Im1hY29zeCIgd3M9ImNhcmJvbiIvPiAKLSAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMubWFjb3N4IiBkb3dubG9hZC1zaXplPSIwIiBpbnN0YWxsLXNpemU9IjAiIHZlcnNpb249IjMuMC4wIiBmcmFnbWVudD0idHJ1ZSIgb3M9Im1hY29zeCIgd3M9ImNhcmJvbiIvPgotICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS51aS5jYXJib24iIGRvd25sb2FkLXNpemU9IjAiIGluc3RhbGwtc2l6ZT0iMCIgdmVyc2lvbj0iMy4xLjAiIGZyYWdtZW50PSJ0cnVlIiBvcz0ibWFjb3N4IiB3cz0iY2FyYm9uIi8+Ci0gIAotICA8IS0tIFFOWCBQaG90b24gLS0+Ci0gIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnN3dC5waG90b24iIGRvd25sb2FkLXNpemU9IjAiIGluc3RhbGwtc2l6ZT0iMCIgdmVyc2lvbj0iMy4xLjAiIGZyYWdtZW50PSJ0cnVlIiBvcz0icW54IiB3cz0icGhvdG9uIi8+Ci0gIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnFueCIgZG93bmxvYWQtc2l6ZT0iMCIgaW5zdGFsbC1zaXplPSIwIiB2ZXJzaW9uPSIzLjAuMCIgZnJhZ21lbnQ9InRydWUiIG9zPSJxbngiIHdzPSJwaG90b24iLz4KLSAgCi0gIDwhLS0gU29sYXJpcyBNb3RpZiAtLT4KLSAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uuc3d0Lm1vdGlmIiBkb3dubG9hZC1zaXplPSIwIiBpbnN0YWxsLXNpemU9IjAiIHZlcnNpb249IjMuMS4wIiBmcmFnbWVudD0idHJ1ZSIgb3M9InNvbGFyaXMiIHdzPSJtb3RpZiIvPgotICAKLSAgPCEtLSBXaW4zMiAtLT4KLSAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uuc3d0LndpbjMyIiBkb3dubG9hZC1zaXplPSIwIiBpbnN0YWxsLXNpemU9IjAiIHZlcnNpb249IjMuMS4wIiBmcmFnbWVudD0idHJ1ZSIgd3M9IndpbjMyIi8+Ci0gIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLndpbjMyIiBkb3dubG9hZC1zaXplPSIwIiBpbnN0YWxsLXNpemU9IjAiIHZlcnNpb249IjMuMC4wIiBmcmFnbWVudD0idHJ1ZSIgb3M9IndpbjMyIi8+Ci0gIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnVpLndpbjMyIiBkb3dubG9hZC1zaXplPSIwIiBpbnN0YWxsLXNpemU9IjAiIHZlcnNpb249IjMuMS4wIiBmcmFnbWVudD0idHJ1ZSIgd3M9IndpbjMyIi8+Ci0gIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLndpbjMyIiBkb3dubG9hZC1zaXplPSIwIiBpbnN0YWxsLXNpemU9IjAiIHZlcnNpb249IjMuMC4wIiBmcmFnbWVudD0idHJ1ZSIgb3M9IndpbjMyIi8+Ci08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGxhdGZvcm0tZmVhdHVyZS9saWNlbnNlLmh0bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGxhdGZvcm0tZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3ZDg1MDAuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnBsYXRmb3JtLWZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPgotPGgyPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPjE1PHN1cD50aDwvc3VwPiBKdW5lLCAyMDA0PC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPkVDTElQU0UuT1JHIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+Ci0gICAKLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4gICAKLSAgIAotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IEVjbGlwc2Uub3JnIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCZxdW90O0NQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIENQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgQ1BMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gQ1ZTCi0gICBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLQotPHA+Q29udGVudCBtYXkgYmUgYXBwb3J0aW9uZWQgaW50byBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiBGaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCBhIEZlYXR1cmUuICAgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcwotICAgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90OyBhbmQgRmVhdHVyZXMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuPC9wPgotICAKLTxwPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gRmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvcD4KLSAgCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgotCi08dWw+Ci0JPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0JPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLQk8bGk+U3ViZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0JPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQkJCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgRWNsaXBzZS5vcmcgaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIENQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KLQotPHVsPgotCTxsaT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0JPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQotCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLTwvdWw+Ci0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgRWNsaXBzZS5vcmcgdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KLQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+Ci0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGxhdGZvcm0uc291cmNlLWZlYXR1cmUvLnByb2plY3QgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGxhdGZvcm0uc291cmNlLWZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3Y2E0MGMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnBsYXRmb3JtLnNvdXJjZS1mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UucGxhdGZvcm0uc291cmNlLWZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGxhdGZvcm0uc291cmNlLWZlYXR1cmUvY3BsLXYxMC5odG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnBsYXRmb3JtLnNvdXJjZS1mZWF0dXJlL2NwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZhYTIwOC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGxhdGZvcm0uc291cmNlLWZlYXR1cmUvY3BsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotPEhFQUQ+Ci08VElUTEU+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L1RJVExFPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IiNGRkZGRkYiIFZMSU5LPSIjODAwMDAwIj4KLQotCi08UCBBTElHTj0iQ0VOVEVSIj48Qj5Db21tb24gUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvQj4KLTxQPjxCPjwvQj48Rk9OVCBTSVpFPSIzIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIzIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSIFRIRSBURVJNUyBPRiBUSElTIENPTU1PTiBQVUJMSUMgTElDRU5TRSAoIkFHUkVFTUVOVCIpLiAgQU5ZIFVTRSwgUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFIE9GIFRISVMgQUdSRUVNRU5ULjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjxCPjEuICBERUZJTklUSU9OUzwvQj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj4iQ29udHJpYnV0aW9uIiBtZWFuczo8L0ZPTlQ+Ci0KLTxVTD48Rk9OVCBTSVpFPSIyIj5hKSBpbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbiBkaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPEJSIENMRUFSPSJMRUZUIj4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+aSkJIAljaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+aWkpCQlhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPndoZXJlIHN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQgYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPkEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IgaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24gc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5Db250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSB3aGljaDogIChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBQcm9ncmFtLiAgPC9GT05UPjwvVUw+Ci0KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPiJDb250cmlidXRvciIgbWVhbnMgYW55IHBlcnNvbiBvciBlbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+IkxpY2Vuc2VkIFBhdGVudHMgIiBtZWFuIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZSBvciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiAgPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj4iUHJvZ3JhbSIgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMgZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50LjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPiJSZWNpcGllbnQiIG1lYW5zIGFueW9uZSB3aG8gcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjxCPjwvQj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48Qj4yLiAgR1JBTlQgT0YgUklHSFRTPC9CPjwvRk9OVD4KLQotPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5hKQk8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+U3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50czwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiNGRjAwMDAiPiA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPmIpIAlTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDA4MDAwIj4gPC9GT05UPjxGT05UIFNJWkU9IjIiPnJveWFsdHktZnJlZSBwYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0IGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiAgVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQgYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24gdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8gYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uICBObyBoYXJkd2FyZSBwZXIgc2UgaXMgbGljZW5zZWQgaGVyZXVuZGVyLiAgIDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+YykJUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cyBDb250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvciB0aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiAgRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQgZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiAgQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZCBsaWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eSB0byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuICBGb3IgZXhhbXBsZSwgaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmQpCUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0IHJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4gdGhpcyBBZ3JlZW1lbnQuIDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KLQotPFA+PEZPTlQgU0laRT0iMiI+PEI+My4gIFJFUVVJUkVNRU5UUzwvQj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48Qj48L0I+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0OjwvRk9OVD4KLQotPFVMPjxGT05UIFNJWkU9IjIiPmEpCWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+YikJaXRzIGxpY2Vuc2UgYWdyZWVtZW50OjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5pKQllZmZlY3RpdmVseSBkaXNjbGFpbXM8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZCBjb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlIGFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmlpKSAJZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaCBhcyBsb3N0IHByb2ZpdHM7IDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5paWkpPC9GT05UPjxGT05UIFNJWkU9IjIiPglzdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0IENvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+aXYpCXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQgaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDAwMEZGIj4gPC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjRkYwMDAwIj48L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiNGRjAwMDAiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KLQotPFA+PEZPTlQgU0laRT0iMiI+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UgY29kZSBmb3JtOjwvRk9OVD4KLQotPFVMPjxGT05UIFNJWkU9IjIiPmEpCWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+YikJYSBjb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uICA8L0ZPTlQ+PC9VTD4KLQotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDAwMEZGIj48U1RSSUtFPjwvU1RSSUtFPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDAwMEZGIj48U1RSSUtFPjwvU1RSSUtFPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55IGNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uICA8L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZSBvcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cyBzdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gIDwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjxCPjQuICBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvQj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkgYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycyBhbmQgdGhlIGxpa2UuICBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2Ugb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwgbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuICAgVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgiQ29tbWVyY2lhbCBDb250cmlidXRvciIpIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIgQ29udHJpYnV0b3IgKCJJbmRlbW5pZmllZCBDb250cmlidXRvciIpIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQgY29zdHMgKGNvbGxlY3RpdmVseSAiTG9zc2VzIikgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyIGxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvIHRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4gY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcuICBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcyByZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gIEluIG9yZGVyIHRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB0byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZCBhbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUgaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhIENvbW1lcmNpYWwgQ29udHJpYnV0b3IuICBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZSBjbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiAgVW5kZXIgdGhpcyBzZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUgb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYSBjb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iIzAwMDBGRiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDAwRkYiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48Qj41LiAgTk8gV0FSUkFOVFk8L0I+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzPC9GT05UPjxGT05UIFNJWkU9IjIiPiBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+dGhlIFByb2dyYW08L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudDwvRk9OVD48Rk9OVCBTSVpFPSIyIj4sIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywgY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgPC9GT05UPjxGT05UIFNJWkU9IjIiPnByb2dyYW1zIG9yIGVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zPC9GT05UPjxGT05UIFNJWkU9IjIiPi4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PEI+Ni4gIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9CPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgPC9GT05UPjxGT05UIFNJWkU9IjIiPihJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksPC9GT05UPjxGT05UIFNJWkU9IjIiPiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjxCPjcuICBHRU5FUkFMPC9CPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0IGZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlIG1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGEgQ29udHJpYnV0b3Igd2l0aCByZXNwZWN0IHRvIGEgcGF0ZW50IGFwcGxpY2FibGUgdG8gc29mdHdhcmUgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpLCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMgZ3JhbnRlZCBieSB0aGF0IENvbnRyaWJ1dG9yIHRvIHN1Y2ggUmVjaXBpZW50IHVuZGVyIHRoaXMgQWdyZWVtZW50IHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuICBJbiBhZGRpdGlvbiwgaWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoIG90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaCBSZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlIHBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gIElmIGFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gIEhvd2V2ZXIsIFJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieSBSZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcyBjb3B5cmlnaHRlZCAgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50IFN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5wdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YgdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj50aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzIHRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIElCTSBpcyB0aGUgaW5pdGlhbCBBZ3JlZW1lbnQgU3Rld2FyZC4gICBJQk0gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8gc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPkVhY2ggbmV3IHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBUaGUgUHJvZ3JhbSAoaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgPC9GT05UPjxGT05UIFNJWkU9IjIiPnZlcnNpb24uICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+RXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQgaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0byB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlciBleHByZXNzbHksIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5ieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlPC9GT05UPjxGT05UIFNJWkU9IjIiPi48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+ICBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdCBleHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlIFN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzIEFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gIEVhY2ggcGFydHkgd2FpdmVzIGl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotCi08L0JPRFk+Ci0KLTwvSFRNTD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGxhdGZvcm0uc291cmNlLWZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wbGF0Zm9ybS5zb3VyY2UtZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGUzZTAyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wbGF0Zm9ybS5zb3VyY2UtZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnBsYXRmb3JtLnNvdXJjZS1mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wbGF0Zm9ybS5zb3VyY2UtZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxODRlNGMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnBsYXRmb3JtLnNvdXJjZS1mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9RWNsaXBzZSBQbGF0Zm9ybSBQbHVnLWluIERldmVsb3BlciBSZXNvdXJjZXMKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPUVjbGlwc2Uub3JnIHVwZGF0ZSBzaXRlCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1Db21tb24gT1MtaW5kZXBlbmRlbnQgQVBJIGRvY3VtZW50YXRpb24gYW5kIHNvdXJjZSBjb2RlIHppcHMgZm9yIHRoZSBFY2xpcHNlIFBsYXRmb3JtLgotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFLk9SRyBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotMTV0aCBKdW5lLCAyMDA0XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotRUNMSVBTRS5PUkcgTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgRWNsaXBzZS5vcmdcblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIENvbW1vbiBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJDUEwiKS4gQSBjb3B5IG9mIHRoZSBDUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgQ1BMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi1Db250ZW50IG1heSBiZSBhcHBvcnRpb25lZCBpbnRvIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHNcblwKLSgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3JcblwKLW1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZVxuXAotUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiBQbHVnLWlucyBhbmQgRnJhZ21lbnRzXG5cCi1hcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAicGx1Z2lucyIgYW5kIEZlYXR1cmVzIGFyZSBsb2NhdGVkIGluXG5cCi1kaXJlY3RvcmllcyBuYW1lZCAiZmVhdHVyZXMiLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIFN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSBFY2xpcHNlLm9yZyBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBDUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCBFY2xpcHNlLm9yZyB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wbGF0Zm9ybS5zb3VyY2UtZmVhdHVyZS9mZWF0dXJlLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wbGF0Zm9ybS5zb3VyY2UtZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JkZWU0MC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGxhdGZvcm0uc291cmNlLWZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUgcHJpbWFyeT0iZmFsc2UiICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIiAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIiAgaW1hZ2U9ImVjbGlwc2VfdXBkYXRlXzEyMC5qcGciIGlkPSJvcmcuZWNsaXBzZS5wbGF0Zm9ybS5zb3VyY2UiICB2ZXJzaW9uPSIzLjEuMCI+Ci0JPGRlc2NyaXB0aW9uID4KLQkJJWRlc2NyaXB0aW9uCi0JPC9kZXNjcmlwdGlvbj4KLQk8bGljZW5zZSB1cmw9IiVsaWNlbnNlVVJMIj4KLQkJJWxpY2Vuc2UKLQk8L2xpY2Vuc2U+Ci0JPHVybD4KLQkJPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly91cGRhdGUuZWNsaXBzZS5vcmcvdXBkYXRlcy8zLjAiLz4KLQkJPGRpc2NvdmVyeSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly91cGRhdGUuZWNsaXBzZS5vcmcvdXBkYXRlcy8zLjAiLz4KLQk8L3VybD4KLQk8cGx1Z2luICAgIGZyYWdtZW50PSJmYWxzZSIgIGRvd25sb2FkLXNpemU9IjAiIGluc3RhbGwtc2l6ZT0iMCIgaWQ9Im9yZy5lY2xpcHNlLnBsYXRmb3JtLmRvYy5pc3YiIHZlcnNpb249IjMuMS4wIi8+Ci0JPHBsdWdpbiAgICBmcmFnbWVudD0iZmFsc2UiICBkb3dubG9hZC1zaXplPSIwIiBpbnN0YWxsLXNpemU9IjAiIGlkPSJvcmcuZWNsaXBzZS5wbGF0Zm9ybS5zb3VyY2UiIHZlcnNpb249IjMuMS4wIi8+Ci0JPHBsdWdpbiB3cz0iZ3RrIiAgb3M9ImxpbnV4IiBmcmFnbWVudD0idHJ1ZSIgYXJjaD0iaWE2NCIgZG93bmxvYWQtc2l6ZT0iMCIgaW5zdGFsbC1zaXplPSIwIiBpZD0ib3JnLmVjbGlwc2UucGxhdGZvcm0uc291cmNlLmxpbnV4Lmd0ay5pYTY0IiB2ZXJzaW9uPSIzLjEuMCIvPgotCTxwbHVnaW4gd3M9ImNhcmJvbiIgIG9zPSJtYWNvc3giIGZyYWdtZW50PSJ0cnVlIiBhcmNoPSJwcGMiIGRvd25sb2FkLXNpemU9IjAiIGluc3RhbGwtc2l6ZT0iMCIgaWQ9Im9yZy5lY2xpcHNlLnBsYXRmb3JtLnNvdXJjZS5tYWNvc3guY2FyYm9uLnBwYyIgdmVyc2lvbj0iMy4xLjAiLz4KLQk8cGx1Z2luIHdzPSJwaG90b24iICBvcz0icW54IiBmcmFnbWVudD0idHJ1ZSIgYXJjaD0ieDg2IiBkb3dubG9hZC1zaXplPSIwIiBpbnN0YWxsLXNpemU9IjAiIGlkPSJvcmcuZWNsaXBzZS5wbGF0Zm9ybS5zb3VyY2UucW54LnBob3Rvbi54ODYiIHZlcnNpb249IjMuMS4wIi8+Ci0JPHBsdWdpbiB3cz0iZ3RrIiAgb3M9ImxpbnV4IiBmcmFnbWVudD0idHJ1ZSIgYXJjaD0icHBjIiBkb3dubG9hZC1zaXplPSIwIiBpbnN0YWxsLXNpemU9IjAiIGlkPSJvcmcuZWNsaXBzZS5wbGF0Zm9ybS5zb3VyY2UubGludXguZ3RrLnBwYyIgdmVyc2lvbj0iMy4xLjAiLz4KLQk8cGx1Z2luIHdzPSJtb3RpZiIgIG9zPSJocHV4IiBmcmFnbWVudD0idHJ1ZSIgYXJjaD0iUEFfUklTQyIgZG93bmxvYWQtc2l6ZT0iMCIgaW5zdGFsbC1zaXplPSIwIiBpZD0ib3JnLmVjbGlwc2UucGxhdGZvcm0uc291cmNlLmhwdXgubW90aWYuUEFfUklTQyIgdmVyc2lvbj0iMy4xLjAiLz4KLQk8cGx1Z2luIHdzPSJtb3RpZiIgIG9zPSJhaXgiIGZyYWdtZW50PSJ0cnVlIiBhcmNoPSJwcGMiIGRvd25sb2FkLXNpemU9IjAiIGluc3RhbGwtc2l6ZT0iMCIgaWQ9Im9yZy5lY2xpcHNlLnBsYXRmb3JtLnNvdXJjZS5haXgubW90aWYucHBjIiB2ZXJzaW9uPSIzLjEuMCIvPgotCTxwbHVnaW4gd3M9Imd0ayIgIG9zPSJsaW51eCIgZnJhZ21lbnQ9InRydWUiIGFyY2g9Ing4NiIgZG93bmxvYWQtc2l6ZT0iMCIgaW5zdGFsbC1zaXplPSIwIiBpZD0ib3JnLmVjbGlwc2UucGxhdGZvcm0uc291cmNlLmxpbnV4Lmd0ay54ODYiIHZlcnNpb249IjMuMS4wIi8+Ci0JPHBsdWdpbiB3cz0id2luMzIiICBvcz0id2luMzIiIGZyYWdtZW50PSJ0cnVlIiBhcmNoPSJ4ODYiIGRvd25sb2FkLXNpemU9IjAiIGluc3RhbGwtc2l6ZT0iMCIgaWQ9Im9yZy5lY2xpcHNlLnBsYXRmb3JtLnNvdXJjZS53aW4zMi53aW4zMi54ODYiIHZlcnNpb249IjMuMS4wIi8+Ci0JPHBsdWdpbiB3cz0ibW90aWYiICBvcz0ic29sYXJpcyIgZnJhZ21lbnQ9InRydWUiIGFyY2g9InNwYXJjIiBkb3dubG9hZC1zaXplPSIwIiBpbnN0YWxsLXNpemU9IjAiIGlkPSJvcmcuZWNsaXBzZS5wbGF0Zm9ybS5zb3VyY2Uuc29sYXJpcy5tb3RpZi5zcGFyYyIgdmVyc2lvbj0iMy4xLjAiLz4KLQk8cGx1Z2luIHdzPSJndGsiICBvcz0ibGludXgiIGZyYWdtZW50PSJ0cnVlIiBhcmNoPSJhbWQ2NCIgZG93bmxvYWQtc2l6ZT0iMCIgaW5zdGFsbC1zaXplPSIwIiBpZD0ib3JnLmVjbGlwc2UucGxhdGZvcm0uc291cmNlLmxpbnV4Lmd0ay5hbWQ2NCIgdmVyc2lvbj0iMy4xLjAiLz4KLQk8cGx1Z2luIHdzPSJtb3RpZiIgIG9zPSJsaW51eCIgZnJhZ21lbnQ9InRydWUiIGFyY2g9Ing4NiIgZG93bmxvYWQtc2l6ZT0iMCIgaW5zdGFsbC1zaXplPSIwIiBpZD0ib3JnLmVjbGlwc2UucGxhdGZvcm0uc291cmNlLmxpbnV4Lm1vdGlmLng4NiIgdmVyc2lvbj0iMy4xLjAiLz4KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wbGF0Zm9ybS5zb3VyY2UtZmVhdHVyZS9saWNlbnNlLmh0bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGxhdGZvcm0uc291cmNlLWZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2Q4NTAwLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wbGF0Zm9ybS5zb3VyY2UtZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+Ci08aDI+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+MTU8c3VwPnRoPC9zdXA+IEp1bmUsIDIwMDQ8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+RUNMSVBTRS5PUkcgTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLSAgIAotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIAotICAgCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgRWNsaXBzZS5vcmcgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7Q1BMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgQ1BMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBDUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMKLSAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotCi08cD5Db250ZW50IG1heSBiZSBhcHBvcnRpb25lZCBpbnRvIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS4gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiAgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIGEgRmVhdHVyZS4gICBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzCi0gICBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7IGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy48L3A+Ci0gIAotPHA+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBGaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9wPgotICAKLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+Ci0KLTx1bD4KLQk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotCTxsaT5TdWJkaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLQk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCQkKLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSBFY2xpcHNlLm9yZyBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90Oy4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+Ci0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgQ1BMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0JPGxpPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLQk8bGk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4JCi0JPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KLQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotPC91bD4KLQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCBFY2xpcHNlLm9yZyB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5zZGstZmVhdHVyZS8ucHJvamVjdCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5zZGstZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDlmN2Q3OS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2Uuc2RrLWZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5zZGstZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5zZGstZmVhdHVyZS9jcGwtdjEwLmh0bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2Uuc2RrLWZlYXR1cmUvY3BsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmFhMjA4Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5zZGstZmVhdHVyZS9jcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci08SEVBRD4KLTxUSVRMRT5Db21tb24gUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvVElUTEU+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0iI0ZGRkZGRiIgVkxJTks9IiM4MDAwMDAiPgotCi0KLTxQIEFMSUdOPSJDRU5URVIiPjxCPkNvbW1vbiBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9CPgotPFA+PEI+PC9CPjxGT05UIFNJWkU9IjMiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjMiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIgVEhFIFRFUk1TIE9GIFRISVMgQ09NTU9OIFBVQkxJQyBMSUNFTlNFICgiQUdSRUVNRU5UIikuICBBTlkgVVNFLCBSRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UgT0YgVEhJUyBBR1JFRU1FTlQuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PEI+MS4gIERFRklOSVRJT05TPC9CPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPiJDb250cmlidXRpb24iIG1lYW5zOjwvRk9OVD4KLQotPFVMPjxGT05UIFNJWkU9IjIiPmEpIGluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uIGRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8QlIgQ0xFQVI9IkxFRlQiPgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5pKQkgCWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5paSkJCWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+d2hlcmUgc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZCBieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+QSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvciBpZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbiBzdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPkNvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIHdoaWNoOiAgKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFByb2dyYW0uICA8L0ZPTlQ+PC9VTD4KLQotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+IkNvbnRyaWJ1dG9yIiBtZWFucyBhbnkgcGVyc29uIG9yIGVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj4iTGljZW5zZWQgUGF0ZW50cyAiIG1lYW4gcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlIG9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uICA8L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPiJQcm9ncmFtIiBtZWFucyB0aGUgQ29udHJpYnV0aW9ucyBkaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+IlJlY2lwaWVudCIgbWVhbnMgYW55b25lIHdobyByZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PEI+PC9CPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjxCPjIuICBHUkFOVCBPRiBSSUdIVFM8L0I+PC9GT05UPgotCi08VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPmEpCTwvRk9OVD48Rk9OVCBTSVpFPSIyIj5TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzPC9GT05UPjxGT05UIFNJWkU9IjIiPiBSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzwvRk9OVD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iI0ZGMDAwMCI+IDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+YikgCVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgPC9GT05UPjxGT05UIFNJWkU9IjIiPlJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDgwMDAiPiA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+cm95YWx0eS1mcmVlIHBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uICBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZCBieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbiB0byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiAgVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0byBhbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gIE5vIGhhcmR3YXJlIHBlciBzZSBpcyBsaWNlbnNlZCBoZXJldW5kZXIuICAgPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5jKQlSZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzIENvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yIHRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuICBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudCBmb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuICBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kIGxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5IHRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gIEZvciBleGFtcGxlLCBpZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+ZCkJRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQgcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbiB0aGlzIEFncmVlbWVudC4gPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48L1VMPgotCi08UD48Rk9OVCBTSVpFPSIyIj48Qj4zLiAgUkVRVUlSRU1FTlRTPC9CPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjxCPjwvQj5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9GT05UPgotCi08VUw+PEZPTlQgU0laRT0iMiI+YSkJaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5iKQlpdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmkpCWVmZmVjdGl2ZWx5IGRpc2NsYWltczwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kIGNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUgYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+aWkpIAllZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoIGFzIGxvc3QgcHJvZml0czsgPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmlpaSk8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+CXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQgQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5pdikJc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZCBpbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDAwRkYiPiA8L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiNGRjAwMDAiPjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iI0ZGMDAwMCI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48L1VMPgotCi08UD48Rk9OVCBTSVpFPSIyIj5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZSBjb2RlIGZvcm06PC9GT05UPgotCi08VUw+PEZPTlQgU0laRT0iMiI+YSkJaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5iKQlhIGNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gIDwvRk9OVD48L1VMPgotCi08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDAwRkYiPjxTVFJJS0U+PC9TVFJJS0U+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDAwRkYiPjxTVFJJS0U+PC9TVFJJS0U+PC9GT05UPjxGT05UIFNJWkU9IjIiPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkgY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gIDwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlIG9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzIHN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiAgPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PEI+NC4gIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9CPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heSBhY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzIGFuZCB0aGUgbGlrZS4gIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZSBvZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbCBsaWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gICBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCJDb21tZXJjaWFsIENvbnRyaWJ1dG9yIikgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlciBDb250cmlidXRvciAoIkluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIikgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZCBjb3N0cyAoY29sbGVjdGl2ZWx5ICJMb3NzZXMiKSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIgbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8gdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiBjb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZy4gIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzIHJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiAgSW4gb3JkZXIgdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kIGFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiAgVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZSBpbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiAgVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEgQ29tbWVyY2lhbCBDb250cmlidXRvci4gIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlIGNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuICBVbmRlciB0aGlzIHNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZSBvdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhIGNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDAwMEZGIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iIzAwMDBGRiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjxCPjUuICBOTyBXQVJSQU5UWTwvQj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXM8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj50aGUgUHJvZ3JhbTwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50PC9GT05UPjxGT05UIFNJWkU9IjIiPiwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLCBjb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+cHJvZ3JhbXMgb3IgZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnM8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+LiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48Qj42LiAgRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L0I+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+KElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSw8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PEI+Ny4gIEdFTkVSQUw8L0I+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQgZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUgbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYSBDb250cmlidXRvciB3aXRoIHJlc3BlY3QgdG8gYSBwYXRlbnQgYXBwbGljYWJsZSB0byBzb2Z0d2FyZSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCksIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcyBncmFudGVkIGJ5IHRoYXQgQ29udHJpYnV0b3IgdG8gc3VjaCBSZWNpcGllbnQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gIEluIGFkZGl0aW9uLCBpZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGggb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoIFJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCBzaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvciBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUgcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiAgSWYgYWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiAgSG93ZXZlciwgUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5IFJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzIGNvcHlyaWdodGVkICBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQgU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gPC9GT05UPjxGT05UIFNJWkU9IjIiPnB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZiB0aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gPC9GT05UPjxGT05UIFNJWkU9IjIiPnRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMgdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gSUJNIGlzIHRoZSBpbml0aWFsIEFncmVlbWVudCBTdGV3YXJkLiAgIElCTSBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0byBzZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+RWFjaCBuZXcgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIFRoZSBQcm9ncmFtIChpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+dmVyc2lvbi4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5FeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZCBpbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyIGV4cHJlc3NseSwgPC9GT05UPjxGT05UIFNJWkU9IjIiPmJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2U8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+LjwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90IGV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUgU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMgQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiAgRWFjaCBwYXJ0eSB3YWl2ZXMgaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci0KLTwvQk9EWT4KLQotPC9IVE1MPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5zZGstZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnNkay1mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4ZTNlMDIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnNkay1mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2Uuc2RrLWZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnNkay1mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc4YTQ3OS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2Uuc2RrLWZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1FY2xpcHNlIFByb2plY3QgU0RLCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1FY2xpcHNlLm9yZyB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249U0RLIGZvciBFY2xpcHNlLgotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFLk9SRyBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotMTV0aCBKdW5lLCAyMDA0XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotRUNMSVBTRS5PUkcgTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgRWNsaXBzZS5vcmdcblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIENvbW1vbiBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJDUEwiKS4gQSBjb3B5IG9mIHRoZSBDUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgQ1BMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi1Db250ZW50IG1heSBiZSBhcHBvcnRpb25lZCBpbnRvIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHNcblwKLSgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3JcblwKLW1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZVxuXAotUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiBQbHVnLWlucyBhbmQgRnJhZ21lbnRzXG5cCi1hcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAicGx1Z2lucyIgYW5kIEZlYXR1cmVzIGFyZSBsb2NhdGVkIGluXG5cCi1kaXJlY3RvcmllcyBuYW1lZCAiZmVhdHVyZXMiLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIFN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSBFY2xpcHNlLm9yZyBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBDUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCBFY2xpcHNlLm9yZyB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5zZGstZmVhdHVyZS9mZWF0dXJlLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5zZGstZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI5OTA0Yy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2Uuc2RrLWZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5zZGsiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMy4xLjAiCi0gICAgICBpbWFnZT0gImVjbGlwc2VfdXBkYXRlXzEyMC5qcGciCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotICAgCi0gICA8bGljZW5zZSB1cmw9IiVsaWNlbnNlVVJMIj4KLSAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vdXBkYXRlLmVjbGlwc2Uub3JnL3VwZGF0ZXMvMy4wIi8+Ci0gICAgICA8ZGlzY292ZXJ5IGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL3VwZGF0ZS5lY2xpcHNlLm9yZy91cGRhdGVzLzMuMCIvPgotICAgPC91cmw+Ci0KLSAgPGluY2x1ZGVzIGlkPSJvcmcuZWNsaXBzZS5wbGF0Zm9ybSIgdmVyc2lvbj0iMy4xLjAiIC8+IAotICA8aW5jbHVkZXMgaWQ9Im9yZy5lY2xpcHNlLnBsYXRmb3JtLnNvdXJjZSIgdmVyc2lvbj0iMy4xLjAiIC8+IAotICA8aW5jbHVkZXMgaWQ9Im9yZy5lY2xpcHNlLmpkdCIgdmVyc2lvbj0iMy4xLjAiIC8+Ci0gIDxpbmNsdWRlcyBpZD0ib3JnLmVjbGlwc2UuamR0LnNvdXJjZSIgdmVyc2lvbj0iMy4xLjAiIC8+IAotICA8aW5jbHVkZXMgaWQ9Im9yZy5lY2xpcHNlLnBkZSIgdmVyc2lvbj0iMy4xLjAiIC8+IAotICA8aW5jbHVkZXMgaWQ9Im9yZy5lY2xpcHNlLnBkZS5zb3VyY2UiIHZlcnNpb249IjMuMS4wIiAvPiAKLSAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uuc2RrIiB2ZXJzaW9uPSIzLjEuMCIvPgotICAKLTwvZmVhdHVyZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2Uuc2RrLWZlYXR1cmUvbGljZW5zZS5odG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnNkay1mZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdkODUwMC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2Uuc2RrLWZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPgotPGgyPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPjE1PHN1cD50aDwvc3VwPiBKdW5lLCAyMDA0PC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPkVDTElQU0UuT1JHIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+Ci0gICAKLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4gICAKLSAgIAotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IEVjbGlwc2Uub3JnIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCZxdW90O0NQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIENQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgQ1BMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gQ1ZTCi0gICBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLQotPHA+Q29udGVudCBtYXkgYmUgYXBwb3J0aW9uZWQgaW50byBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiBGaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCBhIEZlYXR1cmUuICAgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcwotICAgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90OyBhbmQgRmVhdHVyZXMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuPC9wPgotICAKLTxwPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gRmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvcD4KLSAgCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgotCi08dWw+Ci0JPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0JPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLQk8bGk+U3ViZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0JPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQkJCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgRWNsaXBzZS5vcmcgaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIENQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KLQotPHVsPgotCTxsaT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0JPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQotCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLTwvdWw+Ci0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgRWNsaXBzZS5vcmcgdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KLQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+Ci0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UueHNkLmRvY18yLjAuMC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS54c2QuZG9jXzIuMC4wL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTQ5OWJjLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS54c2QuZG9jXzIuMC4wL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnhzZC5kb2NfMi4wLjAvY3BsLXYxMC5odG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnhzZC5kb2NfMi4wLjAvY3BsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmFhMjA4Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS54c2QuZG9jXzIuMC4wL2NwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLTxIRUFEPgotPFRJVExFPkNvbW1vbiBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9USVRMRT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSIjRkZGRkZGIiBWTElOSz0iIzgwMDAwMCI+Ci0KLQotPFAgQUxJR049IkNFTlRFUiI+PEI+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L0I+Ci08UD48Qj48L0I+PEZPTlQgU0laRT0iMyI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMyI+PC9GT05UPjxGT05UIFNJWkU9IjIiPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUiBUSEUgVEVSTVMgT0YgVEhJUyBDT01NT04gUFVCTElDIExJQ0VOU0UgKCJBR1JFRU1FTlQiKS4gIEFOWSBVU0UsIFJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRSBPRiBUSElTIEFHUkVFTUVOVC48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48Qj4xLiAgREVGSU5JVElPTlM8L0I+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+IkNvbnRyaWJ1dGlvbiIgbWVhbnM6PC9GT05UPgotCi08VUw+PEZPTlQgU0laRT0iMiI+YSkgaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24gZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxCUiBDTEVBUj0iTEVGVCI+Ci1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmkpCSAJY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmlpKQkJYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj53aGVyZSBzdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkIGJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5BIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yIGlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uIHN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+Q29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gd2hpY2g6ICAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgUHJvZ3JhbS4gIDwvRk9OVD48L1VMPgotCi08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj4iQ29udHJpYnV0b3IiIG1lYW5zIGFueSBwZXJzb24gb3IgZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPiJMaWNlbnNlZCBQYXRlbnRzICIgbWVhbiBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2Ugb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gIDwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IlByb2dyYW0iIG1lYW5zIHRoZSBDb250cmlidXRpb25zIGRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj4iUmVjaXBpZW50IiBtZWFucyBhbnlvbmUgd2hvIHJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48Qj48L0I+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PEI+Mi4gIEdSQU5UIE9GIFJJR0hUUzwvQj48L0ZPTlQ+Ci0KLTxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+YSkJPC9GT05UPjxGT05UIFNJWkU9IjIiPlN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHM8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IFJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjRkYwMDAwIj4gPC9GT05UPjxGT05UIFNJWkU9IjIiPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS48L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5iKSAJU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+UmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDwvRk9OVD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iIzAwODAwMCI+IDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5yb3lhbHR5LWZyZWUgcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkIGJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uIHRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuICBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvIGFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiAgTm8gaGFyZHdhcmUgcGVyIHNlIGlzIGxpY2Vuc2VkIGhlcmV1bmRlci4gICA8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmMpCVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMgQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IgdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50IGZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQgbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkgdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiAgRm9yIGV4YW1wbGUsIGlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZSBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5kKQlFYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodCByaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluIHRoaXMgQWdyZWVtZW50LiA8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjwvVUw+Ci0KLTxQPjxGT05UIFNJWkU9IjIiPjxCPjMuICBSRVFVSVJFTUVOVFM8L0I+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PEI+PC9CPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L0ZPTlQ+Ci0KLTxVTD48Rk9OVCBTSVpFPSIyIj5hKQlpdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmIpCWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+aSkJZWZmZWN0aXZlbHkgZGlzY2xhaW1zPC9GT05UPjxGT05UIFNJWkU9IjIiPiBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQgY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZSBhbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5paSkgCWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2ggYXMgbG9zdCBwcm9maXRzOyA8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+aWlpKTwvRk9OVD48Rk9OVCBTSVpFPSIyIj4Jc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdCBDb250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPml2KQlzdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kIGluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjwvRk9OVD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iIzAwMDBGRiI+IDwvRk9OVD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iI0ZGMDAwMCI+PC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjRkYwMDAwIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPjwvVUw+Ci0KLTxQPjxGT05UIFNJWkU9IjIiPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlIGNvZGUgZm9ybTo8L0ZPTlQ+Ci0KLTxVTD48Rk9OVCBTSVpFPSIyIj5hKQlpdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmIpCWEgY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiAgPC9GT05UPjwvVUw+Ci0KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iIzAwMDBGRiI+PFNUUklLRT48L1NUUklLRT48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iIzAwMDBGRiI+PFNUUklLRT48L1NUUklLRT48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueSBjb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiAgPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUgb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3Mgc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uICA8L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48Qj40LiAgQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L0I+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5IGFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMgYW5kIHRoZSBsaWtlLiAgV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlIG9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsIGxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiAgIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoIkNvbW1lcmNpYWwgQ29udHJpYnV0b3IiKSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyIENvbnRyaWJ1dG9yICgiSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IiKSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kIGNvc3RzIChjb2xsZWN0aXZlbHkgIkxvc3NlcyIpIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlciBsZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0byB0aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluIGNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLiAgVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMgcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuICBJbiBvcmRlciB0byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQgYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuICBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlIGluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguICBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yLiAgSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UgY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gIFVuZGVyIHRoaXMgc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlIG90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEgY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDAwRkYiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDAwMEZGIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PEI+NS4gIE5PIFdBUlJBTlRZPC9CPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpczwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgPC9GT05UPjxGT05UIFNJWkU9IjIiPnRoZSBQcm9ncmFtPC9GT05UPjxGT05UIFNJWkU9IjIiPiBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+LCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsIGNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5wcm9ncmFtcyBvciBlcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9uczwvRk9OVD48Rk9OVCBTSVpFPSIyIj4uICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjxCPjYuICBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvQj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj4oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLDwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48Qj43LiAgR0VORVJBTDwvQj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dCBmdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZSBtaW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhIENvbnRyaWJ1dG9yIHdpdGggcmVzcGVjdCB0byBhIHBhdGVudCBhcHBsaWNhYmxlIHRvIHNvZnR3YXJlIChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzIGdyYW50ZWQgYnkgdGhhdCBDb250cmlidXRvciB0byBzdWNoIFJlY2lwaWVudCB1bmRlciB0aGlzIEFncmVlbWVudCBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiAgSW4gYWRkaXRpb24sIGlmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aCBvdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2ggUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZSBwZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuICBJZiBhbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuICBIb3dldmVyLCBSZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkgUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMgY29weXJpZ2h0ZWQgIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudCBTdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+cHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mIHRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+dGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcyB0aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBJQk0gaXMgdGhlIGluaXRpYWwgQWdyZWVtZW50IFN0ZXdhcmQuICAgSUJNIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvIHNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5FYWNoIG5ldyB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiAgVGhlIFByb2dyYW0gKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAoaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IDwvRk9OVD48Rk9OVCBTSVpFPSIyIj52ZXJzaW9uLiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPkV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkIGluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8gdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIgZXhwcmVzc2x5LCA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+YnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZTwvRk9OVD48Rk9OVCBTSVpFPSIyIj4uPC9GT05UPjxGT05UIFNJWkU9IjIiPiAgQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QgZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZSBTdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcyBBZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuICBFYWNoIHBhcnR5IHdhaXZlcyBpdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLQotPC9CT0RZPgotCi08L0hUTUw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnhzZC5kb2NfMi4wLjAvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS54c2QuZG9jXzIuMC4wL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4ZTNlMDIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnhzZC5kb2NfMi4wLjAvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS54c2QuZG9jXzIuMC4wL2ZlYXR1cmUucHJvcGVydGllcyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS54c2QuZG9jXzIuMC4wL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRjMWQ1Ni4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UueHNkLmRvY18yLjAuMC9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyAvKioKLSMgICogPGNvcHlyaWdodD4KLSMgICoKLSMgICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotIyAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyAgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotIyAgKiAKLSMgICogQ29udHJpYnV0b3JzOiAKLSMgICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgICoKLSMgICogPC9jb3B5cmlnaHQ+Ci0jICAqCi0jICAqICRJZDogZmVhdHVyZS5wcm9wZXJ0aWVzLHYgMS4xIDIwMDQvMTAvMTggMTU6NTA6NDIgZGJpcnNhbiBFeHAgJAotIyAgKi8KLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgRG8gbm90IGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlIGxhc3QgbGluZSBjb250YWluaW5nOgotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgSW5zdGVhZCwgZWl0aGVyIHJlZGVmaW5lIGFuIGV4aXN0aW5nIHByb3BlcnR5LCBvciBjcmVhdGUgYSBuZXcgcHJvcGVydHksCi0jIGFwcGVuZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLCBhbmQgY2hhbmdlIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IG5hbWUuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jIFRoaXMgZmlsZSBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9WE1MIFNjaGVtYSBJbmZvc2V0IE1vZGVsIChYU0QpIERvY3VtZW50YXRpb24KLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPUVjbGlwc2Uub3JnIHVwZGF0ZSBzaXRlCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1FY2xpcHNlIE1vZGVsaW5nIEZyYW1ld29yay4gKGRvY3VtZW50YXRpb24pCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UuT1JHIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi0xNHRoIEF1Z3VzdCwgMjAwM1xuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLUVDTElQU0UuT1JHIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IEVjbGlwc2Uub3JnXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBDb21tb24gUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiQ1BMIikuIEEgY29weSBvZiB0aGUgQ1BMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIENQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotQ29udGVudCBtYXkgYmUgYXBwb3J0aW9uZWQgaW50byBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzXG5cCi0oIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLiBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yXG5cCi1tb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGVcblwKLVBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIGEgRmVhdHVyZS4gUGx1Zy1pbnMgYW5kIEZyYWdtZW50c1xuXAotYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgbmFtZWQgInBsdWdpbnMiIGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpblxuXAotZGlyZWN0b3JpZXMgbmFtZWQgImZlYXR1cmVzIi5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBTdWJkaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgRWNsaXBzZS5vcmcgaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgQ1BMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgRWNsaXBzZS5vcmcgdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBUaGUgYWJvdmUgcHJvcGVydGllcyBoYXZlIGJlZW4gc2hpcHBlZCBmb3IgdHJhbnNsYXRpb24uCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnhzZC5kb2NfMi4wLjAvZmVhdHVyZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UueHNkLmRvY18yLjAuMC9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU0ZjM4MC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UueHNkLmRvY18yLjAuMC9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLS8qKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IAotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IGZlYXR1cmUueG1sLHYgMS4xIDIwMDQvMDMvMDYgMTg6MDA6MDkgbWFyY2Vsb3AgRXhwICQKLSAqLwotLS0+Ci0KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UueHNkLmRvYyIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIyLjAuMCIKLSAgICAgIGltYWdlPSAiZWNsaXBzZV91cGRhdGVfMTIwLmpwZyIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSB1cmw9Imh0dHA6Ly91cGRhdGUuZWNsaXBzZS5vcmcvdXBkYXRlcyIgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIvPgotICAgPC91cmw+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS54c2QuZG9jIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjIuMC4wIj4KLSAgIDwvcGx1Z2luPgotICAgCQkKLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS54c2QuZG9jXzIuMC4wL2xpY2Vuc2UuaHRtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS54c2QuZG9jXzIuMC4wL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY4YzM4MC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UueHNkLmRvY18yLjAuMC9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+Ci08aDI+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+MTR0aCBBdWd1c3QsIDIwMDM8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+RUNMSVBTRS5PUkcgTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLSAgIAotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIAotICAgCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgRWNsaXBzZS5vcmcgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7Q1BMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgQ1BMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBDUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMKLSAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotCi08cD5Db250ZW50IG1heSBiZSBhcHBvcnRpb25lZCBpbnRvIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS4gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiAgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIGEgRmVhdHVyZS4gICBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzCi0gICBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7IGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy48L3A+Ci0gIAotPHA+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBGaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9wPgotICAKLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+Ci0KLTx1bD4KLQk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotCTxsaT5TdWJkaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLQk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCQkKLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSBFY2xpcHNlLm9yZyBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90Oy4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+Ci0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgQ1BMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLQk8bGk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4JCi0JPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KLQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotPC91bD4KLQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCBFY2xpcHNlLm9yZyB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UueHNkLnNvdXJjZV8yLjAuMC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS54c2Quc291cmNlXzIuMC4wL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTQ5OWJjLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS54c2Quc291cmNlXzIuMC4wL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnhzZC5zb3VyY2VfMi4wLjAvY3BsLXYxMC5odG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnhzZC5zb3VyY2VfMi4wLjAvY3BsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmFhMjA4Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS54c2Quc291cmNlXzIuMC4wL2NwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLTxIRUFEPgotPFRJVExFPkNvbW1vbiBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9USVRMRT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSIjRkZGRkZGIiBWTElOSz0iIzgwMDAwMCI+Ci0KLQotPFAgQUxJR049IkNFTlRFUiI+PEI+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L0I+Ci08UD48Qj48L0I+PEZPTlQgU0laRT0iMyI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMyI+PC9GT05UPjxGT05UIFNJWkU9IjIiPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUiBUSEUgVEVSTVMgT0YgVEhJUyBDT01NT04gUFVCTElDIExJQ0VOU0UgKCJBR1JFRU1FTlQiKS4gIEFOWSBVU0UsIFJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRSBPRiBUSElTIEFHUkVFTUVOVC48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48Qj4xLiAgREVGSU5JVElPTlM8L0I+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+IkNvbnRyaWJ1dGlvbiIgbWVhbnM6PC9GT05UPgotCi08VUw+PEZPTlQgU0laRT0iMiI+YSkgaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24gZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxCUiBDTEVBUj0iTEVGVCI+Ci1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmkpCSAJY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmlpKQkJYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj53aGVyZSBzdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkIGJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5BIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yIGlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uIHN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+Q29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gd2hpY2g6ICAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgUHJvZ3JhbS4gIDwvRk9OVD48L1VMPgotCi08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj4iQ29udHJpYnV0b3IiIG1lYW5zIGFueSBwZXJzb24gb3IgZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPiJMaWNlbnNlZCBQYXRlbnRzICIgbWVhbiBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2Ugb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gIDwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IlByb2dyYW0iIG1lYW5zIHRoZSBDb250cmlidXRpb25zIGRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj4iUmVjaXBpZW50IiBtZWFucyBhbnlvbmUgd2hvIHJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48Qj48L0I+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PEI+Mi4gIEdSQU5UIE9GIFJJR0hUUzwvQj48L0ZPTlQ+Ci0KLTxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+YSkJPC9GT05UPjxGT05UIFNJWkU9IjIiPlN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHM8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IFJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjRkYwMDAwIj4gPC9GT05UPjxGT05UIFNJWkU9IjIiPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS48L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5iKSAJU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+UmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDwvRk9OVD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iIzAwODAwMCI+IDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5yb3lhbHR5LWZyZWUgcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkIGJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uIHRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuICBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvIGFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiAgTm8gaGFyZHdhcmUgcGVyIHNlIGlzIGxpY2Vuc2VkIGhlcmV1bmRlci4gICA8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmMpCVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMgQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IgdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50IGZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQgbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkgdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiAgRm9yIGV4YW1wbGUsIGlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZSBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5kKQlFYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodCByaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluIHRoaXMgQWdyZWVtZW50LiA8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjwvVUw+Ci0KLTxQPjxGT05UIFNJWkU9IjIiPjxCPjMuICBSRVFVSVJFTUVOVFM8L0I+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PEI+PC9CPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L0ZPTlQ+Ci0KLTxVTD48Rk9OVCBTSVpFPSIyIj5hKQlpdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmIpCWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+aSkJZWZmZWN0aXZlbHkgZGlzY2xhaW1zPC9GT05UPjxGT05UIFNJWkU9IjIiPiBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQgY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZSBhbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5paSkgCWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2ggYXMgbG9zdCBwcm9maXRzOyA8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+aWlpKTwvRk9OVD48Rk9OVCBTSVpFPSIyIj4Jc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdCBDb250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPml2KQlzdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kIGluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjwvRk9OVD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iIzAwMDBGRiI+IDwvRk9OVD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iI0ZGMDAwMCI+PC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjRkYwMDAwIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPjwvVUw+Ci0KLTxQPjxGT05UIFNJWkU9IjIiPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlIGNvZGUgZm9ybTo8L0ZPTlQ+Ci0KLTxVTD48Rk9OVCBTSVpFPSIyIj5hKQlpdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmIpCWEgY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiAgPC9GT05UPjwvVUw+Ci0KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iIzAwMDBGRiI+PFNUUklLRT48L1NUUklLRT48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iIzAwMDBGRiI+PFNUUklLRT48L1NUUklLRT48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueSBjb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiAgPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUgb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3Mgc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uICA8L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48Qj40LiAgQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L0I+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5IGFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMgYW5kIHRoZSBsaWtlLiAgV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlIG9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsIGxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiAgIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoIkNvbW1lcmNpYWwgQ29udHJpYnV0b3IiKSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyIENvbnRyaWJ1dG9yICgiSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IiKSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kIGNvc3RzIChjb2xsZWN0aXZlbHkgIkxvc3NlcyIpIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlciBsZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0byB0aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluIGNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLiAgVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMgcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuICBJbiBvcmRlciB0byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQgYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuICBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlIGluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguICBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yLiAgSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UgY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gIFVuZGVyIHRoaXMgc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlIG90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEgY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDAwRkYiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDAwMEZGIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PEI+NS4gIE5PIFdBUlJBTlRZPC9CPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpczwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgPC9GT05UPjxGT05UIFNJWkU9IjIiPnRoZSBQcm9ncmFtPC9GT05UPjxGT05UIFNJWkU9IjIiPiBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+LCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsIGNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5wcm9ncmFtcyBvciBlcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9uczwvRk9OVD48Rk9OVCBTSVpFPSIyIj4uICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjxCPjYuICBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvQj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj4oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLDwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48Qj43LiAgR0VORVJBTDwvQj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dCBmdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZSBtaW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhIENvbnRyaWJ1dG9yIHdpdGggcmVzcGVjdCB0byBhIHBhdGVudCBhcHBsaWNhYmxlIHRvIHNvZnR3YXJlIChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzIGdyYW50ZWQgYnkgdGhhdCBDb250cmlidXRvciB0byBzdWNoIFJlY2lwaWVudCB1bmRlciB0aGlzIEFncmVlbWVudCBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiAgSW4gYWRkaXRpb24sIGlmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aCBvdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2ggUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZSBwZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuICBJZiBhbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuICBIb3dldmVyLCBSZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkgUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMgY29weXJpZ2h0ZWQgIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudCBTdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+cHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mIHRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+dGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcyB0aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBJQk0gaXMgdGhlIGluaXRpYWwgQWdyZWVtZW50IFN0ZXdhcmQuICAgSUJNIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvIHNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5FYWNoIG5ldyB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiAgVGhlIFByb2dyYW0gKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAoaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IDwvRk9OVD48Rk9OVCBTSVpFPSIyIj52ZXJzaW9uLiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPkV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkIGluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8gdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIgZXhwcmVzc2x5LCA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+YnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZTwvRk9OVD48Rk9OVCBTSVpFPSIyIj4uPC9GT05UPjxGT05UIFNJWkU9IjIiPiAgQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QgZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZSBTdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcyBBZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuICBFYWNoIHBhcnR5IHdhaXZlcyBpdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLQotPC9CT0RZPgotCi08L0hUTUw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnhzZC5zb3VyY2VfMi4wLjAvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS54c2Quc291cmNlXzIuMC4wL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4ZTNlMDIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnhzZC5zb3VyY2VfMi4wLjAvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS54c2Quc291cmNlXzIuMC4wL2ZlYXR1cmUucHJvcGVydGllcyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS54c2Quc291cmNlXzIuMC4wL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjgwNmFmMi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UueHNkLnNvdXJjZV8yLjAuMC9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyAvKioKLSMgICogPGNvcHlyaWdodD4KLSMgICoKLSMgICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotIyAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyAgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotIyAgKiAKLSMgICogQ29udHJpYnV0b3JzOiAKLSMgICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgICoKLSMgICogPC9jb3B5cmlnaHQ+Ci0jICAqCi0jICAqICRJZDogZmVhdHVyZS5wcm9wZXJ0aWVzLHYgMS4xIDIwMDQvMTAvMTggMTU6NTA6NDIgZGJpcnNhbiBFeHAgJAotIyAgKi8KLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgRG8gbm90IGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlIGxhc3QgbGluZSBjb250YWluaW5nOgotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgSW5zdGVhZCwgZWl0aGVyIHJlZGVmaW5lIGFuIGV4aXN0aW5nIHByb3BlcnR5LCBvciBjcmVhdGUgYSBuZXcgcHJvcGVydHksCi0jIGFwcGVuZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLCBhbmQgY2hhbmdlIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IG5hbWUuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jIFRoaXMgZmlsZSBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9WE1MIFNjaGVtYSBJbmZvc2V0IE1vZGVsIChYU0QpIFNvdXJjZQotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9RWNsaXBzZS5vcmcgdXBkYXRlIHNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPUVjbGlwc2UgTW9kZWxpbmcgRnJhbWV3b3JrLiAoc291cmNlIGNvZGUpCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UuT1JHIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi0xNHRoIEF1Z3VzdCwgMjAwM1xuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLUVDTElQU0UuT1JHIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IEVjbGlwc2Uub3JnXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBDb21tb24gUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiQ1BMIikuIEEgY29weSBvZiB0aGUgQ1BMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIENQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotQ29udGVudCBtYXkgYmUgYXBwb3J0aW9uZWQgaW50byBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzXG5cCi0oIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLiBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yXG5cCi1tb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGVcblwKLVBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIGEgRmVhdHVyZS4gUGx1Zy1pbnMgYW5kIEZyYWdtZW50c1xuXAotYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgbmFtZWQgInBsdWdpbnMiIGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpblxuXAotZGlyZWN0b3JpZXMgbmFtZWQgImZlYXR1cmVzIi5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBTdWJkaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgRWNsaXBzZS5vcmcgaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgQ1BMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgRWNsaXBzZS5vcmcgdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBUaGUgYWJvdmUgcHJvcGVydGllcyBoYXZlIGJlZW4gc2hpcHBlZCBmb3IgdHJhbnNsYXRpb24uCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnhzZC5zb3VyY2VfMi4wLjAvZmVhdHVyZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UueHNkLnNvdXJjZV8yLjAuMC9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVmMmI3Ny4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UueHNkLnNvdXJjZV8yLjAuMC9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLS8qKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IAotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IGZlYXR1cmUueG1sLHYgMS4xIDIwMDQvMDMvMDYgMTg6MDA6MTEgbWFyY2Vsb3AgRXhwICQKLSAqLwotLS0+Ci0KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UueHNkLnNvdXJjZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIyLjAuMCIKLSAgICAgIGltYWdlPSAiZWNsaXBzZV91cGRhdGVfMTIwLmpwZyIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSB1cmw9Imh0dHA6Ly91cGRhdGUuZWNsaXBzZS5vcmcvdXBkYXRlcyIgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIvPgotICAgPC91cmw+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS54c2Quc291cmNlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjIuMC4wIj4KLSAgIDwvcGx1Z2luPgotICAgCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UueHNkLnNvdXJjZV8yLjAuMC9saWNlbnNlLmh0bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UueHNkLnNvdXJjZV8yLjAuMC9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmOGMzODAuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnhzZC5zb3VyY2VfMi4wLjAvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPgotPGgyPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPjE0dGggQXVndXN0LCAyMDAzPC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPkVDTElQU0UuT1JHIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+Ci0gICAKLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4gICAKLSAgIAotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IEVjbGlwc2Uub3JnIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCZxdW90O0NQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIENQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgQ1BMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gQ1ZTCi0gICBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLQotPHA+Q29udGVudCBtYXkgYmUgYXBwb3J0aW9uZWQgaW50byBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiBGaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCBhIEZlYXR1cmUuICAgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcwotICAgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90OyBhbmQgRmVhdHVyZXMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuPC9wPgotICAKLTxwPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gRmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvcD4KLSAgCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgotCi08dWw+Ci0JPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0JPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLQk8bGk+U3ViZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0JPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQkJCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgRWNsaXBzZS5vcmcgaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIENQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KLQotPHVsPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0JPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQotCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLTwvdWw+Ci0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgRWNsaXBzZS5vcmcgdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KLQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+Ci0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+Ci08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnhzZF8yLjAuMC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS54c2RfMi4wLjAvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5NDk5YmMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnhzZF8yLjAuMC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS54c2RfMi4wLjAvY3BsLXYxMC5odG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnhzZF8yLjAuMC9jcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2YWEyMDguLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnhzZF8yLjAuMC9jcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci08SEVBRD4KLTxUSVRMRT5Db21tb24gUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvVElUTEU+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0iI0ZGRkZGRiIgVkxJTks9IiM4MDAwMDAiPgotCi0KLTxQIEFMSUdOPSJDRU5URVIiPjxCPkNvbW1vbiBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9CPgotPFA+PEI+PC9CPjxGT05UIFNJWkU9IjMiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjMiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIgVEhFIFRFUk1TIE9GIFRISVMgQ09NTU9OIFBVQkxJQyBMSUNFTlNFICgiQUdSRUVNRU5UIikuICBBTlkgVVNFLCBSRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UgT0YgVEhJUyBBR1JFRU1FTlQuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PEI+MS4gIERFRklOSVRJT05TPC9CPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPiJDb250cmlidXRpb24iIG1lYW5zOjwvRk9OVD4KLQotPFVMPjxGT05UIFNJWkU9IjIiPmEpIGluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uIGRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8QlIgQ0xFQVI9IkxFRlQiPgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5pKQkgCWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5paSkJCWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+d2hlcmUgc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZCBieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+QSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvciBpZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbiBzdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPkNvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIHdoaWNoOiAgKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFByb2dyYW0uICA8L0ZPTlQ+PC9VTD4KLQotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+IkNvbnRyaWJ1dG9yIiBtZWFucyBhbnkgcGVyc29uIG9yIGVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj4iTGljZW5zZWQgUGF0ZW50cyAiIG1lYW4gcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlIG9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uICA8L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPiJQcm9ncmFtIiBtZWFucyB0aGUgQ29udHJpYnV0aW9ucyBkaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+IlJlY2lwaWVudCIgbWVhbnMgYW55b25lIHdobyByZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PEI+PC9CPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjxCPjIuICBHUkFOVCBPRiBSSUdIVFM8L0I+PC9GT05UPgotCi08VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPmEpCTwvRk9OVD48Rk9OVCBTSVpFPSIyIj5TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzPC9GT05UPjxGT05UIFNJWkU9IjIiPiBSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzwvRk9OVD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iI0ZGMDAwMCI+IDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+YikgCVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgPC9GT05UPjxGT05UIFNJWkU9IjIiPlJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDgwMDAiPiA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+cm95YWx0eS1mcmVlIHBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uICBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZCBieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbiB0byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiAgVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0byBhbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gIE5vIGhhcmR3YXJlIHBlciBzZSBpcyBsaWNlbnNlZCBoZXJldW5kZXIuICAgPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5jKQlSZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzIENvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yIHRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuICBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudCBmb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuICBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kIGxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5IHRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gIEZvciBleGFtcGxlLCBpZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+ZCkJRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQgcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbiB0aGlzIEFncmVlbWVudC4gPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48L1VMPgotCi08UD48Rk9OVCBTSVpFPSIyIj48Qj4zLiAgUkVRVUlSRU1FTlRTPC9CPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjxCPjwvQj5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9GT05UPgotCi08VUw+PEZPTlQgU0laRT0iMiI+YSkJaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5iKQlpdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmkpCWVmZmVjdGl2ZWx5IGRpc2NsYWltczwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kIGNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUgYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+aWkpIAllZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoIGFzIGxvc3QgcHJvZml0czsgPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmlpaSk8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+CXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQgQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5pdikJc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZCBpbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDAwRkYiPiA8L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiNGRjAwMDAiPjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iI0ZGMDAwMCI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48L1VMPgotCi08UD48Rk9OVCBTSVpFPSIyIj5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZSBjb2RlIGZvcm06PC9GT05UPgotCi08VUw+PEZPTlQgU0laRT0iMiI+YSkJaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5iKQlhIGNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gIDwvRk9OVD48L1VMPgotCi08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDAwRkYiPjxTVFJJS0U+PC9TVFJJS0U+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDAwRkYiPjxTVFJJS0U+PC9TVFJJS0U+PC9GT05UPjxGT05UIFNJWkU9IjIiPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkgY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gIDwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlIG9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzIHN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiAgPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PEI+NC4gIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9CPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heSBhY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzIGFuZCB0aGUgbGlrZS4gIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZSBvZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbCBsaWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gICBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCJDb21tZXJjaWFsIENvbnRyaWJ1dG9yIikgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlciBDb250cmlidXRvciAoIkluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIikgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZCBjb3N0cyAoY29sbGVjdGl2ZWx5ICJMb3NzZXMiKSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIgbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8gdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiBjb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZy4gIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzIHJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiAgSW4gb3JkZXIgdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kIGFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiAgVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZSBpbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiAgVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEgQ29tbWVyY2lhbCBDb250cmlidXRvci4gIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlIGNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuICBVbmRlciB0aGlzIHNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZSBvdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhIGNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDAwMEZGIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iIzAwMDBGRiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjxCPjUuICBOTyBXQVJSQU5UWTwvQj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXM8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj50aGUgUHJvZ3JhbTwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50PC9GT05UPjxGT05UIFNJWkU9IjIiPiwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLCBjb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+cHJvZ3JhbXMgb3IgZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnM8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+LiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48Qj42LiAgRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L0I+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+KElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSw8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PEI+Ny4gIEdFTkVSQUw8L0I+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQgZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUgbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYSBDb250cmlidXRvciB3aXRoIHJlc3BlY3QgdG8gYSBwYXRlbnQgYXBwbGljYWJsZSB0byBzb2Z0d2FyZSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCksIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcyBncmFudGVkIGJ5IHRoYXQgQ29udHJpYnV0b3IgdG8gc3VjaCBSZWNpcGllbnQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gIEluIGFkZGl0aW9uLCBpZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGggb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoIFJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCBzaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvciBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUgcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiAgSWYgYWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiAgSG93ZXZlciwgUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5IFJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzIGNvcHlyaWdodGVkICBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQgU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gPC9GT05UPjxGT05UIFNJWkU9IjIiPnB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZiB0aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gPC9GT05UPjxGT05UIFNJWkU9IjIiPnRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMgdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gSUJNIGlzIHRoZSBpbml0aWFsIEFncmVlbWVudCBTdGV3YXJkLiAgIElCTSBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0byBzZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+RWFjaCBuZXcgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIFRoZSBQcm9ncmFtIChpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+dmVyc2lvbi4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5FeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZCBpbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyIGV4cHJlc3NseSwgPC9GT05UPjxGT05UIFNJWkU9IjIiPmJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2U8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+LjwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90IGV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUgU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMgQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiAgRWFjaCBwYXJ0eSB3YWl2ZXMgaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci0KLTwvQk9EWT4KLQotPC9IVE1MPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS54c2RfMi4wLjAvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS54c2RfMi4wLjAvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhlM2UwMi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UueHNkXzIuMC4wL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UueHNkXzIuMC4wL2ZlYXR1cmUucHJvcGVydGllcyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS54c2RfMi4wLjAvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjBkZWQ1Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS54c2RfMi4wLjAvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgLyoqCi0jICAqIDxjb3B5cmlnaHQ+Ci0jICAqCi0jICAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSMgICogCi0jICAqIENvbnRyaWJ1dG9yczogCi0jICAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jICAqCi0jICAqIDwvY29weXJpZ2h0PgotIyAgKgotIyAgKiAkSWQ6IGZlYXR1cmUucHJvcGVydGllcyx2IDEuMSAyMDA0LzEwLzE4IDE1OjUwOjQyIGRiaXJzYW4gRXhwICQgCi0jICAqLwotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBEbyBub3QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUgbGFzdCBsaW5lIGNvbnRhaW5pbmc6Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBJbnN0ZWFkLCBlaXRoZXIgcmVkZWZpbmUgYW4gZXhpc3RpbmcgcHJvcGVydHksIG9yIGNyZWF0ZSBhIG5ldyBwcm9wZXJ0eSwKLSMgYXBwZW5kIGl0IHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUsIGFuZCBjaGFuZ2UgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgbmFtZS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgVGhpcyBmaWxlIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1YU0QgU2NoZW1hIEluZm9zZXQgTW9kZWwKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPUVjbGlwc2Uub3JnIHVwZGF0ZSBzaXRlCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1YTUwgU2NoZW1hIEluZm9zZXQgTW9kZWwKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRS5PUkcgU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLTE0dGggQXVndXN0LCAyMDAzXG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotRUNMSVBTRS5PUkcgTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgRWNsaXBzZS5vcmdcblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIENvbW1vbiBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJDUEwiKS4gQSBjb3B5IG9mIHRoZSBDUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgQ1BMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi1Db250ZW50IG1heSBiZSBhcHBvcnRpb25lZCBpbnRvIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHNcblwKLSgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3JcblwKLW1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZVxuXAotUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiBQbHVnLWlucyBhbmQgRnJhZ21lbnRzXG5cCi1hcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAicGx1Z2lucyIgYW5kIEZlYXR1cmVzIGFyZSBsb2NhdGVkIGluXG5cCi1kaXJlY3RvcmllcyBuYW1lZCAiZmVhdHVyZXMiLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIFN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSBFY2xpcHNlLm9yZyBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBDUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCBFY2xpcHNlLm9yZyB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIFRoZSBhYm92ZSBwcm9wZXJ0aWVzIGhhdmUgYmVlbiBzaGlwcGVkIGZvciB0cmFuc2xhdGlvbi4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgInNlY29uZGFyeVVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgc2Vjb25kYXJ5IHVwZGF0ZSBzaXRlIChvbiBkb3dubG9hZC5lY2xpcHNlLm9yZykKLXNlY29uZGFyeVVwZGF0ZVNpdGVOYW1lPUVNRi9TRE8vWFNEIFNlY29uZGFyeSBVcGRhdGUgU2l0ZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnhzZF8yLjAuMC9mZWF0dXJlLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS54c2RfMi4wLjAvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlNTEzNDIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnhzZF8yLjAuMC9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLnhzZCIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIyLjAuMCIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiCi0gICAgICBpbWFnZT0iZWNsaXBzZV91cGRhdGVfMTIwLmpwZyI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodCB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj4KLSAgICAgIENvcHlyaWdodCAoYykgMjAwMi0yMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly91cGRhdGUuZWNsaXBzZS5vcmcvdXBkYXRlcy8iLz4KLSAgICAgIDxkaXNjb3ZlcnkgbGFiZWw9IiVzZWNvbmRhcnlVcGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvdG9vbHMvZW1mL3VwZGF0ZXMvIi8+Ci0gICA8L3VybD4KLQotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzIiB2ZXJzaW9uPSIzLjAuMCIgbWF0Y2g9ImNvbXBhdGlibGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUiIHZlcnNpb249IjIuMC4wIiBtYXRjaD0iY29tcGF0aWJsZSIvPgotICAgPC9yZXF1aXJlcz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnhzZCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIyLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UueHNkLmVkaXQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMi4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnhzZC5lZGl0b3IiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMi4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnhzZC50ZXN0IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjIuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYubWFwcGluZy54c2QyZWNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMi4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi5tYXBwaW5nLnhzZDJlY29yZS5lZGl0b3IiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMi4wLjAiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnhzZF8yLjAuMC9saWNlbnNlLmh0bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UueHNkXzIuMC4wL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY4YzM4MC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UueHNkXzIuMC4wL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4KLTxoMj5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD4xNHRoIEF1Z3VzdCwgMjAwMzwvcD4KLQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgotCi08cD5FQ0xJUFNFLk9SRyBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotICAgCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+ICAgCi0gICAKLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSBFY2xpcHNlLm9yZyBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtDUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBDUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIENQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIENWUwotICAgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+Ci0KLTxwPkNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLiBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mICB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiAgIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMKLSAgIG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsgYW5kIEZlYXR1cmVzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LjwvcD4KLSAgCi08cD5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIEZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L3A+Ci0gIAotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0JPGxpPlN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgotCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+Ci0JCQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IEVjbGlwc2Uub3JnIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7LgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBDUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkKLQk8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IEVjbGlwc2Uub3JnIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvcGxhdGZvcm0ueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9wbGF0Zm9ybS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4M2U1YzQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9wbGF0Zm9ybS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNzkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS1DcmVhdGVkIG9uIE1vbiBBdWcgMjMgMTU6MDU6NDMgRURUIDIwMDQtLT4KLTxjb25maWcgZGF0ZT0iMTA5MzI4Nzk0MzEzNCIgdHJhbnNpZW50PSJmYWxzZSIgdmVyc2lvbj0iMy4wIj4KLTxzaXRlIGVuYWJsZWQ9InRydWUiIHBvbGljeT0iVVNFUi1FWENMVURFIiB1cGRhdGVhYmxlPSJ0cnVlIiB1cmw9InBsYXRmb3JtOi9iYXNlLyI+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFycnVwLnJhZC5mZWF0dXJlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcnJ1cC5yYWQuZmVhdHVyZV82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFydXBkYXRlLmRldi5wcm9kdWN0IiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcnVwZGF0ZS5kZXYucHJvZHVjdF82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFydXBkYXRlLmRldiIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJ1cGRhdGUuZGV2XzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS51bWwyIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLnVtbDJfMS4wLjEvIiB2ZXJzaW9uPSIxLjAuMSIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJhcnh0b29scy5jb21wYXJlbWVyZ2UuZWpiZGRmZWF0dXJlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcnh0b29scy5jb21wYXJlbWVyZ2UuZWpiZGQtZmVhdHVyZV82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuZm9vLnNlcnZlcmF0dGFjaC52NSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5mb28uc2VydmVyYXR0YWNoLnY1XzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5iYXJkZWJ1Zy54c2wiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYmFyZGVidWcueHNsXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5iYXJ4dG9vbHMucGxhdGZvcm0uZmVhdHVyZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJ4dG9vbHMucGxhdGZvcm0uZmVhdHVyZV82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFyc3VwcG9ydC5yYWQuZG9jIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcnN1cHBvcnQucmFkLmRvY18xLjAuMC8iIHZlcnNpb249IjEuMC4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFycjJhLnJkai5mZWF0dXJlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcnIyYS5yZGouZmVhdHVyZV82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFydXBkYXRlLnRlc3QuY3QuZmVhdHVyZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJ1cGRhdGUudGVzdC5jdC5mZWF0dXJlXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5iYXJ4dG9vbHMuZURhdGF2aXouZmVhdHVyZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJ4dG9vbHMuZURhdGF2aXouZmVhdHVyZV82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFycmFkLndlbGNvbWUuZmVhdHVyZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJyYWQud2VsY29tZS5mZWF0dXJlXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5iYXJkZWJ1Zy53c2EubGF1bmNoLmxvYWQiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYmFyZGVidWcud3NhLmxhdW5jaC5sb2FkXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5iYXJydXAuZmVhdHVyZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJydXAuZmVhdHVyZV82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFyeHRvb2xzLnZpc3VhbGl6YXRpb24uZmVhdHVyZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJ4dG9vbHMudmlzdWFsaXphdGlvbi5mZWF0dXJlXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5iYXJyYWQubmF2LmRvYy5mZWF0dXJlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcnJhZC5uYXYuZG9jLmZlYXR1cmVfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLnkudGVzdCIgcHJpbWFyeT0idHJ1ZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS55LnRlc3RfMy4wLjEvIiB2ZXJzaW9uPSIzLjAuMSIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJhcmRlYnVnLmFjdGl2ZXNjcmlwdC53aW4zMiIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJkZWJ1Zy5hY3RpdmVzY3JpcHQud2luMzJfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJhcnh0b29scy5wbGF0Zm9ybS53aW4zMi5mZWF0dXJlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcnh0b29scy5wbGF0Zm9ybS53aW4zMi5mZWF0dXJlXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5mb28ucG9ydGFsLnRvb2xzLmZlYXR1cmUiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuZm9vLnBvcnRhbC50b29scy5mZWF0dXJlXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5mb28uc2VydmVyYXR0YWNoIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmZvby5zZXJ2ZXJhdHRhY2hfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLnkudGVzdC5leGFtcGxlcyIgcHJpbWFyeT0idHJ1ZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS55LnRlc3QuZXhhbXBsZXNfMy4wLjEvIiB2ZXJzaW9uPSIzLjAuMSIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJhcnouY29tbW9uLnVpIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcnouY29tbW9uLnVpXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5iYXJ6LmVqYiIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJ6LmVqYl82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UueS5wcm9maWxpbmciIHByaW1hcnk9InRydWUiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UueS5wcm9maWxpbmdfMy4wLjEvIiB2ZXJzaW9uPSIzLjAuMSIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmZvby5lamJkZXBsb3kuZmVhdHVyZS5ubDEiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuZm9vLmVqYmRlcGxveS5mZWF0dXJlLm5sMV82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFyei5lbWYuaW50ZWdyYXRpb24iIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYmFyei5lbWYuaW50ZWdyYXRpb25fNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJhcmRlYnVnLmphdmFzY3JpcHQiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYmFyZGVidWcuamF2YXNjcmlwdF82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFyZGVidWcuYXN0LmZlYXR1cmUiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYmFyZGVidWcuYXN0LmZlYXR1cmVfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLndzdnQtZmVhdHVyZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Z0LWZlYXR1cmVfMS4wLjAvIiB2ZXJzaW9uPSIxLjAuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmZvby5zaWIubWVkaWF0aW9uLmRldmVsb3AuZmVhdHVyZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5mb28uc2liLm1lZGlhdGlvbi5kZXZlbG9wLmZlYXR1cmVfMS4wLjAvIiB2ZXJzaW9uPSIxLjAuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmZvby53ZWJzZXJ2aWNlLndhcy5jcmVhdGlvbi5lamIuZmVhdHVyZS5ubDEiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuZm9vLndlYnNlcnZpY2Uud2FzLmNyZWF0aW9uLmVqYi5mZWF0dXJlLm5sMV82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuZm9vLndlYmVkaXQuZWRpdG9yLmZlYXR1cmUiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuZm9vLndlYmVkaXQuZWRpdG9yLmZlYXR1cmVfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJhcnouZGF0YSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJ6LmRhdGFfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmZvby5zaWIubWVkaWF0aW9uLmRlcGxveS5mZWF0dXJlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmZvby5zaWIubWVkaWF0aW9uLmRlcGxveS5mZWF0dXJlXzEuMC4wLyIgdmVyc2lvbj0iMS4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5mb28uZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5mb28uZV82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuZm9vLndlYnNlcnZpY2Uud2FzLmNyZWF0aW9uLmVqYi5mZWF0dXJlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmZvby53ZWJzZXJ2aWNlLndhcy5jcmVhdGlvbi5lamIuZmVhdHVyZV82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuZm9vLnNpdGVlZGl0LmZlYXR1cmUiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuZm9vLnNpdGVlZGl0LmZlYXR1cmVfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmZvby5wcm9maWxpbmcuc2VydmVyLmNvbXBhdGlibGUiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuZm9vLnByb2ZpbGluZy5zZXJ2ZXIuY29tcGF0aWJsZV82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFyei53cyIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJ6LndzXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5mb28uZWpiLnNhbXBsZXMtZmVhdHVyZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5mb28uZWpiLnNhbXBsZXMtZmVhdHVyZV82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFyei5hY3Rpdml0aWVzLmZlYXR1cmUiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYmFyei5hY3Rpdml0aWVzLmZlYXR1cmVfMS4wLjAvIiB2ZXJzaW9uPSIxLjAuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmZvby5leGFtcGxlcyIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5mb28uZXhhbXBsZXNfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJhcnguc2RrIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcnguc2RrXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5iYXJkZWJ1Zy5wZHQud2luMzIiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYmFyZGVidWcucGR0LndpbjMyXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5iYXJkZWJ1Zy53c2EiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYmFyZGVidWcud3NhXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5mb28uanZlLmV4cHJlc3MiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuZm9vLmp2ZS5leHByZXNzXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5iYXJkYXRhLmxpbnV4IiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcmRhdGEubGludXhfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJhcnNzZS54bWxtYXJrdXAiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYmFyc3NlLnhtbG1hcmt1cF82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFyei52YWxpZGF0aW9uIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcnoudmFsaWRhdGlvbl82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UueS5nbGEiIHByaW1hcnk9InRydWUiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UueS5nbGFfMy4wLjEvIiB2ZXJzaW9uPSIzLjAuMSIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJhcnoud3MubW9kZWwiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYmFyei53cy5tb2RlbF82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFyeC5hc3QiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYmFyeC5hc3RfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJhcndzLmFzdC5zdC5leHQubmwxIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcndzLmFzdC5zdC5leHQubmwxXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5iYXJ6LmNvbW1vbi51dGlsaXRpZXMiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYmFyei5jb21tb24udXRpbGl0aWVzXzEuMC4wLyIgdmVyc2lvbj0iMS4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5iYXJ6LmNvbW1vbiIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJ6LmNvbW1vbl82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFyei54bWwubW9kZWwiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYmFyei54bWwubW9kZWxfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJhcmRlYnVnLnBkdCIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJkZWJ1Zy5wZHRfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJhcnoubmF2aWdhdG9yIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcnoubmF2aWdhdG9yXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5mb28ud2VidG9vbHMuZmVhdHVyZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5mb28ud2VidG9vbHMuZmVhdHVyZV82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFyei5lbWYuaW50ZWdyYXRpb24uY29yZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJ6LmVtZi5pbnRlZ3JhdGlvbi5jb3JlXzEuMC4wLyIgdmVyc2lvbj0iMS4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5mb28uc3RydXRzLmZlYXR1cmUiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuZm9vLnN0cnV0cy5mZWF0dXJlXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5iYXJzc2UuYmFzZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJzc2UuYmFzZV82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFyZGVidWcuaGVscC5kb2MiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYmFyZGVidWcuaGVscC5kb2NfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLnkubW9kZWxzIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLnkubW9kZWxzXzMuMC4xLyIgdmVyc2lvbj0iMy4wLjEiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS55LmxvZ2dpbmciIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UueS5sb2dnaW5nXzMuMC4xLyIgdmVyc2lvbj0iMy4wLjEiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5iYXJkZWJ1Zy5qYXZhc2NyaXB0Lm5sMS5mZWF0dXJlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcmRlYnVnLmphdmFzY3JpcHQubmwxLmZlYXR1cmVfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJhcndzLmFzdC5zdC5iYXRjaCIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJ3cy5hc3Quc3QuYmF0Y2hfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJhcnNzZS5zbmlwcGV0cyIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJzc2Uuc25pcHBldHNfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJhcndzLnJhcGlkZGVwbG95IiBwbHVnaW4taWRlbnRpZmllcj0ib3JnLmVjbGlwc2UuYmFyd3MucmFwaWRkZXBsb3kuY29yZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJ3cy5yYXBpZGRlcGxveV8xLjAuMC8iIHZlcnNpb249IjEuMC4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFyZGF0YSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJkYXRhXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5mb28uc2VjdXJpdHkiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuZm9vLnNlY3VyaXR5XzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5mb28ucHJvYmVraXQiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuZm9vLnByb2Jla2l0XzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5mb28uanNmLmZlYXR1cmUiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuZm9vLmpzZi5mZWF0dXJlXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5mb28uYW5hbHlzaXMiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuZm9vLmFuYWx5c2lzXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5mb28uYWMtdGVjaCIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5mb28uYWMtdGVjaF82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuZm9vLndlYnNlcnZpY2Uud2FzLmNyZWF0aW9uLmZlYXR1cmUiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuZm9vLndlYnNlcnZpY2Uud2FzLmNyZWF0aW9uLmZlYXR1cmVfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmZvby5lamIiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuZm9vLmVqYl82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuZm9vLmVqYmRlcGxveS5mZWF0dXJlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmZvby5lamJkZXBsb3kuZmVhdHVyZV81LjEuMS8iIHZlcnNpb249IjUuMS4xIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFyei5lIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcnouZV82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuZm9vLmZ0cCIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5mb28uZnRwXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS55LmV4YW1wbGVzIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLnkuZXhhbXBsZXNfMy4wLjEvIiB2ZXJzaW9uPSIzLjAuMSIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmZvby5qdmUuY29yZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5mb28uanZlLmNvcmVfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLnkuY29yZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS55LmNvcmVfMy4wLjEvIiB2ZXJzaW9uPSIzLjAuMSIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJhcnoud3MuYXhpcyIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJ6LndzLmF4aXNfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmZvby5qdmUuZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5mb28uanZlLmVfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmZvby5yZXNvdXJjZXMuY29tbW9uLmZlYXR1cmUiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuZm9vLnJlc291cmNlcy5jb21tb24uZmVhdHVyZV82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFyd3MiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYmFyd3NfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLnkiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UueV8zLjAuMS8iIHZlcnNpb249IjMuMC4xIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFyZGVidWcuYXN0Lm5sMS5mZWF0dXJlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcmRlYnVnLmFzdC5ubDEuZmVhdHVyZV82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFyeiIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJ6XzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5iYXJscGV4IiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcmxwZXhfMy4wLjAvIiB2ZXJzaW9uPSIzLjAuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJhcnhtbCIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJ4bWxfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJhcnoud3MuY29uc3VtcHRpb24iIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYmFyei53cy5jb25zdW1wdGlvbl82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuZm9vLmVnbC5mZWF0dXJlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmZvby5lZ2wuZmVhdHVyZV82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFyei5zZXJ2ZXIudG9tY2F0IiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcnouc2VydmVyLnRvbWNhdF82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFyd3MucmFwaWRkZXBsb3kuY21kZnJhbWV3b3JrIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcndzLnJhcGlkZGVwbG95LmNtZGZyYW1ld29ya18xLjAuMC8iIHZlcnNpb249IjEuMC4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuZm9vLmVqYi5zYmYuZmVhdHVyZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5mb28uZWpiLnNiZi5mZWF0dXJlXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5mb28ucWV2IiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmZvby5xZXZfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmZvby53cy5leHQuZmVhdHVyZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5mb28ud3MuZXh0LmZlYXR1cmVfNS45LjAvIiB2ZXJzaW9uPSI1LjkuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJhcnoueG1sIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcnoueG1sXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5iYXJ1cGRhdGUud2ViLmRldmVsb3BlciIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJ1cGRhdGUud2ViLmRldmVsb3Blcl82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFyd3MuYXN0LnN0LmJhc2UubmwxIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcndzLmFzdC5zdC5iYXNlLm5sMV82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFyei5qZHQuaW50ZWdyYXRpb24iIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYmFyei5qZHQuaW50ZWdyYXRpb25fNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLnkuc291cmNlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLnkuc291cmNlXzMuMC4xLyIgdmVyc2lvbj0iMy4wLjEiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5mb28uZ2xhIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmZvby5nbGFfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmZvby53cy5lamIubmwxLmZlYXR1cmUiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuZm9vLndzLmVqYi5ubDEuZmVhdHVyZV82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFyd3MuYXN0LnN0LmJhc2UiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYmFyd3MuYXN0LnN0LmJhc2VfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJhcnN1cHBvcnQucndkLmRvYyIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJzdXBwb3J0LnJ3ZC5kb2NfMS4wLjAvIiB2ZXJzaW9uPSIxLjAuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJhcnVwZGF0ZS5wZC5wcm9mIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcnVwZGF0ZS5wZC5wcm9mXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5mb28ud2Vic2VydmljZS53YXMuY3JlYXRpb24uZmVhdHVyZS5ubDEiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuZm9vLndlYnNlcnZpY2Uud2FzLmNyZWF0aW9uLmZlYXR1cmUubmwxXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS53c3Z0dmFsaWRhdG9yZmVhdHVyZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Z0dmFsaWRhdG9yZmVhdHVyZV8xLjAuMC8iIHZlcnNpb249IjEuMC4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFyd3MuYXN0LnN0LmJhdGNoLm5sMSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJ3cy5hc3Quc3QuYmF0Y2gubmwxXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5iYXJ3cy5hc3QuZG9jLmZlYXR1cmUiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYmFyd3MuYXN0LmRvYy5mZWF0dXJlXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5mb28ud3MuZWpiLmZlYXR1cmUiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuZm9vLndzLmVqYi5mZWF0dXJlXzUuOS4wLyIgdmVyc2lvbj0iNS45LjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5iYXJ3cy5yYXBpZGRlcGxveS5ubDEiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYmFyd3MucmFwaWRkZXBsb3kubmwxXzEuMC4wLyIgdmVyc2lvbj0iMS4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5iYXJ6LmpjYSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJ6LmpjYV82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFyei54bWwudmFsaWRhdGUiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYmFyei54bWwudmFsaWRhdGVfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJhcnouZXh0ZW5zaW9uIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcnouZXh0ZW5zaW9uXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5iYXJ6LmVudi51aSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJ6LmVudi51aV82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFyei5lbnYiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYmFyei5lbnZfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJhcnVwZGF0ZS5qc2NyaWIuZnJhbWV3b3JrIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcnVwZGF0ZS5qc2NyaWIuZnJhbWV3b3JrXzEuMi4wLyIgdmVyc2lvbj0iMS4yLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5iYXJkZWJ1Zy5wZHQubmwxLmZlYXR1cmUiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYmFyZGVidWcucGR0Lm5sMS5mZWF0dXJlXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5iYXJyd2QuZG9jLmZlYXR1cmUiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYmFycndkLmRvYy5mZWF0dXJlXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5iYXJ1cGRhdGUub3JwaGFucyIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJ1cGRhdGUub3JwaGFuc18xLjAuMC8iIHZlcnNpb249IjEuMC4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuZm9vLnByb2ZpbGluZyIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5mb28ucHJvZmlsaW5nXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS55LnByb2Jla2l0IiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLnkucHJvYmVraXRfMy4wLjEvIiB2ZXJzaW9uPSIzLjAuMSIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJhcnNzZS53ZWJtYXJrdXAiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYmFyc3NlLndlYm1hcmt1cF82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFyZGF0YS53aW4zMiIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJkYXRhLndpbjMyXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5iYXJ6LnNlcnZlciIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJ6LnNlcnZlcl82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuamVtIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmplbV8xLjAuMC8iIHZlcnNpb249IjEuMC4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuZm9vLnByb2plY3QuaW50ZXJjaGFuZ2UiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuZm9vLnByb2plY3QuaW50ZXJjaGFuZ2VfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLnZlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLnZlXzEuMC4wLyIgdmVyc2lvbj0iMS4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5iYXJkZWJ1Zy53c2EubmwxLmZlYXR1cmUiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYmFyZGVidWcud3NhLm5sMS5mZWF0dXJlXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5mb28ud2Vic2VydmljZS53YXMuZGVwbG95LmZlYXR1cmUubmwxIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmZvby53ZWJzZXJ2aWNlLndhcy5kZXBsb3kuZmVhdHVyZS5ubDFfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmZvby53cy5leHQubmwxLmZlYXR1cmUiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuZm9vLndzLmV4dC5ubDEuZmVhdHVyZV82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFyZGVidWcuaGVscGFzLmRvYyIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJkZWJ1Zy5oZWxwYXMuZG9jXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5mb28uZW1mLnVpLmludGVncmF0aW9uIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmZvby5lbWYudWkuaW50ZWdyYXRpb25fNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmZvby53ZWJzZXJ2aWNlLndhcy5kZXBsb3kuZmVhdHVyZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5mb28ud2Vic2VydmljZS53YXMuZGVwbG95LmZlYXR1cmVfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJhcnoud2ViIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcnoud2ViXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5mb28ucHJvZmlsaW5nLnNlcnZlciIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5mb28ucHJvZmlsaW5nLnNlcnZlcl82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFyd3MuYXN0LnN0LmV4dCIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJ3cy5hc3Quc3QuZXh0XzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5iYXJydXAudXBkYXRlem9uZS5mZWF0dXJlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcnJ1cC51cGRhdGV6b25lLmZlYXR1cmVfMS4wLjAvIiB2ZXJzaW9uPSIxLjAuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJhcnNhbXBsZWdhbGxlcnktZmVhdHVyZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJzYW1wbGVnYWxsZXJ5LWZlYXR1cmVfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmpkdC5zb3VyY2UiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuamR0LnNvdXJjZV8zLjAuMS8iIHZlcnNpb249IjMuMC4xIi8+Ci08ZmVhdHVyZSBhcHBsaWNhdGlvbj0ib3JnLmVjbGlwc2UudWkuaWRlLndvcmtiZW5jaCIgaWQ9Im9yZy5lY2xpcHNlLmJhcnVwZGF0ZS5zZHAuZmVhdHVyZSIgcHJpbWFyeT0idHJ1ZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJ1cGRhdGUuc2RwLmZlYXR1cmVfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLnBkZS5zb3VyY2UiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UucGRlLnNvdXJjZV8zLjAuMS8iIHZlcnNpb249IjMuMC4xIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuZm9vLmx1bS51dGlscy5mZWF0dXJlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmZvby5sdW0udXRpbHMuZmVhdHVyZV82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFyZXN1cHBvcnQuY2xpZW50Lm5sMSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJlc3VwcG9ydC5jbGllbnQvIiB2ZXJzaW9uPSIwLjkuMTQiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS55LmxvZ2dpbmciIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UueS5sb2dnaW5nXzMuMC4xLyIgdmVyc2lvbj0iMy4wLjEiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLmRvYyIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLmRvY18yLjAuMC8iIHZlcnNpb249IjIuMC4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuZm9vLmxvZ2dpbmciIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuZm9vLmxvZ2dpbmdfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJhcnVwZGF0ZS53ZWxjb21lLmZlYXR1cmUubmwxIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcnVwZGF0ZS53ZWxjb21lLmZlYXR1cmUubmwxLyIgdmVyc2lvbj0iNi4wLjAiLz4KLTxmZWF0dXJlIGFwcGxpY2F0aW9uPSJvcmcuZWNsaXBzZS51aS5pZGUud29ya2JlbmNoIiBpZD0ib3JnLmVjbGlwc2UucGxhdGZvcm0iIHByaW1hcnk9InRydWUiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UucGxhdGZvcm1fMy4wLjEvIiB2ZXJzaW9uPSIzLjAuMSIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJhcmNvbW1vbi5kb2MuZmVhdHVyZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJjb21tb24uZG9jLmZlYXR1cmUvIiB2ZXJzaW9uPSI2LjAuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmpkdCIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5qZHRfMy4wLjEvIiB2ZXJzaW9uPSIzLjAuMSIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJhcnN1cHBvcnQuY29yZS5kb2MiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYmFyc3VwcG9ydC5jb3JlLmRvYy8iIHZlcnNpb249IjEuMC4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UueHl6LmNsZWFyY2FzZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS54eXouY2xlYXJjYXNlXzYuMC4xMS8iIHZlcnNpb249IjYuMC4xMSIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJhcnR1dG9yaWFsZ2FsbGVyeS1mZWF0dXJlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcnR1dG9yaWFsZ2FsbGVyeS1mZWF0dXJlXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5iYXJ1cGRhdGUud2VsY29tZS5mZWF0dXJlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcnVwZGF0ZS53ZWxjb21lLmZlYXR1cmUvIiB2ZXJzaW9uPSI2LjAuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmVtZiIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWZfMi4wLjEvIiB2ZXJzaW9uPSIyLjAuMSIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLnBsYXRmb3JtLnNvdXJjZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5wbGF0Zm9ybS5zb3VyY2VfMy4wLjEvIiB2ZXJzaW9uPSIzLjAuMSIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJhcnVwZGF0ZS5jb21tb24uYWN0aXZpdGllcy5mZWF0dXJlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcnVwZGF0ZS5jb21tb24uYWN0aXZpdGllcy5mZWF0dXJlXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5iYXJ1cGRhdGUuY2RpLml0bG0iIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYmFydXBkYXRlLmNkaS5pdGxtXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5wZGUiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UucGRlXzMuMC4xLyIgdmVyc2lvbj0iMy4wLjEiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5lbWYuZG9jIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5kb2NfMi4wLjEvIiB2ZXJzaW9uPSIyLjAuMSIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8iIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkb18yLjAuMS8iIHZlcnNpb249IjIuMC4xIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFyc3VwcG9ydC5jb3JlLmRvYy5ubDEiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYmFyc3VwcG9ydC5jb3JlLmRvYy5ubDEvIiB2ZXJzaW9uPSIxLjAuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJhcnh0b29scy5jb21wYXJlbWVyZ2UiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYmFyeHRvb2xzLmNvbXBhcmVtZXJnZV82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFyeHRvb2xzLmNvbW1vbi51aS5wcm9wZXJ0aWVzIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcnh0b29scy5jb21tb24udWkucHJvcGVydGllc182LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UueHNkIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLnhzZF8yLjAuMS8iIHZlcnNpb249IjIuMC4xIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuZ2VmIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmdlZl8zLjAuMC8iIHZlcnNpb249IjMuMC4wIi8+Ci08L3NpdGU+Ci08L2NvbmZpZz4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmVhdHVyZTEucGx1Z2luMV8xLjEuMS5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZlYXR1cmUxLnBsdWdpbjFfMS4xLjEuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzk5NWQ1Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmVhdHVyZTEucGx1Z2luMV8xLjEuMS5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZlYXR1cmUyLnBsdWdpbjJfMi4yLjIuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5mZWF0dXJlMi5wbHVnaW4yXzIuMi4yLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGM5OTVkNS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZlYXR1cmUyLnBsdWdpbjJfMi4yLjIuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5kdW1teV83LjkuOC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmR1bW15XzcuOS44LmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhmMTkzZC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmR1bW15XzcuOS44LmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMV8zLjUuNi5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjFfMy41LjYuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjc1YWRlLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMV8zLjUuNi5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjJfNS4wLjAuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4yXzUuMC4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE5NThjNy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjJfNS4wLjAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMV8xLjEuMS9wbHVnaW4ueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMV8xLjEuMS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjA1ZDgyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLnBsdWdpbjFfMS4xLjEvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cGx1Z2luIG5hbWU9IkpVbml0IFRlc3QgRnJhbWV3b3JrIiBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMSIgdmVyc2lvbj0iMy41LjYiIHZlbmRvci1uYW1lPSJqdW5pdC5vcmciPg0KLSAgPHJ1bnRpbWU+DQotICAgIDxsaWJyYXJ5IG5hbWU9Imp1bml0LmphciI+DQotICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+DQotICAgIDwvbGlicmFyeT4NCi0gIDwvcnVudGltZT4NCi08L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5wbHVnaW4xXzEuMS4xL3NyYy5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5wbHVnaW4xXzEuMS4xL3NyYy5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkNGQ2MDkuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMV8xLjEuMS9zcmMuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcmVjb25jaWxpYXRpb25TaXRlcy9zaXRlMS9pbnN0YWxsL2ZlYXR1cmVzL2ZlYXR1cmUzL2ZlYXR1cmUueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcmVjb25jaWxpYXRpb25TaXRlcy9zaXRlMS9pbnN0YWxsL2ZlYXR1cmVzL2ZlYXR1cmUzL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTQxYWY4Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3JlY29uY2lsaWF0aW9uU2l0ZXMvc2l0ZTEvaW5zdGFsbC9mZWF0dXJlcy9mZWF0dXJlMy9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTMiIGltYWdlPSJmZWF0dXJlMS5naWYiIGxhYmVsPSJUaGlyZCBGZWF0dXJlIiBwcm92aWRlci1uYW1lPSJTbWFydCBDb21wYW55IiB2ZXJzaW9uPSIxLjAuMCIgPgotICA8ZGVzY3JpcHRpb24+RGVzY3JpcHRpb248L2Rlc2NyaXB0aW9uPgotICA8Y29weXJpZ2h0PmNvcHlyaWdodDwvY29weXJpZ2h0PgotICA8bGljZW5zZT5saWNlbnNlPC9saWNlbnNlPgotICA8dXJsPgotICAgIDx1cGRhdGUgbGFiZWw9IlVSTCB0byB1cGRhdGUgdGhlIGZlYXR1cmUiIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iLz4KLSAgICA8ZGlzY292ZXJ5IGxhYmVsPSJEaXNjb3ZlcnkgMSIgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIi8+Ci0gICAgPGRpc2NvdmVyeSBsYWJlbD0iRGlzY292ZXJ5IDIiIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyIvPgotICA8L3VybD4KLSAgPHBsdWdpbiBkb3dubG9hZC1zaXplPSIxNTAwIiBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLnBsdWdpbjEiIGluc3RhbGwtc2l6ZT0iMTAwMCIgZnJhZ21lbnQ9ImZhbHNlIiBubD0idXMiIG9zPSJPU19XSU4zMiIgdmVyc2lvbj0iMS4xLjEiIHdzPSJXU19XSU4zMiIvPgotPC9mZWF0dXJlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3JlY29uY2lsaWF0aW9uU2l0ZXMvc2l0ZTEvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMV8xLjEuMS9wbHVnaW4ueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcmVjb25jaWxpYXRpb25TaXRlcy9zaXRlMS9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5wbHVnaW4xXzEuMS4xL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwMTg0NmMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcmVjb25jaWxpYXRpb25TaXRlcy9zaXRlMS9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5wbHVnaW4xXzEuMS4xL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cGx1Z2luIG5hbWU9IkpVbml0IFRlc3QgRnJhbWV3b3JrIiBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMSIgdmVyc2lvbj0iMy41LjYiIHZlbmRvci1uYW1lPSJqdW5pdC5vcmciPgotICA8cnVudGltZT4KLSAgICA8bGlicmFyeSBuYW1lPSJqdW5pdC5qYXIiPgotICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+Ci0gICAgPC9saWJyYXJ5PgotICA8L3J1bnRpbWU+Ci08L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9yZWNvbmNpbGlhdGlvblNpdGVzL3NpdGUxL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLnBsdWdpbjFfMS4xLjEvc3JjLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3JlY29uY2lsaWF0aW9uU2l0ZXMvc2l0ZTEvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMV8xLjEuMS9zcmMuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDRkNjA5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3JlY29uY2lsaWF0aW9uU2l0ZXMvc2l0ZTEvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMV8xLjEuMS9zcmMuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcmVjb25jaWxpYXRpb25TaXRlcy9zaXRlMi9pbnN0YWxsL2ZlYXR1cmVzL2ZlYXR1cmUzL2ZlYXR1cmUueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcmVjb25jaWxpYXRpb25TaXRlcy9zaXRlMi9pbnN0YWxsL2ZlYXR1cmVzL2ZlYXR1cmUzL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGE3ZGU4Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3JlY29uY2lsaWF0aW9uU2l0ZXMvc2l0ZTIvaW5zdGFsbC9mZWF0dXJlcy9mZWF0dXJlMy9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTMiIGltYWdlPSJmZWF0dXJlMS5naWYiIGxhYmVsPSJUaGlyZCBGZWF0dXJlIiBwcm92aWRlci1uYW1lPSJTbWFydCBDb21wYW55IiB2ZXJzaW9uPSIxLjAuMCIgPgotICA8ZGVzY3JpcHRpb24+RGVzY3JpcHRpb248L2Rlc2NyaXB0aW9uPgotICA8Y29weXJpZ2h0PmNvcHlyaWdodDwvY29weXJpZ2h0PgotICA8bGljZW5zZT5saWNlbnNlPC9saWNlbnNlPgotICA8dXJsPgotICAgIDx1cGRhdGUgbGFiZWw9IlVSTCB0byB1cGRhdGUgdGhlIGZlYXR1cmUiIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iLz4KLSAgICA8ZGlzY292ZXJ5IGxhYmVsPSJEaXNjb3ZlcnkgMSIgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIi8+Ci0gICAgPGRpc2NvdmVyeSBsYWJlbD0iRGlzY292ZXJ5IDIiIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyIvPgotICA8L3VybD4KLSAgPHBsdWdpbiBkb3dubG9hZC1zaXplPSIxNTAwIiBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUiIGluc3RhbGwtc2l6ZT0iMTAwMCIgZnJhZ21lbnQ9ImZhbHNlIiBubD0idXMiIG9zPSJPU19XSU4zMiIgdmVyc2lvbj0iMi4xLjAiIHdzPSJXU19XSU4zMiIvPgotPC9mZWF0dXJlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3JlY29uY2lsaWF0aW9uU2l0ZXMvc2l0ZTIvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZV8yLjAuMC9wbHVnaW4ueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcmVjb25jaWxpYXRpb25TaXRlcy9zaXRlMi9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlXzIuMC4wL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwMTg0NmMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcmVjb25jaWxpYXRpb25TaXRlcy9zaXRlMi9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlXzIuMC4wL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cGx1Z2luIG5hbWU9IkpVbml0IFRlc3QgRnJhbWV3b3JrIiBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMSIgdmVyc2lvbj0iMy41LjYiIHZlbmRvci1uYW1lPSJqdW5pdC5vcmciPgotICA8cnVudGltZT4KLSAgICA8bGlicmFyeSBuYW1lPSJqdW5pdC5qYXIiPgotICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+Ci0gICAgPC9saWJyYXJ5PgotICA8L3J1bnRpbWU+Ci08L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9yZWNvbmNpbGlhdGlvblNpdGVzL3NpdGUyL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmVfMi4wLjAvc3JjLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3JlY29uY2lsaWF0aW9uU2l0ZXMvc2l0ZTIvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZV8yLjAuMC9zcmMuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDRkNjA5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3JlY29uY2lsaWF0aW9uU2l0ZXMvc2l0ZTIvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZV8yLjAuMC9zcmMuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcmVzb3VyY2VzLnByb3BlcnRpZXMgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9yZXNvdXJjZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE2MGU1Ni4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9yZXNvdXJjZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi1IVFRQX1BBVEhfMT0vb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUudXBkYXRldGVzdHMvVXBkYXRlTWFuYWdlcjIvDQotSFRUUF9QQVRIXzI9L29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlLnVwZGF0ZXRlc3RzL1VwZGF0ZU1hbmFnZXIvDQotSFRUUF9QQVRIXzM9L29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlLnVwZGF0ZXRlc3RzL1NpdGUgd2l0aCBzcGFjZS8NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9zaXRlLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3NpdGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZmM2MGM3Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3NpdGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08c2l0ZSB0eXBlPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5maWxlIj4NCi08ZGVzY3JpcHRpb24gdXJsPSJpbmZvL3NpdGVJbmZvLmh0bWwiLz4NCi0gIDxmZWF0dXJlIHVybD0idGVzdEFQSS9mZWF0dXJlcy9mZWF0dXJlMyI+DQotICAgIDxjYXRlZ29yeSBuYW1lPSJlY2xpcHNlL1VNTCIvPg0KLSAgPC9mZWF0dXJlPg0KLSAgPGZlYXR1cmUgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2ZlYXR1cmUyIj4NCi0gICAgPGNhdGVnb3J5IG5hbWU9ImVjbGlwc2UvSjJFRSIvPg0KLSAgPC9mZWF0dXJlPg0KLSAgPGZlYXR1cmUgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2ZlYXR1cmUxIj4NCi0gICAgPGNhdGVnb3J5IG5hbWU9ImVjbGlwc2UvSjJFRSIvPg0KLSAgPC9mZWF0dXJlPg0KLSAgPGFyY2hpdmUgcGF0aD0icGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMV8xLjEuMS5qYXIiIHVybD0icGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMV8xLjEuMSIvPiAgICANCi0gIDxjYXRlZ29yeS1kZWYgbGFiZWw9IkoyRUUgdG9vbHMiIG5hbWU9ImVjbGlwc2UvSjJFRSIvPg0KLSAgPGNhdGVnb3J5LWRlZiBsYWJlbD0iRUpCIFRvb2xzIiBuYW1lPSJlY2xpcHNlL0oyRUUvRUpCIi8+DQotICA8Y2F0ZWdvcnktZGVmIGxhYmVsPSJVTUwgdG9vbHMiIG5hbWU9ImVjbGlwc2UvVU1MIi8+DQotICA8Y2F0ZWdvcnktZGVmIGxhYmVsPSJNZXNzYWdpbmcgVG9vbHMiIG5hbWU9IkIyQiIvPg0KLSAgPGNhdGVnb3J5LWRlZiBsYWJlbD0iRWNsaXBzZSBUb29scyIgbmFtZT0iZWNsaXBzZSIvPg0KLTwvc2l0ZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9zaXRlMi9zaXRlLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3NpdGUyL3NpdGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWQxYzExLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3NpdGUyL3NpdGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxzaXRlIHVybD0iSW5mby5odG1sIiB0eXBlPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5maWxlIj4NCi0gIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvZmVhdHVyZTEiLz4NCi0gIDxhcmNoaXZlIHBhdGg9Im9yZy5lY2xpcHNlLnVwZGF0ZS5wbHVnaW4xIiB1cmw9InBsdWdpbnMvcGx1Z2luMSIvPg0KLSAgPGFyY2hpdmUgcGF0aD0ib3JnLmVjbGlwc2UudXBkYXRlLmFyY2hpdmUyIiB1cmw9InBsdWdpbnMvcGx1Z2luMiIvPg0KLTwvc2l0ZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9zaXRlVGVzdExvY2FsU2l0ZS9wbHVnaW5zL2J1bmRsZUFuZFBsdWdpbk1hbmlmZXN0c18xLjAuMy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3NpdGVUZXN0TG9jYWxTaXRlL3BsdWdpbnMvYnVuZGxlQW5kUGx1Z2luTWFuaWZlc3RzXzEuMC4zL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjIzZTRmLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3NpdGVUZXN0TG9jYWxTaXRlL3BsdWdpbnMvYnVuZGxlQW5kUGx1Z2luTWFuaWZlc3RzXzEuMC4zL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotR2VuZXJhdGVkLWZyb206IDEwNzcwNjI2MDM3MDgKLUJ1bmRsZS1OYW1lOiBUZXN0Ci1CdW5kbGUtVmVyc2lvbjogMS4wLjMKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmJ1bmRsZUFuZFBsdWdpbk1hbmlmZXN0c0JVTkRMRVBBUlNFRAotQnVuZGxlLVZlbmRvcjogRWNsaXBzZS5vcmcKLUJ1bmRsZS1DbGFzc1BhdGg6IHBsdWdpbi5qYXIKLUxlZ2FjeTogdHJ1ZQotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuYnVuZGxlQW5kUGx1Z2luTWFuaWZlc3RzLkFjdGl2YXRvcgotUmVxdWlyZS1CdW5kbGU6IAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS51aQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvc2l0ZVRlc3RMb2NhbFNpdGUvcGx1Z2lucy9idW5kbGVBbmRQbHVnaW5NYW5pZmVzdHNfMS4wLjMvcGx1Z2luLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3NpdGVUZXN0TG9jYWxTaXRlL3BsdWdpbnMvYnVuZGxlQW5kUGx1Z2luTWFuaWZlc3RzXzEuMC4zL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiNTlkZGIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvc2l0ZVRlc3RMb2NhbFNpdGUvcGx1Z2lucy9idW5kbGVBbmRQbHVnaW5NYW5pZmVzdHNfMS4wLjMvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwbHVnaW4gbmFtZT0iSlVuaXQgVGVzdCBGcmFtZXdvcmsiIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5idW5kbGVBbmRQbHVnaW5NYW5pZmVzdHMiIHZlcnNpb249IjEuMC4zIiB2ZW5kb3ItbmFtZT0iRWNsaXBzZS5vcmciPgotPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvc2l0ZVRlc3RMb2NhbFNpdGUvcGx1Z2lucy9idW5kbGVNYW5pZmVzdF8xLjAuMS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3NpdGVUZXN0TG9jYWxTaXRlL3BsdWdpbnMvYnVuZGxlTWFuaWZlc3RfMS4wLjEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1NmU2ODAuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvc2l0ZVRlc3RMb2NhbFNpdGUvcGx1Z2lucy9idW5kbGVNYW5pZmVzdF8xLjAuMS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLUdlbmVyYXRlZC1mcm9tOiAxMDc3MDYyNjAzNzA4Ci1CdW5kbGUtTmFtZTogVGVzdAotQnVuZGxlLVZlcnNpb246IDEuMC4xCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5idW5kbGVNYW5pZmVzdDsgc2luZ2xldG9uPXRydWUKLUJ1bmRsZS1WZW5kb3I6IEVjbGlwc2Uub3JnCi1CdW5kbGUtQ2xhc3NQYXRoOiBwbHVnaW4uamFyCi1MZWdhY3k6IHRydWUKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmJ1bmRsZU1hbmlmZXN0LkFjdGl2YXRvcgotUmVxdWlyZS1CdW5kbGU6IAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS51aQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvc2l0ZVRlc3RMb2NhbFNpdGUvcGx1Z2lucy9mZWF0dXJlMV9wbHVnaW4yXzUuMC4wL3BsdWdpbi54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9zaXRlVGVzdExvY2FsU2l0ZS9wbHVnaW5zL2ZlYXR1cmUxX3BsdWdpbjJfNS4wLjAvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y4MWM0Ni4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9zaXRlVGVzdExvY2FsU2l0ZS9wbHVnaW5zL2ZlYXR1cmUxX3BsdWdpbjJfNS4wLjAvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cGx1Z2luIG5hbWU9IkpVbml0IFRlc3QgRnJhbWV3b3JrIiBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMiIgdmVyc2lvbj0iNS4wLjAiIHZlbmRvci1uYW1lPSJqdW5pdC5vcmciPg0KLSAgPHJ1bnRpbWU+DQotICAgIDxsaWJyYXJ5IG5hbWU9Imp1bml0LmphciI+DQotICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+DQotICAgIDwvbGlicmFyeT4NCi0gIDwvcnVudGltZT4NCi08L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9zaXRlVGVzdExvY2FsU2l0ZS9wbHVnaW5zL2ZlYXR1cmUxX3BsdWdpbjJfNS4wLjAvc3JjLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3NpdGVUZXN0TG9jYWxTaXRlL3BsdWdpbnMvZmVhdHVyZTFfcGx1Z2luMl81LjAuMC9zcmMuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDRkNjA5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3NpdGVUZXN0TG9jYWxTaXRlL3BsdWdpbnMvZmVhdHVyZTFfcGx1Z2luMl81LjAuMC9zcmMuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvc2l0ZVRlc3RMb2NhbFNpdGUvcGx1Z2lucy9mZWF0dXJlMV9wbHVnaW4yXzUuMC4xL3BsdWdpbi54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9zaXRlVGVzdExvY2FsU2l0ZS9wbHVnaW5zL2ZlYXR1cmUxX3BsdWdpbjJfNS4wLjEvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZiM2MyNi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9zaXRlVGVzdExvY2FsU2l0ZS9wbHVnaW5zL2ZlYXR1cmUxX3BsdWdpbjJfNS4wLjEvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cGx1Z2luIG5hbWU9IkpVbml0IFRlc3QgRnJhbWV3b3JrIiBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMiIgdmVyc2lvbj0iNS4wLjEiIHZlbmRvci1uYW1lPSJqdW5pdC5vcmciPg0KLSAgPHJ1bnRpbWU+DQotICAgIDxsaWJyYXJ5IG5hbWU9Imp1bml0LmphciI+DQotICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+DQotICAgIDwvbGlicmFyeT4NCi0gIDwvcnVudGltZT4NCi08L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9zaXRlVGVzdExvY2FsU2l0ZS9wbHVnaW5zL2ZlYXR1cmUxX3BsdWdpbjJfNS4wLjEvc3JjLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3NpdGVUZXN0TG9jYWxTaXRlL3BsdWdpbnMvZmVhdHVyZTFfcGx1Z2luMl81LjAuMS9zcmMuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDRkNjA5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3NpdGVUZXN0TG9jYWxTaXRlL3BsdWdpbnMvZmVhdHVyZTFfcGx1Z2luMl81LjAuMS9zcmMuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvc2l0ZVRlc3RMb2NhbFNpdGUvcGx1Z2lucy9ub3RCdW5kbGVNYW5pZmVzdF8xLjAuMi9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3NpdGVUZXN0TG9jYWxTaXRlL3BsdWdpbnMvbm90QnVuZGxlTWFuaWZlc3RfMS4wLjIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2NmZiMGYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvc2l0ZVRlc3RMb2NhbFNpdGUvcGx1Z2lucy9ub3RCdW5kbGVNYW5pZmVzdF8xLjAuMi9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotR2VuZXJhdGVkLWZyb206IDEwNzcwNjI2MDM3MDgKLUJ1bmRsZS1OYW1lOiBOb3QgVmFsaWQgQnVuZGxlIE1hbmlmZXN0Ci1CdW5kbGUtVmVyc2lvbjogMS4wLjIKLUJ1bmRsZS1WZW5kb3I6IEVjbGlwc2Uub3JnCi1CdW5kbGUtQ2xhc3NQYXRoOiBwbHVnaW4uamFyCi1SZXF1aXJlLUJ1bmRsZTogCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLnVpCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS90ZXN0QVBJL2ZlYXR1cmVzL2ZlYXR1cmUzL2ZlYXR1cmUueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvdGVzdEFQSS9mZWF0dXJlcy9mZWF0dXJlMy9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg3OGQ2MC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS90ZXN0QVBJL2ZlYXR1cmVzL2ZlYXR1cmUzL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMyIgaW1hZ2U9ImZlYXR1cmUxLmdpZiIgbGFiZWw9IlRoaXJkIEZlYXR1cmUiIHByb3ZpZGVyLW5hbWU9IlNtYXJ0IENvbXBhbnkiIHZlcnNpb249IjEuMC4wIiA+Ci0gIDxkZXNjcmlwdGlvbj5EZXNjcmlwdGlvbjwvZGVzY3JpcHRpb24+Ci0gIDxjb3B5cmlnaHQ+Y29weXJpZ2h0PC9jb3B5cmlnaHQ+Ci0gIDxsaWNlbnNlPmxpY2Vuc2U8L2xpY2Vuc2U+Ci0gIDx1cmw+Ci0gICAgPHVwZGF0ZSBsYWJlbD0iVVJMIHRvIHVwZGF0ZSB0aGUgZmVhdHVyZSIgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyIvPgotICAgIDxkaXNjb3ZlcnkgbGFiZWw9IkRpc2NvdmVyeSAxIiB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciLz4KLSAgICA8ZGlzY292ZXJ5IGxhYmVsPSJEaXNjb3ZlcnkgMiIgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIi8+Ci0gIDwvdXJsPgotICA8cGx1Z2luIGRvd25sb2FkLXNpemU9IjE1MDAiIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMSIgaW5zdGFsbC1zaXplPSIxMDAwIiBmcmFnbWVudD0iZmFsc2UiIG5sPSJ1cyIgb3M9IldJTjMyLExJTlVYIiB2ZXJzaW9uPSIxLjEuMSIvPgotPC9mZWF0dXJlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3Rlc3RBUEkvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMV8xLjEuMS9wbHVnaW4ueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvdGVzdEFQSS9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5wbHVnaW4xXzEuMS4xL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwMTg0NmMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvdGVzdEFQSS9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5wbHVnaW4xXzEuMS4xL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cGx1Z2luIG5hbWU9IkpVbml0IFRlc3QgRnJhbWV3b3JrIiBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMSIgdmVyc2lvbj0iMy41LjYiIHZlbmRvci1uYW1lPSJqdW5pdC5vcmciPgotICA8cnVudGltZT4KLSAgICA8bGlicmFyeSBuYW1lPSJqdW5pdC5qYXIiPgotICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+Ci0gICAgPC9saWJyYXJ5PgotICA8L3J1bnRpbWU+Ci08L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS90ZXN0QVBJL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLnBsdWdpbjFfMS4xLjEvc3JjLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3Rlc3RBUEkvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMV8xLjEuMS9zcmMuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDRkNjA5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3Rlc3RBUEkvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMV8xLjEuMS9zcmMuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvdGVzdEFQSS9zaXRlLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3Rlc3RBUEkvc2l0ZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjMTVkNDMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvdGVzdEFQSS9zaXRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08c2l0ZSB0eXBlPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5maWxlIj4KLTxkZXNjcmlwdGlvbiB1cmw9ImluZm8vc2l0ZUluZm8uaHRtbCIvPgotICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL2ZlYXR1cmUzIj4KLSAgICA8Y2F0ZWdvcnkgbmFtZT0iZWNsaXBzZS9VTUwiLz4KLSAgPC9mZWF0dXJlPgotICA8ZmVhdHVyZSB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZmVhdHVyZTIiPgotICAgIDxjYXRlZ29yeSBuYW1lPSJlY2xpcHNlL0oyRUUiLz4KLSAgPC9mZWF0dXJlPgotICA8ZmVhdHVyZSB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZmVhdHVyZTEiPgotICAgIDxjYXRlZ29yeSBuYW1lPSJlY2xpcHNlL0oyRUUiLz4KLSAgPC9mZWF0dXJlPgotICA8YXJjaGl2ZSBwYXRoPSJwbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5wbHVnaW4xXzEuMS4xLmphciIgdXJsPSJwbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5wbHVnaW4xXzEuMS4xIi8+ICAgIAotICA8Y2F0ZWdvcnktZGVmIGxhYmVsPSJKMkVFIHRvb2xzIiBuYW1lPSJlY2xpcHNlL0oyRUUiLz4KLSAgPGNhdGVnb3J5LWRlZiBsYWJlbD0iRUpCIFRvb2xzIiBuYW1lPSJlY2xpcHNlL0oyRUUvRUpCIi8+Ci0gIDxjYXRlZ29yeS1kZWYgbGFiZWw9IlVNTCB0b29scyIgbmFtZT0iZWNsaXBzZS9VTUwiLz4KLSAgPGNhdGVnb3J5LWRlZiBsYWJlbD0iTWVzc2FnaW5nIFRvb2xzIiBuYW1lPSJCMkIiLz4KLSAgPGNhdGVnb3J5LWRlZiBsYWJlbD0iRWNsaXBzZSBUb29scyIgbmFtZT0iZWNsaXBzZSIvPgotPC9zaXRlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3ZhbGlkYXRpb24vc2l0ZTIvLmVjbGlwc2Vwcm9kdWN0IGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvdmFsaWRhdGlvbi9zaXRlMi8uZWNsaXBzZXByb2R1Y3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiODI5YWEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvdmFsaWRhdGlvbi9zaXRlMi8uZWNsaXBzZXByb2R1Y3QKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLWlkPWFub3RoZXIucHJvZHVjdC5pZA0KLW5hbWU9TmFtZSBvZiB0aGUgcHJvZHVjdA0KLXZlcj0xLjIuNApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3ZhbGlkYXRpb24vc2l0ZTMvLmVjbGlwc2VleHRlbnNpb24gYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS92YWxpZGF0aW9uL3NpdGUzLy5lY2xpcHNlZXh0ZW5zaW9uCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDcyZGY3Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3ZhbGlkYXRpb24vc2l0ZTMvLmVjbGlwc2VleHRlbnNpb24KKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1pZD1pZC5vZi5leHRlbmRlZC5wcm9kdWN0ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvdmFsaWRhdGlvbi9zaXRlNC9lY2xpcHNlLy5lY2xpcHNlZXh0ZW5zaW9uIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvdmFsaWRhdGlvbi9zaXRlNC9lY2xpcHNlLy5lY2xpcHNlZXh0ZW5zaW9uCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2M4NGU5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3ZhbGlkYXRpb24vc2l0ZTQvZWNsaXBzZS8uZWNsaXBzZWV4dGVuc2lvbgorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWlkPWRpZmZlcmVudC5wcm9kdWN0LmlkClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvdmFsaWRhdGlvbi9zaXRlNS8uZWNsaXBzZVVNIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvdmFsaWRhdGlvbi9zaXRlNS8uZWNsaXBzZVVNCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTZjNTIyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3ZhbGlkYXRpb24vc2l0ZTUvLmVjbGlwc2VVTQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotaWQ9b3JnLmVjbGlwc2UucGxhdGZvcm0NCi1uYW1lPWEgUHJvZHVjdCANCi12ZXJzaW9uPTMuNS42ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvdmFsaWRhdGlvbi9zaXRlNS9lY2xpcHNlLy5lY2xpcHNlZXh0ZW5zaW9uIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvdmFsaWRhdGlvbi9zaXRlNS9lY2xpcHNlLy5lY2xpcHNlZXh0ZW5zaW9uCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmY0MGEzLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3ZhbGlkYXRpb24vc2l0ZTUvZWNsaXBzZS8uZWNsaXBzZWV4dGVuc2lvbgorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotaWQ9b3JnLmVjbGlwc2UucGxhdGZvcm0KLW5hbWU9RWNsaXBzZSBQbGF0Zm9ybQotdmVyc2lvbj0zLjEuMApkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvdmFsaWRhdGlvbi9zaXRlNi8uZWNsaXBzZVVNIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvdmFsaWRhdGlvbi9zaXRlNi8uZWNsaXBzZVVNCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTdmOWY4Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3ZhbGlkYXRpb24vc2l0ZTYvLmVjbGlwc2VVTQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWlkPW9yZy5lY2xpcHNlLnNkawpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3ZhbGlkYXRpb24vc2l0ZTYvY2hpbGRyZW4vY2hpbGRyZW4vZWNsaXBzZS8uZWNsaXBzZWV4dGVuc2lvbiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3ZhbGlkYXRpb24vc2l0ZTYvY2hpbGRyZW4vY2hpbGRyZW4vZWNsaXBzZS8uZWNsaXBzZWV4dGVuc2lvbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk3ZjlmOC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS92YWxpZGF0aW9uL3NpdGU2L2NoaWxkcmVuL2NoaWxkcmVuL2VjbGlwc2UvLmVjbGlwc2VleHRlbnNpb24KKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1pZD1vcmcuZWNsaXBzZS5zZGsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS94bWxzL2FwaXRlc3RzL29yZy5lY2xpcHNlLnRlc3QuZmVhdHVyZV8xLjAuMC9mZWF0dXJlLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3htbHMvYXBpdGVzdHMvb3JnLmVjbGlwc2UudGVzdC5mZWF0dXJlXzEuMC4wL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTExODAwLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3htbHMvYXBpdGVzdHMvb3JnLmVjbGlwc2UudGVzdC5mZWF0dXJlXzEuMC4wL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08ZmVhdHVyZSBpZD0ib3JnLnRlc3QxLmlkZW50MSIgbGFiZWw9IkZlYXR1cmUgT25lIiBubD0iZW5fdXMsZnIsZGUiIG9zPSJPU19XSU4zMixPU19MSU5VWCIgcHJvdmlkZXItbmFtZT0iT2JqZWN0IFRlY2hub2xvZ3kgSW50ZXJuYXRpb25hbCIgdmVyc2lvbj0iMS4wLjAiIHdzPSJXU19XSU4zMixXU19NT1RJRixXU19HVEsiPg0KLSAgPGRlc2NyaXB0aW9uPlRlc3QgZmVhdHVyZSBmb3IgdGVzdElkZW50aWZpZXIgdGVzdDwvZGVzY3JpcHRpb24+DQotICA8Y29weXJpZ2h0PkNvcHlyaWdodCAoYykgdGhlIGNvbXBhbnk8L2NvcHlyaWdodD4NCi0gIDxsaWNlbnNlPkRvIHlvdSBhY2NlcHQgdGhlIGxpY2Vuc2UgPzwvbGljZW5zZT4NCi0gIDx1cmw+DQotICAgIDx1cGRhdGUgbGFiZWw9IlVSTCB0byB1cGRhdGUgdGVoIGZlYXR1cmUiIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyIvPg0KLSAgICA8ZGlzY292ZXJ5IGxhYmVsPSJEaXNjb3ZlcnkgMSIgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIi8+DQotICAgIDxkaXNjb3ZlcnkgbGFiZWw9IkRpc2NvdmVyeSAyIiB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciLz4NCi0gIDwvdXJsPg0KLSAgPHBsdWdpbiBkb3dubG9hZC1zaXplPSIxNTAwIiBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMSIgaW5zdGFsbC1zaXplPSIxMDAwIiBmcmFnbWVudD0iZmFsc2UiIG5sPSJ1cyIgb3M9Ik9TX1dJTjMyIiB2ZXJzaW9uPSIzLjUuNiIgd3M9IldTX1dJTjMyIi8+DQotICA8cGx1Z2luIGRvd25sb2FkLXNpemU9IjEyMDAiIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4yIiBpbnN0YWxsLXNpemU9Ijk3OCIgZnJhZ21lbnQ9ImZhbHNlIiB2ZXJzaW9uPSI1LjAuMCIvPg0KLTwvZmVhdHVyZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS94bWxzL2FwaXRlc3RzL29yZy5lY2xpcHNlX3Rlc3RfZmVhdHVyZS9mZWF0dXJlLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3htbHMvYXBpdGVzdHMvb3JnLmVjbGlwc2VfdGVzdF9mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjA1Y2RhLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3htbHMvYXBpdGVzdHMvb3JnLmVjbGlwc2VfdGVzdF9mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08ZmVhdHVyZSBpZD0ib3JnLnRlc3QxLmlkZW50MiIgbGFiZWw9IkZlYXR1cmUgT25lIiBubD0iZW5fdXMsZnIsZGUiIG9zPSJPU19XSU4zMixPU19MSU5VWCIgcHJvdmlkZXItbmFtZT0iT2JqZWN0IFRlY2hub2xvZ3kgSW50ZXJuYXRpb25hbCIgdmVyc2lvbj0iMS4wLjAiIHdzPSJXU19XSU4zMixXU19NT1RJRixXU19HVEsiPg0KLSAgPGRlc2NyaXB0aW9uPlRlc3QgZmVhdHVyZSBmb3IgdGVzdElkZW50aWZpZXIgdGVzdDwvZGVzY3JpcHRpb24+DQotICA8Y29weXJpZ2h0PkNvcHlyaWdodCAoYykgdGhlIGNvbXBhbnk8L2NvcHlyaWdodD4NCi0gIDxsaWNlbnNlPkRvIHlvdSBhY2NlcHQgdGhlIGxpY2Vuc2UgPzwvbGljZW5zZT4NCi0gIDx1cmw+DQotICAgIDx1cGRhdGUgbGFiZWw9IlVSTCB0byB1cGRhdGUgdGVoIGZlYXR1cmUiIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyIvPg0KLSAgICA8ZGlzY292ZXJ5IGxhYmVsPSJEaXNjb3ZlcnkgMSIgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIi8+DQotICAgIDxkaXNjb3ZlcnkgbGFiZWw9IkRpc2NvdmVyeSAyIiB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciLz4NCi0gIDwvdXJsPg0KLSAgPHBsdWdpbiBkb3dubG9hZC1zaXplPSIxNTAwIiB1cmw9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjEiIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4xIiBpbnN0YWxsLXNpemU9IjEwMDAiIGZyYWdtZW50PSJmYWxzZSIgbmw9InVzIiBvcz0iT1NfV0lOMzIiIHZlcnNpb249IjMuNS42IiB3cz0iV1NfV0lOMzIiLz4NCi0gIDxwbHVnaW4gZG93bmxvYWQtc2l6ZT0iMTIwMCIgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjIiIGluc3RhbGwtc2l6ZT0iOTc4IiBmcmFnbWVudD0iZmFsc2UiIHZlcnNpb249IjUuMC4wIi8+DQotPC9mZWF0dXJlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3htbHMvZmVhdHVyZV8xLjAuMC9mZWF0dXJlLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3htbHMvZmVhdHVyZV8xLjAuMC9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRlZTEzOS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS94bWxzL2ZlYXR1cmVfMS4wLjAvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMSIgaW1hZ2U9ImZlYXR1cmUxLmdpZiIgbGFiZWw9IkZlYXR1cmUgT25lIiBubD0iZW4sZnIsZGUiIG9zPSJPU19XSU4zMixPU19MSU5VWCIgcHJvdmlkZXItbmFtZT0iT2JqZWN0IFRlY2hub2xvZ3kgSW50ZXJuYXRpb25hbCIgdmVyc2lvbj0iMS4wLjQiIHdzPSJXU19XSU4zMixXU19NT1RJRixXU19HVEsiPg0KLSAgPGRlc2NyaXB0aW9uPkkgYmVsaWV2ZSB0aGlzIGlzIHRoZSBkZXNjcmlwdGlvbiBvZiBmZWF0dXJlIDEsIHdlbGwsIGZlYXR1cmUgMSBpcyBhbiBleGNlcHRpb25hbCBmZWF0dXJlIHRoYXQgeW91IHNob3VsZCBpbnN0YWxsIHJpZ2h0IE5PVyBvbiB5b3VyIG1hY2hpbmUuLi4gdHJ5IGl0LjwvZGVzY3JpcHRpb24+DQotICA8Y29weXJpZ2h0Pk9rLCBub3csIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgY29tcGxleCBDb3B5cmlnaHQgIG5vdCBwcmVwYXJlZCBieSBhIGxhd3llciBDb3B5cmlnaHQgKGMpIHRoZSBjb21wYW55PC9jb3B5cmlnaHQ+DQotICA8bGljZW5zZT4jMSBEbyB5b3UgYWNjZXB0IGl0ICMyIHlvdSBkbyBudG8gYWNjZXB0IGl0IC4uLkRvIHlvdSBhY2NwdCBpdCA/PC9saWNlbnNlPg0KLSAgPHVybD4NCi0gICAgPHVwZGF0ZSBsYWJlbD0iVVJMIHRvIHVwZGF0ZSB0aGUgZmVhdHVyZSIgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3BhdGgvZmVhdHVyZTEvIi8+DQotICAgIDxkaXNjb3ZlcnkgbGFiZWw9IkRpc2NvdmVyeSAxIiB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciLz4NCi0gICAgPGRpc2NvdmVyeSBsYWJlbD0iRGlzY292ZXJ5IDIiIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyIvPg0KLSAgPC91cmw+DQotICA8cGx1Z2luIGRvd25sb2FkLXNpemU9IjE1MDAiIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4xIiBpbnN0YWxsLXNpemU9IjEwMDAiIGZyYWdtZW50PSJmYWxzZSIgbmw9InVzIiBvcz0iT1NfV0lOMzIiIHZlcnNpb249IjMuNS42IiB3cz0iV1NfV0lOMzIiLz4NCi0gIDxwbHVnaW4gZG93bmxvYWQtc2l6ZT0iMTIwMCIgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjIiIGluc3RhbGwtc2l6ZT0iOTc4IiBmcmFnbWVudD0iZmFsc2UiIHZlcnNpb249IjUuMC4wIi8+DQotPC9mZWF0dXJlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3htbHMvZmVhdHVyZV8xLjAuMC9mZWF0dXJlMS5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS94bWxzL2ZlYXR1cmVfMS4wLjAvZmVhdHVyZTEuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2UzMGEyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3htbHMvZmVhdHVyZV8xLjAuMC9mZWF0dXJlMS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS94bWxzL3NpdGUxL3NpdGUueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEveG1scy9zaXRlMS9zaXRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ4MjNjMC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS94bWxzL3NpdGUxL3NpdGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08c2l0ZSB1cmw9ImluZm8iIHR5cGU9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZpbGUiPg0KLSAgPGZlYXR1cmUgaWQ9Im9yZy5pc3YuZmVhdHVyZTMiIHVybD0id3d3LmVjbGlwc2Uub3JnL2ZlYXR1cmUzIiB2ZXJzaW9uPSIzLjQuNSI+DQotICAgIDxjYXRlZ29yeSBuYW1lPSJlY2xpcHNlL1VNTCIvPg0KLSAgPC9mZWF0dXJlPg0KLSAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUyIiB1cmw9Ind3dy5lY2xpcHNlLm9yZy9mZWF0dXJlMiIgdmVyc2lvbj0iMy40LjYiPg0KLSAgICA8Y2F0ZWdvcnkgbmFtZT0iZWNsaXBzZS9KMkVFIi8+DQotICA8L2ZlYXR1cmU+DQotICA8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmF0dXJlMSIgdXJsPSJ3d3cuZWNsaXBzZS5vcmcvZmVhdHVyZTEiIHZlcnNpb249IjIuMy41Ij4NCi0gICAgPGNhdGVnb3J5IG5hbWU9ImVjbGlwc2UvSjJFRSIvPg0KLSAgPC9mZWF0dXJlPg0KLSAgPGFyY2hpdmUgcGF0aD0ib3JnLmVjbGlwc2UudXBkYXRlLnBsdWdpbjEiIHVybD0id3d3LmVjbGlwc2Uub3JnL3BsdWlnbjEiLz4NCi0gIDxhcmNoaXZlIHBhdGg9Im9yZy5lY2xpcHNlLnVwZGF0ZS5hcmNoaXZlMiIgdXJsPSJ3d3cuZWNsaXBzZS5vcmcvcGx1Z2luMiIvPg0KLSAgPGFyY2hpdmUgcGF0aD0ib3JnLmVjbGlwc2UudXBkYXRlLnBsdWdpbjMiIHVybD0id3d3LmVjbGlwc2Uub3JnL3BsdWdpbjMiLz4NCi0gIDxhcmNoaXZlIHBhdGg9Im9yZy5lY2xpcHNlLnVua25vd24ucGx1Z2luIiB1cmw9Ind3dy5lY2xpcHNlLm9yZy9wbHVnaW5zL3BsdWdpbjQiLz4NCi0gIDxhcmNoaXZlIHBhdGg9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLmZvbzEiIHVybD0id3d3LmVjbGlwc2Uub3JnL3BsdWdpbjEiLz4NCi0gIDxjYXRlZ29yeS1kZWYgbGFiZWw9IkoyRUUgdG9vbHMiIG5hbWU9ImVjbGlwc2UvSjJFRSIvPg0KLSAgPGNhdGVnb3J5LWRlZiBsYWJlbD0iRUpCIFRvb2xzIiBuYW1lPSJlY2xpcHNlL0oyRUUvRUpCIi8+DQotICA8Y2F0ZWdvcnktZGVmIGxhYmVsPSJVTUwgdG9vbHMiIG5hbWU9ImVjbGlwc2UvVU1MIi8+DQotICA8Y2F0ZWdvcnktZGVmIGxhYmVsPSJNZXNzYWdpbmcgVG9vbHMiIG5hbWU9IkIyQiIvPg0KLSAgPGNhdGVnb3J5LWRlZiBsYWJlbD0iRWNsaXBzZSB0b29scyIgbmFtZT0iZWNsaXBzZSIvPg0KLTwvc2l0ZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlZjU3NDAuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLQ0KLW5hbWUgPSBJbnN0YWxsL1VwZGF0ZSBDb3JlIFRlc3RzDQotcHJvdmlkZXItbmFtZSA9IEVjbGlwc2Uub3JnDQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3BsdWdpbi54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFiYTg2My4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/Pg0KLTxwbHVnaW4+DQotDQotICAgICA8ZXh0ZW5zaW9uDQotICAgICAgICAgaWQ9ImZlYXR1cmUxIg0KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5mZWF0dXJlVHlwZXMiPg0KLSAgICAgIDxmZWF0dXJlLWZhY3RvcnkNCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuRmVhdHVyZUV4ZWN1dGFibGVGYWN0b3J5Ij4NCi0gICAgICA8L2ZlYXR1cmUtZmFjdG9yeT4NCi0gICA8L2V4dGVuc2lvbj4NCi0gICA8ZXh0ZW5zaW9uDQotICAgICAgICAgaWQ9ImZ0cCINCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuc2l0ZVR5cGVzIj4NCi0gICAgICA8c2l0ZS1mYWN0b3J5DQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5pbXBsZW1lbnRhdGlvbi5TaXRlRlRQRmFjdG9yeSI+DQotICAgICAgPC9zaXRlLWZhY3Rvcnk+DQotICAgPC9leHRlbnNpb24+DQotDQotPC9wbHVnaW4+DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvQWxsVGVzdHMuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL0FsbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0NTExNzcuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvQWxsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5hcGkuQWxsQVBJVGVzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmJyYW5kaW5nLio7Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29uZmlndXJhdGlvbnMuQWxsQ29uZmlndXJhdGlvbnNUZXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS5ib290LkFsbFBsYXRmb3JtQ29uZmlndXJhdGlvblRlc3RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5taXJyb3IuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMubW9kZWwuQWxsTW9kZWxUZXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMubmVzdGVkZmVhdHVyZXMuQWxsTmVzdGVkVGVzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnBhcnNlci5BbGxQYXJzZXJUZXN0czsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5wZXJmbXMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMucmVjb25jaWxpYXRpb24uQWxsUmVjb25jaWxpYXRpb25UZXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMucmVndWxhckluc3RhbGwuQWxsUmVndWxhckluc3RhbGxUZXN0czsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5yZWd1bGFyUmVtb3ZlLkFsbFJlZ3VsYXJSZW1vdmVUZXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuc2l0ZXZhbGlkYXRpb24uQWxsU2l0ZVZhbGlkYXRpb25UZXN0czsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5zdGFuZGFsb25lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnR5cGVzLkFsbFR5cGVzVGVzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnVpdmFsdWVzLkFsbENvcmVVSVRlc3RzOwotCi1wdWJsaWMgY2xhc3MgQWxsVGVzdHMgZXh0ZW5kcyBUZXN0U3VpdGUgewotCXB1YmxpYyBBbGxUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQkJc3VpdGUuc2V0TmFtZSgiQWxsIFVwZGF0ZSBNYW5hZ2VyIFRlc3RzIik7Ci0JCXN1aXRlLmFkZFRlc3QoQWxsTWlycm9yVGVzdHMuc3VpdGUoKSk7CQotCQlzdWl0ZS5hZGRUZXN0KEFsbFNpdGVWYWxpZGF0aW9uVGVzdHMuc3VpdGUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QoQWxsUGxhdGZvcm1Db25maWd1cmF0aW9uVGVzdHMuc3VpdGUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QoQWxsUmVndWxhckluc3RhbGxUZXN0cy5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChBbGxBUElUZXN0cy5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChBbGxQYXJzZXJUZXN0cy5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChBbGxDb3JlVUlUZXN0cy5zdWl0ZSgpKTsKLS8vCQlzdWl0ZS5hZGRUZXN0KEFsbENvbmZpZ3VyYXRpb25zVGVzdHMuc3VpdGUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QoQWxsVHlwZXNUZXN0cy5zdWl0ZSgpKTsKLS8vCQlzdWl0ZS5hZGRUZXN0KEFsbFJlZ3VsYXJSZW1vdmVUZXN0cy5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChBbGxOZXN0ZWRUZXN0cy5zdWl0ZSgpKTsJCi0JCXN1aXRlLmFkZFRlc3QoQWxsUmVjb25jaWxpYXRpb25UZXN0cy5zdWl0ZSgpKTsJCQkJCQotCQlzdWl0ZS5hZGRUZXN0KEFsbE1vZGVsVGVzdHMuc3VpdGUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QoQWxsQnJhbmRpbmdUZXN0cy5zdWl0ZSgpKTsKLQkJLy9zdWl0ZS5hZGRUZXN0KEFsbFN0YW5kYWxvbmVUZXN0cy5zdWl0ZSgpKTsKLQkJLy9zdWl0ZS5hZGRUZXN0KEFsbFBlcmZvcm1hbmNlVGVzdHMuc3VpdGUoKSk7Ci0JCXJldHVybiBzdWl0ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9VcGRhdGVNYW5hZ2VyVGVzdENhc2UuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL1VwZGF0ZU1hbmFnZXJUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTIyY2E0Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL1VwZGF0ZU1hbmFnZXJUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHM7Ci0KLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQbHVnaW5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi5JQ29uZmlndXJlZFNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JUGx1Z2luRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5VcGRhdGVNYW5hZ2VyVXRpbHM7Ci0vKioKLSAqIEFsbCBIZWxwIFN5c3RlbSBUZXN0IGNhc2VzIG11c3Qgc3ViY2xhc3MgdGhpcyBiYXNlIFRlc3RjYXNlLgotICogU2VlIFNhbXBsZVRlc3RDYXNlLmphdmEgZm9yIGEgdGVtcGxhdGUuCi0gKi8KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFVwZGF0ZU1hbmFnZXJUZXN0Q2FzZSBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXByb3RlY3RlZCBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgYnVuZGxlOwotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGRhdGFQYXRoOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBVUkwgU09VUkNFX0ZJTEVfU0lURTsKLQlwcm90ZWN0ZWQgc3RhdGljIFVSTCBTT1VSQ0VfRklMRV9TSVRFX0lOU1RBTExFRDsKLQlwcm90ZWN0ZWQgc3RhdGljIFVSTCBTT1VSQ0VfSFRUUF9TSVRFOwotCXByb3RlY3RlZCBzdGF0aWMgVVJMIFRBUkdFVF9GSUxFX1NJVEU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFUQV9QQVRIID0gImRhdGEvIjsKLQotCS8qKgotCSAqIERlZmF1bHQgQ29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgVXBkYXRlTWFuYWdlclRlc3RDYXNlKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCQl0cnkgewotCQkJaW5pdCgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbChlLnRvU3RyaW5nKCkpOwotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBpbml0KCkgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7Ci0KLQkJSVBsdWdpbkRlc2NyaXB0b3IgZGF0YURlc2MgPSBQbGF0Zm9ybS5nZXRQbHVnaW5SZWdpc3RyeSgpLmdldFBsdWdpbkRlc2NyaXB0b3IoIm9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlIik7Ci0JCVVSTCByZXNvbHZlZFVSTCA9IFBsYXRmb3JtLmFzTG9jYWxVUkwoUGxhdGZvcm0ucmVzb2x2ZShkYXRhRGVzYy5nZXRJbnN0YWxsVVJMKCkpKTsKLQkJVVJMIGRhdGFVUkwgPSBuZXcgVVJMKHJlc29sdmVkVVJMLCBEQVRBX1BBVEgpOwotCQlkYXRhUGF0aCA9IGRhdGFVUkwuZ2V0RmlsZSgpOwotCQlTdHJpbmcgaG9tZVBhdGggPSAoU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmlvLnRtcGRpciIpKS5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgJy8nKTsKLQotCQlpZiAoYnVuZGxlID09IG51bGwpIHsKLQkJCUNsYXNzTG9hZGVyIGwgPSBuZXcgVVJMQ2xhc3NMb2FkZXIobmV3IFVSTFtdIHsgZGF0YVVSTCB9LCBudWxsKTsKLQkJCWJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgicmVzb3VyY2VzIiwgTG9jYWxlLmdldERlZmF1bHQoKSwgbCk7Ci0JCX0KLQotCQl0cnkgewotCQkJU09VUkNFX0ZJTEVfU0lURSA9IG5ldyBGaWxlKGRhdGFQYXRoKS50b1VSTCgpOwotCQkJU09VUkNFX0ZJTEVfU0lURV9JTlNUQUxMRUQgPSBuZXcgRmlsZShkYXRhUGF0aCArICJ0ZXN0QVBJLyIpLnRvVVJMKCk7Ci0JCQlTT1VSQ0VfSFRUUF9TSVRFID0gbmV3IFVSTCgiaHR0cCIsIGdldEh0dHBIb3N0KCksIGdldEh0dHBQb3J0KCksIGJ1bmRsZS5nZXRTdHJpbmcoIkhUVFBfUEFUSF8xIikpOwotCQkJVEFSR0VUX0ZJTEVfU0lURSA9IG5ldyBVUkwoImZpbGUiLCBudWxsLCBob21lUGF0aCArICIvdGFyZ2V0LyIpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbChlLnRvU3RyaW5nKCkpOwotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCi0JCS8vY2xlYW51cCB0YXJnZXQgCi0JCUZpbGUgdGFyZ2V0ID0gbmV3IEZpbGUoaG9tZVBhdGggKyAiL3RhcmdldC8iKTsKLQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKHRhcmdldCk7Ci0JCS8vIGNsZWFudXAgaW5mbyBhYm91dCBqdXN0IGluc3RhbGxlZCBwbHVnaW5zCi0JCUluc3RhbGxSZWdpc3RyeS5jbGVhbnVwKCk7Ci0JCQotCQkvLyBzZXR1cCBjYWNoZSBzaXRlIHRvIGZhbHNlLiAKLQkJLy8gTm90ZTogdGhlIHN0YW5kYWxvbmUgdGVzdHMgd2lsbCBzZXQgaXQgYmFjayB0byB0cnVlCi0JCUludGVybmFsU2l0ZU1hbmFnZXIuZ2xvYmFsVXNlQ2FjaGUgPSBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBTaW1wbGUgaW1wbGVtZW50YXRpb24gb2Ygc2V0VXAuIFN1YmNsYXNzZXMgYXJlIHByZXZlbnRlZCAKLQkgKiBmcm9tIG92ZXJyaWRpbmcgdGhpcyBtZXRob2QgdG8gbWFpbnRhaW4gbG9nZ2luZyBjb25zaXN0ZW5jeS4KLQkgKiB1bVNldFVwKCkgc2hvdWxkIGJlIG92ZXJyaWRlbiBpbnN0ZWFkLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0gIiArIHRoaXMuZ2V0TmFtZSgpKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKHRoaXMuZ2V0TmFtZSgpICsgIjogc2V0VXAuLi4iKTsKLQkJdW1TZXRVcCgpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdXAgdGhlIGZpeHR1cmUsIGZvciBleGFtcGxlLCBvcGVuIGEgbmV0d29yayBjb25uZWN0aW9uLgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBiZWZvcmUgYSB0ZXN0IGlzIGV4ZWN1dGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVtU2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gZG8gbm90aGluZy4KLQl9Ci0KLQkvKioKLQkgKiBTaW1wbGUgaW1wbGVtZW50YXRpb24gb2YgdGVhckRvd24uICBTdWJjbGFzc2VzIGFyZSBwcmV2ZW50ZWQgCi0JICogZnJvbSBvdmVycmlkaW5nIHRoaXMgbWV0aG9kIHRvIG1haW50YWluIGxvZ2dpbmcgY29uc2lzdGVuY3kuCi0JICogdW1UZWFyRG93bigpIHNob3VsZCBiZSBvdmVycmlkZW4gaW5zdGVhZC4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlTeXN0ZW0ub3V0LnByaW50bG4odGhpcy5nZXROYW1lKCkgKyAiOiB0ZWFyRG93bi4uLlxuIik7Ci0JCXVtVGVhckRvd24oKTsKLQl9Ci0KLQkvKioKLQkgKiBUZWFycyBkb3duIHRoZSBmaXh0dXJlLCBmb3IgZXhhbXBsZSwgY2xvc2UgYSBuZXR3b3JrIGNvbm5lY3Rpb24uCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGFmdGVyIGEgdGVzdCBpcyBleGVjdXRlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1bVRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIGRvIG5vdGhpbmcuCi0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZ2V0SHR0cEhvc3QoKSB7Ci0JCXJldHVybiBVcGRhdGVUZXN0c1BsdWdpbi5nZXRXZWJBcHBTZXJ2ZXJIb3N0KCk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBpbnQgZ2V0SHR0cFBvcnQoKSB7Ci0JCXJldHVybiBVcGRhdGVUZXN0c1BsdWdpbi5nZXRXZWJBcHBTZXJ2ZXJQb3J0KCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlKElGZWF0dXJlIGZlYXR1cmUsIElDb25maWd1cmVkU2l0ZSBjb25maWdTaXRlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlTaXRlIHNpdGUgPSBjb25maWdTaXRlLmdldFNpdGUoKTsKLQkJcmVtb3ZlKGZlYXR1cmUsIHNpdGUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZShJRmVhdHVyZSBmZWF0dXJlLCBJU2l0ZSBzaXRlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZShmZWF0dXJlKTsKLQkJLy8gcmVtb3ZlIHRoZSBwbHVnaW5zIGFuZCBmZWF0dXJlcyBkaXIKLQkJU3RyaW5nIHNpdGVQYXRoID0gc2l0ZS5nZXRVUkwoKS5nZXRGaWxlKCk7Ci0JCUZpbGUgZmlsZSA9IG51bGw7Ci0KLQkJU3RyaW5nIGZlYXR1cmVOYW1lID0gZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0SWRlbnRpZmllcigpLnRvU3RyaW5nKCkgKyAiXyIgKyBmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRWZXJzaW9uKCkudG9TdHJpbmcoKTsKLQkJZmlsZSA9IG5ldyBGaWxlKHNpdGVQYXRoLCAiZmVhdHVyZXMiICsgRmlsZS5zZXBhcmF0b3IgKyBmZWF0dXJlTmFtZSk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlJlbW92aW5nIDoiICsgZmlsZSk7Ci0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShmaWxlKTsKLQotCQlJUGx1Z2luRW50cnlbXSBlbnRyaWVzID0gZmVhdHVyZS5nZXRQbHVnaW5FbnRyaWVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIG5hbWUgPSBlbnRyaWVzW2ldLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSArICJfIiArIGVudHJpZXNbaV0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldFZlcnNpb24oKS50b1N0cmluZygpICsgRmlsZS5zZXBhcmF0b3I7Ci0JCQlmaWxlID0gbmV3IEZpbGUoc2l0ZVBhdGgsICJwbHVnaW5zIiArIEZpbGUuc2VwYXJhdG9yICsgbmFtZSk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipSZW1vdmluZyA6IiArIGZpbGUpOwotCQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGZpbGUpOwotCQkJSW5zdGFsbFJlZ2lzdHJ5LnVucmVnaXN0ZXJQbHVnaW4oZW50cmllc1tpXSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9VcGRhdGVUZXN0c1BsdWdpbi5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvVXBkYXRlVGVzdHNQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzczMmUzOS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9VcGRhdGVUZXN0c1BsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5oZWxwLmludGVybmFsLmFwcHNlcnZlci5XZWJhcHBNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLlVwZGF0ZUNvcmU7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLio7Ci0KLS8qKgotICogbWFuYWdlcyB0aGUgc3RhcnR1byBhbmQgc2h1dG93biBvZiB0aGUgCi0gKiB3ZWIgc2VydmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBVcGRhdGVUZXN0c1BsdWdpbiBleHRlbmRzIFBsdWdpbiB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgYXBwU2VydmVySG9zdCA9IG51bGw7Ci0JcHJpdmF0ZSBzdGF0aWMgaW50IGFwcFNlcnZlclBvcnQgPSAwOwotCXByaXZhdGUgc3RhdGljIFVwZGF0ZVRlc3RzUGx1Z2luIHBsdWdpbjsKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGluaXRpYWxpemVkPWZhbHNlOwotCi0JcHVibGljIHN0YXRpYyBVcGRhdGVUZXN0c1BsdWdpbiBnZXRQbHVnaW4oKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUFjdGl2YXRvciNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUFjdGl2YXRvciNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJV2ViYXBwTWFuYWdlci5zdG9wKCJvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS51cGRhdGV0ZXN0cyIpOwotCQlwbHVnaW4gPSBudWxsOwotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGhvc3QgaWRlbnRpZmllciBmb3IgdGhlIHdlYiBhcHAgc2VydmVyCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0V2ViQXBwU2VydmVySG9zdCgpIHsKLQkJaWYgKCFpbml0aWFsaXplZCkgaW5pdGlhbGl6ZSgpOwotCQlyZXR1cm4gYXBwU2VydmVySG9zdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwb3J0IGlkZW50aWZpZXIgZm9yIHRoZSB3ZWIgYXBwIHNlcnZlcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGdldFdlYkFwcFNlcnZlclBvcnQoKSB7Ci0JCWlmICghaW5pdGlhbGl6ZWQpIGluaXRpYWxpemUoKTsJCQotCQlyZXR1cm4gYXBwU2VydmVyUG9ydDsKLQl9Ci0JLyoqCi0JICogTWV0aG9kIGluaXRpYWxpemUuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBpbml0aWFsaXplKCkgewotCQlTdHJpbmcgdGV4dCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlXZWJhcHBNYW5hZ2VyLnN0YXJ0KCJvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS51cGRhdGV0ZXN0cyIsICJvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZSIsIG5ldyBQYXRoKCJ3ZWJzZXJ2ZXIiKSk7Ci0JCQlhcHBTZXJ2ZXJIb3N0ID0gV2ViYXBwTWFuYWdlci5nZXRIb3N0KCk7Ci0JCQlhcHBTZXJ2ZXJQb3J0ID0gV2ViYXBwTWFuYWdlci5nZXRQb3J0KCk7Ci0KLQkJCXRleHQgPSAiVGhlIHdlYlNlcnZlciBkaWQgc3RhcnQgaXA6IiArIGFwcFNlcnZlckhvc3QgKyAiOiIgKyBhcHBTZXJ2ZXJQb3J0OwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXRleHQgPSAiVGhlIHdlYlNlcnZlciBkaWRuJ3Qgc3RhcnQgIjsKLQkJCUlTdGF0dXMgc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCAib3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUiLCBJU3RhdHVzLk9LLCAiV2ViU2VydmVyIG5vdCBzdGFydGVkLiBVcGRhdGUgVGVzdHMgcmVzdWx0cyBhcmUgaW52YWxpZCIsIG51bGwpOwotCQkJVXBkYXRlQ29yZS53YXJuKCIiLG5ldyBDb3JlRXhjZXB0aW9uKHN0YXR1cykpOwotCQl9ZmluYWxseSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4odGV4dCk7Ci0JCQlpbml0aWFsaXplZCA9IHRydWU7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2FwaS9BbGxBUElUZXN0cy5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvYXBpL0FsbEFQSVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmNjQ2NDQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvYXBpL0FsbEFQSVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmFwaTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLlVwZGF0ZU1hbmFnZXJUZXN0Q2FzZTsKLQotLyoqCi0gKiBNYW5hZ2VzIHRoZSBBUEkgdGVzdHMKLSAqLwotcHVibGljIGNsYXNzIEFsbEFQSVRlc3RzIGV4dGVuZHMgVXBkYXRlTWFuYWdlclRlc3RDYXNlIHsKLQkvKioKLQkgKiBDb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBBbGxBUElUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JLyoqCi0JICogTGlzdCBvZiBBUEkgdGVzdHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCQlzdWl0ZS5zZXROYW1lKCJBUEkgVGVzdHMiKTsKLQotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoVGVzdFNpdGVBUEkuY2xhc3MpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFRlc3RMb2NhbFNpdGVBUEkuY2xhc3MpKTsJCQotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoVGVzdFVwZGF0ZU1hbmFnZXJVdGlsc0FQSS5jbGFzcykpOwkJCi0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShUZXN0RGVmYXVsdEV4ZWN1dGFibGVGZWF0dXJlQVBJLmNsYXNzKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShUZXN0RGVmYXVsdFBhY2thZ2VGZWF0dXJlQVBJLmNsYXNzKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShUZXN0UGx1Z2luQ29udGFpbmVyQVBJLmNsYXNzKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShUZXN0U2l0ZU1hbmFnZXJBUEkuY2xhc3MpKTsJCQotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoVGVzdE5lc3RlZEZlYXR1cmVBUEkuY2xhc3MpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFRlc3RGZWF0dXJlQ29udGVudFByb3ZpZGVyX0ZpbGVGaWx0ZXJBUEkuY2xhc3MpKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2FwaS9EZWZhdWx0RmVhdHVyZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvYXBpL0RlZmF1bHRGZWF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4MGNjZTUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvYXBpL0RlZmF1bHRGZWF0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuYXBpOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLkZlYXR1cmVFeGVjdXRhYmxlQ29udGVudFByb3ZpZGVyOwotLyoqCi0gKiBBYnN0cmFjdCBDbGFzcyB0aGF0IGltcGxlbWVudHMgbW9zdCBvZiB0aGUgYmVoYXZpb3Igb2YgYSBmZWF0dXJlCi0gKiBBIGZlYXR1cmUgQUxXQVlTIGJlbG9uZ3MgdG8gYW4gSVNpdGUKLSAqLwotcHVibGljIGNsYXNzIERlZmF1bHRGZWF0dXJlIGV4dGVuZHMgRmVhdHVyZSB7Ci0KLQotCS8qKgotCSAqIENvcHkgY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgRGVmYXVsdEZlYXR1cmUoSUZlYXR1cmUgc291cmNlRmVhdHVyZSwgSVNpdGUgdGFyZ2V0U2l0ZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0aGlzKHRhcmdldFNpdGUpOwotCQl0aGlzLnNldEZlYXR1cmVDb250ZW50UHJvdmlkZXIoc291cmNlRmVhdHVyZS5nZXRGZWF0dXJlQ29udGVudFByb3ZpZGVyKCkpOwotCQl0aGlzLnNldElkZW50aWZpZXIoc291cmNlRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkpOwotCQl0aGlzLnNldExhYmVsKHNvdXJjZUZlYXR1cmUuZ2V0TGFiZWwoKSk7Ci0JCXRoaXMuc2V0VXBkYXRlU2l0ZUVudHJ5KHNvdXJjZUZlYXR1cmUuZ2V0VXBkYXRlU2l0ZUVudHJ5KCkpOwotCQl0aGlzLnNldERpc2NvdmVyeVNpdGVFbnRyaWVzKHNvdXJjZUZlYXR1cmUuZ2V0RGlzY292ZXJ5U2l0ZUVudHJpZXMoKSk7Ci0JCXRoaXMuc2V0UHJvdmlkZXIoc291cmNlRmVhdHVyZS5nZXRQcm92aWRlcigpKTsKLQkJdGhpcy5zZXREZXNjcmlwdGlvbihzb3VyY2VGZWF0dXJlLmdldERlc2NyaXB0aW9uKCkpOwotCQl0aGlzLnNldENvcHlyaWdodChzb3VyY2VGZWF0dXJlLmdldENvcHlyaWdodCgpKTsKLQkJdGhpcy5zZXRMaWNlbnNlKHNvdXJjZUZlYXR1cmUuZ2V0TGljZW5zZSgpKTsKLQkJdGhpcy5zZXRQbHVnaW5FbnRyaWVzKHNvdXJjZUZlYXR1cmUuZ2V0UGx1Z2luRW50cmllcygpKTsKLQkJdGhpcy5zZXRJbWFnZShzb3VyY2VGZWF0dXJlLmdldEltYWdlKCkpOwotCX0KLQkKLQkvKioKLQkgKiBDb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBEZWZhdWx0RmVhdHVyZShJU2l0ZSB0YXJnZXRTaXRlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuc2V0U2l0ZSh0YXJnZXRTaXRlKTsJCQotCX0JCi0JCi0JCi0JLyoqCi0JICogU2V0cyB0aGUgaWRlbnRpZmllcgotCSAqIEBwYXJhbSBpZGVudGlmaWVyIFRoZSBpZGVudGlmaWVyIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkZW50aWZpZXIoVmVyc2lvbmVkSWRlbnRpZmllciBpZGVudGlmaWVyKSB7Ci0JCXNldEZlYXR1cmVJZGVudGlmaWVyKGlkZW50aWZpZXIuZ2V0SWRlbnRpZmllcigpKTsKLQkJc2V0RmVhdHVyZVZlcnNpb24oaWRlbnRpZmllci5nZXRWZXJzaW9uKCkudG9TdHJpbmcoKSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZGlzY292ZXJ5U2l0ZUVudHJpZXMKLQkgKiBAcGFyYW0gZGlzY292ZXJ5SW5mb3MgVGhlIGRpc2NvdmVyeUluZm9zIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERpc2NvdmVyeVNpdGVFbnRyaWVzKElVUkxFbnRyeVtdIGRpc2NvdmVyeUluZm9zKSB7Ci0JCXNldERpc2NvdmVyeVNpdGVFbnRyeU1vZGVscygoVVJMRW50cnlNb2RlbFtdKSBkaXNjb3ZlcnlJbmZvcyk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdXBkYXRlU2l0ZUVudHJ5Ci0JICogQHBhcmFtIHVwZGF0ZUluZm8gVGhlIHVwZGF0ZUluZm8gdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0VXBkYXRlU2l0ZUVudHJ5KElVUkxFbnRyeSB1cGRhdGVJbmZvKSB7Ci0JCXNldFVwZGF0ZVNpdGVFbnRyeU1vZGVsKChVUkxFbnRyeU1vZGVsKSB1cGRhdGVJbmZvKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgZGlzY292ZXJ5SW5mbwotCSAqIEBwYXJhbSBkaXNjb3ZlcnlJbmZvIFRoZSBkaXNjb3ZlcnlJbmZvIHRvIGFkZAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZERpc2NvdmVyeVNpdGVFbnRyeShJVVJMRW50cnkgZGlzY292ZXJ5SW5mbykgewotCQlhZGREaXNjb3ZlcnlTaXRlRW50cnlNb2RlbCgoVVJMRW50cnlNb2RlbCkgZGlzY292ZXJ5SW5mbyk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZGVzY3JpcHRpb24KLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24gVGhlIGRlc2NyaXB0aW9uIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKElVUkxFbnRyeSBkZXNjcmlwdGlvbikgewotCQlzZXREZXNjcmlwdGlvbk1vZGVsKChVUkxFbnRyeU1vZGVsKSBkZXNjcmlwdGlvbik7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgY29weXJpZ2h0Ci0JICogQHBhcmFtIGNvcHlyaWdodCBUaGUgY29weXJpZ2h0IHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvcHlyaWdodChJVVJMRW50cnkgY29weXJpZ2h0KSB7Ci0JCXNldENvcHlyaWdodE1vZGVsKChVUkxFbnRyeU1vZGVsKSBjb3B5cmlnaHQpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGxpY2Vuc2UKLQkgKiBAcGFyYW0gbGljZW5zZSBUaGUgbGljZW5zZSB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMaWNlbnNlKElVUkxFbnRyeSBsaWNlbnNlKSB7Ci0JCXNldExpY2Vuc2VNb2RlbCgoVVJMRW50cnlNb2RlbCkgbGljZW5zZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgaW1hZ2UKLQkgKiBAcGFyYW0gaW1hZ2UgVGhlIGltYWdlIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEltYWdlKFVSTCBpbWFnZSkgewotCQlpZiAoaW1hZ2U9PW51bGwpIHJldHVybjsKLQkJc2V0SW1hZ2VVUkxTdHJpbmcoaW1hZ2UudG9FeHRlcm5hbEZvcm0oKSk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhbiBpbXBvcnQKLQkgKiBAcGFyYW0gYW5JbXBvcnQgVGhlIGltcG9ydCB0byBhZGQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRJbXBvcnQoSUltcG9ydCBhbkltcG9ydCkgewotCQlpZiAoYW5JbXBvcnQgIT0gbnVsbCkgewotCQkJYWRkSW1wb3J0TW9kZWwoKEltcG9ydE1vZGVsKSBhbkltcG9ydCk7Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIFNldHMgdGhlIHBsdWdpbkVudHJpZXMKLQkgKiBAcGFyYW0gcGx1Z2luRW50cmllcyBUaGUgcGx1Z2luRW50cmllcyB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQbHVnaW5FbnRyaWVzKElQbHVnaW5FbnRyeVtdIHBsdWdpbkVudHJpZXMpIHsKLQkJaWYgKHBsdWdpbkVudHJpZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwbHVnaW5FbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJYWRkUGx1Z2luRW50cnkocGx1Z2luRW50cmllc1tpXSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIHNldHMgdGVoIFVSTCBpc2Ygbm90IGFscmVhZHkgcHJlc2VudAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVSTChVUkwgdXJsKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbnsKLQkJLy9pZiAoZ2V0RmVhdHVyZUNvbnRlbnRQcm92aWRlcigpPT1udWxsKXsKLQkJCUZlYXR1cmVDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyID0gbmV3IEZlYXR1cmVFeGVjdXRhYmxlQ29udGVudFByb3ZpZGVyKHVybCk7Ci0JCQl0aGlzLnNldEZlYXR1cmVDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsKLQkJCWNvbnRlbnRQcm92aWRlci5zZXRGZWF0dXJlKHRoaXMpOwotCQkvL30KLQl9Ci0JCi0JCi0JLyoKLQkgKiBAc2VlIElQbHVnaW5Db250YWluZXIjYWRkUGx1Z2luRW50cnkoSVBsdWdpbkVudHJ5KQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFBsdWdpbkVudHJ5KElQbHVnaW5FbnRyeSBwbHVnaW5FbnRyeSkgewotCQlpZiAocGx1Z2luRW50cnkgIT0gbnVsbCkgewotCQkJYWRkUGx1Z2luRW50cnlNb2RlbCgoUGx1Z2luRW50cnlNb2RlbCkgcGx1Z2luRW50cnkpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElGZWF0dXJlI2FkZE5vblBsdWdpbkVudHJ5KElOb25QbHVnaW5FbnRyeSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGROb25QbHVnaW5FbnRyeShJTm9uUGx1Z2luRW50cnkgZGF0YUVudHJ5KSB7Ci0JCWlmIChkYXRhRW50cnkgIT0gbnVsbCkgewotCQkJYWRkTm9uUGx1Z2luRW50cnlNb2RlbCgoTm9uUGx1Z2luRW50cnlNb2RlbCkgZGF0YUVudHJ5KTsKLQkJfQotCX0JCi0KLQl9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvYXBpL015VVJMRW50cnkuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2FwaS9NeVVSTEVudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlYTVmNjguLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvYXBpL015VVJMRW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuYXBpOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5VUkxFbnRyeTsKLQotLyoqCi0gKiBXcmFwcGVyIGFyb3VuZCBVUkxFbnRyeQotICovCi1wdWJsaWMgY2xhc3MgTXlVUkxFbnRyeSBleHRlbmRzIFVSTEVudHJ5IHsKLQkKLQlwdWJsaWMgTXlVUkxFbnRyeShTdHJpbmcgYW5ub3RhdGlvbiwgVVJMIHVybCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7Ci0JCXN1cGVyKCk7Ci0JCXNldEFubm90YXRpb24oYW5ub3RhdGlvbik7Ci0JCWlmICh1cmwhPW51bGwpIHsKLQkJCXNldFVSTFN0cmluZyh1cmwudG9FeHRlcm5hbEZvcm0oKSk7Ci0JCQlyZXNvbHZlKG51bGwsbnVsbCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2FwaS9UZXN0RGVmYXVsdEV4ZWN1dGFibGVGZWF0dXJlQVBJLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9hcGkvVGVzdERlZmF1bHRFeGVjdXRhYmxlRmVhdHVyZUFQSS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzZmZDdhLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2FwaS9UZXN0RGVmYXVsdEV4ZWN1dGFibGVGZWF0dXJlQVBJLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5hcGk7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuVXBkYXRlTWFuYWdlclV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5VcGRhdGVNYW5hZ2VyVGVzdENhc2U7Ci0KLQotCi1wdWJsaWMgY2xhc3MgVGVzdERlZmF1bHRFeGVjdXRhYmxlRmVhdHVyZUFQSSBleHRlbmRzIFVwZGF0ZU1hbmFnZXJUZXN0Q2FzZSB7Ci0JCi0JcHJpdmF0ZSBEZWZhdWx0RmVhdHVyZSByZW1vdGVGZWF0dXJlPW51bGw7Ci0JCi0JLyoqCi0JICogVGVzdCB0aGUgdGVzdEZlYXR1cmVzKCkKLQkgKi8KLQlwdWJsaWMgVGVzdERlZmF1bHRFeGVjdXRhYmxlRmVhdHVyZUFQSShTdHJpbmcgYXJnMCkgewotCQlzdXBlcihhcmcwKTsKLQl9Ci0JCi0JLyoqCi0JICogdGhlIGZlYXR1cmUgdG8gdGVzdAotCSAqLwotCXByaXZhdGUgRGVmYXVsdEZlYXR1cmUgZ2V0RmVhdHVyZSgpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlpZiAocmVtb3RlRmVhdHVyZSA9PSBudWxsKXsKLQotCQlJU2l0ZSBzaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShTT1VSQ0VfRklMRV9TSVRFLCBudWxsKTsKLQkJVVJMIHVybCA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkwoc2l0ZS5nZXRVUkwoKSwidGVzdEFQSS8iK1NpdGUuREVGQVVMVF9JTlNUQUxMRURfRkVBVFVSRV9QQVRIKyJmZWF0dXJlMy8iLG51bGwpOwotCQlTaXRlRmVhdHVyZVJlZmVyZW5jZSByZWYgPSBuZXcgU2l0ZUZlYXR1cmVSZWZlcmVuY2UoKTsKLQkJcmVmLnNldFNpdGUoc2l0ZSk7Ci0JCXJlZi5zZXRVUkwodXJsKTsKLQkJSUZlYXR1cmUgZmVhdHVyZSA9IHJlZi5nZXRGZWF0dXJlKG51bGwpOwotCQlyZW1vdGVGZWF0dXJlID0gbmV3IERlZmF1bHRGZWF0dXJlKGZlYXR1cmUsc2l0ZSk7Ci0KLQkJfQotCQlyZXR1cm4gcmVtb3RlRmVhdHVyZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SWRlbnRpZmllcigpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBNYWxmb3JtZWRVUkxFeGNlcHRpb24gewotCQlTdHJpbmcgaWQxID0gInhtbHMvYXBpdGVzdHMvb3JnLmVjbGlwc2UudGVzdC5mZWF0dXJlXzEuMC4wLyI7Ci0JCVN0cmluZyBpZDIgPSAieG1scy9hcGl0ZXN0cy9vcmcuZWNsaXBzZV90ZXN0X2ZlYXR1cmUiOwotCQlWZXJzaW9uZWRJZGVudGlmaWVyIGlkZW50MSA9IG5ldyBWZXJzaW9uZWRJZGVudGlmaWVyKCJvcmcudGVzdDEuaWRlbnQxIiwiMS4wLjAiKTsKLQkJVmVyc2lvbmVkSWRlbnRpZmllciBpZGVudDIgPSBuZXcgVmVyc2lvbmVkSWRlbnRpZmllcigib3JnLnRlc3QxLmlkZW50MiIsIjEuMC4wIik7CQkKLQkJCi0KLQkJCUlTaXRlIHNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKFNPVVJDRV9GSUxFX1NJVEUsbnVsbCk7Ci0JCQkKLQkJCVVSTCB1cmwxID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTChzaXRlLmdldFVSTCgpLGlkMSxudWxsKTsJCQkKLQkJCXJlbW90ZUZlYXR1cmUgPSBuZXcgRGVmYXVsdEZlYXR1cmUoc2l0ZSk7Ci0JCQlyZW1vdGVGZWF0dXJlLnNldFVSTCh1cmwxKTsKLQkJCXJlbW90ZUZlYXR1cmUuc2V0SWRlbnRpZmllcihpZGVudDEpOwotCQkJYXNzZXJ0RXF1YWxzKGlkZW50MS50b1N0cmluZygpLHJlbW90ZUZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkpOwotCSAJCi0JCQkgVVJMIHVybDIgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0VVJMKHNpdGUuZ2V0VVJMKCksaWQyLG51bGwpOwkJCi0JCQlyZW1vdGVGZWF0dXJlID0gbmV3IERlZmF1bHRGZWF0dXJlKHNpdGUpOwotCQkJcmVtb3RlRmVhdHVyZS5zZXRVUkwodXJsMik7Ci0JCQlyZW1vdGVGZWF0dXJlLnNldElkZW50aWZpZXIoaWRlbnQyKTsKLQkJCWFzc2VydEVxdWFscyhpZGVudDIudG9TdHJpbmcoKSxyZW1vdGVGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpKTsKLQkJCi0KLQl9Ci0KLQotCi0JcHVibGljIHZvaWQgdGVzdFNpdGUoKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uewotCQlTdHJpbmcgaWRlbnQxID0gU2l0ZS5ERUZBVUxUX0lOU1RBTExFRF9GRUFUVVJFX1BBVEgrImZlYXR1cmUzLyI7CQkKLQotCQkJSVNpdGUgc2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUoU09VUkNFX0ZJTEVfU0lURSxudWxsKTsKLQkJCQotCQkJVVJMIGlkID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTChzaXRlLmdldFVSTCgpLGlkZW50MSxudWxsKTsJCQkKLQkJCXJlbW90ZUZlYXR1cmUgPSBuZXcgRGVmYXVsdEZlYXR1cmUoc2l0ZSk7Ci0JCQlyZW1vdGVGZWF0dXJlLnNldFVSTChpZCk7Ci0JCQlhc3NlcnRFcXVhbHMoc2l0ZSxyZW1vdGVGZWF0dXJlLmdldFNpdGUoKSk7Ci0KLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHRlc3RMYWJlbCgpIHRocm93cyBDb3JlRXhjZXB0aW9uLE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBsYWJlbCA9ICJkdW1teSBsYWJlbCI7Ci0JCUZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmUoKTsKLQkJZmVhdHVyZS5zZXRMYWJlbChsYWJlbCk7Ci0JCWFzc2VydEVxdWFscyhsYWJlbCxmZWF0dXJlLmdldExhYmVsKCkpOwotCX0KLQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVVSTCgpIHRocm93cyBDb3JlRXhjZXB0aW9uLE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7Ci0JCVVSTCB1cmwgPSBudWxsOwotCQlTdHJpbmcgbGFiZWwgPSAiT1RJIFNpdGUiOwotCQl0cnkgewotCQkJdXJsID0gbmV3IFVSTCgiaHR0cDovL3d3dy5vdGkuY29tLyIpOwotCQkJCi0JCX0gY2F0Y2ggKGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKXt9IC8vIGltcG9zc2libGUgZWggIQotCQlEZWZhdWx0RmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZSgpOwotCQlmZWF0dXJlLnNldFVwZGF0ZVNpdGVFbnRyeShuZXcgTXlVUkxFbnRyeShsYWJlbCwgdXJsKSk7Ci0JCWFzc2VydEVxdWFscyh1cmwsZmVhdHVyZS5nZXRVcGRhdGVTaXRlRW50cnkoKS5nZXRVUkwoKSk7Ci0JCWFzc2VydEVxdWFscyhsYWJlbCxmZWF0dXJlLmdldFVwZGF0ZVNpdGVFbnRyeSgpLmdldEFubm90YXRpb24oKSk7Ci0KLQl9IAotCi0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGlzY292ZXJ5VVJMcygpIHRocm93cyBDb3JlRXhjZXB0aW9uLE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7Ci0JCUlVUkxFbnRyeVtdIHVybEluZm8gPSBuZXcgTXlVUkxFbnRyeVsyXTsKLQkJVVJMW10gdXJsID0gbmV3IFVSTFsyXTsKLQkJU3RyaW5nW10gbGFiZWwgPSBuZXcgU3RyaW5nWzJdOwotCQl0cnkgewotCQkJdXJsWzBdID0gbmV3IFVSTCgiaHR0cDovL3d3dy5vdGkuY29tLyIpOwotCQkJdXJsWzFdID0gbmV3IFVSTCgiaHR0cDovL2VjbGlwc2Uub3JnLyIpOwotCQkJbGFiZWxbMF0gPSAiT1RJIFNpdGUiOwotCQkJbGFiZWxbMV0gPSAiRWNsaXBzZSBTaXRlIjsKLQkJfSBjYXRjaCAoamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpe30gLy8gaW1wb3NzaWJsZSBlaCAhCi0JCURlZmF1bHRGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlKCk7Ci0JCWZvciAoaW50IGk9MDtpPDI7aSsrKXsKLQkJCQl1cmxJbmZvW2ldID0gbmV3IE15VVJMRW50cnkobGFiZWxbaV0sdXJsW2ldKTsKLQkJfQotCQlmZWF0dXJlLnNldERpc2NvdmVyeVNpdGVFbnRyaWVzKHVybEluZm8pOwotCQlmb3IgKGludCBpPTA7IGk8ZmVhdHVyZS5nZXREaXNjb3ZlcnlTaXRlRW50cmllcygpLmxlbmd0aDtpKyspewotCQkJYXNzZXJ0RXF1YWxzKHVybEluZm9baV0sZmVhdHVyZS5nZXREaXNjb3ZlcnlTaXRlRW50cmllcygpW2ldKTsKLQkJfQotCi0JfQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJvdmlkZXIoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbixNYWxmb3JtZWRVUkxFeGNlcHRpb24gewotCQlTdHJpbmcgcHJvdmlkZXIgPSAibm90IHNvIGR1bW15IHByb3ZpZGVyIjsKLQkJSUZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmUoKTsKLQkJKChGZWF0dXJlKWZlYXR1cmUpLnNldFByb3ZpZGVyKHByb3ZpZGVyKTsKLQkJYXNzZXJ0RXF1YWxzKHByb3ZpZGVyLGZlYXR1cmUuZ2V0UHJvdmlkZXIoKSk7Ci0JfQotCi0KLQotCXB1YmxpYyB2b2lkIHRlc3REZXNjcmlwdGlvbigpIHRocm93cyBDb3JlRXhjZXB0aW9uLE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBkZXNjID0gInByZXR0eSBsb25nIGRlc2NyaXB0aW9uIGFzIGEgc3RyaW5nIHdpdGggXHJcbiBhbmQgXHQgYW5kIFxuIjsKLQkJSVVSTEVudHJ5IGluZm8gPSBuZXcgTXlVUkxFbnRyeShkZXNjLG51bGwpOwotCQlEZWZhdWx0RmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZSgpOwotCQlmZWF0dXJlLnNldERlc2NyaXB0aW9uKGluZm8pOwotCQlhc3NlcnRFcXVhbHMoZGVzYyxmZWF0dXJlLmdldERlc2NyaXB0aW9uKCkuZ2V0QW5ub3RhdGlvbigpKTsKLQl9Ci0JCi0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVzY3JpcHRpb24xKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7Ci0JCVVSTCB1cmwgPSBudWxsOwotCQl0cnkgewotCQkJdXJsID0gbmV3IFVSTCgiaHR0cDovL3d3dy5vdGkuY29tIik7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKXsvKnByZXR0eSBpbXBvc3NpYmxlKi99Ci0JCUlVUkxFbnRyeSBpbmZvID0gbmV3IE15VVJMRW50cnkobnVsbCx1cmwpOwotCQlEZWZhdWx0RmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZSgpOwotCQlmZWF0dXJlLnNldERlc2NyaXB0aW9uKGluZm8pOwotCQlhc3NlcnRFcXVhbHModXJsLGZlYXR1cmUuZ2V0RGVzY3JpcHRpb24oKS5nZXRVUkwoKSk7Ci0JfQkKLQkKLQotCXB1YmxpYyB2b2lkIHRlc3REZXNjcmlwdGlvbjIoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKLQkJCi0gCSBVUkwgdXJsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXVybCA9IG5ldyBVUkwoImh0dHA6Ly93d3cub3RpLmNvbSIpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSl7LypwcmV0dHkgaW1wb3NzaWJsZSovfQotCQlTdHJpbmcgZGVzYyA9ICJwcmV0dHkgbG9uZyBkZXNjcmlwdGlvbiBhcyBhIHN0cmluZyB3aXRoIFxyXG4gYW5kIFx0IGFuZCBcbiI7Ci0JCUlVUkxFbnRyeSBpbmZvID0gbmV3IE15VVJMRW50cnkoZGVzYyx1cmwpOwotCQlEZWZhdWx0RmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZSgpOwotCQlmZWF0dXJlLnNldERlc2NyaXB0aW9uKGluZm8pOwotCQlTdHJpbmcgcmVzdWx0ID0gZmVhdHVyZS5nZXREZXNjcmlwdGlvbigpLmdldEFubm90YXRpb24oKTsKLQkJYXNzZXJ0RXF1YWxzKGRlc2MscmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKHVybCxmZWF0dXJlLmdldERlc2NyaXB0aW9uKCkuZ2V0VVJMKCkpOwotCX0JCi0KLQotCi19Ci0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2FwaS9UZXN0RGVmYXVsdFBhY2thZ2VGZWF0dXJlQVBJLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9hcGkvVGVzdERlZmF1bHRQYWNrYWdlRmVhdHVyZUFQSS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDYxMzQxLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2FwaS9UZXN0RGVmYXVsdFBhY2thZ2VGZWF0dXJlQVBJLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5hcGk7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuVXBkYXRlTWFuYWdlclV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5VcGRhdGVNYW5hZ2VyVGVzdENhc2U7Ci0KLQotCi1wdWJsaWMgY2xhc3MgVGVzdERlZmF1bHRQYWNrYWdlRmVhdHVyZUFQSSBleHRlbmRzIFVwZGF0ZU1hbmFnZXJUZXN0Q2FzZSB7Ci0JCi0JcHJpdmF0ZQlEZWZhdWx0RmVhdHVyZSByZW1vdGVGZWF0dXJlPW51bGw7Ci0JCi0JLyoqCi0JICogVGVzdCB0aGUgdGVzdEZlYXR1cmVzKCkKLQkgKi8KLQlwdWJsaWMgVGVzdERlZmF1bHRQYWNrYWdlRmVhdHVyZUFQSShTdHJpbmcgYXJnMCkgewotCQlzdXBlcihhcmcwKTsKLQl9Ci0JCi0JLyoqCi0JICogdGhlIGZlYXR1cmUgdG8gdGVzdAotCSAqLwotCXByaXZhdGUgRGVmYXVsdEZlYXR1cmUgZ2V0RmVhdHVyZSgpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlpZiAocmVtb3RlRmVhdHVyZSA9PSBudWxsKXsKLQkJSVNpdGUgc2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUoU09VUkNFX0ZJTEVfU0lURSwgbnVsbCk7Ci0JCVVSTCBpZCA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkwoc2l0ZS5nZXRVUkwoKSwib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmVhdHVyZTFfMS4wLjAuamFyIixudWxsKTsJCi0JCXJlbW90ZUZlYXR1cmUgPSBuZXcgRGVmYXVsdEZlYXR1cmUoc2l0ZSk7Ci0JCXJlbW90ZUZlYXR1cmUuc2V0VVJMKGlkKTsKLQkJfQotCQlyZXR1cm4gcmVtb3RlRmVhdHVyZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SWRlbnRpZmllcigpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBNYWxmb3JtZWRVUkxFeGNlcHRpb24gewotCQkKLQkJU3RyaW5nIGlkMSA9ICJmZWF0dXJlcy9vcmcuZWNsaXBzZS50ZXN0LmZlYXR1cmVfMS4wLjAuamFyIjsKLQkJU3RyaW5nIGlkMiA9ICJmZWF0dXJlcy9vcmcuZWNsaXBzZV90ZXN0X2ZlYXR1cmUuamFyIjsKLQkJVmVyc2lvbmVkSWRlbnRpZmllciBpZGVudDEgPSBuZXcgVmVyc2lvbmVkSWRlbnRpZmllcigib3JnLnRlc3QxLmlkZW50MSIsIjEuMC4wIik7Ci0JCVZlcnNpb25lZElkZW50aWZpZXIgaWRlbnQyID0gbmV3IFZlcnNpb25lZElkZW50aWZpZXIoIm9yZy50ZXN0MS5pZGVudDIiLCIxLjAuMCIpOwkJCi0JCQotCi0JCQlJU2l0ZSBzaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShTT1VSQ0VfRklMRV9TSVRFLCBudWxsKTsKLQkJCQotCQkJVVJMIHVybDEgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0VVJMKHNpdGUuZ2V0VVJMKCksaWQxLG51bGwpOwkJCQotCQkJcmVtb3RlRmVhdHVyZSA9IG5ldyBEZWZhdWx0RmVhdHVyZShzaXRlKTsKLQkJCXJlbW90ZUZlYXR1cmUuc2V0VVJMKHVybDEpOwotCQkJcmVtb3RlRmVhdHVyZS5zZXRJZGVudGlmaWVyKGlkZW50MSk7Ci0JCQlhc3NlcnRFcXVhbHMoaWRlbnQxLnRvU3RyaW5nKCkscmVtb3RlRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSk7Ci0JCQotCQkJIFVSTCB1cmwyID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTChzaXRlLmdldFVSTCgpLGlkMixudWxsKTsJCQotCQkJcmVtb3RlRmVhdHVyZSA9IG5ldyBEZWZhdWx0RmVhdHVyZShzaXRlKTsKLQkJCXJlbW90ZUZlYXR1cmUuc2V0VVJMKHVybDIpOwotCQkJcmVtb3RlRmVhdHVyZS5zZXRJZGVudGlmaWVyKGlkZW50Mik7CQkJCi0JCQlhc3NlcnRFcXVhbHMoaWRlbnQyLnRvU3RyaW5nKCkscmVtb3RlRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0U2l0ZSgpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlTdHJpbmcgaWRlbnQxID0gIm9yZy5lY2xpcHNlLnRlc3QuZmVhdHVyZV8xLjAuMC5qYXIiOwkJCi0KLQkJCUlTaXRlIHNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKFNPVVJDRV9GSUxFX1NJVEUsIG51bGwpOwotCQkJCi0JCQlVUkwgaWQgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0VVJMKHNpdGUuZ2V0VVJMKCksaWRlbnQxLG51bGwpOwkJCi0JCQlyZW1vdGVGZWF0dXJlID0gbmV3IERlZmF1bHRGZWF0dXJlKHNpdGUpOwotCQkJcmVtb3RlRmVhdHVyZS5zZXRVUkwoaWQpOwkKLQkJCWFzc2VydEVxdWFscyhzaXRlLHJlbW90ZUZlYXR1cmUuZ2V0U2l0ZSgpKTsKLQotCX0KLQotCi0JcHVibGljIHZvaWQgdGVzdExhYmVsKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBsYWJlbCA9ICJkdW1teSBsYWJlbCI7Ci0JCUZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmUoKTsKLQkJZmVhdHVyZS5zZXRMYWJlbChsYWJlbCk7Ci0JCWFzc2VydEVxdWFscyhsYWJlbCxmZWF0dXJlLmdldExhYmVsKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVVUkwoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKLQkJVVJMIHVybCA9IG51bGw7Ci0JCVN0cmluZyBsYWJlbCA9ICJPVEkgU2l0ZSI7Ci0JCXRyeSB7Ci0JCQl1cmwgPSBuZXcgVVJMKCJodHRwOi8vd3d3Lm90aS5jb20vIik7Ci0JCQkKLQkJfSBjYXRjaCAoamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpe30gLy8gaW1wb3NzaWJsZSBlaCAhCi0JCURlZmF1bHRGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlKCk7Ci0JCWZlYXR1cmUuc2V0VXBkYXRlU2l0ZUVudHJ5KG5ldyBNeVVSTEVudHJ5KGxhYmVsLCB1cmwpKTsKLQkJYXNzZXJ0RXF1YWxzKHVybCxmZWF0dXJlLmdldFVwZGF0ZVNpdGVFbnRyeSgpLmdldFVSTCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGxhYmVsLGZlYXR1cmUuZ2V0VXBkYXRlU2l0ZUVudHJ5KCkuZ2V0QW5ub3RhdGlvbigpKTsKLQotCX0gCi0KLQotCQotCXB1YmxpYyB2b2lkIHRlc3REaXNjb3ZlcnlVUkxzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7Ci0JCUlVUkxFbnRyeVtdIHVybEluZm8gPSBuZXcgVVJMRW50cnlbMl07Ci0JCVVSTFtdIHVybCA9IG5ldyBVUkxbMl07Ci0JCVN0cmluZ1tdIGxhYmVsID0gbmV3IFN0cmluZ1syXTsKLQkJdHJ5IHsKLQkJCXVybFswXSA9IG5ldyBVUkwoImh0dHA6Ly93d3cub3RpLmNvbS8iKTsKLQkJCXVybFsxXSA9IG5ldyBVUkwoImh0dHA6Ly9lY2xpcHNlLm9yZy8iKTsKLQkJCWxhYmVsWzBdID0gIk9USSBTaXRlIjsKLQkJCWxhYmVsWzFdID0gIkVjbGlwc2UgU2l0ZSI7Ci0JCX0gY2F0Y2ggKGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKXt9IC8vIGltcG9zc2libGUgZWggIQotCQlEZWZhdWx0RmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZSgpOwotCQlmb3IgKGludCBpPTA7aTwyO2krKyl7Ci0JCQkJdXJsSW5mb1tpXSA9IG5ldyBNeVVSTEVudHJ5KGxhYmVsW2ldLHVybFtpXSk7Ci0JCX0KLQkJZmVhdHVyZS5zZXREaXNjb3ZlcnlTaXRlRW50cmllcyh1cmxJbmZvKTsKLQkJZm9yIChpbnQgaT0wOyBpPGZlYXR1cmUuZ2V0RGlzY292ZXJ5U2l0ZUVudHJpZXMoKS5sZW5ndGg7aSsrKXsKLQkJCWFzc2VydEVxdWFscyh1cmxJbmZvW2ldLGZlYXR1cmUuZ2V0RGlzY292ZXJ5U2l0ZUVudHJpZXMoKVtpXSk7Ci0JCX0KLQotCi0JfQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJvdmlkZXIoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHByb3ZpZGVyID0gIm5vdCBzbyBkdW1teSBwcm92aWRlciI7Ci0JCUZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmUoKTsKLQkJZmVhdHVyZS5zZXRQcm92aWRlcihwcm92aWRlcik7Ci0JCWFzc2VydEVxdWFscyhwcm92aWRlcixmZWF0dXJlLmdldFByb3ZpZGVyKCkpOwotCX0KLQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVzY3JpcHRpb24oKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGRlc2MgPSAicHJldHR5IGxvbmcgZGVzY3JpcHRpb24gYXMgYSBzdHJpbmcgd2l0aCBcclxuIGFuZCBcdCBhbmQgXG4iOwotCQlJVVJMRW50cnkgaW5mbyA9IG5ldyBNeVVSTEVudHJ5KGRlc2MsbnVsbCk7Ci0JCURlZmF1bHRGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlKCk7Ci0JCWZlYXR1cmUuc2V0RGVzY3JpcHRpb24oaW5mbyk7Ci0JCWFzc2VydEVxdWFscyhkZXNjLGZlYXR1cmUuZ2V0RGVzY3JpcHRpb24oKS5nZXRBbm5vdGF0aW9uKCkpOwotCX0KLQkKLQotCXB1YmxpYyB2b2lkIHRlc3REZXNjcmlwdGlvbjEoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKLQkJVVJMIHVybCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl1cmwgPSBuZXcgVVJMKCJodHRwOi8vd3d3Lm90aS5jb20iKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpey8qcHJldHR5IGltcG9zc2libGUqL30KLQkJSVVSTEVudHJ5IGluZm8gPSBuZXcgTXlVUkxFbnRyeShudWxsLHVybCk7Ci0JCURlZmF1bHRGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlKCk7Ci0JCWZlYXR1cmUuc2V0RGVzY3JpcHRpb24oaW5mbyk7Ci0JCWFzc2VydEVxdWFscyh1cmwsZmVhdHVyZS5nZXREZXNjcmlwdGlvbigpLmdldFVSTCgpKTsKLQl9CQotCQotCXB1YmxpYyB2b2lkIHRlc3REZXNjcmlwdGlvbjIoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKLQkJCi0JCVVSTCB1cmwgPSBudWxsOwotCQl0cnkgewotCQkJdXJsID0gbmV3IFVSTCgiaHR0cDovL3d3dy5vdGkuY29tIik7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKXsvKnByZXR0eSBpbXBvc3NpYmxlKi99Ci0JCVN0cmluZyBkZXNjID0gInByZXR0eSBsb25nIGRlc2NyaXB0aW9uIGFzIGEgc3RyaW5nIHdpdGggXHJcbiBhbmQgXHQgYW5kIFxuIjsKLQkJSVVSTEVudHJ5IGluZm8gPSBuZXcgTXlVUkxFbnRyeShkZXNjLHVybCk7Ci0JCURlZmF1bHRGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlKCk7Ci0JCWZlYXR1cmUuc2V0RGVzY3JpcHRpb24oaW5mbyk7Ci0JCWFzc2VydEVxdWFscyhkZXNjLGZlYXR1cmUuZ2V0RGVzY3JpcHRpb24oKS5nZXRBbm5vdGF0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHModXJsLGZlYXR1cmUuZ2V0RGVzY3JpcHRpb24oKS5nZXRVUkwoKSk7Ci0JfQotCi0KLQotfQotCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9hcGkvVGVzdEZlYXR1cmVDb250ZW50UHJvdmlkZXJfRmlsZUZpbHRlckFQSS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvYXBpL1Rlc3RGZWF0dXJlQ29udGVudFByb3ZpZGVyX0ZpbGVGaWx0ZXJBUEkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmUzMTdkZC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9hcGkvVGVzdEZlYXR1cmVDb250ZW50UHJvdmlkZXJfRmlsZUZpbHRlckFQSS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5hcGk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuRmVhdHVyZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5GZWF0dXJlRXhlY3V0YWJsZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuVXBkYXRlTWFuYWdlclRlc3RDYXNlOwotCi0KLQotcHVibGljIGNsYXNzIFRlc3RGZWF0dXJlQ29udGVudFByb3ZpZGVyX0ZpbGVGaWx0ZXJBUEkgZXh0ZW5kcyBVcGRhdGVNYW5hZ2VyVGVzdENhc2UgewotCQotCQotCS8qKgotCSAqIFRlc3QgdGhlIHRlc3RGZWF0dXJlcygpCi0JICovCi0JcHVibGljIFRlc3RGZWF0dXJlQ29udGVudFByb3ZpZGVyX0ZpbGVGaWx0ZXJBUEkoU3RyaW5nIGFyZzApIHsKLQkJc3VwZXIoYXJnMCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RGaWxlRmlsdGVyKCl7Ci0JCQotCQlTdHJpbmcgcDEgPSAiL3AxL3AyL2EuKiI7Ci0JCVN0cmluZyBwMiA9ICJwMS9wMi9iLioiOwotCQlTdHJpbmcgcDMgPSAiL3AxL3AyL2EudHh0IjsKLQkJU3RyaW5nIHA0ID0gIi9wMS9wMi8qLnR4dCI7Ci0JCQotCQlTdHJpbmcgbmFtZTEgPSAiL3AxL3AyL2EudHh0IjsKLQkJU3RyaW5nIG5hbWUyID0gIi9wMS9wMi9iLnR4dCI7Ci0JCVN0cmluZyBuYW1lMyA9ICIvcDMvcDIvYS50eHQiOwotCQlTdHJpbmcgbmFtZTQgPSAicDEvcDIvYS50eHQiOwotCQlTdHJpbmcgbmFtZTUgPSAiL3AxL3AyL2IudHh0IjsKLQkJU3RyaW5nIG5hbWU2ID0gIi9wMS9wMi9jLnR4dCI7Ci0JCVN0cmluZyBuYW1lNyA9ICIvcDEvcDIvcDMvYS50eHQiOwotCQkKLQkJCi0JCUZlYXR1cmVDb250ZW50UHJvdmlkZXIgY3AgPSBuZXcgRmVhdHVyZUV4ZWN1dGFibGVDb250ZW50UHJvdmlkZXIobnVsbCk7Ci0JCQotCQlGZWF0dXJlQ29udGVudFByb3ZpZGVyLkZpbGVGaWx0ZXIgZmlsdGVyMSA9IGNwLm5ldyBGaWxlRmlsdGVyKHAxKTsKLQkJRmVhdHVyZUNvbnRlbnRQcm92aWRlci5GaWxlRmlsdGVyIGZpbHRlcjIgPSBjcC5uZXcgRmlsZUZpbHRlcihwMik7Ci0JCUZlYXR1cmVDb250ZW50UHJvdmlkZXIuRmlsZUZpbHRlciBmaWx0ZXIzID0gY3AubmV3IEZpbGVGaWx0ZXIocDMpOwotCQlGZWF0dXJlQ29udGVudFByb3ZpZGVyLkZpbGVGaWx0ZXIgZmlsdGVyNCA9IGNwLm5ldyBGaWxlRmlsdGVyKHA0KTsKLQotCQlhc3NlcnRUcnVlKCIxLjEiLGZpbHRlcjEuYWNjZXB0KG5hbWUxKSk7CQkKLQkJYXNzZXJ0VHJ1ZSgiMS4yIiwhZmlsdGVyMS5hY2NlcHQobmFtZTIpKTsJCQotCQlhc3NlcnRUcnVlKCIxLjMiLCFmaWx0ZXIxLmFjY2VwdChuYW1lMykpOwkKLQkJYXNzZXJ0VHJ1ZSgiMS40IiwhZmlsdGVyMS5hY2NlcHQobmFtZTQpKTsJCQotCQlhc3NlcnRUcnVlKCIxLjUiLCFmaWx0ZXIxLmFjY2VwdChuYW1lNSkpOwkJCi0JCWFzc2VydFRydWUoIjEuNiIsIWZpbHRlcjEuYWNjZXB0KG5hbWU2KSk7CQkKLQkJYXNzZXJ0VHJ1ZSgiMS43IiwhZmlsdGVyMS5hY2NlcHQobmFtZTcpKTsKLQkKLQkJYXNzZXJ0VHJ1ZSgiMi4xIiwhZmlsdGVyMi5hY2NlcHQobmFtZTEpKTsJCQotCQlhc3NlcnRUcnVlKCIyLjIiLCFmaWx0ZXIyLmFjY2VwdChuYW1lMikpOwkJCi0JCWFzc2VydFRydWUoIjIuMyIsIWZpbHRlcjIuYWNjZXB0KG5hbWUzKSk7CQotCQlhc3NlcnRUcnVlKCIyLjQiLCFmaWx0ZXIyLmFjY2VwdChuYW1lNCkpOwkJCi0JCWFzc2VydFRydWUoIjIuNSIsIWZpbHRlcjIuYWNjZXB0KG5hbWU1KSk7CQkKLQkJYXNzZXJ0VHJ1ZSgiMi42IiwhZmlsdGVyMi5hY2NlcHQobmFtZTYpKTsJCQotCQlhc3NlcnRUcnVlKCIyLjciLCFmaWx0ZXIyLmFjY2VwdChuYW1lNykpOwotCi0JCWFzc2VydFRydWUoIjMuMSIsZmlsdGVyMy5hY2NlcHQobmFtZTEpKTsJCQotCQlhc3NlcnRUcnVlKCIzLjIiLCFmaWx0ZXIzLmFjY2VwdChuYW1lMikpOwkJCi0JCWFzc2VydFRydWUoIjMuMyIsIWZpbHRlcjMuYWNjZXB0KG5hbWUzKSk7CQotCQlhc3NlcnRUcnVlKCIzLjQiLCFmaWx0ZXIzLmFjY2VwdChuYW1lNCkpOwkJCi0JCWFzc2VydFRydWUoIjMuNSIsIWZpbHRlcjMuYWNjZXB0KG5hbWU1KSk7CQkKLQkJYXNzZXJ0VHJ1ZSgiMy42IiwhZmlsdGVyMy5hY2NlcHQobmFtZTYpKTsJCQotCQlhc3NlcnRUcnVlKCIzLjciLCFmaWx0ZXIzLmFjY2VwdChuYW1lNykpOwotCQkKLQkJYXNzZXJ0VHJ1ZSgiNC4xIixmaWx0ZXI0LmFjY2VwdChuYW1lMSkpOwkJCi0JCWFzc2VydFRydWUoIjQuMiIsZmlsdGVyNC5hY2NlcHQobmFtZTIpKTsJCQotCQlhc3NlcnRUcnVlKCI0LjMiLCFmaWx0ZXI0LmFjY2VwdChuYW1lMykpOwkKLQkJYXNzZXJ0VHJ1ZSgiNC40IiwhZmlsdGVyNC5hY2NlcHQobmFtZTQpKTsJCQotCQlhc3NlcnRUcnVlKCI0LjUiLGZpbHRlcjQuYWNjZXB0KG5hbWU1KSk7CQkKLQkJYXNzZXJ0VHJ1ZSgiNC42IixmaWx0ZXI0LmFjY2VwdChuYW1lNikpOwkJCi0JCWFzc2VydFRydWUoIjQuNyIsIWZpbHRlcjQuYWNjZXB0KG5hbWU3KSk7CQkJCQkJCQkKLQkJCQkJCi0JfQotfQotCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9hcGkvVGVzdExvY2FsU2l0ZUFQSS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvYXBpL1Rlc3RMb2NhbFNpdGVBUEkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU3MDg4NS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9hcGkvVGVzdExvY2FsU2l0ZUFQSS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuYXBpOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuQ2F0ZWdvcnlNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC5TaXRlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLlVwZGF0ZU1hbmFnZXJUZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIFRlc3RMb2NhbFNpdGVBUEkgZXh0ZW5kcyBVcGRhdGVNYW5hZ2VyVGVzdENhc2UgewotCQotCS8qKgotCSAqIFRlc3QgdGhlIGdldEZlYXR1cmVzKCkKLQkgKi8KLQlwdWJsaWMgVGVzdExvY2FsU2l0ZUFQSShTdHJpbmcgYXJnMCkgewotCQlzdXBlcihhcmcwKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEZpbGVQYXJzaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJSVNpdGUgc2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUobmV3IFVSTChTT1VSQ0VfRklMRV9TSVRFLCJzaXRlVGVzdExvY2FsU2l0ZS8iKSwgbnVsbCk7Ci0JCUlBcmNoaXZlUmVmZXJlbmNlW10gaW5mbyA9IHNpdGUuZ2V0QXJjaGl2ZXMoKTsKLQkJCi0JCWlmIChpbmZvLmxlbmd0aDw9MCl7Ci0JCQlmYWlsKCJubyBwbHVnaW5zIGluIHNpdGU6ICIrc2l0ZS5nZXRVUkwoKS50b0V4dGVybmFsRm9ybSgpKTsKLQkJfQotCQkgCi0JCWJvb2xlYW4gZm91bmQxID0gZmFsc2U7Ci0JCWJvb2xlYW4gZm91bmQyID0gZmFsc2U7Ci0JCVN0cmluZyBuYW1lMT0gInBsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMl81LjAuMC5qYXIiOwotCQlTdHJpbmcgbmFtZTIgPSAicGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4yXzUuMC4xLmphciI7Ci0JCQotCQlmb3IgKGludCBpID0wOyBpPGluZm8ubGVuZ3RoOyBpKyspewotCQkJaWYgKGluZm9baV0uZ2V0UGF0aCgpLmVxdWFscyhuYW1lMSkpIGZvdW5kMSA9IHRydWU7Ci0JCQlpZiAoaW5mb1tpXS5nZXRQYXRoKCkuZXF1YWxzKG5hbWUyKSkgZm91bmQyID0gdHJ1ZTsKLQkJfQotCQkKLQkJaWYgKCFmb3VuZDEgfHwgIWZvdW5kMil7Ci0JCQlmYWlsKCJDYW5ub3QgZmluZCBwbHVnaW4gOiBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4yIHZlcnNpb24gNS4wLjAgYW5kIDUuMC4xIG9uIHRoZSBzaXRlLCBieSBwYXJzaW5nIGZpbGUgc3lzdGVtIik7Ci0JCX0KLQkJCi0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEJ1bmRsZU1hbmlmZXN0UGFyc2luZygpIHRocm93cyBFeGNlcHRpb24gewotCi0JCUlTaXRlIHNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKG5ldyBVUkwoU09VUkNFX0ZJTEVfU0lURSwic2l0ZVRlc3RMb2NhbFNpdGUvIiksbnVsbCk7Ci0JCUlBcmNoaXZlUmVmZXJlbmNlW10gaW5mbyA9IHNpdGUuZ2V0QXJjaGl2ZXMoKTsKLQkJCi0JCWlmIChpbmZvLmxlbmd0aDw9MCl7Ci0JCQlmYWlsKCJubyBwbHVnaW5zIGluIHNpdGU6ICIrc2l0ZS5nZXRVUkwoKS50b0V4dGVybmFsRm9ybSgpKTsKLQkJfQotCQkgCi0JCWJvb2xlYW4gZm91bmQxID0gZmFsc2U7Ci0JCWJvb2xlYW4gZm91bmQyID0gZmFsc2U7Ci0JCWJvb2xlYW4gZm91bmQzID0gZmFsc2U7Ci0JCVN0cmluZyBuYW1lMT0gInBsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuYnVuZGxlTWFuaWZlc3RfMS4wLjEuamFyIjsKLQkJU3RyaW5nIG5hbWUyID0gInBsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuYnVuZGxlQW5kUGx1Z2luTWFuaWZlc3RzQlVORExFUEFSU0VEXzEuMC4zLmphciI7Ci0JCVN0cmluZyBuYW1lMyA9ICJwbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmJ1bmRsZUFuZFBsdWdpbk1hbmlmZXN0c18xLjAuMy5qYXIiOwotCQkKLQkJZm9yIChpbnQgaSA9MDsgaTxpbmZvLmxlbmd0aDsgaSsrKXsKLQkJCWlmIChpbmZvW2ldLmdldFBhdGgoKS5lcXVhbHMobmFtZTEpKSBmb3VuZDEgPSB0cnVlOwotCQkJaWYgKGluZm9baV0uZ2V0UGF0aCgpLmVxdWFscyhuYW1lMikpIGZvdW5kMiA9IHRydWU7Ci0JCQlpZiAoaW5mb1tpXS5nZXRQYXRoKCkuZXF1YWxzKG5hbWUzKSkgZm91bmQzID0gdHJ1ZTsKLQkJfQotCQkKLQkJaWYgKCFmb3VuZDEgfHwgIWZvdW5kMil7Ci0JCQlmYWlsKCJDYW5ub3QgZmluZCBwbHVnaW4gOiBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4yIHZlcnNpb24gNS4wLjAgYW5kIDUuMC4xIG9uIHRoZSBzaXRlLCBieSBwYXJzaW5nIGZpbGUgc3lzdGVtIik7Ci0JCX0KLQkJaWYgKGZvdW5kMyl7Ci0JCQlmYWlsKCJQbHVnaW4gbWFuaWZlc3QgcGFyc2VkIGluc3RlYWQgb2YgYnVuZGxlIG1hbmlmZXN0LiIpOwotCQl9Ci0JCQotCi0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RDYXRlZ29yaWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJSVNpdGUgc2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUoU09VUkNFX0ZJTEVfU0lURSwgbnVsbCk7Ci0JCQotCQlJQ2F0ZWdvcnkgY2F0ZWdvcnkgPSBuZXcgQ2F0ZWdvcnkoImNhdGVnb3J5IiwiTGFiZWwgb2YgY2F0ZWdvcnkiKTsKLQkJCi0JCSgoU2l0ZU1vZGVsKXNpdGUpLmFkZENhdGVnb3J5TW9kZWwoKENhdGVnb3J5TW9kZWwpY2F0ZWdvcnkpOwotCQkKLQkJSUNhdGVnb3J5W10gY2F0ZWdvcmllcyA9IHNpdGUuZ2V0Q2F0ZWdvcmllcygpOwotCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCWZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBjYXRlZ29yaWVzLmxlbmd0aDsgaW5kZXgrKykgewotCQkJSUNhdGVnb3J5IGVsZW1lbnQgPSBjYXRlZ29yaWVzW2luZGV4XTsKLQkJCWlmIChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoImNhdGVnb3J5IikpIGZvdW5kID0gdHJ1ZTsKLQkJfQotCQlpZiAoIWZvdW5kKSBmYWlsKCJjYW5ub3QgZmluZCBjYXRlZ29yeSAnY2F0ZWdvcnknIGluIHNpdGUiKTsKLQotCQlJU2l0ZUZlYXR1cmVSZWZlcmVuY2UgcmVmID0gbmV3IFNpdGVGZWF0dXJlUmVmZXJlbmNlKCk7Ci0JCXJlZi5zZXRTaXRlKHNpdGUpOwotCQlyZWYuYWRkQ2F0ZWdvcnkoY2F0ZWdvcnkpOwkJCi0JCWNhdGVnb3JpZXMgPSByZWYuZ2V0Q2F0ZWdvcmllcygpOwotCQlmb3VuZCA9IGZhbHNlOwotCQlmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgY2F0ZWdvcmllcy5sZW5ndGg7IGluZGV4KyspIHsKLQkJCUlDYXRlZ29yeSBlbGVtZW50ID0gY2F0ZWdvcmllc1tpbmRleF07Ci0JCQlpZiAoZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKCJjYXRlZ29yeSIpKSBmb3VuZCA9IHRydWU7Ci0JCX0KLQkJaWYgKCFmb3VuZCkgZmFpbCgiY2Fubm90IGZpbmQgY2F0ZWdvcnkgJ2NhdGVnb3J5JyBpbiBmZWF0dXJlIik7Ci0JCQotCQkJfQotCi19Ci0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2FwaS9UZXN0TmVzdGVkRmVhdHVyZUFQSS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvYXBpL1Rlc3ROZXN0ZWRGZWF0dXJlQVBJLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjMWM3ZDMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvYXBpL1Rlc3ROZXN0ZWRGZWF0dXJlQVBJLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5hcGk7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuVXBkYXRlTWFuYWdlclV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5VcGRhdGVNYW5hZ2VyVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0TmVzdGVkRmVhdHVyZUFQSSBleHRlbmRzIFVwZGF0ZU1hbmFnZXJUZXN0Q2FzZSB7Ci0KLQkvKioKLQkgKiBUZXN0IHRoZSB0ZXN0RmVhdHVyZXMoKQotCSAqLwotCXB1YmxpYyBUZXN0TmVzdGVkRmVhdHVyZUFQSShTdHJpbmcgYXJnMCkgewotCQlzdXBlcihhcmcwKTsKLQl9Ci0KLQkvKioKLQkgKiB0aGUgZmVhdHVyZSB0byB0ZXN0Ci0JICovCi0JcHJpdmF0ZSBJRmVhdHVyZSBnZXRSb290RmVhdHVyZSgpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlJU2l0ZSBzaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShuZXcgVVJMKFNPVVJDRV9GSUxFX1NJVEUsICJuZXN0ZWRGZWF0dXJlU2l0ZVRlc3Qvc2l0ZS54bWwiKSxudWxsKTsKLQkJVVJMIHVybCA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkwoc2l0ZS5nZXRVUkwoKSwgU2l0ZS5ERUZBVUxUX0lOU1RBTExFRF9GRUFUVVJFX1BBVEggKyAicm9vdGZlYXR1cmUuamFyIiwgbnVsbCk7Ci0JCVNpdGVGZWF0dXJlUmVmZXJlbmNlIHJlZiA9IG5ldyBTaXRlRmVhdHVyZVJlZmVyZW5jZSgpOwotCQlyZWYuc2V0U2l0ZShzaXRlKTsKLQkJcmVmLnNldFVSTCh1cmwpOwotCQlyZWYuc2V0VHlwZShJU2l0ZS5ERUZBVUxUX1BBQ0tBR0VEX0ZFQVRVUkVfVFlQRSk7Ci0JCUlGZWF0dXJlIGZlYXR1cmUgPSByZWYuZ2V0RmVhdHVyZShudWxsKTsKLQkJcmV0dXJuIGZlYXR1cmU7Ci0JfQotCi0JLyoqCi0JICogdGhlIGZlYXR1cmUgdG8gdGVzdAotCSAqLwotCXByaXZhdGUgSUZlYXR1cmUgZ2V0Q2hpbGRGZWF0dXJlKCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJSVNpdGUgc2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUobmV3IFVSTChTT1VSQ0VfRklMRV9TSVRFLCAibmVzdGVkRmVhdHVyZVNpdGVUZXN0LyIpLCBudWxsKTsKLQkJVVJMIHVybCA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkwoc2l0ZS5nZXRVUkwoKSwgU2l0ZS5ERUZBVUxUX0lOU1RBTExFRF9GRUFUVVJFX1BBVEggKyAib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuY2hpbGRyZW5mZWF0dXJlXzIuMC4wLmphciIsIG51bGwpOwotCQlTaXRlRmVhdHVyZVJlZmVyZW5jZSByZWYgPSBuZXcgU2l0ZUZlYXR1cmVSZWZlcmVuY2UoKTsKLQkJcmVmLnNldFNpdGUoc2l0ZSk7Ci0JCXJlZi5zZXRVUkwodXJsKTsKLQkJcmVmLnNldFR5cGUoSVNpdGUuREVGQVVMVF9QQUNLQUdFRF9GRUFUVVJFX1RZUEUpOwotCQlJRmVhdHVyZSBmZWF0dXJlID0gcmVmLmdldEZlYXR1cmUobnVsbCk7Ci0JCXJldHVybiBmZWF0dXJlOwotCX0KLQotCS8qCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgdGVzdE5lc3RlZCgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCUlGZWF0dXJlIHJvb3RGZWF0dXJlID0gZ2V0Um9vdEZlYXR1cmUoKTsKLQkJSUZlYXR1cmVSZWZlcmVuY2VbXSByZWYgPSByb290RmVhdHVyZS5nZXRJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VzKCk7Ci0JCUlGZWF0dXJlIGNoaWxkRmVhdHVyZSA9IGdldENoaWxkRmVhdHVyZSgpOwotCQlhc3NlcnRFcXVhbHMoIkNoaWxkcmVuIGZlYXR1cmUgYXJlIG5vdCBlcXVhbCIsIGNoaWxkRmVhdHVyZSwgcmVmWzBdLmdldEZlYXR1cmUobnVsbCkpOwotCX0KLQotCS8qKgotCSAqIHRoZSBmZWF0dXJlIHRvIHRlc3QKLQkgKi8KLQlwcml2YXRlIElGZWF0dXJlIGdldFJvb3RGZWF0dXJlMigpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlJU2l0ZSBzaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShuZXcgVVJMKFNPVVJDRV9GSUxFX1NJVEUsICJuZXN0ZWRGZWF0dXJlU2l0ZVRlc3QyL3NpdGUueG1sIiksbnVsbCk7Ci0JCVVSTCB1cmwgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0VVJMKHNpdGUuZ2V0VVJMKCksIFNpdGUuREVGQVVMVF9JTlNUQUxMRURfRkVBVFVSRV9QQVRIICsgInJvb3RmZWF0dXJlLmphciIsIG51bGwpOwotCQlTaXRlRmVhdHVyZVJlZmVyZW5jZSByZWYgPSBuZXcgU2l0ZUZlYXR1cmVSZWZlcmVuY2UoKTsKLQkJcmVmLnNldFNpdGUoc2l0ZSk7Ci0JCXJlZi5zZXRVUkwodXJsKTsKLQkJcmVmLnNldFR5cGUoSVNpdGUuREVGQVVMVF9QQUNLQUdFRF9GRUFUVVJFX1RZUEUpOwotCQlJRmVhdHVyZSBmZWF0dXJlID0gcmVmLmdldEZlYXR1cmUobnVsbCk7Ci0JCXJldHVybiBmZWF0dXJlOwotCX0KLQotCS8qKgotCSAqIHRoZSBmZWF0dXJlIHRvIHRlc3QKLQkgKi8KLQlwcml2YXRlIElGZWF0dXJlIGdldENoaWxkRmVhdHVyZTIoKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQotCQlJU2l0ZSBzaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShuZXcgVVJMKFNPVVJDRV9GSUxFX1NJVEUsICJuZXN0ZWRGZWF0dXJlU2l0ZVRlc3QyL3NpdGUueG1sIiksbnVsbCk7Ci0JCVVSTCB1cmwgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0VVJMKHNpdGUuZ2V0VVJMKCksIFNpdGUuREVGQVVMVF9JTlNUQUxMRURfRkVBVFVSRV9QQVRIICsgImNoaWxkcmVuZmVhdHVyZS5qYXIiLCBudWxsKTsKLQkJU2l0ZUZlYXR1cmVSZWZlcmVuY2UgcmVmID0gbmV3IFNpdGVGZWF0dXJlUmVmZXJlbmNlKCk7Ci0JCXJlZi5zZXRTaXRlKHNpdGUpOwotCQlyZWYuc2V0VVJMKHVybCk7Ci0JCXJlZi5zZXRUeXBlKElTaXRlLkRFRkFVTFRfUEFDS0FHRURfRkVBVFVSRV9UWVBFKTsKLQkJSUZlYXR1cmUgZmVhdHVyZSA9IHJlZi5nZXRGZWF0dXJlKG51bGwpOwotCQlyZXR1cm4gZmVhdHVyZTsKLQl9Ci0KLQkvKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3ROZXN0ZWQyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJSUZlYXR1cmUgcm9vdEZlYXR1cmUgPSBnZXRSb290RmVhdHVyZTIoKTsKLQkJSUZlYXR1cmVSZWZlcmVuY2VbXSByZWYgPSByb290RmVhdHVyZS5nZXRJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VzKCk7Ci0JCUlGZWF0dXJlIGNoaWxkRmVhdHVyZSA9IGdldENoaWxkRmVhdHVyZTIoKTsKLQkJYXNzZXJ0RXF1YWxzKCJDaGlsZHJlbiBmZWF0dXJlIGFyZSBub3QgZXF1YWwiLCBjaGlsZEZlYXR1cmUsIHJlZlswXS5nZXRGZWF0dXJlKG51bGwpKTsKLQl9Ci0KLS8vCS8qKgotLy8JICogdGhlIGZlYXR1cmUgdG8gdGVzdAotLy8JICovCi0vLwlwcml2YXRlIElGZWF0dXJlIGdldFJvb3RGZWF0dXJlMygpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotLy8JCUlTaXRlIHNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKG5ldyBVUkwoU09VUkNFX0ZJTEVfU0lURSwgIm5lc3RlZEZlYXR1cmVTaXRlVGVzdDMvc2l0ZS54bWwiKSwgbnVsbCk7Ci0vLwkJVVJMIHVybCA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkwoc2l0ZS5nZXRVUkwoKSwgU2l0ZS5ERUZBVUxUX0lOU1RBTExFRF9GRUFUVVJFX1BBVEggKyAicm9vdGZlYXR1cmUuamFyIiwgbnVsbCk7Ci0vLwkJU2l0ZUZlYXR1cmVSZWZlcmVuY2UgcmVmID0gbmV3IFNpdGVGZWF0dXJlUmVmZXJlbmNlKCk7Ci0vLwkJcmVmLnNldFNpdGUoc2l0ZSk7Ci0vLwkJcmVmLnNldFVSTCh1cmwpOwotLy8JCXJlZi5zZXRUeXBlKElTaXRlLkRFRkFVTFRfUEFDS0FHRURfRkVBVFVSRV9UWVBFKTsKLS8vCQlJRmVhdHVyZSBmZWF0dXJlID0gcmVmLmdldEZlYXR1cmUobnVsbCk7Ci0vLwkJcmV0dXJuIGZlYXR1cmU7Ci0vLwl9Ci0KLS8vCS8qKgotLy8JICogdGhlIGZlYXR1cmUgdG8gdGVzdAotLy8JICovCi0vLwlwcml2YXRlIElGZWF0dXJlIGdldENoaWxkRmVhdHVyZTMoKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLS8vCi0vLwkJSVNpdGUgc2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUobmV3IFVSTChTT1VSQ0VfRklMRV9TSVRFLCAibmVzdGVkRmVhdHVyZVNpdGVUZXN0My9zaXRlLnhtbCIpKTsKLS8vCQlVUkwgdXJsID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTChzaXRlLmdldFVSTCgpLCBTaXRlLkRFRkFVTFRfSU5TVEFMTEVEX0ZFQVRVUkVfUEFUSCArICJjaGlsZHJlbmZlYXR1cmUuamFyIiwgbnVsbCk7Ci0vLwkJU2l0ZUZlYXR1cmVSZWZlcmVuY2UgcmVmID0gbmV3IFNpdGVGZWF0dXJlUmVmZXJlbmNlKCk7Ci0vLwkJcmVmLnNldFNpdGUoc2l0ZSk7Ci0vLwkJcmVmLnNldFVSTCh1cmwpOwotLy8JCXJlZi5zZXRUeXBlKElTaXRlLkRFRkFVTFRfUEFDS0FHRURfRkVBVFVSRV9UWVBFKTsKLS8vCQlJRmVhdHVyZSBmZWF0dXJlID0gcmVmLmdldEZlYXR1cmUobnVsbCk7Ci0vLwkJcmV0dXJuIGZlYXR1cmU7Ci0vLwl9Ci0KLQkvKgotCSAqIAotCSAqLwotCS8qCXB1YmxpYyB2b2lkIHRlc3ROZXN0ZWQzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCi0JCQlJRmVhdHVyZSByb290RmVhdHVyZSA9IGdldFJvb3RGZWF0dXJlMygpOwotCQkJSUZlYXR1cmVSZWZlcmVuY2VbXSByZWYgPSByb290RmVhdHVyZS5nZXRJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VzKCk7Ci0JCQlJRmVhdHVyZSBjaGlsZEZlYXR1cmUgPSBnZXRDaGlsZEZlYXR1cmUzKCk7Ci0JCQlhc3NlcnRFcXVhbHMoCi0JCQkJIkNoaWxkcmVuIGZlYXR1cmUgYXJlIG5vdCBlcXVhbCIsCi0JCQkJY2hpbGRGZWF0dXJlLAotCQkJCXJlZlswXS5nZXRGZWF0dXJlKCkpOwotCQl9Ci0JKi8KLQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvYXBpL1Rlc3RQbHVnaW5Db250YWluZXJBUEkuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2FwaS9UZXN0UGx1Z2luQ29udGFpbmVyQVBJLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiNzMzNDQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvYXBpL1Rlc3RQbHVnaW5Db250YWluZXJBUEkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuYXBpOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLlVwZGF0ZU1hbmFnZXJVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuVXBkYXRlTWFuYWdlclRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgVGVzdFBsdWdpbkNvbnRhaW5lckFQSSBleHRlbmRzIFVwZGF0ZU1hbmFnZXJUZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIFNpdGUgc2l0ZTsKLQlwcml2YXRlIERlZmF1bHRGZWF0dXJlIGZlYXR1cmU7Ci0KLQkvKioKLQkgKiB0aGUgU2l0ZSB0byB0ZXN0Ci0JICovCi0JcHJpdmF0ZSBTaXRlIGdldFNpdGUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKLQkJaWYgKHNpdGUgPT0gbnVsbCkgewotCi0JCQlzaXRlID0gKFNpdGUpU2l0ZU1hbmFnZXIuZ2V0U2l0ZShuZXcgVVJMKFNPVVJDRV9GSUxFX1NJVEUsInRlc3RBUEkvIiksIG51bGwpOwotCi0JCX0KLQkJcmV0dXJuIHNpdGU7Ci0JfQotCi0JLyoqCi0JICogdGhlIGZlYXR1cmUgdG8gdGVzdAotCSAqLwotCXByaXZhdGUgRGVmYXVsdEZlYXR1cmUgZ2V0RmVhdHVyZSgpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlpZiAoZmVhdHVyZSA9PSBudWxsKSB7Ci0JCQlJU2l0ZSBzaXRlID0gZ2V0U2l0ZSgpOwotCQkJVVJMIGlkID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTChzaXRlLmdldFVSTCgpLCJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5mZWF0dXJlMV8xLjAuMC5qYXIiLG51bGwpOwkJCQkJCQotCQkJZmVhdHVyZSA9IG5ldyBEZWZhdWx0RmVhdHVyZShzaXRlKTsKLQkJCWZlYXR1cmUuc2V0VVJMKGlkKTsJCi0JCX0KLQkJcmV0dXJuIGZlYXR1cmU7Ci0JfQotCi0JLyoqCi0JICogVGVzdCB0aGUgZ2V0RmVhdHVyZXMoKQotCSAqLwotCXB1YmxpYyBUZXN0UGx1Z2luQ29udGFpbmVyQVBJKFN0cmluZyBhcmcwKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXN1cGVyKGFyZzApOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBYnN0cmFjdEZlYXR1cmUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKLQkJUGx1Z2luRW50cnkgcGx1Z2luRW50cnkgPSBuZXcgUGx1Z2luRW50cnkoKTsKLQkJcGx1Z2luRW50cnkuc2V0VmVyc2lvbmVkSWRlbnRpZmllcihuZXcgVmVyc2lvbmVkSWRlbnRpZmllcigiaWQiLCAiNiIpKTsKLQkJRmVhdHVyZSBfZmVhdHVyZSA9IGdldEZlYXR1cmUoKTsKLQkJKChEZWZhdWx0RmVhdHVyZSlfZmVhdHVyZSkuYWRkUGx1Z2luRW50cnkocGx1Z2luRW50cnkpOwotCQlhc3NlcnRFcXVhbHMoX2ZlYXR1cmUuZ2V0UGx1Z2luRW50cnlDb3VudCgpLCAxKTsKLQkJYXNzZXJ0RXF1YWxzKF9mZWF0dXJlLmdldFBsdWdpbkVudHJpZXMoKVswXSwgcGx1Z2luRW50cnkpOwotCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFic3RhY3RTaXRlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7Ci0JCVBsdWdpbkVudHJ5IHBsdWdpbkVudHJ5ID0gbmV3IFBsdWdpbkVudHJ5KCk7Ci0JCXBsdWdpbkVudHJ5LnNldFZlcnNpb25lZElkZW50aWZpZXIobmV3IFZlcnNpb25lZElkZW50aWZpZXIoImlkIiwgIjYiKSk7Ci0JCVNpdGUgX3NpdGUgPSBnZXRTaXRlKCk7Ci0JCV9zaXRlLmFkZFBsdWdpbkVudHJ5KHBsdWdpbkVudHJ5KTsKLQkJYXNzZXJ0RXF1YWxzKF9zaXRlLmdldFBsdWdpbkVudHJ5Q291bnQoKSwgMSk7Ci0JCWFzc2VydEVxdWFscyhfc2l0ZS5nZXRQbHVnaW5FbnRyaWVzKClbMF0sIHBsdWdpbkVudHJ5KTsKLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvYXBpL1Rlc3RTaXRlQVBJLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9hcGkvVGVzdFNpdGVBUEkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRkYzQwYS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9hcGkvVGVzdFNpdGVBUEkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuYXBpOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5TaXRlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuVXBkYXRlTWFuYWdlclRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgVGVzdFNpdGVBUEkgZXh0ZW5kcyBVcGRhdGVNYW5hZ2VyVGVzdENhc2UgewotCQotCS8qKgotCSAqIFRlc3QgdGhlIGdldEZlYXR1cmVzKCkKLQkgKi8KLQlwdWJsaWMgVGVzdFNpdGVBUEkoU3RyaW5nIGFyZzApIHsKLQkJc3VwZXIoYXJnMCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVUkwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlJU2l0ZSBzaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShTT1VSQ0VfRklMRV9TSVRFLCBudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBGaWxlKHNpdGUuZ2V0VVJMKCkuZ2V0RmlsZSgpKSxuZXcgRmlsZShTT1VSQ0VfRklMRV9TSVRFLmdldEZpbGUoKSkpOwotCQkKLQkJSVNpdGUgc2l0ZTIgPSBTaXRlTWFuYWdlci5nZXRTaXRlKFNPVVJDRV9IVFRQX1NJVEUsIG51bGwpOwotCQlhc3NlcnRFcXVhbHMoc2l0ZTIuZ2V0VVJMKCksbmV3IFVSTCgiaHR0cCIsIGdldEh0dHBIb3N0KCksZ2V0SHR0cFBvcnQoKSwgYnVuZGxlLmdldFN0cmluZygiSFRUUF9QQVRIXzEiKSsic2l0ZS54bWwiKSk7Ci0KLQl9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvYXBpL1Rlc3RTaXRlTWFuYWdlckFQSS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvYXBpL1Rlc3RTaXRlTWFuYWdlckFQSS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGVmMTFjLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2FwaS9UZXN0U2l0ZU1hbmFnZXJBUEkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuYXBpOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuVXBkYXRlTWFuYWdlclRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgVGVzdFNpdGVNYW5hZ2VyQVBJIGV4dGVuZHMgVXBkYXRlTWFuYWdlclRlc3RDYXNlIHsKLQkKLQkvKioKLQkgKiBUZXN0IHRoZSBnZXRGZWF0dXJlcygpCi0JICovCi0JcHVibGljIFRlc3RTaXRlTWFuYWdlckFQSShTdHJpbmcgYXJnMCkgewotCQlzdXBlcihhcmcwKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEZpbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSVNpdGUgZmlsZVNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKFRBUkdFVF9GSUxFX1NJVEUsbnVsbCk7Ci0JCVN0cmluZyBzaXRlID0gZmlsZVNpdGUuZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKTsJCQotCQlhc3NlcnRFcXVhbHMoVEFSR0VUX0ZJTEVfU0lURS50b0V4dGVybmFsRm9ybSgpLCBzaXRlKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVua25vd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVVJMIHVybCA9IG5ldyBVUkwoImZ0cDovLzI1NS4yNTUuMjU1LjI1NS8iKTsKLQkJdHJ5IHsKLQkJSVNpdGUgc2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUodXJsLG51bGwpOwotCQlpZiAoc2l0ZSE9bnVsbCkgCi0JCQlmYWlsKCJDb25uZWN0ZWQgdG8gZnRwOi8vMjU1LjI1NS4yNTUuMjU1Lywgc2hvdWxkIG5vdCBoYXBwZW4iKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKXsKLQkJCS8vIGV4cGVjdGVkCi0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKXsKLQkJCS8vIGV4cGVjdGVkIGFzIHRoZSB2ZXJzaW9uIG9mIHRoZSBXZWJEYXYgSFRUUCBDb25uZWN0aW9uIHJldHVybnMgc28KLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TG9jYWxTaXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQotCQlJTG9jYWxTaXRlIHNpdGUgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKTsKLQkJSUNvbmZpZ3VyZWRTaXRlW10gaW5zdFNpdGVzID0gc2l0ZS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpLmdldENvbmZpZ3VyZWRTaXRlcygpOwotCQlhc3NlcnRUcnVlKGluc3RTaXRlcy5sZW5ndGg+MCk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiTG9jYWwgU2l0ZToiK2luc3RTaXRlc1swXS5nZXRTaXRlKCkuZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKSk7Ci0JCQotCQlJU2l0ZSByZW1vdGVTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShTT1VSQ0VfRklMRV9TSVRFX0lOU1RBTExFRCxudWxsKTsKLQkJSUZlYXR1cmUgcmVtb3RlRmVhdHVyZSA9IHJlbW90ZVNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKVswXS5nZXRGZWF0dXJlKG51bGwpOwotCQlyZW1vdmUocmVtb3RlRmVhdHVyZSxpbnN0U2l0ZXNbMF0uZ2V0U2l0ZSgpKTsJCQotCQlpbnN0U2l0ZXNbMF0uZ2V0U2l0ZSgpLmluc3RhbGwocmVtb3RlRmVhdHVyZSxudWxsLG51bGwpOwotCQkKLQkJSUZlYXR1cmVSZWZlcmVuY2VbXSBmZWF0dXJlcyA9IHNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKS5nZXRDb25maWd1cmVkU2l0ZXMoKVswXS5nZXRTaXRlKCkuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKTsKLQkJYXNzZXJ0VHJ1ZShmZWF0dXJlcy5sZW5ndGg+MCk7Ci0KLQkJLy9jbGVhbnVwCi0JCWFzc2VydE5vdE51bGwocmVtb3RlRmVhdHVyZSk7CQkKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoaW5zdFNpdGVzWzBdLmdldFNpdGUoKS5nZXRVUkwoKS5nZXRGaWxlKCkrRmlsZS5zZXBhcmF0b3IrU2l0ZS5ERUZBVUxUX0lOU1RBTExFRF9GRUFUVVJFX1BBVEgrcmVtb3RlRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkpOwotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0oZmlsZSk7Ci0JCWZpbGUgPSBuZXcgRmlsZShpbnN0U2l0ZXNbMF0uZ2V0U2l0ZSgpLmdldFVSTCgpLmdldEZpbGUoKStGaWxlLnNlcGFyYXRvcitTaXRlLkRFRkFVTFRfUExVR0lOX1BBVEgrIm9yZy5lY2xpcHNlLnVwZGF0ZS5wbHVnaW4xXzEuMS4xIik7Ci0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShmaWxlKTsJCQotCQlGaWxlIGxvY2FsRmlsZSA9IG5ldyBGaWxlKCgoTG9jYWxTaXRlKVNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpKS5nZXRMb2NhdGlvblVSTCgpLmdldEZpbGUoKSk7Ci0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShsb2NhbEZpbGUpOwkKLQotCX0KLQkKLQotfQotCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9hcGkvVGVzdFVwZGF0ZU1hbmFnZXJVdGlsc0FQSS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvYXBpL1Rlc3RVcGRhdGVNYW5hZ2VyVXRpbHNBUEkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJkNjYxOC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9hcGkvVGVzdFVwZGF0ZU1hbmFnZXJVdGlsc0FQSS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuYXBpOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLlVwZGF0ZU1hbmFnZXJVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuVXBkYXRlTWFuYWdlclRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgVGVzdFVwZGF0ZU1hbmFnZXJVdGlsc0FQSSBleHRlbmRzIFVwZGF0ZU1hbmFnZXJUZXN0Q2FzZSB7Ci0JCi0JLyoqCi0JICogVGVzdCB0aGUgZ2V0RmVhdHVyZXMoKQotCSAqLwotCXB1YmxpYyBUZXN0VXBkYXRlTWFuYWdlclV0aWxzQVBJKFN0cmluZyBhcmcwKSB7Ci0JCXN1cGVyKGFyZzApOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Z2V0VVJMKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVVSTCB1cmwxID0gbmV3IFVSTCgiaHR0cDovL3d3dy5lY2xpcHNlLm9yZyIpOwotCQlVUkwgdXJsMiA9IG5ldyBVUkwoImZpbGU6Ly9jOi9oZWxsbyIpOwotCQlVUkwgdXJsMyA9IG5ldyBVUkwoImZpbGU6L2hvbWUvZWNsaXBzZS8iKTsKLQkJVVJMIHVybDQgPSBuZXcgVVJMKCJmdHA6L2hvc3Q6ODA4MC9wYXRoLyIpOwotCQlVUkwgdXJsNSA9IG5ldyBVUkwoImphcjpmaWxlOi90bXAvMTAwMTAwIS8iKTsKLQkJCi0JCVN0cmluZyBkZWZhdWx0MSA9ICJkZWZhdWx0MS9kZWZhdWx0IjsKLQkJU3RyaW5nIGRlZmF1bHQyID0gIi9kZWZhdWx0Mi8iOwotCQkKLQkJU3RyaW5nIHN0cjEgPSAiaHR0cDovL2Rldi5lY2xpcHNlLm9yZyI7Ci0JCVN0cmluZyBzdHIyID0gInJlbGF0aXZlMS9wYXRoLyI7Ci0JCVN0cmluZyBzdHIzID0gIi9yZWxhdGl2ZTIvcGF0aCI7Ci0JCQotCQlTdHJpbmcgcmVzdWx0MT1udWxsOwotCQlTdHJpbmcgcmVzdWx0Mj1udWxsOwotCQkKLQkJLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCS8vIDEuMAotCQlyZXN1bHQxID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTCh1cmwxLHN0cjEsZGVmYXVsdDEpLnRvRXh0ZXJuYWxGb3JtKCk7Ci0JCSByZXN1bHQyID0gImh0dHA6Ly9kZXYuZWNsaXBzZS5vcmciOwotCQlhc3NlcnRFcXVhbHMoIjEuMCIscmVzdWx0MixyZXN1bHQxKTsKLQkJCi0JCS8vIDEuMQotCQkgcmVzdWx0MSA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkwobnVsbCxzdHIxLG51bGwpLnRvRXh0ZXJuYWxGb3JtKCk7Ci0JCSByZXN1bHQyID0gImh0dHA6Ly9kZXYuZWNsaXBzZS5vcmciOwotCQlhc3NlcnRFcXVhbHMoIjEuMSIscmVzdWx0MixyZXN1bHQxKTsKLQkJCi0JCS8vIDEuMgotCQkgcmVzdWx0MSA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkwodXJsMSxzdHIxLG51bGwpLnRvRXh0ZXJuYWxGb3JtKCk7Ci0JCSByZXN1bHQyID0gImh0dHA6Ly9kZXYuZWNsaXBzZS5vcmciOwotCQlhc3NlcnRFcXVhbHMoIjEuMiIscmVzdWx0MixyZXN1bHQxKTsKLQkJCi0JCS8vIDEuMwotCQkgcmVzdWx0MSA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkwodXJsMSxzdHIyLGRlZmF1bHQxKS50b0V4dGVybmFsRm9ybSgpOwotCQkgcmVzdWx0MiA9ICJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3JlbGF0aXZlMS9wYXRoLyI7Ci0JCWFzc2VydEVxdWFscygiMS4zIixyZXN1bHQyLHJlc3VsdDEpOwotCQkKLQkJLy8gMS40Ci0JCSByZXN1bHQxID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTCh1cmwxLHN0cjMsZGVmYXVsdDEpLnRvRXh0ZXJuYWxGb3JtKCk7Ci0JCSByZXN1bHQyID0gImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvcmVsYXRpdmUyL3BhdGgiOwotCQlhc3NlcnRFcXVhbHMoIjEuNCIscmVzdWx0MixyZXN1bHQxKTsKLQkJCi0JCS8vIDEuNQotCQkgcmVzdWx0MSA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkwodXJsMSxudWxsLGRlZmF1bHQxKS50b0V4dGVybmFsRm9ybSgpOwotCQkgcmVzdWx0MiA9ICJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2RlZmF1bHQxL2RlZmF1bHQiOwotCQlhc3NlcnRFcXVhbHMoIjEuNSIscmVzdWx0MixyZXN1bHQxKTsKLQkJCi0JCS8vIDEuNgotCQkgcmVzdWx0MSA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkwodXJsMSxudWxsLGRlZmF1bHQyKS50b0V4dGVybmFsRm9ybSgpOwotCQkgcmVzdWx0MiA9ICJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2RlZmF1bHQyLyI7Ci0JCWFzc2VydEVxdWFscygiMS42IixyZXN1bHQyLHJlc3VsdDEpOwotCQkKLQkJLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCS8vIDIuMAotCQkgcmVzdWx0MSA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkwodXJsMixzdHIxLGRlZmF1bHQxKS50b0V4dGVybmFsRm9ybSgpOwotCQkgcmVzdWx0MiA9ICJodHRwOi8vZGV2LmVjbGlwc2Uub3JnIjsKLQkJYXNzZXJ0RXF1YWxzKCIyLjAiLHJlc3VsdDIscmVzdWx0MSk7Ci0JCQotCQkvLyAyLjEKLQkJIHJlc3VsdDEgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0VVJMKG51bGwsc3RyMSxudWxsKS50b0V4dGVybmFsRm9ybSgpOwotCQkgcmVzdWx0MiA9ICJodHRwOi8vZGV2LmVjbGlwc2Uub3JnIjsKLQkJYXNzZXJ0RXF1YWxzKCIyLjEiLHJlc3VsdDIscmVzdWx0MSk7Ci0JCQotCQkvLyAyLjIKLQkJIHJlc3VsdDEgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0VVJMKHVybDIsc3RyMSxudWxsKS50b0V4dGVybmFsRm9ybSgpOwotCQkgcmVzdWx0MiA9ICJodHRwOi8vZGV2LmVjbGlwc2Uub3JnIjsKLQkJYXNzZXJ0RXF1YWxzKCIyLjIiLHJlc3VsdDIscmVzdWx0MSk7Ci0JCQotCQkvLyAyLjMKLQkJIHJlc3VsdDEgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0VVJMKHVybDIsc3RyMixkZWZhdWx0MSkudG9FeHRlcm5hbEZvcm0oKTsKLQkJIHJlc3VsdDIgPSAiZmlsZTovL2M6L3JlbGF0aXZlMS9wYXRoLyI7Ci0JCWFzc2VydEVxdWFscygiMi4zIixyZXN1bHQyLHJlc3VsdDEpOwotCQkKLQkJLy8gMi40Ci0JCSByZXN1bHQxID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTCh1cmwyLHN0cjMsZGVmYXVsdDEpLnRvRXh0ZXJuYWxGb3JtKCk7Ci0JCSByZXN1bHQyID0gImZpbGU6Ly9jOi9yZWxhdGl2ZTIvcGF0aCI7Ci0JCWFzc2VydEVxdWFscygiMi40IixyZXN1bHQyLHJlc3VsdDEpOwotCQkKLQkJLy8gMi41Ci0JCSByZXN1bHQxID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTCh1cmwyLG51bGwsZGVmYXVsdDEpLnRvRXh0ZXJuYWxGb3JtKCk7Ci0JCSByZXN1bHQyID0gImZpbGU6Ly9jOi9kZWZhdWx0MS9kZWZhdWx0IjsKLQkJYXNzZXJ0RXF1YWxzKCIyLjUiLHJlc3VsdDIscmVzdWx0MSk7Ci0JCQotCQkvLyAyLjYKLQkJIHJlc3VsdDEgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0VVJMKHVybDIsbnVsbCxkZWZhdWx0MikudG9FeHRlcm5hbEZvcm0oKTsKLQkJIHJlc3VsdDIgPSAiZmlsZTovL2M6L2RlZmF1bHQyLyI7Ci0JCWFzc2VydEVxdWFscygiMi42IixyZXN1bHQyLHJlc3VsdDEpOwotCQkKLQotCQkvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkJLy8gMy4wCi0JCSByZXN1bHQxID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTCh1cmwzLHN0cjEsZGVmYXVsdDEpLnRvRXh0ZXJuYWxGb3JtKCk7Ci0JCSByZXN1bHQyID0gImh0dHA6Ly9kZXYuZWNsaXBzZS5vcmciOwotCQlhc3NlcnRFcXVhbHMoIjMuMCIscmVzdWx0MixyZXN1bHQxKTsKLQkJCi0JCS8vIDMuMQotCQkgcmVzdWx0MSA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkwobnVsbCxzdHIxLG51bGwpLnRvRXh0ZXJuYWxGb3JtKCk7Ci0JCSByZXN1bHQyID0gImh0dHA6Ly9kZXYuZWNsaXBzZS5vcmciOwotCQlhc3NlcnRFcXVhbHMoIjMuMSIscmVzdWx0MixyZXN1bHQxKTsKLQkJCi0JCS8vIDMuMgotCQkgcmVzdWx0MSA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkwodXJsMyxzdHIxLG51bGwpLnRvRXh0ZXJuYWxGb3JtKCk7Ci0JCSByZXN1bHQyID0gImh0dHA6Ly9kZXYuZWNsaXBzZS5vcmciOwotCQlhc3NlcnRFcXVhbHMoIjMuMiIscmVzdWx0MixyZXN1bHQxKTsKLQkJCi0JCS8vIDMuMwotCQkgcmVzdWx0MSA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkwodXJsMyxzdHIyLGRlZmF1bHQxKS50b0V4dGVybmFsRm9ybSgpOwotCQkgcmVzdWx0MiA9ICJmaWxlOi9ob21lL2VjbGlwc2UvcmVsYXRpdmUxL3BhdGgvIjsKLQkJYXNzZXJ0RXF1YWxzKCIzLjMiLHJlc3VsdDIscmVzdWx0MSk7Ci0JCQotCQkvLyAzLjQKLQkJIHJlc3VsdDEgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0VVJMKHVybDMsc3RyMyxkZWZhdWx0MSkudG9FeHRlcm5hbEZvcm0oKTsKLQkJIHJlc3VsdDIgPSAiZmlsZTovaG9tZS9lY2xpcHNlL3JlbGF0aXZlMi9wYXRoIjsKLQkJYXNzZXJ0RXF1YWxzKCIzLjQiLHJlc3VsdDIscmVzdWx0MSk7Ci0JCQotCQkvLyAzLjUKLQkJIHJlc3VsdDEgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0VVJMKHVybDMsbnVsbCxkZWZhdWx0MSkudG9FeHRlcm5hbEZvcm0oKTsKLQkJIHJlc3VsdDIgPSAiZmlsZTovaG9tZS9lY2xpcHNlL2RlZmF1bHQxL2RlZmF1bHQiOwotCQlhc3NlcnRFcXVhbHMoIjMuNSIscmVzdWx0MixyZXN1bHQxKTsKLQkJCi0JCS8vIDMuNgotCQkgcmVzdWx0MSA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkwodXJsMyxudWxsLGRlZmF1bHQyKS50b0V4dGVybmFsRm9ybSgpOwotCQkgcmVzdWx0MiA9ICJmaWxlOi9ob21lL2VjbGlwc2UvZGVmYXVsdDIvIjsKLQkJYXNzZXJ0RXF1YWxzKCIzLjYiLHJlc3VsdDIscmVzdWx0MSk7Ci0JCQkJCi0JCS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQkvLyA0LjAKLQkJIHJlc3VsdDEgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0VVJMKHVybDQsc3RyMSxkZWZhdWx0MSkudG9FeHRlcm5hbEZvcm0oKTsKLQkJIHJlc3VsdDIgPSAiaHR0cDovL2Rldi5lY2xpcHNlLm9yZyI7Ci0JCWFzc2VydEVxdWFscygiNC4wIixyZXN1bHQyLHJlc3VsdDEpOwotCQkKLQkJLy8gNC4xCi0JCSByZXN1bHQxID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTChudWxsLHN0cjEsbnVsbCkudG9FeHRlcm5hbEZvcm0oKTsKLQkJIHJlc3VsdDIgPSAiaHR0cDovL2Rldi5lY2xpcHNlLm9yZyI7Ci0JCWFzc2VydEVxdWFscygiNC4xIixyZXN1bHQyLHJlc3VsdDEpOwotCQkKLQkJLy8gNC4yCi0JCSByZXN1bHQxID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTCh1cmw0LHN0cjEsbnVsbCkudG9FeHRlcm5hbEZvcm0oKTsKLQkJIHJlc3VsdDIgPSAiaHR0cDovL2Rldi5lY2xpcHNlLm9yZyI7Ci0JCWFzc2VydEVxdWFscygiNC4yIixyZXN1bHQyLHJlc3VsdDEpOwotCQkKLQkJLy8gNC4zCi0JCSByZXN1bHQxID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTCh1cmw0LHN0cjIsZGVmYXVsdDEpLnRvRXh0ZXJuYWxGb3JtKCk7Ci0JCSByZXN1bHQyID0gImZ0cDovaG9zdDo4MDgwL3BhdGgvcmVsYXRpdmUxL3BhdGgvIjsKLQkJYXNzZXJ0RXF1YWxzKCI0LjMiLHJlc3VsdDIscmVzdWx0MSk7Ci0JCQotCQkvLyA0LjQKLQkJIHJlc3VsdDEgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0VVJMKHVybDQsc3RyMyxkZWZhdWx0MSkudG9FeHRlcm5hbEZvcm0oKTsKLQkJIHJlc3VsdDIgPSAiZnRwOi9ob3N0OjgwODAvcGF0aC9yZWxhdGl2ZTIvcGF0aCI7Ci0JCWFzc2VydEVxdWFscygiNC40IixyZXN1bHQyLHJlc3VsdDEpOwotCQkKLQkJLy8gNC41Ci0JCSByZXN1bHQxID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTCh1cmw0LG51bGwsZGVmYXVsdDEpLnRvRXh0ZXJuYWxGb3JtKCk7Ci0JCSByZXN1bHQyID0gImZ0cDovaG9zdDo4MDgwL3BhdGgvZGVmYXVsdDEvZGVmYXVsdCI7Ci0JCWFzc2VydEVxdWFscygiNC41IixyZXN1bHQyLHJlc3VsdDEpOwotCQkKLQkJLy8gNC42Ci0JCSByZXN1bHQxID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTCh1cmw0LG51bGwsZGVmYXVsdDIpLnRvRXh0ZXJuYWxGb3JtKCk7Ci0JCSByZXN1bHQyID0gImZ0cDovaG9zdDo4MDgwL3BhdGgvZGVmYXVsdDIvIjsKLQkJYXNzZXJ0RXF1YWxzKCI0LjYiLHJlc3VsdDIscmVzdWx0MSk7Ci0JCQotCQkvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkJLy8gNS4wCi0JCSByZXN1bHQxID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTCh1cmw1LHN0cjEsZGVmYXVsdDEpLnRvRXh0ZXJuYWxGb3JtKCk7Ci0JCSByZXN1bHQyID0gImh0dHA6Ly9kZXYuZWNsaXBzZS5vcmciOwotCQlhc3NlcnRFcXVhbHMoIjUuMCIscmVzdWx0MixyZXN1bHQxKTsKLQkJCi0JCS8vIDUuMQotCQkgcmVzdWx0MSA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkwobnVsbCxzdHIxLG51bGwpLnRvRXh0ZXJuYWxGb3JtKCk7Ci0JCSByZXN1bHQyID0gImh0dHA6Ly9kZXYuZWNsaXBzZS5vcmciOwotCQlhc3NlcnRFcXVhbHMoIjUuMSIscmVzdWx0MixyZXN1bHQxKTsKLQkJCi0JCS8vIDUuMgotCQkgcmVzdWx0MSA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkwodXJsNSxzdHIxLG51bGwpLnRvRXh0ZXJuYWxGb3JtKCk7Ci0JCSByZXN1bHQyID0gImh0dHA6Ly9kZXYuZWNsaXBzZS5vcmciOwotCQlhc3NlcnRFcXVhbHMoIjUuMiIscmVzdWx0MixyZXN1bHQxKTsKLQkJCi0JCS8vIDUuMwotCQkgcmVzdWx0MSA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkwodXJsNSxzdHIyLGRlZmF1bHQxKS50b0V4dGVybmFsRm9ybSgpOwotCQkgcmVzdWx0MiA9ICJqYXI6ZmlsZTovdG1wLzEwMDEwMCEvcmVsYXRpdmUxL3BhdGgvIjsKLQkJYXNzZXJ0RXF1YWxzKCI1LjMiLHJlc3VsdDIscmVzdWx0MSk7Ci0JCQotCQkvLyA1LjQKLQkJIHJlc3VsdDEgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0VVJMKHVybDUsc3RyMyxkZWZhdWx0MSkudG9FeHRlcm5hbEZvcm0oKTsKLQkJIHJlc3VsdDIgPSAiamFyOmZpbGU6L3RtcC8xMDAxMDAhL3JlbGF0aXZlMi9wYXRoIjsKLQkJYXNzZXJ0RXF1YWxzKCI1LjQiLHJlc3VsdDIscmVzdWx0MSk7Ci0JCQotCQkvLyA1LjUKLQkJIHJlc3VsdDEgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0VVJMKHVybDUsbnVsbCxkZWZhdWx0MSkudG9FeHRlcm5hbEZvcm0oKTsKLQkJIHJlc3VsdDIgPSAiamFyOmZpbGU6L3RtcC8xMDAxMDAhL2RlZmF1bHQxL2RlZmF1bHQiOwotCQlhc3NlcnRFcXVhbHMoIjUuNSIscmVzdWx0MixyZXN1bHQxKTsKLQkJCi0JCS8vIDUuNgotCQkgcmVzdWx0MSA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkwodXJsNSxudWxsLGRlZmF1bHQyKS50b0V4dGVybmFsRm9ybSgpOwotCQkgcmVzdWx0MiA9ICJqYXI6ZmlsZTovdG1wLzEwMDEwMCEvZGVmYXVsdDIvIjsKLQkJYXNzZXJ0RXF1YWxzKCI1LjYiLHJlc3VsdDIscmVzdWx0MSk7CQkJCQotCi0JfQotCQotCQotCi19Ci0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2JyYW5kaW5nL0FsbEJyYW5kaW5nVGVzdHMuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2JyYW5kaW5nL0FsbEJyYW5kaW5nVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjYzMGE5Ny4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9icmFuZGluZy9BbGxCcmFuZGluZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmJyYW5kaW5nOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuVXBkYXRlTWFuYWdlclRlc3RDYXNlOwotCi0vKioKLSAqIE1hbmFnZXMgdGhlIEFQSSB0ZXN0cwotICovCi1wdWJsaWMgY2xhc3MgQWxsQnJhbmRpbmdUZXN0cyBleHRlbmRzIFVwZGF0ZU1hbmFnZXJUZXN0Q2FzZSB7Ci0JLyoqCi0JICogQ29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgQWxsQnJhbmRpbmdUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JLyoqCi0JICogTGlzdCBvZiBBUEkgdGVzdHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCQlzdWl0ZS5zZXROYW1lKCJCcmFuZGluZyBUZXN0cyIpOwotCi0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShCdW5kbGVQcm92aWRlclRlc3QuY2xhc3MpKTsJCi0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShQcm9kdWN0VGVzdC5jbGFzcykpOwkKLQotCQlyZXR1cm4gc3VpdGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvYnJhbmRpbmcvQnVuZGxlUHJvdmlkZXJUZXN0LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9icmFuZGluZy9CdW5kbGVQcm92aWRlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI0YjcxNi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9icmFuZGluZy9CdW5kbGVQcm92aWRlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuYnJhbmRpbmc7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb25maWd1cmF0b3IuYnJhbmRpbmcuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuVXBkYXRlTWFuYWdlclRlc3RDYXNlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay4qOwotCi1wdWJsaWMgY2xhc3MgQnVuZGxlUHJvdmlkZXJUZXN0IGV4dGVuZHMgVXBkYXRlTWFuYWdlclRlc3RDYXNlIHsKLQotCXB1YmxpYyBCdW5kbGVQcm92aWRlclRlc3QoU3RyaW5nIHRlc3RjYXNlKXsKLQkJc3VwZXIodGVzdGNhc2UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNYWluKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQotCQlJQnVuZGxlR3JvdXBQcm92aWRlcltdIGJ1bmRsZUdyb3VwUHJvdmlkZXJzID0gUGxhdGZvcm0uZ2V0QnVuZGxlR3JvdXBQcm92aWRlcnMoKTsKLQkJZm9yIChpbnQgaT0wOyBpPGJ1bmRsZUdyb3VwUHJvdmlkZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkJ1bmRsZUdyb3VwUHJvdmlkZXI6IitidW5kbGVHcm91cFByb3ZpZGVyc1tpXS5nZXROYW1lKCkpOwotCQkJSUJ1bmRsZUdyb3VwW10gYnVuZGxlR3JvdXBzID0gYnVuZGxlR3JvdXBQcm92aWRlcnNbaV0uZ2V0QnVuZGxlR3JvdXBzKCk7Ci0JCQlmb3IgKGludCBqPTA7IGo8YnVuZGxlR3JvdXBzLmxlbmd0aDsgaisrKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJCdW5kbGVHcm91cCBuYW1lOiIrYnVuZGxlR3JvdXBzW2pdLmdldE5hbWUoKSArIlxuIiArCi0JCQkJCQkiZGVzY3JpcHRpb246IiArIGJ1bmRsZUdyb3Vwc1tqXS5nZXREZXNjcmlwdGlvbigpICsgIlxuIisKLQkJCQkJCSJpZDoiICsgYnVuZGxlR3JvdXBzW2pdLmdldElkZW50aWZpZXIoKSArICJcbiIgKwotCQkJCQkJInByb3ZpZGVyOiIgKyBidW5kbGVHcm91cHNbal0uZ2V0UHJvdmlkZXJOYW1lKCkgKyAiXG4iICsKLQkJCQkJCSJ2ZXJzaW9uOiIgKyBidW5kbGVHcm91cHNbal0uZ2V0VmVyc2lvbigpICsgIlxuIiArCi0JCQkJCQkibGljZW5zZToiICsgYnVuZGxlR3JvdXBzW2pdLmdldFByb3BlcnR5KElCdW5kbGVHcm91cENvbnN0YW50cy5MSUNFTlNFX0hSRUYpICsgIlxuIiArCi0JCQkJCQkiZmVhdHVyZUltYWdlOiIgKyBidW5kbGVHcm91cHNbal0uZ2V0UHJvcGVydHkoSUJ1bmRsZUdyb3VwQ29uc3RhbnRzLkZFQVRVUkVfSU1BR0UpICsgIlxuIiArCi0JCQkJCQkidGlwcyBhbmQgdHJpY2tzOiIgKyBidW5kbGVHcm91cHNbal0uZ2V0UHJvcGVydHkoSUJ1bmRsZUdyb3VwQ29uc3RhbnRzLlRJUFNfQU5EX1RSSUNLU19IUkVGKSArICJcbiIgKwotCQkJCQkJIndlbGNvbWVQYWdlOiIgKyBidW5kbGVHcm91cHNbal0uZ2V0UHJvcGVydHkoSUJ1bmRsZUdyb3VwQ29uc3RhbnRzLldFTENPTUVfUEFHRSkgKyAiXG4iICsKLQkJCQkJCSJ3ZWxjb21lUGVyc3BlY3RpdmU6IiArIGJ1bmRsZUdyb3Vwc1tqXS5nZXRQcm9wZXJ0eShJQnVuZGxlR3JvdXBDb25zdGFudHMuV0VMQ09NRV9QRVJTUEVDVElWRSkpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiYnVuZGxlczoiKTsKLQkJCQlCdW5kbGVbXSBidW5kbGVzID0gYnVuZGxlR3JvdXBzW2pdLmdldEJ1bmRsZXMoKTsKLQkJCQlmb3IgKGludCBiPTA7IGI8YnVuZGxlcy5sZW5ndGg7IGIrKykKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKGJ1bmRsZXNbYl0uZ2V0U3ltYm9saWNOYW1lKCkpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvYnJhbmRpbmcvUHJvZHVjdFRlc3QuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2JyYW5kaW5nL1Byb2R1Y3RUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0Y2JlMDMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvYnJhbmRpbmcvUHJvZHVjdFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuYnJhbmRpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29uZmlndXJhdG9yLmJyYW5kaW5nLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLio7Ci0KLXB1YmxpYyBjbGFzcyBQcm9kdWN0VGVzdCBleHRlbmRzIFVwZGF0ZU1hbmFnZXJUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgUHJvZHVjdFRlc3QoU3RyaW5nIHRlc3RjYXNlKXsKLQkJc3VwZXIodGVzdGNhc2UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNYWluKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQotCQlJUHJvZHVjdCBwcm9kdWN0ID0gUGxhdGZvcm0uZ2V0UHJvZHVjdCgpOwotCQlpZiAocHJvZHVjdCA9PSBudWxsKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJObyBwcm9kdWN0IGRlZmluZWQiKTsKLQkJZWxzZQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJQcm9kdWN0IGlzOiBcbiIgKwotCQkJCQkibmFtZT0iICsgcHJvZHVjdC5nZXROYW1lKCkgKyAiXG4iICsKLQkJCQkJImFwcGxpY2F0aW9uPSIgKyBwcm9kdWN0LmdldEFwcGxpY2F0aW9uKCkgKyAiXG4iICsKLQkJCQkJImRlc2NyaXB0aW9uPSIgKyBwcm9kdWN0LmdldERlc2NyaXB0aW9uKCkgKyAiXG4iICsKLQkJCQkJImlkPSIrIHByb2R1Y3QuZ2V0SWQoKSArICJcbiIgKwotCQkJCQkiYWJvdXRfdGV4dDoiK3Byb2R1Y3QuZ2V0UHJvcGVydHkoSVByb2R1Y3RDb25zdGFudHMuQUJPVVRfVEVYVCkgKyJcbiIgKwotCQkJCQkiYWJvdXRfaW1hZ2U6Iitwcm9kdWN0LmdldFByb3BlcnR5KElQcm9kdWN0Q29uc3RhbnRzLkFCT1VUX0lNQUdFKSArIlxuIiArCi0JCQkJCSJhcHBfbmFtZToiK3Byb2R1Y3QuZ2V0UHJvcGVydHkoSVByb2R1Y3RDb25zdGFudHMuQVBQX05BTUUpICsiXG4iICsKLQkJCQkJIndpbmRvd19pbWFnZToiK3Byb2R1Y3QuZ2V0UHJvcGVydHkoSVByb2R1Y3RDb25zdGFudHMuV0lORE9XX0lNQUdFKSArIlxuIiArCi0JCQkJCSJ3aW5kb3dfaW1hZ2VzOiIrcHJvZHVjdC5nZXRQcm9wZXJ0eShJUHJvZHVjdENvbnN0YW50cy5XSU5ET1dfSU1BR0VTKSApOwotCQkJCQotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2NvbmZpZ3VyYXRpb25zL0FsbENvbmZpZ3VyYXRpb25zVGVzdHMuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2NvbmZpZ3VyYXRpb25zL0FsbENvbmZpZ3VyYXRpb25zVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM2OTI0Yi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9jb25maWd1cmF0aW9ucy9BbGxDb25maWd1cmF0aW9uc1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvbmZpZ3VyYXRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLlVwZGF0ZU1hbmFnZXJUZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLQotCi1wdWJsaWMgY2xhc3MgQWxsQ29uZmlndXJhdGlvbnNUZXN0cyBleHRlbmRzIFVwZGF0ZU1hbmFnZXJUZXN0Q2FzZSB7Ci1wdWJsaWMgQWxsQ29uZmlndXJhdGlvbnNUZXN0cyhTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlzdWl0ZS5zZXROYW1lKCJSZWd1bGFyIEluc3RhbGwgVGVzdHMiKTsKLQkKLS8vCXN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShUZXN0UmV2ZXJ0LmNsYXNzKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFRlc3RCYWNrd2FyZC5jbGFzcykpOwotCQkKLQlyZXR1cm4gc3VpdGU7Ci19Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9jb25maWd1cmF0aW9ucy9UZXN0QmFja3dhcmQuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2NvbmZpZ3VyYXRpb25zL1Rlc3RCYWNrd2FyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzlkNDkwLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2NvbmZpZ3VyYXRpb25zL1Rlc3RCYWNrd2FyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb25maWd1cmF0aW9uczsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5VcGRhdGVNYW5hZ2VyVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0QmFja3dhcmQgZXh0ZW5kcyBVcGRhdGVNYW5hZ2VyVGVzdENhc2UgewotCQotCS8qKgotCSAqIFRlc3QgdGhlIGdldEZlYXR1cmVzKCkKLQkgKi8KLQlwdWJsaWMgVGVzdEJhY2t3YXJkKFN0cmluZyBhcmcwKSB7Ci0JCXN1cGVyKGFyZzApOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlQmFja3dhcmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQkvLyBjbGVhbnVwCi0JCUxvY2FsU2l0ZSBzaXRlTG9jYWwgPSAoKExvY2FsU2l0ZSlTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKSk7Ci0JCUZpbGUgbG9jYWxGaWxlID0gbmV3IEZpbGUoKHNpdGVMb2NhbCkuZ2V0TG9jYXRpb25VUkwoKS5nZXRGaWxlKCkpOwotCQlJbnRlcm5hbFNpdGVNYW5hZ2VyLmxvY2FsU2l0ZT1udWxsOwkJCi0KLQkJSUxvY2FsU2l0ZSBzaXRlID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCk7Ci0JCUlTaXRlIHJlbW90ZVNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKFNPVVJDRV9IVFRQX1NJVEUsbnVsbCk7Ci0JCUlGZWF0dXJlUmVmZXJlbmNlIGZlYXR1cmVSZWYgPSByZW1vdGVTaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKClbMF07Ci0JCQotCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gb2xkSW5zdGFsbENvbmZpZyA9IHNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKTsKLQkJSUNvbmZpZ3VyZWRTaXRlIG9sZENvbmZpZ1NpdGUgPSBvbGRJbnN0YWxsQ29uZmlnLmdldENvbmZpZ3VyZWRTaXRlcygpWzBdOwotCQkKLQkJKChDb25maWd1cmVkU2l0ZSlvbGRDb25maWdTaXRlKS5zZXRVcGRhdGFibGUodHJ1ZSk7CQotCQlhc3NlcnROb3ROdWxsKCJSZWZlcmVuY2UgaXMgbnVsbCIsZmVhdHVyZVJlZik7Ci0JCXJlbW92ZShmZWF0dXJlUmVmLmdldEZlYXR1cmUobnVsbCksb2xkQ29uZmlnU2l0ZSk7CQotCQlvbGRDb25maWdTaXRlLmluc3RhbGwoZmVhdHVyZVJlZi5nZXRGZWF0dXJlKG51bGwpLG51bGwsbnVsbCk7Ci0JCXNpdGUuc2F2ZSgpOwotCQotCQkKLQkJLy8gQWN0aXZpdHkgLT4gSW5zdGFsbENvbmZpZwotCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY3VycmVudCA9IHNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKTsKLS8vCQlJQWN0aXZpdHkgYWN0aXZpdHkgPSBjdXJyZW50LmdldEFjdGl2aXRpZXMoKVswXTsJCi0vLwkJYXNzZXJ0VHJ1ZShhY3Rpdml0eS5nZXRJbnN0YWxsQ29uZmlndXJhdGlvbigpLmVxdWFscyhjdXJyZW50KSk7Ci0JCQotCQkvLyBDb25maWdTaXRlLT5JbnN0YWxsQ29uZmlnCi0JCUlDb25maWd1cmVkU2l0ZSBuZXdDb25maWdTaXRlID0gY3VycmVudC5nZXRDb25maWd1cmVkU2l0ZXMoKVswXTsKLQkJYXNzZXJ0VHJ1ZShuZXdDb25maWdTaXRlLmdldEluc3RhbGxDb25maWd1cmF0aW9uKCkuZXF1YWxzKGN1cnJlbnQpKTsKLQkJCi0JCS8vIGNsZWFudXAKLQkJbG9jYWxGaWxlID0gbmV3IEZpbGUoKChMb2NhbFNpdGUpU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkpLmdldExvY2F0aW9uVVJMKCkuZ2V0RmlsZSgpKTsKLQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGxvY2FsRmlsZSk7CQkJCi0JfQotCi19Ci0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2NvbmZpZ3VyYXRpb25zL1Rlc3RSZXZlcnQuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2NvbmZpZ3VyYXRpb25zL1Rlc3RSZXZlcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U2NWMyNS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9jb25maWd1cmF0aW9ucy9UZXN0UmV2ZXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb25maWd1cmF0aW9uczsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5tb2RlbC5Db25maWd1cmVkU2l0ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5VcGRhdGVNYW5hZ2VyVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0UmV2ZXJ0IGV4dGVuZHMgVXBkYXRlTWFuYWdlclRlc3RDYXNlIHsKLQkKLQkvKioKLQkgKiBUZXN0IHRoZSBnZXRGZWF0dXJlcygpCi0JICovCi0JcHVibGljIFRlc3RSZXZlcnQoU3RyaW5nIGFyZzApIHsKLQkJc3VwZXIoYXJnMCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTaW1wbGVSZXZlcnRJbnN0YWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJLy8gY2xlYW51cAotCQlMb2NhbFNpdGUgc2l0ZUxvY2FsID0gKChMb2NhbFNpdGUpU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkpOwotCQlGaWxlIGxvY2FsRmlsZSA9IG5ldyBGaWxlKHNpdGVMb2NhbC5nZXRMb2NhdGlvblVSTCgpLmdldEZpbGUoKSk7Ci0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShsb2NhbEZpbGUpOwkJCi0JCUludGVybmFsU2l0ZU1hbmFnZXIubG9jYWxTaXRlPW51bGw7CQkKLQotCQlJTG9jYWxTaXRlIHNpdGUgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKTsKLQkJSVNpdGUgcmVtb3RlU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUoU09VUkNFX0hUVFBfU0lURSxudWxsKTsKLQkJSUZlYXR1cmVSZWZlcmVuY2UgZmVhdHVyZVJlZiA9IHJlbW90ZVNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKVswXTsKLQkJSUZlYXR1cmVSZWZlcmVuY2UgZmVhdHVyZVJlZjIgPSByZW1vdGVTaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKClbMV07Ci0JCUlGZWF0dXJlIGZlYXR1cmUgPSBmZWF0dXJlUmVmLmdldEZlYXR1cmUobnVsbCk7Ci0JCQotCQkvLyBvbGQgY29uZmlnLCBubyBmZWF0dXJlcyBpbnN0YWxsZWQKLQkJSUluc3RhbGxDb25maWd1cmF0aW9uIG9sZCA9IHNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKTsKLQkJQ29uZmlndXJhdGlvblBvbGljeSBleGNsdWRlcG9saWN5ID0gbmV3IENvbmZpZ3VyYXRpb25Qb2xpY3koKTsKLQkJZXhjbHVkZXBvbGljeS5zZXRQb2xpY3koSVBsYXRmb3JtQ29uZmlndXJhdGlvbi5JU2l0ZVBvbGljeS5VU0VSX0VYQ0xVREUpOwotCQlJQ29uZmlndXJlZFNpdGUgb2xkQ29uZmlnU2l0ZSA9IG9sZC5nZXRDb25maWd1cmVkU2l0ZXMoKVswXTsKLQkJZXhjbHVkZXBvbGljeS5zZXRDb25maWd1cmVkU2l0ZU1vZGVsKChDb25maWd1cmVkU2l0ZU1vZGVsKW9sZENvbmZpZ1NpdGUpOwkJCi0JCSgoQ29uZmlndXJlZFNpdGVNb2RlbClvbGRDb25maWdTaXRlKS5zZXRDb25maWd1cmF0aW9uUG9saWN5TW9kZWwoZXhjbHVkZXBvbGljeSk7Ci0JCQotCQkvLyBpbnN0YWxsIG9uZSBmZWF0dXJlCi0JCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBuZXdDb25maWcgPSBzaXRlLmNsb25lQ3VycmVudENvbmZpZ3VyYXRpb24oKTsKLQkJSUNvbmZpZ3VyZWRTaXRlIGNvbmZpZ1NpdGUgPSBuZXdDb25maWcuZ2V0Q29uZmlndXJlZFNpdGVzKClbMF07Ci0JCWlmICghY29uZmlnU2l0ZS5nZXRTaXRlKCkuZXF1YWxzKG9sZENvbmZpZ1NpdGUuZ2V0U2l0ZSgpKSkgZmFpbCgiQ29uZmlnIHNpdGVzIGFyZSBub3QgZXF1YWxzIik7Ci0JCXNpdGUuYWRkQ29uZmlndXJhdGlvbihuZXdDb25maWcpOwkKLQkJCi0JCSgoQ29uZmlndXJlZFNpdGUpY29uZmlnU2l0ZSkuc2V0VXBkYXRhYmxlKHRydWUpOwkJCQotCQlJRmVhdHVyZVJlZmVyZW5jZSBpbnN0YWxsZWRGZWF0dXJlID0gY29uZmlnU2l0ZS5pbnN0YWxsKGZlYXR1cmUsbnVsbCxudWxsKTsKLQkJc2l0ZS5zYXZlKCk7Ci0KLQkJLy8gdW5jb25maWd1cmUgaXQKLQkJY29uZmlnU2l0ZS51bmNvbmZpZ3VyZShpbnN0YWxsZWRGZWF0dXJlLmdldEZlYXR1cmUobnVsbCkpOwotCi0JCS8vIGluc3RhbGwgYW5vdGhlciBmZWF0dXJlCi0JCUlGZWF0dXJlIGZlYXR1cmUyID0gZmVhdHVyZVJlZjIuZ2V0RmVhdHVyZShudWxsKTsKLQkJSUluc3RhbGxDb25maWd1cmF0aW9uIG5ld0NvbmZpZzIgPSBzaXRlLmNsb25lQ3VycmVudENvbmZpZ3VyYXRpb24oKTsKLQkJSUNvbmZpZ3VyZWRTaXRlIGFub3RoZXJDb25maWdTaXRlID0gbmV3Q29uZmlnMi5nZXRDb25maWd1cmVkU2l0ZXMoKVswXTsKLQkJaWYgKCFhbm90aGVyQ29uZmlnU2l0ZS5nZXRTaXRlKCkuZXF1YWxzKG9sZENvbmZpZ1NpdGUuZ2V0U2l0ZSgpKSkgZmFpbCgiQ29uZmlnIHNpdGVzIGFyZSBub3QgZXF1YWxzIik7CQkKLQkJc2l0ZS5hZGRDb25maWd1cmF0aW9uKG5ld0NvbmZpZzIpOwkJCi0JCWFub3RoZXJDb25maWdTaXRlLmluc3RhbGwoZmVhdHVyZTIsbnVsbCxudWxsKTsKLQkJc2l0ZS5zYXZlKCk7Ci0KLQkJLy8gcmV2ZXJ0IHRvIG9sZCBzdGF0ZSB3aGVyZSBubyBmZWF0dXJlIHdoZXJlIGNvbmZpZ3VyZWQKLQkJc2l0ZS5yZXZlcnRUbyhvbGQsbnVsbCxudWxsKTsKLQkJc2l0ZS5zYXZlKCk7Ci0JCQotCQkvLyBjaGVjawotCQlTdHJpbmcgdGltZSA9ICIiK3NpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKS5nZXRDcmVhdGlvbkRhdGUoKS5nZXRUaW1lKCk7Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKCgoTG9jYWxTaXRlKVNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpKS5nZXRMb2NhdGlvblVSTCgpLmdldEZpbGUoKSk7Ci0JCWFzc2VydFRydWUoIm5ldyBjb25maWd1cmF0aW9uIGRvZXMgbm90IGV4aXN0IiwgZmlsZS5leGlzdHMoKSk7Ci0JCQotCQkKLQkJLy9maW5kIGNvbmZpZ3VyZWQgc2l0ZQotCQlJQ29uZmlndXJlZFNpdGUgbmV3Q29uZmlnU2l0ZSA9IG51bGw7Ci0JCUlDb25maWd1cmVkU2l0ZVtdIHNpdGVzID0gc2l0ZS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpLmdldENvbmZpZ3VyZWRTaXRlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpdGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoc2l0ZXNbaV0uZ2V0U2l0ZSgpLmVxdWFscyhvbGRDb25maWdTaXRlLmdldFNpdGUoKSkpewotCQkJCSBuZXdDb25maWdTaXRlID0gc2l0ZXNbaV07Ci0JCQkJIGJyZWFrOwotCQkJfQotCQl9Ci0JCWlmIChuZXdDb25maWdTaXRlPT1udWxsKSBmYWlsKCJDYW5ub3QgZmluZCBjb25maWd1cmF0aW9uIHNpdGUiKTsKLQotCQlpbnQgb2xkTnVtYmVyID0gb2xkQ29uZmlnU2l0ZS5nZXRDb25maWd1cmVkRmVhdHVyZXMoKS5sZW5ndGg7Ci0JCWludCBuZXdOdW1iZXIgPSBuZXdDb25maWdTaXRlLmdldENvbmZpZ3VyZWRGZWF0dXJlcygpLmxlbmd0aDsKLQkJCi0JCS8vCi0JCUlGZWF0dXJlUmVmZXJlbmNlW10gY29uZmlnRmVhdHVyZXMgPSBuZXdDb25maWdTaXRlLmdldENvbmZpZ3VyZWRGZWF0dXJlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbmZpZ0ZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oY29uZmlnRmVhdHVyZXNbaV0pOwotCQl9CQkKLQkJYXNzZXJ0VHJ1ZSgiV3JvbmcgbnVtYmVyIG9mIGNvbmZpZ3VyZWQgZmVhdHVyZXMgb2xkOiIrb2xkTnVtYmVyKyIgbmV3OiIrbmV3TnVtYmVyLG9sZE51bWJlcj09bmV3TnVtYmVyKTsKLQkJCi0JCS8vIHRlc3Qgb25seSAyIGluc3RhbGwgY29uZmlnIGluIGxvY2FsIHNpdGUKLQkJaW50IG5ld051bWJlclVuY29uZmlndXJlZEZlYXR1cmVzID0gKChDb25maWd1cmVkU2l0ZSluZXdDb25maWdTaXRlKS5nZXRDb25maWd1cmF0aW9uUG9saWN5KCkuZ2V0VW5jb25maWd1cmVkRmVhdHVyZXMoKS5sZW5ndGg7Ci0JCWludCBvbGROdW1iZXJVbmNvbmZpZ3VyZWRGZWF0dXJlcyA9ICgoQ29uZmlndXJlZFNpdGUpb2xkQ29uZmlnU2l0ZSkuZ2V0Q29uZmlndXJhdGlvblBvbGljeSgpLmdldFVuY29uZmlndXJlZEZlYXR1cmVzKCkubGVuZ3RoOwkJCi0JCWFzc2VydEVxdWFscygid3JvbmcgbnVtYmVyIG9mIHVuY29uZmlndXJlZCBmZWF0dXJlcyIsb2xkTnVtYmVyVW5jb25maWd1cmVkRmVhdHVyZXMrMixuZXdOdW1iZXJVbmNvbmZpZ3VyZWRGZWF0dXJlcyk7Ci0JCQotCQkvLyBjbGVhbnVwCi0JCWxvY2FsRmlsZSA9IG5ldyBGaWxlKHNpdGVMb2NhbC5nZXRMb2NhdGlvblVSTCgpLmdldEZpbGUoKSk7Ci0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShsb2NhbEZpbGUpOwkJCi0JCWxvY2FsRmlsZSA9IG5ldyBGaWxlKCgoTG9jYWxTaXRlKVNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpKS5nZXRMb2NhdGlvblVSTCgpLmdldEZpbGUoKSk7Ci0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShsb2NhbEZpbGUpOwkJCQkKLQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGZpbGUpOwkKLQkJdGltZSA9ICIiK25ld0NvbmZpZy5nZXRDcmVhdGlvbkRhdGUoKS5nZXRUaW1lKCk7Ci0JCWZpbGUgPSBuZXcgRmlsZShuZXcgVVJMKCgoTG9jYWxTaXRlKVNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpKS5nZXRMb2NhdGlvblVSTCgpLCJEZWZhdWx0Q29uZmlnIit0aW1lKyIueG1sIikuZ2V0RmlsZSgpKTsJCi0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShmaWxlKTsJCi0JCXRpbWUgPSAiIituZXdDb25maWcyLmdldENyZWF0aW9uRGF0ZSgpLmdldFRpbWUoKTsKLQkJZmlsZSA9IG5ldyBGaWxlKG5ldyBVUkwoKChMb2NhbFNpdGUpU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkpLmdldExvY2F0aW9uVVJMKCksIkRlZmF1bHRDb25maWciK3RpbWUrIi54bWwiKS5nZXRGaWxlKCkpOwkKLQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGZpbGUpOwkKLQl9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvY29yZS9ib290L0FsbFBsYXRmb3JtQ29uZmlndXJhdGlvblRlc3RzLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9jb3JlL2Jvb3QvQWxsUGxhdGZvcm1Db25maWd1cmF0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMwOTBhMi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9jb3JlL2Jvb3QvQWxsUGxhdGZvcm1Db25maWd1cmF0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS5ib290OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotcHVibGljIGNsYXNzIEFsbFBsYXRmb3JtQ29uZmlndXJhdGlvblRlc3RzCi0JZXh0ZW5kcyBQbGF0Zm9ybUNvbmZpZ3VyYXRpb25UZXN0Q2FzZSB7Ci0JLyoqCi0JICogQ29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgQWxsUGxhdGZvcm1Db25maWd1cmF0aW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCS8qKgotCSAqIExpc3Qgb2YgQVBJIHRlc3RzCi0JICovCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQkJc3VpdGUuc2V0TmFtZSgiUGxhdGZvcm1Db25maWd1cmF0aW9uIFRlc3RzIik7Ci0KLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFRlc3RQbGF0Q2ZnQVBJLmNsYXNzKSk7Ci0KLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotfQotCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9jb3JlL2Jvb3QvUGxhdGZvcm1Db25maWd1cmF0aW9uVGVzdENhc2UuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2NvcmUvYm9vdC9QbGF0Zm9ybUNvbmZpZ3VyYXRpb25UZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTEyM2YxLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2NvcmUvYm9vdC9QbGF0Zm9ybUNvbmZpZ3VyYXRpb25UZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlLmJvb3Q7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBQbGF0Zm9ybUNvbmZpZ3VyYXRpb25UZXN0Q2FzZSBleHRlbmRzIFRlc3RDYXNlIHsKLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIHRlbXBEaXI7Ci0JCi0JcHVibGljIFBsYXRmb3JtQ29uZmlndXJhdGlvblRlc3RDYXNlKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCQl0cnkgewotCQkJaW5pdCgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbChlLnRvU3RyaW5nKCkpOwotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0KCkgewotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQkJLy8gZ2V0IG5ldyB0ZW1wIGRpcmVjdG9yeSBmb3IgdGVzdGNhc2UKLQkJU3RyaW5nIHJvb3QgPSBnZXRUZW1wRGlyZWN0b3J5TmFtZSgpOwotCQlzZXR1cERpcmVjdG9yeShyb290KTsKLQkJdGVtcERpciA9IHJvb3Q7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCQkvLyBjbGVhbnVwIHRlc3RjYXNlIHRlbXAgZGlyZWN0b3J5Ci0JCWlmICh0ZW1wRGlyICE9IG51bGwpCi0JCQljbGVhbnVwRGlyZWN0b3J5KHRlbXBEaXIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRlbXBEaXJlY3RvcnlOYW1lKCkgewotCQlTdHJpbmcgdG1wID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmlvLnRtcGRpciIpOwotCQlpZiAoIXRtcC5lbmRzV2l0aChGaWxlLnNlcGFyYXRvcikpCi0JCQl0bXAgKz0gRmlsZS5zZXBhcmF0b3I7Ci0JCXJldHVybiB0bXArImVjbGlwc2UiK0ZpbGUuc2VwYXJhdG9yKyhuZXcgRGF0ZSgpLmdldFRpbWUoKStGaWxlLnNlcGFyYXRvcik7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldHVwRGlyZWN0b3J5KFN0cmluZyBuYW1lKSB7Ci0JCUZpbGUgZGlyID0gbmV3IEZpbGUobmFtZSk7Ci0JCWRpci5ta2RpcnMoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgY2xlYW51cERpcmVjdG9yeShTdHJpbmcgbmFtZSkgewotCQlGaWxlIGRpciA9IG5ldyBGaWxlKG5hbWUpOwotCQlkZWxldGVEaXJlY3RvcnkoZGlyKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGRlbGV0ZURpcmVjdG9yeShGaWxlIGRpcikgewotCQlGaWxlW10gbGlzdCA9IGRpci5saXN0RmlsZXMoKTsKLQkJaWYgKGxpc3QgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCQotCQlmb3IgKGludCBpPTA7IGk8bGlzdC5sZW5ndGg7IGkrKykgewotCQkJaWYgKGxpc3RbaV0uaXNEaXJlY3RvcnkoKSkgCi0JCQkJZGVsZXRlRGlyZWN0b3J5KGxpc3RbaV0pOwotCQkJaWYgKCFsaXN0W2ldLmRlbGV0ZSgpKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVW5hYmxlIHRvIGRlbGV0ZSAiK2xpc3RbaV0udG9TdHJpbmcoKSk7Ci0JCX0KLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2NvcmUvYm9vdC9UZXN0UGxhdENmZ0FQSS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvY29yZS9ib290L1Rlc3RQbGF0Q2ZnQVBJLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1NTNmMjkuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvY29yZS9ib290L1Rlc3RQbGF0Q2ZnQVBJLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlLmJvb3Q7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yLklQbGF0Zm9ybUNvbmZpZ3VyYXRpb24uKjsKLQotcHVibGljIGNsYXNzIFRlc3RQbGF0Q2ZnQVBJIGV4dGVuZHMgUGxhdGZvcm1Db25maWd1cmF0aW9uVGVzdENhc2UgewotCQkJCi0JcHVibGljIFRlc3RQbGF0Q2ZnQVBJKFN0cmluZyBhcmcwKSB7Ci0JCXN1cGVyKGFyZzApOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QmFzaWMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCi0JCS8vIGdldCBuZXcgY29uZmlnIG9iamVjdAotCQlJUGxhdGZvcm1Db25maWd1cmF0aW9uIGNmaWcgPSBudWxsOwotCQl0cnkgewotCQkJY2ZpZyA9IENvbmZpZ3VyYXRvclV0aWxzLmdldFBsYXRmb3JtQ29uZmlndXJhdGlvbihudWxsKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJQXNzZXJ0LmZhaWwoIjAuMC4wICIrZS50b1N0cmluZygpKTsKLQkJfQotCQlJU2l0ZUVudHJ5W10gZGZsdCA9IGNmaWcuZ2V0Q29uZmlndXJlZFNpdGVzKCk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIjAuMC4xIixkZmx0Lmxlbmd0aCwwKTsKLQkJCi0JCS8vIHBvbGljeSB0ZXN0cwotCQlJU2l0ZVBvbGljeSBwMSA9IGNmaWcuY3JlYXRlU2l0ZVBvbGljeShJU2l0ZVBvbGljeS5VU0VSX0lOQ0xVREUsIG51bGwpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCIxLjAuMCIscDEuZ2V0VHlwZSgpLElTaXRlUG9saWN5LlVTRVJfSU5DTFVERSk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIjEuMC4xIixwMS5nZXRMaXN0KCkubGVuZ3RoLDApOwotCQlwMS5zZXRMaXN0KG5ldyBTdHJpbmdbXSB7ImZpcnN0In0pOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCIxLjAuMiIscDEuZ2V0TGlzdCgpLmxlbmd0aCwxKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiMS4wLjMiLHAxLmdldExpc3QoKVswXSwiZmlyc3QiKTsKLQkJCi0JCUlTaXRlUG9saWN5IHAyID0gY2ZpZy5jcmVhdGVTaXRlUG9saWN5KElTaXRlUG9saWN5LlVTRVJfRVhDTFVERSwgbmV3IFN0cmluZ1swXSk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIjEuMS4wIixwMi5nZXRUeXBlKCksSVNpdGVQb2xpY3kuVVNFUl9FWENMVURFKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiMS4xLjEiLHAyLmdldExpc3QoKS5sZW5ndGgsMCk7Ci0JCXAyLnNldExpc3QobmV3IFN0cmluZ1tdIHsiZmlyc3QiLCAic2Vjb25kIn0pOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCIxLjEuMiIscDIuZ2V0TGlzdCgpLmxlbmd0aCwyKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiMS4xLjMiLHAyLmdldExpc3QoKVsxXSwic2Vjb25kIik7Ci0JCQotCQkvLyBjcmVhdGUgc29tZSB1cmxzCi0JCVVSTCB1MSA9IG51bGw7Ci0KLQkJVVJMIHU0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXUxID0gbmV3IFVSTCgiZmlsZTovZDovdGVtcF90ZXN0X2R1bW15Iik7Ci0JCQluZXcgVVJMKCJodHRwOi8vc29tZS5zZXJ2ZXIvdGVtcC8iKTsKLQkJCXU0ID0gbmV3IFVSTCgiaHR0cDovL2JhZC51cmwiKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCUFzc2VydC5mYWlsKCIyLjAuMCB1bmFibGUgdG8gY3JlYXRlIFVSTCAiK2UpOwotCQl9Ci0JCQkJCi0JCS8vIHNpdGUgY3JlYXRpb24gdGVzdHMKLQkJSVNpdGVFbnRyeSBzMSA9IGNmaWcuY3JlYXRlU2l0ZUVudHJ5KHUxLHAyKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiMy4wLjAiLHMxLmdldFVSTCgpLHUxKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiMy4wLjEiLHMxLmdldFNpdGVQb2xpY3koKSxwMik7Ci0JCXMxLnNldFNpdGVQb2xpY3kocDEpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCIzLjAuMiIsczEuZ2V0U2l0ZVBvbGljeSgpLHAxKTsKLQkJCi0vLwkJSVNpdGVFbnRyeSBzMiA9IGNmaWcuY3JlYXRlU2l0ZUVudHJ5KHUyLHAxKTsKLS8vCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCIzLjEuMCIsczIuZ2V0VVJMKCksdTIpOwotLy8JCUFzc2VydC5hc3NlcnRFcXVhbHMoIjMuMS4xIixzMi5nZXRTaXRlUG9saWN5KCkscDEpOwotLy8JCXMyLnNldFNpdGVQb2xpY3kocDIpOwotLy8JCUFzc2VydC5hc3NlcnRFcXVhbHMoIjMuMS4yIixzMi5nZXRTaXRlUG9saWN5KCkscDIpOwotCQkKLQkJLy8gY29uZmlndXJlIHNpdGUgdGVzdHMKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiMy4zLjAiLGNmaWcuZ2V0Q29uZmlndXJlZFNpdGVzKCkubGVuZ3RoLDApOwotCQljZmlnLmNvbmZpZ3VyZVNpdGUoczEpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCIzLjMuMSIsY2ZpZy5nZXRDb25maWd1cmVkU2l0ZXMoKS5sZW5ndGgsMSk7Ci0vLwkJY2ZpZy5jb25maWd1cmVTaXRlKHMyKTsKLS8vCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCIzLjMuMiIsY2ZpZy5nZXRDb25maWd1cmVkU2l0ZXMoKS5sZW5ndGgsMik7Ci0vLwkJCi0JCS8vIGxvb2t1cCBzaXRlIHRlc3RzCi0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIjMuNC4wIixjZmlnLmZpbmRDb25maWd1cmVkU2l0ZSh1MSksczEpOwotLy8JCUFzc2VydC5hc3NlcnRFcXVhbHMoIjMuNC4xIixjZmlnLmZpbmRDb25maWd1cmVkU2l0ZSh1MiksczIpOwotCQlBc3NlcnQuYXNzZXJ0TnVsbCgiMy40LjMiLGNmaWcuZmluZENvbmZpZ3VyZWRTaXRlKHU0KSk7Ci0JCQotCQkvLyB1bmNvbmZpZ3VyZSBzaXRlIHRlc3RzCi0JCWNmaWcudW5jb25maWd1cmVTaXRlKHMxKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiMy41LjAiLGNmaWcuZ2V0Q29uZmlndXJlZFNpdGVzKCkubGVuZ3RoLDApOwotCQlBc3NlcnQuYXNzZXJ0TnVsbCgiMy41LjEiLGNmaWcuZmluZENvbmZpZ3VyZWRTaXRlKHUxKSk7CQkKLS8vCQljZmlnLnVuY29uZmlndXJlU2l0ZShzMik7Ci0vLwkJQXNzZXJ0LmFzc2VydEVxdWFscygiMy41LjIiLGNmaWcuZ2V0Q29uZmlndXJlZFNpdGVzKCkubGVuZ3RoLDApOwotLy8JCUFzc2VydC5hc3NlcnROdWxsKCIzLjUuMyIsY2ZpZy5maW5kQ29uZmlndXJlZFNpdGUodTIpKTsJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTYXZlUmVzdG9yZSgpIHRocm93cyBFeGNlcHRpb24gewotCQkJCQotCQlBc3NlcnQuYXNzZXJ0Tm90TnVsbCgiMC4wIFVuYWJsZSB0byBvYnRhaW4gdGVtcCBkaXJlY3RvcnkiLHRlbXBEaXIpOwotCQkKLQkJLy8gZ2V0IG5ldyBjb25maWcgb2JqZWN0Ci0JCUlQbGF0Zm9ybUNvbmZpZ3VyYXRpb24gY2ZpZyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQljZmlnID0gQ29uZmlndXJhdG9yVXRpbHMuZ2V0UGxhdGZvcm1Db25maWd1cmF0aW9uKG51bGwpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlBc3NlcnQuZmFpbCgiMC4wLjAgIitlLnRvU3RyaW5nKCkpOwotCQl9Ci0JCUlTaXRlRW50cnlbXSBzaXRlcyA9IGNmaWcuZ2V0Q29uZmlndXJlZFNpdGVzKCk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIjAuMC4xIixzaXRlcy5sZW5ndGgsMCk7Ci0JCQkJCi0JCS8vIGNyZWF0ZSBwb2xpY2llcwotCQlJU2l0ZVBvbGljeSBwMSA9IGNmaWcuY3JlYXRlU2l0ZVBvbGljeShJU2l0ZVBvbGljeS5VU0VSX0lOQ0xVREUsIG51bGwpOwotCQlJU2l0ZVBvbGljeSBwMiA9IGNmaWcuY3JlYXRlU2l0ZVBvbGljeShJU2l0ZVBvbGljeS5VU0VSX0VYQ0xVREUsIG5ldyBTdHJpbmdbMF0pOwkJCi0JCUlTaXRlUG9saWN5IHAzID0gY2ZpZy5jcmVhdGVTaXRlUG9saWN5KElTaXRlUG9saWN5LlVTRVJfSU5DTFVERSwgbmV3IFN0cmluZ1tdIHsiZmlyc3QifSk7Ci0JCUlTaXRlUG9saWN5IHA0ID0gY2ZpZy5jcmVhdGVTaXRlUG9saWN5KElTaXRlUG9saWN5LlVTRVJfRVhDTFVERSwgbmV3IFN0cmluZ1tdIHsiZmlyc3QiLCAic2Vjb25kIn0pOwotCQkJCQkJCi0JCS8vIGNyZWF0ZSBzb21lIHVybHMKLQkJVVJMIHUxID0gbnVsbDsKLQkJVVJMIHUyID0gbnVsbDsKLQkJVVJMIHUzID0gbnVsbDsKLQkJVVJMIHU0ID0gbnVsbDsKLQotCQl0cnkgewotCQkJdTEgPSBuZXcgVVJMKCJmaWxlOmQ6L3RlbXAvIik7Ci0JCQl1MiA9IG5ldyBVUkwoImZpbGU6L2xvY2FsaG9zdC90ZW1wLyIpOwotCQkJdTMgPSBuZXcgVVJMKCJodHRwOi8vc29tZS5zZXJ2ZXIvdGVtcC8iKTsKLQkJCXU0ID0gbmV3IFVSTCgiaHR0cDovL2Fub3RoZXIuc2VydmVyL3RlbXAvIik7Ci0JCQluZXcgVVJMKCJodHRwOi8vb25lLm1vcmUuc2VydmVyL3RlbXAvIik7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQlBc3NlcnQuZmFpbCgiMS4wIHVuYWJsZSB0byBjcmVhdGUgVVJMICIrZSk7Ci0JCX0KLQkJCi0JCS8vIGNyZWF0ZSBhbmQgY29uZmlndXJlIHNpdGVzCi0JCUlTaXRlRW50cnkgczEgPSBjZmlnLmNyZWF0ZVNpdGVFbnRyeSh1MSxwMSk7Ci0JCWNmaWcuY29uZmlndXJlU2l0ZShzMSk7Ci0JCUlTaXRlRW50cnkgczIgPSBjZmlnLmNyZWF0ZVNpdGVFbnRyeSh1MixwMik7Ci0JCWNmaWcuY29uZmlndXJlU2l0ZShzMik7Ci0JCUlTaXRlRW50cnkgczMgPSBjZmlnLmNyZWF0ZVNpdGVFbnRyeSh1MyxwMyk7Ci0JCWNmaWcuY29uZmlndXJlU2l0ZShzMyk7Ci0JCUlTaXRlRW50cnkgczQgPSBjZmlnLmNyZWF0ZVNpdGVFbnRyeSh1NCxwNCk7Ci0JCWNmaWcuY29uZmlndXJlU2l0ZShzNCk7Ci0JCXNpdGVzID0gY2ZpZy5nZXRDb25maWd1cmVkU2l0ZXMoKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiMS4xIixzaXRlcy5sZW5ndGgsNCk7Ci0JCQotCQkvLyBkbyBzYXZlCi0JCXRyeSB7Ci0JCQljZmlnLnNhdmUoKTsKLQkJCUFzc2VydC5mYWlsKCIyLjAgd2FzIGV4cGVjdGluZyBJT0V4Y2VwdGlvbiIpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJCi0JCVVSTCBjZmlnVVJMID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWNmaWdVUkwgPSBuZXcgVVJMKCJmaWxlOiIrdGVtcERpcisgInBsYXRmb3JtLnhtbCIpOwotCQl9IGNhdGNoKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQlBc3NlcnQuZmFpbCgiMi4xIHVuYWJsZSB0byBjcmVhdGUgVVJMICIrZSk7Ci0JCX0KLQkJCi0JCXRyeSB7Ci0JCQljZmlnLnNhdmUoY2ZpZ1VSTCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCUFzc2VydC5mYWlsKCIyLjIgIitlKTsKLQkJfQotCQkKLQkJLy8gcmVsb2FkIGNvbmZpZ3VyYXRpb24JCi0JCXRyeSB7Ci0JCQlDb25maWd1cmF0b3JVdGlscy5nZXRQbGF0Zm9ybUNvbmZpZ3VyYXRpb24oY2ZpZ1VSTCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCUFzc2VydC5mYWlsKCIyLjMgIitlLnRvU3RyaW5nKCkpOwotCQl9Ci0JCUlTaXRlRW50cnlbXSBuZXdTaXRlcyA9IGNmaWcuZ2V0Q29uZmlndXJlZFNpdGVzKCk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIjIuNCIsbmV3U2l0ZXMubGVuZ3RoLDQpOwotCQkKLQkJLy8gY2hlY2sgd2hhdCB3ZSd2ZSBnb3QKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiMy4wLjEiLHNpdGVzWzBdLmdldFVSTCgpLG5ld1NpdGVzWzBdLmdldFVSTCgpKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiMy4wLjIiLHNpdGVzWzBdLmdldFNpdGVQb2xpY3koKS5nZXRUeXBlKCksbmV3U2l0ZXNbMF0uZ2V0U2l0ZVBvbGljeSgpLmdldFR5cGUoKSk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIjMuMC4zIixzaXRlc1swXS5nZXRTaXRlUG9saWN5KCkuZ2V0TGlzdCgpLG5ld1NpdGVzWzBdLmdldFNpdGVQb2xpY3koKS5nZXRMaXN0KCkpOwotCQkKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiMy4xLjEiLHNpdGVzWzFdLmdldFVSTCgpLG5ld1NpdGVzWzFdLmdldFVSTCgpKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiMy4xLjIiLHNpdGVzWzFdLmdldFNpdGVQb2xpY3koKS5nZXRUeXBlKCksbmV3U2l0ZXNbMV0uZ2V0U2l0ZVBvbGljeSgpLmdldFR5cGUoKSk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIjMuMS4zIixzaXRlc1sxXS5nZXRTaXRlUG9saWN5KCkuZ2V0TGlzdCgpLG5ld1NpdGVzWzFdLmdldFNpdGVQb2xpY3koKS5nZXRMaXN0KCkpOwotCQkKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiMy4yLjEiLHNpdGVzWzJdLmdldFVSTCgpLG5ld1NpdGVzWzJdLmdldFVSTCgpKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiMy4yLjIiLHNpdGVzWzJdLmdldFNpdGVQb2xpY3koKS5nZXRUeXBlKCksbmV3U2l0ZXNbMl0uZ2V0U2l0ZVBvbGljeSgpLmdldFR5cGUoKSk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIjMuMi4zIixzaXRlc1syXS5nZXRTaXRlUG9saWN5KCkuZ2V0TGlzdCgpLG5ld1NpdGVzWzJdLmdldFNpdGVQb2xpY3koKS5nZXRMaXN0KCkpOwotCQkKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiMy4zLjEiLHNpdGVzWzNdLmdldFVSTCgpLG5ld1NpdGVzWzNdLmdldFVSTCgpKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiMy4zLjIiLHNpdGVzWzNdLmdldFNpdGVQb2xpY3koKS5nZXRUeXBlKCksbmV3U2l0ZXNbM10uZ2V0U2l0ZVBvbGljeSgpLmdldFR5cGUoKSk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIjMuMy4zIixzaXRlc1szXS5nZXRTaXRlUG9saWN5KCkuZ2V0TGlzdCgpLG5ld1NpdGVzWzNdLmdldFNpdGVQb2xpY3koKS5nZXRMaXN0KCkpOwotCQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEN1cnJlbnRDb25maWd1cmF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQkJCi0JCUFzc2VydC5hc3NlcnROb3ROdWxsKCIwLjAgVW5hYmxlIHRvIG9idGFpbiB0ZW1wIGRpcmVjdG9yeSIsdGVtcERpcik7Ci0JCQotCQkvLyBnZXQgbmV3IGNvbmZpZyBvYmplY3QKLQkJSVBsYXRmb3JtQ29uZmlndXJhdGlvbiBjZmlnID0gbnVsbDsKLQkJY2ZpZyA9IENvbmZpZ3VyYXRvclV0aWxzLmdldEN1cnJlbnRQbGF0Zm9ybUNvbmZpZ3VyYXRpb24oKTsKLQkJY2ZpZy5nZXRQbHVnaW5QYXRoKCk7Ci0JCWNmaWcuc2F2ZSgpOwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvY29yZS9ib290L1Rlc3RQbGF0Q2ZnRGVmYXVsdC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvY29yZS9ib290L1Rlc3RQbGF0Q2ZnRGVmYXVsdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2MzZjg1Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2NvcmUvYm9vdC9UZXN0UGxhdENmZ0RlZmF1bHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS5ib290OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci4qOwotCi0KLXB1YmxpYyBjbGFzcyBUZXN0UGxhdENmZ0RlZmF1bHQKLQlleHRlbmRzIFBsYXRmb3JtQ29uZmlndXJhdGlvblRlc3RDYXNlIHsKLQkJCi0JcHVibGljIFRlc3RQbGF0Q2ZnRGVmYXVsdChTdHJpbmcgYXJnMCkgewotCQlzdXBlcihhcmcwKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEluaXRpYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSVBsYXRmb3JtQ29uZmlndXJhdGlvbiBjZmlnID0gbnVsbDsKLQkJY2ZpZyA9IENvbmZpZ3VyYXRvclV0aWxzLmdldEN1cnJlbnRQbGF0Zm9ybUNvbmZpZ3VyYXRpb24oKTsKLQkJSVBsYXRmb3JtQ29uZmlndXJhdGlvbi5JU2l0ZUVudHJ5IHNlID0gY2ZpZy5nZXRDb25maWd1cmVkU2l0ZXMoKVswXTsKLQkJSVBsYXRmb3JtQ29uZmlndXJhdGlvbi5JU2l0ZVBvbGljeSBzcCA9IGNmaWcuY3JlYXRlU2l0ZVBvbGljeShJUGxhdGZvcm1Db25maWd1cmF0aW9uLklTaXRlUG9saWN5LlVTRVJfRVhDTFVERSwgbmV3IFN0cmluZ1tdIHsiMSIsICIyIiwiMyIsIjQiLCI1IiwiNiIsIjciLCI4IiwiOSIsIjEwIiwiMTEiLCIxMiJ9KTsKLQkJc2Uuc2V0U2l0ZVBvbGljeShzcCk7Ci0JCWNmaWcuc2F2ZSgpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oImRvbmUgLi4uIik7Ci0JfQotfQotCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9pbXBsZW1lbnRhdGlvbi9TaXRlRlRQLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9pbXBsZW1lbnRhdGlvbi9TaXRlRlRQLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmMzBjOTYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvaW1wbGVtZW50YXRpb24vU2l0ZUZUUC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuaW1wbGVtZW50YXRpb247Ci0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JUGx1Z2luRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSVVSTEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLkluc3RhbGxBYm9ydGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLio7Ci0KLXB1YmxpYyBjbGFzcyBTaXRlRlRQIGltcGxlbWVudHMgSVNpdGUgewotCi0JcHJpdmF0ZSBVUkwgdXJsOwotCXB1YmxpYyBTaXRlRlRQKFVSTCB1cmwpewotCQl0aGlzLnVybCA9IHVybDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVNpdGUjZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKQotCSAqLwotCXB1YmxpYyBJU2l0ZUZlYXR1cmVSZWZlcmVuY2VbXSBnZXRGZWF0dXJlUmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElTaXRlI2luc3RhbGwoSUZlYXR1cmUsIEZlYXR1cmVWZXJpZmljYXRpb24gdmVyaWZpZXIsSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgSUZlYXR1cmVSZWZlcmVuY2UgaW5zdGFsbChJRmVhdHVyZSBmZWF0dXJlLElWZXJpZmljYXRpb25MaXN0ZW5lciB2ZXJpZmljYXRpb25MaXN0ZW5lciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogQHNlZSBJU2l0ZSNyZW1vdmUoSUZlYXR1cmUsIElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlKElGZWF0dXJlIGZlYXR1cmUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCX0KLQotCS8qCi0JICogQHNlZSBJU2l0ZSNhZGRTaXRlQ2hhbmdlZExpc3RlbmVyKElDb25maWd1cmVkU2l0ZUNoYW5nZWRMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRTaXRlQ2hhbmdlZExpc3RlbmVyKElDb25maWd1cmVkU2l0ZUNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotCX0KLQotCS8qCi0JICogQHNlZSBJU2l0ZSNyZW1vdmVTaXRlQ2hhbmdlZExpc3RlbmVyKElDb25maWd1cmVkU2l0ZUNoYW5nZWRMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVTaXRlQ2hhbmdlZExpc3RlbmVyKElDb25maWd1cmVkU2l0ZUNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotCX0KLQotCS8qCi0JICogQHNlZSBJU2l0ZSNnZXRVUkwoKQotCSAqLwotCXB1YmxpYyBVUkwgZ2V0VVJMKCkgewotCQlyZXR1cm4gdXJsOwotCX0KLQotCS8qCi0JICogQHNlZSBJU2l0ZSNnZXRUeXBlKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiAib3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmZ0cCI7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElTaXRlI2dldENhdGVnb3JpZXMoKQotCSAqLwotCXB1YmxpYyBJQ2F0ZWdvcnlbXSBnZXRDYXRlZ29yaWVzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVNpdGUjZ2V0QXJjaGl2ZXMoKQotCSAqLwotCXB1YmxpYyBJQXJjaGl2ZVJlZmVyZW5jZVtdIGdldEFyY2hpdmVzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0gCi0JLyoKLQkgKiBAc2VlIElTaXRlI2FkZENhdGVnb3J5KElDYXRlZ29yeSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRDYXRlZ29yeShJQ2F0ZWdvcnkgY2F0ZWdvcnkpIHsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVNpdGUjc2F2ZSgpCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVBsdWdpbkNvbnRhaW5lciNnZXRQbHVnaW5FbnRyaWVzKCkKLQkgKi8KLQlwdWJsaWMgSVBsdWdpbkVudHJ5W10gZ2V0UGx1Z2luRW50cmllcygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElQbHVnaW5Db250YWluZXIjZ2V0UGx1Z2luRW50cnlDb3VudCgpCi0JICovCi0JcHVibGljIGludCBnZXRQbHVnaW5FbnRyeUNvdW50KCkgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVNpdGUjZ2V0RG93bmxvYWRTaXplRm9yKElGZWF0dXJlKQotCSAqLwotCXB1YmxpYyBsb25nIGdldERvd25sb2FkU2l6ZUZvcihJRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCXJldHVybiAwOwotCX0KLQotCS8qCi0JICogQHNlZSBJU2l0ZSNnZXRJbnN0YWxsU2l6ZUZvcihJRmVhdHVyZSkKLQkgKi8KLQlwdWJsaWMgbG9uZyBnZXRJbnN0YWxsU2l6ZUZvcihJRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCXJldHVybiAwOwotCX0KLQotCi0JLyoKLQkgKiBAc2VlIElQbHVnaW5Db250YWluZXIjc3RvcmUoSVBsdWdpbkVudHJ5LCBTdHJpbmcsIElucHV0U3RyZWFtKQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3JlKElQbHVnaW5FbnRyeSBlbnRyeSwgU3RyaW5nIG5hbWUsIElucHV0U3RyZWFtIGluU3RyZWFtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElBZGFwdGFibGUjZ2V0QWRhcHRlcihDbGFzcykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVBsdWdpbkNvbnRhaW5lciNyZW1vdmUoSVBsdWdpbkVudHJ5KQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZShJUGx1Z2luRW50cnkgZW50cnkpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVNpdGUjc2V0U2l0ZUNvbnRlbnRDb25zdW1lcihJU2l0ZUNvbnRlbnRDb25zdW1lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTaXRlQ29udGVudENvbnN1bWVyKElTaXRlQ29udGVudENvbnN1bWVyIGNvbnRlbnRDb25zdW1lcikgewotCX0KLQotCS8qCi0JICogQHNlZSBJU2l0ZSNzZXRTaXRlQ29udGVudFByb3ZpZGVyKElTaXRlQ29udGVudFByb3ZpZGVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNpdGVDb250ZW50UHJvdmlkZXIoSVNpdGVDb250ZW50UHJvdmlkZXIgc2l0ZUNvbnRlbnRQcm92aWRlcikgewotCX0KLQotCS8qCi0JICogQHNlZSBJU2l0ZSNnZXRTaXRlQ29udGVudFByb3ZpZGVyKCkKLQkgKi8KLQlwdWJsaWMgSVNpdGVDb250ZW50UHJvdmlkZXIgZ2V0U2l0ZUNvbnRlbnRQcm92aWRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElTaXRlI2dldERlZmF1bHRQYWNrYWdlZEZlYXR1cmVUeXBlKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRQYWNrYWdlZEZlYXR1cmVUeXBlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVNpdGUjc3RvcmUoSUZlYXR1cmUsIFN0cmluZywgSW5wdXRTdHJlYW0sIElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcmUoSUZlYXR1cmUgZmVhdHVyZSwgU3RyaW5nIG5hbWUsIElucHV0U3RyZWFtIGluU3RyZWFtLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl9Ci0KLQotCS8qCi0JICogQHNlZSBJUGx1Z2luQ29udGFpbmVyI3JlbW92ZShJUGx1Z2luRW50cnksIElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlKElQbHVnaW5FbnRyeSBlbnRyeSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElTaXRlI2dldENhdGVnb3J5KFN0cmluZykKLQkgKi8KLQlwdWJsaWMgSUNhdGVnb3J5IGdldENhdGVnb3J5KFN0cmluZyBrZXkpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElTaXRlI2NyZWF0ZVNpdGVDb250ZW50Q29uc3VtZXIoSUZlYXR1cmUpCi0JICovCi0JcHVibGljIElTaXRlQ29udGVudENvbnN1bWVyIGNyZWF0ZVNpdGVDb250ZW50Q29uc3VtZXIoSUZlYXR1cmUgZmVhdHVyZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVNpdGUjZ2V0RmVhdHVyZVJlZmVyZW5jZShJRmVhdHVyZSkKLQkgKi8KLQlwdWJsaWMgSVNpdGVGZWF0dXJlUmVmZXJlbmNlIGdldEZlYXR1cmVSZWZlcmVuY2UoSUZlYXR1cmUgZmVhdHVyZSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVNpdGUjZ2V0RGVzY3JpcHRpb24oKQotCSAqLwotCXB1YmxpYyBJVVJMRW50cnkgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogQHNlZSBJU2l0ZSNnZXRQbHVnaW5FbnRyaWVzT25seVJlZmVyZW5jZWRCeShJRmVhdHVyZSkKLQkgKi8KLQlwdWJsaWMgSVBsdWdpbkVudHJ5W10gZ2V0UGx1Z2luRW50cmllc09ubHlSZWZlcmVuY2VkQnkoSUZlYXR1cmUgZmVhdHVyZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElTaXRlI2FkZFBsdWdpbkVudHJ5KElQbHVnaW5FbnRyeSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQbHVnaW5FbnRyeShJUGx1Z2luRW50cnkgcGx1Z2luRW50cnkpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklTaXRlI2luc3RhbGwoSUZlYXR1cmUsIElGZWF0dXJlUmVmZXJlbmNlW10sIElWZXJpZmljYXRpb25MaXN0ZW5lciwgSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgSUZlYXR1cmVSZWZlcmVuY2UgaW5zdGFsbChJRmVhdHVyZSBmZWF0dXJlLCBJRmVhdHVyZVJlZmVyZW5jZVtdIG9wdGlvbmFsZmVhdHVyZXMsIElWZXJpZmljYXRpb25MaXN0ZW5lciB2ZXJpZmljYXRpb25MaXN0ZW5lciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW5zdGFsbEFib3J0ZWRFeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotCXB1YmxpYyBJQ29uZmlndXJlZFNpdGUgZ2V0Q3VycmVudENvbmZpZ3VyZWRTaXRlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSUZlYXR1cmUgY3JlYXRlRmVhdHVyZShTdHJpbmcgdHlwZSwgVVJMIHVybCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklTaXRlI2NyZWF0ZUZlYXR1cmUoamF2YS5sYW5nLlN0cmluZywgamF2YS5uZXQuVVJMLCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgSUZlYXR1cmUgY3JlYXRlRmVhdHVyZShTdHJpbmcgdHlwZSwgVVJMIHVybCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JU2l0ZSNnZXRSYXdGZWF0dXJlUmVmZXJlbmNlcygpCi0JICovCi0JcHVibGljIElTaXRlRmVhdHVyZVJlZmVyZW5jZVtdIGdldFJhd0ZlYXR1cmVSZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklTaXRlI2dldE1pcnJvclNpdGVFbnRyaWVzKCkKLQkgKi8KLQlwdWJsaWMgSVVSTEVudHJ5W10gZ2V0TWlycm9yU2l0ZUVudHJpZXMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2ltcGxlbWVudGF0aW9uL1NpdGVGVFBGYWN0b3J5LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9pbXBsZW1lbnRhdGlvbi9TaXRlRlRQRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzlhMDVjLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2ltcGxlbWVudGF0aW9uL1NpdGVGVFBGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmltcGxlbWVudGF0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLlVSTEVuY29kZXI7Ci0KLXB1YmxpYyBjbGFzcyBTaXRlRlRQRmFjdG9yeSBleHRlbmRzIFNpdGVNb2RlbEZhY3RvcnkgaW1wbGVtZW50cyBJU2l0ZUZhY3RvcnkgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRSA9ICJhL2IvYy8iOwotCi0JLyoKLQkgKiBAc2VlIElTaXRlRmFjdG9yeSNjcmVhdGVTaXRlKFVSTCwgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgSVNpdGUgY3JlYXRlU2l0ZShVUkwgdXJsKQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSW52YWxpZFNpdGVUeXBlRXhjZXB0aW9uIHsKLQkJSVNpdGUgc2l0ZSA9IG51bGw7Ci0JCUlucHV0U3RyZWFtIHNpdGVTdHJlYW0gPSBudWxsOwotCi0JCXRyeSB7Ci0JCQlVUkwgcmVzb2x2ZWRVUkwgPSBVUkxFbmNvZGVyLmVuY29kZSh1cmwpOwotCQkJc2l0ZVN0cmVhbSA9IHJlc29sdmVkVVJMLm9wZW5TdHJlYW0oKTsKLQotCQkJU2l0ZU1vZGVsRmFjdG9yeSBmYWN0b3J5ID0gdGhpczsKLQkJCWZhY3RvcnkucGFyc2VTaXRlKHNpdGVTdHJlYW0pOwotCi0JCQlzaXRlID0gbmV3IFNpdGVGVFAobmV3IFVSTCgiaHR0cDovL2VjbGlwc2Uub3JnLyIgKyBGSUxFKSk7Ci0JCQkKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKCJVbmFibGUgdG8gY3JlYXRlIFVSTCIsIGUpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbigiVW5hYmxlIHRvIGFjY2VzcyBVUkwiLElTaXRlLlNJVEVfQUNDRVNTX0VYQ0VQVElPTiwgZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCWlmIChzaXRlU3RyZWFtICE9IG51bGwpCi0JCQkJCXNpdGVTdHJlYW0uY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHNpdGU7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIFNpdGVNb2RlbEZhY3RvcnkjY2FuUGFyc2VTaXRlVHlwZShTdHJpbmcpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuUGFyc2VTaXRlVHlwZShTdHJpbmcgdHlwZSkgewotCQlyZXR1cm4gIm9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlLmZ0cCIuZXF1YWxzSWdub3JlQ2FzZSh0eXBlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL21pcnJvci9BbGxNaXJyb3JUZXN0cy5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvbWlycm9yL0FsbE1pcnJvclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmMWM4NjYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvbWlycm9yL0FsbE1pcnJvclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMubWlycm9yOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5VcGRhdGVNYW5hZ2VyVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBBbGxNaXJyb3JUZXN0cyBleHRlbmRzIFVwZGF0ZU1hbmFnZXJUZXN0Q2FzZSB7Ci0JCi0JcHVibGljIEFsbE1pcnJvclRlc3RzKFN0cmluZyBuYW1lKXsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JCXN1aXRlLnNldE5hbWUoIk1pcnJvciBUZXN0cyIpOwotCQkKLQkJLy8gdGhlIGZvbGxvd2luZyB3aWxsIHRha2UgYWxsIHRoZSB0ZXN0IG1ldGhvZHMgaW4gdGhlIGNsYXNzIHRoYXQgc3RhcnRzIHdpdGggInRlc3QiCi0JCQotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoVGVzdFJlbW90ZUZlYXR1cmVWZXJzaW9uTWlycm9yLmNsYXNzKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShUZXN0UmVtb3RlRW1iZWRkZWRGZWF0dXJlTWlycm9yLmNsYXNzKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShUZXN0UmVtb3RlRG91YmxlRW1iZWRkZWRGZWF0dXJlTWlycm9yLmNsYXNzKSk7Ci0JCQotCQkvLyBvciB5b3UgY2FuIHNwZWNpZnkgdGhlIG1ldGhvZAotCQkvL3N1aXRlLmFkZFRlc3QobmV3IFRlc3RHZXRGZWF0dXJlKCJtZXRob2RUaGF0RG9lc05vdFN0YXJ0V2l0aHRlc3QiKSk7Ci0JCXJldHVybiBzdWl0ZTsJCi0JfQotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9taXJyb3IvTWlycm9yTWFuYWdlclRlc3RDYXNlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9taXJyb3IvTWlycm9yTWFuYWdlclRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmZWI4YzAuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvbWlycm9yL01pcnJvck1hbmFnZXJUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5taXJyb3I7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuRmlsZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IuQ29uZmlndXJhdG9yVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuVXBkYXRlQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuVXBkYXRlTWFuYWdlclRlc3RDYXNlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLQotcHVibGljIGNsYXNzIE1pcnJvck1hbmFnZXJUZXN0Q2FzZSBleHRlbmRzIFVwZGF0ZU1hbmFnZXJUZXN0Q2FzZXsKLQlwdWJsaWMgc3RhdGljIGludCBleGl0VmFsdWU9LTE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmdCdWZmZXIgZXJyT3V0cHV0OwotCQotCXB1YmxpYyBNaXJyb3JNYW5hZ2VyVGVzdENhc2UoU3RyaW5nIGFyZzApewotCQlzdXBlcihhcmcwKTsKLQl9Ci0JCi0JLy9XYXRjaERvZyB0aHJlYWQgdG8ga2lsbCBtaXJyb3JpbmcgcHJvY2VzcyBpZiBpdCBoYW5ncyAob3IgdGFrZXMgdG9vIGxvbmcpCi0JcHVibGljIHN0YXRpYyBjbGFzcyBUaW1lciBleHRlbmRzIFRocmVhZHsKLQkJcHJpdmF0ZSBQcm9jZXNzIHByb2M7Ci0JCQotCQlwdWJsaWMgVGltZXIoUHJvY2VzcyBwcm9jKXsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLnNldERhZW1vbih0cnVlKTsKLQkJCXRoaXMucHJvYyA9IHByb2M7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHJ1bigpewotCQkJdHJ5IHsKLQkJCQkvLyBOb3RlOiBub3JtYWwgdGVzdCBvbiAyLjJHaHogUDQgaXMgMi45cyAKLQkJCQkvLzouIGdpdmluZyAxMDB4IGxlZXdheSB0byBjb21wbGV0ZSBwcm9jZXNzIGJlZm9yZSBraWxsaW5nIGl0Ci0JCQkJc2xlZXAoMzAwMDAwKTsgCi0JCQkJcHJvYy5kZXN0cm95KCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLy8gc3RydWN0dXJlIHRvIGhvbGQgY2F0ZWdvcnkgZGVmaW5pdGlvbiBuYW1lcyBhbmQgZGVzY3JpcHRpb25zCi0JY2xhc3MgQ2F0ZWdvcnlEZWZpbml0aW9uIHsKLQkJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQkJcHJpdmF0ZSBTdHJpbmcgZGVzYzsKLQkJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXREZXNjKFN0cmluZyBkZXNjKSB7Ci0JCQl0aGlzLmRlc2MgPSBkZXNjOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCXJldHVybiBuYW1lOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0RGVzYygpIHsKLQkJCXJldHVybiBkZXNjOwotCQl9Ci0JfQotCQotCS8vIHN0cnVjdHVyZSB0byBob2xkIGZlYXR1cmUgSURzIGFuZCB0aGVpciBjYXRlZ29yeSBuYW1lcwotCXB1YmxpYyBjbGFzcyBGZWF0dXJlQ2F0ZWdvcnl7Ci0JCXByaXZhdGUgU3RyaW5nIGZlYXR1cmVJZDsKLQkJcHJpdmF0ZSBBcnJheUxpc3QgY2F0ZWdvcnk7Ci0JCQotCQlwdWJsaWMgRmVhdHVyZUNhdGVnb3J5KCl7Ci0JCQljYXRlZ29yeSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgc2V0RmVhdHVyZUlEKFN0cmluZyBmaWQpewotCQkJZmVhdHVyZUlkID0gZmlkOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBhZGRDYXRlZ29yeShTdHJpbmcgY2F0KXsKLQkJCWNhdGVnb3J5LmFkZChjYXQpOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGdldEZlYXR1cmVJRCgpewotCQkJcmV0dXJuIGZlYXR1cmVJZDsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZ1tdIGdldENhdGVnb3JpZXMoKXsKLQkJCXJldHVybiAoU3RyaW5nW10pY2F0ZWdvcnkudG9BcnJheShuZXcgU3RyaW5nW2NhdGVnb3J5LnNpemUoKV0pOwotCQl9Ci0JfQotCQotCS8vIFN0cmVhbUNvbnN1bWVyIHRvIGRpc3BsYXkgb3V0cHV0IHRvIG91dHB1dCBmaWxlcyBvciBjb25zb2xlCi0JcHVibGljIHN0YXRpYyBjbGFzcyBTdHJlYW1Db25zdW1lciBleHRlbmRzIFRocmVhZCB7Ci0JCXByaXZhdGUgQnVmZmVyZWRSZWFkZXIgYlJlYWRlcjsKLQotCQlwdWJsaWMgU3RyZWFtQ29uc3VtZXIoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHsKLQkJCXN1cGVyKCk7Ci0JCQlzZXREYWVtb24odHJ1ZSk7Ci0JCQliUmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpbnB1dFN0cmVhbSkpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJdHJ5IHsKLQkJCQlTdHJpbmcgbGluZTsKLQkJCQl3aGlsZSAobnVsbCAhPSAobGluZSA9IGJSZWFkZXIucmVhZExpbmUoKSkpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKGxpbmUpOwotCQkJCQllcnJPdXRwdXQuYXBwZW5kKGxpbmUpOwotCQkJCQllcnJPdXRwdXQuYXBwZW5kKCJcbiIpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYSBzdHJpbmcgYXJyYXkgY29uc2lzdGluZyBvZiBjb21tYW5kcyBhbmQgdGhlaXIgYXJndW1lbnRzIHRvCi0JICogYmUgcnVuLgotCSAqIEBwYXJhbSByZW1vdGVMb2MgLSBwYXRoIG9mIHJlbW90ZSBzaXRlIChzaXRlIGJlaW5nIG1pcnJvcmVkKQotCSAqIEBwYXJhbSB0b0xvY2FsU2l0ZVVybCAtIHBhdGggb2YgbG9jYWwgc2l0ZSAobmV3IG1pcnJvciBzaXRlKQotCSAqIEBwYXJhbSBmaWQgLSBmZWF0dXJlIGlkIG9mIGZlYXR1cmluZyBiZWluZyBtaXJyb3IgKG9wdGlvbmFsIC0gY2FuIGJlIG51bGwpCi0JICogQHBhcmFtIHZlciAtIHZlcnNpb24gb2YgZmVhdHVyZSB0byBiZSBtaXJyb3JlZCAob3B0aW9uYWwgLSBjYW4gYmUgbnVsbCkKLQkgKiBAcGFyYW0gbWlyVXJsIC0gZGlyZWN0b3J5IGxvY2F0aW9uIG9mIHBvbGljeS54bWwgKG9wdGlvbmFsIC0gY2FuIGJlIG11bGwpCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRDb21tYW5kKAotCQlTdHJpbmcgcmVtb3RlTG9jLAotCQlTdHJpbmcgdG9Mb2NhbFNpdGVVcmwsCi0JCVN0cmluZyBmaWQsCi0JCVN0cmluZyB2ZXIsCi0JCVN0cmluZyBtaXJVcmwpIHsKLQkJZmluYWwgU3RyaW5nIGNsYXNzcGF0aCA9IGdldExhdW5jaGVyKCk7Ci0JCWZpbmFsIFN0cmluZyBsYXVuY2hlciA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLk1haW4iOwotCQlmaW5hbCBTdHJpbmcgY29tbWFuZCA9ICJtaXJyb3IiOwotCQlmaW5hbCBTdHJpbmcgYXBwbGljYXRpb24gPSAib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuc3RhbmRhbG9uZVVwZGF0ZSI7Ci0JCWZpbmFsIFN0cmluZyBGTEFHX0NQID0gIi1jcCI7Ci0JCWZpbmFsIFN0cmluZyBGTEFHX0FQUCA9ICItYXBwbGljYXRpb24iOwotCQlmaW5hbCBTdHJpbmcgRkxBR19DTUQgPSAiLWNvbW1hbmQiOwotCQlmaW5hbCBTdHJpbmcgRkxBR19GSUQgPSAiLWZlYXR1cmVJZCI7Ci0JCWZpbmFsIFN0cmluZyBGTEFHX0RBVEEgPSAiLWRhdGEiOwotCQlmaW5hbCBTdHJpbmcgRkxBR19WRVJTSU9OID0gIi12ZXJzaW9uIjsKLQkJZmluYWwgU3RyaW5nIEZMQUdfRlJPTSA9ICItZnJvbSI7Ci0JCWZpbmFsIFN0cmluZyBGTEFHX1RPID0gIi10byI7Ci0JCWZpbmFsIFN0cmluZyBGTEFHX1VSTCA9ICItbWlycm9yVVJMIjsKLQkJZmluYWwgU3RyaW5nIEZMQUdfU1BMQVNIID0gIi1ub3NwbGFzaCI7Ci0JCWZpbmFsIFN0cmluZyBGTEFHX0NPTlNPTEVMT0cgPSAiLWNvbnNvbGVsb2ciOwotCQlmaW5hbCBTdHJpbmcgZGF0YSA9Ci0JCQlVcGRhdGVDb3JlLmdldFBsdWdpbigpLmdldFN0YXRlTG9jYXRpb24oKS50b09TU3RyaW5nKCk7Ci0JCVN0cmluZ1tdIGNtZCA9Ci0JCQluZXcgU3RyaW5nW10gewotCQkJCWdldEphdmFWTVBhdGgoKSwKLQkJCQlGTEFHX0NQLAotCQkJCWNsYXNzcGF0aCwKLQkJCQlsYXVuY2hlciwKLQkJCQlGTEFHX0FQUCwKLQkJCQlhcHBsaWNhdGlvbiwKLQkJCQlGTEFHX0NNRCwKLQkJCQljb21tYW5kLAotCQkJCUZMQUdfRlJPTSwKLQkJCQkocmVtb3RlTG9jICE9bnVsbCA/IHJlbW90ZUxvYyA6ICIiKSwKLQkJCQlGTEFHX1RPLAotCQkJCXRvTG9jYWxTaXRlVXJsLAotCQkJCShmaWQgIT0gbnVsbCA/IEZMQUdfRklEIDogIiIpLAotCQkJCShmaWQgIT0gbnVsbCA/IGZpZCA6ICIiKSwKLQkJCQkodmVyICE9IG51bGwgPyBGTEFHX1ZFUlNJT04gOiAiIiksCi0JCQkJKHZlciAhPSBudWxsID8gdmVyIDogIiIpLAotCQkJCShtaXJVcmwgIT0gbnVsbCA/IEZMQUdfVVJMIDogIiIpLAotCQkJCShtaXJVcmwgIT0gbnVsbCA/IG1pclVybCA6ICIiKSwKLQkJCQlGTEFHX1NQTEFTSCwKLQkJCQlGTEFHX0RBVEEsCi0JCQkJZGF0YSwKLQkJCQlGTEFHX0NPTlNPTEVMT0d9OwotCQlyZXR1cm4gY21kOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXRMYXVuY2hlcigpIHsKLQkJQnVuZGxlIGxhdW5jaGVyID0gUGxhdGZvcm0uZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyIik7Ci0JCS8vIHRvZG8KLQkJaWYgKGxhdW5jaGVyID09IG51bGwpCi0JCQlyZXR1cm4gIiI7Ci0JCVVSTCByb290RW50cnkgPSBsYXVuY2hlci5nZXRFbnRyeSgiLyIpOwotCQl0cnkgewotCQkJcm9vdEVudHJ5ID0gRmlsZUxvY2F0b3IucmVzb2x2ZShyb290RW50cnkpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJaWYgKCJmaWxlIi5lcXVhbHMocm9vdEVudHJ5LmdldFByb3RvY29sKCkpKQotCQkJcmV0dXJuIG5ldyBGaWxlKHJvb3RFbnRyeS5nZXRQYXRoKCkpLmdldEFic29sdXRlUGF0aCgpOwotCQlpZiAoImphciIuZXF1YWxzKHJvb3RFbnRyeS5nZXRQcm90b2NvbCgpKSkgewotCQkJU3RyaW5nIHBhdGggPSByb290RW50cnkuZ2V0UGF0aCgpOwkKLQkJCS8vIHN0cmlwIG9mZiB0aGUgZmlsZTogYW5kIHRoZSAhLwotCQkJcGF0aCA9IHBhdGguc3Vic3RyaW5nKDUsIHBhdGgubGVuZ3RoKCkgLSAyKTsKLQkJCXJldHVybiBuZXcgRmlsZShwYXRoKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gY2hlY2tGZWF0dXJlSW5TaXRlWE1MRXhpc3RzKFN0cmluZyB1cmwsIFN0cmluZyBmaWQsIFN0cmluZyB2ZXIpewotCQlGaWxlIHNpdGUgPSBuZXcgRmlsZSh1cmwgKyAiL3NpdGUueG1sIik7Ci0JCWFzc2VydFRydWUoc2l0ZS5leGlzdHMoKSk7Ci0JCUJ1ZmZlcmVkUmVhZGVyIGJyZWFkZXI7Ci0JCUZpbGVSZWFkZXIgZnJlYWRlcjsKLQkJU3RyaW5nIHRleHQgPSBuZXcgU3RyaW5nKCk7Ci0JCVN0cmluZyBqYXJOYW1lID0gZmlkICsgIl8iICsgdmVyICsgIi5qYXIiOwotCQlTdHJpbmcgZmVhdHVyZSA9ICI8ZmVhdHVyZSB1cmw9XCIiICsKLQkJCSJmZWF0dXJlcy8iICsgamFyTmFtZSArIAotCQkJIlwiIGlkPVwiIiArIGZpZCArIAotCQkJIlwiIHZlcnNpb249XCIiICsgdmVyKyJcIj4iOwotCQl0cnkgewotCQkJZnJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKHNpdGUpOwotCQkJYnJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihmcmVhZGVyKTsKLQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCS8vIHdvdWxkIGhhdmUgYmVlbiBjYXVnaHQgYnkgYXNzZXJ0IGFib3ZlCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJdHJ5IHsKLQkJCXdoaWxlICgodGV4dCA9IGJyZWFkZXIucmVhZExpbmUoKSkgIT0gbnVsbCkgewotCQkJCXRleHQgPSB0ZXh0LnRyaW0oKTsKLQkJCQlpZiAodGV4dC5lcXVhbHMoZmVhdHVyZSkpewotCQkJCQlicmVhZGVyLmNsb3NlKCk7Ci0JCQkJCWZyZWFkZXIuY2xvc2UoKTsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCi0JCQlicmVhZGVyLmNsb3NlKCk7Ci0JCQlmcmVhZGVyLmNsb3NlKCk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBjaGVja1NpdGVYTUwoU3RyaW5nIHVybCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUZpbGUgbWlycm9yID0gbmV3IEZpbGUodXJsKTsKLQkJRmlsZSBzaXRlID0gbmV3IEZpbGUodXJsICsgIi9zaXRlLnhtbCIpOwotCQlhc3NlcnRUcnVlKG1pcnJvci5pc0RpcmVjdG9yeSgpKTsKLQkJYXNzZXJ0VHJ1ZShtaXJyb3IuZXhpc3RzKCkpOwotCQlhc3NlcnRUcnVlKHNpdGUuZXhpc3RzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNoZWNrUG9saWN5WE1MKFN0cmluZyB1cmwpIHRocm93cyBFeGNlcHRpb24gewotCQlGaWxlIG1pcnJvciA9IG5ldyBGaWxlKHVybCk7Ci0JCUZpbGUgc2l0ZSA9IG5ldyBGaWxlKHVybCArICIvcG9saWN5LnhtbCIpOwotCQlhc3NlcnRUcnVlKG1pcnJvci5pc0RpcmVjdG9yeSgpKTsKLQkJYXNzZXJ0VHJ1ZShtaXJyb3IuZXhpc3RzKCkpOwotCQlhc3NlcnRUcnVlKHNpdGUuZXhpc3RzKCkpOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBjaGVja1BvbGljeVVSTChTdHJpbmcgdXJsLCBTdHJpbmcgbWlycm9yVXJsKXsKLQkJRmlsZSBzaXRlID0gbmV3IEZpbGUodXJsICsgIi9wb2xpY3kueG1sIik7Ci0JCWFzc2VydFRydWUoc2l0ZS5leGlzdHMoKSk7Ci0JCUJ1ZmZlcmVkUmVhZGVyIGJyZWFkZXI7Ci0JCUZpbGVSZWFkZXIgZnJlYWRlcjsKLQkJU3RyaW5nIHRleHQgPSBuZXcgU3RyaW5nKCk7Ci0KLQkJdHJ5IHsKLQkJCWZyZWFkZXIgPSBuZXcgRmlsZVJlYWRlcihzaXRlKTsKLQkJCWJyZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoZnJlYWRlcik7Ci0JCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyB3b3VsZCBoYXZlIGJlZW4gY2F1Z2h0IGJ5IGFzc2VydCBhYm92ZQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCXdoaWxlICgodGV4dCA9IGJyZWFkZXIucmVhZExpbmUoKSkgIT0gbnVsbCkgewotCQkJCWlmICh0ZXh0LmluZGV4T2YobWlycm9yVXJsKSE9LTEpewotCQkJCQlicmVhZGVyLmNsb3NlKCk7Ci0JCQkJCWZyZWFkZXIuY2xvc2UoKTsJCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQotCQkJYnJlYWRlci5jbG9zZSgpOwotCQkJZnJlYWRlci5jbG9zZSgpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZG9lc0NhdGVnb3J5RGVmaW5pdGlvbkV4aXN0KFN0cmluZyB1cmwpIHsKLQkJRmlsZSBzaXRlID0gbmV3IEZpbGUodXJsICsgIi9zaXRlLnhtbCIpOwotCQlhc3NlcnRUcnVlKHNpdGUuZXhpc3RzKCkpOwotCQlCdWZmZXJlZFJlYWRlciBicmVhZGVyOwotCQlGaWxlUmVhZGVyIGZyZWFkZXI7Ci0JCVN0cmluZyB0ZXh0ID0gbmV3IFN0cmluZygpOwotCi0JCXRyeSB7Ci0JCQlmcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoc2l0ZSk7Ci0JCQlicmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKGZyZWFkZXIpOwotCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJLy8gd291bGQgaGF2ZSBiZWVuIGNhdWdodCBieSBhc3NlcnQgYWJvdmUKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXRyeSB7Ci0JCQl3aGlsZSAoKHRleHQgPSBicmVhZGVyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKLQkJCQlpZiAodGV4dC5pbmRleE9mKCJjYXRlZ29yeS1kZWYiKSE9LTEpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCQlicmVhZGVyLmNsb3NlKCk7Ci0JCQlmcmVhZGVyLmNsb3NlKCk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEVjbGlwc2VSb290KCkgewotCQlyZXR1cm4gQ29uZmlndXJhdG9yVXRpbHMuZ2V0SW5zdGFsbFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCkucmVwbGFjZUZpcnN0KAotCQkJImZpbGU6IiwKLQkJCSIiKTsKLQl9Ci0JCi0JcHVibGljIEZlYXR1cmVDYXRlZ29yeVtdIGdldEZlYXR1cmVDYXRlZ29yaWVzKFN0cmluZyB1cmwpewotCQlGaWxlIHNpdGUgPSBuZXcgRmlsZSh1cmwgKyAiL3NpdGUueG1sIik7Ci0JCWFzc2VydFRydWUoc2l0ZS5leGlzdHMoKSk7Ci0JCUJ1ZmZlcmVkUmVhZGVyIGJyZWFkZXI7Ci0JCUZpbGVSZWFkZXIgZnJlYWRlcjsKLQkJU3RyaW5nIHRleHQgPSBuZXcgU3RyaW5nKCk7Ci0JCUFycmF5TGlzdCBmZWF0dXJlQ2F0ZWdvcmllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCi0JCXRyeSB7Ci0JCQlmcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoc2l0ZSk7Ci0JCQlicmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKGZyZWFkZXIpOwotCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJLy8gd291bGQgaGF2ZSBiZWVuIGNhdWdodCBieSBhc3NlcnQgYWJvdmUKLQkJCXJldHVybiBuZXcgRmVhdHVyZUNhdGVnb3J5WzBdOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCUZlYXR1cmVDYXRlZ29yeSBjdXJyVG9rID0gbmV3IEZlYXR1cmVDYXRlZ29yeSgpOwotCQkJYm9vbGVhbiBhZGQgPSBmYWxzZTsKLQkJCXdoaWxlKCh0ZXh0ID1icmVhZGVyLnJlYWRMaW5lKCkpIT1udWxsKXsKLQkJCQlTdHJpbmdUb2tlbml6ZXIgc3RyVG9rID0gbmV3IFN0cmluZ1Rva2VuaXplcih0ZXh0KTsKLQkJCQl3aGlsZSAoc3RyVG9rLmhhc01vcmVUb2tlbnMoKSl7Ci0JCQkJCVN0cmluZyB0ZW1wID0gc3RyVG9rLm5leHRUb2tlbigpOwotCQkJCQlpZiAodGVtcC5lcXVhbHMoIjwvZmVhdHVyZT4iKSl7Ci0JCQkJCQlhZGQgPSB0cnVlOwotCQkJCQl9IGVsc2UgaWYgKHRlbXAuc3RhcnRzV2l0aCgiaWQiKSl7Ci0JCQkJCQljdXJyVG9rLnNldEZlYXR1cmVJRCh0ZW1wLnNwbGl0KCJcIiIpWzFdKTsKLQkJCQkJfSBlbHNlIGlmICh0ZW1wLnN0YXJ0c1dpdGgoIm5hbWUiKSl7Ci0JCQkJCQljdXJyVG9rLmFkZENhdGVnb3J5KHRlbXAuc3BsaXQoIlwiIilbMV0pOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChhZGQpewotCQkJCQlmZWF0dXJlQ2F0ZWdvcmllcy5hZGQoY3VyclRvayk7Ci0JCQkJCWN1cnJUb2sgPSBuZXcgRmVhdHVyZUNhdGVnb3J5KCk7Ci0JCQkJCWFkZCA9IGZhbHNlOwotCQkJCX0KLQkJCX0KLQotCQkJYnJlYWRlci5jbG9zZSgpOwotCQkJZnJlYWRlci5jbG9zZSgpOwotCQkJcmV0dXJuIChGZWF0dXJlQ2F0ZWdvcnlbXSlmZWF0dXJlQ2F0ZWdvcmllcy50b0FycmF5KG5ldyBGZWF0dXJlQ2F0ZWdvcnlbZmVhdHVyZUNhdGVnb3JpZXMuc2l6ZSgpXSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbihlKTsKLQkJCXJldHVybiBuZXcgRmVhdHVyZUNhdGVnb3J5WzBdOwotCQl9Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0SmF2YVZNUGF0aCgpIHsKLQkJLy8gQ3JlYXRlIGNvbW1hbmQgc3RyaW5nIGZvciBsYXVuY2hpbmcgdGhlIHByb2Nlc3MKLQkJU3RyaW5nIHZtID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLnZtLm5hbWUiKTsKLQkJU3RyaW5nIGV4ZWN1dGFibGUgPSAiSjkiLmVxdWFscyh2bSkgPyAiajkiIDogImphdmEiOwotCQlpZiAob3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLmVudmlyb25tZW50LkNvbnN0YW50cy5PU19XSU4zMi5lcXVhbHMoUGxhdGZvcm0uZ2V0T1MoKSkpCi0JCQlleGVjdXRhYmxlICs9ICJ3LmV4ZSI7Ci0KLQkJU3RyaW5nIGphdmFJbnN0YWxsRGlyID0KLQkJCVN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5ob21lIikgKyBGaWxlLnNlcGFyYXRvciArICJiaW4iOwotCQlyZXR1cm4gamF2YUluc3RhbGxEaXIgKyBGaWxlLnNlcGFyYXRvciArIGV4ZWN1dGFibGU7Ci0JfQotCQotCXB1YmxpYyBDYXRlZ29yeURlZmluaXRpb25bXSBnZXRDYXRlZ29yeURlZmluaXRpb25zKFN0cmluZyB1cmwpIHsKLQkJRmlsZSBzaXRlID0gbmV3IEZpbGUodXJsICsgIi9zaXRlLnhtbCIpOwotCQlhc3NlcnRUcnVlKHNpdGUuZXhpc3RzKCkpOwotCQlCdWZmZXJlZFJlYWRlciBicmVhZGVyOwotCQlGaWxlUmVhZGVyIGZyZWFkZXI7Ci0JCVN0cmluZyB0ZXh0ID0gbmV3IFN0cmluZygpOwotCQlBcnJheUxpc3QgY2F0RGVmID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCXRyeSB7Ci0JCQlmcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoc2l0ZSk7Ci0JCQlicmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKGZyZWFkZXIpOwotCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJLy8gd291bGQgaGF2ZSBiZWVuIGNhdWdodCBieSBhc3NlcnQgYWJvdmUKLQkJCXJldHVybiBuZXcgQ2F0ZWdvcnlEZWZpbml0aW9uWzBdOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCWJvb2xlYW4gYWRkID0gZmFsc2U7Ci0JCQlib29sZWFuIGlzRGVzYyA9IGZhbHNlOwotCQkJQ2F0ZWdvcnlEZWZpbml0aW9uIHRlbXAgPSBuZXcgQ2F0ZWdvcnlEZWZpbml0aW9uKCk7Ci0JCQl3aGlsZSAoKHRleHQgPSBicmVhZGVyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKLQkJCQlpZiAodGV4dC50cmltKCkuc3RhcnRzV2l0aCgiPGNhdGVnb3J5LWRlZiIpCi0JCQkJCSYmIHRleHQuaW5kZXhPZigibmFtZSIpICE9IC0xKSB7Ci0JCQkJCXRlbXAuc2V0TmFtZSh0ZXh0LnNwbGl0KCJcIiIpWzFdKTsKLQkJCQkJYWRkID0gZmFsc2U7Ci0JCQkJfSBlbHNlIGlmICh0ZXh0LnRyaW0oKS5lcXVhbHMoIjxkZXNjcmlwdGlvbj4iKSkgewotCQkJCQlpc0Rlc2MgPSB0cnVlOwotCQkJCX0gZWxzZSBpZiAodGV4dC50cmltKCkuZXF1YWxzKCI8L2Rlc2NyaXB0aW9uPiIpKSB7Ci0JCQkJCWlzRGVzYyA9IGZhbHNlOwotCQkJCX0gZWxzZSBpZiAoaXNEZXNjKSB7Ci0JCQkJCXRlbXAuc2V0RGVzYyh0ZXh0LnRyaW0oKSk7Ci0JCQkJfSBlbHNlIGlmICh0ZXh0LnRyaW0oKS5lcXVhbHMoIjwvY2F0ZWdvcnktZGVmPiIpKSB7Ci0JCQkJCWFkZCA9IHRydWU7Ci0JCQkJfQotCQkJCWlmIChhZGQpIHsKLQkJCQkJY2F0RGVmLmFkZCh0ZW1wKTsKLQkJCQkJYWRkID0gZmFsc2U7Ci0JCQkJCXRlbXAgPSBuZXcgQ2F0ZWdvcnlEZWZpbml0aW9uKCk7Ci0JCQkJfQotCQkJfQotCi0JCQlicmVhZGVyLmNsb3NlKCk7Ci0JCQlmcmVhZGVyLmNsb3NlKCk7Ci0JCQlyZXR1cm4gKENhdGVnb3J5RGVmaW5pdGlvbltdKWNhdERlZi50b0FycmF5KG5ldyBDYXRlZ29yeURlZmluaXRpb25bY2F0RGVmLnNpemUoKV0pOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oZSk7Ci0JCQlyZXR1cm4gbmV3IENhdGVnb3J5RGVmaW5pdGlvblswXTsKLQkJfQotCi0JfQotCQotCXB1YmxpYyBpbnQgcGVyZm9ybU1pcnJvcihTdHJpbmdbXSBjbWRfbWlycm9yKSB7Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGdldEVjbGlwc2VSb290KCkpOwotCQl0cnkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMYXVuY2hpbmc6Iik7Ci0JCQlmb3IoaW50IGk9MDsgaTxjbWRfbWlycm9yLmxlbmd0aDsgaSsrKXsKLQkJCQlTeXN0ZW0ub3V0LnByaW50KGNtZF9taXJyb3JbaV0rIiAiKTsKLQkJCX0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQkJUHJvY2VzcyBwcm9jID0KLQkJCQlSdW50aW1lLmdldFJ1bnRpbWUoKS5leGVjKGNtZF9taXJyb3IsIChTdHJpbmdbXSkgbnVsbCwgZmlsZSk7Ci0KLQkJCVN0cmVhbUNvbnN1bWVyIG91dHB1dHMgPSBuZXcgU3RyZWFtQ29uc3VtZXIocHJvYy5nZXRJbnB1dFN0cmVhbSgpKTsKLQkJCW91dHB1dHMuc3RhcnQoKTsKLQkJCVN0cmVhbUNvbnN1bWVyIGVycm9ycyA9IG5ldyBTdHJlYW1Db25zdW1lcihwcm9jLmdldEVycm9yU3RyZWFtKCkpOwotCQkJZXJyb3JzLnN0YXJ0KCk7Ci0JCQlUaW1lciB0aW1lciA9IG5ldyBUaW1lcihwcm9jKTsKLQkJCXRpbWVyLnN0YXJ0KCk7Ci0KLQkJCXJldHVybiBwcm9jLndhaXRGb3IoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLmVyci5wcmludGxuKGUpOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oZSk7Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCS8vIGVuc3VyZSBleGl0IHdpdGhvdXQgcHJvYmxlbXMKLQlwdWJsaWMgdm9pZCB0ZXN0RXhpdFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscyhleGl0VmFsdWUsIDApOwotCX0KLQkKLQkvLyBlbnN1cmUgb3V0cHV0IHN0cmluZyBidWZmZXIgZW5kcyB3aXRoICJNaXJyb3IgY29tbWFuZCBjb21wbGV0ZWQKLQkvLyBzdWNjZXNzZnVsbHkuIgotCS8vIG5vdGU6IG91dHB1dCBtYXkgaW5zdGVhZCBieSAiQ29tbWFuZCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LiIKLQlwdWJsaWMgdm9pZCB0ZXN0TWlycm9yU3VjY2VzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0KLQkJCW5ldyBTdHJpbmdUb2tlbml6ZXIoCi0JCQkJZXJyT3V0cHV0LnRvU3RyaW5nKCksCi0JCQkJIlxuIik7Ci0JCVN0cmluZyBsYXN0TGluZSA9IG5ldyBTdHJpbmcoKTsKLQkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpewotCQkJbGFzdExpbmUgPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgKLQkJCWxhc3RMaW5lLmVxdWFscygiTWlycm9yIGNvbW1hbmQgY29tcGxldGVkIHN1Y2Nlc3NmdWxseS4iKQotCQkJCXx8IGxhc3RMaW5lLmVxdWFscygiQ29tbWFuZCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LiIpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9taXJyb3IvVGVzdFJlbW90ZURvdWJsZUVtYmVkZGVkRmVhdHVyZU1pcnJvci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvbWlycm9yL1Rlc3RSZW1vdGVEb3VibGVFbWJlZGRlZEZlYXR1cmVNaXJyb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNmM2YxNC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9taXJyb3IvVGVzdFJlbW90ZURvdWJsZUVtYmVkZGVkRmVhdHVyZU1pcnJvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5taXJyb3I7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5VcGRhdGVUZXN0c1BsdWdpbjsKLQotcHVibGljIGNsYXNzIFRlc3RSZW1vdGVEb3VibGVFbWJlZGRlZEZlYXR1cmVNaXJyb3IgZXh0ZW5kcyBNaXJyb3JNYW5hZ2VyVGVzdENhc2UgewotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNNaXJyb3JlZDsKLQotCXB1YmxpYyBUZXN0UmVtb3RlRG91YmxlRW1iZWRkZWRGZWF0dXJlTWlycm9yKFN0cmluZyBhcmcwKSB7Ci0JCXN1cGVyKGFyZzApOwotCQllcnJPdXRwdXQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWlzTWlycm9yZWQgPSBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bVNldFVwKCkgewotCQlTdHJpbmcgZmVhdHVyZUlkID0gInVwZGF0ZS5mZWF0dXJlMWMiOwotCQlTdHJpbmcgdmVyc2lvbiA9ICIzLjAuMCI7Ci0JCVN0cmluZyB0b0xvY2FsU2l0ZVVybCA9Ci0JCQlVcGRhdGVUZXN0c1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRTdGF0ZUxvY2F0aW9uKCkKLQkJCQkrICIvdGVtcC90ZXN0UmVtb3RlRG91YmxlRW1iZWRkZWRGZWF0dXJlTWlycm9yIjsKLQkJU3RyaW5nIG1pcnJvclVSTCA9ICJodHRwOi8vdXBkYXRlLmVjbGlwc2Uub3JnL215LW1pcnJvci11cmwiOwotCQkvLyBmaXJzdCBtaXJyb3IKLQkJU3RyaW5nIGZyb21SZW1vdGVTaXRlVXJsID0KLQkJCSJmaWxlOiIKLQkJCQkrIGRhdGFQYXRoCi0JCQkJKyAibWlycm9ycy91cGRhdGUtc2l0ZTEiOwotCQlpZiAoIWlzTWlycm9yZWQpIHsKLQkJCWV4aXRWYWx1ZSA9Ci0JCQkJcGVyZm9ybU1pcnJvcigKLQkJCQkJZ2V0Q29tbWFuZChmcm9tUmVtb3RlU2l0ZVVybCx0b0xvY2FsU2l0ZVVybCwgbnVsbCwgbnVsbCwgbWlycm9yVVJMKSk7Ci0JCQotCQkvLyBlbmQgb2YgZmlyc3QgbWlycm9yCi0JCWZyb21SZW1vdGVTaXRlVXJsID0KLQkJCSJmaWxlOiIKLQkJCSsgZGF0YVBhdGgKLQkJCSsgIm1pcnJvcnMvdXBkYXRlLXNpdGU1IjsKLQkJCWV4aXRWYWx1ZSA9Ci0JCQkJcGVyZm9ybU1pcnJvcigKLQkJCQkJZ2V0Q29tbWFuZChmcm9tUmVtb3RlU2l0ZVVybCx0b0xvY2FsU2l0ZVVybCwgZmVhdHVyZUlkLCB2ZXJzaW9uLCBtaXJyb3JVUkwpKTsKLQkJCWlzTWlycm9yZWQgPSB0cnVlOwotCQl9Ci0JfQotCi0JLy8gbWFrZSBzdXJlIGVhY2ggZmVhdHVyZSBpcyB1bmRlciBpdHMgY29ycmVjdCBjYXRlZ29yeSBuYW1lcwotCXB1YmxpYyB2b2lkIHRlc3RGZWF0dXJlQ2F0ZWdvcmllcygpIHRocm93cyBFeGNlcHRpb257Ci0JCVN0cmluZyB0b0xvY2FsU2l0ZVVybCA9Ci0JCQlVcGRhdGVUZXN0c1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRTdGF0ZUxvY2F0aW9uKCkKLQkJCQkrICIvdGVtcC90ZXN0UmVtb3RlRG91YmxlRW1iZWRkZWRGZWF0dXJlTWlycm9yIjsKLQkJRmVhdHVyZUNhdGVnb3J5W10gbWlycm9yRmVhdHVyZXMgPSBnZXRGZWF0dXJlQ2F0ZWdvcmllcyh0b0xvY2FsU2l0ZVVybCk7Ci0JCUZlYXR1cmVDYXRlZ29yeVtdIHJlcXVpcmVkID0gbmV3IEZlYXR1cmVDYXRlZ29yeVsxXTsKLQkJcmVxdWlyZWRbMF0gPSBuZXcgRmVhdHVyZUNhdGVnb3J5KCk7Ci0JCXJlcXVpcmVkWzBdLnNldEZlYXR1cmVJRCgidXBkYXRlLmZlYXR1cmUxYyIpOwotCQlyZXF1aXJlZFswXS5hZGRDYXRlZ29yeSgiU2l0ZTUtQ2F0ZWdvcnkxIik7Ci0JCWFzc2VydFRydWUoY2hlY2tGZWF0dXJlQ2F0ZWdvcmllc0NvbnRhaW5lZChyZXF1aXJlZCwgbWlycm9yRmVhdHVyZXMpKTsKLQl9Ci0JCi0JLy8gZW5zdXJlIGV4aXQgd2l0aG91dCBwcm9ibGVtcwotCXB1YmxpYyB2b2lkIHRlc3RFeGl0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIudGVzdEV4aXRWYWx1ZSgpOwotCX0KLQkKLQkvLyBlbnN1cmUgY2F0ZWdvcnkgZGVmaW5pdGlvbnMgZXhpc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Q2F0ZWdvcnlEZWZpbml0aW9uc0V4aXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyB0b0xvY2FsU2l0ZVVybCA9Ci0JCQlVcGRhdGVUZXN0c1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRTdGF0ZUxvY2F0aW9uKCkKLQkJCQkrICIvdGVtcC90ZXN0UmVtb3RlRG91YmxlRW1iZWRkZWRGZWF0dXJlTWlycm9yIjsKLQkJYXNzZXJ0VHJ1ZShkb2VzQ2F0ZWdvcnlEZWZpbml0aW9uRXhpc3QodG9Mb2NhbFNpdGVVcmwpKTsKLQl9Ci0KLQkvLyBlbnN1cmUgZmVhdHVyZSBleGlzdHMgcGVyIHNpdGUueG1sCi0JcHVibGljIHZvaWQgdGVzdEZlYXR1cmVJblNpdGVYTUxFeGlzdHMoKSB7Ci0JCVN0cmluZyB0b0xvY2FsU2l0ZVVybCA9Ci0JCQlVcGRhdGVUZXN0c1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRTdGF0ZUxvY2F0aW9uKCkKLQkJCQkrICIvdGVtcC90ZXN0UmVtb3RlRG91YmxlRW1iZWRkZWRGZWF0dXJlTWlycm9yIjsKLQkJU3RyaW5nIGZlYXR1cmVJZCA9ICJ1cGRhdGUuZmVhdHVyZTFjIjsKLQkJU3RyaW5nIHZlcnNpb24gPSAiMy4wLjAiOwotCQlhc3NlcnRUcnVlKAotCQkJY2hlY2tGZWF0dXJlSW5TaXRlWE1MRXhpc3RzKHRvTG9jYWxTaXRlVXJsLCBmZWF0dXJlSWQsIHZlcnNpb24pKTsKLQl9Ci0KLQkvLyBlbnN1cmUgc2l0ZS54bWwgaXMgZ2VuZXJhdGVkCi0JcHVibGljIHZvaWQgdGVzdFNpdGVYTUxFeGlzdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHRvTG9jYWxTaXRlVXJsID0KLQkJCVVwZGF0ZVRlc3RzUGx1Z2luLmdldFBsdWdpbigpLmdldFN0YXRlTG9jYXRpb24oKQotCQkJCSsgIi90ZW1wL3Rlc3RSZW1vdGVEb3VibGVFbWJlZGRlZEZlYXR1cmVNaXJyb3IiOwotCQljaGVja1NpdGVYTUwodG9Mb2NhbFNpdGVVcmwpOwotCX0KLQotCS8vIGVuc3VyZSBwb2xpY3kueG1sIGlzIGdlbmVyYXRlZAotCXB1YmxpYyB2b2lkIHRlc3RQb2xpY3lYTUxFeGlzdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHRvTG9jYWxTaXRlVXJsID0KLQkJCVVwZGF0ZVRlc3RzUGx1Z2luLmdldFBsdWdpbigpLmdldFN0YXRlTG9jYXRpb24oKQotCQkJCSsgIi90ZW1wL3Rlc3RSZW1vdGVEb3VibGVFbWJlZGRlZEZlYXR1cmVNaXJyb3IiOwotCQljaGVja1BvbGljeVhNTCh0b0xvY2FsU2l0ZVVybCk7Ci0JfQotCi0JLy8gZW5zdXJlIHBvbGljeS54bWwgcmVmZXJlbmNlcyB0aGUgY29ycmVjdCBtaXJyb3JVUkwKLQlwdWJsaWMgdm9pZCB0ZXN0UG9saWN5VVJMKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyB0b0xvY2FsU2l0ZVVybCA9Ci0JCQlVcGRhdGVUZXN0c1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRTdGF0ZUxvY2F0aW9uKCkKLQkJCQkrICIvdGVtcC90ZXN0UmVtb3RlRG91YmxlRW1iZWRkZWRGZWF0dXJlTWlycm9yIjsKLQkJU3RyaW5nIG1pcnJvclVSTCA9ICJodHRwOi8vdXBkYXRlLmVjbGlwc2Uub3JnL215LW1pcnJvci11cmwiOwotCQlhc3NlcnRUcnVlKGNoZWNrUG9saWN5VVJMKHRvTG9jYWxTaXRlVXJsLCBtaXJyb3JVUkwpKTsKLQl9Ci0KLQkvLyBlbnN1cmUgYWxsIGphcnMgaW4gZmVhdHVyZXMgZGlyZWN0b3J5IG1pcnJvcmVkCi0JcHVibGljIHZvaWQgdGVzdEFsbEZlYXR1cmVKYXJzRXhpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHRvTG9jYWxTaXRlVXJsID0KLQkJCVVwZGF0ZVRlc3RzUGx1Z2luLmdldFBsdWdpbigpLmdldFN0YXRlTG9jYXRpb24oKQotCQkJCSsgIi90ZW1wL3Rlc3RSZW1vdGVEb3VibGVFbWJlZGRlZEZlYXR1cmVNaXJyb3IiOwotCQlTdHJpbmdbXSBmZWF0dXJlSmFycyA9IHsgInVwZGF0ZS5mZWF0dXJlMWJfMi4wLjAuamFyIiB9OwotCQlhc3NlcnRUcnVlKGNoZWNrQWxsRmVhdHVyZUphcnModG9Mb2NhbFNpdGVVcmwsIGZlYXR1cmVKYXJzKSk7Ci0JfQotCi0JLy8gZW5zdXJlIGFsbCBqYXJzIGluIHBsdWdpbnMgZGlyZWN0b3J5IG1pcnJvcmVkCi0JcHVibGljIHZvaWQgdGVzdEFsbFBsdWdpbkphcnNFeGlzdCgpIHRocm93cyBFeGNlcHRpb24gewotCQlTdHJpbmcgdG9Mb2NhbFNpdGVVcmwgPQotCQkJVXBkYXRlVGVzdHNQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0U3RhdGVMb2NhdGlvbigpCi0JCQkJKyAiL3RlbXAvdGVzdFJlbW90ZURvdWJsZUVtYmVkZGVkRmVhdHVyZU1pcnJvciI7Ci0JCVN0cmluZ1tdIHBsdWdpbkphcnMgPQotCQkJeyAiY29tLnBsdWdpbjFfMS4wLjAuamFyIiwgImNvbS5wbHVnaW4xYV8xLjAuMS5qYXIiIH07Ci0JCWFzc2VydFRydWUoY2hlY2tBbGxQbHVnaW5KYXJzKHRvTG9jYWxTaXRlVXJsLCBwbHVnaW5KYXJzKSk7Ci0JfQotCi0JLy8gZW5zdXJlIG91dHB1dCBzdHJpbmcgYnVmZmVyIGVuZHMgd2l0aCAiTWlycm9yIGNvbW1hbmQgY29tcGxldGVkCi0JLy8gc3VjY2Vzc2Z1bGx5LiIKLQkvLyBub3RlOiBvdXRwdXQgbWF5IGluc3RlYWQgYnkgIkNvbW1hbmQgY29tcGxldGVkIHN1Y2Nlc3NmdWxseS4iCi0JcHVibGljIHZvaWQgdGVzdE1pcnJvclN1Y2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIudGVzdE1pcnJvclN1Y2Nlc3MoKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gY2hlY2tBbGxGZWF0dXJlSmFycyhTdHJpbmcgdXJsLCBTdHJpbmdbXSBqYXJOYW1lcykgewotCQlGaWxlIGZlYXR1cmVzRGlyID0gbmV3IEZpbGUodXJsICsgIi9mZWF0dXJlcyIpOwotCQlhc3NlcnRUcnVlKGZlYXR1cmVzRGlyLmV4aXN0cygpKTsKLQkJYXNzZXJ0VHJ1ZShmZWF0dXJlc0Rpci5pc0RpcmVjdG9yeSgpKTsKLQkJU3RyaW5nW10gbGlzdCA9IGZlYXR1cmVzRGlyLmxpc3QoKTsKLQotCQlBcnJheUxpc3QgbHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgewotCQkJbHMuYWRkKGxpc3RbaV0pOwotCQl9Ci0KLQkJZm9yIChpbnQgaiA9IDA7IGogPCBqYXJOYW1lcy5sZW5ndGg7IGorKykgewotCQkJYXNzZXJ0VHJ1ZShscy5jb250YWlucyhqYXJOYW1lc1tqXSkpOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNoZWNrQWxsUGx1Z2luSmFycyhTdHJpbmcgdXJsLCBTdHJpbmdbXSBqYXJOYW1lcykgewotCQlGaWxlIHBsdWdpbnNEaXIgPSBuZXcgRmlsZSh1cmwgKyAiL3BsdWdpbnMiKTsKLQkJYXNzZXJ0VHJ1ZShwbHVnaW5zRGlyLmV4aXN0cygpKTsKLQkJYXNzZXJ0VHJ1ZShwbHVnaW5zRGlyLmlzRGlyZWN0b3J5KCkpOwotCQlTdHJpbmdbXSBsaXN0ID0gcGx1Z2luc0Rpci5saXN0KCk7Ci0KLQkJQXJyYXlMaXN0IGxzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKLQkJCWxzLmFkZChsaXN0W2ldKTsKLQkJfQotCi0JCWZvciAoaW50IGogPSAwOyBqIDwgamFyTmFtZXMubGVuZ3RoOyBqKyspIHsKLQkJCWFzc2VydFRydWUobHMuY29udGFpbnMoamFyTmFtZXNbal0pKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjaGVja0ZlYXR1cmVDYXRlZ29yaWVzQ29udGFpbmVkKEZlYXR1cmVDYXRlZ29yeVtdIHJlcXVpcmVkLEZlYXR1cmVDYXRlZ29yeVtdIGxvY2FsRGVmcyl7Ci0JCWJvb2xlYW4gaGFzTWF0Y2g7Ci0JCWZvciAoaW50IGkgPSAwIDsgaTxyZXF1aXJlZC5sZW5ndGg7IGkrKyl7Ci0JCQloYXNNYXRjaCA9IGZhbHNlOwotCQkJZm9yIChpbnQgaiA9IDA7IGo8bG9jYWxEZWZzLmxlbmd0aDsgaisrKXsKLQkJCQlpZiAobG9jYWxEZWZzW2pdLmdldEZlYXR1cmVJRCgpLmVxdWFscyhyZXF1aXJlZFtpXS5nZXRGZWF0dXJlSUQoKSkgJiYKLQkJCQkJY2hlY2tDYXRlZ29yaWVzTWF0Y2gobG9jYWxEZWZzW2pdLmdldENhdGVnb3JpZXMoKSwgcmVxdWlyZWRbaV0uZ2V0Q2F0ZWdvcmllcygpKSl7Ci0JCQkJCQloYXNNYXRjaCA9IHRydWU7Ci0JCQkJCQlqPWxvY2FsRGVmcy5sZW5ndGg7Ci0JCQkJfQotCQkJfQotCQkJaWYgKCFoYXNNYXRjaCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGNoZWNrQ2F0ZWdvcmllc01hdGNoKFN0cmluZ1tdIGxvY2FsQ2F0LCBTdHJpbmdbXSByZW1vdGVDYXQpewotCQlib29sZWFuIGhhc01hdGNoOwotCQlmb3IgKGludCBpID0gMDsgaTxsb2NhbENhdC5sZW5ndGg7IGkrKyl7Ci0JCQloYXNNYXRjaCA9IGZhbHNlOwotCQkJZm9yIChpbnQgaiA9IDA7IGo8cmVtb3RlQ2F0Lmxlbmd0aDsgaSsrKXsKLQkJCQlpZiAobG9jYWxDYXRbaV0uZXF1YWxzKHJlbW90ZUNhdFtqXSkpewotCQkJCQloYXNNYXRjaCA9IHRydWU7Ci0JCQkJCWo9cmVtb3RlQ2F0Lmxlbmd0aDsKLQkJCQl9Ci0JCQl9Ci0JCQlpZighaGFzTWF0Y2gpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvbWlycm9yL1Rlc3RSZW1vdGVFbWJlZGRlZEZlYXR1cmVNaXJyb3IuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL21pcnJvci9UZXN0UmVtb3RlRW1iZWRkZWRGZWF0dXJlTWlycm9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2ODQ3NTMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvbWlycm9yL1Rlc3RSZW1vdGVFbWJlZGRlZEZlYXR1cmVNaXJyb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMubWlycm9yOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuVXBkYXRlVGVzdHNQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBUZXN0UmVtb3RlRW1iZWRkZWRGZWF0dXJlTWlycm9yIGV4dGVuZHMgTWlycm9yTWFuYWdlclRlc3RDYXNlIHsKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTWlycm9yZWQ7Ci0KLQlwdWJsaWMgVGVzdFJlbW90ZUVtYmVkZGVkRmVhdHVyZU1pcnJvcihTdHJpbmcgYXJnMCkgewotCQlzdXBlcihhcmcwKTsKLQkJZXJyT3V0cHV0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpc01pcnJvcmVkID0gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgdW1TZXRVcCgpIHsKLQkJU3RyaW5nIGZlYXR1cmVJZCA9ICJ1cGRhdGUuZmVhdHVyZTFjIjsKLQkJU3RyaW5nIHZlcnNpb24gPSAiMy4wLjAiOwotCQlTdHJpbmcgdG9Mb2NhbFNpdGVVcmwgPQotCQkJVXBkYXRlVGVzdHNQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0U3RhdGVMb2NhdGlvbigpCi0JCQkJKyAiL3RlbXAvdGVzdFJlbW90ZUVtYmVkZGVkRmVhdHVyZU1pcnJvciI7Ci0JCVN0cmluZyBtaXJyb3JVUkwgPSAiaHR0cDovL3VwZGF0ZS5lY2xpcHNlLm9yZy9teS1taXJyb3ItdXJsIjsKLQkJU3RyaW5nIGZyb21SZW1vdGVTaXRlVXJsID0KLQkJCQkiZmlsZToiCi0JCQkJKyBkYXRhUGF0aAotCQkJCSsgIm1pcnJvcnMvdXBkYXRlLXNpdGU0IjsKLQkJaWYgKCFpc01pcnJvcmVkKSB7Ci0JCQlleGl0VmFsdWUgPQotCQkJCXBlcmZvcm1NaXJyb3IoCi0JCQkJCWdldENvbW1hbmQoZnJvbVJlbW90ZVNpdGVVcmwsdG9Mb2NhbFNpdGVVcmwsIGZlYXR1cmVJZCwgdmVyc2lvbiwgbWlycm9yVVJMKSk7Ci0JCQlpc01pcnJvcmVkID0gdHJ1ZTsKLQkJfQotCX0KLQotCS8vIGVuc3VyZSBleGl0IHdpdGhvdXQgcHJvYmxlbXMKLQlwdWJsaWMgdm9pZCB0ZXN0RXhpdFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnRlc3RFeGl0VmFsdWUoKTsKLQl9Ci0KLQkvLyBlbnN1cmUgYWxsIGNhdGVnb3J5IGRlZmluaXRpb25zIGV4aXN0Ci0JcHVibGljIHZvaWQgdGVzdENhdGVnb3J5RGVmaW5pdGlvbnNFeGlzdCgpIHRocm93cyBFeGNlcHRpb24gewotCQlTdHJpbmcgdG9Mb2NhbFNpdGVVcmwgPQotCQkJVXBkYXRlVGVzdHNQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0U3RhdGVMb2NhdGlvbigpCi0JCQkJKyAiL3RlbXAvdGVzdFJlbW90ZUVtYmVkZGVkRmVhdHVyZU1pcnJvciI7Ci0JCWFzc2VydFRydWUoZG9lc0NhdGVnb3J5RGVmaW5pdGlvbkV4aXN0KHRvTG9jYWxTaXRlVXJsKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZlYXR1cmVJblNpdGVYTUxFeGlzdHMoKSB7Ci0JCVN0cmluZyB0b0xvY2FsU2l0ZVVybCA9Ci0JCQlVcGRhdGVUZXN0c1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRTdGF0ZUxvY2F0aW9uKCkKLQkJCQkrICIvdGVtcC90ZXN0UmVtb3RlRW1iZWRkZWRGZWF0dXJlTWlycm9yIjsKLQkJU3RyaW5nIGZlYXR1cmVJZCA9ICJ1cGRhdGUuZmVhdHVyZTFjIjsKLQkJU3RyaW5nIHZlcnNpb24gPSAiMy4wLjAiOwotCQlhc3NlcnRUcnVlKAotCQkJY2hlY2tGZWF0dXJlSW5TaXRlWE1MRXhpc3RzKHRvTG9jYWxTaXRlVXJsLCBmZWF0dXJlSWQsIHZlcnNpb24pKTsKLQl9Ci0KLQkvLyBlbnN1cmUgc2l0ZS54bWwgaXMgZ2VuZXJhdGVkCi0JcHVibGljIHZvaWQgdGVzdFNpdGVYTUxFeGlzdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHRvTG9jYWxTaXRlVXJsID0KLQkJCVVwZGF0ZVRlc3RzUGx1Z2luLmdldFBsdWdpbigpLmdldFN0YXRlTG9jYXRpb24oKQotCQkJCSsgIi90ZW1wL3Rlc3RSZW1vdGVFbWJlZGRlZEZlYXR1cmVNaXJyb3IiOwotCQljaGVja1NpdGVYTUwodG9Mb2NhbFNpdGVVcmwpOwotCX0KLQotCS8vIGVuc3VyZSBwb2xpY3kueG1sIGlzIGdlbmVyYXRlZAotCXB1YmxpYyB2b2lkIHRlc3RQb2xpY3lYTUxFeGlzdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHRvTG9jYWxTaXRlVXJsID0KLQkJCVVwZGF0ZVRlc3RzUGx1Z2luLmdldFBsdWdpbigpLmdldFN0YXRlTG9jYXRpb24oKQotCQkJCSsgIi90ZW1wL3Rlc3RSZW1vdGVFbWJlZGRlZEZlYXR1cmVNaXJyb3IiOwotCQljaGVja1BvbGljeVhNTCh0b0xvY2FsU2l0ZVVybCk7Ci0JfQotCi0JLy8gZW5zdXJlIHBvbGljeS54bWwgdXNlcyB0aGUgY29ycmVjdCBtaXJyb3JVUkwKLQlwdWJsaWMgdm9pZCB0ZXN0UG9saWN5VVJMKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyB0b0xvY2FsU2l0ZVVybCA9Ci0JCQlVcGRhdGVUZXN0c1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRTdGF0ZUxvY2F0aW9uKCkKLQkJCQkrICIvdGVtcC90ZXN0UmVtb3RlRW1iZWRkZWRGZWF0dXJlTWlycm9yIjsKLQkJU3RyaW5nIG1pcnJvclVSTCA9ICJodHRwOi8vdXBkYXRlLmVjbGlwc2Uub3JnL215LW1pcnJvci11cmwiOwotCQlhc3NlcnRUcnVlKGNoZWNrUG9saWN5VVJMKHRvTG9jYWxTaXRlVXJsLCBtaXJyb3JVUkwpKTsKLQl9Ci0KLQkvLyBlbnN1cmUgYWxsIGphcnMgaW4gZmVhdHVyZXMgZGlyZWN0b3J5IG1pcnJvcmVkCi0JcHVibGljIHZvaWQgdGVzdEFsbEZlYXR1cmVKYXJzRXhpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHRvTG9jYWxTaXRlVXJsID0KLQkJCVVwZGF0ZVRlc3RzUGx1Z2luLmdldFBsdWdpbigpLmdldFN0YXRlTG9jYXRpb24oKQotCQkJCSsgIi90ZW1wL3Rlc3RSZW1vdGVFbWJlZGRlZEZlYXR1cmVNaXJyb3IiOwotCQlTdHJpbmdbXSBmZWF0dXJlSmFycyA9IHsgInVwZGF0ZS5mZWF0dXJlMV8xLjAuMC5qYXIiLCAidXBkYXRlLmZlYXR1cmUxXzEuMC4xLmphciIsICJ1cGRhdGUuZmVhdHVyZTFiXzIuMC4wLmphciIsICJ1cGRhdGUuZmVhdHVyZTFjXzMuMC4wLmphciIgfTsKLQkJYXNzZXJ0VHJ1ZShjaGVja0FsbEZlYXR1cmVKYXJzKHRvTG9jYWxTaXRlVXJsLCBmZWF0dXJlSmFycykpOwotCX0KLQotCS8vIGVuc3VyZSBhbGwgamFycyBpbiBwbHVnaW5zIGRpcmVjdG9yeSBtaXJyb3JlZAotCXB1YmxpYyB2b2lkIHRlc3RBbGxQbHVnaW5KYXJzRXhpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHRvTG9jYWxTaXRlVXJsID0KLQkJCVVwZGF0ZVRlc3RzUGx1Z2luLmdldFBsdWdpbigpLmdldFN0YXRlTG9jYXRpb24oKQotCQkJCSsgIi90ZW1wL3Rlc3RSZW1vdGVFbWJlZGRlZEZlYXR1cmVNaXJyb3IiOwotCQlTdHJpbmdbXSBwbHVnaW5KYXJzID0KLQkJCXsgImNvbS5wbHVnaW4xXzEuMC4wLmphciIsICJjb20ucGx1Z2luMWFfMS4wLjEuamFyIiB9OwotCQlhc3NlcnRUcnVlKGNoZWNrQWxsUGx1Z2luSmFycyh0b0xvY2FsU2l0ZVVybCwgcGx1Z2luSmFycykpOwotCX0KLQotCS8vIGVuc3VyZSBvdXRwdXQgc3RyaW5nIGJ1ZmZlciBlbmRzIHdpdGggIk1pcnJvciBjb21tYW5kIGNvbXBsZXRlZAotCS8vIHN1Y2Nlc3NmdWxseS4iCi0JLy8gbm90ZTogb3V0cHV0IG1heSBpbnN0ZWFkIGJ5ICJDb21tYW5kIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuIgotCXB1YmxpYyB2b2lkIHRlc3RNaXJyb3JTdWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnRlc3RNaXJyb3JTdWNjZXNzKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2hlY2tBbGxGZWF0dXJlSmFycyhTdHJpbmcgdXJsLCBTdHJpbmdbXSBqYXJOYW1lcykgewotCQlGaWxlIGZlYXR1cmVzRGlyID0gbmV3IEZpbGUodXJsICsgIi9mZWF0dXJlcyIpOwotCQlhc3NlcnRUcnVlKGZlYXR1cmVzRGlyLmV4aXN0cygpKTsKLQkJYXNzZXJ0VHJ1ZShmZWF0dXJlc0Rpci5pc0RpcmVjdG9yeSgpKTsKLQkJU3RyaW5nW10gbGlzdCA9IGZlYXR1cmVzRGlyLmxpc3QoKTsKLQotCQlBcnJheUxpc3QgbHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgewotCQkJbHMuYWRkKGxpc3RbaV0pOwotCQl9Ci0KLQkJYXNzZXJ0RXF1YWxzKGxpc3QubGVuZ3RoLCBqYXJOYW1lcy5sZW5ndGgpOwotCQlmb3IgKGludCBqID0gMDsgaiA8IGphck5hbWVzLmxlbmd0aDsgaisrKSB7Ci0JCQlhc3NlcnRUcnVlKGxzLmNvbnRhaW5zKGphck5hbWVzW2pdKSk7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2hlY2tBbGxQbHVnaW5KYXJzKFN0cmluZyB1cmwsIFN0cmluZ1tdIGphck5hbWVzKSB7Ci0JCUZpbGUgcGx1Z2luc0RpciA9IG5ldyBGaWxlKHVybCArICIvcGx1Z2lucyIpOwotCQlhc3NlcnRUcnVlKHBsdWdpbnNEaXIuZXhpc3RzKCkpOwotCQlhc3NlcnRUcnVlKHBsdWdpbnNEaXIuaXNEaXJlY3RvcnkoKSk7Ci0JCVN0cmluZ1tdIGxpc3QgPSBwbHVnaW5zRGlyLmxpc3QoKTsKLQotCQlBcnJheUxpc3QgbHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgewotCQkJbHMuYWRkKGxpc3RbaV0pOwotCQl9Ci0KLQkJYXNzZXJ0RXF1YWxzKGxpc3QubGVuZ3RoLCBqYXJOYW1lcy5sZW5ndGgpOwotCQlmb3IgKGludCBqID0gMDsgaiA8IGphck5hbWVzLmxlbmd0aDsgaisrKSB7Ci0JCQlhc3NlcnRUcnVlKGxzLmNvbnRhaW5zKGphck5hbWVzW2pdKSk7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2hlY2tDYXRlZ29yeURlZmluaXRpb25zQ29udGFpbmVkKENhdGVnb3J5RGVmaW5pdGlvbltdIGxvY2FsRGVmcywgQ2F0ZWdvcnlEZWZpbml0aW9uW10gcmVtb3RlRGVmcyl7Ci0JCWJvb2xlYW4gaGFzTWF0Y2g7Ci0JCWZvciAoaW50IGkgPSAwIDsgaTxsb2NhbERlZnMubGVuZ3RoOyBpKyspewotCQkJaGFzTWF0Y2ggPSBmYWxzZTsKLQkJCWZvciAoaW50IGogPSAwOyBqPHJlbW90ZURlZnMubGVuZ3RoOyBqKyspewotCQkJCWlmIChsb2NhbERlZnNbaV0uZ2V0TmFtZSgpLmVxdWFscyhyZW1vdGVEZWZzW2pdLmdldE5hbWUoKSkKLQkJCQkJCSYmIGxvY2FsRGVmc1tpXS5nZXREZXNjKCkuZXF1YWxzKHJlbW90ZURlZnNbal0uZ2V0RGVzYygpKSkKLQkJCQkJaGFzTWF0Y2ggPSB0cnVlOwotCQkJfQotCQkJaWYgKCFoYXNNYXRjaCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCi0KLQkvLyBzdGFydCB0ZXN0aW5nIGNhdGVnb3J5IGRlZmluaXRpb25zCi0JcHVibGljIHZvaWQgdGVzdENhdGVnb3J5RGVmaW5pdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHRvTG9jYWxTaXRlVXJsID0KLQkJCVVwZGF0ZVRlc3RzUGx1Z2luLmdldFBsdWdpbigpLmdldFN0YXRlTG9jYXRpb24oKQotCQkJCSsgIi90ZW1wL3Rlc3RSZW1vdGVFbWJlZGRlZEZlYXR1cmVNaXJyb3IiOwotCQlTdHJpbmcgZnJvbVJlbW90ZVNpdGVVcmwgPQotCQkgICAgICAgIGRhdGFQYXRoCi0JCQkJKyAibWlycm9ycy91cGRhdGUtc2l0ZTQiOwotCQlDYXRlZ29yeURlZmluaXRpb25bXSBsb2NhbERlZnMgPSBnZXRDYXRlZ29yeURlZmluaXRpb25zKHRvTG9jYWxTaXRlVXJsKTsKLQkJQ2F0ZWdvcnlEZWZpbml0aW9uW10gcmVtb3RlRGVmcyA9IGdldENhdGVnb3J5RGVmaW5pdGlvbnMoZnJvbVJlbW90ZVNpdGVVcmwpOwotCQlhc3NlcnRUcnVlKGNoZWNrQ2F0ZWdvcnlEZWZpbml0aW9uc0NvbnRhaW5lZChsb2NhbERlZnMsIHJlbW90ZURlZnMpKTsKLQl9Ci0KLQotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9taXJyb3IvVGVzdFJlbW90ZUZlYXR1cmVWZXJzaW9uTWlycm9yLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9taXJyb3IvVGVzdFJlbW90ZUZlYXR1cmVWZXJzaW9uTWlycm9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkNGNlOTguLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvbWlycm9yL1Rlc3RSZW1vdGVGZWF0dXJlVmVyc2lvbk1pcnJvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5taXJyb3I7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuVXBkYXRlVGVzdHNQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBUZXN0UmVtb3RlRmVhdHVyZVZlcnNpb25NaXJyb3IgZXh0ZW5kcyBNaXJyb3JNYW5hZ2VyVGVzdENhc2UgewotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNNaXJyb3JlZDsKLQkKLQlwdWJsaWMgVGVzdFJlbW90ZUZlYXR1cmVWZXJzaW9uTWlycm9yKFN0cmluZyBhcmcwKSB7Ci0JCXN1cGVyKGFyZzApOwotCQllcnJPdXRwdXQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWlzTWlycm9yZWQgPSBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bVNldFVwKCkgewotCQlTdHJpbmcgZmVhdHVyZUlkID0gInVwZGF0ZS5mZWF0dXJlMSI7Ci0JCVN0cmluZyB2ZXJzaW9uID0gIjEuMC4wIjsKLQkJU3RyaW5nIHRvTG9jYWxTaXRlVXJsID0KLQkJCVVwZGF0ZVRlc3RzUGx1Z2luLmdldFBsdWdpbigpLmdldFN0YXRlTG9jYXRpb24oKQotCQkJCSsgIi90ZW1wL3Rlc3RSZW1vdGVGZWF0dXJlVmVyc2lvbk1pcnJvciI7Ci0JCVN0cmluZyBtaXJyb3JVUkwgPSAiaHR0cDovL3VwZGF0ZS5lY2xpcHNlLm9yZy9teS1taXJyb3ItdXJsIjsKLQkJU3RyaW5nIGZyb21SZW1vdGVTaXRlVXJsID0gImZpbGU6IiArIGRhdGFQYXRoICsgIm1pcnJvcnMvdXBkYXRlLXNpdGUxIjsKLQkJaWYgKCFpc01pcnJvcmVkKSB7Ci0JCQlleGl0VmFsdWUgPQotCQkJCXBlcmZvcm1NaXJyb3IoCi0JCQkJCWdldENvbW1hbmQoZnJvbVJlbW90ZVNpdGVVcmwsdG9Mb2NhbFNpdGVVcmwsIGZlYXR1cmVJZCwgdmVyc2lvbiwgbWlycm9yVVJMKSk7Ci0JCQlpc01pcnJvcmVkID0gdHJ1ZTsKLQkJfQotCX0KLQotCS8vIGVuc3VyZSBleGl0IHdpdGhvdXQgcHJvYmxlbXMKLQlwdWJsaWMgdm9pZCB0ZXN0RXhpdFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnRlc3RFeGl0VmFsdWUoKTsKLQl9Ci0KLQkvLyBlbnN1cmUgYWxsIGNhdGVnb3J5IGRlZmluaXRpb25zIGV4aXN0Ci0JcHVibGljIHZvaWQgdGVzdENhdGVnb3J5RGVmaW5pdGlvbnNFeGlzdCgpIHRocm93cyBFeGNlcHRpb24gewotCQlTdHJpbmcgdG9Mb2NhbFNpdGVVcmwgPQotCQkJVXBkYXRlVGVzdHNQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0U3RhdGVMb2NhdGlvbigpCi0JCQkJKyAiL3RlbXAvdGVzdFJlbW90ZUZlYXR1cmVWZXJzaW9uTWlycm9yIjsKLQkJYXNzZXJ0VHJ1ZShkb2VzQ2F0ZWdvcnlEZWZpbml0aW9uRXhpc3QodG9Mb2NhbFNpdGVVcmwpKTsKLQl9Ci0KLQkvLyBlbnN1cmUgZmVhdHVyZSBleGlzdHMgcGVyIHNpdGUueG1sCi0JcHVibGljIHZvaWQgdGVzdEZlYXR1cmVJblNpdGVYTUxFeGlzdHMoKXsKLQkJU3RyaW5nIHRvTG9jYWxTaXRlVXJsID0KLQkJCVVwZGF0ZVRlc3RzUGx1Z2luLmdldFBsdWdpbigpLmdldFN0YXRlTG9jYXRpb24oKQotCQkJCSsgIi90ZW1wL3Rlc3RSZW1vdGVGZWF0dXJlVmVyc2lvbk1pcnJvciI7Ci0JCVN0cmluZyBmZWF0dXJlSWQgPSAidXBkYXRlLmZlYXR1cmUxIjsKLQkJU3RyaW5nIHZlcnNpb24gPSAiMS4wLjAiOwotCQlhc3NlcnRUcnVlKGNoZWNrRmVhdHVyZUluU2l0ZVhNTEV4aXN0cyh0b0xvY2FsU2l0ZVVybCwgZmVhdHVyZUlkLCB2ZXJzaW9uKSk7Ci0JfQotCQotCS8vIGVuc3VyZSBzaXRlLnhtbCBpcyBnZW5lcmF0ZWQKLQlwdWJsaWMgdm9pZCB0ZXN0U2l0ZVhNTEV4aXN0cygpIHRocm93cyBFeGNlcHRpb24gewotCQlTdHJpbmcgdG9Mb2NhbFNpdGVVcmwgPQotCQkJVXBkYXRlVGVzdHNQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0U3RhdGVMb2NhdGlvbigpCi0JCQkJKyAiL3RlbXAvdGVzdFJlbW90ZUZlYXR1cmVWZXJzaW9uTWlycm9yIjsKLQkJY2hlY2tTaXRlWE1MKHRvTG9jYWxTaXRlVXJsKTsKLQl9Ci0KLQkvLyBlbnN1cmUgcG9saWN5LnhtbCBpcyBnZW5lcmF0ZWQKLQlwdWJsaWMgdm9pZCB0ZXN0UG9saWN5WE1MRXhpc3RzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyB0b0xvY2FsU2l0ZVVybCA9Ci0JCQlVcGRhdGVUZXN0c1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRTdGF0ZUxvY2F0aW9uKCkKLQkJCQkrICIvdGVtcC90ZXN0UmVtb3RlRmVhdHVyZVZlcnNpb25NaXJyb3IiOwotCQljaGVja1BvbGljeVhNTCh0b0xvY2FsU2l0ZVVybCk7Ci0JfQotCQotCS8vIGVuc3VyZSBwb2xpY3kueG1sIHVzZXMgdGhlIGNvcnJlY3QgbWlycm9yVVJMCi0JcHVibGljIHZvaWQgdGVzdFBvbGljeVVSTCgpIHRocm93cyBFeGNlcHRpb257Ci0JCVN0cmluZyB0b0xvY2FsU2l0ZVVybCA9Ci0JCQlVcGRhdGVUZXN0c1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRTdGF0ZUxvY2F0aW9uKCkKLQkJCQkrICIvdGVtcC90ZXN0UmVtb3RlRmVhdHVyZVZlcnNpb25NaXJyb3IiOwotCQlTdHJpbmcgbWlycm9yVVJMID0gImh0dHA6Ly91cGRhdGUuZWNsaXBzZS5vcmcvbXktbWlycm9yLXVybCI7Ci0JCWFzc2VydFRydWUoY2hlY2tQb2xpY3lVUkwodG9Mb2NhbFNpdGVVcmwsIG1pcnJvclVSTCkpOwotCX0KLQotCS8vIGVuc3VyZSBhbGwgamFycyBmb3IgZmVhdHVyZXMgYW5kIHBsdWdpbnMgbWlycm9yZWQKLQlwdWJsaWMgdm9pZCB0ZXN0QWxsSmFyc0V4aXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyB0b0xvY2FsU2l0ZVVybCA9Ci0JCQlVcGRhdGVUZXN0c1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRTdGF0ZUxvY2F0aW9uKCkKLQkJCQkrICIvdGVtcC90ZXN0UmVtb3RlRmVhdHVyZVZlcnNpb25NaXJyb3IiOwotCQlTdHJpbmcgZmVhdHVyZUlkID0gInVwZGF0ZS5mZWF0dXJlMSI7Ci0JCVN0cmluZyB2ZXJzaW9uID0gIjEuMC4wIjsKLQkJU3RyaW5nIGphck5hbWUgPSBmZWF0dXJlSWQgKyAiXyIgKyB2ZXJzaW9uICsgIi5qYXIiOwotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZSh0b0xvY2FsU2l0ZVVybCArICIvZmVhdHVyZXMvIiArIGphck5hbWUpOwotCQlhc3NlcnRUcnVlKGZpbGUuZXhpc3RzKCkpOwotCX0KLQotCS8vIGVuc3VyZSBvdXRwdXQgc3RyaW5nIGJ1ZmZlciBlbmRzIHdpdGggIk1pcnJvciBjb21tYW5kIGNvbXBsZXRlZAotCS8vIHN1Y2Nlc3NmdWxseS4iCi0JLy8gbm90ZTogb3V0cHV0IG1heSBpbnN0ZWFkIGJ5ICJDb21tYW5kIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuIgotCXB1YmxpYyB2b2lkIHRlc3RNaXJyb3JTdWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnRlc3RNaXJyb3JTdWNjZXNzKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9tb2RlbC9BbGxNb2RlbFRlc3RzLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9tb2RlbC9BbGxNb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzYzNmMmYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvbW9kZWwvQWxsTW9kZWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5tb2RlbDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLlVwZGF0ZU1hbmFnZXJUZXN0Q2FzZTsKLQotLyoqCi0gKiBNYW5hZ2VzIHRoZSBBUEkgdGVzdHMKLSAqLwotcHVibGljIGNsYXNzIEFsbE1vZGVsVGVzdHMgZXh0ZW5kcyBVcGRhdGVNYW5hZ2VyVGVzdENhc2UgewotCS8qKgotCSAqIENvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIEFsbE1vZGVsVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCS8qKgotCSAqIExpc3Qgb2YgQVBJIHRlc3RzCi0JICovCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQkJc3VpdGUuc2V0TmFtZSgiTW9kZWwgVGVzdHMiKTsKLQotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoRmVhdHVyZU1haW4uY2xhc3MpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFNpdGVNYWluLmNsYXNzKSk7CQkKLQotCQlyZXR1cm4gc3VpdGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvbW9kZWwvRmVhdHVyZU1haW4uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL21vZGVsL0ZlYXR1cmVNYWluLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmNjE2M2EuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvbW9kZWwvRmVhdHVyZU1haW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLm1vZGVsOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5VcGRhdGVNYW5hZ2VyVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBGZWF0dXJlTWFpbiBleHRlbmRzIFVwZGF0ZU1hbmFnZXJUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgRmVhdHVyZU1haW4oU3RyaW5nIHRlc3RjYXNlKXsKLQkJc3VwZXIodGVzdGNhc2UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNYWluKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQotCQlGZWF0dXJlTW9kZWxGYWN0b3J5IGZhY3RvcnkgPSBuZXcgRmVhdHVyZU1vZGVsRmFjdG9yeSgpOwotCQlJbnB1dFN0cmVhbSBpcyA9IG51bGw7Ci0JCUZlYXR1cmVNb2RlbCBmZWF0dXJlID0gbnVsbDsKLQkJCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiUGFyc2luZyBmZWF0dXJlIC4uLiIpOwotCQl0cnkgewotCQkJaXMgPSBGZWF0dXJlTWFpbi5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKCJmZWF0dXJlLnhtbCIpOwkJCi0JCQlmZWF0dXJlID0gZmFjdG9yeS5wYXJzZUZlYXR1cmUoaXMpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKGlzICE9IG51bGwpIHsKLQkJCQl0cnkgeyBpcy5jbG9zZSgpO30gY2F0Y2goSU9FeGNlcHRpb24gZSkge30KLQkJCX0KLQkJfQotCQkKLQkJU3RyaW5nIGJhc2UgPSAiaHR0cDovL2Fub3RoZXIuc2VydmVyL2ZlYXR1cmUueG1sIjsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJSZXNvbHZpbmcgZmVhdHVyZSB1c2luZyAiK2Jhc2UrIiAuLi4iKTsKLQkJUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJvcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvbW9kZWwvdGVzdCIpOwotCQlmZWF0dXJlLnJlc29sdmUobmV3IFVSTChiYXNlKSwgbmV3IFVSTChiYXNlKSk7Ci0JfQotCQotLy8JcHJpdmF0ZSBzdGF0aWMgdm9pZCB3cml0ZUZlYXR1cmUoUHJpbnRXcml0ZXIgdywgaW50IGxldmVsLCBGZWF0dXJlTW9kZWwgZmVhdHVyZSkgewotLy8JCWlmIChmZWF0dXJlID09IG51bGwpIHJldHVybjsKLS8vCQkKLS8vCQlTdHJpbmcgaW4gPSBnZXRJbmRlbnQobGV2ZWwpOwotLy8JCXcucHJpbnRsbihpbisiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+Iik7Ci0vLwkJCi0vLwkJdy5wcmludGxuKGluKyI8ZmVhdHVyZSIpOwotLy8JCXcucHJpbnRsbihpbisiICAgIisiaWQ9XCIiK2ZlYXR1cmUuZ2V0RmVhdHVyZUlkZW50aWZpZXIoKSsiXCIiKTsKLS8vCQl3LnByaW50bG4oaW4rIiAgICIrInZlcnNpb249XCIiK2ZlYXR1cmUuZ2V0RmVhdHVyZVZlcnNpb24oKSsiXCIiKTsKLS8vCQl3LnByaW50bG4oaW4rIiAgICIrImxhYmVsPVwiIitmZWF0dXJlLmdldExhYmVsKCkrIlwiIik7Ci0vLwkJdy5wcmludGxuKGluKyIgICAiKyJwcm92aWRlci1uYW1lPVwiIitmZWF0dXJlLmdldFByb3ZpZGVyKCkrIlwiIik7Ci0vLwkJdy5wcmludGxuKGluKyIgICAiKyJpbWFnZT1cIiIrZmVhdHVyZS5nZXRJbWFnZVVSTFN0cmluZygpKyJcIiAtPiAiK2ZlYXR1cmUuZ2V0SW1hZ2VVUkwoKSk7Ci0vLwkJdy5wcmludGxuKGluKyIgICAiKyJvcz1cIiIrZmVhdHVyZS5nZXRPUygpKyJcIiIpOwotLy8JCXcucHJpbnRsbihpbisiICAgIisid3M9XCIiK2ZlYXR1cmUuZ2V0V1MoKSsiXCIiKTsKLS8vCQl3LnByaW50bG4oaW4rIiAgICIrIm5sPVwiIitmZWF0dXJlLmdldE5MKCkrIlwiIik7Ci0vLwkJdy5wcmludGxuKGluKyIgICAiKyJhcHBsaWNhdGlvbj1cIiIrZmVhdHVyZS5nZXRBcHBsaWNhdGlvbigpKyJcIiIpOwotLy8JCXcucHJpbnRsbihpbisiICAgIisiPiIpOwotLy8JCQotLy8JCXdyaXRlRGVzY3JpcHRpb24odywgbGV2ZWwrMSwgZmVhdHVyZS5nZXREZXNjcmlwdGlvbk1vZGVsKCkpOwotLy8JCXdyaXRlQ29weXJpZ2h0KHcsIGxldmVsKzEsIGZlYXR1cmUuZ2V0Q29weXJpZ2h0TW9kZWwoKSk7Ci0vLwkJd3JpdGVMaWNlbnNlKHcsIGxldmVsKzEsIGZlYXR1cmUuZ2V0TGljZW5zZU1vZGVsKCkpOwotLy8JCXdyaXRlVVJMcyh3LCBsZXZlbCsxLCBmZWF0dXJlKTsKLS8vCQl3cml0ZVByZXJlcXModywgbGV2ZWwrMSwgZmVhdHVyZSk7Ci0vLwkJd3JpdGVQbHVnaW5FbnRyaWVzKHcsIGxldmVsKzEsIGZlYXR1cmUpOwotLy8JCXdyaXRlTm9uUGx1Z2luRW50cmllcyh3LCBsZXZlbCsxLCBmZWF0dXJlKTsKLS8vCQkgICAgICAgICAKLS8vICAgICAgICB3LnByaW50bG4oaW4rIjwvZmVhdHVyZT4iKTsKLS8vCX0KLS8vCQotLy8JcHJpdmF0ZSBzdGF0aWMgdm9pZCB3cml0ZURlc2NyaXB0aW9uKFByaW50V3JpdGVyIHcsIGludCBsZXZlbCwgVVJMRW50cnlNb2RlbCB1ZSkgewotLy8JCVN0cmluZyBpbiA9IGdldEluZGVudChsZXZlbCk7Ci0vLwkJdy5wcmludGxuKCIiKTsKLS8vCQl3LnByaW50bG4oaW4rIjxkZXNjcmlwdGlvbiB1cmw9XCIiK3VlLmdldFVSTFN0cmluZygpKyJcIiAtPiAiK3VlLmdldFVSTCgpKyI+Iik7Ci0vLwkJdy5wcmludGxuKGluK3VlLmdldEFubm90YXRpb24oKSk7Ci0vLwkJdy5wcmludGxuKGluKyI8L2Rlc2NyaXB0aW9uPiIpOwotLy8JfQotLy8JCi0vLwlwcml2YXRlIHN0YXRpYyB2b2lkIHdyaXRlQ29weXJpZ2h0KFByaW50V3JpdGVyIHcsIGludCBsZXZlbCwgVVJMRW50cnlNb2RlbCB1ZSkgewotLy8JCVN0cmluZyBpbiA9IGdldEluZGVudChsZXZlbCk7Ci0vLwkJdy5wcmludGxuKCIiKTsKLS8vCQl3LnByaW50bG4oaW4rIjxjb3B5cmlnaHQgdXJsPVwiIit1ZS5nZXRVUkxTdHJpbmcoKSsiXCIgLT4gIit1ZS5nZXRVUkwoKSsiPiIpOwotLy8JCXcucHJpbnRsbihpbit1ZS5nZXRBbm5vdGF0aW9uKCkpOwotLy8JCXcucHJpbnRsbihpbisiPC9jb3B5cmlnaHQ+Iik7Ci0vLwl9Ci0vLwkKLS8vCXByaXZhdGUgc3RhdGljIHZvaWQgd3JpdGVMaWNlbnNlKFByaW50V3JpdGVyIHcsIGludCBsZXZlbCwgVVJMRW50cnlNb2RlbCB1ZSkgewotLy8JCVN0cmluZyBpbiA9IGdldEluZGVudChsZXZlbCk7Ci0vLwkJdy5wcmludGxuKCIiKTsKLS8vCQl3LnByaW50bG4oaW4rIjxsaWNlbnNlIHVybD1cIiIrdWUuZ2V0VVJMU3RyaW5nKCkrIlwiIC0+ICIrdWUuZ2V0VVJMKCkrIj4iKTsKLS8vCQl3LnByaW50bG4oaW4rdWUuZ2V0QW5ub3RhdGlvbigpKTsKLS8vCQl3LnByaW50bG4oaW4rIjwvbGljZW5zZT4iKTsKLS8vCX0KLS8vCQotLy8JcHJpdmF0ZSBzdGF0aWMgdm9pZCB3cml0ZVVSTHMoUHJpbnRXcml0ZXIgdywgaW50IGxldmVsLCBGZWF0dXJlTW9kZWwgZmVhdHVyZSkgewotLy8JCVN0cmluZyBpbiA9IGdldEluZGVudChsZXZlbCk7Ci0vLwkJU3RyaW5nIGluMiA9IGdldEluZGVudChsZXZlbCsxKTsKLS8vCQl3LnByaW50bG4oIiIpOwotLy8JCXcucHJpbnRsbihpbisiPHVybD4iKTsKLS8vCQkKLS8vCQlVUkxFbnRyeU1vZGVsIHVwZGF0ZSA9IGZlYXR1cmUuZ2V0VXBkYXRlU2l0ZUVudHJ5TW9kZWwoKTsKLS8vCQl3LnByaW50bG4oaW4yKyI8dXBkYXRlIik7Ci0vLwkJdy5wcmludGxuKGluMisiICAgIisidXJsPVwiIit1cGRhdGUuZ2V0VVJMU3RyaW5nKCkrIlwiIC0+ICIrdXBkYXRlLmdldFVSTCgpKTsKLS8vCQl3LnByaW50bG4oaW4yKyIgICAiKyJsYWJlbD1cIiIrdXBkYXRlLmdldEFubm90YXRpb24oKSsiXCIiKTsKLS8vCQl3LnByaW50bG4oaW4yKyIgICAiKyIvPiIpOwotLy8JCQotLy8JCVVSTEVudHJ5TW9kZWxbXSBkaXNjb3ZlcnkgPSBmZWF0dXJlLmdldERpc2NvdmVyeVNpdGVFbnRyeU1vZGVscygpOwotLy8JCWZvciAoaW50IGk9MDsgaTxkaXNjb3ZlcnkubGVuZ3RoOyBpKyspIHsKLS8vCQkJdy5wcmludGxuKGluMisiPGRpc2NvdmVyeSIpOwotLy8JCQl3LnByaW50bG4oaW4yKyIgICAiKyJ1cmw9XCIiK2Rpc2NvdmVyeVtpXS5nZXRVUkxTdHJpbmcoKSsiXCIgLT4gIitkaXNjb3ZlcnlbaV0uZ2V0VVJMKCkpOwotLy8JCQl3LnByaW50bG4oaW4yKyIgICAiKyJsYWJlbD1cIiIrZGlzY292ZXJ5W2ldLmdldEFubm90YXRpb24oKSsiXCIiKTsKLS8vCQkJdy5wcmludGxuKGluMisiICAgIisiLz4iKTsKLS8vCQl9Ci0vLwkJCi0vLwkJdy5wcmludGxuKGluKyI8L3VybD4iKTsKLS8vCX0KLS8vCQotLy8JcHJpdmF0ZSBzdGF0aWMgdm9pZCB3cml0ZVByZXJlcXMoUHJpbnRXcml0ZXIgdywgaW50IGxldmVsLCBGZWF0dXJlTW9kZWwgZmVhdHVyZSkgewotLy8JCVN0cmluZyBpbiA9IGdldEluZGVudChsZXZlbCk7Ci0vLwkJU3RyaW5nIGluMiA9IGdldEluZGVudChsZXZlbCsxKTsKLS8vCQl3LnByaW50bG4oIiIpOwotLy8JCXcucHJpbnRsbihpbisiPHJlcXVpcmVzPiIpOwotLy8JCQotLy8JCUltcG9ydE1vZGVsW10gaW1wID0gZmVhdHVyZS5nZXRJbXBvcnRNb2RlbHMoKTsKLS8vCQlmb3IgKGludCBpPTA7IGk8aW1wLmxlbmd0aDsgaSsrKSB7Ci0vLwkJCXcucHJpbnRsbihpbjIrIjxpbXBvcnQiKTsKLS8vCQkJdy5wcmludGxuKGluMisiICAgIisicGx1Z2luPVwiIitpbXBbaV0uZ2V0SWRlbnRpZmllcigpKyJcIiIpOwotLy8JCQl3LnByaW50bG4oaW4yKyIgICAiKyJ2ZXJzaW9uPVwiIitpbXBbaV0uZ2V0VmVyc2lvbigpKyJcIiIpOwotLy8JCQl3LnByaW50bG4oaW4yKyIgICAiKyJtYXRjaD1cIiIraW1wW2ldLmdldE1hdGNoaW5nUnVsZU5hbWUoKSsiXCIiKTsKLS8vCQkJdy5wcmludGxuKGluMisiICAgIisiLz4iKTsKLS8vCQl9Ci0vLwkJCi0vLwkJdy5wcmludGxuKGluKyI8L3JlcXVpcmVzPiIpOwotLy8JfQotLy8JCi0vLwlwcml2YXRlIHN0YXRpYyB2b2lkIHdyaXRlUGx1Z2luRW50cmllcyhQcmludFdyaXRlciB3LCBpbnQgbGV2ZWwsIEZlYXR1cmVNb2RlbCBmZWF0dXJlKSB7Ci0vLwkJU3RyaW5nIGluID0gZ2V0SW5kZW50KGxldmVsKTsKLS8vCQl3LnByaW50bG4oIiIpOwotLy8JCQotLy8JCVBsdWdpbkVudHJ5TW9kZWxbXSBwbHVnaW4gPSBmZWF0dXJlLmdldFBsdWdpbkVudHJ5TW9kZWxzKCk7Ci0vLwkJZm9yIChpbnQgaT0wOyBpPHBsdWdpbi5sZW5ndGg7IGkrKykgewotLy8JCQl3LnByaW50bG4oaW4rIjxwbHVnaW4iKTsKLS8vCQkJdy5wcmludGxuKGluKyIgICAiKyJpZD1cIiIrcGx1Z2luW2ldLmdldFBsdWdpbklkZW50aWZpZXIoKSsiXCIiKTsKLS8vCQkJdy5wcmludGxuKGluKyIgICAiKyJ2ZXJzaW9uPVwiIitwbHVnaW5baV0uZ2V0UGx1Z2luVmVyc2lvbigpKyJcIiIpOwotLy8JCQl3LnByaW50bG4oaW4rIiAgICIrImZyYWdtZW50PVwiIitwbHVnaW5baV0uaXNGcmFnbWVudCgpKyJcIiIpOwotLy8JCQl3LnByaW50bG4oaW4rIiAgICIrIm9zPVwiIitwbHVnaW5baV0uZ2V0T1MoKSsiXCIiKTsKLS8vCQkJdy5wcmludGxuKGluKyIgICAiKyJ3cz1cIiIrcGx1Z2luW2ldLmdldFdTKCkrIlwiIik7Ci0vLwkJCXcucHJpbnRsbihpbisiICAgIisibmw9XCIiK3BsdWdpbltpXS5nZXROTCgpKyJcIiIpOwotLy8JCQl3LnByaW50bG4oaW4rIiAgICIrImRvd25sb2FkLXNpemU9XCIiK3BsdWdpbltpXS5nZXREb3dubG9hZFNpemUoKSsiXCIiKTsKLS8vCQkJdy5wcmludGxuKGluKyIgICAiKyJpbnN0YWxsLXNpemU9XCIiK3BsdWdpbltpXS5nZXRJbnN0YWxsU2l6ZSgpKyJcIiIpOwotLy8JCQl3LnByaW50bG4oaW4rIiAgICIrIi8+Iik7Ci0vLwkJfQotLy8JfQotLy8JCi0vLwlwcml2YXRlIHN0YXRpYyB2b2lkIHdyaXRlTm9uUGx1Z2luRW50cmllcyhQcmludFdyaXRlciB3LCBpbnQgbGV2ZWwsIEZlYXR1cmVNb2RlbCBmZWF0dXJlKSB7Ci0vLwkJU3RyaW5nIGluID0gZ2V0SW5kZW50KGxldmVsKTsKLS8vCQl3LnByaW50bG4oIiIpOwotLy8JCQotLy8JCU5vblBsdWdpbkVudHJ5TW9kZWxbXSBkYXRhID0gZmVhdHVyZS5nZXROb25QbHVnaW5FbnRyeU1vZGVscygpOwotLy8JCWZvciAoaW50IGk9MDsgaTxkYXRhLmxlbmd0aDsgaSsrKSB7Ci0vLwkJCXcucHJpbnRsbihpbisiPGRhdGEiKTsKLS8vCQkJdy5wcmludGxuKGluKyIgICAiKyJpZD1cIiIrZGF0YVtpXS5nZXRJZGVudGlmaWVyKCkrIlwiIik7Ci0vLwkJCXcucHJpbnRsbihpbisiICAgIisiZG93bmxvYWQtc2l6ZT1cIiIrZGF0YVtpXS5nZXREb3dubG9hZFNpemUoKSsiXCIiKTsKLS8vCQkJdy5wcmludGxuKGluKyIgICAiKyJpbnN0YWxsLXNpemU9XCIiK2RhdGFbaV0uZ2V0SW5zdGFsbFNpemUoKSsiXCIiKTsKLS8vCQkJdy5wcmludGxuKGluKyIgICAiKyIvPiIpOwotLy8JCX0KLS8vCX0KLS8vCQotLy8JCi0vLwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0SW5kZW50KGludCBsZXZlbCkgewotLy8JCVN0cmluZyBpbmRlbnQgPSAiIjsKLS8vCQlmb3IgKGludCBpPTA7IGk8bGV2ZWw7IGkrKykgCi0vLwkJCWluZGVudCArPSAiICAgIjsKLS8vCQlyZXR1cm4gaW5kZW50OwotLy8JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvbW9kZWwvU2l0ZU1haW4uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL21vZGVsL1NpdGVNYWluLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlMmE5MjEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvbW9kZWwvU2l0ZU1haW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLm1vZGVsOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLlNpdGVGZWF0dXJlUmVmZXJlbmNlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuVXBkYXRlTWFuYWdlclRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgU2l0ZU1haW4gZXh0ZW5kcyBVcGRhdGVNYW5hZ2VyVGVzdENhc2UgewotCQotCXB1YmxpYyBTaXRlTWFpbihTdHJpbmcgbmFtZSl7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNYWluKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQotCQlTdHJpbmdXcml0ZXIgc3RyV3JpdGVyPW5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJUHJpbnRXcml0ZXIgdyA9IG5ldyBQcmludFdyaXRlcihzdHJXcml0ZXIpOwotCi0JCXByb2Nlc3MoInNpdGVfb2xkX2Zvcm1hdC54bWwiLHcpOwotCQlwcm9jZXNzKCJzaXRlLnhtbCIsdyk7Ci0JCXRyeSB7Ci0JCQlwcm9jZXNzKCJzaXRlX3dpdGhfdHlwZS54bWwiLHcpOwotCQkJZmFpbCgiSW52YWxpZFNpdGVUeXBlRXhjZXB0aW9uIG5vdCB0aHJvd24iKTsKLQkJfSBjYXRjaCAoSW52YWxpZFNpdGVUeXBlRXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydEVxdWFscyhlLmdldE5ld1R5cGUoKSwic29tZS5vdGhlci5zaXRlLnR5cGUiKTsKLQkJfSBmaW5hbGx5IHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihzdHJXcml0ZXIpOwotCQkJdy5jbG9zZSgpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgcHJvY2VzcyhTdHJpbmcgeG1sLCBQcmludFdyaXRlciB3KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCi0JCVNpdGVNb2RlbEZhY3RvcnkgZmFjdG9yeSA9IG5ldyBTaXRlTW9kZWxGYWN0b3J5KCk7Ci0JCUlucHV0U3RyZWFtIGlzID0gbnVsbDsKLQkJU2l0ZU1vZGVsIHNpdGUgPSBudWxsOwotCQkKLQkJdy5wcmludGxuKCIiKTsKLQkJdy5wcmludGxuKCJQYXJzaW5nIHNpdGUgbWFwIC4uLiIpOwotCQl0cnkgewotCQkJaXMgPSBTaXRlTWFpbi5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKHhtbCk7CQkKLQkJCXNpdGUgPSBmYWN0b3J5LnBhcnNlU2l0ZShpcyk7Ci0JCX0gIGZpbmFsbHkgewotCQkJaWYgKGlzICE9IG51bGwpIHsKLQkJCQl0cnkgeyBpcy5jbG9zZSgpO30gY2F0Y2goSU9FeGNlcHRpb24gZSkge30KLQkJCX0KLQkJfQotCQkKLQkJaWYgKHNpdGUgPT0gbnVsbCkgcmV0dXJuOwotCQkKLQkJU3RyaW5nIGJhc2UgPSAiaHR0cDovL2Fub3RoZXIuc2VydmVyL3NpdGUueG1sIjsKLQkJdy5wcmludGxuKCJSZXNvbHZpbmcgc2l0ZSB1c2luZyAiK2Jhc2UrIiAuLi4iKTsKLQkJc2l0ZS5yZXNvbHZlKG5ldyBVUkwoYmFzZSksIG51bGwpOwotCQkKLQkJdy5wcmludGxuKCJXcml0aW5nIHNpdGUgLi4uIik7Ci0JCXdyaXRlU2l0ZSh3LDAsc2l0ZSk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgd3JpdGVTaXRlKFByaW50V3JpdGVyIHcsIGludCBsZXZlbCwgU2l0ZU1vZGVsIHNpdGUpIHsKLQkJaWYgKHNpdGUgPT0gbnVsbCkgcmV0dXJuOwotCQkKLQkJU3RyaW5nIGluID0gZ2V0SW5kZW50KGxldmVsKTsKLQkJdy5wcmludGxuKGluKyI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz4iKTsKLQkJCi0JCXcucHJpbnRsbihpbisiPHNpdGUiKTsKLQkJdy5wcmludGxuKGluKyIgICAiKyJ0eXBlPVwiIitzaXRlLmdldFR5cGUoKSsiXCIiKTsKLQkJdy5wcmludGxuKGluKyIgICAiKyI+Iik7Ci0JCQotCQl3cml0ZURlc2NyaXB0aW9uKHcsIGxldmVsKzEsIHNpdGUuZ2V0RGVzY3JpcHRpb25Nb2RlbCgpKTsKLQkJd3JpdGVGZWF0dXJlcyh3LCBsZXZlbCsxLCBzaXRlKTsKLQkJd3JpdGVBcmNoaXZlcyh3LCBsZXZlbCsxLCBzaXRlKTsKLQkJd3JpdGVDYXRlZ29yeURlZnModywgbGV2ZWwrMSwgc2l0ZSk7Ci0gICAgICAgICAKLSAgICAgICAgdy5wcmludGxuKGluKyI8L2ZlYXR1cmU+Iik7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgd3JpdGVEZXNjcmlwdGlvbihQcmludFdyaXRlciB3LCBpbnQgbGV2ZWwsIFVSTEVudHJ5TW9kZWwgdWUpIHsKLQkJaWYgKHVlID09IG51bGwpIHJldHVybjsKLQkJU3RyaW5nIGluID0gZ2V0SW5kZW50KGxldmVsKTsKLQkJdy5wcmludGxuKCIiKTsKLQkJdy5wcmludGxuKGluKyI8ZGVzY3JpcHRpb24gdXJsPVwiIit1ZS5nZXRVUkxTdHJpbmcoKSsiXCIgLT4gIit1ZS5nZXRVUkwoKSsiPiIpOwotCQl3LnByaW50bG4oaW4rdWUuZ2V0QW5ub3RhdGlvbigpKTsKLQkJdy5wcmludGxuKGluKyI8L2Rlc2NyaXB0aW9uPiIpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIHdyaXRlRmVhdHVyZXMoUHJpbnRXcml0ZXIgdywgaW50IGxldmVsLCBTaXRlTW9kZWwgc2l0ZSkgewotCQlTdHJpbmcgaW4gPSBnZXRJbmRlbnQobGV2ZWwpOwotCQlnZXRJbmRlbnQobGV2ZWwrMSk7Ci0JCXcucHJpbnRsbigiIik7Ci0JCQotCQlTaXRlRmVhdHVyZVJlZmVyZW5jZU1vZGVsW10gZmVhdHVyZXMgPSBzaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VNb2RlbHMoKTsKLQkJZm9yIChpbnQgaT0wOyBpPGZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7Ci0JCQl3LnByaW50bG4oaW4rIjxmZWF0dXJlIik7Ci0JCQl3LnByaW50bG4oaW4rIiAgICIrInR5cGU9XCIiK2ZlYXR1cmVzW2ldLmdldFR5cGUoKSsiXCIiKTsKLQkJCXcucHJpbnRsbihpbisiICAgIisidXJsPVwiIitmZWF0dXJlc1tpXS5nZXRVUkxTdHJpbmcoKSsiXCIgLT4gIitmZWF0dXJlc1tpXS5nZXRVUkwoKSk7Ci0JCQl3LnByaW50bG4oaW4rIiAgICIrIj4iKTsKLQkJCXdyaXRlQ2F0ZWdvcmllcyh3LCBsZXZlbCsxLCBmZWF0dXJlc1tpXSk7Ci0JCQl3LnByaW50bG4oaW4rIjwvZmVhdHVyZT4iKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIHdyaXRlQXJjaGl2ZXMoUHJpbnRXcml0ZXIgdywgaW50IGxldmVsLCBTaXRlTW9kZWwgc2l0ZSkgewotCQlTdHJpbmcgaW4gPSBnZXRJbmRlbnQobGV2ZWwpOwotCQl3LnByaW50bG4oIiIpOwotCQkKLQkJQXJjaGl2ZVJlZmVyZW5jZU1vZGVsW10gYXJjaGl2ZSA9IHNpdGUuZ2V0QXJjaGl2ZVJlZmVyZW5jZU1vZGVscygpOwotCQlmb3IgKGludCBpPTA7IGk8YXJjaGl2ZS5sZW5ndGg7IGkrKykgewotCQkJdy5wcmludGxuKGluKyI8YXJjaGl2ZSIpOwotCQkJdy5wcmludGxuKGluKyIgICAiKyJwYXRoPVwiIithcmNoaXZlW2ldLmdldFBhdGgoKSsiXCIiKTsKLQkJCXcucHJpbnRsbihpbisiICAgIisidXJsPVwiIithcmNoaXZlW2ldLmdldFVSTFN0cmluZygpKyJcIiAtPiAiK2FyY2hpdmVbaV0uZ2V0VVJMKCkpOwotCQkJdy5wcmludGxuKGluKyIgICAiKyIvPiIpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgd3JpdGVDYXRlZ29yeURlZnMoUHJpbnRXcml0ZXIgdywgaW50IGxldmVsLCBTaXRlTW9kZWwgc2l0ZSkgewotCQlTdHJpbmcgaW4gPSBnZXRJbmRlbnQobGV2ZWwpOwotCQlnZXRJbmRlbnQobGV2ZWwrMSk7Ci0JCXcucHJpbnRsbigiIik7Ci0JCQotCQlDYXRlZ29yeU1vZGVsW10gY2F0ID0gc2l0ZS5nZXRDYXRlZ29yeU1vZGVscygpOwotCQlmb3IgKGludCBpPTA7IGk8Y2F0Lmxlbmd0aDsgaSsrKSB7Ci0JCQl3LnByaW50bG4oaW4rIjxjYXRlZ29yeS1kZWYiKTsKLQkJCXcucHJpbnRsbihpbisiICAgIisibmFtZT1cIiIrY2F0W2ldLmdldE5hbWUoKSsiXCIiKTsKLQkJCXcucHJpbnRsbihpbisiICAgIisibGFiZWw9XCIiK2NhdFtpXS5nZXRMYWJlbCgpKyJcIiIpOwotCQkJdy5wcmludGxuKGluKyIgICAiKyI+Iik7Ci0JCQl3cml0ZURlc2NyaXB0aW9uKHcsIGxldmVsKzEsIGNhdFtpXS5nZXREZXNjcmlwdGlvbk1vZGVsKCkpOwotCQkJdy5wcmludGxuKGluKyI8L2NhdGVnb3J5LWRlZj4iKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIHdyaXRlQ2F0ZWdvcmllcyhQcmludFdyaXRlciB3LCBpbnQgbGV2ZWwsIFNpdGVGZWF0dXJlUmVmZXJlbmNlTW9kZWwgZmVhdHVyZSkgewotCQlTdHJpbmcgaW4gPSBnZXRJbmRlbnQobGV2ZWwpOwotCQlTdHJpbmdbXSBjYXQgPSBmZWF0dXJlLmdldENhdGVnb3J5TmFtZXMoKTsKLQkJZm9yIChpbnQgaT0wOyBpPGNhdC5sZW5ndGg7IGkrKykgewotCQkJdy5wcmludGxuKGluKyI8Y2F0ZWdvcnkgbmFtZT1cIiIrY2F0W2ldKyJcIiIpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRJbmRlbnQoaW50IGxldmVsKSB7Ci0JCVN0cmluZyBpbmRlbnQgPSAiIjsKLQkJZm9yIChpbnQgaT0wOyBpPGxldmVsOyBpKyspIAotCQkJaW5kZW50ICs9ICIgICAiOwotCQlyZXR1cm4gaW5kZW50OwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvbW9kZWwvZmVhdHVyZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9tb2RlbC9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJkMjY5Mi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9tb2RlbC9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTxmZWF0dXJlIGlkPSJteS5mZWF0dXJlIiB2ZXJzaW9uPSIzLjcuMSIgbGFiZWw9IiVzMSIgcHJvdmlkZXItbmFtZT0iVksgSW5jLiIKLSAgICAgICAgIGltYWdlPSJpbWFnZXMvZmVhdHVyZS5naWYiIG9zPSJXaW4zMiIgd3M9IldpbjMyIiBubD0iZW5fQ0EsZW5fVVMiCi0gICAgICAgICBhcHBsaWNhdGlvbj0ib3JnLmVjbGlwc2UudWkud29ya2JlbmNoIj4KLQotICAgPGluc3RhbGwtaGFuZGxlciB1cmw9Imluc3RhbGwvaGFuZGxlci5odG1sIiBsaWJyYXJ5PSJjdXN0b20uamFyIiBjbGFzcz0iSW5zdGFsbEhhbmRsZXIiLz4KLSAgIAotICAgPGRlc2NyaXB0aW9uIHVybD0iaHR0cDovL3d3dy50b29scy5jb20vZmVhdHVyZXMvbXkuZmVhdHVyZSI+Ci0gICAgICBEZXNjcmlwdGlvbiBvZiBteS5mZWF0dXJlCi0gICA8L2Rlc2NyaXB0aW9uPgotICAgCi0gICA8Y29weXJpZ2h0IHVybD0iY29weXJpZ2h0L215LmZlYXR1cmUiPgotICAgICAgQ29weXJpZ2h0IGZvciBteS5mZWF0dXJlCi0gICA8L2NvcHlyaWdodD4KLSAgIAotICAgPGxpY2Vuc2UgdXJsPSIldXJsMSI+Ci0gICAgICBMaWNlbnNlIGZvciBteS5mZWF0dXJlCi0gICA8L2xpY2Vuc2U+Ci0gICAKLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIHVybD0iaHR0cDovL3d3dy50b29scy5jb20vdXBkYXRlIiBsYWJlbD0iVXBkYXRlIHNpdGUiLz4KLSAgICAgIDxkaXNjb3ZlcnkgdXJsPSJodHRwOi8vd3d3LnRvb2xzLmNvbS9kaXNjb3ZlcnkxIiBsYWJlbD0iJXMyIi8+Ci0gICAgICA8ZGlzY292ZXJ5IHVybD0iJXVybDIiIGxhYmVsPSIlczMgRGlzY292ZXJ5IHNpdGUgMiIvPgotICAgICAgPGRpc2NvdmVyeSB1cmw9IiV1cmwzIGh0dHA6Ly93d3cudG9vbHMuY29tL2Rpc2NvdmVyeTMiIGxhYmVsPSJEaXNjb3Zlcnkgc2l0ZSAzIi8+Ci0gICA8L3VybD4KLSAgIAotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBwbHVnaW49InBsdWdpbi4xIiB2ZXJzaW9uPSIxLjAuMCIgbWF0Y2g9InBlcmZlY3QiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJwbHVnaW4uMiIgdmVyc2lvbj0iMy4yLjAiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJwbHVnaW4uMyIvPgotICAgPC9yZXF1aXJlcz4KLSAgIAotICAgPHBsdWdpbiBpZD0ibXkucGx1Z2luLjEiIHZlcnNpb249IjEuMC4wIiBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgICAgb3M9IldpbjMyIiB3cz0iV2luMzIiIG5sPSJlbl9VUyIgZG93bmxvYWQtc2l6ZT0iMjM0NTYiIGluc3RhbGwtc2l6ZT0iMTIzNDU2NyIvPgotICAgPHBsdWdpbiBpZD0ibXkucGx1Z2luLjIiIHZlcnNpb249IjEuMC4xIi8+Ci0gICA8cGx1Z2luIGlkPSJteS5wbHVnaW4uMyIgdmVyc2lvbj0iMS4wLjIiLz4KLSAgIAotICAgPGRhdGEgaWQ9ImV4YW1wbGVzLnppcCIgZG93bmxvYWQtc2l6ZT0iMjM0NTYiIGluc3RhbGwtc2l6ZT0iMTIzNDU2NyIvPgotICAgPGRhdGEgaWQ9ImN1c3RvbS9ydC5qYXIiLz4KLQotPC9mZWF0dXJlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL21vZGVsL3NpdGUueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvbW9kZWwvc2l0ZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2NzQ4NDUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvbW9kZWwvc2l0ZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08c2l0ZT4KLQotICAgPGRlc2NyaXB0aW9uIHVybD0iaHR0cDovL3d3dy50b29scy5jb20vdXBkYXRlU2l0ZSI+Ci0gICAgICBTaXRlIGRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8ZmVhdHVyZSB0eXBlPSJteS5mZWF0dXJlLnR5cGUiIHVybD0iZmVhdHVyZTEuamFyIj4KLSAgICAgIDxjYXRlZ29yeSBuYW1lPSJ0b29scyIvPgotICAgICAgPGNhdGVnb3J5IG5hbWU9InV0aWxpdGllcyIvPgotICAgICAgPGNhdGVnb3J5IG5hbWU9IndpbmRvd3MudG9vbHMiLz4KLSAgIDwvZmVhdHVyZT4KLSAgIAotICAgPGZlYXR1cmUgdHlwZT0iIiB1cmw9ImZpbGU6L2ZlYXR1cmUyLmphciI+Ci0gICAgICA8Y2F0ZWdvcnkgbmFtZT0idXRpbGl0aWVzIi8+Ci0gICA8L2ZlYXR1cmU+Ci0gICAKLSAgIAotICAgPGFyY2hpdmUgcGF0aD0iZmlyc3QvYXJjaGl2ZSIgdXJsPSJhcmNoaXZlMS5qYXIiLz4KLSAgIDxhcmNoaXZlIHBhdGg9InNlY29uZC9hcmNoaXZlIiB1cmw9ImFyY2hpdmUyLmphciIvPgotICAgCi0gICA8Y2F0ZWdvcnktZGVmIG5hbWU9InRvb2xzIiBsYWJlbD0iRGV2ZWxvcG1lbnQgVG9vbHMiPgotICAgICAgPGRlc2NyaXB0aW9uIHVybD0iaHR0cDovL3d3dy50b29scy5jb20vdG9vbHMiPgotICAgICAgICAgVGhpcyBpcyBkZXNjcmlwdGlvbiBmb3IgdG9vbHMKLSAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICA8L2NhdGVnb3J5LWRlZj4KLSAgIAotICAgPGNhdGVnb3J5LWRlZiBuYW1lPSJ1dGlsaXRpZXMiIGxhYmVsPSJVdGlsaXRpZXMiPgotICAgICAgPGRlc2NyaXB0aW9uIHVybD0idG9vbHMuaHRtbCIvPi8KLSAgIDwvY2F0ZWdvcnktZGVmPgotICAgCi0gICA8Y2F0ZWdvcnktZGVmIG5hbWU9IndpbmRvd3MudG9vbHMiIGxhYmVsPSJXaW5kb3dzIERldmVsb3BtZW50IFRvb2xzIi8+Ci0KLTwvc2l0ZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9tb2RlbC9zaXRlX29sZF9mb3JtYXQueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvbW9kZWwvc2l0ZV9vbGRfZm9ybWF0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJjOWM4MS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9tb2RlbC9zaXRlX29sZF9mb3JtYXQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPHNpdGUgdXJsPSJ3d3cudG9vbHMuY29tL3VwZGF0ZVNpdGUiPgotCi0gICA8ZmVhdHVyZSB0eXBlPSJteS5mZWF0dXJlLnR5cGUiIHVybD0iZmVhdHVyZTEuamFyIj4KLSAgICAgIDxjYXRlZ29yeSBuYW1lPSJ0b29scyIvPgotICAgICAgPGNhdGVnb3J5IG5hbWU9InV0aWxpdGllcyIvPgotICAgICAgPGNhdGVnb3J5IG5hbWU9IndpbmRvd3MudG9vbHMiLz4KLSAgIDwvZmVhdHVyZT4KLSAgIAotICAgPGZlYXR1cmUgdHlwZT0iIiB1cmw9ImZlYXR1cmUyLmphciI+Ci0gICAgICA8Y2F0ZWdvcnkgbmFtZT0idXRpbGl0aWVzIi8+Ci0gICA8L2ZlYXR1cmU+Ci0gIAotICAgPGFyY2hpdmUgcGF0aD0iZmlyc3QvYXJjaGl2ZSIgdXJsPSJhcmNoaXZlMS5qYXIiLz4KLSAgIDxhcmNoaXZlIHBhdGg9InNlY29uZC9hcmNoaXZlIiB1cmw9ImFyY2hpdmUyLmphciIvPgotICAgCi0gICA8Y2F0ZWdvcnktZGVmIG5hbWU9InRvb2xzIiBsYWJlbD0iRGV2ZWxvcG1lbnQgVG9vbHMiPgotICAgICAgPGRlc2NyaXB0aW9uIHVybD0iaHR0cDovL3d3dy50b29scy5jb20vdG9vbHMiPgotICAgICAgICAgVGhpcyBpcyBkZXNjcmlwdGlvbiBmb3IgdG9vbHMKLSAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICA8L2NhdGVnb3J5LWRlZj4KLSAgIAotICAgPGNhdGVnb3J5LWRlZiBuYW1lPSJ1dGlsaXRpZXMiIGxhYmVsPSJVdGlsaXRpZXMiPgotICAgICAgPGRlc2NyaXB0aW9uIHVybD0idXRpbGl0aWVzLmh0bWwiLz4KLSAgIDwvY2F0ZWdvcnktZGVmPgotICAgCi0gICA8Y2F0ZWdvcnktZGVmIG5hbWU9IndpbmRvd3MudG9vbHMiIGxhYmVsPSJXaW5kb3dzIERldmVsb3BtZW50IFRvb2xzIi8+Ci0KLTwvc2l0ZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9tb2RlbC9zaXRlX3dpdGhfdHlwZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9tb2RlbC9zaXRlX3dpdGhfdHlwZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5OWI0ZjcuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvbW9kZWwvc2l0ZV93aXRoX3R5cGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08c2l0ZSB1cmw9Imh0dHA6Ly93d3cudG9vbHMuY29tL3VwZGF0ZVNpdGUiIHR5cGU9InNvbWUub3RoZXIuc2l0ZS50eXBlIj4KLQotPC9zaXRlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL21vZGVsL3Rlc3QucHJvcGVydGllcyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL21vZGVsL3Rlc3QucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhlYTlhZi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9tb2RlbC90ZXN0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zMSA9IFN0cmluZyAxCi1zMiA9IFN0cmluZyAyCi11cmwxID0gcmVsYXRpdmUvaW5kZXguaHRtbAotdXJsMiA9IGh0dHA6Ly9zb21lLnNlcnZlci90b29scy5odG1sCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9uYXRpdmVUZXN0cy9UZXN0TG9jYWxTeXN0ZW1JbmZvLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9uYXRpdmVUZXN0cy9UZXN0TG9jYWxTeXN0ZW1JbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkOTAxODEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvbmF0aXZlVGVzdHMvVGVzdExvY2FsU3lzdGVtSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5uYXRpdmVUZXN0czsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi5JVm9sdW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLkxvY2FsU3lzdGVtSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuVXBkYXRlTWFuYWdlclRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgVGVzdExvY2FsU3lzdGVtSW5mbyBleHRlbmRzIFVwZGF0ZU1hbmFnZXJUZXN0Q2FzZSB7Ci0KLQkvKioKLQkgKiBUZXN0IHRoZSBuYXRpdmVzCi0JICovCi0JcHVibGljIFRlc3RMb2NhbFN5c3RlbUluZm8oU3RyaW5nIGFyZzApIHsKLQkJc3VwZXIoYXJnMCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5hdGl2ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQotCQkvLyBtb3VudCBwb2ludAotICAgICAgIElWb2x1bWVbXSBhID0gTG9jYWxTeXN0ZW1JbmZvLmdldFZvbHVtZXMoKTsKLSAgICAgICAgaWYgKGE9PW51bGwpIHRocm93IG5ldyBFeGNlcHRpb24oImNhbm5vdCBmaW5kIG5hdGl2ZSBsaWJyYXJ5Iik7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiRm91bmQgIithLmxlbmd0aCsiIG1vdW50IHBvaW50cy4iKTsKLQkJZm9yIChpbnQgaSA9MDsgaTxhLmxlbmd0aDtpKyspewotCQkJU3lzdGVtLm91dC5wcmludCgiIyIraSsiIC0gIithW2ldKTsKLQkJCQotCQkJRmlsZSByb290ID0gYVtpXS5nZXRGaWxlKCk7Ci0JCQlTdHJpbmcgbGFiZWwgPSBhW2ldLmdldExhYmVsKCk7Ci0JCQlpZiAobGFiZWw9PW51bGwpIGxhYmVsPSJOTyBMQUJFTCI7Ci0JCQlpbnQgdHlwZSA9IGFbaV0uZ2V0VHlwZSgpOwotCQkJbG9uZyBzaXplID0gTG9jYWxTeXN0ZW1JbmZvLmdldEZyZWVTcGFjZShyb290KTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIC0+OiIrbGFiZWwrIjoiK2dldFR5cGUodHlwZSkrIjoiK2dldFNpemUoc2l6ZSkpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGdldFR5cGUoaW50IHR5cGUpewotCQlzd2l0Y2ggKHR5cGUpIHsKLQkJCWNhc2UgTG9jYWxTeXN0ZW1JbmZvLlZPTFVNRV9GSVhFRCA6Ci0JCQkJcmV0dXJuICJWT0xVTUUgRklYRUQiOwotCQkJY2FzZSBMb2NhbFN5c3RlbUluZm8uVk9MVU1FX1JFTU9URSA6Ci0JCQkJcmV0dXJuICJWT0xVTUUgUkVNT1RFIjsKLQkJCWNhc2UgTG9jYWxTeXN0ZW1JbmZvLlZPTFVNRV9SRU1PVkFCTEUgOgotCQkJCXJldHVybiAiVk9MVU1FIFJFTU9WQUJMRSI7Ci0JCQljYXNlIExvY2FsU3lzdGVtSW5mby5WT0xVTUVfQ0RST00gOgotCQkJCXJldHVybiAiVk9MVU1FIENEUk9NIjsJCQkJCi0JCQljYXNlIExvY2FsU3lzdGVtSW5mby5WT0xVTUVfVU5LTk9XTiA6Ci0JCQkJcmV0dXJuICJWT0xVTUUgVU5LTk9XTiI7Ci0JCQlkZWZhdWx0IDoKLQkJCQlyZXR1cm4gIldST05HIFZPTFVNRSBJTkZPIjsKLQkJfQotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXRTaXplKGxvbmcgc2l6ZSl7Ci0JCWlmIChzaXplPT1Mb2NhbFN5c3RlbUluZm8uU0laRV9VTktOT1dOKSByZXR1cm4gIlVOS05PV04gU0laRSI7Ci0JCQotCQlsb25nIGtiID0gc2l6ZS8oMTAyNCoxMDI0KTsKLQkJcmV0dXJuIG5ldyBTdHJpbmcoc2l6ZSsiICgiK2tiKyJNQikiKTsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9uZXN0ZWRmZWF0dXJlcy9BbGxOZXN0ZWRUZXN0cy5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvbmVzdGVkZmVhdHVyZXMvQWxsTmVzdGVkVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM3OGZhZi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9uZXN0ZWRmZWF0dXJlcy9BbGxOZXN0ZWRUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5uZXN0ZWRmZWF0dXJlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuVXBkYXRlTWFuYWdlclRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotCi1wdWJsaWMgY2xhc3MgQWxsTmVzdGVkVGVzdHMgZXh0ZW5kcyBVcGRhdGVNYW5hZ2VyVGVzdENhc2UgewotcHVibGljIEFsbE5lc3RlZFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCXN1aXRlLnNldE5hbWUoIk5lc3RlZCBJbnN0YWxsIFRlc3RzIik7Ci0JCi0JLy8gdGhlIGZvbGxvd2luZyB3aWxsIHRha2UgYWxsIHRlaCB0ZXN0IG1ldGhvZHMgaW4gdGVoIGNsYXNzIHRoYXQgc3RhcnQgd2l0aCAndGVzdCcKLQotCXN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShUZXN0SW5zdGFsbC5jbGFzcykpOwotCi0JLy8gb3IgeW91IGNhbiBzcGVjaWZ5IHRoZSBtZXRob2QKLQkvL3N1aXRlLmFkZFRlc3QobmV3IFRlc3RHZXRGZWF0dXJlKCJtZXRob2RUaGF0RG9lc05vdFN0YXJ0V2l0aHRlc3QiKSk7CQotCQotCXJldHVybiBzdWl0ZTsKLX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL25lc3RlZGZlYXR1cmVzL1Rlc3RJbnN0YWxsLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9uZXN0ZWRmZWF0dXJlcy9UZXN0SW5zdGFsbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWZmZmQ2Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL25lc3RlZGZlYXR1cmVzL1Rlc3RJbnN0YWxsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5uZXN0ZWRmZWF0dXJlczsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5VcGRhdGVNYW5hZ2VyVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0SW5zdGFsbCBleHRlbmRzIFVwZGF0ZU1hbmFnZXJUZXN0Q2FzZSB7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgVGVzdDEKLQkgKi8KLQlwdWJsaWMgVGVzdEluc3RhbGwoU3RyaW5nIGFyZzApIHsKLQkJc3VwZXIoYXJnMCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpbGVTaXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQotCQkvL2NsZWFudXAgdGFyZ2V0IAotCQlGaWxlIHRhcmdldCA9IG5ldyBGaWxlKFRBUkdFVF9GSUxFX1NJVEUuZ2V0RmlsZSgpKTsKLQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKHRhcmdldCk7CQkKLQkJSW5zdGFsbFJlZ2lzdHJ5LmNsZWFudXAoKTsKLQkJCi0KLQkJSVNpdGUgcmVtb3RlU2l0ZSA9Ci0JCQlTaXRlTWFuYWdlci5nZXRTaXRlKG5ldyBVUkwoU09VUkNFX0ZJTEVfU0lURSwgIm5lc3RlZEZlYXR1cmVTaXRlVGVzdC9zaXRlLnhtbCIpLG51bGwpOwotCQlJRmVhdHVyZSByZW1vdGVGZWF0dXJlID0gcmVtb3RlU2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlcygpWzBdLmdldEZlYXR1cmUobnVsbCk7Ci0JCUlTaXRlIGxvY2FsU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUoVEFSR0VUX0ZJTEVfU0lURSxudWxsKTsKLQkJbG9jYWxTaXRlLmluc3RhbGwocmVtb3RlRmVhdHVyZSwgbnVsbCwgbnVsbCk7Ci0KLQkJLy8gdmVyaWZ5IHJvb3QgRmVhdHVyZQotCQlTdHJpbmcgc2l0ZSA9IGxvY2FsU2l0ZS5nZXRVUkwoKS5nZXRGaWxlKCk7Ci0JCUlQbHVnaW5FbnRyeVtdIGVudHJpZXMgPSByZW1vdGVGZWF0dXJlLmdldFBsdWdpbkVudHJpZXMoKTsKLQkJYXNzZXJ0VHJ1ZSgibm8gcGx1Z2lucyBlbnRyeSIsIChlbnRyaWVzICE9IG51bGwgJiYgZW50cmllcy5sZW5ndGggIT0gMCkpOwotCQlTdHJpbmcgcGx1Z2luTmFtZSA9IGVudHJpZXNbMF0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCk7Ci0JCUZpbGUgcGx1Z2luRmlsZSA9IG5ldyBGaWxlKHNpdGUsIFNpdGUuREVGQVVMVF9QTFVHSU5fUEFUSCArIHBsdWdpbk5hbWUpOwotCQlhc3NlcnRUcnVlKAotCQkJInBsdWdpbiBmaWxlcyBub3QgaW5zdGFsbGVkIGxvY2FsbHk6IiArIHBsdWdpbkZpbGUsCi0JCQlwbHVnaW5GaWxlLmV4aXN0cygpKTsKLQkJRmlsZSBwbHVnaW5YTUxGaWxlID0KLQkJCW5ldyBGaWxlKAotCQkJCXNpdGUsCi0JCQkJU2l0ZS5ERUZBVUxUX1BMVUdJTl9QQVRIICsgcGx1Z2luTmFtZSArIEZpbGUuc2VwYXJhdG9yICsgInBsdWdpbi54bWwiKTsKLQkJYXNzZXJ0VHJ1ZSgicGx1Z2luLnhtbCBmaWxlIG5vdCBpbnN0YWxsZWQgbG9jYWxseSIsIHBsdWdpblhNTEZpbGUuZXhpc3RzKCkpOwotCi0JCUZpbGUgZmVhdHVyZUZpbGUgPQotCQkJbmV3IEZpbGUoCi0JCQkJc2l0ZSwKLQkJCQlTaXRlLkRFRkFVTFRfSU5TVEFMTEVEX0ZFQVRVUkVfUEFUSAotCQkJCQkrIHJlbW90ZUZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkpOwotCQlhc3NlcnRUcnVlKAotCQkJImZlYXR1cmUgaW5mbyBub3QgaW5zdGFsbGVkIGxvY2FsbHk6IiArIGZlYXR1cmVGaWxlLAotCQkJZmVhdHVyZUZpbGUuZXhpc3RzKCkpOwotCi0JCS8vIGNsZWFuIHBsdWdpbnMgJiBmZWF0dXJlCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykgewotCQkJcGx1Z2luTmFtZSA9IGVudHJpZXNbaV0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCk7Ci0JCQlwbHVnaW5GaWxlID0gbmV3IEZpbGUoc2l0ZSwgU2l0ZS5ERUZBVUxUX1BMVUdJTl9QQVRIICsgcGx1Z2luTmFtZSk7Ci0JCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0ocGx1Z2luRmlsZSk7Ci0JCQlJbnN0YWxsUmVnaXN0cnkudW5yZWdpc3RlclBsdWdpbihlbnRyaWVzW2ldKTsKLQkJfQotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0oZmVhdHVyZUZpbGUpOwotCi0JCS8vIHZlcmlmeSBjaGlsZCBGZWF0dXJlCi0JCUlGZWF0dXJlIGNoaWxkRmVhdHVyZSA9Ci0JCQlyZW1vdGVGZWF0dXJlLmdldEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZXMoKVswXS5nZXRGZWF0dXJlKG51bGwpOwotCQllbnRyaWVzID0gY2hpbGRGZWF0dXJlLmdldFBsdWdpbkVudHJpZXMoKTsKLQkJYXNzZXJ0VHJ1ZSgibm8gcGx1Z2lucyBlbnRyeSIsIChlbnRyaWVzICE9IG51bGwgJiYgZW50cmllcy5sZW5ndGggIT0gMCkpOwotCQlwbHVnaW5OYW1lID0gZW50cmllc1swXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKTsKLQkJcGx1Z2luRmlsZSA9IG5ldyBGaWxlKHNpdGUsIFNpdGUuREVGQVVMVF9QTFVHSU5fUEFUSCArIHBsdWdpbk5hbWUpOwotCQlhc3NlcnRUcnVlKAotCQkJInBsdWdpbiBmaWxlcyBub3QgaW5zdGFsbGVkIGxvY2FsbHk6IiArIHBsdWdpbkZpbGUsCi0JCQlwbHVnaW5GaWxlLmV4aXN0cygpKTsKLQkJcGx1Z2luWE1MRmlsZSA9Ci0JCQluZXcgRmlsZSgKLQkJCQlzaXRlLAotCQkJCVNpdGUuREVGQVVMVF9QTFVHSU5fUEFUSCArIHBsdWdpbk5hbWUgKyBGaWxlLnNlcGFyYXRvciArICJwbHVnaW4ueG1sIik7Ci0JCWFzc2VydFRydWUoInBsdWdpbi54bWwgZmlsZSBub3QgaW5zdGFsbGVkIGxvY2FsbHkiLCBwbHVnaW5YTUxGaWxlLmV4aXN0cygpKTsKLQotCQlmZWF0dXJlRmlsZSA9Ci0JCQluZXcgRmlsZSgKLQkJCQlzaXRlLAotCQkJCVNpdGUuREVGQVVMVF9JTlNUQUxMRURfRkVBVFVSRV9QQVRICi0JCQkJCSsgY2hpbGRGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpKTsKLQkJYXNzZXJ0VHJ1ZSgKLQkJCSJmZWF0dXJlIGluZm8gbm90IGluc3RhbGxlZCBsb2NhbGx5OiIgKyBmZWF0dXJlRmlsZSwKLQkJCWZlYXR1cmVGaWxlLmV4aXN0cygpKTsKLQotCQkvLyBjbGVhbiBwbHVnaW5zCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykgewotCQkJcGx1Z2luTmFtZSA9IGVudHJpZXNbMF0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCk7Ci0JCQlwbHVnaW5GaWxlID0gbmV3IEZpbGUoc2l0ZSwgU2l0ZS5ERUZBVUxUX1BMVUdJTl9QQVRIICsgcGx1Z2luTmFtZSk7Ci0JCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0ocGx1Z2luRmlsZSk7Ci0JCX0KLQotCQkvLyBjbGVhbiBmZWF0dXJlcwotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0oZmVhdHVyZUZpbGUpOwotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0obmV3IEZpbGUobG9jYWxTaXRlLmdldFVSTCgpLmdldEZpbGUoKSkpOwotCQlJbnN0YWxsUmVnaXN0cnkuY2xlYW51cCgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RIVFRQU2l0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCUlTaXRlIHJlbW90ZVNpdGUgPQotCQkJU2l0ZU1hbmFnZXIuZ2V0U2l0ZShuZXcgVVJMKFNPVVJDRV9IVFRQX1NJVEUsICJuZXN0ZWRGZWF0dXJlU2l0ZVRlc3QvIiksbnVsbCk7Ci0JCUlGZWF0dXJlUmVmZXJlbmNlW10gZmVhdHVyZXMgPSByZW1vdGVTaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKCk7Ci0JCUlGZWF0dXJlIHJlbW90ZUZlYXR1cmUgPSBudWxsOwotCi0JCWlmIChmZWF0dXJlcyA9PSBudWxsIHx8IGZlYXR1cmVzLmxlbmd0aCA9PSAwKQotCQkJZmFpbCgiTm8gZmVhdHVyZXMgb24gdGhlIHNpdGUiKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoZmVhdHVyZXNbaV0uZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKS5lbmRzV2l0aCgicm9vdGZlYXR1cmUuamFyIikpIHsKLQkJCQlyZW1vdGVGZWF0dXJlID0gZmVhdHVyZXNbaV0uZ2V0RmVhdHVyZShudWxsKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCWFzc2VydE5vdE51bGwoIkNhbm5vdCBmaW5kIHJvb3RmZWF0dXJlLmphciBvbiBzaXRlIiwgcmVtb3RlRmVhdHVyZSk7Ci0JCUlTaXRlIGxvY2FsU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUoVEFSR0VUX0ZJTEVfU0lURSxudWxsKTsKLQkJbG9jYWxTaXRlLmluc3RhbGwocmVtb3RlRmVhdHVyZSwgbnVsbCwgbnVsbCk7Ci0KLQkJLy8gcm9vdGZlYXR1cmUuamFyIHNob3VsZCBub3QgYmUgaW4gdGhlIGxvY2FsIHNpdGUKLQkJSUZlYXR1cmVSZWZlcmVuY2VbXSBsb2NhbEZlYXR1cmVzID0gbG9jYWxTaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKCk7Ci0JCWlmIChsb2NhbEZlYXR1cmVzID09IG51bGwgfHwgbG9jYWxGZWF0dXJlcy5sZW5ndGggPT0gMCkKLQkJCWZhaWwoIk5vIGZlYXR1cmVzIG9uIHRoZSB0YXJnZXQgc2l0ZSIpOwotCi0JCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsb2NhbEZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAobG9jYWxGZWF0dXJlc1tpXS5nZXRVUkwoKS50b0V4dGVybmFsRm9ybSgpLmVuZHNXaXRoKCJyb290ZmVhdHVyZS5qYXIiKSkgewotCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCWFzc2VydFRydWUoCi0JCQkiRm91bmQgcm9vdGZlYXR1cmUuamFyIG9uIHRhcmdldCBzaXRlLiBUYXJnZXQgc2l0ZSBmZWF0dXJlIHJlZiBzaG91bGRub3QgY29udGFpbiBKQVIgZmlsZSIsCi0JCQkhZm91bmQpOwotCi0JCS8vIGNoZWNrIHJvb3QKLQkJU3RyaW5nIHNpdGUgPSBsb2NhbFNpdGUuZ2V0VVJMKCkuZ2V0RmlsZSgpOwotCQlJUGx1Z2luRW50cnlbXSBlbnRyaWVzID0gcmVtb3RlRmVhdHVyZS5nZXRQbHVnaW5FbnRyaWVzKCk7Ci0JCWFzc2VydFRydWUoIm5vIHBsdWdpbnMgZW50cnkiLCAoZW50cmllcyAhPSBudWxsICYmIGVudHJpZXMubGVuZ3RoICE9IDApKTsKLQotCQlTdHJpbmcgcGx1Z2luTmFtZSA9IGVudHJpZXNbMF0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCk7Ci0JCUZpbGUgcGx1Z2luRmlsZSA9IG5ldyBGaWxlKHNpdGUsIFNpdGUuREVGQVVMVF9QTFVHSU5fUEFUSCArIHBsdWdpbk5hbWUpOwotCQlhc3NlcnRUcnVlKAotCQkJInBsdWdpbiBmaWxlcyBub3QgaW5zdGFsbGVkIGxvY2FsbHk6IiArIHBsdWdpbkZpbGUsCi0JCQlwbHVnaW5GaWxlLmV4aXN0cygpKTsJCQotCQlGaWxlIHBsdWdpblhNTEZpbGUgPSBuZXcgRmlsZShzaXRlLCBTaXRlLkRFRkFVTFRfUExVR0lOX1BBVEggKyBwbHVnaW5OYW1lKyBGaWxlLnNlcGFyYXRvciArICJwbHVnaW4ueG1sIik7Ci0JCWFzc2VydFRydWUoCi0JCQkicGx1Z2luIGluZm8gbm90IGluc3RhbGxlZCBsb2NhbGx5OiIgKyBwbHVnaW5YTUxGaWxlLAotCQkJcGx1Z2luWE1MRmlsZS5leGlzdHMoKSk7Ci0KLQkJRmlsZSBmZWF0dXJlRmlsZSA9Ci0JCQluZXcgRmlsZSgKLQkJCQlzaXRlLAotCQkJCVNpdGUuREVGQVVMVF9JTlNUQUxMRURfRkVBVFVSRV9QQVRICi0JCQkJCSsgcmVtb3RlRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSk7Ci0JCWFzc2VydFRydWUoImZlYXR1cmUgaW5mbyBub3QgaW5zdGFsbGVkIGxvY2FsbHkiLCBmZWF0dXJlRmlsZS5leGlzdHMoKSk7Ci0KLQkJLy8gY2xlYW4gcGx1Z2lucyAmIGZlYXR1cmUKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlwbHVnaW5OYW1lID0gZW50cmllc1tpXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKTsKLQkJCXBsdWdpbkZpbGUgPSBuZXcgRmlsZShzaXRlLCBTaXRlLkRFRkFVTFRfUExVR0lOX1BBVEggKyBwbHVnaW5OYW1lKTsKLQkJCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShwbHVnaW5GaWxlKTsKLQkJCUluc3RhbGxSZWdpc3RyeS51bnJlZ2lzdGVyUGx1Z2luKGVudHJpZXNbaV0pOwotCQl9Ci0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShmZWF0dXJlRmlsZSk7Ci0KLQkJLy8gdmVyaWZ5IGNoaWxkIEZlYXR1cmUKLQkJSUZlYXR1cmUgY2hpbGRGZWF0dXJlID0KLQkJCXJlbW90ZUZlYXR1cmUuZ2V0SW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlcygpWzBdLmdldEZlYXR1cmUobnVsbCk7Ci0JCWVudHJpZXMgPSBjaGlsZEZlYXR1cmUuZ2V0UGx1Z2luRW50cmllcygpOwotCQlhc3NlcnRUcnVlKCJubyBwbHVnaW5zIGVudHJ5IiwgKGVudHJpZXMgIT0gbnVsbCAmJiBlbnRyaWVzLmxlbmd0aCAhPSAwKSk7Ci0JCXBsdWdpbk5hbWUgPSBlbnRyaWVzWzBdLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpOwotCQlwbHVnaW5GaWxlID0gbmV3IEZpbGUoc2l0ZSwgU2l0ZS5ERUZBVUxUX1BMVUdJTl9QQVRIICsgcGx1Z2luTmFtZSk7Ci0JCWFzc2VydFRydWUoCi0JCQkicGx1Z2luIGZpbGVzIG5vdCBpbnN0YWxsZWQgbG9jYWxseToiICsgcGx1Z2luRmlsZSwKLQkJCXBsdWdpbkZpbGUuZXhpc3RzKCkpOwotCQlwbHVnaW5YTUxGaWxlID0KLQkJCW5ldyBGaWxlKAotCQkJCXNpdGUsCi0JCQkJU2l0ZS5ERUZBVUxUX1BMVUdJTl9QQVRIICsgcGx1Z2luTmFtZSArIEZpbGUuc2VwYXJhdG9yICsgInBsdWdpbi54bWwiKTsKLQkJYXNzZXJ0VHJ1ZSgicGx1Z2luLnhtbCBmaWxlIG5vdCBpbnN0YWxsZWQgbG9jYWxseSIsIHBsdWdpblhNTEZpbGUuZXhpc3RzKCkpOwotCi0JCWZlYXR1cmVGaWxlID0KLQkJCW5ldyBGaWxlKAotCQkJCXNpdGUsCi0JCQkJU2l0ZS5ERUZBVUxUX0lOU1RBTExFRF9GRUFUVVJFX1BBVEgKLQkJCQkJKyBjaGlsZEZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkpOwotCQlhc3NlcnRUcnVlKAotCQkJImZlYXR1cmUgaW5mbyBub3QgaW5zdGFsbGVkIGxvY2FsbHk6IiArIGZlYXR1cmVGaWxlLAotCQkJZmVhdHVyZUZpbGUuZXhpc3RzKCkpOwotCi0JCS8vIGNsZWFuIHBsdWdpbnMKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlwbHVnaW5OYW1lID0gZW50cmllc1swXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKTsKLQkJCXBsdWdpbkZpbGUgPSBuZXcgRmlsZShzaXRlLCBTaXRlLkRFRkFVTFRfUExVR0lOX1BBVEggKyBwbHVnaW5OYW1lKTsKLQkJCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShwbHVnaW5GaWxlKTsKLQkJfQotCi0JCS8vIGNsZWFuIGZlYXR1cmVzCi0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShmZWF0dXJlRmlsZSk7Ci0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShuZXcgRmlsZShsb2NhbFNpdGUuZ2V0VVJMKCkuZ2V0RmlsZSgpKSk7Ci0JfQotCi0vLwlwdWJsaWMgdm9pZCB0ZXN0SW5zdGFsbCgpIHRocm93cyBFeGNlcHRpb24gewotLy8KLS8vCQkvLyBjbGVhbnVwIGxvY2FsIGZpbGVzLi4uCi0vLwkJVVJMIGxvY2FsVVJMID0gKChMb2NhbFNpdGUpIFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpKS5nZXRMb2NhdGlvblVSTCgpOwotLy8JCUZpbGUgbG9jYWxGaWxlID0gbmV3IEZpbGUobG9jYWxVUkwuZ2V0RmlsZSgpKTsKLS8vCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0obG9jYWxGaWxlKTsKLS8vCQlJbnN0YWxsUmVnaXN0cnkuY2xlYW51cCgpOwotLy8KLS8vCQlVUkwgSU5TVEFMTF9TSVRFID0gbnVsbDsKLS8vCQl0cnkgewotLy8JCQlJTlNUQUxMX1NJVEUgPSBuZXcgVVJMKFNPVVJDRV9GSUxFX1NJVEUsICJuZXN0ZWRGZWF0dXJlU2l0ZVRlc3Qvc2l0ZS54bWwiKTsKLS8vCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotLy8JCQlmYWlsKGUudG9TdHJpbmcoKSk7Ci0vLwkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0vLwkJfQotLy8KLS8vCQlJU2l0ZSByZW1vdGVTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShJTlNUQUxMX1NJVEUsbnVsbCk7Ci0vLwkJSUZlYXR1cmVSZWZlcmVuY2VbXSBmZWF0dXJlcyA9IHJlbW90ZVNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKTsKLS8vCQlJRmVhdHVyZSByZW1vdGVGZWF0dXJlID0gbnVsbDsKLS8vCi0vLwkJaWYgKGZlYXR1cmVzID09IG51bGwgfHwgZmVhdHVyZXMubGVuZ3RoID09IDApCi0vLwkJCWZhaWwoIk5vIGZlYXR1cmVzIG9uIHRoZSBzaXRlIik7Ci0vLwotLy8JCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXMubGVuZ3RoOyBpKyspIHsKLS8vCQkJaWYgKGZlYXR1cmVzW2ldLmdldFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCkuZW5kc1dpdGgoInJvb3RmZWF0dXJlLmphciIpKSB7Ci0vLwkJCQlyZW1vdGVGZWF0dXJlID0gZmVhdHVyZXNbaV0uZ2V0RmVhdHVyZShudWxsKTsKLS8vCQkJCWJyZWFrOwotLy8JCQl9Ci0vLwkJfQotLy8KLS8vCQlhc3NlcnROb3ROdWxsKCJDYW5ub3QgZmluZCByb290ZmVhdHVyZS5qYXIgb24gc2l0ZSIsIHJlbW90ZUZlYXR1cmUpOwotLy8JCUlMb2NhbFNpdGUgbG9jYWxTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCk7Ci0vLwkJSUNvbmZpZ3VyZWRTaXRlIHNpdGUgPQotLy8JCQlsb2NhbFNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKS5nZXRDb25maWd1cmVkU2l0ZXMoKVswXTsKLS8vCi0vLwkJKChDb25maWd1cmVkU2l0ZSlzaXRlKS5zZXRVcGRhdGFibGUodHJ1ZSk7Ci0vLwkJc2l0ZS5pbnN0YWxsKHJlbW90ZUZlYXR1cmUsIG51bGwsIG51bGwpOwotLy8KLS8vCQlJUGx1Z2luRW50cnlbXSBlbnRyaWVzID0gcmVtb3RlRmVhdHVyZS5nZXRQbHVnaW5FbnRyaWVzKCk7Ci0vLwkJYXNzZXJ0VHJ1ZSgibm8gcGx1Z2lucyBlbnRyeSIsIChlbnRyaWVzICE9IG51bGwgJiYgZW50cmllcy5sZW5ndGggIT0gMCkpOwotLy8KLS8vCQlTdHJpbmcgc2l0ZVBhdGggPSBzaXRlLmdldFNpdGUoKS5nZXRVUkwoKS5nZXRGaWxlKCk7Ci0vLwkJU3RyaW5nIHBsdWdpbk5hbWUgPSBlbnRyaWVzWzBdLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpOwotLy8JCUZpbGUgcGx1Z2luRmlsZSA9IG5ldyBGaWxlKHNpdGVQYXRoLCBTaXRlLkRFRkFVTFRfUExVR0lOX1BBVEggKyBwbHVnaW5OYW1lKTsKLS8vCQlhc3NlcnRUcnVlKCJwbHVnaW4gaW5mbyBub3QgaW5zdGFsbGVkIGxvY2FsbHkiK3BsdWdpbkZpbGUsIHBsdWdpbkZpbGUuZXhpc3RzKCkpOwotLy8KLS8vCQlGaWxlIGZlYXR1cmVGaWxlID0KLS8vCQkJbmV3IEZpbGUoCi0vLwkJCQlzaXRlUGF0aCwKLS8vCQkJCVNpdGUuREVGQVVMVF9JTlNUQUxMRURfRkVBVFVSRV9QQVRICi0vLwkJCQkJKyByZW1vdGVGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpKTsKLS8vCQlhc3NlcnRUcnVlKCJmZWF0dXJlIGluZm8gbm90IGluc3RhbGxlZCBsb2NhbGx5IiwgZmVhdHVyZUZpbGUuZXhpc3RzKCkpOwotLy8KLS8vCQkvL2NsZWFudXAKLS8vCQlGaWxlIGZpbGUgPQotLy8JCQluZXcgRmlsZSgKLS8vCQkJCXNpdGUuZ2V0U2l0ZSgpLmdldFVSTCgpLmdldEZpbGUoKQotLy8JCQkJCSsgRmlsZS5zZXBhcmF0b3IKLS8vCQkJCQkrIFNpdGUuREVGQVVMVF9JTlNUQUxMRURfRkVBVFVSRV9QQVRICi0vLwkJCQkJKyByZW1vdGVGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSk7Ci0vLwkJLy8gY2xlYW4gcGx1Z2lucwotLy8JCWZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykgewotLy8JCQlwbHVnaW5OYW1lID0gZW50cmllc1swXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKTsKLS8vCQkJcGx1Z2luRmlsZSA9Ci0vLwkJCQluZXcgRmlsZSgKLS8vCQkJCQlzaXRlLmdldFNpdGUoKS5nZXRVUkwoKS5nZXRGaWxlKCksCi0vLwkJCQkJU2l0ZS5ERUZBVUxUX1BMVUdJTl9QQVRIICsgcGx1Z2luTmFtZSk7Ci0vLwkJCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShwbHVnaW5GaWxlKTsKLS8vCQl9Ci0vLwotLy8JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShmaWxlKTsKLS8vCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0ocGx1Z2luRmlsZSk7Ci0vLwkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGxvY2FsRmlsZSk7Ci0vLwkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKAotLy8JCQluZXcgRmlsZSgKLS8vCQkJCSgoSW5zdGFsbENvbmZpZ3VyYXRpb24pIGxvY2FsU2l0ZS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpKQotLy8JCQkJCS5nZXRVUkwoKQotLy8JCQkJCS5nZXRGaWxlKCkpKTsKLS8vCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3BhcnNlci9BbGxQYXJzZXJUZXN0cy5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcGFyc2VyL0FsbFBhcnNlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5NzA4MjAuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcGFyc2VyL0FsbFBhcnNlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnBhcnNlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5VcGRhdGVNYW5hZ2VyVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci0KLQotcHVibGljIGNsYXNzIEFsbFBhcnNlclRlc3RzIGV4dGVuZHMgVXBkYXRlTWFuYWdlclRlc3RDYXNlIHsKLXB1YmxpYyBBbGxQYXJzZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlzdWl0ZS5zZXROYW1lKCJQYXJzaW5nIFRlc3RzIik7Ci0JCi0JLy8gdGhlIGZvbGxvd2luZyB3aWxsIHRha2UgYWxsIHRlaCB0ZXN0IG1ldGhvZHMgaW4gdGVoIGNsYXNzIHRoYXQgc3RhcnQgd2l0aCAndGVzdCcKLQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoVGVzdEZlYXR1cmVQYXJzZS5jbGFzcykpOwotCXN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShUZXN0U2l0ZVBhcnNlLmNsYXNzKSk7CQotCXN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShUZXN0Q2F0ZWdvcmllcy5jbGFzcykpOwkJCi0JCi0JLy8gb3IgeW91IGNhbiBzcGVjaWZ5IHRoZSBtZXRob2QKLQkvL3N1aXRlLmFkZFRlc3QobmV3IFRlc3RHZXRGZWF0dXJlKCJtZXRob2RUaGF0RG9lc05vdFN0YXJ0V2l0aHRlc3QiKSk7CQotCQotCXJldHVybiBzdWl0ZTsKLX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3BhcnNlci9UZXN0Q2F0ZWdvcmllcy5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcGFyc2VyL1Rlc3RDYXRlZ29yaWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxYmU1NDYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcGFyc2VyL1Rlc3RDYXRlZ29yaWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnBhcnNlcjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5VcGRhdGVNYW5hZ2VyVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0Q2F0ZWdvcmllcyBleHRlbmRzIFVwZGF0ZU1hbmFnZXJUZXN0Q2FzZSB7Ci0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIFRlc3QxCi0JICovCi0JcHVibGljIFRlc3RDYXRlZ29yaWVzKFN0cmluZyBhcmcwKSB7Ci0JCXN1cGVyKGFyZzApOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDYXRlZ29yaWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJVVJMIHJlbW90ZVVybCA9IG5ldyBVUkwoU09VUkNFX0ZJTEVfU0lURSArICJ4bWxzL3NpdGUxLyIpOwotCQlJU2l0ZSByZW1vdGVTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShyZW1vdGVVcmwsbnVsbCk7Ci0KLQkJSVNpdGVGZWF0dXJlUmVmZXJlbmNlW10gZmVhdHVyZSA9IHJlbW90ZVNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKTsKLQkJLy9JQ2F0ZWdvcnlbXSBjYXRlZ29yaWVzID0gcmVtb3RlU2l0ZS5nZXRDYXRlZ29yaWVzKCk7Ci0KLQkJSUNhdGVnb3J5IGZlYXR1cmVDYXRlZ29yeSA9IGZlYXR1cmVbMF0uZ2V0Q2F0ZWdvcmllcygpWzBdOwotCi0JCWFzc2VydEVxdWFscygiVU1MIHRvb2xzIiwgZmVhdHVyZUNhdGVnb3J5LmdldExhYmVsKCkpOwotCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdE9yZGVyZWRDYXRlZ29yaWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJVVJMIHJlbW90ZVVybCA9IG5ldyBVUkwoU09VUkNFX0ZJTEVfU0lURSArICJ4bWxzL3NpdGUxLyIpOwotCQlJU2l0ZSByZW1vdGVTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShyZW1vdGVVcmwsbnVsbCk7Ci0KLQkJSUNhdGVnb3J5W10gY2F0ZWdvcmllcyA9IHJlbW90ZVNpdGUuZ2V0Q2F0ZWdvcmllcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNhdGVnb3JpZXMubGVuZ3RoOyBpKyspIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ2F0IG9yZGVyZWQtPiIgKyBjYXRlZ29yaWVzW2ldLmdldE5hbWUoKSk7Ci0JCX0KLQotCQlhc3NlcnRFcXVhbHMoIkVjbGlwc2UgdG9vbHMiLCBjYXRlZ29yaWVzWzFdLmdldExhYmVsKCkpOwotCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRyYW5zbGF0ZWRDYXRlZ29yaWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJSVNpdGUgcmVtb3RlU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUoU09VUkNFX0hUVFBfU0lURSxudWxsKTsKLQotCQlJQ2F0ZWdvcnlbXSBjYXRlZ29yaWVzID0gcmVtb3RlU2l0ZS5nZXRDYXRlZ29yaWVzKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJSZXF1aXJlZCBEcml2ZXJzIiwgY2F0ZWdvcmllc1swXS5nZXRMYWJlbCgpKTsKLQotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3BhcnNlci9UZXN0RmVhdHVyZVBhcnNlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9wYXJzZXIvVGVzdEZlYXR1cmVQYXJzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGU5N2Y2Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3BhcnNlci9UZXN0RmVhdHVyZVBhcnNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5wYXJzZXI7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLkRlZmF1bHRGZWF0dXJlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLkZlYXR1cmVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC5VUkxFbnRyeU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLlVwZGF0ZU1hbmFnZXJUZXN0Q2FzZTsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIFRlc3RGZWF0dXJlUGFyc2UgZXh0ZW5kcyBVcGRhdGVNYW5hZ2VyVGVzdENhc2UgewotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIFRlc3QxCi0JICovCi0JcHVibGljIFRlc3RGZWF0dXJlUGFyc2UoU3RyaW5nIGFyZzApIHsKLQkJc3VwZXIoYXJnMCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFBhcnNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJU3RyaW5nIHhtbEZpbGUgPSAieG1scy9mZWF0dXJlXzEuMC4wLyI7Ci0JCUlTaXRlIHJlbW90ZVNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKFNPVVJDRV9GSUxFX1NJVEUsIG51bGwpOwotCQlVUkwgdXJsID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTChyZW1vdGVTaXRlLmdldFVSTCgpLCB4bWxGaWxlLCBudWxsKTsKLQotCQlTaXRlRmVhdHVyZVJlZmVyZW5jZSByZWYgPSBuZXcgU2l0ZUZlYXR1cmVSZWZlcmVuY2UoKTsKLQkJcmVmLnNldFNpdGUocmVtb3RlU2l0ZSk7Ci0JCXJlZi5zZXRVUkwodXJsKTsKLQkJSUZlYXR1cmUgZmVhdHVyZSA9IHJlZi5nZXRGZWF0dXJlKG51bGwpOwotCi0JCVN0cmluZyBwcm92ID0gZmVhdHVyZS5nZXRQcm92aWRlcigpOwotCQlhc3NlcnRFcXVhbHMoIk9iamVjdCBUZWNobm9sb2d5IEludGVybmF0aW9uYWwiLCBwcm92KTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQYXJzZVZhbGlkMSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCXRyeSB7Ci0JCQlVUkwgcmVtb3RlVVJMID0gbmV3IFVSTChTT1VSQ0VfRklMRV9TSVRFICsgInBhcnNlcnRlc3RzL2ZlYXR1cmUxLnhtbCIpOwotCQkJRGVmYXVsdEZlYXR1cmVQYXJzZXIgcGFyc2VyID0gbmV3IERlZmF1bHRGZWF0dXJlUGFyc2VyKCk7Ci0JCQlwYXJzZXIuaW5pdChuZXcgRmVhdHVyZUV4ZWN1dGFibGVGYWN0b3J5KCkpOwotCQkJVVJMIHJlc29sdmVkVVJMID0gVVJMRW5jb2Rlci5lbmNvZGUocmVtb3RlVVJMKTsKLQkJCUZlYXR1cmVNb2RlbCByZW1vdGVGZWF0dXJlID0gcGFyc2VyLnBhcnNlKHJlc29sdmVkVVJMLm9wZW5TdHJlYW0oKSk7Ci0JCQlyZW1vdGVGZWF0dXJlLnJlc29sdmUocmVtb3RlVVJMLCBudWxsKTsKLQotCQl9IGNhdGNoIChTQVhQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gc2hvdWxkIE5PVCBiZSB0aHJvd24iKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQYXJzZVZhbGlkMWJpcygpIHRocm93cyBFeGNlcHRpb24gewotCi0JCXRyeSB7Ci0JCQlVUkwgcmVtb3RlVVJMID0gbmV3IFVSTChTT1VSQ0VfRklMRV9TSVRFICsgInBhcnNlcnRlc3RzL2ZlYXR1cmUxYmlzLnhtbCIpOwotCQkJRGVmYXVsdEZlYXR1cmVQYXJzZXIgcGFyc2VyID0gbmV3IERlZmF1bHRGZWF0dXJlUGFyc2VyKCk7Ci0JCQlwYXJzZXIuaW5pdChuZXcgRmVhdHVyZUV4ZWN1dGFibGVGYWN0b3J5KCkpOwotCQkJVVJMIHJlc29sdmVkVVJMID0gVVJMRW5jb2Rlci5lbmNvZGUocmVtb3RlVVJMKTsKLQkJCUZlYXR1cmVNb2RlbCByZW1vdGVGZWF0dXJlID0gcGFyc2VyLnBhcnNlKHJlc29sdmVkVVJMLm9wZW5TdHJlYW0oKSk7Ci0JCQlyZW1vdGVGZWF0dXJlLnJlc29sdmUocmVtb3RlVVJMLCBudWxsKTsKLQotCQl9IGNhdGNoIChTQVhQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gc2hvdWxkIE5PVCBiZSB0aHJvd24iKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQYXJzZVZhbGlkMigpIHRocm93cyBFeGNlcHRpb24gewotCi0JCXRyeSB7Ci0JCQlVUkwgcmVtb3RlVVJMID0gbmV3IFVSTChTT1VSQ0VfRklMRV9TSVRFICsgInBhcnNlcnRlc3RzL2ZlYXR1cmUyLnhtbCIpOwotCQkJRGVmYXVsdEZlYXR1cmVQYXJzZXIgcGFyc2VyID0gbmV3IERlZmF1bHRGZWF0dXJlUGFyc2VyKCk7Ci0JCQlwYXJzZXIuaW5pdChuZXcgRmVhdHVyZUV4ZWN1dGFibGVGYWN0b3J5KCkpOwotCQkJVVJMIHJlc29sdmVkVVJMID0gVVJMRW5jb2Rlci5lbmNvZGUocmVtb3RlVVJMKTsKLQkJCUZlYXR1cmVNb2RlbCByZW1vdGVGZWF0dXJlID0gcGFyc2VyLnBhcnNlKHJlc29sdmVkVVJMLm9wZW5TdHJlYW0oKSk7Ci0JCQlyZW1vdGVGZWF0dXJlLnJlc29sdmUocmVtb3RlVVJMLCBudWxsKTsKLQotCQl9IGNhdGNoIChTQVhQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gc2hvdWxkIG5vdCBiZSB0aHJvd24iICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFBhcnNlVmFsaWQzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJdHJ5IHsKLQkJCVVSTCByZW1vdGVVUkwgPSBuZXcgVVJMKFNPVVJDRV9GSUxFX1NJVEUgKyAicGFyc2VydGVzdHMvZmVhdHVyZTMueG1sIik7Ci0JCQlEZWZhdWx0RmVhdHVyZVBhcnNlciBwYXJzZXIgPSBuZXcgRGVmYXVsdEZlYXR1cmVQYXJzZXIoKTsKLQkJCXBhcnNlci5pbml0KG5ldyBGZWF0dXJlRXhlY3V0YWJsZUZhY3RvcnkoKSk7Ci0JCQlVUkwgcmVzb2x2ZWRVUkwgPSBVUkxFbmNvZGVyLmVuY29kZShyZW1vdGVVUkwpOwotCQkJRmVhdHVyZU1vZGVsIHJlbW90ZUZlYXR1cmUgPSBwYXJzZXIucGFyc2UocmVzb2x2ZWRVUkwub3BlblN0cmVhbSgpKTsKLQkJCXJlbW90ZUZlYXR1cmUucmVzb2x2ZShyZW1vdGVVUkwsIG51bGwpOwotCi0JCQlTdHJpbmcgY29weXJpZ2h0U3RyaW5nID0gcmVtb3RlRmVhdHVyZS5nZXRDb3B5cmlnaHRNb2RlbCgpLmdldFVSTCgpLmdldEZpbGUoKTsKLQkJCWJvb2xlYW4gcmVzb2x2ZWQgPSBjb3B5cmlnaHRTdHJpbmcuaW5kZXhPZihTaXRlTWFuYWdlci5nZXRPUygpKSAhPSAtMTsKLQkJCWFzc2VydFRydWUoIkNvcHlyaWdodCBVUkwgbm90IHJlc29sdmVkOiIgKyBjb3B5cmlnaHRTdHJpbmcsIHJlc29sdmVkKTsKLQkJfSBjYXRjaCAoU0FYUGFyc2VFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRXhjZXB0aW9uIHNob3VsZCBub3QgYmUgdGhyb3duIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KLQotCS8vIHBhcnNlIHR5cGUKLQlwdWJsaWMgdm9pZCB0ZXN0UGFyc2VWYWxpZDQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQl0cnkgewotCQkJVVJMIHJlbW90ZVVSTCA9IG5ldyBVUkwoU09VUkNFX0ZJTEVfU0lURSArICJwYXJzZXJ0ZXN0cy9mZWF0dXJlNC54bWwiKTsKLQkJCURlZmF1bHRGZWF0dXJlUGFyc2VyIHBhcnNlciA9IG5ldyBEZWZhdWx0RmVhdHVyZVBhcnNlcigpOwotCQkJcGFyc2VyLmluaXQobmV3IEZlYXR1cmVFeGVjdXRhYmxlRmFjdG9yeSgpKTsKLQkJCVVSTCByZXNvbHZlZFVSTCA9IFVSTEVuY29kZXIuZW5jb2RlKHJlbW90ZVVSTCk7Ci0JCQlGZWF0dXJlTW9kZWwgcmVtb3RlRmVhdHVyZSA9IHBhcnNlci5wYXJzZShyZXNvbHZlZFVSTC5vcGVuU3RyZWFtKCkpOwotCQkJcmVtb3RlRmVhdHVyZS5yZXNvbHZlKHJlbW90ZVVSTCwgbnVsbCk7Ci0KLQkJCVVSTEVudHJ5TW9kZWxbXSBtb2RlbHMgPSByZW1vdGVGZWF0dXJlLmdldERpc2NvdmVyeVNpdGVFbnRyeU1vZGVscygpOwotCQkJYXNzZXJ0VHJ1ZSgiRGlzY292ZXJ5IG1vZGVsIGlzIG5vdCBhIFdlYiBNb2RlbCIsIG1vZGVsc1swXS5nZXRUeXBlKCk9PUlVUkxFbnRyeS5XRUJfU0lURSk7Ci0JCQlVUkxFbnRyeU1vZGVsIGNvcHlyaWdodCA9IHJlbW90ZUZlYXR1cmUuZ2V0Q29weXJpZ2h0TW9kZWwoKTsKLQkJCWFzc2VydFRydWUoIkNvcHlyaWdodCBtb2RlbCBpcyBub3QgYW4gVXBkYXRlIE1vZGVsIiwgY29weXJpZ2h0LmdldFR5cGUoKT09SVVSTEVudHJ5LlVQREFURV9TSVRFKTsKLQkJCQotCQl9IGNhdGNoIChTQVhQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gc2hvdWxkIG5vdCBiZSB0aHJvd24iICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9wYXJzZXIvVGVzdFNpdGVQYXJzZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcGFyc2VyL1Rlc3RTaXRlUGFyc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU4NGZjYi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9wYXJzZXIvVGVzdFNpdGVQYXJzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMucGFyc2VyOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5TaXRlRmlsZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuVVJMRW5jb2RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuVXBkYXRlTWFuYWdlclRlc3RDYXNlOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgVGVzdFNpdGVQYXJzZSBleHRlbmRzIFVwZGF0ZU1hbmFnZXJUZXN0Q2FzZSB7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgVGVzdDEKLQkgKi8KLQlwdWJsaWMgVGVzdFNpdGVQYXJzZShTdHJpbmcgYXJnMCkgewotCQlzdXBlcihhcmcwKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UGFyc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlVUkwgcmVtb3RlVXJsID0gbmV3IFVSTChTT1VSQ0VfRklMRV9TSVRFICsgInhtbHMvc2l0ZTEvIik7Ci0JCUlTaXRlIHJlbW90ZVNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKHJlbW90ZVVybCxudWxsKTsKLQotCQkvL0lGZWF0dXJlUmVmZXJlbmNlW10gZmVhdHVyZSA9IHJlbW90ZVNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKTsKLQkJLy9JQ2F0ZWdvcnlbXSBjYXRlZ29yaWVzID0gcmVtb3RlU2l0ZS5nZXRDYXRlZ29yaWVzKCk7Ci0KLQkJU3RyaW5nIHBhdGggPSByZW1vdGVVcmwuZ2V0RmlsZSgpOwotCQlTdHJpbmcgcGF0aDIgPSByZW1vdGVTaXRlLmdldERlc2NyaXB0aW9uKCkuZ2V0VVJMKCkuZ2V0RmlsZSgpOwotCQlhc3NlcnRFcXVhbHMobmV3IEZpbGUocGF0aCArICJpbmRleC5odG1sIiksIG5ldyBGaWxlKHBhdGgyKSk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TnVtYmVyT2ZGZWF0dXJlcygpIHRocm93cyBFeGNlcHRpb24gewotCi0JCVVSTCByZW1vdGVVUkwgPSBuZXcgVVJMKCJodHRwIiwgZ2V0SHR0cEhvc3QoKSwgZ2V0SHR0cFBvcnQoKSwgYnVuZGxlLmdldFN0cmluZygiSFRUUF9QQVRIXzIiKSk7Ci0JCUlTaXRlIHJlbW90ZVNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKHJlbW90ZVVSTCxudWxsKTsKLQotCQlJRmVhdHVyZVJlZmVyZW5jZVtdIGZlYXR1cmUgPSByZW1vdGVTaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKCk7Ci0JCWFzc2VydEVxdWFscyhmZWF0dXJlLmxlbmd0aCwgMik7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UGFyc2VWYWxpZDEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlVUkwgcmVtb3RlVVJMID0gbmV3IFVSTChTT1VSQ0VfRklMRV9TSVRFICsgInBhcnNlcnRlc3RzL3NpdGUueG1sIik7Ci0JCURlZmF1bHRTaXRlUGFyc2VyIHBhcnNlciA9IG5ldyBEZWZhdWx0U2l0ZVBhcnNlcigpOwotCQlwYXJzZXIuaW5pdChuZXcgU2l0ZUZpbGVGYWN0b3J5KCkpOwotCQlVUkwgcmVzb2x2ZWRVUkwgPSBVUkxFbmNvZGVyLmVuY29kZShyZW1vdGVVUkwpOwotCQlTaXRlTW9kZWwgcmVtb3RlU2l0ZSA9IHBhcnNlci5wYXJzZShyZXNvbHZlZFVSTC5vcGVuU3RyZWFtKCkpOwotCQlyZW1vdGVTaXRlLnJlc29sdmUocmVtb3RlVVJMLCBudWxsKTsKLQotCQlGZWF0dXJlUmVmZXJlbmNlTW9kZWxbXSBmZWF0dXJlID0gcmVtb3RlU2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlTW9kZWxzKCk7Ci0JCUNhdGVnb3J5TW9kZWxbXSBjYXRlZ29yaWVzID0gcmVtb3RlU2l0ZS5nZXRDYXRlZ29yeU1vZGVscygpOwotCQlBcmNoaXZlUmVmZXJlbmNlTW9kZWxbXSBhcmNoaXZlcyA9IHJlbW90ZVNpdGUuZ2V0QXJjaGl2ZVJlZmVyZW5jZU1vZGVscygpOwotCi0JCWFzc2VydFRydWUoIldyb25nIG51bWJlciBvZiBmZWF0dXJlcyIsIGZlYXR1cmUubGVuZ3RoID09IDYpOwotCQlhc3NlcnRUcnVlKCJXcm9uZyBudW1iZXIgb2YgY2F0ZWdvcmllcyIsIGNhdGVnb3JpZXMubGVuZ3RoID09IDMpOwotCQlhc3NlcnRUcnVlKCJXcm9uZyBudW1iZXIgb2YgYXJjaGl2ZXMiLCBhcmNoaXZlcy5sZW5ndGggPT0gMCk7Ci0KLQkJU3RyaW5nIHBhdGggPSBuZXcgVVJMKFNPVVJDRV9GSUxFX1NJVEUgKyAicGFyc2VydGVzdHMvIikuZ2V0RmlsZSgpOwotCQlTdHJpbmcgcGF0aDIgPSByZW1vdGVTaXRlLmdldERlc2NyaXB0aW9uTW9kZWwoKS5nZXRVUkwoKS5nZXRGaWxlKCk7Ci0JCWFzc2VydEVxdWFscyhwYXRoICsgImluZGV4Lmh0bWwiLCBwYXRoMik7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UGFyc2VWYWxpZDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlVUkwgcmVtb3RlVVJMID0gbmV3IFVSTChTT1VSQ0VfRklMRV9TSVRFICsgInBhcnNlcnRlc3RzL3JlZGRvdC54bWwiKTsKLQkJRGVmYXVsdFNpdGVQYXJzZXIgcGFyc2VyID0gbmV3IERlZmF1bHRTaXRlUGFyc2VyKCk7Ci0JCXBhcnNlci5pbml0KG5ldyBTaXRlRmlsZUZhY3RvcnkoKSk7Ci0JCVVSTCByZXNvbHZlZFVSTCA9IFVSTEVuY29kZXIuZW5jb2RlKHJlbW90ZVVSTCk7Ci0JCVNpdGVNb2RlbCByZW1vdGVTaXRlID0gcGFyc2VyLnBhcnNlKHJlc29sdmVkVVJMLm9wZW5TdHJlYW0oKSk7Ci0JCXJlbW90ZVNpdGUucmVzb2x2ZShyZW1vdGVVUkwsIG51bGwpOwotCi0JCUZlYXR1cmVSZWZlcmVuY2VNb2RlbFtdIGZlYXR1cmUgPSByZW1vdGVTaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VNb2RlbHMoKTsKLQkJQ2F0ZWdvcnlNb2RlbFtdIGNhdGVnb3JpZXMgPSByZW1vdGVTaXRlLmdldENhdGVnb3J5TW9kZWxzKCk7Ci0JCUFyY2hpdmVSZWZlcmVuY2VNb2RlbFtdIGFyY2hpdmVzID0gcmVtb3RlU2l0ZS5nZXRBcmNoaXZlUmVmZXJlbmNlTW9kZWxzKCk7Ci0KLQkJYXNzZXJ0VHJ1ZSgiV3JvbmcgbnVtYmVyIG9mIGZlYXR1cmVzIiwgZmVhdHVyZS5sZW5ndGggPT0gMik7Ci0JCWFzc2VydFRydWUoIldyb25nIG51bWJlciBvZiBjYXRlZ29yaWVzIiwgY2F0ZWdvcmllcy5sZW5ndGggPT0gMSk7Ci0JCWFzc2VydFRydWUoIldyb25nIG51bWJlciBvZiBhcmNoaXZlcyIsIGFyY2hpdmVzLmxlbmd0aCA9PSAyKTsKLQotCQlTdHJpbmcgdmFsaWRlU3RyaW5nID0gIlRoaXMgY2F0ZWdvcnkgY29udGFpbnMgYWxsIG9mIHRoZSA8Y3VycmVudGx5PiBhdmFpbGFibGUgdmVyc2lvbnMgb2YgUmVkIERvdCBmZWF0dXJlLiA8Z3JlZXRpbmc+SGVsbG8sIHdvcmxkITwvZ3JlZXRpbmc+IjsKLQkJYXNzZXJ0RXF1YWxzKHZhbGlkZVN0cmluZywgcmVtb3RlU2l0ZS5nZXRDYXRlZ29yeU1vZGVscygpWzBdLmdldERlc2NyaXB0aW9uTW9kZWwoKS5nZXRBbm5vdGF0aW9uKCkpOwotCi0JCVN0cmluZyBwYXRoID0gbmV3IFVSTChTT1VSQ0VfRklMRV9TSVRFICsgInBhcnNlcnRlc3RzLyIpLmdldEZpbGUoKTsKLQkJU3RyaW5nIHBhdGgyID0gcmVtb3RlU2l0ZS5nZXREZXNjcmlwdGlvbk1vZGVsKCkuZ2V0VVJMKCkuZ2V0RmlsZSgpOwotCQlhc3NlcnRFcXVhbHMocGF0aCArICJpbmRleC5odG1sIiwgcGF0aDIpOwotCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdFBhcnNlVmFsaWQzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJVVJMIHJlbW90ZVVSTCA9IG5ldyBVUkwoU09VUkNFX0ZJTEVfU0lURSArICJwYXJzZXJ0ZXN0cy9yZWRkb3QxLnhtbCIpOwotCQlEZWZhdWx0U2l0ZVBhcnNlciBwYXJzZXIgPSBuZXcgRGVmYXVsdFNpdGVQYXJzZXIoKTsKLQkJcGFyc2VyLmluaXQobmV3IFNpdGVGaWxlRmFjdG9yeSgpKTsKLQkJVVJMIHJlc29sdmVkVVJMID0gVVJMRW5jb2Rlci5lbmNvZGUocmVtb3RlVVJMKTsKLQkJU2l0ZU1vZGVsIHJlbW90ZVNpdGUgPSBwYXJzZXIucGFyc2UocmVzb2x2ZWRVUkwub3BlblN0cmVhbSgpKTsKLQkJcmVtb3RlU2l0ZS5yZXNvbHZlKHJlbW90ZVVSTCwgbnVsbCk7Ci0KLQkJRmVhdHVyZVJlZmVyZW5jZU1vZGVsW10gZmVhdHVyZSA9IHJlbW90ZVNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZU1vZGVscygpOwotCQlDYXRlZ29yeU1vZGVsW10gY2F0ZWdvcmllcyA9IHJlbW90ZVNpdGUuZ2V0Q2F0ZWdvcnlNb2RlbHMoKTsKLQkJQXJjaGl2ZVJlZmVyZW5jZU1vZGVsW10gYXJjaGl2ZXMgPSByZW1vdGVTaXRlLmdldEFyY2hpdmVSZWZlcmVuY2VNb2RlbHMoKTsKLQotCQlhc3NlcnRUcnVlKCJXcm9uZyBudW1iZXIgb2YgZmVhdHVyZXMiLCBmZWF0dXJlLmxlbmd0aCA9PSAyKTsKLQkJYXNzZXJ0VHJ1ZSgiV3JvbmcgbnVtYmVyIG9mIGNhdGVnb3JpZXMiLCBjYXRlZ29yaWVzLmxlbmd0aCA9PSAxKTsKLQkJYXNzZXJ0VHJ1ZSgiV3JvbmcgbnVtYmVyIG9mIGFyY2hpdmVzIiwgYXJjaGl2ZXMubGVuZ3RoID09IDIpOwotCi0JCVN0cmluZyB2YWxpZGVTdHJpbmcgPSAiVGhpcyBjYXRlZ29yeSBjb250YWlucyBhbGwgb2YgdGhlIDxjdXJyZW50bHk+IGF2YWlsYWJsZSB2ZXJzaW9ucyBvZiBSZWQgRG90IGZlYXR1cmUuIjsKLQkJYXNzZXJ0RXF1YWxzKHZhbGlkZVN0cmluZywgcmVtb3RlU2l0ZS5nZXRDYXRlZ29yeU1vZGVscygpWzBdLmdldERlc2NyaXB0aW9uTW9kZWwoKS5nZXRBbm5vdGF0aW9uKCkpOwotCi0JCVN0cmluZyBwYXRoID0gbmV3IFVSTChTT1VSQ0VfRklMRV9TSVRFICsgInBhcnNlcnRlc3RzLyIpLmdldEZpbGUoKTsKLQkJU3RyaW5nIHBhdGgyID0gcmVtb3RlU2l0ZS5nZXREZXNjcmlwdGlvbk1vZGVsKCkuZ2V0VVJMKCkuZ2V0RmlsZSgpOwotCQlhc3NlcnRFcXVhbHMocGF0aCArICJpbmRleC5odG1sIiwgcGF0aDIpOwotCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdFBhcnNlVmFsaWQ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJVVJMIHJlbW90ZVVSTCA9IG5ldyBVUkwoU09VUkNFX0ZJTEVfU0lURSArICJTaXRlVVJMVGVzdC9kYXRhL3NpdGUueG1sIik7Ci0JCURlZmF1bHRTaXRlUGFyc2VyIHBhcnNlciA9IG5ldyBEZWZhdWx0U2l0ZVBhcnNlcigpOwotCQlwYXJzZXIuaW5pdChuZXcgU2l0ZUZpbGVGYWN0b3J5KCkpOwotCQlVUkwgcmVzb2x2ZWRVUkwgPSBVUkxFbmNvZGVyLmVuY29kZShyZW1vdGVVUkwpOwotCQlTaXRlTW9kZWwgcmVtb3RlU2l0ZSA9IHBhcnNlci5wYXJzZShyZXNvbHZlZFVSTC5vcGVuU3RyZWFtKCkpOwotCQlyZW1vdGVTaXRlLnJlc29sdmUocmVtb3RlVVJMLCBudWxsKTsKLQotCQlGZWF0dXJlUmVmZXJlbmNlTW9kZWxbXSBmZWF0dXJlID0gcmVtb3RlU2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlTW9kZWxzKCk7Ci0JCS8vQ2F0ZWdvcnlNb2RlbFtdIGNhdGVnb3JpZXMgPSByZW1vdGVTaXRlLmdldENhdGVnb3J5TW9kZWxzKCk7Ci0JCUFyY2hpdmVSZWZlcmVuY2VNb2RlbFtdIGFyY2hpdmVzID0gcmVtb3RlU2l0ZS5nZXRBcmNoaXZlUmVmZXJlbmNlTW9kZWxzKCk7Ci0KLQkJYXNzZXJ0VHJ1ZSgiV3JvbmcgbnVtYmVyIG9mIGZlYXR1cmVzIiwgZmVhdHVyZS5sZW5ndGggPT0gMik7Ci0JCWFzc2VydFRydWUoIldyb25nIG51bWJlciBvZiBhcmNoaXZlcyIsIGFyY2hpdmVzLmxlbmd0aCA9PSAzKTsKLQotCQlVUkwgcGF0aDEgPSBuZXcgVVJMKFNPVVJDRV9GSUxFX1NJVEUgKyAiU2l0ZVVSTFRlc3QvZGF0YS9hcnRpZmFjdHMvZmVhdHVyZXMvaGVscEZlYXR1cmUuamFyIik7Ci0JCVVSTCB1cmwxID0gZmVhdHVyZVswXS5nZXRVUkwoKTsKLQkJYXNzZXJ0RXF1YWxzKHBhdGgxLCB1cmwxKTsKLQkJVVJMIHBhdGgyID0gbmV3IFVSTChTT1VSQ0VfRklMRV9TSVRFICsgIlNpdGVVUkxUZXN0L2RhdGEvYXJ0aWZhY3RzL3BsdWdpbnMvaGVscC5qYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKHBhdGgyLCBhcmNoaXZlc1swXS5nZXRVUkwoKSk7Ci0KLQkJU3RyaW5nIHBhdGggPSBuZXcgVVJMKFNPVVJDRV9GSUxFX1NJVEUgKyAiU2l0ZVVSTFRlc3QvZGF0YS9pbmZvLyIpLmdldEZpbGUoKTsKLQkJU3RyaW5nIHBhdGgzID0gcmVtb3RlU2l0ZS5nZXREZXNjcmlwdGlvbk1vZGVsKCkuZ2V0VVJMKCkuZ2V0RmlsZSgpOwotCQlhc3NlcnRFcXVhbHMocGF0aCArICJzaXRlSW5mby5odG1sIiwgcGF0aDMpOwotCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdFBhcnNlVmFsaWQ1KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJVVJMIHJlbW90ZVVSTCA9IG5ldyBVUkwoU09VUkNFX0ZJTEVfU0lURSArICJwYXJzZXJ0ZXN0cy9zaXRlMi54bWwiKTsKLQkJRGVmYXVsdFNpdGVQYXJzZXIgcGFyc2VyID0gbmV3IERlZmF1bHRTaXRlUGFyc2VyKCk7Ci0JCXBhcnNlci5pbml0KG5ldyBTaXRlRmlsZUZhY3RvcnkoKSk7Ci0JCVVSTCByZXNvbHZlZFVSTCA9IFVSTEVuY29kZXIuZW5jb2RlKHJlbW90ZVVSTCk7Ci0JCVNpdGVNb2RlbCByZW1vdGVTaXRlID0gcGFyc2VyLnBhcnNlKHJlc29sdmVkVVJMLm9wZW5TdHJlYW0oKSk7Ci0JCXJlbW90ZVNpdGUucmVzb2x2ZShyZW1vdGVVUkwsIG51bGwpOwotCi0JCUZlYXR1cmVSZWZlcmVuY2VNb2RlbFtdIGZlYXR1cmVSZWYgPSByZW1vdGVTaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VNb2RlbHMoKTsKLQkJLy9DYXRlZ29yeU1vZGVsW10gY2F0ZWdvcmllcyA9IHJlbW90ZVNpdGUuZ2V0Q2F0ZWdvcnlNb2RlbHMoKTsKLQkJQXJjaGl2ZVJlZmVyZW5jZU1vZGVsW10gYXJjaGl2ZXMgPSByZW1vdGVTaXRlLmdldEFyY2hpdmVSZWZlcmVuY2VNb2RlbHMoKTsKLQotCQlhc3NlcnRUcnVlKCJXcm9uZyBudW1iZXIgb2YgZmVhdHVyZXMiLCBmZWF0dXJlUmVmLmxlbmd0aCA9PSAxKTsKLQkJYXNzZXJ0VHJ1ZSgiV3JvbmcgbnVtYmVyIG9mIGFyY2hpdmVzIiwgYXJjaGl2ZXMubGVuZ3RoID09IDApOwotCi0JCXRyeSB7Ci0JCQkoKEZlYXR1cmVSZWZlcmVuY2UpIGZlYXR1cmVSZWZbMF0pLmdldEZlYXR1cmUobnVsbCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJVGhyb3dhYmxlIGUxID0gZS5nZXRTdGF0dXMoKS5nZXRFeGNlcHRpb24oKTsKLQkJCWlmIChlMS5nZXRNZXNzYWdlKCkuaW5kZXhPZigibm90LWVjbGlwc2UiKSA9PSAtMSkgewotCQkJCXRocm93IGU7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UGFyc2VWYWxpZDYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlVUkwgcmVtb3RlVVJMID0gbmV3IFVSTChTT1VSQ0VfRklMRV9TSVRFICsgInBhcnNlcnRlc3RzL3NpdGU0LnhtbCIpOwotCQlEZWZhdWx0U2l0ZVBhcnNlciBwYXJzZXIgPSBuZXcgRGVmYXVsdFNpdGVQYXJzZXIoKTsKLQkJcGFyc2VyLmluaXQobmV3IFNpdGVGaWxlRmFjdG9yeSgpKTsKLQkJVVJMIHJlc29sdmVkVVJMID0gVVJMRW5jb2Rlci5lbmNvZGUocmVtb3RlVVJMKTsKLQkJU2l0ZU1vZGVsIHJlbW90ZVNpdGUgPSBwYXJzZXIucGFyc2UocmVzb2x2ZWRVUkwub3BlblN0cmVhbSgpKTsKLQkJcmVtb3RlU2l0ZS5yZXNvbHZlKHJlbW90ZVVSTCwgbnVsbCk7Ci0KLQkJRmVhdHVyZVJlZmVyZW5jZU1vZGVsW10gZmVhdHVyZVJlZiA9IHJlbW90ZVNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZU1vZGVscygpOwotCQkvL0NhdGVnb3J5TW9kZWxbXSBjYXRlZ29yaWVzID0gcmVtb3RlU2l0ZS5nZXRDYXRlZ29yeU1vZGVscygpOwotCQlBcmNoaXZlUmVmZXJlbmNlTW9kZWxbXSBhcmNoaXZlcyA9IHJlbW90ZVNpdGUuZ2V0QXJjaGl2ZVJlZmVyZW5jZU1vZGVscygpOwotCi0JCWFzc2VydFRydWUoIldyb25nIG51bWJlciBvZiBmZWF0dXJlcyIsIGZlYXR1cmVSZWYubGVuZ3RoID09IDIpOwotCQlhc3NlcnRUcnVlKCJXcm9uZyBudW1iZXIgb2YgYXJjaGl2ZXMiLCBhcmNoaXZlcy5sZW5ndGggPT0gMCk7Ci0KLQkJdHJ5IHsKLQkJCSgoRmVhdHVyZVJlZmVyZW5jZSkgZmVhdHVyZVJlZlswXSkuZ2V0RmVhdHVyZShudWxsKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlUaHJvd2FibGUgZTEgPSBlLmdldFN0YXR1cygpLmdldEV4Y2VwdGlvbigpOwotCQkJU3RyaW5nIG1zZyA9IGUxLmdldE1lc3NhZ2UoKS5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgJy8nKTsKLQkJCWlmIChtc2cuaW5kZXhPZigiXzEuMC4wLmphci9mZWF0dXJlLnhtbCIpID09IC0xKSB7Ci0JCQkJdGhyb3cgZTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQYXJzZVVua25vd25DYXRlZ29yeSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCVVSTCByZW1vdGVVUkwgPSBuZXcgVVJMKFNPVVJDRV9GSUxFX1NJVEUgKyAicGFyc2VydGVzdHMvc2l0ZTMueG1sIik7Ci0JCURlZmF1bHRTaXRlUGFyc2VyIHBhcnNlciA9IG5ldyBEZWZhdWx0U2l0ZVBhcnNlcigpOwotCQlwYXJzZXIuaW5pdChuZXcgU2l0ZUZpbGVGYWN0b3J5KCkpOwotCQlVUkwgcmVzb2x2ZWRVUkwgPSBVUkxFbmNvZGVyLmVuY29kZShyZW1vdGVVUkwpOwotCQlTaXRlTW9kZWwgcmVtb3RlU2l0ZSA9IHBhcnNlci5wYXJzZShyZXNvbHZlZFVSTC5vcGVuU3RyZWFtKCkpOwotCQlyZW1vdGVTaXRlLnJlc29sdmUocmVtb3RlVVJMLCBudWxsKTsKLQotCQlGZWF0dXJlUmVmZXJlbmNlTW9kZWxbXSBmZWF0dXJlUmVmID0gcmVtb3RlU2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlTW9kZWxzKCk7Ci0JCUlDYXRlZ29yeVtdIGNhdGVnb3JpZXMgPSAoKFNpdGVGZWF0dXJlUmVmZXJlbmNlKSBmZWF0dXJlUmVmWzBdKS5nZXRDYXRlZ29yaWVzKCk7Ci0JCWFzc2VydFRydWUoY2F0ZWdvcmllcy5sZW5ndGggPT0gMCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFBhcnNlVmFsaWQ3KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJdHJ5IHsKLQkJCVVSTCByZW1vdGVVUkwgPSBuZXcgVVJMKFNPVVJDRV9GSUxFX1NJVEUgKyAicGFyc2VydGVzdHMvc2l0ZTcueG1sIik7Ci0JCQlEZWZhdWx0U2l0ZVBhcnNlciBwYXJzZXIgPSBuZXcgRGVmYXVsdFNpdGVQYXJzZXIoKTsKLQkJCXBhcnNlci5pbml0KG5ldyBTaXRlRmlsZUZhY3RvcnkoKSk7Ci0JCQlVUkwgcmVzb2x2ZWRVUkwgPSBVUkxFbmNvZGVyLmVuY29kZShyZW1vdGVVUkwpOwotCQkJU2l0ZU1vZGVsIHJlbW90ZVNpdGUgPSBwYXJzZXIucGFyc2UocmVzb2x2ZWRVUkwub3BlblN0cmVhbSgpKTsKLQkJCXJlbW90ZVNpdGUucmVzb2x2ZShyZW1vdGVVUkwsIG51bGwpOwotCi0JCX0gY2F0Y2ggKFNBWFBhcnNlRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkV4Y2VwdGlvbiBzaG91bGQgbm90IGJlIHRocm93biIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UGFyc2VWYWxpZDgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQl0cnkgewotCQkJVVJMIHJlbW90ZVVSTCA9IG5ldyBVUkwoU09VUkNFX0ZJTEVfU0lURSArICJwYXJzZXJ0ZXN0cy9zaXRlOC54bWwiKTsKLQkJCURlZmF1bHRTaXRlUGFyc2VyIHBhcnNlciA9IG5ldyBEZWZhdWx0U2l0ZVBhcnNlcigpOwotCQkJcGFyc2VyLmluaXQobmV3IFNpdGVGaWxlRmFjdG9yeSgpKTsKLQkJCVVSTCByZXNvbHZlZFVSTCA9IFVSTEVuY29kZXIuZW5jb2RlKHJlbW90ZVVSTCk7Ci0JCQlTaXRlTW9kZWwgcmVtb3RlU2l0ZSA9IHBhcnNlci5wYXJzZShyZXNvbHZlZFVSTC5vcGVuU3RyZWFtKCkpOwotCQkJcmVtb3RlU2l0ZS5yZXNvbHZlKHJlbW90ZVVSTCwgbnVsbCk7Ci0KLQkJfSBjYXRjaCAoU0FYUGFyc2VFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRXhjZXB0aW9uIHNob3VsZCBub3QgYmUgdGhyb3duIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQYXJzZVZhbGlkOSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCXRyeSB7Ci0JCQlVUkwgcmVtb3RlVVJMID0gbmV3IFVSTChTT1VSQ0VfRklMRV9TSVRFICsgInBhcnNlcnRlc3RzL3NpdGU5LnhtbCIpOwotCQkJRGVmYXVsdFNpdGVQYXJzZXIgcGFyc2VyID0gbmV3IERlZmF1bHRTaXRlUGFyc2VyKCk7Ci0JCQlwYXJzZXIuaW5pdChuZXcgU2l0ZUZpbGVGYWN0b3J5KCkpOwotCQkJVVJMIHJlc29sdmVkVVJMID0gVVJMRW5jb2Rlci5lbmNvZGUocmVtb3RlVVJMKTsKLQkJCVNpdGVNb2RlbCByZW1vdGVTaXRlID0gcGFyc2VyLnBhcnNlKHJlc29sdmVkVVJMLm9wZW5TdHJlYW0oKSk7Ci0JCQlyZW1vdGVTaXRlLnJlc29sdmUocmVtb3RlVVJMLCBudWxsKTsKLQkJfSBjYXRjaCAoU0FYUGFyc2VFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRXhjZXB0aW9uIHNob3VsZCBub3QgYmUgdGhyb3duIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQYXJzZVZhbGlkMTAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlTaXRlTW9kZWwgcmVtb3RlU2l0ZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlVUkwgcmVtb3RlVVJMID0gbmV3IFVSTChTT1VSQ0VfRklMRV9TSVRFICsgInBhcnNlcnRlc3RzL3NpdGUxMC54bWwiKTsKLQkJCURlZmF1bHRTaXRlUGFyc2VyIHBhcnNlciA9IG5ldyBEZWZhdWx0U2l0ZVBhcnNlcigpOwotCQkJcGFyc2VyLmluaXQobmV3IFNpdGVGaWxlRmFjdG9yeSgpKTsKLQkJCVVSTCByZXNvbHZlZFVSTCA9IFVSTEVuY29kZXIuZW5jb2RlKHJlbW90ZVVSTCk7Ci0JCQlyZW1vdGVTaXRlID0gcGFyc2VyLnBhcnNlKHJlc29sdmVkVVJMLm9wZW5TdHJlYW0oKSk7Ci0JCQlyZW1vdGVTaXRlLnJlc29sdmUocmVtb3RlVVJMLCBudWxsKTsKLQkJfSBjYXRjaCAoU0FYUGFyc2VFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRXhjZXB0aW9uIHNob3VsZCBub3QgYmUgdGhyb3duIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQlGZWF0dXJlUmVmZXJlbmNlTW9kZWxbXSBtb2RlbHMgPSByZW1vdGVTaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VNb2RlbHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIHZlcnNpb25lZCBpZGVudGlmaWVyIiwgbW9kZWxzWzBdLmdldEZlYXR1cmVJZGVudGlmaWVyKCksICJvcmcuZWNsaXBzZS50ZXN0LmZlYXR1cmUiKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3BlcmZtcy9BbGxQZXJmb3JtYW5jZVRlc3RzLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9wZXJmbXMvQWxsUGVyZm9ybWFuY2VUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjUyOTVhLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3BlcmZtcy9BbGxQZXJmb3JtYW5jZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnBlcmZtczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5VcGRhdGVNYW5hZ2VyVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci0KLQotcHVibGljIGNsYXNzIEFsbFBlcmZvcm1hbmNlVGVzdHMgZXh0ZW5kcyBVcGRhdGVNYW5hZ2VyVGVzdENhc2UgewotcHVibGljIEFsbFBlcmZvcm1hbmNlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0Jc3VpdGUuc2V0TmFtZSgiVXBkYXRlIFBlcmZvcm1hbmNlIFRlc3RzIik7Ci0JCi0JLy8gdGhlIGZvbGxvd2luZyB3aWxsIHRha2UgYWxsIHRlaCB0ZXN0IG1ldGhvZHMgaW4gdGhlIGNsYXNzIHRoYXQgc3RhcnQgd2l0aCAndGVzdCcKLQkvL3N1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShUZXN0U3RhcnR1cC5jbGFzcykpOwotCXJldHVybiBzdWl0ZTsKLX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3BlcmZtcy9UZXN0U3RhcnR1cC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcGVyZm1zL1Rlc3RTdGFydHVwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkMTlmNTIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcGVyZm1zL1Rlc3RTdGFydHVwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnBlcmZtczsKLS8vaW1wb3J0IGphdmEubmV0Lio7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnRlc3QucGVyZm9ybWFuY2UuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRlc3QucGVyZm9ybWFuY2UuUGVyZm9ybWFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGVzdC5wZXJmb3JtYW5jZS5QZXJmb3JtYW5jZU1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb25maWd1cmF0b3IuUGxhdGZvcm1Db25maWd1cmF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29uZmlndXJhdG9yLlNpdGVFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuVXBkYXRlTWFuYWdlclRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgVGVzdFN0YXJ0dXAgZXh0ZW5kcyBVcGRhdGVNYW5hZ2VyVGVzdENhc2UgewotCXB1YmxpYyBUZXN0U3RhcnR1cChTdHJpbmcgYXJnMCkgewotCQlzdXBlcihhcmcwKTsKLQl9Ci0JCi0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29uZmlndXJhdGlvbkNyZWF0aW9uKCkgewotCQlQZXJmb3JtYW5jZSBwZXJmPSBQZXJmb3JtYW5jZS5nZXREZWZhdWx0KCk7Ci0JCVBlcmZvcm1hbmNlTWV0ZXIgcGVyZm9ybWFuY2VNZXRlcj0gcGVyZi5jcmVhdGVQZXJmb3JtYW5jZU1ldGVyKHBlcmYuZ2V0RGVmYXVsdFNjZW5hcmlvSWQodGhpcykpOwotCQlwZXJmLnRhZ0FzR2xvYmFsU3VtbWFyeShwZXJmb3JtYW5jZU1ldGVyLCAiQ29uZmlndXJhdGlvbiBjcmVhdGlvbiIsIERpbWVuc2lvbi5FTEFQU0VEX1BST0NFU1MpOwotCQkKLQkJdHJ5IHsKLQkJCWZvciAoaW50IGk9IDA7IGkgPCAxMDsgaSsrKSB7Ci0JCQkJcGVyZm9ybWFuY2VNZXRlci5zdGFydCgpOwotCQkJCXRyeSB7Ci0JCQkJCVVSTCBwbGF0Zm9ybVhtbCA9IG5ldyBVUkwoImZpbGUiLCAiIixkYXRhUGF0aCArICIvIiArICJwZXJmL3BsYXRmb3JtLnhtbCIpOwotCQkJCQluZXcgUGxhdGZvcm1Db25maWd1cmF0aW9uRmFjdG9yeSgpLmdldFBsYXRmb3JtQ29uZmlndXJhdGlvbihwbGF0Zm9ybVhtbCk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNhbm5vdCBjcmVhdGUgY29uZmlndXJhdGlvbiBmb3IgcGVyZm9ybWFuY2UgbWVhc3VyZW1lbnQiKTsKLQkJCQl9Ci0JCQkJcGVyZm9ybWFuY2VNZXRlci5zdG9wKCk7Ci0JIAkJfQotCQkJcGVyZm9ybWFuY2VNZXRlci5jb21taXQoKTsKLQkJCXBlcmYuYXNzZXJ0UGVyZm9ybWFuY2UocGVyZm9ybWFuY2VNZXRlcik7Ci0JIAl9IGZpbmFsbHkgewotCQkJcGVyZm9ybWFuY2VNZXRlci5kaXNwb3NlKCk7Ci0JIAl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDb25maWd1cmF0aW9uRGV0ZWN0aW9uKCkgewotCQlQZXJmb3JtYW5jZSBwZXJmPSBQZXJmb3JtYW5jZS5nZXREZWZhdWx0KCk7Ci0JCVBlcmZvcm1hbmNlTWV0ZXIgcGVyZm9ybWFuY2VNZXRlcj0gcGVyZi5jcmVhdGVQZXJmb3JtYW5jZU1ldGVyKHBlcmYuZ2V0RGVmYXVsdFNjZW5hcmlvSWQodGhpcykpOwotCQlwZXJmLnRhZ0FzR2xvYmFsU3VtbWFyeShwZXJmb3JtYW5jZU1ldGVyLCAiQ29uZmlndXJhdGlvbiBkZXRlY3Rpb24iLCBEaW1lbnNpb24uRUxBUFNFRF9QUk9DRVNTKTsKLQotCQl0cnkgewotCQkJZm9yIChpbnQgaT0gMDsgaSA8IDEwOyBpKyspIHsKLQkJCQlwZXJmb3JtYW5jZU1ldGVyLnN0YXJ0KCk7Ci0JCQkJdHJ5IHsKLQkJCQkJVVJMIHNpdGVVUkwgPSBuZXcgVVJMKCJmaWxlIiwgIiIsZGF0YVBhdGggKyAiLyIgKyAicGVyZi9lY2xpcHNlIik7Ci0JCQkJCVNpdGVFbnRyeSBzaXRlID0gbmV3IFNpdGVFbnRyeShzaXRlVVJMKTsKLQkJCQkJc2l0ZS5sb2FkRnJvbURpc2soMCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJDYW5ub3QgY3JlYXRlIHNpdGUgZW50cnkgZm9yIHBlcmZvcm1hbmNlIG1lYXN1cmVtZW50Iik7Ci0JCQkJfQotCQkJCXBlcmZvcm1hbmNlTWV0ZXIuc3RvcCgpOwotCSAJCX0KLQkJCXBlcmZvcm1hbmNlTWV0ZXIuY29tbWl0KCk7Ci0JCQlwZXJmLmFzc2VydFBlcmZvcm1hbmNlKHBlcmZvcm1hbmNlTWV0ZXIpOwotCSAJfSBmaW5hbGx5IHsKLQkJCXBlcmZvcm1hbmNlTWV0ZXIuZGlzcG9zZSgpOwotCSAJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3JlY29uY2lsaWF0aW9uL0FsbFJlY29uY2lsaWF0aW9uVGVzdHMuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3JlY29uY2lsaWF0aW9uL0FsbFJlY29uY2lsaWF0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFiNTQxYi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9yZWNvbmNpbGlhdGlvbi9BbGxSZWNvbmNpbGlhdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnJlY29uY2lsaWF0aW9uOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuVXBkYXRlTWFuYWdlclRlc3RDYXNlOwotCi0vKioKLSAqIE1hbmFnZXMgdGhlIEFQSSB0ZXN0cwotICovCi1wdWJsaWMgY2xhc3MgQWxsUmVjb25jaWxpYXRpb25UZXN0cyBleHRlbmRzIFVwZGF0ZU1hbmFnZXJUZXN0Q2FzZSB7Ci0JLyoqCi0JICogQ29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgQWxsUmVjb25jaWxpYXRpb25UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JLyoqCi0JICogTGlzdCBvZiBBUEkgdGVzdHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCQlzdWl0ZS5zZXROYW1lKCJBUEkgVGVzdHMiKTsKLQotCi0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShUZXN0U2l0ZVJlY29uY2lsaWF0aW9uLmNsYXNzKSk7Ci0KLQkJcmV0dXJuIHN1aXRlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3JlY29uY2lsaWF0aW9uL1Rlc3RTaXRlUmVjb25jaWxpYXRpb24uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3JlY29uY2lsaWF0aW9uL1Rlc3RTaXRlUmVjb25jaWxpYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjYxNTRiYi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9yZWNvbmNpbGlhdGlvbi9UZXN0U2l0ZVJlY29uY2lsaWF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5yZWNvbmNpbGlhdGlvbjsKLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IuSVBsYXRmb3JtQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yLklQbGF0Zm9ybUNvbmZpZ3VyYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLio7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0U2l0ZVJlY29uY2lsaWF0aW9uIGV4dGVuZHMgVXBkYXRlTWFuYWdlclRlc3RDYXNlIHsKLQkKLQotCQotCi0JLyoqCi0JICogVGVzdCB0aGUgZ2V0RmVhdHVyZXMoKQotCSAqLwotCXB1YmxpYyBUZXN0U2l0ZVJlY29uY2lsaWF0aW9uKFN0cmluZyBhcmcwKSB7Ci0JCXN1cGVyKGFyZzApOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRDb25maWdTaXRlKGludCBwb2xpY3ksIFVSTCB1cmwsU3RyaW5nW10gbGlzdE9mUGx1Z2lucykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyB4bWxGaWxlID0gKChMb2NhbFNpdGUpU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkpLmdldExvY2F0aW9uVVJMKCkuZ2V0RmlsZSgpOwotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0obmV3IEZpbGUoeG1sRmlsZSkpOwkJCi0JCUludGVybmFsU2l0ZU1hbmFnZXIubG9jYWxTaXRlPW51bGw7Ci0JCS8vIGdldCBuZXcgY29uZmlnIG9iamVjdAotCQlJUGxhdGZvcm1Db25maWd1cmF0aW9uIGNmaWcgPSBDb25maWd1cmF0b3JVdGlscy5nZXRDdXJyZW50UGxhdGZvcm1Db25maWd1cmF0aW9uKCk7Ci0JCUlTaXRlUG9saWN5IHAxID0gY2ZpZy5jcmVhdGVTaXRlUG9saWN5KHBvbGljeSwgbGlzdE9mUGx1Z2lucyk7CQotCQlJU2l0ZUVudHJ5IHMxID0gY2ZpZy5jcmVhdGVTaXRlRW50cnkodXJsLHAxKTsKLQkJY2ZpZy5jb25maWd1cmVTaXRlKHMxKTsJCi0JfQotCQotCXByaXZhdGUgdm9pZCByZW1vdmVDb25maWdTaXRlKFVSTCB1cmwpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBnZXQgbmV3IGNvbmZpZyBvYmplY3QKLQkJSVBsYXRmb3JtQ29uZmlndXJhdGlvbiBjZmlnID0gQ29uZmlndXJhdG9yVXRpbHMuZ2V0Q3VycmVudFBsYXRmb3JtQ29uZmlndXJhdGlvbigpOwotCQlJU2l0ZUVudHJ5IHMxID0gY2ZpZy5maW5kQ29uZmlndXJlZFNpdGUodXJsKTsKLQkJYXNzZXJ0Tm90TnVsbCgiVW5hYmxlIHRvIGZpbmQgc2l0ZSBlbnRyeToiK3VybCxzMSk7Ci0JCWNmaWcudW5jb25maWd1cmVTaXRlKHMxKTsKLQkJY2ZpZy5zYXZlKCk7Ci0JfQkKLQkvKioKLQkgKiBTaXRlIDEgY29udGFpbnMgYSBmZWF0dXJlIHdoaWNoIG5lZWRzIGEgcGx1Z2luIHRhaHQgaXMgbm90IG9uIHRoZSBwYXRoIHdoZW4gd2Ugc3RhcnQKLQkgKiBpdCB3aWxsIG5ldmVyIGJlIGNvbmZpZ3VyZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3U2l0ZUluY2x1ZGUxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCi0JCWludCBwb2xpY3kgID0gSVNpdGVQb2xpY3kuVVNFUl9JTkNMVURFOwotCQlVUkwgdXJsID0gbmV3IFVSTCgiZmlsZSIsbnVsbCxkYXRhUGF0aCsicmVjb25jaWxpYXRpb25TaXRlcy9zaXRlMS8iKTsKLQkJU3RyaW5nW10gcGx1Z2lucyA9IG5ldyBTdHJpbmdbXXt9OwotCQlhZGRDb25maWdTaXRlKHBvbGljeSx1cmwsIHBsdWdpbnMpOwotCi0JCUlMb2NhbFNpdGUgbG9jYWwgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKTsKLQkJKChMb2NhbFNpdGUpbG9jYWwpLnNldFN0YW1wKDApOwotCQlJQ29uZmlndXJlZFNpdGVbXSBuZXdTaXRlcyA9IGxvY2FsLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkuZ2V0Q29uZmlndXJlZFNpdGVzKCk7Ci0JCUlDb25maWd1cmVkU2l0ZSBuZXdTaXRlID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuZXdTaXRlcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKFVwZGF0ZU1hbmFnZXJVdGlscy5zYW1lVVJMKG5ld1NpdGVzW2ldLmdldFNpdGUoKS5nZXRVUkwoKSx1cmwpKXsKLQkJCQluZXdTaXRlID0gbmV3U2l0ZXNbaV07Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmIChuZXdTaXRlPT1udWxsKSBmYWlsKCJTaXRlIG5vdCBmb3VuZCBpbiBjb25maWd1cmF0aW9uIik7Ci0JCQotCQlJRmVhdHVyZVJlZmVyZW5jZVtdIHJlZiA9IG5ld1NpdGUuZ2V0Q29uZmlndXJlZEZlYXR1cmVzKCk7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgbnVtYmVyIG9mIGNvbmZpZ3VyZWQgZmVhdHVyZXMiLDAscmVmLmxlbmd0aCk7CQkKLQkJcmVmID0gKChDb25maWd1cmVkU2l0ZSluZXdTaXRlKS5nZXRDb25maWd1cmF0aW9uUG9saWN5KCkuZ2V0VW5jb25maWd1cmVkRmVhdHVyZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBudW1iZXIgb2YgdW5jb25maWd1cmVkIGZlYXR1cmVzIiwwLHJlZi5sZW5ndGgpOwkJCi0JCQotCQlyZW1vdmVDb25maWdTaXRlKHVybCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld1NpdGVFeGNsdWRlMSgpIHRocm93cyBFeGNlcHRpb24gewotCQkKLQkJaW50IHBvbGljeSAgPSBJU2l0ZVBvbGljeS5VU0VSX0VYQ0xVREU7Ci0JCVVSTCB1cmwgPSBuZXcgVVJMKCJmaWxlIixudWxsLGRhdGFQYXRoKyJyZWNvbmNpbGlhdGlvblNpdGVzL3NpdGUxLyIpOwotCQlTdHJpbmdbXSBwbHVnaW5zID0gbmV3IFN0cmluZ1tde307Ci0JCWFkZENvbmZpZ1NpdGUocG9saWN5LHVybCwgcGx1Z2lucyk7Ci0JCQotCQlJTG9jYWxTaXRlIGxvY2FsID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCk7Ci0JCSgoTG9jYWxTaXRlKWxvY2FsKS5zZXRTdGFtcCgwKTsJCQotCQlJQ29uZmlndXJlZFNpdGVbXSBuZXdTaXRlcyA9IGxvY2FsLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkuZ2V0Q29uZmlndXJlZFNpdGVzKCk7Ci0JCUlDb25maWd1cmVkU2l0ZSBuZXdTaXRlID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuZXdTaXRlcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKFVwZGF0ZU1hbmFnZXJVdGlscy5zYW1lVVJMKG5ld1NpdGVzW2ldLmdldFNpdGUoKS5nZXRVUkwoKSx1cmwpKXsKLQkJCQluZXdTaXRlID0gbmV3U2l0ZXNbaV07Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmIChuZXdTaXRlPT1udWxsKSBmYWlsKCJTaXRlIG5vdCBmb3VuZCBpbiBjb25maWd1cmF0aW9uIik7Ci0JCQotCQlJRmVhdHVyZVJlZmVyZW5jZVtdIHJlZiA9IG5ld1NpdGUuZ2V0Q29uZmlndXJlZEZlYXR1cmVzKCk7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgbnVtYmVyIG9mIGNvbmZpZ3VyZWQgZmVhdHVyZXMiLDAscmVmLmxlbmd0aCk7CQkKLQkJcmVmID0gKChDb25maWd1cmVkU2l0ZSluZXdTaXRlKS5nZXRDb25maWd1cmF0aW9uUG9saWN5KCkuZ2V0VW5jb25maWd1cmVkRmVhdHVyZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBudW1iZXIgb2YgdW5jb25maWd1cmVkIGZlYXR1cmVzIiwwLHJlZi5sZW5ndGgpOwkJCQkKLQkJcmVtb3ZlQ29uZmlnU2l0ZSh1cmwpOwotCX0KLQotCS8qKgotCSAqIFNpdGUgMiBjb250YWlucyBhIGZlYXR1cmUgd2hpY2ggbmVlZHMgYSBwbHVnaW4gdGFodCBpcyBvbiB0aGUgcGF0aCB3aGVuIHdlIHN0YXJ0Ci0JICogaXQgd2lsbCBiZSBjb25maWd1cmVkCi0JICovCi0JcHVibGljIHZvaWQgdGVzdE5ld1NpdGVJbmNsdWRlMigpIHRocm93cyBFeGNlcHRpb24gewotCQkKLQkJaW50IHBvbGljeSAgPSBJU2l0ZVBvbGljeS5VU0VSX0lOQ0xVREU7Ci0JCVVSTCB1cmwgPSBuZXcgVVJMKCJmaWxlIixudWxsLGRhdGFQYXRoKyJyZWNvbmNpbGlhdGlvblNpdGVzL3NpdGUyLyIpOwotCQlTdHJpbmdbXSBwbHVnaW5zID0gbmV3IFN0cmluZ1tde307Ci0JCWFkZENvbmZpZ1NpdGUocG9saWN5LHVybCwgcGx1Z2lucyk7Ci0JCUlMb2NhbFNpdGUgbG9jYWwgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKTsKLQkJKChMb2NhbFNpdGUpbG9jYWwpLnNldFN0YW1wKDApOwkJCi0JCUlDb25maWd1cmVkU2l0ZVtdIG5ld1NpdGVzID0gbG9jYWwuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKS5nZXRDb25maWd1cmVkU2l0ZXMoKTsKLQkJSUNvbmZpZ3VyZWRTaXRlIG5ld1NpdGUgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5ld1NpdGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoVXBkYXRlTWFuYWdlclV0aWxzLnNhbWVVUkwobmV3U2l0ZXNbaV0uZ2V0U2l0ZSgpLmdldFVSTCgpLHVybCkpewotCQkJCW5ld1NpdGUgPSBuZXdTaXRlc1tpXTsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKG5ld1NpdGU9PW51bGwpIGZhaWwoIlNpdGUgbm90IGZvdW5kIGluIGNvbmZpZ3VyYXRpb24iKTsKLQkJCi0JCUlGZWF0dXJlUmVmZXJlbmNlW10gcmVmID0gbmV3U2l0ZS5nZXRDb25maWd1cmVkRmVhdHVyZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBudW1iZXIgb2YgY29uZmlndXJlZCBmZWF0dXJlcyIsMCxyZWYubGVuZ3RoKTsKLQkJcmVmID0gKChDb25maWd1cmVkU2l0ZSluZXdTaXRlKS5nZXRDb25maWd1cmF0aW9uUG9saWN5KCkuZ2V0VW5jb25maWd1cmVkRmVhdHVyZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBudW1iZXIgb2YgdW5jb25maWd1cmVkIGZlYXR1cmVzIiwwLHJlZi5sZW5ndGgpOwotCQkKLQkJcmVtb3ZlQ29uZmlnU2l0ZSh1cmwpOwotCX0KLQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3U2l0ZUV4Y2x1ZGUyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQotCQlpbnQgcG9saWN5ICA9IElTaXRlUG9saWN5LlVTRVJfRVhDTFVERTsKLQkJVVJMIHVybCA9IG5ldyBVUkwoImZpbGUiLG51bGwsZGF0YVBhdGgrInJlY29uY2lsaWF0aW9uU2l0ZXMvc2l0ZTIvIik7Ci0JCVN0cmluZ1tdIHBsdWdpbnMgPSBuZXcgU3RyaW5nW117fTsKLQkJYWRkQ29uZmlnU2l0ZShwb2xpY3ksdXJsLCBwbHVnaW5zKTsKLQkJSUxvY2FsU2l0ZSBsb2NhbCA9IFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpOwotCQkoKExvY2FsU2l0ZSlsb2NhbCkuc2V0U3RhbXAoMCk7CQkKLQkJSUNvbmZpZ3VyZWRTaXRlW10gbmV3U2l0ZXMgPSBsb2NhbC5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpLmdldENvbmZpZ3VyZWRTaXRlcygpOwotCQlJQ29uZmlndXJlZFNpdGUgbmV3U2l0ZSA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbmV3U2l0ZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChVcGRhdGVNYW5hZ2VyVXRpbHMuc2FtZVVSTChuZXdTaXRlc1tpXS5nZXRTaXRlKCkuZ2V0VVJMKCksdXJsKSl7Ci0JCQkJbmV3U2l0ZSA9IG5ld1NpdGVzW2ldOwotCQkJfQotCQl9Ci0JCQotCQlpZiAobmV3U2l0ZT09bnVsbCkgZmFpbCgiU2l0ZSBub3QgZm91bmQgaW4gY29uZmlndXJhdGlvbiIpOwotCQkKLQkJSUZlYXR1cmVSZWZlcmVuY2VbXSByZWYgPSBuZXdTaXRlLmdldENvbmZpZ3VyZWRGZWF0dXJlcygpOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIG51bWJlciBvZiBjb25maWd1cmVkIGZlYXR1cmVzIiwwLHJlZi5sZW5ndGgpOwotCQlyZWYgPSAoKENvbmZpZ3VyZWRTaXRlKW5ld1NpdGUpLmdldENvbmZpZ3VyYXRpb25Qb2xpY3koKS5nZXRVbmNvbmZpZ3VyZWRGZWF0dXJlcygpOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIG51bWJlciBvZiB1bmNvbmZpZ3VyZWQgZmVhdHVyZXMiLDAscmVmLmxlbmd0aCk7Ci0KLQkJcmVtb3ZlQ29uZmlnU2l0ZSh1cmwpOwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcmVndWxhckluc3RhbGwvQWxsUmVndWxhckluc3RhbGxUZXN0cy5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcmVndWxhckluc3RhbGwvQWxsUmVndWxhckluc3RhbGxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDI5OTIwLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3JlZ3VsYXJJbnN0YWxsL0FsbFJlZ3VsYXJJbnN0YWxsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMucmVndWxhckluc3RhbGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuVXBkYXRlTWFuYWdlclRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotCi0KLXB1YmxpYyBjbGFzcyBBbGxSZWd1bGFySW5zdGFsbFRlc3RzIGV4dGVuZHMgVXBkYXRlTWFuYWdlclRlc3RDYXNlIHsKLXB1YmxpYyBBbGxSZWd1bGFySW5zdGFsbFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCXN1aXRlLnNldE5hbWUoIlJlZ3VsYXIgSW5zdGFsbCBUZXN0cyIpOwotCQotCS8vIHRoZSBmb2xsb3dpbmcgd2lsbCB0YWtlIGFsbCB0ZWggdGVzdCBtZXRob2RzIGluIHRlaCBjbGFzcyB0aGF0IHN0YXJ0IHdpdGggJ3Rlc3QnCi0KLQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoVGVzdEluc3RhbGwuY2xhc3MpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoVGVzdEluc3RhbGxVUkxTSXRlWE1MLmNsYXNzKSk7CQotCXN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShUZXN0U3BhY2VJbkluc3RhbGwuY2xhc3MpKTsJCi0Jc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFRlc3RHZXRGZWF0dXJlLmNsYXNzKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFRlc3RFeGVjdXRhYmxlSW5zdGFsbC5jbGFzcykpOwkKLQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoVGVzdEV4ZWN1dGFibGVQYWNrYWdlZEluc3RhbGwuY2xhc3MpKTsJCQotCXN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShUZXN0RGF0YUVudHJ5SW5zdGFsbC5jbGFzcykpOwotCXN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShUZXN0TG9jYWxTaXRlLmNsYXNzKSk7CQkKLQkKLQkvLyBvciB5b3UgY2FuIHNwZWNpZnkgdGhlIG1ldGhvZAotCS8vc3VpdGUuYWRkVGVzdChuZXcgVGVzdEdldEZlYXR1cmUoIm1ldGhvZFRoYXREb2VzTm90U3RhcnRXaXRodGVzdCIpKTsJCi0JCi0JcmV0dXJuIHN1aXRlOwotfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcmVndWxhckluc3RhbGwvTXVsdGlwbGVUZXN0TG9jYWxTaXRlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9yZWd1bGFySW5zdGFsbC9NdWx0aXBsZVRlc3RMb2NhbFNpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE0YjVmMy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9yZWd1bGFySW5zdGFsbC9NdWx0aXBsZVRlc3RMb2NhbFNpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMucmVndWxhckluc3RhbGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuVXBkYXRlTWFuYWdlclRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotCi0KLXB1YmxpYyBjbGFzcyBNdWx0aXBsZVRlc3RMb2NhbFNpdGUgZXh0ZW5kcyBVcGRhdGVNYW5hZ2VyVGVzdENhc2UgewotcHVibGljIE11bHRpcGxlVGVzdExvY2FsU2l0ZShTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlzdWl0ZS5zZXROYW1lKCJNdWx0aXBsZSBUZXN0IExvY2FsIFNpdGUiKTsKLQkKLQkvLyB0aGUgZm9sbG93aW5nIHdpbGwgdGFrZSBhbGwgdGVoIHRlc3QgbWV0aG9kcyBpbiB0ZWggY2xhc3MgdGhhdCBzdGFydCB3aXRoICd0ZXN0JwotCQotCWZvcihpbnQgaT0wOyBpPDUwOyBpKyspewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoVGVzdExvY2FsU2l0ZS5jbGFzcykpOwotCX0KLQkKLQlyZXR1cm4gc3VpdGU7Ci19Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9yZWd1bGFySW5zdGFsbC9UZXN0RGF0YUVudHJ5SW5zdGFsbC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcmVndWxhckluc3RhbGwvVGVzdERhdGFFbnRyeUluc3RhbGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzYzZjAzZS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9yZWd1bGFySW5zdGFsbC9UZXN0RGF0YUVudHJ5SW5zdGFsbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMucmVndWxhckluc3RhbGw7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuVXBkYXRlTWFuYWdlclV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5VcGRhdGVNYW5hZ2VyVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0RGF0YUVudHJ5SW5zdGFsbCBleHRlbmRzIFVwZGF0ZU1hbmFnZXJUZXN0Q2FzZSB7Ci0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIFRlc3QxCi0JICovCi0JcHVibGljIFRlc3REYXRhRW50cnlJbnN0YWxsKFN0cmluZyBhcmcwKSB7Ci0JCXN1cGVyKGFyZzApOwotCX0KLQotCS8qKgotCSAqIFdpdGggc2l0ZS54bWwKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0RGF0YUVudHJ5U2l0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCS8vY2xlYW51cCB0YXJnZXQgCi0JCUZpbGUgdGFyZ2V0ID0gbmV3IEZpbGUoVEFSR0VUX0ZJTEVfU0lURS5nZXRGaWxlKCkpOwotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0odGFyZ2V0KTsKLQkJCi0JCVVSTCBuZXdVUkwgPW5ldyBGaWxlKGRhdGFQYXRoICsgImRhdGFFbnRyeVNpdGVUZXN0L3NpdGUxL3NpdGUueG1sIikudG9VUkwoKTsKLQkJSVNpdGUgcmVtb3RlU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUobmV3VVJMLG51bGwpOwotCQlJRmVhdHVyZVJlZmVyZW5jZVtdIGZlYXR1cmVzUmVmID0gcmVtb3RlU2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlcygpOwotCQlJU2l0ZSBsb2NhbFNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKFRBUkdFVF9GSUxFX1NJVEUsbnVsbCk7Ci0JCUlGZWF0dXJlIHJlbW90ZUZlYXR1cmUgPSBudWxsOwotCQkKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlc1JlZi5sZW5ndGg7IGkrKykgewotCQkJcmVtb3RlRmVhdHVyZSA9IGZlYXR1cmVzUmVmW2ldLmdldEZlYXR1cmUobnVsbCk7Ci0JCQlsb2NhbFNpdGUuaW5zdGFsbChyZW1vdGVGZWF0dXJlLCBudWxsLG51bGwpOwotCi0JCQkvLyB2ZXJpZnkKLQkJCVN0cmluZyBzaXRlID0gbG9jYWxTaXRlLmdldFVSTCgpLmdldEZpbGUoKTsKLQkJCUlOb25QbHVnaW5FbnRyeVtdIGVudHJpZXMgPSByZW1vdGVGZWF0dXJlLmdldE5vblBsdWdpbkVudHJpZXMoKTsKLQkJCWFzc2VydFRydWUoIm5vIGRhdGEgZW50cnkiLCAoZW50cmllcyAhPSBudWxsICYmIGVudHJpZXMubGVuZ3RoICE9IDApKTsKLQkJCVN0cmluZyBwbHVnaW5OYW1lID0gZW50cmllc1swXS5nZXRJZGVudGlmaWVyKCkudG9TdHJpbmcoKTsKLQkJCUZpbGUgcGx1Z2luRmlsZSA9IG5ldyBGaWxlKHNpdGUsIFNpdGUuREVGQVVMVF9JTlNUQUxMRURfRkVBVFVSRV9QQVRIICsgcmVtb3RlRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKStGaWxlLnNlcGFyYXRvcisgcGx1Z2luTmFtZSk7Ci0JCQlhc3NlcnRUcnVlKCJkYXRhIGZpbGVzIG5vdCBpbnN0YWxsZWQgbG9jYWxseToiK3BsdWdpbkZpbGUsIHBsdWdpbkZpbGUuZXhpc3RzKCkpOwotCQl9IAotCi0JCS8vY2xlYW51cCB0YXJnZXQgCi0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbSh0YXJnZXQpOwotCi0KLQl9Ci0JCi0JCi0JLyoqCi0JICogV2l0aCBzaXRlLnhtbAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3REYXRhRW50cnlTaXRlUGFja2FnZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQkvL2NsZWFudXAgdGFyZ2V0IAotCQlGaWxlIHRhcmdldCA9IG5ldyBGaWxlKFRBUkdFVF9GSUxFX1NJVEUuZ2V0RmlsZSgpKTsKLQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKHRhcmdldCk7Ci0JCQotCQlVUkwgbmV3VVJMID1uZXcgRmlsZShkYXRhUGF0aCArICJkYXRhRW50cnlTaXRlVGVzdC9zaXRlMi9zaXRlLnhtbCIpLnRvVVJMKCk7Ci0JCUlTaXRlIHJlbW90ZVNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKG5ld1VSTCxudWxsKTsKLQkJSUZlYXR1cmVSZWZlcmVuY2VbXSBmZWF0dXJlc1JlZiA9IHJlbW90ZVNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKTsKLQkJSVNpdGUgbG9jYWxTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShUQVJHRVRfRklMRV9TSVRFLG51bGwpOwotCQlJRmVhdHVyZSByZW1vdGVGZWF0dXJlID0gbnVsbDsKLQkJCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXNSZWYubGVuZ3RoOyBpKyspIHsKLQkJCXJlbW90ZUZlYXR1cmUgPSBmZWF0dXJlc1JlZltpXS5nZXRGZWF0dXJlKG51bGwpOwotCQkJbG9jYWxTaXRlLmluc3RhbGwocmVtb3RlRmVhdHVyZSwgbnVsbCxudWxsKTsKLQotCQkJLy8gdmVyaWZ5Ci0JCQlTdHJpbmcgc2l0ZSA9IGxvY2FsU2l0ZS5nZXRVUkwoKS5nZXRGaWxlKCk7Ci0JCQlJTm9uUGx1Z2luRW50cnlbXSBlbnRyaWVzID0gcmVtb3RlRmVhdHVyZS5nZXROb25QbHVnaW5FbnRyaWVzKCk7Ci0JCQlhc3NlcnRUcnVlKCJubyBkYXRhIGVudHJ5IiwgKGVudHJpZXMgIT0gbnVsbCAmJiBlbnRyaWVzLmxlbmd0aCAhPSAwKSk7Ci0JCQllbnRyaWVzWzBdLmdldElkZW50aWZpZXIoKS50b1N0cmluZygpOwotCQkJRmlsZSBwbHVnaW5GaWxlID0gbmV3IEZpbGUoc2l0ZSwgU2l0ZS5ERUZBVUxUX0lOU1RBTExFRF9GRUFUVVJFX1BBVEggKyByZW1vdGVGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpK0ZpbGUuc2VwYXJhdG9yKyAibm9uZGF0YSIrRmlsZS5zZXBhcmF0b3IrImZpbGUxLnppcCIpOwotCQkJYXNzZXJ0VHJ1ZSgiRGF0YSBmaWxlIGluc2lkZSB0aGUgamFyIG5vdCBpbnN0YWxsZWQgbG9jYWxseToiK3BsdWdpbkZpbGUsIHBsdWdpbkZpbGUuZXhpc3RzKCkpOwotCQkJcGx1Z2luRmlsZSA9IG5ldyBGaWxlKHNpdGUsIFNpdGUuREVGQVVMVF9JTlNUQUxMRURfRkVBVFVSRV9QQVRIICsgcmVtb3RlRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKStGaWxlLnNlcGFyYXRvcisgImZpbGUuemlwIik7Ci0JCQlhc3NlcnRUcnVlKCJEYXRhIGZpbGUgb3V0c2lkZSB0aGUgamFyIG5vdCBpbnN0YWxsZWQgbG9jYWxseToiK3BsdWdpbkZpbGUsIHBsdWdpbkZpbGUuZXhpc3RzKCkpOwotCQkJCi0JCX0gCi0JCQotCi0JCS8vY2xlYW51cCB0YXJnZXQgCi0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbSh0YXJnZXQpOwotCi0KLQl9CQotCQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcmVndWxhckluc3RhbGwvVGVzdEV4ZWN1dGFibGVJbnN0YWxsLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9yZWd1bGFySW5zdGFsbC9UZXN0RXhlY3V0YWJsZUluc3RhbGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU5OTYwMy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9yZWd1bGFySW5zdGFsbC9UZXN0RXhlY3V0YWJsZUluc3RhbGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMucmVndWxhckluc3RhbGw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5VcGRhdGVNYW5hZ2VyVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLlVwZGF0ZU1hbmFnZXJUZXN0Q2FzZTsKLQotCi1wdWJsaWMgY2xhc3MgVGVzdEV4ZWN1dGFibGVJbnN0YWxsIGV4dGVuZHMgVXBkYXRlTWFuYWdlclRlc3RDYXNlIHsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBUZXN0MQotCSAqLwotCXB1YmxpYyBUZXN0RXhlY3V0YWJsZUluc3RhbGwoU3RyaW5nIGFyZzApIHsKLQkJc3VwZXIoYXJnMCk7Ci0JfQotCQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlsZVNpdGUoKSB0aHJvd3MgRXhjZXB0aW9uewotCQkKLQkJLy9jbGVhbnVwIHRhcmdldCAKLQkJRmlsZSB0YXJnZXQgPSBuZXcgRmlsZShUQVJHRVRfRklMRV9TSVRFLmdldEZpbGUoKSk7Ci0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbSh0YXJnZXQpOwkJCi0JCUluc3RhbGxSZWdpc3RyeS5jbGVhbnVwKCk7Ci0JCQotCQlJU2l0ZSByZW1vdGVTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShTT1VSQ0VfRklMRV9TSVRFX0lOU1RBTExFRCxudWxsKTsKLQkJSUZlYXR1cmVSZWZlcmVuY2VbXSByZW1vdGVGZWF0dXJlUmVmZXJlbmNlID0gcmVtb3RlU2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlcygpOwotCQlJRmVhdHVyZSByZW1vdGVGZWF0dXJlID0gcmVtb3RlRmVhdHVyZVJlZmVyZW5jZVswXS5nZXRGZWF0dXJlKG51bGwpOwotCQlJU2l0ZSBsb2NhbFNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKFRBUkdFVF9GSUxFX1NJVEUsbnVsbCk7Ci0JCWFzc2VydE5vdE51bGwocmVtb3RlRmVhdHVyZSk7Ci0JCXJlbW92ZShyZW1vdGVGZWF0dXJlLGxvY2FsU2l0ZSk7CQkKLQkJbG9jYWxTaXRlLmluc3RhbGwocmVtb3RlRmVhdHVyZSxudWxsLG51bGwpOwotCQkKLQkJLy8gdmVyaWZ5Ci0JCVN0cmluZyBzaXRlID0gbG9jYWxTaXRlLmdldFVSTCgpLmdldEZpbGUoKTsKLQkJSVBsdWdpbkVudHJ5W10gZW50cmllcyA9IHJlbW90ZUZlYXR1cmUuZ2V0UmF3UGx1Z2luRW50cmllcygpOwotCQlhc3NlcnRUcnVlKCJubyBwbHVnaW5zIGVudHJ5IiwoZW50cmllcyE9bnVsbCAmJiBlbnRyaWVzLmxlbmd0aCE9MCkpOwotCQlTdHJpbmcgcGx1Z2luTmFtZT0gZW50cmllc1swXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKTsKLQkJRmlsZSBwbHVnaW5GaWxlID0gbmV3IEZpbGUoc2l0ZSxTaXRlLkRFRkFVTFRfUExVR0lOX1BBVEgrcGx1Z2luTmFtZSk7Ci0JCWlmIChMb2NhbGUuZ2V0RGVmYXVsdCgpLnRvU3RyaW5nKCkuaW5kZXhPZigidXMiKSAhPSAtMSkKLQkJCWFzc2VydFRydWUoInBsdWdpbiBmaWxlcyBub3QgaW5zdGFsbGVkIGxvY2FsbHkiLHBsdWdpbkZpbGUuZXhpc3RzKCkpOwotCi0JCUZpbGUgZmVhdHVyZUZpbGUgPSBuZXcgRmlsZShzaXRlLFNpdGUuREVGQVVMVF9JTlNUQUxMRURfRkVBVFVSRV9QQVRIK3JlbW90ZUZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkpOwotCQlhc3NlcnRUcnVlKCJmZWF0dXJlIGluZm8gbm90IGluc3RhbGxlZCBsb2NhbGx5OiIrZmVhdHVyZUZpbGUsZmVhdHVyZUZpbGUuZXhpc3RzKCkpOwotCQlhc3NlcnRUcnVlKCJmZWF0dXJlIGlzIGEgZmlsZSwgbm90IGEgZGlyZWN0b3J5OiIrZmVhdHVyZUZpbGUsZmVhdHVyZUZpbGUuaXNEaXJlY3RvcnkoKSk7Ci0KLQkJCi0JCUZpbGUgZmVhdHVyZUZpbGVYTUwgPSBuZXcgRmlsZShzaXRlLFNpdGUuREVGQVVMVF9JTlNUQUxMRURfRkVBVFVSRV9QQVRIK3JlbW90ZUZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkrRmlsZS5zZXBhcmF0b3IrImZlYXR1cmUueG1sIik7Ci0JCWFzc2VydFRydWUoImZlYXR1cmUgaW5mbyBub3QgaW5zdGFsbGVkIGxvY2FsbHk6IG5vIGZlYXR1cmUueG1sIixmZWF0dXJlRmlsZVhNTC5leGlzdHMoKSk7Ci0KLQkJLy9jbGVhbnVwIHRhcmdldCAKLQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKHRhcmdldCk7Ci0JCQotCX0KLQotfQotCi0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3JlZ3VsYXJJbnN0YWxsL1Rlc3RFeGVjdXRhYmxlUGFja2FnZWRJbnN0YWxsLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9yZWd1bGFySW5zdGFsbC9UZXN0RXhlY3V0YWJsZVBhY2thZ2VkSW5zdGFsbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWNjNmRkLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3JlZ3VsYXJJbnN0YWxsL1Rlc3RFeGVjdXRhYmxlUGFja2FnZWRJbnN0YWxsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5yZWd1bGFySW5zdGFsbDsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5VcGRhdGVNYW5hZ2VyVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0RXhlY3V0YWJsZVBhY2thZ2VkSW5zdGFsbCBleHRlbmRzIFVwZGF0ZU1hbmFnZXJUZXN0Q2FzZSB7Ci0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIFRlc3QxCi0JICovCi0JcHVibGljIFRlc3RFeGVjdXRhYmxlUGFja2FnZWRJbnN0YWxsKFN0cmluZyBhcmcwKSB7Ci0JCXN1cGVyKGFyZzApOwotCX0KLQotCS8qKgotCSAqIFdpdGggc2l0ZS54bWwKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0RmlsZVBhY2thZ2VFeGVjdXRhYmxlRmVhdHVyZVNpdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQkvL2NsZWFudXAgdGFyZ2V0ICAKLQkJRmlsZSB0YXJnZXQgPSBuZXcgRmlsZShUQVJHRVRfRklMRV9TSVRFLmdldEZpbGUoKSk7Ci0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbSh0YXJnZXQpOwotCQkKLQkJVVJMIG5ld1VSTCA9IG5ldyBGaWxlKGRhdGFQYXRoICsgIkV4ZWN1dGFibGVGZWF0dXJlUGFja2FnZWRTaXRlL2RhdGEyL3NpdGUueG1sIikudG9VUkwoKTsKLQkJSVNpdGUgcmVtb3RlU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUobmV3VVJMLG51bGwpOwotCQlJRmVhdHVyZVJlZmVyZW5jZVtdIGZlYXR1cmVzUmVmID0gcmVtb3RlU2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlcygpOwotCQlJU2l0ZSBsb2NhbFNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKFRBUkdFVF9GSUxFX1NJVEUsbnVsbCk7Ci0JCUlGZWF0dXJlIHJlbW90ZUZlYXR1cmUgPSBudWxsOwotCQkKLQkJLy8gYXQgbGVhc3Qgb25lIGV4ZWN1dGFibGUgZmVhdHVyZSBhbmQgb24gcGFja2FnZWQKLQkJYm9vbGVhbiBleGVjRmVhdHVyZSA9IGZhbHNlOwotCQlib29sZWFuIHBhY2tGZWF0dXJlID0gZmFsc2U7Ci0KLQkJaWYgKGZlYXR1cmVzUmVmLmxlbmd0aD09MCkgZmFpbCAoIm5vIGZlYXR1cmUgZm91bmQiKTsKLQkKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlc1JlZi5sZW5ndGg7IGkrKykgewotCQkJcmVtb3RlRmVhdHVyZSA9IGZlYXR1cmVzUmVmW2ldLmdldEZlYXR1cmUobnVsbCk7Ci0JCQlyZW1vdmUocmVtb3RlRmVhdHVyZSxsb2NhbFNpdGUpOwkJCQotCQkJbG9jYWxTaXRlLmluc3RhbGwocmVtb3RlRmVhdHVyZSwgbnVsbCxudWxsKTsKLQkJCQotCQkJaWYgKHJlbW90ZUZlYXR1cmUuZ2V0RmVhdHVyZUNvbnRlbnRQcm92aWRlcigpIGluc3RhbmNlb2YgRmVhdHVyZVBhY2thZ2VkQ29udGVudFByb3ZpZGVyKSBwYWNrRmVhdHVyZSA9IHRydWU7Ci0JCQlpZiAocmVtb3RlRmVhdHVyZS5nZXRGZWF0dXJlQ29udGVudFByb3ZpZGVyKCkgaW5zdGFuY2VvZiBGZWF0dXJlRXhlY3V0YWJsZUNvbnRlbnRQcm92aWRlcikgZXhlY0ZlYXR1cmUgPSB0cnVlOwotCi0JCQkvLyB2ZXJpZnkKLQkJCVN0cmluZyBzaXRlID0gbG9jYWxTaXRlLmdldFVSTCgpLmdldEZpbGUoKTsKLQkJCUlQbHVnaW5FbnRyeVtdIGVudHJpZXMgPSByZW1vdGVGZWF0dXJlLmdldFJhd1BsdWdpbkVudHJpZXMoKTsKLQkJCWFzc2VydFRydWUoIm5vIHBsdWdpbnMgZW50cnkiLCAoZW50cmllcyAhPSBudWxsICYmIGVudHJpZXMubGVuZ3RoICE9IDApKTsKLQkJCVN0cmluZyBwbHVnaW5OYW1lID0gZW50cmllc1swXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKTsKLQkJCUZpbGUgcGx1Z2luRmlsZSA9IG5ldyBGaWxlKHNpdGUsIFNpdGUuREVGQVVMVF9QTFVHSU5fUEFUSCArIHBsdWdpbk5hbWUpOwotCQkJYXNzZXJ0VHJ1ZSgicGx1Z2luIGZpbGVzIG5vdCBpbnN0YWxsZWQgbG9jYWxseToiK3BsdWdpbkZpbGUsIHBsdWdpbkZpbGUuZXhpc3RzKCkpOwotCi0JCQlGaWxlIGZlYXR1cmVGaWxlID0gbmV3IEZpbGUoc2l0ZSwgU2l0ZS5ERUZBVUxUX0lOU1RBTExFRF9GRUFUVVJFX1BBVEggKyByZW1vdGVGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpKTsKLQkJCWFzc2VydFRydWUoImZlYXR1cmUgaW5mbyBub3QgaW5zdGFsbGVkIGxvY2FsbHk6IitmZWF0dXJlRmlsZSwgZmVhdHVyZUZpbGUuZXhpc3RzKCkpOwotCi0JCQlGaWxlIGZlYXR1cmVGaWxlWE1MID0gbmV3IEZpbGUoc2l0ZSwgU2l0ZS5ERUZBVUxUX0lOU1RBTExFRF9GRUFUVVJFX1BBVEggKyByZW1vdGVGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpICsgRmlsZS5zZXBhcmF0b3IgKyAiZmVhdHVyZS54bWwiKTsKLQkJCWFzc2VydFRydWUoImZlYXR1cmUgaW5mbyBub3QgaW5zdGFsbGVkIGxvY2FsbHk6IG5vIGZlYXR1cmUueG1sIiwgZmVhdHVyZUZpbGVYTUwuZXhpc3RzKCkpOwotCQl9Ci0KLQkJaWYgKCFleGVjRmVhdHVyZSAmJiAhcGFja0ZlYXR1cmUpewotCQkJZmFpbCgiY2Fubm90IGZpbmQgb25lIGV4ZWN1dGFibGUgYW5kIG9uZSBwYWNrYWdlIGZlYXR1cmUgb24gdGVoIHNpdGUiKTsKLQkJfQotCi0JCS8vY2xlYW51cCB0YXJnZXQgCi0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbSh0YXJnZXQpOwotCi0KLQl9Ci0JCi0JCi0JLyoqCi0JICogV2l0aG91dCBzaXRlLnhtbAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RGaWxlTm9TaXRlWE1MU2l0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCS8vY2xlYW51cCB0YXJnZXQgCi0JCUZpbGUgdGFyZ2V0ID0gbmV3IEZpbGUoVEFSR0VUX0ZJTEVfU0lURS5nZXRGaWxlKCkpOwotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0odGFyZ2V0KTsKLQkJCi0JCVVSTCBuZXdVUkwgPSBuZXcgRmlsZShkYXRhUGF0aCArICJFeGVjdXRhYmxlRmVhdHVyZVBhY2thZ2VkU2l0ZS9kYXRhLyIpLnRvVVJMKCk7Ci0JCUlTaXRlIHJlbW90ZVNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKG5ld1VSTCxudWxsKTsKLQkJSUZlYXR1cmVSZWZlcmVuY2VbXSBmZWF0dXJlc1JlZiA9IHJlbW90ZVNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKTsKLQkJSVNpdGUgbG9jYWxTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShUQVJHRVRfRklMRV9TSVRFLG51bGwpOwotCQlJRmVhdHVyZSByZW1vdGVGZWF0dXJlID0gbnVsbDsKLQkJCi0JCS8vIGF0IGxlYXN0IG9uZSBleGVjdXRhYmxlIGZlYXR1cmUgYW5kIG9uIHBhY2thZ2VkCi0JCWJvb2xlYW4gZXhlY0ZlYXR1cmUgPSBmYWxzZTsKLQkJYm9vbGVhbiBwYWNrRmVhdHVyZSA9IGZhbHNlOwotCi0JCWlmIChmZWF0dXJlc1JlZi5sZW5ndGg9PTApIGZhaWwgKCJubyBmZWF0dXJlIGZvdW5kIik7Ci0JCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXNSZWYubGVuZ3RoOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJcmVtb3RlRmVhdHVyZSA9IGZlYXR1cmVzUmVmW2ldLmdldEZlYXR1cmUobnVsbCk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpewotCQkJCVRocm93YWJsZSBlMSA9IGUuZ2V0U3RhdHVzKCkuZ2V0RXhjZXB0aW9uKCk7Ci0JCQkJU3RyaW5nIG1zZyA9IGUxLmdldE1lc3NhZ2UoKS5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwnLycpOwotCQkJCWlmIChtc2cuaW5kZXhPZigiQ1ZTL2ZlYXR1cmUueG1sIik9PS0xKXsKLQkJCQkJdGhyb3cgZTsKLQkJCQl9CQkJCQotCQkJfQotCQkJaWYgKHJlbW90ZUZlYXR1cmUhPW51bGwpewotCQkJCXJlbW92ZShyZW1vdGVGZWF0dXJlLGxvY2FsU2l0ZSk7Ci0JCQkJbG9jYWxTaXRlLmluc3RhbGwocmVtb3RlRmVhdHVyZSxudWxsLCBudWxsKTsKLQkJCQkKLQkJCQlpZiAocmVtb3RlRmVhdHVyZS5nZXRGZWF0dXJlQ29udGVudFByb3ZpZGVyKCkgaW5zdGFuY2VvZiBGZWF0dXJlUGFja2FnZWRDb250ZW50UHJvdmlkZXIpIHBhY2tGZWF0dXJlID0gdHJ1ZTsKLQkJCQlpZiAocmVtb3RlRmVhdHVyZS5nZXRGZWF0dXJlQ29udGVudFByb3ZpZGVyKCkgaW5zdGFuY2VvZiBGZWF0dXJlRXhlY3V0YWJsZUNvbnRlbnRQcm92aWRlcikgZXhlY0ZlYXR1cmUgPSB0cnVlOwotCQotCQkJCS8vIHZlcmlmeQotCQkJCVN0cmluZyBzaXRlID0gbG9jYWxTaXRlLmdldFVSTCgpLmdldEZpbGUoKTsKLQkJCQlJUGx1Z2luRW50cnlbXSBlbnRyaWVzID0gcmVtb3RlRmVhdHVyZS5nZXRSYXdQbHVnaW5FbnRyaWVzKCk7Ci0JCQkJYXNzZXJ0VHJ1ZSgibm8gcGx1Z2lucyBlbnRyeSIsIChlbnRyaWVzICE9IG51bGwgJiYgZW50cmllcy5sZW5ndGggIT0gMCkpOwotCQkJCVN0cmluZyBwbHVnaW5OYW1lID0gZW50cmllc1swXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKTsKLQkJCQlGaWxlIHBsdWdpbkZpbGUgPSBuZXcgRmlsZShzaXRlLCBTaXRlLkRFRkFVTFRfUExVR0lOX1BBVEggKyBwbHVnaW5OYW1lKTsKLQkJCQlhc3NlcnRUcnVlKCJwbHVnaW4gZmlsZXMgbm90IGluc3RhbGxlZCBsb2NhbGx5OiIrcGx1Z2luRmlsZSwgcGx1Z2luRmlsZS5leGlzdHMoKSk7Ci0JCi0JCQkJRmlsZSBmZWF0dXJlRmlsZSA9IG5ldyBGaWxlKHNpdGUsIFNpdGUuREVGQVVMVF9JTlNUQUxMRURfRkVBVFVSRV9QQVRIICsgcmVtb3RlRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSk7Ci0JCQkJYXNzZXJ0VHJ1ZSgiZmVhdHVyZSBpbmZvIG5vdCBpbnN0YWxsZWQgbG9jYWxseToiK2ZlYXR1cmVGaWxlLCBmZWF0dXJlRmlsZS5leGlzdHMoKSk7Ci0JCi0JCQkJRmlsZSBmZWF0dXJlRmlsZVhNTCA9IG5ldyBGaWxlKHNpdGUsIFNpdGUuREVGQVVMVF9JTlNUQUxMRURfRkVBVFVSRV9QQVRIICsgcmVtb3RlRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSArIEZpbGUuc2VwYXJhdG9yICsgImZlYXR1cmUueG1sIik7Ci0JCQkJYXNzZXJ0VHJ1ZSgiZmVhdHVyZSBpbmZvIG5vdCBpbnN0YWxsZWQgbG9jYWxseTogbm8gZmVhdHVyZS54bWwiLCBmZWF0dXJlRmlsZVhNTC5leGlzdHMoKSk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoIWV4ZWNGZWF0dXJlICYmICFwYWNrRmVhdHVyZSl7Ci0JCQlmYWlsKCJjYW5ub3QgZmluZCBvbmUgZXhlY3V0YWJsZSBhbmQgb25lIHBhY2thZ2UgZmVhdHVyZSBvbiB0ZWggc2l0ZSIpOwotCQl9Ci0KLQkJLy9jbGVhbnVwIHRhcmdldCAKLQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKHRhcmdldCk7Ci0KLQotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3JlZ3VsYXJJbnN0YWxsL1Rlc3RHZXRGZWF0dXJlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9yZWd1bGFySW5zdGFsbC9UZXN0R2V0RmVhdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjgxZDg3Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3JlZ3VsYXJJbnN0YWxsL1Rlc3RHZXRGZWF0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnJlZ3VsYXJJbnN0YWxsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuVXBkYXRlTWFuYWdlclRlc3RDYXNlOwotCi0KLXB1YmxpYyBjbGFzcyBUZXN0R2V0RmVhdHVyZSBleHRlbmRzIFVwZGF0ZU1hbmFnZXJUZXN0Q2FzZSB7Ci0KLQkvKioKLQkgKiBUZXN0IHRoZSBnZXRGZWF0dXJlcygpCi0JICovCi0JcHVibGljIFRlc3RHZXRGZWF0dXJlKFN0cmluZyBhcmcwKSB7Ci0JCXN1cGVyKGFyZzApOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RmVhdHVyZUZpbGVTaXRlKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLQkJCi0JCUlTaXRlIHJlbW90ZVNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKFNPVVJDRV9GSUxFX1NJVEUsbnVsbCk7Ci0JCUlGZWF0dXJlUmVmZXJlbmNlW10gcmVtb3RlRmVhdHVyZXMgPSByZW1vdGVTaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKCk7Ci0JCWlmIChyZW1vdGVGZWF0dXJlcz09bnVsbCB8fCByZW1vdGVGZWF0dXJlcy5sZW5ndGg9PTApIGZhaWwoIk5vIGZlYXR1cmUgYXZhaWxhYmxlIGZvciB0ZXN0aW5nIik7Ci0JCWZvciAoaW50IGk9MDtpPHJlbW90ZUZlYXR1cmVzLmxlbmd0aDtpKyspewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJmZWF0dXJlOiIrcmVtb3RlRmVhdHVyZXNbaV0uZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKSk7Ci0JCX0KLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHRlc3RGZWF0dXJlSFRUUFNpdGUoKSB0aHJvd3MgRXhjZXB0aW9ueyAKLQkJCi0JCUlTaXRlIHJlbW90ZVNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKFNPVVJDRV9IVFRQX1NJVEUsbnVsbCk7Ci0JCUlGZWF0dXJlUmVmZXJlbmNlW10gcmVtb3RlRmVhdHVyZXMgPSByZW1vdGVTaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKCk7Ci0JCWlmIChyZW1vdGVGZWF0dXJlcz09bnVsbCB8fCByZW1vdGVGZWF0dXJlcy5sZW5ndGg9PTApIGZhaWwoIk5vIGZlYXR1cmUgYXZhaWxhYmxlIGZvciB0ZXN0aW5nIik7CQkKLQkJZm9yIChpbnQgaT0wO2k8cmVtb3RlRmVhdHVyZXMubGVuZ3RoO2krKyl7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImZlYXR1cmU6IityZW1vdGVGZWF0dXJlc1tpXS5nZXRVUkwoKS50b0V4dGVybmFsRm9ybSgpKTsKLQkJfQotCX0KLX0KLQotCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9yZWd1bGFySW5zdGFsbC9UZXN0SW5zdGFsbC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcmVndWxhckluc3RhbGwvVGVzdEluc3RhbGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzY2NzczNi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9yZWd1bGFySW5zdGFsbC9UZXN0SW5zdGFsbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMucmVndWxhckluc3RhbGw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uSUNvbmZpZ3VyZWRTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLklDb25maWd1cmVkU2l0ZUNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi5JTG9jYWxTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklGZWF0dXJlUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklQbHVnaW5FbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5TaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLlNpdGVGZWF0dXJlUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLlNpdGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLkNvbmZpZ3VyZWRTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLkluc3RhbGxDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLkluc3RhbGxSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5Mb2NhbFNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuVXBkYXRlQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5VcGRhdGVNYW5hZ2VyVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLlVwZGF0ZU1hbmFnZXJUZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIFRlc3RJbnN0YWxsIGV4dGVuZHMgVXBkYXRlTWFuYWdlclRlc3RDYXNlIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBQ0tBR0VEX0ZFQVRVUkVfVFlQRSA9ICJwYWNrYWdlZCI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgU2V0IGZpbGVzVG9EZWxldGUgPSBuZXcgSGFzaFNldCgpOwotCQotCi0JcHVibGljIGNsYXNzIExpc3RlbmVyIGltcGxlbWVudHMgSUNvbmZpZ3VyZWRTaXRlQ2hhbmdlZExpc3RlbmVyIHsKLQotCQlwdWJsaWMgYm9vbGVhbiBub3RpZmllZCA9IGZhbHNlOwotCi0JCXB1YmxpYyB2b2lkIGZlYXR1cmVJbnN0YWxsZWQoSUZlYXR1cmUgZmVhdHVyZSkgewotCQkJbm90aWZpZWQgPSB0cnVlOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJOb3RpZmllZCBEZWZhdWx0RmVhdHVyZSBJbnN0YWxsZWQiKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGZlYXR1cmVSZW1vdmVkKElGZWF0dXJlIGZlYXR1cmUpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGZlYXR1cmVDb25maWd1cmVkKElGZWF0dXJlIGZlYXR1cmUpIHsKLQkJfQotCQlwdWJsaWMgdm9pZCBmZWF0dXJlVW5jb25maWd1cmVkKElGZWF0dXJlIGZlYXR1cmUpIHsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzTm90aWZpZWQoKSB7Ci0JCQlyZXR1cm4gbm90aWZpZWQ7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgVGVzdDEKLQkgKi8KLQlwdWJsaWMgVGVzdEluc3RhbGwoU3RyaW5nIGFyZzApIHsKLQkJc3VwZXIoYXJnMCk7Ci0JfQotCi0JcHJpdmF0ZSBJRmVhdHVyZSBnZXRGZWF0dXJlMShJU2l0ZSBzaXRlKQotCQl0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJU2l0ZUZlYXR1cmVSZWZlcmVuY2UgcmVmID0gbmV3IFNpdGVGZWF0dXJlUmVmZXJlbmNlKCk7Ci0JCXJlZi5zZXRTaXRlKHNpdGUpOwotCQlyZWYuc2V0VVJMU3RyaW5nKCJmZWF0dXJlcy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMV8xLjAuNC5qYXIiKTsKLQkJcmVmLnNldFR5cGUoZ2V0RGVmYXVsdEluc3RhbGxhYmxlRmVhdHVyZVR5cGUoKSk7Ci0JCXJlZi5yZXNvbHZlKHNpdGUuZ2V0VVJMKCksIG51bGwpOwotCQlyZXR1cm4gcmVmLmdldEZlYXR1cmUobnVsbCk7Ci0JfQotCQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlsZVNpdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlJU2l0ZSByZW1vdGVTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShTT1VSQ0VfRklMRV9TSVRFLG51bGwpOwotCQlJRmVhdHVyZSByZW1vdGVGZWF0dXJlID0gZ2V0RmVhdHVyZTEocmVtb3RlU2l0ZSk7Ci0JCUlTaXRlIGxvY2FsU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUoVEFSR0VUX0ZJTEVfU0lURSwgbnVsbCk7Ci0JCWZpbGVzVG9EZWxldGUuYWRkKG5ldyBGaWxlKGxvY2FsU2l0ZS5nZXRVUkwoKS5nZXRGaWxlKCkpKTsKLQkJbG9jYWxTaXRlLmluc3RhbGwocmVtb3RlRmVhdHVyZSwgbnVsbCwgbnVsbCk7Ci0KLQkJLy8gdmVyaWZ5Ci0JCVN0cmluZyBzaXRlID0gbG9jYWxTaXRlLmdldFVSTCgpLmdldEZpbGUoKTsKLQkJSVBsdWdpbkVudHJ5W10gZW50cmllcyA9IHJlbW90ZUZlYXR1cmUuZ2V0UGx1Z2luRW50cmllcygpOwotCQlhc3NlcnRUcnVlKCJubyBwbHVnaW5zIGVudHJ5IiwgKGVudHJpZXMgIT0gbnVsbCAmJiBlbnRyaWVzLmxlbmd0aCAhPSAwKSk7Ci0JCVN0cmluZyBwbHVnaW5OYW1lID0gZW50cmllc1swXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKTsKLQkJRmlsZSBwbHVnaW5GaWxlID0gbmV3IEZpbGUoc2l0ZSwgU2l0ZS5ERUZBVUxUX1BMVUdJTl9QQVRIICsgcGx1Z2luTmFtZSk7Ci0JCWZpbGVzVG9EZWxldGUuYWRkKHBsdWdpbkZpbGUpOwotCQlhc3NlcnRUcnVlKCJwbHVnaW4gZmlsZXMgbm90IGluc3RhbGxlZCBsb2NhbGx5OiIrcGx1Z2luRmlsZSwgcGx1Z2luRmlsZS5leGlzdHMoKSk7Ci0JCUZpbGUgcGx1Z2luWE1MRmlsZSA9Ci0JCQluZXcgRmlsZSgKLQkJCQlzaXRlLAotCQkJCVNpdGUuREVGQVVMVF9QTFVHSU5fUEFUSCArIHBsdWdpbk5hbWUgKyBGaWxlLnNlcGFyYXRvciArICJwbHVnaW4ueG1sIik7Ci0JCWFzc2VydFRydWUoInBsdWdpbi54bWwgZmlsZSBub3QgaW5zdGFsbGVkIGxvY2FsbHkiLCBwbHVnaW5YTUxGaWxlLmV4aXN0cygpKTsKLQotCQlGaWxlIGZlYXR1cmVGaWxlID0KLQkJCW5ldyBGaWxlKAotCQkJCXNpdGUsCi0JCQkJU2l0ZS5ERUZBVUxUX0lOU1RBTExFRF9GRUFUVVJFX1BBVEgKLQkJCQkJKyByZW1vdGVGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpKTsKLQkJYXNzZXJ0VHJ1ZSgKLQkJCSJmZWF0dXJlIGluZm8gbm90IGluc3RhbGxlZCBsb2NhbGx5OiIgKyBmZWF0dXJlRmlsZSwKLQkJCWZlYXR1cmVGaWxlLmV4aXN0cygpKTsKLQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RIVFRQU2l0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCUlTaXRlIHJlbW90ZVNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKFNPVVJDRV9IVFRQX1NJVEUsbnVsbCk7Ci0JCUlGZWF0dXJlUmVmZXJlbmNlW10gZmVhdHVyZXMgPSByZW1vdGVTaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKCk7Ci0JCUlGZWF0dXJlIHJlbW90ZUZlYXR1cmUgPSBudWxsOwotCi0JCWlmIChmZWF0dXJlcyA9PSBudWxsIHx8IGZlYXR1cmVzLmxlbmd0aCA9PSAwKQotCQkJZmFpbCgiTm8gZmVhdHVyZXMgb24gdGhlIHNpdGUiKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoZmVhdHVyZXNbaV0uZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKS5lbmRzV2l0aCgiZmVhdHVyZXMyLmphciIpKSB7Ci0JCQkJcmVtb3RlRmVhdHVyZSA9IGZlYXR1cmVzW2ldLmdldEZlYXR1cmUobnVsbCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlhc3NlcnROb3ROdWxsKCJDYW5ub3QgZmluZCBmZWF0dXJlMi5qYXIgb24gc2l0ZSIsIHJlbW90ZUZlYXR1cmUpOwotCQlJU2l0ZSBsb2NhbFNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKFRBUkdFVF9GSUxFX1NJVEUsIG51bGwpOwotCQlmaWxlc1RvRGVsZXRlLmFkZChuZXcgRmlsZShsb2NhbFNpdGUuZ2V0VVJMKCkuZ2V0RmlsZSgpKSk7Ci0JCWxvY2FsU2l0ZS5pbnN0YWxsKHJlbW90ZUZlYXR1cmUsIG51bGwsIG51bGwpOwotCi0JCS8vIGZlYXR1cmUyLmphciBzaG91bGQgbm90IGJlIGluIHRoZSBsb2NhbCBzaXRlCi0JCUlGZWF0dXJlUmVmZXJlbmNlW10gbG9jYWxGZWF0dXJlcyA9IGxvY2FsU2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlcygpOwotCQlpZiAobG9jYWxGZWF0dXJlcyA9PSBudWxsIHx8IGxvY2FsRmVhdHVyZXMubGVuZ3RoID09IDApCi0JCQlmYWlsKCJObyBmZWF0dXJlcyBvbiB0aGUgdGFyZ2V0IHNpdGUiKTsKLQotCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbG9jYWxGZWF0dXJlcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGxvY2FsRmVhdHVyZXNbaV0uZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKS5lbmRzV2l0aCgiZmVhdHVyZXMyLmphciIpKSB7Ci0JCQkJZm91bmQgPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJYXNzZXJ0VHJ1ZSgKLQkJCSJGb3VuZCBmZWF0dXJlMi5qYXIgb24gdGFyZ2V0IHNpdGUuIFRhcmdldCBzaXRlIGZlYXR1cmUgcmVmIHNob3VsZG5vdCBjb250YWluIEpBUiBmaWxlIiwKLQkJCSFmb3VuZCk7Ci0KLQkJLy8gY2hlY2sKLQkJU3RyaW5nIHNpdGUgPSBsb2NhbFNpdGUuZ2V0VVJMKCkuZ2V0RmlsZSgpOwotCQlJUGx1Z2luRW50cnlbXSBlbnRyaWVzID0gcmVtb3RlRmVhdHVyZS5nZXRQbHVnaW5FbnRyaWVzKCk7Ci0JCWFzc2VydFRydWUoIm5vIHBsdWdpbnMgZW50cnkiLCAoZW50cmllcyAhPSBudWxsICYmIGVudHJpZXMubGVuZ3RoICE9IDApKTsKLQotCQlTdHJpbmcgcGx1Z2luTmFtZSA9IGVudHJpZXNbMF0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCk7Ci0JCUZpbGUgcGx1Z2luRmlsZSA9IG5ldyBGaWxlKHNpdGUsIFNpdGUuREVGQVVMVF9QTFVHSU5fUEFUSCArIHBsdWdpbk5hbWUpOwotCQlmaWxlc1RvRGVsZXRlLmFkZChwbHVnaW5GaWxlKTsKLQkJYXNzZXJ0VHJ1ZSgicGx1Z2luIGluZm8gbm90IGluc3RhbGxlZCBsb2NhbGx5OiIrcGx1Z2luRmlsZSwgcGx1Z2luRmlsZS5leGlzdHMoKSk7Ci0KLQkJRmlsZSBmZWF0dXJlRmlsZSA9Ci0JCQluZXcgRmlsZSgKLQkJCQlzaXRlLAotCQkJCVNpdGUuREVGQVVMVF9JTlNUQUxMRURfRkVBVFVSRV9QQVRICi0JCQkJCSsgcmVtb3RlRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSk7Ci0JCWFzc2VydFRydWUoImZlYXR1cmUgaW5mbyBub3QgaW5zdGFsbGVkIGxvY2FsbHkiLCBmZWF0dXJlRmlsZS5leGlzdHMoKSk7Ci0JCQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnN0YWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJLy8gY2xlYW51cCBsb2NhbCBmaWxlcy4uLgotCQlGaWxlIGxvY2FsRmlsZSA9IG5ldyBGaWxlKCgoTG9jYWxTaXRlKVNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpKS5nZXRMb2NhdGlvblVSTCgpLmdldEZpbGUoKSk7Ci0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShsb2NhbEZpbGUpOwotCi0JCVVSTCBJTlNUQUxMX1NJVEUgPSBudWxsOwotCQl0cnkgewotCQkJSU5TVEFMTF9TSVRFID0KLQkJCQluZXcgVVJMKCJodHRwIiwgZ2V0SHR0cEhvc3QoKSwgZ2V0SHR0cFBvcnQoKSwgYnVuZGxlLmdldFN0cmluZygiSFRUUF9QQVRIXzIiKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKGUudG9TdHJpbmcoKSk7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCQotCQlJU2l0ZSByZW1vdGVTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShJTlNUQUxMX1NJVEUsbnVsbCk7Ci0JCUlGZWF0dXJlUmVmZXJlbmNlW10gZmVhdHVyZXMgPSByZW1vdGVTaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKCk7Ci0JCUlGZWF0dXJlIHJlbW90ZUZlYXR1cmUgPSBudWxsOwotCi0JCWlmIChmZWF0dXJlcyA9PSBudWxsIHx8IGZlYXR1cmVzLmxlbmd0aCA9PSAwKQotCQkJZmFpbCgiTm8gZmVhdHVyZXMgb24gdGhlIHNpdGUiKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoZmVhdHVyZXNbaV0uZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKS5lbmRzV2l0aCgiaGVscEZlYXR1cmUuamFyIikpIHsKLQkJCQlyZW1vdGVGZWF0dXJlID0gZmVhdHVyZXNbaV0uZ2V0RmVhdHVyZShudWxsKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCWFzc2VydE5vdE51bGwoIkNhbm5vdCBmaW5kIGhlbHAuamFyIG9uIHNpdGUiLCByZW1vdGVGZWF0dXJlKTsKLQkJSUxvY2FsU2l0ZSBsb2NhbFNpdGUgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKTsKLQkJSUNvbmZpZ3VyZWRTaXRlIHNpdGUgPQotCQkJbG9jYWxTaXRlLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkuZ2V0Q29uZmlndXJlZFNpdGVzKClbMF07Ci0JCUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExpc3RlbmVyKCk7Ci0JCXNpdGUuYWRkQ29uZmlndXJlZFNpdGVDaGFuZ2VkTGlzdGVuZXIobGlzdGVuZXIpOwotCi0JCSgoQ29uZmlndXJlZFNpdGUpc2l0ZSkuc2V0VXBkYXRhYmxlKHRydWUpOwotCQkKLQkJLy8gbGlzdCBvZiBmaWxlcyB0byBiZSBjbGVhbmVkIGF0IHRoZSBlbmQKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoIHNpdGUuZ2V0U2l0ZSgpLmdldFVSTCgpLmdldEZpbGUoKSArCi0JCQkJCQkJICBGaWxlLnNlcGFyYXRvciArIAotCQkJCQkJCSAgU2l0ZS5ERUZBVUxUX0lOU1RBTExFRF9GRUFUVVJFX1BBVEggKyAKLQkJCQkJCQkgIHJlbW90ZUZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpKTsKLQkJZmlsZXNUb0RlbGV0ZS5hZGQoZmlsZSk7Ci0JCWZpbGVzVG9EZWxldGUuYWRkKGxvY2FsRmlsZSk7Ci0JCWZpbGVzVG9EZWxldGUuYWRkKCBuZXcgRmlsZSgoKEluc3RhbGxDb25maWd1cmF0aW9uKSBsb2NhbFNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKSkuZ2V0VVJMKCkuZ2V0RmlsZSgpKSk7Ci0JCQotCQlzaXRlLmluc3RhbGwocmVtb3RlRmVhdHVyZSwgbnVsbCwgbnVsbCk7Ci0KLQkJSVBsdWdpbkVudHJ5W10gZW50cmllcyA9IHJlbW90ZUZlYXR1cmUuZ2V0UmF3UGx1Z2luRW50cmllcygpOwotCQlhc3NlcnRUcnVlKCJubyBwbHVnaW5zIGVudHJ5IiwgKGVudHJpZXMgIT0gbnVsbCAmJiBlbnRyaWVzLmxlbmd0aCAhPSAwKSk7Ci0KLQkJU3RyaW5nIHNpdGVQYXRoID0gc2l0ZS5nZXRTaXRlKCkuZ2V0VVJMKCkuZ2V0RmlsZSgpOwotCQlTdHJpbmcgcGx1Z2luTmFtZSA9IGVudHJpZXNbMF0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCk7Ci0JCUZpbGUgcGx1Z2luRmlsZSA9IG5ldyBGaWxlKHNpdGVQYXRoLCBTaXRlLkRFRkFVTFRfUExVR0lOX1BBVEggKyBwbHVnaW5OYW1lKTsKLQkJZmlsZXNUb0RlbGV0ZS5hZGQocGx1Z2luRmlsZSk7Ci0JCWlmIChMb2NhbGUuZ2V0RGVmYXVsdCgpLnRvU3RyaW5nKCkuaW5kZXhPZigiZnIiKSAhPSAtMSkgewotCQkJYXNzZXJ0VHJ1ZSgicGx1Z2luIGluZm8gbm90IGluc3RhbGxlZCBsb2NhbGx5IiwgcGx1Z2luRmlsZS5leGlzdHMoKSk7CQkJCi0JCX0KLQotCQlGaWxlIGZlYXR1cmVGaWxlID0KLQkJCW5ldyBGaWxlKAotCQkJCXNpdGVQYXRoLAotCQkJCVNpdGUuREVGQVVMVF9JTlNUQUxMRURfRkVBVFVSRV9QQVRICi0JCQkJCSsgcmVtb3RlRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSk7Ci0JCWFzc2VydFRydWUoImZlYXR1cmUgaW5mbyBub3QgaW5zdGFsbGVkIGxvY2FsbHkiLCBmZWF0dXJlRmlsZS5leGlzdHMoKSk7Ci0JCQotCi0JCQotCi0JCXNpdGUucmVtb3ZlQ29uZmlndXJlZFNpdGVDaGFuZ2VkTGlzdGVuZXIobGlzdGVuZXIpOwotCQkKLQkJYXNzZXJ0VHJ1ZSgiTGlzdGVuZXIgaGFzbid0IHJlY2VpdmVkIG5vdGlmaWNhdGlvbiIsIGxpc3RlbmVyLmlzTm90aWZpZWQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpbGVTaXRlV2l0aG91dFNpdGVYTUwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlJU2l0ZSByZW1vdGVTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShTT1VSQ0VfRklMRV9TSVRFLG51bGwpOwotCQlJRmVhdHVyZSByZW1vdGVGZWF0dXJlID0gZ2V0RmVhdHVyZTEocmVtb3RlU2l0ZSk7Ci0JCQotCQlJU2l0ZSBsb2NhbFNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKFRBUkdFVF9GSUxFX1NJVEUsbnVsbCk7Ci0JCWxvY2FsU2l0ZS5pbnN0YWxsKHJlbW90ZUZlYXR1cmUsIG51bGwsIG51bGwpOwotCQkKLQkJSUZlYXR1cmVSZWZlcmVuY2VbXSBmZWF0dXJlcyA9IGxvY2FsU2l0ZS5nZXRSYXdGZWF0dXJlUmVmZXJlbmNlcygpOwotCQlpbnQgbnVtYmVyT2ZJbnN0YWxsZWRGZWF0dXJlcyA9IGZlYXR1cmVzLmxlbmd0aDsKLQotCQlGaWxlIGZpbGUgPQotCQkJbmV3IEZpbGUoCi0JCQkJbG9jYWxTaXRlLmdldFVSTCgpLmdldEZpbGUoKQotCQkJCQkrIEZpbGUuc2VwYXJhdG9yCi0JCQkJCSsgU2l0ZS5ERUZBVUxUX0lOU1RBTExFRF9GRUFUVVJFX1BBVEgKLQkJCQkJKyByZW1vdGVGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSk7Ci0JCWZpbGVzVG9EZWxldGUuYWRkKGZpbGUpOwotCQlmaWxlID0KLQkJCW5ldyBGaWxlKAotCQkJCWxvY2FsU2l0ZS5nZXRVUkwoKS5nZXRGaWxlKCkKLQkJCQkJKyBGaWxlLnNlcGFyYXRvcgotCQkJCQkrIFNpdGUuREVGQVVMVF9QTFVHSU5fUEFUSAotCQkJCQkrICJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4xXzMuNS42Iik7Ci0JCWZpbGVzVG9EZWxldGUuYWRkKGZpbGUpOwotCQlmaWxlID0KLQkJCW5ldyBGaWxlKAotCQkJCWxvY2FsU2l0ZS5nZXRVUkwoKS5nZXRGaWxlKCkKLQkJCQkJKyBGaWxlLnNlcGFyYXRvcgotCQkJCQkrIFNpdGUuREVGQVVMVF9QTFVHSU5fUEFUSAotCQkJCQkrICJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4yXzUuMC4wIik7Ci0JCWZpbGVzVG9EZWxldGUuYWRkKGZpbGUpOwotCQlmaWxlID0gbmV3IEZpbGUoKChMb2NhbFNpdGUpU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkpLmdldExvY2F0aW9uVVJMKCkuZ2V0RmlsZSgpKTsKLQkJZmlsZXNUb0RlbGV0ZS5hZGQoZmlsZSk7Ci0KLQkJCi0JCWlmIChudW1iZXJPZkluc3RhbGxlZEZlYXR1cmVzID09IDApCi0JCQlmYWlsKCJUaGUgbG9jYWwgc2l0ZSBkb2VzIG5vdCBjb250YWluIGZlYXR1cmUsIHNob3VsZCBub3QgY29udGFpbiBhbiBYTUwgZmlsZSBidXQgZmVhdHVyZXMgc2hvdWxkIGJlIGZvdW5kIGFueXdheSBieSBwYXJzaW5nIik7Ci0JCWlmIChsb2NhbFNpdGUvKi5nZXRTaXRlKCkqLy5nZXRBcmNoaXZlcygpLmxlbmd0aCA9PSAwKQotCQkJZmFpbCgiVGhlIGxvY2FsIHNpdGUgZG9lcyBub3QgY29udGFpbiBhcmNoaXZlcywgc2hvdWxkIG5vdCBjb250YWluIGFuIFhNTCBmaWxlIGJ1dCBhcmNoaXZlcyBzaG91bGQgYmUgZm91bmQgYW55d2F5IGJ5IHBhcnNpbmciKTsKLQkJCi0JCXRyeSB7Ci0JCQlTaXRlTWFuYWdlci5nZXRTaXRlKG5ldyBVUkwoImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIiksbnVsbCk7Ci0JCQlmYWlsKCJUaGUgc2l0ZSBjb250YWlucyBzaXRlLnhtbC4uLiBpdCBzaG91bGQgYmUgYW4gSFRUUCBzaXRlIHdpdGhvdXQgYW4gWE1MIGZpbGUiKTsJCQkKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBleHBlY3RlZAotCQl9Ci0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVNpdGUjZ2V0RGVmYXVsdEluc3RhbGxhYmxlRmVhdHVyZVR5cGUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdEluc3RhbGxhYmxlRmVhdHVyZVR5cGUoKSB7Ci0JCVN0cmluZyBwbHVnaW5JRCA9Ci0JCQlVcGRhdGVDb3JlLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpICsgIi4iOwotCQlyZXR1cm4gcGx1Z2luSUQgKyBQQUNLQUdFRF9GRUFUVVJFX1RZUEU7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVtVGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSXRlcmF0b3IgZmlsZXMgPSBmaWxlc1RvRGVsZXRlLml0ZXJhdG9yKCk7CQkKLQkJd2hpbGUoZmlsZXMuaGFzTmV4dCgpKSB7Ci0JCQlGaWxlIGZpbGUgPSAoRmlsZSlmaWxlcy5uZXh0KCk7Ci0JCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0oZmlsZSk7CQkJCi0JCX0KLQkJZmlsZXNUb0RlbGV0ZS5jbGVhcigpOwotCQkKLQkJSW5zdGFsbFJlZ2lzdHJ5LmNsZWFudXAoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3JlZ3VsYXJJbnN0YWxsL1Rlc3RJbnN0YWxsVVJMU0l0ZVhNTC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcmVndWxhckluc3RhbGwvVGVzdEluc3RhbGxVUkxTSXRlWE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhYTVmN2MuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcmVndWxhckluc3RhbGwvVGVzdEluc3RhbGxVUkxTSXRlWE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5yZWd1bGFySW5zdGFsbDsKLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuKjsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLio7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0SW5zdGFsbFVSTFNJdGVYTUwgZXh0ZW5kcyBVcGRhdGVNYW5hZ2VyVGVzdENhc2UgewotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFDS0FHRURfRkVBVFVSRV9UWVBFID0gInBhY2thZ2VkIjsgLy8kTk9OLU5MUy0xJAkKLQotCXB1YmxpYyBjbGFzcyBMaXN0ZW5lciBpbXBsZW1lbnRzIElDb25maWd1cmVkU2l0ZUNoYW5nZWRMaXN0ZW5lciB7Ci0KLQkJcHVibGljIGJvb2xlYW4gbm90aWZpZWQgPSBmYWxzZTsKLQotCQlwdWJsaWMgdm9pZCBmZWF0dXJlSW5zdGFsbGVkKElGZWF0dXJlIGZlYXR1cmUpIHsKLQkJCW5vdGlmaWVkID0gdHJ1ZTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTm90aWZpZWQgRGVmYXVsdEZlYXR1cmUgSW5zdGFsbGVkIik7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBmZWF0dXJlUmVtb3ZlZChJRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBmZWF0dXJlQ29uZmlndXJlZChJRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCX0KLQkJcHVibGljIHZvaWQgZmVhdHVyZVVuY29uZmlndXJlZChJRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc05vdGlmaWVkKCkgewotCQkJcmV0dXJuIG5vdGlmaWVkOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIFRlc3QxCi0JICovCi0JcHVibGljIFRlc3RJbnN0YWxsVVJMU0l0ZVhNTChTdHJpbmcgYXJnMCkgewotCQlzdXBlcihhcmcwKTsKLQl9Ci0KLQlwcml2YXRlIElGZWF0dXJlIGdldEZlYXR1cmUxKElTaXRlIHNpdGUpCi0JCXRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlTaXRlRmVhdHVyZVJlZmVyZW5jZSByZWYgPSBuZXcgU2l0ZUZlYXR1cmVSZWZlcmVuY2UoKTsKLQkJcmVmLnNldFNpdGUoc2l0ZSk7Ci0JCXJlZi5zZXRVUkxTdHJpbmcoImZlYXR1cmVzL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxXzEuMC40LmphciIpOwotCQlyZWYuc2V0VHlwZShJU2l0ZS5ERUZBVUxUX1BBQ0tBR0VEX0ZFQVRVUkVfVFlQRSk7Ci0JCXJlZi5yZXNvbHZlKHNpdGUuZ2V0VVJMKCksIG51bGwpOwotCQlyZXR1cm4gcmVmLmdldEZlYXR1cmUobnVsbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpbGVTaXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJSVNpdGUgcmVtb3RlU2l0ZSA9Ci0JCQlTaXRlTWFuYWdlci5nZXRTaXRlKG5ldyBVUkwoU09VUkNFX0ZJTEVfU0lURSwgU2l0ZS5TSVRFX1hNTCksdHJ1ZSxudWxsKTsKLQkJSUZlYXR1cmUgcmVtb3RlRmVhdHVyZSA9IGdldEZlYXR1cmUxKHJlbW90ZVNpdGUpOwotCQlVUkwgdXJsID0gVEFSR0VUX0ZJTEVfU0lURTsKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoVEFSR0VUX0ZJTEVfU0lURS5nZXRGaWxlKCkpOwotCQlpZiAoIWZpbGUuZXhpc3RzKCkpIGZpbGUubWtkaXJzKCk7Ci0JCUlTaXRlIGxvY2FsU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUodXJsLHRydWUsbnVsbCk7Ci0JCXJlbW92ZShyZW1vdGVGZWF0dXJlLGxvY2FsU2l0ZSk7Ci0JCWxvY2FsU2l0ZS5pbnN0YWxsKHJlbW90ZUZlYXR1cmUsIG51bGwsIG51bGwpOwotCi0JCS8vIHZlcmlmeQotCQlTdHJpbmcgc2l0ZSA9IFRBUkdFVF9GSUxFX1NJVEUuZ2V0RmlsZSgpOwotCQlJUGx1Z2luRW50cnlbXSBlbnRyaWVzID0gcmVtb3RlRmVhdHVyZS5nZXRQbHVnaW5FbnRyaWVzKCk7Ci0JCWFzc2VydFRydWUoIm5vIHBsdWdpbnMgZW50cnkiLCAoZW50cmllcyAhPSBudWxsICYmIGVudHJpZXMubGVuZ3RoICE9IDApKTsKLQkJU3RyaW5nIHBsdWdpbk5hbWUgPSBlbnRyaWVzWzBdLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpOwotCQlGaWxlIHBsdWdpbkZpbGUgPSBuZXcgRmlsZShzaXRlLCBTaXRlLkRFRkFVTFRfUExVR0lOX1BBVEggKyBwbHVnaW5OYW1lKTsKLQkJYXNzZXJ0VHJ1ZSgicGx1Z2luIGZpbGVzIG5vdCBpbnN0YWxsZWQgbG9jYWxseSIsIHBsdWdpbkZpbGUuZXhpc3RzKCkpOwotCQlGaWxlIHBsdWdpblhNTEZpbGUgPQotCQkJbmV3IEZpbGUoCi0JCQkJc2l0ZSwKLQkJCQlTaXRlLkRFRkFVTFRfUExVR0lOX1BBVEggKyBwbHVnaW5OYW1lICsgRmlsZS5zZXBhcmF0b3IgKyAicGx1Z2luLnhtbCIpOwotCQlhc3NlcnRUcnVlKCJwbHVnaW4ueG1sIGZpbGUgbm90IGluc3RhbGxlZCBsb2NhbGx5IiwgcGx1Z2luWE1MRmlsZS5leGlzdHMoKSk7Ci0KLQkJRmlsZSBmZWF0dXJlRmlsZSA9Ci0JCQluZXcgRmlsZSgKLQkJCQlzaXRlLAotCQkJCVNpdGUuREVGQVVMVF9JTlNUQUxMRURfRkVBVFVSRV9QQVRICi0JCQkJCSsgcmVtb3RlRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSk7Ci0JCWFzc2VydFRydWUoCi0JCQkiZmVhdHVyZSBpbmZvIG5vdCBpbnN0YWxsZWQgbG9jYWxseToiICsgZmVhdHVyZUZpbGUsCi0JCQlmZWF0dXJlRmlsZS5leGlzdHMoKSk7Ci0JCS8vY2xlYW51cAotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0ocGx1Z2luRmlsZSk7Ci0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShuZXcgRmlsZShsb2NhbFNpdGUuZ2V0VVJMKCkuZ2V0RmlsZSgpKSk7Ci0JCUluc3RhbGxSZWdpc3RyeS5jbGVhbnVwKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEhUVFBTaXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJLy8gY2xlYW4KLQkJRmlsZSB0YXJnZXRGaWxlICA9IG5ldyBGaWxlKFRBUkdFVF9GSUxFX1NJVEUuZ2V0RmlsZSgpKTsKLQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKHRhcmdldEZpbGUpOwotCQlJbnN0YWxsUmVnaXN0cnkuY2xlYW51cCgpOwotCi0JCUlTaXRlIHJlbW90ZVNpdGUgPQotCQkJU2l0ZU1hbmFnZXIuZ2V0U2l0ZShuZXcgVVJMKFNPVVJDRV9IVFRQX1NJVEUsIFNpdGUuU0lURV9YTUwpLHRydWUsbnVsbCk7Ci0JCUlGZWF0dXJlUmVmZXJlbmNlW10gZmVhdHVyZXMgPSByZW1vdGVTaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKCk7Ci0JCUlGZWF0dXJlIHJlbW90ZUZlYXR1cmUgPSBudWxsOwotCi0JCWlmIChmZWF0dXJlcyA9PSBudWxsIHx8IGZlYXR1cmVzLmxlbmd0aCA9PSAwKQotCQkJZmFpbCgiTm8gZmVhdHVyZXMgb24gdGhlIHNpdGUiKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoZmVhdHVyZXNbaV0uZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKS5lbmRzV2l0aCgiZmVhdHVyZXMyLmphciIpKSB7Ci0JCQkJcmVtb3RlRmVhdHVyZSA9IGZlYXR1cmVzW2ldLmdldEZlYXR1cmUobnVsbCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlhc3NlcnROb3ROdWxsKCJDYW5ub3QgZmluZCBmZWF0dXJlMi5qYXIgb24gc2l0ZSIsIHJlbW90ZUZlYXR1cmUpOwotCQlVUkwgdXJsID0gVEFSR0VUX0ZJTEVfU0lURTsKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoVEFSR0VUX0ZJTEVfU0lURS5nZXRGaWxlKCkpOwotCQlpZiAoIWZpbGUuZXhpc3RzKCkpIGZpbGUubWtkaXJzKCk7Ci0JCUlTaXRlIGxvY2FsU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUodXJsLHRydWUsbnVsbCk7Ci0JCWxvY2FsU2l0ZS5pbnN0YWxsKHJlbW90ZUZlYXR1cmUsIG51bGwsIG51bGwpOwotCi0JCS8vIGZlYXR1cmUyLmphciBzaG91bGQgbm90IGJlIGluIHRoZSBsb2NhbCBzaXRlCi0JCUlGZWF0dXJlUmVmZXJlbmNlW10gbG9jYWxGZWF0dXJlcyA9IGxvY2FsU2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlcygpOwotCQlpZiAobG9jYWxGZWF0dXJlcyA9PSBudWxsIHx8IGxvY2FsRmVhdHVyZXMubGVuZ3RoID09IDApCi0JCQlmYWlsKCJObyBmZWF0dXJlcyBvbiB0aGUgdGFyZ2V0IHNpdGUiKTsKLQotCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbG9jYWxGZWF0dXJlcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGxvY2FsRmVhdHVyZXNbaV0uZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKS5lbmRzV2l0aCgiZmVhdHVyZXMyLmphciIpKSB7Ci0JCQkJZm91bmQgPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJYXNzZXJ0VHJ1ZSgKLQkJCSJGb3VuZCBmZWF0dXJlMi5qYXIgb24gdGFyZ2V0IHNpdGUuIFRhcmdldCBzaXRlIGZlYXR1cmUgcmVmIHNob3VsZG5vdCBjb250YWluIEpBUiBmaWxlIiwKLQkJCSFmb3VuZCk7Ci0KLQkJLy8gY2hlY2sKLQkJU3RyaW5nIHNpdGUgPSBUQVJHRVRfRklMRV9TSVRFLmdldEZpbGUoKTsKLQkJSVBsdWdpbkVudHJ5W10gZW50cmllcyA9IHJlbW90ZUZlYXR1cmUuZ2V0UGx1Z2luRW50cmllcygpOwotCQlhc3NlcnRUcnVlKCJubyBwbHVnaW5zIGVudHJ5IiwgKGVudHJpZXMgIT0gbnVsbCAmJiBlbnRyaWVzLmxlbmd0aCAhPSAwKSk7Ci0KLQkJU3RyaW5nIHBsdWdpbk5hbWUgPSBlbnRyaWVzWzBdLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpOwotCQlGaWxlIHBsdWdpbkZpbGUgPSBuZXcgRmlsZShzaXRlLCBTaXRlLkRFRkFVTFRfUExVR0lOX1BBVEggKyBwbHVnaW5OYW1lKTsKLQkJYXNzZXJ0VHJ1ZSgicGx1Z2luIGluZm8gbm90IGluc3RhbGxlZCBsb2NhbGx5IiwgcGx1Z2luRmlsZS5leGlzdHMoKSk7Ci0KLQkJRmlsZSBmZWF0dXJlRmlsZSA9Ci0JCQluZXcgRmlsZSgKLQkJCQlzaXRlLAotCQkJCVNpdGUuREVGQVVMVF9JTlNUQUxMRURfRkVBVFVSRV9QQVRICi0JCQkJCSsgcmVtb3RlRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSk7Ci0JCWFzc2VydFRydWUoImZlYXR1cmUgaW5mbyBub3QgaW5zdGFsbGVkIGxvY2FsbHkiLCBmZWF0dXJlRmlsZS5leGlzdHMoKSk7Ci0KLQkJLy9sb2NhbFNpdGUuc2F2ZSgpOwotCi0JCS8vY2xlYW51cAotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0ocGx1Z2luRmlsZSk7Ci0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShuZXcgRmlsZShsb2NhbFNpdGUuZ2V0VVJMKCkuZ2V0RmlsZSgpKSk7Ci0JCUluc3RhbGxSZWdpc3RyeS5jbGVhbnVwKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEluc3RhbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQkvLyBjbGVhbnVwIGxvY2FsIGZpbGVzLi4uCi0JCUxvY2FsU2l0ZSBzaXRlTG9jYWwgPSAoKExvY2FsU2l0ZSkgU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkpOwotCQlGaWxlIGxvY2FsRmlsZSA9IG5ldyBGaWxlKHNpdGVMb2NhbC5nZXRMb2NhdGlvblVSTCgpLmdldEZpbGUoKSk7Ci0JCS8vaWYgKCFsb2NhbEZpbGUuZXhpc3RzKCkpIGZhaWwoIkxvY2FsU2l0ZSBmaWxlIGRvZXNuJ3QgZXhpc3QgLT4iK2xvY2FsRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSsiPC0iKTsKLQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGxvY2FsRmlsZSk7CQkKLQkJLyoKLQkJbG9jYWxGaWxlID0gbmV3IEZpbGUobG9jYWxGaWxlLExvY2FsU2l0ZS5TSVRFX0xPQ0FMX0ZJTEUpOwotCQlpZiAoIWxvY2FsRmlsZS5leGlzdHMoKSkgZmFpbCgiTG9jYWxTaXRlLnhtbCBkb2Vzbid0IGV4aXN0OiIrbG9jYWxGaWxlKTsKLQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGxvY2FsRmlsZSk7Ci0JCSovCi0JCQotCQlJbnRlcm5hbFNpdGVNYW5hZ2VyLmxvY2FsU2l0ZSA9IG51bGw7Ci0KLQkJVVJMIElOU1RBTExfU0lURSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlJTlNUQUxMX1NJVEUgPQotCQkJCW5ldyBVUkwoImh0dHAiLCBnZXRIdHRwSG9zdCgpLCBnZXRIdHRwUG9ydCgpLCBidW5kbGUuZ2V0U3RyaW5nKCJIVFRQX1BBVEhfMiIpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoZS50b1N0cmluZygpKTsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQotCQlJU2l0ZSByZW1vdGVTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShJTlNUQUxMX1NJVEUsdHJ1ZSxudWxsKTsKLQkJSUZlYXR1cmVSZWZlcmVuY2VbXSBmZWF0dXJlcyA9IHJlbW90ZVNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKTsKLQkJSUZlYXR1cmUgcmVtb3RlRmVhdHVyZSA9IG51bGw7Ci0KLQkJaWYgKGZlYXR1cmVzID09IG51bGwgfHwgZmVhdHVyZXMubGVuZ3RoID09IDApCi0JCQlmYWlsKCJObyBmZWF0dXJlcyBvbiB0aGUgc2l0ZSIpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChmZWF0dXJlc1tpXS5nZXRVUkwoKS50b0V4dGVybmFsRm9ybSgpLmVuZHNXaXRoKCJoZWxwRmVhdHVyZS5qYXIiKSkgewotCQkJCXJlbW90ZUZlYXR1cmUgPSBmZWF0dXJlc1tpXS5nZXRGZWF0dXJlKG51bGwpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJYXNzZXJ0Tm90TnVsbCgiQ2Fubm90IGZpbmQgaGVscC5qYXIgb24gc2l0ZSIsIHJlbW90ZUZlYXR1cmUpOwotCQlJTG9jYWxTaXRlIGxvY2FsU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpOwotCQlJQ29uZmlndXJlZFNpdGUgc2l0ZSA9IGxvY2FsU2l0ZS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpLmdldENvbmZpZ3VyZWRTaXRlcygpWzBdOwotCQlMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpOwotCQlzaXRlLmFkZENvbmZpZ3VyZWRTaXRlQ2hhbmdlZExpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQkoKENvbmZpZ3VyZWRTaXRlKXNpdGUpLnNldFVwZGF0YWJsZSh0cnVlKTsKLQkJc2l0ZS5pbnN0YWxsKHJlbW90ZUZlYXR1cmUsIG51bGwsIG51bGwpOwotCi0JCUlQbHVnaW5FbnRyeVtdIGVudHJpZXMgPSByZW1vdGVGZWF0dXJlLmdldFJhd1BsdWdpbkVudHJpZXMoKTsKLQkJYXNzZXJ0VHJ1ZSgibm8gcGx1Z2lucyBlbnRyeSIsIChlbnRyaWVzICE9IG51bGwgJiYgZW50cmllcy5sZW5ndGggIT0gMCkpOwotCi0JCVN0cmluZyBzaXRlUGF0aCA9IHNpdGUuZ2V0U2l0ZSgpLmdldFVSTCgpLmdldEZpbGUoKTsKLQkJU3RyaW5nIHBsdWdpbk5hbWUgPSBlbnRyaWVzWzBdLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpOwotCQlGaWxlIHBsdWdpbkZpbGUgPSBuZXcgRmlsZShzaXRlUGF0aCwgU2l0ZS5ERUZBVUxUX1BMVUdJTl9QQVRIICsgcGx1Z2luTmFtZSk7Ci0JCWlmIChMb2NhbGUuZ2V0RGVmYXVsdCgpLnRvU3RyaW5nKCkuaW5kZXhPZigiZnIiKSAhPSAtMSkKLQkJCWFzc2VydFRydWUoInBsdWdpbiBpbmZvIG5vdCBpbnN0YWxsZWQgbG9jYWxseToiK3BsdWdpbkZpbGUsIHBsdWdpbkZpbGUuZXhpc3RzKCkpOwotCi0JCUZpbGUgZmVhdHVyZUZpbGUgPQotCQkJbmV3IEZpbGUoCi0JCQkJc2l0ZVBhdGgsCi0JCQkJU2l0ZS5ERUZBVUxUX0lOU1RBTExFRF9GRUFUVVJFX1BBVEgKLQkJCQkJKyByZW1vdGVGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpKTsKLQkJaWYgKExvY2FsZS5nZXREZWZhdWx0KCkudG9TdHJpbmcoKS5pbmRleE9mKCJmciIpICE9IC0xIHx8Ci0JCQkJTG9jYWxlLmdldERlZmF1bHQoKS50b1N0cmluZygpLmluZGV4T2YoInVzIikgIT0gLTEgfHwKLQkJCQlMb2NhbGUuZ2V0RGVmYXVsdCgpLnRvU3RyaW5nKCkuaW5kZXhPZigiZGUiKSAhPSAtMSkKLQkJYXNzZXJ0VHJ1ZSgiZmVhdHVyZSBpbmZvIG5vdCBpbnN0YWxsZWQgbG9jYWxseSIsIGZlYXR1cmVGaWxlLmV4aXN0cygpKTsKLQotCQkvL2NsZWFudXAKLQkJRmlsZSBmaWxlID0KLQkJCW5ldyBGaWxlKAotCQkJCXNpdGUuZ2V0U2l0ZSgpLmdldFVSTCgpLmdldEZpbGUoKQotCQkJCQkrIEZpbGUuc2VwYXJhdG9yCi0JCQkJCSsgU2l0ZS5ERUZBVUxUX0lOU1RBTExFRF9GRUFUVVJFX1BBVEgKLQkJCQkJKyByZW1vdGVGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSk7Ci0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShmaWxlKTsKLQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKHBsdWdpbkZpbGUpOwotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0obG9jYWxGaWxlKTsKLQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKAotCQkJbmV3IEZpbGUoCi0JCQkJKChJbnN0YWxsQ29uZmlndXJhdGlvbikgbG9jYWxTaXRlLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkpCi0JCQkJCS5nZXRVUkwoKQotCQkJCQkuZ2V0RmlsZSgpKSk7Ci0JCUluc3RhbGxSZWdpc3RyeS5jbGVhbnVwKCk7Ci0JCQotCQlzaXRlLnJlbW92ZUNvbmZpZ3VyZWRTaXRlQ2hhbmdlZExpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSgiTGlzdGVuZXIgaGFzbid0IHJlY2VpdmVkIG5vdGlmaWNhdGlvbiIsIGxpc3RlbmVyLmlzTm90aWZpZWQoKSk7Ci0JfQotCi0vLwlwdWJsaWMgdm9pZCB0ZXN0RmlsZVNpdGVXaXRob3V0U2l0ZVhNTCgpIHRocm93cyBFeGNlcHRpb24gewotLy8KLS8vCQlJU2l0ZSByZW1vdGVTaXRlID0KLS8vCQkJU2l0ZU1hbmFnZXIuZ2V0U2l0ZShuZXcgVVJMKFNPVVJDRV9GSUxFX1NJVEUsIFNpdGUuU0lURV9YTUwpLHRydWUsbnVsbCk7Ci0vLwkJSUZlYXR1cmUgcmVtb3RlRmVhdHVyZSA9IGdldEZlYXR1cmUxKHJlbW90ZVNpdGUpOwotLy8JCUlDb25maWd1cmVkU2l0ZSBsb2NhbFNpdGUgPQotLy8JCQlTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpLmdldENvbmZpZ3VyZWRTaXRlcygpWzBdOwotLy8JCWxvY2FsU2l0ZS5nZXRTaXRlKCkuaW5zdGFsbChyZW1vdGVGZWF0dXJlLCBudWxsLCBudWxsKTsKLS8vCi0vLwkJSUZlYXR1cmVSZWZlcmVuY2VbXSBmZWF0dXJlcyA9IGxvY2FsU2l0ZS5nZXRTaXRlKCkuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKTsKLS8vCQlpZiAoZmVhdHVyZXMubGVuZ3RoID09IDApCi0vLwkJCWZhaWwoIlRoZSBsb2NhbCBzaXRlIGRvZXMgbm90IGNvbnRhaW4gZmVhdHVyZSwgc2hvdWxkIG5vdCBjb250YWluIGFuIFhNTCBmaWxlIGJ1dCBmZWF0dXJlcyBzaG91bGQgYmUgZm91bmQgYW55d2F5IGJ5IHBhcnNpbmciKTsKLS8vCQlpZiAobG9jYWxTaXRlLmdldFNpdGUoKS5nZXRBcmNoaXZlcygpLmxlbmd0aCA9PSAwKQotLy8JCQlmYWlsKCJUaGUgbG9jYWwgc2l0ZSBkb2VzIG5vdCBjb250YWluIGFyY2hpdmVzLCBzaG91bGQgbm90IGNvbnRhaW4gYW4gWE1MIGZpbGUgYnV0IGFyY2hpdmVzIHNob3VsZCBiZSBmb3VuZCBhbnl3YXkgYnkgcGFyc2luZyIpOwotLy8KLS8vCQkvL2NsZWFudXAKLS8vCQlGaWxlIGZpbGUgPQotLy8JCQluZXcgRmlsZSgKLS8vCQkJCWxvY2FsU2l0ZS5nZXRTaXRlKCkuZ2V0VVJMKCkuZ2V0RmlsZSgpCi0vLwkJCQkJKyBGaWxlLnNlcGFyYXRvcgotLy8JCQkJCSsgU2l0ZS5ERUZBVUxUX0lOU1RBTExFRF9GRUFUVVJFX1BBVEgKLS8vCQkJCQkrIHJlbW90ZUZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpKTsKLS8vCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0oZmlsZSk7Ci0vLwkJZmlsZSA9Ci0vLwkJCW5ldyBGaWxlKAotLy8JCQkJbG9jYWxTaXRlLmdldFNpdGUoKS5nZXRVUkwoKS5nZXRGaWxlKCkKLS8vCQkJCQkrIEZpbGUuc2VwYXJhdG9yCi0vLwkJCQkJKyBTaXRlLkRFRkFVTFRfUExVR0lOX1BBVEgKLS8vCQkJCQkrICJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4xXzMuNS42Iik7Ci0vLwkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGZpbGUpOwotLy8JCWZpbGUgPQotLy8JCQluZXcgRmlsZSgKLS8vCQkJCWxvY2FsU2l0ZS5nZXRTaXRlKCkuZ2V0VVJMKCkuZ2V0RmlsZSgpCi0vLwkJCQkJKyBGaWxlLnNlcGFyYXRvcgotLy8JCQkJCSsgU2l0ZS5ERUZBVUxUX1BMVUdJTl9QQVRICi0vLwkJCQkJKyAib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMl81LjAuMCIpOwotLy8JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShmaWxlKTsKLS8vCQlGaWxlIGxvY2FsRmlsZSA9IG5ldyBGaWxlKCgoTG9jYWxTaXRlKVNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpKS5nZXRMb2NhdGlvblVSTCgpLmdldEZpbGUoKSk7Ci0vLwkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGxvY2FsRmlsZSk7Ci0vLwotLy8JfQotCi0JLyoqCi0JKiAKLQkqLwotLy8JcHJpdmF0ZSBGZWF0dXJlIGNyZWF0ZVBhY2thZ2VkRmVhdHVyZShVUkwgdXJsLCBJU2l0ZSBzaXRlKQotLy8JCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLS8vCQlTdHJpbmcgcGFja2FnZWRGZWF0dXJlVHlwZSA9IElTaXRlLkRFRkFVTFRfUEFDS0FHRURfRkVBVFVSRV9UWVBFOwotLy8JCUZlYXR1cmUgcmVzdWx0ID0gbnVsbDsKLS8vCQlpZiAocGFja2FnZWRGZWF0dXJlVHlwZSAhPSBudWxsKSB7Ci0vLwkJCUlGZWF0dXJlRmFjdG9yeSBmYWN0b3J5ID0KLS8vCQkJCUZlYXR1cmVUeXBlRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmdldEZhY3RvcnkocGFja2FnZWRGZWF0dXJlVHlwZSk7Ci0vLwkJCXJlc3VsdCA9IChGZWF0dXJlKSBmYWN0b3J5LmNyZWF0ZUZlYXR1cmUodXJsLCBzaXRlKTsKLS8vCQl9Ci0vLwkJcmV0dXJuIHJlc3VsdDsKLS8vCX0KLQkvKgotCSAqIEBzZWUgSVNpdGUjZ2V0RGVmYXVsdEluc3RhbGxhYmxlRmVhdHVyZVR5cGUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdEluc3RhbGxhYmxlRmVhdHVyZVR5cGUoKSB7Ci0JCVN0cmluZyBwbHVnaW5JRCA9Ci0JCQlVcGRhdGVDb3JlLmdldFBsdWdpbigpLmdldERlc2NyaXB0b3IoKS5nZXRVbmlxdWVJZGVudGlmaWVyKCkgKyAiLiI7Ci0JCXJldHVybiBwbHVnaW5JRCArIFBBQ0tBR0VEX0ZFQVRVUkVfVFlQRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3JlZ3VsYXJJbnN0YWxsL1Rlc3RMb2NhbFNpdGUuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3JlZ3VsYXJJbnN0YWxsL1Rlc3RMb2NhbFNpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA3MjE2My4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9yZWd1bGFySW5zdGFsbC9UZXN0TG9jYWxTaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5yZWd1bGFySW5zdGFsbDsKLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLio7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0TG9jYWxTaXRlIGV4dGVuZHMgVXBkYXRlTWFuYWdlclRlc3RDYXNlIHsKLQkKLQkvKioKLQkgKiBUZXN0IHRoZSBnZXRGZWF0dXJlcygpCi0JICovCi0JcHVibGljIFRlc3RMb2NhbFNpdGUoU3RyaW5nIGFyZzApIHsKLQkJc3VwZXIoYXJnMCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGlvbkNvbmZpZ0ZpbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQkvL2NsZWFuIHVwCi0JCUZpbGUgbG9jYWxGaWxlID0gbmV3IEZpbGUoKChMb2NhbFNpdGUpU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkpLmdldExvY2F0aW9uVVJMKCkuZ2V0RmlsZSgpKTsKLQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGxvY2FsRmlsZSk7CQotCQlJbnRlcm5hbFNpdGVNYW5hZ2VyLmxvY2FsU2l0ZT1udWxsOwkKLQotCi0JCUlMb2NhbFNpdGUgc2l0ZSA9IFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpOwotCQlzaXRlLnNhdmUoKTsKLQkJYXNzZXJ0VHJ1ZSgiY29uZmlnIGZpbGUgaGFzbid0IGJlZW4gc2F2ZWQgaW4gOiIrbG9jYWxGaWxlLmdldEFic29sdXRlUGF0aCgpLCBsb2NhbEZpbGUuZXhpc3RzKCkpOwotCQkKLQkJLy8gY2xlYW51cAotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0obG9jYWxGaWxlKTsJCQotCQkKLQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdENvbmZpZ0ZpbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQkvL2NsZWFuIHVwCi0KLQkJRmlsZSBsb2NhbEZpbGUgPSBuZXcgRmlsZSgoKExvY2FsU2l0ZSlTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKSkuZ2V0TG9jYXRpb25VUkwoKS5nZXRGaWxlKCkpOwotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0obG9jYWxGaWxlKTsJCi0JCUludGVybmFsU2l0ZU1hbmFnZXIubG9jYWxTaXRlPW51bGw7Ci0KLQkJSUxvY2FsU2l0ZSBzaXRlID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCk7Ci0JCWFzc2VydFRydWUoIlRoZSBsb2NhbCBzaXRlIGRvZXMgbm90IGNvbnRhaW4gYW4gaGlzdG9yeSBvZiBpbnN0YWxsIGNvbmZpZ3VyYXRpb24iLHNpdGUuZ2V0Q29uZmlndXJhdGlvbkhpc3RvcnkoKS5sZW5ndGghPTApOwotCQlhc3NlcnRUcnVlKCJUaGUgbG9jYWwgc2l0ZSBkb2VzIG5vdCBjb250YWluIGFuIGN1cnJlbnQgaW5zdGFsbCBjb25maWd1cmF0aW9uIixzaXRlLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkhPW51bGwpOwotCQlhc3NlcnRUcnVlKCJUaGUgbG9jYWwgc2l0ZSBkb2VzIG5vdCBjb250YWluIGEgZGVmYXVsdCBjb25maWd1cmF0aW9uIHNpdGUgZm9yIHRoZSBjdXJyZW50IGluc3RhbGwgY29uZmlnIixzaXRlLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkuZ2V0Q29uZmlndXJlZFNpdGVzKCkubGVuZ3RoIT0wKTsKLQkJCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiRGVmYXVsdCBDb25maWcgU2l0ZSBpcyA6IitzaXRlLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkuZ2V0Q29uZmlndXJlZFNpdGVzKClbMF0uZ2V0U2l0ZSgpLmdldFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCkpOwotCQkKLQkJLy8gY2xlYW51cAkKLQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGxvY2FsRmlsZSk7CQkKLQkJCi0KLQl9Ci0JCi0vKglwdWJsaWMgdm9pZCB0ZXN0SW5zdGFsbEZlYXR1cmVTYXZlQ29uZmlnKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJLy9jbGVhbiB1cAotCQlMb2NhbFNpdGUgc2l0ZUxvY2FsID0gKExvY2FsU2l0ZSlTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKTsKLQkJVVJMIG5ld1VSTCA9IG5ldyBVUkwoc2l0ZUxvY2FsLmdldExvY2F0aW9uVVJMKCksTG9jYWxTaXRlLlNJVEVfTE9DQUxfRklMRSk7Ci0JCUZpbGUgbG9jYWxGaWxlID0gbmV3IEZpbGUobmV3VVJMLmdldEZpbGUoKSk7Ci0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShsb2NhbEZpbGUpOwotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0obmV3IEZpbGUoKChJbnN0YWxsQ29uZmlndXJhdGlvbilzaXRlTG9jYWwuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKSkuZ2V0VVJMKCkuZ2V0RmlsZSgpKSk7CQotCQlJbnRlcm5hbFNpdGVNYW5hZ2VyLmxvY2FsU2l0ZT1udWxsOwkJCi0KLQkJSUxvY2FsU2l0ZSBzaXRlID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCk7Ci0JCUlTaXRlIHJlbW90ZVNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKFNPVVJDRV9GSUxFX1NJVEVfSU5TVEFMTEVEKTsKLQkJSUZlYXR1cmUgZmVhdHVyZSA9IHJlbW90ZVNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKVswXS5nZXRGZWF0dXJlKCk7Ci0JCWludCBvbGROdW1iZXIgPSBzaXRlLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkuZ2V0Q29uZmlndXJlZFNpdGVzKCkubGVuZ3RoOwotCQkKLQkJLy8gd2UgYXJlIG5vdCBjaGVja2luZyBpZiB0aGlzIGlzIHJlYWQgb25seQotCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gbmV3Q29uZmlnID0gc2l0ZS5jbG9uZUN1cnJlbnRDb25maWd1cmF0aW9uKCk7Ci0JCW5ld0NvbmZpZy5zZXRMYWJlbCgibmV3IExhYmVsIik7CQkKLQkJLy9JSW5zdGFsbENvbmZpZ3VyYXRpb24gbmV3Q29uZmlnID0gc2l0ZS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpOwotCQlJQ29uZmlndXJlZFNpdGUgY29uZmlnU2l0ZSA9IG5ld0NvbmZpZy5nZXRDb25maWd1cmVkU2l0ZXMoKVswXTsKLQkJQ29uZmlndXJhdGlvblBvbGljeU1vZGVsIGNvbmZpZ1BvbGljeSA9IG5ldyBCYXNlU2l0ZUxvY2FsRmFjdG9yeSgpLmNyZWF0ZUNvbmZpZ3VyYXRpb25Qb2xpY3lNb2RlbCgpOwotCQljb25maWdQb2xpY3kuc2V0UG9saWN5KElQbGF0Zm9ybUNvbmZpZ3VyYXRpb24uSVNpdGVQb2xpY3kuVVNFUl9JTkNMVURFKTsKLQkJKChDb25maWd1cmVkU2l0ZSljb25maWdTaXRlKS5zZXRDb25maWd1cmF0aW9uUG9saWN5KChDb25maWd1cmF0aW9uUG9saWN5KWNvbmZpZ1BvbGljeSk7Ci0JCWludCBvbGROdW1iZXJPZmhpc3RvcnkgPSBzaXRlLmdldENvbmZpZ3VyYXRpb25IaXN0b3J5KCkubGVuZ3RoOwkJCi0JCXNpdGUuYWRkQ29uZmlndXJhdGlvbihuZXdDb25maWcpOwkKLQkJYXNzZXJ0Tm90TnVsbChmZWF0dXJlKTsJCi0KLQkJKChDb25maWd1cmVkU2l0ZSljb25maWdTaXRlKS5pc1VwZGF0YWJsZSh0cnVlKTsKLQkJcmVtb3ZlKGZlYXR1cmUsY29uZmlnU2l0ZSk7CQkJCQotCQljb25maWdTaXRlLmluc3RhbGwoZmVhdHVyZSxudWxsLG51bGwpOwotCQkJCQotCQkvLyB0ZWggY3VycmVudCBvbmUgcG9pbnRzIHRvIGEgcmVhbCBmYXR1cmUKLQkJLy8gZG9lcyBub3QgdGhyb3cgZXJyb3IuCi0JCUlDb25maWd1cmVkU2l0ZSBjb25maWdTaXRlMiA9IHNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKS5nZXRDb25maWd1cmVkU2l0ZXMoKVswXTsKLQkJYXNzZXJ0VHJ1ZSgiTm8gQ29uZmlndXJlZCBmZWF0dXJlcyBmb3VuZCIsY29uZmlnU2l0ZS5nZXRDb25maWd1cmVkRmVhdHVyZXMoKS5sZW5ndGg+MCk7Ci0JCUlGZWF0dXJlUmVmZXJlbmNlIHJlZiA9IGNvbmZpZ1NpdGUyLmdldENvbmZpZ3VyZWRGZWF0dXJlcygpWzBdOwotCQlJRmVhdHVyZSBmZWF0dXJlMiA9IHJlZi5nZXRGZWF0dXJlKCk7Ci0JCS8vU3RyaW5nIGNvbmZpZ3VyZWRGZWF0dXJlID0gZmVhdHVyZTIuZ2V0TGFiZWwoKTsKLQotCQlhc3NlcnRFcXVhbHMoZmVhdHVyZTIuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCksIm9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUzXzEuMC4wIik7Ci0JCWFzc2VydFRydWUoIldyb25nIGlkICB2ZXJzaW9uIG9mIGZlYXR1cmUiLGZlYXR1cmUyLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpLmVxdWFsc0lnbm9yZUNhc2UoIm9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUzXzEuMC4wIikpOwotCQkKLQkJLy8gb25seSBvbmUgZmVhdHVyZSBjb25maWd1cmVkCi0JCWFzc2VydFRydWUoInRvbyBtYW55IGZlYXR1cmVzIGNvbmZpZ3VyZWQiLGNvbmZpZ1NpdGUyLmdldENvbmZpZ3VyZWRGZWF0dXJlcygpLmxlbmd0aD09MSk7Ci0JCQotCQkvLyBubyBmZWF0dXJlIHVuY29uZmlndXJlZAotCQlhc3NlcnRUcnVlKCJ0b28gbWFueSB1bmNvbmZpZ3VyZWQgZmVhdHVyZXMiLCgoQ29uZmlndXJlZFNpdGUpY29uZmlnU2l0ZTIpLmdldENvbmZpZ3VyYXRpb25Qb2xpY3koKS5nZXRVbmNvbmZpZ3VyZWRGZWF0dXJlcygpLmxlbmd0aD09MCk7Ci0JCQotCQkvLyB0ZXN0IG9ubHkgMiBpbnN0YWxsIGNvbmZpZyBpbiBsb2NhbCBzaXRlCi0JCS8vYXNzZXJ0RXF1YWxzKCJ3cm9uZyBudW1iZXIgb2YgaGlzdG9yeSBpbiBMb2NhbCBzaXRlOiIsb2xkTnVtYmVyT2ZoaXN0b3J5KzEsc2l0ZS5nZXRDb25maWd1cmF0aW9uSGlzdG9yeSgpLmxlbmd0aCk7Ci0JCQotCQkvLyB0ZXN0IHNhbWUgIyBvZiBzaXRlcyBpbiBjdXJyZW50IGNvbmZpZwotCQlhc3NlcnRUcnVlKCJXcm9uZyBudW1iZXIgb2YgY29uZmlnIHNpdGVzIGluIGN1cnJlbnQgY29uZmlnIixzaXRlLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkuZ2V0Q29uZmlndXJlZFNpdGVzKCkubGVuZ3RoPT1vbGROdW1iZXIpOwotCQkKLQkJLy90ZXN0IG9ubHkgb25lIGZlYXR1cmUgZm9yIHRoZSBzaXRlCi0JCWFzc2VydFRydWUoIndyb25nIG51bWJlciBvZiBjb25maWd1cmVkIGZlYXR1cmVzIGZvciBjb25maWcgc2l0ZSIsc2l0ZS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpLmdldENvbmZpZ3VyZWRTaXRlcygpWzBdLmdldENvbmZpZ3VyZWRGZWF0dXJlcygpLmxlbmd0aD09MSk7Ci0JCQotCQkvLyB0ZXN0IG9ubHkgMiBhY3Rpdml0aWVzCi0JCWFzc2VydFRydWUoIldyb25nIG51bWJlciBvZiBhY3Rpdml0aWVzIGZvciBpbnN0YWxsIGNvbmZpZyIsc2l0ZS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpLmdldEFjdGl2aXRpZXMoKS5sZW5ndGg9PTIpOwotCi0JCXNpdGUuc2F2ZSgpOwkJCi0KLQkJLy8gY2hlY2sKLQkJLy8gdGhlcmUgYXJlIDIgY29uZmlndXJhdGlvbgotCQlTdHJpbmcgdGltZSA9ICIiK3NpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKS5nZXRDcmVhdGlvbkRhdGUoKS5nZXRUaW1lKCk7Ci0JCVVSTCBsb2NhdGlvbiA9ICgoTG9jYWxTaXRlKXNpdGUpLmdldExvY2F0aW9uVVJMKCk7Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKG5ldyBVUkwobG9jYXRpb24sIkNvbmZpZyIrdGltZSsiLnhtbCIpLmdldEZpbGUoKSk7Ci0JCWFzc2VydFRydWUoIm5ldyBjb25maWd1cmF0aW9uIGRvZXMgbm90IGV4aXN0IiwgZmlsZS5leGlzdHMoKSk7Ci0JCQotCQkvLyBjbGVhbnVwCi0JCWxvY2FsRmlsZSA9IG5ldyBGaWxlKG5ldyBVUkwobG9jYXRpb24sTG9jYWxTaXRlLlNJVEVfTE9DQUxfRklMRSkuZ2V0RmlsZSgpKTsKLQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGxvY2FsRmlsZSk7CQkKLQkJbG9jYWxGaWxlID0gbmV3IEZpbGUobmV3IFVSTChsb2NhdGlvbixMb2NhbFNpdGUuREVGQVVMVF9DT05GSUdfRklMRSkuZ2V0RmlsZSgpKTsKLQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGxvY2FsRmlsZSk7CQotCQlsb2NhbEZpbGUgPSBuZXcgRmlsZShuZXcgVVJMKGxvY2F0aW9uLFNpdGUuREVGQVVMVF9GRUFUVVJFX1BBVEgrRmlsZS5zZXBhcmF0b3IrZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSkuZ2V0RmlsZSgpKTsJCQotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0obG9jYWxGaWxlKTsJCi0JCWxvY2FsRmlsZSA9IG5ldyBGaWxlKG5ldyBVUkwobG9jYXRpb24sU2l0ZS5ERUZBVUxUX0ZFQVRVUkVfUEFUSCtGaWxlLnNlcGFyYXRvcitmZWF0dXJlMi5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSkuZ2V0RmlsZSgpKTsJCQotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0obG9jYWxGaWxlKTsJCi0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShmaWxlKTsJCQotCQlsb2NhbEZpbGUgPSBuZXcgRmlsZShmZWF0dXJlMi5nZXRVUkwoKS5nZXRGaWxlKCkpOwotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0obG9jYWxGaWxlKTsKLQl9Ci0qLwotCQotCXB1YmxpYyB2b2lkIHRlc3RSZXRyaXZlQ29uZmlnKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJLy9jbGVhbiB1cAotCQlGaWxlIGxvY2FsRmlsZSA9IG5ldyBGaWxlKCgoTG9jYWxTaXRlKVNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpKS5nZXRMb2NhdGlvblVSTCgpLmdldEZpbGUoKSk7Ci0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShsb2NhbEZpbGUpOwkKLQkJSW50ZXJuYWxTaXRlTWFuYWdlci5sb2NhbFNpdGU9bnVsbDsJCQotCi0JCUlMb2NhbFNpdGUgc2l0ZSA9IFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpOwotCQlJU2l0ZSByZW1vdGVTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShTT1VSQ0VfRklMRV9TSVRFX0lOU1RBTExFRCxudWxsKTsKLQkJSUZlYXR1cmUgZmVhdHVyZSA9IHJlbW90ZVNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKVswXS5nZXRGZWF0dXJlKG51bGwpOwotCQlpbnQgb2xkTnVtYmVyID0gc2l0ZS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpLmdldENvbmZpZ3VyZWRTaXRlcygpLmxlbmd0aDsJCQotCQkKLQkJLy8gd2UgYXJlIG5vdCBjaGVja2luZyBpZiB0aGlzIGlzIHJlYWQgb25seQotCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gbmV3Q29uZmlnID0gc2l0ZS5jbG9uZUN1cnJlbnRDb25maWd1cmF0aW9uKCk7Ci0JCW5ld0NvbmZpZy5zZXRMYWJlbCgibmV3IExhYmVsIik7CQkKLQkJSUNvbmZpZ3VyZWRTaXRlIGNvbmZpZ1NpdGUgPSBuZXdDb25maWcuZ2V0Q29uZmlndXJlZFNpdGVzKClbMF07Ci0JCUNvbmZpZ3VyYXRpb25Qb2xpY3lNb2RlbCBjb25maWdQb2xpY3kgPSBuZXcgQmFzZVNpdGVMb2NhbEZhY3RvcnkoKS5jcmVhdGVDb25maWd1cmF0aW9uUG9saWN5TW9kZWwoKTsKLQkJY29uZmlnUG9saWN5LnNldFBvbGljeShJUGxhdGZvcm1Db25maWd1cmF0aW9uLklTaXRlUG9saWN5LlVTRVJfSU5DTFVERSk7Ci0JCSgoQ29uZmlndXJlZFNpdGUpY29uZmlnU2l0ZSkuc2V0Q29uZmlndXJhdGlvblBvbGljeU1vZGVsKGNvbmZpZ1BvbGljeSk7CQotCQlzaXRlLmFkZENvbmZpZ3VyYXRpb24obmV3Q29uZmlnKTsKLQkJYXNzZXJ0Tm90TnVsbChmZWF0dXJlKTsJCQkKLQkJCi0JCSgoQ29uZmlndXJlZFNpdGUpY29uZmlnU2l0ZSkuc2V0VXBkYXRhYmxlKHRydWUpOwotCQlyZW1vdmUoZmVhdHVyZSxjb25maWdTaXRlKTsJCQkKLQkJY29uZmlnU2l0ZS5pbnN0YWxsKGZlYXR1cmUsbnVsbCxudWxsKTsKLQkJc2l0ZS5zYXZlKCk7Ci0JCQotCQkvLyB3ZSBjcmVhdGVkIHRoZSBzZWNvbmQgeG1sIGZpbGUKLQotCQkvL2RvIG5vdCBjbGVhbnVwLCB3ZSB3YW50IHRvIHJldXNlIHByZXZpb3VzbHkgY3JlYXRlZCBsb2NhbCBzaXRlCi0JCS8vIGJ1dCBmb3JjZSByZS1yZWFkIG9mIHhtbCBGaWxlCi0JCUludGVybmFsU2l0ZU1hbmFnZXIubG9jYWxTaXRlPW51bGw7Ci0JCXNpdGUgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKTsKLQkJCi0JCS8vIGNoZWNrCi0JCS8vIHRoZXJlIGFyZSAyIGNvbmZpZ3VyYXRpb24KLQkJVVJMIGxvY2F0aW9uID0gKChMb2NhbFNpdGUpc2l0ZSkuZ2V0TG9jYXRpb25VUkwoKTsJCQotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShuZXcgVVJMKGxvY2F0aW9uLCJwbGF0Zm9ybS54bWwiKS5nZXRGaWxlKCkpOwotCQlhc3NlcnRUcnVlKCJuZXcgY29uZmlndXJhdGlvbiBkb2VzIG5vdCBleGlzdCIsIGZpbGUuZXhpc3RzKCkpOwotCQkKLQkJLy8gdGVoIGN1cnJlbnQgb25lIHBvaW50cyB0byBhIHJlYWwgZmF0dXJlCi0JCS8vIGRvZXMgbm90IHRocm93IGVycm9yLgotCQlJQ29uZmlndXJlZFNpdGUgY29uZmlnU2l0ZTIgPSBzaXRlLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkuZ2V0Q29uZmlndXJlZFNpdGVzKClbMF07Ci0JCUlGZWF0dXJlUmVmZXJlbmNlW10gcmVmcyA9IGNvbmZpZ1NpdGUyLmdldENvbmZpZ3VyZWRGZWF0dXJlcygpOwotCQlJRmVhdHVyZSBmZWF0dXJlMiA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVmcy5sZW5ndGg7IGkrKykgewotCQkJSUZlYXR1cmUgZmVhdHVyZTMgPSByZWZzW2ldLmdldEZlYXR1cmUobnVsbCk7CQkJCi0JCQlpZiAoIm9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUzXzEuMC4wIi5lcXVhbHMoZmVhdHVyZTMuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkpKXsKLQkJCQlmZWF0dXJlMiA9IGZlYXR1cmUzOwotCQkJCWJyZWFrOwotCQkJfQkJCi0JCX0KLQkJYXNzZXJ0Tm90TnVsbCgiRmVhdHVyZSAyIGlzIE51bGwiLGZlYXR1cmUyKTsKLQkJYXNzZXJ0VHJ1ZSgiV3JvbmcgaWQgIHZlcnNpb24gb2YgZmVhdHVyZSIsZmVhdHVyZTIuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkuZXF1YWxzSWdub3JlQ2FzZSgib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTNfMS4wLjAiKSk7Ci0JCQotCQkvLyB0ZXN0IG9ubHkgMiBpbnN0YWxsIGNvbmZpZyBpbiBsb2NhbCBzaXRlCi0vLwkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBudW1iZXIgb2YgaGlzdG9yeSBpbiBMb2NhbCBzaXRlOiIsb2xkTnVtYmVyT2ZoaXN0b3J5KzEsc2l0ZS5nZXRDb25maWd1cmF0aW9uSGlzdG9yeSgpLmxlbmd0aCk7Ci0JCQotCQkvLyB0ZXN0ICMgb2Ygc2l0ZXMgaW4gY3VycmVudCBjb25maWcKLQkJYXNzZXJ0VHJ1ZSgiV3JvbmcgbnVtYmVyIG9mIGNvbmZpZyBzaXRlcyBpbiBjdXJyZW50IGNvbmZpZyIsc2l0ZS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpLmdldENvbmZpZ3VyZWRTaXRlcygpLmxlbmd0aD09b2xkTnVtYmVyKTsKLQkJCi0JCS8vdGVzdCBvbmx5IG9uZSBmZWF0dXJlIGZvciB0aGUgc2l0ZQotLy8JCWFzc2VydFRydWUoIndyb25nIG51bWJlciBvZiBjb25maWd1cmVkIGZlYXR1cmVzIGZvciBjb25maWcgc2l0ZSIsc2l0ZS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpLmdldENvbmZpZ3VyZWRTaXRlcygpWzBdLmdldENvbmZpZ3VyZWRGZWF0dXJlcygpLmxlbmd0aD09MSk7Ci0JCQotCQkvLyB0ZXN0IG9ubHkgMiBhY3Rpdml0aWVzCi0vLwkJYXNzZXJ0VHJ1ZSgiV3JvbmcgbnVtYmVyIG9mIGFjdGl2aXRpZXMgZm9yIGluc3RhbGwgY29uZmlnIixzaXRlLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkuZ2V0QWN0aXZpdGllcygpLmxlbmd0aD09Mik7Ci0JCQotCQkKLQkJLy8gY2xlYW51cAotCQlsb2NhbEZpbGUgPSBuZXcgRmlsZSgoKExvY2FsU2l0ZSlTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKSkuZ2V0TG9jYXRpb25VUkwoKS5nZXRGaWxlKCkpOwotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0obG9jYWxGaWxlKTsJCQotCQlsb2NhbEZpbGUgPSBuZXcgRmlsZShuZXcgVVJMKGxvY2F0aW9uLFNpdGUuREVGQVVMVF9GRUFUVVJFX1BBVEgrRmlsZS5zZXBhcmF0b3IrZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSkuZ2V0RmlsZSgpKTsJCQotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0obG9jYWxGaWxlKTsJCQkJCQotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0oZmlsZSk7CQkKLQl9Ci0KLS8qCXB1YmxpYyB2b2lkIHRlc3RSZXRyaXZlQ29uZmlnSFRUUEluc3RhbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQkvL2NsZWFuIHVwCi0JCUZpbGUgbG9jYWxGaWxlID0gbmV3IEZpbGUoKChMb2NhbFNpdGUpU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkpLmdldExvY2F0aW9uVVJMKCkuZ2V0RmlsZSgpKTsKLQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGxvY2FsRmlsZSk7Ci0JCUludGVybmFsU2l0ZU1hbmFnZXIubG9jYWxTaXRlPW51bGw7CQkKLQotCQlJTG9jYWxTaXRlIHNpdGUgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKTsKLQkJSVNpdGUgcmVtb3RlU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUoU09VUkNFX0hUVFBfU0lURSxudWxsKTsKLQkJSUZlYXR1cmUgZmVhdHVyZSA9IHJlbW90ZVNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKVswXS5nZXRGZWF0dXJlKG51bGwpOwotCQkKLQkJLy8gd2UgYXJlIG5vdCBjaGVja2luZyBpZiB0aGlzIGlzIHJlYWQgb25seQotCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gbmV3Q29uZmlnID0gc2l0ZS5jbG9uZUN1cnJlbnRDb25maWd1cmF0aW9uKCk7Ci0JCW5ld0NvbmZpZy5zZXRMYWJlbCgibmV3IExhYmVsIik7CQkKLQkJSUNvbmZpZ3VyZWRTaXRlIGNvbmZpZ1NpdGUgPSBuZXdDb25maWcuZ2V0Q29uZmlndXJlZFNpdGVzKClbMF07Ci0JCUNvbmZpZ3VyYXRpb25Qb2xpY3lNb2RlbCBjb25maWdQb2xpY3kgPSBuZXcgQmFzZVNpdGVMb2NhbEZhY3RvcnkoKS5jcmVhdGVDb25maWd1cmF0aW9uUG9saWN5TW9kZWwoKTsKLQkJY29uZmlnUG9saWN5LnNldFBvbGljeShJUGxhdGZvcm1Db25maWd1cmF0aW9uLklTaXRlUG9saWN5LlVTRVJfSU5DTFVERSk7Ci0JCSgoQ29uZmlndXJlZFNpdGUpY29uZmlnU2l0ZSkuc2V0Q29uZmlndXJhdGlvblBvbGljeU1vZGVsKChDb25maWd1cmF0aW9uUG9saWN5TW9kZWwpY29uZmlnUG9saWN5KTsJCi0JCWludCBvbGROdW1iZXJPZmhpc3RvcnkgPSBzaXRlLmdldENvbmZpZ3VyYXRpb25IaXN0b3J5KCkubGVuZ3RoOwkJCQotCQlzaXRlLmFkZENvbmZpZ3VyYXRpb24obmV3Q29uZmlnKTsKLQkJCi0JCi0JCSgoQ29uZmlndXJlZFNpdGUpY29uZmlnU2l0ZSkuc2V0VXBkYXRhYmxlKHRydWUpOwkJCQkKLQkJY29uZmlnU2l0ZS5pbnN0YWxsKGZlYXR1cmUsbnVsbCxudWxsKTsKLQkJc2l0ZS5zYXZlKCk7Ci0KLQkJLy9kbyBub3QgY2xlYW51cCwgd2Ugd2FudCB0byByZXVzZSBwcmV2aW91c2x5IGNyZWF0ZWQgbG9jYWwgc2l0ZQotCQkvLyBidXQgZm9yY2UgcmUtcmVhZCBvZiB4bWwgRmlsZQotCQlJbnRlcm5hbFNpdGVNYW5hZ2VyLmxvY2FsU2l0ZT1udWxsOwotCQlzaXRlID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCk7Ci0JCWZlYXR1cmUgPSByZW1vdGVTaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKClbMF0uZ2V0RmVhdHVyZShudWxsKTsKLQkJaW50IG9sZE51bWJlciA9IHNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKS5nZXRDb25maWd1cmVkU2l0ZXMoKS5sZW5ndGg7CQkKLQkJCi0JCS8vIGNoZWNrCi0JCS8vIHRoZXJlIGFyZSAyIGNvbmZpZ3VyYXRpb24KLQkJU3RyaW5nIHRpbWUgPSAiIitzaXRlLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkuZ2V0Q3JlYXRpb25EYXRlKCkuZ2V0VGltZSgpOwotCQlVUkwgbG9jYXRpb24gPSAoKExvY2FsU2l0ZSlzaXRlKS5nZXRMb2NhdGlvblVSTCgpOwkJCi0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKG5ldyBVUkwobG9jYXRpb24sInBsYXRmb3JtLnhtbCIpLmdldEZpbGUoKSk7Ci0JCWFzc2VydFRydWUoIm5ldyBjb25maWd1cmF0aW9uIGRvZXMgbm90IGV4aXN0IiwgZmlsZS5leGlzdHMoKSk7Ci0JCQotCQkvLyB0ZWggY3VycmVudCBvbmUgcG9pbnRzIHRvIGEgcmVhbCBmYXR1cmUKLQkJLy8gZG9lcyBub3QgdGhyb3cgZXJyb3IuCi0JCUlDb25maWd1cmVkU2l0ZSBjb25maWdTaXRlMiA9IHNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKS5nZXRDb25maWd1cmVkU2l0ZXMoKVswXTsKLQkJCi0JCUlGZWF0dXJlUmVmZXJlbmNlW10gcmVmcyA9IGNvbmZpZ1NpdGUyLmdldENvbmZpZ3VyZWRGZWF0dXJlcygpOwotCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCUlGZWF0dXJlIGZlYXR1cmUyID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7ICFmb3VuZCAmJiBpIDwgcmVmcy5sZW5ndGg7IGkrKykgewotCQkJSUZlYXR1cmUgZmVhdHVyZTMgPSByZWZzW2ldLmdldEZlYXR1cmUobnVsbCk7CQkJCi0JCQlpZiAoIm9yZy50ZXN0MS5pZGVudDFfMS4wLjAiLmVxdWFscyhmZWF0dXJlMy5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSkpewotCQkJCWZlYXR1cmUyID0gZmVhdHVyZTM7Ci0JCQkJZm91bmQgPSB0cnVlOwotCQkJfQkJCi0JCX0KLQotCQkvL1N0cmluZyBjb25maWd1cmVkRmVhdHVyZSA9IGZlYXR1cmUyLmdldExhYmVsKCk7Ci0JCWFzc2VydFRydWUoImNhbm5vdCBmaW5kIGZlYXR1cmUgb3JnLnRlc3QxLmlkZW50MV8xLjAuMCBpbiBjb25maWd1cmVkIFNpdGUiLGZvdW5kKTsKLQkJYXNzZXJ0VHJ1ZSgiV3JvbmcgaWQgIHZlcnNpb24gb2YgZmVhdHVyZSIsZmVhdHVyZTIuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkuZXF1YWxzSWdub3JlQ2FzZSgib3JnLnRlc3QxLmlkZW50MV8xLjAuMCIpKTsKLQkJCi0JCS8vIHRlc3Qgb25seSAyIGluc3RhbGwgY29uZmlnIGluIGxvY2FsIHNpdGUKLS8vCQlhc3NlcnRFcXVhbHMoIndyb25nIG51bWJlciBvZiBoaXN0b3J5IGluIExvY2FsIHNpdGU6IixvbGROdW1iZXJPZmhpc3RvcnkrMSxzaXRlLmdldENvbmZpZ3VyYXRpb25IaXN0b3J5KCkubGVuZ3RoKTsKLQkJCi0JCS8vIHRlc3Qgc2FtZSBudW1iZXIgb2Ygc2l0ZXMgaW4gY3VycmVudCBjb25maWcKLQkJYXNzZXJ0VHJ1ZSgiV3JvbmcgbnVtYmVyIG9mIGNvbmZpZyBzaXRlcyBpbiBjdXJyZW50IGNvbmZpZyIsc2l0ZS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpLmdldENvbmZpZ3VyZWRTaXRlcygpLmxlbmd0aD09b2xkTnVtYmVyKTsKLQkJCi0JCS8vdGVzdCBvbmx5IG9uZSBmZWF0dXJlIGZvciB0aGUgc2l0ZQotLy8JCWFzc2VydFRydWUoIndyb25nIG51bWJlciBvZiBjb25maWd1cmVkIGZlYXR1cmVzIGZvciBjb25maWcgc2l0ZSIsc2l0ZS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpLmdldENvbmZpZ3VyZWRTaXRlcygpWzBdLmdldENvbmZpZ3VyZWRGZWF0dXJlcygpLmxlbmd0aD09MSk7Ci0JCQotCQkvLyB0ZXN0IG9ubHkgMiBhY3Rpdml0aWVzCi0vLwkJYXNzZXJ0VHJ1ZSgiV3JvbmcgbnVtYmVyIG9mIGFjdGl2aXRpZXMgZm9yIGluc3RhbGwgY29uZmlnIixzaXRlLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkuZ2V0QWN0aXZpdGllcygpLmxlbmd0aD09Mik7Ci0JCQotCQkKLQkJLy8gY2xlYW51cAotCQlsb2NhbEZpbGUgPSBuZXcgRmlsZShsb2NhdGlvbi5nZXRGaWxlKCkpOwotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0obG9jYWxGaWxlKTsJCQotCQlsb2NhbEZpbGUgPSBuZXcgRmlsZShuZXcgVVJMKGxvY2F0aW9uLFNpdGUuREVGQVVMVF9GRUFUVVJFX1BBVEgrRmlsZS5zZXBhcmF0b3IrZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSkuZ2V0RmlsZSgpKTsJCQotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0obG9jYWxGaWxlKTsJCQkJCQkJCi0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShmaWxlKTsJCQotCQlsb2NhbEZpbGUgPSBuZXcgRmlsZShmZWF0dXJlMi5nZXRVUkwoKS5nZXRGaWxlKCkpOwotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0obG9jYWxGaWxlKTsKLQl9Ki8KLQkKLS8vVE9ETyB1bmNvbW1lbnQgdGhpcyBvbmNlIHNpdGUgZGlzYWJsaW5nIGlzIHN1cHBvcnRlZAotcHVibGljIHZvaWQgdGVzdFJldHJpdmVDb25maWdIVFRQSW5zdGFsbE5vdEVuYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotLyoKLQkvL2NsZWFuIHVwCi0JTG9jYWxTaXRlIHNpdGVMb2NhbCA9IChMb2NhbFNpdGUpU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCk7Ci0JVVJMIG5ld1VSTCA9IG5ldyBVUkwoc2l0ZUxvY2FsLmdldExvY2F0aW9uVVJMKCksTG9jYWxTaXRlLlNJVEVfTE9DQUxfRklMRSk7Ci0JRmlsZSBsb2NhbEZpbGUgPSBuZXcgRmlsZShuZXdVUkwuZ2V0RmlsZSgpKTsKLQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0obG9jYWxGaWxlKTsKLQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0obmV3IEZpbGUoKChJbnN0YWxsQ29uZmlndXJhdGlvbilzaXRlTG9jYWwuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKSkuZ2V0VVJMKCkuZ2V0RmlsZSgpKSk7CQotCUludGVybmFsU2l0ZU1hbmFnZXIubG9jYWxTaXRlPW51bGw7CQkKLQotCUlMb2NhbFNpdGUgc2l0ZSA9IFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpOwotCUlTaXRlIHJlbW90ZVNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKFNPVVJDRV9IVFRQX1NJVEUpOwotCUlGZWF0dXJlIGZlYXR1cmUgPSByZW1vdGVTaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKClbMF0uZ2V0RmVhdHVyZShudWxsKTsKLQkJCi0JLy8gd2UgYXJlIG5vdCBjaGVja2luZyBpZiB0aGlzIGlzIHJlYWQgb25seQotCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBuZXdDb25maWcgPSBzaXRlLmNsb25lQ3VycmVudENvbmZpZ3VyYXRpb24oKTsKLQluZXdDb25maWcuc2V0TGFiZWwoIm5ldyBMYWJlbCIpOwkJCi0JSUNvbmZpZ3VyZWRTaXRlIGNvbmZpZ1NpdGUgPSBuZXdDb25maWcuZ2V0Q29uZmlndXJlZFNpdGVzKClbMF07Ci0JQ29uZmlndXJhdGlvblBvbGljeU1vZGVsIGNvbmZpZ1BvbGljeSA9IG5ldyBCYXNlU2l0ZUxvY2FsRmFjdG9yeSgpLmNyZWF0ZUNvbmZpZ3VyYXRpb25Qb2xpY3lNb2RlbCgpOwotCWNvbmZpZ1BvbGljeS5zZXRQb2xpY3koSVBsYXRmb3JtQ29uZmlndXJhdGlvbi5JU2l0ZVBvbGljeS5VU0VSX0lOQ0xVREUpOwotCSgoQ29uZmlndXJlZFNpdGUpY29uZmlnU2l0ZSkuc2V0Q29uZmlndXJhdGlvblBvbGljeU1vZGVsKChDb25maWd1cmF0aW9uUG9saWN5TW9kZWwpY29uZmlnUG9saWN5KTsJCi0JaW50IG9sZE51bWJlck9maGlzdG9yeSA9IHNpdGUuZ2V0Q29uZmlndXJhdGlvbkhpc3RvcnkoKS5sZW5ndGg7CQkJCi0Jc2l0ZS5hZGRDb25maWd1cmF0aW9uKG5ld0NvbmZpZyk7Ci0JCQotCQotCSgoQ29uZmlndXJlZFNpdGUpY29uZmlnU2l0ZSkuc2V0VXBkYXRhYmxlKHRydWUpOwotCWNvbmZpZ1NpdGUuaW5zdGFsbChmZWF0dXJlLG51bGwsbnVsbCk7Ci0JKChDb25maWd1cmVkU2l0ZSljb25maWdTaXRlKS5zZXRFbmFibGVkKGZhbHNlKTsJCi0Jc2l0ZS5zYXZlKCk7Ci0KLQkvL2RvIG5vdCBjbGVhbnVwLCB3ZSB3YW50IHRvIHJldXNlIHByZXZpb3VzbHkgY3JlYXRlZCBsb2NhbCBzaXRlCi0JLy8gYnV0IGZvcmNlIHJlLXJlYWQgb2YgeG1sIEZpbGUKLQlJbnRlcm5hbFNpdGVNYW5hZ2VyLmxvY2FsU2l0ZT1udWxsOwotCXNpdGUgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKTsKLQlmZWF0dXJlID0gcmVtb3RlU2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlcygpWzBdLmdldEZlYXR1cmUobnVsbCk7Ci0JaW50IG9sZE51bWJlciA9IHNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKS5nZXRDb25maWd1cmVkU2l0ZXMoKS5sZW5ndGg7CQkKLQkJCi0JLy8gY2hlY2sKLQkvLyB0aGVyZSBhcmUgMiBjb25maWd1cmF0aW9uCi0JU3RyaW5nIHRpbWUgPSAiIitzaXRlLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkuZ2V0Q3JlYXRpb25EYXRlKCkuZ2V0VGltZSgpOwotCVVSTCBsb2NhdGlvbiA9ICgoTG9jYWxTaXRlKXNpdGUpLmdldExvY2F0aW9uVVJMKCk7CQkKLQlGaWxlIGZpbGUgPSBuZXcgRmlsZShsb2NhdGlvbi5nZXRGaWxlKCkpOwotCWFzc2VydFRydWUoIm5ldyBjb25maWd1cmF0aW9uIGRvZXMgbm90IGV4aXN0IiwgZmlsZS5leGlzdHMoKSk7Ci0JCQotCS8vIHRlaCBjdXJyZW50IG9uZSBwb2ludHMgdG8gYSByZWFsIGZhdHVyZQotCS8vIGRvZXMgbm90IHRocm93IGVycm9yLgotCUlDb25maWd1cmVkU2l0ZSBjb25maWdTaXRlMiA9IHNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKS5nZXRDb25maWd1cmVkU2l0ZXMoKVswXTsKLQkJCi0JSUZlYXR1cmVSZWZlcmVuY2VbXSByZWZzID0gY29uZmlnU2l0ZTIuZ2V0Q29uZmlndXJlZEZlYXR1cmVzKCk7Ci0JYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCUlGZWF0dXJlIGZlYXR1cmUyID0gbnVsbDsKLQlmb3IgKGludCBpID0gMDsgIWZvdW5kICYmIGkgPCByZWZzLmxlbmd0aDsgaSsrKSB7Ci0JCUlGZWF0dXJlIGZlYXR1cmUzID0gcmVmc1tpXS5nZXRGZWF0dXJlKG51bGwpOwkJCQotCQlpZiAoIm9yZy50ZXN0MS5pZGVudDFfMS4wLjAiLmVxdWFscyhmZWF0dXJlMy5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSkpewotCQkJZmVhdHVyZTIgPSBmZWF0dXJlMzsKLQkJCWZvdW5kID0gdHJ1ZTsKLQkJfQkJCi0JfQotCi0JLy9TdHJpbmcgY29uZmlndXJlZEZlYXR1cmUgPSBmZWF0dXJlMi5nZXRMYWJlbCgpOwotCWFzc2VydFRydWUoImZvdW5kIGZlYXR1cmUgb3JnLnRlc3QxLmlkZW50MV8xLjAuMCBpbiBkaXNhYmxlZCBjb25maWd1cmVkIFNpdGUiLCFmb3VuZCk7Ci0JCQotCS8vdGVzdCBubyBjb25maWd1cmVkIGZlYXR1cmVzCi0vLwlhc3NlcnRUcnVlKCJ3cm9uZyBudW1iZXIgb2YgY29uZmlndXJlZCBmZWF0dXJlcyBmb3IgY29uZmlnIHNpdGUiLHNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKS5nZXRDb25maWd1cmVkU2l0ZXMoKVswXS5nZXRDb25maWd1cmVkRmVhdHVyZXMoKS5sZW5ndGg9PTApOwotCQotCQotCWNvbmZpZ1NpdGUyLnNldEVuYWJsZWQodHJ1ZSk7Ci0JcmVmcyA9IGNvbmZpZ1NpdGUyLmdldENvbmZpZ3VyZWRGZWF0dXJlcygpOwkKLQlmb3IgKGludCBpID0gMDsgaSA8IHJlZnMubGVuZ3RoOyBpKyspIHsKLQkJSUZlYXR1cmUgZmVhdHVyZTMgPSByZWZzW2ldLmdldEZlYXR1cmUobnVsbCk7CQkJCi0JCWlmICgib3JnLnRlc3QxLmlkZW50MV8xLjAuMCIuZXF1YWxzKGZlYXR1cmUzLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpKSl7Ci0JCQlmZWF0dXJlMiA9IGZlYXR1cmUzOwotCQkJZm91bmQgPSB0cnVlOwotCQl9CQkKLQl9Ci0KLQkvL1N0cmluZyBjb25maWd1cmVkRmVhdHVyZSA9IGZlYXR1cmUyLmdldExhYmVsKCk7Ci0JYXNzZXJ0VHJ1ZSgiY2Fubm90IGZpbmQgZmVhdHVyZSBvcmcudGVzdDEuaWRlbnQxXzEuMC4wIGluIGNvbmZpZ3VyZWQgU2l0ZSIsZm91bmQpOwotCWFzc2VydFRydWUoIldyb25nIGlkICB2ZXJzaW9uIG9mIGZlYXR1cmUiLGZlYXR1cmUyLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpLmVxdWFsc0lnbm9yZUNhc2UoIm9yZy50ZXN0MS5pZGVudDFfMS4wLjAiKSk7Ci0JCQotCS8vIHRlc3Qgb25seSAyIGluc3RhbGwgY29uZmlnIGluIGxvY2FsIHNpdGUKLS8vCWFzc2VydEVxdWFscygid3JvbmcgbnVtYmVyIG9mIGhpc3RvcnkgaW4gTG9jYWwgc2l0ZToiLG9sZE51bWJlck9maGlzdG9yeSsxLHNpdGUuZ2V0Q29uZmlndXJhdGlvbkhpc3RvcnkoKS5sZW5ndGgpOwotCQkKLQkvLyB0ZXN0IHNhbWUgbnVtYmVyIG9mIHNpdGVzIGluIGN1cnJlbnQgY29uZmlnCi0vLwlhc3NlcnRUcnVlKCJXcm9uZyBudW1iZXIgb2YgY29uZmlnIHNpdGVzIGluIGN1cnJlbnQgY29uZmlnIixzaXRlLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkuZ2V0Q29uZmlndXJlZFNpdGVzKCkubGVuZ3RoPT1vbGROdW1iZXIpOwotCQkKLQkvL3Rlc3Qgb25seSBvbmUgZmVhdHVyZSBmb3IgdGhlIHNpdGUKLS8vCWFzc2VydFRydWUoIndyb25nIG51bWJlciBvZiBjb25maWd1cmVkIGZlYXR1cmVzIGZvciBjb25maWcgc2l0ZSIsc2l0ZS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpLmdldENvbmZpZ3VyZWRTaXRlcygpWzBdLmdldENvbmZpZ3VyZWRGZWF0dXJlcygpLmxlbmd0aD09MSk7Ci0JCQotCS8vIHRlc3Qgb25seSAyIGFjdGl2aXRpZXMKLS8vCWFzc2VydFRydWUoIldyb25nIG51bWJlciBvZiBhY3Rpdml0aWVzIGZvciBpbnN0YWxsIGNvbmZpZyIsc2l0ZS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpLmdldEFjdGl2aXRpZXMoKS5sZW5ndGg9PTIpOwotCQkKLQkJCi0JLy8gY2xlYW51cAotCWxvY2FsRmlsZSA9IG5ldyBGaWxlKG5ldyBVUkwobG9jYXRpb24sTG9jYWxTaXRlLlNJVEVfTE9DQUxfRklMRSkuZ2V0RmlsZSgpKTsKLQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0obG9jYWxGaWxlKTsJCQotCWxvY2FsRmlsZSA9IG5ldyBGaWxlKG5ldyBVUkwobG9jYXRpb24sTG9jYWxTaXRlLkRFRkFVTFRfQ09ORklHX0ZJTEUpLmdldEZpbGUoKSk7Ci0JVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGxvY2FsRmlsZSk7CQotCWxvY2FsRmlsZSA9IG5ldyBGaWxlKG5ldyBVUkwobG9jYXRpb24sU2l0ZS5ERUZBVUxUX0ZFQVRVUkVfUEFUSCtGaWxlLnNlcGFyYXRvcitmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpKS5nZXRGaWxlKCkpOwkJCi0JVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGxvY2FsRmlsZSk7CQotCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShuZXcgRmlsZSgoKEluc3RhbGxDb25maWd1cmF0aW9uKXNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKSkuZ2V0VVJMKCkuZ2V0RmlsZSgpKSk7CQkJCQkJCi0JVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGZpbGUpOwkJCi0JbG9jYWxGaWxlID0gbmV3IEZpbGUoZmVhdHVyZTIuZ2V0VVJMKCkuZ2V0RmlsZSgpKTsKLQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0obG9jYWxGaWxlKTsqLwotfQotCi0KLX0KLQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcmVndWxhckluc3RhbGwvVGVzdFNwYWNlSW5JbnN0YWxsLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9yZWd1bGFySW5zdGFsbC9UZXN0U3BhY2VJbkluc3RhbGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg1NzhhMS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9yZWd1bGFySW5zdGFsbC9UZXN0U3BhY2VJbkluc3RhbGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnJlZ3VsYXJJbnN0YWxsOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLlVwZGF0ZU1hbmFnZXJUZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIFRlc3RTcGFjZUluSW5zdGFsbCBleHRlbmRzIFVwZGF0ZU1hbmFnZXJUZXN0Q2FzZSB7Ci0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIFRlc3QxCi0JICovCi0JcHVibGljIFRlc3RTcGFjZUluSW5zdGFsbChTdHJpbmcgYXJnMCkgewotCQlzdXBlcihhcmcwKTsKLQl9Ci0KLQkvKioKLQkgKgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RTcGFjZUluVVJMKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJLy9jbGVhbnVwIHRhcmdldCAKLQkJVVJMIHRlc3RVUkwgPSBuZXcgVVJMKFRBUkdFVF9GSUxFX1NJVEUsInRlc3Qgc2l0ZSBzcGFjZS8iKTsgCi0JCVN0cmluZyB0ZXN0UGF0aCA9IHRlc3RVUkwuZ2V0RmlsZSgpOwotCQlGaWxlIHRhcmdldCA9IG5ldyBGaWxlKHRlc3RQYXRoKTsKLQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKHRhcmdldCk7Ci0JCQotCQlVUkwgbmV3VVJMID0gbmV3IEZpbGUoZGF0YVBhdGggKyAiU2l0ZSB3aXRoIHNwYWNlL3NpdGUueG1sIikudG9VUkwoKTsKLQkJSVNpdGUgcmVtb3RlU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUobmV3VVJMLHRydWUsbnVsbCk7Ci0JCUlGZWF0dXJlUmVmZXJlbmNlW10gZmVhdHVyZXNSZWYgPSByZW1vdGVTaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKCk7Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHRlc3RVUkwuZ2V0RmlsZSgpKTsKLQkJaWYgKCFmaWxlLmV4aXN0cygpKSBmaWxlLm1rZGlycygpOwotCQlJU2l0ZSBsb2NhbFNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKHRlc3RVUkwsdHJ1ZSxudWxsKTsKLQkJSUZlYXR1cmUgcmVtb3RlRmVhdHVyZSA9IG51bGw7Ci0JCQotCQkvLyBhdCBsZWFzdCBvbmUgZXhlY3V0YWJsZSBmZWF0dXJlIGFuZCBvbiBwYWNrYWdlZAotCQlib29sZWFuIGV4ZWNGZWF0dXJlID0gZmFsc2U7Ci0JCWJvb2xlYW4gcGFja0ZlYXR1cmUgPSBmYWxzZTsKLQotCQlpZiAoZmVhdHVyZXNSZWYubGVuZ3RoPT0wKSBmYWlsICgibm8gZmVhdHVyZSBmb3VuZCIpOwotCQotCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzUmVmLmxlbmd0aDsgaSsrKSB7Ci0JCQlyZW1vdGVGZWF0dXJlID0gZmVhdHVyZXNSZWZbaV0uZ2V0RmVhdHVyZShudWxsKTsKLQkJCXJlbW92ZShyZW1vdGVGZWF0dXJlLGxvY2FsU2l0ZSk7IAotCQkJbG9jYWxTaXRlLmluc3RhbGwocmVtb3RlRmVhdHVyZSwgbnVsbCxudWxsKTsKLQkJCQotCQkJaWYgKHJlbW90ZUZlYXR1cmUuZ2V0RmVhdHVyZUNvbnRlbnRQcm92aWRlcigpIGluc3RhbmNlb2YgRmVhdHVyZVBhY2thZ2VkQ29udGVudFByb3ZpZGVyKSBwYWNrRmVhdHVyZSA9IHRydWU7Ci0JCQlpZiAocmVtb3RlRmVhdHVyZS5nZXRGZWF0dXJlQ29udGVudFByb3ZpZGVyKCkgaW5zdGFuY2VvZiBGZWF0dXJlRXhlY3V0YWJsZUNvbnRlbnRQcm92aWRlcikgZXhlY0ZlYXR1cmUgPSB0cnVlOwotCi0JCQkvLyB2ZXJpZnkKLQkJCVN0cmluZyBzaXRlID0gdGVzdFVSTC5nZXRGaWxlKCk7Ci0JCQlJUGx1Z2luRW50cnlbXSBlbnRyaWVzID0gcmVtb3RlRmVhdHVyZS5nZXRSYXdQbHVnaW5FbnRyaWVzKCk7Ci0JCQlhc3NlcnRUcnVlKCJubyBwbHVnaW5zIGVudHJ5IiwgKGVudHJpZXMgIT0gbnVsbCAmJiBlbnRyaWVzLmxlbmd0aCAhPSAwKSk7Ci0JCQlTdHJpbmcgcGx1Z2luTmFtZSA9IGVudHJpZXNbMF0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCk7Ci0JCQlGaWxlIHBsdWdpbkZpbGUgPSBuZXcgRmlsZShzaXRlLCBTaXRlLkRFRkFVTFRfUExVR0lOX1BBVEggKyBwbHVnaW5OYW1lKTsKLQkJCWFzc2VydFRydWUoInBsdWdpbiBmaWxlcyBub3QgaW5zdGFsbGVkIGxvY2FsbHkiLCBwbHVnaW5GaWxlLmV4aXN0cygpKTsKLQotCQkJRmlsZSBmZWF0dXJlRmlsZSA9IG5ldyBGaWxlKHNpdGUsIFNpdGUuREVGQVVMVF9JTlNUQUxMRURfRkVBVFVSRV9QQVRIICsgcmVtb3RlRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSk7Ci0JCQlhc3NlcnRUcnVlKCJmZWF0dXJlIGluZm8gbm90IGluc3RhbGxlZCBsb2NhbGx5OiIrZmVhdHVyZUZpbGUsIGZlYXR1cmVGaWxlLmV4aXN0cygpKTsKLQotCQkJRmlsZSBmZWF0dXJlRmlsZVhNTCA9IG5ldyBGaWxlKHNpdGUsIFNpdGUuREVGQVVMVF9JTlNUQUxMRURfRkVBVFVSRV9QQVRIICsgcmVtb3RlRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSArIEZpbGUuc2VwYXJhdG9yICsgImZlYXR1cmUueG1sIik7Ci0JCQlhc3NlcnRUcnVlKCJmZWF0dXJlIGluZm8gbm90IGluc3RhbGxlZCBsb2NhbGx5OiBubyBmZWF0dXJlLnhtbCIsIGZlYXR1cmVGaWxlWE1MLmV4aXN0cygpKTsKLQkJfQotCi0JCWlmICghZXhlY0ZlYXR1cmUgJiYgIXBhY2tGZWF0dXJlKXsKLQkJCWZhaWwoImNhbm5vdCBmaW5kIG9uZSBleGVjdXRhYmxlIGFuZCBvbmUgcGFja2FnZSBmZWF0dXJlIG9uIHRlaCBzaXRlIik7Ci0JCX0KLQotCQkvL2NsZWFudXAgdGFyZ2V0IAotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0odGFyZ2V0KTsKLQotCi0JfQotCQotCQotCS8qKgotCSAqCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFNwYWNlSW5IVFRQVVJMKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJLy9jbGVhbnVwIHRhcmdldCAgCi0JCUZpbGUgdGFyZ2V0ID0gbmV3IEZpbGUoVEFSR0VUX0ZJTEVfU0lURS5nZXRGaWxlKCkpOwotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0odGFyZ2V0KTsKLQkJSW5zdGFsbFJlZ2lzdHJ5LmNsZWFudXAoKTsKLQkJCi0JCVN0cmluZyBwYXRoID0gYnVuZGxlLmdldFN0cmluZygiSFRUUF9QQVRIXzMiKTsKLQkJSVNpdGUgcmVtb3RlU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUobmV3IFVSTCgiaHR0cCIsZ2V0SHR0cEhvc3QoKSxnZXRIdHRwUG9ydCgpLHBhdGgpLHRydWUsbnVsbCk7CQkKLQkJSUZlYXR1cmVSZWZlcmVuY2VbXSBmZWF0dXJlc1JlZiA9IHJlbW90ZVNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKTsKLQkJSVNpdGUgbG9jYWxTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShUQVJHRVRfRklMRV9TSVRFLHRydWUsbnVsbCk7Ci0JCUlGZWF0dXJlIHJlbW90ZUZlYXR1cmUgPSBudWxsOwotCQkKLQkJLy8gYXQgbGVhc3Qgb25lIGV4ZWN1dGFibGUgZmVhdHVyZSBhbmQgb24gcGFja2FnZWQKLQkJYm9vbGVhbiBleGVjRmVhdHVyZSA9IGZhbHNlOwotCQlib29sZWFuIHBhY2tGZWF0dXJlID0gZmFsc2U7Ci0KLQkJaWYgKGZlYXR1cmVzUmVmLmxlbmd0aD09MCkgZmFpbCAoIm5vIGZlYXR1cmUgZm91bmQiKTsKLQkKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlc1JlZi5sZW5ndGg7IGkrKykgewotCQkJcmVtb3RlRmVhdHVyZSA9IGZlYXR1cmVzUmVmW2ldLmdldEZlYXR1cmUobnVsbCk7Ci0JCQlsb2NhbFNpdGUuaW5zdGFsbChyZW1vdGVGZWF0dXJlLCBudWxsLG51bGwpOwotCQkJCi0JCQlpZiAocmVtb3RlRmVhdHVyZS5nZXRGZWF0dXJlQ29udGVudFByb3ZpZGVyKCkgaW5zdGFuY2VvZiBGZWF0dXJlUGFja2FnZWRDb250ZW50UHJvdmlkZXIpIHBhY2tGZWF0dXJlID0gdHJ1ZTsKLQkJCWlmIChyZW1vdGVGZWF0dXJlLmdldEZlYXR1cmVDb250ZW50UHJvdmlkZXIoKSBpbnN0YW5jZW9mIEZlYXR1cmVFeGVjdXRhYmxlQ29udGVudFByb3ZpZGVyKSBleGVjRmVhdHVyZSA9IHRydWU7Ci0KLQkJCS8vIHZlcmlmeQotCQkJU3RyaW5nIHNpdGUgPSBUQVJHRVRfRklMRV9TSVRFLmdldEZpbGUoKTsJCQkKLQkJCUlQbHVnaW5FbnRyeVtdIGVudHJpZXMgPSByZW1vdGVGZWF0dXJlLmdldFJhd1BsdWdpbkVudHJpZXMoKTsKLQkJCWFzc2VydFRydWUoIm5vIHBsdWdpbnMgZW50cnkiLCAoZW50cmllcyAhPSBudWxsICYmIGVudHJpZXMubGVuZ3RoICE9IDApKTsKLQkJCVN0cmluZyBwbHVnaW5OYW1lID0gZW50cmllc1swXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKTsKLQkJCUZpbGUgcGx1Z2luRmlsZSA9IG5ldyBGaWxlKHNpdGUsIFNpdGUuREVGQVVMVF9QTFVHSU5fUEFUSCArIHBsdWdpbk5hbWUpOwotCQkJYXNzZXJ0VHJ1ZSgicGx1Z2luIGZpbGVzIG5vdCBpbnN0YWxsZWQgbG9jYWxseSIsIHBsdWdpbkZpbGUuZXhpc3RzKCkpOwotCi0JCQlGaWxlIGZlYXR1cmVGaWxlID0gbmV3IEZpbGUoc2l0ZSwgU2l0ZS5ERUZBVUxUX0lOU1RBTExFRF9GRUFUVVJFX1BBVEggKyByZW1vdGVGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpKTsKLQkJCWFzc2VydFRydWUoImZlYXR1cmUgaW5mbyBub3QgaW5zdGFsbGVkIGxvY2FsbHk6IitmZWF0dXJlRmlsZSwgZmVhdHVyZUZpbGUuZXhpc3RzKCkpOwotCi0JCQlGaWxlIGZlYXR1cmVGaWxlWE1MID0gbmV3IEZpbGUoc2l0ZSwgU2l0ZS5ERUZBVUxUX0lOU1RBTExFRF9GRUFUVVJFX1BBVEggKyByZW1vdGVGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpICsgRmlsZS5zZXBhcmF0b3IgKyAiZmVhdHVyZS54bWwiKTsKLQkJCWFzc2VydFRydWUoImZlYXR1cmUgaW5mbyBub3QgaW5zdGFsbGVkIGxvY2FsbHk6IG5vIGZlYXR1cmUueG1sIiwgZmVhdHVyZUZpbGVYTUwuZXhpc3RzKCkpOwotCQl9Ci0KLQkJaWYgKCFleGVjRmVhdHVyZSAmJiAhcGFja0ZlYXR1cmUpewotCQkJZmFpbCgiY2Fubm90IGZpbmQgb25lIGV4ZWN1dGFibGUgYW5kIG9uZSBwYWNrYWdlIGZlYXR1cmUgb24gdGVoIHNpdGUiKTsKLQkJfQotCi0JCS8vY2xlYW51cCB0YXJnZXQgCi0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbSh0YXJnZXQpOwotCQlJbnN0YWxsUmVnaXN0cnkuY2xlYW51cCgpOwotCi0JfQotCQkKLQkJCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9yZWd1bGFyUmVtb3ZlL0FsbFJlZ3VsYXJSZW1vdmVUZXN0cy5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcmVndWxhclJlbW92ZS9BbGxSZWd1bGFyUmVtb3ZlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDYwNDgxNS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9yZWd1bGFyUmVtb3ZlL0FsbFJlZ3VsYXJSZW1vdmVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5yZWd1bGFyUmVtb3ZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLlVwZGF0ZU1hbmFnZXJUZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLQotCi1wdWJsaWMgY2xhc3MgQWxsUmVndWxhclJlbW92ZVRlc3RzIGV4dGVuZHMgVXBkYXRlTWFuYWdlclRlc3RDYXNlIHsKLXB1YmxpYyBBbGxSZWd1bGFyUmVtb3ZlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0Jc3VpdGUuc2V0TmFtZSgiUmVndWxhciBSZW1vdmUgVGVzdHMiKTsKLQkKLQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoVGVzdFJlbW92ZS5jbGFzcykpOwotCQotCXJldHVybiBzdWl0ZTsKLX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3JlZ3VsYXJSZW1vdmUvVGVzdFJlbW92ZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcmVndWxhclJlbW92ZS9UZXN0UmVtb3ZlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhYTM2ZTQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcmVndWxhclJlbW92ZS9UZXN0UmVtb3ZlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnJlZ3VsYXJSZW1vdmU7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLklDb25maWd1cmVkU2l0ZUNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5VcGRhdGVNYW5hZ2VyVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0UmVtb3ZlIGV4dGVuZHMgVXBkYXRlTWFuYWdlclRlc3RDYXNlIHsKLQotCXB1YmxpYyBjbGFzcyBMaXN0ZW5lciBpbXBsZW1lbnRzIElDb25maWd1cmVkU2l0ZUNoYW5nZWRMaXN0ZW5lciB7Ci0KLQkJcHVibGljIGJvb2xlYW4gbm90aWZpZWQgPSBmYWxzZTsKLQotCQlwdWJsaWMgdm9pZCBmZWF0dXJlSW5zdGFsbGVkKElGZWF0dXJlIGZlYXR1cmUpIHsKLQkJCW5vdGlmaWVkID0gdHJ1ZTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTm90aWZpZWQgRGVmYXVsdEZlYXR1cmUgSW5zdGFsbGVkIik7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBmZWF0dXJlUmVtb3ZlZChJRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCX0KLQkJcHVibGljIHZvaWQgZmVhdHVyZUNvbmZpZ3VyZWQoSUZlYXR1cmUgZmVhdHVyZSkgewotCQl9Ci0JCXB1YmxpYyB2b2lkIGZlYXR1cmVVbmNvbmZpZ3VyZWQoSUZlYXR1cmUgZmVhdHVyZSkgewotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNOb3RpZmllZCgpIHsKLQkJCXJldHVybiBub3RpZmllZDsKLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBUZXN0MQotCSAqLwotCXB1YmxpYyBUZXN0UmVtb3ZlKFN0cmluZyBhcmcwKSB7Ci0JCXN1cGVyKGFyZzApOwotCX0KLQotCXByaXZhdGUgSUZlYXR1cmUgZ2V0RmVhdHVyZTEoSVNpdGUgc2l0ZSkKLQkJdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vVVJMIHVybCA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkwoc2l0ZS5nZXRVUkwoKSwgImZlYXR1cmVzL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxXzEuMC40LmphciIsIG51bGwpOwotCQlTaXRlRmVhdHVyZVJlZmVyZW5jZSByZWYgPSBuZXcgU2l0ZUZlYXR1cmVSZWZlcmVuY2UoKTsKLQkJcmVmLnNldFNpdGUoc2l0ZSk7Ci0JCXJlZi5zZXRVUkxTdHJpbmcoImZlYXR1cmVzL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxXzEuMC40LmphciIpOwotCQlyZWYuc2V0VHlwZShJU2l0ZS5ERUZBVUxUX1BBQ0tBR0VEX0ZFQVRVUkVfVFlQRSk7Ci0JCXJlZi5yZXNvbHZlKHNpdGUuZ2V0VVJMKCksIG51bGwpOwotCQlyZXR1cm4gcmVmLmdldEZlYXR1cmUobnVsbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUZlYXR1cmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQkvLyBpbnN0YWxsIGZlYXR1cmUKLQkJSVNpdGUgcmVtb3RlU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUoU09VUkNFX0ZJTEVfU0lURSxudWxsKTsKLQkJSUZlYXR1cmUgcmVtb3RlRmVhdHVyZSA9IGdldEZlYXR1cmUxKHJlbW90ZVNpdGUpOwotCQlJU2l0ZSBsb2NhbFNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKFRBUkdFVF9GSUxFX1NJVEUsbnVsbCk7Ci0JCUlGZWF0dXJlUmVmZXJlbmNlIHJlZiA9IGxvY2FsU2l0ZS5pbnN0YWxsKHJlbW90ZUZlYXR1cmUsIG51bGwsIG51bGwpOwotCi0JCS8vIHRoZW4gcmVtb3ZlIGl0Ci0JCWFzc2VydE5vdE51bGwoIkZlYXR1cmUgaXMgbnVsbCIscmVmLmdldEZlYXR1cmUobnVsbCkpOwotCQlTdHJpbmcgZmVhdHVyZVJlZiA9IHJlZi5nZXRGZWF0dXJlKG51bGwpLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpOwotCQlsb2NhbFNpdGUucmVtb3ZlKHJlZi5nZXRGZWF0dXJlKG51bGwpLCBudWxsKTsKLQotCQkvLyB2ZXJpZnkKLQkJU3RyaW5nIHNpdGUgPSBUQVJHRVRfRklMRV9TSVRFLmdldEZpbGUoKTsKLQkJSVBsdWdpbkVudHJ5W10gZW50cmllcyA9IHJlbW90ZUZlYXR1cmUuZ2V0UGx1Z2luRW50cmllcygpOwotCQlhc3NlcnRUcnVlKCJubyBwbHVnaW5zIGVudHJ5IiwgKGVudHJpZXMgIT0gbnVsbCAmJiBlbnRyaWVzLmxlbmd0aCAhPSAwKSk7Ci0JCVN0cmluZyBwbHVnaW5OYW1lID0gZW50cmllc1swXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKTsKLQotCQlGaWxlIHBsdWdpbkZpbGUgPSBuZXcgRmlsZShzaXRlLCBTaXRlLkRFRkFVTFRfUExVR0lOX1BBVEggKyBwbHVnaW5OYW1lKTsKLQkJYXNzZXJ0VHJ1ZSgicGx1Z2luIGZpbGVzIGluc3RhbGxlZCBsb2NhbGx5IiwgIXBsdWdpbkZpbGUuZXhpc3RzKCkpOwotCi0JCUZpbGUgZmVhdHVyZUZpbGUgPQotCQkJbmV3IEZpbGUoc2l0ZSwgU2l0ZS5ERUZBVUxUX0lOU1RBTExFRF9GRUFUVVJFX1BBVEggKyBmZWF0dXJlUmVmKTsKLQkJYXNzZXJ0VHJ1ZSgKLQkJCSJmZWF0dXJlIGluZm8gaW5zdGFsbGVkIGxvY2FsbHk6IiArIGZlYXR1cmVGaWxlLAotCQkJIWZlYXR1cmVGaWxlLmV4aXN0cygpKTsKLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvc2l0ZXZhbGlkYXRpb24vQWxsU2l0ZVZhbGlkYXRpb25UZXN0cy5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvc2l0ZXZhbGlkYXRpb24vQWxsU2l0ZVZhbGlkYXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmY2IzMmY4Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3NpdGV2YWxpZGF0aW9uL0FsbFNpdGVWYWxpZGF0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuc2l0ZXZhbGlkYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuVXBkYXRlTWFuYWdlclRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotCi1wdWJsaWMgY2xhc3MgQWxsU2l0ZVZhbGlkYXRpb25UZXN0cyBleHRlbmRzIFVwZGF0ZU1hbmFnZXJUZXN0Q2FzZSB7Ci0JcHVibGljIEFsbFNpdGVWYWxpZGF0aW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCQlzdWl0ZS5zZXROYW1lKCJTaXRlIFZhbGlkYXRpb24gVGVzdHMiKTsKLQotCQkvLyB0aGUgZm9sbG93aW5nIHdpbGwgdGFrZSBhbGwgdGVoIHRlc3QgbWV0aG9kcyBpbiB0ZWggY2xhc3MgdGhhdCBzdGFydCB3aXRoICd0ZXN0JwotCi0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShUZXN0U2l0ZVZhbGlkYXRpb24uY2xhc3MpKTsKLQotCQlyZXR1cm4gc3VpdGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvc2l0ZXZhbGlkYXRpb24vVGVzdFNpdGVWYWxpZGF0aW9uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9zaXRldmFsaWRhdGlvbi9UZXN0U2l0ZVZhbGlkYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDM5ODI3OS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9zaXRldmFsaWRhdGlvbi9UZXN0U2l0ZVZhbGlkYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnNpdGV2YWxpZGF0aW9uOwotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IuSVBsYXRmb3JtQ29uZmlndXJhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLio7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0U2l0ZVZhbGlkYXRpb24gZXh0ZW5kcyBVcGRhdGVNYW5hZ2VyVGVzdENhc2UgewotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAKLQkgKi8KLQlwdWJsaWMgVGVzdFNpdGVWYWxpZGF0aW9uKFN0cmluZyBhcmcwKSB7Ci0JCXN1cGVyKGFyZzApOwotCX0KLQotCXByaXZhdGUgdm9pZCByZW1vdmVDb25maWdTaXRlKFVSTCB1cmwpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBnZXQgbmV3IGNvbmZpZyBvYmplY3QKLQkJSVBsYXRmb3JtQ29uZmlndXJhdGlvbiBjZmlnID0gQ29uZmlndXJhdG9yVXRpbHMuZ2V0Q3VycmVudFBsYXRmb3JtQ29uZmlndXJhdGlvbigpOwotCQlJU2l0ZUVudHJ5IHMxID0gY2ZpZy5maW5kQ29uZmlndXJlZFNpdGUodXJsKTsKLQkJYXNzZXJ0Tm90TnVsbCgiVW5hYmxlIHRvIGZpbmQgc2l0ZSBlbnRyeToiK3VybCxzMSk7Ci0JCWNmaWcudW5jb25maWd1cmVTaXRlKHMxKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2l0ZTEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlVUkwgcmVtb3RlVXJsID0gbmV3IFVSTChUQVJHRVRfRklMRV9TSVRFICsgInZhbGlkYXRpb24vc2l0ZTEvZWNsaXBzZSIpOwotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShyZW1vdGVVcmwuZ2V0RmlsZSgpKTsKLQkJSUxvY2FsU2l0ZSBsb2NhbCA9IFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpOwotCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY3VycmVudENvbmZpZyA9IGxvY2FsLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCk7Ci0JCWZpbGUubWtkaXJzKCk7Ci0JCUlDb25maWd1cmVkU2l0ZSBjb25maWd1cmVkU2l0ZSA9IGN1cnJlbnRDb25maWcuY3JlYXRlQ29uZmlndXJlZFNpdGUoZmlsZSk7Ci0JCUlTdGF0dXMgc3RhdHVzID0gY29uZmlndXJlZFNpdGUudmVyaWZ5VXBkYXRhYmxlU3RhdHVzKCk7Ci0KLQkJU3RyaW5nIG1zZyA9ICJUaGUgc2l0ZSAiK2ZpbGUrIiBzaG91bGQgYmUgdXBkYXRhYmxlLiI7Ci0JCWlmICghc3RhdHVzLmlzT0soKSl7Ci0JCQlmYWlsKG1zZytzdGF0dXMuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQljdXJyZW50Q29uZmlnLnJlbW92ZUNvbmZpZ3VyZWRTaXRlKGNvbmZpZ3VyZWRTaXRlKTsKLQkJcmVtb3ZlQ29uZmlnU2l0ZShjb25maWd1cmVkU2l0ZS5nZXRTaXRlKCkuZ2V0VVJMKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2l0ZTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlVUkwgcmVtb3RlVXJsID0gbmV3IFVSTChTT1VSQ0VfRklMRV9TSVRFICsgInZhbGlkYXRpb24vc2l0ZTIvZWNsaXBzZS8iKTsKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUocmVtb3RlVXJsLmdldEZpbGUoKSk7Ci0JCUlMb2NhbFNpdGUgbG9jYWwgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKTsKLQkJSUluc3RhbGxDb25maWd1cmF0aW9uIGN1cnJlbnRDb25maWcgPSBsb2NhbC5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpOwotCQlJQ29uZmlndXJlZFNpdGUgY29uZmlndXJlZFNpdGU7Ci0JCXRyeSB7Ci0JCSBjb25maWd1cmVkU2l0ZSA9IGN1cnJlbnRDb25maWcuY3JlYXRlQ29uZmlndXJlZFNpdGUoZmlsZSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSl7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSVN0YXR1cyBzdGF0dXMgPSBjb25maWd1cmVkU2l0ZS52ZXJpZnlVcGRhdGFibGVTdGF0dXMoKTsKLQotLy8JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShuZXcgRmlsZShmaWxlLCIuZWNsaXBzZVVNIikpOwotCi0JCVN0cmluZyBtc2cgPSAiVGhlIHNpdGUgIitmaWxlKyIgc2hvdWxkIG5vdCBiZSB1cGRhdGFibGUuIjsKLQkJaWYgKHN0YXR1cy5pc09LKCkpewotCQkJZmFpbChtc2crc3RhdHVzLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQkJaWYgKHN0YXR1cy5nZXRNZXNzYWdlKCkuaW5kZXhPZigiVGhpcyBzaXRlIGlzIGNvbnRhaW5lZCBpbiBhbm90aGVyIHNpdGU6Iik9PS0xKXsKLQkJCWZhaWwoIldyb25nIHZhbGlkYXRpb246IitzdGF0dXMuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0JCi0KLQlwdWJsaWMgdm9pZCB0ZXN0U2l0ZTMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlVUkwgcmVtb3RlVXJsID0gbmV3IFVSTChTT1VSQ0VfRklMRV9TSVRFICsgInZhbGlkYXRpb24vc2l0ZTMvZWNsaXBzZS8iKTsKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUocmVtb3RlVXJsLmdldEZpbGUoKSk7Ci0JCUlMb2NhbFNpdGUgbG9jYWwgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKTsKLQkJSUluc3RhbGxDb25maWd1cmF0aW9uIGN1cnJlbnRDb25maWcgPSBsb2NhbC5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpOwotCQlJQ29uZmlndXJlZFNpdGUgY29uZmlndXJlZFNpdGUgPSBjdXJyZW50Q29uZmlnLmNyZWF0ZUNvbmZpZ3VyZWRTaXRlKGZpbGUpOwotCQlJU3RhdHVzIHN0YXR1cyA9IGNvbmZpZ3VyZWRTaXRlLnZlcmlmeVVwZGF0YWJsZVN0YXR1cygpOwotCi0vLwkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKG5ldyBGaWxlKGZpbGUsIi5lY2xpcHNlVU0iKSk7Ci0KLQkJU3RyaW5nIG1zZyA9ICJUaGUgc2l0ZSAiK2ZpbGUrIiBzaG91bGQgbm90IGJlIHVwZGF0YWJsZS4iOwotCQlpZiAoc3RhdHVzLmlzT0soKSl7Ci0JCQlmYWlsKG1zZytzdGF0dXMuZ2V0TWVzc2FnZSgpKTsKLQkJfQotLy8JCWlmIChzdGF0dXMuZ2V0TWVzc2FnZSgpLmluZGV4T2YoIlRoaXMgc2l0ZSBpcyBjb250YWluZWQgaW4gYW5vdGhlciBzaXRlOiIpPT0tMSl7Ci0vLwkJCWZhaWwoIldyb25nIHZhbGlkYXRpb246IitzdGF0dXMuZ2V0TWVzc2FnZSgpKTsKLS8vCQl9Ci0JfQkKLQotCXB1YmxpYyB2b2lkIHRlc3RTaXRlNCgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCVVSTCByZW1vdGVVcmwgPSBuZXcgVVJMKFNPVVJDRV9GSUxFX1NJVEUgKyAidmFsaWRhdGlvbi9zaXRlNC9lY2xpcHNlLyIpOwotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShyZW1vdGVVcmwuZ2V0RmlsZSgpKTsKLQkJSUxvY2FsU2l0ZSBsb2NhbCA9IFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpOwotCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY3VycmVudENvbmZpZyA9IGxvY2FsLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCk7Ci0JCUlDb25maWd1cmVkU2l0ZSBjb25maWd1cmVkU2l0ZSA9IGN1cnJlbnRDb25maWcuY3JlYXRlQ29uZmlndXJlZFNpdGUoZmlsZSk7Ci0JCUlTdGF0dXMgc3RhdHVzID0gY29uZmlndXJlZFNpdGUudmVyaWZ5VXBkYXRhYmxlU3RhdHVzKCk7Ci0KLQkJU3RyaW5nIG1zZyA9ICJUaGUgc2l0ZSAiK2ZpbGUrIiBzaG91bGQgbm90IGJlIHVwZGF0YWJsZS4iOwotCQlpZiAoc3RhdHVzLmlzT0soKSl7Ci0JCQlmYWlsKG1zZytzdGF0dXMuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQlpZiAoc3RhdHVzLmdldE1lc3NhZ2UoKS5pbmRleE9mKCJUaGUgc2l0ZSBjYW5ub3QgYmUgbW9kaWZpZWQgYnkgdGhpcyBwcm9kdWN0LiBJdCBpcyBhbHJlYWR5IGFzc29jaWF0ZWQgd2l0aCBwcm9kdWN0OiIpPT0tMSl7Ci0JCQlmYWlsKCJXcm9uZyB2YWxpZGF0aW9uOiIrc3RhdHVzLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9CQotCi0JcHVibGljIHZvaWQgdGVzdFNpdGU1KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJVVJMIHJlbW90ZVVybCA9IG5ldyBVUkwoU09VUkNFX0ZJTEVfU0lURSArICJ2YWxpZGF0aW9uL3NpdGU1LyIpOwotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShyZW1vdGVVcmwuZ2V0RmlsZSgpKTsKLQkJSUxvY2FsU2l0ZSBsb2NhbCA9IFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpOwotCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY3VycmVudENvbmZpZyA9IGxvY2FsLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCk7Ci0JCUlDb25maWd1cmVkU2l0ZSBjb25maWd1cmVkU2l0ZSA9IGN1cnJlbnRDb25maWcuY3JlYXRlQ29uZmlndXJlZFNpdGUoZmlsZSk7Ci0JCUlTdGF0dXMgc3RhdHVzID0gY29uZmlndXJlZFNpdGUudmVyaWZ5VXBkYXRhYmxlU3RhdHVzKCk7Ci0KLQkJU3RyaW5nIG1zZyA9ICJUaGUgc2l0ZSAiK2ZpbGUrIiBzaG91bGQgYmUgdXBkYXRhYmxlLiI7Ci0JCWlmICghc3RhdHVzLmlzT0soKSl7Ci0JCQlmYWlsKG1zZytzdGF0dXMuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQkKLQkJCS8vIGdldCBuZXcgY29uZmlnIG9iamVjdAotCQlVUkwgdXJsID0gY29uZmlndXJlZFNpdGUuZ2V0U2l0ZSgpLmdldFVSTCgpOwotCQlJUGxhdGZvcm1Db25maWd1cmF0aW9uIGNmaWcgPSBDb25maWd1cmF0b3JVdGlscy5nZXRDdXJyZW50UGxhdGZvcm1Db25maWd1cmF0aW9uKCk7Ci0JCUlTaXRlRW50cnkgczEgPSBjZmlnLmZpbmRDb25maWd1cmVkU2l0ZSh1cmwpOwotCQlhc3NlcnROb3ROdWxsKCJTaXRlIGVudHJ5IG5vdCBmb3VuZDoiK3VybCxzMSk7Ci0JCWNmaWcudW5jb25maWd1cmVTaXRlKHMxKTsKLQkJY2ZpZy5zYXZlKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTaXRlNigpIHRocm93cyBFeGNlcHRpb24gewotCi0JCVVSTCByZW1vdGVVcmwgPSBuZXcgVVJMKFNPVVJDRV9GSUxFX1NJVEUgKyAidmFsaWRhdGlvbi9zaXRlNi9jaGlsZHJlbi9jaGlsZHJlbi9lY2xpcHNlLyIpOwotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShyZW1vdGVVcmwuZ2V0RmlsZSgpKTsKLQkJaWYgKCFmaWxlLmV4aXN0cygpKSBmaWxlLm1rZGlycygpOwotCQlJTG9jYWxTaXRlIGxvY2FsID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCk7Ci0JCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBjdXJyZW50Q29uZmlnID0gbG9jYWwuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKTsKLQkJSUNvbmZpZ3VyZWRTaXRlIGNvbmZpZ3VyZWRTaXRlID0gY3VycmVudENvbmZpZy5jcmVhdGVDb25maWd1cmVkU2l0ZShmaWxlKTsKLQkJSVN0YXR1cyBzdGF0dXMgPSBjb25maWd1cmVkU2l0ZS52ZXJpZnlVcGRhdGFibGVTdGF0dXMoKTsKLQotLy8JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShuZXcgRmlsZShmaWxlLCIuZWNsaXBzZVVNIikpOwotCi0JCVN0cmluZyBtc2cgPSAiVGhlIHNpdGUgIitmaWxlKyIgc2hvdWxkIG5vdCBiZSB1cGRhdGFibGUuIjsKLQkJaWYgKHN0YXR1cy5pc09LKCkpewotCQkJZmFpbChtc2crc3RhdHVzLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLS8vCQlpZiAoc3RhdHVzLmdldE1lc3NhZ2UoKS5pbmRleE9mKCJUaGlzIHNpdGUgaXMgY29udGFpbmVkIGluIGFub3RoZXIgc2l0ZToiKT09LTEpewotLy8JCQlmYWlsKCJXcm9uZyB2YWxpZGF0aW9uOiIrc3RhdHVzLmdldE1lc3NhZ2UoKSk7Ci0vLwkJfQotCX0JCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9zdGFuZGFsb25lL0FsbFN0YW5kYWxvbmVUZXN0cy5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvc3RhbmRhbG9uZS9BbGxTdGFuZGFsb25lVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNiNTk3Mi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9zdGFuZGFsb25lL0FsbFN0YW5kYWxvbmVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnN0YW5kYWxvbmU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLlVwZGF0ZU1hbmFnZXJUZXN0Q2FzZTsKLQotCi1wdWJsaWMgY2xhc3MgQWxsU3RhbmRhbG9uZVRlc3RzIGV4dGVuZHMgVXBkYXRlTWFuYWdlclRlc3RDYXNlewotCi0JcHVibGljIEFsbFN0YW5kYWxvbmVUZXN0cyhTdHJpbmcgbmFtZSl7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKXsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCQlzdWl0ZS5zZXROYW1lKCJTdGFuZGFsb25lIFRlc3RzIik7Ci0JCQotCQkvLyB0aGUgZm9sbG93aW5nIHdpbGwgdGFrZSBhbGwgdGhlIHRlc3QgbWV0aG9kcyBpbiAKLQkJLy8gdGhlIGNsYXNzIHRoYXQgc3RhcnQgd2l0aCAidGVzdCIKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFRlc3RGZWF0dXJlSW5zdGFsbC5jbGFzcykpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoVGVzdEZlYXR1cmVVcGRhdGUuY2xhc3MpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFRlc3RGZWF0dXJlRW5hYmxlLmNsYXNzKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShUZXN0RmVhdHVyZURpc2FibGUuY2xhc3MpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFRlc3RGZWF0dXJlVW5pbnN0YWxsLmNsYXNzKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShUZXN0QnVuZGxlc0luc3RhbGwuY2xhc3MpKTsKLQkJLy9hbmQgdGhpcyBvbmUncyBmb3IgZnVuIDopCi0vLwkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFRlc3RTaXRlU2VhcmNoLmNsYXNzKSk7Ci0JCQotCQlyZXR1cm4gc3VpdGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvc3RhbmRhbG9uZS9TdGFuZGFsb25lTWFuYWdlclRlc3RDYXNlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9zdGFuZGFsb25lL1N0YW5kYWxvbmVNYW5hZ2VyVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFjYjI4My4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9zdGFuZGFsb25lL1N0YW5kYWxvbmVNYW5hZ2VyVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuc3RhbmRhbG9uZTsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLio7Ci0KLXB1YmxpYyBjbGFzcyBTdGFuZGFsb25lTWFuYWdlclRlc3RDYXNlIGV4dGVuZHMgVXBkYXRlTWFuYWdlclRlc3RDYXNlIHsKLQlwdWJsaWMgc3RhdGljIFN0cmluZ0J1ZmZlciBlcnJPdXRwdXQ7Ci0JcHVibGljIHN0YXRpYyBJbnRlZ2VyIGV4aXRWYWx1ZT0gbmV3IEludGVnZXIoLTEpOwotCXB1YmxpYyBzdGF0aWMgVVJMIFRBUkdFVF9GSUxFX1NJVEU7Ci0JcHJpdmF0ZSBib29sZWFuIG9sZENhY2hlID0gZmFsc2U7Ci0JCi0Jc3RhdGljIHsKLQkJRmlsZSB0YXJnZXREaXIgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaW8udG1wZGlyIikpOwotCQl0YXJnZXREaXIgPSBuZXcgRmlsZSh0YXJnZXREaXIsICJzdGFuZGFsb25lIik7Ci0JCXRhcmdldERpciA9IG5ldyBGaWxlKHRhcmdldERpciwgIm15dGFyZ2V0Iik7Ci0JCWlmICh0YXJnZXREaXIuZXhpc3RzKCkpCi0JCQlkZWxldGVEaXJlY3RvcnkodGFyZ2V0RGlyKTsKLQkJdHJ5IHsKLQkJCVRBUkdFVF9GSUxFX1NJVEUgPSB0YXJnZXREaXIudG9VUkwoKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIFN0YW5kYWxvbmVNYW5hZ2VyVGVzdENhc2UgKFN0cmluZyBhcmcwKXsKLQkJc3VwZXIoYXJnMCk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdXAgdGhlIGZpeHR1cmUsIGZvciBleGFtcGxlLCBvcGVuIGEgbmV0d29yayBjb25uZWN0aW9uLgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBiZWZvcmUgYSB0ZXN0IGlzIGV4ZWN1dGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVtU2V0VXAoKSB7Ci0JCS8vIHNldHVwIGNhY2hlIHNpdGUgdG8gdHJ1ZQotCQlvbGRDYWNoZSA9IEludGVybmFsU2l0ZU1hbmFnZXIuZ2xvYmFsVXNlQ2FjaGU7Ci0JCUludGVybmFsU2l0ZU1hbmFnZXIuZ2xvYmFsVXNlQ2FjaGUgPSB0cnVlOwotCX0KLQkKLQkvKioKLQkgKiBUZWFycyBkb3duIHRoZSBmaXh0dXJlLCBmb3IgZXhhbXBsZSwgY2xvc2UgYSBuZXR3b3JrIGNvbm5lY3Rpb24uCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGFmdGVyIGEgdGVzdCBpcyBleGVjdXRlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1bVRlYXJEb3duKCkgewotCQkvLyBkbyBub3RoaW5nLgotCQlJbnRlcm5hbFNpdGVNYW5hZ2VyLmdsb2JhbFVzZUNhY2hlID0gb2xkQ2FjaGU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGNoZWNrQ29uZmlndXJlZFNpdGVzKCl7Ci0JCUlMb2NhbFNpdGUgbG9jYWxTaXRlOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4iKTsKLQkJdHJ5IHsKLQkJCWxvY2FsU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMb2NhbFNpdGU6ICIgKyBsb2NhbFNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKS5nZXRMYWJlbCgpKTsKLQkJCi0JCS8vR2V0IHNpdGUgdG8gaW5zdGFsbCB0bwotCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY3VycmVudENvbmZpZyA9IGxvY2FsU2l0ZS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpOwotCQlJQ29uZmlndXJlZFNpdGVbXSBzaXRlcyA9IGN1cnJlbnRDb25maWcuZ2V0Q29uZmlndXJlZFNpdGVzKCk7Ci0vLwkKLS8vCQkJLy8gc3RhcnQgb2YgY29uZmlnIHNpdGUgcHJpbnQKLQkJU3lzdGVtLm91dC5wcmludGxuKCJHRVRUSU5HIENPTkZJR1VSRUQgU0lURVMuLi4iKTsKLQkJZm9yIChpbnQgaSA9IDA7IGk8c2l0ZXMubGVuZ3RoOyBpKyspewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJzaXRlICMiICsgaSArICI6ICIgKyBzaXRlc1tpXS5nZXRTaXRlKCkuZ2V0VVJMKCkuZ2V0RmlsZSgpKTsKLQkJfQotCQlTeXN0ZW0ub3V0LnByaW50bG4oIn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4iKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oZSk7Ci0JCX0KLQl9Ci0JCi0JLy8gZ2V0IHRoZSBmaXJzdCBjb25maWd1cmVkIHNpdGUgZm91bmQgYmVjYXVzZSB0aGlzIGlzIHRoZSBvbmUgd2UncmUgbW9zdCBsaWtlbHkgdG8gCi0JLy8gaGF2ZSBpbnN0YWxsZWQgaW50bwotCXB1YmxpYyBJU2l0ZSBnZXRDb25maWd1cmVkU2l0ZShVUkwgdGFyZ2V0KXsKLQkJdHJ5IHsKLQkJCUlMb2NhbFNpdGUgbG9jYWwgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKTsKLQkJCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBjdXJyZW50Q29uZmlnID0gbG9jYWwuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKTsKLQkJCUlDb25maWd1cmVkU2l0ZVtdIHNpdGVzID0gY3VycmVudENvbmZpZy5nZXRDb25maWd1cmVkU2l0ZXMoKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXG5yZXRyaWV2aW5nIGNvbmZpZ3VyZWQgc2l0ZXMuLi4iKTsKLQkJCVN0cmluZyB0YXJnZXRGaWxlID0gbmV3IEZpbGUodGFyZ2V0LmdldEZpbGUoKSkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaTxzaXRlcy5sZW5ndGggOyBpKyspewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigic2l0ZVsiK2krIl06ICIgKyBzaXRlc1tpXS5nZXRTaXRlKCkuZ2V0VVJMKCkpOwotCQkJCVN0cmluZyBzaXRlRmlsZSA9IG5ldyBGaWxlKHNpdGVzW2ldLmdldFNpdGUoKS5nZXRVUkwoKS5nZXRGaWxlKCkpLmdldEFic29sdXRlUGF0aCgpOwotCQkJCWlmICh0YXJnZXRGaWxlLmVxdWFscyhzaXRlRmlsZSkpCi0JCQkJCXJldHVybiBzaXRlc1tpXS5nZXRTaXRlKCk7Ci0JCQl9Ci0JCQlpZiAoc2l0ZXMubGVuZ3RoID09IDApCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlyZXR1cm4gc2l0ZXNbMF0uZ2V0U2l0ZSgpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbihlKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCS8vV2F0Y2hEb2cgdGhyZWFkIHRvIGtpbGwgbWlycm9yaW5nIHByb2Nlc3MgaWYgaXQgaGFuZ3MgKG9yIHRha2VzIHRvbyBsb25nKQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgVGltZXIgZXh0ZW5kcyBUaHJlYWR7Ci0JCXByaXZhdGUgUHJvY2VzcyBwcm9jOwotCQkKLQkJcHVibGljIFRpbWVyKFByb2Nlc3MgcHJvYyl7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5zZXREYWVtb24odHJ1ZSk7Ci0JCQl0aGlzLnByb2MgPSBwcm9jOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBydW4oKXsKLQkJCXRyeSB7Ci0JCQkJLy8gc2xlZXAgdGltZSA1bWluCi0JCQkJc2xlZXAoMzAwMDAwKTsgCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJkZXN0cm95aW5nIHByb2Nlc3MiKTsKLQkJCQlwcm9jLmRlc3Ryb3koKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJU3lzdGVtLmVyci5wcmludGxuKGUpOwotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLy8gU3RyZWFtQ29uc3VtZXIgdG8gZGlzcGxheSBvdXRwdXQgdG8gb3V0cHV0IGZpbGVzIG9yIGNvbnNvbGUKLQlwdWJsaWMgc3RhdGljIGNsYXNzIFN0cmVhbUNvbnN1bWVyIGV4dGVuZHMgVGhyZWFkIHsKLQkJcHJpdmF0ZSBCdWZmZXJlZFJlYWRlciBiUmVhZGVyOwotCi0JCXB1YmxpYyBTdHJlYW1Db25zdW1lcihJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgewotCQkJc3VwZXIoKTsKLQkJCXNldERhZW1vbih0cnVlKTsKLQkJCWJSZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKGlucHV0U3RyZWFtKSk7Ci0JCQllcnJPdXRwdXQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQl0cnkgewotCQkJCVN0cmluZyBsaW5lOwotCQkJCXdoaWxlIChudWxsICE9IChsaW5lID0gYlJlYWRlci5yZWFkTGluZSgpKSkgewotCQkJCQlTeXN0ZW0uZXJyLnByaW50bG4obGluZSk7Ci0JCQkJCWVyck91dHB1dC5hcHBlbmQobGluZSk7Ci0JCQkJCWVyck91dHB1dC5hcHBlbmQoIlxuIik7Ci0JCQkJfQotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCVN5c3RlbS5lcnIucHJpbnRsbihlKTsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBjb21tYW5kIDogY29tbWFuZCBhcmd1bWVudCB0byBydW4gb24gc2l0ZS9mZWF0dXJlIAotCSAqIChpLmUuICdpbnN0YWxsJywgJ2VuYWJsZScsICdkaXNhYmxlJywgJ3VwZGF0ZScpICo8aT5yZXF1aXJlZDwvaT4qCi0JICogQHBhcmFtIGZpZCA6IGZlYXR1cmUgaWQgb2YgdGhlIGZlYXR1cmUgYmVpbmcgaW5zdGFsbGVkLCBlbmFibGVkLCBldGMuCi0JICogKG9wdGlvbmFsIC0gY2FuIGJlIG51bGwpCi0JICogQHBhcmFtIHZlciA6IHZlcnNpb24gb2YgZmVhdHVyZSBiZWluZyBpbnN0YWxsZWQsIGVuYWJsZWQsIGV0Yy4gKG9wdGlvbmFsIC0gY2FuIGJlIG51bGwpCi0JICogQHBhcmFtIGNvbmZpZyA6IGxvY2F0aW9uIG9mIGNvbmZpZ3VyYXRpb24gaW5mbyAoaS5lLiBmaWxlOkQ6XHRlbXBcLmNvbmZpZ1wpCi0JICogQHBhcmFtIHJlbW90ZUxvYyA6IHJlbW90ZSBzaXRlIHVybCAocmVxdWlyZWQgZm9yIGluc3RhbGxpbmcvc2VhcmNoaW5nIGZyb20gcmVtb3RlIHNpdGUpCi0JICogQHBhcmFtIGxvY2FsTG9jIDogdGFyZ2V0IHNpdGUgZGlyZWN0b3J5IChyZXF1aXJlZCB1bmxlc3MgdXBkYXRpbmcvc2VhcmNoaW5nKQotCSAqIEByZXR1cm4gYSBzdHJpbmcgYXJyYXkgY29uc2lzdGluZyBvZiBjb21tYW5kcyBhbmQgdGhlaXIgYXJndW1lbnRzIHRvCi0JICogYmUgcnVuCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldENvbW1hbmQoCi0JCVN0cmluZyBjb21tYW5kLAotCQlTdHJpbmcgZmlkLAotCQlTdHJpbmcgdmVyLAotCQlTdHJpbmcgY29uZmlnLAotCQlTdHJpbmcgcmVtb3RlTG9jLAotCQlTdHJpbmcgbG9jYWxMb2MpewotCQlmaW5hbCBTdHJpbmcgY2xhc3NwYXRoID0gInN0YXJ0dXAuamFyIjsKLQkJZmluYWwgU3RyaW5nIGxhdW5jaGVyID0gIm9yZy5lY2xpcHNlLmNvcmUubGF1bmNoZXIuTWFpbiI7Ci0JCWZpbmFsIFN0cmluZyBhcHBsaWNhdGlvbiA9ICJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5zdGFuZGFsb25lVXBkYXRlIjsKLQkJZmluYWwgU3RyaW5nIEZMQUdfQ1AgPSAiLWNwIjsKLQkJZmluYWwgU3RyaW5nIEZMQUdfQVBQID0gIi1hcHBsaWNhdGlvbiI7Ci0JCWZpbmFsIFN0cmluZyBGTEFHX0NNRCA9ICItY29tbWFuZCI7Ci0JCWZpbmFsIFN0cmluZyBGTEFHX0ZJRCA9ICItZmVhdHVyZUlkIjsKLQkJZmluYWwgU3RyaW5nIEZMQUdfREFUQSA9ICItZGF0YSI7Ci0JCWZpbmFsIFN0cmluZyBGTEFHX1ZFUlNJT04gPSAiLXZlcnNpb24iOwotCQlmaW5hbCBTdHJpbmcgRkxBR19GUk9NID0gIi1mcm9tIjsKLQkJZmluYWwgU3RyaW5nIEZMQUdfVE8gPSAiLXRvIjsKLQkJZmluYWwgU3RyaW5nIEZMQUdfQ09ORklHID0gIi1jb25maWd1cmF0aW9uIjsKLS8vCQlmaW5hbCBTdHJpbmcgRkxBR19VUkwgPSAiLW1pcnJvclVSTCI7Ci0JCWZpbmFsIFN0cmluZyBGTEFHX1NQTEFTSCA9ICItbm9zcGxhc2giOwotCQlmaW5hbCBTdHJpbmcgRkxBR19DT05TT0xFTE9HID0gIi1jb25zb2xlbG9nIjsKLQkJZmluYWwgU3RyaW5nIGRhdGEgPQotCQkJVXBkYXRlQ29yZS5nZXRQbHVnaW4oKS5nZXRTdGF0ZUxvY2F0aW9uKCkudG9PU1N0cmluZygpOwotCQlTdHJpbmdbXSBjbWQgPQotCQkJbmV3IFN0cmluZ1tdIHsKLQkJCQlnZXRKYXZhVk1QYXRoKCksCi0JCQkJRkxBR19DUCwKLQkJCQljbGFzc3BhdGgsCi0JCQkJbGF1bmNoZXIsCi0JCQkJRkxBR19BUFAsCi0JCQkJYXBwbGljYXRpb24sCi0JCQkJRkxBR19DTUQsCi0JCQkJY29tbWFuZCwKLQkJCQkocmVtb3RlTG9jICE9bnVsbCA/IEZMQUdfRlJPTSA6ICIiKSwKLQkJCQkocmVtb3RlTG9jICE9bnVsbCA/IHJlbW90ZUxvYyA6ICIiKSwKLQkJCQkobG9jYWxMb2MgIT1udWxsID8gRkxBR19UTyA6ICIiKSwKLQkJCQkobG9jYWxMb2MgIT1udWxsID9sb2NhbExvYy5yZXBsYWNlRmlyc3QoImZpbGU6IiwgIiIpIDogIiIpLAotCQkJCShmaWQgIT0gbnVsbCA/IEZMQUdfRklEIDogIiIpLAotCQkJCShmaWQgIT0gbnVsbCA/IGZpZCA6ICIiKSwKLQkJCQkodmVyICE9IG51bGwgPyBGTEFHX1ZFUlNJT04gOiAiIiksCi0JCQkJKHZlciAhPSBudWxsID8gdmVyIDogIiIpLAotCQkJCShjb25maWcgIT0gbnVsbCA/IEZMQUdfQ09ORklHIDogIiIpLAotCQkJCShjb25maWcgIT0gbnVsbCA/IGNvbmZpZyA6ICIiKSwKLQkJCQlGTEFHX1NQTEFTSCwKLQkJCQlGTEFHX0RBVEEsCi0JCQkJZGF0YSwKLQkJCQlGTEFHX0NPTlNPTEVMT0d9OwotCQlmb3IgKGludCBpID0gMCA7aTxjbWQubGVuZ3RoOyBpKyspewotCQkJU3lzdGVtLm91dC5wcmludChjbWRbaV0gKyAiICIpOwkJCQotCQl9U3lzdGVtLm91dC5wcmludGxuKCk7Ci0JCXJldHVybiBjbWQ7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0SmF2YVZNUGF0aCgpIHsKLQkJLy8gQ3JlYXRlIGNvbW1hbmQgc3RyaW5nIGZvciBsYXVuY2hpbmcgdGhlIHByb2Nlc3MKLQkJU3RyaW5nIHZtID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLnZtLm5hbWUiKTsKLQkJU3RyaW5nIGV4ZWN1dGFibGUgPSAiSjkiLmVxdWFscyh2bSkgPyAiajkiIDogImphdmEiOwotCQlpZiAob3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLmVudmlyb25tZW50LkNvbnN0YW50cy5PU19XSU4zMi5lcXVhbHMoUGxhdGZvcm0uZ2V0T1MoKSkpCi0JCQlleGVjdXRhYmxlICs9ICJ3LmV4ZSI7Ci0KLQkJU3RyaW5nIGphdmFJbnN0YWxsRGlyID0KLQkJCVN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5ob21lIikgKyBGaWxlLnNlcGFyYXRvciArICJiaW4iOwotCQlyZXR1cm4gamF2YUluc3RhbGxEaXIgKyBGaWxlLnNlcGFyYXRvciArIGV4ZWN1dGFibGU7Ci0JfQotCQotCXB1YmxpYyBpbnQgcGVyZm9ybUFjdGlvbihTdHJpbmdbXSBjbWQpIHsKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoZ2V0RWNsaXBzZVJvb3QoKSk7Ci0JCXRyeSB7Ci0KLQkJCVByb2Nlc3MgcHJvYyA9Ci0JCQkJUnVudGltZS5nZXRSdW50aW1lKCkuZXhlYyhjbWQsIChTdHJpbmdbXSkgbnVsbCwgZmlsZSk7Ci0KLQkJCVN0cmVhbUNvbnN1bWVyIG91dHB1dHMgPSBuZXcgU3RyZWFtQ29uc3VtZXIocHJvYy5nZXRJbnB1dFN0cmVhbSgpKTsKLQkJCW91dHB1dHMuc3RhcnQoKTsKLQkJCVN0cmVhbUNvbnN1bWVyIGVycm9ycyA9IG5ldyBTdHJlYW1Db25zdW1lcihwcm9jLmdldEVycm9yU3RyZWFtKCkpOwotCQkJZXJyb3JzLnN0YXJ0KCk7Ci0JCQlUaW1lciB0aW1lciA9IG5ldyBUaW1lcihwcm9jKTsKLQkJCXRpbWVyLnN0YXJ0KCk7Ci0KLQkJCXJldHVybiBwcm9jLndhaXRGb3IoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLmVyci5wcmludGxuKGUpOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oZSk7Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEVjbGlwc2VSb290KCkgewotCQlyZXR1cm4gQ29uZmlndXJhdG9yVXRpbHMuZ2V0SW5zdGFsbFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCkucmVwbGFjZUZpcnN0KAotCQkJImZpbGU6IiwKLQkJCSIiKTsKLQl9Ci0JCi0JcHVibGljIEFycmF5TGlzdCBnZXRBcnJheUxpc3QoU3RyaW5nW10gbGlzdCl7Ci0JCUFycmF5TGlzdCB0ZW1wID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IoaW50IGkgPSAwOyBpPCBsaXN0Lmxlbmd0aDsgaSsrKXsKLQkJCXRlbXAuYWRkKGxpc3RbaV0pOwotCQl9Ci0JCXJldHVybiB0ZW1wOwotCX0KLQkKLQlwdWJsaWMgRmlsZSBnZXRMYXRlc3RDb25maWd1cmF0aW9uRmlsZShGaWxlIGxvY2FsRmlsZSkgewotCi0JCXRyeSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oInJlYWRpbmcgZnJvbSA6ICIgKyBsb2NhbEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJCUZpbGVSZWFkZXIgZnJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKGxvY2FsRmlsZSk7Ci0JCQkJQnVmZmVyZWRSZWFkZXIgYnJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihmcmVhZGVyKTsKLQkJCQl3aGlsZSAoYnJlYWRlci5yZWFkeSgpKSB7Ci0JCQkJCWJyZWFkZXIucmVhZExpbmUoKTsKLS8vCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4obGluZSk7Ci0JCQkJfQotCQkJCS8vIHJlYWQgY29uZmlnIGZpbGUKLQkJCQlGaWxlIHBhcmVudCA9IG5ldyBGaWxlKGxvY2FsRmlsZS5nZXRQYXJlbnQoKSk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJwYXJlbnQ6ICIgKyBwYXJlbnQuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJCVN0cmluZ1tdIHBhckxpc3QgPSBwYXJlbnQubGlzdCgpOwotCQkJCWludCBsYXRlc3QgPSAwOyAKLQkJCQlmb3IgKGludCBpID0gcGFyTGlzdC5sZW5ndGgtMTsgaT49MDsgaS0tKXsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJwYXJMaXN0WyIgKyBpICsgIl06ICIgKyBwYXJMaXN0W2ldKTsKLQkJCQkJaWYgKHBhckxpc3RbaV0uc3RhcnRzV2l0aCgicGxhdGZvcm0iKSl7Ci0JCQkJCQlsYXRlc3QgPSBpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJRmlsZSBjb25maWdGaWxlID0gbmV3IEZpbGUocGFyZW50LmdldEFic29sdXRlUGF0aCgpICsgRmlsZS5zZXBhcmF0b3IgKyBwYXJMaXN0W2xhdGVzdF0pOwotCQkJCXJldHVybiBjb25maWdGaWxlOwotCQkJCS8vIGVuZCBvZiBjb25maWcgZmlsZSByZWFkCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oZSk7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiBsb2NhbEZpbGU7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgZGVsZXRlRGlyZWN0b3J5KEZpbGUgZGlyKSB7Ci0JCUZpbGVbXSBsaXN0ID0gZGlyLmxpc3RGaWxlcygpOwotCQlpZiAobGlzdCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkJCi0JCWZvciAoaW50IGk9MDsgaTxsaXN0Lmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAobGlzdFtpXS5pc0RpcmVjdG9yeSgpKSAKLQkJCQlkZWxldGVEaXJlY3RvcnkobGlzdFtpXSk7Ci0JCQlpZiAoIWxpc3RbaV0uZGVsZXRlKCkpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJVbmFibGUgdG8gZGVsZXRlICIrbGlzdFtpXS50b1N0cmluZygpKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3N0YW5kYWxvbmUvVGVzdEJ1bmRsZXNJbnN0YWxsLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9zdGFuZGFsb25lL1Rlc3RCdW5kbGVzSW5zdGFsbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjlmM2NhLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3N0YW5kYWxvbmUvVGVzdEJ1bmRsZXNJbnN0YWxsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnN0YW5kYWxvbmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnN0YW5kYWxvbmUuKjsKLQotCi1wdWJsaWMgY2xhc3MgVGVzdEJ1bmRsZXNJbnN0YWxsIGV4dGVuZHMgU3RhbmRhbG9uZU1hbmFnZXJUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luc3RhbGxlZDsKLQotCXB1YmxpYyBUZXN0QnVuZGxlc0luc3RhbGwoU3RyaW5nIGFyZzApIHsKLQkJc3VwZXIoYXJnMCk7Ci0JCWlzSW5zdGFsbGVkID0gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgdW1TZXRVcCgpIHsKLQkJc3VwZXIudW1TZXRVcCgpOwotCQkvL1N5c3RlbS5vdXQucHJpbnRsbigibG9va2luZyBhdCBjb25maWd1cmVkIHNpdGVzIGF2YWlsYWJsZS4uLi4iKTsKLQkJLy9jaGVja0NvbmZpZ3VyZWRTaXRlcygpOwotCQkKLQkJU3RyaW5nIGZlYXR1cmVJZCA9ICJjb20uZXhhbXBsZS5idW5kbGUuZmVhdHVyZSI7Ci0JCVN0cmluZyB2ZXJzaW9uID0gIjEuMC4wIjsKLQotCQlTdHJpbmcgZnJvbVJlbW90ZVNpdGVVcmwgPSAiaHR0cDovLyIrZ2V0SHR0cEhvc3QoKSsiOiIrIGdldEh0dHBQb3J0KCkrICIvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUudXBkYXRldGVzdHMvYnVuZGxlU2l0ZS8iOwotCQlpZiAoIWlzSW5zdGFsbGVkKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oCi0JCQkJIj09PT09PT09PT09PT09IiArIHRoaXMuZ2V0Q2xhc3MoKSArICI9PT09PT09PT09PT09Iik7Ci0JCQlTdGFuZGFsb25lVXBkYXRlQXBwbGljYXRpb24gYXBwID0gbmV3IFN0YW5kYWxvbmVVcGRhdGVBcHBsaWNhdGlvbigpOwotCQkJdHJ5IHsKLQkJCQlleGl0VmFsdWUgPSAoSW50ZWdlcilhcHAucnVuKGdldENvbW1hbmQoCi0JCQkJCSJpbnN0YWxsIiwKLQkJCQkJZmVhdHVyZUlkLAotCQkJCQl2ZXJzaW9uLAotCQkJCQludWxsLAotCQkJCQlmcm9tUmVtb3RlU2l0ZVVybCwKLQkJCQkJVEFSR0VUX0ZJTEVfU0lURS5nZXRGaWxlKCkpKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJCWlzSW5zdGFsbGVkID0gdHJ1ZTsKLQkJfQotCQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UGx1Z2luc0V4aXN0KCkgewotCQlJU2l0ZSBsb2NhbFNpdGUgPSBnZXRDb25maWd1cmVkU2l0ZShUQVJHRVRfRklMRV9TSVRFKTsKLQkJCi0JCVN5c3RlbS5vdXQucHJpbnRsbigibG9jYWxTaXRlOiAiICsgbG9jYWxTaXRlLmdldFVSTCgpLmdldEZpbGUoKSk7Ci0JCUlQbHVnaW5FbnRyeVtdIHBsdWdpbkVudHJpZXMgPSBsb2NhbFNpdGUuZ2V0UGx1Z2luRW50cmllcygpOwotCQlBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKHBsdWdpbkVudHJpZXMgPT0gbnVsbCB8fCBwbHVnaW5FbnRyaWVzLmxlbmd0aCA9PSAwKXsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbigiTm8gcGx1Z2luIGVudHJpZXMgb24gdGhlIHRhcmdldCBzaXRlIik7Ci0JCQlmYWlsKCJObyBwbHVnaW4gZW50cmllcyBvbiB0aGUgdGFyZ2V0IHNpdGUiKTsKLQkJfSBlbHNlewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwbHVnaW5FbnRyaWVzLmxlbmd0aDsgaSsrKXsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImZvdW5kIHBsdWdpbjogIiArIHBsdWdpbkVudHJpZXNbaV0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkpOwotCQkJCWxpc3QuYWRkKHBsdWdpbkVudHJpZXNbaV0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkpOwotCQkJfQotCQl9Ci0KLQkJU3RyaW5nW10gcGx1Z2luTmFtZXMgPQotCQkJewkiY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbl8xLjAuMCIsCi0JCQkJImNvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4udWlfMi4wLjAiLAotCQkJCSJjb20uZXhhbXBsZS5idW5kbGUuZnJhZ21lbnRfMS4wLjAiLAotCQkJCSJjb20uZXhhbXBsZS5idWRsZS5mcmFnbWVudC51aV8xLjAuMCJ9OwotCQlhc3NlcnRUcnVlKGNoZWNrRmlsZXNJbkxpc3QocGx1Z2luTmFtZXMsIGxpc3QpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmVhdHVyZXNFeGlzdCgpIHsKLQkJdHJ5IHsKLQkJCUlTaXRlIGxvY2FsU2l0ZSA9ICBnZXRDb25maWd1cmVkU2l0ZShUQVJHRVRfRklMRV9TSVRFKTsKLQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJsb2NhbFNpdGU6ICIgKyBsb2NhbFNpdGUuZ2V0VVJMKCkuZ2V0RmlsZSgpKTsKLQkJCS8vIGdldCBmZWF0dXJlIHJlZmVyZW5jZXMgCi0JCQlJRmVhdHVyZVJlZmVyZW5jZVtdIGxvY2FsRmVhdHVyZXMgPQotCQkJCWxvY2FsU2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlcygpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJsb2NhbCBjdXJyZW50Q09uZmlnU2l0ZTogIiArIGxvY2FsU2l0ZS5nZXRDdXJyZW50Q29uZmlndXJlZFNpdGUoKSk7Ci0JCQlBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWlmIChsb2NhbEZlYXR1cmVzID09IG51bGwgfHwgbG9jYWxGZWF0dXJlcy5sZW5ndGggPT0gMCl7Ci0JCQkJU3lzdGVtLmVyci5wcmludGxuKCJObyBmZWF0dXJlcyBvbiB0aGUgdGFyZ2V0IHNpdGUiKTsKLQkJCQlmYWlsKCJObyBmZWF0dXJlcyBvbiB0aGUgdGFyZ2V0IHNpdGUiKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsb2NhbEZlYXR1cmVzLmxlbmd0aDsgaSsrKQotCQkJCQlsaXN0LmFkZChsb2NhbEZlYXR1cmVzW2ldLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpKTsKLQkJCX0KLQkJCVN0cmluZ1tdIGZlYXR1cmVOYW1lcyA9Ci0JCQkJewotCQkJCQkiY29tLmV4YW1wbGUuYnVuZGxlLmZlYXR1cmVfMS4wLjAifTsKLQkJCWFzc2VydFRydWUoY2hlY2tGaWxlc0luTGlzdChmZWF0dXJlTmFtZXMsIGxpc3QpKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oZSk7Ci0JCX0KLQl9Ci0KLQkvLyBtYWtlcyBzdXJlIGFsbCBmaWxlcy9kaXJlY3RvcmllcyBpbiAibmFtZXMiIGFyZSBpbiB0aGUgZGlyZWN0b3J5IGxpc3RpbmcgImxpc3QiCi0JcHVibGljIGJvb2xlYW4gY2hlY2tGaWxlc0luTGlzdCgKLQkJU3RyaW5nW10gbmFtZXMsCi0JCUFycmF5TGlzdCBsaXN0KSB7Ci0JCQotCQlmb3IgKGludCBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4obmFtZXNbaV0pOwotCQkJaWYgKCFsaXN0LmNvbnRhaW5zKG5hbWVzW2ldKSl7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8vIGVuc3VyZSBleGl0IHdpdGhvdXQgcHJvYmxlbXMKLQlwdWJsaWMgdm9pZCB0ZXN0RXhpdFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiZXhpdFZhbHVlOiAiICsgZXhpdFZhbHVlKTsKLQkJYXNzZXJ0RXF1YWxzKGV4aXRWYWx1ZSwgSVBsYXRmb3JtUnVubmFibGUuRVhJVF9PSyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvc3RhbmRhbG9uZS9UZXN0RmVhdHVyZURpc2FibGUuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3N0YW5kYWxvbmUvVGVzdEZlYXR1cmVEaXNhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1YmE5NzUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvc3RhbmRhbG9uZS9UZXN0RmVhdHVyZURpc2FibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuc3RhbmRhbG9uZTsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGxhdGZvcm1SdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnN0YW5kYWxvbmUuKjsKLQotcHVibGljIGNsYXNzIFRlc3RGZWF0dXJlRGlzYWJsZSBleHRlbmRzIFN0YW5kYWxvbmVNYW5hZ2VyVGVzdENhc2UgewotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0Rpc2FibGVkOwotCQotCXB1YmxpYyBUZXN0RmVhdHVyZURpc2FibGUoU3RyaW5nIGFyZzApIHsKLQkJc3VwZXIoYXJnMCk7Ci0JCWlzRGlzYWJsZWQgPSBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bVNldFVwKCkgewotCQlzdXBlci51bVNldFVwKCk7Ci0JCQotCQlTdHJpbmcgZmVhdHVyZUlkID0gIm15LmFscGhhYmV0IjsKLQkJU3RyaW5nIHZlcnNpb24gPSAiMS4wLjAiOwotCi0JCWNoZWNrQ29uZmlndXJlZFNpdGVzKCk7Ci0JCWlmICghaXNEaXNhYmxlZCkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKAotCQkJCSI9PT09PT09PT09PT09PSIgKyB0aGlzLmdldENsYXNzKCkgKyAiPT09PT09PT09PT09PSIpOwotCQkJU3RhbmRhbG9uZVVwZGF0ZUFwcGxpY2F0aW9uIGFwcCA9IG5ldyBTdGFuZGFsb25lVXBkYXRlQXBwbGljYXRpb24oKTsKLQkJCXRyeSB7Ci0JCQkJZXhpdFZhbHVlID0gKEludGVnZXIpYXBwLnJ1bihnZXRDb21tYW5kKAotCQkJCQkiZGlzYWJsZSIsCi0JCQkJCWZlYXR1cmVJZCwKLQkJCQkJdmVyc2lvbiwKLQkJCQkJbnVsbCwKLQkJCQkJbnVsbCwKLQkJCQkJVEFSR0VUX0ZJTEVfU0lURS5nZXRGaWxlKCkpKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJCWlzRGlzYWJsZWQgPSB0cnVlOwotCQkJY2hlY2tDb25maWd1cmVkU2l0ZXMoKTsKLQkJfQotCX0KLQkKLQkvLyBlbnN1cmUgZXhpdCB3aXRob3V0IHByb2JsZW1zCi0JcHVibGljIHZvaWQgdGVzdEV4aXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTeXN0ZW0ub3V0LnByaW50bG4oImV4aXRWYWx1ZTogIiArIGV4aXRWYWx1ZSk7Ci0JCWFzc2VydEVxdWFscyhleGl0VmFsdWUsIElQbGF0Zm9ybVJ1bm5hYmxlLkVYSVRfT0spOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGZWF0dXJlU3RhdHVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUZpbGUgbG9jYWxGaWxlID0gbmV3IEZpbGUoKChMb2NhbFNpdGUpU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkpLmdldExvY2F0aW9uVVJMKCkuZ2V0RmlsZSgpKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKGxvY2FsRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCWFzc2VydFRydWUobG9jYWxGaWxlLmV4aXN0cygpKTsKLQkJRmlsZSBjb25maWdGaWxlID0gZ2V0TGF0ZXN0Q29uZmlndXJhdGlvbkZpbGUobG9jYWxGaWxlKTsKLQkKLQkJU3RyaW5nW10gbmFtZXMgPQotCQkJewotCQkJCSJmZWF0dXJlcy9teS5hbHBoYWJldC5yb3VuZC5sZXR0ZXJzXzEuMC4wLyIsCi0JCQkJImZlYXR1cmVzL215LmFscGhhYmV0LnN0cmFpZ2h0LmxldHRlcnNfMS4wLjAvIiwKLQkJCQkiZmVhdHVyZXMvbXkuYWxwaGFiZXRfMS4wLjAvIiB9OwotCQlhc3NlcnRUcnVlKGNvbmZpZ0ZpbGUuZXhpc3RzKCkpOwotCQlhc3NlcnRUcnVlKGNoZWNrRmVhdHVyZXNEaXNhYmxlZChnZXRBcnJheUxpc3QobmFtZXMpLGNvbmZpZ0ZpbGUsIFRBUkdFVF9GSUxFX1NJVEUuZ2V0RmlsZSgpKSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2hlY2tGZWF0dXJlc0Rpc2FibGVkKEFycmF5TGlzdCBmZWF0dXJlTmFtZXMsIEZpbGUgY29uZmlnRmlsZSwgU3RyaW5nIHNpdGVMb2NhdGlvbil7Ci0JCXRyeSB7Ci0JCQlGaWxlUmVhZGVyIGZyZWFkZXIgPSBuZXcgRmlsZVJlYWRlcihjb25maWdGaWxlKTsKLQkJCUJ1ZmZlcmVkUmVhZGVyIGJyZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoZnJlYWRlcik7Ci0JCQlTdHJpbmcgbGluZTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigibm93IHJlYWRpbmcuLi4iICsgY29uZmlnRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQlib29sZWFuIGlzU2l0ZVRvQ2hlY2sgPSBmYWxzZTsKLQkJCXdoaWxlIChicmVhZGVyLnJlYWR5KCkpIHsKLQkJCQlsaW5lID0gYnJlYWRlci5yZWFkTGluZSgpOwotCQkJCWlmIChsaW5lLnRyaW0oKS5zdGFydHNXaXRoKCI8c2l0ZSB1cmwiKSl7Ci0JCQkJCWlzU2l0ZVRvQ2hlY2sgPSBsaW5lLnRyaW0oKS5zcGxpdCgiXCIiKVsxXS5yZXBsYWNlRmlyc3QoImZpbGU6IiwiIikuZXF1YWxzKHNpdGVMb2NhdGlvbik7Ci0JCQkJfSBlbHNlIGlmIChpc1NpdGVUb0NoZWNrICYmIGxpbmUudHJpbSgpLnN0YXJ0c1dpdGgoIjxmZWF0dXJlIGNvbmZpZ3VyZWQiKSl7Ci0JCQkJCVN5c3RlbS5lcnIucHJpbnRsbihsaW5lKTsKLQkJCQkJU3RyaW5nW10gY29uZmlnTGluZSA9IGxpbmUuc3BsaXQoIlwiIik7Ci0JCQkJCWlmIChmZWF0dXJlTmFtZXMuY29udGFpbnMoY29uZmlnTGluZVszXSkgJiYgY29uZmlnTGluZVsxXS5lcXVhbHMoInRydWUiKSl7Ci0JCQkJCQlmYWlsKGNvbmZpZ0xpbmVbM10gKyAiIGhhcyBub3QgYmVlbiBkaXNhYmxlZC4iKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbihlKTsKLQkJfSAKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9zdGFuZGFsb25lL1Rlc3RGZWF0dXJlRW5hYmxlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9zdGFuZGFsb25lL1Rlc3RGZWF0dXJlRW5hYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4NTg2MWYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvc3RhbmRhbG9uZS9UZXN0RmVhdHVyZUVuYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5zdGFuZGFsb25lOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQbGF0Zm9ybVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuc3RhbmRhbG9uZS4qOwotCi1wdWJsaWMgY2xhc3MgVGVzdEZlYXR1cmVFbmFibGUgZXh0ZW5kcyBTdGFuZGFsb25lTWFuYWdlclRlc3RDYXNlIHsKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNFbmFibGVkOwotCQotCXB1YmxpYyBUZXN0RmVhdHVyZUVuYWJsZShTdHJpbmcgYXJnMCkgewotCQlzdXBlcihhcmcwKTsKLQkJaXNFbmFibGVkID0gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgdW1TZXRVcCgpIHsKLQotCQlzdXBlci51bVNldFVwKCk7Ci0JCQotCQlTdHJpbmcgZmVhdHVyZUlkID0gIm15LmFscGhhYmV0IjsKLQkJU3RyaW5nIHZlcnNpb24gPSAiMS4wLjAiOwotCi0JCWNoZWNrQ29uZmlndXJlZFNpdGVzKCk7Ci0JCWlmICghaXNFbmFibGVkKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oCi0JCQkJIj09PT09PT09PT09PT09IiArIHRoaXMuZ2V0Q2xhc3MoKSArICI9PT09PT09PT09PT09Iik7Ci0JCQlTdGFuZGFsb25lVXBkYXRlQXBwbGljYXRpb24gYXBwID0gbmV3IFN0YW5kYWxvbmVVcGRhdGVBcHBsaWNhdGlvbigpOwotCQkJdHJ5IHsKLQkJCQlleGl0VmFsdWUgPSAoSW50ZWdlcilhcHAucnVuKGdldENvbW1hbmQoCi0JCQkJCSJlbmFibGUiLAotCQkJCQlmZWF0dXJlSWQsCi0JCQkJCXZlcnNpb24sCi0JCQkJCW51bGwsCi0JCQkJCW51bGwsCi0JCQkJCVRBUkdFVF9GSUxFX1NJVEUuZ2V0RmlsZSgpKSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCQlpc0VuYWJsZWQgPSB0cnVlOwotCQkJY2hlY2tDb25maWd1cmVkU2l0ZXMoKTsKLQkJfQotCX0KLQkKLQkvLyBlbnN1cmUgZXhpdCB3aXRob3V0IHByb2JsZW1zCi0JcHVibGljIHZvaWQgdGVzdEV4aXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTeXN0ZW0ub3V0LnByaW50bG4oImV4aXRWYWx1ZTogIiArIGV4aXRWYWx1ZSk7Ci0JCWFzc2VydEVxdWFscyhleGl0VmFsdWUsIElQbGF0Zm9ybVJ1bm5hYmxlLkVYSVRfT0spOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGZWF0dXJlU3RhdHVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCi0JCUZpbGUgbG9jYWxGaWxlID0gbmV3IEZpbGUoKChMb2NhbFNpdGUpU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkpLmdldExvY2F0aW9uVVJMKCkuZ2V0RmlsZSgpKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKGxvY2FsRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCWFzc2VydFRydWUobG9jYWxGaWxlLmV4aXN0cygpKTsKLQkJRmlsZSBjb25maWdGaWxlID0gZ2V0TGF0ZXN0Q29uZmlndXJhdGlvbkZpbGUobG9jYWxGaWxlKTsKLQkJCi0JCVN0cmluZ1tdIG5hbWVzID0KLQkJCXsKLQkJCQkiZmVhdHVyZXMvbXkuYWxwaGFiZXQucm91bmQubGV0dGVyc18xLjAuMC8iLAotCQkJCSJmZWF0dXJlcy9teS5hbHBoYWJldC5zdHJhaWdodC5sZXR0ZXJzXzEuMC4wLyIsCi0JCQkJImZlYXR1cmVzL215LmFscGhhYmV0XzEuMC4wLyIgfTsKLQkJYXNzZXJ0VHJ1ZShjb25maWdGaWxlLmV4aXN0cygpKTsKLQkJYXNzZXJ0VHJ1ZShjaGVja0ZlYXR1cmVzRW5hYmxlZChnZXRBcnJheUxpc3QobmFtZXMpLGNvbmZpZ0ZpbGUsIFRBUkdFVF9GSUxFX1NJVEUuZ2V0RmlsZSgpKSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2hlY2tGZWF0dXJlc0VuYWJsZWQoQXJyYXlMaXN0IGZlYXR1cmVOYW1lcywgRmlsZSBjb25maWdGaWxlLCBTdHJpbmcgc2l0ZUxvY2F0aW9uKXsKLQkJdHJ5IHsKLQkJCUZpbGVSZWFkZXIgZnJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKGNvbmZpZ0ZpbGUpOwotCQkJQnVmZmVyZWRSZWFkZXIgYnJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihmcmVhZGVyKTsKLQkJCVN0cmluZyBsaW5lOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJub3cgcmVhZGluZy4uLiIgKyBjb25maWdGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLQkJCWJvb2xlYW4gaXNTaXRlVG9DaGVjayA9IGZhbHNlOwotCQkJd2hpbGUgKGJyZWFkZXIucmVhZHkoKSkgewotCQkJCWxpbmUgPSBicmVhZGVyLnJlYWRMaW5lKCk7Ci0JCQkJaWYgKGxpbmUudHJpbSgpLnN0YXJ0c1dpdGgoIjxzaXRlIHVybCIpKXsKLQkJCQkJaXNTaXRlVG9DaGVjayA9IGxpbmUudHJpbSgpLnNwbGl0KCJcIiIpWzFdLnJlcGxhY2VGaXJzdCgiZmlsZToiLCIiKS5lcXVhbHMoc2l0ZUxvY2F0aW9uKTsKLQkJCQl9IGVsc2UgaWYgKGlzU2l0ZVRvQ2hlY2sgJiYgbGluZS50cmltKCkuc3RhcnRzV2l0aCgiPGZlYXR1cmUgY29uZmlndXJlZCIpKXsKLQkJCQkJU3lzdGVtLmVyci5wcmludGxuKGxpbmUpOwotCQkJCQlTdHJpbmdbXSBjb25maWdMaW5lID0gbGluZS5zcGxpdCgiXCIiKTsKLQkJCQkJaWYgKGZlYXR1cmVOYW1lcy5jb250YWlucyhjb25maWdMaW5lWzNdKSAmJiBjb25maWdMaW5lWzFdLmVxdWFscygiZmFsc2UiKSl7Ci0JCQkJCQlmYWlsKGNvbmZpZ0xpbmVbM10gKyAiIGhhcyBub3QgYmVlbiBlbmFibGVkLiIpOwotCQkJCQl9Ci0JCQkJCS8vIHRlbXAgLSBkZWxldGUgbGF0ZXIKLQkJCQkJaWYgKGZlYXR1cmVOYW1lcy5jb250YWlucyhjb25maWdMaW5lWzNdKSkKLQkJCQkJCVN5c3RlbS5lcnIucHJpbnRsbihsaW5lKTsKLQkJCQkJLy8gZW5kIG9mIHRlbXAgZGVsZXRlCi0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLmVyci5wcmludGxuKGUpOwotCQl9IAotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3N0YW5kYWxvbmUvVGVzdEZlYXR1cmVJbnN0YWxsLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9zdGFuZGFsb25lL1Rlc3RGZWF0dXJlSW5zdGFsbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODQzMWMzLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3N0YW5kYWxvbmUvVGVzdEZlYXR1cmVJbnN0YWxsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnN0YW5kYWxvbmU7Ci0KLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuc3RhbmRhbG9uZS4qOwotCi0KLXB1YmxpYyBjbGFzcyBUZXN0RmVhdHVyZUluc3RhbGwgZXh0ZW5kcyBTdGFuZGFsb25lTWFuYWdlclRlc3RDYXNlIHsKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5zdGFsbGVkOwotCi0JcHVibGljIFRlc3RGZWF0dXJlSW5zdGFsbChTdHJpbmcgYXJnMCkgewotCQlzdXBlcihhcmcwKTsKLQkJaXNJbnN0YWxsZWQgPSBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bVNldFVwKCkgewotCQlzdXBlci51bVNldFVwKCk7Ci0JCS8vU3lzdGVtLm91dC5wcmludGxuKCJsb29raW5nIGF0IGNvbmZpZ3VyZWQgc2l0ZXMgYXZhaWxhYmxlLi4uLiIpOwotCQkvL2NoZWNrQ29uZmlndXJlZFNpdGVzKCk7Ci0JCQotCQlTdHJpbmcgZmVhdHVyZUlkID0gIm15LmFscGhhYmV0IjsKLQkJU3RyaW5nIHZlcnNpb24gPSAiMS4wLjAiOwotCi0JCVN0cmluZyBmcm9tUmVtb3RlU2l0ZVVybCA9Ci0JCQkiaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS8lN0VjaGVja291dCU3RS9wbGF0Zm9ybS11cGRhdGUtaG9tZS8zLjAvc2l0ZS8iOwotCQlpZiAoIWlzSW5zdGFsbGVkKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oCi0JCQkJIj09PT09PT09PT09PT09IiArIHRoaXMuZ2V0Q2xhc3MoKSArICI9PT09PT09PT09PT09Iik7Ci0JCQlTdGFuZGFsb25lVXBkYXRlQXBwbGljYXRpb24gYXBwID0gbmV3IFN0YW5kYWxvbmVVcGRhdGVBcHBsaWNhdGlvbigpOwotCQkJdHJ5IHsKLQkJCQlleGl0VmFsdWUgPSAoSW50ZWdlcilhcHAucnVuKGdldENvbW1hbmQoCi0JCQkJCSJpbnN0YWxsIiwKLQkJCQkJZmVhdHVyZUlkLAotCQkJCQl2ZXJzaW9uLAotCQkJCQludWxsLAotCQkJCQlmcm9tUmVtb3RlU2l0ZVVybCwKLQkJCQkJVEFSR0VUX0ZJTEVfU0lURS5nZXRGaWxlKCkpKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJCWlzSW5zdGFsbGVkID0gdHJ1ZTsKLQkJfQotCQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UGx1Z2luc0V4aXN0KCkgewotCQlJU2l0ZSBsb2NhbFNpdGUgPSBnZXRDb25maWd1cmVkU2l0ZShUQVJHRVRfRklMRV9TSVRFKTsKLQkJCi0JCVN5c3RlbS5vdXQucHJpbnRsbigibG9jYWxTaXRlOiAiICsgbG9jYWxTaXRlLmdldFVSTCgpLmdldEZpbGUoKSk7Ci0JCUlQbHVnaW5FbnRyeVtdIHBsdWdpbkVudHJpZXMgPSBsb2NhbFNpdGUuZ2V0UGx1Z2luRW50cmllcygpOwotCQlBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKHBsdWdpbkVudHJpZXMgPT0gbnVsbCB8fCBwbHVnaW5FbnRyaWVzLmxlbmd0aCA9PSAwKXsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbigiTm8gcGx1Z2luIGVudHJpZXMgb24gdGhlIHRhcmdldCBzaXRlIik7Ci0JCQlmYWlsKCJObyBwbHVnaW4gZW50cmllcyBvbiB0aGUgdGFyZ2V0IHNpdGUiKTsKLQkJfSBlbHNlewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwbHVnaW5FbnRyaWVzLmxlbmd0aDsgaSsrKXsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImZvdW5kIHBsdWdpbjogIiArIHBsdWdpbkVudHJpZXNbaV0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkpOwotCQkJCWxpc3QuYWRkKHBsdWdpbkVudHJpZXNbaV0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkpOwotCQkJfQotCQl9Ci0KLQkJU3RyaW5nW10gcGx1Z2luTmFtZXMgPQotCQkJewkibXkuYWxwaGFiZXQubGV0dGVyLmFfMS4wLjAiLAotCQkJCSJteS5hbHBoYWJldC5sZXR0ZXIuYl8xLjAuMCIsCi0JCQkJIm15LmFscGhhYmV0LmxldHRlci5jXzEuMC4wIiwKLQkJCQkibXkuYWxwaGFiZXQubGV0dGVyLmVfMS4wLjAiLAotCQkJCSJteS5hbHBoYWJldC5yb3VuZC5sZXR0ZXJzXzEuMC4wIiwKLQkJCQkibXkuYWxwaGFiZXQuc3RyYWlnaHQubGV0dGVyc18xLjAuMCIsCi0JCQkJIm15LmFscGhhYmV0XzEuMC4wIiB9OwotCQlhc3NlcnRUcnVlKGNoZWNrRmlsZXNJbkxpc3QocGx1Z2luTmFtZXMsIGxpc3QpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmVhdHVyZXNFeGlzdCgpIHsKLQkJdHJ5IHsKLQkJCUlTaXRlIGxvY2FsU2l0ZSA9ICBnZXRDb25maWd1cmVkU2l0ZShUQVJHRVRfRklMRV9TSVRFKTsKLQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJsb2NhbFNpdGU6ICIgKyBsb2NhbFNpdGUuZ2V0VVJMKCkuZ2V0RmlsZSgpKTsKLQkJCS8vIGdldCBmZWF0dXJlIHJlZmVyZW5jZXMgCi0JCQlJRmVhdHVyZVJlZmVyZW5jZVtdIGxvY2FsRmVhdHVyZXMgPQotCQkJCWxvY2FsU2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlcygpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJsb2NhbCBjdXJyZW50Q09uZmlnU2l0ZTogIiArIGxvY2FsU2l0ZS5nZXRDdXJyZW50Q29uZmlndXJlZFNpdGUoKSk7Ci0JCQlBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWlmIChsb2NhbEZlYXR1cmVzID09IG51bGwgfHwgbG9jYWxGZWF0dXJlcy5sZW5ndGggPT0gMCl7Ci0JCQkJU3lzdGVtLmVyci5wcmludGxuKCJObyBmZWF0dXJlcyBvbiB0aGUgdGFyZ2V0IHNpdGUiKTsKLQkJCQlmYWlsKCJObyBmZWF0dXJlcyBvbiB0aGUgdGFyZ2V0IHNpdGUiKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsb2NhbEZlYXR1cmVzLmxlbmd0aDsgaSsrKQotCQkJCQlsaXN0LmFkZChsb2NhbEZlYXR1cmVzW2ldLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpKTsKLQkJCX0KLQkJCVN0cmluZ1tdIGZlYXR1cmVOYW1lcyA9Ci0JCQkJewotCQkJCQkibXkuYWxwaGFiZXQucm91bmQubGV0dGVyc18xLjAuMCIsCi0JCQkJCSJteS5hbHBoYWJldC5zdHJhaWdodC5sZXR0ZXJzXzEuMC4wIiwKLQkJCQkJIm15LmFscGhhYmV0XzEuMC4wIiB9OwotCQkJYXNzZXJ0VHJ1ZShjaGVja0ZpbGVzSW5MaXN0KGZlYXR1cmVOYW1lcywgbGlzdCkpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbihlKTsKLQkJfQotCX0KLQotCS8vIG1ha2VzIHN1cmUgYWxsIGZpbGVzL2RpcmVjdG9yaWVzIGluICJuYW1lcyIgYXJlIGluIHRoZSBkaXJlY3RvcnkgbGlzdGluZyAibGlzdCIKLQlwdWJsaWMgYm9vbGVhbiBjaGVja0ZpbGVzSW5MaXN0KAotCQlTdHJpbmdbXSBuYW1lcywKLQkJQXJyYXlMaXN0IGxpc3QpIHsKLQkJCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihuYW1lc1tpXSk7Ci0JCQlpZiAoIWxpc3QuY29udGFpbnMobmFtZXNbaV0pKXsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLy8gZW5zdXJlIGV4aXQgd2l0aG91dCBwcm9ibGVtcwotCXB1YmxpYyB2b2lkIHRlc3RFeGl0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJleGl0VmFsdWU6ICIgKyBleGl0VmFsdWUpOwotCQlhc3NlcnRFcXVhbHMoZXhpdFZhbHVlLCBJUGxhdGZvcm1SdW5uYWJsZS5FWElUX09LKTsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9zdGFuZGFsb25lL1Rlc3RGZWF0dXJlVW5pbnN0YWxsLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9zdGFuZGFsb25lL1Rlc3RGZWF0dXJlVW5pbnN0YWxsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlZDdlM2UuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvc3RhbmRhbG9uZS9UZXN0RmVhdHVyZVVuaW5zdGFsbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5zdGFuZGFsb25lOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5zdGFuZGFsb25lLio7Ci0KLQotcHVibGljIGNsYXNzIFRlc3RGZWF0dXJlVW5pbnN0YWxsIGV4dGVuZHMgU3RhbmRhbG9uZU1hbmFnZXJUZXN0Q2FzZSB7Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVW5pbnN0YWxsZWQ7Ci0JCi0JcHVibGljIFRlc3RGZWF0dXJlVW5pbnN0YWxsKFN0cmluZyBhcmcwKXsKLQkJc3VwZXIoYXJnMCk7Ci0JCWlzVW5pbnN0YWxsZWQgPSBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdW1TZXRVcCgpIHsKLQkJc3VwZXIudW1TZXRVcCgpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oImxvb2tpbmcgYXQgY29uZmlndXJlZCBzaXRlcyBhdmFpbGFibGUuLi4uIik7Ci0JCWNoZWNrQ29uZmlndXJlZFNpdGVzKCk7Ci0JCQotCQlTdHJpbmcgZmVhdHVyZUlkID0gIm15LmFscGhhYmV0IjsKLQkJU3RyaW5nIHZlcnNpb24gPSAiMS4wLjAiOwotCi0JCWlmKCFpc1VuaW5zdGFsbGVkKXsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigKLQkJCQkiPT09PT09PT09PT09PT0iICsgdGhpcy5nZXRDbGFzcygpICsgIj09PT09PT09PT09PT0iKTsKLQkJCVN0YW5kYWxvbmVVcGRhdGVBcHBsaWNhdGlvbiBhcHAgPSBuZXcgU3RhbmRhbG9uZVVwZGF0ZUFwcGxpY2F0aW9uKCk7Ci0JCQl0cnkgewotCQkJCWV4aXRWYWx1ZSA9IChJbnRlZ2VyKWFwcC5ydW4oZ2V0Q29tbWFuZCgKLQkJCQkJInVuaW5zdGFsbCIsCi0JCQkJCWZlYXR1cmVJZCwKLQkJCQkJdmVyc2lvbiwKLQkJCQkJbnVsbCwKLQkJCQkJbnVsbCwKLQkJCQkJVEFSR0VUX0ZJTEVfU0lURS5nZXRGaWxlKCkpKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJCWlzVW5pbnN0YWxsZWQgPSB0cnVlOwotCQl9Ci0JfQotCQotCS8vIGVuc3VyZSBleGl0IHdpdGhvdXQgcHJvYmxlbXMKLQlwdWJsaWMgdm9pZCB0ZXN0RXhpdFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiZXhpdFZhbHVlOiAiICsgZXhpdFZhbHVlKTsKLQkJYXNzZXJ0RXF1YWxzKGV4aXRWYWx1ZSwgSVBsYXRmb3JtUnVubmFibGUuRVhJVF9PSyk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RGZWF0dXJlc1VuaW5zdGFsbGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlJU2l0ZSBsb2NhbFNpdGUgPSBnZXRDb25maWd1cmVkU2l0ZShUQVJHRVRfRklMRV9TSVRFKTsKLQkJCQotCQkJLy8gZ2V0IGZlYXR1cmUgcmVmZXJlbmNlcyAKLQkJCUlGZWF0dXJlUmVmZXJlbmNlW10gbG9jYWxGZWF0dXJlcyA9Ci0JCQkJbG9jYWxTaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKCk7Ci0JCQlBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWlmIChsb2NhbEZlYXR1cmVzID09IG51bGwgfHwgbG9jYWxGZWF0dXJlcy5sZW5ndGggPT0gMCl7Ci0JCQkJZmFpbCgiTm8gZmVhdHVyZXMgb24gdGhlIHRhcmdldCBzaXRlIik7Ci0JCQl9IGVsc2UgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbG9jYWxGZWF0dXJlcy5sZW5ndGg7IGkrKykKLQkJCQkJbGlzdC5hZGQobG9jYWxGZWF0dXJlc1tpXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCQlTdHJpbmdbXSBmZWF0dXJlTmFtZXMgPQotCQkJCXsKLQkJCQkJIm15LmFscGhhYmV0LnJvdW5kLmxldHRlcnNfMS4wLjAiLAotCQkJCQkibXkuYWxwaGFiZXQuc3RyYWlnaHQubGV0dGVyc18xLjAuMCIsCi0JCQkJCSJteS5hbHBoYWJldF8xLjAuMCIgfTsKLQkJCWFzc2VydFRydWUoY2hlY2tGaWxlc05vdEluTGlzdChmZWF0dXJlTmFtZXMsIGxpc3QpKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFBsdWdpbnNVbmluc3RhbGxlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQkJSVNpdGUgbG9jYWxTaXRlID0gZ2V0Q29uZmlndXJlZFNpdGUoVEFSR0VUX0ZJTEVfU0lURSk7Ci0JCQkKLQkJCUlQbHVnaW5FbnRyeVtdIHBsdWdpbkVudHJpZXMgPSBsb2NhbFNpdGUuZ2V0UGx1Z2luRW50cmllcygpOwotCQkJQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlpZiAocGx1Z2luRW50cmllcyA9PSBudWxsIHx8IHBsdWdpbkVudHJpZXMubGVuZ3RoID09IDApCi0JCQkJZmFpbCgiTm8gcGx1Z2luIGVudHJpZXMgb24gdGhlIHRhcmdldCBzaXRlIik7Ci0JCQllbHNlCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwbHVnaW5FbnRyaWVzLmxlbmd0aDsgaSsrKXsKLQkJCQkJbGlzdC5hZGQocGx1Z2luRW50cmllc1tpXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSk7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigicGx1Z2luIGZvdW5kOiAiICsgcGx1Z2luRW50cmllc1tpXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSk7Ci0JCQkJfQotCi0JCQlTdHJpbmdbXSBwbHVnaW5OYW1lcyA9Ci0JCQkJewkibXkuYWxwaGFiZXQubGV0dGVyLmFfMS4wLjAiLAotCQkJCQkibXkuYWxwaGFiZXQubGV0dGVyLmJfMS4wLjAiLAotCQkJCQkibXkuYWxwaGFiZXQubGV0dGVyLmNfMS4wLjAiLAotCQkJCQkibXkuYWxwaGFiZXQubGV0dGVyLmVfMS4wLjAiLAotCQkJCQkibXkuYWxwaGFiZXQucm91bmQubGV0dGVyc18xLjAuMCIsCi0JCQkJCSJteS5hbHBoYWJldC5zdHJhaWdodC5sZXR0ZXJzXzEuMC4wIiwKLQkJCQkJIm15LmFscGhhYmV0XzEuMC4wIiB9OwotCQkJYXNzZXJ0VHJ1ZShjaGVja0ZpbGVzTm90SW5MaXN0KHBsdWdpbk5hbWVzLCBsaXN0KSk7CQotCX0KLQkKLQkvLyBtYWtlcyBzdXJlIGFsbCBmaWxlcy9kaXJlY3RvcmllcyBpbiAibmFtZXMiIGFyZSBOT1QgaW4gdGhlIGRpcmVjdG9yeSBsaXN0aW5nICJsaXN0IgotCXB1YmxpYyBib29sZWFuIGNoZWNrRmlsZXNOb3RJbkxpc3QoCi0JCVN0cmluZ1tdIG5hbWVzLAotCQlBcnJheUxpc3QgbGlzdCkgewotCQkKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJzZWFyY2hpbmcgZm9yICIgKyBuYW1lc1tpXSArICIuLi4iKTsKLQkJCWlmIChsaXN0LmNvbnRhaW5zKG5hbWVzW2ldKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvc3RhbmRhbG9uZS9UZXN0RmVhdHVyZVVwZGF0ZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvc3RhbmRhbG9uZS9UZXN0RmVhdHVyZVVwZGF0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzg4NDY4Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3N0YW5kYWxvbmUvVGVzdEZlYXR1cmVVcGRhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuc3RhbmRhbG9uZTsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuc3RhbmRhbG9uZS4qOwotCi1wdWJsaWMgY2xhc3MgVGVzdEZlYXR1cmVVcGRhdGUgZXh0ZW5kcyBTdGFuZGFsb25lTWFuYWdlclRlc3RDYXNlIHsKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNVcGRhdGVkOwotCQotCXB1YmxpYyBUZXN0RmVhdHVyZVVwZGF0ZShTdHJpbmcgYXJnMCkgewotCQlzdXBlcihhcmcwKTsKLQkJaXNVcGRhdGVkID0gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgdW1TZXRVcCgpIHsKLQkJc3VwZXIudW1TZXRVcCgpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oImxvb2tpbmcgYXQgY29uZmlndXJlZCBzaXRlcyBhdmFpbGFibGUuLi4uIik7Ci0JCWNoZWNrQ29uZmlndXJlZFNpdGVzKCk7Ci0JCQotCQlTdHJpbmcgZmVhdHVyZUlkID0gIm15LmFscGhhYmV0IjsKLQkJU3RyaW5nIHZlcnNpb24gPSAiMS4wLjEiOwotCi0JCWlmICghaXNVcGRhdGVkKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oCi0JCQkJIj09PT09PT09PT09PT09IiArIHRoaXMuZ2V0Q2xhc3MoKSArICI9PT09PT09PT09PT09Iik7Ci0JCQlTdGFuZGFsb25lVXBkYXRlQXBwbGljYXRpb24gYXBwID0gbmV3IFN0YW5kYWxvbmVVcGRhdGVBcHBsaWNhdGlvbigpOwotCQkJdHJ5IHsKLQkJCQlleGl0VmFsdWUgPSAoSW50ZWdlcilhcHAucnVuKGdldENvbW1hbmQoCi0JCQkJCQkidXBkYXRlIiwKLQkJCQkJCWZlYXR1cmVJZCwKLQkJCQkJCXZlcnNpb24sCi0JCQkJCQludWxsLAotCQkJCQkJbnVsbCwKLQkJCQkJCVRBUkdFVF9GSUxFX1NJVEUuZ2V0RmlsZSgpKSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCQlpc1VwZGF0ZWQgPSB0cnVlOwotCQl9Ci0JfQotCi0KLQkvLyBlbnN1cmUgZXhpdCB3aXRob3V0IHByb2JsZW1zCi0JcHVibGljIHZvaWQgdGVzdEV4aXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTeXN0ZW0ub3V0LnByaW50bG4oImV4aXRWYWx1ZTogIiArIGV4aXRWYWx1ZSk7Ci0JCWFzc2VydEVxdWFscyhleGl0VmFsdWUsIElQbGF0Zm9ybVJ1bm5hYmxlLkVYSVRfT0spOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UGx1Z2luc0V4aXN0KCkgewotCi0JCQlJU2l0ZSBsb2NhbFNpdGUgPSAgZ2V0Q29uZmlndXJlZFNpdGUoVEFSR0VUX0ZJTEVfU0lURSk7Ci0KLQkJCUlQbHVnaW5FbnRyeVtdIHBsdWdpbkVudHJpZXMgPSBsb2NhbFNpdGUuZ2V0UGx1Z2luRW50cmllcygpOwotCQkJQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlpZiAocGx1Z2luRW50cmllcyA9PSBudWxsIHx8IHBsdWdpbkVudHJpZXMubGVuZ3RoID09IDApCi0JCQkJZmFpbCgiTm8gcGx1Z2luIGVudHJpZXMgb24gdGhlIHRhcmdldCBzaXRlIik7Ci0JCQllbHNlCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwbHVnaW5FbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWxpc3QuYWRkKAotCQkJCQkJcGx1Z2luRW50cmllc1tpXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSk7Ci0JCQkJfQotCi0JCQlTdHJpbmdbXSBwbHVnaW5OYW1lcyA9Ci0JCQkJewotCQkJCQkibXkuYWxwaGFiZXQubGV0dGVyLmFfMS4wLjAiLAotCQkJCQkibXkuYWxwaGFiZXQubGV0dGVyLmJfMS4wLjAiLAotCQkJCQkibXkuYWxwaGFiZXQubGV0dGVyLmNfMS4wLjAiLAotCQkJCQkibXkuYWxwaGFiZXQubGV0dGVyLmVfMS4wLjAiLAotCQkJCQkibXkuYWxwaGFiZXQucm91bmQubGV0dGVyc18xLjAuMCIsCi0JCQkJCSJteS5hbHBoYWJldC5zdHJhaWdodC5sZXR0ZXJzXzEuMC4wIiwKLQkJCQkJIm15LmFscGhhYmV0XzEuMC4wIiwKLQkJCQkJIm15LmFscGhhYmV0LmxldHRlci5hXzEuMC4xIiwKLQkJCQkJIm15LmFscGhhYmV0LmxldHRlci5iXzEuMC4xIiwKLQkJCQkJIm15LmFscGhhYmV0LmxldHRlci5jXzEuMC4xIiwKLQkJCQkJIm15LmFscGhhYmV0LmxldHRlci5lXzEuMC4xIiwKLQkJCQkJIm15LmFscGhhYmV0LnJvdW5kLmxldHRlcnNfMS4wLjEiLAotCQkJCQkibXkuYWxwaGFiZXQuc3RyYWlnaHQubGV0dGVyc18xLjAuMSIsCi0JCQkJCSJteS5hbHBoYWJldF8xLjAuMSIgfTsKLQkJCWFzc2VydFRydWUoY2hlY2tGaWxlc0luTGlzdChwbHVnaW5OYW1lcywgbGlzdCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGZWF0dXJlc0V4aXN0KCkgewotCQl0cnkgewotCQkJSVNpdGUgbG9jYWxTaXRlID0gZ2V0Q29uZmlndXJlZFNpdGUoVEFSR0VUX0ZJTEVfU0lURSk7Ci0KLQkJCS8vIGdldCBmZWF0dXJlIHJlZmVyZW5jZXMKLQkJCUlGZWF0dXJlUmVmZXJlbmNlW10gbG9jYWxGZWF0dXJlcyA9Ci0JCQkJbG9jYWxTaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKCk7Ci0JCQlBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWlmIChsb2NhbEZlYXR1cmVzID09IG51bGwgfHwgbG9jYWxGZWF0dXJlcy5sZW5ndGggPT0gMCkgewotCQkJCWZhaWwoIk5vIGZlYXR1cmVzIG9uIHRoZSB0YXJnZXQgc2l0ZSIpOwotCQkJfSBlbHNlIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxvY2FsRmVhdHVyZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJbGlzdC5hZGQoCi0JCQkJCQlsb2NhbEZlYXR1cmVzW2ldLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpKTsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKAotCQkJCQkJbG9jYWxGZWF0dXJlc1tpXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSk7Ci0JCQkJfQotCQkJfQotCQkJU3RyaW5nW10gZmVhdHVyZU5hbWVzID0KLQkJCQl7Ci0JCQkJCSJteS5hbHBoYWJldC5yb3VuZC5sZXR0ZXJzXzEuMC4wIiwKLQkJCQkJIm15LmFscGhhYmV0LnN0cmFpZ2h0LmxldHRlcnNfMS4wLjAiLAotCQkJCQkibXkuYWxwaGFiZXRfMS4wLjAiLAotCQkJCQkibXkuYWxwaGFiZXQucm91bmQubGV0dGVyc18xLjAuMSIsCi0JCQkJCSJteS5hbHBoYWJldC5zdHJhaWdodC5sZXR0ZXJzXzEuMC4xIiwKLQkJCQkJIm15LmFscGhhYmV0XzEuMC4xIiB9OwotCQkJYXNzZXJ0VHJ1ZShjaGVja0ZpbGVzSW5MaXN0KGZlYXR1cmVOYW1lcywgbGlzdCkpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbihlKTsKLQkJfQotCX0KLQotCS8vIG1ha2VzIHN1cmUgYWxsIGZpbGVzL2RpcmVjdG9yaWVzIGluICJuYW1lcyIgYXJlIGluIHRoZSBkaXJlY3RvcnkgbGlzdGluZwotCS8vICJsaXN0IgotCXB1YmxpYyBib29sZWFuIGNoZWNrRmlsZXNJbkxpc3QoU3RyaW5nW10gbmFtZXMsIEFycmF5TGlzdCBsaXN0KSB7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKCFsaXN0LmNvbnRhaW5zKG5hbWVzW2ldKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy90eXBlcy9BbGxUeXBlc1Rlc3RzLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy90eXBlcy9BbGxUeXBlc1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiYzYwNzEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvdHlwZXMvQWxsVHlwZXNUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy50eXBlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5VcGRhdGVNYW5hZ2VyVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci0KLQotcHVibGljIGNsYXNzIEFsbFR5cGVzVGVzdHMgZXh0ZW5kcyBVcGRhdGVNYW5hZ2VyVGVzdENhc2UgewotcHVibGljIEFsbFR5cGVzVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0Jc3VpdGUuc2V0TmFtZSgiUmVndWxhciBJbnN0YWxsIFRlc3RzIik7Ci0JCi0JLy8gdGhlIGZvbGxvd2luZyB3aWxsIHRha2UgYWxsIHRlaCB0ZXN0IG1ldGhvZHMgaW4gdGVoIGNsYXNzIHRoYXQgc3RhcnQgd2l0aCAndGVzdCcKLQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoVGVzdEZlYXR1cmVUeXBlLmNsYXNzKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFRlc3RTaXRlVHlwZS5jbGFzcykpOwkKLQkKLQkvLyBvciB5b3UgY2FuIHNwZWNpZnkgdGhlIG1ldGhvZAotCS8vc3VpdGUuYWRkVGVzdChuZXcgVGVzdEdldEZlYXR1cmUoIm1ldGhvZFRoYXREb2VzTm90U3RhcnRXaXRodGVzdCIpKTsJCi0JCi0JcmV0dXJuIHN1aXRlOwotfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvdHlwZXMvVGVzdEZlYXR1cmVUeXBlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy90eXBlcy9UZXN0RmVhdHVyZVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2VlYTE2YS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy90eXBlcy9UZXN0RmVhdHVyZVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnR5cGVzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuVXBkYXRlTWFuYWdlclRlc3RDYXNlOwotCi0KLXB1YmxpYyBjbGFzcyBUZXN0RmVhdHVyZVR5cGUgZXh0ZW5kcyBVcGRhdGVNYW5hZ2VyVGVzdENhc2UgewotCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFDS0FHRURfRkVBVFVSRV9UWVBFID0gInBhY2thZ2VkIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTlNUQUxMRURfRkVBVFVSRV9UWVBFID0gImluc3RhbGxlZCI7IC8vJE5PTi1OTFMtMSQJCi0JCi0JLyoqCi0JICogVGVzdCB0aGUgZ2V0RmVhdHVyZXMoKQotCSAqLwotCXB1YmxpYyBUZXN0RmVhdHVyZVR5cGUoU3RyaW5nIGFyZzApIHsKLQkJc3VwZXIoYXJnMCk7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdEluc3RhbGxhYmxlRmVhdHVyZVR5cGUoKSB7Ci0JCVN0cmluZyBwbHVnaW5JRCA9IFVwZGF0ZUNvcmUuZ2V0UGx1Z2luKCkuZ2V0RGVzY3JpcHRvcigpLmdldFVuaXF1ZUlkZW50aWZpZXIoKSArICIuIjsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gcGx1Z2luSUQgKyBQQUNLQUdFRF9GRUFUVVJFX1RZUEU7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdEV4ZWN1dGFibGVGZWF0dXJlVHlwZSgpIHsKLQkJU3RyaW5nIHBsdWdpbklEID0gVXBkYXRlQ29yZS5nZXRQbHVnaW4oKS5nZXREZXNjcmlwdG9yKCkuZ2V0VW5pcXVlSWRlbnRpZmllcigpICsgIi4iOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBwbHVnaW5JRCArIElOU1RBTExFRF9GRUFUVVJFX1RZUEU7Ci0JfQkJCi0JCi0JLyoqCi0JICogQHRocm93cyBFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlUGFja2FnZWRGZWF0dXJlVHlwZSgpIHRocm93cyBFeGNlcHRpb257IAotCQlGZWF0dXJlVHlwZUZhY3RvcnkgZmFjdG9yaWVzID0gRmVhdHVyZVR5cGVGYWN0b3J5LmdldEluc3RhbmNlKCk7Ci0JCUlGZWF0dXJlRmFjdG9yeSBmYWN0b3J5ID0gZmFjdG9yaWVzLmdldEZhY3RvcnkoZ2V0RGVmYXVsdEluc3RhbGxhYmxlRmVhdHVyZVR5cGUoKSk7Ci0JCQotCQlJU2l0ZSBzaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShTT1VSQ0VfRklMRV9TSVRFLG51bGwpOwotCQlVUkwgZmVhdHVyZVVSTCA9IG5ldyBVUkwoU09VUkNFX0ZJTEVfU0lURSwiZmVhdHVyZXMvZmVhdHVyZXMyLmphciAiKTsKLQkJCi0JCUlGZWF0dXJlIGFub3RoZXJGZWF0dXJlID0gZmFjdG9yeS5jcmVhdGVGZWF0dXJlKGZlYXR1cmVVUkwsc2l0ZSxudWxsKTsKLQkJCi0JCWFzc2VydFRydWUoIkZhY3RvcnkgZG9lc24ndCBjcmVhdGUgc2FtZSBmZWF0dXJlIixhbm90aGVyRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZXF1YWxzKGFub3RoZXJGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSkpOwotCX0JCi0JCi0JCS8qKgotCSAqIEB0aHJvd3MgRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFNpbXBsZUV4ZWN1dGFibGVGZWF0dXJlVHlwZSgpIHRocm93cyBFeGNlcHRpb257IAotCQlGZWF0dXJlVHlwZUZhY3RvcnkgZmFjdG9yaWVzID0gRmVhdHVyZVR5cGVGYWN0b3J5LmdldEluc3RhbmNlKCk7Ci0JCUlGZWF0dXJlRmFjdG9yeSBmYWN0b3J5ID0gZmFjdG9yaWVzLmdldEZhY3RvcnkoZ2V0RGVmYXVsdEV4ZWN1dGFibGVGZWF0dXJlVHlwZSgpKTsKLQkJCi0JCUlTaXRlIHNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKFNPVVJDRV9GSUxFX1NJVEUsbnVsbCk7Ci0JCVVSTCBmZWF0dXJlVVJMID0gbmV3IFVSTChTT1VSQ0VfRklMRV9TSVRFLCJ0ZXN0QVBJLyIrU2l0ZS5ERUZBVUxUX0lOU1RBTExFRF9GRUFUVVJFX1BBVEgrImZlYXR1cmUzLyIpOwotCQkKLQkJSUZlYXR1cmUgYW5vdGhlckZlYXR1cmUgPSBmYWN0b3J5LmNyZWF0ZUZlYXR1cmUoZmVhdHVyZVVSTCxzaXRlLG51bGwpOwotCQkKLQkJYXNzZXJ0VHJ1ZSgiRmFjdG9yeSBkb2Vzbid0IGNyZWF0ZSBzYW1lIGZlYXR1cmUiLGFub3RoZXJGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5lcXVhbHMoYW5vdGhlckZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpKSk7Ci0JfQkKLQkKLQkvKioKLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RGZWF0dXJlVHlwZSgpIHRocm93cyBFeGNlcHRpb257IAotCQlGZWF0dXJlVHlwZUZhY3RvcnkgZmFjdG9yaWVzID0gRmVhdHVyZVR5cGVGYWN0b3J5LmdldEluc3RhbmNlKCk7Ci0JCUlGZWF0dXJlRmFjdG9yeSBmYWN0b3J5ID0gZmFjdG9yaWVzLmdldEZhY3RvcnkoZ2V0RGVmYXVsdEluc3RhbGxhYmxlRmVhdHVyZVR5cGUoKSk7Ci0JCQotCQlJU2l0ZSBzaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShTT1VSQ0VfSFRUUF9TSVRFLG51bGwpOwotCQlJRmVhdHVyZSBmZWF0dXJlID0gc2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlcygpWzBdLmdldEZlYXR1cmUobnVsbCk7Ci0JCQotCQlJRmVhdHVyZSBhbm90aGVyRmVhdHVyZSA9IGZhY3RvcnkuY3JlYXRlRmVhdHVyZShmZWF0dXJlLmdldFVSTCgpLHNpdGUsbnVsbCk7Ci0JCQotCQlhc3NlcnRUcnVlKCJGYWN0b3J5IGRvZXNuJ3QgY3JlYXRlIHNhbWUgZmVhdHVyZSIsZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZXF1YWxzKGFub3RoZXJGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSkpOwotCX0KLQkKLQkKLQkvKioKLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RGZWF0dXJlTmV3VHlwZSgpIHRocm93cyBFeGNlcHRpb257IAotCQlGZWF0dXJlVHlwZUZhY3RvcnkgZmFjdG9yaWVzID0gRmVhdHVyZVR5cGVGYWN0b3J5LmdldEluc3RhbmNlKCk7Ci0JCUlGZWF0dXJlRmFjdG9yeSBmYWN0b3J5ID0gZmFjdG9yaWVzLmdldEZhY3RvcnkoZ2V0RGVmYXVsdEV4ZWN1dGFibGVGZWF0dXJlVHlwZSgpKTsKLQkJCi0JCVN0cmluZyBmZWF0dXJlUGF0aCA9IGRhdGFQYXRoKyJGZWF0dXJlVHlwZUV4YW1wbGVzL3NpdGUxL3NpdGUueG1sIjsKLQkJSVNpdGUgc2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUobmV3IEZpbGUoZmVhdHVyZVBhdGgpLnRvVVJMKCksbnVsbCk7Ci0JCUlGZWF0dXJlUmVmZXJlbmNlIHJlZiA9IHNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKVswXTsKLQkJSUZlYXR1cmUgZmVhdHVyZSA9IHJlZi5nZXRGZWF0dXJlKG51bGwpOwotCQkKLQkJSUZlYXR1cmUgYW5vdGhlckZlYXR1cmUgPSBmYWN0b3J5LmNyZWF0ZUZlYXR1cmUoZmVhdHVyZS5nZXRVUkwoKSxzaXRlLG51bGwpOwotCi0JCWFzc2VydFRydWUoZmVhdHVyZS5nZXRGZWF0dXJlQ29udGVudFByb3ZpZGVyKCkgaW5zdGFuY2VvZiBGZWF0dXJlRXhlY3V0YWJsZUNvbnRlbnRQcm92aWRlcik7CQkKLQkJYXNzZXJ0VHJ1ZSgoKEZlYXR1cmVSZWZlcmVuY2UpcmVmKS5nZXRUeXBlKCkuZXF1YWxzKCJvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS5mZWF0dXJlMSIpKTsJCQotCQlhc3NlcnRUcnVlKCJGYWN0b3J5IGRvZXNuJ3QgY3JlYXRlIHNhbWUgZmVhdHVyZSIsZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZXF1YWxzKGFub3RoZXJGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSkpOwotCi0KLQl9Ci0JCi0JCi0JCS8qKgotCSAqIEB0aHJvd3MgRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEZlYXR1cmVBbm90aGVyVHlwZSgpIHRocm93cyBFeGNlcHRpb257IAotCQlGZWF0dXJlVHlwZUZhY3RvcnkgZmFjdG9yaWVzID0gRmVhdHVyZVR5cGVGYWN0b3J5LmdldEluc3RhbmNlKCk7Ci0JCUlGZWF0dXJlRmFjdG9yeSBmYWN0b3J5ID0gZmFjdG9yaWVzLmdldEZhY3RvcnkoZ2V0RGVmYXVsdEluc3RhbGxhYmxlRmVhdHVyZVR5cGUoKSk7Ci0JCQotCQlTdHJpbmcgZmVhdHVyZVBhdGggPSBkYXRhUGF0aCsiRmVhdHVyZVR5cGVFeGFtcGxlcy9zaXRlMi9zaXRlLnhtbCI7Ci0JCUlTaXRlIHNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKG5ldyBGaWxlKGZlYXR1cmVQYXRoKS50b1VSTCgpLG51bGwpOwotCQlJRmVhdHVyZVJlZmVyZW5jZSByZWYgPSBzaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKClbMF07CQkKLQkJSUZlYXR1cmUgZmVhdHVyZSA9IHJlZi5nZXRGZWF0dXJlKG51bGwpOwotCQkKLQkJSUZlYXR1cmUgYW5vdGhlckZlYXR1cmUgPSBmYWN0b3J5LmNyZWF0ZUZlYXR1cmUoZmVhdHVyZS5nZXRVUkwoKSxzaXRlLG51bGwpOwotCQkKLQkJYXNzZXJ0VHJ1ZSgiRmFjdG9yeSBkb2Vzbid0IGNyZWF0ZSBzYW1lIGZlYXR1cmUiLGZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmVxdWFscyhhbm90aGVyRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkpKTsKLQkJYXNzZXJ0VHJ1ZShmZWF0dXJlLmdldEZlYXR1cmVDb250ZW50UHJvdmlkZXIoKSBpbnN0YW5jZW9mIEZlYXR1cmVQYWNrYWdlZENvbnRlbnRQcm92aWRlcik7Ci0JCWFzc2VydFRydWUoKChGZWF0dXJlUmVmZXJlbmNlKXJlZikuZ2V0VHlwZSgpLmVxdWFscygib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUucGFja2FnZWQiKSk7Ci0JCQotCX0KLQkJCi0JCQotCS8qKgotCSAqIEB0aHJvd3MgRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEZlYXR1cmVVbmtub3duVHlwZSgpIHRocm93cyBFeGNlcHRpb257IAotCQlTdHJpbmcgZmVhdHVyZVBhdGggPSBkYXRhUGF0aCsiRmVhdHVyZVR5cGVFeGFtcGxlcy9zaXRlMy9zaXRlLnhtbCI7Ci0JCUlTaXRlIHNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKG5ldyBGaWxlKGZlYXR1cmVQYXRoKS50b1VSTCgpLG51bGwpOwotCQlJRmVhdHVyZVJlZmVyZW5jZSByZWYgPSBzaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKClbMF07CQkKLQkJdHJ5IHsKLQkJCXJlZi5nZXRGZWF0dXJlKG51bGwpOwotCQkJYXNzZXJ0VHJ1ZSgiaWQgZm91bmQsIHNob3VsZCBub3QgYmUgZm91bmQiLGZhbHNlKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKXsKLQkJCWlmIChlLmdldE1lc3NhZ2UoKS5pbmRleE9mKCJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS51bmtub3dudHlwZS5qYXIiKT09LTEpewotCQkJCXRocm93IGU7Ci0JCQl9Ci0JCX0KLQkJCi0JfQkJCi0JCQotfQotCi0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3R5cGVzL1Rlc3RTaXRlVHlwZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvdHlwZXMvVGVzdFNpdGVUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczOWFkYmEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvdHlwZXMvVGVzdFNpdGVUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnR5cGVzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklGZWF0dXJlUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLlNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuU2l0ZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuRmVhdHVyZVBhY2thZ2VkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLlNpdGVVUkxDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLlVwZGF0ZU1hbmFnZXJUZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuaW1wbGVtZW50YXRpb24uU2l0ZUZUUEZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0U2l0ZVR5cGUgZXh0ZW5kcyBVcGRhdGVNYW5hZ2VyVGVzdENhc2UgewotCi0JLyoqCi0JICogVGVzdCB0aGUgZ2V0RmVhdHVyZXMoKQotCSAqLwotCXB1YmxpYyBUZXN0U2l0ZVR5cGUoU3RyaW5nIGFyZzApIHsKLQkJc3VwZXIoYXJnMCk7Ci0JfQotCi0JLyoqCi0JICogQHRocm93cyBFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0U2l0ZVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlTdHJpbmcgZmVhdHVyZVBhdGggPSBkYXRhUGF0aCArICJTaXRlVHlwZUV4YW1wbGVzL3NpdGUxL3NpdGUueG1sIjsKLQkJSVNpdGUgc2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUobmV3IEZpbGUoZmVhdHVyZVBhdGgpLnRvVVJMKCksbnVsbCk7Ci0JCUlGZWF0dXJlUmVmZXJlbmNlIHJlZiA9IHNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKVswXTsKLQkJSUZlYXR1cmUgZmVhdHVyZSA9IHJlZi5nZXRGZWF0dXJlKG51bGwpOwotCi0JCWFzc2VydFRydWUoc2l0ZS5nZXRTaXRlQ29udGVudFByb3ZpZGVyKCkgaW5zdGFuY2VvZiBTaXRlVVJMQ29udGVudFByb3ZpZGVyKTsKLQkJYXNzZXJ0VHJ1ZSgoKFNpdGUpIHNpdGUpLmdldFR5cGUoKS5lcXVhbHMoIm9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmh0dHAiKSk7Ci0JCWFzc2VydFRydWUoZmVhdHVyZS5nZXRGZWF0dXJlQ29udGVudFByb3ZpZGVyKCkgaW5zdGFuY2VvZiBGZWF0dXJlUGFja2FnZWRDb250ZW50UHJvdmlkZXIpOwotCi0JfQotCi0JLyoqCi0JCSAqIEB0aHJvd3MgRXhjZXB0aW9uCi0JCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RGVFBTaXRlVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCUlTaXRlIHNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKG5ldyBVUkwoU09VUkNFX0ZJTEVfU0lURSArICJGVFBMaWtlU2l0ZS8iKSxudWxsKTsKLQotCQkvLyBzaG91bGQgbm90IGZpbmQgdGhlIG1hcHBpbmcKLQkJLy8gYnV0IHRoZW4gc2hvdWxkIGF0dGVtcHQgdG8gcmVhZCB0aGUgWE1MIGZpbGUKLQkJLy8gZm91bmQgYSBuZXcgdHlwZQotCQkvLyBjYWxsIHRoZSBuZXcgdHlwZQotCQlhc3NlcnRUcnVlKAotCQkJIldyb25nIHNpdGUgdHlwZSIsCi0JCQlzaXRlLmdldFR5cGUoKS5lcXVhbHMoIm9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5mdHAiKSk7Ci0JCWFzc2VydFRydWUoCi0JCQkiV3JvbmcgZmlsZSIsCi0JCQlzaXRlLmdldFVSTCgpLmdldEZpbGUoKS5lcXVhbHMoIi8iICsgU2l0ZUZUUEZhY3RvcnkuRklMRSkpOwotCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdFBhcnNlVmFsaWQxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlVUkwgcmVtb3RlVVJMID0gbmV3IFVSTChTT1VSQ0VfRklMRV9TSVRFICsgInBhcnNlcnRlc3RzL3NpdGVmdHAueG1sIik7Ci0JCQlJU2l0ZSBzaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShyZW1vdGVVUkwsbnVsbCk7Ci0JCQlzaXRlLmdldEFyY2hpdmVzKCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJaWYgKGUuZ2V0TWVzc2FnZSgpLmluZGV4T2YoIjwvZmVhdHVyZT4iKSA9PSAtMSkgewotCQkJCXRocm93IGU7Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3VpdmFsdWVzL0FsbENvcmVVSVRlc3RzLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy91aXZhbHVlcy9BbGxDb3JlVUlUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNmYwZWFhLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3VpdmFsdWVzL0FsbENvcmVVSVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnVpdmFsdWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLlVwZGF0ZU1hbmFnZXJUZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLQotCi1wdWJsaWMgY2xhc3MgQWxsQ29yZVVJVGVzdHMgZXh0ZW5kcyBVcGRhdGVNYW5hZ2VyVGVzdENhc2UgewotcHVibGljIEFsbENvcmVVSVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCXN1aXRlLnNldE5hbWUoIlJlZ3VsYXIgSW5zdGFsbCBUZXN0cyIpOwotCQotCS8vIHRoZSBmb2xsb3dpbmcgd2lsbCB0YWtlIGFsbCB0ZWggdGVzdCBtZXRob2RzIGluIHRlaCBjbGFzcyB0aGF0IHN0YXJ0IHdpdGggJ3Rlc3QnCi0Jc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFRlc3RVSUxhYmVsLmNsYXNzKSk7Ci0JCi0JLy8gb3IgeW91IGNhbiBzcGVjaWZ5IHRoZSBtZXRob2QKLQkvL3N1aXRlLmFkZFRlc3QobmV3IFRlc3RHZXRGZWF0dXJlKCJtZXRob2RUaGF0RG9lc05vdFN0YXJ0V2l0aHRlc3QiKSk7CQotCQotCXJldHVybiBzdWl0ZTsKLX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3VpdmFsdWVzL1Rlc3RVSUxhYmVsLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy91aXZhbHVlcy9UZXN0VUlMYWJlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzJlOTg5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3VpdmFsdWVzL1Rlc3RVSUxhYmVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnVpdmFsdWVzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLlVwZGF0ZU1hbmFnZXJUZXN0Q2FzZTsKLQotCi1wdWJsaWMgY2xhc3MgVGVzdFVJTGFiZWwgZXh0ZW5kcyBVcGRhdGVNYW5hZ2VyVGVzdENhc2UgewotCi0JLyoqCi0JICogVGVzdCB0aGUgZ2V0RmVhdHVyZXMoKQotCSAqLwotCXB1YmxpYyBUZXN0VUlMYWJlbChTdHJpbmcgYXJnMCkgewotCQlzdXBlcihhcmcwKTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogTWV0aG9kIHRlc3RIVFRQU2l0ZS4KLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVNYW5hZ2VyU2l0ZSgpIHRocm93cyBFeGNlcHRpb257IAotCQkKLQkJSVNpdGUgcmVtb3RlU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUobmV3IFVSTCgiaHR0cCIsZ2V0SHR0cEhvc3QoKSxnZXRIdHRwUG9ydCgpLGJ1bmRsZS5nZXRTdHJpbmcoIkhUVFBfUEFUSF8yIikpLG51bGwpOwotCQlJQ2F0ZWdvcnlbXSBjYXRlZ29yaWVzID0gcmVtb3RlU2l0ZS5nZXRDYXRlZ29yaWVzKCk7Ci0JCWZvciAoaW50IGkgPTA7IGk8Y2F0ZWdvcmllcy5sZW5ndGg7IGkrKyl7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNhdGVnb3J5IC0+IitjYXRlZ29yaWVzW2ldLmdldExhYmVsKCkrIjoiK2NhdGVnb3JpZXNbaV0uZ2V0TmFtZSgpKTsKLQkJfQotCQlTeXN0ZW0ub3V0LnByaW50bG4ocmVtb3RlU2l0ZS5nZXREZXNjcmlwdGlvbigpLmdldFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCkpOwotCQlJRmVhdHVyZVJlZmVyZW5jZVtdIHJlbW90ZUZlYXR1cmVzID0gcmVtb3RlU2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlcygpOwotCQlpZiAocmVtb3RlRmVhdHVyZXM9PW51bGwgfHwgcmVtb3RlRmVhdHVyZXMubGVuZ3RoPT0wKSBmYWlsKCJObyBmZWF0dXJlIGF2YWlsYWJsZSBmb3IgdGVzdGluZyIpOwkJCi0JCWZvciAoaW50IGk9MDtpPHJlbW90ZUZlYXR1cmVzLmxlbmd0aDtpKyspewotCQkJSUZlYXR1cmUgZmVhdHVyZSA9IHJlbW90ZUZlYXR1cmVzW2ldLmdldEZlYXR1cmUobnVsbCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImZlYXR1cmU6IitmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSsiLT4iK2ZlYXR1cmUuZ2V0TGFiZWwoKSk7Ci0JCQlwcmludChmZWF0dXJlLmdldExpY2Vuc2UoKSwiTGljZW5zZSIpOwotCQkJcHJpbnQoZmVhdHVyZS5nZXRDb3B5cmlnaHQoKSwiQ29weXJpZ2h0Iik7CQkJCi0JCQlwcmludChmZWF0dXJlLmdldERlc2NyaXB0aW9uKCksIkRlc2NyaXB0aW9uIik7CQkJCQotCQkJCi0JCQkvLyBjaGVjayB0aGF0IGl0IGRvd25sb2FkcyB0aGUgZmVhdHVyZS5qYXIgdW5kZXIgdGhlIGNvdmVyCi0JCQkvLyBhbmQgdW5wYWNrIGl0Ci0JCQkKLQkJCVVSTCB1cmwgPSBmZWF0dXJlLmdldExpY2Vuc2UoKS5nZXRVUkwoKTsKLQkJCWlmICh1cmwhPW51bGwpewotCQkJCWFzc2VydFRydWUoKG5ldyBGaWxlKHVybC5nZXRGaWxlKCkpKS5leGlzdHMoKSk7Ci0JCQl9Ci0KLQkJCXVybCA9IGZlYXR1cmUuZ2V0Q29weXJpZ2h0KCkuZ2V0VVJMKCk7Ci0JCQlpZiAodXJsIT1udWxsKXsKLQkJCQlhc3NlcnRUcnVlKChuZXcgRmlsZSh1cmwuZ2V0RmlsZSgpKSkuZXhpc3RzKCkpOwotCQkJfQotCQkJCi0JCQl1cmwgPSBmZWF0dXJlLmdldERlc2NyaXB0aW9uKCkuZ2V0VVJMKCk7Ci0JCQlpZiAodXJsIT1udWxsKXsKLQkJCQlhc3NlcnRUcnVlKChuZXcgRmlsZSh1cmwuZ2V0RmlsZSgpKSkuZXhpc3RzKCkpOwotCQkJfQotCQkJCi0JCX0KLQl9Ci0JCi0JCi0JLyoqCi0JICogTWV0aG9kIHByaW50LgotCSAqIEBwYXJhbSBpbmZvCi0JICogQHBhcmFtIHRleHQKLQkgKi8KLQlwcml2YXRlIHZvaWQgcHJpbnQoSVVSTEVudHJ5IGluZm8sIFN0cmluZyB0ZXh0KXsKLQkJU3lzdGVtLm91dC5wcmludCgiLT4iK3RleHQrIjoiKTsKLQkJaWYgKGluZm8uZ2V0VVJMKCkhPW51bGwpIAotCQkJU3lzdGVtLm91dC5wcmludGxuKCI8IitpbmZvLmdldFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCkrIj4iKTsKLQkJZWxzZSAKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihpbmZvLmdldEFubm90YXRpb24oKSk7Ci0JfQotfSAKLQotCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvdGVzdC54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvdGVzdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkYTgxZTAuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3Rlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+DQotPHByb2plY3QgbmFtZT0idGVzdHN1aXRlIiBkZWZhdWx0PSJydW4iIGJhc2VkaXI9Ii4iPiANCi0gIA0KLSAgPCEtLSBUaGUgcHJvcGVydHkgJHtlY2xpcHNlLWhvbWV9IHNob3VsZCBiZSBwYXNzZWQgaW50byB0aGlzIHNjcmlwdCAtLT4NCi0gIDwhLS0gU2V0IGEgbWVhbmluZ2Z1bCBkZWZhdWx0IHZhbHVlIGZvciB3aGVuIGl0IGlzIG5vdC4gLS0+DQotICA8cHJvcGVydHkgbmFtZT0iZWNsaXBzZS1ob21lIiB2YWx1ZT0iJHtiYXNlZGlyfS8uLi8uLiIvPg0KLSAgDQotICA8IS0tIHNldHMgdGhlIHByb3BlcnRpZXMgZWNsaXBzZS1ob21lLCBhbmQgbGlicmFyeS1maWxlIC0tPg0KLSAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi1uYW1lIiB2YWx1ZT0ib3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUiLz4NCi0gIDxwcm9wZXJ0eSBuYW1lPSJsaWJyYXJ5LWZpbGUiIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vcGx1Z2lucy9vcmcuZWNsaXBzZS50ZXN0L2xpYnJhcnkueG1sIi8+DQotICA8cHJvcGVydHkgbmFtZT0iY2xhc3MtbmFtZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5BbGxUZXN0cyIgLz4NCi0gIA0KLSAgPCEtLSBUaGlzIHRhcmdldCBob2xkcyBhbGwgaW5pdGlhbGl6YXRpb24gY29kZSB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgZm9yIC0tPg0KLSAgPCEtLSBhbGwgdGVzdHMgdGhhdCBhcmUgdG8gYmUgcnVuLiBJbml0aWFsaXphdGlvbiBmb3IgaW5kaXZpZHVhbCB0ZXN0cyAtLT4NCi0gIDwhLS0gc2hvdWxkIGJlIGRvbmUgd2l0aGluIHRoZSBib2R5IG9mIHRoZSBzdWl0ZSB0YXJnZXQuIC0tPg0KLSAgPHRhcmdldCBuYW1lPSJpbml0Ij4NCi0gICAgPHRzdGFtcC8+DQotICAgIDxkZWxldGU+DQotICAgICAgPGZpbGVzZXQgZGlyPSIke2VjbGlwc2UtaG9tZX0iIGluY2x1ZGVzPSJvcmcqLnhtbCIvPg0KLSAgICA8L2RlbGV0ZT4NCi0gIDwvdGFyZ2V0Pg0KLSAgDQotICA8IS0tIFRoaXMgdGFyZ2V0IGRlZmluZXMgdGhlIHRlc3RzIHRoYXQgbmVlZCB0byBiZSBydW4uIC0tPg0KLSAgPHRhcmdldCBuYW1lPSJzdWl0ZSI+DQotICAgIDxwcm9wZXJ0eSBuYW1lPSJzbmlmZi1mb2xkZXIiIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vdXBkYXRlX2NvcmVfc25pZmZfZm9sZGVyIi8+DQotICAgIDxkZWxldGUgZGlyPSIke3NuaWZmLWZvbGRlcn0iIHF1aWV0PSJ0cnVlIi8+DQotICAgIA0KLSAgICA8YW50IHRhcmdldD0iY29yZS10ZXN0IiBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4NCi0gICAgICA8cHJvcGVydHkgbmFtZT0iZGF0YS1kaXIiIHZhbHVlPSIke3NuaWZmLWZvbGRlcn0iLz4NCi0gICAgICA8cHJvcGVydHkgbmFtZT0icGx1Z2luLW5hbWUiIHZhbHVlPSIke3BsdWdpbi1uYW1lfSIvPg0KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjbGFzc25hbWUiIHZhbHVlPSIke2NsYXNzLW5hbWV9Ii8+DQotICAgIDwvYW50Pg0KLSAgPC90YXJnZXQ+DQotICANCi0gIDwhLS0gVGhpcyB0YXJnZXQgaG9sZHMgY29kZSB0byBjbGVhbnVwIHRoZSB0ZXN0aW5nIGVudmlyb25tZW50IGFmdGVyIC0tPg0KLSAgPCEtLSBhZnRlciBhbGwgb2YgdGhlIHRlc3RzIGhhdmUgYmVlbiBydW4uIFlvdSBjYW4gdXNlIHRoaXMgdGFyZ2V0IHRvIC0tPg0KLSAgPCEtLSBkZWxldGUgdGVtcG9yYXJ5IGZpbGVzIHRoYXQgaGF2ZSBiZWVuIGNyZWF0ZWQuIC0tPg0KLSAgPHRhcmdldCBuYW1lPSJjbGVhbnVwIj4NCi0gIDwvdGFyZ2V0Pg0KLSAgDQotICA8IS0tIFRoaXMgdGFyZ2V0IHJ1bnMgdGhlIHRlc3Qgc3VpdGUuIEFueSBhY3Rpb25zIHRoYXQgbmVlZCB0byBoYXBwZW4gLS0+DQotICA8IS0tIGFmdGVyIGFsbCB0aGUgdGVzdHMgaGF2ZSBiZWVuIHJ1biBzaG91bGQgZ28gaGVyZS4gLS0+DQotICAgPHRhcmdldCBuYW1lPSJydW4iIGRlcGVuZHM9ImluaXQsc3VpdGUsY2xlYW51cCI+DQotICAgIDxhbnQgdGFyZ2V0PSJjb2xsZWN0IiBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4NCi0gICAgICA8cHJvcGVydHkgbmFtZT0iaW5jbHVkZXMiIHZhbHVlPSJvcmcqLnhtbCIvPg0KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJvdXRwdXQtZmlsZSIgdmFsdWU9IiR7cGx1Z2luLW5hbWV9LnhtbCIvPg0KLSAgICA8L2FudD4NCi0gIDwvdGFyZ2V0Pg0KLQkNCi0JPCEtLSBUaGlzIHRhcmdldCBkZWZpbmVzIHRoZSBwZXJmb3JtYW5jZSB0ZXN0cyB0aGF0IG5lZWQgdG8gYmUgcnVuLiAtLT4NCi0JPHRhcmdldCBuYW1lPSJwZXJmb3JtYW5jZS1zdWl0ZSI+DQotCSAgPHByb3BlcnR5IG5hbWU9InlvdXItcGVyZm9ybWFuY2UtZm9sZGVyIiB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L3VwZGF0ZV9wZXJmb3JtYW5jZV9mb2xkZXIiLz4NCi0JICA8ZGVsZXRlIGRpcj0iJHt5b3VyLXBlcmZvcm1hbmNlLWZvbGRlcn0iIHF1aWV0PSJ0cnVlIi8+DQotCSAgPGFudCB0YXJnZXQ9ImNvcmUtdGVzdCIgYW50ZmlsZT0iJHtsaWJyYXJ5LWZpbGV9IiBkaXI9IiR7ZWNsaXBzZS1ob21lfSI+DQotCSAgICA8cHJvcGVydHkgbmFtZT0iZGF0YS1kaXIiIHZhbHVlPSIke3lvdXItcGVyZm9ybWFuY2UtZm9sZGVyfSIvPg0KLQkgICAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi1uYW1lIiB2YWx1ZT0iJHtwbHVnaW4tbmFtZX0iLz4NCi0JICAgIDxwcm9wZXJ0eSBuYW1lPSJjbGFzc25hbWUiIHZhbHVlPSJvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMucGVyZm1zLkFsbFBlcmZvcm1hbmNlVGVzdHMiLz4NCi0JICA8L2FudD4NCi0JPC90YXJnZXQ+DQotCQ0KLSAgPCEtLSBUaGlzIHRhcmdldCBydW5zIHRoZSBwZXJmb3JtYW5jZSB0ZXN0IHN1aXRlcy4gLS0+DQotCTx0YXJnZXQgbmFtZT0icGVyZm9ybWFuY2UiIGRlcGVuZHM9ImluaXQscGVyZm9ybWFuY2Utc3VpdGUiPg0KLQkgIDxhbnQgdGFyZ2V0PSJjb2xsZWN0IiBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4NCi0JICAgIDxwcm9wZXJ0eSBuYW1lPSJpbmNsdWRlcyIgdmFsdWU9Im9yZyoueG1sIi8+DQotCSAgICA8cHJvcGVydHkgbmFtZT0ib3V0cHV0LWZpbGUiIHZhbHVlPSIke3BsdWdpbi1uYW1lfS54bWwiLz4NCi0JICA8L2FudD4NCi0JPC90YXJnZXQ+DQotDQotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS90ZXN0X3dpdGhfbWFpbC54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvdGVzdF93aXRoX21haWwueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjFkNDA4Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS90ZXN0X3dpdGhfbWFpbC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTxwcm9qZWN0IG5hbWU9InRlc3RzdWl0ZSIgZGVmYXVsdD0icnVuIiBiYXNlZGlyPSIuIj4gCi0gIAotICA8IS0tIFRoZSBwcm9wZXJ0eSAke2VjbGlwc2UtaG9tZX0gc2hvdWxkIGJlIHBhc3NlZCBpbnRvIHRoaXMgc2NyaXB0IC0tPgotICA8IS0tIFNldCBhIG1lYW5pbmdmdWwgZGVmYXVsdCB2YWx1ZSBmb3Igd2hlbiBpdCBpcyBub3QuIC0tPgotICA8cHJvcGVydHkgbmFtZT0iZWNsaXBzZS1ob21lIiB2YWx1ZT0iJHtiYXNlZGlyfS8uLi8uLiIvPgotICAKLSAgPCEtLSBzZXRzIHRoZSBwcm9wZXJ0aWVzIGVjbGlwc2UtaG9tZSwgYW5kIGxpYnJhcnktZmlsZSAtLT4KLSAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi1uYW1lIiB2YWx1ZT0ib3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUiLz4KLSAgPHByb3BlcnR5IG5hbWU9ImxpYnJhcnktZmlsZSIgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS9wbHVnaW5zL29yZy5lY2xpcHNlLnRlc3QvbGlicmFyeS54bWwiLz4KLSAgPHByb3BlcnR5IG5hbWU9ImNsYXNzLW5hbWUiIHZhbHVlPSJvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuQWxsVGVzdHMiIC8+Ci0gIAotICA8IS0tIFRoaXMgdGFyZ2V0IGhvbGRzIGFsbCBpbml0aWFsaXphdGlvbiBjb2RlIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSBmb3IgLS0+Ci0gIDwhLS0gYWxsIHRlc3RzIHRoYXQgYXJlIHRvIGJlIHJ1bi4gSW5pdGlhbGl6YXRpb24gZm9yIGluZGl2aWR1YWwgdGVzdHMgLS0+Ci0gIDwhLS0gc2hvdWxkIGJlIGRvbmUgd2l0aGluIHRoZSBib2R5IG9mIHRoZSBzdWl0ZSB0YXJnZXQuIC0tPgotICA8dGFyZ2V0IG5hbWU9ImluaXQiPgotICAgIDx0c3RhbXAvPgotICAgIDxkZWxldGU+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7ZWNsaXBzZS1ob21lfSIgaW5jbHVkZXM9Im9yZyoueG1sIi8+Ci0gICAgPC9kZWxldGU+Ci0gIDwvdGFyZ2V0PgotICAKLSAgPCEtLSBUaGlzIHRhcmdldCBkZWZpbmVzIHRoZSB0ZXN0cyB0aGF0IG5lZWQgdG8gYmUgcnVuLiAtLT4KLSAgPHRhcmdldCBuYW1lPSJzdWl0ZSI+Ci0gICAgPHByb3BlcnR5IG5hbWU9InNuaWZmLWZvbGRlciIgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS91cGRhdGVfY29yZV9zbmlmZl9mb2xkZXIiLz4KLSAgICA8ZGVsZXRlIGRpcj0iJHtzbmlmZi1mb2xkZXJ9IiBxdWlldD0idHJ1ZSIvPgotICAgIAotICAgIDxhbnQgdGFyZ2V0PSJjb3JlLXRlc3QiIGFudGZpbGU9IiR7bGlicmFyeS1maWxlfSIgZGlyPSIke2VjbGlwc2UtaG9tZX0iPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImRhdGEtZGlyIiB2YWx1ZT0iJHtzbmlmZi1mb2xkZXJ9Ii8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0icGx1Z2luLW5hbWUiIHZhbHVlPSIke3BsdWdpbi1uYW1lfSIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImNsYXNzbmFtZSIgdmFsdWU9IiR7Y2xhc3MtbmFtZX0iLz4KLSAgICA8L2FudD4KLSAgPC90YXJnZXQ+Ci0gIAotICA8IS0tIFRoaXMgdGFyZ2V0IGhvbGRzIGNvZGUgdG8gY2xlYW51cCB0aGUgdGVzdGluZyBlbnZpcm9ubWVudCBhZnRlciAtLT4KLSAgPCEtLSBhZnRlciBhbGwgb2YgdGhlIHRlc3RzIGhhdmUgYmVlbiBydW4uIFlvdSBjYW4gdXNlIHRoaXMgdGFyZ2V0IHRvIC0tPgotICA8IS0tIGRlbGV0ZSB0ZW1wb3JhcnkgZmlsZXMgdGhhdCBoYXZlIGJlZW4gY3JlYXRlZC4gLS0+Ci0gIDx0YXJnZXQgbmFtZT0iY2xlYW51cCI+Ci0gIDwvdGFyZ2V0PgotICAKLSAgPCEtLSBUaGlzIHRhcmdldCBydW5zIHRoZSB0ZXN0IHN1aXRlLiBBbnkgYWN0aW9ucyB0aGF0IG5lZWQgdG8gaGFwcGVuIC0tPgotICA8IS0tIGFmdGVyIGFsbCB0aGUgdGVzdHMgaGF2ZSBiZWVuIHJ1biBzaG91bGQgZ28gaGVyZS4gLS0+Ci0gICA8dGFyZ2V0IG5hbWU9InJ1biIgZGVwZW5kcz0iaW5pdCxzdWl0ZSxjbGVhbnVwIj4KLQotICAgIDxwcm9wZXJ0eSBuYW1lPSJlbWFpbC1mcm9tIiB2YWx1ZT0iRWNsaXBzZV9BdXRvbWF0ZWRfVGVzdEBvdGkuY29tIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImVtYWlsLXN1YmplY3QiIHZhbHVlPSJJbnN0YWxsL1VwZGF0ZTogTmlnaHRseSBCdWlsZCBSZXBvcnQiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iZW1haWwtc3ViamVjdC1sb2ciIHZhbHVlPSJJbnN0YWxsL1VwZGF0ZTogTmlnaHRseSAubG9nIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImVtYWlsLXNlcnZlciIgdmFsdWU9ImQyNW1sMDQudG9yb2xhYi5pYm0uY29tIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImluZmlsZSIgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS8ke3BsdWdpbi1uYW1lfS54bWwiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iaW5maWxlLWxvZyIgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS93b3Jrc3BhY2UvLm1ldGFkYXRhLy5sb2ciLz4KLSAgICAgIAotICAgIDxhbnQgdGFyZ2V0PSJjb2xsZWN0IiBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJpbmNsdWRlcyIgdmFsdWU9Im9yZyoueG1sIi8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0ib3V0cHV0LWZpbGUiIHZhbHVlPSIke3BsdWdpbi1uYW1lfS54bWwiLz4KLSAgICA8L2FudD4KLSAgICAKLSAgICA8dG91Y2ggZmlsZT0iJHtpbmZpbGUtbG9nfSIvPgotCi0gICAgPG1haWwgZnJvbT0iJHtlbWFpbC1mcm9tfSIgdG9saXN0PSJjZWxla0BjYS5pYm0uY29tIgotICAgICAgICAgIHN1YmplY3Q9IiR7ZW1haWwtc3ViamVjdH0iIGZpbGVzPSIke2luZmlsZX0iCi0gICAgICAgICAgbWFpbGhvc3Q9IiR7ZW1haWwtc2VydmVyfSIvPgotCi0gICAgPG1haWwgZnJvbT0iJHtlbWFpbC1mcm9tfSIgdG9saXN0PSJjZWxla0BjYS5pYm0uY29tIgotICAgICAgICAgIHN1YmplY3Q9IiR7ZW1haWwtc3ViamVjdC1sb2d9IiBmaWxlcz0iJHtpbmZpbGUtbG9nfSIKLSAgICAgICAgICBtYWlsaG9zdD0iJHtlbWFpbC1zZXJ2ZXJ9Ii8+Ci0KLSAgICA8bWFpbCBmcm9tPSIke2VtYWlsLWZyb219IiB0b2xpc3Q9ImNlbGVrQHJvZ2Vycy5jb20iCi0gICAgICAgICAgc3ViamVjdD0iJHtlbWFpbC1zdWJqZWN0LWxvZ30iIGZpbGVzPSIke2luZmlsZS1sb2d9IgotICAgICAgICAgIG1haWxob3N0PSIke2VtYWlsLXNlcnZlcn0iLz4KLQotICAgIDxtYWlsIGZyb209IiR7ZW1haWwtZnJvbX0iIHRvbGlzdD0iY2VsZWtAcm9nZXJzLmNvbSIKLSAgICAgICAgICBzdWJqZWN0PSIke2VtYWlsLXN1YmplY3R9IiBmaWxlcz0iJHtpbmZpbGV9IgotICAgICAgICAgIG1haWxob3N0PSIke2VtYWlsLXNlcnZlcn0iLz4KLQotICA8L3RhcmdldD4KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1NpdGUgd2l0aCBzcGFjZS9mZWF0dXJlcyBzcGFjZS9oZWxwRmVhdHVyZS5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1NpdGUgd2l0aCBzcGFjZS9mZWF0dXJlcyBzcGFjZS9oZWxwRmVhdHVyZS5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhOThiYjguLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9TaXRlIHdpdGggc3BhY2UvZmVhdHVyZXMgc3BhY2UvaGVscEZlYXR1cmUuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9TaXRlIHdpdGggc3BhY2UvZmVhdHVyZXMgc3BhY2Uvc3BhY2UgZmVhdHVyZS5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1NpdGUgd2l0aCBzcGFjZS9mZWF0dXJlcyBzcGFjZS9zcGFjZSBmZWF0dXJlLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFhNmQ1NS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1NpdGUgd2l0aCBzcGFjZS9mZWF0dXJlcyBzcGFjZS9zcGFjZSBmZWF0dXJlLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvU2l0ZSB3aXRoIHNwYWNlL2luZm8vaW1nL3RvcF90aXRsc20uZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9TaXRlIHdpdGggc3BhY2UvaW5mby9pbWcvdG9wX3RpdGxzbS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5MTdiYjYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9TaXRlIHdpdGggc3BhY2UvaW5mby9pbWcvdG9wX3RpdGxzbS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1NpdGUgd2l0aCBzcGFjZS9pbmZvL2ltZy93ZWxfbWwuanBnIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9TaXRlIHdpdGggc3BhY2UvaW5mby9pbWcvd2VsX21sLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFlMzNkZi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1NpdGUgd2l0aCBzcGFjZS9pbmZvL2ltZy93ZWxfbWwuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9TaXRlIHdpdGggc3BhY2UvaW5mby9zaXRlSW5mby5odG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9TaXRlIHdpdGggc3BhY2UvaW5mby9zaXRlSW5mby5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDY1YWEzLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvU2l0ZSB3aXRoIHNwYWNlL2luZm8vc2l0ZUluZm8uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KLTxodG1sPg0KLTxoZWFkPg0KLTwvaGVhZD4NCi0gIDxib2R5Pg0KLTxpbWcgc3JjPSJpbWcvdG9wX3RpdGxzbS5naWYiIGFsdD0iIiB3aWR0aD0iNDYwIiBoZWlnaHQ9IjUwIj4NCi08YnI+DQotPGJyPg0KLSAgICAgSXQgc3RhcnRlZCB3aXRoIFNtYWxsdGFsazxicj4NCi0gICAgT1RJIGhhcyBiZWVuIGJ1aWxkaW5nIHRvb2xzIGZvciBwbGF0Zm9ybS1pbmRlcGVuZGVudCBPTyBkZXZlbG9wbWVudCBzaW5jZQ0KLSAgMTk4OC4gT3VyIEVOVlkmcmVnOyB0ZWNobm9sb2d5IGZpcnN0IGJyb3VnaHQgY29sbGFib3JhdGl2ZSBzb2Z0d2FyZSBkZXZlbG9wbWVudCwNCi0gIHZlcnNpb24gbWFuYWdlbWVudCBhbmQgc2hhcmVkIHJlcG9zaXRvcmllcyB0byBTbWFsbHRhbGsuIElCTSBpcyBvbmUgb2YNCi1tYW55ICAgY29tcGFuaWVzIHRvIGxpY2Vuc2UgRU5WWSwgd2hpY2ggY29udGludWVzIHRvIGJlIHRoZSBmb3VuZGF0aW9uIG9mDQotVmlzdWFsQWdlJnJlZzsgICBTbWFsbHRhbGsuPGJyPg0KLTxicj4NCi08YnI+DQotPGJyPg0KLSAgICAgIE5leHQgY2FtZSBKYXZhJiM4NDgyOzxicj4NCi0gICAgQmVjYXVzZSBvZiBvdXIgZXhwZXJ0aXNlIGluIE9PIHRlY2hub2xvZ3ksIElCTSB0dXJuZWQgdG8gT1RJIGZvciBhIG5leHQtZ2VuZXJhdGlvbg0KLSAgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQgZm9yIEphdmEuIFRoZSByZXN1bHQgaXMgVmlzdWFsQWdlIGZvciBKYXZhLCB3aGljaA0KLSAgY29udGludWVzIHRvIHdpbiBhd2FyZHMgZm9yIGl0cyBpbm5vdmF0aXZlIElERSBhbmQgdGVhbSBzdXBwb3J0LiBJbmZvV29ybGQNCi0gIGhhcyBjaG9zZW4gVmlzdWFsQWdlIGZvciBKYXZhIGFzIGRldmVsb3BtZW50IHRvb2wgb2YgdGhlIHllYXIgLSB5ZWFyIGFmdGVyDQotICB5ZWFyIGFmdGVyIHllYXIhPGJyPg0KLTxicj4NCi08YnI+DQotPGJyPg0KLSAgICAgIFRoZW4gcGVydmFzaXZlIGNvbXB1dGluZzxicj4NCi0gICAgT1RJIGNvbnRpbnVlcyBpdHMgZGV2ZWxvcG1lbnQgb2YgSUJNJ3MgVmlzdWFsQWdlIE1pY3JvIEVkaXRpb24sIGEgc3RhdGUtb2YtdGhlLWFydA0KLSAgcGxhdGZvcm0gZm9yIGNvbGxhYm9yYXRpdmUgZGV2ZWxvcG1lbnQgb2YgZW1iZWRkZWQgYXBwbGljYXRpb25zIGFuZCBzeXN0ZW1zDQotICB0aGF0IGFyZSB2ZXJ5IGxlYW4uIEFzIHRoZSBzdGVhZHkgc3RyZWFtIG9mIHByZXNzIHJlbGVhc2VzIGF0dGVzdHMsIFZpc3VhbEFnZQ0KLSAgTWljcm8gRWRpdGlvbiBpcyBhbHJlYWR5IGxpY2Vuc2VkIHRvIHRoZSBsZWFkaW5nIG1pY3JvY2hpcCBtYW51ZmFjdHVyZXJzLA0KLSAgbWljcm9rZXJuZWwgZGV2ZWxvcGVycywgYW5kIHByb2R1Y2VycyBvZiBoYW5kaGVsZCBhbmQgY29uc3VtZXIgZGV2aWNlcy48YnI+DQotPGJyPg0KLTxicj4NCi08YnI+DQotICAgICAgTm93IGl0J3MgRWNsaXBzZTxicj4NCi0gICAgT1RJIGhhcyBidWlsdCB0aGUgbmV4dCBnZW5lcmF0aW9uIElCTSBhcHBsaWNhdGlvbiBkZXZlbG9wbWVudCB0b29scyBwbGF0Zm9ybS4NCi0gIEVjbGlwc2UgaXMgYSBraW5kIG9mIHVuaXZlcnNhbCB0b29sIHBsYXRmb3JtIC0gYW4gb3BlbiBleHRlbnNpYmxlIElERSBmb3INCi0gIGFueXRoaW5nIGFuZCBub3RoaW5nIGluIHBhcnRpY3VsYXIuIFRoZSByZWFsIHZhbHVlIGNvbWVzIGZyb20gdG9vbCBwbHVnLWlucw0KLSAgdGhhdCAidGVhY2giIEVjbGlwc2UgaG93IHRvIHdvcmsgd2l0aCB0aGluZ3MgLSBqYXZhIGZpbGVzLCB3ZWIgY29udGVudCwNCi1ncmFwaGljcywgIHZpZGVvIC0gYWxtb3N0IGFueXRoaW5nIHlvdSBjYW4gaW1hZ2luZS4gRWNsaXBzZSBhbGxvd3MgeW91IHRvDQotaW5kZXBlbmRlbnRseSAgZGV2ZWxvcCB0b29scyB0aGF0IGludGVncmF0ZSB3aXRoIG90aGVyIHBlb3BsZSdzIHRvb2xzIHNvDQotc2VhbWxlc3NseSB5b3Ugd29uJ3Qga25vdyB3aGVyZSBvbmUgdG9vbCBlbmRzIGFuZCBhbm90aGVyIHN0YXJ0cy4gVGhlIElCTQ0KLXN1cHBvcnRlZCB2ZXJzaW9uIG9mIHRoaXMgdGVjaG5vbG9neSwgV2ViU3BoZXJlIFN0dWRpbyBXb3JrYmVuY2gsIHdpbGwgYmUNCi10aGUgY29yZSBvZiB0aGUgbmV4dCAgZ2VuZXJhdGlvbiBvZiBJQk0gYW5kIElCTSBCdXNpbmVzcyBQYXJ0bmVyIGUtYnVzaW5lc3MNCi10b29scyBvcHRpbWl6ZWQgZm9yICB0aGUgV2ViU3BoZXJlIHNvZnR3YXJlIHBsYXRmb3JtLjxicj4NCi08YnI+DQotPGJyPg0KLTxicj4NCi0gICAgICBTbyB3aGF0J3MgbmV4dD88YnI+DQotICAgIE9USSBjb250aW51ZXMgdG8gZGVsaXZlciBvYmplY3Qtb3JpZW50ZWQgdGVjaG5vbG9neSB0aGF0IHNjYWxlcyBhY3Jvc3MNCi0gcGxhdGZvcm1zLCAgYWNyb3NzIHRlYW1zIGFuZCBhY3Jvc3MgcHJvamVjdCBzaXplLiBGcm9tIGEgbWFpbmZyYW1lIHRvIGENCi13YXRjaCAgLSB3ZSdyZSAgY2xvc2luZyBpbiBvbiB0aGF0IHZpc2lvbi48YnI+DQotPGJyPg0KLTxpbWcgc3JjPSJpbWcvd2VsX21sLmpwZyIgd2lkdGg9IjQ2MCIgaGVpZ2h0PSI0NjAiIGFsdD0iIj4NCi08YnI+DQotPGJyPg0KLTxicj4NCi08YnI+DQotPGJyPg0KLTxicj4NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvU2l0ZSB3aXRoIHNwYWNlL2luc3RhbGwvZmVhdHVyZXMgc3BhY2UvZmVhdHVyZTMvZmVhdHVyZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1NpdGUgd2l0aCBzcGFjZS9pbnN0YWxsL2ZlYXR1cmVzIHNwYWNlL2ZlYXR1cmUzL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Nzc0MWQ5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvU2l0ZSB3aXRoIHNwYWNlL2luc3RhbGwvZmVhdHVyZXMgc3BhY2UvZmVhdHVyZTMvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMyIgaW1hZ2U9ImZlYXR1cmUxLmdpZiIgbGFiZWw9IlRoaXJkIEZlYXR1cmUiIHByb3ZpZGVyLW5hbWU9IlNtYXJ0IENvbXBhbnkiIHZlcnNpb249IjEuMC4wIiA+DQotICA8ZGVzY3JpcHRpb24+RGVzY3JpcHRpb248L2Rlc2NyaXB0aW9uPg0KLSAgPGNvcHlyaWdodD5jb3B5cmlnaHQ8L2NvcHlyaWdodD4NCi0gIDxsaWNlbnNlPmxpY2Vuc2U8L2xpY2Vuc2U+DQotICA8dXJsPg0KLSAgICA8dXBkYXRlIGxhYmVsPSJVUkwgdG8gdXBkYXRlIHRoZSBmZWF0dXJlIiB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvcGF0aC9mZWF0dXJlMS8iLz4NCi0gICAgPGRpc2NvdmVyeSBsYWJlbD0iRGlzY292ZXJ5IDEiIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyIvPg0KLSAgICA8ZGlzY292ZXJ5IGxhYmVsPSJEaXNjb3ZlcnkgMiIgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIi8+DQotICA8L3VybD4NCi08L2ZlYXR1cmU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9TaXRlIHdpdGggc3BhY2UvcGx1Z2lucyBzcGFjZS9QZGVfY29yZS5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1NpdGUgd2l0aCBzcGFjZS9wbHVnaW5zIHNwYWNlL1BkZV9jb3JlLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjEwNzIxNy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1NpdGUgd2l0aCBzcGFjZS9wbHVnaW5zIHNwYWNlL1BkZV9jb3JlLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvU2l0ZSB3aXRoIHNwYWNlL3BsdWdpbnMgc3BhY2UvaGVscC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1NpdGUgd2l0aCBzcGFjZS9wbHVnaW5zIHNwYWNlL2hlbHAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTg0ZjY2Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvU2l0ZSB3aXRoIHNwYWNlL3BsdWdpbnMgc3BhY2UvaGVscC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1NpdGUgd2l0aCBzcGFjZS9wbHVnaW5zIHNwYWNlL2p1bml0XzMuNy5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1NpdGUgd2l0aCBzcGFjZS9wbHVnaW5zIHNwYWNlL2p1bml0XzMuNy5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3NTg3YjIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9TaXRlIHdpdGggc3BhY2UvcGx1Z2lucyBzcGFjZS9qdW5pdF8zLjcuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9TaXRlIHdpdGggc3BhY2Uvc2l0ZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1NpdGUgd2l0aCBzcGFjZS9zaXRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVkNGJiZi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1NpdGUgd2l0aCBzcGFjZS9zaXRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHNpdGU+DQotPGRlc2NyaXB0aW9uIHVybD0iaW5mby9zaXRlSW5mby5odG1sIi8+DQotICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzIHNwYWNlL2hlbHBGZWF0dXJlLmphciI+DQotICAgIDxjYXRlZ29yeSBuYW1lPSJlY2xpcHNlL1VNTCIvPg0KLSAgPC9mZWF0dXJlPg0KLSAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcyBzcGFjZS9zcGFjZSBmZWF0dXJlLmphciI+DQotICAgIDxjYXRlZ29yeSBuYW1lPSJlY2xpcHNlL0oyRUUiLz4NCi0gIDwvZmVhdHVyZT4NCi0NCi0gIDxhcmNoaXZlIHBhdGg9InBsdWdpbnMvb3JnLmVjbGlwc2UuaGVscF8xLjAuMC5qYXIiIHVybD0icGx1Z2lucyBzcGFjZS9oZWxwLmphciIvPg0KLSAgPGFyY2hpdmUgcGF0aD0icGx1Z2lucy9vcmcuZWNsaXBzZS5wZGUuY29yZV8xLjAuMC5qYXIiIHVybD0icGx1Z2lucyBzcGFjZS9QZGVfY29yZS5qYXIiLz4NCi0gIDxhcmNoaXZlIHBhdGg9InBsdWdpbnMvb3JnLmp1bml0XzMuNS4wLmphciIgdXJsPSJwbHVnaW5zIHNwYWNlL2p1bml0XzMuNy5qYXIiLz4NCi0gIDxhcmNoaXZlIHBhdGg9InBsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLnBsdWdpbjFfMS4xLjEiIHVybD0icGx1Z2lucyBzcGFjZS9vcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMV8xLjEuMSIvPiAgDQotICA8Y2F0ZWdvcnktZGVmIGxhYmVsPSJJQk0gV1NBRCBUb29scyIgbmFtZT0iZWNsaXBzZSIvPg0KLSAgPGNhdGVnb3J5LWRlZiBsYWJlbD0iSjJFRSB0b29scyIgbmFtZT0iZWNsaXBzZS9KMkVFIi8+DQotICA8Y2F0ZWdvcnktZGVmIGxhYmVsPSJFSkIgVG9vbHMiIG5hbWU9ImVjbGlwc2UvSjJFRS9FSkIiLz4NCi0gIDxjYXRlZ29yeS1kZWYgbGFiZWw9IlVNTCB0b29scyIgbmFtZT0iZWNsaXBzZS9VTUwiLz4NCi0gIDxjYXRlZ29yeS1kZWYgbGFiZWw9Ik1lc3NhZ2luZyBUb29scyIgbmFtZT0iQjJCIi8+ICANCi08L3NpdGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyL2ZlYXR1cmVzL2hlbHBGZWF0dXJlLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlci9mZWF0dXJlcy9oZWxwRmVhdHVyZS5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlYzY3ZDQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyL2ZlYXR1cmVzL2hlbHBGZWF0dXJlLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlci9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wZGUuZmVhdHVyZV8xLjAuMC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGRlLmZlYXR1cmVfMS4wLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzBiNDBhLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlci9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wZGUuZmVhdHVyZV8xLjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIvaW5mby9pbWcvdG9wX3RpdGxzbS5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIvaW5mby9pbWcvdG9wX3RpdGxzbS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5MTdiYjYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyL2luZm8vaW1nL3RvcF90aXRsc20uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyL2luZm8vaW1nL3dlbF9tbC5qcGcgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIvaW5mby9pbWcvd2VsX21sLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFlMzNkZi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIvaW5mby9pbWcvd2VsX21sLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlci9pbmZvL3NpdGVJbmZvLmh0bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIvaW5mby9zaXRlSW5mby5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDY1YWEzLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlci9pbmZvL3NpdGVJbmZvLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCi08aHRtbD4NCi08aGVhZD4NCi08L2hlYWQ+DQotICA8Ym9keT4NCi08aW1nIHNyYz0iaW1nL3RvcF90aXRsc20uZ2lmIiBhbHQ9IiIgd2lkdGg9IjQ2MCIgaGVpZ2h0PSI1MCI+DQotPGJyPg0KLTxicj4NCi0gICAgIEl0IHN0YXJ0ZWQgd2l0aCBTbWFsbHRhbGs8YnI+DQotICAgIE9USSBoYXMgYmVlbiBidWlsZGluZyB0b29scyBmb3IgcGxhdGZvcm0taW5kZXBlbmRlbnQgT08gZGV2ZWxvcG1lbnQgc2luY2UNCi0gIDE5ODguIE91ciBFTlZZJnJlZzsgdGVjaG5vbG9neSBmaXJzdCBicm91Z2h0IGNvbGxhYm9yYXRpdmUgc29mdHdhcmUgZGV2ZWxvcG1lbnQsDQotICB2ZXJzaW9uIG1hbmFnZW1lbnQgYW5kIHNoYXJlZCByZXBvc2l0b3JpZXMgdG8gU21hbGx0YWxrLiBJQk0gaXMgb25lIG9mDQotbWFueSAgIGNvbXBhbmllcyB0byBsaWNlbnNlIEVOVlksIHdoaWNoIGNvbnRpbnVlcyB0byBiZSB0aGUgZm91bmRhdGlvbiBvZg0KLVZpc3VhbEFnZSZyZWc7ICAgU21hbGx0YWxrLjxicj4NCi08YnI+DQotPGJyPg0KLTxicj4NCi0gICAgICBOZXh0IGNhbWUgSmF2YSYjODQ4Mjs8YnI+DQotICAgIEJlY2F1c2Ugb2Ygb3VyIGV4cGVydGlzZSBpbiBPTyB0ZWNobm9sb2d5LCBJQk0gdHVybmVkIHRvIE9USSBmb3IgYSBuZXh0LWdlbmVyYXRpb24NCi0gIGRldmVsb3BtZW50IGVudmlyb25tZW50IGZvciBKYXZhLiBUaGUgcmVzdWx0IGlzIFZpc3VhbEFnZSBmb3IgSmF2YSwgd2hpY2gNCi0gIGNvbnRpbnVlcyB0byB3aW4gYXdhcmRzIGZvciBpdHMgaW5ub3ZhdGl2ZSBJREUgYW5kIHRlYW0gc3VwcG9ydC4gSW5mb1dvcmxkDQotICBoYXMgY2hvc2VuIFZpc3VhbEFnZSBmb3IgSmF2YSBhcyBkZXZlbG9wbWVudCB0b29sIG9mIHRoZSB5ZWFyIC0geWVhciBhZnRlcg0KLSAgeWVhciBhZnRlciB5ZWFyITxicj4NCi08YnI+DQotPGJyPg0KLTxicj4NCi0gICAgICBUaGVuIHBlcnZhc2l2ZSBjb21wdXRpbmc8YnI+DQotICAgIE9USSBjb250aW51ZXMgaXRzIGRldmVsb3BtZW50IG9mIElCTSdzIFZpc3VhbEFnZSBNaWNybyBFZGl0aW9uLCBhIHN0YXRlLW9mLXRoZS1hcnQNCi0gIHBsYXRmb3JtIGZvciBjb2xsYWJvcmF0aXZlIGRldmVsb3BtZW50IG9mIGVtYmVkZGVkIGFwcGxpY2F0aW9ucyBhbmQgc3lzdGVtcw0KLSAgdGhhdCBhcmUgdmVyeSBsZWFuLiBBcyB0aGUgc3RlYWR5IHN0cmVhbSBvZiBwcmVzcyByZWxlYXNlcyBhdHRlc3RzLCBWaXN1YWxBZ2UNCi0gIE1pY3JvIEVkaXRpb24gaXMgYWxyZWFkeSBsaWNlbnNlZCB0byB0aGUgbGVhZGluZyBtaWNyb2NoaXAgbWFudWZhY3R1cmVycywNCi0gIG1pY3Jva2VybmVsIGRldmVsb3BlcnMsIGFuZCBwcm9kdWNlcnMgb2YgaGFuZGhlbGQgYW5kIGNvbnN1bWVyIGRldmljZXMuPGJyPg0KLTxicj4NCi08YnI+DQotPGJyPg0KLSAgICAgIE5vdyBpdCdzIEVjbGlwc2U8YnI+DQotICAgIE9USSBoYXMgYnVpbHQgdGhlIG5leHQgZ2VuZXJhdGlvbiBJQk0gYXBwbGljYXRpb24gZGV2ZWxvcG1lbnQgdG9vbHMgcGxhdGZvcm0uDQotICBFY2xpcHNlIGlzIGEga2luZCBvZiB1bml2ZXJzYWwgdG9vbCBwbGF0Zm9ybSAtIGFuIG9wZW4gZXh0ZW5zaWJsZSBJREUgZm9yDQotICBhbnl0aGluZyBhbmQgbm90aGluZyBpbiBwYXJ0aWN1bGFyLiBUaGUgcmVhbCB2YWx1ZSBjb21lcyBmcm9tIHRvb2wgcGx1Zy1pbnMNCi0gIHRoYXQgInRlYWNoIiBFY2xpcHNlIGhvdyB0byB3b3JrIHdpdGggdGhpbmdzIC0gamF2YSBmaWxlcywgd2ViIGNvbnRlbnQsDQotZ3JhcGhpY3MsICB2aWRlbyAtIGFsbW9zdCBhbnl0aGluZyB5b3UgY2FuIGltYWdpbmUuIEVjbGlwc2UgYWxsb3dzIHlvdSB0bw0KLWluZGVwZW5kZW50bHkgIGRldmVsb3AgdG9vbHMgdGhhdCBpbnRlZ3JhdGUgd2l0aCBvdGhlciBwZW9wbGUncyB0b29scyBzbw0KLXNlYW1sZXNzbHkgeW91IHdvbid0IGtub3cgd2hlcmUgb25lIHRvb2wgZW5kcyBhbmQgYW5vdGhlciBzdGFydHMuIFRoZSBJQk0NCi1zdXBwb3J0ZWQgdmVyc2lvbiBvZiB0aGlzIHRlY2hub2xvZ3ksIFdlYlNwaGVyZSBTdHVkaW8gV29ya2JlbmNoLCB3aWxsIGJlDQotdGhlIGNvcmUgb2YgdGhlIG5leHQgIGdlbmVyYXRpb24gb2YgSUJNIGFuZCBJQk0gQnVzaW5lc3MgUGFydG5lciBlLWJ1c2luZXNzDQotdG9vbHMgb3B0aW1pemVkIGZvciAgdGhlIFdlYlNwaGVyZSBzb2Z0d2FyZSBwbGF0Zm9ybS48YnI+DQotPGJyPg0KLTxicj4NCi08YnI+DQotICAgICAgU28gd2hhdCdzIG5leHQ/PGJyPg0KLSAgICBPVEkgY29udGludWVzIHRvIGRlbGl2ZXIgb2JqZWN0LW9yaWVudGVkIHRlY2hub2xvZ3kgdGhhdCBzY2FsZXMgYWNyb3NzDQotIHBsYXRmb3JtcywgIGFjcm9zcyB0ZWFtcyBhbmQgYWNyb3NzIHByb2plY3Qgc2l6ZS4gRnJvbSBhIG1haW5mcmFtZSB0byBhDQotd2F0Y2ggIC0gd2UncmUgIGNsb3NpbmcgaW4gb24gdGhhdCB2aXNpb24uPGJyPg0KLTxicj4NCi08aW1nIHNyYz0iaW1nL3dlbF9tbC5qcGciIHdpZHRoPSI0NjAiIGhlaWdodD0iNDYwIiBhbHQ9IiI+DQotPGJyPg0KLTxicj4NCi08YnI+DQotPGJyPg0KLTxicj4NCi08YnI+DQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIvcGx1Z2lucy9QZGVfY29yZS5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIvcGx1Z2lucy9QZGVfY29yZS5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxMDcyMTcuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyL3BsdWdpbnMvUGRlX2NvcmUuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyL3BsdWdpbnMvaGVscC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIvcGx1Z2lucy9oZWxwLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU4NGY2Ni4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIvcGx1Z2lucy9oZWxwLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlci9wbHVnaW5zL2p1bml0XzMuNy5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIvcGx1Z2lucy9qdW5pdF8zLjcuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzU4N2IyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlci9wbHVnaW5zL2p1bml0XzMuNy5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIvc2l0ZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIvc2l0ZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlNWZkYTcuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyL3NpdGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08c2l0ZSA+DQotPGRlc2NyaXB0aW9uIHVybD0iaW5mby9zaXRlSW5mby5odG1sIi8+DQotICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL2hlbHBGZWF0dXJlLmphciI+DQotICAgIDxjYXRlZ29yeSBuYW1lPSJlY2xpcHNlL1VNTCIvPg0KLSAgPC9mZWF0dXJlPg0KLSAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5wZGUuZmVhdHVyZV8xLjAuMC5qYXIiPg0KLSAgICA8Y2F0ZWdvcnkgbmFtZT0iZWNsaXBzZS9KMkVFIi8+DQotICA8L2ZlYXR1cmU+DQotICA8YXJjaGl2ZSBwYXRoPSJwbHVnaW5zL29yZy5lY2xpcHNlLmhlbHBfMS4wLjAuamFyIiB1cmw9InBsdWdpbnMvaGVscC5qYXIiLz4NCi0gIDxhcmNoaXZlIHBhdGg9InBsdWdpbnMvb3JnLmVjbGlwc2UucGRlLmNvcmVfMS4wLjAuamFyIiB1cmw9InBsdWdpbnMvUGRlX2NvcmUuamFyIi8+DQotICA8YXJjaGl2ZSBwYXRoPSJwbHVnaW5zL29yZy5qdW5pdF8zLjUuMC5qYXIiIHVybD0icGx1Z2lucy9qdW5pdF8zLjcuamFyIi8+DQotICA8Y2F0ZWdvcnktZGVmIGxhYmVsPSJJQk0gV1NBRCBUb29scyIgbmFtZT0iZWNsaXBzZSIvPg0KLSAgPGNhdGVnb3J5LWRlZiBsYWJlbD0iSjJFRSB0b29scyIgbmFtZT0iZWNsaXBzZS9KMkVFIi8+DQotICA8Y2F0ZWdvcnktZGVmIGxhYmVsPSJFSkIgVG9vbHMiIG5hbWU9ImVjbGlwc2UvSjJFRS9FSkIiLz4NCi0gIDxjYXRlZ29yeS1kZWYgbGFiZWw9IlVNTCB0b29scyIgbmFtZT0iZWNsaXBzZS9VTUwiLz4NCi0gIDxjYXRlZ29yeS1kZWYgbGFiZWw9Ik1lc3NhZ2luZyBUb29scyIgbmFtZT0iQjJCIi8+ICANCi08L3NpdGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyMi9mZWF0dXJlcy9mZWF0dXJlczIuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyMi9mZWF0dXJlcy9mZWF0dXJlczIuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWRmNzJjLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvZmVhdHVyZXMvZmVhdHVyZXMyLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvZmVhdHVyZXMvb3JnLmVjbGlwc2UudGVzdC5mZWF0dXJlXzEuMC4wLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvZmVhdHVyZXMvb3JnLmVjbGlwc2UudGVzdC5mZWF0dXJlXzEuMC4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFhZWUzZi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIyL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnRlc3QuZmVhdHVyZV8xLjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIyL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxXzEuMC40LmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvZmVhdHVyZXMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTFfMS4wLjQuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTE1ZmY0Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvZmVhdHVyZXMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTFfMS4wLjQuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyMi9mZWF0dXJlcy9vcmcuZWNsaXBzZV90ZXN0X2ZlYXR1cmUuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyMi9mZWF0dXJlcy9vcmcuZWNsaXBzZV90ZXN0X2ZlYXR1cmUuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYmUzOGQzLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvZmVhdHVyZXMvb3JnLmVjbGlwc2VfdGVzdF9mZWF0dXJlLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvbmVzdGVkRmVhdHVyZVNpdGVUZXN0L2ZlYXR1cmVzL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmNoaWxkcmVuZmVhdHVyZV8yLjAuMC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIyL25lc3RlZEZlYXR1cmVTaXRlVGVzdC9mZWF0dXJlcy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5jaGlsZHJlbmZlYXR1cmVfMi4wLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjI2NjVjLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvbmVzdGVkRmVhdHVyZVNpdGVUZXN0L2ZlYXR1cmVzL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmNoaWxkcmVuZmVhdHVyZV8yLjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIyL25lc3RlZEZlYXR1cmVTaXRlVGVzdC9mZWF0dXJlcy9yb290ZmVhdHVyZS5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIyL25lc3RlZEZlYXR1cmVTaXRlVGVzdC9mZWF0dXJlcy9yb290ZmVhdHVyZS5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1MTk4MDMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyMi9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QvZmVhdHVyZXMvcm9vdGZlYXR1cmUuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyMi9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4xXzMuNS42LmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvbmVzdGVkRmVhdHVyZVNpdGVUZXN0L3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMV8zLjUuNi5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkOWY1YmMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyMi9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4xXzMuNS42LmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvbmVzdGVkRmVhdHVyZVNpdGVUZXN0L3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMl81LjAuMC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIyL25lc3RlZEZlYXR1cmVTaXRlVGVzdC9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjJfNS4wLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjRiMDRhLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvbmVzdGVkRmVhdHVyZVNpdGVUZXN0L3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMl81LjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIyL25lc3RlZEZlYXR1cmVTaXRlVGVzdC9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjJfNS4wLjEuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyMi9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4yXzUuMC4xLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTIyMDhmZS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIyL25lc3RlZEZlYXR1cmVTaXRlVGVzdC9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjJfNS4wLjEuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyMi9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3Qvc2l0ZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIyL25lc3RlZEZlYXR1cmVTaXRlVGVzdC9zaXRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2IwOWM4Ni4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIyL25lc3RlZEZlYXR1cmVTaXRlVGVzdC9zaXRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxzaXRlPgotICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL3Jvb3RmZWF0dXJlLmphciIgb3M9IioiLz4KLTwvc2l0ZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIyL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZlYXR1cmUyXzEuMC4wL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZlYXR1cmUyXzIuMi4yLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmVhdHVyZTJfMS4wLjAvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmVhdHVyZTJfMi4yLjIuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDBkODgyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmVhdHVyZTJfMS4wLjAvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmVhdHVyZTJfMi4yLjIuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyMi9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZlYXR1cmUxLnBsdWdpbjFfMS4xLjEuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyMi9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZlYXR1cmUxLnBsdWdpbjFfMS4xLjEuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzk5NWQ1Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5mZWF0dXJlMS5wbHVnaW4xXzEuMS4xLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5mZWF0dXJlMi5wbHVnaW4yXzIuMi4yLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5mZWF0dXJlMi5wbHVnaW4yXzIuMi4yLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGM5OTVkNS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIyL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmVhdHVyZTIucGx1Z2luMl8yLjIuMi5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIyL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZHVtbXlfNy45LjguamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyMi9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmR1bW15XzcuOS44LmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY3MzdmNi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIyL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZHVtbXlfNy45LjguamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyMi9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjFfMy41LjYuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyMi9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjFfMy41LjYuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjg2OTBmLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4xXzMuNS42LmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4yXzUuMC4wLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4yXzUuMC4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTBhNjEyZi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIyL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMl81LjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIyL3NpdGUucHJvcGVydGllcyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvc2l0ZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDI5YzhlLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvc2l0ZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLWRyaXZlcnM9UmVxdWlyZWQgRHJpdmVycw0KLXNlY3VyaXR5PVNlY3VyaXR5IEZpeGVzDQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyMi9zaXRlLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvc2l0ZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1N2Q5YjIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyMi9zaXRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHNpdGUgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzIiBuYW1lPSJUZXN0cyIgdmVyc2lvbj0iMC4wLjEiPg0KLSAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS50ZXN0LmZlYXR1cmVfMS4wLjAuamFyIj4NCi0gICAgPGNhdGVnb3J5IG5hbWU9ImNhdGVnb3J5MSIvPg0KLSAgPC9mZWF0dXJlPg0KLSAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9mZWF0dXJlczIuamFyIj4NCi0gICAgPGNhdGVnb3J5IG5hbWU9ImNhdGVnb3J5MS9zdWJjYXQxIi8+DQotICAgIDxjYXRlZ29yeSBuYW1lPSJjYXRlZ29yeTIiLz4NCi0gIDwvZmVhdHVyZT4NCi0gIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTFfMS4wLjQuamFyIj4NCi0gICAgPGNhdGVnb3J5IG5hbWU9ImNhdGVnb3J5MSIvPg0KLSAgICA8Y2F0ZWdvcnkgbmFtZT0iY2F0ZWdvcnkyIi8+DQotICA8L2ZlYXR1cmU+DQotICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlX3Rlc3RfZmVhdHVyZS5qYXIiLz4NCi0gIDxmZWF0dXJlIHVybD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmVhdHVyZTJfMS4wLjAvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmVhdHVyZTJfMi4yLjIuamFyIj4NCi0gICAgPGNhdGVnb3J5IG5hbWU9ImNhdGVnb3J5MSIvPg0KLSAgPC9mZWF0dXJlPg0KLSAgPGZlYXR1cmUgdXJsPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5mZWF0dXJlMl8xLjAuMC9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5mZWF0dXJlMl8yLjIuMi5qYXIiPg0KLSAgPC9mZWF0dXJlPg0KLQ0KLSAgPGNhdGVnb3J5LWRlZiBuYW1lPSJjYXRlZ29yeTEvc3ViY2F0MSIgbGFiZWw9IlNwZWNpYWwgRml4Ii8+DQotICA8Y2F0ZWdvcnktZGVmIG5hbWU9ImNhdGVnb3J5MSIgbGFiZWw9IiVkcml2ZXJzIi8+DQotICA8Y2F0ZWdvcnktZGVmIG5hbWU9ImNhdGVnb3J5MiIgbGFiZWw9IiVzZWN1cml0eSIvPg0KLTwvc2l0ZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1dFQi1JTkYvd2ViLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvV0VCLUlORi93ZWIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTZkOTA0Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvV0VCLUlORi93ZWIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/Pg0KLQ0KLQ0KLTwhRE9DVFlQRSB3ZWItYXBwDQotICAgIFBVQkxJQyAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIFdlYiBBcHBsaWNhdGlvbiAyLjIvL0VOIg0KLSAgICAiaHR0cDovL2phdmEuc3VuLmNvbS9qMmVlL2R0ZHMvd2ViLWFwcF8yLjIuZHRkIj4NCi0NCi08d2ViLWFwcD4NCi0gICAgDQotPC93ZWItYXBwPg0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZS9mZWF0dXJlcy9jb20uZXhhbXBsZS5idW5kbGUuZmVhdHVyZV8xLjAuMC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGUvZmVhdHVyZXMvY29tLmV4YW1wbGUuYnVuZGxlLmZlYXR1cmVfMS4wLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGQzNTg5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZS9mZWF0dXJlcy9jb20uZXhhbXBsZS5idW5kbGUuZmVhdHVyZV8xLjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGUvcGx1Z2lucy9jb20uZXhhbXBsZS5idWRsZS5mcmFnbWVudC51aV8xLjAuMC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGUvcGx1Z2lucy9jb20uZXhhbXBsZS5idWRsZS5mcmFnbWVudC51aV8xLjAuMC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3OWQyY2QuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlL3BsdWdpbnMvY29tLmV4YW1wbGUuYnVkbGUuZnJhZ21lbnQudWlfMS4wLjAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlL3BsdWdpbnMvY29tLmV4YW1wbGUuYnVuZGxlLmZyYWdtZW50XzEuMC4wLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZS9wbHVnaW5zL2NvbS5leGFtcGxlLmJ1bmRsZS5mcmFnbWVudF8xLjAuMC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkYjAyYmIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlL3BsdWdpbnMvY29tLmV4YW1wbGUuYnVuZGxlLmZyYWdtZW50XzEuMC4wLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZS9wbHVnaW5zL2NvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4udWlfMi4wLjAuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlL3BsdWdpbnMvY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi51aV8yLjAuMC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyZWMwMmMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlL3BsdWdpbnMvY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi51aV8yLjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGUvcGx1Z2lucy9jb20uZXhhbXBsZS5idW5kbGUucGx1Z2luXzEuMC4wLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZS9wbHVnaW5zL2NvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW5fMS4wLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjFiNjkzLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZS9wbHVnaW5zL2NvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW5fMS4wLjAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlL3NpdGUueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlL3NpdGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWIxMzMyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZS9zaXRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxzaXRlPgotICAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9jb20uZXhhbXBsZS5idW5kbGUuZmVhdHVyZV8xLjAuMC5qYXIiIGlkPSJjb20uZXhhbXBsZS5idW5kbGUuZmVhdHVyZSIgdmVyc2lvbj0iMS4wLjAiPgotICAgICAgPGNhdGVnb3J5IG5hbWU9IkJ1bmRsZUZlYXR1cmUiLz4KLSAgIDwvZmVhdHVyZT4KLSAgIDxjYXRlZ29yeS1kZWYgbmFtZT0iQnVuZGxlRmVhdHVyZSIgbGFiZWw9IkZlYXR1cmUgd2l0aCBCdW5kbGVzIi8+Ci08L3NpdGU+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVkbGUuZnJhZ21lbnQudWkvLmNsYXNzcGF0aCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idWRsZS5mcmFnbWVudC51aS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjVhYzA2Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idWRsZS5mcmFnbWVudC51aS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1ZGxlLmZyYWdtZW50LnVpLy5wcm9qZWN0IGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1ZGxlLmZyYWdtZW50LnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTIwOTAzLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idWRsZS5mcmFnbWVudC51aS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPmNvbS5leGFtcGxlLmJ1ZGxlLmZyYWdtZW50LnVpPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JCTxwcm9qZWN0PmNvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW48L3Byb2plY3Q+Ci0JCTxwcm9qZWN0PmNvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4udWk8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmNvcmUucnVudGltZTwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UudWk8L3Byb2plY3Q+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idWRsZS5mcmFnbWVudC51aS8udGVtcGxhdGUgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVkbGUuZnJhZ21lbnQudWkvLnRlbXBsYXRlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2JjZDQxLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idWRsZS5mcmFnbWVudC51aS8udGVtcGxhdGUKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGZvcm0+DQotICAgPHAvPjxwPjxiPlRpcHMgb24gd29ya2luZyB3aXRoIHRoaXMgcGx1Zy1pbiBwcm9qZWN0PC9iPjwvcD48bGk+Rm9yIHRoZSB2aWV3IG9mIHRoZSBuZXcgcGx1Zy1pbiBhdCBhIGdsYW5jZSwgZ28gdG8gdGhlIDxpbWcgaHJlZj0icGFnZUltYWdlIi8+PGEgaHJlZj0iT3ZlcnZpZXdQYWdlIj5PdmVydmlldzwvYT4uPC9saT48bGk+WW91IGNhbiB0ZXN0IHRoZSBjb250cmlidXRpb25zIG9mIHRoaXMgcGx1Zy1pbiBieSBsYXVuY2hpbmcgYW5vdGhlciBpbnN0YW5jZSBvZiB0aGUgd29ya2JlbmNoLiBPbiB0aGUgPGI+UnVuPC9iPiBtZW51LCBjbGljayA8Yj5SdW4gQXM8L2I+IGFuZCBjaG9vc2UgPGltZyBocmVmPSJydW5UaW1lV29ya2JlbmNoSW1hZ2UiLz48YSBocmVmPSJhY3Rpb24ucnVuIj5SdW4tdGltZSBXb3JrYmVuY2g8L2E+IGZyb20gdGhlIGF2YWlsYWJsZSBjaG9pY2VzLjwvbGk+PGxpPllvdSBjYW4gYWRkIG1vcmUgZnVuY3Rpb25hbGl0eSB0byB0aGlzIHBsdWctaW4gYnkgYWRkaW5nIGV4dGVuc2lvbnMgdXNpbmcgdGhlIDxhIGhyZWY9ImFjdGlvbi5uZXdFeHRlbnNpb24iPk5ldyBFeHRlbnNpb24gV2l6YXJkPC9hPi48L2xpPjxsaT5UaGUgcGx1Zy1pbiBwcm9qZWN0IGNvbnRhaW5zIEphdmEgY29kZSB0aGF0IHlvdSBjYW4gZGVidWcuIFBsYWNlIGJyZWFrcG9pbnRzIGluIEphdmEgY2xhc3Nlcy4gT24gdGhlIDxiPlJ1bjwvYj4gbWVudSwgc2VsZWN0IDxiPkRlYnVnIEFzPC9iPiBhbmQgY2hvb3NlIDxpbWcgaHJlZj0icnVuVGltZVdvcmtiZW5jaEltYWdlIi8+PGEgaHJlZj0iYWN0aW9uLmRlYnVnIj5SdW4tdGltZSBXb3JrYmVuY2g8L2E+IGZyb20gdGhlIGF2YWlsYWJsZSBjaG9pY2VzLjwvbGk+DQotPC9mb3JtPg0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idWRsZS5mcmFnbWVudC51aS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idWRsZS5mcmFnbWVudC51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmFkNjg2Zi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVkbGUuZnJhZ21lbnQudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLUdlbmVyYXRlZC1mcm9tOiAxMDc3MDYyOTc0NDUxDQotQnVuZGxlLU5hbWU6IFVpIEZyYWdtZW50DQotQnVuZGxlLVZlcnNpb246IDEuMC4wDQotQnVuZGxlLVN5bWJvbGljTmFtZTogY29tLmV4YW1wbGUuYnVkbGUuZnJhZ21lbnQudWkNCi1CdW5kbGUtVmVuZG9yOiBFY2xpcHNlLm9yZw0KLUJ1bmRsZS1DbGFzc1BhdGg6IHVpLmphcg0KLUxlZ2FjeTogdHJ1ZQ0KLUZyYWdtZW50LUhvc3Q6IGNvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4udWk7IGJ1bmRsZS12ZXJzaW9uPTIuMC4wDQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1ZGxlLmZyYWdtZW50LnVpL2J1aWxkLnByb3BlcnRpZXMgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVkbGUuZnJhZ21lbnQudWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODAwYTk5My4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVkbGUuZnJhZ21lbnQudWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS51aS5qYXIgPSBzcmMvCi1vdXRwdXQudWkuamFyID0gYmluLwotYmluLmluY2x1ZGVzID0gZnJhZ21lbnQueG1sLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICB1aS5qYXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idWRsZS5mcmFnbWVudC51aS9mcmFnbWVudC54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVkbGUuZnJhZ21lbnQudWkvZnJhZ21lbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzQ4NGIzLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idWRsZS5mcmFnbWVudC51aS9mcmFnbWVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPGZyYWdtZW50Ci0gICBpZD0iY29tLmV4YW1wbGUuYnVkbGUuZnJhZ21lbnQudWkiCi0gICBuYW1lPSJVaSBGcmFnbWVudCIKLSAgIHZlcnNpb249IjEuMC4wIgotICAgcHJvdmlkZXItbmFtZT0iRWNsaXBzZS5vcmciCi0gICBwbHVnaW4taWQ9ImNvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4udWkiCi0gICBwbHVnaW4tdmVyc2lvbj0iMi4wLjAiCi0gICBtYXRjaD0iZ3JlYXRlck9yRXF1YWwiPgotCi0gICA8cnVudGltZT4KLSAgICAgIDxsaWJyYXJ5IG5hbWU9InVpLmphciI+Ci0gICAgICAgICA8ZXhwb3J0IG5hbWU9IioiLz4KLSAgICAgIDwvbGlicmFyeT4KLSAgIDwvcnVudGltZT4KLQotPC9mcmFnbWVudD4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUuZmVhdHVyZS8ucHJvamVjdCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGYzZTRiYy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5jb20uZXhhbXBsZS5idW5kbGUuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0NjQ0MWMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbApkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjQxMDQzLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9ImNvbS5leGFtcGxlLmJ1bmRsZS5mZWF0dXJlIgotICAgICAgbGFiZWw9ImNvbS5leGFtcGxlLmJ1bmRsZS5mZWF0dXJlIgotICAgICAgdmVyc2lvbj0iMS4wLjAiCi0gICAgICBwcm92aWRlci1uYW1lPSJFY2xpcHNlLm9yZyI+Ci0KLSAgIDxsaWNlbnNlPgotICAgICAgQSBwbGFjZWhvbGRlciBsaWNlbnNlIGZvciB0aGUgZmVhdHVyZS4KLSAgIDwvbGljZW5zZT4KLQotICAgPGluc3RhbGwtaGFuZGxlci8+Ci0KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIvPgotICAgPC9yZXF1aXJlcz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9ImNvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMS4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9ImNvbS5leGFtcGxlLmJ1ZGxlLmZyYWdtZW50LnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjEuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9ImNvbS5leGFtcGxlLmJ1bmRsZS5mcmFnbWVudCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIxLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJjb20uZXhhbXBsZS5idW5kbGUucGx1Z2luLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjIuMC4wIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUuZnJhZ21lbnQvLmNsYXNzcGF0aCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUuZnJhZ21lbnQvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY1YWMwNi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLmZyYWdtZW50Ly5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLmZyYWdtZW50Ly5wcm9qZWN0IGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5mcmFnbWVudC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDZkMGMyMS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLmZyYWdtZW50Ly5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+Y29tLmV4YW1wbGUuYnVuZGxlLmZyYWdtZW50PC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JCTxwcm9qZWN0PmNvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW48L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmNvcmUucnVudGltZTwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UudWk8L3Byb2plY3Q+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUuZnJhZ21lbnQvLnRlbXBsYXRlIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5mcmFnbWVudC8udGVtcGxhdGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzYmNkNDEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5mcmFnbWVudC8udGVtcGxhdGUKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGZvcm0+DQotICAgPHAvPjxwPjxiPlRpcHMgb24gd29ya2luZyB3aXRoIHRoaXMgcGx1Zy1pbiBwcm9qZWN0PC9iPjwvcD48bGk+Rm9yIHRoZSB2aWV3IG9mIHRoZSBuZXcgcGx1Zy1pbiBhdCBhIGdsYW5jZSwgZ28gdG8gdGhlIDxpbWcgaHJlZj0icGFnZUltYWdlIi8+PGEgaHJlZj0iT3ZlcnZpZXdQYWdlIj5PdmVydmlldzwvYT4uPC9saT48bGk+WW91IGNhbiB0ZXN0IHRoZSBjb250cmlidXRpb25zIG9mIHRoaXMgcGx1Zy1pbiBieSBsYXVuY2hpbmcgYW5vdGhlciBpbnN0YW5jZSBvZiB0aGUgd29ya2JlbmNoLiBPbiB0aGUgPGI+UnVuPC9iPiBtZW51LCBjbGljayA8Yj5SdW4gQXM8L2I+IGFuZCBjaG9vc2UgPGltZyBocmVmPSJydW5UaW1lV29ya2JlbmNoSW1hZ2UiLz48YSBocmVmPSJhY3Rpb24ucnVuIj5SdW4tdGltZSBXb3JrYmVuY2g8L2E+IGZyb20gdGhlIGF2YWlsYWJsZSBjaG9pY2VzLjwvbGk+PGxpPllvdSBjYW4gYWRkIG1vcmUgZnVuY3Rpb25hbGl0eSB0byB0aGlzIHBsdWctaW4gYnkgYWRkaW5nIGV4dGVuc2lvbnMgdXNpbmcgdGhlIDxhIGhyZWY9ImFjdGlvbi5uZXdFeHRlbnNpb24iPk5ldyBFeHRlbnNpb24gV2l6YXJkPC9hPi48L2xpPjxsaT5UaGUgcGx1Zy1pbiBwcm9qZWN0IGNvbnRhaW5zIEphdmEgY29kZSB0aGF0IHlvdSBjYW4gZGVidWcuIFBsYWNlIGJyZWFrcG9pbnRzIGluIEphdmEgY2xhc3Nlcy4gT24gdGhlIDxiPlJ1bjwvYj4gbWVudSwgc2VsZWN0IDxiPkRlYnVnIEFzPC9iPiBhbmQgY2hvb3NlIDxpbWcgaHJlZj0icnVuVGltZVdvcmtiZW5jaEltYWdlIi8+PGEgaHJlZj0iYWN0aW9uLmRlYnVnIj5SdW4tdGltZSBXb3JrYmVuY2g8L2E+IGZyb20gdGhlIGF2YWlsYWJsZSBjaG9pY2VzLjwvbGk+DQotPC9mb3JtPg0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUuZnJhZ21lbnQvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLmZyYWdtZW50L01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDY2NDgwLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUuZnJhZ21lbnQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLUdlbmVyYXRlZC1mcm9tOiAxMDc3MDYyOTA5NDg3DQotQnVuZGxlLU5hbWU6IEZyYWdtZW50IEZyYWdtZW50DQotQnVuZGxlLVZlcnNpb246IDEuMC4wDQotQnVuZGxlLVN5bWJvbGljTmFtZTogY29tLmV4YW1wbGUuYnVuZGxlLmZyYWdtZW50DQotQnVuZGxlLVZlbmRvcjogRWNsaXBzZS5vcmcNCi1CdW5kbGUtQ2xhc3NQYXRoOiBmcmFnbWVudC5qYXINCi1MZWdhY3k6IHRydWUNCi1GcmFnbWVudC1Ib3N0OiBjb20uZXhhbXBsZS5idW5kbGUucGx1Z2luOyBidW5kbGUtdmVyc2lvbj0xLjAuMA0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUuZnJhZ21lbnQvYnVpbGQucHJvcGVydGllcyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUuZnJhZ21lbnQvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdhMTk1Zi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLmZyYWdtZW50L2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zb3VyY2UuZnJhZ21lbnQuamFyID0gc3JjLwotb3V0cHV0LmZyYWdtZW50LmphciA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IGZyYWdtZW50LnhtbCxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgZnJhZ21lbnQuamFyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLmZyYWdtZW50L2ZyYWdtZW50LnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUuZnJhZ21lbnQvZnJhZ21lbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTVjZDZlLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUuZnJhZ21lbnQvZnJhZ21lbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxmcmFnbWVudAotICAgaWQ9ImNvbS5leGFtcGxlLmJ1bmRsZS5mcmFnbWVudCIKLSAgIG5hbWU9IkZyYWdtZW50IEZyYWdtZW50IgotICAgdmVyc2lvbj0iMS4wLjAiCi0gICBwcm92aWRlci1uYW1lPSJFY2xpcHNlLm9yZyIKLSAgIHBsdWdpbi1pZD0iY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbiIKLSAgIHBsdWdpbi12ZXJzaW9uPSIxLjAuMCI+Ci0KLSAgIDxydW50aW1lPgotICAgICAgPGxpYnJhcnkgbmFtZT0iZnJhZ21lbnQuamFyIj4KLSAgICAgICAgIDxleHBvcnQgbmFtZT0iKiIvPgotICAgICAgPC9saWJyYXJ5PgotICAgPC9ydW50aW1lPgotCi08L2ZyYWdtZW50PgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4udWkvLmNsYXNzcGF0aCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUucGx1Z2luLnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NWFjMDYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4udWkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUucGx1Z2luLnVpLy5wcm9qZWN0IGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4udWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzYzM1NTMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4udWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5jb20uZXhhbXBsZS5idW5kbGUucGx1Z2luLnVpPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JCTxwcm9qZWN0PmNvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW48L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmNvcmUucnVudGltZTwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UudWk8L3Byb2plY3Q+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUucGx1Z2luLnVpLy50ZW1wbGF0ZSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUucGx1Z2luLnVpLy50ZW1wbGF0ZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNiY2Q0MS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi51aS8udGVtcGxhdGUKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGZvcm0+DQotICAgPHAvPjxwPjxiPlRpcHMgb24gd29ya2luZyB3aXRoIHRoaXMgcGx1Zy1pbiBwcm9qZWN0PC9iPjwvcD48bGk+Rm9yIHRoZSB2aWV3IG9mIHRoZSBuZXcgcGx1Zy1pbiBhdCBhIGdsYW5jZSwgZ28gdG8gdGhlIDxpbWcgaHJlZj0icGFnZUltYWdlIi8+PGEgaHJlZj0iT3ZlcnZpZXdQYWdlIj5PdmVydmlldzwvYT4uPC9saT48bGk+WW91IGNhbiB0ZXN0IHRoZSBjb250cmlidXRpb25zIG9mIHRoaXMgcGx1Zy1pbiBieSBsYXVuY2hpbmcgYW5vdGhlciBpbnN0YW5jZSBvZiB0aGUgd29ya2JlbmNoLiBPbiB0aGUgPGI+UnVuPC9iPiBtZW51LCBjbGljayA8Yj5SdW4gQXM8L2I+IGFuZCBjaG9vc2UgPGltZyBocmVmPSJydW5UaW1lV29ya2JlbmNoSW1hZ2UiLz48YSBocmVmPSJhY3Rpb24ucnVuIj5SdW4tdGltZSBXb3JrYmVuY2g8L2E+IGZyb20gdGhlIGF2YWlsYWJsZSBjaG9pY2VzLjwvbGk+PGxpPllvdSBjYW4gYWRkIG1vcmUgZnVuY3Rpb25hbGl0eSB0byB0aGlzIHBsdWctaW4gYnkgYWRkaW5nIGV4dGVuc2lvbnMgdXNpbmcgdGhlIDxhIGhyZWY9ImFjdGlvbi5uZXdFeHRlbnNpb24iPk5ldyBFeHRlbnNpb24gV2l6YXJkPC9hPi48L2xpPjxsaT5UaGUgcGx1Zy1pbiBwcm9qZWN0IGNvbnRhaW5zIEphdmEgY29kZSB0aGF0IHlvdSBjYW4gZGVidWcuIFBsYWNlIGJyZWFrcG9pbnRzIGluIEphdmEgY2xhc3Nlcy4gT24gdGhlIDxiPlJ1bjwvYj4gbWVudSwgc2VsZWN0IDxiPkRlYnVnIEFzPC9iPiBhbmQgY2hvb3NlIDxpbWcgaHJlZj0icnVuVGltZVdvcmtiZW5jaEltYWdlIi8+PGEgaHJlZj0iYWN0aW9uLmRlYnVnIj5SdW4tdGltZSBXb3JrYmVuY2g8L2E+IGZyb20gdGhlIGF2YWlsYWJsZSBjaG9pY2VzLjwvbGk+DQotPC9mb3JtPg0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUucGx1Z2luLnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4udWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzNTA3YTkuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4udWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi1HZW5lcmF0ZWQtZnJvbTogMTA3NzA2Mjk5OTgyNw0KLUJ1bmRsZS1OYW1lOiBVaSBQbHVnLWluDQotQnVuZGxlLVZlcnNpb246IDIuMC4wDQotQnVuZGxlLVN5bWJvbGljTmFtZTogY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi51aQ0KLUJ1bmRsZS1WZW5kb3I6IEVjbGlwc2Uub3JnDQotQnVuZGxlLUNsYXNzUGF0aDogdWkuamFyDQotTGVnYWN5OiB0cnVlDQotQnVuZGxlLUFjdGl2YXRvcjogY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi51aS5VaVBsdWdpbg0KLVJlcXVpcmUtQnVuZGxlOiANCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLA0KLSBvcmcuZWNsaXBzZS51aSwNCi0gY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbjsgYnVuZGxlLXZlcnNpb249MS4wLjA7dmVyc2lvbi1tYXRjaD1wZXJmZWN0DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4udWkvYmluL2NvbS9leGFtcGxlL2J1bmRsZS9wbHVnaW4vdWkvVWlQbHVnaW4uY2xhc3MgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi51aS9iaW4vY29tL2V4YW1wbGUvYnVuZGxlL3BsdWdpbi91aS9VaVBsdWdpbi5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY3MzE4OS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi51aS9iaW4vY29tL2V4YW1wbGUvYnVuZGxlL3BsdWdpbi91aS9VaVBsdWdpbi5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUucGx1Z2luLnVpL2J1aWxkLnByb3BlcnRpZXMgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi51aS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTI3MGI2Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUucGx1Z2luLnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zb3VyY2UudWkuamFyID0gc3JjLwotb3V0cHV0LnVpLmphciA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIHVpLmphcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4udWkvcGx1Z2luLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUucGx1Z2luLnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlZmZkZWYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4udWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luCi0gICBpZD0iY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi51aSIKLSAgIG5hbWU9IlVpIFBsdWctaW4iCi0gICB2ZXJzaW9uPSIyLjAuMCIKLSAgIHByb3ZpZGVyLW5hbWU9IkVjbGlwc2Uub3JnIgotICAgY2xhc3M9ImNvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4udWkuVWlQbHVnaW4iPgotCi0gICA8cnVudGltZT4KLSAgICAgIDxsaWJyYXJ5IG5hbWU9InVpLmphciI+Ci0gICAgICAgICA8ZXhwb3J0IG5hbWU9IioiLz4KLSAgICAgIDwvbGlicmFyeT4KLSAgIDwvcnVudGltZT4KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49ImNvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4iIHZlcnNpb249IjEuMC4wIiBtYXRjaD0icGVyZmVjdCIvPgotICAgPC9yZXF1aXJlcz4KLQotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUucGx1Z2luLnVpL3NyYy9jb20vZXhhbXBsZS9idW5kbGUvcGx1Z2luL3VpL1VpUGx1Z2luLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi51aS9zcmMvY29tL2V4YW1wbGUvYnVuZGxlL3BsdWdpbi91aS9VaVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGM0NGQ0Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUucGx1Z2luLnVpL3NyYy9jb20vZXhhbXBsZS9idW5kbGUvcGx1Z2luL3VpL1VpUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2UgY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi4qOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotaW1wb3J0IGphdmEudXRpbC4qOwotCi0vKioKLSAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgotICovCi1wdWJsaWMgY2xhc3MgVWlQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQkvL1RoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgVWlQbHVnaW4gcGx1Z2luOwotCS8vUmVzb3VyY2UgYnVuZGxlLgotCXByaXZhdGUgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGU7Ci0JCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBVaVBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQkJdHJ5IHsKLQkJCXJlc291cmNlQnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJjb20uZXhhbXBsZS5idW5kbGUucGx1Z2luLnVpLlVpUGx1Z2luUmVzb3VyY2VzIik7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB4KSB7Ci0JCQlyZXNvdXJjZUJ1bmRsZSA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdXBvbiBwbHVnLWluIGFjdGl2YXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgcGx1Zy1pbiBpcyBzdG9wcGVkCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFVpUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RyaW5nIGZyb20gdGhlIHBsdWdpbidzIHJlc291cmNlIGJ1bmRsZSwKLQkgKiBvciAna2V5JyBpZiBub3QgZm91bmQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSkgewotCQlSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBVaVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UmVzb3VyY2VCdW5kbGUoKTsKLQkJdHJ5IHsKLQkJCXJldHVybiAoYnVuZGxlICE9IG51bGwpID8gYnVuZGxlLmdldFN0cmluZyhrZXkpIDoga2V5OwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGtleTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBsdWdpbidzIHJlc291cmNlIGJ1bmRsZSwKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoKSB7Ci0JCXJldHVybiByZXNvdXJjZUJ1bmRsZTsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi8uY2xhc3NwYXRoIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4vLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY1YWMwNi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4vLnByb2plY3QgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTcxOWQ3My4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPmNvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW48L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuY29yZS5ydW50aW1lPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS51aTwvcHJvamVjdD4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4vLnRlbXBsYXRlIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4vLnRlbXBsYXRlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2JjZDQxLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUucGx1Z2luLy50ZW1wbGF0ZQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08Zm9ybT4NCi0gICA8cC8+PHA+PGI+VGlwcyBvbiB3b3JraW5nIHdpdGggdGhpcyBwbHVnLWluIHByb2plY3Q8L2I+PC9wPjxsaT5Gb3IgdGhlIHZpZXcgb2YgdGhlIG5ldyBwbHVnLWluIGF0IGEgZ2xhbmNlLCBnbyB0byB0aGUgPGltZyBocmVmPSJwYWdlSW1hZ2UiLz48YSBocmVmPSJPdmVydmlld1BhZ2UiPk92ZXJ2aWV3PC9hPi48L2xpPjxsaT5Zb3UgY2FuIHRlc3QgdGhlIGNvbnRyaWJ1dGlvbnMgb2YgdGhpcyBwbHVnLWluIGJ5IGxhdW5jaGluZyBhbm90aGVyIGluc3RhbmNlIG9mIHRoZSB3b3JrYmVuY2guIE9uIHRoZSA8Yj5SdW48L2I+IG1lbnUsIGNsaWNrIDxiPlJ1biBBczwvYj4gYW5kIGNob29zZSA8aW1nIGhyZWY9InJ1blRpbWVXb3JrYmVuY2hJbWFnZSIvPjxhIGhyZWY9ImFjdGlvbi5ydW4iPlJ1bi10aW1lIFdvcmtiZW5jaDwvYT4gZnJvbSB0aGUgYXZhaWxhYmxlIGNob2ljZXMuPC9saT48bGk+WW91IGNhbiBhZGQgbW9yZSBmdW5jdGlvbmFsaXR5IHRvIHRoaXMgcGx1Zy1pbiBieSBhZGRpbmcgZXh0ZW5zaW9ucyB1c2luZyB0aGUgPGEgaHJlZj0iYWN0aW9uLm5ld0V4dGVuc2lvbiI+TmV3IEV4dGVuc2lvbiBXaXphcmQ8L2E+LjwvbGk+PGxpPlRoZSBwbHVnLWluIHByb2plY3QgY29udGFpbnMgSmF2YSBjb2RlIHRoYXQgeW91IGNhbiBkZWJ1Zy4gUGxhY2UgYnJlYWtwb2ludHMgaW4gSmF2YSBjbGFzc2VzLiBPbiB0aGUgPGI+UnVuPC9iPiBtZW51LCBzZWxlY3QgPGI+RGVidWcgQXM8L2I+IGFuZCBjaG9vc2UgPGltZyBocmVmPSJydW5UaW1lV29ya2JlbmNoSW1hZ2UiLz48YSBocmVmPSJhY3Rpb24uZGVidWciPlJ1bi10aW1lIFdvcmtiZW5jaDwvYT4gZnJvbSB0aGUgYXZhaWxhYmxlIGNob2ljZXMuPC9saT4NCi08L2Zvcm0+DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4vTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmMxYWRhZi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLUdlbmVyYXRlZC1mcm9tOiAxMDc3MDYyNjAzNzA4DQotQnVuZGxlLU5hbWU6IFBsdWdpbiBQbHVnLWluDQotQnVuZGxlLVZlcnNpb246IDEuMC4wDQotQnVuZGxlLVN5bWJvbGljTmFtZTogY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbg0KLUJ1bmRsZS1WZW5kb3I6IEVYQU1QTEUNCi1CdW5kbGUtQ2xhc3NQYXRoOiBwbHVnaW4uamFyDQotTGVnYWN5OiB0cnVlDQotQnVuZGxlLUFjdGl2YXRvcjogY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi5QbHVnaW5QbHVnaW4NCi1SZXF1aXJlLUJ1bmRsZTogDQotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwNCi0gb3JnLmVjbGlwc2UudWkNCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi9iaW4vY29tL2V4YW1wbGUvYnVuZGxlL3BsdWdpbi9QbHVnaW5QbHVnaW4uY2xhc3MgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi9iaW4vY29tL2V4YW1wbGUvYnVuZGxlL3BsdWdpbi9QbHVnaW5QbHVnaW4uY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2Y2FmMDMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4vYmluL2NvbS9leGFtcGxlL2J1bmRsZS9wbHVnaW4vUGx1Z2luUGx1Z2luLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4vYnVpbGQucHJvcGVydGllcyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUucGx1Z2luL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhMjkzMGYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4vYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS5wbHVnaW4uamFyID0gc3JjLwotb3V0cHV0LnBsdWdpbi5qYXIgPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4uamFyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi9wbHVnaW4ueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4vcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk3YmM3Ni4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4KLSAgIGlkPSJjb20uZXhhbXBsZS5idW5kbGUucGx1Z2luIgotICAgbmFtZT0iUGx1Z2luIFBsdWctaW4iCi0gICB2ZXJzaW9uPSIxLjAuMCIKLSAgIHByb3ZpZGVyLW5hbWU9IkVjbGlwc2Uub3JnIgotICAgY2xhc3M9ImNvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4uUGx1Z2luUGx1Z2luIj4KLQotICAgPHJ1bnRpbWU+Ci0gICAgICA8bGlicmFyeSBuYW1lPSJwbHVnaW4uamFyIj4KLSAgICAgICAgIDxleHBvcnQgbmFtZT0iKiIvPgotICAgICAgPC9saWJyYXJ5PgotICAgPC9ydW50aW1lPgotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIi8+Ci0gICA8L3JlcXVpcmVzPgotCi0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4vc3JjL2NvbS9leGFtcGxlL2J1bmRsZS9wbHVnaW4vUGx1Z2luUGx1Z2luLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi9zcmMvY29tL2V4YW1wbGUvYnVuZGxlL3BsdWdpbi9QbHVnaW5QbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg4MGRjOS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi9zcmMvY29tL2V4YW1wbGUvYnVuZGxlL3BsdWdpbi9QbHVnaW5QbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBjb20uZXhhbXBsZS5idW5kbGUucGx1Z2luOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLio7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLS8qKgotICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIHRvIGJlIHVzZWQgaW4gdGhlIGRlc2t0b3AuCi0gKi8KLXB1YmxpYyBjbGFzcyBQbHVnaW5QbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQkvL1RoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgUGx1Z2luUGx1Z2luIHBsdWdpbjsKLQkvL1Jlc291cmNlIGJ1bmRsZS4KLQlwcml2YXRlIFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlOwotCQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgUGx1Z2luUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCQl0cnkgewotCQkJcmVzb3VyY2VCdW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoImNvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4uUGx1Z2luUGx1Z2luUmVzb3VyY2VzIik7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB4KSB7Ci0JCQlyZXNvdXJjZUJ1bmRsZSA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdXBvbiBwbHVnLWluIGFjdGl2YXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgcGx1Zy1pbiBpcyBzdG9wcGVkCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFBsdWdpblBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0cmluZyBmcm9tIHRoZSBwbHVnaW4ncyByZXNvdXJjZSBidW5kbGUsCi0JICogb3IgJ2tleScgaWYgbm90IGZvdW5kLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gUGx1Z2luUGx1Z2luLmdldERlZmF1bHQoKS5nZXRSZXNvdXJjZUJ1bmRsZSgpOwotCQl0cnkgewotCQkJcmV0dXJuIChidW5kbGUgIT0gbnVsbCkgPyBidW5kbGUuZ2V0U3RyaW5nKGtleSkgOiBrZXk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4ga2V5OwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGx1Z2luJ3MgcmVzb3VyY2UgYnVuZGxlLAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKLQkJcmV0dXJuIHJlc291cmNlQnVuZGxlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvLmNsYXNzcGF0aCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg0ODI0OS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNsYXNzcGF0aD4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+DQotPC9jbGFzc3BhdGg+DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy8uY3ZzaWdub3JlIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWU4MmQ3Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvLnByb2plY3QgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTQwZjllLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxwcm9qZWN0RGVzY3JpcHRpb24+DQotCTxuYW1lPm9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3JtczwvbmFtZT4NCi0JPGNvbW1lbnQ+PC9jb21tZW50Pg0KLQk8cHJvamVjdHM+DQotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5jb3JlLmJvb3Q8L3Byb2plY3Q+DQotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29tcGF0aWJpbGl0eTwvcHJvamVjdD4NCi0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLnVpPC9wcm9qZWN0Pg0KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UudWkuaWRlPC9wcm9qZWN0Pg0KLQk8L3Byb2plY3RzPg0KLQk8YnVpbGRTcGVjPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCTwvYnVpbGRTcGVjPg0KLQk8bmF0dXJlcz4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+DQotCTwvbmF0dXJlcz4NCi08L3Byb2plY3REZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL2Fib3V0Lmh0bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkYjQxMWEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPjIwdGggSnVuZSwgMjAwMjwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci08cD5FY2xpcHNlLm9yZyBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtDUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBDUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIENQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08aDM+Q29udHJpYnV0aW9uczwvaDM+Ci0KLTxwPklmIHRoaXMgQ29udGVudCBpcyBsaWNlbnNlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBDUEwsIGFueSBDb250cmlidXRpb25zLCBhcyBkZWZpbmVkIGluIHRoZSBDUEwsIHVwbG9hZGVkLCBzdWJtaXR0ZWQsIG9yIG90aGVyd2lzZQotbWFkZSBhdmFpbGFibGUgdG8gRWNsaXBzZS5vcmcsIG1lbWJlcnMgb2YgRWNsaXBzZS5vcmcgYW5kL29yIHRoZSBob3N0IG9mIEVjbGlwc2Uub3JnIHdlYiBzaXRlLCBieSB5b3UgdGhhdCByZWxhdGUgdG8gc3VjaAotQ29udGVudCBhcmUgcHJvdmlkZWQgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBDUEwgYW5kIGNhbiBiZSBtYWRlIGF2YWlsYWJsZSB0byBvdGhlcnMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDUEwuPC9wPgotCi08cD5JZiB0aGlzIENvbnRlbnQgaXMgbGljZW5zZWQgdG8geW91IHVuZGVyIGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMgb3RoZXIgdGhhbiB0aGUgQ1BMICgmcXVvdDtPdGhlciBMaWNlbnNlJnF1b3Q7KSwgYW55IG1vZGlmaWNhdGlvbnMsIGVuaGFuY2VtZW50cyBhbmQvb3IKLW90aGVyIGNvZGUgYW5kL29yIGRvY3VtZW50YXRpb24gKCZxdW90O01vZGlmaWNhdGlvbnMmcXVvdDspIHVwbG9hZGVkLCBzdWJtaXR0ZWQsIG9yIG90aGVyd2lzZSBtYWRlIGF2YWlsYWJsZSB0byBFY2xpcHNlLm9yZywgbWVtYmVycyBvZiBFY2xpcHNlLm9yZyBhbmQvb3IgdGhlCi1ob3N0IG9mIEVjbGlwc2Uub3JnLCBieSB5b3UgdGhhdCByZWxhdGUgdG8gc3VjaCBDb250ZW50IGFyZSBwcm92aWRlZCB1bmRlciB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgT3RoZXIgTGljZW5zZSBhbmQgY2FuIGJlIG1hZGUgYXZhaWxhYmxlCi10byBvdGhlcnMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPdGhlciBMaWNlbnNlLiAgSW4gYWRkaXRpb24sIHdpdGggcmVnYXJkIHRvIE1vZGlmaWNhdGlvbnMgZm9yIHdoaWNoIHlvdSBhcmUgdGhlIGNvcHlyaWdodCBob2xkZXIsIHlvdSBhcmUgYWxzbwotcHJvdmlkaW5nIHRoZSBNb2RpZmljYXRpb25zIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQ1BMIGFuZCBzdWNoIE1vZGlmaWNhdGlvbnMgY2FuIGJlIG1hZGUgYXZhaWxhYmxlIHRvIG90aGVycyB1bmRlciB0aGUgdGVybXMgb2YKLXRoZSBDUEwuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9idWlsZC5wcm9wZXJ0aWVzIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGZkYTI1Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gcGx1Z2luLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgICouamFyLFwNCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwNCi0gICAgICAgICAgICAgICBhYm91dC5odG1sDQotc291cmNlLmZvcm1zLmphciA9IHNyYy8NCi1zcmMuaW5jbHVkZXMgPSBhYm91dC5odG1sDQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9wbHVnaW4ucHJvcGVydGllcyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2OTk0NzIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotIyANCi0jIENvbnRyaWJ1dG9yczoNCi0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIw0KLSMgcGx1Z2luLnhtbCBwcm9wZXJ0aWVzDQotIw0KLQ0KLW5hbWUgPSBJbnN0YWxsL1VwZGF0ZSBGb3Jtcw0KLXByb3ZpZGVyLW5hbWUgPSBFY2xpcHNlLm9yZw0KLQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvcGx1Z2luLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWIyYTE2Ny4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4NCi08cGx1Z2luDQotICAgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3JtcyINCi0gICBuYW1lPSIlbmFtZSINCi0gICB2ZXJzaW9uPSIzLjAuMCINCi0gICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXItbmFtZSINCi0gICBjbGFzcz0ib3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zLmludGVybmFsLkZvcm1zUGx1Z2luIj4NCi0NCi0gICA8cnVudGltZT4NCi0gICAgICA8bGlicmFyeSBuYW1lPSJmb3Jtcy5qYXIiPg0KLSAgICAgICAgIDxleHBvcnQgbmFtZT0iKiIvPg0KLSAgICAgICAgIDxwYWNrYWdlcyBwcmVmaXhlcz0ib3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zLmludGVybmFsIi8+DQotICAgICAgPC9saWJyYXJ5Pg0KLSAgIDwvcnVudGltZT4NCi0gICA8cmVxdWlyZXM+DQotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb21wYXRpYmlsaXR5Ii8+DQotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpIi8+DQotICAgPC9yZXF1aXJlcz4NCi0NCi0NCi08L3BsdWdpbj4NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvQWJzdHJhY3RGb3JtLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvQWJzdHJhY3RGb3JtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxMjU0NDEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL0Fic3RyYWN0Rm9ybS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuKjsNCi0NCi0vKioNCi0gKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgSUZvcm0gaW50ZXJmYWNlIGFuZA0KLSAqIHByb3ZpZGVzIHNvbWUgY29tbW9uIHNlcnZpY2VzIHRvIGl0cyBzdWJjbGFzc2VzLg0KLSAqIEl0IGhhbmRsZXMgc29tZSBjb21tb24gcHJvcGVydGllcyBsaWtlIGhlYWRpbmcNCi0gKiB0ZXh0LCBpbWFnZSBhbmQgY29sb3JzLCBhcyB3ZWxsIGFzDQotICogZm9udCBjaGFuZ2UgcHJvY2Vzc2luZy4NCi0gKi8NCi0NCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RGb3JtIGltcGxlbWVudHMgSUZvcm0sIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHsNCi0JcHJvdGVjdGVkIEZvcm1XaWRnZXRGYWN0b3J5IGZhY3Rvcnk7DQotCXByb3RlY3RlZCBDb2xvciBoZWFkaW5nQmFja2dyb3VuZDsNCi0JcHJvdGVjdGVkIENvbG9yIGhlYWRpbmdGb3JlZ3JvdW5kOw0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoZWFkaW5nVmlzaWJsZSA9IHRydWU7DQotCXByb3RlY3RlZCBJbWFnZSBoZWFkaW5nSW1hZ2U7DQotCXByb3RlY3RlZCBTdHJpbmcgaGVhZGluZ1RleHQ7DQotCXByb3RlY3RlZCBGb250IHRpdGxlRm9udDsNCi0JcHJpdmF0ZSBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBoeXBlcmxpbmtDb2xvckxpc3RlbmVyOw0KLQ0KLQlwdWJsaWMgQWJzdHJhY3RGb3JtKCkgew0KLQkJZmFjdG9yeSA9IG5ldyBGb3JtV2lkZ2V0RmFjdG9yeSgpOw0KLQkJdGl0bGVGb250ID0gSkZhY2VSZXNvdXJjZXMuZ2V0SGVhZGVyRm9udCgpOw0KLQkJSkZhY2VSZXNvdXJjZXMuZ2V0Rm9udFJlZ2lzdHJ5KCkuYWRkTGlzdGVuZXIodGhpcyk7DQotCQlJUHJlZmVyZW5jZVN0b3JlIHBzdG9yZSA9IEpGYWNlUHJlZmVyZW5jZXMuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7DQotCQloeXBlcmxpbmtDb2xvckxpc3RlbmVyID0gbmV3IElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgew0KLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgew0KLQkJCQlpZiAoZS5nZXRQcm9wZXJ0eSgpLmVxdWFscyhKRmFjZVByZWZlcmVuY2VzLkhZUEVSTElOS19DT0xPUikNCi0JCQkJCXx8IGUuZ2V0UHJvcGVydHkoKS5lcXVhbHMoDQotCQkJCQkJSkZhY2VQcmVmZXJlbmNlcy5BQ1RJVkVfSFlQRVJMSU5LX0NPTE9SKSkgew0KLQkJCQkJdXBkYXRlSHlwZXJsaW5rQ29sb3JzKCk7DQotCQkJCX0NCi0JCQl9DQotCQl9Ow0KLQkJcHN0b3JlLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoaHlwZXJsaW5rQ29sb3JMaXN0ZW5lcik7DQotCX0NCi0JDQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUh5cGVybGlua0NvbG9ycygpIHsNCi0JCWZhY3RvcnkudXBkYXRlSHlwZXJsaW5rQ29sb3JzKCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIEBzZWUgSUZvcm0jY29tbWl0Q2hhbmdlcyhib29sZWFuKQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgY29tbWl0Q2hhbmdlcyhib29sZWFuIG9uU2F2ZSkgew0KLQl9DQotDQotCS8qKg0KLQkgKiBAc2VlIElGb3JtI2NyZWF0ZUNvbnRyb2woQ29tcG9zaXRlKQ0KLQkgKi8NCi0JcHVibGljIGFic3RyYWN0IENvbnRyb2wgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KTsNCi0NCi0JLyoqDQotCSAqIEBzZWUgSUZvcm0jZGlzcG9zZSgpDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgew0KLQkJZmFjdG9yeS5kaXNwb3NlKCk7DQotCQlKRmFjZVJlc291cmNlcy5nZXRGb250UmVnaXN0cnkoKS5yZW1vdmVMaXN0ZW5lcih0aGlzKTsNCi0JCUlQcmVmZXJlbmNlU3RvcmUgcHN0b3JlID0gSkZhY2VQcmVmZXJlbmNlcy5nZXRQcmVmZXJlbmNlU3RvcmUoKTsNCi0JCXBzdG9yZS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHRoaXMpOw0KLQkJcHN0b3JlLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoaHlwZXJsaW5rQ29sb3JMaXN0ZW5lcik7DQotCX0NCi0NCi0JLyoqDQotCSAqIEBzZWUgSUZvcm0jZG9HbG9iYWxBY3Rpb24oU3RyaW5nKQ0KLQkgKi8NCi0JcHVibGljIGJvb2xlYW4gZG9HbG9iYWxBY3Rpb24oU3RyaW5nIGFjdGlvbklkKSB7DQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi0NCi0JLyoqDQotCSAqIEBzZWUgSUZvcm0jZXhwYW5kVG8oT2JqZWN0KQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgZXhwYW5kVG8oT2JqZWN0IG9iamVjdCkgew0KLQl9DQotDQotCS8qKg0KLQkgKiBAc2VlIElGb3JtI2dldENvbnRyb2woKQ0KLQkgKi8NCi0JcHVibGljIGFic3RyYWN0IENvbnRyb2wgZ2V0Q29udHJvbCgpOw0KLQ0KLQkvKioNCi0JICogQHNlZSBJRm9ybSNnZXRGYWN0b3J5KCkNCi0JICovDQotCXB1YmxpYyBGb3JtV2lkZ2V0RmFjdG9yeSBnZXRGYWN0b3J5KCkgew0KLQkJcmV0dXJuIGZhY3Rvcnk7DQotCX0NCi0NCi0JLyoqDQotCSAqIEBzZWUgSUZvcm0jZ2V0SGVhZGluZ0JhY2tncm91bmQoKQ0KLQkgKi8NCi0JcHVibGljIENvbG9yIGdldEhlYWRpbmdCYWNrZ3JvdW5kKCkgew0KLQkJcmV0dXJuIGhlYWRpbmdCYWNrZ3JvdW5kOw0KLQl9DQotDQotCS8qKg0KLQkgKiBAc2VlIElGb3JtI2dldEhlYWRpbmdGb3JlZ3JvdW5kKCkNCi0JICovDQotCXB1YmxpYyBDb2xvciBnZXRIZWFkaW5nRm9yZWdyb3VuZCgpIHsNCi0JCXJldHVybiBoZWFkaW5nRm9yZWdyb3VuZDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQHNlZSBJRm9ybSNnZXRIZWFkaW5nSW1hZ2UoKQ0KLQkgKi8NCi0JcHVibGljIEltYWdlIGdldEhlYWRpbmdJbWFnZSgpIHsNCi0JCXJldHVybiBoZWFkaW5nSW1hZ2U7DQotCX0NCi0NCi0JLyoqDQotCSAqIEBzZWUgSUZvcm0jZ2V0SGVhZGluZygpDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldEhlYWRpbmdUZXh0KCkgew0KLQkJaWYgKGhlYWRpbmdUZXh0ID09IG51bGwpDQotCQkJcmV0dXJuICIiOw0KLQkJcmV0dXJuIGhlYWRpbmdUZXh0Ow0KLQl9DQotDQotCS8qKg0KLQkgKiBAc2VlIElGb3JtI2luaXRpYWxpemUoT2JqZWN0KQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShPYmplY3QgbW9kZWwpIHsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQHNlZSBJRm9ybSNpc0hlYWRpbmdWaXNpYmxlKCkNCi0JICovDQotCXB1YmxpYyBib29sZWFuIGlzSGVhZGluZ1Zpc2libGUoKSB7DQotCQlyZXR1cm4gaGVhZGluZ1Zpc2libGU7DQotCX0NCi0NCi0JLyoqDQotCSAqIEBzZWUgSUZvcm0jcmVnaXN0ZXJTZWN0aW9uKEZvcm1TZWN0aW9uKQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgcmVnaXN0ZXJTZWN0aW9uKEZvcm1TZWN0aW9uIHNlY3Rpb24pIHsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQHNlZSBJRm9ybSNzZXRGb2N1cygpDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQHNlZSBJRm9ybSNzZXRIZWFkaW5nQmFja2dyb3VuZChDb2xvcikNCi0JICovDQotCXB1YmxpYyB2b2lkIHNldEhlYWRpbmdCYWNrZ3JvdW5kKENvbG9yIG5ld0hlYWRpbmdCYWNrZ3JvdW5kKSB7DQotCQl0aGlzLmhlYWRpbmdCYWNrZ3JvdW5kID0gbmV3SGVhZGluZ0JhY2tncm91bmQ7DQotCX0NCi0NCi0JLyoqDQotCSAqIEBzZWUgSUZvcm0jc2V0SGVhZGluZ0ZvcmVncm91bmQoQ29sb3IpDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRIZWFkaW5nRm9yZWdyb3VuZChDb2xvciBuZXdIZWFkaW5nRm9yZWdyb3VuZCkgew0KLQkJdGhpcy5oZWFkaW5nRm9yZWdyb3VuZCA9IG5ld0hlYWRpbmdGb3JlZ3JvdW5kOw0KLQl9DQotDQotCS8qKg0KLQkgKiBAc2VlIElGb3JtI3NldEhlYWRpbmdJbWFnZShJbWFnZSkNCi0JICovDQotCXB1YmxpYyB2b2lkIHNldEhlYWRpbmdJbWFnZShJbWFnZSBoZWFkaW5nSW1hZ2UpIHsNCi0JCXRoaXMuaGVhZGluZ0ltYWdlID0gaGVhZGluZ0ltYWdlOw0KLQl9DQotDQotCS8qKg0KLQkgKiBAc2VlIElGb3JtI3NldEhlYWRpbmdWaXNpYmxlKGJvb2xlYW4pDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRIZWFkaW5nVmlzaWJsZShib29sZWFuIG5ld0hlYWRpbmdWaXNpYmxlKSB7DQotCQl0aGlzLmhlYWRpbmdWaXNpYmxlID0gbmV3SGVhZGluZ1Zpc2libGU7DQotCX0NCi0NCi0JLyoqDQotCSAqIEBzZWUgSUZvcm0jc2V0SGVhZGluZyhTdHJpbmcpDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRIZWFkaW5nVGV4dChTdHJpbmcgaGVhZGluZ1RleHQpIHsNCi0JCXRoaXMuaGVhZGluZ1RleHQgPSBoZWFkaW5nVGV4dDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQHNlZSBJRm9ybSN1cGRhdGUoKQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgew0KLQl9DQotDQotCXByb3RlY3RlZCBib29sZWFuIGNhblBlcmZvcm1EaXJlY3RseShTdHJpbmcgaWQsIENvbnRyb2wgY29udHJvbCkgew0KLQkJaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBUZXh0KSB7DQotCQkJVGV4dCB0ZXh0ID0gKFRleHQpIGNvbnRyb2w7DQotCQkJaWYgKGlkLmVxdWFscyhBY3Rpb25GYWN0b3J5LkNVVC5nZXRJZCgpKSkgew0KLQkJCQl0ZXh0LmN1dCgpOw0KLQkJCQlyZXR1cm4gdHJ1ZTsNCi0JCQl9DQotCQkJaWYgKGlkLmVxdWFscyhBY3Rpb25GYWN0b3J5LkNPUFkuZ2V0SWQoKSkpIHsNCi0JCQkJdGV4dC5jb3B5KCk7DQotCQkJCXJldHVybiB0cnVlOw0KLQkJCX0NCi0JCQlpZiAoaWQuZXF1YWxzKEFjdGlvbkZhY3RvcnkuUEFTVEUuZ2V0SWQoKSkpIHsNCi0JCQkJdGV4dC5wYXN0ZSgpOw0KLQkJCQlyZXR1cm4gdHJ1ZTsNCi0JCQl9DQotCQkJaWYgKGlkLmVxdWFscyhBY3Rpb25GYWN0b3J5LlNFTEVDVF9BTEwuZ2V0SWQoKSkpIHsNCi0JCQkJdGV4dC5zZWxlY3RBbGwoKTsNCi0JCQkJcmV0dXJuIHRydWU7DQotCQkJfQ0KLQkJCWlmIChpZC5lcXVhbHMoQWN0aW9uRmFjdG9yeS5ERUxFVEUuZ2V0SWQoKSkpIHsNCi0JCQkJaW50IGNvdW50ID0gdGV4dC5nZXRTZWxlY3Rpb25Db3VudCgpOw0KLQkJCQlpZiAoY291bnQgPT0gMCkgew0KLQkJCQkJaW50IGNhcmV0UG9zID0gdGV4dC5nZXRDYXJldFBvc2l0aW9uKCk7DQotCQkJCQl0ZXh0LnNldFNlbGVjdGlvbihjYXJldFBvcywgY2FyZXRQb3MgKyAxKTsNCi0JCQkJfQ0KLQkJCQl0ZXh0Lmluc2VydCgiIik7DQotCQkJCXJldHVybiB0cnVlOw0KLQkJCX0NCi0JCX0NCi0JCXJldHVybiBmYWxzZTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvQWJzdHJhY3RTZWN0aW9uRm9ybS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL0Fic3RyYWN0U2VjdGlvbkZvcm0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDI5MDNjYS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvQWJzdHJhY3RTZWN0aW9uRm9ybS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbDsNCi1pbXBvcnQgamF2YS51dGlsLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuQ2xpcGJvYXJkOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlNjcm9sbGVkQ29tcG9zaXRlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsNCi0NCi0vKioNCi0gKiBUaGlzIGZvcm0gY2xhc3MgdW5kZXJzdGFuZHMgZm9ybSBzZWN0aW9ucy4NCi0gKiBJdCBhc3N1bWVzIHRoYXQgdGhleSBhcmUgcGFydCBvZiB0aGUgZm9ybQ0KLSAqIGFuZCBpdCBvZmZlcnMgbGlmZSBjeWNsZSBoYW5kbGluZyBvZiBzZWN0aW9ucw0KLSAqIG9uY2UgdGhleSBhcmUgcmVnaXN0ZXJlZC4NCi0gKi8NCi0NCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RTZWN0aW9uRm9ybSBleHRlbmRzIEFic3RyYWN0Rm9ybSB7DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhfU0NST0xMX0lOQ1JFTUVOVCA9IDU7DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZfU0NST0xMX0lOQ1JFTUVOVCA9IDY0Ow0KLQlwcm90ZWN0ZWQgVmVjdG9yIHNlY3Rpb25zID0gbnVsbDsNCi0NCi0JcHVibGljIHZvaWQgcmVnaXN0ZXJTZWN0aW9uKEZvcm1TZWN0aW9uIHNlY3Rpb24pIHsNCi0JCWlmIChzZWN0aW9ucyA9PSBudWxsKQ0KLQkJCXNlY3Rpb25zID0gbmV3IFZlY3RvcigpOw0KLQkJaWYgKCFzZWN0aW9ucy5jb250YWlucyhzZWN0aW9uKSkNCi0JCQlzZWN0aW9ucy5hZGQoc2VjdGlvbik7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdW5yZWdpc3RlclNlY3Rpb24oRm9ybVNlY3Rpb24gc2VjdGlvbikgew0KLQkJaWYgKHNlY3Rpb25zICE9IG51bGwgJiYgc2VjdGlvbnMuY29udGFpbnMoc2VjdGlvbikpDQotCQkJc2VjdGlvbnMucmVtb3ZlKHNlY3Rpb24pOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoT2JqZWN0IG1vZGVsKSB7DQotCQlpZiAoc2VjdGlvbnMgIT0gbnVsbCkgew0KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHNlY3Rpb25zLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgew0KLQkJCQlGb3JtU2VjdGlvbiBzZWN0aW9uID0gKEZvcm1TZWN0aW9uKSBpdGVyLm5leHQoKTsNCi0JCQkJc2VjdGlvbi5pbml0aWFsaXplKG1vZGVsKTsNCi0JCQl9DQotCQl9DQotCX0NCi0NCi0JcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7DQotCQlpZiAoc2VjdGlvbnMgIT0gbnVsbCAmJiBzZWN0aW9ucy5zaXplKCkgPiAwKSB7DQotCQkJRm9ybVNlY3Rpb24gZmlyc3RTZWN0aW9uID0gKEZvcm1TZWN0aW9uKSBzZWN0aW9ucy5maXJzdEVsZW1lbnQoKTsNCi0JCQlmaXJzdFNlY3Rpb24uc2V0Rm9jdXMoKTsNCi0JCX0NCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7DQotCQlpZiAoc2VjdGlvbnMgIT0gbnVsbCkgew0KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHNlY3Rpb25zLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgew0KLQkJCQlGb3JtU2VjdGlvbiBzZWN0aW9uID0gKEZvcm1TZWN0aW9uKSBpdGVyLm5leHQoKTsNCi0JCQkJc2VjdGlvbi51cGRhdGUoKTsNCi0JCQl9DQotCQl9DQotCX0NCi0NCi0JcHVibGljIHZvaWQgY29tbWl0Q2hhbmdlcyhib29sZWFuIG9uU2F2ZSkgew0KLQkJaWYgKHNlY3Rpb25zICE9IG51bGwpIHsNCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzZWN0aW9ucy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsNCi0JCQkJRm9ybVNlY3Rpb24gc2VjdGlvbiA9IChGb3JtU2VjdGlvbikgaXRlci5uZXh0KCk7DQotCQkJCWlmIChzZWN0aW9uLmlzRGlydHkoKSkNCi0JCQkJCXNlY3Rpb24uY29tbWl0Q2hhbmdlcyhvblNhdmUpOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQ0KLQlwdWJsaWMgYm9vbGVhbiBkb0dsb2JhbEFjdGlvbihTdHJpbmcgYWN0aW9uSWQpIHsNCi0JCUNvbnRyb2wgZm9jdXNDb250cm9sID0gZ2V0Rm9jdXNDb250cm9sKCk7DQotCQlpZiAoZm9jdXNDb250cm9sID09IG51bGwpDQotCQkJcmV0dXJuIGZhbHNlOw0KLQ0KLQkJaWYgKGNhblBlcmZvcm1EaXJlY3RseShhY3Rpb25JZCwgZm9jdXNDb250cm9sKSkNCi0JCQlyZXR1cm4gdHJ1ZTsNCi0JCUNvbXBvc2l0ZSBwYXJlbnQgPSBmb2N1c0NvbnRyb2wuZ2V0UGFyZW50KCk7DQotCQlGb3JtU2VjdGlvbiB0YXJnZXRTZWN0aW9uID0gbnVsbDsNCi0JCXdoaWxlIChwYXJlbnQgIT0gbnVsbCkgew0KLQkJCU9iamVjdCBkYXRhID0gcGFyZW50LmdldERhdGEoKTsNCi0JCQlpZiAoZGF0YSAhPSBudWxsICYmIGRhdGEgaW5zdGFuY2VvZiBGb3JtU2VjdGlvbikgew0KLQkJCQl0YXJnZXRTZWN0aW9uID0gKEZvcm1TZWN0aW9uKSBkYXRhOw0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJcGFyZW50ID0gcGFyZW50LmdldFBhcmVudCgpOw0KLQkJfQ0KLQkJaWYgKHRhcmdldFNlY3Rpb24gIT0gbnVsbCkgew0KLQkJCXJldHVybiB0YXJnZXRTZWN0aW9uLmRvR2xvYmFsQWN0aW9uKGFjdGlvbklkKTsNCi0JCX0NCi0JCXJldHVybiBmYWxzZTsNCi0JfQ0KLQ0KLQlwcm90ZWN0ZWQgQ29udHJvbCBnZXRGb2N1c0NvbnRyb2woKSB7DQotCQlDb250cm9sIGNvbnRyb2wgPSBnZXRDb250cm9sKCk7DQotCQlpZiAoY29udHJvbCA9PSBudWxsIHx8IGNvbnRyb2wuaXNEaXNwb3NlZCgpKQ0KLQkJCXJldHVybiBudWxsOw0KLQkJRGlzcGxheSBkaXNwbGF5ID0gY29udHJvbC5nZXREaXNwbGF5KCk7DQotCQlDb250cm9sIGZvY3VzQ29udHJvbCA9IGRpc3BsYXkuZ2V0Rm9jdXNDb250cm9sKCk7DQotCQlpZiAoZm9jdXNDb250cm9sID09IG51bGwgfHwgZm9jdXNDb250cm9sLmlzRGlzcG9zZWQoKSkNCi0JCQlyZXR1cm4gbnVsbDsNCi0JCXJldHVybiBmb2N1c0NvbnRyb2w7DQotCX0NCi0NCi0JcHVibGljIGJvb2xlYW4gY2FuUGFzdGUoQ2xpcGJvYXJkIGNsaXBib2FyZCkgew0KLQkJQ29udHJvbCBmb2N1c0NvbnRyb2wgPSBnZXRGb2N1c0NvbnRyb2woKTsNCi0JCWlmIChmb2N1c0NvbnRyb2wgPT0gbnVsbCkNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQlDb21wb3NpdGUgcGFyZW50ID0gZm9jdXNDb250cm9sLmdldFBhcmVudCgpOw0KLQkJRm9ybVNlY3Rpb24gdGFyZ2V0U2VjdGlvbiA9IG51bGw7DQotCQl3aGlsZSAocGFyZW50ICE9IG51bGwpIHsNCi0JCQlPYmplY3QgZGF0YSA9IHBhcmVudC5nZXREYXRhKCk7DQotCQkJaWYgKGRhdGEgIT0gbnVsbCAmJiBkYXRhIGluc3RhbmNlb2YgRm9ybVNlY3Rpb24pIHsNCi0JCQkJdGFyZ2V0U2VjdGlvbiA9IChGb3JtU2VjdGlvbikgZGF0YTsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCXBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnQoKTsNCi0JCX0NCi0JCWlmICh0YXJnZXRTZWN0aW9uICE9IG51bGwpIHsNCi0JCQlyZXR1cm4gdGFyZ2V0U2VjdGlvbi5jYW5QYXN0ZShjbGlwYm9hcmQpOw0KLQkJfQ0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7DQotCQlpZiAoc2VjdGlvbnMgIT0gbnVsbCkgew0KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHNlY3Rpb25zLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgew0KLQkJCQlGb3JtU2VjdGlvbiBzZWN0aW9uID0gKEZvcm1TZWN0aW9uKSBpdGVyLm5leHQoKTsNCi0JCQkJc2VjdGlvbi5kaXNwb3NlKCk7DQotCQkJfQ0KLQkJfQ0KLQkJc3VwZXIuZGlzcG9zZSgpOw0KLQl9DQotDQotCXB1YmxpYyBzdGF0aWMgdm9pZCBlbnN1cmVWaXNpYmxlKFNjcm9sbGVkQ29tcG9zaXRlIHNjb21wLCBDb250cm9sIGNvbnRyb2wpIHsNCi0JCVBvaW50IGNvbnRyb2xTaXplID0gY29udHJvbC5nZXRTaXplKCk7DQotCQlQb2ludCBjb250cm9sT3JpZ2luID0gZ2V0Q29udHJvbExvY2F0aW9uKHNjb21wLCBjb250cm9sKTsNCi0JCWVuc3VyZVZpc2libGUoc2NvbXAsIGNvbnRyb2xPcmlnaW4sIGNvbnRyb2xTaXplKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgc3RhdGljIHZvaWQgZW5zdXJlVmlzaWJsZShTY3JvbGxlZENvbXBvc2l0ZSBzY29tcCwgUG9pbnQgY29udHJvbE9yaWdpbiwgUG9pbnQgY29udHJvbFNpemUpIHsNCi0JCVBvaW50IGFyZWEgPSBzY29tcC5nZXRDb250ZW50KCkuZ2V0U2l6ZSgpOw0KLQkJUG9pbnQgc2NvbXBPcmlnaW4gPSBzY29tcC5nZXRPcmlnaW4oKTsNCi0NCi0JCWludCB4ID0gc2NvbXBPcmlnaW4ueDsNCi0JCWludCB5ID0gc2NvbXBPcmlnaW4ueTsNCi0NCi0JCWlmIChjb250cm9sT3JpZ2luLnggKyBjb250cm9sU2l6ZS54ID4gc2NvbXBPcmlnaW4ueCArIGFyZWEueCkgew0KLQkJCXggPSBjb250cm9sT3JpZ2luLnggKyBjb250cm9sU2l6ZS54IC0gYXJlYS54Ow0KLQkJfQkJDQotCQlpZiAoY29udHJvbE9yaWdpbi54IDwgeCApIHsNCi0JCQkgeCA9IGNvbnRyb2xPcmlnaW4ueDsNCi0JCSB9ICAgICAgICAgDQotCQkNCi0JCWlmIChjb250cm9sT3JpZ2luLnkgKyBjb250cm9sU2l6ZS55ID4gc2NvbXBPcmlnaW4ueSArIGFyZWEueSkgew0KLQkJCXkgPSBjb250cm9sT3JpZ2luLnkgKyBjb250cm9sU2l6ZS55IC0gYXJlYS55Ow0KLQkJfQ0KLQkJaWYgKGNvbnRyb2xPcmlnaW4ueSA8IHkgKSB7DQotCQkJIHkgPSBjb250cm9sT3JpZ2luLnk7DQotCQkgfSAgICAgICAgIA0KLQkJc2NvbXAuc2V0T3JpZ2luKHgsIHkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgc3RhdGljIFBvaW50IGdldENvbnRyb2xMb2NhdGlvbihTY3JvbGxlZENvbXBvc2l0ZSBzY29tcCwgQ29udHJvbCBjb250cm9sKSB7DQotCQlpbnQgeCA9IDA7DQotCQlpbnQgeSA9IDA7DQotCQlDb250cm9sIGN1cnJlbnRDb250cm9sID0gY29udHJvbDsNCi0JCWZvciAoOzspIHsNCi0JCQlpZiAoY3VycmVudENvbnRyb2wgPT0gc2NvbXApDQotCQkJCWJyZWFrOw0KLQkJCWlmIChjdXJyZW50Q29udHJvbC5nZXRMb2NhdGlvbigpLnggPiAwKQ0KLQkJCQl4ICs9IGN1cnJlbnRDb250cm9sLmdldExvY2F0aW9uKCkueDsNCi0JCQlpZiAoY3VycmVudENvbnRyb2wuZ2V0TG9jYXRpb24oKS55ID4gMCkNCi0JCQkJeSArPSBjdXJyZW50Q29udHJvbC5nZXRMb2NhdGlvbigpLnk7DQotCQkJY3VycmVudENvbnRyb2wgPSBjdXJyZW50Q29udHJvbC5nZXRQYXJlbnQoKTsNCi0JCX0NCi0JCXJldHVybiBuZXcgUG9pbnQoeCwgeSk7DQotCX0NCi0JDQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzY3JvbGxWZXJ0aWNhbChTY3JvbGxlZENvbXBvc2l0ZSBzY29tcCwgYm9vbGVhbiB1cCkgew0KLQkJc2Nyb2xsKHNjb21wLCAwLCB1cCA/IC1WX1NDUk9MTF9JTkNSRU1FTlQgOiBWX1NDUk9MTF9JTkNSRU1FTlQpOw0KLQl9DQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzY3JvbGxIb3Jpem9udGFsKFNjcm9sbGVkQ29tcG9zaXRlIHNjb21wLCBib29sZWFuIGxlZnQpIHsNCi0JCXNjcm9sbChzY29tcCwgbGVmdCA/IC1IX1NDUk9MTF9JTkNSRU1FTlQgOiBIX1NDUk9MTF9JTkNSRU1FTlQsIDApOw0KLQl9DQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzY3JvbGxQYWdlKFNjcm9sbGVkQ29tcG9zaXRlIHNjb21wLCBib29sZWFuIHVwKSB7DQotCQlSZWN0YW5nbGUgY2xpZW50QXJlYSA9IHNjb21wLmdldENsaWVudEFyZWEoKTsNCi0JCWludCBpbmNyZW1lbnQgPSB1cCA/IC1jbGllbnRBcmVhLmhlaWdodCA6IGNsaWVudEFyZWEuaGVpZ2h0Ow0KLQkJc2Nyb2xsKHNjb21wLCAwLCBpbmNyZW1lbnQpOw0KLQl9DQotCXByaXZhdGUgc3RhdGljIHZvaWQgc2Nyb2xsKFNjcm9sbGVkQ29tcG9zaXRlIHNjb21wLCBpbnQgeG9mZnNldCwgaW50IHlvZmZzZXQpIHsNCi0JCVBvaW50IG9yaWdpbiA9IHNjb21wLmdldE9yaWdpbigpOw0KLQkJUG9pbnQgY29udGVudFNpemUgPSBzY29tcC5nZXRDb250ZW50KCkuZ2V0U2l6ZSgpOw0KLQkJaW50IHhvcmlnaW4gPSBvcmlnaW4ueCArIHhvZmZzZXQ7DQotCQlpbnQgeW9yaWdpbiA9IG9yaWdpbi55ICsgeW9mZnNldDsNCi0JCXhvcmlnaW4gPSBNYXRoLm1heCh4b3JpZ2luLCAwKTsNCi0JCXhvcmlnaW4gPSBNYXRoLm1pbih4b3JpZ2luLCBjb250ZW50U2l6ZS54IC0gMSk7DQotCQl5b3JpZ2luID0gTWF0aC5tYXgoeW9yaWdpbiwgMCk7DQotCQl5b3JpZ2luID0gTWF0aC5taW4oeW9yaWdpbiwgY29udGVudFNpemUueSAtIDEpOw0KLQkJc2NvbXAuc2V0T3JpZ2luKHhvcmlnaW4sIHlvcmlnaW4pOw0KLQl9DQotDQotCXB1YmxpYyBzdGF0aWMgdm9pZCB1cGRhdGVQYWdlSW5jcmVtZW50KFNjcm9sbGVkQ29tcG9zaXRlIHNjb21wKSB7DQotCQlTY3JvbGxCYXIgdmJhciA9IHNjb21wLmdldFZlcnRpY2FsQmFyKCk7DQotCQlpZiAodmJhciAhPSBudWxsKSB7DQotCQkJUmVjdGFuZ2xlIGNsaWVudEFyZWEgPSBzY29tcC5nZXRDbGllbnRBcmVhKCk7DQotCQkJaW50IGluY3JlbWVudCA9IGNsaWVudEFyZWEuaGVpZ2h0IC0gNTsNCi0JCQl2YmFyLnNldFBhZ2VJbmNyZW1lbnQoaW5jcmVtZW50KTsNCi0JCX0NCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvQ3VzdG9tV29ya2Jvb2suamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9DdXN0b21Xb3JrYm9vay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODhlYmNjLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9DdXN0b21Xb3JrYm9vay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsNCi1pbXBvcnQgamF2YS51dGlsLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7DQotDQotDQotcHVibGljIGNsYXNzIEN1c3RvbVdvcmtib29rIGltcGxlbWVudHMgSUZvcm1Xb3JrYm9vayB7DQotCXByaXZhdGUgSGFzaHRhYmxlIHBhZ2VzOw0KLQlwcml2YXRlIGJvb2xlYW4gZmlyc3RQYWdlU2VsZWN0ZWQ9dHJ1ZTsNCi0JcHJpdmF0ZSBDVGFiRm9sZGVyIHRhYkZvbGRlcjsNCi0JcHJpdmF0ZSBWZWN0b3IgbGlzdGVuZXJzPW5ldyBWZWN0b3IoKTsNCi0JcHJpdmF0ZSBJRm9ybVBhZ2UgY3VycmVudFBhZ2U7DQotDQotcHVibGljIEN1c3RvbVdvcmtib29rKCkgew0KLQlwYWdlcyA9IG5ldyBIYXNodGFibGUoKTsNCi19DQotcHVibGljIHZvaWQgYWRkRm9ybVNlbGVjdGlvbkxpc3RlbmVyKElGb3JtU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsNCi0JbGlzdGVuZXJzLmFkZEVsZW1lbnQobGlzdGVuZXIpOw0KLX0NCi1wdWJsaWMgdm9pZCBhZGRQYWdlKElGb3JtUGFnZSBwYWdlKSB7DQotCUNUYWJJdGVtIGl0ZW0gPSBuZXcgQ1RhYkl0ZW0odGFiRm9sZGVyLCBTV1QuTlVMTCk7DQotCWl0ZW0uc2V0VGV4dChwYWdlLmdldExhYmVsKCkpOw0KLQlpdGVtLnNldFRvb2xUaXBUZXh0KHBhZ2UuZ2V0VGl0bGUoKSk7DQotCWl0ZW0uc2V0RGF0YShwYWdlKTsNCi0JcGFnZXMucHV0KHBhZ2UsIGl0ZW0pOw0KLQkNCi0JaWYgKGZpcnN0UGFnZVNlbGVjdGVkICYmIGN1cnJlbnRQYWdlID09IG51bGwpDQotCQlzZWxlY3RQYWdlKHBhZ2UsIHRydWUpOw0KLX0NCi1wdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsNCi0JdGFiRm9sZGVyID0gbmV3IENUYWJGb2xkZXIocGFyZW50LCBTV1QuQk9UVE9NKTsNCi0JdGFiRm9sZGVyLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgew0KLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgew0KLQkJCUNUYWJJdGVtIGl0ZW0gPSAoQ1RhYkl0ZW0pIGUuaXRlbTsNCi0JCQlJRm9ybVBhZ2UgcGFnZSA9IChJRm9ybVBhZ2UpIGl0ZW0uZ2V0RGF0YSgpOw0KLQkJCWlmIChwYWdlICE9IG51bGwpDQotCQkJCXNlbGVjdFBhZ2UocGFnZSwgdHJ1ZSk7DQotCQl9DQotCX0pOw0KLQkvLyBsaXN0ZW5lciB0byByZXNpemUgdmlzaWJsZSBjb21wb25lbnRzDQotCXRhYkZvbGRlci5hZGRMaXN0ZW5lcihTV1QuUmVzaXplLCBuZXcgTGlzdGVuZXIoKSB7DQotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7DQotCQkJaWYgKGN1cnJlbnRQYWdlICE9IG51bGwpDQotCQkJCXNldENvbnRyb2xTaXplKGN1cnJlbnRQYWdlLmdldENvbnRyb2woKSk7DQotCQl9DQotCX0pOw0KLX0NCi1wcml2YXRlIHZvaWQgZmlyZVNlbGVjdGlvbkNoYW5nZWQoSUZvcm1QYWdlIHBhZ2UsIGJvb2xlYW4gc2V0Rm9jdXMpIHsNCi0JZm9yIChJdGVyYXRvciBpdGVyID0gbGlzdGVuZXJzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgew0KLQkJSUZvcm1TZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IChJRm9ybVNlbGVjdGlvbkxpc3RlbmVyKSBpdGVyLm5leHQoKTsNCi0JCWxpc3RlbmVyLmZvcm1TZWxlY3RlZChwYWdlLCBzZXRGb2N1cyk7DQotCX0NCi19DQotcHVibGljIENvbnRyb2wgZ2V0Q29udHJvbCgpIHsNCi0JcmV0dXJuIHRhYkZvbGRlcjsNCi19DQotcHVibGljIElGb3JtUGFnZSBnZXRDdXJyZW50UGFnZSgpIHsNCi0JcmV0dXJuIGN1cnJlbnRQYWdlOw0KLX0NCi1wdWJsaWMgYm9vbGVhbiBpc0ZpcnN0UGFnZVNlbGVjdGVkKCkgew0KLQlyZXR1cm4gZmlyc3RQYWdlU2VsZWN0ZWQ7DQotfQ0KLXB1YmxpYyB2b2lkIHJlbW92ZUZvcm1TZWxlY3Rpb25MaXN0ZW5lcihJRm9ybVNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7DQotCWxpc3RlbmVycy5yZW1vdmVFbGVtZW50KGxpc3RlbmVyKTsNCi19DQotcHVibGljIHZvaWQgcmVtb3ZlUGFnZShJRm9ybVBhZ2UgcGFnZSkgew0KLQlDVGFiSXRlbSBpdGVtID0gKENUYWJJdGVtKSBwYWdlcy5nZXQocGFnZSk7DQotCWlmIChpdGVtICE9IG51bGwpDQotCQlpdGVtLmRpc3Bvc2UoKTsNCi19DQotcHJpdmF0ZSB2b2lkIHJlc2VsZWN0UGFnZShmaW5hbCBJRm9ybVBhZ2UgcGFnZSkgew0KLQl0YWJGb2xkZXIuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7DQotCQlwdWJsaWMgdm9pZCBydW4oKSB7DQotCQlzZWxlY3RQYWdlKHBhZ2UsIHRydWUpOw0KLQkJfQ0KLQl9KTsNCi19DQotcHVibGljIHZvaWQgc2VsZWN0UGFnZShmaW5hbCBJRm9ybVBhZ2UgcGFnZSwgZmluYWwgYm9vbGVhbiBzZXRGb2N1cykgew0KLQlmaW5hbCBJRm9ybVBhZ2Ugb2xkUGFnZSA9IGN1cnJlbnRQYWdlOw0KLQljdXJyZW50UGFnZSA9IHBhZ2U7DQotDQotCS8vIEl0IG1heSB0YWtlIGEgd2hpbGUNCi0JQnVzeUluZGljYXRvci5zaG93V2hpbGUodGFiRm9sZGVyLmdldERpc3BsYXkoKSwgbmV3IFJ1bm5hYmxlKCkgew0KLQkJcHVibGljIHZvaWQgcnVuKCkgew0KLQkJCXN3aXRjaFBhZ2VzKG9sZFBhZ2UsIHBhZ2UsIHNldEZvY3VzKTsNCi0JCX0NCi0JfSk7DQotfQ0KLXByaXZhdGUgdm9pZCBzZXRDb250cm9sU2l6ZShDb250cm9sIGNvbnRyb2wpIHsNCi0JUmVjdGFuZ2xlIGJvdW5kcyA9IHRhYkZvbGRlci5nZXRCb3VuZHMoKTsNCi0JUmVjdGFuZ2xlIG9mZnNldCA9IHRhYkZvbGRlci5nZXRDbGllbnRBcmVhKCk7DQotCWJvdW5kcy54ICs9IG9mZnNldC54Ow0KLQlib3VuZHMueSArPSBvZmZzZXQueTsNCi0JYm91bmRzLndpZHRoID0gb2Zmc2V0LndpZHRoOw0KLQlib3VuZHMuaGVpZ2h0ID0gb2Zmc2V0LmhlaWdodDsNCi0JY29udHJvbC5zZXRCb3VuZHMoYm91bmRzKTsNCi0JY29udHJvbC5tb3ZlQWJvdmUodGFiRm9sZGVyKTsNCi19DQotcHJpdmF0ZSB2b2lkIHNldENvbnRyb2xWaXNpYmxlKENvbnRyb2wgY29udHJvbCkgew0KLQlpZiAoY29udHJvbCA9PSBudWxsKQ0KLQkJcmV0dXJuOw0KLQlzZXRDb250cm9sU2l6ZShjb250cm9sKTsNCi0JY29udHJvbC5zZXRWaXNpYmxlKHRydWUpOw0KLX0NCi1wdWJsaWMgdm9pZCBzZXRGaXJzdFBhZ2VTZWxlY3RlZChib29sZWFuIG5ld0ZpcnN0UGFnZVNlbGVjdGVkKSB7DQotCWZpcnN0UGFnZVNlbGVjdGVkID0gbmV3Rmlyc3RQYWdlU2VsZWN0ZWQ7DQotfQ0KLXByaXZhdGUgdm9pZCBzd2l0Y2hQYWdlcyhJRm9ybVBhZ2Ugb2xkUGFnZSwgSUZvcm1QYWdlIG5ld1BhZ2UsIGJvb2xlYW4gc2V0Rm9jdXMpIHsNCi0JaWYgKG9sZFBhZ2UgIT0gbnVsbCAmJiBvbGRQYWdlIT1uZXdQYWdlKSB7DQotCQlib29sZWFuIG9rVG9Td2l0Y2ggPSBvbGRQYWdlLmJlY29tZXNJbnZpc2libGUobmV3UGFnZSk7DQotCQlpZiAoIW9rVG9Td2l0Y2gpIHsNCi0JCQkvLyBXZSBtdXN0IHRyeSB0byBnbyBiYWNrIHRvIHRoZSBzb3VyY2UgcGFnZQ0KLQkJCXJlc2VsZWN0UGFnZShvbGRQYWdlKTsNCi0JCQlyZXR1cm47DQotCQl9DQotCX0NCi0JaWYgKG5ld1BhZ2UuZ2V0Q29udHJvbCgpID09IG51bGwpDQotCQluZXdQYWdlLmNyZWF0ZUNvbnRyb2wodGFiRm9sZGVyKTsNCi0JdGFiRm9sZGVyLnNldFNlbGVjdGlvbigoQ1RhYkl0ZW0pIHBhZ2VzLmdldChuZXdQYWdlKSk7DQotCWlmIChvbGRQYWdlICE9IG51bGwgJiYgb2xkUGFnZSAhPSBuZXdQYWdlKSB7DQotCQlDb250cm9sIG9sZENvbnRyb2wgPSBvbGRQYWdlLmdldENvbnRyb2woKTsNCi0JCWlmIChvbGRDb250cm9sIT1udWxsKSBvbGRDb250cm9sLnNldFZpc2libGUoZmFsc2UpOw0KLQl9DQotCUNvbnRyb2wgbmV3Q29udHJvbCA9IG5ld1BhZ2UuZ2V0Q29udHJvbCgpOw0KLQluZXdQYWdlLmJlY29tZXNWaXNpYmxlKG9sZFBhZ2UpOw0KLQlzZXRDb250cm9sVmlzaWJsZShuZXdDb250cm9sKTsNCi0JZmlyZVNlbGVjdGlvbkNoYW5nZWQobmV3UGFnZSwgc2V0Rm9jdXMpOw0KLX0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL0V4cGFuZGFibGVHcm91cC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL0V4cGFuZGFibGVHcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGI1ZjhhLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9FeHBhbmRhYmxlR3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMuaW50ZXJuYWw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsNCi0NCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRXhwYW5kYWJsZUdyb3VwIHsNCi0JcHJpdmF0ZSBTdHJpbmcgdGV4dDsNCi0JcHJpdmF0ZSBib29sZWFuIGV4cGFuZGVkOw0KLQlwcml2YXRlIENvbXBvc2l0ZSBleHBhbnNpb247DQotCXByb3RlY3RlZCBTZWxlY3RhYmxlRm9ybUxhYmVsIHRleHRMYWJlbDsNCi0JcHJpdmF0ZSBDb21wb3NpdGUgY29udHJvbDsNCi0JcHJpdmF0ZSBib29sZWFuIGV4cGFuZGFibGU9dHJ1ZTsNCi0JDQotY2xhc3MgRXhwYW5kYWJsZUxheW91dCBleHRlbmRzIExheW91dCB7DQotCXByb3RlY3RlZCB2b2lkIGxheW91dChDb21wb3NpdGUgcGFyZW50LCBib29sZWFuIGNoYW5nZWQpIHsNCi0JCVJlY3RhbmdsZSBjbGllbnRBcmVhID0gcGFyZW50LmdldENsaWVudEFyZWEoKTsNCi0JCVBvaW50IHNpemUgPSB0ZXh0TGFiZWwuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCBjaGFuZ2VkKTsNCi0JCWludCB4ID0gMDsNCi0JCWludCB5ID0gMTsNCi0JCQ0KLQkJaWYgKGV4cGFuZGFibGUpIHsNCi0JCQl4ID0gOCArIDg7DQotCQl9DQotCQl0ZXh0TGFiZWwuc2V0Qm91bmRzKHgsIHksIHNpemUueCwgc2l6ZS55KTsNCi0JDQotCQlpZiAoZXhwYW5kYWJsZSkNCi0JCSAgIHkgPSBNYXRoLm1heChzaXplLnksIDgpICsgMiArIDI7DQotCQllbHNlDQotCQkgICB5ID0gc2l6ZS55ICsgMjsNCi0JCWlmIChleHBhbmRlZCkgew0KLQkJCWludCBhcmVhV2lkdGggPSBjbGllbnRBcmVhLndpZHRoIC0geDsNCi0JCQlzaXplID0gZXhwYW5zaW9uLmNvbXB1dGVTaXplKGFyZWFXaWR0aCwgU1dULkRFRkFVTFQsIGNoYW5nZWQpOw0KLQkJCWV4cGFuc2lvbi5zZXRCb3VuZHMoeCwgeSwgc2l6ZS54LCBzaXplLnkpOw0KLQkJfQ0KLQl9DQotDQotCXByb3RlY3RlZCBQb2ludCBjb21wdXRlU2l6ZShDb21wb3NpdGUgcGFyZW50LCBpbnQgd0hpbnQsIGludCBoSGludCwgYm9vbGVhbiBjaGFuZ2VkKSB7DQotCQlpbnQgd2lkdGggPSAwLCBoZWlnaHQgPSAwOw0KLQkJUG9pbnQgc2l6ZSA9IHRleHRMYWJlbC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIGNoYW5nZWQpOw0KLQkJd2lkdGggPSBzaXplLng7DQotCQloZWlnaHQgPSBzaXplLnkgKyAyICsgMjsNCi0JCWlmIChleHBhbmRlZCkgew0KLQkJCXNpemUgPSBleHBhbnNpb24uY29tcHV0ZVNpemUod0hpbnQsIFNXVC5ERUZBVUxULCBjaGFuZ2VkKTsNCi0JCQl3aWR0aCA9IE1hdGgubWF4KHdpZHRoLCBzaXplLngpOw0KLQkJCWhlaWdodCArPSBzaXplLnk7DQotCQl9DQotCQlpZiAoZXhwYW5kYWJsZSkgew0KLQkJCWhlaWdodCA9IE1hdGgubWF4KGhlaWdodCwgOCk7DQotCQkJd2lkdGggKz0gOCArIDg7DQotCQl9DQotCQlyZXR1cm4gbmV3IFBvaW50KHdpZHRoLCBoZWlnaHQpOw0KLQl9DQotfQ0KLQ0KLQlwdWJsaWMgRXhwYW5kYWJsZUdyb3VwKCkgew0KLQl9DQotCQ0KLQlwdWJsaWMgRXhwYW5kYWJsZUdyb3VwKGludCBzdHlsZSkgew0KLQkJLy90aGlzLnN0eWxlID0gc3R5bGU7DQotCX0NCi0JDQotCXB1YmxpYyBDb250cm9sIGdldENvbnRyb2woKSB7DQotCQlyZXR1cm4gY29udHJvbDsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50LCBmaW5hbCBGb3JtV2lkZ2V0RmFjdG9yeSBmYWN0b3J5KSB7DQotCQlmaW5hbCBDYW52YXMgY29udGFpbmVyID0gbmV3IENhbnZhcyhwYXJlbnQsIFNXVC5OVUxMKTsNCi0JCWNvbnRhaW5lci5zZXRCYWNrZ3JvdW5kKGZhY3RvcnkuZ2V0QmFja2dyb3VuZENvbG9yKCkpOw0KLQkJY29udGFpbmVyLnNldExheW91dChuZXcgRXhwYW5kYWJsZUxheW91dCgpKTsNCi0JCWNvbnRhaW5lci5hZGRQYWludExpc3RlbmVyKG5ldyBQYWludExpc3RlbmVyKCkgew0KLQkJCXB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChQYWludEV2ZW50IGUpIHsNCi0JCQkJaWYgKGV4cGFuZGFibGUpIHJlcGFpbnQoZSk7DQotCQkJfQ0KLQkJfSk7DQotCQljb250YWluZXIuYWRkTW91c2VMaXN0ZW5lcihuZXcgTW91c2VBZGFwdGVyKCkgew0KLQkJCXB1YmxpYyB2b2lkIG1vdXNlVXAoTW91c2VFdmVudCBlKSB7DQotCQkJCVJlY3RhbmdsZSBib3ggPSBnZXRCb3hCb3VuZHMobnVsbCk7DQotCQkJCWlmIChib3guY29udGFpbnMoZS54LCBlLnkpKSB7DQotCQkJCQljb250YWluZXIuc2V0Q3Vyc29yKGZhY3RvcnkuZ2V0QnVzeUN1cnNvcigpKTsNCi0JCQkJCXNldEV4cGFuZGVkKCFpc0V4cGFuZGVkKCkpOw0KLQkJCQkJY29udGFpbmVyLnNldEN1cnNvcihudWxsKTsNCi0JCQkJfQ0KLQkJCX0NCi0JCX0pOw0KLQkJdGV4dExhYmVsID0gY3JlYXRlVGV4dExhYmVsKGNvbnRhaW5lciwgZmFjdG9yeSk7DQotCQlnZXRIeXBlcmxpbmtIYW5kbGVyKGZhY3RvcnkpLnJlZ2lzdGVySHlwZXJsaW5rKHRleHRMYWJlbCwgbmV3IEh5cGVybGlua0FkYXB0ZXIgKCkgew0KLQkJCXB1YmxpYyB2b2lkIGxpbmtBY3RpdmF0ZWQoQ29udHJvbCBsaW5rKSB7DQotCQkJCUV4cGFuZGFibGVHcm91cC50aGlzLmxpbmtBY3RpdmF0ZWQoKTsNCi0JCQkJaWYgKGV4cGFuZGFibGUpIHNldEV4cGFuZGVkKCFpc0V4cGFuZGVkKCkpOw0KLQkJCX0NCi0JCX0pOw0KLQkJdGV4dExhYmVsLmFkZEZvY3VzTGlzdGVuZXIoZmFjdG9yeS52aXNpYmlsaXR5SGFuZGxlcik7DQotCQl0ZXh0TGFiZWwuYWRkS2V5TGlzdGVuZXIoZmFjdG9yeS5rZXlib2FyZEhhbmRsZXIpOwkJDQotCQlpZiAodGV4dCE9bnVsbCkgdGV4dExhYmVsLnNldFRleHQodGV4dCk7DQotCQlleHBhbnNpb24gPSBmYWN0b3J5LmNyZWF0ZUNvbXBvc2l0ZShjb250YWluZXIpOw0KLQkJZmlsbEV4cGFuc2lvbihleHBhbnNpb24sIGZhY3RvcnkpOw0KLQkJdGhpcy5jb250cm9sID0gY29udGFpbmVyOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgU2VsZWN0YWJsZUZvcm1MYWJlbCBjcmVhdGVUZXh0TGFiZWwoQ29tcG9zaXRlIHBhcmVudCwgRm9ybVdpZGdldEZhY3RvcnkgZmFjdG9yeSkgew0KLQkJU2VsZWN0YWJsZUZvcm1MYWJlbCB0ZXh0ID0gbmV3IFNlbGVjdGFibGVGb3JtTGFiZWwocGFyZW50LCBTV1QuV1JBUCk7DQotCQl0ZXh0LnNldEJhY2tncm91bmQoZmFjdG9yeS5nZXRCYWNrZ3JvdW5kQ29sb3IoKSk7DQotCQlyZXR1cm4gdGV4dDsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIEh5cGVybGlua0hhbmRsZXIgZ2V0SHlwZXJsaW5rSGFuZGxlcihGb3JtV2lkZ2V0RmFjdG9yeSBmYWN0b3J5KSB7DQotCQlyZXR1cm4gZmFjdG9yeS5nZXRIeXBlcmxpbmtIYW5kbGVyKCk7DQotCX0NCi0JDQotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIGZpbGxFeHBhbnNpb24oQ29tcG9zaXRlIGV4cGFuc2lvbiwgRm9ybVdpZGdldEZhY3RvcnkgZmFjdG9yeSk7DQotCQ0KLQlwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyB0ZXh0KSB7DQotCQl0aGlzLnRleHQgPSB0ZXh0Ow0KLQkJaWYgKHRleHRMYWJlbCE9bnVsbCkNCi0JCSAgIHRleHRMYWJlbC5zZXRUZXh0KHRleHQpOw0KLQl9DQotCQ0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7DQotCQlyZXR1cm4gdGV4dDsNCi0JfQ0KLQkNCi0JcHVibGljIGJvb2xlYW4gaXNFeHBhbmRlZCgpIHsNCi0JCXJldHVybiBleHBhbmRlZDsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgc2V0RXhwYW5kYWJsZShib29sZWFuIGV4cGFuZGFibGUpIHsNCi0JCXRoaXMuZXhwYW5kYWJsZSA9IGV4cGFuZGFibGU7DQotCX0NCi0JDQotCXB1YmxpYyBib29sZWFuIGlzRXhwYW5kYWJsZSgpIHsNCi0JCXJldHVybiBleHBhbmRhYmxlOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCBzZXRFeHBhbmRlZChib29sZWFuIGV4cGFuZGVkKSB7DQotCQlpZiAodGhpcy5leHBhbmRlZCAhPSBleHBhbmRlZCkgew0KLQkJCWlmIChleHBhbmRlZCkgew0KLQkJCQlhYm91dFRvRXhwYW5kKCk7DQotCQkJfQ0KLQkJCWVsc2Ugew0KLQkJCQlhYm91dFRvQ29sbGFwc2UoKTsNCi0JCQl9DQotCQkJdGhpcy5leHBhbmRlZCA9IGV4cGFuZGVkOw0KLQkJCWV4cGFuc2lvbi5zZXRWaXNpYmxlKGV4cGFuZGVkKTsNCi0JCQljb250cm9sLmxheW91dCgpOw0KLQkJCWlmIChleHBhbmRlZCkgew0KLQkJCQl0aGlzLmV4cGFuZGVkKCk7DQotCQkJfQ0KLQkJCWVsc2Ugew0KLQkJCQljb2xsYXBzZWQoKTsNCi0JCQl9DQotCQl9DQotCX0NCi0JDQotCXByaXZhdGUgdm9pZCByZXBhaW50KFBhaW50RXZlbnQgZSkgew0KLQkJR0MgZ2MgPSBlLmdjOw0KLQkJUmVjdGFuZ2xlIGJveCA9IGdldEJveEJvdW5kcyhnYyk7DQotCQlnYy5zZXRGb3JlZ3JvdW5kKGNvbnRyb2wuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSURHRVRfTk9STUFMX1NIQURPVykpOw0KLQkJZ2MuZHJhd1JlY3RhbmdsZShib3gpOw0KLQkJZ2Muc2V0Rm9yZWdyb3VuZChjb250cm9sLmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTElTVF9GT1JFR1JPVU5EKSk7DQotCQlnYy5kcmF3TGluZShib3gueCsyLCBib3gueSs0LCBib3gueCs2LCBib3gueSs0KTsNCi0JCWlmICghaXNFeHBhbmRlZCgpKSB7DQotCQkJZ2MuZHJhd0xpbmUoYm94LngrNCwgYm94LnkrMiwgYm94LngrNCwgYm94LnkrNik7DQotCQl9DQotCX0NCi0JDQotCXByaXZhdGUgUmVjdGFuZ2xlIGdldEJveEJvdW5kcyhHQyBnYykgew0KLQkJaW50IHggPSAwOw0KLQkJaW50IHkgPSAwOw0KLQkJYm9vbGVhbiBub0dDID0gZmFsc2U7DQotCQ0KLQkJaWYgKGdjPT1udWxsKSB7DQotCQkJZ2MgPSBuZXcgR0MoY29udHJvbCk7DQotCQkJbm9HQyA9IHRydWU7DQotCQl9DQotCQlnYy5zZXRGb250KHRleHRMYWJlbC5nZXRGb250KCkpOw0KLQkJaW50IGhlaWdodCA9IGdjLmdldEZvbnRNZXRyaWNzKCkuZ2V0SGVpZ2h0KCk7DQotCQl5ID0gaGVpZ2h0LzIgLSA0ICsxOw0KLQkJeSA9IE1hdGgubWF4KHksIDApOw0KLQkJaWYgKG5vR0MpIGdjLmRpc3Bvc2UoKTsNCi0JCXJldHVybiBuZXcgUmVjdGFuZ2xlKHgsIHksIDgsIDgpOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVMYXlvdXQoKSB7DQotCQljb250cm9sLmxheW91dCgpOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgdm9pZCBhYm91dFRvRXhwYW5kKCkgew0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgdm9pZCBhYm91dFRvQ29sbGFwc2UoKSB7DQotCX0NCi0JDQotCXByb3RlY3RlZCB2b2lkIGV4cGFuZGVkKCkgew0KLQl9DQotCXByb3RlY3RlZCB2b2lkIGNvbGxhcHNlZCgpIHsNCi0JfQ0KLQlwcm90ZWN0ZWQgdm9pZCBsaW5rQWN0aXZhdGVkKCkgew0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9Gb3JtQnV0dG9uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvRm9ybUJ1dHRvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzA3ZWRmLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9Gb3JtQnV0dG9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMuaW50ZXJuYWw7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7DQotDQotcHVibGljIGNsYXNzIEZvcm1CdXR0b24gew0KLQlwcml2YXRlIEJ1dHRvbiBidXR0b247DQotCXByaXZhdGUgSW1hZ2UgaW1hZ2U7DQotCXByaXZhdGUgRm9ybVdpZGdldEZhY3RvcnkgZmFjdG9yeTsNCi0JcHJpdmF0ZSBJbWFnZSBob3ZlckltYWdlOw0KLQlwcml2YXRlIGJvb2xlYW4gaW5zaWRlOw0KLQlwcml2YXRlIEltYWdlIGRpc2FibGVkSW1hZ2U7DQotDQotcHVibGljIEZvcm1CdXR0b24oQnV0dG9uIGJ1dHRvbiwgRm9ybVdpZGdldEZhY3RvcnkgZmFjdG9yeSkgew0KLQl0aGlzLmJ1dHRvbiA9IGJ1dHRvbjsNCi0JdGhpcy5mYWN0b3J5ID0gZmFjdG9yeTsNCi0JYnV0dG9uLmFkZE1vdXNlVHJhY2tMaXN0ZW5lcihuZXcgTW91c2VUcmFja0FkYXB0ZXIoKSB7DQotCQlwdWJsaWMgdm9pZCBtb3VzZUVudGVyKE1vdXNlRXZlbnQgZSkgew0KLQkJCWluc2lkZT10cnVlOw0KLQkJCXVwZGF0ZUltYWdlKCk7DQotCQl9DQotCQlwdWJsaWMgdm9pZCBtb3VzZUV4aXQoTW91c2VFdmVudCBlKSB7DQotCQkJaW5zaWRlPWZhbHNlOw0KLQkJCXVwZGF0ZUltYWdlKCk7DQotCQl9DQotCX0pOw0KLX0NCi1wdWJsaWMgQnV0dG9uIGdldEJ1dHRvbigpIHsNCi0JcmV0dXJuIGJ1dHRvbjsNCi19DQotcHVibGljIEltYWdlIGdldERpc2FibGVkSW1hZ2UoKSB7DQotCXJldHVybiBkaXNhYmxlZEltYWdlOw0KLX0NCi1wdWJsaWMgSW1hZ2UgZ2V0SG92ZXJJbWFnZSgpIHsNCi0JcmV0dXJuIGhvdmVySW1hZ2U7DQotfQ0KLXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsNCi0JcmV0dXJuIGltYWdlOw0KLX0NCi1wdWJsaWMgdm9pZCBzZXREaXNhYmxlZEltYWdlKEltYWdlIG5ld0Rpc2FibGVkSW1hZ2UpIHsNCi0JZGlzYWJsZWRJbWFnZSA9IG5ld0Rpc2FibGVkSW1hZ2U7DQotfQ0KLXB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7DQotCWJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZWQpOw0KLQl1cGRhdGVJbWFnZSgpOw0KLX0NCi1wdWJsaWMgdm9pZCBzZXRIb3ZlckltYWdlKEltYWdlIG5ld0hvdmVySW1hZ2UpIHsNCi0JaG92ZXJJbWFnZSA9IG5ld0hvdmVySW1hZ2U7DQotfQ0KLXB1YmxpYyB2b2lkIHNldEltYWdlKEltYWdlIG5ld0ltYWdlKSB7DQotCWltYWdlID0gbmV3SW1hZ2U7DQotCWlmIChob3ZlckltYWdlPT1udWxsKSBob3ZlckltYWdlID0gaW1hZ2U7DQotCWlmIChkaXNhYmxlZEltYWdlPT1udWxsKSBkaXNhYmxlZEltYWdlID0gaW1hZ2U7DQotCXVwZGF0ZUltYWdlKCk7DQotfQ0KLXB1YmxpYyB2b2lkIHVwZGF0ZUltYWdlKCkgew0KLQlib29sZWFuIGVuYWJsZWQgPSBidXR0b24uaXNFbmFibGVkKCk7DQotCWlmIChlbmFibGVkID09IGZhbHNlKSB7DQotCQlidXR0b24uc2V0SW1hZ2UoZGlzYWJsZWRJbWFnZSk7DQotCX0gZWxzZSB7DQotCQlpZiAoaW5zaWRlKSB7DQotCQkJYnV0dG9uLnNldEN1cnNvcihmYWN0b3J5LmdldEh5cGVybGlua0N1cnNvcigpKTsNCi0JCQlidXR0b24uc2V0SW1hZ2UoaG92ZXJJbWFnZSk7DQotCQl9IGVsc2Ugew0KLQkJCWJ1dHRvbi5zZXRDdXJzb3IobnVsbCk7DQotCQkJYnV0dG9uLnNldEltYWdlKGltYWdlKTsNCi0JCX0NCi0JfQ0KLX0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL0Zvcm1FbnRyeS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL0Zvcm1FbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWU3ZTE0Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9Gb3JtRW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMuaW50ZXJuYWw7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsNCi1pbXBvcnQgamF2YS51dGlsLio7DQotDQotcHVibGljIGNsYXNzIEZvcm1FbnRyeSB7DQotCXByaXZhdGUgVGV4dCB0ZXh0Ow0KLQlwcml2YXRlIFN0cmluZyB2YWx1ZTsNCi0JcHJpdmF0ZSBib29sZWFuIGRpcnR5Ow0KLQlwcml2YXRlIFZlY3RvciBsaXN0ZW5lcnM9bmV3IFZlY3RvcigpOw0KLQlib29sZWFuIGlnbm9yZU1vZGlmeT1mYWxzZTsNCi0NCi1wdWJsaWMgRm9ybUVudHJ5KFRleHQgdGV4dCkgew0KLQl0aGlzLnRleHQgPSB0ZXh0Ow0KLQl0aGlzLnZhbHVlID0gdGV4dC5nZXRUZXh0KCk7DQotCWFkZExpc3RlbmVycygpOw0KLX0NCi1wdWJsaWMgdm9pZCBhZGRGb3JtVGV4dExpc3RlbmVyKElGb3JtVGV4dExpc3RlbmVyIGxpc3RlbmVyKSB7DQotCWxpc3RlbmVycy5hZGRFbGVtZW50KGxpc3RlbmVyKTsNCi19DQotcHJpdmF0ZSB2b2lkIGFkZExpc3RlbmVycygpIHsNCi0JdGV4dC5hZGRLZXlMaXN0ZW5lcihuZXcgS2V5QWRhcHRlcigpIHsNCi0JCXB1YmxpYyB2b2lkIGtleVJlbGVhc2VkKEtleUV2ZW50IGUpIHsNCi0JCQlrZXlSZWxlYXNlT2NjdXJlZChlKTsNCi0JCX0NCi0JfSk7DQotCXRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgew0KLQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7DQotCQkJZWRpdE9jY3VyZWQoZSk7DQotCQl9DQotCX0pOw0KLQl0ZXh0LmFkZEZvY3VzTGlzdGVuZXIgKG5ldyBGb2N1c0FkYXB0ZXIoKSB7DQotCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7DQotCQkJaWYgKGRpcnR5KSBjb21taXQoKTsNCi0JCX0NCi0JfSk7DQotfQ0KLXB1YmxpYyB2b2lkIGNvbW1pdCgpIHsNCi0JaWYgKGRpcnR5KSB7DQotCQl2YWx1ZSA9IHRleHQuZ2V0VGV4dCgpOw0KLQkJLy9ub3RpZnkNCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGxpc3RlbmVycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsNCi0JCQkoKElGb3JtVGV4dExpc3RlbmVyKSBpdGVyLm5leHQoKSkudGV4dFZhbHVlQ2hhbmdlZCh0aGlzKTsNCi0JCX0NCi0JfQ0KLQlkaXJ0eSA9IGZhbHNlOw0KLX0NCi1wcm90ZWN0ZWQgdm9pZCBlZGl0T2NjdXJlZChNb2RpZnlFdmVudCBlKSB7DQotCWlmIChpZ25vcmVNb2RpZnkpIHJldHVybjsNCi0JZGlydHkgPSB0cnVlOw0KLQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsaXN0ZW5lcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7DQotCQkoKElGb3JtVGV4dExpc3RlbmVyKSBpdGVyLm5leHQoKSkudGV4dERpcnR5KHRoaXMpOw0KLQl9DQotfQ0KLQ0KLXB1YmxpYyBUZXh0IGdldENvbnRyb2woKSB7DQotCXJldHVybiB0ZXh0Ow0KLX0NCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRWYWx1ZSgpIHsNCi0JcmV0dXJuIHZhbHVlOw0KLX0NCi1wdWJsaWMgYm9vbGVhbiBpc0RpcnR5KCkgew0KLQlyZXR1cm4gZGlydHk7DQotfQ0KLXByb3RlY3RlZCB2b2lkIGtleVJlbGVhc2VPY2N1cmVkKEtleUV2ZW50IGUpIHsNCi0JaWYgKGUuY2hhcmFjdGVyID09ICdccicpIHsNCi0JCS8vIGNvbW1pdCB2YWx1ZQ0KLQkJaWYgKGRpcnR5KSBjb21taXQoKTsNCi0JfQ0KLQllbHNlIGlmIChlLmNoYXJhY3RlciA9PSAnXHUwMDFiJykgeyAvLyBFc2NhcGUgY2hhcmFjdGVyDQotCQl0ZXh0LnNldFRleHQodmFsdWUhPW51bGw/dmFsdWU6IiIpOyAvLyByZXN0b3JlIG9sZA0KLQkJZGlydHk9IGZhbHNlOw0KLQl9DQotfQ0KLXB1YmxpYyB2b2lkIHJlbW92ZUZvcm1UZXh0TGlzdGVuZXIoSUZvcm1UZXh0TGlzdGVuZXIgbGlzdGVuZXIpIHsNCi0JbGlzdGVuZXJzLnJlbW92ZUVsZW1lbnQobGlzdGVuZXIpOw0KLX0NCi1wdWJsaWMgdm9pZCBzZXREaXJ0eShib29sZWFuIG5ld0RpcnR5KSB7DQotCWRpcnR5ID0gbmV3RGlydHk7DQotfQ0KLXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgew0KLQlpZiAodGV4dCE9bnVsbCkgdGV4dC5zZXRUZXh0KHZhbHVlIT1udWxsP3ZhbHVlOiIiKTsNCi0JdGhpcy52YWx1ZSA9IHZhbHVlOw0KLX0NCi0NCi1wdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUsIGJvb2xlYW4gYmxvY2tOb3RpZmljYXRpb24pIHsNCi0JaWdub3JlTW9kaWZ5ID0gYmxvY2tOb3RpZmljYXRpb247DQotCXNldFZhbHVlKHZhbHVlKTsNCi0JaWdub3JlTW9kaWZ5ID0gZmFsc2U7DQotfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvRm9ybUxhYmVsLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvRm9ybUxhYmVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2NWUxZTguLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL0Zvcm1MYWJlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbDsNCi0NCi1pbXBvcnQgamF2YS50ZXh0LkJyZWFrSXRlcmF0b3I7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5Lio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7DQotDQotLyoqDQotICogRm9ybVRleHQgaXMgYSB3aW5kb3dsZXNzIGNvbnRyb2wgdGhhdA0KLSAqIGRyYXdzIHRleHQgaW4gdGhlIHByb3ZpZGVkIGNvbnRleHQuDQotICovDQotcHVibGljIGNsYXNzIEZvcm1MYWJlbCBleHRlbmRzIENhbnZhcyB7DQotCXByaXZhdGUgU3RyaW5nIHRleHQgPSAiIjsNCi0JcHJvdGVjdGVkIGludCB0ZXh0TWFyZ2luV2lkdGggPSA1Ow0KLQlwcm90ZWN0ZWQgaW50IHRleHRNYXJnaW5IZWlnaHQgPSA1Ow0KLQlwcml2YXRlIGJvb2xlYW4gdW5kZXJsaW5lZDsNCi0NCi0JcHVibGljIEZvcm1MYWJlbChDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsNCi0JCXN1cGVyKHBhcmVudCwgc3R5bGUpOw0KLQkJYWRkUGFpbnRMaXN0ZW5lcihuZXcgUGFpbnRMaXN0ZW5lcigpIHsNCi0JCQlwdWJsaWMgdm9pZCBwYWludENvbnRyb2woUGFpbnRFdmVudCBlKSB7DQotCQkJCXBhaW50KGUpOw0KLQkJCX0NCi0JCX0pOw0KLQkJaW5pdEFjY2Vzc2libGUoKTsNCi0JfQ0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7DQotCQlyZXR1cm4gdGV4dDsNCi0JfQ0KLQlwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyB0ZXh0KSB7DQotCQlpZiAodGV4dCAhPSBudWxsKQ0KLQkJCXRoaXMudGV4dCA9IHRleHQ7DQotCQllbHNlDQotCQkJdGV4dCA9ICIiOw0KLQl9DQotDQotCXByb3RlY3RlZCB2b2lkIGluaXRBY2Nlc3NpYmxlKCkgew0KLQkJQWNjZXNzaWJsZSBhY2Nlc3NpYmxlID0gZ2V0QWNjZXNzaWJsZSgpOw0KLQkJYWNjZXNzaWJsZS5hZGRBY2Nlc3NpYmxlTGlzdGVuZXIobmV3IEFjY2Vzc2libGVBZGFwdGVyKCkgew0KLQkJCXB1YmxpYyB2b2lkIGdldE5hbWUoQWNjZXNzaWJsZUV2ZW50IGUpIHsNCi0JCQkJZS5yZXN1bHQgPSBnZXRUZXh0KCk7DQotCQkJfQ0KLQ0KLQkJCXB1YmxpYyB2b2lkIGdldEhlbHAoQWNjZXNzaWJsZUV2ZW50IGUpIHsNCi0JCQkJZS5yZXN1bHQgPSBnZXRUb29sVGlwVGV4dCgpOw0KLQkJCX0NCi0JCX0pOw0KLQ0KLQkJYWNjZXNzaWJsZQ0KLQkJCS5hZGRBY2Nlc3NpYmxlQ29udHJvbExpc3RlbmVyKG5ldyBBY2Nlc3NpYmxlQ29udHJvbEFkYXB0ZXIoKSB7DQotCQkJcHVibGljIHZvaWQgZ2V0Q2hpbGRBdFBvaW50KEFjY2Vzc2libGVDb250cm9sRXZlbnQgZSkgew0KLQkJCQlQb2ludCBwdCA9IHRvQ29udHJvbChuZXcgUG9pbnQoZS54LCBlLnkpKTsNCi0JCQkJZS5jaGlsZElEID0NCi0JCQkJCShnZXRCb3VuZHMoKS5jb250YWlucyhwdCkpDQotCQkJCQkJPyBBQ0MuQ0hJTERJRF9TRUxGDQotCQkJCQkJOiBBQ0MuQ0hJTERJRF9OT05FOw0KLQkJCX0NCi0NCi0JCQlwdWJsaWMgdm9pZCBnZXRMb2NhdGlvbihBY2Nlc3NpYmxlQ29udHJvbEV2ZW50IGUpIHsNCi0JCQkJUmVjdGFuZ2xlIGxvY2F0aW9uID0gZ2V0Qm91bmRzKCk7DQotCQkJCVBvaW50IHB0ID0gdG9EaXNwbGF5KG5ldyBQb2ludChsb2NhdGlvbi54LCBsb2NhdGlvbi55KSk7DQotCQkJCWUueCA9IHB0Lng7DQotCQkJCWUueSA9IHB0Lnk7DQotCQkJCWUud2lkdGggPSBsb2NhdGlvbi53aWR0aDsNCi0JCQkJZS5oZWlnaHQgPSBsb2NhdGlvbi5oZWlnaHQ7DQotCQkJfQ0KLQ0KLQkJCXB1YmxpYyB2b2lkIGdldENoaWxkQ291bnQoQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBlKSB7DQotCQkJCWUuZGV0YWlsID0gMDsNCi0JCQl9DQotDQotCQkJcHVibGljIHZvaWQgZ2V0Um9sZShBY2Nlc3NpYmxlQ29udHJvbEV2ZW50IGUpIHsNCi0JCQkJZS5kZXRhaWwgPSBBQ0MuUk9MRV9MQUJFTDsNCi0JCQl9DQotDQotCQkJcHVibGljIHZvaWQgZ2V0U3RhdGUoQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBlKSB7DQotCQkJCWUuZGV0YWlsID0gQUNDLlNUQVRFX1JFQURPTkxZOw0KLQkJCX0NCi0JCX0pOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHNldFVuZGVybGluZWQoYm9vbGVhbiB1bmRlcmxpbmVkKSB7DQotCQl0aGlzLnVuZGVybGluZWQgPSB1bmRlcmxpbmVkOw0KLQl9DQotDQotCXB1YmxpYyBib29sZWFuIGlzVW5kZXJsaW5lZCgpIHsNCi0JCXJldHVybiB1bmRlcmxpbmVkOw0KLQl9DQotDQotCXB1YmxpYyBQb2ludCBjb21wdXRlU2l6ZShpbnQgd0hpbnQsIGludCBoSGludCwgYm9vbGVhbiBjaGFuZ2VkKSB7DQotCQljaGVja1dpZGdldCgpOw0KLQkJaW50IGlubmVyV2lkdGggPSB3SGludDsNCi0JCWlmIChpbm5lcldpZHRoICE9IFNXVC5ERUZBVUxUKQ0KLQkJCWlubmVyV2lkdGggLT0gdGV4dE1hcmdpbldpZHRoICogMjsNCi0JCVBvaW50IHRleHRTaXplID0gY29tcHV0ZVRleHRTaXplKGlubmVyV2lkdGgsIGhIaW50KTsNCi0JCWludCB0ZXh0V2lkdGggPSB0ZXh0U2l6ZS54ICsgMiAqIHRleHRNYXJnaW5XaWR0aDsNCi0JCWludCB0ZXh0SGVpZ2h0ID0gdGV4dFNpemUueSArIDIgKiB0ZXh0TWFyZ2luSGVpZ2h0Ow0KLQkJcmV0dXJuIG5ldyBQb2ludCh0ZXh0V2lkdGgsIHRleHRIZWlnaHQpOw0KLQl9DQotDQotCXB1YmxpYyBzdGF0aWMgaW50IGNvbXB1dGVXcmFwSGVpZ2h0KEdDIGdjLCBTdHJpbmcgdGV4dCwgaW50IHdpZHRoKSB7DQotCQlCcmVha0l0ZXJhdG9yIHdiID0gQnJlYWtJdGVyYXRvci5nZXRXb3JkSW5zdGFuY2UoKTsNCi0JCXdiLnNldFRleHQodGV4dCk7DQotCQlGb250TWV0cmljcyBmbSA9IGdjLmdldEZvbnRNZXRyaWNzKCk7DQotCQlpbnQgbGluZUhlaWdodCA9IGZtLmdldEhlaWdodCgpOw0KLQ0KLQkJaW50IHNhdmVkID0gMDsNCi0JCWludCBsYXN0ID0gMDsNCi0JCWludCBoZWlnaHQgPSBsaW5lSGVpZ2h0Ow0KLQ0KLQkJZm9yIChpbnQgbG9jID0gd2IuZmlyc3QoKTsNCi0JCQlsb2MgIT0gQnJlYWtJdGVyYXRvci5ET05FOw0KLQkJCWxvYyA9IHdiLm5leHQoKSkgew0KLQkJCVN0cmluZyB3b3JkID0gdGV4dC5zdWJzdHJpbmcoc2F2ZWQsIGxvYyk7DQotCQkJUG9pbnQgZXh0ZW50ID0gZ2MudGV4dEV4dGVudCh3b3JkKTsNCi0JCQlpZiAoZXh0ZW50LnggPiB3aWR0aCkgew0KLQkJCQkvLyBvdmVyZmxvdw0KLQkJCQlzYXZlZCA9IGxhc3Q7DQotCQkJCWhlaWdodCArPSBleHRlbnQueTsNCi0JCQl9DQotCQkJbGFzdCA9IGxvYzsNCi0JCX0NCi0JCXJldHVybiBoZWlnaHQ7DQotCX0NCi0NCi0JcHJpdmF0ZSBQb2ludCBjb21wdXRlVGV4dFNpemUoaW50IHdIaW50LCBpbnQgaEhpbnQpIHsNCi0JCVBvaW50IGV4dGVudDsNCi0JCUdDIGdjID0gbmV3IEdDKHRoaXMpOw0KLQ0KLQkJZ2Muc2V0Rm9udChnZXRGb250KCkpOw0KLQkJaWYgKChnZXRTdHlsZSgpICYgU1dULldSQVApICE9IDAgJiYgd0hpbnQgIT0gU1dULkRFRkFVTFQpIHsNCi0JCQlpbnQgaGVpZ2h0ID0gY29tcHV0ZVdyYXBIZWlnaHQoZ2MsIHRleHQsIHdIaW50KTsNCi0JCQlleHRlbnQgPSBuZXcgUG9pbnQod0hpbnQsIGhlaWdodCk7DQotCQl9IGVsc2Ugew0KLQkJCWV4dGVudCA9IGdjLnRleHRFeHRlbnQoZ2V0VGV4dCgpKTsNCi0JCX0NCi0JCWdjLmRpc3Bvc2UoKTsNCi0JCXJldHVybiBleHRlbnQ7DQotCX0NCi0NCi0JcHVibGljIHN0YXRpYyB2b2lkIHBhaW50V3JhcFRleHQoDQotCQlHQyBnYywNCi0JCVBvaW50IHNpemUsDQotCQlTdHJpbmcgdGV4dCwNCi0JCWludCBtYXJnaW5XaWR0aCwNCi0JCWludCBtYXJnaW5IZWlnaHQpIHsNCi0JCXBhaW50V3JhcFRleHQoZ2MsIHNpemUsIHRleHQsIG1hcmdpbldpZHRoLCBtYXJnaW5IZWlnaHQsIGZhbHNlKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcGFpbnRXcmFwVGV4dCgNCi0JCUdDIGdjLA0KLQkJUG9pbnQgc2l6ZSwNCi0JCVN0cmluZyB0ZXh0LA0KLQkJaW50IG1hcmdpbldpZHRoLA0KLQkJaW50IG1hcmdpbkhlaWdodCwNCi0JCWJvb2xlYW4gdW5kZXJsaW5lKSB7DQotCQlCcmVha0l0ZXJhdG9yIHdiID0gQnJlYWtJdGVyYXRvci5nZXRXb3JkSW5zdGFuY2UoKTsNCi0JCXdiLnNldFRleHQodGV4dCk7DQotCQlGb250TWV0cmljcyBmbSA9IGdjLmdldEZvbnRNZXRyaWNzKCk7DQotCQlpbnQgbGluZUhlaWdodCA9IGZtLmdldEhlaWdodCgpOw0KLQkJaW50IGRlc2NlbnQgPSBmbS5nZXREZXNjZW50KCk7DQotDQotCQlpbnQgc2F2ZWQgPSAwOw0KLQkJaW50IGxhc3QgPSAwOw0KLQkJaW50IHkgPSBtYXJnaW5IZWlnaHQ7DQotCQlpbnQgd2lkdGggPSBzaXplLnggLSBtYXJnaW5XaWR0aCAqIDI7DQotDQotCQlmb3IgKGludCBsb2MgPSB3Yi5maXJzdCgpOw0KLQkJCWxvYyAhPSBCcmVha0l0ZXJhdG9yLkRPTkU7DQotCQkJbG9jID0gd2IubmV4dCgpKSB7DQotCQkJU3RyaW5nIGxpbmUgPSB0ZXh0LnN1YnN0cmluZyhzYXZlZCwgbG9jKTsNCi0JCQlQb2ludCBleHRlbnQgPSBnYy50ZXh0RXh0ZW50KGxpbmUpOw0KLQkJCWlmIChleHRlbnQueCA+IHdpZHRoKSB7DQotCQkJCS8vIG92ZXJmbG93DQotCQkJCVN0cmluZyBwcmV2TGluZSA9IHRleHQuc3Vic3RyaW5nKHNhdmVkLCBsYXN0KTsNCi0JCQkJZ2MuZHJhd1N0cmluZyhwcmV2TGluZSwgbWFyZ2luV2lkdGgsIHksIHRydWUpOw0KLQkJCQlpZiAodW5kZXJsaW5lKSB7DQotCQkJCQlQb2ludCBwcmV2RXh0ZW50ID0gZ2MudGV4dEV4dGVudChwcmV2TGluZSk7DQotCQkJCQlpbnQgbGluZVkgPSB5ICsgbGluZUhlaWdodCAtIGRlc2NlbnQgKyAxOw0KLQkJCQkJZ2MuZHJhd0xpbmUobWFyZ2luV2lkdGgsIGxpbmVZLCBwcmV2RXh0ZW50LngsIGxpbmVZKTsNCi0JCQkJfQ0KLQ0KLQkJCQlzYXZlZCA9IGxhc3Q7DQotCQkJCXkgKz0gbGluZUhlaWdodDsNCi0JCQl9DQotCQkJbGFzdCA9IGxvYzsNCi0JCX0NCi0JCS8vIHBhaW50IHRoZSBsYXN0IGxpbmUNCi0JCVN0cmluZyBsYXN0TGluZSA9IHRleHQuc3Vic3RyaW5nKHNhdmVkLCBsYXN0KTsNCi0JCWdjLmRyYXdTdHJpbmcobGFzdExpbmUsIG1hcmdpbldpZHRoLCB5LCB0cnVlKTsNCi0JCWlmICh1bmRlcmxpbmUpIHsNCi0JCQlpbnQgbGluZVkgPSB5ICsgbGluZUhlaWdodCAtIGRlc2NlbnQgKyAxOw0KLQkJCVBvaW50IGxhc3RFeHRlbnQgPSBnYy50ZXh0RXh0ZW50KGxhc3RMaW5lKTsNCi0JCQlnYy5kcmF3TGluZShtYXJnaW5XaWR0aCwgbGluZVksIG1hcmdpbldpZHRoICsgbGFzdEV4dGVudC54LCBsaW5lWSk7DQotCQl9DQotCX0NCi0NCi0JcHJvdGVjdGVkIHZvaWQgcGFpbnQoUGFpbnRFdmVudCBlKSB7DQotCQlHQyBnYyA9IGUuZ2M7DQotCQlQb2ludCBzaXplID0gZ2V0U2l6ZSgpOw0KLQkJZ2Muc2V0Rm9udChnZXRGb250KCkpOw0KLQkJZ2Muc2V0Rm9yZWdyb3VuZChnZXRGb3JlZ3JvdW5kKCkpOw0KLQkJaWYgKChnZXRTdHlsZSgpICYgU1dULldSQVApICE9IDApIHsNCi0JCQlwYWludFdyYXBUZXh0KA0KLQkJCQlnYywNCi0JCQkJc2l6ZSwNCi0JCQkJdGV4dCwNCi0JCQkJdGV4dE1hcmdpbldpZHRoLA0KLQkJCQl0ZXh0TWFyZ2luSGVpZ2h0LA0KLQkJCQl1bmRlcmxpbmVkKTsNCi0JCX0gZWxzZSB7DQotCQkJZ2MuZHJhd1RleHQoZ2V0VGV4dCgpLCB0ZXh0TWFyZ2luV2lkdGgsIHRleHRNYXJnaW5IZWlnaHQsIHRydWUpOw0KLQkJCWlmICh1bmRlcmxpbmVkKSB7DQotCQkJCUZvbnRNZXRyaWNzIGZtID0gZ2MuZ2V0Rm9udE1ldHJpY3MoKTsNCi0JCQkJaW50IGRlc2NlbnQgPSBmbS5nZXREZXNjZW50KCk7DQotCQkJCWludCBsaW5lWSA9IHNpemUueSAtIHRleHRNYXJnaW5IZWlnaHQgLSBkZXNjZW50ICsgMTsNCi0JCQkJZ2MuZHJhd0xpbmUoDQotCQkJCQl0ZXh0TWFyZ2luV2lkdGgsDQotCQkJCQlsaW5lWSwNCi0JCQkJCXNpemUueCAtIHRleHRNYXJnaW5XaWR0aCwNCi0JCQkJCWxpbmVZKTsNCi0JCQl9DQotCQl9DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL0Zvcm1TZWN0aW9uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvRm9ybVNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQyMjMxZC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvRm9ybVNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMuaW50ZXJuYWw7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuQ2xpcGJvYXJkOw0KLQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBGb3JtU2VjdGlvbiBpbXBsZW1lbnRzIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHsNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VMRUNUSU9OID0gMTsNCi0JcHJpdmF0ZSBTdHJpbmcgaGVhZGVyQ29sb3JLZXkgPSBGb3JtV2lkZ2V0RmFjdG9yeS5ERUZBVUxUX0hFQURFUl9DT0xPUjsNCi0JcHJpdmF0ZSBTdHJpbmcgaGVhZGVyVGV4dDsNCi0JcHJpdmF0ZSBDb250cm9sIGNsaWVudDsNCi0JcHJvdGVjdGVkIExhYmVsIGhlYWRlcjsNCi0JcHJvdGVjdGVkIENvbnRyb2wgc2VwYXJhdG9yOw0KLQlwcml2YXRlIFNlY3Rpb25DaGFuZ2VNYW5hZ2VyIHNlY3Rpb25NYW5hZ2VyOw0KLQlwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbjsNCi0JcHJpdmF0ZSBib29sZWFuIGRpcnR5Ow0KLQlwcm90ZWN0ZWQgTGFiZWwgZGVzY3JpcHRpb25MYWJlbDsNCi0JcHJpdmF0ZSBUb2dnbGVDb250cm9sIHRvZ2dsZTsNCi0JcHJpdmF0ZSBib29sZWFuIHJlYWRPbmx5Ow0KLQlwcml2YXRlIGJvb2xlYW4gYWRkU2VwYXJhdG9yID0gdHJ1ZTsNCi0JcHJpdmF0ZSBib29sZWFuIGRlc2NyaXB0aW9uUGFpbnRlZCA9IHRydWU7DQotCXByaXZhdGUgYm9vbGVhbiBoZWFkZXJQYWludGVkID0gdHJ1ZTsNCi0JcHJpdmF0ZSBib29sZWFuIGNvbGxhcHNhYmxlID0gZmFsc2U7DQotCXByaXZhdGUgYm9vbGVhbiBjb2xsYXBzZWQgPSBmYWxzZTsNCi0JcHJpdmF0ZSBpbnQgd2lkdGhIaW50ID0gU1dULkRFRkFVTFQ7DQotCXByaXZhdGUgaW50IGhlaWdodEhpbnQgPSBTV1QuREVGQVVMVDsNCi0JcHJpdmF0ZSBDb21wb3NpdGUgY29udHJvbDsNCi0JcHVibGljIGJvb2xlYW4gY29tcGFjdE1vZGU9ZmFsc2U7DQotDQotCS8qDQotCSAqIFRoaXMgaXMgYSBzcGVjaWFsIGxheW91dCBmb3IgdGhlIHNlY3Rpb24uIEJvdGggdGhlDQotCSAqIGhlYWRlciBhbmQgdGhlIGRlc2NyaXB0aW9uIGxhYmVscyB3aWxsIHdyYXAgYW5kDQotCSAqIHRoZXkgd2lsbCB1c2UgY2xpZW50J3Mgc2l6ZSB0byBjYWxjdWxhdGUgbmVlZGVkDQotCSAqIGhlaWdodC4gVGhpcyBraW5kIG9mIGJlaGF2aW91ciBpcyBub3QgcG9zc2libGUNCi0JICogd2l0aCBzdG9jayBncmlkIGxheW91dC4NCi0JICovDQotCWNsYXNzIFNlY3Rpb25MYXlvdXQgZXh0ZW5kcyBMYXlvdXQgaW1wbGVtZW50cyBJTGF5b3V0RXh0ZW5zaW9uIHsNCi0JCWludCB2c3BhY2luZyA9IDM7DQotCQlpbnQgc2VwSGVpZ2h0ID0gMjsNCi0NCi0JCXB1YmxpYyBpbnQgZ2V0TWluaW11bVdpZHRoKENvbXBvc2l0ZSBwYXJlbnQsIGJvb2xlYW4gZmx1c2gpIHsNCi0JCQlyZXR1cm4gMzA7DQotCQl9DQotDQotCQlwdWJsaWMgaW50IGdldE1heGltdW1XaWR0aChDb21wb3NpdGUgcGFyZW50LCBib29sZWFuIGZsdXNoKSB7DQotCQkJaW50IG1heFdpZHRoID0gMDsNCi0JCQlpZiAoY2xpZW50ICE9IG51bGwpIHsNCi0JCQkJaWYgKGNsaWVudCBpbnN0YW5jZW9mIENvbXBvc2l0ZSkgew0KLQkJCQkJTGF5b3V0IGNsID0gKChDb21wb3NpdGUpIGNsaWVudCkuZ2V0TGF5b3V0KCk7DQotCQkJCQlpZiAoY2wgaW5zdGFuY2VvZiBJTGF5b3V0RXh0ZW5zaW9uKQ0KLQkJCQkJCW1heFdpZHRoID0NCi0JCQkJCQkJKChJTGF5b3V0RXh0ZW5zaW9uKSBjbCkuZ2V0TWF4aW11bVdpZHRoKA0KLQkJCQkJCQkJKENvbXBvc2l0ZSkgY2xpZW50LA0KLQkJCQkJCQkJZmx1c2gpOw0KLQkJCQl9DQotCQkJCWlmIChtYXhXaWR0aCA9PSAwKSB7DQotCQkJCQlQb2ludCBjc2l6ZSA9DQotCQkJCQkJY2xpZW50LmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwgZmx1c2gpOw0KLQkJCQkJbWF4V2lkdGggPSBjc2l6ZS54Ow0KLQkJCQl9DQotCQkJfQ0KLQkJCWlmIChoZWFkZXJQYWludGVkICYmIGhlYWRlciAhPSBudWxsKSB7DQotCQkJCVBvaW50IGhzaXplID0NCi0JCQkJCWhlYWRlci5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIGZsdXNoKTsNCi0JCQkJbWF4V2lkdGggPSBNYXRoLm1heChtYXhXaWR0aCwgaHNpemUueCk7DQotCQkJfQ0KLQkJCWlmIChkZXNjcmlwdGlvblBhaW50ZWQgJiYgZGVzY3JpcHRpb25MYWJlbCAhPSBudWxsKSB7DQotCQkJCVBvaW50IGRzaXplID0NCi0JCQkJCWRlc2NyaXB0aW9uTGFiZWwuY29tcHV0ZVNpemUoDQotCQkJCQkJU1dULkRFRkFVTFQsDQotCQkJCQkJU1dULkRFRkFVTFQsDQotCQkJCQkJZmx1c2gpOw0KLQkJCQltYXhXaWR0aCA9IE1hdGgubWF4KG1heFdpZHRoLCBkc2l6ZS54KTsNCi0JCQl9DQotCQkJcmV0dXJuIG1heFdpZHRoOw0KLQkJfQ0KLQ0KLQkJcHJvdGVjdGVkIFBvaW50IGNvbXB1dGVTaXplKA0KLQkJCUNvbXBvc2l0ZSBwYXJlbnQsDQotCQkJaW50IHdIaW50LA0KLQkJCWludCBoSGludCwNCi0JCQlib29sZWFuIGZsdXNoKSB7DQotCQkJaW50IHdpZHRoID0gMDsNCi0JCQlpbnQgaGVpZ2h0ID0gMDsNCi0JCQlpbnQgY3dpZHRoID0gMDsNCi0JCQlpbnQgY29sbGFwc2VkSGVpZ2h0ID0gMDsNCi0NCi0JCQlpZiAod0hpbnQgIT0gU1dULkRFRkFVTFQpDQotCQkJCXdpZHRoID0gd0hpbnQ7DQotCQkJaWYgKGhIaW50ICE9IFNXVC5ERUZBVUxUKQ0KLQkJCQloZWlnaHQgPSBoSGludDsNCi0NCi0JCQljd2lkdGggPSB3aWR0aDsNCi0NCi0JCQlpZiAoY2xpZW50ICE9IG51bGwgJiYgIWNsaWVudC5pc0Rpc3Bvc2VkKCkpIHsNCi0JCQkJaWYgKHRvZ2dsZSAhPSBudWxsICYmIHRvZ2dsZS5nZXRTZWxlY3Rpb24oKSAmJiBjb21wYWN0TW9kZSkgew0KLQkJCQl9DQotCQkJCWVsc2Ugew0KLQkJCQkvL1BvaW50IGNzaXplID0gY2xpZW50LmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwgZmx1c2gpOw0KLQkJCQlQb2ludCBjc2l6ZSA9IGNsaWVudC5jb21wdXRlU2l6ZSh3SGludCwgU1dULkRFRkFVTFQpOw0KLQkJCQlpZiAod2lkdGggPT0gMCkgew0KLQkJCQkJd2lkdGggPSBjc2l6ZS54Ow0KLQkJCQkJY3dpZHRoID0gd2lkdGg7DQotCQkJCX0NCi0JCQkJaWYgKGhlaWdodCA9PSAwKQ0KLQkJCQkJaGVpZ2h0ID0gY3NpemUueTsNCi0JCQkJfQ0KLQkJCX0NCi0NCi0JCQlQb2ludCB0b2dnbGVTaXplID0gbnVsbDsNCi0NCi0JCQlpZiAoY29sbGFwc2FibGUgJiYgdG9nZ2xlICE9IG51bGwpDQotCQkJCXRvZ2dsZVNpemUgPQ0KLQkJCQkJdG9nZ2xlLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwgZmx1c2gpOw0KLQ0KLQkJCWlmIChoSGludCA9PSBTV1QuREVGQVVMVCAmJiBoZWFkZXJQYWludGVkICYmIGhlYWRlciAhPSBudWxsKSB7DQotCQkJCWludCBod2lkdGggPSBjd2lkdGg7DQotCQkJCWlmICh0b2dnbGVTaXplICE9IG51bGwpDQotCQkJCQlod2lkdGggPSBjd2lkdGggLSB0b2dnbGVTaXplLnggLSA1Ow0KLQkJCQlQb2ludCBoc2l6ZSA9IGhlYWRlci5jb21wdXRlU2l6ZShod2lkdGgsIFNXVC5ERUZBVUxULCBmbHVzaCk7DQotCQkJCWhlaWdodCArPSBoc2l6ZS55Ow0KLQkJCQljb2xsYXBzZWRIZWlnaHQgPSBoc2l6ZS55Ow0KLQkJCQloZWlnaHQgKz0gdnNwYWNpbmc7DQotCQkJfQ0KLQ0KLQkJCWlmIChoSGludCA9PSBTV1QuREVGQVVMVCAmJiBhZGRTZXBhcmF0b3IpIHsNCi0JCQkJaGVpZ2h0ICs9IHNlcEhlaWdodDsNCi0JCQkJaGVpZ2h0ICs9IHZzcGFjaW5nOw0KLQkJCQljb2xsYXBzZWRIZWlnaHQgKz0gdnNwYWNpbmcgKyBzZXBIZWlnaHQ7DQotCQkJfQ0KLQkJCWlmIChoSGludCA9PSBTV1QuREVGQVVMVA0KLQkJCQkmJiBkZXNjcmlwdGlvblBhaW50ZWQNCi0JCQkJJiYgZGVzY3JpcHRpb25MYWJlbCAhPSBudWxsKSB7DQotCQkJCVBvaW50IGRzaXplID0NCi0JCQkJCWRlc2NyaXB0aW9uTGFiZWwuY29tcHV0ZVNpemUoY3dpZHRoLCBTV1QuREVGQVVMVCwgZmx1c2gpOw0KLQkJCQloZWlnaHQgKz0gZHNpemUueTsNCi0JCQkJaGVpZ2h0ICs9IHZzcGFjaW5nOw0KLQkJCX0NCi0JCQlpZiAodG9nZ2xlICE9IG51bGwgJiYgdG9nZ2xlLmdldFNlbGVjdGlvbigpKSB7DQotCQkJCS8vIGNvbGxhcHNlZCBzdGF0ZQ0KLQkJCQloZWlnaHQgPSBjb2xsYXBzZWRIZWlnaHQ7DQotCQkJfQ0KLQkJCXJldHVybiBuZXcgUG9pbnQod2lkdGgsIGhlaWdodCk7DQotCQl9DQotCQlwcm90ZWN0ZWQgdm9pZCBsYXlvdXQoQ29tcG9zaXRlIHBhcmVudCwgYm9vbGVhbiBmbHVzaCkgew0KLQkJCWludCB3aWR0aCA9IHBhcmVudC5nZXRDbGllbnRBcmVhKCkud2lkdGg7DQotCQkJaW50IGhlaWdodCA9IHBhcmVudC5nZXRDbGllbnRBcmVhKCkuaGVpZ2h0Ow0KLQkJCWludCB5ID0gMDsNCi0JCQlQb2ludCB0b2dnbGVTaXplID0gbnVsbDsNCi0NCi0JCQlpZiAoY29sbGFwc2FibGUpIHsNCi0JCQkJdG9nZ2xlU2l6ZSA9DQotCQkJCQl0b2dnbGUuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCBmbHVzaCk7DQotCQkJfQ0KLQkJCWlmIChoZWFkZXJQYWludGVkICYmIGhlYWRlciAhPSBudWxsKSB7DQotCQkJCVBvaW50IGhzaXplOw0KLQ0KLQkJCQlpbnQgYXZhaWxhYmxlV2lkdGggPSB3aWR0aDsNCi0JCQkJaWYgKHRvZ2dsZVNpemUgIT0gbnVsbCkNCi0JCQkJCWF2YWlsYWJsZVdpZHRoID0gd2lkdGggLSB0b2dnbGVTaXplLnggLSA1Ow0KLQkJCQloc2l6ZSA9IGhlYWRlci5jb21wdXRlU2l6ZShhdmFpbGFibGVXaWR0aCwgU1dULkRFRkFVTFQsIGZsdXNoKTsNCi0JCQkJaW50IGh4ID0gMDsNCi0JCQkJaWYgKHRvZ2dsZSAhPSBudWxsKSB7DQotCQkJCQlpbnQgdHkgPSB5ICsgaHNpemUueSAtIHRvZ2dsZVNpemUueTsNCi0JCQkJCXRvZ2dsZS5zZXRCb3VuZHMoMCwgdHksIHRvZ2dsZVNpemUueCwgdG9nZ2xlU2l6ZS55KTsNCi0JCQkJCWh4ID0gdG9nZ2xlU2l6ZS54OyAvLyArIDU7DQotCQkJCX0NCi0JCQkJaGVhZGVyLnNldEJvdW5kcyhoeCwgeSwgYXZhaWxhYmxlV2lkdGgsIGhzaXplLnkpOw0KLQ0KLQkJCQl5ICs9IGhzaXplLnkgKyB2c3BhY2luZzsNCi0JCQl9DQotCQkJaWYgKGFkZFNlcGFyYXRvciAmJiBzZXBhcmF0b3IgIT0gbnVsbCkgew0KLQkJCQlzZXBhcmF0b3Iuc2V0Qm91bmRzKDAsIHksIHdpZHRoLCAyKTsNCi0JCQkJeSArPSBzZXBIZWlnaHQgKyB2c3BhY2luZzsNCi0JCQl9DQotCQkJaWYgKHRvZ2dsZSAhPSBudWxsICYmIHRvZ2dsZS5nZXRTZWxlY3Rpb24oKSkgew0KLQkJCQlyZXR1cm47DQotCQkJfQ0KLQkJCWlmIChkZXNjcmlwdGlvblBhaW50ZWQgJiYgZGVzY3JpcHRpb25MYWJlbCAhPSBudWxsKSB7DQotCQkJCVBvaW50IGRzaXplID0NCi0JCQkJCWRlc2NyaXB0aW9uTGFiZWwuY29tcHV0ZVNpemUod2lkdGgsIFNXVC5ERUZBVUxULCBmbHVzaCk7DQotCQkJCWRlc2NyaXB0aW9uTGFiZWwuc2V0Qm91bmRzKDAsIHksIHdpZHRoLCBkc2l6ZS55KTsNCi0JCQkJeSArPSBkc2l6ZS55ICsgdnNwYWNpbmc7DQotCQkJfQ0KLQkJCWlmIChjbGllbnQgIT0gbnVsbCkgew0KLQkJCQljbGllbnQuc2V0Qm91bmRzKDAsIHksIHdpZHRoLCBoZWlnaHQgLSB5KTsNCi0JCQl9DQotCQl9DQotCX0NCi0NCi0JLyoqDQotCSAqIEByZXR1cm4NCi0JICovDQotCXB1YmxpYyBib29sZWFuIGlzQ29tcGFjdE1vZGUoKSB7DQotCQlyZXR1cm4gY29tcGFjdE1vZGU7DQotCX0NCi0NCi0JLyoqDQotCSAqIEBwYXJhbSBjb21wYWN0TW9kZQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0Q29tcGFjdE1vZGUoYm9vbGVhbiBjb21wYWN0TW9kZSkgew0KLQkJdGhpcy5jb21wYWN0TW9kZSA9IGNvbXBhY3RNb2RlOw0KLQl9DQotDQotCXB1YmxpYyBGb3JtU2VjdGlvbigpIHsNCi0JCS8qDQotCQkvLyBEZXNjcmlwdGlvbiBjYXVzZXMgcHJvYmxlbXMgcmUgd29yZCB3cmFwcGluZw0KLQkJLy8gYW5kIGNhdXNlcyBiYWQgbGF5b3V0IGluIHNjaGVtYSBhbmQNCi0JCS8vIGZlYXR1cmUgZWRpdG9ycyB3aGVuIGluIE1vdGlmIC0gdHVybmluZyBvZmYNCi0JCWlmIChTV1QuZ2V0UGxhdGZvcm0oKS5lcXVhbHMoIm1vdGlmIikpIHsNCi0JCQlkZXNjcmlwdGlvblBhaW50ZWQgPSBmYWxzZTsNCi0JCX0NCi0JCSovDQotCQlKRmFjZVJlc291cmNlcy5nZXRGb250UmVnaXN0cnkoKS5hZGRMaXN0ZW5lcih0aGlzKTsNCi0JfQ0KLQlwdWJsaWMgdm9pZCBjb21taXRDaGFuZ2VzKGJvb2xlYW4gb25TYXZlKSB7DQotCX0NCi0JcHVibGljIGFic3RyYWN0IENvbXBvc2l0ZSBjcmVhdGVDbGllbnQoDQotCQlDb21wb3NpdGUgcGFyZW50LA0KLQkJRm9ybVdpZGdldEZhY3RvcnkgZmFjdG9yeSk7DQotCXB1YmxpYyBmaW5hbCBDb250cm9sIGNyZWF0ZUNvbnRyb2woDQotCQlDb21wb3NpdGUgcGFyZW50LA0KLQkJZmluYWwgRm9ybVdpZGdldEZhY3RvcnkgZmFjdG9yeSkgew0KLQkJQ29tcG9zaXRlIHNlY3Rpb24gPSBmYWN0b3J5LmNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQpOw0KLQkJU2VjdGlvbkxheW91dCBzbGF5b3V0ID0gbmV3IFNlY3Rpb25MYXlvdXQoKTsNCi0JCXNlY3Rpb24uc2V0TGF5b3V0KHNsYXlvdXQpOw0KLQkJc2VjdGlvbi5zZXREYXRhKHRoaXMpOw0KLQ0KLQkJaWYgKGhlYWRlclBhaW50ZWQpIHsNCi0JCQlDb2xvciBoZWFkZXJDb2xvciA9IGZhY3RvcnkuZ2V0Q29sb3IoZ2V0SGVhZGVyQ29sb3JLZXkoKSk7DQotCQkJaGVhZGVyID0NCi0JCQkJZmFjdG9yeS5jcmVhdGVIZWFkaW5nTGFiZWwoDQotCQkJCQlzZWN0aW9uLA0KLQkJCQkJZ2V0SGVhZGVyVGV4dCgpLA0KLQkJCQkJaGVhZGVyQ29sb3IsDQotCQkJCQlTV1QuV1JBUCk7DQotCQkJaWYgKGNvbGxhcHNhYmxlKSB7DQotCQkJCXRvZ2dsZSA9IG5ldyBUb2dnbGVDb250cm9sKHNlY3Rpb24sIFNXVC5OVUxMKTsNCi0JCQkJdG9nZ2xlLnNldFNlbGVjdGlvbihjb2xsYXBzZWQpOw0KLQkJCQl0b2dnbGUuc2V0QmFja2dyb3VuZChmYWN0b3J5LmdldEJhY2tncm91bmRDb2xvcigpKTsNCi0JCQkJdG9nZ2xlLnNldEFjdGl2ZURlY29yYXRpb25Db2xvcihmYWN0b3J5LmdldEh5cGVybGlua0NvbG9yKCkpOw0KLQkJCQl0b2dnbGUuc2V0RGVjb3JhdGlvbkNvbG9yKA0KLQkJCQkJZmFjdG9yeS5nZXRDb2xvcigNCi0JCQkJCQlGb3JtV2lkZ2V0RmFjdG9yeS5DT0xPUl9DT01QT1NJVEVfU0VQQVJBVE9SKSk7DQotCQkJCXRvZ2dsZS5zZXRBY3RpdmVDdXJzb3IoZmFjdG9yeS5nZXRIeXBlcmxpbmtDdXJzb3IoKSk7DQotCQkJCXRvZ2dsZS5hZGRGb2N1c0xpc3RlbmVyKGZhY3RvcnkudmlzaWJpbGl0eUhhbmRsZXIpOw0KLQkJCQl0b2dnbGUuYWRkS2V5TGlzdGVuZXIoZmFjdG9yeS5rZXlib2FyZEhhbmRsZXIpOw0KLQkJCQl0b2dnbGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7DQotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7DQotCQkJCQkJZG9Ub2dnbGUoKTsNCi0JCQkJCX0NCi0JCQkJfSk7DQotCQkJCWhlYWRlci5hZGRNb3VzZUxpc3RlbmVyKG5ldyBNb3VzZUFkYXB0ZXIoKSB7DQotCQkJCQlwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBlKSB7DQotCQkJCQkJdG9nZ2xlLnNldFNlbGVjdGlvbighdG9nZ2xlLmdldFNlbGVjdGlvbigpKTsNCi0JCQkJCQl0b2dnbGUucmVkcmF3KCk7DQotCQkJCQkJZG9Ub2dnbGUoKTsNCi0JCQkJCX0NCi0JCQkJfSk7DQotCQkJCWhlYWRlci5hZGRNb3VzZVRyYWNrTGlzdGVuZXIobmV3IE1vdXNlVHJhY2tBZGFwdGVyKCkgew0KLQkJCQkJcHVibGljIHZvaWQgbW91c2VFbnRlcihNb3VzZUV2ZW50IGUpIHsNCi0JCQkJCQloZWFkZXIuc2V0Q3Vyc29yKGZhY3RvcnkuZ2V0SHlwZXJsaW5rQ3Vyc29yKCkpOw0KLQkJCQkJfQ0KLQkJCQkJcHVibGljIHZvaWQgbW91c2VFeGl0KE1vdXNlRXZlbnQgZSkgew0KLQkJCQkJCWhlYWRlci5zZXRDdXJzb3IobnVsbCk7DQotCQkJCQl9DQotCQkJCX0pOw0KLQkJCX0NCi0JCX0NCi0NCi0JCWlmIChhZGRTZXBhcmF0b3IpIHsNCi0JCQkvL3NlcGFyYXRvciA9IGZhY3RvcnkuY3JlYXRlU2VwYXJhdG9yKHNlY3Rpb24sIFNXVC5IT1JJWk9OVEFMKTsNCi0JCQlzZXBhcmF0b3IgPSBmYWN0b3J5LmNyZWF0ZUNvbXBvc2l0ZVNlcGFyYXRvcihzZWN0aW9uKTsNCi0JCX0NCi0NCi0JCWlmIChkZXNjcmlwdGlvblBhaW50ZWQgJiYgZGVzY3JpcHRpb24gIT0gbnVsbCkgew0KLQkJCWRlc2NyaXB0aW9uTGFiZWwgPQ0KLQkJCQlmYWN0b3J5LmNyZWF0ZUxhYmVsKHNlY3Rpb24sIGRlc2NyaXB0aW9uLCBTV1QuV1JBUCk7DQotCQl9DQotCQljbGllbnQgPSBjcmVhdGVDbGllbnQoc2VjdGlvbiwgZmFjdG9yeSk7DQotCQlzZWN0aW9uLnNldERhdGEodGhpcyk7DQotCQljb250cm9sID0gc2VjdGlvbjsNCi0JCXJldHVybiBzZWN0aW9uOw0KLQl9DQotDQotCXByaXZhdGUgdm9pZCBkb1RvZ2dsZSgpIHsNCi0JCWNvbGxhcHNlZCA9IHRvZ2dsZS5nZXRTZWxlY3Rpb24oKTsNCi0JCXJlZmxvdygpOw0KLQkJaWYgKGRlc2NyaXB0aW9uTGFiZWwgIT0gbnVsbCkNCi0JCQlkZXNjcmlwdGlvbkxhYmVsLnNldFZpc2libGUoIWNvbGxhcHNlZCk7DQotCQlpZiAoY2xpZW50ICE9IG51bGwpDQotCQkJY2xpZW50LnNldFZpc2libGUoIWNvbGxhcHNlZCk7DQotCX0NCi0NCi0JcHJvdGVjdGVkIHZvaWQgcmVmbG93KCkgew0KLQkJY29udHJvbC5zZXRSZWRyYXcoZmFsc2UpOw0KLQkJY29udHJvbC5nZXRQYXJlbnQoKS5zZXRSZWRyYXcoZmFsc2UpOw0KLQkJY29udHJvbC5sYXlvdXQodHJ1ZSk7DQotCQljb250cm9sLmdldFBhcmVudCgpLmxheW91dCh0cnVlKTsNCi0JCWNvbnRyb2wuc2V0UmVkcmF3KHRydWUpOw0KLQkJY29udHJvbC5nZXRQYXJlbnQoKS5zZXRSZWRyYXcodHJ1ZSk7DQotCX0NCi0NCi0JcHJvdGVjdGVkIFRleHQgY3JlYXRlVGV4dCgNCi0JCUNvbXBvc2l0ZSBwYXJlbnQsDQotCQlTdHJpbmcgbGFiZWwsDQotCQlGb3JtV2lkZ2V0RmFjdG9yeSBmYWN0b3J5KSB7DQotCQlyZXR1cm4gY3JlYXRlVGV4dChwYXJlbnQsIGxhYmVsLCBmYWN0b3J5LCAxKTsNCi0JfQ0KLQlwcm90ZWN0ZWQgVGV4dCBjcmVhdGVUZXh0KA0KLQkJQ29tcG9zaXRlIHBhcmVudCwNCi0JCVN0cmluZyBsYWJlbCwNCi0JCUZvcm1XaWRnZXRGYWN0b3J5IGZhY3RvcnksDQotCQlpbnQgc3Bhbikgew0KLQkJZmFjdG9yeS5jcmVhdGVMYWJlbChwYXJlbnQsIGxhYmVsKTsNCi0JCVRleHQgdGV4dCA9IGZhY3RvcnkuY3JlYXRlVGV4dChwYXJlbnQsICIiKTsNCi0JCWludCBoZmlsbCA9DQotCQkJc3BhbiA9PSAxDQotCQkJCT8gR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMDQotCQkJCTogR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMOw0KLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoaGZpbGwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIpOw0KLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSBzcGFuOw0KLQkJdGV4dC5zZXRMYXlvdXREYXRhKGdkKTsNCi0JCXJldHVybiB0ZXh0Ow0KLQl9DQotCXByb3RlY3RlZCBUZXh0IGNyZWF0ZVRleHQoDQotCQlDb21wb3NpdGUgcGFyZW50LA0KLQkJU3RyaW5nIGxhYmVsLA0KLQkJRm9ybVdpZGdldEZhY3RvcnkgZmFjdG9yeSwNCi0JCWludCBzcGFuLA0KLQkJaW50IHN0eWxlKSB7DQotCQlMYWJlbCBsID0gZmFjdG9yeS5jcmVhdGVMYWJlbChwYXJlbnQsIGxhYmVsKTsNCi0JCWlmICgoc3R5bGUgJiBTV1QuTVVMVEkpICE9IDApIHsNCi0JCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpOw0KLQkJCWwuc2V0TGF5b3V0RGF0YShnZCk7DQotCQl9DQotCQlUZXh0IHRleHQgPSBmYWN0b3J5LmNyZWF0ZVRleHQocGFyZW50LCAiIiwgc3R5bGUpOw0KLQkJaW50IGhmaWxsID0NCi0JCQlzcGFuID09IDENCi0JCQkJPyBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwNCi0JCQkJOiBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEw7DQotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShoZmlsbCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0NFTlRFUik7DQotCQlnZC5ob3Jpem9udGFsU3BhbiA9IHNwYW47DQotCQl0ZXh0LnNldExheW91dERhdGEoZ2QpOw0KLQkJcmV0dXJuIHRleHQ7DQotCX0NCi0JcHJvdGVjdGVkIFRleHQgY3JlYXRlVGV4dCgNCi0JCUNvbXBvc2l0ZSBwYXJlbnQsDQotCQlGb3JtV2lkZ2V0RmFjdG9yeSBmYWN0b3J5LA0KLQkJaW50IHNwYW4pIHsNCi0JCVRleHQgdGV4dCA9IGZhY3RvcnkuY3JlYXRlVGV4dChwYXJlbnQsICIiKTsNCi0JCWludCBoZmlsbCA9DQotCQkJc3BhbiA9PSAxDQotCQkJCT8gR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMDQotCQkJCTogR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMOw0KLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoaGZpbGwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIpOw0KLQkJLy9nZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsNCi0JCWdkLmhvcml6b250YWxTcGFuID0gc3BhbjsNCi0JCXRleHQuc2V0TGF5b3V0RGF0YShnZCk7DQotCQlyZXR1cm4gdGV4dDsNCi0JfQ0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgew0KLQkJSkZhY2VSZXNvdXJjZXMuZ2V0Rm9udFJlZ2lzdHJ5KCkucmVtb3ZlTGlzdGVuZXIodGhpcyk7DQotCX0NCi0JcHVibGljIGJvb2xlYW4gZG9HbG9iYWxBY3Rpb24oU3RyaW5nIGFjdGlvbklkKSB7DQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi0JcHVibGljIHZvaWQgZXhwYW5kVG8oT2JqZWN0IG9iamVjdCkgew0KLQl9DQotCXB1YmxpYyBmaW5hbCB2b2lkIGZpcmVDaGFuZ2VOb3RpZmljYXRpb24oDQotCQlpbnQgY2hhbmdlVHlwZSwNCi0JCU9iamVjdCBjaGFuZ2VPYmplY3QpIHsNCi0JCWlmIChzZWN0aW9uTWFuYWdlciA9PSBudWxsKQ0KLQkJCXJldHVybjsNCi0JCXNlY3Rpb25NYW5hZ2VyLmRpc3BhdGNoTm90aWZpY2F0aW9uKHRoaXMsIGNoYW5nZVR5cGUsIGNoYW5nZU9iamVjdCk7DQotCX0NCi0JcHVibGljIGZpbmFsIHZvaWQgZmlyZVNlbGVjdGlvbk5vdGlmaWNhdGlvbihPYmplY3QgY2hhbmdlT2JqZWN0KSB7DQotCQlmaXJlQ2hhbmdlTm90aWZpY2F0aW9uKFNFTEVDVElPTiwgY2hhbmdlT2JqZWN0KTsNCi0JfQ0KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsNCi0JCXJldHVybiBkZXNjcmlwdGlvbjsNCi0JfQ0KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRIZWFkZXJDb2xvcktleSgpIHsNCi0JCXJldHVybiBoZWFkZXJDb2xvcktleTsNCi0JfQ0KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRIZWFkZXJUZXh0KCkgew0KLQkJcmV0dXJuIGhlYWRlclRleHQ7DQotCX0NCi0JcHVibGljIGludCBnZXRIZWlnaHRIaW50KCkgew0KLQkJcmV0dXJuIGhlaWdodEhpbnQ7DQotCX0NCi0JcHVibGljIGludCBnZXRXaWR0aEhpbnQoKSB7DQotCQlyZXR1cm4gd2lkdGhIaW50Ow0KLQl9DQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoT2JqZWN0IGlucHV0KSB7DQotCX0NCi0JcHVibGljIGJvb2xlYW4gaXNBZGRTZXBhcmF0b3IoKSB7DQotCQlyZXR1cm4gYWRkU2VwYXJhdG9yOw0KLQl9DQotCXB1YmxpYyBib29sZWFuIGlzRGVzY3JpcHRpb25QYWludGVkKCkgew0KLQkJcmV0dXJuIGRlc2NyaXB0aW9uUGFpbnRlZDsNCi0JfQ0KLQlwdWJsaWMgYm9vbGVhbiBpc0RpcnR5KCkgew0KLQkJcmV0dXJuIGRpcnR5Ow0KLQl9DQotCXB1YmxpYyBib29sZWFuIGlzSGVhZGVyUGFpbnRlZCgpIHsNCi0JCXJldHVybiBoZWFkZXJQYWludGVkOw0KLQl9DQotCXB1YmxpYyBib29sZWFuIGlzUmVhZE9ubHkoKSB7DQotCQlyZXR1cm4gcmVhZE9ubHk7DQotCX0NCi0JcHVibGljIHZvaWQgc2VjdGlvbkNoYW5nZWQoDQotCQlGb3JtU2VjdGlvbiBzb3VyY2UsDQotCQlpbnQgY2hhbmdlVHlwZSwNCi0JCU9iamVjdCBjaGFuZ2VPYmplY3QpIHsNCi0JfQ0KLQlwdWJsaWMgdm9pZCBzZXRBZGRTZXBhcmF0b3IoYm9vbGVhbiBuZXdBZGRTZXBhcmF0b3IpIHsNCi0JCWFkZFNlcGFyYXRvciA9IG5ld0FkZFNlcGFyYXRvcjsNCi0JfQ0KLQ0KLQlwcml2YXRlIFN0cmluZyB0cmltTmV3TGluZXMoU3RyaW5nIHRleHQpIHsNCi0JCVN0cmluZ0J1ZmZlciBidWZmID0gbmV3IFN0cmluZ0J1ZmZlcigpOw0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXh0Lmxlbmd0aCgpOyBpKyspIHsNCi0JCQljaGFyIGMgPSB0ZXh0LmNoYXJBdChpKTsNCi0JCQlpZiAoYyA9PSAnXG4nKQ0KLQkJCQlidWZmLmFwcGVuZCgnICcpOw0KLQkJCWVsc2UNCi0JCQkJYnVmZi5hcHBlbmQoYyk7DQotCQl9DQotCQlyZXR1cm4gYnVmZi50b1N0cmluZygpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKGphdmEubGFuZy5TdHJpbmcgbmV3RGVzY3JpcHRpb24pIHsNCi0JCS8vIHdlIHdpbGwgdHJpbSB0aGUgbmV3IGxpbmVzIHNvIHRoYXQgd2UgY2FuDQotCQkvLyB1c2UgbGF5b3V0LWJhc2VkIHdvcmQgd3JhcHBpbmcgaW5zdGVhZA0KLQkJLy8gb2YgaGFyZC1jb2RlZCBvbmUNCi0JCWRlc2NyaXB0aW9uID0gdHJpbU5ld0xpbmVzKG5ld0Rlc2NyaXB0aW9uKTsNCi0JCS8vZGVzY3JpcHRpb24gPSBuZXdEZXNjcmlwdGlvbjsNCi0JCWlmIChkZXNjcmlwdGlvbkxhYmVsICE9IG51bGwpDQotCQkJZGVzY3JpcHRpb25MYWJlbC5zZXRUZXh0KG5ld0Rlc2NyaXB0aW9uKTsNCi0JfQ0KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvblBhaW50ZWQoYm9vbGVhbiBuZXdEZXNjcmlwdGlvblBhaW50ZWQpIHsNCi0JCWRlc2NyaXB0aW9uUGFpbnRlZCA9IG5ld0Rlc2NyaXB0aW9uUGFpbnRlZDsNCi0JfQ0KLQlwdWJsaWMgdm9pZCBzZXREaXJ0eShib29sZWFuIG5ld0RpcnR5KSB7DQotCQlkaXJ0eSA9IG5ld0RpcnR5Ow0KLQl9DQotCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgew0KLQkJaWYgKHRvZ2dsZSAhPSBudWxsKQ0KLQkJCXRvZ2dsZS5zZXRGb2N1cygpOw0KLQl9DQotCXB1YmxpYyB2b2lkIHNldEhlYWRlckNvbG9yS2V5KGphdmEubGFuZy5TdHJpbmcgbmV3SGVhZGVyQ29sb3JLZXkpIHsNCi0JCWhlYWRlckNvbG9yS2V5ID0gbmV3SGVhZGVyQ29sb3JLZXk7DQotCX0NCi0JcHVibGljIHZvaWQgc2V0SGVhZGVyUGFpbnRlZChib29sZWFuIG5ld0hlYWRlclBhaW50ZWQpIHsNCi0JCWhlYWRlclBhaW50ZWQgPSBuZXdIZWFkZXJQYWludGVkOw0KLQl9DQotCXB1YmxpYyB2b2lkIHNldEhlYWRlclRleHQoamF2YS5sYW5nLlN0cmluZyBuZXdIZWFkZXJUZXh0KSB7DQotCQloZWFkZXJUZXh0ID0gbmV3SGVhZGVyVGV4dDsNCi0JCWlmIChoZWFkZXIgIT0gbnVsbCkNCi0JCQloZWFkZXIuc2V0VGV4dChoZWFkZXJUZXh0KTsNCi0JfQ0KLQlwdWJsaWMgdm9pZCBzZXRIZWlnaHRIaW50KGludCBuZXdIZWlnaHRIaW50KSB7DQotCQloZWlnaHRIaW50ID0gbmV3SGVpZ2h0SGludDsNCi0JfQ0KLQl2b2lkIHNldE1hbmFnZXIoU2VjdGlvbkNoYW5nZU1hbmFnZXIgbWFuYWdlcikgew0KLQkJdGhpcy5zZWN0aW9uTWFuYWdlciA9IG1hbmFnZXI7DQotCX0NCi0JcHVibGljIHZvaWQgc2V0UmVhZE9ubHkoYm9vbGVhbiBuZXdSZWFkT25seSkgew0KLQkJcmVhZE9ubHkgPSBuZXdSZWFkT25seTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBzZXRXaWR0aEhpbnQoaW50IG5ld1dpZHRoSGludCkgew0KLQkJd2lkdGhIaW50ID0gbmV3V2lkdGhIaW50Ow0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGFyZzApIHsNCi0JCWlmIChjb250cm9sICE9IG51bGwgJiYgaGVhZGVyICE9IG51bGwgJiYgIWNvbnRyb2wuaXNEaXNwb3NlZCgpICYmICFoZWFkZXIuaXNEaXNwb3NlZCgpKSB7DQotCQkJaGVhZGVyLnNldEZvbnQoSkZhY2VSZXNvdXJjZXMuZ2V0QmFubmVyRm9udCgpKTsNCi0JCQljb250cm9sLmxheW91dCh0cnVlKTsNCi0JCX0NCi0JfQ0KLQ0KLQkvKioNCi0JICogR2V0cyB0aGUgY29sbGFwc2FibGUuDQotCSAqIEByZXR1cm4gUmV0dXJucyBhIGJvb2xlYW4NCi0JICovDQotCXB1YmxpYyBib29sZWFuIGdldENvbGxhcHNhYmxlKCkgew0KLQkJcmV0dXJuIGNvbGxhcHNhYmxlOw0KLQl9DQotDQotCS8qKg0KLQkgKiBTZXRzIHRoZSBjb2xsYXBzYWJsZS4NCi0JICogQHBhcmFtIGNvbGxhcHNhYmxlIFRoZSBjb2xsYXBzYWJsZSB0byBzZXQNCi0JICovDQotCXB1YmxpYyB2b2lkIHNldENvbGxhcHNhYmxlKGJvb2xlYW4gY29sbGFwc2FibGUpIHsNCi0JCXRoaXMuY29sbGFwc2FibGUgPSBjb2xsYXBzYWJsZTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBzZXRDb2xsYXBzZWQoYm9vbGVhbiBjb2xsYXBzZWQpIHsNCi0JCXRoaXMuY29sbGFwc2VkID0gY29sbGFwc2VkOw0KLQl9DQotCQ0KLQlwdWJsaWMgYm9vbGVhbiBpc0NvbGxhcHNlZCgpIHsNCi0JCXJldHVybiBjb2xsYXBzZWQ7DQotCX0NCi0NCi0JcHVibGljIGJvb2xlYW4gY2FuUGFzdGUoQ2xpcGJvYXJkIGNsaXBib2FyZCkgew0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9Gb3JtV2lkZ2V0RmFjdG9yeS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL0Zvcm1XaWRnZXRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0YjljZDcuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL0Zvcm1XaWRnZXRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zLmludGVybmFsOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsNCi1pbXBvcnQgamF2YS51dGlsLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMuaW50ZXJuYWwuZW5naW5lLkZvcm1FbmdpbmU7DQotDQotcHVibGljIGNsYXNzIEZvcm1XaWRnZXRGYWN0b3J5IHsNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0RSQVdfQk9SREVSID0gIkZvcm1XaWRnZXRGYWN0b3J5LmRyYXdCb3JkZXIiOw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUUkVFX0JPUkRFUiA9ICJ0cmVlQm9yZGVyIjsNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9IRUFERVJfQ09MT1IgPSAiX19kZWZhdWx0X19oZWFkZXJfXyI7DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTE9SX0JPUkRFUiA9ICJfX2JvcmRlciI7DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTE9SX0NPTVBPU0lURV9TRVBBUkFUT1IgPSAiX19jb21wU2VwIjsNCi0NCi0JcHJpdmF0ZSBIYXNodGFibGUgY29sb3JSZWdpc3RyeSA9IG5ldyBIYXNodGFibGUoKTsNCi0JcHJpdmF0ZSBDb2xvciBiYWNrZ3JvdW5kQ29sb3I7DQotCXByaXZhdGUgS2V5TGlzdGVuZXIgZGVsZXRlTGlzdGVuZXI7DQotCXByaXZhdGUgQ29sb3IgZm9yZWdyb3VuZENvbG9yOw0KLQlwcml2YXRlIERpc3BsYXkgZGlzcGxheTsNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQk9SREVSX1NUWUxFID0gU1dULk5PTkU7IC8vU1dULkJPUkRFUjsNCi0JcHJpdmF0ZSBCb3JkZXJQYWludGVyIGJvcmRlclBhaW50ZXI7DQotCXByaXZhdGUgQ29sb3IgYm9yZGVyQ29sb3I7DQotCXByaXZhdGUgSHlwZXJsaW5rSGFuZGxlciBoeXBlcmxpbmtIYW5kbGVyOw0KLQkvKiBkZWZhdWx0ICovIFZpc2liaWxpdHlIYW5kbGVyIHZpc2liaWxpdHlIYW5kbGVyOw0KLQkvKiBkZWZhdWx0ICovIEtleWJvYXJkSGFuZGxlciBrZXlib2FyZEhhbmRsZXI7DQotDQotCWNsYXNzIEJvcmRlclBhaW50ZXIgaW1wbGVtZW50cyBQYWludExpc3RlbmVyIHsNCi0JCXB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChQYWludEV2ZW50IGV2ZW50KSB7DQotCQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IChDb21wb3NpdGUpIGV2ZW50LndpZGdldDsNCi0JCQlDb250cm9sW10gY2hpbGRyZW4gPSBjb21wb3NpdGUuZ2V0Q2hpbGRyZW4oKTsNCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7DQotCQkJCUNvbnRyb2wgYyA9IGNoaWxkcmVuW2ldOw0KLQkJCQlib29sZWFuIGluYWN0aXZlQm9yZGVyPWZhbHNlOw0KLQkJCQlpZiAoYy5nZXRFbmFibGVkKCkgPT0gZmFsc2UgJiYgIShjIGluc3RhbmNlb2YgQ0NvbWJvKSkNCi0JCQkJCWNvbnRpbnVlOw0KLQkJCQlpZiAoYyBpbnN0YW5jZW9mIFNlbGVjdGFibGVGb3JtTGFiZWwpDQotCQkJCQljb250aW51ZTsNCi0JCQkJT2JqZWN0IGZsYWcgPSBjLmdldERhdGEoS0VZX0RSQVdfQk9SREVSKTsNCi0JCQkJaWYgKGZsYWchPW51bGwpIHsNCi0JCQkJCWlmIChmbGFnLmVxdWFscyhCb29sZWFuLkZBTFNFKSkgY29udGludWU7DQotCQkJCQlpZiAoZmxhZy5lcXVhbHMoVFJFRV9CT1JERVIpKSBpbmFjdGl2ZUJvcmRlcj10cnVlOw0KLQkJCQl9DQotCQkJCSANCi0JCQkJaWYgKCFpbmFjdGl2ZUJvcmRlciAmJiAoYyBpbnN0YW5jZW9mIFRleHQgfHwgYyBpbnN0YW5jZW9mIENhbnZhcyB8fCBjIGluc3RhbmNlb2YgQ0NvbWJvKSkgew0KLQkJCQkJUmVjdGFuZ2xlIGIgPSBjLmdldEJvdW5kcygpOw0KLQkJCQkJR0MgZ2MgPSBldmVudC5nYzsNCi0JCQkJCWdjLnNldEZvcmVncm91bmQoYy5nZXRCYWNrZ3JvdW5kKCkpOw0KLQkJCQkJZ2MuZHJhd1JlY3RhbmdsZShiLnggLSAxLCBiLnkgLSAxLCBiLndpZHRoICsgMSwgYi5oZWlnaHQgKyAxKTsNCi0JCQkJCWdjLnNldEZvcmVncm91bmQoZm9yZWdyb3VuZENvbG9yKTsNCi0JCQkJCWlmIChjIGluc3RhbmNlb2YgQ0NvbWJvKQ0KLQkJCQkJCWdjLmRyYXdSZWN0YW5nbGUoYi54IC0gMSwgYi55IC0gMSwgYi53aWR0aCArIDEsIGIuaGVpZ2h0ICsgMSk7DQotCQkJCQllbHNlIA0KLQkJCQkJCWdjLmRyYXdSZWN0YW5nbGUoYi54IC0gMSwgYi55IC0gMiwgYi53aWR0aCArIDEsIGIuaGVpZ2h0ICsgMyk7DQotCQkJCX0gZWxzZSBpZiAoaW5hY3RpdmVCb3JkZXIgfHxjIGluc3RhbmNlb2YgVGFibGUgfHwgYyBpbnN0YW5jZW9mIFRyZWUgfHwgYyBpbnN0YW5jZW9mIFRhYmxlVHJlZSkgew0KLQkJCQkJUmVjdGFuZ2xlIGIgPSBjLmdldEJvdW5kcygpOw0KLQkJCQkJR0MgZ2MgPSBldmVudC5nYzsNCi0JCQkJCWdjLnNldEZvcmVncm91bmQoYm9yZGVyQ29sb3IpOw0KLQkJCQkJLy9nYy5kcmF3UmVjdGFuZ2xlKGIueCAtIDIsIGIueSAtIDIsIGIud2lkdGggKyAzLCBiLmhlaWdodCArIDMpOw0KLQkJCQkJZ2MuZHJhd1JlY3RhbmdsZShiLnggLSAxLCBiLnkgLSAxLCBiLndpZHRoICsgMiwgYi5oZWlnaHQgKyAyKTsNCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0JfQ0KLQ0KLQljbGFzcyBWaXNpYmlsaXR5SGFuZGxlciBleHRlbmRzIEZvY3VzQWRhcHRlciB7DQotCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsNCi0JCQlXaWRnZXQgdyA9IGUud2lkZ2V0Ow0KLQkJCWlmICh3IGluc3RhbmNlb2YgQ29udHJvbCkgew0KLQkJCQllbnN1cmVWaXNpYmxlKChDb250cm9sKSB3KTsNCi0JCQl9DQotCQl9DQotCX0NCi0NCi0JY2xhc3MgS2V5Ym9hcmRIYW5kbGVyIGV4dGVuZHMgS2V5QWRhcHRlciB7DQotCQlwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGUpIHsNCi0JCQlXaWRnZXQgdyA9IGUud2lkZ2V0Ow0KLQkJCWlmICh3IGluc3RhbmNlb2YgQ29udHJvbCkgew0KLQkJCQlwcm9jZXNzS2V5KGUua2V5Q29kZSwgKENvbnRyb2wpIHcpOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQ0KLQlwdWJsaWMgRm9ybVdpZGdldEZhY3RvcnkoKSB7DQotCQl0aGlzKERpc3BsYXkuZ2V0Q3VycmVudCgpKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgRm9ybVdpZGdldEZhY3RvcnkoRGlzcGxheSBkaXNwbGF5KSB7DQotCQl0aGlzLmRpc3BsYXkgPSBkaXNwbGF5Ow0KLQkJaW5pdGlhbGl6ZSgpOw0KLQl9DQotDQotCXB1YmxpYyBzdGF0aWMgU2Nyb2xsZWRDb21wb3NpdGUgZ2V0U2Nyb2xsZWRDb21wb3NpdGUoQ29udHJvbCBjKSB7DQotCQlDb21wb3NpdGUgcGFyZW50ID0gYy5nZXRQYXJlbnQoKTsNCi0NCi0JCXdoaWxlIChwYXJlbnQgIT0gbnVsbCkgew0KLQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBTY3JvbGxlZENvbXBvc2l0ZSkgew0KLQkJCQlyZXR1cm4gKFNjcm9sbGVkQ29tcG9zaXRlKSBwYXJlbnQ7DQotCQkJfQ0KLQkJCXBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnQoKTsNCi0JCX0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCXB1YmxpYyBzdGF0aWMgdm9pZCBlbnN1cmVWaXNpYmxlKENvbnRyb2wgYykgew0KLQkJU2Nyb2xsZWRDb21wb3NpdGUgc2NvbXAgPSBnZXRTY3JvbGxlZENvbXBvc2l0ZShjKTsNCi0JCWlmIChzY29tcCAhPSBudWxsKSB7DQotCQkJQWJzdHJhY3RTZWN0aW9uRm9ybS5lbnN1cmVWaXNpYmxlKHNjb21wLCBjKTsNCi0JCX0NCi0JfQ0KLQ0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcHJvY2Vzc0tleShpbnQga2V5Q29kZSwgQ29udHJvbCBjKSB7DQotCQlTY3JvbGxlZENvbXBvc2l0ZSBzY29tcCA9IGdldFNjcm9sbGVkQ29tcG9zaXRlKGMpOw0KLQkJaWYgKHNjb21wICE9IG51bGwpIHsNCi0JCQlzd2l0Y2ggKGtleUNvZGUpIHsNCi0JCQkJY2FzZSBTV1QuQVJST1dfRE9XTiA6DQotCQkJCQlBYnN0cmFjdFNlY3Rpb25Gb3JtLnNjcm9sbFZlcnRpY2FsKHNjb21wLCBmYWxzZSk7DQotCQkJCQlicmVhazsNCi0JCQkJY2FzZSBTV1QuQVJST1dfVVAgOg0KLQkJCQkJQWJzdHJhY3RTZWN0aW9uRm9ybS5zY3JvbGxWZXJ0aWNhbChzY29tcCwgdHJ1ZSk7DQotCQkJCQlicmVhazsNCi0JCQkJY2FzZSBTV1QuQVJST1dfTEVGVCA6DQotCQkJCQlBYnN0cmFjdFNlY3Rpb25Gb3JtLnNjcm9sbEhvcml6b250YWwoc2NvbXAsIHRydWUpOw0KLQkJCQkJYnJlYWs7DQotCQkJCWNhc2UgU1dULkFSUk9XX1JJR0hUIDoNCi0JCQkJCUFic3RyYWN0U2VjdGlvbkZvcm0uc2Nyb2xsSG9yaXpvbnRhbChzY29tcCwgZmFsc2UpOw0KLQkJCQkJYnJlYWs7DQotCQkJCWNhc2UgU1dULlBBR0VfVVAgOg0KLQkJCQkJQWJzdHJhY3RTZWN0aW9uRm9ybS5zY3JvbGxQYWdlKHNjb21wLCB0cnVlKTsNCi0JCQkJCWJyZWFrOw0KLQkJCQljYXNlIFNXVC5QQUdFX0RPV04gOg0KLQkJCQkJQWJzdHJhY3RTZWN0aW9uRm9ybS5zY3JvbGxQYWdlKHNjb21wLCBmYWxzZSk7DQotCQkJCQlicmVhazsNCi0JCQl9DQotCQl9DQotCX0NCi0NCi0JcHVibGljIEJ1dHRvbiBjcmVhdGVCdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQsIGludCBzdHlsZSkgew0KLQkJaW50IGZsYXRTdHlsZSA9IEJPUkRFUl9TVFlMRSA9PSBTV1QuQk9SREVSID8gU1dULk5VTEwgOiBTV1QuRkxBVDsNCi0JCS8vaW50IGZsYXRTdHlsZSA9IFNXVC5OVUxMOw0KLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBzdHlsZSB8IGZsYXRTdHlsZSk7DQotCQlidXR0b24uc2V0QmFja2dyb3VuZChiYWNrZ3JvdW5kQ29sb3IpOw0KLQkJYnV0dG9uLnNldEZvcmVncm91bmQoZm9yZWdyb3VuZENvbG9yKTsNCi0JCWlmICh0ZXh0ICE9IG51bGwpDQotCQkJYnV0dG9uLnNldFRleHQodGV4dCk7DQotCQlidXR0b24uYWRkRm9jdXNMaXN0ZW5lcih2aXNpYmlsaXR5SGFuZGxlcik7DQotCQlyZXR1cm4gYnV0dG9uOw0KLQl9DQotCXB1YmxpYyBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsNCi0JCXJldHVybiBjcmVhdGVDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7DQotCX0NCi0JcHVibGljIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7DQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIHN0eWxlKTsNCi0JCWNvbXBvc2l0ZS5zZXRCYWNrZ3JvdW5kKGJhY2tncm91bmRDb2xvcik7DQotCQljb21wb3NpdGUuYWRkTW91c2VMaXN0ZW5lcihuZXcgTW91c2VBZGFwdGVyKCkgew0KLQkJCXB1YmxpYyB2b2lkIG1vdXNlUHJlc3NlZChNb3VzZUV2ZW50IGUpIHsNCi0JCQkJKChDb250cm9sKSBlLndpZGdldCkuc2V0Rm9jdXMoKTsNCi0JCQl9DQotCQl9KTsNCi0JCWNvbXBvc2l0ZS5zZXRNZW51KHBhcmVudC5nZXRNZW51KCkpOw0KLQkJcmV0dXJuIGNvbXBvc2l0ZTsNCi0JfQ0KLQlwdWJsaWMgQ29tcG9zaXRlIGNyZWF0ZUNvbXBvc2l0ZVNlcGFyYXRvcihDb21wb3NpdGUgcGFyZW50KSB7DQotCQlmaW5hbCBDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsNCi0JCWNvbXBvc2l0ZS5hZGRMaXN0ZW5lcihTV1QuUGFpbnQsIG5ldyBMaXN0ZW5lcigpIHsNCi0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7DQotCQkJCWlmIChjb21wb3NpdGUuaXNEaXNwb3NlZCgpKSByZXR1cm47DQotCQkJCVJlY3RhbmdsZSBib3VuZHMgPSBjb21wb3NpdGUuZ2V0Qm91bmRzKCk7DQotCQkJCUdDIGdjID0gZS5nYzsNCi0JCQkJZ2Muc2V0Rm9yZWdyb3VuZChnZXRDb2xvcihDT0xPUl9DT01QT1NJVEVfU0VQQVJBVE9SKSk7DQotCQkJCWdjLnNldEJhY2tncm91bmQoZ2V0QmFja2dyb3VuZENvbG9yKCkpOw0KLQkJCQlnYy5maWxsR3JhZGllbnRSZWN0YW5nbGUoMCwgMCwgYm91bmRzLndpZHRoLCBib3VuZHMuaGVpZ2h0LCBmYWxzZSk7CQ0KLQkJCX0NCi0JCX0pOw0KLQkJcmV0dXJuIGNvbXBvc2l0ZTsNCi0JfQ0KLQ0KLQlwdWJsaWMgTGFiZWwgY3JlYXRlSGVhZGluZ0xhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KSB7DQotCQlyZXR1cm4gY3JlYXRlSGVhZGluZ0xhYmVsKHBhcmVudCwgdGV4dCwgbnVsbCwgU1dULk5PTkUpOw0KLQl9DQotDQotCXB1YmxpYyBMYWJlbCBjcmVhdGVIZWFkaW5nTGFiZWwoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQsIGludCBzdHlsZSkgew0KLQkJcmV0dXJuIGNyZWF0ZUhlYWRpbmdMYWJlbChwYXJlbnQsIHRleHQsIG51bGwsIHN0eWxlKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgTGFiZWwgY3JlYXRlSGVhZGluZ0xhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0LCBDb2xvciBiZykgew0KLQkJcmV0dXJuIGNyZWF0ZUhlYWRpbmdMYWJlbChwYXJlbnQsIHRleHQsIGJnLCBTV1QuTk9ORSk7DQotCX0NCi0NCi0JcHVibGljIExhYmVsIGNyZWF0ZUhlYWRpbmdMYWJlbCgNCi0JCUNvbXBvc2l0ZSBwYXJlbnQsDQotCQlTdHJpbmcgdGV4dCwNCi0JCUNvbG9yIGJnLA0KLQkJaW50IHN0eWxlKSB7DQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIHN0eWxlKTsNCi0JCWlmICh0ZXh0ICE9IG51bGwpDQotCQkJbGFiZWwuc2V0VGV4dCh0ZXh0KTsNCi0JCWxhYmVsLnNldEJhY2tncm91bmQoYmFja2dyb3VuZENvbG9yKTsNCi0JCWxhYmVsLnNldEZvcmVncm91bmQoZm9yZWdyb3VuZENvbG9yKTsNCi0JCWxhYmVsLnNldEZvbnQoSkZhY2VSZXNvdXJjZXMuZ2V0Rm9udFJlZ2lzdHJ5KCkuZ2V0KEpGYWNlUmVzb3VyY2VzLkJBTk5FUl9GT05UKSk7DQotCQlyZXR1cm4gbGFiZWw7DQotCX0NCi0NCi0JcHVibGljIExhYmVsIGNyZWF0ZUh5cGVybGlua0xhYmVsKA0KLQkJQ29tcG9zaXRlIHBhcmVudCwNCi0JCVN0cmluZyB0ZXh0LA0KLQkJSUh5cGVybGlua0xpc3RlbmVyIGxpc3RlbmVyKSB7DQotCQlyZXR1cm4gY3JlYXRlSHlwZXJsaW5rTGFiZWwocGFyZW50LCB0ZXh0LCBsaXN0ZW5lciwgU1dULk5VTEwpOw0KLQl9DQotCXB1YmxpYyBMYWJlbCBjcmVhdGVIeXBlcmxpbmtMYWJlbCgNCi0JCUNvbXBvc2l0ZSBwYXJlbnQsDQotCQlTdHJpbmcgdGV4dCwNCi0JCUlIeXBlcmxpbmtMaXN0ZW5lciBsaXN0ZW5lciwNCi0JCWludCBzdHlsZSkgew0KLQkJTGFiZWwgbGFiZWwgPSBjcmVhdGVMYWJlbChwYXJlbnQsIHRleHQsIHN0eWxlKTsNCi0JCXR1cm5JbnRvSHlwZXJsaW5rKGxhYmVsLCBsaXN0ZW5lcik7DQotCQlyZXR1cm4gbGFiZWw7DQotCX0NCi0JcHVibGljIExhYmVsIGNyZWF0ZUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KSB7DQotCQlyZXR1cm4gY3JlYXRlTGFiZWwocGFyZW50LCB0ZXh0LCBTV1QuTk9ORSk7DQotCX0NCi0JcHVibGljIExhYmVsIGNyZWF0ZUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0LCBpbnQgc3R5bGUpIHsNCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgc3R5bGUpOw0KLQkJaWYgKHRleHQgIT0gbnVsbCkNCi0JCQlsYWJlbC5zZXRUZXh0KHRleHQpOw0KLQkJbGFiZWwuc2V0QmFja2dyb3VuZChiYWNrZ3JvdW5kQ29sb3IpOw0KLQkJbGFiZWwuc2V0Rm9yZWdyb3VuZChmb3JlZ3JvdW5kQ29sb3IpOw0KLQkJcmV0dXJuIGxhYmVsOw0KLQl9DQotDQotCXB1YmxpYyBTZWxlY3RhYmxlRm9ybUxhYmVsIGNyZWF0ZVNlbGVjdGFibGVMYWJlbCgNCi0JCUNvbXBvc2l0ZSBwYXJlbnQsDQotCQlTdHJpbmcgdGV4dCkgew0KLQkJcmV0dXJuIGNyZWF0ZVNlbGVjdGFibGVMYWJlbChwYXJlbnQsIHRleHQsIFNXVC5OT05FKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgU2VsZWN0YWJsZUZvcm1MYWJlbCBjcmVhdGVTZWxlY3RhYmxlTGFiZWwoDQotCQlDb21wb3NpdGUgcGFyZW50LA0KLQkJU3RyaW5nIHRleHQsDQotCQlpbnQgc3R5bGUpIHsNCi0JCVNlbGVjdGFibGVGb3JtTGFiZWwgbGFiZWwgPSBuZXcgU2VsZWN0YWJsZUZvcm1MYWJlbChwYXJlbnQsIHN0eWxlKTsNCi0JCWlmICh0ZXh0ICE9IG51bGwpDQotCQkJbGFiZWwuc2V0VGV4dCh0ZXh0KTsNCi0JCWxhYmVsLnNldEJhY2tncm91bmQoYmFja2dyb3VuZENvbG9yKTsNCi0JCWxhYmVsLnNldEZvcmVncm91bmQoZm9yZWdyb3VuZENvbG9yKTsNCi0JCWxhYmVsLmFkZEZvY3VzTGlzdGVuZXIodmlzaWJpbGl0eUhhbmRsZXIpOw0KLQkJbGFiZWwuYWRkS2V5TGlzdGVuZXIoa2V5Ym9hcmRIYW5kbGVyKTsNCi0JCXJldHVybiBsYWJlbDsNCi0JfQ0KLQ0KLQlwdWJsaWMgRm9ybUVuZ2luZSBjcmVhdGVGb3JtRW5naW5lKENvbXBvc2l0ZSBwYXJlbnQpIHsNCi0JCXJldHVybiBjcmVhdGVGb3JtRW5naW5lKHBhcmVudCwgZmFsc2UpOw0KLQl9DQotCQ0KLQlwdWJsaWMgRm9ybUVuZ2luZSBjcmVhdGVGb3JtRW5naW5lKENvbXBvc2l0ZSBwYXJlbnQsIGJvb2xlYW4gdHJhY2tGb2N1cykgew0KLQkJRm9ybUVuZ2luZSBlbmdpbmUgPSBuZXcgRm9ybUVuZ2luZShwYXJlbnQsIFNXVC5XUkFQKTsNCi0JCWVuZ2luZS5zZXRCYWNrZ3JvdW5kKGJhY2tncm91bmRDb2xvcik7DQotCQllbmdpbmUuc2V0Rm9yZWdyb3VuZChmb3JlZ3JvdW5kQ29sb3IpOw0KLQkJZW5naW5lLm1hcmdpbldpZHRoID0gMTsNCi0JCWVuZ2luZS5tYXJnaW5IZWlnaHQgPSAwOw0KLQkJZW5naW5lLnNldEh5cGVybGlua1NldHRpbmdzKGdldEh5cGVybGlua0hhbmRsZXIoKSk7DQotCQlpZiAodHJhY2tGb2N1cykgZW5naW5lLmFkZEZvY3VzTGlzdGVuZXIodmlzaWJpbGl0eUhhbmRsZXIpOw0KLQkJZW5naW5lLmFkZEtleUxpc3RlbmVyKGtleWJvYXJkSGFuZGxlcik7DQotCQllbmdpbmUuc2V0TWVudShwYXJlbnQuZ2V0TWVudSgpKTsNCi0JCXJldHVybiBlbmdpbmU7DQotCX0NCi0JDQotCXB1YmxpYyBMYWJlbCBjcmVhdGVTZXBhcmF0b3IoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7DQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5TRVBBUkFUT1IgfCBzdHlsZSk7DQotCQlsYWJlbC5zZXRCYWNrZ3JvdW5kKGJhY2tncm91bmRDb2xvcik7DQotCQlsYWJlbC5zZXRGb3JlZ3JvdW5kKGJvcmRlckNvbG9yKTsNCi0JCXJldHVybiBsYWJlbDsNCi0JfQ0KLQlwdWJsaWMgVGFibGUgY3JlYXRlVGFibGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7DQotCQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShwYXJlbnQsIEJPUkRFUl9TVFlMRSB8IHN0eWxlKTsNCi0JCXRhYmxlLnNldEJhY2tncm91bmQoYmFja2dyb3VuZENvbG9yKTsNCi0JCXRhYmxlLnNldEZvcmVncm91bmQoZm9yZWdyb3VuZENvbG9yKTsNCi0JCWhvb2tEZWxldGVMaXN0ZW5lcih0YWJsZSk7DQotCQlyZXR1cm4gdGFibGU7DQotCX0NCi0JcHVibGljIFRleHQgY3JlYXRlVGV4dChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdmFsdWUpIHsNCi0JCXJldHVybiBjcmVhdGVUZXh0KHBhcmVudCwgdmFsdWUsIEJPUkRFUl9TVFlMRSB8IFNXVC5TSU5HTEUpOw0KLQl9DQotCXB1YmxpYyBUZXh0IGNyZWF0ZVRleHQoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHZhbHVlLCBpbnQgc3R5bGUpIHsNCi0JCVRleHQgdGV4dCA9IG5ldyBUZXh0KHBhcmVudCwgc3R5bGUpOw0KLQkJaWYgKHZhbHVlICE9IG51bGwpDQotCQkJdGV4dC5zZXRUZXh0KHZhbHVlKTsNCi0JCXRleHQuc2V0QmFja2dyb3VuZChiYWNrZ3JvdW5kQ29sb3IpOw0KLQkJdGV4dC5zZXRGb3JlZ3JvdW5kKGZvcmVncm91bmRDb2xvcik7DQotCQl0ZXh0LmFkZEZvY3VzTGlzdGVuZXIodmlzaWJpbGl0eUhhbmRsZXIpOw0KLQkJcmV0dXJuIHRleHQ7DQotCX0NCi0JcHVibGljIFRyZWUgY3JlYXRlVHJlZShDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsNCi0JCVRyZWUgdHJlZSA9IG5ldyBUcmVlKHBhcmVudCwgQk9SREVSX1NUWUxFIHwgc3R5bGUpOw0KLQkJdHJlZS5zZXRCYWNrZ3JvdW5kKGJhY2tncm91bmRDb2xvcik7DQotCQl0cmVlLnNldEZvcmVncm91bmQoZm9yZWdyb3VuZENvbG9yKTsNCi0JCWhvb2tEZWxldGVMaXN0ZW5lcih0cmVlKTsNCi0JCXJldHVybiB0cmVlOw0KLQl9DQotCXByaXZhdGUgdm9pZCBkZWxldGVLZXlQcmVzc2VkKFdpZGdldCB3aWRnZXQpIHsNCi0JCWlmICghKHdpZGdldCBpbnN0YW5jZW9mIENvbnRyb2wpKQ0KLQkJCXJldHVybjsNCi0JCUNvbnRyb2wgY29udHJvbCA9IChDb250cm9sKSB3aWRnZXQ7DQotCQlmb3IgKENvbnRyb2wgcGFyZW50ID0gY29udHJvbC5nZXRQYXJlbnQoKTsNCi0JCQlwYXJlbnQgIT0gbnVsbDsNCi0JCQlwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50KCkpIHsNCi0JCQlpZiAocGFyZW50LmdldERhdGEoKSBpbnN0YW5jZW9mIEZvcm1TZWN0aW9uKSB7DQotCQkJCUZvcm1TZWN0aW9uIHNlY3Rpb24gPSAoRm9ybVNlY3Rpb24pIHBhcmVudC5nZXREYXRhKCk7DQotCQkJCXNlY3Rpb24uZG9HbG9iYWxBY3Rpb24oQWN0aW9uRmFjdG9yeS5ERUxFVEUuZ2V0SWQoKSk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgew0KLQkJRW51bWVyYXRpb24gY29sb3JzID0gY29sb3JSZWdpc3RyeS5lbGVtZW50cygpOw0KLQkJd2hpbGUgKGNvbG9ycy5oYXNNb3JlRWxlbWVudHMoKSkgew0KLQkJCUNvbG9yIGMgPSAoQ29sb3IpIGNvbG9ycy5uZXh0RWxlbWVudCgpOw0KLQkJCWMuZGlzcG9zZSgpOw0KLQkJfQ0KLQkJaHlwZXJsaW5rSGFuZGxlci5kaXNwb3NlKCk7DQotCQljb2xvclJlZ2lzdHJ5ID0gbnVsbDsNCi0JfQ0KLQlwdWJsaWMgQ29sb3IgZ2V0QmFja2dyb3VuZENvbG9yKCkgew0KLQkJcmV0dXJuIGJhY2tncm91bmRDb2xvcjsNCi0JfQ0KLQlwdWJsaWMgQ29sb3IgZ2V0Qm9yZGVyQ29sb3IoKSB7DQotCQlyZXR1cm4gYm9yZGVyQ29sb3I7DQotCX0NCi0JcHVibGljIEN1cnNvciBnZXRCdXN5Q3Vyc29yKCkgew0KLQkJcmV0dXJuIGh5cGVybGlua0hhbmRsZXIuZ2V0QnVzeUN1cnNvcigpOw0KLQl9DQotCXB1YmxpYyBDb2xvciBnZXRDb2xvcihTdHJpbmcga2V5KSB7DQotCQlyZXR1cm4gKENvbG9yKSBjb2xvclJlZ2lzdHJ5LmdldChrZXkpOw0KLQl9DQotCXB1YmxpYyBDb2xvciBnZXRGb3JlZ3JvdW5kQ29sb3IoKSB7DQotCQlyZXR1cm4gZm9yZWdyb3VuZENvbG9yOw0KLQl9DQotCXB1YmxpYyBIeXBlcmxpbmtIYW5kbGVyIGdldEh5cGVybGlua0hhbmRsZXIoKSB7DQotCQlyZXR1cm4gaHlwZXJsaW5rSGFuZGxlcjsNCi0JfQ0KLQlwdWJsaWMgQ3Vyc29yIGdldEh5cGVybGlua0N1cnNvcigpIHsNCi0JCXJldHVybiBoeXBlcmxpbmtIYW5kbGVyLmdldEh5cGVybGlua0N1cnNvcigpOw0KLQl9DQotCXB1YmxpYyBDb2xvciBnZXRIeXBlcmxpbmtDb2xvcigpIHsNCi0JCXJldHVybiBoeXBlcmxpbmtIYW5kbGVyLmdldEZvcmVncm91bmQoKTsNCi0JfQ0KLQlwdWJsaWMgQ29sb3IgZ2V0SHlwZXJsaW5rSG92ZXJDb2xvcigpIHsNCi0JCXJldHVybiBoeXBlcmxpbmtIYW5kbGVyLmdldEFjdGl2ZUZvcmVncm91bmQoKTsNCi0JfQ0KLQlwdWJsaWMgaW50IGdldEh5cGVybGlua1VuZGVybGluZU1vZGUoKSB7DQotCQlyZXR1cm4gaHlwZXJsaW5rSGFuZGxlci5nZXRIeXBlcmxpbmtVbmRlcmxpbmVNb2RlKCk7DQotCX0NCi0JcHVibGljIHZvaWQgaG9va0RlbGV0ZUxpc3RlbmVyKENvbnRyb2wgY29udHJvbCkgew0KLQkJaWYgKGRlbGV0ZUxpc3RlbmVyID09IG51bGwpIHsNCi0JCQlkZWxldGVMaXN0ZW5lciA9IG5ldyBLZXlBZGFwdGVyKCkgew0KLQkJCQlwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGV2ZW50KSB7DQotCQkJCQlpZiAoZXZlbnQuY2hhcmFjdGVyID09IFNXVC5ERUwgJiYgZXZlbnQuc3RhdGVNYXNrID09IDApIHsNCi0JCQkJCQlkZWxldGVLZXlQcmVzc2VkKGV2ZW50LndpZGdldCk7DQotCQkJCQl9DQotCQkJCX0NCi0JCQl9Ow0KLQkJfQ0KLQkJY29udHJvbC5hZGRLZXlMaXN0ZW5lcihkZWxldGVMaXN0ZW5lcik7DQotCX0NCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoKSB7DQotCQliYWNrZ3JvdW5kQ29sb3IgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9MSVNUX0JBQ0tHUk9VTkQpOw0KLQkJcmVnaXN0ZXJDb2xvcihDT0xPUl9CT1JERVIsIDE5NSwgMTkxLCAxNzkpOw0KLQkJcmVnaXN0ZXJDb2xvcihDT0xPUl9DT01QT1NJVEVfU0VQQVJBVE9SLCAxNTIsIDE3MCwgMjAzKTsNCi0JCXJlZ2lzdGVyQ29sb3IoREVGQVVMVF9IRUFERVJfQ09MT1IsIDB4NDgsIDB4NzAsIDB4OTgpOw0KLQkJaWYgKGlzV2hpdGVCYWNrZ3JvdW5kKCkpDQotCQkJYm9yZGVyQ29sb3IgPSBnZXRDb2xvcihDT0xPUl9CT1JERVIpOw0KLQkJZWxzZQ0KLQkJCWJvcmRlckNvbG9yID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfV0lER0VUX0JBQ0tHUk9VTkQpOw0KLQkJZm9yZWdyb3VuZENvbG9yID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTElTVF9GT1JFR1JPVU5EKTsNCi0JCWh5cGVybGlua0hhbmRsZXIgPSBuZXcgSHlwZXJsaW5rSGFuZGxlcigpOw0KLQkJaHlwZXJsaW5rSGFuZGxlci5zZXRCYWNrZ3JvdW5kKGJhY2tncm91bmRDb2xvcik7DQotCQl1cGRhdGVIeXBlcmxpbmtDb2xvcnMoKTsNCi0JCXZpc2liaWxpdHlIYW5kbGVyID0gbmV3IFZpc2liaWxpdHlIYW5kbGVyKCk7DQotCQlrZXlib2FyZEhhbmRsZXIgPSBuZXcgS2V5Ym9hcmRIYW5kbGVyKCk7DQotCX0NCi0JDQotCXB1YmxpYyBib29sZWFuIGlzV2hpdGVCYWNrZ3JvdW5kKCkgew0KLQkJcmV0dXJuIGJhY2tncm91bmRDb2xvci5nZXRSZWQoKT09MjU1ICYmIGJhY2tncm91bmRDb2xvci5nZXRHcmVlbigpPT0yNTUgJiYNCi0JCQliYWNrZ3JvdW5kQ29sb3IuZ2V0Qmx1ZSgpPT0yNTU7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdXBkYXRlSHlwZXJsaW5rQ29sb3JzKCkgew0KLQkJQ29sb3IgaHlwZXJsaW5rQ29sb3IgPSBKRmFjZUNvbG9ycy5nZXRIeXBlcmxpbmtUZXh0KGRpc3BsYXkpOw0KLQkJQ29sb3IgYWN0aXZlSHlwZXJsaW5rQ29sb3IgPSBKRmFjZUNvbG9ycy5nZXRBY3RpdmVIeXBlcmxpbmtUZXh0KGRpc3BsYXkpOw0KLQkJaHlwZXJsaW5rSGFuZGxlci5zZXRGb3JlZ3JvdW5kKGh5cGVybGlua0NvbG9yKTsNCi0JCWh5cGVybGlua0hhbmRsZXIuc2V0QWN0aXZlRm9yZWdyb3VuZChhY3RpdmVIeXBlcmxpbmtDb2xvcik7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgcGFpbnRCb3JkZXJzRm9yKENvbXBvc2l0ZSBwYXJlbnQpIHsNCi0JCWlmIChCT1JERVJfU1RZTEUgPT0gU1dULkJPUkRFUikNCi0JCQlyZXR1cm47DQotCQlpZiAoYm9yZGVyUGFpbnRlciA9PSBudWxsKQ0KLQkJCWJvcmRlclBhaW50ZXIgPSBuZXcgQm9yZGVyUGFpbnRlcigpOw0KLQkJcGFyZW50LmFkZFBhaW50TGlzdGVuZXIoYm9yZGVyUGFpbnRlcik7DQotCX0NCi0JcHVibGljIENvbG9yIHJlZ2lzdGVyQ29sb3IoU3RyaW5nIGtleSwgaW50IHIsIGludCBnLCBpbnQgYikgew0KLQkJQ29sb3IgYyA9IG5ldyBDb2xvcihkaXNwbGF5LCByLCBnLCBiKTsNCi0JCWNvbG9yUmVnaXN0cnkucHV0KGtleSwgYyk7DQotCQlyZXR1cm4gYzsNCi0JfQ0KLQlwdWJsaWMgdm9pZCBzZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3IgY29sb3IpIHsNCi0JCWJhY2tncm91bmRDb2xvciA9IGNvbG9yOw0KLQl9DQotCXB1YmxpYyB2b2lkIHNldEh5cGVybGlua0NvbG9yKENvbG9yIGNvbG9yKSB7DQotCQloeXBlcmxpbmtIYW5kbGVyLnNldEZvcmVncm91bmQoY29sb3IpOw0KLQl9DQotCXB1YmxpYyB2b2lkIHNldEh5cGVybGlua0hvdmVyQ29sb3Iob3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yIGhvdmVyQ29sb3IpIHsNCi0JCWh5cGVybGlua0hhbmRsZXIuc2V0QWN0aXZlRm9yZWdyb3VuZChob3ZlckNvbG9yKTsNCi0JfQ0KLQlwdWJsaWMgdm9pZCBzZXRIeXBlcmxpbmtVbmRlcmxpbmVNb2RlKGludCBuZXdIeXBlcmxpbmtVbmRlcmxpbmVNb2RlKSB7DQotCQloeXBlcmxpbmtIYW5kbGVyLnNldEh5cGVybGlua1VuZGVybGluZU1vZGUobmV3SHlwZXJsaW5rVW5kZXJsaW5lTW9kZSk7DQotCX0NCi0JcHVibGljIHZvaWQgdHVybkludG9IeXBlcmxpbmsoQ29udHJvbCBjb250cm9sLCBJSHlwZXJsaW5rTGlzdGVuZXIgbGlzdGVuZXIpIHsNCi0JCWh5cGVybGlua0hhbmRsZXIucmVnaXN0ZXJIeXBlcmxpbmsoY29udHJvbCwgbGlzdGVuZXIpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9Gb3Jtc1BsdWdpbi5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL0Zvcm1zUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0NDgwOTMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL0Zvcm1zUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgRm9ybXNQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQlwcml2YXRlIHN0YXRpYyBGb3Jtc1BsdWdpbiBpbnN0YW5jZTsKLQlwcml2YXRlIFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEZvcm1zUGx1Z2luLgotCSAqIEBwYXJhbSBkZXNjcmlwdG9yCi0JICovCi0JcHVibGljIEZvcm1zUGx1Z2luKElQbHVnaW5EZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLQkJc3VwZXIoZGVzY3JpcHRvcik7Ci0JCWluc3RhbmNlID0gdGhpczsKLQkJdHJ5IHsKLQkJCXJlc291cmNlQnVuZGxlID0KLQkJCQlSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoCi0JCQkJCSJvcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMuaW50ZXJuYWwuRm9ybXNQbHVnaW5SZXNvdXJjZXMiKTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHgpIHsKLQkJCXJlc291cmNlQnVuZGxlID0gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0cmluZyBmcm9tIHRoZSBwbHVnaW4ncyByZXNvdXJjZSBidW5kbGUsCi0JICogb3IgJ2tleScgaWYgbm90IGZvdW5kLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJRm9ybXNQbHVnaW4gaW5zdCA9IEZvcm1zUGx1Z2luLmdldERlZmF1bHQoKTsKLQkJaWYgKGluc3Q9PW51bGwpIHJldHVybiBrZXk7Ci0JCVJlc291cmNlQnVuZGxlIGJ1bmRsZSA9IEZvcm1zUGx1Z2luLmdldERlZmF1bHQoKS5nZXRSZXNvdXJjZUJ1bmRsZSgpOwotCQl0cnkgewotCQkJcmV0dXJuIGJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBrZXk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGb3JtYXR0ZWRNZXNzYWdlKFN0cmluZyBrZXksIFN0cmluZ1tdIGFyZ3MpIHsKLQkJU3RyaW5nIHRleHQgPSBnZXRSZXNvdXJjZVN0cmluZyhrZXkpOwotCQlyZXR1cm4gamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQuZm9ybWF0KHRleHQsIGFyZ3MpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEZvcm1hdHRlZE1lc3NhZ2UoU3RyaW5nIGtleSwgU3RyaW5nIGFyZykgewotCQlTdHJpbmcgdGV4dCA9IGdldFJlc291cmNlU3RyaW5nKGtleSk7Ci0JCXJldHVybiBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdC5mb3JtYXQodGV4dCwgbmV3IE9iamVjdFtdIHsgYXJnIH0pOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBsdWdpbidzIHJlc291cmNlIGJ1bmRsZSwKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoKSB7Ci0JCXJldHVybiByZXNvdXJjZUJ1bmRsZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEZvcm1zUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElXb3JrYmVuY2hQYWdlIGdldEFjdGl2ZVBhZ2UoKSB7Ci0JCXJldHVybiBnZXREZWZhdWx0KCkuaW50ZXJuYWxHZXRBY3RpdmVQYWdlKCk7Ci0JfQotCi0JcHJpdmF0ZSBJV29ya2JlbmNoUGFnZSBpbnRlcm5hbEdldEFjdGl2ZVBhZ2UoKSB7Ci0JCXJldHVybiBnZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTaGVsbCBnZXRBY3RpdmVXb3JrYmVuY2hTaGVsbCgpIHsKLQkJcmV0dXJuIGdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJV29ya2JlbmNoV2luZG93IGdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpIHsKLQkJcmV0dXJuIGdldERlZmF1bHQoKS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQbHVnaW5JZCgpIHsKLQkJcmV0dXJuIGdldERlZmF1bHQoKS5nZXREZXNjcmlwdG9yKCkuZ2V0VW5pcXVlSWRlbnRpZmllcigpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFeGNlcHRpb24oVGhyb3dhYmxlIGUpIHsKLQkJbG9nRXhjZXB0aW9uKGUsIHRydWUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFeGNlcHRpb24oVGhyb3dhYmxlIGUsIGJvb2xlYW4gc2hvd0Vycm9yRGlhbG9nKSB7Ci0JCWlmIChlIGluc3RhbmNlb2YgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbikgewotCQkJZSA9ICgoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbikgZSkuZ2V0VGFyZ2V0RXhjZXB0aW9uKCk7Ci0JCX0KLQotCQlJU3RhdHVzIHN0YXR1cyA9IG51bGw7Ci0JCWlmIChlIGluc3RhbmNlb2YgQ29yZUV4Y2VwdGlvbikgewotCQkJc3RhdHVzID0gKChDb3JlRXhjZXB0aW9uKSBlKS5nZXRTdGF0dXMoKTsKLQkJfSBlbHNlIHsKLQkJCVN0cmluZyBtZXNzYWdlID0gZS5nZXRNZXNzYWdlKCk7Ci0JCQlpZiAobWVzc2FnZSA9PSBudWxsKQotCQkJCW1lc3NhZ2UgPSBlLnRvU3RyaW5nKCk7Ci0JCQlzdGF0dXMgPQotCQkJCW5ldyBTdGF0dXMoCi0JCQkJCUlTdGF0dXMuRVJST1IsCi0JCQkJCWdldFBsdWdpbklkKCksCi0JCQkJCUlTdGF0dXMuT0ssCi0JCQkJCW1lc3NhZ2UsCi0JCQkJCWUpOwotCQl9Ci0JCWxvZyhzdGF0dXMsIHNob3dFcnJvckRpYWxvZyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhJU3RhdHVzIHN0YXR1cywgYm9vbGVhbiBzaG93RXJyb3JEaWFsb2cpIHsKLQkJaWYgKHNob3dFcnJvckRpYWxvZykKLQkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcigKLQkJCQlnZXRBY3RpdmVXb3JrYmVuY2hTaGVsbCgpLAotCQkJCW51bGwsCi0JCQkJbnVsbCwKLQkJCQlzdGF0dXMpOwotCQlQbGF0Zm9ybS5nZXRQbHVnaW4oIm9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIpLmdldExvZygpLmxvZyhzdGF0dXMpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvRm9ybXNQbHVnaW5SZXNvdXJjZXMucHJvcGVydGllcyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9Gb3Jtc1BsdWdpblJlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDQ1ZTA2Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9Gb3Jtc1BsdWdpblJlc291cmNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotRm9ybUVnaW5lLmxpbmtQb3B1cC5vcGVuID0gJk9wZW4KLUZvcm1FZ2luZS5saW5rUG9wdXAuY29weVNob3J0Y3V0ID0gJkNvcHkgYXMgU2hvcnRjdXQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvSFRNTFRhYmxlTGF5b3V0LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvSFRNTFRhYmxlTGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkZDIxMjYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL0hUTUxUYWJsZUxheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbDsNCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7DQotDQotLyoqDQotICogVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbGF5b3V0IGFsZ29yaXRobSBhdHRlbXB0cyB0byBwb3NpdGlvbiBjb250cm9scyBpbg0KLSAqIHRoZSBjb21wb3NpdGUgdXNpbmcgYSB0d28tcGFzcyBhdXRvbGF5b3V0IEhUTUwgdGFibGUgYWx0b3JpdGhtIHJlY29tbWVkZWQgYnkNCi0gKiBIVE1MIDQuMDEgVzNDIHNwZWNpZmljYXRpb24uIFRoZSBtYWluIGRpZmZlcmVuY2VzIHdpdGggR3JpZExheW91dCBpcyB0aGF0IGl0DQotICogaGFzIHR3byBwYXNzZXMgYW5kIHRoYXQgd2lkdGggYW5kIGhlaWdodCBhcmUgbm90IGNhbGN1bGF0ZWQgaW4gdGhlIHNhbWUNCi0gKiBwYXNzLg0KLSAqIDxwPg0KLSAqIFRoZSBhZHZhbnRhZ2Ugb2YgdGhlIGFsZ29yaXRobSBvdmVyIEdyaWRMYXlvdXQgaXMgdGhhdCBpdCBpcyBjYXBhYmxlIG9mDQotICogZmxvd2luZyB0ZXh0IGNvbnRyb2xzIGNhcGFibGUgb2YgbGluZSB3cmFwLiBUaGVzZSBjb250cm9scyBkbyBub3QgaGF2ZQ0KLSAqIG5hdHVyYWwgJ3ByZWZlcnJlZCBzaXplJy4gSW5zdGVhZCwgdGhleSBhcmUgY2FwYWJsZSBvZiBwcm92aWRpbmcgdGhlDQotICogcmVxdWlyZWQgaGVpZ2h0IGlmIHRoZSB3aWR0aCBpcyBzZXQuIENvbnNlcXVlbnRseSwgdGhpcyBhbGdvcml0aG0gZmlyc3QNCi0gKiBjYWxjdWxhdGVzIHRoZSB3aWR0aHMgdGhhdCB3aWxsIGJlIGFzc2lnbmVkIHRvIGNvbHVtbnMsIGFuZCB0aGVuIHBhc3Nlcw0KLSAqIHRob3NlIHdpZHRocyB0byB0aGUgY29udHJvbHMgdG8gY2FsY3VsYXRlIHRoZSBoZWlnaHQuIFdoZW4gYSBjb21wb3NpdGUgd2l0aA0KLSAqIHRoaXMgbGF5b3V0IGlzIGEgY2hpbGQgb2YgdGhlIHNjcm9sbGluZyBjb21wb3NpdGUsIHRoZXkgc2hvdWxkIGludGVyYWN0IGluDQotICogc3VjaCBhIHdheSB0aGF0IHJlZHVjdGlvbiBpbiB0aGUgc2Nyb2xsaW5nIGNvbXBvc2l0ZSB3aWR0aCByZXN1bHRzIGluIHRoZQ0KLSAqIHJlZmxvdyBhbmQgaW5jcmVhc2Ugb2YgdGhlIG92ZXJhbGwgaGVpZ2h0Lg0KLSAqIDxwPg0KLSAqIElmIG5vbmUgb2YgdGhlIGNvbHVtbnMgY29udGFpbiBleHBhbmRhYmxlIGFuZCB3cmFwcGFibGUgY29udHJvbHMsIHRoZQ0KLSAqIGVuZC1yZXN1bHQgd2lsbCBiZSBzaW1pbGFyIHRvIHRoZSBvbmUgcHJvdmlkZWQgYnkgR3JpZExheW91dC4gVGhlIGRpZmZlcmVuY2UNCi0gKiB3aWxsIHNob3cgdXAgZm9yIGxheW91dHMgdGhhdCBjb250YWluIGNvbnRyb2xzIHdob3NlIG1pbmltdW0gYW5kIG1heGltdW0NCi0gKiB3aWR0aHMgYXJlIG5vdCB0aGUgc2FtZS4NCi0gKi8NCi0NCi1wdWJsaWMgY2xhc3MgSFRNTFRhYmxlTGF5b3V0IGV4dGVuZHMgTGF5b3V0IGltcGxlbWVudHMgSUxheW91dEV4dGVuc2lvbiB7DQotCXB1YmxpYyBpbnQgbnVtQ29sdW1ucyA9IDE7DQotCXB1YmxpYyBpbnQgbGVmdE1hcmdpbiA9IDU7DQotCXB1YmxpYyBpbnQgcmlnaHRNYXJnaW4gPSA1Ow0KLQlwdWJsaWMgaW50IHRvcE1hcmdpbiA9IDU7DQotCXB1YmxpYyBpbnQgYm90dG9tTWFyZ2luID0gNTsNCi0JcHVibGljIGludCBob3Jpem9udGFsU3BhY2luZyA9IDU7DQotCXB1YmxpYyBpbnQgdmVydGljYWxTcGFjaW5nID0gNTsNCi0JcHVibGljIGJvb2xlYW4gbWFrZUNvbHVtbnNFcXVhbFdpZHRoID0gZmFsc2U7DQotDQotCXByaXZhdGUgYm9vbGVhbiBpbml0aWFsTGF5b3V0ID0gdHJ1ZTsNCi0JcHJpdmF0ZSBWZWN0b3IgZ3JpZCA9IG51bGw7DQotCXByaXZhdGUgaW50W10gbWluQ29sdW1uV2lkdGhzLCBtYXhDb2x1bW5XaWR0aHM7DQotCXByaXZhdGUgaW50IHdpZGVzdENvbHVtbldpZHRoOw0KLQlwcml2YXRlIGludFtdIGdyb3dpbmdDb2x1bW5zOw0KLQ0KLQlwdWJsaWMgaW50IGdldE1pbmltdW1XaWR0aChDb21wb3NpdGUgcGFyZW50LCBib29sZWFuIGNoYW5nZWQpIHsNCi0JCWNoYW5nZWQgPSB0cnVlOw0KLQkJaW5pdGlhbGl6ZUlmTmVlZGVkKHBhcmVudCwgY2hhbmdlZCk7DQotCQlpZiAoaW5pdGlhbExheW91dCkgew0KLQkJCWNoYW5nZWQgPSB0cnVlOw0KLQkJCWluaXRpYWxMYXlvdXQgPSBmYWxzZTsNCi0JCX0NCi0JCWlmIChncmlkID09IG51bGwgfHwgY2hhbmdlZCkgew0KLQkJCWNoYW5nZWQgPSB0cnVlOw0KLQkJCWdyaWQgPSBuZXcgVmVjdG9yKCk7DQotCQkJY3JlYXRlR3JpZChwYXJlbnQpOw0KLQkJfQ0KLQkJaWYgKG1pbkNvbHVtbldpZHRocyA9PSBudWxsKQ0KLQkJCW1pbkNvbHVtbldpZHRocyA9IG5ldyBpbnRbbnVtQ29sdW1uc107DQotCQlmb3IgKGludCBpID0gMDsgaSA8IG51bUNvbHVtbnM7IGkrKykgew0KLQkJCW1pbkNvbHVtbldpZHRoc1tpXSA9IDA7DQotCQl9DQotCQlyZXR1cm4gaW50ZXJuYWxHZXRNaW5pbXVtV2lkdGgocGFyZW50LCBjaGFuZ2VkKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgaW50IGdldE1heGltdW1XaWR0aChDb21wb3NpdGUgcGFyZW50LCBib29sZWFuIGNoYW5nZWQpIHsNCi0JCWNoYW5nZWQgPSB0cnVlOw0KLQkJaW5pdGlhbGl6ZUlmTmVlZGVkKHBhcmVudCwgY2hhbmdlZCk7DQotCQlpZiAoaW5pdGlhbExheW91dCkgew0KLQkJCWNoYW5nZWQgPSB0cnVlOw0KLQkJCWluaXRpYWxMYXlvdXQgPSBmYWxzZTsNCi0JCX0NCi0JCWlmIChncmlkID09IG51bGwgfHwgY2hhbmdlZCkgew0KLQkJCWNoYW5nZWQgPSB0cnVlOw0KLQkJCWdyaWQgPSBuZXcgVmVjdG9yKCk7DQotCQkJY3JlYXRlR3JpZChwYXJlbnQpOw0KLQkJfQ0KLQkJaWYgKG1heENvbHVtbldpZHRocyA9PSBudWxsKQ0KLQkJCW1heENvbHVtbldpZHRocyA9IG5ldyBpbnRbbnVtQ29sdW1uc107DQotCQlmb3IgKGludCBpID0gMDsgaSA8IG51bUNvbHVtbnM7IGkrKykgew0KLQkJCW1heENvbHVtbldpZHRoc1tpXSA9IDA7DQotCQl9DQotCQlyZXR1cm4gaW50ZXJuYWxHZXRNYXhpbXVtV2lkdGgocGFyZW50LCBjaGFuZ2VkKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQHNlZSBMYXlvdXQjbGF5b3V0KENvbXBvc2l0ZSwgYm9vbGVhbikNCi0JICovDQotCXByb3RlY3RlZCB2b2lkIGxheW91dChDb21wb3NpdGUgcGFyZW50LCBib29sZWFuIGNoYW5nZWQpIHsNCi0JCVJlY3RhbmdsZSBjbGllbnRBcmVhID0gcGFyZW50LmdldENsaWVudEFyZWEoKTsNCi0JCUNvbnRyb2xbXSBjaGlsZHJlbiA9IHBhcmVudC5nZXRDaGlsZHJlbigpOw0KLQkJaWYgKGNoaWxkcmVuLmxlbmd0aCA9PSAwKQ0KLQkJCXJldHVybjsNCi0JCWludCBwYXJlbnRXaWR0aCA9IGNsaWVudEFyZWEud2lkdGg7DQotCQljaGFuZ2VkID0gdHJ1ZTsNCi0JCWluaXRpYWxpemVJZk5lZWRlZChwYXJlbnQsIGNoYW5nZWQpOw0KLQkJaWYgKGluaXRpYWxMYXlvdXQpIHsNCi0JCQljaGFuZ2VkID0gdHJ1ZTsNCi0JCQlpbml0aWFsTGF5b3V0ID0gZmFsc2U7DQotCQl9DQotCQlpZiAoZ3JpZCA9PSBudWxsIHx8IGNoYW5nZWQpIHsNCi0JCQljaGFuZ2VkID0gdHJ1ZTsNCi0JCQlncmlkID0gbmV3IFZlY3RvcigpOw0KLQkJCWNyZWF0ZUdyaWQocGFyZW50KTsNCi0JCX0NCi0JCXJlc2V0Q29sdW1uV2lkdGhzKCk7DQotCQlpbnQgbWluV2lkdGggPSBpbnRlcm5hbEdldE1pbmltdW1XaWR0aChwYXJlbnQsIGNoYW5nZWQpOw0KLQkJaW50IG1heFdpZHRoID0gaW50ZXJuYWxHZXRNYXhpbXVtV2lkdGgocGFyZW50LCBjaGFuZ2VkKTsNCi0NCi0JCWludCB0YWJsZVdpZHRoID0gcGFyZW50V2lkdGg7DQotDQotCQlpbnRbXSBjb2x1bW5XaWR0aHM7DQotDQotCQlpZiAocGFyZW50V2lkdGggPCBtaW5XaWR0aCkgew0KLQkJCXRhYmxlV2lkdGggPSBtaW5XaWR0aDsNCi0JCQlpZiAobWFrZUNvbHVtbnNFcXVhbFdpZHRoKSB7DQotCQkJCWNvbHVtbldpZHRocyA9IG5ldyBpbnRbbnVtQ29sdW1uc107DQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtQ29sdW1uczsgaSsrKSB7DQotCQkJCQljb2x1bW5XaWR0aHNbaV0gPSB3aWRlc3RDb2x1bW5XaWR0aDsNCi0JCQkJfQ0KLQkJCX0gZWxzZQ0KLQkJCQljb2x1bW5XaWR0aHMgPSBtaW5Db2x1bW5XaWR0aHM7DQotCQl9IGVsc2UgaWYgKHBhcmVudFdpZHRoID4gbWF4V2lkdGgpIHsNCi0JCQlpZiAoZ3Jvd2luZ0NvbHVtbnMubGVuZ3RoID09IDApIHsNCi0JCQkJdGFibGVXaWR0aCA9IG1heFdpZHRoOw0KLQkJCQljb2x1bW5XaWR0aHMgPSBtYXhDb2x1bW5XaWR0aHM7DQotCQkJfSBlbHNlIHsNCi0JCQkJY29sdW1uV2lkdGhzID0gbmV3IGludFtudW1Db2x1bW5zXTsNCi0JCQkJaW50IGNvbFNwYWNlID0gdGFibGVXaWR0aCAtIGxlZnRNYXJnaW4gLSByaWdodE1hcmdpbjsNCi0JCQkJY29sU3BhY2UgLT0gKG51bUNvbHVtbnMgLSAxKSAqIGhvcml6b250YWxTcGFjaW5nOw0KLQkJCQlpbnQgZXh0cmEgPSBwYXJlbnRXaWR0aCAtIG1heFdpZHRoOw0KLQkJCQlpbnQgY29sRXh0cmEgPSBleHRyYSAvIGdyb3dpbmdDb2x1bW5zLmxlbmd0aDsNCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW1Db2x1bW5zOyBpKyspIHsNCi0JCQkJCWNvbHVtbldpZHRoc1tpXSA9IG1heENvbHVtbldpZHRoc1tpXTsNCi0NCi0JCQkJCWlmIChpc0dyb3dpbmdDb2x1bW4oaSkpIHsNCi0JCQkJCQljb2x1bW5XaWR0aHNbaV0gKz0gY29sRXh0cmE7DQotCQkJCQl9DQotCQkJCX0NCi0JCQl9DQotCQl9IGVsc2Ugew0KLQkJCWNvbHVtbldpZHRocyA9IG5ldyBpbnRbbnVtQ29sdW1uc107DQotCQkJaWYgKG1ha2VDb2x1bW5zRXF1YWxXaWR0aCkgew0KLQkJCQlpbnQgY29sU3BhY2UgPSB0YWJsZVdpZHRoIC0gbGVmdE1hcmdpbiAtIHJpZ2h0TWFyZ2luOw0KLQkJCQljb2xTcGFjZSAtPSAobnVtQ29sdW1ucyAtIDEpICogaG9yaXpvbnRhbFNwYWNpbmc7DQotCQkJCWludCBjb2wgPSBjb2xTcGFjZSAvIG51bUNvbHVtbnM7DQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtQ29sdW1uczsgaSsrKSB7DQotCQkJCQljb2x1bW5XaWR0aHNbaV0gPSBjb2w7DQotCQkJCX0NCi0JCQl9IGVsc2Ugew0KLQkJCQlpbnRbXSBleHRyYVNwYWNlID0NCi0JCQkJCWNhbGN1bGF0ZUV4dHJhU3BhY2UodGFibGVXaWR0aCwgbWF4V2lkdGgsIG1pbldpZHRoKTsNCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW1Db2x1bW5zOyBpKyspIHsNCi0JCQkJCWludCBtaW5DV2lkdGggPSBtaW5Db2x1bW5XaWR0aHNbaV07DQotCQkJCQljb2x1bW5XaWR0aHNbaV0gPSBtaW5DV2lkdGggKyBleHRyYVNwYWNlW2ldOw0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQkJaW50IHggPSAwOw0KLQkJaW50IHkgPSB0b3BNYXJnaW47DQotCQkvLyBhc3NpZ24gd2lkdGhzDQotCQlmb3IgKGludCBpID0gMDsgaSA8IGdyaWQuc2l6ZSgpOyBpKyspIHsNCi0JCQlUYWJsZURhdGFbXSByb3cgPSAoVGFibGVEYXRhW10pIGdyaWQuZWxlbWVudEF0KGkpOw0KLQkJCS8vIGFzc2lnbiB3aWR0aHMsIGNhbGN1bGF0ZSBoZWlnaHRzDQotCQkJaW50IHJvd0hlaWdodCA9IDA7DQotCQkJeCA9IGxlZnRNYXJnaW47DQotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBudW1Db2x1bW5zOyBqKyspIHsNCi0JCQkJVGFibGVEYXRhIHRkID0gcm93W2pdOw0KLQkJCQlpZiAodGQuaXNJdGVtRGF0YSA9PSBmYWxzZSkgew0KLQkJCQkJY29udGludWU7DQotCQkJCX0NCi0JCQkJQ29udHJvbCBjaGlsZCA9IGNoaWxkcmVuW3RkLmNoaWxkSW5kZXhdOw0KLQkJCQlpbnQgc3BhbiA9IHRkLmNvbHNwYW47DQotCQkJCWludCBjd2lkdGggPSAwOw0KLQkJCQlmb3IgKGludCBrID0gajsgayA8IGogKyBzcGFuOyBrKyspIHsNCi0JCQkJCWN3aWR0aCArPSBjb2x1bW5XaWR0aHNba107DQotCQkJCQlpZiAoayA8IGogKyBzcGFuIC0gMSkNCi0JCQkJCQljd2lkdGggKz0gaG9yaXpvbnRhbFNwYWNpbmc7DQotCQkJCX0NCi0JCQkJUG9pbnQgc2l6ZSA9IGNvbXB1dGVTaXplKGNoaWxkLCBjd2lkdGgsIGNoYW5nZWQpOw0KLQkJCQl0ZC5jb21wV2lkdGggPSBjd2lkdGg7DQotCQkJCWlmICh0ZC5oZWlnaHRIaW50ICE9IFNXVC5ERUZBVUxUKSB7DQotCQkJCQlzaXplID0gbmV3IFBvaW50KHNpemUueCwgdGQuaGVpZ2h0SGludCk7DQotCQkJCX0NCi0JCQkJdGQuY29tcFNpemUgPSBzaXplOw0KLQkJCQlyb3dIZWlnaHQgPSBNYXRoLm1heChyb3dIZWlnaHQsIHNpemUueSk7DQotCQkJfQ0KLQkJCWZvciAoaW50IGogPSAwOyBqIDwgbnVtQ29sdW1uczsgaisrKSB7DQotCQkJCVRhYmxlRGF0YSB0ZCA9IHJvd1tqXTsNCi0JCQkJaWYgKHRkLmlzSXRlbURhdGEgPT0gZmFsc2UpIHsNCi0JCQkJCWNvbnRpbnVlOw0KLQkJCQl9DQotCQkJCUNvbnRyb2wgY2hpbGQgPSBjaGlsZHJlblt0ZC5jaGlsZEluZGV4XTsNCi0JCQkJcGxhY2VDb250cm9sKGNoaWxkLCB0ZCwgeCwgeSwgcm93SGVpZ2h0KTsNCi0JCQkJeCArPSB0ZC5jb21wV2lkdGg7DQotCQkJCWlmIChqIDwgbnVtQ29sdW1ucyAtIDEpDQotCQkJCQl4ICs9IGhvcml6b250YWxTcGFjaW5nOw0KLQkJCX0NCi0JCQl5ICs9IHJvd0hlaWdodCArIHZlcnRpY2FsU3BhY2luZzsNCi0JCX0NCi0JfQ0KLQ0KLQlib29sZWFuIGlzR3Jvd2luZ0NvbHVtbihpbnQgY29sKSB7DQotCQlpZiAoZ3Jvd2luZ0NvbHVtbnMgPT0gbnVsbCkNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQlmb3IgKGludCBpID0gMDsgaSA8IGdyb3dpbmdDb2x1bW5zLmxlbmd0aDsgaSsrKSB7DQotCQkJaWYgKGNvbCA9PSBncm93aW5nQ29sdW1uc1tpXSkNCi0JCQkJcmV0dXJuIHRydWU7DQotCQl9DQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi0NCi0JaW50W10gY2FsY3VsYXRlRXh0cmFTcGFjZShpbnQgdGFibGVXaWR0aCwgaW50IG1heFdpZHRoLCBpbnQgbWluV2lkdGgpIHsNCi0JCWludCBmaXhlZFBhcnQgPQ0KLQkJCWxlZnRNYXJnaW4gKyByaWdodE1hcmdpbiArIChudW1Db2x1bW5zIC0gMSkgKiBob3Jpem9udGFsU3BhY2luZzsNCi0JCWludCBEID0gbWF4V2lkdGggLSBtaW5XaWR0aDsNCi0NCi0JCWludCBXID0gdGFibGVXaWR0aCAtIGZpeGVkUGFydCAtIG1pbldpZHRoOw0KLQ0KLQkJaW50IGV4dHJhU3BhY2VbXSA9IG5ldyBpbnRbbnVtQ29sdW1uc107DQotDQotCQlpbnQgcmVtID0gMDsNCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtQ29sdW1uczsgaSsrKSB7DQotCQkJaW50IGNtaW4gPSBtaW5Db2x1bW5XaWR0aHNbaV07DQotCQkJaW50IGNtYXggPSBtYXhDb2x1bW5XaWR0aHNbaV07DQotCQkJaW50IGQgPSBjbWF4IC0gY21pbjsNCi0JCQlpbnQgZXh0cmEgPSBEICE9IDAgPyAoZCAqIFcpIC8gRCA6IDA7DQotCQkJaWYgKGkgPCBudW1Db2x1bW5zIC0gMSkgew0KLQkJCQlleHRyYVNwYWNlW2ldID0gZXh0cmE7DQotCQkJCXJlbSArPSBleHRyYTsNCi0JCQl9IGVsc2Ugew0KLQkJCQlleHRyYVNwYWNlW2ldID0gVyAtIHJlbTsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm4gZXh0cmFTcGFjZTsNCi0JfQ0KLQ0KLQlQb2ludCBjb21wdXRlU2l6ZShDb250cm9sIGNoaWxkLCBpbnQgd2lkdGgsIGJvb2xlYW4gY2hhbmdlZCkgew0KLQkJaW50IHdpZHRoQXJnID0gd2lkdGg7DQotCQlpZiAoIWlzV3JhcChjaGlsZCkpDQotCQkJd2lkdGhBcmcgPSBTV1QuREVGQVVMVDsNCi0JCVBvaW50IHNpemUgPSBjaGlsZC5jb21wdXRlU2l6ZSh3aWR0aEFyZywgU1dULkRFRkFVTFQsIGNoYW5nZWQpOw0KLQkJcmV0dXJuIHNpemU7DQotCX0NCi0NCi0Jdm9pZCBwbGFjZUNvbnRyb2woDQotCQlDb250cm9sIGNvbnRyb2wsDQotCQlUYWJsZURhdGEgdGQsDQotCQlpbnQgeCwNCi0JCWludCB5LA0KLQkJaW50IHJvd0hlaWdodCkgew0KLQkJaW50IHhsb2MgPSB4ICsgdGQuaW5kZW50Ow0KLQkJaW50IHlsb2MgPSB5Ow0KLQkJaW50IHdpZHRoID0gdGQuY29tcFNpemUueDsNCi0JCWludCBoZWlnaHQgPSB0ZC5jb21wU2l6ZS55Ow0KLQkJaW50IGNvbFdpZHRoID0gdGQuY29tcFdpZHRoOw0KLQ0KLQkJLy8gYWxpZ24gaG9yaXpvbnRhbGx5DQotCQlpZiAodGQuYWxpZ24gPT0gVGFibGVEYXRhLkNFTlRFUikgew0KLQkJCXhsb2MgPSB4ICsgY29sV2lkdGggLyAyIC0gd2lkdGggLyAyOw0KLQkJfSBlbHNlIGlmICh0ZC5hbGlnbiA9PSBUYWJsZURhdGEuUklHSFQpIHsNCi0JCQl4bG9jID0geCArIGNvbFdpZHRoIC0gd2lkdGg7DQotCQl9IGVsc2UgaWYgKHRkLmFsaWduID09IFRhYmxlRGF0YS5GSUxMKSB7DQotCQkJd2lkdGggPSBjb2xXaWR0aDsNCi0JCX0NCi0JCS8vIGFsaWduIHZlcnRpY2FsbHkNCi0JCWlmICh0ZC52YWxpZ24gPT0gVGFibGVEYXRhLk1JRERMRSkgew0KLQkJCXlsb2MgPSB5ICsgcm93SGVpZ2h0IC8gMiAtIGhlaWdodCAvIDI7DQotCQl9IGVsc2UgaWYgKHRkLnZhbGlnbiA9PSBUYWJsZURhdGEuQk9UVE9NKSB7DQotCQkJeWxvYyA9IHkgKyByb3dIZWlnaHQgLSBoZWlnaHQ7DQotCQl9IGVsc2UgaWYgKHRkLnZhbGlnbiA9PSBUYWJsZURhdGEuRklMTCkgew0KLQkJCWhlaWdodCA9IHJvd0hlaWdodDsNCi0JCX0NCi0JCWNvbnRyb2wuc2V0Qm91bmRzKHhsb2MsIHlsb2MsIHdpZHRoLCBoZWlnaHQpOw0KLQl9DQotDQotCXZvaWQgY3JlYXRlR3JpZChDb21wb3NpdGUgY29tcG9zaXRlKSB7DQotCQlpbnQgcm93LCBjb2x1bW4sIHJvd0ZpbGwsIGNvbHVtbkZpbGw7DQotCQlDb250cm9sW10gY2hpbGRyZW47DQotCQlUYWJsZURhdGEgc3BhY2VyU3BlYzsNCi0JCVZlY3RvciBncm93aW5nQ29scyA9IG5ldyBWZWN0b3IoKTsNCi0NCi0JCS8vIA0KLQkJY2hpbGRyZW4gPSBjb21wb3NpdGUuZ2V0Q2hpbGRyZW4oKTsNCi0JCWlmIChjaGlsZHJlbi5sZW5ndGggPT0gMCkNCi0JCQlyZXR1cm47DQotDQotCQkvLyANCi0JCWdyaWQuYWRkRWxlbWVudChjcmVhdGVFbXB0eVJvdygpKTsNCi0JCXJvdyA9IDA7DQotCQljb2x1bW4gPSAwOw0KLQ0KLQkJLy8gTG9vcCB0aHJvdWdoIHRoZSBjaGlsZHJlbiBhbmQgcGxhY2UgdGhlaXIgYXNzb2NpYXRlZCBsYXlvdXQgc3BlY3MgaW4NCi0JCS8vIHRoZQ0KLQkJLy8gZ3JpZC4gUGxhY2VtZW50IG9jY3VycyBsZWZ0IHRvIHJpZ2h0LCB0b3AgdG8gYm90dG9tIChpLmUuLCBieSByb3cpLg0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgew0KLQkJCS8vIEZpbmQgdGhlIGZpcnN0IGF2YWlsYWJsZSBzcG90IGluIHRoZSBncmlkLg0KLQkJCUNvbnRyb2wgY2hpbGQgPSBjaGlsZHJlbltpXTsNCi0JCQlUYWJsZURhdGEgc3BlYyA9IChUYWJsZURhdGEpIGNoaWxkLmdldExheW91dERhdGEoKTsNCi0JCQl3aGlsZSAoKChUYWJsZURhdGFbXSkgZ3JpZC5lbGVtZW50QXQocm93KSlbY29sdW1uXSAhPSBudWxsKSB7DQotCQkJCWNvbHVtbiA9IGNvbHVtbiArIDE7DQotCQkJCWlmIChjb2x1bW4gPj0gbnVtQ29sdW1ucykgew0KLQkJCQkJcm93ID0gcm93ICsgMTsNCi0JCQkJCWNvbHVtbiA9IDA7DQotCQkJCQlpZiAocm93ID49IGdyaWQuc2l6ZSgpKSB7DQotCQkJCQkJZ3JpZC5hZGRFbGVtZW50KGNyZWF0ZUVtcHR5Um93KCkpOw0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJfQ0KLQkJCS8vIFNlZSBpZiB0aGUgcGxhY2Ugd2lsbCBzdXBwb3J0IHRoZSB3aWRnZXQncyBob3Jpem9udGFsIHNwYW4uIElmDQotCQkJLy8gbm90LCBnbyB0byB0aGUNCi0JCQkvLyBuZXh0IHJvdy4NCi0JCQlpZiAoY29sdW1uICsgc3BlYy5jb2xzcGFuIC0gMSA+PSBudW1Db2x1bW5zKSB7DQotCQkJCWdyaWQuYWRkRWxlbWVudChjcmVhdGVFbXB0eVJvdygpKTsNCi0JCQkJcm93ID0gcm93ICsgMTsNCi0JCQkJY29sdW1uID0gMDsNCi0JCQl9DQotDQotCQkJLy8gVGhlIHZlcnRpY2FsIHNwYW4gZm9yIHRoZSBpdGVtIHdpbGwgYmUgYXQgbGVhc3QgMS4gSWYgaXQgaXMgPiAxLA0KLQkJCS8vIGFkZCBvdGhlciByb3dzIHRvIHRoZSBncmlkLg0KLQkJCWZvciAoaW50IGogPSAyOyBqIDw9IHNwZWMucm93c3BhbjsgaisrKSB7DQotCQkJCWlmIChyb3cgKyBqID4gZ3JpZC5zaXplKCkpIHsNCi0JCQkJCWdyaWQuYWRkRWxlbWVudChjcmVhdGVFbXB0eVJvdygpKTsNCi0JCQkJfQ0KLQkJCX0NCi0NCi0JCQkvLyBTdG9yZSB0aGUgbGF5b3V0IHNwZWMuIEFsc28gY2FjaGUgdGhlIGNoaWxkSW5kZXguIE5PVEU6IFRoYXQgd2UNCi0JCQkvLyBhc3N1bWUgdGhlIGNoaWxkcmVuIG9mIGENCi0JCQkvLyBjb21wb3NpdGUgYXJlIG1haW50YWluZWQgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgYXJlIGNyZWF0ZWQNCi0JCQkvLyBhbmQgYWRkZWQgdG8gdGhlIGNvbXBvc2l0ZS4NCi0JCQkgKChUYWJsZURhdGFbXSkgZ3JpZC5lbGVtZW50QXQocm93KSlbY29sdW1uXSA9IHNwZWM7DQotCQkJc3BlYy5jaGlsZEluZGV4ID0gaTsNCi0NCi0JCQlpZiAoc3BlYy5ncmFiSG9yaXpvbnRhbCkgew0KLQkJCQl1cGRhdGVHcm93aW5nQ29sdW1ucyhncm93aW5nQ29scywgc3BlYywgY29sdW1uKTsNCi0JCQl9DQotDQotCQkJLy8gUHV0IHNwYWNlcnMgaW4gdGhlIGdyaWQgdG8gYWNjb3VudCBmb3IgdGhlIGl0ZW0ncyB2ZXJ0aWNhbCBhbmQNCi0JCQkvLyBob3Jpem9udGFsDQotCQkJLy8gc3Bhbi4NCi0JCQlyb3dGaWxsID0gc3BlYy5yb3dzcGFuIC0gMTsNCi0JCQljb2x1bW5GaWxsID0gc3BlYy5jb2xzcGFuIC0gMTsNCi0JCQlmb3IgKGludCByID0gMTsgciA8PSByb3dGaWxsOyByKyspIHsNCi0JCQkJZm9yIChpbnQgYyA9IDA7IGMgPCBzcGVjLmNvbHNwYW47IGMrKykgew0KLQkJCQkJc3BhY2VyU3BlYyA9IG5ldyBUYWJsZURhdGEoKTsNCi0JCQkJCXNwYWNlclNwZWMuaXNJdGVtRGF0YSA9IGZhbHNlOw0KLQkJCQkJKChUYWJsZURhdGFbXSkgZ3JpZC5lbGVtZW50QXQocm93ICsgcikpW2NvbHVtbiArIGNdID0NCi0JCQkJCQlzcGFjZXJTcGVjOw0KLQkJCQl9DQotCQkJfQ0KLQkJCWZvciAoaW50IGMgPSAxOyBjIDw9IGNvbHVtbkZpbGw7IGMrKykgew0KLQkJCQlmb3IgKGludCByID0gMDsgciA8IHNwZWMucm93c3BhbjsgcisrKSB7DQotCQkJCQlzcGFjZXJTcGVjID0gbmV3IFRhYmxlRGF0YSgpOw0KLQkJCQkJc3BhY2VyU3BlYy5pc0l0ZW1EYXRhID0gZmFsc2U7DQotCQkJCQkoKFRhYmxlRGF0YVtdKSBncmlkLmVsZW1lbnRBdChyb3cgKyByKSlbY29sdW1uICsgY10gPQ0KLQkJCQkJCXNwYWNlclNwZWM7DQotCQkJCX0NCi0JCQl9DQotCQkJY29sdW1uID0gY29sdW1uICsgc3BlYy5jb2xzcGFuIC0gMTsNCi0JCX0NCi0NCi0JCS8vIEZpbGwgb3V0IGVtcHR5IGdyaWQgY2VsbHMgd2l0aCBzcGFjZXJzLg0KLQkJZm9yIChpbnQgayA9IGNvbHVtbiArIDE7IGsgPCBudW1Db2x1bW5zOyBrKyspIHsNCi0JCQlzcGFjZXJTcGVjID0gbmV3IFRhYmxlRGF0YSgpOw0KLQkJCXNwYWNlclNwZWMuaXNJdGVtRGF0YSA9IGZhbHNlOw0KLQkJCSgoVGFibGVEYXRhW10pIGdyaWQuZWxlbWVudEF0KHJvdykpW2tdID0gc3BhY2VyU3BlYzsNCi0JCX0NCi0JCWZvciAoaW50IGsgPSByb3cgKyAxOyBrIDwgZ3JpZC5zaXplKCk7IGsrKykgew0KLQkJCXNwYWNlclNwZWMgPSBuZXcgVGFibGVEYXRhKCk7DQotCQkJc3BhY2VyU3BlYy5pc0l0ZW1EYXRhID0gZmFsc2U7DQotCQkJKChUYWJsZURhdGFbXSkgZ3JpZC5lbGVtZW50QXQoaykpW2NvbHVtbl0gPSBzcGFjZXJTcGVjOw0KLQkJfQ0KLQkJZ3Jvd2luZ0NvbHVtbnMgPSBuZXcgaW50W2dyb3dpbmdDb2xzLnNpemUoKV07DQotCQlmb3IgKGludCBpID0gMDsgaSA8IGdyb3dpbmdDb2xzLnNpemUoKTsgaSsrKSB7DQotCQkJZ3Jvd2luZ0NvbHVtbnNbaV0gPSAoKEludGVnZXIpIGdyb3dpbmdDb2xzLmdldChpKSkuaW50VmFsdWUoKTsNCi0JCX0NCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgdXBkYXRlR3Jvd2luZ0NvbHVtbnMoDQotCQlWZWN0b3IgZ3Jvd2luZ0NvbHVtbnMsDQotCQlUYWJsZURhdGEgc3BlYywNCi0JCWludCBjb2x1bW4pIHsNCi0JCWludCBhZmZlY3RlZENvbHVtbiA9IGNvbHVtbiArIHNwZWMuY29sc3BhbiAtIDE7DQotCQlmb3IgKGludCBpID0gMDsgaSA8IGdyb3dpbmdDb2x1bW5zLnNpemUoKTsgaSsrKSB7DQotCQkJSW50ZWdlciBjb2wgPSAoSW50ZWdlcikgZ3Jvd2luZ0NvbHVtbnMuZ2V0KGkpOw0KLQkJCWlmIChjb2wuaW50VmFsdWUoKSA9PSBhZmZlY3RlZENvbHVtbikNCi0JCQkJcmV0dXJuOw0KLQkJfQ0KLQkJZ3Jvd2luZ0NvbHVtbnMuYWRkKG5ldyBJbnRlZ2VyKGFmZmVjdGVkQ29sdW1uKSk7DQotCX0NCi0NCi0JcHJpdmF0ZSBUYWJsZURhdGFbXSBjcmVhdGVFbXB0eVJvdygpIHsNCi0JCVRhYmxlRGF0YVtdIHJvdyA9IG5ldyBUYWJsZURhdGFbbnVtQ29sdW1uc107DQotCQlmb3IgKGludCBpID0gMDsgaSA8IG51bUNvbHVtbnM7IGkrKykNCi0JCQlyb3dbaV0gPSBudWxsOw0KLQkJcmV0dXJuIHJvdzsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQHNlZSBMYXlvdXQjY29tcHV0ZVNpemUoQ29tcG9zaXRlLCBpbnQsIGludCwgYm9vbGVhbikNCi0JICovDQotCXByb3RlY3RlZCBQb2ludCBjb21wdXRlU2l6ZSgNCi0JCUNvbXBvc2l0ZSBwYXJlbnQsDQotCQlpbnQgd0hpbnQsDQotCQlpbnQgaEhpbnQsDQotCQlib29sZWFuIGNoYW5nZWQpIHsNCi0JCUNvbnRyb2xbXSBjaGlsZHJlbiA9IHBhcmVudC5nZXRDaGlsZHJlbigpOw0KLQkJaWYgKGNoaWxkcmVuLmxlbmd0aCA9PSAwKSB7DQotCQkJcmV0dXJuIG5ldyBQb2ludCgwLCAwKTsNCi0JCX0NCi0JCWludCBwYXJlbnRXaWR0aCA9IHdIaW50Ow0KLQkJY2hhbmdlZCA9IHRydWU7DQotCQlpbml0aWFsaXplSWZOZWVkZWQocGFyZW50LCBjaGFuZ2VkKTsNCi0JCWlmIChpbml0aWFsTGF5b3V0KSB7DQotCQkJY2hhbmdlZCA9IHRydWU7DQotCQkJaW5pdGlhbExheW91dCA9IGZhbHNlOw0KLQkJfQ0KLQkJaWYgKGdyaWQgPT0gbnVsbCB8fCBjaGFuZ2VkKSB7DQotCQkJY2hhbmdlZCA9IHRydWU7DQotCQkJZ3JpZCA9IG5ldyBWZWN0b3IoKTsNCi0JCQljcmVhdGVHcmlkKHBhcmVudCk7DQotCQl9DQotCQlyZXNldENvbHVtbldpZHRocygpOw0KLQkJaW50IG1pbldpZHRoID0gaW50ZXJuYWxHZXRNaW5pbXVtV2lkdGgocGFyZW50LCBjaGFuZ2VkKTsNCi0JCWludCBtYXhXaWR0aCA9IGludGVybmFsR2V0TWF4aW11bVdpZHRoKHBhcmVudCwgY2hhbmdlZCk7DQotDQotCQlpbnQgdGFibGVXaWR0aCA9IHBhcmVudFdpZHRoOw0KLQ0KLQkJaW50W10gY29sdW1uV2lkdGhzOw0KLQ0KLQkJaWYgKHBhcmVudFdpZHRoIDwgbWluV2lkdGgpIHsNCi0JCQl0YWJsZVdpZHRoID0gbWluV2lkdGg7DQotCQkJaWYgKG1ha2VDb2x1bW5zRXF1YWxXaWR0aCkgew0KLQkJCQljb2x1bW5XaWR0aHMgPSBuZXcgaW50W251bUNvbHVtbnNdOw0KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG51bUNvbHVtbnM7IGkrKykgew0KLQkJCQkJY29sdW1uV2lkdGhzW2ldID0gd2lkZXN0Q29sdW1uV2lkdGg7DQotCQkJCX0NCi0JCQl9IGVsc2UNCi0JCQkJY29sdW1uV2lkdGhzID0gbWluQ29sdW1uV2lkdGhzOw0KLQkJfSBlbHNlIGlmIChwYXJlbnRXaWR0aCA+IG1heFdpZHRoKSB7DQotCQkJaWYgKG1ha2VDb2x1bW5zRXF1YWxXaWR0aCkgew0KLQkJCQljb2x1bW5XaWR0aHMgPSBuZXcgaW50W251bUNvbHVtbnNdOw0KLQkJCQlpbnQgY29sU3BhY2UgPSBwYXJlbnRXaWR0aCAtIGxlZnRNYXJnaW4gLSByaWdodE1hcmdpbjsNCi0JCQkJY29sU3BhY2UgLT0gKG51bUNvbHVtbnMgLSAxKSAqIGhvcml6b250YWxTcGFjaW5nOw0KLQkJCQlpbnQgY29sID0gY29sU3BhY2UgLyBudW1Db2x1bW5zOw0KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG51bUNvbHVtbnM7IGkrKykgew0KLQkJCQkJY29sdW1uV2lkdGhzW2ldID0gY29sOw0KLQkJCQl9DQotCQkJfSBlbHNlIHsNCi0JCQkJdGFibGVXaWR0aCA9IG1heFdpZHRoOw0KLQkJCQljb2x1bW5XaWR0aHMgPSBtYXhDb2x1bW5XaWR0aHM7DQotCQkJfQ0KLQkJfSBlbHNlIHsNCi0JCQljb2x1bW5XaWR0aHMgPSBuZXcgaW50W251bUNvbHVtbnNdOw0KLQkJCWlmIChtYWtlQ29sdW1uc0VxdWFsV2lkdGgpIHsNCi0JCQkJaW50IGNvbFNwYWNlID0gdGFibGVXaWR0aCAtIGxlZnRNYXJnaW4gLSByaWdodE1hcmdpbjsNCi0JCQkJY29sU3BhY2UgLT0gKG51bUNvbHVtbnMgLSAxKSAqIGhvcml6b250YWxTcGFjaW5nOw0KLQkJCQlpbnQgY29sID0gY29sU3BhY2UgLyBudW1Db2x1bW5zOw0KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG51bUNvbHVtbnM7IGkrKykgew0KLQkJCQkJY29sdW1uV2lkdGhzW2ldID0gY29sOw0KLQkJCQl9DQotCQkJfSBlbHNlIHsNCi0JCQkJaW50W10gZXh0cmFTcGFjZSA9DQotCQkJCQljYWxjdWxhdGVFeHRyYVNwYWNlKHRhYmxlV2lkdGgsIG1heFdpZHRoLCBtaW5XaWR0aCk7DQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtQ29sdW1uczsgaSsrKSB7DQotCQkJCQlpbnQgbWluQ1dpZHRoID0gbWluQ29sdW1uV2lkdGhzW2ldOw0KLQkJCQkJY29sdW1uV2lkdGhzW2ldID0gbWluQ1dpZHRoICsgZXh0cmFTcGFjZVtpXTsNCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0JCWludCB0b3RhbEhlaWdodCA9IDA7DQotCQlpbnQgeSA9IHRvcE1hcmdpbjsNCi0JCS8vIGNvbXB1dGUgd2lkdGhzDQotCQlmb3IgKGludCBpID0gMDsgaSA8IGdyaWQuc2l6ZSgpOyBpKyspIHsNCi0JCQlUYWJsZURhdGFbXSByb3cgPSAoVGFibGVEYXRhW10pIGdyaWQuZWxlbWVudEF0KGkpOw0KLQkJCS8vIGFzc2lnbiB3aWR0aHMsIGNhbGN1bGF0ZSBoZWlnaHRzDQotCQkJaW50IHJvd0hlaWdodCA9IDA7DQotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBudW1Db2x1bW5zOyBqKyspIHsNCi0JCQkJVGFibGVEYXRhIHRkID0gcm93W2pdOw0KLQkJCQlpZiAodGQuaXNJdGVtRGF0YSA9PSBmYWxzZSkgew0KLQkJCQkJY29udGludWU7DQotCQkJCX0NCi0JCQkJQ29udHJvbCBjaGlsZCA9IGNoaWxkcmVuW3RkLmNoaWxkSW5kZXhdOw0KLQkJCQlpbnQgc3BhbiA9IHRkLmNvbHNwYW47DQotCQkJCWludCBjd2lkdGggPSAwOw0KLQkJCQlmb3IgKGludCBrID0gajsgayA8IGogKyBzcGFuOyBrKyspIHsNCi0JCQkJCWlmIChrID4gaikNCi0JCQkJCQljd2lkdGggKz0gaG9yaXpvbnRhbFNwYWNpbmc7DQotCQkJCQljd2lkdGggKz0gY29sdW1uV2lkdGhzW2tdOw0KLQkJCQl9DQotCQkJCWludCBjeSA9IHRkLmhlaWdodEhpbnQ7DQotCQkJCWlmIChjeSA9PSBTV1QuREVGQVVMVCkgew0KLQkJCQkJUG9pbnQgc2l6ZSA9IGNvbXB1dGVTaXplKGNoaWxkLCBjd2lkdGgsIGNoYW5nZWQpOw0KLQkJCQkJY3kgPSBzaXplLnk7DQotCQkJCX0NCi0JCQkJcm93SGVpZ2h0ID0gTWF0aC5tYXgocm93SGVpZ2h0LCBjeSk7DQotCQkJfQ0KLQkJCXkgKz0gcm93SGVpZ2h0ICsgdmVydGljYWxTcGFjaW5nOw0KLQkJfQ0KLQkJdG90YWxIZWlnaHQgPSB5ICsgYm90dG9tTWFyZ2luOw0KLQkJcmV0dXJuIG5ldyBQb2ludCh0YWJsZVdpZHRoLCB0b3RhbEhlaWdodCk7DQotCX0NCi0NCi0JaW50IGludGVybmFsR2V0TWluaW11bVdpZHRoKENvbXBvc2l0ZSBwYXJlbnQsIGJvb2xlYW4gY2hhbmdlZCkgew0KLQkJaWYgKGNoYW5nZWQpDQotCQkJY2FsY3VsYXRlTWluaW11bUNvbHVtbldpZHRocyhwYXJlbnQsIHRydWUpOw0KLQkJaW50IG1pbmltdW1XaWR0aCA9IDA7DQotDQotCQl3aWRlc3RDb2x1bW5XaWR0aCA9IDA7DQotDQotCQlpZiAobWFrZUNvbHVtbnNFcXVhbFdpZHRoKSB7DQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW1Db2x1bW5zOyBpKyspIHsNCi0JCQkJd2lkZXN0Q29sdW1uV2lkdGggPQ0KLQkJCQkJTWF0aC5tYXgod2lkZXN0Q29sdW1uV2lkdGgsIG1pbkNvbHVtbldpZHRoc1tpXSk7DQotCQkJfQ0KLQkJfQ0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW1Db2x1bW5zOyBpKyspIHsNCi0JCQlpZiAoaSA+IDApDQotCQkJCW1pbmltdW1XaWR0aCArPSBob3Jpem9udGFsU3BhY2luZzsNCi0JCQlpZiAobWFrZUNvbHVtbnNFcXVhbFdpZHRoKQ0KLQkJCQltaW5pbXVtV2lkdGggKz0gd2lkZXN0Q29sdW1uV2lkdGg7DQotCQkJZWxzZQ0KLQkJCQltaW5pbXVtV2lkdGggKz0gbWluQ29sdW1uV2lkdGhzW2ldOw0KLQkJfQ0KLQkJLy8gYWRkIG1hcmdpbnMNCi0JCW1pbmltdW1XaWR0aCArPSBsZWZ0TWFyZ2luICsgcmlnaHRNYXJnaW47DQotCQlyZXR1cm4gbWluaW11bVdpZHRoOw0KLQl9DQotDQotCWludCBpbnRlcm5hbEdldE1heGltdW1XaWR0aChDb21wb3NpdGUgcGFyZW50LCBib29sZWFuIGNoYW5nZWQpIHsNCi0JCWlmIChjaGFuZ2VkKQ0KLQkJCWNhbGN1bGF0ZU1heGltdW1Db2x1bW5XaWR0aHMocGFyZW50LCB0cnVlKTsNCi0JCWludCBtYXhpbXVtV2lkdGggPSAwOw0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW1Db2x1bW5zOyBpKyspIHsNCi0JCQlpZiAoaSA+IDApDQotCQkJCW1heGltdW1XaWR0aCArPSBob3Jpem9udGFsU3BhY2luZzsNCi0JCQltYXhpbXVtV2lkdGggKz0gbWF4Q29sdW1uV2lkdGhzW2ldOw0KLQkJfQ0KLQkJLy8gYWRkIG1hcmdpbnMNCi0JCW1heGltdW1XaWR0aCArPSBsZWZ0TWFyZ2luICsgcmlnaHRNYXJnaW47DQotCQlyZXR1cm4gbWF4aW11bVdpZHRoOw0KLQl9DQotDQotCXZvaWQgcmVzZXRDb2x1bW5XaWR0aHMoKSB7DQotCQlpZiAobWluQ29sdW1uV2lkdGhzID09IG51bGwpDQotCQkJbWluQ29sdW1uV2lkdGhzID0gbmV3IGludFtudW1Db2x1bW5zXTsNCi0JCWlmIChtYXhDb2x1bW5XaWR0aHMgPT0gbnVsbCkNCi0JCQltYXhDb2x1bW5XaWR0aHMgPSBuZXcgaW50W251bUNvbHVtbnNdOw0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW1Db2x1bW5zOyBpKyspIHsNCi0JCQltaW5Db2x1bW5XaWR0aHNbaV0gPSAwOw0KLQkJfQ0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW1Db2x1bW5zOyBpKyspIHsNCi0JCQltYXhDb2x1bW5XaWR0aHNbaV0gPSAwOw0KLQkJfQ0KLQl9DQotDQotCXZvaWQgY2FsY3VsYXRlTWluaW11bUNvbHVtbldpZHRocyhDb21wb3NpdGUgcGFyZW50LCBib29sZWFuIGNoYW5nZWQpIHsNCi0JCUNvbnRyb2xbXSBjaGlsZHJlbiA9IHBhcmVudC5nZXRDaGlsZHJlbigpOw0KLQ0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBncmlkLnNpemUoKTsgaSsrKSB7DQotCQkJVGFibGVEYXRhW10gcm93ID0gKFRhYmxlRGF0YVtdKSBncmlkLmVsZW1lbnRBdChpKTsNCi0JCQlmb3IgKGludCBqID0gMDsgaiA8IG51bUNvbHVtbnM7IGorKykgew0KLQkJCQlUYWJsZURhdGEgdGQgPSByb3dbal07DQotCQkJCWlmICh0ZC5pc0l0ZW1EYXRhID09IGZhbHNlKQ0KLQkJCQkJY29udGludWU7DQotCQkJCUNvbnRyb2wgY2hpbGQgPSBjaGlsZHJlblt0ZC5jaGlsZEluZGV4XTsNCi0JCQkJaW50IG1pbldpZHRoID0gLTE7DQotCQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIENvbXBvc2l0ZSkgew0KLQkJCQkJQ29tcG9zaXRlIGNjID0gKENvbXBvc2l0ZSkgY2hpbGQ7DQotCQkJCQlMYXlvdXQgbCA9IGNjLmdldExheW91dCgpOw0KLQkJCQkJaWYgKGwgaW5zdGFuY2VvZiBJTGF5b3V0RXh0ZW5zaW9uKSB7DQotCQkJCQkJbWluV2lkdGggPQ0KLQkJCQkJCQkoKElMYXlvdXRFeHRlbnNpb24pIGwpLmdldE1pbmltdW1XaWR0aChjYywgY2hhbmdlZCk7DQotCQkJCQl9DQotCQkJCX0NCi0JCQkJaWYgKG1pbldpZHRoID09IC0xKSB7DQotCQkJCQlpZiAoaXNXcmFwKGNoaWxkKSkgew0KLQkJCQkJCS8vIFNob3VsZCBiZSB0aGUgd2lkdGggb2YgdGhlDQotCQkJCQkJLy8gbG9uZ2VzdCB3b3JkLCB3ZSdsbCBwaWNrDQotCQkJCQkJLy8gc29tZSBzbWFsbCBudW1iZXIgaW5zdGVhZA0KLQkJCQkJCW1pbldpZHRoID0gMzA7DQotCQkJCQl9IGVsc2Ugew0KLQkJCQkJCVBvaW50IHNpemUgPQ0KLQkJCQkJCQljaGlsZC5jb21wdXRlU2l6ZSgNCi0JCQkJCQkJCVNXVC5ERUZBVUxULA0KLQkJCQkJCQkJU1dULkRFRkFVTFQsDQotCQkJCQkJCQljaGFuZ2VkKTsNCi0JCQkJCQltaW5XaWR0aCA9IHNpemUueDsNCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCQltaW5XaWR0aCArPSB0ZC5pbmRlbnQ7DQotCQkJCW1pbkNvbHVtbldpZHRoc1tqXSA9IE1hdGgubWF4KG1pbkNvbHVtbldpZHRoc1tqXSwgbWluV2lkdGgpOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQ0KLQlib29sZWFuIGlzV3JhcChDb250cm9sIGNvbnRyb2wpIHsNCi0JCWlmIChjb250cm9sIGluc3RhbmNlb2YgQ29tcG9zaXRlDQotCQkJJiYgKChDb21wb3NpdGUpIGNvbnRyb2wpLmdldExheW91dCgpIGluc3RhbmNlb2YgSUxheW91dEV4dGVuc2lvbikNCi0JCQlyZXR1cm4gdHJ1ZTsNCi0JCXJldHVybiAoY29udHJvbC5nZXRTdHlsZSgpICYgU1dULldSQVApICE9IDA7DQotCX0NCi0NCi0Jdm9pZCBjYWxjdWxhdGVNYXhpbXVtQ29sdW1uV2lkdGhzKENvbXBvc2l0ZSBwYXJlbnQsIGJvb2xlYW4gY2hhbmdlZCkgew0KLQkJQ29udHJvbFtdIGNoaWxkcmVuID0gcGFyZW50LmdldENoaWxkcmVuKCk7DQotDQotCQlmb3IgKGludCBpID0gMDsgaSA8IG51bUNvbHVtbnM7IGkrKykgew0KLQkJCW1heENvbHVtbldpZHRoc1tpXSA9IDA7DQotCQl9DQotCQlmb3IgKGludCBpID0gMDsgaSA8IGdyaWQuc2l6ZSgpOyBpKyspIHsNCi0JCQlUYWJsZURhdGFbXSByb3cgPSAoVGFibGVEYXRhW10pIGdyaWQuZWxlbWVudEF0KGkpOw0KLQkJCWZvciAoaW50IGogPSAwOyBqIDwgbnVtQ29sdW1uczsgaisrKSB7DQotCQkJCVRhYmxlRGF0YSB0ZCA9IHJvd1tqXTsNCi0JCQkJaWYgKHRkLmlzSXRlbURhdGEgPT0gZmFsc2UpDQotCQkJCQljb250aW51ZTsNCi0JCQkJQ29udHJvbCBjaGlsZCA9IGNoaWxkcmVuW3RkLmNoaWxkSW5kZXhdOw0KLQkJCQlpbnQgbWF4V2lkdGggPSAtMTsNCi0JCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgQ29tcG9zaXRlKSB7DQotCQkJCQlDb21wb3NpdGUgY2MgPSAoQ29tcG9zaXRlKSBjaGlsZDsNCi0JCQkJCUxheW91dCBsID0gY2MuZ2V0TGF5b3V0KCk7DQotCQkJCQlpZiAobCBpbnN0YW5jZW9mIElMYXlvdXRFeHRlbnNpb24pIHsNCi0JCQkJCQltYXhXaWR0aCA9DQotCQkJCQkJCSgoSUxheW91dEV4dGVuc2lvbikgbCkuZ2V0TWF4aW11bVdpZHRoKGNjLCBjaGFuZ2VkKTsNCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCQlpZiAobWF4V2lkdGggPT0gLTEpIHsNCi0JCQkJCVBvaW50IHNpemUgPQ0KLQkJCQkJCWNoaWxkLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwgY2hhbmdlZCk7DQotCQkJCQltYXhXaWR0aCA9IHNpemUueDsNCi0JCQkJfQ0KLQkJCQltYXhXaWR0aCArPSB0ZC5pbmRlbnQ7DQotCQkJCWlmICh0ZC5jb2xzcGFuID09IDEpDQotCQkJCQltYXhDb2x1bW5XaWR0aHNbal0gPSBNYXRoLm1heChtYXhDb2x1bW5XaWR0aHNbal0sIG1heFdpZHRoKTsNCi0JCQkJZWxzZSB7DQotCQkJCQkvLyBncm93IHRoZSBsYXN0IGNvbHVtbg0KLQkJCQkJaW50IGxhc3QgPSBqICsgdGQuY29sc3BhbiAtIDE7DQotCQkJCQlpbnQgcmVtID0gMDsNCi0JCQkJCWZvciAoaW50IGsgPSBqOyBrIDwgaiArIHRkLmNvbHNwYW4gLSAxOyBrKyspIHsNCi0JCQkJCQlyZW0gKz0gbWF4Q29sdW1uV2lkdGhzW2tdOw0KLQkJCQkJfQ0KLQkJCQkJaW50IHJlZHVjZWQgPSBtYXhXaWR0aCAtIHJlbTsNCi0JCQkJCW1heENvbHVtbldpZHRoc1tsYXN0XSA9DQotCQkJCQkJTWF0aC5tYXgobWF4Q29sdW1uV2lkdGhzW2xhc3RdLCByZWR1Y2VkKTsNCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUlmTmVlZGVkKENvbXBvc2l0ZSBwYXJlbnQsIGJvb2xlYW4gY2hhbmdlZCkgew0KLQkJaWYgKGNoYW5nZWQpDQotCQkJaW5pdGlhbExheW91dCA9IHRydWU7DQotCQlpZiAoaW5pdGlhbExheW91dCkgew0KLQkJCWluaXRpYWxpemVMYXlvdXREYXRhKHBhcmVudCk7DQotCQkJaW5pdGlhbExheW91dCA9IGZhbHNlOw0KLQkJfQ0KLQl9DQotDQotCXZvaWQgaW5pdGlhbGl6ZUxheW91dERhdGEoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgew0KLQkJQ29udHJvbFtdIGNoaWxkcmVuID0gY29tcG9zaXRlLmdldENoaWxkcmVuKCk7DQotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7DQotCQkJQ29udHJvbCBjaGlsZCA9IGNoaWxkcmVuW2ldOw0KLQkJCWlmIChjaGlsZC5nZXRMYXlvdXREYXRhKCkgPT0gbnVsbCkgew0KLQkJCQljaGlsZC5zZXRMYXlvdXREYXRhKG5ldyBUYWJsZURhdGEoKSk7DQotCQkJfQ0KLQkJfQ0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9IeXBlcmxpbmtBZGFwdGVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvSHlwZXJsaW5rQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTgwYTJkLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9IeXBlcmxpbmtBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMuaW50ZXJuYWw7DQotDQotcHVibGljIGNsYXNzIEh5cGVybGlua0FkYXB0ZXIgaW1wbGVtZW50cyBJSHlwZXJsaW5rTGlzdGVuZXIgew0KLQ0KLXB1YmxpYyBIeXBlcmxpbmtBZGFwdGVyKCkgew0KLQlzdXBlcigpOw0KLX0NCi1wdWJsaWMgdm9pZCBsaW5rQWN0aXZhdGVkKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2wgbGlua0xhYmVsKSB7fQ0KLXB1YmxpYyB2b2lkIGxpbmtFbnRlcmVkKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2wgbGlua0xhYmVsKSB7fQ0KLXB1YmxpYyB2b2lkIGxpbmtFeGl0ZWQob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbCBsaW5rTGFiZWwpIHt9DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9IeXBlcmxpbmtIYW5kbGVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvSHlwZXJsaW5rSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzFhZWY2Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9IeXBlcmxpbmtIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zLmludGVybmFsOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247DQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VFdmVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUxpc3RlbmVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlVHJhY2tMaXN0ZW5lcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5QYWludEV2ZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlBhaW50TGlzdGVuZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7DQotDQotcHVibGljIGNsYXNzIEh5cGVybGlua0hhbmRsZXINCi0JZXh0ZW5kcyBIeXBlcmxpbmtTZXR0aW5ncw0KLQlpbXBsZW1lbnRzIE1vdXNlTGlzdGVuZXIsIE1vdXNlVHJhY2tMaXN0ZW5lciwgU2VsZWN0aW9uTGlzdGVuZXIsIFBhaW50TGlzdGVuZXIgew0KLQlwcml2YXRlIEhhc2h0YWJsZSBoeXBlcmxpbmtMaXN0ZW5lcnM7DQotCXByaXZhdGUgQ29udHJvbCBsYXN0QWN0aXZhdGVkOw0KLQlwcml2YXRlIENvbnRyb2wgbGFzdEVudGVyZWQ7DQotDQotCXB1YmxpYyBIeXBlcmxpbmtIYW5kbGVyKCkgew0KLQkJaHlwZXJsaW5rTGlzdGVuZXJzID0gbmV3IEhhc2h0YWJsZSgpOw0KLQl9DQotDQotCXB1YmxpYyBDb250cm9sIGdldExhc3RMaW5rKCkgew0KLQkJcmV0dXJuIGxhc3RBY3RpdmF0ZWQ7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgbW91c2VEb3VibGVDbGljayhNb3VzZUV2ZW50IGUpIHsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBlKSB7DQotCQlpZiAoZS5idXR0b24gPT0gMSkNCi0JCQlyZXR1cm47DQotCQlsYXN0QWN0aXZhdGVkID0gKENvbnRyb2wpIGUud2lkZ2V0Ow0KLQl9DQotCXB1YmxpYyB2b2lkIG1vdXNlRW50ZXIoTW91c2VFdmVudCBlKSB7DQotCQlDb250cm9sIGNvbnRyb2wgPSAoQ29udHJvbCkgZS53aWRnZXQ7DQotCQlsaW5rRW50ZXJlZChjb250cm9sKTsNCi0JfQ0KLQlwdWJsaWMgdm9pZCBtb3VzZUV4aXQoTW91c2VFdmVudCBlKSB7DQotCQlDb250cm9sIGNvbnRyb2wgPSAoQ29udHJvbCkgZS53aWRnZXQ7DQotCQlsaW5rRXhpdGVkKGNvbnRyb2wpOw0KLQl9DQotCXB1YmxpYyB2b2lkIG1vdXNlSG92ZXIoTW91c2VFdmVudCBlKSB7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgbW91c2VVcChNb3VzZUV2ZW50IGUpIHsNCi0JCWlmIChlLmJ1dHRvbiAhPSAxKQ0KLQkJCXJldHVybjsNCi0JCUNvbnRyb2wgbGlua0NvbnRyb2wgPSAoQ29udHJvbCkgZS53aWRnZXQ7DQotCQlQb2ludCBzaXplID0gbGlua0NvbnRyb2wuZ2V0U2l6ZSgpOw0KLQkJLy8gRmlsdGVyIG91dCBtb3VzZSB1cCBldmVudHMgb3V0c2lkZQ0KLQkJLy8gdGhlIGxpbmsuIFRoaXMgY2FuIGhhcHBlbiB3aGVuIG1vdXNlIGlzDQotCQkvLyBjbGlja2VkLCBkcmFnZ2VkIG91dHNpZGUgdGhlIGxpbmssIHRoZW4NCi0JCS8vIHJlbGVhc2VkLg0KLQkJaWYgKGUueCA8IDApDQotCQkJcmV0dXJuOw0KLQkJaWYgKGUueSA8IDApDQotCQkJcmV0dXJuOw0KLQkJaWYgKGUueCA+PSBzaXplLngpDQotCQkJcmV0dXJuOw0KLQkJaWYgKGUueSA+PSBzaXplLnkpDQotCQkJcmV0dXJuOw0KLQkJbGlua0FjdGl2YXRlZChsaW5rQ29udHJvbCk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsNCi0JCUNvbnRyb2wgbGluayA9IChDb250cm9sKSBlLndpZGdldDsNCi0JCWxpbmtBY3RpdmF0ZWQobGluayk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgew0KLQkJQ29udHJvbCBsaW5rID0gKENvbnRyb2wpIGUud2lkZ2V0Ow0KLQkJU2VsZWN0YWJsZUZvcm1MYWJlbCBsID0gKFNlbGVjdGFibGVGb3JtTGFiZWwpIGxpbms7DQotCQlpZiAobC5nZXRTZWxlY3Rpb24oKSkNCi0JCQlsaW5rRW50ZXJlZChsaW5rKTsNCi0JCWVsc2UNCi0JCQlsaW5rRXhpdGVkKGxpbmspOw0KLQl9DQotDQotCXByaXZhdGUgdm9pZCBsaW5rQWN0aXZhdGVkKENvbnRyb2wgbGluaykgew0KLQkJSUh5cGVybGlua0xpc3RlbmVyIGFjdGlvbiA9DQotCQkJKElIeXBlcmxpbmtMaXN0ZW5lcikgaHlwZXJsaW5rTGlzdGVuZXJzLmdldChsaW5rKTsNCi0JCWlmIChhY3Rpb24gIT0gbnVsbCkgew0KLQkJCWxpbmsuc2V0Q3Vyc29yKGdldEJ1c3lDdXJzb3IoKSk7DQotCQkJYWN0aW9uLmxpbmtBY3RpdmF0ZWQobGluayk7DQotCQkJaWYgKCFsaW5rLmlzRGlzcG9zZWQoKSkNCi0JCQkJbGluay5zZXRDdXJzb3IoDQotCQkJCQlpc0h5cGVybGlua0N1cnNvclVzZWQoKSA/IGdldEh5cGVybGlua0N1cnNvcigpIDogbnVsbCk7DQotCQl9DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIGxpbmtFbnRlcmVkKENvbnRyb2wgbGluaykgew0KLQkJaWYgKGxhc3RFbnRlcmVkICE9IG51bGwNCi0JCQkmJiBsYXN0RW50ZXJlZCBpbnN0YW5jZW9mIFNlbGVjdGFibGVGb3JtTGFiZWwpIHsNCi0JCQlTZWxlY3RhYmxlRm9ybUxhYmVsIGZsID0gKFNlbGVjdGFibGVGb3JtTGFiZWwpIGxhc3RFbnRlcmVkOw0KLQkJCWxpbmtFeGl0ZWQoZmwpOw0KLQkJfQ0KLQkJaWYgKGlzSHlwZXJsaW5rQ3Vyc29yVXNlZCgpKQ0KLQkJCWxpbmsuc2V0Q3Vyc29yKGdldEh5cGVybGlua0N1cnNvcigpKTsNCi0JCWlmIChhY3RpdmVCYWNrZ3JvdW5kICE9IG51bGwpDQotCQkJbGluay5zZXRCYWNrZ3JvdW5kKGFjdGl2ZUJhY2tncm91bmQpOw0KLQkJaWYgKGFjdGl2ZUZvcmVncm91bmQgIT0gbnVsbCkNCi0JCQlsaW5rLnNldEZvcmVncm91bmQoYWN0aXZlRm9yZWdyb3VuZCk7DQotCQlpZiAoaHlwZXJsaW5rVW5kZXJsaW5lTW9kZSA9PSBVTkRFUkxJTkVfUk9MTE9WRVIpDQotCQkJdW5kZXJsaW5lKGxpbmssIHRydWUpOw0KLQ0KLQkJSUh5cGVybGlua0xpc3RlbmVyIGFjdGlvbiA9DQotCQkJKElIeXBlcmxpbmtMaXN0ZW5lcikgaHlwZXJsaW5rTGlzdGVuZXJzLmdldChsaW5rKTsNCi0JCWlmIChhY3Rpb24gIT0gbnVsbCkNCi0JCQlhY3Rpb24ubGlua0VudGVyZWQobGluayk7DQotCQlsYXN0RW50ZXJlZCA9IGxpbms7DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIGxpbmtFeGl0ZWQoQ29udHJvbCBsaW5rKSB7DQotCQlpZiAoaXNIeXBlcmxpbmtDdXJzb3JVc2VkKCkpDQotCQkJbGluay5zZXRDdXJzb3IobnVsbCk7DQotCQlpZiAoaHlwZXJsaW5rVW5kZXJsaW5lTW9kZSA9PSBVTkRFUkxJTkVfUk9MTE9WRVIpDQotCQkJdW5kZXJsaW5lKGxpbmssIGZhbHNlKTsNCi0JCWlmIChiYWNrZ3JvdW5kICE9IG51bGwpDQotCQkJbGluay5zZXRCYWNrZ3JvdW5kKGJhY2tncm91bmQpOw0KLQkJaWYgKGZvcmVncm91bmQgIT0gbnVsbCkNCi0JCQlsaW5rLnNldEZvcmVncm91bmQoZm9yZWdyb3VuZCk7DQotCQlJSHlwZXJsaW5rTGlzdGVuZXIgYWN0aW9uID0NCi0JCQkoSUh5cGVybGlua0xpc3RlbmVyKSBoeXBlcmxpbmtMaXN0ZW5lcnMuZ2V0KGxpbmspOw0KLQkJaWYgKGFjdGlvbiAhPSBudWxsKQ0KLQkJCWFjdGlvbi5saW5rRXhpdGVkKGxpbmspOw0KLQkJaWYgKGxhc3RFbnRlcmVkID09IGxpbmspDQotCQkJbGFzdEVudGVyZWQgPSBudWxsOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChQYWludEV2ZW50IGUpIHsNCi0JCUNvbnRyb2wgbGFiZWwgPSAoQ29udHJvbCkgZS53aWRnZXQ7DQotCQlpZiAoaHlwZXJsaW5rVW5kZXJsaW5lTW9kZSA9PSBVTkRFUkxJTkVfQUxXQVlTKQ0KLQkJCUh5cGVybGlua0hhbmRsZXIudW5kZXJsaW5lKGxhYmVsLCB0cnVlKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCByZWdpc3Rlckh5cGVybGluaygNCi0JCUNvbnRyb2wgY29udHJvbCwNCi0JCUlIeXBlcmxpbmtMaXN0ZW5lciBsaXN0ZW5lcikgew0KLQkJaWYgKGJhY2tncm91bmQgIT0gbnVsbCkNCi0JCQljb250cm9sLnNldEJhY2tncm91bmQoYmFja2dyb3VuZCk7DQotCQlpZiAoZm9yZWdyb3VuZCAhPSBudWxsKQ0KLQkJCWNvbnRyb2wuc2V0Rm9yZWdyb3VuZChmb3JlZ3JvdW5kKTsNCi0JCWNvbnRyb2wuYWRkTW91c2VMaXN0ZW5lcih0aGlzKTsNCi0JCWNvbnRyb2wuYWRkTW91c2VUcmFja0xpc3RlbmVyKHRoaXMpOw0KLQ0KLQkJaWYgKGh5cGVybGlua1VuZGVybGluZU1vZGUgPT0gVU5ERVJMSU5FX0FMV0FZUw0KLQkJCSYmIGNvbnRyb2wgaW5zdGFuY2VvZiBMYWJlbCkNCi0JCQljb250cm9sLmFkZFBhaW50TGlzdGVuZXIodGhpcyk7DQotCQlpZiAoY29udHJvbCBpbnN0YW5jZW9mIFNlbGVjdGFibGVGb3JtTGFiZWwpIHsNCi0JCQlTZWxlY3RhYmxlRm9ybUxhYmVsIHNsID0gKFNlbGVjdGFibGVGb3JtTGFiZWwpIGNvbnRyb2w7DQotCQkJc2wuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7DQotCQkJaWYgKGh5cGVybGlua1VuZGVybGluZU1vZGUgPT0gVU5ERVJMSU5FX0FMV0FZUykNCi0JCQkJc2wuc2V0VW5kZXJsaW5lZCh0cnVlKTsNCi0JCX0NCi0JCWh5cGVybGlua0xpc3RlbmVycy5wdXQoY29udHJvbCwgbGlzdGVuZXIpOw0KLQkJcmVtb3ZlRGlzcG9zZWRMaW5rcygpOw0KLQl9DQotDQotCXByaXZhdGUgdm9pZCByZW1vdmVEaXNwb3NlZExpbmtzKCkgew0KLQkJZm9yIChFbnVtZXJhdGlvbiBrZXlzID0gaHlwZXJsaW5rTGlzdGVuZXJzLmtleXMoKTsNCi0JCQlrZXlzLmhhc01vcmVFbGVtZW50cygpOw0KLQkJCSkgew0KLQkJCUNvbnRyb2wgY29udHJvbCA9IChDb250cm9sKSBrZXlzLm5leHRFbGVtZW50KCk7DQotCQkJaWYgKGNvbnRyb2wuaXNEaXNwb3NlZCgpKSB7DQotCQkJCWh5cGVybGlua0xpc3RlbmVycy5yZW1vdmUoY29udHJvbCk7DQotCQkJfQ0KLQkJfQ0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHJlc2V0KCkgew0KLQkJaHlwZXJsaW5rTGlzdGVuZXJzLmNsZWFyKCk7DQotCX0NCi0NCi0JcHVibGljIHN0YXRpYyB2b2lkIHVuZGVybGluZShDb250cm9sIGNvbnRyb2wsIGJvb2xlYW4gaW5zaWRlKSB7DQotCQlpZiAoY29udHJvbCBpbnN0YW5jZW9mIFNlbGVjdGFibGVGb3JtTGFiZWwpIHsNCi0JCQlTZWxlY3RhYmxlRm9ybUxhYmVsIGwgPSAoU2VsZWN0YWJsZUZvcm1MYWJlbCkgY29udHJvbDsNCi0JCQlsLnNldFVuZGVybGluZWQoaW5zaWRlKTsNCi0JCQlsLnJlZHJhdygpOw0KLQkJCXJldHVybjsNCi0JCX0NCi0JCWlmICghKGNvbnRyb2wgaW5zdGFuY2VvZiBMYWJlbCkpDQotCQkJcmV0dXJuOw0KLQkJQ29tcG9zaXRlIHBhcmVudCA9IGNvbnRyb2wuZ2V0UGFyZW50KCk7DQotCQlSZWN0YW5nbGUgYm91bmRzID0gY29udHJvbC5nZXRCb3VuZHMoKTsNCi0JCUdDIGdjID0gbmV3IEdDKHBhcmVudCk7DQotCQlDb2xvciBjb2xvciA9DQotCQkJaW5zaWRlID8gY29udHJvbC5nZXRGb3JlZ3JvdW5kKCkgOiBjb250cm9sLmdldEJhY2tncm91bmQoKTsNCi0JCWdjLnNldEZvcmVncm91bmQoY29sb3IpOw0KLQkJaW50IHkgPSBib3VuZHMueSArIGJvdW5kcy5oZWlnaHQ7DQotCQlnYy5kcmF3TGluZShib3VuZHMueCwgeSwgYm91bmRzLnggKyBib3VuZHMud2lkdGgsIHkpOw0KLQkJZ2MuZGlzcG9zZSgpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHNldEZvcmVncm91bmQoQ29sb3IgY29sb3IpIHsNCi0JCXN1cGVyLnNldEZvcmVncm91bmQoY29sb3IpOw0KLQkJcmVtb3ZlRGlzcG9zZWRMaW5rcygpOw0KLQkJZm9yIChFbnVtZXJhdGlvbiBsaW5rcyA9IGh5cGVybGlua0xpc3RlbmVycy5rZXlzKCk7DQotCQkJbGlua3MuaGFzTW9yZUVsZW1lbnRzKCk7DQotCQkJKSB7DQotCQkJQ29udHJvbCBjb250cm9sID0gKENvbnRyb2wpIGxpbmtzLm5leHRFbGVtZW50KCk7DQotCQkJY29udHJvbC5zZXRGb3JlZ3JvdW5kKGNvbG9yKTsNCi0JCX0NCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvSHlwZXJsaW5rU2V0dGluZ3MuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9IeXBlcmxpbmtTZXR0aW5ncy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTFjNmEwLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9IeXBlcmxpbmtTZXR0aW5ncy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOw0KLQ0KLXB1YmxpYyBjbGFzcyBIeXBlcmxpbmtTZXR0aW5ncyB7DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOREVSTElORV9ORVZFUiA9IDE7DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOREVSTElORV9ST0xMT1ZFUiA9IDI7DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOREVSTElORV9BTFdBWVMgPSAzOw0KLQ0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoeXBlcmxpbmtDdXJzb3JVc2VkID0gdHJ1ZTsNCi0JcHJvdGVjdGVkIGludCBoeXBlcmxpbmtVbmRlcmxpbmVNb2RlID0gVU5ERVJMSU5FX0FMV0FZUzsNCi0JcHJvdGVjdGVkIENvbG9yIGJhY2tncm91bmQ7DQotCXByb3RlY3RlZCBDb2xvciBmb3JlZ3JvdW5kOw0KLQlwcm90ZWN0ZWQgQ29sb3IgYWN0aXZlQmFja2dyb3VuZDsNCi0JcHJvdGVjdGVkIENvbG9yIGFjdGl2ZUZvcmVncm91bmQ7DQotCXByb3RlY3RlZCBzdGF0aWMgQ3Vyc29ycyBjdXJzb3JzID0gbmV3IEN1cnNvcnMoKTsNCi0NCi0Jc3RhdGljIGNsYXNzIEN1cnNvcnMgew0KLQkJQ3Vyc29yIGh5cGVybGlua0N1cnNvcjsNCi0JCUN1cnNvciBidXN5Q3Vyc29yOw0KLQkJQ3Vyc29yIHRleHRDdXJzb3I7DQotCQlpbnQgY291bnRlciA9IDA7DQotDQotCQlwdWJsaWMgdm9pZCBhbGxvY2F0ZSgpIHsNCi0JCQlpZiAoY291bnRlciA9PSAwKSB7DQotCQkJCWh5cGVybGlua0N1cnNvciA9DQotCQkJCQluZXcgQ3Vyc29yKERpc3BsYXkuZ2V0Q3VycmVudCgpLCBTV1QuQ1VSU09SX0hBTkQpOw0KLQkJCQlidXN5Q3Vyc29yID0gbmV3IEN1cnNvcihEaXNwbGF5LmdldEN1cnJlbnQoKSwgU1dULkNVUlNPUl9XQUlUKTsNCi0JCQkJdGV4dEN1cnNvciA9IG5ldyBDdXJzb3IoRGlzcGxheS5nZXRDdXJyZW50KCksIFNXVC5DVVJTT1JfSUJFQU0pOw0KLQkJCX0NCi0JCQljb3VudGVyKys7DQotCQl9DQotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgew0KLQkJCWNvdW50ZXItLTsNCi0JCQlpZiAoY291bnRlciA9PSAwKSB7DQotCQkJCWh5cGVybGlua0N1cnNvci5kaXNwb3NlKCk7DQotCQkJCWJ1c3lDdXJzb3IuZGlzcG9zZSgpOw0KLQkJCQl0ZXh0Q3Vyc29yLmRpc3Bvc2UoKTsNCi0JCQkJaHlwZXJsaW5rQ3Vyc29yID0gbnVsbDsNCi0JCQkJYnVzeUN1cnNvciA9IG51bGw7DQotCQkJCXRleHRDdXJzb3IgPSBudWxsOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQ0KLQlwdWJsaWMgSHlwZXJsaW5rU2V0dGluZ3MoKSB7DQotCQljdXJzb3JzLmFsbG9jYXRlKCk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsNCi0JCWlmIChjdXJzb3JzICE9IG51bGwpDQotCQkJY3Vyc29ycy5kaXNwb3NlKCk7DQotCX0NCi0NCi0JcHVibGljIENvbG9yIGdldEFjdGl2ZUJhY2tncm91bmQoKSB7DQotCQlyZXR1cm4gYWN0aXZlQmFja2dyb3VuZDsNCi0JfQ0KLQlwdWJsaWMgQ29sb3IgZ2V0QWN0aXZlRm9yZWdyb3VuZCgpIHsNCi0JCXJldHVybiBhY3RpdmVGb3JlZ3JvdW5kOw0KLQl9DQotCXB1YmxpYyBDb2xvciBnZXRCYWNrZ3JvdW5kKCkgew0KLQkJcmV0dXJuIGJhY2tncm91bmQ7DQotCX0NCi0JcHVibGljIEN1cnNvciBnZXRCdXN5Q3Vyc29yKCkgew0KLQkJcmV0dXJuIGN1cnNvcnMuYnVzeUN1cnNvcjsNCi0JfQ0KLQlwdWJsaWMgQ3Vyc29yIGdldFRleHRDdXJzb3IoKSB7DQotCQlyZXR1cm4gY3Vyc29ycy50ZXh0Q3Vyc29yOw0KLQl9DQotCXB1YmxpYyBDb2xvciBnZXRGb3JlZ3JvdW5kKCkgew0KLQkJcmV0dXJuIGZvcmVncm91bmQ7DQotCX0NCi0JcHVibGljIEN1cnNvciBnZXRIeXBlcmxpbmtDdXJzb3IoKSB7DQotCQlyZXR1cm4gY3Vyc29ycy5oeXBlcmxpbmtDdXJzb3I7DQotCX0NCi0JcHVibGljIGludCBnZXRIeXBlcmxpbmtVbmRlcmxpbmVNb2RlKCkgew0KLQkJcmV0dXJuIGh5cGVybGlua1VuZGVybGluZU1vZGU7DQotCX0NCi0NCi0JcHVibGljIGJvb2xlYW4gaXNIeXBlcmxpbmtDdXJzb3JVc2VkKCkgew0KLQkJcmV0dXJuIGh5cGVybGlua0N1cnNvclVzZWQ7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlQmFja2dyb3VuZChDb2xvciBuZXdBY3RpdmVCYWNrZ3JvdW5kKSB7DQotCQlhY3RpdmVCYWNrZ3JvdW5kID0gbmV3QWN0aXZlQmFja2dyb3VuZDsNCi0JfQ0KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVGb3JlZ3JvdW5kKENvbG9yIG5ld0FjdGl2ZUZvcmVncm91bmQpIHsNCi0JCWFjdGl2ZUZvcmVncm91bmQgPSBuZXdBY3RpdmVGb3JlZ3JvdW5kOw0KLQl9DQotCXB1YmxpYyB2b2lkIHNldEJhY2tncm91bmQoQ29sb3IgbmV3QmFja2dyb3VuZCkgew0KLQkJYmFja2dyb3VuZCA9IG5ld0JhY2tncm91bmQ7DQotCX0NCi0JcHVibGljIHZvaWQgc2V0Rm9yZWdyb3VuZChDb2xvciBuZXdGb3JlZ3JvdW5kKSB7DQotCQlmb3JlZ3JvdW5kID0gbmV3Rm9yZWdyb3VuZDsNCi0JfQ0KLQlwdWJsaWMgdm9pZCBzZXRIeXBlcmxpbmtDdXJzb3JVc2VkKGJvb2xlYW4gbmV3SHlwZXJsaW5rQ3Vyc29yVXNlZCkgew0KLQkJaHlwZXJsaW5rQ3Vyc29yVXNlZCA9IG5ld0h5cGVybGlua0N1cnNvclVzZWQ7DQotCX0NCi0JcHVibGljIHZvaWQgc2V0SHlwZXJsaW5rVW5kZXJsaW5lTW9kZShpbnQgbmV3SHlwZXJsaW5rVW5kZXJsaW5lTW9kZSkgew0KLQkJaHlwZXJsaW5rVW5kZXJsaW5lTW9kZSA9IG5ld0h5cGVybGlua1VuZGVybGluZU1vZGU7DQotCX0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL0lGb3JtLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvSUZvcm0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTY2MTQ4NS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvSUZvcm0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7DQotDQotcHVibGljIGludGVyZmFjZSBJRm9ybSB7DQotcHVibGljIHZvaWQgY29tbWl0Q2hhbmdlcyhib29sZWFuIG9uU2F2ZSk7DQotcHVibGljIENvbnRyb2wgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KTsNCi1wdWJsaWMgdm9pZCBkaXNwb3NlKCk7DQotcHVibGljIGJvb2xlYW4gZG9HbG9iYWxBY3Rpb24oU3RyaW5nIGFjdGlvbklkKTsNCi1wdWJsaWMgdm9pZCBleHBhbmRUbyhPYmplY3Qgb2JqZWN0KTsNCi1wdWJsaWMgQ29udHJvbCBnZXRDb250cm9sKCk7DQotcHVibGljIEZvcm1XaWRnZXRGYWN0b3J5IGdldEZhY3RvcnkoKTsNCi1wdWJsaWMgQ29sb3IgZ2V0SGVhZGluZ0JhY2tncm91bmQoKTsNCi1wdWJsaWMgQ29sb3IgZ2V0SGVhZGluZ0ZvcmVncm91bmQoKTsNCi1wdWJsaWMgSW1hZ2UgZ2V0SGVhZGluZ0ltYWdlKCk7DQotcHVibGljIFN0cmluZyBnZXRIZWFkaW5nVGV4dCgpOw0KLXB1YmxpYyB2b2lkIGluaXRpYWxpemUoT2JqZWN0IG1vZGVsKTsNCi1wdWJsaWMgYm9vbGVhbiBpc0hlYWRpbmdWaXNpYmxlKCk7DQotcHVibGljIHZvaWQgcmVnaXN0ZXJTZWN0aW9uKEZvcm1TZWN0aW9uIHNlY3Rpb24pOw0KLXB1YmxpYyB2b2lkIHNldEZvY3VzKCk7DQotcHVibGljIHZvaWQgc2V0SGVhZGluZ0JhY2tncm91bmQoQ29sb3IgbmV3SGVhZGluZ0JhY2tncm91bmQpOw0KLXB1YmxpYyB2b2lkIHNldEhlYWRpbmdGb3JlZ3JvdW5kKENvbG9yIG5ld0hlYWRpbmdGb3JlZ3JvdW5kKTsNCi1wdWJsaWMgdm9pZCBzZXRIZWFkaW5nSW1hZ2UoSW1hZ2UgaGVhZGluZ0ltYWdlKTsNCi1wdWJsaWMgdm9pZCBzZXRIZWFkaW5nVmlzaWJsZShib29sZWFuIG5ld0hlYWRpbmdWaXNpYmxlKTsNCi1wdWJsaWMgdm9pZCBzZXRIZWFkaW5nVGV4dChTdHJpbmcgaGVhZGluZyk7DQotcHVibGljIHZvaWQgdXBkYXRlKCk7DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9JRm9ybVBhZ2UuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9JRm9ybVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODgzOTU5OC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvSUZvcm1QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMuaW50ZXJuYWw7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7DQotDQotcHVibGljIGludGVyZmFjZSBJRm9ybVBhZ2Ugew0KLQ0KLWJvb2xlYW4gYmVjb21lc0ludmlzaWJsZShJRm9ybVBhZ2UgbmV3UGFnZSk7DQotdm9pZCBiZWNvbWVzVmlzaWJsZShJRm9ybVBhZ2UgcHJldmlvdXNQYWdlKTsNCi12b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCk7DQotQ29udHJvbCBnZXRDb250cm9sKCk7DQotU3RyaW5nIGdldExhYmVsKCk7DQotU3RyaW5nIGdldFRpdGxlKCk7DQotYm9vbGVhbiBpc1NvdXJjZSgpOw0KLWJvb2xlYW4gaXNWaXNpYmxlKCk7DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9JRm9ybVNlbGVjdGlvbkxpc3RlbmVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvSUZvcm1TZWxlY3Rpb25MaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzM0ZDQxLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9JRm9ybVNlbGVjdGlvbkxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMuaW50ZXJuYWw7DQotDQotcHVibGljIGludGVyZmFjZSBJRm9ybVNlbGVjdGlvbkxpc3RlbmVyIHsNCi0JcHVibGljIHZvaWQgZm9ybVNlbGVjdGVkKElGb3JtUGFnZSBwYWdlLCBib29sZWFuIHNldEZvY3VzKTsNCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL0lGb3JtVGV4dExpc3RlbmVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvSUZvcm1UZXh0TGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM3ZjcxNC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvSUZvcm1UZXh0TGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbDsNCi0NCi1wdWJsaWMgaW50ZXJmYWNlIElGb3JtVGV4dExpc3RlbmVyIHsNCi0JcHVibGljIHZvaWQgdGV4dFZhbHVlQ2hhbmdlZChGb3JtRW50cnkgdGV4dCk7DQotCXB1YmxpYyB2b2lkIHRleHREaXJ0eShGb3JtRW50cnkgdGV4dCk7DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9JRm9ybVdvcmtib29rLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvSUZvcm1Xb3JrYm9vay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmU3OGFiLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9JRm9ybVdvcmtib29rLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMuaW50ZXJuYWw7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7DQotDQotcHVibGljIGludGVyZmFjZSBJRm9ybVdvcmtib29rIHsNCi0NCi0Jdm9pZCBhZGRGb3JtU2VsZWN0aW9uTGlzdGVuZXIoSUZvcm1TZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcik7DQotCXB1YmxpYyB2b2lkIGFkZFBhZ2UoSUZvcm1QYWdlIHBhZ2UpOw0KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpOw0KLQlDb250cm9sIGdldENvbnRyb2woKTsNCi0JcHVibGljIElGb3JtUGFnZSBnZXRDdXJyZW50UGFnZSgpOw0KLQlib29sZWFuIGlzRmlyc3RQYWdlU2VsZWN0ZWQoKTsNCi0Jdm9pZCByZW1vdmVGb3JtU2VsZWN0aW9uTGlzdGVuZXIoSUZvcm1TZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcik7DQotCXB1YmxpYyB2b2lkIHJlbW92ZVBhZ2UoSUZvcm1QYWdlIHBhZ2UpOw0KLQlwdWJsaWMgdm9pZCBzZWxlY3RQYWdlKGZpbmFsIElGb3JtUGFnZSBwYWdlLCBib29sZWFuIHNldEZvY3VzKTsNCi0Jdm9pZCBzZXRGaXJzdFBhZ2VTZWxlY3RlZChib29sZWFuIHNlbGVjdGVkKTsNCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL0lIeXBlcmxpbmtMaXN0ZW5lci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL0lIeXBlcmxpbmtMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjlhZjM0Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9JSHlwZXJsaW5rTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsNCi0NCi1wdWJsaWMgaW50ZXJmYWNlIElIeXBlcmxpbmtMaXN0ZW5lciB7DQotDQotcHVibGljIHZvaWQgbGlua0FjdGl2YXRlZChDb250cm9sIGxpbmtMYWJlbCk7DQotcHVibGljIHZvaWQgbGlua0VudGVyZWQoQ29udHJvbCBsaW5rTGFiZWwpOw0KLXB1YmxpYyB2b2lkIGxpbmtFeGl0ZWQoQ29udHJvbCBsaW5rTGFiZWwpOw0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvSUxheW91dEV4dGVuc2lvbi5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL0lMYXlvdXRFeHRlbnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZkOTQ3Yi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvSUxheW91dEV4dGVuc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogQ2xhc3NlcyB0aGF0IGV4dGVuZCBhYnN0cmFjdCBjbGFzcyBMYXlvdXQgYW5kIGltcGxlbWVudAotICogdGhpcyBpbnRlcmZhY2UgY2FuIHRha2UgcGFydCBpbiBsYXlvdXQgY29tcHV0YXRpb24gb2YKLSAqIHRoZSBIVE1MVGFibGVMYXlvdXQgbWFuYWdlci4gVGhlIHNhaWQgbGF5b3V0IHVzZXMKLSAqIGFsdGVybmF0aXZlIGFsZ29yaXRobSB0aGF0IGNvbXB1dGVzIGNvbHVtbnMgYmVmb3JlIHJvd3MuCi0gKiBJdCBhbGxvd3MgaXQgdG8gJ2Zsb3cnIHdyYXBwZWQgdGV4dCBwcm9wb3J0aW9uYWxseQotICogKGFzIGluIHRoZSBwb3B1bGFyIHdlYiBicm93c2VycykuIEN1c3RvbSBsYXlvdXQgbWFuYWdlcnMKLSAqIHRoYXQgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlIGFsbG93IHJlY3Vyc2l2ZSByZWZsb3cKLSAqIHRvIGJlIHBlcmZvcm1lZC4KLSAqLwotcHVibGljIGludGVyZmFjZSBJTGF5b3V0RXh0ZW5zaW9uIHsKLQlwdWJsaWMgaW50IGdldE1pbmltdW1XaWR0aChDb21wb3NpdGUgcGFyZW50LCBib29sZWFuIGNoYW5nZWQpOwotCXB1YmxpYyBpbnQgZ2V0TWF4aW11bVdpZHRoKENvbXBvc2l0ZSBwYXJlbnQsIGJvb2xlYW4gY2hhbmdlZCk7IAotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL05vVGFic1dvcmtib29rLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvTm9UYWJzV29ya2Jvb2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM1NTUwMS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvTm9UYWJzV29ya2Jvb2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMuaW50ZXJuYWw7DQotDQotaW1wb3J0IGphdmEudXRpbC4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7DQotDQotcHVibGljIGNsYXNzIE5vVGFic1dvcmtib29rIGltcGxlbWVudHMgSUZvcm1Xb3JrYm9vayB7DQotCXByaXZhdGUgVmVjdG9yIHBhZ2VzOw0KLQlwcml2YXRlIGJvb2xlYW4gZmlyc3RQYWdlU2VsZWN0ZWQgPSB0cnVlOw0KLQlwcml2YXRlIFBhZ2VCb29rIHBhZ2VCb29rOw0KLQlwcml2YXRlIFZlY3RvciBsaXN0ZW5lcnMgPSBuZXcgVmVjdG9yKCk7DQotCXByaXZhdGUgSUZvcm1QYWdlIGN1cnJlbnRQYWdlOw0KLQ0KLQlwdWJsaWMgTm9UYWJzV29ya2Jvb2soKSB7DQotCQlwYWdlcyA9IG5ldyBWZWN0b3IoKTsNCi0JfQ0KLQlwdWJsaWMgdm9pZCBhZGRGb3JtU2VsZWN0aW9uTGlzdGVuZXIoSUZvcm1TZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgew0KLQkJbGlzdGVuZXJzLmFkZEVsZW1lbnQobGlzdGVuZXIpOw0KLQl9DQotCXB1YmxpYyB2b2lkIGFkZFBhZ2UoSUZvcm1QYWdlIHBhZ2UpIHsNCi0JCXBhZ2VzLmFkZChwYWdlKTsNCi0NCi0JCWlmIChmaXJzdFBhZ2VTZWxlY3RlZCAmJiBjdXJyZW50UGFnZSA9PSBudWxsKQ0KLQkJCXNlbGVjdFBhZ2UocGFnZSwgdHJ1ZSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7DQotCQlwYWdlQm9vayA9IG5ldyBQYWdlQm9vayhwYXJlbnQsIFNXVC5OVUxMKTsNCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgZmlyZVNlbGVjdGlvbkNoYW5nZWQoSUZvcm1QYWdlIHBhZ2UsIGJvb2xlYW4gc2V0Rm9jdXMpIHsNCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGxpc3RlbmVycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsNCi0JCQlJRm9ybVNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gKElGb3JtU2VsZWN0aW9uTGlzdGVuZXIpIGl0ZXIubmV4dCgpOw0KLQkJCWxpc3RlbmVyLmZvcm1TZWxlY3RlZChwYWdlLCBzZXRGb2N1cyk7DQotCQl9DQotCX0NCi0JDQotCXB1YmxpYyBJRm9ybVBhZ2UgW10gZ2V0UGFnZXMoKSB7DQotCQlyZXR1cm4gKElGb3JtUGFnZVtdKXBhZ2VzLnRvQXJyYXkobmV3IElGb3JtUGFnZVtwYWdlcy5zaXplKCldKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgQ29udHJvbCBnZXRDb250cm9sKCkgew0KLQkJcmV0dXJuIHBhZ2VCb29rOw0KLQl9DQotDQotCXB1YmxpYyBJRm9ybVBhZ2UgZ2V0Q3VycmVudFBhZ2UoKSB7DQotCQlyZXR1cm4gY3VycmVudFBhZ2U7DQotCX0NCi0NCi0JcHVibGljIGJvb2xlYW4gaXNGaXJzdFBhZ2VTZWxlY3RlZCgpIHsNCi0JCXJldHVybiBmaXJzdFBhZ2VTZWxlY3RlZDsNCi0JfQ0KLQlwdWJsaWMgdm9pZCByZW1vdmVGb3JtU2VsZWN0aW9uTGlzdGVuZXIoSUZvcm1TZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgew0KLQkJbGlzdGVuZXJzLnJlbW92ZUVsZW1lbnQobGlzdGVuZXIpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHJlbW92ZVBhZ2UoSUZvcm1QYWdlIHBhZ2UpIHsNCi0JCWlmIChwYWdlcy5jb250YWlucyhwYWdlKSkgew0KLQkJCUNvbnRyb2wgYyA9IHBhZ2UuZ2V0Q29udHJvbCgpOw0KLQkJCWlmIChjIT1udWxsICYmICFjLmlzRGlzcG9zZWQoKSkNCi0JCQkJYy5kaXNwb3NlKCk7DQotCQkJcGFnZXMucmVtb3ZlKHBhZ2UpOw0KLQkJfQ0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHNlbGVjdFBhZ2UoZmluYWwgSUZvcm1QYWdlIHBhZ2UsIGZpbmFsIGJvb2xlYW4gc2V0Rm9jdXMpIHsNCi0JCWZpbmFsIElGb3JtUGFnZSBvbGRQYWdlID0gY3VycmVudFBhZ2U7DQotCQljdXJyZW50UGFnZSA9IHBhZ2U7DQotDQotCQlpZiAocGFnZUJvb2sgIT0gbnVsbCkgew0KLQ0KLQkJCS8vIEl0IG1heSB0YWtlIGEgd2hpbGUNCi0JCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShwYWdlQm9vay5nZXREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpIHsNCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgew0KLQkJCQkJc3dpdGNoUGFnZXMob2xkUGFnZSwgcGFnZSwgc2V0Rm9jdXMpOw0KLQkJCQl9DQotCQkJfSk7DQotCQl9DQotCX0NCi0NCi0JcHVibGljIHZvaWQgc2V0Rmlyc3RQYWdlU2VsZWN0ZWQoYm9vbGVhbiBuZXdGaXJzdFBhZ2VTZWxlY3RlZCkgew0KLQkJZmlyc3RQYWdlU2VsZWN0ZWQgPSBuZXdGaXJzdFBhZ2VTZWxlY3RlZDsNCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgc3dpdGNoUGFnZXMoSUZvcm1QYWdlIG9sZFBhZ2UsIElGb3JtUGFnZSBuZXdQYWdlLCBib29sZWFuIHNldEZvY3VzKSB7DQotCQlpZiAob2xkUGFnZSAhPSBudWxsICYmIG9sZFBhZ2UgIT0gbmV3UGFnZSkgew0KLQkJCW9sZFBhZ2UuYmVjb21lc0ludmlzaWJsZShuZXdQYWdlKTsNCi0JCX0NCi0JCWlmIChuZXdQYWdlLmdldENvbnRyb2woKSA9PSBudWxsKQ0KLQkJCW5ld1BhZ2UuY3JlYXRlQ29udHJvbChwYWdlQm9vayk7DQotCQlwYWdlQm9vay5zaG93UGFnZShuZXdQYWdlLmdldENvbnRyb2woKSk7DQotDQotCQluZXdQYWdlLmJlY29tZXNWaXNpYmxlKG9sZFBhZ2UpOw0KLQkJZmlyZVNlbGVjdGlvbkNoYW5nZWQobmV3UGFnZSwgc2V0Rm9jdXMpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9TY3JvbGxhYmxlU2VjdGlvbkZvcm0uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9TY3JvbGxhYmxlU2VjdGlvbkZvcm0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGFiZDFmZi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvU2Nyb2xsYWJsZVNlY3Rpb25Gb3JtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zLmludGVybmFsOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOw0KLQ0KLS8qKg0KLSAqIFRoaXMgdmVyc2lvbiBvZiB0aGUgc2VjdGlvbiBmb3JtIGFkZHMgc2Nyb2xsaW5nDQotICogY2FwYWJpbGl0eS4gSG93ZXZlciwgc2Nyb2xsaW5nIGNhbiBiZSBkaXNhYmxlZA0KLSAqIHVzaW5nICdzZXRTY3JvbGxhYmxlJyBtZXRob2QuIEZvciB0aGlzIHJlYXNvbiwNCi0gKiB0aGlzIGNsYXNzIGNhbiBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIFNlY3Rpb25Gb3JtLg0KLSAqLw0KLQ0KLXB1YmxpYyBjbGFzcyBTY3JvbGxhYmxlU2VjdGlvbkZvcm0gZXh0ZW5kcyBTZWN0aW9uRm9ybSB7DQotCXByaXZhdGUgQ29tcG9zaXRlIGNvbnRhaW5lcjsNCi0JcHJpdmF0ZSBib29sZWFuIHZlcnRpY2FsRml0Ow0KLQlwcml2YXRlIGJvb2xlYW4gc2Nyb2xsYWJsZSA9IHRydWU7DQotDQotCXB1YmxpYyBTY3JvbGxhYmxlU2VjdGlvbkZvcm0oKSB7DQotCX0NCi0JcHVibGljIENvbnRyb2wgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7DQotCQljb250YWluZXIgPSBjcmVhdGVQYXJlbnQocGFyZW50KTsNCi0JCUNvbnRyb2wgZm9ybUNvbnRyb2wgPSBzdXBlci5jcmVhdGVDb250cm9sKGNvbnRhaW5lcik7DQotCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgU2Nyb2xsZWRDb21wb3NpdGUpIHsNCi0JCQlTY3JvbGxlZENvbXBvc2l0ZSBzYyA9IChTY3JvbGxlZENvbXBvc2l0ZSkgY29udGFpbmVyOw0KLQkJCXNjLnNldENvbnRlbnQoZm9ybUNvbnRyb2wpOw0KLQkJfQ0KLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsNCi0JCWZvcm1Db250cm9sLnNldExheW91dERhdGEoZ2QpOw0KLQkJY29udGFpbmVyLnNldEJhY2tncm91bmQoZm9ybUNvbnRyb2wuZ2V0QmFja2dyb3VuZCgpKTsNCi0JCXJldHVybiBjb250YWluZXI7DQotCX0NCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVQYXJlbnQoQ29tcG9zaXRlIHBhcmVudCkgew0KLQkJQ29tcG9zaXRlIHJlc3VsdCA9IG51bGw7DQotCQlpZiAoaXNTY3JvbGxhYmxlKCkpIHsNCi0JCQlTY3JvbGxlZENvbXBvc2l0ZSBzY29tcCA9DQotCQkJCW5ldyBTY3JvbGxlZENvbXBvc2l0ZShwYXJlbnQsIFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7DQotCQkJaWYgKGlzVmVydGljYWxGaXQoKSkgew0KLQkJCQlzY29tcC5zZXRFeHBhbmRIb3Jpem9udGFsKHRydWUpOw0KLQkJCQlzY29tcC5zZXRFeHBhbmRWZXJ0aWNhbCh0cnVlKTsNCi0JCQl9DQotCQkJaW5pdGlhbGl6ZVNjcm9sbEJhcnMoc2NvbXApOw0KLQkJCXJlc3VsdCA9IHNjb21wOw0KLQkJfSBlbHNlIHsNCi0JCQlyZXN1bHQgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOw0KLQkJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsNCi0JCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsNCi0JCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOw0KLQkJCXJlc3VsdC5zZXRMYXlvdXQobGF5b3V0KTsNCi0JCX0NCi0JCXJlc3VsdC5zZXRNZW51KHBhcmVudC5nZXRNZW51KCkpOw0KLQkJcmV0dXJuIHJlc3VsdDsNCi0JfQ0KLQlwdWJsaWMgYm9vbGVhbiBpc1Njcm9sbGFibGUoKSB7DQotCQlyZXR1cm4gc2Nyb2xsYWJsZTsNCi0JfQ0KLQlwdWJsaWMgYm9vbGVhbiBpc1ZlcnRpY2FsRml0KCkgew0KLQkJcmV0dXJuIHZlcnRpY2FsRml0Ow0KLQl9DQotCXB1YmxpYyB2b2lkIHNldFNjcm9sbGFibGUoYm9vbGVhbiBuZXdTY3JvbGxhYmxlKSB7DQotCQlzY3JvbGxhYmxlID0gbmV3U2Nyb2xsYWJsZTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBzZXRWZXJ0aWNhbEZpdChib29sZWFuIG5ld1ZlcnRpY2FsRml0KSB7DQotCQl2ZXJ0aWNhbEZpdCA9IG5ld1ZlcnRpY2FsRml0Ow0KLQl9DQotDQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplU2Nyb2xsQmFycyhTY3JvbGxlZENvbXBvc2l0ZSBzY29tcCkgew0KLQkJU2Nyb2xsQmFyIGhiYXIgPSBzY29tcC5nZXRIb3Jpem9udGFsQmFyKCk7DQotCQlpZiAoaGJhciAhPSBudWxsKSB7DQotCQkJaGJhci5zZXRJbmNyZW1lbnQoSF9TQ1JPTExfSU5DUkVNRU5UKTsNCi0JCX0NCi0JCVNjcm9sbEJhciB2YmFyID0gc2NvbXAuZ2V0VmVydGljYWxCYXIoKTsNCi0JCWlmICh2YmFyICE9IG51bGwpIHsNCi0JCQl2YmFyLnNldEluY3JlbWVudChWX1NDUk9MTF9JTkNSRU1FTlQpOw0KLQkJfQ0KLQkJdXBkYXRlUGFnZUluY3JlbWVudChzY29tcCk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgew0KLQkJc3VwZXIudXBkYXRlKCk7DQotCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgU2Nyb2xsZWRDb21wb3NpdGUpIHsNCi0JCQl1cGRhdGVTY3JvbGxlZENvbXBvc2l0ZSgpOw0KLQkJfSBlbHNlIHsNCi0JCQljb250YWluZXIubGF5b3V0KHRydWUpOw0KLQkJfQ0KLQl9DQotCXB1YmxpYyB2b2lkIHVwZGF0ZVNjcm9sbEJhcnMoKSB7DQotCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgU2Nyb2xsZWRDb21wb3NpdGUpIHsNCi0JCQl1cGRhdGVTY3JvbGxlZENvbXBvc2l0ZSgpOw0KLQkJfQ0KLQl9DQotCXB1YmxpYyB2b2lkIHVwZGF0ZVNjcm9sbGVkQ29tcG9zaXRlKCkgew0KLQkJU2Nyb2xsZWRDb21wb3NpdGUgc2MgPSAoU2Nyb2xsZWRDb21wb3NpdGUpIGNvbnRhaW5lcjsNCi0JCUNvbnRyb2wgZm9ybUNvbnRyb2wgPSBnZXRDb250cm9sKCk7DQotCQlQb2ludCBuZXdTaXplID0gZm9ybUNvbnRyb2wuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsNCi0JCWZvcm1Db250cm9sLnNldFNpemUobmV3U2l6ZSk7DQotCQlzYy5zZXRNaW5TaXplKG5ld1NpemUpOw0KLQkJdXBkYXRlUGFnZUluY3JlbWVudChzYyk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL1NlY3Rpb25DaGFuZ2VNYW5hZ2VyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvU2VjdGlvbkNoYW5nZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTJkMzAxYi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvU2VjdGlvbkNoYW5nZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbDsNCi0NCi1pbXBvcnQgamF2YS51dGlsLio7DQotDQotcHVibGljIGNsYXNzIFNlY3Rpb25DaGFuZ2VNYW5hZ2VyIHsNCi0JSGFzaHRhYmxlIHNvdXJjZXMgPSBuZXcgSGFzaHRhYmxlKCk7DQotDQotCXB1YmxpYyBTZWN0aW9uQ2hhbmdlTWFuYWdlcigpIHsNCi0JCXN1cGVyKCk7DQotCX0NCi0JcHVibGljIHZvaWQgZGlzcGF0Y2hOb3RpZmljYXRpb24oDQotCQlGb3JtU2VjdGlvbiBzb3VyY2UsDQotCQlpbnQgdHlwZSwNCi0JCU9iamVjdCBjaGFuZ2VPYmplY3QpIHsNCi0JCVZlY3RvciB0YXJnZXRzID0gKFZlY3Rvcikgc291cmNlcy5nZXQoc291cmNlKTsNCi0JCWlmICh0YXJnZXRzICE9IG51bGwpIHsNCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0YXJnZXRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgew0KLQkJCQlGb3JtU2VjdGlvbiBzZWN0aW9uID0gKEZvcm1TZWN0aW9uKSBpdGVyLm5leHQoKTsNCi0JCQkJc2VjdGlvbi5zZWN0aW9uQ2hhbmdlZChzb3VyY2UsIHR5cGUsIGNoYW5nZU9iamVjdCk7DQotCQkJfQ0KLQkJfQ0KLQl9DQotCXB1YmxpYyB2b2lkIGxpbmtTZWN0aW9ucyhGb3JtU2VjdGlvbiBzb3VyY2UsIEZvcm1TZWN0aW9uIHRhcmdldCkgew0KLQkJc291cmNlLnNldE1hbmFnZXIodGhpcyk7DQotCQlWZWN0b3IgdGFyZ2V0cyA9IG51bGw7DQotDQotCQl0YXJnZXRzID0gKFZlY3Rvcikgc291cmNlcy5nZXQoc291cmNlKTsNCi0JCWlmICh0YXJnZXRzID09IG51bGwpIHsNCi0JCQl0YXJnZXRzID0gbmV3IFZlY3RvcigpOw0KLQkJCXNvdXJjZXMucHV0KHNvdXJjZSwgdGFyZ2V0cyk7DQotCQl9DQotCQl0YXJnZXRzLmFkZEVsZW1lbnQodGFyZ2V0KTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvU2VjdGlvbkZvcm0uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9TZWN0aW9uRm9ybS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTI4YjZjLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9TZWN0aW9uRm9ybS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudDsNCi0NCi0vKioNCi0gKiBUaGlzIGZvcm0gaW1wbGVtZW50YXRpb24gYXNzdW1lcyB0aGF0IGl0IGNvbnRhaW5zDQotICogZm9ybSBzZWN0aW9ucyBhbmQgdGhhdCB0aGV5IGZpbGwgdXAgdGhlIHNjcmVlbi4NCi0gKiBUeXBpY2FsbHksIHRoZSBmb3JtIGNsaWVudCB3aWxsIHVzZSB1cCB0aGUgZW50aXJlDQotICogcGFyZW50IGFyZWEgYmVsb3cgdGhlIGhlYWRpbmcuIFNlY3Rpb25zIG11c3QNCi0gKiBiZSBhYmxlIHRvIHJldHVybiB0aGVpciBwcmVmZXJyZWQgc2l6ZSBpbiBib3RoDQotICogZGltZW5zaW9ucy4gSWYgdGhleSBjb250YWluIHdyYXBwYWJsZSB0ZXh0LA0KLSAqIFdlYkZvcm0gc2hvdWxkIGJlIHVzZWQgaW5zdGVhZC4NCi0gKi8NCi0NCi1wdWJsaWMgY2xhc3MgU2VjdGlvbkZvcm0gZXh0ZW5kcyBBYnN0cmFjdFNlY3Rpb25Gb3JtIGltcGxlbWVudHMgUGFpbnRMaXN0ZW5lciB7DQotCXByaXZhdGUgQ29tcG9zaXRlIGNvbnRyb2w7DQotCXByaXZhdGUgaW50IFRJVExFX0hNQVJHSU4gPSAxMDsNCi0JcHJpdmF0ZSBpbnQgVElUTEVfVk1BUkdJTiA9IDU7DQotDQotCWNsYXNzIEZvcm1MYXlvdXQgZXh0ZW5kcyBMYXlvdXQgew0KLQkJcHJvdGVjdGVkIFBvaW50IGNvbXB1dGVTaXplKA0KLQkJCUNvbXBvc2l0ZSBjb21wb3NpdGUsDQotCQkJaW50IHdIaW50LA0KLQkJCWludCBoSGludCwNCi0JCQlib29sZWFuIGZsdXNoQ2FjaGUpIHsNCi0JCQlpZiAod0hpbnQgIT0gU1dULkRFRkFVTFQgJiYgaEhpbnQgIT0gU1dULkRFRkFVTFQpDQotCQkJCXJldHVybiBuZXcgUG9pbnQod0hpbnQsIGhIaW50KTsNCi0JCQlDb250cm9sIGNsaWVudCA9IGNvbXBvc2l0ZS5nZXRDaGlsZHJlbigpWzBdOw0KLQkJCVBvaW50IGNzaXplID0gY2xpZW50LmNvbXB1dGVTaXplKHdpZHRoSGludCwgaGVpZ2h0SGludCwgZmx1c2hDYWNoZSk7DQotCQkJaWYgKGhlYWRpbmdWaXNpYmxlKQ0KLQkJCQljc2l6ZS55ICs9IGdldFRpdGxlSGVpZ2h0KCk7DQotCQkJcmV0dXJuIGNzaXplOw0KLQkJfQ0KLQkJcHJvdGVjdGVkIHZvaWQgbGF5b3V0KENvbXBvc2l0ZSBjb21wb3NpdGUsIGJvb2xlYW4gZmx1c2hDYWNoZSkgew0KLQkJCVJlY3RhbmdsZSBjbGllbnRBcmVhID0gY29tcG9zaXRlLmdldENsaWVudEFyZWEoKTsNCi0JCQlDb250cm9sIGNsaWVudCA9IGNvbXBvc2l0ZS5nZXRDaGlsZHJlbigpWzBdOw0KLQkJCWlmIChjbGllbnQgIT0gbnVsbCAmJiAhY2xpZW50LmlzRGlzcG9zZWQoKSkgew0KLQkJCQlpbnQgdGhlaWdodCA9IGhlYWRpbmdWaXNpYmxlID8gZ2V0VGl0bGVIZWlnaHQoKSA6IDA7DQotCQkJCWNsaWVudC5zZXRCb3VuZHMoDQotCQkJCQljbGllbnRBcmVhLngsDQotCQkJCQljbGllbnRBcmVhLnkgKyB0aGVpZ2h0LA0KLQkJCQkJY2xpZW50QXJlYS53aWR0aCwNCi0JCQkJCWNsaWVudEFyZWEuaGVpZ2h0IC0gdGhlaWdodCk7DQotCQkJfQ0KLQkJfQ0KLQl9DQotCXByaXZhdGUgaW50IHdpZHRoSGludCA9IFNXVC5ERUZBVUxUOw0KLQlwcml2YXRlIGludCBoZWlnaHRIaW50ID0gU1dULkRFRkFVTFQ7DQotDQotCXB1YmxpYyBTZWN0aW9uRm9ybSgpIHsNCi0JfQ0KLQ0KLQlwdWJsaWMgQ29udHJvbCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsNCi0JCUNvbXBvc2l0ZSBjYW52YXMgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOw0KLQkJY2FudmFzLnNldEJhY2tncm91bmQoZmFjdG9yeS5nZXRCYWNrZ3JvdW5kQ29sb3IoKSk7DQotCQljYW52YXMuc2V0Rm9yZWdyb3VuZChmYWN0b3J5LmdldEZvcmVncm91bmRDb2xvcigpKTsNCi0JCWNhbnZhcy5hZGRQYWludExpc3RlbmVyKHRoaXMpOw0KLQkJY2FudmFzLnNldExheW91dChuZXcgRm9ybUxheW91dCgpKTsNCi0JCWNhbnZhcy5zZXRNZW51KHBhcmVudC5nZXRNZW51KCkpOw0KLQkJQ29tcG9zaXRlIGZvcm1QYXJlbnQgPSBmYWN0b3J5LmNyZWF0ZUNvbXBvc2l0ZShjYW52YXMpOw0KLQkJY3JlYXRlRm9ybUNsaWVudChmb3JtUGFyZW50KTsNCi0JCXRoaXMuY29udHJvbCA9IGNhbnZhczsNCi0JCS8vY2FudmFzLnNldEZvY3VzKCk7DQotCQlyZXR1cm4gY2FudmFzOw0KLQl9DQotDQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUZvcm1DbGllbnQoQ29tcG9zaXRlIHBhcmVudCkgew0KLQkJZmFjdG9yeS5jcmVhdGVDb21wb3NpdGUocGFyZW50KTsNCi0JfQ0KLQ0KLQlwdWJsaWMgQ29udHJvbCBnZXRDb250cm9sKCkgew0KLQkJcmV0dXJuIGNvbnRyb2w7DQotCX0NCi0NCi0JcHJpdmF0ZSBpbnQgZ2V0VGl0bGVIZWlnaHQoKSB7DQotCQlpbnQgaW1hZ2VIZWlnaHQgPSAwOw0KLQkJaWYgKGhlYWRpbmdJbWFnZSAhPSBudWxsDQotCQkJJiYgU1dULmdldFBsYXRmb3JtKCkuZXF1YWxzKCJtb3RpZiIpID09IGZhbHNlKSB7DQotCQkJaW1hZ2VIZWlnaHQgPSBoZWFkaW5nSW1hZ2UuZ2V0Qm91bmRzKCkuaGVpZ2h0Ow0KLQkJfQ0KLQkJR0MgZ2MgPSBuZXcgR0MoY29udHJvbCk7DQotCQlnYy5zZXRGb250KHRpdGxlRm9udCk7DQotCQlGb250TWV0cmljcyBmbSA9IGdjLmdldEZvbnRNZXRyaWNzKCk7DQotCQlpbnQgZm9udEhlaWdodCA9IGZtLmdldEhlaWdodCgpOw0KLQkJZ2MuZGlzcG9zZSgpOw0KLQ0KLQkJaW50IGhlaWdodCA9IGZvbnRIZWlnaHQgKyBUSVRMRV9WTUFSR0lOICsgVElUTEVfVk1BUkdJTjsNCi0JCXJldHVybiBNYXRoLm1heChoZWlnaHQsIGltYWdlSGVpZ2h0KTsNCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgcGFpbnQoQ29udHJvbCBmb3JtLCBHQyBnYykgew0KLQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGZvcm0uZ2V0Qm91bmRzKCk7DQotCQlpbnQgaGVpZ2h0ID0gZ2V0VGl0bGVIZWlnaHQoKTsNCi0JCWlmIChoZWFkaW5nSW1hZ2UgIT0gbnVsbCkgew0KLQkJCVJlY3RhbmdsZSBpbWFnZUJvdW5kcyA9IGhlYWRpbmdJbWFnZS5nZXRCb3VuZHMoKTsNCi0JCQlpbnQgeCA9IGJvdW5kcy53aWR0aCAtIGltYWdlQm91bmRzLndpZHRoOw0KLQkJCWludCB5ID0gMDsNCi0JCQkvL3ggPSBNYXRoLm1heCh4LCAwKTsNCi0JCQl4ID0gMDsNCi0JCQlpZiAoaGVhZGluZ0JhY2tncm91bmQgIT0gbnVsbCkgew0KLQkJCQlnYy5zZXRCYWNrZ3JvdW5kKGhlYWRpbmdCYWNrZ3JvdW5kKTsNCi0JCQkJZ2MuZmlsbFJlY3RhbmdsZSgwLCAwLCBib3VuZHMud2lkdGgsIGhlaWdodCk7DQotCQkJfQ0KLQkJCWlmIChTV1QuZ2V0UGxhdGZvcm0oKS5lcXVhbHMoIm1vdGlmIikgPT0gZmFsc2UpIHsNCi0JCQkJZ2MuZHJhd0ltYWdlKGhlYWRpbmdJbWFnZSwgeCwgeSk7DQotCQkJfQ0KLQkJCWlmIChoZWFkaW5nRm9yZWdyb3VuZCAhPSBudWxsKQ0KLQkJCQlnYy5zZXRGb3JlZ3JvdW5kKGhlYWRpbmdGb3JlZ3JvdW5kKTsNCi0JCQllbHNlDQotCQkJCWdjLnNldEZvcmVncm91bmQoZmFjdG9yeS5nZXRGb3JlZ3JvdW5kQ29sb3IoKSk7DQotCQkJZ2Muc2V0Rm9udCh0aXRsZUZvbnQpOw0KLQkJCWdjLmRyYXdUZXh0KGdldEhlYWRpbmdUZXh0KCksIFRJVExFX0hNQVJHSU4sIFRJVExFX1ZNQVJHSU4sIHRydWUpOw0KLQkJfSBlbHNlIHsNCi0JCQlnYy5zZXRGb250KHRpdGxlRm9udCk7DQotCQkJZ2Muc2V0QmFja2dyb3VuZChmYWN0b3J5LmdldENvbG9yKEZvcm1XaWRnZXRGYWN0b3J5LkRFRkFVTFRfSEVBREVSX0NPTE9SKSk7DQotCQkJLy9nYy5maWxsUmVjdGFuZ2xlKFRJVExFX0hNQVJHSU4sIFRJVExFX1ZNQVJHSU4sIGJvdW5kcy53aWR0aC1USVRMRV9ITUFSR0lOKjIsIGhlaWdodC1USVRMRV9WTUFSR0lOKjIpOw0KLQkJCWdjLnNldEZvcmVncm91bmQoZmFjdG9yeS5nZXRGb3JlZ3JvdW5kQ29sb3IoKSk7DQotCQkJZ2MuZHJhd1RleHQoZ2V0SGVhZGluZ1RleHQoKSwgVElUTEVfSE1BUkdJTiwgVElUTEVfVk1BUkdJTiwgdHJ1ZSk7DQotCQl9DQotCX0NCi0NCi0JcHVibGljIGZpbmFsIHZvaWQgcGFpbnRDb250cm9sKFBhaW50RXZlbnQgZXZlbnQpIHsNCi0JCWlmICghaGVhZGluZ1Zpc2libGUpDQotCQkJcmV0dXJuOw0KLQkJR0MgZ2MgPSBldmVudC5nYzsNCi0JCUNvbnRyb2wgZm9ybSA9IChDb250cm9sKSBldmVudC53aWRnZXQ7DQotCQlwYWludChmb3JtLCBnYyk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgc2V0SGVhZGluZ1Zpc2libGUoYm9vbGVhbiBuZXdIZWFkaW5nVmlzaWJsZSkgew0KLQkJc3VwZXIuc2V0SGVhZGluZ1Zpc2libGUobmV3SGVhZGluZ1Zpc2libGUpOw0KLQkJaWYgKGNvbnRyb2wgIT0gbnVsbCkNCi0JCQljb250cm9sLmxheW91dCh0cnVlKTsNCi0JfQ0KLQlwdWJsaWMgdm9pZCBzZXRIZWFkaW5nVGV4dChTdHJpbmcgaGVhZGluZ1RleHQpIHsNCi0JCXN1cGVyLnNldEhlYWRpbmdUZXh0KGhlYWRpbmdUZXh0KTsNCi0JCWlmIChjb250cm9sICE9IG51bGwpIHsNCi0JCQljb250cm9sLmxheW91dCh0cnVlKTsNCi0JCQljb250cm9sLnJlZHJhdygpOw0KLQkJfQ0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsNCi0JCXRpdGxlRm9udCA9IEpGYWNlUmVzb3VyY2VzLmdldEhlYWRlckZvbnQoKTsNCi0JCWlmIChjb250cm9sICE9IG51bGwgJiYgIWNvbnRyb2wuaXNEaXNwb3NlZCgpKSB7DQotCQkJY29udHJvbC5sYXlvdXQodHJ1ZSk7DQotCQkJY29udHJvbC5yZWRyYXcoKTsNCi0JCX0NCi0JfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvU2VsZWN0YWJsZUNvbnRyb2wuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9TZWxlY3RhYmxlQ29udHJvbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDc5MTMzLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9TZWxlY3RhYmxlQ29udHJvbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbDsNCi0NCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsNCi0NCi0vKioNCi0gKiBGb3JtVGV4dCBpcyBhIHdpbmRvd2xlc3MgY29udHJvbCB0aGF0DQotICogZHJhd3MgdGV4dCBpbiB0aGUgcHJvdmlkZWQgY29udGV4dC4NCi0gKi8NCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2VsZWN0YWJsZUNvbnRyb2wgZXh0ZW5kcyBDYW52YXMgew0KLQlwcml2YXRlIGJvb2xlYW4gaGFzRm9jdXM7DQotDQotCXB1YmxpYyBTZWxlY3RhYmxlQ29udHJvbChDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsNCi0JCXN1cGVyKHBhcmVudCwgc3R5bGUpOw0KLQkJYWRkUGFpbnRMaXN0ZW5lcihuZXcgUGFpbnRMaXN0ZW5lcigpIHsNCi0JCQlwdWJsaWMgdm9pZCBwYWludENvbnRyb2woUGFpbnRFdmVudCBlKSB7DQotCQkJCXBhaW50KGUpOw0KLQkJCX0NCi0JCX0pOw0KLQkJYWRkTW91c2VMaXN0ZW5lcihuZXcgTW91c2VBZGFwdGVyICgpIHsNCi0JCQlwdWJsaWMgdm9pZCBtb3VzZVVwKE1vdXNlRXZlbnQgZSkgew0KLQkJCQlub3RpZnlMaXN0ZW5lcnMoU1dULlNlbGVjdGlvbik7DQotCQkJfQ0KLQkJfSk7DQotCQlhZGRLZXlMaXN0ZW5lcihuZXcgS2V5QWRhcHRlcigpIHsNCi0JCQlwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGUpIHsNCi0JCQkJaWYgKGUuY2hhcmFjdGVyID09ICdccicpIHsNCi0JCQkJCS8vIEFjdGl2YXRpb24NCi0JCQkJCW5vdGlmeUxpc3RlbmVycyhTV1QuU2VsZWN0aW9uKTsNCi0JCQkJfQ0KLQkJCX0NCi0JCX0pOw0KLQkJYWRkTGlzdGVuZXIoU1dULlRyYXZlcnNlLCBuZXcgTGlzdGVuZXIgKCkgew0KLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsNCi0JCQkJaWYgKGUuZGV0YWlsICE9IFNXVC5UUkFWRVJTRV9SRVRVUk4pDQotCQkJCQllLmRvaXQgPSB0cnVlOw0KLQkJCX0NCi0JCX0pOw0KLQkJYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNMaXN0ZW5lcigpIHsNCi0JCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsNCi0JCQkJaWYgKCFoYXNGb2N1cykgew0KLQkJCQkgICBoYXNGb2N1cz10cnVlOw0KLQkJCQkgICByZWRyYXcoKTsNCi0JCQkJfQ0KLQkJCX0NCi0JCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7DQotCQkJCWlmIChoYXNGb2N1cykgew0KLQkJCQkJaGFzRm9jdXM9ZmFsc2U7DQotCQkJCQlyZWRyYXcoKTsNCi0JCQkJfQ0KLQkJCX0NCi0JCX0pOw0KLQl9DQotDQotCXByb3RlY3RlZCB2b2lkIHBhaW50KFBhaW50RXZlbnQgZSkgew0KLQkJR0MgZ2MgPSBlLmdjOw0KLQkJUG9pbnQgc2l6ZSA9IGdldFNpemUoKTsNCi0JICAgCWdjLnNldEZvbnQoZ2V0Rm9udCgpKTsNCi0JICAgCXBhaW50KGdjKTsNCi0JCWlmIChoYXNGb2N1cykgew0KLQkgICAJCWdjLnNldEZvcmVncm91bmQoZ2V0Rm9yZWdyb3VuZCgpKTsNCi0JICAgCQlnYy5kcmF3Rm9jdXMoMCwgMCwgc2l6ZS54LCBzaXplLnkpOw0KLQkJfQ0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBwYWludChHQyBnYyk7DQotCQ0KLQlwcml2YXRlIHZvaWQgbm90aWZ5TGlzdGVuZXJzKGludCBldmVudFR5cGUpIHsNCi0JCUV2ZW50IGV2ZW50ID0gbmV3IEV2ZW50KCk7DQotCQlldmVudC50eXBlID0gZXZlbnRUeXBlOw0KLQkJZXZlbnQud2lkZ2V0ID0gdGhpczsNCi0JCW5vdGlmeUxpc3RlbmVycyhldmVudFR5cGUsIGV2ZW50KTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgYWRkU2VsZWN0aW9uTGlzdGVuZXIoU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsNCi0JCWNoZWNrV2lkZ2V0ICgpOw0KLQkJaWYgKGxpc3RlbmVyID09IG51bGwpIHJldHVybjsNCi0JCVR5cGVkTGlzdGVuZXIgdHlwZWRMaXN0ZW5lciA9IG5ldyBUeXBlZExpc3RlbmVyIChsaXN0ZW5lcik7DQotCQlhZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbix0eXBlZExpc3RlbmVyKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIoU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsNCi0JCWNoZWNrV2lkZ2V0ICgpOw0KLQkJaWYgKGxpc3RlbmVyID09IG51bGwpIHJldHVybjsNCi0JCXJlbW92ZUxpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBsaXN0ZW5lcik7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL1NlbGVjdGFibGVGb3JtTGFiZWwuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9TZWxlY3RhYmxlRm9ybUxhYmVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhNWQ1YzQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL1NlbGVjdGFibGVGb3JtTGFiZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMuaW50ZXJuYWw7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5Lio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7DQotDQotcHVibGljIGNsYXNzIFNlbGVjdGFibGVGb3JtTGFiZWwgZXh0ZW5kcyBGb3JtTGFiZWwgew0KLQlwcml2YXRlIGJvb2xlYW4gaGFzRm9jdXM7DQotDQotCXB1YmxpYyBib29sZWFuIGdldFNlbGVjdGlvbigpIHsNCi0JCXJldHVybiBoYXNGb2N1czsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIENvbnN0cnVjdG9yIGZvciBTZWxlY3RhYmxlRm9ybUxhYmVsDQotCSAqLw0KLQlwdWJsaWMgU2VsZWN0YWJsZUZvcm1MYWJlbChDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsNCi0JCXN1cGVyKHBhcmVudCwgc3R5bGUpOw0KLQkJYWRkS2V5TGlzdGVuZXIobmV3IEtleUFkYXB0ZXIoKSB7DQotCQkJcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBlKSB7DQotCQkJCWlmIChlLmNoYXJhY3RlciA9PSAnXHInKSB7DQotCQkJCQkvLyBBY3RpdmF0aW9uDQotCQkJCQlub3RpZnlMaXN0ZW5lcnMoU1dULkRlZmF1bHRTZWxlY3Rpb24pOw0KLQkJCQl9DQotCQkJfQ0KLQkJfSk7DQotCQlhZGRMaXN0ZW5lcihTV1QuVHJhdmVyc2UsIG5ldyBMaXN0ZW5lciAoKSB7DQotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgew0KLQkJCQlzd2l0Y2ggKGUuZGV0YWlsKSB7DQotCQkJCQljYXNlIFNXVC5UUkFWRVJTRV9QQUdFX05FWFQ6DQotCQkJCQljYXNlIFNXVC5UUkFWRVJTRV9QQUdFX1BSRVZJT1VTOg0KLQkJCQkJY2FzZSBTV1QuVFJBVkVSU0VfQVJST1dfTkVYVDoNCi0JCQkJCWNhc2UgU1dULlRSQVZFUlNFX0FSUk9XX1BSRVZJT1VTOg0KLQkJCQkJY2FzZSBTV1QuVFJBVkVSU0VfUkVUVVJOOg0KLQkJCQkJZS5kb2l0ID0gZmFsc2U7DQotCQkJCQlyZXR1cm47DQotCQkJCX0NCi0JCQkJZS5kb2l0ID0gdHJ1ZTsNCi0JCQl9DQotCQl9KTsNCi0JCWFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzTGlzdGVuZXIoKSB7DQotCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7DQotCQkJCWlmICghaGFzRm9jdXMpIHsNCi0JCQkJICAgaGFzRm9jdXM9dHJ1ZTsNCi0JCQkJICAgbm90aWZ5TGlzdGVuZXJzKFNXVC5TZWxlY3Rpb24pOw0KLQkJCQkgICByZWRyYXcoKTsNCi0JCQkJfQ0KLQkJCX0NCi0JCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7DQotCQkJCWlmIChoYXNGb2N1cykgew0KLQkJCQkJaGFzRm9jdXM9ZmFsc2U7DQotCQkJCQlub3RpZnlMaXN0ZW5lcnMoU1dULlNlbGVjdGlvbik7DQotCQkJCQlyZWRyYXcoKTsNCi0JCQkJfQ0KLQkJCX0NCi0JCX0pOw0KLQkJdGV4dE1hcmdpbldpZHRoID0gMTsNCi0JCXRleHRNYXJnaW5IZWlnaHQgPSAxOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0QWNjZXNzaWJsZSgpIHsNCi0JCUFjY2Vzc2libGUgYWNjZXNzaWJsZSA9IGdldEFjY2Vzc2libGUoKTsNCi0JCWFjY2Vzc2libGUuYWRkQWNjZXNzaWJsZUxpc3RlbmVyKG5ldyBBY2Nlc3NpYmxlQWRhcHRlcigpIHsNCi0JCQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7DQotCQkJCWUucmVzdWx0ID0gZ2V0VGV4dCgpOw0KLQkJCX0NCi0NCi0JCQlwdWJsaWMgdm9pZCBnZXRIZWxwKEFjY2Vzc2libGVFdmVudCBlKSB7DQotCQkJCWUucmVzdWx0ID0gZ2V0VG9vbFRpcFRleHQoKTsNCi0JCQl9DQotCQl9KTsNCi0NCi0JCWFjY2Vzc2libGUNCi0JCQkuYWRkQWNjZXNzaWJsZUNvbnRyb2xMaXN0ZW5lcihuZXcgQWNjZXNzaWJsZUNvbnRyb2xBZGFwdGVyKCkgew0KLQkJCXB1YmxpYyB2b2lkIGdldENoaWxkQXRQb2ludChBY2Nlc3NpYmxlQ29udHJvbEV2ZW50IGUpIHsNCi0JCQkJUG9pbnQgcHQgPSB0b0NvbnRyb2wobmV3IFBvaW50KGUueCwgZS55KSk7DQotCQkJCWUuY2hpbGRJRCA9DQotCQkJCQkoZ2V0Qm91bmRzKCkuY29udGFpbnMocHQpKQ0KLQkJCQkJCT8gQUNDLkNISUxESURfU0VMRg0KLQkJCQkJCTogQUNDLkNISUxESURfTk9ORTsNCi0JCQl9DQotDQotCQkJcHVibGljIHZvaWQgZ2V0TG9jYXRpb24oQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBlKSB7DQotCQkJCVJlY3RhbmdsZSBsb2NhdGlvbiA9IGdldEJvdW5kcygpOw0KLQkJCQlQb2ludCBwdCA9IHRvRGlzcGxheShuZXcgUG9pbnQobG9jYXRpb24ueCwgbG9jYXRpb24ueSkpOw0KLQkJCQllLnggPSBwdC54Ow0KLQkJCQllLnkgPSBwdC55Ow0KLQkJCQllLndpZHRoID0gbG9jYXRpb24ud2lkdGg7DQotCQkJCWUuaGVpZ2h0ID0gbG9jYXRpb24uaGVpZ2h0Ow0KLQkJCX0NCi0NCi0JCQlwdWJsaWMgdm9pZCBnZXRDaGlsZENvdW50KEFjY2Vzc2libGVDb250cm9sRXZlbnQgZSkgew0KLQkJCQllLmRldGFpbCA9IDA7DQotCQkJfQ0KLQ0KLQkJCXB1YmxpYyB2b2lkIGdldFJvbGUoQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBlKSB7DQotCQkJCWUuZGV0YWlsID0gQUNDLlJPTEVfUFVTSEJVVFRPTjsNCi0JCQl9DQotDQotCQkJcHVibGljIHZvaWQgZ2V0U3RhdGUoQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBlKSB7DQotCQkJCWUuZGV0YWlsID0gU2VsZWN0YWJsZUZvcm1MYWJlbC50aGlzLmdldFNlbGVjdGlvbigpP0FDQy5TVEFURV9TRUxFQ1RFRDpBQ0MuU1RBVEVfTk9STUFMOw0KLQkJCX0NCi0JCX0pOw0KLQl9DQotCQ0KLQlwcml2YXRlIHZvaWQgbm90aWZ5TGlzdGVuZXJzKGludCBldmVudFR5cGUpIHsNCi0JCUV2ZW50IGV2ZW50ID0gbmV3IEV2ZW50KCk7DQotCQlldmVudC50eXBlID0gZXZlbnRUeXBlOw0KLQkJZXZlbnQud2lkZ2V0ID0gdGhpczsNCi0JCW5vdGlmeUxpc3RlbmVycyhldmVudFR5cGUsIGV2ZW50KTsNCi0JfQ0KLQ0KLQlwcm90ZWN0ZWQgdm9pZCBwYWludChQYWludEV2ZW50IGUpIHsNCi0JCXN1cGVyLnBhaW50KGUpOw0KLQkgICAJaWYgKGhhc0ZvY3VzKSB7DQotCSAgIAkJR0MgZ2MgPSBlLmdjOw0KLQkgICAJCVBvaW50IHNpemUgPSBnZXRTaXplKCk7DQotCSAgIAkJZ2Muc2V0Rm9yZWdyb3VuZChnZXRGb3JlZ3JvdW5kKCkpOw0KLQkgICAJCWdjLmRyYXdGb2N1cygwLCAwLCBzaXplLngsIHNpemUueSk7DQotCQl9DQotCX0NCi0NCi0JcHVibGljIHZvaWQgYWRkU2VsZWN0aW9uTGlzdGVuZXIoU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsNCi0JCWNoZWNrV2lkZ2V0ICgpOw0KLQkJaWYgKGxpc3RlbmVyID09IG51bGwpIHJldHVybjsNCi0JCVR5cGVkTGlzdGVuZXIgdHlwZWRMaXN0ZW5lciA9IG5ldyBUeXBlZExpc3RlbmVyIChsaXN0ZW5lcik7DQotCQlhZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbix0eXBlZExpc3RlbmVyKTsNCi0JCWFkZExpc3RlbmVyIChTV1QuRGVmYXVsdFNlbGVjdGlvbix0eXBlZExpc3RlbmVyKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIoU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsNCi0JCWNoZWNrV2lkZ2V0ICgpOw0KLQkJaWYgKGxpc3RlbmVyID09IG51bGwpIHJldHVybjsNCi0JCXJlbW92ZUxpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBsaXN0ZW5lcik7DQotCQlyZW1vdmVMaXN0ZW5lciAoU1dULkRlZmF1bHRTZWxlY3Rpb24sIGxpc3RlbmVyKTsNCi0JfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvVGFibGVEYXRhLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvVGFibGVEYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkM2NmYzQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL1RhYmxlRGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zLmludGVybmFsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7DQotDQotLyoqDQotICogDQotICogQGF1dGhvciBkZWphbg0KLSAqDQotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvDQotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMNCi0gKi8NCi0NCi1wdWJsaWMgY2xhc3MgVGFibGVEYXRhIHsNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEVGVCA9IDE7DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENFTlRFUiA9IDI7DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJJR0hUID0gMzsNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVE9QID0gNDsNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUlERExFID0gNTsNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQk9UVE9NID0gNjsNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMTCA9IDc7DQotCXB1YmxpYyBpbnQgY29sc3Bhbj0xOw0KLQlwdWJsaWMgaW50IHJvd3NwYW49MTsNCi0JcHVibGljIGludCBhbGlnbiA9IExFRlQ7DQotCXB1YmxpYyBpbnQgdmFsaWduID0gVE9QOw0KLQlwdWJsaWMgaW50IGluZGVudCA9IDA7DQotCXB1YmxpYyBpbnQgbWF4V2lkdGggPSBTV1QuREVGQVVMVDsNCi0JcHVibGljIGludCBtYXhIZWlnaHQgPSBTV1QuREVGQVVMVDsNCi0JcHVibGljIGludCBoZWlnaHRIaW50ID0gU1dULkRFRkFVTFQ7DQotCXB1YmxpYyBib29sZWFuIGdyYWJIb3Jpem9udGFsPWZhbHNlOw0KLQkNCi0JLy9wcml2YXRlDQotCWludCBjaGlsZEluZGV4Ow0KLQlib29sZWFuIGlzSXRlbURhdGE9dHJ1ZTsgDQotCWludCBjb21wV2lkdGg7DQotCVBvaW50IGNvbXBTaXplOw0KLQkJDQotCXB1YmxpYyBUYWJsZURhdGEoKSB7DQotCX0NCi0JDQotCXB1YmxpYyBUYWJsZURhdGEoaW50IGFsaWduLCBpbnQgdmFsaWduKSB7DQotCQl0aGlzKGFsaWduLCB2YWxpZ24sIDEsIDEpOw0KLQl9DQotCQ0KLQlwdWJsaWMgVGFibGVEYXRhKGludCBhbGlnbiwgaW50IHZhbGlnbiwgaW50IHJvd3NwYW4sIGludCBjb2xzcGFuKSB7DQotCQl0aGlzLmFsaWduID0gYWxpZ247DQotCQl0aGlzLnZhbGlnbiA9IHZhbGlnbjsNCi0JCXRoaXMucm93c3BhbiA9IHJvd3NwYW47DQotCQl0aGlzLmNvbHNwYW4gPSBjb2xzcGFuOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9UYWJsZUxheW91dFRlc3QuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9UYWJsZUxheW91dFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE3ZTRlMi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvVGFibGVMYXlvdXRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zLmludGVybmFsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU3RhdHVzTGluZU1hbmFnZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU2Nyb2xsZWRDb21wb3NpdGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5GaWxsTGF5b3V0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LlJvd0xheW91dDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOw0KLQ0KLXB1YmxpYyBjbGFzcyBUYWJsZUxheW91dFRlc3Qgew0KLQ0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgew0KLSAgICAgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7DQotICAgICBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7DQotICAgICBzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7DQotICAgICBmaW5hbCBTY3JvbGxlZENvbXBvc2l0ZSBzYyA9IG5ldyBTY3JvbGxlZENvbXBvc2l0ZShzaGVsbCwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsNCi0gICAgLy8gc2Muc2V0QWx3YXlzU2hvd1Njcm9sbEJhcnModHJ1ZSk7DQotICAgICBzYy5zZXRCYWNrZ3JvdW5kKHNjLmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfV0hJVEUpKTsNCi0gICAgIGZpbmFsIENvbXBvc2l0ZSBjID0gbmV3IENvbXBvc2l0ZShzYywgU1dULk5PTkUpOw0KLSAgICAgLy9jLnNldEJhY2tncm91bmQoYy5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1JFRCkpOw0KLSAgICAgc2Muc2V0Q29udGVudChjKTsNCi0gICAgIHNjLmFkZExpc3RlbmVyIChTV1QuUmVzaXplLCAgbmV3IExpc3RlbmVyICgpIHsNCi0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7DQotCQkJUmVjdGFuZ2xlIHNzaXplID0gc2MuZ2V0Q2xpZW50QXJlYSgpOw0KLQkJCWludCBzd2lkdGggPSBzc2l6ZS53aWR0aDsNCi0JCQlIVE1MVGFibGVMYXlvdXQgbGF5b3V0ID0gKEhUTUxUYWJsZUxheW91dCljLmdldExheW91dCgpOw0KLQkJCVBvaW50IHNpemUgPSBsYXlvdXQuY29tcHV0ZVNpemUoYywgc3dpZHRoLCBTV1QuREVGQVVMVCwgdHJ1ZSk7DQotCQkJLy9pZiAoc2l6ZS54IDwgc3dpZHRoKSBzaXplLnggPSBzd2lkdGg7DQotCQkJUmVjdGFuZ2xlIHRyaW0gPSBjLmNvbXB1dGVUcmltKDAsIDAsIHNpemUueCwgc2l6ZS55KTsNCi0JCQlzaXplID0gbmV3IFBvaW50KHRyaW0ud2lkdGgsIHRyaW0uaGVpZ2h0KTsNCi0JCQkvKg0KLQkJCVBvaW50IHNpemUgPSBjLmNvbXB1dGVTaXplKHN3aWR0aCwgU1dULkRFRkFVTFQsIHRydWUpOw0KLQkJCSovDQotCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImluOiAiK3N3aWR0aCsiLCBvdXQ6ICIrc2l6ZS54KTsNCi0JCQljLnNldFNpemUoc2l6ZSk7DQotCQl9DQotCX0pOw0KLSAgICAgYy5zZXRCYWNrZ3JvdW5kKGMuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSElURSkpOw0KLSAgICAgSFRNTFRhYmxlTGF5b3V0IGxheW91dCA9IG5ldyBIVE1MVGFibGVMYXlvdXQoKTsNCi0gICAgIGxheW91dC5udW1Db2x1bW5zID0gMjsNCi0gICAgIC8vbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gMDsNCi0gICAgIGxheW91dC5sZWZ0TWFyZ2luID0gMDsNCi0gICAgIGxheW91dC5yaWdodE1hcmdpbiA9IDA7DQotICAgICBsYXlvdXQubWFrZUNvbHVtbnNFcXVhbFdpZHRoPWZhbHNlOw0KLSAgICAgLy9sYXlvdXQubWFyZ2luV2lkdGggPSBsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsNCi0gICAgIC8vbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gMDsNCi0gICAgIGMuc2V0TGF5b3V0KGxheW91dCk7DQotICAgICANCi0gICAgIExhYmVsIGxhYmVsOw0KLSAgICAgQnV0dG9uIGI7DQotICAgICBUYWJsZURhdGEgdGQ7DQotLyogICAgIA0KLSAgICAgbGFiZWwgPSBuZXcgTGFiZWwoYywgU1dULk5VTEwpOw0KLSAgICAgbGFiZWwuc2V0VGV4dCgiU2luZ2xlIGxpbmUxIik7DQotICAgICANCi0gICAgIC8vbGFiZWwgPSBuZXcgTGFiZWwoYywgU1dULldSQVApOw0KLSAgICAgVGV4dCB0ZXh0ID0gbmV3IFRleHQoYywgU1dULk1VTFRJIHwgU1dULldSQVApOw0KLSAgICAgdGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7DQotICAgICB0ZXh0LnNldFRleHQoIlRoaXMgaXMgYSBtdWNoIGxvbmdlciB0ZXh0IHRoYXQgSSB3YW50IHdyYXBwZWQsIisNCi0gICAgICIgYnV0IGRlcGVuZGluZyBvbiB0aGUgd2luZG93IHNpemUgaXQgY2FuIGJlIHJlbmRlcmVkIGNvbXBsZXRlbHkuIik7DQotICAgICANCi0gICAgIGIgPSBuZXcgQnV0dG9uKGMsIFNXVC5QVVNIKTsNCi0gICAgIGIuc2V0VGV4dCgiU2ltcGxlIGJ1dHRvbiIpOw0KLSAgICAgDQotICAgICBsYWJlbCA9IG5ldyBMYWJlbChjLCBTV1QuV1JBUCk7DQotICAgICBsYWJlbC5zZXRUZXh0KCJBbm90aGVyIHRleHQgdGhhdCBtYXkgb3IgbWF5IG5vdCBiZSB3cmFwcGVkIik7DQotDQotICAgICBsYWJlbCA9IG5ldyBMYWJlbChjLCBTV1QuTlVMTCk7DQotICAgICB0ZCA9IG5ldyBUYWJsZURhdGEoVGFibGVEYXRhLlJJR0hULCBUYWJsZURhdGEuQk9UVE9NKTsNCi0gICAgIGxhYmVsLnNldExheW91dERhdGEodGQpOw0KLSAgICAgbGFiZWwuc2V0VGV4dCgiRml4ZWQgbGFiZWwiKTsNCi0gICAgIA0KLSAgICAgQ29tcG9zaXRlIG5lc3RlZCA9IG5ldyBDb21wb3NpdGUoYywgU1dULk5VTEwpOw0KLSAgICAgbGF5b3V0ID0gbmV3IEhUTUxUYWJsZUxheW91dCgpOw0KLSAgICAgbGF5b3V0Lm51bUNvbHVtbnMgPSAyOw0KLSAgICAgbmVzdGVkLnNldExheW91dChsYXlvdXQpOw0KLSAgICAgYiA9IG5ldyBCdXR0b24obmVzdGVkLCBTV1QuUFVTSCk7DQotICAgICBiLnNldFRleHQoIkJ1dHRvbjIiKTsNCi0gICAgIGxhYmVsID0gbmV3IExhYmVsKG5lc3RlZCwgU1dULldSQVApOw0KLSAgICAgdGQgPSBuZXcgVGFibGVEYXRhKFRhYmxlRGF0YS5MRUZULCBUYWJsZURhdGEuTUlERExFKTsNCi0gICAgIGxhYmVsLnNldExheW91dERhdGEodGQpOw0KLSAgICAgbGFiZWwuc2V0VGV4dCgiU29tZSB0ZXh0IGluIHRoZSBuZXN0ZWQgbGFiZWwgdGhhdCBjYW4gYmUgd3JhcHBlZCIpOw0KLSovICAgICANCi0gICAgIGxhYmVsID0gbmV3IExhYmVsKGMsIFNXVC5OVUxMKTsNCi0gICAgIGxhYmVsLnNldFRleHQoIlRleHQgaW4gdGhlIGxlZnQgY29sdW1uIik7DQotICAgICANCi0gICAgIGIgPSBuZXcgQnV0dG9uKGMsIFNXVC5DSEVDSyk7DQotICAgICBiLnNldFRleHQoIkNoZWNrYm94IGluIHRoZSByaWdodCBjb2x1bW4iKTsNCi0NCi0gICAgIA0KLSAgICAgbGFiZWwgPSBuZXcgTGFiZWwoYywgU1dULldSQVApOw0KLSAgICAgbGFiZWwuc2V0VGV4dCgiVGhpcyBhc3NpZ25tZW50IHN0ZXAgaXMgdGhlbiByZXBlYXRlZCBmb3IgbmVzdGVkIHRhYmxlcyB1c2luZyB0aGUgbWluaW11bSBhbmQgbWF4aW11bSB3aWR0aHMgZGVyaXZlZCBmb3IgYWxsIHN1Y2ggdGFibGVzIGluIHRoZSBmaXJzdCBwYXNzLiBJbiB0aGlzIGNhc2UsIHRoZSB3aWR0aCBvZiB0aGUgcGFyZW50IHRhYmxlIGNlbGwgcGxheXMgdGhlIHJvbGUgb2YgdGhlIGN1cnJlbnQgd2luZG93IHNpemUgaW4gdGhlIGFib3ZlIGRlc2NyaXB0aW9uLiBUaGlzIHByb2Nlc3MgaXMgcmVwZWF0ZWQgcmVjdXJzaXZlbHkgZm9yIGFsbCBuZXN0ZWQgdGFibGVzLiBUaGUgdG9wbW9zdCB0YWJsZSBpcyB0aGVuIHJlbmRlcmVkIHVzaW5nIHRoZSBhc3NpZ25lZCB3aWR0aHMuIE5lc3RlZCB0YWJsZXMgYXJlIHN1YnNlcXVlbnRseSByZW5kZXJlZCBhcyBwYXJ0IG9mIHRoZSBwYXJlbnQgdGFibGUncyBjZWxsIGNvbnRlbnRzLiIpOw0KLSAgICAgdGQgPSBuZXcgVGFibGVEYXRhKCk7DQotICAgICB0ZC5jb2xzcGFuID0gMjsNCi0gICAgIHRkLmFsaWduID0gVGFibGVEYXRhLkZJTEw7DQotICAgICBsYWJlbC5zZXRMYXlvdXREYXRhKHRkKTsNCi0gICAgIA0KLSAgICAgRXhwYW5kYWJsZUdyb3VwIGV4cCA9IG5ldyBFeHBhbmRhYmxlR3JvdXAgKFNXVC5XUkFQKSB7DQotICAgICAJcHVibGljIHZvaWQgZmlsbEV4cGFuc2lvbihDb21wb3NpdGUgY29udGFpbmVyLCBGb3JtV2lkZ2V0RmFjdG9yeSBmYWN0b3J5KSB7DQotICAgICAJCUhUTUxUYWJsZUxheW91dCBsYXlvdXQgPSBuZXcgSFRNTFRhYmxlTGF5b3V0KCk7DQotICAgICAJCWNvbnRhaW5lci5zZXRMYXlvdXQobGF5b3V0KTsNCi0gICAgIAkJbGF5b3V0LmxlZnRNYXJnaW4gPSBsYXlvdXQucmlnaHRNYXJnaW4gPSAwOw0KLSAgICAgCQlCdXR0b24gYnV0dG9uID0gZmFjdG9yeS5jcmVhdGVCdXR0b24oY29udGFpbmVyLCBudWxsLCBTV1QuUFVTSCk7DQotICAgICAJCWJ1dHRvbi5zZXRUZXh0KCJCdXR0b24iKTsNCi0gICAgCX0NCi0gICAgIAlwdWJsaWMgdm9pZCBleHBhbmRlZCgpIHsNCi0gICAgIAkJYy5sYXlvdXQodHJ1ZSk7DQotICAgICAJCXVwZGF0ZVNpemUoc2MsIGMpOw0KLSAgICAgCX0NCi0gICAgIAlwdWJsaWMgdm9pZCBjb2xsYXBzZWQoKSB7DQotICAgICAJCWMubGF5b3V0KHRydWUpOw0KLSAgICAgCQl1cGRhdGVTaXplKHNjLCBjKTsNCi0gICAgIAl9DQotICAgICB9Ow0KLSAgICAgZXhwLnNldFRleHQoIkV4cGFuZGFibGUgU2VjdGlvbiIpOw0KLSAgICAgLy9leHAuc2V0RXhwYW5kYWJsZShmYWxzZSk7DQotICAgICBGb3JtV2lkZ2V0RmFjdG9yeSBmYWN0b3J5ID0gbmV3IEZvcm1XaWRnZXRGYWN0b3J5KCk7DQotICAgICBleHAuY3JlYXRlQ29udHJvbChjLCBmYWN0b3J5KTsNCi0gICAgIC8vZXhwLmdldENvbnRyb2woKS5zZXRCYWNrZ3JvdW5kKGxhYmVsLmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfR1JFRU4pKTsNCi0gICAgIHRkID0gbmV3IFRhYmxlRGF0YSgpOw0KLSAgICAgdGQuY29sc3BhbiA9IDI7DQotICAgICB0ZC5hbGlnbiA9IFRhYmxlRGF0YS5GSUxMOw0KLSAgICAgZXhwLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKHRkKTsNCi0gICAgIA0KLQkgU3RhdHVzTGluZU1hbmFnZXIgbWFuYWdlciA9IG5ldyBTdGF0dXNMaW5lTWFuYWdlcigpOw0KLSAgICAgLy9hZGRGb3JtRW5naW5lKGMsIGZhY3RvcnksIG1hbmFnZXIpOw0KLSAgICAgLy9hZGRGb3JtRW5naW5lKGMsIGZhY3RvcnksIG1hbmFnZXIpOw0KLSAgICAgLy9hZGRGb3JtRW5naW5lKGMsIGZhY3RvcnksIG1hbmFnZXIpOw0KLSAgICAgDQotICAgICBhZGRSb3coYyk7DQotIA0KLSAgICAgQ29udHJvbCBtY29udHJvbCA9IG1hbmFnZXIuY3JlYXRlQ29udHJvbChjKTsNCi0gICAgIHRkID0gbmV3IFRhYmxlRGF0YSgpOw0KLSAgICAgdGQuY29sc3BhbiA9IDI7DQotICAgICB0ZC5hbGlnbiA9IFRhYmxlRGF0YS5GSUxMOw0KLSAgICAgbWNvbnRyb2wuc2V0TGF5b3V0RGF0YSh0ZCk7DQotICAgICANCi0gICAgIGZhY3Rvcnkuc2V0SHlwZXJsaW5rVW5kZXJsaW5lTW9kZShIeXBlcmxpbmtIYW5kbGVyLlVOREVSTElORV9ST0xMT1ZFUik7DQotICAgICANCi0gICAgIFNlbGVjdGFibGVGb3JtTGFiZWwgZnQgPSBuZXcgU2VsZWN0YWJsZUZvcm1MYWJlbChjLCBTV1QuV1JBUCk7DQotICAgICBmdC5zZXRUZXh0KCJTb21lIHRleHQgaW4gdGhlIGZvcm0gdGV4dCB0aGF0IHNob3VsZCBhbHNvIHdyYXAiKTsNCi0gICAgIGZhY3RvcnkudHVybkludG9IeXBlcmxpbmsoZnQsIG5ldyBJSHlwZXJsaW5rTGlzdGVuZXIoKSB7DQotICAgICAJcHVibGljIHZvaWQgbGlua0VudGVyZWQoQ29udHJvbCBsaW5rKSB7DQotICAgICAJCVN5c3RlbS5vdXQucHJpbnRsbigiTGluayBlbnRlcmVkIik7DQotICAgICAJfQ0KLSAgICAgCXB1YmxpYyB2b2lkIGxpbmtFeGl0ZWQoQ29udHJvbCBsaW5rKSB7DQotICAgIAkJU3lzdGVtLm91dC5wcmludGxuKCJMaW5rIGV4aXRlZCIpOw0KLSAgICAgCX0NCi0gICAgIAlwdWJsaWMgdm9pZCBsaW5rQWN0aXZhdGVkKENvbnRyb2wgbGluaykgew0KLSAgICAgCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxpbmsgYWN0aXZhdGVkIik7DQotICAgICAJfQ0KLSAgICAgfSk7DQotDQotICAgICBmdCA9IG5ldyBTZWxlY3RhYmxlRm9ybUxhYmVsKGMsIFNXVC5XUkFQKTsNCi0gICAgIGZ0LnNldFRleHQoIlNvbWUgbW9yZSBmb3JtIHRleHQgaGVyZSIpOw0KLSAgICAgZmFjdG9yeS50dXJuSW50b0h5cGVybGluayhmdCwgbmV3IElIeXBlcmxpbmtMaXN0ZW5lcigpIHsNCi0gICAgIAlwdWJsaWMgdm9pZCBsaW5rRW50ZXJlZChDb250cm9sIGxpbmspIHsNCi0gICAgIAkJU3lzdGVtLm91dC5wcmludGxuKCJMaW5rIGVudGVyZWQiKTsNCi0gICAgIAl9DQotICAgICAJcHVibGljIHZvaWQgbGlua0V4aXRlZChDb250cm9sIGxpbmspIHsNCi0gICAgCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxpbmsgZXhpdGVkIik7DQotICAgICAJfQ0KLSAgICAgCXB1YmxpYyB2b2lkIGxpbmtBY3RpdmF0ZWQoQ29udHJvbCBsaW5rKSB7DQotICAgICAJCVN5c3RlbS5vdXQucHJpbnRsbigiTGluayBhY3RpdmF0ZWQiKTsNCi0gICAgIAl9DQotICAgICB9KTsNCi0gICANCi0gICAgIHNoZWxsLm9wZW4gKCk7DQotICAgICB3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsNCi0gICAgICAgICAgaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsNCi0gICAgIH0NCi0gICAgIGRpc3BsYXkuZGlzcG9zZSAoKTsNCi19DQotDQotLyoNCi0NCi1wdWJsaWMgc3RhdGljIHZvaWQgYWRkRm9ybUVuZ2luZShDb21wb3NpdGUgYywgRm9ybVdpZGdldEZhY3RvcnkgZmFjdG9yeSwgSVN0YXR1c0xpbmVNYW5hZ2VyIG1hbmFnZXIpIHsNCi0gICAgIG5ldyBMYWJlbChjLCBTV1QuTlVMTCk7DQotICAgICBSaWNoVGV4dCBodG1sID0gbmV3IFJpY2hUZXh0KGMsIFNXVC5XUkFQKTsNCi0gICAgIGh0bWwuc2V0SHlwZXJsaW5rU2V0dGluZ3MoZmFjdG9yeS5nZXRIeXBlcmxpbmtIYW5kbGVyKCkpOw0KLSAgICAgUmljaFRleHRIVFRQQWN0aW9uIGFjdGlvbiA9IG5ldyBSaWNoVGV4dEhUVFBBY3Rpb24obWFuYWdlcik7DQotICAgICBVUkwgaTFVUkwgPSBUYWJsZUxheW91dFRlc3QuY2xhc3MuZ2V0UmVzb3VyY2UoImltYWdlMS5naWYiKTsNCi0gICAgIEltYWdlRGVzY3JpcHRvciBpZDEgPSBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTChpMVVSTCk7DQotICAgICBodG1sLnJlZ2lzdGVyVGV4dE9iamVjdCgidXJsSGFuZGxlciIsIGFjdGlvbik7DQotICAgICBodG1sLnJlZ2lzdGVyVGV4dE9iamVjdCgiaW1hZ2UxIiwgaWQxLmNyZWF0ZUltYWdlKCkpOw0KLSAgICAgLy9odG1sLnNldEJhY2tncm91bmQoZmFjdG9yeS5nZXRCYWNrZ3JvdW5kQ29sb3IoKSk7DQotICAgICBodG1sLnNldEZvcmVncm91bmQoZmFjdG9yeS5nZXRGb3JlZ3JvdW5kQ29sb3IoKSk7DQotICAgICBJbnB1dFN0cmVhbSBpcyA9IFRhYmxlTGF5b3V0VGVzdC5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKCJpbmRleC54bWwiKTsNCi0gICAgIC8vaHRtbC5zZXRQYXJhZ3JhcGhzU2VwYXJhdGVkKGZhbHNlKTsNCi0gICAgIGh0bWwuc2V0Q29udGVudHMoaXMsIHRydWUpOw0KLSAgICAgVGFibGVEYXRhIHRkID0gbmV3IFRhYmxlRGF0YSgpOw0KLSAgICAgdGQuY29sc3BhbiA9IDE7DQotICAgICB0ZC5hbGlnbiA9IFRhYmxlRGF0YS5GSUxMOw0KLSAgICAgaHRtbC5zZXRMYXlvdXREYXRhKHRkKTsNCi19DQotKi8NCi0NCi1wdWJsaWMgc3RhdGljIHZvaWQgYWRkUm93KENvbXBvc2l0ZSBjKSB7DQotCUNvbXBvc2l0ZSByb3cgPSBuZXcgQ29tcG9zaXRlKGMsIFNXVC5XUkFQKTsNCi0JUm93TGF5b3V0IGxheW91dCA9IG5ldyBSb3dMYXlvdXQoKTsNCi0JbGF5b3V0LndyYXAgPSB0cnVlOw0KLQlyb3cuc2V0TGF5b3V0KGxheW91dCk7DQotCQ0KLQlmb3IgKGludCBpPTA7IGk8MTA7IGkrKykgew0KLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocm93LCBTV1QuUFVTSCk7DQotCQlidXR0b24uc2V0VGV4dCgiQnV0dG9uIHRoYXQgc2hvdWxkIGJlIHdyYXBwZWQiKTsNCi0JfQ0KLQlUYWJsZURhdGEgdGQgPSBuZXcgVGFibGVEYXRhKCk7DQotCXRkLmNvbHNwYW4gPSAyOw0KLQl0ZC5hbGlnbiA9IFRhYmxlRGF0YS5GSUxMOw0KLQl0ZC5ncmFiSG9yaXpvbnRhbCA9IHRydWU7DQotCXJvdy5zZXRMYXlvdXREYXRhKHRkKTsNCi19DQotDQotcHJpdmF0ZSBzdGF0aWMgdm9pZCB1cGRhdGVTaXplKFNjcm9sbGVkQ29tcG9zaXRlIHNjLCBDb21wb3NpdGUgYykgew0KLQlSZWN0YW5nbGUgc3NpemUgPSBzYy5nZXRDbGllbnRBcmVhKCk7DQotCWludCBzd2lkdGggPSBzc2l6ZS53aWR0aDsNCi0JSFRNTFRhYmxlTGF5b3V0IGxheW91dCA9IChIVE1MVGFibGVMYXlvdXQpYy5nZXRMYXlvdXQoKTsNCi0JUG9pbnQgc2l6ZSA9IGxheW91dC5jb21wdXRlU2l6ZShjLCBzd2lkdGgsIFNXVC5ERUZBVUxULCB0cnVlKTsNCi0JUmVjdGFuZ2xlIHRyaW0gPSBjLmNvbXB1dGVUcmltKDAsIDAsIHNpemUueCwgc2l6ZS55KTsNCi0Jc2l6ZSA9IG5ldyBQb2ludCh0cmltLndpZHRoLCB0cmltLmhlaWdodCk7DQotCWMuc2V0U2l6ZShzaXplKTsNCi19DQotDQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9Ub2dnbGVDb250cm9sLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvVG9nZ2xlQ29udHJvbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGExMjdlLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9Ub2dnbGVDb250cm9sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zLmludGVybmFsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7DQotDQotcHVibGljIGNsYXNzIFRvZ2dsZUNvbnRyb2wgZXh0ZW5kcyBTZWxlY3RhYmxlQ29udHJvbCB7DQotCXByaXZhdGUgYm9vbGVhbiBzZWxlY3Rpb247DQotCXByaXZhdGUgQ29sb3IgZGVjb3JhdGlvbkNvbG9yOw0KLQlwcml2YXRlIENvbG9yIGFjdGl2ZUNvbG9yOw0KLQlwcml2YXRlIEN1cnNvciBhY3RpdmVDdXJzb3I7DQotCXByaXZhdGUgYm9vbGVhbiBob3Zlcj1mYWxzZTsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IG1hcmdpbldpZHRoID0gMjsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IG1hcmdpbkhlaWdodCA9IDI7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBXSURUSCA9IDk7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBIRUlHSFQgPSA5Ow0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgW10gb2ZmUG9pbnRzID0geyAwLDIsIDgsMiwgNCw2IH07DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBbXSBvblBvaW50cyA9IHsgMiwgLTEsIDIsOCwgNiw0IH07CQ0KLQ0KLQlwdWJsaWMgVG9nZ2xlQ29udHJvbChDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsNCi0JCXN1cGVyKHBhcmVudCwgc3R5bGUpOw0KLQkJYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7DQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgew0KLQkJCQlzZWxlY3Rpb24gPSAhc2VsZWN0aW9uOw0KLQkJCQlyZWRyYXcoKTsNCi0JCQl9DQotCQl9KTsNCi0NCi0JCWFkZE1vdXNlVHJhY2tMaXN0ZW5lcihuZXcgTW91c2VUcmFja0FkYXB0ZXIoKSB7DQotCQkJcHVibGljIHZvaWQgbW91c2VFbnRlcihNb3VzZUV2ZW50IGUpIHsNCi0JCQkJaG92ZXIgPSB0cnVlOw0KLQkJCQlpZiAoYWN0aXZlQ3Vyc29yIT1udWxsKQ0KLQkJCQkgICBzZXRDdXJzb3IoYWN0aXZlQ3Vyc29yKTsNCi0JCQkJcmVkcmF3KCk7DQotCQkJfQ0KLQkJCXB1YmxpYyB2b2lkIG1vdXNlRXhpdChNb3VzZUV2ZW50IGUpIHsNCi0JCQkJaG92ZXIgPSBmYWxzZTsNCi0JCQkJaWYgKGFjdGl2ZUN1cnNvciE9bnVsbCkNCi0JCQkJICAgc2V0Q3Vyc29yKG51bGwpOw0KLQkJCQlyZWRyYXcoKTsNCi0JCQl9DQotCQl9KTsNCi0JCWluaXRBY2Nlc3NpYmxlKCk7DQotCX0NCi0Jdm9pZCBpbml0QWNjZXNzaWJsZSgpIHsNCi0JCWdldEFjY2Vzc2libGUoKS5hZGRBY2Nlc3NpYmxlTGlzdGVuZXIobmV3IEFjY2Vzc2libGVBZGFwdGVyKCkgew0KLQkJCXB1YmxpYyB2b2lkIGdldEhlbHAoQWNjZXNzaWJsZUV2ZW50IGUpIHsNCi0JCQkJZS5yZXN1bHQgPSBnZXRUb29sVGlwVGV4dCgpOw0KLQkJCX0NCi0JCX0pOw0KLQkJDQotCQlnZXRBY2Nlc3NpYmxlKCkuYWRkQWNjZXNzaWJsZUNvbnRyb2xMaXN0ZW5lcihuZXcgQWNjZXNzaWJsZUNvbnRyb2xBZGFwdGVyKCkgew0KLQkJCXB1YmxpYyB2b2lkIGdldENoaWxkQXRQb2ludChBY2Nlc3NpYmxlQ29udHJvbEV2ZW50IGUpIHsNCi0JCQkJUG9pbnQgdGVzdFBvaW50ID0gdG9Db250cm9sKG5ldyBQb2ludChlLngsIGUueSkpOw0KLQkJCQlpZiAoZ2V0Qm91bmRzKCkuY29udGFpbnModGVzdFBvaW50KSkgew0KLQkJCQkJZS5jaGlsZElEID0gQUNDLkNISUxESURfU0VMRjsNCi0JCQkJfQ0KLQkJCX0NCi0JCQ0KLQkJCXB1YmxpYyB2b2lkIGdldExvY2F0aW9uKEFjY2Vzc2libGVDb250cm9sRXZlbnQgZSkgew0KLQkJCQlSZWN0YW5nbGUgbG9jYXRpb24gPSBnZXRCb3VuZHMoKTsNCi0JCQkJUG9pbnQgcHQgPSB0b0Rpc3BsYXkobmV3IFBvaW50KGxvY2F0aW9uLngsIGxvY2F0aW9uLnkpKTsNCi0JCQkJZS54ID0gcHQueDsNCi0JCQkJZS55ID0gcHQueTsNCi0JCQkJZS53aWR0aCA9IGxvY2F0aW9uLndpZHRoOw0KLQkJCQllLmhlaWdodCA9IGxvY2F0aW9uLmhlaWdodDsNCi0JCQl9DQotCQkNCi0JCQlwdWJsaWMgdm9pZCBnZXRDaGlsZENvdW50KEFjY2Vzc2libGVDb250cm9sRXZlbnQgZSkgew0KLQkJCQllLmRldGFpbCA9IDA7DQotCQkJfQ0KLQkJDQotCQkJcHVibGljIHZvaWQgZ2V0Um9sZShBY2Nlc3NpYmxlQ29udHJvbEV2ZW50IGUpIHsNCi0JCQkJZS5kZXRhaWwgPSBBQ0MuUk9MRV9UUkVFOw0KLQkJCX0NCi0JCQ0KLQkJCXB1YmxpYyB2b2lkIGdldFN0YXRlKEFjY2Vzc2libGVDb250cm9sRXZlbnQgZSkgew0KLQkJCQllLmRldGFpbCA9IFRvZ2dsZUNvbnRyb2wudGhpcy5nZXRTZWxlY3Rpb24oKT9BQ0MuU1RBVEVfRVhQQU5ERUQ6QUNDLlNUQVRFX0NPTExBUFNFRDsNCi0JCQl9DQotDQotCQkJcHVibGljIHZvaWQgZ2V0VmFsdWUoQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBlKSB7DQotCQkJCWUucmVzdWx0ID0gVG9nZ2xlQ29udHJvbC50aGlzLmdldFNlbGVjdGlvbigpPyIxIjoiMCI7DQotCQkJfQ0KLQkJfSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHNldERlY29yYXRpb25Db2xvcihDb2xvciBkZWNvcmF0aW9uQ29sb3IpIHsNCi0JCXRoaXMuZGVjb3JhdGlvbkNvbG9yID0gZGVjb3JhdGlvbkNvbG9yOw0KLQl9DQotCQ0KLQlwdWJsaWMgQ29sb3IgZ2V0RGVjb3JhdGlvbkNvbG9yKCkgew0KLQkJcmV0dXJuIGRlY29yYXRpb25Db2xvcjsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlRGVjb3JhdGlvbkNvbG9yKENvbG9yIGFjdGl2ZUNvbG9yKSB7DQotCQl0aGlzLmFjdGl2ZUNvbG9yID0gYWN0aXZlQ29sb3I7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZUN1cnNvcihDdXJzb3IgYWN0aXZlQ3Vyc29yKSB7DQotCQl0aGlzLmFjdGl2ZUN1cnNvciA9IGFjdGl2ZUN1cnNvcjsNCi0JfQ0KLQkNCi0JcHVibGljIENvbG9yIGdldEFjdGl2ZURlY29yYXRpb25Db2xvcigpIHsNCi0JCXJldHVybiBhY3RpdmVDb2xvcjsNCi0JfQ0KLQkNCi0JcHVibGljIFBvaW50IGNvbXB1dGVTaXplKGludCB3SGludCwgaW50IGhIaW50LCBib29sZWFuIGNoYW5nZWQpIHsNCi0JCWludCB3aWR0aCwgaGVpZ2h0Ow0KLQkJDQotCQlpZiAod0hpbnQhPVNXVC5ERUZBVUxUKSB3aWR0aCA9IHdIaW50OyANCi0JCWVsc2UgDQotCQkgICB3aWR0aCA9IFdJRFRIICsgMiptYXJnaW5XaWR0aDsNCi0JCWlmIChoSGludCE9U1dULkRFRkFVTFQpIGhlaWdodCA9IGhIaW50Ow0KLQkJZWxzZSBoZWlnaHQgPSBIRUlHSFQgKyAyKm1hcmdpbkhlaWdodDsNCi0JCXJldHVybiBuZXcgUG9pbnQod2lkdGgsIGhlaWdodCk7DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBTZWxlY3RhYmxlQ29udHJvbCNwYWludChHQykNCi0JICovDQotCXByb3RlY3RlZCB2b2lkIHBhaW50KEdDIGdjKSB7DQotCQlpZiAoaG92ZXIgJiYgYWN0aXZlQ29sb3IhPW51bGwpDQotCQkJZ2Muc2V0QmFja2dyb3VuZChhY3RpdmVDb2xvcik7DQotCQllbHNlIGlmIChkZWNvcmF0aW9uQ29sb3IhPW51bGwpDQotCSAgIAkgICBnYy5zZXRCYWNrZ3JvdW5kKGRlY29yYXRpb25Db2xvcik7DQotCSAgIAllbHNlDQotCSAgIAkJCWdjLnNldEJhY2tncm91bmQoZ2V0Rm9yZWdyb3VuZCgpKTsNCi0JCWludCBbXSBkYXRhOw0KLQkJUG9pbnQgc2l6ZSA9IGdldFNpemUoKTsNCi0JCWludCB4ID0gKHNpemUueCAtIDkpLzI7DQotCQlpbnQgeSA9IChzaXplLnkgLSA5KS8yOw0KLQkJaWYgKHNlbGVjdGlvbikNCi0JCQlkYXRhID0gdHJhbnNsYXRlKG9uUG9pbnRzLCB4LCB5KTsNCi0JCWVsc2UgDQotCQkJZGF0YSA9IHRyYW5zbGF0ZShvZmZQb2ludHMsIHgsIHkpOw0KLQkJZ2MuZmlsbFBvbHlnb24oZGF0YSk7DQotCQlnYy5zZXRCYWNrZ3JvdW5kKGdldEJhY2tncm91bmQoKSk7DQotCX0NCi0JDQotCXByaXZhdGUgaW50IFtdIHRyYW5zbGF0ZShpbnQgW10gZGF0YSwgaW50IHgsIGludCB5KSB7DQotCQlpbnQgW10gdGFyZ2V0ID0gbmV3IGludCBbZGF0YS5sZW5ndGhdOw0KLQkJZm9yIChpbnQgaT0wOyBpPGRhdGEubGVuZ3RoOyBpKz0yKSB7DQotCQkJdGFyZ2V0W2ldID0gZGF0YVtpXSsgeDsNCi0JCX0NCi0JCWZvciAoaW50IGk9MTsgaTxkYXRhLmxlbmd0aDsgaSs9Mikgew0KLQkJCXRhcmdldFtpXSA9IGRhdGFbaV0reTsNCi0JCX0NCi0JCXJldHVybiB0YXJnZXQ7DQotCX0NCi0NCi0JcHVibGljIGJvb2xlYW4gZ2V0U2VsZWN0aW9uKCkgew0KLQkJcmV0dXJuIHNlbGVjdGlvbjsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKGJvb2xlYW4gc2VsZWN0aW9uKSB7DQotCQl0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvV2ViRm9ybS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL1dlYkZvcm0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU2Yzc2ZS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvV2ViRm9ybS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsNCi0NCi0vKioNCi0gKiBUaGlzIGZvcm0gaW1wbGVtZW50YXRpb24gYXNzdW1lcyB0aGF0IGl0IGNvbnRhaW5zDQotICogY2hpbGRyZW4gdGhhdCBkbyBub3QgaGF2ZSBpbmRlcGVuZGVudCBkaW1lbnNpb25zLg0KLSAqIEluIG90aGVyIHdvcmRzLCB0aGVzZSB3aWRnZXRzIGFyZSBub3QgY2FwYWJsZQ0KLSAqIG9mIGFuc3dlcmluZyB0aGVpciBwcmVmZXJyZWQgc2l6ZS4gSW5zdGVhZCwNCi0gKiBkZXNpcmVkIHdpZHRoIG11c3QgYmUgc3VwcGxpZWQgdG8gZ2V0IHRoZQ0KLSAqIHByZWZlcnJlZCBoZWlnaHQuIFRoZXNlIGZvcm1zIGFyZSBsYXllZCBvdXQNCi0gKiB0b3AgdG8gYm90dG9tLCBsZWZ0IHRvIHJpZ2h0IGFuZCB1c2UNCi0gKiBhIGxheW91dCBhbGdvcml0aG0gdmVyeSBzaW1pbGFyIHRvDQotICogSFRNTCB0YWJsZXMuIFNjcm9sbGluZyBpcyBub3Qgb3B0aW9uYWwNCi0gKiBmb3IgdGhpcyB0eXBlIG9mIHByZXNlbnRhdGlvbiAtIA0KLSAqIHNjcm9sbCBiYXJzIHdpbGwgc2hvdyB1cCB3aGVuIG5lZWRlZC4NCi0gKi8NCi0NCi1wdWJsaWMgY2xhc3MgV2ViRm9ybSBleHRlbmRzIEFic3RyYWN0U2VjdGlvbkZvcm0gew0KLQlwcm90ZWN0ZWQgU2Nyb2xsZWRDb21wb3NpdGUgc2Nyb2xsQ29tcG9zaXRlOw0KLQlwcml2YXRlIENvbXBvc2l0ZSBjb250cm9sOw0KLQlwcml2YXRlIENvbXBvc2l0ZSBjbGllbnQ7DQotCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBITUFSR0lOID0gNTsNCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IFZNQVJHSU4gPSA1Ow0KLQlwcml2YXRlIEltYWdlIGhlYWRpbmdVbmRlcmxpbmVJbWFnZTsNCi0NCi0JY2xhc3MgV2ViRm9ybUxheW91dCBleHRlbmRzIExheW91dCB7DQotDQotCQlwcm90ZWN0ZWQgdm9pZCBsYXlvdXQoQ29tcG9zaXRlIHBhcmVudCwgYm9vbGVhbiBjaGFuZ2VkKSB7DQotCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IHBhcmVudC5nZXRDbGllbnRBcmVhKCk7DQotCQkJaW50IHggPSAwOw0KLQkJCWludCB5ID0gMDsNCi0JCQlpZiAoaXNIZWFkaW5nVmlzaWJsZSgpKSB7DQotCQkJCXkgPSBnZXRIZWFkaW5nSGVpZ2h0KHBhcmVudCk7DQotCQkJfQ0KLQkJCVBvaW50IGNzaXplOw0KLQ0KLQkJCUxheW91dCBsYXlvdXQgPSBjbGllbnQuZ2V0TGF5b3V0KCk7DQotCQkJaWYgKGxheW91dCAhPSBudWxsICYmIGxheW91dCBpbnN0YW5jZW9mIEhUTUxUYWJsZUxheW91dCkgew0KLQkJCQlIVE1MVGFibGVMYXlvdXQgaGxheW91dCA9IChIVE1MVGFibGVMYXlvdXQpIGxheW91dDsNCi0JCQkJY3NpemUgPSBobGF5b3V0LmNvbXB1dGVTaXplKGNsaWVudCwgYm91bmRzLndpZHRoLCBTV1QuREVGQVVMVCwgdHJ1ZSk7DQotCQkJCWlmIChjc2l6ZS54IDwgYm91bmRzLndpZHRoKQ0KLQkJCQkJY3NpemUueCA9IGJvdW5kcy53aWR0aDsNCi0JCQkJUmVjdGFuZ2xlIHRyaW0gPSBjb250cm9sLmNvbXB1dGVUcmltKDAsIDAsIGNzaXplLngsIGNzaXplLnkpOw0KLQkJCQljc2l6ZSA9IG5ldyBQb2ludCh0cmltLndpZHRoLCB0cmltLmhlaWdodCk7DQotCQkJfSBlbHNlIHsNCi0JCQkJY3NpemUgPSBjbGllbnQuY29tcHV0ZVNpemUoYm91bmRzLndpZHRoLCBTV1QuREVGQVVMVCwgY2hhbmdlZCk7DQotCQkJfQ0KLQkJCWNsaWVudC5zZXRCb3VuZHMoeCwgeSwgY3NpemUueCwgY3NpemUueSk7DQotCQl9DQotDQotCQlwcm90ZWN0ZWQgUG9pbnQgY29tcHV0ZVNpemUoDQotCQkJQ29tcG9zaXRlIHBhcmVudCwNCi0JCQlpbnQgd0hpbnQsDQotCQkJaW50IGhIaW50LA0KLQkJCWJvb2xlYW4gY2hhbmdlZCkgew0KLQkJCWludCB3aWR0aCA9IHdIaW50Ow0KLQkJCWludCBoZWlnaHQgPSAwOw0KLQkJCWlmIChpc0hlYWRpbmdWaXNpYmxlKCkpIHsNCi0JCQkJaGVpZ2h0ID0gZ2V0SGVhZGluZ0hlaWdodChwYXJlbnQpOw0KLQkJCX0NCi0JCQlQb2ludCBjc2l6ZTsNCi0JCQlMYXlvdXQgbGF5b3V0ID0gY2xpZW50LmdldExheW91dCgpOw0KLQ0KLQkJCWlmIChsYXlvdXQgIT0gbnVsbCAmJiBsYXlvdXQgaW5zdGFuY2VvZiBIVE1MVGFibGVMYXlvdXQpIHsNCi0JCQkJSFRNTFRhYmxlTGF5b3V0IGhsYXlvdXQgPSAoSFRNTFRhYmxlTGF5b3V0KSBsYXlvdXQ7DQotCQkJCWNzaXplID0gaGxheW91dC5jb21wdXRlU2l6ZShjbGllbnQsIHdpZHRoLCBTV1QuREVGQVVMVCwgdHJ1ZSk7DQotCQkJCWlmIChjc2l6ZS54IDwgd2lkdGgpDQotCQkJCQljc2l6ZS54ID0gd2lkdGg7DQotCQkJCVJlY3RhbmdsZSB0cmltID0gY29udHJvbC5jb21wdXRlVHJpbSgwLCAwLCBjc2l6ZS54LCBjc2l6ZS55KTsNCi0JCQkJY3NpemUgPSBuZXcgUG9pbnQodHJpbS53aWR0aCwgdHJpbS5oZWlnaHQpOw0KLQkJCX0gZWxzZSB7DQotCQkJCWNzaXplID0gY2xpZW50LmNvbXB1dGVTaXplKHdpZHRoLCBTV1QuREVGQVVMVCwgY2hhbmdlZCk7DQotCQkJfQ0KLQkJCXdpZHRoID0gY3NpemUueDsNCi0JCQloZWlnaHQgKz0gY3NpemUueTsNCi0JCQlyZXR1cm4gbmV3IFBvaW50KHdpZHRoLCBoZWlnaHQpOw0KLQkJfQ0KLQl9DQotDQotCXB1YmxpYyBXZWJGb3JtKCkgew0KLQl9DQotDQotCXB1YmxpYyBDb250cm9sIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgew0KLQkJc2Nyb2xsQ29tcG9zaXRlID0gbmV3IFNjcm9sbGVkQ29tcG9zaXRlKHBhcmVudCwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMKTsNCi0JCXNjcm9sbENvbXBvc2l0ZS5zZXRCYWNrZ3JvdW5kKGZhY3RvcnkuZ2V0QmFja2dyb3VuZENvbG9yKCkpOw0KLQkJc2Nyb2xsQ29tcG9zaXRlLnNldE1lbnUocGFyZW50LmdldE1lbnUoKSk7DQotCQlmaW5hbCBDb21wb3NpdGUgZm9ybSA9IGZhY3RvcnkuY3JlYXRlQ29tcG9zaXRlKHNjcm9sbENvbXBvc2l0ZSk7DQotDQotCQlzY3JvbGxDb21wb3NpdGUuc2V0Q29udGVudChmb3JtKTsNCi0JCXNjcm9sbENvbXBvc2l0ZS5hZGRMaXN0ZW5lcihTV1QuUmVzaXplLCBuZXcgTGlzdGVuZXIoKSB7DQotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgew0KLQkJCQl1cGRhdGVTaXplKCk7DQotCQkJfQ0KLQkJfSk7DQotCQlXZWJGb3JtTGF5b3V0IGxheW91dCA9IG5ldyBXZWJGb3JtTGF5b3V0KCk7DQotCQlmb3JtLnNldExheW91dChsYXlvdXQpOw0KLQkJZm9ybS5hZGRQYWludExpc3RlbmVyKG5ldyBQYWludExpc3RlbmVyKCkgew0KLQkJCXB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChQYWludEV2ZW50IGUpIHsNCi0JCQkJcGFpbnQoZSk7DQotCQkJfQ0KLQkJfSk7DQotCQl0aGlzLmNvbnRyb2wgPSBmb3JtOw0KLQkJY2xpZW50ID0gZmFjdG9yeS5jcmVhdGVDb21wb3NpdGUoZm9ybSk7DQotCQljcmVhdGVDb250ZW50cyhjbGllbnQpOw0KLQkJaW5pdGlhbGl6ZVNjcm9sbEJhcnMoc2Nyb2xsQ29tcG9zaXRlKTsNCi0JCS8vZm9ybS5zZXRGb2N1cygpOw0KLQkJcmV0dXJuIHNjcm9sbENvbXBvc2l0ZTsNCi0JfQ0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVNjcm9sbEJhcnMoU2Nyb2xsZWRDb21wb3NpdGUgc2NvbXApIHsNCi0JCVNjcm9sbEJhciBoYmFyID0gc2NvbXAuZ2V0SG9yaXpvbnRhbEJhcigpOw0KLQkJaWYgKGhiYXIgIT0gbnVsbCkgew0KLQkJCWhiYXIuc2V0SW5jcmVtZW50KEhfU0NST0xMX0lOQ1JFTUVOVCk7DQotCQl9DQotCQlTY3JvbGxCYXIgdmJhciA9IHNjb21wLmdldFZlcnRpY2FsQmFyKCk7DQotCQlpZiAodmJhciAhPSBudWxsKSB7DQotCQkJdmJhci5zZXRJbmNyZW1lbnQoVl9TQ1JPTExfSU5DUkVNRU5UKTsNCi0JCX0NCi0JCXVwZGF0ZVBhZ2VJbmNyZW1lbnQoc2NvbXApOw0KLQl9DQotDQotCXB1YmxpYyBpbnQgZ2V0SGVhZGluZ0hlaWdodChDb21wb3NpdGUgcGFyZW50KSB7DQotCQlpbnQgd2lkdGggPSBwYXJlbnQuZ2V0U2l6ZSgpLng7DQotCQlpbnQgaGVpZ2h0ID0gMDsNCi0JCWludCBpbWFnZUhlaWdodCA9IDA7DQotCQlpZiAoZ2V0SGVhZGluZ0ltYWdlKCkgIT0gbnVsbCkgew0KLQkJCVJlY3RhbmdsZSBpYm91bmRzID0gZ2V0SGVhZGluZ0ltYWdlKCkuZ2V0Qm91bmRzKCk7DQotCQkJaW1hZ2VIZWlnaHQgPSBpYm91bmRzLmhlaWdodDsNCi0JCX0NCi0JCUdDIGdjID0gbmV3IEdDKHBhcmVudCk7DQotCQlnYy5zZXRGb250KHRpdGxlRm9udCk7DQotCQlpbnQgdGV4dFdpZHRoID0gd2lkdGggLSAyICogSE1BUkdJTjsNCi0JCWhlaWdodCA9IEZvcm1MYWJlbC5jb21wdXRlV3JhcEhlaWdodChnYywgZ2V0SGVhZGluZ1RleHQoKSwgdGV4dFdpZHRoKTsNCi0JCWhlaWdodCArPSAyICogVk1BUkdJTjsNCi0JCWhlaWdodCA9IE1hdGgubWF4KGhlaWdodCwgaW1hZ2VIZWlnaHQpOw0KLQkJaWYgKGhlYWRpbmdVbmRlcmxpbmVJbWFnZSAhPSBudWxsKSB7DQotCQkJUmVjdGFuZ2xlIGlib3VuZHMgPSBoZWFkaW5nVW5kZXJsaW5lSW1hZ2UuZ2V0Qm91bmRzKCk7DQotCQkJaGVpZ2h0ICs9IGlib3VuZHMuaGVpZ2h0Ow0KLQkJfQ0KLQkJZ2MuZGlzcG9zZSgpOw0KLQkJcmV0dXJuIGhlaWdodDsNCi0JfQ0KLQ0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7DQotCX0NCi0NCi0JcHVibGljIENvbnRyb2wgZ2V0Q29udHJvbCgpIHsNCi0JCXJldHVybiBjb250cm9sOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHNldEhlYWRpbmdWaXNpYmxlKGJvb2xlYW4gbmV3SGVhZGluZ1Zpc2libGUpIHsNCi0JCXN1cGVyLnNldEhlYWRpbmdWaXNpYmxlKG5ld0hlYWRpbmdWaXNpYmxlKTsNCi0JCWlmIChjb250cm9sICE9IG51bGwpDQotCQkJY29udHJvbC5sYXlvdXQoKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgSW1hZ2UgZ2V0SGVhZGluZ1VuZGVybGluZUltYWdlKCkgew0KLQkJcmV0dXJuIGhlYWRpbmdVbmRlcmxpbmVJbWFnZTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBzZXRIZWFkaW5nVW5kZXJsaW5lSW1hZ2UoSW1hZ2UgaW1hZ2UpIHsNCi0JCXRoaXMuaGVhZGluZ1VuZGVybGluZUltYWdlID0gaW1hZ2U7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgew0KLQkJdGl0bGVGb250ID0gSkZhY2VSZXNvdXJjZXMuZ2V0SGVhZGVyRm9udCgpOw0KLQkJaWYgKGNvbnRyb2wgIT0gbnVsbCAmJiAhY29udHJvbC5pc0Rpc3Bvc2VkKCkpIHsNCi0JCQljb250cm9sLmxheW91dCgpOw0KLQkJfQ0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVIeXBlcmxpbmtDb2xvcnMoKSB7DQotCQlmYWN0b3J5LnVwZGF0ZUh5cGVybGlua0NvbG9ycygpOw0KLQkJaWYgKGNvbnRyb2wgIT0gbnVsbCAmJiAhY29udHJvbC5pc0Rpc3Bvc2VkKCkpIHsNCi0JCQljb250cm9sLnJlZHJhdygpOw0KLQkJfQ0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHVwZGF0ZVNpemUoKSB7DQotCQlSZWN0YW5nbGUgc3NpemUgPSBzY3JvbGxDb21wb3NpdGUuZ2V0Q2xpZW50QXJlYSgpOw0KLQkJaW50IHN3aWR0aCA9IHNzaXplLndpZHRoOw0KLQkJV2ViRm9ybUxheW91dCBsYXlvdXQgPSAoV2ViRm9ybUxheW91dCkgY29udHJvbC5nZXRMYXlvdXQoKTsNCi0JCVBvaW50IHNpemUgPSBsYXlvdXQuY29tcHV0ZVNpemUoY29udHJvbCwgc3dpZHRoLCBTV1QuREVGQVVMVCwgdHJ1ZSk7DQotCQlpZiAoc2l6ZS54IDwgc3dpZHRoKQ0KLQkJCXNpemUueCA9IHN3aWR0aDsNCi0JCVJlY3RhbmdsZSB0cmltID0gY29udHJvbC5jb21wdXRlVHJpbSgwLCAwLCBzaXplLngsIHNpemUueSk7DQotCQlzaXplID0gbmV3IFBvaW50KHRyaW0ud2lkdGgsIHRyaW0uaGVpZ2h0KTsNCi0JCWNvbnRyb2wuc2V0U2l6ZShzaXplKTsNCi0JCXVwZGF0ZVBhZ2VJbmNyZW1lbnQoc2Nyb2xsQ29tcG9zaXRlKTsNCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgcGFpbnQoUGFpbnRFdmVudCBlKSB7DQotCQlpZiAoaXNIZWFkaW5nVmlzaWJsZSgpID09IGZhbHNlKQ0KLQkJCXJldHVybjsNCi0JCUdDIGdjID0gZS5nYzsNCi0JCWlmIChoZWFkaW5nSW1hZ2UgIT0gbnVsbCkgew0KLQkJCWdjLmRyYXdJbWFnZShoZWFkaW5nSW1hZ2UsIDAsIDApOw0KLQkJfQ0KLQkJUG9pbnQgc2l6ZSA9IGNvbnRyb2wuZ2V0U2l6ZSgpOw0KLQkJaWYgKGdldEhlYWRpbmdCYWNrZ3JvdW5kKCkgIT0gbnVsbCkNCi0JCQlnYy5zZXRCYWNrZ3JvdW5kKGdldEhlYWRpbmdCYWNrZ3JvdW5kKCkpOw0KLQkJaWYgKGdldEhlYWRpbmdGb3JlZ3JvdW5kKCkgIT0gbnVsbCkNCi0JCQlnYy5zZXRGb3JlZ3JvdW5kKGdldEhlYWRpbmdGb3JlZ3JvdW5kKCkpOw0KLQkJZ2Muc2V0Rm9udCh0aXRsZUZvbnQpOw0KLQkJRm9ybUxhYmVsLnBhaW50V3JhcFRleHQoZ2MsIHNpemUsIGdldEhlYWRpbmdUZXh0KCksIEhNQVJHSU4sIFZNQVJHSU4pOw0KLQkJaWYgKGhlYWRpbmdVbmRlcmxpbmVJbWFnZSAhPSBudWxsKSB7DQotCQkJaW50IHkgPQ0KLQkJCQlnZXRIZWFkaW5nSGVpZ2h0KGNvbnRyb2wpDQotCQkJCQktIGhlYWRpbmdVbmRlcmxpbmVJbWFnZS5nZXRCb3VuZHMoKS5oZWlnaHQ7DQotCQkJZ2MuZHJhd0ltYWdlKGhlYWRpbmdVbmRlcmxpbmVJbWFnZSwgMCwgeSk7DQotCQl9DQotCX0NCi0JcHVibGljIHZvaWQgc2V0SGVhZGluZ1RleHQoU3RyaW5nIGhlYWRpbmdUZXh0KSB7DQotCQlzdXBlci5zZXRIZWFkaW5nVGV4dChoZWFkaW5nVGV4dCk7DQotCQlpZiAoY29udHJvbCE9bnVsbCkNCi0JCQljb250cm9sLnJlZHJhdygpOw0KLQl9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9lbmdpbmUvQnVsbGV0UGFyYWdyYXBoLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvZW5naW5lL0J1bGxldFBhcmFncmFwaC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTNmODM4Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9lbmdpbmUvQnVsbGV0UGFyYWdyYXBoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMuaW50ZXJuYWwuZW5naW5lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLQotcHVibGljIGNsYXNzIEJ1bGxldFBhcmFncmFwaCBleHRlbmRzIFBhcmFncmFwaCBpbXBsZW1lbnRzIElCdWxsZXRQYXJhZ3JhcGggewotCXByaXZhdGUgaW50IHN0eWxlID0gQ0lSQ0xFOwotCXByaXZhdGUgU3RyaW5nIHRleHQ7Ci0JcHJpdmF0ZSBpbnQgQ0lSQ0xFX0RJQU0gPSA1OwotCXByaXZhdGUgaW50IFNQQUNJTkcgPSAxMDsKLQlwcml2YXRlIGludCBpbmRlbnQgPSAtMTsKLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQnVsbGV0UGFyYWdyYXBoLgotCSAqIEBwYXJhbSBhZGRWZXJ0aWNhbFNwYWNlCi0JICovCi0JcHVibGljIEJ1bGxldFBhcmFncmFwaChib29sZWFuIGFkZFZlcnRpY2FsU3BhY2UpIHsKLQkJc3VwZXIoYWRkVmVydGljYWxTcGFjZSk7Ci0JfQotCi0JcHVibGljIGludCBnZXRJbmRlbnQoKSB7Ci0JCWlmIChpbmRlbnQgIT0gLTEpCi0JCQlyZXR1cm4gaW5kZW50OwotCQlzd2l0Y2ggKHN0eWxlKSB7Ci0JCQljYXNlIENJUkNMRSA6Ci0JCQkJcmV0dXJuIENJUkNMRV9ESUFNICsgU1BBQ0lORzsKLQkJfQotCQlyZXR1cm4gMjA7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElCdWxsZXRQYXJhZ3JhcGgjZ2V0QnVsbGV0U3R5bGUoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0QnVsbGV0U3R5bGUoKSB7Ci0JCXJldHVybiBzdHlsZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRCdWxsZXRTdHlsZShpbnQgc3R5bGUpIHsKLQkJdGhpcy5zdHlsZSA9IHN0eWxlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEJ1bGxldFRleHQoU3RyaW5nIHRleHQpIHsKLQkJdGhpcy50ZXh0ID0gdGV4dDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJbmRlbnQoaW50IGluZGVudCkgewotCQl0aGlzLmluZGVudCA9IGluZGVudDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSUJ1bGxldFBhcmFncmFwaCNnZXRCdWxsZXRUZXh0KCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJ1bGxldFRleHQoKSB7Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCXB1YmxpYyB2b2lkIHBhaW50KAotCQlHQyBnYywKLQkJaW50IHdpZHRoLAotCQlMb2NhdG9yIGxvYywKLQkJaW50IGxpbmVIZWlnaHQsCi0JCUhhc2h0YWJsZSBvYmplY3RUYWJsZSwKLQkJSUh5cGVybGlua1NlZ21lbnQgc2VsZWN0ZWRMaW5rKSB7Ci0JCXBhaW50QnVsbGV0KGdjLCBsb2MsIGxpbmVIZWlnaHQsIG9iamVjdFRhYmxlKTsKLQkJc3VwZXIucGFpbnQoZ2MsIHdpZHRoLCBsb2MsIGxpbmVIZWlnaHQsIG9iamVjdFRhYmxlLCBzZWxlY3RlZExpbmspOwotCX0KLQotCXB1YmxpYyB2b2lkIHBhaW50QnVsbGV0KAotCQlHQyBnYywKLQkJTG9jYXRvciBsb2MsCi0JCWludCBsaW5lSGVpZ2h0LAotCQlIYXNodGFibGUgb2JqZWN0VGFibGUpIHsKLQkJaW50IHggPSBsb2MueCAtIGdldEluZGVudCgpOwotCQlpZiAoc3R5bGUgPT0gQ0lSQ0xFKSB7Ci0JCQlpbnQgeSA9IGxvYy55ICsgbGluZUhlaWdodCAvIDIgLSBDSVJDTEVfRElBTSAvIDI7Ci0JCQlDb2xvciBiZyA9IGdjLmdldEJhY2tncm91bmQoKTsKLQkJCUNvbG9yIGZnID0gZ2MuZ2V0Rm9yZWdyb3VuZCgpOwotCQkJZ2Muc2V0QmFja2dyb3VuZChmZyk7Ci0JCQlnYy5maWxsUmVjdGFuZ2xlKHgsIHkgKyAxLCA1LCAzKTsKLQkJCWdjLmZpbGxSZWN0YW5nbGUoeCArIDEsIHksIDMsIDUpOwotCQkJZ2Muc2V0QmFja2dyb3VuZChiZyk7Ci0JCX0gZWxzZSBpZiAoc3R5bGUgPT0gVEVYVCAmJiB0ZXh0ICE9IG51bGwpIHsKLQkJCWdjLmRyYXdUZXh0KHRleHQsIHgsIGxvYy55KTsKLQkJfSBlbHNlIGlmIChzdHlsZSA9PSBJTUFHRSAmJiB0ZXh0ICE9IG51bGwpIHsKLQkJCUltYWdlIGltYWdlID0gKEltYWdlKSBvYmplY3RUYWJsZS5nZXQodGV4dCk7Ci0JCQlpZiAoaW1hZ2UgIT0gbnVsbCkgewotCQkJCWludCB5ID0gbG9jLnkgKyBsaW5lSGVpZ2h0IC8gMiAtIGltYWdlLmdldEJvdW5kcygpLmhlaWdodCAvIDI7Ci0JCQkJZ2MuZHJhd0ltYWdlKGltYWdlLCB4LCB5KTsKLQkJCX0KLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvZW5naW5lL0Zvcm1FbmdpbmUuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9lbmdpbmUvRm9ybUVuZ2luZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1M2M4YzdmLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9lbmdpbmUvRm9ybUVuZ2luZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbC5lbmdpbmU7DQotDQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07DQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TY3JvbGxlZENvbXBvc2l0ZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkNsaXBib2FyZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zLmludGVybmFsLio7DQotDQotcHVibGljIGNsYXNzIEZvcm1FbmdpbmUgZXh0ZW5kcyBDYW52YXMgew0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUkxfSEFORExFUl9JRCA9ICJ1cmxIYW5kbGVyIjsNCi0JYm9vbGVhbiBoYXNGb2N1czsNCi0JYm9vbGVhbiBwYXJhZ3JhcGhzU2VwYXJhdGVkID0gdHJ1ZTsNCi0JVGV4dE1vZGVsIG1vZGVsOw0KLQlIYXNodGFibGUgb2JqZWN0VGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7DQotCXB1YmxpYyBpbnQgbWFyZ2luV2lkdGggPSAwOw0KLQlwdWJsaWMgaW50IG1hcmdpbkhlaWdodCA9IDE7DQotCUlIeXBlcmxpbmtTZWdtZW50IGVudGVyZWQ7DQotCWJvb2xlYW4gbW91c2VEb3duID0gZmFsc2U7DQotCVBvaW50IGRyYWdPcmlnaW47DQotCXByaXZhdGUgQWN0aW9uIG9wZW5BY3Rpb247DQotCXByaXZhdGUgQWN0aW9uIGNvcHlTaG9ydGN1dEFjdGlvbjsNCi0JcHJpdmF0ZSBib29sZWFuIGxvYWRpbmc9dHJ1ZTsNCi0JcHJpdmF0ZSBTdHJpbmcgbG9hZGluZ1RleHQ9IkxvYWRpbmcuLi4iOw0KLQ0KLQlwdWJsaWMgYm9vbGVhbiBnZXRGb2N1cygpIHsNCi0JCXJldHVybiBoYXNGb2N1czsNCi0JfQ0KLQkNCi0JcHVibGljIGJvb2xlYW4gaXNMb2FkaW5nKCkgew0KLQkJcmV0dXJuIGxvYWRpbmc7DQotCX0NCi0JDQotCXB1YmxpYyBTdHJpbmcgZ2V0TG9hZGluZ1RleHQoKSB7DQotCQlyZXR1cm4gbG9hZGluZ1RleHQ7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHNldExvYWRpbmdUZXh0KFN0cmluZyBsb2FkaW5nVGV4dCkgew0KLQkJdGhpcy5sb2FkaW5nVGV4dCA9IGxvYWRpbmdUZXh0Ow0KLQl9DQotDQotCXB1YmxpYyBpbnQgZ2V0UGFyYWdyYXBoU3BhY2luZyhpbnQgbGluZUhlaWdodCkgew0KLQkJcmV0dXJuIGxpbmVIZWlnaHQgLyAyOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHNldFBhcmFncmFwaHNTZXBhcmF0ZWQoYm9vbGVhbiB2YWx1ZSkgew0KLQkJcGFyYWdyYXBoc1NlcGFyYXRlZCA9IHZhbHVlOw0KLQl9DQotDQotCS8qKg0KLQkgKiBDb25zdHJ1Y3RvciBmb3IgU2VsZWN0YWJsZUZvcm1MYWJlbA0KLQkgKi8NCi0JcHVibGljIEZvcm1FbmdpbmUoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7DQotCQlzdXBlcihwYXJlbnQsIHN0eWxlKTsNCi0JCXNldExheW91dChuZXcgRm9ybUVuZ2luZUxheW91dCgpKTsNCi0JCW1vZGVsID0gbmV3IFRleHRNb2RlbCgpOw0KLQ0KLQkJYWRkRGlzcG9zZUxpc3RlbmVyKG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7DQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGUpIHsNCi0JCQkJbW9kZWwuZGlzcG9zZSgpOw0KLQkJCX0NCi0JCX0pOw0KLQkJYWRkUGFpbnRMaXN0ZW5lcihuZXcgUGFpbnRMaXN0ZW5lcigpIHsNCi0JCQlwdWJsaWMgdm9pZCBwYWludENvbnRyb2woUGFpbnRFdmVudCBlKSB7DQotCQkJCXBhaW50KGUpOw0KLQkJCX0NCi0JCX0pOw0KLQkJYWRkTGlzdGVuZXIoU1dULktleURvd24sIG5ldyBMaXN0ZW5lcigpIHsNCi0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7DQotCQkJCWlmIChlLmNoYXJhY3RlciA9PSAnXHInKSB7DQotCQkJCQlhY3RpdmF0ZVNlbGVjdGVkTGluaygpOw0KLQkJCQkJcmV0dXJuOw0KLQkJCQl9DQotCQkJfQ0KLQkJfSk7DQotCQlhZGRMaXN0ZW5lcihTV1QuVHJhdmVyc2UsIG5ldyBMaXN0ZW5lcigpIHsNCi0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7DQotCQkJCXN3aXRjaCAoZS5kZXRhaWwpIHsNCi0JCQkJCWNhc2UgU1dULlRSQVZFUlNFX1BBR0VfTkVYVCA6DQotCQkJCQljYXNlIFNXVC5UUkFWRVJTRV9QQUdFX1BSRVZJT1VTIDoNCi0JCQkJCWNhc2UgU1dULlRSQVZFUlNFX0FSUk9XX05FWFQgOg0KLQkJCQkJY2FzZSBTV1QuVFJBVkVSU0VfQVJST1dfUFJFVklPVVMgOg0KLQkJCQkJCWUuZG9pdCA9IGZhbHNlOw0KLQkJCQkJCXJldHVybjsNCi0JCQkJfQ0KLQkJCQlpZiAoIW1vZGVsLmhhc0ZvY3VzU2VnbWVudHMoKSkgew0KLQkJCQkJZS5kb2l0ID0gdHJ1ZTsNCi0JCQkJCXJldHVybjsNCi0JCQkJfQ0KLQkJCQlpZiAoZS5kZXRhaWwgPT0gU1dULlRSQVZFUlNFX1RBQl9ORVhUKQ0KLQkJCQkJZS5kb2l0ID0gYWR2YW5jZSh0cnVlKTsNCi0JCQkJZWxzZSBpZiAoZS5kZXRhaWwgPT0gU1dULlRSQVZFUlNFX1RBQl9QUkVWSU9VUykNCi0JCQkJCWUuZG9pdCA9IGFkdmFuY2UoZmFsc2UpOw0KLQkJCQllbHNlIGlmIChlLmRldGFpbCAhPSBTV1QuVFJBVkVSU0VfUkVUVVJOKQ0KLQkJCQkJZS5kb2l0ID0gdHJ1ZTsNCi0JCQl9DQotCQl9KTsNCi0JCWFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzTGlzdGVuZXIoKSB7DQotCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7DQotCQkJCWlmICghaGFzRm9jdXMpIHsNCi0JCQkJCWhhc0ZvY3VzID0gdHJ1ZTsNCi0JCQkJCWhhbmRsZUZvY3VzQ2hhbmdlKCk7DQotCQkJCX0NCi0JCQl9DQotCQkJcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgew0KLQkJCQlpZiAoaGFzRm9jdXMpIHsNCi0JCQkJCWhhc0ZvY3VzID0gZmFsc2U7DQotCQkJCQloYW5kbGVGb2N1c0NoYW5nZSgpOw0KLQkJCQl9DQotCQkJfQ0KLQkJfSk7DQotCQlhZGRNb3VzZUxpc3RlbmVyKG5ldyBNb3VzZUxpc3RlbmVyKCkgew0KLQkJCXB1YmxpYyB2b2lkIG1vdXNlRG91YmxlQ2xpY2soTW91c2VFdmVudCBlKSB7DQotCQkJfQ0KLQkJCXB1YmxpYyB2b2lkIG1vdXNlRG93bihNb3VzZUV2ZW50IGUpIHsNCi0JCQkJLy8gc2VsZWN0IGEgbGluaw0KLQkJCQloYW5kbGVNb3VzZUNsaWNrKGUsIHRydWUpOw0KLQkJCX0NCi0JCQlwdWJsaWMgdm9pZCBtb3VzZVVwKE1vdXNlRXZlbnQgZSkgew0KLQkJCQkvLyBhY3RpdmF0ZSBhIGxpbmsNCi0JCQkJaGFuZGxlTW91c2VDbGljayhlLCBmYWxzZSk7DQotCQkJfQ0KLQkJfSk7DQotCQlhZGRNb3VzZVRyYWNrTGlzdGVuZXIobmV3IE1vdXNlVHJhY2tMaXN0ZW5lcigpIHsNCi0JCQlwdWJsaWMgdm9pZCBtb3VzZUVudGVyKE1vdXNlRXZlbnQgZSkgew0KLQkJCQloYW5kbGVNb3VzZU1vdmUoZSk7DQotCQkJfQ0KLQkJCXB1YmxpYyB2b2lkIG1vdXNlRXhpdChNb3VzZUV2ZW50IGUpIHsNCi0JCQkJaWYgKGVudGVyZWQgIT0gbnVsbCkgew0KLQkJCQkJZXhpdExpbmsoZW50ZXJlZCk7DQotCQkJCQlwYWludExpbmtIb3ZlcihlbnRlcmVkLCBmYWxzZSk7DQotCQkJCQllbnRlcmVkID0gbnVsbDsNCi0JCQkJCXNldEN1cnNvcihudWxsKTsNCi0JCQkJfQ0KLQkJCX0NCi0JCQlwdWJsaWMgdm9pZCBtb3VzZUhvdmVyKE1vdXNlRXZlbnQgZSkgew0KLQkJCQloYW5kbGVNb3VzZUhvdmVyKGUpOw0KLQkJCX0NCi0JCX0pOw0KLQkJYWRkTW91c2VNb3ZlTGlzdGVuZXIobmV3IE1vdXNlTW92ZUxpc3RlbmVyKCkgew0KLQkJCXB1YmxpYyB2b2lkIG1vdXNlTW92ZShNb3VzZUV2ZW50IGUpIHsNCi0JCQkJaGFuZGxlTW91c2VNb3ZlKGUpOw0KLQkJCX0NCi0JCX0pOw0KLQkJaW5pdEFjY2Vzc2libGUoKTsNCi0JCW1ha2VBY3Rpb25zKCk7DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIG1ha2VBY3Rpb25zKCkgew0KLQkJb3BlbkFjdGlvbiA9IG5ldyBBY3Rpb24oKSB7DQotCQkJcHVibGljIHZvaWQgcnVuKCkgew0KLQkJCQlhY3RpdmF0ZVNlbGVjdGVkTGluaygpOw0KLQkJCX0NCi0JCX07DQotCQlvcGVuQWN0aW9uLnNldFRleHQoDQotCQkJRm9ybXNQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIkZvcm1FZ2luZS5saW5rUG9wdXAub3BlbiIpKTsNCi0JCWNvcHlTaG9ydGN1dEFjdGlvbiA9IG5ldyBBY3Rpb24oKSB7DQotCQkJcHVibGljIHZvaWQgcnVuKCkgew0KLQkJCQljb3B5U2hvcnRjdXQoZ2V0U2VsZWN0ZWRMaW5rKCkpOw0KLQkJCX0NCi0JCX07DQotCQljb3B5U2hvcnRjdXRBY3Rpb24uc2V0VGV4dCgNCi0JCQlGb3Jtc1BsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiRm9ybUVnaW5lLmxpbmtQb3B1cC5jb3B5U2hvcnRjdXQiKSk7DQotCX0NCi0NCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0QWNlc3NpYmxlVGV4dCgpIHsNCi0JCXJldHVybiBtb2RlbC5nZXRBY2Nlc3NpYmxlVGV4dCgpOw0KLQl9DQotDQotCXByaXZhdGUgdm9pZCBpbml0QWNjZXNzaWJsZSgpIHsNCi0JCUFjY2Vzc2libGUgYWNjZXNzaWJsZSA9IGdldEFjY2Vzc2libGUoKTsNCi0JCWFjY2Vzc2libGUuYWRkQWNjZXNzaWJsZUxpc3RlbmVyKG5ldyBBY2Nlc3NpYmxlQWRhcHRlcigpIHsNCi0JCQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7DQotCQkJCWUucmVzdWx0ID0gZ2V0QWNlc3NpYmxlVGV4dCgpOw0KLQkJCX0NCi0NCi0JCQlwdWJsaWMgdm9pZCBnZXRIZWxwKEFjY2Vzc2libGVFdmVudCBlKSB7DQotCQkJCWUucmVzdWx0ID0gZ2V0VG9vbFRpcFRleHQoKTsNCi0JCQl9DQotCQl9KTsNCi0NCi0JCWFjY2Vzc2libGUNCi0JCQkuYWRkQWNjZXNzaWJsZUNvbnRyb2xMaXN0ZW5lcihuZXcgQWNjZXNzaWJsZUNvbnRyb2xBZGFwdGVyKCkgew0KLQkJCXB1YmxpYyB2b2lkIGdldENoaWxkQXRQb2ludChBY2Nlc3NpYmxlQ29udHJvbEV2ZW50IGUpIHsNCi0JCQkJUG9pbnQgcHQgPSB0b0NvbnRyb2wobmV3IFBvaW50KGUueCwgZS55KSk7DQotCQkJCWUuY2hpbGRJRCA9DQotCQkJCQkoZ2V0Qm91bmRzKCkuY29udGFpbnMocHQpKQ0KLQkJCQkJCT8gQUNDLkNISUxESURfU0VMRg0KLQkJCQkJCTogQUNDLkNISUxESURfTk9ORTsNCi0JCQl9DQotDQotCQkJcHVibGljIHZvaWQgZ2V0TG9jYXRpb24oQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBlKSB7DQotCQkJCVJlY3RhbmdsZSBsb2NhdGlvbiA9IGdldEJvdW5kcygpOw0KLQkJCQlQb2ludCBwdCA9IHRvRGlzcGxheShuZXcgUG9pbnQobG9jYXRpb24ueCwgbG9jYXRpb24ueSkpOw0KLQkJCQllLnggPSBwdC54Ow0KLQkJCQllLnkgPSBwdC55Ow0KLQkJCQllLndpZHRoID0gbG9jYXRpb24ud2lkdGg7DQotCQkJCWUuaGVpZ2h0ID0gbG9jYXRpb24uaGVpZ2h0Ow0KLQkJCX0NCi0NCi0JCQlwdWJsaWMgdm9pZCBnZXRDaGlsZENvdW50KEFjY2Vzc2libGVDb250cm9sRXZlbnQgZSkgew0KLQkJCQllLmRldGFpbCA9IDA7DQotCQkJfQ0KLQ0KLQkJCXB1YmxpYyB2b2lkIGdldFJvbGUoQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBlKSB7DQotCQkJCWUuZGV0YWlsID0gQUNDLlJPTEVfVEVYVDsNCi0JCQl9DQotDQotCQkJcHVibGljIHZvaWQgZ2V0U3RhdGUoQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBlKSB7DQotCQkJCWUuZGV0YWlsID0gQUNDLlNUQVRFX1JFQURPTkxZOw0KLQkJCX0NCi0JCX0pOw0KLQl9DQotDQotCXByaXZhdGUgdm9pZCBoYW5kbGVNb3VzZUNsaWNrKE1vdXNlRXZlbnQgZSwgYm9vbGVhbiBkb3duKSB7DQotCQlpZiAoZG93bikgew0KLQkJCS8vIHNlbGVjdCBhIGh5cGVybGluaw0KLQkJCUlIeXBlcmxpbmtTZWdtZW50IHNlZ21lbnRVbmRlciA9IG1vZGVsLmZpbmRIeXBlcmxpbmtBdChlLngsIGUueSk7DQotCQkJaWYgKHNlZ21lbnRVbmRlciAhPSBudWxsKSB7DQotCQkJCUlIeXBlcmxpbmtTZWdtZW50IG9sZExpbmsgPSBtb2RlbC5nZXRTZWxlY3RlZExpbmsoKTsNCi0JCQkJbW9kZWwuc2VsZWN0TGluayhzZWdtZW50VW5kZXIpOw0KLQkJCQllbnRlckxpbmsoc2VnbWVudFVuZGVyKTsNCi0JCQkJcGFpbnRGb2N1c1RyYW5zZmVyKG9sZExpbmssIHNlZ21lbnRVbmRlcik7DQotCQkJfQ0KLQkJCW1vdXNlRG93biA9IHRydWU7DQotCQkJZHJhZ09yaWdpbiA9IG5ldyBQb2ludChlLngsIGUueSk7DQotCQl9IGVsc2Ugew0KLQkJCWlmIChlLmJ1dHRvbiA9PSAxKSB7DQotCQkJCUlIeXBlcmxpbmtTZWdtZW50IHNlZ21lbnRVbmRlciA9DQotCQkJCQltb2RlbC5maW5kSHlwZXJsaW5rQXQoZS54LCBlLnkpOw0KLQkJCQlpZiAoc2VnbWVudFVuZGVyICE9IG51bGwpIHsNCi0JCQkJCWFjdGl2YXRlTGluayhzZWdtZW50VW5kZXIpOw0KLQkJCQl9DQotCQkJfQ0KLQkJCW1vdXNlRG93biA9IGZhbHNlOw0KLQkJfQ0KLQl9DQotCXByaXZhdGUgdm9pZCBoYW5kbGVNb3VzZUhvdmVyKE1vdXNlRXZlbnQgZSkgew0KLQl9DQotCXByaXZhdGUgdm9pZCBoYW5kbGVNb3VzZU1vdmUoTW91c2VFdmVudCBlKSB7DQotCQlpZiAobW91c2VEb3duKSB7DQotCQkJaGFuZGxlRHJhZyhlKTsNCi0JCQlyZXR1cm47DQotCQl9DQotCQlJVGV4dFNlZ21lbnQgc2VnbWVudFVuZGVyID0gbW9kZWwuZmluZFNlZ21lbnRBdChlLngsIGUueSk7DQotDQotCQlpZiAoc2VnbWVudFVuZGVyID09IG51bGwpIHsNCi0JCQlpZiAoZW50ZXJlZCAhPSBudWxsKSB7DQotCQkJCWV4aXRMaW5rKGVudGVyZWQpOw0KLQkJCQlwYWludExpbmtIb3ZlcihlbnRlcmVkLCBmYWxzZSk7DQotCQkJCWVudGVyZWQgPSBudWxsOw0KLQkJCX0NCi0JCQlzZXRDdXJzb3IobnVsbCk7DQotCQl9IGVsc2Ugew0KLQkJCWlmIChzZWdtZW50VW5kZXIgaW5zdGFuY2VvZiBJSHlwZXJsaW5rU2VnbWVudCkgew0KLQkJCQlJSHlwZXJsaW5rU2VnbWVudCBsaW5rVW5kZXIgPSAoSUh5cGVybGlua1NlZ21lbnQpIHNlZ21lbnRVbmRlcjsNCi0JCQkJaWYgKGVudGVyZWQgPT0gbnVsbCkgew0KLQkJCQkJZW50ZXJlZCA9IGxpbmtVbmRlcjsNCi0JCQkJCWVudGVyTGluayhsaW5rVW5kZXIpOw0KLQkJCQkJcGFpbnRMaW5rSG92ZXIoZW50ZXJlZCwgdHJ1ZSk7DQotCQkJCQlzZXRDdXJzb3IoDQotCQkJCQkJbW9kZWwuZ2V0SHlwZXJsaW5rU2V0dGluZ3MoKS5nZXRIeXBlcmxpbmtDdXJzb3IoKSk7DQotCQkJCX0NCi0JCQl9IGVsc2Ugew0KLQkJCQlpZiAoZW50ZXJlZCAhPSBudWxsKSB7DQotCQkJCQlleGl0TGluayhlbnRlcmVkKTsNCi0JCQkJCXBhaW50TGlua0hvdmVyKGVudGVyZWQsIGZhbHNlKTsNCi0JCQkJCWVudGVyZWQgPSBudWxsOw0KLQkJCQl9DQotCQkJCXNldEN1cnNvcihtb2RlbC5nZXRIeXBlcmxpbmtTZXR0aW5ncygpLmdldFRleHRDdXJzb3IoKSk7DQotCQkJfQ0KLQkJfQ0KLQl9DQotDQotCXByaXZhdGUgdm9pZCBoYW5kbGVEcmFnKE1vdXNlRXZlbnQgZSkgew0KLQl9DQotDQotCXB1YmxpYyBIeXBlcmxpbmtTZXR0aW5ncyBnZXRIeXBlcmxpbmtTZXR0aW5ncygpIHsNCi0JCXJldHVybiBtb2RlbC5nZXRIeXBlcmxpbmtTZXR0aW5ncygpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHNldEh5cGVybGlua1NldHRpbmdzKEh5cGVybGlua1NldHRpbmdzIHNldHRpbmdzKSB7DQotCQltb2RlbC5zZXRIeXBlcmxpbmtTZXR0aW5ncyhzZXR0aW5ncyk7DQotCX0NCi0NCi0JcHJpdmF0ZSBib29sZWFuIGFkdmFuY2UoYm9vbGVhbiBuZXh0KSB7DQotCQlJSHlwZXJsaW5rU2VnbWVudCBjdXJyZW50ID0gbW9kZWwuZ2V0U2VsZWN0ZWRMaW5rKCk7DQotCQlpZiAoY3VycmVudCAhPSBudWxsKQ0KLQkJCWV4aXRMaW5rKGN1cnJlbnQpOw0KLQ0KLQkJYm9vbGVhbiB2YWxpZCA9IG1vZGVsLnRyYXZlcnNlTGlua3MobmV4dCk7DQotCQkNCi0JCUlIeXBlcmxpbmtTZWdtZW50IG5ld0xpbmsgPSBtb2RlbC5nZXRTZWxlY3RlZExpbmsoKTsNCi0NCi0JCWlmICh2YWxpZCkNCi0JCQllbnRlckxpbmsobmV3TGluayk7DQotCQlwYWludEZvY3VzVHJhbnNmZXIoY3VycmVudCwgbmV3TGluayk7DQotCQlpZiAobmV3TGluayE9bnVsbCkgZW5zdXJlVmlzaWJsZShuZXdMaW5rKTsNCi0JCXJldHVybiAhdmFsaWQ7DQotCX0NCi0NCi0JcHVibGljIElIeXBlcmxpbmtTZWdtZW50IGdldFNlbGVjdGVkTGluaygpIHsNCi0JCXJldHVybiBtb2RlbC5nZXRTZWxlY3RlZExpbmsoKTsNCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgaGFuZGxlRm9jdXNDaGFuZ2UoKSB7DQotCQlpZiAoaGFzRm9jdXMpIHsNCi0JCQltb2RlbC50cmF2ZXJzZUxpbmtzKHRydWUpOw0KLQkJCWVudGVyTGluayhtb2RlbC5nZXRTZWxlY3RlZExpbmsoKSk7DQotCQkJcGFpbnRGb2N1c1RyYW5zZmVyKG51bGwsIG1vZGVsLmdldFNlbGVjdGVkTGluaygpKTsNCi0JCX0gZWxzZSB7DQotCQkJcGFpbnRGb2N1c1RyYW5zZmVyKG1vZGVsLmdldFNlbGVjdGVkTGluaygpLCBudWxsKTsNCi0JCQltb2RlbC5zZWxlY3RMaW5rKG51bGwpOw0KLQkJfQ0KLQl9DQotDQotCXByaXZhdGUgdm9pZCBlbnRlckxpbmsoSUh5cGVybGlua1NlZ21lbnQgbGluaykgew0KLQkJaWYgKGxpbmsgPT0gbnVsbCkNCi0JCQlyZXR1cm47DQotCQlIeXBlcmxpbmtBY3Rpb24gYWN0aW9uID0gbGluay5nZXRBY3Rpb24ob2JqZWN0VGFibGUpOw0KLQkJaWYgKGFjdGlvbiAhPSBudWxsKQ0KLQkJCWFjdGlvbi5saW5rRW50ZXJlZChsaW5rKTsNCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgZXhpdExpbmsoSUh5cGVybGlua1NlZ21lbnQgbGluaykgew0KLQkJaWYgKGxpbmsgPT0gbnVsbCkNCi0JCQlyZXR1cm47DQotCQlIeXBlcmxpbmtBY3Rpb24gYWN0aW9uID0gbGluay5nZXRBY3Rpb24ob2JqZWN0VGFibGUpOw0KLQkJaWYgKGFjdGlvbiAhPSBudWxsKQ0KLQkJCWFjdGlvbi5saW5rRXhpdGVkKGxpbmspOw0KLQl9DQotDQotCXByaXZhdGUgdm9pZCBwYWludExpbmtIb3ZlcihJSHlwZXJsaW5rU2VnbWVudCBsaW5rLCBib29sZWFuIGhvdmVyKSB7DQotCQlHQyBnYyA9IG5ldyBHQyh0aGlzKTsNCi0NCi0JCUh5cGVybGlua1NldHRpbmdzIHNldHRpbmdzID0gZ2V0SHlwZXJsaW5rU2V0dGluZ3MoKTsNCi0NCi0JCWdjLnNldEZvcmVncm91bmQoDQotCQkJaG92ZXIgPyBzZXR0aW5ncy5nZXRBY3RpdmVGb3JlZ3JvdW5kKCkgOiBzZXR0aW5ncy5nZXRGb3JlZ3JvdW5kKCkpOw0KLQkJZ2Muc2V0QmFja2dyb3VuZChnZXRCYWNrZ3JvdW5kKCkpOw0KLQkJZ2Muc2V0Rm9udChnZXRGb250KCkpOw0KLQkJYm9vbGVhbiBzZWxlY3RlZCA9IChsaW5rID09IGdldFNlbGVjdGVkTGluaygpKTsNCi0JCWxpbmsucmVwYWludChnYywgaG92ZXIpOw0KLQkJaWYgKHNlbGVjdGVkKSB7DQotCQkJbGluay5wYWludEZvY3VzKGdjLCBnZXRCYWNrZ3JvdW5kKCksIGdldEZvcmVncm91bmQoKSwgZmFsc2UpOw0KLQkJCWxpbmsucGFpbnRGb2N1cyhnYywgZ2V0QmFja2dyb3VuZCgpLCBnZXRGb3JlZ3JvdW5kKCksIHRydWUpOw0KLQkJfQ0KLQkJZ2MuZGlzcG9zZSgpOw0KLQl9DQotDQotCXByaXZhdGUgdm9pZCBhY3RpdmF0ZVNlbGVjdGVkTGluaygpIHsNCi0JCUlIeXBlcmxpbmtTZWdtZW50IGxpbmsgPSBtb2RlbC5nZXRTZWxlY3RlZExpbmsoKTsNCi0JCWlmIChsaW5rICE9IG51bGwpDQotCQkJYWN0aXZhdGVMaW5rKGxpbmspOw0KLQl9DQotDQotCXByaXZhdGUgdm9pZCBhY3RpdmF0ZUxpbmsoSUh5cGVybGlua1NlZ21lbnQgbGluaykgew0KLQkJc2V0Q3Vyc29yKG1vZGVsLmdldEh5cGVybGlua1NldHRpbmdzKCkuZ2V0QnVzeUN1cnNvcigpKTsNCi0JCUh5cGVybGlua0FjdGlvbiBhY3Rpb24gPSBsaW5rLmdldEFjdGlvbihvYmplY3RUYWJsZSk7DQotCQlpZiAoYWN0aW9uICE9IG51bGwpDQotCQkJYWN0aW9uLmxpbmtBY3RpdmF0ZWQobGluayk7DQotCQlpZiAoIWlzRGlzcG9zZWQoKSkNCi0JCQlzZXRDdXJzb3IobW9kZWwuZ2V0SHlwZXJsaW5rU2V0dGluZ3MoKS5nZXRIeXBlcmxpbmtDdXJzb3IoKSk7DQotCX0NCi0NCi0JcHJvdGVjdGVkIHZvaWQgcGFpbnQoUGFpbnRFdmVudCBlKSB7DQotCQlpbnQgd2lkdGggPSBnZXRDbGllbnRBcmVhKCkud2lkdGg7DQotDQotCQlHQyBnYyA9IGUuZ2M7DQotCQlnYy5zZXRGb250KGdldEZvbnQoKSk7DQotCQlnYy5zZXRGb3JlZ3JvdW5kKGdldEZvcmVncm91bmQoKSk7DQotCQlnYy5zZXRCYWNrZ3JvdW5kKGdldEJhY2tncm91bmQoKSk7DQotDQotCQlMb2NhdG9yIGxvYyA9IG5ldyBMb2NhdG9yKCk7DQotCQlsb2MubWFyZ2luV2lkdGggPSBtYXJnaW5XaWR0aDsNCi0JCWxvYy5tYXJnaW5IZWlnaHQgPSBtYXJnaW5IZWlnaHQ7DQotCQlsb2MueCA9IG1hcmdpbldpZHRoOw0KLQkJbG9jLnkgPSBtYXJnaW5IZWlnaHQ7DQotDQotCQlGb250TWV0cmljcyBmbSA9IGdjLmdldEZvbnRNZXRyaWNzKCk7DQotCQlpbnQgbGluZUhlaWdodCA9IGZtLmdldEhlaWdodCgpOw0KLQkJDQotCQlpZiAobG9hZGluZykgew0KLQkJCWludCB0ZXh0V2lkdGggPSBnYy50ZXh0RXh0ZW50KGxvYWRpbmdUZXh0KS54Ow0KLQkJCWdjLmRyYXdUZXh0KGxvYWRpbmdUZXh0LCB3aWR0aC8yLXRleHRXaWR0aC8yLCBnZXRDbGllbnRBcmVhKCkuaGVpZ2h0LzItbGluZUhlaWdodC8yKTsNCi0JCQlyZXR1cm47DQotCQl9DQotCQkNCi0JCUlQYXJhZ3JhcGhbXSBwYXJhZ3JhcGhzID0gbW9kZWwuZ2V0UGFyYWdyYXBocygpOw0KLQ0KLQkJSUh5cGVybGlua1NlZ21lbnQgc2VsZWN0ZWRMaW5rID0gbW9kZWwuZ2V0U2VsZWN0ZWRMaW5rKCk7DQotDQotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFncmFwaHMubGVuZ3RoOyBpKyspIHsNCi0JCQlJUGFyYWdyYXBoIHAgPSBwYXJhZ3JhcGhzW2ldOw0KLQ0KLQkJCWlmIChpID4gMCAmJiBwYXJhZ3JhcGhzU2VwYXJhdGVkICYmIHAuZ2V0QWRkVmVydGljYWxTcGFjZSgpKQ0KLQkJCQlsb2MueSArPSBnZXRQYXJhZ3JhcGhTcGFjaW5nKGxpbmVIZWlnaHQpOw0KLQ0KLQkJCWxvYy5pbmRlbnQgPSBwLmdldEluZGVudCgpOw0KLQkJCWxvYy5yZXNldENhcmV0KCk7DQotCQkJbG9jLnJvd0hlaWdodCA9IDA7DQotCQkJcC5wYWludChnYywgd2lkdGgsIGxvYywgbGluZUhlaWdodCwgb2JqZWN0VGFibGUsIHNlbGVjdGVkTGluayk7DQotCQl9DQotCX0NCi0NCi0JcHVibGljIHZvaWQgcmVnaXN0ZXJUZXh0T2JqZWN0KFN0cmluZyBrZXksIE9iamVjdCB2YWx1ZSkgew0KLQkJb2JqZWN0VGFibGUucHV0KGtleSwgdmFsdWUpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIGxvYWQoU3RyaW5nIHRleHQsIGJvb2xlYW4gcGFyc2VUYWdzLCBib29sZWFuIGV4cGFuZFVSTHMpIHsNCi0JCXRyeSB7DQotCQkJaWYgKHBhcnNlVGFncykNCi0JCQkJbW9kZWwucGFyc2VUYWdnZWRUZXh0KHRleHQsIGV4cGFuZFVSTHMpOw0KLQkJCWVsc2UNCi0JCQkJbW9kZWwucGFyc2VSZWd1bGFyVGV4dCh0ZXh0LCBleHBhbmRVUkxzKTsNCi0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgew0KLQkJCUZvcm1zUGx1Z2luLmxvZ0V4Y2VwdGlvbihlKTsNCi0JCX0NCi0JCWZpbmFsbHkgew0KLQkJCWxvYWRpbmcgPSBmYWxzZTsNCi0JCX0NCi0JfQ0KLQlwdWJsaWMgdm9pZCBsb2FkKElucHV0U3RyZWFtIGlzLCBib29sZWFuIGV4cGFuZFVSTHMpIHsNCi0JCXRyeSB7DQotCQkJbW9kZWwucGFyc2VJbnB1dFN0cmVhbShpcywgZXhwYW5kVVJMcyk7DQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsNCi0JCQlGb3Jtc1BsdWdpbi5sb2dFeGNlcHRpb24oZSk7DQotCQl9DQotCQlmaW5hbGx5IHsNCi0JCQlsb2FkaW5nID0gZmFsc2U7DQotCQl9DQotCX0NCi0NCi0JcHVibGljIGJvb2xlYW4gc2V0Rm9jdXMoKSB7DQotCQkvKg0KLQkJaWYgKCFtb2RlbC5oYXNGb2N1c1NlZ21lbnRzKCkpDQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJKi8NCi0JCXJldHVybiBzdXBlci5zZXRGb2N1cygpOw0KLQl9DQotDQotCXByaXZhdGUgdm9pZCBwYWludEZvY3VzVHJhbnNmZXIoDQotCQlJSHlwZXJsaW5rU2VnbWVudCBvbGRMaW5rLA0KLQkJSUh5cGVybGlua1NlZ21lbnQgbmV3TGluaykgew0KLQkJR0MgZ2MgPSBuZXcgR0ModGhpcyk7DQotCQlDb2xvciBiZyA9IGdldEJhY2tncm91bmQoKTsNCi0JCUNvbG9yIGZnID0gZ2V0Rm9yZWdyb3VuZCgpOw0KLQ0KLQkJZ2Muc2V0Rm9udChnZXRGb250KCkpOw0KLQ0KLQkJaWYgKG9sZExpbmsgIT0gbnVsbCkgew0KLQkJCWdjLnNldEJhY2tncm91bmQoYmcpOw0KLQkJCWdjLnNldEZvcmVncm91bmQoZmcpOw0KLQkJCW9sZExpbmsucGFpbnRGb2N1cyhnYywgYmcsIGZnLCBmYWxzZSk7DQotCQl9DQotCQlpZiAobmV3TGluayAhPSBudWxsKSB7DQotCQkJLy9lbnN1cmVWaXNpYmxlKG5ld0xpbmspOw0KLQkJCWdjLnNldEJhY2tncm91bmQoYmcpOw0KLQkJCWdjLnNldEZvcmVncm91bmQoZmcpOw0KLQkJCW5ld0xpbmsucGFpbnRGb2N1cyhnYywgYmcsIGZnLCB0cnVlKTsNCi0JCX0NCi0JCWdjLmRpc3Bvc2UoKTsNCi0JfQ0KLQkvKioNCi0JICogR2V0cyB0aGUgbWFyZ2luV2lkdGguDQotCSAqIEByZXR1cm4gUmV0dXJucyBhIGludA0KLQkgKi8NCi0JcHVibGljIGludCBnZXRNYXJnaW5XaWR0aCgpIHsNCi0JCXJldHVybiBtYXJnaW5XaWR0aDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogU2V0cyB0aGUgbWFyZ2luV2lkdGguDQotCSAqIEBwYXJhbSBtYXJnaW5XaWR0aCBUaGUgbWFyZ2luV2lkdGggdG8gc2V0DQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRNYXJnaW5XaWR0aChpbnQgbWFyZ2luV2lkdGgpIHsNCi0JCXRoaXMubWFyZ2luV2lkdGggPSBtYXJnaW5XaWR0aDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogR2V0cyB0aGUgbWFyZ2luSGVpZ2h0Lg0KLQkgKiBAcmV0dXJuIFJldHVybnMgYSBpbnQNCi0JICovDQotCXB1YmxpYyBpbnQgZ2V0TWFyZ2luSGVpZ2h0KCkgew0KLQkJcmV0dXJuIG1hcmdpbkhlaWdodDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogU2V0cyB0aGUgbWFyZ2luSGVpZ2h0Lg0KLQkgKiBAcGFyYW0gbWFyZ2luSGVpZ2h0IFRoZSBtYXJnaW5IZWlnaHQgdG8gc2V0DQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRNYXJnaW5IZWlnaHQoaW50IG1hcmdpbkhlaWdodCkgew0KLQkJdGhpcy5tYXJnaW5IZWlnaHQgPSBtYXJnaW5IZWlnaHQ7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgY29udGV4dE1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWFuYWdlcikgew0KLQkJSUh5cGVybGlua1NlZ21lbnQgbGluayA9IGdldFNlbGVjdGVkTGluaygpOw0KLQkJaWYgKGxpbmsgIT0gbnVsbCkNCi0JCQljb250cmlidXRlTGlua0FjdGlvbnMobWFuYWdlciwgbGluayk7DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIGNvbnRyaWJ1dGVMaW5rQWN0aW9ucygNCi0JCUlNZW51TWFuYWdlciBtYW5hZ2VyLA0KLQkJSUh5cGVybGlua1NlZ21lbnQgbGluaykgew0KLQkJbWFuYWdlci5hZGQob3BlbkFjdGlvbik7DQotCQltYW5hZ2VyLmFkZChjb3B5U2hvcnRjdXRBY3Rpb24pOw0KLQkJbWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigpKTsNCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgY29weVNob3J0Y3V0KElIeXBlcmxpbmtTZWdtZW50IGxpbmspIHsNCi0JCVN0cmluZyB0ZXh0ID0gbGluay5nZXRUZXh0KCk7DQotCQlDbGlwYm9hcmQgY2xpcGJvYXJkID0gbmV3IENsaXBib2FyZChnZXREaXNwbGF5KCkpOw0KLQkJY2xpcGJvYXJkLnNldENvbnRlbnRzKA0KLQkJCW5ldyBPYmplY3RbXSB7IHRleHQgfSwNCi0JCQluZXcgVHJhbnNmZXJbXSB7IFRleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpfSk7DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIGVuc3VyZVZpc2libGUoSUh5cGVybGlua1NlZ21lbnQgc2VnbWVudCkgew0KLQkJUmVjdGFuZ2xlIGJvdW5kcyA9IHNlZ21lbnQuZ2V0Qm91bmRzKCk7DQotCQlTY3JvbGxlZENvbXBvc2l0ZSBzY29tcCA9IGdldFNjcm9sbGVkQ29tcG9zaXRlKCk7DQotCQlpZiAoc2NvbXAgPT0gbnVsbCkNCi0JCQlyZXR1cm47DQotCQlQb2ludCBvcmlnaW4gPSBBYnN0cmFjdFNlY3Rpb25Gb3JtLmdldENvbnRyb2xMb2NhdGlvbihzY29tcCwgdGhpcyk7DQotCQlvcmlnaW4ueCArPSBib3VuZHMueDsNCi0JCW9yaWdpbi55ICs9IGJvdW5kcy55Ow0KLQkJQWJzdHJhY3RTZWN0aW9uRm9ybS5lbnN1cmVWaXNpYmxlKA0KLQkJCXNjb21wLA0KLQkJCW9yaWdpbiwNCi0JCQluZXcgUG9pbnQoYm91bmRzLndpZHRoLCBib3VuZHMuaGVpZ2h0KSk7DQotCX0NCi0JU2Nyb2xsZWRDb21wb3NpdGUgZ2V0U2Nyb2xsZWRDb21wb3NpdGUoKSB7DQotCQlDb21wb3NpdGUgcGFyZW50ID0gZ2V0UGFyZW50KCk7DQotCQl3aGlsZSAocGFyZW50ICE9IG51bGwpIHsNCi0JCQlpZiAocGFyZW50IGluc3RhbmNlb2YgU2Nyb2xsZWRDb21wb3NpdGUpDQotCQkJCXJldHVybiAoU2Nyb2xsZWRDb21wb3NpdGUpIHBhcmVudDsNCi0JCQlwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50KCk7DQotCQl9DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvZW5naW5lL0Zvcm1FbmdpbmVMYXlvdXQuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9lbmdpbmUvRm9ybUVuZ2luZUxheW91dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2FlZTRkLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9lbmdpbmUvRm9ybUVuZ2luZUxheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbC5lbmdpbmU7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMuaW50ZXJuYWwuSUxheW91dEV4dGVuc2lvbjsNCi0NCi0vKioNCi0gKiBAdmVyc2lvbiAJMS4wDQotICogQGF1dGhvcg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBGb3JtRW5naW5lTGF5b3V0IGV4dGVuZHMgTGF5b3V0IGltcGxlbWVudHMgSUxheW91dEV4dGVuc2lvbiB7DQotDQotCXB1YmxpYyBpbnQgZ2V0TWF4aW11bVdpZHRoKENvbXBvc2l0ZSBwYXJlbnQsIGJvb2xlYW4gY2hhbmdlZCkgew0KLQkJcmV0dXJuIGNvbXB1dGVTaXplKHBhcmVudCwgU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCBjaGFuZ2VkKS54Ow0KLQl9DQotDQotCXB1YmxpYyBpbnQgZ2V0TWluaW11bVdpZHRoKENvbXBvc2l0ZSBwYXJlbnQsIGJvb2xlYW4gY2hhbmdlZCkgew0KLQkJcmV0dXJuIDMwOw0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgTGF5b3V0I2NvbXB1dGVTaXplKENvbXBvc2l0ZSwgaW50LCBpbnQsIGJvb2xlYW4pDQotCSAqLw0KLQ0KLQlwdWJsaWMgUG9pbnQgY29tcHV0ZVNpemUoDQotCQlDb21wb3NpdGUgY29tcG9zaXRlLA0KLQkJaW50IHdIaW50LA0KLQkJaW50IGhIaW50LA0KLQkJYm9vbGVhbiBjaGFuZ2VkKSB7DQotCQlGb3JtRW5naW5lIGVuZ2luZSA9IChGb3JtRW5naW5lKSBjb21wb3NpdGU7DQotCQlpbnQgaW5uZXJXaWR0aCA9IHdIaW50Ow0KLQkJaWYgKGVuZ2luZS5pc0xvYWRpbmcoKSkgew0KLQkJCXJldHVybiBjb21wdXRlTG9hZGluZyhlbmdpbmUpOw0KLQkJfQ0KLQkJaWYgKGlubmVyV2lkdGggIT0gU1dULkRFRkFVTFQpDQotCQkJaW5uZXJXaWR0aCAtPSBlbmdpbmUubWFyZ2luV2lkdGggKiAyOw0KLQkJUG9pbnQgdGV4dFNpemUgPSBjb21wdXRlVGV4dFNpemUoZW5naW5lLCBpbm5lcldpZHRoKTsNCi0JCWludCB0ZXh0V2lkdGggPSB0ZXh0U2l6ZS54ICsgMiAqIGVuZ2luZS5tYXJnaW5XaWR0aDsNCi0JCWludCB0ZXh0SGVpZ2h0ID0gdGV4dFNpemUueSArIDIgKiBlbmdpbmUubWFyZ2luSGVpZ2h0Ow0KLQkJUG9pbnQgcmVzdWx0ID0gbmV3IFBvaW50KHRleHRXaWR0aCwgdGV4dEhlaWdodCk7DQotCQlyZXR1cm4gcmVzdWx0Ow0KLQl9DQotCQ0KLQlwcml2YXRlIFBvaW50IGNvbXB1dGVMb2FkaW5nKEZvcm1FbmdpbmUgZW5naW5lKSB7DQotCQlHQyBnYyA9IG5ldyBHQyhlbmdpbmUpOw0KLQkJZ2Muc2V0Rm9udChlbmdpbmUuZ2V0Rm9udCgpKTsNCi0JCVN0cmluZyBsb2FkaW5nVGV4dCA9IGVuZ2luZS5nZXRMb2FkaW5nVGV4dCgpOw0KLQkJUG9pbnQgc2l6ZSA9IGdjLnRleHRFeHRlbnQobG9hZGluZ1RleHQpOw0KLQkJZ2MuZGlzcG9zZSgpOw0KLQkJc2l6ZS54ICs9IDIgKiBlbmdpbmUubWFyZ2luV2lkdGg7DQotCQlzaXplLnkgKz0gMiAqIGVuZ2luZS5tYXJnaW5IZWlnaHQ7DQotCQlyZXR1cm4gc2l6ZTsNCi0JfQ0KLQ0KLQlwcml2YXRlIFBvaW50IGNvbXB1dGVUZXh0U2l6ZShGb3JtRW5naW5lIGVuZ2luZSwgaW50IHdIaW50KSB7DQotCQlJUGFyYWdyYXBoW10gcGFyYWdyYXBocyA9IGVuZ2luZS5tb2RlbC5nZXRQYXJhZ3JhcGhzKCk7DQotDQotCQlHQyBnYyA9IG5ldyBHQyhlbmdpbmUpOw0KLQkJZ2Muc2V0Rm9udChlbmdpbmUuZ2V0Rm9udCgpKTsNCi0NCi0JCUxvY2F0b3IgbG9jID0gbmV3IExvY2F0b3IoKTsNCi0NCi0JCWludCB3aWR0aCA9IHdIaW50ICE9IFNXVC5ERUZBVUxUID8gd0hpbnQgOiAwOw0KLQ0KLQkJRm9udE1ldHJpY3MgZm0gPSBnYy5nZXRGb250TWV0cmljcygpOw0KLQkJaW50IGxpbmVIZWlnaHQgPSBmbS5nZXRIZWlnaHQoKTsNCi0NCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyYWdyYXBocy5sZW5ndGg7IGkrKykgew0KLQkJCUlQYXJhZ3JhcGggcCA9IHBhcmFncmFwaHNbaV07DQotDQotCQkJaWYgKGkgPiAwICYmIGVuZ2luZS5wYXJhZ3JhcGhzU2VwYXJhdGVkICYmIHAuZ2V0QWRkVmVydGljYWxTcGFjZSgpKQ0KLQkJCQlsb2MueSArPSBlbmdpbmUuZ2V0UGFyYWdyYXBoU3BhY2luZyhsaW5lSGVpZ2h0KTsNCi0NCi0JCQlsb2Mucm93SGVpZ2h0ID0gMDsNCi0JCQlsb2MuaW5kZW50ID0gcC5nZXRJbmRlbnQoKTsNCi0JCQlsb2MueCA9IHAuZ2V0SW5kZW50KCk7DQotDQotCQkJSVBhcmFncmFwaFNlZ21lbnRbXSBzZWdtZW50cyA9IHAuZ2V0U2VnbWVudHMoKTsNCi0JCQlpZiAoc2VnbWVudHMubGVuZ3RoID4gMCkgew0KLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHNlZ21lbnRzLmxlbmd0aDsgaisrKSB7DQotCQkJCQlJUGFyYWdyYXBoU2VnbWVudCBzZWdtZW50ID0gc2VnbWVudHNbal07DQotCQkJCQlzZWdtZW50LmFkdmFuY2VMb2NhdG9yKGdjLCB3SGludCwgbG9jLCBlbmdpbmUub2JqZWN0VGFibGUpOw0KLQkJCQkJd2lkdGggPSBNYXRoLm1heCh3aWR0aCwgbG9jLndpZHRoKTsNCi0JCQkJfQ0KLQkJCQlsb2MueSArPSBsb2Mucm93SGVpZ2h0Ow0KLQkJCX0gZWxzZSB7DQotCQkJCS8vIGVtcHR5IG5ldyBsaW5lDQotCQkJCWxvYy55ICs9IGxpbmVIZWlnaHQ7DQotCQkJfQ0KLQkJfQ0KLQkJZ2MuZGlzcG9zZSgpOw0KLQkJcmV0dXJuIG5ldyBQb2ludCh3aWR0aCwgbG9jLnkpOw0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgTGF5b3V0I2xheW91dChDb21wb3NpdGUsIGJvb2xlYW4pDQotCSAqLw0KLQlwcm90ZWN0ZWQgdm9pZCBsYXlvdXQoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgYm9vbGVhbiBmbHVzaENhY2hlKSB7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL2VuZ2luZS9IVFRQQWN0aW9uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvZW5naW5lL0hUVFBBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2QzZDBiNS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvZW5naW5lL0hUVFBBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbC5lbmdpbmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5wcm9ncmFtLlByb2dyYW07DQotDQotLyoqDQotICogQHZlcnNpb24gCTEuMA0KLSAqIEBhdXRob3INCi0gKi8NCi1wdWJsaWMgY2xhc3MgSFRUUEFjdGlvbiBleHRlbmRzIEh5cGVybGlua0FjdGlvbiB7DQotCXB1YmxpYyBIVFRQQWN0aW9uICgpIHsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgbGlua0FjdGl2YXRlZChJSHlwZXJsaW5rU2VnbWVudCBsaW5rKSB7DQotCQlQcm9ncmFtLmxhdW5jaChsaW5rLmdldFRleHQoKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIGxpbmtFbnRlcmVkKElIeXBlcmxpbmtTZWdtZW50IGxpbmspIHsNCi0JCXNldERlc2NyaXB0aW9uKGxpbmsuZ2V0VGV4dCgpKTsNCi0JCXN1cGVyLmxpbmtFbnRlcmVkKGxpbmspOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9lbmdpbmUvSHlwZXJsaW5rQWN0aW9uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvZW5naW5lL0h5cGVybGlua0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjExYTY4Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9lbmdpbmUvSHlwZXJsaW5rQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMuaW50ZXJuYWwuZW5naW5lOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVN0YXR1c0xpbmVNYW5hZ2VyOw0KLQ0KLS8qKg0KLSAqIEB2ZXJzaW9uIAkxLjANCi0gKiBAYXV0aG9yDQotICovDQotcHVibGljIGNsYXNzIEh5cGVybGlua0FjdGlvbiB7DQotCUlTdGF0dXNMaW5lTWFuYWdlciBtYW5hZ2VyOw0KLQlwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbjsNCi0JDQotCXB1YmxpYyBIeXBlcmxpbmtBY3Rpb24oKSB7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIGxpbmtBY3RpdmF0ZWQoZmluYWwgSUh5cGVybGlua1NlZ21lbnQgbGluaykgew0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCBsaW5rRW50ZXJlZChJSHlwZXJsaW5rU2VnbWVudCBsaW5rKSB7DQotCQlpZiAobWFuYWdlciE9bnVsbCAmJiBkZXNjcmlwdGlvbiE9bnVsbCkgew0KLQkJCW1hbmFnZXIuc2V0TWVzc2FnZShkZXNjcmlwdGlvbik7DQotCQl9DQotCX0NCi0NCi0JcHVibGljIHZvaWQgbGlua0V4aXRlZChJSHlwZXJsaW5rU2VnbWVudCBsaW5rKSB7DQotCQlpZiAobWFuYWdlciE9bnVsbCAmJiBkZXNjcmlwdGlvbiE9bnVsbCkgew0KLQkJCW1hbmFnZXIuc2V0TWVzc2FnZShudWxsKTsNCi0JCX0NCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgc2V0U3RhdHVzTGluZU1hbmFnZXIoSVN0YXR1c0xpbmVNYW5hZ2VyIG1hbmFnZXIpIHsNCi0JCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7DQotCX0NCi0JDQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7DQotCQlyZXR1cm4gZGVzY3JpcHRpb247DQotCX0NCi0JcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7DQotCQl0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL2VuZ2luZS9IeXBlcmxpbmtTZWdtZW50LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvZW5naW5lL0h5cGVybGlua1NlZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM0MTU4Ny4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvZW5naW5lL0h5cGVybGlua1NlZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMuaW50ZXJuYWwuZW5naW5lOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMuaW50ZXJuYWwuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsNCi0NCi0vKioNCi0gKiBAdmVyc2lvbiAJMS4wDQotICogQGF1dGhvcg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBIeXBlcmxpbmtTZWdtZW50DQotCWV4dGVuZHMgVGV4dFNlZ21lbnQNCi0JaW1wbGVtZW50cyBJSHlwZXJsaW5rU2VnbWVudCB7DQotCXByaXZhdGUgU3RyaW5nIGFjdGlvbklkOw0KLQlwcml2YXRlIFN0cmluZyBhcmc7DQotCXByaXZhdGUgSHlwZXJsaW5rU2V0dGluZ3Mgc2V0dGluZ3M7DQotCQ0KLQlwdWJsaWMgSHlwZXJsaW5rU2VnbWVudChTdHJpbmcgdGV4dCwgSHlwZXJsaW5rU2V0dGluZ3Mgc2V0dGluZ3MsIFN0cmluZyBmb250SWQpIHsNCi0JCXN1cGVyKHRleHQsIGZvbnRJZCk7DQotCQl0aGlzLnNldHRpbmdzID0gc2V0dGluZ3M7DQotCQl1bmRlcmxpbmUgPSBzZXR0aW5ncy5nZXRIeXBlcmxpbmtVbmRlcmxpbmVNb2RlKCk9PUh5cGVybGlua1NldHRpbmdzLlVOREVSTElORV9BTFdBWVM7DQotCX0NCi0JDQotCS8qDQotCSAqIEBzZWUgSUh5cGVybGlua1NlZ21lbnQjZ2V0TGlzdGVuZXIoSGFzaHRhYmxlKQ0KLQkgKi8NCi0JcHVibGljIEh5cGVybGlua0FjdGlvbiBnZXRBY3Rpb24oSGFzaHRhYmxlIG9iamVjdFRhYmxlKSB7DQotCQlpZiAoYWN0aW9uSWQ9PW51bGwpIHJldHVybiBudWxsOw0KLQkJT2JqZWN0IG9iaiA9IG9iamVjdFRhYmxlLmdldChhY3Rpb25JZCk7DQotCQlpZiAob2JqPT1udWxsKSByZXR1cm4gbnVsbDsNCi0JCWlmIChvYmogaW5zdGFuY2VvZiBIeXBlcmxpbmtBY3Rpb24pIHJldHVybiAoSHlwZXJsaW5rQWN0aW9uKW9iajsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotCQ0KLQkvKg0KLQkgKiBAc2VlIElPYmplY3RSZWZlcmVuY2UjZ2V0T2JqZWN0SWQoKQ0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRPYmplY3RJZCgpIHsNCi0JCXJldHVybiBhY3Rpb25JZDsNCi0JfQ0KLQkNCi0Jdm9pZCBzZXRBY3Rpb25JZChTdHJpbmcgaWQpIHsNCi0JCXRoaXMuYWN0aW9uSWQgPSBpZDsNCi0JfQ0KLQlwdWJsaWMgdm9pZCBwYWludChHQyBnYywgaW50IHdpZHRoLCBMb2NhdG9yIGxvY2F0b3IsIEhhc2h0YWJsZSBvYmplY3RUYWJsZSwgYm9vbGVhbiBzZWxlY3RlZCkgew0KLQkJc2V0Q29sb3Ioc2V0dGluZ3MuZ2V0Rm9yZWdyb3VuZCgpKTsNCi0JCXN1cGVyLnBhaW50KGdjLCB3aWR0aCwgbG9jYXRvciwgb2JqZWN0VGFibGUsIHNlbGVjdGVkKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgcmVwYWludChHQyBnYywgYm9vbGVhbiBob3Zlcikgew0KLQkJRm9udE1ldHJpY3MgZm0gPSBnYy5nZXRGb250TWV0cmljcygpOw0KLQkJaW50IGxpbmVIZWlnaHQgPSBmbS5nZXRIZWlnaHQoKTsNCi0JCWludCBkZXNjZW50ID0gZm0uZ2V0RGVzY2VudCgpOw0KLQkJYm9vbGVhbiByb2xsb3Zlck1vZGUgPSBzZXR0aW5ncy5nZXRIeXBlcmxpbmtVbmRlcmxpbmVNb2RlKCk9PUh5cGVybGlua1NldHRpbmdzLlVOREVSTElORV9ST0xMT1ZFUjsNCi0JCWZvciAoaW50IGk9MDsgaTxhcmVhUmVjdGFuZ2xlcy5zaXplKCk7IGkrKykgew0KLQkJCUFyZWFSZWN0YW5nbGUgYXJlYVJlY3RhbmdsZSA9IChBcmVhUmVjdGFuZ2xlKWFyZWFSZWN0YW5nbGVzLmdldChpKTsNCi0JCQlSZWN0YW5nbGUgcmVjdCA9IGFyZWFSZWN0YW5nbGUucmVjdDsNCi0JCQlTdHJpbmcgdGV4dCA9IGFyZWFSZWN0YW5nbGUuZ2V0VGV4dCgpOw0KLQkJCVBvaW50IGV4dGVudCA9IGdjLnRleHRFeHRlbnQodGV4dCk7DQotCQkJaW50IHRleHRYID0gcmVjdC54ICsgMTsNCi0JCQlnYy5kcmF3U3RyaW5nKHRleHQsIHRleHRYLCByZWN0LnksIHRydWUpOw0KLQkJCWlmICh1bmRlcmxpbmUgfHwgaG92ZXIgfHwgcm9sbG92ZXJNb2RlKSB7DQotCQkJCWludCBsaW5lWSA9IHJlY3QueSArIGxpbmVIZWlnaHQgLSBkZXNjZW50ICsgMTsNCi0JCQkJQ29sb3Igc2F2ZWQ9bnVsbDsNCi0JCQkJaWYgKHJvbGxvdmVyTW9kZSAmJiAhaG92ZXIpIHsNCi0JCQkJCXNhdmVkID0gZ2MuZ2V0Rm9yZWdyb3VuZCgpOw0KLQkJCQkJZ2Muc2V0Rm9yZWdyb3VuZChnYy5nZXRCYWNrZ3JvdW5kKCkpOw0KLQkJCQl9DQotCQkJCWdjLmRyYXdMaW5lKHRleHRYLCBsaW5lWSwgdGV4dFgrZXh0ZW50LngsIGxpbmVZKTsNCi0JCQkJaWYgKHNhdmVkIT1udWxsKQ0KLQkJCQkJZ2Muc2V0Rm9yZWdyb3VuZChzYXZlZCk7DQotCQkJfQ0KLQkJfQ0KLQl9DQotCS8qKg0KLQkgKiBAcmV0dXJuDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldEFyZygpIHsNCi0JCXJldHVybiBhcmc7DQotCX0NCi0NCi0JLyoqDQotCSAqIEBwYXJhbSBzdHJpbmcNCi0JICovDQotCXB1YmxpYyB2b2lkIHNldEFyZyhTdHJpbmcgc3RyaW5nKSB7DQotCQlhcmcgPSBzdHJpbmc7DQotCX0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL2VuZ2luZS9JQnVsbGV0UGFyYWdyYXBoLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvZW5naW5lL0lCdWxsZXRQYXJhZ3JhcGguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVmMzM4My4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvZW5naW5lL0lCdWxsZXRQYXJhZ3JhcGguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMuaW50ZXJuYWwuZW5naW5lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUJ1bGxldFBhcmFncmFwaCBleHRlbmRzIElQYXJhZ3JhcGggewotCWludCBDSVJDTEUgPSAwOwotCWludCBURVhUID0gMTsKLQlpbnQgSU1BR0UgPSAyOwotCXB1YmxpYyBpbnQgZ2V0QnVsbGV0U3R5bGUoKTsKLQlwdWJsaWMgU3RyaW5nIGdldEJ1bGxldFRleHQoKTsKLQotCXB1YmxpYyB2b2lkIHBhaW50QnVsbGV0KEdDIGdjLCBMb2NhdG9yIGxvYywgaW50IGxpbmVIZWlnaHQsIEhhc2h0YWJsZSBvYmplY3RUYWJsZSk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL2VuZ2luZS9JSHlwZXJsaW5rU2VnbWVudC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL2VuZ2luZS9JSHlwZXJsaW5rU2VnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTViNThhLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9lbmdpbmUvSUh5cGVybGlua1NlZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbC5lbmdpbmU7DQotDQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsNCi0NCi0vKioNCi0gKiBAdmVyc2lvbiAJMS4wDQotICogQGF1dGhvcg0KLSAqLw0KLXB1YmxpYyBpbnRlcmZhY2UgSUh5cGVybGlua1NlZ21lbnQgZXh0ZW5kcyBJVGV4dFNlZ21lbnQsIElPYmplY3RSZWZlcmVuY2Ugew0KLQlIeXBlcmxpbmtBY3Rpb24gZ2V0QWN0aW9uKEhhc2h0YWJsZSBvYmplY3RUYWJsZSk7DQotCQ0KLQlib29sZWFuIGNvbnRhaW5zKGludCB4LCBpbnQgeSk7DQotCQ0KLQlTdHJpbmcgZ2V0QXJnKCk7DQotCQ0KLQlwdWJsaWMgdm9pZCByZXBhaW50KEdDIGdjLCBib29sZWFuIGhvdmVyKTsNCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL2VuZ2luZS9JSW1hZ2VTZWdtZW50LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvZW5naW5lL0lJbWFnZVNlZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU5YmQ1Ni4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvZW5naW5lL0lJbWFnZVNlZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbC5lbmdpbmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsNCi0NCi0vKioNCi0gKiBAdmVyc2lvbiAJMS4wDQotICogQGF1dGhvcg0KLSAqLw0KLXB1YmxpYyBpbnRlcmZhY2UgSUltYWdlU2VnbWVudCBleHRlbmRzIElQYXJhZ3JhcGhTZWdtZW50LCBJT2JqZWN0UmVmZXJlbmNlIHsNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVE9QID0gMTsNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUlERExFID0gMjsNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQk9UVE9NID0gMzsNCi0JDQotCXB1YmxpYyBpbnQgZ2V0VmVydGljYWxBbGlnbm1lbnQoKTsNCi0NCi0JSW1hZ2UgZ2V0SW1hZ2UoSGFzaHRhYmxlIG9iamVjdFRhYmxlKTsNCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL2VuZ2luZS9JT2JqZWN0UmVmZXJlbmNlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvZW5naW5lL0lPYmplY3RSZWZlcmVuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjEyYTdlYi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvZW5naW5lL0lPYmplY3RSZWZlcmVuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbC5lbmdpbmU7DQotDQotLyoqDQotICogQHZlcnNpb24gCTEuMA0KLSAqIEBhdXRob3INCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIElPYmplY3RSZWZlcmVuY2Ugew0KLQlwdWJsaWMgU3RyaW5nIGdldE9iamVjdElkKCk7DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9lbmdpbmUvSVBhcmFncmFwaC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL2VuZ2luZS9JUGFyYWdyYXBoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiMzM2ZWIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL2VuZ2luZS9JUGFyYWdyYXBoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMuaW50ZXJuYWwuZW5naW5lOw0KLQ0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7DQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7DQotDQotLyoqDQotICogQHZlcnNpb24gCTEuMA0KLSAqIEBhdXRob3INCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIElQYXJhZ3JhcGggew0KLQlwdWJsaWMgaW50IGdldEluZGVudCgpOw0KLQlwdWJsaWMgSVBhcmFncmFwaFNlZ21lbnQgW10gZ2V0U2VnbWVudHMoKTsNCi0JcHVibGljIHZvaWQgYWRkU2VnbWVudChJUGFyYWdyYXBoU2VnbWVudCBzZWdtZW50KTsNCi0JcHVibGljIGJvb2xlYW4gZ2V0QWRkVmVydGljYWxTcGFjZSgpOw0KLQlwdWJsaWMgSVRleHRTZWdtZW50IGZpbmRTZWdtZW50QXQoaW50IHgsIGludCB5KTsNCi0JcHVibGljIHZvaWQgcGFpbnQoR0MgZ2MsIGludCB3aWR0aCwgTG9jYXRvciBsb2MsIGludCBsaW5lSGVpZ2h0LCBIYXNodGFibGUgb2JqZWN0VGFibGUsIElIeXBlcmxpbmtTZWdtZW50IHNlbGVjdGVkTGluayk7DQotCXB1YmxpYyBTdHJpbmcgZ2V0QWNjZXNzaWJsZVRleHQoKTsNCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL2VuZ2luZS9JUGFyYWdyYXBoU2VnbWVudC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL2VuZ2luZS9JUGFyYWdyYXBoU2VnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjE3MTA1Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9lbmdpbmUvSVBhcmFncmFwaFNlZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbC5lbmdpbmU7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsNCi0NCi0vKioNCi0gKiBAdmVyc2lvbiAJMS4wDQotICogQGF1dGhvcg0KLSAqLw0KLXB1YmxpYyBpbnRlcmZhY2UgSVBhcmFncmFwaFNlZ21lbnQgew0KLQkNCi0JcHVibGljIHZvaWQgYWR2YW5jZUxvY2F0b3IoR0MgZ2MsIGludCB3SGludCwgTG9jYXRvciBsb2MsIEhhc2h0YWJsZSBvYmplY3RUYWJsZSk7DQotCQ0KLQlwdWJsaWMgdm9pZCBwYWludChHQyBnYywgaW50IHdpZHRoLCBMb2NhdG9yIGxvYywgSGFzaHRhYmxlIG9iamVjdFRhYmxlLCBib29sZWFuIHNlbGVjdGVkKTsNCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL2VuZ2luZS9JVGV4dE1vZGVsLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvZW5naW5lL0lUZXh0TW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA3MWFkMi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvZW5naW5lL0lUZXh0TW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbC5lbmdpbmU7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEB2ZXJzaW9uIAkxLjANCi0gKiBAYXV0aG9yDQotICovDQotcHVibGljIGludGVyZmFjZSBJVGV4dE1vZGVsIHsNCi0JSVBhcmFncmFwaCBbXSBnZXRQYXJhZ3JhcGhzKCk7DQotCXB1YmxpYyB2b2lkIHBhcnNlVGFnZ2VkVGV4dChTdHJpbmcgdGFnZ2VkVGV4dCwgYm9vbGVhbiBleHBhbmRVUkxzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsNCi0JcHVibGljIHZvaWQgcGFyc2VSZWd1bGFyVGV4dChTdHJpbmcgcmVndWxhclRleHQsIGJvb2xlYW4gZXhwYW5kVVJMcykgdGhyb3dzIENvcmVFeGNlcHRpb247DQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKTsNCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL2VuZ2luZS9JVGV4dFNlZ21lbnQuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9lbmdpbmUvSVRleHRTZWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3ZTVmYjAuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL2VuZ2luZS9JVGV4dFNlZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbC5lbmdpbmU7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOw0KLQ0KLS8qKg0KLSAqIEB2ZXJzaW9uIAkxLjANCi0gKiBAYXV0aG9yDQotICovDQotcHVibGljIGludGVyZmFjZSBJVGV4dFNlZ21lbnQgZXh0ZW5kcyBJUGFyYWdyYXBoU2VnbWVudCB7DQotCVN0cmluZyBnZXRUZXh0KCk7DQotCUNvbG9yIGdldENvbG9yKCk7DQotCUZvbnQgZ2V0Rm9udCgpOw0KLQlib29sZWFuIGlzV29yZFdyYXBBbGxvd2VkKCk7DQotCWJvb2xlYW4gaXNTZWxlY3RhYmxlKCk7DQotCWJvb2xlYW4gY29udGFpbnMoaW50IHgsIGludCB5KTsNCi0JUmVjdGFuZ2xlIGdldEJvdW5kcygpOw0KLQl2b2lkIHBhaW50Rm9jdXMoR0MgZ2MsIENvbG9yIGJnLCBDb2xvciBmZywgYm9vbGVhbiBzZWxlY3RlZCk7DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9lbmdpbmUvSW1hZ2VTZWdtZW50LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvZW5naW5lL0ltYWdlU2VnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Yzg0Y2I5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9lbmdpbmUvSW1hZ2VTZWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMuaW50ZXJuYWwuZW5naW5lOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsNCi0NCi0vKioNCi0gKiBAdmVyc2lvbiAJMS4wDQotICogQGF1dGhvcg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBJbWFnZVNlZ21lbnQgZXh0ZW5kcyBQYXJhZ3JhcGhTZWdtZW50IGltcGxlbWVudHMgSUltYWdlU2VnbWVudCB7DQotCXByaXZhdGUgaW50IGFsaWdubWVudCA9IEJPVFRPTTsNCi0JcHJpdmF0ZSBTdHJpbmcgaW1hZ2VJZDsNCi0JDQotCXB1YmxpYyBpbnQgZ2V0VmVydGljYWxBbGlnbm1lbnQoKSB7DQotCQlyZXR1cm4gYWxpZ25tZW50Ow0KLQl9DQotCQ0KLQl2b2lkIHNldFZlcnRpY2FsQWxpZ25tZW50KGludCBhbGlnbm1lbnQpIHsNCi0JCXRoaXMuYWxpZ25tZW50ID0gYWxpZ25tZW50Ow0KLQl9DQotCQ0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoSGFzaHRhYmxlIG9iamVjdFRhYmxlKSB7DQotCQlpZiAoaW1hZ2VJZD09bnVsbCkgcmV0dXJuIG51bGw7DQotCQlPYmplY3Qgb2JqID0gb2JqZWN0VGFibGUuZ2V0KGltYWdlSWQpOw0KLQkJaWYgKG9iaj09bnVsbCkgcmV0dXJuIG51bGw7DQotCQlpZiAob2JqIGluc3RhbmNlb2YgSW1hZ2UpIHJldHVybiAoSW1hZ2Upb2JqOw0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0JDQotCXB1YmxpYyBTdHJpbmcgZ2V0T2JqZWN0SWQoKSB7DQotCQlyZXR1cm4gaW1hZ2VJZDsNCi0JfQ0KLQkNCi0Jdm9pZCBzZXRPYmplY3RJZChTdHJpbmcgaW1hZ2VJZCkgew0KLQkJdGhpcy5pbWFnZUlkID0gaW1hZ2VJZDsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgYWR2YW5jZUxvY2F0b3IoR0MgZ2MsIGludCB3SGludCwgTG9jYXRvciBsb2MsIEhhc2h0YWJsZSBvYmplY3RUYWJsZSkgew0KLQkJSW1hZ2UgaW1hZ2UgPSBnZXRJbWFnZShvYmplY3RUYWJsZSk7DQotCQlpbnQgaXdpZHRoID0gMDsNCi0JCWludCBpaGVpZ2h0ID0gMDsNCi0JCWlmIChpbWFnZSE9bnVsbCkgew0KLQkJCVJlY3RhbmdsZSByZWN0ID0gaW1hZ2UuZ2V0Qm91bmRzKCk7DQotCQkJaXdpZHRoID0gcmVjdC53aWR0aDsNCi0JCQlpaGVpZ2h0ID0gcmVjdC5oZWlnaHQ7DQotCQl9DQotCQlpZiAod0hpbnQgIT0gU1dULkRFRkFVTFQgJiYgbG9jLnggKyBpd2lkdGggPiB3SGludCkgew0KLQkJCS8vIG5ldyBsaW5lDQotCQkJbG9jLnggPSBsb2MuaW5kZW50ICsgaXdpZHRoOw0KLQkJCWxvYy53aWR0aCA9IGxvYy54Ow0KLQkJCWxvYy55ICs9IGxvYy5yb3dIZWlnaHQ7DQotCQkJbG9jLnJvd0hlaWdodCA9IGloZWlnaHQ7DQotCQl9DQotCQllbHNlIHsNCi0JCQlsb2MueCArPSBpd2lkdGg7DQotCQkJbG9jLnJvd0hlaWdodCA9IE1hdGgubWF4KGxvYy5yb3dIZWlnaHQsIGloZWlnaHQpOw0KLQkJfQ0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHBhaW50KEdDIGdjLCBpbnQgd2lkdGgsIExvY2F0b3IgbG9jLCBIYXNodGFibGUgb2JqZWN0VGFibGUsIGJvb2xlYW4gc2VsZWN0ZWQpIHsNCi0JCUltYWdlIGltYWdlID0gZ2V0SW1hZ2Uob2JqZWN0VGFibGUpOw0KLQkJaW50IGl3aWR0aCA9IDA7DQotCQlpbnQgaWhlaWdodCA9IDA7DQotCQlpZiAoaW1hZ2UhPW51bGwpIHsNCi0JCQlSZWN0YW5nbGUgcmVjdCA9IGltYWdlLmdldEJvdW5kcygpOw0KLQkJCWl3aWR0aCA9IHJlY3Qud2lkdGg7DQotCQkJaWhlaWdodCA9IHJlY3QuaGVpZ2h0Ow0KLQkJfQ0KLQkJZWxzZSByZXR1cm47DQotCQlsb2Mud2lkdGggPSBpd2lkdGg7DQotCQlsb2MuaGVpZ2h0ID0gaWhlaWdodDsNCi0JCQ0KLQkJaW50IGl4ID0gbG9jLng7DQotCQlpbnQgaXkgPSBsb2MueTsNCi0JCQ0KLQkJaWYgKGl4ICsgaXdpZHRoID4gd2lkdGgpIHsNCi0JCQkvLyBuZXcgcm93DQotCQkJaXggPSBsb2MuaW5kZW50ICsgbG9jLm1hcmdpbldpZHRoOw0KLQkJCWl5ICs9IGxvYy5yb3dIZWlnaHQ7DQotCQkJbG9jLnJvd0hlaWdodCA9IDA7DQotCQl9DQotCQkNCi0JCWdjLmRyYXdJbWFnZShpbWFnZSwgaXgsIGl5KTsNCi0JCWxvYy54ID0gaXggKyBpd2lkdGg7DQotCQlsb2MueSA9IGl5Ow0KLQkJbG9jLnJvd0hlaWdodCA9IE1hdGgubWF4KGxvYy5yb3dIZWlnaHQsIGloZWlnaHQpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9lbmdpbmUvTG9jYXRvci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL2VuZ2luZS9Mb2NhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1MDE1NGIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL2VuZ2luZS9Mb2NhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMuaW50ZXJuYWwuZW5naW5lOw0KLQ0KLS8qKg0KLSAqIEB2ZXJzaW9uIAkxLjANCi0gKiBAYXV0aG9yDQotICovDQotcHVibGljIGNsYXNzIExvY2F0b3IgeyANCi0JcHVibGljIGludCBpbmRlbnQ7DQotCXB1YmxpYyBpbnQgeCwgeTsNCi0JcHVibGljIGludCB3aWR0aCwgaGVpZ2h0Ow0KLQlwdWJsaWMgaW50IHJvd0hlaWdodDsNCi0JcHVibGljIGludCBtYXJnaW5XaWR0aDsNCi0JcHVibGljIGludCBtYXJnaW5IZWlnaHQ7DQotCQ0KLQlwdWJsaWMgdm9pZCBuZXdMaW5lKCkgew0KLQkJcmVzZXRDYXJldCgpOw0KLQkJeSArPSByb3dIZWlnaHQ7DQotCQlyb3dIZWlnaHQgPSAwOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCByZXNldENhcmV0KCkgew0KLQkJeCA9IG1hcmdpbldpZHRoICsgaW5kZW50Ow0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9lbmdpbmUvUGFyYWdyYXBoLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvZW5naW5lL1BhcmFncmFwaC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWE0MzUyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9lbmdpbmUvUGFyYWdyYXBoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zLmludGVybmFsLmVuZ2luZTsNCi0NCi1pbXBvcnQgamF2YS5pby4qOw0KLWltcG9ydCBqYXZhLnV0aWwuKjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMuaW50ZXJuYWwuSHlwZXJsaW5rU2V0dGluZ3M7DQotDQotLyoqDQotICogQHZlcnNpb24gCTEuMA0KLSAqIEBhdXRob3INCi0gKi8NCi1wdWJsaWMgY2xhc3MgUGFyYWdyYXBoIGltcGxlbWVudHMgSVBhcmFncmFwaCB7DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFAgPSAiaHR0cDovLyI7DQotCXByaXZhdGUgVmVjdG9yIHNlZ21lbnRzOw0KLQlwcml2YXRlIGJvb2xlYW4gYWRkVmVydGljYWxTcGFjZSA9IHRydWU7DQotDQotCXB1YmxpYyBQYXJhZ3JhcGgoYm9vbGVhbiBhZGRWZXJ0aWNhbFNwYWNlKSB7DQotCQl0aGlzLmFkZFZlcnRpY2FsU3BhY2UgPSBhZGRWZXJ0aWNhbFNwYWNlOw0KLQl9DQotDQotCXB1YmxpYyBpbnQgZ2V0SW5kZW50KCkgew0KLQkJcmV0dXJuIDA7DQotCX0NCi0NCi0JcHVibGljIGJvb2xlYW4gZ2V0QWRkVmVydGljYWxTcGFjZSgpIHsNCi0JCXJldHVybiBhZGRWZXJ0aWNhbFNwYWNlOw0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSVBhcmFncmFwaCNnZXRTZWdtZW50cygpDQotCSAqLw0KLQlwdWJsaWMgSVBhcmFncmFwaFNlZ21lbnRbXSBnZXRTZWdtZW50cygpIHsNCi0JCWlmIChzZWdtZW50cyA9PSBudWxsKQ0KLQkJCXJldHVybiBuZXcgSVBhcmFncmFwaFNlZ21lbnRbMF07DQotCQlyZXR1cm4gKElQYXJhZ3JhcGhTZWdtZW50W10pIHNlZ21lbnRzLnRvQXJyYXkoDQotCQkJbmV3IElQYXJhZ3JhcGhTZWdtZW50W3NlZ21lbnRzLnNpemUoKV0pOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIGFkZFNlZ21lbnQoSVBhcmFncmFwaFNlZ21lbnQgc2VnbWVudCkgew0KLQkJaWYgKHNlZ21lbnRzID09IG51bGwpDQotCQkJc2VnbWVudHMgPSBuZXcgVmVjdG9yKCk7DQotCQlzZWdtZW50cy5hZGQoc2VnbWVudCk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgcGFyc2VSZWd1bGFyVGV4dCgNCi0JCVN0cmluZyB0ZXh0LA0KLQkJYm9vbGVhbiBleHBhbmRVUkxzLA0KLQkJSHlwZXJsaW5rU2V0dGluZ3Mgc2V0dGluZ3MsDQotCQlTdHJpbmcgZm9udElkKSB7DQotCQlpZiAodGV4dC5sZW5ndGgoKSA9PSAwKQ0KLQkJCXJldHVybjsNCi0JCWlmIChleHBhbmRVUkxzKSB7DQotCQkJaW50IGxvYyA9IHRleHQuaW5kZXhPZihIVFRQKTsNCi0NCi0JCQlpZiAobG9jID09IC0xKQ0KLQkJCQlhZGRTZWdtZW50KG5ldyBUZXh0U2VnbWVudCh0ZXh0LCBmb250SWQpKTsNCi0JCQllbHNlIHsNCi0JCQkJaW50IHRleHRMb2MgPSAwOw0KLQkJCQl3aGlsZSAobG9jICE9IC0xKSB7DQotCQkJCQlhZGRTZWdtZW50KG5ldyBUZXh0U2VnbWVudCh0ZXh0LnN1YnN0cmluZyh0ZXh0TG9jLCBsb2MpLCBmb250SWQpKTsNCi0JCQkJCWJvb2xlYW4gYWRkZWQgPSBmYWxzZTsNCi0JCQkJCWZvciAodGV4dExvYyA9IGxvYzsgdGV4dExvYyA8IHRleHQubGVuZ3RoKCk7IHRleHRMb2MrKykgew0KLQkJCQkJCWNoYXIgYyA9IHRleHQuY2hhckF0KHRleHRMb2MpOw0KLQkJCQkJCWlmIChDaGFyYWN0ZXIuaXNTcGFjZUNoYXIoYykpIHsNCi0JCQkJCQkJYWRkSHlwZXJsaW5rU2VnbWVudCh0ZXh0LnN1YnN0cmluZyhsb2MsIHRleHRMb2MpLCBzZXR0aW5ncywgZm9udElkKTsNCi0JCQkJCQkJYWRkZWQgPSB0cnVlOw0KLQkJCQkJCQlicmVhazsNCi0JCQkJCQl9DQotCQkJCQl9DQotCQkJCQlpZiAoIWFkZGVkKSB7DQotCQkJCQkJLy8gdGhlcmUgd2FzIG5vIHNwYWNlIC0ganVzdCBlbmQgb2YgdGV4dA0KLQkJCQkJCWFkZEh5cGVybGlua1NlZ21lbnQodGV4dC5zdWJzdHJpbmcobG9jKSwgc2V0dGluZ3MsIGZvbnRJZCk7DQotCQkJCQkJYnJlYWs7DQotCQkJCQl9DQotCQkJCQlsb2MgPSB0ZXh0LmluZGV4T2YoSFRUUCwgdGV4dExvYyk7DQotCQkJCX0NCi0JCQkJaWYgKHRleHRMb2MgPCB0ZXh0Lmxlbmd0aCgpKSB7DQotCQkJCQlhZGRTZWdtZW50KG5ldyBUZXh0U2VnbWVudCh0ZXh0LnN1YnN0cmluZyh0ZXh0TG9jKSwgZm9udElkKSk7DQotCQkJCX0NCi0JCQl9DQotCQl9IGVsc2Ugew0KLQkJCWFkZFNlZ21lbnQobmV3IFRleHRTZWdtZW50KHRleHQsIGZvbnRJZCkpOw0KLQkJfQ0KLQl9DQotDQotCXByaXZhdGUgdm9pZCBhZGRIeXBlcmxpbmtTZWdtZW50KA0KLQkJU3RyaW5nIHRleHQsDQotCQlIeXBlcmxpbmtTZXR0aW5ncyBzZXR0aW5ncywNCi0JCVN0cmluZyBmb250SWQpIHsNCi0JCUh5cGVybGlua1NlZ21lbnQgaHMgPSBuZXcgSHlwZXJsaW5rU2VnbWVudCh0ZXh0LCBzZXR0aW5ncywgZm9udElkKTsNCi0JCWhzLnNldFdvcmRXcmFwQWxsb3dlZChmYWxzZSk7DQotCQlocy5zZXRBY3Rpb25JZChGb3JtRW5naW5lLlVSTF9IQU5ETEVSX0lEKTsNCi0JCWFkZFNlZ21lbnQoaHMpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHBhaW50KA0KLQkJR0MgZ2MsDQotCQlpbnQgd2lkdGgsDQotCQlMb2NhdG9yIGxvYywNCi0JCWludCBsaW5lSGVpZ2h0LA0KLQkJSGFzaHRhYmxlIG9iamVjdFRhYmxlLA0KLQkJSUh5cGVybGlua1NlZ21lbnQgc2VsZWN0ZWRMaW5rKSB7DQotCQlJUGFyYWdyYXBoU2VnbWVudCBbXSBzZWdtZW50cyA9IGdldFNlZ21lbnRzKCk7DQotCQlpZiAoc2VnbWVudHMubGVuZ3RoID4gMCkgew0KLQkJCWlmIChzZWdtZW50c1swXSBpbnN0YW5jZW9mIElUZXh0U2VnbWVudA0KLQkJCQkmJiAoKElUZXh0U2VnbWVudCkgc2VnbWVudHNbMF0pLmlzU2VsZWN0YWJsZSgpKQ0KLQkJCQlsb2MueCArPSAxOw0KLQkJCWZvciAoaW50IGogPSAwOyBqIDwgc2VnbWVudHMubGVuZ3RoOyBqKyspIHsNCi0JCQkJSVBhcmFncmFwaFNlZ21lbnQgc2VnbWVudCA9IHNlZ21lbnRzW2pdOw0KLQkJCQlib29sZWFuIGRvU2VsZWN0ID0gZmFsc2U7DQotCQkJCWlmIChzZWxlY3RlZExpbmsgIT0gbnVsbCAmJiBzZWdtZW50LmVxdWFscyhzZWxlY3RlZExpbmspKQ0KLQkJCQkJZG9TZWxlY3QgPSB0cnVlOw0KLQkJCQlzZWdtZW50LnBhaW50KGdjLCB3aWR0aCwgbG9jLCBvYmplY3RUYWJsZSwgZG9TZWxlY3QpOw0KLQkJCX0NCi0JCQlsb2MueSArPSBsb2Mucm93SGVpZ2h0Ow0KLQkJfSBlbHNlIHsNCi0JCQlsb2MueSArPSBsaW5lSGVpZ2h0Ow0KLQkJfQ0KLQl9DQotCXB1YmxpYyBTdHJpbmcgZ2V0QWNjZXNzaWJsZVRleHQoKSB7DQotCQlJUGFyYWdyYXBoU2VnbWVudCBbXSBzZWdtZW50cyA9IGdldFNlZ21lbnRzKCk7DQotCQlTdHJpbmdXcml0ZXIgc3dyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsNCi0JCVByaW50V3JpdGVyIHdyaXRlciA9IG5ldyBQcmludFdyaXRlcihzd3JpdGVyKTsNCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2VnbWVudHMubGVuZ3RoOyBpKyspIHsNCi0JCQlJUGFyYWdyYXBoU2VnbWVudCBzZWdtZW50ID0gc2VnbWVudHNbaV07DQotCQkJaWYgKHNlZ21lbnQgaW5zdGFuY2VvZiBJVGV4dFNlZ21lbnQpIHsNCi0JCQkJU3RyaW5nIHRleHQgPSAoKElUZXh0U2VnbWVudClzZWdtZW50KS5nZXRUZXh0KCk7DQotCQkJCXdyaXRlci5wcmludCh0ZXh0KTsNCi0JCQl9DQotCQl9DQotCQl3cml0ZXIucHJpbnRsbigpOw0KLQkJc3dyaXRlci5mbHVzaCgpOw0KLQkJcmV0dXJuIHN3cml0ZXIudG9TdHJpbmcoKTsNCi0JfQ0KLQlwdWJsaWMgSVRleHRTZWdtZW50IGZpbmRTZWdtZW50QXQoaW50IHgsIGludCB5KSB7DQotCQlpZiAoc2VnbWVudHMhPW51bGwpIHsNCi0JCQlmb3IgKGludCBpPTA7IGk8c2VnbWVudHMuc2l6ZSgpOyBpKyspIHsNCi0JCQkJSVBhcmFncmFwaFNlZ21lbnQgc2VnbWVudCA9IChJUGFyYWdyYXBoU2VnbWVudClzZWdtZW50cy5nZXQoaSk7DQotCQkJCWlmIChzZWdtZW50IGluc3RhbmNlb2YgSVRleHRTZWdtZW50KSB7DQotCQkJCQlJVGV4dFNlZ21lbnQgdGV4dFNlZ21lbnQgPSAoSVRleHRTZWdtZW50KXNlZ21lbnQ7DQotCQkJCQlpZiAodGV4dFNlZ21lbnQuY29udGFpbnMoeCwgeSkpDQotCQkJCQkJcmV0dXJuIHRleHRTZWdtZW50Ow0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL2VuZ2luZS9QYXJhZ3JhcGhTZWdtZW50LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvZW5naW5lL1BhcmFncmFwaFNlZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QxNmFhYy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvZW5naW5lL1BhcmFncmFwaFNlZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbC5lbmdpbmU7DQotDQotLyoqDQotICogQHZlcnNpb24gCTEuMA0KLSAqIEBhdXRob3INCi0gKi8NCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUGFyYWdyYXBoU2VnbWVudCBpbXBsZW1lbnRzIElQYXJhZ3JhcGhTZWdtZW50IHsNCi0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL2VuZ2luZS9UZXh0TW9kZWwuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9lbmdpbmUvVGV4dE1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlYzk2ODIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL2VuZ2luZS9UZXh0TW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMuaW50ZXJuYWwuZW5naW5lOw0KLQ0KLWltcG9ydCBqYXZhLmlvLio7DQotaW1wb3J0IGphdmEudXRpbC4qOw0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy4qOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zLmludGVybmFsLio7DQotaW1wb3J0IG9yZy53M2MuZG9tLio7DQotaW1wb3J0IG9yZy54bWwuc2F4Lio7DQotDQotLyoqDQotICogQHZlcnNpb24gCTEuMA0KLSAqIEBhdXRob3INCi0gKi8NCi1wdWJsaWMgY2xhc3MgVGV4dE1vZGVsIGltcGxlbWVudHMgSVRleHRNb2RlbCB7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZG9jdW1lbnRCdWlsZGVyRmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsNCi0NCi0JVmVjdG9yIHBhcmFncmFwaHM7DQotCUlIeXBlcmxpbmtMaXN0ZW5lciB1cmxMaXN0ZW5lcjsNCi0JSUh5cGVybGlua1NlZ21lbnRbXSBoeXBlcmxpbmtzOw0KLQlpbnQgc2VsZWN0ZWRMaW5rSW5kZXggPSAtMTsNCi0JSHlwZXJsaW5rU2V0dGluZ3MgaHlwZXJsaW5rU2V0dGluZ3M7DQotCQ0KLQlwdWJsaWMgVGV4dE1vZGVsKCkgew0KLQkJcmVzZXQoKTsNCi0JfQ0KLQ0KLQljbGFzcyBMb2NhbEh5cGVybGlua1NldHRpbmdzIGV4dGVuZHMgSHlwZXJsaW5rU2V0dGluZ3Mgew0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSVRleHRNb2RlbCNnZXRQYXJhZ3JhcGhzKCkNCi0JICovDQotCXB1YmxpYyBJUGFyYWdyYXBoW10gZ2V0UGFyYWdyYXBocygpIHsNCi0JCWlmIChwYXJhZ3JhcGhzID09IG51bGwpDQotCQkJcmV0dXJuIG5ldyBJUGFyYWdyYXBoWzBdOw0KLQkJcmV0dXJuIChJUGFyYWdyYXBoW10pIHBhcmFncmFwaHMudG9BcnJheSgNCi0JCQluZXcgSVBhcmFncmFwaFtwYXJhZ3JhcGhzLnNpemUoKV0pOw0KLQl9DQotCQ0KLQlwdWJsaWMgU3RyaW5nIGdldEFjY2Vzc2libGVUZXh0KCkgew0KLQkJaWYgKHBhcmFncmFwaHMgPT0gbnVsbCkNCi0JCQlyZXR1cm4gIiI7DQotCQlTdHJpbmdCdWZmZXIgc2J1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsNCi0JCWZvciAoaW50IGk9MDsgaTxwYXJhZ3JhcGhzLnNpemUoKTsgaSsrKSB7DQotCQkJSVBhcmFncmFwaCBwYXJhZ3JhcGggID0gKElQYXJhZ3JhcGgpcGFyYWdyYXBocy5nZXQoaSk7DQotCQkJU3RyaW5nIHRleHQgPSBwYXJhZ3JhcGguZ2V0QWNjZXNzaWJsZVRleHQoKTsNCi0JCQlzYnVmLmFwcGVuZCh0ZXh0KTsNCi0JCX0NCi0JCXJldHVybiBzYnVmLnRvU3RyaW5nKCk7DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBJVGV4dE1vZGVsI3BhcnNlKFN0cmluZykNCi0JICovDQotCXB1YmxpYyB2b2lkIHBhcnNlVGFnZ2VkVGV4dChTdHJpbmcgdGFnZ2VkVGV4dCwgYm9vbGVhbiBleHBhbmRVUkxzKQ0KLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQkJaWYgKHRhZ2dlZFRleHQ9PW51bGwpIHsNCi0JCQlyZXNldCgpOw0KLQkJCXJldHVybjsNCi0JCX0NCi0JCXRyeSB7DQotCQkJSW5wdXRTdHJlYW0gc3RyZWFtID0NCi0JCQkJbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHRhZ2dlZFRleHQuZ2V0Qnl0ZXMoIlVURjgiKSk7DQotCQkJcGFyc2VJbnB1dFN0cmVhbShzdHJlYW0sIGV4cGFuZFVSTHMpOw0KLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7DQotCQl9DQotCX0NCi0NCi0JcHVibGljIHZvaWQgcGFyc2VJbnB1dFN0cmVhbShJbnB1dFN0cmVhbSBpcywgYm9vbGVhbiBleHBhbmRVUkxzKQ0KLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQkJCQ0KLQkJZG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsNCi0JDQotCQlyZXNldCgpOw0KLQkJdHJ5IHsNCi0JCQlEb2N1bWVudEJ1aWxkZXIgcGFyc2VyID0gZG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsNCi0JCQlJbnB1dFNvdXJjZSBzb3VyY2UgPSBuZXcgSW5wdXRTb3VyY2UoaXMpOw0KLQkJCURvY3VtZW50IGRvYyA9IHBhcnNlci5wYXJzZShzb3VyY2UpOw0KLQkJCXByb2Nlc3NEb2N1bWVudChkb2MsIGV4cGFuZFVSTHMpOw0KLQkJfSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7DQotCQkJRm9ybXNQbHVnaW4ubG9nRXhjZXB0aW9uKGUpOw0KLQkJfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsNCi0JCQlGb3Jtc1BsdWdpbi5sb2dFeGNlcHRpb24oZSk7DQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7DQotCQkJRm9ybXNQbHVnaW4ubG9nRXhjZXB0aW9uKGUpOw0KLQkJfQ0KLQl9DQotDQotCXByaXZhdGUgdm9pZCBwcm9jZXNzRG9jdW1lbnQoRG9jdW1lbnQgZG9jLCBib29sZWFuIGV4cGFuZFVSTHMpIHsNCi0JCU5vZGUgcm9vdCA9IGRvYy5nZXREb2N1bWVudEVsZW1lbnQoKTsNCi0JCU5vZGVMaXN0IGNoaWxkcmVuID0gcm9vdC5nZXRDaGlsZE5vZGVzKCk7DQotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyBpKyspIHsNCi0JCQlOb2RlIGNoaWxkID0gY2hpbGRyZW4uaXRlbShpKTsNCi0JCQlpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgew0KLQkJCQkvLyBNYWtlIGFuIGltcGxpY2l0IHBhcmFncmFwaA0KLQkJCQlTdHJpbmcgdGV4dCA9IGNoaWxkLmdldE5vZGVWYWx1ZSgpOw0KLQkJCQlpZiAodGV4dCAhPSBudWxsICYmICFpc0lnbm9yYWJsZVdoaXRlU3BhY2UodGV4dCwgdHJ1ZSkpIHsNCi0JCQkJCVBhcmFncmFwaCBwID0gbmV3IFBhcmFncmFwaCh0cnVlKTsNCi0JCQkJCXAucGFyc2VSZWd1bGFyVGV4dCgNCi0JCQkJCQl0ZXh0LA0KLQkJCQkJCWV4cGFuZFVSTHMsDQotCQkJCQkJZ2V0SHlwZXJsaW5rU2V0dGluZ3MoKSwNCi0JCQkJCQludWxsKTsNCi0JCQkJCXBhcmFncmFwaHMuYWRkKHApOw0KLQkJCQl9DQotCQkJfSBlbHNlIGlmIChjaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7DQotCQkJCVN0cmluZyB0YWcgPSBjaGlsZC5nZXROb2RlTmFtZSgpLnRvTG93ZXJDYXNlKCk7DQotCQkJCWlmICh0YWcuZXF1YWxzKCJwIikpIHsNCi0JCQkJCUlQYXJhZ3JhcGggcCA9IHByb2Nlc3NQYXJhZ3JhcGgoY2hpbGQsIGV4cGFuZFVSTHMpOw0KLQkJCQkJaWYgKHAgIT0gbnVsbCkNCi0JCQkJCQlwYXJhZ3JhcGhzLmFkZChwKTsNCi0JCQkJfSBlbHNlIGlmICh0YWcuZXF1YWxzKCJsaSIpKSB7DQotCQkJCQlJUGFyYWdyYXBoIHAgPSBwcm9jZXNzTGlzdEl0ZW0oY2hpbGQsIGV4cGFuZFVSTHMpOw0KLQkJCQkJaWYgKHAgIT0gbnVsbCkNCi0JCQkJCQlwYXJhZ3JhcGhzLmFkZChwKTsNCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0JfQ0KLQlwcml2YXRlIElQYXJhZ3JhcGggcHJvY2Vzc1BhcmFncmFwaChOb2RlIHBhcmFncmFwaCwgYm9vbGVhbiBleHBhbmRVUkxzKSB7DQotCQlOb2RlTGlzdCBjaGlsZHJlbiA9IHBhcmFncmFwaC5nZXRDaGlsZE5vZGVzKCk7DQotCQlOYW1lZE5vZGVNYXAgYXR0cyA9IHBhcmFncmFwaC5nZXRBdHRyaWJ1dGVzKCk7DQotCQlOb2RlIGFkZFNwYWNlQXR0ID0gYXR0cy5nZXROYW1lZEl0ZW0oImFkZFZlcnRpY2FsU3BhY2UiKTsNCi0JCWJvb2xlYW4gYWRkU3BhY2UgPSB0cnVlOw0KLQ0KLQkJaWYgKGFkZFNwYWNlQXR0ICE9IG51bGwpIHsNCi0JCQlTdHJpbmcgdmFsdWUgPSBhZGRTcGFjZUF0dC5nZXROb2RlVmFsdWUoKTsNCi0JCQlhZGRTcGFjZSA9IHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKTsNCi0JCX0NCi0JCVBhcmFncmFwaCBwID0gbmV3IFBhcmFncmFwaChhZGRTcGFjZSk7DQotDQotCQlwcm9jZXNzU2VnbWVudHMocCwgY2hpbGRyZW4sIGV4cGFuZFVSTHMpOw0KLQkJcmV0dXJuIHA7DQotCX0NCi0JcHJpdmF0ZSBJUGFyYWdyYXBoIHByb2Nlc3NMaXN0SXRlbShOb2RlIGxpc3RJdGVtLCBib29sZWFuIGV4cGFuZFVSTHMpIHsNCi0JCU5vZGVMaXN0IGNoaWxkcmVuID0gbGlzdEl0ZW0uZ2V0Q2hpbGROb2RlcygpOw0KLQkJTmFtZWROb2RlTWFwIGF0dHMgPSBsaXN0SXRlbS5nZXRBdHRyaWJ1dGVzKCk7DQotCQlOb2RlIGFkZFNwYWNlQXR0ID0gYXR0cy5nZXROYW1lZEl0ZW0oImFkZFZlcnRpY2FsU3BhY2UiKTsNCi0JCU5vZGUgc3R5bGVBdHQgPSBhdHRzLmdldE5hbWVkSXRlbSgic3R5bGUiKTsNCi0JCU5vZGUgdmFsdWVBdHQgPSBhdHRzLmdldE5hbWVkSXRlbSgidmFsdWUiKTsNCi0JCU5vZGUgaW5kZW50QXR0ID0gYXR0cy5nZXROYW1lZEl0ZW0oImluZGVudCIpOw0KLQkJaW50IHN0eWxlID0gSUJ1bGxldFBhcmFncmFwaC5DSVJDTEU7DQotCQlpbnQgaW5kZW50ID0gLTE7DQotCQlTdHJpbmcgdGV4dCA9IG51bGw7DQotCQlib29sZWFuIGFkZFNwYWNlID0gdHJ1ZTsNCi0NCi0JCWlmIChhZGRTcGFjZUF0dCAhPSBudWxsKSB7DQotCQkJU3RyaW5nIHZhbHVlID0gYWRkU3BhY2VBdHQuZ2V0Tm9kZVZhbHVlKCk7DQotCQkJYWRkU3BhY2UgPSB2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIik7DQotCQl9DQotCQlpZiAoc3R5bGVBdHQgIT0gbnVsbCkgew0KLQkJCVN0cmluZyB2YWx1ZSA9IHN0eWxlQXR0LmdldE5vZGVWYWx1ZSgpOw0KLQkJCWlmICh2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJ0ZXh0IikpIHsNCi0JCQkJc3R5bGUgPSBJQnVsbGV0UGFyYWdyYXBoLlRFWFQ7DQotCQkJfSBlbHNlIGlmICh2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJpbWFnZSIpKSB7DQotCQkJCXN0eWxlID0gSUJ1bGxldFBhcmFncmFwaC5JTUFHRTsNCi0JCQl9DQotCQl9DQotCQlpZiAodmFsdWVBdHQgIT0gbnVsbCkgew0KLQkJCXRleHQgPSB2YWx1ZUF0dC5nZXROb2RlVmFsdWUoKTsNCi0JCX0NCi0JCWlmIChpbmRlbnRBdHQgIT0gbnVsbCkgew0KLQkJCVN0cmluZyB2YWx1ZSA9IGluZGVudEF0dC5nZXROb2RlVmFsdWUoKTsNCi0JCQl0cnkgew0KLQkJCQlpbmRlbnQgPSBJbnRlZ2VyLnBhcnNlSW50KHZhbHVlKTsNCi0JCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgew0KLQkJCX0NCi0JCX0NCi0NCi0JCUJ1bGxldFBhcmFncmFwaCBwID0gbmV3IEJ1bGxldFBhcmFncmFwaChhZGRTcGFjZSk7DQotCQlwLnNldEluZGVudChpbmRlbnQpOw0KLQkJcC5zZXRCdWxsZXRTdHlsZShzdHlsZSk7DQotCQlwLnNldEJ1bGxldFRleHQodGV4dCk7DQotDQotCQlwcm9jZXNzU2VnbWVudHMocCwgY2hpbGRyZW4sIGV4cGFuZFVSTHMpOw0KLQkJcmV0dXJuIHA7DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NTZWdtZW50cygNCi0JCVBhcmFncmFwaCBwLA0KLQkJTm9kZUxpc3QgY2hpbGRyZW4sDQotCQlib29sZWFuIGV4cGFuZFVSTHMpIHsNCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGkrKykgew0KLQkJCU5vZGUgY2hpbGQgPSBjaGlsZHJlbi5pdGVtKGkpOw0KLQkJCUlQYXJhZ3JhcGhTZWdtZW50IHNlZ21lbnQgPSBudWxsOw0KLQ0KLQkJCWlmIChjaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSB7DQotCQkJCVN0cmluZyB2YWx1ZSA9IGNoaWxkLmdldE5vZGVWYWx1ZSgpOw0KLQ0KLQkJCQlpZiAodmFsdWUgIT0gbnVsbCAmJiAhaXNJZ25vcmFibGVXaGl0ZVNwYWNlKHZhbHVlLCBmYWxzZSkpIHsNCi0JCQkJCXAucGFyc2VSZWd1bGFyVGV4dCgNCi0JCQkJCQl2YWx1ZSwNCi0JCQkJCQlleHBhbmRVUkxzLA0KLQkJCQkJCWdldEh5cGVybGlua1NldHRpbmdzKCksDQotCQkJCQkJbnVsbCk7DQotCQkJCX0NCi0JCQl9IGVsc2UgaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsNCi0JCQkJU3RyaW5nIG5hbWUgPSBjaGlsZC5nZXROb2RlTmFtZSgpOw0KLQkJCQlpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJpbWciKSkgew0KLQkJCQkJc2VnbWVudCA9IHByb2Nlc3NJbWFnZVNlZ21lbnQoY2hpbGQpOw0KLQkJCQl9IGVsc2UgaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiYSIpKSB7DQotCQkJCQlzZWdtZW50ID0NCi0JCQkJCQlwcm9jZXNzSHlwZXJsaW5rU2VnbWVudChjaGlsZCwgZ2V0SHlwZXJsaW5rU2V0dGluZ3MoKSk7DQotCQkJCX0gZWxzZSBpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJ0ZXh0IikpIHsNCi0JCQkJCXByb2Nlc3NUZXh0U2VnbWVudChwLCBleHBhbmRVUkxzLCBjaGlsZCk7DQotCQkJCX0gZWxzZSBpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJiIikpIHsNCi0JCQkJCVN0cmluZyB0ZXh0ID0gZ2V0Tm9kZVRleHQoY2hpbGQpLnRyaW0oKTsNCi0JCQkJCVN0cmluZyBmb250SWQgPSBKRmFjZVJlc291cmNlcy5CQU5ORVJfRk9OVDsNCi0JCQkJCXAucGFyc2VSZWd1bGFyVGV4dCgNCi0JCQkJCQl0ZXh0LA0KLQkJCQkJCWV4cGFuZFVSTHMsDQotCQkJCQkJZ2V0SHlwZXJsaW5rU2V0dGluZ3MoKSwNCi0JCQkJCQlmb250SWQpOw0KLQkJCQl9DQotCQkJfQ0KLQkJCWlmIChzZWdtZW50ICE9IG51bGwpIHsNCi0JCQkJcC5hZGRTZWdtZW50KHNlZ21lbnQpOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQ0KLQlwcml2YXRlIGJvb2xlYW4gaXNJZ25vcmFibGVXaGl0ZVNwYWNlKFN0cmluZyB0ZXh0LCBib29sZWFuIGlnbm9yZVNwYWNlcykgew0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXh0Lmxlbmd0aCgpOyBpKyspIHsNCi0JCQljaGFyIGMgPSB0ZXh0LmNoYXJBdChpKTsNCi0JCQlpZiAoaWdub3JlU3BhY2VzICYmIGMgPT0gJyAnKQ0KLQkJCQljb250aW51ZTsNCi0JCQlpZiAoYyA9PSAnXG4nIHx8IGMgPT0gJ1xyJyB8fCBjID09ICdcZicpDQotCQkJCWNvbnRpbnVlOw0KLQkJCXJldHVybiBmYWxzZTsNCi0JCX0NCi0JCXJldHVybiB0cnVlOw0KLQl9DQotDQotCXByaXZhdGUgSVBhcmFncmFwaFNlZ21lbnQgcHJvY2Vzc0ltYWdlU2VnbWVudChOb2RlIGltYWdlKSB7DQotCQlJbWFnZVNlZ21lbnQgc2VnbWVudCA9IG5ldyBJbWFnZVNlZ21lbnQoKTsNCi0JCU5hbWVkTm9kZU1hcCBhdHRzID0gaW1hZ2UuZ2V0QXR0cmlidXRlcygpOw0KLQkJTm9kZSBpZCA9IGF0dHMuZ2V0TmFtZWRJdGVtKCJocmVmIik7DQotCQlOb2RlIGFsaWduID0gYXR0cy5nZXROYW1lZEl0ZW0oImFsaWduIik7DQotCQlpZiAoaWQgIT0gbnVsbCkgew0KLQkJCVN0cmluZyB2YWx1ZSA9IGlkLmdldE5vZGVWYWx1ZSgpOw0KLQkJCXNlZ21lbnQuc2V0T2JqZWN0SWQodmFsdWUpOw0KLQkJfQ0KLQkJaWYgKGFsaWduICE9IG51bGwpIHsNCi0JCQlTdHJpbmcgdmFsdWUgPSBhbGlnbi5nZXROb2RlVmFsdWUoKS50b0xvd2VyQ2FzZSgpOw0KLQkJCWlmICh2YWx1ZS5lcXVhbHMoInRvcCIpKQ0KLQkJCQlzZWdtZW50LnNldFZlcnRpY2FsQWxpZ25tZW50KEltYWdlU2VnbWVudC5UT1ApOw0KLQkJCWVsc2UgaWYgKHZhbHVlLmVxdWFscygibWlkZGxlIikpDQotCQkJCXNlZ21lbnQuc2V0VmVydGljYWxBbGlnbm1lbnQoSW1hZ2VTZWdtZW50Lk1JRERMRSk7DQotCQkJZWxzZSBpZiAodmFsdWUuZXF1YWxzKCJib3R0b20iKSkNCi0JCQkJc2VnbWVudC5zZXRWZXJ0aWNhbEFsaWdubWVudChJbWFnZVNlZ21lbnQuQk9UVE9NKTsNCi0JCX0NCi0JCXJldHVybiBzZWdtZW50Ow0KLQl9DQotDQotCXByaXZhdGUgU3RyaW5nIGdldE5vZGVUZXh0KE5vZGUgbm9kZSkgew0KLQkJTm9kZUxpc3QgY2hpbGRyZW4gPSBub2RlLmdldENoaWxkTm9kZXMoKTsNCi0JCVN0cmluZyB0ZXh0ID0gIiI7DQotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyBpKyspIHsNCi0JCQlOb2RlIGNoaWxkID0gY2hpbGRyZW4uaXRlbShpKTsNCi0JCQlpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgew0KLQkJCQl0ZXh0ICs9IGNoaWxkLmdldE5vZGVWYWx1ZSgpOw0KLQkJCX0NCi0JCX0NCi0JCXJldHVybiB0ZXh0Ow0KLQl9DQotDQotCXByaXZhdGUgSVBhcmFncmFwaFNlZ21lbnQgcHJvY2Vzc0h5cGVybGlua1NlZ21lbnQoDQotCQlOb2RlIGxpbmssDQotCQlIeXBlcmxpbmtTZXR0aW5ncyBzZXR0aW5ncykgew0KLQkJU3RyaW5nIHRleHQgPSBnZXROb2RlVGV4dChsaW5rKTsNCi0JCUh5cGVybGlua1NlZ21lbnQgc2VnbWVudCA9IG5ldyBIeXBlcmxpbmtTZWdtZW50KHRleHQsIHNldHRpbmdzLCBudWxsKTsNCi0JCU5hbWVkTm9kZU1hcCBhdHRzID0gbGluay5nZXRBdHRyaWJ1dGVzKCk7DQotCQlOb2RlIGhyZWYgPSBhdHRzLmdldE5hbWVkSXRlbSgiaHJlZiIpOw0KLQkJaWYgKGhyZWYgIT0gbnVsbCkgew0KLQkJCVN0cmluZyB2YWx1ZSA9IGhyZWYuZ2V0Tm9kZVZhbHVlKCk7DQotCQkJc2VnbWVudC5zZXRBY3Rpb25JZCh2YWx1ZSk7DQotCQl9DQotCQlOb2RlIGFyZyA9IGF0dHMuZ2V0TmFtZWRJdGVtKCJhcmciKTsNCi0JCWlmIChhcmcgIT0gbnVsbCkgew0KLQkJCVN0cmluZyB2YWx1ZSA9IGFyZy5nZXROb2RlVmFsdWUoKTsNCi0JCQlzZWdtZW50LnNldEFyZyh2YWx1ZSk7DQotCQl9DQotCQlyZXR1cm4gc2VnbWVudDsNCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc1RleHRTZWdtZW50KA0KLQkJUGFyYWdyYXBoIHAsDQotCQlib29sZWFuIGV4cGFuZFVSTHMsDQotCQlOb2RlIHRleHROb2RlKSB7DQotCQlTdHJpbmcgdGV4dCA9IGdldE5vZGVUZXh0KHRleHROb2RlKS50cmltKCk7DQotDQotCQlOYW1lZE5vZGVNYXAgYXR0cyA9IHRleHROb2RlLmdldEF0dHJpYnV0ZXMoKTsNCi0JCU5vZGUgZm9udCA9IGF0dHMuZ2V0TmFtZWRJdGVtKCJmb250Iik7DQotCQlTdHJpbmcgZm9udElkID0gbnVsbDsNCi0JCWlmIChmb250ICE9IG51bGwpIHsNCi0JCQlmb250SWQgPSBmb250LmdldE5vZGVWYWx1ZSgpOw0KLQkJfQ0KLQkJcC5wYXJzZVJlZ3VsYXJUZXh0KHRleHQsIGV4cGFuZFVSTHMsIGdldEh5cGVybGlua1NldHRpbmdzKCksIGZvbnRJZCk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgcGFyc2VSZWd1bGFyVGV4dChTdHJpbmcgcmVndWxhclRleHQsIGJvb2xlYW4gY29udmVydFVSTHMpDQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQlyZXNldCgpOw0KLQkJDQotCQlpZiAocmVndWxhclRleHQ9PW51bGwpIHJldHVybjsNCi0NCi0JCVBhcmFncmFwaCBwID0gbmV3IFBhcmFncmFwaCh0cnVlKTsNCi0JCXBhcmFncmFwaHMuYWRkKHApOw0KLQkJaW50IHBzdGFydCA9IDA7DQotDQotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ3VsYXJUZXh0Lmxlbmd0aCgpOyBpKyspIHsNCi0JCQljaGFyIGMgPSByZWd1bGFyVGV4dC5jaGFyQXQoaSk7DQotCQkJaWYgKHAgPT0gbnVsbCkgew0KLQkJCQlwID0gbmV3IFBhcmFncmFwaCh0cnVlKTsNCi0JCQkJcGFyYWdyYXBocy5hZGQocCk7DQotCQkJfQ0KLQkJCWlmIChjID09ICdcbicpIHsNCi0JCQkJU3RyaW5nIHRleHQgPSByZWd1bGFyVGV4dC5zdWJzdHJpbmcocHN0YXJ0LCBpKTsNCi0JCQkJcHN0YXJ0ID0gaSArIDE7DQotCQkJCXAucGFyc2VSZWd1bGFyVGV4dCgNCi0JCQkJCXRleHQsDQotCQkJCQljb252ZXJ0VVJMcywNCi0JCQkJCWdldEh5cGVybGlua1NldHRpbmdzKCksDQotCQkJCQludWxsKTsNCi0JCQkJcCA9IG51bGw7DQotCQkJfQ0KLQkJfQ0KLQkJaWYgKHAgIT0gbnVsbCkgew0KLQkJCS8vIG5vIG5ldyBsaW5lDQotCQkJU3RyaW5nIHRleHQgPSByZWd1bGFyVGV4dC5zdWJzdHJpbmcocHN0YXJ0KTsNCi0JCQlwLnBhcnNlUmVndWxhclRleHQodGV4dCwgY29udmVydFVSTHMsIGdldEh5cGVybGlua1NldHRpbmdzKCksIG51bGwpOw0KLQkJfQ0KLQl9DQotDQotCXB1YmxpYyBIeXBlcmxpbmtTZXR0aW5ncyBnZXRIeXBlcmxpbmtTZXR0aW5ncygpIHsNCi0JCWlmIChoeXBlcmxpbmtTZXR0aW5ncyA9PSBudWxsKSB7DQotCQkJaHlwZXJsaW5rU2V0dGluZ3MgPSBuZXcgTG9jYWxIeXBlcmxpbmtTZXR0aW5ncygpOw0KLQkJfQ0KLQkJcmV0dXJuIGh5cGVybGlua1NldHRpbmdzOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHNldEh5cGVybGlua1NldHRpbmdzKEh5cGVybGlua1NldHRpbmdzIHNldHRpbmdzKSB7DQotCQl0aGlzLmh5cGVybGlua1NldHRpbmdzID0gc2V0dGluZ3M7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgc2V0VVJMTGlzdGVuZXIoSUh5cGVybGlua0xpc3RlbmVyIHVybExpc3RlbmVyKSB7DQotCQl0aGlzLnVybExpc3RlbmVyID0gdXJsTGlzdGVuZXI7DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIHJlc2V0KCkgew0KLQkJaWYgKHBhcmFncmFwaHMgPT0gbnVsbCkNCi0JCQlwYXJhZ3JhcGhzID0gbmV3IFZlY3RvcigpOw0KLQkJcGFyYWdyYXBocy5jbGVhcigpOw0KLQkJc2VsZWN0ZWRMaW5rSW5kZXggPSAtMTsNCi0JCWh5cGVybGlua3MgPSBudWxsOw0KLQl9DQotDQotCUlIeXBlcmxpbmtTZWdtZW50W10gZ2V0SHlwZXJsaW5rcygpIHsNCi0JCWlmIChoeXBlcmxpbmtzICE9IG51bGwgfHwgcGFyYWdyYXBocyA9PSBudWxsKQ0KLQkJCXJldHVybiBoeXBlcmxpbmtzOw0KLQkJVmVjdG9yIHJlc3VsdCA9IG5ldyBWZWN0b3IoKTsNCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyYWdyYXBocy5zaXplKCk7IGkrKykgew0KLQkJCUlQYXJhZ3JhcGggcCA9IChJUGFyYWdyYXBoKSBwYXJhZ3JhcGhzLmdldChpKTsNCi0JCQlJUGFyYWdyYXBoU2VnbWVudFtdIHNlZ21lbnRzID0gcC5nZXRTZWdtZW50cygpOw0KLQkJCWZvciAoaW50IGogPSAwOyBqIDwgc2VnbWVudHMubGVuZ3RoOyBqKyspIHsNCi0JCQkJaWYgKHNlZ21lbnRzW2pdIGluc3RhbmNlb2YgSUh5cGVybGlua1NlZ21lbnQpDQotCQkJCQlyZXN1bHQuYWRkKHNlZ21lbnRzW2pdKTsNCi0JCQl9DQotCQl9DQotCQloeXBlcmxpbmtzID0NCi0JCQkoSUh5cGVybGlua1NlZ21lbnRbXSkgcmVzdWx0LnRvQXJyYXkoDQotCQkJCW5ldyBJSHlwZXJsaW5rU2VnbWVudFtyZXN1bHQuc2l6ZSgpXSk7DQotCQlyZXR1cm4gaHlwZXJsaW5rczsNCi0JfQ0KLQ0KLQlwdWJsaWMgSUh5cGVybGlua1NlZ21lbnQgZmluZEh5cGVybGlua0F0KGludCB4LCBpbnQgeSkgew0KLQkJSUh5cGVybGlua1NlZ21lbnRbXSBsaW5rcyA9IGdldEh5cGVybGlua3MoKTsNCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlua3MubGVuZ3RoOyBpKyspIHsNCi0JCQlpZiAobGlua3NbaV0uY29udGFpbnMoeCwgeSkpDQotCQkJCXJldHVybiBsaW5rc1tpXTsNCi0JCX0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotCXB1YmxpYyBJVGV4dFNlZ21lbnQgZmluZFNlZ21lbnRBdChpbnQgeCwgaW50IHkpIHsNCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyYWdyYXBocy5zaXplKCk7IGkrKykgew0KLQkJCUlQYXJhZ3JhcGggcCA9IChJUGFyYWdyYXBoKSBwYXJhZ3JhcGhzLmdldChpKTsNCi0JCQlJVGV4dFNlZ21lbnQgc2VnbWVudCA9IHAuZmluZFNlZ21lbnRBdCh4LCB5KTsNCi0JCQlpZiAoc2VnbWVudCAhPSBudWxsKQ0KLQkJCQlyZXR1cm4gc2VnbWVudDsNCi0JCX0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCXB1YmxpYyBJSHlwZXJsaW5rU2VnbWVudCBnZXRTZWxlY3RlZExpbmsoKSB7DQotCQlpZiAoc2VsZWN0ZWRMaW5rSW5kZXggPT0gLTEpDQotCQkJcmV0dXJuIG51bGw7DQotCQlyZXR1cm4gaHlwZXJsaW5rc1tzZWxlY3RlZExpbmtJbmRleF07DQotCX0NCi0NCi0JcHVibGljIGJvb2xlYW4gdHJhdmVyc2VMaW5rcyhib29sZWFuIG5leHQpIHsNCi0JCUlIeXBlcmxpbmtTZWdtZW50W10gbGlua3MgPSBnZXRIeXBlcmxpbmtzKCk7DQotCQlpZiAobGlua3MgPT0gbnVsbCkNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQlpbnQgc2l6ZSA9IGxpbmtzLmxlbmd0aDsNCi0JCWlmIChuZXh0KSB7DQotCQkJc2VsZWN0ZWRMaW5rSW5kZXgrKzsNCi0JCX0gZWxzZQ0KLQkJCXNlbGVjdGVkTGlua0luZGV4LS07DQotDQotCQlpZiAoc2VsZWN0ZWRMaW5rSW5kZXggPCAwIHx8IHNlbGVjdGVkTGlua0luZGV4ID4gc2l6ZSAtIDEpIHsNCi0JCQlzZWxlY3RlZExpbmtJbmRleCA9IC0xOw0KLQkJfQ0KLQkJcmV0dXJuIHNlbGVjdGVkTGlua0luZGV4ICE9IC0xOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHNlbGVjdExpbmsoSUh5cGVybGlua1NlZ21lbnQgbGluaykgew0KLQkJaWYgKGxpbmsgPT0gbnVsbCkNCi0JCQlzZWxlY3RlZExpbmtJbmRleCA9IC0xOw0KLQkJZWxzZSB7DQotCQkJSUh5cGVybGlua1NlZ21lbnRbXSBsaW5rcyA9IGdldEh5cGVybGlua3MoKTsNCi0JCQlzZWxlY3RlZExpbmtJbmRleCA9IC0xOw0KLQkJCWlmIChsaW5rcyA9PSBudWxsKQ0KLQkJCQlyZXR1cm47DQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaW5rcy5sZW5ndGg7IGkrKykgew0KLQkJCQlpZiAobGlua3NbaV0uZXF1YWxzKGxpbmspKSB7DQotCQkJCQlzZWxlY3RlZExpbmtJbmRleCA9IGk7DQotCQkJCQlicmVhazsNCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0JfQ0KLQ0KLQlwdWJsaWMgYm9vbGVhbiBoYXNGb2N1c1NlZ21lbnRzKCkgew0KLQkJSUh5cGVybGlua1NlZ21lbnRbXSBsaW5rcyA9IGdldEh5cGVybGlua3MoKTsNCi0JCWlmIChsaW5rcy5sZW5ndGggPiAwKQ0KLQkJCXJldHVybiB0cnVlOw0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7DQotCQlpZiAoaHlwZXJsaW5rU2V0dGluZ3MgaW5zdGFuY2VvZiBMb2NhbEh5cGVybGlua1NldHRpbmdzKQ0KLQkJCWh5cGVybGlua1NldHRpbmdzLmRpc3Bvc2UoKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvZW5naW5lL1RleHRTZWdtZW50LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvZW5naW5lL1RleHRTZWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5ZWM1ZDEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL2VuZ2luZS9UZXh0U2VnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbC5lbmdpbmU7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsNCi1pbXBvcnQgamF2YS50ZXh0LkJyZWFrSXRlcmF0b3I7DQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7DQotDQotLyoqDQotICogQHZlcnNpb24gCTEuMA0KLSAqIEBhdXRob3INCi0gKi8NCi1wdWJsaWMgY2xhc3MgVGV4dFNlZ21lbnQgZXh0ZW5kcyBQYXJhZ3JhcGhTZWdtZW50IGltcGxlbWVudHMgSVRleHRTZWdtZW50IHsNCi0JcHJpdmF0ZSBDb2xvciBjb2xvcjsNCi0JcHJpdmF0ZSBTdHJpbmcgZm9udElkOw0KLQlwcml2YXRlIFN0cmluZyB0ZXh0Ow0KLQlwcm90ZWN0ZWQgYm9vbGVhbiB1bmRlcmxpbmU7DQotCXByaXZhdGUgYm9vbGVhbiB3cmFwQWxsb3dlZCA9IHRydWU7DQotCXByb3RlY3RlZCBWZWN0b3IgYXJlYVJlY3RhbmdsZXMgPSBuZXcgVmVjdG9yKCk7DQotCQ0KLQljbGFzcyBBcmVhUmVjdGFuZ2xlIHsNCi0JCVJlY3RhbmdsZSByZWN0Ow0KLQkJaW50IGZyb20sIHRvOw0KLQkJcHVibGljIEFyZWFSZWN0YW5nbGUoUmVjdGFuZ2xlIHJlY3QsIGludCBmcm9tLCBpbnQgdG8pIHsNCi0JCQl0aGlzLnJlY3QgPSByZWN0Ow0KLQkJCXRoaXMuZnJvbSA9IGZyb207DQotCQkJdGhpcy50byA9IHRvOw0KLQkJfQ0KLQkJcHVibGljIGJvb2xlYW4gY29udGFpbnMoaW50IHgsIGludCB5KSB7DQotCQkJcmV0dXJuIHJlY3QuY29udGFpbnMoeCwgeSk7DQotCQl9DQotCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7DQotCQkJaWYgKGZyb209PTAgJiYgdG89PSAtMSkNCi0JCQkJcmV0dXJuIFRleHRTZWdtZW50LnRoaXMuZ2V0VGV4dCgpOw0KLQkJCWlmIChmcm9tID4wICYmIHRvID09IC0xKQ0KLQkJCQlyZXR1cm4gVGV4dFNlZ21lbnQudGhpcy5nZXRUZXh0KCkuc3Vic3RyaW5nKGZyb20pOw0KLQkJCXJldHVybiBUZXh0U2VnbWVudC50aGlzLmdldFRleHQoKS5zdWJzdHJpbmcoZnJvbSwgdG8pOw0KLQkJfQ0KLQl9DQotCQ0KLQlwdWJsaWMgVGV4dFNlZ21lbnQoU3RyaW5nIHRleHQsIFN0cmluZyBmb250SWQpIHsNCi0JCXRoaXMudGV4dCA9IGNsZWFudXAodGV4dCk7DQotCQl0aGlzLmZvbnRJZCA9IGZvbnRJZDsNCi0JfQ0KLQ0KLQlwcml2YXRlIFN0cmluZyBjbGVhbnVwKFN0cmluZyB0ZXh0KSB7DQotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOw0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXh0Lmxlbmd0aCgpOyBpKyspIHsNCi0JCQljaGFyIGMgPSB0ZXh0LmNoYXJBdChpKTsNCi0JCQlpZiAoYyA9PSAnXG4nIHx8IGMgPT0gJ1xyJyB8fCBjPT0nXGYnKSB7DQotCQkJCWlmIChpID4gMCkNCi0JCQkJCWJ1Zi5hcHBlbmQoJyAnKTsNCi0JCQl9IGVsc2UNCi0JCQkJYnVmLmFwcGVuZChjKTsNCi0JCX0NCi0JCXJldHVybiBidWYudG9TdHJpbmcoKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBzZXRXb3JkV3JhcEFsbG93ZWQoYm9vbGVhbiB2YWx1ZSkgew0KLQkJd3JhcEFsbG93ZWQgPSB2YWx1ZTsNCi0JfQ0KLQ0KLQlwdWJsaWMgYm9vbGVhbiBpc1dvcmRXcmFwQWxsb3dlZCgpIHsNCi0JCXJldHVybiB3cmFwQWxsb3dlZDsNCi0JfQ0KLQkNCi0JcHVibGljIGJvb2xlYW4gaXNTZWxlY3RhYmxlKCkgew0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotDQotCXB1YmxpYyBDb2xvciBnZXRDb2xvcigpIHsNCi0JCXJldHVybiBjb2xvcjsNCi0JfQ0KLQ0KLQlwdWJsaWMgRm9udCBnZXRGb250KCkgew0KLQkJaWYgKGZvbnRJZCA9PSBudWxsKQ0KLQkJCXJldHVybiBKRmFjZVJlc291cmNlcy5nZXREZWZhdWx0Rm9udCgpOw0KLQkJZWxzZQ0KLQkJCXJldHVybiBKRmFjZVJlc291cmNlcy5nZXRGb250UmVnaXN0cnkoKS5nZXQoZm9udElkKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7DQotCQlyZXR1cm4gdGV4dDsNCi0JfQ0KLQ0KLQl2b2lkIHNldFRleHQoU3RyaW5nIHRleHQpIHsNCi0JCXRoaXMudGV4dCA9IGNsZWFudXAodGV4dCk7DQotCX0NCi0NCi0Jdm9pZCBzZXRDb2xvcihDb2xvciBjb2xvcikgew0KLQkJdGhpcy5jb2xvciA9IGNvbG9yOw0KLQl9DQotDQotCXZvaWQgc2V0Rm9udElkKFN0cmluZyBmb250SWQpIHsNCi0JCXRoaXMuZm9udElkID0gZm9udElkOw0KLQl9DQotDQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKGludCB4LCBpbnQgeSkgew0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmVhUmVjdGFuZ2xlcy5zaXplKCk7IGkrKykgew0KLQkJCUFyZWFSZWN0YW5nbGUgYXIgPSAoQXJlYVJlY3RhbmdsZSkgYXJlYVJlY3RhbmdsZXMuZ2V0KGkpOw0KLQkJCWlmIChhci5jb250YWlucyh4LCB5KSkNCi0JCQkJcmV0dXJuIHRydWU7DQotCQl9DQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi0JDQotCXB1YmxpYyBSZWN0YW5nbGUgZ2V0Qm91bmRzKCkgew0KLQkJaW50IHg9MCwgeT0wOw0KLQkJaW50IHdpZHRoID0gMCwgaGVpZ2h0ID0gMDsNCi0JCQ0KLQkJZm9yIChpbnQgaT0wOyBpPGFyZWFSZWN0YW5nbGVzLnNpemUoKTsgaSsrKSB7DQotCQkJQXJlYVJlY3RhbmdsZSBhciA9IChBcmVhUmVjdGFuZ2xlKWFyZWFSZWN0YW5nbGVzLmdldChpKTsNCi0JCQlpZiAoaT09MCkgeSA9IGFyLnJlY3QueTsNCi0JCQl4ID0gTWF0aC5taW4oYXIucmVjdC54LCB4KTsNCi0JCQl3aWR0aCA9IE1hdGgubWF4KGFyLnJlY3Qud2lkdGgsIHdpZHRoKTsNCi0JCQloZWlnaHQgKz0gYXIucmVjdC5oZWlnaHQ7DQotCQl9DQotCQlyZXR1cm4gbmV3IFJlY3RhbmdsZSh4LCB5LCB3aWR0aCwgaGVpZ2h0KTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBhZHZhbmNlTG9jYXRvcigNCi0JCUdDIGdjLA0KLQkJaW50IHdIaW50LA0KLQkJTG9jYXRvciBsb2NhdG9yLA0KLQkJSGFzaHRhYmxlIG9iamVjdFRhYmxlKSB7DQotCQlGb250IG9sZEZvbnQgPSBudWxsOw0KLQkJaWYgKGZvbnRJZCAhPSBudWxsKSB7DQotCQkJb2xkRm9udCA9IGdjLmdldEZvbnQoKTsNCi0JCQlnYy5zZXRGb250KGdldEZvbnQoKSk7DQotCQl9DQotCQlGb250TWV0cmljcyBmbSA9IGdjLmdldEZvbnRNZXRyaWNzKCk7DQotCQlpbnQgbGluZUhlaWdodCA9IGZtLmdldEhlaWdodCgpOw0KLQ0KLQkJaWYgKHdIaW50ID09IFNXVC5ERUZBVUxUIHx8ICF3cmFwQWxsb3dlZCkgew0KLQkJCVBvaW50IGV4dGVudCA9IGdjLnRleHRFeHRlbnQodGV4dCk7DQotDQotCQkJaWYgKGxvY2F0b3IueCArIGV4dGVudC54ID4gd0hpbnQpIHsNCi0JCQkJLy8gbmV3IGxpbmUNCi0JCQkJbG9jYXRvci54ID0gaXNTZWxlY3RhYmxlKCk/bG9jYXRvci5pbmRlbnQrMTpsb2NhdG9yLmluZGVudDsNCi0JCQkJbG9jYXRvci55ICs9IGxvY2F0b3Iucm93SGVpZ2h0Ow0KLQkJCQlsb2NhdG9yLnJvd0hlaWdodCA9IDA7DQotCQkJfQ0KLQkJCWludCB3aWR0aCA9IGV4dGVudC54Ow0KLQkJCWlmIChpc1NlbGVjdGFibGUoKSkgd2lkdGgrPTI7DQotCQkJbG9jYXRvci54ICs9IHdpZHRoOw0KLQkJCWxvY2F0b3Iud2lkdGggPSB3aWR0aDsNCi0JCQlsb2NhdG9yLmhlaWdodCA9IGV4dGVudC55Ow0KLQkJCWxvY2F0b3Iucm93SGVpZ2h0ID0gTWF0aC5tYXgobG9jYXRvci5yb3dIZWlnaHQsIGV4dGVudC55KTsNCi0JCQlyZXR1cm47DQotCQl9DQotDQotCQlCcmVha0l0ZXJhdG9yIHdiID0gQnJlYWtJdGVyYXRvci5nZXRMaW5lSW5zdGFuY2UoKTsNCi0JCXdiLnNldFRleHQodGV4dCk7DQotDQotCQlpbnQgc2F2ZWQgPSAwOw0KLQkJaW50IGxhc3QgPSAwOw0KLQ0KLQkJaW50IHdpZHRoID0gMDsNCi0NCi0JCVBvaW50IGxhc3RFeHRlbnQgPSBudWxsOw0KLQ0KLQkJZm9yIChpbnQgbG9jID0gd2IuZmlyc3QoKTsgbG9jICE9IEJyZWFrSXRlcmF0b3IuRE9ORTsgbG9jID0gd2IubmV4dCgpKSB7DQotCQkJU3RyaW5nIHdvcmQgPSB0ZXh0LnN1YnN0cmluZyhzYXZlZCwgbG9jKTsNCi0JCQlQb2ludCBleHRlbnQgPSBnYy50ZXh0RXh0ZW50KHdvcmQpOw0KLQ0KLQkJCWlmIChsb2NhdG9yLnggKyBleHRlbnQueCA+IHdIaW50KSB7DQotCQkJCS8vIG92ZXJmbG93DQotCQkJCVN0cmluZyBzYXZlZFdvcmQgPSB0ZXh0LnN1YnN0cmluZyhzYXZlZCwgbGFzdCk7DQotCQkJCWlmIChsYXN0RXh0ZW50PT1udWxsKQ0KLQkJCQkgICBsYXN0RXh0ZW50ID0gZ2MudGV4dEV4dGVudChzYXZlZFdvcmQpOw0KLQkJCQlpbnQgbGluZVdpZHRoID0gbG9jYXRvci54ICsgbGFzdEV4dGVudC54Ow0KLQkJCQlpZiAoaXNTZWxlY3RhYmxlKCkpIGxpbmVXaWR0aCs9MjsNCi0NCi0JCQkJc2F2ZWQgPSBsYXN0Ow0KLQkJCQlsb2NhdG9yLnJvd0hlaWdodCA9IE1hdGgubWF4KGxvY2F0b3Iucm93SGVpZ2h0LCBsYXN0RXh0ZW50LnkpOw0KLQkJCQlsb2NhdG9yLnggPSBpc1NlbGVjdGFibGUoKT9sb2NhdG9yLmluZGVudCsxOmxvY2F0b3IuaW5kZW50Ow0KLQkJCQlsb2NhdG9yLnkgKz0gbG9jYXRvci5yb3dIZWlnaHQ7DQotCQkJCWxvY2F0b3Iucm93SGVpZ2h0ID0gMDsNCi0JCQkJd2lkdGggPSBNYXRoLm1heCh3aWR0aCwgbGluZVdpZHRoKTsNCi0JCQl9DQotCQkJbGFzdCA9IGxvYzsNCi0JCQlsYXN0RXh0ZW50ID0gZXh0ZW50Ow0KLQkJfQ0KLQkJU3RyaW5nIGxhc3RTdHJpbmcgPSB0ZXh0LnN1YnN0cmluZyhzYXZlZCwgbGFzdCk7DQotCQlQb2ludCBleHRlbnQgPSBnYy50ZXh0RXh0ZW50KGxhc3RTdHJpbmcpOw0KLQkJaW50IGxpbmVXaWR0aCA9IGV4dGVudC54Ow0KLQkJaWYgKGlzU2VsZWN0YWJsZSgpKSBsaW5lV2lkdGggKz0gMjsNCi0JCWxvY2F0b3IueCArPSBsaW5lV2lkdGg7DQotCQlsb2NhdG9yLndpZHRoID0gd2lkdGg7DQotCQlsb2NhdG9yLmhlaWdodCA9IGxpbmVIZWlnaHQ7DQotCQlsb2NhdG9yLnJvd0hlaWdodCA9IE1hdGgubWF4KGxvY2F0b3Iucm93SGVpZ2h0LCBleHRlbnQueSk7DQotCQlpZiAob2xkRm9udCAhPSBudWxsKSB7DQotCQkJZ2Muc2V0Rm9udChvbGRGb250KTsNCi0JCX0NCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgcGFpbnQoDQotCQlHQyBnYywNCi0JCWludCB3aWR0aCwNCi0JCUxvY2F0b3IgbG9jYXRvciwNCi0JCUhhc2h0YWJsZSBvYmplY3RUYWJsZSwNCi0JCWJvb2xlYW4gc2VsZWN0ZWQpIHsNCi0JCUZvbnQgb2xkRm9udCA9IG51bGw7DQotCQlDb2xvciBvbGRDb2xvciA9IG51bGw7DQotDQotCQlhcmVhUmVjdGFuZ2xlcy5jbGVhcigpOw0KLQ0KLQkJaWYgKGZvbnRJZCAhPSBudWxsKSB7DQotCQkJb2xkRm9udCA9IGdjLmdldEZvbnQoKTsNCi0JCQlnYy5zZXRGb250KGdldEZvbnQoKSk7DQotCQl9DQotCQlpZiAoY29sb3IgIT0gbnVsbCkgew0KLQkJCW9sZENvbG9yID0gZ2MuZ2V0Rm9yZWdyb3VuZCgpOw0KLQkJCWdjLnNldEZvcmVncm91bmQoY29sb3IpOw0KLQkJfQ0KLQkJRm9udE1ldHJpY3MgZm0gPSBnYy5nZXRGb250TWV0cmljcygpOw0KLQkJaW50IGxpbmVIZWlnaHQgPSBmbS5nZXRIZWlnaHQoKTsNCi0JCWludCBkZXNjZW50ID0gZm0uZ2V0RGVzY2VudCgpOw0KLQ0KLQkJaWYgKCF3cmFwQWxsb3dlZCkgew0KLQkJCVBvaW50IGV4dGVudCA9IGdjLnRleHRFeHRlbnQodGV4dCk7DQotCQkJaW50IGV3aWR0aCA9IGV4dGVudC54Ow0KLQkJCWlmIChpc1NlbGVjdGFibGUoKSkgZXdpZHRoICs9IDI7DQotDQotCQkJaWYgKGxvY2F0b3IueCArIGV3aWR0aCA+IHdpZHRoKSB7DQotCQkJCS8vIG5ldyBsaW5lDQotCQkJCWxvY2F0b3IucmVzZXRDYXJldCgpOw0KLQkJCQlpZiAoaXNTZWxlY3RhYmxlKCkpIGxvY2F0b3IueCArPSAxOw0KLQkJCQlsb2NhdG9yLnkgKz0gbG9jYXRvci5yb3dIZWlnaHQ7DQotCQkJCWxvY2F0b3Iucm93SGVpZ2h0ID0gMDsNCi0JCQl9DQotCQkJZ2MuZHJhd1N0cmluZyh0ZXh0LCBsb2NhdG9yLngsIGxvY2F0b3IueSk7DQotCQkJaWYgKHVuZGVybGluZSkgew0KLQkJCQlpbnQgbGluZVkgPSBsb2NhdG9yLnkgKyBsaW5lSGVpZ2h0IC0gZGVzY2VudCArIDE7DQotCQkJCWdjLmRyYXdMaW5lKGxvY2F0b3IueCwgbGluZVksIGxvY2F0b3IueCArIGV4dGVudC54LCBsaW5lWSk7DQotCQkJfQ0KLQkJCVJlY3RhbmdsZSBiciA9DQotCQkJCW5ldyBSZWN0YW5nbGUobG9jYXRvci54IC0gMSwgbG9jYXRvci55LCBleHRlbnQueCArIDIsIGxpbmVIZWlnaHQgLSBkZXNjZW50ICsgMyk7DQotCQkJYXJlYVJlY3RhbmdsZXMuYWRkKG5ldyBBcmVhUmVjdGFuZ2xlKGJyLCAwLCAtMSkpOw0KLQkJCWlmIChzZWxlY3RlZCkgew0KLQkJCQlpZiAoY29sb3IgIT0gbnVsbCkNCi0JCQkJCWdjLnNldEZvcmVncm91bmQob2xkQ29sb3IpOw0KLQkJCQlnYy5kcmF3Rm9jdXMoYnIueCwgYnIueSwgYnIud2lkdGgsIGJyLmhlaWdodCk7DQotCQkJfQ0KLQ0KLQkJCWxvY2F0b3IueCArPSBld2lkdGg7DQotCQkJbG9jYXRvci53aWR0aCA9IGV3aWR0aDsNCi0JCQlsb2NhdG9yLmhlaWdodCA9IGxpbmVIZWlnaHQ7DQotCQkJbG9jYXRvci5yb3dIZWlnaHQgPSBNYXRoLm1heChsb2NhdG9yLnJvd0hlaWdodCwgZXh0ZW50LnkpOw0KLQkJCWlmIChvbGRGb250ICE9IG51bGwpIHsNCi0JCQkJZ2Muc2V0Rm9udChvbGRGb250KTsNCi0JCQl9DQotCQkJaWYgKG9sZENvbG9yICE9IG51bGwpIHsNCi0JCQkJZ2Muc2V0Rm9yZWdyb3VuZChvbGRDb2xvcik7DQotCQkJfQ0KLQkJCXJldHVybjsNCi0JCX0NCi0NCi0JCUJyZWFrSXRlcmF0b3Igd2IgPSBCcmVha0l0ZXJhdG9yLmdldExpbmVJbnN0YW5jZSgpOw0KLQkJd2Iuc2V0VGV4dCh0ZXh0KTsNCi0NCi0JCWludCBzYXZlZCA9IDA7DQotCQlpbnQgbGFzdCA9IDA7DQotDQotCQlmb3IgKGludCBsb2MgPSB3Yi5maXJzdCgpOyBsb2MgIT0gQnJlYWtJdGVyYXRvci5ET05FOyBsb2MgPSB3Yi5uZXh0KCkpIHsNCi0JCQlpZiAobG9jID09IDApDQotCQkJCWNvbnRpbnVlOw0KLQkJCVN0cmluZyB3b3JkID0gdGV4dC5zdWJzdHJpbmcoc2F2ZWQsIGxvYyk7DQotCQkJUG9pbnQgZXh0ZW50ID0gZ2MudGV4dEV4dGVudCh3b3JkKTsNCi0JCQlpbnQgZXdpZHRoID0gZXh0ZW50Lng7DQotCQkJaWYgKGlzU2VsZWN0YWJsZSgpKSBld2lkdGggKz0gMjsNCi0NCi0JCQlpZiAobG9jYXRvci54ICsgZXdpZHRoID4gd2lkdGgpIHsNCi0JCQkJLy8gb3ZlcmZsb3cNCi0JCQkJU3RyaW5nIHByZXZMaW5lID0gdGV4dC5zdWJzdHJpbmcoc2F2ZWQsIGxhc3QpOw0KLQkJCQlnYy5kcmF3U3RyaW5nKHByZXZMaW5lLCBsb2NhdG9yLngsIGxvY2F0b3IueSwgdHJ1ZSk7DQotCQkJCVBvaW50IHByZXZFeHRlbnQgPSBnYy50ZXh0RXh0ZW50KHByZXZMaW5lKTsNCi0JCQkJaW50IHByZXZXaWR0aCA9IHByZXZFeHRlbnQueDsNCi0JCQkJaWYgKGlzU2VsZWN0YWJsZSgpKSBwcmV2V2lkdGggKz0gMjsNCi0NCi0JCQkJaWYgKHVuZGVybGluZSkgew0KLQkJCQkJaW50IGxpbmVZID0gbG9jYXRvci55ICsgbGluZUhlaWdodCAtIGRlc2NlbnQgKyAxOw0KLQkJCQkJZ2MuZHJhd0xpbmUobG9jYXRvci54LCBsaW5lWSwgbG9jYXRvci54ICsgcHJldldpZHRoLCBsaW5lWSk7DQotCQkJCX0NCi0JCQkJUmVjdGFuZ2xlIGJyID0NCi0JCQkJCW5ldyBSZWN0YW5nbGUoDQotCQkJCQkJbG9jYXRvci54IC0gMSwNCi0JCQkJCQlsb2NhdG9yLnksDQotCQkJCQkJcHJldkV4dGVudC54ICsgMiwNCi0JCQkJCQlsaW5lSGVpZ2h0IC0gZGVzY2VudCArIDMpOw0KLQkJCQlpZiAoc2VsZWN0ZWQpIHsNCi0JCQkJCWlmIChjb2xvciAhPSBudWxsKQ0KLQkJCQkJCWdjLnNldEZvcmVncm91bmQob2xkQ29sb3IpOw0KLQkJCQkJZ2MuZHJhd0ZvY3VzKGJyLngsIGJyLnksIGJyLndpZHRoLCBici5oZWlnaHQpOw0KLQkJCQkJaWYgKGNvbG9yICE9IG51bGwpDQotCQkJCQkJZ2Muc2V0Rm9yZWdyb3VuZChjb2xvcik7DQotCQkJCX0NCi0JCQkJYXJlYVJlY3RhbmdsZXMuYWRkKG5ldyBBcmVhUmVjdGFuZ2xlKGJyLCBzYXZlZCwgbGFzdCkpOw0KLQkJCQkNCi0JCQkJbG9jYXRvci5yb3dIZWlnaHQgPSBNYXRoLm1heChsb2NhdG9yLnJvd0hlaWdodCwgcHJldkV4dGVudC55KTsNCi0JCQkJbG9jYXRvci5yZXNldENhcmV0KCk7DQotCQkJCWlmIChpc1NlbGVjdGFibGUoKSkgbG9jYXRvci54ICs9MTsNCi0JCQkJbG9jYXRvci55ICs9IGxvY2F0b3Iucm93SGVpZ2h0Ow0KLQkJCQlsb2NhdG9yLnJvd0hlaWdodCA9IDA7DQotCQkJCXNhdmVkID0gbGFzdDsNCi0JCQl9DQotCQkJbGFzdCA9IGxvYzsNCi0JCX0NCi0JCS8vIHBhaW50IHRoZSBsYXN0IGxpbmUNCi0JCVN0cmluZyBsYXN0TGluZSA9IHRleHQuc3Vic3RyaW5nKHNhdmVkLCBsYXN0KTsNCi0JCWdjLmRyYXdTdHJpbmcobGFzdExpbmUsIGxvY2F0b3IueCwgbG9jYXRvci55LCB0cnVlKTsNCi0JCVBvaW50IGxhc3RFeHRlbnQgPSBnYy50ZXh0RXh0ZW50KGxhc3RMaW5lKTsNCi0JCWludCBsYXN0V2lkdGggPSBsYXN0RXh0ZW50Lng7DQotCQlpZiAoaXNTZWxlY3RhYmxlKCkpIGxhc3RXaWR0aCArPSAyOw0KLQkJUmVjdGFuZ2xlIGJyID0NCi0JCQluZXcgUmVjdGFuZ2xlKA0KLQkJCQlsb2NhdG9yLnggLSAxLA0KLQkJCQlsb2NhdG9yLnksDQotCQkJCWxhc3RFeHRlbnQueCArIDIsDQotCQkJCWxpbmVIZWlnaHQgLSBkZXNjZW50ICsgMyk7DQotCQlhcmVhUmVjdGFuZ2xlcy5hZGQobmV3IEFyZWFSZWN0YW5nbGUoYnIsIHNhdmVkLCBsYXN0KSk7DQotCQlpZiAodW5kZXJsaW5lKSB7DQotCQkJaW50IGxpbmVZID0gbG9jYXRvci55ICsgbGluZUhlaWdodCAtIGRlc2NlbnQgKyAxOw0KLQkJCWdjLmRyYXdMaW5lKGxvY2F0b3IueCwgbGluZVksIGxvY2F0b3IueCArIGxhc3RFeHRlbnQueCwgbGluZVkpOw0KLQkJfQ0KLQkJaWYgKHNlbGVjdGVkKSB7DQotCQkJaWYgKGNvbG9yICE9IG51bGwpDQotCQkJCWdjLnNldEZvcmVncm91bmQob2xkQ29sb3IpOw0KLQkJCWdjLmRyYXdGb2N1cyhici54LCBici55LCBici53aWR0aCwgYnIuaGVpZ2h0KTsNCi0JCX0NCi0JCWxvY2F0b3IueCArPSBsYXN0V2lkdGg7DQotCQlsb2NhdG9yLnJvd0hlaWdodCA9IE1hdGgubWF4KGxvY2F0b3Iucm93SGVpZ2h0LCBsYXN0RXh0ZW50LnkpOw0KLQkJaWYgKG9sZEZvbnQgIT0gbnVsbCkgew0KLQkJCWdjLnNldEZvbnQob2xkRm9udCk7DQotCQl9DQotCQlpZiAob2xkQ29sb3IgIT0gbnVsbCkgew0KLQkJCWdjLnNldEZvcmVncm91bmQob2xkQ29sb3IpOw0KLQkJfQ0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCBwYWludEZvY3VzKEdDIGdjLCBDb2xvciBiZywgQ29sb3IgZmcsIGJvb2xlYW4gc2VsZWN0ZWQpIHsNCi0JCWlmIChhcmVhUmVjdGFuZ2xlcz09bnVsbCkgcmV0dXJuOw0KLQkJZm9yIChpbnQgaT0wOyBpPGFyZWFSZWN0YW5nbGVzLnNpemUoKTsgaSsrKSB7DQotCQkJQXJlYVJlY3RhbmdsZSBhcmVhUmVjdGFuZ2xlID0gKEFyZWFSZWN0YW5nbGUpYXJlYVJlY3RhbmdsZXMuZ2V0KGkpOw0KLQkJCVJlY3RhbmdsZSBiciA9IGFyZWFSZWN0YW5nbGUucmVjdDsNCi0JCQlpZiAoc2VsZWN0ZWQpIHsNCi0JCQkJZ2Muc2V0QmFja2dyb3VuZChiZyk7DQotCQkJCWdjLnNldEZvcmVncm91bmQoZmcpOw0KLQkJCQlnYy5kcmF3Rm9jdXMoYnIueCwgYnIueSwgYnIud2lkdGgsIGJyLmhlaWdodCk7DQotCQkJfQ0KLQkJCWVsc2Ugew0KLQkJCQlnYy5zZXRGb3JlZ3JvdW5kKGJnKTsNCi0JCQkJZ2MuZHJhd1JlY3RhbmdsZShici54LCBici55LCBici53aWR0aC0xLCBici5oZWlnaHQtMSk7DQotCQkJfQ0KLQkJfQ0KLQl9CQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvaW1hZ2UxLmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9pbWFnZTEuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWM5NGVlLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9pbWFnZTEuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL2luZGV4LnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9pbmRleC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3MzJmODcuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL2luZGV4LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGZvcm0+DQotPHA+DQotVG8gY2hlY2sgZm9yIHVwZGF0ZXMgZm9yIGZlYXR1cmVzIHlvdSBoYXZlIGluc3RhbGxlZCwgDQotZ28gdG8gdGhlIDxhIGhyZWY9ImFjdGlvbjEiPk15IEVjbGlwc2UgMTwvYT4gYW5kIHNlbGVjdCANCi08Yj5BdmFpbGFibGUgVXBkYXRlczwvYj4gZm9sZGVyLiA8Yj5TZWFyY2ggcGFnZTwvYj4gd2lsbCANCi1iZSBzaG93biBhbGxvd2luZyB5b3UgdG8gaW5pdGlhdGUgYW5kIGN1c3RvbWl6ZSB0aGUgc2VhcmNoLiANCi1Ob3cgd2UgPGI+d2lsbDwvYj4gYWRkIGFuIA0KLTxpbWcgaHJlZj0iaW1hZ2UxIi8+IA0KLWltYWdlIGhlcmUuIEp1c3QNCi0gdG8gc2hvdyBob3cgd3JhcHBpbmcgc2hvdWxkIGFwcGx5IHRvIGltYWdlcyB3aGVuIHRoZXkgYXJlIA0KLSBsYXJnZXIgdGhhbiB0aGUgcmVndWxhciB0ZXh0Lg0KLTwvcD4NCi08bGkgc3R5bGU9InRleHQiIHZhbHVlPSIxLiI+VG8gY2hlY2sgZm9yIHVwZGF0ZXMgZm9yIGZlYXR1cmVzIHlvdSBoYXZlIGluc3RhbGxlZCwgDQotZ28gdG8gdGhlIDxhIGhyZWY9ImFjdGlvbjIiPk15IEVjbGlwc2UgMjwvYT4gYW5kIHNlbGVjdCANCi08Yj5BdmFpbGFibGUgVXBkYXRlczwvYj4gZm9sZGVyLiA8Yj5TZWFyY2ggcGFnZTwvYj4gd2lsbCANCi1iZSBzaG93biBhbGxvd2luZyB5b3UgdG8gaW5pdGlhdGUgYW5kIGN1c3RvbWl6ZSB0aGUgc2VhcmNoLjwvbGk+DQotPGxpIHN0eWxlPSJ0ZXh0IiB2YWx1ZT0iMi4iPlRoaXMgaXMgdGhlIGl0ZW0gbnVtYmVyIDIuPC9saT4NCi08bGkgc3R5bGU9InRleHQiIHZhbHVlPSIzLiI+VGhpcyBpcyB0aGUgaXRlbSBudW1iZXIgMy48L2xpPg0KLTxsaT5UaGlzIGlzIHRoZSBidWxsZXQgaXRlbS48L2xpPg0KLTxsaT5UaGlzIGlzIGFub3RoZXIgYnVsbGV0IGl0ZW0uPC9saT4NCi08L2Zvcm0+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi8uY2xhc3NwYXRoIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTRkMjcwLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNsYXNzcGF0aD4NCi0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjLyIvPg0KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSIvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMiLz4NCi0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iL29yZy5lY2xpcHNlLnVpIi8+DQotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9Ii9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMiLz4NCi0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iL29yZy5lY2xpcHNlLmhlbHAiLz4NCi0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iL29yZy5lY2xpcHNlLmNvcmUuYm9vdCIvPg0KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSIvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIi8+DQotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPg0KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCi08L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyLy5jdnNpZ25vcmUgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMDc3YTQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyLy5wcm9qZWN0IGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI0MWY5MC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cHJvamVjdERlc2NyaXB0aW9uPg0KLQk8bmFtZT5vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzI8L25hbWU+DQotCTxjb21tZW50PjwvY29tbWVudD4NCi0JPHByb2plY3RzPg0KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuY29yZS5ib290PC9wcm9qZWN0Pg0KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM8L3Byb2plY3Q+DQotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU8L3Byb2plY3Q+DQotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5oZWxwPC9wcm9qZWN0Pg0KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UudWk8L3Byb2plY3Q+DQotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXM8L3Byb2plY3Q+DQotCTwvcHJvamVjdHM+DQotCTxidWlsZFNwZWM+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JPC9idWlsZFNwZWM+DQotCTxuYXR1cmVzPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4NCi0JPC9uYXR1cmVzPg0KLTwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvYWJvdXQuaHRtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRiNDExYS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+MjB0aCBKdW5lLCAyMDAyPC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLTxwPkVjbGlwc2Uub3JnIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0NQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIENQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgQ1BMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxoMz5Db250cmlidXRpb25zPC9oMz4KLQotPHA+SWYgdGhpcyBDb250ZW50IGlzIGxpY2Vuc2VkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIENQTCwgYW55IENvbnRyaWJ1dGlvbnMsIGFzIGRlZmluZWQgaW4gdGhlIENQTCwgdXBsb2FkZWQsIHN1Ym1pdHRlZCwgb3Igb3RoZXJ3aXNlCi1tYWRlIGF2YWlsYWJsZSB0byBFY2xpcHNlLm9yZywgbWVtYmVycyBvZiBFY2xpcHNlLm9yZyBhbmQvb3IgdGhlIGhvc3Qgb2YgRWNsaXBzZS5vcmcgd2ViIHNpdGUsIGJ5IHlvdSB0aGF0IHJlbGF0ZSB0byBzdWNoCi1Db250ZW50IGFyZSBwcm92aWRlZCB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIENQTCBhbmQgY2FuIGJlIG1hZGUgYXZhaWxhYmxlIHRvIG90aGVycyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENQTC48L3A+Ci0KLTxwPklmIHRoaXMgQ29udGVudCBpcyBsaWNlbnNlZCB0byB5b3UgdW5kZXIgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvdGhlciB0aGFuIHRoZSBDUEwgKCZxdW90O090aGVyIExpY2Vuc2UmcXVvdDspLCBhbnkgbW9kaWZpY2F0aW9ucywgZW5oYW5jZW1lbnRzIGFuZC9vcgotb3RoZXIgY29kZSBhbmQvb3IgZG9jdW1lbnRhdGlvbiAoJnF1b3Q7TW9kaWZpY2F0aW9ucyZxdW90OykgdXBsb2FkZWQsIHN1Ym1pdHRlZCwgb3Igb3RoZXJ3aXNlIG1hZGUgYXZhaWxhYmxlIHRvIEVjbGlwc2Uub3JnLCBtZW1iZXJzIG9mIEVjbGlwc2Uub3JnIGFuZC9vciB0aGUKLWhvc3Qgb2YgRWNsaXBzZS5vcmcsIGJ5IHlvdSB0aGF0IHJlbGF0ZSB0byBzdWNoIENvbnRlbnQgYXJlIHByb3ZpZGVkIHVuZGVyIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBPdGhlciBMaWNlbnNlIGFuZCBjYW4gYmUgbWFkZSBhdmFpbGFibGUKLXRvIG90aGVycyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE90aGVyIExpY2Vuc2UuICBJbiBhZGRpdGlvbiwgd2l0aCByZWdhcmQgdG8gTW9kaWZpY2F0aW9ucyBmb3Igd2hpY2ggeW91IGFyZSB0aGUgY29weXJpZ2h0IGhvbGRlciwgeW91IGFyZSBhbHNvCi1wcm92aWRpbmcgdGhlIE1vZGlmaWNhdGlvbnMgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBDUEwgYW5kIHN1Y2ggTW9kaWZpY2F0aW9ucyBjYW4gYmUgbWFkZSBhdmFpbGFibGUgdG8gb3RoZXJzIHVuZGVyIHRoZSB0ZXJtcyBvZgotdGhlIENQTC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2J1aWxkLnByb3BlcnRpZXMgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzMTczMGIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgKi5qYXIsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCi1zcmMuaW5jbHVkZXMgPSBhYm91dC5odG1sCi1zb3VyY2UudXBkYXRldWkzMi5qYXIgPSBzcmMvCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvY2xjbDE2L2JhY2t3YXJkX25hdi5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvY2xjbDE2L2JhY2t3YXJkX25hdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MDQxOWIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9pY29ucy9mdWxsL2NsY2wxNi9iYWNrd2FyZF9uYXYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9pY29ucy9mdWxsL2NsY2wxNi9mb3J3YXJkX25hdi5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvY2xjbDE2L2ZvcndhcmRfbmF2LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ExNTExZC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvY2xjbDE2L2ZvcndhcmRfbmF2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9jbGNsMTYvZ29fbmF2LmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9jbGNsMTYvZ29fbmF2LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmIyMGQ4OC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvY2xjbDE2L2dvX25hdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvY2xjbDE2L2hpZXJhcmNoaWNhbExheW91dC5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvY2xjbDE2L2hpZXJhcmNoaWNhbExheW91dC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1OTdjM2QuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9pY29ucy9mdWxsL2NsY2wxNi9oaWVyYXJjaGljYWxMYXlvdXQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9pY29ucy9mdWxsL2NsY2wxNi9ob21lX25hdi5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvY2xjbDE2L2hvbWVfbmF2LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ5YzJkYi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvY2xjbDE2L2hvbWVfbmF2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9jbGNsMTYvcmVmcmVzaF9uYXYuZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9pY29ucy9mdWxsL2NsY2wxNi9yZWZyZXNoX25hdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwNjNjMjMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9pY29ucy9mdWxsL2NsY2wxNi9yZWZyZXNoX25hdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvY2xjbDE2L3Nob3dfdW5jb25mLmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9jbGNsMTYvc2hvd191bmNvbmYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Yzc1ZjU1Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9jbGNsMTYvc2hvd191bmNvbmYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9pY29ucy9mdWxsL2NsY2wxNi9zdG9wX25hdi5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvY2xjbDE2L3N0b3BfbmF2LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGViNTNlYy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvY2xjbDE2L3N0b3BfbmF2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9jdmlldzE2L2Jyb3dzZXIuZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9pY29ucy9mdWxsL2N2aWV3MTYvYnJvd3Nlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkNzAyNzcuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9pY29ucy9mdWxsL2N2aWV3MTYvYnJvd3Nlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvZGxjbDE2L2JhY2t3YXJkX25hdi5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvZGxjbDE2L2JhY2t3YXJkX25hdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyMTc5YWQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9pY29ucy9mdWxsL2RsY2wxNi9iYWNrd2FyZF9uYXYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9pY29ucy9mdWxsL2RsY2wxNi9mb3J3YXJkX25hdi5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvZGxjbDE2L2ZvcndhcmRfbmF2LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGM1YWYwOC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvZGxjbDE2L2ZvcndhcmRfbmF2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9kbGNsMTYvZ29fbmF2LmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9kbGNsMTYvZ29fbmF2LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDcyZjAwNS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvZGxjbDE2L2dvX25hdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvZGxjbDE2L2hpZXJhcmNoaWNhbExheW91dC5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvZGxjbDE2L2hpZXJhcmNoaWNhbExheW91dC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2ZjMzNjAuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9pY29ucy9mdWxsL2RsY2wxNi9oaWVyYXJjaGljYWxMYXlvdXQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9pY29ucy9mdWxsL2RsY2wxNi9ob21lX25hdi5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvZGxjbDE2L2hvbWVfbmF2LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M4MDA4MC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvZGxjbDE2L2hvbWVfbmF2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9kbGNsMTYvcmVmcmVzaF9uYXYuZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9pY29ucy9mdWxsL2RsY2wxNi9yZWZyZXNoX25hdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyMjgxYjQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9pY29ucy9mdWxsL2RsY2wxNi9yZWZyZXNoX25hdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvZGxjbDE2L3Nob3dfdW5jb25mLmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9kbGNsMTYvc2hvd191bmNvbmYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTNmNDk4Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9kbGNsMTYvc2hvd191bmNvbmYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9pY29ucy9mdWxsL2RsY2wxNi9zdG9wX25hdi5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvZGxjbDE2L3N0b3BfbmF2LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2YwZjliOS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvZGxjbDE2L3N0b3BfbmF2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9lbGNsMTYvYmFja3dhcmRfbmF2LmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9lbGNsMTYvYmFja3dhcmRfbmF2LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODUxODhiNy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvZWxjbDE2L2JhY2t3YXJkX25hdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvZWxjbDE2L2NvbGxhcHNlYWxsLmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9lbGNsMTYvY29sbGFwc2VhbGwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmM3Y2EyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9lbGNsMTYvY29sbGFwc2VhbGwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9pY29ucy9mdWxsL2VsY2wxNi9mb3J3YXJkX25hdi5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvZWxjbDE2L2ZvcndhcmRfbmF2LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGMyOGVlMS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvZWxjbDE2L2ZvcndhcmRfbmF2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9lbGNsMTYvZ29fbmF2LmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9lbGNsMTYvZ29fbmF2LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY4MzMyNy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvZWxjbDE2L2dvX25hdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvZWxjbDE2L2hpZXJhcmNoaWNhbExheW91dC5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvZWxjbDE2L2hpZXJhcmNoaWNhbExheW91dC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1MGIyYzMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9pY29ucy9mdWxsL2VsY2wxNi9oaWVyYXJjaGljYWxMYXlvdXQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9pY29ucy9mdWxsL2VsY2wxNi9ob21lX25hdi5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvZWxjbDE2L2hvbWVfbmF2LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmYyYmE4Ni4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvZWxjbDE2L2hvbWVfbmF2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9lbGNsMTYvcmVmcmVzaF9uYXYuZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9pY29ucy9mdWxsL2VsY2wxNi9yZWZyZXNoX25hdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxOTQyM2QuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9pY29ucy9mdWxsL2VsY2wxNi9yZWZyZXNoX25hdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvZWxjbDE2L3Nob3dfdW5jb25mLmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9lbGNsMTYvc2hvd191bmNvbmYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGYzODFhLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9lbGNsMTYvc2hvd191bmNvbmYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9pY29ucy9mdWxsL2VsY2wxNi9zdG9wX25hdi5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvZWxjbDE2L3N0b3BfbmF2LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTUxOWY0NC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvZWxjbDE2L3N0b3BfbmF2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9ldmlldzE2L2Jyb3dzZXIuZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9pY29ucy9mdWxsL2V2aWV3MTYvYnJvd3Nlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzOTM1YjEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9pY29ucy9mdWxsL2V2aWV3MTYvYnJvd3Nlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvZm9ybXMvZGVmX3Byb3ZpZGVyLmpwZyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9mb3Jtcy9kZWZfcHJvdmlkZXIuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDNjYmViLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9mb3Jtcy9kZWZfcHJvdmlkZXIuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9pY29ucy9mdWxsL2Zvcm1zL2Zvcm1fYmFubmVyLmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9mb3Jtcy9mb3JtX2Jhbm5lci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlYmMwYjIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9pY29ucy9mdWxsL2Zvcm1zL2Zvcm1fYmFubmVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9mb3Jtcy9mb3JtX2Jhbm5lci5qcGcgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvZm9ybXMvZm9ybV9iYW5uZXIuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTNlMmQyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9mb3Jtcy9mb3JtX2Jhbm5lci5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvZm9ybXMvZm9ybV91bmRlcmxpbmUuanBnIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9pY29ucy9mdWxsL2Zvcm1zL2Zvcm1fdW5kZXJsaW5lLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZmM2QwYi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvZm9ybXMvZm9ybV91bmRlcmxpbmUuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9pY29ucy9mdWxsL2Zvcm1zL2Zvcm1fdW5kZXJsaW5lMi5qcGcgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvZm9ybXMvZm9ybV91bmRlcmxpbmUyLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc0MTRmNy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvZm9ybXMvZm9ybV91bmRlcmxpbmUyLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9mb3Jtcy90b3BpYy5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvZm9ybXMvdG9waWMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDEzN2U5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9mb3Jtcy90b3BpYy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL3NhbXBsZS5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL3NhbXBsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0ZmIzYzkuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9pY29ucy9zYW1wbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9wbHVnaW4ucHJvcGVydGllcyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyODg3NjMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotcGx1Z2luTmFtZSA9IFdlbGNvbWUgUG9ydGFsIGZvciBXaW5kb3dzCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwotdmlld3Mud2ViQnJvd3Nlci5sYWJlbCA9IFdlYiBCcm93c2VyClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9wbHVnaW4ueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjBiNzdhLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbgotICAgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMiIKLSAgIG5hbWU9IiVwbHVnaW5OYW1lIgotICAgdmVyc2lvbj0iMi4xLjAiCi0gICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgY2xhc3M9Im9yZy5lY2xpcHNlLndlbGNvbWUuaW50ZXJuYWwuV2VsY29tZVBvcnRhbCI+Ci0KLSAgIDxydW50aW1lPgotICAgICAgPGxpYnJhcnkgbmFtZT0idXBkYXRldWkzMi5qYXIiPgotICAgICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+Ci0gICAgICAgICA8cGFja2FnZXMgcHJlZml4ZXM9Im9yZy5lY2xpcHNlLndlbGNvbWUuaW50ZXJuYWwiLz4KLSAgICAgIDwvbGlicmFyeT4KLSAgIDwvcnVudGltZT4KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29tcGF0aWJpbGl0eSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLmlkZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLnZpZXdzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamZhY2UudGV4dCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5oZWxwIi8+Ci0gICA8L3JlcXVpcmVzPgotCi0KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9IndlbGNvbWVQYWdlcyIgbmFtZT0iV2VsY29tZSBQYWdlcyIgc2NoZW1hPSJzY2hlbWEvd2VsY29tZVBhZ2VzLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9IndlbGNvbWVTZWN0aW9ucyIgbmFtZT0iV2VsY29tZSBTZWN0aW9ucyIgc2NoZW1hPSJzY2hlbWEvd2VsY29tZVNlY3Rpb25zLmV4c2QiLz4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmFjdGlvblNldHMiPgotICAgICAgPGFjdGlvblNldAotICAgICAgICAgICAgbGFiZWw9IlNhbXBsZSBBY3Rpb24gU2V0IgotICAgICAgICAgICAgdmlzaWJsZT0idHJ1ZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIuYWN0aW9uU2V0Ij4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSJPcGVuIEhvbWUgUGFnZSIKLSAgICAgICAgICAgICAgIGljb249Imljb25zL3NhbXBsZS5naWYiCi0gICAgICAgICAgICAgICB0b29sdGlwPSJPcGVuIEhvbWUgUGFnZSIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53ZWxjb21lLmludGVybmFsLlNob3dXZWxjb21lUGFnZUFjdGlvbiIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJoZWxwL2hlbHBFbmQiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud2VsY29tZS5pbnRlcm5hbC5TaG93V2VsY29tZVBhZ2VBY3Rpb24iPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICA8L2FjdGlvblNldD4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnBlcnNwZWN0aXZlRXh0ZW5zaW9ucyI+Ci0gICAgICA8cGVyc3BlY3RpdmVFeHRlbnNpb24KLSAgICAgICAgICAgIHRhcmdldElEPSJvcmcuZWNsaXBzZS51aS5yZXNvdXJjZVBlcnNwZWN0aXZlIj4KLSAgICAgICAgIDxhY3Rpb25TZXQKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIuYWN0aW9uU2V0Ij4KLSAgICAgICAgIDwvYWN0aW9uU2V0PgotICAgICAgPC9wZXJzcGVjdGl2ZUV4dGVuc2lvbj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMiPgotICAgICAgPGVkaXRvcgotICAgICAgICAgICAgbmFtZT0iV2ViIEJyb3dzZXIiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9zYW1wbGUuZ2lmIgotICAgICAgICAgICAgY29udHJpYnV0b3JDbGFzcz0ib3JnLmVjbGlwc2Uud2VsY29tZS5pbnRlcm5hbC53ZWJicm93c2VyLldlYkJyb3dzZXJFZGl0b3JDb250cmlidXRvciIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53ZWxjb21lLmludGVybmFsLndlYmJyb3dzZXIuV2ViQnJvd3NlckVkaXRvciIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53ZWxjb21lLndlYmJyb3dzZXIiPgotICAgICAgPC9lZGl0b3I+Ci0gICAgICA8ZWRpdG9yCi0gICAgICAgICAgICBuYW1lPSJXZWxjb21lIFBhZ2UiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9zYW1wbGUuZ2lmIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndlbGNvbWUuaW50ZXJuYWwucG9ydGFsLldlbGNvbWVQb3J0YWxFZGl0b3IiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud2VsY29tZS5wb3J0YWwiPgotICAgICAgPC9lZGl0b3I+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5lbGVtZW50RmFjdG9yaWVzIj4KLSAgICAgIDxmYWN0b3J5Ci0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud2VsY29tZS5pbnRlcm5hbC53ZWJicm93c2VyLldlYkJyb3dzZXJFZGl0b3JJbnB1dEZhY3RvcnkiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud2VsY29tZS5pbnRlcm5hbC53ZWJicm93c2VyLldlYkJyb3dzZXJFZGl0b3JJbnB1dEZhY3RvcnkiPgotICAgICAgPC9mYWN0b3J5PgotICAgICAgPGZhY3RvcnkKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53ZWxjb21lLmludGVybmFsLnBvcnRhbC5XZWxjb21lUG9ydGFsRWRpdG9ySW5wdXRGYWN0b3J5IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndlbGNvbWUuaW50ZXJuYWwucG9ydGFsLldlbGNvbWVQb3J0YWxFZGl0b3JJbnB1dEZhY3RvcnkiPgotICAgICAgPC9mYWN0b3J5PgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyLndlbGNvbWVQYWdlcyI+Ci0gICAgICA8cGFnZQotICAgICAgICAgICAgbmFtZT0iSG9tZSIKLSAgICAgICAgICAgIG51bUNvbHVtbnM9IjIiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyLmhvbWVQYWdlIj4KLSAgICAgICAgIDxzZWN0aW9uCi0gICAgICAgICAgICAgICBzcGFuPSIyIgotICAgICAgICAgICAgICAgaWQ9ImNvbW11bml0eS5uZXdzLnJlbW90ZSI+Ci0gICAgICAgICA8L3NlY3Rpb24+Ci0gICAgICAgICA8c2VjdGlvbgotICAgICAgICAgICAgICAgaWQ9InNlYXJjaCI+Ci0gICAgICAgICA8L3NlY3Rpb24+Ci0gICAgICAgICA8c2VjdGlvbgotICAgICAgICAgICAgICAgaWQ9InRhc2tzLnNvZnR3YXJlVXBkYXRlcyI+Ci0gICAgICAgICA8L3NlY3Rpb24+Ci0gICAgICAgICA8c2VjdGlvbgotICAgICAgICAgICAgICAgaWQ9InF1aWNrU3RhcnQiPgotICAgICAgICAgPC9zZWN0aW9uPgotICAgICAgICAgPHNlY3Rpb24KLSAgICAgICAgICAgICAgIGlkPSJ0aXBzQW5kVHJpY2tzIj4KLSAgICAgICAgIDwvc2VjdGlvbj4KLSAgICAgIDwvcGFnZT4KLSAgICAgIDxwYWdlCi0gICAgICAgICAgICBuYW1lPSJOZXdzIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi5uZXdzIj4KLSAgICAgIDwvcGFnZT4KLSAgICAgIDxwYWdlCi0gICAgICAgICAgICBuYW1lPSJDb21tdW5pdHkiCi0gICAgICAgICAgICBudW1Db2x1bW5zPSIxIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi5jb21tdW5pdHkiPgotICAgICAgICAgPHNlY3Rpb24KLSAgICAgICAgICAgICAgIGlkPSJjb21tdW5pdHkubGlua3MiPgotICAgICAgICAgPC9zZWN0aW9uPgotICAgICAgICAgPHNlY3Rpb24KLSAgICAgICAgICAgICAgIGlkPSJjb21tdW5pdHkuYXJ0aWNsZXMiPgotICAgICAgICAgPC9zZWN0aW9uPgotICAgICAgPC9wYWdlPgotICAgICAgPHBhZ2UKLSAgICAgICAgICAgIG5hbWU9IlNhbXBsZXMiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyLnNhbXBsZXMiPgotICAgICAgPC9wYWdlPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyLndlbGNvbWVTZWN0aW9ucyI+Ci0gICAgICA8c2VjdGlvbgotICAgICAgICAgICAgbmFtZT0iU29mdHdhcmUgVXBkYXRlcyIKLSAgICAgICAgICAgIGlkPSJ0YXNrcy5zb2Z0d2FyZVVwZGF0ZXMiPgotICAgICAgICAgPGZvcm0+Ci0gICAgICAgICAgICAmbHQ7cCZndDsKLSZsdDthIGhyZWY9JnF1b3Q7YWN0aW9uJnF1b3Q7IGFyZz0mcXVvdDtvcmcuZWNsaXBzZS51cGRhdGUudWk6b3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLkluc3RhbGxXaXphcmRBY3Rpb24mcXVvdDsmZ3Q7Ci1GaW5kIHVwZGF0ZXMgZm9yIHRoZSBjdXJyZW50bHkgaW5zdGFsbGVkIGZlYXR1cmVzCi0mbHQ7L2EmZ3Q7Jmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci0mbHQ7YSBocmVmPSZxdW90O2FjdGlvbiZxdW90OyBhcmc9JnF1b3Q7b3JnLmVjbGlwc2UudXBkYXRlLnVpOm9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5Db25maWd1cmF0aW9uTWFuYWdlckFjdGlvbiZxdW90OyZndDsKLU1hbmFnZSBteSB3b3JrYmVuY2ggY29uZmlndXJhdGlvbiZsdDsvYSZndDsmbHQ7L3AmZ3Q7Ci0gICAgICAgICA8L2Zvcm0+Ci0gICAgICA8L3NlY3Rpb24+Ci0gICAgICA8c2VjdGlvbgotICAgICAgICAgICAgbmFtZT0iRWNsaXBzZSBDb21tdW5pdHkgU2l0ZXMiCi0gICAgICAgICAgICBpZD0iY29tbXVuaXR5LmxpbmtzIj4KLSAgICAgICAgIDxmb3JtPgotICAgICAgICAgICAgJmx0O2xpJmd0OyZsdDthIGhyZWY9JnF1b3Q7dXJsJnF1b3Q7IGFyZz0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnJnF1b3Q7Jmd0O0VjbGlwc2Uub3JnJmx0Oy9hJmd0OyZsdDsvbGkmZ3Q7Ci0gICAgICAgICA8L2Zvcm0+Ci0gICAgICA8L3NlY3Rpb24+Ci0gICAgICA8c2VjdGlvbgotICAgICAgICAgICAgbmFtZT0iTmV3IEVjbGlwc2UgQXJ0aWNsZXMiCi0gICAgICAgICAgICBpZD0iY29tbXVuaXR5LmFydGljbGVzIj4KLSAgICAgICAgIDxmb3JtCi0gICAgICAgICAgICAgICB1cmw9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvJTdFY2hlY2tvdXQlN0UvcGxhdGZvcm0tdXBkYXRlLWhvbWUvd2VsY29tZS1hcnRpY2xlcy54bWwiCi0gICAgICAgICAgICAgICB0eXBlPSJyZW1vdGUiPgotICAgICAgICAgPC9mb3JtPgotICAgICAgPC9zZWN0aW9uPgotICAgICAgPHNlY3Rpb24KLSAgICAgICAgICAgIG5hbWU9IkhlYWRsaW5lcyIKLSAgICAgICAgICAgIGlkPSJjb21tdW5pdHkubmV3cy5yZW1vdGUiPgotICAgICAgICAgPGZvcm0KLSAgICAgICAgICAgICAgIHVybD0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS8lN0VjaGVja291dCU3RS9wbGF0Zm9ybS11cGRhdGUtaG9tZS93ZWxjb21lLW5ld3MueG1sIgotICAgICAgICAgICAgICAgdHlwZT0icmVtb3RlIj4KLSAgICAgICAgIDwvZm9ybT4KLSAgICAgIDwvc2VjdGlvbj4KLSAgICAgIDxzZWN0aW9uCi0gICAgICAgICAgICBuYW1lPSJHZXQgSGVscCIKLSAgICAgICAgICAgIGlkPSJzZWFyY2giPgotICAgICAgICAgPGZvcm0KLSAgICAgICAgICAgICAgIHR5cGU9ImN1c3RvbSIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53ZWxjb21lLmludGVybmFsLnBvcnRhbC5IZWxwU2VjdGlvbiI+Ci0gICAgICAgICA8L2Zvcm0+Ci0gICAgICA8L3NlY3Rpb24+Ci0gICAgICA8c2VjdGlvbgotICAgICAgICAgICAgbmFtZT0iUXVpY2sgU3RhcnQiCi0gICAgICAgICAgICBpZD0icXVpY2tTdGFydCI+Ci0gICAgICAgICA8Zm9ybQotICAgICAgICAgICAgICAgdHlwZT0iZHluYW1pYyIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53ZWxjb21lLmludGVybmFsLmFjdGlvbnMuV2VsY29tZUNvbnRlbnRQcm92aWRlciI+Ci0gICAgICAgICA8L2Zvcm0+Ci0gICAgICA8L3NlY3Rpb24+Ci0gICAgICA8c2VjdGlvbgotICAgICAgICAgICAgbmFtZT0iVGlwcyBhbmQgVHJpY2tzIgotICAgICAgICAgICAgaWQ9InRpcHNBbmRUcmlja3MiPgotICAgICAgICAgPGZvcm0KLSAgICAgICAgICAgICAgIHR5cGU9ImR5bmFtaWMiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud2VsY29tZS5pbnRlcm5hbC5hY3Rpb25zLlRpcHNBbmRUcmlja3NDb250ZW50UHJvdmlkZXIiPgotICAgICAgICAgPC9mb3JtPgotICAgICAgPC9zZWN0aW9uPgotICAgPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9zY2hlbWEvd2VsY29tZVBhZ2VzLmV4c2QgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3NjaGVtYS93ZWxjb21lUGFnZXMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2U0M2YxYi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3NjaGVtYS93ZWxjb21lUGFnZXMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/Pg0KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+DQotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMiI+DQotPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyIiBpZD0id2VsY29tZVBhZ2VzIiBuYW1lPSJXZWxjb21lIFBhZ2VzIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFtFbnRlciBkZXNjcmlwdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJwYWdlIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+DQotICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9InBhZ2UiPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJzZWN0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+DQotICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJudW1Db2x1bW5zIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGVsZW1lbnQgbmFtZT0ic2VjdGlvbiI+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InNwYW4iIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFtFbnRlciB0aGUgZmlyc3QgcmVsZWFzZSBpbiB3aGljaCB0aGlzIGV4dGVuc2lvbiBwb2ludCBhcHBlYXJzLl0NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgW0VudGVyIGV4dGVuc2lvbiBwb2ludCB1c2FnZSBleGFtcGxlIGhlcmUuXQ0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFtFbnRlciBBUEkgaW5mb3JtYXRpb24gaGVyZS5dDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFtFbnRlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLTwvc2NoZW1hPg0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvc2NoZW1hL3dlbGNvbWVTZWN0aW9ucy5leHNkIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9zY2hlbWEvd2VsY29tZVNlY3Rpb25zLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljNGI1ZTIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9zY2hlbWEvd2VsY29tZVNlY3Rpb25zLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCi08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPg0KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIiPg0KLTxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMiIgaWQ9IndlbGNvbWVTZWN0aW9ucyIgbmFtZT0iV2VsY29tZSBTZWN0aW9ucyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBbRW50ZXIgZGVzY3JpcHRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQ0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ic2VjdGlvbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPg0KLSAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJzZWN0aW9uIj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZm9ybSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPg0KLSAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS53ZWxjb21lLmludGVybmFsLnBvcnRhbC5JUG9ydGFsU2VjdGlvbiIvPg0KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGVsZW1lbnQgbmFtZT0iZm9ybSI+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idHlwZSIgdXNlPSJkZWZhdWx0IiB2YWx1ZT0ibG9jYWwiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIEZvcm1zIGFyZSBsb2FkZWQgZGVwZW5kaW5nIG9uIHRoZSAmbHQ7c2FtcCZndDt0eXBlJmx0Oy9zYW1wJmd0OyBhdHRyaWJ1dGU6DQotJmx0O3VsJmd0Ow0KLSZsdDtsaSZndDsmbHQ7YiZndDtsb2NhbCZsdDsvYiZndDsgLSB0aGUgY29udGVudCBvZiB0aGUgZm9ybSB3aWxsIGJlIGxvYWRlZCBmcm9tIHRoZSBib2R5IHRleHQgb2YgdGhlIGVsZW1lbnQuJmx0Oy9saSZndDsNCi0mbHQ7bGkmZ3Q7Jmx0O2ImZ3Q7cmVtb3RlJmx0Oy9iJmd0OyAtIHRoZSBjb250ZW50IG9mIHRoZSBmb3JtIHdpbGwgYmUgZG93bmxvYWRlZCB1c2luZyB0aGUgc3BlY2lmaWVkIFVSTC4mbHQ7L2xpJmd0Ow0KLSZsdDtsaSZndDsmbHQ7YiZndDtjdXN0b20mbHQ7L2ImZ3Q7IC0gdGhlIGZvcm0gd2lsbCBiZSBjcmVhdGVkIGJ5IGxvYWRpbmcgdGhlIGNsYXNzIHNwZWNpZmllZCBieSB0aGUgJmx0O3NhbXAmZ3Q7Y2xhc3MmbHQ7L3NhbXAmZ3Q7IGF0dHJpYnV0ZSB0aGF0IGltcGxlbWVudHMgSVBvcnRhbFNlY3Rpb24gaW50ZXJmYWNlLiZsdDsvbGkmZ3Q7DQotJmx0O2xpJmd0OyZsdDtiJmd0O2R5bmFtaWMmbHQ7L2ImZ3Q7IC0gdGhlIGZvcm0gd2lsbCBiZSBjcmVhdGVkIGJ5IGxvYWRpbmcgdGhlIGNsYXNzIHNwZWNpZmllZCBieSB0aGUgJmx0O3NhbXAmZ3Q7Y2xhc3MmbHQ7L3NhbXAmZ3Q7IGF0dHJpYnV0ZSB0aGF0IGltcGxlbWVudHMgSUZvcm1Db250ZW50UHJvdmlkZXIgaW50ZXJmYWNlLiZsdDsvbGkmZ3Q7DQotJmx0Oy91bCZndDsNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgICAgIDxzaW1wbGVUeXBlPg0KLSAgICAgICAgICAgICAgIDxyZXN0cmljdGlvbiBiYXNlPSJzdHJpbmciPg0KLSAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0ibG9jYWwiPg0KLSAgICAgICAgICAgICAgICAgIDwvZW51bWVyYXRpb24+DQotICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJyZW1vdGUiPg0KLSAgICAgICAgICAgICAgICAgIDwvZW51bWVyYXRpb24+DQotICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJjdXN0b20iPg0KLSAgICAgICAgICAgICAgICAgIDwvZW51bWVyYXRpb24+DQotICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJkeW5hbWljIj4NCi0gICAgICAgICAgICAgICAgICA8L2VudW1lcmF0aW9uPg0KLSAgICAgICAgICAgICAgIDwvcmVzdHJpY3Rpb24+DQotICAgICAgICAgICAgPC9zaW1wbGVUeXBlPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idXJsIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIElmICZsdDtzYW1wJmd0O3R5cGUmbHQ7L3NhbXAmZ3Q7IGlzICZsdDtzYW1wJmd0O3JlbW90ZSZsdDsvc2FtcCZndDssIHRoZSBjb250ZW50IG9mIHRoZSBmb3JtIHdpbGwgYmUgZG93bmxvYWRlZCBmcm9tIHRoZSBzcGVjaWZpZWQgVVJMLg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgPGFwcEluZm8+DQotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLndlbGNvbWUuaW50ZXJuYWwucG9ydGFsLklQb3J0YWxTZWN0aW9uIi8+DQotICAgICAgICAgICAgICAgPC9hcHBJbmZvPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFtFbnRlciB0aGUgZmlyc3QgcmVsZWFzZSBpbiB3aGljaCB0aGlzIGV4dGVuc2lvbiBwb2ludCBhcHBlYXJzLl0NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgW0VudGVyIGV4dGVuc2lvbiBwb2ludCB1c2FnZSBleGFtcGxlIGhlcmUuXQ0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFtFbnRlciBBUEkgaW5mb3JtYXRpb24gaGVyZS5dDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFtFbnRlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLTwvc2NoZW1hPg0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvc3JjL29yZy9lY2xpcHNlL3dlbGNvbWUvaW50ZXJuYWwvU2hvd1dlbGNvbWVQYWdlQWN0aW9uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3NyYy9vcmcvZWNsaXBzZS93ZWxjb21lL2ludGVybmFsL1Nob3dXZWxjb21lUGFnZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGVjNWJhLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvc3JjL29yZy9lY2xpcHNlL3dlbGNvbWUvaW50ZXJuYWwvU2hvd1dlbGNvbWVQYWdlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndlbGNvbWUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53ZWxjb21lLmludGVybmFsLnBvcnRhbC5XZWxjb21lUG9ydGFsRWRpdG9ySW5wdXQ7Ci0KLS8qKgotICogT3VyIHNhbXBsZSBhY3Rpb24gaW1wbGVtZW50cyB3b3JrYmVuY2ggYWN0aW9uIGRlbGVnYXRlLgotICogVGhlIGFjdGlvbiBwcm94eSB3aWxsIGJlIGNyZWF0ZWQgYnkgdGhlIHdvcmtiZW5jaCBhbmQKLSAqIHNob3duIGluIHRoZSBVSS4gV2hlbiB0aGUgdXNlciB0cmllcyB0byB1c2UgdGhlIGFjdGlvbiwKLSAqIHRoaXMgZGVsZWdhdGUgd2lsbCBiZSBjcmVhdGVkIGFuZCBleGVjdXRpb24gd2lsbCBiZSAKLSAqIGRlbGVnYXRlZCB0byBpdC4KLSAqIEBzZWUgSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBTaG93V2VsY29tZVBhZ2VBY3Rpb24gaW1wbGVtZW50cyBJV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUgewotCXByaXZhdGUgSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3c7Ci0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBTaG93V2VsY29tZVBhZ2VBY3Rpb24oKSB7Ci0JfQotCi0JLyoqCi0JICogVGhlIGFjdGlvbiBoYXMgYmVlbiBhY3RpdmF0ZWQuIFRoZSBhcmd1bWVudCBvZiB0aGUKLQkgKiBtZXRob2QgcmVwcmVzZW50cyB0aGUgJ3JlYWwnIGFjdGlvbiBzaXR0aW5nCi0JICogaW4gdGhlIHdvcmtiZW5jaCBVSS4KLQkgKiBAc2VlIElXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSNydW4KLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJdHJ5IHsKLQkJCVdlbGNvbWVQb3J0YWwuZ2V0QWN0aXZlUGFnZSgpLm9wZW5FZGl0b3IoCi0JCQkJbmV3IFdlbGNvbWVQb3J0YWxFZGl0b3JJbnB1dCgpLAotCQkJCSJvcmcuZWNsaXBzZS53ZWxjb21lLnBvcnRhbCIpOwotCQl9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0JCQlXZWxjb21lUG9ydGFsLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNlbGVjdGlvbiBpbiB0aGUgd29ya2JlbmNoIGhhcyBiZWVuIGNoYW5nZWQuIFdlIAotCSAqIGNhbiBjaGFuZ2UgdGhlIHN0YXRlIG9mIHRoZSAncmVhbCcgYWN0aW9uIGhlcmUKLQkgKiBpZiB3ZSB3YW50LCBidXQgdGhpcyBjYW4gb25seSBoYXBwZW4gYWZ0ZXIgCi0JICogdGhlIGRlbGVnYXRlIGhhcyBiZWVuIGNyZWF0ZWQuCi0JICogQHNlZSBJV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUjc2VsZWN0aW9uQ2hhbmdlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JfQotCi0JLyoqCi0JICogV2UgY2FuIHVzZSB0aGlzIG1ldGhvZCB0byBkaXNwb3NlIG9mIGFueSBzeXN0ZW0KLQkgKiByZXNvdXJjZXMgd2UgcHJldmlvdXNseSBhbGxvY2F0ZWQuCi0JICogQHNlZSBJV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUjZGlzcG9zZQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JfQotCi0JLyoqCi0JICogV2Ugd2lsbCBjYWNoZSB3aW5kb3cgb2JqZWN0IGluIG9yZGVyIHRvCi0JICogYmUgYWJsZSB0byBwcm92aWRlIHBhcmVudCBzaGVsbCBmb3IgdGhlIG1lc3NhZ2UgZGlhbG9nLgotCSAqIEBzZWUgSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlI2luaXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7Ci0JCXRoaXMud2luZG93ID0gd2luZG93OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3NyYy9vcmcvZWNsaXBzZS93ZWxjb21lL2ludGVybmFsL1dlbGNvbWVQb3J0YWwuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvc3JjL29yZy9lY2xpcHNlL3dlbGNvbWUvaW50ZXJuYWwvV2VsY29tZVBvcnRhbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmEyZjAwLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvc3JjL29yZy9lY2xpcHNlL3dlbGNvbWUvaW50ZXJuYWwvV2VsY29tZVBvcnRhbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud2VsY29tZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndlbGNvbWUuaW50ZXJuYWwud2ViYnJvd3Nlci4qOwotCi0vKioKLSAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgotICovCi1wdWJsaWMgY2xhc3MgV2VsY29tZVBvcnRhbCBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0JST1dTRVIgPSBQTFVHSU5fSUQgKyAiV2ViQnJvd3NlciI7Ci0JCi0JLy9UaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIFdlbGNvbWVQb3J0YWwgcGx1Z2luOwotCS8vUmVzb3VyY2UgYnVuZGxlLgotCXByaXZhdGUgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGU7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JU3RhcnR1cCNlYXJseVN0YXJ0dXAoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzaG93VVJMKFN0cmluZyBuYW1lLCBTdHJpbmcgdXJsKSB7Ci0JCXRyeSB7Ci0JCQlXZWxjb21lUG9ydGFsLmdldEFjdGl2ZVBhZ2UoKS5vcGVuRWRpdG9yKAotCQkJCW5ldyBXZWJCcm93c2VyRWRpdG9ySW5wdXQobmFtZSwgdXJsKSwKLQkJCQkib3JnLmVjbGlwc2Uud2VsY29tZS53ZWJicm93c2VyIik7Ci0JCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCVdlbGNvbWVQb3J0YWwubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBXZWxjb21lUG9ydGFsKElQbHVnaW5EZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLQkJc3VwZXIoZGVzY3JpcHRvcik7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JCXRyeSB7Ci0JCQlyZXNvdXJjZUJ1bmRsZSA9Ci0JCQkJUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKAotCQkJCQkib3JnLmVjbGlwc2Uud2VsY29tZS5pbnRlcm5hbC5XZWxjb21lUG9ydGFsUmVzb3VyY2VzIik7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB4KSB7Ci0JCQlyZXNvdXJjZUJ1bmRsZSA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBXZWxjb21lUG9ydGFsIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJV29ya2JlbmNoUGFnZSBnZXRBY3RpdmVQYWdlKCkgewotCQlyZXR1cm4gZ2V0RGVmYXVsdCgpLmludGVybmFsR2V0QWN0aXZlUGFnZSgpOwotCX0KLQotCXByaXZhdGUgSVdvcmtiZW5jaFBhZ2UgaW50ZXJuYWxHZXRBY3RpdmVQYWdlKCkgewotCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IGdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQlpZiAod2luZG93ICE9IG51bGwpCi0JCQlyZXR1cm4gd2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTaGVsbCBnZXRBY3RpdmVXb3JrYmVuY2hTaGVsbCgpIHsKLQkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBnZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJcmV0dXJuIHdpbmRvdyAhPSBudWxsID8gd2luZG93LmdldFNoZWxsKCkgOiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVdvcmtiZW5jaFdpbmRvdyBnZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKSB7Ci0JCXJldHVybiBnZXREZWZhdWx0KCkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UGx1Z2luSWQoKSB7Ci0JCXJldHVybiBnZXREZWZhdWx0KCkuZ2V0RGVzY3JpcHRvcigpLmdldFVuaXF1ZUlkZW50aWZpZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB3b3Jrc3BhY2UgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBJV29ya3NwYWNlIGdldFdvcmtzcGFjZSgpIHsKLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdHJpbmcgZnJvbSB0aGUgcGx1Z2luJ3MgcmVzb3VyY2UgYnVuZGxlLAotCSAqIG9yICdrZXknIGlmIG5vdCBmb3VuZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgewotCQlSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBXZWxjb21lUG9ydGFsLmdldERlZmF1bHQoKS5nZXRSZXNvdXJjZUJ1bmRsZSgpOwotCQl0cnkgewotCQkJcmV0dXJuIGJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBrZXk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGb3JtYXR0ZWRNZXNzYWdlKFN0cmluZyBrZXksIFN0cmluZ1tdIGFyZ3MpIHsKLQkJU3RyaW5nIHRleHQgPSBnZXRTdHJpbmcoa2V5KTsKLQkJcmV0dXJuIGphdmEudGV4dC5NZXNzYWdlRm9ybWF0LmZvcm1hdCh0ZXh0LCBhcmdzKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGb3JtYXR0ZWRNZXNzYWdlKFN0cmluZyBrZXksIFN0cmluZyBhcmcpIHsKLQkJU3RyaW5nIHRleHQgPSBnZXRTdHJpbmcoa2V5KTsKLQkJcmV0dXJuIGphdmEudGV4dC5NZXNzYWdlRm9ybWF0LmZvcm1hdCh0ZXh0LCBuZXcgU3RyaW5nW10geyBhcmcgfSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGx1Z2luJ3MgcmVzb3VyY2UgYnVuZGxlLAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKLQkJcmV0dXJuIHJlc291cmNlQnVuZGxlOwotCX0KLQotCXB1YmxpYyB2b2lkIHN0YXJ0dXAoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JfQotCi0JcHVibGljIHZvaWQgc2h1dGRvd24oKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0V4Y2VwdGlvbihUaHJvd2FibGUgZSkgewotCQlsb2dFeGNlcHRpb24oZSwgdHJ1ZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0V4Y2VwdGlvbihUaHJvd2FibGUgZSwgYm9vbGVhbiBzaG93RXJyb3JEaWFsb2cpIHsKLQkJaWYgKGUgaW5zdGFuY2VvZiBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKSB7Ci0JCQllID0gKChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKSBlKS5nZXRUYXJnZXRFeGNlcHRpb24oKTsKLQkJfQotCi0JCUlTdGF0dXMgc3RhdHVzID0gbnVsbDsKLQkJaWYgKGUgaW5zdGFuY2VvZiBDb3JlRXhjZXB0aW9uKSB7Ci0JCQlzdGF0dXMgPSAoKENvcmVFeGNlcHRpb24pIGUpLmdldFN0YXR1cygpOwotCQl9IGVsc2UgewotCQkJU3RyaW5nIG1lc3NhZ2UgPSBlLmdldE1lc3NhZ2UoKTsKLQkJCWlmIChtZXNzYWdlID09IG51bGwpCi0JCQkJbWVzc2FnZSA9IGUudG9TdHJpbmcoKTsKLQkJCXN0YXR1cyA9Ci0JCQkJbmV3IFN0YXR1cygKLQkJCQkJSVN0YXR1cy5FUlJPUiwKLQkJCQkJZ2V0UGx1Z2luSWQoKSwKLQkJCQkJSVN0YXR1cy5PSywKLQkJCQkJbWVzc2FnZSwKLQkJCQkJZSk7Ci0JCX0KLQkJbG9nKHN0YXR1cywgc2hvd0Vycm9yRGlhbG9nKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKElTdGF0dXMgc3RhdHVzLCBib29sZWFuIHNob3dFcnJvckRpYWxvZykgewotCQlpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgIT0gSVN0YXR1cy5JTkZPKSB7Ci0JCQlpZiAoc2hvd0Vycm9yRGlhbG9nKQotCQkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcigKLQkJCQkJZ2V0QWN0aXZlV29ya2JlbmNoU2hlbGwoKSwKLQkJCQkJbnVsbCwKLQkJCQkJbnVsbCwKLQkJCQkJc3RhdHVzKTsKLQkJCS8vUmVzb3VyY2VzUGx1Z2luLmdldFBsdWdpbigpLmdldExvZygpLmxvZyhzdGF0dXMpOwotCQkJUGxhdGZvcm0uZ2V0UGx1Z2luKCJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiKS5nZXRMb2coKS5sb2coc3RhdHVzKTsKLQkJfSBlbHNlIHsKLQkJCU1lc3NhZ2VEaWFsb2cub3BlbkluZm9ybWF0aW9uKAotCQkJCWdldEFjdGl2ZVdvcmtiZW5jaFNoZWxsKCksCi0JCQkJbnVsbCwKLQkJCQlzdGF0dXMuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvc3JjL29yZy9lY2xpcHNlL3dlbGNvbWUvaW50ZXJuYWwvV2VsY29tZVBvcnRhbEltYWdlcy5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvd2VsY29tZS9pbnRlcm5hbC9XZWxjb21lUG9ydGFsSW1hZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2NzVmNGIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvd2VsY29tZS9pbnRlcm5hbC9XZWxjb21lUG9ydGFsSW1hZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53ZWxjb21lLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQbHVnaW5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogQnVuZGxlIG9mIGFsbCBpbWFnZXMgdXNlZCBieSB0aGUgUERFIHBsdWdpbi4KLSAqLwotcHVibGljIGNsYXNzIFdlbGNvbWVQb3J0YWxJbWFnZXMgewotCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9QUkVGSVg9IFdlbGNvbWVQb3J0YWwuZ2V0UGx1Z2luSWQoKSsiLiI7Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBVUkwgQkFTRV9VUkwgPSBXZWxjb21lUG9ydGFsLmdldERlZmF1bHQoKS5nZXREZXNjcmlwdG9yKCkuZ2V0SW5zdGFsbFVSTCgpOwotCi0KLQlwcml2YXRlIHN0YXRpYyBJbWFnZVJlZ2lzdHJ5IFBMVUdJTl9SRUdJU1RSWTsKLQkKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJQ09OU19QQVRIID0gImljb25zL2Z1bGwvIjsKLQotCS8qKgotCSAqIFNldCBvZiBwcmVkZWZpbmVkIEltYWdlIERlc2NyaXB0b3JzLgotCSAqLwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVRIX09CSj0gSUNPTlNfUEFUSCsib2JqMTYvIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFUSF9WSUVXID0gSUNPTlNfUEFUSCsiY3ZpZXcxNi8iOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVRIX0xDTD0gSUNPTlNfUEFUSCsiZWxjbDE2LyI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBVEhfTENMX0hPVkVSPSBJQ09OU19QQVRIKyJjbGNsMTYvIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFUSF9MQ0xfRElTQUJMRUQ9IElDT05TX1BBVEgrImRsY2wxNi8iOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVRIX1RPT0wgPSBJQ09OU19QQVRIICsgImV0b29sMTYvIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFUSF9UT09MX0hPVkVSID0gSUNPTlNfUEFUSCArICJjdG9vbDE2LyI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBVEhfVE9PTF9ESVNBQkxFRCA9IElDT05TX1BBVEggKyAiZHRvb2wxNi8iOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVRIX09WUiA9IElDT05TX1BBVEggKyAib3ZyMTYvIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFUSF9XSVpCQU4gPSBJQ09OU19QQVRIICsgIndpemJhbi8iOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBVEhfRk9STVMgPSBJQ09OU19QQVRIICsgImZvcm1zLyI7Ci0KLQotCS8qKgotCSAqIEZyZXF1ZW50bHkgdXNlZCBpbWFnZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRk9STV9CQU5ORVIgPSBOQU1FX1BSRUZJWCsiRk9STV9CQU5ORVIiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19GT1JNX0JBTk5FUl9TSE9SVCA9IE5BTUVfUFJFRklYKyJGT1JNX0JBTk5FUl9TSE9SVCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0ZPUk1fVU5ERVJMSU5FID0gTkFNRV9QUkVGSVggKyAiRk9STV9VTkRFUkxJTkUiOwotCi0JLyoqCi0JICogT0JKMTYKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX0FQUF9PQkogPSBjcmVhdGUoUEFUSF9PQkosICJhcHBfb2JqLmdpZiIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfQkZPTERFUl9PQkogPSBjcmVhdGUoUEFUSF9PQkosICJiZm9sZGVyX29iai5naWYiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX0NBVEVHT1JZX09CSiA9IGNyZWF0ZShQQVRIX09CSiwgImNhdGVnb3J5X29iai5naWYiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX0NEX09CSiA9IGNyZWF0ZShQQVRIX09CSiwgImNkX29iai5naWYiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX0NPTVBVVEVSX09CSiA9IGNyZWF0ZShQQVRIX09CSiwgImNvbXB1dGVyX29iai5naWYiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX0NPTkZJR19PQkogPSBjcmVhdGUoUEFUSF9PQkosICJjb25maWdfb2JqLmdpZiIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfRkVBVFVSRV9PQkogPSBjcmVhdGUoUEFUSF9PQkosICJmZWF0dXJlX29iai5naWYiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX0VGSVhfT0JKID0gY3JlYXRlKFBBVEhfT0JKLCAiZWZpeDJfb2JqLmdpZiIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfRkxPUFBZX09CSiA9IGNyZWF0ZShQQVRIX09CSiwgImZsb3BweV9vYmouZ2lmIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19ISVNUT1JZX09CSiA9IGNyZWF0ZShQQVRIX09CSiwgImhpc3Rvcnlfb2JqLmdpZiIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfTFNJVEVfT0JKID0gY3JlYXRlKFBBVEhfT0JKLCAibHNpdGVfb2JqLmdpZiIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfUFNJVEVfT0JKID0gY3JlYXRlKFBBVEhfT0JKLCAicHNpdGVfb2JqLmdpZiIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfRVNJVEVfT0JKID0gY3JlYXRlKFBBVEhfT0JKLCAiZXNpdGVfb2JqLmdpZiIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfU0lURV9PQkogPSBjcmVhdGUoUEFUSF9PQkosICJzaXRlX29iai5naWYiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX1dFQl9TSVRFX09CSiA9IGNyZWF0ZShQQVRIX09CSiwgIndlYl9ia21ya19vYmouZ2lmIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19QTEFDRVNfT0JKID0gY3JlYXRlKFBBVEhfT0JKLCAicGxhY2VzX29iai5naWYiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX1NBVkVEX09CSiA9IGNyZWF0ZShQQVRIX09CSiwgInNhdmVkX29iai5naWYiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX1VOQ09ORl9GRUFUVVJFX09CSiA9IGNyZWF0ZShQQVRIX09CSiwgInVuY29uZl9mZWF0dXJlX29iai5naWYiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX1VQREFURVNfT0JKID0gY3JlYXRlKFBBVEhfT0JKLCAidXBkYXRlc19vYmouZ2lmIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19WRklYRURfT0JKID0gY3JlYXRlKFBBVEhfT0JKLCAidmZpeGVkX29iai5naWYiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX1ZSRU1PVEVfT0JKID0gY3JlYXRlKFBBVEhfT0JKLCAidnJlbW90ZV9vYmouZ2lmIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19WUkVNT1ZBQkxFX09CSiA9IGNyZWF0ZShQQVRIX09CSiwgInZyZW1vdmFibGVfb2JqLmdpZiIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfTk9USU5TVF9GRUFUVVJFX09CSiA9IGNyZWF0ZShQQVRIX09CSiwgIm5vdGluc3RhbGxlZF9mZWF0dXJlX29iai5naWYiKTsJCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19TSE9XX1NFQVJDSCA9IGNyZWF0ZShQQVRIX09CSiwgInRzZWFyY2hfb2JqLmdpZiIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfRVJSX1NUX09CSiA9IGNyZWF0ZShQQVRIX09CSiwgImVycm9yX3N0X29iai5naWYiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX09LX1NUX09CSiA9IGNyZWF0ZShQQVRIX09CSiwgIm9rX3N0X29iai5naWYiKTsKLQotCQotCS8qKgotCSAqIE9WUjE2Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19MSU5LRURfQ08gICA9IGNyZWF0ZShQQVRIX09WUiwgImxpbmtlZF9jby5naWYiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX1VQREFURURfQ08gICA9IGNyZWF0ZShQQVRIX09WUiwgInVwZGF0ZWRfY28uZ2lmIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19JTlNUQUxMQUJMRV9DTyA9IGNyZWF0ZShQQVRIX09WUiwgImluc3RhbGxhYmxlX2NvLmdpZiIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfQ1VSUkVOVF9DTyA9IGNyZWF0ZShQQVRIX09WUiwgImN1cnJlbnRfY28uZ2lmIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19FUlJPUl9DTyA9IGNyZWF0ZShQQVRIX09WUiwgImVycm9yX2NvLmdpZiIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfV0FSTklOR19DTyA9IGNyZWF0ZShQQVRIX09WUiwgIndhcm5pbmdfY28uZ2lmIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19NT0RfQ08gPSBjcmVhdGUoUEFUSF9PVlIsICJtb2RfY28uZ2lmIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19BRERfQ08gPSBjcmVhdGUoUEFUSF9PVlIsICJhZGRfc3RhdC5naWYiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX0RFTF9DTyA9IGNyZWF0ZShQQVRIX09WUiwgImRlbF9zdGF0LmdpZiIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfVU5DT05GX0NPID0gY3JlYXRlKFBBVEhfT1ZSLCAidW5jb25maWd1cmVkX2NvLmdpZiIpOwotCi0JLyoqCi0JICogVklFVzE2Ci0JICovCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX0NPTkZJR1NfVklFVyA9IGNyZWF0ZShQQVRIX1ZJRVcsICJjb25maWdzLmdpZiIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfU0lURVNfVklFVyA9IGNyZWF0ZShQQVRIX1ZJRVcsICJ1cGRhdGVzLmdpZiIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfU0VMRUNURURfVVBEQVRFU19WSUVXID0gY3JlYXRlKFBBVEhfVklFVywgInNlbGVjdGVkX3VwZGF0ZXMuZ2lmIik7Ci0KLQkvKioKLQkgKiBMQ0wKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX0JBQ0tXQVJEX05BViA9IGNyZWF0ZShQQVRIX0xDTCwgImJhY2t3YXJkX25hdi5naWYiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX0JBQ0tXQVJEX05BVl9IID0gY3JlYXRlKFBBVEhfTENMX0hPVkVSLCAiYmFja3dhcmRfbmF2LmdpZiIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfQkFDS1dBUkRfTkFWX0QgPSBjcmVhdGUoUEFUSF9MQ0xfRElTQUJMRUQsICJiYWNrd2FyZF9uYXYuZ2lmIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19GT1JXQVJEX05BViA9IGNyZWF0ZShQQVRIX0xDTCwgImZvcndhcmRfbmF2LmdpZiIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfRk9SV0FSRF9OQVZfSCA9IGNyZWF0ZShQQVRIX0xDTF9IT1ZFUiwgImZvcndhcmRfbmF2LmdpZiIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfRk9SV0FSRF9OQVZfRCA9IGNyZWF0ZShQQVRIX0xDTF9ESVNBQkxFRCwgImZvcndhcmRfbmF2LmdpZiIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfSE9NRV9OQVYgPSBjcmVhdGUoUEFUSF9MQ0wsICJob21lX25hdi5naWYiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX0hPTUVfTkFWX0ggPSBjcmVhdGUoUEFUSF9MQ0xfSE9WRVIsICJob21lX25hdi5naWYiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX0hPTUVfTkFWX0QgPSBjcmVhdGUoUEFUSF9MQ0xfRElTQUJMRUQsICJob21lX25hdi5naWYiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX1JFRlJFU0hfTkFWID0gY3JlYXRlKFBBVEhfTENMLCAicmVmcmVzaF9uYXYuZ2lmIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19SRUZSRVNIX05BVl9IID0gY3JlYXRlKFBBVEhfTENMX0hPVkVSLCAicmVmcmVzaF9uYXYuZ2lmIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19SRUZSRVNIX05BVl9EID0gY3JlYXRlKFBBVEhfTENMX0RJU0FCTEVELCAicmVmcmVzaF9uYXYuZ2lmIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19TVE9QX05BViA9IGNyZWF0ZShQQVRIX0xDTCwgInN0b3BfbmF2LmdpZiIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfU1RPUF9OQVZfSCA9IGNyZWF0ZShQQVRIX0xDTF9IT1ZFUiwgInN0b3BfbmF2LmdpZiIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfU1RPUF9OQVZfRCA9IGNyZWF0ZShQQVRIX0xDTF9ESVNBQkxFRCwgInN0b3BfbmF2LmdpZiIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfR09fTkFWID0gY3JlYXRlKFBBVEhfTENMLCAiZ29fbmF2LmdpZiIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfR09fTkFWX0ggPSBjcmVhdGUoUEFUSF9MQ0xfSE9WRVIsICJnb19uYXYuZ2lmIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19HT19OQVZfRCA9IGNyZWF0ZShQQVRIX0xDTF9ESVNBQkxFRCwgImdvX25hdi5naWYiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX1NIT1dfVU5DT05GID0gY3JlYXRlKFBBVEhfTENMLCAic2hvd191bmNvbmYuZ2lmIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19TSE9XX1VOQ09ORl9IID0gY3JlYXRlKFBBVEhfTENMX0hPVkVSLCAic2hvd191bmNvbmYuZ2lmIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19TSE9XX1VOQ09ORl9EID0gY3JlYXRlKFBBVEhfTENMX0RJU0FCTEVELCAic2hvd191bmNvbmYuZ2lmIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19DT0xMQVBTRV9BTEwgPSBjcmVhdGUoUEFUSF9MQ0wsICJjb2xsYXBzZWFsbC5naWYiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX1NIT1dfSElFUkFSQ0hZID0gY3JlYXRlKFBBVEhfTENMLCAiaGllcmFyY2hpY2FsTGF5b3V0LmdpZiIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfU0hPV19ISUVSQVJDSFlfSCA9IGNyZWF0ZShQQVRIX0xDTF9IT1ZFUiwgImhpZXJhcmNoaWNhbExheW91dC5naWYiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX1NIT1dfSElFUkFSQ0hZX0QgPSBjcmVhdGUoUEFUSF9MQ0xfRElTQUJMRUQsICJoaWVyYXJjaGljYWxMYXlvdXQuZ2lmIik7Ci0KLQkvKioKLQkgKiBXSVoKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX0lOU1RBTExfV0laICA9IGNyZWF0ZShQQVRIX1dJWkJBTiwgImluc3RhbGxfd2l6LmdpZiIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfVVBEQVRFX1dJWiAgPSBjcmVhdGUoUEFUSF9XSVpCQU4sICJ1cGRhdGVfd2l6LmdpZiIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfQ09ORklHX1dJWiAgPSBjcmVhdGUoUEFUSF9XSVpCQU4sICJjb25maWdfd2l6LmdpZiIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfVU5JTlNUQUxMX1dJWiAgPSBjcmVhdGUoUEFUSF9XSVpCQU4sICJ1bmluc3RhbGxfd2l6LmdpZiIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfSU5TVEFMTF9CQU5ORVIgID0gY3JlYXRlKFBBVEhfV0laQkFOLCAiZGVmX3dpemJhbi5qcGciKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX0ZPUk1fQkFOTkVSICA9IGNyZWF0ZShQQVRIX0ZPUk1TLCAiZm9ybV9iYW5uZXIuanBnIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19GT1JNX0JBTk5FUl9TSE9SVCAgPSBjcmVhdGUoUEFUSF9GT1JNUywgImZvcm1fYmFubmVyLmdpZiIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfRk9STV9VTkRFUkxJTkUgID0gY3JlYXRlKFBBVEhfRk9STVMsICJmb3JtX3VuZGVybGluZTIuanBnIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19QUk9WSURFUiA9IGNyZWF0ZShQQVRIX0ZPUk1TLCAiZGVmX3Byb3ZpZGVyLmpwZyIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfSVRFTSA9IGNyZWF0ZShQQVRIX0ZPUk1TLCAidG9waWMuZ2lmIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19ORVdfQk9PS01BUksgID0gY3JlYXRlKFBBVEhfV0laQkFOLCAibmV3X2Jvb2ttYXJrX3dpei5naWYiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX05FV19GT0xERVIgID0gY3JlYXRlKFBBVEhfV0laQkFOLCAibmV3X2ZvbGRlcl93aXouZ2lmIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19ORVdfU0VBUkNIICA9IGNyZWF0ZShQQVRIX1dJWkJBTiwgIm5ld19zZWFyY2hfd2l6LmdpZiIpOwotCi0JcHJpdmF0ZSBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGNyZWF0ZShTdHJpbmcgcHJlZml4LCBTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwobWFrZUltYWdlVVJMKHByZWZpeCwgbmFtZSkpOwotCX0KLQotCi0JcHVibGljIHN0YXRpYyBJbWFnZSBnZXQoU3RyaW5nIGtleSkgewotCQlpZiAoUExVR0lOX1JFR0lTVFJZPT1udWxsKSBpbml0aWFsaXplKCk7Ci0JCXJldHVybiBQTFVHSU5fUkVHSVNUUlkuZ2V0KGtleSk7Ci0JfQotCi0KLXB1YmxpYyBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oCi0JSVBsdWdpbkRlc2NyaXB0b3IgcGx1Z2luRGVzY3JpcHRvciwgCi0JU3RyaW5nIHN1YmRpcmVjdG9yeUFuZEZpbGVuYW1lKSB7Ci0JVVJMIGluc3RhbGxVUkwgPSBwbHVnaW5EZXNjcmlwdG9yLmdldEluc3RhbGxVUkwoKTsKLQl0cnkgewotCQlVUkwgbmV3VVJMID0gbmV3IFVSTChpbnN0YWxsVVJMLCBzdWJkaXJlY3RvcnlBbmRGaWxlbmFtZSk7Ci0JCXJldHVybiBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTChuZXdVUkwpOwotCX0KLQljYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQl9Ci0JcmV0dXJuIG51bGw7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBJbWFnZSBnZXRJbWFnZUZyb21QbHVnaW4oCi0JSVBsdWdpbkRlc2NyaXB0b3IgcGx1Z2luRGVzY3JpcHRvciwKLQlTdHJpbmcgc3ViZGlyZWN0b3J5QW5kRmlsZW5hbWUpIHsKLQlVUkwgaW5zdGFsbFVSTCA9IHBsdWdpbkRlc2NyaXB0b3IuZ2V0SW5zdGFsbFVSTCgpOwotCUltYWdlIGltYWdlID0gbnVsbDsKLQl0cnkgewotCQlVUkwgbmV3VVJMID0gbmV3IFVSTChpbnN0YWxsVVJMLCBzdWJkaXJlY3RvcnlBbmRGaWxlbmFtZSk7Ci0JCVN0cmluZyBrZXkgPSBuZXdVUkwudG9TdHJpbmcoKTsKLQkJaWYgKFBMVUdJTl9SRUdJU1RSWT09bnVsbCkgaW5pdGlhbGl6ZSgpOwotCQlpbWFnZSA9IFBMVUdJTl9SRUdJU1RSWS5nZXQoa2V5KTsKLQkJaWYgKGltYWdlPT1udWxsKSB7Ci0JCQlJbWFnZURlc2NyaXB0b3IgZGVzYyA9IEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKG5ld1VSTCk7Ci0JCQlpbWFnZSA9IGRlc2MuY3JlYXRlSW1hZ2UoKTsKLQkJCVBMVUdJTl9SRUdJU1RSWS5wdXQoa2V5LCBpbWFnZSk7Ci0JCX0KLQl9Ci0JY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JfQotCXJldHVybiBpbWFnZTsKLX0KLS8qIHBhY2thZ2UgKi8KLXByaXZhdGUgc3RhdGljIGZpbmFsIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQlQTFVHSU5fUkVHSVNUUlkgPSBuZXcgSW1hZ2VSZWdpc3RyeSgpOwotCW1hbmFnZShJTUdfRk9STV9CQU5ORVJfU0hPUlQsIERFU0NfRk9STV9CQU5ORVJfU0hPUlQpOwotCW1hbmFnZShJTUdfRk9STV9CQU5ORVIsIERFU0NfRk9STV9CQU5ORVIpOwotCW1hbmFnZShJTUdfRk9STV9VTkRFUkxJTkUsIERFU0NfRk9STV9VTkRFUkxJTkUpOwotfQotCi0KLXByaXZhdGUgc3RhdGljIFVSTCBtYWtlSW1hZ2VVUkwoU3RyaW5nIHByZWZpeCwgU3RyaW5nIG5hbWUpIHsKLQlTdHJpbmcgcGF0aCA9IHByZWZpeCArIG5hbWU7Ci0JVVJMIHVybCA9IG51bGw7Ci0JdHJ5IHsKLQkJdXJsID0gbmV3IFVSTChCQVNFX1VSTCwgcGF0aCk7Ci0JfQotCWNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcmV0dXJuIHVybDsKLX0KLQotcHVibGljIHN0YXRpYyBJbWFnZSBtYW5hZ2UoU3RyaW5nIGtleSwgSW1hZ2VEZXNjcmlwdG9yIGRlc2MpIHsKLQlJbWFnZSBpbWFnZSA9IGRlc2MuY3JlYXRlSW1hZ2UoKTsKLQlQTFVHSU5fUkVHSVNUUlkucHV0KGtleSwgaW1hZ2UpOwotCXJldHVybiBpbWFnZTsKLX0KLQotcHVibGljIHN0YXRpYyBVUkwgZ2V0RGVmYXVsdFByb3ZpZGVySW1hZ2VVUkwoKSB7Ci0JVVJMIHVybCA9IG1ha2VJbWFnZVVSTChQQVRIX0ZPUk1TLCAiZGVmX3Byb3ZpZGVyLmpwZyIpOwotCXRyeSB7Ci0JCXVybCA9IFBsYXRmb3JtLnJlc29sdmUodXJsKTsKLQl9Ci0JY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQl9Ci0JcmV0dXJuIHVybDsgCi19Ci0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvc3JjL29yZy9lY2xpcHNlL3dlbGNvbWUvaW50ZXJuYWwvV2VsY29tZVBvcnRhbFJlc291cmNlcy5wcm9wZXJ0aWVzIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvd2VsY29tZS9pbnRlcm5hbC9XZWxjb21lUG9ydGFsUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5MWVlNDIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvd2VsY29tZS9pbnRlcm5hbC9XZWxjb21lUG9ydGFsUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyAKLSMKLSMKLQotQnJvd3NlclBhZ2UuYWRkcmVzcyA9IEFkZHJlc3M6Ci1Ccm93c2VyUGFnZS5zdG9wID0gU3RvcAotQnJvd3NlclBhZ2UuZ28gPSBHbwotQnJvd3NlclBhZ2UucmVmcmVzaCA9IFJlZnJlc2gKLQotV2ViQnJvd3NlclZpZXcubm90QXZhaWxhYmxlID0gRW1iZWRkZWQgV2ViIGJyb3dzZXIgaXMgbm90IGF2YWlsYWJsZS4gXAotUmVxdWllc3RzIGZvciBvcGVuaW5nIFVSTHMgYXJlIHByb2Nlc3NlZCB1c2luZyBXZWIgYnJvd3NlciByZWdpc3RlcmVkIHRvIGhhbmRsZSBcCi1XZWIgcGFnZXMgb24geW91ciBzeXN0ZW0uCi1XZWJCcm93c2VyVmlldy5hZGRyZXNzID0gQWRkcmVzczoKLVdlYkJyb3dzZXJWaWV3LnN0b3AgPSBTdG9wCi1XZWJCcm93c2VyVmlldy5nbyA9IEdvCi1XZWJCcm93c2VyVmlldy5ob21lID0gR28gSG9tZQotV2ViQnJvd3NlclZpZXcucmVmcmVzaCA9IFJlZnJlc2gKLVdlYkJyb3dzZXJWaWV3LmJhY2t3YXJkID0gR28gQmFjawotV2ViQnJvd3NlclZpZXcuZm9yd2FyZCA9IEdvIEZvcndhcmQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3NyYy9vcmcvZWNsaXBzZS93ZWxjb21lL2ludGVybmFsL2FjdGlvbnMvVGlwc0FuZFRyaWNrc0NvbnRlbnRQcm92aWRlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvd2VsY29tZS9pbnRlcm5hbC9hY3Rpb25zL1RpcHNBbmRUcmlja3NDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjViM2I5YS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3NyYy9vcmcvZWNsaXBzZS93ZWxjb21lL2ludGVybmFsL2FjdGlvbnMvVGlwc0FuZFRyaWNrc0NvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gSnVuIDIwLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud2VsY29tZS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndlbGNvbWUuaW50ZXJuYWwuV2VsY29tZVBvcnRhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53ZWxjb21lLmludGVybmFsLnBvcnRhbC4qOwotCi0vKioKLSAqIEBhdXRob3IgZGVqYW4KLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgVGlwc0FuZFRyaWNrc0NvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElGb3JtQ29udGVudFByb3ZpZGVyIHsKLQlwcml2YXRlIElGb3JtQ29udGVudE9ic2VydmVyIG9ic2VydmVyOwotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud2VsY29tZS5pbnRlcm5hbC5wb3J0YWwuSUZvcm1Db250ZW50UHJvdmlkZXIjZ2V0Q29udGVudCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb250ZW50KCkgewotCQkvKgotCQkvLyBBc2sgdGhlIHVzZXIgdG8gc2VsZWN0IGEgZmVhdHVyZQotCQlBYm91dEluZm9bXSBmZWF0dXJlcyA9ICgoV29ya2JlbmNoKSBXZWxjb21lUG9ydGFsLmdldERlZmF1bHQoKS5nZXRXb3JrYmVuY2goKSkuZ2V0Q29uZmlndXJhdGlvbkluZm8oKS5nZXRGZWF0dXJlc0luZm8oKTsKLQkJQXJyYXlMaXN0IHdlbGNvbWVGZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJU3RyaW5nV3JpdGVyIHN3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCVByaW50V3JpdGVyIHdyaXRlciA9IG5ldyBQcmludFdyaXRlcihzd3JpdGVyKTsKLQkJd3JpdGVyLnByaW50bG4oIjxmb3JtPiIpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlBYm91dEluZm8gZmVhdHVyZSA9IGZlYXR1cmVzW2ldOwotCQkJaWYgKGZlYXR1cmUuZ2V0V2VsY29tZVBhZ2VVUkwoKSAhPSBudWxsKSB7Ci0JCQkJYWRkRmVhdHVyZUxpbmsod3JpdGVyLCBmZWF0dXJlKTsKLQkJCX0KLQkJfQotCQl3cml0ZXIucHJpbnRsbigiPC9mb3JtPiIpOwotCQl3cml0ZXIuY2xvc2UoKTsKLQkJcmV0dXJuIHN3cml0ZXIudG9TdHJpbmcoKTsKLQkJKi8KLQkJcmV0dXJuICI8Zm9ybT48L2Zvcm0+IjsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkRmVhdHVyZUxpbmsoUHJpbnRXcml0ZXIgd3JpdGVyLCBBYm91dEluZm8gZmVhdHVyZSkgewotCQlTdHJpbmcgbmFtZSA9IGZlYXR1cmUuZ2V0RmVhdHVyZUxhYmVsKCk7Ci0JCVN0cmluZyBocmVmID0gZmVhdHVyZS5nZXRUaXBzQW5kVHJpY2tzSHJlZigpOwotCQlpZiAoaHJlZj09bnVsbCkgcmV0dXJuOwotCQl3cml0ZXIucHJpbnQoIjxsaT4iKTsKLQkJd3JpdGVyLnByaW50KCI8YSBocmVmPVwiaGVscFwiIGFyZz1cIiIraHJlZisiXCI+IituYW1lKyI8L2E+Iik7Ci0JCXdyaXRlci5wcmludGxuKCI8L2xpPiIpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndlbGNvbWUuaW50ZXJuYWwucG9ydGFsLklGb3JtQ29udGVudFByb3ZpZGVyI3NldENvbnRlbnRPYnNlcnZlcihvcmcuZWNsaXBzZS53ZWxjb21lLmludGVybmFsLnBvcnRhbC5JRm9ybUNvbnRlbnRPYnNlcnZlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb250ZW50T2JzZXJ2ZXIoSUZvcm1Db250ZW50T2JzZXJ2ZXIgb2JzZXJ2ZXIpIHsKLQkJdGhpcy5vYnNlcnZlciA9IG9ic2VydmVyOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvc3JjL29yZy9lY2xpcHNlL3dlbGNvbWUvaW50ZXJuYWwvYWN0aW9ucy9XZWxjb21lQ29udGVudFByb3ZpZGVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3NyYy9vcmcvZWNsaXBzZS93ZWxjb21lL2ludGVybmFsL2FjdGlvbnMvV2VsY29tZUNvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWMyZDc5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvc3JjL29yZy9lY2xpcHNlL3dlbGNvbWUvaW50ZXJuYWwvYWN0aW9ucy9XZWxjb21lQ29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBKdW4gMjAsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53ZWxjb21lLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndlbGNvbWUuaW50ZXJuYWwuV2VsY29tZVBvcnRhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53ZWxjb21lLmludGVybmFsLnBvcnRhbC4qOwotCi0vKioKLSAqIEBhdXRob3IgZGVqYW4KLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgV2VsY29tZUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElGb3JtQ29udGVudFByb3ZpZGVyIHsKLQlwcml2YXRlIElGb3JtQ29udGVudE9ic2VydmVyIG9ic2VydmVyOwotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud2VsY29tZS5pbnRlcm5hbC5wb3J0YWwuSUZvcm1Db250ZW50UHJvdmlkZXIjZ2V0Q29udGVudCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb250ZW50KCkgewotCQkvKgotCQkvLyBBc2sgdGhlIHVzZXIgdG8gc2VsZWN0IGEgZmVhdHVyZQotCQlBYm91dEluZm9bXSBmZWF0dXJlcyA9ICgoV29ya2JlbmNoKSBXZWxjb21lUG9ydGFsLmdldERlZmF1bHQoKS5nZXRXb3JrYmVuY2goKSkuZ2V0Q29uZmlndXJhdGlvbkluZm8oKS5nZXRGZWF0dXJlc0luZm8oKTsKLQkJQXJyYXlMaXN0IHdlbGNvbWVGZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJU3RyaW5nV3JpdGVyIHN3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCVByaW50V3JpdGVyIHdyaXRlciA9IG5ldyBQcmludFdyaXRlcihzd3JpdGVyKTsKLQkJd3JpdGVyLnByaW50bG4oIjxmb3JtPiIpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlBYm91dEluZm8gZmVhdHVyZSA9IGZlYXR1cmVzW2ldOwotCQkJaWYgKGZlYXR1cmUuZ2V0V2VsY29tZVBhZ2VVUkwoKSAhPSBudWxsKSB7Ci0JCQkJYWRkRmVhdHVyZUxpbmsod3JpdGVyLCBmZWF0dXJlKTsKLQkJCX0KLQkJfQotCQl3cml0ZXIucHJpbnRsbigiPC9mb3JtPiIpOwotCQkvKgotCi0JCWlmIChwZXJzcGVjdGl2ZUlkICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJcGFnZSA9IChXb3JrYmVuY2hQYWdlKSB3aW5kb3cuZ2V0V29ya2JlbmNoKCkuc2hvd1BlcnNwZWN0aXZlKHBlcnNwZWN0aXZlSWQsIHdpbmRvdyk7Ci0JCQl9IGNhdGNoIChXb3JrYmVuY2hFeGNlcHRpb24gZSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCi0JCXBhZ2Uuc2V0RWRpdG9yQXJlYVZpc2libGUodHJ1ZSk7Ci0KLQkJLy8gY3JlYXRlIGlucHV0Ci0JCVdlbGNvbWVFZGl0b3JJbnB1dCBpbnB1dCA9IG5ldyBXZWxjb21lRWRpdG9ySW5wdXQoZmVhdHVyZSk7Ci0KLQkJLy8gc2VlIGlmIHdlIGFscmVhZHkgaGF2ZSBhIHdlbGNvbWUgZWRpdG9yCi0JCUlFZGl0b3JQYXJ0IGVkaXRvciA9IHBhZ2UuZmluZEVkaXRvcihpbnB1dCk7Ci0JCWlmIChlZGl0b3IgIT0gbnVsbCkgewotCQkJcGFnZS5hY3RpdmF0ZShlZGl0b3IpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCXBhZ2Uub3BlbkVkaXRvcihpbnB1dCwgRURJVE9SX0lEKTsKLQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJSVN0YXR1cyBzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFdvcmtiZW5jaFBsdWdpbi5QSV9XT1JLQkVOQ0gsIDEsIFdvcmtiZW5jaE1lc3NhZ2VzLmdldFN0cmluZygiUXVpY2tTdGFydEFjdGlvbi5vcGVuRWRpdG9yRXhjZXB0aW9uIiksIGUpOyAvLyROT04tTkxTLTEkCi0JCQlFcnJvckRpYWxvZy5vcGVuRXJyb3IoCi0JCQkJd2luZG93LmdldFNoZWxsKCksCi0JCQkJV29ya2JlbmNoTWVzc2FnZXMuZ2V0U3RyaW5nKCJXb3JrYmVuY2gub3BlbkVkaXRvckVycm9yRGlhbG9nVGl0bGUiKSwgIC8vJE5PTi1OTFMtMSQKLQkJCQlXb3JrYmVuY2hNZXNzYWdlcy5nZXRTdHJpbmcoIldvcmtiZW5jaC5vcGVuRWRpdG9yRXJyb3JEaWFsb2dNZXNzYWdlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQlzdGF0dXMpOwotCQl9Ci0JCXdyaXRlci5jbG9zZSgpOwotCQlyZXR1cm4gc3dyaXRlci50b1N0cmluZygpOwotCQkqLwotCQlyZXR1cm4gIjxmb3JtPjwvZm9ybT4iOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRGZWF0dXJlTGluayhQcmludFdyaXRlciB3cml0ZXIsIEFib3V0SW5mbyBmZWF0dXJlKSB7Ci0JCVN0cmluZyBuYW1lID0gZmVhdHVyZS5nZXRGZWF0dXJlTGFiZWwoKTsKLQkJVVJMIHdlbGNvbWVVUkwgPSBmZWF0dXJlLmdldFdlbGNvbWVQYWdlVVJMKCk7Ci0JCVN0cmluZyBhY3Rpb24gPSAiIjsKLQkJd3JpdGVyLnByaW50KCI8bGk+Iik7Ci0JCXdyaXRlci5wcmludCgiPGEgaHJlZj1cImFjdGlvblwiPiIrbmFtZSsiPC9hPiIpOwotCQl3cml0ZXIucHJpbnRsbigiPC9saT4iKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53ZWxjb21lLmludGVybmFsLnBvcnRhbC5JRm9ybUNvbnRlbnRQcm92aWRlciNzZXRDb250ZW50T2JzZXJ2ZXIob3JnLmVjbGlwc2Uud2VsY29tZS5pbnRlcm5hbC5wb3J0YWwuSUZvcm1Db250ZW50T2JzZXJ2ZXIpCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29udGVudE9ic2VydmVyKElGb3JtQ29udGVudE9ic2VydmVyIG9ic2VydmVyKSB7Ci0JCXRoaXMub2JzZXJ2ZXIgPSBvYnNlcnZlcjsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3NyYy9vcmcvZWNsaXBzZS93ZWxjb21lL2ludGVybmFsL3BvcnRhbC9IZWxwU2VjdGlvbi5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvd2VsY29tZS9pbnRlcm5hbC9wb3J0YWwvSGVscFNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzkzZGUyYi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3NyYy9vcmcvZWNsaXBzZS93ZWxjb21lL2ludGVybmFsL3BvcnRhbC9IZWxwU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gSnVuIDIwLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud2VsY29tZS5pbnRlcm5hbC5wb3J0YWw7Ci0KLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMRW5jb2RlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuV29ya2JlbmNoSGVscDsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMuaW50ZXJuYWwuKjsKLQotLyoqCi0gKiBAYXV0aG9yIGRlamFuCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEhlbHBTZWN0aW9uIGltcGxlbWVudHMgSVBvcnRhbFNlY3Rpb25Gb3JtIHsKLQlwcml2YXRlIFRleHQgcGhyYXNlVGV4dDsKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndlbGNvbWUuaW50ZXJuYWwucG9ydGFsLklQb3J0YWxTZWN0aW9uI2luaXQob3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zLmludGVybmFsLklGb3JtUGFnZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElGb3JtUGFnZSBwYWdlKSB7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud2VsY29tZS5pbnRlcm5hbC5wb3J0YWwuSVBvcnRhbFNlY3Rpb24jY3JlYXRlQ29udHJvbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHVibGljIENvbnRyb2wgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50LCBGb3JtV2lkZ2V0RmFjdG9yeSBmYWN0b3J5KSB7Ci0JCUNvbXBvc2l0ZSBjb250YWluZXIgPSBmYWN0b3J5LmNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMzsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJY29udGFpbmVyLnNldExheW91dChsYXlvdXQpOwotCQlmYWN0b3J5LmNyZWF0ZUxhYmVsKGNvbnRhaW5lciwgIlBocmFzZToiKTsKLQkJcGhyYXNlVGV4dCA9IGZhY3RvcnkuY3JlYXRlVGV4dChjb250YWluZXIsICIiKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJcGhyYXNlVGV4dC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJZmluYWwgQnV0dG9uIGJ1dHRvbiA9IGZhY3RvcnkuY3JlYXRlQnV0dG9uKGNvbnRhaW5lciwgIkdvIiwgU1dULlBVU0gpOwotCQlidXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJZG9TZWFyY2gocGhyYXNlVGV4dC5nZXRUZXh0KCkpOwotCQkJfQotCQl9KTsKLQkJYnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQlwaHJhc2VUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCVN0cmluZyB0ZXh0PXBocmFzZVRleHQuZ2V0VGV4dCgpOwotCQkJCWJ1dHRvbi5zZXRFbmFibGVkKHRleHQubGVuZ3RoKCk+MCk7Ci0JCQl9Ci0JCX0pOwotCQlwaHJhc2VUZXh0LmFkZEtleUxpc3RlbmVyKG5ldyBLZXlBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQga2V5UmVsZWFzZWQoS2V5RXZlbnQgZSkgewotCQkJCWlmIChlLmNoYXJhY3Rlcj09J1xyJykgewotCQkJCQlpZiAoYnV0dG9uLmlzRW5hYmxlZCgpKQotCQkJCQkJZG9TZWFyY2gocGhyYXNlVGV4dC5nZXRUZXh0KCkpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCWZhY3RvcnkucGFpbnRCb3JkZXJzRm9yKGNvbnRhaW5lcik7Ci0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCXByaXZhdGUgdm9pZCBkb1NlYXJjaChTdHJpbmcgcGhyYXNlKSB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgZXBocmFzZSA9IFVSTEVuY29kZXIuZW5jb2RlKHBocmFzZSwgIlVURi04Iik7Ci0JCQlTdHJpbmcgcXVlcnkgPSAidGFiPXNlYXJjaCZzZWFyY2hXb3JkPSIrZXBocmFzZTsKLQkJCVdvcmtiZW5jaEhlbHAuZ2V0SGVscFN1cHBvcnQoKS5kaXNwbGF5SGVscFJlc291cmNlKHF1ZXJ5KTsKLQkJfQotCQljYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oZSk7Ci0JCX0KLQl9IAotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvd2VsY29tZS9pbnRlcm5hbC9wb3J0YWwvSUZvcm1Db250ZW50T2JzZXJ2ZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvc3JjL29yZy9lY2xpcHNlL3dlbGNvbWUvaW50ZXJuYWwvcG9ydGFsL0lGb3JtQ29udGVudE9ic2VydmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhNzgwMWIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvd2VsY29tZS9pbnRlcm5hbC9wb3J0YWwvSUZvcm1Db250ZW50T2JzZXJ2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIEp1biAyMCwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndlbGNvbWUuaW50ZXJuYWwucG9ydGFsOwotCi0vKioKLSAqIEBhdXRob3IgZGVqYW4KLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgaW50ZXJmYWNlIElGb3JtQ29udGVudE9ic2VydmVyIHsKLQlwdWJsaWMgdm9pZCBjb250ZW50Q2hhbmdlZChJRm9ybUNvbnRlbnRQcm92aWRlciBwcm92aWRlcik7Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3NyYy9vcmcvZWNsaXBzZS93ZWxjb21lL2ludGVybmFsL3BvcnRhbC9JRm9ybUNvbnRlbnRQcm92aWRlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvd2VsY29tZS9pbnRlcm5hbC9wb3J0YWwvSUZvcm1Db250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTVlODVlZS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3NyYy9vcmcvZWNsaXBzZS93ZWxjb21lL2ludGVybmFsL3BvcnRhbC9JRm9ybUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gSnVuIDIwLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud2VsY29tZS5pbnRlcm5hbC5wb3J0YWw7Ci0KLS8qKgotICogQGF1dGhvciBkZWphbgotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUZvcm1Db250ZW50UHJvdmlkZXIgewotCVN0cmluZyBnZXRDb250ZW50KCk7Ci0Jdm9pZCBzZXRDb250ZW50T2JzZXJ2ZXIoSUZvcm1Db250ZW50T2JzZXJ2ZXIgb2JzZXJ2ZXIpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvc3JjL29yZy9lY2xpcHNlL3dlbGNvbWUvaW50ZXJuYWwvcG9ydGFsL0lQb3J0YWxTZWN0aW9uRm9ybS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvd2VsY29tZS9pbnRlcm5hbC9wb3J0YWwvSVBvcnRhbFNlY3Rpb25Gb3JtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3ZDc3YTYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvd2VsY29tZS9pbnRlcm5hbC9wb3J0YWwvSVBvcnRhbFNlY3Rpb25Gb3JtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBKdW4gMTksIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53ZWxjb21lLmludGVybmFsLnBvcnRhbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zLmludGVybmFsLio7Ci0KLS8qKgotICogQGF1dGhvciBkZWphbgotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVBvcnRhbFNlY3Rpb25Gb3JtIHsKLQl2b2lkIGluaXQoSUZvcm1QYWdlIHBhZ2UpOwotCUNvbnRyb2wgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50LCBGb3JtV2lkZ2V0RmFjdG9yeSBmYWN0b3J5KTsKLQl2b2lkIGRpc3Bvc2UoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3NyYy9vcmcvZWNsaXBzZS93ZWxjb21lL2ludGVybmFsL3BvcnRhbC9Qb3J0YWxTZWN0aW9uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3NyYy9vcmcvZWNsaXBzZS93ZWxjb21lL2ludGVybmFsL3BvcnRhbC9Qb3J0YWxTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyNWVhYTIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvd2VsY29tZS9pbnRlcm5hbC9wb3J0YWwvUG9ydGFsU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg5ICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIEp1biAxOSwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndlbGNvbWUuaW50ZXJuYWwucG9ydGFsOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGVscC5Xb3JrYmVuY2hIZWxwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbC5lbmdpbmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53ZWxjb21lLmludGVybmFsLldlbGNvbWVQb3J0YWw7Ci0KLS8qKgotICogQGF1dGhvciBkZWphbgotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBQb3J0YWxTZWN0aW9uIGV4dGVuZHMgRm9ybVNlY3Rpb24gIHsKLQlwcml2YXRlIFNlY3Rpb25EZXNjcmlwdG9yIGRlc2M7Ci0JcHJpdmF0ZSBXZWxjb21lUG9ydGFsRm9ybSBmb3JtOwotCXByaXZhdGUgSHlwZXJsaW5rQWN0aW9uIGVjbGlwc2VBY3Rpb247Ci0JcHJpdmF0ZSBIVFRQQWN0aW9uIGh0dHBBY3Rpb247Ci0JcHJpdmF0ZSBIeXBlcmxpbmtBY3Rpb24gaGVscEFjdGlvbjsKLQlwcml2YXRlIENvbXBvc2l0ZSBmb3JtQ29udGFpbmVyOwotCXByaXZhdGUgSGFzaHRhYmxlIGVjbGlwc2VBY3Rpb25zOwotCi0JY2xhc3MgQWN0aW9uV3JhcHBlciBleHRlbmRzIEFjdGlvbiB7Ci0JCUlBY3Rpb25EZWxlZ2F0ZSBkZWxlZ2F0ZTsKLQotCQlwdWJsaWMgQWN0aW9uV3JhcHBlcihTdHJpbmcgYXJnLCBJQWN0aW9uRGVsZWdhdGUgZGVsZWdhdGUpIHsKLQkJCXN1cGVyKGFyZyk7Ci0JCQl0aGlzLmRlbGVnYXRlID0gZGVsZWdhdGU7Ci0JCQlpZiAoZGVsZWdhdGUgaW5zdGFuY2VvZiBJV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUpCi0JCQkJKChJV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUpIGRlbGVnYXRlKS5pbml0KAotCQkJCQlXZWxjb21lUG9ydGFsLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlkZWxlZ2F0ZS5ydW4odGhpcyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgUG9ydGFsU2VjdGlvbihTZWN0aW9uRGVzY3JpcHRvciBkZXNjLCBXZWxjb21lUG9ydGFsRm9ybSBmb3JtKSB7Ci0JCXRoaXMuZGVzYyA9IGRlc2M7Ci0JCXRoaXMuZm9ybSA9IGZvcm07Ci0JCXNldERlc2NyaXB0aW9uUGFpbnRlZChmYWxzZSk7Ci0JCXNldENvbGxhcHNhYmxlKHRydWUpOwotCQlzZXRIZWFkZXJUZXh0KGRlc2MuZ2V0TmFtZSgpKTsKLQkJbWFrZUh5cGVybGlua0FjdGlvbnMoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgbWFrZUh5cGVybGlua0FjdGlvbnMoKSB7Ci0JCUlBY3Rpb25CYXJzIGJhcnMgPQotCQkJZm9ybS5nZXRQb3J0YWwoKS5nZXRFZGl0b3IoKS5nZXRFZGl0b3JTaXRlKCkuZ2V0QWN0aW9uQmFycygpOwotCQlodHRwQWN0aW9uID0gbmV3IEhUVFBBY3Rpb24oKSB7Ci0JCQlwdWJsaWMgdm9pZCBsaW5rQWN0aXZhdGVkKElIeXBlcmxpbmtTZWdtZW50IGxpbmspIHsKLQkJCQlTdHJpbmcgdXJsID0gbGluay5nZXRBcmcoKTsKLQkJCQlpZiAodXJsICE9IG51bGwpCi0JCQkJCVdlbGNvbWVQb3J0YWwuc2hvd1VSTChsaW5rLmdldFRleHQoKSwgdXJsKTsKLQkJCX0KLQkJfTsKLQkJaHR0cEFjdGlvbi5zZXRTdGF0dXNMaW5lTWFuYWdlcihiYXJzLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCkpOwotCQllY2xpcHNlQWN0aW9uID0gbmV3IEh5cGVybGlua0FjdGlvbigpIHsKLQkJCXB1YmxpYyB2b2lkIGxpbmtBY3RpdmF0ZWQoSUh5cGVybGlua1NlZ21lbnQgbGluaykgewotCQkJCVN0cmluZyBhcmcgPSBsaW5rLmdldEFyZygpOwotCQkJCWlmIChhcmcgIT0gbnVsbCkKLQkJCQkJcnVuRWNsaXBzZUFjdGlvbihhcmcpOwotCQkJfQotCQl9OwotCQllY2xpcHNlQWN0aW9uLnNldFN0YXR1c0xpbmVNYW5hZ2VyKGJhcnMuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKSk7Ci0JCWhlbHBBY3Rpb24gPSBuZXcgSHlwZXJsaW5rQWN0aW9uKCkgewotCQkJcHVibGljIHZvaWQgbGlua0FjdGl2YXRlZChJSHlwZXJsaW5rU2VnbWVudCBsaW5rKSB7Ci0JCQkJU3RyaW5nIGFyZyA9IGxpbmsuZ2V0QXJnKCk7Ci0JCQkJaWYgKGFyZyAhPSBudWxsKQotCQkJCQlvcGVuRWNsaXBzZUhlbHAoYXJnKTsKLQkJCX0KLQkJfTsKLQkJaGVscEFjdGlvbi5zZXRTdGF0dXNMaW5lTWFuYWdlcihiYXJzLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCkpOwotCX0KLQlwdWJsaWMgQ29tcG9zaXRlIGNyZWF0ZUNsaWVudCgKLQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJRm9ybVdpZGdldEZhY3RvcnkgZmFjdG9yeSkgewotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnID0gZGVzYy5nZXRDb25maWcoKTsKLQkJZm9ybUNvbnRhaW5lciA9IGZhY3RvcnkuY3JlYXRlQ29tcG9zaXRlKHBhcmVudCk7Ci0JCUhUTUxUYWJsZUxheW91dCBsYXlvdXQgPSBuZXcgSFRNTFRhYmxlTGF5b3V0KCk7Ci0JCWZvcm1Db250YWluZXIuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWxheW91dC50b3BNYXJnaW4gPSBsYXlvdXQuYm90dG9tTWFyZ2luID0gMDsKLQkJbGF5b3V0LmxlZnRNYXJnaW4gPSBsYXlvdXQucmlnaHRNYXJnaW4gPSAwOwotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjaGlsZHJlbiA9IGNvbmZpZy5nZXRDaGlsZHJlbigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgY2hpbGQgPSBjaGlsZHJlbltpXTsKLQkJCWlmIChjaGlsZC5nZXROYW1lKCkuZXF1YWxzKCJmb3JtIikpIHsKLQkJCQljcmVhdGVGb3JtKGZvcm1Db250YWluZXIsIGNoaWxkLCBmYWN0b3J5KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZm9ybUNvbnRhaW5lcjsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlRm9ybSgKLQkJZmluYWwgQ29tcG9zaXRlIHBhcmVudCwKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZywKLQkJRm9ybVdpZGdldEZhY3RvcnkgZmFjdG9yeSkgewotCQlTdHJpbmcgdHlwZSA9IGNvbmZpZy5nZXRBdHRyaWJ1dGUoInR5cGUiKTsKLQkJaWYgKHR5cGUgIT0gbnVsbCAmJiB0eXBlLmVxdWFscygiY3VzdG9tIikpIHsKLQkJCWNyZWF0ZUN1c3RvbUZvcm0ocGFyZW50LCBjb25maWcsIGZhY3RvcnkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWZpbmFsIEZvcm1FbmdpbmUgZW5naW5lID0gZmFjdG9yeS5jcmVhdGVGb3JtRW5naW5lKHBhcmVudCk7Ci0JCS8vZW5naW5lLnNldEJhY2tncm91bmQocGFyZW50LmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQ1lBTikpOwotCQllbmdpbmUuc2V0SHlwZXJsaW5rU2V0dGluZ3MoZmFjdG9yeS5nZXRIeXBlcmxpbmtIYW5kbGVyKCkpOwotCQlUYWJsZURhdGEgdGQgPSBuZXcgVGFibGVEYXRhKFRhYmxlRGF0YS5GSUxMLCBUYWJsZURhdGEuVE9QKTsKLQkJdGQuZ3JhYkhvcml6b250YWwgPSB0cnVlOwotCQllbmdpbmUuc2V0TGF5b3V0RGF0YSh0ZCk7Ci0JCWVuZ2luZS5yZWdpc3RlclRleHRPYmplY3QoInVybCIsIGh0dHBBY3Rpb24pOwotCQllbmdpbmUucmVnaXN0ZXJUZXh0T2JqZWN0KCJhY3Rpb24iLCBlY2xpcHNlQWN0aW9uKTsKLQkJZW5naW5lLnJlZ2lzdGVyVGV4dE9iamVjdCgiaGVscCIsIGhlbHBBY3Rpb24pOwotCQlpZiAodHlwZSA9PSBudWxsIHx8IHR5cGUuZXF1YWxzKCJsb2NhbCIpKSB7Ci0JCQlTdHJpbmcgdmFsdWUgPSBjb25maWcuZ2V0VmFsdWUoKTsKLQkJCWVuZ2luZS5sb2FkKCI8Zm9ybT4iICsgdmFsdWUgKyAiPC9mb3JtPiIsIHRydWUsIGZhbHNlKTsKLQkJfSBlbHNlIGlmICh0eXBlLmVxdWFscygiZHluYW1pYyIpKSB7Ci0JCQlJRm9ybUNvbnRlbnRQcm92aWRlciBwcm92aWRlciA9IGNyZWF0ZUNvbnRlbnRQcm92aWRlcihjb25maWcpOwotCQkJaWYgKHByb3ZpZGVyIT1udWxsKSB7Ci0JCQkJZW5naW5lLmxvYWQocHJvdmlkZXIuZ2V0Q29udGVudCgpLCB0cnVlLCBmYWxzZSk7Ci0JCQkJcHJvdmlkZXIuc2V0Q29udGVudE9ic2VydmVyKG5ldyBJRm9ybUNvbnRlbnRPYnNlcnZlcigpIHsKLQkJCQkJcHVibGljIHZvaWQgY29udGVudENoYW5nZWQoSUZvcm1Db250ZW50UHJvdmlkZXIgcHJvdmlkZXIpIHsKLQkJCQkJCWVuZ2luZS5sb2FkKHByb3ZpZGVyLmdldENvbnRlbnQoKSwgdHJ1ZSwgZmFsc2UpOwotCQkJCQkJcmVmbG93KCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQkJfSBlbHNlIGlmICh0eXBlLmVxdWFscygicmVtb3RlIikpIHsKLQkJCVN0cmluZyB1cmxOYW1lID0gY29uZmlnLmdldEF0dHJpYnV0ZSgidXJsIik7Ci0JCQl0cnkgewotCQkJCWZpbmFsIFVSTCB1cmwgPSBuZXcgVVJMKHVybE5hbWUpOwotCQkJCVJ1bm5hYmxlIGxvYWRlciA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJSW5wdXRTdHJlYW0gaXMgPSBudWxsOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQlpcyA9IHVybC5vcGVuU3RyZWFtKCk7Ci0JCQkJCQkJZW5naW5lLmxvYWQoaXMsIGZhbHNlKTsKLQkJCQkJCQlwYXJlbnQuZ2V0RGlzcGxheSgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQkJcmVmbG93KCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9KTsKLQkJCQkJCX0gY2F0Y2ggKGZpbmFsIElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlwYXJlbnQuZ2V0RGlzcGxheSgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQkJV2VsY29tZVBvcnRhbC5sb2dFeGNlcHRpb24oZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9KTsKLQotCQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlpZiAoaXMgIT0gbnVsbCkKLQkJCQkJCQkJCWlzLmNsb3NlKCk7Ci0JCQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX07Ci0JCQkJVGhyZWFkIHQgPSBuZXcgVGhyZWFkKGxvYWRlcik7Ci0JCQkJdC5zdGFydCgpOwotCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCQlXZWxjb21lUG9ydGFsLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVDdXN0b21Gb3JtKAotCQlDb21wb3NpdGUgcGFyZW50LAotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnLAotCQlGb3JtV2lkZ2V0RmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXRyeSB7Ci0JCQlPYmplY3Qgb2JqID0gY29uZmlnLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgSVBvcnRhbFNlY3Rpb25Gb3JtKSB7Ci0JCQkJSVBvcnRhbFNlY3Rpb25Gb3JtIHBzZWN0aW9uID0gKElQb3J0YWxTZWN0aW9uRm9ybSkgb2JqOwotCQkJCS8vcHNlY3Rpb24uaW5pdChmb3JtLmdldFBvcnRhbCgpKTsKLQkJCQlDb250cm9sIGNvbnRyb2wgPSBwc2VjdGlvbi5jcmVhdGVDb250cm9sKHBhcmVudCwgZmFjdG9yeSk7Ci0JCQkJVGFibGVEYXRhIHRkID0gbmV3IFRhYmxlRGF0YShUYWJsZURhdGEuRklMTCwgVGFibGVEYXRhLlRPUCk7Ci0JCQkJdGQuZ3JhYkhvcml6b250YWwgPSB0cnVlOwotCQkJCWNvbnRyb2wuc2V0TGF5b3V0RGF0YSh0ZCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJV2VsY29tZVBvcnRhbC5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBJRm9ybUNvbnRlbnRQcm92aWRlciBjcmVhdGVDb250ZW50UHJvdmlkZXIoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZykgewotCQl0cnkgewotCQkJT2JqZWN0IG9iaiA9IGNvbmZpZy5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJjbGFzcyIpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElGb3JtQ29udGVudFByb3ZpZGVyKSB7Ci0JCQkJcmV0dXJuIChJRm9ybUNvbnRlbnRQcm92aWRlcikgb2JqOwotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVdlbGNvbWVQb3J0YWwubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQlwcm90ZWN0ZWQgdm9pZCByZWZsb3coKSB7Ci0JCWZvcm1Db250YWluZXIubGF5b3V0KCk7Ci0JCXN1cGVyLnJlZmxvdygpOwotCQlmb3JtLnVwZGF0ZVNpemUoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcnVuRWNsaXBzZUFjdGlvbihmaW5hbCBTdHJpbmcgYXJnKSB7Ci0JCUJ1c3lJbmRpY2F0b3IKLQkJCS5zaG93V2hpbGUoZm9ybS5nZXRDb250cm9sKCkuZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJZmluYWwgSUFjdGlvbiBhY3Rpb24gPSBnZXRFY2xpcHNlQWN0aW9uKGFyZyk7Ci0JCQkJaWYgKGFjdGlvbiAhPSBudWxsKQotCQkJCQlhY3Rpb24ucnVuKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUFjdGlvbiBnZXRFY2xpcHNlQWN0aW9uKFN0cmluZyBhcmcpIHsKLQkJaWYgKGVjbGlwc2VBY3Rpb25zID09IG51bGwpIHsKLQkJCWVjbGlwc2VBY3Rpb25zID0gbmV3IEhhc2h0YWJsZSgpOwotCQl9Ci0JCUlBY3Rpb24gYWN0aW9uID0gKElBY3Rpb24pIGVjbGlwc2VBY3Rpb25zLmdldChhcmcpOwotCQlpZiAoYWN0aW9uICE9IG51bGwpCi0JCQlyZXR1cm4gYWN0aW9uOwotCQkvLyBsb2FkCi0JCWludCBjb2wgPSBhcmcuaW5kZXhPZignOicpOwotCQlTdHJpbmcgcGx1Z2luSWQgPSBhcmcuc3Vic3RyaW5nKDAsIGNvbCk7Ci0JCVN0cmluZyBjbGFzc05hbWUgPSBhcmcuc3Vic3RyaW5nKGNvbCArIDEpOwotCQlJUGx1Z2luRGVzY3JpcHRvciBkZXNjID0KLQkJCVBsYXRmb3JtLmdldFBsdWdpblJlZ2lzdHJ5KCkuZ2V0UGx1Z2luRGVzY3JpcHRvcihwbHVnaW5JZCk7Ci0JCWlmIChkZXNjID09IG51bGwpIHsKLQkJCWxvZ0FjdGlvbkxpbmtFcnJvcihwbHVnaW5JZCwgY2xhc3NOYW1lKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUNsYXNzIGFjdGlvbkNsYXNzOwotCQl0cnkgewotCQkJYWN0aW9uQ2xhc3MgPSBkZXNjLmdldFBsdWdpbkNsYXNzTG9hZGVyKCkubG9hZENsYXNzKGNsYXNzTmFtZSk7Ci0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJbG9nQWN0aW9uTGlua0Vycm9yKHBsdWdpbklkLCBjbGFzc05hbWUpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJdHJ5IHsKLQkJCU9iamVjdCBvYmogPSBhY3Rpb25DbGFzcy5uZXdJbnN0YW5jZSgpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElBY3Rpb24pCi0JCQkJYWN0aW9uID0gKElBY3Rpb24pIG9iajsKLQkJCWVsc2UKLQkJCQlhY3Rpb24gPSBuZXcgQWN0aW9uV3JhcHBlcihhcmcsIChJQWN0aW9uRGVsZWdhdGUpIG9iaik7Ci0JCX0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgewotCQkJbG9nQWN0aW9uTGlua0Vycm9yKHBsdWdpbklkLCBjbGFzc05hbWUpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotCQkJbG9nQWN0aW9uTGlua0Vycm9yKHBsdWdpbklkLCBjbGFzc05hbWUpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0JCQlsb2dBY3Rpb25MaW5rRXJyb3IocGx1Z2luSWQsIGNsYXNzTmFtZSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQllY2xpcHNlQWN0aW9ucy5wdXQoYXJnLCBhY3Rpb24pOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCXByaXZhdGUgdm9pZCBsb2dBY3Rpb25MaW5rRXJyb3IoU3RyaW5nIHBsdWdpbklkLCBTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCUlTdGF0dXMgc3RhdHVzID0KLQkJCW5ldyBTdGF0dXMoCi0JCQkJSVN0YXR1cy5FUlJPUiwKLQkJCQlXZWxjb21lUG9ydGFsLmdldFBsdWdpbklkKCksCi0JCQkJSVN0YXR1cy5PSywKLQkJCQkiVW5hYmxlIHRvIGxvYWQgY2xhc3MgIgotCQkJCQkrIGNsYXNzTmFtZQotCQkJCQkrICIgZnJvbSBwbHVnLWluICIKLQkJCQkJKyBwbHVnaW5JZAotCQkJCQkrICIuIiwKLQkJCQludWxsKTsKLQkJV2VsY29tZVBvcnRhbC5sb2coc3RhdHVzLCB0cnVlKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIG9wZW5FY2xpcHNlSGVscChTdHJpbmcgYXJnKSB7Ci0JCVdvcmtiZW5jaEhlbHAuZ2V0SGVscFN1cHBvcnQoKS5kaXNwbGF5SGVscFJlc291cmNlKGFyZyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvd2VsY29tZS9pbnRlcm5hbC9wb3J0YWwvU2VjdGlvbkRlc2NyaXB0b3IuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvc3JjL29yZy9lY2xpcHNlL3dlbGNvbWUvaW50ZXJuYWwvcG9ydGFsL1NlY3Rpb25EZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmNDk3YjAuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvd2VsY29tZS9pbnRlcm5hbC9wb3J0YWwvU2VjdGlvbkRlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIEp1biAxOSwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndlbGNvbWUuaW50ZXJuYWwucG9ydGFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLQotLyoqCi0gKiBAYXV0aG9yIGRlamFuCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFNlY3Rpb25EZXNjcmlwdG9yIHsKLQlwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWc7Ci0JCi0JcHVibGljIFNlY3Rpb25EZXNjcmlwdG9yKElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWcpIHsKLQkJdGhpcy5jb25maWcgPSBjb25maWc7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBjb25maWcuZ2V0QXR0cmlidXRlKCJpZCIpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBjb25maWcuZ2V0QXR0cmlidXRlKCJuYW1lIik7Ci0JfQotCXB1YmxpYyBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZ2V0Q29uZmlnKCkgewotCQlyZXR1cm4gY29uZmlnOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvc3JjL29yZy9lY2xpcHNlL3dlbGNvbWUvaW50ZXJuYWwvcG9ydGFsL1dlbGNvbWVQb3J0YWxFZGl0b3IuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvc3JjL29yZy9lY2xpcHNlL3dlbGNvbWUvaW50ZXJuYWwvcG9ydGFsL1dlbGNvbWVQb3J0YWxFZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM0MTJlNi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3NyYy9vcmcvZWNsaXBzZS93ZWxjb21lL2ludGVybmFsL3BvcnRhbC9XZWxjb21lUG9ydGFsRWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBKdW4gMTksIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53ZWxjb21lLmludGVybmFsLnBvcnRhbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5FZGl0b3JQYXJ0OwotCi0vKioKLSAqIEBhdXRob3IgZGVqYW4KLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgV2VsY29tZVBvcnRhbEVkaXRvciBleHRlbmRzIEVkaXRvclBhcnQgewotCXByaXZhdGUgV2VsY29tZVBvcnRhbFBhcnQgd2VsY29tZVBhcnQ7Ci0JCi0JcHVibGljIFdlbGNvbWVQb3J0YWxFZGl0b3IoKSB7Ci0JCXdlbGNvbWVQYXJ0ID0gbmV3IFdlbGNvbWVQb3J0YWxQYXJ0KHRoaXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmICh3ZWxjb21lUGFydCE9bnVsbCkKLQkJCXdlbGNvbWVQYXJ0LmRpc3Bvc2UoKTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVNhdmVhYmxlUGFydCNkb1NhdmUob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgZG9TYXZlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklTYXZlYWJsZVBhcnQjZG9TYXZlQXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRvU2F2ZUFzKCkgewotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0I2dvdG9NYXJrZXIob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBnb3RvTWFya2VyKElNYXJrZXIgbWFya2VyKSB7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KQotCQl0aHJvd3MgUGFydEluaXRFeGNlcHRpb24gewotCQlpZiAoIShpbnB1dCBpbnN0YW5jZW9mIFdlbGNvbWVQb3J0YWxFZGl0b3JJbnB1dCkpCi0JCQl0aHJvdyBuZXcgUGFydEluaXRFeGNlcHRpb24oIkludmFsaWQgSW5wdXQ6IE11c3QgYmUgV2VsY29tZVBvcnRhbEVkaXRvcklucHV0Iik7Ci0JCXNldFNpdGUoc2l0ZSk7Ci0JCXNldElucHV0KGlucHV0KTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JU2F2ZWFibGVQYXJ0I2lzRGlydHkoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGlydHkoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JU2F2ZWFibGVQYXJ0I2lzU2F2ZUFzQWxsb3dlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTYXZlQXNBbGxvd2VkKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQjY3JlYXRlUGFydENvbnRyb2wob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhcnRDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJd2VsY29tZVBhcnQuY3JlYXRlQ29udHJvbChwYXJlbnQpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0I3NldEZvY3VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3NyYy9vcmcvZWNsaXBzZS93ZWxjb21lL2ludGVybmFsL3BvcnRhbC9XZWxjb21lUG9ydGFsRWRpdG9ySW5wdXQuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvc3JjL29yZy9lY2xpcHNlL3dlbGNvbWUvaW50ZXJuYWwvcG9ydGFsL1dlbGNvbWVQb3J0YWxFZGl0b3JJbnB1dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2YxZjQyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvc3JjL29yZy9lY2xpcHNlL3dlbGNvbWUvaW50ZXJuYWwvcG9ydGFsL1dlbGNvbWVQb3J0YWxFZGl0b3JJbnB1dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53ZWxjb21lLmludGVybmFsLnBvcnRhbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS4qOwotLyoqCi0gKiBBIHNpbXBsZSBlZGl0b3IgaW5wdXQgZm9yIHRoZSB3ZWxjb21lIGVkaXRvcgotICovCi1wdWJsaWMgY2xhc3MgV2VsY29tZVBvcnRhbEVkaXRvcklucHV0IGltcGxlbWVudHMgSUVkaXRvcklucHV0IHsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgRkFDVE9SWV9JRCA9ICJvcmcuZWNsaXBzZS53ZWxjb21lLmludGVybmFsLnBvcnRhbC5XZWxjb21lUG9ydGFsRWRpdG9ySW5wdXRGYWN0b3J5IjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIFdlbGNvbWVFZGl0b3JJbnB1dCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBXZWxjb21lUG9ydGFsRWRpdG9ySW5wdXQoKSB7Ci0JfQotCXB1YmxpYyBib29sZWFuIGV4aXN0cygpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiAiV2VsY29tZSI7Ci0JfQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmo9PW51bGwpIHJldHVybiBmYWxzZTsKLQkJaWYgKG9iaiA9PSB0aGlzKSByZXR1cm4gdHJ1ZTsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFdlbGNvbWVQb3J0YWxFZGl0b3JJbnB1dCkgewotCQkJV2VsY29tZVBvcnRhbEVkaXRvcklucHV0IHdvYmogPSAoV2VsY29tZVBvcnRhbEVkaXRvcklucHV0KW9iajsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JcHVibGljIElQZXJzaXN0YWJsZUVsZW1lbnQgZ2V0UGVyc2lzdGFibGUoKSB7Ci0JCXJldHVybiBuZXcgSVBlcnNpc3RhYmxlRWxlbWVudCgpIHsKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0RmFjdG9yeUlkKCkgewotCQkJCXJldHVybiBGQUNUT1JZX0lEOwotCQkJfQotCQkJcHVibGljIHZvaWQgc2F2ZVN0YXRlKElNZW1lbnRvIG1lbWVudG8pIHsKLQkJCX0KLQkJfTsKLQl9Ci0JcHVibGljIFN0cmluZyBnZXRUb29sVGlwVGV4dCgpIHsKLQkJcmV0dXJuIGdldE5hbWUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3NyYy9vcmcvZWNsaXBzZS93ZWxjb21lL2ludGVybmFsL3BvcnRhbC9XZWxjb21lUG9ydGFsRWRpdG9ySW5wdXRGYWN0b3J5LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3NyYy9vcmcvZWNsaXBzZS93ZWxjb21lL2ludGVybmFsL3BvcnRhbC9XZWxjb21lUG9ydGFsRWRpdG9ySW5wdXRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwYzc2ZjMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvd2VsY29tZS9pbnRlcm5hbC9wb3J0YWwvV2VsY29tZVBvcnRhbEVkaXRvcklucHV0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53ZWxjb21lLmludGVybmFsLnBvcnRhbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVsZW1lbnRGYWN0b3J5OwotCi0vKioKLSAqLwotcHVibGljIGNsYXNzIFdlbGNvbWVQb3J0YWxFZGl0b3JJbnB1dEZhY3RvcnkgaW1wbGVtZW50cyBJRWxlbWVudEZhY3RvcnkgewotCS8qKgotCSAqLwotCXB1YmxpYyBXZWxjb21lUG9ydGFsRWRpdG9ySW5wdXRGYWN0b3J5KCkgewotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JRWxlbWVudEZhY3RvcnkjY3JlYXRlRWxlbWVudChvcmcuZWNsaXBzZS51aS5JTWVtZW50bykKLQkgKi8KLQlwdWJsaWMgSUFkYXB0YWJsZSBjcmVhdGVFbGVtZW50KElNZW1lbnRvIG1lbWVudG8pIHsKLQkJcmV0dXJuIG5ldyBXZWxjb21lUG9ydGFsRWRpdG9ySW5wdXQoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvc3JjL29yZy9lY2xpcHNlL3dlbGNvbWUvaW50ZXJuYWwvcG9ydGFsL1dlbGNvbWVQb3J0YWxGb3JtLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3NyYy9vcmcvZWNsaXBzZS93ZWxjb21lL2ludGVybmFsL3BvcnRhbC9XZWxjb21lUG9ydGFsRm9ybS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNGE0NGIwLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvc3JjL29yZy9lY2xpcHNlL3dlbGNvbWUvaW50ZXJuYWwvcG9ydGFsL1dlbGNvbWVQb3J0YWxGb3JtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBKdW4gMTksIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53ZWxjb21lLmludGVybmFsLnBvcnRhbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMuaW50ZXJuYWwuKjsKLQotLyoqCi0gKiBAYXV0aG9yIGRlamFuCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFdlbGNvbWVQb3J0YWxGb3JtIGV4dGVuZHMgV2ViRm9ybSB7Ci0JcHJpdmF0ZSBXZWxjb21lUG9ydGFsUGFydCBwb3J0YWw7Ci0JcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgcGFnZUNvbmZpZzsKLQotCXB1YmxpYyBXZWxjb21lUG9ydGFsRm9ybShXZWxjb21lUG9ydGFsUGFydCBwb3J0YWwsIElDb25maWd1cmF0aW9uRWxlbWVudCBwYWdlQ29uZmlnKSB7Ci0JCXRoaXMucG9ydGFsID0gcG9ydGFsOwotCQl0aGlzLnBhZ2VDb25maWcgPSBwYWdlQ29uZmlnOwotCQlzZXRIZWFkaW5nVmlzaWJsZShmYWxzZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoT2JqZWN0IG1vZGVsKSB7Ci0JCXVwZGF0ZSgpOwotCX0KLQkKLQlwdWJsaWMgV2VsY29tZVBvcnRhbFBhcnQgZ2V0UG9ydGFsKCkgewotCQlyZXR1cm4gcG9ydGFsOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUhUTUxUYWJsZUxheW91dCBsYXlvdXQgPSBuZXcgSFRNTFRhYmxlTGF5b3V0KCk7Ci0JCXBhcmVudC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSBnZXRJbnRlZ2VyKHBhZ2VDb25maWcsICJudW1Db2x1bW5zIiwgMSk7Ci0JCWxheW91dC50b3BNYXJnaW4gPSAwOwotCQlsYXlvdXQubGVmdE1hcmdpbiA9IGxheW91dC5yaWdodE1hcmdpbiA9IDEwOwotCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmc9MTU7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSA1OwotCQkvL3BhcmVudC5zZXRCYWNrZ3JvdW5kKHBhcmVudC5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0dSRUVOKSk7Ci0JCWxheW91dC5tYWtlQ29sdW1uc0VxdWFsV2lkdGg9dHJ1ZTsKLQkJU2VsZWN0YWJsZUZvcm1MYWJlbCBjdXN0b21pemUgPSBnZXRGYWN0b3J5KCkuY3JlYXRlU2VsZWN0YWJsZUxhYmVsKHBhcmVudCwgIkN1c3RvbWl6ZS4uLiIpOwotCQlnZXRGYWN0b3J5KCkudHVybkludG9IeXBlcmxpbmsoY3VzdG9taXplLCBuZXcgSHlwZXJsaW5rQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGxpbmtBY3RpdmF0ZWQoQ29udHJvbCBsaW5rKSB7Ci0JCQl9Ci0JCX0pOwotCQlUYWJsZURhdGEgdGQgPSBuZXcgVGFibGVEYXRhKCk7Ci0JCXRkLmFsaWduID0gVGFibGVEYXRhLkNFTlRFUjsKLQkJdGQuY29sc3BhbiA9IGxheW91dC5udW1Db2x1bW5zOwotCQljdXN0b21pemUuc2V0TGF5b3V0RGF0YSh0ZCk7Ci0JCQotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgW10gc2VjdGlvblJlZnMgPSBwYWdlQ29uZmlnLmdldENoaWxkcmVuKCJzZWN0aW9uIik7Ci0JCWZvciAoaW50IGk9MDsgaTxzZWN0aW9uUmVmcy5sZW5ndGg7IGkrKykgewotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IHNlY3Rpb25SZWYgPSBzZWN0aW9uUmVmc1tpXTsKLQkJCVN0cmluZyBpZCA9IHNlY3Rpb25SZWYuZ2V0QXR0cmlidXRlKCJpZCIpOwotCQkJU2VjdGlvbkRlc2NyaXB0b3IgZGVzYyA9IHBvcnRhbC5maW5kU2VjdGlvbihpZCk7Ci0JCQlpZiAoZGVzYz09bnVsbCkgY29udGludWU7Ci0JCQlQb3J0YWxTZWN0aW9uIHNlY3Rpb24gPSBuZXcgUG9ydGFsU2VjdGlvbihkZXNjLCB0aGlzKTsKLQkJCUNvbnRyb2wgY29udHJvbCA9IHNlY3Rpb24uY3JlYXRlQ29udHJvbChwYXJlbnQsIGdldEZhY3RvcnkoKSk7Ci0JCQlpbnQgc3BhbiA9IGdldEludGVnZXIoc2VjdGlvblJlZiwgInNwYW4iLCAxKTsKLQkJCXRkID0gbmV3IFRhYmxlRGF0YShUYWJsZURhdGEuRklMTCwgVGFibGVEYXRhLlRPUCk7Ci0JCQl0ZC5jb2xzcGFuID0gc3BhbjsKLQkJCXRkLmdyYWJIb3Jpem9udGFsID0gdHJ1ZTsKLQkJCWNvbnRyb2wuc2V0TGF5b3V0RGF0YSh0ZCk7Ci0JCQlyZWdpc3RlclNlY3Rpb24oc2VjdGlvbik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGludCBnZXRJbnRlZ2VyKElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWcsIFN0cmluZyBhdHROYW1lLCBpbnQgZGVmKSB7Ci0JCVN0cmluZyB2YWx1ZSA9IGNvbmZpZy5nZXRBdHRyaWJ1dGUoYXR0TmFtZSk7Ci0JCWlmICh2YWx1ZSE9bnVsbCkgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gSW50ZWdlci5wYXJzZUludCh2YWx1ZSk7Ci0JCQl9Ci0JCQljYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZGVmOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvc3JjL29yZy9lY2xpcHNlL3dlbGNvbWUvaW50ZXJuYWwvcG9ydGFsL1dlbGNvbWVQb3J0YWxQYWdlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3NyYy9vcmcvZWNsaXBzZS93ZWxjb21lL2ludGVybmFsL3BvcnRhbC9XZWxjb21lUG9ydGFsUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDMzNGQxLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvc3JjL29yZy9lY2xpcHNlL3dlbGNvbWUvaW50ZXJuYWwvcG9ydGFsL1dlbGNvbWVQb3J0YWxQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBKdW4gMTksIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53ZWxjb21lLmludGVybmFsLnBvcnRhbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMuaW50ZXJuYWwuKjsKLQotLyoqCi0gKiBAYXV0aG9yIGRlamFuCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFdlbGNvbWVQb3J0YWxQYWdlIGltcGxlbWVudHMgSUZvcm1QYWdlIHsKLQlwcml2YXRlIENvbnRyb2wgY29udHJvbDsKLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCXByaXZhdGUgV2VsY29tZVBvcnRhbFBhcnQgcG9ydGFsOwotCXByaXZhdGUgV2VsY29tZVBvcnRhbEZvcm0gZm9ybTsKLQlwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWc7Ci0JcHJpdmF0ZSBTZWxlY3RhYmxlRm9ybUxhYmVsIHRhYjsKLQkKLQlwdWJsaWMgV2VsY29tZVBvcnRhbFBhZ2UoV2VsY29tZVBvcnRhbFBhcnQgcG9ydGFsLCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnKSB7Ci0JCXRoaXMucG9ydGFsID0gcG9ydGFsOwotCQl0aGlzLmZvcm0gPSBuZXcgV2VsY29tZVBvcnRhbEZvcm0ocG9ydGFsLCBjb25maWcpOwotCQl0aGlzLm5hbWUgPSBjb25maWcuZ2V0QXR0cmlidXRlKCJuYW1lIik7Ci0JCXRoaXMuY29uZmlnID0gY29uZmlnOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRUYWIoU2VsZWN0YWJsZUZvcm1MYWJlbCB0YWIpIHsKLQkJdGhpcy50YWIgPSB0YWI7Ci0JfQotCQotCXB1YmxpYyBTZWxlY3RhYmxlRm9ybUxhYmVsIGdldFRhYigpIHsKLQkJcmV0dXJuIHRhYjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBiZWNvbWVzSW52aXNpYmxlKElGb3JtUGFnZSBuZXdQYWdlKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIGJlY29tZXNWaXNpYmxlKElGb3JtUGFnZSBwcmV2aW91c1BhZ2UpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcy5jb250cm9sID0gZm9ybS5jcmVhdGVDb250cm9sKHBhcmVudCk7Ci0JCWZvcm0uaW5pdGlhbGl6ZShudWxsKTsKLQl9Ci0KLQlwdWJsaWMgQ29udHJvbCBnZXRDb250cm9sKCkgewotCQlyZXR1cm4gY29udHJvbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRpdGxlKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1NvdXJjZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzVmlzaWJsZSgpIHsKLQkJcmV0dXJuIHBvcnRhbC5pc1Zpc2libGUodGhpcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvd2VsY29tZS9pbnRlcm5hbC9wb3J0YWwvV2VsY29tZVBvcnRhbFBhcnQuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvc3JjL29yZy9lY2xpcHNlL3dlbGNvbWUvaW50ZXJuYWwvcG9ydGFsL1dlbGNvbWVQb3J0YWxQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkMzY3MDEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvd2VsY29tZS9pbnRlcm5hbC9wb3J0YWwvV2VsY29tZVBvcnRhbFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MyArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBKdW4gMTksIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53ZWxjb21lLmludGVybmFsLnBvcnRhbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMuaW50ZXJuYWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53ZWxjb21lLmludGVybmFsLldlbGNvbWVQb3J0YWw7Ci0KLS8qKgotICogQGF1dGhvciBkZWphbgotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWxjb21lUG9ydGFsUGFydCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRBQl9QQURESU5HID0gNTsKLQlwcml2YXRlIEhhc2h0YWJsZSBzZWN0aW9uRGVzY3JpcHRvcnM7Ci0JY2xhc3MgVGFiTGlzdGVuZXIgaW1wbGVtZW50cyBJSHlwZXJsaW5rTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBsaW5rQWN0aXZhdGVkKENvbnRyb2wgbGlua0xhYmVsKSB7Ci0JCQlJRm9ybVBhZ2UgcGFnZSA9IChJRm9ybVBhZ2UpIGxpbmtMYWJlbC5nZXREYXRhKCk7Ci0JCQl3b3JrYm9vay5zZWxlY3RQYWdlKHBhZ2UsIGZhbHNlKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGxpbmtFbnRlcmVkKENvbnRyb2wgbGlua0xhYmVsKSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBsaW5rRXhpdGVkKENvbnRyb2wgbGlua0xhYmVsKSB7Ci0JCQlpZiAobGlua0xhYmVsPT1zZWxlY3RlZFRhYikKLQkJCQloaWdobGlnaHRUYWIoc2VsZWN0ZWRUYWIsIHRydWUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBUYWJMaXN0ZW5lciB0YWJMaXN0ZW5lciA9IG5ldyBUYWJMaXN0ZW5lcigpOwotCXByaXZhdGUgQ29tcG9zaXRlIHRhYkNvbnRhaW5lcjsKLQlwcml2YXRlIEZvcm1XaWRnZXRGYWN0b3J5IGZhY3Rvcnk7Ci0JcHJpdmF0ZSBIeXBlcmxpbmtIYW5kbGVyIGhoYW5kbGVyOwotCXByaXZhdGUgV2VsY29tZVBvcnRhbEVkaXRvciBlZGl0b3I7Ci0JcHJpdmF0ZSBDb2xvciB0YWJDb2xvcjsKLQlwcml2YXRlIE5vVGFic1dvcmtib29rIHdvcmtib29rOwotCXByaXZhdGUgU2VsZWN0YWJsZUZvcm1MYWJlbCBzZWxlY3RlZFRhYjsKLQotCXB1YmxpYyBXZWxjb21lUG9ydGFsUGFydChXZWxjb21lUG9ydGFsRWRpdG9yIGVkaXRvcikgewotCQlmYWN0b3J5ID0gbmV3IEZvcm1XaWRnZXRGYWN0b3J5KCk7Ci0JCWhoYW5kbGVyID0gbmV3IEh5cGVybGlua0hhbmRsZXIoKTsKLQkJd29ya2Jvb2sgPSBuZXcgTm9UYWJzV29ya2Jvb2soKTsKLQkJdGhpcy5lZGl0b3IgPSBlZGl0b3I7Ci0JfQotCQotCXB1YmxpYyBXZWxjb21lUG9ydGFsRWRpdG9yIGdldEVkaXRvcigpIHsKLQkJcmV0dXJuIGVkaXRvcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlmYWN0b3J5LmRpc3Bvc2UoKTsKLQkJaGhhbmRsZXIuZGlzcG9zZSgpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1Zpc2libGUoSUZvcm1QYWdlIHBhZ2UpIHsKLQkJcmV0dXJuIHdvcmtib29rLmdldEN1cnJlbnRQYWdlKCkuZXF1YWxzKHBhZ2UpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29udGFpbmVyID0gZmFjdG9yeS5jcmVhdGVDb21wb3NpdGUocGFyZW50KTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSBsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gMDsKLQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gMDsKLQkJY29udGFpbmVyLnNldExheW91dChsYXlvdXQpOwotCQljcmVhdGVUaXRsZShjb250YWluZXIpOwotCQljcmVhdGVUYWJzKGNvbnRhaW5lcik7Ci0JCXdvcmtib29rLmNyZWF0ZUNvbnRyb2woY29udGFpbmVyKTsKLQkJd29ya2Jvb2suZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQl3b3JrYm9vay5hZGRGb3JtU2VsZWN0aW9uTGlzdGVuZXIobmV3IElGb3JtU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBmb3JtU2VsZWN0ZWQoSUZvcm1QYWdlIHBhZ2UsIGJvb2xlYW4gc2V0Rm9jdXMpIHsKLQkJCQloaWdodGxpZ2h0VGFiKChXZWxjb21lUG9ydGFsUGFnZSkgcGFnZSk7Ci0JCQl9Ci0JCX0pOwotCQl3b3JrYm9vay5zZWxlY3RQYWdlKHdvcmtib29rLmdldFBhZ2VzKClbMF0sIHRydWUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUaXRsZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVdlbGNvbWVUaXRsZUFyZWEgdGl0bGUgPSBuZXcgV2VsY29tZVRpdGxlQXJlYShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQl0aXRsZS5zZXRMYXlvdXREYXRhKGdkKTsKLQkJdGl0bGUuc2V0VGV4dCgiV2VsY29tZSIpOwotCQl0aXRsZS5zZXRCYWNrZ3JvdW5kKGZhY3RvcnkuZ2V0QmFja2dyb3VuZENvbG9yKCkpOwotCQl0aXRsZS5zZXRGb3JlZ3JvdW5kKGZhY3RvcnkuZ2V0Rm9yZWdyb3VuZENvbG9yKCkpOwotCQl0aXRsZS5zZXRGb250KEpGYWNlUmVzb3VyY2VzLmdldEhlYWRlckZvbnQoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRhYnMoQ29tcG9zaXRlIHBhcmVudCkgewotCQl0YWJDb250YWluZXIgPSBmYWN0b3J5LmNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQpOwotCQl0YWJDb250YWluZXIuYWRkUGFpbnRMaXN0ZW5lcihuZXcgUGFpbnRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChQYWludEV2ZW50IGUpIHsKLQkJCQlQb2ludCBzaXplID0gdGFiQ29udGFpbmVyLmdldFNpemUoKTsKLQkJCQlSZWN0YW5nbGUgdGFiQm91bmRzID0gc2VsZWN0ZWRUYWIuZ2V0Qm91bmRzKCk7Ci0JCQkJR0MgZ2MgPSBlLmdjOwotCQkJCWdjLnNldEJhY2tncm91bmQoZmFjdG9yeS5nZXRCYWNrZ3JvdW5kQ29sb3IoKSk7Ci0JCQkJZ2MuZmlsbFJlY3RhbmdsZSgwLCB0YWJCb3VuZHMueS1UQUJfUEFERElORywgc2l6ZS54LCB0YWJCb3VuZHMuaGVpZ2h0K1RBQl9QQURESU5HK1RBQl9QQURESU5HKTsKLQkJCX0KLQkJfSk7Ci0JCXRhYkNvbG9yID0KLQkJCWZhY3RvcnkuZ2V0Q29sb3IoRm9ybVdpZGdldEZhY3RvcnkuQ09MT1JfQ09NUE9TSVRFX1NFUEFSQVRPUik7Ci0JCXRhYkNvbnRhaW5lci5zZXRCYWNrZ3JvdW5kKHRhYkNvbG9yKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAxMDsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IFRBQl9QQURESU5HOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gVEFCX1BBRERJTkcgKyBUQUJfUEFERElORzsKLQkJdGFiQ29udGFpbmVyLnNldExheW91dChsYXlvdXQpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX1ZFUlRJQ0FMKTsKLQkJdGFiQ29udGFpbmVyLnNldExheW91dERhdGEoZ2QpOwotCQloaGFuZGxlci5zZXRCYWNrZ3JvdW5kKHRhYkNvbG9yKTsKLQkJaGhhbmRsZXIuc2V0Rm9yZWdyb3VuZChmYWN0b3J5LmdldEJhY2tncm91bmRDb2xvcigpKTsKLQkJaGhhbmRsZXIuc2V0SHlwZXJsaW5rVW5kZXJsaW5lTW9kZSgKLQkJCUh5cGVybGlua1NldHRpbmdzLlVOREVSTElORV9ST0xMT1ZFUik7Ci0JCWxvYWRUYWJzKHRhYkNvbnRhaW5lcik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBsb2FkVGFicyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudCBbXSBwYWdlcyA9IFBsYXRmb3JtLmdldFBsdWdpblJlZ2lzdHJ5KCkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKFdlbGNvbWVQb3J0YWwuZ2V0UGx1Z2luSWQoKSwgIndlbGNvbWVQYWdlcyIpOwotCQlmb3IgKGludCBpPTA7IGk8cGFnZXMubGVuZ3RoOyBpKyspIHsKLQkJCWNyZWF0ZVRhYihwYXJlbnQsIHBhZ2VzW2ldKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUYWIoCi0JCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCUlDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWcpIHsKLQkJV2VsY29tZVBvcnRhbFBhZ2UgcGFnZSA9IG5ldyBXZWxjb21lUG9ydGFsUGFnZSh0aGlzLCBjb25maWcpOwotCQlTZWxlY3RhYmxlRm9ybUxhYmVsIHRhYiA9IGZhY3RvcnkuY3JlYXRlU2VsZWN0YWJsZUxhYmVsKHBhcmVudCwgcGFnZS5nZXRUaXRsZSgpKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKTsKLQkJdGFiLnNldEJhY2tncm91bmQodGFiQ29sb3IpOwotCQl0YWIuc2V0Rm9yZWdyb3VuZChmYWN0b3J5LmdldEJhY2tncm91bmRDb2xvcigpKTsKLQkJaGhhbmRsZXIucmVnaXN0ZXJIeXBlcmxpbmsodGFiLCB0YWJMaXN0ZW5lcik7Ci0JCXRhYi5zZXRGb250KEpGYWNlUmVzb3VyY2VzLmdldEJhbm5lckZvbnQoKSk7Ci0JCXRhYi5zZXRMYXlvdXREYXRhKGdkKTsKLQkJdGFiLnNldERhdGEocGFnZSk7Ci0JCXBhZ2Uuc2V0VGFiKHRhYik7Ci0JCXdvcmtib29rLmFkZFBhZ2UocGFnZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhpZ2h0bGlnaHRUYWIoV2VsY29tZVBvcnRhbFBhZ2UgcGFnZSkgewotCQlpZiAoc2VsZWN0ZWRUYWIgIT0gbnVsbCkKLQkJCWhpZ2hsaWdodFRhYihzZWxlY3RlZFRhYiwgZmFsc2UpOwotCQlTZWxlY3RhYmxlRm9ybUxhYmVsIHRhYiA9IHBhZ2UuZ2V0VGFiKCk7Ci0JCWhpZ2hsaWdodFRhYih0YWIsIHRydWUpOwotCQlzZWxlY3RlZFRhYiA9IHRhYjsKLQkJdGFiQ29udGFpbmVyLnJlZHJhdygpOwotCX0KLQotCXByaXZhdGUgdm9pZCBoaWdobGlnaHRUYWIoU2VsZWN0YWJsZUZvcm1MYWJlbCB0YWIsIGJvb2xlYW4gc2VsZWN0ZWQpIHsKLQkJQ29sb3IgYmcgPSB0YWJDb2xvcjsKLQkJQ29sb3IgZmcgPSBmYWN0b3J5LmdldEJhY2tncm91bmRDb2xvcigpOwotCQl0YWIuc2V0Rm9yZWdyb3VuZChzZWxlY3RlZCA/IGJnIDogZmcpOwotCQl0YWIuc2V0QmFja2dyb3VuZChzZWxlY3RlZCA/IGZnIDogYmcpOwotCX0KLQotCXB1YmxpYyBTZWN0aW9uRGVzY3JpcHRvciBmaW5kU2VjdGlvbihTdHJpbmcgaWQpIHsKLQkJaWYgKHNlY3Rpb25EZXNjcmlwdG9ycz09bnVsbCkgewotCQkJc2VjdGlvbkRlc2NyaXB0b3JzPW5ldyBIYXNodGFibGUoKTsKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBbXSBzZWN0aW9ucyA9IFBsYXRmb3JtLmdldFBsdWdpblJlZ2lzdHJ5KCkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKFdlbGNvbWVQb3J0YWwuZ2V0UGx1Z2luSWQoKSwgIndlbGNvbWVTZWN0aW9ucyIpOwotCQkJZm9yIChpbnQgaT0wOyBpPHNlY3Rpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJU2VjdGlvbkRlc2NyaXB0b3IgZGVzYyA9IG5ldyBTZWN0aW9uRGVzY3JpcHRvcihzZWN0aW9uc1tpXSk7Ci0JCQkJc2VjdGlvbkRlc2NyaXB0b3JzLnB1dChkZXNjLmdldElkKCksIGRlc2MpOwotCQkJfQotCQl9Ci0JCXJldHVybiAoU2VjdGlvbkRlc2NyaXB0b3Ipc2VjdGlvbkRlc2NyaXB0b3JzLmdldChpZCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvc3JjL29yZy9lY2xpcHNlL3dlbGNvbWUvaW50ZXJuYWwvcG9ydGFsL1dlbGNvbWVUaXRsZUFyZWEuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvc3JjL29yZy9lY2xpcHNlL3dlbGNvbWUvaW50ZXJuYWwvcG9ydGFsL1dlbGNvbWVUaXRsZUFyZWEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM2MDAwMy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3NyYy9vcmcvZWNsaXBzZS93ZWxjb21lL2ludGVybmFsL3BvcnRhbC9XZWxjb21lVGl0bGVBcmVhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBKdW4gMTksIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53ZWxjb21lLmludGVybmFsLnBvcnRhbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuUGFpbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zLmludGVybmFsLkZvcm1MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53ZWxjb21lLmludGVybmFsLldlbGNvbWVQb3J0YWxJbWFnZXM7Ci0KLS8qKgotICogQGF1dGhvciBkZWphbgotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWxjb21lVGl0bGVBcmVhIGV4dGVuZHMgRm9ybUxhYmVsIHsKLQlwcml2YXRlIEltYWdlIHRvcEltYWdlOwotCXByaXZhdGUgSW1hZ2UgYm90dG9tSW1hZ2U7Ci0KLQlwdWJsaWMgV2VsY29tZVRpdGxlQXJlYShDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLQkJc3VwZXIocGFyZW50LCBzdHlsZSk7Ci0JCXRvcEltYWdlID0gV2VsY29tZVBvcnRhbEltYWdlcy5nZXQoV2VsY29tZVBvcnRhbEltYWdlcy5JTUdfRk9STV9CQU5ORVIpOwotCQlib3R0b21JbWFnZSA9IFdlbGNvbWVQb3J0YWxJbWFnZXMuZ2V0KFdlbGNvbWVQb3J0YWxJbWFnZXMuSU1HX0ZPUk1fVU5ERVJMSU5FKTsKLQl9Ci0JcHVibGljIFBvaW50IGNvbXB1dGVTaXplKGludCB3SGludCwgaW50IGhIaW50LCBib29sZWFuIGNoYW5nZWQpIHsKLQkJUG9pbnQgdGV4dFNpemUgPSBzdXBlci5jb21wdXRlU2l6ZSh3SGludCwgaEhpbnQsIGNoYW5nZWQpOwotCQlpbnQgd2lkdGggPSB0ZXh0U2l6ZS54OwotCQlpbnQgaGVpZ2h0ID0gTWF0aC5tYXgodGV4dFNpemUueSwgdG9wSW1hZ2UuZ2V0Qm91bmRzKCkuaGVpZ2h0KTsKLQkJaGVpZ2h0ICs9IGJvdHRvbUltYWdlLmdldEJvdW5kcygpLmhlaWdodDsKLQkJcmV0dXJuIG5ldyBQb2ludCh3aWR0aCwgaGVpZ2h0KTsKLQl9Ci0JcHJvdGVjdGVkIHZvaWQgcGFpbnQoUGFpbnRFdmVudCBlKSB7Ci0JCUdDIGdjID0gZS5nYzsKLQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGdldEJvdW5kcygpOwotCQlnYy5kcmF3SW1hZ2UodG9wSW1hZ2UsIGJvdW5kcy54LCBib3VuZHMueSk7Ci0JCWludCB5ID0JYm91bmRzLnkgKyBib3VuZHMuaGVpZ2h0IC0gYm90dG9tSW1hZ2UuZ2V0Qm91bmRzKCkuaGVpZ2h0OwotCQlnYy5kcmF3SW1hZ2UoYm90dG9tSW1hZ2UsIDAsIHkpOwotCQlzdXBlci5wYWludChlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3NyYy9vcmcvZWNsaXBzZS93ZWxjb21lL2ludGVybmFsL3dlYmJyb3dzZXIvQnJvd3NlckNvbnRyb2xTaXRlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3NyYy9vcmcvZWNsaXBzZS93ZWxjb21lL2ludGVybmFsL3dlYmJyb3dzZXIvQnJvd3NlckNvbnRyb2xTaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2YjcwMjQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvd2VsY29tZS9pbnRlcm5hbC93ZWJicm93c2VyL0Jyb3dzZXJDb250cm9sU2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud2VsY29tZS5pbnRlcm5hbC53ZWJicm93c2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklTdGF0dXNMaW5lTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIE5lZWRlZCBmb3IgdGhlIE9MRSBpbXBsZW1lbnRhdGlvbgotICovCi1wdWJsaWMgY2xhc3MgQnJvd3NlckNvbnRyb2xTaXRlIGV4dGVuZHMgT2xlQ29udHJvbFNpdGUgewotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYmVlbkJ1aWx0ID0gZmFsc2U7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gc3RhcnRlZERvd25sb2FkID0gZmFsc2U7Ci0JLy8gV2ViIEJyb3dzZXIKLQlwcml2YXRlIFdlYkJyb3dzZXIgYnJvd3NlcjsKLQlwcml2YXRlIFN0cmluZyBwcmVzZW50YXRpb25VUkw7Ci0JcHJpdmF0ZSBJU3RhdHVzTGluZU1hbmFnZXIgc3RhdHVzTGluZU1hbmFnZXI7Ci0JcHJpdmF0ZSBpbnQgd29ya1NvRmFyID0gMDsKLQlwcml2YXRlIGludCBwcmV2TWF4ID0gMDsKLQotCXB1YmxpYyB2b2lkIHNldFN0YXR1c0xpbmVNYW5hZ2VyKElTdGF0dXNMaW5lTWFuYWdlciBtYW5hZ2VyKSB7Ci0JCXRoaXMuc3RhdHVzTGluZU1hbmFnZXIgPSBtYW5hZ2VyOwotCX0KLQotCXZvaWQgc2V0QnJvd3NlcihXZWJCcm93c2VyIGJyb3dzZXIpIHsKLQkJdGhpcy5icm93c2VyID0gYnJvd3NlcjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFByZXNlbnRhdGlvblVSTCgpIHsKLQkJcmV0dXJuIHByZXNlbnRhdGlvblVSTDsKLQl9Ci0KLQkvKioKLQkgKiBCcm93c2VyQ29udHJvbFNpdGUgY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgQnJvd3NlckNvbnRyb2xTaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSwgU3RyaW5nIHByb2dJZCkgewotCQlzdXBlcihwYXJlbnQsIHN0eWxlLCBwcm9nSWQpOwotCi0JCWFkZEV2ZW50TGlzdGVuZXIoV2ViQnJvd3Nlci5Eb3dubG9hZEJlZ2luLCBuZXcgT2xlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChPbGVFdmVudCBldmVudCkgewotCQkJCXN0YXJ0ZWREb3dubG9hZCA9IHRydWU7Ci0JCQkJLy93ZWJQcm9ncmVzcy5zZXRTZWxlY3Rpb24oMCk7Ci0JCQkJcHJldk1heCA9IC0xOwotCQkJfQotCQl9KTsKLQotCQlhZGRFdmVudExpc3RlbmVyKFdlYkJyb3dzZXIuRG93bmxvYWRDb21wbGV0ZSwgbmV3IE9sZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoT2xlRXZlbnQgZXZlbnQpIHsKLQkJCQlzdGFydGVkRG93bmxvYWQgPSBmYWxzZTsKLQkJCQkvL3dlYlByb2dyZXNzLnNldFNlbGVjdGlvbigwKTsKLQkJCQlpZiAoc3RhdHVzTGluZU1hbmFnZXIgIT0gbnVsbCkKLQkJCQkJc3RhdHVzTGluZU1hbmFnZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkuZG9uZSgpOwotCQkJCXByZXNlbnRhdGlvblVSTCA9IGJyb3dzZXIuZ2V0TG9jYXRpb25VUkwoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJYWRkRXZlbnRMaXN0ZW5lcihXZWJCcm93c2VyLkJlZm9yZU5hdmlnYXRlMiwgbmV3IE9sZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoT2xlRXZlbnQgZXZlbnQpIHsKLQkJCQkvL1ZhcmlhbnQgdXJsVmFyID0gZXZlbnQuYXJndW1lbnRzWzFdOwotCQkJCS8vU3RyaW5nIHN0clVybCA9IHVybFZhci5nZXRTdHJpbmcoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJLy8gUmVzcG9uZCB0byBQcm9ncmVzc0NoYW5nZSBldmVudHMgYnkgdXBkYXRpbmcgdGhlIFByb2dyZXNzIGJhcgotCQlhZGRFdmVudExpc3RlbmVyKFdlYkJyb3dzZXIuUHJvZ3Jlc3NDaGFuZ2UsIG5ldyBPbGVMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KE9sZUV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKCFzdGFydGVkRG93bmxvYWQpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCVZhcmlhbnQgcHJvZ3Jlc3MgPSBldmVudC5hcmd1bWVudHNbMF07Ci0JCQkJVmFyaWFudCBtYXhQcm9ncmVzcyA9IGV2ZW50LmFyZ3VtZW50c1sxXTsKLQotCQkJCWlmIChwcm9ncmVzcyA9PSBudWxsIHx8IG1heFByb2dyZXNzID09IG51bGwgfHwgcHJvZ3Jlc3MuZ2V0SW50KCkgPT0gLTEpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQkvKgotCQkJCWlmIChtYXhQcm9ncmVzcy5nZXRJbnQoKSE9MTAwKQotCQkJCSAgIHdlYlByb2dyZXNzLnNldE1heGltdW0obWF4UHJvZ3Jlc3MuZ2V0SW50KCkpOwotCQkJCSovCi0JCQkJaWYgKHByZXZNYXggIT0gbWF4UHJvZ3Jlc3MuZ2V0SW50KCkpIHsKLQkJCQkJc3RhdHVzTGluZU1hbmFnZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkuYmVnaW5UYXNrKCIiLCBtYXhQcm9ncmVzcy5nZXRJbnQoKSk7Ci0JCQkJCXByZXZNYXggPSBtYXhQcm9ncmVzcy5nZXRJbnQoKTsKLQkJCQl9Ci0JCQkJLy93ZWJQcm9ncmVzcy5zZXRTZWxlY3Rpb24ocHJvZ3Jlc3MuZ2V0SW50KCkpOwotCQkJCWludCBuZXdWYWx1ZSA9IHByb2dyZXNzLmdldEludCgpOwotCQkJCWludCB3b3JrZWQgPSBuZXdWYWx1ZSAtIHdvcmtTb0ZhcjsKLQkJCQl3b3JrU29GYXIgPSBuZXdWYWx1ZTsKLQkJCQlpZiAoc3RhdHVzTGluZU1hbmFnZXIgIT0gbnVsbCkKLQkJCQkJc3RhdHVzTGluZU1hbmFnZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkud29ya2VkKHdvcmtlZCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWFkZEV2ZW50TGlzdGVuZXIoV2ViQnJvd3Nlci5TdGF0dXNUZXh0Q2hhbmdlLCBuZXcgT2xlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChPbGVFdmVudCBldmVudCkgewotCQkJCVZhcmlhbnQgbmV3VGV4dCA9IGV2ZW50LmFyZ3VtZW50c1swXTsKLQkJCQlTdHJpbmcgbXNnID0gbmV3VGV4dC5nZXRTdHJpbmcoKTsKLQotCQkJCWlmIChtc2cgIT0gbnVsbCkgewotCQkJCQlpZiAoc3RhdHVzTGluZU1hbmFnZXIgIT0gbnVsbCkKLQkJCQkJCXN0YXR1c0xpbmVNYW5hZ2VyLnNldE1lc3NhZ2UobXNnKTsKLQkJCQl9IGVsc2UgewotCQkJCQlpZiAoc3RhdHVzTGluZU1hbmFnZXIgIT0gbnVsbCkKLQkJCQkJCXN0YXR1c0xpbmVNYW5hZ2VyLnNldE1lc3NhZ2UoIiIpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvd2VsY29tZS9pbnRlcm5hbC93ZWJicm93c2VyL0dsb2JhbEFjdGlvbkhhbmRsZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvc3JjL29yZy9lY2xpcHNlL3dlbGNvbWUvaW50ZXJuYWwvd2ViYnJvd3Nlci9HbG9iYWxBY3Rpb25IYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmYjNjMjMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvd2VsY29tZS9pbnRlcm5hbC93ZWJicm93c2VyL0dsb2JhbEFjdGlvbkhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndlbGNvbWUuaW50ZXJuYWwud2ViYnJvd3NlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hBY3Rpb25Db25zdGFudHM7Ci0KLS8qKgotICoKLSAqLwotcHVibGljIGNsYXNzIEdsb2JhbEFjdGlvbkhhbmRsZXIgewotCXByaXZhdGUgYm9vbGVhbiBhY3RpdmUgPSBmYWxzZTsKLQlwcml2YXRlIENvbWJvIGNvbWJvOwotCXByaXZhdGUgQ29udHJvbExpc3RlbmVyIGNvbnRyb2xMaXN0ZW5lcjsKLQotCXByaXZhdGUgY2xhc3MgQ29udHJvbExpc3RlbmVyIGltcGxlbWVudHMgTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJc3dpdGNoIChldmVudC50eXBlKSB7Ci0JCQkJY2FzZSBTV1QuQWN0aXZhdGUgOgotCQkJCQlhY3RpdmUgPSB0cnVlOwotCQkJCQl1cGRhdGVBY3Rpb25zRW5hYmxlU3RhdGUoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBTV1QuRGVhY3RpdmF0ZSA6Ci0JCQkJCWFjdGl2ZSA9IGZhbHNlOwotCQkJCQl1cGRhdGVBY3Rpb25zRW5hYmxlU3RhdGUoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBHbG9iYWxBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotCQlwcml2YXRlIFN0cmluZyBpZDsKLQotCQlwdWJsaWMgR2xvYmFsQWN0aW9uKFN0cmluZyBpZCkgewotCQkJdGhpcy5pZCA9IGlkOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJZG9HbG9iYWxBY3Rpb24oaWQpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBHbG9iYWxBY3Rpb24gY3V0QWN0aW9uOwotCXByaXZhdGUgR2xvYmFsQWN0aW9uIGNvcHlBY3Rpb247Ci0JcHJpdmF0ZSBHbG9iYWxBY3Rpb24gcGFzdGVBY3Rpb247Ci0JcHJpdmF0ZSBHbG9iYWxBY3Rpb24gZGVsZXRlQWN0aW9uOwotCXByaXZhdGUgR2xvYmFsQWN0aW9uIHNlbGVjdEFsbEFjdGlvbjsKLQlwcml2YXRlIEdsb2JhbEFjdGlvbiB1bmRvQWN0aW9uOwotCi0JcHVibGljIEdsb2JhbEFjdGlvbkhhbmRsZXIoSUFjdGlvbkJhcnMgYWN0aW9uQmFyLCBDb21ibyBjb21ibykgewotCQl0aGlzLmNvbWJvID0gY29tYm87Ci0JCW1ha2VBY3Rpb25zKCk7Ci0JCWFjdGlvbkJhci5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKAotCQkJSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5DVVQsCi0JCQljdXRBY3Rpb24pOwotCQlhY3Rpb25CYXIuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcigKLQkJCUlXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuQ09QWSwKLQkJCWNvcHlBY3Rpb24pOwotCQlhY3Rpb25CYXIuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcigKLQkJCUlXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuUEFTVEUsCi0JCQlwYXN0ZUFjdGlvbik7Ci0JCWFjdGlvbkJhci5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKAotCQkJSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5ERUxFVEUsCi0JCQlkZWxldGVBY3Rpb24pOwotCQlhY3Rpb25CYXIuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcigKLQkJCUlXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuU0VMRUNUX0FMTCwKLQkJCXNlbGVjdEFsbEFjdGlvbik7Ci0JCWFjdGlvbkJhci5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKAotCQkJSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5VTkRPLAotCQkJdW5kb0FjdGlvbik7Ci0JCWNvbnRyb2xMaXN0ZW5lciA9IG5ldyBDb250cm9sTGlzdGVuZXIoKTsKLQkJY29tYm8uYWRkTGlzdGVuZXIoU1dULkFjdGl2YXRlLCBjb250cm9sTGlzdGVuZXIpOwotCQljb21iby5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgY29udHJvbExpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoIWNvbWJvLmlzRGlzcG9zZWQoKSkgewotCQkJY29tYm8ucmVtb3ZlTGlzdGVuZXIoU1dULkFjdGl2YXRlLCBjb250cm9sTGlzdGVuZXIpOwotCQkJY29tYm8ucmVtb3ZlTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIGNvbnRyb2xMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgbWFrZUFjdGlvbnMoKSB7Ci0JCWN1dEFjdGlvbiA9IG5ldyBHbG9iYWxBY3Rpb24oSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5DVVQpOwotCQljb3B5QWN0aW9uID0gbmV3IEdsb2JhbEFjdGlvbihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLkNPUFkpOwotCQlwYXN0ZUFjdGlvbiA9IG5ldyBHbG9iYWxBY3Rpb24oSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5QQVNURSk7Ci0JCWRlbGV0ZUFjdGlvbiA9IG5ldyBHbG9iYWxBY3Rpb24oSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5ERUxFVEUpOwotCQlzZWxlY3RBbGxBY3Rpb24gPQotCQkJbmV3IEdsb2JhbEFjdGlvbihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLlNFTEVDVF9BTEwpOwotCQl1bmRvQWN0aW9uID0gbmV3IEdsb2JhbEFjdGlvbihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLlVORE8pOwotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVBY3Rpb25zRW5hYmxlU3RhdGUoKSB7Ci0JCWlmICghYWN0aXZlKSB7Ci0JCQljdXRBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQljb3B5QWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJcGFzdGVBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlkZWxldGVBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlzZWxlY3RBbGxBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl1bmRvQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQl9IGVsc2UgewotCQkJY3V0QWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQljb3B5QWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlwYXN0ZUFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQkJZGVsZXRlQWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlzZWxlY3RBbGxBY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCXVuZG9BY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBkb0dsb2JhbEFjdGlvbihTdHJpbmcgaWQpIHsKLQkJaWYgKGlkLmVxdWFscyhJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLkNVVCkpCi0JCQljb21iby5jdXQoKTsKLQkJZWxzZSBpZiAoaWQuZXF1YWxzKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuQ09QWSkpCi0JCQljb21iby5jb3B5KCk7Ci0JCWVsc2UgaWYgKGlkLmVxdWFscyhJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLlBBU1RFKSkKLQkJCWNvbWJvLnBhc3RlKCk7Ci0JCWVsc2UgaWYgKGlkLmVxdWFscyhJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLkRFTEVURSkpCi0JCQlkb0RlbGV0ZSgpOwotCQllbHNlIGlmIChpZC5lcXVhbHMoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5TRUxFQ1RfQUxMKSkKLQkJCWRvU2VsZWN0QWxsKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRvRGVsZXRlKCkgewotCQlTdHJpbmcgdGV4dCA9IGNvbWJvLmdldFRleHQoKTsKLQkJUG9pbnQgc2VsZWN0aW9uID0gY29tYm8uZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24ueCA9PSBzZWxlY3Rpb24ueSkKLQkJCXJldHVybjsKLQkJU3RyaW5nIGxlZnQgPSB0ZXh0LnN1YnN0cmluZygwLCBzZWxlY3Rpb24ueCk7Ci0JCVN0cmluZyByaWdodCA9IHRleHQuc3Vic3RyaW5nKHNlbGVjdGlvbi55ICsgMSk7Ci0JCWNvbWJvLnNldFRleHQobGVmdCArIHJpZ2h0KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZG9TZWxlY3RBbGwoKSB7Ci0JCVN0cmluZyB0ZXh0ID0gY29tYm8uZ2V0VGV4dCgpOwotCQlQb2ludCBuZXdTZWxlY3Rpb24gPSBuZXcgUG9pbnQoMCwgdGV4dC5sZW5ndGgoKSk7Ci0JCWNvbWJvLnNldFNlbGVjdGlvbihuZXdTZWxlY3Rpb24pOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3NyYy9vcmcvZWNsaXBzZS93ZWxjb21lL2ludGVybmFsL3dlYmJyb3dzZXIvSUVtYmVkZGVkV2ViQnJvd3Nlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvd2VsY29tZS9pbnRlcm5hbC93ZWJicm93c2VyL0lFbWJlZGRlZFdlYkJyb3dzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E5MTRiNC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3NyYy9vcmcvZWNsaXBzZS93ZWxjb21lL2ludGVybmFsL3dlYmJyb3dzZXIvSUVtYmVkZGVkV2ViQnJvd3Nlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53ZWxjb21lLmludGVybmFsLndlYmJyb3dzZXI7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUVtYmVkZGVkV2ViQnJvd3NlciB7Ci0JcHVibGljIHZvaWQgb3BlblRvKFN0cmluZyB1cmwpOwotCXB1YmxpYyB2b2lkIHNldExpc3RlbmVyKElXZWJCcm93c2VyTGlzdGVuZXIgbGlzdGVuZXIpOwotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvd2VsY29tZS9pbnRlcm5hbC93ZWJicm93c2VyL0lXZWJCcm93c2VyTGlzdGVuZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvc3JjL29yZy9lY2xpcHNlL3dlbGNvbWUvaW50ZXJuYWwvd2ViYnJvd3Nlci9JV2ViQnJvd3Nlckxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkMzQyNDMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvd2VsY29tZS9pbnRlcm5hbC93ZWJicm93c2VyL0lXZWJCcm93c2VyTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIEp1biAxOCwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndlbGNvbWUuaW50ZXJuYWwud2ViYnJvd3NlcjsKLQotLyoqCi0gKiBAYXV0aG9yIGRlamFuCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGludGVyZmFjZSBJV2ViQnJvd3Nlckxpc3RlbmVyIHsKLQl2b2lkIHN0YXRlQ2hhbmdlZCgpOwotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3NyYy9vcmcvZWNsaXBzZS93ZWxjb21lL2ludGVybmFsL3dlYmJyb3dzZXIvV2ViQnJvd3Nlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvd2VsY29tZS9pbnRlcm5hbC93ZWJicm93c2VyL1dlYkJyb3dzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMThlYzhjZi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3NyYy9vcmcvZWNsaXBzZS93ZWxjb21lL2ludGVybmFsL3dlYmJyb3dzZXIvV2ViQnJvd3Nlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud2VsY29tZS5pbnRlcm5hbC53ZWJicm93c2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBY3RpdmVYIGJhc2VkIHdlYiBicm93c2VyIGNvbnRyb2wuCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJCcm93c2VyIGltcGxlbWVudHMgT2xlTGlzdGVuZXIgewotCS8vIEdlbmVyYXRlZCBmcm9tIHR5cGVsaWIgZmlsZW5hbWU6IHNoZG9jdncuZGxsCi0KLQkvLyBDb25zdGFudHMgZm9yIFdlYkJyb3dzZXIgQ29tbWFuZFN0YXRlQ2hhbmdlCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIHNob3J0IENTQ19VUERBVEVDT01NQU5EUyA9IC0xOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgc2hvcnQgQ1NDX05BVklHQVRFRk9SV0FSRCA9IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBDU0NfTkFWSUdBVEVCQUNLID0gMjsKLQotCS8vIFdlYiBCcm93c2VyIENvbnRyb2wgRXZlbnRzIAotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJlZm9yZU5hdmlnYXRlID0gMTAwOwotCS8vIEZpcmVkIHdoZW4gYSBuZXcgaHlwZXJsaW5rIGlzIGJlaW5nIG5hdmlnYXRlZCB0by4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOYXZpZ2F0ZUNvbXBsZXRlID0gMTAxOwotCS8vIEZpcmVkIHdoZW4gdGhlIGRvY3VtZW50IGJlaW5nIG5hdmlnYXRlZCB0byBiZWNvbWVzIHZpc2libGUgYW5kIGVudGVycyB0aGUgbmF2aWdhdGlvbiBzdGFjay4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTdGF0dXNUZXh0Q2hhbmdlID0gMTAyOwotCS8vIFN0YXR1c2JhciB0ZXh0IGNoYW5nZWQuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUHJvZ3Jlc3NDaGFuZ2UgPSAxMDg7Ci0JLy8gRmlyZWQgd2hlbiBkb3dubG9hZCBwcm9ncmVzcyBpcyB1cGRhdGVkLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERvd25sb2FkQ29tcGxldGUgPSAxMDQ7Ci0JLy8gRG93bmxvYWQgb2YgcGFnZSBjb21wbGV0ZS4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDb21tYW5kU3RhdGVDaGFuZ2UgPSAxMDU7Ci0JLy8gVGhlIGVuYWJsZWQgc3RhdGUgb2YgYSBjb21tYW5kIGNoYW5nZWQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBEb3dubG9hZEJlZ2luID0gMTA2OwotCS8vIERvd25sb2FkIG9mIGEgcGFnZSBzdGFydGVkLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5ld1dpbmRvdyA9IDEwNzsKLQkvLyBGaXJlZCB3aGVuIGEgbmV3IHdpbmRvdyBzaG91bGQgYmUgY3JlYXRlZC4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUaXRsZUNoYW5nZSA9IDExMzsKLQkvLyBEb2N1bWVudCB0aXRsZSBjaGFuZ2VkLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZyYW1lQmVmb3JlTmF2aWdhdGUgPSAyMDA7Ci0JLy8gRmlyZWQgd2hlbiBhIG5ldyBoeXBlcmxpbmsgaXMgYmVpbmcgbmF2aWdhdGVkIHRvIGluIGEgZnJhbWUuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRnJhbWVOYXZpZ2F0ZUNvbXBsZXRlID0gMjAxOwotCS8vIEZpcmVkIHdoZW4gYSBuZXcgaHlwZXJsaW5rIGlzIGJlaW5nIG5hdmlnYXRlZCB0byBpbiBhIGZyYW1lLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZyYW1lTmV3V2luZG93ID0gMjA0OwotCS8vIEZpcmVkIHdoZW4gYSBuZXcgd2luZG93IHNob3VsZCBiZSBjcmVhdGVkLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFF1aXQgPSAxMDM7Ci0JLy8gRmlyZWQgd2hlbiBhcHBsaWNhdGlvbiBpcyBxdWl0aW5nLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdpbmRvd01vdmUgPSAxMDk7Ci0JLy8gRmlyZWQgd2hlbiB3aW5kb3cgaGFzIGJlZW4gbW92ZWQuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV2luZG93UmVzaXplID0gMTEwOwotCS8vIEZpcmVkIHdoZW4gd2luZG93IGhhcyBiZWVuIHNpemVkLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdpbmRvd0FjdGl2YXRlID0gMTExOwotCS8vIEZpcmVkIHdoZW4gd2luZG93IGhhcyBiZWVuIGFjdGl2YXRlZC4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQcm9wZXJ0eUNoYW5nZSA9IDExMjsKLQkvLyBGaXJlZCB3aGVuIHRoZSBQdXRQcm9wZXJ0eSBtZXRob2QgaGFzIGJlZW4gY2FsbGVkLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJlZm9yZU5hdmlnYXRlMiA9IDI1MDsKLQkvLyBGaXJlZCB3aGVuIGEgbmV3IGh5cGVybGluayBpcyBiZWluZyBuYXZpZ2F0ZWQgdG8uCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTmV3V2luZG93MiA9IDI1MTsKLQkvLyBGaXJlZCB3aGVuIGEgbmV3IHdpbmRvdyBzaG91bGQgYmUgY3JlYXRlZC4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBEb2N1bWVudENvbXBsZXRlID0gMjU5OwotCS8vIEZpcmVkIHdoZW4gdGhlIGRvY3VtZW50IGJlaW5nIG5hdmlnYXRlZCB0byByZWFjaGVzIFJlYWR5U3RhdGVfQ29tcGxldGUuCi0KLQkvLyBXZWIgQnJvd3NlciBwcm9wZXJ0aWVzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElTUElEX1JFQURZU1RBVEUgPSAtNTI1OwotCi0JLy8gV2ViIEJyb3dzZXIgc3RhdGUKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRUFEWVNUQVRFX1VOSU5JVElBTElaRUQgPSAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFQURZU1RBVEVfTE9BRElORyA9IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVBRFlTVEFURV9MT0FERUQgPSAyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFQURZU1RBVEVfSU5URVJBQ1RJVkUgPSAzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFQURZU1RBVEVfQ09NUExFVEUgPSA0OwotCi0JLy8gS2VlcCB0cmFjayBvZiB0aGUgd2hldGhlciBpdCBpcyBwb3NzaWJsZSB0byBuYXZpZ2F0ZSBpbiB0aGUgZm9yd2FyZCBhbmQgYmFja3dhcmQgZGlyZWN0aW9ucwotCXByaXZhdGUgYm9vbGVhbiBiYWNrd2FyZEVuYWJsZWQ7Ci0JcHJpdmF0ZSBib29sZWFuIGZvcndhcmRFbmFibGVkOwotCi0JLy8gVGhlIGF1dG9tYXRpb24gb2JqZWN0IGFuZCBDb250cm9sIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWFpbiBPTEUgY29udHJvbAotCXByaXZhdGUgT2xlQXV0b21hdGlvbiBvbGVPYmplY3Q7Ci0JcHJpdmF0ZSBCcm93c2VyQ29udHJvbFNpdGUgY29udHJvbFNpdGU7Ci0KLQkvLyBUaGUgT0xFIGZyYW1lICh0aGVyZSBzaG91bGQgb25seSBiZSBvbmUpCi0JcHJpdmF0ZSBPbGVGcmFtZSBjb250cm9sRnJhbWU7Ci0KLQkvL3ByaXZhdGUgTmVzdGVkUHJpbnREZWxlZ2F0ZSBhUHJpbnREZWxlZ2F0ZSA9IG51bGw7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgV2ViQnJvd3NlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJLy8gQ3JlYXRlIHRoZSBPTEUgZnJhbWUuIAotCQljb250cm9sRnJhbWUgPSBjcmVhdGVPbGVGcmFtZShwYXJlbnQpOwotCi0JCS8vIENyZWF0ZXMgdGhlIElFNSBPTEUgQ29udHJvbAotCQkvLyBUaGUgY29uc3RydWN0b3IgYWxzbyByZWdpc3RlcnMgYWxsIHRoZSBuZWNlc3NhcnkgT0xFIGxpc3RlbmVycy4KLQkJLy8gZm9yIG5vdywgb25seSBjYXRjaCB0aGUgZXhlY3B0aW9uIGlmIGNyZWF0aW5nIGFuZCBhY3RpdmF0aW5nIHRoZSAKLQkJLy8gY29udHJvbCBmYWlscy4gTm8gY2hlY2tpbmcgaWYgdGhlIGNvcnJlY3QgdmVyc2lvbiBvZiB0aGUgT0xFIGNvbnRyb2wgCi0JCS8vIGlzIGluc3RhbGxlZC4KLQkJdHJ5IHsKLQkJCWNvbnRyb2xTaXRlID0KLQkJCQluZXcgQnJvd3NlckNvbnRyb2xTaXRlKAotCQkJCQljb250cm9sRnJhbWUsCi0JCQkJCVNXVC5OT05FLAotCQkJCQkiU2hlbGwuRXhwbG9yZXIiKTsKLQkJCWNvbnRyb2xTaXRlLnNldEJyb3dzZXIodGhpcyk7Ci0JCQlvbGVPYmplY3QgPSBuZXcgT2xlQXV0b21hdGlvbihjb250cm9sU2l0ZSk7Ci0KLQkJCWJhY2t3YXJkRW5hYmxlZCA9IGZhbHNlOwotCQkJZm9yd2FyZEVuYWJsZWQgPSBmYWxzZTsKLQotCQkJLy8gTGlzdGVuIGZvciBjaGFuZ2VzIHRvIHRoZSBDb21tYW5kIFN0YXRlcwotCQkJY29udHJvbFNpdGUuYWRkRXZlbnRMaXN0ZW5lcihDb21tYW5kU3RhdGVDaGFuZ2UsIHRoaXMpOwotCi0JCQkvLyBpbml0aWFsaXplIGNvbnRyb2wKLQkJCWNvbnRyb2xTaXRlLmRvVmVyYihPTEUuT0xFSVZFUkJfU0hPVyk7Ci0KLQkJCS8vIGNyZWF0ZSBwcmludCBEZWxlZ2F0ZSAoaGFzIHRvIGJlIGRvbmUgZWFybHksIGhlcmUhKS4KLQkJCS8vYVByaW50RGVsZWdhdGUgPSBuZXcgTmVzdGVkUHJpbnREZWxlZ2F0ZSh0aGlzLCBvbGVPYmplY3QsIGNvbnRyb2xTaXRlKTsKLQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJU3RyaW5nIGlkID0gIm9yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMiI7Ci0JCQlJU3RhdHVzIHN0YXR1cyA9Ci0JCQkJbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBpZCwgSVN0YXR1cy5PSywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJUGxhdGZvcm0uZ2V0UGx1Z2luKCJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiKS5nZXRMb2coKS5sb2coc3RhdHVzKTsKLQkJfQotCX0KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IGJhY2soKSB7Ci0KLQkJaWYgKCFiYWNrd2FyZEVuYWJsZWQpCi0JCQlyZXR1cm4gT0xFLlNfRkFMU0U7Ci0JCWZvcndhcmRFbmFibGVkID0gdHJ1ZTsKLQotCQkvLyBkaXNwaWQ9MTAwLCB0eXBlPU1FVEhPRCwgbmFtZT0iR29CYWNrIgotCi0JCS8vIFlvdSBjYW4gaGFyZCBjb2RlIHRoZSBESVNQSUQgaWYgeW91IGtub3cgaXQgYmVmb3JlIGhhbmQgLSB0aGlzIGlzIG9mIGNvdXJzZSB0aGUgZmFzdGVzdCB3YXkKLQkJLy9pbnQgZGlzcElkTWVtYmVyID0gMTAwOwotCi0JCS8vIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gbG9vayB1cCB0aGUgRElTUElEIGR5bmFtaWNhbGx5Ci0JCWludFtdIHJnZGlzcGlkID0gb2xlT2JqZWN0LmdldElEc09mTmFtZXMobmV3IFN0cmluZ1tdIHsgIkdvQmFjayIgfSk7Ci0JCWludCBkaXNwSWRNZW1iZXIgPSByZ2Rpc3BpZFswXTsKLQotCQlWYXJpYW50IHBWYXJSZXN1bHQgPSBvbGVPYmplY3QuaW52b2tlKGRpc3BJZE1lbWJlcik7Ci0KLQkJaWYgKHBWYXJSZXN1bHQgPT0gbnVsbCB8fCBwVmFyUmVzdWx0LmdldFR5cGUoKSA9PSBPTEUuVlRfRU1QVFkpCi0JCQlyZXR1cm4gMDsKLQkJcmV0dXJuIHBWYXJSZXN1bHQuZ2V0SW50KCk7Ci0JfQotCS8qKgotCSAqLwotCXB1YmxpYyBpbnQgY29weSgpIHsKLQkJaW50IHJlc3VsdCA9IGNvbnRyb2xTaXRlLnF1ZXJ5U3RhdHVzKE9MRS5PTEVDTURJRF9DT1BZKTsKLQkJaWYgKChyZXN1bHQgJiBPTEUuT0xFQ01ERl9FTkFCTEVEKSA9PSBPTEUuT0xFQ01ERl9FTkFCTEVEKSB7Ci0JCQlyZXN1bHQgPQotCQkJCWNvbnRyb2xTaXRlLmV4ZWMoCi0JCQkJCU9MRS5PTEVDTURJRF9DT1BZLAotCQkJCQlPTEUuT0xFQ01ERVhFQ09QVF9ET0RFRkFVTFQsCi0JCQkJCW51bGwsCi0JCQkJCW51bGwpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCXByb3RlY3RlZCBPbGVGcmFtZSBjcmVhdGVPbGVGcmFtZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWlmIChjb250cm9sRnJhbWUgPT0gbnVsbCkgewotCQkJY29udHJvbEZyYW1lID0gbmV3IE9sZUZyYW1lKHBhcmVudCwgU1dULk5PTkUpOwotCQkJY29udHJvbEZyYW1lLnNldExheW91dERhdGEoCi0JCQkJbmV3IEdyaWREYXRhKAotCQkJCQlHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwKLQkJCQkJCXwgR3JpZERhdGEuR1JBQl9WRVJUSUNBTAotCQkJCQkJfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwKLQkJCQkJCXwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCkpOwotCQl9Ci0JCXJldHVybiBjb250cm9sRnJhbWU7Ci0KLQl9Ci0JLyoqCi0JICogY2xlYW4gdXAKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyoqIGNsZWFuIHVwCi0JCWlmIChvbGVPYmplY3QgIT0gbnVsbCkKLQkJCW9sZU9iamVjdC5kaXNwb3NlKCk7Ci0JCW9sZU9iamVjdCA9IG51bGw7Ci0KLQkJaWYgKGNvbnRyb2xTaXRlICE9IG51bGwpCi0JCQljb250cm9sU2l0ZS5kaXNwb3NlKCk7Ci0JCWNvbnRyb2xTaXRlID0gbnVsbDsKLQotCQlpZiAoY29udHJvbEZyYW1lICE9IG51bGwpCi0JCQljb250cm9sRnJhbWUuZGlzcG9zZSgpOwotCQljb250cm9sRnJhbWUgPSBudWxsOwotCi0JfQotCS8qKgotCSAqLwotCXB1YmxpYyBpbnQgZm9yd2FyZCgpIHsKLQkJaWYgKCFmb3J3YXJkRW5hYmxlZCkKLQkJCXJldHVybiBPTEUuU19GQUxTRTsKLQkJYmFja3dhcmRFbmFibGVkID0gdHJ1ZTsKLQkJLy8gZGlzcGlkPTEwMSwgdHlwZT1NRVRIT0QsIG5hbWU9IkdvRm9yd2FyZCIKLQotCQkvLyBZb3UgY2FuIGhhcmQgY29kZSB0aGUgRElTUElEIGlmIHlvdSBrbm93IGl0IGJlZm9yZSBoYW5kIC0gdGhpcyBpcyBvZiBjb3Vyc2UgdGhlIGZhc3Rlc3Qgd2F5Ci0JCS8vaW50IGRpc3BJZE1lbWJlciA9IDEwMTsKLQotCQkvLyBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIGxvb2sgdXAgdGhlIERJU1BJRCBkeW5hbWljYWxseQotCQlpbnRbXSByZ2Rpc3BpZCA9IG9sZU9iamVjdC5nZXRJRHNPZk5hbWVzKG5ldyBTdHJpbmdbXSB7ICJHb0ZvcndhcmQiIH0pOwotCQlpbnQgZGlzcElkTWVtYmVyID0gcmdkaXNwaWRbMF07Ci0KLQkJVmFyaWFudCBwVmFyUmVzdWx0ID0gb2xlT2JqZWN0Lmludm9rZShkaXNwSWRNZW1iZXIpOwotCQlpZiAocFZhclJlc3VsdCA9PSBudWxsIHx8IHBWYXJSZXN1bHQuZ2V0VHlwZSgpID09IE9MRS5WVF9FTVBUWSkKLQkJCXJldHVybiAwOwotCQlyZXR1cm4gcFZhclJlc3VsdC5nZXRJbnQoKTsKLQl9Ci0JcHVibGljIENvbnRyb2wgZ2V0Q29udHJvbCgpIHsKLQkJcmV0dXJuIGNvbnRyb2xGcmFtZTsKLQl9Ci0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMb2NhdGlvbk5hbWUoKSB7Ci0JCS8vIGRpc3BpZD0yMTAsIHR5cGU9UFJPUEdFVCwgbmFtZT0iTG9jYXRpb25OYW1lIgotCi0JCS8vIFlvdSBjYW4gaGFyZCBjb2RlIHRoZSBESVNQSUQgaWYgeW91IGtub3cgaXQgYmVmb3JlIGhhbmQgLSB0aGlzIGlzIG9mIGNvdXJzZSB0aGUgZmFzdGVzdCB3YXkKLQkJLy9pbnQgZGlzcElkTWVtYmVyID0gMjEwOwotCi0JCS8vIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gbG9vayB1cCB0aGUgRElTUElEIGR5bmFtaWNhbGx5Ci0JCWludFtdIHJnZGlzcGlkID0KLQkJCW9sZU9iamVjdC5nZXRJRHNPZk5hbWVzKG5ldyBTdHJpbmdbXSB7ICJMb2NhdGlvbk5hbWUiIH0pOwotCQlpbnQgZGlzcElkTWVtYmVyID0gcmdkaXNwaWRbMF07Ci0JCVZhcmlhbnQgcFZhclJlc3VsdCA9IG9sZU9iamVjdC5nZXRQcm9wZXJ0eShkaXNwSWRNZW1iZXIpOwotCQlpZiAocFZhclJlc3VsdCA9PSBudWxsIHx8IHBWYXJSZXN1bHQuZ2V0VHlwZSgpID09IE9MRS5WVF9FTVBUWSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gcFZhclJlc3VsdC5nZXRTdHJpbmcoKTsKLQl9Ci0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMb2NhdGlvblVSTCgpIHsKLQkJLy8gZGlzcGlkPTIxMSwgdHlwZT1QUk9QR0VULCBuYW1lPSJMb2NhdGlvblVSTCIKLQkJLy8gWW91IGNhbiBoYXJkIGNvZGUgdGhlIERJU1BJRCBpZiB5b3Uga25vdyBpdCBiZWZvcmUgaGFuZCAtIHRoaXMgaXMgb2YgY291cnNlIHRoZSBmYXN0ZXN0IHdheQotCQkvL2ludCBkaXNwSWRNZW1iZXIgPSAyMTE7Ci0KLQkJLy8gQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBsb29rIHVwIHRoZSBESVNQSUQgZHluYW1pY2FsbHkKLQkJaW50W10gcmdkaXNwaWQgPQotCQkJb2xlT2JqZWN0LmdldElEc09mTmFtZXMobmV3IFN0cmluZ1tdIHsgIkxvY2F0aW9uVVJMIiB9KTsKLQkJaW50IGRpc3BJZE1lbWJlciA9IHJnZGlzcGlkWzBdOwotCi0JCVZhcmlhbnQgcFZhclJlc3VsdCA9IG9sZU9iamVjdC5nZXRQcm9wZXJ0eShkaXNwSWRNZW1iZXIpOwotCQlpZiAocFZhclJlc3VsdCA9PSBudWxsIHx8IHBWYXJSZXN1bHQuZ2V0VHlwZSgpID09IE9MRS5WVF9FTVBUWSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gcFZhclJlc3VsdC5nZXRTdHJpbmcoKTsKLQl9Ci0JcHJvdGVjdGVkIE9sZUZyYW1lIGdldE9sZUZyYW1lKCkgewotCQlyZXR1cm4gY29udHJvbEZyYW1lOwotCi0JfQotCi0JcHVibGljIEJyb3dzZXJDb250cm9sU2l0ZSBnZXRDb250cm9sU2l0ZSgpIHsKLQkJcmV0dXJuIGNvbnRyb2xTaXRlOwotCX0KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IGdldFJlYWR5U3RhdGUoKSB7Ci0JCS8vIGRpc3BpZD00Mjk0OTY2NzcxLCB0eXBlPVBST1BHRVQsIG5hbWU9IlJlYWR5U3RhdGUiCi0JCS8vIFJFQURZU1RBVEVfVU5JTklUSUFMSVpFRCA9IDA7Ci0JCS8vIFJFQURZU1RBVEVfTE9BRElORyA9IDE7Ci0JCS8vIFJFQURZU1RBVEVfTE9BREVEID0gMjsKLQkJLy8gUkVBRFlTVEFURV9JTlRFUkFDVElWRSA9IDM7Ci0JCS8vIFJFQURZU1RBVEVfQ09NUExFVEUgPSA0OwotCi0JCS8vIFlvdSBjYW4gaGFyZCBjb2RlIHRoZSBESVNQSUQgaWYgeW91IGtub3cgaXQgYmVmb3JlIGhhbmQgLSB0aGlzIGlzIG9mIGNvdXJzZSB0aGUgZmFzdGVzdCB3YXkKLQkJLy9pbnQgZGlzcElkTWVtYmVyID0gLTUyNTsKLQotCQkvLyBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIGxvb2sgdXAgdGhlIERJU1BJRCBkeW5hbWljYWxseQotCQlpbnRbXSByZ2Rpc3BpZCA9IG9sZU9iamVjdC5nZXRJRHNPZk5hbWVzKG5ldyBTdHJpbmdbXSB7ICJSZWFkeVN0YXRlIiB9KTsKLQkJaW50IGRpc3BJZE1lbWJlciA9IHJnZGlzcGlkWzBdOwotCi0JCVZhcmlhbnQgcFZhclJlc3VsdCA9IG9sZU9iamVjdC5nZXRQcm9wZXJ0eShkaXNwSWRNZW1iZXIpOwotCQlpZiAocFZhclJlc3VsdCA9PSBudWxsIHx8IHBWYXJSZXN1bHQuZ2V0VHlwZSgpID09IE9MRS5WVF9FTVBUWSkKLQkJCXJldHVybiAtMTsKLQkJcmV0dXJuIHBWYXJSZXN1bHQuZ2V0SW50KCk7Ci0JfQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KE9sZUV2ZW50IGV2ZW50KSB7Ci0JCXN3aXRjaCAoZXZlbnQudHlwZSkgewotCQkJY2FzZSAoQ29tbWFuZFN0YXRlQ2hhbmdlKSA6Ci0JCQkJaW50IGNvbW1hbmQgPSAwOwotCQkJCWJvb2xlYW4gZW5hYmxlZCA9IGZhbHNlOwotCi0JCQkJVmFyaWFudCB2YXJSZXN1bHQgPSBldmVudC5hcmd1bWVudHNbMF07Ci0JCQkJaWYgKHZhclJlc3VsdCAhPSBudWxsICYmIHZhclJlc3VsdC5nZXRUeXBlKCkgIT0gT0xFLlZUX0VNUFRZKSB7Ci0JCQkJCWNvbW1hbmQgPSB2YXJSZXN1bHQuZ2V0SW50KCk7Ci0JCQkJfQotCi0JCQkJdmFyUmVzdWx0ID0gZXZlbnQuYXJndW1lbnRzWzFdOwotCQkJCWlmICh2YXJSZXN1bHQgIT0gbnVsbCAmJiB2YXJSZXN1bHQuZ2V0VHlwZSgpICE9IE9MRS5WVF9FTVBUWSkgewotCQkJCQllbmFibGVkID0gdmFyUmVzdWx0LmdldEJvb2xlYW4oKTsKLQkJCQl9Ci0KLQkJCQlpZiAoY29tbWFuZCA9PSBDU0NfTkFWSUdBVEVCQUNLKQotCQkJCQliYWNrd2FyZEVuYWJsZWQgPSBlbmFibGVkOwotCQkJCWlmIChjb21tYW5kID09IENTQ19OQVZJR0FURUZPUldBUkQpCi0JCQkJCWZvcndhcmRFbmFibGVkID0gZW5hYmxlZDsKLQotCQkJCXJldHVybjsKLQotCQkJY2FzZSAoRG9jdW1lbnRDb21wbGV0ZSkgOgotCQkJCXZhclJlc3VsdCA9IGV2ZW50LmFyZ3VtZW50c1swXTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJLy90aHJvdyBuZXcgT2xlRXJyb3IoT0xFLkVSUk9SX05PVF9JTVBMRU1FTlRFRCk7Ci0JfQotCS8qKgotCSAqLwotCXB1YmxpYyBpbnQgaG9tZSgpIHsKLQkJLy8gZGlzcGlkPTEwMiwgdHlwZT1NRVRIT0QsIG5hbWU9IkdvSG9tZSIKLQotCQkvLyBZb3UgY2FuIGhhcmQgY29kZSB0aGUgRElTUElEIGlmIHlvdSBrbm93IGl0IGJlZm9yZSBoYW5kIC0gdGhpcyBpcyBvZiBjb3Vyc2UgdGhlIGZhc3Rlc3Qgd2F5Ci0JCS8vaW50IGRpc3BJZE1lbWJlciA9IDEwMjsKLQotCQkvLyBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIGxvb2sgdXAgdGhlIERJU1BJRCBkeW5hbWljYWxseQotCQlpbnRbXSByZ2Rpc3BpZCA9IG9sZU9iamVjdC5nZXRJRHNPZk5hbWVzKG5ldyBTdHJpbmdbXSB7ICJHb0hvbWUiIH0pOwotCQlpbnQgZGlzcElkTWVtYmVyID0gcmdkaXNwaWRbMF07Ci0KLQkJVmFyaWFudCBwVmFyUmVzdWx0ID0gb2xlT2JqZWN0Lmludm9rZShkaXNwSWRNZW1iZXIpOwotCQlpZiAocFZhclJlc3VsdCA9PSBudWxsIHx8IHBWYXJSZXN1bHQuZ2V0VHlwZSgpID09IE9MRS5WVF9FTVBUWSkKLQkJCXJldHVybiAwOwotCQlyZXR1cm4gcFZhclJlc3VsdC5nZXRJbnQoKTsKLQl9Ci0JLyoqCi0JICovCi0JcHVibGljIGludCBuYXZpZ2F0ZShTdHJpbmcgdXJsKSB7Ci0JCXJldHVybiBuYXZpZ2F0ZShvbGVPYmplY3QsIHVybCk7Ci0JfQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBpbnQgbmF2aWdhdGUoT2xlQXV0b21hdGlvbiBhT2xlQXV0b21hdGlvbiwgU3RyaW5nIHVybCkgewotCQkvL2lmIChMb2dnZXIuREVCVUcpCi0JCS8vTG9nZ2VyLmxvZ0RlYnVnTWVzc2FnZSgiV2ViQnJvd3NlciIsICJuYXZpZ2F0ZSB0bzogIiArIHVybCk7Ci0JCS8vIGRpc3BpZD0xMDQsIHR5cGU9TUVUSE9ELCBuYW1lPSJOYXZpZ2F0ZSIKLQotCQkvLyBZb3UgY2FuIGhhcmQgY29kZSB0aGUgRElTUElEIGlmIHlvdSBrbm93IGl0IGJlZm9yZSBoYW5kIC0gdGhpcyBpcyBvZiBjb3Vyc2UgdGhlIGZhc3Rlc3Qgd2F5Ci0JCS8vaW50IGRpc3BJZE1lbWJlciA9IDEwNDsKLQotCQkvLyBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIGxvb2sgdXAgdGhlIERJU1BJRCBkeW5hbWljYWxseQotCQkvLyBIZXJlIHdlIGFyZSBsb29raW5nIHVwIHRoZSBpZCBvZiB0aGUgYXJndW1lbnQgYXMgd2VsbAotCQlpbnRbXSByZ2Rpc3BpZCA9Ci0JCQlhT2xlQXV0b21hdGlvbi5nZXRJRHNPZk5hbWVzKG5ldyBTdHJpbmdbXSB7ICJOYXZpZ2F0ZSIsICJVUkwiIH0pOwotCQlpbnQgZGlzcElkTWVtYmVyID0gcmdkaXNwaWRbMF07Ci0KLQkJVmFyaWFudFtdIHJndmFyZyA9IG5ldyBWYXJpYW50WzFdOwotCQlyZ3ZhcmdbMF0gPSBuZXcgVmFyaWFudCh1cmwpOwotCQlpbnRbXSByZ2Rpc3BpZE5hbWVkQXJncyA9IG5ldyBpbnRbMV07Ci0JCXJnZGlzcGlkTmFtZWRBcmdzWzBdID0gcmdkaXNwaWRbMV07IC8vIGlkZW50aWZpZXIgb2YgYXJndW1lbnQKLQkJVmFyaWFudCBwVmFyUmVzdWx0ID0KLQkJCWFPbGVBdXRvbWF0aW9uLmludm9rZShkaXNwSWRNZW1iZXIsIHJndmFyZywgcmdkaXNwaWROYW1lZEFyZ3MpOwotCQlpZiAocFZhclJlc3VsdCA9PSBudWxsIHx8IHBWYXJSZXN1bHQuZ2V0VHlwZSgpID09IE9MRS5WVF9FTVBUWSkKLQkJCXJldHVybiAwOwotCQlyZXR1cm4gcFZhclJlc3VsdC5nZXRJbnQoKTsKLQotCX0KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IHByaW50KCkgewotCQlyZXR1cm4gcHJpbnQoY29udHJvbFNpdGUsIHRydWUpOwotCX0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IHByaW50KEJyb3dzZXJDb250cm9sU2l0ZSBhQ29udHJvbFNpdGUsIGJvb2xlYW4gcHJvbXB0dXNlcikgewotCi0JCWludCByZXN1bHQgPSBhQ29udHJvbFNpdGUucXVlcnlTdGF0dXMoT0xFLk9MRUNNRElEX1BSSU5UKTsKLQotCQlpZiAoKHJlc3VsdCAmIE9MRS5PTEVDTURGX0VOQUJMRUQpID09IE9MRS5PTEVDTURGX0VOQUJMRUQpIHsKLQkJCWlmIChwcm9tcHR1c2VyKQotCQkJCXJlc3VsdCA9Ci0JCQkJCWFDb250cm9sU2l0ZS5leGVjKAotCQkJCQkJT0xFLk9MRUNNRElEX1BSSU5ULAotCQkJCQkJT0xFLk9MRUNNREVYRUNPUFRfUFJPTVBUVVNFUiwKLQkJCQkJCW51bGwsCi0JCQkJCQludWxsKTsKLQkJCWVsc2UKLQkJCQlyZXN1bHQgPQotCQkJCQlhQ29udHJvbFNpdGUuZXhlYygKLQkJCQkJCU9MRS5PTEVDTURJRF9QUklOVCwKLQkJCQkJCU9MRS5PTEVDTURFWEVDT1BUX0RPTlRQUk9NUFRVU0VSLAotCQkJCQkJbnVsbCwKLQkJCQkJCW51bGwpOwotCQl9Ci0KLQkJLy9pZiAoTG9nZ2VyLkRFQlVHKQotCQkvL0xvZ2dlci5sb2dEZWJ1Z01lc3NhZ2UoIldlYkJyb3dzZXIiLCAiZXhlYyByZXR1cm5zOiAiICsgSW50ZWdlci50b1N0cmluZyhyZXN1bHQpKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZWZyZXNoIHRoZSBjdXJyZW50bHkgdmlld2VkIHBhZ2UuCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQotCQkvLyBkaXNwaWQ9IDQyOTQ5NjY3NDYsIHR5cGU9TUVUSE9ELCBuYW1lPSJSZWZyZXNoIgotCi0JCS8vIFlvdSBjYW4gaGFyZCBjb2RlIHRoZSBESVNQSUQgaWYgeW91IGtub3cgaXQgYmVmb3JlIGhhbmQgLSB0aGlzIGlzIG9mIGNvdXJzZSB0aGUgZmFzdGVzdCB3YXkKLQkJLy9pbnQgZGlzcElkTWVtYmVyID0gIDQyOTQ5NjY3NDY7Ci0KLQkJLy8gQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBsb29rIHVwIHRoZSBESVNQSUQgZHluYW1pY2FsbHkKLQkJaW50W10gcmdkaXNwaWQgPSBvbGVPYmplY3QuZ2V0SURzT2ZOYW1lcyhuZXcgU3RyaW5nW10geyAiUmVmcmVzaCIgfSk7Ci0JCWludCBkaXNwSWRNZW1iZXIgPSByZ2Rpc3BpZFswXTsKLQotCQlvbGVPYmplY3QuaW52b2tlTm9SZXBseShkaXNwSWRNZW1iZXIpOwotCX0KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IHNlYXJjaCgpIHsKLQkJLy8gZGlzcGlkPTEwMywgdHlwZT1NRVRIT0QsIG5hbWU9IkdvU2VhcmNoIgotCi0JCS8vIFlvdSBjYW4gaGFyZCBjb2RlIHRoZSBESVNQSUQgaWYgeW91IGtub3cgaXQgYmVmb3JlIGhhbmQgLSB0aGlzIGlzIG9mIGNvdXJzZSB0aGUgZmFzdGVzdCB3YXkKLQkJLy9pbnQgZGlzcElkTWVtYmVyID0gMTAzOwotCi0JCS8vIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gbG9vayB1cCB0aGUgRElTUElEIGR5bmFtaWNhbGx5Ci0JCWludFtdIHJnZGlzcGlkID0gb2xlT2JqZWN0LmdldElEc09mTmFtZXMobmV3IFN0cmluZ1tdIHsgIkdvU2VhcmNoIiB9KTsKLQkJaW50IGRpc3BJZE1lbWJlciA9IHJnZGlzcGlkWzBdOwotCi0JCVZhcmlhbnQgcFZhclJlc3VsdCA9IG9sZU9iamVjdC5pbnZva2UoZGlzcElkTWVtYmVyKTsKLQkJaWYgKHBWYXJSZXN1bHQgPT0gbnVsbCB8fCBwVmFyUmVzdWx0LmdldFR5cGUoKSA9PSBPTEUuVlRfRU1QVFkpCi0JCQlyZXR1cm4gMDsKLQkJcmV0dXJuIHBWYXJSZXN1bHQuZ2V0SW50KCk7Ci0JfQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoKSB7Ci0JCS8vIGRpc3BpZD0xMDYsIHR5cGU9TUVUSE9ELCBuYW1lPSJTdG9wIgotCi0JCS8vIFlvdSBjYW4gaGFyZCBjb2RlIHRoZSBESVNQSUQgaWYgeW91IGtub3cgaXQgYmVmb3JlIGhhbmQgLSB0aGlzIGlzIG9mIGNvdXJzZSB0aGUgZmFzdGVzdCB3YXkKLQkJLy9pbnQgZGlzcElkTWVtYmVyID0gMTA2OwotCi0JCS8vIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gbG9vayB1cCB0aGUgRElTUElEIGR5bmFtaWNhbGx5Ci0JCWludFtdIHJnZGlzcGlkID0gb2xlT2JqZWN0LmdldElEc09mTmFtZXMobmV3IFN0cmluZ1tdIHsgIlN0b3AiIH0pOwotCQlpbnQgZGlzcElkTWVtYmVyID0gcmdkaXNwaWRbMF07Ci0KLQkJLy9WYXJpYW50IHBWYXJSZXN1bHQgPSBvbGVPYmplY3QuaW52b2tlKGRpc3BJZE1lbWJlcik7Ci0JCW9sZU9iamVjdC5pbnZva2UoZGlzcElkTWVtYmVyKTsKLQl9Ci0JLyoqCi0JICogR2V0cyB0aGUgZm9yd2FyZEVuYWJsZWQKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGb3J3YXJkRW5hYmxlZCgpIHsKLQkJcmV0dXJuIGZvcndhcmRFbmFibGVkOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGJhY2t3YXJkRW5hYmxlZAotCSAqIEByZXR1cm4gUmV0dXJucyBhIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0JhY2t3YXJkRW5hYmxlZCgpIHsKLQkJcmV0dXJuIGJhY2t3YXJkRW5hYmxlZDsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3NyYy9vcmcvZWNsaXBzZS93ZWxjb21lL2ludGVybmFsL3dlYmJyb3dzZXIvV2ViQnJvd3NlckVkaXRvci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvd2VsY29tZS9pbnRlcm5hbC93ZWJicm93c2VyL1dlYkJyb3dzZXJFZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE3NDAyYy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3NyYy9vcmcvZWNsaXBzZS93ZWxjb21lL2ludGVybmFsL3dlYmJyb3dzZXIvV2ViQnJvd3NlckVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud2VsY29tZS5pbnRlcm5hbC53ZWJicm93c2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lm9sZS53aW4zMi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLldvcmtiZW5jaEhlbHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5FZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndlbGNvbWUuaW50ZXJuYWwuKjsKLQotcHVibGljIGNsYXNzIFdlYkJyb3dzZXJFZGl0b3IgZXh0ZW5kcyBFZGl0b3JQYXJ0IGltcGxlbWVudHMgSUVtYmVkZGVkV2ViQnJvd3NlciB7Ci0JLy8gTkwKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX05PVF9BVkFJTEFCTEUgPQotCQkiV2ViQnJvd3NlclZpZXcubm90QXZhaWxhYmxlIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0FERFJFU1MgPSAiV2ViQnJvd3NlclZpZXcuYWRkcmVzcyI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9TVE9QID0gIldlYkJyb3dzZXJWaWV3LnN0b3AiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfR08gPSAiV2ViQnJvd3NlclZpZXcuZ28iOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfUkVGUkVTSCA9ICJXZWJCcm93c2VyVmlldy5yZWZyZXNoIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0JBQ0tXQVJEID0gIldlYkJyb3dzZXJWaWV3LmJhY2t3YXJkIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0ZPUldBUkQgPSAiV2ViQnJvd3NlclZpZXcuZm9yd2FyZCI7Ci0KLQlwcml2YXRlIGludCBBRERSRVNTX1NJWkUgPSAxMDsKLQlwcml2YXRlIFdlYkJyb3dzZXIgYnJvd3NlcjsKLQlwcml2YXRlIENvbnRyb2wgY29udHJvbDsKLQlwcml2YXRlIENvbWJvIGFkZHJlc3NDb21ibzsKLQlwcml2YXRlIE9iamVjdCBpbnB1dDsKLQlwcml2YXRlIFRvb2xCYXJNYW5hZ2VyIHRvb2xCYXJNYW5hZ2VyOwotCXByaXZhdGUgQWN0aW9uIHJlZnJlc2hBY3Rpb247Ci0JcHJpdmF0ZSBBY3Rpb24gc3RvcEFjdGlvbjsKLQlwcml2YXRlIEFjdGlvbiBnb0FjdGlvbjsKLQlwcml2YXRlIEdsb2JhbEFjdGlvbkhhbmRsZXIgZ2xvYmFsQWN0aW9uSGFuZGxlcjsKLQlwcml2YXRlIElXZWJCcm93c2VyTGlzdGVuZXIgbGlzdGVuZXI7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JU2F2ZWFibGVQYXJ0I2RvU2F2ZShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb1NhdmUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVNhdmVhYmxlUGFydCNkb1NhdmVBcygpCi0JICovCi0JcHVibGljIHZvaWQgZG9TYXZlQXMoKSB7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQjZ290b01hcmtlcihvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyKQotCSAqLwotCXB1YmxpYyB2b2lkIGdvdG9NYXJrZXIoSU1hcmtlciBtYXJrZXIpIHsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydCNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpCi0JCXRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0JCWlmICghKGlucHV0IGluc3RhbmNlb2YgV2ViQnJvd3NlckVkaXRvcklucHV0KSkKLQkJCXRocm93IG5ldyBQYXJ0SW5pdEV4Y2VwdGlvbigiSW52YWxpZCBJbnB1dDogTXVzdCBiZSBXZWxjb21lRWRpdG9ySW5wdXQiKTsKLQkJc2V0U2l0ZShzaXRlKTsKLQkJc2V0SW5wdXQoaW5wdXQpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklTYXZlYWJsZVBhcnQjaXNEaXJ0eSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEaXJ0eSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklTYXZlYWJsZVBhcnQjaXNTYXZlQXNBbGxvd2VkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NhdmVBc0FsbG93ZWQoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgV2ViQnJvd3NlckVkaXRvcigpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElGb3JtUGFnZSNjcmVhdGVDb250cm9sKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb250YWluZXIgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQljb250cm9sID0gY29udGFpbmVyOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gMDsKLQkJY29udGFpbmVyLnNldExheW91dChsYXlvdXQpOwotCi0JCUNvbXBvc2l0ZSBuYXZDb250YWluZXIgPSBuZXcgQ29tcG9zaXRlKGNvbnRhaW5lciwgU1dULk5PTkUpOwotCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAxOwotCQluYXZDb250YWluZXIuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWNyZWF0ZU5hdkJhcihuYXZDb250YWluZXIpOwotCQluYXZDb250YWluZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWZpbmFsIFdlYkJyb3dzZXIgd2luQnJvd3NlciA9IG5ldyBXZWJCcm93c2VyKGNvbnRhaW5lcik7Ci0JCWJyb3dzZXIgPSB3aW5Ccm93c2VyOwotCi0JCUNvbnRyb2wgYyA9IGJyb3dzZXIuZ2V0Q29udHJvbCgpOwotCQljLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQlmaW5hbCBCcm93c2VyQ29udHJvbFNpdGUgc2l0ZSA9IHdpbkJyb3dzZXIuZ2V0Q29udHJvbFNpdGUoKTsKLQkJSVN0YXR1c0xpbmVNYW5hZ2VyIHNtbmcgPQotCQkJZ2V0RWRpdG9yU2l0ZSgpLmdldEFjdGlvbkJhcnMoKS5nZXRTdGF0dXNMaW5lTWFuYWdlcigpOwotCQlzaXRlLnNldFN0YXR1c0xpbmVNYW5hZ2VyKHNtbmcpOwotCi0JCXNpdGUuYWRkRXZlbnRMaXN0ZW5lcihXZWJCcm93c2VyLkRvd25sb2FkQ29tcGxldGUsIG5ldyBPbGVMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KE9sZUV2ZW50IGV2ZW50KSB7Ci0JCQkJU3RyaW5nIHVybCA9IHdpbkJyb3dzZXIuZ2V0TG9jYXRpb25VUkwoKTsKLQkJCQlpZiAodXJsICE9IG51bGwpIHsKLQkJCQkJYWRkcmVzc0NvbWJvLnNldFRleHQodXJsKTsKLQkJCQkJZG93bmxvYWRDb21wbGV0ZSh1cmwpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCXNpdGUuYWRkRXZlbnRMaXN0ZW5lcihXZWJCcm93c2VyLkRvd25sb2FkQmVnaW4sIG5ldyBPbGVMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KE9sZUV2ZW50IGV2ZW50KSB7Ci0JCQkJc3RvcEFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQkJCXJlZnJlc2hBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9Ci0JCX0pOwotCQlXb3JrYmVuY2hIZWxwLnNldEhlbHAoY29udGFpbmVyLCAib3JnLmVjbGlwc2UudXBkYXRlLnVpLldlYkJyb3dzZXJWaWV3Iik7Ci0JCVdlYkJyb3dzZXJFZGl0b3JJbnB1dCBpbnB1dCA9IChXZWJCcm93c2VyRWRpdG9ySW5wdXQpZ2V0RWRpdG9ySW5wdXQoKTsKLQkJb3BlblRvKGlucHV0LmdldFVSTCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBvcGVuVG8oZmluYWwgU3RyaW5nIHVybCkgewotCQlhZGRyZXNzQ29tYm8uc2V0VGV4dCh1cmwpOwotCQljb250cm9sLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCW5hdmlnYXRlKHVybCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgdm9pZCBkb3dubG9hZENvbXBsZXRlKFN0cmluZyB1cmwpIHsKLQkJc3RvcEFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJcmVmcmVzaEFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlpZiAobGlzdGVuZXIhPW51bGwpCi0JCQlsaXN0ZW5lci5zdGF0ZUNoYW5nZWQoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TGlzdGVuZXIoSVdlYkJyb3dzZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLmxpc3RlbmVyID0gbGlzdGVuZXI7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZU5hdkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUxhYmVsIGFkZHJlc3NMYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQkJYWRkcmVzc0xhYmVsLnNldFRleHQoV2VsY29tZVBvcnRhbC5nZXRTdHJpbmcoS0VZX0FERFJFU1MpKTsKLQotCQlhZGRyZXNzQ29tYm8gPSBuZXcgQ29tYm8ocGFyZW50LCBTV1QuRFJPUF9ET1dOIHwgU1dULkJPUkRFUik7Ci0JCWFkZHJlc3NDb21iby5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlTdHJpbmcgdGV4dCA9IGFkZHJlc3NDb21iby5nZXRUZXh0KCk7Ci0JCQkJZ29BY3Rpb24uc2V0RW5hYmxlZCh0ZXh0Lmxlbmd0aCgpID4gMCk7Ci0JCQl9Ci0JCX0pOwotCQlhZGRyZXNzQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCVN0cmluZyB0ZXh0ID0KLQkJCQkJYWRkcmVzc0NvbWJvLmdldEl0ZW0oYWRkcmVzc0NvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkpOwotCQkJCWlmICh0ZXh0Lmxlbmd0aCgpID4gMCkKLQkJCQkJbmF2aWdhdGUodGV4dCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCW5hdmlnYXRlKGFkZHJlc3NDb21iby5nZXRUZXh0KCkpOwotCQkJfQotCQl9KTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJYWRkcmVzc0NvbWJvLnNldExheW91dERhdGEoZ2QpOwotCQlUb29sQmFyIHRvb2xiYXIgPSBuZXcgVG9vbEJhcihwYXJlbnQsIFNXVC5GTEFUIHwgU1dULkhPUklaT05UQUwpOwotCQl0b29sQmFyTWFuYWdlciA9IG5ldyBUb29sQmFyTWFuYWdlcih0b29sYmFyKTsKLQkJbWFrZUFjdGlvbnMoKTsKLQkJSUFjdGlvbkJhcnMgYmFycyA9IGdldEVkaXRvclNpdGUoKS5nZXRBY3Rpb25CYXJzKCk7Ci0JCWdsb2JhbEFjdGlvbkhhbmRsZXIgPSBuZXcgR2xvYmFsQWN0aW9uSGFuZGxlcihiYXJzLCBhZGRyZXNzQ29tYm8pOwotCX0KLQotCXByaXZhdGUgdm9pZCBuYXZpZ2F0ZShTdHJpbmcgdXJsKSB7Ci0JCWJyb3dzZXIubmF2aWdhdGUodXJsKTsKLQkJU3RyaW5nW10gaXRlbXMgPSBhZGRyZXNzQ29tYm8uZ2V0SXRlbXMoKTsKLQkJaW50IGxvYyA9IC0xOwotCQlTdHJpbmcgbm9ybVVSTCA9IGdldE5vcm1hbGl6ZWRVUkwodXJsKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIG5vcm1JdGVtID0gZ2V0Tm9ybWFsaXplZFVSTChpdGVtc1tpXSk7Ci0JCQlpZiAobm9ybVVSTC5lcXVhbHMobm9ybUl0ZW0pKSB7Ci0JCQkJLy8gbWF0Y2ggCi0JCQkJbG9jID0gaTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAobG9jICE9IC0xKSB7Ci0JCQlhZGRyZXNzQ29tYm8ucmVtb3ZlKGxvYyk7Ci0JCX0KLQkJYWRkcmVzc0NvbWJvLmFkZCh1cmwsIDApOwotCQlpZiAoYWRkcmVzc0NvbWJvLmdldEl0ZW1Db3VudCgpID4gQUREUkVTU19TSVpFKSB7Ci0JCQlhZGRyZXNzQ29tYm8ucmVtb3ZlKGFkZHJlc3NDb21iby5nZXRJdGVtQ291bnQoKSAtIDEpOwotCQl9Ci0JCWFkZHJlc3NDb21iby5nZXRQYXJlbnQoKS5sYXlvdXQodHJ1ZSk7Ci0JfQotCQotCXZvaWQgYmFjaygpIHsKLQkJYnJvd3Nlci5iYWNrKCk7Ci0JfQotCXZvaWQgZm9yd2FyZCgpIHsKLQkJYnJvd3Nlci5mb3J3YXJkKCk7Ci0JfQotCWJvb2xlYW4gaXNCYWNrd2FyZEVuYWJsZWQoKSB7Ci0JCXJldHVybiBicm93c2VyLmlzQmFja3dhcmRFbmFibGVkKCk7Ci0JfQotCWJvb2xlYW4gaXNGb3J3YXJkRW5hYmxlZCgpIHsKLQkJcmV0dXJuIGJyb3dzZXIuaXNGb3J3YXJkRW5hYmxlZCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBtYWtlQWN0aW9ucygpIHsKLQkJZ29BY3Rpb24gPSBuZXcgQWN0aW9uKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCW5hdmlnYXRlKGFkZHJlc3NDb21iby5nZXRUZXh0KCkpOwotCQkJfQotCQl9OwotCQlnb0FjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJZ29BY3Rpb24uc2V0VG9vbFRpcFRleHQoV2VsY29tZVBvcnRhbC5nZXRTdHJpbmcoS0VZX0dPKSk7Ci0JCWdvQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihXZWxjb21lUG9ydGFsSW1hZ2VzLkRFU0NfR09fTkFWKTsKLQkJZ29BY3Rpb24uc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoV2VsY29tZVBvcnRhbEltYWdlcy5ERVNDX0dPX05BVl9EKTsKLQkJZ29BY3Rpb24uc2V0SG92ZXJJbWFnZURlc2NyaXB0b3IoV2VsY29tZVBvcnRhbEltYWdlcy5ERVNDX0dPX05BVl9IKTsKLQotCQlzdG9wQWN0aW9uID0gbmV3IEFjdGlvbigpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlicm93c2VyLnN0b3AoKTsKLQkJCX0KLQkJfTsKLQkJc3RvcEFjdGlvbi5zZXRUb29sVGlwVGV4dChXZWxjb21lUG9ydGFsLmdldFN0cmluZyhLRVlfU1RPUCkpOwotCQlzdG9wQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihXZWxjb21lUG9ydGFsSW1hZ2VzLkRFU0NfU1RPUF9OQVYpOwotCQlzdG9wQWN0aW9uLnNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKAotCQkJV2VsY29tZVBvcnRhbEltYWdlcy5ERVNDX1NUT1BfTkFWX0QpOwotCQlzdG9wQWN0aW9uLnNldEhvdmVySW1hZ2VEZXNjcmlwdG9yKAotCQkJV2VsY29tZVBvcnRhbEltYWdlcy5ERVNDX1NUT1BfTkFWX0gpOwotCQlzdG9wQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCXJlZnJlc2hBY3Rpb24gPSBuZXcgQWN0aW9uKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWJyb3dzZXIucmVmcmVzaCgpOwotCQkJfQotCQl9OwotCQlyZWZyZXNoQWN0aW9uLnNldFRvb2xUaXBUZXh0KAotCQkJV2VsY29tZVBvcnRhbC5nZXRTdHJpbmcoS0VZX1JFRlJFU0gpKTsKLQkJcmVmcmVzaEFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoV2VsY29tZVBvcnRhbEltYWdlcy5ERVNDX1JFRlJFU0hfTkFWKTsKLQkJcmVmcmVzaEFjdGlvbi5zZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcigKLQkJCVdlbGNvbWVQb3J0YWxJbWFnZXMuREVTQ19SRUZSRVNIX05BVl9EKTsKLQkJcmVmcmVzaEFjdGlvbi5zZXRIb3ZlckltYWdlRGVzY3JpcHRvcigKLQkJCVdlbGNvbWVQb3J0YWxJbWFnZXMuREVTQ19SRUZSRVNIX05BVl9IKTsKLQkJcmVmcmVzaEFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQl0b29sQmFyTWFuYWdlci5hZGQoZ29BY3Rpb24pOwotCQl0b29sQmFyTWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJdG9vbEJhck1hbmFnZXIuYWRkKHN0b3BBY3Rpb24pOwotCQl0b29sQmFyTWFuYWdlci5hZGQocmVmcmVzaEFjdGlvbik7Ci0JCXRvb2xCYXJNYW5hZ2VyLnVwZGF0ZSh0cnVlKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXROb3JtYWxpemVkVVJMKFN0cmluZyB1cmwpIHsKLQkJdXJsID0gdXJsLnRvTG93ZXJDYXNlKCk7Ci0JCWlmICh1cmwuaW5kZXhPZigiOi8vIikgPT0gLTEpIHsKLQkJCXVybCA9ICJodHRwOi8vIiArIHVybDsKLQkJfQotCQlyZXR1cm4gdXJsOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChicm93c2VyICE9IG51bGwpCi0JCQlicm93c2VyLmRpc3Bvc2UoKTsKLQkJZ2xvYmFsQWN0aW9uSGFuZGxlci5kaXNwb3NlKCk7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLQkJaWYgKGNvbnRyb2wgIT0gbnVsbCkKLQkJCWNvbnRyb2wuc2V0Rm9jdXMoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3NyYy9vcmcvZWNsaXBzZS93ZWxjb21lL2ludGVybmFsL3dlYmJyb3dzZXIvV2ViQnJvd3NlckVkaXRvckNvbnRyaWJ1dG9yLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3NyYy9vcmcvZWNsaXBzZS93ZWxjb21lL2ludGVybmFsL3dlYmJyb3dzZXIvV2ViQnJvd3NlckVkaXRvckNvbnRyaWJ1dG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0YjkwMzkuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvd2VsY29tZS9pbnRlcm5hbC93ZWJicm93c2VyL1dlYkJyb3dzZXJFZGl0b3JDb250cmlidXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIEp1biAxOCwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndlbGNvbWUuaW50ZXJuYWwud2ViYnJvd3NlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud2VsY29tZS5pbnRlcm5hbC4qOwotCi0vKioKLSAqIEBhdXRob3IgZGVqYW4KLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgV2ViQnJvd3NlckVkaXRvckNvbnRyaWJ1dG9yCi0JZXh0ZW5kcyBFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvcgotCWltcGxlbWVudHMgSVdlYkJyb3dzZXJMaXN0ZW5lciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9OT1RfQVZBSUxBQkxFID0KLQkJIldlYkJyb3dzZXJWaWV3Lm5vdEF2YWlsYWJsZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9IT01FID0gIldlYkJyb3dzZXJWaWV3LmhvbWUiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQkFDS1dBUkQgPSAiV2ViQnJvd3NlclZpZXcuYmFja3dhcmQiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfRk9SV0FSRCA9ICJXZWJCcm93c2VyVmlldy5mb3J3YXJkIjsKLQotCXByaXZhdGUgQWN0aW9uIGhvbWVBY3Rpb247Ci0JcHJpdmF0ZSBBY3Rpb24gYmFja3dhcmRBY3Rpb247Ci0JcHJpdmF0ZSBBY3Rpb24gZm9yd2FyZEFjdGlvbjsKLQlwcml2YXRlIFdlYkJyb3dzZXJFZGl0b3IgZWRpdG9yOwotCQotCXB1YmxpYyBXZWJCcm93c2VyRWRpdG9yQ29udHJpYnV0b3IoKSB7Ci0JCW1ha2VBY3Rpb25zKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud2VsY29tZS5pbnRlcm5hbC5JV2ViQnJvd3Nlckxpc3RlbmVyI3N0YXRlQ2hhbmdlZCgpCi0JICovCi0JcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKCkgewotCQl1cGRhdGVBY3Rpb25zKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG1ha2VBY3Rpb25zKCkgewotCQlob21lQWN0aW9uID0gbmV3IEFjdGlvbigpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlXZWJCcm93c2VyRWRpdG9ySW5wdXQgaW5wdXQgPSAoV2ViQnJvd3NlckVkaXRvcklucHV0KWVkaXRvci5nZXRFZGl0b3JJbnB1dCgpOwotCQkJCWVkaXRvci5vcGVuVG8oaW5wdXQuZ2V0VVJMKCkpOwotCQkJfQotCQl9OwotCQlob21lQWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCWhvbWVBY3Rpb24uc2V0VG9vbFRpcFRleHQoV2VsY29tZVBvcnRhbC5nZXRTdHJpbmcoS0VZX0hPTUUpKTsKLQkJaG9tZUFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoCi0JCQlXZWxjb21lUG9ydGFsSW1hZ2VzLkRFU0NfSE9NRV9OQVYpOwotCQlob21lQWN0aW9uLnNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKAotCQkJV2VsY29tZVBvcnRhbEltYWdlcy5ERVNDX0hPTUVfTkFWX0QpOwotCQlob21lQWN0aW9uLnNldEhvdmVySW1hZ2VEZXNjcmlwdG9yKAotCQkJV2VsY29tZVBvcnRhbEltYWdlcy5ERVNDX0hPTUVfTkFWX0gpOwotCi0KLQkJYmFja3dhcmRBY3Rpb24gPSBuZXcgQWN0aW9uKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWVkaXRvci5iYWNrKCk7Ci0JCQl9Ci0JCX07Ci0JCWJhY2t3YXJkQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQliYWNrd2FyZEFjdGlvbi5zZXRUb29sVGlwVGV4dChXZWxjb21lUG9ydGFsLmdldFN0cmluZyhLRVlfQkFDS1dBUkQpKTsKLQkJYmFja3dhcmRBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJV2VsY29tZVBvcnRhbEltYWdlcy5ERVNDX0JBQ0tXQVJEX05BVik7Ci0JCWJhY2t3YXJkQWN0aW9uLnNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKAotCQkJV2VsY29tZVBvcnRhbEltYWdlcy5ERVNDX0JBQ0tXQVJEX05BVl9EKTsKLQkJYmFja3dhcmRBY3Rpb24uc2V0SG92ZXJJbWFnZURlc2NyaXB0b3IoCi0JCQlXZWxjb21lUG9ydGFsSW1hZ2VzLkRFU0NfQkFDS1dBUkRfTkFWX0gpOwotCi0JCWZvcndhcmRBY3Rpb24gPSBuZXcgQWN0aW9uKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWVkaXRvci5mb3J3YXJkKCk7Ci0JCQl9Ci0JCX07Ci0JCWZvcndhcmRBY3Rpb24uc2V0VG9vbFRpcFRleHQoV2VsY29tZVBvcnRhbC5nZXRTdHJpbmcoS0VZX0ZPUldBUkQpKTsKLQkJZm9yd2FyZEFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoV2VsY29tZVBvcnRhbEltYWdlcy5ERVNDX0ZPUldBUkRfTkFWKTsKLQkJZm9yd2FyZEFjdGlvbi5zZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcigKLQkJCVdlbGNvbWVQb3J0YWxJbWFnZXMuREVTQ19GT1JXQVJEX05BVl9EKTsKLQkJZm9yd2FyZEFjdGlvbi5zZXRIb3ZlckltYWdlRGVzY3JpcHRvcigKLQkJCVdlbGNvbWVQb3J0YWxJbWFnZXMuREVTQ19GT1JXQVJEX05BVl9IKTsKLQkJZm9yd2FyZEFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjb250cmlidXRlVG9Ub29sQmFyKElUb29sQmFyTWFuYWdlciB0b29sQmFyTWFuYWdlcikgewotCQl0b29sQmFyTWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJdG9vbEJhck1hbmFnZXIuYWRkKGhvbWVBY3Rpb24pOwotCQl0b29sQmFyTWFuYWdlci5hZGQoYmFja3dhcmRBY3Rpb24pOwotCQl0b29sQmFyTWFuYWdlci5hZGQoZm9yd2FyZEFjdGlvbik7Ci0JfQotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZUVkaXRvcihJRWRpdG9yUGFydCB0YXJnZXRFZGl0b3IpIHsKLQkJaWYgKHRoaXMuZWRpdG9yICE9IG51bGwpCi0JCQl0aGlzLmVkaXRvci5zZXRMaXN0ZW5lcihudWxsKTsKLQkJZWRpdG9yID0gKFdlYkJyb3dzZXJFZGl0b3IpIHRhcmdldEVkaXRvcjsKLQkJaWYgKGVkaXRvciAhPSBudWxsKSB7Ci0JCQllZGl0b3Iuc2V0TGlzdGVuZXIodGhpcyk7Ci0JCQl1cGRhdGVBY3Rpb25zKCk7Ci0JCX0KLQl9Ci0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUFjdGlvbnMoKSB7Ci0JCWJhY2t3YXJkQWN0aW9uLnNldEVuYWJsZWQoZWRpdG9yLmlzQmFja3dhcmRFbmFibGVkKCkpOwotCQlmb3J3YXJkQWN0aW9uLnNldEVuYWJsZWQoZWRpdG9yLmlzRm9yd2FyZEVuYWJsZWQoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvd2VsY29tZS9pbnRlcm5hbC93ZWJicm93c2VyL1dlYkJyb3dzZXJFZGl0b3JJbnB1dC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvd2VsY29tZS9pbnRlcm5hbC93ZWJicm93c2VyL1dlYkJyb3dzZXJFZGl0b3JJbnB1dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODllMDg3Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvc3JjL29yZy9lY2xpcHNlL3dlbGNvbWUvaW50ZXJuYWwvd2ViYnJvd3Nlci9XZWJCcm93c2VyRWRpdG9ySW5wdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud2VsY29tZS5pbnRlcm5hbC53ZWJicm93c2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLio7Ci0vKioKLSAqIEEgc2ltcGxlIGVkaXRvciBpbnB1dCBmb3IgdGhlIHdlbGNvbWUgZWRpdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJCcm93c2VyRWRpdG9ySW5wdXQgaW1wbGVtZW50cyBJRWRpdG9ySW5wdXQgewotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBGQUNUT1JZX0lEID0gIm9yZy5lY2xpcHNlLndlbGNvbWUuaW50ZXJuYWwud2ViYnJvd3Nlci5XZWJCcm93c2VyRWRpdG9ySW5wdXRGYWN0b3J5IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgU3RyaW5nIHVybDsKLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCS8qKgotCSAqIFdlbGNvbWVFZGl0b3JJbnB1dCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBXZWJCcm93c2VyRWRpdG9ySW5wdXQoU3RyaW5nIG5hbWUsIFN0cmluZyB1cmwpIHsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy51cmwgPSB1cmw7Ci0JfQotCXB1YmxpYyBib29sZWFuIGV4aXN0cygpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldFVSTCgpIHsKLQkJcmV0dXJuIHVybDsKLQl9Ci0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaj09bnVsbCkgcmV0dXJuIGZhbHNlOwotCQlpZiAob2JqID09IHRoaXMpIHJldHVybiB0cnVlOwotCQlpZiAob2JqIGluc3RhbmNlb2YgV2ViQnJvd3NlckVkaXRvcklucHV0KSB7Ci0JCQlXZWJCcm93c2VyRWRpdG9ySW5wdXQgd29iaiA9IChXZWJCcm93c2VyRWRpdG9ySW5wdXQpb2JqOwotCQkJcmV0dXJuIHdvYmouZ2V0VVJMKCkuZXF1YWxzKGdldFVSTCgpKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCXB1YmxpYyBJUGVyc2lzdGFibGVFbGVtZW50IGdldFBlcnNpc3RhYmxlKCkgewotCQlyZXR1cm4gbmV3IElQZXJzaXN0YWJsZUVsZW1lbnQoKSB7Ci0JCQlwdWJsaWMgU3RyaW5nIGdldEZhY3RvcnlJZCgpIHsKLQkJCQlyZXR1cm4gRkFDVE9SWV9JRDsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHNhdmVTdGF0ZShJTWVtZW50byBtZW1lbnRvKSB7Ci0JCQkJbWVtZW50by5wdXRTdHJpbmcoIm5hbWUiLCBuYW1lKTsKLQkJCQltZW1lbnRvLnB1dFN0cmluZygidXJsIiwgdXJsKTsKLQkJCX0KLQkJfTsKLQl9Ci0JcHVibGljIFN0cmluZyBnZXRUb29sVGlwVGV4dCgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvd2VsY29tZS9pbnRlcm5hbC93ZWJicm93c2VyL1dlYkJyb3dzZXJFZGl0b3JJbnB1dEZhY3RvcnkuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvc3JjL29yZy9lY2xpcHNlL3dlbGNvbWUvaW50ZXJuYWwvd2ViYnJvd3Nlci9XZWJCcm93c2VyRWRpdG9ySW5wdXRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0ODA1NWYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvd2VsY29tZS9pbnRlcm5hbC93ZWJicm93c2VyL1dlYkJyb3dzZXJFZGl0b3JJbnB1dEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud2VsY29tZS5pbnRlcm5hbC53ZWJicm93c2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWxlbWVudEZhY3Rvcnk7Ci0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgV2ViQnJvd3NlckVkaXRvcklucHV0RmFjdG9yeSBpbXBsZW1lbnRzIElFbGVtZW50RmFjdG9yeSB7Ci0JLyoqCi0JICovCi0JcHVibGljIFdlYkJyb3dzZXJFZGl0b3JJbnB1dEZhY3RvcnkoKSB7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklFbGVtZW50RmFjdG9yeSNjcmVhdGVFbGVtZW50KG9yZy5lY2xpcHNlLnVpLklNZW1lbnRvKQotCSAqLwotCXB1YmxpYyBJQWRhcHRhYmxlIGNyZWF0ZUVsZW1lbnQoSU1lbWVudG8gbWVtZW50bykgewotCQlTdHJpbmcgbmFtZSA9IG1lbWVudG8uZ2V0U3RyaW5nKCJuYW1lIik7Ci0JCVN0cmluZyB1cmwgPSBtZW1lbnRvLmdldFN0cmluZygidXJsIik7Ci0JCXJldHVybiBuZXcgV2ViQnJvd3NlckVkaXRvcklucHV0KG5hbWUsIHVybCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLy5jbGFzc3BhdGggYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxMjUzMWQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InZhciIgcGF0aD0iSlJFX0xJQiIgcm9vdHBhdGg9IkpSRV9TUkNST09UIiBzb3VyY2VwYXRoPSJKUkVfU1JDIi8+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InZhciIKLSAgICAgICAgcGF0aD0iRUNMSVBTRV9IT01FL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29yZS5ib290L2Jvb3QuamFyIiBzb3VyY2VwYXRoPSJFQ0xJUFNFX0hPTUUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb3JlLmJvb3QvYm9vdHNyYy56aXAiLz4KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0idmFyIgotICAgICAgICBwYXRoPSJFQ0xJUFNFX0hPTUUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvcnVudGltZS5qYXIiIHNvdXJjZXBhdGg9IkVDTElQU0VfSE9NRS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS9ydW50aW1lc3JjLnppcCIvPgotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJ2YXIiCi0gICAgICAgIHBhdGg9IkVDTElQU0VfSE9NRS9wbHVnaW5zL29yZy5lY2xpcHNlLnN3dC9zd3QuamFyIiBzb3VyY2VwYXRoPSJFQ0xJUFNFX0hPTUUvcGx1Z2lucy9vcmcuZWNsaXBzZS5zd3Qvc3d0c3JjLnppcCIvPgotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJ2YXIiCi0gICAgICAgIHBhdGg9IkVDTElQU0VfSE9NRS9wbHVnaW5zL29yZy5lY2xpcHNlLnVpL3dvcmtiZW5jaC5qYXIiIHNvdXJjZXBhdGg9IkVDTElQU0VfSE9NRS9wbHVnaW5zL29yZy5lY2xpcHNlLnVpL3dvcmtiZW5jaHNyYy56aXAiLz4KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0idmFyIiBwYXRoPSJFQ0xJUFNFX0hPTUUvcGx1Z2lucy9vcmcuZWNsaXBzZS53ZWJkYXYvd2ViZGF2LmphciIvPgotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLy5jdnNpZ25vcmUgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1ZTgyZDcuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS8ucHJvamVjdCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1NjBmNzYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnVwZGF0ZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvLnZjbV9tZXRhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS8udmNtX21ldGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2NTVmOGQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS8udmNtX21ldGEKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHByb2plY3QtZGVzY3JpcHRpb24+DQotCTxjb21tZW50PjwvY29tbWVudD4NCi0JPG5hdHVyZSBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZSIvPg0KLQk8YnVpbGRlciBuYW1lPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlciI+DQotCTwvYnVpbGRlcj4NCi08L3Byb2plY3QtZGVzY3JpcHRpb24+DQo=