ZGlmZiAtLWdpdCBhL2NvbnRyaWIvLmN2c2lnbm9yZSBiL2NvbnRyaWIvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjAyMDUzZC4uMDAwMDAwMAotLS0gYS9jb250cmliLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLWNsYXNzZXMNCi0qLmxvZw0KLXRhcmdldA0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvYnVpbGQueG1sIGIvY29udHJpYi9idWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1MzM3ZDcuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9idWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0gJElkJCAtLT4KLTxwcm9qZWN0IG5hbWU9IlRhcGVzdHJ5IENvbnRyaWIgRnJhbWV3b3JrIiBkZWZhdWx0PSJpbnN0YWxsIj4KLQk8cHJvcGVydHkgbmFtZT0icm9vdC5kaXIiIHZhbHVlPSIuLiIvPgotCTxwcm9wZXJ0eSBmaWxlPSIke3Jvb3QuZGlyfS9jb25maWcvVmVyc2lvbi5wcm9wZXJ0aWVzIi8+Ci0JPHByb3BlcnR5IGZpbGU9IiR7cm9vdC5kaXJ9L2NvbmZpZy9idWlsZC5wcm9wZXJ0aWVzIi8+Ci0JPHByb3BlcnR5IGZpbGU9IiR7cm9vdC5kaXJ9L2NvbmZpZy9jb21tb24ucHJvcGVydGllcyIvPgotCTxwYXRoIGlkPSJqZXR0eS5jbGFzc3BhdGgiPgotCQk8ZmlsZXNldCBkaXI9IiR7amV0dHkuZGlyfSI+Ci0JCQk8aW5jbHVkZSBuYW1lPSIqKi9qYXZheC4qLmphciIvPgotCQk8L2ZpbGVzZXQ+Ci0JPC9wYXRoPgotCTxwYXRoIGlkPSJwcm9qZWN0LmNsYXNzcGF0aCI+Ci0JCTxmaWxlc2V0IGRpcj0iJHtyb290LmxpYi5kaXJ9Ij4KLQkJCTxpbmNsdWRlIG5hbWU9IiR7ZnJhbWV3b3JrLmphcn0iLz4KLQkJCTxpbmNsdWRlIG5hbWU9IiR7ZXh0LmRpcn0vKi5qYXIiLz4KLQkJCTxpbmNsdWRlIG5hbWU9IiR7ajJlZS5kaXJ9LyouamFyIi8+Ci0JCTwvZmlsZXNldD4KLQk8L3BhdGg+Ci0JPHRhcmdldCBuYW1lPSJpbml0Ij4KLQkJPG1rZGlyIGRpcj0iJHtjbGFzc2VzLmRpcn0iLz4KLQk8L3RhcmdldD4KLQk8dGFyZ2V0IG5hbWU9ImNsZWFuIj4KLQkJPGRlbGV0ZSBkaXI9IiR7Y2xhc3Nlcy5kaXJ9Ii8+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9ImNvbXBpbGUiIGRlcGVuZHM9ImluaXQiCi0JCWRlc2NyaXB0aW9uPSJDb21waWxlIGFsbCBjbGFzc2VzIGluIHRoZSBmcmFtZXdvcmsuIj4KLQkJPGphdmFjIHNyY2Rpcj0iJHtzcmMuZGlyfSIgZGVzdGRpcj0iJHtjbGFzc2VzLmRpcn0iIGRlYnVnPSJvbiIKLQkJCXRhcmdldD0iMS4xIiBzb3VyY2U9IjEuMyI+Ci0JCQk8Y2xhc3NwYXRoIHJlZmlkPSJwcm9qZWN0LmNsYXNzcGF0aCIvPgotCQk8L2phdmFjPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJpbnN0YWxsIiBkZXBlbmRzPSJjb21waWxlIgotCQlkZXNjcmlwdGlvbj0iQ29tcGlsZSBhbGwgY2xhc3NlcyBhbmQgYnVpbGQgdGhlIGluc3RhbGxlZCBKQVIgaW5jbHVkaW5nIGFsbCBwYWNrYWdlIHJlc291cmNlcy4iCi0JCT4KLQkJPGphciBqYXJmaWxlPSIke3Jvb3QubGliLmRpcn0vJHtjb250cmliLmphcn0iPgotCQkJPGZpbGVzZXQgZGlyPSIke2NsYXNzZXMuZGlyfSIvPgotCQkJPGZpbGVzZXQgZGlyPSIke3NyYy5kaXJ9Ij4KLQkJCQk8ZXhjbHVkZSBuYW1lPSIqKi8qLmphdmEiLz4KLQkJCQk8ZXhjbHVkZSBuYW1lPSIqKi9wYWNrYWdlLmh0bWwiLz4KLQkJCTwvZmlsZXNldD4KLQkJPC9qYXI+Ci0JPC90YXJnZXQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvQ29udHJpYi5saWJyYXJ5IGIvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL0NvbnRyaWIubGlicmFyeQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI1YjgxMy4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvQ29udHJpYi5saWJyYXJ5CisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAgCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPCEtLSAkSWQkIC0tPgotPCFET0NUWVBFIGxpYnJhcnktc3BlY2lmaWNhdGlvbiBQVUJMSUMgCi0gICItLy9BcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi8vVGFwZXN0cnkgU3BlY2lmaWNhdGlvbiAzLjAvL0VOIiAKLSAgImh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvdGFwZXN0cnkvZHRkL1RhcGVzdHJ5XzNfMC5kdGQiPgotCQotPGxpYnJhcnktc3BlY2lmaWNhdGlvbj4KLQotICA8Y29tcG9uZW50LXR5cGUgdHlwZT0iSW5zcGVjdG9yQnV0dG9uIiBzcGVjaWZpY2F0aW9uLXBhdGg9Imluc3BlY3Rvci9JbnNwZWN0b3JCdXR0b24uandjIi8+Ci0gIDxwYWdlIG5hbWU9Ikluc3BlY3RvciIgc3BlY2lmaWNhdGlvbi1wYXRoPSJpbnNwZWN0b3IvSW5zcGVjdG9yLnBhZ2UiLz4KLQotICA8bGlicmFyeSBpZD0iaW5zcGVjdG9yIiBzcGVjaWZpY2F0aW9uLXBhdGg9Imluc3BlY3Rvci9JbnNwZWN0b3IubGlicmFyeSIvPgotCi0gIDxjb21wb25lbnQtdHlwZSB0eXBlPSJDaG9vc2UiIHNwZWNpZmljYXRpb24tcGF0aD0iY29tcG9uZW50cy9DaG9vc2UuandjIi8+Ci0gIDxjb21wb25lbnQtdHlwZSB0eXBlPSJXaGVuIiBzcGVjaWZpY2F0aW9uLXBhdGg9ImNvbXBvbmVudHMvV2hlbi5qd2MiLz4KLSAgPGNvbXBvbmVudC10eXBlIHR5cGU9Ik90aGVyd2lzZSIgc3BlY2lmaWNhdGlvbi1wYXRoPSJjb21wb25lbnRzL090aGVyd2lzZS5qd2MiLz4KLQotICA8Y29tcG9uZW50LXR5cGUgdHlwZT0iUGFsZXR0ZSIgc3BlY2lmaWNhdGlvbi1wYXRoPSJwYWxldHRlL1BhbGV0dGUuandjIi8+Ci0gIDxjb21wb25lbnQtdHlwZSB0eXBlPSJNdWx0aXBsZVByb3BlcnR5U2VsZWN0aW9uIiBzcGVjaWZpY2F0aW9uLXBhdGg9ImZvcm0vTXVsdGlwbGVQcm9wZXJ0eVNlbGVjdGlvbi5qd2MiLz4KLSAgPGNvbXBvbmVudC10eXBlIHR5cGU9IkRhdGVGaWVsZCIgc3BlY2lmaWNhdGlvbi1wYXRoPSJ2YWxpZC9EYXRlRmllbGQuandjIi8+Ci0gIDxjb21wb25lbnQtdHlwZSB0eXBlPSJNYXNrRWRpdCIgc3BlY2lmaWNhdGlvbi1wYXRoPSJmb3JtL01hc2tFZGl0Lmp3YyIvPgotICA8Y29tcG9uZW50LXR5cGUgdHlwZT0iTnVtZXJpY0ZpZWxkIiBzcGVjaWZpY2F0aW9uLXBhdGg9InZhbGlkL051bWVyaWNGaWVsZC5qd2MiLz4KLSAgPGNvbXBvbmVudC10eXBlIHR5cGU9IlZhbGlkYXRpbmdUZXh0RmllbGQiIHNwZWNpZmljYXRpb24tcGF0aD0idmFsaWQvVmFsaWRhdGluZ1RleHRGaWVsZC5qd2MiLz4KLSAgPGNvbXBvbmVudC10eXBlIHR5cGU9IkZvcm1Db25kaXRpb25hbCIgc3BlY2lmaWNhdGlvbi1wYXRoPSJmb3JtL0Zvcm1Db25kaXRpb25hbC5qd2MiLz4KLQotICA8Y29tcG9uZW50LXR5cGUgdHlwZT0iSW5oZXJpdEluZm9ybWFsQW55IiBzcGVjaWZpY2F0aW9uLXBhdGg9ImluZm9ybWFsL0luaGVyaXRJbmZvcm1hbEFueS5qd2MiLz4KLQotICA8Y29tcG9uZW50LXR5cGUgdHlwZT0iVGFibGUiIHNwZWNpZmljYXRpb24tcGF0aD0idGFibGUvY29tcG9uZW50cy9UYWJsZS5qd2MiLz4KLSAgPGNvbXBvbmVudC10eXBlIHR5cGU9IlRhYmxlQ29sdW1ucyIgc3BlY2lmaWNhdGlvbi1wYXRoPSJ0YWJsZS9jb21wb25lbnRzL1RhYmxlQ29sdW1ucy5qd2MiLz4KLSAgPGNvbXBvbmVudC10eXBlIHR5cGU9IlRhYmxlUGFnZXMiIHNwZWNpZmljYXRpb24tcGF0aD0idGFibGUvY29tcG9uZW50cy9UYWJsZVBhZ2VzLmp3YyIvPgotICA8Y29tcG9uZW50LXR5cGUgdHlwZT0iVGFibGVSb3dzIiBzcGVjaWZpY2F0aW9uLXBhdGg9InRhYmxlL2NvbXBvbmVudHMvVGFibGVSb3dzLmp3YyIvPgotICA8Y29tcG9uZW50LXR5cGUgdHlwZT0iVGFibGVWYWx1ZXMiIHNwZWNpZmljYXRpb24tcGF0aD0idGFibGUvY29tcG9uZW50cy9UYWJsZVZhbHVlcy5qd2MiLz4KLSAgPGNvbXBvbmVudC10eXBlIHR5cGU9IlRhYmxlVmlldyIgc3BlY2lmaWNhdGlvbi1wYXRoPSJ0YWJsZS9jb21wb25lbnRzL1RhYmxlVmlldy5qd2MiLz4KLSAgPGNvbXBvbmVudC10eXBlIHR5cGU9IkZvcm1UYWJsZSIgc3BlY2lmaWNhdGlvbi1wYXRoPSJ0YWJsZS9jb21wb25lbnRzL0Zvcm1UYWJsZS5qd2MiLz4KLSAgPGNvbXBvbmVudC10eXBlIHR5cGU9IlRhYmxlRm9ybVJvd3MiIHNwZWNpZmljYXRpb24tcGF0aD0idGFibGUvY29tcG9uZW50cy9UYWJsZUZvcm1Sb3dzLmp3YyIvPgotICA8Y29tcG9uZW50LXR5cGUgdHlwZT0iVGFibGVGb3JtUGFnZXMiIHNwZWNpZmljYXRpb24tcGF0aD0idGFibGUvY29tcG9uZW50cy9UYWJsZUZvcm1QYWdlcy5qd2MiLz4KLQotICA8cGFnZSBuYW1lPSJTaW1wbGVUYWJsZUNvbHVtblBhZ2UiIHNwZWNpZmljYXRpb24tcGF0aD0idGFibGUvY29tcG9uZW50cy9pbnNlcnRlZC9TaW1wbGVUYWJsZUNvbHVtblBhZ2UucGFnZSIvPgotICA8Y29tcG9uZW50LXR5cGUgdHlwZT0iU2ltcGxlVGFibGVDb2x1bW5Db21wb25lbnQiIHNwZWNpZmljYXRpb24tcGF0aD0idGFibGUvY29tcG9uZW50cy9pbnNlcnRlZC9TaW1wbGVUYWJsZUNvbHVtbkNvbXBvbmVudC5qd2MiLz4KLSAgPGNvbXBvbmVudC10eXBlIHR5cGU9IlNpbXBsZVRhYmxlQ29sdW1uRm9ybUNvbXBvbmVudCIgc3BlY2lmaWNhdGlvbi1wYXRoPSJ0YWJsZS9jb21wb25lbnRzL2luc2VydGVkL1NpbXBsZVRhYmxlQ29sdW1uRm9ybUNvbXBvbmVudC5qd2MiLz4KLQotICA8Y29tcG9uZW50LXR5cGUgdHlwZT0iUG9wdXBMaW5rIiBzcGVjaWZpY2F0aW9uLXBhdGg9InBvcHVwL1BvcHVwTGluay5qd2MiLz4KLQotICAgIDxjb21wb25lbnQtdHlwZSB0eXBlPSJUcmVlIgotICAgICAgICBzcGVjaWZpY2F0aW9uLXBhdGg9Ii9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdHJlZS9jb21wb25lbnRzL1RyZWUuandjIi8+Ci0gICAgPGNvbXBvbmVudC10eXBlIHR5cGU9IlRyZWVEYXRhVmlldyIKLSAgICAgICAgc3BlY2lmaWNhdGlvbi1wYXRoPSIvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RyZWUvY29tcG9uZW50cy9UcmVlRGF0YVZpZXcuandjIi8+Ci0gICAgPGNvbXBvbmVudC10eXBlIHR5cGU9IlRyZWVOb2RlVmlldyIKLSAgICAgICAgc3BlY2lmaWNhdGlvbi1wYXRoPSIvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RyZWUvY29tcG9uZW50cy9UcmVlTm9kZVZpZXcuandjIi8+Ci0gICAgPGNvbXBvbmVudC10eXBlIHR5cGU9IlRyZWVWaWV3IgotICAgICAgICBzcGVjaWZpY2F0aW9uLXBhdGg9Ii9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdHJlZS9jb21wb25lbnRzL1RyZWVWaWV3Lmp3YyIvPgotICAgIDxjb21wb25lbnQtdHlwZSB0eXBlPSJUcmVlVGFibGVEYXRhVmlldyIKLSAgICAgICAgc3BlY2lmaWNhdGlvbi1wYXRoPSIvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RyZWUvY29tcG9uZW50cy90YWJsZS9UcmVlVGFibGVEYXRhVmlldy5qd2MiLz4KLSAgICA8Y29tcG9uZW50LXR5cGUgdHlwZT0iVHJlZVRhYmxlIgotICAgICAgICBzcGVjaWZpY2F0aW9uLXBhdGg9Ii9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdHJlZS9jb21wb25lbnRzL3RhYmxlL1RyZWVUYWJsZS5qd2MiLz4KLSAgICA8Y29tcG9uZW50LXR5cGUgdHlwZT0iVHJlZVRhYmxlTm9kZVZpZXdEZWxlZ2F0b3IiCi0gICAgICAgIHNwZWNpZmljYXRpb24tcGF0aD0iL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90cmVlL2NvbXBvbmVudHMvdGFibGUvVHJlZVRhYmxlTm9kZVZpZXdEZWxlZ2F0b3IuandjIi8+Ci0gICAgPHBhZ2UgbmFtZT0iVHJlZU5vZGVWaWV3UGFnZSIgc3BlY2lmaWNhdGlvbi1wYXRoPSIvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RyZWUvY29tcG9uZW50cy9UcmVlTm9kZVZpZXdQYWdlLnBhZ2UiLz4KLQotICAgIDxwYWdlIG5hbWU9IlRyZWVUYWJsZU5vZGVWaWV3UGFnZSIgc3BlY2lmaWNhdGlvbi1wYXRoPSIvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RyZWUvY29tcG9uZW50cy90YWJsZS9UcmVlVGFibGVOb2RlVmlld1BhZ2UucGFnZSIvPgotPC9saWJyYXJ5LXNwZWNpZmljYXRpb24+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL2NvbXBvbmVudHMvQ2hvb3NlLmphdmEgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvY29tcG9uZW50cy9DaG9vc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBjNDFmNC4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvY29tcG9uZW50cy9DaG9vc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIuY29tcG9uZW50czsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlbmRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZXF1ZXN0Q3ljbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5jb21wb25lbnRzLkNvbmRpdGlvbmFsOwotCi0vKioKLSAqICBUaGlzIGNvbXBvbmVudCBpcyBhIGNvbnRhaW5lciBmb3Ige0BsaW5rIFdoZW59IG9yIE90aGVyd2lzZSBjb21wb25lbnRzOwotICogIGl0IHByb3ZpZGVzIHRoZSBjb250ZXh0IGZvciBtdXR1YWxseSBleGNsdXNpdmUgY29uZGl0aW9uYWwgZXZhbHVhdGlvbi4KLSAqCi0gKiAgWzxhIGhyZWY9Ii4uLy4uLy4uLy4uLy4uLy4uL0NvbXBvbmVudFJlZmVyZW5jZS9jb250cmliLkNob29zZS5odG1sIj5Db21wb25lbnQgUmVmZXJlbmNlPC9hPl0KLSAqCi0gKiAgQGF1dGhvciBEYXZpZCBTb2xpcwotICogIEB2ZXJzaW9uICRJZCQKLSAqIAotICoqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIENob29zZSBleHRlbmRzIENvbmRpdGlvbmFsIHsKLQotCi0JcHVibGljIHZvaWQgYWRkQm9keShJUmVuZGVyIGVsZW1lbnQpCi0JewotCQlzdXBlci5hZGRCb2R5KGVsZW1lbnQpOwotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFdoZW4pCi0JCQkoKFdoZW4pIGVsZW1lbnQpLnNldENob29zZSh0aGlzKTsJCi0JfQotCQotCXByb3RlY3RlZCB2b2lkIGNsZWFudXBBZnRlclJlbmRlcihJUmVxdWVzdEN5Y2xlIGN5Y2xlKQotCXsKLQkJc2V0Q29uZGl0aW9uTWV0KGZhbHNlKTsKLQkJc3VwZXIuY2xlYW51cEFmdGVyUmVuZGVyKGN5Y2xlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gZXZhbHVhdGVDb25kaXRpb24oKQotCXsKLQkJcmV0dXJuIGdldENvbmRpdGlvbigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldEludmVydCgpCi0JewotCQkvLyBUaGlzIGNvbXBvbmVudCBkb2Vzbid0IHJlcXVpcmUgaW52ZXJ0IHBhcmFtZXRlci4KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGdldENvbmRpdGlvbigpOwotCQotCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzQ29uZGl0aW9uTWV0KCk7Ci0JcHVibGljIGFic3RyYWN0IHZvaWQgc2V0Q29uZGl0aW9uTWV0KGJvb2xlYW4gdmFsdWUpOwotfQpkaWZmIC0tZ2l0IGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL2NvbXBvbmVudHMvQ2hvb3NlLmp3YyBiL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9jb21wb25lbnRzL0Nob29zZS5qd2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzYTUyMmMuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL2NvbXBvbmVudHMvQ2hvb3NlLmp3YworKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAgCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPCEtLSAkSWQkIC0tPgotPCFET0NUWVBFIGNvbXBvbmVudC1zcGVjaWZpY2F0aW9uIFBVQkxJQyAKLSAgIi0vL0FwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLy9UYXBlc3RyeSBTcGVjaWZpY2F0aW9uIDMuMC8vRU4iIAotICAiaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy90YXBlc3RyeS9kdGQvVGFwZXN0cnlfM18wLmR0ZCI+Ci0gIAotPGNvbXBvbmVudC1zcGVjaWZpY2F0aW9uIGNsYXNzPSJvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIuY29tcG9uZW50cy5DaG9vc2UiPgotCi0gIDxkZXNjcmlwdGlvbj4KLSAgUHJvdmlkZXMgdGhlIGNvbnRleHQgZm9yIG11dHVhbGx5IGV4Y2x1c2l2ZSBjb25kaXRpb25hbCBldmFsdWF0aW9uLgotICA8L2Rlc2NyaXB0aW9uPgotCi0gIDxwYXJhbWV0ZXIgbmFtZT0iY29uZGl0aW9uIiB0eXBlPSJib29sZWFuIiBkaXJlY3Rpb249ImluIiBkZWZhdWx0LXZhbHVlPSJ0cnVlIj4KLSAgICA8ZGVzY3JpcHRpb24+Ci0gICAgVGhlIGNvbmRpdGlvbiB0byBldmFsdWF0ZS4KLSAgICA8L2Rlc2NyaXB0aW9uPgotICA8L3BhcmFtZXRlcj4KLQotICA8cGFyYW1ldGVyIG5hbWU9ImVsZW1lbnQiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciIGRpcmVjdGlvbj0iaW4iPgotICAJPGRlc2NyaXB0aW9uPgotICAJVGhlIGVsZW1lbnQgdG8gZW11bGF0ZS4KLSAgCTwvZGVzY3JpcHRpb24+Ci0gIDwvcGFyYW1ldGVyPgotCi0gIDxyZXNlcnZlZC1wYXJhbWV0ZXIgbmFtZT0iaW52ZXJ0Ii8+Ci0gIAotICA8cHJvcGVydHktc3BlY2lmaWNhdGlvbiBuYW1lPSJjb25kaXRpb25NZXQiIHR5cGU9ImJvb2xlYW4iIGluaXRpYWwtdmFsdWU9ImZhbHNlIi8+Ci0gIAotPC9jb21wb25lbnQtc3BlY2lmaWNhdGlvbj4KZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9jb21wb25lbnRzL090aGVyd2lzZS5qd2MgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvY29tcG9uZW50cy9PdGhlcndpc2UuandjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmViNGY5Li4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9jb21wb25lbnRzL090aGVyd2lzZS5qd2MKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gIAotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTwhLS0gJElkJCAtLT4KLTwhRE9DVFlQRSBjb21wb25lbnQtc3BlY2lmaWNhdGlvbiBQVUJMSUMgCi0gICItLy9BcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi8vVGFwZXN0cnkgU3BlY2lmaWNhdGlvbiAzLjAvL0VOIiAKLSAgImh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvdGFwZXN0cnkvZHRkL1RhcGVzdHJ5XzNfMC5kdGQiPgotICAKLTxjb21wb25lbnQtc3BlY2lmaWNhdGlvbiBjbGFzcz0ib3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLmNvbXBvbmVudHMuV2hlbiI+Ci0gIDxkZXNjcmlwdGlvbj4KLSAgT3RoZXJ3aXNlIGlzIGp1c3QgYSBXaGVuIGNvbXBvbmVudCB0aGF0IGFsd2F5cyB0cmllcyB0byByZW5kZXIgaXRzIGJvZHkgYW5kL29yIGVtdWxhdGUgYW4gZWxlbWVudCAKLSAgYW5kIGl0cyBhdHRyaWJ1dGVzIChpZiBlbGVtZW50IGlzIHNwZWNpZmllZCkgLgotICA8L2Rlc2NyaXB0aW9uPgotICAKLSAgPHBhcmFtZXRlciBuYW1lPSJlbGVtZW50IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIiBkaXJlY3Rpb249ImluIj4KLSAgCTxkZXNjcmlwdGlvbj4KLSAgCVRoZSBlbGVtZW50IHRvIGVtdWxhdGUuCi0gIAk8L2Rlc2NyaXB0aW9uPgotICA8L3BhcmFtZXRlcj4KLQotICA8cmVzZXJ2ZWQtcGFyYW1ldGVyIG5hbWU9ImNvbmRpdGlvbiIvPgotCi0gIDxyZXNlcnZlZC1wYXJhbWV0ZXIgbmFtZT0iaW52ZXJ0Ii8+Ci0KLSAgPHByb3BlcnR5LXNwZWNpZmljYXRpb24gbmFtZT0iY29uZGl0aW9uIiB0eXBlPSJib29sZWFuIiBpbml0aWFsLXZhbHVlPSJ0cnVlIi8+Ci0gIAotPC9jb21wb25lbnQtc3BlY2lmaWNhdGlvbj4KZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9jb21wb25lbnRzL1doZW4uamF2YSBiL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9jb21wb25lbnRzL1doZW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJjYzNmYS4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvY29tcG9uZW50cy9XaGVuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLmNvbXBvbmVudHM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LkFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklNYXJrdXBXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVxdWVzdEN5Y2xlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuVGFwZXN0cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5jb21wb25lbnRzLkNvbmRpdGlvbmFsOwotCi0vKioKLSAqICBSZXByZXNlbnRzIGFuIGFsdGVybmF0aXZlIHdoaXRoaW4gYSB7QGxpbmsgQ2hvb3NlfSBjb21wb25lbnQuIAotICogIFRoZSBkZWZhdWx0IGFsdGVybmF0aXZlIGlzIGRlc2NyaWJlZCBieSB0aGUgT3RoZXJ3aXNlIGNvbXBvbmVudC4KLSAqCi0gKiAgWzxhIGhyZWY9Ii4uLy4uLy4uLy4uLy4uLy4uL0NvbXBvbmVudFJlZmVyZW5jZS9jb250cmliLldoZW4uaHRtbCI+Q29tcG9uZW50IFJlZmVyZW5jZTwvYT5dCi0gKgotICogIEBhdXRob3IgRGF2aWQgU29saXMKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAKLSAqKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBXaGVuIGV4dGVuZHMgQ29uZGl0aW9uYWwKLXsKLSAgICAvKiogUGFyZW50IG9mIHRoaXMgY29tcG9uZW50LiAqLwotCi0gICAgcHJpdmF0ZSBDaG9vc2UgX2Nob29zZTsKLQotICAgIC8qKgotICAgICAqICBSZW5kZXJzIGl0cyB3cmFwcGVkIGNvbXBvbmVudHMgb25seSBpZiB0aGUgY29uZGl0aW9uIGlzIHRydWUgYW5kIGl0cyBwYXJlbnQge0BsaW5rIENob29zZX0KLSAgICAgKiAgYWxsb3dzIGl0LiBJbiBhZGRpdGlvbiwgaWYgZWxlbWVudCBpcyBzcGVjaWZpZWQsIGNhbiBlbXVsYXRlIHRoYXQgSFRNTCBlbGVtZW50LgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVuZGVyQ29tcG9uZW50KElNYXJrdXBXcml0ZXIgd3JpdGVyLCBJUmVxdWVzdEN5Y2xlIGN5Y2xlKQotICAgIHsKLSAgICAgICAgQ2hvb3NlIGNob29zZSA9IGdldENob29zZSgpOwotCi0gICAgICAgIGlmIChjaG9vc2UgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgVGFwZXN0cnkuZ2V0TWVzc2FnZSgiV2hlbi5tdXN0LWJlLWNvbnRhaW5lZC1ieS1jaG9vc2UiKSwKLSAgICAgICAgICAgICAgICB0aGlzLAotICAgICAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAgICAgbnVsbCk7Ci0KLSAgICAgICAgaWYgKCFjaG9vc2UuaXNDb25kaXRpb25NZXQoKSAmJiBnZXRDb25kaXRpb24oKSkKLSAgICAgICAgewotICAgICAgICAgICAgY2hvb3NlLnNldENvbmRpdGlvbk1ldCh0cnVlKTsKLSAgICAgICAgICAgIHN1cGVyLnJlbmRlckNvbXBvbmVudCh3cml0ZXIsIGN5Y2xlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIGV2YWx1YXRlQ29uZGl0aW9uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGdldEludmVydCgpCi0gICAgewotICAgICAgICAvLyBUaGlzIGNvbXBvbmVudCBkb2Vzbid0IHJlcXVpcmUgaW52ZXJ0IHBhcmFtZXRlci4KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBAcmV0dXJuIENob29zZQotICAgICAqLwotICAgIHB1YmxpYyBDaG9vc2UgZ2V0Q2hvb3NlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfY2hvb3NlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBTZXRzIHRoZSBjaG9vc2UuCi0gICAgICogIEBwYXJhbSB2YWx1ZSBUaGUgY2hvb3NlIHRvIHNldAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENob29zZShDaG9vc2UgdmFsdWUpCi0gICAgewotICAgICAgICBfY2hvb3NlID0gdmFsdWU7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvY29tcG9uZW50cy9XaGVuLmp3YyBiL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9jb21wb25lbnRzL1doZW4uandjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTliN2E4Li4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9jb21wb25lbnRzL1doZW4uandjCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICAKLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08IS0tICRJZCQgLS0+Ci08IURPQ1RZUEUgY29tcG9uZW50LXNwZWNpZmljYXRpb24gUFVCTElDIAotICAiLS8vQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24vL1RhcGVzdHJ5IFNwZWNpZmljYXRpb24gMy4wLy9FTiIgCi0gICJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL3RhcGVzdHJ5L2R0ZC9UYXBlc3RyeV8zXzAuZHRkIj4KLSAgCi08Y29tcG9uZW50LXNwZWNpZmljYXRpb24gY2xhc3M9Im9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi5jb21wb25lbnRzLldoZW4iPgotICA8ZGVzY3JpcHRpb24+Ci0gIElmIHRoaXMgaXMgdGhlIGZpcnN0IFdoZW4gY29tcG9uZW50IHRvIGV2YWx1YXRlIHRvIHRydWUgd2l0aGluIENob29zZSB0aGVuIGVtdWxhdGVzIGFuIGVsZW1lbnQgCi0gIGFuZCBpdHMgYXR0cmlidXRlcyAoaWYgZWxlbWVudCBpcyBzcGVjaWZpZWQpIGFuZC9vciBpbmNsdWRlcyBhIGJsb2NrIG9mIGNvbnRlbnQuCi0gIDwvZGVzY3JpcHRpb24+Ci0gIAotICA8cGFyYW1ldGVyIG5hbWU9ImNvbmRpdGlvbiIgdHlwZT0iYm9vbGVhbiIgZGlyZWN0aW9uPSJpbiI+Ci0gICAgPGRlc2NyaXB0aW9uPgotICAgIFRoZSBjb25kaXRpb24gdG8gZXZhbHVhdGUuCi0gICAgPC9kZXNjcmlwdGlvbj4KLSAgPC9wYXJhbWV0ZXI+Ci0gIAotICA8cGFyYW1ldGVyIG5hbWU9ImVsZW1lbnQiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciIGRpcmVjdGlvbj0iaW4iPgotICAJPGRlc2NyaXB0aW9uPgotICAJVGhlIGVsZW1lbnQgdG8gZW11bGF0ZS4KLSAgCTwvZGVzY3JpcHRpb24+Ci0gIDwvcGFyYW1ldGVyPgotCi0gIDxyZXNlcnZlZC1wYXJhbWV0ZXIgbmFtZT0iaW52ZXJ0Ii8+Ci0gIAotPC9jb21wb25lbnQtc3BlY2lmaWNhdGlvbj4KZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9jb21wb25lbnRzL3BhY2thZ2UuaHRtbCBiL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9jb21wb25lbnRzL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRlOTY0OC4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvY29tcG9uZW50cy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi08IWRvY3R5cGUgaHRtbCBwdWJsaWMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotPCEtLSAkSWQkIC0tPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5UYXBlc3RyeTogV2ViIEFwcGxpY2F0aW9uIEZyYW1ld29yazwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLQotPHA+Q29udHJpYnV0aW9uIG9mIGZvdW5kYXRpb25hbCBjb21wb25lbnRzLgotCi1AYXV0aG9yIERhdmlkIFNvbGlzIDxhIGhyZWY9Im1haWx0bzpkc29saXNAYXBhY2hlLm9yZyI+ZHNvbGlzQGFwYWNoZS5vcmc8L2E+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9lamIvWENyZWF0ZUV4Y2VwdGlvbi5qYXZhIGIvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL2VqYi9YQ3JlYXRlRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlOGJiODYuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL2VqYi9YQ3JlYXRlRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLmVqYjsKLQotaW1wb3J0IGphdmF4LmVqYi5DcmVhdGVFeGNlcHRpb247Ci0KLS8qKgotICogIEV4dGVuZGVkIHZlcnNpb24gb2Yge0BsaW5rIENyZWF0ZUV4Y2VwdGlvbn0gdGhhdCBpbmNsdWRlcyBhIHJvb3QgY2F1c2UuCi0gKgotICogIEB2ZXJzaW9uICRJZCQKLSAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKgotICoqLwotCi1wdWJsaWMgY2xhc3MgWENyZWF0ZUV4Y2VwdGlvbiBleHRlbmRzIENyZWF0ZUV4Y2VwdGlvbgotewotICAgIHByaXZhdGUgVGhyb3dhYmxlIHJvb3RDYXVzZTsKLQotICAgIHB1YmxpYyBYQ3JlYXRlRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKQotICAgIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFhDcmVhdGVFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSByb290Q2F1c2UpCi0gICAgewotICAgICAgICBzdXBlcihtZXNzYWdlKTsKLQotICAgICAgICB0aGlzLnJvb3RDYXVzZSA9IHJvb3RDYXVzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgWENyZWF0ZUV4Y2VwdGlvbihUaHJvd2FibGUgcm9vdENhdXNlKQotICAgIHsKLSAgICAgICAgc3VwZXIocm9vdENhdXNlLmdldE1lc3NhZ2UoKSk7Ci0KLSAgICAgICAgdGhpcy5yb290Q2F1c2UgPSByb290Q2F1c2U7Ci0gICAgfQotCi0gICAgcHVibGljIFRocm93YWJsZSBnZXRSb290Q2F1c2UoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHJvb3RDYXVzZTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL2VqYi9YRUpCRXhjZXB0aW9uLmphdmEgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvZWpiL1hFSkJFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ5MmY0Yy4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvZWpiL1hFSkJFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIuZWpiOwotCi1pbXBvcnQgamF2YXguZWpiLkVKQkV4Y2VwdGlvbjsKLQotLyoqCi0gKiAgRXh0ZW5kZWQgdmVyc2lvbiBvZiB7QGxpbmsgRUpCRXhjZXB0aW9ufSB0aGF0IGluY2x1ZGVzIGEgcm9vdCBjYXVzZS4KLSAqICB7QGxpbmsgRUpCRXhjZXB0aW9ufSBkb2Vzbid0IGhhdmUgcXVpdGUgdGhlIHJpZ2h0IGNvbnN0cnVjdG9yIGZvciB0aGlzIC4uLgotICogIGl0IGhhcyBhbiBlcXVpdmFsZW50IHRvIHRoZSByb290Q2F1c2UgcHJvcGVydHksIChjYXVzZWRCeUV4Y2VwdGlvbiksIGJ1dAotICogIGRvZXNuJ3QgaGF2ZSBhIGNvbnN0cnVjdG9yIHRoYXQgYWxsb3dzIHVzIHRvIHNldCBhIGN1c3RvbSBtZXNzYWdlLgotICoKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICoKLSAqKi8KLQotcHVibGljIGNsYXNzIFhFSkJFeGNlcHRpb24gZXh0ZW5kcyBFSkJFeGNlcHRpb24KLXsKLSAgICBwcml2YXRlIFRocm93YWJsZSByb290Q2F1c2U7Ci0KLSAgICBwdWJsaWMgWEVKQkV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkKLSAgICB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBYRUpCRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgcm9vdENhdXNlKQotICAgIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSk7Ci0KLSAgICAgICAgdGhpcy5yb290Q2F1c2UgPSByb290Q2F1c2U7Ci0gICAgfQotCi0gICAgcHVibGljIFhFSkJFeGNlcHRpb24oVGhyb3dhYmxlIHJvb3RDYXVzZSkKLSAgICB7Ci0gICAgICAgIHN1cGVyKHJvb3RDYXVzZS5nZXRNZXNzYWdlKCkpOwotCi0gICAgICAgIHRoaXMucm9vdENhdXNlID0gcm9vdENhdXNlOwotICAgIH0KLQotICAgIHB1YmxpYyBUaHJvd2FibGUgZ2V0Um9vdENhdXNlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiByb290Q2F1c2U7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9lamIvWEZpbmRlckV4Y2VwdGlvbi5qYXZhIGIvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL2VqYi9YRmluZGVyRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzNDBlZTguLjAwMDAwMDAKLS0tIGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL2VqYi9YRmluZGVyRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLmVqYjsKLQotaW1wb3J0IGphdmF4LmVqYi5GaW5kZXJFeGNlcHRpb247Ci0KLS8qKgotICogIEV4dGVuZGVkIHZlcnNpb24gb2Yge0BsaW5rIEZpbmRlckV4Y2VwdGlvbn0gdGhhdCBpbmNsdWRlcyBhIHJvb3QgY2F1c2UuCi0gKgotICogIEB2ZXJzaW9uICRJZCQKLSAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKgotICoqLwotCi1wdWJsaWMgY2xhc3MgWEZpbmRlckV4Y2VwdGlvbiBleHRlbmRzIEZpbmRlckV4Y2VwdGlvbgotewotICAgIHByaXZhdGUgVGhyb3dhYmxlIHJvb3RDYXVzZTsKLQotICAgIHB1YmxpYyBYRmluZGVyRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKQotICAgIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFhGaW5kZXJFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSByb290Q2F1c2UpCi0gICAgewotICAgICAgICBzdXBlcihtZXNzYWdlKTsKLQotICAgICAgICB0aGlzLnJvb3RDYXVzZSA9IHJvb3RDYXVzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgWEZpbmRlckV4Y2VwdGlvbihUaHJvd2FibGUgcm9vdENhdXNlKQotICAgIHsKLSAgICAgICAgc3VwZXIocm9vdENhdXNlLmdldE1lc3NhZ2UoKSk7Ci0KLSAgICAgICAgdGhpcy5yb290Q2F1c2UgPSByb290Q2F1c2U7Ci0gICAgfQotCi0gICAgcHVibGljIFRocm93YWJsZSBnZXRSb290Q2F1c2UoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHJvb3RDYXVzZTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL2VqYi9YUmVtb3ZlRXhjZXB0aW9uLmphdmEgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvZWpiL1hSZW1vdmVFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJiMDEzMi4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvZWpiL1hSZW1vdmVFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIuZWpiOwotCi1pbXBvcnQgamF2YXguZWpiLlJlbW92ZUV4Y2VwdGlvbjsKLQotLyoqCi0gKiAgRXh0ZW5kZWQgdmVyc2lvbiBvZiB7QGxpbmsgUmVtb3ZlRXhjZXB0aW9ufSB0aGF0IGluY2x1ZGVzIGEgcm9vdCBjYXVzZS4KLSAqCi0gKiAgQHZlcnNpb24gJElkJAotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqCi0gKiovCi0KLXB1YmxpYyBjbGFzcyBYUmVtb3ZlRXhjZXB0aW9uIGV4dGVuZHMgUmVtb3ZlRXhjZXB0aW9uCi17Ci0gICAgcHJpdmF0ZSBUaHJvd2FibGUgcm9vdENhdXNlOwotCi0gICAgcHVibGljIFhSZW1vdmVFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpCi0gICAgewotICAgICAgICBzdXBlcihtZXNzYWdlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgWFJlbW92ZUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIHJvb3RDYXVzZSkKLSAgICB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UpOwotCi0gICAgICAgIHRoaXMucm9vdENhdXNlID0gcm9vdENhdXNlOwotICAgIH0KLQotICAgIHB1YmxpYyBYUmVtb3ZlRXhjZXB0aW9uKFRocm93YWJsZSByb290Q2F1c2UpCi0gICAgewotICAgICAgICBzdXBlcihyb290Q2F1c2UuZ2V0TWVzc2FnZSgpKTsKLQotICAgICAgICB0aGlzLnJvb3RDYXVzZSA9IHJvb3RDYXVzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVGhyb3dhYmxlIGdldFJvb3RDYXVzZSgpCi0gICAgewotICAgICAgICByZXR1cm4gcm9vdENhdXNlOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvZWpiL3BhY2thZ2UuaHRtbCBiL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9lamIvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTBmYmZiLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9lamIvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLTwhLS0gJElkJCAtLT4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+VGFwZXN0cnk6IFdlYiBBcHBsaWNhdGlvbiBGcmFtZXdvcms8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci0KLTxwPlN1YmNsYXNzZXMgb2YgdGhlIEVKQiBleGNlcHRpb25zIHRoYXQgdGFrZSBhbiBvcHRpb25hbCwgYWRkaXRpb25hbCwgcm9vdCBjYXVzZSBUaHJvd2FibGUKLXRvIGlkZW50aWZ5IHRoZSB1bmRlcmx5aW5nIHJlYXNvbiBmb3IgdGhlIGV4Y2VwdGlvbi4gIFRoaXMgaXMgbGVzcyBuZWNlc3NhcnkgaW4gSkRLIDEuNCwgd2hpY2gKLXN1cHBvcnQgcm9vdCBjYXVzZSBmb3IgYWxsIGV4Y2VwdGlvbnMuCi0KLUBhdXRob3IgSG93YXJkIExld2lzIFNoaXAgPGEgaHJlZj0ibWFpbHRvOmhsc2hpcEBhcGFjaGUub3JnIj5obHNoaXBAYXBhY2hlLm9yZzwvYT4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL2Zvcm0vQ2hlY2tCb3hNdWx0aXBsZVByb3BlcnR5U2VsZWN0aW9uUmVuZGVyZXIuamF2YSBiL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9mb3JtL0NoZWNrQm94TXVsdGlwbGVQcm9wZXJ0eVNlbGVjdGlvblJlbmRlcmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2NjEwOTQuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL2Zvcm0vQ2hlY2tCb3hNdWx0aXBsZVByb3BlcnR5U2VsZWN0aW9uUmVuZGVyZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLmZvcm07Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklNYXJrdXBXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVxdWVzdEN5Y2xlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuZm9ybS5JUHJvcGVydHlTZWxlY3Rpb25Nb2RlbDsKLQotLyoqCi0gKiAgSW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIElNdWx0aXBsZVByb3BlcnR5U2VsZWN0aW9uUmVuZGVyZXJ9IHRoYXQKLSAqICBwcm9kdWNlcyBhIHRhYmxlIG9mIGNoZWNrYm94ICgmbHQ7aW5wdXQgdHlwZT1jaGVja2JveCZndDspIGVsZW1lbnRzLgotICoKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQGF1dGhvciBTYW5qYXkgTXVuamFsCi0gKgotICoqLwotCi1wdWJsaWMgY2xhc3MgQ2hlY2tCb3hNdWx0aXBsZVByb3BlcnR5U2VsZWN0aW9uUmVuZGVyZXIKLSAgICBpbXBsZW1lbnRzIElNdWx0aXBsZVByb3BlcnR5U2VsZWN0aW9uUmVuZGVyZXIKLXsKLQotICAgIC8qKgotICAgICAqICBXcml0ZXMgdGhlICZsdDt0YWJsZSZndDsgZWxlbWVudC4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIGJlZ2luUmVuZGVyKAotICAgICAgICBNdWx0aXBsZVByb3BlcnR5U2VsZWN0aW9uIGNvbXBvbmVudCwKLSAgICAgICAgSU1hcmt1cFdyaXRlciB3cml0ZXIsCi0gICAgICAgIElSZXF1ZXN0Q3ljbGUgY3ljbGUpCi0gICAgewotICAgICAgICB3cml0ZXIuYmVnaW4oInRhYmxlIik7Ci0gICAgICAgIHdyaXRlci5hdHRyaWJ1dGUoImJvcmRlciIsIDApOwotICAgICAgICB3cml0ZXIuYXR0cmlidXRlKCJjZWxscGFkZGluZyIsIDApOwotICAgICAgICB3cml0ZXIuYXR0cmlidXRlKCJjZWxsc3BhY2luZyIsIDIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBDbG9zZXMgdGhlICZsdDt0YWJsZSZndDsgZWxlbWVudC4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIGVuZFJlbmRlcigKLSAgICAgICAgTXVsdGlwbGVQcm9wZXJ0eVNlbGVjdGlvbiBjb21wb25lbnQsCi0gICAgICAgIElNYXJrdXBXcml0ZXIgd3JpdGVyLAotICAgICAgICBJUmVxdWVzdEN5Y2xlIGN5Y2xlKQotICAgIHsKLSAgICAgICAgd3JpdGVyLmVuZCgpOyAvLyA8dGFibGU+Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFdyaXRlcyBhIHJvdyBvZiB0aGUgdGFibGUuICBUaGUgdGFibGUgY29udGFpbnMgdHdvIGNlbGxzOyB0aGUgZmlyc3QgaXMgdGhlIGNoZWNrYm94LAotICAgICAqICB0aGUgc2Vjb25kIGlzIHRoZSBsYWJlbCBmb3IgdGhlIGNoZWNrYm94LgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgcmVuZGVyT3B0aW9uKAotICAgICAgICBNdWx0aXBsZVByb3BlcnR5U2VsZWN0aW9uIGNvbXBvbmVudCwKLSAgICAgICAgSU1hcmt1cFdyaXRlciB3cml0ZXIsCi0gICAgICAgIElSZXF1ZXN0Q3ljbGUgY3ljbGUsCi0gICAgICAgIElQcm9wZXJ0eVNlbGVjdGlvbk1vZGVsIG1vZGVsLAotICAgICAgICBPYmplY3Qgb3B0aW9uLAotICAgICAgICBpbnQgaW5kZXgsCi0gICAgICAgIGJvb2xlYW4gc2VsZWN0ZWQpCi0gICAgewotICAgICAgICB3cml0ZXIuYmVnaW4oInRyIik7Ci0gICAgICAgIHdyaXRlci5iZWdpbigidGQiKTsKLQotICAgICAgICB3cml0ZXIuYmVnaW5FbXB0eSgiaW5wdXQiKTsKLSAgICAgICAgd3JpdGVyLmF0dHJpYnV0ZSgidHlwZSIsICJjaGVja2JveCIpOwotICAgICAgICB3cml0ZXIuYXR0cmlidXRlKCJuYW1lIiwgY29tcG9uZW50LmdldE5hbWUoKSk7Ci0gICAgICAgIHdyaXRlci5hdHRyaWJ1dGUoInZhbHVlIiwgbW9kZWwuZ2V0VmFsdWUoaW5kZXgpKTsKLQotICAgICAgICBpZiAoY29tcG9uZW50LmlzRGlzYWJsZWQoKSkKLSAgICAgICAgICAgIHdyaXRlci5hdHRyaWJ1dGUoImRpc2FibGVkIiwgImRpc2FibGVkIik7Ci0KLSAgICAgICAgaWYgKHNlbGVjdGVkKQotICAgICAgICAgICAgd3JpdGVyLmF0dHJpYnV0ZSgiY2hlY2tlZCIsICJjaGVja2VkIik7Ci0KLSAgICAgICAgd3JpdGVyLmVuZCgpOyAvLyA8dGQ+Ci0KLSAgICAgICAgd3JpdGVyLnByaW50bG4oKTsKLQotICAgICAgICB3cml0ZXIuYmVnaW4oInRkIik7Ci0gICAgICAgIHdyaXRlci5wcmludChtb2RlbC5nZXRMYWJlbChpbmRleCkpOwotICAgICAgICB3cml0ZXIuZW5kKCk7IC8vIDx0ZD4KLSAgICAgICAgd3JpdGVyLmVuZCgpOyAvLyA8dHI+Ci0KLSAgICAgICAgd3JpdGVyLnByaW50bG4oKTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL2Zvcm0vRm9ybUNvbmRpdGlvbmFsLmphdmEgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvZm9ybS9Gb3JtQ29uZGl0aW9uYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc2ZmFkMC4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvZm9ybS9Gb3JtQ29uZGl0aW9uYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLmZvcm07Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5BcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JQWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JQmluZGluZzsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklGb3JtOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSU1hcmt1cFdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZXF1ZXN0Q3ljbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5UYXBlc3RyeTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmZvcm0uQWJzdHJhY3RGb3JtQ29tcG9uZW50OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkucmVxdWVzdC5SZXF1ZXN0Q29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnV0aWwuaW8uRGF0YVNxdWVlemVyOwotCi0vKioKLSAqICBBIGNvbmRpdGlvbmFsIGVsZW1lbnQgb24gYSBwYWdlIHdoaWNoIHdpbGwgcmVuZGVyIGl0cyB3cmFwcGVkIGVsZW1lbnRzCi0gKiAgemVybyBvciBvbmUgdGltZXMuCi0gKiAKLSAqIFRoaXMgY29tcG9uZW50IGlzIGEgdmFyaWFudCBvZiB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5jb21wb25lbnRzLkNvbmRpdGlvbmFsfSwgCi0gKiBidXQgaXMgZGVzaWduZWQgZm9yIG9wZXJhdGlvbiBpbiBhIGZvcm0uIFRoZSBjb21wb25lbnQgcGFyYW1ldGVycyBhcmUgc3RvcmVkIGluIAotICogaGlkZGVuIGZpZWxkcyBkdXJpbmcgcmVuZGVyaW5nIGFuZCBhcmUgdGFrZW4gZnJvbSB0aG9zZSBmaWVsZHMgZHVyaW5nIHRoZSByZXdpbmQsIAotICogdGh1cyBubyBTdGFsZUxpbmsgZXhjZXB0aW9ucyBvY2N1ci4gCi0gKgotICogIFs8YSBocmVmPSIuLi8uLi8uLi8uLi8uLi9Db21wb25lbnRSZWZlcmVuY2UvY29udHJpYi5Gb3JtQ29uZGl0aW9uYWwuaHRtbCI+Q29tcG9uZW50IFJlZmVyZW5jZTwvYT5dCi0gKgotICogIEBhdXRob3IgTWluZGJyaWRnZQotICogIEB2ZXJzaW9uICRJZCQKLSAqICBAc2luY2UgMy4wCi0gKiAKLSAqKi8KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEZvcm1Db25kaXRpb25hbCBleHRlbmRzIEFic3RyYWN0Rm9ybUNvbXBvbmVudAotewotCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVuZGVyQ29tcG9uZW50KElNYXJrdXBXcml0ZXIgd3JpdGVyLCBJUmVxdWVzdEN5Y2xlIGN5Y2xlKQotICAgIHsKLSAgICAgICAgSUZvcm0gZm9ybSA9IGdldEZvcm0oY3ljbGUpOwotCi0gICAgICAgIGJvb2xlYW4gY3ljbGVSZXdpbmRpbmcgPSBjeWNsZS5pc1Jld2luZGluZygpOwotCi0gICAgICAgIC8vIElmIHRoZSBjeWNsZSBpcyByZXdpbmRpbmcsIGJ1dCBub3QgdGhpcyBwYXJ0aWN1bGFyIGZvcm0sCi0gICAgICAgIC8vIHRoZW4gZG8gbm90aGluZyAoZG9uJ3QgZXZlbiByZW5kZXIgdGhlIGJvZHkpLgotCi0gICAgICAgIGlmIChjeWNsZVJld2luZGluZyAmJiAhZm9ybS5pc1Jld2luZGluZygpKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIFN0cmluZyBuYW1lID0gZm9ybS5nZXRFbGVtZW50SWQodGhpcyk7Ci0KLSAgICAgICAgYm9vbGVhbiBjb25kaXRpb24gPSBnZXRDb25kaXRpb24oY3ljbGUsIGZvcm0sIG5hbWUpOwotCi0gICAgICAgIC8vIGNhbGwgbGlzdGVuZXIKLSAgICAgICAgSUFjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gZ2V0TGlzdGVuZXIoKTsKLSAgICAgICAgaWYgKGxpc3RlbmVyICE9IG51bGwpCi0gICAgICAgICAgICBsaXN0ZW5lci5hY3Rpb25UcmlnZ2VyZWQodGhpcywgY3ljbGUpOwotCi0gICAgICAgIC8vIHJlbmRlciB0aGUgY29tcG9uZW50IGJvZHkgb25seSBpZiB0aGUgY29uZGl0aW9uIGlzIHRydWUKLSAgICAgICAgaWYgKGNvbmRpdGlvbikgewotICAgICAgICAgICAgU3RyaW5nIGVsZW1lbnQgPSBnZXRFbGVtZW50KCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGJvb2xlYW4gcmVuZGVyID0gIWN5Y2xlUmV3aW5kaW5nICYmIFRhcGVzdHJ5LmlzTm9uQmxhbmsoZWxlbWVudCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChyZW5kZXIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgd3JpdGVyLmJlZ2luKGVsZW1lbnQpOwotICAgICAgICAgICAgICAgIHJlbmRlckluZm9ybWFsUGFyYW1ldGVycyh3cml0ZXIsIGN5Y2xlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmVuZGVyQm9keSh3cml0ZXIsIGN5Y2xlKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHJlbmRlcikKLSAgICAgICAgICAgICAgICB3cml0ZXIuZW5kKGVsZW1lbnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGdldENvbmRpdGlvbihJUmVxdWVzdEN5Y2xlIGN5Y2xlLCBJRm9ybSBmb3JtLCBTdHJpbmcgbmFtZSkKLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gY29uZGl0aW9uOwotICAgICAgICAKLSAgICAgICAgaWYgKCFjeWNsZS5pc1Jld2luZGluZygpKQotICAgICAgICB7Ci0gICAgICAgICAgICBjb25kaXRpb24gPSBnZXRDb25kaXRpb24oKTsKLSAgICAgICAgICAgIHdyaXRlVmFsdWUoZm9ybSwgbmFtZSwgY29uZGl0aW9uKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIFJlcXVlc3RDb250ZXh0IGNvbnRleHQgPSBjeWNsZS5nZXRSZXF1ZXN0Q29udGV4dCgpOwotICAgICAgICAgICAgU3RyaW5nIHN1Ym1pdHRlZENvbmRpdGlvbnNbXSA9IGNvbnRleHQuZ2V0UGFyYW1ldGVycyhuYW1lKTsKLSAgICAgICAgICAgIGNvbmRpdGlvbiA9IGNvbnZlcnRWYWx1ZShzdWJtaXR0ZWRDb25kaXRpb25zWzBdKTsKLSAgICAgICAgfQotCi0gICAgICAgIElCaW5kaW5nIGNvbmRpdGlvblZhbHVlQmluZGluZyA9IGdldENvbmRpdGlvblZhbHVlQmluZGluZygpOwotICAgICAgICBpZiAgKGNvbmRpdGlvblZhbHVlQmluZGluZyAhPSBudWxsKSAKLSAgICAgICAgICAgIGNvbmRpdGlvblZhbHVlQmluZGluZy5zZXRCb29sZWFuKGNvbmRpdGlvbik7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gY29uZGl0aW9uOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB3cml0ZVZhbHVlKElGb3JtIGZvcm0sIFN0cmluZyBuYW1lLCBib29sZWFuIHZhbHVlKQotICAgIHsKLSAgICAgICAgU3RyaW5nIGV4dGVybmFsVmFsdWU7Ci0KLSAgICAgICAgT2JqZWN0IGJvb2xlYW5WYWx1ZSA9IG5ldyBCb29sZWFuKHZhbHVlKTsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGV4dGVybmFsVmFsdWUgPSBnZXREYXRhU3F1ZWV6ZXIoKS5zcXVlZXplKGJvb2xlYW5WYWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGV4KQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIFRhcGVzdHJ5LmZvcm1hdCgiRm9ybUNvbmRpdGlvbmFsLnVuYWJsZS10by1jb252ZXJ0LXZhbHVlIiwgYm9vbGVhblZhbHVlKSwKLSAgICAgICAgICAgICAgICB0aGlzLAotICAgICAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAgICAgZXgpOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9ybS5hZGRIaWRkZW5WYWx1ZShuYW1lLCBleHRlcm5hbFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gY29udmVydFZhbHVlKFN0cmluZyB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBPYmplY3QgYm9vbGVhblZhbHVlID0gZ2V0RGF0YVNxdWVlemVyKCkudW5zcXVlZXplKHZhbHVlKTsKLSAgICAgICAgICAgIHJldHVybiBUYXBlc3RyeS5ldmFsdWF0ZUJvb2xlYW4oYm9vbGVhblZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZXgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgVGFwZXN0cnkuZm9ybWF0KCJGb3JtQ29uZGl0aW9uYWwudW5hYmxlLXRvLWNvbnZlcnQtc3RyaW5nIiwgdmFsdWUpLAotICAgICAgICAgICAgICAgIHRoaXMsCi0gICAgICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgICAgICBleCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIERhdGFTcXVlZXplciBnZXREYXRhU3F1ZWV6ZXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldFBhZ2UoKS5nZXRFbmdpbmUoKS5nZXREYXRhU3F1ZWV6ZXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0Rpc2FibGVkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBnZXRDb25kaXRpb24oKTsKLSAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldEVsZW1lbnQoKTsKLQotICAgIHB1YmxpYyBhYnN0cmFjdCBJQmluZGluZyBnZXRDb25kaXRpb25WYWx1ZUJpbmRpbmcoKTsKLQotICAgIHB1YmxpYyBhYnN0cmFjdCBJQWN0aW9uTGlzdGVuZXIgZ2V0TGlzdGVuZXIoKTsKLQotfQpkaWZmIC0tZ2l0IGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL2Zvcm0vRm9ybUNvbmRpdGlvbmFsLmp3YyBiL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9mb3JtL0Zvcm1Db25kaXRpb25hbC5qd2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyYmEzZDMuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL2Zvcm0vRm9ybUNvbmRpdGlvbmFsLmp3YworKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAgCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPCEtLSAkSWQkIC0tPgotPCFET0NUWVBFIGNvbXBvbmVudC1zcGVjaWZpY2F0aW9uIFBVQkxJQyAKLSAgIi0vL0FwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLy9UYXBlc3RyeSBTcGVjaWZpY2F0aW9uIDMuMC8vRU4iIAotICAiaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy90YXBlc3RyeS9kdGQvVGFwZXN0cnlfM18wLmR0ZCI+Ci0gIAotPGNvbXBvbmVudC1zcGVjaWZpY2F0aW9uIGNsYXNzPSJvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIuZm9ybS5Gb3JtQ29uZGl0aW9uYWwiPgotICA8ZGVzY3JpcHRpb24+Ci0gIENvbmRpdGlvbmFsbHkgZW11bGF0ZXMgYW4gZWxlbWVudCBhbmQgaXRzIGF0dHJpYnV0ZXMgKGlmIGVsZW1lbnQgaXMgc3BlY2lmaWVkKSBhbmQvb3IgaW5jbHVkZXMgYSBibG9jayBvZiBjb250ZW50IGlmIGEgY29uZGl0aW9uIGlzIG1ldC4KLSAgPC9kZXNjcmlwdGlvbj4KLSAgCi0gIDxwYXJhbWV0ZXIgbmFtZT0iY29uZGl0aW9uIiB0eXBlPSJib29sZWFuIiBkaXJlY3Rpb249ImluIiByZXF1aXJlZD0ieWVzIj4KLSAgICA8ZGVzY3JpcHRpb24+Ci0gICAgVGhlIGNvbmRpdGlvbiB0byBldmFsdWF0ZS4KLSAgICA8L2Rlc2NyaXB0aW9uPgotICA8L3BhcmFtZXRlcj4KLSAgCi0gIDxwYXJhbWV0ZXIgbmFtZT0iZWxlbWVudCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgZGlyZWN0aW9uPSJpbiIgcmVxdWlyZWQ9Im5vIj4KLSAgCTxkZXNjcmlwdGlvbj4KLSAgCVRoZSBlbGVtZW50IHRvIGVtdWxhdGUuCi0gIAk8L2Rlc2NyaXB0aW9uPgotICA8L3BhcmFtZXRlcj4KLQotICA8cGFyYW1ldGVyIG5hbWU9Imxpc3RlbmVyIiB0eXBlPSJvcmcuYXBhY2hlLnRhcGVzdHJ5LklBY3Rpb25MaXN0ZW5lciIgZGlyZWN0aW9uPSJpbiIvPgotCi0gIDxwYXJhbWV0ZXIgbmFtZT0iY29uZGl0aW9uVmFsdWUiIHR5cGU9ImJvb2xlYW4iPgotICAgIDxkZXNjcmlwdGlvbj4KLSAgICBUaGUgdmFsdWUgb2YgdGhlIGNvbmRpdGlvbi4gRHVyaW5nIHJlbmRlciB0aGlzIGlzIG9idGFpbmVkIGZyb20KLSAgICB0aGUgY29uZGl0aW9uIHBhcmFtZXRlci4gRHVyaW5nIHJld2luZCBpdCBpcyB0aGUgc3VibWl0dGVkIGNvbmRpdGlvbi4KLSAgICA8L2Rlc2NyaXB0aW9uPgotICA8L3BhcmFtZXRlcj4KLQotICA8cmVzZXJ2ZWQtcGFyYW1ldGVyIG5hbWU9ImludmVydCIvPgotICAKLSAgPHByb3BlcnR5LXNwZWNpZmljYXRpb24gbmFtZT0ibmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgotICA8cHJvcGVydHktc3BlY2lmaWNhdGlvbiBuYW1lPSJmb3JtIiB0eXBlPSJvcmcuYXBhY2hlLnRhcGVzdHJ5LklGb3JtIi8+Ci0gIAotPC9jb21wb25lbnQtc3BlY2lmaWNhdGlvbj4KZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9mb3JtL0lNdWx0aXBsZVByb3BlcnR5U2VsZWN0aW9uUmVuZGVyZXIuamF2YSBiL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9mb3JtL0lNdWx0aXBsZVByb3BlcnR5U2VsZWN0aW9uUmVuZGVyZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTcwYWY1OS4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvZm9ybS9JTXVsdGlwbGVQcm9wZXJ0eVNlbGVjdGlvblJlbmRlcmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLmZvcm07Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklNYXJrdXBXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVxdWVzdEN5Y2xlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuZm9ybS5JUHJvcGVydHlTZWxlY3Rpb25Nb2RlbDsKLQotLyoqCi0gKiAgRGVmaW5lcyBhbiBvYmplY3QgdGhhdCB3b3JrcyB3aXRoIGEge0BsaW5rIE11bHRpcGxlUHJvcGVydHlTZWxlY3Rpb259IGNvbXBvbmVudAotICogIHRvIHJlbmRlciB0aGUgaW5kaXZpZHVhbCBlbGVtZW50cyBvYnRhaW5lZCBmcm9tIHRoZSB7QGxpbmsgSVByb3BlcnR5U2VsZWN0aW9uTW9kZWwgbW9kZWx9LgotICoKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQGF1dGhvciBTYW5qYXkgTXVuamFsCi0gKgotICoqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElNdWx0aXBsZVByb3BlcnR5U2VsZWN0aW9uUmVuZGVyZXIKLXsKLSAgICAvKioKLSAgICAgKiAgQmVnaW5zIHRoZSByZW5kZXJpbmcgb2YgdGhlIHtAbGluayBNdWx0aXBsZVByb3BlcnR5U2VsZWN0aW9ufS4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIGJlZ2luUmVuZGVyKAotICAgICAgICBNdWx0aXBsZVByb3BlcnR5U2VsZWN0aW9uIGNvbXBvbmVudCwKLSAgICAgICAgSU1hcmt1cFdyaXRlciB3cml0ZXIsCi0gICAgICAgIElSZXF1ZXN0Q3ljbGUgY3ljbGUpOwotCi0gICAgLyoqCi0gICAgICogIEludm9rZWQgZm9yIGVhY2ggZWxlbWVudCBvYnRhaW5lZCBmcm9tIHRoZSB7QGxpbmsgSVByb3BlcnR5U2VsZWN0aW9uTW9kZWwgbW9kZWx9LgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgcmVuZGVyT3B0aW9uKAotICAgICAgICBNdWx0aXBsZVByb3BlcnR5U2VsZWN0aW9uIGNvbXBvbmVudCwKLSAgICAgICAgSU1hcmt1cFdyaXRlciB3cml0ZXIsCi0gICAgICAgIElSZXF1ZXN0Q3ljbGUgY3ljbGUsCi0gICAgICAgIElQcm9wZXJ0eVNlbGVjdGlvbk1vZGVsIG1vZGVsLAotICAgICAgICBPYmplY3Qgb3B0aW9uLAotICAgICAgICBpbnQgaW5kZXgsCi0gICAgICAgIGJvb2xlYW4gc2VsZWN0ZWQpOwotCi0gICAgLyoqCi0gICAgICogIEVuZHMgdGhlIHJlbmRlcmluZyBvZiB0aGUge0BsaW5rIE11bHRpcGxlUHJvcGVydHlTZWxlY3Rpb259LgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgZW5kUmVuZGVyKAotICAgICAgICBNdWx0aXBsZVByb3BlcnR5U2VsZWN0aW9uIGNvbXBvbmVudCwKLSAgICAgICAgSU1hcmt1cFdyaXRlciB3cml0ZXIsCi0gICAgICAgIElSZXF1ZXN0Q3ljbGUgY3ljbGUpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9mb3JtL01hc2tFZGl0Lmh0bWwgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvZm9ybS9NYXNrRWRpdC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTRiMGE1Li4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9mb3JtL01hc2tFZGl0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxpbnB1dCBqd2NpZD0ibWFza0VkaXQiIHR5cGU9InRleHQiLz4KLTxpbnB1dCBqd2NpZD0ibWFza1ZhbHVlIiB0eXBlPSJoaWRkZW4iLz4KLTxzcGFuIGp3Y2lkPSJtYXNrRWRpdFNjcmlwdCIvPgotCi0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9mb3JtL01hc2tFZGl0LmphdmEgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvZm9ybS9NYXNrRWRpdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDU5NmI0Li4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9mb3JtL01hc2tFZGl0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi5mb3JtOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5CYXNlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUJpbmRpbmc7Ci0KLS8qKgotICogUHJvdmlkZXMgYSBtYXNrIGVkaXQgSFRNTCAmbHQ7aW5wdXQgdHlwZT0idGV4dCImZ3Q7IGZvcm0gZWxlbWVudC4KLSAqIDxwPgotICogTWFzayBlZGl0IGZpZWxkIHZhbGlkYXRlcyB0aGUgdGV4dCB0aGUgdXNlciBlbnRlcnMgYWdhaW5zdCBhIAotICogbWFzayB0aGF0IGVuY29kZXMgdGhlIHZhbGlkIGZvcm1zIHRoZSB0ZXh0IGNhbiB0YWtlLiBUaGUgbWFzayBjYW4gCi0gKiBhbHNvIGZvcm1hdCB0ZXh0IHRoYXQgaXMgZGlzcGxheWVkIHRvIHRoZSB1c2VyLgotICogPHA+Ci0gKiA8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiI+Ci0gKiAgPHRyPgotICogICA8dGg+TWFzayBjaGFyYWN0ZXI8L3RoPjx0aD5NZWFuaW5nIGluIG1hc2s8L3RoPgotICogIDwvdHI+Ci0gKiAgPHRyPgotICogICA8dGQ+Jm5ic3A7bDwvdGQ+PHRkPiZuYnNwO01peGVkIGNhc2UgbGV0dGVyIGNoYXJhY3RlciBbYS4ueiwgQS4uWl08L3RkPgotICogIDwvdHI+Ci0gKiAgPHRyPgotICogICA8dGQ+Jm5ic3A7TDwvdGQ+PHRkPiZuYnNwO1VwcGVyIGNhc2UgbGV0dGVyIGNoYXJhY3RlciBbQS4uWl08L3RkPgotICogIDwvdHI+Ci0gKiAgPHRyPgotICogICA8dGQ+Jm5ic3A7YTwvdGQ+PHRkPiZuYnNwO01peGVkIGNhc2UgYWxwaGEgbnVtZXJpYyBjaGFyYWN0ZXIgW2EuLnosIEEuLlosIDAuLjFdPC90ZD4KLSAqICA8L3RyPgotICogIDx0cj4KLSAqICAgPHRkPiZuYnNwO0E8L3RkPjx0ZD4mbmJzcDtVcHBlciBjYXNlIGFscGhhIG51bWVyaWMgY2hhcmFjdGVyIFtBLi5aLCAwLi45XTwvdGQ+Ci0gKiAgPC90cj4KLSAqICA8dHI+Ci0gKiAgIDx0ZD4mbmJzcDsjPC90ZD48dGQ+Jm5ic3A7TnVtZXJpYyBjaGFyYWN0ZXIgWzAuLjldPC90ZD4KLSAqICA8L3RyPgotICogIDx0cj4KLSAqICAgPHRkPiZuYnNwO188L3RkPjx0ZD4mbmJzcDtSZXNlcnZlZCBjaGFyYWN0ZXIgZm9yIGRpc3BsYXksIGRvIG5vdCB1c2UuPC90ZD4KLSAqICA8L3RyPgotICogIDx0cj4KLSAqICAgPHRkPiZuYnNwO290aGVyczwvdGQ+PHRkPiZuYnNwO05vbiBlZGl0YWJsZSBjaGFyYWN0ZXIgZm9yIGRpc3BsYXkuPC90ZD4KLSAqICA8L3RyPgotICogPC90YWJsZT4gCi0gKiA8cD4KLSAqIFRoaXMgY29tcG9uZW50IHJlcXVpcmVzIEphdmFTY3JpcHQgdG8gYmUgZW5hYmxlZCBpbiB0aGUgY2xpZW50IGJyb3dzZXIuCi0gKiA8cD4KLSAqIFs8YSBocmVmPSIuLi8uLi8uLi8uLi8uLi9Db21wb25lbnRSZWZlcmVuY2UvTWFza0VkaXQuaHRtbCI+Q29tcG9uZW50IFJlZmVyZW5jZTwvYT5dCi0gKgotICogQGF1dGhvciBNYWxjb2xtIEVkZ2FyCi0gKiBAdmVyc2lvbiAkSWQkCi0gKiBAc2luY2UgMi4zCi0gKgotICoqLwotCi1wdWJsaWMgY2xhc3MgTWFza0VkaXQgZXh0ZW5kcyBCYXNlQ29tcG9uZW50Ci17Ci0gICAgcHJpdmF0ZSBTdHJpbmcgX21hc2s7Ci0gICAgcHJpdmF0ZSBJQmluZGluZyBfdmFsdWVCaW5kaW5nOwotICAgIHByaXZhdGUgYm9vbGVhbiBfZGlzYWJsZWQ7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE1hc2soKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9tYXNrOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE1hc2soU3RyaW5nIG1hc2spCi0gICAgewotICAgICAgICBfbWFzayA9IG1hc2s7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKQotICAgIHsKLSAgICAgICAgaWYgKF92YWx1ZUJpbmRpbmcgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIF92YWx1ZUJpbmRpbmcuZ2V0U3RyaW5nKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIF92YWx1ZUJpbmRpbmcuc2V0U3RyaW5nKHZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSUJpbmRpbmcgZ2V0VmFsdWVCaW5kaW5nKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfdmFsdWVCaW5kaW5nOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlQmluZGluZyhJQmluZGluZyB2YWx1ZUJpbmRpbmcpCi0gICAgewotICAgICAgICBfdmFsdWVCaW5kaW5nID0gdmFsdWVCaW5kaW5nOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRGlzYWJsZWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9kaXNhYmxlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREaXNhYmxlZChib29sZWFuIGRpc2FibGVkKQotICAgIHsKLSAgICAgICAgX2Rpc2FibGVkID0gZGlzYWJsZWQ7Ci0gICAgfSAgICAgICAgCi19CmRpZmYgLS1naXQgYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvZm9ybS9NYXNrRWRpdC5qcyBiL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9mb3JtL01hc2tFZGl0LmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGIwNGM4Li4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9mb3JtL01hc2tFZGl0LmpzCisrKyAvZGV2L251bGwKQEAgLTEsNDIwICswLDAgQEAKLS8qKg0KLSAqICBKYXZhU2NyaXB0IE1hc2sgRWRpdCBjb250cm9sDQotICogIFBhdWwgR2VlcnRzDQotICogIE9jdCAyMDAyDQotICogDQotICogIE5vdGU6ICBUaGlzIHByb2JhYmx5IG9ubHkgd29ya3MgZm9yIEVuZ2xpc2gNCi0gKiAgT3RoZXIgbGFuZ3VhZ2VzIGhhdmUgYmVlbiBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIA0KLSAqICBuZXh0IHZlcnNpb24gb2YgU3BlZWNoIChUTSkNCi0gKiovDQotDQotdmFyIGRvbnREb0l0OyAgLy8gaGFjayBmb3IgTW96IGJlY2F1c2UgaXQgd29uJ3QgY2FuY2VsIGV2ZW50cyBwcm9wZXJseQ0KLXZhciBpc1RhYjsgICAgIC8vIGFub3RoZXIgTW96IGhhY2sNCi0NCi0NCi0vLyBJbml0IHRoZSBtYXNrIGVkaXQgZmllbGQgYnkgY3JlYXRpbmcgYSBsb29rYWxpa2UgRElWDQotLy8gYW5kIGhpZGluZyB0aGUgcmVhbCBvbmUNCi1mdW5jdGlvbiBpbml0TWFzayhmaWVsZCwgbWFza0ZpZWxkKSB7DQotDQotCWlmIChmaWVsZC5kaXNhYmxlZCA9PSB0cnVlKSB7DQotCSAgIHJldHVybjsNCi0JfQ0KLQ0KLSAgICB2YXIgbWFzayA9IG1hc2tGaWVsZC52YWx1ZTsNCi0gICAgdmFyIHZhbCA9IGZpZWxkLnZhbHVlOw0KLSAgICANCi0gICAgaWYgKCF2YWwpIHsgIC8vIGlmIHRoZXJlJ3Mgbm8gdmFsLCBpbml0IGl0IHdpdGggZW1wdHkgbWFzaw0KLSAgICAgICAgdmFsID0gZGlzcGxheU1hc2sobWFzayk7DQotICAgICAgICBmaWVsZC52YWx1ZSA9IGRpc3BsYXlNYXNrKG1hc2spOw0KLSAgICB9DQotICAgIC8vIGNyZWF0ZSBhIGRpdiBhbmQgYWRkIGEgYnVuY2ggb2Ygc3BhbnMNCi0gICAgLy8gYW5kIGVkaXRzIHRvIGl0Lg0KLSAgICBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsNCi0gICAJZGl2LnN0eWxlLmJhY2tncm91bmRDb2xvciA9ICJ3aGl0ZSI7DQotICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IG1hc2subGVuZ3RoIDsgaSsrKSB7DQotICAgICAgICB2YXIgZHMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJTUEFOIik7DQotICAgICAgICB2YXIgdiA9IHZhbC5zdWJzdHIoaSwxKTsNCi0gICAgICAgIHZhciBtID0gbWFzay5zdWJzdHIoaSwxKTsNCi0gICAgICAgIGlmICh2PT0iICIpIHsNCi0gICAgICAgICAgICB2PSImbmJzcDsiOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZHMuaW5uZXJIVE1MID0gdjsNCi0gICAgICAgIGRzLmluZGV4ID0gaTsNCi0gICAgICAgIGRzLm1hc2sgPSBtOw0KLSAgICAgICAgZHMuZGl2ID0gZGl2Ow0KLSAgICAgICAgLy8gaWYgd2UgY2FuIGVkaXQgdGhpcyBjaGFyDQotICAgICAgICAvLyBtYWtlIGEgbGl0dGxlIHRpbnkgZWRpdCBmaWVsZA0KLSAgICAgICAgaWYgKGlzRWRpdENoYXIobSkpIHsNCi0gICAgICAgICAgICB2YXIgZXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJJTlBVVCIpOw0KLSAgICAgICAgICAgIGVzLnN0eWxlLndpZHRoID0gIjFweCI7DQotICAgICAgICAgICAgZXMuc3R5bGUuYm9yZGVyPSIwcHgiOw0KLSAgICAgICAgICAgIGVzLmluZGV4ID0gaTsNCi0gICAgICAgICAgICBlcy5maWVsZCA9IGZpZWxkOw0KLSAgICAgICAgICAgIGVzLm1hc2sgPSBtOw0KLSAgICAgICAgICAgIGVzLmRpc3BsYXkgPSBkczsNCi0gICAgICAgICAgICBkcy5lZGl0RmllbGQgPSBlczsNCi0gICAgICAgICAgICBlcy5kaXYgPSBkaXY7DQotICAgICAgICAgICAgZGl2LmFwcGVuZENoaWxkKGVzKTsgIC8vIHNldCB1cCBzb21lIGV2ZW50cw0KLSAgICAgICAgICAgIGlmIChuYXZpZ2F0b3IuYXBwTmFtZSA9PSAiTWljcm9zb2Z0IEludGVybmV0IEV4cGxvcmVyIikgew0KLSAgICAgICAgICAgICAgICBhZGRFdmVudCgia2V5cHJlc3MiLCBlcywgY2hhbmdlQml0SUUpOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIGFkZEV2ZW50KCJrZXlwcmVzcyIsIGVzLCBjaGFuZ2VCaXROUyk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGFkZEV2ZW50KCJrZXlkb3duIiwgZXMsIHNwZWNpYWxLZXkpOyAvLyBrZXlkb3duIGhhbmRsZXMgc3R1ZmYgbGlrZSBob21lLCBlbmQgZXRjDQotICAgICAgICAgICAgYWRkRXZlbnQoImNsaWNrIiwgZHMsIGNsaWNrKTsNCi0gICAgICAgIH0gDQotDQotICAgICAgICBkaXYuYXBwZW5kQ2hpbGQoZHMpOw0KLQ0KLSAgICB9DQotICAgIA0KLSAgICAvLyB0aGUgZmluYWwgZWRpdCBmaWVsZCBvbiB0aGUgZW5kDQotICAgIHZhciBlcyA9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiSU5QVVQiKTsNCi0gICAgZXMuc3R5bGUud2lkdGggPSAiMXB4IjsNCi0gICAgZXMuc3R5bGUuYm9yZGVyPSIwcHgiOw0KLSAgICBlcy5kaXYgPSBkaXY7DQotICAgIGRpdi5hcHBlbmRDaGlsZChlcyk7DQotICAgIGlmIChuYXZpZ2F0b3IuYXBwTmFtZSA9PSAiTWljcm9zb2Z0IEludGVybmV0IEV4cGxvcmVyIikgew0KLSAgICAgICAgYWRkRXZlbnQoImtleXByZXNzIiwgZXMsIGNoYW5nZUJpdElFKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIGFkZEV2ZW50KCJrZXlwcmVzcyIsIGVzLCBjaGFuZ2VCaXROUyk7DQotICAgIH0NCi0gICAgYWRkRXZlbnQoImtleWRvd24iLCBlcywgc3BlY2lhbEtleSk7DQotDQotICAgIGRpdi5ub1dyYXAgPSB0cnVlOyAvLyBmb3JjZSBzaW5nbGUgbGluZSBkaXNwbGF5DQotDQotICAgIGZvcm1hdERpdihkaXYsIGZpZWxkKTsgLy8gZm9ybWF0IHRoZSBESVYgdG8gbG9vayBsaWtlIGFuIGVkaXQgYm94DQotICAgIGZpZWxkLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7IA0KLSAgICBmaWVsZC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkaXYsIGZpZWxkKTsNCi0gICAgYWRkRXZlbnQoImNsaWNrIiwgZGl2LCBkaXZDbGljayk7DQotfQ0KLQ0KLWZ1bmN0aW9uIGZvcm1hdERpdihkaXYsIGZpZWxkKSB7DQotICAgIC8vIG1ha2UgaXQgbG9vayBsaWtlIGFuIElFIGVkaXQNCi0gICAgaWYgKG5hdmlnYXRvci5hcHBOYW1lID09ICJNaWNyb3NvZnQgSW50ZXJuZXQgRXhwbG9yZXIiKSB7DQotICAgICAgICBkaXYuc3R5bGUuZm9udEZhbWlseT0iY291cmllciI7IA0KLSAgICAgICAgZGl2LnN0eWxlLmZvbnRTaXplPSIxMHB0IjsgICAgICANCi0gICAgICAgIGRpdi5zdHlsZS53aWR0aCA9IGZpZWxkLm9mZnNldFdpZHRoOw0KLSAgICAgICAgZGl2LnN0eWxlLmhlaWdodCA9IGZpZWxkLm9mZnNldEhlaWdodDsNCi0gICAgICAgIGlmIChuYXZpZ2F0b3IuYXBwVmVyc2lvbi5tYXRjaCgvNi4wLykpIHsgLy8gSUUgNiBpcyBkaWZmZXJlbnQNCi0gICAgICAgICAgICBkaXYuc3R5bGUuYm9yZGVyID0gIjFweCBzb2xpZCAjN0Y5REI5IjsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgZGl2LnN0eWxlLmJvcmRlckxlZnQgPSAiMnB4IHNvbGlkICM2MDYwNjAiOw0KLSAgICAgICAgICAgIGRpdi5zdHlsZS5ib3JkZXJUb3AgPSAiMnB4IHNvbGlkICM2MDYwNjAiOw0KLSAgICAgICAgICAgIGRpdi5zdHlsZS5ib3JkZXJSaWdodCA9ICIxcHggc29saWQgI2FhYWFhYSI7DQotICAgICAgICAgICAgZGl2LnN0eWxlLmJvcmRlckJvdHRvbSA9ICIxcHggc29saWQgI2FhYWFhYSI7DQotICAgICAgICB9DQotDQotICAgIH0gZWxzZSB7DQotICAgICAgICAvLyBNb3ppbGxhIGVkaXQgbG9vay1hLWxpa2UNCi0gICAgICAgIGRpdi5zdHlsZS5mb250RmFtaWx5PSJjb3VyaWVyIjsNCi0gICAgICAgIGRpdi5zdHlsZS5mb250U2l6ZT0iMTBwdCI7DQotICAgICAgICBkaXYuc3R5bGUuYm9yZGVyPSIycHggaW5zZXQgI2NjY2NjYyI7DQotICAgICAgICBpZiAoZmllbGQuc2l6ZSkgew0KLSAgICAgICAgICAgIGRpdi5zdHlsZS53aWRoID0gMTMgKiBmaWVsZC5zaXplOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBkaXYuc3R5bGUud2lkdGggPSAiMTMwcHgiOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KLQ0KLQ0KLWZ1bmN0aW9uIGlzRWRpdENoYXIoYykgeyAgLy8gaXMgdGhpcyBjaGFyIGEgbWVhbmluZ2Z1bCBtYXNrIGNoYXINCi0gICAgc3dpdGNoIChjKSB7DQotICAgIGNhc2UgIl8iOg0KLSAgICBjYXNlICIjIjoNCi0gICAgY2FzZSAiYSI6DQotICAgIGNhc2UgIkEiOg0KLSAgICBjYXNlICJsIjoNCi0gICAgY2FzZSAiTCI6DQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgZGVmYXVsdDoNCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLSAgICByZXR1cm4gZmFsc2U7DQotfQ0KLQ0KLWZ1bmN0aW9uIGRpc3BsYXlNYXNrQ2hhcihjKSB7ICAvLyBkaXNwbGF5IG1hc2sgY2hhcnMgYXMgXyANCi0gICAgaWYgKGlzRWRpdENoYXIoYykpIHsgICAgICAgLy8gb3RoZXJ3aXNlIGp1c3Qgc2hvdyBub3JtYWwgY2hhcg0KLSAgICAgICAgcmV0dXJuICJfIjsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIHJldHVybiBjOw0KLSAgICB9DQotfQ0KLQ0KLWZ1bmN0aW9uIGRpc3BsYXlNYXNrKG1hc2spIHsgIC8vIGRpc3BsYXkgZW50aXJlIG1hc2sgdXNpbmcgYWJvdXQgc3Vicm91dGluZQ0KLSAgICB2YXIgZCA9ICIiOw0KLSAgICBmb3IgKHZhciBpID0gMCA7IGkgPCBtYXNrLmxlbmd0aCA7IGkrKykgew0KLSAgICAgICAgZCs9ZGlzcGxheU1hc2tDaGFyKG1hc2suc3Vic3RyKGksMSkpOw0KLSAgICB9DQotICAgIHJldHVybiBkOw0KLX0NCi0NCi1mdW5jdGlvbiBkaXZDbGljayhlKSB7ICAgICAvLyB3aGVuIHRoZSBtYWluIERJViBpcyBjbGlja2VkLCBmb2N1cyB0aGUgZW5kIG9mIHRoZSBlZGl0DQotICAgIHZhciBkID0gZ2V0RXZlbnRPYmplY3QoZSk7DQotICAgIGlmIChkICYmIGQubGFzdENoaWxkKSB7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgZC5sYXN0Q2hpbGQuZm9jdXMoKTsNCi0gICAgICAgIH0gY2F0Y2ggKGUpIHsNCi0gICAgICAgICAgIC8vIG51ZmZpbg0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KLQ0KLWZ1bmN0aW9uIHNwZWNpYWxLZXkoZSkgeyAvLyBkZWFsIHdpdGggc3BlY2lhbCBrZXlzIGxpa2UgYmFja3NwYWNlLCBkZWxldGUgZXRjDQotICAgIHZhciBzID0gZ2V0RXZlbnRPYmplY3QoZSk7DQotICAgIHZhciBjb2RlID0gZS5rZXlDb2RlOw0KLSAgICBkb250RG9JdCA9IHRydWU7ICAvLyBNb3ogbmVlZHMgdGhlc2UsIGFzIEkgY2FuJ3Qgc2VlbSB0byBjYW5jZWwgZXZlbnRzIHByb3Blcmx5DQotICAgIGlzVGFiID0gZmFsc2U7ICAgIC8vIE1veiBjYW4ndCBoYW5kbGUgdGFicyB3ZWxsIGVpdGhlcg0KLSAgICBzd2l0Y2ggKGNvZGUpIHsNCi0gICAgY2FzZSA4OiAgIC8vIGJhY2tzcGFjZQ0KLSAgICAgICAgdmFyIGIgPSBnZXRQcmV2RWRpdChzKTsNCi0gICAgICAgIGlmIChiKSB7DQotICAgICAgICAgICAgYi5kaXNwbGF5LmlubmVySFRNTCA9IGRpc3BsYXlNYXNrQ2hhcihiLm1hc2spOw0KLSAgICAgICAgICAgIHZhciBpID0gYi5pbmRleDsNCi0gICAgICAgICAgICBiLmZpZWxkLnZhbHVlID0gYi5maWVsZC52YWx1ZS5zdWJzdHIoMCwgaSkgKyANCi0gICAgICAgICAgICAgICAgZGlzcGxheU1hc2tDaGFyKGIubWFzaykgKyBiLmZpZWxkLnZhbHVlLnN1YnN0cihpKzEsIGIuZmllbGQudmFsdWUubGVuZ3RoIC0gaSk7DQotICAgICAgICAgICAgYi5mb2N1cygpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2FuY2VsRXZlbnQoZSk7DQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgIGNhc2UgNDY6ICAvLyBkZWxldGUNCi0gICAgICAgIGlmIChzLmRpc3BsYXkpIHsNCi0gICAgICAgICAgICBzLmRpc3BsYXkuaW5uZXJIVE1MID0gZGlzcGxheU1hc2tDaGFyKHMubWFzayk7DQotICAgICAgICAgICAgdmFyIGkgPSBzLmluZGV4Ow0KLSAgICAgICAgICAgIHMuZmllbGQudmFsdWUgPSBzLmZpZWxkLnZhbHVlLnN1YnN0cigwLCBpKSArIGRpc3BsYXlNYXNrQ2hhcihzLm1hc2spICsgDQotICAgICAgICAgICAgICAgIHMuZmllbGQudmFsdWUuc3Vic3RyKGkrMSwgcy5maWVsZC52YWx1ZS5sZW5ndGggLSBpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhbmNlbEV2ZW50KGUpOw0KLSAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgYnJlYWs7DQotICAgIGNhc2UgMzc6IC8vIGxlZnQNCi0gICAgICAgIHZhciBwID0gZ2V0UHJldkVkaXQocyk7DQotICAgICAgICBpZiAocCkgew0KLSAgICAgICAgICAgIHAuZm9jdXMoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhbmNlbEV2ZW50KGUpOw0KLSAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICBjYXNlIDM5OiAvLyByaWdodA0KLSAgICAgICAgdmFyIG4gPSBnZXROZXh0RWRpdChzKTsNCi0gICAgICAgIGlmIChuKSB7DQotICAgICAgICAgICAgbi5mb2N1cygpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2FuY2VsRXZlbnQoZSk7DQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgIGNhc2UgMzY6IC8vIGhvbWUNCi0gICAgICAgIHMuZGl2LmZpcnN0Q2hpbGQuZm9jdXMoKTsNCi0gICAgICAgIGNhbmNlbEV2ZW50KGUpOw0KLSAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICBjYXNlIDM1OiAvLyBlbmQNCi0gICAgICAgIHMuZGl2Lmxhc3RDaGlsZC5mb2N1cygpOw0KLSAgICAgICAgY2FuY2VsRXZlbnQoZSk7DQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgIGNhc2UgOTogLy8gdGFiDQotICAgICAgICBpZiAobmF2aWdhdG9yLmFwcE5hbWUgPT0gIk1pY3Jvc29mdCBJbnRlcm5ldCBFeHBsb3JlciIpIHsNCi0gICAgICAgICAgICBpZiAoIWUuc2hpZnRLZXkpIHsNCi0gICAgICAgICAgICAgICAgcy5kaXYubGFzdENoaWxkLmZvY3VzKCk7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgcy5kaXYuZmlyc3RDaGlsZC5mb2N1cygpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9IGVsc2UgeyAgLy8gaXMgbW96aWxsYS9uZXRzY2FwZQ0KLSAgICAgICAgICAgIGlzVGFiID0gdHJ1ZTsgIC8vIGJlc3QgaSBjYW4gZG8gcmVhbGx5DQotICAgICAgICB9DQotICAgICAgICBicmVhazsNCi0gICAgfQ0KLSAgICAgICANCi0gICAgZG9udERvSXQgPSBmYWxzZTsNCi19DQotDQotZnVuY3Rpb24gbW92ZUZvcndhcmQocykgeyAvLyBmb2N1cyBuZXh0IGVkaXQNCi0gICAgdmFyIGIgPSBnZXROZXh0RWRpdChzKTsNCi0gICAgaWYgKGIpIHsNCi0gICAgICAgIGIuZm9jdXMoKTsNCi0gICAgfQ0KLX0NCi0NCi1mdW5jdGlvbiBtb3ZlQmFja3dhcmQocykgeyAvLyBmb2N1cyBwcmV2aW91cyBlZGl0DQotICAgIHZhciBiID0gZ2V0UHJldkVkaXQocyk7DQotICAgIGlmIChiKSB7DQotICAgICAgICBiLmZvY3VzKCk7DQotICAgIH0NCi19DQotDQotZnVuY3Rpb24gaXNJbnNlcnRPSyhjb2RlLCBzKSB7ICAvLyBjaGVjayBpZiB5b3UncmUgZ29vZCB0byBpbnNlcnQgYSBjaGFyDQotICAgIHZhciBtY2hhciA9IHMubWFzazsNCi0gICAgc3dpdGNoIChtY2hhcikgew0KLSAgICBjYXNlICJfIjoNCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgYnJlYWs7DQotICAgIGNhc2UgIiMiOg0KLSAgICAgICAgcmV0dXJuIGNoZWNrRGlnaXQoY29kZSk7DQotICAgICAgICBicmVhazsNCi0gICAgY2FzZSAiYSI6DQotICAgICAgICByZXR1cm4gY2hlY2tBbHBoYU51bWVyaWMoY29kZSk7DQotICAgICAgICBicmVhazsNCi0gICAgY2FzZSAiQSI6DQotICAgICAgICByZXR1cm4gY2hlY2tVcENhc2VBbHBoYU51bWVyaWMoY29kZSk7DQotICAgICAgICBicmVhazsNCi0gICAgY2FzZSAibCI6DQotICAgICAgICByZXR1cm4gY2hlY2tBbHBoYShjb2RlKTsNCi0gICAgICAgIGJyZWFrOw0KLSAgICBjYXNlICJMIjoNCi0gICAgICAgIHJldHVybiBjaGVja1VwQ2FzZUFscGhhKGNvZGUpOw0KLSAgICAgICAgYnJlYWs7DQotICAgIH0NCi0gICAgcmV0dXJuIGZhbHNlOw0KLX0NCi0NCi0vLyBmdW5jdGlvbnMgdG8gY2hlY2sgdGhlIGtleSBjb2RlLCBnb29kIG9sIEFTQ0lJDQotLy8gZmFpcmx5IHN0cmFpZ2h0Zm9yd2FyZA0KLQ0KLWZ1bmN0aW9uIGNoZWNrRGlnaXQoY29kZSkgew0KLSAgICBpZiAoKGNvZGU+PTQ4KSAmJiAoY29kZTw9NTcpKSB7DQotICAgICAgICByZXR1cm4gY29kZTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotfQ0KLQ0KLWZ1bmN0aW9uIGNoZWNrQWxwaGEoY29kZSkgew0KLSAgICBpZiAoKChjb2RlPj02NSkgJiYgKGNvZGU8PTkwKSkgfHwgKChjb2RlPj05NykgJiYgKGNvZGU8PTEyMikpKSB7DQotICAgICAgICByZXR1cm4gY29kZTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotfQ0KLQ0KLWZ1bmN0aW9uIGNoZWNrVXBDYXNlQWxwaGEoY29kZSkgew0KLSAgICBpZiAoKGNvZGU+PTY1KSAmJiAoY29kZTw9OTApKSB7DQotICAgICAgICByZXR1cm4gY29kZTsNCi0gICAgfSBlbHNlIGlmICgoY29kZT49OTcpICYmIChjb2RlPD0xMjIpKSB7DQotICAgICAgICByZXR1cm4gY29kZSAtIDMyOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi19DQotDQotZnVuY3Rpb24gY2hlY2tBbHBoYU51bWVyaWMoY29kZSkgew0KLSAgICBpZiAoKChjb2RlPj02NSkgJiYgKGNvZGU8PTkwKSkgfHwgKChjb2RlPj05NykgJiYgKGNvZGU8PTEyMikpIHx8ICgoY29kZT49NDgpICYmIChjb2RlPD01NykpKSB7DQotICAgICAgICByZXR1cm4gY29kZTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotfQ0KLQ0KLWZ1bmN0aW9uIGNoZWNrVXBDYXNlQWxwaGFOdW1lcmljKGNvZGUpIHsNCi0gICAgaWYgKChjb2RlPj02NSkgJiYgKGNvZGU8PTkwKSkgew0KLSAgICAgICAgcmV0dXJuIGNvZGU7DQotICAgIH0gZWxzZSBpZiAoKGNvZGU+PTk3KSAmJiAoY29kZTw9MTIyKSkgew0KLSAgICAgICAgcmV0dXJuIGNvZGUgLSAzMjsNCi0gICAgfSBlbHNlIGlmICgoY29kZT49NDgpICYmIChjb2RlPD01NykpIHsNCi0gICAgICAgIHJldHVybiBjb2RlOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi19DQotDQotDQotZnVuY3Rpb24gY2hhbmdlQml0TlMoZSkgeyAgLy8gaGFuZGxlIGtleSBldmVudHMgaW4gTlMNCi0gICAgdmFyIGVzID0gZ2V0RXZlbnRPYmplY3QoZSk7DQotICAgIGlmICghaXNUYWIpIHsNCi0gICAgICAgIGlmIChlcy5kaXNwbGF5KSB7DQotICAgICAgICAgICAgaWYgKCFkb250RG9JdCkgew0KLSAgICAgICAgICAgICAgICB2YXIgY29kZSA9IGUuY2hhckNvZGU7DQotICAgICAgICAgICAgICAgIGlmIChjb2RlID0gaXNJbnNlcnRPSyhjb2RlLCBlcykpIHsNCi0gICAgICAgICAgICAgICAgICAgIHZhciAgYyA9IFN0cmluZy5mcm9tQ2hhckNvZGUoY29kZSk7DQotICAgICAgICAgICAgICAgICAgICBlcy5kaXNwbGF5LmlubmVySFRNTCA9IGMNCi0gICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IGVzLmluZGV4Ow0KLSAgICAgICAgICAgICAgICAgICAgZXMuZmllbGQudmFsdWUgPSBlcy5maWVsZC52YWx1ZS5zdWJzdHIoMCwgaSkgKyBjICsgZXMuZmllbGQudmFsdWUuc3Vic3RyKGkrMSwgZXMuZmllbGQudmFsdWUubGVuZ3RoIC0gaSk7DQotICAgICAgICAgICAgICAgICAgICBtb3ZlRm9yd2FyZChlcyk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZXMudmFsdWUgPSAiIjsNCi0gICAgICAgICAgICBjYW5jZWxFdmVudChlKTsNCi0gICAgICAgIH0gICAgICAgIA0KLSAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICB9ICANCi19DQotDQotZnVuY3Rpb24gY2hhbmdlQml0SUUoZSkgeyAvLyBoYW5kbGUga2V5IGV2ZW50cyBpbiBJRQ0KLSAgICB2YXIgZXMgPSBnZXRFdmVudE9iamVjdChlKTsNCi0gICAgaWYgKGVzLmRpc3BsYXkpIHsNCi0gICAgICAgIHZhciBjb2RlID0gZS5rZXlDb2RlOw0KLSAgICAgICAgaWYgKGNvZGUgPSBpc0luc2VydE9LKGNvZGUsIGVzKSkgew0KLSAgICAgICAgICAgIHZhciAgYyA9IFN0cmluZy5mcm9tQ2hhckNvZGUoY29kZSk7DQotICAgICAgICAgICAgZXMuZGlzcGxheS5pbm5lckhUTUwgPSBjOw0KLSAgICAgICAgICAgIHZhciBpID0gZXMuaW5kZXg7DQotICAgICAgICAgICAgZXMuZmllbGQudmFsdWUgPSBlcy5maWVsZC52YWx1ZS5zdWJzdHIoMCwgaSkgKyBjICsgZXMuZmllbGQudmFsdWUuc3Vic3RyKGkrMSwgZXMuZmllbGQudmFsdWUubGVuZ3RoIC0gaSk7DQotICAgICAgICAgICAgbW92ZUZvcndhcmQoZXMpOw0KLSAgICAgICAgICAgIGVzLnZhbHVlID0gIiI7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgY2FuY2VsRXZlbnQoZSk7DQotICAgIHJldHVybiBmYWxzZTsNCi19DQotDQotZnVuY3Rpb24gY2xpY2soZSkgeyAgLy8gY2xpY2tpbmcgb24gYSBkaXNwbGF5IHNwYW4gZm9jdXNlcyB0aGUgZWRpdA0KLSAgICB2YXIgcyA9IGdldEV2ZW50T2JqZWN0KGUpOw0KLSAgICBzLmVkaXRGaWVsZC5mb2N1cygpOw0KLSAgICBjYW5jZWxFdmVudChlKTsNCi0gICAgcmV0dXJuIGZhbHNlOw0KLX0NCi0NCi1mdW5jdGlvbiBnZXRQcmV2RWRpdChzKSB7ICAgIC8vIGdldCBwcmV2aW91cyBpbnB1dCBmaWVsZCANCi0gICAgdmFyIGIgPSBzLnByZXZpb3VzU2libGluZzsNCi0gICAgd2hpbGUgKGIgJiYgKGIudGFnTmFtZSE9IklOUFVUIikpIHsNCi0gICAgICAgIGIgPSBiLnByZXZpb3VzU2libGluZzsNCi0gICAgfQ0KLSAgICByZXR1cm4gYjsNCi19DQotDQotZnVuY3Rpb24gZ2V0TmV4dEVkaXQocykgeyAvLyBnZXQgcHJldmlvdXMgbmV4dCBmaWVsZCANCi0gICAgdmFyIGIgPSBzLm5leHRTaWJsaW5nOw0KLSAgICB3aGlsZSAoYiAmJiAoYi50YWdOYW1lIT0iSU5QVVQiKSkgew0KLSAgICAgICAgYiA9IGIubmV4dFNpYmxpbmc7DQotICAgIH0NCi0gICAgcmV0dXJuIGI7DQotfQ0KLQ0KLWZ1bmN0aW9uIGNhbmNlbEV2ZW50KGUpIHsgICAvLyBraWxsIGV2ZW50IHByb3BhZ2F0aW9uDQotICAgIGUuY2FuY2VsQnViYmxlID0gdHJ1ZTsNCi0gICAgZS5jYW5jZWwgPSB0cnVlOw0KLSAgICBpZiAobmF2aWdhdG9yLmFwcE5hbWUgIT0gIk1pY3Jvc29mdCBJbnRlcm5ldCBFeHBsb3JlciIpIHsNCi0gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7ICAvLyBkb2Vzbid0IHNlZW0gdG8gd29yayBmb3Iga2V5IGV2ZW50cw0KLSAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOw0KLSAgICB9DQotfQ0KLQ0KLQ0KLWZ1bmN0aW9uIGdldEV2ZW50T2JqZWN0KGUpIHsgIC8vIHV0aWxpdHkgZnVuY3Rpb24gdG8gcmV0cmlldmUgb2JqZWN0IGZyb20gZXZlbnQNCi0gICAgaWYgKG5hdmlnYXRvci5hcHBOYW1lID09ICJNaWNyb3NvZnQgSW50ZXJuZXQgRXhwbG9yZXIiKSB7DQotICAgICAgICByZXR1cm4gZS5zcmNFbGVtZW50Ow0KLSAgICB9IGVsc2UgeyAgLy8gaXMgbW96aWxsYS9uZXRzY2FwZQ0KLSAgICAgICAgLy8gbmVlZCB0byBjcmF3bCB1cCB0aGUgdHJlZSB0byBnZXQgdGhlIGZpcnN0ICJyZWFsIiBlbGVtZW50DQotICAgICAgICAvLyBpLmUuIGEgdGFnLCBub3QgcmF3IHRleHQNCi0gICAgICAgIHZhciBvID0gZS50YXJnZXQ7DQotICAgICAgICB3aGlsZSAoIW8udGFnTmFtZSkgew0KLSAgICAgICAgICAgIG8gPSBvLnBhcmVudE5vZGU7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbzsNCi0gICAgfQ0KLX0NCi0NCi1mdW5jdGlvbiBhZGRFdmVudChuYW1lLCBvYmosIGZ1bmN0KSB7IC8vIHV0aWxpdHkgZnVuY3Rpb24gdG8gYWRkIGV2ZW50IGhhbmRsZXJzDQotDQotICAgIGlmIChuYXZpZ2F0b3IuYXBwTmFtZSA9PSAiTWljcm9zb2Z0IEludGVybmV0IEV4cGxvcmVyIikgew0KLSAgICAgICAgb2JqLmF0dGFjaEV2ZW50KCJvbiIrbmFtZSwgZnVuY3QpOw0KLSAgICB9IGVsc2UgeyAgLy8gaXMgbW96aWxsYS9uZXRzY2FwZQ0KLSAgICAgICAgb2JqLmFkZEV2ZW50TGlzdGVuZXIobmFtZSwgZnVuY3QsIGZhbHNlKTsNCi0gICAgfQ0KLX0NCi0NCi1mdW5jdGlvbiBkZWxldGVFdmVudChuYW1lLCBvYmosIGZ1bmN0KSB7IC8vIHV0aWxpdHkgZnVuY3Rpb24gdG8gZGVsZXRlIGV2ZW50IGhhbmRsZXJzDQotDQotICAgIGlmIChuYXZpZ2F0b3IuYXBwTmFtZSA9PSAiTWljcm9zb2Z0IEludGVybmV0IEV4cGxvcmVyIikgew0KLSAgICAgICAgb2JqLmRldGFjaEV2ZW50KCJvbiIrbmFtZSwgZnVuY3QpOw0KLSAgICB9IGVsc2UgeyAgLy8gaXMgbW96aWxsYS9uZXRzY2FwZQ0KLSAgICAgICAgb2JqLnJlbW92ZUV2ZW50TGlzdGVuZXIobmFtZSwgZnVuY3QsIGZhbHNlKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvZm9ybS9NYXNrRWRpdC5qd2MgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvZm9ybS9NYXNrRWRpdC5qd2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3OTZmY2IuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL2Zvcm0vTWFza0VkaXQuandjCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICAKLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08IS0tICRJZCQgLS0+Ci08IURPQ1RZUEUgY29tcG9uZW50LXNwZWNpZmljYXRpb24gUFVCTElDIAotICAiLS8vQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24vL1RhcGVzdHJ5IFNwZWNpZmljYXRpb24gMy4wLy9FTiIgCi0gICJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL3RhcGVzdHJ5L2R0ZC9UYXBlc3RyeV8zXzAuZHRkIj4KLQotPGNvbXBvbmVudC1zcGVjaWZpY2F0aW9uIGNsYXNzPSJvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIuZm9ybS5NYXNrRWRpdCIgYWxsb3ctaW5mb3JtYWwtcGFyYW1ldGVycz0ibm8iPgotCi0gIDxwYXJhbWV0ZXIgbmFtZT0ibWFzayIgZGlyZWN0aW9uPSJpbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgcmVxdWlyZWQ9InllcyIvPgotICA8cGFyYW1ldGVyIG5hbWU9InZhbHVlIiBkaXJlY3Rpb249ImN1c3RvbSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgcmVxdWlyZWQ9InllcyIvPgotICA8cGFyYW1ldGVyIG5hbWU9ImRpc2FibGVkIiBkaXJlY3Rpb249ImluIiB0eXBlPSJib29sZWFuIiByZXF1aXJlZD0ibm8iLz4KLSAgCi0gIDxjb21wb25lbnQgaWQ9Im1hc2tFZGl0IiB0eXBlPSJUZXh0RmllbGQiPgotICAgIDxiaW5kaW5nIG5hbWU9InZhbHVlIiBleHByZXNzaW9uPSJ2YWx1ZSIvPgotICAgIDxiaW5kaW5nIG5hbWU9Im1heGxlbmd0aCIgZXhwcmVzc2lvbj0ibWFzay5sZW5ndGgoKSIvPgotICAgIDxiaW5kaW5nIG5hbWU9InNpemUiIGV4cHJlc3Npb249Im1hc2subGVuZ3RoKCkiLz4gICAgICAgIAotICAgIDxiaW5kaW5nIG5hbWU9ImRpc2FibGVkIiBleHByZXNzaW9uPSJkaXNhYmxlZCIvPgotICA8L2NvbXBvbmVudD4KLQotICA8Y29tcG9uZW50IGlkPSJtYXNrVmFsdWUiIHR5cGU9IkhpZGRlbiI+Ci0gICAgPGJpbmRpbmcgbmFtZT0idmFsdWUiIGV4cHJlc3Npb249Im1hc2siLz4KLSAgICA8YmluZGluZyBuYW1lPSJlbmNvZGUiIGV4cHJlc3Npb249ImZhbHNlIi8+Ci0gIDwvY29tcG9uZW50PgotCi0gIDxjb21wb25lbnQgaWQ9Im1hc2tFZGl0U2NyaXB0IiB0eXBlPSJTY3JpcHQiPgotICAgIDxiaW5kaW5nIG5hbWU9Im1hc2tFZGl0IiBleHByZXNzaW9uPSJjb21wb25lbnRzLm1hc2tFZGl0Ii8+Ci0gICAgPGJpbmRpbmcgbmFtZT0ibWFza1ZhbHVlIiBleHByZXNzaW9uPSJjb21wb25lbnRzLm1hc2tWYWx1ZSIvPgotICAgIDxiaW5kaW5nIG5hbWU9InNjcmlwdCIgZXhwcmVzc2lvbj0nIk1hc2tFZGl0LnNjcmlwdCInLz4KLSAgPC9jb21wb25lbnQ+Ci0gICAgICAgIAotPC9jb21wb25lbnQtc3BlY2lmaWNhdGlvbj4KZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9mb3JtL01hc2tFZGl0LnNjcmlwdCBiL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9mb3JtL01hc2tFZGl0LnNjcmlwdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZjNzc1Ni4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvZm9ybS9NYXNrRWRpdC5zY3JpcHQKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAkSWQkIC0tPgotPCFET0NUWVBFIHNjcmlwdCBQVUJMSUMKLQkiLS8vSG93YXJkIExld2lzIFNoaXAvL1RhcGVzdHJ5IFNjcmlwdCAxLjIvL0VOIgotCSJodHRwOi8vdGFwZXN0cnkuc2YubmV0L2R0ZC9TY3JpcHRfMV8yLmR0ZCI+Ci0gIAotPHNjcmlwdD4KLQotPGluY2x1ZGUtc2NyaXB0IHJlc291cmNlLXBhdGg9Ii9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvZm9ybS9NYXNrRWRpdC5qcyIvPgotCi08aW5wdXQtc3ltYm9sIGtleT0ibWFza0VkaXQiIGNsYXNzPSJvcmcuYXBhY2hlLnRhcGVzdHJ5LmZvcm0uVGV4dEZpZWxkIiByZXF1aXJlZD0ieWVzIi8+Ci08aW5wdXQtc3ltYm9sIGtleT0ibWFza1ZhbHVlIiBjbGFzcz0ib3JnLmFwYWNoZS50YXBlc3RyeS5mb3JtLkhpZGRlbiIgcmVxdWlyZWQ9InllcyIvPgotCi08bGV0IGtleT0iZm9ybU5hbWUiPgotICAke21hc2tFZGl0LmZvcm0ubmFtZX0KLTwvbGV0PgotCi08bGV0IGtleT0iZnVuY3Rpb25OYW1lIj4KLSAgJHttYXNrRWRpdC5uYW1lfV9pbml0Ci08L2xldD4KLQotCi08Ym9keT4KLWZ1bmN0aW9uICR7ZnVuY3Rpb25OYW1lfSgpIHsKLSAgaW5pdE1hc2soZG9jdW1lbnQuJHtmb3JtTmFtZX0uJHttYXNrRWRpdC5uYW1lfSwKLSAgICAgICAgICAgZG9jdW1lbnQuJHtmb3JtTmFtZX0uJHttYXNrVmFsdWUubmFtZX0pOwotfQotPC9ib2R5PgotCi08aW5pdGlhbGl6YXRpb24+Ci0gICR7ZnVuY3Rpb25OYW1lfSgpOwotPC9pbml0aWFsaXphdGlvbj4KLQotPC9zY3JpcHQ+Ci0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9mb3JtL011bHRpcGxlUHJvcGVydHlTZWxlY3Rpb24uamF2YSBiL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9mb3JtL011bHRpcGxlUHJvcGVydHlTZWxlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E0MTJkMy4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvZm9ybS9NdWx0aXBsZVByb3BlcnR5U2VsZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTYgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi5mb3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklCaW5kaW5nOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUZvcm07Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JTWFya3VwV3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlcXVlc3RDeWNsZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LlRhcGVzdHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuZm9ybS5BYnN0cmFjdEZvcm1Db21wb25lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5mb3JtLklQcm9wZXJ0eVNlbGVjdGlvbk1vZGVsOwotCi0vKioKLSAqICBBIGNvbXBvbmVudCB3aGljaCB1c2VzICZsdDtpbnB1dCB0eXBlPWNoZWNrYm94Jmd0OyB0bwotICogIHNldCBhIHByb3BlcnR5IG9mIHNvbWUgb2JqZWN0LiAgVHlwaWNhbGx5LCB0aGUgdmFsdWVzIGZvciB0aGUgb2JqZWN0Ci0gKiAgYXJlIGRlZmluZWQgdXNpbmcgYW4ge0BsaW5rIG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLmVudW0uRW51bX0uICBBIE11bHRpcGxlUHJvcGVydHlTZWxlY3Rpb24gaXMgZGVwZW5kZW50IG9uCi0gKiAgYW4ge2xpbmsgSVByb3BlcnR5U2VsZWN0aW9uTW9kZWx9IHRvIHByb3ZpZGUgdGhlIGxpc3Qgb2YgcG9zc2libGUgdmFsdWVzLgotICoKLSAqICA8cD5PZnRlbiwgdGhpcyBpcyB1c2VkIHRvIHNlbGVjdCBvbmUgb3IgbW9yZSB7QGxpbmsgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuZW51bS5FbnVtfSB0byBhc3NpZ24gdG8gYSBwcm9wZXJ0eTsgdGhlCi0gKiB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5mb3JtLkVudW1Qcm9wZXJ0eVNlbGVjdGlvbk1vZGVsfSBjbGFzcyBzaW1wbGlmaWVzIHRoaXMuCi0gKiAKLSAqICA8cD5UaGUge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi5wYWxldHRlLlBhbGV0dGV9IGNvbXBvbmVudAotICogIGlzIG1vcmUgcG93ZXJmdWwsIGJ1dCByZXF1aXJlcyBjbGllbnQtc2lkZSBKYXZhU2NyaXB0IGFuZCAKLSAqICBpcyBub3QgZnVsbHkgY3Jvc3MtYnJvd3NlciBjb21wYXRpYmxlLgotICoKLSAqICA8cD4KLSAqCi0gKiA8dGFibGUgYm9yZGVyPTE+Ci0gKiA8dHI+Ci0gKiAgICA8dGQ+UGFyYW1ldGVyPC90ZD4KLSAqICAgIDx0ZD5UeXBlPC90ZD4KLSAqCSAgPHRkPkRpcmVjdGlvbjwvdGQ+Ci0gKiAgICA8dGQ+UmVxdWlyZWQ8L3RkPgotICogICAgPHRkPkRlZmF1bHQ8L3RkPgotICogICAgPHRkPkRlc2NyaXB0aW9uPC90ZD4KLSAqIDwvdHI+Ci0gKgotICogPHRyPgotICoJCTx0ZD5zZWxlY3RlZExpc3Q8L3RkPgotICoJCTx0ZD5qYXZhLnV0aWwuTGlzdDwvdGQ+Ci0gKgkJPHRkPmluLW91dDwvdGQ+Ci0gKgkJPHRkPnllczwvdGQ+Ci0gKgkJPHRkPiZuYnNwOzwvdGQ+Ci0gKgkJPHRkPlRoZSBwcm9wZXJ0eSB0byBzZXQuICBEdXJpbmcgcmVuZGVyaW5nLCB0aGlzIHByb3BlcnR5IGlzIHJlYWQsIGFuZCBzZXRzCi0gKiB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgb3B0aW9ucyBpbiB0aGUgc2VsZWN0LgotICogV2hlbiB0aGUgZm9ybSBpcyBzdWJtaXR0ZWQsIGxpc3QgaXMgY2xlYXJlZCwgdGhlbiBoYXMgZWFjaAotICogc2VsZWN0ZWQgb3B0aW9uIGFkZGVkIHRvIGl0LiA8L3RkPiA8L3RyPgotICoKLSAqIDx0cj4KLSAqCQk8dGQ+cmVuZGVyZXI8L3RkPgotICoJCTx0ZD57QGxpbmsgSU11bHRpcGxlUHJvcGVydHlTZWxlY3Rpb25SZW5kZXJlcn08L3RkPgotICoJCTx0ZD5pbjwvdGQ+Ci0gKgkJPHRkPm5vPC90ZD4KLSAqCQk8dGQ+c2hhcmVkIGluc3RhbmNlIG9mIHtAbGluayBDaGVja0JveE11bHRpcGxlUHJvcGVydHlTZWxlY3Rpb25SZW5kZXJlcn08L3RkPgotICoJCTx0ZD5EZWZpbmVzIHRoZSBvYmplY3QgdXNlZCB0byByZW5kZXIgdGhpcyBjb21wb25lbnQuICBUaGUgZGVmYXVsdAotICogIHJlbmRlcnMgYSB0YWJsZSBvZiBjaGVja2JveGVzLjwvdGQ+PC90cj4KLSAqCi0gKiAgPHRyPgotICoJCTx0ZD5tb2RlbDwvdGQ+Ci0gKgkJPHRkPntAbGluayBJUHJvcGVydHlTZWxlY3Rpb25Nb2RlbH08L3RkPgotICoJCTx0ZD5pbjwvdGQ+Ci0gKgkJPHRkPnllczwvdGQ+Ci0gKgkJPHRkPiZuYnNwOzwvdGQ+Ci0gKgkJPHRkPlRoZSBtb2RlbCBwcm92aWRlcyBhIGxpc3Qgb2YgcG9zc2libGUgbGFiZWxzLCBhbmQgbWF0Y2hlcyB0aG9zZSBsYWJlbHMKLSAqICBhZ2FpbnN0IHBvc3NpYmxlIHZhbHVlcyB0aGF0IGNhbiBiZSBhc3NpZ25lZCBiYWNrIHRvIHRoZSBwcm9wZXJ0eS48L3RkPiA8L3RyPgotICoKLSAqICA8dHI+Ci0gKiAJCTx0ZD5kaXNhYmxlZDwvdGQ+Ci0gKgkJPHRkPmJvb2xlYW48L3RkPgotICoJCTx0ZD5pbjwvdGQ+Ci0gKgkJPHRkPm5vPC90ZD4KLSAqCQk8dGQ+ZmFsc2U8L3RkPgotICoJCTx0ZD5Db250cm9scyB3aGV0aGVyIHRoZSAmbHQ7c2VsZWN0Jmd0OyBpcyBhY3RpdmUgb3Igbm90LiBBIGRpc2FibGVkIFByb3BlcnR5U2VsZWN0aW9uCi0gKiBkb2VzIG5vdCB1cGRhdGUgaXRzIHZhbHVlIHBhcmFtZXRlci4KLSAqCi0gKgkJCTxwPkNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT5kaXNhYmxlZDwvY29kZT4gSFRNTCBhdHRyaWJ1dGUuPC90ZD4KLSAqCTwvdHI+Ci0gKgotICoJPC90YWJsZT4KLSAqCi0gKiA8cD5JbmZvcm1hbCBwYXJhbWV0ZXJzIGFyZSBub3QgYWxsb3dlZC4KLSAqCi0gKgotICogIEB2ZXJzaW9uICRJZCQKLSAqICBAYXV0aG9yIFNhbmpheSBNdW5qYWwKLSAqCi0gKiovCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBNdWx0aXBsZVByb3BlcnR5U2VsZWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RGb3JtQ29tcG9uZW50Ci17Ci0KLSAgICAvKioKLSAgICAgKiAgQSBzaGFyZWQgaW5zdGFuY2Ugb2Yge0BsaW5rIENoZWNrQm94TXVsdGlwbGVQcm9wZXJ0eVNlbGVjdGlvblJlbmRlcmVyfS4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSU11bHRpcGxlUHJvcGVydHlTZWxlY3Rpb25SZW5kZXJlciBERUZBVUxUX0NIRUNLQk9YX1JFTkRFUkVSID0KLSAgICAgICAgbmV3IENoZWNrQm94TXVsdGlwbGVQcm9wZXJ0eVNlbGVjdGlvblJlbmRlcmVyKCk7Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgSUJpbmRpbmcgZ2V0U2VsZWN0ZWRMaXN0QmluZGluZygpOwotCi0gICAgcHJvdGVjdGVkIHZvaWQgZmluaXNoTG9hZCgpCi0gICAgewotICAgICAgICBzZXRSZW5kZXJlcihERUZBVUxUX0NIRUNLQk9YX1JFTkRFUkVSKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0cnVlIGlmIHRoZSBjb21wb25lbnQgaXMgZGlzYWJsZWQgKHRoaXMgaXMgcmVsZXZhbnQgdG8gdGhlCi0gICAgICogIHJlbmRlcmVyKS4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzRGlzYWJsZWQoKTsKLQotICAgIC8qKgotICAgICAqICBSZW5kZXJzIHRoZSBjb21wb25lbnQsIG11Y2ggb2Ygd2hpY2ggaXMgdGhlIHJlc3BvbnNpYmxpdHkKLSAgICAgKiAgb2YgdGhlIHtAbGluayBJTXVsdGlwbGVQcm9wZXJ0eVNlbGVjdGlvblJlbmRlcmVyIHJlbmRlcmVyfS4gIFRoZSBwb3NzaWJsZSBvcHRpb25zLAotICAgICAqICB0aGVpciBsYWJlbHMsIGFuZCB0aGUgdmFsdWVzIHRvIGJlIGVuY29kZWQgaW4gdGhlIGZvcm0gYXJlIHByb3ZpZGVkCi0gICAgICogIGJ5IHRoZSB7QGxpbmsgSVByb3BlcnR5U2VsZWN0aW9uTW9kZWwgbW9kZWx9LgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVuZGVyQ29tcG9uZW50KElNYXJrdXBXcml0ZXIgd3JpdGVyLCBJUmVxdWVzdEN5Y2xlIGN5Y2xlKQotICAgIHsKLSAgICAgICAgSUZvcm0gZm9ybSA9IGdldEZvcm0oY3ljbGUpOwotCi0gICAgICAgIGJvb2xlYW4gcmV3aW5kaW5nID0gZm9ybS5pc1Jld2luZGluZygpOwotCi0gICAgICAgIFN0cmluZyBuYW1lID0gZm9ybS5nZXRFbGVtZW50SWQodGhpcyk7Ci0KLSAgICAgICAgTGlzdCBzZWxlY3RlZExpc3QgPSAoTGlzdCkgZ2V0U2VsZWN0ZWRMaXN0QmluZGluZygpLmdldE9iamVjdCgic2VsZWN0ZWRMaXN0IiwgTGlzdC5jbGFzcyk7Ci0KLSAgICAgICAgaWYgKHNlbGVjdGVkTGlzdCA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgVGFwZXN0cnkuY3JlYXRlUmVxdWlyZWRQYXJhbWV0ZXJFeGNlcHRpb24odGhpcywgInNlbGVjdGVkTGlzdCIpOwotCi0gICAgICAgIElQcm9wZXJ0eVNlbGVjdGlvbk1vZGVsIG1vZGVsID0gZ2V0TW9kZWwoKTsKLQotICAgICAgICBpZiAobW9kZWwgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IFRhcGVzdHJ5LmNyZWF0ZVJlcXVpcmVkUGFyYW1ldGVyRXhjZXB0aW9uKHRoaXMsICJtb2RlbCIpOwotCi0gICAgICAgIC8vIEhhbmRsZSB0aGUgZm9ybSBwcm9jZXNzaW5nIGZpcnN0LgotICAgICAgICBpZiAocmV3aW5kaW5nKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJZiBkaXNhYmxlZCwgaWdub3JlIGFueXRoaW5nIHRoYXQgY29tZXMgdXAgZnJvbSB0aGUgY2xpZW50LgotCi0gICAgICAgICAgICBpZiAoaXNEaXNhYmxlZCgpKQotICAgICAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAgICAgLy8gZ2V0IGFsbCB0aGUgdmFsdWVzCi0gICAgICAgICAgICBTdHJpbmdbXSBvcHRpb25WYWx1ZXMgPSBjeWNsZS5nZXRSZXF1ZXN0Q29udGV4dCgpLmdldFBhcmFtZXRlcnMobmFtZSk7Ci0KLSAgICAgICAgICAgIC8vIENsZWFyIHRoZSBsaXN0Ci0KLSAgICAgICAgICAgIHNlbGVjdGVkTGlzdC5jbGVhcigpOwotCi0gICAgICAgICAgICAvLyBOb3RoaW5nIHdhcyBzZWxlY3RlZAotICAgICAgICAgICAgaWYgKG9wdGlvblZhbHVlcyAhPSBudWxsKQotICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgLy8gR28gdGhyb3VnaCB0aGUgYXJyYXkgYW5kIHRyYW5zbGF0ZSBhbmQgcHV0IGJhY2sgaW4gdGhlIGxpc3QKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG9wdGlvblZhbHVlcy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRyYW5zbGF0ZSB0aGUgbmV3IHZhbHVlCi0gICAgICAgICAgICAgICAgICAgIE9iamVjdCBzZWxlY3RlZFZhbHVlID0gbW9kZWwudHJhbnNsYXRlVmFsdWUob3B0aW9uVmFsdWVzW2ldKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBBZGQgdGhpcyBlbGVtZW50IGluIHRoZSBsaXN0IGJhY2sKLSAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRMaXN0LmFkZChzZWxlY3RlZFZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIElNdWx0aXBsZVByb3BlcnR5U2VsZWN0aW9uUmVuZGVyZXIgcmVuZGVyZXIgPSBnZXRSZW5kZXJlcigpOwotCi0gICAgICAgIC8vIFN0YXJ0IHJlbmRlcmluZwotICAgICAgICByZW5kZXJlci5iZWdpblJlbmRlcih0aGlzLCB3cml0ZXIsIGN5Y2xlKTsKLQotICAgICAgICBpbnQgY291bnQgPSBtb2RlbC5nZXRPcHRpb25Db3VudCgpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgT2JqZWN0IG9wdGlvbiA9IG1vZGVsLmdldE9wdGlvbihpKTsKLQotICAgICAgICAgICAgLy8gVHJ5IHRvIGZpbmQgdGhlIG9wdGlvbiBpbiB0aGUgbGlzdCBhbmQgaWYgeWVzLCB0aGVuIGl0IGlzIGNoZWNrZWQuCi0gICAgICAgICAgICBib29sZWFuIG9wdGlvblNlbGVjdGVkID0gc2VsZWN0ZWRMaXN0LmNvbnRhaW5zKG9wdGlvbik7Ci0KLSAgICAgICAgICAgIHJlbmRlcmVyLnJlbmRlck9wdGlvbih0aGlzLCB3cml0ZXIsIGN5Y2xlLCBtb2RlbCwgb3B0aW9uLCBpLCBvcHRpb25TZWxlY3RlZCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBBIFByb3BlcnR5U2VsZWN0aW9uIGRvZXNuJ3QgYWxsb3cgYSBib2R5LCBzbyBubyBuZWVkIHRvIHdvcnJ5IGFib3V0Ci0gICAgICAgIC8vIHdyYXBwZWQgY29tcG9uZW50cy4KLSAgICAgICAgcmVuZGVyZXIuZW5kUmVuZGVyKHRoaXMsIHdyaXRlciwgY3ljbGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBhYnN0cmFjdCBJUHJvcGVydHlTZWxlY3Rpb25Nb2RlbCBnZXRNb2RlbCgpOwotCi0gICAgcHVibGljIGFic3RyYWN0IElNdWx0aXBsZVByb3BlcnR5U2VsZWN0aW9uUmVuZGVyZXIgZ2V0UmVuZGVyZXIoKTsKLQotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFJlbmRlcmVyKElNdWx0aXBsZVByb3BlcnR5U2VsZWN0aW9uUmVuZGVyZXIgcmVuZGVyZXIpOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL2Zvcm0vTXVsdGlwbGVQcm9wZXJ0eVNlbGVjdGlvbi5qd2MgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvZm9ybS9NdWx0aXBsZVByb3BlcnR5U2VsZWN0aW9uLmp3YwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU5MWNiMi4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvZm9ybS9NdWx0aXBsZVByb3BlcnR5U2VsZWN0aW9uLmp3YworKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAgCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPCEtLSAkSWQkIC0tPgotPCFET0NUWVBFIGNvbXBvbmVudC1zcGVjaWZpY2F0aW9uIFBVQkxJQyAKLSAgIi0vL0FwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLy9UYXBlc3RyeSBTcGVjaWZpY2F0aW9uIDMuMC8vRU4iIAotICAiaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy90YXBlc3RyeS9kdGQvVGFwZXN0cnlfM18wLmR0ZCI+Ci0JCi08Y29tcG9uZW50LXNwZWNpZmljYXRpb24gY2xhc3M9Im9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi5mb3JtLk11bHRpcGxlUHJvcGVydHlTZWxlY3Rpb24iIAotCWFsbG93LWJvZHk9Im5vIiBhbGxvdy1pbmZvcm1hbC1wYXJhbWV0ZXJzPSJubyI+Ci0JCi0gIDxwYXJhbWV0ZXIgbmFtZT0ibW9kZWwiIAotICAJdHlwZT0ib3JnLmFwYWNoZS50YXBlc3RyeS5mb3JtLklQcm9wZXJ0eVNlbGVjdGlvbk1vZGVsIiByZXF1aXJlZD0ieWVzIiBkaXJlY3Rpb249ImluIi8+Ci0gIAkKLSAgPHBhcmFtZXRlciBuYW1lPSJzZWxlY3RlZExpc3QiIHR5cGU9ImphdmEudXRpbC5MaXN0IiByZXF1aXJlZD0ieWVzIi8+Ci0gIAotICA8cGFyYW1ldGVyIG5hbWU9ImRpc2FibGVkIiB0eXBlPSJib29sZWFuIiBkaXJlY3Rpb249ImluIi8+Ci0gIAotICA8cGFyYW1ldGVyIG5hbWU9InJlbmRlcmVyIiAKLSAgCXR5cGU9Im9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi5mb3JtLklNdWx0aXBsZVByb3BlcnR5U2VsZWN0aW9uUmVuZGVyZXIiCi0gIAlkaXJlY3Rpb249ImluIi8+Ci0gIAkKLSAgPHByb3BlcnR5LXNwZWNpZmljYXRpb24gbmFtZT0ibmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgotICA8cHJvcGVydHktc3BlY2lmaWNhdGlvbiBuYW1lPSJmb3JtIiB0eXBlPSJvcmcuYXBhY2hlLnRhcGVzdHJ5LklGb3JtIi8+Ci0gIAotPC9jb21wb25lbnQtc3BlY2lmaWNhdGlvbj4KZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9pbmZvcm1hbC9Jbmhlcml0SW5mb3JtYWxBbnkuamF2YSBiL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9pbmZvcm1hbC9Jbmhlcml0SW5mb3JtYWxBbnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjUwZDRiOS4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvaW5mb3JtYWwvSW5oZXJpdEluZm9ybWFsQW55LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi5pbmZvcm1hbDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5BYnN0cmFjdENvbXBvbmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklBc3NldDsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklCaW5kaW5nOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUNvbXBvbmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklNYXJrdXBXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVxdWVzdEN5Y2xlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuc3BlYy5JQ29tcG9uZW50U3BlY2lmaWNhdGlvbjsKLQotLyoqCi0gKiAKLSAqICBBIHZlcnNpb24gb2YgdGhlIEFueSBjb21wb25lbnQgdGhhdCBpbmhlcml0cyB0aGUgaW5mb3JtYWwgYXR0cmlidXRlcyBvZiBpdHMgcGFyZW50LgotICogIFRoaXMgY29tcG9uZW50IGhhcyBiZWVuIGRlcHJlY2F0ZWQgaW4gZmF2b3VyIG9mIHRoZSAnaW5oZXJpdC1pbmZvcm1hbC1wYXJhbWV0ZXJzJyAKLSAqICB0YWcgdGhhdCBpbmRpY2F0ZXMgdGhhdCBhIHBhcnRpY3VsYXIgY29tcG9uZW50IG11c3QgaW5oZXJpdCB0aGUgaW5mb3JtYWwgcGFyYW1ldGVycwotICogIG9mIGl0cyBwYXJlbnQuIFRoaXMgdGFnIGlzIGF2YWlsYWJsZSBpbiB0aGUgcGFnZSBvciBjb21wb25lbnQgc3BlY2lmaWNhdGlvbiBmaWxlLgotICogCi0gKiAgQGRlcHJlY2F0ZWQKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQGF1dGhvciBtaW5kYnJpZGdlCi0gKiAgQHNpbmNlIDIuMgotICogCi0gKiovCi0KLXB1YmxpYyBjbGFzcyBJbmhlcml0SW5mb3JtYWxBbnkgZXh0ZW5kcyBBYnN0cmFjdENvbXBvbmVudAotewotICAgIC8vIEJpbmRpbmdzCi0gICAgcHJpdmF0ZSBJQmluZGluZyBtX29iakVsZW1lbnRCaW5kaW5nOwotCi0gICAgcHVibGljIElCaW5kaW5nIGdldEVsZW1lbnRCaW5kaW5nKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX29iakVsZW1lbnRCaW5kaW5nOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEVsZW1lbnRCaW5kaW5nKElCaW5kaW5nIG9iakVsZW1lbnRCaW5kaW5nKQotICAgIHsKLSAgICAgICAgbV9vYmpFbGVtZW50QmluZGluZyA9IG9iakVsZW1lbnRCaW5kaW5nOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGdlbmVyYXRlUGFyZW50QXR0cmlidXRlcyhJTWFya3VwV3JpdGVyIHdyaXRlciwgSVJlcXVlc3RDeWNsZSBjeWNsZSkKLSAgICB7Ci0gICAgICAgIFN0cmluZyBhdHRyaWJ1dGU7Ci0KLSAgICAgICAgSUNvbXBvbmVudCBvYmpQYXJlbnQgPSBnZXRDb250YWluZXIoKTsKLSAgICAgICAgaWYgKG9ialBhcmVudCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIElDb21wb25lbnRTcGVjaWZpY2F0aW9uIHNwZWNpZmljYXRpb24gPSBvYmpQYXJlbnQuZ2V0U3BlY2lmaWNhdGlvbigpOwotICAgICAgICBNYXAgYmluZGluZ3MgPSBvYmpQYXJlbnQuZ2V0QmluZGluZ3MoKTsKLSAgICAgICAgaWYgKGJpbmRpbmdzID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgSXRlcmF0b3IgaSA9IGJpbmRpbmdzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLQotICAgICAgICB3aGlsZSAoaS5oYXNOZXh0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGkubmV4dCgpOwotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBlbnRyeS5nZXRLZXkoKTsKLQotICAgICAgICAgICAgLy8gU2tpcCBvdmVyIGZvcm1hbCBwYXJhbWV0ZXJzIHN0b3JlZCBpbiB0aGUgYmluZGluZ3MKLSAgICAgICAgICAgIC8vIE1hcC4gIFdlJ3JlIGp1c3QgaW50ZXJlc3RlZCBpbiBpbmZvcm1hbCBwYXJhbWV0ZXJzLgotCi0gICAgICAgICAgICBpZiAoc3BlY2lmaWNhdGlvbi5nZXRQYXJhbWV0ZXIobmFtZSkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgICAgSUJpbmRpbmcgYmluZGluZyA9IChJQmluZGluZykgZW50cnkuZ2V0VmFsdWUoKTsKLQotICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gYmluZGluZy5nZXRPYmplY3QoKTsKLSAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBJQXNzZXQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgSUFzc2V0IGFzc2V0ID0gKElBc3NldCkgdmFsdWU7Ci0KLSAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIFVSTCBvZiB0aGUgYXNzZXQgYW5kIGluc2VydCB0aGF0LgotICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSA9IGFzc2V0LmJ1aWxkVVJMKGN5Y2xlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgPSB2YWx1ZS50b1N0cmluZygpOwotCi0gICAgICAgICAgICB3cml0ZXIuYXR0cmlidXRlKG5hbWUsIGF0dHJpYnV0ZSk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbmRlckNvbXBvbmVudChJTWFya3VwV3JpdGVyIHdyaXRlciwgSVJlcXVlc3RDeWNsZSBjeWNsZSkKLSAgICB7Ci0gICAgICAgIFN0cmluZyBzdHJFbGVtZW50ID0gbV9vYmpFbGVtZW50QmluZGluZy5nZXRPYmplY3QoKS50b1N0cmluZygpOwotCi0gICAgICAgIHdyaXRlci5iZWdpbihzdHJFbGVtZW50KTsKLSAgICAgICAgZ2VuZXJhdGVQYXJlbnRBdHRyaWJ1dGVzKHdyaXRlciwgY3ljbGUpOwotICAgICAgICByZW5kZXJJbmZvcm1hbFBhcmFtZXRlcnMod3JpdGVyLCBjeWNsZSk7Ci0KLSAgICAgICAgcmVuZGVyQm9keSh3cml0ZXIsIGN5Y2xlKTsKLQotICAgICAgICB3cml0ZXIuZW5kKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvaW5mb3JtYWwvSW5oZXJpdEluZm9ybWFsQW55Lmp3YyBiL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9pbmZvcm1hbC9Jbmhlcml0SW5mb3JtYWxBbnkuandjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWQ5ZWIxLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9pbmZvcm1hbC9Jbmhlcml0SW5mb3JtYWxBbnkuandjCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICAKLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08IS0tICAkSWQkIC0tPgotPCFET0NUWVBFIGNvbXBvbmVudC1zcGVjaWZpY2F0aW9uIFBVQkxJQyAKLSAgIi0vL0FwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLy9UYXBlc3RyeSBTcGVjaWZpY2F0aW9uIDMuMC8vRU4iIAotICAiaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy90YXBlc3RyeS9kdGQvVGFwZXN0cnlfM18wLmR0ZCI+Ci0KLTxjb21wb25lbnQtc3BlY2lmaWNhdGlvbiBjbGFzcz0ib3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLmluZm9ybWFsLkluaGVyaXRJbmZvcm1hbEFueSIgYWxsb3ctYm9keT0ieWVzIiBhbGxvdy1pbmZvcm1hbC1wYXJhbWV0ZXJzPSJ5ZXMiPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iZWxlbWVudCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgcmVxdWlyZWQ9InllcyIgZGlyZWN0aW9uPSJjdXN0b20iLz4KLTwvY29tcG9uZW50LXNwZWNpZmljYXRpb24+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL2luc3BlY3Rvci9FbmdpbmVfSFJwNC5naWYgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvaW5zcGVjdG9yL0VuZ2luZV9IUnA0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJmZjVlYy4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvaW5zcGVjdG9yL0VuZ2luZV9IUnA0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9pbnNwZWN0b3IvRW5naW5lX0hwMy5naWYgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvaW5zcGVjdG9yL0VuZ2luZV9IcDMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjI4NjBkLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9pbnNwZWN0b3IvRW5naW5lX0hwMy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvaW5zcGVjdG9yL0VuZ2luZV9OQmFubmVyLmdpZiBiL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9pbnNwZWN0b3IvRW5naW5lX05CYW5uZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTA1YTFiLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9pbnNwZWN0b3IvRW5naW5lX05CYW5uZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL2luc3BlY3Rvci9FbmdpbmVfTlJwMi5naWYgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvaW5zcGVjdG9yL0VuZ2luZV9OUnAyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU5MDk5Ni4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvaW5zcGVjdG9yL0VuZ2luZV9OUnAyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9pbnNwZWN0b3IvRW5naW5lX05wMS5naWYgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvaW5zcGVjdG9yL0VuZ2luZV9OcDEuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGVlNThjLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9pbnNwZWN0b3IvRW5naW5lX05wMS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvaW5zcGVjdG9yL0luc3BlY3Rvci5jc3MgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvaW5zcGVjdG9yL0luc3BlY3Rvci5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4ODUyYjAuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL2luc3BlY3Rvci9JbnNwZWN0b3IuY3NzCisrKyAvZGV2L251bGwKQEAgLTEsMjAxICswLDAgQEAKLUgxICB7DQotCWZvbnQtc2l6ZTogMTJwdDsNCi0JZm9udC13ZWlnaHQ6IGJvbGQ7DQotDQotfQ0KLQ0KLUgyICB7fQ0KLQ0KLUgzICB7fQ0KLQ0KLUEgIHsNCi0JY29sb3I6I2ZmZmZmZjsNCi19DQotDQotQTpWaXNpdGVkICB7fQ0KLQ0KLUE6QWN0aXZlICB7fQ0KLQ0KLUE6SG92ZXIgIHt9DQotDQotU1BBTi5lcnJvcg0KLXsNCi0JCWNvbG9yOiBSZWQ7DQotCQlmb250LXdlaWdodDogYm9sZDsNCi0JYmFja2dyb3VuZC1jb2xvciA6ICIjMzMwMDY2IgkJDQotfQ0KLQ0KLUJPRFkgIHsNCi0JZm9udC1mYW1pbHk6ICJUcmVidWNoZXQgTVMiLCBzYW5zLXNlcmlmOw0KLQkgYmFja2dyb3VuZC1jb2xvcjogIzgzOWNkMTsNCi19DQotDQotDQotVEFCTEUuaW5zcGVjdG9yLWRhdGEgVFIub2RkIFREICB7DQotCXRleHQtYWxpZ24gOiBsZWZ0Ow0KLQljb2xvciA6IEJsYWNrOw0KLQliYWNrZ3JvdW5kLWNvbG9yIDogU2lsdmVyOw0KLX0NCi0NCi0NCi1UQUJMRS5pbnNwZWN0b3ItZGF0YSBUUi5ldmVuIFRIDQotew0KLQl0ZXh0LWFsaWduIDogcmlnaHQ7DQotCWZvbnQtd2VpZ2h0OiBib2xkOw0KLX0NCi0NCi1UQUJMRS5pbnNwZWN0b3ItZGF0YSBUUi5vZGQgVEgNCi17DQotCXRleHQtYWxpZ246IHJpZ2h0Ow0KLQljb2xvciA6IEJsYWNrOw0KLQliYWNrZ3JvdW5kLWNvbG9yIDogU2lsdmVyOw0KLQlmb250LXdlaWdodDogYm9sZDsNCi19DQotDQotVEFCTEUuaW5zcGVjdG9yLWRhdGEgVFIuZXZlbiBURCAgew0KLQl0ZXh0LWFsaWduIDogbGVmdDsNCi19DQotDQotVEFCTEUuaW5zcGVjdG9yLWRhdGEsDQotVEFCTEUuc2VsZWN0b3INCi17DQotCWZvbnQtc2l6ZTogOXB0Ow0KLX0NCi0NCi1UQUJMRS5zZWxlY3RvciBURC5wYWdlLWxpbmsNCi17DQotCWZvbnQtc3R5bGU6IGl0YWxpYzsNCi19DQotDQotVEFCTEUuc2VsZWN0b3IgVEQNCi17DQotCXZlcnRpY2xlLWFsaWduOiBjZW50ZXI7DQotfQ0KLQ0KLVRBQkxFLmluc3BlY3Rvci1kYXRhIFRSLmhlYWRpbmcgVEgsDQotVEFCTEUudGVtcGxhdGUgVEgNCi17DQotCXRleHQtYWxpZ246IGNlbnRlcjsNCi0JY29sb3IgOiBXaGl0ZTsNCi0JYmFja2dyb3VuZC1jb2xvciA6ICIjMzMwMDY2IjsNCi0JZm9udC13ZWlnaHQ6IGJvbGQ7DQotfQ0KLQ0KLVRBQkxFLnRlbXBsYXRlIFREDQotew0KLQliYWNrZ3JvdW5kLWNvbG9yOiBTaWx2ZXI7DQotCWZvbnQtc2l6ZTogc21hbGw7DQotfQ0KLQ0KLVNQQU4ubWVzc2FnZQ0KLXsNCi0JY29sb3IgOiBTaWx2ZXINCi0JZm9udC1zaXplOiBsYXJnZTsNCi19DQotDQotU1BBTi5qd2MtdGFnDQotew0KLQlmb250LXdlaWdodDogYm9sZDsNCi19DQotDQotU1BBTi5qd2MtaWQsIFNQQU4ubG9jYWxpemVkLXN0cmluZw0KLXsNCi0JZm9udC1zdHlsZTogaXRhbGljOw0KLX0NCi0NCi0NCi0NCi1UQUJMRS5yZXF1ZXN0LWNvbnRleHQtYm9yZGVyICB7DQotCWJvcmRlci13aWR0aCA6IDE7DQotCWJvcmRlci1jb2xvciA6IEJsYWNrOw0KLQlmb250LXNpemU6IDlwdDsNCi19DQotDQotU1BBTi5yZXF1ZXN0LWNvbnRleHQtb2JqZWN0ICB7DQotCWZvbnQtd2VpZ2h0IDogYm9sZDsNCi0JdGV4dC1hbGlnbiA6IGxlZnQ7DQotCWZvbnQtc2l6ZTogMTJwdDsNCi19DQotDQotVFIucmVxdWVzdC1jb250ZXh0LXNlY3Rpb24gVEggIHsNCi0JdGV4dC1hbGlnbiA6IGNlbnRlcjsNCi0JY29sb3IgOiBXaGl0ZTsNCi0JYmFja2dyb3VuZC1jb2xvciA6IEJsdWU7DQotfQ0KLQ0KLVRSLnJlcXVlc3QtY29udGV4dC1oZWFkZXIgVEggIHsNCi0JdGV4dC1hbGlnbiA6IGNlbnRlcjsNCi0JY29sb3IgOiBXaGl0ZTsNCi0JYmFja2dyb3VuZC1jb2xvciA6IEJsdWU7DQotfQ0KLQ0KLVRBQkxFLnJlcXVlc3QtY29udGV4dC1vYmplY3QgVFIub2RkIFREICB7DQotCXRleHQtYWxpZ24gOiBsZWZ0Ow0KLQljb2xvciA6IEJsYWNrOw0KLQliYWNrZ3JvdW5kLWNvbG9yIDogU2lsdmVyOw0KLX0NCi0NCi1UQUJMRS5yZXF1ZXN0LWNvbnRleHQtb2JqZWN0IFRSLm9kZCBUSCAgew0KLQljb2xvciA6IEJsYWNrOw0KLQliYWNrZ3JvdW5kLWNvbG9yIDogU2lsdmVyOw0KLQl0ZXh0LWFsaWduIDogcmlnaHQ7DQotfQ0KLQ0KLVRBQkxFLnJlcXVlc3QtY29udGV4dC1vYmplY3QgVFIuZXZlbiBURCAgew0KLQl0ZXh0LWFsaWduIDogbGVmdDsNCi19DQotDQotVEFCTEUucmVxdWVzdC1jb250ZXh0LW9iamVjdCBUUi5ldmVuIFRIICB7DQotCXRleHQtYWxpZ24gOiByaWdodDsNCi19DQotDQotVEFCTEUucmVxdWVzdC1jb250ZXh0LW9iamVjdCAgew0KLQl3aWR0aCA6IDEwMCU7DQotCWZvbnQtc2l6ZTogOXB0Ow0KLX0NCi0NCi1UQUJMRS5yZXF1ZXN0LWNvbnRleHQtb2JqZWN0IFRSICB7DQotCXZlcnRpY2FsLWFsaWduIDogdGV4dC10b3A7DQotfQ0KLQ0KLVRBQkxFLmV4Y2VwdGlvbi1kaXNwbGF5IFRSLmV2ZW4gIHsNCi0JdG9wIDogYXV0bzsNCi19DQotDQotVEFCTEUuZXhjZXB0aW9uLWRpc3BsYVkgVEQNCi17DQotCXdpZHRoOiAxMDAlOw0KLX0NCi0NCi1UQUJMRS5leGNlcHRpb24tZGlzcGxheSBUUi5ldmVuIFRIICB7DQotCXRleHQtYWxpZ24gOiByaWdodDsNCi0JZm9udC13ZWlnaHQgOiBib2xkOw0KLX0NCi0NCi1UQUJMRS5leGNlcHRpb24tZGlzcGxheSBUUi5vZGQgVEQgIHsNCi0JdGV4dC1hbGlnbiA6IGxlZnQ7DQotCWJhY2tncm91bmQtY29sb3IgOiBTaWx2ZXI7DQotfQ0KLQ0KLVRBQkxFLmV4Y2VwdGlvbi1kaXNwbGF5IFRSLm9kZCBUSCAgew0KLQl0ZXh0LWFsaWduIDogcmlnaHQ7DQotCWZvbnQtd2VpZ2h0IDogYm9sZDsNCi0JYmFja2dyb3VuZC1jb2xvciA6IFNpbHZlcjsJDQotfQ0KLQ0KLVRBQkxFLmV4Y2VwdGlvbi1kaXNwbGF5IFRSLmV2ZW4gVEQgIHsNCi0JdGV4dC1hbGlnbiA6IGxlZnQ7DQotfQ0KLQ0KLVRBQkxFLmV4Y2VwdGlvbi1kaXNwbGF5IFRSLnN0YWNrLXRyYWNlICB7DQotCWZvbnQtc2l6ZSA6IHNtYWxsOw0KLQlmb250LWZhbWlseSA6IHNhbnMtc2VyaWY7DQotCXRleHQtYWxpZ24gOiBsZWZ0Ow0KLX0NCi0NCi1VTCANCi17DQotCW1hcmdpbi10b3A6IDBweDsNCi0JbWFyZ2luLWJvdHRvbTogMHB4Ow0KLQltYXJnaW4tbGVmdDogMjBweDsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL2luc3BlY3Rvci9JbnNwZWN0b3IuaHRtbCBiL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9pbnNwZWN0b3IvSW5zcGVjdG9yLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyZDE2ZDYuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL2luc3BlY3Rvci9JbnNwZWN0b3IuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTwhLS0gJElkJCAtLT4KLTxzcGFuIGp3Y2lkPSJAU2hlbGwiIHRpdGxlPSJvZ25sOmluc3BlY3RvclRpdGxlIiBzdHlsZXNoZWV0PSJvZ25sOmFzc2V0cy5zdHlsZXNoZWV0Ij4KLTxib2R5IGp3Y2lkPSJAQm9keSI+Ci0KLTxzcGFuIGp3Y2lkPSJAaW5zcGVjdG9yOlNlbGVjdG9yIj4KLQotPHNwYW4gandjaWQ9IkBpbnNwZWN0b3I6Vmlld1RhYnMiPgotCi08c3BhbiBqd2NpZD0iQFJlbmRlckJsb2NrIiBibG9jaz0ib2dubDpibG9ja0ZvclZpZXciLz4KLQotPC9zcGFuPgotPC9zcGFuPgotCi08c3BhbiBqd2NpZD0ic3BlY2lmaWNhdGlvbkJsb2NrQEJsb2NrIj4KLTxzcGFuIGp3Y2lkPSJAaW5zcGVjdG9yOlNob3dTcGVjaWZpY2F0aW9uIi8+Ci08L3NwYW4+Ci0KLTxzcGFuIGp3Y2lkPSJ0ZW1wbGF0ZUJsb2NrQEJsb2NrIj4KLTxzcGFuIGp3Y2lkPSJAaW5zcGVjdG9yOlNob3dUZW1wbGF0ZSIvPgotPC9zcGFuPgotCi08c3BhbiBqd2NpZD0icHJvcGVydGllc0Jsb2NrQEJsb2NrIj4KLTxzcGFuIGp3Y2lkPSJAaW5zcGVjdG9yOlNob3dQcm9wZXJ0aWVzIi8+Ci08L3NwYW4+Ci0KLTxzcGFuIGp3Y2lkPSJlbmdpbmVCbG9ja0BCbG9jayI+Ci08c3BhbiBqd2NpZD0iQGluc3BlY3RvcjpTaG93RW5naW5lIi8+Ci08L3NwYW4+Ci0KLTwvYm9keT4KLTwvc3Bhbj4KZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9pbnNwZWN0b3IvSW5zcGVjdG9yLmphdmEgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvaW5zcGVjdG9yL0luc3BlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzFlODkzLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9pbnNwZWN0b3IvSW5zcGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi5pbnNwZWN0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JQ29tcG9uZW50OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVBhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVxdWVzdEN5Y2xlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuY29tcG9uZW50cy5CbG9jazsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5Lmh0bWwuQmFzZVBhZ2U7Ci0KLS8qKgotICogIFRoZSBUYXBlc3RyeSBJbnNwZWN0b3IgcGFnZS4KLSAqCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogIEB2ZXJzaW9uICRJZCQKLSAqKi8KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEluc3BlY3RvciBleHRlbmRzIEJhc2VQYWdlCi17Ci0gICAgcHJpdmF0ZSBNYXAgX2Jsb2NrcyA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBmaW5pc2hMb2FkKCkKLSAgICB7Ci0gICAgICAgIF9ibG9ja3MucHV0KFZpZXcuVEVNUExBVEUsIGdldENvbXBvbmVudCgidGVtcGxhdGVCbG9jayIpKTsKLSAgICAgICAgX2Jsb2Nrcy5wdXQoVmlldy5TUEVDSUZJQ0FUSU9OLCBnZXRDb21wb25lbnQoInNwZWNpZmljYXRpb25CbG9jayIpKTsKLSAgICAgICAgX2Jsb2Nrcy5wdXQoVmlldy5FTkdJTkUsIGdldENvbXBvbmVudCgiZW5naW5lQmxvY2siKSk7Ci0gICAgICAgIF9ibG9ja3MucHV0KFZpZXcuUFJPUEVSVElFUywgZ2V0Q29tcG9uZW50KCJwcm9wZXJ0aWVzQmxvY2siKSk7Ci0gICAgfQotCi0gICAgcHVibGljIGFic3RyYWN0IFZpZXcgZ2V0VmlldygpOwotCi0gICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0VmlldyhWaWV3IHZhbHVlKTsKLQotICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0SW5zcGVjdGVkUGFnZU5hbWUoKTsKLSAgICAKLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRJbnNwZWN0ZWRQYWdlTmFtZShTdHJpbmcgdmFsdWUpOwotCi0gICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRJbnNwZWN0ZWRJZFBhdGgoKTsKLQotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEluc3BlY3RlZElkUGF0aChTdHJpbmcgdmFsdWUpOwotCi0gICAgLyoqIAotICAgICAqICBJbnZva2VkIHRvIGNoYW5nZSB0aGUgY29tcG9uZW50IGJlaW5nIGluc3BlY3RlZCB3aXRoaW4gdGhlIGN1cnJlbnQKLSAgICAgKiAgcGFnZS4KLSAgICAgKgotICAgICAqICBAc2luY2UgMS4wLjYKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCBzZWxlY3RDb21wb25lbnQoU3RyaW5nIGlkUGF0aCkKLSAgICB7Ci0gICAgICAgIHNldEluc3BlY3RlZElkUGF0aChpZFBhdGgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBNZXRob2QgaW52b2tlZCBieSB0aGUge0BsaW5rIEluc3BlY3RvckJ1dHRvbn0gY29tcG9uZW50LCAKLSAgICAgKiAgdG8gYmVnaW4gaW5zcGVjdGluZyBhIHBhZ2UuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCBpbnNwZWN0KFN0cmluZyBwYWdlTmFtZSwgSVJlcXVlc3RDeWNsZSBjeWNsZSkKLSAgICB7Ci0gICAgICAgIHNldEluc3BlY3RlZFBhZ2VOYW1lKHBhZ2VOYW1lKTsKLSAgICAgICAgc2VsZWN0Q29tcG9uZW50KChTdHJpbmcpIG51bGwpOwotCi0gICAgICAgIGN5Y2xlLmFjdGl2YXRlKHRoaXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBMaXN0ZW5lciBmb3IgdGhlIGNvbXBvbmVudCBzZWxlY3Rpb24sIHdoaWNoIGFsbG93cyBhIHBhcnRpY3VsYXIgY29tcG9uZW50LiAgCi0gICAgICogIAotICAgICAqICA8cD5UaGUgY29udGV4dCBpcyBhIHNpbmdsZSBzdHJpbmcsCi0gICAgICogIHRoZSBpZCBwYXRoIG9mIHRoZSBjb21wb25lbnQgdG8gYmUgc2VsZWN0ZWQgKG9yIG51bGwgdG8gaW5zcGVjdAotICAgICAqICB0aGUgcGFnZSBpdHNlbGYpLiAgVGhpcyBpbnZva2VzCi0gICAgICogIHtAbGluayAjc2VsZWN0Q29tcG9uZW50KFN0cmluZyl9LgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgc2VsZWN0Q29tcG9uZW50KElSZXF1ZXN0Q3ljbGUgY3ljbGUpCi0gICAgewotICAgICAgICBPYmplY3RbXSBwYXJhbWV0ZXJzID0gY3ljbGUuZ2V0U2VydmljZVBhcmFtZXRlcnMoKTsKLQotICAgICAgICBTdHJpbmcgbmV3SWRQYXRoOwotCi0gICAgICAgIC8vIFRoZSB1cCBidXR0b24gbWF5IGdlbmVyYXRlIGEgbnVsbCBjb250ZXh0LgotCi0gICAgICAgIGlmIChwYXJhbWV0ZXJzID09IG51bGwpCi0gICAgICAgICAgICBuZXdJZFBhdGggPSBudWxsOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBuZXdJZFBhdGggPSAoU3RyaW5nKSBwYXJhbWV0ZXJzWzBdOwotCi0gICAgICAgIHNlbGVjdENvbXBvbmVudChuZXdJZFBhdGgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIHRoZSB7QGxpbmsgSVBhZ2V9IGN1cnJlbnRseSBpbnNwZWN0ZWQgYnkgdGhlIEluc3BlY3RvciwgYXMgZGV0ZXJtaW5lZAotICAgICAqICBmcm9tIHRoZSBpbnNwZWN0ZWRQYWdlTmFtZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBJUGFnZSBnZXRJbnNwZWN0ZWRQYWdlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRSZXF1ZXN0Q3ljbGUoKS5nZXRQYWdlKGdldEluc3BlY3RlZFBhZ2VOYW1lKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIHRoZSB7QGxpbmsgSUNvbXBvbmVudH0gY3VycmVudCBpbnNwZWN0ZWQ7IHRoaXMgaXMgZGV0ZXJtaW5lZAotICAgICAqICBmcm9tIHRoZSBpbnNwZWN0ZWRQYWdlTmFtZSBhbmQgaW5zcGVjdGVkSWRQYXRoIHByb3BlcnRpZXMuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgSUNvbXBvbmVudCBnZXRJbnNwZWN0ZWRDb21wb25lbnQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldEluc3BlY3RlZFBhZ2UoKS5nZXROZXN0ZWRDb21wb25lbnQoZ2V0SW5zcGVjdGVkSWRQYXRoKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5zcGVjdG9yVGl0bGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICJUYXBlc3RyeSBJbnNwZWN0b3I6ICIgKyBnZXRFbmdpbmUoKS5nZXRTcGVjaWZpY2F0aW9uKCkuZ2V0TmFtZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIHRoZSB7QGxpbmsgQmxvY2t9IGZvciB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHZpZXcuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgQmxvY2sgZ2V0QmxvY2tGb3JWaWV3KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoQmxvY2spIF9ibG9ja3MuZ2V0KGdldFZpZXcoKSk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9pbnNwZWN0b3IvSW5zcGVjdG9yLmxpYnJhcnkgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvaW5zcGVjdG9yL0luc3BlY3Rvci5saWJyYXJ5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2UxNzJhLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9pbnNwZWN0b3IvSW5zcGVjdG9yLmxpYnJhcnkKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICAKLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08IS0tIEluc3BlY3Rvci5saWJyYXJ5LHYgMS4xIDIwMDIvMDgvMjQgMTY6MDc6NTAgaHNoaXAgRXhwIC0tPgotPCFET0NUWVBFIGxpYnJhcnktc3BlY2lmaWNhdGlvbiBQVUJMSUMgCi0gICItLy9BcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi8vVGFwZXN0cnkgU3BlY2lmaWNhdGlvbiAzLjAvL0VOIiAKLSAgImh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvdGFwZXN0cnkvZHRkL1RhcGVzdHJ5XzNfMC5kdGQiPgotCQotPGxpYnJhcnktc3BlY2lmaWNhdGlvbi8+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL2luc3BlY3Rvci9JbnNwZWN0b3IucGFnZSBiL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9pbnNwZWN0b3IvSW5zcGVjdG9yLnBhZ2UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzYjg4YTQuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL2luc3BlY3Rvci9JbnNwZWN0b3IucGFnZQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAgCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPCEtLSAkSWQkIC0tPgotPCFET0NUWVBFIHBhZ2Utc3BlY2lmaWNhdGlvbiBQVUJMSUMgCi0gICItLy9BcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi8vVGFwZXN0cnkgU3BlY2lmaWNhdGlvbiAzLjAvL0VOIiAKLSAgImh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvdGFwZXN0cnkvZHRkL1RhcGVzdHJ5XzNfMC5kdGQiPgotCQotPHBhZ2Utc3BlY2lmaWNhdGlvbiBjbGFzcz0ib3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLmluc3BlY3Rvci5JbnNwZWN0b3IiPgotCi0gIDxwcm9wZXJ0eS1zcGVjaWZpY2F0aW9uIG5hbWU9InZpZXciIHR5cGU9Im9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi5pbnNwZWN0b3IuVmlldyIKLSAgCQlwZXJzaXN0ZW50PSJ5ZXMiCi0gIAkJaW5pdGlhbC12YWx1ZT0iQG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi5pbnNwZWN0b3IuVmlld0BTUEVDSUZJQ0FUSU9OIi8+Ci0gIDxwcm9wZXJ0eS1zcGVjaWZpY2F0aW9uIG5hbWU9Imluc3BlY3RlZFBhZ2VOYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIiBwZXJzaXN0ZW50PSJ5ZXMiLz4KLSAgPHByb3BlcnR5LXNwZWNpZmljYXRpb24gbmFtZT0iaW5zcGVjdGVkSWRQYXRoIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIiBwZXJzaXN0ZW50PSJ5ZXMiLz4KLSAgCi0gIDxwcml2YXRlLWFzc2V0IG5hbWU9InN0eWxlc2hlZXQiIHJlc291cmNlLXBhdGg9Ikluc3BlY3Rvci5jc3MiLz4KLQotPC9wYWdlLXNwZWNpZmljYXRpb24+CmRpZmYgLS1naXQgYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvaW5zcGVjdG9yL0luc3BlY3RvckJ1dHRvbi5odG1sIGIvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL2luc3BlY3Rvci9JbnNwZWN0b3JCdXR0b24uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWEzOGU1NS4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvaW5zcGVjdG9yL0luc3BlY3RvckJ1dHRvbi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotPCEtLSAkSWQkIC0tPgotCi08c3BhbiBqd2NpZD0iJGNvbnRlbnQkIj4KLQotPGRpdiBpZD0idGFwZXN0cnlJbnNwZWN0b3IiIHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTsgYm9yZGVyLWNvbG9yOmJsYWNrOyBib3JkZXItd2lkdGg6MnB4OyBib3JkZXItc3R5bGU6c29saWQ7IHBhZGRpbmc6M3B4OyBiYWNrZ3JvdW5kLWNvbG9yOiM4MzljZDE7Ij4KLTxhIGp3Y2lkPSJsaW5rIj48aW1nIGp3Y2lkPSJyb2xsb3ZlciIvPjwvYT4KLTwvZGl2PgotCi08L3NwYW4+Ci0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9pbnNwZWN0b3IvSW5zcGVjdG9yQnV0dG9uLmphdmEgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvaW5zcGVjdG9yL0luc3BlY3RvckJ1dHRvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmQ1MTJkLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9pbnNwZWN0b3IvSW5zcGVjdG9yQnV0dG9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi5pbnNwZWN0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5BcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5CYXNlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSURpcmVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklFbmdpbmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JTWFya3VwV3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlcXVlc3RDeWNsZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZXNvdXJjZUxvY2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVNjcmlwdDsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LlRhcGVzdHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuZW5naW5lLklFbmdpbmVTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuZW5naW5lLklMaW5rOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuZW5naW5lLklTY3JpcHRTb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5odG1sLkJvZHk7Ci0KLS8qKgotICogIENvbXBvbmVudCB0aGF0IGNhbiBiZSBwbGFjZWQgaW50byBhcHBsaWNhdGlvbiBwYWdlcyB0aGF0IHdpbGwgbGF1bmNoCi0gKiAgdGhlIGluc3BlY3RvciBpbiBhIG5ldyB3aW5kb3cuCi0gKiAKLSAqICBbPGEgaHJlZj0iLi4vLi4vLi4vLi4vLi4vLi4vQ29tcG9uZW50UmVmZXJlbmNlL0luc3BlY3RvckJ1dHRvbi5odG1sIj5Db21wb25lbnQgUmVmZXJlbmNlPC9hPl0KLSAqCi0gKiAgPHA+QmVjYXVzZSB0aGUgSW5zcGVjdG9yQnV0dG9uIGNvbXBvbmVudCBpcyBpbXBsZW1lbnRlZCB1c2luZyBhIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5Lmh0bWwuUm9sbG92ZXJ9LAotICogIHRoZSBjb250YWluaW5nIHBhZ2UgbXVzdCB1c2UgYSB7QGxpbmsgQm9keX0gY29tcG9uZW50IGluc3RlYWQgb2YKLSAqICBhICZsdDtib2R5Jmd0OyB0YWcuCi0gKgotICogIEB2ZXJzaW9uICRJZCQKLSAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKgotICoqLwotCi1wdWJsaWMgY2xhc3MgSW5zcGVjdG9yQnV0dG9uIGV4dGVuZHMgQmFzZUNvbXBvbmVudCBpbXBsZW1lbnRzIElEaXJlY3QKLXsKLSAgICBwcml2YXRlIGJvb2xlYW4gX2Rpc2FibGVkID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiAgR2V0cyB0aGUgbGlzdGVuZXIgZm9yIHRoZSBsaW5rIGNvbXBvbmVudC4KLSAgICAgKgotICAgICAqICBAc2luY2UgMS4wLjUKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCB0cmlnZ2VyKElSZXF1ZXN0Q3ljbGUgY3ljbGUpCi0gICAgewotICAgICAgICBTdHJpbmcgbmFtZSA9IGdldE5hbWVzcGFjZSgpLmNvbnN0cnVjdFF1YWxpZmllZE5hbWUoIkluc3BlY3RvciIpOwotCi0gICAgICAgIEluc3BlY3RvciBpbnNwZWN0b3IgPSAoSW5zcGVjdG9yKSBjeWNsZS5nZXRQYWdlKG5hbWUpOwotCi0gICAgICAgIGluc3BlY3Rvci5pbnNwZWN0KGdldFBhZ2UoKS5nZXRQYWdlTmFtZSgpLCBjeWNsZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFJlbmRlcnMgdGhlIHNjcmlwdCwgdGhlbiBpbnZva2VzIHRoZSBub3JtYWwgaW1wbGVtZW50YXRpb24uCi0gICAgICoKLSAgICAgKiAgQHNpbmNlIDEuMC41Ci0gICAgICoqLwotCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVuZGVyQ29tcG9uZW50KElNYXJrdXBXcml0ZXIgd3JpdGVyLCBJUmVxdWVzdEN5Y2xlIGN5Y2xlKQotICAgIHsKLSAgICAgICAgaWYgKF9kaXNhYmxlZCB8fCBjeWNsZS5pc1Jld2luZGluZygpKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIElFbmdpbmUgZW5naW5lID0gZ2V0UGFnZSgpLmdldEVuZ2luZSgpOwotICAgICAgICBJU2NyaXB0U291cmNlIHNvdXJjZSA9IGVuZ2luZS5nZXRTY3JpcHRTb3VyY2UoKTsKLQotICAgICAgICBJUmVzb3VyY2VMb2NhdGlvbiBzY3JpcHRMb2NhdGlvbiA9Ci0gICAgICAgICAgICBnZXRTcGVjaWZpY2F0aW9uKCkuZ2V0U3BlY2lmaWNhdGlvbkxvY2F0aW9uKCkuZ2V0UmVsYXRpdmVMb2NhdGlvbigKLSAgICAgICAgICAgICAgICAiSW5zcGVjdG9yQnV0dG9uLnNjcmlwdCIpOwotCi0gICAgICAgIElTY3JpcHQgc2NyaXB0ID0gc291cmNlLmdldFNjcmlwdChzY3JpcHRMb2NhdGlvbik7Ci0KLSAgICAgICAgTWFwIHN5bWJvbHMgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgICAgIElFbmdpbmVTZXJ2aWNlIHNlcnZpY2UgPSBlbmdpbmUuZ2V0U2VydmljZShUYXBlc3RyeS5ESVJFQ1RfU0VSVklDRSk7Ci0gICAgICAgIElMaW5rIGxpbmsgPSBzZXJ2aWNlLmdldExpbmsoY3ljbGUsIHRoaXMsIG51bGwpOwotCi0gICAgICAgIHN5bWJvbHMucHV0KCJVUkwiLCBsaW5rLmdldFVSTCgpKTsKLQotICAgICAgICBCb2R5IGJvZHkgPSBCb2R5LmdldChjeWNsZSk7Ci0KLSAgICAgICAgaWYgKGJvZHkgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgVGFwZXN0cnkuZ2V0TWVzc2FnZSgiSW5zcGVjdG9yQnV0dG9uLm11c3QtYmUtY29udGFpbmVkLWJ5LWJvZHkiKSwKLSAgICAgICAgICAgICAgICB0aGlzLAotICAgICAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAgICAgbnVsbCk7Ci0KLSAgICAgICAgc2NyaXB0LmV4ZWN1dGUoY3ljbGUsIGJvZHksIHN5bWJvbHMpOwotCi0gICAgICAgIC8vIE5vdywgZ28gcmVuZGVyIHRoZSByZXN0IGZyb20gdGhlIHRlbXBsYXRlLgotCi0gICAgICAgIHN1cGVyLnJlbmRlckNvbXBvbmVudCh3cml0ZXIsIGN5Y2xlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0Rpc2FibGVkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfZGlzYWJsZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RGlzYWJsZWQoYm9vbGVhbiBkaXNhYmxlZCkKLSAgICB7Ci0gICAgICAgIF9kaXNhYmxlZCA9IGRpc2FibGVkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBBbHdheXMgcmV0dXJucyBmYWxzZS4KLSAgICAgKiAKLSAgICAgKiAgQHNpbmNlIDIuMwotICAgICAqIAotICAgICAqKi8KLQotICAgIHB1YmxpYyBib29sZWFuIGlzU3RhdGVmdWwoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9pbnNwZWN0b3IvSW5zcGVjdG9yQnV0dG9uLmp3YyBiL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9pbnNwZWN0b3IvSW5zcGVjdG9yQnV0dG9uLmp3YwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NjZjAwZC4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvaW5zcGVjdG9yL0luc3BlY3RvckJ1dHRvbi5qd2MKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gIAotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTwhLS0gJElkJCAtLT4KLTwhRE9DVFlQRSBjb21wb25lbnQtc3BlY2lmaWNhdGlvbiBQVUJMSUMKLSAgIi0vL0FwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLy9UYXBlc3RyeSBTcGVjaWZpY2F0aW9uIDMuMC8vRU4iIAotICAiaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy90YXBlc3RyeS9kdGQvVGFwZXN0cnlfM18wLmR0ZCI+Ci0KLTxjb21wb25lbnQtc3BlY2lmaWNhdGlvbiBjbGFzcz0ib3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLmluc3BlY3Rvci5JbnNwZWN0b3JCdXR0b24iIAotCWFsbG93LWJvZHk9Im5vIiAKLQlhbGxvdy1pbmZvcm1hbC1wYXJhbWV0ZXJzPSJubyI+Ci0KLSAgICA8ZGVzY3JpcHRpb24+Ci08IVtDREFUQVsKLUluY2x1ZGVzIHRoZSBJbnNwZWN0b3IgYnV0dG9uIG9uIHRoZSBwYWdlICh3aGljaCBkeW5hbWljYWxseSBwb3NpdGlvbnMgaXRzZWxmIGluIHRoZQotbG93ZXIgcmlnaHQgY29ybmVyKS4gIENsaWNraW5nIHRoZSBidXR0b24gcmFpc2VzIHRoZSBUYXBlc3RyeSBJbnNwZWN0b3IgaW4gYSBwb3AtdXAKLXdpbmRvdy4KLV1dPgotICAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgPHBhcmFtZXRlciBuYW1lPSJkaXNhYmxlZCIgdHlwZT0iYm9vbGVhbiIgZGlyZWN0aW9uPSJpbiIvPgotCi0gICAgPGNvbXBvbmVudCBpZD0ibGluayIgdHlwZT0iR2VuZXJpY0xpbmsiPgotICAgICAgICA8c3RhdGljLWJpbmRpbmcgbmFtZT0iaHJlZiI+amF2YXNjcmlwdDp0aV9yYWlzZUluc3BlY3RvcigpOzwvc3RhdGljLWJpbmRpbmc+Ci0gICAgPC9jb21wb25lbnQ+Ci0KLSAgICA8Y29tcG9uZW50IGlkPSJyb2xsb3ZlciIgdHlwZT0iUm9sbG92ZXIiPgotICAgIAk8YmluZGluZyBuYW1lPSJpbWFnZSIgZXhwcmVzc2lvbj0iYXNzZXRzLmxvZ28iLz4KLSAgICAJPGJpbmRpbmcgbmFtZT0iZm9jdXMiIGV4cHJlc3Npb249ImFzc2V0cy5pbnNwZWN0b3IiLz4KLSAgICA8L2NvbXBvbmVudD4KLQotICAgIDxwcml2YXRlLWFzc2V0IG5hbWU9ImxvZ28iIHJlc291cmNlLXBhdGg9InRhcGVzdHJ5LWxvZ28uZ2lmIi8+Ci0gICAgPHByaXZhdGUtYXNzZXQgbmFtZT0iaW5zcGVjdG9yIiByZXNvdXJjZS1wYXRoPSJpbnNwZWN0b3Itcm9sbG92ZXIuZ2lmIi8+Ci08L2NvbXBvbmVudC1zcGVjaWZpY2F0aW9uPgpkaWZmIC0tZ2l0IGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL2luc3BlY3Rvci9JbnNwZWN0b3JCdXR0b24uc2NyaXB0IGIvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL2luc3BlY3Rvci9JbnNwZWN0b3JCdXR0b24uc2NyaXB0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGUxZjMxLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9pbnNwZWN0b3IvSW5zcGVjdG9yQnV0dG9uLnNjcmlwdAorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAkSWQkIC0tPgotPCFET0NUWVBFIHNjcmlwdCBQVUJMSUMgCi0JIi0vL0hvd2FyZCBMZXdpcyBTaGlwLy9UYXBlc3RyeSBTY3JpcHQgMS4yLy9FTiIKLQkiaHR0cDovL3RhcGVzdHJ5LnNmLm5ldC9kdGQvU2NyaXB0XzFfMi5kdGQiPgotPCEtLQotCi1BZGRzIHNjcmlwdGluZyBzdXBwb3J0IGZvciB0aGUgU2hvd0luc3BlY3RvciBjb21wb25lbnQuCi0KLVByZWZpeGVzIGFsbCB2YXJpYWJsZXMgYW5kIGZ1bmN0aW9ucyB3aXRoICJ0aV8iIChmb3IgVGFwZXN0cnkgSW5zcGVjdG9yKS4KLQotRXhwZWN0cyB0aGF0IHRoZSBJbnNwZWN0b3IgaXMgaW5zaWRlIGEgPGRpdj4gbmFtZWQgInRhcGVzdHJ5SW5zcGVjdG9yIi4KLQotSW5wdXQgc3ltYm9sczoKLSBVUkwgLSBUaGUgY29tcGxldGUgVVJMIG5lZWRlZCBmb3IgdG8gcmFpc2UgdGhlIEluc3BlY3RvcgotIAotLS0+Ci08c2NyaXB0PgotCi08aW5jbHVkZS1zY3JpcHQgcmVzb3VyY2UtcGF0aD0iL29yZy9hcGFjaGUvdGFwZXN0cnkvaHRtbC9QcmFjdGljYWxCcm93c2VyU25pZmZlci5qcyIvPgotCi08aW5wdXQtc3ltYm9sIGtleT0iVVJMIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZyIgcmVxdWlyZWQ9InllcyIvPgotCi08Ym9keT4KLXZhciB0aSA9IG5ldyBPYmplY3QoKTsKLQotdGkub2xkWCA9IDA7Ci10aS5vbGRZID0gMDsKLQotZnVuY3Rpb24gdGlfcG9zaXRpb25JbnNwZWN0b3IoKQotewotICB2YXIgb2JqZWN0OwotICB2YXIgd2lkdGg7Ci0gIHZhciBoZWlnaHQ7Ci0KLSAgaWYgKG5hdmlnYXRvci5mYW1pbHkgPT0gIm5uNCIpCi0gIHsKLSAgICBvYmplY3QgPSBkb2N1bWVudC50YXBlc3RyeUluc3BlY3RvcjsKLSAgICB3aWR0aCA9IGlubmVyV2lkdGggKyBwYWdlWE9mZnNldDsgIDwhLS0gRG9lc24ndCBwcm9wZXJseSBhY2NvdW50IGZvciBzY3JvbGxiYXJzISAtLT4KLSAgICBoZWlnaHQgPSBpbm5lckhlaWdodCArIHBhZ2VZT2Zmc2V0OwotICB9Ci0gIGVsc2UKLSAgewotICAgIG9iamVjdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0YXBlc3RyeUluc3BlY3RvciIpOwotICAgIAotCWlmIChuYXZpZ2F0b3IuT1MgPT0gIm1hYyIpCi0JewotCSAgd2lkdGggPSBkb2N1bWVudC5ib2R5Lm9mZnNldFdpZHRoOwotCSAgaGVpZ2h0ID0gZG9jdW1lbnQuYm9keS5vZmZzZXRXaWR0aDsKLQl9Ci0JZWxzZSBpZiAobmF2aWdhdG9yLmZhbWlseSA9PSAiZ2Vja28iKQotCXsKLSAgICAgIHdpZHRoID0gaW5uZXJXaWR0aCArIHBhZ2VYT2Zmc2V0OyAKLSAgICAgIGhlaWdodCA9IGlubmVySGVpZ2h0ICsgcGFnZVlPZmZzZXQ7Ci0JfQotCWVsc2UKLQl7Ci0JICAvLyBJRSA1LCA2PyBvbiBQQwotCSAgd2lkdGggPSBkb2N1bWVudC5ib2R5LmNsaWVudFdpZHRoICArIGRvY3VtZW50LmJvZHkuc2Nyb2xsTGVmdDsKLQkgIGhlaWdodCA9IGRvY3VtZW50LmJvZHkuY2xpZW50SGVpZ2h0ICsgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3A7Ci0JfQotICB9Ci0gICAJCi0gIC8vIFRoZSB3aWR0aC9oZWlnaHQgb2YgdGhlIGFuaW1hdGlvbiwgcGx1cwotICAvLyBhIGNvdXBsZSBvZiBwaXhlbHMgb2YgYm9yZGVyLgotICAKLSAgdmFyIGluZGVudCA9IDY1OwotICAKLSAgdmFyIHggPSB3aWR0aCAtIGluZGVudDsKLSAgdmFyIHkgPSBoZWlnaHQgLSBpbmRlbnQ7Ci0KLSAgaWYgKG5hdmlnYXRvci5mYW1pbHkgPT0gIm5uNCIpCi0gIHsKLSAgICBpZiAoeCAhPSB0aS5vbGRYIHx8IHkgIT0gdGkub2xkWSkKLSAgICB7Ci0gICAgICBvYmplY3QubW92ZVRvKHgsIHkpOwotICAgICAgb2JqZWN0LnZpc2liaWxpdHkgPSAidmlzaWJsZSI7Ci0gICAgfQotICB9Ci0gIGVsc2UKLSAgewotICAgIGlmICh4ICE9IHRpLm9sZFgpCi0gICAgewotICAgICAgIG9iamVjdC5zdHlsZS5sZWZ0ID0geCArICJweCI7Ci0gICAgICAgdGkub2xkWCA9IHg7Ci0gICAgfQotICAgIGlmICh5ICE9IHRpLm9sZFkpCi0gICAgewotICAgIAlvYmplY3Quc3R5bGUudG9wID0geSArICJweCI7Ci0gICAgCXRpLm9sZFkgPSB5OwotICAgIH0KLQotIAlvYmplY3Quc3R5bGUudmlzaWJpbGl0eSA9ICJ2aXNpYmxlIjsgIAotICB9Ci0KLQotICAgIAotICAvLyBSZXBvc2l0aW9uIGl0IGV2ZXJ5IHF1YXJ0ZXIgc2Vjb25kLgotICAKLSAgd2luZG93LnNldFRpbWVvdXQoInRpX3Bvc2l0aW9uSW5zcGVjdG9yKCkiLCAyNTApOwotfQotCi1mdW5jdGlvbiB0aV9yYWlzZUluc3BlY3RvcigpCi17Ci0gIHZhciBuZXdXaW5kb3cgPSB3aW5kb3cub3BlbigKLSAgCSIke1VSTH0iLAotICAJIlRhcGVzdHJ5SW5zcGVjdG9yIiwKLSAgCSJ0aXRsZWJhcixyZXNpemFibGUsc2Nyb2xsYmFycyx3aWR0aD03MDAsaGVpZ2h0PTYwMCIpOwotICAJCi0gIG5ld1dpbmRvdy5mb2N1cygpOwotfQotPC9ib2R5PgotCi08aW5pdGlhbGl6YXRpb24+Ci10aV9wb3NpdGlvbkluc3BlY3RvcigpOwotPC9pbml0aWFsaXphdGlvbj4KLQotPC9zY3JpcHQ+CmRpZmYgLS1naXQgYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvaW5zcGVjdG9yL1Byb3BlcnRpZXNfSFJwNC5naWYgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvaW5zcGVjdG9yL1Byb3BlcnRpZXNfSFJwNC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyZmU4MjEuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL2luc3BlY3Rvci9Qcm9wZXJ0aWVzX0hScDQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL2luc3BlY3Rvci9Qcm9wZXJ0aWVzX0hwMy5naWYgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvaW5zcGVjdG9yL1Byb3BlcnRpZXNfSHAzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGFhMjVjYi4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvaW5zcGVjdG9yL1Byb3BlcnRpZXNfSHAzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9pbnNwZWN0b3IvUHJvcGVydGllc19OQmFubmVyLmdpZiBiL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9pbnNwZWN0b3IvUHJvcGVydGllc19OQmFubmVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZhN2Y1Yi4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvaW5zcGVjdG9yL1Byb3BlcnRpZXNfTkJhbm5lci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvaW5zcGVjdG9yL1Byb3BlcnRpZXNfTlJwMi5naWYgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvaW5zcGVjdG9yL1Byb3BlcnRpZXNfTlJwMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyYjEzYTEuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL2luc3BlY3Rvci9Qcm9wZXJ0aWVzX05ScDIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL2luc3BlY3Rvci9Qcm9wZXJ0aWVzX05wMS5naWYgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvaW5zcGVjdG9yL1Byb3BlcnRpZXNfTnAxLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTE3NDM2YS4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvaW5zcGVjdG9yL1Byb3BlcnRpZXNfTnAxLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9pbnNwZWN0b3IvUmVzZXRfTlJwMi5naWYgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvaW5zcGVjdG9yL1Jlc2V0X05ScDIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzFjYmEwLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9pbnNwZWN0b3IvUmVzZXRfTlJwMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvaW5zcGVjdG9yL1Jlc2V0X05wMS5naWYgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvaW5zcGVjdG9yL1Jlc2V0X05wMS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViODdiZjQuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL2luc3BlY3Rvci9SZXNldF9OcDEuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL2luc3BlY3Rvci9SZXNldF9OcDFfZGlzYWJsZWQuZ2lmIGIvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL2luc3BlY3Rvci9SZXNldF9OcDFfZGlzYWJsZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2ZkZDUxLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9pbnNwZWN0b3IvUmVzZXRfTnAxX2Rpc2FibGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9pbnNwZWN0b3IvUmVzdGFydF9OUnAyLmdpZiBiL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9pbnNwZWN0b3IvUmVzdGFydF9OUnAyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZlZDcxNS4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvaW5zcGVjdG9yL1Jlc3RhcnRfTlJwMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvaW5zcGVjdG9yL1Jlc3RhcnRfTnAxLmdpZiBiL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9pbnNwZWN0b3IvUmVzdGFydF9OcDEuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGE5MmIwLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9pbnNwZWN0b3IvUmVzdGFydF9OcDEuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL2luc3BlY3Rvci9TZWxlY3Rvci5odG1sIGIvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL2luc3BlY3Rvci9TZWxlY3Rvci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWVjYmY3Li4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9pbnNwZWN0b3IvU2VsZWN0b3IuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLTwhLS0gJElkJCAtLT4KLQotPHRhYmxlIGNsYXNzPSJzZWxlY3RvciI+Ci0JPHRyIHZhbGlnbj1jZW50ZXI+Ci0JCTx0ZD4KLQkJCTxmb3JtIGp3Y2lkPSJmb3JtIj4KLQkJCQk8c2VsZWN0IGp3Y2lkPSJzZWxlY3RQYWdlIi8+Ci0JCQk8L2Zvcm0+Ci0JCTwvdGQ+Ci0JCTx0ZCBjbGFzcz0icGFnZS1saW5rIj4KLQkJCTxhIGp3Y2lkPSJwYWdlIj5wYWdlPC9hPgotCQk8L3RkPgotPHNwYW4gandjaWQ9ImUiPgotCQk8dGQ+Jmd0OyZndDs8L3RkPgotCQk8dGQ+Ci0JCTxhIGp3Y2lkPSJjb21wb25lbnQiPjxzcGFuIGp3Y2lkPSJpbnNlcnRJZCIvPjwvYT4KLQkJPC90ZD4KLTwvc3Bhbj4KLQk8L3RyPgotPC90YWJsZT4KLQotPHNwYW4gandjaWQ9InJlbmRlckJvZHkiLz4KLQpkaWZmIC0tZ2l0IGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL2luc3BlY3Rvci9TZWxlY3Rvci5qYXZhIGIvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL2luc3BlY3Rvci9TZWxlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTgwMjVkLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9pbnNwZWN0b3IvU2VsZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLmluc3BlY3RvcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LkJhc2VDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JQ29tcG9uZW50OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZXF1ZXN0Q3ljbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5lbmdpbmUuSVNwZWNpZmljYXRpb25Tb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5mb3JtLklQcm9wZXJ0eVNlbGVjdGlvbk1vZGVsOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuZm9ybS5TdHJpbmdQcm9wZXJ0eVNlbGVjdGlvbk1vZGVsOwotCi0vKioKLSAqICBDb21wb25lbnQgb2YgdGhlIHtAbGluayBJbnNwZWN0b3J9IHBhZ2UgdXNlZCB0byBzZWxlY3QgdGhlIHBhZ2UgYW5kICJjcnVtYiB0cmFpbCIKLSAqICBvZiB0aGUgaW5zcGVjdGVkIGNvbXBvbmVudC4KLSAqCi0gKgotICogIEB2ZXJzaW9uICRJZCQKLSAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKgotICoqLwotCi1wdWJsaWMgY2xhc3MgU2VsZWN0b3IgZXh0ZW5kcyBCYXNlQ29tcG9uZW50Ci17Ci0gICAgLyoqCi0gICAgICogIFdoZW4gdGhlIGZvcm0gaXMgc3VibWl0dGVkLAotICAgICAqICB0aGUgaW5zcGVjdGVkUGFnZU5hbWUgb2YgdGhlIHtAbGluayBJbnNwZWN0b3J9IHBhZ2Ugd2lsbCBiZSB1cGRhdGVkLAotICAgICAqICBidXQgd2UgbmVlZCB0byByZXNldCB0aGUgaW5zcGVjdGVkSWRQYXRoIGFzIHdlbGwuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCBmb3JtU3VibWl0KElSZXF1ZXN0Q3ljbGUgY3ljbGUpCi0gICAgewotICAgICAgICBJbnNwZWN0b3IgaW5zcGVjdG9yID0gKEluc3BlY3RvcikgZ2V0UGFnZSgpOwotCi0gICAgICAgIGluc3BlY3Rvci5zZWxlY3RDb21wb25lbnQoKFN0cmluZykgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgYW4ge0lQcm9wZXJ0eVNlbGVjdGlvbk1vZGVsfSB1c2VkIHRvIHNlbGVjdCB0aGUgbmFtZSBvZiB0aGUgcGFnZQotICAgICAqICB0byBpbnNwZWN0LiAgVGhlIHBhZ2UgbmFtZXMgYXJlIHNvcnRlZC4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBJUHJvcGVydHlTZWxlY3Rpb25Nb2RlbCBnZXRQYWdlTW9kZWwoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdQcm9wZXJ0eVNlbGVjdGlvbk1vZGVsKGdldFBhZ2VOYW1lcygpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgVGhlIGNydW1iIHRyYWlsIGlzIGFsbCB0aGUgY29tcG9uZW50cyBmcm9tIHRoZSBpbnNwZWN0ZWQgY29tcG9uZW50IHVwIHRvCi0gICAgICogIChidXQgbm90IGluY2x1ZGluZykgdGhlIHBhZ2UuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgTGlzdCBnZXRDcnVtYlRyYWlsKCkKLSAgICB7Ci0gICAgICAgIExpc3QgcmVzdWx0ID0gbnVsbDsKLQotICAgICAgICBJbnNwZWN0b3IgaW5zcGVjdG9yID0gKEluc3BlY3RvcikgZ2V0UGFnZSgpOwotICAgICAgICBJQ29tcG9uZW50IGNvbXBvbmVudCA9IGluc3BlY3Rvci5nZXRJbnNwZWN0ZWRDb21wb25lbnQoKTsKLSAgICAgICAgSUNvbXBvbmVudCBjb250YWluZXIgPSBudWxsOwotCi0gICAgICAgIHdoaWxlICh0cnVlKQotICAgICAgICB7Ci0gICAgICAgICAgICBjb250YWluZXIgPSBjb21wb25lbnQuZ2V0Q29udGFpbmVyKCk7Ci0gICAgICAgICAgICBpZiAoY29udGFpbmVyID09IG51bGwpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgICAgIHJlc3VsdC5hZGQoY29tcG9uZW50KTsKLQotICAgICAgICAgICAgY29tcG9uZW50ID0gY29udGFpbmVyOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgLy8gUmV2ZXJzZSB0aGUgbGlzdCwgc3VjaCB0aGF0IHRoZSBpbnNwZWN0ZWQgY29tcG9uZW50IGlzIGxhc3QsIGFuZCB0aGUKLSAgICAgICAgLy8gdG9wLW1vc3QgY29udGFpbmVyIGlzIGZpcnN0LgotCi0gICAgICAgIENvbGxlY3Rpb25zLnJldmVyc2UocmVzdWx0KTsKLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nW10gZ2V0UGFnZU5hbWVzKCkKLSAgICB7Ci0gICAgICAgIFNldCBuYW1lcyA9IG5ldyBIYXNoU2V0KCk7Ci0KLSAgICAgICAgSVNwZWNpZmljYXRpb25Tb3VyY2Ugc291cmNlID0gZ2V0UGFnZSgpLmdldEVuZ2luZSgpLmdldFNwZWNpZmljYXRpb25Tb3VyY2UoKTsKLQotICAgICAgICBhZGRQYWdlTmFtZXMobmFtZXMsIHNvdXJjZS5nZXRGcmFtZXdvcmtOYW1lc3BhY2UoKSk7Ci0gICAgICAgIGFkZFBhZ2VOYW1lcyhuYW1lcywgc291cmNlLmdldEFwcGxpY2F0aW9uTmFtZXNwYWNlKCkpOwotCi0gICAgICAgIExpc3QgbCA9IG5ldyBBcnJheUxpc3QobmFtZXMpOwotICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KGwpOwotCi0gICAgICAgIHJldHVybiAoU3RyaW5nW10pIGwudG9BcnJheShuZXcgU3RyaW5nW2wuc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFBhZ2VOYW1lcyhTZXQgbmFtZXMsIElOYW1lc3BhY2UgbmFtZXNwYWNlKQotICAgIHsKLSAgICAgICAgU3RyaW5nIGlkUHJlZml4ID0gbmFtZXNwYWNlLmdldEV4dGVuZGVkSWQoKTsKLQotICAgICAgICBMaXN0IHBhZ2VOYW1lcyA9IG5hbWVzcGFjZS5nZXRQYWdlTmFtZXMoKTsKLSAgICAgICAgaW50IGNvdW50ID0gcGFnZU5hbWVzLnNpemUoKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZykgcGFnZU5hbWVzLmdldChpKTsKLQotICAgICAgICAgICAgaWYgKGlkUHJlZml4ID09IG51bGwpCi0gICAgICAgICAgICAgICAgbmFtZXMuYWRkKG5hbWUpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIG5hbWVzLmFkZChpZFByZWZpeCArICI6IiArIG5hbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgTGlzdCBpZHMgPSBuYW1lc3BhY2UuZ2V0Q2hpbGRJZHMoKTsKLSAgICAgICAgY291bnQgPSBpZHMuc2l6ZSgpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIGlkID0gKFN0cmluZykgaWRzLmdldChpKTsKLQotICAgICAgICAgICAgYWRkUGFnZU5hbWVzKG5hbWVzLCBuYW1lc3BhY2UuZ2V0Q2hpbGROYW1lc3BhY2UoaWQpKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9pbnNwZWN0b3IvU2VsZWN0b3IuandjIGIvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL2luc3BlY3Rvci9TZWxlY3Rvci5qd2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlZTRiNDAuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL2luc3BlY3Rvci9TZWxlY3Rvci5qd2MKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gIAotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTwhLS0gJElkJCAtLT4KLTwhRE9DVFlQRSBjb21wb25lbnQtc3BlY2lmaWNhdGlvbiBQVUJMSUMgCi0gICItLy9BcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi8vVGFwZXN0cnkgU3BlY2lmaWNhdGlvbiAzLjAvL0VOIiAKLSAgImh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvdGFwZXN0cnkvZHRkL1RhcGVzdHJ5XzNfMC5kdGQiPgotCQotPGNvbXBvbmVudC1zcGVjaWZpY2F0aW9uIGNsYXNzPSJvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIuaW5zcGVjdG9yLlNlbGVjdG9yIj4KLQotICA8Y29tcG9uZW50IGlkPSJmb3JtIiB0eXBlPSJGb3JtIj4KLSAgICA8YmluZGluZyBuYW1lPSJsaXN0ZW5lciIgZXhwcmVzc2lvbj0ibGlzdGVuZXJzLmZvcm1TdWJtaXQiLz4KLSAgPC9jb21wb25lbnQ+Ci0KLSAgPGNvbXBvbmVudCBpZD0ic2VsZWN0UGFnZSIgdHlwZT0iUHJvcGVydHlTZWxlY3Rpb24iPgotICAgIDxiaW5kaW5nIG5hbWU9InZhbHVlIiBleHByZXNzaW9uPSJwYWdlLmluc3BlY3RlZFBhZ2VOYW1lIi8+Ci0gICAgPGJpbmRpbmcgbmFtZT0ibW9kZWwiIGV4cHJlc3Npb249InBhZ2VNb2RlbCIvPgotICAgIDxiaW5kaW5nIG5hbWU9InN1Ym1pdE9uQ2hhbmdlIiBleHByZXNzaW9uPSJ0cnVlIi8+Ci0gIDwvY29tcG9uZW50PgotCi0gIDxjb21wb25lbnQgaWQ9InBhZ2UiIHR5cGU9IkRpcmVjdExpbmsiPgotICAgIDxiaW5kaW5nIG5hbWU9Imxpc3RlbmVyIiBleHByZXNzaW9uPSJwYWdlLmxpc3RlbmVycy5zZWxlY3RDb21wb25lbnQiLz4KLSAgPC9jb21wb25lbnQ+Ci0KLSAgPGNvbXBvbmVudCBpZD0iZSIgdHlwZT0iRm9yZWFjaCI+Ci0gICAgPGJpbmRpbmcgbmFtZT0ic291cmNlIiBleHByZXNzaW9uPSJjcnVtYlRyYWlsIi8+Ci0gIDwvY29tcG9uZW50PgotCi0gIDxjb21wb25lbnQgaWQ9ImNvbXBvbmVudCIgdHlwZT0iRGlyZWN0TGluayI+Ci0gICAgPGJpbmRpbmcgbmFtZT0icGFyYW1ldGVycyIgZXhwcmVzc2lvbj0iY29tcG9uZW50cy5lLnZhbHVlLmlkUGF0aCIvPgotICAgIDxiaW5kaW5nIG5hbWU9Imxpc3RlbmVyIiBleHByZXNzaW9uPSJwYWdlLmxpc3RlbmVycy5zZWxlY3RDb21wb25lbnQiLz4KLSAgPC9jb21wb25lbnQ+Ci0KLSAgPGNvbXBvbmVudCBpZD0iaW5zZXJ0SWQiIHR5cGU9Ikluc2VydCI+Ci0gICAgPGJpbmRpbmcgbmFtZT0idmFsdWUiIGV4cHJlc3Npb249ImNvbXBvbmVudHMuZS52YWx1ZS5pZCIvPgotICA8L2NvbXBvbmVudD4KLQotICA8Y29tcG9uZW50IGlkPSJyZW5kZXJCb2R5IiB0eXBlPSJSZW5kZXJCb2R5Ii8+Ci0KLTwvY29tcG9uZW50LXNwZWNpZmljYXRpb24+CmRpZmYgLS1naXQgYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvaW5zcGVjdG9yL1Nob3dEZXNjcmlwdGlvbi5odG1sIGIvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL2luc3BlY3Rvci9TaG93RGVzY3JpcHRpb24uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTE3ZTU5Yy4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvaW5zcGVjdG9yL1Nob3dEZXNjcmlwdGlvbi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08IS0tICRJZCQgLS0+Ci0KLTxzcGFuIGp3Y2lkPSIkY29udGVudCQiPgotPHNwYW4gandjaWQ9ImlmRGVzY3JpcHRpb24iPjxpbWcgandjaWQ9ImRlc2NyaXB0aW9uSW1hZ2UiLz48L3NwYW4+Ci08L3NwYW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL2luc3BlY3Rvci9TaG93RGVzY3JpcHRpb24uandjIGIvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL2luc3BlY3Rvci9TaG93RGVzY3JpcHRpb24uandjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODQ2NmNhLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9pbnNwZWN0b3IvU2hvd0Rlc2NyaXB0aW9uLmp3YworKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAgCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPCEtLSAkSWQkIC0tPgotCi08IURPQ1RZUEUgY29tcG9uZW50LXNwZWNpZmljYXRpb24gUFVCTElDIAotICAiLS8vQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24vL1RhcGVzdHJ5IFNwZWNpZmljYXRpb24gMy4wLy9FTiIgCi0gICJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL3RhcGVzdHJ5L2R0ZC9UYXBlc3RyeV8zXzAuZHRkIj4KLQotPGNvbXBvbmVudC1zcGVjaWZpY2F0aW9uIGNsYXNzPSJvcmcuYXBhY2hlLnRhcGVzdHJ5LkJhc2VDb21wb25lbnQiIAotCWFsbG93LWJvZHk9Im5vIiAKLQlhbGxvdy1pbmZvcm1hbC1wYXJhbWV0ZXJzPSJubyI+Ci0JCi0JPHBhcmFtZXRlciBuYW1lPSJkZXNjcmlwdGlvbiIgcmVxdWlyZWQ9InllcyIvPgotCQotCTxjb21wb25lbnQgaWQ9ImlmRGVzY3JpcHRpb24iIHR5cGU9IkNvbmRpdGlvbmFsIj4KLQkgIDxpbmhlcml0ZWQtYmluZGluZyBuYW1lPSJjb25kaXRpb24iIHBhcmFtZXRlci1uYW1lPSJkZXNjcmlwdGlvbiIvPgotCTwvY29tcG9uZW50PgotCQotCTxjb21wb25lbnQgaWQ9ImRlc2NyaXB0aW9uSW1hZ2UiIHR5cGU9IkltYWdlIj4KLQkgIDxiaW5kaW5nIG5hbWU9ImltYWdlIiBleHByZXNzaW9uPSJhc3NldHMuaW5mbyIvPgotCSAgPGluaGVyaXRlZC1iaW5kaW5nIG5hbWU9ImFsdCIgcGFyYW1ldGVyLW5hbWU9ImRlc2NyaXB0aW9uIi8+Ci0JPC9jb21wb25lbnQ+Ci0JCi0JPHByaXZhdGUtYXNzZXQgbmFtZT0iaW5mbyIgcmVzb3VyY2UtcGF0aD0iaW5mby5naWYiLz4KLQkKLTwvY29tcG9uZW50LXNwZWNpZmljYXRpb24+CmRpZmYgLS1naXQgYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvaW5zcGVjdG9yL1Nob3dFbmdpbmUuaHRtbCBiL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9pbnNwZWN0b3IvU2hvd0VuZ2luZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTdjOGZmLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9pbnNwZWN0b3IvU2hvd0VuZ2luZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotPCEtLSAkSWQkIC0tPgotCi08dGFibGUgY2xhc3M9Imluc3BlY3Rvci1kYXRhIj4KLQotCTx0ciBjbGFzcz0iaGVhZGluZyI+Ci0JCTx0aCBjb2xzcGFuPTI+RW5naW5lL0FwcGxpY2F0aW9uIFByb3BlcnRpZXM8L3RoPgotCTwvdHI+Ci0JCi0JPHRyIGNsYXNzPSJoZWFkaW5nIj4KLQkJPHRoPk5hbWU8L3RoPiA8dGg+UHJvcGVydHk8L3RoPgotCTwvdHI+Ci0JCi0JPHRyIGNsYXNzPSJldmVuIj4KLQkJPHRoPlRhcGVzdHJ5IEZyYW1ld29yayBWZXJzaW9uPC90aD4KLQkJPHRkPjxzcGFuIGp3Y2lkPSJpbnNlcnRGcmFtZXdvcmtWZXJzaW9uIi8+PC90ZD4KLQk8L3RyPgotCQotCTx0ciBjbGFzcz0ib2RkIj4KLQkJPHRoPkFwcGxpY2F0aW9uIE5hbWU8L3RoPgotCQk8dGQ+PHNwYW4gandjaWQ9Imluc2VydEFwcGxpY2F0aW9uTmFtZSIvPjwvdGQ+Ci0JPC90cj4KLQotCTx0ciBjbGFzcz0iZXZlbiI+Ci0JCTx0aD5Db250ZXh0IFBhdGg8L3RoPgotCQk8dGQ+PHNwYW4gandjaWQ9Imluc2VydENvbnRleHRQYXRoIi8+PC90ZD4KLQk8L3RyPgotCi0JPHRyIGNsYXNzPSJvZGQiPgotCQk8dGg+U2VydmxldCBQYXRoPC90aD4KLQkJPHRkPjxzcGFuIGp3Y2lkPSJpbnNlcnRTZXJ2bGV0UGF0aCIvPjwvdGQ+Ci0JPC90cj4KLQotCTx0ciBjbGFzcz0iZXZlbiI+Ci0JCTx0aD5FbmdpbmUgQ2xhc3M8L3RoPgotCQk8dGQ+PHNwYW4gandjaWQ9Imluc2VydEVuZ2luZUNsYXNzIi8+PC90ZD4KLQk8L3RyPgotCQotCTx0ciBjbGFzcz0ib2RkIj4KLQkJPHRoPkxvY2FsZTwvdGg+Ci0JCTx0ZD48c3BhbiBqd2NpZD0iaW5zZXJ0TG9jYWxlIi8+PC90ZD4KLQk8L3RyPgotCi0JPHRyIGNsYXNzPSJldmVuIj4KLQkJPHRoPlZpc2l0PC90aD4KLQkJPHRkPgotPHNwYW4gandjaWQ9ImlmTm9WaXNpdCI+Ci08ZW0+bm9uZTwvZW0+Ci08L3NwYW4+Ci0KLTxzcGFuIGp3Y2lkPSJpZlZpc2l0Ij4KLTxzcGFuIGp3Y2lkPSJpbnNlcnRWaXNpdCIvPgotPC9zcGFuPgotCQk8L3RkPgotCTwvdHI+Ci0KLTwvdGFibGU+Ci0KLTxoMT5PcGVyYXRpb25zPC9oMT4KLQotPHRhYmxlIGNsYXNzPSJpbnNwZWN0b3ItZGF0YSI+Ci0KLQk8dHIgY2xhc3M9ImV2ZW4iPgotCQk8dGQ+PGEgandjaWQ9InJlc3RhcnQiIHRhcmdldD0iX25ldyI+PGltZyBqd2NpZD0icmVzdGFydEJ1dHRvbiIvPjwvYT4KLQkJPC90ZD4KLQkJPHRkPlJlc3RhcnQgdGhlIGFwcGxpY2F0aW9uIChpbiBhIG5ldyB3aW5kb3cpLgotCQk8L3RkPgotCTwvdHI+Ci0KLQk8dHIgY2xhc3M9ImV2ZW4iPgotCQk8dGQ+PGEgandjaWQ9InJlc2V0Ij48aW1nIGp3Y2lkPSJyZXNldEJ1dHRvbiIvPjwvYT4KLQkJPC90ZD4KLQkJPHRkPgotCQlSZXNldCB0aGUgYXBwbGljYXRpb24sIGRpc2NhcmRpbmcgYWxsIGNhY2hlZCBzcGVjaWZpY2F0aW9ucywgYXNzZXRzCi0JCWFuZCB0ZW1wbGF0ZXMuCi0JCTwvdGQ+Ci0JPC90cj4KLTwvdGFibGU+Ci0KLTxoMT5TZXJpYWxpemVkIEVuZ2luZTwvaDE+Ci0KLTxwPlRoZSBzZXJpYWxpemVkIHN0YXRlIG9mIHRoZSBhcHBsaWNhdGlvbiBlbmdpbmUgKHRoZSBzaXplIG9mIHRoaXMgaXMgcmVsZXZhbnQKLWZvciBhcHBsaWNhdGlvbiBzZXJ2ZXJzIHdoaWNoIHN1cHBvcnQgY2x1c3RlcmluZykuCi0KLTxwPjxzcGFuIGp3Y2lkPSJpbnNlcnRCeXRlQ291bnQiLz4gYnl0ZXM6Ci08cHJlPjxzcGFuIGp3Y2lkPSJpbnNlcnRTZXJpYWxpemVkRW5naW5lIi8+PC9wcmU+Ci0KLTxoMT5SZXF1ZXN0IENvbnRleHQ8L2gxPgotCi08c3BhbiBqd2NpZD0iaW5zZXJ0UmVxdWVzdCIvPgotCmRpZmYgLS1naXQgYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvaW5zcGVjdG9yL1Nob3dFbmdpbmUuamF2YSBiL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9pbnNwZWN0b3IvU2hvd0VuZ2luZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjlkYzcxLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9pbnNwZWN0b3IvU2hvd0VuZ2luZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg2ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIuaW5zcGVjdG9yOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5DaGFyQXJyYXlXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuQmFzZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklNYXJrdXBXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVuZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlcXVlc3RDeWNsZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LlRhcGVzdHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuZXZlbnQuUGFnZURldGFjaExpc3RlbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuZXZlbnQuUGFnZUV2ZW50OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkudXRpbC5pby5CaW5hcnlEdW1wT3V0cHV0U3RyZWFtOwotCi0vKioKLSAqICBDb21wb25lbnQgb2YgdGhlIHtAbGluayBJbnNwZWN0b3J9IHBhZ2UgdXNlZCB0byBkaXNwbGF5Ci0gKiAgdGhlIHByb3BlcnRpZXMgb2YgdGhlIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LklFbmdpbmV9IGFzIHdlbGwgYXMgYSBzZXJpYWxpemVkIHZpZXcgb2YgaXQuCi0gKiAgQWxzbywgdGhlIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LnJlcXVlc3QuUmVxdWVzdENvbnRleHR9IGlzIGR1bXBlZCBvdXQuCi0gKgotICoKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICoKLSAqKi8KLQotcHVibGljIGNsYXNzIFNob3dFbmdpbmUgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IGltcGxlbWVudHMgUGFnZURldGFjaExpc3RlbmVyCi17Ci0gICAgcHJpdmF0ZSBieXRlW10gc2VyaWFsaXplZEVuZ2luZTsKLQotICAgIHB1YmxpYyB2b2lkIHBhZ2VEZXRhY2hlZChQYWdlRXZlbnQgZXZlbnQpCi0gICAgewotICAgICAgICBzZXJpYWxpemVkRW5naW5lID0gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgV29ya2Fyb3VuZCBmb3IgT0dOTCBsaW1pdGF0aW9uIC0tLSBPR05MIGNhbid0IGRlcmVmZXJlbmNlCi0gICAgICogIHBhc3QgY2xhc3MgaW5zdGFuY2VzLgotICAgICAqIAotICAgICAqICBAc2luY2UgMi4yCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIFN0cmluZyBnZXRFbmdpbmVDbGFzc05hbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldFBhZ2UoKS5nZXRFbmdpbmUoKS5nZXRDbGFzcygpLmdldE5hbWUoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJ5dGVbXSBnZXRTZXJpYWxpemVkRW5naW5lKCkKLSAgICB7Ci0gICAgICAgIGlmIChzZXJpYWxpemVkRW5naW5lID09IG51bGwpCi0gICAgICAgICAgICBidWlsZFNlcmlhbGl6ZWRFbmdpbmUoKTsKLQotICAgICAgICByZXR1cm4gc2VyaWFsaXplZEVuZ2luZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYnVpbGRTZXJpYWxpemVkRW5naW5lKCkKLSAgICB7Ci0gICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBib3MgPSBudWxsOwotICAgICAgICBPYmplY3RPdXRwdXRTdHJlYW0gb29zID0gbnVsbDsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgYm9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICAgICAgb29zID0gbmV3IE9iamVjdE91dHB1dFN0cmVhbShib3MpOwotCi0gICAgICAgICAgICAvLyBXcml0ZSB0aGUgYXBwbGljYXRpb24gb2JqZWN0IHRvIHRoZSBzdHJlYW0uCi0KLSAgICAgICAgICAgIG9vcy53cml0ZU9iamVjdChnZXRQYWdlKCkuZ2V0RW5naW5lKCkpOwotCi0gICAgICAgICAgICAvLyBFeHRyYWN0IHRoZSBhcHBsaWNhdGlvbiBhcyBhbiBhcnJheSBvZiBieXRlcy4KLQotICAgICAgICAgICAgc2VyaWFsaXplZEVuZ2luZSA9IGJvcy50b0J5dGVBcnJheSgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBleCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICBUYXBlc3RyeS5nZXRNZXNzYWdlKCJTaG93RW5naW5lLmNvdWxkLW5vdC1zZXJpYWxpemUiKSwKLSAgICAgICAgICAgICAgICBleCk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBjbG9zZShvb3MpOwotICAgICAgICAgICAgY2xvc2UoYm9zKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEl0IHdvdWxkIGJlIG5pY2UgdG8gZGVzZXJpYWxpemUgdGhlIGFwcGxpY2F0aW9uIG9iamVjdCBub3csIGJ1dCBpbgotICAgICAgICAvLyBwcmFjdGljZSwgdGhhdCBmYWlscyBkdWUgdG8gY2xhc3MgbG9hZGVyIHByb2JsZW1zLgotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjbG9zZShPdXRwdXRTdHJlYW0gc3RyZWFtKQotICAgIHsKLSAgICAgICAgaWYgKHN0cmVhbSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBzdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZXgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIElnbm9yZS4KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0RW5naW5lQnl0ZUNvdW50KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRTZXJpYWxpemVkRW5naW5lKCkubGVuZ3RoOwotICAgIH0KLQotICAgIHB1YmxpYyBJUmVuZGVyIGdldEVuZ2luZUR1bXBEZWxlZ2F0ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IElSZW5kZXIoKQotICAgICAgICB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCByZW5kZXIoSU1hcmt1cFdyaXRlciB3cml0ZXIsIElSZXF1ZXN0Q3ljbGUgY3ljbGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZHVtcFNlcmlhbGl6ZWRFbmdpbmUod3JpdGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZHVtcFNlcmlhbGl6ZWRFbmdpbmUoSU1hcmt1cFdyaXRlciByZXNwb25zZVdyaXRlcikKLSAgICB7Ci0gICAgICAgIENoYXJBcnJheVdyaXRlciB3cml0ZXIgPSBudWxsOwotICAgICAgICBCaW5hcnlEdW1wT3V0cHV0U3RyZWFtIGJvcyA9IG51bGw7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIEJlY2F1c2UgSVJlcG9uc2VXcml0ZXIgZG9lc24ndCBpbXBsZW1lbnQgdGhlCi0gICAgICAgICAgICAvLyBqYXZhLmlvLldyaXRlciBpbnRlcmZhY2UsIHdlIGhhdmUgdG8gYnVmZmVyIHRoaXMKLSAgICAgICAgICAgIC8vIHN0dWZmIHRoZW4gcGFjayBpdCBpbiBhbGwgYXQgb25jZS4gIEtpbmQgb2YgYSB3YXN0ZSEKLQotICAgICAgICAgICAgd3JpdGVyID0gbmV3IENoYXJBcnJheVdyaXRlcigpOwotCi0gICAgICAgICAgICBib3MgPSBuZXcgQmluYXJ5RHVtcE91dHB1dFN0cmVhbSh3cml0ZXIpOwotICAgICAgICAgICAgYm9zLnNldEJ5dGVzUGVyTGluZSgzMik7Ci0KLSAgICAgICAgICAgIGJvcy53cml0ZShnZXRTZXJpYWxpemVkRW5naW5lKCkpOwotICAgICAgICAgICAgYm9zLmNsb3NlKCk7Ci0KLSAgICAgICAgICAgIHJlc3BvbnNlV3JpdGVyLnByaW50KHdyaXRlci50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZXgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIElnbm9yZS4KLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChib3MgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGJvcy5jbG9zZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZXgpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUuCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAod3JpdGVyICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgd3JpdGVyLnJlc2V0KCk7Ci0gICAgICAgICAgICAgICAgd3JpdGVyLmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvaW5zcGVjdG9yL1Nob3dFbmdpbmUuandjIGIvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL2luc3BlY3Rvci9TaG93RW5naW5lLmp3YwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE4MTgxNi4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvaW5zcGVjdG9yL1Nob3dFbmdpbmUuandjCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICAKLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08IS0tICRJZCQgLS0+Ci08IURPQ1RZUEUgY29tcG9uZW50LXNwZWNpZmljYXRpb24gUFVCTElDIAotICAiLS8vQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24vL1RhcGVzdHJ5IFNwZWNpZmljYXRpb24gMy4wLy9FTiIgCi0gICJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL3RhcGVzdHJ5L2R0ZC9UYXBlc3RyeV8zXzAuZHRkIj4KLQkKLTxjb21wb25lbnQtc3BlY2lmaWNhdGlvbiBjbGFzcz0ib3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLmluc3BlY3Rvci5TaG93RW5naW5lIiBhbGxvdy1ib2R5PSJubyIgYWxsb3ctaW5mb3JtYWwtcGFyYW1ldGVycz0ibm8iPgotCi0gIDxjb21wb25lbnQgaWQ9Imluc2VydEZyYW1ld29ya1ZlcnNpb24iIHR5cGU9Ikluc2VydCI+Ci0gIAk8YmluZGluZyBuYW1lPSJ2YWx1ZSIgZXhwcmVzc2lvbj0iQG9yZy5hcGFjaGUudGFwZXN0cnkuVGFwZXN0cnlAVkVSU0lPTiIvPgotICA8L2NvbXBvbmVudD4KLSAgCi0gIDxjb21wb25lbnQgaWQ9Imluc2VydEFwcGxpY2F0aW9uTmFtZSIgdHlwZT0iSW5zZXJ0Ij4KLSAgICA8YmluZGluZyBuYW1lPSJ2YWx1ZSIgZXhwcmVzc2lvbj0icGFnZS5lbmdpbmUuc3BlY2lmaWNhdGlvbi5uYW1lIi8+Ci0gIDwvY29tcG9uZW50PgotICAKLSAgPGNvbXBvbmVudCBpZD0iaW5zZXJ0Q29udGV4dFBhdGgiIHR5cGU9Ikluc2VydCI+Ci0gICAgPGJpbmRpbmcgbmFtZT0idmFsdWUiIGV4cHJlc3Npb249InBhZ2UuZW5naW5lLmNvbnRleHRQYXRoIi8+Ci0gIDwvY29tcG9uZW50PgotICAKLSAgPGNvbXBvbmVudCBpZD0iaW5zZXJ0U2VydmxldFBhdGgiIHR5cGU9Ikluc2VydCI+Ci0gICAgPGJpbmRpbmcgbmFtZT0idmFsdWUiIGV4cHJlc3Npb249InBhZ2UuZW5naW5lLnNlcnZsZXRQYXRoIi8+Ci0gIDwvY29tcG9uZW50PgotICAKLSAgPGNvbXBvbmVudCBpZD0iaW5zZXJ0RW5naW5lQ2xhc3MiIHR5cGU9Ikluc2VydCI+Ci0gICAgPGJpbmRpbmcgbmFtZT0idmFsdWUiIGV4cHJlc3Npb249ImVuZ2luZUNsYXNzTmFtZSIvPgotICA8L2NvbXBvbmVudD4KLSAgCi0gIDxjb21wb25lbnQgaWQ9Imluc2VydExvY2FsZSIgdHlwZT0iSW5zZXJ0Ij4KLSAgICA8YmluZGluZyBuYW1lPSJ2YWx1ZSIgZXhwcmVzc2lvbj0icGFnZS5lbmdpbmUubG9jYWxlLmRpc3BsYXlOYW1lIi8+Ci0gIDwvY29tcG9uZW50PgotICAKLSAgPGNvbXBvbmVudCBpZD0iaWZOb1Zpc2l0IiB0eXBlPSJDb25kaXRpb25hbCI+Ci0gICAgPGJpbmRpbmcgbmFtZT0iY29uZGl0aW9uIiBleHByZXNzaW9uPSIhIHBhZ2UuZW5naW5lLmhhc1Zpc2l0Ii8+Ci0gIDwvY29tcG9uZW50PgotICAKLSAgPGNvbXBvbmVudCBpZD0iaW5zZXJ0VmlzaXQiIHR5cGU9Ikluc2VydCI+Ci0gICAgPGJpbmRpbmcgbmFtZT0idmFsdWUiIGV4cHJlc3Npb249InBhZ2UuZW5naW5lLnZpc2l0Ii8+Ci0gIDwvY29tcG9uZW50PgotICAKLSAgPGNvbXBvbmVudCBpZD0iaWZWaXNpdCIgdHlwZT0iQ29uZGl0aW9uYWwiPgotICAgIDxiaW5kaW5nIG5hbWU9ImNvbmRpdGlvbiIgZXhwcmVzc2lvbj0icGFnZS5lbmdpbmUuaGFzVmlzaXQiLz4KLSAgPC9jb21wb25lbnQ+Ci0gIAotICA8Y29tcG9uZW50IGlkPSJyZXN0YXJ0IiB0eXBlPSJTZXJ2aWNlTGluayI+Ci0gICAgPGJpbmRpbmcgbmFtZT0ic2VydmljZSIgZXhwcmVzc2lvbj0iQG9yZy5hcGFjaGUudGFwZXN0cnkuVGFwZXN0cnlAUkVTVEFSVF9TRVJWSUNFIi8+Ci0gIDwvY29tcG9uZW50PgotICAKLSAgPGNvbXBvbmVudCBpZD0icmVzdGFydEJ1dHRvbiIgdHlwZT0iUm9sbG92ZXIiPgotICAgIDxiaW5kaW5nIG5hbWU9ImltYWdlIiBleHByZXNzaW9uPSJhc3NldHMucmVzdGFydCIvPgotICAgIDxiaW5kaW5nIG5hbWU9ImZvY3VzIiBleHByZXNzaW9uPSJhc3NldHMucmVzdGFydEZvY3VzIi8+Ci0gIDwvY29tcG9uZW50PgotICAKLSAgPGNvbXBvbmVudCBpZD0icmVzZXQiIHR5cGU9IlNlcnZpY2VMaW5rIj4KLSAgICA8YmluZGluZyBuYW1lPSJzZXJ2aWNlIiBleHByZXNzaW9uPSJAb3JnLmFwYWNoZS50YXBlc3RyeS5UYXBlc3RyeUBSRVNFVF9TRVJWSUNFIi8+Ci0gICAgPGJpbmRpbmcgbmFtZT0iZGlzYWJsZWQiIGV4cHJlc3Npb249IiEgcGFnZS5lbmdpbmUucmVzZXRTZXJ2aWNlRW5hYmxlZCIvPgotICA8L2NvbXBvbmVudD4KLSAgCi0gIDxjb21wb25lbnQgaWQ9InJlc2V0QnV0dG9uIiB0eXBlPSJSb2xsb3ZlciI+Ci0gICAgPGJpbmRpbmcgbmFtZT0iaW1hZ2UiIGV4cHJlc3Npb249ImFzc2V0cy5yZXNldCIvPgotICAgIDxiaW5kaW5nIG5hbWU9ImZvY3VzIiBleHByZXNzaW9uPSJhc3NldHMucmVzZXRGb2N1cyIvPgotICAgIDxiaW5kaW5nIG5hbWU9ImRpc2FibGVkIiBleHByZXNzaW9uPSJhc3NldHMucmVzZXREaXNhYmxlZCIvPgotICA8L2NvbXBvbmVudD4KLSAgCi0gIDxjb21wb25lbnQgaWQ9Imluc2VydEJ5dGVDb3VudCIgdHlwZT0iSW5zZXJ0Ij4KLSAgICA8YmluZGluZyBuYW1lPSJ2YWx1ZSIgZXhwcmVzc2lvbj0iZW5naW5lQnl0ZUNvdW50Ii8+Ci0gIDwvY29tcG9uZW50PgotICAKLSAgPGNvbXBvbmVudCBpZD0iaW5zZXJ0U2VyaWFsaXplZEVuZ2luZSIgdHlwZT0iRGVsZWdhdG9yIj4KLSAgICA8YmluZGluZyBuYW1lPSJkZWxlZ2F0ZSIgZXhwcmVzc2lvbj0iZW5naW5lRHVtcERlbGVnYXRlIi8+Ci0gIDwvY29tcG9uZW50PgotICAKLSAgPGNvbXBvbmVudCBpZD0iaW5zZXJ0UmVxdWVzdCIgdHlwZT0iRGVsZWdhdG9yIj4KLSAgICA8YmluZGluZyBuYW1lPSJkZWxlZ2F0ZSIgZXhwcmVzc2lvbj0icGFnZS5yZXF1ZXN0Q3ljbGUucmVxdWVzdENvbnRleHQiLz4KLSAgPC9jb21wb25lbnQ+Ci0gIAotICA8cHJpdmF0ZS1hc3NldCBuYW1lPSJyZXNldCIgcmVzb3VyY2UtcGF0aD0iUmVzZXRfTnAxLmdpZiIvPgotICA8cHJpdmF0ZS1hc3NldCBuYW1lPSJyZXNldEZvY3VzIiByZXNvdXJjZS1wYXRoPSJSZXNldF9OUnAyLmdpZiIvPgotICA8cHJpdmF0ZS1hc3NldCBuYW1lPSJyZXNldERpc2FibGVkIiByZXNvdXJjZS1wYXRoPSJSZXNldF9OcDFfZGlzYWJsZWQuZ2lmIi8+Ci0gIDxwcml2YXRlLWFzc2V0IG5hbWU9InJlc3RhcnQiIHJlc291cmNlLXBhdGg9IlJlc3RhcnRfTnAxLmdpZiIvPgotICA8cHJpdmF0ZS1hc3NldCBuYW1lPSJyZXN0YXJ0Rm9jdXMiIHJlc291cmNlLXBhdGg9IlJlc3RhcnRfTlJwMi5naWYiLz4KLTwvY29tcG9uZW50LXNwZWNpZmljYXRpb24+CmRpZmYgLS1naXQgYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvaW5zcGVjdG9yL1Nob3dQcm9wZXJ0aWVzLmh0bWwgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvaW5zcGVjdG9yL1Nob3dQcm9wZXJ0aWVzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhYTY3ZDguLjAwMDAwMDAKLS0tIGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL2luc3BlY3Rvci9TaG93UHJvcGVydGllcy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotPCEtLSAkSWQkIC0tPgotCi08c3BhbiBqd2NpZD0iaWZOb1Byb3BlcnRpZXMiPgotPHNwYW4gY2xhc3M9Im1lc3NhZ2UiPlBhZ2UgY29udGFpbnMgbm8gcGVyc2lzdGVudCBwcm9wZXJ0aWVzLjwvc3Bhbj4KLTwvc3Bhbj4KLQotPHNwYW4gandjaWQ9ImlmSGFzUHJvcGVydGllcyI+Ci08dGFibGUgY2xhc3M9Imluc3BlY3Rvci1kYXRhIj4KLQk8dHIgY2xhc3M9ImhlYWRpbmciPgotCQk8dGg+Q29tcG9uZW50PC90aD4gPHRoPlByb3BlcnR5IE5hbWU8L3RoPiA8dGg+VmFsdWUgQ2xhc3M8L3RoPiA8dGg+VmFsdWU8L3RoPgotCTwvdHI+Ci0KLQk8dHIgandjaWQ9ImUiPgotCQk8dGQ+Ci0JCQk8YSBqd2NpZD0ic2VsZWN0Q29tcG9uZW50Ij48c3BhbiBqd2NpZD0iaW5zZXJ0UGF0aCIvPjwvYT4KLQkJPC90ZD4KLQkJPHRkPgotCQkJPHNwYW4gandjaWQ9Imluc2VydFBlcnNpc3RQcm9wZXJ0eU5hbWUiLz4KLQkJPC90ZD4KLQkJPHRkPgotCQkJPHNwYW4gandjaWQ9Imluc2VydFBlcnNpc3RWYWx1ZUNsYXNzIi8+Ci0JCTwvdGQ+Ci0JCTx0ZD4KLQkJCTxzcGFuIGp3Y2lkPSJpbnNlcnRQZXJzaXN0VmFsdWUiLz4KLQkJPC90ZD4KLQk8L3RyPgotCi08L3RhYmxlPgotCi0KLTwvc3Bhbj4KLQotCi0KLQkKZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9pbnNwZWN0b3IvU2hvd1Byb3BlcnRpZXMuamF2YSBiL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9pbnNwZWN0b3IvU2hvd1Byb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI5NmMyYy4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvaW5zcGVjdG9yL1Nob3dQcm9wZXJ0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi5pbnNwZWN0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuQmFzZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklFbmdpbmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUGFnZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmVuZ2luZS5JUGFnZVJlY29yZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuZXZlbnQuUGFnZUV2ZW50OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuZXZlbnQuUGFnZVJlbmRlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkucmVjb3JkLklQYWdlQ2hhbmdlOwotCi0vKioKLSAqICBDb21wb25lbnQgb2YgdGhlIHtAbGluayBJbnNwZWN0b3J9IHBhZ2UgdXNlZCB0byBkaXNwbGF5Ci0gKiAgdGhlIHBlcnNpc2VudCBwcm9wZXJ0aWVzIG9mIHRoZSBwYWdlLgotICoKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICoKLSAqKi8KLQotcHVibGljIGNsYXNzIFNob3dQcm9wZXJ0aWVzIGV4dGVuZHMgQmFzZUNvbXBvbmVudCBpbXBsZW1lbnRzIFBhZ2VSZW5kZXJMaXN0ZW5lcgotewotICAgIHByaXZhdGUgTGlzdCBfcHJvcGVydGllczsKLSAgICBwcml2YXRlIElQYWdlQ2hhbmdlIF9jaGFuZ2U7Ci0gICAgcHJpdmF0ZSBJUGFnZSBfaW5zcGVjdGVkUGFnZTsKLQotICAgIC8qKgotICAgICAqICBEb2VzIG5vdGhpbmcuCi0gICAgICoKLSAgICAgKiAgQHNpbmNlIDEuMC41Ci0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCBwYWdlQmVnaW5SZW5kZXIoUGFnZUV2ZW50IGV2ZW50KQotICAgIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgQHNpbmNlIDEuMC41Ci0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCBwYWdlRW5kUmVuZGVyKFBhZ2VFdmVudCBldmVudCkKLSAgICB7Ci0gICAgICAgIF9wcm9wZXJ0aWVzID0gbnVsbDsKLSAgICAgICAgX2NoYW5nZSA9IG51bGw7Ci0gICAgICAgIF9pbnNwZWN0ZWRQYWdlID0gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYnVpbGRQcm9wZXJ0aWVzKCkKLSAgICB7Ci0gICAgICAgIEluc3BlY3RvciBpbnNwZWN0b3IgPSAoSW5zcGVjdG9yKSBnZXRQYWdlKCk7Ci0KLSAgICAgICAgX2luc3BlY3RlZFBhZ2UgPSBpbnNwZWN0b3IuZ2V0SW5zcGVjdGVkUGFnZSgpOwotCi0gICAgICAgIElFbmdpbmUgZW5naW5lID0gZ2V0UGFnZSgpLmdldEVuZ2luZSgpOwotICAgICAgICBJUGFnZVJlY29yZGVyIHJlY29yZGVyID0KLSAgICAgICAgICAgIGVuZ2luZS5nZXRQYWdlUmVjb3JkZXIoX2luc3BlY3RlZFBhZ2UuZ2V0UGFnZU5hbWUoKSwgaW5zcGVjdG9yLmdldFJlcXVlc3RDeWNsZSgpKTsKLQotICAgICAgICAvLyBObyBwYWdlIHJlY29yZGVyPyAgTm8gcHJvcGVydGllcy4KLQotICAgICAgICBpZiAocmVjb3JkZXIgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgX3Byb3BlcnRpZXMgPSBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHJlY29yZGVyLmdldEhhc0NoYW5nZXMoKSkKLSAgICAgICAgICAgIF9wcm9wZXJ0aWVzID0gbmV3IEFycmF5TGlzdChyZWNvcmRlci5nZXRDaGFuZ2VzKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIGEge0BsaW5rIExpc3R9IG9mIHtAbGluayBJUGFnZUNoYW5nZX0gb2JqZWN0cy4KLSAgICAgKgotICAgICAqICA8cD5Tb3J0IG9yZGVyIGlzIG5vdCBkZWZpbmVkLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIExpc3QgZ2V0UHJvcGVydGllcygpCi0gICAgewotICAgICAgICBpZiAoX3Byb3BlcnRpZXMgPT0gbnVsbCkKLSAgICAgICAgICAgIGJ1aWxkUHJvcGVydGllcygpOwotCi0gICAgICAgIHJldHVybiBfcHJvcGVydGllczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDaGFuZ2UoSVBhZ2VDaGFuZ2UgdmFsdWUpCi0gICAgewotICAgICAgICBfY2hhbmdlID0gdmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIElQYWdlQ2hhbmdlIGdldENoYW5nZSgpCi0gICAgewotICAgICAgICByZXR1cm4gX2NoYW5nZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgdmFsdWUncyBjbGFzcywgaWYgdGhlIHZhbHVlIGlzIG5vbi1udWxsLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIFN0cmluZyBnZXRWYWx1ZUNsYXNzTmFtZSgpCi0gICAgewotICAgICAgICBPYmplY3QgdmFsdWU7Ci0KLSAgICAgICAgdmFsdWUgPSBfY2hhbmdlLmdldE5ld1ZhbHVlKCk7Ci0KLSAgICAgICAgaWYgKHZhbHVlID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gIjxudWxsPiI7Ci0KLSAgICAgICAgcmV0dXJuIGNvbnZlcnRDbGFzc1RvTmFtZSh2YWx1ZS5nZXRDbGFzcygpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBjb252ZXJ0Q2xhc3NUb05hbWUoQ2xhc3MgY2wpCi0gICAgewotICAgICAgICAvLyBUT0RPOiBUaGlzIG9ubHkgaGFuZGxlcyBvbmUtZGltZW5zaW9uYWwgYXJyYXlzCi0gICAgICAgIC8vIHByb3BlcnR5LgotCi0gICAgICAgIGlmIChjbC5pc0FycmF5KCkpCi0gICAgICAgICAgICByZXR1cm4gImFycmF5IG9mICIgKyBjbC5nZXRDb21wb25lbnRUeXBlKCkuZ2V0TmFtZSgpOwotCi0gICAgICAgIHJldHVybiBjbC5nZXROYW1lKCk7Ci0gICAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL2luc3BlY3Rvci9TaG93UHJvcGVydGllcy5qd2MgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvaW5zcGVjdG9yL1Nob3dQcm9wZXJ0aWVzLmp3YwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJkZTZhZi4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvaW5zcGVjdG9yL1Nob3dQcm9wZXJ0aWVzLmp3YworKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAgCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPCEtLSAkSWQkIC0tPgotPCFET0NUWVBFIGNvbXBvbmVudC1zcGVjaWZpY2F0aW9uIFBVQkxJQyAKLSAgIi0vL0FwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLy9UYXBlc3RyeSBTcGVjaWZpY2F0aW9uIDMuMC8vRU4iIAotICAiaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy90YXBlc3RyeS9kdGQvVGFwZXN0cnlfM18wLmR0ZCI+Ci0JCi08Y29tcG9uZW50LXNwZWNpZmljYXRpb24gY2xhc3M9Im9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi5pbnNwZWN0b3IuU2hvd1Byb3BlcnRpZXMiPgotCi0gIDxiZWFuIG5hbWU9InBlcnNpc3RQcm9wZXJ0eUNsYXNzIiBjbGFzcz0ib3JnLmFwYWNoZS50YXBlc3RyeS5iZWFuLkV2ZW5PZGQiLz4KLSAgPGJlYW4gbmFtZT0icHJvcGVydHlDbGFzcyIgY2xhc3M9Im9yZy5hcGFjaGUudGFwZXN0cnkuYmVhbi5FdmVuT2RkIi8+Ci0gIAotICA8Y29tcG9uZW50IGlkPSJpZk5vUHJvcGVydGllcyIgdHlwZT0iQ29uZGl0aW9uYWwiPgotICAgIDxiaW5kaW5nIG5hbWU9ImNvbmRpdGlvbiIgZXhwcmVzc2lvbj0iIXByb3BlcnRpZXMiLz4KLSAgPC9jb21wb25lbnQ+Ci0gIAotICA8Y29tcG9uZW50IGlkPSJpZkhhc1Byb3BlcnRpZXMiIHR5cGU9IkNvbmRpdGlvbmFsIj4KLSAgICA8YmluZGluZyBuYW1lPSJjb25kaXRpb24iIGV4cHJlc3Npb249InByb3BlcnRpZXMiLz4KLSAgPC9jb21wb25lbnQ+Ci0gIAotICA8Y29tcG9uZW50IGlkPSJlIiB0eXBlPSJGb3JlYWNoIj4KLSAgICA8YmluZGluZyBuYW1lPSJzb3VyY2UiIGV4cHJlc3Npb249InByb3BlcnRpZXMiLz4KLSAgICA8YmluZGluZyBuYW1lPSJ2YWx1ZSIgZXhwcmVzc2lvbj0iY2hhbmdlIi8+Ci0gICAgPHN0YXRpYy1iaW5kaW5nIG5hbWU9ImVsZW1lbnQiPnRyPC9zdGF0aWMtYmluZGluZz4KLSAgICA8YmluZGluZyBuYW1lPSJjbGFzcyIgZXhwcmVzc2lvbj0iYmVhbnMucGVyc2lzdFByb3BlcnR5Q2xhc3MubmV4dCIvPgotICA8L2NvbXBvbmVudD4KLSAgCi0gIDxjb21wb25lbnQgaWQ9InNlbGVjdENvbXBvbmVudCIgdHlwZT0iRGlyZWN0TGluayI+Ci0gICAgPGJpbmRpbmcgbmFtZT0ibGlzdGVuZXIiIGV4cHJlc3Npb249InBhZ2UubGlzdGVuZXJzLnNlbGVjdENvbXBvbmVudCIvPgotICAgIDxiaW5kaW5nIG5hbWU9InBhcmFtZXRlcnMiIGV4cHJlc3Npb249ImNoYW5nZS5jb21wb25lbnRQYXRoIi8+Ci0gICAgPGJpbmRpbmcgbmFtZT0iZGlzYWJsZWQiIGV4cHJlc3Npb249ImNoYW5nZS5jb21wb25lbnRQYXRoID09IG51bGwiLz4KLSAgPC9jb21wb25lbnQ+Ci0gIAotICA8Y29tcG9uZW50IGlkPSJpbnNlcnRQYXRoIiB0eXBlPSJJbnNlcnQiPgotICAgIDxiaW5kaW5nIG5hbWU9InZhbHVlIiBleHByZXNzaW9uPSJjaGFuZ2UuY29tcG9uZW50UGF0aCIvPgotICA8L2NvbXBvbmVudD4KLSAgCi0gIDxjb21wb25lbnQgaWQ9Imluc2VydFBlcnNpc3RQcm9wZXJ0eU5hbWUiIHR5cGU9Ikluc2VydCI+Ci0gICAgPGJpbmRpbmcgbmFtZT0idmFsdWUiIGV4cHJlc3Npb249ImNoYW5nZS5wcm9wZXJ0eU5hbWUiLz4KLSAgPC9jb21wb25lbnQ+Ci0gIAotICA8Y29tcG9uZW50IGlkPSJpbnNlcnRQZXJzaXN0VmFsdWVDbGFzcyIgdHlwZT0iSW5zZXJ0Ij4KLSAgICA8YmluZGluZyBuYW1lPSJ2YWx1ZSIgZXhwcmVzc2lvbj0idmFsdWVDbGFzc05hbWUiLz4KLSAgPC9jb21wb25lbnQ+Ci0gIAotICA8Y29tcG9uZW50IGlkPSJpbnNlcnRQZXJzaXN0VmFsdWUiIHR5cGU9Ikluc2VydCI+Ci0gICAgPGJpbmRpbmcgbmFtZT0idmFsdWUiIGV4cHJlc3Npb249ImNoYW5nZS5uZXdWYWx1ZSIvPgotICA8L2NvbXBvbmVudD4KLSAgCi08L2NvbXBvbmVudC1zcGVjaWZpY2F0aW9uPgpkaWZmIC0tZ2l0IGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL2luc3BlY3Rvci9TaG93U3BlY2lmaWNhdGlvbi5odG1sIGIvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL2luc3BlY3Rvci9TaG93U3BlY2lmaWNhdGlvbi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGJkY2NmLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9pbnNwZWN0b3IvU2hvd1NwZWNpZmljYXRpb24uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi08IS0tICRJZCQgLS0+Ci0KLTx0YWJsZT4KLTx0ciB2YWxpZ249dG9wPgotPHRkPgotCi08dGFibGUgY2xhc3M9Imluc3BlY3Rvci1kYXRhIiB3aWR0aD0iMTAwJSI+Ci0JPHRyIGNsYXNzPSJldmVuIj4KLQkJPHRoPlNwZWNpZmljYXRpb24gUmVzb3VyY2UgTG9jYXRpb248L3RoPgotCQk8dGQ+PHNwYW4gandjaWQ9IkBJbnNlcnQiIHZhbHVlPSJvZ25sOmluc3BlY3RlZFNwZWNpZmljYXRpb24uc3BlY2lmaWNhdGlvbkxvY2F0aW9uIi8+Ci0JCTxzcGFuIGp3Y2lkPSJAU2hvd0Rlc2NyaXB0aW9uIiBkZXNjcmlwdGlvbj0ib2dubDppbnNwZWN0ZWRTcGVjaWZpY2F0aW9uLmRlc2NyaXB0aW9uIi8+Ci0JCTwvdGQ+Ci0JPC90cj4KLQkKLQk8dHIgY2xhc3M9Im9kZCI+Ci0JCTx0aD5KYXZhIGNsYXNzPC90aD4KLQkJPHRkPjxzcGFuIGp3Y2lkPSJASW5zZXJ0IiB2YWx1ZT0ib2dubDppbnNwZWN0ZWRDb21wb25lbnQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkiLz48L3RkPgotCTwvdHI+Ci0KLTxzcGFuIGp3Y2lkPSJAQ29uZGl0aW9uYWwiIGNvbmRpdGlvbj0ib2dubDohIGluc3BlY3RlZFNwZWNpZmljYXRpb24ucGFnZVNwZWNpZmljYXRpb24iPgotCi0JPHRyIGNsYXNzPSJldmVuIj4KLQkJPHRoPkFsbG93IGluZm9ybWFsIHBhcmFtZXRlcnM8L3RoPgotCQk8dGQ+PHNwYW4gandjaWQ9IkBJbnNlcnQiIHZhbHVlPSJvZ25sOmluc3BlY3RlZFNwZWNpZmljYXRpb24uYWxsb3dJbmZvcm1hbFBhcmFtZXRlcnMiLz48L3RkPgotCTwvdHI+Ci0KLQk8dHIgY2xhc3M9Im9kZCI+Ci0JCTx0aD5BbGxvdyBib2R5PC90aD4KLQkJPHRkPjxzcGFuIGp3Y2lkPSJASW5zZXJ0IiB2YWx1ZT0ib2dubDppbnNwZWN0ZWRTcGVjaWZpY2F0aW9uLmFsbG93Qm9keSIvPjwvdGQ+Ci0JPC90cj4KLQkKLTwvc3Bhbj4KLQkKLTwvdGFibGU+Ci0KLTxzcGFuIGp3Y2lkPSJAQ29uZGl0aW9uYWwiIGNvbmRpdGlvbj0ib2dubDpmb3JtYWxQYXJhbWV0ZXJOYW1lcyI+Ci0KLTx0YWJsZSBjbGFzcz0iaW5zcGVjdG9yLWRhdGEiIHdpZHRoPSIxMDAlIj4KLQk8dHIgY2xhc3M9ImhlYWRpbmciPgotCQk8dGggY29sc3Bhbj00PkZvcm1hbCBQYXJhbWV0ZXJzPC90aD4KLQk8L3RyPgotCTx0ciBjbGFzcz0iaGVhZGluZyI+Ci0JCTx0aD5OYW1lPC90aD4gPHRoPlJlcXVpcmVkPC90aD4gPHRoPkphdmEgdHlwZTwvdGg+IDx0aD5CaW5kaW5nPC90aD4KLQk8L3RyPgotCi0JPHRyIGp3Y2lkPSJlX2Zvcm1hbCI+Ci0JCTx0ZD48c3BhbiBqd2NpZD0iQEluc2VydCIgdmFsdWU9Im9nbmw6cGFyYW1ldGVyTmFtZSIvPgotCQk8c3BhbiBqd2NpZD0iQFNob3dEZXNjcmlwdGlvbiIgZGVzY3JpcHRpb249Im9nbmw6cGFyYW1ldGVyU3BlY2lmaWNhdGlvbi5kZXNjcmlwdGlvbiIvPgotCQk8L3RkPgotCQk8dGQ+PHNwYW4gandjaWQ9IkBJbnNlcnQiIHZhbHVlPSJvZ25sOnBhcmFtZXRlclNwZWNpZmljYXRpb24ucmVxdWlyZWQiLz48L3RkPgotCQk8dGQ+PHNwYW4gandjaWQ9IkBJbnNlcnQiIHZhbHVlPSJvZ25sOnBhcmFtZXRlclNwZWNpZmljYXRpb24udHlwZSIvPjwvdGQ+Ci0JCTx0ZD48c3BhbiBqd2NpZD0iQEluc2VydCIgdmFsdWU9Im9nbmw6YmluZGluZyIvPjwvdGQ+Ci0JPC90cj4KLQotPC90YWJsZT4KLTwvc3Bhbj4KLQotPHNwYW4gandjaWQ9IkBDb25kaXRpb25hbCIgY29uZGl0aW9uPSJvZ25sOmluZm9ybWFsUGFyYW1ldGVyTmFtZXMiPgotCi08dGFibGUgY2xhc3M9Imluc3BlY3Rvci1kYXRhIiB3aWR0aD0iMTAwJSI+Ci0JPHRyIGNsYXNzPSJoZWFkaW5nIj4KLQkJPHRoIGNvbHNwYW49Mj5JbmZvcm1hbCBQYXJhbWV0ZXJzPC90aD4KLQk8L3RyPgotCTx0ciBjbGFzcz0iaGVhZGluZyI+Ci0JCTx0aD5OYW1lPC90aD4gPHRoPkJpbmRpbmc8L3RoPgotCTwvdHI+Ci0KLQk8dHIgandjaWQ9ImVfaW5mb3JtYWwiPgotCQk8dGQ+PHNwYW4gandjaWQ9IkBJbnNlcnQiIHZhbHVlPSJvZ25sOnBhcmFtZXRlck5hbWUiLz48L3RkPgotCQk8dGQ+PHNwYW4gandjaWQ9IkBJbnNlcnQiIHZhbHVlPSJvZ25sOmJpbmRpbmciLz48L3RkPgotCTwvdHI+Ci0KLTwvdGFibGU+Ci08L3NwYW4+Ci0KLTxzcGFuIGp3Y2lkPSJAQ29uZGl0aW9uYWwiIGNvbmRpdGlvbj0ib2dubDphc3NldE5hbWVzIj4KLQotPHRhYmxlIGNsYXNzPSJpbnNwZWN0b3ItZGF0YSIgIHdpZHRoPSIxMDAlIj4KLQk8dHIgY2xhc3M9ImhlYWRpbmciPgotCQk8dGggY29sc3Bhbj0yPkFzc2V0czwvdGg+Ci0JPC90cj4KLQk8dHIgY2xhc3M9ImhlYWRpbmciPgotCQk8dGg+TmFtZTwvdGg+IDx0aD5Bc3NldDwvdGg+Ci0JPC90cj4KLQotCTx0ciBqd2NpZD0iZV9hc3NldCI+Ci0JCTx0ZD48c3BhbiBqd2NpZD0iQEluc2VydCIgdmFsdWU9Im9nbmw6YXNzZXROYW1lIi8+PC90ZD4KLQkJPHRkPjxzcGFuIGp3Y2lkPSJASW5zZXJ0IiB2YWx1ZT0ib2dubDphc3NldCIvPjwvdGQ+Ci0JPC90cj4KLQotCi08L3RhYmxlPgotPC9zcGFuPgotCi08c3BhbiBqd2NpZD0iQENvbmRpdGlvbmFsIiBjb25kaXRpb249Im9nbmw6c29ydGVkUHJvcGVydHlOYW1lcyI+Ci0KLTx0YWJsZSBjbGFzcz0iaW5zcGVjdG9yLWRhdGEiIHdpZHRoPSIxMDAlIj4KLQk8dHIgY2xhc3M9ImhlYWRpbmciPgotCQk8dGggY29sc3Bhbj0yPlByb3BlcnRpZXM8L3RoPgotCTwvdHI+Ci0JPHRyIGNsYXNzPSJoZWFkaW5nIj4KLQkJPHRoPk5hbWU8L3RoPiA8dGg+UHJvcGVydHk8L3RoPgotCTwvdHI+Ci0KLQk8dHIgandjaWQ9ImVfcHJvcGVydHkiPgotCQk8dGg+PHNwYW4gandjaWQ9IkBJbnNlcnQiIHZhbHVlPSJvZ25sOnByb3BlcnR5TmFtZSIvPjwvdGg+Ci0JCTx0ZD48c3BhbiBqd2NpZD0iQEluc2VydCIgdmFsdWU9Im9nbmw6cHJvcGVydHlWYWx1ZSIvPjwvdGQ+Ci0JPC90cj4KLQotPC90YWJsZT4KLTwvc3Bhbj4KLQotPHNwYW4gandjaWQ9IkBDb25kaXRpb25hbCIgY29uZGl0aW9uPSJvZ25sOmJlYW5OYW1lcyI+Ci0KLTx0YWJsZSBjbGFzcz0iaW5zcGVjdG9yLWRhdGEiIHdpZHRoPSIxMDAlIj4KLQk8dHIgY2xhc3M9ImhlYWRpbmciPgotCQk8dGggY29sc3Bhbj0zPkhlbHBlciBCZWFuczwvdGg+Ci0JPC90cj4KLQkKLQk8dHIgY2xhc3M9ImhlYWRpbmciPgotCQk8dGg+TmFtZTwvdGg+IDx0aD5DbGFzczwvdGg+IDx0aD5MaWZlY3ljbGU8L3RoPgotCTwvdHI+Ci0JCi0JPHRyIGp3Y2lkPSJlX2JlYW4iPgotCQk8dGQ+PHNwYW4gandjaWQ9IkBJbnNlcnQiIHZhbHVlPSJvZ25sOmJlYW5OYW1lIi8+PC90ZD4KLQkJPHRkPjxzcGFuIGp3Y2lkPSJASW5zZXJ0IiB2YWx1ZT0ib2dubDpiZWFuU3BlY2lmaWNhdGlvbi5jbGFzc05hbWUiLz48L3RkPgotCQk8dGQ+PHNwYW4gandjaWQ9IkBJbnNlcnQiIHZhbHVlPSJvZ25sOmJlYW5TcGVjaWZpY2F0aW9uLmxpZmVjeWNsZS5uYW1lIi8+PC90ZD4KLQk8L3RyPgotCQotPC90YWJsZT4KLTwvc3Bhbj4KLQotPC90ZD4KLQotPHRkPgotPHNwYW4gandjaWQ9IkBDb25kaXRpb25hbCIgY29uZGl0aW9uPSJvZ25sOnNvcnRlZENvbXBvbmVudHMiPgotCi08dGFibGUgYm9yZGVyPSIwIiBjbGFzcz0iaW5zcGVjdG9yLWRhdGEiPgotCi0JPHRyIGNsYXNzPSJoZWFkaW5nIj4KLQkJPHRoIGNvbHNwYW49Mj5FbWJlZGRlZCBDb21wb25lbnRzPC90aD4KLQk8L3RyPgotCTx0ciBjbGFzcz0iaGVhZGluZyI+Ci0JCTx0aD5JZDwvdGg+IDx0aD5UeXBlPC90aD4KLQk8L3RyPgotCi0JPHRyIGp3Y2lkPSJlX2NvbXBvbmVudHMiPgotCQk8dGQ+Ci0JCQk8YSBqd2NpZD0ic2VsZWN0Q29tcG9uZW50Ij48c3BhbiBqd2NpZD0iQEluc2VydCIgdmFsdWU9Im9nbmw6Y29tcG9uZW50LmlkIi8+PC9hPgotCQk8L3RkPgotCQk8dGQ+Ci0JCQk8c3BhbiBqd2NpZD0iQEluc2VydCIgdmFsdWU9Im9nbmw6Y29tcG9uZW50VHlwZSIvPgotCQk8L3RkPgotCTwvdHI+Ci0KLTwvdGFibGU+Ci08L3NwYW4+Ci0KLTwvdGQ+Ci08L3RyPgotPC90YWJsZT4KZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9pbnNwZWN0b3IvU2hvd1NwZWNpZmljYXRpb24uamF2YSBiL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9pbnNwZWN0b3IvU2hvd1NwZWNpZmljYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDk4YTZmYS4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvaW5zcGVjdG9yL1Nob3dTcGVjaWZpY2F0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjYgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi5pbnNwZWN0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5CYXNlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUFzc2V0OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUJpbmRpbmc7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JQ29tcG9uZW50OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuZXZlbnQuUGFnZUV2ZW50OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuZXZlbnQuUGFnZVJlbmRlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuc3BlYy5JQmVhblNwZWNpZmljYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5zcGVjLklDb21wb25lbnRTcGVjaWZpY2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuc3BlYy5JQ29udGFpbmVkQ29tcG9uZW50OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuc3BlYy5JUGFyYW1ldGVyU3BlY2lmaWNhdGlvbjsKLQotLyoqCi0gKiAgQ29tcG9uZW50IG9mIHRoZSB7QGxpbmsgSW5zcGVjdG9yfSBwYWdlIHVzZWQgdG8gZGlzcGxheQotICogIHRoZSBzcGVjaWZpY2F0aW9uLCBwYXJhbWV0ZXJzIGFuZCBiaW5kaW5ncyBhbmQgYXNzZXRzIG9mIHRoZSBpbnNwZWN0ZWQgY29tcG9uZW50LgotICoKLSAqCi0gKiAgQHZlcnNpb24gJElkJAotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqCi0gKiovCi0KLXB1YmxpYyBjbGFzcyBTaG93U3BlY2lmaWNhdGlvbiBleHRlbmRzIEJhc2VDb21wb25lbnQgaW1wbGVtZW50cyBQYWdlUmVuZGVyTGlzdGVuZXIKLXsKLSAgICBwcml2YXRlIElDb21wb25lbnQgX2luc3BlY3RlZENvbXBvbmVudDsKLSAgICBwcml2YXRlIElDb21wb25lbnRTcGVjaWZpY2F0aW9uIF9pbnNwZWN0ZWRTcGVjaWZpY2F0aW9uOwotICAgIHByaXZhdGUgU3RyaW5nIF9wYXJhbWV0ZXJOYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIF9hc3NldE5hbWU7Ci0gICAgcHJpdmF0ZSBMaXN0IF9zb3J0ZWRDb21wb25lbnRzOwotICAgIHByaXZhdGUgSUNvbXBvbmVudCBfY29tcG9uZW50OwotICAgIHByaXZhdGUgTGlzdCBfYXNzZXROYW1lczsKLSAgICBwcml2YXRlIExpc3QgX2Zvcm1hbFBhcmFtZXRlck5hbWVzOwotICAgIHByaXZhdGUgTGlzdCBfaW5mb3JtYWxQYXJhbWV0ZXJOYW1lczsKLSAgICBwcml2YXRlIExpc3QgX3NvcnRlZFByb3BlcnR5TmFtZXM7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgX3Byb3BlcnR5TmFtZTsKLSAgICBwcml2YXRlIExpc3QgX2JlYW5OYW1lczsKLSAgICBwcml2YXRlIFN0cmluZyBfYmVhbk5hbWU7Ci0gICAgcHJpdmF0ZSBJQmVhblNwZWNpZmljYXRpb24gX2JlYW5TcGVjaWZpY2F0aW9uOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ29tcG9uZW50Q29tcGFyaXRvciBpbXBsZW1lbnRzIENvbXBhcmF0b3IKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbGVmdCwgT2JqZWN0IHJpZ2h0KQotICAgICAgICB7Ci0gICAgICAgICAgICBJQ29tcG9uZW50IGxlZnRDb21wb25lbnQ7Ci0gICAgICAgICAgICBTdHJpbmcgbGVmdElkOwotICAgICAgICAgICAgSUNvbXBvbmVudCByaWdodENvbXBvbmVudDsKLSAgICAgICAgICAgIFN0cmluZyByaWdodElkOwotCi0gICAgICAgICAgICBpZiAobGVmdCA9PSByaWdodCkKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLQotICAgICAgICAgICAgbGVmdENvbXBvbmVudCA9IChJQ29tcG9uZW50KSBsZWZ0OwotICAgICAgICAgICAgcmlnaHRDb21wb25lbnQgPSAoSUNvbXBvbmVudCkgcmlnaHQ7Ci0KLSAgICAgICAgICAgIGxlZnRJZCA9IGxlZnRDb21wb25lbnQuZ2V0SWQoKTsKLSAgICAgICAgICAgIHJpZ2h0SWQgPSByaWdodENvbXBvbmVudC5nZXRJZCgpOwotCi0gICAgICAgICAgICByZXR1cm4gbGVmdElkLmNvbXBhcmVUbyhyaWdodElkKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqICBDbGVhcnMgYWxsIGNhY2hlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29tcG9uZW50IGFuZCBzdWNoIGFmdGVyCi0gICAgICogIGVhY2ggcmVuZGVyIChpbmNsdWRpbmcgdGhlIHJld2luZCBwaGFzZSByZW5kZXIgdXNlZCB0byBwcm9jZXNzCi0gICAgICogIHRoZSB0YWIgdmlldykuCi0gICAgICoKLSAgICAgKiAgQHNpbmNlIDEuMC41Ci0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCBwYWdlRW5kUmVuZGVyKFBhZ2VFdmVudCBldmVudCkKLSAgICB7Ci0gICAgICAgIF9pbnNwZWN0ZWRDb21wb25lbnQgPSBudWxsOwotICAgICAgICBfaW5zcGVjdGVkU3BlY2lmaWNhdGlvbiA9IG51bGw7Ci0gICAgICAgIF9wYXJhbWV0ZXJOYW1lID0gbnVsbDsKLSAgICAgICAgX2Fzc2V0TmFtZSA9IG51bGw7Ci0gICAgICAgIF9zb3J0ZWRDb21wb25lbnRzID0gbnVsbDsKLSAgICAgICAgX2NvbXBvbmVudCA9IG51bGw7Ci0gICAgICAgIF9hc3NldE5hbWVzID0gbnVsbDsKLSAgICAgICAgX2Zvcm1hbFBhcmFtZXRlck5hbWVzID0gbnVsbDsKLSAgICAgICAgX2luZm9ybWFsUGFyYW1ldGVyTmFtZXMgPSBudWxsOwotICAgICAgICBfc29ydGVkUHJvcGVydHlOYW1lcyA9IG51bGw7Ci0gICAgICAgIF9wcm9wZXJ0eU5hbWUgPSBudWxsOwotICAgICAgICBfYmVhbk5hbWVzID0gbnVsbDsKLSAgICAgICAgX2JlYW5OYW1lID0gbnVsbDsKLSAgICAgICAgX2JlYW5TcGVjaWZpY2F0aW9uID0gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgR2V0cyB0aGUgaW5zcGVjdGVkIGNvbXBvbmVudCBhbmQgc3BlY2lmaWNhdGlvbiBmcm9tIHRoZSB7QGxpbmsgSW5zcGVjdG9yfSBwYWdlLgotICAgICAqCi0gICAgICogIEBzaW5jZSAxLjAuNQotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIHBhZ2VCZWdpblJlbmRlcihQYWdlRXZlbnQgZXZlbnQpCi0gICAgewotICAgICAgICBJbnNwZWN0b3IgaW5zcGVjdG9yID0gKEluc3BlY3RvcikgZ2V0UGFnZSgpOwotCi0gICAgICAgIF9pbnNwZWN0ZWRDb21wb25lbnQgPSBpbnNwZWN0b3IuZ2V0SW5zcGVjdGVkQ29tcG9uZW50KCk7Ci0gICAgICAgIF9pbnNwZWN0ZWRTcGVjaWZpY2F0aW9uID0gX2luc3BlY3RlZENvbXBvbmVudC5nZXRTcGVjaWZpY2F0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIElDb21wb25lbnQgZ2V0SW5zcGVjdGVkQ29tcG9uZW50KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfaW5zcGVjdGVkQ29tcG9uZW50OwotICAgIH0KLQotICAgIHB1YmxpYyBJQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBnZXRJbnNwZWN0ZWRTcGVjaWZpY2F0aW9uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfaW5zcGVjdGVkU3BlY2lmaWNhdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyBhIHNvcnRlZCBsaXN0IG9mIGZvcm1hbCBwYXJhbWV0ZXIgbmFtZXMuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgTGlzdCBnZXRGb3JtYWxQYXJhbWV0ZXJOYW1lcygpCi0gICAgewotICAgICAgICBpZiAoX2Zvcm1hbFBhcmFtZXRlck5hbWVzID09IG51bGwpCi0gICAgICAgICAgICBfZm9ybWFsUGFyYW1ldGVyTmFtZXMgPSBzb3J0KF9pbnNwZWN0ZWRTcGVjaWZpY2F0aW9uLmdldFBhcmFtZXRlck5hbWVzKCkpOwotCi0gICAgICAgIHJldHVybiBfZm9ybWFsUGFyYW1ldGVyTmFtZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgYSBzb3J0ZWQgbGlzdCBvZiBpbmZvcm1hbCBwYXJhbWV0ZXIgbmFtZXMuICBUaGlzIGlzCi0gICAgICogIHRoZSBsaXN0IG9mIGFsbCBiaW5kaW5ncywgd2l0aCB0aGUgbGlzdCBvZiBwYXJhbWV0ZXIgbmFtZXMgcmVtb3ZlZCwKLSAgICAgKiAgc29ydGVkLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIExpc3QgZ2V0SW5mb3JtYWxQYXJhbWV0ZXJOYW1lcygpCi0gICAgewotICAgICAgICBpZiAoX2luZm9ybWFsUGFyYW1ldGVyTmFtZXMgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBfaW5mb3JtYWxQYXJhbWV0ZXJOYW1lczsKLQotICAgICAgICBDb2xsZWN0aW9uIG5hbWVzID0gX2luc3BlY3RlZENvbXBvbmVudC5nZXRCaW5kaW5nTmFtZXMoKTsKLSAgICAgICAgaWYgKG5hbWVzICE9IG51bGwgJiYgbmFtZXMuc2l6ZSgpID4gMCkKLSAgICAgICAgewotICAgICAgICAgICAgX2luZm9ybWFsUGFyYW1ldGVyTmFtZXMgPSBuZXcgQXJyYXlMaXN0KG5hbWVzKTsKLQotICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBuYW1lcyBvZiBhbnkgZm9ybWFsIHBhcmFtZXRlcnMuICBUaGlzIGxlYXZlcwotICAgICAgICAgICAgLy8ganVzdCB0aGUgbmFtZXMgb2YgaW5mb3JtYWwgcGFyYW1ldGVycyAoaW5mb3JtYWwgcGFyYW1ldGVycwotICAgICAgICAgICAgLy8gYXJlIGFueSBwYXJhbWV0ZXJzL2JpbmRpbmdzIHRoYXQgZG9uJ3QgbWF0Y2ggYSBmb3JtYWwgcGFyYW1ldGVyCi0gICAgICAgICAgICAvLyBuYW1lKS4KLQotICAgICAgICAgICAgbmFtZXMgPSBfaW5zcGVjdGVkU3BlY2lmaWNhdGlvbi5nZXRQYXJhbWV0ZXJOYW1lcygpOwotICAgICAgICAgICAgaWYgKG5hbWVzICE9IG51bGwpCi0gICAgICAgICAgICAgICAgX2luZm9ybWFsUGFyYW1ldGVyTmFtZXMucmVtb3ZlQWxsKG5hbWVzKTsKLQotICAgICAgICAgICAgQ29sbGVjdGlvbnMuc29ydChfaW5mb3JtYWxQYXJhbWV0ZXJOYW1lcyk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gX2luZm9ybWFsUGFyYW1ldGVyTmFtZXM7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXJhbWV0ZXJOYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfcGFyYW1ldGVyTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJhbWV0ZXJOYW1lKFN0cmluZyB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIF9wYXJhbWV0ZXJOYW1lID0gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgdGhlIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LnNwZWMuUGFyYW1ldGVyU3BlY2lmaWNhdGlvbn0gY29ycmVzcG9uZGluZyB0bwotICAgICAqICB0aGUgdmFsdWUgb2YgdGhlIHBhcmFtZXRlck5hbWUgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgSVBhcmFtZXRlclNwZWNpZmljYXRpb24gZ2V0UGFyYW1ldGVyU3BlY2lmaWNhdGlvbigpCi0gICAgewotICAgICAgICByZXR1cm4gX2luc3BlY3RlZFNwZWNpZmljYXRpb24uZ2V0UGFyYW1ldGVyKF9wYXJhbWV0ZXJOYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0aGUge0BsaW5rIElCaW5kaW5nfSBjb3JyZXNwb25kaW5nIHRvIHRoZSB2YWx1ZSBvZgotICAgICAqICB0aGUgcGFyYW1ldGVyTmFtZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBJQmluZGluZyBnZXRCaW5kaW5nKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfaW5zcGVjdGVkQ29tcG9uZW50LmdldEJpbmRpbmcoX3BhcmFtZXRlck5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEFzc2V0TmFtZShTdHJpbmcgdmFsdWUpCi0gICAgewotICAgICAgICBfYXNzZXROYW1lID0gdmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBc3NldE5hbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9hc3NldE5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgdGhlIHtAbGluayBJQXNzZXR9IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHZhbHVlCi0gICAgICogIG9mIHRoZSBhc3NldE5hbWUgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgSUFzc2V0IGdldEFzc2V0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoSUFzc2V0KSBfaW5zcGVjdGVkQ29tcG9uZW50LmdldEFzc2V0cygpLmdldChfYXNzZXROYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyBhIHNvcnRlZCBsaXN0IG9mIGFzc2V0IG5hbWVzLCBvciBudWxsIGlmIHRoZQotICAgICAqICBjb21wb25lbnQgY29udGFpbnMgbm8gYXNzZXRzLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIExpc3QgZ2V0QXNzZXROYW1lcygpCi0gICAgewotICAgICAgICBpZiAoX2Fzc2V0TmFtZXMgPT0gbnVsbCkKLSAgICAgICAgICAgIF9hc3NldE5hbWVzID0gc29ydChfaW5zcGVjdGVkQ29tcG9uZW50LmdldEFzc2V0cygpLmtleVNldCgpKTsKLQotICAgICAgICByZXR1cm4gX2Fzc2V0TmFtZXM7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3QgZ2V0U29ydGVkQ29tcG9uZW50cygpCi0gICAgewotICAgICAgICBpZiAoX3NvcnRlZENvbXBvbmVudHMgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBfc29ydGVkQ29tcG9uZW50czsKLQotICAgICAgICBJbnNwZWN0b3IgaW5zcGVjdG9yID0gKEluc3BlY3RvcikgZ2V0UGFnZSgpOwotICAgICAgICBJQ29tcG9uZW50IGluc3BlY3RlZENvbXBvbmVudCA9IGluc3BlY3Rvci5nZXRJbnNwZWN0ZWRDb21wb25lbnQoKTsKLQotICAgICAgICAvLyBHZXQgYSBNYXAgb2YgdGhlIGNvbXBvbmVudHMgYW5kIHNpbXBseSByZXR1cm4gbnVsbCBpZiB0aGVyZQotICAgICAgICAvLyBhcmUgbm9uZS4KLQotICAgICAgICBNYXAgY29tcG9uZW50cyA9IGluc3BlY3RlZENvbXBvbmVudC5nZXRDb21wb25lbnRzKCk7Ci0KLSAgICAgICAgX3NvcnRlZENvbXBvbmVudHMgPSBuZXcgQXJyYXlMaXN0KGNvbXBvbmVudHMudmFsdWVzKCkpOwotCi0gICAgICAgIENvbGxlY3Rpb25zLnNvcnQoX3NvcnRlZENvbXBvbmVudHMsIG5ldyBDb21wb25lbnRDb21wYXJpdG9yKCkpOwotCi0gICAgICAgIHJldHVybiBfc29ydGVkQ29tcG9uZW50czsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb21wb25lbnQoSUNvbXBvbmVudCB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIF9jb21wb25lbnQgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSUNvbXBvbmVudCBnZXRDb21wb25lbnQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9jb21wb25lbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgdGhlIHR5cGUgb2YgdGhlIGNvbXBvbmVudCwgYXMgc3BlY2lmaWVkIGluIHRoZSBjb250YWluZXIncwotICAgICAqICBzcGVjaWZpY2F0aW9uIChpLmUuLCB0aGUgY29tcG9uZW50IGFsaWFzIGlmIGtub3duKS4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29tcG9uZW50VHlwZSgpCi0gICAgewotICAgICAgICBJQ29tcG9uZW50IGNvbnRhaW5lciA9IF9jb21wb25lbnQuZ2V0Q29udGFpbmVyKCk7Ci0KLSAgICAgICAgSUNvbXBvbmVudFNwZWNpZmljYXRpb24gY29udGFpbmVyU3BlY2lmaWNhdGlvbiA9IGNvbnRhaW5lci5nZXRTcGVjaWZpY2F0aW9uKCk7Ci0KLSAgICAgICAgU3RyaW5nIGlkID0gX2NvbXBvbmVudC5nZXRJZCgpOwotICAgICAgICBJQ29udGFpbmVkQ29tcG9uZW50IGNvbnRhaW5lZCA9IGNvbnRhaW5lclNwZWNpZmljYXRpb24uZ2V0Q29tcG9uZW50KGlkKTsKLQotICAgICAgICAvLyBUZW1wb3Jhcnk6ICBBbiBpbXBsaWNpdCBjb21wb25lbnQgd2lsbCBub3QgYmUgaW4gdGhlIGNvbnRhaW5pbmcKLSAgICAgICAgLy8gY29tcG9uZW50J3Mgc3BlY2lmaWNhdGlvbiBhcyBhIENvbnRhaW5lZENvbXBvbmVudC4KLQotICAgICAgICBpZiAoY29udGFpbmVkID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICByZXR1cm4gY29udGFpbmVkLmdldFR5cGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyBhIGxpc3Qgb2YgdGhlIHByb3BlcnRpZXMgZm9yIHRoZSBjb21wb25lbnQKLSAgICAgKiAgKGZyb20gaXRzIHNwZWNpZmljYXRpb24pLCBvciBudWxsIGlmIHRoZSBjb21wb25lbnQKLSAgICAgKiAgaGFzIG5vIHByb3BlcnRpZXMuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgTGlzdCBnZXRTb3J0ZWRQcm9wZXJ0eU5hbWVzKCkKLSAgICB7Ci0gICAgICAgIGlmIChfc29ydGVkUHJvcGVydHlOYW1lcyA9PSBudWxsKQotICAgICAgICAgICAgX3NvcnRlZFByb3BlcnR5TmFtZXMgPSBzb3J0KF9pbnNwZWN0ZWRTcGVjaWZpY2F0aW9uLmdldFByb3BlcnR5TmFtZXMoKSk7Ci0KLSAgICAgICAgcmV0dXJuIF9zb3J0ZWRQcm9wZXJ0eU5hbWVzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5TmFtZShTdHJpbmcgdmFsdWUpCi0gICAgewotICAgICAgICBfcHJvcGVydHlOYW1lID0gdmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eU5hbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9wcm9wZXJ0eU5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eVZhbHVlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfaW5zcGVjdGVkU3BlY2lmaWNhdGlvbi5nZXRQcm9wZXJ0eShfcHJvcGVydHlOYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdCBnZXRCZWFuTmFtZXMoKQotICAgIHsKLSAgICAgICAgaWYgKF9iZWFuTmFtZXMgPT0gbnVsbCkKLSAgICAgICAgICAgIF9iZWFuTmFtZXMgPSBzb3J0KF9pbnNwZWN0ZWRTcGVjaWZpY2F0aW9uLmdldEJlYW5OYW1lcygpKTsKLQotICAgICAgICByZXR1cm4gX2JlYW5OYW1lczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRCZWFuTmFtZShTdHJpbmcgdmFsdWUpCi0gICAgewotICAgICAgICBfYmVhbk5hbWUgPSB2YWx1ZTsKLSAgICAgICAgX2JlYW5TcGVjaWZpY2F0aW9uID0gX2luc3BlY3RlZFNwZWNpZmljYXRpb24uZ2V0QmVhblNwZWNpZmljYXRpb24oX2JlYW5OYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEJlYW5OYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfYmVhbk5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIElCZWFuU3BlY2lmaWNhdGlvbiBnZXRCZWFuU3BlY2lmaWNhdGlvbigpCi0gICAgewotICAgICAgICByZXR1cm4gX2JlYW5TcGVjaWZpY2F0aW9uOwotICAgIH0KLQotICAgIHByaXZhdGUgTGlzdCBzb3J0KENvbGxlY3Rpb24gYykKLSAgICB7Ci0gICAgICAgIGlmIChjID09IG51bGwgfHwgYy5zaXplKCkgPT0gMCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIExpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdChjKTsKLQotICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KHJlc3VsdCk7Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL2luc3BlY3Rvci9TaG93U3BlY2lmaWNhdGlvbi5qd2MgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvaW5zcGVjdG9yL1Nob3dTcGVjaWZpY2F0aW9uLmp3YwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmE5YzQyMC4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvaW5zcGVjdG9yL1Nob3dTcGVjaWZpY2F0aW9uLmp3YworKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAgCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPCEtLSAkSWQkIC0tPgotCi08IURPQ1RZUEUgY29tcG9uZW50LXNwZWNpZmljYXRpb24gUFVCTElDIAotICAiLS8vQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24vL1RhcGVzdHJ5IFNwZWNpZmljYXRpb24gMy4wLy9FTiIgCi0gICJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL3RhcGVzdHJ5L2R0ZC9UYXBlc3RyeV8zXzAuZHRkIiA+IAotICAKLTxjb21wb25lbnQtc3BlY2lmaWNhdGlvbiBjbGFzcz0ib3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLmluc3BlY3Rvci5TaG93U3BlY2lmaWNhdGlvbiI+Ci0KLSAgPGJlYW4gbmFtZT0iZm9ybWFsQ2xhc3MiIGNsYXNzPSJvcmcuYXBhY2hlLnRhcGVzdHJ5LmJlYW4uRXZlbk9kZCIvPiAgICAgICAgICAgCi0gIDxiZWFuIG5hbWU9ImluZm9ybWFsQ2xhc3MiIGNsYXNzPSJvcmcuYXBhY2hlLnRhcGVzdHJ5LmJlYW4uRXZlbk9kZCIvPgotICA8YmVhbiBuYW1lPSJhc3NldENsYXNzIiBjbGFzcz0ib3JnLmFwYWNoZS50YXBlc3RyeS5iZWFuLkV2ZW5PZGQiLz4KLSAgPGJlYW4gbmFtZT0icHJvcGVydHlDbGFzcyIgY2xhc3M9Im9yZy5hcGFjaGUudGFwZXN0cnkuYmVhbi5FdmVuT2RkIi8+Ci0gIDxiZWFuIG5hbWU9ImNvbXBvbmVudENsYXNzIiBjbGFzcz0ib3JnLmFwYWNoZS50YXBlc3RyeS5iZWFuLkV2ZW5PZGQiLz4KLSAgPGJlYW4gbmFtZT0iYmVhbkNsYXNzIiBjbGFzcz0ib3JnLmFwYWNoZS50YXBlc3RyeS5iZWFuLkV2ZW5PZGQiLz4KLSAgICAgICAgCi0gIDxjb21wb25lbnQgaWQ9ImVfZm9ybWFsIiB0eXBlPSJGb3JlYWNoIj4KLSAgICA8YmluZGluZyBuYW1lPSJzb3VyY2UiIGV4cHJlc3Npb249ImZvcm1hbFBhcmFtZXRlck5hbWVzIi8+Ci0gICAgPGJpbmRpbmcgbmFtZT0idmFsdWUiIGV4cHJlc3Npb249InBhcmFtZXRlck5hbWUiLz4KLSAgICA8c3RhdGljLWJpbmRpbmcgbmFtZT0iZWxlbWVudCI+dHI8L3N0YXRpYy1iaW5kaW5nPgotICAgIDxiaW5kaW5nIG5hbWU9ImNsYXNzIiBleHByZXNzaW9uPSJiZWFucy5mb3JtYWxDbGFzcy5uZXh0Ii8+Ci0gIDwvY29tcG9uZW50PgotICAgICAKLSAgCi0gIDxjb21wb25lbnQgaWQ9ImVfaW5mb3JtYWwiIHR5cGU9IkZvcmVhY2giPiAKLSAgICA8YmluZGluZyBuYW1lPSJzb3VyY2UiIGV4cHJlc3Npb249ImluZm9ybWFsUGFyYW1ldGVyTmFtZXMiLz4KLSAgICA8YmluZGluZyBuYW1lPSJ2YWx1ZSIgZXhwcmVzc2lvbj0icGFyYW1ldGVyTmFtZSIvPgotICAgIDxzdGF0aWMtYmluZGluZyBuYW1lPSJlbGVtZW50Ij50cjwvc3RhdGljLWJpbmRpbmc+Ci0gICAgPGJpbmRpbmcgbmFtZT0iY2xhc3MiIGV4cHJlc3Npb249ImJlYW5zLmluZm9ybWFsQ2xhc3MubmV4dCIvPgotICA8L2NvbXBvbmVudD4KLQotICA8Y29tcG9uZW50IGlkPSJlX2Fzc2V0IiB0eXBlPSJGb3JlYWNoIj4KLSAgICA8YmluZGluZyBuYW1lPSJzb3VyY2UiIGV4cHJlc3Npb249ImFzc2V0TmFtZXMiLz4KLSAgICA8YmluZGluZyBuYW1lPSJ2YWx1ZSIgZXhwcmVzc2lvbj0iYXNzZXROYW1lIi8+Ci0gICAgPHN0YXRpYy1iaW5kaW5nIG5hbWU9ImVsZW1lbnQiPnRyPC9zdGF0aWMtYmluZGluZz4KLSAgICA8YmluZGluZyBuYW1lPSJjbGFzcyIgZXhwcmVzc2lvbj0iYmVhbnMuYXNzZXRDbGFzcy5uZXh0Ii8+Ci0gIDwvY29tcG9uZW50PgotICAKLSAgPGNvbXBvbmVudCBpZD0iZV9jb21wb25lbnRzIiB0eXBlPSJGb3JlYWNoIj4KLSAgICA8YmluZGluZyBuYW1lPSJzb3VyY2UiIGV4cHJlc3Npb249InNvcnRlZENvbXBvbmVudHMiLz4KLSAgICA8YmluZGluZyBuYW1lPSJ2YWx1ZSIgZXhwcmVzc2lvbj0iY29tcG9uZW50Ii8+Ci0gICAgPHN0YXRpYy1iaW5kaW5nIG5hbWU9ImVsZW1lbnQiPnRyPC9zdGF0aWMtYmluZGluZz4KLSAgICA8YmluZGluZyBuYW1lPSJjbGFzcyIgZXhwcmVzc2lvbj0iYmVhbnMuY29tcG9uZW50Q2xhc3MubmV4dCIvPgotICA8L2NvbXBvbmVudD4KLQotICA8Y29tcG9uZW50IGlkPSJzZWxlY3RDb21wb25lbnQiIHR5cGU9IkRpcmVjdExpbmsiPgotICAgIDxiaW5kaW5nIG5hbWU9Imxpc3RlbmVyIiBleHByZXNzaW9uPSJwYWdlLmxpc3RlbmVycy5zZWxlY3RDb21wb25lbnQiLz4KLSAgICA8YmluZGluZyBuYW1lPSJwYXJhbWV0ZXJzIiBleHByZXNzaW9uPSJjb21wb25lbnQuaWRQYXRoIi8+Ci0gIDwvY29tcG9uZW50PgotCi0gIDxjb21wb25lbnQgaWQ9ImVfcHJvcGVydHkiIHR5cGU9IkZvcmVhY2giPgotICAgIDxiaW5kaW5nIG5hbWU9InNvdXJjZSIgZXhwcmVzc2lvbj0ic29ydGVkUHJvcGVydHlOYW1lcyIvPgotICAgIDxiaW5kaW5nIG5hbWU9InZhbHVlIiBleHByZXNzaW9uPSJwcm9wZXJ0eU5hbWUiLz4KLSAgICA8c3RhdGljLWJpbmRpbmcgbmFtZT0iZWxlbWVudCI+dHI8L3N0YXRpYy1iaW5kaW5nPgotICAgIDxiaW5kaW5nIG5hbWU9ImNsYXNzIiBleHByZXNzaW9uPSJiZWFucy5wcm9wZXJ0eUNsYXNzLm5leHQiLz4KLSAgPC9jb21wb25lbnQ+Ci0gICAgICAKLSAgPGNvbXBvbmVudCBpZD0iZV9iZWFuIiB0eXBlPSJGb3JlYWNoIj4KLSAgCTxiaW5kaW5nIG5hbWU9InNvdXJjZSIgZXhwcmVzc2lvbj0iYmVhbk5hbWVzIi8+Ci0gIAk8YmluZGluZyBuYW1lPSJ2YWx1ZSIgZXhwcmVzc2lvbj0iYmVhbk5hbWUiLz4KLSAgCTxzdGF0aWMtYmluZGluZyBuYW1lPSJlbGVtZW50Ij50cjwvc3RhdGljLWJpbmRpbmc+Ci0gIAk8YmluZGluZyBuYW1lPSJjbGFzcyIgZXhwcmVzc2lvbj0iYmVhbnMuYmVhbkNsYXNzLm5leHQiLz4KLSAgPC9jb21wb25lbnQ+Ci0gIAkKLTwvY29tcG9uZW50LXNwZWNpZmljYXRpb24+CmRpZmYgLS1naXQgYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvaW5zcGVjdG9yL1Nob3dUZW1wbGF0ZS5odG1sIGIvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL2luc3BlY3Rvci9TaG93VGVtcGxhdGUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY3MzM2OC4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvaW5zcGVjdG9yL1Nob3dUZW1wbGF0ZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotPCEtLSAkSWQkIC0tPgotCi08c3BhbiBqd2NpZD0iaWZOb1RlbXBsYXRlIj4KLTxzcGFuIGNsYXNzPSJtZXNzYWdlIj5Db21wb25lbnQgZG9lcyBub3QgaGF2ZSBhIHRlbXBsYXRlLgotPC9zcGFuPgotPC9zcGFuPgotCi08c3BhbiBqd2NpZD0iaWZUZW1wbGF0ZSI+Ci08dGFibGUgY2xhc3M9InRlbXBsYXRlIj4KLQk8dHI+Ci0JCTx0ZD48c3BhbiBqd2NpZD0iaW5zZXJ0VGVtcGxhdGUiLz48L3RkPgotCTwvdHI+Ci08L3RhYmxlPgotCi08L3NwYW4+CmRpZmYgLS1naXQgYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvaW5zcGVjdG9yL1Nob3dUZW1wbGF0ZS5qYXZhIGIvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL2luc3BlY3Rvci9TaG93VGVtcGxhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjVhOGMxMy4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvaW5zcGVjdG9yL1Nob3dUZW1wbGF0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMzICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIuaW5zcGVjdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LkJhc2VDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JQ29tcG9uZW50OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSURpcmVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklNYXJrdXBXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVuZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlcXVlc3RDeWNsZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LlRhcGVzdHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuZW5naW5lLklFbmdpbmVTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuZW5naW5lLklMaW5rOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuZW5naW5lLklUZW1wbGF0ZVNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnBhcnNlLkNsb3NlVG9rZW47Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5wYXJzZS5Db21wb25lbnRUZW1wbGF0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnBhcnNlLkxvY2FsaXphdGlvblRva2VuOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkucGFyc2UuT3BlblRva2VuOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkucGFyc2UuVGVtcGxhdGVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5wYXJzZS5UZW1wbGF0ZVRva2VuOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkucGFyc2UuVGV4dFRva2VuOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkucGFyc2UuVG9rZW5UeXBlOwotCi0vKioKLSAqICBDb21wb25lbnQgb2YgdGhlIHtAbGluayBJbnNwZWN0b3J9IHBhZ2UgdXNlZCB0byBkaXNwbGF5Ci0gKiAgdGhlIGlkcyBhbmQgdHlwZXMgb2YgYWxsIGVtYmVkZGVkIGNvbXBvbmVudHMuCi0gKgotICoKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICoKLSAqKi8KLQotcHVibGljIGNsYXNzIFNob3dUZW1wbGF0ZSBleHRlbmRzIEJhc2VDb21wb25lbnQgaW1wbGVtZW50cyBJRGlyZWN0Ci17Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRIYXNUZW1wbGF0ZSgpCi0gICAgewotICAgICAgICBJbnNwZWN0b3IgaW5zcGVjdG9yOwotCi0gICAgICAgIGluc3BlY3RvciA9IChJbnNwZWN0b3IpIGdldFBhZ2UoKTsKLQotICAgICAgICAvLyBDb21wb25lbnRzIHRoYXQgaW5oZXJpdCBmcm9tIEJhc2VDb21wb25lbnQgaGF2ZSB0ZW1wbGF0ZXMsCi0gICAgICAgIC8vIG90aGVycyBkbyBub3QuCi0KLSAgICAgICAgcmV0dXJuIGluc3BlY3Rvci5nZXRJbnNwZWN0ZWRDb21wb25lbnQoKSBpbnN0YW5jZW9mIEJhc2VDb21wb25lbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIElSZW5kZXIgZ2V0VGVtcGxhdGVEZWxlZ2F0ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IElSZW5kZXIoKQotICAgICAgICB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCByZW5kZXIoSU1hcmt1cFdyaXRlciB3cml0ZXIsIElSZXF1ZXN0Q3ljbGUgY3ljbGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgd3JpdGVUZW1wbGF0ZSh3cml0ZXIsIGN5Y2xlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgV3JpdGVzIHRoZSBIVE1MIHRlbXBsYXRlIGZvciB0aGUgY29tcG9uZW50LiAgV2hlbiAmbHQ7andjJmd0OyB0YWdzIGFyZQotICAgICAqICB3cml0dGVuLCB0aGUgaWQgaXMgbWFkZSBhIGxpbmsgKHRoYXQgc2VsZWN0cyB0aGUgbmFtZWQgY29tcG9uZW50KS4gIFdlCi0gICAgICogIHVzZSBzb21lIG1hZ2ljIHRvIGFjY29tcGxpc2ggdGhpcywgY3JlYXRpbmcgbGlua3MgYXMgaWYgd2Ugd2VyZSBhCi0gICAgICogIHtAbGluayBEaXJlY3RMaW5rfSBjb21wb25lbnQsIGFuZCBhdHRyaWJ1dGluZyB0aG9zZSBsaW5rcwotICAgICAqICB0byB0aGUgY2FwdGl2ZSB7QGxpbmsgRGlyZWN0TGlua30gY29tcG9uZW50IGVtYmVkZGVkIGhlcmUuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwcml2YXRlIHZvaWQgd3JpdGVUZW1wbGF0ZShJTWFya3VwV3JpdGVyIHdyaXRlciwgSVJlcXVlc3RDeWNsZSBjeWNsZSkKLSAgICB7Ci0gICAgICAgIElDb21wb25lbnQgaW5zcGVjdGVkQ29tcG9uZW50ID0gZ2V0SW5zcGVjdGVkQ29tcG9uZW50KCk7Ci0gICAgICAgIENvbXBvbmVudFRlbXBsYXRlIHRlbXBsYXRlID0gbnVsbDsKLSAgICAgICAgSVRlbXBsYXRlU291cmNlIHNvdXJjZSA9IGdldFBhZ2UoKS5nZXRFbmdpbmUoKS5nZXRUZW1wbGF0ZVNvdXJjZSgpOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICB0ZW1wbGF0ZSA9IHNvdXJjZS5nZXRUZW1wbGF0ZShjeWNsZSwgaW5zcGVjdGVkQ29tcG9uZW50KTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICB3cml0ZXIuYmVnaW4oInByZSIpOwotCi0gICAgICAgIGludCBjb3VudCA9IHRlbXBsYXRlLmdldFRva2VuQ291bnQoKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFRlbXBsYXRlVG9rZW4gdG9rZW4gPSB0ZW1wbGF0ZS5nZXRUb2tlbihpKTsKLSAgICAgICAgICAgIFRva2VuVHlwZSB0eXBlID0gdG9rZW4uZ2V0VHlwZSgpOwotCi0gICAgICAgICAgICBpZiAodHlwZSA9PSBUb2tlblR5cGUuVEVYVCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB3cml0ZSh3cml0ZXIsIChUZXh0VG9rZW4pIHRva2VuKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHR5cGUgPT0gVG9rZW5UeXBlLkNMT1NFKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHdyaXRlKHdyaXRlciwgKENsb3NlVG9rZW4pIHRva2VuKTsKLQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAodG9rZW4uZ2V0VHlwZSgpID09IFRva2VuVHlwZS5MT0NBTElaQVRJT04pCi0gICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICB3cml0ZSh3cml0ZXIsIChMb2NhbGl6YXRpb25Ub2tlbikgdG9rZW4pOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAodG9rZW4uZ2V0VHlwZSgpID09IFRva2VuVHlwZS5PUEVOKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJvb2xlYW4gbmV4dElzQ2xvc2UgPQotICAgICAgICAgICAgICAgICAgICAoaSArIDEgPCBjb3VudCkgJiYgKHRlbXBsYXRlLmdldFRva2VuKGkgKyAxKS5nZXRUeXBlKCkgPT0gVG9rZW5UeXBlLkNMT1NFKTsKLQotICAgICAgICAgICAgICAgIHdyaXRlKHdyaXRlciwgbmV4dElzQ2xvc2UsIChPcGVuVG9rZW4pIHRva2VuKTsKLQotICAgICAgICAgICAgICAgIGlmIChuZXh0SXNDbG9zZSkKLSAgICAgICAgICAgICAgICAgICAgaSsrOwotCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFRoYXQncyBhbGwgdGhlIHR5cGVzIGtub3duIGF0IHRoaXMgdGltZS4KLSAgICAgICAgfQotCi0gICAgICAgIHdyaXRlci5lbmQoKTsgLy8gPHByZT4gICAgICAgIAotICAgIH0KLQotICAgIC8qKiBAc2luY2UgMy4wICoqLwotCi0gICAgcHJpdmF0ZSBJQ29tcG9uZW50IGdldEluc3BlY3RlZENvbXBvbmVudCgpCi0gICAgewotICAgICAgICBJbnNwZWN0b3IgcGFnZSA9IChJbnNwZWN0b3IpIGdldFBhZ2UoKTsKLQotICAgICAgICByZXR1cm4gcGFnZS5nZXRJbnNwZWN0ZWRDb21wb25lbnQoKTsKLSAgICB9Ci0KLSAgICAvKiogQHNpbmNlIDMuMCAqKi8KLQotICAgIHByaXZhdGUgdm9pZCB3cml0ZShJTWFya3VwV3JpdGVyIHdyaXRlciwgVGV4dFRva2VuIHRva2VuKQotICAgIHsKLSAgICAgICAgaW50IHN0YXJ0ID0gdG9rZW4uZ2V0U3RhcnRJbmRleCgpOwotICAgICAgICBpbnQgZW5kID0gdG9rZW4uZ2V0RW5kSW5kZXgoKTsKLQotICAgICAgICAvLyBQcmludCB0aGUgc2VjdGlvbiBvZiB0aGUgdGVtcGxhdGUgLi4uIHByaW50KCkgd2lsbAotICAgICAgICAvLyBlc2NhcGUgYW5kIGludmFsaWQgY2hhcmFjdGVycyBhcyBIVE1MIGVudGl0aWVzLiAgQWxzbywKLSAgICAgICAgLy8gd2Ugc2hvdyB0aGUgZnVsbCBzdHJldGNoIG9mIHRleHQsIG5vdCB0aGUgdHJpbW1lZCB2ZXJzaW9uLgotCi0gICAgICAgIHdyaXRlci5wcmludCh0b2tlbi5nZXRUZW1wbGF0ZURhdGEoKSwgc3RhcnQsIGVuZCAtIHN0YXJ0ICsgMSk7Ci0gICAgfQotCi0gICAgLyoqIEBzaW5jZSAzLjAgKiovCi0KLSAgICBwcml2YXRlIHZvaWQgd3JpdGUoSU1hcmt1cFdyaXRlciB3cml0ZXIsIENsb3NlVG9rZW4gdG9rZW4pCi0gICAgewotICAgICAgICB3cml0ZXIuYmVnaW4oInNwYW4iKTsKLSAgICAgICAgd3JpdGVyLmF0dHJpYnV0ZSgiY2xhc3MiLCAiandjLXRhZyIpOwotCi0gICAgICAgIHdyaXRlci5wcmludCgiPC8iKTsKLSAgICAgICAgd3JpdGVyLnByaW50KHRva2VuLmdldFRhZygpKTsKLSAgICAgICAgd3JpdGVyLnByaW50KCI+Iik7Ci0KLSAgICAgICAgd3JpdGVyLmVuZCgpOyAvLyA8c3Bhbj4KLSAgICB9Ci0KLSAgICAvKiogQHNpbmNlIDMuMCAqKi8KLQotICAgIHByaXZhdGUgdm9pZCB3cml0ZShJTWFya3VwV3JpdGVyIHdyaXRlciwgTG9jYWxpemF0aW9uVG9rZW4gdG9rZW4pCi0gICAgewotICAgICAgICBJQ29tcG9uZW50IGNvbXBvbmVudCA9IGdldEluc3BlY3RlZENvbXBvbmVudCgpOwotCi0gICAgICAgIHdyaXRlci5iZWdpbigic3BhbiIpOwotICAgICAgICB3cml0ZXIuYXR0cmlidXRlKCJjbGFzcyIsICJqd2MtdGFnIik7Ci0KLSAgICAgICAgd3JpdGVyLnByaW50KCI8c3BhbiBrZXk9XCIiKTsKLSAgICAgICAgd3JpdGVyLnByaW50KHRva2VuLmdldEtleSgpKTsKLSAgICAgICAgd3JpdGVyLnByaW50KCciJyk7Ci0KLSAgICAgICAgTWFwIGF0dHJpYnV0ZXMgPSB0b2tlbi5nZXRBdHRyaWJ1dGVzKCk7Ci0gICAgICAgIGlmIChhdHRyaWJ1dGVzICE9IG51bGwgJiYgIWF0dHJpYnV0ZXMuaXNFbXB0eSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBJdGVyYXRvciBpdCA9IGF0dHJpYnV0ZXMuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZU5hbWUgPSAoU3RyaW5nKSBlbnRyeS5nZXRLZXkoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgYXR0cmlidXRlVmFsdWUgPSAoU3RyaW5nKSBlbnRyeS5nZXRWYWx1ZSgpOwotCi0gICAgICAgICAgICAgICAgd3JpdGVyLnByaW50KCcgJyk7Ci0gICAgICAgICAgICAgICAgd3JpdGVyLnByaW50KGF0dHJpYnV0ZU5hbWUpOwotICAgICAgICAgICAgICAgIHdyaXRlci5wcmludCgiPVwiIik7Ci0gICAgICAgICAgICAgICAgd3JpdGVyLnByaW50KGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnQoJyInKTsKLQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgd3JpdGVyLnByaW50KCc+Jyk7Ci0gICAgICAgIHdyaXRlci5iZWdpbigic3BhbiIpOwotICAgICAgICB3cml0ZXIuYXR0cmlidXRlKCJjbGFzcyIsICJsb2NhbGl6ZWQtc3RyaW5nIik7Ci0KLSAgICAgICAgd3JpdGVyLnByaW50KGNvbXBvbmVudC5nZXRNZXNzYWdlcygpLmdldE1lc3NhZ2UodG9rZW4uZ2V0S2V5KCkpKTsKLSAgICAgICAgd3JpdGVyLmVuZCgpOyAvLyA8c3Bhbj4KLQotICAgICAgICB3cml0ZXIucHJpbnQoIjwvc3Bhbj4iKTsKLQotICAgICAgICB3cml0ZXIuZW5kKCk7IC8vIDxzcGFuPgotICAgIH0KLQotICAgIC8qKiBAc2luY2UgMy4wICoqLwotCi0gICAgcHJpdmF0ZSB2b2lkIHdyaXRlKElNYXJrdXBXcml0ZXIgd3JpdGVyLCBib29sZWFuIG5leHRJc0Nsb3NlLCBPcGVuVG9rZW4gdG9rZW4pCi0gICAgewotICAgICAgICBJQ29tcG9uZW50IGNvbXBvbmVudCA9IGdldEluc3BlY3RlZENvbXBvbmVudCgpOwotICAgICAgICBJRW5naW5lU2VydmljZSBzZXJ2aWNlID0gZ2V0UGFnZSgpLmdldEVuZ2luZSgpLmdldFNlcnZpY2UoVGFwZXN0cnkuRElSRUNUX1NFUlZJQ0UpOwotICAgICAgICBTdHJpbmdbXSBjb250ZXh0ID0gbmV3IFN0cmluZ1sxXTsKLQotICAgICAgICAvLyBFYWNoIGlkIHJlZmVyZW5jZXMgYSBjb21wb25lbnQgZW1iZWRkZWQgaW4gdGhlIGluc3BlY3RlZCBjb21wb25lbnQuCi0gICAgICAgIC8vIEdldCB0aGF0IGNvbXBvbmVudC4KLQotICAgICAgICBTdHJpbmcgaWQgPSB0b2tlbi5nZXRJZCgpOwotICAgICAgICBJQ29tcG9uZW50IGVtYmVkZGVkID0gY29tcG9uZW50LmdldENvbXBvbmVudChpZCk7Ci0gICAgICAgIGNvbnRleHRbMF0gPSBlbWJlZGRlZC5nZXRJZFBhdGgoKTsKLQotICAgICAgICAvLyBCdWlsZCBhIFVSTCB0byBzZWxlY3QgdGhhdCBjb21wb25lbnQsIGFzIGlmIGJ5IHRoZSBjYXB0aXZlCi0gICAgICAgIC8vIGNvbXBvbmVudCBpdHNlbGYgKGl0J3MgYSBEaXJlY3QpLgotCi0gICAgICAgIElMaW5rIGxpbmsgPSBzZXJ2aWNlLmdldExpbmsoZ2V0UGFnZSgpLmdldFJlcXVlc3RDeWNsZSgpLCB0aGlzLCBjb250ZXh0KTsKLQotICAgICAgICB3cml0ZXIuYmVnaW4oInNwYW4iKTsKLSAgICAgICAgd3JpdGVyLmF0dHJpYnV0ZSgiY2xhc3MiLCAiandjLXRhZyIpOwotCi0gICAgICAgIHdyaXRlci5wcmludCgiPCIpOwotICAgICAgICB3cml0ZXIucHJpbnQodG9rZW4uZ2V0VGFnKCkpOwotCi0gICAgICAgIHdyaXRlci5wcmludCgiIGp3Y2lkPVwiIik7Ci0KLSAgICAgICAgd3JpdGVyLmJlZ2luKCJzcGFuIik7Ci0gICAgICAgIHdyaXRlci5hdHRyaWJ1dGUoImNsYXNzIiwgImp3Yy1pZCIpOwotCi0gICAgICAgIHdyaXRlci5iZWdpbigiYSIpOwotICAgICAgICB3cml0ZXIuYXR0cmlidXRlKCJocmVmIiwgbGluay5nZXRVUkwoKSk7Ci0gICAgICAgIHdyaXRlci5wcmludChpZCk7Ci0KLSAgICAgICAgd3JpdGVyLmVuZCgpOyAvLyA8YT4KLSAgICAgICAgd3JpdGVyLmVuZCgpOyAvLyA8c3Bhbj4KLSAgICAgICAgd3JpdGVyLnByaW50KCciJyk7Ci0KLSAgICAgICAgTWFwIGF0dHJpYnV0ZXMgPSB0b2tlbi5nZXRBdHRyaWJ1dGVzTWFwKCk7Ci0KLSAgICAgICAgaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgSXRlcmF0b3IgaWkgPSBhdHRyaWJ1dGVzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLQotICAgICAgICAgICAgd2hpbGUgKGlpLmhhc05leHQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNYXAuRW50cnkgZSA9IChNYXAuRW50cnkpIGlpLm5leHQoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBUZW1wbGF0ZUF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSAoVGVtcGxhdGVBdHRyaWJ1dGUpZS5nZXRWYWx1ZSgpOyAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdyaXRlci5wcmludCgnICcpOwotICAgICAgICAgICAgICAgIHdyaXRlci5wcmludChlLmdldEtleSgpLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIHdyaXRlci5wcmludCgiPVwiIik7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gVE9ETzogRml4IHRoaXMgdG8gb3V0cHV0IHNvbWV0aGluZyBhcHByb3ByaWF0ZSBmb3IgZWFjaCB0eXBlCi0gICAgICAgICAgICAgICAgLy8gb2YgYXR0cmlidXRlIChsaXRlcmFsLCBleHByZXNzaW9uLCBzdHJpbmcpLgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdyaXRlci5wcmludChhdHRyaWJ1dGUuZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgd3JpdGVyLnByaW50KCciJyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBDb2xsYXBzZSBhbiBvcGVuICYgY2xvc2UgZG93biB0byBhIHNpbmdsZSB0YWcuCi0KLSAgICAgICAgaWYgKG5leHRJc0Nsb3NlKQotICAgICAgICAgICAgd3JpdGVyLnByaW50KCcvJyk7Ci0KLSAgICAgICAgd3JpdGVyLnByaW50KCc+Jyk7Ci0gICAgICAgIHdyaXRlci5lbmQoKTsgLy8gPHNwYW4+Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEludm9rZWQgd2hlbiBhIGNvbXBvbmVudCBpZCBpcyBjbGlja2VkLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgdHJpZ2dlcihJUmVxdWVzdEN5Y2xlIGN5Y2xlKQotICAgIHsKLSAgICAgICAgSW5zcGVjdG9yIGluc3BlY3RvciA9IChJbnNwZWN0b3IpIGdldFBhZ2UoKTsKLQotICAgICAgICBPYmplY3RbXSBwYXJhbWV0ZXJzID0gY3ljbGUuZ2V0U2VydmljZVBhcmFtZXRlcnMoKTsKLQotICAgICAgICBpbnNwZWN0b3Iuc2VsZWN0Q29tcG9uZW50KChTdHJpbmcpIHBhcmFtZXRlcnNbMF0pOwotCi0gICAgICAgIElDb21wb25lbnQgbmV3Q29tcG9uZW50ID0gaW5zcGVjdG9yLmdldEluc3BlY3RlZENvbXBvbmVudCgpOwotCi0gICAgICAgIC8vIElmIHRoZSBjb21wb25lbnQgaXMgbm90IGEgQmFzZUNvbXBvbmVudCB0aGVuIGl0IHdvbid0IGhhdmUKLSAgICAgICAgLy8gYSB0ZW1wbGF0ZSwgc28gc3dpdGNoIHRvIHRoZSBzcGVjaWZpY2F0aW9uIHZpZXcuCi0KLSAgICAgICAgaWYgKCEobmV3Q29tcG9uZW50IGluc3RhbmNlb2YgQmFzZUNvbXBvbmVudCkpCi0gICAgICAgICAgICBpbnNwZWN0b3Iuc2V0VmlldyhWaWV3LlNQRUNJRklDQVRJT04pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBBbHdheXMgcmV0dXJucyB0cnVlLgotICAgICAqIAotICAgICAqICBAc2luY2UgMi4zCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIGJvb2xlYW4gaXNTdGF0ZWZ1bCgpCi0gICAgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL2luc3BlY3Rvci9TaG93VGVtcGxhdGUuandjIGIvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL2luc3BlY3Rvci9TaG93VGVtcGxhdGUuandjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjZhNDY3Li4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9pbnNwZWN0b3IvU2hvd1RlbXBsYXRlLmp3YworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAgCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPCEtLSAkSWQkIC0tPgotPCFET0NUWVBFIGNvbXBvbmVudC1zcGVjaWZpY2F0aW9uIFBVQkxJQyAKLSAgIi0vL0FwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLy9UYXBlc3RyeSBTcGVjaWZpY2F0aW9uIDMuMC8vRU4iIAotICAiaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy90YXBlc3RyeS9kdGQvVGFwZXN0cnlfM18wLmR0ZCI+Ci0JCi08Y29tcG9uZW50LXNwZWNpZmljYXRpb24gY2xhc3M9Im9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi5pbnNwZWN0b3IuU2hvd1RlbXBsYXRlIj4KLSAgPGNvbXBvbmVudCBpZD0iaWZOb1RlbXBsYXRlIiB0eXBlPSJDb25kaXRpb25hbCI+Ci0gICAgPGJpbmRpbmcgbmFtZT0iY29uZGl0aW9uIiBleHByZXNzaW9uPSIhIGhhc1RlbXBsYXRlIi8+Ci0gIDwvY29tcG9uZW50PgotICAKLSAgPGNvbXBvbmVudCBpZD0iaWZUZW1wbGF0ZSIgdHlwZT0iQ29uZGl0aW9uYWwiPgotICAgIDxiaW5kaW5nIG5hbWU9ImNvbmRpdGlvbiIgZXhwcmVzc2lvbj0iaGFzVGVtcGxhdGUiLz4KLSAgPC9jb21wb25lbnQ+Ci0gIAotICA8Y29tcG9uZW50IGlkPSJpbnNlcnRUZW1wbGF0ZSIgdHlwZT0iRGVsZWdhdG9yIj4KLSAgICA8YmluZGluZyBuYW1lPSJkZWxlZ2F0ZSIgZXhwcmVzc2lvbj0idGVtcGxhdGVEZWxlZ2F0ZSIvPgotICA8L2NvbXBvbmVudD4KLTwvY29tcG9uZW50LXNwZWNpZmljYXRpb24+CmRpZmYgLS1naXQgYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvaW5zcGVjdG9yL1NwZWNpZmljYXRpb25fSFJwNC5naWYgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvaW5zcGVjdG9yL1NwZWNpZmljYXRpb25fSFJwNC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiNjk1ZDAuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL2luc3BlY3Rvci9TcGVjaWZpY2F0aW9uX0hScDQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL2luc3BlY3Rvci9TcGVjaWZpY2F0aW9uX0hwMy5naWYgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvaW5zcGVjdG9yL1NwZWNpZmljYXRpb25fSHAzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzMwNjJjYi4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvaW5zcGVjdG9yL1NwZWNpZmljYXRpb25fSHAzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9pbnNwZWN0b3IvU3BlY2lmaWNhdGlvbl9OQmFubmVyLmdpZiBiL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9pbnNwZWN0b3IvU3BlY2lmaWNhdGlvbl9OQmFubmVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk2ZjgxYi4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvaW5zcGVjdG9yL1NwZWNpZmljYXRpb25fTkJhbm5lci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvaW5zcGVjdG9yL1NwZWNpZmljYXRpb25fTlJwMi5naWYgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvaW5zcGVjdG9yL1NwZWNpZmljYXRpb25fTlJwMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3MDBkMTAuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL2luc3BlY3Rvci9TcGVjaWZpY2F0aW9uX05ScDIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL2luc3BlY3Rvci9TcGVjaWZpY2F0aW9uX05wMS5naWYgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvaW5zcGVjdG9yL1NwZWNpZmljYXRpb25fTnAxLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY4YjdkYi4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvaW5zcGVjdG9yL1NwZWNpZmljYXRpb25fTnAxLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9pbnNwZWN0b3IvVGVtcGxhdGVfSFJwNC5naWYgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvaW5zcGVjdG9yL1RlbXBsYXRlX0hScDQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmUxNzkyLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9pbnNwZWN0b3IvVGVtcGxhdGVfSFJwNC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvaW5zcGVjdG9yL1RlbXBsYXRlX0hwMy5naWYgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvaW5zcGVjdG9yL1RlbXBsYXRlX0hwMy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiYzMwZWUuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL2luc3BlY3Rvci9UZW1wbGF0ZV9IcDMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL2luc3BlY3Rvci9UZW1wbGF0ZV9OQmFubmVyLmdpZiBiL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9pbnNwZWN0b3IvVGVtcGxhdGVfTkJhbm5lci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyNTAxMzguLjAwMDAwMDAKLS0tIGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL2luc3BlY3Rvci9UZW1wbGF0ZV9OQmFubmVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9pbnNwZWN0b3IvVGVtcGxhdGVfTlJwMi5naWYgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvaW5zcGVjdG9yL1RlbXBsYXRlX05ScDIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiN2UyMTc1Li4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9pbnNwZWN0b3IvVGVtcGxhdGVfTlJwMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvaW5zcGVjdG9yL1RlbXBsYXRlX05wMS5naWYgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvaW5zcGVjdG9yL1RlbXBsYXRlX05wMS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4M2ZiMzcuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL2luc3BlY3Rvci9UZW1wbGF0ZV9OcDEuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL2luc3BlY3Rvci9WaWV3LmphdmEgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvaW5zcGVjdG9yL1ZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFhYzg5MC4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvaW5zcGVjdG9yL1ZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIuaW5zcGVjdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuZW51bS5FbnVtOwotCi0vKioKLSAqICBJZGVudGlmaWVzIGRpZmZlcmVudCB2aWV3cyBmb3IgdGhlIGluc3BlY3Rvci4KLSAqCi0gKiAgQHZlcnNpb24gJElkJAotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqCi0gKiovCi0KLXB1YmxpYyBjbGFzcyBWaWV3IGV4dGVuZHMgRW51bQotewotICAgIC8qKgotICAgICAqICBWaWV3IHRoYXQgZGlzcGxheXMgdGhlIGJhc2ljIHNwZWNpZmljYXRpb24gaW5mb3JtYXRpb24sIHBsdXMKLSAgICAgKiAgZm9ybWFsIGFuZCBpbmZvcm1hbCBwYXJhbWV0ZXJzIChhbmQgcmVsYXRlZCBiaW5kaW5ncyksIGFuZCAKLSAgICAgKiAgYXNzZXRzLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBWaWV3IFNQRUNJRklDQVRJT04gPSBuZXcgVmlldygiU1BFQ0lGSUNBVElPTiIpOwotCi0gICAgLyoqCi0gICAgICogIFZpZXcgdGhhdCBkaXNwbGF5cyB0aGUgSFRNTCB0ZW1wbGF0ZSBmb3IgdGhlIGNvbXBvbmVudCwgaWYgb25lCi0gICAgICogIGV4aXN0cy4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVmlldyBURU1QTEFURSA9IG5ldyBWaWV3KCJURU1QTEFURSIpOwotCi0gICAgLyoqCi0gICAgICogIFZpZXcgdGhhdCBzaG93cyB0aGUgcGVyc2lzdGVudCBwcm9wZXJ0aWVzIG9mIHRoZSBwYWdlIGNvbnRhaW5pbmcKLSAgICAgKiAgdGhlIGluc3BlY3RlZCBjb21wb25lbnQuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFZpZXcgUFJPUEVSVElFUyA9IG5ldyBWaWV3KCJQUk9QRVJUSUVTIik7Ci0KLSAgICAvKioKLSAgICAgKiAgVmlldyB0aGF0IHNob3dzIGluZm9ybWF0aW9uIGFib3V0IHRoZSAKLSAgICAgKiAge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkuSUVuZ2luZX0uCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFZpZXcgRU5HSU5FID0gbmV3IFZpZXcoIkVOR0lORSIpOwotCi0KLSAgICBwcml2YXRlIFZpZXcoU3RyaW5nIG5hbWUpCi0gICAgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvaW5zcGVjdG9yL1ZpZXdUYWJzLmh0bWwgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvaW5zcGVjdG9yL1ZpZXdUYWJzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkM2E5NzAuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL2luc3BlY3Rvci9WaWV3VGFicy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotPCEtLSAkSWQkIC0tPgotCi08dGFibGUgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0yPgotCTx0cj4KLQkJPHRkPgotPHNwYW4gandjaWQ9IkBGb3JlYWNoIiBzb3VyY2U9Im9nbmw6dmlld3MiIHZhbHVlPSJvZ25sOnZpZXciPgotCQkJPGEgandjaWQ9InNlbGVjdEBBY3Rpb25MaW5rIiBsaXN0ZW5lcj0ib2dubDpsaXN0ZW5lcnMuc2VsZWN0VGFiIj48aW1nIAotCQkJCWp3Y2lkPSJAUm9sbG92ZXIiIGltYWdlPSJvZ25sOnZpZXdJbWFnZSIgZm9jdXM9Im9nbmw6Zm9jdXNJbWFnZSIKLQkJCQl3aWR0aD0iMTIwIiBoZWlnaHQ9IjE5Ii8+PC9hPgotPC9zcGFuPgotCQk8L3RkPgotCTwvdHI+Ci0JPHRyPgotCQk8dGQ+PGltZyBqd2NpZD0iQEltYWdlIiBpbWFnZT0ib2dubDpiYW5uZXJJbWFnZSIvPjwvdGQ+Ci0JPC90cj4KLQk8dHI+Ci0JCTx0ZD48c3BhbiBqd2NpZD0iQFJlbmRlckJvZHkiLz48L3RkPgotCTwvdHI+Ci08L3RhYmxlPgotCmRpZmYgLS1naXQgYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvaW5zcGVjdG9yL1ZpZXdUYWJzLmphdmEgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvaW5zcGVjdG9yL1ZpZXdUYWJzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyNTFkMzUuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL2luc3BlY3Rvci9WaWV3VGFicy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi5pbnNwZWN0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LkJhc2VDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JQXNzZXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVxdWVzdEN5Y2xlOwotCi0vKioKLSAqICBDb21wb25lbnQgb2YgdGhlIHtAbGluayBJbnNwZWN0b3J9IHBhZ2UgdXNlZCB0byBzZWxlY3QgdGhlIHZpZXcuCi0gKgotICoKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICoKLSAqKi8KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFZpZXdUYWJzIGV4dGVuZHMgQmFzZUNvbXBvbmVudAotewotICAgIHByaXZhdGUgc3RhdGljIFZpZXdbXSBfdmlld3MgPQotICAgICAgICB7Ci0gICAgICAgICAgICBWaWV3LlNQRUNJRklDQVRJT04sCi0gICAgICAgICAgICBWaWV3LlRFTVBMQVRFLAotICAgICAgICAgICAgVmlldy5QUk9QRVJUSUVTLAotICAgICAgICAgICAgVmlldy5FTkdJTkUgfTsKLQotICAgICBwdWJsaWMgVmlld1tdIGdldFZpZXdzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfdmlld3M7Ci0gICAgfQotCi0gICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0VmlldyhWaWV3IHZhbHVlKTsKLQotICAgIHB1YmxpYyBhYnN0cmFjdCBWaWV3IGdldFZpZXcoKTsKLQotICAgIHByaXZhdGUgSUFzc2V0IGdldEltYWdlRm9yVmlldyhib29sZWFuIGZvY3VzKQotICAgIHsKLSAgICAgICAgSW5zcGVjdG9yIGluc3BlY3RvciA9IChJbnNwZWN0b3IpIGdldFBhZ2UoKTsKLQkJVmlldyB2aWV3ID0gZ2V0VmlldygpOwotCQkKLSAgICAgICAgYm9vbGVhbiBzZWxlY3RlZCA9ICh2aWV3ID09IGluc3BlY3Rvci5nZXRWaWV3KCkpOwotCi0gICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKHZpZXcuZ2V0TmFtZSgpKTsKLQotICAgICAgICBpZiAoc2VsZWN0ZWQpCi0gICAgICAgICAgICBidWZmZXIuYXBwZW5kKCJfc2VsZWN0ZWQiKTsKLQotICAgICAgICBpZiAoZm9jdXMpCi0gICAgICAgICAgICBidWZmZXIuYXBwZW5kKCJfZm9jdXMiKTsKLQotICAgICAgICBTdHJpbmcga2V5ID0gYnVmZmVyLnRvU3RyaW5nKCk7Ci0KLSAgICAgICAgcmV0dXJuIChJQXNzZXQpIGdldEFzc2V0cygpLmdldChrZXkpOwotICAgIH0KLQotICAgIHB1YmxpYyBJQXNzZXQgZ2V0Vmlld0ltYWdlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRJbWFnZUZvclZpZXcoZmFsc2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBJQXNzZXQgZ2V0Rm9jdXNJbWFnZSgpCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0SW1hZ2VGb3JWaWV3KHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBJQXNzZXQgZ2V0QmFubmVySW1hZ2UoKQotICAgIHsKLSAgICAgICAgIEluc3BlY3RvciBpbnNwZWN0b3IgPSAoSW5zcGVjdG9yKSBnZXRQYWdlKCk7Ci0gICAgICAgIFZpZXcgc2VsZWN0ZWRWaWV3ID0gaW5zcGVjdG9yLmdldFZpZXcoKTsKLSAgICAgICAgU3RyaW5nIGtleSA9IHNlbGVjdGVkVmlldy5nZXROYW1lKCkgKyAiX2Jhbm5lciI7Ci0KLSAgICAgICAgcmV0dXJuIChJQXNzZXQpIGdldEFzc2V0cygpLmdldChrZXkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNlbGVjdFRhYihJUmVxdWVzdEN5Y2xlIGN5Y2xlKQotICAgIHsKLSAgICAgICAgSW5zcGVjdG9yIGluc3BlY3RvciA9IChJbnNwZWN0b3IpIGdldFBhZ2UoKTsKLSAgICAgICAgaW5zcGVjdG9yLnNldFZpZXcoZ2V0VmlldygpKTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL2luc3BlY3Rvci9WaWV3VGFicy5qd2MgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvaW5zcGVjdG9yL1ZpZXdUYWJzLmp3YwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWUwM2JhZC4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvaW5zcGVjdG9yL1ZpZXdUYWJzLmp3YworKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAgCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPCEtLSAkSWQkIC0tPgotPCFET0NUWVBFIGNvbXBvbmVudC1zcGVjaWZpY2F0aW9uIFBVQkxJQyAKLSAgIi0vL0FwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLy9UYXBlc3RyeSBTcGVjaWZpY2F0aW9uIDMuMC8vRU4iIAotICAiaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy90YXBlc3RyeS9kdGQvVGFwZXN0cnlfM18wLmR0ZCI+Ci0JCi08Y29tcG9uZW50LXNwZWNpZmljYXRpb24gY2xhc3M9Im9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi5pbnNwZWN0b3IuVmlld1RhYnMiPgotICAKLSAgPHByb3BlcnR5LXNwZWNpZmljYXRpb24gbmFtZT0idmlldyIgdHlwZT0ib3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLmluc3BlY3Rvci5WaWV3Ii8+Ci0gIAotICA8cHJpdmF0ZS1hc3NldCBuYW1lPSJTUEVDSUZJQ0FUSU9OIiByZXNvdXJjZS1wYXRoPSJTcGVjaWZpY2F0aW9uX05wMS5naWYiLz4KLSAgPHByaXZhdGUtYXNzZXQgbmFtZT0iU1BFQ0lGSUNBVElPTl9zZWxlY3RlZCIgcmVzb3VyY2UtcGF0aD0iU3BlY2lmaWNhdGlvbl9IcDMuZ2lmIi8+Ci0gIDxwcml2YXRlLWFzc2V0IG5hbWU9IlNQRUNJRklDQVRJT05fZm9jdXMiIHJlc291cmNlLXBhdGg9IlNwZWNpZmljYXRpb25fTlJwMi5naWYiLz4KLSAgPHByaXZhdGUtYXNzZXQgbmFtZT0iU1BFQ0lGSUNBVElPTl9zZWxlY3RlZF9mb2N1cyIgcmVzb3VyY2UtcGF0aD0iU3BlY2lmaWNhdGlvbl9IUnA0LmdpZiIvPgotICA8cHJpdmF0ZS1hc3NldCBuYW1lPSJTUEVDSUZJQ0FUSU9OX2Jhbm5lciIgcmVzb3VyY2UtcGF0aD0iU3BlY2lmaWNhdGlvbl9OQmFubmVyLmdpZiIvPgotICA8cHJpdmF0ZS1hc3NldCBuYW1lPSJURU1QTEFURSIgcmVzb3VyY2UtcGF0aD0iVGVtcGxhdGVfTnAxLmdpZiIvPgotICA8cHJpdmF0ZS1hc3NldCBuYW1lPSJURU1QTEFURV9zZWxlY3RlZCIgcmVzb3VyY2UtcGF0aD0iVGVtcGxhdGVfSHAzLmdpZiIvPgotICA8cHJpdmF0ZS1hc3NldCBuYW1lPSJURU1QTEFURV9mb2N1cyIgcmVzb3VyY2UtcGF0aD0iVGVtcGxhdGVfTlJwMi5naWYiLz4KLSAgPHByaXZhdGUtYXNzZXQgbmFtZT0iVEVNUExBVEVfc2VsZWN0ZWRfZm9jdXMiIHJlc291cmNlLXBhdGg9IlRlbXBsYXRlX0hScDQuZ2lmIi8+Ci0gIDxwcml2YXRlLWFzc2V0IG5hbWU9IlRFTVBMQVRFX2Jhbm5lciIgcmVzb3VyY2UtcGF0aD0iVGVtcGxhdGVfTkJhbm5lci5naWYiLz4KLSAgPHByaXZhdGUtYXNzZXQgbmFtZT0iUFJPUEVSVElFUyIgcmVzb3VyY2UtcGF0aD0iUHJvcGVydGllc19OcDEuZ2lmIi8+Ci0gIDxwcml2YXRlLWFzc2V0IG5hbWU9IlBST1BFUlRJRVNfc2VsZWN0ZWQiIHJlc291cmNlLXBhdGg9IlByb3BlcnRpZXNfSHAzLmdpZiIvPgotICA8cHJpdmF0ZS1hc3NldCBuYW1lPSJQUk9QRVJUSUVTX2ZvY3VzIiByZXNvdXJjZS1wYXRoPSJQcm9wZXJ0aWVzX05ScDIuZ2lmIi8+Ci0gIDxwcml2YXRlLWFzc2V0IG5hbWU9IlBST1BFUlRJRVNfc2VsZWN0ZWRfZm9jdXMiIHJlc291cmNlLXBhdGg9IlByb3BlcnRpZXNfSFJwNC5naWYiLz4KLSAgPHByaXZhdGUtYXNzZXQgbmFtZT0iUFJPUEVSVElFU19iYW5uZXIiIHJlc291cmNlLXBhdGg9IlByb3BlcnRpZXNfTkJhbm5lci5naWYiLz4KLSAgPHByaXZhdGUtYXNzZXQgbmFtZT0iRU5HSU5FIiByZXNvdXJjZS1wYXRoPSJFbmdpbmVfTnAxLmdpZiIvPgotICA8cHJpdmF0ZS1hc3NldCBuYW1lPSJFTkdJTkVfc2VsZWN0ZWQiIHJlc291cmNlLXBhdGg9IkVuZ2luZV9IcDMuZ2lmIi8+Ci0gIDxwcml2YXRlLWFzc2V0IG5hbWU9IkVOR0lORV9mb2N1cyIgcmVzb3VyY2UtcGF0aD0iRW5naW5lX05ScDIuZ2lmIi8+Ci0gIDxwcml2YXRlLWFzc2V0IG5hbWU9IkVOR0lORV9zZWxlY3RlZF9mb2N1cyIgcmVzb3VyY2UtcGF0aD0iRW5naW5lX0hScDQuZ2lmIi8+Ci0gIDxwcml2YXRlLWFzc2V0IG5hbWU9IkVOR0lORV9iYW5uZXIiIHJlc291cmNlLXBhdGg9IkVuZ2luZV9OQmFubmVyLmdpZiIvPgotPC9jb21wb25lbnQtc3BlY2lmaWNhdGlvbj4KZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9pbnNwZWN0b3IvaW5mby5naWYgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvaW5zcGVjdG9yL2luZm8uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTNkMWQxLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9pbnNwZWN0b3IvaW5mby5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvaW5zcGVjdG9yL2luc3BlY3Rvci1yb2xsb3Zlci5naWYgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvaW5zcGVjdG9yL2luc3BlY3Rvci1yb2xsb3Zlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmMGQzZWYuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL2luc3BlY3Rvci9pbnNwZWN0b3Itcm9sbG92ZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL2luc3BlY3Rvci9wYWNrYWdlLmh0bWwgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvaW5zcGVjdG9yL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzYxMGZkYi4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvaW5zcGVjdG9yL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTwhZG9jdHlwZSBodG1sIHB1YmxpYyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci08IS0tICRJZCQgLS0+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlRhcGVzdHJ5OiBXZWIgQXBwbGljYXRpb24gRnJhbWV3b3JrPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotCi08cD5JbXBsZW1lbnRhdGlvbiBvZiB0aGUgVGFwZXN0cnkgPGVtPkluc3BlY3RvcjwvZW0+LCBhIHNwZWNpYWxpemVkIHBhZ2UKLXVzZWQgdG8gZHluYW1pY2FsbHkgaW50cm9zcGVjdCB0aGUgY29uc3RydWN0aW9uIG9mIGFuIGFwcGxpY2F0aW9uIHdoaWxlCi1pdCBydW5zLiAgVGhlIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIuaW5zcGVjdG9yLkluc3BlY3RvckJ1dHRvbn0gY29tcG9uZW50Ci1jcmVhdGVzIGFuIGljb24gb24gdGhlIHBhZ2UgdGhhdCByYWlzZXMgdGhlIEluc3BlY3RvciBpbiBhIHNlcGVyYXRlIHdpbmRvdy4KLQotQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcCA8YSBocmVmPSJtYWlsdG86aGxzaGlwQGFwYWNoZS5vcmciPmhsc2hpcEBhcGFjaGUub3JnPC9hPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvaW5zcGVjdG9yL3RhcGVzdHJ5LWxvZ28uZ2lmIGIvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL2luc3BlY3Rvci90YXBlc3RyeS1sb2dvLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJhZDYzNi4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvaW5zcGVjdG9yL3RhcGVzdHJ5LWxvZ28uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL2pkYmMvQm9vbGVhblBhcmFtZXRlci5qYXZhIGIvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL2pkYmMvQm9vbGVhblBhcmFtZXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MGZjMzFkLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9qZGJjL0Jvb2xlYW5QYXJhbWV0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIuamRiYzsKLQotaW1wb3J0IGphdmEuc3FsLlByZXBhcmVkU3RhdGVtZW50OwotaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKLQotLyoqCi0gKiAgV3JhcHBlciBhcm91bmQgYSBib29sZWFuIHBhcmFtZXRlci4KLSAqCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQHNpbmNlIDIuMwotICoKLSAqKi8KLQotcHVibGljIGNsYXNzIEJvb2xlYW5QYXJhbWV0ZXIgaW1wbGVtZW50cyBJUGFyYW1ldGVyCi17Ci0gICAgcHJpdmF0ZSBib29sZWFuIF92YWx1ZTsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhblBhcmFtZXRlciBUUlVFID0gbmV3IEJvb2xlYW5QYXJhbWV0ZXIodHJ1ZSk7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW5QYXJhbWV0ZXIgRkFMU0UgPSBuZXcgQm9vbGVhblBhcmFtZXRlcihmYWxzZSk7Ci0KLSAgICBwcml2YXRlIEJvb2xlYW5QYXJhbWV0ZXIoYm9vbGVhbiB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIF92YWx1ZSA9IHZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldChQcmVwYXJlZFN0YXRlbWVudCBzdGF0ZW1lbnQsIGludCBpbmRleCkgdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgc3RhdGVtZW50LnNldEJvb2xlYW4oaW5kZXgsIF92YWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gICAgewotICAgICAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigiQm9vbGVhbjwiKTsKLSAgICAgICAgYnVmZmVyLmFwcGVuZChfdmFsdWUpOwotICAgICAgICBidWZmZXIuYXBwZW5kKCc+Jyk7Ci0KLSAgICAgICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL2pkYmMvRG91YmxlUGFyYW1ldGVyLmphdmEgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvamRiYy9Eb3VibGVQYXJhbWV0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTlmNmQ2NS4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvamRiYy9Eb3VibGVQYXJhbWV0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIuamRiYzsKLQotaW1wb3J0IGphdmEuc3FsLlByZXBhcmVkU3RhdGVtZW50OwotaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKLQotLyoqCi0gKiAgQSB3cmFwcGVyIGFyb3VuZCBhIGRvdWJsZSBwYXJhbWV0ZXIuCi0gKgotICoKLSAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiAgQHZlcnNpb24gJElkJAotICogIEBzaW5jZSAyLjMKLSAqIAotICoqLwotCi1wdWJsaWMgY2xhc3MgRG91YmxlUGFyYW1ldGVyIGltcGxlbWVudHMgSVBhcmFtZXRlcgotewotICAgIHByaXZhdGUgZG91YmxlIF92YWx1ZTsKLQotICAgIHB1YmxpYyBEb3VibGVQYXJhbWV0ZXIoZG91YmxlIHZhbHVlKQotICAgIHsKLSAgICAgICAgX3ZhbHVlID0gdmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0KFByZXBhcmVkU3RhdGVtZW50IHN0YXRlbWVudCwgaW50IGluZGV4KSB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgewotICAgICAgICBzdGF0ZW1lbnQuc2V0RG91YmxlKGluZGV4LCBfdmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICAgIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoIkRvdWJsZTwiKTsKLSAgICAgICAgYnVmZmVyLmFwcGVuZChfdmFsdWUpOwotICAgICAgICBidWZmZXIuYXBwZW5kKCc+Jyk7Ci0KLSAgICAgICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9qZGJjL0Zsb2F0UGFyYW1ldGVyLmphdmEgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvamRiYy9GbG9hdFBhcmFtZXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmViMzQ4Li4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9qZGJjL0Zsb2F0UGFyYW1ldGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLmpkYmM7Ci0KLWltcG9ydCBqYXZhLnNxbC5QcmVwYXJlZFN0YXRlbWVudDsKLWltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247Ci0KLS8qKgotICogIEEgd3JhcHBlciBhcm91bmQgYSBmbG9hdCBwYXJhbWV0ZXIuCi0gKgotICoKLSAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiAgQHZlcnNpb24gJElkJAotICogIEBzaW5jZSAyLjMKLSAqIAotICoqLwotCi1wdWJsaWMgY2xhc3MgRmxvYXRQYXJhbWV0ZXIgaW1wbGVtZW50cyBJUGFyYW1ldGVyCi17Ci0gICAgcHJpdmF0ZSBmbG9hdCBfdmFsdWU7Ci0KLSAgICBwdWJsaWMgRmxvYXRQYXJhbWV0ZXIoZmxvYXQgdmFsdWUpCi0gICAgewotICAgICAgICBfdmFsdWUgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXQoUHJlcGFyZWRTdGF0ZW1lbnQgc3RhdGVtZW50LCBpbnQgaW5kZXgpIHRocm93cyBTUUxFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHN0YXRlbWVudC5zZXRGbG9hdChpbmRleCwgX3ZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgICB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCJGbG9hdDwiKTsKLSAgICAgICAgYnVmZmVyLmFwcGVuZChfdmFsdWUpOwotICAgICAgICBidWZmZXIuYXBwZW5kKCc+Jyk7Ci0KLSAgICAgICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9qZGJjL0lQYXJhbWV0ZXIuamF2YSBiL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9qZGJjL0lQYXJhbWV0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjAzMmEwMC4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvamRiYy9JUGFyYW1ldGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLmpkYmM7Ci0KLWltcG9ydCBqYXZhLnNxbC5QcmVwYXJlZFN0YXRlbWVudDsKLWltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247Ci0KLS8qKgotICogIFJlcHJlc2VudHMgYSBwYXJhbWV0ZXIgd2l0aGluIGEgZHluYW1pY2FsbHkgZ2VuZXJhdGVkIFNRTCBzdGF0ZW1lbnQuCi0gKgotICoKLSAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiAgQHZlcnNpb24gJElkJAotICogIEBzaW5jZSAyLjMKLSAqICBAc2VlIG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi5qZGJjLlBhcmFtZXRlcml6ZWRTdGF0ZW1lbnQKLSAqIAotICoqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElQYXJhbWV0ZXIKLXsKLSAgICAvKioKLSAgICAgKiAgSW52b2tlcyB0aGUgYXBwcm9wcmlhdGUgc2V0WFhYKCkgbWV0aG9kIG9uIHRoZSAKLSAgICAgKiAge0BsaW5rIGphdmEuc3FsLlByZXBhcmVkU3RhdGVtZW50fS4KLSAgICAgKiAKLSAgICAgKiovCi0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0KFByZXBhcmVkU3RhdGVtZW50IHN0YXRlbWVudCwgaW50IGluZGV4KQotICAgIHRocm93cyBTUUxFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvamRiYy9JU3RhdGVtZW50LmphdmEgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvamRiYy9JU3RhdGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5ZjI1NDQuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL2pkYmMvSVN0YXRlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi5qZGJjOwotCi1pbXBvcnQgamF2YS5zcWwuUmVzdWx0U2V0OwotaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnNxbC5TdGF0ZW1lbnQ7Ci0KLS8qKgotICogIEEgd3JhcHBlciBhcm91bmQge0BsaW5rIGphdmEuc3FsLlN0YXRlbWVudH0gb3IgCi0gKiAge0BsaW5rIGphdmEuc3FsLlByZXBhcmVkU3RhdGVtZW50fSB3aGljaCBoaWRlcyB0aGUgZGlmZmVyZW5jZXMKLSAqICBiZXR3ZWVuIHRoZSB0d28uICAKLSAqCi0gKiAgQHZlcnNpb24gJElkJAotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAc2VlIG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi5qZGJjLlN0YXRlbWVudEFzc2VtYmx5I2NyZWF0ZVN0YXRlbWVudChDb25uZWN0aW9uKQotICogCi0gKiovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSVN0YXRlbWVudAotewotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIFNRTCBhc3NvY2lhdGVkIHdpdGggdGhpcyBzdGF0ZW1lbnQuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNRTCgpOwotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgdGhlIHVuZGVybHlpbmcge0BsaW5rIGphdmEuc3FsLlN0YXRlbWVudH0gCi0gICAgICogIChvciB7QGxpbmsgamF2YS5zcWwuUHJlcGFyZWRTdGF0ZW1lbnR9KS4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBTdGF0ZW1lbnQgZ2V0U3RhdGVtZW50KCk7Ci0KLSAgICAvKioKLSAgICAgKiAgQ2xvc2VzIHRoZSB1bmRlcmx5aW5nIHN0YXRlbWVudCwgYW5kIG51bGxzIHRoZSByZWZlcmVuY2UgdG8gaXQuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBTUUxFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiAgRXhlY3V0ZXMgdGhlIHN0YXRlbWVudCBhcyBhIHF1ZXJ5LCByZXR1cm5pbmcgYSB7QGxpbmsgUmVzdWx0U2V0fS4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBSZXN1bHRTZXQgZXhlY3V0ZVF1ZXJ5KCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqICBFeGVjdXRlcyB0aGUgc3RhdGVtZW50IGFzIGFuIHVwZGF0ZSwgcmV0dXJuaW5nIHRoZSBudW1iZXIgb2Ygcm93cwotICAgICAqICBhZmZlY3RlZC4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBpbnQgZXhlY3V0ZVVwZGF0ZSgpIHRocm93cyBTUUxFeGNlcHRpb247Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL2pkYmMvSW50ZWdlclBhcmFtZXRlci5qYXZhIGIvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL2pkYmMvSW50ZWdlclBhcmFtZXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTQ4MjAxLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9qZGJjL0ludGVnZXJQYXJhbWV0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIuamRiYzsKLQotaW1wb3J0IGphdmEuc3FsLlByZXBhcmVkU3RhdGVtZW50OwotaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKLQotLyoqCi0gKiAgQSB3cmFwcGVyIGFyb3VuZCBhbiBpbnRlZ2VyIHBhcmFtZXRlci4KLSAqCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQHNpbmNlIDIuMwotICogCi0gKiovCi0KLXB1YmxpYyBjbGFzcyBJbnRlZ2VyUGFyYW1ldGVyIGltcGxlbWVudHMgSVBhcmFtZXRlcgotewotICAgIHByaXZhdGUgaW50IF92YWx1ZTsKLQotICAgIHB1YmxpYyBJbnRlZ2VyUGFyYW1ldGVyKGludCB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIF92YWx1ZSA9IHZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldChQcmVwYXJlZFN0YXRlbWVudCBzdGF0ZW1lbnQsIGludCBpbmRleCkgdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgc3RhdGVtZW50LnNldEludChpbmRleCwgX3ZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgICB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCJJbnRlZ2VyPCIpOwotICAgICAgICBidWZmZXIuYXBwZW5kKF92YWx1ZSk7Ci0gICAgICAgIGJ1ZmZlci5hcHBlbmQoJz4nKTsKLQotICAgICAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL2pkYmMvTG9uZ1BhcmFtZXRlci5qYXZhIGIvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL2pkYmMvTG9uZ1BhcmFtZXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDdlOGEwLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9qZGJjL0xvbmdQYXJhbWV0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIuamRiYzsKLQotaW1wb3J0IGphdmEuc3FsLlByZXBhcmVkU3RhdGVtZW50OwotaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKLQotLyoqCi0gKiAgV3JhcHBlciBhcm91bmQgbG9uZyBwYXJhbWV0ZXIuCi0gKgotICoKLSAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiAgQHZlcnNpb24gJElkJAotICogIEBzaW5jZSAyLjMKLSAqIAotICoqLwotCi1wdWJsaWMgY2xhc3MgTG9uZ1BhcmFtZXRlciBpbXBsZW1lbnRzIElQYXJhbWV0ZXIKLXsKLSAgICBwcml2YXRlIGxvbmcgX3ZhbHVlOwotCi0gICAgcHVibGljIExvbmdQYXJhbWV0ZXIobG9uZyB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIF92YWx1ZSA9IHZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldChQcmVwYXJlZFN0YXRlbWVudCBzdGF0ZW1lbnQsIGludCBpbmRleCkgdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgc3RhdGVtZW50LnNldExvbmcoaW5kZXgsIF92YWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gICAgewotICAgICAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigiTG9uZzwiKTsKLSAgICAgICAgYnVmZmVyLmFwcGVuZChfdmFsdWUpOwotICAgICAgICBidWZmZXIuYXBwZW5kKCc+Jyk7Ci0KLSAgICAgICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9qZGJjL09iamVjdFBhcmFtZXRlci5qYXZhIGIvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL2pkYmMvT2JqZWN0UGFyYW1ldGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1YmU4MGYuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL2pkYmMvT2JqZWN0UGFyYW1ldGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLmpkYmM7Ci0KLWltcG9ydCBqYXZhLnNxbC5QcmVwYXJlZFN0YXRlbWVudDsKLWltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247Ci0KLS8qKgotICogIEFuIGFyYml0cmFyeSBvYmplY3QgcGFyYW1ldGVyLgotICoKLSAqCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogIEB2ZXJzaW9uICRJZCQKLSAqICBAc2luY2UgMi4zCi0gKiAKLSAqKi8KLQotcHVibGljIGNsYXNzIE9iamVjdFBhcmFtZXRlciBpbXBsZW1lbnRzIElQYXJhbWV0ZXIKLXsKLSAgICBwcml2YXRlIE9iamVjdCBfdmFsdWU7Ci0KLSAgICBwdWJsaWMgT2JqZWN0UGFyYW1ldGVyKE9iamVjdCB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIF92YWx1ZSA9IHZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldChQcmVwYXJlZFN0YXRlbWVudCBzdGF0ZW1lbnQsIGludCBpbmRleCkgdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgc3RhdGVtZW50LnNldE9iamVjdChpbmRleCwgX3ZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgICB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCJPYmplY3Q8Iik7Ci0gICAgICAgIGJ1ZmZlci5hcHBlbmQoX3ZhbHVlKTsKLSAgICAgICAgYnVmZmVyLmFwcGVuZCgnPicpOwotCi0gICAgICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvamRiYy9QYXJhbWV0ZXJpemVkU3RhdGVtZW50LmphdmEgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvamRiYy9QYXJhbWV0ZXJpemVkU3RhdGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkMzdjY2EuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL2pkYmMvUGFyYW1ldGVyaXplZFN0YXRlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIuamRiYzsKLQotaW1wb3J0IGphdmEuc3FsLkNvbm5lY3Rpb247Ci1pbXBvcnQgamF2YS5zcWwuUHJlcGFyZWRTdGF0ZW1lbnQ7Ci1pbXBvcnQgamF2YS5zcWwuUmVzdWx0U2V0OwotaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnNxbC5TdGF0ZW1lbnQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotLyoqCi0gKiAgQSB3cmFwcGVyIGFyb3VuZCB7QGxpbmsgUHJlcGFyZWRTdGF0ZW1lbnR9LgotICoKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogCi0gKiovCi0KLXB1YmxpYyBjbGFzcyBQYXJhbWV0ZXJpemVkU3RhdGVtZW50IGltcGxlbWVudHMgSVN0YXRlbWVudAotewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBMT0cgPSBMb2dGYWN0b3J5LmdldExvZyhQYXJhbWV0ZXJpemVkU3RhdGVtZW50LmNsYXNzKTsKLQotICAgIHByaXZhdGUgU3RyaW5nIF9TUUw7Ci0gICAgcHJpdmF0ZSBQcmVwYXJlZFN0YXRlbWVudCBfc3RhdGVtZW50OwotICAgIHByaXZhdGUgSVBhcmFtZXRlcltdIF9wYXJhbWV0ZXJzOwotCi0gICAgLyoqCi0gICAgICogIENyZWF0ZSBhIG5ldyBpbnN0YW5jZTsgdGhlIHBhcmFtZXRlcnMgbGlzdCBpcyBjb3BpZWQuCi0gICAgICogCi0gICAgICogIEBwYXJhbSBTUUwgdGhlIFNRTCB0byBleGVjdXRlIChzZWUge0BsaW5rIENvbm5lY3Rpb24jcHJlcGFyZVN0YXRlbWVudChqYXZhLmxhbmcuU3RyaW5nKX0pCi0gICAgICogIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBKREJDIGNvbm5lY3Rpb24gdG8gdXNlCi0gICAgICogIEBwYXJhbSBwYXJhbWV0ZXJzIGxpc3Qgb2Yge0BsaW5rIElQYXJhbWV0ZXJ9Ci0gICAgICogCi0gICAgICoqLwotICAgIAotICAgIHB1YmxpYyBQYXJhbWV0ZXJpemVkU3RhdGVtZW50KFN0cmluZyBTUUwsIENvbm5lY3Rpb24gY29ubmVjdGlvbiwgTGlzdCBwYXJhbWV0ZXJzKSB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgewotICAgICAgICBfU1FMID0gU1FMOwotCi0gICAgICAgIF9zdGF0ZW1lbnQgPSBjb25uZWN0aW9uLnByZXBhcmVTdGF0ZW1lbnQoU1FMKTsKLQotICAgICAgICBfcGFyYW1ldGVycyA9IChJUGFyYW1ldGVyW10pIHBhcmFtZXRlcnMudG9BcnJheShuZXcgSVBhcmFtZXRlcltwYXJhbWV0ZXJzLnNpemUoKV0pOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX3BhcmFtZXRlcnMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIEpEQkMgbnVtYmVycyB0aGluZ3MgZnJvbSAxLCBub3QgMC4KLQotICAgICAgICAgICAgX3BhcmFtZXRlcnNbaV0uc2V0KF9zdGF0ZW1lbnQsIGkgKyAxKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIFNRTCBhc3NvY2lhdGVkIHdpdGggdGhpcyBzdGF0ZW1lbnQuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNRTCgpCi0gICAgewotICAgICAgICByZXR1cm4gX1NRTDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0aGUgdW5kZXJseWluZyBvciB7QGxpbmsgUHJlcGFyZWRTdGF0ZW1lbnR9LgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIFN0YXRlbWVudCBnZXRTdGF0ZW1lbnQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9zdGF0ZW1lbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIENsb3NlcyB0aGUgdW5kZXJseWluZyBzdGF0ZW1lbnQsIGFuZCBudWxscyB0aGUgcmVmZXJlbmNlIHRvIGl0LgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgewotICAgICAgICBfc3RhdGVtZW50LmNsb3NlKCk7Ci0KLSAgICAgICAgX3N0YXRlbWVudCA9IG51bGw7Ci0gICAgICAgIF9TUUwgPSBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBFeGVjdXRlcyB0aGUgc3RhdGVtZW50IGFzIGEgcXVlcnksIHJldHVybmluZyBhIHtAbGluayBSZXN1bHRTZXR9LgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIFJlc3VsdFNldCBleGVjdXRlUXVlcnkoKSB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiAoTE9HLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgICAgICBMT0cuZGVidWcoIkV4ZWN1dGluZyBxdWVyeTogIiArIHRoaXMpOwotCi0gICAgICAgIHJldHVybiBfc3RhdGVtZW50LmV4ZWN1dGVRdWVyeSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBFeGVjdXRlcyB0aGUgc3RhdGVtZW50IGFzIGFuIHVwZGF0ZSwgcmV0dXJuaW5nIHRoZSBudW1iZXIgb2Ygcm93cwotICAgICAqICBhZmZlY3RlZC4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBpbnQgZXhlY3V0ZVVwZGF0ZSgpIHRocm93cyBTUUxFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmIChMT0cuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgICAgIExPRy5kZWJ1ZygiRXhlY3V0aW5nIHVwZGF0ZTogIiArIHRoaXMpOwotCi0gICAgICAgIHJldHVybiBfc3RhdGVtZW50LmV4ZWN1dGVVcGRhdGUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgICB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCJQYXJhbWV0ZXJpemVkU3RhdGVtZW50QCIpOwotICAgICAgICBidWZmZXIuYXBwZW5kKEludGVnZXIudG9IZXhTdHJpbmcoaGFzaENvZGUoKSkpOwotICAgICAgICBidWZmZXIuYXBwZW5kKCJbU1FMPVxuPCIpOwotICAgICAgICBidWZmZXIuYXBwZW5kKF9TUUwpOwotICAgICAgICBidWZmZXIuYXBwZW5kKCJcbj4iKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9wYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBJUGFyYW1ldGVyIHBhcmFtZXRlciA9IF9wYXJhbWV0ZXJzW2ldOwotCi0gICAgICAgICAgICBidWZmZXIuYXBwZW5kKCIgPyIpOwotICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChpICsgMSk7Ci0gICAgICAgICAgICBidWZmZXIuYXBwZW5kKCc9Jyk7Ci0KLSAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQocGFyYW1ldGVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIGJ1ZmZlci5hcHBlbmQoJ10nKTsKLQotICAgICAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0gICAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL2pkYmMvU2hvcnRQYXJhbWV0ZXIuamF2YSBiL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9qZGJjL1Nob3J0UGFyYW1ldGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxY2ZlYTcuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL2pkYmMvU2hvcnRQYXJhbWV0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIuamRiYzsKLQotaW1wb3J0IGphdmEuc3FsLlByZXBhcmVkU3RhdGVtZW50OwotaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKLQotLyoqCi0gKiAgQSB3cmFwcGVyIGFyb3VuZCBhIHNob3J0IHBhcmFtZXRlci4gIAotICoKLSAqCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogIEB2ZXJzaW9uICRJZCQKLSAqICBAc2luY2UgMi4zCi0gKiAKLSAqKi8KLQotcHVibGljIGNsYXNzIFNob3J0UGFyYW1ldGVyIGltcGxlbWVudHMgSVBhcmFtZXRlcgotewotICAgIHByaXZhdGUgc2hvcnQgX3ZhbHVlOwotCi0gICAgcHVibGljIFNob3J0UGFyYW1ldGVyKHNob3J0IHZhbHVlKQotICAgIHsKLSAgICAgICAgX3ZhbHVlID0gdmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0KFByZXBhcmVkU3RhdGVtZW50IHN0YXRlbWVudCwgaW50IGluZGV4KSB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgewotICAgICAgICBzdGF0ZW1lbnQuc2V0U2hvcnQoaW5kZXgsIF92YWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gICAgewotICAgICAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigiU2hvcnQ8Iik7Ci0gICAgICAgIGJ1ZmZlci5hcHBlbmQoX3ZhbHVlKTsKLSAgICAgICAgYnVmZmVyLmFwcGVuZCgnPicpOwotCi0gICAgICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9qZGJjL1NpbXBsZVN0YXRlbWVudC5qYXZhIGIvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL2pkYmMvU2ltcGxlU3RhdGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2ZGYyMGYuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL2pkYmMvU2ltcGxlU3RhdGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi5qZGJjOwotCi1pbXBvcnQgamF2YS5zcWwuQ29ubmVjdGlvbjsKLWltcG9ydCBqYXZhLnNxbC5SZXN1bHRTZXQ7Ci1pbXBvcnQgamF2YS5zcWwuU1FMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuc3FsLlN0YXRlbWVudDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi0vKioKLSAqICBBIHdyYXBwZXIgYXJvdW5kIHtAbGluayBTdGF0ZW1lbnR9LgotICoKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICoKLSAqKi8KLQotcHVibGljIGNsYXNzIFNpbXBsZVN0YXRlbWVudCBpbXBsZW1lbnRzIElTdGF0ZW1lbnQKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgTE9HID0gTG9nRmFjdG9yeS5nZXRMb2coU2ltcGxlU3RhdGVtZW50LmNsYXNzKTsKLQotICAgIHByaXZhdGUgU3RyaW5nIF9zcWw7Ci0gICAgcHJpdmF0ZSBTdGF0ZW1lbnQgX3N0YXRlbWVudDsKLQotICAgIHB1YmxpYyBTaW1wbGVTdGF0ZW1lbnQoU3RyaW5nIFNRTCwgQ29ubmVjdGlvbiBjb25uZWN0aW9uKSB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgewotICAgICAgICBfc3FsID0gU1FMOwotICAgICAgICBfc3RhdGVtZW50ID0gY29ubmVjdGlvbi5jcmVhdGVTdGF0ZW1lbnQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2ltcGxlU3RhdGVtZW50KFN0cmluZyBTUUwsIENvbm5lY3Rpb24gY29ubmVjdGlvbiwgaW50IHJlc3VsdFNldFR5cGUsIGludCByZXN1bHRTZXRDb25jdXJyZW5jeSkKLSAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgX3NxbCA9IFNRTDsKLSAgICAgICAgX3N0YXRlbWVudCA9IGNvbm5lY3Rpb24uY3JlYXRlU3RhdGVtZW50KHJlc3VsdFNldFR5cGUsIHJlc3VsdFNldENvbmN1cnJlbmN5KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBTUUwgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc3RhdGVtZW50LgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIFN0cmluZyBnZXRTUUwoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9zcWw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgdGhlIHVuZGVybHlpbmcge0BsaW5rIFN0YXRlbWVudH0uCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgU3RhdGVtZW50IGdldFN0YXRlbWVudCgpCi0gICAgewotICAgICAgICByZXR1cm4gX3N0YXRlbWVudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgQ2xvc2VzIHRoZSB1bmRlcmx5aW5nIHN0YXRlbWVudCwgYW5kIG51bGxzIHRoZSByZWZlcmVuY2UgdG8gaXQuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBTUUxFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIF9zdGF0ZW1lbnQuY2xvc2UoKTsKLQotICAgICAgICBfc3RhdGVtZW50ID0gbnVsbDsKLSAgICAgICAgX3NxbCA9IG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEV4ZWN1dGVzIHRoZSBzdGF0ZW1lbnQgYXMgYSBxdWVyeSwgcmV0dXJuaW5nIGEge0BsaW5rIFJlc3VsdFNldH0uCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgUmVzdWx0U2V0IGV4ZWN1dGVRdWVyeSgpIHRocm93cyBTUUxFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmIChMT0cuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgICAgIExPRy5kZWJ1ZygiRXhlY3V0aW5nIHF1ZXJ5OiAiICsgdGhpcyk7Ci0KLSAgICAgICAgcmV0dXJuIF9zdGF0ZW1lbnQuZXhlY3V0ZVF1ZXJ5KF9zcWwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBFeGVjdXRlcyB0aGUgc3RhdGVtZW50IGFzIGFuIHVwZGF0ZSwgcmV0dXJuaW5nIHRoZSBudW1iZXIgb2Ygcm93cwotICAgICAqICBhZmZlY3RlZC4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBpbnQgZXhlY3V0ZVVwZGF0ZSgpIHRocm93cyBTUUxFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmIChMT0cuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgICAgIExPRy5kZWJ1ZygiRXhlY3V0aW5nIHVwZGF0ZTogIiArIHRoaXMpOwotCi0gICAgICAgIHJldHVybiBfc3RhdGVtZW50LmV4ZWN1dGVVcGRhdGUoX3NxbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gICAgewotICAgICAgICBTdHJpbmdCdWZmZXIgYnVmZmVyOwotCi0gICAgICAgIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoIlNpbXBsZVN0YXRlbWVudEAiKTsKLSAgICAgICAgYnVmZmVyLmFwcGVuZChJbnRlZ2VyLnRvSGV4U3RyaW5nKGhhc2hDb2RlKCkpKTsKLQotICAgICAgICBidWZmZXIuYXBwZW5kKCJbU1FMPTxcbiIpOwotICAgICAgICBidWZmZXIuYXBwZW5kKF9zcWwpOwotICAgICAgICBidWZmZXIuYXBwZW5kKCJcbj5dIik7Ci0KLSAgICAgICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9qZGJjL1N0YXRlbWVudEFzc2VtYmx5LmphdmEgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvamRiYy9TdGF0ZW1lbnRBc3NlbWJseS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTJlNzQwLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9qZGJjL1N0YXRlbWVudEFzc2VtYmx5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ODAgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi5qZGJjOwotCi1pbXBvcnQgamF2YS5zcWwuQ29ubmVjdGlvbjsKLWltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5zcWwuVGltZXN0YW1wOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5HcmVnb3JpYW5DYWxlbmRhcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiAgQ2xhc3MgZm9yIGNyZWF0aW5nIGFuZCBleGVjdXRpbmcgSkRCQyBzdGF0ZW1lbnRzLiAgQWxsb3dzIHN0YXRlbWVudHMgdG8gYmUgYXNzZW1ibGVkCi0gKiAgaW5jcmVtZW50YWxseSAobGlrZSBhIHtAbGluayBTdHJpbmdCdWZmZXJ9KSwgYnV0IGFsc28gdHJhY2tzIHBhcmFtZXRlcnMsIHNoaWVsZGluZwotICogIHRoZSBkZXZlbG9wZXIgZnJvbSB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiBjb25zdHJ1Y3RpbmcgYW5kIAotICogIHVzaW5nIGEgSkRCQyAKLSAqICB7QGxpbmsgamF2YS5zcWwuU3RhdGVtZW50fSBhbmQgCi0gKiAgYSBKREJDIHtAbGluayBqYXZhLnNxbC5QcmVwYXJlZFN0YXRlbWVudH0uICBUaGlzIGNsYXNzIGlzIHNvbWV3aGF0IHNrZXdlZCB0b3dhcmRzCi0gKiAgT3JhY2xlLCB3aGljaCB3b3JrcyBtb3JlIGVmZmljaWVudGx5IHdpdGggcHJlcGFyZWQgc3RhbWVudHMgdGhhbgotICogIHNpbXBsZSBTUUwuCi0gKiAKLSAqICA8cD5JbiBhZGRpdGlvbiwgaW1wbGVtZW50cyB7QGxpbmsgI3RvU3RyaW5nKCl9IGluIGEgdXNlZnVsIHdheSAoeW91IGNhbiBzZWUgdGhlCi0gKiAgU1FMIGFuZCBwYXJhbWV0ZXJzKSwgd2hpY2ggaXMgaW52YWx1YWJsZSB3aGVuIGRlYnVnZ2luZy4KLSAqIAotICogIDxwPntAbGluayAjYWRkUGFyYW1ldGVyKGludCl9IChhbmQgYWxsIG92ZXJsb2FkZWQgdmVyc2lvbnMgb2YgaXQgZm9yIHNjYWxhciB0eXBlcykKLSAqICBhZGRzIGEgIj8iIHRvIHRoZSBzdGF0ZW1lbnQgYW5kIHJlY29yZHMgdGhlIHBhcmFtZXRlciB2YWx1ZS4KLSAqIAotICogIDxwPntAbGluayAjYWRkUGFyYW1ldGVyKEludGVnZXIpfSAoYW5kIGFsbCBvdmVybG9hZGVkIHZlcnNpb24gb2YgaXQgZm9yIHdyYXBwZXIKLSAqICB0eXBlcykgZG9lcyB0aGUgc2FtZSAuLi4gdW5sZXNzIHRoZSB2YWx1ZSBpcyBudWxsLCBpbiB3aGljaCBjYXNlICJOVUxMIiBpcwotICogIGluc2VydGVkIGludG8gdGhlIHN0YXRlbWVudC4KLSAqIAotICogIDxwPntAbGluayAjYWRkUGFyYW1ldGVyTGlzdChpbnRbXSwgU3RyaW5nKX0gKGFuZCBhbGwgb3ZlcmxvYWRlZCB2ZXJzaW9ucyBvZiBpdCkKLSAqICBzaW1wbHkgaW52b2tlcyB0aGUgYXBwcm9wcmlhdGUge0BsaW5rICNhZGRQYXJhbWV0ZXIoaW50KX0sIGFkZGluZyB0aGUKLSAqICBzZXBhcmF0b3IgaW4gYmV0d2VlbiBwYXJhbWV0ZXJzLgotICoKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICoKLSAqKi8KLQotcHVibGljIGNsYXNzIFN0YXRlbWVudEFzc2VtYmx5Ci17Ci0gICAgcHJpdmF0ZSBTdHJpbmdCdWZmZXIgX2J1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOVUxMID0gIk5VTEwiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VQID0gIiwgIjsKLQotICAgIC8qKgotICAgICAqICBMaXN0IG9mIHtAbGluayBJUGFyYW1ldGVyfQotICAgICAqIAotICAgICAqKi8KLQotICAgIHByaXZhdGUgTGlzdCBfcGFyYW1ldGVyczsKLQotICAgIHByaXZhdGUgaW50IF9saW5lTGVuZ3RoOwotICAgIHByaXZhdGUgaW50IF9tYXhMaW5lTGVuZ3RoID0gODA7Ci0gICAgcHJpdmF0ZSBpbnQgX2luZGVudCA9IDU7Ci0KLSAgICAvKioKLSAgICAgKiAgRGVmYXVsdCBjb25zdHJ1Y3RvcjsgdXNlcyBhIG1heGltdW0gbGluZSBsZW5ndGggb2YgODAgYW5kIGFuIGluZGVudCBvZiA1LgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIFN0YXRlbWVudEFzc2VtYmx5KCkKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIFN0YXRlbWVudEFzc2VtYmx5KGludCBtYXhMaW5lTGVuZ3RoLCBpbnQgaW5kZW50KQotICAgIHsKLSAgICAgICAgX21heExpbmVMZW5ndGggPSBtYXhMaW5lTGVuZ3RoOwotICAgICAgICBfaW5kZW50ID0gaW5kZW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBDbGVhcnMgdGhlIGFzc2VtYmx5LCBwcmVwYXJpbmcgaXQgZm9yIHJlLXVzZS4KLSAgICAgKiAKLSAgICAgKiAgQHNpbmNlIDEuMC43Ci0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgY2xlYXIoKQotICAgIHsKLSAgICAgICAgX2J1ZmZlci5zZXRMZW5ndGgoMCk7Ci0gICAgICAgIF9saW5lTGVuZ3RoID0gMDsKLQotICAgICAgICBpZiAoX3BhcmFtZXRlcnMgIT0gbnVsbCkKLSAgICAgICAgICAgIF9wYXJhbWV0ZXJzLmNsZWFyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIE1heGltdW0gbGVuZ3RoIG9mIGEgbGluZS4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBpbnQgZ2V0TWF4TGluZUxlbmd0aCgpCi0gICAgewotICAgICAgICByZXR1cm4gX21heExpbmVMZW5ndGg7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIE51bWJlciBvZiBzcGFjZXMgdG8gaW5kZW50IGNvbnRpbnVhdGlvbiBsaW5lcyBieS4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBpbnQgZ2V0SW5kZW50KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfaW5kZW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBBZGRzIHRleHQgdG8gdGhlIGN1cnJlbnQgbGluZSwgdW5sZXNzIHRoYXQgd291bGQgbWFrZSB0aGUgbGluZSB0b28gbG9uZywgaW4KLSAgICAgKiAgd2hpY2ggY2FzZSBhIG5ldyBsaW5lIGlzIHN0YXJ0ZWQgKGFuZCBpbmRlbnRlZCkgYmVmb3JlIGFkZGluZyB0aGUgdGV4dC4KLSAgICAgKgotICAgICAqICA8cD5UZXh0IGlzIGFkZGVkIGFzLWlzLCB3aXRoIG5vIGNvbmNlcHQgb2YgcXVvdGluZy4gIFRvIGFkZCBhcmJpdHJhcnkgc3RyaW5ncwotICAgICAqICAoc3VjaCBhcyBpbiBhIHdoZXJlIGNsYXVzZSksIHVzZSB7QGxpbmsgI2FkZFBhcmFtZXRlcihTdHJpbmcpfS4KLSAgICAgKgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgYWRkKFN0cmluZyB0ZXh0KQotICAgIHsKLSAgICAgICAgaW50IHRleHRMZW5ndGg7Ci0KLSAgICAgICAgdGV4dExlbmd0aCA9IHRleHQubGVuZ3RoKCk7Ci0KLSAgICAgICAgaWYgKF9saW5lTGVuZ3RoICsgdGV4dExlbmd0aCA+IF9tYXhMaW5lTGVuZ3RoKQotICAgICAgICB7Ci0gICAgICAgICAgICBfYnVmZmVyLmFwcGVuZCgnXG4nKTsKLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfaW5kZW50OyBpKyspCi0gICAgICAgICAgICAgICAgX2J1ZmZlci5hcHBlbmQoJyAnKTsKLQotICAgICAgICAgICAgX2xpbmVMZW5ndGggPSBfaW5kZW50OwotICAgICAgICB9Ci0KLSAgICAgICAgX2J1ZmZlci5hcHBlbmQodGV4dCk7Ci0gICAgICAgIF9saW5lTGVuZ3RoICs9IHRleHRMZW5ndGg7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGFkZChzaG9ydCB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIGFkZChTaG9ydC50b1N0cmluZyh2YWx1ZSkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBhZGQoaW50IHZhbHVlKQotICAgIHsKLSAgICAgICAgYWRkKEludGVnZXIudG9TdHJpbmcodmFsdWUpKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgYWRkKGxvbmcgdmFsdWUpCi0gICAgewotICAgICAgICBhZGQoTG9uZy50b1N0cmluZyh2YWx1ZSkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBhZGQoZmxvYXQgdmFsdWUpCi0gICAgewotICAgICAgICBhZGQoRmxvYXQudG9TdHJpbmcodmFsdWUpKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgYWRkKGRvdWJsZSB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIGFkZChEb3VibGUudG9TdHJpbmcodmFsdWUpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgQWRkcyBhIGRhdGUgdmFsdWUgdG8gYSB7QGxpbmsgU3RhdGVtZW50QXNzZW1ibHl9IGNvbnZlcnRpbmcKLSAgICAgKiAgaXQgdG8gYSB7QGxpbmsgamF2YS5zcWwuVGltZXN0YW1wfSBmaXJzdC4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIGFkZFBhcmFtZXRlcihEYXRlIGRhdGUpCi0gICAgewotICAgICAgICBpZiAoZGF0ZSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBhZGQoIk5VTEwiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIENhbGVuZGFyIGNhbGVuZGFyID0gR3JlZ29yaWFuQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKTsKLQotICAgICAgICBjYWxlbmRhci5zZXRUaW1lKGRhdGUpOwotICAgICAgICBjYWxlbmRhci5zZXQoQ2FsZW5kYXIuTUlMTElTRUNPTkQsIDApOwotCi0gICAgICAgIERhdGUgYWRqdXN0ZWQgPSBjYWxlbmRhci5nZXRUaW1lKCk7Ci0KLSAgICAgICAgVGltZXN0YW1wIHRpbWVzdGFtcCA9IG5ldyBUaW1lc3RhbXAoYWRqdXN0ZWQuZ2V0VGltZSgpKTsKLQotICAgICAgICBhZGRQYXJhbWV0ZXIodGltZXN0YW1wKTsKLSAgICB9Ci0KLSAgICAvKiogCi0gICAgICogIEFkZHMgYSBzZXBhcmF0b3IgKHVzdWFsbHkgYSBjb21tYSBhbmQgYSBzcGFjZSkgdG8gdGhlIGN1cnJlbnQgbGluZSwgcmVnYXJkbGVzcwotICAgICAqICBvZiBsaW5lIGxlbmd0aC4gIFRoaXMgaXMgcHVyZWx5IGFlc3RoZXRpYyAuLi4gaXQganVzdCBsb29rcyBvZGQgaWYgYSBzZXBhcmF0b3IKLSAgICAgKiAgZ2V0cyB3cmFwcGVkIHRvIGEgbmV3IGxpbmUgYnkgaXRzZWxmLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgYWRkU2VwKFN0cmluZyB0ZXh0KQotICAgIHsKLSAgICAgICAgX2J1ZmZlci5hcHBlbmQodGV4dCk7Ci0gICAgICAgIF9saW5lTGVuZ3RoICs9IHRleHQubGVuZ3RoKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFN0YXJ0cyBhIG5ldyBsaW5lLCB3aXRob3V0IGluZGVudGluZy4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIG5ld0xpbmUoKQotICAgIHsKLSAgICAgICAgaWYgKF9idWZmZXIubGVuZ3RoKCkgIT0gMCkKLSAgICAgICAgICAgIF9idWZmZXIuYXBwZW5kKCdcbicpOwotCi0gICAgICAgIF9saW5lTGVuZ3RoID0gMDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdGFydHMgYSBuZXcgbGluZSwgdGhlbiBhZGRzIHRoZSBnaXZlbiB0ZXh0LgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgbmV3TGluZShTdHJpbmcgdGV4dCkKLSAgICB7Ci0gICAgICAgIGlmIChfYnVmZmVyLmxlbmd0aCgpICE9IDApCi0gICAgICAgICAgICBfYnVmZmVyLmFwcGVuZCgnXG4nKTsKLQotICAgICAgICBfYnVmZmVyLmFwcGVuZCh0ZXh0KTsKLQotICAgICAgICBfbGluZUxlbmd0aCA9IHRleHQubGVuZ3RoKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkTGlzdChTdHJpbmdbXSBpdGVtcywgU3RyaW5nIHNlcGFyYXRvcikKLSAgICB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChpID4gMCkKLSAgICAgICAgICAgICAgICBhZGRTZXAoc2VwYXJhdG9yKTsKLQotICAgICAgICAgICAgYWRkKGl0ZW1zW2ldKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFBhcmFtZXRlckxpc3QoaW50W10gaXRlbXMsIFN0cmluZyBzZXBhcmF0b3IpCi0gICAgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoaSA+IDApCi0gICAgICAgICAgICAgICAgYWRkU2VwKHNlcGFyYXRvcik7Ci0KLSAgICAgICAgICAgIGFkZFBhcmFtZXRlcihpdGVtc1tpXSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRQYXJhbWV0ZXJMaXN0KEludGVnZXJbXSBpdGVtcywgU3RyaW5nIHNlcGFyYXRvcikKLSAgICB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChpID4gMCkKLSAgICAgICAgICAgICAgICBhZGRTZXAoc2VwYXJhdG9yKTsKLQotICAgICAgICAgICAgYWRkUGFyYW1ldGVyKGl0ZW1zW2ldKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFBhcmFtZXRlckxpc3QobG9uZ1tdIGl0ZW1zLCBTdHJpbmcgc2VwYXJhdG9yKQotICAgIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGkgPiAwKQotICAgICAgICAgICAgICAgIGFkZFNlcChzZXBhcmF0b3IpOwotCi0gICAgICAgICAgICBhZGRQYXJhbWV0ZXIoaXRlbXNbaV0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkUGFyYW1ldGVyTGlzdChMb25nW10gaXRlbXMsIFN0cmluZyBzZXBhcmF0b3IpCi0gICAgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoaSA+IDApCi0gICAgICAgICAgICAgICAgYWRkU2VwKHNlcGFyYXRvcik7Ci0KLSAgICAgICAgICAgIGFkZFBhcmFtZXRlcihpdGVtc1tpXSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRQYXJhbWV0ZXJMaXN0KFN0cmluZ1tdIGl0ZW1zLCBTdHJpbmcgc2VwYXJhdG9yKQotICAgIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGkgPiAwKQotICAgICAgICAgICAgICAgIGFkZFNlcChzZXBhcmF0b3IpOwotCi0gICAgICAgICAgICBhZGRQYXJhbWV0ZXIoaXRlbXNbaV0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkUGFyYW1ldGVyTGlzdChkb3VibGVbXSBpdGVtcywgU3RyaW5nIHNlcGFyYXRvcikKLSAgICB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChpID4gMCkKLSAgICAgICAgICAgICAgICBhZGRTZXAoc2VwYXJhdG9yKTsKLQotICAgICAgICAgICAgYWRkUGFyYW1ldGVyKGl0ZW1zW2ldKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFBhcmFtZXRlcihPYmplY3QgdmFsdWUpCi0gICAgewotICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkKLSAgICAgICAgICAgIGFkZChOVUxMKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgYWRkUGFyYW1ldGVyKG5ldyBPYmplY3RQYXJhbWV0ZXIodmFsdWUpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRQYXJhbWV0ZXIoVGltZXN0YW1wIHRpbWVzdGFtcCkKLSAgICB7Ci0gICAgICAgIGlmICh0aW1lc3RhbXAgPT0gbnVsbCkKLSAgICAgICAgICAgIGFkZChOVUxMKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgYWRkUGFyYW1ldGVyKG5ldyBUaW1lc3RhbXBQYXJhbWV0ZXIodGltZXN0YW1wKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkUGFyYW1ldGVyKFN0cmluZyB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQotICAgICAgICAgICAgYWRkKE5VTEwpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBhZGRQYXJhbWV0ZXIobmV3IFN0cmluZ1BhcmFtZXRlcih2YWx1ZSkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFBhcmFtZXRlcihpbnQgdmFsdWUpCi0gICAgewotICAgICAgICBhZGRQYXJhbWV0ZXIobmV3IEludGVnZXJQYXJhbWV0ZXIodmFsdWUpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRQYXJhbWV0ZXIoSW50ZWdlciB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQotICAgICAgICAgICAgYWRkKE5VTEwpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBhZGRQYXJhbWV0ZXIodmFsdWUuaW50VmFsdWUoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkUGFyYW1ldGVyKGxvbmcgdmFsdWUpCi0gICAgewotICAgICAgICBhZGRQYXJhbWV0ZXIobmV3IExvbmdQYXJhbWV0ZXIodmFsdWUpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRQYXJhbWV0ZXIoTG9uZyB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQotICAgICAgICAgICAgYWRkKE5VTEwpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBhZGRQYXJhbWV0ZXIodmFsdWUubG9uZ1ZhbHVlKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFBhcmFtZXRlcihmbG9hdCB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIGFkZFBhcmFtZXRlcihuZXcgRmxvYXRQYXJhbWV0ZXIodmFsdWUpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRQYXJhbWV0ZXIoRmxvYXQgdmFsdWUpCi0gICAgewotICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkKLSAgICAgICAgICAgIGFkZChOVUxMKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgYWRkUGFyYW1ldGVyKHZhbHVlLmZsb2F0VmFsdWUoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkUGFyYW1ldGVyKGRvdWJsZSB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIGFkZFBhcmFtZXRlcihuZXcgRG91YmxlUGFyYW1ldGVyKHZhbHVlKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkUGFyYW1ldGVyKERvdWJsZSB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQotICAgICAgICAgICAgYWRkKE5VTEwpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBhZGRQYXJhbWV0ZXIodmFsdWUuZG91YmxlVmFsdWUoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkUGFyYW1ldGVyKHNob3J0IHZhbHVlKQotICAgIHsKLSAgICAgICAgYWRkUGFyYW1ldGVyKG5ldyBTaG9ydFBhcmFtZXRlcih2YWx1ZSkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFBhcmFtZXRlcihTaG9ydCB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQotICAgICAgICAgICAgYWRkKE5VTEwpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBhZGRQYXJhbWV0ZXIodmFsdWUuc2hvcnRWYWx1ZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRQYXJhbWV0ZXIoYm9vbGVhbiB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIGFkZFBhcmFtZXRlcih2YWx1ZSA/IEJvb2xlYW5QYXJhbWV0ZXIuVFJVRSA6IEJvb2xlYW5QYXJhbWV0ZXIuRkFMU0UpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFBhcmFtZXRlcihCb29sZWFuIHZhbHVlKQotICAgIHsKLSAgICAgICAgaWYgKHZhbHVlID09IG51bGwpCi0gICAgICAgICAgICBhZGQoTlVMTCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGFkZFBhcmFtZXRlcih2YWx1ZS5ib29sZWFuVmFsdWUoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFBhcmFtZXRlcihJUGFyYW1ldGVyIHBhcmFtZXRlcikKLSAgICB7Ci0gICAgICAgIGlmIChfcGFyYW1ldGVycyA9PSBudWxsKQotICAgICAgICAgICAgX3BhcmFtZXRlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgX3BhcmFtZXRlcnMuYWRkKHBhcmFtZXRlcik7Ci0KLSAgICAgICAgYWRkKCI/Iik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIENyZWF0ZXMgYW5kIHJldHVybnMgYW4ge0BsaW5rIElTdGF0ZW1lbnR9IGJhc2VkIG9uIHRoZSBTUUwgYW5kIHBhcmFtZXRlcnMKLSAgICAgKiAgYWNxdWlyZWQuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgSVN0YXRlbWVudCBjcmVhdGVTdGF0ZW1lbnQoQ29ubmVjdGlvbiBjb25uZWN0aW9uKSB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgewotICAgICAgICBTdHJpbmcgc3FsID0gX2J1ZmZlci50b1N0cmluZygpOwotCi0gICAgICAgIGlmIChfcGFyYW1ldGVycyA9PSBudWxsIHx8IF9wYXJhbWV0ZXJzLmlzRW1wdHkoKSkKLSAgICAgICAgICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdGVtZW50KHNxbCwgY29ubmVjdGlvbik7Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBQYXJhbWV0ZXJpemVkU3RhdGVtZW50KHNxbCwgY29ubmVjdGlvbiwgX3BhcmFtZXRlcnMpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICAgIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoIlN0YXRlbWVudEFzc2VtYmx5QCIpOwotCi0gICAgICAgIGJ1ZmZlci5hcHBlbmQoSW50ZWdlci50b0hleFN0cmluZyhoYXNoQ29kZSgpKSk7Ci0gICAgICAgIGJ1ZmZlci5hcHBlbmQoIltTUUw9XG48Iik7Ci0gICAgICAgIGJ1ZmZlci5hcHBlbmQoX2J1ZmZlcik7Ci0gICAgICAgIGJ1ZmZlci5hcHBlbmQoIlxuPiIpOwotCi0gICAgICAgIGlmIChfcGFyYW1ldGVycyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgY291bnQgPSBfcGFyYW1ldGVycy5zaXplKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IHBhcmFtZXRlciA9IF9wYXJhbWV0ZXJzLmdldChpKTsKLQotICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIiA/Iik7Ci0gICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChpICsgMSk7Ci0gICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgnPScpOwotCi0gICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChwYXJhbWV0ZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgYnVmZmVyLmFwcGVuZCgnXScpOwotCi0gICAgICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL2pkYmMvU3RyaW5nUGFyYW1ldGVyLmphdmEgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvamRiYy9TdHJpbmdQYXJhbWV0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg4YTJkNy4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvamRiYy9TdHJpbmdQYXJhbWV0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIuamRiYzsKLQotaW1wb3J0IGphdmEuc3FsLlByZXBhcmVkU3RhdGVtZW50OwotaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnNxbC5UeXBlczsKLQotLyoqCi0gKiAgVXNlZCB3aXRoIFN0cmluZyBwYXJhbWV0ZXJzLgotICoKLSAqCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogIEB2ZXJzaW9uICRJZCQKLSAqCi0gKiovCi0KLXB1YmxpYyBjbGFzcyBTdHJpbmdQYXJhbWV0ZXIgaW1wbGVtZW50cyBJUGFyYW1ldGVyCi17Ci0gICAgcHJpdmF0ZSBTdHJpbmcgX3ZhbHVlOwotCi0gICAgcHVibGljIFN0cmluZ1BhcmFtZXRlcihTdHJpbmcgdmFsdWUpCi0gICAgewotICAgICAgICBfdmFsdWUgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXQoUHJlcGFyZWRTdGF0ZW1lbnQgc3RhdGVtZW50LCBpbnQgaW5kZXgpIHRocm93cyBTUUxFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmIChfdmFsdWUgPT0gbnVsbCkKLSAgICAgICAgICAgIHN0YXRlbWVudC5zZXROdWxsKGluZGV4LCBUeXBlcy5WQVJDSEFSKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgc3RhdGVtZW50LnNldFN0cmluZyhpbmRleCwgX3ZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgICB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCJTdHJpbmc8Iik7Ci0gICAgICAgIGJ1ZmZlci5hcHBlbmQoX3ZhbHVlKTsKLSAgICAgICAgYnVmZmVyLmFwcGVuZCgnPicpOwotCi0gICAgICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvamRiYy9UaW1lc3RhbXBQYXJhbWV0ZXIuamF2YSBiL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9qZGJjL1RpbWVzdGFtcFBhcmFtZXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWJkOGZjLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9qZGJjL1RpbWVzdGFtcFBhcmFtZXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi5qZGJjOwotCi1pbXBvcnQgamF2YS5zcWwuUHJlcGFyZWRTdGF0ZW1lbnQ7Ci1pbXBvcnQgamF2YS5zcWwuU1FMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuc3FsLlRpbWVzdGFtcDsKLWltcG9ydCBqYXZhLnNxbC5UeXBlczsKLQotLyoqCi0gKiAgVXNlZCB3aXRoIFRpbWVzdGFtcCBwYXJhbWV0ZXJzLgotICoKLSAqCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogIEB2ZXJzaW9uICRJZCQKLSAqCi0gKiovCi0KLXB1YmxpYyBjbGFzcyBUaW1lc3RhbXBQYXJhbWV0ZXIgaW1wbGVtZW50cyBJUGFyYW1ldGVyCi17Ci0gICAgcHJpdmF0ZSBUaW1lc3RhbXAgX3RpbWVzdGFtcDsKLQotICAgIHB1YmxpYyBUaW1lc3RhbXBQYXJhbWV0ZXIoVGltZXN0YW1wIHRpbWVzdGFtcCkKLSAgICB7Ci0gICAgICAgIF90aW1lc3RhbXAgPSB0aW1lc3RhbXA7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0KFByZXBhcmVkU3RhdGVtZW50IHN0YXRlbWVudCwgaW50IGluZGV4KSB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiAoX3RpbWVzdGFtcCA9PSBudWxsKQotICAgICAgICAgICAgc3RhdGVtZW50LnNldE51bGwoaW5kZXgsIFR5cGVzLlRJTUVTVEFNUCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHN0YXRlbWVudC5zZXRUaW1lc3RhbXAoaW5kZXgsIF90aW1lc3RhbXApOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICAgIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoIlRpbWVzdGFtcDwiKTsKLSAgICAgICAgYnVmZmVyLmFwcGVuZChfdGltZXN0YW1wKTsKLSAgICAgICAgYnVmZmVyLmFwcGVuZCgnPicpOwotCi0gICAgICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvamRiYy9wYWNrYWdlLmh0bWwgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvamRiYy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzOTgzYWQuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL2pkYmMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLTwhLS0gJElkJCAtLT4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+VGFwZXN0cnk6IFdlYiBBcHBsaWNhdGlvbiBGcmFtZXdvcms8L3RpdGxlPgotPC9oZWFkPgotCi0KLTxib2R5PgotCi08cD5BIHNldCBvZiBjbGFzc2VzIHRoYXQgYXNzaXN0IHdpdGggZHluYW1pY2FsbHkgZ2VuZXJhdGluZyBKREJDIFNRTCBxdWVyaWVzLiAgSW1wb3J0YW50bHksCi10aGV5IGhlbHAgaGlkZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGEge0BsaW5rIGphdmEuc3FsLlN0YXRlbWVudH0gYW5kCi17QGxpbmsgamF2YS5zcWwuUHJlcGFyZWRTdGF0ZW1lbnR9IC4uLiBpbiBmYWN0LCB1c2luZyBhCi17QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLmpkYmMuU3RhdGVtZW50QXNzZW1ibHl9IHlvdSBkb24ndCBrbm93IGluIGFkdmFuY2Ugd2hpY2gKLXlvdSdsbCBnZXQsIHdoaWNoIGlzIHZlcnkgaGFuZHkgd2hlbiBnZW5lcmF0aW5nIHRydWx5IGR5bmFtaWMgU1FMLgotCi1AYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwIDxhIGhyZWY9Im1haWx0bzpobHNoaXBAYXBhY2hlLm9yZyI+aGxzaGlwQGFwYWNoZS5vcmc8L2E+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9saW5rL0FyZWFMaW5rUmVuZGVyZXIuamF2YSBiL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9saW5rL0FyZWFMaW5rUmVuZGVyZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI3ZjEyYS4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvbGluay9BcmVhTGlua1JlbmRlcmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLmxpbms7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmxpbmsuRGVmYXVsdExpbmtSZW5kZXJlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmxpbmsuSUxpbmtSZW5kZXJlcjsKLQotLyoqCi0gKiAgQSBzdWJjbGFzcyBvZiB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5saW5rLkRlZmF1bHRMaW5rUmVuZGVyZXJ9IGZvcgotICogIHRoZSBIVE1MIGFyZWEgZWxlbWVudC4KLSAqCi0gKiAgQGF1dGhvciBEYXZpZCBTb2xpcwotICogIEB2ZXJzaW9uICRJZCQKLSAqICBAc2luY2UgMy4wCi0gKiovCi1wdWJsaWMgY2xhc3MgQXJlYUxpbmtSZW5kZXJlciBleHRlbmRzIERlZmF1bHRMaW5rUmVuZGVyZXIgCi17Ci0KLQkvKioKLQkgKiAgQSBzaW5nbGV0b24gZm9yIHRoZSBhcmVhIGxpbmsuIAotCSAqKi8KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSUxpbmtSZW5kZXJlciBTSEFSRURfSU5TVEFOQ0UgPSBuZXcgQXJlYUxpbmtSZW5kZXJlcigpOwotCi0JcHVibGljIFN0cmluZyBnZXRFbGVtZW50KCkgCi0JewotCQlyZXR1cm4gImFyZWEiOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldEhhc0JvZHkoKSAKLQl7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvbGluay9Qb3B1cExpbmtSZW5kZXJlci5qYXZhIGIvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL2xpbmsvUG9wdXBMaW5rUmVuZGVyZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA3OWI2ZC4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvbGluay9Qb3B1cExpbmtSZW5kZXJlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi5saW5rOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVxdWVzdEN5Y2xlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuZW5naW5lLklMaW5rOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkubGluay5EZWZhdWx0TGlua1JlbmRlcmVyOwotCi0vKioKLSAqICBUaGlzIHJlbmRlcmVyIGVtaXRzIGphdmFzY3JpcHQgdG8gbGF1bmNoIHRoZSBsaW5rIGluIGEgd2luZG93LgotICoKLSAqICBAYXV0aG9yIERhdmlkIFNvbGlzCi0gKiAgQHZlcnNpb24gJElkJAotICogIEBzaW5jZSAzLjAuMQotICoqLwotcHVibGljIGNsYXNzIFBvcHVwTGlua1JlbmRlcmVyIGV4dGVuZHMgRGVmYXVsdExpbmtSZW5kZXJlcgotewotCi0JcHJpdmF0ZSBTdHJpbmcgX3dpbmRvd05hbWU7Ci0KLQlwcml2YXRlIFN0cmluZyBfZmVhdHVyZXM7Ci0KLQlwdWJsaWMgUG9wdXBMaW5rUmVuZGVyZXIoKQotCXsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGUgbmFtZSBhbmQgZmVhdHVyZXMgZm9yIGphdmFzY3JpcHQgd2luZG93Lm9wZW4gZnVuY3Rpb24uCi0JICoKLQkgKiBAcGFyYW0gd2luZG93TmFtZSB0aGUgd2luZG93IG5hbWUKLQkgKiBAcGFyYW0gZmVhdHVyZXMgICB0aGUgd2luZG93IGZlYXR1cmVzCi0JICovCi0JcHVibGljIFBvcHVwTGlua1JlbmRlcmVyKFN0cmluZyB3aW5kb3dOYW1lLCBTdHJpbmcgZmVhdHVyZXMpCi0JewotCQlfd2luZG93TmFtZSA9IHdpbmRvd05hbWU7Ci0JCV9mZWF0dXJlcyA9IGZlYXR1cmVzOwotCX0KLQotCS8qKgotCSAqIEBzZWUgRGVmYXVsdExpbmtSZW5kZXJlciNjb25zdHJ1Y3RVUkwob3JnLmFwYWNoZS50YXBlc3RyeS5lbmdpbmUuSUxpbmssIFN0cmluZywgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVxdWVzdEN5Y2xlKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY29uc3RydWN0VVJMKElMaW5rIGxpbmssIFN0cmluZyBhbmNob3IsIElSZXF1ZXN0Q3ljbGUgY3ljbGUpCi0JewotICAgICAgaWYgKGN5Y2xlLmlzUmV3aW5kaW5nKCkpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICB9Ci0gICAgICAKLQkJU3RyaW5nIHVybCA9IGxpbmsuZ2V0VVJMKGFuY2hvciwgdHJ1ZSk7Ci0JCXJldHVybiAiamF2YXNjcmlwdDogdyA9IHdpbmRvdy5vcGVuKCIgKyBub3JtYWxpemVTdHJpbmcodXJsKSArICIsICIgKyBub3JtYWxpemVTdHJpbmcoZ2V0V2luZG93TmFtZSgpKSArICIsICIgKyBub3JtYWxpemVTdHJpbmcoZ2V0RmVhdHVyZXMoKSkgKyAiKTsgdy5mb2N1cygpOyI7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgbm9ybWFsaXplU3RyaW5nKFN0cmluZyBzdHIpCi0JewotCQlyZXR1cm4gc3RyID09IG51bGwgPyAiJyciIDogIiciICsgc3RyICsgIiciOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0V2luZG93TmFtZSgpCi0JewotCQlyZXR1cm4gX3dpbmRvd05hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0V2luZG93TmFtZShTdHJpbmcgd2luZG93TmFtZSkKLQl7Ci0JCV93aW5kb3dOYW1lID0gd2luZG93TmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEZlYXR1cmVzKCkKLQl7Ci0JCXJldHVybiBfZmVhdHVyZXM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RmVhdHVyZXMoU3RyaW5nIGZlYXR1cmVzKQotCXsKLQkJX2ZlYXR1cmVzID0gZmVhdHVyZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3BhbGV0dGUvUGFsZXR0ZS5odG1sIGIvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3BhbGV0dGUvUGFsZXR0ZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NWU1MDk1Li4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9wYWxldHRlL1BhbGV0dGUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLTwhLS0gJElkJCAtLT4KLQotPHNwYW4gandjaWQ9IiRjb250ZW50JCI+Ci08dGFibGUgandjaWQ9IkBBbnkiIGVsZW1lbnQ9InRhYmxlIiBjbGFzcz0ib2dubDp0YWJsZUNsYXNzIj4KLSAgPHRyPgotICAJPHRoIGNsYXNzPSJhdmFpbGFibGUtaGVhZGVyIj4KLSA8c3BhbiBqd2NpZD0iQFJlbmRlckJsb2NrIiBibG9jaz0ib2dubDphdmFpbGFibGVUaXRsZUJsb2NrIi8+Ci0gPHNwYW4gandjaWQ9ImRlZmF1bHRBdmFpbGFibGVUaXRsZUJsb2NrQEJsb2NrIj48c3BhbiBrZXk9InRpdGxlLmF2YWlsYWJsZSIvPjwvc3Bhbj4KLTwvdGg+Ci0gIAk8dGQgZWxlbWVudD0idGQiIGNsYXNzPSJjb250cm9scyIgcm93c3Bhbj0iMiI+Ci0gIAkgICAgPGEgandjaWQ9IkBBbnkiIAotICAJICAgIAllbGVtZW50PSJhIiAKLSAgCSAgICAJaHJlZj0ib2dubDpzeW1ib2xzLnNlbGVjdE9uQ2xpY2tTY3JpcHQiPjxpbWcgandjaWQ9IkBJbWFnZSIKLSAgCSAgICAJCWltYWdlPSJvZ25sOnNlbGVjdEltYWdlIgotICAJICAgIAkJbmFtZT0ib2dubDpzeW1ib2xzLnNlbGVjdEltYWdlTmFtZSIKLSAgCSAgICAJCWFsdD0ibWVzc2FnZTp0b29sdGlwLnNlbGVjdCIvPjwvYT4KLQotICAgIDxhIGp3Y2lkPSJAQW55IiBlbGVtZW50PSJhIgotICAgIAlocmVmPSJvZ25sOnN5bWJvbHMuZGVzZWxlY3RPbkNsaWNrU2NyaXB0Ij48aW1nIGp3Y2lkPSJASW1hZ2UiCi0gICAgCQlpbWFnZT0ib2dubDpkZXNlbGVjdEltYWdlIgotICAgIAkJbmFtZT0ib2dubDpzeW1ib2xzLmRlc2VsZWN0SW1hZ2VOYW1lIgotICAgIAkJYWx0PSJtZXNzYWdlOnRvb2x0aXAuZGVzZWxlY3QiLz48L2E+Ci0gICAgCi0gICAgPHNwYW4gandjaWQ9IkBDb25kaXRpb25hbCIgY29uZGl0aW9uPSJvZ25sOnNvcnRVc2VyIj4KLQotICAgIDxhIGp3Y2lkPSJAQW55IiBlbGVtZW50PSJhIgotICAgIAlocmVmPSJvZ25sOnN5bWJvbHMudXBPbkNsaWNrU2NyaXB0Ij48aW1nIGp3Y2lkPSJASW1hZ2UiIAotICAgIAkJaW1hZ2U9Im9nbmw6dXBJbWFnZSIKLSAgICAJCW5hbWU9Im9nbmw6c3ltYm9scy51cEltYWdlTmFtZSIKLSAgICAJCWFsdD0ibWVzc2FnZTp0b29sdGlwLm1vdmV1cCIvPjwvYT4KLQotICAgIDxhIGp3Y2lkPSJAQW55IiBlbGVtZW50PSJhIgotICAgIAlocmVmPSJvZ25sOnN5bWJvbHMuZG93bk9uQ2xpY2tTY3JpcHQiPjxpbWcgandjaWQ9IkBJbWFnZSIKLSAgICAJCWltYWdlPSJvZ25sOmRvd25JbWFnZSIKLSAgICAJCW5hbWU9Im9nbmw6c3ltYm9scy5kb3duSW1hZ2VOYW1lIgotICAgIAkJYWx0PSJtZXNzYWdlOnRvb2x0aXAubW92ZWRvd24iLz48L2E+Ci0gICAgPC9zcGFuPgotCi0gICAgPC90ZD4KLSAgCTx0aCBjbGFzcz0ic2VsZWN0ZWQtaGVhZGVyIj4KLSA8c3BhbiBqd2NpZD0iQFJlbmRlckJsb2NrIiBibG9jaz0ib2dubDpzZWxlY3RlZFRpdGxlQmxvY2siLz4KLSA8c3BhbiBqd2NpZD0iZGVmYXVsdFNlbGVjdGVkVGl0bGVCbG9ja0BCbG9jayI+PHNwYW4ga2V5PSJ0aXRsZS5zZWxlY3RlZCIvPjwvc3Bhbj4KLSAgICA8L3RoPgotICA8L3RyPgotICA8dHI+Ci0gICAgPHRkIGNsYXNzPSJhdmFpbGFibGUtY2VsbCI+PHNlbGVjdCBqd2NpZD0iQERlbGVnYXRvciIgZGVsZWdhdGU9Im9nbmw6YXZhaWxhYmxlQ29sdW1uIi8+PC90ZD4KLSAgICA8dGQgY2xhc3M9InNlbGVjdGVkLWNlbGwiPjxzZWxlY3QgandjaWQ9IkBEZWxlZ2F0b3IiIGRlbGVnYXRlPSJvZ25sOnNlbGVjdGVkQ29sdW1uIi8+PC90ZD4KLSAgPC90cj4KLTwvdGFibGU+Ci08L3NwYW4+CmRpZmYgLS1naXQgYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvcGFsZXR0ZS9QYWxldHRlLmphdmEgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvcGFsZXR0ZS9QYWxldHRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzMGMzMTIuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3BhbGV0dGUvUGFsZXR0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTgzICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIucGFsZXR0ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5BcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5CYXNlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUFzc2V0OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUVuZ2luZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklGb3JtOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSU1hcmt1cFdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZXF1ZXN0Q3ljbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVzb3VyY2VMb2NhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklTY3JpcHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5UYXBlc3RyeTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbXBvbmVudHMuQmxvY2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5lbmdpbmUuSVNjcmlwdFNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmZvcm0uRm9ybTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmZvcm0uRm9ybUV2ZW50VHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmZvcm0uSUZvcm1Db21wb25lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5mb3JtLklQcm9wZXJ0eVNlbGVjdGlvbk1vZGVsOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuaHRtbC5Cb2R5OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkucmVxdWVzdC5SZXF1ZXN0Q29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnZhbGlkLklWYWxpZGF0aW9uRGVsZWdhdGU7Ci0KLS8qKgotICogIEEgY29tcG9uZW50IHVzZWQgdG8gbWFrZSBhIG51bWJlciBvZiBzZWxlY3Rpb25zIGZyb20gYSBsaXN0LiAgVGhlIGdlbmVyYWwgbG9vawotICogIGlzIGEgcGFpciBvZiAmbHQ7c2VsZWN0Jmd0OyBlbGVtZW50cy4gIHdpdGggYSBwYWlyIG9mIGJ1dHRvbnMgYmV0d2VlbiB0aGVtLgotICogIFRoZSByaWdodCBlbGVtZW50IGlzIGEgbGlzdCBvZiB2YWx1ZXMgdGhhdCBjYW4gYmUgc2VsZWN0ZWQuICBUaGUgYnV0dG9ucyBtb3ZlCi0gKiAgdmFsdWVzIGZyb20gdGhlIHJpZ2h0IGNvbHVtbiAoImF2YWlsYWJsZSIpIHRvIHRoZSBsZWZ0IGNvbHVtbiAoInNlbGVjdGVkIikuCi0gKgotICogIDxwPlRoaXMgYWxsIHRha2VzIGEgYml0IG9mIEphdmFTY3JpcHQgdG8gYWNjb21wbGlzaCAocXVpdGUgYSBiaXQpLCB3aGljaCBtZWFucwotICogIGEge0BsaW5rIEJvZHl9IGNvbXBvbmVudCBtdXN0IHdyYXAgdGhlIFBhbGV0dGUuIElmIEphdmFTY3JpcHQgaXMgbm90IGVuYWJsZWQKLSAqICBpbiB0aGUgY2xpZW50IGJyb3dzZXIsIHRoZW4gdGhlIHVzZXIgd2lsbCBiZSB1bmFibGUgdG8gbWFrZSAob3IgY2hhbmdlKSBhbnkgc2VsZWN0aW9ucy4KLSAqCi0gKiAgPHA+Q3Jvc3MtYnJvd3NlciBjb21wYXRpYmlsaXR5IGlzIG5vdCBwZXJmZWN0LiAgSW4gc29tZSBjYXNlcywgdGhlIAotICogIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIuZm9ybS5NdWx0aXBsZVByb3BlcnR5U2VsZWN0aW9ufSBjb21wb25lbnQKLSAqICBtYXkgYmUgYSBiZXR0ZXIgY2hvaWNlLgotICogCi0gKiAgPHA+PHRhYmxlIGJvcmRlcj0xPgotICogPHRyPgotICogICAgPHRkPlBhcmFtZXRlcjwvdGQ+Ci0gKiAgICA8dGQ+VHlwZTwvdGQ+Ci0gKiAgICA8dGQ+RGlyZWN0aW9uIDwvdGQ+Ci0gKiAgICA8dGQ+UmVxdWlyZWQ8L3RkPgotICogICAgPHRkPkRlZmF1bHQ8L3RkPgotICogICAgPHRkPkRlc2NyaXB0aW9uPC90ZD4KLSAqIDwvdHI+Ci0gKgotICogIDx0cj4KLSAqICAgIDx0ZD5zZWxlY3RlZDwvdGQ+Ci0gKiAgPHRkPntAbGluayBMaXN0fTwvdGQ+Ci0gKiAgPHRkPmluPC90ZD4KLSAqICA8dGQ+eWVzPC90ZD4KLSAqICA8dGQ+Jm5ic3A7PC90ZD4KLSAqICA8dGQ+QSBMaXN0IG9mIHNlbGVjdGVkIHZhbHVlcy4gIFBvc3NpYmxlIHNlbGVjdGlvbnMgYXJlIGRlZmluZWQgYnkgdGhlIG1vZGVsOyB0aGlzCi0gKiAgc2hvdWxkIGJlIGEgc3Vic2V0IG9mIHRoZSBwb3NzaWJsZSB2YWx1ZXMuICBUaGlzIG1heSBiZSBudWxsIHdoZW4gdGhlCi0gKiAgY29tcG9uZW50IGlzIHJlbmRlcnJlZC4gIFdoZW4gdGhlIGNvbnRhaW5pbmcgZm9ybSBpcyBzdWJtaXR0ZWQsCi0gKiAgdGhpcyBwYXJhbWV0ZXIgaXMgdXBkYXRlZCB3aXRoIGEgbmV3IExpc3Qgb2Ygc2VsZWN0ZWQgb2JqZWN0cy4KLSAqCi0gKiAgPHA+VGhlIG9yZGVyIG1heSBiZSBzZXQgYnkgdGhlIHVzZXIsIGFzIHdlbGwsIGRlcGVuZGluZyBvbiB0aGUKLSAqICBzb3J0TW9kZSBwYXJhbWV0ZXIuPC90ZD4gPC90cj4KLSAqCi0gKiA8dHI+Ci0gKiA8dGQ+bW9kZWw8L3RkPgotICogIDx0ZD57QGxpbmsgSVByb3BlcnR5U2VsZWN0aW9uTW9kZWx9PC90ZD4KLSAqICA8dGQ+aW48L3RkPgotICogIDx0ZD55ZXM8L3RkPgotICogIDx0ZD4mbmJzcDs8L3RkPgotICogIDx0ZD5Xb3JrcywgYXMgd2l0aCBhIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LmZvcm0uUHJvcGVydHlTZWxlY3Rpb259IGNvbXBvbmVudCwgdG8gZGVmaW5lIHRoZQotICogIHBvc3NpYmxlIHZhbHVlcy4KLSAqICA8L3RkPiA8L3RyPgotICoKLSAqICA8dHI+Ci0gKiAgPHRkPnNvcnQ8L3RkPiAKLSAqICA8dGQ+e0BsaW5rIFNvcnRNb2RlfTwvdGQ+IAotICogIDx0ZD5pbjwvdGQ+Ci0gKiAgPHRkPm5vPC90ZD4gCi0gKiAgPHRkPntAbGluayBTb3J0TW9kZSNOT05FfTwvdGQ+Ci0gKiAgPHRkPgotICogIENvbnRyb2xzIGF1dG9tYXRpYyBzb3J0aW5nIG9mIHRoZSBvcHRpb25zLiA8L3RkPgotICogIDwvdHI+Ci0gKgotICogPHRyPgotICogIDx0ZD5yb3dzPC90ZD4KLSAqICA8dGQ+aW50PC90ZD4gCi0gKiAgPHRkPmluPC90ZD4gCi0gKiAgPHRkPm5vPC90ZD4gCi0gKiAgPHRkPjEwPC90ZD4KLSAqICA8dGQ+VGhlIG51bWJlciBvZiByb3dzIHRoYXQgc2hvdWxkIGJlIHZpc2libGUgaW4gdGhlIFBhbGxldGUncyAmbHQ7c2VsZWN0Jmd0OwotICogIGVsZW1lbnRzLgotICogIDwvdGQ+IDwvdHI+Ci0gKgotICogPHRyPgotICogIDx0ZD50YWJsZUNsYXNzPC90ZD4KLSAqICA8dGQ+e0BsaW5rIFN0cmluZ308L3RkPiAKLSAqICA8dGQ+aW48L3RkPgotICogIDx0ZD5ubzwvdGQ+IAotICogIDx0ZD50YXBlc3RyeS1wYWxldHRlPC90ZD4KLSAqICA8dGQ+VGhlIENTUyBjbGFzcyBmb3IgdGhlIHRhYmxlIHdoaWNoIHN1cnJvdW5kcyB0aGUgb3RoZXIgZWxlbWVudHMgb2YKLSAqICB0aGUgUGFsZXR0ZS48L3RkPiA8L3RyPgotICoKLSAqIDx0cj4KLSAqICA8dGQ+c2VsZWN0ZWRUaXRsZUJsb2NrPC90ZD4KLSAqICA8dGQ+e0BsaW5rIEJsb2NrfTwvdGQ+Ci0gKiAgPHRkPmluPC90ZD4gCi0gKiAgPHRkPm5vPC90ZD4gCi0gKiAgPHRkPiJTZWxlY3RlZCI8L3RkPgotICogIDx0ZD5JZiBzcGVjaWZpZWQsIGFsbG93cyBhIHtAbGluayBCbG9ja30gdG8gYmUgcGxhY2VkIHdpdGhpbgotICogIHRoZSAmbHQ7dGgmZ3Q7IHJlc2VydmVkIGZvciB0aGUgdGl0bGUgYWJvdmUgdGhlIHNlbGVjdGVkIGl0ZW1zCi0gKiAgJmx0O3NlbGVjdCZndDsgKG9uIHRoZSByaWdodCkuICBUaGlzIGFsbG93cyBmb3IgaW1hZ2VzIG9yIG90aGVyIGNvbXBvbmVudHMgdG8KLSAqICBiZSBwbGFjZWQgdGhlcmUuICBCeSBkZWZhdWx0LCB0aGUgc2ltcGxlIHdvcmQgPGNvZGU+U2VsZWN0ZWQ8L2NvZGU+Ci0gKiAgaXMgdXNlZC48L3RkPiA8L3RyPgotICoKLSAqIDx0cj4KLSAqICA8dGQ+YXZhaWxhYmxlVGl0bGVCbG9jazwvdGQ+Ci0gKiAgPHRkPntAbGluayBCbG9ja308L3RkPgotICogIDx0ZD5pbjwvdGQ+IAotICogIDx0ZD5ubzwvdGQ+IAotICogIDx0ZD4iQXZhaWxhYmxlIjwvdGQ+Ci0gKiAgPHRkPkFzIHdpdGggc2VsZWN0ZWRUaXRsZUJsb2NrLCBidXQgZm9yIHRoZSBsZWZ0IGNvbHVtbiwgb2YgaXRlbXMKLSAqICB3aGljaCBhcmUgYXZhaWxhYmxlIHRvIGJlIHNlbGVjdGVkLiAgVGhlIGRlZmF1bHQgaXMgdGhlIHdvcmQKLSAqICA8Y29kZT5BdmFpbGFibGU8L2NvZGU+LiA8L3RkPiA8L3RyPgotICoKLSAqICA8dHI+Ci0gKiAgPHRkPnNlbGVjdEltYWdlCi0gKiA8YnI+c2VsZWN0RGlzYWJsZWRJbWFnZQotICogPGJyPmRlc2VsZWN0SW1hZ2UKLSAqIDxicj5kZXNlbGVjdERpc2FibGVkSW1hZ2UKLSAqIDxicj51cEltYWdlCi0gKiA8YnI+dXBEaXNhYmxlZEltYWdlCi0gKiA8YnI+ZG93bkltYWdlCi0gKiA8YnI+ZG93bkRpc2FibGVkSW1hZ2UKLSAqICA8L3RkPgotICogIDx0ZD57QGxpbmsgSUFzc2V0fTwvdGQ+Ci0gKiAgPHRkPmluPC90ZD4KLSAqICA8dGQ+bm88L3RkPiA8dGQ+Jm5ic3A7PC90ZD4KLSAqICA8dGQ+SWYgYW55IG9mIHRoZXNlIGFyZSBzcGVjaWZpZWQgdGhlbiB0aGV5IG92ZXJyaWRlIHRoZSBkZWZhdWx0IGltYWdlcyBwcm92aWRlZAotICogIHdpdGggdGhlIGNvbXBvbmVudC4gIFRoaXMgYWxsb3dzIHRoZSBsb29rIGFuZCBmZWVsIHRvIGJlIGN1c3RvbWl6ZWQgcmVsYXRpdmVseSBlYXNpbHkuCi0gKgotICogIDxwPlRoZSBtb3N0IGNvbW1vbiByZWFzb24gdG8gcmVwbGFjZSB0aGUgaW1hZ2VzIGlzIHRvIGRlYWwgd2l0aCBiYWNrZ3JvdW5kcy4gIFRoZSBkZWZhdWx0Ci0gKiAgaW1hZ2VzIGFyZSBhbnRpLWFsaWFzZWQgYWdhaW5zdCBhIHdoaXRlIGJhY2tncm91bmQuICBJZiBhIGNvbG9yZWQgb3IgcGF0dGVybmVkIGJhY2tncm91bmQKLSAqICBpcyB1c2VkLCB0aGUgZGVmYXVsdCBpbWFnZXMgd2lsbCBoYXZlIGFuIHVnbHkgd2hpdGUgZnJpbmdlLiAgVW50aWwgYWxsIGJyb3dzZXJzIGhhdmUgZnVsbAotICogIHN1cHBvcnQgZm9yIFBORyAod2hpY2ggaGFzIGEgdHJ1ZSBhbHBoYSBjaGFubmVsKSwgaXQgaXMgbmVjZXNzYXJ5IHRvIGN1c3RvbWl6ZSB0aGUgaW1hZ2VzCi0gKiAgdG8gbWF0Y2ggdGhlIGJhY2tncm91bmQuCi0gKgotICogICAgICA8L3RkPiA8L3RyPgotICoKLSAqIDwvdGFibGU+Ci0gKgotICogPHA+QSBQYWxldHRlIHJlcXVpcmVzIHNvbWUgQ1NTIGVudHJpZXMgdG8gcmVuZGVyIGNvcnJlY3RseSAuLi4gZXNwZWNpYWxseQotICogdGhlIG1pZGRsZSBjb2x1bW4sIHdoaWNoIGNvbnRhaW5zIHRoZSB0d28gb3IgZm91ciBidXR0b25zIGZvciBtb3Zpbmcgc2VsZWN0aW9ucwotICogYmV0d2VlbiB0aGUgdHdvIGNvbHVtbnMuICBUaGUgd2lkdGggYW5kIGFsaWdubWVudCBvZiB0aGlzIGNvbHVtbiBtdXN0IGJlIHNldAotICogdXNpbmcgQ1NTLiAgQWRkaXRpb25hbGx5LCBDU1MgaXMgY29tbW9ubHkgdXNlZCB0byBnaXZlIHRoZSBQYWxldHRlIGNvbHVtbnMKLSAqIGEgZml4ZWQgd2lkdGgsIGFuZCB0byBkcmVzcyB1cCB0aGUgdGl0bGVzLiAgSGVyZSBpcyBhbiBleGFtcGxlIG9mIHNvbWUgQ1NTCi0gKiB5b3UgY2FuIHVzZSB0byBmb3JtYXQgdGhlIHBhbGV0dGUgY29tcG9uZW50OgotICogCi0gKiA8cHJlPgotICogVEFCTEUudGFwZXN0cnktcGFsZXR0ZSBUSAotICogewotICogICBmb250LXNpemU6IDlwdDsKLSAqICAgZm9udC13ZWlnaHQ6IGJvbGQ7Ci0gKiAgIGNvbG9yOiB3aGl0ZTsKLSAqICAgYmFja2dyb3VuZC1jb2xvcjogIzMzMDA2NjsKLSAqICAgdGV4dC1hbGlnbjogY2VudGVyOwotICogfQotICoKLSAqIFRELmF2YWlsYWJsZS1jZWxsIFNFTEVDVAotICogewotICogICBmb250LXdlaWdodDogbm9ybWFsOwotICogICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGOwotICogICB3aWR0aDogMjAwcHg7Ci0gKiB9Ci0gKiAKLSAqIFRELnNlbGVjdGVkLWNlbGwgU0VMRUNUCi0gKiB7Ci0gKiAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7Ci0gKiAgIGJhY2tncm91bmQtY29sb3I6ICNGRkZGRkY7Ci0gKiAgIHdpZHRoOiAyMDBweDsKLSAqIH0KLSAqIAotICogVEFCTEUudGFwZXN0cnktcGFsZXR0ZSBURC5jb250cm9scwotICogewotICogICB0ZXh0LWFsaWduOiBjZW50ZXI7Ci0gKiAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Ci0gKiAgIHdpZHRoOiA2MHB4OwotICogfQotICogIDwvcHJlPgotICoKLSAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKi8KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFBhbGV0dGUgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IGltcGxlbWVudHMgSUZvcm1Db21wb25lbnQKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9ST1dTID0gMTA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BUF9TSVpFID0gNzsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9UQUJMRV9DTEFTUyA9ICJ0YXBlc3RyeS1wYWxldHRlIjsKLQotICAgIC8qKgotICAgICAqICBBIHNldCBvZiBzeW1ib2xzIHByb2R1Y2VkIGJ5IHRoZSBQYWxldHRlIHNjcmlwdC4gIFRoaXMgaXMgdXNlZCB0bwotICAgICAqICBwcm92aWRlIHByb3BlciBuYW1lcyBmb3Igc29tZSBvZiB0aGUgSFRNTCBlbGVtZW50cyAoJmx0O3NlbGVjdCZndDsgYW5kCi0gICAgICogICZsdDtidXR0b24mZ3Q7IGVsZW1lbnRzLCBldGMuKS4KLSAgICAgKgotICAgICAqLwotCi0gICAgcHJpdmF0ZSBNYXAgX3N5bWJvbHM7Ci0KLSAgICAvKioKLSAgICAgKiAgQSBjYWNoZWQgY29weSBvZiB0aGUgc2NyaXB0IHVzZWQgd2l0aCB0aGUgY29tcG9uZW50LgotICAgICAqCi0gICAgICovCi0KLSAgICBwcml2YXRlIElTY3JpcHQgX3NjcmlwdDsKLQotICAgIC8qKiBAc2luY2UgMy4wICoqLwotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEF2YWlsYWJsZUNvbHVtbihQYWxldHRlQ29sdW1uIGNvbHVtbik7Ci0KLSAgICAvKiogQHNpbmNlIDMuMCAqKi8KLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRTZWxlY3RlZENvbHVtbihQYWxldHRlQ29sdW1uIGNvbHVtbik7Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBmaW5pc2hMb2FkKCkKLSAgICB7Ci0gICAgICAgIHNldFNlbGVjdGVkVGl0bGVCbG9jaygoQmxvY2spIGdldENvbXBvbmVudCgiZGVmYXVsdFNlbGVjdGVkVGl0bGVCbG9jayIpKTsKLSAgICAgICAgc2V0QXZhaWxhYmxlVGl0bGVCbG9jaygoQmxvY2spIGdldENvbXBvbmVudCgiZGVmYXVsdEF2YWlsYWJsZVRpdGxlQmxvY2siKSk7Ci0KLSAgICAgICAgc2V0U2VsZWN0SW1hZ2UoZ2V0QXNzZXQoIlNlbGVjdCIpKTsKLSAgICAgICAgc2V0U2VsZWN0RGlzYWJsZWRJbWFnZShnZXRBc3NldCgiU2VsZWN0RGlzYWJsZWQiKSk7Ci0gICAgICAgIHNldERlc2VsZWN0SW1hZ2UoZ2V0QXNzZXQoIkRlc2VsZWN0IikpOwotICAgICAgICBzZXREZXNlbGVjdERpc2FibGVkSW1hZ2UoZ2V0QXNzZXQoIkRlc2VsZWN0RGlzYWJsZWQiKSk7Ci0gICAgICAgIHNldFVwSW1hZ2UoZ2V0QXNzZXQoIlVwIikpOwotICAgICAgICBzZXRVcERpc2FibGVkSW1hZ2UoZ2V0QXNzZXQoIlVwRGlzYWJsZWQiKSk7Ci0gICAgICAgIHNldERvd25JbWFnZShnZXRBc3NldCgiRG93biIpKTsKLSAgICAgICAgc2V0RG93bkRpc2FibGVkSW1hZ2UoZ2V0QXNzZXQoIkRvd25EaXNhYmxlZCIpKTsKLQotICAgICAgICBzZXRUYWJsZUNsYXNzKERFRkFVTFRfVEFCTEVfQ0xBU1MpOwotICAgICAgICBzZXRSb3dzKERFRkFVTFRfUk9XUyk7Ci0gICAgICAgIHNldFNvcnQoU29ydE1vZGUuTk9ORSk7Ci0gICAgfQotCi0gICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXROYW1lKCk7Ci0gICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSk7Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgSUZvcm0gZ2V0Rm9ybSgpOwotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEZvcm0oSUZvcm0gZm9ybSk7Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCByZW5kZXJDb21wb25lbnQoSU1hcmt1cFdyaXRlciB3cml0ZXIsIElSZXF1ZXN0Q3ljbGUgY3ljbGUpCi0gICAgewotICAgICAgICBJRm9ybSBmb3JtID0gRm9ybS5nZXQoZ2V0UGFnZSgpLmdldFJlcXVlc3RDeWNsZSgpKTsKLQotICAgICAgICBpZiAoZm9ybSA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAiUGFsZXR0ZSBjb21wb25lbnQgbXVzdCBiZSB3cmFwcGVkIGJ5IGEgRm9ybS4iLAotICAgICAgICAgICAgICAgIHRoaXMsCi0gICAgICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgICAgICBudWxsKTsKLQotICAgICAgICBzZXRGb3JtKGZvcm0pOwotCi0gICAgICAgIElWYWxpZGF0aW9uRGVsZWdhdGUgZGVsZWdhdGUgPSBmb3JtLmdldERlbGVnYXRlKCk7Ci0KLSAgICAgICAgaWYgKGRlbGVnYXRlICE9IG51bGwpCi0gICAgICAgICAgICBkZWxlZ2F0ZS5zZXRGb3JtQ29tcG9uZW50KHRoaXMpOwotCi0gICAgICAgIHNldE5hbWUoZm9ybS5nZXRFbGVtZW50SWQodGhpcykpOwotCi0gICAgICAgIGlmIChmb3JtLmlzUmV3aW5kaW5nKCkpCi0gICAgICAgICAgICBoYW5kbGVTdWJtaXNzaW9uKGN5Y2xlKTsKLQotICAgICAgICAvLyBEb24ndCBkbyBhbnkgYWRkaXRpb25hbCB3b3JrIGlmIHJld2luZGluZwotICAgICAgICAvLyAoc29tZSBvdGhlciBhY3Rpb24gb3IgZm9ybSBvbiB0aGUgcGFnZSkuCi0KLSAgICAgICAgaWYgKCFjeWNsZS5pc1Jld2luZGluZygpKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBMb3RzIG9mIHdvcmsgdG8gcHJvZHVjZSBKYXZhU2NyaXB0IGFuZCBIVE1MIGZvciB0aGlzIHN1Y2tlci4KLQotICAgICAgICAgICAgX3N5bWJvbHMgPSBuZXcgSGFzaE1hcChNQVBfU0laRSk7Ci0KLSAgICAgICAgICAgIHJ1blNjcmlwdChjeWNsZSk7Ci0KLSAgICAgICAgICAgIC8vIE91dHB1dCBzeW1ib2wgJ2Zvcm1TdWJtaXRGdW5jdGlvbk5hbWUnIGlzIHRoZSBuYW1lCi0gICAgICAgICAgICAvLyBvZiBhIEphdmFTY3JpcHQgZnVuY3Rpb24gdG8gZXhlY3V0ZSB3aGVuIHRoZSBmb3JtCi0gICAgICAgICAgICAvLyBpcyBzdWJtaXR0ZWQuICBUaGlzIGlzIGFsc28ga2V5IHRvIHRoZSBvcGVyYXRpb24KLSAgICAgICAgICAgIC8vIG9mIHRoZSBQcm9wZXJ0eVNlbGVjdGlvbi4KLQotICAgICAgICAgICAgZm9ybS5hZGRFdmVudEhhbmRsZXIoCi0gICAgICAgICAgICAgICAgRm9ybUV2ZW50VHlwZS5TVUJNSVQsCi0gICAgICAgICAgICAgICAgKFN0cmluZykgX3N5bWJvbHMuZ2V0KCJmb3JtU3VibWl0RnVuY3Rpb25OYW1lIikpOwotCi0gICAgICAgICAgICBjb25zdHJ1Y3RDb2x1bW5zKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBzdXBlci5yZW5kZXJDb21wb25lbnQod3JpdGVyLCBjeWNsZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgY2xlYW51cEFmdGVyUmVuZGVyKElSZXF1ZXN0Q3ljbGUgY3ljbGUpCi0gICAgewotICAgICAgICBfc3ltYm9scyA9IG51bGw7Ci0KLSAgICAgICAgc2V0QXZhaWxhYmxlQ29sdW1uKG51bGwpOwotICAgICAgICBzZXRTZWxlY3RlZENvbHVtbihudWxsKTsKLQotICAgICAgICBzdXBlci5jbGVhbnVwQWZ0ZXJSZW5kZXIoY3ljbGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBFeGVjdXRlcyB0aGUgYXNzb2NpYXRlZCBzY3JpcHQsIHdoaWNoIGdlbmVyYXRlcyBhbGwgdGhlIEphdmFTY3JpcHQgdG8KLSAgICAgKiAgc3VwcG9ydCB0aGlzIFBhbGV0dGUuCi0gICAgICoKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcnVuU2NyaXB0KElSZXF1ZXN0Q3ljbGUgY3ljbGUpCi0gICAgewotICAgICAgICAvLyBHZXQgdGhlIHNjcmlwdCwgaWYgbm90IGFscmVhZHkgZ290dGVuLiAgU2NyaXB0cyBhcmUgcmUtZW50cmFudCwgc28gaXQgaXMKLSAgICAgICAgLy8gc2FmZSB0byBzaGFyZSB0aGlzIGJldHdlZW4gaW5zdGFuY2VzIG9mIFBhbGV0dGUuCi0KLSAgICAgICAgaWYgKF9zY3JpcHQgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgSUVuZ2luZSBlbmdpbmUgPSBnZXRQYWdlKCkuZ2V0RW5naW5lKCk7Ci0gICAgICAgICAgICBJU2NyaXB0U291cmNlIHNvdXJjZSA9IGVuZ2luZS5nZXRTY3JpcHRTb3VyY2UoKTsKLQotICAgICAgICAgICAgSVJlc291cmNlTG9jYXRpb24gc2NyaXB0TG9jYXRpb24gPQotICAgICAgICAgICAgICAgIGdldFNwZWNpZmljYXRpb24oKS5nZXRTcGVjaWZpY2F0aW9uTG9jYXRpb24oKS5nZXRSZWxhdGl2ZUxvY2F0aW9uKCJQYWxldHRlLnNjcmlwdCIpOwotCi0gICAgICAgICAgICBfc2NyaXB0ID0gc291cmNlLmdldFNjcmlwdChzY3JpcHRMb2NhdGlvbik7Ci0gICAgICAgIH0KLQotICAgICAgICBCb2R5IGJvZHkgPSBCb2R5LmdldChjeWNsZSk7Ci0gICAgICAgIGlmIChib2R5ID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICJQYWxldHRlIGNvbXBvbmVudCBtdXN0IGJlIHdyYXBwZWQgYnkgYSBCb2R5LiIsCi0gICAgICAgICAgICAgICAgdGhpcywKLSAgICAgICAgICAgICAgICBudWxsLAotICAgICAgICAgICAgICAgIG51bGwpOwotCi0gICAgICAgIHNldEltYWdlKGJvZHksIGN5Y2xlLCAic2VsZWN0SW1hZ2UiLCBnZXRTZWxlY3RJbWFnZSgpKTsKLSAgICAgICAgc2V0SW1hZ2UoYm9keSwgY3ljbGUsICJzZWxlY3REaXNhYmxlZEltYWdlIiwgZ2V0U2VsZWN0RGlzYWJsZWRJbWFnZSgpKTsKLSAgICAgICAgc2V0SW1hZ2UoYm9keSwgY3ljbGUsICJkZXNlbGVjdEltYWdlIiwgZ2V0RGVzZWxlY3RJbWFnZSgpKTsKLSAgICAgICAgc2V0SW1hZ2UoYm9keSwgY3ljbGUsICJkZXNlbGVjdERpc2FibGVkSW1hZ2UiLCBnZXREZXNlbGVjdERpc2FibGVkSW1hZ2UoKSk7Ci0KLSAgICAgICAgaWYgKGlzU29ydFVzZXIoKSkKLSAgICAgICAgewotICAgICAgICAgICAgc2V0SW1hZ2UoYm9keSwgY3ljbGUsICJ1cEltYWdlIiwgZ2V0VXBJbWFnZSgpKTsKLSAgICAgICAgICAgIHNldEltYWdlKGJvZHksIGN5Y2xlLCAidXBEaXNhYmxlZEltYWdlIiwgZ2V0VXBEaXNhYmxlZEltYWdlKCkpOwotICAgICAgICAgICAgc2V0SW1hZ2UoYm9keSwgY3ljbGUsICJkb3duSW1hZ2UiLCBnZXREb3duSW1hZ2UoKSk7Ci0gICAgICAgICAgICBzZXRJbWFnZShib2R5LCBjeWNsZSwgImRvd25EaXNhYmxlZEltYWdlIiwgZ2V0RG93bkRpc2FibGVkSW1hZ2UoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBfc3ltYm9scy5wdXQoInBhbGV0dGUiLCB0aGlzKTsKLQotICAgICAgICBfc2NyaXB0LmV4ZWN1dGUoY3ljbGUsIGJvZHksIF9zeW1ib2xzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgRXh0cmFjdHMgaXRzIGFzc2V0IFVSTCwgc2V0cyBpdCB1cCBmb3IKLSAgICAgKiAgcHJlbG9hZGluZywgYW5kIGFzc2lnbnMgdGhlIHByZWxvYWQgcmVmZXJlbmNlIGFzIGEgc2NyaXB0IHN5bWJvbC4KLSAgICAgKgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZXRJbWFnZShCb2R5IGJvZHksIElSZXF1ZXN0Q3ljbGUgY3ljbGUsIFN0cmluZyBzeW1ib2xOYW1lLCBJQXNzZXQgYXNzZXQpCi0gICAgewotICAgICAgICBTdHJpbmcgVVJMID0gYXNzZXQuYnVpbGRVUkwoY3ljbGUpOwotICAgICAgICBTdHJpbmcgcmVmZXJlbmNlID0gYm9keS5nZXRQcmVsb2FkZWRJbWFnZVJlZmVyZW5jZShVUkwpOwotCi0gICAgICAgIF9zeW1ib2xzLnB1dChzeW1ib2xOYW1lLCByZWZlcmVuY2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBNYXAgZ2V0U3ltYm9scygpCi0gICAgewotICAgICAgICByZXR1cm4gX3N5bWJvbHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIENvbnN0cnVjdHMgYSBwYWlyIG9mIHtAbGluayBQYWxldHRlQ29sdW1ufXM6IHRoZSBhdmFpbGFibGUgYW5kIHNlbGVjdGVkIG9wdGlvbnMuCi0gICAgICoKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY29uc3RydWN0Q29sdW1ucygpCi0gICAgewotICAgICAgICAvLyBCdWlsZCBhIFNldCBhcm91bmQgdGhlIGxpc3Qgb2Ygc2VsZWN0ZWQgaXRlbXMuCi0KLSAgICAgICAgTGlzdCBzZWxlY3RlZCA9IGdldFNlbGVjdGVkKCk7Ci0KLSAgICAgICAgaWYgKHNlbGVjdGVkID09IG51bGwpCi0gICAgICAgICAgICBzZWxlY3RlZCA9IENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0KLSAgICAgICAgU29ydE1vZGUgc29ydE1vZGUgPSBnZXRTb3J0KCk7Ci0KLSAgICAgICAgYm9vbGVhbiBzb3J0VXNlciA9IHNvcnRNb2RlID09IFNvcnRNb2RlLlVTRVI7Ci0KLSAgICAgICAgTGlzdCBzZWxlY3RlZE9wdGlvbnMgPSBudWxsOwotCi0gICAgICAgIGlmIChzb3J0VXNlcikKLSAgICAgICAgewotICAgICAgICAgICAgaW50IGNvdW50ID0gc2VsZWN0ZWQuc2l6ZSgpOwotICAgICAgICAgICAgc2VsZWN0ZWRPcHRpb25zID0gbmV3IEFycmF5TGlzdChjb3VudCk7Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLSAgICAgICAgICAgICAgICBzZWxlY3RlZE9wdGlvbnMuYWRkKG51bGwpOwotICAgICAgICB9Ci0KLSAgICAgICAgUGFsZXR0ZUNvbHVtbiBhdmFpbGFibGVDb2x1bW4gPQotICAgICAgICAgICAgbmV3IFBhbGV0dGVDb2x1bW4oKFN0cmluZykgX3N5bWJvbHMuZ2V0KCJhdmFpbGFibGVOYW1lIiksIGdldFJvd3MoKSk7Ci0gICAgICAgIFBhbGV0dGVDb2x1bW4gc2VsZWN0ZWRDb2x1bW4gPSBuZXcgUGFsZXR0ZUNvbHVtbihnZXROYW1lKCksIGdldFJvd3MoKSk7Ci0KLSAgICAgICAgLy8gRWFjaCB2YWx1ZSBzcGVjaWZpZWQgaW4gdGhlIG1vZGVsIHdpbGwgZ28gaW50byBlaXRoZXIgdGhlIHNlbGVjdGVkIG9yIGF2YWlsYWJsZQotICAgICAgICAvLyBsaXN0cy4KLQotICAgICAgICBJUHJvcGVydHlTZWxlY3Rpb25Nb2RlbCBtb2RlbCA9IGdldE1vZGVsKCk7Ci0KLSAgICAgICAgaW50IGNvdW50ID0gbW9kZWwuZ2V0T3B0aW9uQ291bnQoKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIE9iamVjdCBvcHRpb25WYWx1ZSA9IG1vZGVsLmdldE9wdGlvbihpKTsKLQotICAgICAgICAgICAgUGFsZXR0ZU9wdGlvbiBvID0gbmV3IFBhbGV0dGVPcHRpb24obW9kZWwuZ2V0VmFsdWUoaSksIG1vZGVsLmdldExhYmVsKGkpKTsKLQotICAgICAgICAgICAgaW50IGluZGV4ID0gc2VsZWN0ZWQuaW5kZXhPZihvcHRpb25WYWx1ZSk7Ci0gICAgICAgICAgICBib29sZWFuIGlzU2VsZWN0ZWQgPSBpbmRleCA+PSAwOwotCi0gICAgICAgICAgICBpZiAoc29ydFVzZXIgJiYgaXNTZWxlY3RlZCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzZWxlY3RlZE9wdGlvbnMuc2V0KGluZGV4LCBvKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgUGFsZXR0ZUNvbHVtbiBjID0gaXNTZWxlY3RlZCA/IHNlbGVjdGVkQ29sdW1uIDogYXZhaWxhYmxlQ29sdW1uOwotCi0gICAgICAgICAgICBjLmFkZE9wdGlvbihvKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzb3J0VXNlcikKLSAgICAgICAgewotICAgICAgICAgICAgSXRlcmF0b3IgaSA9IHNlbGVjdGVkT3B0aW9ucy5pdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFBhbGV0dGVPcHRpb24gbyA9IChQYWxldHRlT3B0aW9uKSBpLm5leHQoKTsKLSAgICAgICAgICAgICAgICBzZWxlY3RlZENvbHVtbi5hZGRPcHRpb24obyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc29ydE1vZGUgPT0gU29ydE1vZGUuVkFMVUUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGF2YWlsYWJsZUNvbHVtbi5zb3J0QnlWYWx1ZSgpOwotICAgICAgICAgICAgc2VsZWN0ZWRDb2x1bW4uc29ydEJ5VmFsdWUoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICBpZiAoc29ydE1vZGUgPT0gU29ydE1vZGUuTEFCRUwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXZhaWxhYmxlQ29sdW1uLnNvcnRCeUxhYmVsKCk7Ci0gICAgICAgICAgICAgICAgc2VsZWN0ZWRDb2x1bW4uc29ydEJ5TGFiZWwoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICBzZXRBdmFpbGFibGVDb2x1bW4oYXZhaWxhYmxlQ29sdW1uKTsKLSAgICAgICAgc2V0U2VsZWN0ZWRDb2x1bW4oc2VsZWN0ZWRDb2x1bW4pOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVTdWJtaXNzaW9uKElSZXF1ZXN0Q3ljbGUgY3ljbGUpCi0gICAgewotICAgICAgICBSZXF1ZXN0Q29udGV4dCBjb250ZXh0ID0gY3ljbGUuZ2V0UmVxdWVzdENvbnRleHQoKTsKLSAgICAgICAgU3RyaW5nW10gdmFsdWVzID0gY29udGV4dC5nZXRQYXJhbWV0ZXJzKGdldE5hbWUoKSk7Ci0KLSAgICAgICAgaW50IGNvdW50ID0gVGFwZXN0cnkuc2l6ZSh2YWx1ZXMpOwotCi0gICAgICAgIC8vIEJ1aWxkIGEgbmV3IEFycmF5TGlzdCBhbmQgZmlsbCBpdCB3aXRoIHRoZSBzZWxlY3RlZCAKLSAgICAgICAgLy8gb2JqZWN0cywgaWYgYW55LiAKLQotICAgICAgICBMaXN0IHNlbGVjdGVkID0gbmV3IEFycmF5TGlzdChjb3VudCk7Ci0gICAgICAgIElQcm9wZXJ0eVNlbGVjdGlvbk1vZGVsIG1vZGVsID0gZ2V0TW9kZWwoKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IHZhbHVlc1tpXTsKLSAgICAgICAgICAgIE9iamVjdCBvcHRpb24gPSBtb2RlbC50cmFuc2xhdGVWYWx1ZSh2YWx1ZSk7Ci0KLSAgICAgICAgICAgIHNlbGVjdGVkLmFkZChvcHRpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgc2V0U2VsZWN0ZWQoc2VsZWN0ZWQpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzU29ydFVzZXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldFNvcnQoKSA9PSBTb3J0TW9kZS5VU0VSOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIG51bGwsIGJ1dCBtYXkgbWFrZSBzZW5zZSB0byBpbXBsZW1lbnQgYSBkaXNwbGF5TmFtZSBwYXJhbWV0ZXIuCi0gICAgICogCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXREaXNwbGF5TmFtZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgQmxvY2sgZ2V0QXZhaWxhYmxlVGl0bGVCbG9jaygpOwotCi0gICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0QXZhaWxhYmxlVGl0bGVCbG9jayhCbG9jayBhdmFpbGFibGVUaXRsZUJsb2NrKTsKLQotICAgIHB1YmxpYyBhYnN0cmFjdCBJQXNzZXQgZ2V0RGVzZWxlY3REaXNhYmxlZEltYWdlKCk7Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXREZXNlbGVjdERpc2FibGVkSW1hZ2UoSUFzc2V0IGRlc2VsZWN0RGlzYWJsZWRJbWFnZSk7Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgSUFzc2V0IGdldERlc2VsZWN0SW1hZ2UoKTsKLQotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldERlc2VsZWN0SW1hZ2UoSUFzc2V0IGRlc2VsZWN0SW1hZ2UpOwotCi0gICAgcHVibGljIGFic3RyYWN0IElBc3NldCBnZXREb3duRGlzYWJsZWRJbWFnZSgpOwotCi0gICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0RG93bkRpc2FibGVkSW1hZ2UoSUFzc2V0IGRvd25EaXNhYmxlZEltYWdlKTsKLQotICAgIHB1YmxpYyBhYnN0cmFjdCBJQXNzZXQgZ2V0RG93bkltYWdlKCk7Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXREb3duSW1hZ2UoSUFzc2V0IGRvd25JbWFnZSk7Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgSVByb3BlcnR5U2VsZWN0aW9uTW9kZWwgZ2V0TW9kZWwoKTsKLQotICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0Um93cygpOwotCi0gICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0Um93cyhpbnQgcm93cyk7Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgSUFzc2V0IGdldFNlbGVjdERpc2FibGVkSW1hZ2UoKTsKLQotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFNlbGVjdERpc2FibGVkSW1hZ2UoSUFzc2V0IHNlbGVjdERpc2FibGVkSW1hZ2UpOwotCi0gICAgcHVibGljIGFic3RyYWN0IEJsb2NrIGdldFNlbGVjdGVkVGl0bGVCbG9jaygpOwotCi0gICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0U2VsZWN0ZWRUaXRsZUJsb2NrKEJsb2NrIHNlbGVjdGVkVGl0bGVCbG9jayk7Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgSUFzc2V0IGdldFNlbGVjdEltYWdlKCk7Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRTZWxlY3RJbWFnZShJQXNzZXQgc2VsZWN0SW1hZ2UpOwotCi0gICAgcHVibGljIGFic3RyYWN0IFNvcnRNb2RlIGdldFNvcnQoKTsKLQotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFNvcnQoU29ydE1vZGUgc29ydCk7Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRUYWJsZUNsYXNzKFN0cmluZyB0YWJsZUNsYXNzKTsKLQotICAgIHB1YmxpYyBhYnN0cmFjdCBJQXNzZXQgZ2V0VXBEaXNhYmxlZEltYWdlKCk7Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRVcERpc2FibGVkSW1hZ2UoSUFzc2V0IHVwRGlzYWJsZWRJbWFnZSk7Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgSUFzc2V0IGdldFVwSW1hZ2UoKTsKLQotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFVwSW1hZ2UoSUFzc2V0IHVwSW1hZ2UpOwotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgZmFsc2UuICBQYWxldHRlIGNvbXBvbmVudHMgYXJlIG5ldmVyIGRpc2FibGVkLgotICAgICAqIAotICAgICAqICBAc2luY2UgMi4yCi0gICAgICogCi0gICAgICovCi0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0Rpc2FibGVkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKiogQHNpbmNlIDIuMiAqKi8KLQotICAgIHB1YmxpYyBhYnN0cmFjdCBMaXN0IGdldFNlbGVjdGVkKCk7Ci0KLSAgICAvKiogIEBzaW5jZSAyLjIgKiovCi0KLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRTZWxlY3RlZChMaXN0IHNlbGVjdGVkKTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9wYWxldHRlL1BhbGV0dGUuandjIGIvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3BhbGV0dGUvUGFsZXR0ZS5qd2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiMTMwYzkuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3BhbGV0dGUvUGFsZXR0ZS5qd2MKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gIAotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTwhLS0gICRJZCQgLS0+Ci08IURPQ1RZUEUgY29tcG9uZW50LXNwZWNpZmljYXRpb24gUFVCTElDIAotICAiLS8vQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24vL1RhcGVzdHJ5IFNwZWNpZmljYXRpb24gMy4wLy9FTiIgCi0gICJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL3RhcGVzdHJ5L2R0ZC9UYXBlc3RyeV8zXzAuZHRkIj4KLQkKLTxjb21wb25lbnQtc3BlY2lmaWNhdGlvbiBjbGFzcz0ib3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnBhbGV0dGUuUGFsZXR0ZSIgCi0JYWxsb3ctYm9keT0ibm8iIGFsbG93LWluZm9ybWFsLXBhcmFtZXRlcnM9Im5vIj4KLQkKLSAgPGRlc2NyaXB0aW9uPgotICBBIGNvbXBsZXggY29tcG9uZW50IHVzZWQgdG8gbWFuYWdlIG11bHRpcGxlIHNlbGVjdGlvbiBvZiBpdGVtcyBmcm9tIGEgbGlzdC4KLSAgPC9kZXNjcmlwdGlvbj4KLSAgCi0gIDxwYXJhbWV0ZXIgbmFtZT0ic2VsZWN0ZWRUaXRsZUJsb2NrIiAKLSAgCXR5cGU9Im9yZy5hcGFjaGUudGFwZXN0cnkuY29tcG9uZW50cy5CbG9jayIgCi0gIAlyZXF1aXJlZD0ibm8iCi0gIAlkaXJlY3Rpb249ImluIi8+Ci0gIAotICA8cGFyYW1ldGVyIG5hbWU9ImF2YWlsYWJsZVRpdGxlQmxvY2siIAotICAgCXR5cGU9Im9yZy5hcGFjaGUudGFwZXN0cnkuY29tcG9uZW50cy5CbG9jayIgCi0gICAJcmVxdWlyZWQ9Im5vIgotICAgCWRpcmVjdGlvbj0iaW4iLz4KLSAgIAkKLSAgPHBhcmFtZXRlciBuYW1lPSJtb2RlbCIgCi0gIAl0eXBlPSJvcmcuYXBhY2hlLnRhcGVzdHJ5LmZvcm0uSVByb3BlcnR5U2VsZWN0aW9uTW9kZWwiIAotICAJcmVxdWlyZWQ9InllcyIKLSAgCWRpcmVjdGlvbj0iaW4iLz4KLSAgCi0gIDxwYXJhbWV0ZXIgbmFtZT0ic2VsZWN0ZWQiIHR5cGU9ImphdmEudXRpbC5MaXN0IiAKLSAgCXJlcXVpcmVkPSJ5ZXMiIGRpcmVjdGlvbj0iZm9ybSIvPgotICAKLSAgPHBhcmFtZXRlciBuYW1lPSJzb3J0IiAKLSAgCXR5cGU9Im9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi5wYWxldHRlLlNvcnRNb2RlIiAKLSAgCXJlcXVpcmVkPSJubyIKLSAgCWRpcmVjdGlvbj0iaW4iLz4KLSAgCi0gIDxwYXJhbWV0ZXIgbmFtZT0icm93cyIgCi0gICAJdHlwZT0iaW50IiAKLSAgIAlyZXF1aXJlZD0ibm8iCi0gICAJZGlyZWN0aW9uPSJpbiIvPgotICAKLSAgPHBhcmFtZXRlciBuYW1lPSJ0YWJsZUNsYXNzIiAKLSAgCXR5cGU9ImphdmEubGFuZy5TdHJpbmciIAotICAJcmVxdWlyZWQ9Im5vIgotICAJZGlyZWN0aW9uPSJpbiIvPgotICAKLSAgCi0gIDxwYXJhbWV0ZXIgbmFtZT0ic2VsZWN0SW1hZ2UiIHR5cGU9Im9yZy5hcGFjaGUudGFwZXN0cnkuSUFzc2V0IiBkaXJlY3Rpb249ImluIi8+Ci0gIDxwYXJhbWV0ZXIgbmFtZT0ic2VsZWN0RGlzYWJsZWRJbWFnZSIgdHlwZT0ib3JnLmFwYWNoZS50YXBlc3RyeS5JQXNzZXQiIGRpcmVjdGlvbj0iaW4iLz4KLSAgPHBhcmFtZXRlciBuYW1lPSJkZXNlbGVjdEltYWdlIiB0eXBlPSJvcmcuYXBhY2hlLnRhcGVzdHJ5LklBc3NldCIgZGlyZWN0aW9uPSJpbiIvPgotICA8cGFyYW1ldGVyIG5hbWU9ImRlc2VsZWN0RGlzYWJsZWRJbWFnZSIgdHlwZT0ib3JnLmFwYWNoZS50YXBlc3RyeS5JQXNzZXQiIGRpcmVjdGlvbj0iaW4iLz4KLSAgPHBhcmFtZXRlciBuYW1lPSJ1cEltYWdlIiB0eXBlPSJvcmcuYXBhY2hlLnRhcGVzdHJ5LklBc3NldCIgZGlyZWN0aW9uPSJpbiIvPgotICA8cGFyYW1ldGVyIG5hbWU9InVwRGlzYWJsZWRJbWFnZSIgdHlwZT0ib3JnLmFwYWNoZS50YXBlc3RyeS5JQXNzZXQiIGRpcmVjdGlvbj0iaW4iLz4KLSAgPHBhcmFtZXRlciBuYW1lPSJkb3duSW1hZ2UiIHR5cGU9Im9yZy5hcGFjaGUudGFwZXN0cnkuSUFzc2V0IiBkaXJlY3Rpb249ImluIi8+Ci0gIDxwYXJhbWV0ZXIgbmFtZT0iZG93bkRpc2FibGVkSW1hZ2UiIHR5cGU9Im9yZy5hcGFjaGUudGFwZXN0cnkuSUFzc2V0IiBkaXJlY3Rpb249ImluIi8+Ci0gICAgCi0gIDxwcm9wZXJ0eS1zcGVjaWZpY2F0aW9uIG5hbWU9Im5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KLSAgPHByb3BlcnR5LXNwZWNpZmljYXRpb24gbmFtZT0iZm9ybSIgdHlwZT0ib3JnLmFwYWNoZS50YXBlc3RyeS5JRm9ybSIvPgotICAKLSAgPHByb3BlcnR5LXNwZWNpZmljYXRpb24gbmFtZT0ic2VsZWN0ZWRDb2x1bW4iIHR5cGU9Im9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi5wYWxldHRlLlBhbGV0dGVDb2x1bW4iLz4KLSAgPHByb3BlcnR5LXNwZWNpZmljYXRpb24gbmFtZT0iYXZhaWxhYmxlQ29sdW1uIiB0eXBlPSJvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIucGFsZXR0ZS5QYWxldHRlQ29sdW1uIi8+Ci0gIAotICAKLSAgPHByaXZhdGUtYXNzZXQgbmFtZT0iU2VsZWN0IiByZXNvdXJjZS1wYXRoPSJzZWxlY3RfcmlnaHQuZ2lmIi8+Ci0gIDxwcml2YXRlLWFzc2V0IG5hbWU9IlNlbGVjdERpc2FibGVkIiByZXNvdXJjZS1wYXRoPSJzZWxlY3RfcmlnaHRfb2ZmLmdpZiIvPgotICA8cHJpdmF0ZS1hc3NldCBuYW1lPSJEZXNlbGVjdCIgcmVzb3VyY2UtcGF0aD0iZGVzZWxlY3RfbGVmdC5naWYiLz4KLSAgPHByaXZhdGUtYXNzZXQgbmFtZT0iRGVzZWxlY3REaXNhYmxlZCIgcmVzb3VyY2UtcGF0aD0iZGVzZWxlY3RfbGVmdF9vZmYuZ2lmIi8+Ci0gIDxwcml2YXRlLWFzc2V0IG5hbWU9IlVwIiByZXNvdXJjZS1wYXRoPSJtb3ZlX3VwLmdpZiIvPgotICA8cHJpdmF0ZS1hc3NldCBuYW1lPSJVcERpc2FibGVkIiByZXNvdXJjZS1wYXRoPSJtb3ZlX3VwX29mZi5naWYiLz4KLSAgPHByaXZhdGUtYXNzZXQgbmFtZT0iRG93biIgcmVzb3VyY2UtcGF0aD0ibW92ZV9kb3duLmdpZiIvPgotICA8cHJpdmF0ZS1hc3NldCBuYW1lPSJEb3duRGlzYWJsZWQiIHJlc291cmNlLXBhdGg9Im1vdmVfZG93bl9vZmYuZ2lmIi8+Ci0gIAotPC9jb21wb25lbnQtc3BlY2lmaWNhdGlvbj4KZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9wYWxldHRlL1BhbGV0dGUucHJvcGVydGllcyBiL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9wYWxldHRlL1BhbGV0dGUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA1NmRhNy4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvcGFsZXR0ZS9QYWxldHRlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLSMgJElkJAotdGl0bGUuYXZhaWxhYmxlPUF2YWlsYWJsZQotdGl0bGUuc2VsZWN0ZWQ9U2VsZWN0ZWQKLQotdG9vbHRpcC5zZWxlY3Q9U2VsZWN0Ci10b29sdGlwLmRlc2VsZWN0PURlc2VsZWN0Ci10b29sdGlwLm1vdmV1cD1Nb3ZlIFVwCi10b29sdGlwLm1vdmVkb3duPU1vdmUgRG93bgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9wYWxldHRlL1BhbGV0dGUuc2NyaXB0IGIvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3BhbGV0dGUvUGFsZXR0ZS5zY3JpcHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0ODM0NmMuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3BhbGV0dGUvUGFsZXR0ZS5zY3JpcHQKKysrIC9kZXYvbnVsbApAQCAtMSwzNDkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tICRJZCQgLS0+Ci08IURPQ1RZUEUgc2NyaXB0IFBVQkxJQwotCSItLy9BcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi8vVGFwZXN0cnkgU2NyaXB0IFNwZWNpZmljYXRpb24gMy4wLy9FTiIKLQkiaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy90YXBlc3RyeS9kdGQvU2NyaXB0XzNfMC5kdGQiPgotPHNjcmlwdD4KLTwhLS0gCi0KLWlucHV0IHN5bWJvbHM6Ci0gIHBhbGV0dGUgLSB0aGUgUGFsZXR0ZSBpbnN0YW5jZQotICBzZWxlY3RJbWFnZSAtIHJlZmVyZW5jZSB0byB0aGUgc2VsZWN0IGltYWdlCi0gIHNlbGVjdERpc2FibGVkSW1hZ2UgLSByZWZlcmVjZSB0byB0aGUgZGlzYWJsZWQgc2VsZWN0IGltYWdlICAKLSAgZGVzZWxlY3RJbWFnZSAtIHJlZmVyZW5jZSB0byB0aGUgZGVzZWxlY3QgaW1hZ2UKLSAgZGVzZWxlY3REaXNhYmxlZEltYWdlIC0gcmVmZXJlbmNlIHRvIHRoZSBkaXNibGVkIGRlc2VsZWN0IGltYWdlCi0gIHVwSW1hZ2UgLSByZWZlcmVuY2UgdG8gdGhlIG1vdmUgdXAgaW1hZ2UKLSAgdXBEaXNhYmxlZEltYWdlIC0gcmVmZXJlbmNlIHRvIHRoZSBkaXNhYmxlZCBtb3ZlIHVwIGltYWdlCi0gIGRvd25JbWFnZSAtIHJlZmVyZW5jZSB0byB0aGUgbW92ZSBkb3duIGltYWdlCi0gIGRvd25EaXNhYmxlZEltYWdlIC0gcmVmZXJlbmNlIHRvIHRoZSBkaXNhYmxlZCBtb3ZlIGRvd24gaW1hZ2UKLQotTm90ZTogInJlZmVyZW5jZSIgbWVhbnMgdGhlIHJlc3VsdCBvZiBCb2R5LmdldFByZWxvYWRlZEltYWdlUmVmZXJlbmNlKCkuICBUaGUKLXVwIGFuZCBkb3duIGltYWdlcyBhcmUgb25seSBuZWVkZWQgaWYgdXNlciBzb3J0aW5nIGlzIGVuYWJsZWQuCi0KLW91dHB1dCBzeW1ib2xzOgotICBmb3JtU3VibWl0RnVuY3Rpb25OYW1lIC0gbmFtZSBvZiBhIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkIHdoZW4gdGhlIGZvcm0gc3VibWl0cwotICBhdmFpbGFibGVOYW1lIC0gdGhlIG5hbWUgb2YgdGhlIGF2YWlsYWJsZSBlbGVtZW50Ci0gIHNlbGVjdEltYWdlTmFtZSAtIHRoZSBuYW1lIHRvIHVzZSBmb3IgdGhlIHNlbGVjdCBpbWFnZSAoaW5zaWRlIHRoZSBzZWxlY3QgbGluaykKLSAgc2VsZWN0T25DbGlja1NjcmlwdCAtIHRoZSBzY3JpcHQgdG8gYXNzaWduIHRvIHRoZSBzZWxlY3QgbGluaydzIG9uY2xpY2sgYXR0cmlidXRlCi0gIGRlc2VsZWN0T25DbGlja1NjcmlwdCAtIHRoZSBzY3JpcHQgdG8gYXNzaWduIHRvIHRoZSBkZXNlbGVjdCBsaW5rJ3Mgb25jbGljayBhdHRyaWJ1dGUKLSAgZGVzZWxlY3RJbWFnZU5hbWUgLSB0aGUgbmFtZSB0byB1c2UgZm9yIHRoZSBkZXNlbGVjdCBpbWFnZSAoaW5zaWRlIHRoZSBkZXNlbGVjdCBsaW5rKQotICB1cEltYWdlTmFtZSAtIHRoZSBuYW1lIG9mIHRoZSB1cCBpbWFnZSAoaW5zaWRlIHRoZSB1cCBsaW5rKQotICBkb3duSW1hZ2VOYW1lIHRoZSBuYW1lIG9mIHRoZSBtb3ZlIGRvd24gaW1hZ2UgKGluc2lkZSB0aGUgZG93biBsaW5rKQotICB1cE9uQ2xpY2tTY3JpcHQgLSB0aGUgc2NyaXB0IHRvIGFzc2lnbiB0byB0aGUgdXAgbGluaydzIG9uY2xpY2sgYXR0cmlidXRlCi0gIGRvd25PbkNsaWNrU2NyaXB0IC0gdGhlIHNjcmlwdCB0byBhc3NpZ24gdG8gdGhlIGRvd24gbGluaydzIG9uY2xpY2sgYXR0cmlidXRlCi0tLT4KLQotPGluY2x1ZGUtc2NyaXB0IHJlc291cmNlLXBhdGg9Ii9vcmcvYXBhY2hlL3RhcGVzdHJ5L2h0bWwvUHJhY3RpY2FsQnJvd3NlclNuaWZmZXIuanMiLz4KLTxpbmNsdWRlLXNjcmlwdCByZXNvdXJjZS1wYXRoPSIvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3BhbGV0dGUvUGFsZXR0ZUZ1bmN0aW9ucy5qcyIvPgotCi08aW5wdXQtc3ltYm9sIGtleT0icGFsZXR0ZSIgY2xhc3M9Im9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi5wYWxldHRlLlBhbGV0dGUiIHJlcXVpcmVkPSJ5ZXMiLz4KLTxpbnB1dC1zeW1ib2wga2V5PSJzZWxlY3RJbWFnZSIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmciIHJlcXVpcmVkPSJ5ZXMiLz4KLTxpbnB1dC1zeW1ib2wga2V5PSJzZWxlY3REaXNhYmxlZEltYWdlIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZyIgcmVxdWlyZWQ9InllcyIvPgotPGlucHV0LXN5bWJvbCBrZXk9ImRlc2VsZWN0SW1hZ2UiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIiByZXF1aXJlZD0ieWVzIi8+Ci08aW5wdXQtc3ltYm9sIGtleT0iZGVzZWxlY3REaXNhYmxlZEltYWdlIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZyIgcmVxdWlyZWQ9InllcyIvPgotPGlucHV0LXN5bWJvbCBrZXk9InVwSW1hZ2UiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIi8+Ci08aW5wdXQtc3ltYm9sIGtleT0idXBEaXNhYmxlZEltYWdlIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZyIvPgotPGlucHV0LXN5bWJvbCBrZXk9ImRvd25JbWFnZSIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmciLz4KLTxpbnB1dC1zeW1ib2wga2V5PSJkb3duRGlzYWJsZWRJbWFnZSIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmciLz4KLQotPHNldCBrZXk9ImZvcm1OYW1lIiBleHByZXNzaW9uPSJwYWxldHRlLmZvcm0ubmFtZSIvPgotPHNldCBrZXk9Im5hbWUiIGV4cHJlc3Npb249InBhbGV0dGUubmFtZSIvPgotPHNldCBrZXk9InNvcnRMYWJlbCIgZXhwcmVzc2lvbj0icGFsZXR0ZS5zb3J0ID09IEBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIucGFsZXR0ZS5Tb3J0TW9kZUBMQUJFTCIvPgotPHNldCBrZXk9InNvcnRWYWx1ZSIgZXhwcmVzc2lvbj0icGFsZXR0ZS5zb3J0ID09IEBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIucGFsZXR0ZS5Tb3J0TW9kZUBWQUxVRSIvPgotPHNldCBrZXk9InNvcnRVc2VyIiBleHByZXNzaW9uPSJwYWxldHRlLnNvcnQgPT0gQG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi5wYWxldHRlLlNvcnRNb2RlQFVTRVIiLz4KLQotCi08IS0tIGJhc2VOYW1lIC0gYmFzZSBuYW1lIGZyb20gd2hpY2ggb3RoZXIgbmFtZXMgYXJlIGdlbmVyYXRlZCAtLT4KLQotPGxldCBrZXk9ImJhc2VOYW1lIiB1bmlxdWU9InllcyI+Ci0gICR7bmFtZX0KLTwvbGV0PgotCi08bGV0IGtleT0iYnV0dG9ucyI+Ci0gICR7YmFzZU5hbWV9JGJ1dHRvbnMKLTwvbGV0PgotCi08bGV0IGtleT0ic2VsZWN0RGlzYWJsZWQiPgotICAke2J1dHRvbnN9LnNlbGVjdERpc2FibGVkCi08L2xldD4KLQotPGxldCBrZXk9ImRlc2VsZWN0RGlzYWJsZWQiPgotICAke2J1dHRvbnN9LmRlc2VsZWN0RGlzYWJsZWQKLTwvbGV0PgotCi08bGV0IGtleT0idXBEaXNhYmxlZCI+Ci0gICR7YnV0dG9uc30udXBEaXNhYmxlZAotPC9sZXQ+Ci0KLTxsZXQga2V5PSJkb3duRGlzYWJsZWQiPgotICAke2J1dHRvbnN9LmRvd25EaXNhYmxlZAotPC9sZXQ+Ci0KLTxsZXQga2V5PSJhdmFpbGFibGVOYW1lIj4KLSAgJHtuYW1lfSRhdmFpbAotPC9sZXQ+Ci0KLTxsZXQga2V5PSJ1cGRhdGVGdW5jdGlvbk5hbWUiPgotICB1cGRhdGVfJHtiYXNlTmFtZX0KLTwvbGV0PgotCi08bGV0IGtleT0ic2VsZWN0RnVuY3Rpb25OYW1lIj4KLSAgc2VsZWN0XyR7YmFzZU5hbWV9Ci08L2xldD4KLQotPGxldCBrZXk9InNlbGVjdE9uQ2xpY2tTY3JpcHQiPgotICBqYXZhc2NyaXB0OiR7c2VsZWN0RnVuY3Rpb25OYW1lfSgpOwotPC9sZXQ+Ci0KLTxsZXQga2V5PSJkZXNlbGVjdEZ1bmN0aW9uTmFtZSI+Ci0gIGRlc2VsZWN0XyR7YmFzZU5hbWV9Ci08L2xldD4KLQotPGxldCBrZXk9ImRlc2VsZWN0T25DbGlja1NjcmlwdCI+Ci0gIGphdmFzY3JpcHQ6JHtkZXNlbGVjdEZ1bmN0aW9uTmFtZX0oKTsKLTwvbGV0PgotCi08bGV0IGtleT0iZm9ybVN1Ym1pdEZ1bmN0aW9uTmFtZSI+Ci0gIG9uc3VibWl0XyR7YmFzZU5hbWV9Ci08L2xldD4KLQotPGxldCBrZXk9InNlbGVjdEltYWdlTmFtZSI+Ci0gICR7YmFzZU5hbWV9JHNlbGVjdEltYWdlCi08L2xldD4KLQotPGxldCBrZXk9InNlbGVjdEltYWdlUGF0aCI+Ci0gIGRvY3VtZW50LiR7c2VsZWN0SW1hZ2VOYW1lfQotPC9sZXQ+Ci0KLTxsZXQga2V5PSJkZXNlbGVjdEltYWdlTmFtZSI+Ci0gICR7YmFzZU5hbWV9JGRlc2VsZWN0SW1hZ2UKLTwvbGV0PgotCi08bGV0IGtleT0iZGVzZWxlY3RJbWFnZVBhdGgiPgotICBkb2N1bWVudC4ke2Rlc2VsZWN0SW1hZ2VOYW1lfQotPC9sZXQ+Ci0KLTxsZXQga2V5PSJmb3JtUGF0aCI+Ci0gIGRvY3VtZW50LiR7Zm9ybU5hbWV9Ci08L2xldD4KLQotPGxldCBrZXk9InNlbGVjdGVkUGF0aCI+Ci0gICR7Zm9ybVBhdGh9LiR7bmFtZX0KLTwvbGV0PgotCi08bGV0IGtleT0ic2VsZWN0ZWRDaGFuZ2VGdW5jdGlvbk5hbWUiPgotICBvbkNoYW5nZV8ke2Jhc2VOYW1lfV9zZWxlY3RlZAotPC9sZXQ+Ci0KLTxsZXQga2V5PSJhdmFpbGFibGVQYXRoIj4KLSAgJHtmb3JtUGF0aH0uJHthdmFpbGFibGVOYW1lfQotPC9sZXQ+Ci0KLTxsZXQga2V5PSJhdmFpbGFibGVDaGFuZ2VGdW5jdGlvbk5hbWUiPgotICBvbkNoYW5nZV8ke2Jhc2VOYW1lfV9hdmFpbGFibGUKLTwvbGV0PgotCi0KLTxsZXQga2V5PSJ1cEltYWdlTmFtZSI+Ci0gICR7YmFzZU5hbWV9JHVwaW1hZ2UKLTwvbGV0PgotCi08bGV0IGtleT0idXBJbWFnZVBhdGgiPgotICBkb2N1bWVudC4ke3VwSW1hZ2VOYW1lfQotPC9sZXQ+Ci0KLTxsZXQga2V5PSJkb3duSW1hZ2VOYW1lIj4KLSAgJHtiYXNlTmFtZX0kZG93bmltYWdlCi08L2xldD4KLQotPGxldCBrZXk9ImRvd25JbWFnZVBhdGgiPgotICBkb2N1bWVudC4ke2Rvd25JbWFnZU5hbWV9Ci08L2xldD4KLQotPGxldCBrZXk9Im1vdmVVcEZ1bmN0aW9uTmFtZSI+Ci0gIG1vdmV1cF8ke2Jhc2VOYW1lfQotPC9sZXQ+Ci0KLTxsZXQga2V5PSJ1cE9uQ2xpY2tTY3JpcHQiPgotICBqYXZhc2NyaXB0OiR7bW92ZVVwRnVuY3Rpb25OYW1lfSgpOwotPC9sZXQ+Ci0KLTxsZXQga2V5PSJtb3ZlRG93bkZ1bmN0aW9uTmFtZSI+Ci0gIG1vdmVkb3duXyR7YmFzZU5hbWV9Ci08L2xldD4KLQotPGxldCBrZXk9ImRvd25PbkNsaWNrU2NyaXB0Ij4KLSAgamF2YXNjcmlwdDoke21vdmVEb3duRnVuY3Rpb25OYW1lfSgpOwotPC9sZXQ+Ci0KLQotPGJvZHk+Ci0KLTwhLS0gQSB2YXJpYWJsZSB0aGF0IGlzIHVzZWQgdG8gdHJhY2sgd2hpY2ggb2YgdGhlIGJ1dHRvbnMgYXJlIGVuYWJsZWQKLSAgICAgb3IgZGlzYWJsZWQuIEFsbCBvZiB0aGUgYnV0dG9ucyBhcmUgZGlzYWJsZWQgdW50aWwgdGhlIHBhZ2UgZmluaXNoZXMKLSAgICAgbG9hZGluZywgYXQgd2hpY2ggcG9pbnQgdGhlIHVwZGF0ZSBmdW5jdGlvbiB3aWxsIGRldGVybWluZSB3aGljaAotICAgICBjYW4gYmUgdXNlZC4gLS0+Ci0gICAgIAotdmFyICR7YnV0dG9uc30gPSBuZXcgT2JqZWN0KCk7Ci0ke3NlbGVjdERpc2FibGVkfSA9IHRydWU7Ci0ke2Rlc2VsZWN0RGlzYWJsZWR9ID0gdHJ1ZTsKLTxpZiBleHByZXNzaW9uPSJzb3J0VXNlciI+Ci0ke3VwRGlzYWJsZWR9ID0gdHJ1ZTsKLSR7ZG93bkRpc2FibGVkfSA9IHRydWU7Ci08L2lmPgotCi1mdW5jdGlvbiAke3VwZGF0ZUZ1bmN0aW9uTmFtZX0oKQotewotICB2YXIgZGlzYWJsZWQgPSAke2F2YWlsYWJsZVBhdGh9LnNlbGVjdGVkSW5kZXggJmx0OyAwOwotICAKLSAgJHtzZWxlY3REaXNhYmxlZH0gPSBkaXNhYmxlZDsKLSAKLSAgaWYgKGRvY3VtZW50LmltYWdlcykKLSAgICAke3NlbGVjdEltYWdlUGF0aH0uc3JjID0KLSAgICAgIGRpc2FibGVkID8gJHtzZWxlY3REaXNhYmxlZEltYWdlfQotICAgICAgICAgICAgICAgOiAke3NlbGVjdEltYWdlfTsKLQotICB2YXIgc2VsZWN0ZWQgPSAke3NlbGVjdGVkUGF0aH07Ci0gIHZhciBpbmRleCA9IHNlbGVjdGVkLnNlbGVjdGVkSW5kZXg7Ci0KLSAgZGlzYWJsZWQgPSBpbmRleCAmbHQ7IDA7Ci0gICR7ZGVzZWxlY3REaXNhYmxlZH0gPSBkaXNhYmxlZDsKLSAKLSAgaWYgKGRvY3VtZW50LmltYWdlcykKLSAgICAke2Rlc2VsZWN0SW1hZ2VQYXRofS5zcmMgPQotICAgICAgZGlzYWJsZWQgPyAke2Rlc2VsZWN0RGlzYWJsZWRJbWFnZX0KLSAgICAgICAgICAgICAgIDogJHtkZXNlbGVjdEltYWdlfTsgICAKLTxpZiBleHByZXNzaW9uPSJzb3J0VXNlciI+Ci0gIHZhciB1cEltYWdlID0gJHt1cEltYWdlUGF0aH07Ci0gIHZhciBkb3duSW1hZ2UgPSAke2Rvd25JbWFnZVBhdGh9OwotICAKLSAgJHt1cERpc2FibGVkfSA9IHRydWU7Ci0gICR7ZG93bkRpc2FibGVkfSA9IHRydWU7Ci0gIAotICBpZiAoZG9jdW1lbnQuaW1hZ2VzKQotICB7Ci0gICAgdXBJbWFnZS5zcmMgPSAke3VwRGlzYWJsZWRJbWFnZX07Ci0gICAgZG93bkltYWdlLnNyYyA9ICR7ZG93bkRpc2FibGVkSW1hZ2V9OwotICB9Ci0gIAotICA8IS0tIElmIHRoZXJlJ3Mgbm8gc2VsZWN0aW9uIGluIHRoZSAic2VsZWN0ZWQiIGNvbHVtbiwgdGhlbiBsZWF2ZQotICAgICAgIGJvdGggYnV0dG9ucyBkaXNhYmxlZC4gLS0+Ci0gICAgICAgCi0gIGlmIChkaXNhYmxlZCkKLSAgICByZXR1cm47Ci0gCi0gIDwhLS0gU2VhcmNoIGZvciBhIHNlY29uZCBzZWxlY3RlZCBpdGVtIC0tPgotICAKLSAgZm9yICh2YXIgaSA9IGluZGV4ICsgMTsgaSAmbHQ7IHNlbGVjdGVkLm9wdGlvbnMubGVuZ3RoOyBpKyspCi0gIHsKLSAgICA8IS0tIEZvdW5kIGEgc2Vjb25kIHNlbGVjdGVkIG9wdGlvbiwgc28gbGVhdmUgYnV0dG9ucyBkaXNhYmxlZC4gLS0+Ci0gICAgaWYgKHNlbGVjdGVkLm9wdGlvbnNbaV0uc2VsZWN0ZWQpCi0gICAgcmV0dXJuOwotICB9Ci0gIAotICAke3VwRGlzYWJsZWR9ID0gKGluZGV4ID09IDApOwotICAke2Rvd25EaXNhYmxlZH0gPSAoaW5kZXggPT0gc2VsZWN0ZWQub3B0aW9ucy5sZW5ndGggLSAxKTsgIAotICAKLSAgaWYgKGRvY3VtZW50LmltYWdlcykKLSAgewotICAgIGlmICghJHt1cERpc2FibGVkfSkKLSAgICAgIHVwSW1hZ2Uuc3JjID0gJHt1cEltYWdlfTsKLQotICAgIGlmICghJHtkb3duRGlzYWJsZWR9KQotICAgICAgZG93bkltYWdlLnNyYyA9ICR7ZG93bkltYWdlfTsKLSAgfQotPC9pZj4gIAotfQotCi1mdW5jdGlvbiAke3NlbGVjdEZ1bmN0aW9uTmFtZX0oKQotewotIGlmICgke3NlbGVjdERpc2FibGVkfSkKLSAgICByZXR1cm47Ci0gICAgCi0gIHZhciBzb3VyY2UgPSAke2F2YWlsYWJsZVBhdGh9OwotICB2YXIgdGFyZ2V0ID0gJHtzZWxlY3RlZFBhdGh9OwotICAgICAKLSAgcGFsZXR0ZV90cmFuc2Zlcl9zZWxlY3Rpb25zKHNvdXJjZSwgdGFyZ2V0KTsKLTxpZiBleHByZXNzaW9uPSJzb3J0TGFiZWwiPgotICBwYWxldHRlX3NvcnRfYnlfbGFiZWwodGFyZ2V0KTsKLTwvaWY+Ci08aWYgZXhwcmVzc2lvbj0ic29ydFZhbHVlIj4KLSAgcGFsZXR0ZV9zb3J0X2J5X3ZhbHVlKHRhcmdldCk7Ci08L2lmPgotICAke3VwZGF0ZUZ1bmN0aW9uTmFtZX0oKTsKLX0KLQotZnVuY3Rpb24gJHtkZXNlbGVjdEZ1bmN0aW9uTmFtZX0oKQotewotICBpZiAoJHtkZXNlbGVjdERpc2FibGVkfSkKLSAgICByZXR1cm47Ci0gIAotICB2YXIgc291cmNlID0gJHtzZWxlY3RlZFBhdGh9OwotICB2YXIgdGFyZ2V0ID0gJHthdmFpbGFibGVQYXRofTsKLSAgCi0gIHBhbGV0dGVfdHJhbnNmZXJfc2VsZWN0aW9ucyhzb3VyY2UsIHRhcmdldCk7Ci08aWYgZXhwcmVzc2lvbj0ic29ydExhYmVsIj4KLSAgcGFsZXR0ZV9zb3J0X2J5X2xhYmVsKHRhcmdldCk7Ci08L2lmPgotPGlmIGV4cHJlc3Npb249InNvcnRWYWx1ZSI+Ci0gIHBhbGV0dGVfc29ydF9ieV92YWx1ZSh0YXJnZXQpOwotPC9pZj4KLSAgJHt1cGRhdGVGdW5jdGlvbk5hbWV9KCk7ICAKLX0KLQotZnVuY3Rpb24gJHtmb3JtU3VibWl0RnVuY3Rpb25OYW1lfSgpCi17Ci0gIHBhbGV0dGVfY2xlYXJfc2VsZWN0aW9ucygke2F2YWlsYWJsZVBhdGh9KTsKLSAgcGFsZXR0ZV9zZWxlY3RfYWxsKCR7c2VsZWN0ZWRQYXRofSk7Ci0gIAotICByZXR1cm4gdHJ1ZTsKLX0KLTxpZiBleHByZXNzaW9uPSJzb3J0VXNlciI+Ci1mdW5jdGlvbiAke21vdmVVcEZ1bmN0aW9uTmFtZX0oKQotewotICBpZiAoJHt1cERpc2FibGVkfSkKLSAgICByZXR1cm47Ci0gICAgCi0gIHZhciBlbGVtZW50ID0gJHtzZWxlY3RlZFBhdGh9OwotICB2YXIgb3B0aW9ucyA9IGVsZW1lbnQub3B0aW9uczsKLSAgICAKLSAgcGFsZXR0ZV9zd2FwX29wdGlvbnMob3B0aW9ucywgZWxlbWVudC5zZWxlY3RlZEluZGV4LCBlbGVtZW50LnNlbGVjdGVkSW5kZXggLSAxKTsKLSAgCi0gICR7dXBkYXRlRnVuY3Rpb25OYW1lfSgpOwotfQotCi1mdW5jdGlvbiAke21vdmVEb3duRnVuY3Rpb25OYW1lfSgpCi17Ci0gIGlmICgke2Rvd25EaXNhYmxlZH0pCi0gICAgcmV0dXJuOwotICAgIAotICB2YXIgZWxlbWVudCA9ICR7c2VsZWN0ZWRQYXRofTsKLSAgdmFyIG9wdGlvbnMgPSBlbGVtZW50Lm9wdGlvbnM7Ci0gIAotICBwYWxldHRlX3N3YXBfb3B0aW9ucyhvcHRpb25zLCBlbGVtZW50LnNlbGVjdGVkSW5kZXgsIGVsZW1lbnQuc2VsZWN0ZWRJbmRleCArIDEpOwotICAKLSAgJHt1cGRhdGVGdW5jdGlvbk5hbWV9KCk7Ci19Ci08L2lmPgotZnVuY3Rpb24gJHtzZWxlY3RlZENoYW5nZUZ1bmN0aW9uTmFtZX0oKQotewotICBwYWxldHRlX2NsZWFyX3NlbGVjdGlvbnMoJHthdmFpbGFibGVQYXRofSk7Ci0gICR7dXBkYXRlRnVuY3Rpb25OYW1lfSgpOwotfQotCi1mdW5jdGlvbiAke2F2YWlsYWJsZUNoYW5nZUZ1bmN0aW9uTmFtZX0oKQotewotICBwYWxldHRlX2NsZWFyX3NlbGVjdGlvbnMoJHtzZWxlY3RlZFBhdGh9KTsKLSAgJHt1cGRhdGVGdW5jdGlvbk5hbWV9KCk7Ci19Ci08L2JvZHk+Ci0KLTxpbml0aWFsaXphdGlvbj4KLQotJHtzZWxlY3RlZFBhdGh9Lm9uY2hhbmdlID0gJHtzZWxlY3RlZENoYW5nZUZ1bmN0aW9uTmFtZX07Ci0ke3NlbGVjdGVkUGF0aH0ub25kYmxjbGljayA9ICR7ZGVzZWxlY3RGdW5jdGlvbk5hbWV9OwotJHthdmFpbGFibGVQYXRofS5vbmNoYW5nZSA9ICR7YXZhaWxhYmxlQ2hhbmdlRnVuY3Rpb25OYW1lfTsKLSR7YXZhaWxhYmxlUGF0aH0ub25kYmxjbGljayA9ICR7c2VsZWN0RnVuY3Rpb25OYW1lfTsKLQotPC9pbml0aWFsaXphdGlvbj4KLTwvc2NyaXB0PgpkaWZmIC0tZ2l0IGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3BhbGV0dGUvUGFsZXR0ZUNvbHVtbi5qYXZhIGIvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3BhbGV0dGUvUGFsZXR0ZUNvbHVtbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWFhZTlhLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9wYWxldHRlL1BhbGV0dGVDb2x1bW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnBhbGV0dGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSU1hcmt1cFdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZW5kZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVxdWVzdEN5Y2xlOwotCi0vKioKLSAqIE9uZSBvZiB0aGUgdHdvIGNvbHVtbnMgaW4gYSBQYWxldHRlIGNvbXBvbmVudDogdGhlIGxlZnQgY29sdW1uIGxpc3RzCi0gKiBhdmFpbGFibGUgb3B0aW9ucywgdGhlIHJpZ2h0IGNvbHVtbiBsaXN0cyB0aGUgc2VsZWN0ZWQgY29sdW1ucy4KLSAqCi0gKiBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiBAdmVyc2lvbiAkSWQkCi0gKi8KLXB1YmxpYyBjbGFzcyBQYWxldHRlQ29sdW1uIGltcGxlbWVudHMgSVJlbmRlcgotewotICAgIHByaXZhdGUgU3RyaW5nIF9uYW1lOwotICAgIHByaXZhdGUgaW50IF9yb3dzOwotICAgIHByaXZhdGUgTGlzdCBfb3B0aW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFZhbHVlQ29tcGFyYXRvciBpbXBsZW1lbnRzIENvbXBhcmF0b3IKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikKLSAgICAgICAgewotICAgICAgICAgICAgUGFsZXR0ZU9wdGlvbiBvcHRpb24xID0gKFBhbGV0dGVPcHRpb24pIG8xOwotICAgICAgICAgICAgUGFsZXR0ZU9wdGlvbiBvcHRpb24yID0gKFBhbGV0dGVPcHRpb24pIG8yOwotCi0gICAgICAgICAgICByZXR1cm4gb3B0aW9uMS5nZXRWYWx1ZSgpLmNvbXBhcmVUbyhvcHRpb24yLmdldFZhbHVlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTGFiZWxDb21wYXJhdG9yIGltcGxlbWVudHMgQ29tcGFyYXRvcgotICAgIHsKLSAgICAgICAgcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKQotICAgICAgICB7Ci0gICAgICAgICAgICBQYWxldHRlT3B0aW9uIG9wdGlvbjEgPSAoUGFsZXR0ZU9wdGlvbikgbzE7Ci0gICAgICAgICAgICBQYWxldHRlT3B0aW9uIG9wdGlvbjIgPSAoUGFsZXR0ZU9wdGlvbikgbzI7Ci0KLSAgICAgICAgICAgIHJldHVybiBvcHRpb24xLmdldExhYmVsKCkuY29tcGFyZVRvKG9wdGlvbjIuZ2V0TGFiZWwoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgY29sdW1uICh0aGUgbmFtZSBhdHRyaWJ1dGUgb2YgdGhlICZsdDtzZWxlY3QmZ3Q7KQotCSAqIEBwYXJhbSByb3dzIHRoZSBudW1iZXIgb2YgdmlzaWJsZSByb3dzICh0aGUgc2l6ZSBhdHRyaWJ1dGUgb2YgdGhlICZsdDtzZWxlY3QmZ3Q7KQotCSAqLwotCXB1YmxpYyBQYWxldHRlQ29sdW1uKFN0cmluZyBuYW1lLCBpbnQgcm93cykKLQl7Ci0JCV9uYW1lID0gbmFtZTsKLQkJX3Jvd3MgPSByb3dzOwotCX0KLQotICAgIHB1YmxpYyB2b2lkIGFkZE9wdGlvbihQYWxldHRlT3B0aW9uIG9wdGlvbikKLSAgICB7Ci0gICAgICAgIF9vcHRpb25zLmFkZChvcHRpb24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNvcnRzIHRoZSBvcHRpb25zIGJ5IHZhbHVlICh0aGUgaGlkZGVuIHZhbHVlIGZvciB0aGUgb3B0aW9uCi0gICAgICogdGhhdCByZXByZXNlbnRzIHRoZSBvYmplY3QgdmFsdWUpLiBUaGlzIHNob3VsZCBiZSBpbnZva2VkCi0gICAgICogYmVmb3JlIHJlbmRlcmluZyB0aGlzIFBhbGV0dGVDb2x1bW4uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc29ydEJ5VmFsdWUoKQotICAgIHsKLSAgICAgICAgQ29sbGVjdGlvbnMuc29ydChfb3B0aW9ucywgbmV3IFZhbHVlQ29tcGFyYXRvcigpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTb3J0cyB0aGUgb3B0aW9ucyBieSB0aGUgbGFiZWwgdmlzaWJsZSB0byB0aGUgdXNlci4gVGhpcyBzaG91bGQgYmUgaW52b2tlZAotICAgICAqIGJlZm9yZSByZW5kZXJpbmcgdGhpcyBQYWxldHRlQ29sdW1uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNvcnRCeUxhYmVsKCkKLSAgICB7Ci0gICAgICAgIENvbGxlY3Rpb25zLnNvcnQoX29wdGlvbnMsIG5ldyBMYWJlbENvbXBhcmF0b3IoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVuZGVycyB0aGUgJmx0O3NlbGVjdCZndDsgYW5kICZsdDtvcHRpb24mZ3Q7IHRhZ3MgZm9yCi0gICAgICogdGhpcyBjb2x1bW4uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVuZGVyKElNYXJrdXBXcml0ZXIgd3JpdGVyLCBJUmVxdWVzdEN5Y2xlIGN5Y2xlKQotICAgIHsKLSAgICAgICAgd3JpdGVyLmJlZ2luKCJzZWxlY3QiKTsKLSAgICAgICAgd3JpdGVyLmF0dHJpYnV0ZSgibXVsdGlwbGUiLCAibXVsdGlwbGUiKTsKLSAgICAgICAgd3JpdGVyLmF0dHJpYnV0ZSgibmFtZSIsIF9uYW1lKTsKLSAgICAgICAgd3JpdGVyLmF0dHJpYnV0ZSgic2l6ZSIsIF9yb3dzKTsKLSAgICAgICAgd3JpdGVyLnByaW50bG4oKTsKLQotICAgICAgICBpbnQgY291bnQgPSBfb3B0aW9ucy5zaXplKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgUGFsZXR0ZU9wdGlvbiBvID0gKFBhbGV0dGVPcHRpb24pIF9vcHRpb25zLmdldChpKTsKLQotICAgICAgICAgICAgby5yZW5kZXIod3JpdGVyLCBjeWNsZSk7Ci0gICAgICAgIH0KLQotICAgICAgICB3cml0ZXIuZW5kKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvcGFsZXR0ZS9QYWxldHRlRnVuY3Rpb25zLmpzIGIvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3BhbGV0dGUvUGFsZXR0ZUZ1bmN0aW9ucy5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk3MzUzNi4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvcGFsZXR0ZS9QYWxldHRlRnVuY3Rpb25zLmpzCisrKyAvZGV2L251bGwKQEAgLTEsMTc4ICswLDAgQEAKLS8vICRJZDogUGFsZXR0ZUZ1bmN0aW9ucy5qcyx2IDEuMyAyMDAyLzA1LzAzIDIwOjAzOjA2IGhzaGlwIEV4cCAkDQotLy8gUmVxdWlyZXM6IC9vcmcvYXBhY2hlL3RhcGVzdHJ5L2h0bWwvUHJhY3RpY2FsQnJvd3NlclNuaWZmZXIuanMNCi0NCi1mdW5jdGlvbiBwYWxldHRlX2NsZWFyX3NlbGVjdGlvbnMoZWxlbWVudCkNCi17DQotICB2YXIgb3B0aW9ucyA9IGVsZW1lbnQub3B0aW9uczsNCi0gIA0KLSAgZm9yICh2YXIgaSA9IDA7IGkgPCBvcHRpb25zLmxlbmd0aDsgaSsrKQ0KLSAgICBvcHRpb25zW2ldLnNlbGVjdGVkID0gZmFsc2U7DQotfQ0KLQ0KLWZ1bmN0aW9uIHBhbGV0dGVfc2VsZWN0X2FsbChlbGVtZW50KQ0KLXsNCi0gIHZhciBvcHRpb25zID0gZWxlbWVudC5vcHRpb25zOw0KLQ0KLSAgZm9yICh2YXIgaSA9IDA7IGkgPCBvcHRpb25zLmxlbmd0aDsgaSsrKQ0KLSAgICBvcHRpb25zW2ldLnNlbGVjdGVkID0gdHJ1ZTsNCi19DQotDQotZnVuY3Rpb24gcGFsZXR0ZV9zb3J0KGVsZW1lbnQsIHNvcnRlcikNCi17DQotICB2YXIgb3B0aW9ucyA9IGVsZW1lbnQub3B0aW9uczsNCi0gIHZhciBsaXN0ID0gbmV3IEFycmF5KCk7DQotICB2YXIgaW5kZXggPSAwOw0KLSAgdmFyIGlzTmF2aWdhdG9yID0gKG5hdmlnYXRvci5mYW1pbHkgPT0gIm5uNCIgfHwgbmF2aWdhdG9yLmZhbWlseSA9PSAiZ2Vja28iKTsNCi0gIA0KLSAgd2hpbGUgKG9wdGlvbnMubGVuZ3RoID4gMCkNCi0gIHsNCi0gICAgdmFyIG9wdGlvbiA9IG9wdGlvbnNbMF07DQotICAgICAgICANCi0gICAgaWYgKGlzTmF2aWdhdG9yKQ0KLSAgICB7DQotICAgICAgLy8gQ2FuJ3QgdHJhbnNmZXIgb3B0aW9uIGluIG5uNCwgbm42DQotICAgICAgDQotICAgICBpZiAobmF2aWdhdG9yLmZhbWlseSA9PSAnZ2Vja28nKQ0KLSAgICAgIAl2YXIgY29weSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIk9QVElPTiIpOw0KLSAgICAgZWxzZQ0KLSAgICAgICAgdmFyIGNvcHkgPSBuZXcgT3B0aW9uKG9wdGlvbi50ZXh0LCBvcHRpb24udmFsdWUpOw0KLQ0KLSAgICAgIAljb3B5LnRleHQgPSBvcHRpb24udGV4dDsNCi0gICAgICAJY29weS52YWx1ZSA9IG9wdGlvbi52YWx1ZTsNCi0gICAgICAJY29weS5zZWxlY3RlZCA9IG9wdGlvbnMuc2VsZWN0ZWQ7DQotICAgICAgCQ0KLSAgICAgIGxpc3RbaW5kZXgrK10gPSBjb3B5Ow0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgICBsaXN0W2luZGV4KytdID0gb3B0aW9uOw0KLQ0KLSAgICANCi0gICAgb3B0aW9uc1swXSA9IG51bGw7DQotICB9DQotICANCi0gIGxpc3Quc29ydChzb3J0ZXIpOw0KLSAgDQotICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspDQotICB7DQotICAgIG9wdGlvbnNbaV0gPSBsaXN0W2ldOyANCi0gIH0NCi0NCi0NCi19DQotDQotZnVuY3Rpb24gcGFsZXR0ZV9sYWJlbF9zb3J0ZXIoYSwgYikNCi17DQotICB2YXIgYV90ZXh0ID0gYS50ZXh0Ow0KLSAgdmFyIGJfdGV4dCA9IGIudGV4dDsNCi0gIA0KLSAgaWYgKGFfdGV4dCA9PSBiX3RleHQpDQotICAgIHJldHVybiAwOw0KLSAgICANCi0gIGlmIChhX3RleHQgPCBiLnRleHQpDQotICAgIHJldHVybiAtMTsNCi0gICAgDQotICByZXR1cm4gMTsNCi19DQotDQotZnVuY3Rpb24gcGFsZXR0ZV9zb3J0X2J5X2xhYmVsKGVsZW1lbnQpDQotew0KLSAgcGFsZXR0ZV9zb3J0KGVsZW1lbnQsIHBhbGV0dGVfbGFiZWxfc29ydGVyKTsNCi19DQotDQotZnVuY3Rpb24gcGFsZXR0ZV92YWx1ZV9zb3J0ZXIoYSwgYikNCi17DQotICB2YXIgYV92YWx1ZSA9IGEudmFsdWU7DQotICB2YXIgYl92YWx1ZSA9IGIudmFsdWU7DQotICANCi0gIGlmIChhX3ZhbHVlID09IGJfdmFsdWUpDQotICAgIHJldHVybiAwOw0KLSAgICANCi0gIGlmIChhX3ZhbHVlIDwgYl92YWx1ZSkNCi0gICAgcmV0dXJuIC0xOw0KLSAgICANCi0gIHJldHVybiAxOw0KLX0NCi0NCi1mdW5jdGlvbiBwYWxldHRlX3NvcnRfYnlfdmFsdWUoZWxlbWVudCkNCi17DQotICBwYWxldHRlX3NvcnQoZWxlbWVudCwgcGFsZXR0ZV92YWx1ZV9zb3J0ZXIpOw0KLX0NCi0gIA0KLWZ1bmN0aW9uIHBhbGV0dGVfdHJhbnNmZXJfc2VsZWN0aW9ucyhzb3VyY2UsIHRhcmdldCkNCi17DQotICB2YXIgc291cmNlT3B0aW9ucyA9IHNvdXJjZS5vcHRpb25zOw0KLSAgdmFyIHRhcmdldE9wdGlvbnMgPSB0YXJnZXQub3B0aW9uczsNCi0gIA0KLSAgdmFyIHRhcmdldEluZGV4ID0gdGFyZ2V0LnNlbGVjdGVkSW5kZXg7DQotICB2YXIgb2Zmc2V0ID0gMDsNCi0gIA0KLSAgcGFsZXR0ZV9jbGVhcl9zZWxlY3Rpb25zKHRhcmdldCk7DQotICANCi0gIGZvciAodmFyIGkgPSAwOyBpIDwgc291cmNlT3B0aW9ucy5sZW5ndGg7IGkrKykNCi0gIHsNCi0gICAgdmFyIG9wdGlvbiA9IHNvdXJjZU9wdGlvbnNbaV07DQotICAgIA0KLSAgICBpZiAob3B0aW9uLnNlbGVjdGVkKQ0KLSAgICB7DQotDQotICAgICAgIGlmIChuYXZpZ2F0b3IuZmFtaWx5ID09ICdubjQnIHx8IG5hdmlnYXRvci5mYW1pbHkgPT0gJ2dlY2tvJykNCi0gICAgICAgew0KLSAgICAgICAgICAgLy8gQ2FuJ3Qgc2hhcmUgb3B0aW9ucyBiZXR3ZWVuIHNlbGVjdHMgaW4gTk40DQotICAgICAgICAgICANCi0gICAgICAgICAgIHZhciBuZXdPcHRpb24gPSBuZXcgT3B0aW9uKG9wdGlvbi50ZXh0LCBvcHRpb24udmFsdWUsIGZhbHNlLCB0cnVlKTsNCi0gDQotICAgICAgICAgICBzb3VyY2VPcHRpb25zW2ldID0gbnVsbDsNCi0gICAgICANCi0gICAgICAgICAgLy8gQWx3YXlzIGFkZGVkIHRvIGVuZCBpbiBOTjQNCi0gICAgICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgdGFyZ2V0T3B0aW9uc1t0YXJnZXRPcHRpb25zLmxlbmd0aF0gPSBuZXdPcHRpb247DQotICAgICAgIH0NCi0gICAgICAgZWxzZQ0KLSAgICAgICB7ICANCi0gICAgICAgICBzb3VyY2VPcHRpb25zLnJlbW92ZShpKTsNCi0gICAgICAgICANCi0gICAgICAgICBpZiAodGFyZ2V0SW5kZXggPCAwKQ0KLSAgICAgICAgICAgdGFyZ2V0T3B0aW9ucy5hZGQob3B0aW9uKTsNCi0gICAgICAgICBlbHNlDQotICAgICAgICAgICB0YXJnZXRPcHRpb25zLmFkZChvcHRpb24sIHRhcmdldEluZGV4ICsgb2Zmc2V0KyspOw0KLSAgICAgIH0NCi0gICAgDQotICAgICAgaS0tOw0KLSAgICB9DQotICB9DQotDQotfQ0KLQ0KLWZ1bmN0aW9uIHBhbGV0dGVfc3dhcF9vcHRpb25zKG9wdGlvbnMsIHNlbGVjdGVkSW5kZXgsIHRhcmdldEluZGV4KQ0KLXsNCi0gIHZhciBvcHRpb24gPSBvcHRpb25zW3NlbGVjdGVkSW5kZXhdOw0KLQ0KLSAgLy8gSXQncyB2ZXJ5IGhhcmQgdG8gcmVvcmRlciBvcHRpb25zIGluIE5ONA0KLSAgDQotICBpZiAobmF2aWdhdG9yLmZhbWlseSA9PSAnbm40JyB8fCBuYXZpZ2F0b3IuZmFtaWx5ID09ICdnZWNrbycpDQotICB7DQotICAgIHZhciBzd2FwID0gb3B0aW9uc1t0YXJnZXRJbmRleF07DQotICAgIA0KLSAgICB2YXIgaG9sZCA9IHN3YXAudGV4dDsNCi0gICAgc3dhcC50ZXh0ID0gb3B0aW9uLnRleHQ7DQotICAgIG9wdGlvbi50ZXh0ID0gaG9sZDsNCi0gICAgDQotICAgIGhvbGQgPSBzd2FwLnZhbHVlOw0KLSAgICBzd2FwLnZhbHVlID0gb3B0aW9uLnZhbHVlOw0KLSAgICBvcHRpb24udmFsdWUgPSBob2xkOw0KLSAgICANCi0gICAgaG9sZCA9IHN3YXAuc2VsZWN0ZWQ7DQotICAgIHN3YXAuc2VsZWN0ZWQgPSBvcHRpb24uc2VsZWN0ZWQ7DQotICAgIG9wdGlvbi5zZWxlY3RlZCA9IGhvbGQ7DQotICAgIA0KLSAgICAvLyBkZWZhdWx0U2VsZWN0ZWQgaXNuJ3QgcmVsZXZhbnQgdG8gdGhlIFBhbGV0dGUNCi0gICAgDQotICAgIHJldHVybjsNCi0gIH0NCi0gIA0KLSAgLy8gU2Vuc2libGUgYnJvd3NlcnMgLi4uDQotICANCi0gIG9wdGlvbnMucmVtb3ZlKHNlbGVjdGVkSW5kZXgpOw0KLSAgb3B0aW9ucy5hZGQob3B0aW9uLCB0YXJnZXRJbmRleCk7DQotfQ0KLQ0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9wYWxldHRlL1BhbGV0dGVPcHRpb24uamF2YSBiL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9wYWxldHRlL1BhbGV0dGVPcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGMyZDQ3OC4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvcGFsZXR0ZS9QYWxldHRlT3B0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnBhbGV0dGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklNYXJrdXBXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVuZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlcXVlc3RDeWNsZTsKLQotLyoqCi0gKiBVc2VkIHRvIGhvbGQgb3B0aW9ucyBlZGl0YWJsZSBieSBhIFBhbGV0dGUgY29tcG9uZW50LCBzbyB0aGF0IHRoZXkgbWF5Ci0gKiBiZSBzb3J0ZWQgaW50byBhbiBhcHByb3ByaWF0ZSBvcmRlci4KLSAqCi0gKiBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiBAdmVyc2lvbiAkSWQkCi0gKi8KLXB1YmxpYyBjbGFzcyBQYWxldHRlT3B0aW9uIGltcGxlbWVudHMgSVJlbmRlcgotewotICAgIHByaXZhdGUgU3RyaW5nIF92YWx1ZTsKLSAgICBwcml2YXRlIFN0cmluZyBfbGFiZWw7Ci0KLSAgICBwdWJsaWMgUGFsZXR0ZU9wdGlvbihTdHJpbmcgdmFsdWUsIFN0cmluZyBsYWJlbCkKLSAgICB7Ci0gICAgICAgIF92YWx1ZSA9IHZhbHVlOwotICAgICAgICBfbGFiZWwgPSBsYWJlbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZW5kZXIoSU1hcmt1cFdyaXRlciB3cml0ZXIsIElSZXF1ZXN0Q3ljbGUgY3ljbGUpCi0gICAgewotICAgICAgICB3cml0ZXIuYmVnaW4oIm9wdGlvbiIpOwotICAgICAgICB3cml0ZXIuYXR0cmlidXRlKCJ2YWx1ZSIsIF92YWx1ZSk7Ci0gICAgICAgIHdyaXRlci5wcmludChfbGFiZWwpOwotICAgICAgICB3cml0ZXIuZW5kKCk7IC8vIDxvcHRpb24+Ci0gICAgICAgIHdyaXRlci5wcmludGxuKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRMYWJlbCgpCi0gICAgewotICAgICAgICByZXR1cm4gX2xhYmVsOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF92YWx1ZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9wYWxldHRlL1NvcnRNb2RlLmphdmEgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvcGFsZXR0ZS9Tb3J0TW9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjhjMDgyLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9wYWxldHRlL1NvcnRNb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnBhbGV0dGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5lbnVtLkVudW07Ci0KLS8qKgotICogIERlZmluZXMgZGlmZmVyZW50IHNvcnRpbmcgc3RyYXRlZ2llcyBmb3IgdGhlIHtAbGluayBQYWxldHRlfSBjb21wb25lbnQuCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAKLSAqKi8KLQotcHVibGljIGNsYXNzIFNvcnRNb2RlIGV4dGVuZHMgRW51bQotewotICAgIC8qKgotICAgICAqICBTb3J0aW5nIGlzIG5vdCByZWxldmFudCBhbmQgbm8gc29ydCBjb250cm9scyBzaG91bGQgYmUgdmlzaWJsZS4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU29ydE1vZGUgTk9ORSA9IG5ldyBTb3J0TW9kZSgiTk9ORSIpOwotCi0gICAgLyoqCi0gICAgICogT3B0aW9ucyBzaG91bGQgYmUgc29ydGVkIGJ5IHRoZWlyIGxhYmVsLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTb3J0TW9kZSBMQUJFTCA9IG5ldyBTb3J0TW9kZSgiTEFCRUwiKTsKLQotICAgIC8qKgotICAgICAqICBPcHRpb25zIHNob3VsZCBiZSBzb3J0ZWQgYnkgdGhpZXIgdmFsdWUuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNvcnRNb2RlIFZBTFVFID0gbmV3IFNvcnRNb2RlKCJWQUxVRSIpOwotCi0gICAgLyoqCi0gICAgICogIFRoZSB1c2VyIGNvbnRyb2xzIHNvcnQgb3JkZXI7IGFkZGl0aW9uYWwgY29udHJvbHMgYXJlIGFkZGVkCi0gICAgICogIHRvIGFsbG93IHRoZSB1c2VyIHRvIGNvbnRyb2wgdGhlIG9yZGVyIG9mIG9wdGlvbnMgaW4gdGhlCi0gICAgICogIHNlbGVjdGVkIGxpc3QuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNvcnRNb2RlIFVTRVIgPSBuZXcgU29ydE1vZGUoIlVTRVIiKTsKLQotICAgIHByaXZhdGUgU29ydE1vZGUoU3RyaW5nIG5hbWUpCi0gICAgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvcGFsZXR0ZS9kZXNlbGVjdF9sZWZ0LmdpZiBiL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9wYWxldHRlL2Rlc2VsZWN0X2xlZnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTQwZTAxLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9wYWxldHRlL2Rlc2VsZWN0X2xlZnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3BhbGV0dGUvZGVzZWxlY3RfbGVmdF9vZmYuZ2lmIGIvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3BhbGV0dGUvZGVzZWxlY3RfbGVmdF9vZmYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGRjOTQ1Li4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9wYWxldHRlL2Rlc2VsZWN0X2xlZnRfb2ZmLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9wYWxldHRlL21vdmVfZG93bi5naWYgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvcGFsZXR0ZS9tb3ZlX2Rvd24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmIwMDg4Li4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9wYWxldHRlL21vdmVfZG93bi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvcGFsZXR0ZS9tb3ZlX2Rvd25fb2ZmLmdpZiBiL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9wYWxldHRlL21vdmVfZG93bl9vZmYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzRiYWViLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9wYWxldHRlL21vdmVfZG93bl9vZmYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3BhbGV0dGUvbW92ZV91cC5naWYgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvcGFsZXR0ZS9tb3ZlX3VwLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzExYzg2YS4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvcGFsZXR0ZS9tb3ZlX3VwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9wYWxldHRlL21vdmVfdXBfb2ZmLmdpZiBiL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9wYWxldHRlL21vdmVfdXBfb2ZmLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTIzYTQzZi4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvcGFsZXR0ZS9tb3ZlX3VwX29mZi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvcGFsZXR0ZS9zZWxlY3RfcmlnaHQuZ2lmIGIvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3BhbGV0dGUvc2VsZWN0X3JpZ2h0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzRlOTBjMy4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvcGFsZXR0ZS9zZWxlY3RfcmlnaHQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3BhbGV0dGUvc2VsZWN0X3JpZ2h0X29mZi5naWYgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvcGFsZXR0ZS9zZWxlY3RfcmlnaHRfb2ZmLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDUyY2U1MC4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvcGFsZXR0ZS9zZWxlY3RfcmlnaHRfb2ZmLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9wb3B1cC9Qb3B1cExpbmsuaHRtbCBiL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9wb3B1cC9Qb3B1cExpbmsuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjNkNWVkNS4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvcG9wdXAvUG9wdXBMaW5rLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLTwhLS0gJElkJCAtLT4KLTxzcGFuIGp3Y2lkPSJwb3BvdXRTY3JpcHQiLz4KLTxzcGFuIGp3Y2lkPSJsaW5rIj48c3BhbiBqd2NpZD0id3JhcHBlZCIvPjwvc3Bhbj4KZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9wb3B1cC9Qb3B1cExpbmsuamF2YSBiL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9wb3B1cC9Qb3B1cExpbmsuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjgxMDA3Ny4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvcG9wdXAvUG9wdXBMaW5rLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi5wb3B1cDsKLQotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2RlYy5uZXQuVVJMQ29kZWM7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5BcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5CYXNlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUJpbmRpbmc7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5UYXBlc3RyeTsKLQotLyoqCi0gKiBUaGlzIGNvbXBvbmVudCBwcm92aWRlcyBhIHBvcHVwIGxpbmsgdG8gbGF1bmNoIGEgbmV3IHdpbmRvdyB1c2luZyBhIGdpdmVuCi0gKiBocmVmLCB3aW5kb3dOYW1lIGFuZCB3aW5kb3dGZWF0dXJlcyBmb3IgdGhlIGphdmFzY3JpcHQgZnVuY3Rpb246Ci0gKiA8dHQ+d2luZG93Lm9wZW4oVVJMLCB3aW5kb3dOYW1lLCB3aW5kb3dGZWF0dXJlcyk8L3R0Pi4KLSAqCi0gKiAgWzxhIGhyZWY9Ii4uLy4uLy4uLy4uLy4uLy4uL0NvbXBvbmVudFJlZmVyZW5jZS9jb250cmliLlBvcHVwTGluay5odG1sIj5Db21wb25lbnQgUmVmZXJlbmNlPC9hPl0KLSAqIAotICogQHZlcnNpb24gJElkJCAKLSAqIEBhdXRob3IgSm9lIFBhbmljbwotICovCi1wdWJsaWMgY2xhc3MgUG9wdXBMaW5rIGV4dGVuZHMgQmFzZUNvbXBvbmVudAotewotCS8qKiBUaGUgZGVmYXVsdCBwb3B1cCB3aW5kb3cgbmFtZSAncG9wdXBsaW5rX3dpbmRvdycuICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9XSU5ET1dfTkFNRSA9ICJwb3B1cGxpbmtfd2luZG93IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBVUkxDb2RlYyBfdXJsQ29kZWMgPSBuZXcgVVJMQ29kZWMoKTsKLQotCS8vCUluc3RhbmNlIHZhcmlhYmxlcwotCXByaXZhdGUgSUJpbmRpbmcgX2hyZWZCaW5kaW5nOwotCXByaXZhdGUgSUJpbmRpbmcgX3dpbmRvd05hbWVCaW5kaW5nOwotCXByaXZhdGUgSUJpbmRpbmcgX2ZlYXR1cmVzQmluZGluZzsKLQotCXB1YmxpYyBJQmluZGluZyBnZXRIcmVmQmluZGluZygpCi0JewotCQlyZXR1cm4gX2hyZWZCaW5kaW5nOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEhyZWZCaW5kaW5nKElCaW5kaW5nIGhyZWZCaW5kaW5nKQotCXsKLQkJX2hyZWZCaW5kaW5nID0gaHJlZkJpbmRpbmc7Ci0JfQotCi0JcHVibGljIElCaW5kaW5nIGdldFdpbmRvd05hbWVCaW5kaW5nKCkKLQl7Ci0JCXJldHVybiBfd2luZG93TmFtZUJpbmRpbmc7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0V2luZG93TmFtZUJpbmRpbmcoSUJpbmRpbmcgd2luZG93TmFtZUJpbmRpbmcpCi0JewotCQlfd2luZG93TmFtZUJpbmRpbmcgPSB3aW5kb3dOYW1lQmluZGluZzsKLQl9Ci0KLQlwdWJsaWMgSUJpbmRpbmcgZ2V0RmVhdHVyZXNCaW5kaW5nKCkKLQl7Ci0JCXJldHVybiBfZmVhdHVyZXNCaW5kaW5nOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZlYXR1cmVzQmluZGluZyhJQmluZGluZyBmZWF0dXJlc0JpbmRpbmcpCi0JewotCQlfZmVhdHVyZXNCaW5kaW5nID0gZmVhdHVyZXNCaW5kaW5nOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SHJlZigpCi0JewotCQlJQmluZGluZyBhSHJlZkJpbmRpbmcgPSBnZXRIcmVmQmluZGluZygpOwotCi0JCWlmIChhSHJlZkJpbmRpbmcgIT0gbnVsbCkKLQkJewotICAgICAgICAgICAgU3RyaW5nIGVuY29kaW5nID0gZ2V0UGFnZSgpLmdldEVuZ2luZSgpLmdldE91dHB1dEVuY29kaW5nKCk7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gX3VybENvZGVjLmVuY29kZShhSHJlZkJpbmRpbmcuZ2V0U3RyaW5nKCksIGVuY29kaW5nKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgVGFwZXN0cnkuZm9ybWF0KCJpbGxlZ2FsLWVuY29kaW5nIiwgZW5jb2RpbmcpLAotICAgICAgICAgICAgICAgICAgICBlKTsKLSAgICAgICAgICAgIH0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0V2luZG93TmFtZSgpCi0JewotCQlJQmluZGluZyBhV2luZG93TmFtZUJpbmRpbmcgPSBnZXRXaW5kb3dOYW1lQmluZGluZygpOwotCQlpZiAoYVdpbmRvd05hbWVCaW5kaW5nICE9IG51bGwpCi0JCXsKLQkJCXJldHVybiBhV2luZG93TmFtZUJpbmRpbmcuZ2V0U3RyaW5nKCk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlyZXR1cm4gREVGQVVMVF9XSU5ET1dfTkFNRTsKLQkJfQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RmVhdHVyZXMoKQotCXsKLQkJSUJpbmRpbmcgYUZlYXR1cmVzQmluZGluZyA9IGdldEZlYXR1cmVzQmluZGluZygpOwotCQlpZiAoYUZlYXR1cmVzQmluZGluZyAhPSBudWxsKQotCQl7Ci0JCQlyZXR1cm4gYUZlYXR1cmVzQmluZGluZy5nZXRTdHJpbmcoKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXJldHVybiAiIjsKLQkJfQotCX0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldFBvcHVwRnVuY3Rpb25OYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRJZFBhdGgoKS5yZXBsYWNlKCcuJywgJ18nKSArICJfcG9wdXAiOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9wb3B1cC9Qb3B1cExpbmsuandjIGIvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3BvcHVwL1BvcHVwTGluay5qd2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxZTlmYzQuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3BvcHVwL1BvcHVwTGluay5qd2MKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gIAotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTwhLS0gJElkJCAtLT4KLTwhRE9DVFlQRSBjb21wb25lbnQtc3BlY2lmaWNhdGlvbiBQVUJMSUMgCi0gICItLy9BcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi8vVGFwZXN0cnkgU3BlY2lmaWNhdGlvbiAzLjAvL0VOIiAKLSAgImh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvdGFwZXN0cnkvZHRkL1RhcGVzdHJ5XzNfMC5kdGQiPgotCi08Y29tcG9uZW50LXNwZWNpZmljYXRpb24gY2xhc3M9Im9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi5wb3B1cC5Qb3B1cExpbmsiIGFsbG93LWJvZHk9InllcyIgYWxsb3ctaW5mb3JtYWwtcGFyYW1ldGVycz0ieWVzIj4KLQotCTxwYXJhbWV0ZXIgbmFtZT0iaHJlZiIgdHlwZT0iU3RyaW5nIiBkaXJlY3Rpb249ImN1c3RvbSIgcmVxdWlyZWQ9InllcyIvPgotCTxwYXJhbWV0ZXIgbmFtZT0id2luZG93TmFtZSIgdHlwZT0iU3RyaW5nIiBkaXJlY3Rpb249ImN1c3RvbSIgcmVxdWlyZWQ9Im5vIi8+Ci0JPHBhcmFtZXRlciBuYW1lPSJmZWF0dXJlcyIgdHlwZT0iU3RyaW5nIiBkaXJlY3Rpb249ImN1c3RvbSIgcmVxdWlyZWQ9Im5vIi8+Ci0KLQk8Y29tcG9uZW50IGlkPSJwb3BvdXRTY3JpcHQiIHR5cGU9IlNjcmlwdCI+Ci0JCTxiaW5kaW5nIG5hbWU9InNjcmlwdCIgZXhwcmVzc2lvbj0nInBvcHVwLnNjcmlwdCInLz4KLQkJPGJpbmRpbmcgbmFtZT0icG9wdXBGdW5jdGlvbk5hbWUiIGV4cHJlc3Npb249InBvcHVwRnVuY3Rpb25OYW1lIi8+Ci0gICAgICAgIDxiaW5kaW5nIG5hbWU9InVybCIgZXhwcmVzc2lvbj0iaHJlZiIvPgotCQk8YmluZGluZyBuYW1lPSJ3aW5kb3dOYW1lIiBleHByZXNzaW9uPSJ3aW5kb3dOYW1lIi8+Ci0gICAgICAgIDxiaW5kaW5nIG5hbWU9ImZlYXR1cmVzIiBleHByZXNzaW9uPSJmZWF0dXJlcyIvPgotCTwvY29tcG9uZW50PgotCi0gIAk8Y29tcG9uZW50IGlkPSJsaW5rIiB0eXBlPSJBbnkiIGluaGVyaXQtaW5mb3JtYWwtcGFyYW1ldGVycz0ieWVzIj4KLSAgICAgICAgPGJpbmRpbmcgbmFtZT0iZWxlbWVudCIgZXhwcmVzc2lvbj0nImEiJy8+Ci0gICAgICAgIDxiaW5kaW5nIG5hbWU9ImhyZWYiIGV4cHJlc3Npb249JyJqYXZhc2NyaXB0OiIgKyBwb3B1cEZ1bmN0aW9uTmFtZSArICIoKTsiJy8+Ci0gIAk8L2NvbXBvbmVudD4KLQotCTxjb21wb25lbnQgaWQ9IndyYXBwZWQiIHR5cGU9IlJlbmRlckJvZHkiLz4KLQotPC9jb21wb25lbnQtc3BlY2lmaWNhdGlvbj4KZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9wb3B1cC9wb3B1cC5zY3JpcHQgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvcG9wdXAvcG9wdXAuc2NyaXB0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDM1NjY5Li4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi9wb3B1cC9wb3B1cC5zY3JpcHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0gJElkJCAtLT4KLTwhRE9DVFlQRSBzY3JpcHQgUFVCTElDIAotCSItLy9Ib3dhcmQgU2hpcC8vVGFwZXN0cnkgU2NyaXB0IDEuMS8vRU4iCi0JImh0dHA6Ly90YXBlc3RyeS5zZi5uZXQvZHRkL1NjcmlwdF8xXzEuZHRkIj4KLQotPHNjcmlwdD4KLQotPGJvZHk+Ci1mdW5jdGlvbiAke3BvcHVwRnVuY3Rpb25OYW1lfSgpCi17Ci0JYVdpbmRvdyA9IHdpbmRvdy5vcGVuKCcke3VybH0nLCAnJHt3aW5kb3dOYW1lfScsICcke2ZlYXR1cmVzfScsIGZhbHNlKTsKLQlhV2luZG93LmZvY3VzKCk7Ci19Ci08L2JvZHk+Ci0KLTwvc2NyaXB0PgpkaWZmIC0tZ2l0IGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL2NvbXBvbmVudHMvQWJzdHJhY3RUYWJsZVJvd0NvbXBvbmVudC5qYXZhIGIvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL2NvbXBvbmVudHMvQWJzdHJhY3RUYWJsZVJvd0NvbXBvbmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTAxMTc3Li4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90YWJsZS9jb21wb25lbnRzL0Fic3RyYWN0VGFibGVSb3dDb21wb25lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUuY29tcG9uZW50czsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlcXVlc3RDeWNsZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuSVRhYmxlUm93U291cmNlOwotCi0vKioKLSAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIGZvciBhIGNvbXBvbmVudCB0aGF0IGlzIHdyYXBwZWQgYnkgCi0gKiB0aGUgVGFibGVSb3dzIGNvbXBvbmVudC4gUHJvdmlkZXMgYSB1dGlsaXR5IG1ldGhvZCBmb3IgZ2V0dGluZyAKLSAqIGEgcG9pbnRlciB0byBUYWJsZVJvd3MuIAotICogCi0gKiBAYXV0aG9yIG1pbmRicmlkZ2UKLSAqIEB2ZXJzaW9uICRJZCQKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBBYnN0cmFjdFRhYmxlUm93Q29tcG9uZW50IGV4dGVuZHMgQWJzdHJhY3RUYWJsZVZpZXdDb21wb25lbnQKLXsKLSAgICBwdWJsaWMgSVRhYmxlUm93U291cmNlIGdldFRhYmxlUm93U291cmNlKCkKLSAgICB7Ci0gICAgICAgIElSZXF1ZXN0Q3ljbGUgb2JqQ3ljbGUgPSBnZXRQYWdlKCkuZ2V0UmVxdWVzdEN5Y2xlKCk7Ci0KLSAgICAgICAgT2JqZWN0IG9ialNvdXJjZU9iaiA9IG9iakN5Y2xlLmdldEF0dHJpYnV0ZShJVGFibGVSb3dTb3VyY2UuVEFCTEVfUk9XX1NPVVJDRV9BVFRSSUJVVEUpOwotICAgICAgICBJVGFibGVSb3dTb3VyY2Ugb2JqU291cmNlID0gKElUYWJsZVJvd1NvdXJjZSkgb2JqU291cmNlT2JqOwotCi0gICAgICAgIGlmIChvYmpTb3VyY2UgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgIlRoZSBjb21wb25lbnQgIgotICAgICAgICAgICAgICAgICAgICArIGdldElkKCkKLSAgICAgICAgICAgICAgICAgICAgKyAiIG11c3QgYmUgY29udGFpbmVkIHdpdGhpbiBhbiBJVGFibGVSb3dTb3VyY2UgY29tcG9uZW50LCBzdWNoIGFzIFRhYmxlUm93cyIsCi0gICAgICAgICAgICAgICAgdGhpcywKLSAgICAgICAgICAgICAgICBudWxsLAotICAgICAgICAgICAgICAgIG51bGwpOwotCi0gICAgICAgIHJldHVybiBvYmpTb3VyY2U7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdGFibGUvY29tcG9uZW50cy9BYnN0cmFjdFRhYmxlVmlld0NvbXBvbmVudC5qYXZhIGIvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL2NvbXBvbmVudHMvQWJzdHJhY3RUYWJsZVZpZXdDb21wb25lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ2NDU2ZC4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdGFibGUvY29tcG9uZW50cy9BYnN0cmFjdFRhYmxlVmlld0NvbXBvbmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5jb21wb25lbnRzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5BcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5CYXNlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlcXVlc3RDeWNsZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuSVRhYmxlTW9kZWxTb3VyY2U7Ci0KLS8qKgotICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gZm9yIGEgY29tcG9uZW50IHRoYXQgaXMgd3JhcHBlZCBieSAKLSAqIHRoZSBUYWJsZVZpZXcgY29tcG9uZW50LiBQcm92aWRlcyBhIHV0aWxpdHkgbWV0aG9kIGZvciBnZXR0aW5nIAotICogYSBwb2ludGVyIHRvIFRhYmxlVmlldy4gCi0gKiAKLSAqIEBhdXRob3IgbWluZGJyaWRnZQotICogQHZlcnNpb24gJElkJAotICoKLSAqLwotcHVibGljIGNsYXNzIEFic3RyYWN0VGFibGVWaWV3Q29tcG9uZW50IGV4dGVuZHMgQmFzZUNvbXBvbmVudAotewotICAgIHB1YmxpYyBJVGFibGVNb2RlbFNvdXJjZSBnZXRUYWJsZU1vZGVsU291cmNlKCkKLSAgICB7Ci0gICAgICAgIElSZXF1ZXN0Q3ljbGUgb2JqQ3ljbGUgPSBnZXRQYWdlKCkuZ2V0UmVxdWVzdEN5Y2xlKCk7Ci0KLSAgICAgICAgSVRhYmxlTW9kZWxTb3VyY2Ugb2JqU291cmNlID0KLSAgICAgICAgICAgIChJVGFibGVNb2RlbFNvdXJjZSkgb2JqQ3ljbGUuZ2V0QXR0cmlidXRlKAotICAgICAgICAgICAgICAgIElUYWJsZU1vZGVsU291cmNlLlRBQkxFX01PREVMX1NPVVJDRV9BVFRSSUJVVEUpOwotCi0gICAgICAgIGlmIChvYmpTb3VyY2UgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgIlRoZSBjb21wb25lbnQgIgotICAgICAgICAgICAgICAgICAgICArIGdldElkKCkKLSAgICAgICAgICAgICAgICAgICAgKyAiIG11c3QgYmUgY29udGFpbmVkIHdpdGhpbiBhbiBJVGFibGVNb2RlbFNvdXJjZSBjb21wb25lbnQsIHN1Y2ggYXMgVGFibGVWaWV3IiwKLSAgICAgICAgICAgICAgICB0aGlzLAotICAgICAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAgICAgbnVsbCk7Ci0KLSAgICAgICAgcmV0dXJuIG9ialNvdXJjZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90YWJsZS9jb21wb25lbnRzL0Zvcm1UYWJsZS5odG1sIGIvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL2NvbXBvbmVudHMvRm9ybVRhYmxlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0YmVmMTkuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL2NvbXBvbmVudHMvRm9ybVRhYmxlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08IS0tICRJZCQgLS0+Ci0KLTxzcGFuIGp3Y2lkPSIkY29udGVudCQiPgotCi08c3BhbiBqd2NpZD0idGFibGVWaWV3Ij4KLQk8c3BhbiBqd2NpZD0iY29uZFBhZ2VzIj48c3BhbiBqd2NpZD0idGFibGVQYWdlcyIvPjwvc3Bhbj4KLQk8dGFibGUgandjaWQ9InRhYmxlRWxlbWVudCI+Ci0JCTx0cj48c3BhbiBqd2NpZD0idGFibGVDb2x1bW5zIi8+PC90cj4KLQkJPHRyIGp3Y2lkPSJ0YWJsZVJvd3MiPjx0ZCBqd2NpZD0idGFibGVWYWx1ZXMiLz48L3RyPgotCTwvdGFibGU+Ci08L3NwYW4+Ci0KLTwvc3Bhbj4KZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90YWJsZS9jb21wb25lbnRzL0Zvcm1UYWJsZS5qYXZhIGIvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL2NvbXBvbmVudHMvRm9ybVRhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1ZGMzMTYuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL2NvbXBvbmVudHMvRm9ybVRhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLmNvbXBvbmVudHM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuSVRhYmxlTW9kZWxTb3VyY2U7Ci0KLS8qKgotICogQSBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSBmYWNhZGUgY29tcG9uZW50IGluIHRoZSBUYWJsZSBmYW1pbHkuIAotICogRm9ybVRhYmxlIGFsbG93cyB5b3UgdG8gcHJlc2VudCBhIHNvcnRhYmxlIGFuZCBwYWdhYmxlIHRhYmxlIAotICogd2l0aGluIGEgZm9ybSBieSB1c2luZyBvbmx5IHRoaXMgb25lIGNvbXBvbmVudC4KLSAqIAotICogIFs8YSBocmVmPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9Db21wb25lbnRSZWZlcmVuY2UvY29udHJpYi5Gb3JtVGFibGUuaHRtbCI+Q29tcG9uZW50IFJlZmVyZW5jZTwvYT5dCi0gKiAKLSAqIEBhdXRob3IgbWluZGJyaWRnZQotICogQHZlcnNpb24gJElkJAotICoKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEZvcm1UYWJsZSBleHRlbmRzIFRhYmxlIGltcGxlbWVudHMgSVRhYmxlTW9kZWxTb3VyY2UKLXsKLSAgICAvLyBwYXJhbWV0ZXJzCi0gICAgcHVibGljIGFic3RyYWN0IE9iamVjdCBnZXRDb2x1bW5zKCk7Ci0KLSAgICAvKioKLSAgICAgKiAgSWYgdGhlIGNvbHVtbnMgYXJlIGRlZmluZWQgdmlhIGEgU3RyaW5nLCBtYWtlIHN1cmUgdGhleSB1c2UgCi0gICAgICogIHRoZSBmb3JtLXNwZWNpZmljIGNvbHVtbiBoZWFkZXJzLgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0Rm9ybUNvbHVtbnMoKQotICAgIHsKLSAgICAgICAgT2JqZWN0IG9iakNvbHVtbnMgPSBnZXRDb2x1bW5zKCk7Ci0gICAgICAgIGlmIChvYmpDb2x1bW5zIGluc3RhbmNlb2YgU3RyaW5nKQotICAgICAgICAgICAgb2JqQ29sdW1ucyA9ICIqIiArIG9iakNvbHVtbnM7Ci0gICAgICAgIHJldHVybiBvYmpDb2x1bW5zOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL2NvbXBvbmVudHMvRm9ybVRhYmxlLmp3YyBiL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90YWJsZS9jb21wb25lbnRzL0Zvcm1UYWJsZS5qd2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwMDNmYjMuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL2NvbXBvbmVudHMvRm9ybVRhYmxlLmp3YworKysgL2Rldi9udWxsCkBAIC0xLDI0NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gIAotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTwhLS0gICRJZCQgLS0+Ci08IURPQ1RZUEUgY29tcG9uZW50LXNwZWNpZmljYXRpb24gUFVCTElDIAotICAiLS8vQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24vL1RhcGVzdHJ5IFNwZWNpZmljYXRpb24gMy4wLy9FTiIgCi0gICJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL3RhcGVzdHJ5L2R0ZC9UYXBlc3RyeV8zXzAuZHRkIj4KLQkKLTxjb21wb25lbnQtc3BlY2lmaWNhdGlvbiBjbGFzcz0ib3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLmNvbXBvbmVudHMuRm9ybVRhYmxlIiAKLQlhbGxvdy1ib2R5PSJ5ZXMiIGFsbG93LWluZm9ybWFsLXBhcmFtZXRlcnM9InllcyI+Ci0KLSAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgIFRoZSBtYWluIFRhYmxlIGNvbXBvbmVudCB0aGF0IGlzIGltcGxlbWVudGVkIHVzaW5nIHRoZSBsb3dlci1sZXZlbCAKLSAgICAgICAgVGFibGUgY29tcG9uZW50cyBzdWNoIGFzIFRhYmxlVmlldyBhbmQgVGFibGVSb3dzLgotICAgICAgICBUaGUgY29tcG9uZW50IGRvZXMgbm90IHJlbmRlciBpdHMgYm9keSwgd2hpY2ggbWFrZXMgaXQgYSBnb29kIHBsYWNlCi0gICAgICAgIHRvIGRlY2xhcmUgQmxvY2tzIGRlZmluaW5nIHRoZSBjb2x1bW4gYXBwZWFyYW5jZXMuCi0gICAgPC9kZXNjcmlwdGlvbj4KLSAgICAKLSAgICA8cGFyYW1ldGVyIG5hbWU9InRhYmxlTW9kZWwiIAotICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuSVRhYmxlTW9kZWwiIAotICAgICAgICByZXF1aXJlZD0ibm8iPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBUaGUgbW9kZWwgZGVzY3JpYmluZyB0aGUgZGF0YSB0byBiZSBwcmVzZW50ZWQgYnkgdGhlIFRhYmxlIGNvbXBvbmVudC4KLSAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGlzIG9wdGlvbmFsLCBidXQgZWl0aGVyIHRoZSAndGFibGVNb2RlbCcgb3IgYm90aAotICAgICAgICAgICAgJ3NvdXJjZScgYW5kICdjb2x1bW5zJyBwYXJhbWV0ZXJzIG11c3QgYmUgcHJvdmlkZWQuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgPC9wYXJhbWV0ZXI+Ci0gICAgCi0gICAgPHBhcmFtZXRlciBuYW1lPSJzb3VyY2UiIHR5cGU9ImphdmEubGFuZy5PYmplY3QiIHJlcXVpcmVkPSJubyI+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIFRoZSBkYXRhIHRvIGJlIGRpc3BsYXllZCBieSB0aGUgY29tcG9uZW50LiBUaGlzIHBhcmFtZXRlciBpcyBhdmFpbGFibGUgYXMKLSAgICAgICAgICAgIGFuIGFsdGVybmF0aXZlIHRvIHRhYmxlTW9kZWwgYW5kIG11c3QgYmUgdXNlZCBpbiBjb21iaW5hdGlvbiB3aXRoIHRoZQotICAgICAgICAgICAgJ2NvbHVtbnMnIHBhcmFtZXRlci4gCi0gICAgICAgICAgICBUaGUgcGFyYW1ldGVyIG11c3QgYmUgYW4gYXJyYXkgb2YgdmFsdWVzLCBhIGNvbGxlY3Rpb24sIGFuIGl0ZXJhdG9yLCAKLSAgICAgICAgICAgIG9yIGFuIG9iamVjdCBpbXBsZW1lbnRpbmcgdGhlIElCYXNpY1RhYmxlTW9kZWwgaW50ZXJmYWNlLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgIDwvcGFyYW1ldGVyPgotICAgIAotICAgIDxwYXJhbWV0ZXIgbmFtZT0iY29sdW1ucyIgdHlwZT0iamF2YS5sYW5nLk9iamVjdCIgcmVxdWlyZWQ9Im5vIiBkaXJlY3Rpb249ImF1dG8iIGRlZmF1bHQtdmFsdWU9Im51bGwiPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBUaGUgdGFibGUgY29sdW1ucyB0byBiZSBkaXNwbGF5ZWQuIAotICAgICAgICAgICAgVGhlIHBhcmFtZXRlciBtdXN0IGJlIGFuIGFycmF5LCBhIGxpc3QsIG9yIGFuIEl0ZXJhdG9yIG9mIElUYWJsZUNvbHVtbiBvYmplY3RzLAotICAgICAgICAgICAgYW4gSVRhYmxlQ29sdW1uTW9kZWwsIG9yIGEgU3RyaW5nIGRlc2NyaWJpbmcgdGhlIGNvbHVtbnMgKHNlZSBkb2N1bWVudGF0aW9uKS4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICA8L3BhcmFtZXRlcj4KLSAgICAKLQk8cGFyYW1ldGVyIG5hbWU9InBhZ2VTaXplIiAKLQkJdHlwZT0iaW50IiAKLQkJcmVxdWlyZWQ9Im5vIj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgVGhlIG51bWJlciBvZiByZWNvcmRzIGRpc3BsYXllZCBwZXIgcGFnZSB3aGVuIHNvdXJjZS9jb2x1bW5zIGFyZSB1c2VkLgotICAgICAgICAgICAgVGhlIHBhZ2Ugc2l6ZSBpcyAxMCBieSBkZWZhdWx0LgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgIDwvcGFyYW1ldGVyPgotICAKLQk8cGFyYW1ldGVyIG5hbWU9ImluaXRpYWxTb3J0Q29sdW1uIiAKLQkJdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgCi0JCXJlcXVpcmVkPSJubyI+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIFRoZSBpZCBvZiB0aGUgY29sdW1uIHRvIGluaXRpYWxseSBzb3J0IHRoZSB0YWJsZSBieS4KLSAgICAgICAgICAgIFRoZSBjb2x1bW4gaXMgc2V0IHRvIG51bGwgYnkgZGVmYXVsdCwgaS5lLiB0aGVyZSBpcyBubyBzb3J0aW5nLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgIDwvcGFyYW1ldGVyPgotICAKLQk8cGFyYW1ldGVyIG5hbWU9ImluaXRpYWxTb3J0T3JkZXIiIAotCQl0eXBlPSJib29sZWFuIiAKLQkJcmVxdWlyZWQ9Im5vIj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgVGhlIG9yZGVyIG9mIHRoZSBpbml0aWFsIHNvcnRpbmcuCi0gICAgICAgICAgICBTZXQgdGhpcyBwYXJhbWV0ZXIgdG8gJ2ZhbHNlJyB0byBzb3J0IGluIGFuIGFzY2VuZGluZyBvcmRlcgotICAgICAgICAgICAgYW5kIHRvICd0cnVlJyB0byBzb3J0IGluIGEgZGVzY2VuZGluZyBvbmUuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgPC9wYXJhbWV0ZXI+Ci0gIAotICAgIDxwYXJhbWV0ZXIgbmFtZT0idGFibGVTZXNzaW9uU3RhdGVNYW5hZ2VyIiAKLSAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsLklUYWJsZVNlc3Npb25TdGF0ZU1hbmFnZXIiIAotICAgICAgICByZXF1aXJlZD0ibm8iPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBUaGUgbWFuYWdlciB0aGF0IGNvbnRyb2xzIHdoYXQgcGFydCBvZiB0aGUgdGFibGUgbW9kZWwgd2lsbCBiZSBzdG9yZWQgaW4gCi0gICAgICAgICAgICB0aGUgc2Vzc2lvbi4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICA8L3BhcmFtZXRlcj4KLSAgICAKLSAgICA8cGFyYW1ldGVyIG5hbWU9InRhYmxlU2Vzc2lvblN0b3JlTWFuYWdlciIgCi0gICAgICAgIHR5cGU9Im9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5tb2RlbC5JVGFibGVTZXNzaW9uU3RvcmVNYW5hZ2VyIiAKLSAgICAgICAgcmVxdWlyZWQ9Im5vIj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgVGhlIG1hbmFnZXIgdGhhdCBjb250cm9scyB3aGVyZSB0aGUgc2Vzc2lvbiBkYXRhIHdpbGwgYmUgc3RvcmVkLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgIDwvcGFyYW1ldGVyPgotICAgIAotICAgIDxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uU2V0dGluZ3NDb250YWluZXIiCi0gICAgICAgIHR5cGU9Im9yZy5hcGFjaGUudGFwZXN0cnkuSUNvbXBvbmVudCIKLSAgICAgICAgcmVxdWlyZWQ9Im5vIgotICAgICAgICBkZWZhdWx0LXZhbHVlPSJjb250YWluZXIiPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBUaGUgY29tcG9uZW50IHdoZXJlIEJsb2NrIGFuZCBtZXNzYWdlcyBhcmUgcHVsbGVkIGZyb20gd2hlbiB1c2luZyBzb3VyY2UvY29sdW1ucy4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICA8L3BhcmFtZXRlcj4KLQotICAgIDxwYXJhbWV0ZXIgbmFtZT0iY29udmVydG9yIgotICAgIAl0eXBlPSJvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuSVByaW1hcnlLZXlDb252ZXJ0b3IiCi0gICAgCXJlcXVpcmVkPSJubyIKLSAgICAJZGlyZWN0aW9uPSJhdXRvIgotICAgIAlkZWZhdWx0LXZhbHVlPSJudWxsIj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICBBbiBpbnRlcmZhY2UgZGVmaW5pbmcgaG93IHRoZSBpdGVtcyBpdGVyYXRlZCB1cG9uIGJ5IHRoaXMgY29tcG9uZW50IAotICAgICAgICB3aWxsIGJlIHN0b3JlZCBpbiB0aGUgZm9ybSBhcyBIaWRkZW4gdmFsdWVzLiBUaGlzIGludGVyZmFjZSBhbGxvd3Mgb25seSAKLSAgICAgICAgdGhlIHByaW1hcnkga2V5IG9mIHRoZSBpdGVtcyB0byBiZSBzdG9yZWQsIHJhdGhlciB0aGFuIHRoZSB3aG9sZSBpdGVtLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgIDwvcGFyYW1ldGVyPgotCi0JPHBhcmFtZXRlciBuYW1lPSJwYWdlc0Rpc3BsYXllZCIgCi0JCXR5cGU9ImludCIgCi0JCXJlcXVpcmVkPSJubyI+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIFRoZSBtYXhpbXVtIG51bWJlciBvZiBwYWdlcyB0aGF0IHdpbGwgYmUgZGlzcGxheWVkIGluIHRoZSBsaXN0IG9mIHRhYmxlIHBhZ2VzLgotICAgICAgICAgICAgQnkgZGVmYXVsdCwgb25seSBzZXZlbiBvZiB0aGUgcGFnZXMgYXJvdW5kIHRoZSBjdXJyZW50IG9uZSBhcmUgc2hvd24uCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgPC9wYXJhbWV0ZXI+Ci0gIAotCTxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uIiAKLQkJdHlwZT0ib3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsLklUYWJsZUNvbHVtbiIgCi0JCXJlcXVpcmVkPSJubyI+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIFRoZSBjb2x1bW4gdGhhdCBpcyBiZWluZyByZW5kZXJlZC4gVGhpcyB2YWx1ZSBpcyB1cGRhdGVkIHdoZW4gYm90aCAKLSAgICAgICAgICAgIHRoZSBjb2x1bW4gaGVhZGVycyBhbmQgY29sdW1uIHZhbHVlcyBhcmUgcmVuZGVyZWQuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgPC9wYXJhbWV0ZXI+Ci0KLQk8cGFyYW1ldGVyIG5hbWU9InJvdyIgCi0JCXR5cGU9Ik9iamVjdCIgCi0JCXJlcXVpcmVkPSJubyIKLQkJZGlyZWN0aW9uPSJjdXN0b20iPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBUaGUgcm93IHRoYXQgaXMgYmVpbmcgcmVuZGVyZWQuIFRoaXMgdmFsdWUgaXMgbnVsbCB3aGVuIAotICAgICAgICAgICAgdGhlIGNvbHVtbiBoZWFkZXJzIGFyZSByZW5kZXJlZC4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICA8L3BhcmFtZXRlcj4KLQotCTxwYXJhbWV0ZXIgbmFtZT0iYXJyb3dVcEFzc2V0IiAKLQkJdHlwZT0ib3JnLmFwYWNoZS50YXBlc3RyeS5JQXNzZXQiIAotCQlyZXF1aXJlZD0ibm8iCi0JCWRpcmVjdGlvbj0iaW4iPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBUaGUgaW1hZ2UgdG8gdXNlIHRvIGRlc2NyaWJlIGEgY29sdW1uIHNvcnRlZCBpbiBhbiBhc2NlbmRpbmcgb3JkZXIuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgPC9wYXJhbWV0ZXI+Ci0KLQk8cGFyYW1ldGVyIG5hbWU9ImFycm93RG93bkFzc2V0IiAKLQkJdHlwZT0ib3JnLmFwYWNoZS50YXBlc3RyeS5JQXNzZXQiIAotCQlyZXF1aXJlZD0ibm8iCi0JCWRpcmVjdGlvbj0iaW4iPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBUaGUgaW1hZ2UgdG8gdXNlIHRvIGRlc2NyaWJlIGEgY29sdW1uIHNvcnRlZCBpbiBhIGRlc2NlbmRpbmcgb3JkZXIuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgPC9wYXJhbWV0ZXI+Ci0KLQk8cGFyYW1ldGVyIG5hbWU9InBhZ2VzQ2xhc3MiIAotCQl0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIiAKLQkJcmVxdWlyZWQ9Im5vIgotCQlkaXJlY3Rpb249ImN1c3RvbSI+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5UaGUgQ1NTIGNsYXNzIG9mIHRoZSB0YWJsZSBwYWdlczwvZGVzY3JpcHRpb24+Ci0gICAgPC9wYXJhbWV0ZXI+Ci0gIAotCTxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uc0NsYXNzIiAKLQkJdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgCi0JCXJlcXVpcmVkPSJubyIKLQkJZGlyZWN0aW9uPSJjdXN0b20iPgotICAgICAgICA8ZGVzY3JpcHRpb24+VGhlIENTUyBjbGFzcyBvZiB0aGUgdGFibGUgY29sdW1uczwvZGVzY3JpcHRpb24+Ci0gICAgPC9wYXJhbWV0ZXI+Ci0gIAotCTxwYXJhbWV0ZXIgbmFtZT0icm93c0NsYXNzIiAKLQkJdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgCi0JCXJlcXVpcmVkPSJubyIKLQkJZGlyZWN0aW9uPSJjdXN0b20iPgotICAgICAgICA8ZGVzY3JpcHRpb24+VGhlIENTUyBjbGFzcyBvZiB0aGUgdGFibGUgcm93czwvZGVzY3JpcHRpb24+Ci0gICAgPC9wYXJhbWV0ZXI+Ci0gIAotCTxwYXJhbWV0ZXIgbmFtZT0idmFsdWVzQ2xhc3MiIAotCQl0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIiAKLQkJcmVxdWlyZWQ9Im5vIgotCQlkaXJlY3Rpb249ImN1c3RvbSI+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5UaGUgQ1NTIGNsYXNzIG9mIHRoZSB0YWJsZSB2YWx1ZXM8L2Rlc2NyaXB0aW9uPgotICAgIDwvcGFyYW1ldGVyPgotICAgIAotCi0JPGNvbXBvbmVudCBpZD0idGFibGVFbGVtZW50IiB0eXBlPSJBbnkiIGluaGVyaXQtaW5mb3JtYWwtcGFyYW1ldGVycz0ieWVzIj4KLQkJPHN0YXRpYy1iaW5kaW5nIG5hbWU9ImVsZW1lbnQiPnRhYmxlPC9zdGF0aWMtYmluZGluZz4KLQk8L2NvbXBvbmVudD4KLQotCTxjb21wb25lbnQgaWQ9ImNvbmRQYWdlcyIgdHlwZT0iRm9ybUNvbmRpdGlvbmFsIj4KLQkJPGJpbmRpbmcgbmFtZT0iY29uZGl0aW9uIiBleHByZXNzaW9uPSJ0YWJsZU1vZGVsLnBhZ2VDb3VudCA+IDEiLz4KLQk8L2NvbXBvbmVudD4KLQotCTxjb21wb25lbnQgaWQ9InRhYmxlVmlldyIgdHlwZT0iVGFibGVWaWV3Ij4KLQkJPGluaGVyaXRlZC1iaW5kaW5nIG5hbWU9InRhYmxlTW9kZWwiIHBhcmFtZXRlci1uYW1lPSJ0YWJsZU1vZGVsIi8+Ci0JCTxpbmhlcml0ZWQtYmluZGluZyBuYW1lPSJzb3VyY2UiIHBhcmFtZXRlci1uYW1lPSJzb3VyY2UiLz4KLQkJPGJpbmRpbmcgbmFtZT0iY29sdW1ucyIgZXhwcmVzc2lvbj0iZm9ybUNvbHVtbnMiLz4KLQkJPGluaGVyaXRlZC1iaW5kaW5nIG5hbWU9InBhZ2VTaXplIiBwYXJhbWV0ZXItbmFtZT0icGFnZVNpemUiLz4KLQkJPGluaGVyaXRlZC1iaW5kaW5nIG5hbWU9ImluaXRpYWxTb3J0Q29sdW1uIiBwYXJhbWV0ZXItbmFtZT0iaW5pdGlhbFNvcnRDb2x1bW4iLz4KLQkJPGluaGVyaXRlZC1iaW5kaW5nIG5hbWU9ImluaXRpYWxTb3J0T3JkZXIiIHBhcmFtZXRlci1uYW1lPSJpbml0aWFsU29ydE9yZGVyIi8+Ci0JCTxpbmhlcml0ZWQtYmluZGluZyBuYW1lPSJ0YWJsZVNlc3Npb25TdGF0ZU1hbmFnZXIiIHBhcmFtZXRlci1uYW1lPSJ0YWJsZVNlc3Npb25TdGF0ZU1hbmFnZXIiLz4KLQkJPGluaGVyaXRlZC1iaW5kaW5nIG5hbWU9InRhYmxlU2Vzc2lvblN0b3JlTWFuYWdlciIgcGFyYW1ldGVyLW5hbWU9InRhYmxlU2Vzc2lvblN0b3JlTWFuYWdlciIvPgotCQk8aW5oZXJpdGVkLWJpbmRpbmcgbmFtZT0iY29sdW1uU2V0dGluZ3NDb250YWluZXIiIHBhcmFtZXRlci1uYW1lPSJjb2x1bW5TZXR0aW5nc0NvbnRhaW5lciIvPgotCQk8c3RhdGljLWJpbmRpbmcgbmFtZT0iZWxlbWVudCI+c3Bhbjwvc3RhdGljLWJpbmRpbmc+Ci0JPC9jb21wb25lbnQ+Ci0KLQk8Y29tcG9uZW50IGlkPSJ0YWJsZVBhZ2VzIiB0eXBlPSJUYWJsZUZvcm1QYWdlcyI+Ci0JCTxpbmhlcml0ZWQtYmluZGluZyBuYW1lPSJwYWdlc0Rpc3BsYXllZCIgcGFyYW1ldGVyLW5hbWU9InBhZ2VzRGlzcGxheWVkIi8+Ci0JCTxpbmhlcml0ZWQtYmluZGluZyBuYW1lPSJjbGFzcyIgcGFyYW1ldGVyLW5hbWU9InBhZ2VzQ2xhc3MiLz4KLQk8L2NvbXBvbmVudD4KLQotCTxjb21wb25lbnQgaWQ9InRhYmxlQ29sdW1ucyIgdHlwZT0iVGFibGVDb2x1bW5zIj4KLQkJPGluaGVyaXRlZC1iaW5kaW5nIG5hbWU9ImNvbHVtbiIgcGFyYW1ldGVyLW5hbWU9ImNvbHVtbiIvPgotCQk8aW5oZXJpdGVkLWJpbmRpbmcgbmFtZT0iY2xhc3MiIHBhcmFtZXRlci1uYW1lPSJjb2x1bW5zQ2xhc3MiLz4KLSAgICAgICAgPGluaGVyaXRlZC1iaW5kaW5nIG5hbWU9ImFycm93VXBBc3NldCIgcGFyYW1ldGVyLW5hbWU9ImFycm93VXBBc3NldCIvPgotICAgICAgICA8aW5oZXJpdGVkLWJpbmRpbmcgbmFtZT0iYXJyb3dEb3duQXNzZXQiIHBhcmFtZXRlci1uYW1lPSJhcnJvd0Rvd25Bc3NldCIvPgotCTwvY29tcG9uZW50PgotCi0JPGNvbXBvbmVudCBpZD0idGFibGVSb3dzIiB0eXBlPSJUYWJsZUZvcm1Sb3dzIj4KLQkJPGluaGVyaXRlZC1iaW5kaW5nIG5hbWU9InJvdyIgcGFyYW1ldGVyLW5hbWU9InJvdyIvPgotCQk8aW5oZXJpdGVkLWJpbmRpbmcgbmFtZT0iY2xhc3MiIHBhcmFtZXRlci1uYW1lPSJyb3dzQ2xhc3MiLz4KLSAgICA8aW5oZXJpdGVkLWJpbmRpbmcgbmFtZT0iY29udmVydG9yIiBleHByZXNzaW9uPSJjb252ZXJ0b3IiLz4KLQk8L2NvbXBvbmVudD4KLQotCTxjb21wb25lbnQgaWQ9InRhYmxlVmFsdWVzIiB0eXBlPSJUYWJsZVZhbHVlcyI+Ci0JCTxpbmhlcml0ZWQtYmluZGluZyBuYW1lPSJjb2x1bW4iIHBhcmFtZXRlci1uYW1lPSJjb2x1bW4iLz4KLQkJPGluaGVyaXRlZC1iaW5kaW5nIG5hbWU9ImNsYXNzIiBwYXJhbWV0ZXItbmFtZT0idmFsdWVzQ2xhc3MiLz4KLQk8L2NvbXBvbmVudD4KLSAgCi08L2NvbXBvbmVudC1zcGVjaWZpY2F0aW9uPgpkaWZmIC0tZ2l0IGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL2NvbXBvbmVudHMvVGFibGUuaHRtbCBiL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90YWJsZS9jb21wb25lbnRzL1RhYmxlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0YmVmMTkuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL2NvbXBvbmVudHMvVGFibGUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTwhLS0gJElkJCAtLT4KLQotPHNwYW4gandjaWQ9IiRjb250ZW50JCI+Ci0KLTxzcGFuIGp3Y2lkPSJ0YWJsZVZpZXciPgotCTxzcGFuIGp3Y2lkPSJjb25kUGFnZXMiPjxzcGFuIGp3Y2lkPSJ0YWJsZVBhZ2VzIi8+PC9zcGFuPgotCTx0YWJsZSBqd2NpZD0idGFibGVFbGVtZW50Ij4KLQkJPHRyPjxzcGFuIGp3Y2lkPSJ0YWJsZUNvbHVtbnMiLz48L3RyPgotCQk8dHIgandjaWQ9InRhYmxlUm93cyI+PHRkIGp3Y2lkPSJ0YWJsZVZhbHVlcyIvPjwvdHI+Ci0JPC90YWJsZT4KLTwvc3Bhbj4KLQotPC9zcGFuPgpkaWZmIC0tZ2l0IGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL2NvbXBvbmVudHMvVGFibGUuamF2YSBiL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90YWJsZS9jb21wb25lbnRzL1RhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwMmI5MTMuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL2NvbXBvbmVudHMvVGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLmNvbXBvbmVudHM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LkJhc2VDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsLklUYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuSVRhYmxlTW9kZWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsLklUYWJsZU1vZGVsU291cmNlOwotCi0vKioKLSAqIFRoZSBmYWNhZGUgY29tcG9uZW50IGluIHRoZSBUYWJsZSBmYW1pbHkuIFRhYmxlIGFsbG93cyB5b3UgdG8gcHJlc2VudCAKLSAqIGEgc29ydGFibGUgYW5kIHBhZ2FibGUgdGFibGUgc2ltcGx5IGFuZCBlYXNpbHkgYnkgdXNpbmcgb25seSB0aGlzIG9uZSBjb21wb25lbnQuCi0gKiBQbGVhc2Ugc2VlIHRoZSBDb21wb25lbnQgUmVmZXJlbmNlIGZvciBkZXRhaWxzIG9uIGhvdyB0byB1c2UgdGhpcyBjb21wb25lbnQuIAotICogCi0gKiAgWzxhIGhyZWY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL0NvbXBvbmVudFJlZmVyZW5jZS9jb250cmliLlRhYmxlLmh0bWwiPkNvbXBvbmVudCBSZWZlcmVuY2U8L2E+XQotICogCi0gKiBAYXV0aG9yIG1pbmRicmlkZ2UKLSAqIEB2ZXJzaW9uICRJZCQKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBUYWJsZSBleHRlbmRzIEJhc2VDb21wb25lbnQgaW1wbGVtZW50cyBJVGFibGVNb2RlbFNvdXJjZQotewotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsLklUYWJsZU1vZGVsU291cmNlI2dldFRhYmxlTW9kZWwoKQotICAgICAqLwotICAgIHB1YmxpYyBJVGFibGVNb2RlbCBnZXRUYWJsZU1vZGVsKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRUYWJsZVZpZXdDb21wb25lbnQoKS5nZXRUYWJsZU1vZGVsKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5kaWNhdGVzIHRoYXQgdGhlIHRhYmxlIG1vZGVsIGhhcyBjaGFuZ2VkIGFuZCBpdCBtYXkgbmVlZCB0byBzYXZlZC4KLSAgICAgKiBUaGlzIG1ldGhvZCBoYXMgdG8gYmUgaW52b2tlZCBpZiBtb2RpZmljYXRpb25zIGFyZSBtYWRlIHRvIHRoZSBtb2RlbC4KLSAgICAgKiAgCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuSVRhYmxlTW9kZWxTb3VyY2UjZmlyZU9ic2VydmVkU3RhdGVDaGFuZ2UoKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGZpcmVPYnNlcnZlZFN0YXRlQ2hhbmdlKCkKLSAgICB7Ci0gICAgICAgIGdldFRhYmxlVmlld0NvbXBvbmVudCgpLmZpcmVPYnNlcnZlZFN0YXRlQ2hhbmdlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVzZXRzIHRoZSBzdGF0ZSBvZiB0aGUgY29tcG9uZW50IGFuZCBmb3JjZXMgaXQgdG8gbG9hZCBhIG5ldwotICAgICAqIFRhYmxlTW9kZWwgZnJvbSB0aGUgdGFibGVNb2RlbCBiaW5kaW5nIHRoZSBuZXh0IHRpbWUgaXQgcmVuZGVycy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZXNldCgpCi0gICAgewotICAgICAgICBnZXRUYWJsZVZpZXdDb21wb25lbnQoKS5yZXNldCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnRseSByZW5kZXJlZCB0YWJsZSBjb2x1bW4uIAotICAgICAqIFlvdSBjYW4gY2FsbCB0aGlzIG1ldGhvZCB0byBvYnRhaW4gdGhlIGN1cnJlbnQgY29sdW1uLgotICAgICAqICAKLSAgICAgKiBAcmV0dXJuIElUYWJsZUNvbHVtbiB0aGUgY3VycmVudCB0YWJsZSBjb2x1bW4KLSAgICAgKi8KLSAgICBwdWJsaWMgSVRhYmxlQ29sdW1uIGdldFRhYmxlQ29sdW1uKCkKLSAgICB7Ci0gICAgICAgIE9iamVjdCBvYmpDdXJyZW50Um93ID0gZ2V0VGFibGVSb3coKTsKLQotICAgICAgICAvLyBpZiB0aGUgY3VycmVudCByb3cgaXMgbnVsbCwgdGhlbiB3ZSBhcmUgbW9zdCBsaWtlbHkgcmVuZGVyaW5nIFRhYmxlQ29sdW1ucwotICAgICAgICBpZiAob2JqQ3VycmVudFJvdyA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGdldFRhYmxlQ29sdW1uc0NvbXBvbmVudCgpLmdldFRhYmxlQ29sdW1uKCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiBnZXRUYWJsZVZhbHVlc0NvbXBvbmVudCgpLmdldFRhYmxlQ29sdW1uKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY3VycmVudGx5IHJlbmRlcmVkIHRhYmxlIHJvdyBvciBudWxsIAotICAgICAqIGlmIHRoZSByb3dzIGFyZSBub3QgcmVuZGVyZWQgYXQgdGhlIG1vbWVudC4KLSAgICAgKiBZb3UgY2FuIGNhbGwgdGhpcyBtZXRob2QgdG8gb2J0YWluIHRoZSBjdXJyZW50IHJvdy4KLSAgICAgKiAgCi0gICAgICogQHJldHVybiBPYmplY3QgdGhlIGN1cnJlbnQgdGFibGUgcm93IAotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0VGFibGVSb3coKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldFRhYmxlUm93c0NvbXBvbmVudCgpLmdldFRhYmxlUm93KCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFRhYmxlVmlldyBnZXRUYWJsZVZpZXdDb21wb25lbnQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChUYWJsZVZpZXcpIGdldENvbXBvbmVudCgidGFibGVWaWV3Iik7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFRhYmxlQ29sdW1ucyBnZXRUYWJsZUNvbHVtbnNDb21wb25lbnQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChUYWJsZUNvbHVtbnMpIGdldENvbXBvbmVudCgidGFibGVDb2x1bW5zIik7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFRhYmxlUm93cyBnZXRUYWJsZVJvd3NDb21wb25lbnQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChUYWJsZVJvd3MpIGdldENvbXBvbmVudCgidGFibGVSb3dzIik7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFRhYmxlVmFsdWVzIGdldFRhYmxlVmFsdWVzQ29tcG9uZW50KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoVGFibGVWYWx1ZXMpIGdldENvbXBvbmVudCgidGFibGVWYWx1ZXMiKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdGFibGUvY29tcG9uZW50cy9UYWJsZS5qd2MgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdGFibGUvY29tcG9uZW50cy9UYWJsZS5qd2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2YjAzNjAuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL2NvbXBvbmVudHMvVGFibGUuandjCisrKyAvZGV2L251bGwKQEAgLTEsMjMzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAgCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPCEtLSAgJElkJCAtLT4KLTwhRE9DVFlQRSBjb21wb25lbnQtc3BlY2lmaWNhdGlvbiBQVUJMSUMgCi0gICItLy9BcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi8vVGFwZXN0cnkgU3BlY2lmaWNhdGlvbiAzLjAvL0VOIiAKLSAgImh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvdGFwZXN0cnkvZHRkL1RhcGVzdHJ5XzNfMC5kdGQiPgotCQotPGNvbXBvbmVudC1zcGVjaWZpY2F0aW9uIGNsYXNzPSJvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUuY29tcG9uZW50cy5UYWJsZSIgCi0JYWxsb3ctYm9keT0ieWVzIiBhbGxvdy1pbmZvcm1hbC1wYXJhbWV0ZXJzPSJ5ZXMiPgotCi0gICAgPGRlc2NyaXB0aW9uPgotICAgICAgICBUaGUgbWFpbiBUYWJsZSBjb21wb25lbnQgdGhhdCBpcyBpbXBsZW1lbnRlZCB1c2luZyB0aGUgbG93ZXItbGV2ZWwgCi0gICAgICAgIFRhYmxlIGNvbXBvbmVudHMgc3VjaCBhcyBUYWJsZVZpZXcgYW5kIFRhYmxlUm93cy4KLSAgICAgICAgVGhlIGNvbXBvbmVudCBkb2VzIG5vdCByZW5kZXIgaXRzIGJvZHksIHdoaWNoIG1ha2VzIGl0IGEgZ29vZCBwbGFjZQotICAgICAgICB0byBkZWNsYXJlIEJsb2NrcyBkZWZpbmluZyB0aGUgY29sdW1uIGFwcGVhcmFuY2VzLgotICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgCi0gICAgPHBhcmFtZXRlciBuYW1lPSJ0YWJsZU1vZGVsIiAKLSAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsLklUYWJsZU1vZGVsIiAKLSAgICAgICAgcmVxdWlyZWQ9Im5vIj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgVGhlIG1vZGVsIGRlc2NyaWJpbmcgdGhlIGRhdGEgdG8gYmUgcHJlc2VudGVkIGJ5IHRoZSBUYWJsZSBjb21wb25lbnQuCi0gICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBpcyBvcHRpb25hbCwgYnV0IGVpdGhlciB0aGUgJ3RhYmxlTW9kZWwnIG9yIGJvdGgKLSAgICAgICAgICAgICdzb3VyY2UnIGFuZCAnY29sdW1ucycgcGFyYW1ldGVycyBtdXN0IGJlIHByb3ZpZGVkLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgIDwvcGFyYW1ldGVyPgotICAgIAotICAgIDxwYXJhbWV0ZXIgbmFtZT0ic291cmNlIiB0eXBlPSJqYXZhLmxhbmcuT2JqZWN0IiByZXF1aXJlZD0ibm8iPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBUaGUgZGF0YSB0byBiZSBkaXNwbGF5ZWQgYnkgdGhlIGNvbXBvbmVudC4gVGhpcyBwYXJhbWV0ZXIgaXMgYXZhaWxhYmxlIGFzCi0gICAgICAgICAgICBhbiBhbHRlcm5hdGl2ZSB0byB0YWJsZU1vZGVsIGFuZCBtdXN0IGJlIHVzZWQgaW4gY29tYmluYXRpb24gd2l0aCB0aGUKLSAgICAgICAgICAgICdjb2x1bW5zJyBwYXJhbWV0ZXIuIAotICAgICAgICAgICAgVGhlIHBhcmFtZXRlciBtdXN0IGJlIGFuIGFycmF5IG9mIHZhbHVlcywgYSBjb2xsZWN0aW9uLCBhbiBpdGVyYXRvciwgCi0gICAgICAgICAgICBvciBhbiBvYmplY3QgaW1wbGVtZW50aW5nIHRoZSBJQmFzaWNUYWJsZU1vZGVsIGludGVyZmFjZS4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICA8L3BhcmFtZXRlcj4KLSAgICAKLSAgICA8cGFyYW1ldGVyIG5hbWU9ImNvbHVtbnMiIHR5cGU9ImphdmEubGFuZy5PYmplY3QiIHJlcXVpcmVkPSJubyI+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIFRoZSB0YWJsZSBjb2x1bW5zIHRvIGJlIGRpc3BsYXllZC4gCi0gICAgICAgICAgICBUaGUgcGFyYW1ldGVyIG11c3QgYmUgYW4gYXJyYXksIGEgbGlzdCwgb3IgYW4gSXRlcmF0b3Igb2YgSVRhYmxlQ29sdW1uIG9iamVjdHMsCi0gICAgICAgICAgICBhbiBJVGFibGVDb2x1bW5Nb2RlbCwgb3IgYSBTdHJpbmcgZGVzY3JpYmluZyB0aGUgY29sdW1ucyAoc2VlIGRvY3VtZW50YXRpb24pLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgIDwvcGFyYW1ldGVyPgotICAgIAotCTxwYXJhbWV0ZXIgbmFtZT0icGFnZVNpemUiIAotCQl0eXBlPSJpbnQiIAotCQlyZXF1aXJlZD0ibm8iPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBUaGUgbnVtYmVyIG9mIHJlY29yZHMgZGlzcGxheWVkIHBlciBwYWdlIHdoZW4gc291cmNlL2NvbHVtbnMgYXJlIHVzZWQuCi0gICAgICAgICAgICBUaGUgcGFnZSBzaXplIGlzIDEwIGJ5IGRlZmF1bHQuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgPC9wYXJhbWV0ZXI+Ci0gIAotCTxwYXJhbWV0ZXIgbmFtZT0iaW5pdGlhbFNvcnRDb2x1bW4iIAotCQl0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIiAKLQkJcmVxdWlyZWQ9Im5vIj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgVGhlIGlkIG9mIHRoZSBjb2x1bW4gdG8gaW5pdGlhbGx5IHNvcnQgdGhlIHRhYmxlIGJ5LgotICAgICAgICAgICAgVGhlIGNvbHVtbiBpcyBzZXQgdG8gbnVsbCBieSBkZWZhdWx0LCBpLmUuIHRoZXJlIGlzIG5vIHNvcnRpbmcuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgPC9wYXJhbWV0ZXI+Ci0gIAotCTxwYXJhbWV0ZXIgbmFtZT0iaW5pdGlhbFNvcnRPcmRlciIgCi0JCXR5cGU9ImJvb2xlYW4iIAotCQlyZXF1aXJlZD0ibm8iPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBUaGUgb3JkZXIgb2YgdGhlIGluaXRpYWwgc29ydGluZy4KLSAgICAgICAgICAgIFNldCB0aGlzIHBhcmFtZXRlciB0byAnZmFsc2UnIHRvIHNvcnQgaW4gYW4gYXNjZW5kaW5nIG9yZGVyCi0gICAgICAgICAgICBhbmQgdG8gJ3RydWUnIHRvIHNvcnQgaW4gYSBkZXNjZW5kaW5nIG9uZS4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICA8L3BhcmFtZXRlcj4KLSAgCi0gICAgPHBhcmFtZXRlciBuYW1lPSJ0YWJsZVNlc3Npb25TdGF0ZU1hbmFnZXIiIAotICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuSVRhYmxlU2Vzc2lvblN0YXRlTWFuYWdlciIgCi0gICAgICAgIHJlcXVpcmVkPSJubyI+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIFRoZSBtYW5hZ2VyIHRoYXQgY29udHJvbHMgd2hhdCBwYXJ0IG9mIHRoZSB0YWJsZSBtb2RlbCB3aWxsIGJlIHN0b3JlZCBpbiAKLSAgICAgICAgICAgIHRoZSBzZXNzaW9uLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgIDwvcGFyYW1ldGVyPgotICAgIAotICAgIDxwYXJhbWV0ZXIgbmFtZT0idGFibGVTZXNzaW9uU3RvcmVNYW5hZ2VyIiAKLSAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsLklUYWJsZVNlc3Npb25TdG9yZU1hbmFnZXIiIAotICAgICAgICByZXF1aXJlZD0ibm8iPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBUaGUgbWFuYWdlciB0aGF0IGNvbnRyb2xzIHdoZXJlIHRoZSBzZXNzaW9uIGRhdGEgd2lsbCBiZSBzdG9yZWQuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgPC9wYXJhbWV0ZXI+Ci0gICAgCi0gICAgPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5TZXR0aW5nc0NvbnRhaW5lciIKLSAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS50YXBlc3RyeS5JQ29tcG9uZW50IgotICAgICAgICByZXF1aXJlZD0ibm8iCi0gICAgICAgIGRlZmF1bHQtdmFsdWU9ImNvbnRhaW5lciI+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIFRoZSBjb21wb25lbnQgd2hlcmUgQmxvY2sgYW5kIG1lc3NhZ2VzIGFyZSBwdWxsZWQgZnJvbSB3aGVuIHVzaW5nIHNvdXJjZS9jb2x1bW5zLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgIDwvcGFyYW1ldGVyPgotCi0JPHBhcmFtZXRlciBuYW1lPSJwYWdlc0Rpc3BsYXllZCIgCi0JCXR5cGU9ImludCIgCi0JCXJlcXVpcmVkPSJubyI+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIFRoZSBtYXhpbXVtIG51bWJlciBvZiBwYWdlcyB0aGF0IHdpbGwgYmUgZGlzcGxheWVkIGluIHRoZSBsaXN0IG9mIHRhYmxlIHBhZ2VzLgotICAgICAgICAgICAgQnkgZGVmYXVsdCwgb25seSBzZXZlbiBvZiB0aGUgcGFnZXMgYXJvdW5kIHRoZSBjdXJyZW50IG9uZSBhcmUgc2hvd24uCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgPC9wYXJhbWV0ZXI+Ci0gIAotCTxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uIiAKLQkJdHlwZT0ib3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsLklUYWJsZUNvbHVtbiIgCi0JCXJlcXVpcmVkPSJubyI+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIFRoZSBjb2x1bW4gdGhhdCBpcyBiZWluZyByZW5kZXJlZC4gVGhpcyB2YWx1ZSBpcyB1cGRhdGVkIHdoZW4gYm90aCAKLSAgICAgICAgICAgIHRoZSBjb2x1bW4gaGVhZGVycyBhbmQgY29sdW1uIHZhbHVlcyBhcmUgcmVuZGVyZWQuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgPC9wYXJhbWV0ZXI+Ci0KLQk8cGFyYW1ldGVyIG5hbWU9InJvdyIgCi0JCXR5cGU9Ik9iamVjdCIgCi0JCXJlcXVpcmVkPSJubyIKLQkJZGlyZWN0aW9uPSJjdXN0b20iPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBUaGUgcm93IHRoYXQgaXMgYmVpbmcgcmVuZGVyZWQuIFRoaXMgdmFsdWUgaXMgbnVsbCB3aGVuIAotICAgICAgICAgICAgdGhlIGNvbHVtbiBoZWFkZXJzIGFyZSByZW5kZXJlZC4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICA8L3BhcmFtZXRlcj4KLQotCTxwYXJhbWV0ZXIgbmFtZT0iYXJyb3dVcEFzc2V0IiAKLQkJdHlwZT0ib3JnLmFwYWNoZS50YXBlc3RyeS5JQXNzZXQiIAotCQlyZXF1aXJlZD0ibm8iCi0JCWRpcmVjdGlvbj0iaW4iPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBUaGUgaW1hZ2UgdG8gdXNlIHRvIGRlc2NyaWJlIGEgY29sdW1uIHNvcnRlZCBpbiBhbiBhc2NlbmRpbmcgb3JkZXIuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgPC9wYXJhbWV0ZXI+Ci0KLQk8cGFyYW1ldGVyIG5hbWU9ImFycm93RG93bkFzc2V0IiAKLQkJdHlwZT0ib3JnLmFwYWNoZS50YXBlc3RyeS5JQXNzZXQiIAotCQlyZXF1aXJlZD0ibm8iCi0JCWRpcmVjdGlvbj0iaW4iPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBUaGUgaW1hZ2UgdG8gdXNlIHRvIGRlc2NyaWJlIGEgY29sdW1uIHNvcnRlZCBpbiBhIGRlc2NlbmRpbmcgb3JkZXIuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgPC9wYXJhbWV0ZXI+Ci0KLQk8cGFyYW1ldGVyIG5hbWU9InBhZ2VzQ2xhc3MiIAotCQl0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIiAKLQkJcmVxdWlyZWQ9Im5vIgotCQlkaXJlY3Rpb249ImN1c3RvbSI+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5UaGUgQ1NTIGNsYXNzIG9mIHRoZSB0YWJsZSBwYWdlczwvZGVzY3JpcHRpb24+Ci0gICAgPC9wYXJhbWV0ZXI+Ci0gIAotCTxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uc0NsYXNzIiAKLQkJdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgCi0JCXJlcXVpcmVkPSJubyIKLQkJZGlyZWN0aW9uPSJjdXN0b20iPgotICAgICAgICA8ZGVzY3JpcHRpb24+VGhlIENTUyBjbGFzcyBvZiB0aGUgdGFibGUgY29sdW1uczwvZGVzY3JpcHRpb24+Ci0gICAgPC9wYXJhbWV0ZXI+Ci0gIAotCTxwYXJhbWV0ZXIgbmFtZT0icm93c0NsYXNzIiAKLQkJdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgCi0JCXJlcXVpcmVkPSJubyIKLQkJZGlyZWN0aW9uPSJjdXN0b20iPgotICAgICAgICA8ZGVzY3JpcHRpb24+VGhlIENTUyBjbGFzcyBvZiB0aGUgdGFibGUgcm93czwvZGVzY3JpcHRpb24+Ci0gICAgPC9wYXJhbWV0ZXI+Ci0gIAotCTxwYXJhbWV0ZXIgbmFtZT0idmFsdWVzQ2xhc3MiIAotCQl0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIiAKLQkJcmVxdWlyZWQ9Im5vIgotCQlkaXJlY3Rpb249ImN1c3RvbSI+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5UaGUgQ1NTIGNsYXNzIG9mIHRoZSB0YWJsZSB2YWx1ZXM8L2Rlc2NyaXB0aW9uPgotICAgIDwvcGFyYW1ldGVyPgotICAKLQotCTxjb21wb25lbnQgaWQ9InRhYmxlRWxlbWVudCIgdHlwZT0iQW55IiBpbmhlcml0LWluZm9ybWFsLXBhcmFtZXRlcnM9InllcyI+Ci0JCTxzdGF0aWMtYmluZGluZyBuYW1lPSJlbGVtZW50Ij50YWJsZTwvc3RhdGljLWJpbmRpbmc+Ci0JPC9jb21wb25lbnQ+Ci0KLQk8Y29tcG9uZW50IGlkPSJjb25kUGFnZXMiIHR5cGU9IkNvbmRpdGlvbmFsIj4KLQkJPGJpbmRpbmcgbmFtZT0iY29uZGl0aW9uIiBleHByZXNzaW9uPSJ0YWJsZU1vZGVsLnBhZ2VDb3VudCA+IDEiLz4KLQk8L2NvbXBvbmVudD4KLQotCi0JPGNvbXBvbmVudCBpZD0idGFibGVWaWV3IiB0eXBlPSJUYWJsZVZpZXciPgotCQk8aW5oZXJpdGVkLWJpbmRpbmcgbmFtZT0idGFibGVNb2RlbCIgcGFyYW1ldGVyLW5hbWU9InRhYmxlTW9kZWwiLz4KLQkJPGluaGVyaXRlZC1iaW5kaW5nIG5hbWU9InNvdXJjZSIgcGFyYW1ldGVyLW5hbWU9InNvdXJjZSIvPgotCQk8aW5oZXJpdGVkLWJpbmRpbmcgbmFtZT0iY29sdW1ucyIgcGFyYW1ldGVyLW5hbWU9ImNvbHVtbnMiLz4KLQkJPGluaGVyaXRlZC1iaW5kaW5nIG5hbWU9InBhZ2VTaXplIiBwYXJhbWV0ZXItbmFtZT0icGFnZVNpemUiLz4KLQkJPGluaGVyaXRlZC1iaW5kaW5nIG5hbWU9ImluaXRpYWxTb3J0Q29sdW1uIiBwYXJhbWV0ZXItbmFtZT0iaW5pdGlhbFNvcnRDb2x1bW4iLz4KLQkJPGluaGVyaXRlZC1iaW5kaW5nIG5hbWU9ImluaXRpYWxTb3J0T3JkZXIiIHBhcmFtZXRlci1uYW1lPSJpbml0aWFsU29ydE9yZGVyIi8+Ci0JCTxpbmhlcml0ZWQtYmluZGluZyBuYW1lPSJ0YWJsZVNlc3Npb25TdGF0ZU1hbmFnZXIiIHBhcmFtZXRlci1uYW1lPSJ0YWJsZVNlc3Npb25TdGF0ZU1hbmFnZXIiLz4KLQkJPGluaGVyaXRlZC1iaW5kaW5nIG5hbWU9InRhYmxlU2Vzc2lvblN0b3JlTWFuYWdlciIgcGFyYW1ldGVyLW5hbWU9InRhYmxlU2Vzc2lvblN0b3JlTWFuYWdlciIvPgotCQk8aW5oZXJpdGVkLWJpbmRpbmcgbmFtZT0iY29sdW1uU2V0dGluZ3NDb250YWluZXIiIHBhcmFtZXRlci1uYW1lPSJjb2x1bW5TZXR0aW5nc0NvbnRhaW5lciIvPgotCQk8c3RhdGljLWJpbmRpbmcgbmFtZT0iZWxlbWVudCI+c3Bhbjwvc3RhdGljLWJpbmRpbmc+Ci0JPC9jb21wb25lbnQ+Ci0KLQk8Y29tcG9uZW50IGlkPSJ0YWJsZVBhZ2VzIiB0eXBlPSJUYWJsZVBhZ2VzIj4KLQkJPGluaGVyaXRlZC1iaW5kaW5nIG5hbWU9InBhZ2VzRGlzcGxheWVkIiBwYXJhbWV0ZXItbmFtZT0icGFnZXNEaXNwbGF5ZWQiLz4KLQkJPGluaGVyaXRlZC1iaW5kaW5nIG5hbWU9ImNsYXNzIiBwYXJhbWV0ZXItbmFtZT0icGFnZXNDbGFzcyIvPgotCTwvY29tcG9uZW50PgotCi0JPGNvbXBvbmVudCBpZD0idGFibGVDb2x1bW5zIiB0eXBlPSJUYWJsZUNvbHVtbnMiPgotCQk8aW5oZXJpdGVkLWJpbmRpbmcgbmFtZT0iY29sdW1uIiBwYXJhbWV0ZXItbmFtZT0iY29sdW1uIi8+Ci0JCTxpbmhlcml0ZWQtYmluZGluZyBuYW1lPSJjbGFzcyIgcGFyYW1ldGVyLW5hbWU9ImNvbHVtbnNDbGFzcyIvPgotICAgICAgICA8aW5oZXJpdGVkLWJpbmRpbmcgbmFtZT0iYXJyb3dVcEFzc2V0IiBwYXJhbWV0ZXItbmFtZT0iYXJyb3dVcEFzc2V0Ii8+Ci0gICAgICAgIDxpbmhlcml0ZWQtYmluZGluZyBuYW1lPSJhcnJvd0Rvd25Bc3NldCIgcGFyYW1ldGVyLW5hbWU9ImFycm93RG93bkFzc2V0Ii8+Ci0JPC9jb21wb25lbnQ+Ci0KLQk8Y29tcG9uZW50IGlkPSJ0YWJsZVJvd3MiIHR5cGU9IlRhYmxlUm93cyI+Ci0JCTxpbmhlcml0ZWQtYmluZGluZyBuYW1lPSJyb3ciIHBhcmFtZXRlci1uYW1lPSJyb3ciLz4KLQkJPGluaGVyaXRlZC1iaW5kaW5nIG5hbWU9ImNsYXNzIiBwYXJhbWV0ZXItbmFtZT0icm93c0NsYXNzIi8+Ci0JPC9jb21wb25lbnQ+Ci0KLQk8Y29tcG9uZW50IGlkPSJ0YWJsZVZhbHVlcyIgdHlwZT0iVGFibGVWYWx1ZXMiPgotCQk8aW5oZXJpdGVkLWJpbmRpbmcgbmFtZT0iY29sdW1uIiBwYXJhbWV0ZXItbmFtZT0iY29sdW1uIi8+Ci0JCTxpbmhlcml0ZWQtYmluZGluZyBuYW1lPSJjbGFzcyIgcGFyYW1ldGVyLW5hbWU9InZhbHVlc0NsYXNzIi8+Ci0JPC9jb21wb25lbnQ+Ci0gIAotPC9jb21wb25lbnQtc3BlY2lmaWNhdGlvbj4KZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90YWJsZS9jb21wb25lbnRzL1RhYmxlQ29sdW1ucy5odG1sIGIvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL2NvbXBvbmVudHMvVGFibGVDb2x1bW5zLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxMzYwZmQuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL2NvbXBvbmVudHMvVGFibGVDb2x1bW5zLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTwhLS0gJElkJCAtLT4KLQotPHNwYW4gandjaWQ9IiRjb250ZW50JCI+Ci0KLTxzcGFuIGp3Y2lkPSJpdGVyQ29sdW1ucyI+Ci0JPHRoIGp3Y2lkPSJpbmZvcm1hbCI+PHNwYW4gandjaWQ9Imluc2VydENvbHVtblJlbmRlcmVyIi8+PC90aD4KLTwvc3Bhbj4KLQotPC9zcGFuPgpkaWZmIC0tZ2l0IGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL2NvbXBvbmVudHMvVGFibGVDb2x1bW5zLmphdmEgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdGFibGUvY29tcG9uZW50cy9UYWJsZUNvbHVtbnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDZjOTBlOC4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdGFibGUvY29tcG9uZW50cy9UYWJsZUNvbHVtbnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLmNvbXBvbmVudHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklBc3NldDsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklCaW5kaW5nOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSU1hcmt1cFdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZW5kZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVxdWVzdEN5Y2xlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5tb2RlbC5JVGFibGVDb2x1bW47Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsLklUYWJsZUNvbHVtbk1vZGVsOwotCi0vKioKLSAqIEEgbG93IGxldmVsIFRhYmxlIGNvbXBvbmVudCB0aGF0IHJlbmRlcnMgdGhlIGNvbHVtbiBoZWFkZXJzIGluIHRoZSB0YWJsZS4KLSAqIFRoaXMgY29tcG9uZW50IG11c3QgYmUgd3JhcHBlZCBieSB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLmNvbXBvbmVudHMuVGFibGVWaWV3fS4KLSAqIDxwPgotICogVGhlIGNvbXBvbmVudCBpdGVyYXRlcyBvdmVyIGFsbCBjb2x1bW4gb2JqZWN0cyBpbiB0aGUKLSAqIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuSVRhYmxlQ29sdW1uTW9kZWx9IGFuZCByZW5kZXJzCi0gKiBhIGhlYWRlciBmb3IgZWFjaCBvbmUgb2YgdGhlbSB1c2luZyB0aGUgcmVuZGVyZXIgcHJvdmlkZWQgYnkgdGhlCi0gKiBnZXRDb2x1bW5SZW5kZXIoKSBtZXRob2QgaW4ge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5tb2RlbC5JVGFibGVDb2x1bW59LgotICogVGhlIGhlYWRlcnMgYXJlIHdyYXBwZWQgaW4gJ3RoJyB0YWdzIGJ5IGRlZmF1bHQuCi0gKiA8cD4KLSAqIFBsZWFzZSBzZWUgdGhlIENvbXBvbmVudCBSZWZlcmVuY2UgZm9yIGRldGFpbHMgb24gaG93IHRvIHVzZSB0aGlzIGNvbXBvbmVudC4gCi0gKiAKLSAqICBbPGEgaHJlZj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vQ29tcG9uZW50UmVmZXJlbmNlL2NvbnRyaWIuVGFibGVDb2x1bW5zLmh0bWwiPkNvbXBvbmVudCBSZWZlcmVuY2U8L2E+XQotICogCi0gKiBAYXV0aG9yIG1pbmRicmlkZ2UKLSAqIEB2ZXJzaW9uICRJZCQKLSAqCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUYWJsZUNvbHVtbnMgZXh0ZW5kcyBBYnN0cmFjdFRhYmxlVmlld0NvbXBvbmVudAotewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBQkxFX0NPTFVNTl9BUlJPV19VUF9BVFRSSUJVVEUgPQotICAgICAgICAib3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLmNvbXBvbmVudHMuVGFibGVDb2x1bW5zLmFycm93VXAiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFCTEVfQ09MVU1OX0FSUk9XX0RPV05fQVRUUklCVVRFID0KLSAgICAgICAgIm9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5jb21wb25lbnRzLlRhYmxlQ29sdW1ucy5hcnJvd0Rvd24iOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFCTEVfQ09MVU1OX0NTU19DTEFTU19TVUZGSVggPSAiQ29sdW1uSGVhZGVyIjsKLQotICAgIC8vIEJpbmRpbmdzCi0gICAgcHVibGljIGFic3RyYWN0IElCaW5kaW5nIGdldENvbHVtbkJpbmRpbmcoKTsKLSAgICBwdWJsaWMgYWJzdHJhY3QgSUJpbmRpbmcgZ2V0Q2xhc3NCaW5kaW5nKCk7Ci0gICAgcHVibGljIGFic3RyYWN0IElBc3NldCBnZXRBcnJvd0Rvd25Bc3NldCgpOwotICAgIHB1YmxpYyBhYnN0cmFjdCBJQXNzZXQgZ2V0QXJyb3dVcEFzc2V0KCk7Ci0KLSAgICAvLyBUcmFuc2llbnQKLSAgICBwcml2YXRlIElUYWJsZUNvbHVtbiBtX29ialRhYmxlQ29sdW1uID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnRseSByZW5kZXJlZCB0YWJsZSBjb2x1bW4uIAotICAgICAqIFlvdSBjYW4gY2FsbCB0aGlzIG1ldGhvZCB0byBvYnRhaW4gdGhlIGN1cnJlbnQgY29sdW1uLgotICAgICAqICAKLSAgICAgKiBAcmV0dXJuIElUYWJsZUNvbHVtbiB0aGUgY3VycmVudCB0YWJsZSBjb2x1bW4KLSAgICAgKi8KLSAgICBwdWJsaWMgSVRhYmxlQ29sdW1uIGdldFRhYmxlQ29sdW1uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX29ialRhYmxlQ29sdW1uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGN1cnJlbnRseSByZW5kZXJlZCB0YWJsZSBjb2x1bW4uIAotICAgICAqIFRoaXMgbWV0aG9kIGlzIGZvciBpbnRlcm5hbCB1c2Ugb25seS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdGFibGVDb2x1bW4gVGhlIGN1cnJlbnQgdGFibGUgY29sdW1uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VGFibGVDb2x1bW4oSVRhYmxlQ29sdW1uIHRhYmxlQ29sdW1uKQotICAgIHsKLSAgICAgICAgbV9vYmpUYWJsZUNvbHVtbiA9IHRhYmxlQ29sdW1uOwotCi0gICAgICAgIElCaW5kaW5nIG9iakNvbHVtbkJpbmRpbmcgPSBnZXRDb2x1bW5CaW5kaW5nKCk7Ci0gICAgICAgIGlmIChvYmpDb2x1bW5CaW5kaW5nICE9IG51bGwpCi0gICAgICAgICAgICBvYmpDb2x1bW5CaW5kaW5nLnNldE9iamVjdCh0YWJsZUNvbHVtbik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBsaXN0IG9mIGFsbCB0YWJsZSBjb2x1bW5zIHRvIGJlIGRpc3BsYXllZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGFuIGl0ZXJhdG9yIG9mIGFsbCB0YWJsZSBjb2x1bW5zCi0gICAgICovCi0gICAgcHVibGljIEl0ZXJhdG9yIGdldFRhYmxlQ29sdW1uSXRlcmF0b3IoKQotICAgIHsKLSAgICAgICAgSVRhYmxlQ29sdW1uTW9kZWwgb2JqQ29sdW1uTW9kZWwgPSBnZXRUYWJsZU1vZGVsU291cmNlKCkuZ2V0VGFibGVNb2RlbCgpLmdldENvbHVtbk1vZGVsKCk7Ci0gICAgICAgIHJldHVybiBvYmpDb2x1bW5Nb2RlbC5nZXRDb2x1bW5zKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcmVuZGVyZXIgdG8gYmUgdXNlZCB0byBnZW5lcmF0ZSB0aGUgaGVhZGVyIG9mIHRoZSBjdXJyZW50IGNvbHVtbgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGhlYWRlciByZW5kZXJlciBvZiB0aGUgY3VycmVudCBjb2x1bW4KLSAgICAgKi8KLSAgICBwdWJsaWMgSVJlbmRlciBnZXRUYWJsZUNvbHVtblJlbmRlcmVyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRUYWJsZUNvbHVtbigpLmdldENvbHVtblJlbmRlcmVyKAotICAgICAgICAgICAgZ2V0UGFnZSgpLmdldFJlcXVlc3RDeWNsZSgpLAotICAgICAgICAgICAgZ2V0VGFibGVNb2RlbFNvdXJjZSgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBDU1MgY2xhc3Mgb2YgdGhlIGdlbmVyYXRlZCB0YWJsZSBjZWxsLgotICAgICAqIEl0IHVzZXMgdGhlIGNsYXNzIHBhcmFtZXRlciBpZiBpdCBoYXMgYmVlbiBib3VuZCwgb3IKLSAgICAgKiB0aGUgZGVmYXVsdCB2YWx1ZSBvZiAiW2NvbHVtbiBuYW1lXUNvbHVtbkhlYWRlciIgb3RoZXJ3aXNlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIENTUyBjbGFzcyBvZiB0aGUgY2VsbAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uQ2xhc3MoKQotICAgIHsKLSAgICAgICAgSUJpbmRpbmcgb2JqQ2xhc3NCaW5kaW5nID0gZ2V0Q2xhc3NCaW5kaW5nKCk7Ci0gICAgICAgIGlmIChvYmpDbGFzc0JpbmRpbmcgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBvYmpDbGFzc0JpbmRpbmcuZ2V0U3RyaW5nKCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiBnZXRUYWJsZUNvbHVtbigpLmdldENvbHVtbk5hbWUoKSArIFRBQkxFX0NPTFVNTl9DU1NfQ0xBU1NfU1VGRklYOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS50YXBlc3RyeS5CYXNlQ29tcG9uZW50I3JlbmRlckNvbXBvbmVudChJTWFya3VwV3JpdGVyLCBJUmVxdWVzdEN5Y2xlKQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHJlbmRlckNvbXBvbmVudChJTWFya3VwV3JpdGVyIHdyaXRlciwgSVJlcXVlc3RDeWNsZSBjeWNsZSkKLSAgICB7Ci0gICAgICAgIE9iamVjdCBvbGRWYWx1ZVVwID0gY3ljbGUuZ2V0QXR0cmlidXRlKFRBQkxFX0NPTFVNTl9BUlJPV19VUF9BVFRSSUJVVEUpOwotICAgICAgICBPYmplY3Qgb2xkVmFsdWVEb3duID0gY3ljbGUuZ2V0QXR0cmlidXRlKFRBQkxFX0NPTFVNTl9BUlJPV19ET1dOX0FUVFJJQlVURSk7Ci0KLSAgICAgICAgY3ljbGUuc2V0QXR0cmlidXRlKFRBQkxFX0NPTFVNTl9BUlJPV19VUF9BVFRSSUJVVEUsIGdldEFycm93VXBBc3NldCgpKTsKLSAgICAgICAgY3ljbGUuc2V0QXR0cmlidXRlKFRBQkxFX0NPTFVNTl9BUlJPV19ET1dOX0FUVFJJQlVURSwgZ2V0QXJyb3dEb3duQXNzZXQoKSk7Ci0KLSAgICAgICAgc3VwZXIucmVuZGVyQ29tcG9uZW50KHdyaXRlciwgY3ljbGUpOwotCi0gICAgICAgIGN5Y2xlLnNldEF0dHJpYnV0ZShUQUJMRV9DT0xVTU5fQVJST1dfVVBfQVRUUklCVVRFLCBvbGRWYWx1ZVVwKTsKLSAgICAgICAgY3ljbGUuc2V0QXR0cmlidXRlKFRBQkxFX0NPTFVNTl9BUlJPV19ET1dOX0FUVFJJQlVURSwgb2xkVmFsdWVEb3duKTsKLQotICAgICAgICAvLyBzZXQgdGhlIGN1cnJlbnQgY29sdW1uIHRvIG51bGwgd2hlbiB0aGUgY29tcG9uZW50IGlzIG5vdCBhY3RpdmUKLSAgICAgICAgbV9vYmpUYWJsZUNvbHVtbiA9IG51bGw7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdGFibGUvY29tcG9uZW50cy9UYWJsZUNvbHVtbnMuandjIGIvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL2NvbXBvbmVudHMvVGFibGVDb2x1bW5zLmp3YwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdlNTc1Ny4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdGFibGUvY29tcG9uZW50cy9UYWJsZUNvbHVtbnMuandjCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICAKLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08IS0tICAkSWQkIC0tPgotPCFET0NUWVBFIGNvbXBvbmVudC1zcGVjaWZpY2F0aW9uIFBVQkxJQyAKLSAgIi0vL0FwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLy9UYXBlc3RyeSBTcGVjaWZpY2F0aW9uIDMuMC8vRU4iIAotICAiaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy90YXBlc3RyeS9kdGQvVGFwZXN0cnlfM18wLmR0ZCI+Ci0JCi08Y29tcG9uZW50LXNwZWNpZmljYXRpb24gY2xhc3M9Im9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5jb21wb25lbnRzLlRhYmxlQ29sdW1ucyIgCi0JYWxsb3ctYm9keT0ieWVzIiBhbGxvdy1pbmZvcm1hbC1wYXJhbWV0ZXJzPSJ5ZXMiPgotCQotCTxkZXNjcmlwdGlvbj4KLSAgICAgICAgQSBsb3cgbGV2ZWwgVGFibGUgY29tcG9uZW50IHRoYXQgcmVuZGVycyB0aGUgY29sdW1uIGhlYWRlcnMgaW4gdGhlIHRhYmxlLiAKLSAgICAgICAgVGhpcyBjb21wb25lbnQgbXVzdCBiZSB3cmFwcGVkIGJ5IFRhYmxlVmlldy4gCi0JPC9kZXNjcmlwdGlvbj4KLSAgCi0JPHBhcmFtZXRlciBuYW1lPSJjb2x1bW4iIAotCQl0eXBlPSJvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuSVRhYmxlQ29sdW1uIiAKLQkJcmVxdWlyZWQ9Im5vIgotCQlkaXJlY3Rpb249ImN1c3RvbSI+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5UaGUgY29sdW1uIGN1cnJlbnRseSBiZWluZyByZW5kZXJlZCBbb3V0XTwvZGVzY3JpcHRpb24+Ci0gICAgPC9wYXJhbWV0ZXI+Ci0KLQk8cGFyYW1ldGVyIG5hbWU9ImVsZW1lbnQiIAotCQl0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIiAKLQkJcmVxdWlyZWQ9Im5vIgotCQlkaXJlY3Rpb249ImF1dG8iCi0gICAgCWRlZmF1bHQtdmFsdWU9Iid0aCciPgotICAgICAgICA8ZGVzY3JpcHRpb24+VGhlIHRhZyB0byB1c2UgdG8gd3JhcCB0aGUgY29sdW1uIGhlYWRlcnMuPC9kZXNjcmlwdGlvbj4KLSAgICA8L3BhcmFtZXRlcj4KLQotCTxwYXJhbWV0ZXIgbmFtZT0iYXJyb3dVcEFzc2V0IiAKLQkJdHlwZT0ib3JnLmFwYWNoZS50YXBlc3RyeS5JQXNzZXQiIAotCQlyZXF1aXJlZD0ibm8iCi0JCWRpcmVjdGlvbj0iaW4iPgotICAgICAgICA8ZGVzY3JpcHRpb24+VGhlIGltYWdlIHRvIHVzZSB0byBkZXNjcmliZSBhIGNvbHVtbiBzb3J0ZWQgaW4gYW4gYXNjZW5kaW5nIG9yZGVyLjwvZGVzY3JpcHRpb24+Ci0gICAgPC9wYXJhbWV0ZXI+Ci0KLQk8cGFyYW1ldGVyIG5hbWU9ImFycm93RG93bkFzc2V0IiAKLQkJdHlwZT0ib3JnLmFwYWNoZS50YXBlc3RyeS5JQXNzZXQiIAotCQlyZXF1aXJlZD0ibm8iCi0JCWRpcmVjdGlvbj0iaW4iPgotICAgICAgICA8ZGVzY3JpcHRpb24+VGhlIGltYWdlIHRvIHVzZSB0byBkZXNjcmliZSBhIGNvbHVtbiBzb3J0ZWQgaW4gYSBkZXNjZW5kaW5nIG9yZGVyLjwvZGVzY3JpcHRpb24+Ci0gICAgPC9wYXJhbWV0ZXI+Ci0KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImNsYXNzIgotICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICByZXF1aXJlZD0ibm8iCi0gICAgICAgIGRpcmVjdGlvbj0iY3VzdG9tIj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPlRoZSBDU1MgY2xhc3Mgb2YgdGhlIHRhYmxlIGNvbHVtbnM8L2Rlc2NyaXB0aW9uPgotICAgIDwvcGFyYW1ldGVyPgotICAgIAotCTxjb21wb25lbnQgaWQ9Iml0ZXJDb2x1bW5zIiB0eXBlPSJGb3JlYWNoIj4KLQkJPGJpbmRpbmcgbmFtZT0ic291cmNlIiBleHByZXNzaW9uPSJ0YWJsZUNvbHVtbkl0ZXJhdG9yIi8+Ci0JCTxiaW5kaW5nIG5hbWU9InZhbHVlIiBleHByZXNzaW9uPSJ0YWJsZUNvbHVtbiIvPgotCTwvY29tcG9uZW50PgotICAKLQk8Y29tcG9uZW50IGlkPSJpbmZvcm1hbCIgdHlwZT0iQW55IiBpbmhlcml0LWluZm9ybWFsLXBhcmFtZXRlcnM9InllcyI+Ci0JCTxiaW5kaW5nIG5hbWU9ImVsZW1lbnQiIGV4cHJlc3Npb249ImVsZW1lbnQiLz4KLSAgICAgICAgPGJpbmRpbmcgbmFtZT0iY2xhc3MiIGV4cHJlc3Npb249ImNvbHVtbkNsYXNzIi8+Ci0JPC9jb21wb25lbnQ+Ci0gIAotCTxjb21wb25lbnQgaWQ9Imluc2VydENvbHVtblJlbmRlcmVyIiB0eXBlPSJEZWxlZ2F0b3IiPgotCQk8YmluZGluZyBuYW1lPSJkZWxlZ2F0ZSIgZXhwcmVzc2lvbj0idGFibGVDb2x1bW5SZW5kZXJlciIvPgotCTwvY29tcG9uZW50PgotCi08L2NvbXBvbmVudC1zcGVjaWZpY2F0aW9uPgpkaWZmIC0tZ2l0IGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL2NvbXBvbmVudHMvVGFibGVGb3JtUGFnZXMuaHRtbCBiL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90YWJsZS9jb21wb25lbnRzL1RhYmxlRm9ybVBhZ2VzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkOThjZDguLjAwMDAwMDAKLS0tIGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL2NvbXBvbmVudHMvVGFibGVGb3JtUGFnZXMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTwhLS0gJElkJCAtLT4KLQotPHNwYW4gandjaWQ9IiRjb250ZW50JCI+Ci0KLTxzcGFuIGp3Y2lkPSJpbmZvcm1hbCI+Ci0KLSAgPHNwYW4gandjaWQ9ImhpZGRlbkN1cnJlbnRQYWdlIi8+Ci0gIDxzcGFuIGp3Y2lkPSJoaWRkZW5QYWdlQ291bnQiLz4KLSAgPHNwYW4gandjaWQ9ImhpZGRlblN0YXJ0UGFnZSIvPgotICA8c3BhbiBqd2NpZD0iaGlkZGVuU3RvcFBhZ2UiLz4KLQotICA8YSBqd2NpZD0ibGlua0ZpcnN0Ij4mbHQ7Jmx0OzwvYT4gIAotICA8YSBqd2NpZD0ibGlua0JhY2siPiZsdDs8L2E+IAotCi0gIDxzcGFuIGp3Y2lkPSJpdGVyUGFnZSI+Ci0KLQkgIDxzcGFuIGp3Y2lkPSJjb25kQ3VycmVudCI+Ci0JCSAgPGI+PHNwYW4gandjaWQ9Imluc2VydEN1cnJlbnRQYWdlIi8+PC9iPgotCSAgPC9zcGFuPgotCi0gICAgPHNwYW4gandjaWQ9ImNvbmRPdGhlciI+Ci0JCSAgPGEgandjaWQ9ImxpbmtQYWdlIj48c3BhbiBqd2NpZD0iaW5zZXJ0T3RoZXJQYWdlIi8+PC9hPgotCSAgPC9zcGFuPgotCi0gIDwvc3Bhbj4KLQotICA8YSBqd2NpZD0ibGlua0Z3ZCI+Jmd0OzwvYT4KLSAgPGEgandjaWQ9ImxpbmtMYXN0Ij4mZ3Q7Jmd0OzwvYT4KLQotPC9zcGFuPgotCi08L3NwYW4+CmRpZmYgLS1naXQgYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdGFibGUvY29tcG9uZW50cy9UYWJsZUZvcm1QYWdlcy5qYXZhIGIvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL2NvbXBvbmVudHMvVGFibGVGb3JtUGFnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjA0Mzc5OS4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdGFibGUvY29tcG9uZW50cy9UYWJsZUZvcm1QYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTczICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUuY29tcG9uZW50czsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlcXVlc3RDeWNsZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuSVRhYmxlTW9kZWxTb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5ldmVudC5QYWdlRGV0YWNoTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5ldmVudC5QYWdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5ldmVudC5QYWdlUmVuZGVyTGlzdGVuZXI7Ci0KLS8qKgotICogQSBsb3cgbGV2ZWwgVGFibGUgY29tcG9uZW50IHRoYXQgcmVuZGVycyB0aGUgcGFnZXMgaW4gdGhlIHRhYmxlLgotICogCi0gKiBUaGlzIGNvbXBvbmVudCBpcyBhIHZhcmlhbnQgb2Yge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5jb21wb25lbnRzLlRhYmxlUGFnZXN9LCAKLSAqIGJ1dCBpcyBkZXNpZ25lZCBmb3Igb3BlcmF0aW9uIGluIGEgZm9ybS4gVGhlIG5lY2Vzc2FyeSBwYWdlIGRhdGEgaXMgc3RvcmVkIAotICogaW4gaGlkZGVuIGZpZWxkcywgc28gdGhhdCBubyBTdGFsZUxpbmsgZXhjZXB0aW9ucyBvY2N1ciBkdXJpbmcgYSByZXdpbmQuIAotICogVGhlIGxpbmtzIGFsc28gc3VibWl0IHRoZSBmb3JtLCB3aGljaCBlbnN1cmVzIHRoYXQgdGhlIGRhdGEgaW4gdGhlIG90aGVyIAotICogZm9ybSBmaWVsZHMgaXMgcHJlc2VydmVkIGV2ZW4gd2hlbiB0aGUgcGFnZSBjaGFnZXMuCi0gKiAgCi0gKiBUaGUgY29tcG9uZW50IG11c3QgYmUgd3JhcHBlZCBieSB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLmNvbXBvbmVudHMuVGFibGVWaWV3fS4KLSAqIDxwPgotICogVGhlIGNvbXBvbmVudCBnZW5lcmF0ZXMgYSBsaXN0IG9mIHBhZ2VzIGluIHRoZSBUYWJsZSBjZW50ZXJlZCBhcm91bmQgdGhlIAotICogY3VycmVudCBvbmUgYW5kIGFsbG93cyB5b3UgdG8gbmF2aWdhdGUgdG8gb3RoZXIgcGFnZXMuCi0gKiA8cD4gCi0gKiBQbGVhc2Ugc2VlIHRoZSBDb21wb25lbnQgUmVmZXJlbmNlIGZvciBkZXRhaWxzIG9uIGhvdyB0byB1c2UgdGhpcyBjb21wb25lbnQuIAotICogCi0gKiAgWzxhIGhyZWY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL0NvbXBvbmVudFJlZmVyZW5jZS9jb250cmliLlRhYmxlRm9ybVBhZ2VzLmh0bWwiPkNvbXBvbmVudCBSZWZlcmVuY2U8L2E+XQotICogCi0gKiBAYXV0aG9yIG1pbmRicmlkZ2UKLSAqIEB2ZXJzaW9uICRJZCQKLSAqCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUYWJsZUZvcm1QYWdlcyBleHRlbmRzIFRhYmxlUGFnZXMgCi0gICAgaW1wbGVtZW50cyBQYWdlRGV0YWNoTGlzdGVuZXIsIFBhZ2VSZW5kZXJMaXN0ZW5lcgotewotICAgIHByaXZhdGUgaW50IG1fbkN1cnJlbnRQYWdlOwotICAgIHByaXZhdGUgaW50IG1fblBhZ2VDb3VudDsKLSAgICBwcml2YXRlIGludCBtX25TdGFydFBhZ2U7Ci0gICAgcHJpdmF0ZSBpbnQgbV9uU3RvcFBhZ2U7ICAgIAotCi0gICAgcHVibGljIFRhYmxlRm9ybVBhZ2VzKCkKLSAgICB7Ci0gICAgICAgIGluaXRpYWxpemUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUudGFwZXN0cnkuZXZlbnQuUGFnZURldGFjaExpc3RlbmVyI3BhZ2VEZXRhY2hlZChvcmcuYXBhY2hlLnRhcGVzdHJ5LmV2ZW50LlBhZ2VFdmVudCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwYWdlRGV0YWNoZWQoUGFnZUV2ZW50IGV2ZW50KQotICAgIHsKLSAgICAgICAgaW5pdGlhbGl6ZSgpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUudGFwZXN0cnkuZXZlbnQuUGFnZVJlbmRlckxpc3RlbmVyI3BhZ2VCZWdpblJlbmRlcihvcmcuYXBhY2hlLnRhcGVzdHJ5LmV2ZW50LlBhZ2VFdmVudCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwYWdlQmVnaW5SZW5kZXIoUGFnZUV2ZW50IGV2ZW50KQotICAgIHsKLSAgICAgICAgLy8gdmFsdWVzIHNldCBkdXJpbmcgcmV3aW5kIGFyZSByZW1vdmVkCi0gICAgICAgIGluaXRpYWxpemUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbml0aWFsaXplIHRoZSB2YWx1ZXMgYW5kIHJldHVybiB0aGUgb2JqZWN0IHRvIG9wZXJhdGlvbiBpZGVudGljYWwKLSAgICAgKiB0byB0aGF0IG9mIHRoZSBzdXBlciBjbGFzcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZSgpCi0gICAgewotICAgICAgICBtX25DdXJyZW50UGFnZSA9IC0xOwotICAgICAgICBtX25QYWdlQ291bnQgPSAtMTsKLSAgICAgICAgbV9uU3RhcnRQYWdlID0gLTE7Ci0gICAgICAgIG1fblN0b3BQYWdlID0gLTE7Ci0gICAgfQotCi0gICAgLy8gVGhpcyB3b3VsZCBpZGVhbGx5IGJlIGEgZGVsYXllZCBpbnZvY2F0aW9uIC0tIGNhbGxlZCBhZnRlciB0aGUgZm9ybSByZXdpbmQKLSAgICBwdWJsaWMgdm9pZCBjaGFuZ2VQYWdlKElSZXF1ZXN0Q3ljbGUgb2JqQ3ljbGUpCi0gICAgewotICAgICAgICBJVGFibGVNb2RlbFNvdXJjZSBvYmpTb3VyY2UgPSBnZXRUYWJsZU1vZGVsU291cmNlKCk7IAotICAgICAgICBzZXRDdXJyZW50UGFnZShvYmpTb3VyY2UsIGdldFNlbGVjdGVkUGFnZSgpKTsKLQotICAgICAgICAvLyBlbnN1cmUgdGhhdCB0aGUgY2hhbmdlIGlzIHNhdmVkCi0gICAgICAgIG9ialNvdXJjZS5maXJlT2JzZXJ2ZWRTdGF0ZUNoYW5nZSgpOwotICAgIH0KLQotICAgIC8vIGRlZmluZWQgaW4gdGhlIEpXQyBmaWxlCi0gICAgcHVibGljIGFic3RyYWN0IGludCBnZXRTZWxlY3RlZFBhZ2UoKTsKLQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgY3VycmVudCBwYWdlCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRDdXJyZW50UGFnZSgpCi0gICAgewotICAgICAgICBpZiAobV9uQ3VycmVudFBhZ2UgPCAwKQotICAgICAgICAgICAgbV9uQ3VycmVudFBhZ2UgPSBzdXBlci5nZXRDdXJyZW50UGFnZSgpOwotICAgICAgICByZXR1cm4gbV9uQ3VycmVudFBhZ2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBudW1iZXIgb2YgYWxsIHBhZ2VzIHRvIGRpc3BsYXkKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFBhZ2VDb3VudCgpCi0gICAgewotICAgICAgICBpZiAobV9uUGFnZUNvdW50IDwgMCkKLSAgICAgICAgICAgIG1fblBhZ2VDb3VudCA9IHN1cGVyLmdldFBhZ2VDb3VudCgpOwotICAgICAgICByZXR1cm4gbV9uUGFnZUNvdW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIGZpcnN0IHBhZ2UgdG8gZGlzcGxheQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0U3RhcnRQYWdlKCkKLSAgICB7Ci0gICAgICAgIGlmIChtX25TdGFydFBhZ2UgPCAwKQotICAgICAgICAgICAgbV9uU3RhcnRQYWdlID0gc3VwZXIuZ2V0U3RhcnRQYWdlKCk7Ci0gICAgICAgIHJldHVybiBtX25TdGFydFBhZ2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgbGFzdCBwYWdlIHRvIGRpc3BsYXkKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFN0b3BQYWdlKCkKLSAgICB7Ci0gICAgICAgIGlmIChtX25TdG9wUGFnZSA8IDApCi0gICAgICAgICAgICBtX25TdG9wUGFnZSA9IHN1cGVyLmdldFN0b3BQYWdlKCk7Ci0gICAgICAgIHJldHVybiBtX25TdG9wUGFnZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gaSB0aGUgY3VycmVudCBwYWdlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q3VycmVudFBhZ2UoaW50IGkpCi0gICAgewotICAgICAgICBtX25DdXJyZW50UGFnZSA9IGk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGkgbnVtYmVyIG9mIGFsbCBwYWdlcyB0byBkaXNwbGF5Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UGFnZUNvdW50KGludCBpKQotICAgIHsKLSAgICAgICAgbV9uUGFnZUNvdW50ID0gaTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gaSB0aGUgZmlyc3QgcGFnZSB0byBkaXNwbGF5Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U3RhcnRQYWdlKGludCBpKQotICAgIHsKLSAgICAgICAgbV9uU3RhcnRQYWdlID0gaTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gaSB0aGUgbGFzdCBwYWdlIHRvIGRpc3BsYXkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTdG9wUGFnZShpbnQgaSkKLSAgICB7Ci0gICAgICAgIG1fblN0b3BQYWdlID0gaTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90YWJsZS9jb21wb25lbnRzL1RhYmxlRm9ybVBhZ2VzLmp3YyBiL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90YWJsZS9jb21wb25lbnRzL1RhYmxlRm9ybVBhZ2VzLmp3YwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjViZTMxMS4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdGFibGUvY29tcG9uZW50cy9UYWJsZUZvcm1QYWdlcy5qd2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICAKLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08IS0tICAkSWQkIC0tPgotPCFET0NUWVBFIGNvbXBvbmVudC1zcGVjaWZpY2F0aW9uIFBVQkxJQyAKLSAgIi0vL0FwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLy9UYXBlc3RyeSBTcGVjaWZpY2F0aW9uIDMuMC8vRU4iIAotICAiaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy90YXBlc3RyeS9kdGQvVGFwZXN0cnlfM18wLmR0ZCI+Ci0JCi08Y29tcG9uZW50LXNwZWNpZmljYXRpb24gY2xhc3M9Im9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5jb21wb25lbnRzLlRhYmxlRm9ybVBhZ2VzIiAKLQlhbGxvdy1ib2R5PSJubyIgYWxsb3ctaW5mb3JtYWwtcGFyYW1ldGVycz0ieWVzIj4KLQkKLQk8ZGVzY3JpcHRpb24+Ci0gICAgICAgIEEgdmVyc2lvbiBvZiBUYWJsZVBhZ2VzIHRoYXQgaXMgZGVzaWduZWQgZm9yIG9wZXJhdGlvbiBpbiBhIGZvcm0uIAotICAgICAgICBJdCBpcyBhIGxvdyBsZXZlbCBUYWJsZSBjb21wb25lbnQgdGhhdCByZW5kZXJzIHRoZSBwYWdlcyBpbiB0aGUgdGFibGUuIAotICAgICAgICBUaGlzIGNvbXBvbmVudCBtdXN0IGJlIHdyYXBwZWQgYnkgVGFibGVWaWV3LiAKLQk8L2Rlc2NyaXB0aW9uPgotICAKLQk8Y29tcG9uZW50IGlkPSJpbmZvcm1hbCIgdHlwZT0iQW55IiBpbmhlcml0LWluZm9ybWFsLXBhcmFtZXRlcnM9InllcyIvPgotICAKLQk8cGFyYW1ldGVyIG5hbWU9InBhZ2VzRGlzcGxheWVkIiAKLQkJdHlwZT0iaW50IiAKLQkJcmVxdWlyZWQ9Im5vIgotCQlkaXJlY3Rpb249ImF1dG8iCi0gICAgCWRlZmF1bHQtdmFsdWU9IjciPgotCQk8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBEZXRlcm1pbmVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBwYWdlcyB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIHBhZ2UgbGlzdCAKLSAgICAgICAgICAgIHdoZW4gdGhlIHRhYmxlIGhhcyBtb3JlIHRoYW4gb25lIHBhZ2UuIAotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgIDwvcGFyYW1ldGVyPgotICAKLQk8cHJvcGVydHktc3BlY2lmaWNhdGlvbiBuYW1lPSJzZWxlY3RlZFBhZ2UiIHR5cGU9ImludCIvPgotICAKLQk8Y29tcG9uZW50IGlkPSJoaWRkZW5DdXJyZW50UGFnZSIgdHlwZT0iSGlkZGVuIj4KLQkJPGJpbmRpbmcgbmFtZT0idmFsdWUiIGV4cHJlc3Npb249ImN1cnJlbnRQYWdlIi8+Ci0JPC9jb21wb25lbnQ+Ci0gIAotCTxjb21wb25lbnQgaWQ9ImhpZGRlblBhZ2VDb3VudCIgdHlwZT0iSGlkZGVuIj4KLQkJPGJpbmRpbmcgbmFtZT0idmFsdWUiIGV4cHJlc3Npb249InBhZ2VDb3VudCIvPgotCTwvY29tcG9uZW50PgotICAKLQk8Y29tcG9uZW50IGlkPSJoaWRkZW5TdGFydFBhZ2UiIHR5cGU9IkhpZGRlbiI+Ci0JCTxiaW5kaW5nIG5hbWU9InZhbHVlIiBleHByZXNzaW9uPSJzdGFydFBhZ2UiLz4KLQk8L2NvbXBvbmVudD4KLSAgCi0JPGNvbXBvbmVudCBpZD0iaGlkZGVuU3RvcFBhZ2UiIHR5cGU9IkhpZGRlbiI+Ci0JCTxiaW5kaW5nIG5hbWU9InZhbHVlIiBleHByZXNzaW9uPSJzdG9wUGFnZSIvPgotCTwvY29tcG9uZW50PgotICAKLQk8Y29tcG9uZW50IGlkPSJjb25kQ3VycmVudCIgdHlwZT0iQ29uZGl0aW9uYWwiPgotCQk8YmluZGluZyBuYW1lPSJjb25kaXRpb24iIGV4cHJlc3Npb249ImNvbmRDdXJyZW50Ii8+Ci0JPC9jb21wb25lbnQ+Ci0gIAotCTxjb21wb25lbnQgaWQ9ImNvbmRPdGhlciIgdHlwZT0iQ29uZGl0aW9uYWwiPgotCQk8YmluZGluZyBuYW1lPSJjb25kaXRpb24iIGV4cHJlc3Npb249IiFjb25kQ3VycmVudCIvPgotCTwvY29tcG9uZW50PgotICAKLQk8Y29tcG9uZW50IGlkPSJpdGVyUGFnZSIgdHlwZT0iRm9yZWFjaCI+Ci0JCTxiaW5kaW5nIG5hbWU9InNvdXJjZSIgZXhwcmVzc2lvbj0icGFnZUxpc3QiLz4KLQkJPGJpbmRpbmcgbmFtZT0idmFsdWUiIGV4cHJlc3Npb249ImRpc3BsYXlQYWdlIi8+Ci0JPC9jb21wb25lbnQ+Ci0KLQk8Y29tcG9uZW50IGlkPSJpbnNlcnRDdXJyZW50UGFnZSIgdHlwZT0iSW5zZXJ0Ij4KLQkgICAgPGJpbmRpbmcgbmFtZT0idmFsdWUiIGV4cHJlc3Npb249ImRpc3BsYXlQYWdlIi8+Ci0JPC9jb21wb25lbnQ+Ci0KLQk8Y29tcG9uZW50IGlkPSJpbnNlcnRPdGhlclBhZ2UiIHR5cGU9Ikluc2VydCI+Ci0JICAgIDxiaW5kaW5nIG5hbWU9InZhbHVlIiBleHByZXNzaW9uPSJkaXNwbGF5UGFnZSIvPgotCTwvY29tcG9uZW50PgotCi0JPGNvbXBvbmVudCBpZD0ibGlua1BhZ2UiIHR5cGU9IkxpbmtTdWJtaXQiPgotCSAgICA8YmluZGluZyBuYW1lPSJsaXN0ZW5lciIgZXhwcmVzc2lvbj0ibGlzdGVuZXJzLmNoYW5nZVBhZ2UiLz4KLQkgICAgPGJpbmRpbmcgbmFtZT0idGFnIiBleHByZXNzaW9uPSJkaXNwbGF5UGFnZSIvPgotCSAgICA8YmluZGluZyBuYW1lPSJzZWxlY3RlZCIgZXhwcmVzc2lvbj0ic2VsZWN0ZWRQYWdlIi8+Ci0JPC9jb21wb25lbnQ+Ci0KLQk8Y29tcG9uZW50IGlkPSJsaW5rRmlyc3QiIHR5cGU9IkxpbmtTdWJtaXQiPgotCSAgICA8YmluZGluZyBuYW1lPSJsaXN0ZW5lciIgZXhwcmVzc2lvbj0ibGlzdGVuZXJzLmNoYW5nZVBhZ2UiLz4KLQkgICAgPGJpbmRpbmcgbmFtZT0idGFnIiBleHByZXNzaW9uPSIxIi8+Ci0JICAgIDxiaW5kaW5nIG5hbWU9InNlbGVjdGVkIiBleHByZXNzaW9uPSJzZWxlY3RlZFBhZ2UiLz4KLQkgICAgPGJpbmRpbmcgbmFtZT0iZGlzYWJsZWQiIGV4cHJlc3Npb249IiFjb25kQmFjayIvPgotCTwvY29tcG9uZW50PgotCi0JPGNvbXBvbmVudCBpZD0ibGlua0JhY2siIHR5cGU9IkxpbmtTdWJtaXQiPgotCSAgICA8YmluZGluZyBuYW1lPSJsaXN0ZW5lciIgZXhwcmVzc2lvbj0ibGlzdGVuZXJzLmNoYW5nZVBhZ2UiLz4KLQkgICAgPGJpbmRpbmcgbmFtZT0idGFnIiBleHByZXNzaW9uPSJjdXJyZW50UGFnZSAtIDEiLz4KLQkgICAgPGJpbmRpbmcgbmFtZT0ic2VsZWN0ZWQiIGV4cHJlc3Npb249InNlbGVjdGVkUGFnZSIvPgotCSAgICA8YmluZGluZyBuYW1lPSJkaXNhYmxlZCIgZXhwcmVzc2lvbj0iIWNvbmRCYWNrIi8+Ci0JPC9jb21wb25lbnQ+Ci0KLQk8Y29tcG9uZW50IGlkPSJsaW5rRndkIiB0eXBlPSJMaW5rU3VibWl0Ij4KLQkgICAgPGJpbmRpbmcgbmFtZT0ibGlzdGVuZXIiIGV4cHJlc3Npb249Imxpc3RlbmVycy5jaGFuZ2VQYWdlIi8+Ci0JICAgIDxiaW5kaW5nIG5hbWU9InRhZyIgZXhwcmVzc2lvbj0iY3VycmVudFBhZ2UgKyAxIi8+Ci0JICAgIDxiaW5kaW5nIG5hbWU9InNlbGVjdGVkIiBleHByZXNzaW9uPSJzZWxlY3RlZFBhZ2UiLz4KLQkgICAgPGJpbmRpbmcgbmFtZT0iZGlzYWJsZWQiIGV4cHJlc3Npb249IiFjb25kRndkIi8+Ci0JPC9jb21wb25lbnQ+Ci0JCi0JPGNvbXBvbmVudCBpZD0ibGlua0xhc3QiIHR5cGU9IkxpbmtTdWJtaXQiPgotCSAgICA8YmluZGluZyBuYW1lPSJsaXN0ZW5lciIgZXhwcmVzc2lvbj0ibGlzdGVuZXJzLmNoYW5nZVBhZ2UiLz4KLQkgICAgPGJpbmRpbmcgbmFtZT0idGFnIiBleHByZXNzaW9uPSJwYWdlQ291bnQiLz4KLQkgICAgPGJpbmRpbmcgbmFtZT0ic2VsZWN0ZWQiIGV4cHJlc3Npb249InNlbGVjdGVkUGFnZSIvPgotCSAgICA8YmluZGluZyBuYW1lPSJkaXNhYmxlZCIgZXhwcmVzc2lvbj0iIWNvbmRGd2QiLz4KLQk8L2NvbXBvbmVudD4KLQotPC9jb21wb25lbnQtc3BlY2lmaWNhdGlvbj4KZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90YWJsZS9jb21wb25lbnRzL1RhYmxlRm9ybVJvd3MuaHRtbCBiL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90YWJsZS9jb21wb25lbnRzL1RhYmxlRm9ybVJvd3MuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTNiNDkyYS4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdGFibGUvY29tcG9uZW50cy9UYWJsZUZvcm1Sb3dzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTwhLS0gJElkJCAtLT4KLQotPHNwYW4gandjaWQ9IiRjb250ZW50JCI+Ci0KLTx0ciBqd2NpZD0iaXRlclJvd3MiPgotCTxzcGFuIGp3Y2lkPSJAUmVuZGVyQm9keSIvPgotPC90cj4KLQotPC9zcGFuPgpkaWZmIC0tZ2l0IGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL2NvbXBvbmVudHMvVGFibGVGb3JtUm93cy5qYXZhIGIvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL2NvbXBvbmVudHMvVGFibGVGb3JtUm93cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzNkYWU5Li4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90YWJsZS9jb21wb25lbnRzL1RhYmxlRm9ybVJvd3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLmNvbXBvbmVudHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlcXVlc3RDeWNsZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuKjsKLQotCi0vKioKLSAqIEEgbG93IGxldmVsIFRhYmxlIGNvbXBvbmVudCB0aGF0IGdlbmVyYXRlcyB0aGUgcm93cyBvZiB0aGUgY3VycmVudCBwYWdlIGluIHRoZSB0YWJsZS4KLSAqIAotICogVGhpcyBjb21wb25lbnQgaXMgYSB2YXJpYW50IG9mIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUuY29tcG9uZW50cy5UYWJsZVBhZ2VzfSwKLSAqIGJ1dCBpcyBkZXNpZ25lZCBmb3Igb3BlcmF0aW9uIGluIGEgZm9ybS4gVGhlIGRpc3BsYXllZCByb3dzIGFyZSBzdG9yZWQgaW4gCi0gKiBoaWRkZW4gZm9ybSBmaWVsZHMsIHdoaWNoIGFyZSB0aGVuIHJlYWQgZHVyaW5nIGEgcmV3aW5kLiBUaGlzIGVuc3VyZXMgdGhhdAotICogdGhlIGZvcm0gd2lsbCByZXdpbmQgaW4gZXhhY3RseSB0aGUgc2FtZSB3YXMgYXMgaXQgd2FzIHJlbmRlcmVkIGV2ZW4gaWYgdGhlIAotICogVGFibGVNb2RlbCBoYXMgY2hhbmdlZCBhbmQgbm8gU3RhbGVMaW5rIGV4Y2VwdGlvbnMgd2lsbCBvY2N1ci4gCi0gKiAKLSAqIFRoZSBjb21wb25lbnQgbXVzdCBiZSB3cmFwcGVkIGJ5IHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUuY29tcG9uZW50cy5UYWJsZVZpZXd9LgotICogCi0gKiA8cD4KLSAqIFRoZSBjb21wb25lbnQgaXRlcmF0ZXMgb3ZlciB0aGUgcm93cyBvZiB0aGUgY3VycmVudCBwYWdlIGluIHRoZSB0YWJsZS4gCi0gKiBUaGUgcm93cyBhcmUgd3JhcHBlZCBpbiAndHInIHRhZ3MgYnkgZGVmYXVsdC4gCi0gKiBZb3UgY2FuIGRlZmluZSBjb2x1bW5zIG1hbnVhbGx5IHdpdGhpbiwgb3IKLSAqIHlvdSBjYW4gdXNlIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUuY29tcG9uZW50cy5UYWJsZVZhbHVlc30gCi0gKiB0byBnZW5lcmF0ZSB0aGUgY29sdW1ucyBhdXRvbWF0aWNhbGx5LgotICogPHA+IAotICogUGxlYXNlIHNlZSB0aGUgQ29tcG9uZW50IFJlZmVyZW5jZSBmb3IgZGV0YWlscyBvbiBob3cgdG8gdXNlIHRoaXMgY29tcG9uZW50LiAKLSAqIAotICogIFs8YSBocmVmPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9Db21wb25lbnRSZWZlcmVuY2UvY29udHJpYi5UYWJsZUZvcm1Sb3dzLmh0bWwiPkNvbXBvbmVudCBSZWZlcmVuY2U8L2E+XQotICogCi0gKiBAYXV0aG9yIG1pbmRicmlkZ2UKLSAqIEB2ZXJzaW9uICRJZCQKLSAqCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUYWJsZUZvcm1Sb3dzIGV4dGVuZHMgVGFibGVSb3dzCi17Ci0gICAgcHVibGljIGFic3RyYWN0IElQcmltYXJ5S2V5Q29udmVydG9yIGdldENvbnZlcnRvcigpOwotICAgIHB1YmxpYyBhYnN0cmFjdCBJUHJpbWFyeUtleUNvbnZlcnRvciBnZXRDb252ZXJ0b3JDYWNoZSgpOwotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldENvbnZlcnRvckNhY2hlKElQcmltYXJ5S2V5Q29udmVydG9yIGNvbnZlcnRvcik7Ci0gICAgcHVibGljIGFic3RyYWN0IE1hcCBnZXRDb252ZXJ0ZWRWYWx1ZXMoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIFBLIGNvbnZlcnRvciBjYWNoZWQgd2l0aGluIHRoZSByZWFsbSBvZiB0aGUgY3VycmVudCByZXF1ZXN0IGN5Y2xlLgotICAgICAqICAKLSAgICAgKiBAcmV0dXJuIHRoZSBjYWNoZWQgUEsgY29udmVydG9yCi0gICAgICovCi0gICAgcHVibGljIElQcmltYXJ5S2V5Q29udmVydG9yIGdldENhY2hlZENvbnZlcnRvcigpCi0gICAgewotICAgICAgICBJUHJpbWFyeUtleUNvbnZlcnRvciBvYmpDb252ZXJ0b3IgPSBnZXRDb252ZXJ0b3JDYWNoZSgpOwotICAgICAgICAKLSAgICAgICAgaWYgKG9iakNvbnZlcnRvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBvYmpDb252ZXJ0b3IgPSBnZXRDb252ZXJ0b3IoKTsKLSAgICAgICAgICAgIHNldENvbnZlcnRvckNhY2hlKG9iakNvbnZlcnRvcik7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBvYmpDb252ZXJ0b3I7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBsaXN0IG9mIGFsbCB0YWJsZSByb3dzIHRvIGJlIGRpc3BsYXllZCBvbiB0aGlzIHBhZ2UsIGNvbnZlcnRlZCAKLSAgICAgKiB1c2luZyB0aGUgUEsuY29udmVydG9yLgotICAgICAqIAotICAgICAqIEByZXR1cm4gYW4gaXRlcmF0b3Igb2YgYWxsIGNvbnZlcnRlZCB0YWJsZSByb3dzCi0gICAgICovICAgIAotICAgIHB1YmxpYyBJdGVyYXRvciBnZXRDb252ZXJ0ZWRUYWJsZVJvd3NJdGVyYXRvcigpCi0gICAgewotICAgICAgICBmaW5hbCBJdGVyYXRvciBvYmpUYWJsZVJvd3NJdGVyYXRvciA9IGdldFRhYmxlUm93c0l0ZXJhdG9yKCk7IAotICAgICAgICBmaW5hbCBJUHJpbWFyeUtleUNvbnZlcnRvciBvYmpDb252ZXJ0b3IgPSBnZXRDYWNoZWRDb252ZXJ0b3IoKTsKLSAgICAgICAgaWYgKG9iakNvbnZlcnRvciA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG9ialRhYmxlUm93c0l0ZXJhdG9yOwotICAgICAgICAgICAgCi0gICAgICAgIHJldHVybiBuZXcgSXRlcmF0b3IoKQotICAgICAgICB7Ci0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gb2JqVGFibGVSb3dzSXRlcmF0b3IuaGFzTmV4dCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgT2JqZWN0IG5leHQoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE9iamVjdCBvYmpWYWx1ZSA9IG9ialRhYmxlUm93c0l0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgICAgICBPYmplY3Qgb2JqUHJpbWFyeUtleSA9IG9iakNvbnZlcnRvci5nZXRQcmltYXJ5S2V5KG9ialZhbHVlKTsKLSAgICAgICAgICAgICAgICBNYXAgbWFwQ29udmVydGVkVmFsdWVzID0gZ2V0Q29udmVydGVkVmFsdWVzKCk7IAotICAgICAgICAgICAgICAgIG1hcENvbnZlcnRlZFZhbHVlcy5wdXQob2JqUHJpbWFyeUtleSwgb2JqVmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybiBvYmpQcmltYXJ5S2V5OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmUoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG9ialRhYmxlUm93c0l0ZXJhdG9yLnJlbW92ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGN1cnJlbnQgdGFibGUgcm93IFBLIGFuZCBpbnZva2VzIHtAbGluayAjc2V0VGFibGVSb3coT2JqZWN0KX0gYXMgYSByZXN1bHQuCi0gICAgICogVGhpcyBtZXRob2QgaXMgZm9yIGludGVybmFsIHVzZSBvbmx5LgotICAgICAqIAotICAgICAqIEBwYXJhbSBvYmpDb252ZXJ0ZWRUYWJsZVJvdyBUaGUgY3VycmVudCBjb252ZXJ0ZWQgdGFibGUgcm93IChQSykKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDb252ZXJ0ZWRUYWJsZVJvdyhPYmplY3Qgb2JqQ29udmVydGVkVGFibGVSb3cpCi0gICAgewotICAgICAgICBPYmplY3Qgb2JqVmFsdWUgPSBvYmpDb252ZXJ0ZWRUYWJsZVJvdzsKLQotICAgICAgICBJUHJpbWFyeUtleUNvbnZlcnRvciBvYmpDb252ZXJ0b3IgPSBnZXRDYWNoZWRDb252ZXJ0b3IoKTsKLSAgICAgICAgaWYgKG9iakNvbnZlcnRvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBJUmVxdWVzdEN5Y2xlIG9iakN5Y2xlID0gZ2V0UGFnZSgpLmdldFJlcXVlc3RDeWNsZSgpOwotICAgICAgICAgICAgaWYgKG9iakN5Y2xlLmlzUmV3aW5kaW5nKCkpIHsKLSAgICAgICAgICAgICAgICBvYmpWYWx1ZSA9IG9iakNvbnZlcnRvci5nZXRWYWx1ZShvYmpDb252ZXJ0ZWRUYWJsZVJvdyk7ICAKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIE1hcCBtYXBDb252ZXJ0ZWRWYWx1ZXMgPSBnZXRDb252ZXJ0ZWRWYWx1ZXMoKTsgCi0gICAgICAgICAgICAgICAgb2JqVmFsdWUgPSBtYXBDb252ZXJ0ZWRWYWx1ZXMuZ2V0KG9iakNvbnZlcnRlZFRhYmxlUm93KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHNldFRhYmxlUm93KG9ialZhbHVlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdGFibGUvY29tcG9uZW50cy9UYWJsZUZvcm1Sb3dzLmp3YyBiL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90YWJsZS9jb21wb25lbnRzL1RhYmxlRm9ybVJvd3MuandjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGQ1OTkyLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90YWJsZS9jb21wb25lbnRzL1RhYmxlRm9ybVJvd3MuandjCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICAKLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08IS0tICAkSWQkIC0tPgotPCFET0NUWVBFIGNvbXBvbmVudC1zcGVjaWZpY2F0aW9uIFBVQkxJQyAKLSAgIi0vL0FwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLy9UYXBlc3RyeSBTcGVjaWZpY2F0aW9uIDMuMC8vRU4iIAotICAiaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy90YXBlc3RyeS9kdGQvVGFwZXN0cnlfM18wLmR0ZCI+Ci0JCi08Y29tcG9uZW50LXNwZWNpZmljYXRpb24gY2xhc3M9Im9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5jb21wb25lbnRzLlRhYmxlRm9ybVJvd3MiIAotCWFsbG93LWJvZHk9InllcyIgYWxsb3ctaW5mb3JtYWwtcGFyYW1ldGVycz0ieWVzIj4KLQkKLQk8ZGVzY3JpcHRpb24+Ci0gICAgICAgIEEgdmVyc2lvbiBvZiB0aGUgVGFibGVSb3dzIGRlc2lnbmVkIGZvciBvcGVyYXRpb24gaW4gYSBmb3JtLiAKLSAgICAgICAgVGhpcyBpcyBhIGxvdyBsZXZlbCBUYWJsZSBjb21wb25lbnQgdGhhdCBnZW5lcmF0ZXMgdGhlIHJvd3Mgb2YgCi0gICAgICAgIHRoZSBjdXJyZW50IHBhZ2UgaW4gdGhlIHRhYmxlLiBFYWNoIHJvdyBpcyBzdG9yZWQgYXMgYSBoaWRkZW4gdmFsdWUgCi0gICAgICAgIGluIHRoZSBmb3JtLCB3aGljaCBlbGltaW5hdGVzIHRoZSBjaGFuY2Ugb2YgYSBzdGFsZSBsaW5rIGR1cmluZyByZXdpbmRpbmcuIAotICAgICAgICBUaGlzIGNvbXBvbmVudCBtdXN0IGJlIHdyYXBwZWQgYnkgVGFibGVWaWV3LiAKLQk8L2Rlc2NyaXB0aW9uPgotICAKLQk8cGFyYW1ldGVyIG5hbWU9InJvdyIgCi0JCXR5cGU9Ik9iamVjdCIgCi0JCXJlcXVpcmVkPSJubyIKLQkJZGlyZWN0aW9uPSJjdXN0b20iPgotICAgICAgICA8ZGVzY3JpcHRpb24+VGhlIHZhbHVlIG9iamVjdCBvZiB0aGUgcm93IGN1cnJlbnRseSBiZWluZyByZW5kZXJlZC48L2Rlc2NyaXB0aW9uPgotICAgIDwvcGFyYW1ldGVyPgotCi0gICAgPHBhcmFtZXRlciBuYW1lPSJjb252ZXJ0b3IiCi0gICAgCXR5cGU9Im9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5tb2RlbC5JUHJpbWFyeUtleUNvbnZlcnRvciIKLSAgICAJcmVxdWlyZWQ9Im5vIgotICAgIAlkaXJlY3Rpb249ImF1dG8iCi0gICAgCWRlZmF1bHQtdmFsdWU9Im51bGwiPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgIEFuIGludGVyZmFjZSBkZWZpbmluZyBob3cgdGhlIGl0ZW1zIGl0ZXJhdGVkIHVwb24gYnkgdGhpcyBjb21wb25lbnQgCi0gICAgICAgIHdpbGwgYmUgc3RvcmVkIGluIHRoZSBmb3JtIGFzIEhpZGRlbiB2YWx1ZXMuIFRoaXMgaW50ZXJmYWNlIGFsbG93cyBvbmx5IAotICAgICAgICB0aGUgcHJpbWFyeSBrZXkgb2YgdGhlIGl0ZW1zIHRvIGJlIHN0b3JlZCwgcmF0aGVyIHRoYW4gdGhlIHdob2xlIGl0ZW0uCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgPC9wYXJhbWV0ZXI+Ci0gICAgCi0JPHBhcmFtZXRlciBuYW1lPSJlbGVtZW50IiAKLQkJdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgCi0JCXJlcXVpcmVkPSJubyIKLQkJZGVmYXVsdC12YWx1ZT0nInRyIic+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5UaGUgdGFnIHRvIHVzZSB0byB3cmFwIHRoZSByb3dzIGluLCAndHInIGJ5IGRlZmF1bHQuPC9kZXNjcmlwdGlvbj4KLSAgICA8L3BhcmFtZXRlcj4KLQotCTxjb21wb25lbnQgaWQ9Iml0ZXJSb3dzIiB0eXBlPSJMaXN0RWRpdCIgaW5oZXJpdC1pbmZvcm1hbC1wYXJhbWV0ZXJzPSJ5ZXMiPgotCQk8YmluZGluZyBuYW1lPSJzb3VyY2UiIGV4cHJlc3Npb249ImNvbnZlcnRlZFRhYmxlUm93c0l0ZXJhdG9yIi8+Ci0JCTxiaW5kaW5nIG5hbWU9InZhbHVlIiBleHByZXNzaW9uPSJjb252ZXJ0ZWRUYWJsZVJvdyIvPgotICAgICAgICA8aW5oZXJpdGVkLWJpbmRpbmcgbmFtZT0iZWxlbWVudCIgcGFyYW1ldGVyLW5hbWU9ImVsZW1lbnQiLz4KLQk8L2NvbXBvbmVudD4KLQotICAgIDxwcm9wZXJ0eS1zcGVjaWZpY2F0aW9uIG5hbWU9ImNvbnZlcnRlZFZhbHVlcyIgdHlwZT0iamF2YS51dGlsLk1hcCIgaW5pdGlhbC12YWx1ZT0ibmV3IGphdmEudXRpbC5IYXNoTWFwKCkiLz4KLSAgICA8cHJvcGVydHktc3BlY2lmaWNhdGlvbiBuYW1lPSJjb252ZXJ0b3JDYWNoZSIgdHlwZT0ib3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsLklQcmltYXJ5S2V5Q29udmVydG9yIiBpbml0aWFsLXZhbHVlPSJudWxsIi8+Ci0gICAgICAKLTwvY29tcG9uZW50LXNwZWNpZmljYXRpb24+CmRpZmYgLS1naXQgYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdGFibGUvY29tcG9uZW50cy9UYWJsZVBhZ2VzLmh0bWwgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdGFibGUvY29tcG9uZW50cy9UYWJsZVBhZ2VzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjZjk4ZWMuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL2NvbXBvbmVudHMvVGFibGVQYWdlcy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPCEtLSAkSWQkIC0tPgotCi08c3BhbiBqd2NpZD0iJGNvbnRlbnQkIj4KLQotPHNwYW4gandjaWQ9ImluZm9ybWFsIj4KLQotCTxhIGp3Y2lkPSJsaW5rRmlyc3QiPiZsdDsmbHQ7PC9hPiAgCi0JPGEgandjaWQ9ImxpbmtCYWNrIj4mbHQ7PC9hPiAKLQkKLQk8c3BhbiBqd2NpZD0iaXRlclBhZ2UiPgotCQotCQk8c3BhbiBqd2NpZD0iY29uZEN1cnJlbnQiPgotCQkJPGI+PHNwYW4gandjaWQ9Imluc2VydEN1cnJlbnRQYWdlIi8+PC9iPgotCQk8L3NwYW4+Ci0JCi0JCTxzcGFuIGp3Y2lkPSJjb25kT3RoZXIiPgotCQkJPGEgandjaWQ9ImxpbmtQYWdlIj48c3BhbiBqd2NpZD0iaW5zZXJ0T3RoZXJQYWdlIi8+PC9hPgotCQk8L3NwYW4+Ci0JCi0JPC9zcGFuPgotCQotCTxhIGp3Y2lkPSJsaW5rRndkIj4mZ3Q7PC9hPgotCTxhIGp3Y2lkPSJsaW5rTGFzdCI+Jmd0OyZndDs8L2E+Ci0KLTwvc3Bhbj4KLQotPC9zcGFuPgpkaWZmIC0tZ2l0IGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL2NvbXBvbmVudHMvVGFibGVQYWdlcy5qYXZhIGIvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL2NvbXBvbmVudHMvVGFibGVQYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YWVlNTFmLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90YWJsZS9jb21wb25lbnRzL1RhYmxlUGFnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NSArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLmNvbXBvbmVudHM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZXF1ZXN0Q3ljbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsLklUYWJsZU1vZGVsU291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkudXRpbC5Db21wb25lbnRBZGRyZXNzOwotCi0vKioKLSAqIEEgbG93IGxldmVsIFRhYmxlIGNvbXBvbmVudCB0aGF0IHJlbmRlcnMgdGhlIHBhZ2VzIGluIHRoZSB0YWJsZS4KLSAqIFRoaXMgY29tcG9uZW50IG11c3QgYmUgd3JhcHBlZCBieSB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLmNvbXBvbmVudHMuVGFibGVWaWV3fS4KLSAqIDxwPgotICogVGhlIGNvbXBvbmVudCBnZW5lcmF0ZXMgYSBsaXN0IG9mIHBhZ2VzIGluIHRoZSBUYWJsZSBjZW50ZXJlZCBhcm91bmQgdGhlIAotICogY3VycmVudCBvbmUgYW5kIGFsbG93cyB5b3UgdG8gbmF2aWdhdGUgdG8gb3RoZXIgcGFnZXMuCi0gKiA8cD4gCi0gKiBQbGVhc2Ugc2VlIHRoZSBDb21wb25lbnQgUmVmZXJlbmNlIGZvciBkZXRhaWxzIG9uIGhvdyB0byB1c2UgdGhpcyBjb21wb25lbnQuIAotICogCi0gKiAgWzxhIGhyZWY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL0NvbXBvbmVudFJlZmVyZW5jZS9jb250cmliLlRhYmxlUGFnZXMuaHRtbCI+Q29tcG9uZW50IFJlZmVyZW5jZTwvYT5dCi0gKiAKLSAqIEBhdXRob3IgbWluZGJyaWRnZQotICogQHZlcnNpb24gJElkJAotICoKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFRhYmxlUGFnZXMgZXh0ZW5kcyBBYnN0cmFjdFRhYmxlVmlld0NvbXBvbmVudAotewotICAgIC8vIEJpbmRpbmdzICAgIAotICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0UGFnZXNEaXNwbGF5ZWQoKTsKLQotICAgIC8vIFRyYW5zaWVudAotICAgIHByaXZhdGUgaW50IG1fbkRpc3BsYXlQYWdlOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZGlzcGxheVBhZ2UuCi0gICAgICogQHJldHVybiBpbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldERpc3BsYXlQYWdlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX25EaXNwbGF5UGFnZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBkaXNwbGF5UGFnZS4KLSAgICAgKiBAcGFyYW0gZGlzcGxheVBhZ2UgVGhlIGRpc3BsYXlQYWdlIHRvIHNldAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERpc3BsYXlQYWdlKGludCBkaXNwbGF5UGFnZSkKLSAgICB7Ci0gICAgICAgIG1fbkRpc3BsYXlQYWdlID0gZGlzcGxheVBhZ2U7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRDdXJyZW50UGFnZSgpCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0VGFibGVNb2RlbFNvdXJjZSgpLmdldFRhYmxlTW9kZWwoKS5nZXRQYWdpbmdTdGF0ZSgpLmdldEN1cnJlbnRQYWdlKCkgKyAxOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0UGFnZUNvdW50KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRUYWJsZU1vZGVsU291cmNlKCkuZ2V0VGFibGVNb2RlbCgpLmdldFBhZ2VDb3VudCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGdldENvbmRCYWNrKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRDdXJyZW50UGFnZSgpID4gMTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRDb25kRndkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRDdXJyZW50UGFnZSgpIDwgZ2V0UGFnZUNvdW50KCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0Q29uZEN1cnJlbnQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldERpc3BsYXlQYWdlKCkgPT0gZ2V0Q3VycmVudFBhZ2UoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldFN0YXJ0UGFnZSgpCi0gICAgewotICAgICAgICBpbnQgbkN1cnJlbnQgPSBnZXRDdXJyZW50UGFnZSgpOwotICAgICAgICBpbnQgblBhZ2VzRGlzcGxheWVkID0gZ2V0UGFnZXNEaXNwbGF5ZWQoKTsKLQotICAgICAgICBpbnQgblJpZ2h0TWFyZ2luID0gblBhZ2VzRGlzcGxheWVkIC8gMjsKLSAgICAgICAgaW50IG5TdG9wID0gbkN1cnJlbnQgKyBuUmlnaHRNYXJnaW47Ci0gICAgICAgIGludCBuTGFzdFBhZ2UgPSBnZXRQYWdlQ291bnQoKTsKLQotICAgICAgICBpbnQgbkxlZnRBZGRvbiA9IDA7Ci0gICAgICAgIGlmIChuU3RvcCA+IG5MYXN0UGFnZSkKLSAgICAgICAgICAgIG5MZWZ0QWRkb24gPSBuU3RvcCAtIG5MYXN0UGFnZTsKLQotICAgICAgICBpbnQgbkxlZnRNYXJnaW4gPSAoblBhZ2VzRGlzcGxheWVkIC0gMSkgLyAyICsgbkxlZnRBZGRvbjsKLSAgICAgICAgaW50IG5TdGFydCA9IG5DdXJyZW50IC0gbkxlZnRNYXJnaW47Ci0gICAgICAgIGludCBuRmlyc3RQYWdlID0gMTsKLSAgICAgICAgaWYgKG5TdGFydCA8IG5GaXJzdFBhZ2UpCi0gICAgICAgICAgICBuU3RhcnQgPSBuRmlyc3RQYWdlOwotICAgICAgICByZXR1cm4gblN0YXJ0OwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0U3RvcFBhZ2UoKQotICAgIHsKLSAgICAgICAgaW50IG5DdXJyZW50ID0gZ2V0Q3VycmVudFBhZ2UoKTsKLSAgICAgICAgaW50IG5QYWdlc0Rpc3BsYXllZCA9IGdldFBhZ2VzRGlzcGxheWVkKCk7Ci0KLSAgICAgICAgaW50IG5MZWZ0TWFyZ2luID0gKG5QYWdlc0Rpc3BsYXllZCAtIDEpIC8gMjsKLSAgICAgICAgaW50IG5TdGFydCA9IG5DdXJyZW50IC0gbkxlZnRNYXJnaW47Ci0gICAgICAgIGludCBuRmlyc3RQYWdlID0gMTsKLQotICAgICAgICBpbnQgblJpZ2h0QWRkb24gPSAwOwotICAgICAgICBpZiAoblN0YXJ0IDwgbkZpcnN0UGFnZSkKLSAgICAgICAgICAgIG5SaWdodEFkZG9uID0gbkZpcnN0UGFnZSAtIG5TdGFydDsKLQotICAgICAgICBpbnQgblJpZ2h0TWFyZ2luID0gblBhZ2VzRGlzcGxheWVkIC8gMiArIG5SaWdodEFkZG9uOwotICAgICAgICBpbnQgblN0b3AgPSBuQ3VycmVudCArIG5SaWdodE1hcmdpbjsKLSAgICAgICAgaW50IG5MYXN0UGFnZSA9IGdldFBhZ2VDb3VudCgpOwotICAgICAgICBpZiAoblN0b3AgPiBuTGFzdFBhZ2UpCi0gICAgICAgICAgICBuU3RvcCA9IG5MYXN0UGFnZTsKLSAgICAgICAgcmV0dXJuIG5TdG9wOwotICAgIH0KLQotICAgIHB1YmxpYyBJbnRlZ2VyW10gZ2V0UGFnZUxpc3QoKQotICAgIHsKLSAgICAgICAgaW50IG5TdGFydCA9IGdldFN0YXJ0UGFnZSgpOwotICAgICAgICBpbnQgblN0b3AgPSBnZXRTdG9wUGFnZSgpOwotCi0gICAgICAgIEludGVnZXJbXSBhcnJQYWdlcyA9IG5ldyBJbnRlZ2VyW25TdG9wIC0gblN0YXJ0ICsgMV07Ci0gICAgICAgIGZvciAoaW50IGkgPSBuU3RhcnQ7IGkgPD0gblN0b3A7IGkrKykKLSAgICAgICAgICAgIGFyclBhZ2VzW2kgLSBuU3RhcnRdID0gbmV3IEludGVnZXIoaSk7Ci0KLSAgICAgICAgcmV0dXJuIGFyclBhZ2VzOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3RbXSBnZXRGaXJzdFBhZ2VDb250ZXh0KCkKLSAgICB7Ci0gICAgICAgIENvbXBvbmVudEFkZHJlc3Mgb2JqQWRkcmVzcyA9IG5ldyBDb21wb25lbnRBZGRyZXNzKGdldFRhYmxlTW9kZWxTb3VyY2UoKSk7Ci0gICAgICAgIHJldHVybiBuZXcgT2JqZWN0W10geyBvYmpBZGRyZXNzLCBuZXcgSW50ZWdlcigxKX07Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdFtdIGdldExhc3RQYWdlQ29udGV4dCgpCi0gICAgewotICAgICAgICBDb21wb25lbnRBZGRyZXNzIG9iakFkZHJlc3MgPSBuZXcgQ29tcG9uZW50QWRkcmVzcyhnZXRUYWJsZU1vZGVsU291cmNlKCkpOwotICAgICAgICByZXR1cm4gbmV3IE9iamVjdFtdIHsgb2JqQWRkcmVzcywgbmV3IEludGVnZXIoZ2V0UGFnZUNvdW50KCkpfTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0W10gZ2V0QmFja1BhZ2VDb250ZXh0KCkKLSAgICB7Ci0gICAgICAgIENvbXBvbmVudEFkZHJlc3Mgb2JqQWRkcmVzcyA9IG5ldyBDb21wb25lbnRBZGRyZXNzKGdldFRhYmxlTW9kZWxTb3VyY2UoKSk7Ci0gICAgICAgIHJldHVybiBuZXcgT2JqZWN0W10geyBvYmpBZGRyZXNzLCBuZXcgSW50ZWdlcihnZXRDdXJyZW50UGFnZSgpIC0gMSl9OwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3RbXSBnZXRGd2RQYWdlQ29udGV4dCgpCi0gICAgewotICAgICAgICBDb21wb25lbnRBZGRyZXNzIG9iakFkZHJlc3MgPSBuZXcgQ29tcG9uZW50QWRkcmVzcyhnZXRUYWJsZU1vZGVsU291cmNlKCkpOwotICAgICAgICByZXR1cm4gbmV3IE9iamVjdFtdIHsgb2JqQWRkcmVzcywgbmV3IEludGVnZXIoZ2V0Q3VycmVudFBhZ2UoKSArIDEpfTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0W10gZ2V0RGlzcGxheVBhZ2VDb250ZXh0KCkKLSAgICB7Ci0gICAgICAgIENvbXBvbmVudEFkZHJlc3Mgb2JqQWRkcmVzcyA9IG5ldyBDb21wb25lbnRBZGRyZXNzKGdldFRhYmxlTW9kZWxTb3VyY2UoKSk7Ci0gICAgICAgIHJldHVybiBuZXcgT2JqZWN0W10geyBvYmpBZGRyZXNzLCBuZXcgSW50ZWdlcihtX25EaXNwbGF5UGFnZSl9OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNoYW5nZVBhZ2UoSVJlcXVlc3RDeWNsZSBvYmpDeWNsZSkKLSAgICB7Ci0gICAgICAgIE9iamVjdFtdIGFyclBhcmFtZXRlcnMgPSBvYmpDeWNsZS5nZXRTZXJ2aWNlUGFyYW1ldGVycygpOwotICAgICAgICBpZiAoYXJyUGFyYW1ldGVycy5sZW5ndGggIT0gMgotICAgICAgICAgICAgJiYgIShhcnJQYXJhbWV0ZXJzWzBdIGluc3RhbmNlb2YgQ29tcG9uZW50QWRkcmVzcykKLSAgICAgICAgICAgICYmICEoYXJyUGFyYW1ldGVyc1sxXSBpbnN0YW5jZW9mIEludGVnZXIpKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBlcnJvcgotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgQ29tcG9uZW50QWRkcmVzcyBvYmpBZGRyZXNzID0gKENvbXBvbmVudEFkZHJlc3MpIGFyclBhcmFtZXRlcnNbMF07Ci0gICAgICAgIElUYWJsZU1vZGVsU291cmNlIG9ialNvdXJjZSA9IChJVGFibGVNb2RlbFNvdXJjZSkgb2JqQWRkcmVzcy5maW5kQ29tcG9uZW50KG9iakN5Y2xlKTsKLSAgICAgICAgc2V0Q3VycmVudFBhZ2Uob2JqU291cmNlLCAoKEludGVnZXIpIGFyclBhcmFtZXRlcnNbMV0pLmludFZhbHVlKCkpOwotCi0gICAgICAgIC8vIGVuc3VyZSB0aGF0IHRoZSBjaGFuZ2UgaXMgc2F2ZWQKLSAgICAgICAgb2JqU291cmNlLmZpcmVPYnNlcnZlZFN0YXRlQ2hhbmdlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q3VycmVudFBhZ2UoSVRhYmxlTW9kZWxTb3VyY2Ugb2JqU291cmNlLCBpbnQgblBhZ2UpCi0gICAgewotICAgICAgICBvYmpTb3VyY2UuZ2V0VGFibGVNb2RlbCgpLmdldFBhZ2luZ1N0YXRlKCkuc2V0Q3VycmVudFBhZ2UoblBhZ2UgLSAxKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90YWJsZS9jb21wb25lbnRzL1RhYmxlUGFnZXMuandjIGIvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL2NvbXBvbmVudHMvVGFibGVQYWdlcy5qd2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4NjQwZGUuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL2NvbXBvbmVudHMvVGFibGVQYWdlcy5qd2MKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gIAotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTwhLS0gICRJZCQgLS0+Ci08IURPQ1RZUEUgY29tcG9uZW50LXNwZWNpZmljYXRpb24gUFVCTElDIAotICAiLS8vQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24vL1RhcGVzdHJ5IFNwZWNpZmljYXRpb24gMy4wLy9FTiIgCi0gICJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL3RhcGVzdHJ5L2R0ZC9UYXBlc3RyeV8zXzAuZHRkIj4KLQkKLTxjb21wb25lbnQtc3BlY2lmaWNhdGlvbiBjbGFzcz0ib3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLmNvbXBvbmVudHMuVGFibGVQYWdlcyIgCi0JYWxsb3ctYm9keT0ibm8iIGFsbG93LWluZm9ybWFsLXBhcmFtZXRlcnM9InllcyI+Ci0JCi0JPGRlc2NyaXB0aW9uPgotICAgICAgICBBIGxvdyBsZXZlbCBUYWJsZSBjb21wb25lbnQgdGhhdCByZW5kZXJzIHRoZSBwYWdlcyBpbiB0aGUgdGFibGUuIAotICAgICAgICBUaGlzIGNvbXBvbmVudCBtdXN0IGJlIHdyYXBwZWQgYnkgVGFibGVWaWV3LiAKLQk8L2Rlc2NyaXB0aW9uPgotICAKLQk8cGFyYW1ldGVyIG5hbWU9InBhZ2VzRGlzcGxheWVkIiAKLQkJdHlwZT0iaW50IiAKLQkJcmVxdWlyZWQ9Im5vIgotCQlkaXJlY3Rpb249ImF1dG8iCi0gICAgCWRlZmF1bHQtdmFsdWU9IjciPgotCQk8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBEZXRlcm1pbmVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBwYWdlcyB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIHBhZ2UgbGlzdCAKLSAgICAgICAgICAgIHdoZW4gdGhlIHRhYmxlIGhhcyBtb3JlIHRoYW4gb25lIHBhZ2UuIAotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgIDwvcGFyYW1ldGVyPgotCi0JPGNvbXBvbmVudCBpZD0iaW5mb3JtYWwiIHR5cGU9IkFueSIgaW5oZXJpdC1pbmZvcm1hbC1wYXJhbWV0ZXJzPSJ5ZXMiLz4KLSAgCi0JPGNvbXBvbmVudCBpZD0iY29uZEN1cnJlbnQiIHR5cGU9IkNvbmRpdGlvbmFsIj4KLQkJPGJpbmRpbmcgbmFtZT0iY29uZGl0aW9uIiBleHByZXNzaW9uPSJjb25kQ3VycmVudCIvPgotCTwvY29tcG9uZW50PgotICAKLQk8Y29tcG9uZW50IGlkPSJjb25kT3RoZXIiIHR5cGU9IkNvbmRpdGlvbmFsIj4KLQkJPGJpbmRpbmcgbmFtZT0iY29uZGl0aW9uIiBleHByZXNzaW9uPSJjb25kQ3VycmVudCIvPgotCQk8c3RhdGljLWJpbmRpbmcgbmFtZT0iaW52ZXJ0Ij50cnVlPC9zdGF0aWMtYmluZGluZz4KLQk8L2NvbXBvbmVudD4KLSAgCi0JPGNvbXBvbmVudCBpZD0iaXRlclBhZ2UiIHR5cGU9IkZvcmVhY2giPgotCQk8YmluZGluZyBuYW1lPSJzb3VyY2UiIGV4cHJlc3Npb249InBhZ2VMaXN0Ii8+Ci0JCTxiaW5kaW5nIG5hbWU9InZhbHVlIiBleHByZXNzaW9uPSJkaXNwbGF5UGFnZSIvPgotCTwvY29tcG9uZW50PgotCi0JPGNvbXBvbmVudCBpZD0iaW5zZXJ0Q3VycmVudFBhZ2UiIHR5cGU9Ikluc2VydCI+Ci0JICAgIDxiaW5kaW5nIG5hbWU9InZhbHVlIiBleHByZXNzaW9uPSJkaXNwbGF5UGFnZSIvPgotCTwvY29tcG9uZW50PgotCi0JPGNvbXBvbmVudCBpZD0iaW5zZXJ0T3RoZXJQYWdlIiB0eXBlPSJJbnNlcnQiPgotCSAgICA8YmluZGluZyBuYW1lPSJ2YWx1ZSIgZXhwcmVzc2lvbj0iZGlzcGxheVBhZ2UiLz4KLQk8L2NvbXBvbmVudD4KLQotCTxjb21wb25lbnQgaWQ9ImxpbmtQYWdlIiB0eXBlPSJEaXJlY3RMaW5rIj4KLQkgICAgPGJpbmRpbmcgbmFtZT0ibGlzdGVuZXIiIGV4cHJlc3Npb249Imxpc3RlbmVycy5jaGFuZ2VQYWdlIi8+Ci0JICAgIDxiaW5kaW5nIG5hbWU9InBhcmFtZXRlcnMiIGV4cHJlc3Npb249ImRpc3BsYXlQYWdlQ29udGV4dCIvPgotCTwvY29tcG9uZW50PgotCi0JPGNvbXBvbmVudCBpZD0ibGlua0ZpcnN0IiB0eXBlPSJEaXJlY3RMaW5rIj4KLQkgICAgPGJpbmRpbmcgbmFtZT0ibGlzdGVuZXIiIGV4cHJlc3Npb249Imxpc3RlbmVycy5jaGFuZ2VQYWdlIi8+Ci0JICAgIDxiaW5kaW5nIG5hbWU9InBhcmFtZXRlcnMiIGV4cHJlc3Npb249ImZpcnN0UGFnZUNvbnRleHQiLz4KLQkgICAgPGJpbmRpbmcgbmFtZT0iZGlzYWJsZWQiIGV4cHJlc3Npb249IiFjb25kQmFjayIvPgotCTwvY29tcG9uZW50PgotCi0JPGNvbXBvbmVudCBpZD0ibGlua0JhY2siIHR5cGU9IkRpcmVjdExpbmsiPgotCSAgICA8YmluZGluZyBuYW1lPSJsaXN0ZW5lciIgZXhwcmVzc2lvbj0ibGlzdGVuZXJzLmNoYW5nZVBhZ2UiLz4KLQkgICAgPGJpbmRpbmcgbmFtZT0icGFyYW1ldGVycyIgZXhwcmVzc2lvbj0iYmFja1BhZ2VDb250ZXh0Ii8+Ci0JICAgIDxiaW5kaW5nIG5hbWU9ImRpc2FibGVkIiBleHByZXNzaW9uPSIhY29uZEJhY2siLz4KLQk8L2NvbXBvbmVudD4KLQotCTxjb21wb25lbnQgaWQ9ImxpbmtGd2QiIHR5cGU9IkRpcmVjdExpbmsiPgotCSAgICA8YmluZGluZyBuYW1lPSJsaXN0ZW5lciIgZXhwcmVzc2lvbj0ibGlzdGVuZXJzLmNoYW5nZVBhZ2UiLz4KLQkgICAgPGJpbmRpbmcgbmFtZT0icGFyYW1ldGVycyIgZXhwcmVzc2lvbj0iZndkUGFnZUNvbnRleHQiLz4KLQkgICAgPGJpbmRpbmcgbmFtZT0iZGlzYWJsZWQiIGV4cHJlc3Npb249IiFjb25kRndkIi8+Ci0JPC9jb21wb25lbnQ+Ci0JCi0JPGNvbXBvbmVudCBpZD0ibGlua0xhc3QiIHR5cGU9IkRpcmVjdExpbmsiPgotCSAgICA8YmluZGluZyBuYW1lPSJsaXN0ZW5lciIgZXhwcmVzc2lvbj0ibGlzdGVuZXJzLmNoYW5nZVBhZ2UiLz4KLQkgICAgPGJpbmRpbmcgbmFtZT0icGFyYW1ldGVycyIgZXhwcmVzc2lvbj0ibGFzdFBhZ2VDb250ZXh0Ii8+Ci0JICAgIDxiaW5kaW5nIG5hbWU9ImRpc2FibGVkIiBleHByZXNzaW9uPSIhY29uZEZ3ZCIvPgotCTwvY29tcG9uZW50PgotCQotPC9jb21wb25lbnQtc3BlY2lmaWNhdGlvbj4KZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90YWJsZS9jb21wb25lbnRzL1RhYmxlUm93cy5odG1sIGIvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL2NvbXBvbmVudHMvVGFibGVSb3dzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhNzNmMzQuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL2NvbXBvbmVudHMvVGFibGVSb3dzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08IS0tICRJZCQgLS0+Ci0KLTxzcGFuIGp3Y2lkPSIkY29udGVudCQiPgotCi08c3BhbiBqd2NpZD0iaXRlclJvd3MiPgotCTx0ciBqd2NpZD0iaW5mb3JtYWwiPgotCQk8c3BhbiBqd2NpZD0id3JhcHBlZCIvPgotCTwvdHI+Ci08L3NwYW4+Ci0KLTwvc3Bhbj4KZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90YWJsZS9jb21wb25lbnRzL1RhYmxlUm93cy5qYXZhIGIvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL2NvbXBvbmVudHMvVGFibGVSb3dzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5NmI0MjcuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL2NvbXBvbmVudHMvVGFibGVSb3dzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5jb21wb25lbnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JQmluZGluZzsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklNYXJrdXBXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVxdWVzdEN5Y2xlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5tb2RlbC5JVGFibGVNb2RlbDsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuSVRhYmxlUm93U291cmNlOwotCi0vKioKLSAqIEEgbG93IGxldmVsIFRhYmxlIGNvbXBvbmVudCB0aGF0IGdlbmVyYXRlcyB0aGUgcm93cyBvZiB0aGUgY3VycmVudCBwYWdlIGluIHRoZSB0YWJsZS4KLSAqIFRoaXMgY29tcG9uZW50IG11c3QgYmUgd3JhcHBlZCBieSB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLmNvbXBvbmVudHMuVGFibGVWaWV3fS4KLSAqIAotICogPHA+Ci0gKiBUaGUgY29tcG9uZW50IGl0ZXJhdGVzIG92ZXIgdGhlIHJvd3Mgb2YgdGhlIGN1cnJlbnQgcGFnZSBpbiB0aGUgdGFibGUuIAotICogVGhlIHJvd3MgYXJlIHdyYXBwZWQgaW4gJ3RyJyB0YWdzIGJ5IGRlZmF1bHQuIAotICogWW91IGNhbiBkZWZpbmUgY29sdW1ucyBtYW51YWxseSB3aXRoaW4sIG9yCi0gKiB5b3UgY2FuIHVzZSB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLmNvbXBvbmVudHMuVGFibGVWYWx1ZXN9IAotICogdG8gZ2VuZXJhdGUgdGhlIGNvbHVtbnMgYXV0b21hdGljYWxseS4KLSAqIAotICogPHA+IAotICogUGxlYXNlIHNlZSB0aGUgQ29tcG9uZW50IFJlZmVyZW5jZSBmb3IgZGV0YWlscyBvbiBob3cgdG8gdXNlIHRoaXMgY29tcG9uZW50LiAKLSAqIAotICogIFs8YSBocmVmPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9Db21wb25lbnRSZWZlcmVuY2UvY29udHJpYi5UYWJsZVJvd3MuaHRtbCI+Q29tcG9uZW50IFJlZmVyZW5jZTwvYT5dCi0gKiAKLSAqIEBhdXRob3IgbWluZGJyaWRnZQotICogQHZlcnNpb24gJElkJAotICoKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFRhYmxlUm93cyBleHRlbmRzIEFic3RyYWN0VGFibGVWaWV3Q29tcG9uZW50IGltcGxlbWVudHMgSVRhYmxlUm93U291cmNlCi17Ci0gICAgLy8gUGFyYW1ldGVycwotICAgIHB1YmxpYyBhYnN0cmFjdCBJQmluZGluZyBnZXRSb3dCaW5kaW5nKCk7Ci0KLSAgICAvLyBUcmFuc2llbnQKLSAgICBwcml2YXRlIE9iamVjdCBtX29ialRhYmxlUm93ID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnRseSByZW5kZXJlZCB0YWJsZSByb3cuCi0gICAgICogWW91IGNhbiBjYWxsIHRoaXMgbWV0aG9kIHRvIG9idGFpbiB0aGUgY3VycmVudCByb3cuCi0gICAgICogIAotICAgICAqIEByZXR1cm4gT2JqZWN0IHRoZSBjdXJyZW50IHRhYmxlIHJvdwotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0VGFibGVSb3coKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fb2JqVGFibGVSb3c7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY3VycmVudGx5IHJlbmRlcmVkIHRhYmxlIHJvdy4gCi0gICAgICogVGhpcyBtZXRob2QgaXMgZm9yIGludGVybmFsIHVzZSBvbmx5LgotICAgICAqIAotICAgICAqIEBwYXJhbSB0YWJsZVJvdyBUaGUgY3VycmVudCB0YWJsZSByb3cKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUYWJsZVJvdyhPYmplY3QgdGFibGVSb3cpCi0gICAgewotICAgICAgICBtX29ialRhYmxlUm93ID0gdGFibGVSb3c7Ci0KLSAgICAgICAgSUJpbmRpbmcgb2JqUm93QmluZGluZyA9IGdldFJvd0JpbmRpbmcoKTsKLSAgICAgICAgaWYgKG9ialJvd0JpbmRpbmcgIT0gbnVsbCkKLSAgICAgICAgICAgIG9ialJvd0JpbmRpbmcuc2V0T2JqZWN0KHRhYmxlUm93KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGxpc3Qgb2YgYWxsIHRhYmxlIHJvd3MgdG8gYmUgZGlzcGxheWVkIG9uIHRoaXMgcGFnZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGFuIGl0ZXJhdG9yIG9mIGFsbCB0YWJsZSByb3dzCi0gICAgICovCi0gICAgcHVibGljIEl0ZXJhdG9yIGdldFRhYmxlUm93c0l0ZXJhdG9yKCkKLSAgICB7Ci0gICAgICAgIElUYWJsZU1vZGVsIG9ialRhYmxlTW9kZWwgPSBnZXRUYWJsZU1vZGVsU291cmNlKCkuZ2V0VGFibGVNb2RlbCgpOwotICAgICAgICByZXR1cm4gb2JqVGFibGVNb2RlbC5nZXRDdXJyZW50UGFnZVJvd3MoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUudGFwZXN0cnkuQmFzZUNvbXBvbmVudCNyZW5kZXJDb21wb25lbnQoSU1hcmt1cFdyaXRlciwgSVJlcXVlc3RDeWNsZSkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCByZW5kZXJDb21wb25lbnQoSU1hcmt1cFdyaXRlciB3cml0ZXIsIElSZXF1ZXN0Q3ljbGUgY3ljbGUpCi0gICAgewotICAgICAgICBPYmplY3Qgb2JqT2xkVmFsdWUgPSBjeWNsZS5nZXRBdHRyaWJ1dGUoSVRhYmxlUm93U291cmNlLlRBQkxFX1JPV19TT1VSQ0VfQVRUUklCVVRFKTsKLSAgICAgICAgY3ljbGUuc2V0QXR0cmlidXRlKElUYWJsZVJvd1NvdXJjZS5UQUJMRV9ST1dfU09VUkNFX0FUVFJJQlVURSwgdGhpcyk7Ci0KLSAgICAgICAgc3VwZXIucmVuZGVyQ29tcG9uZW50KHdyaXRlciwgY3ljbGUpOwotCi0gICAgICAgIGN5Y2xlLnNldEF0dHJpYnV0ZShJVGFibGVSb3dTb3VyY2UuVEFCTEVfUk9XX1NPVVJDRV9BVFRSSUJVVEUsIG9iak9sZFZhbHVlKTsKLQotICAgICAgICAvLyBzZXQgdGhlIGN1cnJlbnQgcm93IHRvIG51bGwgd2hlbiB0aGUgY29tcG9uZW50IGlzIG5vdCBhY3RpdmUKLSAgICAgICAgbV9vYmpUYWJsZVJvdyA9IG51bGw7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdGFibGUvY29tcG9uZW50cy9UYWJsZVJvd3MuandjIGIvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL2NvbXBvbmVudHMvVGFibGVSb3dzLmp3YwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIyMGZmNy4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdGFibGUvY29tcG9uZW50cy9UYWJsZVJvd3MuandjCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICAKLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08IS0tICAkSWQkIC0tPgotPCFET0NUWVBFIGNvbXBvbmVudC1zcGVjaWZpY2F0aW9uIFBVQkxJQyAKLSAgIi0vL0FwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLy9UYXBlc3RyeSBTcGVjaWZpY2F0aW9uIDMuMC8vRU4iIAotICAiaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy90YXBlc3RyeS9kdGQvVGFwZXN0cnlfM18wLmR0ZCI+Ci0JCi08Y29tcG9uZW50LXNwZWNpZmljYXRpb24gY2xhc3M9Im9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5jb21wb25lbnRzLlRhYmxlUm93cyIgCi0JYWxsb3ctYm9keT0ieWVzIiBhbGxvdy1pbmZvcm1hbC1wYXJhbWV0ZXJzPSJ5ZXMiPgotCQotCTxkZXNjcmlwdGlvbj4KLSAgICAgICAgQSBsb3cgbGV2ZWwgVGFibGUgY29tcG9uZW50IHRoYXQgZ2VuZXJhdGVzIHRoZSByb3dzIG9mIHRoZSBjdXJyZW50IHBhZ2UgaW4gdGhlIHRhYmxlLiAKLSAgICAgICAgVGhpcyBjb21wb25lbnQgbXVzdCBiZSB3cmFwcGVkIGJ5IFRhYmxlVmlldy4gCi0JPC9kZXNjcmlwdGlvbj4KLSAgCi0JPHBhcmFtZXRlciBuYW1lPSJyb3ciIAotCQl0eXBlPSJPYmplY3QiIAotCQlyZXF1aXJlZD0ibm8iCi0JCWRpcmVjdGlvbj0iY3VzdG9tIj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPlRoZSBjdXJyZW50IHJvdyBiZWluZyByZW5kZXJlZC48L2Rlc2NyaXB0aW9uPgotICAgIDwvcGFyYW1ldGVyPgotCi0JPHBhcmFtZXRlciBuYW1lPSJlbGVtZW50IiAKLQkJdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgCi0JCXJlcXVpcmVkPSJubyIKLQkJZGlyZWN0aW9uPSJhdXRvIgotICAgIAlkZWZhdWx0LXZhbHVlPSIndHInIj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPlRoZSB0YWcgdG8gdXNlIHRvIHdyYXAgdGhlIHJvd3MgaW4sICd0cicgYnkgZGVmYXVsdC48L2Rlc2NyaXB0aW9uPgotICAgIDwvcGFyYW1ldGVyPgotCi0JPGNvbXBvbmVudCBpZD0iaXRlclJvd3MiIHR5cGU9IkZvcmVhY2giPgotCQk8YmluZGluZyBuYW1lPSJzb3VyY2UiIGV4cHJlc3Npb249InRhYmxlUm93c0l0ZXJhdG9yIi8+Ci0JCTxiaW5kaW5nIG5hbWU9InZhbHVlIiBleHByZXNzaW9uPSJ0YWJsZVJvdyIvPgotCTwvY29tcG9uZW50PgotICAKLQk8Y29tcG9uZW50IGlkPSJpbmZvcm1hbCIgdHlwZT0iQW55IiBpbmhlcml0LWluZm9ybWFsLXBhcmFtZXRlcnM9InllcyI+Ci0JCTxpbmhlcml0ZWQtYmluZGluZyBuYW1lPSJlbGVtZW50IiBwYXJhbWV0ZXItbmFtZT0iZWxlbWVudCIvPgotCTwvY29tcG9uZW50PgotICAKLQk8Y29tcG9uZW50IGlkPSJ3cmFwcGVkIiB0eXBlPSJSZW5kZXJCb2R5Ii8+Ci0gIAotPC9jb21wb25lbnQtc3BlY2lmaWNhdGlvbj4KZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90YWJsZS9jb21wb25lbnRzL1RhYmxlU3RyaW5ncy5wcm9wZXJ0aWVzIGIvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL2NvbXBvbmVudHMvVGFibGVTdHJpbmdzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxYjgxZTUuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL2NvbXBvbmVudHMvVGFibGVTdHJpbmdzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSMgJElkJAotCi1taXNzaW5nLXRhYmxlLW1vZGVsPUVpdGhlciB0aGUgJ3RhYmxlTW9kZWwnIHBhcmFtZXRlciBvciBib3RoICdzb3VyY2UnIGFuZCAnY29sdW1ucycgcGFyYW1ldGVycyBtdXN0IGJlIHNwZWNpZmllZCBieSBjb21wb25lbnQgezB9Ci1jb2x1bW5zLW9ubHktcGxlYXNlPVRoZSAnY29sdW1ucycgcGFyYW1ldGVyIG9mIGNvbXBvbmVudCB7MH0gbXVzdCBjb250YWluIGEgbGlzdCBvZiBJVGFibGVDb2x1bW4gb2JqZWN0cyBvbmx5Ci1ub3QtYS1jb2x1bW49VGhlIGV4cHJlc3Npb24gJ3sxfScgaW4gdGhlICdjb2x1bW5zJyBwYXJhbWV0ZXIgb2YgY29tcG9uZW50IHswfSBkb2VzIG5vdCBldmFsdWF0ZSB0byBhbiBJVGFibGVDb2x1bW4KLWludmFsaWQtdGFibGUtc291cmNlPVRoZSBzb3VyY2UgcGFyYW1ldGVyIG9mIGNvbXBvbmVudCB7MH0gaXMgb2YgdHlwZSB7MX0sIGJ1dCBtdXN0IGJlIG9mIHR5cGUgT2JqZWN0W10sIENvbGxlY3Rpb24sIEl0ZXJhdG9yLCBvciBJQmFzaWNUYWJsZU1vZGVsCi1pbnZhbGlkLXRhYmxlLWNvbHVtbnM9VGhlIGNvbHVtbnMgcGFyYW1ldGVyIG9mIGNvbXBvbmVudCB7MH0gaXMgb2YgdHlwZSB7MX0sIGJ1dCBtdXN0IGJlIG9mIHR5cGUgU3RyaW5nLCBJVGFibGVDb2x1bW5Nb2RlbCwgSVRhYmxlQ29sdW1uW10sIExpc3QsIG9yIEl0ZXJhdG9yCmRpZmYgLS1naXQgYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdGFibGUvY29tcG9uZW50cy9UYWJsZVV0aWxzLmphdmEgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdGFibGUvY29tcG9uZW50cy9UYWJsZVV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3YjViYjcuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL2NvbXBvbmVudHMvVGFibGVVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkxICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUuY29tcG9uZW50czsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LkFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVzb3VyY2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuSVRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5tb2RlbC5JVGFibGVDb2x1bW5Nb2RlbDsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwub2dubC5FeHByZXNzaW9uVGFibGVDb2x1bW47Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsLnNpbXBsZS5TaW1wbGVUYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuc2ltcGxlLlNpbXBsZVRhYmxlQ29sdW1uTW9kZWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS51dGlsLnByb3AuT2dubFV0aWxzOwotCi0vKioKLSAqICBBIHBsYWNlaG9sZGVyIGZvciBhIHN0YXRpYyBtZXRob2RzIHJlbGF0ZWQgdG8gdGhlIFRhYmxlIGNvbXBvbmVudAotICoKLSAqICBAc2luY2UgMy4wCi0gKiAgQHZlcnNpb24gJElkJAotICogIEBhdXRob3IgTWluZGJyaWRnZQotICoqLwotcHVibGljIGNsYXNzIFRhYmxlVXRpbHMKLXsKLQotICAgIC8qKgotICAgICAqICBDb250YWlucyBzdHJpbmdzIGxvYWRlZCBmcm9tIFRhYmxlU3RyaW5ncy5wcm9wZXJ0aWVzLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgc19vYmpTdHJpbmdzID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqICBHZXRzIGEgc3RyaW5nIGZyb20gdGhlIFRhYmxlU3RyaW5ncyByZXNvdXJjZSBidW5kbGUuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBmb3JtYXQoU3RyaW5nIGtleSwgT2JqZWN0W10gYXJncykKLSAgICB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKFRhYmxlVXRpbHMuY2xhc3MpIHsKLSAgICAgICAgICAgICAgICBpZiAoc19vYmpTdHJpbmdzID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHNfb2JqU3RyaW5ncyA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgib3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLmNvbXBvbmVudHMuVGFibGVTdHJpbmdzIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIHBhdHRlcm4gPSBzX29ialN0cmluZ3MuZ2V0U3RyaW5nKGtleSk7Ci0KLSAgICAgICAgaWYgKGFyZ3MgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBwYXR0ZXJuOwotCi0gICAgICAgIHJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChwYXR0ZXJuLCBhcmdzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgQ29udmllbmllbmNlIG1ldGhvZCBmb3IgaW52b2tpbmcge0BsaW5rICNmb3JtYXQoU3RyaW5nLCBPYmplY3RbXSl9LgotICAgICAqKi8KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGtleSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBmb3JtYXQoa2V5LCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgQ29udmllbmllbmNlIG1ldGhvZCBmb3IgaW52b2tpbmcge0BsaW5rICNmb3JtYXQoU3RyaW5nLCBPYmplY3RbXSl9LgotICAgICAqKi8KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvcm1hdChTdHJpbmcga2V5LCBPYmplY3QgYXJnKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGZvcm1hdChrZXksIG5ldyBPYmplY3RbXSB7IGFyZyB9KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgQ29udmllbmllbmNlIG1ldGhvZCBmb3IgaW52b2tpbmcge0BsaW5rICNmb3JtYXQoU3RyaW5nLCBPYmplY3RbXSl9LgotICAgICAqKi8KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvcm1hdChTdHJpbmcga2V5LCBPYmplY3QgYXJnMSwgT2JqZWN0IGFyZzIpCi0gICAgewotICAgICAgICByZXR1cm4gZm9ybWF0KGtleSwgbmV3IE9iamVjdFtdIHsgYXJnMSwgYXJnMiB9KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgQ29udmllbmllbmNlIG1ldGhvZCBmb3IgaW52b2tpbmcge0BsaW5rICNmb3JtYXQoU3RyaW5nLCBPYmplY3RbXSl9LgotICAgICAqKi8KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvcm1hdChTdHJpbmcga2V5LCBPYmplY3QgYXJnMSwgT2JqZWN0IGFyZzIsIE9iamVjdCBhcmczKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGZvcm1hdChrZXksIG5ldyBPYmplY3RbXSB7IGFyZzEsIGFyZzIsIGFyZzMgfSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEdlbmVyYXRlIGEgdGFibGUgY29sdW1uIG1vZGVsIG91dCBvZiB0aGUgZGVzY3JpcHRpb24gc3RyaW5nIHByb3ZpZGVkLgotICAgICAqICBFbnRyaWVzIGluIHRoZSBkZXNjcmlwdGlvbiBzdHJpbmcgYXJlIHNlcGFyYXRlZCBieSBjb21tYXMuCi0gICAgICogIEVhY2ggY29sdW1uIGVudHJ5IGlzIG9mIHRoZSBmb3JtYXQgbmFtZSwgbmFtZTpleHByZXNzaW9uLCAKLSAgICAgKiAgb3IgbmFtZTpkaXNwbGF5TmFtZTpleHByZXNzaW9uLgotICAgICAqICBBbiBlbnRyeSBwcmVmaXhlZCB3aXRoICEgcmVwcmVzZW50cyBhIG5vbi1zb3J0YWJsZSBjb2x1bW4uCi0gICAgICogIElmIHRoZSB3aG9sZSBkZXNjcmlwdGlvbiBzdHJpbmcgaXMgcHJlZml4ZWQgd2l0aCAqLCBpdCByZXByZXNlbnRzCi0gICAgICogIGNvbHVtbnMgdG8gYmUgaW5jbHVkZWQgaW4gYSBGb3JtLiAKLSAgICAgKiAKLSAgICAgKiAgQHBhcmFtIHN0ckRlc2MgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBjb2x1bW4gbW9kZWwgdG8gYmUgZ2VuZXJhdGVkCi0gICAgICogIEBwYXJhbSBvYmpDb21wb25lbnQgdGhlIGNvbXBvbmVudCBvcmRlcmluZyB0aGUgZ2VuZXJhdGlvbgotICAgICAqICBAcGFyYW0gb2JqQ29sdW1uU2V0dGluZ3NDb250YWluZXIgdGhlIGNvbXBvbmVudCBjb250YWluaW5nIHRoZSBjb2x1bW4gc2V0dGluZ3MKLSAgICAgKiAgQHJldHVybiBhIHRhYmxlIGNvbHVtbiBtb2RlbCBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgcGFyYW1ldGVycwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSVRhYmxlQ29sdW1uTW9kZWwgZ2VuZXJhdGVUYWJsZUNvbHVtbk1vZGVsKFN0cmluZyBzdHJEZXNjLCBJQ29tcG9uZW50IG9iakNvbXBvbmVudCwgSUNvbXBvbmVudCBvYmpDb2x1bW5TZXR0aW5nc0NvbnRhaW5lcikKLSAgICB7Ci0gICAgICAgIGlmIChzdHJEZXNjID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICBMaXN0IGFyckNvbHVtbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgYm9vbGVhbiBiRm9ybUNvbHVtbnMgPSBmYWxzZTsKLSAgICAgICAgd2hpbGUgKHN0ckRlc2Muc3RhcnRzV2l0aCgiKiIpKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdHJEZXNjID0gc3RyRGVzYy5zdWJzdHJpbmcoMSk7Ci0gICAgICAgICAgICBiRm9ybUNvbHVtbnMgPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nVG9rZW5pemVyIG9ialRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoc3RyRGVzYywgIiwiKTsKLSAgICAgICAgd2hpbGUgKG9ialRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBzdHJUb2tlbiA9IG9ialRva2VuaXplci5uZXh0VG9rZW4oKS50cmltKCk7Ci0KLSAgICAgICAgICAgIGlmIChzdHJUb2tlbi5zdGFydHNXaXRoKCI9IikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHN0ckNvbHVtbkV4cHJlc3Npb24gPSBzdHJUb2tlbi5zdWJzdHJpbmcoMSk7Ci0gICAgICAgICAgICAgICAgSVJlc291cmNlUmVzb2x2ZXIgb2JqUmVzb2x2ZXIgPSBvYmpDb2x1bW5TZXR0aW5nc0NvbnRhaW5lci5nZXRQYWdlKCkuZ2V0RW5naW5lKCkuZ2V0UmVzb3VyY2VSZXNvbHZlcigpOwotCi0gICAgICAgICAgICAgICAgT2JqZWN0IG9iakNvbHVtbiA9Ci0gICAgICAgICAgICAgICAgICAgIE9nbmxVdGlscy5nZXQoc3RyQ29sdW1uRXhwcmVzc2lvbiwgb2JqUmVzb2x2ZXIsIG9iakNvbHVtblNldHRpbmdzQ29udGFpbmVyKTsKLSAgICAgICAgICAgICAgICBpZiAoIShvYmpDb2x1bW4gaW5zdGFuY2VvZiBJVGFibGVDb2x1bW4pKQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0KCJub3QtYS1jb2x1bW4iLCBvYmpDb21wb25lbnQuZ2V0RXh0ZW5kZWRJZCgpLCBzdHJDb2x1bW5FeHByZXNzaW9uKSk7Ci0KLSAgICAgICAgICAgICAgICBhcnJDb2x1bW5zLmFkZChvYmpDb2x1bW4pOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBib29sZWFuIGJTb3J0YWJsZSA9IHRydWU7Ci0gICAgICAgICAgICBpZiAoc3RyVG9rZW4uc3RhcnRzV2l0aCgiISIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0clRva2VuID0gc3RyVG9rZW4uc3Vic3RyaW5nKDEpOwotICAgICAgICAgICAgICAgIGJTb3J0YWJsZSA9IGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdHJpbmdUb2tlbml6ZXIgb2JqQ29sdW1uVG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihzdHJUb2tlbiwgIjoiKTsKLQotICAgICAgICAgICAgU3RyaW5nIHN0ck5hbWUgPSAiIjsKLSAgICAgICAgICAgIGlmIChvYmpDb2x1bW5Ub2tlbml6ZXIuaGFzTW9yZVRva2VucygpKQotICAgICAgICAgICAgICAgIHN0ck5hbWUgPSBvYmpDb2x1bW5Ub2tlbml6ZXIubmV4dFRva2VuKCk7Ci0KLSAgICAgICAgICAgIFN0cmluZyBzdHJFeHByZXNzaW9uID0gc3RyTmFtZTsKLSAgICAgICAgICAgIGlmIChvYmpDb2x1bW5Ub2tlbml6ZXIuaGFzTW9yZVRva2VucygpKQotICAgICAgICAgICAgICAgIHN0ckV4cHJlc3Npb24gPSBvYmpDb2x1bW5Ub2tlbml6ZXIubmV4dFRva2VuKCk7Ci0KLSAgICAgICAgICAgIFN0cmluZyBzdHJEaXNwbGF5TmFtZSA9IHN0ck5hbWU7Ci0gICAgICAgICAgICBpZiAob2JqQ29sdW1uVG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdHJEaXNwbGF5TmFtZSA9IHN0ckV4cHJlc3Npb247Ci0gICAgICAgICAgICAgICAgc3RyRXhwcmVzc2lvbiA9IG9iakNvbHVtblRva2VuaXplci5uZXh0VG9rZW4oKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgRXhwcmVzc2lvblRhYmxlQ29sdW1uIG9iakNvbHVtbiA9Ci0gICAgICAgICAgICAgICAgbmV3IEV4cHJlc3Npb25UYWJsZUNvbHVtbihzdHJOYW1lLCBzdHJEaXNwbGF5TmFtZSwgc3RyRXhwcmVzc2lvbiwgYlNvcnRhYmxlKTsKLSAgICAgICAgICAgIGlmIChiRm9ybUNvbHVtbnMpCi0gICAgICAgICAgICAgICAgb2JqQ29sdW1uLnNldENvbHVtblJlbmRlcmVyU291cmNlKFNpbXBsZVRhYmxlQ29sdW1uLkZPUk1fQ09MVU1OX1JFTkRFUkVSX1NPVVJDRSk7Ci0gICAgICAgICAgICBpZiAob2JqQ29sdW1uU2V0dGluZ3NDb250YWluZXIgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBvYmpDb2x1bW4ubG9hZFNldHRpbmdzKG9iakNvbHVtblNldHRpbmdzQ29udGFpbmVyKTsKLQotICAgICAgICAgICAgYXJyQ29sdW1ucy5hZGQob2JqQ29sdW1uKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBuZXcgU2ltcGxlVGFibGVDb2x1bW5Nb2RlbChhcnJDb2x1bW5zKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90YWJsZS9jb21wb25lbnRzL1RhYmxlVmFsdWVzLmh0bWwgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdGFibGUvY29tcG9uZW50cy9UYWJsZVZhbHVlcy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWU2OTI3Li4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90YWJsZS9jb21wb25lbnRzL1RhYmxlVmFsdWVzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTwhLS0gJElkJCAtLT4KLQotPHNwYW4gandjaWQ9IiRjb250ZW50JCI+Ci0KLTxzcGFuIGp3Y2lkPSJpdGVyQ29sdW1ucyI+Ci0JPHRkIGp3Y2lkPSJpbmZvcm1hbCI+PHNwYW4gandjaWQ9Imluc2VydFZhbHVlUmVuZGVyZXIiLz48L3RkPgotPC9zcGFuPgotCi08L3NwYW4+CmRpZmYgLS1naXQgYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdGFibGUvY29tcG9uZW50cy9UYWJsZVZhbHVlcy5qYXZhIGIvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL2NvbXBvbmVudHMvVGFibGVWYWx1ZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTMxNmQzMS4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdGFibGUvY29tcG9uZW50cy9UYWJsZVZhbHVlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUuY29tcG9uZW50czsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUJpbmRpbmc7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JTWFya3VwV3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlbmRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZXF1ZXN0Q3ljbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsLklUYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuSVRhYmxlQ29sdW1uTW9kZWw7Ci0KLS8qKgotICogQSBsb3cgbGV2ZWwgVGFibGUgY29tcG9uZW50IHRoYXQgZ2VuZXJhdGVzIHRoZSBjb2x1bW5zIGluIHRoZSBjdXJyZW50IHJvdyBpbiB0aGUgdGFibGUuCi0gKiBUaGlzIGNvbXBvbmVudCBtdXN0IGJlIHdyYXBwZWQgYnkge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5jb21wb25lbnRzLlRhYmxlUm93c30uCi0gKiAKLSAqIDxwPgotICogVGhlIGNvbXBvbmVudCBpdGVyYXRlcyBvdmVyIHRoZSBjb2x1bW5zIGluIHRoZSB0YWJsZSBhbmQgCi0gKiBhdXRvbWF0aWNhbGx5IHJlbmRlcnMgdGhlIGNvbHVtbiB2YWx1ZXMgZm9yIHRoZSBjdXJyZW50IHRhYmxlIHJvdy4gCi0gKiBUaGUgY29sdW1ucyBhcmUgd3JhcHBlZCBpbiAndGQnIHRhZ3MgYnkgZGVmYXVsdC4gPGJyPgotICogVGhlIGNvbHVtbiB2YWx1ZXMgYXJlIHJlbmRlcmVkIHVzaW5nIHRoZSByZW5kZXJlciByZXR1cm5lZCBieSB0aGUgCi0gKiBnZXRWYWx1ZVJlbmRlcmVyKCkgbWV0aG9kIGluIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuSVRhYmxlQ29sdW1ufS4KLSAqIAotICogPHA+IAotICogUGxlYXNlIHNlZSB0aGUgQ29tcG9uZW50IFJlZmVyZW5jZSBmb3IgZGV0YWlscyBvbiBob3cgdG8gdXNlIHRoaXMgY29tcG9uZW50LiAKLSAqIAotICogIFs8YSBocmVmPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9Db21wb25lbnRSZWZlcmVuY2UvY29udHJpYi5UYWJsZVZhbHVlcy5odG1sIj5Db21wb25lbnQgUmVmZXJlbmNlPC9hPl0KLSAqIAotICogQGF1dGhvciBtaW5kYnJpZGdlCi0gKiBAdmVyc2lvbiAkSWQkCi0gKgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVGFibGVWYWx1ZXMgZXh0ZW5kcyBBYnN0cmFjdFRhYmxlUm93Q29tcG9uZW50Ci17Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFCTEVfVkFMVUVfQ1NTX0NMQVNTX1NVRkZJWCA9ICJDb2x1bW5WYWx1ZSI7Ci0KLSAgICAvLyBCaW5kaW5ncwotICAgIHB1YmxpYyBhYnN0cmFjdCBJQmluZGluZyBnZXRDb2x1bW5CaW5kaW5nKCk7Ci0gICAgcHVibGljIGFic3RyYWN0IElCaW5kaW5nIGdldENsYXNzQmluZGluZygpOwotCi0JLy8gVHJhbnNpZW50Ci0JcHJpdmF0ZSBJVGFibGVDb2x1bW4gbV9vYmpUYWJsZUNvbHVtbjsKLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgbGlzdCBvZiBhbGwgdGFibGUgY29sdW1ucyB0byBiZSBkaXNwbGF5ZWQuCi0gICAgICogCi0gICAgICogQHJldHVybiBhbiBpdGVyYXRvciBvZiBhbGwgdGFibGUgY29sdW1ucwotICAgICAqLwotCXB1YmxpYyBJdGVyYXRvciBnZXRUYWJsZUNvbHVtbkl0ZXJhdG9yKCkKLQl7Ci0JCUlUYWJsZUNvbHVtbk1vZGVsIG9iakNvbHVtbk1vZGVsID0KLQkJCWdldFRhYmxlTW9kZWxTb3VyY2UoKS5nZXRUYWJsZU1vZGVsKCkuZ2V0Q29sdW1uTW9kZWwoKTsKLQkJcmV0dXJuIG9iakNvbHVtbk1vZGVsLmdldENvbHVtbnMoKTsKLQl9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50bHkgcmVuZGVyZWQgdGFibGUgY29sdW1uLiAKLSAgICAgKiBZb3UgY2FuIGNhbGwgdGhpcyBtZXRob2QgdG8gb2J0YWluIHRoZSBjdXJyZW50IGNvbHVtbi4KLSAgICAgKiAgCi0gICAgICogQHJldHVybiBJVGFibGVDb2x1bW4gdGhlIGN1cnJlbnQgdGFibGUgY29sdW1uCi0gICAgICovCi0JcHVibGljIElUYWJsZUNvbHVtbiBnZXRUYWJsZUNvbHVtbigpCi0JewotCQlyZXR1cm4gbV9vYmpUYWJsZUNvbHVtbjsKLQl9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBjdXJyZW50bHkgcmVuZGVyZWQgdGFibGUgY29sdW1uLiAKLSAgICAgKiBUaGlzIG1ldGhvZCBpcyBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuCi0gICAgICogCi0gICAgICogQHBhcmFtIHRhYmxlQ29sdW1uIFRoZSBjdXJyZW50IHRhYmxlIGNvbHVtbgotICAgICAqLwotCXB1YmxpYyB2b2lkIHNldFRhYmxlQ29sdW1uKElUYWJsZUNvbHVtbiB0YWJsZUNvbHVtbikKLQl7Ci0JCW1fb2JqVGFibGVDb2x1bW4gPSB0YWJsZUNvbHVtbjsKLSAgICAgICAgCi0gICAgICAgIElCaW5kaW5nIG9iakNvbHVtbkJpbmRpbmcgPSBnZXRDb2x1bW5CaW5kaW5nKCk7Ci0gICAgICAgIGlmIChvYmpDb2x1bW5CaW5kaW5nICE9IG51bGwpCi0gICAgICAgICAgICBvYmpDb2x1bW5CaW5kaW5nLnNldE9iamVjdCh0YWJsZUNvbHVtbik7Ci0JfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcmVuZGVyZXIgdG8gYmUgdXNlZCB0byBnZW5lcmF0ZSB0aGUgYXBwZWFyYW5jZSBvZiB0aGUgY3VycmVudCBjb2x1bW4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSByZW5kZXJlciBvZiB0aGUgY3VycmVudCBjb2x1bW4KLSAgICAgKi8KLQlwdWJsaWMgSVJlbmRlciBnZXRUYWJsZVZhbHVlUmVuZGVyZXIoKQotCXsKLQkJT2JqZWN0IG9ialJvdyA9IGdldFRhYmxlUm93U291cmNlKCkuZ2V0VGFibGVSb3coKTsKLQkJcmV0dXJuIGdldFRhYmxlQ29sdW1uKCkuZ2V0VmFsdWVSZW5kZXJlcigKLQkJCWdldFBhZ2UoKS5nZXRSZXF1ZXN0Q3ljbGUoKSwKLQkJCWdldFRhYmxlTW9kZWxTb3VyY2UoKSwKLQkJCW9ialJvdyk7Ci0JfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgQ1NTIGNsYXNzIG9mIHRoZSBnZW5lcmF0ZWQgdGFibGUgY2VsbC4KLSAgICAgKiBJdCB1c2VzIHRoZSBjbGFzcyBwYXJhbWV0ZXIgaWYgaXQgaGFzIGJlZW4gYm91bmQsIG9yCi0gICAgICogdGhlIGRlZmF1bHQgdmFsdWUgb2YgIltjb2x1bW4gbmFtZV1Db2x1bW5WYWx1ZSIgb3RoZXJ3aXNlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIENTUyBjbGFzcyBvZiB0aGUgY2VsbAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWVDbGFzcygpCi0gICAgewotICAgICAgICBJQmluZGluZyBvYmpDbGFzc0JpbmRpbmcgPSBnZXRDbGFzc0JpbmRpbmcoKTsKLSAgICAgICAgaWYgKG9iakNsYXNzQmluZGluZyAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG9iakNsYXNzQmluZGluZy5nZXRTdHJpbmcoKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIGdldFRhYmxlQ29sdW1uKCkuZ2V0Q29sdW1uTmFtZSgpICsgVEFCTEVfVkFMVUVfQ1NTX0NMQVNTX1NVRkZJWDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUudGFwZXN0cnkuQmFzZUNvbXBvbmVudCNyZW5kZXJDb21wb25lbnQob3JnLmFwYWNoZS50YXBlc3RyeS5JTWFya3VwV3JpdGVyLCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZXF1ZXN0Q3ljbGUpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVuZGVyQ29tcG9uZW50KElNYXJrdXBXcml0ZXIgd3JpdGVyLCBJUmVxdWVzdEN5Y2xlIGN5Y2xlKQotICAgIHsKLSAgICAgICAgc3VwZXIucmVuZGVyQ29tcG9uZW50KHdyaXRlciwgY3ljbGUpOwotCi0gICAgICAgIC8vIHNldCB0aGUgY3VycmVudCBjb2x1bW4gdG8gbnVsbCB3aGVuIHRoZSBjb21wb25lbnQgaXMgbm90IGFjdGl2ZQotICAgICAgICBtX29ialRhYmxlQ29sdW1uID0gbnVsbDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90YWJsZS9jb21wb25lbnRzL1RhYmxlVmFsdWVzLmp3YyBiL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90YWJsZS9jb21wb25lbnRzL1RhYmxlVmFsdWVzLmp3YwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZjNDcwMi4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdGFibGUvY29tcG9uZW50cy9UYWJsZVZhbHVlcy5qd2MKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gIAotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTwhLS0gICRJZCQgLS0+Ci08IURPQ1RZUEUgY29tcG9uZW50LXNwZWNpZmljYXRpb24gUFVCTElDIAotICAiLS8vQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24vL1RhcGVzdHJ5IFNwZWNpZmljYXRpb24gMy4wLy9FTiIgCi0gICJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL3RhcGVzdHJ5L2R0ZC9UYXBlc3RyeV8zXzAuZHRkIj4KLQkKLTxjb21wb25lbnQtc3BlY2lmaWNhdGlvbiBjbGFzcz0ib3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLmNvbXBvbmVudHMuVGFibGVWYWx1ZXMiIAotCWFsbG93LWJvZHk9InllcyIgYWxsb3ctaW5mb3JtYWwtcGFyYW1ldGVycz0ieWVzIj4KLQkKLQk8ZGVzY3JpcHRpb24+Ci0gICAgICAgIEEgbG93IGxldmVsIFRhYmxlIGNvbXBvbmVudCB0aGF0IGdlbmVyYXRlcyB0aGUgY29sdW1ucyBmb3IgdGhlIGN1cnJlbnQgcm93IGluIHRoZSB0YWJsZS4gCi0gICAgICAgIFRoaXMgY29tcG9uZW50IG11c3QgYmUgd3JhcHBlZCBieSBUYWJsZVJvd3MuIAotCTwvZGVzY3JpcHRpb24+Ci0gIAotCTxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uIiAKLQkJdHlwZT0ib3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsLklUYWJsZUNvbHVtbiIgCi0JCXJlcXVpcmVkPSJubyIKLQkJZGlyZWN0aW9uPSJjdXN0b20iPgotICAgICAgICA8ZGVzY3JpcHRpb24+VGhlIGN1cnJlbnQgY29sdW1uIGJlaW5nIHJlbmRlcmVkPC9kZXNjcmlwdGlvbj4KLSAgICA8L3BhcmFtZXRlcj4KLQotCTxwYXJhbWV0ZXIgbmFtZT0iZWxlbWVudCIgCi0JCXR5cGU9ImphdmEubGFuZy5TdHJpbmciIAotCQlyZXF1aXJlZD0ibm8iCi0JCWRpcmVjdGlvbj0iYXV0byIKLSAgICAJZGVmYXVsdC12YWx1ZT0iJ3RkJyI+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5UaGUgdGFnIHRvIHVzZSB0byB3cmFwIHRoZSB2YWx1ZXMgaW4sICd0ZCcgYnkgZGVmYXVsdC48L2Rlc2NyaXB0aW9uPgotICAgIDwvcGFyYW1ldGVyPgotCi0gICAgPHBhcmFtZXRlciBuYW1lPSJjbGFzcyIKLSAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgcmVxdWlyZWQ9Im5vIgotICAgICAgICBkaXJlY3Rpb249ImN1c3RvbSI+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5UaGUgQ1NTIGNsYXNzIG9mIHRoZSB0YWJsZSB2YWx1ZXM8L2Rlc2NyaXB0aW9uPgotICAgIDwvcGFyYW1ldGVyPgotICAgIAotCTxjb21wb25lbnQgaWQ9Iml0ZXJDb2x1bW5zIiB0eXBlPSJGb3JlYWNoIj4KLQkJPGJpbmRpbmcgbmFtZT0ic291cmNlIiBleHByZXNzaW9uPSJ0YWJsZUNvbHVtbkl0ZXJhdG9yIi8+Ci0JCTxiaW5kaW5nIG5hbWU9InZhbHVlIiBleHByZXNzaW9uPSJ0YWJsZUNvbHVtbiIvPgotCTwvY29tcG9uZW50PgotICAKLQk8Y29tcG9uZW50IGlkPSJpbmZvcm1hbCIgdHlwZT0iQW55IiBpbmhlcml0LWluZm9ybWFsLXBhcmFtZXRlcnM9InllcyI+Ci0JCTxpbmhlcml0ZWQtYmluZGluZyBuYW1lPSJlbGVtZW50IiBwYXJhbWV0ZXItbmFtZT0iZWxlbWVudCIvPgotICAgICAgICA8YmluZGluZyBuYW1lPSJjbGFzcyIgZXhwcmVzc2lvbj0idmFsdWVDbGFzcyIvPgotCTwvY29tcG9uZW50PgotICAKLQk8Y29tcG9uZW50IGlkPSJpbnNlcnRWYWx1ZVJlbmRlcmVyIiB0eXBlPSJEZWxlZ2F0b3IiPgotCQk8YmluZGluZyBuYW1lPSJkZWxlZ2F0ZSIgZXhwcmVzc2lvbj0idGFibGVWYWx1ZVJlbmRlcmVyIi8+Ci0JPC9jb21wb25lbnQ+Ci0gIAotPC9jb21wb25lbnQtc3BlY2lmaWNhdGlvbj4KZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90YWJsZS9jb21wb25lbnRzL1RhYmxlVmlldy5odG1sIGIvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL2NvbXBvbmVudHMvVGFibGVWaWV3Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzMWQxMzEuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL2NvbXBvbmVudHMvVGFibGVWaWV3Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTwhLS0gJElkJCAtLT4KLQotPHNwYW4gandjaWQ9IiRjb250ZW50JCI+Ci0KLTx0YWJsZSBqd2NpZD0idGFibGUiPgotCTxzcGFuIGp3Y2lkPSJpbnNlcnRXcmFwcGVkIi8+Ci08L3RhYmxlPgotCi08L3NwYW4+CmRpZmYgLS1naXQgYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdGFibGUvY29tcG9uZW50cy9UYWJsZVZpZXcuamF2YSBiL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90YWJsZS9jb21wb25lbnRzL1RhYmxlVmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjYwNjA4Li4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90YWJsZS9jb21wb25lbnRzL1RhYmxlVmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDc3ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUuY29tcG9uZW50czsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLkNvbGxlY3Rpb25VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LkFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LkJhc2VDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JQmluZGluZzsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JTWFya3VwV3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlcXVlc3RDeWNsZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuSUJhc2ljVGFibGVNb2RlbDsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuSVRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5tb2RlbC5JVGFibGVDb2x1bW5Nb2RlbDsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuSVRhYmxlRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5tb2RlbC5JVGFibGVNb2RlbDsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuSVRhYmxlTW9kZWxTb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsLklUYWJsZVBhZ2luZ1N0YXRlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5tb2RlbC5JVGFibGVTZXNzaW9uU3RhdGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5tb2RlbC5JVGFibGVTZXNzaW9uU3RvcmVNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5tb2RlbC5jb21tb24uQmFzaWNUYWJsZU1vZGVsV3JhcDsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuc2ltcGxlLlNpbXBsZUxpc3RUYWJsZURhdGFNb2RlbDsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuc2ltcGxlLlNpbXBsZVRhYmxlQ29sdW1uTW9kZWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsLnNpbXBsZS5TaW1wbGVUYWJsZU1vZGVsOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5tb2RlbC5zaW1wbGUuU2ltcGxlVGFibGVTdGF0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmV2ZW50LlBhZ2VEZXRhY2hMaXN0ZW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmV2ZW50LlBhZ2VFdmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmV2ZW50LlBhZ2VSZW5kZXJMaXN0ZW5lcjsKLQotLyoqCi0gKiBBIGxvdyBsZXZlbCBUYWJsZSBjb21wb25lbnQgdGhhdCB3cmFwcyBhbGwgb3RoZXIgbG93IGxldmVsIFRhYmxlIGNvbXBvbmVudHMuCi0gKiBUaGlzIGNvbXBvbmVudCBjYXJyaWVzIHRoZSB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsLklUYWJsZU1vZGVsfQotICogdGhhdCBpcyB1c2VkIGJ5IHRoZSBvdGhlciBUYWJsZSBjb21wb25lbnRzLiBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudGF0aW9uIG9mCi0gKiB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsLklUYWJsZU1vZGVsfSBpZiB5b3UgbmVlZCB0byBrbm93IG1vcmUKLSAqIGFib3V0IGhvdyBhIHRhYmxlIGlzIHJlcHJlc2VudGVkLgotICogPHA+Ci0gKiBUaGlzIGNvbXBvbmVudCBhbHNvIGhhbmRsZXMgdGhlIHNhdmluZyBvZiB0aGUgc3RhdGUgb2YgdGhlIG1vZGVsIHVzaW5nIGFuIAotICoge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5tb2RlbC5JVGFibGVTZXNzaW9uU3RhdGVNYW5hZ2VyfQotICogdG8gZGV0ZXJtaW5lIHdoYXQgcGFydCBvZiB0aGUgbW9kZWwgaXMgdG8gYmUgc2F2ZWQgYW5kIGFuIAotICoge0BsaW5rICBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuSVRhYmxlU2Vzc2lvblN0b3JlTWFuYWdlcn0KLSAqIHRvIGRldGVybWluZSBob3cgdG8gc2F2ZSBpdC4KLSAqIDxwPgotICogVXBvbiB0aGUgYmVnaW5uaW5nIG9mIGEgbmV3IHJlcXVlc3QgY3ljbGUgd2hlbiB0aGUgdGFibGUgbW9kZWwgaXMgZmlyc3QgbmVlZGVkLAotICogdGhlIG1vZGVsIGlzIG9idGFpbmVkIHVzaW5nIHRoZSBmb2xsb3dpbmcgcHJvY2VzczoKLSAqIDx1bD4KLSAqIDxsaT5UaGUgcGVyc2lzdGVudCBzdGF0ZSBvZiB0aGUgdGFibGUgaXMgbG9hZGVkLgotICogSWYgdGhlIHRhYmxlU2Vzc2lvblN0b3JlTWFuYWdlciBiaW5kaW5nIGhhcyBub3QgYmVlbiBib3VuZCwgdGhlIHN0YXRlIGlzIGxvYWRlZCAKLSAqIGZyb20gYSBwZXJzaXN0ZW50IHByb3BlcnR5IHdpdGhpbiB0aGUgY29tcG9uZW50IChpdCBpcyBudWxsIGF0IHRoZSBiZWdpbm5pbmcpLiAKLSAqIE90aGVyd2lzZSB0aGUgc3VwcGxpZWQKLSAqIHtAbGluayAgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsLklUYWJsZVNlc3Npb25TdG9yZU1hbmFnZXJ9IGlzIHVzZWQKLSAqIHRvIGxvYWQgdGhlIHBlcnNpc3RlbnQgc3RhdGUuCi0gKiA8bGk+VGhlIHRhYmxlIG1vZGVsIGlzIHJlY3JlYXRlZCB1c2luZyB0aGUgCi0gKiB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsLklUYWJsZVNlc3Npb25TdGF0ZU1hbmFnZXJ9IHRoYXQKLSAqIGNvdWxkIGJlIHN1cHBsaWVkIHVzaW5nIHRoZSB0YWJsZVNlc3Npb25TdGF0ZU1hbmFnZXIgYmluZGluZyAKLSAqIChidXQgaGFzIGEgZGVmYXVsdCB2YWx1ZSBhbmQgaXMgdGhlcmVmb3JlIG5vdCByZXF1aXJlZCkuCi0gKiA8bGk+SWYgdGhlIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuSVRhYmxlU2Vzc2lvblN0YXRlTWFuYWdlcn0KLSAqIHJldHVybnMgbnVsbCwgdGhlbiBhIHRhYmxlIG1vZGVsIGlzIHRha2VuIGZyb20gdGhlIHRhYmxlTW9kZWwgYmluZGluZy4gVGh1cywgaWYKLSAqIHRoZSB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsLmNvbW1vbi5OdWxsVGFibGVTZXNzaW9uU3RhdGVNYW5hZ2VyfQotICogaXMgdXNlZCwgdGhlIHRhYmxlIG1vZGVsIHdvdWxkIGJlIHRha2VuIGZyb20gdGhlIHRhYmxlTW9kZWwgYmluZGluZyBldmVyeSB0aW1lLgotICogPC91bD4KLSAqIEp1c3QgYmVmb3JlIHRoZSByZW5kZXJpbmcgcGhhc2UgdGhlIHBlcnNpc3RlbnQgc3RhdGUgb2YgdGhlIG1vZGVsIGlzIHNhdmVkIGluCi0gKiB0aGUgc2Vzc2lvbi4gVGhpcyBwcm9jZXNzIG9jY3VycyBpbiByZXZlcnNlOgotICogPHVsPgotICogPGxpPlRoZSBwZXJzaXN0ZW50IHN0YXRlIG9mIHRoZSBtb2RlbCBpcyB0YWtlbiB2aWEgdGhlIAotICoge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5tb2RlbC5JVGFibGVTZXNzaW9uU3RhdGVNYW5hZ2VyfS4KLSAqIDxsaT5JZiB0aGUgdGFibGVTZXNzaW9uU3RvcmVNYW5hZ2VyIGJpbmRpbmcgaGFzIG5vdCBiZWVuIGJvdW5kLCB0aGUgcGVyc2lzdGVudAotICogc3RhdGUgaXMgc2F2ZWQgYXMgYSBwZXJzaXN0ZW50IHBhZ2UgcHJvcGVydHkuIE90aGVyd2lzZSB0aGUgc3VwcGxpZWQKLSAqIHtAbGluayAgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsLklUYWJsZVNlc3Npb25TdG9yZU1hbmFnZXJ9IGlzIHVzZWQKLSAqIHRvIHNhdmUgdGhlIHBlcnNpc3RlbnQgc3RhdGUuIFVzZSBvZiB0aGUgCi0gKiB7QGxpbmsgIG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5tb2RlbC5JVGFibGVTZXNzaW9uU3RvcmVNYW5hZ2VyfSAKLSAqIGlzIHVzdWFsbHkgbmVjZXNzYXJ5IHdoZW4gdGFibGVzIHdpdGggdGhlIHNhbWUgbW9kZWwgaGF2ZSB0byBiZSB1c2VkIGFjcm9zcyAKLSAqIG11bHRpcGxlIHBhZ2VzLCBhbmQgaGVuY2UgdGhlIHN0YXRlIGhhcyB0byBiZSBzYXZlZCBpbiB0aGUgVmlzaXQsIHJhdGhlciB0aGFuCi0gKiBpbiBhIHBlcnNpc3RlbnQgY29tcG9uZW50IHByb3BlcnR5LgotICogPC91bD4KLSAqIDxwPgotICogCi0gKiA8cD4gCi0gKiBQbGVhc2Ugc2VlIHRoZSBDb21wb25lbnQgUmVmZXJlbmNlIGZvciBkZXRhaWxzIG9uIGhvdyB0byB1c2UgdGhpcyBjb21wb25lbnQuIAotICogCi0gKiAgWzxhIGhyZWY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL0NvbXBvbmVudFJlZmVyZW5jZS9jb250cmliLlRhYmxlVmlldy5odG1sIj5Db21wb25lbnQgUmVmZXJlbmNlPC9hPl0KLSAqIAotICogQGF1dGhvciBtaW5kYnJpZGdlCi0gKiBAdmVyc2lvbiAkSWQkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUYWJsZVZpZXcKLSAgICBleHRlbmRzIEJhc2VDb21wb25lbnQKLSAgICBpbXBsZW1lbnRzIFBhZ2VEZXRhY2hMaXN0ZW5lciwgUGFnZVJlbmRlckxpc3RlbmVyLCBJVGFibGVNb2RlbFNvdXJjZQotewotICAgIC8vIENvbXBvbmVudCBwcm9wZXJ0aWVzCi0gICAgcHJpdmF0ZSBJVGFibGVTZXNzaW9uU3RhdGVNYW5hZ2VyIG1fb2JqRGVmYXVsdFNlc3Npb25TdGF0ZU1hbmFnZXIgPSBudWxsOwotICAgIHByaXZhdGUgSVRhYmxlQ29sdW1uTW9kZWwgbV9vYmpDb2x1bW5Nb2RlbCA9IG51bGw7Ci0KLSAgICAvLyBUcmFuc2llbnQgb2JqZWN0cwotICAgIHByaXZhdGUgSVRhYmxlTW9kZWwgbV9vYmpUYWJsZU1vZGVsOwotICAgIHByaXZhdGUgSVRhYmxlTW9kZWwgbV9vYmpDYWNoZWRUYWJsZU1vZGVsVmFsdWU7Ci0KLSAgICAvLyBlbmhhbmNlZCBwYXJhbWV0ZXIgbWV0aG9kcwotICAgIHB1YmxpYyBhYnN0cmFjdCBJVGFibGVNb2RlbCBnZXRUYWJsZU1vZGVsVmFsdWUoKTsKLSAgICBwdWJsaWMgYWJzdHJhY3QgT2JqZWN0IGdldFNvdXJjZSgpOwotICAgIHB1YmxpYyBhYnN0cmFjdCBPYmplY3QgZ2V0Q29sdW1ucygpOwotICAgIHB1YmxpYyBhYnN0cmFjdCBJQmluZGluZyBnZXRDb2x1bW5zQmluZGluZygpOwotICAgIHB1YmxpYyBhYnN0cmFjdCBJQmluZGluZyBnZXRQYWdlU2l6ZUJpbmRpbmcoKTsKLSAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldEluaXRpYWxTb3J0Q29sdW1uKCk7Ci0gICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gZ2V0SW5pdGlhbFNvcnRPcmRlcigpOwotICAgIHB1YmxpYyBhYnN0cmFjdCBJVGFibGVTZXNzaW9uU3RhdGVNYW5hZ2VyIGdldFRhYmxlU2Vzc2lvblN0YXRlTWFuYWdlcigpOwotICAgIHB1YmxpYyBhYnN0cmFjdCBJVGFibGVTZXNzaW9uU3RvcmVNYW5hZ2VyIGdldFRhYmxlU2Vzc2lvblN0b3JlTWFuYWdlcigpOwotICAgIHB1YmxpYyBhYnN0cmFjdCBJQ29tcG9uZW50IGdldENvbHVtblNldHRpbmdzQ29udGFpbmVyKCk7Ci0KLSAgICAvLyBlbmhhbmNlZCBwcm9wZXJ0eSBtZXRob2RzCi0gICAgcHVibGljIGFic3RyYWN0IFNlcmlhbGl6YWJsZSBnZXRTZXNzaW9uU3RhdGUoKTsKLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRTZXNzaW9uU3RhdGUoU2VyaWFsaXphYmxlIHNlc3Npb25TdGF0ZSk7Ci0KLSAgICAvKioKLSAgICAgKiAgVGhlIGNvbXBvbmVudCBjb25zdHJ1Y3Rvci4gSW52b2tlcyB0aGUgY29tcG9uZW50IG1lbWJlciBpbml0aWFsaXphdGlvbnMuIAotICAgICAqLwotICAgIHB1YmxpYyBUYWJsZVZpZXcoKQotICAgIHsKLSAgICAgICAgaW5pdGlhbGl6ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBJbnZva2VzIHRoZSBjb21wb25lbnQgbWVtYmVyIGluaXRpYWxpemF0aW9ucy4KLSAgICAgKiAgCi0gICAgICogIEBzZWUgb3JnLmFwYWNoZS50YXBlc3RyeS5ldmVudC5QYWdlRGV0YWNoTGlzdGVuZXIjcGFnZURldGFjaGVkKFBhZ2VFdmVudCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwYWdlRGV0YWNoZWQoUGFnZUV2ZW50IG9iakV2ZW50KQotICAgIHsKLSAgICAgICAgaW5pdGlhbGl6ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBJbml0aWFsaXplIHRoZSBjb21wb25lbnQgbWVtYmVyIHZhcmlhYmxlcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZSgpCi0gICAgewotICAgICAgICBtX29ialRhYmxlTW9kZWwgPSBudWxsOwotICAgICAgICBtX29iakNhY2hlZFRhYmxlTW9kZWxWYWx1ZSA9IG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFJlc2V0cyB0aGUgdGFibGUgYnkgcmVtb3ZpbmcgYW55IHN0b3JlZCB0YWJsZSBzdGF0ZS4gCi0gICAgICogIFRoaXMgbWVhbnMgdGhhdCB0aGUgY3VycmVudCBjb2x1bW4gdG8gc29ydCBvbiBhbmQgdGhlIGN1cnJlbnQgcGFnZSB3aWxsIGJlCi0gICAgICogIGZvcmdvdHRlbiBhbmQgYWxsIGRhdGEgd2lsbCBiZSByZWxvYWRlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZXNldCgpCi0gICAgewotCQlpbml0aWFsaXplKCk7Ci0gICAgICAgIHN0b3JlU2Vzc2lvblN0YXRlKG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBJVGFibGVNb2RlbCBnZXRDYWNoZWRUYWJsZU1vZGVsVmFsdWUoKQotICAgIHsKLSAgICAgICAgaWYgKG1fb2JqQ2FjaGVkVGFibGVNb2RlbFZhbHVlID09IG51bGwpCi0gICAgICAgICAgICBtX29iakNhY2hlZFRhYmxlTW9kZWxWYWx1ZSA9IGdldFRhYmxlTW9kZWxWYWx1ZSgpOwotICAgICAgICByZXR1cm4gbV9vYmpDYWNoZWRUYWJsZU1vZGVsVmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgdGhlIHRhYmxlTW9kZWwuCi0gICAgICogCi0gICAgICogIEByZXR1cm4gSVRhYmxlTW9kZWwgdGhlIHRhYmxlIG1vZGVsIHVzZWQgYnkgdGhlIHRhYmxlIGNvbXBvbmVudHMKLSAgICAgKi8KLSAgICBwdWJsaWMgSVRhYmxlTW9kZWwgZ2V0VGFibGVNb2RlbCgpCi0gICAgewotICAgICAgICAvLyBpZiBudWxsLCBmaXJzdCB0cnkgdG8gcmVjcmVhdGUgdGhlIG1vZGVsIGZyb20gdGhlIHNlc3Npb24gc3RhdGUKLSAgICAgICAgaWYgKG1fb2JqVGFibGVNb2RlbCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBTZXJpYWxpemFibGUgb2JqU3RhdGUgPSBsb2FkU2Vzc2lvblN0YXRlKCk7Ci0gICAgICAgICAgICBtX29ialRhYmxlTW9kZWwgPSBnZXRUYWJsZVNlc3Npb25TdGF0ZU1hbmFnZXIoKS5yZWNyZWF0ZVRhYmxlTW9kZWwob2JqU3RhdGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gaWYgdGhlIHNlc3Npb24gc3RhdGUgZG9lcyBub3QgaGVscCwgZ2V0IHRoZSBtb2RlbCBmcm9tIHRoZSBiaW5kaW5nCi0gICAgICAgIGlmIChtX29ialRhYmxlTW9kZWwgPT0gbnVsbCkKLSAgICAgICAgICAgIG1fb2JqVGFibGVNb2RlbCA9IGdldENhY2hlZFRhYmxlTW9kZWxWYWx1ZSgpOwotCi0gICAgICAgIC8vIGlmIHRoZSBtb2RlbCBmcm9tIHRoZSBiaW5kaW5nIGlzIG51bGwsIGJ1aWxkIGEgbW9kZWwgZnJvbSBzb3VyY2UgYW5kIGNvbHVtbnMKLSAgICAgICAgaWYgKG1fb2JqVGFibGVNb2RlbCA9PSBudWxsKQotICAgICAgICAgICAgbV9vYmpUYWJsZU1vZGVsID0gZ2VuZXJhdGVUYWJsZU1vZGVsKG51bGwpOwotCi0gICAgICAgIGlmIChtX29ialRhYmxlTW9kZWwgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgVGFibGVVdGlscy5mb3JtYXQoIm1pc3NpbmctdGFibGUtbW9kZWwiLCBnZXRFeHRlbmRlZElkKCkpKTsKLQotICAgICAgICByZXR1cm4gbV9vYmpUYWJsZU1vZGVsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBHZW5lcmF0ZSBhIHRhYmxlIG1vZGVsIHVzaW5nIHRoZSAnc291cmNlJyBhbmQgJ2NvbHVtbnMnIHBhcmFtZXRlcnMuCi0gICAgICogCi0gICAgICogIEByZXR1cm4gdGhlIG5ld2x5IGdlbmVyYXRlZCB0YWJsZSBtb2RlbAotICAgICAqLwotICAgIHByb3RlY3RlZCBJVGFibGVNb2RlbCBnZW5lcmF0ZVRhYmxlTW9kZWwoU2ltcGxlVGFibGVTdGF0ZSBvYmpTdGF0ZSkKLSAgICB7Ci0gICAgICAgIC8vIGNyZWF0ZSBhIG5ldyB0YWJsZSBzdGF0ZSBpZiBub25lIGlzIHBhc3NlZAotICAgICAgICBpZiAob2JqU3RhdGUgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgb2JqU3RhdGUgPSBuZXcgU2ltcGxlVGFibGVTdGF0ZSgpOwotICAgICAgICAgICAgb2JqU3RhdGUuZ2V0U29ydGluZ1N0YXRlKCkuc2V0U29ydENvbHVtbihnZXRJbml0aWFsU29ydENvbHVtbigpLCBnZXRJbml0aWFsU29ydE9yZGVyKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gdXBkYXRlIHRoZSBwYWdlIHNpemUgaWYgc2V0IGluIHRoZSBwYXJhbWV0ZXIKLSAgICAgICAgSUJpbmRpbmcgb2JqUGFnZVNpemVCaW5kaW5nID0gZ2V0UGFnZVNpemVCaW5kaW5nKCk7Ci0gICAgICAgIGlmIChvYmpQYWdlU2l6ZUJpbmRpbmcgIT0gbnVsbCkKLSAgICAgICAgICAgIG9ialN0YXRlLmdldFBhZ2luZ1N0YXRlKCkuc2V0UGFnZVNpemUob2JqUGFnZVNpemVCaW5kaW5nLmdldEludCgpKTsKLQotICAgICAgICAvLyBnZXQgdGhlIGNvbHVtbiBtb2RlbC4gaWYgbm90IHBvc3NpYmxlLCByZXR1cm4gbnVsbC4KLSAgICAgICAgSVRhYmxlQ29sdW1uTW9kZWwgb2JqQ29sdW1uTW9kZWwgPSBnZXRUYWJsZUNvbHVtbk1vZGVsKCk7Ci0gICAgICAgIGlmIChvYmpDb2x1bW5Nb2RlbCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgT2JqZWN0IG9ialNvdXJjZVZhbHVlID0gZ2V0U291cmNlKCk7Ci0gICAgICAgIGlmIChvYmpTb3VyY2VWYWx1ZSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgLy8gaWYgdGhlIHNvdXJjZSBwYXJhbWV0ZXIgaXMgb2YgdHlwZSB7QGxpbmsgSUJhc2ljVGFibGVNb2RlbH0sIAotICAgICAgICAvLyBjcmVhdGUgYW5kIHJldHVybiBhbiBhcHByb3ByaWF0ZSB3cmFwcGVyCi0gICAgICAgIGlmIChvYmpTb3VyY2VWYWx1ZSBpbnN0YW5jZW9mIElCYXNpY1RhYmxlTW9kZWwpCi0gICAgICAgICAgICByZXR1cm4gbmV3IEJhc2ljVGFibGVNb2RlbFdyYXAoCi0gICAgICAgICAgICAgICAgKElCYXNpY1RhYmxlTW9kZWwpIG9ialNvdXJjZVZhbHVlLAotICAgICAgICAgICAgICAgIG9iakNvbHVtbk1vZGVsLAotICAgICAgICAgICAgICAgIG9ialN0YXRlKTsKLQotICAgICAgICAvLyBvdGhlcndpc2UsIHRoZSBzb3VyY2UgcGFyYW1ldGVyIG11c3QgY29udGFpbiB0aGUgZGF0YSB0byBiZSBkaXNwbGF5ZWQKLSAgICAgICAgSVRhYmxlRGF0YU1vZGVsIG9iakRhdGFNb2RlbCA9IG51bGw7Ci0gICAgICAgIGlmIChvYmpTb3VyY2VWYWx1ZSBpbnN0YW5jZW9mIE9iamVjdFtdKQotICAgICAgICAgICAgb2JqRGF0YU1vZGVsID0gbmV3IFNpbXBsZUxpc3RUYWJsZURhdGFNb2RlbCgoT2JqZWN0W10pIG9ialNvdXJjZVZhbHVlKTsKLSAgICAgICAgZWxzZSBpZiAob2JqU291cmNlVmFsdWUgaW5zdGFuY2VvZiBMaXN0KQotICAgICAgICAgICAgb2JqRGF0YU1vZGVsID0gbmV3IFNpbXBsZUxpc3RUYWJsZURhdGFNb2RlbCgoTGlzdCkgb2JqU291cmNlVmFsdWUpOwotICAgICAgICBlbHNlIGlmIChvYmpTb3VyY2VWYWx1ZSBpbnN0YW5jZW9mIENvbGxlY3Rpb24pCi0gICAgICAgICAgICBvYmpEYXRhTW9kZWwgPSBuZXcgU2ltcGxlTGlzdFRhYmxlRGF0YU1vZGVsKChDb2xsZWN0aW9uKSBvYmpTb3VyY2VWYWx1ZSk7Ci0gICAgICAgIGVsc2UgaWYgKG9ialNvdXJjZVZhbHVlIGluc3RhbmNlb2YgSXRlcmF0b3IpCi0gICAgICAgICAgICBvYmpEYXRhTW9kZWwgPSBuZXcgU2ltcGxlTGlzdFRhYmxlRGF0YU1vZGVsKChJdGVyYXRvcikgb2JqU291cmNlVmFsdWUpOwotCi0gICAgICAgIGlmIChvYmpEYXRhTW9kZWwgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgVGFibGVVdGlscy5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICJpbnZhbGlkLXRhYmxlLXNvdXJjZSIsCi0gICAgICAgICAgICAgICAgICAgIGdldEV4dGVuZGVkSWQoKSwKLSAgICAgICAgICAgICAgICAgICAgb2JqU291cmNlVmFsdWUuZ2V0Q2xhc3MoKSkpOwotCi0gICAgICAgIHJldHVybiBuZXcgU2ltcGxlVGFibGVNb2RlbChvYmpEYXRhTW9kZWwsIG9iakNvbHVtbk1vZGVsLCBvYmpTdGF0ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgdGhlIHRhYmxlIGNvbHVtbiBtb2RlbCBhcyBzcGVjaWZpZWQgYnkgdGhlICdjb2x1bW5zJyBiaW5kaW5nLgotICAgICAqICBJZiB0aGUgdmFsdWUgb2YgdGhlICdjb2x1bW5zJyBiaW5kaW5nIGlzIG9mIGEgdHlwZSBkaWZmZXJlbnQgdGhhbgotICAgICAqICBJVGFibGVDb2x1bW5Nb2RlbCwgdGhpcyBtZXRob2QgbWFrZXMgdGhlIGFwcHJvcHJpYXRlIGNvbnZlcnNpb24uIAotICAgICAqIAotICAgICAqICBAcmV0dXJuIFRoZSB0YWJsZSBjb2x1bW4gbW9kZWwgYXMgc3BlY2lmaWVkIGJ5IHRoZSAnY29sdW1ucycgYmluZGluZwotICAgICAqLwotICAgIHByb3RlY3RlZCBJVGFibGVDb2x1bW5Nb2RlbCBnZXRUYWJsZUNvbHVtbk1vZGVsKCkKLSAgICB7Ci0gICAgICAgIE9iamVjdCBvYmpDb2x1bW5zID0gZ2V0Q29sdW1ucygpOwotCi0gICAgICAgIGlmIChvYmpDb2x1bW5zID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICBpZiAob2JqQ29sdW1ucyBpbnN0YW5jZW9mIElUYWJsZUNvbHVtbk1vZGVsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKElUYWJsZUNvbHVtbk1vZGVsKSBvYmpDb2x1bW5zOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG9iakNvbHVtbnMgaW5zdGFuY2VvZiBJdGVyYXRvcikKLSAgICAgICAgewotICAgICAgICAgICAgLy8gY29udmVydCB0byBMaXN0Ci0gICAgICAgICAgICBJdGVyYXRvciBvYmpDb2x1bW5zSXRlcmF0b3IgPSAoSXRlcmF0b3IpIG9iakNvbHVtbnM7Ci0gICAgICAgICAgICBMaXN0IGFyckNvbHVtbnNMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgQ29sbGVjdGlvblV0aWxzLmFkZEFsbChhcnJDb2x1bW5zTGlzdCwgb2JqQ29sdW1uc0l0ZXJhdG9yKTsKLSAgICAgICAgICAgIG9iakNvbHVtbnMgPSBhcnJDb2x1bW5zTGlzdDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChvYmpDb2x1bW5zIGluc3RhbmNlb2YgTGlzdCkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gdmFsaWRhdGUgdGhhdCB0aGUgbGlzdCBjb250YWlucyBvbmx5IElUYWJsZUNvbHVtbiBpbnN0YW5jZXMKLSAgICAgICAgICAgIExpc3QgYXJyQ29sdW1uc0xpc3QgPSAoTGlzdCkgb2JqQ29sdW1uczsKLSAgICAgICAgICAgIGludCBuQ29sdW1uc051bWJlciA9IGFyckNvbHVtbnNMaXN0LnNpemUoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbkNvbHVtbnNOdW1iZXI7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoIShhcnJDb2x1bW5zTGlzdC5nZXQoaSkgaW5zdGFuY2VvZiBJVGFibGVDb2x1bW4pKQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgVGFibGVVdGlscy5mb3JtYXQoImNvbHVtbnMtb25seS1wbGVhc2UiLCBnZXRFeHRlbmRlZElkKCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vb2JqQ29sdW1ucyA9IGFyckNvbHVtbnNMaXN0LnRvQXJyYXkobmV3IElUYWJsZUNvbHVtbltuQ29sdW1uc051bWJlcl0pOwotICAgICAgICAgICAgcmV0dXJuIG5ldyBTaW1wbGVUYWJsZUNvbHVtbk1vZGVsKGFyckNvbHVtbnNMaXN0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChvYmpDb2x1bW5zIGluc3RhbmNlb2YgSVRhYmxlQ29sdW1uW10pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgU2ltcGxlVGFibGVDb2x1bW5Nb2RlbCgoSVRhYmxlQ29sdW1uW10pIG9iakNvbHVtbnMpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG9iakNvbHVtbnMgaW5zdGFuY2VvZiBTdHJpbmcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBzdHJDb2x1bW5zID0gKFN0cmluZykgb2JqQ29sdW1uczsKLSAgICAgICAgICAgIGlmIChnZXRDb2x1bW5zQmluZGluZygpLmlzSW52YXJpYW50KCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gaWYgdGhlIGJpbmRpbmcgaXMgaW52YXJpYW50LCBjcmVhdGUgdGhlIGNvbHVtbnMgb25seSBvbmNlCi0gICAgICAgICAgICAgICAgaWYgKG1fb2JqQ29sdW1uTW9kZWwgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgbV9vYmpDb2x1bW5Nb2RlbCA9IGdlbmVyYXRlVGFibGVDb2x1bW5Nb2RlbChzdHJDb2x1bW5zKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbV9vYmpDb2x1bW5Nb2RlbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gaWYgdGhlIGJpbmRpbmcgaXMgbm90IGludmFyaWFudCwgY3JlYXRlIHRoZW0gZXZlcnkgdGltZQotICAgICAgICAgICAgcmV0dXJuIGdlbmVyYXRlVGFibGVDb2x1bW5Nb2RlbChzdHJDb2x1bW5zKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICBUYWJsZVV0aWxzLmZvcm1hdCgiaW52YWxpZC10YWJsZS1jb2x1bW5zIiwgZ2V0RXh0ZW5kZWRJZCgpLCBvYmpDb2x1bW5zLmdldENsYXNzKCkpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgR2VuZXJhdGUgYSB0YWJsZSBjb2x1bW4gbW9kZWwgb3V0IG9mIHRoZSBkZXNjcmlwdGlvbiBzdHJpbmcgcHJvdmlkZWQuCi0gICAgICogIEVudHJpZXMgaW4gdGhlIGRlc2NyaXB0aW9uIHN0cmluZyBhcmUgc2VwYXJhdGVkIGJ5IGNvbW1hcy4KLSAgICAgKiAgRWFjaCBjb2x1bW4gZW50cnkgaXMgb2YgdGhlIGZvcm1hdCBuYW1lLCBuYW1lOmV4cHJlc3Npb24sIAotICAgICAqICBvciBuYW1lOmRpc3BsYXlOYW1lOmV4cHJlc3Npb24uCi0gICAgICogIEFuIGVudHJ5IHByZWZpeGVkIHdpdGggISByZXByZXNlbnRzIGEgbm9uLXNvcnRhYmxlIGNvbHVtbi4KLSAgICAgKiAgSWYgdGhlIHdob2xlIGRlc2NyaXB0aW9uIHN0cmluZyBpcyBwcmVmaXhlZCB3aXRoICosIGl0IHJlcHJlc2VudHMKLSAgICAgKiAgY29sdW1ucyB0byBiZSBpbmNsdWRlZCBpbiBhIEZvcm0uIAotICAgICAqIAotICAgICAqICBAcGFyYW0gc3RyRGVzYyB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIGNvbHVtbiBtb2RlbCB0byBiZSBnZW5lcmF0ZWQKLSAgICAgKiAgQHJldHVybiBhIHRhYmxlIGNvbHVtbiBtb2RlbCBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgZGVzY3JpcHRpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgSVRhYmxlQ29sdW1uTW9kZWwgZ2VuZXJhdGVUYWJsZUNvbHVtbk1vZGVsKFN0cmluZyBzdHJEZXNjKQotICAgIHsKLSAgICAgICAgSUNvbXBvbmVudCBvYmpDb2x1bW5TZXR0aW5nc0NvbnRhaW5lciA9IGdldENvbHVtblNldHRpbmdzQ29udGFpbmVyKCk7Ci0gICAgICAgIHJldHVybiBUYWJsZVV0aWxzLmdlbmVyYXRlVGFibGVDb2x1bW5Nb2RlbChzdHJEZXNjLCB0aGlzLCBvYmpDb2x1bW5TZXR0aW5nc0NvbnRhaW5lcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFRoZSBkZWZhdWx0IHNlc3Npb24gc3RhdGUgbWFuYWdlciB0byBiZSB1c2VkIGluIGNhc2Ugbm8gc3VjaCBtYW5hZ2VyCi0gICAgICogIGlzIHByb3ZpZGVkIGJ5IHRoZSBjb3JyZXNwb25kaW5nIHBhcmFtZXRlci4KLSAgICAgKiAKLSAgICAgKiAgQHJldHVybiB0aGUgZGVmYXVsdCBzZXNzaW9uIHN0YXRlIG1hbmFnZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgSVRhYmxlU2Vzc2lvblN0YXRlTWFuYWdlciBnZXREZWZhdWx0VGFibGVTZXNzaW9uU3RhdGVNYW5hZ2VyKCkKLSAgICB7Ci0gICAgICAgIGlmIChtX29iakRlZmF1bHRTZXNzaW9uU3RhdGVNYW5hZ2VyID09IG51bGwpCi0gICAgICAgICAgICBtX29iakRlZmF1bHRTZXNzaW9uU3RhdGVNYW5hZ2VyID0gbmV3IFRhYmxlVmlld1Nlc3Npb25TdGF0ZU1hbmFnZXIodGhpcyk7Ci0gICAgICAgIHJldHVybiBtX29iakRlZmF1bHRTZXNzaW9uU3RhdGVNYW5hZ2VyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBJbnZva2VkIHdoZW4gdGhlcmUgaXMgYSBtb2RpZmljYXRpb24gb2YgdGhlIHRhYmxlIHN0YXRlIGFuZCBpdCBuZWVkcyB0byBiZSBzYXZlZAotICAgICAqICAKLSAgICAgKiAgQHNlZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuSVRhYmxlTW9kZWxTb3VyY2UjZmlyZU9ic2VydmVkU3RhdGVDaGFuZ2UoKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGZpcmVPYnNlcnZlZFN0YXRlQ2hhbmdlKCkKLSAgICB7Ci0gICAgICAgIHNhdmVTZXNzaW9uU3RhdGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgRW5zdXJlcyB0aGF0IHRoZSB0YWJsZSBzdGF0ZSBpcyBzYXZlZCBiZWZvcmUgdGhlIHJlbmRlciBwaGFzZSBiZWdpbnMgCi0gICAgICogIGluIGNhc2UgdGhlcmUgYXJlIG1vZGlmaWNhdGlvbnMgZm9yIHdoaWNoIHtAbGluayAjZmlyZU9ic2VydmVkU3RhdGVDaGFuZ2UoKX0gCi0gICAgICogIGhhcyBub3QgYmVlbiBpbnZva2VkLgotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmFwYWNoZS50YXBlc3RyeS5ldmVudC5QYWdlUmVuZGVyTGlzdGVuZXIjcGFnZUJlZ2luUmVuZGVyKG9yZy5hcGFjaGUudGFwZXN0cnkuZXZlbnQuUGFnZUV2ZW50KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHBhZ2VCZWdpblJlbmRlcihQYWdlRXZlbnQgZXZlbnQpCi0gICAgewotICAgICAgICAvLyAnc3VzcGVuZGVycyc6IHNhdmUgdGhlIHRhYmxlIG1vZGVsIGlmIGl0IGhhcyBiZWVuIGFscmVhZHkgbG9hZGVkLgotICAgICAgICAvLyB0aGlzIG1lYW5zIHRoYXQgaWYgYSBjaGFuZ2UgaGFzIGJlZW4gbWFkZSBleHBsaWNpdGx5IGluIGEgbGlzdGVuZXIsIAotICAgICAgICAvLyBpdCB3aWxsIGJlIHNhdmVkLiB0aGlzIGlzIHRoZSBsYXN0IHBsYWNlIGJlZm9yZSBjb21taXR0aW5nIHRoZSBjaGFuZ2VzIAotICAgICAgICAvLyB3aGVyZSBhIHNhdmUgY2FuIG9jY3VyICAKLSAgICAgICAgaWYgKG1fb2JqVGFibGVNb2RlbCAhPSBudWxsKQotICAgICAgICAgICAgc2F2ZVNlc3Npb25TdGF0ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBAc2VlIG9yZy5hcGFjaGUudGFwZXN0cnkuZXZlbnQuUGFnZVJlbmRlckxpc3RlbmVyI3BhZ2VFbmRSZW5kZXIoUGFnZUV2ZW50KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHBhZ2VFbmRSZW5kZXIoUGFnZUV2ZW50IG9iakV2ZW50KQotICAgIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgU2F2ZXMgdGhlIHRhYmxlIHN0YXRlIHVzaW5nIHRoZSBTZXNzaW9uU3RhdGVNYW5hZ2VyIHRvIGRldGVybWluZSAKLSAgICAgKiAgd2hhdCB0byBzYXZlIGFuZCB0aGUgU2Vzc2lvblN0b3JlTWFuYWdlciB0byBkZXRlcm1pbmUgd2hlcmUgdG8gc2F2ZSBpdC4gIAotICAgICAqCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2F2ZVNlc3Npb25TdGF0ZSgpCi0gICAgewotICAgICAgICBJVGFibGVNb2RlbCBvYmpNb2RlbCA9IGdldFRhYmxlTW9kZWwoKTsKLSAgICAgICAgU2VyaWFsaXphYmxlIG9ialN0YXRlID0gZ2V0VGFibGVTZXNzaW9uU3RhdGVNYW5hZ2VyKCkuZ2V0U2Vzc2lvblN0YXRlKG9iak1vZGVsKTsKLSAgICAgICAgc3RvcmVTZXNzaW9uU3RhdGUob2JqU3RhdGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBMb2FkcyB0aGUgdGFibGUgc3RhdGUgdXNpbmcgdGhlIFNlc3Npb25TdG9yZU1hbmFnZXIuCi0gICAgICogCi0gICAgICogIEByZXR1cm4gdGhlIHN0b3JlZCB0YWJsZSBzdGF0ZQotICAgICAqLwotICAgIHByb3RlY3RlZCBTZXJpYWxpemFibGUgbG9hZFNlc3Npb25TdGF0ZSgpCi0gICAgewotICAgICAgICBJVGFibGVTZXNzaW9uU3RvcmVNYW5hZ2VyIG9iak1hbmFnZXIgPSBnZXRUYWJsZVNlc3Npb25TdG9yZU1hbmFnZXIoKTsKLSAgICAgICAgaWYgKG9iak1hbmFnZXIgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBvYmpNYW5hZ2VyLmxvYWRTdGF0ZShnZXRQYWdlKCkuZ2V0UmVxdWVzdEN5Y2xlKCkpOwotICAgICAgICByZXR1cm4gZ2V0U2Vzc2lvblN0YXRlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFN0b3JlcyB0aGUgdGFibGUgc3RhdGUgdXNpbmcgdGhlIFNlc3Npb25TdG9yZU1hbmFnZXIuCi0gICAgICogCi0gICAgICogIEBwYXJhbSBvYmpTdGF0ZSB0aGUgdGFibGUgc3RhdGUgdG8gc3RvcmUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzdG9yZVNlc3Npb25TdGF0ZShTZXJpYWxpemFibGUgb2JqU3RhdGUpCi0gICAgewotICAgICAgICBJVGFibGVTZXNzaW9uU3RvcmVNYW5hZ2VyIG9iak1hbmFnZXIgPSBnZXRUYWJsZVNlc3Npb25TdG9yZU1hbmFnZXIoKTsKLSAgICAgICAgaWYgKG9iak1hbmFnZXIgIT0gbnVsbCkKLSAgICAgICAgICAgIG9iak1hbmFnZXIuc2F2ZVN0YXRlKGdldFBhZ2UoKS5nZXRSZXF1ZXN0Q3ljbGUoKSwgb2JqU3RhdGUpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBzZXRTZXNzaW9uU3RhdGUob2JqU3RhdGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBNYWtlIHN1cmUgdGhhdCB0aGUgdmFsdWVzIHN0b3JlZCBpbiB0aGUgbW9kZWwgYXJlIHVzZWFibGUgYW5kIGNvcnJlY3QuCi0gICAgICogIFRoZSBjaGFuZ2VzIG1hZGUgaGVyZSBhcmUgbm90IHNhdmVkLiAgCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVWYWx1ZXMoKQotICAgIHsKLSAgICAgICAgSVRhYmxlTW9kZWwgb2JqTW9kZWwgPSBnZXRUYWJsZU1vZGVsKCk7Ci0KLSAgICAgICAgLy8gbWFrZSBzdXJlIGN1cnJlbnQgcGFnZSBpcyB3aXRoaW4gdGhlIGFsbG93ZWQgcmFuZ2UKLSAgICAgICAgSVRhYmxlUGFnaW5nU3RhdGUgb2JqUGFnaW5nU3RhdGUgPSBvYmpNb2RlbC5nZXRQYWdpbmdTdGF0ZSgpOwotICAgICAgICBpbnQgbkN1cnJlbnRQYWdlID0gb2JqUGFnaW5nU3RhdGUuZ2V0Q3VycmVudFBhZ2UoKTsKLSAgICAgICAgaW50IG5QYWdlQ291bnQgPSBvYmpNb2RlbC5nZXRQYWdlQ291bnQoKTsKLSAgICAgICAgaWYgKG5DdXJyZW50UGFnZSA+PSBuUGFnZUNvdW50KQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyB0aGUgY3VycmVudCBwYWdlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgcGFnZSBjb3VudC4gYWRqdXN0LgotICAgICAgICAgICAgbkN1cnJlbnRQYWdlID0gblBhZ2VDb3VudCAtIDE7Ci0gICAgICAgICAgICBvYmpQYWdpbmdTdGF0ZS5zZXRDdXJyZW50UGFnZShuQ3VycmVudFBhZ2UpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChuQ3VycmVudFBhZ2UgPCAwKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyB0aGUgY3VycmVudCBwYWdlIGlzIGJlZm9yZSB0aGUgZmlyc3QgcGFnZS4gYWRqdXN0LgotICAgICAgICAgICAgbkN1cnJlbnRQYWdlID0gMDsKLSAgICAgICAgICAgIG9ialBhZ2luZ1N0YXRlLnNldEN1cnJlbnRQYWdlKG5DdXJyZW50UGFnZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgU3RvcmVzIGEgcG9pbnRlciB0byB0aGlzIGNvbXBvbmVudCBpbiB0aGUgUmVxdWVzdCBDeWNsZSB3aGlsZSByZW5kZXJpbmcKLSAgICAgKiAgc28gdGhhdCB3cmFwcGVkIGNvbXBvbmVudHMgaGF2ZSBhY2Nlc3MgdG8gaXQuCi0gICAgICogCi0gICAgICogIEBzZWUgb3JnLmFwYWNoZS50YXBlc3RyeS5CYXNlQ29tcG9uZW50I3JlbmRlckNvbXBvbmVudChJTWFya3VwV3JpdGVyLCBJUmVxdWVzdEN5Y2xlKQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHJlbmRlckNvbXBvbmVudChJTWFya3VwV3JpdGVyIHdyaXRlciwgSVJlcXVlc3RDeWNsZSBjeWNsZSkKLSAgICB7Ci0gICAgICAgIE9iamVjdCBvYmpPbGRWYWx1ZSA9IGN5Y2xlLmdldEF0dHJpYnV0ZShJVGFibGVNb2RlbFNvdXJjZS5UQUJMRV9NT0RFTF9TT1VSQ0VfQVRUUklCVVRFKTsKLSAgICAgICAgY3ljbGUuc2V0QXR0cmlidXRlKElUYWJsZU1vZGVsU291cmNlLlRBQkxFX01PREVMX1NPVVJDRV9BVFRSSUJVVEUsIHRoaXMpOwotCi0gICAgICAgIGluaXRpYWxpemUoKTsKLSAgICAgICAgdmFsaWRhdGVWYWx1ZXMoKTsKLSAgICAgICAgc3VwZXIucmVuZGVyQ29tcG9uZW50KHdyaXRlciwgY3ljbGUpOwotCi0gICAgICAgIGN5Y2xlLnNldEF0dHJpYnV0ZShJVGFibGVNb2RlbFNvdXJjZS5UQUJMRV9NT0RFTF9TT1VSQ0VfQVRUUklCVVRFLCBvYmpPbGRWYWx1ZSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdGFibGUvY29tcG9uZW50cy9UYWJsZVZpZXcuandjIGIvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL2NvbXBvbmVudHMvVGFibGVWaWV3Lmp3YwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjIzMjRmYy4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdGFibGUvY29tcG9uZW50cy9UYWJsZVZpZXcuandjCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAgCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPCEtLSAgJElkJCAtLT4KLTwhRE9DVFlQRSBjb21wb25lbnQtc3BlY2lmaWNhdGlvbiBQVUJMSUMgCi0gICAgIi0vL0FwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLy9UYXBlc3RyeSBTcGVjaWZpY2F0aW9uIDMuMC8vRU4iIAotICAgICJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL3RhcGVzdHJ5L2R0ZC9UYXBlc3RyeV8zXzAuZHRkIj4KLQotPGNvbXBvbmVudC1zcGVjaWZpY2F0aW9uIGNsYXNzPSJvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUuY29tcG9uZW50cy5UYWJsZVZpZXciIAotICAgIGFsbG93LWJvZHk9InllcyIgYWxsb3ctaW5mb3JtYWwtcGFyYW1ldGVycz0ieWVzIj4KLSAgICAKLSAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgIFRoZSBtYWluIGxvd2VyLWxldmVsIFRhYmxlIGNvbXBvbmVudC4KLSAgICAgICAgVGhpcyBjb21wb25lbnQgc2hvdWxkIHdyYXAgYWxsIG90aGVyIGxvd2VyLWxldmVsIFRhYmxlIGNvbXBvbmVudHMgc3VjaCBhcyAKLSAgICAgICAgVGFibGVQYWdlcyBhbmQgVGFibGVSb3dzLCBhcyBpdCBwcm92aWRlcyB0aGUgZGF0YSB0aGV5IHVzZS4KLSAgICA8L2Rlc2NyaXB0aW9uPgotICAgIAotICAgIDxwYXJhbWV0ZXIgbmFtZT0idGFibGVNb2RlbCIgCi0gICAgICAgIHR5cGU9Im9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5tb2RlbC5JVGFibGVNb2RlbCIgCi0gICAgICAgIHByb3BlcnR5LW5hbWU9InRhYmxlTW9kZWxWYWx1ZSIKLSAgICAgICAgcmVxdWlyZWQ9Im5vIiAKLSAgICAgICAgZGlyZWN0aW9uPSJhdXRvIgotICAgICAgICBkZWZhdWx0LXZhbHVlPSJudWxsIj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgVGhlIG1vZGVsIGRlc2NyaWJpbmcgdGhlIGRhdGEgdG8gYmUgcHJlc2VudGVkIGJ5IHRoZSB0YWJsZSBjb21wb25lbnRzLgotICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgaXMgb3B0aW9uYWwsIGJ1dCBlaXRoZXIgdGhlICd0YWJsZU1vZGVsJyBvciBib3RoCi0gICAgICAgICAgICAnc291cmNlJyBhbmQgJ2NvbHVtbnMnIHBhcmFtZXRlcnMgbXVzdCBiZSBwcm92aWRlZC4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICA8L3BhcmFtZXRlcj4KLSAgICAKLSAgICA8cGFyYW1ldGVyIG5hbWU9InNvdXJjZSIgdHlwZT0iamF2YS5sYW5nLk9iamVjdCIgcmVxdWlyZWQ9Im5vIiBkaXJlY3Rpb249ImF1dG8iIGRlZmF1bHQtdmFsdWU9Im51bGwiPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBUaGUgZGF0YSB0byBiZSBkaXNwbGF5ZWQgYnkgdGhlIGNvbXBvbmVudC4gVGhpcyBwYXJhbWV0ZXIgaXMgYXZhaWxhYmxlIGFzCi0gICAgICAgICAgICBhbiBhbHRlcm5hdGl2ZSB0byB0YWJsZU1vZGVsIGFuZCBtdXN0IGJlIHVzZWQgaW4gY29tYmluYXRpb24gd2l0aCB0aGUKLSAgICAgICAgICAgICdjb2x1bW5zJyBwYXJhbWV0ZXIuIAotICAgICAgICAgICAgVGhlIHBhcmFtZXRlciBtdXN0IGJlIGFuIGFycmF5IG9mIHZhbHVlcywgYSBjb2xsZWN0aW9uLCBhbiBpdGVyYXRvciwgCi0gICAgICAgICAgICBvciBhbiBvYmplY3QgaW1wbGVtZW50aW5nIHRoZSBJQmFzaWNUYWJsZU1vZGVsIGludGVyZmFjZS4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICA8L3BhcmFtZXRlcj4KLSAgICAKLSAgICA8cGFyYW1ldGVyIG5hbWU9ImNvbHVtbnMiIHR5cGU9ImphdmEubGFuZy5PYmplY3QiIHJlcXVpcmVkPSJubyIgZGlyZWN0aW9uPSJhdXRvIiBkZWZhdWx0LXZhbHVlPSJudWxsIj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgVGhlIHRhYmxlIGNvbHVtbnMgdG8gYmUgZGlzcGxheWVkLiAKLSAgICAgICAgICAgIFRoZSBwYXJhbWV0ZXIgbXVzdCBiZSBhbiBhcnJheSwgYSBsaXN0LCBvciBhbiBJdGVyYXRvciBvZiBJVGFibGVDb2x1bW4gb2JqZWN0cywKLSAgICAgICAgICAgIGFuIElUYWJsZUNvbHVtbk1vZGVsLCBvciBhIFN0cmluZyBkZXNjcmliaW5nIHRoZSBjb2x1bW5zIChzZWUgZG9jdW1lbnRhdGlvbikuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgPC9wYXJhbWV0ZXI+Ci0gICAgCi0JPHBhcmFtZXRlciBuYW1lPSJwYWdlU2l6ZSIgCi0JCXR5cGU9ImludCIgCi0JCXJlcXVpcmVkPSJubyI+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIFRoZSBudW1iZXIgb2YgcmVjb3JkcyBkaXNwbGF5ZWQgcGVyIHBhZ2Ugd2hlbiBzb3VyY2UvY29sdW1ucyBhcmUgdXNlZC4KLSAgICAgICAgICAgIFRoZSBwYWdlIHNpemUgaXMgMTAgYnkgZGVmYXVsdC4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICA8L3BhcmFtZXRlcj4KLSAgCi0JPHBhcmFtZXRlciBuYW1lPSJpbml0aWFsU29ydENvbHVtbiIgCi0JCXR5cGU9ImphdmEubGFuZy5TdHJpbmciIAotCQlyZXF1aXJlZD0ibm8iCi0gICAgICAgIGRpcmVjdGlvbj0iYXV0byIKLSAgICAgICAgZGVmYXVsdC12YWx1ZT0ibnVsbCI+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIFRoZSBpZCBvZiB0aGUgY29sdW1uIHRvIGluaXRpYWxseSBzb3J0IHRoZSB0YWJsZSBieS4KLSAgICAgICAgICAgIFRoZSBjb2x1bW4gaXMgc2V0IHRvIG51bGwgYnkgZGVmYXVsdCwgaS5lLiB0aGVyZSBpcyBubyBzb3J0aW5nLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgIDwvcGFyYW1ldGVyPgotICAKLQk8cGFyYW1ldGVyIG5hbWU9ImluaXRpYWxTb3J0T3JkZXIiIAotCQl0eXBlPSJib29sZWFuIiAKLQkJcmVxdWlyZWQ9Im5vIgotICAgICAgICBkaXJlY3Rpb249ImF1dG8iCi0gICAgICAgIGRlZmF1bHQtdmFsdWU9ImZhbHNlIj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgVGhlIG9yZGVyIG9mIHRoZSBpbml0aWFsIHNvcnRpbmcuCi0gICAgICAgICAgICBTZXQgdGhpcyBwYXJhbWV0ZXIgdG8gJ2ZhbHNlJyB0byBzb3J0IGluIGFuIGFzY2VuZGluZyBvcmRlcgotICAgICAgICAgICAgYW5kIHRvICd0cnVlJyB0byBzb3J0IGluIGEgZGVzY2VuZGluZyBvbmUuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgPC9wYXJhbWV0ZXI+Ci0gIAotICAgIDxwYXJhbWV0ZXIgbmFtZT0idGFibGVTZXNzaW9uU3RhdGVNYW5hZ2VyIiAKLSAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsLklUYWJsZVNlc3Npb25TdGF0ZU1hbmFnZXIiIAotICAgICAgICByZXF1aXJlZD0ibm8iCi0gICAgICAgIGRpcmVjdGlvbj0iYXV0byIKLSAgICAgICAgZGVmYXVsdC12YWx1ZT0iZGVmYXVsdFRhYmxlU2Vzc2lvblN0YXRlTWFuYWdlciI+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIFRoZSBtYW5hZ2VyIGRlZmluaW5nIHdoYXQgcGFydCBvZiB0aGUgdGFibGUgbW9kZWwgd2lsbCBiZSBzdG9yZWQgaW4gCi0gICAgICAgICAgICB0aGUgc2Vzc2lvbi4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICA8L3BhcmFtZXRlcj4KLSAgICAKLSAgICA8cGFyYW1ldGVyIG5hbWU9InRhYmxlU2Vzc2lvblN0b3JlTWFuYWdlciIgCi0gICAgICAgIHR5cGU9Im9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5tb2RlbC5JVGFibGVTZXNzaW9uU3RvcmVNYW5hZ2VyIiAKLSAgICAgICAgcmVxdWlyZWQ9Im5vIgotICAgICAgICBkaXJlY3Rpb249ImF1dG8iCi0gICAgICAgIGRlZmF1bHQtdmFsdWU9Im51bGwiPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBUaGUgbWFuYWdlciBkZWZpbmluZyB3aGVyZSB0aGUgc2Vzc2lvbiBkYXRhIHdpbGwgYmUgc3RvcmVkLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgIDwvcGFyYW1ldGVyPgotICAgIAotICAgIDxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uU2V0dGluZ3NDb250YWluZXIiIAotICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLnRhcGVzdHJ5LklDb21wb25lbnQiIAotICAgICAgICByZXF1aXJlZD0ibm8iIAotICAgICAgICBkaXJlY3Rpb249ImF1dG8iIAotICAgICAgICBkZWZhdWx0LXZhbHVlPSJjb250YWluZXIiPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBUaGUgY29tcG9uZW50IHdoZXJlIEJsb2NrIGFuZCBtZXNzYWdlcyBhcmUgcHVsbGVkIGZyb20gd2hlbiB1c2luZyBzb3VyY2UvY29sdW1ucy4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICA8L3BhcmFtZXRlcj4KLSAgICAKLSAgICA8cGFyYW1ldGVyIG5hbWU9ImVsZW1lbnQiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciIHJlcXVpcmVkPSJubyIgZGVmYXVsdC12YWx1ZT0iJ3RhYmxlJyI+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIFRoZSB0YWcgd2l0aCB3aGljaCB0aGUgY29tcG9uZW50IHdpbGwgYmUgaW5zZXJ0ZWQgaW4gdGhlIGdlbmVyYXRlZCBjb250ZW50LgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgIDwvcGFyYW1ldGVyPgotICAgIAotICAgIDxwcm9wZXJ0eS1zcGVjaWZpY2F0aW9uIG5hbWU9InNlc3Npb25TdGF0ZSIgdHlwZT0iamF2YS5pby5TZXJpYWxpemFibGUiIHBlcnNpc3RlbnQ9InllcyIvPgotICAgIAotICAgIDxjb21wb25lbnQgaWQ9InRhYmxlIiB0eXBlPSJBbnkiIGluaGVyaXQtaW5mb3JtYWwtcGFyYW1ldGVycz0ieWVzIj4KLSAgICAgICAgPGluaGVyaXRlZC1iaW5kaW5nIG5hbWU9ImVsZW1lbnQiIHBhcmFtZXRlci1uYW1lPSJlbGVtZW50Ii8+Ci0gICAgPC9jb21wb25lbnQ+Ci0gICAgCi0gICAgPGNvbXBvbmVudCBpZD0iaW5zZXJ0V3JhcHBlZCIgdHlwZT0iUmVuZGVyQm9keSIvPgotICAgIAotPC9jb21wb25lbnQtc3BlY2lmaWNhdGlvbj4KZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90YWJsZS9jb21wb25lbnRzL1RhYmxlVmlld1Nlc3Npb25TdGF0ZU1hbmFnZXIuamF2YSBiL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90YWJsZS9jb21wb25lbnRzL1RhYmxlVmlld1Nlc3Npb25TdGF0ZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU0ZWMyYy4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdGFibGUvY29tcG9uZW50cy9UYWJsZVZpZXdTZXNzaW9uU3RhdGVNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLmNvbXBvbmVudHM7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5tb2RlbC5JVGFibGVNb2RlbDsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuSVRhYmxlU2Vzc2lvblN0YXRlTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuc2ltcGxlLlNpbXBsZVRhYmxlU3RhdGU7Ci0KLS8qKgotICogIEFjdHMgbGlrZSB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsLmNvbW1vbi5GdWxsVGFibGVTZXNzaW9uU3RhdGVNYW5hZ2VyfSAKLSAqICBpZiB0aGUgbW9kZWwgaXMgcHJvdmlkZWQgdmlhIHRoZSB0YWJsZU1vZGVsIHBhcmFtZXRlcjsgCi0gKiAgc2F2ZXMgb25seSB0aGUgbW9kZWwgc3RhdGUgb3RoZXJ3aXNlLiAKLSAqIAotICogIEBhdXRob3IgbWluZGJyaWRnZQotICogIEB2ZXJzaW9uICRJZCQKLSAqLwotcHVibGljIGNsYXNzIFRhYmxlVmlld1Nlc3Npb25TdGF0ZU1hbmFnZXIgaW1wbGVtZW50cyBJVGFibGVTZXNzaW9uU3RhdGVNYW5hZ2VyCi17Ci0gICAgcHJpdmF0ZSBUYWJsZVZpZXcgbV9vYmpWaWV3OwotCi0gICAgcHVibGljIFRhYmxlVmlld1Nlc3Npb25TdGF0ZU1hbmFnZXIoVGFibGVWaWV3IG9ialZpZXcpCi0gICAgewotICAgICAgICBtX29ialZpZXcgPSBvYmpWaWV3OwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5tb2RlbC5JVGFibGVTZXNzaW9uU3RhdGVNYW5hZ2VyI2dldFNlc3Npb25TdGF0ZShvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuSVRhYmxlTW9kZWwpCi0gICAgICovCi0gICAgcHVibGljIFNlcmlhbGl6YWJsZSBnZXRTZXNzaW9uU3RhdGUoSVRhYmxlTW9kZWwgb2JqTW9kZWwpCi0gICAgewotICAgICAgICAvLyBpZiB0aGUgbW9kZWwgaXMgcHJvdmlkZWQgdXNpbmcgdGhlICd0YWJsZU1vZGVsJyBwYXJhbWV0ZXIsIAotICAgICAgICAvLyBlbXVsYXRlIEZ1bGxUYWJsZVNlc3Npb25TdGF0ZU1hbmFnZXIgYW5kIHNhdmUgZXZlcnl0aGluZwotICAgICAgICAvLyAoYmFja3dhcmQgY29tcGF0aWJpbGl0eSkKLSAgICAgICAgaWYgKG1fb2JqVmlldy5nZXRDYWNoZWRUYWJsZU1vZGVsVmFsdWUoKSAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIChTZXJpYWxpemFibGUpIG9iak1vZGVsOwotICAgICAgICAgICAgCi0gICAgICAgIC8vIG90aGVyd2lzZSBzYXZlIG9ubHkgdGhlIHN0YXRlCi0gICAgICAgIHJldHVybiBuZXcgU2ltcGxlVGFibGVTdGF0ZShvYmpNb2RlbC5nZXRQYWdpbmdTdGF0ZSgpLCBvYmpNb2RlbC5nZXRTb3J0aW5nU3RhdGUoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuSVRhYmxlU2Vzc2lvblN0YXRlTWFuYWdlciNyZWNyZWF0ZVRhYmxlTW9kZWwoamF2YS5pby5TZXJpYWxpemFibGUpCi0gICAgICovCi0gICAgcHVibGljIElUYWJsZU1vZGVsIHJlY3JlYXRlVGFibGVNb2RlbChTZXJpYWxpemFibGUgb2JqU3RhdGUpCi0gICAgewotICAgICAgICAvLyBpZiB0aGUgc3RhdGUgaW1wbGVtZW50cyBJVGFibGVNb2RlbCwgcmV0dXJuIGl0c2VsZgotICAgICAgICAvLyAoYmFja3dhcmQgY29tcGF0aWJpbGl0eSkKLSAgICAgICAgaWYgKG9ialN0YXRlIGluc3RhbmNlb2YgSVRhYmxlTW9kZWwpCi0gICAgICAgICAgICByZXR1cm4gKElUYWJsZU1vZGVsKSBvYmpTdGF0ZTsKLSAgICAgICAgICAgIAotICAgICAgICAvLyBvdGhlcndpc2UgaGF2ZSB0aGUgY29tcG9uZW50IHJlLWdlbmVyYXRlIHRoZSBtb2RlbCB1c2luZyB0aGUgcHJvdmlkZWQgc3RhdGUKLSAgICAgICAgcmV0dXJuIG1fb2JqVmlldy5nZW5lcmF0ZVRhYmxlTW9kZWwoKFNpbXBsZVRhYmxlU3RhdGUpIG9ialN0YXRlKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90YWJsZS9jb21wb25lbnRzL2luc2VydGVkL1NpbXBsZVRhYmxlQ29sdW1uQ29tcG9uZW50Lmh0bWwgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdGFibGUvY29tcG9uZW50cy9pbnNlcnRlZC9TaW1wbGVUYWJsZUNvbHVtbkNvbXBvbmVudC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGNiNzE4Li4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90YWJsZS9jb21wb25lbnRzL2luc2VydGVkL1NpbXBsZVRhYmxlQ29sdW1uQ29tcG9uZW50Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi08IS0tICRJZCQgLS0+Ci0KLTxzcGFuIGp3Y2lkPSIkY29udGVudCQiPgotCi08c3BhbiBqd2NpZD0iY29uZFNvcnRlZCI+Ci0JPHRhYmxlIGJvcmRlcj0wIGNlbGxzcGFjaW5nPTAgY2VsbHBhZGRpbmc9MCBhbGlnbj0iY2VudGVyIj4KLQk8dHI+Ci0JPHRkPjxhIGp3Y2lkPSJsaW5rQ29sdW1uIj48c3BhbiBqd2NpZD0iaW5zZXJ0U29ydGVkQ29sdW1uIi8+PC9hPjwvdGQ+Ci0JPHNwYW4gandjaWQ9ImNvbmRTb3J0Ij48dGQ+Jm5ic3A7PHNwYW4gandjaWQ9ImltYWdlU29ydCIgYWxpZ249ImNlbnRlciIvPjwvdGQ+PC9zcGFuPgotCTwvdHI+Ci0JPC90YWJsZT4KLTwvc3Bhbj4KLQotPHNwYW4gandjaWQ9ImNvbmROb3RTb3J0ZWQiPgotCTxzcGFuIGp3Y2lkPSJpbnNlcnROb3RTb3J0ZWRDb2x1bW4iLz4KLTwvc3Bhbj4KLQotPC9zcGFuPgpkaWZmIC0tZ2l0IGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL2NvbXBvbmVudHMvaW5zZXJ0ZWQvU2ltcGxlVGFibGVDb2x1bW5Db21wb25lbnQuamF2YSBiL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90YWJsZS9jb21wb25lbnRzL2luc2VydGVkL1NpbXBsZVRhYmxlQ29sdW1uQ29tcG9uZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliODM3OTYuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL2NvbXBvbmVudHMvaW5zZXJ0ZWQvU2ltcGxlVGFibGVDb2x1bW5Db21wb25lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLmNvbXBvbmVudHMuaW5zZXJ0ZWQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LkJhc2VDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JQXNzZXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVxdWVzdEN5Y2xlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5jb21wb25lbnRzLlRhYmxlQ29sdW1uczsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuSVRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5tb2RlbC5JVGFibGVNb2RlbDsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuSVRhYmxlTW9kZWxTb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsLklUYWJsZVJlbmRlcmVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsLklUYWJsZVNvcnRpbmdTdGF0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuc2ltcGxlLlNpbXBsZVRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuZXZlbnQuUGFnZURldGFjaExpc3RlbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuZXZlbnQuUGFnZUV2ZW50OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkudXRpbC5Db21wb25lbnRBZGRyZXNzOwotCi0vKioKLSAqIEEgY29tcG9uZW50IHRoYXQgcmVuZGVycyB0aGUgZGVmYXVsdCBjb2x1bW4gaGVhZGVyLgotICogCi0gKiBJZiB0aGUgY3VycmVudCBjb2x1bW4gaXMgc29ydGFibGUsIGl0IHJlbmRlcnMgdGhlIGhlYWRlciBhcyBhIGxpbmsuCi0gKiBDbGlja2luZyBvbiB0aGUgbGluayBjYXVzZXMgdGhlIHRhYmxlIHRvIGJlIHNvcnRlZCBvbiB0aGF0IGNvbHVtbi4KLSAqIENsaWNraW5nIG9uIHRoZSBsaW5rIGFnYWluIGNhdXNlcyB0aGUgc29ydGluZyBvcmRlciB0byBiZSByZXZlcnNlZC4KLSAqIAotICogQHZlcnNpb24gJElkJAotICogQGF1dGhvciBtaW5kYnJpZGdlCi0gKi8KLXB1YmxpYyBjbGFzcyBTaW1wbGVUYWJsZUNvbHVtbkNvbXBvbmVudAotCWV4dGVuZHMgQmFzZUNvbXBvbmVudAotCWltcGxlbWVudHMgSVRhYmxlUmVuZGVyZXJMaXN0ZW5lciwgUGFnZURldGFjaExpc3RlbmVyCi17Ci0JLy8gdHJhbnNpZW50Ci0JcHJpdmF0ZSBJVGFibGVDb2x1bW4gbV9vYmpDb2x1bW47Ci0JcHJpdmF0ZSBJVGFibGVNb2RlbFNvdXJjZSBtX29iak1vZGVsU291cmNlOwotCi0JcHVibGljIFNpbXBsZVRhYmxlQ29sdW1uQ29tcG9uZW50KCkKLQl7Ci0JCWluaXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5hcGFjaGUudGFwZXN0cnkuZXZlbnQuUGFnZURldGFjaExpc3RlbmVyI3BhZ2VEZXRhY2hlZChQYWdlRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgcGFnZURldGFjaGVkKFBhZ2VFdmVudCBhcmcwKQotCXsKLQkJaW5pdCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0KCkKLQl7Ci0JCW1fb2JqQ29sdW1uID0gbnVsbDsKLQkJbV9vYmpNb2RlbFNvdXJjZSA9IG51bGw7Ci0JfQotCi0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5tb2RlbC5JVGFibGVSZW5kZXJlckxpc3RlbmVyI2luaXRpYWxpemVSZW5kZXJlcihJUmVxdWVzdEN5Y2xlLCBJVGFibGVNb2RlbFNvdXJjZSwgSVRhYmxlQ29sdW1uLCBPYmplY3QpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZVJlbmRlcmVyKAotICAgICAgICBJUmVxdWVzdEN5Y2xlIG9iakN5Y2xlLAotICAgICAgICBJVGFibGVNb2RlbFNvdXJjZSBvYmpTb3VyY2UsCi0gICAgICAgIElUYWJsZUNvbHVtbiBvYmpDb2x1bW4sCi0gICAgICAgIE9iamVjdCBvYmpSb3cpCi0gICAgewotICAgICAgICBtX29iak1vZGVsU291cmNlID0gb2JqU291cmNlOwotICAgICAgICBtX29iakNvbHVtbiA9IG9iakNvbHVtbjsKLSAgICB9Ci0KLQlwdWJsaWMgSVRhYmxlTW9kZWwgZ2V0VGFibGVNb2RlbCgpCi0JewotCQlyZXR1cm4gbV9vYmpNb2RlbFNvdXJjZS5nZXRUYWJsZU1vZGVsKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0Q29sdW1uU29ydGVkKCkKLQl7Ci0JCXJldHVybiBtX29iakNvbHVtbi5nZXRTb3J0YWJsZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheU5hbWUoKQotCXsKLSAgICAgICAgaWYgKG1fb2JqQ29sdW1uIGluc3RhbmNlb2YgU2ltcGxlVGFibGVDb2x1bW4pIHsKLSAgICAgICAgICAgIFNpbXBsZVRhYmxlQ29sdW1uIG9ialNpbXBsZUNvbHVtbiA9IChTaW1wbGVUYWJsZUNvbHVtbikgbV9vYmpDb2x1bW47Ci0gICAgCQlyZXR1cm4gb2JqU2ltcGxlQ29sdW1uLmdldERpc3BsYXlOYW1lKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1fb2JqQ29sdW1uLmdldENvbHVtbk5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRJc1NvcnRlZCgpCi0JewotCQlJVGFibGVTb3J0aW5nU3RhdGUgb2JqU29ydGluZ1N0YXRlID0gZ2V0VGFibGVNb2RlbCgpLmdldFNvcnRpbmdTdGF0ZSgpOwotCQlTdHJpbmcgc3RyU29ydENvbHVtbiA9IG9ialNvcnRpbmdTdGF0ZS5nZXRTb3J0Q29sdW1uKCk7Ci0JCXJldHVybiBtX29iakNvbHVtbi5nZXRDb2x1bW5OYW1lKCkuZXF1YWxzKHN0clNvcnRDb2x1bW4pOwotCX0KLQotCXB1YmxpYyBJQXNzZXQgZ2V0U29ydEltYWdlKCkKLQl7Ci0JCUlBc3NldCBvYmpJbWFnZUFzc2V0OwotCi0JCUlSZXF1ZXN0Q3ljbGUgb2JqQ3ljbGUgPSBnZXRQYWdlKCkuZ2V0UmVxdWVzdEN5Y2xlKCk7Ci0JCUlUYWJsZVNvcnRpbmdTdGF0ZSBvYmpTb3J0aW5nU3RhdGUgPSBnZXRUYWJsZU1vZGVsKCkuZ2V0U29ydGluZ1N0YXRlKCk7Ci0JCWlmIChvYmpTb3J0aW5nU3RhdGUuZ2V0U29ydE9yZGVyKCkKLQkJCT09IElUYWJsZVNvcnRpbmdTdGF0ZS5TT1JUX0FTQ0VORElORykKLQkJewotCQkJb2JqSW1hZ2VBc3NldCA9Ci0JCQkJKElBc3NldCkgb2JqQ3ljbGUuZ2V0QXR0cmlidXRlKAotCQkJCQlUYWJsZUNvbHVtbnMuVEFCTEVfQ09MVU1OX0FSUk9XX1VQX0FUVFJJQlVURSk7Ci0JCQlpZiAob2JqSW1hZ2VBc3NldCA9PSBudWxsKQotCQkJCW9iakltYWdlQXNzZXQgPSBnZXRBc3NldCgic29ydFVwIik7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlvYmpJbWFnZUFzc2V0ID0KLQkJCQkoSUFzc2V0KSBvYmpDeWNsZS5nZXRBdHRyaWJ1dGUoCi0JCQkJCVRhYmxlQ29sdW1ucy5UQUJMRV9DT0xVTU5fQVJST1dfRE9XTl9BVFRSSUJVVEUpOwotCQkJaWYgKG9iakltYWdlQXNzZXQgPT0gbnVsbCkKLQkJCQlvYmpJbWFnZUFzc2V0ID0gZ2V0QXNzZXQoInNvcnREb3duIik7Ci0JCX0KLQotCQlyZXR1cm4gb2JqSW1hZ2VBc3NldDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0W10gZ2V0Q29sdW1uU2VsZWN0ZWRQYXJhbWV0ZXJzKCkKLQl7Ci0JCXJldHVybiBuZXcgT2JqZWN0W10gewotCQkJbmV3IENvbXBvbmVudEFkZHJlc3MobV9vYmpNb2RlbFNvdXJjZSksCi0JCQltX29iakNvbHVtbi5nZXRDb2x1bW5OYW1lKCl9OwotCX0KLQotCXB1YmxpYyB2b2lkIGNvbHVtblNlbGVjdGVkKElSZXF1ZXN0Q3ljbGUgb2JqQ3ljbGUpCi0JewotCQlPYmplY3RbXSBhcnJBcmdzID0gb2JqQ3ljbGUuZ2V0U2VydmljZVBhcmFtZXRlcnMoKTsKLQkJQ29tcG9uZW50QWRkcmVzcyBvYmpBZGRyID0gKENvbXBvbmVudEFkZHJlc3MpIGFyckFyZ3NbMF07Ci0JCVN0cmluZyBzdHJDb2x1bW5OYW1lID0gKFN0cmluZykgYXJyQXJnc1sxXTsKLQotCQlJVGFibGVNb2RlbFNvdXJjZSBvYmpTb3VyY2UgPQotCQkJKElUYWJsZU1vZGVsU291cmNlKSBvYmpBZGRyLmZpbmRDb21wb25lbnQob2JqQ3ljbGUpOwotCQlJVGFibGVNb2RlbCBvYmpNb2RlbCA9IG9ialNvdXJjZS5nZXRUYWJsZU1vZGVsKCk7Ci0KLQkJSVRhYmxlU29ydGluZ1N0YXRlIG9ialN0YXRlID0gb2JqTW9kZWwuZ2V0U29ydGluZ1N0YXRlKCk7Ci0JCWlmIChzdHJDb2x1bW5OYW1lLmVxdWFscyhvYmpTdGF0ZS5nZXRTb3J0Q29sdW1uKCkpKQotCQkJb2JqU3RhdGUuc2V0U29ydENvbHVtbihzdHJDb2x1bW5OYW1lLCAhb2JqU3RhdGUuZ2V0U29ydE9yZGVyKCkpOwotCQllbHNlCi0JCQlvYmpTdGF0ZS5zZXRTb3J0Q29sdW1uKAotCQkJCXN0ckNvbHVtbk5hbWUsCi0JCQkJSVRhYmxlU29ydGluZ1N0YXRlLlNPUlRfQVNDRU5ESU5HKTsKLQotCQkvLyBlbnN1cmUgdGhhdCB0aGUgY2hhbmdlIGlzIHNhdmVkCi0JCW9ialNvdXJjZS5maXJlT2JzZXJ2ZWRTdGF0ZUNoYW5nZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL2NvbXBvbmVudHMvaW5zZXJ0ZWQvU2ltcGxlVGFibGVDb2x1bW5Db21wb25lbnQuandjIGIvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL2NvbXBvbmVudHMvaW5zZXJ0ZWQvU2ltcGxlVGFibGVDb2x1bW5Db21wb25lbnQuandjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzA2NWJjLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90YWJsZS9jb21wb25lbnRzL2luc2VydGVkL1NpbXBsZVRhYmxlQ29sdW1uQ29tcG9uZW50Lmp3YworKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAgCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPCEtLSAgJElkJCAtLT4KLTwhRE9DVFlQRSBjb21wb25lbnQtc3BlY2lmaWNhdGlvbiBQVUJMSUMgCi0gICItLy9BcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi8vVGFwZXN0cnkgU3BlY2lmaWNhdGlvbiAzLjAvL0VOIiAKLSAgImh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvdGFwZXN0cnkvZHRkL1RhcGVzdHJ5XzNfMC5kdGQiPgotCQotPGNvbXBvbmVudC1zcGVjaWZpY2F0aW9uIGNsYXNzPSJvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUuY29tcG9uZW50cy5pbnNlcnRlZC5TaW1wbGVUYWJsZUNvbHVtbkNvbXBvbmVudCIgCi0JYWxsb3ctaW5mb3JtYWwtcGFyYW1ldGVycz0ieWVzIj4KLQkKLQk8ZGVzY3JpcHRpb24+Ci0JPC9kZXNjcmlwdGlvbj4KLQkKLQk8Y29tcG9uZW50IGlkPSJjb25kU29ydGVkIiB0eXBlPSJDb25kaXRpb25hbCI+Ci0JCTxiaW5kaW5nIG5hbWU9ImNvbmRpdGlvbiIgZXhwcmVzc2lvbj0iY29sdW1uU29ydGVkIi8+Ci0JPC9jb21wb25lbnQ+Ci0JCi0JPGNvbXBvbmVudCBpZD0iY29uZE5vdFNvcnRlZCIgdHlwZT0iQ29uZGl0aW9uYWwiPgotCQk8YmluZGluZyBuYW1lPSJjb25kaXRpb24iIGV4cHJlc3Npb249ImNvbHVtblNvcnRlZCIvPgotCQk8c3RhdGljLWJpbmRpbmcgbmFtZT0iaW52ZXJ0Ij50cnVlPC9zdGF0aWMtYmluZGluZz4KLQk8L2NvbXBvbmVudD4KLQkKLQk8Y29tcG9uZW50IGlkPSJpbnNlcnRTb3J0ZWRDb2x1bW4iIHR5cGU9Ikluc2VydCI+Ci0JCTxiaW5kaW5nIG5hbWU9InZhbHVlIiBleHByZXNzaW9uPSJkaXNwbGF5TmFtZSIvPgotCTwvY29tcG9uZW50PgotCQotCTxjb21wb25lbnQgaWQ9Imluc2VydE5vdFNvcnRlZENvbHVtbiIgdHlwZT0iSW5zZXJ0Ij4KLQkJPGJpbmRpbmcgbmFtZT0idmFsdWUiIGV4cHJlc3Npb249ImRpc3BsYXlOYW1lIi8+Ci0JPC9jb21wb25lbnQ+Ci0JCi0JPGNvbXBvbmVudCBpZD0ibGlua0NvbHVtbiIgdHlwZT0iRGlyZWN0TGluayI+Ci0JCTxiaW5kaW5nIG5hbWU9Imxpc3RlbmVyIiBleHByZXNzaW9uPSJsaXN0ZW5lcnMuY29sdW1uU2VsZWN0ZWQiLz4KLQkJPGJpbmRpbmcgbmFtZT0icGFyYW1ldGVycyIgZXhwcmVzc2lvbj0iY29sdW1uU2VsZWN0ZWRQYXJhbWV0ZXJzIi8+Ci0JPC9jb21wb25lbnQ+Ci0JCi0JPGNvbXBvbmVudCBpZD0iaW1hZ2VTb3J0IiB0eXBlPSJJbWFnZSI+Ci0JCTxiaW5kaW5nIG5hbWU9ImltYWdlIiBleHByZXNzaW9uPSJzb3J0SW1hZ2UiLz4KLQk8L2NvbXBvbmVudD4KLQkKLQk8Y29tcG9uZW50IGlkPSJjb25kU29ydCIgdHlwZT0iQ29uZGl0aW9uYWwiPgotCQk8YmluZGluZyBuYW1lPSJjb25kaXRpb24iIGV4cHJlc3Npb249ImlzU29ydGVkIi8+Ci0JPC9jb21wb25lbnQ+Ci0JCi0gICAgPHByaXZhdGUtYXNzZXQgbmFtZT0ic29ydERvd24iIHJlc291cmNlLXBhdGg9ImFycm93LWRvd24uZ2lmIi8+Ci0gICAgPHByaXZhdGUtYXNzZXQgbmFtZT0ic29ydFVwIiByZXNvdXJjZS1wYXRoPSJhcnJvdy11cC5naWYiLz4KLTwvY29tcG9uZW50LXNwZWNpZmljYXRpb24+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL2NvbXBvbmVudHMvaW5zZXJ0ZWQvU2ltcGxlVGFibGVDb2x1bW5Gb3JtQ29tcG9uZW50Lmh0bWwgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdGFibGUvY29tcG9uZW50cy9pbnNlcnRlZC9TaW1wbGVUYWJsZUNvbHVtbkZvcm1Db21wb25lbnQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRjYjcxOC4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdGFibGUvY29tcG9uZW50cy9pbnNlcnRlZC9TaW1wbGVUYWJsZUNvbHVtbkZvcm1Db21wb25lbnQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLTwhLS0gJElkJCAtLT4KLQotPHNwYW4gandjaWQ9IiRjb250ZW50JCI+Ci0KLTxzcGFuIGp3Y2lkPSJjb25kU29ydGVkIj4KLQk8dGFibGUgYm9yZGVyPTAgY2VsbHNwYWNpbmc9MCBjZWxscGFkZGluZz0wIGFsaWduPSJjZW50ZXIiPgotCTx0cj4KLQk8dGQ+PGEgandjaWQ9ImxpbmtDb2x1bW4iPjxzcGFuIGp3Y2lkPSJpbnNlcnRTb3J0ZWRDb2x1bW4iLz48L2E+PC90ZD4KLQk8c3BhbiBqd2NpZD0iY29uZFNvcnQiPjx0ZD4mbmJzcDs8c3BhbiBqd2NpZD0iaW1hZ2VTb3J0IiBhbGlnbj0iY2VudGVyIi8+PC90ZD48L3NwYW4+Ci0JPC90cj4KLQk8L3RhYmxlPgotPC9zcGFuPgotCi08c3BhbiBqd2NpZD0iY29uZE5vdFNvcnRlZCI+Ci0JPHNwYW4gandjaWQ9Imluc2VydE5vdFNvcnRlZENvbHVtbiIvPgotPC9zcGFuPgotCi08L3NwYW4+CmRpZmYgLS1naXQgYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdGFibGUvY29tcG9uZW50cy9pbnNlcnRlZC9TaW1wbGVUYWJsZUNvbHVtbkZvcm1Db21wb25lbnQuamF2YSBiL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90YWJsZS9jb21wb25lbnRzL2luc2VydGVkL1NpbXBsZVRhYmxlQ29sdW1uRm9ybUNvbXBvbmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmQ5Nzk1Li4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90YWJsZS9jb21wb25lbnRzL2luc2VydGVkL1NpbXBsZVRhYmxlQ29sdW1uRm9ybUNvbXBvbmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUuY29tcG9uZW50cy5pbnNlcnRlZDsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuQmFzZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklBc3NldDsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZXF1ZXN0Q3ljbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLmNvbXBvbmVudHMuVGFibGVDb2x1bW5zOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5tb2RlbC5JVGFibGVDb2x1bW47Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsLklUYWJsZU1vZGVsOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5tb2RlbC5JVGFibGVNb2RlbFNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuSVRhYmxlUmVuZGVyZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuSVRhYmxlU29ydGluZ1N0YXRlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5tb2RlbC5zaW1wbGUuU2ltcGxlVGFibGVDb2x1bW47Ci0KLS8qKgotICogQSBjb21wb25lbnQgdGhhdCByZW5kZXJzIHRoZSBkZWZhdWx0IGNvbHVtbiBoZWFkZXIgaW4gYSBmb3JtLgotICogCi0gKiBJZiB0aGUgY3VycmVudCBjb2x1bW4gaXMgc29ydGFibGUsIGl0IHJlbmRlcnMgdGhlIGhlYWRlciBhcyBhIGxpbmsuCi0gKiBDbGlja2luZyBvbiB0aGUgbGluayBjYXVzZXMgdGhlIHRhYmxlIHRvIGJlIHNvcnRlZCBvbiB0aGF0IGNvbHVtbi4KLSAqIENsaWNraW5nIG9uIHRoZSBsaW5rIGFnYWluIGNhdXNlcyB0aGUgc29ydGluZyBvcmRlciB0byBiZSByZXZlcnNlZC4KLSAqIAotICogVGhpcyBjb21wb25lbnQgcmVuZGVycyBsaW5rcyB0aGF0IGNhdXNlIHRoZSBmb3JtIHRvIGJlIHN1Ym1pdHRlZC4gCi0gKiBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgdXBkYXRlZCBkYXRhIGluIHRoZSBvdGhlciBmb3JtIGZpZWxkcyBpcyBwcmVzZXJ2ZWQuIAotICogCi0gKiBAdmVyc2lvbiAkSWQkCi0gKiBAYXV0aG9yIG1pbmRicmlkZ2UKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFNpbXBsZVRhYmxlQ29sdW1uRm9ybUNvbXBvbmVudAotCWV4dGVuZHMgQmFzZUNvbXBvbmVudAotCWltcGxlbWVudHMgSVRhYmxlUmVuZGVyZXJMaXN0ZW5lcgotewotCi0gICAgcHVibGljIGFic3RyYWN0IElUYWJsZUNvbHVtbiBnZXRUYWJsZUNvbHVtbigpOwotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFRhYmxlQ29sdW1uKElUYWJsZUNvbHVtbiBvYmpDb2x1bW4pOwotCi0gICAgcHVibGljIGFic3RyYWN0IElUYWJsZU1vZGVsU291cmNlIGdldFRhYmxlTW9kZWxTb3VyY2UoKTsKLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRUYWJsZU1vZGVsU291cmNlKElUYWJsZU1vZGVsU291cmNlIG9ialNvdXJjZSk7Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFNlbGVjdGVkQ29sdW1uTmFtZSgpOwotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuSVRhYmxlUmVuZGVyZXJMaXN0ZW5lciNpbml0aWFsaXplUmVuZGVyZXIoSVJlcXVlc3RDeWNsZSwgSVRhYmxlTW9kZWxTb3VyY2UsIElUYWJsZUNvbHVtbiwgT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemVSZW5kZXJlcigKLSAgICAgICAgSVJlcXVlc3RDeWNsZSBvYmpDeWNsZSwKLSAgICAgICAgSVRhYmxlTW9kZWxTb3VyY2Ugb2JqU291cmNlLAotICAgICAgICBJVGFibGVDb2x1bW4gb2JqQ29sdW1uLAotICAgICAgICBPYmplY3Qgb2JqUm93KQotICAgIHsKLSAgICAgICAgc2V0VGFibGVNb2RlbFNvdXJjZShvYmpTb3VyY2UpOwotICAgICAgICBzZXRUYWJsZUNvbHVtbihvYmpDb2x1bW4pOwotICAgIH0KLQotCXB1YmxpYyBJVGFibGVNb2RlbCBnZXRUYWJsZU1vZGVsKCkKLQl7Ci0JCXJldHVybiBnZXRUYWJsZU1vZGVsU291cmNlKCkuZ2V0VGFibGVNb2RlbCgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldENvbHVtblNvcnRlZCgpCi0JewotCQlyZXR1cm4gZ2V0VGFibGVDb2x1bW4oKS5nZXRTb3J0YWJsZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheU5hbWUoKQotCXsKLSAgICAgICAgSVRhYmxlQ29sdW1uIG9iakNvbHVtbiA9IGdldFRhYmxlQ29sdW1uKCk7Ci0gICAgICAgIAotICAgICAgICBpZiAob2JqQ29sdW1uIGluc3RhbmNlb2YgU2ltcGxlVGFibGVDb2x1bW4pIHsKLSAgICAgICAgICAgIFNpbXBsZVRhYmxlQ29sdW1uIG9ialNpbXBsZUNvbHVtbiA9IChTaW1wbGVUYWJsZUNvbHVtbikgb2JqQ29sdW1uOwotICAgIAkJcmV0dXJuIG9ialNpbXBsZUNvbHVtbi5nZXREaXNwbGF5TmFtZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBvYmpDb2x1bW4uZ2V0Q29sdW1uTmFtZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldElzU29ydGVkKCkKLQl7Ci0JCUlUYWJsZVNvcnRpbmdTdGF0ZSBvYmpTb3J0aW5nU3RhdGUgPSBnZXRUYWJsZU1vZGVsKCkuZ2V0U29ydGluZ1N0YXRlKCk7Ci0JCVN0cmluZyBzdHJTb3J0Q29sdW1uID0gb2JqU29ydGluZ1N0YXRlLmdldFNvcnRDb2x1bW4oKTsKLQkJcmV0dXJuIGdldFRhYmxlQ29sdW1uKCkuZ2V0Q29sdW1uTmFtZSgpLmVxdWFscyhzdHJTb3J0Q29sdW1uKTsKLQl9Ci0KLQlwdWJsaWMgSUFzc2V0IGdldFNvcnRJbWFnZSgpCi0JewotCQlJQXNzZXQgb2JqSW1hZ2VBc3NldDsKLQotCQlJUmVxdWVzdEN5Y2xlIG9iakN5Y2xlID0gZ2V0UGFnZSgpLmdldFJlcXVlc3RDeWNsZSgpOwotCQlJVGFibGVTb3J0aW5nU3RhdGUgb2JqU29ydGluZ1N0YXRlID0gZ2V0VGFibGVNb2RlbCgpLmdldFNvcnRpbmdTdGF0ZSgpOwotCQlpZiAob2JqU29ydGluZ1N0YXRlLmdldFNvcnRPcmRlcigpCi0JCQk9PSBJVGFibGVTb3J0aW5nU3RhdGUuU09SVF9BU0NFTkRJTkcpCi0JCXsKLQkJCW9iakltYWdlQXNzZXQgPQotCQkJCShJQXNzZXQpIG9iakN5Y2xlLmdldEF0dHJpYnV0ZSgKLQkJCQkJVGFibGVDb2x1bW5zLlRBQkxFX0NPTFVNTl9BUlJPV19VUF9BVFRSSUJVVEUpOwotCQkJaWYgKG9iakltYWdlQXNzZXQgPT0gbnVsbCkKLQkJCQlvYmpJbWFnZUFzc2V0ID0gZ2V0QXNzZXQoInNvcnRVcCIpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJb2JqSW1hZ2VBc3NldCA9Ci0JCQkJKElBc3NldCkgb2JqQ3ljbGUuZ2V0QXR0cmlidXRlKAotCQkJCQlUYWJsZUNvbHVtbnMuVEFCTEVfQ09MVU1OX0FSUk9XX0RPV05fQVRUUklCVVRFKTsKLQkJCWlmIChvYmpJbWFnZUFzc2V0ID09IG51bGwpCi0JCQkJb2JqSW1hZ2VBc3NldCA9IGdldEFzc2V0KCJzb3J0RG93biIpOwotCQl9Ci0KLQkJcmV0dXJuIG9iakltYWdlQXNzZXQ7Ci0JfQotCi0JcHVibGljIHZvaWQgY29sdW1uU2VsZWN0ZWQoSVJlcXVlc3RDeWNsZSBvYmpDeWNsZSkKLQl7Ci0gICAgICAgIFN0cmluZyBzdHJDb2x1bW5OYW1lID0gZ2V0U2VsZWN0ZWRDb2x1bW5OYW1lKCk7Ci0JCUlUYWJsZVNvcnRpbmdTdGF0ZSBvYmpTdGF0ZSA9IGdldFRhYmxlTW9kZWwoKS5nZXRTb3J0aW5nU3RhdGUoKTsKLQkJaWYgKHN0ckNvbHVtbk5hbWUuZXF1YWxzKG9ialN0YXRlLmdldFNvcnRDb2x1bW4oKSkpCi0JCQlvYmpTdGF0ZS5zZXRTb3J0Q29sdW1uKHN0ckNvbHVtbk5hbWUsICFvYmpTdGF0ZS5nZXRTb3J0T3JkZXIoKSk7Ci0JCWVsc2UKLQkJCW9ialN0YXRlLnNldFNvcnRDb2x1bW4oCi0JCQkJc3RyQ29sdW1uTmFtZSwKLQkJCQlJVGFibGVTb3J0aW5nU3RhdGUuU09SVF9BU0NFTkRJTkcpOwotCi0JCS8vIGVuc3VyZSB0aGF0IHRoZSBjaGFuZ2UgaXMgc2F2ZWQKLQkJZ2V0VGFibGVNb2RlbFNvdXJjZSgpLmZpcmVPYnNlcnZlZFN0YXRlQ2hhbmdlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdGFibGUvY29tcG9uZW50cy9pbnNlcnRlZC9TaW1wbGVUYWJsZUNvbHVtbkZvcm1Db21wb25lbnQuandjIGIvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL2NvbXBvbmVudHMvaW5zZXJ0ZWQvU2ltcGxlVGFibGVDb2x1bW5Gb3JtQ29tcG9uZW50Lmp3YwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2YzNjU0MS4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdGFibGUvY29tcG9uZW50cy9pbnNlcnRlZC9TaW1wbGVUYWJsZUNvbHVtbkZvcm1Db21wb25lbnQuandjCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICAKLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08IS0tICAkSWQkIC0tPgotPCFET0NUWVBFIGNvbXBvbmVudC1zcGVjaWZpY2F0aW9uIFBVQkxJQyAKLSAgIi0vL0FwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLy9UYXBlc3RyeSBTcGVjaWZpY2F0aW9uIDMuMC8vRU4iIAotICAiaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy90YXBlc3RyeS9kdGQvVGFwZXN0cnlfM18wLmR0ZCI+Ci0JCi08Y29tcG9uZW50LXNwZWNpZmljYXRpb24gY2xhc3M9Im9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5jb21wb25lbnRzLmluc2VydGVkLlNpbXBsZVRhYmxlQ29sdW1uRm9ybUNvbXBvbmVudCIgCi0JYWxsb3ctaW5mb3JtYWwtcGFyYW1ldGVycz0ieWVzIj4KLQkKLQk8ZGVzY3JpcHRpb24+Ci0JPC9kZXNjcmlwdGlvbj4KLQkKLQk8cHJvcGVydHktc3BlY2lmaWNhdGlvbiBuYW1lPSJ0YWJsZU1vZGVsU291cmNlIiAKLQkJdHlwZT0ib3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsLklUYWJsZU1vZGVsU291cmNlIgotCQlpbml0aWFsLXZhbHVlPSJudWxsIi8+Ci0JCi0JPHByb3BlcnR5LXNwZWNpZmljYXRpb24gbmFtZT0idGFibGVDb2x1bW4iIAotCQl0eXBlPSJvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuSVRhYmxlQ29sdW1uIgotCQlpbml0aWFsLXZhbHVlPSJudWxsIi8+Ci0JCi0JPHByb3BlcnR5LXNwZWNpZmljYXRpb24gbmFtZT0ic2VsZWN0ZWRDb2x1bW5OYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+Ci0JCi0JPGNvbXBvbmVudCBpZD0iY29uZFNvcnRlZCIgdHlwZT0iRm9ybUNvbmRpdGlvbmFsIj4KLQkJPGJpbmRpbmcgbmFtZT0iY29uZGl0aW9uIiBleHByZXNzaW9uPSJjb2x1bW5Tb3J0ZWQiLz4KLQk8L2NvbXBvbmVudD4KLQkKLQk8Y29tcG9uZW50IGlkPSJjb25kTm90U29ydGVkIiB0eXBlPSJGb3JtQ29uZGl0aW9uYWwiPgotCQk8YmluZGluZyBuYW1lPSJjb25kaXRpb24iIGV4cHJlc3Npb249IiFjb2x1bW5Tb3J0ZWQiLz4KLQk8L2NvbXBvbmVudD4KLQkKLQk8Y29tcG9uZW50IGlkPSJpbnNlcnRTb3J0ZWRDb2x1bW4iIHR5cGU9Ikluc2VydCI+Ci0JCTxiaW5kaW5nIG5hbWU9InZhbHVlIiBleHByZXNzaW9uPSJkaXNwbGF5TmFtZSIvPgotCTwvY29tcG9uZW50PgotCQotCTxjb21wb25lbnQgaWQ9Imluc2VydE5vdFNvcnRlZENvbHVtbiIgdHlwZT0iSW5zZXJ0Ij4KLQkJPGJpbmRpbmcgbmFtZT0idmFsdWUiIGV4cHJlc3Npb249ImRpc3BsYXlOYW1lIi8+Ci0JPC9jb21wb25lbnQ+Ci0JCi0JPGNvbXBvbmVudCBpZD0ibGlua0NvbHVtbiIgdHlwZT0iTGlua1N1Ym1pdCI+Ci0JCTxiaW5kaW5nIG5hbWU9Imxpc3RlbmVyIiBleHByZXNzaW9uPSJsaXN0ZW5lcnMuY29sdW1uU2VsZWN0ZWQiLz4KLQkJPGJpbmRpbmcgbmFtZT0idGFnIiBleHByZXNzaW9uPSJ0YWJsZUNvbHVtbi5jb2x1bW5OYW1lIi8+Ci0JCTxiaW5kaW5nIG5hbWU9InNlbGVjdGVkIiBleHByZXNzaW9uPSJzZWxlY3RlZENvbHVtbk5hbWUiLz4KLQk8L2NvbXBvbmVudD4KLQkKLQk8Y29tcG9uZW50IGlkPSJpbWFnZVNvcnQiIHR5cGU9IkltYWdlIj4KLQkJPGJpbmRpbmcgbmFtZT0iaW1hZ2UiIGV4cHJlc3Npb249InNvcnRJbWFnZSIvPgotCTwvY29tcG9uZW50PgotCQotCTxjb21wb25lbnQgaWQ9ImNvbmRTb3J0IiB0eXBlPSJGb3JtQ29uZGl0aW9uYWwiPgotCQk8YmluZGluZyBuYW1lPSJjb25kaXRpb24iIGV4cHJlc3Npb249ImlzU29ydGVkIi8+Ci0JPC9jb21wb25lbnQ+Ci0JCi0gICAgPHByaXZhdGUtYXNzZXQgbmFtZT0ic29ydERvd24iIHJlc291cmNlLXBhdGg9ImFycm93LWRvd24uZ2lmIi8+Ci0gICAgPHByaXZhdGUtYXNzZXQgbmFtZT0ic29ydFVwIiByZXNvdXJjZS1wYXRoPSJhcnJvdy11cC5naWYiLz4KLSAgICAKLTwvY29tcG9uZW50LXNwZWNpZmljYXRpb24+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL2NvbXBvbmVudHMvaW5zZXJ0ZWQvU2ltcGxlVGFibGVDb2x1bW5QYWdlLmh0bWwgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdGFibGUvY29tcG9uZW50cy9pbnNlcnRlZC9TaW1wbGVUYWJsZUNvbHVtblBhZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFkNzBkZS4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdGFibGUvY29tcG9uZW50cy9pbnNlcnRlZC9TaW1wbGVUYWJsZUNvbHVtblBhZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotPCEtLSAkSWQkIC0tPgotCi08c3BhbiBqd2NpZD0iJGNvbnRlbnQkIj4KLQotCTxzcGFuIGp3Y2lkPSJ0YWJsZUNvbHVtbkNvbXBvbmVudCIvPgotCTxzcGFuIGp3Y2lkPSJ0YWJsZUNvbHVtbkZvcm1Db21wb25lbnQiLz4KLQotPC9zcGFuPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90YWJsZS9jb21wb25lbnRzL2luc2VydGVkL1NpbXBsZVRhYmxlQ29sdW1uUGFnZS5wYWdlIGIvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL2NvbXBvbmVudHMvaW5zZXJ0ZWQvU2ltcGxlVGFibGVDb2x1bW5QYWdlLnBhZ2UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4NDc3MmQuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL2NvbXBvbmVudHMvaW5zZXJ0ZWQvU2ltcGxlVGFibGVDb2x1bW5QYWdlLnBhZ2UKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICAKLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08IS0tICRJZCQgLS0+Ci08IURPQ1RZUEUgcGFnZS1zcGVjaWZpY2F0aW9uIFBVQkxJQyAKLSAgIi0vL0FwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLy9UYXBlc3RyeSBTcGVjaWZpY2F0aW9uIDMuMC8vRU4iIAotICAiaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy90YXBlc3RyeS9kdGQvVGFwZXN0cnlfM18wLmR0ZCI+Ci0KLTxwYWdlLXNwZWNpZmljYXRpb24+Ci0KLQk8Y29tcG9uZW50IGlkPSJ0YWJsZUNvbHVtbkNvbXBvbmVudCIgdHlwZT0iU2ltcGxlVGFibGVDb2x1bW5Db21wb25lbnQiLz4KLQk8Y29tcG9uZW50IGlkPSJ0YWJsZUNvbHVtbkZvcm1Db21wb25lbnQiIHR5cGU9IlNpbXBsZVRhYmxlQ29sdW1uRm9ybUNvbXBvbmVudCIvPgotCi08L3BhZ2Utc3BlY2lmaWNhdGlvbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdGFibGUvY29tcG9uZW50cy9pbnNlcnRlZC9hcnJvdy1kb3duLmdpZiBiL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90YWJsZS9jb21wb25lbnRzL2luc2VydGVkL2Fycm93LWRvd24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTMzOWE2Li4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90YWJsZS9jb21wb25lbnRzL2luc2VydGVkL2Fycm93LWRvd24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL2NvbXBvbmVudHMvaW5zZXJ0ZWQvYXJyb3ctdXAuZ2lmIGIvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL2NvbXBvbmVudHMvaW5zZXJ0ZWQvYXJyb3ctdXAuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzBhNDc5Li4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90YWJsZS9jb21wb25lbnRzL2luc2VydGVkL2Fycm93LXVwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90YWJsZS9tb2RlbC9DVGFibGVEYXRhTW9kZWxFdmVudC5qYXZhIGIvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL21vZGVsL0NUYWJsZURhdGFNb2RlbEV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0MDI2ODcuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL21vZGVsL0NUYWJsZURhdGFNb2RlbEV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsOwotCi0vKioKLSAqIEBhdXRob3IgbWluZGJyaWRnZQotICoKLSAqLwotcHVibGljIGNsYXNzIENUYWJsZURhdGFNb2RlbEV2ZW50Ci17Ci0gICAgcHVibGljIENUYWJsZURhdGFNb2RlbEV2ZW50KCkgewotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90YWJsZS9tb2RlbC9JQmFzaWNUYWJsZU1vZGVsLmphdmEgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdGFibGUvbW9kZWwvSUJhc2ljVGFibGVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTFhYzMwLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90YWJsZS9tb2RlbC9JQmFzaWNUYWJsZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi0vKioKLSAqIEEgc2ltcGxpZmllZCB2ZXJzaW9uIG9mIHRoZSB0YWJsZSBtb2RlbCB0aGF0IGNvbmNlcm5zIGl0c2VsZiBvbmx5IHdpdGgKLSAqIHByb3ZpZGluZyB0aGUgZGF0YSBvbiB0aGUgY3VycmVudCBwYWdlLiAKLSAqIAotICogQHZlcnNpb24gJElkJAotICogQGF1dGhvciBtaW5kYnJpZGdlCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUJhc2ljVGFibGVNb2RlbAotewotICAgIC8qKgotICAgICAqICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYWxsIHJlY29yZHMKLSAgICAgKiAgQHJldHVybiB0aGUgbnVtYmVyIG9mIGFsbCByb3dzCi0gICAgICoqLwotICAgIGludCBnZXRSb3dDb3VudCgpOwotCi0gICAgLyoqIAotICAgICAqICBSZXR1cm5zIHRoZSByb3dzIG9uIHRoZSBjdXJyZW50IHBhZ2UuCi0gICAgICogIEBwYXJhbSBuRmlyc3QgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBpdGVtIHRvIGJlIGRpc3BheWVkCi0gICAgICogIEBwYXJhbSBuUGFnZVNpemUgdGhlIG51bWJlciBvZiBpdGVtcyB0byBiZSBkaXNwbGF5ZWQKLSAgICAgKiAgQHBhcmFtIG9ialNvcnRDb2x1bW4gdGhlIGNvbHVtbiB0byBzb3J0IGJ5IG9yIG51bGwgaWYgdGhlcmUgaXMgbm8gc29ydGluZwotICAgICAqICBAcGFyYW0gYlNvcnRPcmRlciBkZXRlcm1pbmVzIHRoZSBzb3J0aW5nIG9yZGVyIChhc2NlbmRpbmcgb3IgZGVzY2VuZGluZykKLSAgICAgKiovCi0gICAgSXRlcmF0b3IgZ2V0Q3VycmVudFBhZ2VSb3dzKGludCBuRmlyc3QsIGludCBuUGFnZVNpemUsIElUYWJsZUNvbHVtbiBvYmpTb3J0Q29sdW1uLCBib29sZWFuIGJTb3J0T3JkZXIpOwotfQpkaWZmIC0tZ2l0IGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL21vZGVsL0lQcmltYXJ5S2V5Q29udmVydG9yLmphdmEgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdGFibGUvbW9kZWwvSVByaW1hcnlLZXlDb252ZXJ0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM2NjE3OC4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdGFibGUvbW9kZWwvSVByaW1hcnlLZXlDb252ZXJ0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWw7Ci0KLS8qKgotICogQW4gaW50ZXJmYWNlIGZvciBjb252ZXJ0aW5nIGFuIG9iamVjdCB0byBpdHMgcHJpbWFyeSBrZXkgYW5kIGJhY2suIAotICogVHlwaWNhbGx5IHVzZWQgdG8gZGV0ZXJtaW5lIGhvdyB0byBzdG9yZSBhIGdpdmVuIG9iamVjdCBhcyBhIGhpZGRlbiAKLSAqIHZhbHVlIHdoZW4gcmVuZGVyaW5nIGEgZm9ybS4KLSAqIAotICogQHZlcnNpb24gJElkJAotICogQGF1dGhvciBtYgotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQcmltYXJ5S2V5Q29udmVydG9yCi17Ci0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgc2VyaWFsaXphYmxlIHByaW1hcnkga2V5IG9mIHRoZSBnaXZlbiB2YWx1ZQotICAgICAqIAotICAgICAqIEBwYXJhbSBvYmpWYWx1ZSB0aGUgdmFsdWUgZm9yIHdoaWNoIGEgcHJpbWFyeSBrZXkgbmVlZHMgdG8gYmUgZXh0cmFjdGVkCi0gICAgICogQHJldHVybiB0aGUgc2VyaWFsaXphYmxlIHByaW1hcnkga2V5IG9mIHRoZSB2YWx1ZQotICAgICAqLwotICAgIE9iamVjdCBnZXRQcmltYXJ5S2V5KE9iamVjdCBvYmpWYWx1ZSk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgY29ycmVzcG9uZGluZyB0aGUgZ2l2ZW4gcHJpbWFyeSBrZXkgCi0gICAgICogIAotICAgICAqIEBwYXJhbSBvYmpQcmltYXJ5S2V5IHRoZSBwcmltYXJ5IGtleSBmb3Igd2hpY2ggYSB2YWx1ZSBuZWVkcyB0byBiZSBnZW5lcmF0ZWQKLSAgICAgKiBAcmV0dXJuIHRoZSBnZW5lcmF0ZWQgdmFsdWUgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gcHJpbWFyeSBrZXkKLSAgICAgKi8KLSAgICBPYmplY3QgZ2V0VmFsdWUoT2JqZWN0IG9ialByaW1hcnlLZXkpOyAKLX0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90YWJsZS9tb2RlbC9JVGFibGVDb2x1bW4uamF2YSBiL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90YWJsZS9tb2RlbC9JVGFibGVDb2x1bW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNlNmMxMy4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdGFibGUvbW9kZWwvSVRhYmxlQ29sdW1uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZW5kZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVxdWVzdEN5Y2xlOwotCi0vKioKLSAqIFRoZSBpbnRlcmZhY2UgZGVmaW5pbmcgYSB0YWJsZSBjb2x1bW4uIAotICogCi0gKiBBIGNvbHVtbiBpcyByZXNwb25zaWJsZSBmb3IgcHJlc2VudGluZyBhIHBhcnRpY3VsYXIgcGFydCBvZiB0aGUgZGF0YQotICogZnJvbSB0aGUgb2JqZWN0cyBpbiB0aGUgdGFibGUuIFRoaXMgaXMgZG9uZSB2aWEgdGhlIGdldFZhbHVlUmVuZGVyKCkgbWV0aG9kLgotICogCi0gKiBBIGNvbHVtbiBtYXkgYmUgc29ydGFibGUsIGluIHdoaWNoIGNhc2UgaXQgZGVmaW5lcyB0aGUgd2F5IGluIHdoaWNoIHRoZQotICogb2JqZWN0cyBpbiB0aGUgdGFibGUgbXVzdCBiZSBzb3J0ZWQgYnkgcHJvdmlkaW5nIGEgQ29tcGFyYXRvci4KLSAqIAotICogQHZlcnNpb24gJElkJAotICogQGF1dGhvciBtaW5kYnJpZGdlCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVRhYmxlQ29sdW1uCi17Ci0JLyoqCi0JICogTWV0aG9kIGdldENvbHVtbk5hbWUgcHJvdmlkZXMgdGhlIG5hbWUgb2YgdGhlIGNvbHVtbi4gCi0JICoKLQkgKiBUaGUgY29sdW1uIG5hbWUgbXVzdCBiZSB1bmlxdWUgYW5kIGlzIGdlbmVyYWxseSB1c2VkIGZvciB0aGUgaWRlbnRpZmljYXRpb24gCi0JICogb2YgdGhlIGNvbHVtbi4gSXQgZG9lcyBub3QgaGF2ZSB0byBiZSB0aGUgc2FtZSBhcyB0aGUgZGlzcGxheSBuYW1lIAotCSAqIHZpYSB3aGljaCB0aGUgY29sdW1uIGlzIGlkZW50aWZpZWQgdG8gdGhlIHVzZXIgKHNlZSB0aGUgZ2V0Q29sdW1uUmVuZGVyKCkgbWV0aG9kKS4KLQkgKiBAcmV0dXJuIFN0cmluZyB0aGUgbmFtZSBvZiB0aGUgY29sdW1uCi0JICovCi0JU3RyaW5nIGdldENvbHVtbk5hbWUoKTsKLQotCS8qKgotCSAqIE1ldGhvZCBnZXRTb3J0YWJsZSBkZWNsYXJlcyB3aGV0aGVyIHRoZSBjb2x1bW4gYWxsb3dzIHNvcnRpbmcuCi0JICogSWYgdGhlIGNvbHVtbiBhbGxvd3Mgc29ydGluZywgaXQgbXVzdCBhbHNvIHJldHVybiBhIHZhbGlkIENvbXBhcmF0b3IKLQkgKiB2aWEgdGhlIGdldENvbXBhcmF0b3IoKSBtZXRob2QuCi0JICogQHJldHVybiBib29sZWFuIHdoZXRoZXIgdGhlIGNvbHVtbiBpcyBzb3J0YWJsZSBvciBub3QKLQkgKi8KLQlib29sZWFuIGdldFNvcnRhYmxlKCk7Ci0KLQkvKioKLQkgKiBNZXRob2QgZ2V0Q29tcGFyYXRvciByZXR1cm5zIHRoZSBDb21wYXJhdG9yIHRvIGJlIHVzZWQgdG8gc29ydCAKLQkgKiB0aGUgZGF0YSBpbiB0aGUgdGFibGUgYWNjb3JkaW5nIHRvIHRoaXMgY29sdW1uLiBUaGUgQ29tcGFyYXRvciBtdXN0Ci0JICogYWNjZXB0IHR3byBkaWZmZXJlbnQgcm93cywgY29tcGFyZSB0aGVtIGFjY29yZGluZyB0byB0aGlzIGNvbHVtbiwgCi0JICogYW5kIHJldHVybiB0aGUgYXBwcm9wcmlhdGUgdmFsdWUuCi0JICogQHJldHVybiBDb21wYXJhdG9yIHRoZSBDb21wYXJhdG9yIHVzZWQgdG8gc29ydCB0aGUgdGFibGUgZGF0YQotCSAqLwotCUNvbXBhcmF0b3IgZ2V0Q29tcGFyYXRvcigpOwotCi0JLyoqCi0JICogTWV0aG9kIGdldENvbHVtblJlbmRlcmVyIHByb3ZpZGVzIGEgcmVuZGVyZXIgdGhhdCB0YWtlcyBjYXJlIG9mIHJlbmRlcmluZyAKLQkgKiB0aGUgY29sdW1uIGluIHRoZSB0YWJsZSBoZWFkZXIuIElmIHRoZSBjb2x1bW4gaXMgc29ydGFibGUsIHRoZSByZW5kZXJlcgotCSAqIG1heSBwcm92aWRlIGEgbWVjaGFuaXNtIHRvIHNvcnQgdGhlIHRhYmxlIGluIGFuIGFzY2VuZGluZyBvciBkZXNjZW5kaW5nIAotCSAqIG1hbm5lci4KLQkgKiBAcGFyYW0gb2JqQ3ljbGUgdGhlIGN1cnJlbnQgcmVxdWVzdCBjeWNsZQotCSAqIEBwYXJhbSBvYmpTb3VyY2UgYSBjb21wb25lbnQgdGhhdCBjYW4gcHJvdmlkZSB0aGUgdGFibGUgbW9kZWwgKHR5cGljYWxseSBUYWJsZVZpZXcpCi0JICogQHJldHVybiBJUmVuZGVyIHRoZSByZW5kZXJlciB0byBwcmVzZW50IHRoZSBjb2x1bW4gaGVhZGVyCi0JICovCi0JSVJlbmRlciBnZXRDb2x1bW5SZW5kZXJlcigKLQkJSVJlcXVlc3RDeWNsZSBvYmpDeWNsZSwKLQkJSVRhYmxlTW9kZWxTb3VyY2Ugb2JqU291cmNlKTsKLQotCS8qKgotCSAqIE1ldGhvZCBnZXRWYWx1ZVJlbmRlcmVyIHByb3ZpZGVzIGEgcmVuZGVyZXIgZm9yIHByZXNlbnRpbmcgdGhlIHZhbHVlIG9mIGEgCi0JICogcGFydGljdWxhciByb3cgaW4gdGhlIGN1cnJlbnQgY29sdW1uLgotCSAqIAotCSAqIEBwYXJhbSBvYmpDeWNsZSB0aGUgY3VycmVudCByZXF1ZXN0IGN5Y2xlCi0JICogQHBhcmFtIG9ialNvdXJjZSBhIGNvbXBvbmVudCB0aGF0IGNhbiBwcm92aWRlIHRoZSB0YWJsZSBtb2RlbCAodHlwaWNhbGx5IFRhYmxlVmlldykKLQkgKiBAcGFyYW0gb2JqUm93IHRoZSByb3cgZGF0YQotCSAqIEByZXR1cm4gSVJlbmRlciB0aGUgcmVuZGVyZXIgdG8gcHJlc2VudCB0aGUgdmFsdWUgb2YgdGhlIHJvdyBpbiB0aGlzIGNvbHVtbgotCSAqLwotCUlSZW5kZXIgZ2V0VmFsdWVSZW5kZXJlcigKLQkJSVJlcXVlc3RDeWNsZSBvYmpDeWNsZSwKLQkJSVRhYmxlTW9kZWxTb3VyY2Ugb2JqU291cmNlLAotCQlPYmplY3Qgb2JqUm93KTsKLX0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90YWJsZS9tb2RlbC9JVGFibGVDb2x1bW5Nb2RlbC5qYXZhIGIvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL21vZGVsL0lUYWJsZUNvbHVtbk1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2ZGUzMDUuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL21vZGVsL0lUYWJsZUNvbHVtbk1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi0vKioKLSAqIERlZmluZXMgYSBsaXN0IG1vZGVsIG9mIElUYWJsZUNvbHVtbiBvYmplY3RzCi0gKiAKLSAqIEB2ZXJzaW9uICRJZCQKLSAqIEBhdXRob3IgbWluZGJyaWRnZQotICovCi1wdWJsaWMgaW50ZXJmYWNlIElUYWJsZUNvbHVtbk1vZGVsCi17Ci0JLyoqCi0JICogTWV0aG9kIGdldENvbHVtbkNvdW50LgotCSAqIEByZXR1cm4gaW50IHRoZSBudW1iZXIgb2YgY29sdW1ucyBpbiB0aGUgbW9kZWwKLQkgKi8KLQlpbnQgZ2V0Q29sdW1uQ291bnQoKTsKLQotCS8qKgotCSAqIE1ldGhvZCBnZXRDb2x1bW4uCi0JICogQHBhcmFtIHN0ck5hbWUgdGhlIG5hbWUgb2YgdGhlIHJlcXVlc3RlZCBjb2x1bW4KLQkgKiBAcmV0dXJuIElUYWJsZUNvbHVtbiB0aGUgY29sdW1uIHdpdGggdGhlIGdpdmVuIG5hbWUuIG51bGwgaWYgbm8gc3VjaCBjb2x1bW4gZXhpc3RzLgotCSAqLwotCUlUYWJsZUNvbHVtbiBnZXRDb2x1bW4oU3RyaW5nIHN0ck5hbWUpOwotCi0JLyoqCi0JICogTWV0aG9kIGdldENvbHVtbnMuCi0JICogQHJldHVybiBJdGVyYXRvciBhbiBpdGVyYXRvciBvZiBhbGwgY29sdW1ucyBpbiB0aGUgbW9kZWwKLQkgKi8KLQlJdGVyYXRvciBnZXRDb2x1bW5zKCk7Ci19CmRpZmYgLS1naXQgYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdGFibGUvbW9kZWwvSVRhYmxlRGF0YU1vZGVsLmphdmEgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdGFibGUvbW9kZWwvSVRhYmxlRGF0YU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljZmI3MjMuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL21vZGVsL0lUYWJsZURhdGFNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5tb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotLyoqCi0gKiBBIG1vZGVsIG9mIHRoZSB0YWJsZSdzIGRhdGEKLSAqIFRoaXMgbW9kZWwgbmVlZCBub3QgYmUgdXNlZC4gSW1wbGVtZW50YXRpb25zIG1heSBjaG9vc2UgdG8KLSAqIGFjY2VzcyBkYXRhIHZpYSBhbiBhYnN0cmFjdGlvbi4KLSAqIAotICogQHZlcnNpb24gJElkJAotICogQGF1dGhvciBtaW5kYnJpZGdlCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVRhYmxlRGF0YU1vZGVsCi17Ci0JLyoqCi0JICogTWV0aG9kIGdldFJvd0NvdW50LgotCSAqIEByZXR1cm4gaW50IHRoZSBudW1iZXIgb2Ygcm93cyBpbiB0aGUgbW9kZWwKLQkgKi8KLQlpbnQgZ2V0Um93Q291bnQoKTsKLQotCS8qKgotCSAqIEl0ZXJhdGVzIG92ZXIgYWxsIG9mIHRoZSByb3dzIGluIHRoZSBtb2RlbAotCSAqIEByZXR1cm4gSXRlcmF0b3IgdGhlIGl0ZXJhdG9yIGZvciBhY2Nlc3MgdG8gdGhlIGRhdGEKLQkgKi8KLQlJdGVyYXRvciBnZXRSb3dzKCk7Ci0gICAgCi0JLyoqCi0JICogTWV0aG9kIGFkZFRhYmxlRGF0YU1vZGVsTGlzdGVuZXIKLSAgICAgKiBBZGRzIGEgbGlzdGVuZXIgdGhhdCBpcyBub3RpZmllZCB3aGVuIHRoZSBkYXRhIGluIHRoZSBtb2RlbCBpcyBjaGFuZ2VkCi0JICogQHBhcmFtIG9iakxpc3RlbmVyIHRoZSBsaXN0ZW5lciB0byBhZGQKLQkgKi8KLSAgICB2b2lkIGFkZFRhYmxlRGF0YU1vZGVsTGlzdGVuZXIoSVRhYmxlRGF0YU1vZGVsTGlzdGVuZXIgb2JqTGlzdGVuZXIpOwotCi0JLyoqCi0JICogTWV0aG9kIHJlbW92ZVRhYmxlRGF0YU1vZGVsTGlzdGVuZXIuCi0gICAgICogUmVtb3ZlcyBhIGxpc3RlbmVyIHRoYXQgaXMgbm90aWZpZWQgd2hlbiB0aGUgZGF0YSBpbiB0aGUgbW9kZWwgaXMgY2hhbmdlZAotCSAqIEBwYXJhbSBvYmpMaXN0ZW5lciB0aGUgbGlzdGVuZXIgdG8gcmVtb3ZlCi0JICovCi0gICAgdm9pZCByZW1vdmVUYWJsZURhdGFNb2RlbExpc3RlbmVyKElUYWJsZURhdGFNb2RlbExpc3RlbmVyIG9iakxpc3RlbmVyKTsKLSAgICAKLX0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90YWJsZS9tb2RlbC9JVGFibGVEYXRhTW9kZWxMaXN0ZW5lci5qYXZhIGIvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL21vZGVsL0lUYWJsZURhdGFNb2RlbExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1MDI2ZDAuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL21vZGVsL0lUYWJsZURhdGFNb2RlbExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsOwotCi0vKioKLSAqIEBhdXRob3IgbWluZGJyaWRnZQotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJVGFibGVEYXRhTW9kZWxMaXN0ZW5lcgotewotICAgIHZvaWQgdGFibGVEYXRhQ2hhbmdlZChDVGFibGVEYXRhTW9kZWxFdmVudCBvYmpFdmVudCk7Ci19CmRpZmYgLS1naXQgYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdGFibGUvbW9kZWwvSVRhYmxlTW9kZWwuamF2YSBiL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90YWJsZS9tb2RlbC9JVGFibGVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjQ0Y2E3Li4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90YWJsZS9tb2RlbC9JVGFibGVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5tb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotLyoqCi0gKiBUaGUgbWFpbiBpbnRlcmZhY2UgZGVmaW5pbmcgdGhlIGFic3RyYWN0aW9uIGNvbnRhaW5pbmcgdGhlIHRhYmxlIGRhdGEgYW5kIHN0YXRlCi0gKiAKLSAqIEB2ZXJzaW9uICRJZCQKLSAqIEBhdXRob3IgbWluZGJyaWRnZQotICovCi1wdWJsaWMgaW50ZXJmYWNlIElUYWJsZU1vZGVsCi17Ci0JLyoqCi0JICogTWV0aG9kIGdldENvbHVtbk1vZGVsLgotCSAqIEByZXR1cm4gSVRhYmxlQ29sdW1uTW9kZWwgdGhlIGNvbHVtbiBtb2RlbCBvZiB0aGUgdGFibGUKLQkgKi8KLQlJVGFibGVDb2x1bW5Nb2RlbCBnZXRDb2x1bW5Nb2RlbCgpOwotCi0JLyoqCi0JICogTWV0aG9kIGdldFNvcnRpbmdTdGF0ZS4KLQkgKiBAcmV0dXJuIElUYWJsZVNvcnRpbmdTdGF0ZSB0aGUgc29ydGluZyBzdGF0ZSBvZiB0aGUgdGFibGUKLQkgKi8KLQlJVGFibGVTb3J0aW5nU3RhdGUgZ2V0U29ydGluZ1N0YXRlKCk7Ci0JLyoqCi0JICogTWV0aG9kIGdldFBhZ2luZ1N0YXRlLgotCSAqIEByZXR1cm4gSVRhYmxlUGFnaW5nU3RhdGUgdGhlIHBhZ2luZyBzdGF0ZSBvZiB0aGUgdGFibGUKLQkgKi8KLQlJVGFibGVQYWdpbmdTdGF0ZSBnZXRQYWdpbmdTdGF0ZSgpOwotCi0JLyoqCi0JICogTWV0aG9kIGdldFBhZ2VDb3VudC4KLQkgKiBAcmV0dXJuIGludCB0aGUgbnVtYmVyIG9mIHBhZ2VzIHRoaXMgdGFibGUgd291bGQgaGF2ZSBnaXZlbiB0aGUgY3VycmVudCBkYXRhIGFuZCBwYWdpbmcgc3RhdGUKLQkgKi8KLQlpbnQgZ2V0UGFnZUNvdW50KCk7Ci0JLyoqCi0JICogTWV0aG9kIGdldEN1cnJlbnRQYWdlUm93cy4KLQkgKiBAcmV0dXJuIEl0ZXJhdG9yIHRoZSByb3dzIGluIHRoZSBjdXJyZW50IHRhYmxlIHBhZ2UgZ2l2ZW4gdGhlIGN1cnJlbnQgZGF0YSwgc29ydGluZywgYW5kIHBhZ2luZyBzdGF0ZQotCSAqLwotCUl0ZXJhdG9yIGdldEN1cnJlbnRQYWdlUm93cygpOwotfQpkaWZmIC0tZ2l0IGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL21vZGVsL0lUYWJsZU1vZGVsU291cmNlLmphdmEgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdGFibGUvbW9kZWwvSVRhYmxlTW9kZWxTb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI4Y2UyZi4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdGFibGUvbW9kZWwvSVRhYmxlTW9kZWxTb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklDb21wb25lbnQ7Ci0KLS8qKgotICogQSBUYXBlc3RyeSBjb21wb25lbnQgdGhhdCBwcm92aWRlcyB0aGUgY3VycmVudCB0YWJsZSBtb2RlbC4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIHVzZWQgZm9yIG9idGFpbmluZyB0aGUgdGFibGUgbW9kZWwgc291cmNlIGJ5Ci0gKiBjb21wb25lbnRzIHdyYXBwZWQgYnkgaXQsIGFzIHdlbGwgYXMgYnkgZXh0ZXJuYWwgcmVuZGVyZXJzLAotICogc3VjaCBhcyB0aG9zZSBwcm92aWRlZCBieSB0aGUgY29sdW1uIGltcGxlbWVudGF0aW9ucwotICogCi0gKiBAdmVyc2lvbiAkSWQkCi0gKiBAYXV0aG9yIG1pbmRicmlkZ2UKLSAqLwotcHVibGljIGludGVyZmFjZSBJVGFibGVNb2RlbFNvdXJjZSBleHRlbmRzIElDb21wb25lbnQKLXsKLSAgICBmaW5hbCBzdGF0aWMgU3RyaW5nIFRBQkxFX01PREVMX1NPVVJDRV9BVFRSSUJVVEUgPSAib3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsLklUYWJsZU1vZGVsU291cmNlIjsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRhYmxlIG1vZGVsIGN1cnJlbnRseSB1c2VkCi0JICogQHJldHVybiBJVGFibGVNb2RlbCB0aGUgY3VycmVudCB0YWJsZSBtb2RlbAotCSAqLwotCUlUYWJsZU1vZGVsIGdldFRhYmxlTW9kZWwoKTsKLQotCS8qKgotCSAqIE5vdGlmaWVzIHRoZSBtb2RlbCBzb3VyY2UgdGhhdCB0aGUgbW9kZWwgc3RhdGUgaGFzIGNoYW5nZWQsIGFuZCAKLSAgICAgKiB0aGF0IGl0IHNob3VsZCBjb25zaWRlciBzYXZpbmcgaXQuPHA+Ci0gICAgICogVGhpcyBtZXRob2Qgd2FzIGFkZGVkIHRvIGFsbG93IHVzaW5nIHRoZSB0YWJsZSB3aXRoaW4gYSBCbG9jayB3aGVuIAotICAgICAqIHRoZSBwYWdlQmVnaW5SZW5kZXIoKSBsaXN0ZW5lciBvZiB0aGUgaW1wbGVtZW50YXRpb24gd2lsbCBub3QgYmUgY2FsbGVkCi0gICAgICogYW5kIGF1dG9tYXRpYyBzdGF0ZSBzdG9yYWdlIHdpbGwgdGhlcmVmb3JlIGJlIGhhcmQgdG8gaW1wbGVtZW50LgotCSAqLwotICAgIHZvaWQgZmlyZU9ic2VydmVkU3RhdGVDaGFuZ2UoKTsKLX0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90YWJsZS9tb2RlbC9JVGFibGVQYWdpbmdTdGF0ZS5qYXZhIGIvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL21vZGVsL0lUYWJsZVBhZ2luZ1N0YXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjYmQ4YWYuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL21vZGVsL0lUYWJsZVBhZ2luZ1N0YXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsOwotCi0vKioKLSAqIEFuIGludGVyZmFjZSBkZWZpbmluZyB0aGUgbWFuYWdlbWVudCBvZiB0aGUgdGFibGUncyBwYWdpbmcgc3RhdGUuCi0gKiAKLSAqIEB2ZXJzaW9uICRJZCQKLSAqIEBhdXRob3IgbWluZGJyaWRnZQotICovCi1wdWJsaWMgaW50ZXJmYWNlIElUYWJsZVBhZ2luZ1N0YXRlCi17Ci0JLyoqCi0JICogTWV0aG9kIGdldFBhZ2VTaXplIHByb3ZpZGVzIHRoZSBzaXplIG9mIGEgcGFnZSBpbiBhIG51bWJlciBvZiByZWNvcmRzLgotCSAqIFRoaXMgdmFsdWUgbWF5IGJlIG1lYW5pbmdsZXNzIGlmIHRoZSBtb2RlbCB1c2VzIGEgZGlmZmVyZW50IG1ldGhvZCBmb3IgcGFnaW5hdGlvbi4KLQkgKiBAcmV0dXJuIGludCB0aGUgY3VycmVudCBwYWdlIHNpemUKLQkgKi8KLQlpbnQgZ2V0UGFnZVNpemUoKTsKLQotCS8qKgotCSAqIE1ldGhvZCBzZXRQYWdlU2l6ZSB1cGRhdGVzIHRoZSBzaXplIG9mIGEgcGFnZSBpbiBhIG51bWJlciBvZiByZWNvcmRzLgotCSAqIFRoaXMgdmFsdWUgbWF5IGJlIG1lYW5pbmdsZXNzIGlmIHRoZSBtb2RlbCB1c2VzIGEgZGlmZmVyZW50IG1ldGhvZCBmb3IgcGFnaW5hdGlvbi4KLQkgKiBAcGFyYW0gblBhZ2VTaXplIHRoZSBuZXcgcGFnZSBzaXplCi0JICovCi0Jdm9pZCBzZXRQYWdlU2l6ZShpbnQgblBhZ2VTaXplKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBwYWdlLiBUaGUgcGFnZSBudW1iZXIgaXMgY291bnRlZCBmcm9tIDAuCi0JICogQHJldHVybiBpbnQgdGhlIGN1cnJlbnQgYWN0aXZlIHBhZ2UKLQkgKi8KLQlpbnQgZ2V0Q3VycmVudFBhZ2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIG5ld2x5IHNlbGVjdGVkIHBhZ2UuIFRoZSBwYWdlIG51bWJlciBpcyBjb3VudGVkIGZyb20gMC4KLQkgKiBAcGFyYW0gblBhZ2UgdGhlIG5ldyBhY3RpdmUgcGFnZQotCSAqLwotCXZvaWQgc2V0Q3VycmVudFBhZ2UoaW50IG5QYWdlKTsKLX0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90YWJsZS9tb2RlbC9JVGFibGVSZW5kZXJlckxpc3RlbmVyLmphdmEgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdGFibGUvbW9kZWwvSVRhYmxlUmVuZGVyZXJMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjRjMWExYS4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdGFibGUvbW9kZWwvSVRhYmxlUmVuZGVyZXJMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5tb2RlbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUNvbXBvbmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZXF1ZXN0Q3ljbGU7Ci0KLS8qKgotICogCi0gKiBAc2VlIG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5tb2RlbC5jb21tb24uQWJzdHJhY3RUYWJsZUNvbHVtbgotICogQHZlcnNpb24gJElkJAotICogQGF1dGhvciBtaW5kYnJpZGdlCi0gKiBAc2luY2UgMi4zCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVRhYmxlUmVuZGVyZXJMaXN0ZW5lciBleHRlbmRzIElDb21wb25lbnQKLXsKLQl2b2lkIGluaXRpYWxpemVSZW5kZXJlcigKLQkJSVJlcXVlc3RDeWNsZSBvYmpDeWNsZSwKLQkJSVRhYmxlTW9kZWxTb3VyY2Ugb2JqU291cmNlLAotCQlJVGFibGVDb2x1bW4gb2JqQ29sdW1uLAotCQlPYmplY3Qgb2JqUm93KTsKLX0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90YWJsZS9tb2RlbC9JVGFibGVSZW5kZXJlclNvdXJjZS5qYXZhIGIvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL21vZGVsL0lUYWJsZVJlbmRlcmVyU291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MzQ4ZjguLjAwMDAwMDAKLS0tIGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL21vZGVsL0lUYWJsZVJlbmRlcmVyU291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZW5kZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVxdWVzdEN5Y2xlOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIHByb3ZpZGVzIGEgcmVuZGVyZXIgdG8gcHJlc2VudCB0aGUgZGF0YSBpbiBhIHRhYmxlIGNvbHVtbi4KLSAqIEl0IGlzIHVzdWFsbHkgdXNlZCBieSB0aGUge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5tb2RlbC5JVGFibGVDb2x1bW59IAotICogaW1wbGVtZW50YXRpb25zIHZpYSBhZ2dyZWdhdGlvbi4KLSAqIAotICogQHNlZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuY29tbW9uLkFic3RyYWN0VGFibGVDb2x1bW4KLSAqIEB2ZXJzaW9uICRJZCQKLSAqIEBhdXRob3IgbWluZGJyaWRnZQotICogQHNpbmNlIDIuMwotICovCi1wdWJsaWMgaW50ZXJmYWNlIElUYWJsZVJlbmRlcmVyU291cmNlIGV4dGVuZHMgU2VyaWFsaXphYmxlCi17Ci0JLyoqCi0JICogUmV0dXJucyBhIHJlbmRlcmVyIHRvIHByZXNlbnQgdGhlIGRhdGEgb2YgdGhlIHJvdyBpbiB0aGUgZ2l2ZW4gY29sdW1uLiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBjYW4gYWxzbyBiZSB1c2VkIHRvIHJldHVybiBhIHJlbmRlcmVyIHRvIHByZXNlbnQgdGhlCi0JICogaGVhZGluZyBvZiB0aGUgY29sdW1uLiBJbiBzdWNoIGEgY2FzZSB0aGUgcm93IHBhc3NlZCB3b3VsZCBiZSBudWxsLgotCSAqIAotCSAqIEBzZWUgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsLklUYWJsZUNvbHVtbiNnZXRWYWx1ZVJlbmRlcmVyKElSZXF1ZXN0Q3ljbGUsIElUYWJsZU1vZGVsU291cmNlLCBPYmplY3QpCi0JICovCi0JcHVibGljIElSZW5kZXIgZ2V0UmVuZGVyZXIoCi0JCUlSZXF1ZXN0Q3ljbGUgb2JqQ3ljbGUsCi0JCUlUYWJsZU1vZGVsU291cmNlIG9ialNvdXJjZSwKLQkJSVRhYmxlQ29sdW1uIG9iakNvbHVtbiwKLQkJT2JqZWN0IG9ialJvdyk7Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90YWJsZS9tb2RlbC9JVGFibGVSb3dTb3VyY2UuamF2YSBiL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90YWJsZS9tb2RlbC9JVGFibGVSb3dTb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM1ODI5Ny4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdGFibGUvbW9kZWwvSVRhYmxlUm93U291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsOwotCi0vKioKLSAqIEEgVGFwZXN0cnkgY29tcG9uZW50IHRoYXQgcHJvdmlkZXMgdGhlIGN1cnJlbnQgcm93IHZhbHVlLgotICogVGhpcyBpbnRlcmZhY2UgaXMgdXNlZCBmb3Igb2J0YWluaW5nIHRoZSByb3cgc291cmNlIGJ5IGNvbXBvbmVudHMgCi0gKiB3cmFwcGVkIGJ5IHRoZSByb3cgc291cmNlCi0gKiAKLSAqIEB2ZXJzaW9uICRJZCQKLSAqIEBhdXRob3IgbWluZGJyaWRnZQotICovCi1wdWJsaWMgaW50ZXJmYWNlIElUYWJsZVJvd1NvdXJjZQotewotICAgIGZpbmFsIHN0YXRpYyBTdHJpbmcgVEFCTEVfUk9XX1NPVVJDRV9BVFRSSUJVVEUgPSAib3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsLklUYWJsZVJvd1NvdXJjZSI7Ci0KLQkvKioKLQkgKiBNZXRob2QgZ2V0VGFibGVSb3cKLQkgKiBAcmV0dXJuIE9iamVjdCB0aGUgY3VycmVudCB0YWJsZSByb3cgb2JqZWN0Ci0JICovCi0gICAgT2JqZWN0IGdldFRhYmxlUm93KCk7Ci19CmRpZmYgLS1naXQgYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdGFibGUvbW9kZWwvSVRhYmxlU2Vzc2lvblN0YXRlTWFuYWdlci5qYXZhIGIvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL21vZGVsL0lUYWJsZVNlc3Npb25TdGF0ZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM1OGJlYi4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdGFibGUvbW9kZWwvSVRhYmxlU2Vzc2lvblN0YXRlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5tb2RlbDsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotCi0vKioKLSAqIEFuICBpbnRlcmZhY2UgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIDxiPndoYXQ8L2I+IGRhdGEgd291bGQgYmUgc3RvcmVkIAotICogaW4gdGhlIHNlc3Npb24gYmV0d2VlbiByZXF1ZXN0cy4gCi0gKiBJdCBjb3VsZCBiZSBvbmx5IHRoZSB0YWJsZSBzdGF0ZSwgaXQgY291bGQgYmUgZW50aXJlIHRhYmxlIGluY2x1ZGluZyB0aGUgZGF0YSwKLSAqIG9yIGl0IGNvdWxkIGJlIG5vdGhpbmcgYXQgYWxsLiAKLSAqIEl0IGlzIGFsbCBkZXRlcm1pbmVkIGJ5IHRoZSBpbXBsZW1lbnRpb24gb2YgdGhpcyBpbnRlcmZhY2UuCi0gKiAKLSAqIEB2ZXJzaW9uICRJZCQKLSAqIEBhdXRob3IgbWluZGJyaWRnZQotICovCi1wdWJsaWMgaW50ZXJmYWNlIElUYWJsZVNlc3Npb25TdGF0ZU1hbmFnZXIKLXsKLQotCS8qKgotCSAqIE1ldGhvZCBnZXRTZXNzaW9uU3RhdGUgZXh0cmFjdHMgdGhlICJwZXJzaXN0ZW50IiBwb3J0aW9uIG9mIHRoZSB0YWJsZSBtb2RlbAotCSAqIEBwYXJhbSBvYmpNb2RlbCB0aGUgdGFibGUgbW9kZWwgdG8gZXh0cmFjdCB0aGUgc2Vzc2lvbiBzdGF0ZSBmcm9tCi0JICogQHJldHVybiBPYmplY3QgdGhlIHNlc3Npb24gc3RhdGUgdG8gYmUgc2F2ZWQgYmV0d2VlbiB0aGUgcmVxdWVzdHMKLQkgKi8KLQlTZXJpYWxpemFibGUgZ2V0U2Vzc2lvblN0YXRlKElUYWJsZU1vZGVsIG9iak1vZGVsKTsKLQotCS8qKgotCSAqIE1ldGhvZCByZWNyZWF0ZVRhYmxlTW9kZWwgcmVjcmVhdGVzIGEgdGFibGUgbW9kZWwgZnJvbSB0aGUgc2F2ZWQgc2Vzc2lvbiBzdGF0ZQotCSAqIEBwYXJhbSBvYmpTdGF0ZSB0aGUgc2F2ZWQgc2Vzc2lvbiBzdGF0ZQotCSAqIEByZXR1cm4gSVRhYmxlTW9kZWwgdGhlIHJlY3JlYXRlZCB0YWJsZSBtb2RlbAotCSAqLwotCUlUYWJsZU1vZGVsIHJlY3JlYXRlVGFibGVNb2RlbChTZXJpYWxpemFibGUgb2JqU3RhdGUpOwotfQpkaWZmIC0tZ2l0IGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL21vZGVsL0lUYWJsZVNlc3Npb25TdG9yZU1hbmFnZXIuamF2YSBiL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90YWJsZS9tb2RlbC9JVGFibGVTZXNzaW9uU3RvcmVNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmYjcyNjEuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL21vZGVsL0lUYWJsZVNlc3Npb25TdG9yZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWw7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlcXVlc3RDeWNsZTsKLQotLyoqCi0gKiBBbiBpbnRlcmZhY2UgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIDxiPndoZXJlPC9iPiB0aGUgc2Vzc2lvbiBzdGF0ZSAKLSAqIHdpbGwgYmUgc2F2ZWQgYmV0d2VlbiByZXF1ZXN0cy4KLSAqICAKLSAqIEB2ZXJzaW9uICRJZCQKLSAqIEBhdXRob3IgbWluZGJyaWRnZQotICovCi1wdWJsaWMgaW50ZXJmYWNlIElUYWJsZVNlc3Npb25TdG9yZU1hbmFnZXIKLXsKLQkvKioKLQkgKiBNZXRob2Qgc2F2ZVN0YXRlIHNhdmVzIHRoZSBzZXNzaW9uIHNhdGUKLQkgKiBAcGFyYW0gb2JqQ3ljbGUgdGhlIGN1cnJlbnQgcmVxdWVzdCBjeWNsZQotCSAqIEBwYXJhbSBvYmpTdGF0ZSB0aGUgc2Vzc2lvbiBzdGF0ZSB0byBiZSBzYXZlZAotCSAqLwotCXZvaWQgc2F2ZVN0YXRlKElSZXF1ZXN0Q3ljbGUgb2JqQ3ljbGUsIFNlcmlhbGl6YWJsZSBvYmpTdGF0ZSk7Ci0JLyoqCi0JICogTWV0aG9kIGxvYWRTdGF0ZSBsb2FkcyB0aGUgc2Vzc2lvbiBzdGF0ZQotCSAqIEBwYXJhbSBvYmpDeWNsZSB0aGUgY3VycmVudCByZXF1ZXN0IGN5Y2xlCi0JICogQHJldHVybiBPYmplY3QgdGhlIGxvYWRlZCBzZXNzaW9ucyBzdGF0ZQotCSAqLwotCVNlcmlhbGl6YWJsZSBsb2FkU3RhdGUoSVJlcXVlc3RDeWNsZSBvYmpDeWNsZSk7Ci19CmRpZmYgLS1naXQgYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdGFibGUvbW9kZWwvSVRhYmxlU29ydGluZ1N0YXRlLmphdmEgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdGFibGUvbW9kZWwvSVRhYmxlU29ydGluZ1N0YXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmYjgwMDIuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL21vZGVsL0lUYWJsZVNvcnRpbmdTdGF0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5tb2RlbDsKLQotLyoqCi0gKiBBbiBpbnRlcmZhY2UgZGVmaW5pbmcgdGhlIG1hbmFnZW1lbnQgb2YgdGhlIHRhYmxlJ3Mgc29ydGluZyBzdGF0ZS4KLSAqIAotICogQHZlcnNpb24gJElkJAotICogQGF1dGhvciBtaW5kYnJpZGdlCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVRhYmxlU29ydGluZ1N0YXRlCi17Ci0Jc3RhdGljIGZpbmFsIGJvb2xlYW4gU09SVF9BU0NFTkRJTkcgPSBmYWxzZTsKLQlzdGF0aWMgZmluYWwgYm9vbGVhbiBTT1JUX0RFU0NFTkRJTkcgPSB0cnVlOwotCi0JLyoqCi0JICogTWV0aG9kIGdldFNvcnRDb2x1bW4gZGVmaW5lcyB0aGUgY29sdW1uIHRoYXQgdGhlIHRhYmxlIHNob3VsZCBiZSBzb3J0ZWQgdXBvbgotCSAqIEByZXR1cm4gU3RyaW5nIHRoZSBuYW1lIG9mIHRoZSBzb3J0aW5nIGNvbHVtbiBvciBudWxsIGlmIHRoZSB0YWJsZSBpcyBub3Qgc29ydGVkCi0JICovCi0JU3RyaW5nIGdldFNvcnRDb2x1bW4oKTsKLQotCS8qKgotCSAqIE1ldGhvZCBnZXRTb3J0T3JkZXIgZGVmaW5lcyB0aGUgZGlyZWN0aW9uIG9mIHRoZSB0YWJsZSBzb3J0aW5nIAotCSAqIEByZXR1cm4gYm9vbGVhbiB0aGUgc29ydGluZyBvcmRlciAoc2VlIGNvbnN0YW50cykKLQkgKi8KLQlib29sZWFuIGdldFNvcnRPcmRlcigpOwotCi0JLyoqCi0JICogTWV0aG9kIHNldFNvcnRDb2x1bW4gdXBkYXRlcyB0aGUgdGFibGUgc29ydGluZyBjb2x1bW4gYW5kIG9yZGVyCi0JICogQHBhcmFtIHN0ck5hbWUgdGhlIG5hbWUgb2YgdGhlIGNvbHVtbiB0byBzb3J0IGJ5Ci0JICogQHBhcmFtIGJPcmRlciB0aGUgc29ydGluZyBvcmRlciAoc2VlIGNvbnN0YW50cykKLQkgKi8KLQl2b2lkIHNldFNvcnRDb2x1bW4oU3RyaW5nIHN0ck5hbWUsIGJvb2xlYW4gYk9yZGVyKTsKLX0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90YWJsZS9tb2RlbC9jb21tb24vQWJzdHJhY3RUYWJsZUNvbHVtbi5qYXZhIGIvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL21vZGVsL2NvbW1vbi9BYnN0cmFjdFRhYmxlQ29sdW1uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkNjljMWQuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL21vZGVsL2NvbW1vbi9BYnN0cmFjdFRhYmxlQ29sdW1uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzIgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5tb2RlbC5jb21tb247Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUNvbXBvbmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZW5kZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVxdWVzdEN5Y2xlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuY29tcG9uZW50cy5CbG9jazsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuSVRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5tb2RlbC5JVGFibGVNb2RlbFNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuSVRhYmxlUmVuZGVyZXJTb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS52YWxpZC5SZW5kZXJTdHJpbmc7Ci0KLS8qKgotICogQSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuSVRhYmxlQ29sdW1ufQotICogdGhhdCBhbGxvd3MgcmVuZGVyZXJzIHRvIGJlIHNldCB2aWEgYWdncmVnYXRpb24uCi0gKiAKLSAqIEBzZWUgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsLklUYWJsZVJlbmRlcmVyU291cmNlCi0gKiBAdmVyc2lvbiAkSWQkCi0gKiBAYXV0aG9yIG1pbmRicmlkZ2UKLSAqIEBzaW5jZSAyLjMKLSAqLwotcHVibGljIGNsYXNzIEFic3RyYWN0VGFibGVDb2x1bW4gaW1wbGVtZW50cyBJVGFibGVDb2x1bW4sIFNlcmlhbGl6YWJsZQotewotICAgIC8qKgotICAgICAqICBUaGUgc3VmZml4IG9mIHRoZSBuYW1lIG9mIHRoZSBCbG9jayB0aGF0IHdpbGwgYmUgdXNlZCBhcyB0aGUgY29sdW1uIHJlbmRlcmVyCi0gICAgICogIGZvciB0aGlzIGNvbHVtbiAKLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDT0xVTU5fUkVOREVSRVJfQkxPQ0tfU1VGRklYID0gIkNvbHVtbkhlYWRlciI7Ci0KLSAgICAvKioKLSAgICAgKiAgVGhlIHN1ZmZpeCBvZiB0aGUgbmFtZSBvZiB0aGUgQmxvY2sgdGhhdCB3aWxsIGJlIHVzZWQgYXMgdGhlIHZhbHVlIHJlbmRlcmVyIAotICAgICAqICBmb3IgdGhpcyBjb2x1bW4gCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVkFMVUVfUkVOREVSRVJfQkxPQ0tfU1VGRklYID0gIkNvbHVtblZhbHVlIjsKLSAgICAKLQlwcml2YXRlIFN0cmluZyBtX3N0ckNvbHVtbk5hbWU7Ci0JcHJpdmF0ZSBib29sZWFuIG1fYlNvcnRhYmxlOwotCXByaXZhdGUgQ29tcGFyYXRvciBtX29iakNvbXBhcmF0b3I7Ci0KLQlwcml2YXRlIElUYWJsZVJlbmRlcmVyU291cmNlIG1fb2JqQ29sdW1uUmVuZGVyZXJTb3VyY2U7Ci0JcHJpdmF0ZSBJVGFibGVSZW5kZXJlclNvdXJjZSBtX29ialZhbHVlUmVuZGVyZXJTb3VyY2U7Ci0KLQlwdWJsaWMgQWJzdHJhY3RUYWJsZUNvbHVtbigpCi0JewotCQl0aGlzKCIiLCBmYWxzZSwgbnVsbCk7Ci0JfQotCi0JcHVibGljIEFic3RyYWN0VGFibGVDb2x1bW4oCi0JCVN0cmluZyBzdHJDb2x1bW5OYW1lLAotCQlib29sZWFuIGJTb3J0YWJsZSwKLQkJQ29tcGFyYXRvciBvYmpDb21wYXJhdG9yKQotCXsKLQkJdGhpcyhzdHJDb2x1bW5OYW1lLCBiU29ydGFibGUsIG9iakNvbXBhcmF0b3IsIG51bGwsIG51bGwpOwotCX0KLQotCXB1YmxpYyBBYnN0cmFjdFRhYmxlQ29sdW1uKAotCQlTdHJpbmcgc3RyQ29sdW1uTmFtZSwKLQkJYm9vbGVhbiBiU29ydGFibGUsCi0JCUNvbXBhcmF0b3Igb2JqQ29tcGFyYXRvciwKLQkJSVRhYmxlUmVuZGVyZXJTb3VyY2Ugb2JqQ29sdW1uUmVuZGVyZXJTb3VyY2UsCi0JCUlUYWJsZVJlbmRlcmVyU291cmNlIG9ialZhbHVlUmVuZGVyZXJTb3VyY2UpCi0JewotCQlzZXRDb2x1bW5OYW1lKHN0ckNvbHVtbk5hbWUpOwotCQlzZXRTb3J0YWJsZShiU29ydGFibGUpOwotCQlzZXRDb21wYXJhdG9yKG9iakNvbXBhcmF0b3IpOwotCQlzZXRDb2x1bW5SZW5kZXJlclNvdXJjZShvYmpDb2x1bW5SZW5kZXJlclNvdXJjZSk7Ci0JCXNldFZhbHVlUmVuZGVyZXJTb3VyY2Uob2JqVmFsdWVSZW5kZXJlclNvdXJjZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuSVRhYmxlQ29sdW1uI2dldENvbHVtbk5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uTmFtZSgpCi0JewotCQlyZXR1cm4gbV9zdHJDb2x1bW5OYW1lOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGNvbHVtbk5hbWUuCi0JICogQHBhcmFtIGNvbHVtbk5hbWUgVGhlIGNvbHVtbk5hbWUgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0Q29sdW1uTmFtZShTdHJpbmcgY29sdW1uTmFtZSkKLQl7Ci0JCW1fc3RyQ29sdW1uTmFtZSA9IGNvbHVtbk5hbWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuSVRhYmxlQ29sdW1uI2dldFNvcnRhYmxlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRTb3J0YWJsZSgpCi0JewotCQlyZXR1cm4gbV9iU29ydGFibGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB3aGV0aGVyIHRoZSBjb2x1bW4gaXMgc29ydGFibGUuCi0JICogQHBhcmFtIHNvcnRhYmxlIFRoZSBzb3J0YWJsZSBmbGFnIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNvcnRhYmxlKGJvb2xlYW4gc29ydGFibGUpCi0JewotCQltX2JTb3J0YWJsZSA9IHNvcnRhYmxlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsLklUYWJsZUNvbHVtbiNnZXRDb21wYXJhdG9yKCkKLQkgKi8KLQlwdWJsaWMgQ29tcGFyYXRvciBnZXRDb21wYXJhdG9yKCkKLQl7Ci0JCXJldHVybiBtX29iakNvbXBhcmF0b3I7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgY29tcGFyYXRvci4KLQkgKiBAcGFyYW0gY29tcGFyYXRvciBUaGUgY29tcGFyYXRvciB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb21wYXJhdG9yKENvbXBhcmF0b3IgY29tcGFyYXRvcikKLQl7Ci0JCW1fb2JqQ29tcGFyYXRvciA9IGNvbXBhcmF0b3I7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuSVRhYmxlQ29sdW1uI2dldENvbHVtblJlbmRlcmVyKElSZXF1ZXN0Q3ljbGUsIElUYWJsZU1vZGVsU291cmNlKQotCSAqLwotCXB1YmxpYyBJUmVuZGVyIGdldENvbHVtblJlbmRlcmVyKAotCQlJUmVxdWVzdEN5Y2xlIG9iakN5Y2xlLAotCQlJVGFibGVNb2RlbFNvdXJjZSBvYmpTb3VyY2UpCi0JewotCQlJVGFibGVSZW5kZXJlclNvdXJjZSBvYmpSZW5kZXJlclNvdXJjZSA9Ci0JCQlnZXRDb2x1bW5SZW5kZXJlclNvdXJjZSgpOwotCQlpZiAob2JqUmVuZGVyZXJTb3VyY2UgPT0gbnVsbCkKLQkJewotCQkJLy8gbG9nIGVycm9yCi0JCQlyZXR1cm4gbmV3IFJlbmRlclN0cmluZygiIik7Ci0JCX0KLQotCQlyZXR1cm4gb2JqUmVuZGVyZXJTb3VyY2UuZ2V0UmVuZGVyZXIob2JqQ3ljbGUsIG9ialNvdXJjZSwgdGhpcywgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuSVRhYmxlQ29sdW1uI2dldFZhbHVlUmVuZGVyZXIoSVJlcXVlc3RDeWNsZSwgSVRhYmxlTW9kZWxTb3VyY2UsIE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgSVJlbmRlciBnZXRWYWx1ZVJlbmRlcmVyKAotCQlJUmVxdWVzdEN5Y2xlIG9iakN5Y2xlLAotCQlJVGFibGVNb2RlbFNvdXJjZSBvYmpTb3VyY2UsCi0JCU9iamVjdCBvYmpSb3cpCi0JewotCQlJVGFibGVSZW5kZXJlclNvdXJjZSBvYmpSZW5kZXJlclNvdXJjZSA9IGdldFZhbHVlUmVuZGVyZXJTb3VyY2UoKTsKLQkJaWYgKG9ialJlbmRlcmVyU291cmNlID09IG51bGwpCi0JCXsKLQkJCS8vIGxvZyBlcnJvcgotCQkJcmV0dXJuIG5ldyBSZW5kZXJTdHJpbmcoIiIpOwotCQl9Ci0KLQkJcmV0dXJuIG9ialJlbmRlcmVyU291cmNlLmdldFJlbmRlcmVyKAotCQkJb2JqQ3ljbGUsCi0JCQlvYmpTb3VyY2UsCi0JCQl0aGlzLAotCQkJb2JqUm93KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb2x1bW5SZW5kZXJlclNvdXJjZS4KLQkgKiBAcmV0dXJuIElUYWJsZUNvbHVtblJlbmRlcmVyU291cmNlCi0JICovCi0JcHVibGljIElUYWJsZVJlbmRlcmVyU291cmNlIGdldENvbHVtblJlbmRlcmVyU291cmNlKCkKLQl7Ci0JCXJldHVybiBtX29iakNvbHVtblJlbmRlcmVyU291cmNlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGNvbHVtblJlbmRlcmVyU291cmNlLgotCSAqIEBwYXJhbSBjb2x1bW5SZW5kZXJlclNvdXJjZSBUaGUgY29sdW1uUmVuZGVyZXJTb3VyY2UgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0Q29sdW1uUmVuZGVyZXJTb3VyY2UoSVRhYmxlUmVuZGVyZXJTb3VyY2UgY29sdW1uUmVuZGVyZXJTb3VyY2UpCi0JewotCQltX29iakNvbHVtblJlbmRlcmVyU291cmNlID0gY29sdW1uUmVuZGVyZXJTb3VyY2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWVSZW5kZXJlclNvdXJjZS4KLSAgICAgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZVJlbmRlcmVyU291cmNlIG9mIHRoaXMgY29sdW1uCi0JICovCi0JcHVibGljIElUYWJsZVJlbmRlcmVyU291cmNlIGdldFZhbHVlUmVuZGVyZXJTb3VyY2UoKQotCXsKLQkJcmV0dXJuIG1fb2JqVmFsdWVSZW5kZXJlclNvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZVJlbmRlcmVyU291cmNlLgotICAgICAqIAotCSAqIEBwYXJhbSB2YWx1ZVJlbmRlcmVyU291cmNlIFRoZSB2YWx1ZVJlbmRlcmVyU291cmNlIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlUmVuZGVyZXJTb3VyY2UoSVRhYmxlUmVuZGVyZXJTb3VyY2UgdmFsdWVSZW5kZXJlclNvdXJjZSkKLQl7Ci0JCW1fb2JqVmFsdWVSZW5kZXJlclNvdXJjZSA9IHZhbHVlUmVuZGVyZXJTb3VyY2U7Ci0JfQotCi0gICAgLyoqCi0gICAgICogIFVzZSB0aGUgY29sdW1uIG5hbWUgdG8gZ2V0IHRoZSBjb2x1bW4gYW5kIHZhbHVlIHJlbmRlcmVyIHNvdXJjZXMgCi0gICAgICogIGZyb20gdGhlIHByb3ZpZGVkIGNvbXBvbmVudC4KLSAgICAgKiAgIAotICAgICAqICBAcGFyYW0gb2JqU2V0dGluZ3NDb250YWluZXIgdGhlIGNvbXBvbmVudCBmcm9tIHdoaWNoIHRvIGdldCB0aGUgc2V0dGluZ3MgCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgbG9hZFNldHRpbmdzKElDb21wb25lbnQgb2JqU2V0dGluZ3NDb250YWluZXIpCi0gICAgewotICAgICAgICBJQ29tcG9uZW50IG9iakNvbHVtblJlbmRlcmVyU291cmNlID0gKElDb21wb25lbnQpIG9ialNldHRpbmdzQ29udGFpbmVyLmdldENvbXBvbmVudHMoKS5nZXQoZ2V0Q29sdW1uTmFtZSgpICsgQ09MVU1OX1JFTkRFUkVSX0JMT0NLX1NVRkZJWCk7Ci0gICAgICAgIGlmIChvYmpDb2x1bW5SZW5kZXJlclNvdXJjZSAhPSBudWxsICYmIG9iakNvbHVtblJlbmRlcmVyU291cmNlIGluc3RhbmNlb2YgQmxvY2spCi0gICAgICAgICAgICBzZXRDb2x1bW5SZW5kZXJlclNvdXJjZShuZXcgQmxvY2tUYWJsZVJlbmRlcmVyU291cmNlKChCbG9jaykgb2JqQ29sdW1uUmVuZGVyZXJTb3VyY2UpKTsKLQotICAgICAgICBJQ29tcG9uZW50IG9ialZhbHVlUmVuZGVyZXJTb3VyY2UgPSAoSUNvbXBvbmVudCkgb2JqU2V0dGluZ3NDb250YWluZXIuZ2V0Q29tcG9uZW50cygpLmdldChnZXRDb2x1bW5OYW1lKCkgKyBWQUxVRV9SRU5ERVJFUl9CTE9DS19TVUZGSVgpOwotICAgICAgICBpZiAob2JqVmFsdWVSZW5kZXJlclNvdXJjZSAhPSBudWxsICYmIG9ialZhbHVlUmVuZGVyZXJTb3VyY2UgaW5zdGFuY2VvZiBCbG9jaykKLSAgICAgICAgICAgIHNldFZhbHVlUmVuZGVyZXJTb3VyY2UobmV3IEJsb2NrVGFibGVSZW5kZXJlclNvdXJjZSgoQmxvY2spIG9ialZhbHVlUmVuZGVyZXJTb3VyY2UpKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90YWJsZS9tb2RlbC9jb21tb24vQWJzdHJhY3RUYWJsZURhdGFNb2RlbC5qYXZhIGIvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL21vZGVsL2NvbW1vbi9BYnN0cmFjdFRhYmxlRGF0YU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzZTU0NzcuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL21vZGVsL2NvbW1vbi9BYnN0cmFjdFRhYmxlRGF0YU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5tb2RlbC5jb21tb247Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuQ1RhYmxlRGF0YU1vZGVsRXZlbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsLklUYWJsZURhdGFNb2RlbDsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuSVRhYmxlRGF0YU1vZGVsTGlzdGVuZXI7Ci0KLS8qKgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIGxpc3RlbmVyIHN1cHBvcnQgaW4gdGhlIElUYWJsZURhdGFNb2RlbCBpbnRlcmZhY2UKLSAqIAotICogQHZlcnNpb24gJElkJAotICogQGF1dGhvciBtaW5kYnJpZGdlCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFRhYmxlRGF0YU1vZGVsIGltcGxlbWVudHMgSVRhYmxlRGF0YU1vZGVsCi17Ci0JcHJpdmF0ZSBMaXN0IG1fYXJyTGlzdGVuZXJzOwotCi0JcHVibGljIEFic3RyYWN0VGFibGVEYXRhTW9kZWwoKQotCXsKLQkJbV9hcnJMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIGZpcmVUYWJsZURhdGFNb2RlbEV2ZW50LgotCSAqIEZpcmVzIGEgY2hhbmdlIGV2ZW50IHRvIGFsbCBsaXN0ZW5lcnMKLQkgKiBAcGFyYW0gb2JqRXZlbnQgdGhlIGV2ZW50IHRvIHBhc3MgdG8gdGhlIGxpc3RlbmVycwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVUYWJsZURhdGFNb2RlbEV2ZW50KENUYWJsZURhdGFNb2RlbEV2ZW50IG9iakV2ZW50KQotCXsKLSAgICAgICAgc3luY2hyb25pemVkIChtX2Fyckxpc3RlbmVycykgewotICAgICAgICAgICAgTGlzdCBhcnJFbXB0eVJlZmVyZW5jZXMgPSBudWxsOwotICAgICAgICAKLSAgICAJCWZvciAoSXRlcmF0b3IgaXQgPSBtX2Fyckxpc3RlbmVycy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotICAgIAkJewotICAgICAgICAgICAgICAgIFdlYWtSZWZlcmVuY2Ugb2JqUmVmID0gKFdlYWtSZWZlcmVuY2UpIGl0Lm5leHQoKTsKLSAgICAJCQlJVGFibGVEYXRhTW9kZWxMaXN0ZW5lciBvYmpMaXN0ZW5lciA9Ci0gICAgCQkJCShJVGFibGVEYXRhTW9kZWxMaXN0ZW5lcikgb2JqUmVmLmdldCgpOwotICAgICAgICAgICAgICAgIGlmIChvYmpMaXN0ZW5lciAhPSBudWxsKSAKLSAgICAgICAgICAgICAgICAgICAgb2JqTGlzdGVuZXIudGFibGVEYXRhQ2hhbmdlZChvYmpFdmVudCk7Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhcnJFbXB0eVJlZmVyZW5jZXMgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGFyckVtcHR5UmVmZXJlbmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICAgICAgYXJyRW1wdHlSZWZlcmVuY2VzLmFkZChvYmpSZWYpOwotICAgICAgICAgICAgICAgIH0KLSAgICAJCX0KLQotICAgICAgICAgICAgaWYgKGFyckVtcHR5UmVmZXJlbmNlcyAhPSBudWxsKQotICAgICAgICAgICAgICAgIG1fYXJyTGlzdGVuZXJzLnJlbW92ZUFsbChhcnJFbXB0eVJlZmVyZW5jZXMpOwotICAgICAgICB9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuSVRhYmxlRGF0YU1vZGVsI2FkZFRhYmxlRGF0YU1vZGVsTGlzdGVuZXIoSVRhYmxlRGF0YU1vZGVsTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgYWRkVGFibGVEYXRhTW9kZWxMaXN0ZW5lcihJVGFibGVEYXRhTW9kZWxMaXN0ZW5lciBvYmpMaXN0ZW5lcikKLQl7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobV9hcnJMaXN0ZW5lcnMpIHsKLSAgICAJCW1fYXJyTGlzdGVuZXJzLmFkZChuZXcgV2Vha1JlZmVyZW5jZShvYmpMaXN0ZW5lcikpOwotICAgICAgICB9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuSVRhYmxlRGF0YU1vZGVsI3JlbW92ZVRhYmxlRGF0YU1vZGVsTGlzdGVuZXIoSVRhYmxlRGF0YU1vZGVsTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlVGFibGVEYXRhTW9kZWxMaXN0ZW5lcihJVGFibGVEYXRhTW9kZWxMaXN0ZW5lciBvYmpMaXN0ZW5lcikKLQl7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobV9hcnJMaXN0ZW5lcnMpIHsKLSAgICAgICAgICAgIExpc3QgYXJyRW1wdHlSZWZlcmVuY2VzID0gbnVsbDsKLSAgICAgICAgCi0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gbV9hcnJMaXN0ZW5lcnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBXZWFrUmVmZXJlbmNlIG9ialJlZiA9IChXZWFrUmVmZXJlbmNlKSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgSVRhYmxlRGF0YU1vZGVsTGlzdGVuZXIgb2JqU3RvcmVkTGlzdGVuZXIgPQotICAgICAgICAgICAgICAgICAgICAoSVRhYmxlRGF0YU1vZGVsTGlzdGVuZXIpIG9ialJlZi5nZXQoKTsKLSAgICAgICAgICAgICAgICBpZiAob2JqTGlzdGVuZXIgPT0gb2JqU3RvcmVkTGlzdGVuZXIgfHwgb2JqU3RvcmVkTGlzdGVuZXIgPT0gbnVsbCkgeyAKLSAgICAgICAgICAgICAgICAgICAgaWYgKGFyckVtcHR5UmVmZXJlbmNlcyA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgYXJyRW1wdHlSZWZlcmVuY2VzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgICAgICBhcnJFbXB0eVJlZmVyZW5jZXMuYWRkKG9ialJlZik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoYXJyRW1wdHlSZWZlcmVuY2VzICE9IG51bGwpCi0gICAgICAgICAgICAgICAgbV9hcnJMaXN0ZW5lcnMucmVtb3ZlQWxsKGFyckVtcHR5UmVmZXJlbmNlcyk7Ci0gICAgICAgIH0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90YWJsZS9tb2RlbC9jb21tb24vQWJzdHJhY3RUYWJsZU1vZGVsLmphdmEgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdGFibGUvbW9kZWwvY29tbW9uL0Fic3RyYWN0VGFibGVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGQ5NjRmLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90YWJsZS9tb2RlbC9jb21tb24vQWJzdHJhY3RUYWJsZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsLmNvbW1vbjsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsLklUYWJsZU1vZGVsOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5tb2RlbC5JVGFibGVQYWdpbmdTdGF0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuSVRhYmxlU29ydGluZ1N0YXRlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5tb2RlbC5zaW1wbGUuU2ltcGxlVGFibGVTdGF0ZTsKLQotLyoqCi0gKiBBIGJhc2UgdGFibGUgbW9kZWwgdGhhdCBpbXBsZW1lbnRzIHRoZSBoYW5kbGluZyBvZiB0aGUgbW9kZWwgc3RhdGUuCi0gKiBVc2VkIGJ5IG1vc3Qgc3RhbmRhcmQgSVRhYmxlTW9kZWwgaW1wbGVtZW50YXRpb25zLgotICogCi0gKiBAdmVyc2lvbiAkSWQkCi0gKiBAYXV0aG9yIG1pbmRicmlkZ2UKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VGFibGVNb2RlbCBpbXBsZW1lbnRzIElUYWJsZU1vZGVsLCBTZXJpYWxpemFibGUKLXsKLSAgICBwcml2YXRlIFNpbXBsZVRhYmxlU3RhdGUgbV9vYmpUYWJsZVN0YXRlOwotCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0VGFibGVNb2RlbCgpCi0gICAgewotICAgICAgICB0aGlzKG5ldyBTaW1wbGVUYWJsZVN0YXRlKCkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBBYnN0cmFjdFRhYmxlTW9kZWwoU2ltcGxlVGFibGVTdGF0ZSBvYmpUYWJsZVN0YXRlKQotICAgIHsKLSAgICAgICAgbV9vYmpUYWJsZVN0YXRlID0gb2JqVGFibGVTdGF0ZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuSVRhYmxlTW9kZWwjZ2V0UGFnaW5nU3RhdGUoKQotICAgICAqLwotICAgIHB1YmxpYyBJVGFibGVQYWdpbmdTdGF0ZSBnZXRQYWdpbmdTdGF0ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0U3RhdGUoKS5nZXRQYWdpbmdTdGF0ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsLklUYWJsZU1vZGVsI2dldFNvcnRpbmdTdGF0ZSgpCi0gICAgICovCi0gICAgcHVibGljIElUYWJsZVNvcnRpbmdTdGF0ZSBnZXRTb3J0aW5nU3RhdGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldFN0YXRlKCkuZ2V0U29ydGluZ1N0YXRlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdGFibGVTdGF0ZS4KLSAgICAgKiBAcmV0dXJuIFNpbXBsZVRhYmxlU3RhdGUKLSAgICAgKi8KLSAgICBwdWJsaWMgU2ltcGxlVGFibGVTdGF0ZSBnZXRTdGF0ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbV9vYmpUYWJsZVN0YXRlOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBpbnQgZ2V0Um93Q291bnQoKTsKLSAgICAKLSAgICBwdWJsaWMgaW50IGdldFBhZ2VDb3VudCgpCi0gICAgewotICAgICAgICBpbnQgblJvd0NvdW50ID0gZ2V0Um93Q291bnQoKTsKLSAgICAgICAgaWYgKG5Sb3dDb3VudCA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIDE7Ci0KLSAgICAgICAgaW50IG5QYWdlU2l6ZSA9IGdldFBhZ2luZ1N0YXRlKCkuZ2V0UGFnZVNpemUoKTsKLSAgICAgICAgaWYgKG5QYWdlU2l6ZSA8PSAwKQotICAgICAgICAgICAgcmV0dXJuIDE7Ci0KLSAgICAgICAgcmV0dXJuIChuUm93Q291bnQgLSAxKSAvIG5QYWdlU2l6ZSArIDE7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL21vZGVsL2NvbW1vbi9BcnJheUl0ZXJhdG9yLmphdmEgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdGFibGUvbW9kZWwvY29tbW9uL0FycmF5SXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTUwZjBkYy4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdGFibGUvbW9kZWwvY29tbW9uL0FycmF5SXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuY29tbW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotCi0vKioKLSAqIEB2ZXJzaW9uICRJZCQKLSAqIEBhdXRob3IgbWluZGJyaWRnZQotICovCi1wdWJsaWMgY2xhc3MgQXJyYXlJdGVyYXRvciBpbXBsZW1lbnRzIEl0ZXJhdG9yCi17Ci0JcHJpdmF0ZSBPYmplY3RbXSBtX2FyclZhbHVlczsKLQlwcml2YXRlIGludCBtX25Gcm9tOwotCXByaXZhdGUgaW50IG1fblRvOwotCXByaXZhdGUgaW50IG1fbkN1cnJlbnQ7Ci0KLQlwdWJsaWMgQXJyYXlJdGVyYXRvcihPYmplY3RbXSBhcnJWYWx1ZXMpCi0JewotCQl0aGlzKGFyclZhbHVlcywgMCwgYXJyVmFsdWVzLmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIEFycmF5SXRlcmF0b3IoT2JqZWN0W10gYXJyVmFsdWVzLCBpbnQgbkZyb20sIGludCBuVG8pCi0JewotCQltX2FyclZhbHVlcyA9IGFyclZhbHVlczsKLQkJbV9uRnJvbSA9IG5Gcm9tOwotCQltX25UbyA9IG5UbzsKLQotCQlpZiAobV9uRnJvbSA8IDApCi0JCQltX25Gcm9tID0gMDsKLQkJaWYgKG1fblRvIDwgbV9uRnJvbSkKLQkJCW1fblRvID0gbV9uRnJvbTsKLQkJaWYgKG1fblRvID4gbV9hcnJWYWx1ZXMubGVuZ3RoKQotCQkJbV9uVG8gPSBtX2FyclZhbHVlcy5sZW5ndGg7Ci0KLQkJbV9uQ3VycmVudCA9IG1fbkZyb207Ci0JfQotCi0JLyoqCi0JICogQHNlZSBqYXZhLnV0aWwuSXRlcmF0b3IjaGFzTmV4dCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpCi0JewotCQlyZXR1cm4gbV9uQ3VycmVudCA8IG1fblRvOwotCX0KLQotCS8qKgotCSAqIEBzZWUgamF2YS51dGlsLkl0ZXJhdG9yI25leHQoKQotCSAqLwotCXB1YmxpYyBPYmplY3QgbmV4dCgpCi0JewotCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiaW5kZXg6ICIgKyBtX25DdXJyZW50ICsgIiAgIHNpemU6ICIgKyBtX2FyclZhbHVlcy5sZW5ndGggKyAiICB0bzogIiArIG1fblRvKTsKLQkJaWYgKCFoYXNOZXh0KCkpCi0JCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotCQlyZXR1cm4gbV9hcnJWYWx1ZXNbbV9uQ3VycmVudCsrXTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGphdmEudXRpbC5JdGVyYXRvciNyZW1vdmUoKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZSgpCi0JewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90YWJsZS9tb2RlbC9jb21tb24vQmFzaWNUYWJsZU1vZGVsV3JhcC5qYXZhIGIvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL21vZGVsL2NvbW1vbi9CYXNpY1RhYmxlTW9kZWxXcmFwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwZTAxMTguLjAwMDAwMDAKLS0tIGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL21vZGVsL2NvbW1vbi9CYXNpY1RhYmxlTW9kZWxXcmFwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsLmNvbW1vbjsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5tb2RlbC5JQmFzaWNUYWJsZU1vZGVsOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5tb2RlbC5JVGFibGVDb2x1bW47Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsLklUYWJsZUNvbHVtbk1vZGVsOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5tb2RlbC5zaW1wbGUuU2ltcGxlVGFibGVTdGF0ZTsKLQotLyoqCi0gKiBAdmVyc2lvbiAkSWQkCi0gKiBAYXV0aG9yIG1pbmRicmlkZ2UKLSAqLwotcHVibGljIGNsYXNzIEJhc2ljVGFibGVNb2RlbFdyYXAgZXh0ZW5kcyBBYnN0cmFjdFRhYmxlTW9kZWwgCi17Ci0gICAgcHJpdmF0ZSBJQmFzaWNUYWJsZU1vZGVsIG1fb2JqQmFzaWNUYWJsZU1vZGVsOwotICAgIHByaXZhdGUgSVRhYmxlQ29sdW1uTW9kZWwgbV9vYmpUYWJsZUNvbHVtbk1vZGVsOwotCi0gICAgcHVibGljIEJhc2ljVGFibGVNb2RlbFdyYXAoSUJhc2ljVGFibGVNb2RlbCBvYmpCYXNpY1RhYmxlTW9kZWwsIElUYWJsZUNvbHVtbk1vZGVsIG9iakNvbHVtbk1vZGVsKQotICAgIHsKLSAgICAgICAgdGhpcyhvYmpCYXNpY1RhYmxlTW9kZWwsIG9iakNvbHVtbk1vZGVsLCBuZXcgU2ltcGxlVGFibGVTdGF0ZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQmFzaWNUYWJsZU1vZGVsV3JhcChJQmFzaWNUYWJsZU1vZGVsIG9iakJhc2ljVGFibGVNb2RlbCwgSVRhYmxlQ29sdW1uTW9kZWwgb2JqQ29sdW1uTW9kZWwsIFNpbXBsZVRhYmxlU3RhdGUgb2JqU3RhdGUpCi0gICAgewotICAgICAgICBzdXBlcihvYmpTdGF0ZSk7Ci0gICAgICAgIG1fb2JqQmFzaWNUYWJsZU1vZGVsID0gb2JqQmFzaWNUYWJsZU1vZGVsOwotICAgICAgICBtX29ialRhYmxlQ29sdW1uTW9kZWwgPSBvYmpDb2x1bW5Nb2RlbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5tb2RlbC5JVGFibGVNb2RlbCNnZXRDb2x1bW5Nb2RlbCgpCi0gICAgICovCi0gICAgcHVibGljIElUYWJsZUNvbHVtbk1vZGVsIGdldENvbHVtbk1vZGVsKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX29ialRhYmxlQ29sdW1uTW9kZWw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuY29tbW9uLkFic3RyYWN0VGFibGVNb2RlbCNnZXRSb3dDb3VudCgpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGludCBnZXRSb3dDb3VudCgpCi0gICAgewotICAgICAgICByZXR1cm4gbV9vYmpCYXNpY1RhYmxlTW9kZWwuZ2V0Um93Q291bnQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5tb2RlbC5JVGFibGVNb2RlbCNnZXRDdXJyZW50UGFnZVJvd3MoKQotICAgICAqLwotICAgIHB1YmxpYyBJdGVyYXRvciBnZXRDdXJyZW50UGFnZVJvd3MoKQotICAgIHsKLSAgICAgICAgaW50IG5QYWdlU2l6ZSA9IGdldFBhZ2luZ1N0YXRlKCkuZ2V0UGFnZVNpemUoKTsKLSAgICAgICAgaWYgKG5QYWdlU2l6ZSA8PSAwKQotICAgICAgICAgICAgblBhZ2VTaXplID0gZ2V0Um93Q291bnQoKTsKLQotICAgICAgICBpbnQgbkN1cnJlbnRQYWdlID0gZ2V0UGFnaW5nU3RhdGUoKS5nZXRDdXJyZW50UGFnZSgpOwotICAgICAgICBpbnQgbkZyb20gPSBuQ3VycmVudFBhZ2UgKiBuUGFnZVNpemU7Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgc3RyU29ydENvbHVtbiA9IGdldFNvcnRpbmdTdGF0ZSgpLmdldFNvcnRDb2x1bW4oKTsKLSAgICAgICAgSVRhYmxlQ29sdW1uIG9ialNvcnRDb2x1bW4gPSBnZXRDb2x1bW5Nb2RlbCgpLmdldENvbHVtbihzdHJTb3J0Q29sdW1uKTsgCi0gICAgICAgIGJvb2xlYW4gYlNvcnRPcmRlciA9IGdldFNvcnRpbmdTdGF0ZSgpLmdldFNvcnRPcmRlcigpOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIG1fb2JqQmFzaWNUYWJsZU1vZGVsLmdldEN1cnJlbnRQYWdlUm93cyhuRnJvbSwgblBhZ2VTaXplLCBvYmpTb3J0Q29sdW1uLCBiU29ydE9yZGVyKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90YWJsZS9tb2RlbC9jb21tb24vQmxvY2tUYWJsZVJlbmRlcmVyU291cmNlLmphdmEgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdGFibGUvbW9kZWwvY29tbW9uL0Jsb2NrVGFibGVSZW5kZXJlclNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjJhOTlhLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90YWJsZS9tb2RlbC9jb21tb24vQmxvY2tUYWJsZVJlbmRlcmVyU291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5tb2RlbC5jb21tb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZW5kZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVxdWVzdEN5Y2xlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuY29tcG9uZW50cy5CbG9jazsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbXBvbmVudHMuQmxvY2tSZW5kZXJlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuSVRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5tb2RlbC5JVGFibGVNb2RlbFNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuSVRhYmxlUmVuZGVyZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuSVRhYmxlUmVuZGVyZXJTb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS51dGlsLkNvbXBvbmVudEFkZHJlc3M7Ci0KLS8qKgotICogCi0gKiBAdmVyc2lvbiAkSWQkCi0gKiBAYXV0aG9yIG1pbmRicmlkZ2UKLSAqIEBzaW5jZSAyLjMKLSAqLwotcHVibGljIGNsYXNzIEJsb2NrVGFibGVSZW5kZXJlclNvdXJjZSBpbXBsZW1lbnRzIElUYWJsZVJlbmRlcmVyU291cmNlCi17Ci0JcHJpdmF0ZSBDb21wb25lbnRBZGRyZXNzIG1fb2JqQmxvY2tBZGRyZXNzOwotCXByaXZhdGUgQ29tcG9uZW50QWRkcmVzcyBtX29iakxpc3RlbmVyQWRkcmVzczsKLQotCXB1YmxpYyBCbG9ja1RhYmxlUmVuZGVyZXJTb3VyY2UoQmxvY2sgb2JqQmxvY2spCi0JewotCQl0aGlzKG5ldyBDb21wb25lbnRBZGRyZXNzKG9iakJsb2NrKSk7Ci0JfQotCi0JcHVibGljIEJsb2NrVGFibGVSZW5kZXJlclNvdXJjZSgKLQkJQmxvY2sgb2JqQmxvY2ssCi0JCUlUYWJsZVJlbmRlcmVyTGlzdGVuZXIgb2JqTGlzdGVuZXIpCi0JewotCQl0aGlzKG5ldyBDb21wb25lbnRBZGRyZXNzKG9iakJsb2NrKSwgbmV3IENvbXBvbmVudEFkZHJlc3Mob2JqTGlzdGVuZXIpKTsKLQl9Ci0KLQlwdWJsaWMgQmxvY2tUYWJsZVJlbmRlcmVyU291cmNlKENvbXBvbmVudEFkZHJlc3Mgb2JqQmxvY2tBZGRyZXNzKQotCXsKLQkJdGhpcyhvYmpCbG9ja0FkZHJlc3MsIG51bGwpOwotCX0KLQotCXB1YmxpYyBCbG9ja1RhYmxlUmVuZGVyZXJTb3VyY2UoCi0JCUNvbXBvbmVudEFkZHJlc3Mgb2JqQmxvY2tBZGRyZXNzLAotCQlDb21wb25lbnRBZGRyZXNzIG9iakxpc3RlbmVyQWRkcmVzcykKLQl7Ci0JCXNldEJsb2NrQWRkcmVzcyhvYmpCbG9ja0FkZHJlc3MpOwotCQlzZXRMaXN0ZW5lckFkZHJlc3Mob2JqTGlzdGVuZXJBZGRyZXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5tb2RlbC5JVGFibGVSZW5kZXJlclNvdXJjZSNnZXRSZW5kZXJlcihJUmVxdWVzdEN5Y2xlLCBJVGFibGVNb2RlbFNvdXJjZSwgSVRhYmxlQ29sdW1uLCBPYmplY3QpCi0JICovCi0JcHVibGljIElSZW5kZXIgZ2V0UmVuZGVyZXIoCi0JCUlSZXF1ZXN0Q3ljbGUgb2JqQ3ljbGUsCi0JCUlUYWJsZU1vZGVsU291cmNlIG9ialNvdXJjZSwKLQkJSVRhYmxlQ29sdW1uIG9iakNvbHVtbiwKLQkJT2JqZWN0IG9ialJvdykKLQl7Ci0JCUNvbXBvbmVudEFkZHJlc3Mgb2JqTGlzdGVuZXJBZGRyZXNzID0gZ2V0TGlzdGVuZXJBZGRyZXNzKCk7Ci0JCWlmIChvYmpMaXN0ZW5lckFkZHJlc3MgIT0gbnVsbCkKLQkJewotCQkJSVRhYmxlUmVuZGVyZXJMaXN0ZW5lciBvYmpMaXN0ZW5lciA9Ci0JCQkJKElUYWJsZVJlbmRlcmVyTGlzdGVuZXIpIG9iakxpc3RlbmVyQWRkcmVzcy5maW5kQ29tcG9uZW50KAotCQkJCQlvYmpDeWNsZSk7Ci0JCQlvYmpMaXN0ZW5lci5pbml0aWFsaXplUmVuZGVyZXIoCi0JCQkJb2JqQ3ljbGUsCi0JCQkJb2JqU291cmNlLAotCQkJCW9iakNvbHVtbiwKLQkJCQlvYmpSb3cpOwotCQl9Ci0KLQkJQmxvY2sgb2JqQmxvY2sgPSAoQmxvY2spIGdldEJsb2NrQWRkcmVzcygpLmZpbmRDb21wb25lbnQob2JqQ3ljbGUpOwotCQlyZXR1cm4gbmV3IEJsb2NrUmVuZGVyZXIob2JqQmxvY2spOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGJsb2NrQWRkcmVzcy4KLQkgKiBAcmV0dXJuIENvbXBvbmVudEFkZHJlc3MKLQkgKi8KLQlwdWJsaWMgQ29tcG9uZW50QWRkcmVzcyBnZXRCbG9ja0FkZHJlc3MoKQotCXsKLQkJcmV0dXJuIG1fb2JqQmxvY2tBZGRyZXNzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGJsb2NrQWRkcmVzcy4KLQkgKiBAcGFyYW0gYmxvY2tBZGRyZXNzIFRoZSBibG9ja0FkZHJlc3MgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0QmxvY2tBZGRyZXNzKENvbXBvbmVudEFkZHJlc3MgYmxvY2tBZGRyZXNzKQotCXsKLQkJbV9vYmpCbG9ja0FkZHJlc3MgPSBibG9ja0FkZHJlc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGlzdGVuZXJBZGRyZXNzLgotCSAqIEByZXR1cm4gQ29tcG9uZW50QWRkcmVzcwotCSAqLwotCXB1YmxpYyBDb21wb25lbnRBZGRyZXNzIGdldExpc3RlbmVyQWRkcmVzcygpCi0JewotCQlyZXR1cm4gbV9vYmpMaXN0ZW5lckFkZHJlc3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbGlzdGVuZXJBZGRyZXNzLgotCSAqIEBwYXJhbSBsaXN0ZW5lckFkZHJlc3MgVGhlIGxpc3RlbmVyQWRkcmVzcyB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMaXN0ZW5lckFkZHJlc3MoQ29tcG9uZW50QWRkcmVzcyBsaXN0ZW5lckFkZHJlc3MpCi0JewotCQltX29iakxpc3RlbmVyQWRkcmVzcyA9IGxpc3RlbmVyQWRkcmVzczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90YWJsZS9tb2RlbC9jb21tb24vQ29tcG9uZW50VGFibGVSZW5kZXJlclNvdXJjZS5qYXZhIGIvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL21vZGVsL2NvbW1vbi9Db21wb25lbnRUYWJsZVJlbmRlcmVyU291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhOWMyZjEuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL21vZGVsL2NvbW1vbi9Db21wb25lbnRUYWJsZVJlbmRlcmVyU291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlbmRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZXF1ZXN0Q3ljbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsLklUYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuSVRhYmxlTW9kZWxTb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsLklUYWJsZVJlbmRlcmVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsLklUYWJsZVJlbmRlcmVyU291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkudXRpbC5Db21wb25lbnRBZGRyZXNzOwotCi0vKioKLSAqIAotICogQHZlcnNpb24gJElkJAotICogQGF1dGhvciBtaW5kYnJpZGdlCi0gKiBAc2luY2UgMi4zCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21wb25lbnRUYWJsZVJlbmRlcmVyU291cmNlIGltcGxlbWVudHMgSVRhYmxlUmVuZGVyZXJTb3VyY2UKLXsKLQlwcml2YXRlIENvbXBvbmVudEFkZHJlc3MgbV9vYmpDb21wb25lbnRBZGRyZXNzOwotCi0JcHVibGljIENvbXBvbmVudFRhYmxlUmVuZGVyZXJTb3VyY2UoSVRhYmxlUmVuZGVyZXJMaXN0ZW5lciBvYmpDb21wb25lbnQpCi0JewotCQl0aGlzKG5ldyBDb21wb25lbnRBZGRyZXNzKG9iakNvbXBvbmVudCkpOwotCX0KLQotCXB1YmxpYyBDb21wb25lbnRUYWJsZVJlbmRlcmVyU291cmNlKENvbXBvbmVudEFkZHJlc3Mgb2JqQ29tcG9uZW50QWRkcmVzcykKLQl7Ci0JCXNldENvbXBvbmVudEFkZHJlc3Mob2JqQ29tcG9uZW50QWRkcmVzcyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuSVRhYmxlUmVuZGVyZXJTb3VyY2UjZ2V0UmVuZGVyZXIoSVJlcXVlc3RDeWNsZSwgSVRhYmxlTW9kZWxTb3VyY2UsIElUYWJsZUNvbHVtbiwgT2JqZWN0KQotCSAqLwotCXB1YmxpYyBJUmVuZGVyIGdldFJlbmRlcmVyKAotCQlJUmVxdWVzdEN5Y2xlIG9iakN5Y2xlLAotCQlJVGFibGVNb2RlbFNvdXJjZSBvYmpTb3VyY2UsCi0JCUlUYWJsZUNvbHVtbiBvYmpDb2x1bW4sCi0JCU9iamVjdCBvYmpSb3cpCi0JewotCQlJVGFibGVSZW5kZXJlckxpc3RlbmVyIG9iakNvbXBvbmVudCA9Ci0JCQkoSVRhYmxlUmVuZGVyZXJMaXN0ZW5lcikgZ2V0Q29tcG9uZW50QWRkcmVzcygpLmZpbmRDb21wb25lbnQoCi0JCQkJb2JqQ3ljbGUpOwotCi0JCW9iakNvbXBvbmVudC5pbml0aWFsaXplUmVuZGVyZXIob2JqQ3ljbGUsIG9ialNvdXJjZSwgb2JqQ29sdW1uLCBvYmpSb3cpOwotCi0JCXJldHVybiBvYmpDb21wb25lbnQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGlzdGVuZXJBZGRyZXNzLgotCSAqIEByZXR1cm4gQ29tcG9uZW50QWRkcmVzcwotCSAqLwotCXB1YmxpYyBDb21wb25lbnRBZGRyZXNzIGdldENvbXBvbmVudEFkZHJlc3MoKQotCXsKLQkJcmV0dXJuIG1fb2JqQ29tcG9uZW50QWRkcmVzczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBsaXN0ZW5lckFkZHJlc3MuCi0JICogQHBhcmFtIGxpc3RlbmVyQWRkcmVzcyBUaGUgbGlzdGVuZXJBZGRyZXNzIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbXBvbmVudEFkZHJlc3MoQ29tcG9uZW50QWRkcmVzcyBsaXN0ZW5lckFkZHJlc3MpCi0JewotCQltX29iakNvbXBvbmVudEFkZHJlc3MgPSBsaXN0ZW5lckFkZHJlc3M7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdGFibGUvbW9kZWwvY29tbW9uL0Z1bGxUYWJsZVNlc3Npb25TdGF0ZU1hbmFnZXIuamF2YSBiL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90YWJsZS9tb2RlbC9jb21tb24vRnVsbFRhYmxlU2Vzc2lvblN0YXRlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjExYmJkLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90YWJsZS9tb2RlbC9jb21tb24vRnVsbFRhYmxlU2Vzc2lvblN0YXRlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5tb2RlbC5jb21tb247Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5tb2RlbC5JVGFibGVNb2RlbDsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuSVRhYmxlU2Vzc2lvblN0YXRlTWFuYWdlcjsKLQotLyoqCi0gKiBBIHNpbXBsZSBJVGFibGVTZXNzaW9uU3RhdGVNYW5hZ2VyIGltcGxlbWVudGF0aW9uIAotICogdGhhdCBzYXZlcyB0aGUgZW50aXJlIHRhYmxlIG1vZGVsIGludG8gdGhlIHNlc3Npb24uCi0gKiAKLSAqIEB2ZXJzaW9uICRJZCQKLSAqIEBhdXRob3IgbWluZGJyaWRnZQotICovCi1wdWJsaWMgY2xhc3MgRnVsbFRhYmxlU2Vzc2lvblN0YXRlTWFuYWdlciBpbXBsZW1lbnRzIElUYWJsZVNlc3Npb25TdGF0ZU1hbmFnZXIKLXsKLQotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgRnVsbFRhYmxlU2Vzc2lvblN0YXRlTWFuYWdlciBGVUxMX1NUQVRFX01BTkFHRVIgPQotICAgICAgICBuZXcgRnVsbFRhYmxlU2Vzc2lvblN0YXRlTWFuYWdlcigpOwotCi0JLyoqCi0JICogQHNlZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuSVRhYmxlU2Vzc2lvblN0YXRlTWFuYWdlciNnZXRTZXNzaW9uU3RhdGUoSVRhYmxlTW9kZWwpCi0JICovCi0JcHVibGljIFNlcmlhbGl6YWJsZSBnZXRTZXNzaW9uU3RhdGUoSVRhYmxlTW9kZWwgb2JqTW9kZWwpCi0JewotCQlyZXR1cm4gKFNlcmlhbGl6YWJsZSkgb2JqTW9kZWw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuSVRhYmxlU2Vzc2lvblN0YXRlTWFuYWdlciNyZWNyZWF0ZVRhYmxlTW9kZWwoU2VyaWFsaXphYmxlKQotCSAqLwotCXB1YmxpYyBJVGFibGVNb2RlbCByZWNyZWF0ZVRhYmxlTW9kZWwoU2VyaWFsaXphYmxlIG9ialN0YXRlKQotCXsKLQkJcmV0dXJuIChJVGFibGVNb2RlbCkgb2JqU3RhdGU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdGFibGUvbW9kZWwvY29tbW9uL051bGxUYWJsZVNlc3Npb25TdGF0ZU1hbmFnZXIuamF2YSBiL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90YWJsZS9tb2RlbC9jb21tb24vTnVsbFRhYmxlU2Vzc2lvblN0YXRlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjkyMWYxLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90YWJsZS9tb2RlbC9jb21tb24vTnVsbFRhYmxlU2Vzc2lvblN0YXRlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5tb2RlbC5jb21tb247Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5tb2RlbC5JVGFibGVNb2RlbDsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuSVRhYmxlU2Vzc2lvblN0YXRlTWFuYWdlcjsKLQotLyoqCi0gKiBBIHNpbXBsZSBJVGFibGVTZXNzaW9uU3RhdGVNYW5hZ2VyIGltcGxlbWVudGF0aW9uIAotICogdGhhdCBzYXZlcyBub3RoaW5nIGF0IGFsbCBpbnRvIHRoZSBzZXNzaW9uLgotICogCi0gKiBAdmVyc2lvbiAkSWQkCi0gKiBAYXV0aG9yIG1pbmRicmlkZ2UKLSAqLwotcHVibGljIGNsYXNzIE51bGxUYWJsZVNlc3Npb25TdGF0ZU1hbmFnZXIgaW1wbGVtZW50cyBJVGFibGVTZXNzaW9uU3RhdGVNYW5hZ2VyCi17Ci0gICAgCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBOdWxsVGFibGVTZXNzaW9uU3RhdGVNYW5hZ2VyIE5VTExfU1RBVEVfTUFOQUdFUiA9Ci0gICAgICAgIG5ldyBOdWxsVGFibGVTZXNzaW9uU3RhdGVNYW5hZ2VyKCk7Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5tb2RlbC5JVGFibGVTZXNzaW9uU3RhdGVNYW5hZ2VyI2dldFNlc3Npb25TdGF0ZShJVGFibGVNb2RlbCkKLQkgKi8KLQlwdWJsaWMgU2VyaWFsaXphYmxlIGdldFNlc3Npb25TdGF0ZShJVGFibGVNb2RlbCBvYmpNb2RlbCkKLQl7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsLklUYWJsZVNlc3Npb25TdGF0ZU1hbmFnZXIjcmVjcmVhdGVUYWJsZU1vZGVsKFNlcmlhbGl6YWJsZSkKLQkgKi8KLQlwdWJsaWMgSVRhYmxlTW9kZWwgcmVjcmVhdGVUYWJsZU1vZGVsKFNlcmlhbGl6YWJsZSBvYmpTdGF0ZSkKLQl7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL21vZGVsL2NvbW1vbi9SZXZlcnNlQ29tcGFyYXRvci5qYXZhIGIvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL21vZGVsL2NvbW1vbi9SZXZlcnNlQ29tcGFyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjIyMTU2Li4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90YWJsZS9tb2RlbC9jb21tb24vUmV2ZXJzZUNvbXBhcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuY29tbW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci0KLS8qKgotICogQHZlcnNpb24gJElkJAotICogQGF1dGhvciBtaW5kYnJpZGdlCi0gKgotICovCi1wdWJsaWMgY2xhc3MgUmV2ZXJzZUNvbXBhcmF0b3IgaW1wbGVtZW50cyBDb21wYXJhdG9yCi17Ci0JcHJpdmF0ZSBDb21wYXJhdG9yIG1fb2JqQ29tcGFyYXRvcjsKLQotCXB1YmxpYyBSZXZlcnNlQ29tcGFyYXRvcihDb21wYXJhdG9yIG9iakNvbXBhcmF0b3IpCi0JewotCQltX29iakNvbXBhcmF0b3IgPSBvYmpDb21wYXJhdG9yOwotCX0KLQotCS8qKgotCSAqIEBzZWUgamF2YS51dGlsLkNvbXBhcmF0b3IjY29tcGFyZShPYmplY3QsIE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG9ialZhbHVlMSwgT2JqZWN0IG9ialZhbHVlMikKLQl7Ci0JCXJldHVybiAtbV9vYmpDb21wYXJhdG9yLmNvbXBhcmUob2JqVmFsdWUxLCBvYmpWYWx1ZTIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL21vZGVsL29nbmwvRXhwcmVzc2lvblRhYmxlQ29sdW1uLmphdmEgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdGFibGUvbW9kZWwvb2dubC9FeHByZXNzaW9uVGFibGVDb2x1bW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBiZWI5MS4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdGFibGUvbW9kZWwvb2dubC9FeHByZXNzaW9uVGFibGVDb2x1bW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwub2dubDsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5tb2RlbC5zaW1wbGUuU2ltcGxlVGFibGVDb2x1bW47Ci0KLS8qKgotICogQGF1dGhvciBtaW5kYnJpZGdlCi0gKgotICovCi1wdWJsaWMgY2xhc3MgRXhwcmVzc2lvblRhYmxlQ29sdW1uIGV4dGVuZHMgU2ltcGxlVGFibGVDb2x1bW4KLXsKLSAgICBwdWJsaWMgRXhwcmVzc2lvblRhYmxlQ29sdW1uKFN0cmluZyBzdHJDb2x1bW5OYW1lLCBTdHJpbmcgc3RyRXhwcmVzc2lvbikKLSAgICB7Ci0gICAgICAgIHRoaXMoc3RyQ29sdW1uTmFtZSwgc3RyRXhwcmVzc2lvbiwgZmFsc2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBFeHByZXNzaW9uVGFibGVDb2x1bW4oU3RyaW5nIHN0ckNvbHVtbk5hbWUsIFN0cmluZyBzdHJFeHByZXNzaW9uLCBib29sZWFuIGJTb3J0YWJsZSkKLSAgICB7Ci0gICAgICAgIHRoaXMoc3RyQ29sdW1uTmFtZSwgc3RyQ29sdW1uTmFtZSwgc3RyRXhwcmVzc2lvbiwgYlNvcnRhYmxlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRXhwcmVzc2lvblRhYmxlQ29sdW1uKFN0cmluZyBzdHJDb2x1bW5OYW1lLCBTdHJpbmcgc3RyRGlzcGxheU5hbWUsIFN0cmluZyBzdHJFeHByZXNzaW9uKQotICAgIHsKLSAgICAgICAgdGhpcyhzdHJDb2x1bW5OYW1lLCBzdHJEaXNwbGF5TmFtZSwgc3RyRXhwcmVzc2lvbiwgZmFsc2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBFeHByZXNzaW9uVGFibGVDb2x1bW4oCi0gICAgICAgIFN0cmluZyBzdHJDb2x1bW5OYW1lLAotICAgICAgICBTdHJpbmcgc3RyRGlzcGxheU5hbWUsCi0gICAgICAgIFN0cmluZyBzdHJFeHByZXNzaW9uLAotICAgICAgICBib29sZWFuIGJTb3J0YWJsZSkKLSAgICB7Ci0gICAgICAgIHN1cGVyKHN0ckNvbHVtbk5hbWUsIHN0ckRpc3BsYXlOYW1lLCBiU29ydGFibGUpOwotICAgICAgICBzZXRFdmFsdWF0b3IobmV3IE9nbmxUYWJsZUNvbHVtbkV2YWx1YXRvcihzdHJFeHByZXNzaW9uKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL21vZGVsL29nbmwvRXhwcmVzc2lvblRhYmxlQ29sdW1uTW9kZWwuamF2YSBiL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90YWJsZS9tb2RlbC9vZ25sL0V4cHJlc3Npb25UYWJsZUNvbHVtbk1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0ZTI2YTkuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL21vZGVsL29nbmwvRXhwcmVzc2lvblRhYmxlQ29sdW1uTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsLm9nbmw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuSVRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5tb2RlbC5zaW1wbGUuU2ltcGxlVGFibGVDb2x1bW5Nb2RlbDsKLQotLyoqCi0gKiBAYXV0aG9yIG1pbmRicmlkZ2UKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHByZXNzaW9uVGFibGVDb2x1bW5Nb2RlbCBleHRlbmRzIFNpbXBsZVRhYmxlQ29sdW1uTW9kZWwKLXsKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgdGFibGUgY29sdW1uIG1vZGVsIGNvbnRhaW50aW5nIE9HTkwgZXhwcmVzc2lvbiBjb2x1bW5zLiA8YnI+Ci0gICAgICogVGhlIGRhdGEgZm9yIHRoZSBjb2x1bW5zIGlzIHByb3ZpZGVkIGluIHRoZSBmb3JtIG9mIGEgc3RyaW5nIGFycmF5LAotICAgICAqIHdoZXJlIHRoZSBpbmZvIG9mIGVhY2ggY29sdW1uIGlzIHN0b3JlZCBpbiB0d28gY29uc2VjdXRpdmUgZmllbGRzIGluCi0gICAgICogdGhlIGFycmF5LCBoZW5jZSBpdHMgc2l6ZSBtdXN0IGJlIGV2ZW4uIFRoZSBleHBlY3RlZCBpbmZvIGlzIHRoZSBmb2xsb3dpbmc6Ci0gICAgICogPHVsPgotICAgICAqICAgPGxpPiBDb2x1bW4gTmFtZQotICAgICAqICAgPGxpPiBPR05MIGV4cHJlc3Npb24KLSAgICAgKiA8L3VsPgotICAgICAqIEBwYXJhbSBhcnJDb2x1bW5JbmZvIFRoZSBpbmZvcm1hdGlvbiB0byBjb25zdHJ1Y3QgdGhlIGNvbHVtbnMgZnJvbQotICAgICAqIEBwYXJhbSBiU29ydGVkIFdoZXRoZXIgYWxsIGNvbHVtbnMgYXJlIHNvcnRlZCBvciBub3QKLSAgICAgKi8KLSAgICBwdWJsaWMgRXhwcmVzc2lvblRhYmxlQ29sdW1uTW9kZWwoU3RyaW5nW10gYXJyQ29sdW1uSW5mbywgYm9vbGVhbiBiU29ydGVkKQotICAgIHsKLSAgICAgICAgdGhpcyhjb252ZXJ0VG9EZXRhaWxlZEFycmF5KGFyckNvbHVtbkluZm8sIGJTb3J0ZWQpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgdGFibGUgY29sdW1uIG1vZGVsIGNvbnRhaW50aW5nIE9HTkwgZXhwcmVzc2lvbiBjb2x1bW5zLiA8YnI+Ci0gICAgICogVGhlIGRhdGEgZm9yIHRoZSBjb2x1bW5zIGlzIHByb3ZpZGVkIGluIHRoZSBmb3JtIG9mIGEgc3RyaW5nIGFycmF5LAotICAgICAqIHdoZXJlIHRoZSBpbmZvIG9mIGVhY2ggY29sdW1uIGlzIHN0b3JlZCBpbiBmb3VyIGNvbnNlY3V0aXZlIGZpZWxkcyBpbgotICAgICAqIHRoZSBhcnJheSwgaGVuY2UgaXRzIHNpemUgbXVzdCBiZSBkaXZpc2libGUgYnkgNC4gPGJyPgotICAgICAqIFRoZSBleHBlY3RlZCBpbmZvIGlzIHRoZSBmb2xsb3dpbmc6Ci0gICAgICogPHVsPgotICAgICAqICAgPGxpPiBDb2x1bW4gTmFtZQotICAgICAqICAgPGxpPiBEaXNwbGF5IE5hbWUKLSAgICAgKiAgIDxsaT4gT0dOTCBleHByZXNzaW9uCi0gICAgICogICA8bGk+IFNvcnRpbmcgb2YgdGhlIGNvbHVtbi4gVGhpcyBpcyBlaXRoZXIgYSBCb29sZWFuLCAKLSAgICAgKiAgICAgICAgb3IgYSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBib29sZWFuLgotICAgICAqIDwvdWw+Ci0gICAgICogQHBhcmFtIGFyckNvbHVtbkluZm8KLSAgICAgKi8KLSAgICBwdWJsaWMgRXhwcmVzc2lvblRhYmxlQ29sdW1uTW9kZWwoT2JqZWN0W10gYXJyQ29sdW1uSW5mbykKLSAgICB7Ci0gICAgICAgIHN1cGVyKGNvbnZlcnRUb0NvbHVtbnMoYXJyQ29sdW1uSW5mbykpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ldGhvZCBjb252ZXJ0VG9EZXRhaWxlZEFycmF5LgotICAgICAqIEBwYXJhbSBhcnJDb2x1bW5JbmZvCi0gICAgICogQHBhcmFtIGJTb3J0ZWQKLSAgICAgKiBAcmV0dXJuIE9iamVjdFtdCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBPYmplY3RbXSBjb252ZXJ0VG9EZXRhaWxlZEFycmF5KFN0cmluZ1tdIGFyckNvbHVtbkluZm8sIGJvb2xlYW4gYlNvcnRlZCkKLSAgICB7Ci0gICAgICAgIGludCBuQ29sdW1ucyA9IGFyckNvbHVtbkluZm8ubGVuZ3RoIC8gMjsKLSAgICAgICAgaW50IG5TaXplID0gbkNvbHVtbnMgKiA0OwotICAgICAgICBPYmplY3RbXSBhcnJEZXRhaWxlZEluZm8gPSBuZXcgT2JqZWN0W25TaXplXTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5Db2x1bW5zOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBuSW5wdXRCYXNlSW5kZXggPSAyICogaTsKLSAgICAgICAgICAgIFN0cmluZyBzdHJDb2x1bW5OYW1lID0gYXJyQ29sdW1uSW5mb1tuSW5wdXRCYXNlSW5kZXhdOwotICAgICAgICAgICAgU3RyaW5nIHN0ckV4cHJlc3Npb24gPSBhcnJDb2x1bW5JbmZvW25JbnB1dEJhc2VJbmRleCArIDFdOwotCi0gICAgICAgICAgICBpbnQgbk91dHB1dEJhc2VJbmRleCA9IDQgKiBpOwotICAgICAgICAgICAgYXJyRGV0YWlsZWRJbmZvW25PdXRwdXRCYXNlSW5kZXhdID0gc3RyQ29sdW1uTmFtZTsKLSAgICAgICAgICAgIGFyckRldGFpbGVkSW5mb1tuT3V0cHV0QmFzZUluZGV4ICsgMV0gPSBzdHJDb2x1bW5OYW1lOwotICAgICAgICAgICAgYXJyRGV0YWlsZWRJbmZvW25PdXRwdXRCYXNlSW5kZXggKyAyXSA9IHN0ckV4cHJlc3Npb247Ci0gICAgICAgICAgICBhcnJEZXRhaWxlZEluZm9bbk91dHB1dEJhc2VJbmRleCArIDNdID0gYlNvcnRlZCA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gYXJyRGV0YWlsZWRJbmZvOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ldGhvZCBjb252ZXJ0VG9Db2x1bW5zLgotICAgICAqIEBwYXJhbSBhcnJEZXRhaWxlZEluZm8KLSAgICAgKiBAcmV0dXJuIElUYWJsZUNvbHVtbltdCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBJVGFibGVDb2x1bW5bXSBjb252ZXJ0VG9Db2x1bW5zKE9iamVjdFtdIGFyckRldGFpbGVkSW5mbykKLSAgICB7Ci0gICAgICAgIGludCBuQ29sdW1ucyA9IGFyckRldGFpbGVkSW5mby5sZW5ndGggLyA0OwotICAgICAgICBJVGFibGVDb2x1bW5bXSBhcnJDb2x1bW5zID0gbmV3IElUYWJsZUNvbHVtbltuQ29sdW1uc107Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuQ29sdW1uczsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBPYmplY3Qgb2JqVGVtcFZhbHVlOwotICAgICAgICAgICAgaW50IG5CYXNlSW5kZXggPSA0ICogaTsKLQotICAgICAgICAgICAgU3RyaW5nIHN0ckNvbHVtbk5hbWUgPSAiIjsKLSAgICAgICAgICAgIG9ialRlbXBWYWx1ZSA9IGFyckRldGFpbGVkSW5mb1tuQmFzZUluZGV4XTsKLSAgICAgICAgICAgIGlmIChvYmpUZW1wVmFsdWUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBzdHJDb2x1bW5OYW1lID0gb2JqVGVtcFZhbHVlLnRvU3RyaW5nKCk7Ci0KLSAgICAgICAgICAgIFN0cmluZyBzdHJEaXNwbGF5TmFtZSA9ICIiOwotICAgICAgICAgICAgb2JqVGVtcFZhbHVlID0gYXJyRGV0YWlsZWRJbmZvW25CYXNlSW5kZXggKyAxXTsKLSAgICAgICAgICAgIGlmIChvYmpUZW1wVmFsdWUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBzdHJEaXNwbGF5TmFtZSA9IG9ialRlbXBWYWx1ZS50b1N0cmluZygpOwotCi0gICAgICAgICAgICBTdHJpbmcgc3RyRXhwcmVzc2lvbiA9ICIiOwotICAgICAgICAgICAgb2JqVGVtcFZhbHVlID0gYXJyRGV0YWlsZWRJbmZvW25CYXNlSW5kZXggKyAyXTsKLSAgICAgICAgICAgIGlmIChvYmpUZW1wVmFsdWUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBzdHJFeHByZXNzaW9uID0gb2JqVGVtcFZhbHVlLnRvU3RyaW5nKCk7Ci0KLSAgICAgICAgICAgIGJvb2xlYW4gYlNvcnRlZCA9IGZhbHNlOwotICAgICAgICAgICAgb2JqVGVtcFZhbHVlID0gYXJyRGV0YWlsZWRJbmZvW25CYXNlSW5kZXggKyAzXTsKLSAgICAgICAgICAgIGlmIChvYmpUZW1wVmFsdWUgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAob2JqVGVtcFZhbHVlIGluc3RhbmNlb2YgQm9vbGVhbikKLSAgICAgICAgICAgICAgICAgICAgYlNvcnRlZCA9ICgoQm9vbGVhbikgb2JqVGVtcFZhbHVlKS5ib29sZWFuVmFsdWUoKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGJTb3J0ZWQgPSBCb29sZWFuLmdldEJvb2xlYW4ob2JqVGVtcFZhbHVlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBhcnJDb2x1bW5zW2ldID0KLSAgICAgICAgICAgICAgICBuZXcgRXhwcmVzc2lvblRhYmxlQ29sdW1uKHN0ckNvbHVtbk5hbWUsIHN0ckRpc3BsYXlOYW1lLCBzdHJFeHByZXNzaW9uLCBiU29ydGVkKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBhcnJDb2x1bW5zOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90YWJsZS9tb2RlbC9vZ25sL09nbmxUYWJsZUNvbHVtbkV2YWx1YXRvci5qYXZhIGIvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL21vZGVsL29nbmwvT2dubFRhYmxlQ29sdW1uRXZhbHVhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzZjZiM2EuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL21vZGVsL29nbmwvT2dubFRhYmxlQ29sdW1uRXZhbHVhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsLm9nbmw7Ci0KLWltcG9ydCBvZ25sLk9nbmw7Ci1pbXBvcnQgb2dubC5PZ25sRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsLklUYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuc2ltcGxlLklUYWJsZUNvbHVtbkV2YWx1YXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnV0aWwucHJvcC5PZ25sVXRpbHM7Ci0KLS8qKgotICogQGF1dGhvciBtaW5kYnJpZGdlCi0gKgotICovCi1wdWJsaWMgY2xhc3MgT2dubFRhYmxlQ29sdW1uRXZhbHVhdG9yIGltcGxlbWVudHMgSVRhYmxlQ29sdW1uRXZhbHVhdG9yCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIExPRyA9Ci0JCUxvZ0ZhY3RvcnkuZ2V0TG9nKEV4cHJlc3Npb25UYWJsZUNvbHVtbi5jbGFzcyk7Ci0KLQlwcml2YXRlIFN0cmluZyBtX3N0ckV4cHJlc3Npb247Ci0JdHJhbnNpZW50IHByaXZhdGUgT2JqZWN0IG1fb2JqUGFyc2VkRXhwcmVzc2lvbiA9IG51bGw7Ci0KLQlwdWJsaWMgT2dubFRhYmxlQ29sdW1uRXZhbHVhdG9yKFN0cmluZyBzdHJFeHByZXNzaW9uKQotCXsKLQkJbV9zdHJFeHByZXNzaW9uID0gc3RyRXhwcmVzc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5tb2RlbC5zaW1wbGUuSVRhYmxlQ29sdW1uRXZhbHVhdG9yI2dldENvbHVtblZhbHVlKElUYWJsZUNvbHVtbiwgT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0Q29sdW1uVmFsdWUoSVRhYmxlQ29sdW1uIG9iakNvbHVtbiwgT2JqZWN0IG9ialJvdykKLQl7Ci0JCS8vIElmIG5vIGV4cHJlc3Npb24gaXMgZ2l2ZW4sIHRoZW4gdGhpcyBpcyBkdW1teSBjb2x1bW4uIFJldHVybiBzb21ldGhpbmcuCi0JCWlmIChtX3N0ckV4cHJlc3Npb24gPT0gbnVsbCB8fCBtX3N0ckV4cHJlc3Npb24uZXF1YWxzKCIiKSkKLQkJCXJldHVybiAiIjsKLQotCQkJc3luY2hyb25pemVkICh0aGlzKQotCQkJewotCQkJCWlmIChtX29ialBhcnNlZEV4cHJlc3Npb24gPT0gbnVsbCkKLQkJCQkJbV9vYmpQYXJzZWRFeHByZXNzaW9uID0KLQkJCQkJCU9nbmxVdGlscy5nZXRQYXJzZWRFeHByZXNzaW9uKG1fc3RyRXhwcmVzc2lvbik7Ci0JCQl9Ci0KLQkJdHJ5Ci0JCXsKLQkJCU9iamVjdCBvYmpWYWx1ZSA9IE9nbmwuZ2V0VmFsdWUobV9vYmpQYXJzZWRFeHByZXNzaW9uLCBvYmpSb3cpOwotCQkJcmV0dXJuIG9ialZhbHVlOwotCQl9Ci0JCWNhdGNoIChPZ25sRXhjZXB0aW9uIGUpCi0JCXsKLQkJCUxPRy5lcnJvcigKLQkJCQkiQ2Fubm90IHVzZSBjb2x1bW4gZXhwcmVzc2lvbiAnIiArIG1fc3RyRXhwcmVzc2lvbiArICInIGluIHJvdyIsCi0JCQkJZSk7Ci0JCQlyZXR1cm4gIiI7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdGFibGUvbW9kZWwvc2ltcGxlL0NvbHVtbkNvbXBhcmF0b3IuamF2YSBiL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90YWJsZS9tb2RlbC9zaW1wbGUvQ29sdW1uQ29tcGFyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDAyZjZlLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90YWJsZS9tb2RlbC9zaW1wbGUvQ29sdW1uQ29tcGFyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5tb2RlbC5zaW1wbGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLQotLyoqCi0gKiBJbiBvcmRlciB0byBwcm92aWRlIG1vcmUgZ2VuZXJpYyBiZWhhdmlvdXIsIElUYWJsZUNvbHVtbiAKLSAqIGhhcyBubyAiY29sdW1uIHZhbHVlIiBjb25jZXB0LiBUaGUgY29tcGFyYXRvciBpdCByZXR1cm5zIAotICogY29tcGFyZXMgdHdvIHRhYmxlIHJvd3MsIHJhdGhlciB0aGFuIHZhbHVlcyBzcGVjaWZpYyB0byB0aGUgY29sdW1uLiAKLSAqIDxwPgotICogU2ltcGxlVGFibGVDb2x1bW4gaW50cm9kdWNlcyB0aGUgY29uY2VwdCBvZiAiY29sdW1uIHZhbHVlIiBhbmQgCi0gKiBhbGxvd3Mgb25lIHRvIGV4dHJhY3QgdGhhdCAiY29sdW1uIHZhbHVlIiBmcm9tIHRoZSByb3cgdXNpbmcgCi0gKiB0aGUgZ2V0Q29sdW1uVmFsdWUoKSBtZXRob2QuIEluIHByYWN0aWNlIGNvbXBhcmlzb25zIGFyZSBhbHNvIHR5cGljYWxseSAKLSAqIGRvbmUgYmV0d2VlbiB0aGVzZSB2YWx1ZXMgcmF0aGVyIHRoYW4gdGhlIGZ1bGwgcm93IG9iamVjdHMuCi0gKiA8cD4KLSAqIFRoaXMgY29tcGFyYXRvciBleHRyYWN0cyB0aGUgY29sdW1uIHZhbHVlcyBmcm9tIHRoZSByb3dzIHBhc3NlZCAKLSAqIGFuZCB1c2VzIHRoZSBwcm92aWRlZCBjb21wYXJhdG9yIHRvIGNvbXBhcmUgdGhlIHZhbHVlcy4KLSAqIEl0IHRoZXJlZm9yZSBhbGxvd3MgYSBjb21wYXJhdG9yIGRlc2lnbmVkIGZvciBjb21wYXJpbmcgY29sdW1uIHZhbHVlcyB0byBiZQotICogcXVpY2tseSB3cmFwcGVkIGFuZCB1c2VkIGFzIGEgY29tcGFyYXRvciBjb21wYXJpbmcgcm93cywgd2hpY2ggaXMgd2hhdAotICogSVRhYmxlQ29sdW1uIGlzIGV4cGVjdGVkIHRvIHJldHVybi4KLSAqIDxwPgotICogRXhhbXBsZToKLSAqIDxwPgotICogb2JqQ29sdW1uLnNldENvbXBhcmF0b3IobmV3IENvbHVtbkNvbXBhcmF0b3Iob2JqQ29sdW1uLCBvYmpCZWFuQ29tcGFyYXRvcikpOyAgICAKLSAqIAotICogQHZlcnNpb24gJElkJAotICogQGF1dGhvciBtaW5kYnJpZGdlCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQ29sdW1uQ29tcGFyYXRvciBpbXBsZW1lbnRzIENvbXBhcmF0b3IKLXsKLSAgICBwcml2YXRlIFNpbXBsZVRhYmxlQ29sdW1uIG1fb2JqQ29sdW1uOwotCXByaXZhdGUgQ29tcGFyYXRvciBtX29iakNvbXBhcmF0b3I7Ci0KLQlwdWJsaWMgQ29sdW1uQ29tcGFyYXRvcihTaW1wbGVUYWJsZUNvbHVtbiBvYmpDb2x1bW4sIENvbXBhcmF0b3Igb2JqQ29tcGFyYXRvcikKLQl7Ci0gICAgICAgIG1fb2JqQ29sdW1uID0gb2JqQ29sdW1uOwotCQltX29iakNvbXBhcmF0b3IgPSBvYmpDb21wYXJhdG9yOwotCX0KLQotCS8qKgotCSAqIEBzZWUgamF2YS51dGlsLkNvbXBhcmF0b3IjY29tcGFyZShPYmplY3QsIE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG9ialJvdzEsIE9iamVjdCBvYmpSb3cyKQotCXsKLSAgICAgICAgT2JqZWN0IG9ialZhbHVlMSA9IG1fb2JqQ29sdW1uLmdldENvbHVtblZhbHVlKG9ialJvdzEpOwotICAgICAgICBPYmplY3Qgb2JqVmFsdWUyID0gbV9vYmpDb2x1bW4uZ2V0Q29sdW1uVmFsdWUob2JqUm93Mik7Ci0gICAgICAgICAgICAgICAgCi0JCXJldHVybiBtX29iakNvbXBhcmF0b3IuY29tcGFyZShvYmpWYWx1ZTEsIG9ialZhbHVlMik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdGFibGUvbW9kZWwvc2ltcGxlL0lUYWJsZUNvbHVtbkV2YWx1YXRvci5qYXZhIGIvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL21vZGVsL3NpbXBsZS9JVGFibGVDb2x1bW5FdmFsdWF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVjY2RiOC4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdGFibGUvbW9kZWwvc2ltcGxlL0lUYWJsZUNvbHVtbkV2YWx1YXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5tb2RlbC5zaW1wbGU7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5tb2RlbC5JVGFibGVDb2x1bW47Ci0KLS8qKgotICogQGF1dGhvciBtaW5kYnJpZGdlCi0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElUYWJsZUNvbHVtbkV2YWx1YXRvciBleHRlbmRzIFNlcmlhbGl6YWJsZQotewotCU9iamVjdCBnZXRDb2x1bW5WYWx1ZShJVGFibGVDb2x1bW4gb2JqQ29sdW1uLCBPYmplY3Qgb2JqUm93KTsKLX0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90YWJsZS9tb2RlbC9zaW1wbGUvU2ltcGxlTGlzdFRhYmxlRGF0YU1vZGVsLmphdmEgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdGFibGUvbW9kZWwvc2ltcGxlL1NpbXBsZUxpc3RUYWJsZURhdGFNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOWMwOTgzLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90YWJsZS9tb2RlbC9zaW1wbGUvU2ltcGxlTGlzdFRhYmxlRGF0YU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5tb2RlbC5zaW1wbGU7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLkNvbGxlY3Rpb25VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuQ1RhYmxlRGF0YU1vZGVsRXZlbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsLmNvbW1vbi5BYnN0cmFjdFRhYmxlRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5tb2RlbC5jb21tb24uQXJyYXlJdGVyYXRvcjsKLQotLyoqCi0gKiBBIG1pbmltYWwgbGlzdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgCi0gKiB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsLklUYWJsZURhdGFNb2RlbH0gaW50ZXJmYWNlCi0gKiAKLSAqIEB2ZXJzaW9uICRJZCQKLSAqIEBhdXRob3IgbWluZGJyaWRnZQotICovCi1wdWJsaWMgY2xhc3MgU2ltcGxlTGlzdFRhYmxlRGF0YU1vZGVsIGV4dGVuZHMgQWJzdHJhY3RUYWJsZURhdGFNb2RlbCBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZQotewotCXByaXZhdGUgTGlzdCBtX2FyclJvd3M7Ci0KLQlwdWJsaWMgU2ltcGxlTGlzdFRhYmxlRGF0YU1vZGVsKE9iamVjdFtdIGFyclJvd3MpCi0JewotCQl0aGlzKEFycmF5cy5hc0xpc3QoYXJyUm93cykpOwotCX0KLQotCXB1YmxpYyBTaW1wbGVMaXN0VGFibGVEYXRhTW9kZWwoTGlzdCBhcnJSb3dzKQotCXsKLQkJbV9hcnJSb3dzID0gYXJyUm93czsKLQl9Ci0KLSAgICBwdWJsaWMgU2ltcGxlTGlzdFRhYmxlRGF0YU1vZGVsKENvbGxlY3Rpb24gYXJyUm93cykKLSAgICB7Ci0gICAgICAgIG1fYXJyUm93cyA9IG5ldyBBcnJheUxpc3QoYXJyUm93cyk7Ci0gICAgfQotCi0gICAgcHVibGljIFNpbXBsZUxpc3RUYWJsZURhdGFNb2RlbChJdGVyYXRvciBvYmpSb3dzKQotICAgIHsKLSAgICAgICAgbV9hcnJSb3dzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBDb2xsZWN0aW9uVXRpbHMuYWRkQWxsKG1fYXJyUm93cywgb2JqUm93cyk7Ci0gICAgfQotCi0JLyoqCi0JICogQHNlZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuSVRhYmxlRGF0YU1vZGVsI2dldFJvd0NvdW50KCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldFJvd0NvdW50KCkKLQl7Ci0JCXJldHVybiBtX2FyclJvd3Muc2l6ZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJvdyBlbGVtZW50IGF0IHRoZSBnaXZlbiBwb3NpdGlvbgotICAgICAqIEBwYXJhbSBuUm93IHRoZSBpbmRleCBvZiB0aGUgZWxlbWVudCB0byByZXR1cm4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFJvdyhpbnQgblJvdykKLQl7Ci0JCWlmIChuUm93IDwgMCB8fCBuUm93ID49IG1fYXJyUm93cy5zaXplKCkpCi0JCXsKLQkJCS8vIGVycm9yIG1lc3NhZ2UKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBtX2FyclJvd3MuZ2V0KG5Sb3cpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gSXRlcmF0b3Igd2l0aCB0aGUgZWxlbWVudHMgZnJvbSB0aGUgZ2l2ZW4gcmFuZ2UKLSAgICAgKiBAcGFyYW0gbkZyb20gdGhlIHN0YXJ0IG9mIHRoZSByYW5nZSAoaW5jbHVzaXZlKQotICAgICAqIEBwYXJhbSBuVG8gdGhlIHN0b3Agb2YgdGhlIHJhbmdlIChleGNsdXNpdmUpCi0JICovCi0JcHVibGljIEl0ZXJhdG9yIGdldFJvd3MoaW50IG5Gcm9tLCBpbnQgblRvKQotCXsKLQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yKG1fYXJyUm93cy50b0FycmF5KCksIG5Gcm9tLCBuVG8pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsLklUYWJsZURhdGFNb2RlbCNnZXRSb3dzKCkKLQkgKi8KLQlwdWJsaWMgSXRlcmF0b3IgZ2V0Um93cygpCi0JewotCQlyZXR1cm4gbV9hcnJSb3dzLml0ZXJhdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIGFkZFJvdy4KLSAgICAgKiBBZGRzIGEgcm93IG9iamVjdCB0byB0aGUgbW9kZWwgYXQgaXRzIGVuZAotCSAqIEBwYXJhbSBvYmpSb3cgdGhlIHJvdyBvYmplY3QgdG8gYWRkCi0JICovCi0JcHVibGljIHZvaWQgYWRkUm93KE9iamVjdCBvYmpSb3cpCi0JewotCQltX2FyclJvd3MuYWRkKG9ialJvdyk7Ci0KLQkJQ1RhYmxlRGF0YU1vZGVsRXZlbnQgb2JqRXZlbnQgPSBuZXcgQ1RhYmxlRGF0YU1vZGVsRXZlbnQoKTsKLQkJZmlyZVRhYmxlRGF0YU1vZGVsRXZlbnQob2JqRXZlbnQpOwotCX0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFJvd3MoQ29sbGVjdGlvbiBhcnJSb3dzKQotICAgIHsKLSAgICAgICAgbV9hcnJSb3dzLmFkZEFsbChhcnJSb3dzKTsKLQotICAgICAgICBDVGFibGVEYXRhTW9kZWxFdmVudCBvYmpFdmVudCA9IG5ldyBDVGFibGVEYXRhTW9kZWxFdmVudCgpOwotICAgICAgICBmaXJlVGFibGVEYXRhTW9kZWxFdmVudChvYmpFdmVudCk7Ci0gICAgfQotCi0JLyoqCi0JICogTWV0aG9kIHJlbW92ZVJvdy4KLSAgICAgKiBSZW1vdmVzIGEgcm93IG9iamVjdCBmcm9tIHRoZSBtb2RlbAotCSAqIEBwYXJhbSBvYmpSb3cgdGhlIHJvdyBvYmplY3QgdG8gcmVtb3ZlCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlUm93KE9iamVjdCBvYmpSb3cpCi0JewotCQltX2FyclJvd3MucmVtb3ZlKG9ialJvdyk7Ci0KLQkJQ1RhYmxlRGF0YU1vZGVsRXZlbnQgb2JqRXZlbnQgPSBuZXcgQ1RhYmxlRGF0YU1vZGVsRXZlbnQoKTsKLQkJZmlyZVRhYmxlRGF0YU1vZGVsRXZlbnQob2JqRXZlbnQpOwotCX0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVJvd3MoQ29sbGVjdGlvbiBhcnJSb3dzKQotICAgIHsKLSAgICAgICAgbV9hcnJSb3dzLnJlbW92ZUFsbChhcnJSb3dzKTsKLQotICAgICAgICBDVGFibGVEYXRhTW9kZWxFdmVudCBvYmpFdmVudCA9IG5ldyBDVGFibGVEYXRhTW9kZWxFdmVudCgpOwotICAgICAgICBmaXJlVGFibGVEYXRhTW9kZWxFdmVudChvYmpFdmVudCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdGFibGUvbW9kZWwvc2ltcGxlL1NpbXBsZVNldFRhYmxlRGF0YU1vZGVsLmphdmEgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdGFibGUvbW9kZWwvc2ltcGxlL1NpbXBsZVNldFRhYmxlRGF0YU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiZTZmZTYuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL21vZGVsL3NpbXBsZS9TaW1wbGVTZXRUYWJsZURhdGFNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuc2ltcGxlOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuQ1RhYmxlRGF0YU1vZGVsRXZlbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsLmNvbW1vbi5BYnN0cmFjdFRhYmxlRGF0YU1vZGVsOwotCi0vKioKLSAqIEEgbWluaW1hbCBzZXQgaW1wbGVtZW50YXRpb24gb2YgdGhlIAotICoge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5tb2RlbC5JVGFibGVEYXRhTW9kZWx9IGludGVyZmFjZQotICogCi0gKiBAdmVyc2lvbiAkSWQkCi0gKiBAYXV0aG9yIG1pbmRicmlkZ2UKLSAqLwotcHVibGljIGNsYXNzIFNpbXBsZVNldFRhYmxlRGF0YU1vZGVsIGV4dGVuZHMgQWJzdHJhY3RUYWJsZURhdGFNb2RlbCBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZQotewotICAgIHByaXZhdGUgU2V0IG1fc2V0Um93czsKLQotICAgIHB1YmxpYyBTaW1wbGVTZXRUYWJsZURhdGFNb2RlbChTZXQgc2V0Um93cykKLSAgICB7Ci0gICAgICAgIG1fc2V0Um93cyA9IHNldFJvd3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuSVRhYmxlRGF0YU1vZGVsI2dldFJvd0NvdW50KCkKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFJvd0NvdW50KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3NldFJvd3Muc2l6ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsLklUYWJsZURhdGFNb2RlbCNnZXRSb3dzKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgSXRlcmF0b3IgZ2V0Um93cygpCi0gICAgewotICAgICAgICByZXR1cm4gbV9zZXRSb3dzLml0ZXJhdG9yKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWV0aG9kIGFkZFJvdy4KLSAgICAgKiBBZGRzIGEgcm93IG9iamVjdCB0byB0aGUgbW9kZWwgYXQgaXRzIGVuZAotICAgICAqIEBwYXJhbSBvYmpSb3cgdGhlIHJvdyBvYmplY3QgdG8gYWRkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkUm93KE9iamVjdCBvYmpSb3cpCi0gICAgewotICAgICAgICBpZiAobV9zZXRSb3dzLmNvbnRhaW5zKG9ialJvdykpIHJldHVybjsKLSAgICAgICAgbV9zZXRSb3dzLmFkZChvYmpSb3cpOwotCi0gICAgICAgIENUYWJsZURhdGFNb2RlbEV2ZW50IG9iakV2ZW50ID0gbmV3IENUYWJsZURhdGFNb2RlbEV2ZW50KCk7Ci0gICAgICAgIGZpcmVUYWJsZURhdGFNb2RlbEV2ZW50KG9iakV2ZW50KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRSb3dzKENvbGxlY3Rpb24gYXJyUm93cykKLSAgICB7Ci0gICAgICAgIG1fc2V0Um93cy5hZGRBbGwoYXJyUm93cyk7Ci0KLSAgICAgICAgQ1RhYmxlRGF0YU1vZGVsRXZlbnQgb2JqRXZlbnQgPSBuZXcgQ1RhYmxlRGF0YU1vZGVsRXZlbnQoKTsKLSAgICAgICAgZmlyZVRhYmxlRGF0YU1vZGVsRXZlbnQob2JqRXZlbnQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ldGhvZCByZW1vdmVSb3cuCi0gICAgICogUmVtb3ZlcyBhIHJvdyBvYmplY3QgZnJvbSB0aGUgbW9kZWwKLSAgICAgKiBAcGFyYW0gb2JqUm93IHRoZSByb3cgb2JqZWN0IHRvIHJlbW92ZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVJvdyhPYmplY3Qgb2JqUm93KQotICAgIHsKLSAgICAgICAgaWYgKCFtX3NldFJvd3MuY29udGFpbnMob2JqUm93KSkgcmV0dXJuOwotICAgICAgICBtX3NldFJvd3MucmVtb3ZlKG9ialJvdyk7Ci0KLSAgICAgICAgQ1RhYmxlRGF0YU1vZGVsRXZlbnQgb2JqRXZlbnQgPSBuZXcgQ1RhYmxlRGF0YU1vZGVsRXZlbnQoKTsKLSAgICAgICAgZmlyZVRhYmxlRGF0YU1vZGVsRXZlbnQob2JqRXZlbnQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVJvd3MoQ29sbGVjdGlvbiBhcnJSb3dzKQotICAgIHsKLSAgICAgICAgbV9zZXRSb3dzLnJlbW92ZUFsbChhcnJSb3dzKTsKLQotICAgICAgICBDVGFibGVEYXRhTW9kZWxFdmVudCBvYmpFdmVudCA9IG5ldyBDVGFibGVEYXRhTW9kZWxFdmVudCgpOwotICAgICAgICBmaXJlVGFibGVEYXRhTW9kZWxFdmVudChvYmpFdmVudCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdGFibGUvbW9kZWwvc2ltcGxlL1NpbXBsZVRhYmxlQ29sdW1uLmphdmEgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdGFibGUvbW9kZWwvc2ltcGxlL1NpbXBsZVRhYmxlQ29sdW1uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlYjg1MTMuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL21vZGVsL3NpbXBsZS9TaW1wbGVUYWJsZUNvbHVtbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM1ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuc2ltcGxlOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsLklUYWJsZVJlbmRlcmVyU291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5tb2RlbC5jb21tb24uQWJzdHJhY3RUYWJsZUNvbHVtbjsKLQotLyoqCi0gKiBBIHNpbXBsZSBtaW5pbWFsIGltcGxlbWVudGF0aW9uIG9mIHRoZSAKLSAqIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuSVRhYmxlQ29sdW1ufSBpbnRlcmZhY2UgdGhhdAotICogcHJvdmlkZXMgYWxsIHRoZSBiYXNpYyBzZXJ2aWNlcyBmb3IgZGlzcGxheWluZyBhIGNvbHVtbi4KLSAqIAotICogQHZlcnNpb24gJElkJAotICogQGF1dGhvciBtaW5kYnJpZGdlCi0gKi8KLXB1YmxpYyBjbGFzcyBTaW1wbGVUYWJsZUNvbHVtbiBleHRlbmRzIEFic3RyYWN0VGFibGVDb2x1bW4KLXsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIElUYWJsZVJlbmRlcmVyU291cmNlIERFRkFVTFRfQ09MVU1OX1JFTkRFUkVSX1NPVVJDRSA9IAotICAgICAgICBuZXcgU2ltcGxlVGFibGVDb2x1bW5SZW5kZXJlclNvdXJjZSgpOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBJVGFibGVSZW5kZXJlclNvdXJjZSBGT1JNX0NPTFVNTl9SRU5ERVJFUl9TT1VSQ0UgPSAKLSAgICAgICAgbmV3IFNpbXBsZVRhYmxlQ29sdW1uRm9ybVJlbmRlcmVyU291cmNlKCk7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIElUYWJsZVJlbmRlcmVyU291cmNlIERFRkFVTFRfVkFMVUVfUkVOREVSRVJfU09VUkNFID0gCi0gICAgICAgIG5ldyBTaW1wbGVUYWJsZVZhbHVlUmVuZGVyZXJTb3VyY2UoKTsKLQotCXByaXZhdGUgU3RyaW5nIG1fc3RyRGlzcGxheU5hbWU7Ci0JcHJpdmF0ZSBJVGFibGVDb2x1bW5FdmFsdWF0b3IgbV9vYmpFdmFsdWF0b3I7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgU2ltcGxlVGFibGVDb2x1bW4KLQkgKiBAcGFyYW0gc3RyQ29sdW1uTmFtZSB0aGUgaWRlbnRpZnlpbmcgbmFtZSBhbmQgZGlzcGxheSBuYW1lIG9mIHRoZSBjb2x1bW4KLQkgKi8KLQlwdWJsaWMgU2ltcGxlVGFibGVDb2x1bW4oU3RyaW5nIHN0ckNvbHVtbk5hbWUpCi0JewotCQl0aGlzKHN0ckNvbHVtbk5hbWUsIHN0ckNvbHVtbk5hbWUpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBTaW1wbGVUYWJsZUNvbHVtbgotCSAqIEBwYXJhbSBzdHJDb2x1bW5OYW1lIHRoZSBpZGVudGlmeWluZyBuYW1lIGFuZCBkaXNwbGF5IG5hbWUgb2YgdGhlIGNvbHVtbgotCSAqIEBwYXJhbSBiU29ydGFibGUgd2hldGhlciB0aGUgY29sdW1uIGlzIHNvcnRhYmxlCi0JICovCi0JcHVibGljIFNpbXBsZVRhYmxlQ29sdW1uKFN0cmluZyBzdHJDb2x1bW5OYW1lLCBib29sZWFuIGJTb3J0YWJsZSkKLQl7Ci0JCXRoaXMoc3RyQ29sdW1uTmFtZSwgc3RyQ29sdW1uTmFtZSwgYlNvcnRhYmxlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgU2ltcGxlVGFibGVDb2x1bW4KLQkgKiBAcGFyYW0gc3RyQ29sdW1uTmFtZSB0aGUgaWRlbnRpZnlpbmcgbmFtZSBhbmQgZGlzcGxheSBuYW1lIG9mIHRoZSBjb2x1bW4KLQkgKiBAcGFyYW0gYlNvcnRhYmxlIHdoZXRoZXIgdGhlIGNvbHVtbiBpcyBzb3J0YWJsZQotICAgICAqIEBwYXJhbSBvYmpFdmFsdWF0b3IgdGhlIGV2YWx1YXRvciB0byBleHRyYWN0IHRoZSBjb2x1bW4gdmFsdWUgZnJvbSB0aGUgcm93Ci0JICovCi0JcHVibGljIFNpbXBsZVRhYmxlQ29sdW1uKAotCQlTdHJpbmcgc3RyQ29sdW1uTmFtZSwKLSAgICAgICAgSVRhYmxlQ29sdW1uRXZhbHVhdG9yIG9iakV2YWx1YXRvciwKLQkJYm9vbGVhbiBiU29ydGFibGUpCi0JewotCQl0aGlzKHN0ckNvbHVtbk5hbWUsIHN0ckNvbHVtbk5hbWUsIG9iakV2YWx1YXRvciwgYlNvcnRhYmxlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgU2ltcGxlVGFibGVDb2x1bW4KLQkgKiBAcGFyYW0gc3RyQ29sdW1uTmFtZSB0aGUgaWRlbnRpZnlpbmcgbmFtZSBvZiB0aGUgY29sdW1uCi0JICogQHBhcmFtIHN0ckRpc3BsYXlOYW1lIHRoZSBkaXNwbGF5IG5hbWUgb2YgdGhlIGNvbHVtbgotCSAqLwotCXB1YmxpYyBTaW1wbGVUYWJsZUNvbHVtbihTdHJpbmcgc3RyQ29sdW1uTmFtZSwgU3RyaW5nIHN0ckRpc3BsYXlOYW1lKQotCXsKLQkJdGhpcyhzdHJDb2x1bW5OYW1lLCBzdHJEaXNwbGF5TmFtZSwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBTaW1wbGVUYWJsZUNvbHVtbgotCSAqIEBwYXJhbSBzdHJDb2x1bW5OYW1lIHRoZSBpZGVudGlmeWluZyBuYW1lIG9mIHRoZSBjb2x1bW4KLQkgKiBAcGFyYW0gc3RyRGlzcGxheU5hbWUgdGhlIGRpc3BsYXkgbmFtZSBvZiB0aGUgY29sdW1uCi0JICogQHBhcmFtIGJTb3J0YWJsZSB3aGV0aGVyIHRoZSBjb2x1bW4gaXMgc29ydGFibGUKLQkgKi8KLQlwdWJsaWMgU2ltcGxlVGFibGVDb2x1bW4oCi0JCVN0cmluZyBzdHJDb2x1bW5OYW1lLAotCQlTdHJpbmcgc3RyRGlzcGxheU5hbWUsCi0JCWJvb2xlYW4gYlNvcnRhYmxlKQotCXsKLQkJdGhpcyhzdHJDb2x1bW5OYW1lLCBzdHJEaXNwbGF5TmFtZSwgbnVsbCwgYlNvcnRhYmxlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgU2ltcGxlVGFibGVDb2x1bW4KLQkgKiBAcGFyYW0gc3RyQ29sdW1uTmFtZSB0aGUgaWRlbnRpZnlpbmcgbmFtZSBvZiB0aGUgY29sdW1uCi0JICogQHBhcmFtIHN0ckRpc3BsYXlOYW1lIHRoZSBkaXNwbGF5IG5hbWUgb2YgdGhlIGNvbHVtbgotCSAqIEBwYXJhbSBiU29ydGFibGUgd2hldGhlciB0aGUgY29sdW1uIGlzIHNvcnRhYmxlCi0gICAgICogQHBhcmFtIG9iakV2YWx1YXRvciB0aGUgZXZhbHVhdG9yIHRvIGV4dHJhY3QgdGhlIGNvbHVtbiB2YWx1ZSBmcm9tIHRoZSByb3cKLQkgKi8KLQlwdWJsaWMgU2ltcGxlVGFibGVDb2x1bW4oCi0JCVN0cmluZyBzdHJDb2x1bW5OYW1lLAotCQlTdHJpbmcgc3RyRGlzcGxheU5hbWUsCi0JCUlUYWJsZUNvbHVtbkV2YWx1YXRvciBvYmpFdmFsdWF0b3IsCi0JCWJvb2xlYW4gYlNvcnRhYmxlKQotCXsKLQkJc3VwZXIoc3RyQ29sdW1uTmFtZSwgYlNvcnRhYmxlLCBudWxsKTsKLQkJc2V0Q29tcGFyYXRvcihuZXcgRGVmYXVsdFRhYmxlQ29tcGFyYXRvcigpKTsKLQkJc2V0RGlzcGxheU5hbWUoc3RyRGlzcGxheU5hbWUpOwotCQlzZXRDb2x1bW5SZW5kZXJlclNvdXJjZShERUZBVUxUX0NPTFVNTl9SRU5ERVJFUl9TT1VSQ0UpOwotCQlzZXRWYWx1ZVJlbmRlcmVyU291cmNlKERFRkFVTFRfVkFMVUVfUkVOREVSRVJfU09VUkNFKTsKLQkJc2V0RXZhbHVhdG9yKG9iakV2YWx1YXRvcik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGlzcGxheSBuYW1lIG9mIHRoZSBjb2x1bW4gdGhhdCB3aWxsIGJlIHVzZWQgCi0JICogaW4gdGhlIHRhYmxlIGhlYWRlci4KLQkgKiBPdmVycmlkZSBmb3IgaW50ZXJuYXRpb25hbGl6YXRpb24uCi0JICogQHJldHVybiBTdHJpbmcgdGhlIGRpc3BsYXkgbmFtZSBvZiB0aGUgY29sdW1uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREaXNwbGF5TmFtZSgpCi0JewotCQlyZXR1cm4gbV9zdHJEaXNwbGF5TmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBkaXNwbGF5TmFtZS4KLQkgKiBAcGFyYW0gZGlzcGxheU5hbWUgVGhlIGRpc3BsYXlOYW1lIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERpc3BsYXlOYW1lKFN0cmluZyBkaXNwbGF5TmFtZSkKLQl7Ci0JCW1fc3RyRGlzcGxheU5hbWUgPSBkaXNwbGF5TmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBldmFsdWF0b3IuCi0JICogQHJldHVybiBJVGFibGVDb2x1bW5FdmFsdWF0b3IKLQkgKi8KLQlwdWJsaWMgSVRhYmxlQ29sdW1uRXZhbHVhdG9yIGdldEV2YWx1YXRvcigpCi0JewotCQlyZXR1cm4gbV9vYmpFdmFsdWF0b3I7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZXZhbHVhdG9yLgotCSAqIEBwYXJhbSBldmFsdWF0b3IgVGhlIGV2YWx1YXRvciB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFdmFsdWF0b3IoSVRhYmxlQ29sdW1uRXZhbHVhdG9yIGV2YWx1YXRvcikKLQl7Ci0JCW1fb2JqRXZhbHVhdG9yID0gZXZhbHVhdG9yOwotCX0KLQotICAgIC8qKgotICAgICAqIFNldHMgYSBjb21wYXJhdG9yIHRoYXQgY29tcGFyZXMgdGhlIHZhbHVlcyBvZiB0aGlzIGNvbHVtbiByYXRoZXIgdGhhbiAKLSAgICAgKiB0aGUgb2JqZWN0cyByZXByZXNlbnRpbmcgdGhlIGZ1bGwgcm93cy4gPGJyPgotICAgICAqIFRoaXMgbWV0aG9kIGFsbG93cyBlYXNpZXIgdXNlIG9mIHN0YW5kYXJkIGNvbXBhcmF0b3JzIGZvciBzb3J0aW5nCi0gICAgICogdGhlIGNvbHVtbi4gSXQgc2ltcGx5IHdyYXBzIHRoZSBwcm92aWRlZCBjb21wYXJhdG9yIHdpdGggYSByb3ctdG8tY29sdW1uIAotICAgICAqIGNvbnZlcnRvciBhbmQgaW52b2tlcyB0aGUgc2V0Q29tcGFyYXRvcigpIG1ldGhvZC4KLSAgICAgKiBAcGFyYW0gY29tcGFyYXRvciBUaGUgY29sdW1uIHZhbHVlIGNvbXBhcmF0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDb2x1bW5Db21wYXJhdG9yKENvbXBhcmF0b3IgY29tcGFyYXRvcikKLSAgICB7Ci0gICAgICAgIHNldENvbXBhcmF0b3IobmV3IENvbHVtbkNvbXBhcmF0b3IodGhpcywgY29tcGFyYXRvcikpOwotICAgIH0KLQotCS8qKgotCSAqIEV4dHJhY3RzIHRoZSB2YWx1ZSBvZiB0aGUgY29sdW1uIGZyb20gdGhlIHJvdyBvYmplY3QKLQkgKiBAcGFyYW0gb2JqUm93IHRoZSByb3cgb2JqZWN0Ci0JICogQHJldHVybiBPYmplY3QgdGhlIGNvbHVtbiB2YWx1ZQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0Q29sdW1uVmFsdWUoT2JqZWN0IG9ialJvdykKLQl7Ci0JCUlUYWJsZUNvbHVtbkV2YWx1YXRvciBvYmpFdmFsdWF0b3IgPSBnZXRFdmFsdWF0b3IoKTsKLQkJaWYgKG9iakV2YWx1YXRvciAhPSBudWxsKQotCQkJcmV0dXJuIG9iakV2YWx1YXRvci5nZXRDb2x1bW5WYWx1ZSh0aGlzLCBvYmpSb3cpOwotCi0JCS8vIGRlZmF1bHQgZmFsbGJhY2sKLQkJcmV0dXJuIG9ialJvdy50b1N0cmluZygpOwotCX0KLQotICAgIC8qKgotICAgICAqICBVc2UgdGhlIGNvbHVtbiBuYW1lIHRvIGdldCB0aGUgZGlzcGxheSBuYW1lLCBhcyB3ZWxsIGFzIAotICAgICAqICB0aGUgY29sdW1uIGFuZCB2YWx1ZSByZW5kZXJlciBzb3VyY2VzIGZyb20gdGhlIHByb3ZpZGVkIGNvbXBvbmVudC4KLSAgICAgKiAgIAotICAgICAqICBAcGFyYW0gb2JqU2V0dGluZ3NDb250YWluZXIgdGhlIGNvbXBvbmVudCBmcm9tIHdoaWNoIHRvIGdldCB0aGUgc2V0dGluZ3MgCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgbG9hZFNldHRpbmdzKElDb21wb25lbnQgb2JqU2V0dGluZ3NDb250YWluZXIpCi0gICAgewotICAgICAgICBTdHJpbmcgc3RyRGlzcGxheU5hbWUgPSBvYmpTZXR0aW5nc0NvbnRhaW5lci5nZXRNZXNzYWdlcygpLmdldE1lc3NhZ2UoZ2V0Q29sdW1uTmFtZSgpLCBudWxsKTsKLSAgICAgICAgaWYgKHN0ckRpc3BsYXlOYW1lICE9IG51bGwpCi0gICAgICAgICAgICBzZXREaXNwbGF5TmFtZShzdHJEaXNwbGF5TmFtZSk7Ci0gICAgICAgIAotICAgICAgICBzdXBlci5sb2FkU2V0dGluZ3Mob2JqU2V0dGluZ3NDb250YWluZXIpOwotICAgIH0KLQotCi0JcHVibGljIGNsYXNzIERlZmF1bHRUYWJsZUNvbXBhcmF0b3IgaW1wbGVtZW50cyBDb21wYXJhdG9yLCBTZXJpYWxpemFibGUKLQl7Ci0JCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3Qgb2JqUm93MSwgT2JqZWN0IG9ialJvdzIpCi0JCXsKLQkJCU9iamVjdCBvYmpWYWx1ZTEgPSBnZXRDb2x1bW5WYWx1ZShvYmpSb3cxKTsKLQkJCU9iamVjdCBvYmpWYWx1ZTIgPSBnZXRDb2x1bW5WYWx1ZShvYmpSb3cyKTsKLQotICAgICAgICAgICAgaWYgKG9ialZhbHVlMSA9PSBvYmpWYWx1ZTIpCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAgICAgICAgIGJvb2xlYW4gYkNvbXBhcmFibGUxID0gb2JqVmFsdWUxIGluc3RhbmNlb2YgQ29tcGFyYWJsZTsKLSAgICAgICAgICAgIGJvb2xlYW4gYkNvbXBhcmFibGUyID0gb2JqVmFsdWUyIGluc3RhbmNlb2YgQ29tcGFyYWJsZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gbm9uLWNvbXBhcmFibGUgdmFsdWVzIGFyZSBjb25zaWRlcmVkIGVxdWFsIAotCQkJaWYgKCFiQ29tcGFyYWJsZTEgJiYgIWJDb21wYXJhYmxlMikKLQkJCQlyZXR1cm4gMDsKLQotICAgICAgICAgICAgLy8gbm9uLWNvbXBhcmFibGUgdmFsdWVzIChudWxsIGluY2x1ZGVkKSBhcmUgY29uc2lkZXJlZCBzbWFsbGVyIAotICAgICAgICAgICAgLy8gdGhhbiB0aGUgY29tcGFyYWJsZSBvbmVzCi0gICAgICAgICAgICBpZiAoIWJDb21wYXJhYmxlMSkKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0KLSAgICAgICAgICAgIGlmICghYkNvbXBhcmFibGUyKQotICAgICAgICAgICAgICAgIHJldHVybiAxOwotCi0JCQlyZXR1cm4gKChDb21wYXJhYmxlKSBvYmpWYWx1ZTEpLmNvbXBhcmVUbyhvYmpWYWx1ZTIpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdGFibGUvbW9kZWwvc2ltcGxlL1NpbXBsZVRhYmxlQ29sdW1uRm9ybVJlbmRlcmVyU291cmNlLmphdmEgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdGFibGUvbW9kZWwvc2ltcGxlL1NpbXBsZVRhYmxlQ29sdW1uRm9ybVJlbmRlcmVyU291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjNDNiOWEuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL21vZGVsL3NpbXBsZS9TaW1wbGVUYWJsZUNvbHVtbkZvcm1SZW5kZXJlclNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5tb2RlbC5zaW1wbGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZW5kZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVxdWVzdEN5Y2xlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5tb2RlbC5JVGFibGVDb2x1bW47Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsLklUYWJsZU1vZGVsU291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5tb2RlbC5JVGFibGVSZW5kZXJlclNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuY29tbW9uLkNvbXBvbmVudFRhYmxlUmVuZGVyZXJTb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS51dGlsLkNvbXBvbmVudEFkZHJlc3M7Ci0KLS8qKgotICogVGhpcyBpcyBhIHNpbXBsZSBpbXBsZW1lbnRhdGlvbiBvZiAKLSAqIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuSVRhYmxlUmVuZGVyZXJTb3VyY2V9IAotICogdGhhdCByZXR1cm5zIGEgc3RhbmRhcmQgcmVuZGVyZXIgb2YgYSBjb2x1bW4gaGVhZGVyLiA8cD4KLSAqIAotICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXF1aXJlcyB0aGF0IHRoZSBjb2x1bW4gcGFzc2VkIGlzIG9mIHR5cGUgU2ltcGxlVGFibGVDb2x1bW4KLSAqIAotICogQHNlZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuY29tbW9uLkFic3RyYWN0VGFibGVDb2x1bW4KLSAqIEB2ZXJzaW9uICRJZCQKLSAqIEBhdXRob3IgbWluZGJyaWRnZQotICogQHNpbmNlIDIuMwotICovCi1wdWJsaWMgY2xhc3MgU2ltcGxlVGFibGVDb2x1bW5Gb3JtUmVuZGVyZXJTb3VyY2UgaW1wbGVtZW50cyBJVGFibGVSZW5kZXJlclNvdXJjZQotewotCXByaXZhdGUgQ29tcG9uZW50VGFibGVSZW5kZXJlclNvdXJjZSBtX29iakNvbXBvbmVudFJlbmRlcmVyOwotCi0JcHVibGljIFNpbXBsZVRhYmxlQ29sdW1uRm9ybVJlbmRlcmVyU291cmNlKCkKLQl7Ci0JCW1fb2JqQ29tcG9uZW50UmVuZGVyZXIgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsLklUYWJsZVJlbmRlcmVyU291cmNlI2dldFJlbmRlcmVyKElSZXF1ZXN0Q3ljbGUsIElUYWJsZU1vZGVsU291cmNlLCBJVGFibGVDb2x1bW4sIE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgSVJlbmRlciBnZXRSZW5kZXJlcigKLQkJSVJlcXVlc3RDeWNsZSBvYmpDeWNsZSwKLQkJSVRhYmxlTW9kZWxTb3VyY2Ugb2JqU291cmNlLAotCQlJVGFibGVDb2x1bW4gb2JqQ29sdW1uLAotCQlPYmplY3Qgb2JqUm93KQotCXsKLQkJCXN5bmNocm9uaXplZCAodGhpcykKLQkJCXsKLQkJCQlpZiAobV9vYmpDb21wb25lbnRSZW5kZXJlciA9PSBudWxsKQotCQkJCXsKLQkJCQkJQ29tcG9uZW50QWRkcmVzcyBvYmpBZGRyZXNzID0KLQkJCQkJCW5ldyBDb21wb25lbnRBZGRyZXNzKAotCQkJCQkJCW9ialNvdXJjZS5nZXROYW1lc3BhY2UoKSwKLQkJCQkJCQkiU2ltcGxlVGFibGVDb2x1bW5QYWdlIiwKLQkJCQkJCQkidGFibGVDb2x1bW5Gb3JtQ29tcG9uZW50Iik7Ci0JCQkJCW1fb2JqQ29tcG9uZW50UmVuZGVyZXIgPQotCQkJCQkJbmV3IENvbXBvbmVudFRhYmxlUmVuZGVyZXJTb3VyY2Uob2JqQWRkcmVzcyk7Ci0JCQkJfQotCQkJfQotCi0JCXJldHVybiBtX29iakNvbXBvbmVudFJlbmRlcmVyLmdldFJlbmRlcmVyKAotCQkJb2JqQ3ljbGUsCi0JCQlvYmpTb3VyY2UsCi0JCQlvYmpDb2x1bW4sCi0JCQlvYmpSb3cpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90YWJsZS9tb2RlbC9zaW1wbGUvU2ltcGxlVGFibGVDb2x1bW5Nb2RlbC5qYXZhIGIvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL21vZGVsL3NpbXBsZS9TaW1wbGVUYWJsZUNvbHVtbk1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjNTE5ZGIuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL21vZGVsL3NpbXBsZS9TaW1wbGVUYWJsZUNvbHVtbk1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsLnNpbXBsZTsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsLklUYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuSVRhYmxlQ29sdW1uTW9kZWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsLmNvbW1vbi5BcnJheUl0ZXJhdG9yOwotCi0vKioKLSAqIEEgbWluaW1hbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgCi0gKiB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsLklUYWJsZUNvbHVtbk1vZGVsfSBpbnRlcmZhY2UKLSAqIHRoYXQgc3RvcmVzIGNvbHVtbnMgYXMgYW4gYXJyYXkuCi0gKiAKLSAqIEB2ZXJzaW9uICRJZCQKLSAqIEBhdXRob3IgbWluZGJyaWRnZQotICovCi1wdWJsaWMgY2xhc3MgU2ltcGxlVGFibGVDb2x1bW5Nb2RlbCBpbXBsZW1lbnRzIElUYWJsZUNvbHVtbk1vZGVsLCBTZXJpYWxpemFibGUKLXsKLQotICAgIHByaXZhdGUgSVRhYmxlQ29sdW1uW10gbV9hcnJDb2x1bW5zOwotICAgIHByaXZhdGUgTWFwIG1fbWFwQ29sdW1uczsKLQotICAgIHB1YmxpYyBTaW1wbGVUYWJsZUNvbHVtbk1vZGVsKElUYWJsZUNvbHVtbltdIGFyckNvbHVtbnMpCi0gICAgewotICAgICAgICBtX2FyckNvbHVtbnMgPSBhcnJDb2x1bW5zOwotCi0gICAgICAgIG1fbWFwQ29sdW1ucyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9hcnJDb2x1bW5zLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgbV9tYXBDb2x1bW5zLnB1dChtX2FyckNvbHVtbnNbaV0uZ2V0Q29sdW1uTmFtZSgpLCBtX2FyckNvbHVtbnNbaV0pOwotICAgIH0KLQotICAgIHB1YmxpYyBTaW1wbGVUYWJsZUNvbHVtbk1vZGVsKExpc3QgYXJyQ29sdW1ucykKLSAgICB7Ci0gICAgICAgIHRoaXMoKElUYWJsZUNvbHVtbltdKSBhcnJDb2x1bW5zLnRvQXJyYXkobmV3IElUYWJsZUNvbHVtblthcnJDb2x1bW5zLnNpemUoKV0pKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldENvbHVtbkNvdW50KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX2FyckNvbHVtbnMubGVuZ3RoOwotICAgIH0KLQotICAgIHB1YmxpYyBJVGFibGVDb2x1bW4gZ2V0Q29sdW1uKGludCBuQ29sdW1uKQotICAgIHsKLSAgICAgICAgaWYgKG5Db2x1bW4gPCAwIHx8IG5Db2x1bW4gPj0gbV9hcnJDb2x1bW5zLmxlbmd0aCkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gZXJyb3IgbWVzc2FnZQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1fYXJyQ29sdW1uc1tuQ29sdW1uXTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSVRhYmxlQ29sdW1uIGdldENvbHVtbihTdHJpbmcgc3RyQ29sdW1uKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChJVGFibGVDb2x1bW4pIG1fbWFwQ29sdW1ucy5nZXQoc3RyQ29sdW1uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSXRlcmF0b3IgZ2V0Q29sdW1ucygpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IEFycmF5SXRlcmF0b3IobV9hcnJDb2x1bW5zKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90YWJsZS9tb2RlbC9zaW1wbGUvU2ltcGxlVGFibGVDb2x1bW5SZW5kZXJlclNvdXJjZS5qYXZhIGIvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL21vZGVsL3NpbXBsZS9TaW1wbGVUYWJsZUNvbHVtblJlbmRlcmVyU291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlMDY1OGUuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL21vZGVsL3NpbXBsZS9TaW1wbGVUYWJsZUNvbHVtblJlbmRlcmVyU291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsLnNpbXBsZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlbmRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZXF1ZXN0Q3ljbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsLklUYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuSVRhYmxlTW9kZWxTb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsLklUYWJsZVJlbmRlcmVyU291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5tb2RlbC5jb21tb24uQ29tcG9uZW50VGFibGVSZW5kZXJlclNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnV0aWwuQ29tcG9uZW50QWRkcmVzczsKLQotLyoqCi0gKiBUaGlzIGlzIGEgc2ltcGxlIGltcGxlbWVudGF0aW9uIG9mIAotICoge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5tb2RlbC5JVGFibGVSZW5kZXJlclNvdXJjZX0gCi0gKiB0aGF0IHJldHVybnMgYSBzdGFuZGFyZCByZW5kZXJlciBvZiBhIGNvbHVtbiBoZWFkZXIuIDxwPgotICogCi0gKiBUaGlzIGltcGxlbWVudGF0aW9uIHJlcXVpcmVzIHRoYXQgdGhlIGNvbHVtbiBwYXNzZWQgaXMgb2YgdHlwZSBTaW1wbGVUYWJsZUNvbHVtbgotICogCi0gKiBAc2VlIG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5tb2RlbC5jb21tb24uQWJzdHJhY3RUYWJsZUNvbHVtbgotICogQHZlcnNpb24gJElkJAotICogQGF1dGhvciBtaW5kYnJpZGdlCi0gKiBAc2luY2UgMi4zCi0gKi8KLXB1YmxpYyBjbGFzcyBTaW1wbGVUYWJsZUNvbHVtblJlbmRlcmVyU291cmNlIGltcGxlbWVudHMgSVRhYmxlUmVuZGVyZXJTb3VyY2UKLXsKLQlwcml2YXRlIENvbXBvbmVudFRhYmxlUmVuZGVyZXJTb3VyY2UgbV9vYmpDb21wb25lbnRSZW5kZXJlcjsKLQotCXB1YmxpYyBTaW1wbGVUYWJsZUNvbHVtblJlbmRlcmVyU291cmNlKCkKLQl7Ci0JCW1fb2JqQ29tcG9uZW50UmVuZGVyZXIgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsLklUYWJsZVJlbmRlcmVyU291cmNlI2dldFJlbmRlcmVyKElSZXF1ZXN0Q3ljbGUsIElUYWJsZU1vZGVsU291cmNlLCBJVGFibGVDb2x1bW4sIE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgSVJlbmRlciBnZXRSZW5kZXJlcigKLQkJSVJlcXVlc3RDeWNsZSBvYmpDeWNsZSwKLQkJSVRhYmxlTW9kZWxTb3VyY2Ugb2JqU291cmNlLAotCQlJVGFibGVDb2x1bW4gb2JqQ29sdW1uLAotCQlPYmplY3Qgb2JqUm93KQotCXsKLQkJCXN5bmNocm9uaXplZCAodGhpcykKLQkJCXsKLQkJCQlpZiAobV9vYmpDb21wb25lbnRSZW5kZXJlciA9PSBudWxsKQotCQkJCXsKLQkJCQkJQ29tcG9uZW50QWRkcmVzcyBvYmpBZGRyZXNzID0KLQkJCQkJCW5ldyBDb21wb25lbnRBZGRyZXNzKAotCQkJCQkJCW9ialNvdXJjZS5nZXROYW1lc3BhY2UoKSwKLQkJCQkJCQkiU2ltcGxlVGFibGVDb2x1bW5QYWdlIiwKLQkJCQkJCQkidGFibGVDb2x1bW5Db21wb25lbnQiKTsKLQkJCQkJbV9vYmpDb21wb25lbnRSZW5kZXJlciA9Ci0JCQkJCQluZXcgQ29tcG9uZW50VGFibGVSZW5kZXJlclNvdXJjZShvYmpBZGRyZXNzKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJcmV0dXJuIG1fb2JqQ29tcG9uZW50UmVuZGVyZXIuZ2V0UmVuZGVyZXIoCi0JCQlvYmpDeWNsZSwKLQkJCW9ialNvdXJjZSwKLQkJCW9iakNvbHVtbiwKLQkJCW9ialJvdyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL21vZGVsL3NpbXBsZS9TaW1wbGVUYWJsZU1vZGVsLmphdmEgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdGFibGUvbW9kZWwvc2ltcGxlL1NpbXBsZVRhYmxlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFjZDEzZC4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdGFibGUvbW9kZWwvc2ltcGxlL1NpbXBsZVRhYmxlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MCArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsLnNpbXBsZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsLkNUYWJsZURhdGFNb2RlbEV2ZW50OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5tb2RlbC5JVGFibGVDb2x1bW47Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsLklUYWJsZUNvbHVtbk1vZGVsOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5tb2RlbC5JVGFibGVEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsLklUYWJsZURhdGFNb2RlbExpc3RlbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5tb2RlbC5JVGFibGVTb3J0aW5nU3RhdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsLmNvbW1vbi5BYnN0cmFjdFRhYmxlTW9kZWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsLmNvbW1vbi5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5tb2RlbC5jb21tb24uUmV2ZXJzZUNvbXBhcmF0b3I7Ci0KLS8qKgotICogQSBzaW1wbGUgZ2VuZXJpYyB0YWJsZSBtb2RlbCBpbXBsZW1lbnRhdGlvbi4KLSAqIAotICogQHZlcnNpb24gJElkJAotICogQGF1dGhvciBtaW5kYnJpZGdlCi0gKi8KLXB1YmxpYyBjbGFzcyBTaW1wbGVUYWJsZU1vZGVsIGV4dGVuZHMgQWJzdHJhY3RUYWJsZU1vZGVsIGltcGxlbWVudHMgSVRhYmxlRGF0YU1vZGVsTGlzdGVuZXIKLXsKLSAgICBwcml2YXRlIElUYWJsZURhdGFNb2RlbCBtX29iakRhdGFNb2RlbCA9IG51bGw7Ci0gICAgcHJpdmF0ZSBPYmplY3RbXSBtX2FyclJvd3MgPSBudWxsOwotICAgIHByaXZhdGUgSVRhYmxlQ29sdW1uTW9kZWwgbV9vYmpDb2x1bW5Nb2RlbCA9IG51bGw7Ci0KLSAgICBwcml2YXRlIFNpbXBsZVRhYmxlU29ydGluZ1N0YXRlIG1fb2JqTGFzdFNvcnRpbmdTdGF0ZTsKLQotICAgIHB1YmxpYyBTaW1wbGVUYWJsZU1vZGVsKE9iamVjdFtdIGFyckRhdGEsIElUYWJsZUNvbHVtbltdIGFyckNvbHVtbnMpCi0gICAgewotICAgICAgICB0aGlzKG5ldyBTaW1wbGVMaXN0VGFibGVEYXRhTW9kZWwoYXJyRGF0YSksIG5ldyBTaW1wbGVUYWJsZUNvbHVtbk1vZGVsKGFyckNvbHVtbnMpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2ltcGxlVGFibGVNb2RlbChPYmplY3RbXSBhcnJEYXRhLCBJVGFibGVDb2x1bW5Nb2RlbCBvYmpDb2x1bW5Nb2RlbCkKLSAgICB7Ci0gICAgICAgIHRoaXMobmV3IFNpbXBsZUxpc3RUYWJsZURhdGFNb2RlbChhcnJEYXRhKSwgb2JqQ29sdW1uTW9kZWwpOwotICAgIH0KLQotICAgIHB1YmxpYyBTaW1wbGVUYWJsZU1vZGVsKElUYWJsZURhdGFNb2RlbCBvYmpEYXRhTW9kZWwsIElUYWJsZUNvbHVtbk1vZGVsIG9iakNvbHVtbk1vZGVsKQotICAgIHsKLSAgICAgICAgdGhpcyhvYmpEYXRhTW9kZWwsIG9iakNvbHVtbk1vZGVsLCBuZXcgU2ltcGxlVGFibGVTdGF0ZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2ltcGxlVGFibGVNb2RlbChJVGFibGVEYXRhTW9kZWwgb2JqRGF0YU1vZGVsLCBJVGFibGVDb2x1bW5Nb2RlbCBvYmpDb2x1bW5Nb2RlbCwgU2ltcGxlVGFibGVTdGF0ZSBvYmpTdGF0ZSkKLSAgICB7Ci0gICAgICAgIHN1cGVyKG9ialN0YXRlKTsKLSAgICAgICAgCi0gICAgICAgIG1fYXJyUm93cyA9IG51bGw7Ci0gICAgICAgIG1fb2JqQ29sdW1uTW9kZWwgPSBvYmpDb2x1bW5Nb2RlbDsKLSAgICAgICAgbV9vYmpMYXN0U29ydGluZ1N0YXRlID0gbmV3IFNpbXBsZVRhYmxlU29ydGluZ1N0YXRlKCk7Ci0KLSAgICAgICAgc2V0RGF0YU1vZGVsKG9iakRhdGFNb2RlbCk7Ci0gICAgfQotCi0gICAgcHVibGljIElUYWJsZUNvbHVtbk1vZGVsIGdldENvbHVtbk1vZGVsKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX29iakNvbHVtbk1vZGVsOwotICAgIH0KLQotICAgIHB1YmxpYyBJdGVyYXRvciBnZXRDdXJyZW50UGFnZVJvd3MoKQotICAgIHsKLSAgICAgICAgc29ydFJvd3MoKTsKLQotICAgICAgICBpbnQgblBhZ2VTaXplID0gZ2V0UGFnaW5nU3RhdGUoKS5nZXRQYWdlU2l6ZSgpOwotICAgICAgICBpZiAoblBhZ2VTaXplIDw9IDApCi0gICAgICAgICAgICByZXR1cm4gbmV3IEFycmF5SXRlcmF0b3IobV9hcnJSb3dzKTsKLQotICAgICAgICBpbnQgbkN1cnJlbnRQYWdlID0gZ2V0UGFnaW5nU3RhdGUoKS5nZXRDdXJyZW50UGFnZSgpOwotICAgICAgICBpbnQgbkZyb20gPSBuQ3VycmVudFBhZ2UgKiBuUGFnZVNpemU7Ci0gICAgICAgIGludCBuVG8gPSAobkN1cnJlbnRQYWdlICsgMSkgKiBuUGFnZVNpemU7Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yKG1fYXJyUm93cywgbkZyb20sIG5Ubyk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRSb3dDb3VudCgpCi0gICAgewotICAgICAgICB1cGRhdGVSb3dzKCk7Ci0gICAgICAgIHJldHVybiBtX2FyclJvd3MubGVuZ3RoOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVSb3dzKCkKLSAgICB7Ci0gICAgICAgIC8vIElmIGl0IGlzIG5vdCBudWxsLCB0aGVuIHRoZXJlIGlzIG5vIG5lZWQgdG8gZXh0cmFjdCB0aGUgZGF0YQotICAgICAgICBpZiAobV9hcnJSb3dzICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgLy8gRXh0cmFjdCB0aGUgZGF0YSBmcm9tIHRoZSBtb2RlbAotICAgICAgICBtX29iakxhc3RTb3J0aW5nU3RhdGUgPSBuZXcgU2ltcGxlVGFibGVTb3J0aW5nU3RhdGUoKTsKLQotICAgICAgICBpbnQgblJvd0NvdW50ID0gbV9vYmpEYXRhTW9kZWwuZ2V0Um93Q291bnQoKTsKLSAgICAgICAgT2JqZWN0W10gYXJyUm93cyA9IG5ldyBPYmplY3RbblJvd0NvdW50XTsKLQotICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBtX29iakRhdGFNb2RlbC5nZXRSb3dzKCk7IGl0Lmhhc05leHQoKTspCi0gICAgICAgICAgICBhcnJSb3dzW2krK10gPSBpdC5uZXh0KCk7Ci0KLSAgICAgICAgbV9hcnJSb3dzID0gYXJyUm93czsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzb3J0Um93cygpCi0gICAgewotICAgICAgICB1cGRhdGVSb3dzKCk7Ci0KLSAgICAgICAgSVRhYmxlU29ydGluZ1N0YXRlIG9ialNvcnRpbmdTdGF0ZSA9IGdldFNvcnRpbmdTdGF0ZSgpOwotCi0gICAgICAgIC8vIHNlZSBpZiB0aGVyZSBpcyBzb3J0aW5nIHJlcXVpcmVkCi0gICAgICAgIFN0cmluZyBzdHJTb3J0Q29sdW1uID0gb2JqU29ydGluZ1N0YXRlLmdldFNvcnRDb2x1bW4oKTsKLSAgICAgICAgaWYgKHN0clNvcnRDb2x1bW4gPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBib29sZWFuIGJTb3J0T3JkZXIgPSBvYmpTb3J0aW5nU3RhdGUuZ2V0U29ydE9yZGVyKCk7Ci0KLSAgICAgICAgLy8gU2VlIGlmIHRoZSB0YWJsZSBpcyBhbHJlYWR5IHNvcnRlZCB0aGlzIHdheS4gSWYgc28sIHJldHVybi4KLSAgICAgICAgaWYgKHN0clNvcnRDb2x1bW4uZXF1YWxzKG1fb2JqTGFzdFNvcnRpbmdTdGF0ZS5nZXRTb3J0Q29sdW1uKCkpCi0gICAgICAgICAgICAmJiBtX29iakxhc3RTb3J0aW5nU3RhdGUuZ2V0U29ydE9yZGVyKCkgPT0gYlNvcnRPcmRlcikKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBJVGFibGVDb2x1bW4gb2JqQ29sdW1uID0gZ2V0Q29sdW1uTW9kZWwoKS5nZXRDb2x1bW4oc3RyU29ydENvbHVtbik7Ci0gICAgICAgIGlmIChvYmpDb2x1bW4gPT0gbnVsbCB8fCAhb2JqQ29sdW1uLmdldFNvcnRhYmxlKCkpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgQ29tcGFyYXRvciBvYmpDbXAgPSBvYmpDb2x1bW4uZ2V0Q29tcGFyYXRvcigpOwotICAgICAgICBpZiAob2JqQ21wID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgLy8gT2theSwgd2UgaGF2ZSBldmVyeXRoaW5nIGluIHBsYWNlLiBTb3J0IHRoZSByb3dzLgotICAgICAgICBpZiAoYlNvcnRPcmRlciA9PSBJVGFibGVTb3J0aW5nU3RhdGUuU09SVF9ERVNDRU5ESU5HKQotICAgICAgICAgICAgb2JqQ21wID0gbmV3IFJldmVyc2VDb21wYXJhdG9yKG9iakNtcCk7Ci0KLSAgICAgICAgQXJyYXlzLnNvcnQobV9hcnJSb3dzLCBvYmpDbXApOwotCi0gICAgICAgIG1fb2JqTGFzdFNvcnRpbmdTdGF0ZS5zZXRTb3J0Q29sdW1uKHN0clNvcnRDb2x1bW4sIGJTb3J0T3JkZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRhYmxlRGF0YUNoYW5nZWQoQ1RhYmxlRGF0YU1vZGVsRXZlbnQgb2JqRXZlbnQpCi0gICAgewotICAgICAgICBtX2FyclJvd3MgPSBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGRhdGFNb2RlbC4KLSAgICAgKiBAcmV0dXJuIElUYWJsZURhdGFNb2RlbAotICAgICAqLwotICAgIHB1YmxpYyBJVGFibGVEYXRhTW9kZWwgZ2V0RGF0YU1vZGVsKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX29iakRhdGFNb2RlbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBkYXRhTW9kZWwuCi0gICAgICogQHBhcmFtIGRhdGFNb2RlbCBUaGUgZGF0YU1vZGVsIHRvIHNldAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERhdGFNb2RlbChJVGFibGVEYXRhTW9kZWwgZGF0YU1vZGVsKQotICAgIHsKLSAgICAgICAgaWYgKG1fb2JqRGF0YU1vZGVsICE9IG51bGwpCi0gICAgICAgICAgICBtX29iakRhdGFNb2RlbC5yZW1vdmVUYWJsZURhdGFNb2RlbExpc3RlbmVyKHRoaXMpOwotICAgICAgICAgICAgCi0gICAgICAgIG1fb2JqRGF0YU1vZGVsID0gZGF0YU1vZGVsOwotICAgICAgICBtX29iakRhdGFNb2RlbC5hZGRUYWJsZURhdGFNb2RlbExpc3RlbmVyKHRoaXMpOwotICAgICAgICAKLSAgICAgICAgbV9hcnJSb3dzID0gbnVsbDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90YWJsZS9tb2RlbC9zaW1wbGUvU2ltcGxlVGFibGVQYWdpbmdTdGF0ZS5qYXZhIGIvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL21vZGVsL3NpbXBsZS9TaW1wbGVUYWJsZVBhZ2luZ1N0YXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5NjhlNmMuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL21vZGVsL3NpbXBsZS9TaW1wbGVUYWJsZVBhZ2luZ1N0YXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsLnNpbXBsZTsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsLklUYWJsZVBhZ2luZ1N0YXRlOwotCi0vKioKLSAqIEEgbWluaW1hbCBpbXBsZW1lbnRhdGlvbiBvZiAKLSAqIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuSVRhYmxlUGFnaW5nU3RhdGV9LgotICogCi0gKiBAdmVyc2lvbiAkSWQkCi0gKiBAYXV0aG9yIG1pbmRicmlkZ2UKLSAqLwotcHVibGljIGNsYXNzIFNpbXBsZVRhYmxlUGFnaW5nU3RhdGUgaW1wbGVtZW50cyBJVGFibGVQYWdpbmdTdGF0ZSwgU2VyaWFsaXphYmxlCi17Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IERFRkFVTFRfUEFHRV9TSVpFID0gMTA7Ci0KLSAgICBwcml2YXRlIGludCBtX25QYWdlU2l6ZTsKLSAgICBwcml2YXRlIGludCBtX25DdXJyZW50UGFnZTsKLQotICAgIHB1YmxpYyBTaW1wbGVUYWJsZVBhZ2luZ1N0YXRlKCkKLSAgICB7Ci0gICAgICAgIG1fblBhZ2VTaXplID0gREVGQVVMVF9QQUdFX1NJWkU7Ci0gICAgICAgIG1fbkN1cnJlbnRQYWdlID0gMDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBwYWdlU2l6ZS4KLSAgICAgKiBAcmV0dXJuIGludAotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0UGFnZVNpemUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fblBhZ2VTaXplOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHBhZ2VTaXplLgotICAgICAqIEBwYXJhbSBwYWdlU2l6ZSBUaGUgcGFnZVNpemUgdG8gc2V0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UGFnZVNpemUoaW50IHBhZ2VTaXplKQotICAgIHsKLSAgICAgICAgbV9uUGFnZVNpemUgPSBwYWdlU2l6ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50UGFnZS4KLSAgICAgKiBAcmV0dXJuIGludAotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0Q3VycmVudFBhZ2UoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fbkN1cnJlbnRQYWdlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGN1cnJlbnRQYWdlLgotICAgICAqIEBwYXJhbSBjdXJyZW50UGFnZSBUaGUgY3VycmVudFBhZ2UgdG8gc2V0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q3VycmVudFBhZ2UoaW50IGN1cnJlbnRQYWdlKQotICAgIHsKLSAgICAgICAgbV9uQ3VycmVudFBhZ2UgPSBjdXJyZW50UGFnZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90YWJsZS9tb2RlbC9zaW1wbGUvU2ltcGxlVGFibGVTZXNzaW9uU3RhdGVNYW5hZ2VyLmphdmEgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdGFibGUvbW9kZWwvc2ltcGxlL1NpbXBsZVRhYmxlU2Vzc2lvblN0YXRlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWUwYjlmLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90YWJsZS9tb2RlbC9zaW1wbGUvU2ltcGxlVGFibGVTZXNzaW9uU3RhdGVNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsLnNpbXBsZTsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsLklUYWJsZUNvbHVtbk1vZGVsOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5tb2RlbC5JVGFibGVEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsLklUYWJsZU1vZGVsOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5tb2RlbC5JVGFibGVTZXNzaW9uU3RhdGVNYW5hZ2VyOwotCi0vKioKLSAqIEEge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5tb2RlbC5JVGFibGVTZXNzaW9uU3RhdGVNYW5hZ2VyfSAKLSAqIGltcGxlbWVudGF0aW9uIHRoYXQgc2F2ZXMgb25seSB0aGUgcGFnaW5nIGFuZCBzb3J0aW5nIHN0YXRlIG9mIHRoZSB0YWJsZSBtb2RlbCAKLSAqIGludG8gdGhlIHNlc3Npb24uCi0gKiAKLSAqIEB2ZXJzaW9uICRJZCQKLSAqIEBhdXRob3IgbWluZGJyaWRnZQotICovCi1wdWJsaWMgY2xhc3MgU2ltcGxlVGFibGVTZXNzaW9uU3RhdGVNYW5hZ2VyCi0JaW1wbGVtZW50cyBJVGFibGVTZXNzaW9uU3RhdGVNYW5hZ2VyCi17Ci0JcHJpdmF0ZSBJVGFibGVEYXRhTW9kZWwgbV9vYmpEYXRhTW9kZWw7Ci0JcHJpdmF0ZSBJVGFibGVDb2x1bW5Nb2RlbCBtX29iakNvbHVtbk1vZGVsOwotCi0JcHVibGljIFNpbXBsZVRhYmxlU2Vzc2lvblN0YXRlTWFuYWdlcigKLQkJSVRhYmxlRGF0YU1vZGVsIG9iakRhdGFNb2RlbCwKLQkJSVRhYmxlQ29sdW1uTW9kZWwgb2JqQ29sdW1uTW9kZWwpCi0JewotCQltX29iakRhdGFNb2RlbCA9IG9iakRhdGFNb2RlbDsKLQkJbV9vYmpDb2x1bW5Nb2RlbCA9IG9iakNvbHVtbk1vZGVsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsLklUYWJsZVNlc3Npb25TdGF0ZU1hbmFnZXIjZ2V0U2Vzc2lvblN0YXRlKElUYWJsZU1vZGVsKQotCSAqLwotCXB1YmxpYyBTZXJpYWxpemFibGUgZ2V0U2Vzc2lvblN0YXRlKElUYWJsZU1vZGVsIG9iak1vZGVsKQotCXsKLQkJU2ltcGxlVGFibGVNb2RlbCBvYmpTaW1wbGVNb2RlbCA9IChTaW1wbGVUYWJsZU1vZGVsKSBvYmpNb2RlbDsKLQkJcmV0dXJuIG9ialNpbXBsZU1vZGVsLmdldFN0YXRlKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuSVRhYmxlU2Vzc2lvblN0YXRlTWFuYWdlciNyZWNyZWF0ZVRhYmxlTW9kZWwoU2VyaWFsaXphYmxlKQotCSAqLwotCXB1YmxpYyBJVGFibGVNb2RlbCByZWNyZWF0ZVRhYmxlTW9kZWwoU2VyaWFsaXphYmxlIG9ialN0YXRlKQotCXsKLQkJaWYgKG9ialN0YXRlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU2ltcGxlVGFibGVTdGF0ZSBvYmpTaW1wbGVTdGF0ZSA9IChTaW1wbGVUYWJsZVN0YXRlKSBvYmpTdGF0ZTsKLQkJcmV0dXJuIG5ldyBTaW1wbGVUYWJsZU1vZGVsKAotCQkJbV9vYmpEYXRhTW9kZWwsCi0JCQltX29iakNvbHVtbk1vZGVsLAotCQkJb2JqU2ltcGxlU3RhdGUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL21vZGVsL3NpbXBsZS9TaW1wbGVUYWJsZVNvcnRpbmdTdGF0ZS5qYXZhIGIvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL21vZGVsL3NpbXBsZS9TaW1wbGVUYWJsZVNvcnRpbmdTdGF0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWQ1MzA3Li4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90YWJsZS9tb2RlbC9zaW1wbGUvU2ltcGxlVGFibGVTb3J0aW5nU3RhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuc2ltcGxlOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuSVRhYmxlU29ydGluZ1N0YXRlOwotCi0vKioKLSAqIEEgbWluaW1hbCBpbXBsZW1lbnRhdGlvbiBvZiAKLSAqIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuSVRhYmxlU29ydGluZ1N0YXRlfQotICogCi0gKiBAdmVyc2lvbiAkSWQkCi0gKiBAYXV0aG9yIG1pbmRicmlkZ2UKLSAqLwotcHVibGljIGNsYXNzIFNpbXBsZVRhYmxlU29ydGluZ1N0YXRlCi0JaW1wbGVtZW50cyBJVGFibGVTb3J0aW5nU3RhdGUsIFNlcmlhbGl6YWJsZQotewotCXByaXZhdGUgU3RyaW5nIG1fc3RyU29ydENvbHVtbjsKLQlwcml2YXRlIGJvb2xlYW4gbV9iU29ydE9yZGVyOwotCi0JcHVibGljIFNpbXBsZVRhYmxlU29ydGluZ1N0YXRlKCkKLQl7Ci0JCW1fc3RyU29ydENvbHVtbiA9IG51bGw7IC8vIG5vIHNvcnRpbmcKLQkJbV9iU29ydE9yZGVyID0gSVRhYmxlU29ydGluZ1N0YXRlLlNPUlRfQVNDRU5ESU5HOwotCQkvLyBpcnJlbGV2YW50LCBidXQgYW55d2F5Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgU29ydE9yZGVyLgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldFNvcnRPcmRlcigpCi0JewotCQlyZXR1cm4gbV9iU29ydE9yZGVyOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIFNvcnRDb2x1bW4uCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNvcnRDb2x1bW4oKQotCXsKLQkJcmV0dXJuIG1fc3RyU29ydENvbHVtbjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBTb3J0Q29sdW1uLgotCSAqIEBwYXJhbSBzdHJTb3J0Q29sdW1uIFRoZSBTb3J0Q29sdW1uIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNvcnRDb2x1bW4oU3RyaW5nIHN0clNvcnRDb2x1bW4sIGJvb2xlYW4gYlNvcnRPcmRlcikKLQl7Ci0JCW1fc3RyU29ydENvbHVtbiA9IHN0clNvcnRDb2x1bW47Ci0JCW1fYlNvcnRPcmRlciA9IGJTb3J0T3JkZXI7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdGFibGUvbW9kZWwvc2ltcGxlL1NpbXBsZVRhYmxlU3RhdGUuamF2YSBiL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90YWJsZS9tb2RlbC9zaW1wbGUvU2ltcGxlVGFibGVTdGF0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjhkZjA3Li4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90YWJsZS9tb2RlbC9zaW1wbGUvU2ltcGxlVGFibGVTdGF0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5tb2RlbC5zaW1wbGU7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5tb2RlbC5JVGFibGVQYWdpbmdTdGF0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuSVRhYmxlU29ydGluZ1N0YXRlOwotCi0vKioKLSAqIEEgY29udGFpbmVyIGhvbGRpbmcgYWxsIG9mIHRoZSB0YWJsZSBtb2RlbCBzdGF0ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uICRJZCQKLSAqIEBhdXRob3IgbWluZGJyaWRnZQotICovCi1wdWJsaWMgY2xhc3MgU2ltcGxlVGFibGVTdGF0ZSBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZQotewotCXByaXZhdGUgSVRhYmxlUGFnaW5nU3RhdGUgbV9vYmpQYWdpbmdTdGF0ZTsKLQlwcml2YXRlIElUYWJsZVNvcnRpbmdTdGF0ZSBtX29ialNvcnRpbmdTdGF0ZTsKLQotCXB1YmxpYyBTaW1wbGVUYWJsZVN0YXRlKCkKLQl7Ci0JCXRoaXMobmV3IFNpbXBsZVRhYmxlUGFnaW5nU3RhdGUoKSwgbmV3IFNpbXBsZVRhYmxlU29ydGluZ1N0YXRlKCkpOwotCX0KLQotCXB1YmxpYyBTaW1wbGVUYWJsZVN0YXRlKAotCQlJVGFibGVQYWdpbmdTdGF0ZSBvYmpQYWdpbmdTdGF0ZSwKLQkJSVRhYmxlU29ydGluZ1N0YXRlIG9ialNvcnRpbmdTdGF0ZSkKLQl7Ci0JCW1fb2JqUGFnaW5nU3RhdGUgPSBvYmpQYWdpbmdTdGF0ZTsKLQkJbV9vYmpTb3J0aW5nU3RhdGUgPSBvYmpTb3J0aW5nU3RhdGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFnaW5nU3RhdGUuCi0JICogQHJldHVybiBJVGFibGVQYWdpbmdTdGF0ZQotCSAqLwotCXB1YmxpYyBJVGFibGVQYWdpbmdTdGF0ZSBnZXRQYWdpbmdTdGF0ZSgpCi0JewotCQlyZXR1cm4gbV9vYmpQYWdpbmdTdGF0ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzb3J0aW5nU3RhdGUuCi0JICogQHJldHVybiBJVGFibGVTb3J0aW5nU3RhdGUKLQkgKi8KLQlwdWJsaWMgSVRhYmxlU29ydGluZ1N0YXRlIGdldFNvcnRpbmdTdGF0ZSgpCi0JewotCQlyZXR1cm4gbV9vYmpTb3J0aW5nU3RhdGU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdGFibGUvbW9kZWwvc2ltcGxlL1NpbXBsZVRhYmxlVmFsdWVSZW5kZXJlclNvdXJjZS5qYXZhIGIvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL21vZGVsL3NpbXBsZS9TaW1wbGVUYWJsZVZhbHVlUmVuZGVyZXJTb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTIxNGM0My4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdGFibGUvbW9kZWwvc2ltcGxlL1NpbXBsZVRhYmxlVmFsdWVSZW5kZXJlclNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5tb2RlbC5zaW1wbGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZW5kZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVxdWVzdEN5Y2xlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5tb2RlbC5JVGFibGVDb2x1bW47Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsLklUYWJsZU1vZGVsU291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5tb2RlbC5JVGFibGVSZW5kZXJlclNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnZhbGlkLlJlbmRlclN0cmluZzsKLQotLyoqCi0gKiBUaGlzIGlzIGEgc2ltcGxlIGltcGxlbWVudGF0aW9uIG9mIAotICoge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5tb2RlbC5JVGFibGVSZW5kZXJlclNvdXJjZX0gCi0gKiB0aGF0IHJldHVybnMgYSBzdGFuZGFyZCByZW5kZXJlciBvZiBhIGNvbHVtbiB2YWx1ZS4KLSAqIAotICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXF1aXJlcyB0aGF0IHRoZSBjb2x1bW4gcGFzc2VkIGlzIG9mIHR5cGUgU2ltcGxlVGFibGVDb2x1bW4KLSAqIAotICogQHNlZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuY29tbW9uLkFic3RyYWN0VGFibGVDb2x1bW4KLSAqIEB2ZXJzaW9uICRJZCQKLSAqIEBhdXRob3IgbWluZGJyaWRnZQotICogQHNpbmNlIDIuMwotICovCi1wdWJsaWMgY2xhc3MgU2ltcGxlVGFibGVWYWx1ZVJlbmRlcmVyU291cmNlIGltcGxlbWVudHMgSVRhYmxlUmVuZGVyZXJTb3VyY2UKLXsKLSAgICAvKiogCi0gICAgICogIFRoZSByZXByZXNlbnRhdGlvbiBvZiBudWxsIHZhbHVlcy4gVGhpcyBpcyBnZWFyZWQgdG93YXJkcyBIVE1MLCBidXQgd2lsbAotICAgICAqICB3b3JrIGZvciBzb21lIG90aGVyICpNTCBsYW5ndWFnZXMgYXMgd2VsbC4gSW4gYW55IGNhc2UsIGNoYW5naW5nIHRoZSAKLSAgICAgKiAgY29sdW1uJ3MgdmFsdWUgcmVuZGVyZXIgYWxsb3dzIHNlbGVjdGluZyBmdWxseSBjdXN0b20gcmVuZGVyaW5nIGJlaGF2aW91ci4gCi0gICAgICoqLyAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU1QVFlfUkVQUkVTRU5UQVRJT04gPSAiJm5ic3A7IjsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsLklUYWJsZVJlbmRlcmVyU291cmNlI2dldFJlbmRlcmVyKElSZXF1ZXN0Q3ljbGUsIElUYWJsZU1vZGVsU291cmNlLCBJVGFibGVDb2x1bW4sIE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgSVJlbmRlciBnZXRSZW5kZXJlcigKLQkJSVJlcXVlc3RDeWNsZSBvYmpDeWNsZSwKLQkJSVRhYmxlTW9kZWxTb3VyY2Ugb2JqU291cmNlLAotCQlJVGFibGVDb2x1bW4gb2JqQ29sdW1uLAotCQlPYmplY3Qgb2JqUm93KQotCXsKLQkJU2ltcGxlVGFibGVDb2x1bW4gb2JqU2ltcGxlQ29sdW1uID0gKFNpbXBsZVRhYmxlQ29sdW1uKSBvYmpDb2x1bW47Ci0KLQkJT2JqZWN0IG9ialZhbHVlID0gb2JqU2ltcGxlQ29sdW1uLmdldENvbHVtblZhbHVlKG9ialJvdyk7Ci0JCWlmIChvYmpWYWx1ZSA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBSZW5kZXJTdHJpbmcoRU1QVFlfUkVQUkVTRU5UQVRJT04sIHRydWUpOwotCi0JCXJldHVybiBuZXcgUmVuZGVyU3RyaW5nKG9ialZhbHVlLnRvU3RyaW5nKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL21vZGVsL3NxbC9JU3FsQ29ubmVjdGlvblNvdXJjZS5qYXZhIGIvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL21vZGVsL3NxbC9JU3FsQ29ubmVjdGlvblNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTJhYjQ0Li4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90YWJsZS9tb2RlbC9zcWwvSVNxbENvbm5lY3Rpb25Tb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuc3FsOwotCi1pbXBvcnQgamF2YS5zcWwuQ29ubmVjdGlvbjsKLWltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247Ci0KLS8qKgotICogCi0gKiBAdmVyc2lvbiAkSWQkCi0gKiBAYXV0aG9yIG1pbmRicmlkZ2UKLSAqLwotcHVibGljIGludGVyZmFjZSBJU3FsQ29ubmVjdGlvblNvdXJjZQotewotCUNvbm5lY3Rpb24gb2J0YWluQ29ubmVjdGlvbigpIHRocm93cyBTUUxFeGNlcHRpb247Ci0Jdm9pZCByZXR1cm5Db25uZWN0aW9uKENvbm5lY3Rpb24gb2JqQ29ubmVjdGlvbik7Ci19CmRpZmYgLS1naXQgYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdGFibGUvbW9kZWwvc3FsL0lTcWxUYWJsZURhdGFTb3VyY2UuamF2YSBiL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90YWJsZS9tb2RlbC9zcWwvSVNxbFRhYmxlRGF0YVNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWE0YWJkLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90YWJsZS9tb2RlbC9zcWwvSVNxbFRhYmxlRGF0YVNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5tb2RlbC5zcWw7Ci0KLWltcG9ydCBqYXZhLnNxbC5SZXN1bHRTZXQ7Ci1pbXBvcnQgamF2YS5zcWwuU1FMRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsLnNpbXBsZS5TaW1wbGVUYWJsZVN0YXRlOwotCi0vKioKLSAqIAotICogQHZlcnNpb24gJElkJAotICogQGF1dGhvciBtaW5kYnJpZGdlCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVNxbFRhYmxlRGF0YVNvdXJjZQotewotCWludCBnZXRSb3dDb3VudCgpIHRocm93cyBTUUxFeGNlcHRpb247Ci0JUmVzdWx0U2V0IGdldEN1cnJlbnRSb3dzKAotCQlTcWxUYWJsZUNvbHVtbk1vZGVsIG9iakNvbHVtbk1vZGVsLAotCQlTaW1wbGVUYWJsZVN0YXRlIG9ialN0YXRlKQotCQl0aHJvd3MgU1FMRXhjZXB0aW9uOwotCXZvaWQgY2xvc2VSZXN1bHRTZXQoUmVzdWx0U2V0IG9ialJlc3VsdFNldCk7Ci19CmRpZmYgLS1naXQgYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdGFibGUvbW9kZWwvc3FsL1Jlc3VsdFNldEl0ZXJhdG9yLmphdmEgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdGFibGUvbW9kZWwvc3FsL1Jlc3VsdFNldEl0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3MTc0ZDUuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL21vZGVsL3NxbC9SZXN1bHRTZXRJdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuc3FsOwotCi1pbXBvcnQgamF2YS5zcWwuUmVzdWx0U2V0OwotaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotLyoqCi0gKiAKLSAqIEB2ZXJzaW9uICRJZCQKLSAqIEBhdXRob3IgbWluZGJyaWRnZQotICovCi1wdWJsaWMgY2xhc3MgUmVzdWx0U2V0SXRlcmF0b3IgaW1wbGVtZW50cyBJdGVyYXRvcgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBMT0cgPSBMb2dGYWN0b3J5LmdldExvZyhSZXN1bHRTZXRJdGVyYXRvci5jbGFzcyk7Ci0KLQlwcml2YXRlIFJlc3VsdFNldCBtX29ialJlc3VsdFNldDsKLQlwcml2YXRlIGJvb2xlYW4gbV9iRmV0Y2hlZDsKLQlwcml2YXRlIGJvb2xlYW4gbV9iQXZhaWxhYmxlOwotCi0JcHVibGljIFJlc3VsdFNldEl0ZXJhdG9yKFJlc3VsdFNldCBvYmpSZXN1bHRTZXQpCi0JewotCQltX29ialJlc3VsdFNldCA9IG9ialJlc3VsdFNldDsKLQkJbV9iRmV0Y2hlZCA9IGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgamF2YS51dGlsLkl0ZXJhdG9yI2hhc05leHQoKQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBoYXNOZXh0KCkKLQl7Ci0gICAgICAgIGlmIChnZXRSZXN1bHRTZXQoKSA9PSBudWxsKSByZXR1cm4gZmFsc2U7Ci0gICAgICAgIAotCQlpZiAoIW1fYkZldGNoZWQpCi0JCXsKLQkJCW1fYkZldGNoZWQgPSB0cnVlOwotCi0JCQl0cnkKLQkJCXsKLQkJCQltX2JBdmFpbGFibGUgPSAhZ2V0UmVzdWx0U2V0KCkuaXNMYXN0KCk7Ci0JCQl9Ci0JCQljYXRjaCAoU1FMRXhjZXB0aW9uIGUpCi0JCQl7Ci0JCQkJTE9HLndhcm4oCi0JCQkJCSJTUUxFeGNlcHRpb24gd2hpbGUgdGVzdGluZyBmb3IgZW5kIG9mIHRoZSBSZXN1bHRTZXQiLAotCQkJCQllKTsKLQkJCQltX2JBdmFpbGFibGUgPSBmYWxzZTsKLQkJCX0KLQotCQkJaWYgKCFtX2JBdmFpbGFibGUpCi0JCQkJbm90aWZ5RW5kKCk7Ci0JCX0KLQotCQlyZXR1cm4gbV9iQXZhaWxhYmxlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgamF2YS51dGlsLkl0ZXJhdG9yI25leHQoKQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgT2JqZWN0IG5leHQoKQotCXsKLQkJUmVzdWx0U2V0IG9ialJlc3VsdFNldCA9IGdldFJlc3VsdFNldCgpOwotCi0JCXRyeQotCQl7Ci0JCQlpZiAoIW9ialJlc3VsdFNldC5uZXh0KCkpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlKQotCQl7Ci0JCQlMT0cud2FybigiU1FMRXhjZXB0aW9uIHdoaWxlIGl0ZXJhdGluZyBvdmVyIHRoZSBSZXN1bHRTZXQiLCBlKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJbV9iRmV0Y2hlZCA9IGZhbHNlOwotCQlyZXR1cm4gb2JqUmVzdWx0U2V0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgamF2YS51dGlsLkl0ZXJhdG9yI3JlbW92ZSgpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkKLQl7Ci0JCXRyeQotCQl7Ci0JCQlnZXRSZXN1bHRTZXQoKS5kZWxldGVSb3coKTsKLQkJfQotCQljYXRjaCAoU1FMRXhjZXB0aW9uIGUpCi0JCXsKLQkJCUxPRy5lcnJvcigiQ2Fubm90IGRlbGV0ZSByZWNvcmQiLCBlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdFNldC4KLQkgKiBAcmV0dXJuIFJlc3VsdFNldAotCSAqLwotCXB1YmxpYyBSZXN1bHRTZXQgZ2V0UmVzdWx0U2V0KCkKLQl7Ci0JCXJldHVybiBtX29ialJlc3VsdFNldDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBub3RpZnlFbmQoKQotCXsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90YWJsZS9tb2RlbC9zcWwvU2ltcGxlU3FsQ29ubmVjdGlvblNvdXJjZS5qYXZhIGIvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL21vZGVsL3NxbC9TaW1wbGVTcWxDb25uZWN0aW9uU291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliNjQyNTMuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL21vZGVsL3NxbC9TaW1wbGVTcWxDb25uZWN0aW9uU291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsLnNxbDsKLQotaW1wb3J0IGphdmEuc3FsLkNvbm5lY3Rpb247Ci1pbXBvcnQgamF2YS5zcWwuRHJpdmVyTWFuYWdlcjsKLWltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotLyoqCi0gKiAKLSAqIEB2ZXJzaW9uICRJZCA6ICQKLSAqIEBhdXRob3IgbWluZGJyaWRnZQotICovCi1wdWJsaWMgY2xhc3MgU2ltcGxlU3FsQ29ubmVjdGlvblNvdXJjZSBpbXBsZW1lbnRzIElTcWxDb25uZWN0aW9uU291cmNlCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIExPRyA9Ci0JCUxvZ0ZhY3RvcnkuZ2V0TG9nKFNpbXBsZVNxbENvbm5lY3Rpb25Tb3VyY2UuY2xhc3MpOwotCi0JcHJpdmF0ZSBTdHJpbmcgbV9zdHJVcmw7Ci0JcHJpdmF0ZSBTdHJpbmcgbV9zdHJVc2VyOwotCXByaXZhdGUgU3RyaW5nIG1fc3RyUHdkOwotCi0JcHVibGljIFNpbXBsZVNxbENvbm5lY3Rpb25Tb3VyY2UoU3RyaW5nIHN0clVybCkKLQl7Ci0JCXRoaXMoc3RyVXJsLCBudWxsLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgU2ltcGxlU3FsQ29ubmVjdGlvblNvdXJjZSgKLQkJU3RyaW5nIHN0clVybCwKLQkJU3RyaW5nIHN0clVzZXIsCi0JCVN0cmluZyBzdHJQd2QpCi0JewotCQltX3N0clVybCA9IHN0clVybDsKLQkJbV9zdHJVc2VyID0gc3RyVXNlcjsKLQkJbV9zdHJQd2QgPSBzdHJQd2Q7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuc3FsLklTcWxDb25uZWN0aW9uU291cmNlI29idGFpbkNvbm5lY3Rpb24oKQotCSAqLwotCXB1YmxpYyBDb25uZWN0aW9uIG9idGFpbkNvbm5lY3Rpb24oKSB0aHJvd3MgU1FMRXhjZXB0aW9uCi0JewotCQlpZiAobV9zdHJVc2VyID09IG51bGwpCi0JCQlyZXR1cm4gRHJpdmVyTWFuYWdlci5nZXRDb25uZWN0aW9uKG1fc3RyVXJsKTsKLQkJZWxzZQotCQkJcmV0dXJuIERyaXZlck1hbmFnZXIuZ2V0Q29ubmVjdGlvbihtX3N0clVybCwgbV9zdHJVc2VyLCBtX3N0clB3ZCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuc3FsLklTcWxDb25uZWN0aW9uU291cmNlI3JldHVybkNvbm5lY3Rpb24oQ29ubmVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXR1cm5Db25uZWN0aW9uKENvbm5lY3Rpb24gb2JqQ29ubmVjdGlvbikKLQl7Ci0JCXRyeQotCQl7Ci0JCQlvYmpDb25uZWN0aW9uLmNsb3NlKCk7Ci0JCX0KLQkJY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlKQotCQl7Ci0JCQlMT0cud2FybigiQ291bGQgbm90IGNsb3NlIGNvbm5lY3Rpb24iLCBlKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL21vZGVsL3NxbC9TaW1wbGVTcWxUYWJsZURhdGFTb3VyY2UuamF2YSBiL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90YWJsZS9tb2RlbC9zcWwvU2ltcGxlU3FsVGFibGVEYXRhU291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyNGE2YjIuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL21vZGVsL3NxbC9TaW1wbGVTcWxUYWJsZURhdGFTb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NiArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsLnNxbDsKLQotaW1wb3J0IGphdmEuc3FsLkNvbm5lY3Rpb247Ci1pbXBvcnQgamF2YS5zcWwuUmVzdWx0U2V0OwotaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnNxbC5TdGF0ZW1lbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuSVRhYmxlUGFnaW5nU3RhdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsLklUYWJsZVNvcnRpbmdTdGF0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuc2ltcGxlLlNpbXBsZVRhYmxlU3RhdGU7Ci0KLS8qKgotICogCi0gKiBAdmVyc2lvbiAkSWQkCi0gKiBAYXV0aG9yIG1pbmRicmlkZ2UKLSAqLwotcHVibGljIGNsYXNzIFNpbXBsZVNxbFRhYmxlRGF0YVNvdXJjZSBpbXBsZW1lbnRzIElTcWxUYWJsZURhdGFTb3VyY2UKLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgTE9HID0KLQkJTG9nRmFjdG9yeS5nZXRMb2coU2ltcGxlU3FsVGFibGVEYXRhU291cmNlLmNsYXNzKTsKLQotCXByaXZhdGUgSVNxbENvbm5lY3Rpb25Tb3VyY2UgbV9vYmpDb25uU291cmNlOwotCXByaXZhdGUgU3RyaW5nIG1fc3RyVGFibGVOYW1lOwotCXByaXZhdGUgU3RyaW5nIG1fc3RyV2hlcmVDbGF1c2U7Ci0KLQlwdWJsaWMgU2ltcGxlU3FsVGFibGVEYXRhU291cmNlKAotCQlJU3FsQ29ubmVjdGlvblNvdXJjZSBvYmpDb25uU291cmNlLAotCQlTdHJpbmcgc3RyVGFibGVOYW1lKQotCXsKLQkJdGhpcyhvYmpDb25uU291cmNlLCBzdHJUYWJsZU5hbWUsIG51bGwpOwotCX0KLQotCXB1YmxpYyBTaW1wbGVTcWxUYWJsZURhdGFTb3VyY2UoCi0JCUlTcWxDb25uZWN0aW9uU291cmNlIG9iakNvbm5Tb3VyY2UsCi0JCVN0cmluZyBzdHJUYWJsZU5hbWUsCi0JCVN0cmluZyBzdHJXaGVyZUNsYXVzZSkKLQl7Ci0JCXNldENvbm5Tb3VyY2Uob2JqQ29ublNvdXJjZSk7Ci0JCXNldFRhYmxlTmFtZShzdHJUYWJsZU5hbWUpOwotCQlzZXRXaGVyZUNsYXVzZShzdHJXaGVyZUNsYXVzZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuc3FsLklTcWxUYWJsZURhdGFTb3VyY2UjZ2V0Um93Q291bnQoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Um93Q291bnQoKSB0aHJvd3MgU1FMRXhjZXB0aW9uCi0JewotCQlTdHJpbmcgc3RyUXVlcnkgPSBnZW5lcmF0ZUNvdW50UXVlcnkoKTsKLQkJTE9HLnRyYWNlKCJJbnZva2luZyBxdWVyeSB0byBjb3VudCByb3dzOiAiICsgc3RyUXVlcnkpOwotCi0JCUNvbm5lY3Rpb24gb2JqQ29ubiA9IGdldENvbm5Tb3VyY2UoKS5vYnRhaW5Db25uZWN0aW9uKCk7Ci0JCXRyeQotCQl7Ci0JCQlTdGF0ZW1lbnQgb2JqU3RtdCA9IG9iakNvbm4uY3JlYXRlU3RhdGVtZW50KCk7Ci0JCQl0cnkKLQkJCXsKLQkJCQlSZXN1bHRTZXQgb2JqUlMgPSBvYmpTdG10LmV4ZWN1dGVRdWVyeShzdHJRdWVyeSk7Ci0JCQkJb2JqUlMubmV4dCgpOwotCQkJCXJldHVybiBvYmpSUy5nZXRJbnQoMSk7Ci0JCQl9Ci0JCQlmaW5hbGx5Ci0JCQl7Ci0JCQkJb2JqU3RtdC5jbG9zZSgpOwotCQkJfQotCQl9Ci0JCWZpbmFsbHkKLQkJewotCQkJZ2V0Q29ublNvdXJjZSgpLnJldHVybkNvbm5lY3Rpb24ob2JqQ29ubik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5tb2RlbC5zcWwuSVNxbFRhYmxlRGF0YVNvdXJjZSNnZXRDdXJyZW50Um93cyhTcWxUYWJsZUNvbHVtbk1vZGVsLCBTaW1wbGVUYWJsZVN0YXRlKQotCSAqLwotCXB1YmxpYyBSZXN1bHRTZXQgZ2V0Q3VycmVudFJvd3MoCi0JCVNxbFRhYmxlQ29sdW1uTW9kZWwgb2JqQ29sdW1uTW9kZWwsCi0JCVNpbXBsZVRhYmxlU3RhdGUgb2JqU3RhdGUpCi0JCXRocm93cyBTUUxFeGNlcHRpb24KLQl7Ci0JCVN0cmluZyBzdHJRdWVyeSA9IGdlbmVyYXRlRGF0YVF1ZXJ5KG9iakNvbHVtbk1vZGVsLCBvYmpTdGF0ZSk7Ci0JCUxPRy50cmFjZSgiSW52b2tpbmcgcXVlcnkgdG8gbG9hZCBjdXJyZW50IHJvd3M6ICIgKyBzdHJRdWVyeSk7Ci0KLQkJQ29ubmVjdGlvbiBvYmpDb25uID0gZ2V0Q29ublNvdXJjZSgpLm9idGFpbkNvbm5lY3Rpb24oKTsKLQkJU3RhdGVtZW50IG9ialN0bXQgPSBvYmpDb25uLmNyZWF0ZVN0YXRlbWVudCgpOwotCQlyZXR1cm4gb2JqU3RtdC5leGVjdXRlUXVlcnkoc3RyUXVlcnkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsLnNxbC5JU3FsVGFibGVEYXRhU291cmNlI2Nsb3NlUmVzdWx0U2V0KFJlc3VsdFNldCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbG9zZVJlc3VsdFNldChSZXN1bHRTZXQgb2JqUmVzdWx0U2V0KQotCXsKLQkJdHJ5Ci0JCXsKLQkJCVN0YXRlbWVudCBvYmpTdG10ID0gb2JqUmVzdWx0U2V0LmdldFN0YXRlbWVudCgpOwotCQkJQ29ubmVjdGlvbiBvYmpDb25uID0gb2JqU3RtdC5nZXRDb25uZWN0aW9uKCk7Ci0JCQl0cnkKLQkJCXsKLQkJCQlvYmpSZXN1bHRTZXQuY2xvc2UoKTsKLQkJCQlvYmpTdG10LmNsb3NlKCk7Ci0JCQl9Ci0JCQljYXRjaCAoU1FMRXhjZXB0aW9uIGUpCi0JCQl7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCQlnZXRDb25uU291cmNlKCkucmV0dXJuQ29ubmVjdGlvbihvYmpDb25uKTsKLQkJfQotCQljYXRjaCAoU1FMRXhjZXB0aW9uIGUpCi0JCXsKLQkJCUxPRy53YXJuKCJFcnJvciB3aGlsZSBjbG9zaW5nIHRoZSByZXN1bHQgc2V0IiwgZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHF1b3RlT2JqZWN0TmFtZShTdHJpbmcgc3RyT2JqZWN0KQotCXsKLQkJcmV0dXJuIHN0ck9iamVjdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0YWJsZU5hbWUuCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRhYmxlTmFtZSgpCi0JewotCQlyZXR1cm4gbV9zdHJUYWJsZU5hbWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdGFibGVOYW1lLgotCSAqIEBwYXJhbSB0YWJsZU5hbWUgVGhlIHRhYmxlTmFtZSB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUYWJsZU5hbWUoU3RyaW5nIHRhYmxlTmFtZSkKLQl7Ci0JCW1fc3RyVGFibGVOYW1lID0gdGFibGVOYW1lOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbm5Tb3VyY2UuCi0JICogQHJldHVybiBJU3FsQ29ubmVjdGlvblNvdXJjZQotCSAqLwotCXB1YmxpYyBJU3FsQ29ubmVjdGlvblNvdXJjZSBnZXRDb25uU291cmNlKCkKLQl7Ci0JCXJldHVybiBtX29iakNvbm5Tb3VyY2U7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgY29ublNvdXJjZS4KLQkgKiBAcGFyYW0gY29ublNvdXJjZSBUaGUgY29ublNvdXJjZSB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb25uU291cmNlKElTcWxDb25uZWN0aW9uU291cmNlIGNvbm5Tb3VyY2UpCi0JewotCQltX29iakNvbm5Tb3VyY2UgPSBjb25uU291cmNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHdoZXJlQ2xhdXNlLgotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRXaGVyZUNsYXVzZSgpCi0JewotCQlyZXR1cm4gbV9zdHJXaGVyZUNsYXVzZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB3aGVyZUNsYXVzZS4KLQkgKiBAcGFyYW0gd2hlcmVDbGF1c2UgVGhlIHdoZXJlQ2xhdXNlIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdoZXJlQ2xhdXNlKFN0cmluZyB3aGVyZUNsYXVzZSkKLQl7Ci0JCW1fc3RyV2hlcmVDbGF1c2UgPSB3aGVyZUNsYXVzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdlbmVyYXRlQ29sdW1uTGlzdChTcWxUYWJsZUNvbHVtbk1vZGVsIG9iakNvbHVtbk1vZGVsKQotCXsKLQkJLy8gYnVpbGQgdGhlIGNvbHVtbiBzZWxlY3Rpb24KLQkJU3RyaW5nQnVmZmVyIG9iakNvbHVtbkJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvYmpDb2x1bW5Nb2RlbC5nZXRDb2x1bW5Db3VudCgpOyBpKyspCi0JCXsKLQkJCVNxbFRhYmxlQ29sdW1uIG9iakNvbHVtbiA9IG9iakNvbHVtbk1vZGVsLmdldFNxbENvbHVtbihpKTsKLQkJCWlmIChpID4gMCkKLQkJCQlvYmpDb2x1bW5CdWYuYXBwZW5kKCIsICIpOwotCQkJb2JqQ29sdW1uQnVmLmFwcGVuZChxdW90ZU9iamVjdE5hbWUob2JqQ29sdW1uLmdldENvbHVtbk5hbWUoKSkpOwotCQl9Ci0KLQkJcmV0dXJuIG9iakNvbHVtbkJ1Zi50b1N0cmluZygpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2VuZXJhdGVXaGVyZUNsYXVzZSgpCi0JewotCQlTdHJpbmcgc3RyV2hlcmVDbGF1c2UgPSBnZXRXaGVyZUNsYXVzZSgpOwotCQlpZiAoc3RyV2hlcmVDbGF1c2UgPT0gbnVsbCB8fCBzdHJXaGVyZUNsYXVzZS5lcXVhbHMoIiIpKQotCQkJcmV0dXJuICIiOwotCQlyZXR1cm4gIldIRVJFICIgKyBzdHJXaGVyZUNsYXVzZSArICIgIjsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdlbmVyYXRlT3JkZXJCeUNsYXVzZShJVGFibGVTb3J0aW5nU3RhdGUgb2JqU29ydGluZ1N0YXRlKQotCXsKLQkJLy8gYnVpbGQgdGhlIHNvcnRpbmcgY2xhdXNlCi0JCVN0cmluZ0J1ZmZlciBvYmpTb3J0aW5nQnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpZiAob2JqU29ydGluZ1N0YXRlLmdldFNvcnRDb2x1bW4oKSAhPSBudWxsKQotCQl7Ci0JCQlvYmpTb3J0aW5nQnVmLmFwcGVuZCgiT1JERVIgQlkgIik7Ci0JCQlvYmpTb3J0aW5nQnVmLmFwcGVuZChvYmpTb3J0aW5nU3RhdGUuZ2V0U29ydENvbHVtbigpKTsKLQkJCWlmIChvYmpTb3J0aW5nU3RhdGUuZ2V0U29ydE9yZGVyKCkKLQkJCQk9PSBJVGFibGVTb3J0aW5nU3RhdGUuU09SVF9BU0NFTkRJTkcpCi0JCQkJb2JqU29ydGluZ0J1Zi5hcHBlbmQoIiBBU0MgIik7Ci0JCQllbHNlCi0JCQkJb2JqU29ydGluZ0J1Zi5hcHBlbmQoIiBERVNDICIpOwotCQl9Ci0KLQkJcmV0dXJuIG9ialNvcnRpbmdCdWYudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdlbmVyYXRlTGltaXRDbGF1c2UoSVRhYmxlUGFnaW5nU3RhdGUgb2JqUGFnaW5nU3RhdGUpCi0JewotCQlpbnQgblBhZ2VTaXplID0gb2JqUGFnaW5nU3RhdGUuZ2V0UGFnZVNpemUoKTsKLQkJaW50IG5TdGFydCA9IG9ialBhZ2luZ1N0YXRlLmdldEN1cnJlbnRQYWdlKCkgKiBuUGFnZVNpemU7Ci0JCVN0cmluZyBzdHJQYWdpbmdCdWYgPSAiTElNSVQgIiArIG5QYWdlU2l6ZSArICIgT0ZGU0VUICIgKyBuU3RhcnQgKyAiICI7Ci0JCXJldHVybiBzdHJQYWdpbmdCdWY7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZW5lcmF0ZURhdGFRdWVyeSgKLQkJU3FsVGFibGVDb2x1bW5Nb2RlbCBvYmpDb2x1bW5Nb2RlbCwKLQkJU2ltcGxlVGFibGVTdGF0ZSBvYmpTdGF0ZSkKLQl7Ci0JCVN0cmluZyBzdHJRdWVyeSA9Ci0JCQkiU0VMRUNUICIKLQkJCQkrIGdlbmVyYXRlQ29sdW1uTGlzdChvYmpDb2x1bW5Nb2RlbCkKLQkJCQkrICIgRlJPTSAiCi0JCQkJKyBnZXRUYWJsZU5hbWUoKQotCQkJCSsgIiAiCi0JCQkJKyBnZW5lcmF0ZVdoZXJlQ2xhdXNlKCkKLQkJCQkrIGdlbmVyYXRlT3JkZXJCeUNsYXVzZShvYmpTdGF0ZS5nZXRTb3J0aW5nU3RhdGUoKSkKLQkJCQkrIGdlbmVyYXRlTGltaXRDbGF1c2Uob2JqU3RhdGUuZ2V0UGFnaW5nU3RhdGUoKSk7Ci0KLQkJcmV0dXJuIHN0clF1ZXJ5OwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2VuZXJhdGVDb3VudFF1ZXJ5KCkKLQl7Ci0JCVN0cmluZyBzdHJRdWVyeSA9Ci0JCQkiU0VMRUNUIENPVU5UKCopIEZST00gIgotCQkJCSsgZ2V0VGFibGVOYW1lKCkKLQkJCQkrICIgIgotCQkJCSsgZ2VuZXJhdGVXaGVyZUNsYXVzZSgpOwotCi0JCXJldHVybiBzdHJRdWVyeTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90YWJsZS9tb2RlbC9zcWwvU3FsVGFibGVDb2x1bW4uamF2YSBiL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90YWJsZS9tb2RlbC9zcWwvU3FsVGFibGVDb2x1bW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY5OGJjYi4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdGFibGUvbW9kZWwvc3FsL1NxbFRhYmxlQ29sdW1uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsLnNxbDsKLQotaW1wb3J0IGphdmEuc3FsLlJlc3VsdFNldDsKLWltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuc2ltcGxlLlNpbXBsZVRhYmxlQ29sdW1uOwotCi0vKioKLSAqIAotICogQHZlcnNpb24gJElkJAotICogQGF1dGhvciBtaW5kYnJpZGdlCi0gKi8KLXB1YmxpYyBjbGFzcyBTcWxUYWJsZUNvbHVtbiBleHRlbmRzIFNpbXBsZVRhYmxlQ29sdW1uCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIExPRyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFNxbFRhYmxlQ29sdW1uLmNsYXNzKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gU3FsVGFibGVDb2x1bW4KLQkgKiBAcGFyYW0gc3RyU3FsRmllbGQgdGhlIGlkZW50aWZ5aW5nIG5hbWUgb2YgdGhlIGNvbHVtbiBhbmQgdGhlIFNRTCBmaWVsZCBpdCByZWZlcnMgdG8KLQkgKiBAcGFyYW0gc3RyRGlzcGxheU5hbWUgdGhlIGRpc3BsYXkgbmFtZSBvZiB0aGUgY29sdW1uCi0JICovCi0JcHVibGljIFNxbFRhYmxlQ29sdW1uKFN0cmluZyBzdHJTcWxGaWVsZCwgU3RyaW5nIHN0ckRpc3BsYXlOYW1lKQotCXsKLQkJc3VwZXIoc3RyU3FsRmllbGQsIHN0ckRpc3BsYXlOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIFNxbFRhYmxlQ29sdW1uCi0JICogQHBhcmFtIHN0clNxbEZpZWxkIHRoZSBpZGVudGlmeWluZyBuYW1lIG9mIHRoZSBjb2x1bW4gYW5kIHRoZSBTUUwgZmllbGQgaXQgcmVmZXJzIHRvCi0JICogQHBhcmFtIHN0ckRpc3BsYXlOYW1lIHRoZSBkaXNwbGF5IG5hbWUgb2YgdGhlIGNvbHVtbgotCSAqIEBwYXJhbSBiU29ydGFibGUgd2hldGhlciB0aGUgY29sdW1uIGlzIHNvcnRhYmxlCi0JICovCi0JcHVibGljIFNxbFRhYmxlQ29sdW1uKAotCQlTdHJpbmcgc3RyU3FsRmllbGQsCi0JCVN0cmluZyBzdHJEaXNwbGF5TmFtZSwKLQkJYm9vbGVhbiBiU29ydGFibGUpCi0JewotCQlzdXBlcihzdHJTcWxGaWVsZCwgc3RyRGlzcGxheU5hbWUsIGJTb3J0YWJsZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuc2ltcGxlLlNpbXBsZVRhYmxlQ29sdW1uI2dldENvbHVtblZhbHVlKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldENvbHVtblZhbHVlKE9iamVjdCBvYmpSb3cpCi0JewotCQl0cnkKLQkJewotCQkJUmVzdWx0U2V0IG9ialJTID0gKFJlc3VsdFNldCkgb2JqUm93OwotICAgICAgICAgICAgU3RyaW5nIHN0ckNvbHVtbk5hbWUgPSBnZXRDb2x1bW5OYW1lKCk7Ci0JCQlPYmplY3Qgb2JqVmFsdWUgPSBvYmpSUy5nZXRPYmplY3Qoc3RyQ29sdW1uTmFtZSk7Ci0JCQlpZiAob2JqVmFsdWUgPT0gbnVsbCkKLQkJCQlvYmpWYWx1ZSA9ICIiOwotCQkJcmV0dXJuIG9ialZhbHVlOwotCQl9Ci0JCWNhdGNoIChTUUxFeGNlcHRpb24gZSkKLQkJewotCQkJTE9HLmVycm9yKCJDYW5ub3QgZ2V0IHRoZSB2YWx1ZSBmb3IgY29sdW1uOiAiICsgZ2V0Q29sdW1uTmFtZSgpLCBlKTsKLQkJCXJldHVybiAiIjsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL21vZGVsL3NxbC9TcWxUYWJsZUNvbHVtbk1vZGVsLmphdmEgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdGFibGUvbW9kZWwvc3FsL1NxbFRhYmxlQ29sdW1uTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZlNDdlNy4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdGFibGUvbW9kZWwvc3FsL1NxbFRhYmxlQ29sdW1uTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuc3FsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsLnNpbXBsZS5TaW1wbGVUYWJsZUNvbHVtbk1vZGVsOwotCi0vKioKLSAqIAotICogQHZlcnNpb24gJElkJAotICogQGF1dGhvciBtaW5kYnJpZGdlCi0gKi8KLXB1YmxpYyBjbGFzcyBTcWxUYWJsZUNvbHVtbk1vZGVsIGV4dGVuZHMgU2ltcGxlVGFibGVDb2x1bW5Nb2RlbAotewotCXB1YmxpYyBTcWxUYWJsZUNvbHVtbk1vZGVsKFNxbFRhYmxlQ29sdW1uW10gYXJyQ29sdW1ucykKLQl7Ci0JCXN1cGVyKGFyckNvbHVtbnMpOwotCX0KLQotCXB1YmxpYyBTcWxUYWJsZUNvbHVtbiBnZXRTcWxDb2x1bW4oaW50IG5Db2x1bW4pCi0JewotCQlyZXR1cm4gKFNxbFRhYmxlQ29sdW1uKSBnZXRDb2x1bW4obkNvbHVtbik7Ci0JfQotCi0JcHVibGljIFNxbFRhYmxlQ29sdW1uIGdldFNxbENvbHVtbihTdHJpbmcgc3RyQ29sdW1uKQotCXsKLQkJcmV0dXJuIChTcWxUYWJsZUNvbHVtbikgZ2V0Q29sdW1uKHN0ckNvbHVtbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RhYmxlL21vZGVsL3NxbC9TcWxUYWJsZU1vZGVsLmphdmEgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdGFibGUvbW9kZWwvc3FsL1NxbFRhYmxlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFjM2FlYy4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdGFibGUvbW9kZWwvc3FsL1NxbFRhYmxlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsLnNxbDsKLQotaW1wb3J0IGphdmEuc3FsLlJlc3VsdFNldDsKLWltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsLklUYWJsZUNvbHVtbk1vZGVsOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5tb2RlbC5jb21tb24uQWJzdHJhY3RUYWJsZU1vZGVsOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5tb2RlbC5zaW1wbGUuU2ltcGxlVGFibGVTdGF0ZTsKLQotLyoqCi0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiBJVGFibGVNb2RlbCB0aGF0IG9idGFpbnMgaXRzIGRhdGEgdGhyb3VnaCBTUUwgcXVlcmllcy4KLSAqIFRoaXMgaXMgYSB2ZXJ5IGVmZmljaWVudCBtb2RlbCwgc2luY2UgaXQgdXNlcyBTUUwgdG8gcGVyZm9ybQotICogdGhlIGRhdGEgc29ydGluZyAodGhyb3VnaCBPUkRFUiBCWSkgYW5kIG9idGFpbnMgb25seSB0aGUgZGF0YQotICogb24gdGhlIGN1cnJlbnQgcGFnZSAodGhyb3VnaCBMSU1JVC9PRkZTRVQpLiAKLSAqIDxwPgotICogVGhpcyBvYmplY3QgaXMgdHlwaWNhbGx5IGNyZWF0ZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXI6Ci0gKiA8cHJlPiAKLSAqICAgIElTcWxDb25uZWN0aW9uU291cmNlIG9iakNvbm5TcmMgPSAKLSAqICAgICAgICBuZXcgU2ltcGxlU3FsQ29ubmVjdGlvblNvdXJjZSgiamRiYzpwb3N0Z3Jlc3FsOi8vbG9jYWxob3N0L3Rlc3RkYiIsICJ0ZXN0ZGIiLCAidGVzdGRiIik7Ci0gKgotICogICAgSVNxbFRhYmxlRGF0YVNvdXJjZSBvYmpEYXRhU3JjID0gCi0gKiAgICAgICAgbmV3IFNpbXBsZVNxbFRhYmxlRGF0YVNvdXJjZShvYmpDb25uU3JjLCAidGVzdF90YWJsZSIpOwotICoKLSAqICAgIFNxbFRhYmxlQ29sdW1uTW9kZWwgb2JqQ29sdW1uTW9kZWwgPSAKLSAqICAgICAgICBuZXcgU3FsVGFibGVDb2x1bW5Nb2RlbChuZXcgU3FsVGFibGVDb2x1bW5bXSB7Ci0gKiAgICAgICAgICAgIG5ldyBTcWxUYWJsZUNvbHVtbigibGFuZ3VhZ2UiLCAiTGFuZ3VhZ2UiLCB0cnVlKSwKLSAqICAgICAgICAgICAgbmV3IFNxbFRhYmxlQ29sdW1uKCJjb3VudHJ5IiwgIkNvdW50cnkiLCB0cnVlKSwKLSAqICAgICAgICAgICAgbmV3IFNxbFRhYmxlQ29sdW1uKCJ2YXJpYW50IiwgIlZhcmlhbnQiLCB0cnVlKSwKLSAqICAgICAgICAgICAgbmV3IFNxbFRhYmxlQ29sdW1uKCJpbnR2YWx1ZSIsICJJbnRlZ2VyIiwgdHJ1ZSksCi0gKiAgICAgICAgICAgIG5ldyBTcWxUYWJsZUNvbHVtbigiZmxvYXR2YWx1ZSIsICJGbG9hdCIsIHRydWUpCi0gKiAgICAgICAgfSk7Ci0gKgotICogICAgSVRhYmxlTW9kZWwgb2JqVGFibGVNb2RlbCA9IG5ldyBTcWxUYWJsZU1vZGVsKG9iakRhdGFTcmMsIG9iakNvbHVtbk1vZGVsKTsKLSAqCi0gKiAgICByZXR1cm4gb2JqVGFibGVNb2RlbDsKLSAqIDwvcHJlPiAKLSAqICAKLSAqIEB2ZXJzaW9uICRJZCQKLSAqIEBhdXRob3IgbWluZGJyaWRnZQotICovCi1wdWJsaWMgY2xhc3MgU3FsVGFibGVNb2RlbCBleHRlbmRzIEFic3RyYWN0VGFibGVNb2RlbCAKLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgTE9HID0gTG9nRmFjdG9yeS5nZXRMb2coU3FsVGFibGVNb2RlbC5jbGFzcyk7Ci0KLQlwcml2YXRlIElTcWxUYWJsZURhdGFTb3VyY2UgbV9vYmpEYXRhU291cmNlOwotCXByaXZhdGUgU3FsVGFibGVDb2x1bW5Nb2RlbCBtX29iakNvbHVtbk1vZGVsOwotICAgIAotICAgIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIENsYXNzLmZvck5hbWUgKCAib3JnLmhzcWxkYi5qZGJjRHJpdmVyIiApOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFUlJPUjogZmFpbGVkIHRvIGxvYWQgSFNRTERCIEpEQkMgZHJpdmVyLiIpOwotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotCXB1YmxpYyBTcWxUYWJsZU1vZGVsKAotCQlJU3FsVGFibGVEYXRhU291cmNlIG9iakRhdGFTb3VyY2UsCi0JCVNxbFRhYmxlQ29sdW1uTW9kZWwgb2JqQ29sdW1uTW9kZWwpCi0JewotCQl0aGlzKG9iakRhdGFTb3VyY2UsIG9iakNvbHVtbk1vZGVsLCBuZXcgU2ltcGxlVGFibGVTdGF0ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgU3FsVGFibGVNb2RlbCgKLQkJSVNxbFRhYmxlRGF0YVNvdXJjZSBvYmpEYXRhU291cmNlLAotCQlTcWxUYWJsZUNvbHVtbk1vZGVsIG9iakNvbHVtbk1vZGVsLAotCQlTaW1wbGVUYWJsZVN0YXRlIG9ialN0YXRlKQotCXsKLSAgICAgICAgc3VwZXIob2JqU3RhdGUpOwotCQltX29iakRhdGFTb3VyY2UgPSBvYmpEYXRhU291cmNlOwotCQltX29iakNvbHVtbk1vZGVsID0gb2JqQ29sdW1uTW9kZWw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuSVRhYmxlTW9kZWwjZ2V0Q29sdW1uTW9kZWwoKQotCSAqLwotCXB1YmxpYyBJVGFibGVDb2x1bW5Nb2RlbCBnZXRDb2x1bW5Nb2RlbCgpCi0JewotCQlyZXR1cm4gbV9vYmpDb2x1bW5Nb2RlbDsKLQl9Ci0KLQlwdWJsaWMgU3FsVGFibGVDb2x1bW5Nb2RlbCBnZXRTcWxDb2x1bW5Nb2RlbCgpCi0JewotCQlyZXR1cm4gbV9vYmpDb2x1bW5Nb2RlbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5tb2RlbC5JVGFibGVNb2RlbCNnZXRDdXJyZW50UGFnZVJvd3MoKQotCSAqLwotCXB1YmxpYyBJdGVyYXRvciBnZXRDdXJyZW50UGFnZVJvd3MoKQotCXsKLQkJdHJ5Ci0JCXsKLQkJCVJlc3VsdFNldCBvYmpSZXN1bHRTZXQgPQotCQkJCWdldFNxbERhdGFTb3VyY2UoKS5nZXRDdXJyZW50Um93cygKLQkJCQkJZ2V0U3FsQ29sdW1uTW9kZWwoKSwKLQkJCQkJZ2V0U3RhdGUoKSk7Ci0KLQkJCXJldHVybiBuZXcgUmVzdWx0U2V0SXRlcmF0b3Iob2JqUmVzdWx0U2V0KQotCQkJewotCQkJCXByb3RlY3RlZCB2b2lkIG5vdGlmeUVuZCgpCi0JCQkJewotCQkJCQlnZXRTcWxEYXRhU291cmNlKCkuY2xvc2VSZXN1bHRTZXQoZ2V0UmVzdWx0U2V0KCkpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlKQotCQl7Ci0JCQlMT0cuZXJyb3IoIkNhbm5vdCBnZXQgY3VycmVudCBwYWdlIHJvd3MiLCBlKTsKLQkJCXJldHVybiBuZXcgUmVzdWx0U2V0SXRlcmF0b3IobnVsbCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkYXRhU291cmNlLgotCSAqIEByZXR1cm4gSVNxbFRhYmxlRGF0YVNvdXJjZQotCSAqLwotCXB1YmxpYyBJU3FsVGFibGVEYXRhU291cmNlIGdldFNxbERhdGFTb3VyY2UoKQotCXsKLQkJcmV0dXJuIG1fb2JqRGF0YVNvdXJjZTsKLQl9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5tb2RlbC5jb21tb24uQWJzdHJhY3RUYWJsZU1vZGVsI2dldFJvd0NvdW50KCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgaW50IGdldFJvd0NvdW50KCkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbV9vYmpEYXRhU291cmNlLmdldFJvd0NvdW50KCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBMT0cuZXJyb3IoIkNhbm5vdCBnZXQgcm93IGNvdW50IiwgZSk7Ci0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RyZWUvY29tcG9uZW50cy9JTm9kZVJlbmRlckZhY3RvcnkuamF2YSBiL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90cmVlL2NvbXBvbmVudHMvSU5vZGVSZW5kZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzZjNlYTMuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RyZWUvY29tcG9uZW50cy9JTm9kZVJlbmRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudHJlZS5jb21wb25lbnRzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVuZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlcXVlc3RDeWNsZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudHJlZS5tb2RlbC5JVHJlZU1vZGVsU291cmNlOwotCi0vKioKLSAqIEBhdXRob3IgY2VjbwotICogQHZlcnNpb24gJElkJAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElOb2RlUmVuZGVyRmFjdG9yeSAKLXsKLQlJUmVuZGVyIGdldFJlbmRlckJ5SUQoT2JqZWN0IG9ialVuaXF1ZUtleSwgSVRyZWVNb2RlbFNvdXJjZSBvYmpUcmVlTW9kZWxTb3VyY2UsIElSZXF1ZXN0Q3ljbGUgb2JqQ3ljbGUpOwkKLQlJUmVuZGVyIGdldFJlbmRlcihPYmplY3Qgb2JqVmFsdWUsIElUcmVlTW9kZWxTb3VyY2Ugb2JqVHJlZU1vZGVsU291cmNlLCBJUmVxdWVzdEN5Y2xlIG9iakN5Y2xlKTsJCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RyZWUvY29tcG9uZW50cy9JVHJlZUNvbXBvbmVudC5qYXZhIGIvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RyZWUvY29tcG9uZW50cy9JVHJlZUNvbXBvbmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODNmZDVhLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90cmVlL2NvbXBvbmVudHMvSVRyZWVDb21wb25lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudHJlZS5jb21wb25lbnRzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRyZWUubW9kZWwuSVRyZWVNb2RlbFNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudHJlZS5tb2RlbC5JVHJlZVJvd1NvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnV0aWwuQ29tcG9uZW50QWRkcmVzczsKLQotLyoqCi0gKiBAYXV0aG9yIGNlY28KLSAqIEB2ZXJzaW9uICRJZCQKLSAqLwotcHVibGljIGludGVyZmFjZSBJVHJlZUNvbXBvbmVudCB7Ci0JQ29tcG9uZW50QWRkcmVzcyBnZXRDb21wb25lbnRQYXRoKCk7Ci0JSVRyZWVNb2RlbFNvdXJjZSBnZXRUcmVlTW9kZWxTb3VyY2UoKTsKLQlJVHJlZVJvd1NvdXJjZSBnZXRUcmVlUm93U291cmNlKCk7Ci0Jdm9pZCByZXNldFN0YXRlKCk7Ci19CmRpZmYgLS1naXQgYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdHJlZS9jb21wb25lbnRzL1RyZWUuaHRtbCBiL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90cmVlL2NvbXBvbmVudHMvVHJlZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjMwMTdiLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90cmVlL2NvbXBvbmVudHMvVHJlZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08c3BhbiBqd2NpZD0iJGNvbnRlbnQkIj4KLQk8c3BhbiBjbGFzcz0idHJlZSIgandjaWQ9InRyZWVWaWV3Ij4KLQkJPHNwYW4gandjaWQ9InRyZWVEYXRhIj4KLQkJCTxzcGFuIGp3Y2lkPSJ0cmVlTm9kZVZhbHVlIi8+Ci0JCTwvc3Bhbj4KLQk8L3NwYW4+CQkKLTwvc3Bhbj4JCQpkaWZmIC0tZ2l0IGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RyZWUvY29tcG9uZW50cy9UcmVlLmphdmEgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdHJlZS9jb21wb25lbnRzL1RyZWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBlNTRkMC4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdHJlZS9jb21wb25lbnRzL1RyZWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudHJlZS5jb21wb25lbnRzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5CYXNlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50cmVlLm1vZGVsLklUcmVlTW9kZWxTb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRyZWUubW9kZWwuSVRyZWVSb3dTb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS51dGlsLkNvbXBvbmVudEFkZHJlc3M7Ci0KLS8qKgotICogQGF1dGhvciBjZWNvCi0gKiBAdmVyc2lvbiAkSWQkCi0gKi8KLXB1YmxpYyBjbGFzcyBUcmVlIGV4dGVuZHMgQmFzZUNvbXBvbmVudCBpbXBsZW1lbnRzIElUcmVlQ29tcG9uZW50ewotCi0JcHVibGljIFRyZWUoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudHJlZS5jb21wb25lbnRzLklUcmVlQ29tcG9uZW50I2dldENvbXBvbmVudFBhdGgoKQotCSAqLwotCXB1YmxpYyBDb21wb25lbnRBZGRyZXNzIGdldENvbXBvbmVudFBhdGgoKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9uZW50QWRkcmVzcyh0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50cmVlLmNvbXBvbmVudHMuSVRyZWVDb21wb25lbnQjZ2V0VHJlZU1vZGVsU291cmNlKCkKLQkgKi8KLQlwdWJsaWMgSVRyZWVNb2RlbFNvdXJjZSBnZXRUcmVlTW9kZWxTb3VyY2UoKSB7Ci0JCVRyZWVWaWV3IG9ialRyZWVWaWV3ID0gKFRyZWVWaWV3KWdldENvbXBvbmVudCgidHJlZVZpZXciKTsKLQkJcmV0dXJuIG9ialRyZWVWaWV3OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRyZWUuY29tcG9uZW50cy5JVHJlZUNvbXBvbmVudCNyZXNldFN0YXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldFN0YXRlKCkgewotCQlUcmVlVmlldyBvYmpUcmVlVmlldyA9IChUcmVlVmlldylnZXRDb21wb25lbnQoInRyZWVWaWV3Iik7Ci0JCW9ialRyZWVWaWV3LnJlc2V0U3RhdGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50cmVlLmNvbXBvbmVudHMuSVRyZWVDb21wb25lbnQjZ2V0VHJlZVJvd1NvdXJjZSgpCi0JICovCi0JcHVibGljIElUcmVlUm93U291cmNlIGdldFRyZWVSb3dTb3VyY2UoKSB7Ci0JCVRyZWVEYXRhVmlldyBvYmpUcmVlRGF0YVZpZXcgPSAoVHJlZURhdGFWaWV3KWdldENvbXBvbmVudCgidHJlZURhdGEiKTsKLQkJcmV0dXJuIG9ialRyZWVEYXRhVmlldzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90cmVlL2NvbXBvbmVudHMvVHJlZS5qd2MgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdHJlZS9jb21wb25lbnRzL1RyZWUuandjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjk1MjlhLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90cmVlL2NvbXBvbmVudHMvVHJlZS5qd2MKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gIAotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTwhLS0gICRJZCQgLS0+Ci08IURPQ1RZUEUgY29tcG9uZW50LXNwZWNpZmljYXRpb24gUFVCTElDIAotICAiLS8vQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24vL1RhcGVzdHJ5IFNwZWNpZmljYXRpb24gMy4wLy9FTiIgCi0gICJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL3RhcGVzdHJ5L2R0ZC9UYXBlc3RyeV8zXzAuZHRkIj4KLQotPGNvbXBvbmVudC1zcGVjaWZpY2F0aW9uIGNsYXNzPSJvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudHJlZS5jb21wb25lbnRzLlRyZWUiCi0gICAgYWxsb3ctYm9keT0ieWVzIiBhbGxvdy1pbmZvcm1hbC1wYXJhbWV0ZXJzPSJ5ZXMiPgotCi0gICAgPHBhcmFtZXRlciBuYW1lPSJzZXNzaW9uU3RhdGVNYW5hZ2VyIgotICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudHJlZS5tb2RlbC5JVHJlZVNlc3Npb25TdGF0ZU1hbmFnZXIiCi0gICAgICAgIGRpcmVjdGlvbj0iY3VzdG9tIiByZXF1aXJlZD0ibm8iLz4KLQotICAgIDxwYXJhbWV0ZXIgbmFtZT0ic2Vzc2lvblN0b3JlTWFuYWdlciIKLSAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRyZWUubW9kZWwuSVNlc3Npb25TdG9yZU1hbmFnZXIiCi0gICAgICAgIGRpcmVjdGlvbj0iY3VzdG9tIiByZXF1aXJlZD0ibm8iLz4KLQotICAgIDxwYXJhbWV0ZXIgbmFtZT0idHJlZU1vZGVsIgotICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudHJlZS5tb2RlbC5JVHJlZU1vZGVsIgotICAgICAgICBkaXJlY3Rpb249ImN1c3RvbSIgcmVxdWlyZWQ9InllcyI+Ci0gICAgPC9wYXJhbWV0ZXI+Ci0KLSAgICA8cGFyYW1ldGVyIG5hbWU9InRyZWVTdGF0ZUxpc3RlbmVyIgotICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudHJlZS5tb2RlbC5JVHJlZVN0YXRlTGlzdGVuZXIiCi0gICAgICAgIGRpcmVjdGlvbj0iY3VzdG9tIiByZXF1aXJlZD0ibm8iPgotICAgIDwvcGFyYW1ldGVyPgotCi0gICAgPHBhcmFtZXRlciBuYW1lPSJjbG9zZU5vZGVJbWFnZSIgdHlwZT0ib3JnLmFwYWNoZS50YXBlc3RyeS5JQXNzZXQiCi0gICAgICAgICAgICAgICByZXF1aXJlZD0ibm8iIGRpcmVjdGlvbj0iaW4iLz4KLSAgICA8cGFyYW1ldGVyIG5hbWU9Im9wZW5Ob2RlSW1hZ2UiIHR5cGU9Im9yZy5hcGFjaGUudGFwZXN0cnkuSUFzc2V0IgotICAgICAgICAgICAgICAgcmVxdWlyZWQ9Im5vIiBkaXJlY3Rpb249ImluIi8+Ci0KLSAgICA8cGFyYW1ldGVyIG5hbWU9InNob3dOb2RlSW1hZ2VzIiB0eXBlPSJib29sZWFuIiByZXF1aXJlZD0ibm8iCi0gICAgICAgICAgICAgICBkaXJlY3Rpb249ImN1c3RvbSIvPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0ibWFrZU5vZGVEaXJlY3QiIHR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJubyIKLSAgICAgICAgICAgICAgIGRpcmVjdGlvbj0iY3VzdG9tIi8+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJub2RlUmVuZGVyRmFjdG9yeSIKLSAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50cmVlLmNvbXBvbmVudHMuSU5vZGVSZW5kZXJGYWN0b3J5IgotICAgICAgICAgICAgICAgcmVxdWlyZWQ9Im5vIiBkaXJlY3Rpb249ImN1c3RvbSIvPgotCi0gICAgPGNvbXBvbmVudCBpZD0idHJlZVZpZXciIHR5cGU9IlRyZWVWaWV3Ij4KLSAgICAgICAgPGluaGVyaXRlZC1iaW5kaW5nIG5hbWU9InNlc3Npb25TdGF0ZU1hbmFnZXIiIHBhcmFtZXRlci1uYW1lPSJzZXNzaW9uU3RhdGVNYW5hZ2VyIi8+Ci0gICAgICAgIDxpbmhlcml0ZWQtYmluZGluZyBuYW1lPSJzZXNzaW9uU3RvcmVNYW5hZ2VyIiBwYXJhbWV0ZXItbmFtZT0ic2Vzc2lvblN0b3JlTWFuYWdlciIvPgotICAgICAgICA8aW5oZXJpdGVkLWJpbmRpbmcgbmFtZT0idHJlZU1vZGVsIiBwYXJhbWV0ZXItbmFtZT0idHJlZU1vZGVsIi8+Ci0gICAgICAgIDxpbmhlcml0ZWQtYmluZGluZyBuYW1lPSJ0cmVlU3RhdGVMaXN0ZW5lciIgcGFyYW1ldGVyLW5hbWU9InRyZWVTdGF0ZUxpc3RlbmVyIi8+Ci0gICAgPC9jb21wb25lbnQ+Ci0KLSAgICA8Y29tcG9uZW50IGlkPSJ0cmVlRGF0YSIgdHlwZT0iVHJlZURhdGFWaWV3Ij4KLSAgICAgICAgPGJpbmRpbmcgbmFtZT0idHJlZVZpZXciIGV4cHJlc3Npb249J2NvbXBvbmVudHMudHJlZVZpZXcnLz4KLSAgICAgICAgPCEtLWluaGVyaXRlZC1iaW5kaW5nIG5hbWU9InZhbHVlIiBwYXJhbWV0ZXItbmFtZT0idmFsdWUiLy0tPgotICAgIDwvY29tcG9uZW50PgotCi0gICAgPGNvbXBvbmVudCBpZD0idHJlZU5vZGVWYWx1ZSIgdHlwZT0iVHJlZU5vZGVWaWV3Ij4KLSAgICAgICAgPGluaGVyaXRlZC1iaW5kaW5nIG5hbWU9ImNsb3NlTm9kZUltYWdlIiBwYXJhbWV0ZXItbmFtZT0iY2xvc2VOb2RlSW1hZ2UiLz4KLSAgICAgICAgPGluaGVyaXRlZC1iaW5kaW5nIG5hbWU9Im9wZW5Ob2RlSW1hZ2UiIHBhcmFtZXRlci1uYW1lPSJvcGVuTm9kZUltYWdlIi8+Ci0gICAgICAgIDxpbmhlcml0ZWQtYmluZGluZyBuYW1lPSJzaG93Tm9kZUltYWdlcyIgcGFyYW1ldGVyLW5hbWU9InNob3dOb2RlSW1hZ2VzIi8+Ci0gICAgICAgIDxpbmhlcml0ZWQtYmluZGluZyBuYW1lPSJtYWtlTm9kZURpcmVjdCIgcGFyYW1ldGVyLW5hbWU9Im1ha2VOb2RlRGlyZWN0Ii8+Ci0gICAgICAgIDxpbmhlcml0ZWQtYmluZGluZyBuYW1lPSJub2RlUmVuZGVyRmFjdG9yeSIgcGFyYW1ldGVyLW5hbWU9Im5vZGVSZW5kZXJGYWN0b3J5Ii8+Ci0KLSAgICAgICAgPGJpbmRpbmcgbmFtZT0idHJlZURhdGFWaWV3IiBleHByZXNzaW9uPSdjb21wb25lbnRzLnRyZWVEYXRhJy8+Ci0gICAgPC9jb21wb25lbnQ+Ci0KLTwvY29tcG9uZW50LXNwZWNpZmljYXRpb24+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RyZWUvY29tcG9uZW50cy9UcmVlRGF0YVZpZXcuaHRtbCBiL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90cmVlL2NvbXBvbmVudHMvVHJlZURhdGFWaWV3Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5YTkzYzUuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RyZWUvY29tcG9uZW50cy9UcmVlRGF0YVZpZXcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotPCEtLSBnZW5lcmF0ZWQgYnkgU3BpbmRsZSwgaHR0cDovL3NwaW5kbGUuc291cmNlZm9yZ2UubmV0IC0tPgotCi08c3BhbiBqd2NpZD0iJGNvbnRlbnQkIj48c3BhbiBqd2NpZD0id3JhcHBlZCIvPjwvc3Bhbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdHJlZS9jb21wb25lbnRzL1RyZWVEYXRhVmlldy5qYXZhIGIvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RyZWUvY29tcG9uZW50cy9UcmVlRGF0YVZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjUxNGQ5Mi4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdHJlZS9jb21wb25lbnRzL1RyZWVEYXRhVmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudHJlZS5jb21wb25lbnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5CYXNlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUJpbmRpbmc7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JTWFya3VwV3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlcXVlc3RDeWNsZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudHJlZS5tb2RlbC5JVHJlZURhdGFNb2RlbDsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudHJlZS5tb2RlbC5JVHJlZU1vZGVsOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50cmVlLm1vZGVsLklUcmVlUm93U291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50cmVlLm1vZGVsLlRyZWVSb3dPYmplY3Q7Ci0KLS8qKgotICogQHZlcnNpb24gJElkJAotICovCi1wdWJsaWMgY2xhc3MgVHJlZURhdGFWaWV3IGV4dGVuZHMgQmFzZUNvbXBvbmVudCBpbXBsZW1lbnRzIElUcmVlUm93U291cmNlewotICAgIHByaXZhdGUgSUJpbmRpbmcgbV9vYmpUcmVlVmlld0JpbmRpbmc7Ci0KLQlwcml2YXRlIFRyZWVSb3dPYmplY3QgbV9vYmpUcmVlUm93T2JqZWN0ID0gbnVsbDsKLSAgICBwcml2YXRlIGludCBtX25UcmVlRGVlcCA9IC0xOwotCi0gICAgcHVibGljIFRyZWVEYXRhVmlldygpewotICAgICAgICBzdXBlcigpOwotICAgICAgICBpbml0aWFsaXplKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgpewotCQltX29ialRyZWVSb3dPYmplY3QgPSBudWxsOwotICAgICAgICBtX25UcmVlRGVlcCA9IC0xOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHRyZWVWaWV3QmluZGluZy4KLSAgICAgKiBAcmV0dXJuIElCaW5kaW5nCi0gICAgICovCi0gICAgcHVibGljIElCaW5kaW5nIGdldFRyZWVWaWV3QmluZGluZygpIHsKLSAgICAgICAgcmV0dXJuIG1fb2JqVHJlZVZpZXdCaW5kaW5nOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHRyZWVWaWV3QmluZGluZy4KLSAgICAgKiBAcGFyYW0gdHJlZVZpZXdCaW5kaW5nIFRoZSB0cmVlVmlld0JpbmRpbmcgdG8gc2V0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VHJlZVZpZXdCaW5kaW5nKElCaW5kaW5nIHRyZWVWaWV3QmluZGluZykgewotICAgICAgICBtX29ialRyZWVWaWV3QmluZGluZyA9IHRyZWVWaWV3QmluZGluZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVHJlZVZpZXcgZ2V0VHJlZVZpZXcoKSB7Ci0gICAgICAgIHJldHVybiAoVHJlZVZpZXcpIG1fb2JqVHJlZVZpZXdCaW5kaW5nLmdldE9iamVjdCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbmRlckNvbXBvbmVudChJTWFya3VwV3JpdGVyIHdyaXRlciwgSVJlcXVlc3RDeWNsZSBjeWNsZSkgewotICAgICAgICAvLyByZW5kZXIgZGF0YQotCQlPYmplY3Qgb2JqRXhpc3RlZFRyZWVNb2RlbFNvdXJjZSA9IGN5Y2xlLmdldEF0dHJpYnV0ZShJVHJlZVJvd1NvdXJjZS5UUkVFX1JPV19TT1VSQ0VfQVRUUklCVVRFKTsKLQkJY3ljbGUuc2V0QXR0cmlidXRlKElUcmVlUm93U291cmNlLlRSRUVfUk9XX1NPVVJDRV9BVFRSSUJVVEUsIHRoaXMpOwotCQotICAgICAgICBUcmVlVmlldyBvYmpWaWV3ID0gZ2V0VHJlZVZpZXcoKTsKLSAgICAgICAgSVRyZWVNb2RlbCBvYmpUcmVlTW9kZWwgPSBvYmpWaWV3LmdldFRyZWVNb2RlbCgpOwotICAgICAgICBJVHJlZURhdGFNb2RlbCBvYmpUcmVlRGF0YU1vZGVsID0gb2JqVHJlZU1vZGVsLmdldFRyZWVEYXRhTW9kZWwoKTsKLSAgICAgICAgT2JqZWN0IG9ialZhbHVlID0gb2JqVHJlZURhdGFNb2RlbC5nZXRSb290KCk7Ci0gICAgICAgIE9iamVjdCBvYmpWYWx1ZVVJRCA9IG9ialRyZWVEYXRhTW9kZWwuZ2V0VW5pcXVlS2V5KG9ialZhbHVlLCBudWxsKTsKLQotICAgICAgICAvLyBPYmplY3Qgb2JqU2VsZWN0ZWROb2RlID0gb2JqVHJlZU1vZGVsLmdldFRyZWVTdGF0ZU1vZGVsKCkuZ2V0U2VsZWN0ZWROb2RlKCk7Ci0gICAgICAgIC8vaWYob2JqU2VsZWN0ZWROb2RlID09IG51bGwpCi0gICAgICAgIC8vICBvYmpUcmVlTW9kZWwuZ2V0VHJlZVN0YXRlTW9kZWwoKS5leHBhbmQob2JqVmFsdWVVSUQpOwotCi0gICAgICAgIHdhbGtUcmVlKG9ialZhbHVlLCBvYmpWYWx1ZVVJRCwgMCwgb2JqVHJlZU1vZGVsLCB3cml0ZXIsIGN5Y2xlKTsKLQotCQljeWNsZS5zZXRBdHRyaWJ1dGUoSVRyZWVSb3dTb3VyY2UuVFJFRV9ST1dfU09VUkNFX0FUVFJJQlVURSwgb2JqRXhpc3RlZFRyZWVNb2RlbFNvdXJjZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd2Fsa1RyZWUoT2JqZWN0IG9ialBhcmVudCwgT2JqZWN0IG9ialBhcmVudFVJRCwgaW50IG5EZXB0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBJVHJlZU1vZGVsIG9ialRyZWVNb2RlbCwgSU1hcmt1cFdyaXRlciB3cml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgSVJlcXVlc3RDeWNsZSBjeWNsZSkgewotCQltX29ialRyZWVSb3dPYmplY3QgPSBuZXcgVHJlZVJvd09iamVjdChvYmpQYXJlbnQsIG9ialBhcmVudFVJRCwgbkRlcHRoKTsKLSAgICAgICAgbV9uVHJlZURlZXAgPSBuRGVwdGg7Ci0KLSAgICAgICAgc3VwZXIucmVuZGVyQ29tcG9uZW50KHdyaXRlciwgY3ljbGUpOwotCi0gICAgICAgIGJvb2xlYW4gYkNvbnRhaW4gPSBvYmpUcmVlTW9kZWwuZ2V0VHJlZVN0YXRlTW9kZWwoKS5pc1VuaXF1ZUtleUV4cGFuZGVkKG9ialBhcmVudFVJRCk7Ci0gICAgICAgIGlmIChiQ29udGFpbikgewotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gb2JqVHJlZU1vZGVsLmdldFRyZWVEYXRhTW9kZWwoKS5nZXRDaGlsZHJlbihvYmpQYXJlbnQpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICBPYmplY3Qgb2JqQ2hpbGQgPSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBPYmplY3Qgb2JqQ2hpbGRVSUQgPSBvYmpUcmVlTW9kZWwuZ2V0VHJlZURhdGFNb2RlbCgpLmdldFVuaXF1ZUtleShvYmpDaGlsZCwgb2JqUGFyZW50VUlEKTsKLSAgICAgICAgICAgICAgICB3YWxrVHJlZShvYmpDaGlsZCwgb2JqQ2hpbGRVSUQsIG5EZXB0aCsxLCBvYmpUcmVlTW9kZWwsIHdyaXRlciwgY3ljbGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRUcmVlRGVlcCgpIHsKLSAgICAgICAgcmV0dXJuIG1fblRyZWVEZWVwOwotICAgIH0KLQkvKioKLQkgKiBAc2VlIG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50cmVlLm1vZGVsLklUcmVlUm93U291cmNlI2dldFRyZWVSb3coKQotCSAqLwotCXB1YmxpYyBUcmVlUm93T2JqZWN0IGdldFRyZWVSb3coKSB7Ci0JCXJldHVybiBnZXRUcmVlUm93T2JqZWN0KCk7Ci0JfQotCi0JcHVibGljIFRyZWVSb3dPYmplY3QgZ2V0VHJlZVJvd09iamVjdCgpIHsKLQkJcmV0dXJuIG1fb2JqVHJlZVJvd09iamVjdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUcmVlUm93T2JqZWN0KFRyZWVSb3dPYmplY3Qgb2JqZWN0KSB7Ci0JCW1fb2JqVHJlZVJvd09iamVjdCA9IG9iamVjdDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90cmVlL2NvbXBvbmVudHMvVHJlZURhdGFWaWV3Lmp3YyBiL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90cmVlL2NvbXBvbmVudHMvVHJlZURhdGFWaWV3Lmp3YwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzUxM2Q0NS4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdHJlZS9jb21wb25lbnRzL1RyZWVEYXRhVmlldy5qd2MKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gIAotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTwhLS0gICRJZCQgLS0+Ci08IURPQ1RZUEUgY29tcG9uZW50LXNwZWNpZmljYXRpb24gUFVCTElDIAotICAiLS8vQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24vL1RhcGVzdHJ5IFNwZWNpZmljYXRpb24gMy4wLy9FTiIgCi0gICJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL3RhcGVzdHJ5L2R0ZC9UYXBlc3RyeV8zXzAuZHRkIj4KLQotPGNvbXBvbmVudC1zcGVjaWZpY2F0aW9uIGNsYXNzPSJvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudHJlZS5jb21wb25lbnRzLlRyZWVEYXRhVmlldyIKLSAgICBhbGxvdy1ib2R5PSJ5ZXMiIGFsbG93LWluZm9ybWFsLXBhcmFtZXRlcnM9InllcyI+Ci0KLSAgICA8cGFyYW1ldGVyIG5hbWU9InRyZWVWaWV3IgotICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRyZWUuY29tcG9uZW50cy5UcmVlVmlldyIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJ5ZXMiIGRpcmVjdGlvbj0iY3VzdG9tIi8+Ci0KLSAgICA8cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJqYXZhLmxhbmcuT2JqZWN0IiByZXF1aXJlZD0ibm8iIGRpcmVjdGlvbj0iY3VzdG9tIi8+Ci0KLSAgICA8Y29tcG9uZW50IGlkPSJ3cmFwcGVkIiB0eXBlPSJSZW5kZXJCb2R5Ii8+Ci08L2NvbXBvbmVudC1zcGVjaWZpY2F0aW9uPgpkaWZmIC0tZ2l0IGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RyZWUvY29tcG9uZW50cy9UcmVlTm9kZVZpZXcuaHRtbCBiL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90cmVlL2NvbXBvbmVudHMvVHJlZU5vZGVWaWV3Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiMjRjZGUuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RyZWUvY29tcG9uZW50cy9UcmVlTm9kZVZpZXcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTwhLS0gZ2VuZXJhdGVkIGJ5IFNwaW5kbGUsIGh0dHA6Ly9zcGluZGxlLnNvdXJjZWZvcmdlLm5ldCAtLT4KLQotPHNwYW4gandjaWQ9IiRjb250ZW50JCI+Ci0JPHNwYW4gandjaWQ9Im9mZnNldCI+Ci0JCTxzcGFuIGp3Y2lkPSJtYWtlTm9kZURpcmVjdCI+Ci0JCQk8YSBqd2NpZD0iZGlyZWN0Ij4KLQkJCQk8c3BhbiBqd2NpZD0ic2hvd0ltYWdlcyI+Ci0JCQkJCTxpbWcgandjaWQ9ImltYWdlTm9kZSIvPgotCQkJCTwvc3Bhbj4KLQkJCQk8c3BhbiBqd2NpZD0iaW5zZXJ0VmFsdWUiLz48L2E+PGJyPgotCQk8L3NwYW4+Ci0JCTxzcGFuIGp3Y2lkPSJtYWtlTm9kZU5vRGlyZWN0Ij4KLQkJCTxzcGFuIGp3Y2lkPSJzaG93SW1hZ2VzMiI+Ci0JCQkJPGltZyBqd2NpZD0iaW1hZ2VOb2RlMiIvPgotCQkJPC9zcGFuPgotCQkJPHNwYW4gandjaWQ9Imluc2VydFZhbHVlMiIvPjxicj4KLQkJPC9zcGFuPgotCTwvc3Bhbj4KLTwvc3Bhbj4KZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90cmVlL2NvbXBvbmVudHMvVHJlZU5vZGVWaWV3LmphdmEgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdHJlZS9jb21wb25lbnRzL1RyZWVOb2RlVmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGIxZDdmLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90cmVlL2NvbXBvbmVudHMvVHJlZU5vZGVWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTkgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50cmVlLmNvbXBvbmVudHM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LkJhc2VDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JQXNzZXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JQmluZGluZzsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklNYXJrdXBXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVuZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlcXVlc3RDeWNsZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudHJlZS5tb2RlbC5JVHJlZU1vZGVsU291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50cmVlLm1vZGVsLklUcmVlUm93U291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50cmVlLm1vZGVsLklUcmVlU3RhdGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudHJlZS5tb2RlbC5JVHJlZVN0YXRlTW9kZWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRyZWUubW9kZWwuVHJlZVJvd09iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudHJlZS5tb2RlbC5UcmVlU3RhdGVFdmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudHJlZS5zaW1wbGUuU2ltcGxlTm9kZVJlbmRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5lbmdpbmUuSVBhZ2VMb2FkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5ldmVudC5QYWdlRGV0YWNoTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5ldmVudC5QYWdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5zcGVjLkNvbXBvbmVudFNwZWNpZmljYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS51dGlsLkNvbXBvbmVudEFkZHJlc3M7Ci0KLS8qKgotICogQHZlcnNpb24gJElkJAotICoqLwotcHVibGljIGNsYXNzIFRyZWVOb2RlVmlldyBleHRlbmRzIEJhc2VDb21wb25lbnQgaW1wbGVtZW50cyBQYWdlRGV0YWNoTGlzdGVuZXJ7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIExPRyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFRyZWVOb2RlVmlldy5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIElCaW5kaW5nIG1fb2JqTm9kZVJlbmRlckZhY3RvcnlCaW5kaW5nOwotICAgIHByaXZhdGUgSUJpbmRpbmcgbV9vYmpTaG93Tm9kZUltYWdlc0JpbmRpbmc7Ci0gICAgcHJpdmF0ZSBJQmluZGluZyBtX29iak1ha2VOb2RlRGlyZWN0QmluZGluZzsKLSAgICBwcml2YXRlIEJvb2xlYW4gbV9vYmpOb2RlU3RhdGU7Ci0gICAgcHJpdmF0ZSBCb29sZWFuIG1fb2JqU2hvd05vZGVJbWFnZXM7Ci0gICAgcHJpdmF0ZSBCb29sZWFuIG1fb2JqTWFrZU5vZGVEaXJlY3Q7Ci0gICAgcHJpdmF0ZSBJTm9kZVJlbmRlckZhY3RvcnkgbV9vYmpOb2RlUmVuZGVyRmFjdG9yeTsKLQotICAgIHByaXZhdGUgSUFzc2V0IG1fb2JqT3Blbk5vZGVJbWFnZTsKLSAgICBwcml2YXRlIElBc3NldCBtX29iakNsb3NlTm9kZUltYWdlOwotCi0gICAgcHVibGljIFRyZWVOb2RlVmlldygpewotICAgICAgICBzdXBlcigpOwotICAgICAgICBpbml0aWFsaXplKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoKXsKLSAgICAgICAgbV9vYmpOb2RlU3RhdGUgPSBudWxsOwotICAgICAgICBtX29ialNob3dOb2RlSW1hZ2VzID0gbnVsbDsKLSAgICAgICAgbV9vYmpOb2RlUmVuZGVyRmFjdG9yeSA9IG51bGw7Ci0gICAgICAgIG1fb2JqTWFrZU5vZGVEaXJlY3QgPSBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBJUmVuZGVyIGdldEN1cnJlbnRSZW5kZXJlcigpewotICAgICAgICBJTm9kZVJlbmRlckZhY3Rvcnkgb2JqUmVuZGVyRmFjdG9yeSA9IGdldE5vZGVSZW5kZXJGYWN0b3J5KCk7Ci0JCUlUcmVlUm93U291cmNlIG9ialRyZWVSb3dTb3VyY2UgPSBnZXRUcmVlUm93U291cmNlKCk7Ci0gICAgICAgIHJldHVybiBvYmpSZW5kZXJGYWN0b3J5LmdldFJlbmRlcihvYmpUcmVlUm93U291cmNlLmdldFRyZWVSb3coKS5nZXRUcmVlTm9kZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VHJlZU1vZGVsU291cmNlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRQYWdlKCkuZ2V0UmVxdWVzdEN5Y2xlKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3RbXSBnZXROb2RlQ29udGV4dCgpewotCQlJVHJlZU1vZGVsU291cmNlIG9iak1vZGVsU291cmNlID0gZ2V0VHJlZU1vZGVsU291cmNlKCk7Ci0JCUNvbXBvbmVudEFkZHJlc3Mgb2JqTW9kZWxTb3VyY2VBZGRyZXNzID0gbmV3IENvbXBvbmVudEFkZHJlc3Mob2JqTW9kZWxTb3VyY2UpOwotCQlJVHJlZVJvd1NvdXJjZSBvYmpUcmVlUm93U291cmNlID0gZ2V0VHJlZVJvd1NvdXJjZSgpOwotCQlUcmVlUm93T2JqZWN0IG9ialRyZWVSb3dPYmplY3QgPSBvYmpUcmVlUm93U291cmNlLmdldFRyZWVSb3coKTsKLSAgICAgICAgT2JqZWN0IG9ialZhbHVlVUlEID0gb2JqVHJlZVJvd09iamVjdC5nZXRUcmVlTm9kZVVJRCgpOwotICAgICAgICBpZiAoTE9HLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIExPRy5kZWJ1ZygiZ2V0Tm9kZUNvbnRleHQgb2JqVmFsdWVVSUQgPSAiICsgb2JqVmFsdWVVSUQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RbXSB7IG9ialZhbHVlVUlELCBuZXcgQm9vbGVhbihpc05vZGVPcGVuKCkpLCBvYmpNb2RlbFNvdXJjZUFkZHJlc3MgfTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiBhIG5vZGUgaW4gdGhlIHRyZWUgaXMgY2xpY2tlZCBieSB0aGUgdXNlci4KLSAgICAgKiBJZiB0aGUgbm9kZSBpcyBleHBhbmRlZCwgaXQgd2lsbCBiZSBjb2xsYXBzZWQsIGFuZCB2aWNlLXZlcnNhLAotICAgICAqIHRoYXQgaXMsIHRoZSB0cmVlIHN0YXRlIG1vZGVsIGlzIHJldHJpZXZlZCwgYW5kIGl0IGlzIHRvbGQKLSAgICAgKiB0byBjb2xsYXBzZSBvciBleHBhbmQgdGhlIG5vZGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY3ljbGUgVGhlIFRhcGVzdHJ5IHJlcXVlc3QgY3ljbGUgb2JqZWN0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG5vZGVTZWxlY3QoSVJlcXVlc3RDeWNsZSBjeWNsZSkgewotICAgICAgICBPYmplY3QgY29udGV4dFtdID0gY3ljbGUuZ2V0U2VydmljZVBhcmFtZXRlcnMoKTsKLSAgICAgICAgT2JqZWN0IG9ialZhbHVlVUlEID0gbnVsbDsKLSAgICAgICAgaWYgKGNvbnRleHQgIT0gbnVsbCAmJiBjb250ZXh0Lmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgIG9ialZhbHVlVUlEID0gY29udGV4dFswXTsKLSAgICAgICAgfQotCQlDb21wb25lbnRBZGRyZXNzIG9iak1vZGVsU291cmNlQWRkcmVzcyA9IChDb21wb25lbnRBZGRyZXNzKWNvbnRleHRbMl07Ci0JCUlUcmVlTW9kZWxTb3VyY2Ugb2JqVHJlZU1vZGVsU291cmNlID0gKElUcmVlTW9kZWxTb3VyY2UpIG9iak1vZGVsU291cmNlQWRkcmVzcy5maW5kQ29tcG9uZW50KGN5Y2xlKTsKLQkJLy9JVHJlZU1vZGVsU291cmNlIG9ialRyZWVNb2RlbFNvdXJjZSA9IGdldFRyZWVNb2RlbFNvdXJjZSgpOwotICAgICAgICBJVHJlZVN0YXRlTW9kZWwgb2JqU3RhdGVNb2RlbCA9IG9ialRyZWVNb2RlbFNvdXJjZS5nZXRUcmVlTW9kZWwoKS5nZXRUcmVlU3RhdGVNb2RlbCgpOwotICAgICAgICBib29sZWFuIGJTdGF0ZSA9IG9ialN0YXRlTW9kZWwuaXNVbmlxdWVLZXlFeHBhbmRlZChvYmpWYWx1ZVVJRCk7Ci0KLSAgICAgICAgaWYgKGJTdGF0ZSkgewotICAgICAgICAgICAgb2JqU3RhdGVNb2RlbC5jb2xsYXBzZShvYmpWYWx1ZVVJRCk7Ci0gICAgICAgICAgICBmaXJlTm9kZUNvbGxhcHNlZChvYmpWYWx1ZVVJRCwgb2JqVHJlZU1vZGVsU291cmNlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG9ialN0YXRlTW9kZWwuZXhwYW5kUGF0aChvYmpWYWx1ZVVJRCk7Ci0JCQlmaXJlTm9kZUV4cGFuZGVkKG9ialZhbHVlVUlELCBvYmpUcmVlTW9kZWxTb3VyY2UpOwotICAgICAgICB9Ci0gICAgfQotCi0JcHJpdmF0ZSB2b2lkIGZpcmVOb2RlQ29sbGFwc2VkKE9iamVjdCBvYmpWYWx1ZVVJRCwgSVRyZWVNb2RlbFNvdXJjZSBvYmpUcmVlTW9kZWxTb3VyY2UpewotCQlkZWxpdmVyRXZlbnQoVHJlZVN0YXRlRXZlbnQuTk9ERV9DT0xMQVBTRUQsIG9ialZhbHVlVUlELCBvYmpUcmVlTW9kZWxTb3VyY2UpOwotCQotCX0KLQotCXByaXZhdGUgdm9pZCBmaXJlTm9kZUV4cGFuZGVkKE9iamVjdCBvYmpWYWx1ZVVJRCwgSVRyZWVNb2RlbFNvdXJjZSBvYmpUcmVlTW9kZWxTb3VyY2UpewotCQlkZWxpdmVyRXZlbnQoVHJlZVN0YXRlRXZlbnQuTk9ERV9FWFBBTkRFRCwgb2JqVmFsdWVVSUQsIG9ialRyZWVNb2RlbFNvdXJjZSk7Ci0JfQotICAgIAotCXByaXZhdGUgdm9pZCBkZWxpdmVyRXZlbnQoaW50IG5FdmVudFVJRCwgT2JqZWN0IG9ialZhbHVlVUlELCBJVHJlZU1vZGVsU291cmNlIG9ialRyZWVNb2RlbFNvdXJjZSl7Ci0JCUlUcmVlU3RhdGVMaXN0ZW5lciBvYmpMaXN0ZW5lciA9IG9ialRyZWVNb2RlbFNvdXJjZS5nZXRUcmVlU3RhdGVMaXN0ZW5lcigpOwotCQlpZihvYmpMaXN0ZW5lciAhPSBudWxsKXsKLQkJCVRyZWVTdGF0ZUV2ZW50IG9iakV2ZW50ID0gbmV3IFRyZWVTdGF0ZUV2ZW50KG5FdmVudFVJRCwgb2JqVmFsdWVVSUQsIG9ialRyZWVNb2RlbFNvdXJjZS5nZXRUcmVlTW9kZWwoKS5nZXRUcmVlU3RhdGVNb2RlbCgpKTsKLQkJCW9iakxpc3RlbmVyLnRyZWVTdGF0ZUNoYW5nZWQob2JqRXZlbnQpOyAKLQkJfQotCQkKLQl9Ci0gICAgCi0JcHJpdmF0ZSB2b2lkIGRlbGl2ZXJFdmVudE9sZChpbnQgbkV2ZW50VUlELCBPYmplY3Qgb2JqVmFsdWVVSUQsIElUcmVlU3RhdGVNb2RlbCBvYmpTdGF0ZU1vZGVsKXsKLQkJSUJpbmRpbmcgb2JqQmluZGluZyA9IGdldEJpbmRpbmcoInRyZWVTdGF0ZUxpc3RlbmVyIik7Ci0JCWlmKG9iakJpbmRpbmcgIT0gbnVsbCl7Ci0JCQlJVHJlZVN0YXRlTGlzdGVuZXIgb2JqTGlzdGVuZXIgPSAoSVRyZWVTdGF0ZUxpc3RlbmVyKW9iakJpbmRpbmcuZ2V0T2JqZWN0KCk7Ci0JCQlUcmVlU3RhdGVFdmVudCBvYmpFdmVudCA9IG5ldyBUcmVlU3RhdGVFdmVudChuRXZlbnRVSUQsIG9ialZhbHVlVUlELCBvYmpTdGF0ZU1vZGVsKTsKLQkJCW9iakxpc3RlbmVyLnRyZWVTdGF0ZUNoYW5nZWQob2JqRXZlbnQpOyAKLQkJfQotCQkKLQl9Ci0KLSAgICBwdWJsaWMgdm9pZCBwYWdlRGV0YWNoZWQoUGFnZUV2ZW50IGFyZzApIHsKLSAgICAgICAgaW5pdGlhbGl6ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGZpbmlzaExvYWQoSVJlcXVlc3RDeWNsZSBvYmpDeWNsZSwgSVBhZ2VMb2FkZXIgYXJnMCwgQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBhcmcxKQotICAgIHsKLSAgICAgICAgc3VwZXIuZmluaXNoTG9hZChvYmpDeWNsZSwgYXJnMCwgYXJnMSk7Ci0gICAgICAgIGdldFBhZ2UoKS5hZGRQYWdlRGV0YWNoTGlzdGVuZXIodGhpcyk7Ci0KLSAgICAgICAgbV9vYmpPcGVuTm9kZUltYWdlID0gZ2V0QXNzZXQoIl9vcGVuTm9kZUltYWdlIik7Ci0gICAgICAgIG1fb2JqQ2xvc2VOb2RlSW1hZ2UgPSBnZXRBc3NldCgiX2Nsb3NlTm9kZUltYWdlIik7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNOb2RlT3BlbigpIHsKLSAgICAgICAgaWYobV9vYmpOb2RlU3RhdGUgPT0gbnVsbCl7Ci0JCQlJVHJlZVJvd1NvdXJjZSBvYmpUcmVlUm93U291cmNlID0gZ2V0VHJlZVJvd1NvdXJjZSgpOwotCQkJVHJlZVJvd09iamVjdCBvYmpUcmVlUm93T2JqZWN0ID0gb2JqVHJlZVJvd1NvdXJjZS5nZXRUcmVlUm93KCk7Ci0gICAgICAgICAgICBPYmplY3Qgb2JqVmFsdWVVSUQgPSBvYmpUcmVlUm93T2JqZWN0LmdldFRyZWVOb2RlVUlEKCk7Ci0JCQlJVHJlZU1vZGVsU291cmNlIG9ialRyZWVNb2RlbFNvdXJjZSA9IGdldFRyZWVNb2RlbFNvdXJjZSgpOwotICAgICAgICAgICAgSVRyZWVTdGF0ZU1vZGVsIG9ialN0YXRlTW9kZWwgPSBvYmpUcmVlTW9kZWxTb3VyY2UuZ2V0VHJlZU1vZGVsKCkuZ2V0VHJlZVN0YXRlTW9kZWwoKTsKLSAgICAgICAgICAgIGJvb2xlYW4gYlN0YXRlID0gb2JqU3RhdGVNb2RlbC5pc1VuaXF1ZUtleUV4cGFuZGVkKG9ialZhbHVlVUlEKTsKLSAgICAgICAgICAgIG1fb2JqTm9kZVN0YXRlID0gbmV3IEJvb2xlYW4oYlN0YXRlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbV9vYmpOb2RlU3RhdGUuYm9vbGVhblZhbHVlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgb3Blbk5vZGVJbWFnZS4KLSAgICAgKiBAcmV0dXJuIElBc3NldAotICAgICAqLwotICAgIHB1YmxpYyBJQXNzZXQgZ2V0Tm9kZUltYWdlKCkgewotICAgICAgICBpZihpc05vZGVPcGVuKCkpIHsKLSAgICAgICAgICAgIGlmIChtX29iak9wZW5Ob2RlSW1hZ2UgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1fb2JqT3Blbk5vZGVJbWFnZSA9IGdldEFzc2V0KCJfb3Blbk5vZGVJbWFnZSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG1fb2JqT3Blbk5vZGVJbWFnZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChtX29iakNsb3NlTm9kZUltYWdlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtX29iakNsb3NlTm9kZUltYWdlID0gZ2V0QXNzZXQoIl9jbG9zZU5vZGVJbWFnZSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG1fb2JqQ2xvc2VOb2RlSW1hZ2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjbG9zZU5vZGVJbWFnZS4KLSAgICAgKiBAcmV0dXJuIElBc3NldAotICAgICAqLwotICAgIHB1YmxpYyBJQXNzZXQgZ2V0Q2xvc2VOb2RlSW1hZ2UoKSB7Ci0gICAgICAgIHJldHVybiBtX29iakNsb3NlTm9kZUltYWdlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG9wZW5Ob2RlSW1hZ2UuCi0gICAgICogQHJldHVybiBJQXNzZXQKLSAgICAgKi8KLSAgICBwdWJsaWMgSUFzc2V0IGdldE9wZW5Ob2RlSW1hZ2UoKSB7Ci0gICAgICAgIHJldHVybiBtX29iak9wZW5Ob2RlSW1hZ2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY2xvc2VOb2RlSW1hZ2UuCi0gICAgICogQHBhcmFtIGNsb3NlTm9kZUltYWdlIFRoZSBjbG9zZU5vZGVJbWFnZSB0byBzZXQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDbG9zZU5vZGVJbWFnZShJQXNzZXQgY2xvc2VOb2RlSW1hZ2UpIHsKLSAgICAgICAgbV9vYmpDbG9zZU5vZGVJbWFnZSA9IGNsb3NlTm9kZUltYWdlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG9wZW5Ob2RlSW1hZ2UuCi0gICAgICogQHBhcmFtIG9wZW5Ob2RlSW1hZ2UgVGhlIG9wZW5Ob2RlSW1hZ2UgdG8gc2V0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0T3Blbk5vZGVJbWFnZShJQXNzZXQgb3Blbk5vZGVJbWFnZSkgewotICAgICAgICBtX29iak9wZW5Ob2RlSW1hZ2UgPSBvcGVuTm9kZUltYWdlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUKLSAgICAgKiBvcmcuYXBhY2hlLnRhcGVzdHJ5LkFic3RyYWN0Q29tcG9uZW50I3JlbmRlckNvbXBvbmVudChJTWFya3VwV3JpdGVyLAotICAgICAqIElSZXF1ZXN0Q3ljbGUpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVuZGVyQ29tcG9uZW50KElNYXJrdXBXcml0ZXIgYXJnMCwgSVJlcXVlc3RDeWNsZSBhcmcxKSB7Ci0gICAgICAgIHN1cGVyLnJlbmRlckNvbXBvbmVudChhcmcwLCBhcmcxKTsKLSAgICAgICAgbV9vYmpOb2RlU3RhdGUgPSBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIFNob3dOb2RlSW1hZ2VzQmluZGluZy4KLSAgICAgKiBAcmV0dXJuIElCaW5kaW5nCi0gICAgICovCi0gICAgcHVibGljIElCaW5kaW5nIGdldFNob3dOb2RlSW1hZ2VzQmluZGluZygpIHsKLSAgICAgICAgcmV0dXJuIG1fb2JqU2hvd05vZGVJbWFnZXNCaW5kaW5nOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIFNob3dOb2RlSW1hZ2VzQmluZGluZy4KLSAgICAgKiBAcGFyYW0gU2hvd05vZGVJbWFnZXNCaW5kaW5nIFRoZSBTaG93Tm9kZUltYWdlc0JpbmRpbmcgdG8gc2V0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U2hvd05vZGVJbWFnZXNCaW5kaW5nKElCaW5kaW5nIFNob3dOb2RlSW1hZ2VzQmluZGluZykgewotICAgICAgICBtX29ialNob3dOb2RlSW1hZ2VzQmluZGluZyA9IFNob3dOb2RlSW1hZ2VzQmluZGluZzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBTaG93Tm9kZUltYWdlcy4KLSAgICAgKiBAcmV0dXJuIEJvb2xlYW4KLSAgICAgKi8KLSAgICBwdWJsaWMgQm9vbGVhbiBpc1Nob3dOb2RlSW1hZ2VzKCkgewotICAgICAgICBpZihtX29ialNob3dOb2RlSW1hZ2VzID09IG51bGwpewotICAgICAgICAgICAgaWYoZ2V0Tm9kZVJlbmRlckZhY3RvcnlCaW5kaW5nKCkgPT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgbV9vYmpTaG93Tm9kZUltYWdlcyA9IEJvb2xlYW4uVFJVRTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYobV9vYmpTaG93Tm9kZUltYWdlc0JpbmRpbmcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtX29ialNob3dOb2RlSW1hZ2VzID0gKEJvb2xlYW4pCi0gICAgICAgICAgICAgICAgICAgICAgICBtX29ialNob3dOb2RlSW1hZ2VzQmluZGluZy5nZXRPYmplY3QoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtX29ialNob3dOb2RlSW1hZ2VzID0gQm9vbGVhbi5UUlVFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbV9vYmpTaG93Tm9kZUltYWdlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRTaG93SW1hZ2VzKCl7Ci0gICAgICAgIGJvb2xlYW4gYlJlc3VsdCA9IGlzU2hvd05vZGVJbWFnZXMoKS5ib29sZWFuVmFsdWUoKTsKLSAgICAgICAgcmV0dXJuIGJSZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0U2hvd1dpdGhvdXRJbWFnZXMoKXsKLSAgICAgICAgYm9vbGVhbiBiUmVzdWx0ID0gIWlzU2hvd05vZGVJbWFnZXMoKS5ib29sZWFuVmFsdWUoKTsKLSAgICAgICAgcmV0dXJuIGJSZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRPZmZzZXRTdHlsZSgpIHsKLSAgICAgICAgLy9yZXR1cm4gIndpZHRoOiAiICsgZ2V0VHJlZURhdGFWaWV3KCkuZ2V0VHJlZURlZXAoKSAqIDE1OwotCQlJVHJlZVJvd1NvdXJjZSBvYmpUcmVlUm93U291cmNlID0gZ2V0VHJlZVJvd1NvdXJjZSgpOwotCQlUcmVlUm93T2JqZWN0IG9ialRyZWVSb3dPYmplY3QgPSBvYmpUcmVlUm93U291cmNlLmdldFRyZWVSb3coKTsKLSAgICAgICAgaW50IG5UcmVlUm93RGVwdGggPSAwOwotICAgICAgICBpZihvYmpUcmVlUm93T2JqZWN0ICE9IG51bGwpewotCQkJblRyZWVSb3dEZXB0aCA9IG9ialRyZWVSb3dPYmplY3QuZ2V0VHJlZVJvd0RlcHRoKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuICJwYWRkaW5nLWxlZnQ6ICIgKyBuVHJlZVJvd0RlcHRoICogMTUrInB4IjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBub2RlUmVuZGVyRmFjdG9yeUJpbmRpbmcuCi0gICAgICogQHJldHVybiBJQmluZGluZwotICAgICAqLwotICAgIHB1YmxpYyBJQmluZGluZyBnZXROb2RlUmVuZGVyRmFjdG9yeUJpbmRpbmcoKSB7Ci0gICAgICAgIHJldHVybiBtX29iak5vZGVSZW5kZXJGYWN0b3J5QmluZGluZzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBub2RlUmVuZGVyRmFjdG9yeUJpbmRpbmcuCi0gICAgICogQHBhcmFtIG5vZGVSZW5kZXJGYWN0b3J5QmluZGluZyBUaGUgbm9kZVJlbmRlckZhY3RvcnlCaW5kaW5nIHRvIHNldAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE5vZGVSZW5kZXJGYWN0b3J5QmluZGluZyhJQmluZGluZyBub2RlUmVuZGVyRmFjdG9yeUJpbmRpbmcpIHsKLSAgICAgICAgbV9vYmpOb2RlUmVuZGVyRmFjdG9yeUJpbmRpbmcgPSBub2RlUmVuZGVyRmFjdG9yeUJpbmRpbmc7Ci0gICAgfQotCi0gICAgcHVibGljIElOb2RlUmVuZGVyRmFjdG9yeSBnZXROb2RlUmVuZGVyRmFjdG9yeSgpIHsKLSAgICAgICAgaWYobV9vYmpOb2RlUmVuZGVyRmFjdG9yeSA9PSBudWxsKXsKLSAgICAgICAgICAgIElCaW5kaW5nIG9iakJpbmRpbmcgPSBnZXROb2RlUmVuZGVyRmFjdG9yeUJpbmRpbmcoKTsKLSAgICAgICAgICAgIGlmKCBvYmpCaW5kaW5nICE9IG51bGwpewotICAgICAgICAgICAgICAgIG1fb2JqTm9kZVJlbmRlckZhY3RvcnkgPSAoSU5vZGVSZW5kZXJGYWN0b3J5KW9iakJpbmRpbmcuZ2V0T2JqZWN0KCk7Ci0gICAgICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgICAgICBtX29iak5vZGVSZW5kZXJGYWN0b3J5ID0gbmV3IFNpbXBsZU5vZGVSZW5kZXJGYWN0b3J5KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1fb2JqTm9kZVJlbmRlckZhY3Rvcnk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWFrZU5vZGVEaXJlY3RCaW5kaW5nLgotICAgICAqIEByZXR1cm4gSUJpbmRpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgSUJpbmRpbmcgZ2V0TWFrZU5vZGVEaXJlY3RCaW5kaW5nKCkgewotICAgICAgICByZXR1cm4gbV9vYmpNYWtlTm9kZURpcmVjdEJpbmRpbmc7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbWFrZU5vZGVEaXJlY3RCaW5kaW5nLgotICAgICAqIEBwYXJhbSBtYWtlTm9kZURpcmVjdEJpbmRpbmcgVGhlIG1ha2VOb2RlRGlyZWN0QmluZGluZyB0byBzZXQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRNYWtlTm9kZURpcmVjdEJpbmRpbmcoSUJpbmRpbmcgbWFrZU5vZGVEaXJlY3RCaW5kaW5nKSB7Ci0gICAgICAgIG1fb2JqTWFrZU5vZGVEaXJlY3RCaW5kaW5nID0gbWFrZU5vZGVEaXJlY3RCaW5kaW5nOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ha2VOb2RlRGlyZWN0LgotICAgICAqIEByZXR1cm4gQm9vbGVhbgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGdldE1ha2VOb2RlRGlyZWN0KCkgewotICAgICAgICBpZihtX29iak1ha2VOb2RlRGlyZWN0ID09IG51bGwpewotICAgICAgICAgICAgSUJpbmRpbmcgb2JqQmluZGluZyA9IGdldE1ha2VOb2RlRGlyZWN0QmluZGluZygpOwotICAgICAgICAgICAgaWYob2JqQmluZGluZyAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICBtX29iak1ha2VOb2RlRGlyZWN0ID0gKEJvb2xlYW4pb2JqQmluZGluZy5nZXRPYmplY3QoKTsKLSAgICAgICAgICAgIH1lbHNlewotICAgICAgICAgICAgICAgIG1fb2JqTWFrZU5vZGVEaXJlY3QgPSBCb29sZWFuLlRSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1fb2JqTWFrZU5vZGVEaXJlY3QuYm9vbGVhblZhbHVlKCk7Ci0gICAgfQotICAgIHB1YmxpYyBib29sZWFuIGdldE1ha2VOb2RlTm9EaXJlY3QoKSB7Ci0gICAgICAgIHJldHVybiAhZ2V0TWFrZU5vZGVEaXJlY3QoKTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xlYW5TZWxlY3RlZElEKCl7Ci0gICAgICAgIHJldHVybiBnZXRTZWxlY3RlZE5vZGVJRCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0ZWRJRCgpewotCQlJVHJlZVJvd1NvdXJjZSBvYmpUcmVlUm93U291cmNlID0gZ2V0VHJlZVJvd1NvdXJjZSgpOwotCQlJVHJlZU1vZGVsU291cmNlIG9ialRyZWVNb2RlbFNvdXJjZSA9IGdldFRyZWVNb2RlbFNvdXJjZSgpOwotCQlUcmVlUm93T2JqZWN0IG9ialRyZWVSb3dPYmplY3QgPSBvYmpUcmVlUm93U291cmNlLmdldFRyZWVSb3coKTsKLSAgICAgICAgT2JqZWN0IG9iak5vZGVWYWx1ZVVJRCA9IG9ialRyZWVSb3dPYmplY3QuZ2V0VHJlZU5vZGVVSUQoKTsKLSAgICAgICAgT2JqZWN0IG9ialNlbGVjdGVkTm9kZSA9IG9ialRyZWVNb2RlbFNvdXJjZS5nZXRUcmVlTW9kZWwoKS5nZXRUcmVlU3RhdGVNb2RlbCgpLmdldFNlbGVjdGVkTm9kZSgpOwotICAgICAgICBpZihvYmpOb2RlVmFsdWVVSUQuZXF1YWxzKG9ialNlbGVjdGVkTm9kZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRTZWxlY3RlZE5vZGVJRCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAiIjsKLSAgICB9Ci0JCQotCXByaXZhdGUgU3RyaW5nIGdldFNlbGVjdGVkTm9kZUlEKCl7Ci0JCS8vcmV0dXJuIGdldFRyZWVEYXRhVmlldygpLmdldFRyZWVWaWV3KCkuZ2V0U2VsZWN0ZWROb2RlSUQoKTsKLQkJcmV0dXJuICJ0cmVlIjsJCi0JfQotCQkKLSAgICBwdWJsaWMgU3RyaW5nIGdldE5vZGVTdHlsZUNsYXNzKCkgewotCQlJVHJlZVJvd1NvdXJjZSBvYmpUcmVlUm93U291cmNlID0gZ2V0VHJlZVJvd1NvdXJjZSgpOwotCQlJVHJlZU1vZGVsU291cmNlIG9ialRyZWVNb2RlbFNvdXJjZSA9IGdldFRyZWVNb2RlbFNvdXJjZSgpOwotCQlUcmVlUm93T2JqZWN0IG9ialRyZWVSb3dPYmplY3QgPSBvYmpUcmVlUm93U291cmNlLmdldFRyZWVSb3coKTsKLQkJYm9vbGVhbiBiUmVzdWx0ID0gZmFsc2U7Ci0JCWlmKG9ialRyZWVSb3dPYmplY3QgIT0gbnVsbCl7Ci0JICAgICAgICBPYmplY3Qgb2JqTm9kZVZhbHVlVUlEID0gb2JqVHJlZVJvd09iamVjdC5nZXRUcmVlTm9kZVVJRCgpOwotCSAgICAgICAgT2JqZWN0IG9ialNlbGVjdGVkTm9kZSA9IG9ialRyZWVNb2RlbFNvdXJjZS5nZXRUcmVlTW9kZWwoKS5nZXRUcmVlU3RhdGVNb2RlbCgpLmdldFNlbGVjdGVkTm9kZSgpOwotCQkJYlJlc3VsdCA9IG9iak5vZGVWYWx1ZVVJRC5lcXVhbHMob2JqU2VsZWN0ZWROb2RlKTsKLQkJfQotICAgICAgICBpZiAoYlJlc3VsdCkgewotICAgICAgICAgICAgcmV0dXJuICJzZWxlY3RlZE5vZGVWaWV3Q2xhc3MiOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuICJub3RTZWxlY3RlZE5vZGVWaWV3Q2xhc3MiOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSVRyZWVSb3dTb3VyY2UgZ2V0VHJlZVJvd1NvdXJjZSgpewotCQlJVHJlZVJvd1NvdXJjZSBvYmpTb3VyY2UgPSAoSVRyZWVSb3dTb3VyY2UpZ2V0UGFnZSgpLmdldFJlcXVlc3RDeWNsZSgpLmdldEF0dHJpYnV0ZShJVHJlZVJvd1NvdXJjZS5UUkVFX1JPV19TT1VSQ0VfQVRUUklCVVRFKTsKLSAgICAJcmV0dXJuIG9ialNvdXJjZTsKLSAgICB9Ci0KLQlwdWJsaWMgSVRyZWVNb2RlbFNvdXJjZSBnZXRUcmVlTW9kZWxTb3VyY2UoKXsKLQkJSVRyZWVNb2RlbFNvdXJjZSBvYmpTb3VyY2UgPSAoSVRyZWVNb2RlbFNvdXJjZSlnZXRQYWdlKCkuZ2V0UmVxdWVzdEN5Y2xlKCkuZ2V0QXR0cmlidXRlKElUcmVlTW9kZWxTb3VyY2UuVFJFRV9NT0RFTF9TT1VSQ0VfQVRUUklCVVRFKTsKLQkJcmV0dXJuIG9ialNvdXJjZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdHJlZS9jb21wb25lbnRzL1RyZWVOb2RlVmlldy5qd2MgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdHJlZS9jb21wb25lbnRzL1RyZWVOb2RlVmlldy5qd2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhZGFkY2UuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RyZWUvY29tcG9uZW50cy9UcmVlTm9kZVZpZXcuandjCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICAKLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08IS0tICAkSWQkIC0tPgotPCFET0NUWVBFIGNvbXBvbmVudC1zcGVjaWZpY2F0aW9uIFBVQkxJQyAKLSAgIi0vL0FwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLy9UYXBlc3RyeSBTcGVjaWZpY2F0aW9uIDMuMC8vRU4iIAotICAiaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy90YXBlc3RyeS9kdGQvVGFwZXN0cnlfM18wLmR0ZCI+Ci0KLTxjb21wb25lbnQtc3BlY2lmaWNhdGlvbgotICAgIGNsYXNzPSJvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudHJlZS5jb21wb25lbnRzLlRyZWVOb2RlVmlldyIKLSAgICBhbGxvdy1ib2R5PSJ5ZXMiIGFsbG93LWluZm9ybWFsLXBhcmFtZXRlcnM9InllcyI+Ci0KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImNsb3NlTm9kZUltYWdlIiB0eXBlPSJvcmcuYXBhY2hlLnRhcGVzdHJ5LklBc3NldCIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJubyIgZGlyZWN0aW9uPSJpbiIvPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0ib3Blbk5vZGVJbWFnZSIgdHlwZT0ib3JnLmFwYWNoZS50YXBlc3RyeS5JQXNzZXQiCi0gICAgICAgICAgICAgICByZXF1aXJlZD0ibm8iIGRpcmVjdGlvbj0iaW4iLz4KLQotICAgIDxwYXJhbWV0ZXIgbmFtZT0ic2hvd05vZGVJbWFnZXMiIHR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJubyIKLSAgICAgICAgICAgICAgIGRpcmVjdGlvbj0iY3VzdG9tIi8+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJtYWtlTm9kZURpcmVjdCIgdHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Im5vIgotICAgICAgICAgICAgICAgZGlyZWN0aW9uPSJjdXN0b20iLz4KLQotICAgIDxwYXJhbWV0ZXIgbmFtZT0ibm9kZVJlbmRlckZhY3RvcnkiCi0gICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudHJlZS5jb21wb25lbnRzLklOb2RlUmVuZGVyRmFjdG9yeSIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJubyIgZGlyZWN0aW9uPSJjdXN0b20iLz4KLQotICAgIDwhLS1wYXJhbWV0ZXIgbmFtZT0idHJlZVN0YXRlTGlzdGVuZXIiCi0gICAgICAgIHR5cGU9Im9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50cmVlLm1vZGVsLklUcmVlU3RhdGVMaXN0ZW5lciIKLSAgICAgICAgZGlyZWN0aW9uPSJjdXN0b20iIHJlcXVpcmVkPSJubyI+Ci0gICAgPC9wYXJhbWV0ZXItLT4KLQotICAgIDxyZXNlcnZlZC1wYXJhbWV0ZXIgbmFtZT0ib3Blbm5vZGVpbWFnZSIvPgotICAgIDxyZXNlcnZlZC1wYXJhbWV0ZXIgbmFtZT0idHJlZWRhdGF2aWV3Ii8+Ci0gICAgPHJlc2VydmVkLXBhcmFtZXRlciBuYW1lPSJjbG9zZW5vZGVpbWFnZSIvPgotICAgIDxyZXNlcnZlZC1wYXJhbWV0ZXIgbmFtZT0ibm9kZXZpZXdkaXJlY3QiLz4KLQotICAgIDxjb21wb25lbnQgaWQ9ImRpcmVjdCIgdHlwZT0iRGlyZWN0TGluayI+Ci0gICAgICAgIDxiaW5kaW5nIG5hbWU9InBhcmFtZXRlcnMiIGV4cHJlc3Npb249Im5vZGVDb250ZXh0Ii8+Ci0gICAgICAgIDxiaW5kaW5nIG5hbWU9Imxpc3RlbmVyIiBleHByZXNzaW9uPSJsaXN0ZW5lcnMubm9kZVNlbGVjdCIvPgotICAgICAgICA8YmluZGluZyBuYW1lPSJzdGF0ZWZ1bCIgZXhwcmVzc2lvbj0iZmFsc2UiLz4KLSAgICAgICAgPGJpbmRpbmcgbmFtZT0ibmFtZSIgZXhwcmVzc2lvbj0ic2VsZWN0ZWRJRCIvPgotICAgICAgICA8YmluZGluZyBuYW1lPSJhbmNob3IiIGV4cHJlc3Npb249ImNsZWFuU2VsZWN0ZWRJRCIvPgotICAgIDwvY29tcG9uZW50PgotCi0gICAgPGNvbXBvbmVudCBpZD0ic2hvd0ltYWdlcyIgdHlwZT0iQ29uZGl0aW9uYWwiPgotICAgICAgICA8YmluZGluZyBuYW1lPSJjb25kaXRpb24iIGV4cHJlc3Npb249InNob3dJbWFnZXMiLz4KLSAgICA8L2NvbXBvbmVudD4KLQotICAgIDxjb21wb25lbnQgaWQ9InNob3dJbWFnZXMyIiBjb3B5LW9mPSJzaG93SW1hZ2VzIi8+Ci0KLSAgICA8IS0tY29tcG9uZW50IGlkPSJzaG93V2l0aG91dEltYWdlcyIgdHlwZT0iQ29uZGl0aW9uYWwiPgotICAgICAgICA8YmluZGluZyBuYW1lPSJjb25kaXRpb24iIGV4cHJlc3Npb249InNob3dXaXRob3V0SW1hZ2VzIi8+Ci0gICAgPC9jb21wb25lbnQtLT4KLQotICAgIDxjb21wb25lbnQgaWQ9Im1ha2VOb2RlRGlyZWN0IiB0eXBlPSJDb25kaXRpb25hbCI+Ci0gICAgICAgIDxiaW5kaW5nIG5hbWU9ImNvbmRpdGlvbiIgZXhwcmVzc2lvbj0ibWFrZU5vZGVEaXJlY3QiLz4KLSAgICA8L2NvbXBvbmVudD4KLQotICAgIDxjb21wb25lbnQgaWQ9Im1ha2VOb2RlTm9EaXJlY3QiIHR5cGU9IkNvbmRpdGlvbmFsIj4KLSAgICAgICAgPGJpbmRpbmcgbmFtZT0iY29uZGl0aW9uIiBleHByZXNzaW9uPSJtYWtlTm9kZU5vRGlyZWN0Ii8+Ci0gICAgPC9jb21wb25lbnQ+Ci0KLSAgICA8Y29tcG9uZW50IGlkPSJpbWFnZU5vZGUiIHR5cGU9IkltYWdlIj4KLSAgICAgICAgPGJpbmRpbmcgbmFtZT0iaW1hZ2UiIGV4cHJlc3Npb249Im5vZGVJbWFnZSIvPgotICAgIDwvY29tcG9uZW50PgotICAgIDxjb21wb25lbnQgaWQ9ImltYWdlTm9kZTIiIGNvcHktb2Y9ImltYWdlTm9kZSIvPgotCi0gICAgPGNvbXBvbmVudCBpZD0iaW5zZXJ0VmFsdWUiIHR5cGU9IkRlbGVnYXRvciI+Ci0JCTxiaW5kaW5nIG5hbWU9ImRlbGVnYXRlIiBleHByZXNzaW9uPSJjdXJyZW50UmVuZGVyZXIiLz4KLSAgICA8L2NvbXBvbmVudD4KLSAgICA8Y29tcG9uZW50IGlkPSJpbnNlcnRWYWx1ZTIiIGNvcHktb2Y9Imluc2VydFZhbHVlIi8+Ci0KLSAgICA8Y29tcG9uZW50IGlkPSJvZmZzZXQiIHR5cGU9IkFueSI+Ci0gICAgICAgIDxzdGF0aWMtYmluZGluZyBuYW1lPSJlbGVtZW50Ij5zcGFuPC9zdGF0aWMtYmluZGluZz4KLSAgICAgICAgPGJpbmRpbmcgbmFtZT0ic3R5bGUiIGV4cHJlc3Npb249Im9mZnNldFN0eWxlIi8+Ci0gICAgICAgIDxiaW5kaW5nIG5hbWU9ImNsYXNzIiBleHByZXNzaW9uPSJub2RlU3R5bGVDbGFzcyIvPgotICAgIDwvY29tcG9uZW50PgotCi0gICAgPHByaXZhdGUtYXNzZXQgbmFtZT0iX2Nsb3NlTm9kZUltYWdlIiByZXNvdXJjZS1wYXRoPSJwbHVzLmdpZiIvPgotICAgIDxwcml2YXRlLWFzc2V0IG5hbWU9Il9vcGVuTm9kZUltYWdlIiByZXNvdXJjZS1wYXRoPSJtaW51cy5naWYiLz4KLTwvY29tcG9uZW50LXNwZWNpZmljYXRpb24+CmRpZmYgLS1naXQgYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdHJlZS9jb21wb25lbnRzL1RyZWVOb2RlVmlld1BhZ2UuaHRtbCBiL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90cmVlL2NvbXBvbmVudHMvVHJlZU5vZGVWaWV3UGFnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjExZTdhLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90cmVlL2NvbXBvbmVudHMvVHJlZU5vZGVWaWV3UGFnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08IS0tIGdlbmVyYXRlZCBieSBTcGluZGxlLCBodHRwOi8vc3BpbmRsZS5zb3VyY2Vmb3JnZS5uZXQgLS0+Ci0KLTxzcGFuIGp3Y2lkPSIkY29udGVudCQiPgotCTxzcGFuIGp3Y2lkPSJ0cmVlTm9kZVZpZXciLz4KLTwvc3Bhbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdHJlZS9jb21wb25lbnRzL1RyZWVOb2RlVmlld1BhZ2UucGFnZSBiL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90cmVlL2NvbXBvbmVudHMvVHJlZU5vZGVWaWV3UGFnZS5wYWdlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWYyN2Y3Li4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90cmVlL2NvbXBvbmVudHMvVHJlZU5vZGVWaWV3UGFnZS5wYWdlCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gIAotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTwhLS0gRm9ybXMucGFnZSx2IDEuMSAyMDAyLzA4LzIzIDIyOjE4OjMxIGhzaGlwIEV4cCAtLT4KLTwhRE9DVFlQRSBwYWdlLXNwZWNpZmljYXRpb24gUFVCTElDIAotICAiLS8vQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24vL1RhcGVzdHJ5IFNwZWNpZmljYXRpb24gMy4wLy9FTiIgCi0gICJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL3RhcGVzdHJ5L2R0ZC9UYXBlc3RyeV8zXzAuZHRkIj4KLQotPHBhZ2Utc3BlY2lmaWNhdGlvbj4KLQotICAgIDxjb21wb25lbnQgaWQ9InRyZWVOb2RlVmlldyIgdHlwZT0iVHJlZU5vZGVWaWV3Ij4KLSAgICA8L2NvbXBvbmVudD4KLQotPC9wYWdlLXNwZWNpZmljYXRpb24+CmRpZmYgLS1naXQgYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdHJlZS9jb21wb25lbnRzL1RyZWVWaWV3Lmh0bWwgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdHJlZS9jb21wb25lbnRzL1RyZWVWaWV3Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmYWNiNTguLjAwMDAwMDAKLS0tIGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RyZWUvY29tcG9uZW50cy9UcmVlVmlldy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08c3BhbiBqd2NpZD0iJGNvbnRlbnQkIj4KLSAgICA8c3BhbiBqd2NpZD0iaW5oZXJpdEluZm9ybWFsQW55Ij4KLSAgICAgICAgPHNwYW4gandjaWQ9Imluc2VydFdyYXBwZWQiLz4KLSAgICA8L3NwYW4+Ci08L3NwYW4+CmRpZmYgLS1naXQgYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdHJlZS9jb21wb25lbnRzL1RyZWVWaWV3LmphdmEgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdHJlZS9jb21wb25lbnRzL1RyZWVWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5MjYyMjYuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RyZWUvY29tcG9uZW50cy9UcmVlVmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI0ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudHJlZS5jb21wb25lbnRzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5CYXNlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUJpbmRpbmc7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JTWFya3VwV3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlcXVlc3RDeWNsZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudHJlZS5tb2RlbC5JU2Vzc2lvblN0b3JlTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudHJlZS5tb2RlbC5JVHJlZU1vZGVsOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50cmVlLm1vZGVsLklUcmVlTW9kZWxTb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRyZWUubW9kZWwuSVRyZWVTZXNzaW9uU3RhdGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50cmVlLm1vZGVsLklUcmVlU3RhdGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudHJlZS5zaW1wbGUuRnVsbFRyZWVTZXNzaW9uU3RhdGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuZXZlbnQuUGFnZURldGFjaExpc3RlbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuZXZlbnQuUGFnZUV2ZW50OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuZXZlbnQuUGFnZVJlbmRlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkudXRpbC5Db21wb25lbnRBZGRyZXNzOwotCi0vKioKLSAqIEB2ZXJzaW9uICRJZCQKLSAqLwotcHVibGljIGNsYXNzIFRyZWVWaWV3IGV4dGVuZHMgQmFzZUNvbXBvbmVudAotICAgIGltcGxlbWVudHMgUGFnZURldGFjaExpc3RlbmVyLCBQYWdlUmVuZGVyTGlzdGVuZXIsIElUcmVlTW9kZWxTb3VyY2UgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIExPRyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFRyZWVWaWV3LmNsYXNzKTsKLQotICAgIHByaXZhdGUgSUJpbmRpbmcgbV9vYmpTZXNzaW9uU3RvcmVNYW5hZ2VyQmluZGluZzsKLSAgICBwcml2YXRlIElCaW5kaW5nIG1fb2JqVHJlZU1vZGVsQmluZGluZzsKLSAgICBwcml2YXRlIElCaW5kaW5nIG1fb2JqU2Vzc2lvblN0YXRlTWFuYWdlckJpbmRpbmc7Ci0KLSAgICBwcml2YXRlIElUcmVlTW9kZWwgbV9vYmpUcmVlTW9kZWw7Ci0gICAgcHJpdmF0ZSBJVHJlZVNlc3Npb25TdGF0ZU1hbmFnZXIgbV9vYmpUcmVlU2Vzc2lvblN0YXRlTWFuYWdlcjsKLSAgICBwcml2YXRlIElTZXNzaW9uU3RvcmVNYW5hZ2VyIG1fb2JqU2Vzc2lvblN0b3JlTWFuYWdlcjsKLSAgICBwcml2YXRlIE9iamVjdCBtX29ialRyZWVTZXNzaW9uU3RhdGU7Ci0gICAgcHJpdmF0ZSBDb21wb25lbnRBZGRyZXNzIG1fb2JqQ29tcG9uZW50QWRkcmVzczsKLQotICAgIHB1YmxpYyBUcmVlVmlldygpewotICAgICAgICBzdXBlcigpOwotICAgICAgICBpbml0aWFsaXplKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoKXsKLSAgICAgICAgbV9vYmpUcmVlTW9kZWwgPSBudWxsOwotICAgICAgICBtX29ialRyZWVTZXNzaW9uU3RhdGVNYW5hZ2VyID0gbnVsbDsKLSAgICAgICAgbV9vYmpTZXNzaW9uU3RvcmVNYW5hZ2VyID0gbnVsbDsKLSAgICAgICAgbV9vYmpUcmVlU2Vzc2lvblN0YXRlID0gbnVsbDsKLSAgICAgICAgbV9vYmpDb21wb25lbnRBZGRyZXNzID0gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUudGFwZXN0cnkuQWJzdHJhY3RDb21wb25lbnQjZmluaXNoTG9hZCgpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZmluaXNoTG9hZCgpIHsKLSAgICAgICAgc3VwZXIuZmluaXNoTG9hZCgpOwotICAgICAgICBnZXRQYWdlKCkuYWRkUGFnZVJlbmRlckxpc3RlbmVyKHRoaXMpOwotICAgICAgICBnZXRQYWdlKCkuYWRkUGFnZURldGFjaExpc3RlbmVyKHRoaXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS50YXBlc3RyeS5BYnN0cmFjdENvbXBvbmVudCNyZW5kZXJDb21wb25lbnQoSU1hcmt1cFdyaXRlciwgSVJlcXVlc3RDeWNsZSkKLSAgICAgKi8KLSAgICAvKglwcm90ZWN0ZWQgdm9pZCByZW5kZXJDb21wb25lbnQoSU1hcmt1cFdyaXRlciB3cml0ZXIsIElSZXF1ZXN0Q3ljbGUgY3ljbGUpCi0gICAgICAgIHRocm93cyBSZXF1ZXN0Q3ljbGVFeGNlcHRpb24KLQl7Ci0gICAgCXJlbmRlcldyYXBwZWQod3JpdGVyLCBjeWNsZSk7Ci0JfQotICAgICovCi0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUudGFwZXN0cnkuZXZlbnQuUGFnZURldGFjaExpc3RlbmVyI3BhZ2VEZXRhY2hlZChQYWdlRXZlbnQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcGFnZURldGFjaGVkKFBhZ2VFdmVudCBhcmcwKSB7Ci0gICAgICAgIGluaXRpYWxpemUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUudGFwZXN0cnkuZXZlbnQuUGFnZVJlbmRlckxpc3RlbmVyI3BhZ2VCZWdpblJlbmRlcihQYWdlRXZlbnQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcGFnZUJlZ2luUmVuZGVyKFBhZ2VFdmVudCBhcmcwKSB7Ci0gICAgICAgIGlmKGFyZzAuZ2V0UmVxdWVzdEN5Y2xlKCkuaXNSZXdpbmRpbmcoKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHN0b3JlU2VzaW9uKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmV2ZW50LlBhZ2VSZW5kZXJMaXN0ZW5lciNwYWdlRW5kUmVuZGVyKFBhZ2VFdmVudCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwYWdlRW5kUmVuZGVyKFBhZ2VFdmVudCBhcmcwKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdHJlZU1vZGVsQmluZGluZy4KLSAgICAgKiBAcmV0dXJuIElCaW5kaW5nCi0gICAgICovCi0gICAgcHVibGljIElCaW5kaW5nIGdldFRyZWVNb2RlbEJpbmRpbmcoKSB7Ci0gICAgICAgIHJldHVybiBtX29ialRyZWVNb2RlbEJpbmRpbmc7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdHJlZU1vZGVsQmluZGluZy4KLSAgICAgKiBAcGFyYW0gdHJlZU1vZGVsQmluZGluZyBUaGUgdHJlZU1vZGVsQmluZGluZyB0byBzZXQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUcmVlTW9kZWxCaW5kaW5nKElCaW5kaW5nIHRyZWVNb2RlbEJpbmRpbmcpIHsKLSAgICAgICAgbV9vYmpUcmVlTW9kZWxCaW5kaW5nID0gdHJlZU1vZGVsQmluZGluZzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBTZXNzaW9uU3RvcmVNYW5hZ2VyQmluZGluZy4KLSAgICAgKiBAcmV0dXJuIElCaW5kaW5nCi0gICAgICovCi0gICAgcHVibGljIElCaW5kaW5nIGdldFNlc3Npb25TdG9yZU1hbmFnZXJCaW5kaW5nKCkgewotICAgICAgICByZXR1cm4gbV9vYmpTZXNzaW9uU3RvcmVNYW5hZ2VyQmluZGluZzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzZXNzaW9uU3RhdGVNYW5hZ2VyQmluZGluZy4KLSAgICAgKiBAcmV0dXJuIElCaW5kaW5nCi0gICAgICovCi0gICAgcHVibGljIElCaW5kaW5nIGdldFNlc3Npb25TdGF0ZU1hbmFnZXJCaW5kaW5nKCkgewotICAgICAgICByZXR1cm4gbV9vYmpTZXNzaW9uU3RhdGVNYW5hZ2VyQmluZGluZzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBTZXNzaW9uU3RvcmVNYW5hZ2VyQmluZGluZy4KLSAgICAgKiBAcGFyYW0gc2Vzc2lvblN0b3JlTWFuYWdlckJpbmRpbmcgVGhlIFNlc3Npb25TdG9yZU1hbmFnZXJCaW5kaW5nIHRvIHNldAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNlc3Npb25TdG9yZU1hbmFnZXJCaW5kaW5nKElCaW5kaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvblN0b3JlTWFuYWdlckJpbmRpbmcpIHsKLSAgICAgICAgbV9vYmpTZXNzaW9uU3RvcmVNYW5hZ2VyQmluZGluZyA9IHNlc3Npb25TdG9yZU1hbmFnZXJCaW5kaW5nOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHNlc3Npb25TdGF0ZU1hbmFnZXJCaW5kaW5nLgotICAgICAqIEBwYXJhbSBzZXNzaW9uU3RhdGVNYW5hZ2VyQmluZGluZyBUaGUgc2Vzc2lvblN0YXRlTWFuYWdlckJpbmRpbmcgdG8gc2V0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U2Vzc2lvblN0YXRlTWFuYWdlckJpbmRpbmcoSUJpbmRpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uU3RhdGVNYW5hZ2VyQmluZGluZykgewotICAgICAgICBtX29ialNlc3Npb25TdGF0ZU1hbmFnZXJCaW5kaW5nID0gc2Vzc2lvblN0YXRlTWFuYWdlckJpbmRpbmc7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGV4dHJhY3RUcmVlTW9kZWwoKXsKLSAgICAgICAgaWYgKExPRy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBMT0cuZGVidWcoIlRyZWVWaWV3LmV4dHJhY3RUcmVlTW9kZWwoKSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgSVNlc3Npb25TdG9yZU1hbmFnZXIgb2JqSG9sZGVyID0gZ2V0U2Vzc2lvblN0b3JlTWFuYWdlcigpOwotICAgICAgICBJVHJlZVNlc3Npb25TdGF0ZU1hbmFnZXIgb2JqU2Vzc2lvbk1hbmFnZXIgPSBnZXRUcmVlU2Vzc2lvblN0YXRlTWdyKCk7Ci0gICAgICAgIE9iamVjdCBvYmpTZXNzaW9uU3RhdGU7Ci0gICAgICAgIGlmIChvYmpIb2xkZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgb2JqU2Vzc2lvblN0YXRlID0gZ2V0VHJlZVNlc3Npb25TdGF0ZSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgb2JqU2Vzc2lvblN0YXRlID0gb2JqSG9sZGVyLmdldFNlc3Npb25TdGF0ZSh0aGlzLmdldFBhZ2UoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRyZWVTZXNzaW9uU3RhdGUiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChvYmpTZXNzaW9uU3RhdGUgIT0gbnVsbCkgewotICAgICAgICAgICAgbV9vYmpUcmVlTW9kZWwgPSBvYmpTZXNzaW9uTWFuYWdlci5nZXRNb2RlbChvYmpTZXNzaW9uU3RhdGUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKExPRy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgTE9HLmRlYnVnKCJUcmVlVmlldy5leHRyYWN0VHJlZU1vZGVsKCkgZnJvbSBCSU5ESU5HIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1fb2JqVHJlZU1vZGVsID0gKElUcmVlTW9kZWwpZ2V0VHJlZU1vZGVsQmluZGluZygpLmdldE9iamVjdCgpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc3RvcmVTZXNpb24oKXsKLSAgICAgICAgaWYgKExPRy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBMT0cuZGVidWcoIlRyZWVWaWV3LnN0b3JlU2VzaW9uKCkiKTsKLSAgICAgICAgfQotCi0gICAgICAgIElUcmVlU2Vzc2lvblN0YXRlTWFuYWdlciBvYmpTZXNzaW9uTWFuYWdlciA9IGdldFRyZWVTZXNzaW9uU3RhdGVNZ3IoKTsKLSAgICAgICAgT2JqZWN0IG9ialNlc3Npb25TdGF0ZSA9Ci0gICAgICAgICAgICBvYmpTZXNzaW9uTWFuYWdlci5nZXRTZXNzaW9uU3RhdGUoZ2V0VHJlZU1vZGVsKCkpOwotCi0gICAgICAgIHN0b3JlKG9ialNlc3Npb25TdGF0ZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHN0b3JlKE9iamVjdCBvYmpTZXNzaW9uU3RhdGUpewotICAgICAgICBJU2Vzc2lvblN0b3JlTWFuYWdlciBvYmpIb2xkZXIgPSBnZXRTZXNzaW9uU3RvcmVNYW5hZ2VyKCk7Ci0KLSAgICAgICAgaWYgKG9iakhvbGRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBmaXJlT2JzZXJ2ZWRDaGFuZ2UoInRyZWVTZXNzaW9uU3RhdGUiLCBvYmpTZXNzaW9uU3RhdGUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy9TdHJpbmcgc3RyUGF0aCA9ICJ0cmVlU2Vzc2lvblN0YXRlIjsKLSAgICAgICAgICAgIFN0cmluZyBzdHJQYXRoID0gZ2V0RXh0ZW5kZWRJZCgpOwotICAgICAgICAgICAgaWYgKExPRy5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIExPRy5kZWJ1Zygic3RvcmUoKTogc2V0dGluZyBzdGF0ZSB3aXRoOiAiICsgc3RyUGF0aCk7Ci0gICAgICAgICAgICBvYmpIb2xkZXIuc2V0U2Vzc2lvblN0YXRlKHRoaXMuZ2V0UGFnZSgpLCBzdHJQYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmpTZXNzaW9uU3RhdGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBJVHJlZUNvbXBvbmVudCNyZXNldFN0YXRlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZXNldFN0YXRlKCkgewotICAgICAgICBpZiAoTE9HLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIExPRy5kZWJ1ZygiVHJlZVZpZXcucmVzZXRTdGF0ZSgpIik7Ci0gICAgICAgIH0KLSAgICAgICAgaW5pdGlhbGl6ZSgpOwotICAgICAgICBzdG9yZShudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBTZXNzaW9uU3RvcmVNYW5hZ2VyLgotICAgICAqIEByZXR1cm4gSVNlc3Npb25TdG9yZU1hbmFnZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgSVNlc3Npb25TdG9yZU1hbmFnZXIgZ2V0U2Vzc2lvblN0b3JlTWFuYWdlcigpIHsKLSAgICAgICAgaWYgKG1fb2JqU2Vzc2lvblN0b3JlTWFuYWdlciA9PSBudWxsCi0gICAgICAgICAgICAmJiBnZXRTZXNzaW9uU3RvcmVNYW5hZ2VyQmluZGluZygpICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1fb2JqU2Vzc2lvblN0b3JlTWFuYWdlciA9Ci0gICAgICAgICAgICAgICAgKElTZXNzaW9uU3RvcmVNYW5hZ2VyKWdldFNlc3Npb25TdG9yZU1hbmFnZXJCaW5kaW5nKCkuZ2V0T2JqZWN0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbV9vYmpTZXNzaW9uU3RvcmVNYW5hZ2VyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHdpemFyZFNlc3Npb25TdGF0ZU1nci4KLSAgICAgKiBAcmV0dXJuIElXaXphcmRTZXNzaW9uU3RhdGVNYW5hZ2VyCi0gICAgICovCi0gICAgcHVibGljIElUcmVlU2Vzc2lvblN0YXRlTWFuYWdlciBnZXRUcmVlU2Vzc2lvblN0YXRlTWdyKCkgewotICAgICAgICBpZiAobV9vYmpUcmVlU2Vzc2lvblN0YXRlTWFuYWdlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBJQmluZGluZyBvYmpCaW5kaW5nID0gZ2V0U2Vzc2lvblN0YXRlTWFuYWdlckJpbmRpbmcoKTsKLSAgICAgICAgICAgIGlmKG9iakJpbmRpbmcgIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IG9iak1hbmFnZXIgPSBvYmpCaW5kaW5nLmdldE9iamVjdCgpOwotICAgICAgICAgICAgICAgIG1fb2JqVHJlZVNlc3Npb25TdGF0ZU1hbmFnZXIgPQotICAgICAgICAgICAgICAgICAgICAoSVRyZWVTZXNzaW9uU3RhdGVNYW5hZ2VyKSBvYmpNYW5hZ2VyOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtX29ialRyZWVTZXNzaW9uU3RhdGVNYW5hZ2VyID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IEZ1bGxUcmVlU2Vzc2lvblN0YXRlTWFuYWdlcigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtX29ialRyZWVTZXNzaW9uU3RhdGVNYW5hZ2VyOwotICAgIH0KLQotICAgIHB1YmxpYyBDb21wb25lbnRBZGRyZXNzIGdldENvbXBvbmVudFBhdGgoKSB7Ci0gICAgICAgIGlmIChtX29iakNvbXBvbmVudEFkZHJlc3MgPT0gbnVsbCkgewotICAgICAgICAgICAgbV9vYmpDb21wb25lbnRBZGRyZXNzID0gbmV3IENvbXBvbmVudEFkZHJlc3ModGhpcyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1fb2JqQ29tcG9uZW50QWRkcmVzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0cmVlTW9kZWwuCi0gICAgICogQHJldHVybiBJVHJlZU1vZGVsCi0gICAgICovCi0gICAgcHVibGljIElUcmVlTW9kZWwgZ2V0VHJlZU1vZGVsKCkgewotICAgICAgICBpZiAobV9vYmpUcmVlTW9kZWwgPT0gbnVsbCkgewotICAgICAgICAgICAgZXh0cmFjdFRyZWVNb2RlbCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtX29ialRyZWVNb2RlbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB0cmVlTW9kZWwuCi0gICAgICogQHBhcmFtIHRyZWVNb2RlbCBUaGUgdHJlZU1vZGVsIHRvIHNldAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFRyZWVNb2RlbChJVHJlZU1vZGVsIHRyZWVNb2RlbCkgewotICAgICAgICBtX29ialRyZWVNb2RlbCA9IHRyZWVNb2RlbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0cmVlU2Vzc2lvblN0YXRlLgotICAgICAqIEByZXR1cm4gT2JqZWN0Ci0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRUcmVlU2Vzc2lvblN0YXRlKCkgewotICAgICAgICByZXR1cm4gbV9vYmpUcmVlU2Vzc2lvblN0YXRlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHRyZWVTZXNzaW9uU3RhdGUuCi0gICAgICogQHBhcmFtIHRyZWVTZXNzaW9uU3RhdGUgVGhlIHRyZWVTZXNzaW9uU3RhdGUgdG8gc2V0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VHJlZVNlc3Npb25TdGF0ZShPYmplY3QgdHJlZVNlc3Npb25TdGF0ZSkgewotICAgICAgICBtX29ialRyZWVTZXNzaW9uU3RhdGUgPSB0cmVlU2Vzc2lvblN0YXRlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0ZWROb2RlU3R5bGVJRCgpewotICAgICAgICByZXR1cm4gZ2V0SWQoKSArICI6c2VsZWN0ZWQiOwotICAgIH0KLSAgICAKLSAgICAvKioKLQkgKiBAc2VlIG9yZy5hcGFjaGUudGFwZXN0cnkuQmFzZUNvbXBvbmVudCNyZW5kZXJDb21wb25lbnQob3JnLmFwYWNoZS50YXBlc3RyeS5JTWFya3VwV3JpdGVyLCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZXF1ZXN0Q3ljbGUpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVuZGVyQ29tcG9uZW50KElNYXJrdXBXcml0ZXIgYXJnMCwgSVJlcXVlc3RDeWNsZSBhcmcxKSB7Ci0JCU9iamVjdCBvYmpFeGlzdGVkVHJlZU1vZGVsU291cmNlID0gYXJnMS5nZXRBdHRyaWJ1dGUoSVRyZWVNb2RlbFNvdXJjZS5UUkVFX01PREVMX1NPVVJDRV9BVFRSSUJVVEUpOwotCQlhcmcxLnNldEF0dHJpYnV0ZShJVHJlZU1vZGVsU291cmNlLlRSRUVfTU9ERUxfU09VUkNFX0FUVFJJQlVURSwgdGhpcyk7Ci0JCQotCQlzdXBlci5yZW5kZXJDb21wb25lbnQoYXJnMCwgYXJnMSk7Ci0JCWFyZzEuc2V0QXR0cmlidXRlKElUcmVlTW9kZWxTb3VyY2UuVFJFRV9NT0RFTF9TT1VSQ0VfQVRUUklCVVRFLCBvYmpFeGlzdGVkVHJlZU1vZGVsU291cmNlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50cmVlLm1vZGVsLklUcmVlTW9kZWxTb3VyY2UjZ2V0VHJlZVN0YXRlTGlzdGVuZXIoKQotCSAqLwotCXB1YmxpYyBJVHJlZVN0YXRlTGlzdGVuZXIgZ2V0VHJlZVN0YXRlTGlzdGVuZXIoKSB7Ci0JCUlUcmVlU3RhdGVMaXN0ZW5lciBvYmpMaXN0ZW5lciA9IG51bGw7Ci0JCUlCaW5kaW5nIG9iakJpbmRpbmcgPSBnZXRCaW5kaW5nKCJ0cmVlU3RhdGVMaXN0ZW5lciIpOwotCQlpZihvYmpCaW5kaW5nICE9IG51bGwpewotCQkJb2JqTGlzdGVuZXIgPSAoSVRyZWVTdGF0ZUxpc3RlbmVyKSBvYmpCaW5kaW5nLmdldE9iamVjdCgpOwotCQl9Ci0JCXJldHVybiBvYmpMaXN0ZW5lcjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90cmVlL2NvbXBvbmVudHMvVHJlZVZpZXcuandjIGIvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RyZWUvY29tcG9uZW50cy9UcmVlVmlldy5qd2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3ZjhiMWUuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RyZWUvY29tcG9uZW50cy9UcmVlVmlldy5qd2MKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gIAotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTwhLS0gICRJZCQgLS0+Ci08IURPQ1RZUEUgY29tcG9uZW50LXNwZWNpZmljYXRpb24gUFVCTElDIAotICAiLS8vQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24vL1RhcGVzdHJ5IFNwZWNpZmljYXRpb24gMy4wLy9FTiIgCi0gICJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL3RhcGVzdHJ5L2R0ZC9UYXBlc3RyeV8zXzAuZHRkIj4KLQotPGNvbXBvbmVudC1zcGVjaWZpY2F0aW9uIGNsYXNzPSJvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudHJlZS5jb21wb25lbnRzLlRyZWVWaWV3IgotICAgIGFsbG93LWJvZHk9InllcyIgYWxsb3ctaW5mb3JtYWwtcGFyYW1ldGVycz0ieWVzIj4KLQotICAgIDxwYXJhbWV0ZXIgbmFtZT0ic2Vzc2lvblN0YXRlTWFuYWdlciIKLSAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRyZWUubW9kZWwuSVRyZWVTZXNzaW9uU3RhdGVNYW5hZ2VyIgotICAgICAgICBkaXJlY3Rpb249ImN1c3RvbSIgcmVxdWlyZWQ9Im5vIi8+Ci0KLSAgICA8cGFyYW1ldGVyIG5hbWU9InNlc3Npb25TdG9yZU1hbmFnZXIiCi0gICAgICAgIHR5cGU9Im9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50cmVlLm1vZGVsLklTZXNzaW9uU3RvcmVNYW5hZ2VyIgotICAgICAgICBkaXJlY3Rpb249ImN1c3RvbSIgcmVxdWlyZWQ9Im5vIi8+Ci0KLSAgICA8cGFyYW1ldGVyIG5hbWU9InRyZWVNb2RlbCIKLSAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRyZWUubW9kZWwuSVRyZWVNb2RlbCIKLSAgICAgICAgZGlyZWN0aW9uPSJjdXN0b20iIHJlcXVpcmVkPSJ5ZXMiPgotICAgIDwvcGFyYW1ldGVyPgotCi0gICAgPHBhcmFtZXRlciBuYW1lPSJ0cmVlU3RhdGVMaXN0ZW5lciIKLSAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRyZWUubW9kZWwuSVRyZWVTdGF0ZUxpc3RlbmVyIgotICAgICAgICBkaXJlY3Rpb249ImN1c3RvbSIgcmVxdWlyZWQ9Im5vIj4KLSAgICA8L3BhcmFtZXRlcj4KLQotICAgIDxjb21wb25lbnQgaWQ9ImluaGVyaXRJbmZvcm1hbEFueSIgdHlwZT0iSW5oZXJpdEluZm9ybWFsQW55Ij4KLSAgICAgICAgPHN0YXRpYy1iaW5kaW5nIG5hbWU9ImVsZW1lbnQiPnNwYW48L3N0YXRpYy1iaW5kaW5nPgotICAgIDwvY29tcG9uZW50PgotCi0gICAgPGNvbXBvbmVudCBpZD0iaW5zZXJ0V3JhcHBlZCIgdHlwZT0iUmVuZGVyQm9keSIvPgotCi08L2NvbXBvbmVudC1zcGVjaWZpY2F0aW9uPgpkaWZmIC0tZ2l0IGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RyZWUvY29tcG9uZW50cy9UcmVlVmlldy5zY3JpcHQgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdHJlZS9jb21wb25lbnRzL1RyZWVWaWV3LnNjcmlwdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE2MmU3NC4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdHJlZS9jb21wb25lbnRzL1RyZWVWaWV3LnNjcmlwdAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgc2NyaXB0IFBVQkxJQyAiLS8vSG93YXJkIFNoaXAvL1RhcGVzdHJ5IFNjcmlwdCAxLjEvL0VOIgotICAiaHR0cDovL3RhcGVzdHJ5LnNmLm5ldC9kdGQvU2NyaXB0XzFfMS5kdGQiPgotCi08c2NyaXB0PgotIDxib2R5PgotCWZ1bmN0aW9uIHNlbGVjdCgpewotCQl2YXIgb2JqTm9kZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCI8aW5zZXJ0IHByb3BlcnR5LXBhdGg9InNlbGVjdGVkTm9kZUlEIi8+Iik7Ci0JCXdpbmRvdy5zY3JvbGxUbygwLCBvYmpOb2RlLnkpOwotCX0KLQkJCi0gPC9ib2R5PgotCTxpbml0aWFsaXphdGlvbj4KLQkJc2VsZWN0KCk7Ci0JPC9pbml0aWFsaXphdGlvbj4KLTwvc2NyaXB0PgpkaWZmIC0tZ2l0IGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RyZWUvY29tcG9uZW50cy9taW51cy5naWYgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdHJlZS9jb21wb25lbnRzL21pbnVzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWMwZWY1Zi4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdHJlZS9jb21wb25lbnRzL21pbnVzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90cmVlL2NvbXBvbmVudHMvcGx1cy5naWYgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdHJlZS9jb21wb25lbnRzL3BsdXMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzM2NGJmLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90cmVlL2NvbXBvbmVudHMvcGx1cy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdHJlZS9jb21wb25lbnRzL3RhYmxlL1RyZWVUYWJsZS5odG1sIGIvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RyZWUvY29tcG9uZW50cy90YWJsZS9UcmVlVGFibGUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjBmMjdkNi4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdHJlZS9jb21wb25lbnRzL3RhYmxlL1RyZWVUYWJsZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08c3BhbiBqd2NpZD0iJGNvbnRlbnQkIj4KLQk8c3BhbiBjbGFzcz0idHJlZSIgandjaWQ9InRyZWVWaWV3Ij4KLQkJPHNwYW4gandjaWQ9InRyZWVUYWJsZURhdGFWaWV3Ii8+Ci0JPC9zcGFuPgkJCi08L3NwYW4+CQkKZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90cmVlL2NvbXBvbmVudHMvdGFibGUvVHJlZVRhYmxlLmphdmEgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdHJlZS9jb21wb25lbnRzL3RhYmxlL1RyZWVUYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjE3NmQ2Li4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90cmVlL2NvbXBvbmVudHMvdGFibGUvVHJlZVRhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRyZWUuY29tcG9uZW50cy50YWJsZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuQmFzZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudHJlZS5jb21wb25lbnRzLklUcmVlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50cmVlLmNvbXBvbmVudHMuVHJlZVZpZXc7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRyZWUubW9kZWwuSVRyZWVNb2RlbFNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudHJlZS5tb2RlbC5JVHJlZVJvd1NvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnV0aWwuQ29tcG9uZW50QWRkcmVzczsKLQotLyoqCi0gKiBAYXV0aG9yIGNlY28KLSAqIEB2ZXJzaW9uICRJZCQKLSAqLwotcHVibGljIGNsYXNzIFRyZWVUYWJsZSBleHRlbmRzIEJhc2VDb21wb25lbnQgaW1wbGVtZW50cyBJVHJlZUNvbXBvbmVudHsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBUcmVlVGFibGUoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIElUcmVlTW9kZWxTb3VyY2UgZ2V0VHJlZU1vZGVsU291cmNlKCl7Ci0JCXJldHVybiAoSVRyZWVNb2RlbFNvdXJjZSkgZ2V0Q29tcG9uZW50KCJ0cmVlVmlldyIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRyZWUuY29tcG9uZW50cy5JVHJlZUNvbXBvbmVudCNyZXNldFN0YXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldFN0YXRlKCkgewotCQlUcmVlVmlldyBvYmpUcmVlVmlldyA9IChUcmVlVmlldylnZXRDb21wb25lbnQoInRyZWVWaWV3Iik7Ci0JCW9ialRyZWVWaWV3LnJlc2V0U3RhdGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50cmVlLmNvbXBvbmVudHMuSVRyZWVDb21wb25lbnQjZ2V0Q29tcG9uZW50UGF0aCgpCi0JICovCi0JcHVibGljIENvbXBvbmVudEFkZHJlc3MgZ2V0Q29tcG9uZW50UGF0aCgpIHsKLQkJcmV0dXJuIG5ldyBDb21wb25lbnRBZGRyZXNzKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRyZWUuY29tcG9uZW50cy5JVHJlZUNvbXBvbmVudCNnZXRUcmVlUm93U291cmNlKCkKLQkgKi8KLQlwdWJsaWMgSVRyZWVSb3dTb3VyY2UgZ2V0VHJlZVJvd1NvdXJjZSgpIHsKLQkJVHJlZVRhYmxlRGF0YVZpZXcgb2JqVHJlZURhdGFWaWV3ID0gKFRyZWVUYWJsZURhdGFWaWV3KWdldENvbXBvbmVudCgidHJlZVRhYmxlRGF0YVZpZXciKTsKLQkJcmV0dXJuIG9ialRyZWVEYXRhVmlldzsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdHJlZS9jb21wb25lbnRzL3RhYmxlL1RyZWVUYWJsZS5qd2MgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdHJlZS9jb21wb25lbnRzL3RhYmxlL1RyZWVUYWJsZS5qd2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4YjQyODUuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RyZWUvY29tcG9uZW50cy90YWJsZS9UcmVlVGFibGUuandjCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICAKLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08IS0tICAkSWQkIC0tPgotPCFET0NUWVBFIGNvbXBvbmVudC1zcGVjaWZpY2F0aW9uIFBVQkxJQyAKLSAgIi0vL0FwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLy9UYXBlc3RyeSBTcGVjaWZpY2F0aW9uIDMuMC8vRU4iIAotICAiaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy90YXBlc3RyeS9kdGQvVGFwZXN0cnlfM18wLmR0ZCI+Ci0KLTxjb21wb25lbnQtc3BlY2lmaWNhdGlvbiBjbGFzcz0ib3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRyZWUuY29tcG9uZW50cy50YWJsZS5UcmVlVGFibGUiCi0gICAgYWxsb3ctYm9keT0ieWVzIiBhbGxvdy1pbmZvcm1hbC1wYXJhbWV0ZXJzPSJ5ZXMiPgotCi0gICAgPHBhcmFtZXRlciBuYW1lPSJzZXNzaW9uU3RhdGVNYW5hZ2VyIgotICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudHJlZS5tb2RlbC5JVHJlZVNlc3Npb25TdGF0ZU1hbmFnZXIiCi0gICAgICAgIGRpcmVjdGlvbj0iY3VzdG9tIiByZXF1aXJlZD0ibm8iLz4KLQotICAgIDxwYXJhbWV0ZXIgbmFtZT0ic2Vzc2lvblN0b3JlTWFuYWdlciIKLSAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRyZWUubW9kZWwuSVNlc3Npb25TdG9yZU1hbmFnZXIiCi0gICAgICAgIGRpcmVjdGlvbj0iY3VzdG9tIiByZXF1aXJlZD0ibm8iLz4KLQotICAgIDxwYXJhbWV0ZXIgbmFtZT0idHJlZU1vZGVsIgotICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudHJlZS5tb2RlbC5JVHJlZU1vZGVsIgotICAgICAgICBkaXJlY3Rpb249ImN1c3RvbSIgcmVxdWlyZWQ9InllcyI+Ci0gICAgPC9wYXJhbWV0ZXI+Ci0KLSAgICA8cGFyYW1ldGVyIG5hbWU9InRyZWVTdGF0ZUxpc3RlbmVyIgotICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudHJlZS5tb2RlbC5JVHJlZVN0YXRlTGlzdGVuZXIiCi0gICAgICAgIGRpcmVjdGlvbj0iY3VzdG9tIiByZXF1aXJlZD0ibm8iPgotICAgIDwvcGFyYW1ldGVyPgotCi0JPHBhcmFtZXRlciBuYW1lPSJlbnRyaWVzUGVyVGFibGVQYWdlIiAKLQkJdHlwZT0iaW50IiAKLQkJcmVxdWlyZWQ9Im5vIgotCQlkaXJlY3Rpb249ImN1c3RvbSIvPgotCi0gICAgPHBhcmFtZXRlciBuYW1lPSJub2RlVmlld0NvbXBvbmVudEFkZHJlc3MiCi0gICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLnRhcGVzdHJ5LnV0aWwuQ29tcG9uZW50QWRkcmVzcyIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJubyIgZGlyZWN0aW9uPSJjdXN0b20iLz4KLQotICAgIDxwYXJhbWV0ZXIgbmFtZT0idGFibGVDb2x1bm1zIgotICAgICAgICAgICAgICAgdHlwZT0iamF2YS51dGlsLkFycmF5TGlzdCIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJubyIgZGlyZWN0aW9uPSJjdXN0b20iLz4KLQotICAgIDxjb21wb25lbnQgaWQ9InRyZWVWaWV3IiB0eXBlPSJUcmVlVmlldyI+Ci0gICAgICAgIDxpbmhlcml0ZWQtYmluZGluZyBuYW1lPSJzZXNzaW9uU3RhdGVNYW5hZ2VyIiBwYXJhbWV0ZXItbmFtZT0ic2Vzc2lvblN0YXRlTWFuYWdlciIvPgotICAgICAgICA8aW5oZXJpdGVkLWJpbmRpbmcgbmFtZT0ic2Vzc2lvblN0b3JlTWFuYWdlciIgcGFyYW1ldGVyLW5hbWU9InNlc3Npb25TdG9yZU1hbmFnZXIiLz4KLSAgICAgICAgPGluaGVyaXRlZC1iaW5kaW5nIG5hbWU9InRyZWVNb2RlbCIgcGFyYW1ldGVyLW5hbWU9InRyZWVNb2RlbCIvPgotICAgICAgICA8aW5oZXJpdGVkLWJpbmRpbmcgbmFtZT0idHJlZVN0YXRlTGlzdGVuZXIiIHBhcmFtZXRlci1uYW1lPSJ0cmVlU3RhdGVMaXN0ZW5lciIvPgotICAgIDwvY29tcG9uZW50PgotCi0gICAgPGNvbXBvbmVudCBpZD0idHJlZVRhYmxlRGF0YVZpZXciIHR5cGU9IlRyZWVUYWJsZURhdGFWaWV3Ij4KLSAgICAgICAgPGJpbmRpbmcgbmFtZT0idHJlZVZpZXciIGV4cHJlc3Npb249J2NvbXBvbmVudHMudHJlZVZpZXcnLz4KLSAgICAgICAgPGluaGVyaXRlZC1iaW5kaW5nIG5hbWU9Im5vZGVWaWV3Q29tcG9uZW50QWRkcmVzcyIgcGFyYW1ldGVyLW5hbWU9Im5vZGVWaWV3Q29tcG9uZW50QWRkcmVzcyIvPgotICAgICAgICA8aW5oZXJpdGVkLWJpbmRpbmcgbmFtZT0iZW50cmllc1BlclRhYmxlUGFnZSIgcGFyYW1ldGVyLW5hbWU9ImVudHJpZXNQZXJUYWJsZVBhZ2UiLz4KLSAgICAgICAgPGluaGVyaXRlZC1iaW5kaW5nIG5hbWU9InRhYmxlQ29sdW5tcyIgcGFyYW1ldGVyLW5hbWU9InRhYmxlQ29sdW5tcyIvPgotICAgIDwvY29tcG9uZW50PgotCi08L2NvbXBvbmVudC1zcGVjaWZpY2F0aW9uPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90cmVlL2NvbXBvbmVudHMvdGFibGUvVHJlZVRhYmxlQ29sdW1uLmphdmEgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdHJlZS9jb21wb25lbnRzL3RhYmxlL1RyZWVUYWJsZUNvbHVtbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzkwZWVjLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90cmVlL2NvbXBvbmVudHMvdGFibGUvVHJlZVRhYmxlQ29sdW1uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRyZWUuY29tcG9uZW50cy50YWJsZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlbmRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZXF1ZXN0Q3ljbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsLklUYWJsZU1vZGVsU291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5tb2RlbC5zaW1wbGUuU2ltcGxlVGFibGVDb2x1bW47Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS51dGlsLkNvbXBvbmVudEFkZHJlc3M7Ci0KLS8qKgotICogQGF1dGhvciBjZWNvCi0gKiBAdmVyc2lvbiAkSWQkCi0gKi8KLXB1YmxpYyBjbGFzcyBUcmVlVGFibGVDb2x1bW4gZXh0ZW5kcyBTaW1wbGVUYWJsZUNvbHVtbiB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYXJnMAotCSAqIEBwYXJhbSBhcmcxCi0JICovCi0JcHVibGljIFRyZWVUYWJsZUNvbHVtbihTdHJpbmcgYXJnMCwgYm9vbGVhbiBhcmcxLCBDb21wb25lbnRBZGRyZXNzIG9iakNvbXBvbmVudEFkZHJlc3MpIHsKLQkJc3VwZXIoYXJnMCwgYXJnMSk7Ci0JCXNldFZhbHVlUmVuZGVyZXJTb3VyY2UobmV3IFRyZWVUYWJsZVZhbHVlUmVuZGVyU291cmNlKG9iakNvbXBvbmVudEFkZHJlc3MpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5tb2RlbC5jb21tb24uQWJzdHJhY3RUYWJsZUNvbHVtbiNnZXRWYWx1ZVJlbmRlcmVyKG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlcXVlc3RDeWNsZSwgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsLklUYWJsZU1vZGVsU291cmNlLCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBJUmVuZGVyIGdldFZhbHVlUmVuZGVyZXIoSVJlcXVlc3RDeWNsZSBhcmcwLCBJVGFibGVNb2RlbFNvdXJjZSBhcmcxLCBPYmplY3QgYXJnMikgewotCQlyZXR1cm4gc3VwZXIuZ2V0VmFsdWVSZW5kZXJlcihhcmcwLCBhcmcxLCBhcmcyKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90cmVlL2NvbXBvbmVudHMvdGFibGUvVHJlZVRhYmxlRGF0YVZpZXcuaHRtbCBiL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90cmVlL2NvbXBvbmVudHMvdGFibGUvVHJlZVRhYmxlRGF0YVZpZXcuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWVmZDdhZi4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdHJlZS9jb21wb25lbnRzL3RhYmxlL1RyZWVUYWJsZURhdGFWaWV3Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTwhLS0gZ2VuZXJhdGVkIGJ5IFNwaW5kbGUsIGh0dHA6Ly9zcGluZGxlLnNvdXJjZWZvcmdlLm5ldCAtLT4KLQotPHNwYW4gandjaWQ9IiRjb250ZW50JCI+Ci0JPHNwYW4gandjaWQ9InRhYmxlIi8+Ci08L3NwYW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RyZWUvY29tcG9uZW50cy90YWJsZS9UcmVlVGFibGVEYXRhVmlldy5qYXZhIGIvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RyZWUvY29tcG9uZW50cy90YWJsZS9UcmVlVGFibGVEYXRhVmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzkzZmZkLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90cmVlL2NvbXBvbmVudHMvdGFibGUvVHJlZVRhYmxlRGF0YVZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMCArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRyZWUuY29tcG9uZW50cy50YWJsZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5CYXNlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUJpbmRpbmc7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JTWFya3VwV3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlcXVlc3RDeWNsZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuSVRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5tb2RlbC5JVGFibGVNb2RlbDsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuSVRhYmxlU2Vzc2lvblN0YXRlTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuc2ltcGxlLlNpbXBsZUxpc3RUYWJsZURhdGFNb2RlbDsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuc2ltcGxlLlNpbXBsZVRhYmxlQ29sdW1uTW9kZWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsLnNpbXBsZS5TaW1wbGVUYWJsZU1vZGVsOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5tb2RlbC5zaW1wbGUuU2ltcGxlVGFibGVTZXNzaW9uU3RhdGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50cmVlLm1vZGVsLklUcmVlRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50cmVlLm1vZGVsLklUcmVlTW9kZWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRyZWUubW9kZWwuSVRyZWVNb2RlbFNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudHJlZS5tb2RlbC5JVHJlZVJvd1NvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudHJlZS5tb2RlbC5UcmVlUm93T2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuZXZlbnQuUGFnZURldGFjaExpc3RlbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuZXZlbnQuUGFnZUV2ZW50OwotCi0vKioKLSAqIEB2ZXJzaW9uICRJZCQKLSAqLwotcHVibGljIGNsYXNzIFRyZWVUYWJsZURhdGFWaWV3IGV4dGVuZHMgQmFzZUNvbXBvbmVudCBpbXBsZW1lbnRzIElUcmVlUm93U291cmNlLCBQYWdlRGV0YWNoTGlzdGVuZXJ7Ci0gICAgcHJpdmF0ZSBpbnQgbV9uVHJlZURlZXAgPSAtMTsKLQlwcml2YXRlIFRyZWVSb3dPYmplY3QgbV9vYmpUcmVlUm93T2JqZWN0ID0gbnVsbDsKLQlwcml2YXRlIEFycmF5TGlzdCBtX2FyckFsbEV4cGFuZGVkTm9kZXMgPSBudWxsOwotCi0gICAgcHVibGljIFRyZWVUYWJsZURhdGFWaWV3KCl7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIGluaXRpYWxpemUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKCl7Ci0gICAgICAgIG1fblRyZWVEZWVwID0gLTE7Ci0vLwkJbV9vYmpUYWJsZU1vZGVsID0gbnVsbDsKLQkJbV9vYmpUcmVlUm93T2JqZWN0ID0gbnVsbDsKLQkJbV9hcnJBbGxFeHBhbmRlZE5vZGVzID0gbnVsbDsKLSAgICB9Ci0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmFwYWNoZS50YXBlc3RyeS5BYnN0cmFjdENvbXBvbmVudCNmaW5pc2hMb2FkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaW5pc2hMb2FkKCkgewotCQlzdXBlci5maW5pc2hMb2FkKCk7Ci0JCWdldFBhZ2UoKS5hZGRQYWdlRGV0YWNoTGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmV2ZW50LlBhZ2VEZXRhY2hMaXN0ZW5lciNwYWdlRGV0YWNoZWQob3JnLmFwYWNoZS50YXBlc3RyeS5ldmVudC5QYWdlRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgcGFnZURldGFjaGVkKFBhZ2VFdmVudCBhcmcwKSB7Ci0JCWluaXRpYWxpemUoKTsKLQl9Ci0KLQotICAgIHB1YmxpYyBJVHJlZU1vZGVsU291cmNlIGdldFRyZWVNb2RlbFNvdXJjZSgpIHsKLQkJSVRyZWVNb2RlbFNvdXJjZSBvYmpTb3VyY2UgPSAoSVRyZWVNb2RlbFNvdXJjZSkgZ2V0UGFnZSgpLmdldFJlcXVlc3RDeWNsZSgpLmdldEF0dHJpYnV0ZShJVHJlZU1vZGVsU291cmNlLlRSRUVfTU9ERUxfU09VUkNFX0FUVFJJQlVURSk7Ci0gICAgCWlmKG9ialNvdXJjZSA9PSBudWxsKXsKLQkJCW9ialNvdXJjZSA9IChJVHJlZU1vZGVsU291cmNlKSBnZXRCaW5kaW5nKCJ0cmVlVmlldyIpLmdldE9iamVjdCgpOwotICAgIAl9Ci0gICAgCXJldHVybiBvYmpTb3VyY2U7Ci0gICAgfQotCi0gICAgcHVibGljIEFycmF5TGlzdCBnZW5lcmF0ZU5vZGVMaXN0KCkgewotICAgICAgICBpZihtX2FyckFsbEV4cGFuZGVkTm9kZXMgPT0gbnVsbCl7Ci0JICAgICAgICAvLyByZW5kZXIgZGF0YQotCQkJSVRyZWVNb2RlbFNvdXJjZSBvYmpUcmVlTW9kZWxTb3VyY2UgPSBnZXRUcmVlTW9kZWxTb3VyY2UoKTsKLQkgICAgICAgIElUcmVlTW9kZWwgb2JqVHJlZU1vZGVsID0gb2JqVHJlZU1vZGVsU291cmNlLmdldFRyZWVNb2RlbCgpOwotCSAgICAgICAgSVRyZWVEYXRhTW9kZWwgb2JqVHJlZURhdGFNb2RlbCA9IG9ialRyZWVNb2RlbC5nZXRUcmVlRGF0YU1vZGVsKCk7Ci0JICAgICAgICBPYmplY3Qgb2JqVmFsdWUgPSBvYmpUcmVlRGF0YU1vZGVsLmdldFJvb3QoKTsKLQkgICAgICAgIE9iamVjdCBvYmpWYWx1ZVVJRCA9IG9ialRyZWVEYXRhTW9kZWwuZ2V0VW5pcXVlS2V5KG9ialZhbHVlLCBudWxsKTsKLQkKLQkgICAgICAgIC8vIE9iamVjdCBvYmpTZWxlY3RlZE5vZGUgPSBvYmpUcmVlTW9kZWwuZ2V0VHJlZVN0YXRlTW9kZWwoKS5nZXRTZWxlY3RlZE5vZGUoKTsKLQkgICAgICAgIC8vaWYob2JqU2VsZWN0ZWROb2RlID09IG51bGwpCi0JICAgICAgICAvLyAgb2JqVHJlZU1vZGVsLmdldFRyZWVTdGF0ZU1vZGVsKCkuZXhwYW5kKG9ialZhbHVlVUlEKTsKLQkJCUFycmF5TGlzdCBhcnJBbGxFeHBhbmRlZE5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJd2Fsa1RyZWUoYXJyQWxsRXhwYW5kZWROb2Rlcywgb2JqVmFsdWUsIG9ialZhbHVlVUlELCAwLCBvYmpUcmVlTW9kZWwpOwotCQkJbV9hcnJBbGxFeHBhbmRlZE5vZGVzID0gYXJyQWxsRXhwYW5kZWROb2RlczsKLQkJfQotCQkKLQkJCi0JCXJldHVybiBtX2FyckFsbEV4cGFuZGVkTm9kZXM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd2Fsa1RyZWUoQXJyYXlMaXN0IGFyckFsbEV4cGFuZGVkTm9kZXMsIE9iamVjdCBvYmpQYXJlbnQsIE9iamVjdCBvYmpQYXJlbnRVSUQsIGludCBuRGVwdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgSVRyZWVNb2RlbCBvYmpUcmVlTW9kZWwpIHsKLSAgICAgICAgbV9uVHJlZURlZXAgPSBuRGVwdGg7Ci0KLQkJVHJlZVJvd09iamVjdCBvYmpUcmVlUm93T2JqZWN0ID0gbmV3IFRyZWVSb3dPYmplY3Qob2JqUGFyZW50LCBvYmpQYXJlbnRVSUQsIG5EZXB0aCk7Ci0JCWFyckFsbEV4cGFuZGVkTm9kZXMuYWRkKG9ialRyZWVSb3dPYmplY3QpOwotCi0gICAgICAgIGJvb2xlYW4gYkNvbnRhaW4gPSBvYmpUcmVlTW9kZWwuZ2V0VHJlZVN0YXRlTW9kZWwoKS5pc1VuaXF1ZUtleUV4cGFuZGVkKG9ialBhcmVudFVJRCk7Ci0gICAgICAgIGlmIChiQ29udGFpbikgewotCQkJSXRlcmF0b3IgY29sQ2hpbGRyZW4gPSBvYmpUcmVlTW9kZWwuZ2V0VHJlZURhdGFNb2RlbCgpLmdldENoaWxkcmVuKG9ialBhcmVudCk7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb2xDaGlsZHJlbjsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IG9iakNoaWxkID0gaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IG9iakNoaWxkVUlEID0gb2JqVHJlZU1vZGVsLmdldFRyZWVEYXRhTW9kZWwoKS5nZXRVbmlxdWVLZXkob2JqQ2hpbGQsIG9ialBhcmVudFVJRCk7Ci0gICAgICAgICAgICAgICAgd2Fsa1RyZWUoYXJyQWxsRXhwYW5kZWROb2Rlcywgb2JqQ2hpbGQsIG9iakNoaWxkVUlELCBuRGVwdGgrMSwgb2JqVHJlZU1vZGVsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHRyZWVEZWVwLgotICAgICAqIEByZXR1cm4gaW50Ci0gICAgICovCi0gICAgcHVibGljIGludCBnZXRUcmVlRGVlcCgpIHsKLSAgICAgICAgcmV0dXJuIG1fblRyZWVEZWVwOwotICAgIH0KLQotLyoJcHVibGljIElUYWJsZU1vZGVsIGdldFRhYmxlTW9kZWwoKSB7Ci0JCWlmKG1fb2JqVGFibGVNb2RlbCA9PSBudWxsKXsKLQkJCW1fb2JqVGFibGVNb2RlbCA9IGNyZWF0ZVRhYmxlTW9kZWwoKTsKLQkJfQotCQlyZXR1cm4gbV9vYmpUYWJsZU1vZGVsOwotCX0KLSovCi0JcHVibGljIElUYWJsZU1vZGVsIGdldFRhYmxlTW9kZWwoKSB7Ci0JCXJldHVybiBjcmVhdGVUYWJsZU1vZGVsKCk7Ci0JfQotCi0JcHJpdmF0ZSBJVGFibGVNb2RlbCBjcmVhdGVUYWJsZU1vZGVsKCl7Ci0JCUFycmF5TGlzdCBhcnJBbGxOb2RlcyA9IGdlbmVyYXRlTm9kZUxpc3QoKTsKLQkJT2JqZWN0W10gYXJyQWxsRXhwYW5kZWROb2RlcyA9IG5ldyBPYmplY3RbYXJyQWxsTm9kZXMuc2l6ZSgpXTsKLQkJYXJyQWxsTm9kZXMudG9BcnJheShhcnJBbGxFeHBhbmRlZE5vZGVzKTsKLQotCQkKLQkJU2ltcGxlVGFibGVNb2RlbCBvYmpUYWJsZU1vZGVsID0gbmV3IFNpbXBsZVRhYmxlTW9kZWwoYXJyQWxsRXhwYW5kZWROb2RlcywgZ2V0VGFibGVDb2x1bm1zKCkpOwotCQlvYmpUYWJsZU1vZGVsLmdldFBhZ2luZ1N0YXRlKCkuc2V0UGFnZVNpemUoZ2V0RW50cmllc1BlclRhYmxlUGFnZSgpKTsJCQotCQkKLQkJcmV0dXJuIG9ialRhYmxlTW9kZWw7Ci0JfQotCi0JcHVibGljIElUYWJsZUNvbHVtbltdIGdldFRhYmxlQ29sdW5tcygpewotCQlBcnJheUxpc3QgYXJyQ29sdW1uc0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWFyckNvbHVtbnNMaXN0LmFkZChuZXcgVHJlZVRhYmxlQ29sdW1uICgiTmFtZSIsIGZhbHNlLCBudWxsKSk7IAotCi0JCUFycmF5TGlzdCBhcnJUYWJsZUNvbHVubXMgPSBnZXRUYWJsZUNvbHVubXNGcm9tQmluZGluZygpOwotCQlpZihhcnJUYWJsZUNvbHVubXMgIT0gbnVsbCkKLQkJCWFyckNvbHVtbnNMaXN0LmFkZEFsbChhcnJUYWJsZUNvbHVubXMpOwotCQkKLQkJSVRhYmxlQ29sdW1uW10gYXJyQ29sdW1ucyA9IG5ldyBJVGFibGVDb2x1bW5bYXJyQ29sdW1uc0xpc3Quc2l6ZSgpXTsKLQkJYXJyQ29sdW1uc0xpc3QudG9BcnJheShhcnJDb2x1bW5zKTsKLQotCQlyZXR1cm4gYXJyQ29sdW1uczsKLQl9Ci0KLQlwdWJsaWMgQXJyYXlMaXN0IGdldFRhYmxlQ29sdW5tc0Zyb21CaW5kaW5nKCl7Ci0JCUlCaW5kaW5nIG9iakJpbmRpbmcgPSBnZXRCaW5kaW5nKCJ0YWJsZUNvbHVubXMiKTsKLQkJaWYob2JqQmluZGluZyAhPSBudWxsKQotCQkJcmV0dXJuIChBcnJheUxpc3Qpb2JqQmluZGluZy5nZXRPYmplY3QoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBpbnQgZ2V0RW50cmllc1BlclRhYmxlUGFnZSgpewotCQlJQmluZGluZyBvYmpCaW5kaW5nID0gZ2V0QmluZGluZygiZW50cmllc1BlclRhYmxlUGFnZSIpOwotCQlpZihvYmpCaW5kaW5nICE9IG51bGwpCi0JCQlyZXR1cm4gb2JqQmluZGluZy5nZXRJbnQoKTsKLQkJcmV0dXJuIDUwOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRyZWUubW9kZWwuSVRyZWVSb3dTb3VyY2UjZ2V0VHJlZVJvdygpCi0JICovCi0JcHVibGljIFRyZWVSb3dPYmplY3QgZ2V0VHJlZVJvdygpIHsKLQkJcmV0dXJuIGdldFRyZWVSb3dPYmplY3QoKTsKLQl9Ci0KLQlwdWJsaWMgSVRhYmxlU2Vzc2lvblN0YXRlTWFuYWdlciBnZXRUYWJsZVNlc3Npb25TdGF0ZU1hbmFnZXIoKXsKLQkJU2ltcGxlTGlzdFRhYmxlRGF0YU1vZGVsIG9iakRhdGFNb2RlbCA9IG5ldyBTaW1wbGVMaXN0VGFibGVEYXRhTW9kZWwoZ2VuZXJhdGVOb2RlTGlzdCgpKTsKLQkJU2ltcGxlVGFibGVDb2x1bW5Nb2RlbCBvYmpDb2x1bW5Nb2RlbCA9IG5ldyBTaW1wbGVUYWJsZUNvbHVtbk1vZGVsKGdldFRhYmxlQ29sdW5tcygpKTsKLQkJU2ltcGxlVGFibGVTZXNzaW9uU3RhdGVNYW5hZ2VyIG9ialN0YXRlTWFuYWdlciA9IG5ldyBTaW1wbGVUYWJsZVNlc3Npb25TdGF0ZU1hbmFnZXIob2JqRGF0YU1vZGVsLCBvYmpDb2x1bW5Nb2RlbCk7Ci0JCXJldHVybiBvYmpTdGF0ZU1hbmFnZXI7Ci0JCS8vcmV0dXJuIE51bGxUYWJsZVNlc3Npb25TdGF0ZU1hbmFnZXIuTlVMTF9TVEFURV9NQU5BR0VSOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmFwYWNoZS50YXBlc3RyeS5CYXNlQ29tcG9uZW50I3JlbmRlckNvbXBvbmVudChvcmcuYXBhY2hlLnRhcGVzdHJ5LklNYXJrdXBXcml0ZXIsIG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlcXVlc3RDeWNsZSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW5kZXJDb21wb25lbnQoSU1hcmt1cFdyaXRlciBhcmcwLCBJUmVxdWVzdEN5Y2xlIGN5Y2xlKSB7Ci0JCU9iamVjdCBvYmpFeGlzdGVkVHJlZU1vZGVsU291cmNlID0gY3ljbGUuZ2V0QXR0cmlidXRlKElUcmVlUm93U291cmNlLlRSRUVfUk9XX1NPVVJDRV9BVFRSSUJVVEUpOwotCQljeWNsZS5zZXRBdHRyaWJ1dGUoSVRyZWVSb3dTb3VyY2UuVFJFRV9ST1dfU09VUkNFX0FUVFJJQlVURSwgdGhpcyk7Ci0KLQkJc3VwZXIucmVuZGVyQ29tcG9uZW50KGFyZzAsIGN5Y2xlKTsKLQotCQljeWNsZS5zZXRBdHRyaWJ1dGUoSVRyZWVSb3dTb3VyY2UuVFJFRV9ST1dfU09VUkNFX0FUVFJJQlVURSwgb2JqRXhpc3RlZFRyZWVNb2RlbFNvdXJjZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LkFic3RyYWN0Q29tcG9uZW50I3JlbmRlckJvZHkob3JnLmFwYWNoZS50YXBlc3RyeS5JTWFya3VwV3JpdGVyLCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZXF1ZXN0Q3ljbGUpCi0JICovCi0JcHVibGljIHZvaWQgcmVuZGVyQm9keShJTWFya3VwV3JpdGVyIGFyZzAsIElSZXF1ZXN0Q3ljbGUgY3ljbGUpIHsKLQkJT2JqZWN0IG9iakV4aXN0ZWRUcmVlTW9kZWxTb3VyY2UgPSBjeWNsZS5nZXRBdHRyaWJ1dGUoSVRyZWVSb3dTb3VyY2UuVFJFRV9ST1dfU09VUkNFX0FUVFJJQlVURSk7Ci0JCWN5Y2xlLnNldEF0dHJpYnV0ZShJVHJlZVJvd1NvdXJjZS5UUkVFX1JPV19TT1VSQ0VfQVRUUklCVVRFLCB0aGlzKTsKLQotCQlzdXBlci5yZW5kZXJCb2R5KGFyZzAsIGN5Y2xlKTsKLQotCQljeWNsZS5zZXRBdHRyaWJ1dGUoSVRyZWVSb3dTb3VyY2UuVFJFRV9ST1dfU09VUkNFX0FUVFJJQlVURSwgb2JqRXhpc3RlZFRyZWVNb2RlbFNvdXJjZSk7Ci0JfQotCi0KLQlwdWJsaWMgVHJlZVJvd09iamVjdCBnZXRUcmVlUm93T2JqZWN0KCkgewotCQlyZXR1cm4gbV9vYmpUcmVlUm93T2JqZWN0OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRyZWVSb3dPYmplY3QoVHJlZVJvd09iamVjdCBvYmplY3QpIHsKLQkJbV9vYmpUcmVlUm93T2JqZWN0ID0gb2JqZWN0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RyZWUvY29tcG9uZW50cy90YWJsZS9UcmVlVGFibGVEYXRhVmlldy5qd2MgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdHJlZS9jb21wb25lbnRzL3RhYmxlL1RyZWVUYWJsZURhdGFWaWV3Lmp3YwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFkMmUyMC4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdHJlZS9jb21wb25lbnRzL3RhYmxlL1RyZWVUYWJsZURhdGFWaWV3Lmp3YworKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAgCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPCEtLSAgJElkJCAtLT4KLTwhRE9DVFlQRSBjb21wb25lbnQtc3BlY2lmaWNhdGlvbiBQVUJMSUMgCi0gICItLy9BcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi8vVGFwZXN0cnkgU3BlY2lmaWNhdGlvbiAzLjAvL0VOIiAKLSAgImh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvdGFwZXN0cnkvZHRkL1RhcGVzdHJ5XzNfMC5kdGQiPgotCi08Y29tcG9uZW50LXNwZWNpZmljYXRpb24gY2xhc3M9Im9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50cmVlLmNvbXBvbmVudHMudGFibGUuVHJlZVRhYmxlRGF0YVZpZXciCi0gICAgYWxsb3ctYm9keT0ieWVzIiBhbGxvdy1pbmZvcm1hbC1wYXJhbWV0ZXJzPSJ5ZXMiPgotCi0gICAgPHBhcmFtZXRlciBuYW1lPSJ0cmVlVmlldyIKLSAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50cmVlLmNvbXBvbmVudHMuVHJlZVZpZXciCi0gICAgICAgICAgICAgICByZXF1aXJlZD0ibm8iIGRpcmVjdGlvbj0iY3VzdG9tIi8+Ci0KLSAgICA8cGFyYW1ldGVyIG5hbWU9Im5vZGVWaWV3Q29tcG9uZW50QWRkcmVzcyIKLSAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUudGFwZXN0cnkudXRpbC5Db21wb25lbnRBZGRyZXNzIgotICAgICAgICAgICAgICAgcmVxdWlyZWQ9Im5vIiBkaXJlY3Rpb249ImN1c3RvbSIvPgotCi0JPHBhcmFtZXRlciBuYW1lPSJlbnRyaWVzUGVyVGFibGVQYWdlIiAKLQkJdHlwZT0iaW50IiAKLQkJcmVxdWlyZWQ9Im5vIgotCQlkaXJlY3Rpb249ImN1c3RvbSIvPgotCi0gICAgPHBhcmFtZXRlciBuYW1lPSJ0YWJsZUNvbHVubXMiCi0gICAgICAgICAgICAgICB0eXBlPSJqYXZhLnV0aWwuQXJyYXlMaXN0IgotICAgICAgICAgICAgICAgcmVxdWlyZWQ9Im5vIiBkaXJlY3Rpb249ImN1c3RvbSIvPgotCi0gICAgPGJlYW4gbmFtZT0idGFibGVDbGFzcyIgY2xhc3M9Im9yZy5hcGFjaGUudGFwZXN0cnkuYmVhbi5FdmVuT2RkIiBsaWZlY3ljbGU9InJlcXVlc3QiLz4KLQotCTxjb21wb25lbnQgaWQ9InRhYmxlIiB0eXBlPSJUYWJsZSI+Ci0JCTxiaW5kaW5nIG5hbWU9InRhYmxlTW9kZWwiIGV4cHJlc3Npb249InRhYmxlTW9kZWwiLz4KLQkJPGJpbmRpbmcgbmFtZT0idGFibGVTZXNzaW9uU3RhdGVNYW5hZ2VyIiBleHByZXNzaW9uPSJ0YWJsZVNlc3Npb25TdGF0ZU1hbmFnZXIiLz4KLQkJPGJpbmRpbmcgbmFtZT0icm93IiBleHByZXNzaW9uPSJ0cmVlUm93T2JqZWN0Ii8+Ci0gICAgICAgIDxiaW5kaW5nIG5hbWU9InJvd3NDbGFzcyIgZXhwcmVzc2lvbj0nYmVhbnMudGFibGVDbGFzcy5uZXh0Jy8+Ci0JPC9jb21wb25lbnQ+Ci0KLTwvY29tcG9uZW50LXNwZWNpZmljYXRpb24+CmRpZmYgLS1naXQgYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdHJlZS9jb21wb25lbnRzL3RhYmxlL1RyZWVUYWJsZU5vZGVWaWV3RGVsZWdhdG9yLmh0bWwgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdHJlZS9jb21wb25lbnRzL3RhYmxlL1RyZWVUYWJsZU5vZGVWaWV3RGVsZWdhdG9yLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4NjhiNWEuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RyZWUvY29tcG9uZW50cy90YWJsZS9UcmVlVGFibGVOb2RlVmlld0RlbGVnYXRvci5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi08c3BhbiBqd2NpZD0iJGNvbnRlbnQkIj4KLQk8c3BhbiBqd2NpZD0idHJlZU5vZGVWaWV3Ii8+Ci08L3NwYW4+CQkKZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90cmVlL2NvbXBvbmVudHMvdGFibGUvVHJlZVRhYmxlTm9kZVZpZXdEZWxlZ2F0b3IuamF2YSBiL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90cmVlL2NvbXBvbmVudHMvdGFibGUvVHJlZVRhYmxlTm9kZVZpZXdEZWxlZ2F0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM4ZTUwYy4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdHJlZS9jb21wb25lbnRzL3RhYmxlL1RyZWVUYWJsZU5vZGVWaWV3RGVsZWdhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRyZWUuY29tcG9uZW50cy50YWJsZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuQmFzZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZXF1ZXN0Q3ljbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsLklUYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuSVRhYmxlTW9kZWxTb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsLklUYWJsZVJlbmRlcmVyTGlzdGVuZXI7Ci0KLS8qKgotICogQGF1dGhvciBjZWNvCi0gKiBAdmVyc2lvbiAkSWQkCi0gKi8KLXB1YmxpYyBjbGFzcyBUcmVlVGFibGVOb2RlVmlld0RlbGVnYXRvciBleHRlbmRzIEJhc2VDb21wb25lbnQgaW1wbGVtZW50cyBJVGFibGVSZW5kZXJlckxpc3RlbmVyewotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFRyZWVUYWJsZU5vZGVWaWV3RGVsZWdhdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsLklUYWJsZVJlbmRlcmVyTGlzdGVuZXIjaW5pdGlhbGl6ZVJlbmRlcmVyKG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlcXVlc3RDeWNsZSwgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsLklUYWJsZU1vZGVsU291cmNlLCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuSVRhYmxlQ29sdW1uLCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVSZW5kZXJlcigKLQkJSVJlcXVlc3RDeWNsZSBhcmcwLAotCQlJVGFibGVNb2RlbFNvdXJjZSBhcmcxLAotCQlJVGFibGVDb2x1bW4gYXJnMiwKLQkJT2JqZWN0IGFyZzMpIHsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90cmVlL2NvbXBvbmVudHMvdGFibGUvVHJlZVRhYmxlTm9kZVZpZXdEZWxlZ2F0b3IuandjIGIvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RyZWUvY29tcG9uZW50cy90YWJsZS9UcmVlVGFibGVOb2RlVmlld0RlbGVnYXRvci5qd2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViNTVkYjcuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RyZWUvY29tcG9uZW50cy90YWJsZS9UcmVlVGFibGVOb2RlVmlld0RlbGVnYXRvci5qd2MKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gIAotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTwhLS0gICRJZCQgLS0+Ci08IURPQ1RZUEUgY29tcG9uZW50LXNwZWNpZmljYXRpb24gUFVCTElDIAotICAiLS8vQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24vL1RhcGVzdHJ5IFNwZWNpZmljYXRpb24gMy4wLy9FTiIgCi0gICJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL3RhcGVzdHJ5L2R0ZC9UYXBlc3RyeV8zXzAuZHRkIj4KLQotPGNvbXBvbmVudC1zcGVjaWZpY2F0aW9uIGNsYXNzPSJvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudHJlZS5jb21wb25lbnRzLnRhYmxlLlRyZWVUYWJsZU5vZGVWaWV3RGVsZWdhdG9yIgotICAgIGFsbG93LWJvZHk9InllcyIgYWxsb3ctaW5mb3JtYWwtcGFyYW1ldGVycz0ieWVzIj4KLQotICAgICA8Y29tcG9uZW50IGlkPSJ0cmVlTm9kZVZpZXciIHR5cGU9IlRyZWVOb2RlVmlldyI+Ci0gICAgPC9jb21wb25lbnQ+Ci0KLTwvY29tcG9uZW50LXNwZWNpZmljYXRpb24+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RyZWUvY29tcG9uZW50cy90YWJsZS9UcmVlVGFibGVOb2RlVmlld1BhZ2UuaHRtbCBiL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90cmVlL2NvbXBvbmVudHMvdGFibGUvVHJlZVRhYmxlTm9kZVZpZXdQYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1NTRkZWEuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RyZWUvY29tcG9uZW50cy90YWJsZS9UcmVlVGFibGVOb2RlVmlld1BhZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPCEtLSBnZW5lcmF0ZWQgYnkgU3BpbmRsZSwgaHR0cDovL3NwaW5kbGUuc291cmNlZm9yZ2UubmV0IC0tPgotCi08c3BhbiBqd2NpZD0iJGNvbnRlbnQkIj4KLQk8c3BhbiBqd2NpZD0idHJlZVRhYmxlTm9kZVZpZXdEZWxlZ2F0b3IiLz4KLTwvc3Bhbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdHJlZS9jb21wb25lbnRzL3RhYmxlL1RyZWVUYWJsZU5vZGVWaWV3UGFnZS5wYWdlIGIvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RyZWUvY29tcG9uZW50cy90YWJsZS9UcmVlVGFibGVOb2RlVmlld1BhZ2UucGFnZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU1ZTg2Mi4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdHJlZS9jb21wb25lbnRzL3RhYmxlL1RyZWVUYWJsZU5vZGVWaWV3UGFnZS5wYWdlCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gIAotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTwhLS0gRm9ybXMucGFnZSx2IDEuMSAyMDAyLzA4LzIzIDIyOjE4OjMxIGhzaGlwIEV4cCAtLT4KLTwhRE9DVFlQRSBwYWdlLXNwZWNpZmljYXRpb24gUFVCTElDIAotICAiLS8vQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24vL1RhcGVzdHJ5IFNwZWNpZmljYXRpb24gMy4wLy9FTiIgCi0gICJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL3RhcGVzdHJ5L2R0ZC9UYXBlc3RyeV8zXzAuZHRkIj4KLQotPHBhZ2Utc3BlY2lmaWNhdGlvbj4KLQotICAgIDxjb21wb25lbnQgaWQ9InRyZWVUYWJsZU5vZGVWaWV3RGVsZWdhdG9yIiB0eXBlPSJUcmVlVGFibGVOb2RlVmlld0RlbGVnYXRvciI+Ci0gICAgPC9jb21wb25lbnQ+Ci0KLTwvcGFnZS1zcGVjaWZpY2F0aW9uPgpkaWZmIC0tZ2l0IGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RyZWUvY29tcG9uZW50cy90YWJsZS9UcmVlVGFibGVWYWx1ZVJlbmRlclNvdXJjZS5qYXZhIGIvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RyZWUvY29tcG9uZW50cy90YWJsZS9UcmVlVGFibGVWYWx1ZVJlbmRlclNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDU3MTM4Li4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90cmVlL2NvbXBvbmVudHMvdGFibGUvVHJlZVRhYmxlVmFsdWVSZW5kZXJTb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudHJlZS5jb21wb25lbnRzLnRhYmxlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVuZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlcXVlc3RDeWNsZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuSVRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50YWJsZS5tb2RlbC5JVGFibGVNb2RlbFNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuSVRhYmxlUmVuZGVyZXJTb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRhYmxlLm1vZGVsLmNvbW1vbi5Db21wb25lbnRUYWJsZVJlbmRlcmVyU291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkudXRpbC5Db21wb25lbnRBZGRyZXNzOwotCi0vKioKLSAqIEBhdXRob3IgY2VjbwotICogQHZlcnNpb24gJElkJAotICovCi1wdWJsaWMgY2xhc3MgVHJlZVRhYmxlVmFsdWVSZW5kZXJTb3VyY2UgaW1wbGVtZW50cyBJVGFibGVSZW5kZXJlclNvdXJjZQotewotCi0JcHJpdmF0ZSBDb21wb25lbnRUYWJsZVJlbmRlcmVyU291cmNlIG1fb2JqQ29tcG9uZW50UmVuZGVyZXI7Ci0JcHJpdmF0ZSBDb21wb25lbnRBZGRyZXNzIG1fb2JqQ29tcG9uZW50QWRkcmVzcyA9IG51bGw7Ci0KLQlwdWJsaWMgVHJlZVRhYmxlVmFsdWVSZW5kZXJTb3VyY2UoKQotCXsKLQkJbV9vYmpDb21wb25lbnRSZW5kZXJlciA9IG51bGw7Ci0JfQotCi0JcHVibGljIFRyZWVUYWJsZVZhbHVlUmVuZGVyU291cmNlKENvbXBvbmVudEFkZHJlc3Mgb2JqQ29tcG9uZW50QWRkcmVzcykKLQl7Ci0JCW1fb2JqQ29tcG9uZW50QWRkcmVzcyA9IG9iakNvbXBvbmVudEFkZHJlc3M7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudGFibGUubW9kZWwuSVRhYmxlUmVuZGVyZXJTb3VyY2UjZ2V0UmVuZGVyZXIoSVJlcXVlc3RDeWNsZSwgSVRhYmxlTW9kZWxTb3VyY2UsIElUYWJsZUNvbHVtbiwgT2JqZWN0KQotCSAqLwotCXB1YmxpYyBJUmVuZGVyIGdldFJlbmRlcmVyKAotCQlJUmVxdWVzdEN5Y2xlIG9iakN5Y2xlLAotCQlJVGFibGVNb2RlbFNvdXJjZSBvYmpTb3VyY2UsCi0JCUlUYWJsZUNvbHVtbiBvYmpDb2x1bW4sCi0JCU9iamVjdCBvYmpSb3cpCi0JewotCQkJc3luY2hyb25pemVkICh0aGlzKQotCQkJewotCQkJCWlmIChtX29iakNvbXBvbmVudFJlbmRlcmVyID09IG51bGwpCi0JCQkJewotCQkJCQkKLQkJCQkJQ29tcG9uZW50QWRkcmVzcyBvYmpBZGRyZXNzID0gbV9vYmpDb21wb25lbnRBZGRyZXNzOwotCQkJCQlpZihtX29iakNvbXBvbmVudEFkZHJlc3MgPT0gbnVsbCkKLQkJCQkJCW9iakFkZHJlc3MgPSBuZXcgQ29tcG9uZW50QWRkcmVzcygKLQkJCQkJCQkiY29udHJpYjpUcmVlVGFibGVOb2RlVmlld1BhZ2UiLAotCQkJCQkJCSJ0cmVlVGFibGVOb2RlVmlld0RlbGVnYXRvciIpOwotCQkJCQltX29iakNvbXBvbmVudFJlbmRlcmVyID0KLQkJCQkJCW5ldyBDb21wb25lbnRUYWJsZVJlbmRlcmVyU291cmNlKG9iakFkZHJlc3MpOwotCQkJCX0KLQkJCX0KLQotCQlyZXR1cm4gbV9vYmpDb21wb25lbnRSZW5kZXJlci5nZXRSZW5kZXJlcigKLQkJCW9iakN5Y2xlLAotCQkJb2JqU291cmNlLAotCQkJb2JqQ29sdW1uLAotCQkJb2JqUm93KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90cmVlL21vZGVsL0lNdXRhYmxlVHJlZU5vZGUuamF2YSBiL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90cmVlL21vZGVsL0lNdXRhYmxlVHJlZU5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI3ZWVmNi4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdHJlZS9tb2RlbC9JTXV0YWJsZVRyZWVOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRyZWUubW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotLyoqCi0gKiBEZWZpbmVzIHRoZSByZXF1aXJlbWVudHMgZm9yIGEgdHJlZSBub2RlIG9iamVjdCB0aGF0IGNhbiBjaGFuZ2UgLS0KLSAqIGJ5IGFkZGluZyBvciByZW1vdmluZyBjaGlsZCBub2Rlcywgb3IgYnkgY2hhbmdpbmcgdGhlIGNvbnRlbnRzCi0gKiBvZiBhIHVzZXIgb2JqZWN0IHN0b3JlZCBpbiB0aGUgbm9kZS4KLSAqCi0gKiBAc2VlIGphdmF4LnN3aW5nLnRyZWUuRGVmYXVsdE11dGFibGVUcmVlTm9kZQotICogQHNlZSBqYXZheC5zd2luZy5KVHJlZQotICoKLSAqIEBhdXRob3IgY2VjbwotICogQHZlcnNpb24gJElkJAotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSU11dGFibGVUcmVlTm9kZSBleHRlbmRzIElUcmVlTm9kZQotewotICAgIC8qKgotICAgICAqIEFkZHMgY29sbGVjdGlvbiBvZjxjb2RlPmNoaWxkcmVuPC9jb2RlPiB0byB0aGUgcmVjZWl2ZXIuCi0gICAgICogPGNvZGU+Q2hpbGQ8L2NvZGU+IHdpbGwgYmUgbWVzc2FnZWQgd2l0aCA8Y29kZT5zZXRQYXJlbnQ8L2NvZGU+LgotICAgICAqLwotICAgIHZvaWQgaW5zZXJ0KENvbGxlY3Rpb24gY29sQ2hpbGRyZW4pOwotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyA8Y29kZT5ub2RlPC9jb2RlPiBmcm9tIHRoZSByZWNlaXZlci4gPGNvZGU+c2V0UGFyZW50PC9jb2RlPgotICAgICAqIHdpbGwgYmUgbWVzc2FnZWQgb24gPGNvZGU+bm9kZTwvY29kZT4uCi0gICAgICovCi0gICAgdm9pZCByZW1vdmUoSU11dGFibGVUcmVlTm9kZSBub2RlKTsKLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgdGhlIHJlY2VpdmVyIGZyb20gaXRzIHBhcmVudC4KLSAgICAgKi8KLSAgICB2b2lkIHJlbW92ZUZyb21QYXJlbnQoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHBhcmVudCBvZiB0aGUgcmVjZWl2ZXIgdG8gPGNvZGU+bmV3UGFyZW50PC9jb2RlPi4KLSAgICAgKi8KLSAgICB2b2lkIHNldFBhcmVudChJTXV0YWJsZVRyZWVOb2RlIG5ld1BhcmVudCk7Ci19CmRpZmYgLS1naXQgYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdHJlZS9tb2RlbC9JU2Vzc2lvblN0b3JlTWFuYWdlci5qYXZhIGIvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RyZWUvbW9kZWwvSVNlc3Npb25TdG9yZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI1NjQ0ZC4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdHJlZS9tb2RlbC9JU2Vzc2lvblN0b3JlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50cmVlLm1vZGVsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUGFnZTsKLQotLyoqCi0gKiBAYXV0aG9yIGNlY28KLSAqIEB2ZXJzaW9uICRJZCQKLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElTZXNzaW9uU3RvcmVNYW5hZ2VyIHsKLQlPYmplY3QgZ2V0U2Vzc2lvblN0YXRlKElQYWdlIG9ialBhZ2UsIFN0cmluZyBzdHJTZXNzaW9uU3RhdGVJRCk7Ci0JT2JqZWN0IHNldFNlc3Npb25TdGF0ZShJUGFnZSBvYmpQYWdlLCBTdHJpbmcgc3RyU2Vzc2lvblN0YXRlSUQsIE9iamVjdCBvYmpTZXNzaW9uU3RhdGUpOwotfQpkaWZmIC0tZ2l0IGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RyZWUvbW9kZWwvSVRyZWVEYXRhTW9kZWwuamF2YSBiL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90cmVlL21vZGVsL0lUcmVlRGF0YU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1MjJlYjAuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RyZWUvbW9kZWwvSVRyZWVEYXRhTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudHJlZS5tb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotLyoqCi0gKiBUaGUgaW50ZXJmYWNlIHRoYXQgZGVmaW5lcyBhIHN1aXRhYmxlIGRhdGEgbW9kZWwgZm9yIGEgPGNvZGU+VHJlZVZpZXcgY29tcG9uZW50PC9jb2RlPi4gCi0gKiAKLSAqIEBhdXRob3IgY2VjbwotICogQHZlcnNpb24gJElkJAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElUcmVlRGF0YU1vZGVsCi17Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgcm9vdCBub2RlIG9mIHRoZSB0cmVlCi0JICovCi0JT2JqZWN0IGdldFJvb3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG51bWJlciBvZiBjaGlsZHJlbiBvZiBwYXJlbnQgbm9kZS4KLQkgKiBAcGFyYW0gb2JqUGFyZW50IGlzIHRoZSBwYXJlbnQgb2JqZWN0IHdob3NlIG5yIG9mIGNoaWxkcmVuIGFyZSBzb3VnaHQKLQkgKi8KLQlpbnQgZ2V0Q2hpbGRDb3VudChPYmplY3Qgb2JqUGFyZW50KTsKLQotCS8qKgotCSAqIEdldCBhbiBpdGVyYXRvciB0byB0aGUgQ29sbGVjdGlvbiBvZiBjaGlsZHJlbiBiZWxvbmdpbmcgdG8gdGhlIHBhcmVudCBub2RlIG9iamVjdAotCSAqIEBwYXJhbSBvYmpQYXJlbnQgaXMgdGhlIHBhcmVudCBvYmplY3Qgd2hvc2UgY2hpbGRyZW4gYXJlIHJlcXVlc3RlZAotCSAqLwotCUl0ZXJhdG9yIGdldENoaWxkcmVuKE9iamVjdCBvYmpQYXJlbnQpOwotCi0JLyoqCi0JICogR2V0IHRoZSBhY3R1YWwgbm9kZSBvYmplY3QgYmFzZWQgb24gc29tZSBpZGVudGlmaWVyIChmb3IgZXhhbXBsZSBhbiBVVUlEKQotCSAqIEBwYXJhbSBvYmpVbmlxdWVLZXkgaXMgdGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBub2RlIG9iamVjdCBiZWluZyByZXRyaWV2ZWQKLQkgKiBAcmV0dXJuIHRoZSBpbnN0YW5jZSBvZiB0aGUgbm9kZSBvYmplY3QgaWRlbnRpZmllZCBieSB0aGUga2V5Ci0JICovCi0JT2JqZWN0IGdldE9iamVjdChPYmplY3Qgb2JqVW5pcXVlS2V5KTsKLQotCS8qKiAKLQkgKiBHZXQgdGhlIHVuaXF1ZSBpZGVudGlmaWVyIChVVUlEKSBvZiB0aGUgbm9kZSBvYmplY3Qgd2l0aCBhIGNlcnRhaW4gcGFyZW50IG5vZGUKLQkgKiBAcGFyYW0gb2JqVGFyZ2V0IGlzIHRoZSBPYmplY3Qgd2hvc2UgaWRlbnRpZmllciBpcyByZXF1aXJlZAotCSAqIEBwYXJhbSBvYmpQYXJlbnRVbmlxdWVLZXkgaXMgdGhlIHVuaXF1ZSBpZCBvZiB0aGUgcGFyZW50IG9mIG9ialRhcmdldAotCSAqIEByZXR1cm4gdGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIG9ialRhcmdldAotCSAqLwotCU9iamVjdCBnZXRVbmlxdWVLZXkoT2JqZWN0IG9ialRhcmdldCwgT2JqZWN0IG9ialBhcmVudFVuaXF1ZUtleSk7Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBwYXJlbnQgb2YgYW4gb2JqZWN0Ci0JICogQHBhcmFtIG9iakNoaWxkVW5pcXVlS2V5IGlzIHRoZSBpZGVudGlmaWVyIG9mIHRoZSBPYmplY3QgZm9yIHdoaWNoIHRoZSBwYXJlbnQgaWRlbnRpZmllciBpcyBzb3VnaHQKLQkgKiBAcmV0dXJuIHRoZSBpZGVudGlmaWVyIChwb3NzaWJseSBVVUlEKSBvZiB0aGUgcGFyZW50IG9mIG9iakNoaWxkVW5pcXVlS2V5Ci0JICovCi0JT2JqZWN0IGdldFBhcmVudFVuaXF1ZUtleShPYmplY3Qgb2JqQ2hpbGRVbmlxdWVLZXkpOwotCi0JLyoqCi0JICogQ2hlY2sgdG8gc2VlIChvbiB0aGUgYmFzaXMgb2Ygc29tZSBub2RlIG9iamVjdCBpZGVudGlmaWVyKSB3aGV0aGVyIHRoZSBwYXJlbnQgbm9kZSBpcyBpbmRlZWQgdGhlIHBhcmVudCBvZiB0aGUgb2JqZWN0Ci0JICogQHBhcmFtIG9iakNoaWxkVW5pcXVlS2V5IGlzIHRoZSBpZGVudGlmaWVyIG9mIHRoZSBvYmplY3Qgd2hvc2UgcGFyZW50IGlzIGJlaW5nIGNoZWNrZWQKLQkgKiBAcGFyYW0gb2JqUGFyZW50VW5pcXVlS2V5IGlzIHRoZSBpZGVudGlmaWVyIG9mIHRoZSBwYXJlbnQgd2hpY2ggaXMgdG8gYmUgY2hlY2tlZCBhZ2FpbnN0Ci0JICovCi0JYm9vbGVhbiBpc0FuY2VzdG9yT2YoT2JqZWN0IG9iakNoaWxkVW5pcXVlS2V5LCBPYmplY3Qgb2JqUGFyZW50VW5pcXVlS2V5KTsKLQkKLX0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90cmVlL21vZGVsL0lUcmVlTW9kZWwuamF2YSBiL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90cmVlL21vZGVsL0lUcmVlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ5MDJjZS4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdHJlZS9tb2RlbC9JVHJlZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRyZWUubW9kZWw7Ci0KLS8qKgotICogQGF1dGhvciBjZWNvCi0gKiBAdmVyc2lvbiAkSWQkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVRyZWVNb2RlbCB7Ci0JSVRyZWVEYXRhTW9kZWwgZ2V0VHJlZURhdGFNb2RlbCgpOwotCUlUcmVlU3RhdGVNb2RlbCBnZXRUcmVlU3RhdGVNb2RlbCgpOwotfQpkaWZmIC0tZ2l0IGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RyZWUvbW9kZWwvSVRyZWVNb2RlbFNvdXJjZS5qYXZhIGIvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RyZWUvbW9kZWwvSVRyZWVNb2RlbFNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWM3NTFkLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90cmVlL21vZGVsL0lUcmVlTW9kZWxTb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudHJlZS5tb2RlbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUNvbXBvbmVudDsKLQotLyoqCi0gKiBAYXV0aG9yIGNlY28KLSAqIEB2ZXJzaW9uICRJZCQKLSAqLwotcHVibGljIGludGVyZmFjZSBJVHJlZU1vZGVsU291cmNlIGV4dGVuZHMgSUNvbXBvbmVudAotewotICAgIGZpbmFsIHN0YXRpYyBTdHJpbmcgVFJFRV9NT0RFTF9TT1VSQ0VfQVRUUklCVVRFID0gIm9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50cmVlLm1vZGVsLklUcmVlTW9kZWxTb3VyY2UiOwotCi0JSVRyZWVNb2RlbCBnZXRUcmVlTW9kZWwoKTsKLQlJVHJlZVN0YXRlTGlzdGVuZXIgZ2V0VHJlZVN0YXRlTGlzdGVuZXIoKTsKLQotfQpkaWZmIC0tZ2l0IGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RyZWUvbW9kZWwvSVRyZWVOb2RlLmphdmEgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdHJlZS9tb2RlbC9JVHJlZU5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2UwOGZkYS4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdHJlZS9tb2RlbC9JVHJlZU5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudHJlZS5tb2RlbDsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgY2VjbwotICogQHZlcnNpb24gJElkJAotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSVRyZWVOb2RlIGV4dGVuZHMgU2VyaWFsaXphYmxlCi17Ci0JCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgPGNvZGU+Q29sbGVjdGlvbjwvY29kZT4gb2YgY2hpbGRyZW4uIAotICAgICAqLwotICAgIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBjaGlsZHJlbiA8Y29kZT5JVHJlZU5vZGU8L2NvZGU+cyB0aGUgcmVjZWl2ZXIKLSAgICAgKiBjb250YWlucy4KLSAgICAgKi8KLSAgICBpbnQgZ2V0Q2hpbGRDb3VudCgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcGFyZW50IDxjb2RlPklUcmVlTm9kZTwvY29kZT4gb2YgdGhlIHJlY2VpdmVyLgotICAgICAqLwotICAgIElUcmVlTm9kZSBnZXRQYXJlbnQoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHRydWUgaWYgY3VycmVudCBub2RlIGNvbnRhaW5zIHJlY2VpdmVkIGNoaWxkcmVuLCBvdGhlcndpc2UgcmV0dXJuIGZhbHNlOwotICAgICAqLwotICAgIGJvb2xlYW4gY29udGFpbnNDaGlsZChJVHJlZU5vZGUgbm9kZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHJlY2VpdmVyIGFsbG93cyBjaGlsZHJlbi4KLSAgICAgKi8KLSAgICBib29sZWFuIGdldEFsbG93c0NoaWxkcmVuKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHJlY2VpdmVyIGlzIGEgbGVhZi4KLSAgICAgKi8KLSAgICBib29sZWFuIGlzTGVhZigpOwotCi19CmRpZmYgLS1naXQgYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdHJlZS9tb2RlbC9JVHJlZU5vZGVNYW5hZ2VyLmphdmEgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdHJlZS9tb2RlbC9JVHJlZU5vZGVNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiZDAzZDguLjAwMDAwMDAKLS0tIGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RyZWUvbW9kZWwvSVRyZWVOb2RlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50cmVlLm1vZGVsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVuZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50cmVlLmNvbXBvbmVudHMuSVRyZWVDb21wb25lbnQ7Ci0KLS8qKgotICogQGF1dGhvciBjZWNvCi0gKiBAdmVyc2lvbiAkSWQkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVRyZWVOb2RlTWFuYWdlciB7Ci0JSVJlbmRlciBnZXRSZW5kZXJlcihPYmplY3Qgb2JqVW5pcXVlS2V5LCBJVHJlZUNvbXBvbmVudCBvYmpUcmVlQ29tcG9uZW50KTsKLX0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90cmVlL21vZGVsL0lUcmVlUm93U291cmNlLmphdmEgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdHJlZS9tb2RlbC9JVHJlZVJvd1NvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjJmZjQwLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90cmVlL21vZGVsL0lUcmVlUm93U291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRyZWUubW9kZWw7Ci0KLS8qKgotICogQSBUYXBlc3RyeSBjb21wb25lbnQgdGhhdCBwcm92aWRlcyB0aGUgY3VycmVudCByb3cgdmFsdWUuCi0gKiBUaGlzIGludGVyZmFjZSBpcyB1c2VkIGZvciBvYnRhaW5pbmcgdGhlIHJvdyBzb3VyY2UgYnkgY29tcG9uZW50cyAKLSAqIHdyYXBwZWQgYnkgdGhlIHJvdyBzb3VyY2UKLSAqIAotICogQHZlcnNpb24gJElkJAotICogQGF1dGhvciB0c3ZldGVsaW4KLSAqLwotcHVibGljIGludGVyZmFjZSBJVHJlZVJvd1NvdXJjZQotewotICAgIGZpbmFsIHN0YXRpYyBTdHJpbmcgVFJFRV9ST1dfU09VUkNFX0FUVFJJQlVURSA9ICJvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudHJlZS5tb2RlbC5JVHJlZVJvd1NvdXJjZSI7Ci0KLQkvKioKLQkgKiBNZXRob2QgZ2V0VHJlZVJvdwotCSAqIEByZXR1cm4gT2JqZWN0IHRoZSBjdXJyZW50IHRyZWUgcm93IG9iamVjdC4KLQkgKi8KLQlUcmVlUm93T2JqZWN0IGdldFRyZWVSb3coKTsKLQkvL09iamVjdCBnZXRUcmVlUm93Tm9kZVVJRCgpOwotCS8vaW50IGdldFRyZWVOb2RlRGVlcCgpOwotfQpkaWZmIC0tZ2l0IGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RyZWUvbW9kZWwvSVRyZWVTZXNzaW9uU3RhdGVNYW5hZ2VyLmphdmEgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdHJlZS9tb2RlbC9JVHJlZVNlc3Npb25TdGF0ZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBkYmZhMi4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdHJlZS9tb2RlbC9JVHJlZVNlc3Npb25TdGF0ZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudHJlZS5tb2RlbDsKLQotCi0KLS8qKgotICogQGF1dGhvciBjZWNvCi0gKiBAdmVyc2lvbiAkSWQkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVRyZWVTZXNzaW9uU3RhdGVNYW5hZ2VyIHsKLQlPYmplY3QgZ2V0U2Vzc2lvblN0YXRlKElUcmVlTW9kZWwgb2JqTW9kZWwpOwotCUlUcmVlTW9kZWwgZ2V0TW9kZWwoT2JqZWN0IG9ialNlc3Npb25TdGF0ZSk7CQotfQpkaWZmIC0tZ2l0IGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RyZWUvbW9kZWwvSVRyZWVTdGF0ZUxpc3RlbmVyLmphdmEgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdHJlZS9tb2RlbC9JVHJlZVN0YXRlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RkZjA4NC4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdHJlZS9tb2RlbC9JVHJlZVN0YXRlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudHJlZS5tb2RlbDsKLQotLyoqCi0gKiBAYXV0aG9yIGNlY28KLSAqIEB2ZXJzaW9uICRJZCQKLSAqLwotcHVibGljIGludGVyZmFjZSBJVHJlZVN0YXRlTGlzdGVuZXIgewotCXZvaWQgdHJlZVN0YXRlQ2hhbmdlZChUcmVlU3RhdGVFdmVudCBvYmpFdmVudCk7Ci19CmRpZmYgLS1naXQgYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdHJlZS9tb2RlbC9JVHJlZVN0YXRlTW9kZWwuamF2YSBiL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90cmVlL21vZGVsL0lUcmVlU3RhdGVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Mjg2OTQ2Li4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90cmVlL21vZGVsL0lUcmVlU3RhdGVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50cmVlLm1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiBAYXV0aG9yIGNlY28KLSAqIEB2ZXJzaW9uICRJZCQKLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElUcmVlU3RhdGVNb2RlbCB7Ci0JU2V0IGdldEV4cGFuZFNlbGVjdGlvbigpOwotCS8qCi0JICogUmV0dXJuIHRoZSBzZWxlY3RlZCBub2RlIHVuaXF1ZSBrZXkKLQkgKi8KLQlPYmplY3QgZ2V0U2VsZWN0ZWROb2RlKCk7Ci0KLQl2b2lkIGV4cGFuZChPYmplY3Qgb2JqVW5pcXVlS2V5KTsKLQl2b2lkIGV4cGFuZFBhdGgoT2JqZWN0IG9ialVuaXF1ZUtleSk7Ci0Jdm9pZCBjb2xsYXBzZShPYmplY3Qgb2JqVW5pcXVlS2V5KTsKLQl2b2lkIGNvbGxhcHNlUGF0aChPYmplY3Qgb2JqVW5pcXVlS2V5KTsKLQotCWJvb2xlYW4gaXNVbmlxdWVLZXlFeHBhbmRlZChPYmplY3Qgb2JqVW5pcXVlS2V5KTsKLQkKLQl2b2lkIHJlc2V0U3RhdGUoKTsKLX0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90cmVlL21vZGVsL1RyZWVSb3dPYmplY3QuamF2YSBiL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90cmVlL21vZGVsL1RyZWVSb3dPYmplY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk3YzNmOC4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdHJlZS9tb2RlbC9UcmVlUm93T2JqZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRyZWUubW9kZWw7Ci0KLS8qKgotICogQGF1dGhvciBjZWNvCi0gKiBAdmVyc2lvbiAkSWQkCi0gKi8KLXB1YmxpYyBjbGFzcyBUcmVlUm93T2JqZWN0IHsKLQlwcml2YXRlIE9iamVjdCBtX29ialRyZWVOb2RlID0gbnVsbDsKLQlwcml2YXRlIE9iamVjdCBtX29ialRyZWVOb2RlVUlEID0gbnVsbDsKLQlwcml2YXRlIGludCBtX25UcmVlUm93RGVwdGg7Ci0KLQlwdWJsaWMgVHJlZVJvd09iamVjdChPYmplY3Qgb2JqVHJlZU5vZGUsIE9iamVjdCBvYmpUcmVlTm9kZVVJRCwgaW50IG5UcmVlUm93RGVwdGgpIHsKLQkJc3VwZXIoKTsKLQkJbV9vYmpUcmVlTm9kZSA9IG9ialRyZWVOb2RlOwotCQltX29ialRyZWVOb2RlVUlEID0gb2JqVHJlZU5vZGVVSUQ7Ci0JCW1fblRyZWVSb3dEZXB0aCA9IG5UcmVlUm93RGVwdGg7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRUcmVlTm9kZSgpIHsKLQkJcmV0dXJuIG1fb2JqVHJlZU5vZGU7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRUcmVlTm9kZVVJRCgpIHsKLQkJcmV0dXJuIG1fb2JqVHJlZU5vZGVVSUQ7Ci0JfQotCi0JcHVibGljIGludCBnZXRUcmVlUm93RGVwdGgoKSB7Ci0JCXJldHVybiBtX25UcmVlUm93RGVwdGg7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdHJlZS9tb2RlbC9UcmVlU3RhdGVFdmVudC5qYXZhIGIvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RyZWUvbW9kZWwvVHJlZVN0YXRlRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZhZjYyMC4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdHJlZS9tb2RlbC9UcmVlU3RhdGVFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50cmVlLm1vZGVsOwotCi0vKioKLSAqIEBhdXRob3IgY2VjbwotICogQHZlcnNpb24gJElkJAotICovCi1wdWJsaWMgY2xhc3MgVHJlZVN0YXRlRXZlbnQgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFTEVDVEVEX05PREVfQ0hBTkdFRCAJPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PREVfRVhQQU5ERUQgCQkJPSAyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PREVfQ09MTEFQU0VEIAkJCT0gNDsKLQkKLQlwcml2YXRlIGludCBtX25FdmVudFR5cGU7Ci0JcHJpdmF0ZSB0cmFuc2llbnQgSVRyZWVTdGF0ZU1vZGVsIG1fb2JqVHJlZVN0YXRlTW9kZWwgPSBudWxsOwotCXByaXZhdGUgdHJhbnNpZW50IE9iamVjdCBtX29iak5vZGVVSUQgPSBudWxsOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIFRyZWVTdGF0ZUV2ZW50LgotCSAqLwotCXB1YmxpYyBUcmVlU3RhdGVFdmVudChpbnQgbkV2ZW50VHlwZSwgT2JqZWN0IG9iak5vZGVVSUQsIElUcmVlU3RhdGVNb2RlbCBvYmpUcmVlU3RhdGVNb2RlbCkgewotCQlzdXBlcigpOwotCQltX25FdmVudFR5cGUgPSBuRXZlbnRUeXBlOwotCQltX29iak5vZGVVSUQgPSBvYmpOb2RlVUlEOwotCQltX29ialRyZWVTdGF0ZU1vZGVsID0gb2JqVHJlZVN0YXRlTW9kZWw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgRXZlbnRUeXBlLgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRFdmVudFR5cGUoKSB7Ci0JCXJldHVybiBtX25FdmVudFR5cGU7Ci0JfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNFdmVudChpbnQgbkV2ZW50VHlwZSl7Ci0JCXJldHVybiAoZ2V0RXZlbnRUeXBlKCkgJiBuRXZlbnRUeXBlKSA+IDA7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXROb2RlVUlEKCkgewotCQlyZXR1cm4gbV9vYmpOb2RlVUlEOwotCX0KLQotCXB1YmxpYyBJVHJlZVN0YXRlTW9kZWwgZ2V0VHJlZVN0YXRlTW9kZWwoKSB7Ci0JCXJldHVybiBtX29ialRyZWVTdGF0ZU1vZGVsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90cmVlL3NpbXBsZS9GdWxsVHJlZVNlc3Npb25TdGF0ZU1hbmFnZXIuamF2YSBiL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90cmVlL3NpbXBsZS9GdWxsVHJlZVNlc3Npb25TdGF0ZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQ3NzFkZi4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdHJlZS9zaW1wbGUvRnVsbFRyZWVTZXNzaW9uU3RhdGVNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRyZWUuc2ltcGxlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRyZWUubW9kZWwuSVRyZWVNb2RlbDsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudHJlZS5tb2RlbC5JVHJlZVNlc3Npb25TdGF0ZU1hbmFnZXI7Ci0KLS8qKgotICogQGF1dGhvciBjZWNvCi0gKiBAdmVyc2lvbiAkSWQkCi0gKi8KLXB1YmxpYyBjbGFzcyBGdWxsVHJlZVNlc3Npb25TdGF0ZU1hbmFnZXIgaW1wbGVtZW50cyBJVHJlZVNlc3Npb25TdGF0ZU1hbmFnZXIgewotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEZ1bGxUcmVlU2Vzc2lvblN0YXRlTWFuYWdlci4KLQkgKi8KLQlwdWJsaWMgRnVsbFRyZWVTZXNzaW9uU3RhdGVNYW5hZ2VyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRyZWUubW9kZWwuSVRyZWVTZXNzaW9uU3RhdGVNYW5hZ2VyI2dldFNlc3Npb25TdGF0ZShJVHJlZU1vZGVsKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0U2Vzc2lvblN0YXRlKElUcmVlTW9kZWwgb2JqTW9kZWwpIHsKLQkJcmV0dXJuIG9iak1vZGVsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRyZWUubW9kZWwuSVRyZWVTZXNzaW9uU3RhdGVNYW5hZ2VyI2dldE1vZGVsKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgSVRyZWVNb2RlbCBnZXRNb2RlbChPYmplY3Qgb2JqU2Vzc2lvblN0YXRlKSB7Ci0JCXJldHVybiAoSVRyZWVNb2RlbClvYmpTZXNzaW9uU3RhdGU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdHJlZS9zaW1wbGUvTnVsbFNlc3Npb25TdGF0ZU1hbmFnZXIuamF2YSBiL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90cmVlL3NpbXBsZS9OdWxsU2Vzc2lvblN0YXRlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjk0MjI4Li4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90cmVlL3NpbXBsZS9OdWxsU2Vzc2lvblN0YXRlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50cmVlLnNpbXBsZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50cmVlLm1vZGVsLklUcmVlTW9kZWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRyZWUubW9kZWwuSVRyZWVTZXNzaW9uU3RhdGVNYW5hZ2VyOwotCi0vKioKLSAqIEBhdXRob3IgY2VjbwotICogQHZlcnNpb24gJElkJAotICovCi1wdWJsaWMgY2xhc3MgTnVsbFNlc3Npb25TdGF0ZU1hbmFnZXIgaW1wbGVtZW50cyBJVHJlZVNlc3Npb25TdGF0ZU1hbmFnZXIgewotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIE51bGxTZXNzaW9uU3RhdGVNYW5hZ2VyLgotCSAqLwotCXB1YmxpYyBOdWxsU2Vzc2lvblN0YXRlTWFuYWdlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50cmVlLm1vZGVsLklUcmVlU2Vzc2lvblN0YXRlTWFuYWdlciNnZXRTZXNzaW9uU3RhdGUoSVRyZWVNb2RlbCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFNlc3Npb25TdGF0ZShJVHJlZU1vZGVsIG9iak1vZGVsKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRyZWUubW9kZWwuSVRyZWVTZXNzaW9uU3RhdGVNYW5hZ2VyI2dldE1vZGVsKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgSVRyZWVNb2RlbCBnZXRNb2RlbChPYmplY3Qgb2JqU2Vzc2lvblN0YXRlKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RyZWUvc2ltcGxlL1NpbXBsZU5vZGVSZW5kZXJGYWN0b3J5LmphdmEgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdHJlZS9zaW1wbGUvU2ltcGxlTm9kZVJlbmRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDY5NmJkYS4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdHJlZS9zaW1wbGUvU2ltcGxlTm9kZVJlbmRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudHJlZS5zaW1wbGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZW5kZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVxdWVzdEN5Y2xlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50cmVlLmNvbXBvbmVudHMuSU5vZGVSZW5kZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50cmVlLm1vZGVsLklUcmVlTW9kZWxTb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS52YWxpZC5SZW5kZXJTdHJpbmc7Ci0KLS8qKgotICogQGF1dGhvciBjZWNvCi0gKiBAdmVyc2lvbiAkSWQkCi0gKi8KLXB1YmxpYyBjbGFzcyBTaW1wbGVOb2RlUmVuZGVyRmFjdG9yeSBpbXBsZW1lbnRzIElOb2RlUmVuZGVyRmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgU2ltcGxlTm9kZVJlbmRlckZhY3RvcnkuCi0JICovCi0JcHVibGljIFNpbXBsZU5vZGVSZW5kZXJGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSU5vZGVSZW5kZXJGYWN0b3J5I2dldFJlbmRlcgotCSAqLwotCXB1YmxpYyBJUmVuZGVyIGdldFJlbmRlckJ5SUQoCi0JCU9iamVjdCBvYmpVbmlxdWVLZXksCi0JCUlUcmVlTW9kZWxTb3VyY2Ugb2JqVHJlZU1vZGVsU291cmNlLAotCQlJUmVxdWVzdEN5Y2xlIGN5Y2xlKQotCXsKLQkJT2JqZWN0IG9ialZhbHVlID0gb2JqVHJlZU1vZGVsU291cmNlLmdldFRyZWVNb2RlbCgpLmdldFRyZWVEYXRhTW9kZWwoKS5nZXRPYmplY3Qob2JqVW5pcXVlS2V5KTsKLQkJcmV0dXJuIGdldFJlbmRlcihvYmpWYWx1ZSwgb2JqVHJlZU1vZGVsU291cmNlLCBjeWNsZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJTm9kZVJlbmRlckZhY3RvcnkjZ2V0UmVuZGVyCi0JICovCi0JcHVibGljIElSZW5kZXIgZ2V0UmVuZGVyKE9iamVjdCBvYmpWYWx1ZSwgSVRyZWVNb2RlbFNvdXJjZSBvYmpUcmVlTW9kZWxTb3VyY2UsIElSZXF1ZXN0Q3ljbGUgb2JqQ3ljbGUpIHsKLQkJcmV0dXJuIG5ldyBSZW5kZXJTdHJpbmcob2JqVmFsdWUudG9TdHJpbmcoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdHJlZS9zaW1wbGUvU2ltcGxlU2Vzc2lvblN0YXRlTWFuYWdlci5qYXZhIGIvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RyZWUvc2ltcGxlL1NpbXBsZVNlc3Npb25TdGF0ZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdmOGVlNS4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdHJlZS9zaW1wbGUvU2ltcGxlU2Vzc2lvblN0YXRlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50cmVlLnNpbXBsZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50cmVlLm1vZGVsLklUcmVlTW9kZWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRyZWUubW9kZWwuSVRyZWVTZXNzaW9uU3RhdGVNYW5hZ2VyOwotCi0vKioKLSAqIEBhdXRob3IgY2VjbwotICogQHZlcnNpb24gJElkJAotICovCi1wdWJsaWMgY2xhc3MgU2ltcGxlU2Vzc2lvblN0YXRlTWFuYWdlciBpbXBsZW1lbnRzIElUcmVlU2Vzc2lvblN0YXRlTWFuYWdlciB7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgU2ltcGxlU2Vzc2lvblN0YXRlTWFuYWdlci4KLQkgKi8KLQlwdWJsaWMgU2ltcGxlU2Vzc2lvblN0YXRlTWFuYWdlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElUcmVlU2Vzc2lvblN0YXRlTWFuYWdlciNnZXRTZXNzaW9uU3RhdGUoSVRyZWVNb2RlbCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFNlc3Npb25TdGF0ZShJVHJlZU1vZGVsIG9iak1vZGVsKSB7Ci0JCXJldHVybiBvYmpNb2RlbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElUcmVlU2Vzc2lvblN0YXRlTWFuYWdlciNnZXRNb2RlbChPYmplY3QpCi0JICovCi0JcHVibGljIElUcmVlTW9kZWwgZ2V0TW9kZWwoT2JqZWN0IG9ialNlc3Npb25TdGF0ZSkgewotCQlyZXR1cm4gKElUcmVlTW9kZWwpb2JqU2Vzc2lvblN0YXRlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RyZWUvc2ltcGxlL1NpbXBsZVRyZWVEYXRhTW9kZWwuamF2YSBiL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90cmVlL3NpbXBsZS9TaW1wbGVUcmVlRGF0YU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxNjc4YzcuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RyZWUvc2ltcGxlL1NpbXBsZVRyZWVEYXRhTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRyZWUuc2ltcGxlOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgamF2YXguc3dpbmcudHJlZS5UcmVlUGF0aDsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50cmVlLm1vZGVsLklUcmVlRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50cmVlLm1vZGVsLklUcmVlTm9kZTsKLQotLyoqCi0gKiBAYXV0aG9yIGNlY28KLSAqIEB2ZXJzaW9uICRJZCQKLSAqLwotcHVibGljIGNsYXNzIFNpbXBsZVRyZWVEYXRhTW9kZWwgaW1wbGVtZW50cyBJVHJlZURhdGFNb2RlbCwgU2VyaWFsaXphYmxlIHsKLQotCXByb3RlY3RlZCBJVHJlZU5vZGUgbV9vYmpSb290Tm9kZTsKLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgU2ltcGxlVHJlZURhdGFNb2RlbC4KLQkgKi8KLQlwdWJsaWMgU2ltcGxlVHJlZURhdGFNb2RlbChJVHJlZU5vZGUgb2JqUm9vdE5vZGUpIHsKLQkJc3VwZXIoKTsKLQkJbV9vYmpSb290Tm9kZSA9IG9ialJvb3ROb2RlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRyZWUubW9kZWwuSVRyZWVEYXRhTW9kZWwjZ2V0Um9vdCgpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRSb290KCkgewotCQlyZXR1cm4gbV9vYmpSb290Tm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50cmVlLm1vZGVsLklUcmVlRGF0YU1vZGVsI2dldENoaWxkQ291bnQoT2JqZWN0KQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q2hpbGRDb3VudChPYmplY3Qgb2JqUGFyZW50KSB7Ci0JCUlUcmVlTm9kZSBvYmpQYXJlbnROb2RlID0gKElUcmVlTm9kZSlvYmpQYXJlbnQ7Ci0JCQotCQlyZXR1cm4gb2JqUGFyZW50Tm9kZS5nZXRDaGlsZENvdW50KCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudHJlZS5tb2RlbC5JVHJlZURhdGFNb2RlbCNnZXRDaGlsZHJlbihPYmplY3QpCi0JICovCi0JcHVibGljIEl0ZXJhdG9yIGdldENoaWxkcmVuKE9iamVjdCBvYmpQYXJlbnQpIHsKLQkJSVRyZWVOb2RlIG9ialBhcmVudE5vZGUgPSAoSVRyZWVOb2RlKW9ialBhcmVudDsKLQkJcmV0dXJuIG9ialBhcmVudE5vZGUuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRyZWUubW9kZWwuSVRyZWVEYXRhTW9kZWwjZ2V0T2JqZWN0KE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE9iamVjdChPYmplY3Qgb2JqVW5pcXVlS2V5KSB7Ci0JCWlmKG9ialVuaXF1ZUtleSAhPSBudWxsKSB7Ci0JCQlUcmVlUGF0aCBvYmpQYXRoID0gKFRyZWVQYXRoKW9ialVuaXF1ZUtleTsKLQkJCXJldHVybiBvYmpQYXRoLmdldExhc3RQYXRoQ29tcG9uZW50KCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudHJlZS5tb2RlbC5JVHJlZURhdGFNb2RlbCNnZXRVbmlxdWVLZXkoT2JqZWN0LCBPYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRVbmlxdWVLZXkoT2JqZWN0IG9ialRhcmdldCwgT2JqZWN0IG9ialBhcmVudFVuaXF1ZUtleSkgewotCQlUcmVlUGF0aCBvYmpQYXRoID0gKFRyZWVQYXRoKW9ialBhcmVudFVuaXF1ZUtleTsKLQkJT2JqZWN0IG9ialRhcmdldFVJRCA9IG51bGw7Ci0JCWlmKG9ialBhdGggIT0gbnVsbCl7Ci0JCQlvYmpUYXJnZXRVSUQgPSBvYmpQYXRoLnBhdGhCeUFkZGluZ0NoaWxkKG9ialRhcmdldCk7Ci0JCX1lbHNlewotCQkJb2JqVGFyZ2V0VUlEID0gbmV3IFRyZWVQYXRoKG9ialRhcmdldCk7Ci0JCX0KLQkJcmV0dXJuIG9ialRhcmdldFVJRDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50cmVlLm1vZGVsLklUcmVlRGF0YU1vZGVsI2lzQW5jZXN0b3JPZihPYmplY3QsIE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FuY2VzdG9yT2YoT2JqZWN0IG9ialRhcmdldFVuaXF1ZUtleSwgT2JqZWN0IG9ialBhcmVudFVuaXF1ZUtleSkgewotCQlUcmVlUGF0aCBvYmpQYXJlbnRQYXRoID0gKFRyZWVQYXRoKW9ialBhcmVudFVuaXF1ZUtleTsKLQkJVHJlZVBhdGggb2JqVGFyZ2V0UGF0aCA9IChUcmVlUGF0aClvYmpUYXJnZXRVbmlxdWVLZXk7Ci0JCWJvb2xlYW4gYlJlc3VsdCA9IG9ialBhcmVudFBhdGguaXNEZXNjZW5kYW50KG9ialRhcmdldFBhdGgpOwotCQlyZXR1cm4gYlJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50cmVlLm1vZGVsLklUcmVlRGF0YU1vZGVsI2dldFBhcmVudFVuaXF1ZUtleQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50VW5pcXVlS2V5KE9iamVjdCBvYmpDaGlsZFVuaXF1ZUtleSkgewotCQlUcmVlUGF0aCBvYmpDaGlsZFBhdGggPSAoVHJlZVBhdGgpb2JqQ2hpbGRVbmlxdWVLZXk7Ci0JCVRyZWVQYXRoIG9ialBhcmVudFBhdGggPSBvYmpDaGlsZFBhdGguZ2V0UGFyZW50UGF0aCgpOwotCQlpZihvYmpQYXJlbnRQYXRoID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIG9ialBhcmVudFBhdGguZ2V0TGFzdFBhdGhDb21wb25lbnQoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90cmVlL3NpbXBsZS9TaW1wbGVUcmVlTW9kZWwuamF2YSBiL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90cmVlL3NpbXBsZS9TaW1wbGVUcmVlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVjNTFiYy4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdHJlZS9zaW1wbGUvU2ltcGxlVHJlZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRyZWUuc2ltcGxlOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudHJlZS5tb2RlbC5JVHJlZURhdGFNb2RlbDsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudHJlZS5tb2RlbC5JVHJlZU1vZGVsOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50cmVlLm1vZGVsLklUcmVlU3RhdGVNb2RlbDsKLQotLyoqCi0gKiBAYXV0aG9yIGNlY28KLSAqIEB2ZXJzaW9uICRJZCQKLSAqLwotcHVibGljIGNsYXNzIFNpbXBsZVRyZWVNb2RlbCBpbXBsZW1lbnRzIElUcmVlTW9kZWwsIFNlcmlhbGl6YWJsZXsKLQotCXByaXZhdGUgSVRyZWVEYXRhTW9kZWwgbV9vYmpEYXRhTW9kZWw7Ci0JcHJpdmF0ZSBJVHJlZVN0YXRlTW9kZWwgbV9vYmpUcmVlU3RhdGVNb2RlbDsKLQkKLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgU2ltcGxlVHJlZU1vZGVsLgotCSAqLwotCXB1YmxpYyBTaW1wbGVUcmVlTW9kZWwoSVRyZWVEYXRhTW9kZWwgb2JqRGF0YU1vZGVsKSB7Ci0JCXRoaXMob2JqRGF0YU1vZGVsLCBuZXcgU2ltcGxlVHJlZVN0YXRlTW9kZWwoKSk7Ci0JfQotCi0JcHVibGljIFNpbXBsZVRyZWVNb2RlbChJVHJlZURhdGFNb2RlbCBvYmpEYXRhTW9kZWwsIElUcmVlU3RhdGVNb2RlbCBvYmpUcmVlU3RhdGVNb2RlbCkgewotCQlzdXBlcigpOwotCQltX29iakRhdGFNb2RlbCA9IG9iakRhdGFNb2RlbDsKLQkJbV9vYmpUcmVlU3RhdGVNb2RlbCA9IG9ialRyZWVTdGF0ZU1vZGVsOwotCX0KLQkvKioKLQkgKiBAc2VlIG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50cmVlLm1vZGVsLklUcmVlTW9kZWwjZ2V0VHJlZURhdGFNb2RlbCgpCi0JICovCi0JcHVibGljIElUcmVlRGF0YU1vZGVsIGdldFRyZWVEYXRhTW9kZWwoKSB7Ci0JCXJldHVybiBtX29iakRhdGFNb2RlbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50cmVlLm1vZGVsLklUcmVlTW9kZWwjZ2V0VHJlZVN0YXRlTW9kZWwoKQotCSAqLwotCXB1YmxpYyBJVHJlZVN0YXRlTW9kZWwgZ2V0VHJlZVN0YXRlTW9kZWwoKSB7Ci0JCXJldHVybiBtX29ialRyZWVTdGF0ZU1vZGVsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3RyZWUvc2ltcGxlL1NpbXBsZVRyZWVTdGF0ZU1vZGVsLmphdmEgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdHJlZS9zaW1wbGUvU2ltcGxlVHJlZVN0YXRlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhkMGU4Yy4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdHJlZS9zaW1wbGUvU2ltcGxlVHJlZVN0YXRlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRyZWUuc2ltcGxlOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50cmVlLm1vZGVsLklUcmVlU3RhdGVNb2RlbDsKLQotLyoqCi0gKiBAYXV0aG9yIGNlY28KLSAqIEB2ZXJzaW9uICRJZCQKLSAqLwotcHVibGljIGNsYXNzIFNpbXBsZVRyZWVTdGF0ZU1vZGVsIGltcGxlbWVudHMgSVRyZWVTdGF0ZU1vZGVsLCBTZXJpYWxpemFibGV7Ci0KLQlwcml2YXRlIFNldCBtX3NldEV4cGFuZGVkOwotCXByaXZhdGUgT2JqZWN0IG1fb2JqU2VsZWN0ZWROb2RlVUlEID0gbnVsbDsKLQkKLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgU2ltcGxlVHJlZVN0YXRlTW9kZWwuCi0JICovCi0JcHVibGljIFNpbXBsZVRyZWVTdGF0ZU1vZGVsKCkgewotCQlzdXBlcigpOwotCQlpbml0aWFsaXplKCk7Ci0JfQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplKCl7Ci0JCW1fc2V0RXhwYW5kZWQgPSBuZXcgSGFzaFNldCgpOwotCQltX29ialNlbGVjdGVkTm9kZVVJRCA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudHJlZS5tb2RlbC5JVHJlZVN0YXRlTW9kZWwjZ2V0RXhwYW5kU2VsZWN0aW9uKCkKLQkgKi8KLQlwdWJsaWMgU2V0IGdldEV4cGFuZFNlbGVjdGlvbigpIHsKLQkJcmV0dXJuIG1fc2V0RXhwYW5kZWQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudHJlZS5tb2RlbC5JVHJlZVN0YXRlTW9kZWwjZXhwYW5kKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleHBhbmQoT2JqZWN0IG9ialVuaXF1ZUtleSkgewotCQltX3NldEV4cGFuZGVkLmFkZChvYmpVbmlxdWVLZXkpOwotCQlzZXRTZWxlY3RlZE5vZGUob2JqVW5pcXVlS2V5KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50cmVlLm1vZGVsLklUcmVlU3RhdGVNb2RlbCNleHBhbmRQYXRoKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleHBhbmRQYXRoKE9iamVjdCBvYmpVbmlxdWVLZXkpIHsKLQkJbV9zZXRFeHBhbmRlZC5hZGQob2JqVW5pcXVlS2V5KTsKLQkJc2V0U2VsZWN0ZWROb2RlKG9ialVuaXF1ZUtleSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudHJlZS5tb2RlbC5JVHJlZVN0YXRlTW9kZWwjY29sbGFwc2UoT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIGNvbGxhcHNlKE9iamVjdCBvYmpVbmlxdWVLZXkpIHsKLQkJbV9zZXRFeHBhbmRlZC5yZW1vdmUob2JqVW5pcXVlS2V5KTsKLQkJc2V0U2VsZWN0ZWROb2RlKG9ialVuaXF1ZUtleSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudHJlZS5tb2RlbC5JVHJlZVN0YXRlTW9kZWwjY29sbGFwc2VQYXRoKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb2xsYXBzZVBhdGgoT2JqZWN0IG9ialVuaXF1ZUtleSkgewotCQltX3NldEV4cGFuZGVkLnJlbW92ZShvYmpVbmlxdWVLZXkpOwotCQlzZXRTZWxlY3RlZE5vZGUob2JqVW5pcXVlS2V5KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50cmVlLm1vZGVsLklUcmVlU3RhdGVNb2RlbCNpc1VuaXF1ZUtleUV4cGFuZGVkKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1VuaXF1ZUtleUV4cGFuZGVkKE9iamVjdCBvYmpVbmlxdWVLZXkpIHsKLQkJcmV0dXJuIG1fc2V0RXhwYW5kZWQuY29udGFpbnMob2JqVW5pcXVlS2V5KTsKLQl9Ci0JLyoqCi0JICogQHNlZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudHJlZS5tb2RlbC5JVHJlZVN0YXRlTW9kZWwjZ2V0U2VsZWN0ZWROb2RlKCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFNlbGVjdGVkTm9kZSgpIHsKLQkJcmV0dXJuIG1fb2JqU2VsZWN0ZWROb2RlVUlEOwotCX0KLQlwcml2YXRlIHZvaWQgc2V0U2VsZWN0ZWROb2RlKE9iamVjdCBvYmpVbmlxdWVLZXkpewotCQlpZihtX29ialNlbGVjdGVkTm9kZVVJRCA9PSBudWxsIHx8ICFtX29ialNlbGVjdGVkTm9kZVVJRC5lcXVhbHMob2JqVW5pcXVlS2V5KSkKLQkJCW1fb2JqU2VsZWN0ZWROb2RlVUlEID0gb2JqVW5pcXVlS2V5OwotCX0KLQkvKioKLQkgKiBAc2VlIG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50cmVlLm1vZGVsLklUcmVlU3RhdGVNb2RlbCNyZXNldFN0YXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldFN0YXRlKCkgewotCQlpbml0aWFsaXplKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdHJlZS9zaW1wbGUvVHJlZU5vZGUuamF2YSBiL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90cmVlL3NpbXBsZS9UcmVlTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTE1ZmU2Li4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi90cmVlL3NpbXBsZS9UcmVlTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudHJlZS5zaW1wbGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi50cmVlLm1vZGVsLklNdXRhYmxlVHJlZU5vZGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRyZWUubW9kZWwuSVRyZWVOb2RlOwotCi0vKioKLSAqIEBhdXRob3IgY2VjbwotICogQHZlcnNpb24gJElkJAotICovCi1wdWJsaWMgY2xhc3MgVHJlZU5vZGUgaW1wbGVtZW50cyBJTXV0YWJsZVRyZWVOb2RlIHsKLQotCXByb3RlY3RlZCBTZXQgbV9zZXRDaGlsZHJlbjsKLQlwcm90ZWN0ZWQgSU11dGFibGVUcmVlTm9kZSBtX29ialBhcmVudE5vZGU7Ci0JCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIFRyZWVOb2RlLgotCSAqLwotCXB1YmxpYyBUcmVlTm9kZSgpIHsKLQkJdGhpcyhudWxsKTsKLQl9Ci0JcHVibGljIFRyZWVOb2RlKElNdXRhYmxlVHJlZU5vZGUgcGFyZW50Tm9kZSkgewotCQlzdXBlcigpOwotCQltX29ialBhcmVudE5vZGUgPSBwYXJlbnROb2RlOwotCQltX3NldENoaWxkcmVuID0gbmV3IEhhc2hTZXQoKTsKLQl9Ci0KLQotCXB1YmxpYyBpbnQgZ2V0Q2hpbGRDb3VudCgpIHsKLQkJcmV0dXJuIG1fc2V0Q2hpbGRyZW4uc2l6ZSgpOwotCX0KLQotCXB1YmxpYyBJVHJlZU5vZGUgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gbV9vYmpQYXJlbnROb2RlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldEFsbG93c0NoaWxkcmVuKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0xlYWYoKSB7Ci0JCXJldHVybiBtX3NldENoaWxkcmVuLnNpemUoKSA9PSAwID8gdHJ1ZTpmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBjaGlsZHJlbigpIHsKLQkJcmV0dXJuIG1fc2V0Q2hpbGRyZW47Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBpbnNlcnQoSU11dGFibGVUcmVlTm9kZSBjaGlsZCkgewotCQljaGlsZC5zZXRQYXJlbnQodGhpcyk7Ci0JCW1fc2V0Q2hpbGRyZW4uYWRkKGNoaWxkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmUoSU11dGFibGVUcmVlTm9kZSBub2RlKSB7Ci0JCW1fc2V0Q2hpbGRyZW4ucmVtb3ZlKG5vZGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUZyb21QYXJlbnQoKSB7Ci0JCW1fb2JqUGFyZW50Tm9kZS5yZW1vdmUodGhpcyk7Ci0JCW1fb2JqUGFyZW50Tm9kZSA9IG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UGFyZW50KElNdXRhYmxlVHJlZU5vZGUgbmV3UGFyZW50KSB7Ci0JCW1fb2JqUGFyZW50Tm9kZSA9IG5ld1BhcmVudDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbnNlcnQoQ29sbGVjdGlvbiBjb2xDaGlsZHJlbil7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbENoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJSU11dGFibGVUcmVlTm9kZSBlbGVtZW50ID0gKElNdXRhYmxlVHJlZU5vZGUpIGl0ZXIubmV4dCgpOwotCQkJZWxlbWVudC5zZXRQYXJlbnQodGhpcyk7Ci0JCQltX3NldENoaWxkcmVuLmFkZChlbGVtZW50KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnRyZWUubW9kZWwuSVRyZWVOb2RlI2NvbnRhaW5zQ2hpbGQoSVRyZWVOb2RlKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zQ2hpbGQoSVRyZWVOb2RlIG5vZGUpIHsKLQkJcmV0dXJuIG1fc2V0Q2hpbGRyZW4uY29udGFpbnMobm9kZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudHJlZS5tb2RlbC5JVHJlZU5vZGUjZ2V0Q2hpbGRyZW4oKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKCkgewotCQlyZXR1cm4gbV9zZXRDaGlsZHJlbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi92YWxpZC9EYXRlRmllbGQuamF2YSBiL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi92YWxpZC9EYXRlRmllbGQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNhNmEyMS4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdmFsaWQvRGF0ZUZpZWxkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDAgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi52YWxpZDsKLQotaW1wb3J0IGphdmEudGV4dC5EYXRlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JQmluZGluZzsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnZhbGlkLkRhdGVWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS52YWxpZC5JVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkudmFsaWQuVmFsaWRGaWVsZDsKLQotLyoqCi0gKgotICogIEJhY2t3YXJkcyBjb21wYXRpYmxlIHZlcnNpb24gb2YgdGhlIDEuMC43IERhdGVGaWVsZCBjb21wb25lbnQuCi0gKgotICogPHRhYmxlIGJvcmRlcj0xPgotICogPHRyPgotICogICAgPHRkPlBhcmFtZXRlcjwvdGQ+Ci0gKiAgICA8dGQ+VHlwZTwvdGQ+Ci0gKgkgIDx0ZD5SZWFkIC8gV3JpdGUgPC90ZD4KLSAqICAgIDx0ZD5SZXF1aXJlZDwvdGQ+Ci0gKiAgICA8dGQ+RGVmYXVsdDwvdGQ+Ci0gKiAgICA8dGQ+RGVzY3JpcHRpb248L3RkPgotICogPC90cj4KLSAqCi0gKiAgPHRyPgotICogICAgICA8dGQ+ZGF0ZTwvdGQ+Ci0gKiAgICAgIDx0ZD5qYXZhLnV0aWwuRGF0ZTwvdGQ+Ci0gKiAgICAgIDx0ZD5SIC8gVzwvdGQ+Ci0gKiAgICAgIDx0ZD55ZXM8L3RkPgotICogICAgICA8dGQ+Jm5ic3A7PC90ZD4KLSAqICAgICAgPHRkPlRoZSBkYXRlIHByb3BlcnR5IHRvIGVkaXQuPC90ZD4KLSAqICA8L3RyPgotICoKLSAqICA8dHI+Ci0gKiAgICAgIDx0ZD5yZXF1aXJlZDwvdGQ+Ci0gKiAgICAgIDx0ZD5ib29sZWFuPC90ZD4KLSAqICAgICAgPHRkPlI8L3RkPgotICogICAgICA8dGQ+bm88L3RkPgotICogICAgICA8dGQ+bm88L3RkPgotICogICAgICA8dGQ+SWYgdHJ1ZSwgdGhlbiBhIHZhbHVlIG11c3QgYmUgZW50ZXJlZC48L3RkPgotICogIDwvdHI+Ci0gKgotICogIDx0cj4KLSAqICAgICAgPHRkPm1pbmltdW08L3RkPgotICogICAgICA8dGQ+amF2YS51dGlsLkRhdGU8L3RkPgotICogICAgICA8dGQ+UjwvdGQ+Ci0gKiAgICAgIDx0ZD5ubzwvdGQ+Ci0gKiAgICAgIDx0ZD4mbmJzcDs8L3RkPgotICogICAgICA8dGQ+SWYgcHJvdmlkZWQsIHRoZSBkYXRlIGVudGVyZWQgbXVzdCBiZSBlcXVhbCB0byBvciBsYXRlciB0aGFuIHRoZQotICogIHByb3ZpZGVkIG1pbmltdW0gZGF0ZS48L3RkPgotICogIDwvdHI+Ci0gKgotICogIDx0cj4KLSAqICAgICAgPHRkPm1heGltdW08L3RkPgotICogICAgICA8dGQ+amF2YS51dGlsLkRhdGU8L3RkPgotICogICAgICA8dGQ+UjwvdGQ+Ci0gKiAgICAgIDx0ZD5ubzwvdGQ+Ci0gKgkJPHRkPiZuYnNwOzwvdGQ+Ci0gKiAgICAgIDx0ZD5JZiBwcm92aWRlZCwgdGhlIGRhdGUgZW50ZXJlZCBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUKLSAqICBwcm92aWRlZCBtYXhpbXVtIGRhdGUuPC90ZD4KLSAqIDwvdHI+Ci0gKgotICogIDx0cj4KLSAqICAgICAgPHRkPmRpc3BsYXlOYW1lPC90ZD4KLSAqICAgICAgPHRkPlN0cmluZzwvdGQ+Ci0gKiAgICAgIDx0ZD5SPC90ZD4KLSAqICAgICAgPHRkPnllczwvdGQ+Ci0gKiAgICAgIDx0ZD4mbmJzcDs8L3RkPgotICogICAgICA8dGQ+QSB0ZXh0dWFsIG5hbWUgZm9yIHRoZSBmaWVsZCB0aGF0IGlzIHVzZWQgd2hlbiBmb3JtdWxhdGluZyBlcnJvciBtZXNzYWdlcy4KLSAqICAgICAgPC90ZD4KLSAqICA8L3RyPgotICoKLSAqICA8dHI+Ci0gKgkJPHRkPmZvcm1hdDwvdGQ+Ci0gKgkJPHRkPntAbGluayBEYXRlRm9ybWF0fTwvdGQ+Ci0gKgkJPHRkPlI8L3RkPgotICoJCTx0ZD5ubzwvdGQ+Ci0gKgkJPHRkPkRlZmF1bHQgZm9ybWF0IDxjb2RlPk1NL2RkL3l5eXk8L2NvZGU+PC90ZD4KLSAqCQk8dGQ+VGhlIGZvcm1hdCB1c2VkIHRvIGRpc3BsYXkgYW5kIHBhcnNlIGRhdGVzLjwvdGQ+Ci0gKgk8L3RyPgotICoKLSAqICA8dHI+Ci0gKgkJPHRkPmRpc3BsYXlGb3JtYXQ8L3RkPgotICoJCTx0ZD57QGxpbmsgU3RyaW5nfTwvdGQ+Ci0gKgkJPHRkPlI8L3RkPgotICoJCTx0ZD5ubzwvdGQ+Ci0gKgkJPHRkPjxjb2RlPk1NL0REL1lZWVk8L2NvZGU+PC90ZD4KLSAqCQk8dGQ+VGhlIGZvcm1hdCBzdHJpbmcgcHJlc2VudGVkIHRvIHRoZSB1c2VyIGlmIHRoZSBkYXRlIGVudGVyZWQgaXMgaW4gYW4gCi0gKiAgIGluY29ycmVjdCBmb3JtYXQuIGUuZy4gdGhlIGZvcm1hdCBvYmplY3QgdGhyb3dzIGEgUGFyc2VFeGNlcHRpb24uPC90ZD4KLSAqCTwvdHI+Ci0gKgotICogIDwvdGFibGU+Ci0gKgotICogIDxwPkluZm9ybWFsIHBhcmFtZXRlcnMgYXJlIGFsbG93ZWQuICBBIGJvZHkgaXMgbm90IGFsbG93ZWQuCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQHNpbmNlIDEuMC44Ci0gKiAKLSAqICBAc2VlIFZhbGlkRmllbGQKLSAqIAotICoqLwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRGF0ZUZpZWxkIGV4dGVuZHMgVmFsaWRGaWVsZAotewotCXB1YmxpYyBhYnN0cmFjdCBEYXRlIGdldERhdGUoKTsKLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXREYXRlKERhdGUgZGF0ZSk7Ci0JCi0gICAgcHJpdmF0ZSBJQmluZGluZyBtaW5pbXVtQmluZGluZzsKLSAgICBwcml2YXRlIElCaW5kaW5nIG1heGltdW1CaW5kaW5nOwotICAgIHByaXZhdGUgSUJpbmRpbmcgcmVxdWlyZWRCaW5kaW5nOwotICAgIHByaXZhdGUgSUJpbmRpbmcgZm9ybWF0QmluZGluZzsKLSAgICBwcml2YXRlIElCaW5kaW5nIGRpc3BsYXlGb3JtYXRCaW5kaW5nOwotCi0KLSAgICAvKioKLSAgICAgKiAgT3ZlcnJpZGVzIHtAbGluayBWYWxpZEZpZWxkI2dldFZhbGlkYXRvcigpfSB0byBjb25zdHJ1Y3QgYSB2YWxpZGF0b3IKLSAgICAgKiAgb24tdGhlLWZseS4KLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgSVZhbGlkYXRvciBnZXRWYWxpZGF0b3IoKQotICAgIHsKLSAgICAgICAgRGF0ZVZhbGlkYXRvciB2YWxpZGF0b3IgPSBuZXcgRGF0ZVZhbGlkYXRvcigpOwotCi0gICAgICAgIGlmIChtaW5pbXVtQmluZGluZyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBEYXRlIG1pbmltdW0gPSAoRGF0ZSkgbWluaW11bUJpbmRpbmcuZ2V0T2JqZWN0KCJtaW5pbXVtIiwgRGF0ZS5jbGFzcyk7Ci0gICAgICAgICAgICB2YWxpZGF0b3Iuc2V0TWluaW11bShtaW5pbXVtKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtYXhpbXVtQmluZGluZyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBEYXRlIG1heGltdW0gPSAoRGF0ZSkgbWF4aW11bUJpbmRpbmcuZ2V0T2JqZWN0KCJtYXhpbXVtIiwgRGF0ZS5jbGFzcyk7Ci0gICAgICAgICAgICB2YWxpZGF0b3Iuc2V0TWF4aW11bShtYXhpbXVtKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChyZXF1aXJlZEJpbmRpbmcgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgYm9vbGVhbiByZXF1aXJlZCA9IHJlcXVpcmVkQmluZGluZy5nZXRCb29sZWFuKCk7Ci0gICAgICAgICAgICB2YWxpZGF0b3Iuc2V0UmVxdWlyZWQocmVxdWlyZWQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGZvcm1hdEJpbmRpbmcgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgRGF0ZUZvcm1hdCBmb3JtYXQgPQotICAgICAgICAgICAgICAgIChEYXRlRm9ybWF0KSBmb3JtYXRCaW5kaW5nLmdldE9iamVjdCgiZm9ybWF0IiwgRGF0ZUZvcm1hdC5jbGFzcyk7Ci0gICAgICAgICAgICB2YWxpZGF0b3Iuc2V0Rm9ybWF0KGZvcm1hdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZGlzcGxheUZvcm1hdEJpbmRpbmcgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIGRpc3BsYXlGb3JtYXQgPQotICAgICAgICAgICAgICAgIChTdHJpbmcpIGRpc3BsYXlGb3JtYXRCaW5kaW5nLmdldE9iamVjdCgiZGlzcGxheUZvcm1hdCIsIFN0cmluZy5jbGFzcyk7Ci0gICAgICAgICAgICB2YWxpZGF0b3Iuc2V0RGlzcGxheUZvcm1hdChkaXNwbGF5Rm9ybWF0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB2YWxpZGF0b3I7Ci0gICAgfQotCi0gICAgcHVibGljIElCaW5kaW5nIGdldFJlcXVpcmVkQmluZGluZygpCi0gICAgewotICAgICAgICByZXR1cm4gcmVxdWlyZWRCaW5kaW5nOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFJlcXVpcmVkQmluZGluZyhJQmluZGluZyByZXF1aXJlZEJpbmRpbmcpCi0gICAgewotICAgICAgICB0aGlzLnJlcXVpcmVkQmluZGluZyA9IHJlcXVpcmVkQmluZGluZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSUJpbmRpbmcgZ2V0Rm9ybWF0QmluZGluZygpCi0gICAgewotICAgICAgICByZXR1cm4gZm9ybWF0QmluZGluZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRGb3JtYXRCaW5kaW5nKElCaW5kaW5nIGZvcm1hdEJpbmRpbmcpCi0gICAgewotICAgICAgICB0aGlzLmZvcm1hdEJpbmRpbmcgPSBmb3JtYXRCaW5kaW5nOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSUJpbmRpbmcgZ2V0RGlzcGxheUZvcm1hdEJpbmRpbmcoKQotICAgIHsKLSAgICAJcmV0dXJuIGRpc3BsYXlGb3JtYXRCaW5kaW5nOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXREaXNwbGF5Rm9ybWF0QmluZGluZyhJQmluZGluZyBkaXNwbGF5Rm9ybWF0QmluZGluZykKLSAgICB7Ci0gICAgCXRoaXMuZGlzcGxheUZvcm1hdEJpbmRpbmcgPSBkaXNwbGF5Rm9ybWF0QmluZGluZzsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIElCaW5kaW5nIGdldE1pbmltdW1CaW5kaW5nKCkgewotICAgICAgICByZXR1cm4gbWluaW11bUJpbmRpbmc7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldE1pbmltdW1CaW5kaW5nKElCaW5kaW5nIHZhbHVlKQotICAgIHsKLSAgICAgICAgdGhpcy5taW5pbXVtQmluZGluZyA9IHZhbHVlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSUJpbmRpbmcgZ2V0TWF4aW11bUJpbmRpbmcoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1heGltdW1CaW5kaW5nOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRNYXhpbXVtQmluZGluZyhJQmluZGluZyB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIHRoaXMubWF4aW11bUJpbmRpbmcgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUudGFwZXN0cnkudmFsaWQuVmFsaWRGaWVsZCNnZXRWYWx1ZSgpCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0RGF0ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS50YXBlc3RyeS52YWxpZC5WYWxpZEZpZWxkI3NldFZhbHVlKGphdmEubGFuZy5PYmplY3QpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUoT2JqZWN0IHZhbHVlKQotICAgIHsKLSAgICAgICAgc2V0RGF0ZSgoRGF0ZSkgdmFsdWUpOwotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi92YWxpZC9EYXRlRmllbGQuandjIGIvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3ZhbGlkL0RhdGVGaWVsZC5qd2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzZmUxNzkuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3ZhbGlkL0RhdGVGaWVsZC5qd2MKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gIAotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTwhLS0gJElkJCAtLT4KLTwhRE9DVFlQRSBjb21wb25lbnQtc3BlY2lmaWNhdGlvbiBQVUJMSUMgCi0gICItLy9BcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi8vVGFwZXN0cnkgU3BlY2lmaWNhdGlvbiAzLjAvL0VOIiAKLSAgImh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvdGFwZXN0cnkvZHRkL1RhcGVzdHJ5XzNfMC5kdGQiPgotICAKLTxjb21wb25lbnQtc3BlY2lmaWNhdGlvbiBjbGFzcz0ib3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnZhbGlkLkRhdGVGaWVsZCI+Ci0KLSAgPHBhcmFtZXRlciBuYW1lPSJkaXNhYmxlZCIgdHlwZT0iYm9vbGVhbiIgZGlyZWN0aW9uPSJpbiIvPgotICA8cGFyYW1ldGVyIG5hbWU9ImhpZGRlbiIgdHlwZT0iYm9vbGVhbiIgZGlyZWN0aW9uPSJpbiIvPgotICA8cGFyYW1ldGVyIG5hbWU9ImRpc3BsYXlXaWR0aCIgdHlwZT0iaW50IiBkaXJlY3Rpb249ImluIi8+Ci0gIDxwYXJhbWV0ZXIgbmFtZT0ibWF4aW11bUxlbmd0aCIgdHlwZT0iaW50IiBkaXJlY3Rpb249ImluIi8+Ci0KLSAgPHBhcmFtZXRlciBuYW1lPSJkYXRlIiB0eXBlPSJqYXZhLnV0aWwuRGF0ZSIgZGlyZWN0aW9uPSJhdXRvIiByZXF1aXJlZD0ieWVzIiAvPgotICA8cGFyYW1ldGVyIG5hbWU9ImRpc3BsYXlOYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIiBkaXJlY3Rpb249ImF1dG8iIHJlcXVpcmVkPSJ5ZXMiIC8+Ci0gIDxwYXJhbWV0ZXIgbmFtZT0ibWF4aW11bSIgdHlwZT0iamF2YS51dGlsLkRhdGUiIC8+Ci0gIDxwYXJhbWV0ZXIgbmFtZT0ibWluaW11bSIgdHlwZT0iamF2YS51dGlsLkRhdGUiIC8+Ci0gIDxwYXJhbWV0ZXIgbmFtZT0icmVxdWlyZWQiIC8+Ci0gIDxwYXJhbWV0ZXIgbmFtZT0iZm9ybWF0IiB0eXBlPSJqYXZhLnRleHQuRGF0ZUZvcm1hdCIgLz4KLSAgPHBhcmFtZXRlciBuYW1lPSJkaXNwbGF5Rm9ybWF0IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIiAvPgotICAgIAotICA8cmVzZXJ2ZWQtcGFyYW1ldGVyIG5hbWU9Im5hbWUiLz4KLSAgPHJlc2VydmVkLXBhcmFtZXRlciBuYW1lPSJ0eXBlIi8+Ci0gIDxyZXNlcnZlZC1wYXJhbWV0ZXIgbmFtZT0idmFsdWUiLz4KLSAgPHJlc2VydmVkLXBhcmFtZXRlciBuYW1lPSJzaXplIi8+Ci0gIDxyZXNlcnZlZC1wYXJhbWV0ZXIgbmFtZT0ibWF4bGVuZ3RoIi8+Ci0KLSAgPHByb3BlcnR5LXNwZWNpZmljYXRpb24gbmFtZT0ibmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgotICA8cHJvcGVydHktc3BlY2lmaWNhdGlvbiBuYW1lPSJmb3JtIiB0eXBlPSJvcmcuYXBhY2hlLnRhcGVzdHJ5LklGb3JtIi8+Ci0KLTwvY29tcG9uZW50LXNwZWNpZmljYXRpb24+CmRpZmYgLS1naXQgYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdmFsaWQvTnVtZXJpY0ZpZWxkLmphdmEgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdmFsaWQvTnVtZXJpY0ZpZWxkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5MDNlZDkuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3ZhbGlkL051bWVyaWNGaWVsZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk4ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudmFsaWQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklCaW5kaW5nOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkudmFsaWQuSVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnZhbGlkLk51bWJlclZhbGlkYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnZhbGlkLlZhbGlkRmllbGQ7Ci0KLS8qKgotICoKLSAqIEJhY2t3YXJkcyBjb21wYXRpYmxlIHZlcnNpb24gb2YgdGhlIDEuMC43IE51bWVyaWNGaWVsZCBjb21wb25lbnQuCi0gKgotICogPHRhYmxlIGJvcmRlcj0xPgotICogPHRyPgotICogICAgPHRkPlBhcmFtZXRlcjwvdGQ+Ci0gKiAgICA8dGQ+VHlwZTwvdGQ+Ci0gKgkgIDx0ZD5SZWFkIC8gV3JpdGUgPC90ZD4KLSAqICAgIDx0ZD5SZXF1aXJlZDwvdGQ+Ci0gKiAgICA8dGQ+RGVmYXVsdDwvdGQ+Ci0gKiAgICA8dGQ+RGVzY3JpcHRpb248L3RkPgotICogPC90cj4KLSAqCi0gKiAgPHRyPgotICogICAgPHRkPnZhbHVlPC90ZD4KLSAqICAgIDx0ZD57QGxpbmsgTnVtYmVyfTwvdGQ+Ci0gKiAgICA8dGQ+UiAvIFc8L3RkPgotICogICAJPHRkPnllczwvdGQ+Ci0gKgkJPHRkPiZuYnNwOzwvdGQ+Ci0gKgkJPHRkPlRoZSB2YWx1ZSB0byBiZSB1cGRhdGVkLgotICoKLSAqICA8cD5XaGVuIHRoZSBmb3JtIGlzIHN1Ym1pdHRlZCwgdGhpcyBwYXJhbWV0ZXIgaXMgb25seSB1cGRhdGVkIGlmIHRoZSB2YWx1ZQotICogIGlzIHZhbGlkLgotICoKLSAqICA8cD5XaGVuIHJlbmRlcmluZywgYSBudWxsIHZhbHVlIHdpbGwgcmVuZGVyIGFzIHRoZSBlbXB0eSBzdHJpbmcuICBBIHZhbHVlCi0gKiAgb2YgemVybyB3aWxsIHJlbmRlciBub3JtYWxseS4KLSAqCi0gKiAgPHA+V2hlbiB0aGUgZm9ybSBpcyBzdWJtaXR0ZWQsIHRoZSB0eXBlIG9mIHRoZSBiaW5kaW5nCi0gKiAgaXMgdXNlZCB0byBkZXRlcm1pbmUgd2hhdCBraW5kIG9mIG9iamVjdCB0byBjb252ZXJ0IHRoZSBzdHJpbmcgdG8uCi0gKgotICogPC90ZD4KLSAqCTwvdHI+Ci0gKgotICogIDx0cj4KLSAqICAgICAgPHRkPm1pbmltdW08L3RkPgotICogICAgICA8dGQ+e0BsaW5rIE51bWJlcn08L3RkPgotICogICAgICA8dGQ+UjwvdGQ+Ci0gKiAgICAgIDx0ZD5ubzwvdGQ+Ci0gKiAgICAgIDx0ZD4mbmJzcDs8L3RkPgotICogICAgICA8dGQ+VGhlIG1pbmltdW0gdmFsdWUgYWNjZXB0ZWQgZm9yIHRoZSBmaWVsZC48L3RkPgotICogIDwvdHI+Ci0gKgotICogIDx0cj4KLSAqICAgICAgPHRkPm1heGltdW08L3RkPgotICogICAgICA8dGQ+e0BsaW5rIE51bWJlcn08L3RkPgotICogICAgICA8dGQ+UjwvdGQ+Ci0gKiAgICAgIDx0ZD5ubzwvdGQ+Ci0gKiAgICAgIDx0ZD4mbmJzcDs8L3RkPgotICogICAgICA8dGQ+VGhlIG1heGltdW0gdmFsdWUgYWNjZXB0ZWQgZm9yIHRoZSBmaWVsZC48L3RkPgotICogPC90cj4KLSAqCi0gKiAgPHRyPgotICogICAgICA8dGQ+cmVxdWlyZWQ8L3RkPgotICogICAgICA8dGQ+Ym9vbGVhbjwvdGQ+Ci0gKiAgICAgIDx0ZD5SPC90ZD4KLSAqICAgICAgPHRkPm5vPC90ZD4KLSAqICAgICAgPHRkPmZhbHNlPC90ZD4KLSAqICAgICAgPHRkPklmIHRydWUsIHRoZW4gYSBub24tbnVsbCB2YWx1ZSBtdXN0IGJlIHByb3ZpZGVkLiBJZiB0aGUgZmllbGQgaXMgbm90Ci0gKiByZXF1aXJlZCwgYW5kIGEgbnVsbCAoYWxsIHdoaXRlc3BhY2UpIHZhbHVlIGlzIHN1cHBsaWVkIGluIHRoZSBmaWVsZCwgdGhlbiB0aGUKLSAqIHZhbHVlIHBhcmFtZXRlciBpcyA8ZW0+bm90PC9lbT4gdXBkYXRlZC48L3RkPgotICogIDwvdHI+Ci0gKgotICogIDx0cj4KLSAqICAgICAgPHRkPmRpc3BsYXlOYW1lPC90ZD4KLSAqICAgICAgPHRkPlN0cmluZzwvdGQ+Ci0gKiAgICAgIDx0ZD5SPC90ZD4KLSAqICAgICAgPHRkPnllczwvdGQ+Ci0gKiAgICAgIDx0ZD4mbmJzcDs8L3RkPgotICogICAgICA8dGQ+QSB0ZXh0dWFsIG5hbWUgZm9yIHRoZSBmaWVsZCB0aGF0IGlzIHVzZWQgd2hlbiBmb3JtdWxhdGluZyBlcnJvciBtZXNzYWdlcy4KLSAqICAgICAgPC90ZD4KLSAqICA8L3RyPgotICogCi0gKiAgPHRyPgotICogICAgICA8dGQ+dHlwZTwvdGQ+Ci0gKiAgICAgIDx0ZD5TdHJpbmc8L3RkPgotICogICAgICA8dGQ+UjwvdGQ+Ci0gKiAgICAgIDx0ZD55ZXM8L3RkPgotICogICAgICA8dGQ+Jm5ic3A7PC90ZD4KLSAqICAgICAgPHRkPlRoZSBjbGFzcyBuYW1lIHVzZWQgdG8gY29udmVydCB0aGUgdmFsdWUgZW50ZXJlZC4gIFNlZSB7QGxpbmsgTnVtYmVyVmFsaWRhdG9yI3NldFZhbHVlVHlwZShTdHJpbmcpfQotICogICAgICA8L3RkPgotICogIDwvdHI+Ci0gKgotICoJPC90YWJsZT4KLSAqCi0gKiAgPHA+TWF5IG5vdCBjb250YWluIGEgYm9keS4gIE1heSBoYXZlIGluZm9ybWFsIHBhcmFtZXRlcnMuCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQHNpbmNlIDEuMC44Ci0gKiAgQHNlZSBWYWxpZEZpZWxkCi0gKgotICoqLwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTnVtZXJpY0ZpZWxkIGV4dGVuZHMgVmFsaWRGaWVsZAotewotICAgIHByaXZhdGUgSUJpbmRpbmcgbWluaW11bUJpbmRpbmc7Ci0gICAgcHJpdmF0ZSBJQmluZGluZyBtYXhpbXVtQmluZGluZzsKLQlwcml2YXRlIElCaW5kaW5nIHJlcXVpcmVkQmluZGluZzsKLQlwcml2YXRlIElCaW5kaW5nIHR5cGVCaW5kaW5nOwotCi0JcHVibGljIElCaW5kaW5nIGdldE1pbmltdW1CaW5kaW5nKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtaW5pbXVtQmluZGluZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRNaW5pbXVtQmluZGluZyhJQmluZGluZyB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIG1pbmltdW1CaW5kaW5nID0gdmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIElCaW5kaW5nIGdldE1heGltdW1CaW5kaW5nKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtYXhpbXVtQmluZGluZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRNYXhpbXVtQmluZGluZyhJQmluZGluZyB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIG1heGltdW1CaW5kaW5nID0gdmFsdWU7Ci0gICAgfQotCi0JcHVibGljIElCaW5kaW5nIGdldFJlcXVpcmVkQmluZGluZygpCi0JewotCQlyZXR1cm4gcmVxdWlyZWRCaW5kaW5nOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlcXVpcmVkQmluZGluZyhJQmluZGluZyByZXF1aXJlZEJpbmRpbmcpCi0JewotCQl0aGlzLnJlcXVpcmVkQmluZGluZyA9IHJlcXVpcmVkQmluZGluZzsKLQl9Ci0KLQlwdWJsaWMgSUJpbmRpbmcgZ2V0VHlwZUJpbmRpbmcoKQotCXsKLQkJcmV0dXJuIHR5cGVCaW5kaW5nOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFR5cGVCaW5kaW5nKElCaW5kaW5nIHR5cGVOYW1lQmluZGluZykKLQl7Ci0JCXRoaXMudHlwZUJpbmRpbmcgPSB0eXBlTmFtZUJpbmRpbmc7Ci0JfQotCi0gICAgLyoqCi0gICAgICogT3ZlcnJpZGVzIHtAbGluayBWYWxpZEZpZWxkI2dldFZhbGlkYXRvcigpfSB0byBjb25zdHJ1Y3QKLSAgICAgKiBhIHZhbGlkYXRvciBvbiB0aGUgZmx5LgotICAgICAqKi8KLQotICAgIHB1YmxpYyBJVmFsaWRhdG9yIGdldFZhbGlkYXRvcigpCi0gICAgewotICAgICAgICBOdW1iZXJWYWxpZGF0b3IgdmFsaWRhdG9yID0gbmV3IE51bWJlclZhbGlkYXRvcigpOwotCi0gICAgICAgIGlmIChtaW5pbXVtQmluZGluZyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBOdW1iZXIgbWluaW11bSA9IChOdW1iZXIpIG1pbmltdW1CaW5kaW5nLmdldE9iamVjdCgibWluaW11bSIsIE51bWJlci5jbGFzcyk7Ci0gICAgICAgICAgICB2YWxpZGF0b3Iuc2V0TWluaW11bShtaW5pbXVtKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtYXhpbXVtQmluZGluZyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBOdW1iZXIgbWF4aW11bSA9IChOdW1iZXIpIG1heGltdW1CaW5kaW5nLmdldE9iamVjdCgibWF4aW11bSIsIE51bWJlci5jbGFzcyk7Ci0gICAgICAgICAgICB2YWxpZGF0b3Iuc2V0TWF4aW11bShtYXhpbXVtKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChyZXF1aXJlZEJpbmRpbmcgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgYm9vbGVhbiByZXF1aXJlZCA9IHJlcXVpcmVkQmluZGluZy5nZXRCb29sZWFuKCk7Ci0gICAgICAgICAgICB2YWxpZGF0b3Iuc2V0UmVxdWlyZWQocmVxdWlyZWQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHR5cGVCaW5kaW5nICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgCXZhbGlkYXRvci5zZXRWYWx1ZVR5cGUodHlwZUJpbmRpbmcuZ2V0U3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gdmFsaWRhdG9yOwotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi92YWxpZC9OdW1lcmljRmllbGQuandjIGIvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3ZhbGlkL051bWVyaWNGaWVsZC5qd2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzN2QzZmMuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3ZhbGlkL051bWVyaWNGaWVsZC5qd2MKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gIAotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTwhLS0gJElkJCAtLT4KLTwhRE9DVFlQRSBjb21wb25lbnQtc3BlY2lmaWNhdGlvbiBQVUJMSUMgCi0gICItLy9BcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi8vVGFwZXN0cnkgU3BlY2lmaWNhdGlvbiAzLjAvL0VOIiAKLSAgImh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvdGFwZXN0cnkvZHRkL1RhcGVzdHJ5XzNfMC5kdGQiPgotCi08Y29tcG9uZW50LXNwZWNpZmljYXRpb24gY2xhc3M9Im9yZy5hcGFjaGUudGFwZXN0cnkuY29udHJpYi52YWxpZC5OdW1lcmljRmllbGQiPgotCi0gIDxwYXJhbWV0ZXIgbmFtZT0iZGlzYWJsZWQiIHR5cGU9ImJvb2xlYW4iIGRpcmVjdGlvbj0iaW4iLz4KLSAgPHBhcmFtZXRlciBuYW1lPSJoaWRkZW4iIHR5cGU9ImJvb2xlYW4iIGRpcmVjdGlvbj0iaW4iLz4KLSAgPHBhcmFtZXRlciBuYW1lPSJkaXNwbGF5V2lkdGgiIHR5cGU9ImludCIgZGlyZWN0aW9uPSJpbiIgLz4KLSAgPHBhcmFtZXRlciBuYW1lPSJtYXhpbXVtTGVuZ3RoIiB0eXBlPSJpbnQiIGRpcmVjdGlvbj0iaW4iIC8+Ci0KLSAgPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iamF2YS5sYW5nLk9iamVjdCIgZGlyZWN0aW9uPSJhdXRvIiByZXF1aXJlZD0ieWVzIi8+Ci0gIDxwYXJhbWV0ZXIgbmFtZT0iZGlzcGxheU5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciIGRpcmVjdGlvbj0iYXV0byIgcmVxdWlyZWQ9InllcyIvPgotICA8cGFyYW1ldGVyIG5hbWU9Im1heGltdW0iIHR5cGU9ImphdmEubGFuZy5OdW1iZXIiLz4KLSAgPHBhcmFtZXRlciBuYW1lPSJtaW5pbXVtIiB0eXBlPSJqYXZhLmxhbmcuTnVtYmVyIi8+Ci0gIDxwYXJhbWV0ZXIgbmFtZT0icmVxdWlyZWQiLz4KLSAgPHBhcmFtZXRlciBuYW1lPSJ0eXBlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIiByZXF1aXJlZD0ieWVzIiBkaXJlY3Rpb249ImluIiAvPgotCi0gIDxyZXNlcnZlZC1wYXJhbWV0ZXIgbmFtZT0ibmFtZSIvPgotICAKLSAgPHByb3BlcnR5LXNwZWNpZmljYXRpb24gbmFtZT0ibmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgotICA8cHJvcGVydHktc3BlY2lmaWNhdGlvbiBuYW1lPSJmb3JtIiB0eXBlPSJvcmcuYXBhY2hlLnRhcGVzdHJ5LklGb3JtIi8+Ci0KLTwvY29tcG9uZW50LXNwZWNpZmljYXRpb24+CmRpZmYgLS1naXQgYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdmFsaWQvVmFsaWRhdGluZ1RleHRGaWVsZC5qYXZhIGIvY29udHJpYi9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb250cmliL3ZhbGlkL1ZhbGlkYXRpbmdUZXh0RmllbGQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI3YmY4Ni4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdmFsaWQvVmFsaWRhdGluZ1RleHRGaWVsZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg4ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIudmFsaWQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklCaW5kaW5nOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkudmFsaWQuSVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnZhbGlkLlN0cmluZ1ZhbGlkYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnZhbGlkLlZhbGlkRmllbGQ7Ci0KLS8qKgotICoKLSAqICBCYWNrd2FyZHMgY29tcGF0aWJsZSB2ZXJzaW9uIG9mIHRoZSAxLjAuNyBWYWxpZGF0aW5nVGV4dEZpZWxkIGNvbXBvbmVudC4KLSAqIAotICogPHRhYmxlIGJvcmRlcj0xPgotICogPHRyPgotICogICAgPHRkPlBhcmFtZXRlcjwvdGQ+Ci0gKiAgICA8dGQ+VHlwZTwvdGQ+Ci0gKgkgIDx0ZD5SZWFkIC8gV3JpdGUgPC90ZD4KLSAqICAgIDx0ZD5SZXF1aXJlZDwvdGQ+Ci0gKiAgICA8dGQ+RGVmYXVsdDwvdGQ+Ci0gKiAgICA8dGQ+RGVzY3JpcHRpb248L3RkPgotICogPC90cj4KLSAqCi0gKiAgPHRyPgotICogICAgPHRkPnRleHQ8L3RkPgotICogICAgPHRkPmphdmEubGFuZy5TdHJpbmc8L3RkPgotICogICAgPHRkPlIgLyBXPC90ZD4KLSAqICAgCTx0ZD55ZXM8L3RkPgotICoJCTx0ZD4mbmJzcDs8L3RkPgotICoJCTx0ZD5UaGUgdGV4dCBpbnNpZGUgdGhlIHRleHQgZmllbGQuCi0gKgotICogIDxwPldoZW4gdGhlIGZvcm0gaXMgc3VibWl0dGVkLCB0aGUgYmluZGluZyBpcyBvbmx5IHVwZGF0ZWQgaWYgdGhlIHZhbHVlCi0gKiAgaXMgdmFsaWQuPC90ZD4KLSAqCTwvdHI+Ci0gKgotICogIDx0cj4KLSAqICAgICAgPHRkPm1pbmltdW1MZW5ndGg8L3RkPgotICogICAgICA8dGQ+aW50PC90ZD4KLSAqICAgICAgPHRkPlI8L3RkPgotICogICAgICA8dGQ+bm88L3RkPgotICogICAgICA8dGQ+MDwvdGQ+Ci0gKiAgICAgIDx0ZD5UaGUgbWluaW11bSBsZW5ndGggKG51bWJlciBvZiBjaGFyYWN0ZXJzIHJlYWQpIGZvciB0aGUgZmllbGQuICBUaGUKLSAqICB2YWx1ZSBwcm92aWRlZCBpbiB0aGUgcmVxdWVzdCBpcyB0cmltbWVkIG9mIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UuCi0gKgotICogIDxwPklmIGEgZmllbGQgaXMgbm90IHJlcXVpcmVkIGFuZCBubyB2YWx1ZSBpcyBnaXZlbiwgdGhlbiBtaW5pbXVtTGVuZ3RoIGlzIGlnbm9yZWQuCi0gKiAgTWluaW11bSBsZW5ndGggb25seSBhcHBsaWVzIGlmIDxlbT5zb21lPC9lbT4gbm9uLW51bGwgdmFsdWUgaXMgZ2l2ZW4uPC90ZD4KLSAqICA8L3RyPgotICoKLSAqICA8dHI+Ci0gKiAgICAgIDx0ZD5yZXF1aXJlZDwvdGQ+Ci0gKiAgICAgIDx0ZD5ib29sZWFuPC90ZD4KLSAqICAgICAgPHRkPlI8L3RkPgotICogICAgICA8dGQ+bm88L3RkPgotICogICAgICA8dGQ+ZmFsc2U8L3RkPgotICogICAgICA8dGQ+SWYgdHJ1ZSwgdGhlbiBhIG5vbi1udWxsIHZhbHVlIG11c3QgYmUgcHJvdmlkZWQuICBBIHZhbHVlIGNvbnNpc3RpbmcKLSAqICBvbmx5IG9mIHdoaXRlc3BhY2UgaXMgY29uc2lkZXJlZCBudWxsLiA8L3RkPgotICogIDwvdHI+Ci0gKgotICogIDx0cj4KLSAqICAgICAgPHRkPmRpc3BsYXlOYW1lPC90ZD4KLSAqICAgICAgPHRkPlN0cmluZzwvdGQ+Ci0gKiAgICAgIDx0ZD5SPC90ZD4KLSAqICAgICAgPHRkPnllczwvdGQ+Ci0gKiAgICAgIDx0ZD4mbmJzcDs8L3RkPgotICogICAgICA8dGQ+QSB0ZXh0dWFsIG5hbWUgZm9yIHRoZSBmaWVsZCB0aGF0IGlzIHVzZWQgd2hlbiBmb3JtdWxhdGluZyBlcnJvciBtZXNzYWdlcy4KLSAqICAgICAgPC90ZD4KLSAqICA8L3RyPgotICoKLSAqCTwvdGFibGU+Ci0gKgotICogIDxwPk1heSBub3QgaGF2ZSBhIGJvZHkuICBNYXkgaGF2ZSBpbmZvcm1hbCBwYXJhbWV0ZXJzLgotICoKLSAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiAgQHZlcnNpb24gJElkJAotICogIEBzaW5jZSAxLjAuOAotICogIEBzZWUgVmFsaWRGaWVsZAotICogCi0gKiovCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBWYWxpZGF0aW5nVGV4dEZpZWxkIGV4dGVuZHMgVmFsaWRGaWVsZAotewotCXByaXZhdGUgSUJpbmRpbmcgbWluaW11bUxlbmd0aEJpbmRpbmc7Ci0JcHJpdmF0ZSBJQmluZGluZyByZXF1aXJlZEJpbmRpbmc7Ci0JcHJpdmF0ZSBJQmluZGluZyB2YWx1ZUJpbmRpbmc7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LnZhbGlkLlZhbGlkRmllbGQjZ2V0VmFsdWUoKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKQotCXsKLQkJaWYgKGdldFRleHRCaW5kaW5nKCkgIT0gbnVsbCkKLQkJewotCQkJcmV0dXJuIGdldFRleHRCaW5kaW5nKCkuZ2V0T2JqZWN0KCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmFwYWNoZS50YXBlc3RyeS52YWxpZC5WYWxpZEZpZWxkI3NldFZhbHVlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoT2JqZWN0IHZhbHVlKQotCXsKLQkJaWYoZ2V0VGV4dEJpbmRpbmcoKSAhPSBudWxsKSB7Ci0JCQlnZXRUZXh0QmluZGluZygpLnNldE9iamVjdCh2YWx1ZSk7Ci0JCX0JCQkKLQkJLy8gb3RoZXJ3aXNlIGRvIG5vdGhpbmcsIHdlIGhhdmUgbm93aGVyZSB0byBiaW5kIHRoZSB2YWx1ZSB0bwotCX0KLQotCXB1YmxpYyBJQmluZGluZyBnZXRWYWx1ZUJpbmRpbmcoKQotCXsKLQkJcmV0dXJuIHZhbHVlQmluZGluZzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZUJpbmRpbmcoSUJpbmRpbmcgYmluZGluZykKLQl7Ci0JCXZhbHVlQmluZGluZyA9IGJpbmRpbmc7Ci0JfQotCi0JLyoqIFJldHVybnMgdGhlIHZhbHVlQmluZGluZy4gKiovCi0JcHVibGljIElCaW5kaW5nIGdldFRleHRCaW5kaW5nKCkKLQl7Ci0JCXJldHVybiBnZXRWYWx1ZUJpbmRpbmcoKTsKLQl9Ci0KLQkvKiogVXBkYXRlcyB2YWx1ZUJpbmRpbmcuICoqLwotCXB1YmxpYyB2b2lkIHNldFRleHRCaW5kaW5nKElCaW5kaW5nIHZhbHVlKQotCXsKLQkJc2V0VmFsdWVCaW5kaW5nKHZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgSUJpbmRpbmcgZ2V0TWluaW11bUxlbmd0aEJpbmRpbmcoKQotCXsKLQkJcmV0dXJuIG1pbmltdW1MZW5ndGhCaW5kaW5nOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1pbmltdW1MZW5ndGhCaW5kaW5nKElCaW5kaW5nIHZhbHVlKQotCXsKLQkJbWluaW11bUxlbmd0aEJpbmRpbmcgPSB2YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgSUJpbmRpbmcgZ2V0UmVxdWlyZWRCaW5kaW5nKCkKLQl7Ci0JCXJldHVybiByZXF1aXJlZEJpbmRpbmc7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UmVxdWlyZWRCaW5kaW5nKElCaW5kaW5nIHJlcXVpcmVkQmluZGluZykKLQl7Ci0JCXRoaXMucmVxdWlyZWRCaW5kaW5nID0gcmVxdWlyZWRCaW5kaW5nOwotCX0KLQotCS8qKgotCSAqIE92ZXJyaWRlcyB7QGxpbmsgVmFsaWRGaWVsZCNnZXRWYWxpZGF0b3IoKX0gdG8gY29uc3RydWN0Ci0JICogYSB2YWxpZGF0b3Igb24gdGhlIGZseS4KLQkgKiAKLQkgKiovCi0JcHVibGljIElWYWxpZGF0b3IgZ2V0VmFsaWRhdG9yKCkKLQl7Ci0JCVN0cmluZ1ZhbGlkYXRvciB2YWxpZGF0b3IgPSBuZXcgU3RyaW5nVmFsaWRhdG9yKCk7Ci0KLQkJaWYgKHJlcXVpcmVkQmluZGluZyAhPSBudWxsKQotCQl7Ci0JCQlib29sZWFuIHJlcXVpcmVkID0gcmVxdWlyZWRCaW5kaW5nLmdldEJvb2xlYW4oKTsKLQotCQkJdmFsaWRhdG9yLnNldFJlcXVpcmVkKHJlcXVpcmVkKTsKLQkJfQotCi0JCWlmIChtaW5pbXVtTGVuZ3RoQmluZGluZyAhPSBudWxsKQotCQl7Ci0JCQlpbnQgbWluaW11bUxlbmd0aCA9IG1pbmltdW1MZW5ndGhCaW5kaW5nLmdldEludCgpOwotCi0JCQl2YWxpZGF0b3Iuc2V0TWluaW11bUxlbmd0aChtaW5pbXVtTGVuZ3RoKTsKLQkJfQotCi0JCXJldHVybiB2YWxpZGF0b3I7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi92YWxpZC9WYWxpZGF0aW5nVGV4dEZpZWxkLmp3YyBiL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi92YWxpZC9WYWxpZGF0aW5nVGV4dEZpZWxkLmp3YwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZkY2UwYS4uMDAwMDAwMAotLS0gYS9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdmFsaWQvVmFsaWRhdGluZ1RleHRGaWVsZC5qd2MKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gIAotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTwhLS0gJElkJCAtLT4KLTwhRE9DVFlQRSBjb21wb25lbnQtc3BlY2lmaWNhdGlvbiBQVUJMSUMgCi0gICItLy9BcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi8vVGFwZXN0cnkgU3BlY2lmaWNhdGlvbiAzLjAvL0VOIiAKLSAgImh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvdGFwZXN0cnkvZHRkL1RhcGVzdHJ5XzNfMC5kdGQiPgotICAKLTxjb21wb25lbnQtc3BlY2lmaWNhdGlvbiBjbGFzcz0ib3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLnZhbGlkLlZhbGlkYXRpbmdUZXh0RmllbGQiIGFsbG93LWJvZHk9Im5vIj4KLQotICA8cGFyYW1ldGVyIG5hbWU9ImRpc2FibGVkIiB0eXBlPSJib29sZWFuIiBkaXJlY3Rpb249ImluIi8+ICAKLSAgPHBhcmFtZXRlciBuYW1lPSJoaWRkZW4iIHR5cGU9ImJvb2xlYW4iIGRpcmVjdGlvbj0iaW4iLz4KLSAgPHBhcmFtZXRlciBuYW1lPSJkaXNwbGF5V2lkdGgiIHR5cGU9ImludCIgZGlyZWN0aW9uPSJpbiIvPgotICA8cGFyYW1ldGVyIG5hbWU9Im1heGltdW1MZW5ndGgiIHR5cGU9ImludCIgZGlyZWN0aW9uPSJpbiIvPgotCi0gIDxwYXJhbWV0ZXIgbmFtZT0idGV4dCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgcmVxdWlyZWQ9InllcyIgZGlyZWN0aW9uPSJjdXN0b20iLz4KLSAgPHBhcmFtZXRlciBuYW1lPSJkaXNwbGF5TmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgcmVxdWlyZWQ9InllcyIgZGlyZWN0aW9uPSJhdXRvIiAvPgotICA8cGFyYW1ldGVyIG5hbWU9Im1pbmltdW1MZW5ndGgiIHR5cGU9ImphdmEubGFuZy5JbnRlZ2VyIiBkaXJlY3Rpb249ImN1c3RvbSIgLz4KLSAgPHBhcmFtZXRlciBuYW1lPSJyZXF1aXJlZCIgZGlyZWN0aW9uPSJjdXN0b20iIC8+Ci0gCi0gIDxyZXNlcnZlZC1wYXJhbWV0ZXIgbmFtZT0idHlwZSIvPgotICA8cmVzZXJ2ZWQtcGFyYW1ldGVyIG5hbWU9InZhbHVlIi8+Ci0gIAotICA8cHJvcGVydHktc3BlY2lmaWNhdGlvbiBuYW1lPSJuYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+Ci0gIDxwcm9wZXJ0eS1zcGVjaWZpY2F0aW9uIG5hbWU9ImZvcm0iIHR5cGU9Im9yZy5hcGFjaGUudGFwZXN0cnkuSUZvcm0iLz4KLQotPC9jb21wb25lbnQtc3BlY2lmaWNhdGlvbj4KZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi92YWxpZC9wYWNrYWdlLmh0bWwgYi9jb250cmliL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbnRyaWIvdmFsaWQvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDFjYTc0Li4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29udHJpYi92YWxpZC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi08IWRvY3R5cGUgaHRtbCBwdWJsaWMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotPCEtLSAkSWQkIC0tPgotPGh0bWw+Ci08aGVhZD4KLTwvaGVhZD4KLTxib2R5PgotCi1CYWNrd2FyZHMgY29tcGF0aWJsZSB2ZXJzaW9ucyBvZiBUYXBlc3RyeSAxLjAuNydzIHZhbGlkYXRpbmcgdGV4dCBmaWVsZHMsIAotYnVpbHQgYXMgd3JhcHBlcnMKLWFyb3VuZCB0aGUgMS4wLjggdmVyc2lvbnMuCi0KLTxwPkFsbCB0aGF0IGlzIG5lY2Vzc2FyeSB0byB1c2UgdGhlc2Ugd2l0aG91dCBjaGFuZ2luZyBleGlzdGluZyBQYWdlcyAKLShidWlsdCBhZ2FpbnN0IDEuMC43IG9yIGVhcmxpZXIpCi1pcyB0byBhZGQgYWxpYXNlcyBmb3IgdGhlc2UgY29tcG9uZW50cyB0byB0aGUgCi1hcHBsaWNhdGlvbiBzcGVjaWZpY2F0aW9uLgotCi1AYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwIDxhIGhyZWY9Im1haWx0bzpobHNoaXBAYXBhY2hlLm9yZyI+aGxzaGlwQGFwYWNoZS5vcmc8L2E+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay8uY3ZzaWdub3JlIGIvZnJhbWV3b3JrLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiM2JlNWYuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLXRhcmdldAotY2xhc3NlcwpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL01FVEEtSU5GL3RhZ2xpYi50bGQgYi9mcmFtZXdvcmsvTUVUQS1JTkYvdGFnbGliLnRsZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdjMWFlNS4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvTUVUQS1JTkYvdGFnbGliLnRsZAorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAkSWQkIC0tPgotPCFET0NUWVBFIHRhZ2xpYiBQVUJMSUMgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBKU1AgVGFnIExpYnJhcnkgMS4yLy9FTiIKLQkiaHR0cDovL2phdmEuc3VuLmNvbS9qMmVlL2R0ZHMvd2ViLWpzcHRhZ2xpYnJhcnlfMV8yLmR0ZCI+Ci08dGFnbGliPgotCTx0bGliLXZlcnNpb24+MS4wPC90bGliLXZlcnNpb24+Ci0JPGpzcC12ZXJzaW9uPjEuMjwvanNwLXZlcnNpb24+Ci0JPHNob3J0LW5hbWU+dGFwZXN0cnk8L3Nob3J0LW5hbWU+Ci0JPHVyaT5odHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL3RhcGVzdHJ5L3RsZC90YXBlc3RyeV8xXzAudGxkPC91cmk+Ci0JPGRpc3BsYXktbmFtZT5UYXBlc3RyeTwvZGlzcGxheS1uYW1lPgotCTxkZXNjcmlwdGlvbj5UYXBlc3RyeSBKU1AgdGFnbGlicmFyeSBmb3IgcHJvdmlkaW5nIHJ1ZGltZW50YXJ5IGFjY2VzcyB0byBhIFRhcGVzdHJ5IGFwcGxpY2F0aW9uLjwvZGVzY3JpcHRpb24+Ci0JPHRhZz4KLQkJPG5hbWU+cGFnZTwvbmFtZT4KLQkJPHRhZy1jbGFzcz5vcmcuYXBhY2hlLnRhcGVzdHJ5LmpzcC5QYWdlVGFnPC90YWctY2xhc3M+Ci0JCTxib2R5LWNvbnRlbnQ+SlNQPC9ib2R5LWNvbnRlbnQ+Ci0JCTxkaXNwbGF5LW5hbWU+UGFnZTwvZGlzcGxheS1uYW1lPgotCQk8ZGVzY3JpcHRpb24+Q3JlYXRlcyBhIGxpbmsgdG8gYSBuYW1lZCBwYWdlIHdpdGhpbiBhIFRhcGVzdHJ5Ci0JCQlhcHBsaWNhdGlvbi48L2Rlc2NyaXB0aW9uPgotCQk8YXR0cmlidXRlPgotCQkJPG5hbWU+c2VydmxldDwvbmFtZT4KLQkJCTxyZXF1aXJlZD5ubzwvcmVxdWlyZWQ+Ci0JCQk8cnRleHBydmFsdWU+eWVzPC9ydGV4cHJ2YWx1ZT4KLQkJCTx0eXBlPmphdmEubGFuZy5TdHJpbmc8L3R5cGU+Ci0JCQk8ZGVzY3JpcHRpb24+VGhlIHJlbGF0aXZlIHBhdGggdG8gdGhlIHNlcnZsZXQgZm9yIHRoZSBhcHBsaWNhdGlvbi4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzICIvYXBwIi48L2Rlc2NyaXB0aW9uPgotCQk8L2F0dHJpYnV0ZT4KLQkJPGF0dHJpYnV0ZT4KLQkJCTxuYW1lPnBhZ2U8L25hbWU+Ci0JCQk8cmVxdWlyZWQ+eWVzPC9yZXF1aXJlZD4KLQkJCTxydGV4cHJ2YWx1ZT55ZXM8L3J0ZXhwcnZhbHVlPgotCQkJPHR5cGU+amF2YS5sYW5nLlN0cmluZzwvdHlwZT4KLQkJCTxkZXNjcmlwdGlvbj5UaGUgbmFtZSBvZiB0aGUgcGFnZSB3aXRoaW4gdGhlIGFwcGxpY2F0aW9uLjwvZGVzY3JpcHRpb24+Ci0JCTwvYXR0cmlidXRlPgotCQk8YXR0cmlidXRlPgotCQkJPG5hbWU+c3R5bGVDbGFzczwvbmFtZT4KLQkJCTxyZXF1aXJlZD5ubzwvcmVxdWlyZWQ+Ci0JCQk8cnRleHBydmFsdWU+eWVzPC9ydGV4cHJ2YWx1ZT4KLQkJCTx0eXBlPmphdmEubGFuZy5TdHJpbmc8L3R5cGU+Ci0JCQk8ZGVzY3JpcHRpb24+VGhlIENTUyBzdHlsZSBjbGFzcyBmb3IgdGhlIHJlbmRlcmVkIHRhZy48L2Rlc2NyaXB0aW9uPgotCQk8L2F0dHJpYnV0ZT4KLQk8L3RhZz4KLQk8dGFnPgotCQk8bmFtZT5wYWdlLXVybDwvbmFtZT4KLQkJPHRhZy1jbGFzcz5vcmcuYXBhY2hlLnRhcGVzdHJ5LmpzcC5QYWdlVVJMVGFnPC90YWctY2xhc3M+Ci0JCTxib2R5LWNvbnRlbnQ+ZW1wdHk8L2JvZHktY29udGVudD4KLQkJPGRpc3BsYXktbmFtZT5QYWdlIFVSTDwvZGlzcGxheS1uYW1lPgotCQk8ZGVzY3JpcHRpb24+SW5zZXJ0cyBhIFVSTCB0byBhIG5hbWVkIHBhZ2Ugd2l0aGluIGEgVGFwZXN0cnkKLQkJCWFwcGxpY2F0aW9uLjwvZGVzY3JpcHRpb24+Ci0JCTxhdHRyaWJ1dGU+Ci0JCQk8bmFtZT5zZXJ2bGV0PC9uYW1lPgotCQkJPHJlcXVpcmVkPm5vPC9yZXF1aXJlZD4KLQkJCTxydGV4cHJ2YWx1ZT55ZXM8L3J0ZXhwcnZhbHVlPgotCQkJPHR5cGU+amF2YS5sYW5nLlN0cmluZzwvdHlwZT4KLQkJCTxkZXNjcmlwdGlvbj5UaGUgcmVsYXRpdmUgcGF0aCB0byB0aGUgc2VydmxldCBmb3IgdGhlIGFwcGxpY2F0aW9uLiAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgIi9hcHAiLjwvZGVzY3JpcHRpb24+Ci0JCTwvYXR0cmlidXRlPgotCQk8YXR0cmlidXRlPgotCQkJPG5hbWU+cGFnZTwvbmFtZT4KLQkJCTxyZXF1aXJlZD55ZXM8L3JlcXVpcmVkPgotCQkJPHJ0ZXhwcnZhbHVlPnllczwvcnRleHBydmFsdWU+Ci0JCQk8dHlwZT5qYXZhLmxhbmcuU3RyaW5nPC90eXBlPgotCQkJPGRlc2NyaXB0aW9uPlRoZSBuYW1lIG9mIHRoZSBwYWdlIHdpdGhpbiB0aGUgYXBwbGljYXRpb24uPC9kZXNjcmlwdGlvbj4KLQkJPC9hdHRyaWJ1dGU+Ci0JPC90YWc+Ci0JPHRhZz4KLQkJPG5hbWU+ZXh0ZXJuYWw8L25hbWU+Ci0JCTx0YWctY2xhc3M+b3JnLmFwYWNoZS50YXBlc3RyeS5qc3AuRXh0ZXJuYWxUYWc8L3RhZy1jbGFzcz4KLQkJPGJvZHktY29udGVudD5KU1A8L2JvZHktY29udGVudD4KLQkJPGRpc3BsYXktbmFtZT5FeHRlcm5hbDwvZGlzcGxheS1uYW1lPgotCQk8ZGVzY3JpcHRpb24+Q3JlYXRlcyBhIGxpbmssIHdpdGggcGFyYW1ldGVycywgdG8gYW4gZXh0ZXJuYWwgcGFnZSB3aXRoaW4gYSBUYXBlc3RyeSBhcHBsaWNhdGlvbi48L2Rlc2NyaXB0aW9uPgotCQk8YXR0cmlidXRlPgotCQkJPG5hbWU+c2VydmxldDwvbmFtZT4KLQkJCTxyZXF1aXJlZD5ubzwvcmVxdWlyZWQ+Ci0JCQk8cnRleHBydmFsdWU+eWVzPC9ydGV4cHJ2YWx1ZT4KLQkJCTx0eXBlPmphdmEubGFuZy5TdHJpbmc8L3R5cGU+Ci0JCQk8ZGVzY3JpcHRpb24+VGhlIHJlbGF0aXZlIHBhdGggdG8gdGhlIHNlcnZsZXQgZm9yIHRoZSBhcHBsaWNhdGlvbi4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzICIvYXBwIi48L2Rlc2NyaXB0aW9uPgotCQk8L2F0dHJpYnV0ZT4KLQkJPGF0dHJpYnV0ZT4KLQkJCTxuYW1lPnBhZ2U8L25hbWU+Ci0JCQk8cmVxdWlyZWQ+eWVzPC9yZXF1aXJlZD4KLQkJCTxydGV4cHJ2YWx1ZT55ZXM8L3J0ZXhwcnZhbHVlPgotCQkJPHR5cGU+amF2YS5sYW5nLlN0cmluZzwvdHlwZT4KLQkJCTxkZXNjcmlwdGlvbj5UaGUgbmFtZSBvZiB0aGUgcGFnZSB3aXRoaW4gdGhlIGFwcGxpY2F0aW9uLCB3aGljaCBtdXN0IGJlIGFuIGV4dGVybmFsIHBhZ2UuPC9kZXNjcmlwdGlvbj4KLQkJPC9hdHRyaWJ1dGU+Ci0JCTxhdHRyaWJ1dGU+Ci0JCQk8bmFtZT5zdHlsZUNsYXNzPC9uYW1lPgotCQkJPHJlcXVpcmVkPm5vPC9yZXF1aXJlZD4KLQkJCTxydGV4cHJ2YWx1ZT55ZXM8L3J0ZXhwcnZhbHVlPgotCQkJPHR5cGU+amF2YS5sYW5nLlN0cmluZzwvdHlwZT4KLQkJCTxkZXNjcmlwdGlvbj5UaGUgQ1NTIHN0eWxlIGNsYXNzIGZvciB0aGUgcmVuZGVyZWQgdGFnLjwvZGVzY3JpcHRpb24+Ci0JCTwvYXR0cmlidXRlPgotCQk8YXR0cmlidXRlPgotCQkJPG5hbWU+cGFyYW1ldGVyczwvbmFtZT4KLQkJCTxyZXF1aXJlZD5ubzwvcmVxdWlyZWQ+Ci0JCQk8cnRleHBydmFsdWU+eWVzPC9ydGV4cHJ2YWx1ZT4KLQkJCTx0eXBlPmphdmEubGFuZy5TdHJpbmc8L3R5cGU+Ci0JCQk8ZGVzY3JpcHRpb24+RWl0aGVyIGEgc2luZ2xlIHN0cmluZyB0byBwYXNzIGFzIGEgcGFyYW1ldGVyLCBvciAoaWYgcHJlZml4ZWQgd2l0aCAib2dubDoiKSBhbiBPR05MIGV4cHJlc3Npb24gZXZhbHVhdGVkIGFnYWluc3QgdGhlIHBhZ2VDb250ZXh0LjwvZGVzY3JpcHRpb24+Ci0JCTwvYXR0cmlidXRlPgotCTwvdGFnPgotCTx0YWc+Ci0JCTxuYW1lPmV4dGVybmFsLXVybDwvbmFtZT4KLQkJPHRhZy1jbGFzcz5vcmcuYXBhY2hlLnRhcGVzdHJ5LmpzcC5FeHRlcm5hbFVSTFRhZzwvdGFnLWNsYXNzPgotCQk8Ym9keS1jb250ZW50PmVtcHR5PC9ib2R5LWNvbnRlbnQ+Ci0JCTxkaXNwbGF5LW5hbWU+RXh0ZXJuYWwgVVJMPC9kaXNwbGF5LW5hbWU+Ci0JCTxkZXNjcmlwdGlvbj5JbnNlcnRzIGEgVVJMIHRvIGFuIGV4dGVybmFsIHBhZ2Ugd2l0aGluIGEgVGFwZXN0cnkgYXBwbGljYXRpb24sIGluY2x1ZGluZyBzZXJ2aWNlIHBhcmFtZXRlcnMuPC9kZXNjcmlwdGlvbj4KLQkJPGF0dHJpYnV0ZT4KLQkJCTxuYW1lPnNlcnZsZXQ8L25hbWU+Ci0JCQk8cmVxdWlyZWQ+bm88L3JlcXVpcmVkPgotCQkJPHJ0ZXhwcnZhbHVlPnllczwvcnRleHBydmFsdWU+Ci0JCQk8dHlwZT5qYXZhLmxhbmcuU3RyaW5nPC90eXBlPgotCQkJPGRlc2NyaXB0aW9uPlRoZSByZWxhdGl2ZSBwYXRoIHRvIHRoZSBzZXJ2bGV0IGZvciB0aGUgYXBwbGljYXRpb24uICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAiL2FwcCIuPC9kZXNjcmlwdGlvbj4KLQkJPC9hdHRyaWJ1dGU+Ci0JCTxhdHRyaWJ1dGU+Ci0JCQk8bmFtZT5wYWdlPC9uYW1lPgotCQkJPHJlcXVpcmVkPnllczwvcmVxdWlyZWQ+Ci0JCQk8cnRleHBydmFsdWU+eWVzPC9ydGV4cHJ2YWx1ZT4KLQkJCTx0eXBlPmphdmEubGFuZy5TdHJpbmc8L3R5cGU+Ci0JCQk8ZGVzY3JpcHRpb24+VGhlIG5hbWUgb2YgdGhlIHBhZ2Ugd2l0aGluIHRoZSBhcHBsaWNhdGlvbiwgd2hpY2ggbXVzdCBiZSBhbiBleHRlcm5hbCBwYWdlLjwvZGVzY3JpcHRpb24+Ci0JCTwvYXR0cmlidXRlPgotCQk8YXR0cmlidXRlPgotCQkJPG5hbWU+cGFyYW1ldGVyczwvbmFtZT4KLQkJCTxyZXF1aXJlZD5ubzwvcmVxdWlyZWQ+Ci0JCQk8cnRleHBydmFsdWU+eWVzPC9ydGV4cHJ2YWx1ZT4KLQkJCTx0eXBlPmphdmEubGFuZy5TdHJpbmc8L3R5cGU+Ci0JCQk8ZGVzY3JpcHRpb24+RWl0aGVyIGEgc2luZ2xlIHN0cmluZyB0byBwYXNzIGFzIGEgcGFyYW1ldGVyLCBvciAoaWYgcHJlZml4ZWQgd2l0aCAib2dubDoiKSBhbiBPR05MIGV4cHJlc3Npb24gZXZhbHVhdGVkIGFnYWluc3QgdGhlIHBhZ2VDb250ZXh0LjwvZGVzY3JpcHRpb24+Ci0JCTwvYXR0cmlidXRlPgotCTwvdGFnPgotPC90YWdsaWI+CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvYnVpbGQueG1sIGIvZnJhbWV3b3JrL2J1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDUyZWRjMS4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tICRJZCQgLS0+Ci08cHJvamVjdCBuYW1lPSJUYXBlc3RyeSBGcmFtZXdvcmsiIGRlZmF1bHQ9Imluc3RhbGwiPgotCTxwcm9wZXJ0eSBuYW1lPSJyb290LmRpciIgdmFsdWU9Ii4uIi8+Ci0JPHByb3BlcnR5IGZpbGU9IiR7cm9vdC5kaXJ9L2NvbmZpZy9WZXJzaW9uLnByb3BlcnRpZXMiLz4KLQk8cHJvcGVydHkgZmlsZT0iJHtyb290LmRpcn0vY29uZmlnL2NvbW1vbi5wcm9wZXJ0aWVzIi8+Ci0JPHByb3BlcnR5IGZpbGU9IiR7cm9vdC5kaXJ9L2NvbmZpZy9idWlsZC5wcm9wZXJ0aWVzIi8+Ci0JCi0JPHBhdGggaWQ9InByb2plY3QuY2xhc3MucGF0aCI+Ci0JCTxmaWxlc2V0IGRpcj0iJHtyb290LmxpYi5kaXJ9Ij4KLQkJCTxpbmNsdWRlIG5hbWU9IiR7ZXh0LmRpcn0vKi5qYXIiLz4KLQkJPC9maWxlc2V0PgotCQk8ZmlsZXNldCBkaXI9IiR7cm9vdC5saWIuZGlyfSI+Ci0JCQk8aW5jbHVkZSBuYW1lPSIke2oyZWUuZGlyfS8qLmphciIvPgotCQk8L2ZpbGVzZXQ+Ci0JPC9wYXRoPgotCTx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0JCTxta2RpciBkaXI9IiR7Y2xhc3Nlcy5kaXJ9Ii8+Ci0JPC90YXJnZXQ+Ci0JPHRhcmdldCBuYW1lPSJjbGVhbiI+Ci0JCTxkZWxldGUgZGlyPSIke2NsYXNzZXMuZGlyfSIvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJjb21waWxlIiBkZXBlbmRzPSJpbml0IgotCQlkZXNjcmlwdGlvbj0iQ29tcGlsZSBhbGwgY2xhc3NlcyBpbiB0aGUgZnJhbWV3b3JrLiI+Ci0JCTxqYXZhYyBzcmNkaXI9IiR7c3JjLmRpcn0iIGRlc3RkaXI9IiR7Y2xhc3Nlcy5kaXJ9IiBkZWJ1Zz0ib24iCi0JCQl0YXJnZXQ9IjEuMSIgc291cmNlPSIxLjMiPgotCQkJPGNsYXNzcGF0aCByZWZpZD0icHJvamVjdC5jbGFzcy5wYXRoIi8+Ci0JCTwvamF2YWM+Ci0JPC90YXJnZXQ+Ci0JPHRhcmdldCBuYW1lPSJpbnN0YWxsIiBkZXBlbmRzPSJjb21waWxlIgotCQlkZXNjcmlwdGlvbj0iQ29tcGlsZSBhbGwgY2xhc3NlcyBhbmQgYnVpbGQgdGhlIGluc3RhbGxlZCBKQVIgaW5jbHVkaW5nIGFsbCBwYWNrYWdlIHJlc291cmNlcy4iCi0JCT4KLQkJPGNvcHkgZmlsZT0iJHtyb290LmRpcn0vY29uZmlnL1ZlcnNpb24ucHJvcGVydGllcyIKLQkJCXRvZGlyPSIke2NsYXNzZXMuZGlyfS9vcmcvYXBhY2hlL3RhcGVzdHJ5Ii8+Ci0JCTxqYXIgamFyZmlsZT0iJHtyb290LmxpYi5kaXJ9LyR7ZnJhbWV3b3JrLmphcn0iPgotCQkJPGZpbGVzZXQgZGlyPSIke2NsYXNzZXMuZGlyfSI+Ci0JCQk8L2ZpbGVzZXQ+Ci0KLQkJCTxmaWxlc2V0IGRpcj0iJHtzcmMuZGlyfSI+Ci0JCQkJPGV4Y2x1ZGUgbmFtZT0iKiovKi5qYXZhIi8+Ci0JCQkJPGV4Y2x1ZGUgbmFtZT0iKiovcGFja2FnZS5odG1sIi8+Ci0JCQk8L2ZpbGVzZXQ+Ci0JCQkKLQkJCTxtZXRhaW5mIGRpcj0iTUVUQS1JTkYiPgotCQkJCTxpbmNsdWRlIG5hbWU9IioiLz4KLQkJCTwvbWV0YWluZj4KLQkJPC9qYXI+Ci0KLQk8L3RhcmdldD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9BYnN0cmFjdENvbXBvbmVudC5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L0Fic3RyYWN0Q29tcG9uZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlNDA2ZWMuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L0Fic3RyYWN0Q29tcG9uZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQ2ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5OwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb2dubC5PZ25sUnVudGltZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuYmVhbi5CZWFuUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5iZWFuLkJlYW5Qcm92aWRlclByb3BlcnR5QWNjZXNzb3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5lbmdpbmUuSVBhZ2VMb2FkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5ldmVudC5DaGFuZ2VPYnNlcnZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmV2ZW50LlBhZ2VEZXRhY2hMaXN0ZW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmV2ZW50LlBhZ2VFdmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmV2ZW50LlBhZ2VSZW5kZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmV2ZW50LlBhZ2VWYWxpZGF0ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkubGlzdGVuZXIuTGlzdGVuZXJNYXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5wYXJhbS5QYXJhbWV0ZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuc3BlYy5CYXNlTG9jYXRhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuc3BlYy5JQ29tcG9uZW50U3BlY2lmaWNhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnV0aWwucHJvcC5PZ25sVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS51dGlsLnByb3AuUHJvcGVydHlGaW5kZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS51dGlsLnByb3AuUHJvcGVydHlJbmZvOwotCi0vKioKLSAqICBBYnN0cmFjdCBiYXNlIGNsYXNzIGltcGxlbWVudGluZyB0aGUge0BsaW5rIElDb21wb25lbnR9IGludGVyZmFjZS4KLSAqCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogIEB2ZXJzaW9uICRJZCQKLSAqIAotICoqLwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RDb21wb25lbnQgZXh0ZW5kcyBCYXNlTG9jYXRhYmxlIGltcGxlbWVudHMgSUNvbXBvbmVudAotewotICAgIC8qKgotICAgICAqIFVzZWQgdG8gY2hlY2sgdGhhdCBzdWJjbGFzc2VzIGludm9rZSB0aGlzIGltcGxlbWVudGF0aW9uIG9mIHByZXBhcmVGb3JSZW5kZXIoKS4KLSAgICAgKiBAc2VlIFRhcGVzdHJ5I2NoZWNrTWV0aG9kSW52b2NhdGlvbihPYmplY3QsIFN0cmluZywgT2JqZWN0KQotICAgICAqIEBzaW5jZSAzLjAKLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgUFJFUEFSRUZPUlJFTkRFUl9NRVRIT0RfSUQgPSAiQWJzdHJhY3RDb21wb25lbnQucHJlcGFyZUZvclJlbmRlcigpIjsKLQotICAgIC8qKgotICAgICAqIFVzZWQgdG8gY2hlY2sgdGhhdCBzdWJjbGFzc2VzIGludm9rZSB0aGlzIGltcGxlbWVudGF0aW9uIG9mIGNsZWFudXBBZnRlclJlbmRlcigpLgotICAgICAqIEBzZWUgVGFwZXN0cnkjY2hlY2tNZXRob2RJbnZvY2F0aW9uKE9iamVjdCwgU3RyaW5nLCBPYmplY3QpCi0gICAgICogQHNpbmNlIDMuMAotICAgICAqLwotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIENMRUFOVVBBRlRFUlJFTkRFUl9NRVRIT0RfSUQgPQotICAgICAgICAiQWJzdHJhY3RDb21wb25lbnQuY2xlYW51cEFmdGVyUmVuZGVyKCkiOwotCi0gICAgc3RhdGljIHsKLSAgICAgICAgLy8gUmVnaXN0ZXIgdGhlIEJlYW5Qcm92aWRlckhlbHBlciB0byBwcm92aWRlIGFjY2VzcyB0byB0aGUKLSAgICAgICAgLy8gYmVhbnMgb2YgYSBiZWFuIHByb3ZpZGVyIGFzIG5hbWVkIHByb3BlcnRpZXMuCi0KLSAgICAgICAgT2dubFJ1bnRpbWUuc2V0UHJvcGVydHlBY2Nlc3NvcihJQmVhblByb3ZpZGVyLmNsYXNzLCBuZXcgQmVhblByb3ZpZGVyUHJvcGVydHlBY2Nlc3NvcigpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgVGhlIHNwZWNpZmljYXRpb24gdXNlZCB0byBvcmlnaW5hbGx5IGJ1aWxkIHRoZSBjb21wb25lbnQuCi0gICAgICoKLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwcml2YXRlIElDb21wb25lbnRTcGVjaWZpY2F0aW9uIF9zcGVjaWZpY2F0aW9uOwotCi0gICAgLyoqCi0gICAgICogIFRoZSBwYWdlIHRoYXQgY29udGFpbnMgdGhlIGNvbXBvbmVudCwgcG9zc2libHkgaXRzZWxmIChpZiB0aGUgY29tcG9uZW50IGlzCi0gICAgICogIGluIGZhY3QsIGEgcGFnZSkuCi0gICAgICoKLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwcml2YXRlIElQYWdlIF9wYWdlOwotCi0gICAgLyoqCi0gICAgICogIFRoZSBjb21wb25lbnQgd2hpY2ggY29udGFpbnMgdGhlIGNvbXBvbmVudC4gIFRoaXMgd2lsbCBvbmx5IGJlCi0gICAgICogIG51bGwgaWYgdGhlIGNvbXBvbmVudCBpcyBhY3R1YWxseSBhIHBhZ2UuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwcml2YXRlIElDb21wb25lbnQgX2NvbnRhaW5lcjsKLQotICAgIC8qKgotICAgICAqICBUaGUgc2ltcGxlIGlkIG9mIHRoaXMgY29tcG9uZW50LgotICAgICAqCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgX2lkOwotCi0gICAgLyoqCi0gICAgICogIFRoZSBmdWxseSBxdWFsaWZpZWQgaWQgb2YgdGhpcyBjb21wb25lbnQuICBUaGlzIGlzIGNhbGN1bGF0ZWQgdGhlIGZpcnN0IHRpbWUKLSAgICAgKiAgaXQgaXMgbmVlZGVkLCB0aGVuIGNhY2hlZCBmb3IgbGF0ZXIuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwcml2YXRlIFN0cmluZyBfaWRQYXRoOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BUF9TSVpFID0gNTsKLQotICAgIC8qKgotICAgICAqICBBIHtAbGluayBNYXB9IG9mIGFsbCBiaW5kaW5ncyAoZm9yIHdoaWNoIHRoZXJlIGlzbid0IGEgY29ycmVzcG9uZGluZwotICAgICAqICBKYXZhQmVhbnMgcHJvcGVydHkpOyB0aGUga2V5cyBhcmUgdGhlIG5hbWVzIG9mIGZvcm1hbCBhbmQgaW5mb3JtYWwKLSAgICAgKiAgcGFyYW1ldGVycy4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHByaXZhdGUgTWFwIF9iaW5kaW5nczsKLQotICAgIHByaXZhdGUgTWFwIF9jb21wb25lbnRzOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCT0RZX0lOSVRfU0laRSA9IDU7Ci0KLSAgICBwcml2YXRlIElOYW1lc3BhY2UgX25hbWVzcGFjZTsKLQotICAgIC8qKgotICAgICAqICBVc2VkIGluIHBsYWNlIG9mIEpESyAxLjMncyBDb2xsZWN0aW9ucy5FTVBUWV9NQVAgKHdoaWNoIGlzIG5vdAotICAgICAqICBhdmFpbGFibGUgaW4gSkRLIDEuMikuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXAgRU1QVFlfTUFQID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKG5ldyBIYXNoTWFwKDEpKTsKLQotICAgIC8qKgotICAgICAqICBUaGUgbnVtYmVyIG9mIHtAbGluayBJUmVuZGVyfSBvYmplY3RzIGluIHRoZSBib2R5IG9mCi0gICAgICogIHRoaXMgY29tcG9uZW50LgotICAgICAqCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHJpdmF0ZSBpbnQgX2JvZHlDb3VudCA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiAgQW4gYXJheSBvZiBlbGVtZW50cyBpbiB0aGUgYm9keSBvZiB0aGlzIGNvbXBvbmVudC4KLSAgICAgKgotICAgICAqIAotICAgICAqKi8KLQotICAgIHByaXZhdGUgSVJlbmRlcltdIF9ib2R5OwotCi0gICAgLyoqCi0gICAgICogIFRoZSBjb21wb25lbnRzJyBhc3NldCBtYXAuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwcml2YXRlIE1hcCBfYXNzZXRzOwotCi0gICAgLyoqCi0gICAgICogIEEgbWFwcGluZyB0aGF0IGFsbG93cyBwdWJsaWMgaW5zdGFuY2UgbWV0aG9kcyB0byBiZSBkcmVzc2VkIHVwCi0gICAgICogIGFzIHtAbGluayBJQWN0aW9uTGlzdGVuZXJ9IGxpc3RlbmVyCi0gICAgICogIG9iamVjdHMuCi0gICAgICoKLSAgICAgKiAgQHNpbmNlIDEuMC4yCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHJpdmF0ZSBMaXN0ZW5lck1hcCBfbGlzdGVuZXJzOwotCi0gICAgLyoqCi0gICAgICogIEEgYmVhbiBwcm92aWRlcjsgdGhlc2UgYXJlIGxhemlseSBjcmVhdGVkIGFzIG5lZWRlZC4KLSAgICAgKgotICAgICAqICBAc2luY2UgMS4wLjQKLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwcml2YXRlIElCZWFuUHJvdmlkZXIgX2JlYW5zOwotCi0gICAgLyoqCi0gICAgICogIE1hbmFnZXMgc2V0dGluZyBhbmQgY2xlYXJpbmcgcGFyYW1ldGVyIHByb3BlcnRpZXMgZm9yIHRoZSBjb21wb25lbnQuCi0gICAgICogCi0gICAgICogIEBzaW5jZSAyLjAuMwotICAgICAqIAotICAgICAqKi8KLQotICAgIHByaXZhdGUgUGFyYW1ldGVyTWFuYWdlciBfcGFyYW1ldGVyTWFuYWdlcjsKLQotICAgIC8qKgotICAgICAqICBQcm92aWRlcyBhY2Nlc3MgdG8gbG9jYWxpemVkIFN0cmluZ3MgZm9yIHRoaXMgY29tcG9uZW50LgotICAgICAqIAotICAgICAqICBAc2luY2UgMi4wLjQKLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwcml2YXRlIElNZXNzYWdlcyBfc3RyaW5nczsKLQotICAgIHB1YmxpYyB2b2lkIGFkZEFzc2V0KFN0cmluZyBuYW1lLCBJQXNzZXQgYXNzZXQpCi0gICAgewotICAgICAgICBpZiAoX2Fzc2V0cyA9PSBudWxsKQotICAgICAgICAgICAgX2Fzc2V0cyA9IG5ldyBIYXNoTWFwKE1BUF9TSVpFKTsKLQotICAgICAgICBfYXNzZXRzLnB1dChuYW1lLCBhc3NldCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkQ29tcG9uZW50KElDb21wb25lbnQgY29tcG9uZW50KQotICAgIHsKLSAgICAgICAgaWYgKF9jb21wb25lbnRzID09IG51bGwpCi0gICAgICAgICAgICBfY29tcG9uZW50cyA9IG5ldyBIYXNoTWFwKE1BUF9TSVpFKTsKLQotICAgICAgICBfY29tcG9uZW50cy5wdXQoY29tcG9uZW50LmdldElkKCksIGNvbXBvbmVudCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEFkZHMgYW4gZWxlbWVudCAod2hpY2ggbWF5IGJlIHN0YXRpYyB0ZXh0IG9yIGEgY29tcG9uZW50KSBhcyBhIGJvZHkKLSAgICAgKiAgZWxlbWVudCBvZiB0aGlzIGNvbXBvbmVudC4gIFN1Y2ggZWxlbWVudHMgYXJlIHJlbmRlcmVkCi0gICAgICogIGJ5IHtAbGluayAjcmVuZGVyQm9keShJTWFya3VwV3JpdGVyLCBJUmVxdWVzdEN5Y2xlKX0uCi0gICAgICoKLSAgICAgKiAgQHNpbmNlIDIuMgotICAgICAqIAotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIGFkZEJvZHkoSVJlbmRlciBlbGVtZW50KQotICAgIHsKLSAgICAgICAgLy8gU2hvdWxkIGNoZWNrIHRoZSBzcGVjaWZpY2F0aW9uIHRvIHNlZSBpZiB0aGlzIGNvbXBvbmVudAotICAgICAgICAvLyBhbGxvd3MgYm9keS4gIEN1cmVudGx5LCB0aGlzIGlzIGNoZWNrZWQgYnkgdGhlIGNvbXBvbmVudAotICAgICAgICAvLyBpbiByZW5kZXIoKSwgd2hpY2ggaXMgc2lsbHkuCi0KLSAgICAgICAgaWYgKF9ib2R5ID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9ib2R5ID0gbmV3IElSZW5kZXJbQk9EWV9JTklUX1NJWkVdOwotICAgICAgICAgICAgX2JvZHlbMF0gPSBlbGVtZW50OwotCi0gICAgICAgICAgICBfYm9keUNvdW50ID0gMTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIE5vIG1vcmUgcm9vbT8gIE1ha2UgdGhlIGFycmF5IGJpZ2dlci4KLQotICAgICAgICBpZiAoX2JvZHlDb3VudCA9PSBfYm9keS5sZW5ndGgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIElSZW5kZXJbXSBuZXdXcmFwcGVkOwotCi0gICAgICAgICAgICBuZXdXcmFwcGVkID0gbmV3IElSZW5kZXJbX2JvZHkubGVuZ3RoICogMl07Ci0KLSAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoX2JvZHksIDAsIG5ld1dyYXBwZWQsIDAsIF9ib2R5Q291bnQpOwotCi0gICAgICAgICAgICBfYm9keSA9IG5ld1dyYXBwZWQ7Ci0gICAgICAgIH0KLQotICAgICAgICBfYm9keVtfYm9keUNvdW50KytdID0gZWxlbWVudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgUmVnaXN0ZXJzIHRoaXMgY29tcG9uZW50IGFzIGEgbGlzdGVuZXIgb2YgdGhlIHBhZ2UgaWYgaXQKLSAgICAgKiAgaW1wbGVtZW50cyB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5ldmVudC5QYWdlRGV0YWNoTGlzdGVuZXJ9IG9yIAotICAgICAqICB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5ldmVudC5QYWdlUmVuZGVyTGlzdGVuZXJ9LgotICAgICAqIAotICAgICAqICA8cD4KLSAgICAgKiAgSW52b2tlcyB7QGxpbmsgI2ZpbmlzaExvYWQoKX0uICBTdWJjbGFzc2VzIG1heSBvdmVyaWRlIGFzIG5lZWRlZCwgYnV0Ci0gICAgICogIG11c3QgaW52b2tlIHRoaXMgaW1wbGVtZW50YXRpb24uCi0gICAgICogIHtAbGluayBCYXNlQ29tcG9uZW50fQotICAgICAqICBsb2FkcyBpdHMgSFRNTCB0ZW1wbGF0ZS4gCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCBmaW5pc2hMb2FkKAotICAgICAgICBJUmVxdWVzdEN5Y2xlIGN5Y2xlLAotICAgICAgICBJUGFnZUxvYWRlciBsb2FkZXIsCi0gICAgICAgIElDb21wb25lbnRTcGVjaWZpY2F0aW9uIHNwZWNpZmljYXRpb24pCi0gICAgewotICAgICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIFBhZ2VEZXRhY2hMaXN0ZW5lcikKLSAgICAgICAgICAgIF9wYWdlLmFkZFBhZ2VEZXRhY2hMaXN0ZW5lcigoUGFnZURldGFjaExpc3RlbmVyKSB0aGlzKTsKLQotICAgICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIFBhZ2VSZW5kZXJMaXN0ZW5lcikKLSAgICAgICAgICAgIF9wYWdlLmFkZFBhZ2VSZW5kZXJMaXN0ZW5lcigoUGFnZVJlbmRlckxpc3RlbmVyKSB0aGlzKTsKLQotICAgICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIFBhZ2VWYWxpZGF0ZUxpc3RlbmVyKQotICAgICAgICAgICAgX3BhZ2UuYWRkUGFnZVZhbGlkYXRlTGlzdGVuZXIoKFBhZ2VWYWxpZGF0ZUxpc3RlbmVyKSB0aGlzKTsKLQotICAgICAgICBmaW5pc2hMb2FkKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQGRlcHJlY2F0ZWQgVG8gYmUgcmVtb3ZlZCBpbiAzLjEuIAotICAgICAqIFVzZSB7QGxpbmsgVGFwZXN0cnkjZmlyZU9ic2VydmVkQ2hhbmdlKElDb21wb25lbnQsIFN0cmluZywgaW50KX0gaW5zdGVhZC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBmaXJlT2JzZXJ2ZWRDaGFuZ2UoU3RyaW5nIHByb3BlcnR5TmFtZSwgaW50IG5ld1ZhbHVlKQotICAgIHsKLSAgICAgICAgVGFwZXN0cnkuZmlyZU9ic2VydmVkQ2hhbmdlKHRoaXMsIHByb3BlcnR5TmFtZSwgbmV3VmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBkZXByZWNhdGVkIFRvIGJlIHJlbW92ZWQgaW4gMy4xLiAKLSAgICAgKiBVc2Uge0BsaW5rIFRhcGVzdHJ5I2ZpcmVPYnNlcnZlZENoYW5nZShJQ29tcG9uZW50LCBTdHJpbmcsIE9iamVjdCl9IGluc3RlYWQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZmlyZU9ic2VydmVkQ2hhbmdlKFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBuZXdWYWx1ZSkKLSAgICB7Ci0gICAgICAgIFRhcGVzdHJ5LmZpcmVPYnNlcnZlZENoYW5nZSh0aGlzLCBwcm9wZXJ0eU5hbWUsIG5ld1ZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAZGVwcmVjYXRlZCBUbyBiZSByZW1vdmVkIGluIDMuMS4gCi0gICAgICogVXNlIHtAbGluayBUYXBlc3RyeSNmaXJlT2JzZXJ2ZWRDaGFuZ2UoSUNvbXBvbmVudCwgU3RyaW5nLCBib29sZWFuKX0gaW5zdGVhZC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBmaXJlT2JzZXJ2ZWRDaGFuZ2UoU3RyaW5nIHByb3BlcnR5TmFtZSwgYm9vbGVhbiBuZXdWYWx1ZSkKLSAgICB7Ci0gICAgICAgIFRhcGVzdHJ5LmZpcmVPYnNlcnZlZENoYW5nZSh0aGlzLCBwcm9wZXJ0eU5hbWUsIG5ld1ZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAZGVwcmVjYXRlZCBUbyBiZSByZW1vdmVkIGluIDMuMS4gCi0gICAgICogVXNlIHtAbGluayBUYXBlc3RyeSNmaXJlT2JzZXJ2ZWRDaGFuZ2UoSUNvbXBvbmVudCwgU3RyaW5nLCBkb3VibGUpfSBpbnN0ZWFkLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGZpcmVPYnNlcnZlZENoYW5nZShTdHJpbmcgcHJvcGVydHlOYW1lLCBkb3VibGUgbmV3VmFsdWUpCi0gICAgewotICAgICAgICBUYXBlc3RyeS5maXJlT2JzZXJ2ZWRDaGFuZ2UodGhpcywgcHJvcGVydHlOYW1lLCBuZXdWYWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQGRlcHJlY2F0ZWQgVG8gYmUgcmVtb3ZlZCBpbiAzLjEuIAotICAgICAqIFVzZSB7QGxpbmsgVGFwZXN0cnkjZmlyZU9ic2VydmVkQ2hhbmdlKElDb21wb25lbnQsIFN0cmluZywgZmxvYXQpfSBpbnN0ZWFkLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGZpcmVPYnNlcnZlZENoYW5nZShTdHJpbmcgcHJvcGVydHlOYW1lLCBmbG9hdCBuZXdWYWx1ZSkKLSAgICB7Ci0gICAgICAgIFRhcGVzdHJ5LmZpcmVPYnNlcnZlZENoYW5nZSh0aGlzLCBwcm9wZXJ0eU5hbWUsIG5ld1ZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAZGVwcmVjYXRlZCBUbyBiZSByZW1vdmVkIGluIDMuMS4gCi0gICAgICogVXNlIHtAbGluayBUYXBlc3RyeSNmaXJlT2JzZXJ2ZWRDaGFuZ2UoSUNvbXBvbmVudCwgU3RyaW5nLCBsb25nKX0gaW5zdGVhZC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBmaXJlT2JzZXJ2ZWRDaGFuZ2UoU3RyaW5nIHByb3BlcnR5TmFtZSwgbG9uZyBuZXdWYWx1ZSkKLSAgICB7Ci0gICAgICAgIFRhcGVzdHJ5LmZpcmVPYnNlcnZlZENoYW5nZSh0aGlzLCBwcm9wZXJ0eU5hbWUsIG5ld1ZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAZGVwcmVjYXRlZCBUbyBiZSByZW1vdmVkIGluIDMuMS4gCi0gICAgICogVXNlIHtAbGluayBUYXBlc3RyeSNmaXJlT2JzZXJ2ZWRDaGFuZ2UoSUNvbXBvbmVudCwgU3RyaW5nLCBjaGFyKX0gaW5zdGVhZC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBmaXJlT2JzZXJ2ZWRDaGFuZ2UoU3RyaW5nIHByb3BlcnR5TmFtZSwgY2hhciBuZXdWYWx1ZSkKLSAgICB7Ci0gICAgICAgIFRhcGVzdHJ5LmZpcmVPYnNlcnZlZENoYW5nZSh0aGlzLCBwcm9wZXJ0eU5hbWUsIG5ld1ZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAZGVwcmVjYXRlZCBUbyBiZSByZW1vdmVkIGluIDMuMS4gCi0gICAgICogVXNlIHtAbGluayBUYXBlc3RyeSNmaXJlT2JzZXJ2ZWRDaGFuZ2UoSUNvbXBvbmVudCwgU3RyaW5nLCBieXRlKX0gaW5zdGVhZC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBmaXJlT2JzZXJ2ZWRDaGFuZ2UoU3RyaW5nIHByb3BlcnR5TmFtZSwgYnl0ZSBuZXdWYWx1ZSkKLSAgICB7Ci0gICAgICAgIFRhcGVzdHJ5LmZpcmVPYnNlcnZlZENoYW5nZSh0aGlzLCBwcm9wZXJ0eU5hbWUsIG5ld1ZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAZGVwcmVjYXRlZCBUbyBiZSByZW1vdmVkIGluIDMuMS4gCi0gICAgICogVXNlIHtAbGluayBUYXBlc3RyeSNmaXJlT2JzZXJ2ZWRDaGFuZ2UoSUNvbXBvbmVudCwgU3RyaW5nLCBzaG9ydCl9IGluc3RlYWQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZmlyZU9ic2VydmVkQ2hhbmdlKFN0cmluZyBwcm9wZXJ0eU5hbWUsIHNob3J0IG5ld1ZhbHVlKQotICAgIHsKLSAgICAgICAgVGFwZXN0cnkuZmlyZU9ic2VydmVkQ2hhbmdlKHRoaXMsIHByb3BlcnR5TmFtZSwgbmV3VmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBAZGVwcmVjYXRlZCBUbyBiZSByZW1vdmVkIGluIDMuMS4gIFVzZSAKLSAgICAgKiAge0BsaW5rICNyZW5kZXJJbmZvcm1hbFBhcmFtZXRlcnMoSU1hcmt1cFdyaXRlciwgSVJlcXVlc3RDeWNsZSl9Ci0gICAgICogIGluc3RlYWQuCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHJvdGVjdGVkIHZvaWQgZ2VuZXJhdGVBdHRyaWJ1dGVzKElNYXJrdXBXcml0ZXIgd3JpdGVyLCBJUmVxdWVzdEN5Y2xlIGN5Y2xlKQotICAgIHsKLSAgICAgICAgcmVuZGVySW5mb3JtYWxQYXJhbWV0ZXJzKHdyaXRlciwgY3ljbGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBDb252ZXJ0cyBpbmZvcm1hbCBwYXJhbWV0ZXJzIGludG8gYWRkaXRpb25hbCBhdHRyaWJ1dGVzIG9uIHRoZQotICAgICAqICBjdXJlbnRseSBvcGVuIHRhZy4KLSAgICAgKgotICAgICAqICA8cD5JbnZva2VkIGZyb20gc3ViY2xhc3NlcyB0byBhbGxvdyBhZGRpdGlvbmFsIGF0dHJpYnV0ZXMgdG8KLSAgICAgKiAgYmUgc3BlY2lmaWVkIHdpdGhpbiBhIHRhZyAodGhpcyB3b3JrcyBiZXN0IHdoZW4gdGhlcmUgaXMgYQotICAgICAqICBvbmUtdG8tb25lIGNvcmVzcG9uZGVuY2UgYmV0d2VlbiBhbiB7QGxpbmsgSUNvbXBvbmVudH0gYW5kIGEKLSAgICAgKiAgSFRNTCBlbGVtZW50LgotICAgICAqCi0gICAgICogIDxwPkl0ZXJhdGVzIHRocm91Z2ggdGhlIGJpbmRpbmdzIGZvciB0aGlzIGNvbXBvbmVudC4gIEZpbHRlcnMKLSAgICAgKiAgb3V0IGJpbmRpbmdzIHdoZW4gdGhlIG5hbWUgbWF0Y2hlcyBhIGZvcm1hbCBwYXJhbWV0ZXIgKGFzIG9mIDEuMC41LAotICAgICAqICBpbmZvcm1hbCBiaW5kaW5ncyBhcmUgd2VlZGVkIG91dCBhdCBwYWdlIGxvYWQgLyB0ZW1wbGF0ZSBsb2FkIHRpbWUsCi0gICAgICogIGlmIHRoZXkgbWF0Y2ggYSBmb3JtYWwgcGFyYW1ldGVyLCBvciBhIHNwZWNpZmljaWVkIHJlc2VydmVkIG5hbWUpLgotICAgICAqICBGb3IgdGhlIG1vc3QgcGFydCwgYWxsIHRoZSBiaW5kaW5ncyBoZXJlIGFyZSBlaXRoZXIgaW5mb3JtYWwgcGFyYW1ldGVyLAotICAgICAqICBvciBmb3JtYWwgcGFyYW1ldGVyIHdpdGhvdXQgYSBjb3JyZXNwb25kaW5nIEphdmFCZWFucyBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqICA8cD5Gb3IgZWFjaCBhY2NlcHRpYmxlIGtleSwgdGhlIHZhbHVlIGlzIGV4dHJhY3RlZCB1c2luZyB7QGxpbmsgSUJpbmRpbmcjZ2V0T2JqZWN0KCl9LgotICAgICAqICBJZiB0aGUgdmFsdWUgaXMgbnVsbCwgbm8gYXR0cmlidXRlIGlzIHdyaXR0ZW4uCi0gICAgICoKLSAgICAgKiAgPHA+SWYgdGhlIHZhbHVlIGlzIGFuIGluc3RhbmNlIG9mIHtAbGluayBJQXNzZXR9LCB0aGVuCi0gICAgICogIHtAbGluayBJQXNzZXQjYnVpbGRVUkwoSVJlcXVlc3RDeWNsZSl9IGlzIGludm9rZWQgdG8gY29udmVydCB0aGUgYXNzZXQKLSAgICAgKiAgdG8gYSBVUkwuCi0gICAgICoKLSAgICAgKiAgPHA+RmluYWxseSwge0BsaW5rIElNYXJrdXBXcml0ZXIjYXR0cmlidXRlKFN0cmluZyxTdHJpbmcpfSBpcwotICAgICAqICBpbnZva2VkIHdpdGggdGhlIHZhbHVlIChvciB0aGUgVVJMKS4KLSAgICAgKgotICAgICAqICA8cD5UaGUgbW9zdCBjb21tb24gdXNlIGZvciBpbmZvcm1hbCBwYXJhbWV0ZXJzIGlzIHRvIHN1cHBvcnQKLSAgICAgKiAgdGhlIEhUTUwgY2xhc3MgYXR0cmlidXRlIChmb3IgdXNlIHdpdGggY2FzY2FkaW5nIHN0eWxlIHNoZWV0cykKLSAgICAgKiAgYW5kIHRvIHNwZWNpZnkgSmF2YVNjcmlwdCBldmVudCBoYW5kbGVycy4KLSAgICAgKgotICAgICAqICA8cD5Db21wb25lbnRzIGFyZSBvbmx5IHJlcXVpcmVkIHRvIGdlbmVyYXRlIGF0dHJpYnV0ZXMgb24gdGhlCi0gICAgICogIHJlc3VsdCBwaGFzZTsgdGhpcyBjYW4gYmUgc2tpcHBlZCBkdXJpbmcgdGhlIHJld2luZCBwaGFzZS4KLSAgICAgKiovCi0KLSAgICBwcm90ZWN0ZWQgdm9pZCByZW5kZXJJbmZvcm1hbFBhcmFtZXRlcnMoSU1hcmt1cFdyaXRlciB3cml0ZXIsIElSZXF1ZXN0Q3ljbGUgY3ljbGUpCi0gICAgewotICAgICAgICBTdHJpbmcgYXR0cmlidXRlOwotCi0gICAgICAgIGlmIChfYmluZGluZ3MgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBJdGVyYXRvciBpID0gX2JpbmRpbmdzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLQotICAgICAgICB3aGlsZSAoaS5oYXNOZXh0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGkubmV4dCgpOwotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBlbnRyeS5nZXRLZXkoKTsKLQotICAgICAgICAgICAgSUJpbmRpbmcgYmluZGluZyA9IChJQmluZGluZykgZW50cnkuZ2V0VmFsdWUoKTsKLQotICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gYmluZGluZy5nZXRPYmplY3QoKTsKLSAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBJQXNzZXQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgSUFzc2V0IGFzc2V0ID0gKElBc3NldCkgdmFsdWU7Ci0KLSAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIFVSTCBvZiB0aGUgYXNzZXQgYW5kIGluc2VydCB0aGF0LgotCi0gICAgICAgICAgICAgICAgYXR0cmlidXRlID0gYXNzZXQuYnVpbGRVUkwoY3ljbGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSA9IHZhbHVlLnRvU3RyaW5nKCk7Ci0KLSAgICAgICAgICAgIHdyaXRlci5hdHRyaWJ1dGUobmFtZSwgYXR0cmlidXRlKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgYW4gb2JqZWN0IHVzZWQgdG8gcmVzb2x2ZSBjbGFzc2VzLgotICAgICAqICBAc2luY2UgMy4wCi0gICAgICoKLSAgICAgKiovCi0gICAgcHJpdmF0ZSBJUmVzb3VyY2VSZXNvbHZlciBnZXRSZXNvdXJjZVJlc29sdmVyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRQYWdlKCkuZ2V0RW5naW5lKCkuZ2V0UmVzb3VyY2VSZXNvbHZlcigpOwotICAgIH0KLQotCS8qKgotCSAqICBSZXR1cm5zIHRoZSBuYW1lZCBiaW5kaW5nLCBvciBudWxsIGlmIGl0IGRvZXNuJ3QgZXhpc3QuCi0JICoKLQkgKiAgPHA+VGhpcyBtZXRob2QgbG9va3MgZm9yIGEgSmF2YUJlYW5zIHByb3BlcnR5IHdpdGggYW4KLQkgKiAgYXBwcm9wcmlhdGUgbmFtZSwgb2YgdHlwZSB7QGxpbmsgSUJpbmRpbmd9LiAgVGhlIHByb3BlcnR5Ci0JICogIHNob3VsZCBiZSBuYW1lZCA8Y29kZT48aT5uYW1lPC9pPkJpbmRpbmc8L2NvZGU+LiAgSWYgaXQgZXhpc3RzCi0JICogIGFuZCBpcyBib3RoIHJlYWRhYmxlIGFuZCB3cml0YWJsZSwgdGhlbiBpdCBpcyBhY2Nlc3NvciBtZXRob2QKLQkgKiAgaXMgaW52b2tlZC4gIENvbXBvbmVudHMgd2hpY2ggaW1wbGVtZW50IHN1Y2ggbWV0aG9kcyBjYW4KLQkgKiAgYWNjZXNzIHRoZWlyIG93biBiaW5kaW5nIHRocm91Z2ggdGhlaXIgaW5zdGFuY2UgdmFyaWFibGVzCi0JICogIGluc3RlYWQgb2YgaW52b2tpbmcgdGhpcyBtZXRob2QsIGEgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uLgotCSAqCi0JICogIEBzZWUgI3NldEJpbmRpbmcoU3RyaW5nLElCaW5kaW5nKQotCSAqCi0JICoqLwotCi0JcHVibGljIElCaW5kaW5nIGdldEJpbmRpbmcoU3RyaW5nIG5hbWUpCi0JewotCQlTdHJpbmcgYmluZGluZ1Byb3BlcnR5TmFtZSA9IG5hbWUgKyBUYXBlc3RyeS5QQVJBTUVURVJfUFJPUEVSVFlfTkFNRV9TVUZGSVg7Ci0JCVByb3BlcnR5SW5mbyBpbmZvID0gUHJvcGVydHlGaW5kZXIuZ2V0UHJvcGVydHlJbmZvKGdldENsYXNzKCksIGJpbmRpbmdQcm9wZXJ0eU5hbWUpOwotCi0JCWlmIChpbmZvICE9IG51bGwgJiYgaW5mby5pc1JlYWRXcml0ZSgpICYmIGluZm8uZ2V0VHlwZSgpLmVxdWFscyhJQmluZGluZy5jbGFzcykpCi0JCXsKLQkJCUlSZXNvdXJjZVJlc29sdmVyIHJlc29sdmVyID0gZ2V0UGFnZSgpLmdldEVuZ2luZSgpLmdldFJlc291cmNlUmVzb2x2ZXIoKTsKLQotCQkJcmV0dXJuIChJQmluZGluZykgT2dubFV0aWxzLmdldChiaW5kaW5nUHJvcGVydHlOYW1lLCByZXNvbHZlciwgdGhpcyk7Ci0JCX0KLQotCQlpZiAoX2JpbmRpbmdzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlyZXR1cm4gKElCaW5kaW5nKSBfYmluZGluZ3MuZ2V0KG5hbWUpOwotCX0KLQotCi0gICAgLyoqCi0gICAgICogIFJldHVybidzIHRoZSBwYWdlJ3MgY2hhbmdlIG9ic2VydmVyLiAgSW4gcHJhY3RpY2FsIHRlcm1zLCB0aGlzCi0gICAgICogIHdpbGwgYmUgYW4ge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkuZW5naW5lLklQYWdlUmVjb3JkZXJ9LgotICAgICAqCi0gICAgICogIEBzZWUgSVBhZ2UjZ2V0Q2hhbmdlT2JzZXJ2ZXIoKQotICAgICAqICBAZGVwcmVjYXRlZCBUbyBiZSByZW1vdmVkIGluIDMuMTsgdXNlIHtAbGluayBJUGFnZSNnZXRDaGFuZ2VPYnNlcnZlcigpfS4KLSAgICAgKiovCi0KLSAgICBwdWJsaWMgQ2hhbmdlT2JzZXJ2ZXIgZ2V0Q2hhbmdlT2JzZXJ2ZXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9wYWdlLmdldENoYW5nZU9ic2VydmVyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIElDb21wb25lbnQgZ2V0Q29tcG9uZW50KFN0cmluZyBpZCkKLSAgICB7Ci0gICAgICAgIElDb21wb25lbnQgcmVzdWx0ID0gbnVsbDsKLQotICAgICAgICBpZiAoX2NvbXBvbmVudHMgIT0gbnVsbCkKLSAgICAgICAgICAgIHJlc3VsdCA9IChJQ29tcG9uZW50KSBfY29tcG9uZW50cy5nZXQoaWQpOwotCi0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgVGFwZXN0cnkuZm9ybWF0KCJuby1zdWNoLWNvbXBvbmVudCIsIHRoaXMsIGlkKSwKLSAgICAgICAgICAgICAgICB0aGlzLAotICAgICAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAgICAgbnVsbCk7Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSUNvbXBvbmVudCBnZXRDb250YWluZXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9jb250YWluZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q29udGFpbmVyKElDb21wb25lbnQgdmFsdWUpCi0gICAgewotICAgICAgICBpZiAoX2NvbnRhaW5lciAhPSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICBUYXBlc3RyeS5nZXRNZXNzYWdlKCJBYnN0cmFjdENvbXBvbmVudC5hdHRlbXB0LXRvLWNoYW5nZS1jb250YWluZXIiKSk7Ci0KLSAgICAgICAgX2NvbnRhaW5lciA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBwYWdlLCBhIHNsYXNoLCBhbmQgdGhpcyBjb21wb25lbnQncyBpZCBwYXRoLgotICAgICAqICBQYWdlcyBhcmUgZGlmZmVyZW50LCB0aGV5IHNpbXBseSByZXR1cm4gdGhlaXIgbmFtZS4KLSAgICAgKgotICAgICAqICBAc2VlICNnZXRJZFBhdGgoKQotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIFN0cmluZyBnZXRFeHRlbmRlZElkKCkKLSAgICB7Ci0gICAgICAgIGlmIChfcGFnZSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgcmV0dXJuIF9wYWdlLmdldFBhZ2VOYW1lKCkgKyAiLyIgKyBnZXRJZFBhdGgoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldElkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfaWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIHZhbHVlKQotICAgIHsKLSAgICAgICAgaWYgKF9pZCAhPSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICBUYXBlc3RyeS5nZXRNZXNzYWdlKCJBYnN0cmFjdENvbXBvbmVudC5hdHRlbXB0LXRvLWNoYW5nZS1jb21wb25lbnQtaWQiKSk7Ci0KLSAgICAgICAgX2lkID0gdmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRJZFBhdGgoKQotICAgIHsKLSAgICAgICAgU3RyaW5nIGNvbnRhaW5lcklkUGF0aDsKLQotICAgICAgICBpZiAoX2NvbnRhaW5lciA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIFRhcGVzdHJ5LmZvcm1hdCgiQWJzdHJhY3RDb21wb25lbnQubnVsbC1jb250YWluZXIiLCB0aGlzKSk7Ci0KLSAgICAgICAgY29udGFpbmVySWRQYXRoID0gX2NvbnRhaW5lci5nZXRJZFBhdGgoKTsKLQotICAgICAgICBpZiAoY29udGFpbmVySWRQYXRoID09IG51bGwpCi0gICAgICAgICAgICBfaWRQYXRoID0gX2lkOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBfaWRQYXRoID0gY29udGFpbmVySWRQYXRoICsgIi4iICsgX2lkOwotCi0gICAgICAgIHJldHVybiBfaWRQYXRoOwotICAgIH0KLQotICAgIHB1YmxpYyBJUGFnZSBnZXRQYWdlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfcGFnZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYWdlKElQYWdlIHZhbHVlKQotICAgIHsKLSAgICAgICAgaWYgKF9wYWdlICE9IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIFRhcGVzdHJ5LmdldE1lc3NhZ2UoIkFic3RyYWN0Q29tcG9uZW50LmF0dGVtcHQtdG8tY2hhbmdlLXBhZ2UiKSk7Ci0KLSAgICAgICAgX3BhZ2UgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSUNvbXBvbmVudFNwZWNpZmljYXRpb24gZ2V0U3BlY2lmaWNhdGlvbigpCi0gICAgewotICAgICAgICByZXR1cm4gX3NwZWNpZmljYXRpb247Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U3BlY2lmaWNhdGlvbihJQ29tcG9uZW50U3BlY2lmaWNhdGlvbiB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIGlmIChfc3BlY2lmaWNhdGlvbiAhPSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICBUYXBlc3RyeS5nZXRNZXNzYWdlKCJBYnN0cmFjdENvbXBvbmVudC5hdHRlbXB0LXRvLWNoYW5nZS1zcGVjIikpOwotCi0gICAgICAgIF9zcGVjaWZpY2F0aW9uID0gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFJlbmRlcnMgYWxsIGVsZW1lbnRzIHdyYXBwZWQgYnkgdGhlIHJlY2VpdmVyLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgcmVuZGVyQm9keShJTWFya3VwV3JpdGVyIHdyaXRlciwgSVJlcXVlc3RDeWNsZSBjeWNsZSkKLSAgICB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX2JvZHlDb3VudDsgaSsrKQotICAgICAgICAgICAgX2JvZHlbaV0ucmVuZGVyKHdyaXRlciwgY3ljbGUpOwotICAgIH0KLQotCS8qKgotCSAqICBBZGRzIHRoZSBiaW5kaW5nIHdpdGggdGhlIGdpdmVuIG5hbWUsIHJlcGxhY2luZyBhbnkgZXhpc3RpbmcgYmluZGluZwotCSAqICB3aXRoIHRoYXQgbmFtZS4KLQkgKgotCSAqICA8cD5UaGlzIG1ldGhvZCBjaGVja3MgdG8gc2VlIGlmIGEgbWF0Y2hpbmcgSmF2YUJlYW5zIHByb3BlcnR5Ci0JICogICh3aXRoIGEgbmFtZSBvZiA8Y29kZT48aT5uYW1lPC9pPkJpbmRpbmc8L2NvZGU+IGFuZCBhIHR5cGUgb2YKLQkgKiAge0BsaW5rIElCaW5kaW5nfSkgZXhpc3RzLiAgSWYgc28sIHRoYXQgcHJvcGVydHkgaXMgdXBkYXRlZC4KLQkgKiAgQW4gb3B0aW1pemVkIGNvbXBvbmVudCBjYW4gc2ltcGx5IGltcGxlbWVudCBhY2Nlc3NvciBhbmQKLQkgKiAgbXV0YXRvciBtZXRob2RzIGFuZCB0aGVuIGFjY2VzcyBpdHMgYmluZGluZ3MgdmlhIGl0cyBvd24KLQkgKiAgaW5zdGFuY2UgdmFyaWFibGVzLCByYXRoZXIgdGhhbiBnb2luZyB0aHJvdWdoIHtAbGluawotCSAqICAjZ2V0QmluZGluZyhTdHJpbmcpfS4KLQkgKgotCSAqICA8cD5JbmZvcm1hbCBwYXJhbWV0ZXJzIHNob3VsZCA8ZW0+bm90PC9lbT4gYmUgc3RvcmVkIGluCi0JICogIGluc3RhbmNlIHZhcmlhYmxlcyBpZiB7QGxpbmsKLQkgKiAgI3JlbmRlckluZm9ybWFsUGFyYW1ldGVycyhJTWFya3VwV3JpdGVyLCBJUmVxdWVzdEN5Y2xlKX0gaXMgdG8gYmUgdXNlZC4KLQkgKiAgSXQgcmVsaWVzIG9uIHVzaW5nIHRoZSBjb2xsZWN0aW9uIG9mIGJpbmRpbmdzICh0byBzdG9yZSBpbmZvcm1hbCBwYXJhbWV0ZXJzKS4KLQkgKiovCi0KLQlwdWJsaWMgdm9pZCBzZXRCaW5kaW5nKFN0cmluZyBuYW1lLCBJQmluZGluZyBiaW5kaW5nKQotCXsKLQkJU3RyaW5nIGJpbmRpbmdQcm9wZXJ0eU5hbWUgPSBuYW1lICsgVGFwZXN0cnkuUEFSQU1FVEVSX1BST1BFUlRZX05BTUVfU1VGRklYOwotCi0JCVByb3BlcnR5SW5mbyBpbmZvID0gUHJvcGVydHlGaW5kZXIuZ2V0UHJvcGVydHlJbmZvKGdldENsYXNzKCksIGJpbmRpbmdQcm9wZXJ0eU5hbWUpOwotCi0JCWlmIChpbmZvICE9IG51bGwgJiYgaW5mby5pc1JlYWRXcml0ZSgpICYmIGluZm8uZ2V0VHlwZSgpLmVxdWFscyhJQmluZGluZy5jbGFzcykpCi0JCXsKLQkJCUlSZXNvdXJjZVJlc29sdmVyIHJlc29sdmVyID0gZ2V0UGFnZSgpLmdldEVuZ2luZSgpLmdldFJlc291cmNlUmVzb2x2ZXIoKTsKLQkJCU9nbmxVdGlscy5zZXQoYmluZGluZ1Byb3BlcnR5TmFtZSwgcmVzb2x2ZXIsIHRoaXMsIGJpbmRpbmcpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKF9iaW5kaW5ncyA9PSBudWxsKQotCQkJX2JpbmRpbmdzID0gbmV3IEhhc2hNYXAoTUFQX1NJWkUpOwotCi0JCV9iaW5kaW5ncy5wdXQobmFtZSwgYmluZGluZyk7Ci0JfQotCi0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgICB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXI7Ci0KLSAgICAgICAgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQotICAgICAgICBidWZmZXIuYXBwZW5kKCdbJyk7Ci0KLSAgICAgICAgYnVmZmVyLmFwcGVuZChnZXRFeHRlbmRlZElkKCkpOwotCi0gICAgICAgIGJ1ZmZlci5hcHBlbmQoJ10nKTsKLQotICAgICAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgYW4gdW5tb2RpZmlhYmxlIHtAbGluayBNYXB9IG9mIGNvbXBvbmVudHMsIGtleWVkIG9uIGNvbXBvbmVudCBpZC4KLSAgICAgKiAgTmV2ZXIgcmV0dXJucyBudWxsLCBidXQgbWF5IHJldHVybiBhbiBlbXB0eSBtYXAuICBUaGUgcmV0dXJuZWQgbWFwIGlzCi0gICAgICogIGltbXV0YWJsZS4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBNYXAgZ2V0Q29tcG9uZW50cygpCi0gICAgewotICAgICAgICBpZiAoX2NvbXBvbmVudHMgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBFTVBUWV9NQVA7Ci0KLSAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcChfY29tcG9uZW50cyk7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgTWFwIGdldEFzc2V0cygpCi0gICAgewotICAgICAgICBpZiAoX2Fzc2V0cyA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIEVNUFRZX01BUDsKLQotICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKF9hc3NldHMpOwotICAgIH0KLQotICAgIHB1YmxpYyBJQXNzZXQgZ2V0QXNzZXQoU3RyaW5nIG5hbWUpCi0gICAgewotICAgICAgICBpZiAoX2Fzc2V0cyA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgcmV0dXJuIChJQXNzZXQpIF9hc3NldHMuZ2V0KG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBDb2xsZWN0aW9uIGdldEJpbmRpbmdOYW1lcygpCi0gICAgewotICAgICAgICAvLyBJZiBubyBjb25haW5lciwgaS5lLiBhIHBhZ2UsIHRoZW4gbm8gYmluZGluZ3MuCi0KLSAgICAgICAgaWYgKF9jb250YWluZXIgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIEhhc2hTZXQgcmVzdWx0ID0gbmV3IEhhc2hTZXQoKTsKLQotICAgICAgICAvLyBBbGwgdGhlIGluZm9ybWFsIGJpbmRpbmdzIGdvIGludG8gdGhlIGJpbmRpbmdzIE1hcC4gCi0KLSAgICAgICAgaWYgKF9iaW5kaW5ncyAhPSBudWxsKQotICAgICAgICAgICAgcmVzdWx0LmFkZEFsbChfYmluZGluZ3Mua2V5U2V0KCkpOwotCi0gICAgICAgIC8vIE5vdywgaXRlcmF0ZSBvdmVyIHRoZSBmb3JtYWwgcGFyYW1ldGVycyBhbmQgYWRkIHRoZSBmb3JtYWwgcGFyYW1ldGVycwotICAgICAgICAvLyB0aGF0IGhhdmUgYSBiaW5kaW5nLgotCi0gICAgICAgIExpc3QgbmFtZXMgPSBfc3BlY2lmaWNhdGlvbi5nZXRQYXJhbWV0ZXJOYW1lcygpOwotCi0gICAgICAgIGludCBjb3VudCA9IG5hbWVzLnNpemUoKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZykgbmFtZXMuZ2V0KGkpOwotCi0gICAgICAgICAgICBpZiAocmVzdWx0LmNvbnRhaW5zKG5hbWUpKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICBpZiAoZ2V0QmluZGluZyhuYW1lKSAhPSBudWxsKQotICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQobmFtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKiAKLSAgICAgKgotICAgICAqICBSZXR1cm5zIGEge0BsaW5rIE1hcH0gb2YgYWxsIGJpbmRpbmdzIGZvciB0aGlzIGNvbXBvbmVudC4gIFRoaXMgaW1wbGVtZW50YXRpb24KLSAgICAgKiAgaXMgZXhwZW5zaXZlLCBzaW5jZSBpdCBoYXMgdG8gbWVyZ2UgdGhlIGRpc2Fzc29jaWF0ZWQgYmluZGluZ3MgKGluZm9ybWFsIHBhcmFtZXRlcnMsCi0gICAgICogIGFuZCBwYXJhbWV0ZXJzIHdpdGhvdXQgYSBKYXZhQmVhbnMgcHJvcGVydHkpIHdpdGggdGhlIGFzc29jaWF0ZWQgYmluZGluZ3MgKGZvcm1hbAotICAgICAqICBwYXJhbWV0ZXJzIHdpdGggYSBKYXZhQmVhbnMgcHJvcGVydHkpLgotICAgICAqCi0gICAgICogQHNpbmNlIDEuMC41Ci0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgTWFwIGdldEJpbmRpbmdzKCkKLSAgICB7Ci0gICAgICAgIE1hcCByZXN1bHQgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgICAgIC8vIEFkZCBhbnkgaW5mb3JtYWwgcGFyYW1ldGVycy4KLQotICAgICAgICBpZiAoX2JpbmRpbmdzICE9IG51bGwpCi0gICAgICAgICAgICByZXN1bHQucHV0QWxsKF9iaW5kaW5ncyk7Ci0KLSAgICAgICAgLy8gTm93IHdvcmsgb24gdGhlIGZvcm1hbCBwYXJhbWV0ZXJzCi0KLSAgICAgICAgSXRlcmF0b3IgaSA9IF9zcGVjaWZpY2F0aW9uLmdldFBhcmFtZXRlck5hbWVzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpIGkubmV4dCgpOwotCi0gICAgICAgICAgICBpZiAocmVzdWx0LmNvbnRhaW5zS2V5KG5hbWUpKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICBJQmluZGluZyBiaW5kaW5nID0gZ2V0QmluZGluZyhuYW1lKTsKLQotICAgICAgICAgICAgaWYgKGJpbmRpbmcgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXN1bHQucHV0KG5hbWUsIGJpbmRpbmcpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyBhIHtAbGluayBMaXN0ZW5lck1hcH0gZm9yIHRoZSBjb21wb25lbnQuICBBIHtAbGluayBMaXN0ZW5lck1hcH0gY29udGFpbnMgYSBudW1iZXIgb2YKLSAgICAgKiAgc3ludGhldGljIHJlYWQtb25seSBwcm9wZXJ0aWVzIHRoYXQgaW1wbGVtZW50IHRoZSB7QGxpbmsgSUFjdGlvbkxpc3RlbmVyfSAKLSAgICAgKiAgaW50ZXJmYWNlLCBidXQgaW4gZmFjdCwgY2F1c2UgcHVibGljIGluc3RhbmNlIG1ldGhvZHMgdG8gYmUgaW52b2tlZC4KLSAgICAgKgotICAgICAqICBAc2luY2UgMS4wLjIKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgTGlzdGVuZXJNYXAgZ2V0TGlzdGVuZXJzKCkKLSAgICB7Ci0gICAgICAgIGlmIChfbGlzdGVuZXJzID09IG51bGwpCi0gICAgICAgICAgICBfbGlzdGVuZXJzID0gbmV3IExpc3RlbmVyTWFwKHRoaXMpOwotCi0gICAgICAgIHJldHVybiBfbGlzdGVuZXJzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIHRoZSB7QGxpbmsgSUJlYW5Qcm92aWRlcn0gZm9yIHRoaXMgY29tcG9uZW50LiAgVGhpcyBpcyBsYXppbHkgY3JlYXRlZCB0aGUKLSAgICAgKiAgZmlyc3QgdGltZSBpdCBpcyBuZWVkZWQuCi0gICAgICoKLSAgICAgKiAgQHNpbmNlIDEuMC40Ci0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgSUJlYW5Qcm92aWRlciBnZXRCZWFucygpCi0gICAgewotICAgICAgICBpZiAoX2JlYW5zID09IG51bGwpCi0gICAgICAgICAgICBfYmVhbnMgPSBuZXcgQmVhblByb3ZpZGVyKHRoaXMpOwotCi0gICAgICAgIHJldHVybiBfYmVhbnM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogIEludm9rZWQsIGFzIGEgY29udmllbmllbmNlLCAKLSAgICAgKiAgZnJvbSB7QGxpbmsgI2ZpbmlzaExvYWQoSVJlcXVlc3RDeWNsZSwgSVBhZ2VMb2FkZXIsIElDb21wb25lbnRTcGVjaWZpY2F0aW9uKX0uCi0gICAgICogIFRoaXMgaW1wbGVtZW5hdGlvbiBkb2VzIG5vdGhpbmcuICBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB3aXRob3V0IGludm9raW5nCi0gICAgICogIHRoaXMgaW1wbGVtZW50YXRpb24uCi0gICAgICogCi0gICAgICogIEBzaW5jZSAxLjAuNQotICAgICAqCi0gICAgICoqLwotCi0gICAgcHJvdGVjdGVkIHZvaWQgZmluaXNoTG9hZCgpCi0gICAgewotICAgIH0KLQotICAgIC8qKgotICAgICAqICBUaGUgbWFpbiBtZXRob2QgdXNlZCB0byByZW5kZXIgdGhlIGNvbXBvbmVudC4gIAotICAgICAqICBJbnZva2VzIHtAbGluayAjcHJlcGFyZUZvclJlbmRlcihJUmVxdWVzdEN5Y2xlKX0sIHRoZW4KLSAgICAgKiAge0BsaW5rICNyZW5kZXJDb21wb25lbnQoSU1hcmt1cFdyaXRlciwgSVJlcXVlc3RDeWNsZSl9LgotICAgICAqICB7QGxpbmsgI2NsZWFudXBBZnRlclJlbmRlcihJUmVxdWVzdEN5Y2xlKX0gaXMgaW52b2tlZCBpbiBhIAotICAgICAqICA8Y29kZT5maW5hbGx5PC9jb2RlPiBibG9jay4KLSAgICAgKiAJIAotICAgICAqICA8cD5TdWJjbGFzc2VzIHNob3VsZCBub3Qgb3ZlcnJpZGUgdGhpcyBtZXRob2Q7IGluc3RlYWQgdGhleQotICAgICAqICB3aWxsIGltcGxlbWVudCB7QGxpbmsgI3JlbmRlckNvbXBvbmVudChJTWFya3VwV3JpdGVyLCBJUmVxdWVzdEN5Y2xlKX0uCi0gICAgICogCi0gICAgICogIEBzaW5jZSAyLjAuMwotICAgICAqIAotICAgICAqKi8KLQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJlbmRlcihJTWFya3VwV3JpdGVyIHdyaXRlciwgSVJlcXVlc3RDeWNsZSBjeWNsZSkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBUYXBlc3RyeS5jbGVhck1ldGhvZEludm9jYXRpb25zKCk7Ci0KLSAgICAgICAgICAgIHByZXBhcmVGb3JSZW5kZXIoY3ljbGUpOwotCi0gICAgICAgICAgICBUYXBlc3RyeS5jaGVja01ldGhvZEludm9jYXRpb24oUFJFUEFSRUZPUlJFTkRFUl9NRVRIT0RfSUQsICJwcmVwYXJlRm9yUmVuZGVyKCkiLCB0aGlzKTsKLQotICAgICAgICAgICAgcmVuZGVyQ29tcG9uZW50KHdyaXRlciwgY3ljbGUpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgVGFwZXN0cnkuY2xlYXJNZXRob2RJbnZvY2F0aW9ucygpOwotCi0gICAgICAgICAgICBjbGVhbnVwQWZ0ZXJSZW5kZXIoY3ljbGUpOwotCi0gICAgICAgICAgICBUYXBlc3RyeS5jaGVja01ldGhvZEludm9jYXRpb24oCi0gICAgICAgICAgICAgICAgQ0xFQU5VUEFGVEVSUkVOREVSX01FVEhPRF9JRCwKLSAgICAgICAgICAgICAgICAiY2xlYW51cEFmdGVyUmVuZGVyKCkiLAotICAgICAgICAgICAgICAgIHRoaXMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEludm9rZWQgYnkge0BsaW5rICNyZW5kZXIoSU1hcmt1cFdyaXRlciwgSVJlcXVlc3RDeWNsZSl9Ci0gICAgICogIHRvIHByZXBhcmUgdGhlIGNvbXBvbmVudCB0byByZW5kZXIuICBUaGlzIGltcGxlbWVudGF0aW9uCi0gICAgICogIHNldHMgSmF2YUJlYW5zIHByb3BlcnRpZXMgZnJvbSBtYXRjaGluZyBib3VuZCBwYXJhbWV0ZXJzLgotICAgICAqICBTdWJjbGFzc2VzIHRoYXQgb3ZlcnJpZGUgdGhpcyBtZXRob2QgbXVzdCBpbnZva2UgdGhpcwotICAgICAqICBpbXBsZW1lbnRhdGlvbiBhcyB3ZWxsLgotICAgICAqIAotICAgICAqICBAc2luY2UgMi4wLjMKLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcmVwYXJlRm9yUmVuZGVyKElSZXF1ZXN0Q3ljbGUgY3ljbGUpCi0gICAgewotICAgICAgICBUYXBlc3RyeS5hZGRNZXRob2RJbnZvY2F0aW9uKFBSRVBBUkVGT1JSRU5ERVJfTUVUSE9EX0lEKTsKLQotICAgICAgICBpZiAoX3BhcmFtZXRlck1hbmFnZXIgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gUGFnZXMgaW5oZXJpdCBmcm9tIHRoaXMgY2xhc3MgdG9vLCBidXQgcGFnZXMgKGJ5IGRlZmluaXRpb24pCi0gICAgICAgICAgICAvLyBuZXZlciBoYXZlIHBhcmFtZXRlcnMuCi0KLSAgICAgICAgICAgIGlmIChnZXRTcGVjaWZpY2F0aW9uKCkuaXNQYWdlU3BlY2lmaWNhdGlvbigpKQotICAgICAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAgICAgX3BhcmFtZXRlck1hbmFnZXIgPSBuZXcgUGFyYW1ldGVyTWFuYWdlcih0aGlzKTsKLSAgICAgICAgfQotCi0gICAgICAgIF9wYXJhbWV0ZXJNYW5hZ2VyLnNldFBhcmFtZXRlcnMoY3ljbGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBJbnZva2VkIGJ5IHtAbGluayAjcmVuZGVyKElNYXJrdXBXcml0ZXIsIElSZXF1ZXN0Q3ljbGUpfQotICAgICAqICB0byBhY3R1YWxseSByZW5kZXIgdGhlIGNvbXBvbmVudCAod2l0aCBhbnkgcGFyYW1ldGVyIHZhbHVlcwotICAgICAqICBhbHJlYWR5IHNldCkuICBUaGlzIGlzIHRoZSBtZXRob2QgdGhhdCBzdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50LgotICAgICAqIAotICAgICAqICBAc2luY2UgMi4wLjMKLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCByZW5kZXJDb21wb25lbnQoSU1hcmt1cFdyaXRlciB3cml0ZXIsIElSZXF1ZXN0Q3ljbGUgY3ljbGUpOwotCi0gICAgLyoqCi0gICAgICogIEludm9rZWQgYnkge0BsaW5rICNyZW5kZXIoSU1hcmt1cFdyaXRlciwgSVJlcXVlc3RDeWNsZSl9Ci0gICAgICogIGFmdGVyIHRoZSBjb21wb25lbnQgcmVuZGVycywgdG8gY2xlYXIgYW55IHBhcmFtZXRlcnMgYmFjayB0bwotICAgICAqICBudWxsIChvciAwLCBvciBmYWxzZSwgb3Igd2hhdGV2ZXIgdGhlIGNvcnJlY3QgZGVmYXVsdCBpcykuICAKLSAgICAgKiAgUHJpbWFyaWx5LCB0aGlzIGlzIHVzZWQgdG8gZW5zdXJlCi0gICAgICogIHRoYXQgdGhlIGNvbXBvbmVudCBkb2Vzbid0IGhvbGQgb250byBhbnkgb2JqZWN0cyB0aGF0IGNvdWxkCi0gICAgICogIG90aGVyd2lzZSBiZSBnYXJiYWdlIGNvbGxlY3RlZC4KLSAgICAgKiAKLSAgICAgKiAgPHA+U3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyBpbXBsZW1lbnRhdGlvbiwgYnV0IG11c3QKLSAgICAgKiAgYWxzbyBpbnZva2UgaXQuCi0gICAgICogCi0gICAgICogIEBzaW5jZSAyLjAuMwotICAgICAqIAotICAgICAqKi8KLQotICAgIHByb3RlY3RlZCB2b2lkIGNsZWFudXBBZnRlclJlbmRlcihJUmVxdWVzdEN5Y2xlIGN5Y2xlKQotICAgIHsKLSAgICAgICAgVGFwZXN0cnkuYWRkTWV0aG9kSW52b2NhdGlvbihDTEVBTlVQQUZURVJSRU5ERVJfTUVUSE9EX0lEKTsKLQotICAgICAgICBpZiAoX3BhcmFtZXRlck1hbmFnZXIgIT0gbnVsbCkKLSAgICAgICAgICAgIF9wYXJhbWV0ZXJNYW5hZ2VyLnJlc2V0UGFyYW1ldGVycyhjeWNsZSk7Ci0gICAgfQotCi0gICAgLyoqIEBzaW5jZSAzLjAgKiovCi0KLSAgICBwdWJsaWMgSU1lc3NhZ2VzIGdldE1lc3NhZ2VzKCkKLSAgICB7Ci0gICAgICAgIGlmIChfc3RyaW5ncyA9PSBudWxsKQotICAgICAgICAgICAgX3N0cmluZ3MgPSBnZXRQYWdlKCkuZ2V0RW5naW5lKCkuZ2V0Q29tcG9uZW50TWVzc2FnZXNTb3VyY2UoKS5nZXRNZXNzYWdlcyh0aGlzKTsKLQotICAgICAgICByZXR1cm4gX3N0cmluZ3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIE9idGFpbnMgdGhlIHtAbGluayBJTWVzc2FnZXN9IGZvciB0aGlzIGNvbXBvbmVudAotICAgICAqICAoaWYgbmVjZXNzYXJ5KSwgYW5kIGdldHMgdGhlIHN0cmluZyBmcm9tIGl0LgotICAgICAqIAotICAgICAqKi8KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0TWVzc2FnZXMoKS5nZXRNZXNzYWdlKGtleSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBrZXkpCi0gICAgewotICAgICAgICAvLyBJbnZva2UgdGhlIGRlcHJlY2F0ZWQgaW1wbGVtZW50YXRpb24gKGZvciBjb2RlIGNvdmVyYWdlIHJlYXNvbnMpLgotICAgICAgICAvLyBJbiAzLjEsIHJlbW92ZSBnZXRTdHJpbmcoKSBhbmQgbW92ZSBpdHMgaW1wbGVtZW50YXRpb24KLSAgICAgICAgLy8gaGVyZS4KLQotICAgICAgICByZXR1cm4gZ2V0U3RyaW5nKGtleSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEZvcm1hdHMgYSBtZXNzYWdlIHN0cmluZywgdXNpbmcKLSAgICAgKiAge0BsaW5rIElNZXNzYWdlcyNmb3JtYXQoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdFtdKX0uCi0gICAgICogCi0gICAgICogIEBwYXJhbSBrZXkgdGhlIGtleSB1c2VkIHRvIG9idGFpbiBhIGxvY2FsaXplZCBwYXR0ZXJuIHVzaW5nCi0gICAgICogIHtAbGluayAjZ2V0U3RyaW5nKFN0cmluZyl9Ci0gICAgICogIEBwYXJhbSBhcmd1bWVudHMgcGFzc2VkIHRvIHRoZSBmb3JtYXR0ZXIKLSAgICAgKiAKLSAgICAgKiAgQHNpbmNlIDIuMgotICAgICAqICBAZGVwcmVjYXRlZCBUbyBiZSByZW1vdmVkIGluIDMuMS4gIFVzZSB7QGxpbmsgI2Zvcm1hdChTdHJpbmcsIE9iamVjdFtdKX0gaW5zdGVhZC4KLSAgICAgKiovCi0KLSAgICBwdWJsaWMgU3RyaW5nIGZvcm1hdFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3RbXSBhcmd1bWVudHMpCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0TWVzc2FnZXMoKS5mb3JtYXQoa2V5LCBhcmd1bWVudHMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZvcm1hdHMgYSBsb2NhbGl6ZWQgbWVzc2FnZSBzdHJpbmcsIHVzaW5nCi0gICAgICoge0BsaW5rIElNZXNzYWdlcyNmb3JtYXQoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdFtdKX0uCi0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkgdXNlZCB0byBvYnRhaW4gYSBsb2NhbGl6ZWQgcGF0dGVybiB1c2luZwotICAgICAqIHtAbGluayAjZ2V0U3RyaW5nKFN0cmluZyl9Ci0gICAgICogQHBhcmFtIGFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlIGZvcm1hdHRlcgotICAgICAqIAotICAgICAqIEBzaW5jZSAzLjAKLSAgICAgKi8KLQotICAgIHB1YmxpYyBTdHJpbmcgZm9ybWF0KFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3VtZW50cykKLSAgICB7Ci0gICAgICAgIC8vIFNPUDogTmV3IG5hbWUgaW52b2tlcyBkZXByZWNhdGVkIG1ldGhvZCAoY29uc2lzdGVuY3kgYW5kIAotICAgICAgICAvLyBjb2RlIGNvdmVyYWdlKTsgaW4gMy4xIHdlIG1vdmUgdGhlIGltcGxlbWVudGF0aW9uIGhlcmUuCi0KLSAgICAgICAgcmV0dXJuIGZvcm1hdFN0cmluZyhrZXksIGFyZ3VtZW50cyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIENvbnZpZW5pZW5jZSBtZXRob2QgZm9yIGludm9raW5nIHtAbGluayBJTWVzc2FnZXMjZm9ybWF0KFN0cmluZywgT2JqZWN0W10pfQotICAgICAqIAotICAgICAqICBAc2luY2UgMi4yCi0gICAgICogIEBkZXByZWNhdGVkIFRvIGJlIHJlbW92ZWQgaW4gMy4xLiAgVXNlIHtAbGluayAjZm9ybWF0KFN0cmluZywgT2JqZWN0KX0gaW5zdGVhZC4KLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgU3RyaW5nIGZvcm1hdFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3QgYXJndW1lbnQpCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0TWVzc2FnZXMoKS5mb3JtYXQoa2V5LCBhcmd1bWVudCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmllbmllbmNlIG1ldGhvZCBmb3IgaW52b2tpbmcge0BsaW5rIElNZXNzYWdlcyNmb3JtYXQoU3RyaW5nLCBPYmplY3QpfQotICAgICAqIAotICAgICAqIEBzaW5jZSAzLjAKLSAgICAgKiAKLSAgICAgKi8KLQotICAgIHB1YmxpYyBTdHJpbmcgZm9ybWF0KFN0cmluZyBrZXksIE9iamVjdCBhcmd1bWVudCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBmb3JtYXRTdHJpbmcoa2V5LCBhcmd1bWVudCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIENvbnZpZW5pZW5jZSBtZXRob2QgZm9yIGludm9raW5nIHtAbGluayBJTWVzc2FnZXMjZm9ybWF0KFN0cmluZywgT2JqZWN0LCBPYmplY3QpfS4KLSAgICAgKiAKLSAgICAgKiAgQHNpbmNlIDIuMgotICAgICAqICBAZGVwcmVjYXRlZCBUbyBiZSByZW1vdmVkIGluIDMuMS4gIFVzZSB7QGxpbmsgI2Zvcm1hdChTdHJpbmcsIE9iamVjdCwgT2JqZWN0KX0gaW5zdGVhZC4KLSAgICAgKiovCi0KLSAgICBwdWJsaWMgU3RyaW5nIGZvcm1hdFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3QgYXJndW1lbnQxLCBPYmplY3QgYXJndW1lbnQyKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldE1lc3NhZ2VzKCkuZm9ybWF0KGtleSwgYXJndW1lbnQxLCBhcmd1bWVudDIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZpZW5pZW5jZSBtZXRob2QgZm9yIGludm9raW5nIHtAbGluayBJTWVzc2FnZXMjZm9ybWF0KFN0cmluZywgT2JqZWN0LCBPYmplY3QpfS4KLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMy4wCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIFN0cmluZyBmb3JtYXQoU3RyaW5nIGtleSwgT2JqZWN0IGFyZ3VtZW50MSwgT2JqZWN0IGFyZ3VtZW50MikKLSAgICB7Ci0gICAgICAgIHJldHVybiBmb3JtYXRTdHJpbmcoa2V5LCBhcmd1bWVudDEsIGFyZ3VtZW50Mik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmllbmllbmNlIG1ldGhvZCBmb3Ige0BsaW5rIElNZXNzYWdlcyNmb3JtYXQoU3RyaW5nLCBPYmplY3QsIE9iamVjdCwgT2JqZWN0KX0uCi0gICAgICogCi0gICAgICogQHNpbmNlIDIuMgotICAgICAqIEBkZXByZWNhdGVkIFRvIGJlIHJlbW92ZWQgaW4gMy4xLiAgVXNlIHtAbGluayAjZm9ybWF0KFN0cmluZywgT2JqZWN0LCBPYmplY3QsIE9iamVjdCl9IGluc3RlYWQuCi0gICAgICovCi0KLSAgICBwdWJsaWMgU3RyaW5nIGZvcm1hdFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3QgYXJndW1lbnQxLCBPYmplY3QgYXJndW1lbnQyLCBPYmplY3QgYXJndW1lbnQzKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldE1lc3NhZ2VzKCkuZm9ybWF0KGtleSwgYXJndW1lbnQxLCBhcmd1bWVudDIsIGFyZ3VtZW50Myk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmllbmllbmNlIG1ldGhvZCBmb3Ige0BsaW5rIElNZXNzYWdlcyNmb3JtYXQoU3RyaW5nLCBPYmplY3QsIE9iamVjdCwgT2JqZWN0KX0uCi0gICAgICogCi0gICAgICogQHNpbmNlIDMuMAotICAgICAqLwotCi0gICAgcHVibGljIFN0cmluZyBmb3JtYXQoU3RyaW5nIGtleSwgT2JqZWN0IGFyZ3VtZW50MSwgT2JqZWN0IGFyZ3VtZW50MiwgT2JqZWN0IGFyZ3VtZW50MykKLSAgICB7Ci0gICAgICAgIHJldHVybiBmb3JtYXRTdHJpbmcoa2V5LCBhcmd1bWVudDEsIGFyZ3VtZW50MiwgYXJndW1lbnQzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSU5hbWVzcGFjZSBnZXROYW1lc3BhY2UoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9uYW1lc3BhY2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZXNwYWNlKElOYW1lc3BhY2UgbmFtZXNwYWNlKQotICAgIHsKLSAgICAgICAgX25hbWVzcGFjZSA9IG5hbWVzcGFjZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0aGUgYm9keSBvZiB0aGUgY29tcG9uZW50LCB0aGUgZWxlbWVudCAod2hpY2ggbWF5IGJlIHN0YXRpYyBIVE1MIG9yIGNvbXBvbmVudHMpCi0gICAgICogIHRoYXQgdGhlIGNvbXBvbmVudCBpbW1lZGlhdGVseSB3cmFwcy4gIE1heSByZXR1cm4gbnVsbC4gIERvIG5vdCBtb2RpZnkgdGhlIHJldHVybmVkCi0gICAgICogIGFycmF5LiAgVGhlIGFycmF5IG1heSBiZSBwYWRkZWQgd2l0aCBudWxscy4KLSAgICAgKiAKLSAgICAgKiAgQHNpbmNlIDIuMwotICAgICAqICBAc2VlICNnZXRCb2R5Q291bnQoKQotICAgICAqIAotICAgICAqKi8KLQotICAgIHB1YmxpYyBJUmVuZGVyW10gZ2V0Qm9keSgpCi0gICAgewotICAgICAgICByZXR1cm4gX2JvZHk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgdGhlIGFjdGl2ZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHRoZSBib2R5LCB3aGljaCBtYXkgYmUgemVyby4KLSAgICAgKiAKLSAgICAgKiAgQHNpbmNlIDIuMwotICAgICAqICBAc2VlICNnZXRCb2R5KCkKLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgaW50IGdldEJvZHlDb3VudCgpCi0gICAgewotICAgICAgICByZXR1cm4gX2JvZHlDb3VudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFbXB0eSBpbXBsZW1lbnRhdGlvbiBvZgotICAgICAqIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LmV2ZW50LlBhZ2VSZW5kZXJMaXN0ZW5lciNwYWdlRW5kUmVuZGVyKFBhZ2VFdmVudCl9LgotICAgICAqIFRoaXMgYWxsb3dzIGNsYXNzZXMgdG8gaW1wbGVtZW50Ci0gICAgICoge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkuZXZlbnQuUGFnZVJlbmRlckxpc3RlbmVyfSBhbmQgb25seQotICAgICAqIGltcGxlbWVudCB0aGUKLSAgICAgKiB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5ldmVudC5QYWdlUmVuZGVyTGlzdGVuZXIjcGFnZUJlZ2luUmVuZGVyKFBhZ2VFdmVudCl9Ci0gICAgICogbWV0aG9kLgotICAgICAqIEBzaW5jZSAzLjAKLSAgICAgKi8KLQotICAgIHB1YmxpYyB2b2lkIHBhZ2VFbmRSZW5kZXIoUGFnZUV2ZW50IGV2ZW50KQotICAgIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgU2V0cyBhIHByb3BlcnR5IG9mIGEgY29tcG9uZW50LgotICAgICAqICBAc2VlIElDb21wb25lbnQgCi0gICAgICogIEBzaW5jZSAzLjAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgdmFsdWUpCi0gICAgewotICAgICAgICBJUmVzb3VyY2VSZXNvbHZlciByZXNvbHZlciA9IGdldFJlc291cmNlUmVzb2x2ZXIoKTsKLSAgICAgICAgT2dubFV0aWxzLnNldChwcm9wZXJ0eU5hbWUsIHJlc29sdmVyLCB0aGlzLCB2YWx1ZSk7Ci0gICAgfQotICAgIC8qKgotICAgICAqICBHZXRzIGEgcHJvcGVydHkgb2YgYSBjb21wb25lbnQuCi0gICAgICogIEBzZWUgSUNvbXBvbmVudCAKLSAgICAgKiAgQHNpbmNlIDMuMAotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkKLSAgICB7Ci0gICAgICAgIElSZXNvdXJjZVJlc29sdmVyIHJlc29sdmVyID0gZ2V0UmVzb3VyY2VSZXNvbHZlcigpOwotICAgICAgICByZXR1cm4gT2dubFV0aWxzLmdldChwcm9wZXJ0eU5hbWUsIHJlc29sdmVyLCB0aGlzKTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L0Fic3RyYWN0TWFya3VwV3JpdGVyLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvQWJzdHJhY3RNYXJrdXBXcml0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ1MTRiMy4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvQWJzdHJhY3RNYXJrdXBXcml0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0MyArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeTsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLlN0YWNrOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS51dGlsLkNvbnRlbnRUeXBlOwotCi0vKioKLSAqIEFic3RyYWN0IGJhc2UgY2xhc3MgaW1wbGVtZW50aW5nIHRoZSB7QGxpbmsgSU1hcmt1cFdyaXRlcn0gaW50ZXJmYWNlLgotICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIGNyZWF0ZSBhIEdlbmVyaWMgVGFnIE1hcmt1cCBMYW5ndWFnZSAoR1RNTCkgb3V0cHV0LiAgIAotICogSXQgaXMgbW9yZSBzb3BoaXN0aWNhdGVkIHRoYW4gPGNvZGU+UHJpbnRXcml0ZXI8L2NvZGU+IGluIHRoYXQgaXQgbWFpbnRhaW5zICAgCi0gKiBhIGNvbmNlcHQgaGllcmFyY2h5IG9mIG9wZW4gR1RNTCB0YWdzLiBJdCBhbHNvIHN1cHBsaWVzIGEgbnVtYmVyIG9mIG90aGVyCi0gKiBvZiB0aGUgZmVhdHVyZXMgdGhhdCBhcmUgdXNlZnVsIHdoZW4gY3JlYXRpbmcgR1RNTC4KLSAqCi0gKiBFbGVtZW50cyBhcmUgc3RhcnRlZCB3aXRoIHRoZSB7QGxpbmsgI2JlZ2luKFN0cmluZyl9IAotICogb3Ige0BsaW5rICNiZWdpbkVtcHR5KFN0cmluZyl9Ci0gKiBtZXRob2RzLiBPbmNlIHRoZXkgYXJlIHN0YXJ0ZWQsIGF0dHJpYnV0ZXMgZm9yIHRoZSBlbGVtZW50cyBtYXkgYmUgc2V0IHdpdGgKLSAqIHRoZSB2YXJpb3VzIDxjb2RlPmF0dHJpYnV0ZSgpPC9jb2RlPiBtZXRob2RzLiBUaGUgZWxlbWVudCBpcyBjbG9zZWQgb2ZmCi0gKiAoaS5lLiwgdGhlIGNsb3NpbmcgJyZndDsnIGNoYXJhY3RlciBpcyB3cml0dGVuKSB3aGVuIGFueSBvdGhlciBtZXRob2QKLSAqIGlzIGludm9rZWQgKGV4Y2VwdGlvbjogbWV0aG9kcyB3aGljaCBkbyBub3QgcHJvZHVjZSBvdXRwdXQsIHN1Y2ggYXMKLSAqIHtAbGluayAjZmx1c2goKX0pLiBUaGUgPGNvZGU+ZW5kKCk8L2NvZGU+IG1ldGhvZHMgZW5kIGFuIGVsZW1lbnQsCi0gKiB3cml0aW5nIGFuIEdUTUwgY2xvc2UgdGFnIHRvIHRoZSBvdXRwdXQuCi0gKgotICogPHA+VEJEOgotICogPHVsPgotICogPGxpPlN1cHBvcnQgWE1MIGFuZCBYSFRNTAotICogIDxsaT5XaGF0IHRvIGRvIHdpdGggVW5pY29kZSBjaGFyYWN0ZXJzIHdpdGggYSB2YWx1ZSBncmVhdGVyIHRoYW4gMjU1PwotICogPC91bD4KLSAqCi0gKiA8cD5UaGlzIGNsYXNzIGlzIGRlcml2ZWQgZnJvbSB0aGUgb3JpZ2luYWwgY2xhc3MgCi0gKiA8Y29kZT5jb20ucHJpbWl4LnNlcnZsZXQuSFRNTFdyaXRlcjwvY29kZT4sCi0gKiBwYXJ0IG9mIHRoZSA8Yj5TZXJ2bGV0VXRpbHM8L2I+IGZyYW1ld29yayBhdmFpbGFibGUgZnJvbQotICogPGEgaHJlZj0iaHR0cDovL3d3dy5nanQub3JnL3NlcnZsZXRzL0pDVlNsZXQvbGlzdC9nanQvY29tL3ByaW1peC9zZXJ2bGV0Ij5UaGUgR2lhbnQgCi0gKiBKYXZhIFRyZWU8L2E+LgotICoKLSAqIEB2ZXJzaW9uICRJZCQKLSAqIEBhdXRob3IgSG93YXJkIFNoaXAsIERhdmlkIFNvbGlzCi0gKiBAc2luY2UgMC4yLjkKLSAqCi0gKiovCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE1hcmt1cFdyaXRlciBpbXBsZW1lbnRzIElNYXJrdXBXcml0ZXIKLXsKLSAgICAvKioKLSAgICAgKiBUaGUgZW5jb2RpbmcgdG8gYmUgdXNlZCBzaG91bGQgaXQgYmUgb21pdHRlZCBpbiB0aGUgY29uc3RydWN0b3JzLgotICAgICAqIFRoaXMgaXMgb25seSB1c2VkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LiBOZXcgY29kZSBhbHdheXMgcHJvdmlkZXMgdGhlIGVuY29kaW5nLgotICAgICAqLwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfRU5DT0RJTkcgPSAidXRmLTgiOwotCi0gICAgLyoqCi0gICAgICogVGhlIHVuZGVybHlpbmcge0BsaW5rIFByaW50V3JpdGVyfSB0aGF0IG91dHB1dCBpcyBzZW50IHRvLiAKLSAgICAgKiAgCi0gICAgICoqLwotCi0gICAgcHJpdmF0ZSBQcmludFdyaXRlciBfd3JpdGVyOwotCi0gICAgLyoqCi0gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgYSB0YWcgaXMgb3BlbiBvciBub3QuIEEgdGFnIGlzIG9wZW5lZCBieQotICAgICAqIHtAbGluayAjYmVnaW4oU3RyaW5nKX0gb3Ige0BsaW5rICNiZWdpbkVtcHR5KFN0cmluZyl9LgotICAgICAqIEl0IHN0YXlzIG9wZW4gd2hpbGUgY2FsbHMgdG8gdGhlIDxjb2RlPmF0dHJpYnV0ZSgpPC9jb2RlPgotICAgICAqIG1ldGhvZHMgYXJlIG1hZGUuIEl0IGlzIGNsb3NlZAotICAgICAqICh0aGUgJyZndDsnIGlzIHdyaXR0ZW4pIHdoZW4gYW55IG90aGVyIG1ldGhvZCBpcyBpbnZva2VkLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHJpdmF0ZSBib29sZWFuIF9vcGVuVGFnID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiAgSW5kaWNhdGVzIHRoYXQgdGhlIHRhZyB3YXMgb3BlbmVkIHdpdGggCi0gICAgICogIHtAbGluayAjYmVnaW5FbXB0eShTdHJpbmcpfSwgd2hpY2ggYWZmZWN0cwotICAgICAqICBob3cgdGhlIHRhZyBpcyBjbG9zZWQgKGEgc2xhc2ggaXMgYWRkZWQgdG8gaW5kaWNhdGUgdGhlCi0gICAgICogIGxhY2sgb2YgYSBib2R5KS4gIFRoaXMgaXMgY29tcGF0aWJsZSB3aXRoIEhUTUwsIGJ1dCByZWZsZWN0cwotICAgICAqICBhbiBYTUwvWEhUTUwgbGVhbmluZy4KLSAgICAgKiAKLSAgICAgKiAgQHNpbmNlIDIuMgotICAgICAqIAotICAgICAqKi8KLQotICAgIHByaXZhdGUgYm9vbGVhbiBfZW1wdHlUYWcgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIEEgU3RhY2sgb2YgU3RyaW5ncyB1c2VkIHRvIHRyYWNrIHRoZSBhY3RpdmUgdGFnIGVsZW1lbnRzLiBFbGVtZW50cyBhcmUgYWN0aXZlCi0gICAgICogdW50aWwgdGhlIGNvcnJlc3BvbmRpbmcgY2xvc2UgdGFnIGlzIHdyaXR0ZW4uICBUaGUge0BsaW5rICNwdXNoKFN0cmluZyl9IG1ldGhvZAotICAgICAqIGFkZHMgZWxlbWVudHMgdG8gdGhlIHN0YWNrLCB7QGxpbmsgI3BvcCgpfSByZW1vdmVzIHRoZW0uCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwcml2YXRlIFN0YWNrIF9hY3RpdmVFbGVtZW50U3RhY2s7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVwdGggb2YgdGhlIG9wZW4gdGFnIHN0YWNrLgotICAgICAqIEBzZWUgI19hY3RpdmVFbGVtZW50U3RhY2sKLSAgICAgKgotICAgICAqKi8KLQotICAgIHByaXZhdGUgaW50IF9kZXB0aCA9IDA7Ci0KLSAgICBwcml2YXRlIGNoYXJbXSBfYnVmZmVyOwotCi0gICAgcHJpdmF0ZSBTdHJpbmdbXSBfZW50aXRpZXM7Ci0gICAgcHJpdmF0ZSBib29sZWFuW10gX3NhZmU7Ci0KLSAgICAvKioKLSAgICAgKiAgSW1wbGVtZW50ZWQgaW4gY29uY3JldGUgc3ViY2xhc3NlcyB0byBwcm92aWRlIGFuIGluZGljYXRpb24gb2Ygd2hpY2gKLSAgICAgKiAgY2hhcmFjdGVycyBhcmUgJ3NhZmUnIHRvIGluc2VydCBkaXJlY3RseSBpbnRvIHRoZSByZXNwb25zZS4gIFRoZSBpbmRleAotICAgICAqICBpbnRvIHRoZSBhcnJheSBpcyB0aGUgY2hhcmFjdGVyLCBpZiB0aGUgdmFsdWUgYXQgdGhlIGluZGV4IGlzIGZhbHNlIChvciB0aGUKLSAgICAgKiAgaW5kZXggb3V0IG9mIHJhbmdlKSwgdGhlbiB0aGUgY2hhcmFjdGVyIGlzIGVzY2FwZWQuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwcml2YXRlIFN0cmluZyBfY29udGVudFR5cGU7Ci0KLSAgICAvKioKLSAgICAgKiAgSW5kaWNhdGVzIHdoZXRoZXIge0BsaW5rICNjbG9zZSgpfSBzaG91bGQgY2xvc2UgdGhlIAotICAgICAqICB1bmRlcmx5aW5nIHtAbGluayBQcmludFdyaXRlcn0uCi0gICAgICogCi0gICAgICogIEBzaW5jZSAzLjAKLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwcml2YXRlIGJvb2xlYW4gX3Byb3BhZ2F0ZUNsb3NlID0gdHJ1ZTsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudFR5cGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9jb250ZW50VHlwZTsKLSAgICB9Ci0KLSAgICBhYnN0cmFjdCBwdWJsaWMgSU1hcmt1cFdyaXRlciBnZXROZXN0ZWRXcml0ZXIoKTsKLQotICAgIC8qKgotICAgICAqICBHZW5lcmFsIGNvbnN0cnVjdG9yIHVzZWQgYnkgc3ViY2xhc3Nlcy4KLSAgICAgKiAKLSAgICAgKiAgQHBhcmFtIHNhZmUgYW4gYXJyYXkgb2YgZmxhZ3MgaW5kaWNhdGluZyB3aGljaCBjaGFyYWN0ZXJzCi0gICAgICogIGNhbiBiZSBwYXNzZWQgZGlyZWN0bHkgdGhyb3VnaCB3aXRoIG91dCBmaWx0ZXJpbmcuICBDaGFyYWN0ZXJzIG1hcmtlZAotICAgICAqICB1bnNhZmUsIG9yIG91dHNpZGUgdGhlIHJhbmdlIGRlZmluZWQgYnkgc2FmZSwgYXJlIGNvbnZlcnRlZCB0byBlbnRpdGllcy4KLSAgICAgKiAgQHBhcmFtIGVudGl0aWVzIGEgc2V0IG9mIHByZWZlcmVkIGVudGl0aWVzLCB1bnNhZmUgY2hhcmFjdGVycyB3aXRoCi0gICAgICogIGEgZGVmaW5lZCBlbnRpdHkgdXNlIHRoZSBlbnRpdHksIG90aGVyIGNoYXJhY3RlcnMgYXJlIGNvbnZlcnRlZAotICAgICAqICB0byBudW1lcmljIGVudGl0aWVzLgotICAgICAqICBAcGFyYW0gY29udGVudFR5cGUgdGhlIE1JTUUgdHlwZSBvZiB0aGUgY29udGVudCBwcm9kdWNlZCBieSB0aGUgd3JpdGVyLgotICAgICAqICBAcGFyYW0gZW5jb2RpbmcgdGhlIGVuY29kaW5nIG9mIGNvbnRlbnQgcHJvZHVjZWQgYnkgdGhlIHdyaXRlci4KLSAgICAgKiAgQHBhcmFtIHN0cmVhbSBzdHJlYW0gdG8gd2hpY2ggY29udGVudCB3aWxsIGJlIHdyaXR0ZW4uCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwcm90ZWN0ZWQgQWJzdHJhY3RNYXJrdXBXcml0ZXIoCi0gICAgICAgIGJvb2xlYW4gc2FmZVtdLAotICAgICAgICBTdHJpbmdbXSBlbnRpdGllcywKLSAgICAgICAgU3RyaW5nIGNvbnRlbnRUeXBlLAotICAgICAgICBTdHJpbmcgZW5jb2RpbmcsCi0gICAgICAgIE91dHB1dFN0cmVhbSBzdHJlYW0pCi0gICAgewotICAgICAgICBpZiAoZW50aXRpZXMgPT0gbnVsbCB8fCBzYWZlID09IG51bGwgfHwgY29udGVudFR5cGUgPT0gbnVsbCB8fCBlbmNvZGluZyA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICBUYXBlc3RyeS5nZXRNZXNzYWdlKCJBYnN0cmFjdE1hcmt1cFdyaXRlci5taXNzaW5nLWNvbnN0cnVjdG9yLXBhcmFtZXRlcnMiKSk7Ci0KLSAgICAgICAgX2VudGl0aWVzID0gZW50aXRpZXM7Ci0gICAgICAgIF9zYWZlID0gc2FmZTsKLQotICAgICAgICBfY29udGVudFR5cGUgPSBnZW5lcmF0ZUZ1bGxDb250ZW50VHlwZShjb250ZW50VHlwZSwgZW5jb2RpbmcpOwotCi0gICAgICAgIHNldE91dHB1dFN0cmVhbShzdHJlYW0sIGVuY29kaW5nKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgR2VuZXJhbCBjb25zdHJ1Y3RvciB1c2VkIGJ5IHN1YmNsYXNzZXMuCi0gICAgICogIFRoaXMgY29uc3RydWN0b3IgaXMgbGVmdCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4gSXQgaXMgcHJlZmVycmVkIHRoYXQgCi0gICAgICogIGl0IGlzIG5vdCB1c2VkIHNpbmNlIGl0IGRvZXMgbm90IHNwZWNpZnkgYW4gZW5jb2RpbmcgZm9yIGNvbnZlcnNpb24uCi0gICAgICogCi0gICAgICogIEBwYXJhbSBzYWZlIGFuIGFycmF5IG9mIGZsYWdzIGluZGljYXRpbmcgd2hpY2ggY2hhcmFjdGVycwotICAgICAqICBjYW4gYmUgcGFzc2VkIGRpcmVjdGx5IHRocm91Z2ggd2l0aCBvdXQgZmlsdGVyaW5nLiAgQ2hhcmFjdGVycyBtYXJrZWQKLSAgICAgKiAgdW5zYWZlLCBvciBvdXRzaWRlIHRoZSByYW5nZSBkZWZpbmVkIGJ5IHNhZmUsIGFyZSBjb252ZXJ0ZWQgdG8gZW50aXRpZXMuCi0gICAgICogIEBwYXJhbSBlbnRpdGllcyBhIHNldCBvZiBwcmVmZXJlZCBlbnRpdGllcywgdW5zYWZlIGNoYXJhY3RlcnMgd2l0aAotICAgICAqICBhIGRlZmluZWQgZW50aXR5IHVzZSB0aGUgZW50aXR5LCBvdGhlciBjaGFyYWN0ZXJzIGFyZSBjb252ZXJ0ZWQKLSAgICAgKiAgdG8gbnVtZXJpYyBlbnRpdGllcy4KLSAgICAgKiAgQHBhcmFtIGNvbnRlbnRUeXBlIHRoZSB0eXBlIG9mIGNvbnRlbnQgcHJvZHVjZWQgYnkgdGhlCi0gICAgICogIHdyaXRlci4KLSAgICAgKiAgQHBhcmFtIHN0cmVhbSBzdHJlYW0gdG8gd2hpY2ggY29udGVudCB3aWxsIGJlIHdyaXR0ZW4uCi0gICAgICoqLwotCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0TWFya3VwV3JpdGVyKAotICAgICAgICBib29sZWFuIHNhZmVbXSwKLSAgICAgICAgU3RyaW5nW10gZW50aXRpZXMsCi0gICAgICAgIFN0cmluZyBjb250ZW50VHlwZSwKLSAgICAgICAgT3V0cHV0U3RyZWFtIHN0cmVhbSkKLSAgICB7Ci0gICAgICAgIHRoaXMoc2FmZSwgZW50aXRpZXMsIGNvbnRlbnRUeXBlKTsKLQotICAgICAgICBDb250ZW50VHlwZSBjb250ZW50VHlwZU9iamVjdCA9IG5ldyBDb250ZW50VHlwZShjb250ZW50VHlwZSk7Ci0gICAgICAgIFN0cmluZyBlbmNvZGluZyA9IGNvbnRlbnRUeXBlT2JqZWN0LmdldFBhcmFtZXRlcigiY2hhcnNldCIpOwotCi0gICAgICAgIHNldE91dHB1dFN0cmVhbShzdHJlYW0sIGVuY29kaW5nKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgQ3JlYXRlcyBuZXcgbWFya3VwIHdyaXRlciBhcm91bmQgdGhlIHVuZGVybHlpbmcge0BsaW5rIFByaW50V3JpdGVyfS4KLSAgICAgKiAKLSAgICAgKiAgPHA+VGhpcyBpcyBwcmltYXJpbHkgdXNlZCBieSB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5lbmdpbmUuVGFnU3VwcG9ydFNlcnZpY2V9LAotICAgICAqICB3aGljaCBpcyBpbmxjdWRpbmcgY29udGVudCwgYW5kIHRoZXJlZm9yZSB0aGlzIG1ldGhvZCB3aWxsIG5vdAotICAgICAqICBjbG9zZSB0aGUgd3JpdGVyIHdoZW4gdGhlIG1hcmt1cCB3cml0ZXIgaXMgY2xvc2VkLgotICAgICAqIAotICAgICAqICBAc2luY2UgMy4wCi0gICAgICogIAotICAgICAqKi8KLQotICAgIHByb3RlY3RlZCBBYnN0cmFjdE1hcmt1cFdyaXRlcigKLSAgICAgICAgYm9vbGVhbiBzYWZlW10sCi0gICAgICAgIFN0cmluZ1tdIGVudGl0aWVzLAotICAgICAgICBTdHJpbmcgY29udGVudFR5cGUsCi0gICAgICAgIFByaW50V3JpdGVyIHdyaXRlcikKLSAgICB7Ci0gICAgICAgIHRoaXMoc2FmZSwgZW50aXRpZXMsIGNvbnRlbnRUeXBlKTsKLQotICAgICAgICAvLyBXaGVuIHRoZSBtYXJrdXAgd3JpdGVyIGlzIGNsb3NlZCwgdGhlIHVuZGVybHlpbmcgd3JpdGVyCi0gICAgICAgIC8vIGlzIE5PVCBjbG9zZWQuCi0KLSAgICAgICAgX3Byb3BhZ2F0ZUNsb3NlID0gZmFsc2U7Ci0gICAgICAgIF93cml0ZXIgPSB3cml0ZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFNwZWNpYWwgY29uc3RydWN0b3IgdXNlZCBmb3IgbmVzdGVkIHJlc3BvbnNlIHdyaXRlcnMuCi0gICAgICogIFRoZSBzdWJjbGFzcyBpcyByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgdGhlIHdyaXRlci4KLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwcm90ZWN0ZWQgQWJzdHJhY3RNYXJrdXBXcml0ZXIoYm9vbGVhbiBzYWZlW10sIFN0cmluZ1tdIGVudGl0aWVzLCBTdHJpbmcgY29udGVudFR5cGUpCi0gICAgewotICAgICAgICBpZiAoZW50aXRpZXMgPT0gbnVsbCB8fCBzYWZlID09IG51bGwgfHwgY29udGVudFR5cGUgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgVGFwZXN0cnkuZ2V0TWVzc2FnZSgiQWJzdHJhY3RNYXJrdXBXcml0ZXIubWlzc2luZy1jb25zdHJ1Y3Rvci1wYXJhbWV0ZXJzIikpOwotCi0gICAgICAgIF9lbnRpdGllcyA9IGVudGl0aWVzOwotICAgICAgICBfc2FmZSA9IHNhZmU7Ci0gICAgICAgIF9jb250ZW50VHlwZSA9IGdlbmVyYXRlRnVsbENvbnRlbnRUeXBlKGNvbnRlbnRUeXBlLCBERUZBVUxUX0VOQ09ESU5HKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFbnN1cmVzIHRoYXQgdGhlIGNvbnRlbnQgdHlwZSBoYXMgYSBjaGFyc2V0IChlbmNvZGluZykgcGFyYW1ldGVyLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjb250ZW50VHlwZSBUaGUgY29udGVudCB0eXBlLCBlLmcuIHRleHQvaHRtbC4gSXQgbWF5IGNvbnRhaW4gYSBjaGFyc2V0IHBhcmFtZXRlci4KLSAgICAgKiBAcGFyYW0gZW5jb2RpbmcgVGhlIHZhbHVlIG9mIHRoZSBjaGFyc2V0IHBhcmFtZXRlciBvZiB0aGUgY29udGVudCB0eXBlIGlmIGl0IGlzIG5vdCBhbHJlYWR5IHByZXNlbnQuCi0gICAgICogQHJldHVybiBUaGUgY29udGVudCB0eXBlIGNvbnRhaW5pbmcgYSBjaGFyc2V0IHBhcmFtZXRlciwgZS5nLiB0ZXh0L2h0bWw7Y2hhcnNldD11dGYtOCAKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBnZW5lcmF0ZUZ1bGxDb250ZW50VHlwZShTdHJpbmcgY29udGVudFR5cGUsIFN0cmluZyBlbmNvZGluZykKLSAgICB7Ci0gICAgICAgIENvbnRlbnRUeXBlIGNvbnRlbnRUeXBlT2JqZWN0ID0gbmV3IENvbnRlbnRUeXBlKGNvbnRlbnRUeXBlKTsKLSAgICAgICAgaWYgKGNvbnRlbnRUeXBlT2JqZWN0LmdldFBhcmFtZXRlcigiY2hhcnNldCIpID09IG51bGwpCi0gICAgICAgICAgICBjb250ZW50VHlwZU9iamVjdC5zZXRQYXJhbWV0ZXIoImNoYXJzZXQiLCBlbmNvZGluZyk7Ci0gICAgICAgIHJldHVybiBjb250ZW50VHlwZU9iamVjdC51bnBhcnNlKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0V3JpdGVyKFByaW50V3JpdGVyIHdyaXRlcikKLSAgICB7Ci0gICAgICAgIF93cml0ZXIgPSB3cml0ZXI7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0T3V0cHV0U3RyZWFtKE91dHB1dFN0cmVhbSBzdHJlYW0sIFN0cmluZyBlbmNvZGluZykKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBPdXRwdXRTdHJlYW1Xcml0ZXIgb3dyaXRlcjsKLSAgICAgICAgICAgIGlmIChlbmNvZGluZyAhPSBudWxsKQotICAgICAgICAgICAgICAgIG93cml0ZXIgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKHN0cmVhbSwgZW5jb2RpbmcpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIG93cml0ZXIgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKHN0cmVhbSk7Ci0gICAgICAgICAgICBXcml0ZXIgYndyaXRlciA9IG5ldyBCdWZmZXJlZFdyaXRlcihvd3JpdGVyKTsKLQotICAgICAgICAgICAgX3dyaXRlciA9IG5ldyBQcmludFdyaXRlcihid3JpdGVyKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIFRhcGVzdHJ5LmZvcm1hdCgiaWxsZWdhbC1lbmNvZGluZyIsIGVuY29kaW5nKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZXMgYW4gaW50ZWdlciBhdHRyaWJ1dGUgaW50byB0aGUgY3VycmVudGx5IG9wZW4gdGFnLgotICAgICAqCi0gICAgICogPHA+VEJEOiBWYWxpZGF0ZSB0aGF0IG5hbWUgaXMgbGVnYWwuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBubyBvcGVuIHRhZy4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIGF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgaW50IHZhbHVlKQotICAgIHsKLSAgICAgICAgY2hlY2tUYWdPcGVuKCk7Ci0KLSAgICAgICAgX3dyaXRlci5wcmludCgnICcpOwotICAgICAgICBfd3JpdGVyLnByaW50KG5hbWUpOwotICAgICAgICBfd3JpdGVyLnByaW50KCI9XCIiKTsKLSAgICAgICAgX3dyaXRlci5wcmludCh2YWx1ZSk7Ci0gICAgICAgIF93cml0ZXIucHJpbnQoJyInKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgV3JpdGVzIGEgYm9vbGVhbiBhdHRyaWJ1dGUgaW50byB0aGUgY3VycmVudGx5IG9wZW4gdGFnLgotICAgICAqCi0gICAgICogIDxwPlRCRDogVmFsaWRhdGUgdGhhdCBuYW1lIGlzIGxlZ2FsLgotICAgICAqCi0gICAgICogIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZXJlIGlzIG5vIG9wZW4gdGFnLgotICAgICAqCi0gICAgICogIEBzaW5jZSAzLjAKLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIGF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgYm9vbGVhbiB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIGNoZWNrVGFnT3BlbigpOwotCi0gICAgICAgIF93cml0ZXIucHJpbnQoJyAnKTsKLSAgICAgICAgX3dyaXRlci5wcmludChuYW1lKTsKLSAgICAgICAgX3dyaXRlci5wcmludCgiPVwiIik7Ci0gICAgICAgIF93cml0ZXIucHJpbnQodmFsdWUpOwotICAgICAgICBfd3JpdGVyLnByaW50KCciJyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFdyaXRlcyBhbiBhdHRyaWJ1dGUgaW50byB0aGUgbW9zdCByZWNlbnRseSBvcGVuZWQgdGFnLiBUaGlzIG11c3QgYmUgY2FsbGVkIGFmdGVyCi0gICAgICogIHtAbGluayAjYmVnaW4oU3RyaW5nKX0KLSAgICAgKiAgYW5kIGJlZm9yZSBhbnkgb3RoZXIga2luZCBvZiB3cml0aW5nICh3aGljaCBjbG9zZXMgdGhlIHRhZykuCi0gICAgICoKLSAgICAgKiAgPHA+VGhlIHZhbHVlIG1heSBiZSBudWxsLiBBIG51bGwgdmFsdWUgd2lsbCBiZSByZW5kZXJlZCBhcyBhbiBlbXB0eSBzdHJpbmcuCi0gICAgICoKLSAgICAgKiAgPHA+VHJvdWJsZXNvbWUgY2hhcmFjdGVycyBpbiB0aGUgdmFsdWUgYXJlIGNvbnZlcnRlZCB0byB0aGllciBHVE1MIGVudGl0aWVzLCBtdWNoCi0gICAgICogIGxpa2UgYSA8Y29kZT5wcmludCgpPC9jb2RlPiBtZXRob2QsIHdpdGggdGhlIGZvbGxvd2luZyBleGNlcHRpb25zOgotICAgICAqICA8dWw+Ci0gICAgICogIDxsaT5UaGUgZG91YmxlIHF1b3RlICgmcXVvdDspIGlzIGNvbnZlcnRlZCB0byAmYW1wO3F1b3Q7Ci0gICAgICogIDxsaT5UaGUgYW1wZXJzYW5kICgmYW1wOykgaXMgcGFzc2VkIHRocm91Z2ggdW5jaGFuZ2VkCi0gICAgICogIDwvdWw+Ci0gICAgICoKLSAgICAgKiAgQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlcmUgaXMgbm8gb3BlbiB0YWcuCi0gICAgICogIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdG8gd3JpdGUgKG5vIHZhbGlkYXRpb24KLSAgICAgKiAgaXMgZG9uZSBvbiB0aGUgbmFtZSkuCi0gICAgICogIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gd3JpdGUuICBJZiBudWxsLCB0aGUgYXR0cmlidXRlCi0gICAgICogIG5hbWUgaXMgd3JpdHRlbiBhcyB0aGUgdmFsdWUuICBPdGhlcndpc2UsIHRoZQotICAgICAqICB2YWx1ZSBpcyB3cml0dGVuLCAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCBhdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIGNoZWNrVGFnT3BlbigpOwotCi0gICAgICAgIF93cml0ZXIucHJpbnQoJyAnKTsKLQotICAgICAgICAvLyBDb3VsZCB1c2UgYSBjaGVjayBoZXJlIHRoYXQgbmFtZSBjb250YWlucyBvbmx5IHZhbGlkIGNoYXJhY3RlcnMKLQotICAgICAgICBfd3JpdGVyLnByaW50KG5hbWUpOwotICAgICAgICBfd3JpdGVyLnByaW50KCI9XCIiKTsKLQotICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IGxlbmd0aCA9IHZhbHVlLmxlbmd0aCgpOwotCi0gICAgICAgICAgICBpZiAoX2J1ZmZlciA9PSBudWxsIHx8IF9idWZmZXIubGVuZ3RoIDwgbGVuZ3RoKQotICAgICAgICAgICAgICAgIF9idWZmZXIgPSBuZXcgY2hhcltsZW5ndGhdOwotCi0gICAgICAgICAgICB2YWx1ZS5nZXRDaGFycygwLCBsZW5ndGgsIF9idWZmZXIsIDApOwotCi0gICAgICAgICAgICBzYWZlUHJpbnQoX2J1ZmZlciwgMCwgbGVuZ3RoLCB0cnVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIF93cml0ZXIucHJpbnQoJyInKTsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAgKiAgU2ltaWxhciB0byB7QGxpbmsgI2F0dHJpYnV0ZShTdHJpbmcsIFN0cmluZyl9IGJ1dCBubyBlc2NhcGluZyBvZiBpbnZhbGlkIGVsZW1lbnRzCi0gICAgICAqICBpcyBkb25lIGZvciB0aGUgdmFsdWUuCi0gICAgICAqIAotICAgICAgKiAgQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlcmUgaXMgbm8gb3BlbiB0YWcuCi0gICAgICAqCi0gICAgICAqICBAc2luY2UgMy4wCi0gICAgICAqCi0gICAgICAqKi8KLSAgICBwdWJsaWMgdm9pZCBhdHRyaWJ1dGVSYXcoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBhdHRyaWJ1dGUobmFtZSwgdmFsdWUpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgY2hlY2tUYWdPcGVuKCk7Ci0KLSAgICAgICAgX3dyaXRlci5wcmludCgnICcpOwotCi0gICAgICAgIF93cml0ZXIucHJpbnQobmFtZSk7Ci0KLSAgICAgICAgX3dyaXRlci5wcmludCgiPVwiIik7Ci0gICAgICAgIF93cml0ZXIucHJpbnQodmFsdWUpOwotICAgICAgICBfd3JpdGVyLnByaW50KCciJyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2xvc2VzIGFueSBleGlzdGluZyB0YWcgdGhlbiBzdGFydHMgYSBuZXcgZWxlbWVudC4gVGhlIG5ldyBlbGVtZW50IGlzIHB1c2hlZAotICAgICAqIG9udG8gdGhlIGFjdGl2ZSBlbGVtZW50IHN0YWNrLgotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIGJlZ2luKFN0cmluZyBuYW1lKQotICAgIHsKLSAgICAgICAgaWYgKF9vcGVuVGFnKQotICAgICAgICAgICAgY2xvc2VUYWcoKTsKLQotICAgICAgICBwdXNoKG5hbWUpOwotCi0gICAgICAgIF93cml0ZXIucHJpbnQoJzwnKTsKLSAgICAgICAgX3dyaXRlci5wcmludChuYW1lKTsKLQotICAgICAgICBfb3BlblRhZyA9IHRydWU7Ci0gICAgICAgIF9lbXB0eVRhZyA9IGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN0YXJ0cyBhbiBlbGVtZW50IHRoYXQgd2lsbCBub3QgbGF0ZXIgYmUgbWF0Y2hlZCB3aXRoIGFuIDxjb2RlPmVuZCgpPC9jb2RlPgotICAgICAqIGNhbGwuIFRoaXMgaXMgdXNlZnVsIGZvciBlbGVtZW50cyBzdWNoIGFzICZsdDtocjsmZ3Q7IG9yICZsdDticiZndDsgdGhhdAotICAgICAqIGRvIG5vdCBuZWVkIGNsb3NpbmcgdGFncy4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIGJlZ2luRW1wdHkoU3RyaW5nIG5hbWUpCi0gICAgewotICAgICAgICBpZiAoX29wZW5UYWcpCi0gICAgICAgICAgICBjbG9zZVRhZygpOwotCi0gICAgICAgIF93cml0ZXIucHJpbnQoJzwnKTsKLSAgICAgICAgX3dyaXRlci5wcmludChuYW1lKTsKLQotICAgICAgICBfb3BlblRhZyA9IHRydWU7Ci0gICAgICAgIF9lbXB0eVRhZyA9IHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW52b2tlcyA8Y29kZT5jaGVja0Vycm9yKCk8L2NvZGU+IG9uIHRoZQotICAgICAqICA8Y29kZT5QcmludFdyaXRlcjwvY29kZT4gdXNlZCB0byBmb3JtYXQgb3V0cHV0LgotICAgICAqKi8KLQotICAgIHB1YmxpYyBib29sZWFuIGNoZWNrRXJyb3IoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF93cml0ZXIuY2hlY2tFcnJvcigpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjaGVja1RhZ09wZW4oKQotICAgIHsKLSAgICAgICAgaWYgKCFfb3BlblRhZykKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgVGFwZXN0cnkuZ2V0TWVzc2FnZSgiQWJzdHJhY3RNYXJrdXBXcml0ZXIudGFnLW5vdC1vcGVuIikpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENsb3NlcyB0aGlzIDxjb2RlPklNYXJrdXBXcml0ZXI8L2NvZGU+LiBBbnkgYWN0aXZlIGVsZW1lbnRzIGFyZSBjbG9zZWQuIFRoZQotICAgICAqIHtAbGluayBQcmludFdyaXRlcn0gaXMgdGhlbiAgc2VudCB7QGxpbmsgUHJpbnRXcml0ZXIjY2xvc2UoKX0uCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCBjbG9zZSgpCi0gICAgewotICAgICAgICBpZiAoX29wZW5UYWcpCi0gICAgICAgICAgICBjbG9zZVRhZygpOwotCi0gICAgICAgIC8vIENsb3NlIGFueSBhY3RpdmUgZWxlbWVudHMuCi0KLSAgICAgICAgd2hpbGUgKF9kZXB0aCA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIF93cml0ZXIucHJpbnQoIjwvIik7Ci0gICAgICAgICAgICBfd3JpdGVyLnByaW50KHBvcCgpKTsKLSAgICAgICAgICAgIF93cml0ZXIucHJpbnQoJz4nKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChfcHJvcGFnYXRlQ2xvc2UpCi0gICAgICAgICAgICBfd3JpdGVyLmNsb3NlKCk7Ci0KLSAgICAgICAgX3dyaXRlciA9IG51bGw7Ci0gICAgICAgIF9hY3RpdmVFbGVtZW50U3RhY2sgPSBudWxsOwotICAgICAgICBfYnVmZmVyID0gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgQ2xvc2VzIHRoZSBtb3N0IHJlY2VudGx5IG9wZW5lZCBlbGVtZW50IGJ5IHdyaXRpbmcgdGhlICcmZ3Q7JyB0aGF0IGVuZHMKLSAgICAgKiAgaXQuIE1heSB3cml0ZSBhIHNsYXNoIGJlZm9yZSB0aGUgJyZndDsnIGlmIHRoZSB0YWcKLSAgICAgKiAgd2FzIG9wZW5lZCBieSB7QGxpbmsgI2JlZ2luRW1wdHkoU3RyaW5nKX0uCi0gICAgICogCi0gICAgICogIDxwPk9uY2UgdGhpcyBpcyBpbnZva2VkLCB0aGUgPGNvZGU+YXR0cmlidXRlKCk8L2NvZGU+IG1ldGhvZHMKLSAgICAgKiAgbWF5IG5vdCBiZSB1c2VkIHVudGlsIGEgbmV3IGVsZW1lbnQgaXMgb3BlbmVkIHdpdGgge0BsaW5rICNiZWdpbihTdHJpbmcpfSBvcgotICAgICAqICBvciB7QGxpbmsgI2JlZ2luRW1wdHkoU3RyaW5nKX0uCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgY2xvc2VUYWcoKQotICAgIHsKLSAgICAgICAgaWYgKF9lbXB0eVRhZykKLSAgICAgICAgICAgIF93cml0ZXIucHJpbnQoJy8nKTsKLQotICAgICAgICBfd3JpdGVyLnByaW50KCc+Jyk7Ci0KLSAgICAgICAgX29wZW5UYWcgPSBmYWxzZTsKLSAgICAgICAgX2VtcHR5VGFnID0gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV3JpdGVzIGFuIEdUTUwgY29tbWVudC4gQW55IG9wZW4gdGFnIGlzIGZpcnN0IGNsb3NlZC4gCi0gICAgICogVGhlIG1ldGhvZCB0YWtlcyBjYXJlIG9mCi0gICAgICogcHJvdmlkaW5nIHRoZSA8Y29kZT4mbHQ7IS0tPC9jb2RlPiBhbmQgPGNvZGU+LS0mZ3Q7PC9jb2RlPiwgCi0gICAgICogaW5jbHVkaW5nIGEgYmxhbmsgbGluZSBhZnRlciB0aGUgY2xvc2Ugb2YgdGhlIGNvbW1lbnQuCi0gICAgICoKLSAgICAgKiA8cD5Nb3N0IGNoYXJhY3RlcnMgYXJlIHZhbGlkIGluc2lkZSBhbiBHVE1MIGNvbW1lbnQsIHNvIG5vIGNoZWNrCi0gICAgICogb2YgdGhlIGNvbnRlbnRzIGlzIG1hZGUgKG11Y2ggbGlrZSB7QGxpbmsgI3ByaW50UmF3KFN0cmluZyl9LgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgY29tbWVudChTdHJpbmcgdmFsdWUpCi0gICAgewotICAgICAgICBpZiAoX29wZW5UYWcpCi0gICAgICAgICAgICBjbG9zZVRhZygpOwotCi0gICAgICAgIF93cml0ZXIucHJpbnQoIjwhLS0gIik7Ci0gICAgICAgIF93cml0ZXIucHJpbnQodmFsdWUpOwotICAgICAgICBfd3JpdGVyLnByaW50bG4oIiAtLT4iKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFbmRzIHRoZSBlbGVtZW50IG1vc3QgcmVjZW50bHkgc3RhcnRlZCBieSB7QGxpbmsgI2JlZ2luKFN0cmluZyl9LiAKLSAgICAgKiBUaGUgbmFtZSBvZiB0aGUgdGFnCi0gICAgICogaXMgcG9wcGVkIG9mZiBvZiB0aGUgYWN0aXZlIGVsZW1lbnQgc3RhY2sgYW5kIHVzZWQgdG8gZm9ybSBhbiBHVE1MIGNsb3NlIHRhZy4KLSAgICAgKgotICAgICAqIDxwPlRCRDogRXJyb3IgY2hlY2tpbmcgZm9yIHRoZSBvcGVuIGVsZW1lbnQgc3RhY2sgZW1wdHkuCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgZW5kKCkKLSAgICB7Ci0gICAgICAgIGlmIChfb3BlblRhZykKLSAgICAgICAgICAgIGNsb3NlVGFnKCk7Ci0KLSAgICAgICAgX3dyaXRlci5wcmludCgiPC8iKTsKLSAgICAgICAgX3dyaXRlci5wcmludChwb3AoKSk7Ci0gICAgICAgIF93cml0ZXIucHJpbnQoJz4nKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFbmRzIHRoZSBtb3N0IHJlY2VudGx5IHN0YXJ0ZWQgZWxlbWVudCB3aXRoIHRoZSBnaXZlbiBuYW1lLiBUaGlzIHdpbGwKLSAgICAgKiBhbHNvIGVuZCBhbnkgb3RoZXIgaW50ZXJtZWRpYXRlIGVsZW1lbnRzLiBUaGlzIGlzIHZlcnkgdXNlZnVsIGZvciBlYXNpbHkKLSAgICAgKiBlbmRpbmcgYSB0YWJsZSBvciBldmVuIGFuIGVudGlyZSBwYWdlLgotICAgICAqCi0gICAgICogPHA+VEJEOiBFcnJvciBjaGVjayBpZiB0aGUgbmFtZSBtYXRjaGVzIG5vdGhpbmcgb24gdGhlIG9wZW4gdGFnIHN0YWNrLgotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIGVuZChTdHJpbmcgbmFtZSkKLSAgICB7Ci0gICAgICAgIGlmIChfb3BlblRhZykKLSAgICAgICAgICAgIGNsb3NlVGFnKCk7Ci0KLSAgICAgICAgd2hpbGUgKHRydWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyB0YWdOYW1lID0gcG9wKCk7Ci0KLSAgICAgICAgICAgIF93cml0ZXIucHJpbnQoIjwvIik7Ci0gICAgICAgICAgICBfd3JpdGVyLnByaW50KHRhZ05hbWUpOwotICAgICAgICAgICAgX3dyaXRlci5wcmludCgnPicpOwotCi0gICAgICAgICAgICBpZiAodGFnTmFtZS5lcXVhbHMobmFtZSkpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGb3J3YXJkcyA8Y29kZT5mbHVzaCgpPC9jb2RlPiB0byB0aGlzIDxjb2RlPkFic3RyYWN0TWFya3VwV3JpdGVyPC9jb2RlPidzIAotICAgICAqIDxjb2RlPlByaW50V3JpdGVyPC9jb2RlPi4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIGZsdXNoKCkKLSAgICB7Ci0gICAgICAgIF93cml0ZXIuZmx1c2goKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgUmVtb3ZlcyB0aGUgdG9wIGVsZW1lbnQgZnJvbSB0aGUgYWN0aXZlIGVsZW1lbnQgc3RhY2sgYW5kIHJldHVybnMgaXQuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIHBvcCgpCi0gICAgewotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gKFN0cmluZykgX2FjdGl2ZUVsZW1lbnRTdGFjay5wb3AoKTsKLSAgICAgICAgX2RlcHRoLS07Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKgotICAgICAqIFRoZSBwcmltYXJ5IDxjb2RlPnByaW50KCk8L2NvZGU+IG1ldGhvZCwgdXNlZCBieSBtb3N0IG90aGVyIG1ldGhvZHMuCi0gICAgICoKLSAgICAgKiA8cD5QcmludHMgdGhlIGNoYXJhY3RlciBhcnJheSwgZmlyc3QgY2xvc2luZyBhbnkgb3BlbiB0YWcuIFByb2JsZW1hdGljIGNoYXJhY3RlcnMKLSAgICAgKiAoJyZsdDsnLCAnJmd0OycgYW5kICcmYW1wOycpIGFyZSBjb252ZXJ0ZWQgdG8gdGhlaXIKLSAgICAgKiBHVE1MIGVudGl0aWVzLgotICAgICAqCi0gICAgICogPHA+QWxsICd1bnNhZmUnIGNoYXJhY3RlcnMgYXJlIHByb3Blcmx5IGNvbnZlcnRlZCB0byBlaXRoZXIgYSBuYW1lZAotICAgICAqIG9yIG51bWVyaWMgR1RNTCBlbnRpdHkuICBUaGlzIGNhbiBiZSBzb21ld2hhdCBleHBlbnNpdmUsIHNvIHVzZQotICAgICAqIHtAbGluayAjcHJpbnRSYXcoY2hhcltdLCBpbnQsIGludCl9IGlmIHRoZSBkYXRhIHRvIHByaW50IGlzIGd1YXJlbnRlZWQKLSAgICAgKiB0byBiZSBzYWZlLgotICAgICAqCi0gICAgICogPHA+RG9lcyA8ZW0+bm90aGluZzwvZW0+IGlmIDxjb2RlPmRhdGE8L2NvZGU+IGlzIG51bGwuCi0gICAgICoKLSAgICAgKiA8cD5DbG9zZXMgYW55IG9wZW4gdGFnLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgcHJpbnQoY2hhcltdIGRhdGEsIGludCBvZmZzZXQsIGludCBsZW5ndGgpCi0gICAgewotICAgICAgICBpZiAoZGF0YSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIGlmIChfb3BlblRhZykKLSAgICAgICAgICAgIGNsb3NlVGFnKCk7Ci0KLSAgICAgICAgc2FmZVByaW50KGRhdGEsIG9mZnNldCwgbGVuZ3RoLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJpbnRzIGEgc2luZ2xlIGNoYXJhY3Rlci4gSWYgdGhlIGNoYXJhY3RlciBpcyBub3QgYSAnc2FmZScgY2hhcmFjdGVyLAotICAgICAqIHN1Y2ggYXMgJyZsdDsnLCB0aGVuIGl0J3MgR1RNTCBlbnRpdHkgKG5hbWVkIG9yIG51bWVyaWMpIGlzIHByaW50ZWQgaW5zdGVhZC4KLSAgICAgKgotICAgICAqIDxwPkNsb3NlcyBhbnkgb3BlbiB0YWcuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCBwcmludChjaGFyIHZhbHVlKQotICAgIHsKLSAgICAgICAgaWYgKF9vcGVuVGFnKQotICAgICAgICAgICAgY2xvc2VUYWcoKTsKLQotICAgICAgICBpZiAodmFsdWUgPCBfc2FmZS5sZW5ndGggJiYgX3NhZmVbdmFsdWVdKQotICAgICAgICB7Ci0gICAgICAgICAgICBfd3JpdGVyLnByaW50KHZhbHVlKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBlbnRpdHkgPSBudWxsOwotCi0gICAgICAgIGlmICh2YWx1ZSA8IF9lbnRpdGllcy5sZW5ndGgpCi0gICAgICAgICAgICBlbnRpdHkgPSBfZW50aXRpZXNbdmFsdWVdOwotCi0gICAgICAgIGlmIChlbnRpdHkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgX3dyaXRlci5wcmludChlbnRpdHkpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTm90IGEgd2VsbC1rbm93biBlbnRpdHkuICBQcmludCBpdCdzIG51bWVyaWMgZXF1aXZhbGVudC4gIE5vdGU6ICB0aGlzIG9taXRzCi0gICAgICAgIC8vIHRoZSBsZWFkaW5nICcwJywgYnV0IG1vc3QgYnJvd3NlcnMgKElFIDUuMCkgZG9uJ3Qgc2VlbSB0byBtaW5kLiAgSXMgdGhpcyBhIGJ1Zz8KLQotICAgICAgICBfd3JpdGVyLnByaW50KCImIyIgKyAoaW50KSB2YWx1ZSArICI7Iik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJpbnRzIGFuIGludGVnZXIuCi0gICAgICoKLSAgICAgKiA8cD5DbG9zZXMgYW55IG9wZW4gdGFnLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgcHJpbnQoaW50IHZhbHVlKQotICAgIHsKLSAgICAgICAgaWYgKF9vcGVuVGFnKQotICAgICAgICAgICAgY2xvc2VUYWcoKTsKLQotICAgICAgICBfd3JpdGVyLnByaW50KHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbnZva2VzIHtAbGluayAjcHJpbnQoY2hhcltdLCBpbnQsIGludCl9IHRvIHByaW50IHRoZSBzdHJpbmcuICBVc2UKLSAgICAgKiB7QGxpbmsgI3ByaW50UmF3KFN0cmluZyl9IGlmIHRoZSBjaGFyYWN0ZXIgZGF0YSBpcyBrbm93biB0byBiZSBzYWZlLgotICAgICAqCi0gICAgICogPHA+RG9lcyA8ZW0+bm90aGluZzwvZW0+IGlmIDxjb2RlPnZhbHVlPC9jb2RlPiBpcyBudWxsLgotICAgICAqCi0gICAgICogPHA+Q2xvc2VzIGFueSBvcGVuIHRhZy4KLSAgICAgKgotICAgICAqIEBzZWUgI3ByaW50KGNoYXJbXSwgaW50LCBpbnQpCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCBwcmludChTdHJpbmcgdmFsdWUpCi0gICAgewotICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBpbnQgbGVuZ3RoID0gdmFsdWUubGVuZ3RoKCk7Ci0KLSAgICAgICAgaWYgKF9idWZmZXIgPT0gbnVsbCB8fCBfYnVmZmVyLmxlbmd0aCA8IGxlbmd0aCkKLSAgICAgICAgICAgIF9idWZmZXIgPSBuZXcgY2hhcltsZW5ndGhdOwotCi0gICAgICAgIHZhbHVlLmdldENoYXJzKDAsIGxlbmd0aCwgX2J1ZmZlciwgMCk7Ci0KLSAgICAgICAgcHJpbnQoX2J1ZmZlciwgMCwgbGVuZ3RoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDbG9zZXMgdGhlIG9wZW4gdGFnIChpZiBhbnkpLCB0aGVuIHByaW50cyBhIGxpbmUgc2VwZXJhdG9yIHRvIHRoZSBvdXRwdXQgc3RyZWFtLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgcHJpbnRsbigpCi0gICAgewotICAgICAgICBpZiAoX29wZW5UYWcpCi0gICAgICAgICAgICBjbG9zZVRhZygpOwotCi0gICAgICAgIF93cml0ZXIucHJpbnRsbigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByaW50cyBhbmQgcG9ydGlvbiBvZiBhbiBvdXRwdXQgYnVmZmVyIHRvIHRoZSBzdHJlYW0uCi0gICAgICogTm8gZXNjYXBpbmcgb2YgaW52YWxpZCBHVE1MIGVsZW1lbnRzIGlzIGRvbmUsIHdoaWNoCi0gICAgICogbWFrZXMgdGhpcyBtb3JlIGVmZmVjaWVudCB0aGFuIDxjb2RlPnByaW50KCk8L2NvZGU+LiAKLSAgICAgKiBEb2VzIDxlbT5ub3RoaW5nPC9lbT4gaWYgPGNvZGU+YnVmZmVyPC9jb2RlPgotICAgICAqIGlzIG51bGwuCi0gICAgICoKLSAgICAgKiA8cD5DbG9zZXMgYW55IG9wZW4gdGFnLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgcHJpbnRSYXcoY2hhcltdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkKLSAgICB7Ci0gICAgICAgIGlmIChidWZmZXIgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBpZiAoX29wZW5UYWcpCi0gICAgICAgICAgICBjbG9zZVRhZygpOwotCi0gICAgICAgIF93cml0ZXIud3JpdGUoYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJpbnRzIG91dHB1dCB0byB0aGUgc3RyZWFtLiBObyBlc2NhcGluZyBvZiBpbnZhbGlkIEdUTUwgZWxlbWVudHMgaXMgZG9uZSwgd2hpY2gKLSAgICAgKiBtYWtlcyB0aGlzIG1vcmUgZWZmZWNpZW50IHRoYW4gPGNvZGU+cHJpbnQoKTwvY29kZT4uIERvZXMgPGVtPm5vdGhpbmc8L2VtPiAKLSAgICAgKiBpZiA8Y29kZT52YWx1ZTwvY29kZT4KLSAgICAgKiBpcyBudWxsLgotICAgICAqCi0gICAgICogPHA+Q2xvc2VzIGFueSBvcGVuIHRhZy4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIHByaW50UmF3KFN0cmluZyB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIGlmIChfb3BlblRhZykKLSAgICAgICAgICAgIGNsb3NlVGFnKCk7Ci0KLSAgICAgICAgX3dyaXRlci5wcmludCh2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEFkZHMgYW4gZWxlbWVudCB0byB0aGUgYWN0aXZlIGVsZW1lbnQgc3RhY2suCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBwdXNoKFN0cmluZyBuYW1lKQotICAgIHsKLSAgICAgICAgaWYgKF9hY3RpdmVFbGVtZW50U3RhY2sgPT0gbnVsbCkKLSAgICAgICAgICAgIF9hY3RpdmVFbGVtZW50U3RhY2sgPSBuZXcgU3RhY2soKTsKLQotICAgICAgICBfYWN0aXZlRWxlbWVudFN0YWNrLnB1c2gobmFtZSk7Ci0KLSAgICAgICAgX2RlcHRoKys7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW50ZXJuYWwgc3VwcG9ydCBmb3Igc2FmZSBwcmludGluZy4gIEVuc3VyZXMgdGhhdCBhbGwgY2hhcmFjdGVycyBlbWl0dGVkCi0gICAgICogYXJlIHNhZmU6IGVpdGhlciB2YWxpZCBHVE1MIGNoYXJhY3RlcnMgb3IgR1RNTCBlbnRpdGllcyAobmFtZWQgb3IgbnVtZXJpYykuCi0gICAgICoqLwotCi0gICAgcHJpdmF0ZSB2b2lkIHNhZmVQcmludChjaGFyW10gZGF0YSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCwgYm9vbGVhbiBpc0F0dHJpYnV0ZSkKLSAgICB7Ci0gICAgICAgIGludCBzYWZlbGVuZ3RoID0gMDsKLSAgICAgICAgaW50IHN0YXJ0ID0gb2Zmc2V0OwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoYXIgY2ggPSBkYXRhW29mZnNldCArIGldOwotCi0gICAgICAgICAgICAvLyBJZ25vcmUgc2FmZSBjaGFyYWN0ZXJzLiAgSW4gYW4gYXR0cmlidXRlLCBxdW90ZXMKLSAgICAgICAgICAgIC8vIGFyZSBub3Qgb2sgYW5kIGFyZSBlc2NhcGVkLgotCi0gICAgICAgICAgICBib29sZWFuIGlzU2FmZSA9IChjaCA8IF9zYWZlLmxlbmd0aCAmJiBfc2FmZVtjaF0pOwotCi0gICAgICAgICAgICBpZiAoaXNBdHRyaWJ1dGUgJiYgY2ggPT0gJyInKQotICAgICAgICAgICAgICAgIGlzU2FmZSA9IGZhbHNlOwotCi0gICAgICAgICAgICBpZiAoaXNTYWZlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNhZmVsZW5ndGgrKzsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gV3JpdGUgdGhlIHNhZmUgc3R1ZmYuCi0KLSAgICAgICAgICAgIGlmIChzYWZlbGVuZ3RoID4gMCkKLSAgICAgICAgICAgICAgICBfd3JpdGVyLndyaXRlKGRhdGEsIHN0YXJ0LCBzYWZlbGVuZ3RoKTsKLQotICAgICAgICAgICAgU3RyaW5nIGVudGl0eSA9IG51bGw7Ci0KLSAgICAgICAgICAgIC8vIExvb2sgZm9yIGEga25vd24gZW50aXR5LgotCi0gICAgICAgICAgICBpZiAoY2ggPCBfZW50aXRpZXMubGVuZ3RoKQotICAgICAgICAgICAgICAgIGVudGl0eSA9IF9lbnRpdGllc1tjaF07Ci0KLSAgICAgICAgICAgIC8vIEZhaWxpbmcgdGhhdCwgZW1pdCBhIG51bWVyaWMgZW50aXR5LgotCi0gICAgICAgICAgICBpZiAoZW50aXR5ID09IG51bGwpCi0gICAgICAgICAgICAgICAgZW50aXR5ID0gIiYjIiArIChpbnQpIGNoICsgIjsiOwotCi0gICAgICAgICAgICBfd3JpdGVyLnByaW50KGVudGl0eSk7Ci0KLSAgICAgICAgICAgIHN0YXJ0ID0gb2Zmc2V0ICsgaSArIDE7Ci0gICAgICAgICAgICBzYWZlbGVuZ3RoID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzYWZlbGVuZ3RoID4gMCkKLSAgICAgICAgICAgIF93cml0ZXIud3JpdGUoZGF0YSwgc3RhcnQsIHNhZmVsZW5ndGgpOwotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9BYnN0cmFjdFBhZ2UuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9BYnN0cmFjdFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjdhZDI2OS4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvQWJzdHJhY3RQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NzYgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnk7Ci0KLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotCi1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuRXZlbnRMaXN0ZW5lckxpc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmV2ZW50LkNoYW5nZU9ic2VydmVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuZXZlbnQuUGFnZURldGFjaExpc3RlbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuZXZlbnQuUGFnZUV2ZW50OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuZXZlbnQuUGFnZVJlbmRlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuZXZlbnQuUGFnZVZhbGlkYXRlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS51dGlsLlN0cmluZ1NwbGl0dGVyOwotCi0vKioKLSAqICBBYnN0cmFjdCBiYXNlIGNsYXNzIGltcGxlbWVudGluZyB0aGUge0BsaW5rIElQYWdlfSBpbnRlcmZhY2UuCi0gKgotICogIEB2ZXJzaW9uICRJZCQKLSAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwLCBEYXZpZCBTb2xpcwotICogIEBzaW5jZSAwLjIuOQotICogCi0gKiovCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFBhZ2UgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IGltcGxlbWVudHMgSVBhZ2UKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgTE9HID0gTG9nRmFjdG9yeS5nZXRMb2coQWJzdHJhY3RQYWdlLmNsYXNzKTsKLQotICAgIC8qKgotICAgICAqICBPYmplY3QgdG8gYmUgbm90aWZpZWQgd2hlbiBhIG9ic2VydmVyZWQgcHJvcGVydHkgY2hhbmdlcy4gIE9ic2VydmVyZWQKLSAgICAgKiAgcHJvcGVydGllcyBhcmUgdGhlIG9uZXMgdGhhdCB3aWxsIGJlIHBlcnNpc3RlZCBiZXR3ZWVuIHJlcXVlc3QgY3ljbGVzLgotICAgICAqICBVbm9ic2VydmVkIHByb3BlcnRpZXMgYXJlIHJlY29uc3RydWN0ZWQuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwcml2YXRlIENoYW5nZU9ic2VydmVyIF9jaGFuZ2VPYnNlcnZlcjsKLQotICAgIC8qKgotICAgICAqICBUaGUge0BsaW5rIElFbmdpbmV9IHRoZSBwYWdlIGlzIGN1cnJlbnRseSBhdHRhY2hlZCB0by4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHByaXZhdGUgSUVuZ2luZSBfZW5naW5lOwotCi0gICAgLyoqCi0gICAgICogIFRoZSB2aXNpdCBvYmplY3QsIGlmIGFueSwgZm9yIHRoZSBhcHBsaWNhdGlvbi4gIFNldCBpbnNpZGUKLSAgICAgKiAge0BsaW5rICNhdHRhY2goSUVuZ2luZSl9IGFuZCBjbGVhcmVkCi0gICAgICogIGJ5IHtAbGluayAjZGV0YWNoKCl9LgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHJpdmF0ZSBPYmplY3QgX3Zpc2l0OwotCi0gICAgLyoqCi0gICAgICogIFRoZSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgcGFnZSwgd2hpY2ggbWF5IGJlIHByZWZpeGVkIGJ5IHRoZQotICAgICAqICBuYW1lc3BhY2UuCi0gICAgICogCi0gICAgICogIEBzaW5jZSAyLjMKLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwcml2YXRlIFN0cmluZyBfcGFnZU5hbWU7Ci0KLSAgICAvKioKLSAgICAgKiAgU2V0IHdoZW4gdGhlIHBhZ2UgaXMgYXR0YWNoZWQgdG8gdGhlIGVuZ2luZS4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHByaXZhdGUgSVJlcXVlc3RDeWNsZSBfcmVxdWVzdEN5Y2xlOwotCi0gICAgLyoqCi0gICAgICogIFRoZSBsb2NhbGUgb2YgdGhlIHBhZ2UsIGluaXRpYWxseSBkZXRlcm1pbmVkIGZyb20gdGhlIHtAbGluayBJRW5naW5lIGVuZ2luZX0uCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwcml2YXRlIExvY2FsZSBfbG9jYWxlOwotCi0gICAgLyoqCi0gICAgICogIEEgbGlzdCBvZiBsaXN0ZW5lcnMgZm9yIHRoZSBwYWdlLgotICAgICAqICBAc2VlIFBhZ2VSZW5kZXJMaXN0ZW5lcgotICAgICAqICBAc2VlIFBhZ2VEZXRhY2hMaXN0ZW5lcgotICAgICAqCi0gICAgICogIEBzaW5jZSAxLjAuNQotICAgICAqKi8KLQotICAgIHByaXZhdGUgRXZlbnRMaXN0ZW5lckxpc3QgX2xpc3RlbmVyTGlzdDsKLSAgICAKLSAgICAKLSAgICAvKioKLSAgICAgKiAgVGhlIG91dHB1dCBlbmNvZGluZyB0byBiZSB1c2VkIHdoZW4gcmVuZGVyaW5nIHRoaXMgcGFnZS4KLSAgICAgKiAgVGhpcyB2YWx1ZSBpcyBjYWNoZWQgZnJvbSB0aGUgZW5naW5lLgotICAgICAqCi0gICAgICogIEBzaW5jZSAzLjAKLSAgICAgKiovCi0gICAgcHJpdmF0ZSBTdHJpbmcgX291dHB1dEVuY29kaW5nOwotCi0gICAgLyoqCi0gICAgICogIFN0YW5kYXJkIGNvbnN0cnVjdG9yOyBpbnZva2VzIHtAbGluayAjaW5pdGlhbGl6ZSgpfQotICAgICAqICB0byBjb25maWd1cmUgaW5pdGlhbCB2YWx1ZXMgZm9yIHByb3BlcnRpZXMKLSAgICAgKiAgb2YgdGhlIHBhZ2UuCi0gICAgICogCi0gICAgICogIEBzaW5jZSAyLjIKLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgQWJzdHJhY3RQYWdlKCkKLSAgICB7Ci0gICAgICAgIGluaXRpYWxpemUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgSW1wbGVtZW50ZWQgaW4gc3ViY2xhc3NlcyB0byBwcm92aWRlIGEgcGFydGljdWxhciBraW5kIG9mCi0gICAgICogIHJlc3BvbnNlIHdyaXRlciAoYW5kIHRoZXJlZm9yZSwgYSBwYXJ0aWN1bGFyIGtpbmQgb2YKLSAgICAgKiAgY29udGVudCkuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBhYnN0cmFjdCBwdWJsaWMgSU1hcmt1cFdyaXRlciBnZXRSZXNwb25zZVdyaXRlcihPdXRwdXRTdHJlYW0gb3V0KTsKLQotICAgIC8qKgotICAgICAqICBQcmVwYXJlcyB0aGUgcGFnZSB0byBiZSByZXR1cm5lZCB0byB0aGUgcG9vbC4KLSAgICAgKiAgPHVsPgotICAgICAqICA8bGk+Q2xlYXJzIHRoZSBjaGFuZ2VPYnNlcnZlZCBwcm9wZXJ0eQotICAgICAqCTxsaT5JbnZva2VzIHtAbGluayBQYWdlRGV0YWNoTGlzdGVuZXIjcGFnZURldGFjaGVkKFBhZ2VFdmVudCl9IG9uIGFsbCBsaXN0ZW5lcnMKLSAgICAgKiAgPGxpPkludm9rZXMge0BsaW5rICNpbml0aWFsaXplKCl9IHRvIGNsZWFyL3Jlc2V0IGFueSBwcm9wZXJ0aWVzCQotICAgICAqIDxsaT5DbGVhcnMgdGhlIGVuZ2luZSwgdmlzaXQgYW5kIHJlcXVlc3RDeWNsZSBwcm9wZXJ0aWVzCi0gICAgICoJPC91bD4KLSAgICAgKgotICAgICAqICA8cD5TdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCwgYnV0IG11c3QgaW52b2tlIHRoaXMKLSAgICAgKiAgaW1wbGVtZW50YXRpb24gKHVzdWFsbHksIGxhc3QpLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgZGV0YWNoKCkKLSAgICB7Ci0gICAgCVRhcGVzdHJ5LmFkZE1ldGhvZEludm9jYXRpb24oVGFwZXN0cnkuQUJTVFJBQ1RQQUdFX0RFVEFDSF9NRVRIT0RfSUQpOwotICAgIAkKLSAgICAgICAgLy8gRG8gdGhpcyBmaXJzdCxzbyB0aGF0IGFueSBjaGFuZ2VzIHRvIHBlcnNpc3RlbnQgcHJvcGVydGllcyBkbyBub3QKLSAgICAgICAgLy8gY2F1c2UgZXJyb3JzLgotCi0gICAgICAgIF9jaGFuZ2VPYnNlcnZlciA9IG51bGw7Ci0KLSAgICAgICAgZmlyZVBhZ2VEZXRhY2hlZCgpOwotCi0gICAgICAgIGluaXRpYWxpemUoKTsKLQotICAgICAgICBfZW5naW5lID0gbnVsbDsKLSAgICAgICAgX3Zpc2l0ID0gbnVsbDsKLSAgICAgICAgX3JlcXVlc3RDeWNsZSA9IG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIE1ldGhvZCBpbnZva2VkIGZyb20gdGhlIGNvbnN0cnVjdG9yLCBhbmQgZnJvbQotICAgICAqICB7QGxpbmsgI2RldGFjaCgpfSB0byAocmUtKWluaXRpYWxpemUgcHJvcGVydGllcwotICAgICAqICBvZiB0aGUgcGFnZS4gIFRoaXMgaXMgbW9zdCB1c2VmdWwgd2hlbgotICAgICAqICBwcm9wZXJ0aWVzIGhhdmUgbm9uLW51bGwgaW5pdGlhbCB2YWx1ZXMuCi0gICAgICogCi0gICAgICogIDxwPlN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgaW1wbGVtZW50YXRpb24KLSAgICAgKiAgKHdoaWNoIGlzIGVtcHR5KS4KLSAgICAgKiAKLSAgICAgKiAgQHNpbmNlIDIuMgotICAgICAqIAotICAgICAqKi8KLQotICAgIHByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKQotICAgIHsKLSAgICAgICAgLy8gRG9lcyBub3RoaW5nLgotICAgIH0KLQotICAgIHB1YmxpYyBJRW5naW5lIGdldEVuZ2luZSgpCi0gICAgewotICAgICAgICByZXR1cm4gX2VuZ2luZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2hhbmdlT2JzZXJ2ZXIgZ2V0Q2hhbmdlT2JzZXJ2ZXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9jaGFuZ2VPYnNlcnZlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgcGFnZS4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXh0ZW5kZWRJZCgpCi0gICAgewotICAgICAgICByZXR1cm4gX3BhZ2VOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBQYWdlcyBhbHdheXMgcmV0dXJuIG51bGwgZm9yIGlkUGF0aC4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWRQYXRoKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIHRoZSBsb2NhbGUgZm9yIHRoZSBwYWdlLCB3aGljaCBtYXkgYmUgbnVsbCBpZiB0aGUKLSAgICAgKiAgbG9jYWxlIGlzIG5vdCBrbm93biAobnVsbCBjb3JyZXNwb25kcyB0byB0aGUgImRlZmF1bHQgbG9jYWxlIikuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgTG9jYWxlIGdldExvY2FsZSgpCi0gICAgewotICAgICAgICByZXR1cm4gX2xvY2FsZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRMb2NhbGUoTG9jYWxlIHZhbHVlKQotICAgIHsKLSAgICAgICAgaWYgKF9sb2NhbGUgIT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgVGFwZXN0cnkuZ2V0TWVzc2FnZSgiQWJzdHJhY3RQYWdlLmF0dGVtcHQtdG8tY2hhbmdlLWxvY2FsZSIpKTsKLQotICAgICAgICBfbG9jYWxlID0gdmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIElDb21wb25lbnQgZ2V0TmVzdGVkQ29tcG9uZW50KFN0cmluZyBwYXRoKQotICAgIHsKLSAgICAgICAgU3RyaW5nU3BsaXR0ZXIgc3BsaXR0ZXI7Ci0gICAgICAgIElDb21wb25lbnQgY3VycmVudDsKLSAgICAgICAgU3RyaW5nW10gZWxlbWVudHM7Ci0gICAgICAgIGludCBpOwotCi0gICAgICAgIGlmIChwYXRoID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gdGhpczsKLQotICAgICAgICBzcGxpdHRlciA9IG5ldyBTdHJpbmdTcGxpdHRlcignLicpOwotICAgICAgICBjdXJyZW50ID0gdGhpczsKLQotICAgICAgICBlbGVtZW50cyA9IHNwbGl0dGVyLnNwbGl0VG9BcnJheShwYXRoKTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5nZXRDb21wb25lbnQoZWxlbWVudHNbaV0pOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGN1cnJlbnQ7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgQ2FsbGVkIGJ5IHRoZSB7QGxpbmsgSUVuZ2luZSBlbmdpbmV9IHRvIGF0dGFjaCB0aGUgcGFnZQotICAgICAqICB0byBpdHNlbGYuICBEb2VzCi0gICAgICogIDxlbT5ub3Q8L2VtPiBjaGFuZ2UgdGhlIGxvY2FsZSwgYnV0IHNpbmNlIGEgcGFnZSBpcyBzZWxlY3RlZAotICAgICAqICBmcm9tIHRoZSB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5lbmdpbmUuSVBhZ2VTb3VyY2V9IHBvb2wgYmFzZWQgb24gaXRzCi0gICAgICogIGxvY2FsZSBtYXRjaGluZyB0aGUgZW5naW5lJ3MgbG9jYWxlLCB0aGV5IHNob3VsZCBtYXRjaAotICAgICAqICBhbnl3YXkuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCBhdHRhY2goSUVuZ2luZSB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIGlmIChfZW5naW5lICE9IG51bGwpCi0gICAgICAgICAgICBMT0cuZXJyb3IodGhpcyArIiBhdHRhY2goIiArIHZhbHVlICsgIiksIGJ1dCBlbmdpbmUgPSAiICsgX2VuZ2luZSk7Ci0KLSAgICAgICAgX2VuZ2luZSA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqCi0gICAgICogPHVsPgotICAgICAqICA8bGk+SW52b2tlcyB7QGxpbmsgUGFnZVJlbmRlckxpc3RlbmVyI3BhZ2VCZWdpblJlbmRlcihQYWdlRXZlbnQpfQotICAgICAqICA8bGk+SW52b2tlcyB7QGxpbmsgI2JlZ2luUmVzcG9uc2UoSU1hcmt1cFdyaXRlciwgSVJlcXVlc3RDeWNsZSl9Ci0gICAgICogIDxsaT5JbnZva2VzIHtAbGluayBJUmVxdWVzdEN5Y2xlI2NvbW1pdFBhZ2VDaGFuZ2VzKCl9IChpZiBub3QgcmV3aW5kaW5nKQotICAgICAqICA8bGk+SW52b2tlcyB7QGxpbmsgI3JlbmRlcihJTWFya3VwV3JpdGVyLCBJUmVxdWVzdEN5Y2xlKX0KLSAgICAgKiAgPGxpPkludm9rZXMge0BsaW5rIFBhZ2VSZW5kZXJMaXN0ZW5lciNwYWdlRW5kUmVuZGVyKFBhZ2VFdmVudCl9ICh0aGlzIG9jY3VycwotICAgICAqICBldmVuIGlmIGEgcHJldmlvdXMgc3RlcCB0aHJvd3MgYW4gZXhjZXB0aW9uKQotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgcmVuZGVyUGFnZShJTWFya3VwV3JpdGVyIHdyaXRlciwgSVJlcXVlc3RDeWNsZSBjeWNsZSkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmaXJlUGFnZUJlZ2luUmVuZGVyKCk7Ci0KLSAgICAgICAgICAgIGJlZ2luUmVzcG9uc2Uod3JpdGVyLCBjeWNsZSk7Ci0KLSAgICAgICAgICAgIGlmICghY3ljbGUuaXNSZXdpbmRpbmcoKSkKLSAgICAgICAgICAgICAgICBjeWNsZS5jb21taXRQYWdlQ2hhbmdlcygpOwotCi0gICAgICAgICAgICByZW5kZXIod3JpdGVyLCBjeWNsZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBmaXJlUGFnZUVuZFJlbmRlcigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q2hhbmdlT2JzZXJ2ZXIoQ2hhbmdlT2JzZXJ2ZXIgdmFsdWUpCi0gICAgewotICAgICAgICBfY2hhbmdlT2JzZXJ2ZXIgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKiogQHNpbmNlIDMuMCAqKi8KLQotICAgIHB1YmxpYyB2b2lkIHNldFBhZ2VOYW1lKFN0cmluZyBwYWdlTmFtZSkKLSAgICB7Ci0gICAgICAgIGlmIChfcGFnZU5hbWUgIT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgVGFwZXN0cnkuZ2V0TWVzc2FnZSgiQWJzdHJhY3RQYWdlLmF0dGVtcHQtdG8tY2hhbmdlLW5hbWUiKSk7Ci0KLSAgICAgICAgX3BhZ2VOYW1lID0gcGFnZU5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEJ5IGRlZmF1bHQsIHBhZ2VzIGFyZSBub3QgcHJvdGVjdGVkIGFuZCB0aGlzIG1ldGhvZCBkb2VzIG5vdGhpbmcuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZShJUmVxdWVzdEN5Y2xlIGN5Y2xlKQotICAgIHsKLSAgICAgICAgVGFwZXN0cnkuYWRkTWV0aG9kSW52b2NhdGlvbihUYXBlc3RyeS5BQlNUUkFDVFBBR0VfVkFMSURBVEVfTUVUSE9EX0lEKTsKLQotICAgICAgICBmaXJlUGFnZVZhbGlkYXRlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIERvZXMgbm90aGluZywgc3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgYXMgbmVlZGVkLgotICAgICAqCi0gICAgICogQGRlcHJlY2F0ZWQgVG8gYmUgcmVtb3ZlZCBpbiAzLjEuICBJbXBsZW1lbnQgCi0gICAgICoge0BsaW5rIFBhZ2VSZW5kZXJMaXN0ZW5lcn0gaW5zdGVhZC4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIGJlZ2luUmVzcG9uc2UoSU1hcmt1cFdyaXRlciB3cml0ZXIsIElSZXF1ZXN0Q3ljbGUgY3ljbGUpCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyBJUmVxdWVzdEN5Y2xlIGdldFJlcXVlc3RDeWNsZSgpCi0gICAgewotICAgICAgICByZXR1cm4gX3JlcXVlc3RDeWNsZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRSZXF1ZXN0Q3ljbGUoSVJlcXVlc3RDeWNsZSB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIF9yZXF1ZXN0Q3ljbGUgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0aGUgdmlzaXQgb2JqZWN0IG9idGFpbmVkIGZyb20gdGhlIGVuZ2luZSB2aWEKLSAgICAgKiAge0BsaW5rIElFbmdpbmUjZ2V0VmlzaXQoSVJlcXVlc3RDeWNsZSl9LgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIE9iamVjdCBnZXRWaXNpdCgpCi0gICAgewotICAgICAgICBpZiAoX3Zpc2l0ID09IG51bGwpCi0gICAgICAgICAgICBfdmlzaXQgPSBfZW5naW5lLmdldFZpc2l0KF9yZXF1ZXN0Q3ljbGUpOwotCi0gICAgICAgIHJldHVybiBfdmlzaXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIENvbnZpZW5pZW5jZSBtZXRob2RzLCBzaW1wbHkgaW52b2tlcwotICAgICAqICB7QGxpbmsgSUVuZ2luZSNnZXRHbG9iYWwoKX0uCi0gICAgICogCi0gICAgICogIEBzaW5jZSAyLjMKLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgT2JqZWN0IGdldEdsb2JhbCgpCi0gICAgewotICAgICAgICByZXR1cm4gX2VuZ2luZS5nZXRHbG9iYWwoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRQYWdlRGV0YWNoTGlzdGVuZXIoUGFnZURldGFjaExpc3RlbmVyIGxpc3RlbmVyKQotICAgIHsKLSAgICAgICAgYWRkTGlzdGVuZXIoUGFnZURldGFjaExpc3RlbmVyLmNsYXNzLCBsaXN0ZW5lcik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZExpc3RlbmVyKENsYXNzIGxpc3RlbmVyQ2xhc3MsIEV2ZW50TGlzdGVuZXIgbGlzdGVuZXIpCi0gICAgewotICAgICAgICBpZiAoX2xpc3RlbmVyTGlzdCA9PSBudWxsKQotICAgICAgICAgICAgX2xpc3RlbmVyTGlzdCA9IG5ldyBFdmVudExpc3RlbmVyTGlzdCgpOwotCi0gICAgICAgIF9saXN0ZW5lckxpc3QuYWRkKGxpc3RlbmVyQ2xhc3MsIGxpc3RlbmVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgQHNpbmNlIDIuMS1iZXRhLTIKLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwcml2YXRlIHZvaWQgcmVtb3ZlTGlzdGVuZXIoQ2xhc3MgbGlzdGVuZXJDbGFzcywgRXZlbnRMaXN0ZW5lciBsaXN0ZW5lcikKLSAgICB7Ci0gICAgICAgIGlmIChfbGlzdGVuZXJMaXN0ICE9IG51bGwpCi0gICAgICAgICAgICBfbGlzdGVuZXJMaXN0LnJlbW92ZShsaXN0ZW5lckNsYXNzLCBsaXN0ZW5lcik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkUGFnZVJlbmRlckxpc3RlbmVyKFBhZ2VSZW5kZXJMaXN0ZW5lciBsaXN0ZW5lcikKLSAgICB7Ci0gICAgICAgIGFkZExpc3RlbmVyKFBhZ2VSZW5kZXJMaXN0ZW5lci5jbGFzcywgbGlzdGVuZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBAc2luY2UgMS4wLjUKLSAgICAgKgotICAgICAqKi8KLQotICAgIHByb3RlY3RlZCB2b2lkIGZpcmVQYWdlRGV0YWNoZWQoKQotICAgIHsKLSAgICAgICAgaWYgKF9saXN0ZW5lckxpc3QgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBQYWdlRXZlbnQgZXZlbnQgPSBudWxsOwotICAgICAgICBPYmplY3RbXSBsaXN0ZW5lcnMgPSBfbGlzdGVuZXJMaXN0LmdldExpc3RlbmVyTGlzdCgpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSArPSAyKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAobGlzdGVuZXJzW2ldID09IFBhZ2VEZXRhY2hMaXN0ZW5lci5jbGFzcykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBQYWdlRGV0YWNoTGlzdGVuZXIgbCA9IChQYWdlRGV0YWNoTGlzdGVuZXIpIGxpc3RlbmVyc1tpICsgMV07Ci0KLSAgICAgICAgICAgICAgICBpZiAoZXZlbnQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgZXZlbnQgPSBuZXcgUGFnZUV2ZW50KHRoaXMsIF9yZXF1ZXN0Q3ljbGUpOwotCi0gICAgICAgICAgICAgICAgbC5wYWdlRGV0YWNoZWQoZXZlbnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEBzaW5jZSAxLjAuNQotICAgICAqCi0gICAgICoqLwotCi0gICAgcHJvdGVjdGVkIHZvaWQgZmlyZVBhZ2VCZWdpblJlbmRlcigpCi0gICAgewotICAgICAgICBpZiAoX2xpc3RlbmVyTGlzdCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIFBhZ2VFdmVudCBldmVudCA9IG51bGw7Ci0gICAgICAgIE9iamVjdFtdIGxpc3RlbmVycyA9IF9saXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJMaXN0KCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpICs9IDIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChsaXN0ZW5lcnNbaV0gPT0gUGFnZVJlbmRlckxpc3RlbmVyLmNsYXNzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFBhZ2VSZW5kZXJMaXN0ZW5lciBsID0gKFBhZ2VSZW5kZXJMaXN0ZW5lcikgbGlzdGVuZXJzW2kgKyAxXTsKLQotICAgICAgICAgICAgICAgIGlmIChldmVudCA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICBldmVudCA9IG5ldyBQYWdlRXZlbnQodGhpcywgX3JlcXVlc3RDeWNsZSk7Ci0KLSAgICAgICAgICAgICAgICBsLnBhZ2VCZWdpblJlbmRlcihldmVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgQHNpbmNlIDEuMC41Ci0gICAgICoKLSAgICAgKiovCi0KLSAgICBwcm90ZWN0ZWQgdm9pZCBmaXJlUGFnZUVuZFJlbmRlcigpCi0gICAgewotICAgICAgICBpZiAoX2xpc3RlbmVyTGlzdCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIFBhZ2VFdmVudCBldmVudCA9IG51bGw7Ci0gICAgICAgIE9iamVjdFtdIGxpc3RlbmVycyA9IF9saXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJMaXN0KCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpICs9IDIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChsaXN0ZW5lcnNbaV0gPT0gUGFnZVJlbmRlckxpc3RlbmVyLmNsYXNzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFBhZ2VSZW5kZXJMaXN0ZW5lciBsID0gKFBhZ2VSZW5kZXJMaXN0ZW5lcikgbGlzdGVuZXJzW2kgKyAxXTsKLQotICAgICAgICAgICAgICAgIGlmIChldmVudCA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICBldmVudCA9IG5ldyBQYWdlRXZlbnQodGhpcywgX3JlcXVlc3RDeWNsZSk7Ci0KLSAgICAgICAgICAgICAgICBsLnBhZ2VFbmRSZW5kZXIoZXZlbnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEBzaW5jZSAyLjEtYmV0YS0yCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlUGFnZURldGFjaExpc3RlbmVyKFBhZ2VEZXRhY2hMaXN0ZW5lciBsaXN0ZW5lcikKLSAgICB7Ci0gICAgICAgIHJlbW92ZUxpc3RlbmVyKFBhZ2VEZXRhY2hMaXN0ZW5lci5jbGFzcywgbGlzdGVuZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVBhZ2VSZW5kZXJMaXN0ZW5lcihQYWdlUmVuZGVyTGlzdGVuZXIgbGlzdGVuZXIpCi0gICAgewotICAgICAgICByZW1vdmVMaXN0ZW5lcihQYWdlUmVuZGVyTGlzdGVuZXIuY2xhc3MsIGxpc3RlbmVyKTsKLSAgICB9Ci0KLSAgICAvKiogQHNpbmNlIDIuMiAqKi8KLQotICAgIHB1YmxpYyB2b2lkIGJlZ2luUGFnZVJlbmRlcigpCi0gICAgewotICAgICAgICBmaXJlUGFnZUJlZ2luUmVuZGVyKCk7Ci0gICAgfQotCi0gICAgLyoqIEBzaW5jZSAyLjIgKiovCi0KLSAgICBwdWJsaWMgdm9pZCBlbmRQYWdlUmVuZGVyKCkKLSAgICB7Ci0gICAgICAgIGZpcmVQYWdlRW5kUmVuZGVyKCk7Ci0gICAgfQotCi0gICAgLyoqIEBzaW5jZSAzLjAgKiovCi0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhZ2VOYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfcGFnZU5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkUGFnZVZhbGlkYXRlTGlzdGVuZXIoUGFnZVZhbGlkYXRlTGlzdGVuZXIgbGlzdGVuZXIpCi0gICAgewotICAgICAgICBhZGRMaXN0ZW5lcihQYWdlVmFsaWRhdGVMaXN0ZW5lci5jbGFzcywgbGlzdGVuZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVBhZ2VWYWxpZGF0ZUxpc3RlbmVyKFBhZ2VWYWxpZGF0ZUxpc3RlbmVyIGxpc3RlbmVyKQotICAgIHsKLSAgICAgICAgcmVtb3ZlTGlzdGVuZXIoUGFnZVZhbGlkYXRlTGlzdGVuZXIuY2xhc3MsIGxpc3RlbmVyKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBmaXJlUGFnZVZhbGlkYXRlKCkKLSAgICB7Ci0gICAgICAgIGlmIChfbGlzdGVuZXJMaXN0ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgUGFnZUV2ZW50IGV2ZW50ID0gbnVsbDsKLSAgICAgICAgT2JqZWN0W10gbGlzdGVuZXJzID0gX2xpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lckxpc3QoKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkgKz0gMikKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGxpc3RlbmVyc1tpXSA9PSBQYWdlVmFsaWRhdGVMaXN0ZW5lci5jbGFzcykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBQYWdlVmFsaWRhdGVMaXN0ZW5lciBsID0gKFBhZ2VWYWxpZGF0ZUxpc3RlbmVyKSBsaXN0ZW5lcnNbaSArIDFdOwotCi0gICAgICAgICAgICAgICAgaWYgKGV2ZW50ID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIGV2ZW50ID0gbmV3IFBhZ2VFdmVudCh0aGlzLCBfcmVxdWVzdEN5Y2xlKTsKLQotICAgICAgICAgICAgICAgIGwucGFnZVZhbGlkYXRlKGV2ZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIHRoZSBvdXRwdXQgZW5jb2RpbmcgdG8gYmUgdXNlZCB3aGVuIHJlbmRlcmluZyB0aGlzIHBhZ2UuCi0gICAgICogIFRoaXMgdmFsdWUgaXMgdXN1YWxseSBjYWNoZWQgZnJvbSB0aGUgRW5naW5lLgotICAgICAqIAotICAgICAqICBAc2luY2UgMy4wCi0gICAgICoqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0T3V0cHV0RW5jb2RpbmcoKQotICAgIHsKLSAgICAgICAgaWYgKF9vdXRwdXRFbmNvZGluZyA9PSBudWxsKQotICAgICAgICAgICAgX291dHB1dEVuY29kaW5nID0gZ2V0RW5naW5lKCkuZ2V0T3V0cHV0RW5jb2RpbmcoKTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBfb3V0cHV0RW5jb2Rpbmc7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9BcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24uamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9BcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGZjZjc5Mi4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeTsKLQotLyoqCi0gKiAgR2VuZXJhbCB3cmFwcGVyIGZvciBhbnkgZXhjZXB0aW9uIChub3JtYWwgb3IgcnVudGltZSkgdGhhdCBtYXkgb2NjdXIgZHVyaW5nCi0gKiAgcnVudGltZSBwcm9jZXNzaW5nIGZvciB0aGUgYXBwbGljYXRpb24uICBUaGlzIGV4Y2VwdGlvbiBpcyB1c2VkCi0gKiAgd2hlbiB0aGUgaW50ZW50IGlzIHRvIGNvbW11bmljYXRlIGEgbG93LWxldmVsIGZhaWx1cmUgdG8gdGhlIHVzZXIgb3IKLSAqICBkZXZlbG9wZXI7IGl0IGlzIG5vdCBleHBlY3RlZCB0byBiZSBjYXVnaHQuICBUaGUge0BsaW5rICNnZXRDYXVzZSgpIHJvb3RDYXVzZX0KLSAqICBwcm9wZXJ0eSBpcyBhIDxlbT5uZXN0ZWQ8L2VtPiBleGNlcHRpb24gKFRhcGVzdHJ5IHN1cHBvcnRlZCB0aGlzIGNvbmNlcHQKLSAqICBsb25nIGJlZm9yZSB0aGUgSkRLIGRpZCkuCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiovCi0KLXB1YmxpYyBjbGFzcyBBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIGltcGxlbWVudHMgSUxvY2F0YWJsZQotewotICAgIHByaXZhdGUgVGhyb3dhYmxlIF9yb290Q2F1c2U7Ci0gICAgcHJpdmF0ZSB0cmFuc2llbnQgSUxvY2F0aW9uIF9sb2NhdGlvbjsKLSAgICBwcml2YXRlIHRyYW5zaWVudCBPYmplY3QgX2NvbXBvbmVudDsKLQotICAgIHB1YmxpYyBBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24oVGhyb3dhYmxlIHJvb3RDYXVzZSkKLSAgICB7Ci0gICAgICAgIHRoaXMocm9vdENhdXNlLmdldE1lc3NhZ2UoKSwgcm9vdENhdXNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKQotICAgIHsKLSAgICAgICAgdGhpcyhtZXNzYWdlLCBudWxsLCBudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgcm9vdENhdXNlKQotICAgIHsKLSAgICAgICAgdGhpcyhtZXNzYWdlLCBudWxsLCBudWxsLCByb290Q2F1c2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgIFN0cmluZyBtZXNzYWdlLAotICAgICAgICBPYmplY3QgY29tcG9uZW50LAotICAgICAgICBJTG9jYXRpb24gbG9jYXRpb24sCi0gICAgICAgIFRocm93YWJsZSByb290Q2F1c2UpCi0gICAgewotICAgICAgICBzdXBlcihtZXNzYWdlKTsKLQotICAgICAgICBfcm9vdENhdXNlID0gcm9vdENhdXNlOwotICAgICAgICBfY29tcG9uZW50ID0gY29tcG9uZW50OwotCi0gICAgICAgIF9sb2NhdGlvbiA9IFRhcGVzdHJ5LmZpbmRMb2NhdGlvbihuZXcgT2JqZWN0W10geyBsb2NhdGlvbiwgcm9vdENhdXNlLCBjb21wb25lbnQgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIEFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgSUxvY2F0aW9uIGxvY2F0aW9uLCBUaHJvd2FibGUgcm9vdENhdXNlKQotICAgIHsKLSAgICAgICAgdGhpcyhtZXNzYWdlLCBudWxsLCBsb2NhdGlvbiwgcm9vdENhdXNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVGhyb3dhYmxlIGdldENhdXNlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfcm9vdENhdXNlOwotICAgIH0KLQotICAgIHB1YmxpYyBJTG9jYXRpb24gZ2V0TG9jYXRpb24oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9sb2NhdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldENvbXBvbmVudCgpCi0gICAgewotICAgICAgICByZXR1cm4gX2NvbXBvbmVudDsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L0FwcGxpY2F0aW9uU2VydmxldC5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L0FwcGxpY2F0aW9uU2VydmxldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MGNlNGEwLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9BcHBsaWNhdGlvblNlcnZsZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwNyArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotCi1pbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29uZmlnOwotaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQ7Ci1pbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5Db29raWU7Ci1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0OwotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7Ci1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7Ci1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5lbmdpbmUuQmFzZUVuZ2luZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmVuZ2luZS5JUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5wYXJzZS5TcGVjaWZpY2F0aW9uUGFyc2VyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkucmVxdWVzdC5SZXF1ZXN0Q29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnJlc291cmNlLkNsYXNzcGF0aFJlc291cmNlTG9jYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5yZXNvdXJjZS5Db250ZXh0UmVzb3VyY2VMb2NhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnNwZWMuQXBwbGljYXRpb25TcGVjaWZpY2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuc3BlYy5JQXBwbGljYXRpb25TcGVjaWZpY2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkudXRpbC5EZWZhdWx0UmVzb3VyY2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnV0aWwuRGVsZWdhdGluZ1Byb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkudXRpbC5KYW5pdG9yVGhyZWFkOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkudXRpbC5TZXJ2bGV0Q29udGV4dFByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkudXRpbC5TZXJ2bGV0UHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS51dGlsLlN5c3RlbVByb3BlcnRpZXNQcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnV0aWwuZXhjZXB0aW9uLkV4Y2VwdGlvbkFuYWx5emVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkudXRpbC5wb29sLlBvb2w7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS51dGlsLnhtbC5Eb2N1bWVudFBhcnNlRXhjZXB0aW9uOwotCi0vKioKLSAqICBMaW5rcyBhIHNlcnZsZXQgY29udGFpbmVyIHdpdGggYSBUYXBlc3RyeSBhcHBsaWNhdGlvbi4gIFRoZSBzZXJ2bGV0IGhhcyBzb21lCi0gKiAgcmVzcG9uc2liaWxpdGllcyByZWxhdGVkIHRvIGJvb3RzdHJhcHBpbmcgdGhlIGFwcGxpY2F0aW9uIChpbiB0ZXJtcyBvZgotICogIGxvZ2dpbmcsIHJlYWRpbmcgdGhlIHtAbGluayBBcHBsaWNhdGlvblNwZWNpZmljYXRpb24gc3BlY2lmaWNhdGlvbn0sIGV0Yy4pLgotICogIEl0IGlzIGFsc28gcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIG9yIGxvY2F0aW5nIHRoZSB7QGxpbmsgSUVuZ2luZX0gYW5kIGRlbGVnYXRpbmcKLSAqICBpbmNvbWluZyByZXF1ZXN0cyB0byBpdC4KLSAqIAotICogIDxwPlRoZSBzZXJ2bGV0IGluaXQgcGFyYW1ldGVyCi0gKiAgPGNvZGU+b3JnLmFwYWNoZS50YXBlc3RyeS5zcGVjaWZpY2F0aW9uLXBhdGg8L2NvZGU+Ci0gKiAgc2hvdWxkIGJlIHNldCB0byB0aGUgY29tcGxldGUgcmVzb3VyY2UgcGF0aCAod2l0aGluIHRoZSBjbGFzc3BhdGgpCi0gKiAgdG8gdGhlIGFwcGxpY2F0aW9uIHNwZWNpZmljYXRpb24sIGkuZS4sCi0gKiAgPGNvZGU+L2NvbS9mb28vYmFyL015QXBwLmFwcGxpY2F0aW9uPC9jb2RlPi4gCi0gKgotICogIDxwPkluIHNvbWUgc2VydmxldCBjb250YWluZXJzIChub3RhYmx5Ci0gKiAgPGEgaHJlZj0id3d3LmJlYS5jb20iLz5XZWJMb2dpYzwvYT4pCi0gKiAgaXQgaXMgbmVjZXNzYXJ5IHRvIGludm9rZSB7QGxpbmsgSHR0cFNlc3Npb24jc2V0QXR0cmlidXRlKFN0cmluZyxPYmplY3QpfQotICogIGluIG9yZGVyIHRvIGZvcmNlIGEgcGVyc2lzdGVudCB2YWx1ZSB0byBiZSByZXBsaWNhdGVkIHRvIHRoZSBvdGhlcgotICogIHNlcnZlcnMgaW4gdGhlIGNsdXN0ZXIuICBUYXBlc3RyeSBhcHBsaWNhdGlvbnMgdXN1YWxseSBvbmx5IGhhdmUgYSBzaW5nbGUKLSAqICBwZXJzaXN0ZW50IHZhbHVlLCB0aGUge0BsaW5rIElFbmdpbmUgZW5naW5lfS4gIEZvciBwZXJzaXN0ZW5jZSB0bwotICogIHdvcmsgaW4gc3VjaCBhbiBlbnZpcm9ubWVudCwgdGhlCi0gKiAgSlZNIHN5c3RlbSBwcm9wZXJ0eSA8Y29kZT5vcmcuYXBhY2hlLnRhcGVzdHJ5LnN0b3JlLWVuZ2luZTwvY29kZT4KLSAqICBtdXN0IGJlIHNldCB0byA8Y29kZT50cnVlPC9jb2RlPi4gIFRoaXMgd2lsbCBmb3JjZSB0aGUgYXBwbGljYXRpb24KLSAqICBzZXJ2bGV0IHRvIHJlc3RvcmUgdGhlIGVuZ2luZSBpbnRvIHRoZSB7QGxpbmsgSHR0cFNlc3Npb259IGF0IHRoZQotICogIGVuZCBvZiBlYWNoIHJlcXVlc3QgY3ljbGUuCi0gKiAKLSAqICA8cD5BcyBvZiByZWxlYXNlIDEuMC4xLCBpdCBpcyBubyBsb25nZXIgbmVjZXNzYXJ5IGZvciBhIHtAbGluayBIdHRwU2Vzc2lvbn0KLSAqICB0byBiZSBjcmVhdGVkIG9uIHRoZSBmaXJzdCByZXF1ZXN0IGN5Y2xlLiAgSW5zdGVhZCwgdGhlIEh0dHBTZXNzaW9uIGlzIGNyZWF0ZWQKLSAqICBhcyBuZWVkZWQgYnkgdGhlIHtAbGluayBJRW5naW5lfSAuLi4gdGhhdCBpcywgd2hlbiBhIHZpc2l0IG9iamVjdCBpcyBjcmVhdGVkLAotICogIG9yIHdoZW4gcGVyc2lzdGVudCBwYWdlIHN0YXRlIGlzIHJlcXVpcmVkLiAgT3RoZXJ3aXNlLCBmb3Igc2Vzc2lvbmxlc3MgcmVxdWVzdHMsCi0gKiAgYW4ge0BsaW5rIElFbmdpbmV9IGZyb20gYSB7QGxpbmsgUG9vbH0gaXMgdXNlZC4gIEFkZGl0aW9uYWwgd29yayBtdXN0IGJlIGRvbmUKLSAqICBzbyB0aGF0IHRoZSB7QGxpbmsgSUVuZ2luZX0gY2FuIGNoYW5nZSBsb2NhbGUgPGVtPndpdGhvdXQ8L2VtPiBmb3JjaW5nIAotICogIHRoZSBjcmVhdGlvbiBvZiBhIHNlc3Npb247IHRoaXMgaW52b2x2ZXMgdGhlIHNlcnZsZXQgYW5kIHRoZSBlbmdpbmUgc3RvcmluZwotICogIGxvY2FsZSBpbmZvcm1hdGlvbiBpbiBhIHtAbGluayBDb29raWV9LgotICogCi0gKiAgQHZlcnNpb24gJElkJAotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqIAotICoqLwotCi1wdWJsaWMgY2xhc3MgQXBwbGljYXRpb25TZXJ2bGV0IGV4dGVuZHMgSHR0cFNlcnZsZXQKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgTE9HID0gTG9nRmFjdG9yeS5nZXRMb2coQXBwbGljYXRpb25TZXJ2bGV0LmNsYXNzKTsKLQotICAgIC8qKiBAc2luY2UgMi4zICoqLwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUF9TUEVDX1BBVEhfUEFSQU0gPQotICAgICAgICAib3JnLmFwYWNoZS50YXBlc3RyeS5hcHBsaWNhdGlvbi1zcGVjaWZpY2F0aW9uIjsKLQotICAgIC8qKgotICAgICAqICBOYW1lIG9mIHRoZSBjb29raWUgd3JpdHRlbiB0byB0aGUgY2xpZW50IHdlYiBicm93c2VyIHRvCi0gICAgICogIGlkZW50aWZ5IHRoZSBsb2NhbGUuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9DQUxFX0NPT0tJRV9OQU1FID0gIm9yZy5hcGFjaGUudGFwZXN0cnkubG9jYWxlIjsKLQotICAgIC8qKgotICAgICAqICBBIHtAbGluayBQb29sfSB1c2VkIHRvIHN0b3JlIHtAbGluayBJRW5naW5lIGVuZ2luZX1zIHRoYXQgYXJlIG5vdCBjdXJyZW50bHkKLSAgICAgKiAgaW4gdXNlLiAgVGhlIGtleSBpcyBvbiB7QGxpbmsgTG9jYWxlfS4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHByaXZhdGUgUG9vbCBfZW5naW5lUG9vbCA9IG5ldyBQb29sKCk7Ci0KLSAgICAvKioKLSAgICAgKiAgVGhlIGFwcGxpY2F0aW9uIHNwZWNpZmljYXRpb24sIHdoaWNoIGlzIHJlYWQgb25jZSBhbmQga2VwdCBpbiBtZW1vcnkKLSAgICAgKiAgdGhlcmVhZnRlci4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHByaXZhdGUgSUFwcGxpY2F0aW9uU3BlY2lmaWNhdGlvbiBfc3BlY2lmaWNhdGlvbjsKLQotICAgIC8qKgotICAgICAqIFRoZSBuYW1lIHVuZGVyIHdoaWNoIHRoZSB7QGxpbmsgSUVuZ2luZSBlbmdpbmV9IGlzIHN0b3JlZCB3aXRoaW4gdGhlCi0gICAgICoge0BsaW5rIEh0dHBTZXNzaW9ufS4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHByaXZhdGUgU3RyaW5nIF9hdHRyaWJ1dGVOYW1lOwotCi0gICAgLyoqCi0gICAgICogIFRoZSByZXNvbHZlZCBjbGFzcyBuYW1lIHVzZWQgdG8gaW5zdGFudGlhdGUgdGhlIGVuZ2luZS4KLSAgICAgKiAKLSAgICAgKiAgQHNpbmNlIDMuMAotICAgICAqIAotICAgICAqKi8KLQotICAgIHByaXZhdGUgU3RyaW5nIF9lbmdpbmVDbGFzc05hbWU7Ci0KLSAgICAvKioKLSAgICAgKiAgVXNlZCB0byBzZWFyY2ggZm9yIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcy4KLSAgICAgKiAKLSAgICAgKiAgCi0gICAgICogIEBzaW5jZSAzLjAKLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwcml2YXRlIElQcm9wZXJ0eVNvdXJjZSBfcHJvcGVydHlTb3VyY2U7Ci0KLSAgICAvKioKLSAgICAgKiAgSW52b2tlcyB7QGxpbmsgI2RvU2VydmljZShIdHRwU2VydmxldFJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UpfS4KLSAgICAgKgotICAgICAqICBAc2luY2UgMS4wLjYKLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGRvU2VydmljZShyZXF1ZXN0LCByZXNwb25zZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEBzaW5jZSAyLjMKLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwcml2YXRlIElSZXNvdXJjZVJlc29sdmVyIF9yZXNvbHZlcjsKLQotICAgIC8qKgotICAgICAqIEhhbmRsZXMgdGhlIEdFVCBhbmQgUE9TVCByZXF1ZXN0cy4gUGVyZm9ybXMgdGhlIGZvbGxvd2luZzoKLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPkNvbnN0cnVjdCBhIHtAbGluayBSZXF1ZXN0Q29udGV4dH0KLSAgICAgKiA8bGk+SW52b2tlIHtAbGluayAjZ2V0RW5naW5lKFJlcXVlc3RDb250ZXh0KX0gdG8gZ2V0IG9yIGNyZWF0ZSB0aGUge0BsaW5rIElFbmdpbmV9Ci0gICAgICogPGxpPkludm9rZSB7QGxpbmsgSUVuZ2luZSNzZXJ2aWNlKFJlcXVlc3RDb250ZXh0KX0gb24gdGhlIGFwcGxpY2F0aW9uCi0gICAgICogPC91bD4KLSAgICAgKiovCi0KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb1NlcnZpY2UoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgUmVxdWVzdENvbnRleHQgY29udGV4dCA9IG51bGw7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLQotICAgICAgICAgICAgLy8gQ3JlYXRlIGEgY29udGV4dCBmcm9tIHRoZSB2YXJpb3VzIGJpdHMgYW5kIHBpZWNlcy4KLQotICAgICAgICAgICAgY29udGV4dCA9IGNyZWF0ZVJlcXVlc3RDb250ZXh0KHJlcXVlc3QsIHJlc3BvbnNlKTsKLQotICAgICAgICAgICAgLy8gVGhlIHN1YmNsYXNzIHByb3ZpZGVzIHRoZSBlbmdpbmUuCi0KLSAgICAgICAgICAgIElFbmdpbmUgZW5naW5lID0gZ2V0RW5naW5lKGNvbnRleHQpOwotCi0gICAgICAgICAgICBpZiAoZW5naW5lID09IG51bGwpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIFRhcGVzdHJ5LmdldE1lc3NhZ2UoIkFwcGxpY2F0aW9uU2VydmxldC5jb3VsZC1ub3QtbG9jYXRlLWVuZ2luZSIpKTsKLQotICAgICAgICAgICAgYm9vbGVhbiBkaXJ0eSA9IGVuZ2luZS5zZXJ2aWNlKGNvbnRleHQpOwotCi0gICAgICAgICAgICBIdHRwU2Vzc2lvbiBzZXNzaW9uID0gY29udGV4dC5nZXRTZXNzaW9uKCk7Ci0KLSAgICAgICAgICAgIC8vIFdoZW4gdGhlcmUncyBhbiBhY3RpdmUgc2Vzc2lvbiwgd2UgKm1heSogc3RvcmUgaXQgaW50bwotICAgICAgICAgICAgLy8gdGhlIEh0dHBTZXNzaW9uIGFuZCB3ZSAqd2lsbCBub3QqIHN0b3JlIHRoZSBlbmdpbmUKLSAgICAgICAgICAgIC8vIGJhY2sgaW50byB0aGUgZW5naW5lIHBvb2wuCi0KLSAgICAgICAgICAgIGlmIChzZXNzaW9uICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gSWYgdGhlIHNlcnZpY2UgbWF5IGhhdmUgY2hhbmdlZCB0aGUgZW5naW5lIGFuZCB0aGUKLSAgICAgICAgICAgICAgICAvLyBzcGVjaWFsIHN0b3JlRW5naW5lIGZsYWcgaXMgb24sIHRoZW4gcmUtc2F2ZSB0aGUgZW5naW5lCi0gICAgICAgICAgICAgICAgLy8gaW50byB0aGUgc2Vzc2lvbi4gIE90aGVyd2lzZSwgd2Ugb25seSBzYXZlIHRoZSBlbmdpbmUKLSAgICAgICAgICAgICAgICAvLyBpbnRvIHRoZSBzZXNzaW9uIHdoZW4gdGhlIHNlc3Npb24gaXMgZmlyc3QgY3JlYXRlZCAoaXMgbmV3KS4KLQotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgICAgICBib29sZWFuIGZvcmNlU3RvcmUgPQotICAgICAgICAgICAgICAgICAgICAgICAgZW5naW5lLmlzU3RhdGVmdWwoKSAmJiAoc2Vzc2lvbi5nZXRBdHRyaWJ1dGUoX2F0dHJpYnV0ZU5hbWUpID09IG51bGwpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChmb3JjZVN0b3JlIHx8IGRpcnR5KQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoTE9HLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HLmRlYnVnKCJTdG9yaW5nICIgKyBlbmdpbmUgKyAiIGludG8gc2Vzc2lvbiBhcyAiICsgX2F0dHJpYnV0ZU5hbWUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLnNldEF0dHJpYnV0ZShfYXR0cmlidXRlTmFtZSwgZW5naW5lKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlIGJlY2F1c2UgdGhlIHNlc3Npb24gYmVlbidzIGludmFsaWRhdGVkLgotICAgICAgICAgICAgICAgICAgICAvLyBBbGxvdyB0aGUgZW5naW5lICh3aGljaCBoYXMgc3RhdGUgcGFydGljdWxhciB0byB0aGUgY2xpZW50KQotICAgICAgICAgICAgICAgICAgICAvLyB0byBiZSByZWNsYWltZWQgYnkgdGhlIGdhcmJhZ2UgY29sbGVjdG9yLgotCi0gICAgICAgICAgICAgICAgICAgIGlmIChMT0cuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIExPRy5kZWJ1ZygiU2Vzc2lvbiBpbnZhbGlkYXRlZC4iKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBUaGUgZW5naW5lIGlzIHN0YXRlZnVsIGFuZCBzdG9yZWQgaW4gYSBzZXNzaW9uLiAgRXZlbiBpZiBpdCBzdGFydGVkCi0gICAgICAgICAgICAgICAgLy8gdGhlIHJlcXVlc3QgY3ljbGUgaW4gdGhlIHBvb2wsIGl0IGRvZXNuJ3QgZ28gYmFjay4KLQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGVuZ2luZS5pc1N0YXRlZnVsKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTE9HLmVycm9yKAotICAgICAgICAgICAgICAgICAgICBUYXBlc3RyeS5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAiQXBwbGljYXRpb25TZXJ2bGV0LmVuZ2luZS1zdGF0ZWZ1bC13aXRob3V0LXNlc3Npb24iLAotICAgICAgICAgICAgICAgICAgICAgICAgZW5naW5lKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBObyBzZXNzaW9uOyB0aGUgZW5naW5lIGNvbnRhaW5zIG5vIHN0YXRlIHBhcnRpY3VsYXIgdG8KLSAgICAgICAgICAgIC8vIHRoZSBjbGllbnQgKGV4Y2VwdCBmb3IgbG9jYWxlKS4gIERvbid0IHRocm93IGl0IGF3YXksCi0gICAgICAgICAgICAvLyBpbnN0ZWFkIHNhdmUgaXQgaW4gYSBwb29sIGZvciBsYXRlciByZXVzZSAoYnkgdGhpcywgb3IgYW5vdGhlcgotICAgICAgICAgICAgLy8gY2xpZW50IGluIHRoZSBzYW1lIGxvY2FsZSkuCi0KLSAgICAgICAgICAgIGlmIChMT0cuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICBMT0cuZGVidWcoIlJldHVybmluZyAiICsgZW5naW5lICsgIiB0byBwb29sLiIpOwotCi0gICAgICAgICAgICBfZW5naW5lUG9vbC5zdG9yZShlbmdpbmUuZ2V0TG9jYWxlKCksIGVuZ2luZSk7Ci0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoU2VydmxldEV4Y2VwdGlvbiBleCkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nKCJTZXJ2bGV0RXhjZXB0aW9uIiwgZXgpOwotCi0gICAgICAgICAgICBzaG93KGV4KTsKLQotICAgICAgICAgICAgLy8gUmV0aHJvdyBpdC4KLQotICAgICAgICAgICAgdGhyb3cgZXg7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGV4KQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2coIklPRXhjZXB0aW9uIiwgZXgpOwotCi0gICAgICAgICAgICBzaG93KGV4KTsKLQotICAgICAgICAgICAgLy8gUmV0aHJvdyBpdC4KLQotICAgICAgICAgICAgdGhyb3cgZXg7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoY29udGV4dCAhPSBudWxsKQotICAgICAgICAgICAgICAgIGNvbnRleHQuY2xlYW51cCgpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgSW52b2tlZCBieSB7QGxpbmsgI2RvU2VydmljZShIdHRwU2VydmxldFJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UpfSB0byBjcmVhdGUKLSAgICAgKiAgdGhlIHtAbGluayBSZXF1ZXN0Q29udGV4dH0gZm9yIHRoaXMgcmVxdWVzdCBjeWNsZS4gIFNvbWUgYXBwbGljYXRpb25zIG1heSBuZWVkIHRvCi0gICAgICogIHJlcGxhY2UgdGhlIGRlZmF1bHQgUmVxdWVzdENvbnRleHQgd2l0aCBhIHN1YmNsYXNzIGZvciBwYXJ0aWN1bGFyIGJlaGF2aW9yLgotICAgICAqIAotICAgICAqICBAc2luY2UgMi4zCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHJvdGVjdGVkIFJlcXVlc3RDb250ZXh0IGNyZWF0ZVJlcXVlc3RDb250ZXh0KAotICAgICAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKLSAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IFJlcXVlc3RDb250ZXh0KHRoaXMsIHJlcXVlc3QsIHJlc3BvbnNlKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzaG93KEV4Y2VwdGlvbiBleCkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiXG5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcblxuIik7Ci0KLSAgICAgICAgbmV3IEV4Y2VwdGlvbkFuYWx5emVyKCkucmVwb3J0RXhjZXB0aW9uKGV4LCBTeXN0ZW0uZXJyKTsKLQotICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuIik7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgSW52b2tlcyB7QGxpbmsgI2RvU2VydmljZShIdHRwU2VydmxldFJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UpfS4KLSAgICAgKgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgZG9Qb3N0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGRvU2VydmljZShyZXF1ZXN0LCByZXNwb25zZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgdGhlIGFwcGxpY2F0aW9uIHNwZWNpZmljYXRpb24sIHdoaWNoIGlzIHJlYWQKLSAgICAgKiAgYnkgdGhlIHtAbGluayAjaW5pdChTZXJ2bGV0Q29uZmlnKX0gbWV0aG9kLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIElBcHBsaWNhdGlvblNwZWNpZmljYXRpb24gZ2V0QXBwbGljYXRpb25TcGVjaWZpY2F0aW9uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfc3BlY2lmaWNhdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0cmlldmVzIHRoZSB7QGxpbmsgSUVuZ2luZSBlbmdpbmV9IHRoYXQgd2lsbCBwcm9jZXNzIHRoaXMKLSAgICAgKiAgcmVxdWVzdC4gIFRoaXMgY29tZXMgZnJvbSBvbmUgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6Ci0gICAgICogIDx1bD4KLSAgICAgKiAgPGxpPlRoZSB7QGxpbmsgSHR0cFNlc3Npb259LCBpZiB0aGUgdGhlcmUgaXMgb25lLgotICAgICAqICA8bGk+RnJvbSB0aGUgcG9vbCBvZiBhdmFpbGFibGUgZW5naW5lcwotICAgICAqICA8bGk+RnJlc2hseSBjcmVhdGVkCi0gICAgICogIDwvdWw+Ci0gICAgICoKLSAgICAgKiovCi0KLSAgICBwcm90ZWN0ZWQgSUVuZ2luZSBnZXRFbmdpbmUoUmVxdWVzdENvbnRleHQgY29udGV4dCkgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIElFbmdpbmUgZW5naW5lID0gbnVsbDsKLSAgICAgICAgSHR0cFNlc3Npb24gc2Vzc2lvbiA9IGNvbnRleHQuZ2V0U2Vzc2lvbigpOwotCi0gICAgICAgIC8vIElmIHRoZXJlJ3MgYSBzZXNzaW9uLCB0aGVuIGZpbmQgdGhlIGVuZ2luZSB3aXRoaW4gaXQuCi0KLSAgICAgICAgaWYgKHNlc3Npb24gIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgZW5naW5lID0gKElFbmdpbmUpIHNlc3Npb24uZ2V0QXR0cmlidXRlKF9hdHRyaWJ1dGVOYW1lKTsKLSAgICAgICAgICAgIGlmIChlbmdpbmUgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoTE9HLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgICAgIExPRy5kZWJ1ZygiUmV0cmlldmVkICIgKyBlbmdpbmUgKyAiIGZyb20gc2Vzc2lvbiAiICsgc2Vzc2lvbi5nZXRJZCgpICsgIi4iKTsKLQotICAgICAgICAgICAgICAgIHJldHVybiBlbmdpbmU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChMT0cuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICBMT0cuZGVidWcoIlNlc3Npb24gZXhpc3RzLCBidXQgZG9lc24ndCBjb250YWluIGFuIGVuZ2luZS4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIExvY2FsZSBsb2NhbGUgPSBnZXRMb2NhbGVGcm9tUmVxdWVzdChjb250ZXh0KTsKLQotICAgICAgICBlbmdpbmUgPSAoSUVuZ2luZSkgX2VuZ2luZVBvb2wucmV0cmlldmUobG9jYWxlKTsKLQotICAgICAgICBpZiAoZW5naW5lID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVuZ2luZSA9IGNyZWF0ZUVuZ2luZShjb250ZXh0KTsKLSAgICAgICAgICAgIGVuZ2luZS5zZXRMb2NhbGUobG9jYWxlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChMT0cuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICBMT0cuZGVidWcoIlVzaW5nIHBvb2xlZCBlbmdpbmUgIiArIGVuZ2luZSArICIgKGZyb20gbG9jYWxlICIgKyBsb2NhbGUgKyAiKS4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBlbmdpbmU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIERldGVybWluZXMgdGhlIHtAbGluayBMb2NhbGV9IGZvciB0aGUgaW5jb21pbmcgcmVxdWVzdC4KLSAgICAgKiAgVGhpcyBpcyBkZXRlcm1pbmVkIGZyb20gdGhlIGxvY2FsZSBjb29raWUgb3IsIGlmIG5vdCBzZXQsCi0gICAgICogIGZyb20gdGhlIHJlcXVlc3QgaXRzZWxmLiAgVGhpcyBtYXkgcmV0dXJuIG51bGwKLSAgICAgKiAgaWYgbm8gbG9jYWxlIGlzIGRldGVybWluZWQuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwcm90ZWN0ZWQgTG9jYWxlIGdldExvY2FsZUZyb21SZXF1ZXN0KFJlcXVlc3RDb250ZXh0IGNvbnRleHQpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uCi0gICAgewotICAgICAgICBDb29raWUgY29va2llID0gY29udGV4dC5nZXRDb29raWUoTE9DQUxFX0NPT0tJRV9OQU1FKTsKLQotICAgICAgICBpZiAoY29va2llICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gVGFwZXN0cnkuZ2V0TG9jYWxlKGNvb2tpZS5nZXRWYWx1ZSgpKTsKLQotICAgICAgICByZXR1cm4gY29udGV4dC5nZXRSZXF1ZXN0KCkuZ2V0TG9jYWxlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFJlYWRzIHRoZSBhcHBsaWNhdGlvbiBzcGVjaWZpY2F0aW9uIHdoZW4gdGhlIHNlcnZsZXQgaXMKLSAgICAgKiAgZmlyc3QgaW5pdGlhbGl6ZWQuICBBbGwge0BsaW5rIElFbmdpbmUgZW5naW5lIGluc3RhbmNlc30KLSAgICAgKiAgd2lsbCBoYXZlIGFjY2VzcyB0byB0aGUgc3BlY2lmaWNhdGlvbiB2aWEgdGhlIHNlcnZsZXQuCi0gICAgICogCi0gICAgICogIEBzZWUgI2dldEFwcGxpY2F0aW9uU3BlY2lmaWNhdGlvbigpCi0gICAgICogIEBzZWUgI2NvbnN0cnVjdEFwcGxpY2F0aW9uU3BlY2lmaWNhdGlvbigpCi0gICAgICogIEBzZWUgI2NyZWF0ZVJlc291cmNlUmVzb2x2ZXIoKQotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgaW5pdChTZXJ2bGV0Q29uZmlnIGNvbmZpZykgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHN1cGVyLmluaXQoY29uZmlnKTsKLQotICAgICAgICBfcmVzb2x2ZXIgPSBjcmVhdGVSZXNvdXJjZVJlc29sdmVyKCk7Ci0KLSAgICAgICAgX3NwZWNpZmljYXRpb24gPSBjb25zdHJ1Y3RBcHBsaWNhdGlvblNwZWNpZmljYXRpb24oKTsKLQotICAgICAgICBfYXR0cmlidXRlTmFtZSA9ICJvcmcuYXBhY2hlLnRhcGVzdHJ5LmVuZ2luZToiICsgY29uZmlnLmdldFNlcnZsZXROYW1lKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEludm9rZWQgZnJvbSB7QGxpbmsgI2luaXQoU2VydmxldENvbmZpZyl9IHRvIGNyZWF0ZSBhIHJlc291cmNlIHJlc29sdmVyCi0gICAgICogIGZvciB0aGUgc2VydmxldCAod2hpY2ggd2lsbCB1dGxpbWF0ZWx5IGJlIHNoYXJlZCBhbmQgdXNlZCB0aHJvdWdoIHRoZQotICAgICAqICBhcHBsaWNhdGlvbikuCi0gICAgICogCi0gICAgICogIDxwPlRoaXMgaW1wbGVtZW50YXRpb24gY29uc3RydWN0cyBhIHtAbGluayBEZWZhdWx0UmVzb3VyY2VSZXNvbHZlcn0sIHN1YmNsYXNzZXMKLSAgICAgKiAgbWF5IHByb3ZpZGUgYSBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb24uCi0gICAgICogCi0gICAgICogIEBzZWUgI2dldFJlc291cmNlUmVzb2x2ZXIoKQotICAgICAqICBAc2luY2UgMi4zCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHJvdGVjdGVkIElSZXNvdXJjZVJlc29sdmVyIGNyZWF0ZVJlc291cmNlUmVzb2x2ZXIoKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBEZWZhdWx0UmVzb3VyY2VSZXNvbHZlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBJbnZva2VkIGZyb20ge0BsaW5rICNpbml0KFNlcnZsZXRDb25maWcpfSB0byByZWFkIGFuZCBjb25zdHJ1Y3QKLSAgICAgKiAgdGhlIHtAbGluayBBcHBsaWNhdGlvblNwZWNpZmljYXRpb259IGZvciB0aGlzIHNlcnZsZXQuCi0gICAgICogIEludm9rZXMge0BsaW5rICNnZXRBcHBsaWNhdGlvblNwZWNpZmljYXRpb25QYXRoKCl9LCBvcGVucwotICAgICAqICB0aGUgcmVzb3VyY2UgYXMgYSBzdHJlYW0sIHRoZW4gaW52b2tlcwotICAgICAqICB7QGxpbmsgI3BhcnNlQXBwbGljYXRpb25TcGVjaWZpY2F0aW9uKElSZXNvdXJjZUxvY2F0aW9uKX0uCi0gICAgICogCi0gICAgICogIDxwPgotICAgICAqICBUaGlzIG1ldGhvZCBleGlzdHMgdG8gYmUgb3ZlcnJpZGVuIGluCi0gICAgICogIGFwcGxpY2F0aW9ucyB3aGVyZSB0aGUgYXBwbGljYXRpb24gc3BlY2lmaWNhdGlvbiBjYW5ub3QgYmUKLSAgICAgKiAgbG9hZGVkIGZyb20gdGhlIGNsYXNzcGF0aC4gIEFsdGVybmF0ZWx5LCBhIHN1YmNsYXNzCi0gICAgICogIGNvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kLCBpbnZva2UgdGhpcyBpbXBsZW1lbnRhdGlvbiwKLSAgICAgKiAgYW5kIHRoZW4gYWRkIGFkZGl0aW9uYWwgZGF0YSB0byBpdCAoZm9yIGV4YW1wbGUsIGFuIGFwcGxpY2F0aW9uCi0gICAgICogIHdoZXJlIHNvbWUgb2YgdGhlIHBhZ2VzIGFyZSBkZWZpbmVkIGluIGFuIGV4dGVybmFsIHNvdXJjZQotICAgICAqICBzdWNoIGFzIGEgZGF0YWJhc2UpLgotICAgICAqICAKLSAgICAgKiAgQHNpbmNlIDIuMgotICAgICAqIAotICAgICAqKi8KLQotICAgIHByb3RlY3RlZCBJQXBwbGljYXRpb25TcGVjaWZpY2F0aW9uIGNvbnN0cnVjdEFwcGxpY2F0aW9uU3BlY2lmaWNhdGlvbigpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uCi0gICAgewotICAgICAgICBJUmVzb3VyY2VMb2NhdGlvbiBzcGVjTG9jYXRpb24gPSBnZXRBcHBsaWNhdGlvblNwZWNpZmljYXRpb25Mb2NhdGlvbigpOwotCi0gICAgICAgIGlmIChzcGVjTG9jYXRpb24gPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKExPRy5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIExPRy5kZWJ1ZyhUYXBlc3RyeS5nZXRNZXNzYWdlKCJBcHBsaWNhdGlvblNlcnZsZXQubm8tYXBwbGljYXRpb24tc3BlY2lmaWNhdGlvbiIpKTsKLQotICAgICAgICAgICAgcmV0dXJuIGNvbnN0cnVjdFN0YW5kaW5TcGVjaWZpY2F0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoTE9HLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgICAgICBMT0cuZGVidWcoIkxvYWRpbmcgYXBwbGljYXRpb24gc3BlY2lmaWNhdGlvbiBmcm9tICIgKyBzcGVjTG9jYXRpb24pOwotCi0gICAgICAgIHJldHVybiBwYXJzZUFwcGxpY2F0aW9uU3BlY2lmaWNhdGlvbihzcGVjTG9jYXRpb24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBHZXRzIHRoZSBsb2NhdGlvbiBvZiB0aGUgYXBwbGljYXRpb24gc3BlY2lmaWNhdGlvbiwgaWYgdGhlcmUgaXMgb25lLgotICAgICAqICAKLSAgICAgKiAgPHVsPgotICAgICAqICA8bGk+SW52b2tlcyB7QGxpbmsgI2dldEFwcGxpY2F0aW9uU3BlY2lmaWNhdGlvblBhdGgoKX0gdG8gZ2V0IHRoZQotICAgICAqICBsb2NhdGlvbiBvZiB0aGUgYXBwbGljYXRpb24gc3BlY2lmaWNhdGlvbiBvbiB0aGUgY2xhc3NwYXRoLgotICAgICAqICA8bGk+SWYgdGhhdCByZXR1cm4gbnVsbCwgc2VhcmNoIGZvciB0aGUgYXBwbGljYXRpb24gc3BlY2lmaWNhdGlvbjoKLSAgICAgKiAgPHVsPgotICAgICAqICA8bGk+PGk+bmFtZTwvaT4uYXBwbGljYXRpb24gaW4gL1dFQi1JTkYvPGk+bmFtZTwvaT4vCi0gICAgICogIDxsaT48aT5uYW1lPC9pPi5hcHBsaWNhdGlvbiBpbiAvV0VCLUlORi8KLSAgICAgKiAgPC91bD4KLSAgICAgKiAgPC91bD4KLSAgICAgKiAKLSAgICAgKiAgPHA+UmV0dXJucyB0aGUgbG9jYXRpb24gb2YgdGhlIGFwcGxpY2F0aW9uIHNwZWNpZmljYXRpb24sIG9yIG51bGwKLSAgICAgKiAgaWYgbm90IGZvdW5kLgotICAgICAqIAotICAgICAqICBAc2luY2UgMy4wCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHJvdGVjdGVkIElSZXNvdXJjZUxvY2F0aW9uIGdldEFwcGxpY2F0aW9uU3BlY2lmaWNhdGlvbkxvY2F0aW9uKCkgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFN0cmluZyBwYXRoID0gZ2V0QXBwbGljYXRpb25TcGVjaWZpY2F0aW9uUGF0aCgpOwotCi0gICAgICAgIGlmIChwYXRoICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbmV3IENsYXNzcGF0aFJlc291cmNlTG9jYXRpb24oX3Jlc29sdmVyLCBwYXRoKTsKLQotICAgICAgICBTZXJ2bGV0Q29udGV4dCBjb250ZXh0ID0gZ2V0U2VydmxldENvbnRleHQoKTsKLSAgICAgICAgU3RyaW5nIHNlcnZsZXROYW1lID0gZ2V0U2VydmxldE5hbWUoKTsKLSAgICAgICAgU3RyaW5nIGV4cGVjdGVkTmFtZSA9IHNlcnZsZXROYW1lICsgIi5hcHBsaWNhdGlvbiI7Ci0KLSAgICAgICAgSVJlc291cmNlTG9jYXRpb24gd2ViSW5mTG9jYXRpb24gPSBuZXcgQ29udGV4dFJlc291cmNlTG9jYXRpb24oY29udGV4dCwgIi9XRUItSU5GLyIpOwotICAgICAgICBJUmVzb3VyY2VMb2NhdGlvbiB3ZWJJbmZBcHBMb2NhdGlvbiA9IHdlYkluZkxvY2F0aW9uLmdldFJlbGF0aXZlTG9jYXRpb24oc2VydmxldE5hbWUgKyAiLyIpOwotCi0gICAgICAgIElSZXNvdXJjZUxvY2F0aW9uIHJlc3VsdCA9IGNoZWNrKHdlYkluZkFwcExvY2F0aW9uLCBleHBlY3RlZE5hbWUpOwotICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotCi0gICAgICAgIHJldHVybiBjaGVjayh3ZWJJbmZMb2NhdGlvbiwgZXhwZWN0ZWROYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgQ2hlY2tzIGZvciB0aGUgYXBwbGljYXRpb24gc3BlY2lmaWNhdGlvbiByZWxhdGl2ZSB0byB0aGUgc3BlY2lmaWVkCi0gICAgICogIGxvY2F0aW9uLgotICAgICAqIAotICAgICAqICBAc2luY2UgMy4wCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHJpdmF0ZSBJUmVzb3VyY2VMb2NhdGlvbiBjaGVjayhJUmVzb3VyY2VMb2NhdGlvbiBsb2NhdGlvbiwgU3RyaW5nIG5hbWUpCi0gICAgewotICAgICAgICBJUmVzb3VyY2VMb2NhdGlvbiByZXN1bHQgPSBsb2NhdGlvbi5nZXRSZWxhdGl2ZUxvY2F0aW9uKG5hbWUpOwotCi0gICAgICAgIGlmIChMT0cuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgICAgIExPRy5kZWJ1ZygiQ2hlY2tpbmcgZm9yIGV4aXN0ZW5jZSBvZiAiICsgcmVzdWx0KTsKLQotICAgICAgICBpZiAocmVzdWx0LmdldFJlc291cmNlVVJMKCkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgTE9HLmRlYnVnKCJGb3VuZC4iKTsKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgSW52b2tlZCBmcm9tIHtAbGluayAjY29uc3RydWN0QXBwbGljYXRpb25TcGVjaWZpY2F0aW9uKCl9IHdoZW4KLSAgICAgKiAgdGhlIGFwcGxpY2F0aW9uIGRvZXNuJ3QgaGF2ZSBhbiBleHBsaWNpdCBzcGVjaWZpY2F0aW9uLiAgQQotICAgICAqICBzaW1wbGUgc3BlY2lmaWNhdGlvbiBpcyBjb25zdHJ1Y3RlZCBhbmQgcmV0dXJuZWQuICBUaGlzIGlzIHVzZWZ1bAotICAgICAqICBmb3IgbWluaW1hbCBhcHBsaWNhdGlvbnMgYW5kIHByb3RvdHlwZXMuCi0gICAgICogCi0gICAgICogIEBzaW5jZSAzLjAKLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwcm90ZWN0ZWQgSUFwcGxpY2F0aW9uU3BlY2lmaWNhdGlvbiBjb25zdHJ1Y3RTdGFuZGluU3BlY2lmaWNhdGlvbigpCi0gICAgewotICAgICAgICBBcHBsaWNhdGlvblNwZWNpZmljYXRpb24gcmVzdWx0ID0gbmV3IEFwcGxpY2F0aW9uU3BlY2lmaWNhdGlvbigpOwotCi0gICAgICAgIElSZXNvdXJjZUxvY2F0aW9uIHZpcnR1YWxMb2NhdGlvbiA9Ci0gICAgICAgICAgICBuZXcgQ29udGV4dFJlc291cmNlTG9jYXRpb24oZ2V0U2VydmxldENvbnRleHQoKSwgIi9XRUItSU5GLyIpOwotCi0gICAgICAgIHJlc3VsdC5zZXRTcGVjaWZpY2F0aW9uTG9jYXRpb24odmlydHVhbExvY2F0aW9uKTsKLQotICAgICAgICByZXN1bHQuc2V0TmFtZShnZXRTZXJ2bGV0TmFtZSgpKTsKLSAgICAgICAgcmVzdWx0LnNldFJlc291cmNlUmVzb2x2ZXIoX3Jlc29sdmVyKTsKLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBJbnZva2VkIGZyb20ge0BsaW5rICNjb25zdHJ1Y3RBcHBsaWNhdGlvblNwZWNpZmljYXRpb24oKX0gdG8KLSAgICAgKiAgYWN0dWFsbHkgcGFyc2UgdGhlIHN0cmVhbSAod2l0aCBjb250ZW50IHByb3ZpZGVkIGZyb20gdGhlIHBhdGgpCi0gICAgICogIGFuZCBjb252ZXJ0IGl0IGludG8gYW4ge0BsaW5rIEFwcGxpY2F0aW9uU3BlY2lmaWNhdGlvbn0uCi0gICAgICogCi0gICAgICogIEBzaW5jZSAyLjIKLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwcm90ZWN0ZWQgSUFwcGxpY2F0aW9uU3BlY2lmaWNhdGlvbiBwYXJzZUFwcGxpY2F0aW9uU3BlY2lmaWNhdGlvbihJUmVzb3VyY2VMb2NhdGlvbiBsb2NhdGlvbikKLSAgICAgICAgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBTcGVjaWZpY2F0aW9uUGFyc2VyIHBhcnNlciA9IG5ldyBTcGVjaWZpY2F0aW9uUGFyc2VyKF9yZXNvbHZlcik7Ci0KLSAgICAgICAgICAgIHJldHVybiBwYXJzZXIucGFyc2VBcHBsaWNhdGlvblNwZWNpZmljYXRpb24obG9jYXRpb24pOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChEb2N1bWVudFBhcnNlRXhjZXB0aW9uIGV4KQotICAgICAgICB7Ci0gICAgICAgICAgICBzaG93KGV4KTsKLQotICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgVGFwZXN0cnkuZm9ybWF0KCJBcHBsaWNhdGlvblNlcnZsZXQuY291bGQtbm90LXBhcnNlLXNwZWMiLCBsb2NhdGlvbiksCi0gICAgICAgICAgICAgICAgZXgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIENsb3NlcyB0aGUgc3RyZWFtLCBpZ25vcmluZyBhbnkgZXhjZXB0aW9ucy4KLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjbG9zZShJbnB1dFN0cmVhbSBzdHJlYW0pCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHN0cmVhbSAhPSBudWxsKQotICAgICAgICAgICAgICAgIHN0cmVhbS5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBleCkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gSWdub3JlIGl0LgotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFJlYWRzIHRoZSBzZXJ2bGV0IGluaXQgcGFyYW1ldGVyCi0gICAgICogIDxjb2RlPm9yZy5hcGFjaGUudGFwZXN0cnkuYXBwbGljYXRpb24tc3BlY2lmaWNhdGlvbjwvY29kZT4sIHdoaWNoCi0gICAgICogIGlzIHRoZSBsb2NhdGlvbiwgb24gdGhlIGNsYXNzcGF0aCwgb2YgdGhlIGFwcGxpY2F0aW9uIHNwZWNpZmljYXRpb24uCi0gICAgICoKLSAgICAgKiAgPHA+Ci0gICAgICogIElmIHRoZSBwYXJhbWV0ZXIgaXMgbm90IHNldCwgdGhpcyBtZXRob2QgcmV0dXJucyBudWxsLCBhbmQgYSBzZWFyY2gKLSAgICAgKiAgZm9yIHRoZSBhcHBsaWNhdGlvbiBzcGVjaWZpY2F0aW9uIHdpdGhpbiB0aGUgc2VydmxldCBjb250ZXh0Ci0gICAgICogIHdpbGwgYmVnaW4uCi0gICAgICogCi0gICAgICogIEBzZWUgI2dldEFwcGxpY2F0aW9uU3BlY2lmaWNhdGlvbkxvY2F0aW9uKCkKLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEFwcGxpY2F0aW9uU3BlY2lmaWNhdGlvblBhdGgoKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldEluaXRQYXJhbWV0ZXIoQVBQX1NQRUNfUEFUSF9QQVJBTSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEludm9rZWQgYnkge0BsaW5rICNnZXRFbmdpbmUoUmVxdWVzdENvbnRleHQpfSB0byBjcmVhdGUKLSAgICAgKiAgdGhlIHtAbGluayBJRW5naW5lfSBpbnN0YW5jZSBzcGVjaWZpYyB0byB0aGUKLSAgICAgKiAgYXBwbGljYXRpb24sIGlmIG5vdCBhbHJlYWR5IGluIHRoZQotICAgICAqICB7QGxpbmsgSHR0cFNlc3Npb259LgotICAgICAqCi0gICAgICogIDxwPlRoZSB7QGxpbmsgSUVuZ2luZX0gaW5zdGFuY2UgcmV0dXJuZWQgaXMgc3RvcmVkIGludG8gdGhlCi0gICAgICogIHtAbGluayBIdHRwU2Vzc2lvbn0uCi0gICAgICoKLSAgICAgKiAgQHNlZSAjZ2V0RW5naW5lQ2xhc3NOYW1lKCkgICAgCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwcm90ZWN0ZWQgSUVuZ2luZSBjcmVhdGVFbmdpbmUoUmVxdWVzdENvbnRleHQgY29udGV4dCkgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gZ2V0RW5naW5lQ2xhc3NOYW1lKCk7Ci0KLSAgICAgICAgICAgIGlmIChMT0cuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICBMT0cuZGVidWcoIkNyZWF0aW5nIGVuZ2luZSBmcm9tIGNsYXNzICIgKyBjbGFzc05hbWUpOwotCi0gICAgICAgICAgICBDbGFzcyBlbmdpbmVDbGFzcyA9IGdldFJlc291cmNlUmVzb2x2ZXIoKS5maW5kQ2xhc3MoY2xhc3NOYW1lKTsKLQotICAgICAgICAgICAgSUVuZ2luZSByZXN1bHQgPSAoSUVuZ2luZSkgZW5naW5lQ2xhc3MubmV3SW5zdGFuY2UoKTsKLQotICAgICAgICAgICAgaWYgKExPRy5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIExPRy5kZWJ1ZygiQ3JlYXRlZCBlbmdpbmUgIiArIHJlc3VsdCk7Ci0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24oZXgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGNsYXNzIHRvIHVzZSB3aGVuIGluc3RhbnRpYXRpbmcKLSAgICAgKiAgYW4gZW5naW5lIGluc3RhbmNlIGZvciB0aGlzIGFwcGxpY2F0aW9uLiAgCi0gICAgICogIElmIHRoZSBhcHBsaWNhdGlvbiBzcGVjaWZpY2F0aW9uCi0gICAgICogIHByb3ZpZGVzIGEgdmFsdWUsIHRoaXMgaXMgcmV0dXJuZWQuICBPdGhlcndpc2UsIGEgc2VhcmNoIGZvcgotICAgICAqICB0aGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSAKLSAgICAgKiAgPGNvZGU+b3JnLmFwYWNoZS50YXBlc3RyeS5lbmdpbmUtY2xhc3M8L2NvZGU+Ci0gICAgICogIG9jY3VycyAoc2VlIHtAbGluayAjc2VhcmNoQ29uZmlndXJhdGlvbihTdHJpbmcpfSkuCi0gICAgICogCi0gICAgICogIDxwPklmIHRoZSBzZWFyY2ggaXMgc3RpbGwgdW5zdWNjZXNzZnVsLCB0aGVuCi0gICAgICogIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LmVuZ2luZS5CYXNlRW5naW5lfSBpcyB1c2VkLgotICAgICAqIAotICAgICAqKi8KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RW5naW5lQ2xhc3NOYW1lKCkKLSAgICB7Ci0gICAgICAgIGlmIChfZW5naW5lQ2xhc3NOYW1lICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gX2VuZ2luZUNsYXNzTmFtZTsKLQotICAgICAgICBfZW5naW5lQ2xhc3NOYW1lID0gX3NwZWNpZmljYXRpb24uZ2V0RW5naW5lQ2xhc3NOYW1lKCk7Ci0KLSAgICAgICAgaWYgKF9lbmdpbmVDbGFzc05hbWUgPT0gbnVsbCkKLSAgICAgICAgICAgIF9lbmdpbmVDbGFzc05hbWUgPSBzZWFyY2hDb25maWd1cmF0aW9uKCJvcmcuYXBhY2hlLnRhcGVzdHJ5LmVuZ2luZS1jbGFzcyIpOwotCi0gICAgICAgIGlmIChfZW5naW5lQ2xhc3NOYW1lID09IG51bGwpCi0gICAgICAgICAgICBfZW5naW5lQ2xhc3NOYW1lID0gQmFzZUVuZ2luZS5jbGFzcy5nZXROYW1lKCk7Ci0KLSAgICAgICAgcmV0dXJuIF9lbmdpbmVDbGFzc05hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFNlYXJjaGVzIGZvciBhIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgaW46Ci0gICAgICogIDx1bD4KLSAgICAgKiAgPGxpPlRoZSBzZXJ2bGV0J3MgaW5pdGlhbCBwYXJhbWV0ZXJzCi0gICAgICogIDxsaT5UaGUgc2VydmxldCBjb250ZXh0J3MgaW5pdGlhbCBwYXJhbWV0ZXJzCi0gICAgICogIDxsaT5KVk0gc3lzdGVtIHByb3BlcnRpZXMKLSAgICAgKiAgPC91bD4KLSAgICAgKiAKLSAgICAgKiAgQHNlZSAjY3JlYXRlUHJvcGVydHlTb3VyY2UoKQotICAgICAqICBAc2luY2UgMy4wCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBzZWFyY2hDb25maWd1cmF0aW9uKFN0cmluZyBwcm9wZXJ0eU5hbWUpCi0gICAgewotICAgICAgICBpZiAoX3Byb3BlcnR5U291cmNlID09IG51bGwpCi0gICAgICAgICAgICBfcHJvcGVydHlTb3VyY2UgPSBjcmVhdGVQcm9wZXJ0eVNvdXJjZSgpOwotCi0gICAgICAgIHJldHVybiBfcHJvcGVydHlTb3VyY2UuZ2V0UHJvcGVydHlWYWx1ZShwcm9wZXJ0eU5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHtAbGluayBJUHJvcGVydHlTb3VyY2V9IHVzZWQgZm9yCi0gICAgICogIHNlYXJjaGluZyBvZiBjb25maWd1cmF0aW9uIHZhbHVlcy4gIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCi0gICAgICogIHRoaXMgbWV0aG9kIGlmIHRoZXkgd2FudCB0byBjaGFuZ2UgdGhlIG5vcm1hbCBsb2NhdGlvbnMKLSAgICAgKiAgdGhhdCBwcm9wZXJ0aWVzIGFyZSBzZWFyY2hlZCBmb3Igd2l0aGluLgotICAgICAqIAotICAgICAqICBAc2luY2UgMy4wCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHJvdGVjdGVkIElQcm9wZXJ0eVNvdXJjZSBjcmVhdGVQcm9wZXJ0eVNvdXJjZSgpCi0gICAgewotICAgICAgICBEZWxlZ2F0aW5nUHJvcGVydHlTb3VyY2UgcmVzdWx0ID0gbmV3IERlbGVnYXRpbmdQcm9wZXJ0eVNvdXJjZSgpOwotCi0gICAgICAgIHJlc3VsdC5hZGRTb3VyY2UobmV3IFNlcnZsZXRQcm9wZXJ0eVNvdXJjZShnZXRTZXJ2bGV0Q29uZmlnKCkpKTsKLSAgICAgICAgcmVzdWx0LmFkZFNvdXJjZShuZXcgU2VydmxldENvbnRleHRQcm9wZXJ0eVNvdXJjZShnZXRTZXJ2bGV0Q29udGV4dCgpKSk7Ci0gICAgICAgIHJlc3VsdC5hZGRTb3VyY2UoU3lzdGVtUHJvcGVydGllc1Byb3BlcnR5U291cmNlLmdldEluc3RhbmNlKCkpOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEludm9rZWQgZnJvbSB0aGUge0BsaW5rIElFbmdpbmUgZW5naW5lfSwganVzdCBwcmlvciB0byBzdGFydGluZyB0bwotICAgICAqICByZW5kZXIgYSByZXNwb25zZSwgd2hlbiB0aGUgbG9jYWxlIGhhcyBjaGFuZ2VkLiAgVGhlIHNlcnZsZXQgd3JpdGVzIGEKLSAgICAgKiAge0BsaW5rIENvb2tpZX0gc28gdGhhdCwgb24gc3Vic2VxdWVudCByZXF1ZXN0IGN5Y2xlcywgYW4gZW5naW5lIGxvY2FsaXplZAotICAgICAqICB0byB0aGUgc2VsZWN0ZWQgbG9jYWxlIGlzIGNob3Nlbi4KLSAgICAgKgotICAgICAqICA8cD5BdCB0aGlzIHRpbWUsIHRoZSBjb29raWUgaXMgPGVtPm5vdDwvZW0+IHBlcnNpc3RlbnQuICBUaGF0IG1heQotICAgICAqICBjaGFuZ2UgaW4gc3Vic2VxdWVudCByZWxlYXNlcy4KLSAgICAgKgotICAgICAqICBAc2luY2UgMS4wLjEKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUxvY2FsZUNvb2tpZShMb2NhbGUgbG9jYWxlLCBJRW5naW5lIGVuZ2luZSwgUmVxdWVzdENvbnRleHQgY3ljbGUpCi0gICAgewotICAgICAgICBpZiAoTE9HLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgICAgICBMT0cuZGVidWcoIldyaXRpbmcgbG9jYWxlIGNvb2tpZSAiICsgbG9jYWxlKTsKLQotICAgICAgICBDb29raWUgY29va2llID0gbmV3IENvb2tpZShMT0NBTEVfQ09PS0lFX05BTUUsIGxvY2FsZS50b1N0cmluZygpKTsKLSAgICAgICAgY29va2llLnNldFBhdGgoZW5naW5lLmdldFNlcnZsZXRQYXRoKCkpOwotCi0gICAgICAgIGN5Y2xlLmFkZENvb2tpZShjb29raWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIGEgcmVzb3VyY2UgcmVzb2x2ZXIgdGhhdCBjYW4gYWNjZXNzIGNsYXNzZXMgYW5kIHJlc291cmNlcyByZWxhdGVkCi0gICAgICogIHRvIHRoZSBjdXJyZW50IHdlYiBhcHBsaWNhdGlvbiBjb250ZXh0LiAgUmVsaWVzIG9uCi0gICAgICogIHtAbGluayBqYXZhLmxhbmcuVGhyZWFkI2dldENvbnRleHRDbGFzc0xvYWRlcigpfSwgd2hpY2ggaXMgc2V0IGJ5Ci0gICAgICogIG1vc3QgbW9kZXJuIHNlcnZsZXQgY29udGFpbmVycy4KLSAgICAgKiAKLSAgICAgKiAgQHNpbmNlIDIuMwotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIElSZXNvdXJjZVJlc29sdmVyIGdldFJlc291cmNlUmVzb2x2ZXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9yZXNvbHZlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFbnN1cmVzIHRoYXQgc2hhcmVkIGphbml0b3IgdGhyZWFkIGlzIHRlcm1pbmF0ZWQuCi0gICAgICogQHNlZSBqYXZheC5zZXJ2bGV0LlNlcnZsZXQjZGVzdHJveSgpCi0gICAgICogQHNpbmNlIDMuMC4zCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGVzdHJveSgpCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgSmFuaXRvclRocmVhZC5nZXRTaGFyZWRKYW5pdG9yVGhyZWFkKCkuaW50ZXJydXB0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBzdXBlci5kZXN0cm95KCk7Ci0gICAgICAgIH0KLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L0Jhc2VDb21wb25lbnQuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9CYXNlQ29tcG9uZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5ZjA2ZjQuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L0Jhc2VDb21wb25lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuZW5naW5lLklQYWdlTG9hZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuZW5naW5lLklQYWdlU291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuZW5naW5lLklUZW1wbGF0ZVNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnBhcnNlLkNvbXBvbmVudFRlbXBsYXRlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuc3BlYy5JQ29tcG9uZW50U3BlY2lmaWNhdGlvbjsKLQotLyoqCi0gKiBCYXNlIGltcGxlbWVudGF0aW9uIGZvciBtb3N0IGNvbXBvbmVudHMgdGhhdCB1c2UgYW4gSFRNTCB0ZW1wbGF0ZS4KLSAqCi0gKiBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiBAdmVyc2lvbiAkSWQkCi0gKiAKLSAqKi8KLQotcHVibGljIGNsYXNzIEJhc2VDb21wb25lbnQgZXh0ZW5kcyBBYnN0cmFjdENvbXBvbmVudAotewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBMT0cgPSBMb2dGYWN0b3J5LmdldExvZyhCYXNlQ29tcG9uZW50LmNsYXNzKTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPVVRFUl9JTklUX1NJWkUgPSA1OwotCi0gICAgcHJpdmF0ZSBJUmVuZGVyW10gX291dGVyOwotICAgIHByaXZhdGUgaW50IF9vdXRlckNvdW50ID0gMDsKLQotICAgIC8qKgotICAgICAqICBBZGRzIGFuIGVsZW1lbnQgYXMgYW4gb3V0ZXIgZWxlbWVudCBmb3IgdGhlIHJlY2VpdmVyLiAgT3V0ZXIKLSAgICAgKiAgZWxlbWVudHMgYXJlIGVsZW1lbnRzIHRoYXQgc2hvdWxkIGJlIGRpcmVjdGx5IHJlbmRlcmVkIGJ5IHRoZQotICAgICAqICByZWNlaXZlcidzIDxjb2RlPnJlbmRlcigpPC9jb2RlPiBtZXRob2QuICBUaGF0IGlzLCB0aGV5IGFyZQotICAgICAqICB0b3AtbGV2ZWwgZWxlbWVudHMgb24gdGhlIEhUTUwgdGVtcGxhdGUuCi0gICAgICoKLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRPdXRlcihJUmVuZGVyIGVsZW1lbnQpCi0gICAgewotICAgICAgICBpZiAoX291dGVyID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9vdXRlciA9IG5ldyBJUmVuZGVyW09VVEVSX0lOSVRfU0laRV07Ci0gICAgICAgICAgICBfb3V0ZXJbMF0gPSBlbGVtZW50OwotCi0gICAgICAgICAgICBfb3V0ZXJDb3VudCA9IDE7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBObyBtb3JlIHJvb20/ICBNYWtlIHRoZSBhcnJheSBiaWdnZXIuCi0KLSAgICAgICAgaWYgKF9vdXRlckNvdW50ID09IF9vdXRlci5sZW5ndGgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIElSZW5kZXJbXSBuZXdPdXRlcjsKLQotICAgICAgICAgICAgbmV3T3V0ZXIgPSBuZXcgSVJlbmRlcltfb3V0ZXIubGVuZ3RoICogMl07Ci0KLSAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoX291dGVyLCAwLCBuZXdPdXRlciwgMCwgX291dGVyQ291bnQpOwotCi0gICAgICAgICAgICBfb3V0ZXIgPSBuZXdPdXRlcjsKLSAgICAgICAgfQotCi0gICAgICAgIF9vdXRlcltfb3V0ZXJDb3VudCsrXSA9IGVsZW1lbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoKLSAgICAgKiAgUmVhZHMgdGhlIHJlY2VpdmVyJ3MgdGVtcGxhdGUgYW5kIGZpZ3VyZXMgb3V0IHdoaWNoIGVsZW1lbnRzIHdyYXAgd2hpY2gKLSAgICAgKiAgb3RoZXIgZWxlbWVudHMuCi0gICAgICoKLSAgICAgKiAgPFA+VGhpcyBpcyBjb2RlZCBhcyBhIHNpbmdsZSwgYmlnLCB1Z2x5IG1ldGhvZCBmb3IgZWZmaWNpZW5jeS4KLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwcml2YXRlIHZvaWQgcmVhZFRlbXBsYXRlKElSZXF1ZXN0Q3ljbGUgY3ljbGUsIElQYWdlTG9hZGVyIGxvYWRlcikKLSAgICB7Ci0gICAgICAgIElQYWdlU291cmNlIHBhZ2VTb3VyY2UgPSBsb2FkZXIuZ2V0RW5naW5lKCkuZ2V0UGFnZVNvdXJjZSgpOwotCi0gICAgICAgIGlmIChMT0cuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgICAgIExPRy5kZWJ1Zyh0aGlzICsiIHJlYWRpbmcgdGVtcGxhdGUiKTsKLQotICAgICAgICBJVGVtcGxhdGVTb3VyY2Ugc291cmNlID0gbG9hZGVyLmdldFRlbXBsYXRlU291cmNlKCk7Ci0gICAgICAgIENvbXBvbmVudFRlbXBsYXRlIGNvbXBvbmVudFRlbXBsYXRlID0gc291cmNlLmdldFRlbXBsYXRlKGN5Y2xlLCB0aGlzKTsKLQotICAgICAgICAvLyBNb3N0IG9mIHRoZSB3b3JrIGlzIGRvbmUgaW5zaWRlIHRoZSBsb2FkZXIgY2xhc3MuIAotICAgICAgICAvLyBXZSBpbnN0YW50aWF0ZSBpdCBqdXN0IHRvIGludm9rZSBwcm9jZXNzKCkgb24gaXQuCi0gICAgICAgIAotICAgICAgICBuZXcgQmFzZUNvbXBvbmVudFRlbXBsYXRlTG9hZGVyKGN5Y2xlLCBsb2FkZXIsIHRoaXMsIGNvbXBvbmVudFRlbXBsYXRlLCBwYWdlU291cmNlKS5wcm9jZXNzKCk7Ci0KLSAgICAgICAgaWYgKExPRy5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICAgICAgTE9HLmRlYnVnKHRoaXMgKyIgZmluaXNoZWQgcmVhZGluZyB0ZW1wbGF0ZSIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICAgUmVuZGVycyB0aGUgdG9wIGxldmVsIGNvbXBvbmVudHMgY29udGFpbmVkIGJ5IHRoZSByZWNlaXZlci4KLSAgICAgKgotICAgICAqICAgQHNpbmNlIDIuMC4zCi0gICAgICoqLwotCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVuZGVyQ29tcG9uZW50KElNYXJrdXBXcml0ZXIgd3JpdGVyLCBJUmVxdWVzdEN5Y2xlIGN5Y2xlKQotICAgIHsKLSAgICAgICAgaWYgKExPRy5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICAgICAgTE9HLmRlYnVnKCJCZWdpbiByZW5kZXIgIiArIGdldEV4dGVuZGVkSWQoKSk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfb3V0ZXJDb3VudDsgaSsrKQotICAgICAgICAgICAgX291dGVyW2ldLnJlbmRlcih3cml0ZXIsIGN5Y2xlKTsKLQotICAgICAgICBpZiAoTE9HLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgICAgICBMT0cuZGVidWcoIkVuZCByZW5kZXIgIiArIGdldEV4dGVuZGVkSWQoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIExvYWRzIHRoZSB0ZW1wbGF0ZSBmb3IgdGhlIGNvbXBvbmVudCwgdGhlbiBpbnZva2VzCi0gICAgICogIHtAbGluayBBYnN0cmFjdENvbXBvbmVudCNmaW5pc2hMb2FkKElSZXF1ZXN0Q3ljbGUsIElQYWdlTG9hZGVyLCBJQ29tcG9uZW50U3BlY2lmaWNhdGlvbil9LgotICAgICAqICBTdWJjbGFzc2VzIG11c3QgaW52b2tlIHRoaXMgbWV0aG9kIGZpcnN0LAotICAgICAqICBiZWZvcmUgYWRkaW5nIGFueSBhZGRpdGlvbmFsIGJlaGF2aW9yLCB0aG91Z2ggaXRzIHVzdWFsbHkKLSAgICAgKiAgc2ltcGxlciB0byBvdmVycmlkZSB7QGxpbmsgI2ZpbmlzaExvYWQoKX0gaW5zdGVhZC4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIGZpbmlzaExvYWQoSVJlcXVlc3RDeWNsZSBjeWNsZSwgSVBhZ2VMb2FkZXIgbG9hZGVyLCBJQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBzcGVjaWZpY2F0aW9uKQotICAgIHsKLSAgICAgICAgcmVhZFRlbXBsYXRlKGN5Y2xlLCBsb2FkZXIpOwotCi0gICAgICAgIHN1cGVyLmZpbmlzaExvYWQoY3ljbGUsIGxvYWRlciwgc3BlY2lmaWNhdGlvbik7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9CYXNlQ29tcG9uZW50VGVtcGxhdGVMb2FkZXIuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9CYXNlQ29tcG9uZW50VGVtcGxhdGVMb2FkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE1MDc3MS4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvQmFzZUNvbXBvbmVudFRlbXBsYXRlTG9hZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NjAgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuYnVpbGRlci5Ub1N0cmluZ0J1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5iaW5kaW5nLkV4cHJlc3Npb25CaW5kaW5nOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuYmluZGluZy5TdGF0aWNCaW5kaW5nOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuYmluZGluZy5TdHJpbmdCaW5kaW5nOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuZW5naW5lLklQYWdlTG9hZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuZW5naW5lLklQYWdlU291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuZW5naW5lLklUZW1wbGF0ZVNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnBhcnNlLkF0dHJpYnV0ZVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5wYXJzZS5DbG9zZVRva2VuOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkucGFyc2UuQ29tcG9uZW50VGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5wYXJzZS5Mb2NhbGl6YXRpb25Ub2tlbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnBhcnNlLk9wZW5Ub2tlbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnBhcnNlLlRlbXBsYXRlQXR0cmlidXRlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkucGFyc2UuVGVtcGxhdGVUb2tlbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnBhcnNlLlRleHRUb2tlbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnBhcnNlLlRva2VuVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnNwZWMuSUNvbXBvbmVudFNwZWNpZmljYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5zcGVjLklDb250YWluZWRDb21wb25lbnQ7Ci0KLS8qKgotICogIFV0aWxpdHkgY2xhc3MgaW5zdGFudGlhdGVkIGJ5IHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LkJhc2VDb21wb25lbnR9IHRvCi0gKiAgcHJvY2VzcyB0aGUgY29tcG9uZW50J3Mge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkucGFyc2UuQ29tcG9uZW50VGVtcGxhdGUgdGVtcGxhdGV9LAotICogIHdoaWNoIGludm9sdmVzIHdvcmtpbmcgdGhyb3VnaCB0aGUgbmVzdGVkIHN0cnVjdHVyZSBvZiB0aGUgdGVtcGxhdGUgYW5kIGhvb2tpbmcKLSAqICB0aGUgdmFyaW91cyBzdGF0aWMgdGVtcGxhdGUgYmxvY2tzIGFuZCBjb21wb25lbnRzIHRvZ2V0aGVyIHVzaW5nCi0gKiAge0BsaW5rIElDb21wb25lbnQjYWRkQm9keShJUmVuZGVyKX0gYW5kIAotICogIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LkJhc2VDb21wb25lbnQjYWRkT3V0ZXIoSVJlbmRlcil9LgotICoKLSAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiAgQHZlcnNpb24gJElkJAotICogIEBzaW5jZSAzLjAKLSAqLwotCi1wdWJsaWMgY2xhc3MgQmFzZUNvbXBvbmVudFRlbXBsYXRlTG9hZGVyCi17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIExPRyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEJhc2VDb21wb25lbnRUZW1wbGF0ZUxvYWRlci5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIElQYWdlTG9hZGVyIF9wYWdlTG9hZGVyOwotICAgIHByaXZhdGUgSVJlcXVlc3RDeWNsZSBfcmVxdWVzdEN5Y2xlOwotICAgIHByaXZhdGUgQmFzZUNvbXBvbmVudCBfbG9hZENvbXBvbmVudDsKLSAgICBwcml2YXRlIElQYWdlU291cmNlIF9wYWdlU291cmNlOwotICAgIHByaXZhdGUgQ29tcG9uZW50VGVtcGxhdGUgX3RlbXBsYXRlOwotICAgIHByaXZhdGUgSUNvbXBvbmVudFtdIF9zdGFjazsKLSAgICBwcml2YXRlIGludCBfc3RhY2t4ID0gMDsKLSAgICBwcml2YXRlIElDb21wb25lbnQgX2FjdGl2ZUNvbXBvbmVudCA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTZXQgX3NlZW5JZHMgPSBuZXcgSGFzaFNldCgpOwotCi0gICAgLyoqCi0gICAgICogIEEgY2xhc3MgdXNlZCB3aXRoIGludmlzaWJsZSBsb2NhbGl6YXRpb25zLiAgQ29uc3RydWN0ZWQKLSAgICAgKiAgZnJvbSBhIHtAbGluayBUZXh0VG9rZW59LgotICAgICAqLwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTG9jYWxpemVkU3RyaW5nUmVuZGVyIGltcGxlbWVudHMgSVJlbmRlcgotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBJQ29tcG9uZW50IF9jb21wb25lbnQ7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIF9rZXk7Ci0gICAgICAgIHByaXZhdGUgTWFwIF9hdHRyaWJ1dGVzOwotICAgICAgICBwcml2YXRlIFN0cmluZyBfdmFsdWU7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBfcmF3OwotCi0gICAgICAgIHByaXZhdGUgTG9jYWxpemVkU3RyaW5nUmVuZGVyKElDb21wb25lbnQgY29tcG9uZW50LCBMb2NhbGl6YXRpb25Ub2tlbiB0b2tlbikKLSAgICAgICAgewotICAgICAgICAgICAgX2NvbXBvbmVudCA9IGNvbXBvbmVudDsKLSAgICAgICAgICAgIF9rZXkgPSB0b2tlbi5nZXRLZXkoKTsKLSAgICAgICAgICAgIF9yYXcgPSB0b2tlbi5pc1JhdygpOwotICAgICAgICAgICAgX2F0dHJpYnV0ZXMgPSB0b2tlbi5nZXRBdHRyaWJ1dGVzKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCByZW5kZXIoSU1hcmt1cFdyaXRlciB3cml0ZXIsIElSZXF1ZXN0Q3ljbGUgY3ljbGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChjeWNsZS5pc1Jld2luZGluZygpKQotICAgICAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAgICAgaWYgKF9hdHRyaWJ1dGVzICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgd3JpdGVyLmJlZ2luKCJzcGFuIik7Ci0KLSAgICAgICAgICAgICAgICBJdGVyYXRvciBpID0gX2F0dHJpYnV0ZXMuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotCi0gICAgICAgICAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaS5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBhdHRyaWJ1dGVOYW1lID0gKFN0cmluZykgZW50cnkuZ2V0S2V5KCk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBhdHRyaWJ1dGVWYWx1ZSA9IChTdHJpbmcpIGVudHJ5LmdldFZhbHVlKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgd3JpdGVyLmF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoX3ZhbHVlID09IG51bGwpCi0gICAgICAgICAgICAgICAgX3ZhbHVlID0gX2NvbXBvbmVudC5nZXRNZXNzYWdlKF9rZXkpOwotCi0gICAgICAgICAgICBpZiAoX3JhdykKLSAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRSYXcoX3ZhbHVlKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnQoX3ZhbHVlKTsKLQotICAgICAgICAgICAgaWYgKF9hdHRyaWJ1dGVzICE9IG51bGwpCi0gICAgICAgICAgICAgICAgd3JpdGVyLmVuZCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFRvU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFRvU3RyaW5nQnVpbGRlcih0aGlzKTsKLQotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoImNvbXBvbmVudCIsIF9jb21wb25lbnQpOwotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoImtleSIsIF9rZXkpOwotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoInJhdyIsIF9yYXcpOwotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoImF0dHJpYnV0ZXMiLCBfYXR0cmlidXRlcyk7Ci0KLSAgICAgICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHB1YmxpYyBCYXNlQ29tcG9uZW50VGVtcGxhdGVMb2FkZXIoCi0gICAgICAgIElSZXF1ZXN0Q3ljbGUgcmVxdWVzdEN5Y2xlLAotICAgICAgICBJUGFnZUxvYWRlciBwYWdlTG9hZGVyLAotICAgICAgICBCYXNlQ29tcG9uZW50IGxvYWRDb21wb25lbnQsCi0gICAgICAgIENvbXBvbmVudFRlbXBsYXRlIHRlbXBsYXRlLAotICAgICAgICBJUGFnZVNvdXJjZSBwYWdlU291cmNlKQotICAgIHsKLSAgICAgICAgX3JlcXVlc3RDeWNsZSA9IHJlcXVlc3RDeWNsZTsKLSAgICAgICAgX3BhZ2VMb2FkZXIgPSBwYWdlTG9hZGVyOwotICAgICAgICBfbG9hZENvbXBvbmVudCA9IGxvYWRDb21wb25lbnQ7Ci0gICAgICAgIF90ZW1wbGF0ZSA9IHRlbXBsYXRlOwotICAgICAgICBfcGFnZVNvdXJjZSA9IHBhZ2VTb3VyY2U7Ci0KLSAgICAgICAgX3N0YWNrID0gbmV3IElDb21wb25lbnRbdGVtcGxhdGUuZ2V0VG9rZW5Db3VudCgpXTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzKCkKLSAgICB7Ci0gICAgICAgIGludCBjb3VudCA9IF90ZW1wbGF0ZS5nZXRUb2tlbkNvdW50KCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBUZW1wbGF0ZVRva2VuIHRva2VuID0gX3RlbXBsYXRlLmdldFRva2VuKGkpOwotCi0gICAgICAgICAgICBUb2tlblR5cGUgdHlwZSA9IHRva2VuLmdldFR5cGUoKTsKLQotICAgICAgICAgICAgaWYgKHR5cGUgPT0gVG9rZW5UeXBlLlRFWFQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHJvY2VzcygoVGV4dFRva2VuKSB0b2tlbik7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICh0eXBlID09IFRva2VuVHlwZS5PUEVOKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHByb2Nlc3MoKE9wZW5Ub2tlbikgdG9rZW4pOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAodHlwZSA9PSBUb2tlblR5cGUuQ0xPU0UpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHJvY2VzcygoQ2xvc2VUb2tlbikgdG9rZW4pOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAodHlwZSA9PSBUb2tlblR5cGUuTE9DQUxJWkFUSU9OKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHByb2Nlc3MoKExvY2FsaXphdGlvblRva2VuKSB0b2tlbik7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBUaGlzIGlzIGFsc28gcHJldHR5IG11Y2ggdW5yZWFjaGFibGUsIGFuZCB0aGUgbWVzc2FnZSBpcyBraW5kIG9mIG91dAotICAgICAgICAvLyBvZiBkYXRlLCB0b28uCi0KLSAgICAgICAgaWYgKF9zdGFja3ggIT0gMCkKLSAgICAgICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgVGFwZXN0cnkuZ2V0TWVzc2FnZSgiQmFzZUNvbXBvbmVudC51bmJhbGFuY2Utb3Blbi10YWdzIiksCi0gICAgICAgICAgICAgICAgX2xvYWRDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgICAgICBudWxsKTsKLQotICAgICAgICBjaGVja0FsbENvbXBvbmVudHNSZWZlcmVuY2VkKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEFkZHMgdGhlIHRva2VuICh3aGljaCBpbXBsZW1lbnRzIHtAbGluayBJUmVuZGVyfSkKLSAgICAgKiAgdG8gdGhlIGFjdGl2ZSBjb21wb25lbnQgKHVzaW5nIHtAbGluayBJQ29tcG9uZW50I2FkZEJvZHkoSVJlbmRlcil9KSwKLSAgICAgKiAgb3IgdG8gdGhpcyBjb21wb25lbnQge0BsaW5rIEJhc2VDb21wb25lbnQjYWRkT3V0ZXIoSVJlbmRlcil9LgotICAgICAqIAotICAgICAqICA8cD4KLSAgICAgKiAgQSBjaGVjayBpcyBtYWRlIHRoYXQgdGhlIGFjdGl2ZSBjb21wb25lbnQgYWxsb3dzIGEgYm9keS4KLSAgICAgKi8KLQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzKFRleHRUb2tlbiB0b2tlbikKLSAgICB7Ci0gICAgICAgIGlmIChfYWN0aXZlQ29tcG9uZW50ID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9sb2FkQ29tcG9uZW50LmFkZE91dGVyKHRva2VuKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghX2FjdGl2ZUNvbXBvbmVudC5nZXRTcGVjaWZpY2F0aW9uKCkuZ2V0QWxsb3dCb2R5KCkpCi0gICAgICAgICAgICB0aHJvdyBjcmVhdGVCb2R5bGVzc0NvbXBvbmVudEV4Y2VwdGlvbihfYWN0aXZlQ29tcG9uZW50KTsKLQotICAgICAgICBfYWN0aXZlQ29tcG9uZW50LmFkZEJvZHkodG9rZW4pOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzKE9wZW5Ub2tlbiB0b2tlbikKLSAgICB7Ci0gICAgICAgIFN0cmluZyBpZCA9IHRva2VuLmdldElkKCk7Ci0gICAgICAgIElDb21wb25lbnQgY29tcG9uZW50ID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIGNvbXBvbmVudFR5cGUgPSB0b2tlbi5nZXRDb21wb25lbnRUeXBlKCk7Ci0KLSAgICAgICAgaWYgKGNvbXBvbmVudFR5cGUgPT0gbnVsbCkKLSAgICAgICAgICAgIGNvbXBvbmVudCA9IGdldEVtYmVkZGVkQ29tcG9uZW50KGlkKTsKLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGVja0ZvckR1cGxpY2F0ZUlkKGlkLCB0b2tlbi5nZXRMb2NhdGlvbigpKTsKLQotICAgICAgICAgICAgY29tcG9uZW50ID0gY3JlYXRlSW1wbGljaXRDb21wb25lbnQoaWQsIGNvbXBvbmVudFR5cGUsIHRva2VuLmdldExvY2F0aW9uKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSB0ZW1wbGF0ZSBjb250YWlucyBlYWNoIGNvbXBvbmVudCBvbmx5IG9uY2UuCi0KLSAgICAgICAgaWYgKF9zZWVuSWRzLmNvbnRhaW5zKGlkKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgVGFwZXN0cnkuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAiQmFzZUNvbXBvbmVudC5tdWx0aXBsZS1jb21wb25lbnQtcmVmZXJlbmNlcyIsCi0gICAgICAgICAgICAgICAgICAgIF9sb2FkQ29tcG9uZW50LmdldEV4dGVuZGVkSWQoKSwKLSAgICAgICAgICAgICAgICAgICAgaWQpLAotICAgICAgICAgICAgICAgIF9sb2FkQ29tcG9uZW50LAotICAgICAgICAgICAgICAgIHRva2VuLmdldExvY2F0aW9uKCksCi0gICAgICAgICAgICAgICAgbnVsbCk7Ci0KLSAgICAgICAgX3NlZW5JZHMuYWRkKGlkKTsKLQotICAgICAgICBpZiAoX2FjdGl2ZUNvbXBvbmVudCA9PSBudWxsKQotICAgICAgICAgICAgX2xvYWRDb21wb25lbnQuYWRkT3V0ZXIoY29tcG9uZW50KTsKLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBOb3RlOiB0aGlzIGNvZGUgbWF5IG5vIGxvbmdlciBiZSByZWFjaGFibGUgKGJlY2F1c2UgdGhlCi0gICAgICAgICAgICAvLyB0ZW1wbGF0ZSBwYXJzZXIgZG9lcyB0aGlzIGNoZWNrIGZpcnN0KS4KLQotICAgICAgICAgICAgaWYgKCFfYWN0aXZlQ29tcG9uZW50LmdldFNwZWNpZmljYXRpb24oKS5nZXRBbGxvd0JvZHkoKSkKLSAgICAgICAgICAgICAgICB0aHJvdyBjcmVhdGVCb2R5bGVzc0NvbXBvbmVudEV4Y2VwdGlvbihfYWN0aXZlQ29tcG9uZW50KTsKLQotICAgICAgICAgICAgX2FjdGl2ZUNvbXBvbmVudC5hZGRCb2R5KGNvbXBvbmVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICBhZGRUZW1wbGF0ZUJpbmRpbmdzKGNvbXBvbmVudCwgdG9rZW4pOwotCi0gICAgICAgIF9zdGFja1tfc3RhY2t4KytdID0gX2FjdGl2ZUNvbXBvbmVudDsKLQotICAgICAgICBfYWN0aXZlQ29tcG9uZW50ID0gY29tcG9uZW50OwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjaGVja0ZvckR1cGxpY2F0ZUlkKFN0cmluZyBpZCwgSUxvY2F0aW9uIGxvY2F0aW9uKQotICAgIHsKLSAgICAgICAgaWYgKGlkID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgSUNvbnRhaW5lZENvbXBvbmVudCBjYyA9IF9sb2FkQ29tcG9uZW50LmdldFNwZWNpZmljYXRpb24oKS5nZXRDb21wb25lbnQoaWQpOwotCi0gICAgICAgIGlmIChjYyAhPSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICBUYXBlc3RyeS5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICJCYXNlQ29tcG9uZW50VGVtcGxhdGVMb2FkZXIuZHVwZS1jb21wb25lbnQtaWQiLAotICAgICAgICAgICAgICAgICAgICBpZCwKLSAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24sCi0gICAgICAgICAgICAgICAgICAgIGNjLmdldExvY2F0aW9uKCkpLAotICAgICAgICAgICAgICAgIF9sb2FkQ29tcG9uZW50LAotICAgICAgICAgICAgICAgIGxvY2F0aW9uLAotICAgICAgICAgICAgICAgIG51bGwpOwotICAgIH0KLQotICAgIHByaXZhdGUgSUNvbXBvbmVudCBjcmVhdGVJbXBsaWNpdENvbXBvbmVudChTdHJpbmcgaWQsIFN0cmluZyBjb21wb25lbnRUeXBlLCBJTG9jYXRpb24gbG9jYXRpb24pCi0gICAgewotICAgICAgICBJQ29tcG9uZW50IHJlc3VsdCA9Ci0gICAgICAgICAgICBfcGFnZUxvYWRlci5jcmVhdGVJbXBsaWNpdENvbXBvbmVudCgKLSAgICAgICAgICAgICAgICBfcmVxdWVzdEN5Y2xlLAotICAgICAgICAgICAgICAgIF9sb2FkQ29tcG9uZW50LAotICAgICAgICAgICAgICAgIGlkLAotICAgICAgICAgICAgICAgIGNvbXBvbmVudFR5cGUsCi0gICAgICAgICAgICAgICAgbG9jYXRpb24pOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBJQ29tcG9uZW50IGdldEVtYmVkZGVkQ29tcG9uZW50KFN0cmluZyBpZCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfbG9hZENvbXBvbmVudC5nZXRDb21wb25lbnQoaWQpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzKENsb3NlVG9rZW4gdG9rZW4pCi0gICAgewotICAgICAgICAvLyBBZ2FpbiwgdGhpcyBpcyBwcmV0dHkgbXVjaCBpbXBvc3NpYmxlIHRvIHJlYWNoIGJlY2F1c2UKLSAgICAgICAgLy8gdGhlIHRlbXBsYXRlIHBhcnNlciBkb2VzIGEgZ3JlYXQgam9iLgotCi0gICAgICAgIGlmIChfc3RhY2t4IDw9IDApCi0gICAgICAgICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIFRhcGVzdHJ5LmdldE1lc3NhZ2UoIkJhc2VDb21wb25lbnQudW5iYWxhbmNlZC1jbG9zZS10YWdzIiksCi0gICAgICAgICAgICAgICAgX2xvYWRDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgdG9rZW4uZ2V0TG9jYXRpb24oKSwKLSAgICAgICAgICAgICAgICBudWxsKTsKLQotICAgICAgICAvLyBOdWxsIGFuZCBmb3JnZXQgdGhlIHRvcCBlbGVtZW50IG9uIHRoZSBzdGFjay4KLQotICAgICAgICBfc3RhY2tbX3N0YWNreC0tXSA9IG51bGw7Ci0KLSAgICAgICAgX2FjdGl2ZUNvbXBvbmVudCA9IF9zdGFja1tfc3RhY2t4XTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2VzcyhMb2NhbGl6YXRpb25Ub2tlbiB0b2tlbikKLSAgICB7Ci0gICAgICAgIElSZW5kZXIgcmVuZGVyID0gbmV3IExvY2FsaXplZFN0cmluZ1JlbmRlcihfbG9hZENvbXBvbmVudCwgdG9rZW4pOwotCi0gICAgICAgIGlmIChfYWN0aXZlQ29tcG9uZW50ID09IG51bGwpCi0gICAgICAgICAgICBfbG9hZENvbXBvbmVudC5hZGRPdXRlcihyZW5kZXIpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBfYWN0aXZlQ29tcG9uZW50LmFkZEJvZHkocmVuZGVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgQWRkcyBiaW5kaW5ncyBiYXNlZCBvbiBhdHRyaWJ1dGVzIGluIHRoZSB0ZW1wbGF0ZS4KLSAgICAgKi8KLQotICAgIHByaXZhdGUgdm9pZCBhZGRUZW1wbGF0ZUJpbmRpbmdzKElDb21wb25lbnQgY29tcG9uZW50LCBPcGVuVG9rZW4gdG9rZW4pCi0gICAgewotICAgICAgICBJQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBzcGVjID0gY29tcG9uZW50LmdldFNwZWNpZmljYXRpb24oKTsKLQotICAgICAgICBNYXAgYXR0cmlidXRlcyA9IHRva2VuLmdldEF0dHJpYnV0ZXNNYXAoKTsKLQotICAgICAgICBpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBJdGVyYXRvciBpID0gYXR0cmlidXRlcy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0KLSAgICAgICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpLm5leHQoKTsKLQotICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZykgZW50cnkuZ2V0S2V5KCk7Ci0gICAgICAgICAgICAgICAgVGVtcGxhdGVBdHRyaWJ1dGUgYXR0cmlidXRlID0gKFRlbXBsYXRlQXR0cmlidXRlKSBlbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIEF0dHJpYnV0ZVR5cGUgdHlwZSA9IGF0dHJpYnV0ZS5nZXRUeXBlKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBBdHRyaWJ1dGVUeXBlLk9HTkxfRVhQUkVTU0lPTikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZEV4cHJlc3Npb25CaW5kaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgc3BlYywKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUuZ2V0VmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuLmdldExvY2F0aW9uKCkpOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBBdHRyaWJ1dGVUeXBlLkxPQ0FMSVpBVElPTl9LRVkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBhZGRTdHJpbmdCaW5kaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgc3BlYywKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUuZ2V0VmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuLmdldExvY2F0aW9uKCkpOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBBdHRyaWJ1dGVUeXBlLkxJVEVSQUwpCi0gICAgICAgICAgICAgICAgICAgIGFkZFN0YXRpY0JpbmRpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBzcGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZS5nZXRWYWx1ZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4uZ2V0TG9jYXRpb24oKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBpZiB0aGUgY29tcG9uZW50IGRlZmluZXMgYSB0ZW1wbGF0ZVRhZyBwYXJhbWV0ZXIgYW5kIAotICAgICAgICAvLyB0aGVyZSBpcyBubyBlc3RhYmxpc2hlZCBiaW5kaW5nIGZvciB0aGF0IHBhcmFtZXRlciwgCi0gICAgICAgIC8vIGFkZCBhIHN0YXRpYyBiaW5kaW5nIGNhcnJ5aW5nIHRoZSB0ZW1wbGF0ZSB0YWcgIAotICAgICAgICBpZiAoc3BlYy5nZXRQYXJhbWV0ZXIoSVRlbXBsYXRlU291cmNlLlRFTVBMQVRFX1RBR19QQVJBTUVURVJfTkFNRSkgIT0gbnVsbAotICAgICAgICAgICAgJiYgY29tcG9uZW50LmdldEJpbmRpbmcoSVRlbXBsYXRlU291cmNlLlRFTVBMQVRFX1RBR19QQVJBTUVURVJfTkFNRSkgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgYWRkU3RhdGljQmluZGluZygKLSAgICAgICAgICAgICAgICBjb21wb25lbnQsCi0gICAgICAgICAgICAgICAgc3BlYywKLSAgICAgICAgICAgICAgICBJVGVtcGxhdGVTb3VyY2UuVEVNUExBVEVfVEFHX1BBUkFNRVRFUl9OQU1FLAotICAgICAgICAgICAgICAgIHRva2VuLmdldFRhZygpLAotICAgICAgICAgICAgICAgIHRva2VuLmdldExvY2F0aW9uKCkpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgQWRkcyBhbiBleHByZXNzaW9uIGJpbmRpbmcsIGNoZWNraW5nIGZvciBlcnJvcnMgcmVsYXRlZAotICAgICAqICB0byByZXNlcnZlZCBhbmQgaW5mb3JtYWwgcGFyYW1ldGVycy4KLSAgICAgKgotICAgICAqICA8cD5JdCBpcyBhbiBlcnJvciB0byBzcGVjaWZ5IGV4cHJlc3Npb24gCi0gICAgICogIGJpbmRpbmdzIGluIGJvdGggdGhlIHNwZWNpZmljYXRpb24KLSAgICAgKiAgYW5kIHRoZSB0ZW1wbGF0ZS4KLSAgICAgKi8KLQotICAgIHByaXZhdGUgdm9pZCBhZGRFeHByZXNzaW9uQmluZGluZygKLSAgICAgICAgSUNvbXBvbmVudCBjb21wb25lbnQsCi0gICAgICAgIElDb21wb25lbnRTcGVjaWZpY2F0aW9uIHNwZWMsCi0gICAgICAgIFN0cmluZyBuYW1lLAotICAgICAgICBTdHJpbmcgZXhwcmVzc2lvbiwKLSAgICAgICAgSUxvY2F0aW9uIGxvY2F0aW9uKQotICAgIHsKLQotICAgICAgICAvLyBJZiBtYXRjaGVzIGEgZm9ybWFsIHBhcmFtZXRlciBuYW1lLCBhbGxvdyBpdCB0byBiZSBzZXQKLSAgICAgICAgLy8gdW5sZXNzIHRoZXJlJ3MgYWxyZWFkeSBhIGJpbmRpbmcuCi0KLSAgICAgICAgYm9vbGVhbiBpc0Zvcm1hbCA9IChzcGVjLmdldFBhcmFtZXRlcihuYW1lKSAhPSBudWxsKTsKLQotICAgICAgICBpZiAoaXNGb3JtYWwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChjb21wb25lbnQuZ2V0QmluZGluZyhuYW1lKSAhPSBudWxsKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIFRhcGVzdHJ5LmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJCYXNlQ29tcG9uZW50LmR1cGUtdGVtcGxhdGUtZXhwcmVzc2lvbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LmdldEV4dGVuZGVkSWQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIF9sb2FkQ29tcG9uZW50LmdldEV4dGVuZGVkSWQoKSksCi0gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24sCi0gICAgICAgICAgICAgICAgICAgIG51bGwpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFzcGVjLmdldEFsbG93SW5mb3JtYWxQYXJhbWV0ZXJzKCkpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgVGFwZXN0cnkuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAgICAgIkJhc2VDb21wb25lbnQudGVtcGxhdGUtZXhwcmVzc2lvbi1mb3ItaW5mb3JtYWwtcGFyYW1ldGVyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuZ2V0RXh0ZW5kZWRJZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgX2xvYWRDb21wb25lbnQuZ2V0RXh0ZW5kZWRJZCgpKSwKLSAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgbnVsbCk7Ci0KLSAgICAgICAgICAgIC8vIElmIHRoZSBuYW1lIGlzIHJlc2VydmVkIChtYXRjaGVzIGEgZm9ybWFsIHBhcmFtZXRlcgotICAgICAgICAgICAgLy8gb3IgcmVzZXJ2ZWQgbmFtZSwgY2FzZWxlc3NseSksIHRoZW4gc2tpcCBpdC4KLQotICAgICAgICAgICAgaWYgKHNwZWMuaXNSZXNlcnZlZFBhcmFtZXRlck5hbWUobmFtZSkpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgVGFwZXN0cnkuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAgICAgIkJhc2VDb21wb25lbnQudGVtcGxhdGUtZXhwcmVzc2lvbi1mb3ItcmVzZXJ2ZWQtcGFyYW1ldGVyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuZ2V0RXh0ZW5kZWRJZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgX2xvYWRDb21wb25lbnQuZ2V0RXh0ZW5kZWRJZCgpKSwKLSAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgbnVsbCk7Ci0gICAgICAgIH0KLQotICAgICAgICBJQmluZGluZyBiaW5kaW5nID0KLSAgICAgICAgICAgIG5ldyBFeHByZXNzaW9uQmluZGluZygKLSAgICAgICAgICAgICAgICBfcGFnZVNvdXJjZS5nZXRSZXNvdXJjZVJlc29sdmVyKCksCi0gICAgICAgICAgICAgICAgX2xvYWRDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgZXhwcmVzc2lvbiwKLSAgICAgICAgICAgICAgICBsb2NhdGlvbik7Ci0KLSAgICAgICAgY29tcG9uZW50LnNldEJpbmRpbmcobmFtZSwgYmluZGluZyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICAqICBBZGRzIGFuIGV4cHJlc3Npb24gYmluZGluZywgY2hlY2tpbmcgZm9yIGVycm9ycyByZWxhdGVkCi0gICAgICAqICB0byByZXNlcnZlZCBhbmQgaW5mb3JtYWwgcGFyYW1ldGVycy4KLSAgICAgICoKLSAgICAgICogIDxwPkl0IGlzIGFuIGVycm9yIHRvIHNwZWNpZnkgZXhwcmVzc2lvbiAKLSAgICAgICogIGJpbmRpbmdzIGluIGJvdGggdGhlIHNwZWNpZmljYXRpb24KLSAgICAgICogIGFuZCB0aGUgdGVtcGxhdGUuCi0gICAgICAqLwotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFN0cmluZ0JpbmRpbmcoCi0gICAgICAgIElDb21wb25lbnQgY29tcG9uZW50LAotICAgICAgICBJQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBzcGVjLAotICAgICAgICBTdHJpbmcgbmFtZSwKLSAgICAgICAgU3RyaW5nIGxvY2FsaXphdGlvbktleSwKLSAgICAgICAgSUxvY2F0aW9uIGxvY2F0aW9uKQotICAgIHsKLSAgICAgICAgLy8gSWYgbWF0Y2hlcyBhIGZvcm1hbCBwYXJhbWV0ZXIgbmFtZSwgYWxsb3cgaXQgdG8gYmUgc2V0Ci0gICAgICAgIC8vIHVubGVzcyB0aGVyZSdzIGFscmVhZHkgYSBiaW5kaW5nLgotCi0gICAgICAgIGJvb2xlYW4gaXNGb3JtYWwgPSAoc3BlYy5nZXRQYXJhbWV0ZXIobmFtZSkgIT0gbnVsbCk7Ci0KLSAgICAgICAgaWYgKGlzRm9ybWFsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoY29tcG9uZW50LmdldEJpbmRpbmcobmFtZSkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICBUYXBlc3RyeS5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAiQmFzZUNvbXBvbmVudC5kdXBlLXN0cmluZyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LmdldEV4dGVuZGVkSWQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIF9sb2FkQ29tcG9uZW50LmdldEV4dGVuZGVkSWQoKSksCi0gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24sCi0gICAgICAgICAgICAgICAgICAgIG51bGwpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFzcGVjLmdldEFsbG93SW5mb3JtYWxQYXJhbWV0ZXJzKCkpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgVGFwZXN0cnkuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAgICAgIkJhc2VDb21wb25lbnQudGVtcGxhdGUtZXhwcmVzc2lvbi1mb3ItaW5mb3JtYWwtcGFyYW1ldGVyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuZ2V0RXh0ZW5kZWRJZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgX2xvYWRDb21wb25lbnQuZ2V0RXh0ZW5kZWRJZCgpKSwKLSAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgbnVsbCk7Ci0KLSAgICAgICAgICAgIC8vIElmIHRoZSBuYW1lIGlzIHJlc2VydmVkIChtYXRjaGVzIGEgZm9ybWFsIHBhcmFtZXRlcgotICAgICAgICAgICAgLy8gb3IgcmVzZXJ2ZWQgbmFtZSwgY2FzZWxlc3NseSksIHRoZW4gc2tpcCBpdC4KLQotICAgICAgICAgICAgaWYgKHNwZWMuaXNSZXNlcnZlZFBhcmFtZXRlck5hbWUobmFtZSkpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgVGFwZXN0cnkuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAgICAgIkJhc2VDb21wb25lbnQudGVtcGxhdGUtZXhwcmVzc2lvbi1mb3ItcmVzZXJ2ZWQtcGFyYW1ldGVyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuZ2V0RXh0ZW5kZWRJZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgX2xvYWRDb21wb25lbnQuZ2V0RXh0ZW5kZWRJZCgpKSwKLSAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgbnVsbCk7Ci0gICAgICAgIH0KLQotICAgICAgICBJQmluZGluZyBiaW5kaW5nID0gbmV3IFN0cmluZ0JpbmRpbmcoX2xvYWRDb21wb25lbnQsIGxvY2FsaXphdGlvbktleSwgbG9jYXRpb24pOwotCi0gICAgICAgIGNvbXBvbmVudC5zZXRCaW5kaW5nKG5hbWUsIGJpbmRpbmcpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBBZGRzIGEgc3RhdGljIGJpbmRpbmcsIGNoZWNraW5nIGZvciBlcnJvcnMgcmVsYXRlZAotICAgICAqICB0byByZXNlcnZlZCBhbmQgaW5mb3JtYWwgcGFyYW1ldGVycy4KLSAgICAgKiAKLSAgICAgKiAgPHA+Ci0gICAgICogIFN0YXRpYyBiaW5kaW5ncyB0aGF0IGNvbmZsaWN0IHdpdGggYmluZGluZ3MgaW4gdGhlCi0gICAgICogIHNwZWNpZmljYXRpb24gYXJlIHF1aWV0bHkgaWdub3JlZC4KLSAgICAgKi8KLQotICAgIHByaXZhdGUgdm9pZCBhZGRTdGF0aWNCaW5kaW5nKAotICAgICAgICBJQ29tcG9uZW50IGNvbXBvbmVudCwKLSAgICAgICAgSUNvbXBvbmVudFNwZWNpZmljYXRpb24gc3BlYywKLSAgICAgICAgU3RyaW5nIG5hbWUsCi0gICAgICAgIFN0cmluZyBzdGF0aWNWYWx1ZSwKLSAgICAgICAgSUxvY2F0aW9uIGxvY2F0aW9uKQotICAgIHsKLQotICAgICAgICBpZiAoY29tcG9uZW50LmdldEJpbmRpbmcobmFtZSkgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAvLyBJZiBtYXRjaGVzIGEgZm9ybWFsIHBhcmFtZXRlciBuYW1lLCBhbGxvdyBpdCB0byBiZSBzZXQKLSAgICAgICAgLy8gdW5sZXNzIHRoZXJlJ3MgYWxyZWFkeSBhIGJpbmRpbmcuCi0KLSAgICAgICAgYm9vbGVhbiBpc0Zvcm1hbCA9IChzcGVjLmdldFBhcmFtZXRlcihuYW1lKSAhPSBudWxsKTsKLQotICAgICAgICBpZiAoIWlzRm9ybWFsKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBTa2lwIGluZm9ybWFsIHBhcmFtZXRlcnMgaWYgdGhlIGNvbXBvbmVudCBkb2Vzbid0IGFsbG93IHRoZW0uCi0KLSAgICAgICAgICAgIGlmICghc3BlYy5nZXRBbGxvd0luZm9ybWFsUGFyYW1ldGVycygpKQotICAgICAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAgICAgLy8gSWYgdGhlIG5hbWUgaXMgcmVzZXJ2ZWQgKG1hdGNoZXMgYSBmb3JtYWwgcGFyYW1ldGVyCi0gICAgICAgICAgICAvLyBvciByZXNlcnZlZCBuYW1lLCBjYXNlbGVzc2x5KSwgdGhlbiBza2lwIGl0LgotCi0gICAgICAgICAgICBpZiAoc3BlYy5pc1Jlc2VydmVkUGFyYW1ldGVyTmFtZShuYW1lKSkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBJQmluZGluZyBiaW5kaW5nID0gbmV3IFN0YXRpY0JpbmRpbmcoc3RhdGljVmFsdWUsIGxvY2F0aW9uKTsKLQotICAgICAgICBjb21wb25lbnQuc2V0QmluZGluZyhuYW1lLCBiaW5kaW5nKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tBbGxDb21wb25lbnRzUmVmZXJlbmNlZCgpCi0gICAgewotICAgICAgICAvLyBGaXJzdCwgY29udHJ1Y3QgYSBtb2RpZmlhYmxlIGNvcHkgb2YgdGhlIGlkcyBvZiBhbGwgZXhwZWN0ZWQgY29tcG9uZW50cwotICAgICAgICAvLyAodGhhdCBpcywgY29tcG9uZW50cyBkZWNsYXJlZCBpbiB0aGUgc3BlY2lmaWNhdGlvbikuCi0KLSAgICAgICAgTWFwIGNvbXBvbmVudHMgPSBfbG9hZENvbXBvbmVudC5nZXRDb21wb25lbnRzKCk7Ci0KLSAgICAgICAgU2V0IGlkcyA9IGNvbXBvbmVudHMua2V5U2V0KCk7Ci0KLSAgICAgICAgLy8gSWYgdGhlIHNlZW4gaWRzIC4uLiBpZHMgcmVmZXJlbmNlZCBpbiB0aGUgdGVtcGxhdGUsIG1hdGNoZXMKLSAgICAgICAgLy8gYWxsIHRoZSBpZHMgaW4gdGhlIHNwZWNpZmljYXRpb24gdGhlbiB3ZSdyZSBmaW5lLgotCi0gICAgICAgIGlmIChfc2Vlbklkcy5jb250YWluc0FsbChpZHMpKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIC8vIENyZWF0ZSBhIG1vZGlmaWFibGUgY29weS4gIFJlbW92ZSB0aGUgaWRzIHRoYXQgYXJlIHJlZmVyZW5jZWQgaW4KLSAgICAgICAgLy8gdGhlIHRlbXBsYXRlLiAgVGhlIHJlbWFpbmRlciBhcmUgd29ydGh5IG9mIG5vdGUuCi0KLSAgICAgICAgaWRzID0gbmV3IEhhc2hTZXQoaWRzKTsKLSAgICAgICAgaWRzLnJlbW92ZUFsbChfc2Vlbklkcyk7Ci0KLSAgICAgICAgaW50IGNvdW50ID0gaWRzLnNpemUoKTsKLQotICAgICAgICBTdHJpbmcga2V5ID0KLSAgICAgICAgICAgIChjb3VudCA9PSAxKQotICAgICAgICAgICAgICAgID8gIkJhc2VDb21wb25lbnQubWlzc2luZy1jb21wb25lbnQtc3BlYy1zaW5nbGUiCi0gICAgICAgICAgICAgICAgOiAiQmFzZUNvbXBvbmVudC5taXNzaW5nLWNvbXBvbmVudC1zcGVjLW11bHRpIjsKLQotICAgICAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0KLSAgICAgICAgICAgIG5ldyBTdHJpbmdCdWZmZXIoVGFwZXN0cnkuZm9ybWF0KGtleSwgX2xvYWRDb21wb25lbnQuZ2V0RXh0ZW5kZWRJZCgpKSk7Ci0KLSAgICAgICAgSXRlcmF0b3IgaSA9IGlkcy5pdGVyYXRvcigpOwotICAgICAgICBpbnQgaiA9IDE7Ci0KLSAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoaiA9PSAxKQotICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoJyAnKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBpZiAoaiA9PSBjb3VudCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoJyAnKTsKLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChUYXBlc3RyeS5nZXRNZXNzYWdlKCJCYXNlQ29tcG9uZW50LmFuZCIpKTsKLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgnICcpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIiwgIik7Ci0KLSAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoaS5uZXh0KCkpOwotCi0gICAgICAgICAgICBqKys7Ci0gICAgICAgIH0KLQotICAgICAgICBidWZmZXIuYXBwZW5kKCcuJyk7Ci0KLSAgICAgICAgTE9HLmVycm9yKGJ1ZmZlci50b1N0cmluZygpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uIGNyZWF0ZUJvZHlsZXNzQ29tcG9uZW50RXhjZXB0aW9uKElDb21wb25lbnQgY29tcG9uZW50KQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICBUYXBlc3RyeS5nZXRNZXNzYWdlKCJCYXNlQ29tcG9uZW50VGVtcGxhdGVMb2FkZXIuYm9keWxlc3MtY29tcG9uZW50IiksCi0gICAgICAgICAgICBjb21wb25lbnQsCi0gICAgICAgICAgICBudWxsLAotICAgICAgICAgICAgbnVsbCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L0JpbmRpbmdFeGNlcHRpb24uamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9CaW5kaW5nRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5NGIyNzQuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L0JpbmRpbmdFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5OwotCi0vKioKLSAqICBBIGdlbmVyYWwgZXhjZXB0aW9uIGRlc2NyaWJpbmcgYW4ge0BsaW5rIElCaW5kaW5nfQotICogIGFuZCBhbiB7QGxpbmsgSUNvbXBvbmVudH0uCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKgotICoqLwotCi1wdWJsaWMgY2xhc3MgQmluZGluZ0V4Y2VwdGlvbiBleHRlbmRzIEFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbgotewotICAgIHByaXZhdGUgdHJhbnNpZW50IElCaW5kaW5nIF9iaW5kaW5nOwotCi0gICAgcHVibGljIEJpbmRpbmdFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIElCaW5kaW5nIGJpbmRpbmcpCi0gICAgewotICAgICAgICB0aGlzKG1lc3NhZ2UsIGJpbmRpbmcsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBCaW5kaW5nRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBJQmluZGluZyBiaW5kaW5nLCBUaHJvd2FibGUgcm9vdENhdXNlKQotICAgIHsKLSAgICAgICAgdGhpcyhtZXNzYWdlLCBudWxsLCBudWxsLCBiaW5kaW5nLCByb290Q2F1c2UpOwotICAgIH0KLQotCi0gICAgcHVibGljIEJpbmRpbmdFeGNlcHRpb24oCi0gICAgICAgIFN0cmluZyBtZXNzYWdlLAotICAgICAgICBPYmplY3QgY29tcG9uZW50LAotICAgICAgICBJTG9jYXRpb24gbG9jYXRpb24sCi0gICAgICAgIElCaW5kaW5nIGJpbmRpbmcsCi0gICAgICAgIFRocm93YWJsZSByb290Q2F1c2UpCi0gICAgewotICAgICAgICBzdXBlcigKLSAgICAgICAgICAgIG1lc3NhZ2UsCi0gICAgICAgICAgICBjb21wb25lbnQsCi0gICAgICAgICAgICBUYXBlc3RyeS5maW5kTG9jYXRpb24obmV3IE9iamVjdFtdIHsgbG9jYXRpb24sIGJpbmRpbmcsIGNvbXBvbmVudCB9KSwKLSAgICAgICAgICAgIHJvb3RDYXVzZSk7Ci0KLSAgICAgICAgX2JpbmRpbmcgPSBiaW5kaW5nOwotICAgIH0KLQotICAgIHB1YmxpYyBJQmluZGluZyBnZXRCaW5kaW5nKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfYmluZGluZzsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L0NvbmZpZ3VyYXRpb25EZWZhdWx0cy5wcm9wZXJ0aWVzIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L0NvbmZpZ3VyYXRpb25EZWZhdWx0cy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDUxYTU1Li4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9Db25maWd1cmF0aW9uRGVmYXVsdHMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotIyAkSWQkCi0KLW9yZy5hcGFjaGUudGFwZXN0cnkuZGVmYXVsdC1zY3JpcHQtbGFuZ3VhZ2U9anl0aG9uCi1vcmcuYXBhY2hlLnRhcGVzdHJ5LnZpc2l0LWNsYXNzPWphdmEudXRpbC5IYXNoTWFwClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L0ZyYW1ld29yay5saWJyYXJ5IGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L0ZyYW1ld29yay5saWJyYXJ5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOGY0ZDExLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9GcmFtZXdvcmsubGlicmFyeQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gIAotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTwhLS0gJElkJCAtLT4KLTwhRE9DVFlQRSBsaWJyYXJ5LXNwZWNpZmljYXRpb24gUFVCTElDIAotICAiLS8vQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24vL1RhcGVzdHJ5IFNwZWNpZmljYXRpb24gMy4wLy9FTiIgCi0gICJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL3RhcGVzdHJ5L2R0ZC9UYXBlc3RyeV8zXzAuZHRkIj4KLQkKLTwhLS0KLSAKLSAgIFRoaXMgaXMgYSBraW5kIG9mICJib29zdHJhcCIgbGlicmFyeTsgd2hlbiBhbiB1bmFkb3JuZWQgcGFnZSBuYW1lIG9yIGFsaWFzIChhIG5hbWUgb3IKLSAgIGFsaWFzIHdpdGhvdXQgYSBuYW1lc3BhY2UgcHJlZml4KSBjYW5ub3QgYmUgbG9jYXRlZCBpbiB0aGUgYXBwcm9wcmlhdGUgYXBwbGljYXRpb24gb3IKLSAgIGxpYnJhcnkgc3BlY2lmaWNhdGlvbiwgdGhlIGZyYW1ld29yayBzcGVjaWZpY2F0aW9uIGlzIGNoZWNrZWQuICBUaGlzIGFsbG93cwotICAgdGhlIGFwcGxpY2F0aW9uIG9yIGxpYnJhcnkgdG8gb3ZlcnJpZGUgZnJhbWV3b3JrJ3MgdmVyc2lvbnMgb2YgYSBjb21wb25lbnQuCi0gICAKLS0tPgotCi08bGlicmFyeS1zcGVjaWZpY2F0aW9uPgotCi0gICAgPGNvbXBvbmVudC10eXBlIHR5cGU9IkFjdGlvbkxpbmsiIHNwZWNpZmljYXRpb24tcGF0aD0ibGluay9BY3Rpb25MaW5rLmp3YyIvPgotICAgIDxjb21wb25lbnQtdHlwZSB0eXBlPSJBbnkiIHNwZWNpZmljYXRpb24tcGF0aD0iY29tcG9uZW50cy9BbnkuandjIi8+Ci0gICAgPGNvbXBvbmVudC10eXBlIHR5cGU9IkJsb2NrIiBzcGVjaWZpY2F0aW9uLXBhdGg9ImNvbXBvbmVudHMvQmxvY2suandjIi8+Ci0gICAgPGNvbXBvbmVudC10eXBlIHR5cGU9IkJvZHkiIHNwZWNpZmljYXRpb24tcGF0aD0iaHRtbC9Cb2R5Lmp3YyIvPgotICAgIDxjb21wb25lbnQtdHlwZSB0eXBlPSJCdXR0b24iIHNwZWNpZmljYXRpb24tcGF0aD0iZm9ybS9CdXR0b24uandjIi8+Ci0gICAgPGNvbXBvbmVudC10eXBlIHR5cGU9IkNoZWNrYm94IiBzcGVjaWZpY2F0aW9uLXBhdGg9ImZvcm0vQ2hlY2tib3guandjIi8+Ci0gICAgPGNvbXBvbmVudC10eXBlIHR5cGU9IkNvbmRpdGlvbmFsIiBzcGVjaWZpY2F0aW9uLXBhdGg9ImNvbXBvbmVudHMvQ29uZGl0aW9uYWwuandjIi8+Ci0gICAgPGNvbXBvbmVudC10eXBlIHR5cGU9IkRhdGVQaWNrZXIiIHNwZWNpZmljYXRpb24tcGF0aD0iZm9ybS9EYXRlUGlja2VyLmp3YyIvPgotICAgIDxjb21wb25lbnQtdHlwZSB0eXBlPSJEZWxlZ2F0b3IiIHNwZWNpZmljYXRpb24tcGF0aD0iY29tcG9uZW50cy9EZWxlZ2F0b3IuandjIi8+Ci0gICAgPGNvbXBvbmVudC10eXBlIHR5cGU9IkRpcmVjdExpbmsiIHNwZWNpZmljYXRpb24tcGF0aD0ibGluay9EaXJlY3RMaW5rLmp3YyIvPgotICAgIDxjb21wb25lbnQtdHlwZSB0eXBlPSJFeHRlcm5hbExpbmsiIHNwZWNpZmljYXRpb24tcGF0aD0ibGluay9FeHRlcm5hbExpbmsuandjIi8+Ci0gICAgPGNvbXBvbmVudC10eXBlIHR5cGU9IkZpZWxkTGFiZWwiIHNwZWNpZmljYXRpb24tcGF0aD0idmFsaWQvRmllbGRMYWJlbC5qd2MiLz4KLSAgICA8Y29tcG9uZW50LXR5cGUgdHlwZT0iRm9yZWFjaCIgc3BlY2lmaWNhdGlvbi1wYXRoPSJjb21wb25lbnRzL0ZvcmVhY2guandjIi8+Ci0gICAgPGNvbXBvbmVudC10eXBlIHR5cGU9IkZyYW1lIiBzcGVjaWZpY2F0aW9uLXBhdGg9Imh0bWwvRnJhbWUuandjIi8+Ci0gICAgPGNvbXBvbmVudC10eXBlIHR5cGU9IkV4Y2VwdGlvbkRpc3BsYXkiIHNwZWNpZmljYXRpb24tcGF0aD0iaHRtbC9FeGNlcHRpb25EaXNwbGF5Lmp3YyIvPgotICAgIDxjb21wb25lbnQtdHlwZSB0eXBlPSJGb3JtIiBzcGVjaWZpY2F0aW9uLXBhdGg9ImZvcm0vRm9ybS5qd2MiLz4KLSAgICA8Y29tcG9uZW50LXR5cGUgdHlwZT0iR2VuZXJpY0xpbmsiIHNwZWNpZmljYXRpb24tcGF0aD0ibGluay9HZW5lcmljTGluay5qd2MiLz4KLSAgICA8Y29tcG9uZW50LXR5cGUgdHlwZT0iSGlkZGVuIiBzcGVjaWZpY2F0aW9uLXBhdGg9ImZvcm0vSGlkZGVuLmp3YyIvPgotICAgIDxjb21wb25lbnQtdHlwZSB0eXBlPSJJbWFnZSIgc3BlY2lmaWNhdGlvbi1wYXRoPSJodG1sL0ltYWdlLmp3YyIvPgotICAgIDxjb21wb25lbnQtdHlwZSB0eXBlPSJJbWFnZVN1Ym1pdCIgc3BlY2lmaWNhdGlvbi1wYXRoPSJmb3JtL0ltYWdlU3VibWl0Lmp3YyIvPgotCTxjb21wb25lbnQtdHlwZSB0eXBlPSJJbnNlcnQiIHNwZWNpZmljYXRpb24tcGF0aD0iY29tcG9uZW50cy9JbnNlcnQuandjIi8+Ci0gICAgPGNvbXBvbmVudC10eXBlIHR5cGU9Ikluc2VydFRleHQiIHNwZWNpZmljYXRpb24tcGF0aD0iaHRtbC9JbnNlcnRUZXh0Lmp3YyIvPgotICAgIDxjb21wb25lbnQtdHlwZSB0eXBlPSJMaW5rU3VibWl0IiBzcGVjaWZpY2F0aW9uLXBhdGg9ImZvcm0vTGlua1N1Ym1pdC5qd2MiLz4KLSAgICA8Y29tcG9uZW50LXR5cGUgdHlwZT0iTGlzdEVkaXQiIHNwZWNpZmljYXRpb24tcGF0aD0iZm9ybS9MaXN0RWRpdC5qd2MiLz4KLSAgICA8Y29tcG9uZW50LXR5cGUgdHlwZT0iT3B0aW9uIiBzcGVjaWZpY2F0aW9uLXBhdGg9ImZvcm0vT3B0aW9uLmp3YyIvPgotICAgIDxjb21wb25lbnQtdHlwZSB0eXBlPSJQYWdlTGluayIgc3BlY2lmaWNhdGlvbi1wYXRoPSJsaW5rL1BhZ2VMaW5rLmp3YyIvPgotICAgIDxjb21wb25lbnQtdHlwZSB0eXBlPSJQcm9wZXJ0eVNlbGVjdGlvbiIgc3BlY2lmaWNhdGlvbi1wYXRoPSJmb3JtL1Byb3BlcnR5U2VsZWN0aW9uLmp3YyIvPgotICAgIDxjb21wb25lbnQtdHlwZSB0eXBlPSJSYWRpbyIgc3BlY2lmaWNhdGlvbi1wYXRoPSJmb3JtL1JhZGlvLmp3YyIvPgotICAgIDxjb21wb25lbnQtdHlwZSB0eXBlPSJSYWRpb0dyb3VwIiBzcGVjaWZpY2F0aW9uLXBhdGg9ImZvcm0vUmFkaW9Hcm91cC5qd2MiLz4KLSAgICA8Y29tcG9uZW50LXR5cGUgdHlwZT0iUmVuZGVyQmxvY2siIHNwZWNpZmljYXRpb24tcGF0aD0iY29tcG9uZW50cy9SZW5kZXJCbG9jay5qd2MiLz4KLSAgICA8Y29tcG9uZW50LXR5cGUgdHlwZT0iUmVuZGVyQm9keSIgc3BlY2lmaWNhdGlvbi1wYXRoPSJjb21wb25lbnRzL1JlbmRlckJvZHkuandjIi8+Ci0gICAgPGNvbXBvbmVudC10eXBlIHR5cGU9IlJvbGxvdmVyIiBzcGVjaWZpY2F0aW9uLXBhdGg9Imh0bWwvUm9sbG92ZXIuandjIi8+Ci0gICAgPGNvbXBvbmVudC10eXBlIHR5cGU9IlNlbGVjdCIgc3BlY2lmaWNhdGlvbi1wYXRoPSJmb3JtL1NlbGVjdC5qd2MiLz4KLSAgICA8Y29tcG9uZW50LXR5cGUgdHlwZT0iU2VydmljZUxpbmsiIHNwZWNpZmljYXRpb24tcGF0aD0ibGluay9TZXJ2aWNlTGluay5qd2MiLz4KLSAgICA8Y29tcG9uZW50LXR5cGUgdHlwZT0iU2NyaXB0IiBzcGVjaWZpY2F0aW9uLXBhdGg9Imh0bWwvU2NyaXB0Lmp3YyIvPgotICAgIDxjb21wb25lbnQtdHlwZSB0eXBlPSJTaGVsbCIgc3BlY2lmaWNhdGlvbi1wYXRoPSJodG1sL1NoZWxsLmp3YyIvPgotICAgIDxjb21wb25lbnQtdHlwZSB0eXBlPSJTdWJtaXQiIHNwZWNpZmljYXRpb24tcGF0aD0iZm9ybS9TdWJtaXQuandjIi8+Ci0gICAgPGNvbXBvbmVudC10eXBlIHR5cGU9IlRleHRBcmVhIiBzcGVjaWZpY2F0aW9uLXBhdGg9ImZvcm0vVGV4dEFyZWEuandjIi8+Ci0gICAgPGNvbXBvbmVudC10eXBlIHR5cGU9IlRleHRGaWVsZCIgc3BlY2lmaWNhdGlvbi1wYXRoPSJmb3JtL1RleHRGaWVsZC5qd2MiLz4KLSAgICA8Y29tcG9uZW50LXR5cGUgdHlwZT0iVXBsb2FkIiBzcGVjaWZpY2F0aW9uLXBhdGg9ImZvcm0vVXBsb2FkLmp3YyIvPgotICAgIDxjb21wb25lbnQtdHlwZSB0eXBlPSJWYWxpZEZpZWxkIiBzcGVjaWZpY2F0aW9uLXBhdGg9InZhbGlkL1ZhbGlkRmllbGQuandjIi8+Ci0gICAgICAgICAgCi0gICAgPHBhZ2UgbmFtZT0iU3RhbGVMaW5rIiBzcGVjaWZpY2F0aW9uLXBhdGg9InBhZ2VzL1N0YWxlTGluay5wYWdlIi8+Ci0gICAgPHBhZ2UgbmFtZT0iU3RhbGVTZXNzaW9uIiBzcGVjaWZpY2F0aW9uLXBhdGg9InBhZ2VzL1N0YWxlU2Vzc2lvbi5wYWdlIi8+Ci0gICAgPHBhZ2UgbmFtZT0iRXhjZXB0aW9uIiBzcGVjaWZpY2F0aW9uLXBhdGg9InBhZ2VzL0V4Y2VwdGlvbi5wYWdlIi8+Ci0gICAKLSAgICA8cGFnZSBuYW1lPSJXTUxFeGNlcHRpb24iIHNwZWNpZmljYXRpb24tcGF0aD0id21sL3BhZ2VzL1dNTEV4Y2VwdGlvbi5wYWdlIi8+Ci0gICAgPHBhZ2UgbmFtZT0iV01MU3RhbGVMaW5rIiBzcGVjaWZpY2F0aW9uLXBhdGg9IndtbC9wYWdlcy9XTUxTdGFsZUxpbmsucGFnZSIvPgotICAgIDxwYWdlIG5hbWU9IldNTFN0YWxlU2Vzc2lvbiIgc3BlY2lmaWNhdGlvbi1wYXRoPSJ3bWwvcGFnZXMvV01MU3RhbGVTZXNzaW9uLnBhZ2UiLz4KLQotICAgIDwhLS0gVGhlc2UgbWF5IGJlIG92ZXJyaWRlbiBidXQgZ2VuZXJhbGx5IHNob3VsZG4ndCBiZSwgZXhjZXB0IHBlcmhhcHMgZm9yIHRoZSBob21lIHNlcnZpY2UuIC0tPgotICAgIAotICAgIDxzZXJ2aWNlIG5hbWU9ImhvbWUiIGNsYXNzPSJvcmcuYXBhY2hlLnRhcGVzdHJ5LmVuZ2luZS5Ib21lU2VydmljZSIvPgotICAgIDxzZXJ2aWNlIG5hbWU9ImFjdGlvbiIgY2xhc3M9Im9yZy5hcGFjaGUudGFwZXN0cnkuZW5naW5lLkFjdGlvblNlcnZpY2UiLz4KLSAgICA8c2VydmljZSBuYW1lPSJkaXJlY3QiIGNsYXNzPSJvcmcuYXBhY2hlLnRhcGVzdHJ5LmVuZ2luZS5EaXJlY3RTZXJ2aWNlIi8+Ci0gICAgPHNlcnZpY2UgbmFtZT0icGFnZSIgY2xhc3M9Im9yZy5hcGFjaGUudGFwZXN0cnkuZW5naW5lLlBhZ2VTZXJ2aWNlIi8+Ci0gICAgPHNlcnZpY2UgbmFtZT0icmVzZXQiIGNsYXNzPSJvcmcuYXBhY2hlLnRhcGVzdHJ5LmVuZ2luZS5SZXNldFNlcnZpY2UiLz4KLSAgICA8c2VydmljZSBuYW1lPSJyZXN0YXJ0IiBjbGFzcz0ib3JnLmFwYWNoZS50YXBlc3RyeS5lbmdpbmUuUmVzdGFydFNlcnZpY2UiLz4KLSAgICA8c2VydmljZSBuYW1lPSJhc3NldCIgY2xhc3M9Im9yZy5hcGFjaGUudGFwZXN0cnkuYXNzZXQuQXNzZXRTZXJ2aWNlIi8+Ci0JPHNlcnZpY2UgbmFtZT0iZXh0ZXJuYWwiIGNsYXNzPSJvcmcuYXBhY2hlLnRhcGVzdHJ5LmVuZ2luZS5FeHRlcm5hbFNlcnZpY2UiLz4KLQkKLQk8IS0tIFVzZWQgdG8gc3VwcG9ydCB0aGUgSlNQIHRhZ3MuIC0tPgotCQotCTxzZXJ2aWNlIG5hbWU9InRhZ3N1cHBvcnQiIGNsYXNzPSJvcmcuYXBhY2hlLnRhcGVzdHJ5LmVuZ2luZS5UYWdTdXBwb3J0U2VydmljZSIvPgotCQotPC9saWJyYXJ5LXNwZWNpZmljYXRpb24+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L0lBY3Rpb24uamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9JQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjMDg5YWEuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L0lBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5OwotCi0vKioKLSAqICBBIHBhcnRpY3VsYXIgdHlwZSBvZiBjb21wb25lbnQgdXN1YWJsZSB3aXRoIHRoZQotICogIGFjdGlvbiBzZXJ2aWNlLgotICoKLSAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiAgQHZlcnNpb24gJElkJAotICogIEBzaW5jZSAxLjAuMQotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSUFjdGlvbiBleHRlbmRzIElDb21wb25lbnQKLXsKLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0cnVlIGlmIHRoZSBjb21wb25lbnQgcmVxdWlyZXMgCi0gICAgICogIGFuIGV4aXN0aW5nLCBub3QgbmV3LCB7QGxpbmsgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9ufQotICAgICAqICB0byBvcGVyYXRlLiAgQ29tcG9uZW50cyB3aG8gYXJlIG5vdCBkZXBlbmRhbnQgb24gcGFnZSBzdGF0ZQotICAgICAqICAob3IgdGhlIHZpc2l0IG9iamVjdCkgYXJlIG5vbi1zdGF0ZWZ1bCBhbmQgY2FuIHJldHVybiBmYWxzZS4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBib29sZWFuIGdldFJlcXVpcmVzU2Vzc2lvbigpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9JQWN0aW9uTGlzdGVuZXIuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9JQWN0aW9uTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE1OWJhYy4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvSUFjdGlvbkxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeTsKLQotLyoqCi0gKiAgRGVmaW5lcyBhIGxpc3RlbmVyIHRvIGFuIHtAbGluayBJQWN0aW9ufSBjb21wb25lbnQsIHdoaWNoIGlzIHdheSB0bwotICogIGdldCBiZWhhdmlvciB3aGVuIHRoZSBjb21wb25lbnQncyBVUkwgaXMgdHJpZ2dlcmVkIChvciB0aGUgZm9ybQotICogIGNvbnRhaW5pbmcgdGhlIGNvbXBvbmVudCBpcyBzdWJtaXR0ZWQpLiAgQ2VydGFpbiBmb3JtIGVsZW1lbnRzIAotICogICh7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5mb3JtLkhpZGRlbn0pCi0gKiAgYWxzbyBtYWtlIHVzZSBvZiB0aGlzIGludGVyZmFjZS4KLSAqCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogIEB2ZXJzaW9uICRJZCQKLSAqCi0gKiovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSUFjdGlvbkxpc3RlbmVyCi17Ci0KLSAgICAvKioKLSAgICAgKiAgTWV0aG9kIGludm9rZWQgYnkgdGhlIGNvbXBvbmVudCAoYW4ge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkubGluay5BY3Rpb25MaW5rfSBvciAKLSAgICAgKiAge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkuZm9ybS5Gb3JtfSwgd2hlbiBpdHMgVVJMIGlzIHRyaWdnZXJlZC4KLSAgICAgKgotICAgICAqICBAcGFyYW0gY29tcG9uZW50IFRoZSBjb21wb25lbnQgd2hpY2ggd2FzICJ0cmlnZ2VyZWQiLgotICAgICAqICBAcGFyYW0gY3ljbGUgVGhlIHJlcXVlc3QgY3ljbGUgaW4gd2hpY2ggdGhlIGNvbXBvbmVudCB3YXMgdHJpZ2dlcmVkLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgYWN0aW9uVHJpZ2dlcmVkKElDb21wb25lbnQgY29tcG9uZW50LCBJUmVxdWVzdEN5Y2xlIGN5Y2xlKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvSUFzc2V0LmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvSUFzc2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmOGQyNGEuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L0lBc3NldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnk7Ci0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi0vKioKLSAqICBSZXByZXNlbnRhdGlvbiBvZiBhIGFzc2V0IChHSUYsIEpQRUcsIGV0Yy4pIHRoYXQgbWF5IGJlIG93bmVkIGJ5IGEKLSAqICB7QGxpbmsgSUNvbXBvbmVudH0uCi0gKgotICogIDxwPkFzc2V0cyBtYXkgYmUgY29tcGxldGVseSBleHRlcm5hbCAoaS5lLiwgb24gc29tZSBvdGhlciB3ZWIgc2l0ZSksIAotICogIGNvbnRhaW5lZCBieSB0aGUge0BsaW5rIGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHR9LCAgCi0gKiAgb3Igc3RvcmVkIHNvbWV3aGVyZSBpbiB0aGUgY2xhc3NwYXRoLgotICoKLSAqICA8cD5JbiB0aGUgbGF0dGVyIHR3byBjYXNlcywgdGhlIHJlc291cmNlIG1heSBiZSBsb2NhbGl6ZWQuCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKgotICoqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElBc3NldCBleHRlbmRzIElMb2NhdGFibGUKLXsKLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyBhIFVSTCBmb3IgdGhlIGFzc2V0LCByZWFkeSB0byBiZSBpbnNlcnRlZCBpbnRvIHRoZSBvdXRwdXQgSFRNTC4KLSAgICAgKiAgSWYgdGhlIGFzc2V0IGNhbiBiZSBsb2NhbGl6ZWQsIHRoZSBsb2NhbGl6ZWQgdmVyc2lvbiAobWF0Y2hpbmcgdGhlCi0gICAgICogIHtAbGluayBqYXZhLnV0aWwuTG9jYWxlfSBvZiB0aGUgY3VycmVudCB7QGxpbmsgSVBhZ2UgcGFnZX0pIGlzIHJldHVybmVkLgotICAgICAqIAotICAgICAqICBAdGhyb3dzIEFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbiBpZiB0aGUgYXNzZXQgZG9lcyBub3QgZXhpc3QuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgU3RyaW5nIGJ1aWxkVVJMKElSZXF1ZXN0Q3ljbGUgY3ljbGUpOwotCi0gICAgLyoqCi0gICAgICogIEFjY2Vzc2VzIHRoZSBsb2NhbGl6ZWQgdmVyc2lvbiBvZiB0aGUgcmVzb3VyY2UgKGlmIHBvc3NpYmxlKSBhbmQgcmV0dXJucyBpdCBhcwotICAgICAqICBhbiBpbnB1dCBzdHJlYW0uICBBIHZlcnNpb24gb2YgdGhlIHJlc291cmNlIGxvY2FsaXplZCB0byB0aGUKLSAgICAgKiAgY3VycmVudCB7QGxpbmsgSVBhZ2UgcGFnZX0gaXMgcmV0dXJuZWQuCi0gICAgICogCi0gICAgICogIEB0aHJvd3MgQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uIGlmIHRoZSBhc3NldCBkb2VzIG5vdCBleGlzdCwgb3IKLSAgICAgKiAgY2FuJ3QgYmUgcmVhZC4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRSZXNvdXJjZUFzU3RyZWFtKElSZXF1ZXN0Q3ljbGUgY3ljbGUpOwotICAgIAotICAgIC8qKgotICAgICAqICBSZXR1cm5zIHRoZSB1bmRlcmx5aW5nIGxvY2F0aW9uIG9mIHRoZSBhc3NldC4KLSAgICAgKiAKLSAgICAgKiovCi0gICAgCi0gICAgcHVibGljIElSZXNvdXJjZUxvY2F0aW9uIGdldFJlc291cmNlTG9jYXRpb24oKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvSUJlYW5Qcm92aWRlci5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L0lCZWFuUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGMzOWI5My4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvSUJlYW5Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotLyoqCi0gKiAgQW4gb2JqZWN0IHRoYXQgcHJvdmlkZXMgYSBjb21wb25lbnQgd2l0aCBhY2Nlc3MgdG8gaGVscGVyIGJlYW5zLgotICogIEhlbHBlciBiZWFucyBhcmUgSmF2YUJlYW5zIGFzc29jaWF0ZWQgd2l0aCBhIHBhZ2Ugb3IgY29tcG9uZW50Ci0gKiAgdGhhdCBhcmUgdXNlZCB0byBleHRlbmQgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIGNvbXBvbmVudCB2aWEKLSAqICBhZ2dyZWdhdGlvbi4KLSAqCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogIEB2ZXJzaW9uICRJZCQKLSAqICBAc2luY2UgMS4wLjQKLSAqKi8KLQotCi1wdWJsaWMgaW50ZXJmYWNlIElCZWFuUHJvdmlkZXIKLXsKLQkvKioKLQkgKiAgUmV0dXJucyB0aGUgSmF2YUJlYW4gd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuICBUaGUgYmVhbiBpcyBjcmVhdGVkIGFzIG5lZWRlZC4KLQkgKgotCSAqICBAdGhyb3dzIEFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbiBpZiBubyBzdWNoIGJlYW4gaXMgYXZhaWxhYmxlLgotCSAqCi0JICoqLwotCQotCXB1YmxpYyBPYmplY3QgZ2V0QmVhbihTdHJpbmcgbmFtZSk7Ci0JCi0JLyoqCi0JICogIFJldHVybnMgdGhlIHtAbGluayBJQ29tcG9uZW50fSAod2hpY2ggbWF5IGJlIGEgCi0JICogIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LklQYWdlfSkgZm9yIHdoaWNoCi0JICogIHRoaXMgYmVhbiBwcm92aWRlciBpcyBwcm92aWRpbmcgYmVhbnMuCi0JICoKLQkgKiAgQHNpbmNlIDEuMC41Ci0JICoqLwotCQotCXB1YmxpYyBJQ29tcG9uZW50IGdldENvbXBvbmVudCgpOwotCQotCS8qKgotCSAqICBSZXR1cm5zIGEgY29sbGVjdGlvbiBvZiB0aGUgbmFtZXMgb2YgYW55IGJlYW5zIHdoaWNoIG1heQotCSAqICBiZSBwcm92aWRlZC4KLQkgKgotCSAqICBAc2luY2UgMS4wLjYKLQkgKiAgQHNlZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LnNwZWMuSUNvbXBvbmVudFNwZWNpZmljYXRpb24jZ2V0QmVhbk5hbWVzKCkKLQkgKgotCSAqKi8KLQkKLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRCZWFuTmFtZXMoKTsKLQkKLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0cnVlIGlmIHRoZSBwcm92aWRlciBjYW4gcHJvdmlkZSB0aGUgbmFtZWQgYmVhbi4KLSAgICAgKiAKLSAgICAgKiAgQHNpbmNlIDIuMgotICAgICAqIAotICAgICAqKi8KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBjYW5Qcm92aWRlQmVhbihTdHJpbmcgbmFtZSk7Ci0gICAgCi0JLyoqCi0JICogIFJldHVybnMgYSByZXNvdXJjZSByZXNvbHZlci4KLQkgKiAKLQkgKiAgQHNpbmNlIDEuMC44Ci0JICogCi0JICoqLwotCQotCXB1YmxpYyBJUmVzb3VyY2VSZXNvbHZlciBnZXRSZXNvdXJjZVJlc29sdmVyKCk7Ci0JCi19Ci0KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9JQmluZGluZy5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L0lCaW5kaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwYTk4NmEuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L0lCaW5kaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnk7Ci0KLS8qKgotICogIEEgYmluZGluZyBpcyB0aGUgbWVjaGFuaXNtIHVzZWQgdG8gcHJvdmlkZSB2YWx1ZXMgZm9yIHBhcmFtZXRlcnMgb2YKLSAqICBzcGVjaWZpYyB7QGxpbmsgSUNvbXBvbmVudH0gaW5zdGFuY2VzLiBUaGUgY29tcG9uZW50IGRvZXNuJ3QKLSAqICBjYXJlIHdoZXJlIHRoZSByZXF1aXJlZCB2YWx1ZSBjb21lcyBmcm9tLCBpdCBzaW1wbHkgcmVxdWlyZXMgdGhhdAotICogIGEgdmFsdWUgYmUgcHJvdmlkZWQgd2hlbiBuZWVkZWQuCi0gKgotICogIDxwPkJpbmRpbmdzIGFyZSBzZXQgaW5zaWRlIHRoZSBjb250YWluaW5nIGNvbXBvbmVudCdzIHNwZWNpZmljYXRpb24uCi0gKiAgQmluZGluZ3MgbWF5IGJlIHN0YXRpYyBvciBkeW5hbWljICh0aG91Z2ggdGhhdCBpcyBpcnJlbGV2YW50IHRvIHRoZQotICogIGNvbXBvbmVudCkuICBDb21wb25lbnRzIG1heSBhbHNvIHVzZSBhIGJpbmRpbmcgdG8gd3JpdGUgYSB2YWx1ZQotICogIGJhY2sgdGhyb3VnaCBhIHByb3BlcnR5IHRvIHNvbWUgb3RoZXIgb2JqZWN0ICh0eXBpY2FsbHksIGFub3RoZXIgY29tcG9uZW50KS4KLSAqCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogIEB2ZXJzaW9uICRJZCQKLSAqKi8KLQotcHVibGljIGludGVyZmFjZSBJQmluZGluZyBleHRlbmRzIElMb2NhdGFibGUKLXsKLSAgICAvKioKLSAgICAgKiAgSW52b2tlcyB7QGxpbmsgI2dldE9iamVjdCgpfSwgdGhlbiBjb2VyY2VzIHRoZSB2YWx1ZSB0byBhIGJvb2xlYW4uICAKLSAgICAgKiAgVGhlIGZvbGxvd2luZyBydWxlcyBhcmUgdXNlZCB0byBwZXJmb3JtIHRoZSBjb2VyY2lvbjoKLSAgICAgKiAgPHVsPgotICAgICAqICA8bGk+bnVsbCBpcyBhbHdheXMgZmFsc2UKLSAgICAgKiAgPGxpPkEge0BsaW5rIEJvb2xlYW59IHZhbHVlIGlzIHNlbGYtZXZpZGVudAotICAgICAqICA8bGk+QSB7QGxpbmsgTnVtYmVyfSB2YWx1ZSBpcyB0cnVlIGlmIG5vbi16ZXJvCi0gICAgICogIDxsaT5BIHtAbGluayBTdHJpbmd9IHZhbHVlIGlzIHRydWUgaWYgbm9uLWVtcHR5IGFuZCBjb250YWlucwotICAgICAqICBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXJzCi0gICAgICogIDxsaT5Bbnkge0BsaW5rIGphdmEudXRpbC5Db2xsZWN0aW9ufSB2YWx1ZSBpcyB0cnVlIGlmIGl0IGhhcyBhIG5vbi16ZXJvCi0gICAgICogIHtAbGluayBqYXZhLnV0aWwuQ29sbGVjdGlvbiNzaXplKCkgc2l6ZX0KLSAgICAgKiAgPGxpPkFueSBhcnJheSB0eXBlIGlzIHRydWUgaWYgaXQgaGFzIGEgbm9uLXplcm8gbGVuZ3RoCi0gICAgICogIDxsaT5Bbnkgb3RoZXIgbm9uLW51bGwgdmFsdWUgaXMgdHJ1ZQotICAgICAqICA8L3VsPgotICAgICAqIAotICAgICAqICBAc2VlIFRhcGVzdHJ5I2V2YWx1YXRlQm9vbGVhbihPYmplY3QpCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0Qm9vbGVhbigpOwotCi0gICAgLyoqCi0gICAgICogIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBCaW5kaW5nIHVzaW5nIHtAbGluayAjZ2V0T2JqZWN0fSBhbmQgY29lcmNlcyBpdAotICAgICAqICB0byBhbiA8Y29kZT5pbnQ8L2NvZGU+LiAgU3RyaW5ncyB3aWxsIGJlIHBhcnNlZCwgYW5kIG90aGVyCi0gICAgICogIDxjb2RlPmphdmEubGFuZy5OdW1iZXI8L2NvZGU+IGNsYXNzZXMgd2lsbCBoYXZlIDxjb2RlPmludFZhbHVlKCk8L2NvZGU+Ci0gICAgICogIGludm9rZWQuICAKLSAgICAgKgotICAgICAqICBAdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbiBpZiB0aGUgYmluZGluZydzIHZhbHVlIGlzIG5vdCBvZiBhIHVzYWJsZSBjbGFzcy4KLSAgICAgKiAgQHRocm93cyBCaW5kaW5nRXhjZXB0aW9uIGlmIHRoZSBiaW5kaW5nJ3MgdmFsdWUgaXMgbnVsbC4KLSAgICAgKiovCi0KLSAgICBwdWJsaWMgaW50IGdldEludCgpOwotCi0gICAgLyoqCi0gICAgICogIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBCaW5kaW5nIHVzaW5nIHtAbGluayAjZ2V0T2JqZWN0KCl9IGFuZCBjb2VyY2VzIGl0Ci0gICAgICogIHRvIGEgPGNvZGU+ZG91YmxlPC9jb2RlPi4gIFN0cmluZ3Mgd2lsbCBiZSBwYXJzZWQsIGFuZCBvdGhlcgotICAgICAqICA8Y29kZT5qYXZhLmxhbmcuTnVtYmVyPC9jb2RlPiBjbGFzc2VzIHdpbGwgaGF2ZSA8Y29kZT5kb3VibGVWYWx1ZSgpPC9jb2RlPgotICAgICAqICBpbnZva2VkLgotICAgICAqCi0gICAgICogIEB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uIGlmIHRoZSBiaW5kaW5nJ3MgdmFsdWUgaXMgbm90IG9mIGEgdXNhYmxlIGNsYXNzLgotICAgICAqICBAdGhyb3dzIEJpbmRpbmdFeGNlcHRpb24gaWYgdGhlIGJpbmRpbmcncyB2YWx1ZSBpcyBudWxsLgotICAgICAqKi8KLQotICAgIHB1YmxpYyBkb3VibGUgZ2V0RG91YmxlKCk7Ci0KLSAgICAvKioKLSAgICAgKiAgSW52b2tlcyB7QGxpbmsgI2dldE9iamVjdCgpfSBhbmQgY29udmVydHMgdGhlIHJlc3VsdCB0byA8Y29kZT5qYXZhLmxhbmcuU3RyaW5nPC9jb2RlPi4KLSAgICAgKiovCi0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZygpOwotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoaXMgYmluZGluZy4gIFRoaXMgaXMgdGhlIGVzc2VudGlhbCBtZXRob2QuICBPdGhlciBtZXRob2RzCi0gICAgICogIGdldCB0aGlzIHZhbHVlIGFuZCBjYXN0IG9yIGNvZXJjZSB0aGUgdmFsdWUuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgT2JqZWN0IGdldE9iamVjdCgpOwotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgdGhlIHZhbHVlIGZvciB0aGUgYmluZGluZyBhZnRlciBwZXJmb3JtaW5nIHNvbWUgYmFzaWMgY2hlY2tzLgotICAgICAqCi0gICAgICogIEBwYXJhbSBwYXJhbWV0ZXJOYW1lIHRoZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIgKHVzZWQgdG8gYnVpbGQKLSAgICAgKiAgdGhlIG1lc3NhZ2UgaWYgYW4gZXhjZXB0aW9uIGlzIHRocm93bikuCi0gICAgICogIEBwYXJhbSB0eXBlIGlmIG5vdCBudWxsLCB0aGUgdmFsdWUgbXVzdCBiZSBhc3NpZ25hYmxlIHRvIHRoZSBzcGVjaWZpYwotICAgICAqICBjbGFzcwotICAgICAqICBAdGhyb3dzIEJpbmRpbmdFeGNlcHRpb24gaWYgdGhlIHZhbHVlIGlzIG5vdCBhc3NpZ25hYmxlIHRvIHRoZQotICAgICAqICBzcGVjaWZpZWQgdHlwZQotICAgICAqCi0gICAgICogIEBzaW5jZSAwLjIuOQotICAgICAqKi8KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0KFN0cmluZyBwYXJhbWV0ZXJOYW1lLCBDbGFzcyB0eXBlKTsKLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIHRydWUgaWYgdGhlIHZhbHVlIGlzIGludmFyaWFudCAobm90IGNoYW5naW5nOyB0aGUKLSAgICAgKiAgc2FtZSB2YWx1ZSByZXR1cm5lZCBlYWNoIHRpbWUpLiAgU3RhdGljIGFuZCBmaWVsZCBiaW5kaW5ncwotICAgICAqICBhcmUgYWx3YXlzIGludmFyaWFudCwgYW5kIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LmJpbmRpbmcuRXhwcmVzc2lvbkJpbmRpbmd9cwotICAgICAqICBtYXkgYmUgbWFya2VkIGludmFyaWFudCAoYXMgYW4gb3B0aW1pemF0aW9uKS4KLSAgICAgKiAKLSAgICAgKiAgQHNpbmNlIDIuMC4zCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIGJvb2xlYW4gaXNJbnZhcmlhbnQoKTsKLQotICAgIC8qKgotICAgICAqICBDb25zdHJ1Y3RzIGEgPGNvZGU+Qm9vbGVhbjwvY29kZT4gYW5kIGludm9rZXMge0BsaW5rICNzZXRPYmplY3QoT2JqZWN0KX0uCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCBzZXRCb29sZWFuKGJvb2xlYW4gdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogIENvbnN0cnVjdHMgYW4gPGNvZGU+SW50ZWdlcjwvY29kZT4gYW5kIGludm9rZXMge0BsaW5rICNzZXRPYmplY3QoT2JqZWN0KX0uCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCBzZXRJbnQoaW50IHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqICBDb25zdHJ1Y3RzIGFuIDxjb2RlPkRvdWJsZTwvY29kZT4gYW5kIGludm9rZXMge0BsaW5rICNzZXRPYmplY3QoT2JqZWN0KX0uCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCBzZXREb3VibGUoZG91YmxlIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqICBJbnZva2VzIHtAbGluayAjc2V0T2JqZWN0KE9iamVjdCl9LgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgc2V0U3RyaW5nKFN0cmluZyB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiAgVXBkYXRlcyB0aGUgdmFsdWUgb2YgdGhlIGJpbmRpbmcsIGlmIHBvc3NpYmxlLgotICAgICAqCi0gICAgICogIEBleGNlcHRpb24gQmluZGluZ0V4Y2VwdGlvbiBJZiB0aGUgYmluZGluZyBpcyByZWFkIG9ubHkuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCBzZXRPYmplY3QoT2JqZWN0IHZhbHVlKTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9JQ29tcG9uZW50LmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvSUNvbXBvbmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjNiOGRkLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9JQ29tcG9uZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTQgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5lbmdpbmUuSVBhZ2VMb2FkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5zcGVjLklDb21wb25lbnRTcGVjaWZpY2F0aW9uOwotCi0vKioKLSAqICBEZWZpbmVzIGFuIG9iamVjdCB3aGljaCBtYXkgYmUgdXNlZCB0byBwcm92aWRlIGR5bmFtaWMgY29udGVudCBvbiBhIFRhcGVzdHJ5IHdlYiBwYWdlLgotICoKLSAqICA8cD5Db21wb25lbnRzIGFyZSBjcmVhdGVkIGR5bmFtaWNhbGx5IGZyb20gdGhpZXIgY2xhc3MgbmFtZXMgKHBhcnQgb2YgdGhlCi0gKiAge0BsaW5rIElDb21wb25lbnRTcGVjaWZpY2F0aW9ufSkuCi0gKgotICoKLSAqICBAYXV0aG9yIEhvd2FyZCBMZWl3cyBTaGlwCi0gKiAgQHZlcnNpb24gJElkJAotICogCi0gKiovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbXBvbmVudCBleHRlbmRzIElSZW5kZXIsIElMb2NhdGlvbkhvbGRlcgotewotCi0gICAgLyoqCi0gICAgICogIEFkZHMgYW4gYXNzZXQgdG8gdGhlIGNvbXBvbmVudC4gIFRoaXMgaXMgaW52b2tlZCBmcm9tIHRoZSBwYWdlIGxvYWRlci4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIGFkZEFzc2V0KFN0cmluZyBuYW1lLCBJQXNzZXQgYXNzZXQpOwotCi0gICAgLyoqCi0gICAgICogIEFkZHMgYSBjb21wb25lbnQgdG8gYSBjb250YWluZXIuICBTaG91bGQgb25seSBiZSBjYWxsZWQgZHVyaW5nIHRoZSBwYWdlCi0gICAgICogIGxvYWRpbmcgcHJvY2Vzcywgd2hpY2ggaXMgcmVzcG9uc2libGUgZm9yIGFueSBjaGVja2luZy4KLSAgICAgKgotICAgICAqICBAc2VlIElQYWdlTG9hZGVyCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCBhZGRDb21wb25lbnQoSUNvbXBvbmVudCBjb21wb25lbnQpOwotCi0gICAgLyoqCi0gICAgICogIEFkZHMgYSBuZXcgcmVuZGVyYWJsZSBlbGVtZW50IHRvIHRoZSByZWNlaXZlcidzIGJvZHkuICBUaGUgZWxlbWVudCBtYXkgYmUgZWl0aGVyCi0gICAgICogIGFub3RoZXIgY29tcG9uZW50LCBvciBzdGF0aWMgSFRNTC4gIFN1Y2ggZWxlbWVudHMgY29tZSBmcm9tIGluc2lkZQotICAgICAqICB0aGUgcmVjZWl2ZXIncyB0YWcgd2l0aGluIGl0cyBjb250YWluZXIncyB0ZW1wbGF0ZSwgYW5kIHJlcHJlc2VudCBzdGF0aWMKLSAgICAgKiAgdGV4dCBhbmQgb3RoZXIgY29tcG9uZW50cy4KLSAgICAgKiAKLSAgICAgKiAgPHA+VGhlIG1ldGhvZCB7QGxpbmsgI3JlbmRlckJvZHkoSU1hcmt1cFdyaXRlciwgSVJlcXVlc3RDeWNsZSl9IGlzIHVzZWQKLSAgICAgKiAgdG8gcmVuZGVyIHRoZXNlIGVsZW1lbnRzLgotICAgICAqIAotICAgICAqICBAc2luY2UgMi4yCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgYWRkQm9keShJUmVuZGVyIGVsZW1lbnQpOwotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgdGhlIGFzc2V0IG1hcCBmb3IgdGhlIGNvbXBvbmVudCwgd2hpY2ggbWF5IGJlIGVtcHR5IGJ1dCB3aWxsIG5vdCBiZSBudWxsLgotICAgICAqCi0gICAgICogIDxwPlRoZSByZXR1cm4gdmFsdWUgaXMgdW5tb2RpZmlhYmxlLgotICAgICAqIAotICAgICAqKi8KLQotICAgIHB1YmxpYyBNYXAgZ2V0QXNzZXRzKCk7Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0aGUgbmFtZWQgYXNzZXQsIG9yIG51bGwgaWYgbm90IGZvdW5kLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIElBc3NldCBnZXRBc3NldChTdHJpbmcgbmFtZSk7Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0aGUgYmluZGluZyB3aXRoIHRoZSBnaXZlbiBuYW1lIG9yIG51bGwgaWYgbm90IGZvdW5kLgotICAgICAqCi0gICAgICogIDxwPkJpbmRpbmdzIGFyZSBhZGRlZCB0byBhIGNvbXBvbmVudCB1c2luZyB7QGxpbmsgI3NldEJpbmRpbmcoU3RyaW5nLElCaW5kaW5nKX0uCi0gICAgICoqLwotCi0gICAgcHVibGljIElCaW5kaW5nIGdldEJpbmRpbmcoU3RyaW5nIG5hbWUpOwotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgYSB7QGxpbmsgQ29sbGVjdGlvbn0gb2YgdGhlIG5hbWVzIG9mIGFsbCBiaW5kaW5ncyAod2hpY2ggaW5jbHVkZXMKLSAgICAgKiAgYmluZGluZ3MgZm9yIGJvdGggZm9ybWFsIGFuZCBpbmZvcm1hbCBwYXJhbWV0ZXJzKS4KLSAgICAgKgotICAgICAqICA8cD5UaGUgcmV0dXJuIHZhbHVlIGlzIHVubW9kaWZpYWJsZS4gIEl0IHdpbGwgYmUgbnVsbCBmb3IgYSB7QGxpbmsgSVBhZ2UgcGFnZX0sCi0gICAgICogIG9yIG1heSBzaW1wbHkgYmUgZW1wdHkgZm9yIGEgY29tcG9uZW50IHdpdGggbm8gYmluZGluZ3MuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgQ29sbGVjdGlvbiBnZXRCaW5kaW5nTmFtZXMoKTsKLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIGEge0BsaW5rIE1hcH0gb2YgdGhlIHtAbGluayBJQmluZGluZyBiaW5kaW5nc30gZm9yIHRoaXMgY29tcG9uZW50OyAKLSAgICAgKiAgdGhpcyBpbmNsdWRlcyBpbmZvcm1hbCBwYXJhbWV0ZXJzCi0gICAgICogIGFzIHdlbGwgYXMgZm9ybWFsIGJpbmRpbmdzLgotICAgICAqCi0gICAgICogIEBzaW5jZSAxLjAuNQotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIE1hcCBnZXRCaW5kaW5ncygpOwotCi0gICAgLyoqCi0gICAgICogIFJldHJpZXZlcyBhbiBjb250YWluZWQgY29tcG9uZW50IGJ5IGl0cyBpZC4KLSAgICAgKiAgQ29udGFpbmVkIGNvbXBvbmVudHMgaGF2ZSB1bmlxdWUgaWRzIHdpdGhpbiB0aGVpciBjb250YWluZXIuCi0gICAgICoKLSAgICAgKiAgQGV4Y2VwdGlvbiBBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24gcnVudGltZSBleGNlcHRpb24gdGhyb3duIGlmIHRoZSBuYW1lZAotICAgICAqICBjb21wb25lbnQgZG9lcyBub3QgZXhpc3QuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgSUNvbXBvbmVudCBnZXRDb21wb25lbnQoU3RyaW5nIGlkKTsKLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIHRoZSBjb21wb25lbnQgd2hpY2ggZW1iZWRzIHRoZSByZWNlaXZlci4gIEFsbCBjb21wb25lbnRzIGFyZSBjb250YWluZWQgd2l0aGluCi0gICAgICogIG90aGVyIGNvbXBvbmVudHMsIHdpdGggdGhlIGV4Y2VwdGlvbiBvZiB0aGUgcm9vdCBwYWdlIGNvbXBvbmVudC4KLSAgICAgKgotICAgICAqICA8cD5BIHBhZ2UgcmV0dXJucyBudWxsLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIElDb21wb25lbnQgZ2V0Q29udGFpbmVyKCk7Ci0KLSAgICAvKioKLSAgICAgKiAgU2V0cyB0aGUgY29udGFpbmVyIG9mIHRoZSBjb21wb25lbnQuICAgIFRoaXMgaXMgd3JpdGUtb25jZSwKLSAgICAgKiAgYW4gYXR0ZW1wdCB0byBjaGFuZ2UgaXQgbGF0ZXIgd2lsbCB0aHJvdyBhbiB7QGxpbmsgQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9ufS4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIHNldENvbnRhaW5lcihJQ29tcG9uZW50IHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIGEgc3RyaW5nIGlkZW50aWZ5aW5nIHRoZSBuYW1lIG9mIHRoZSBwYWdlIGFuZCB0aGUgaWQgcGF0aCBvZiB0aGUgcmVjaWV2ZXIgd2l0aGluCi0gICAgICogIHRoZSBwYWdlLiAgUGFnZXMgc2ltcGx5IHJldHVybiB0aGVpciBuYW1lLgotICAgICAqCi0gICAgICogIEBzZWUgI2dldElkUGF0aCgpCi0gICAgICoqLwotCi0gICAgcHVibGljIFN0cmluZyBnZXRFeHRlbmRlZElkKCk7Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0aGUgc2ltcGxlIGlkIG9mIHRoZSBjb21wb25lbnQsIGFzIGRlZmluZWQgaW4gaXRzIHNwZWNpZmljYXRpb24uCi0gICAgICoKLSAgICAgKiAgPHA+QW4gaWQgd2lsbCBiZSB1bmlxdWUgd2l0aGluIHRoZQotICAgICAqICBjb21wb25lbnQgd2hpY2ggY29udGFpbnMgdGhpcyBjb21wb25lbnQuCi0gICAgICoKLSAgICAgKiAgPHA+QSAge0BsaW5rIElQYWdlIHBhZ2V9IHdpbGwgYWx3YXlzIHJldHVybiBudWxsLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIFN0cmluZyBnZXRJZCgpOwotCi0gICAgLyoqCi0gICAgICogIFNldHMgdGhlIGlkIG9mIHRoZSBjb21wb25lbnQuICAgIFRoaXMgaXMgd3JpdGUtb25jZSwKLSAgICAgKiAgYW4gYXR0ZW1wdCB0byBjaGFuZ2UgaXQgbGF0ZXIgd2lsbCB0aHJvdyBhbiB7QGxpbmsgQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9ufS4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIHNldElkKFN0cmluZyB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0aGUgcXVhbGlmaWVkIGlkIG9mIHRoZSBjb21wb25lbnQuICBUaGlzIHJlcHJlc2VudHMgYSBwYXRoIGZyb20gdGhlCi0gICAgICogIHtAbGluayBJUGFnZSBwYWdlfSB0bwotICAgICAqICB0aGlzIGNvbXBvbmVudCwgc2hvd2luZyBob3cgY29tcG9uZW50cyBjb250YWluIGVhY2ggb3RoZXIuCi0gICAgICoKLSAgICAgKiAgPHA+QSB7QGxpbmsgSVBhZ2UgcGFnZX0gd2lsbCBhbHdheXMgcmV0dXJuCi0gICAgICogIG51bGwuICBBIGNvbXBvbmVudCBjb250YWluZWQgb24gYSBwYWdlIHJldHVybnMgaXRzIHNpbXBsZSBpZC4KLSAgICAgKiAgT3RoZXIgY29tcG9uZW50cyByZXR1cm4gdGhlaXIgY29udGFpbmVyJ3MgaWQgcGF0aCBmb2xsb3dlZCBieSBhIHBlcmlvZCBhbmQgdGhlaXIKLSAgICAgKiAgb3duIG5hbWUuCi0gICAgICoKLSAgICAgKiAgQHNlZSAjZ2V0SWQoKQotICAgICAqKi8KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWRQYXRoKCk7Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0aGUgcGFnZSB3aGljaCB1bHRpbWF0ZWx5IGNvbnRhaW5zIHRoZSByZWNlaXZlci4gIEEgcGFnZSB3aWxsIHJldHVybiBpdHNlbGYuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgSVBhZ2UgZ2V0UGFnZSgpOwotCi0gICAgLyoqCi0gICAgICogIFNldHMgdGhlIHBhZ2Ugd2hpY2ggdWx0aW1pYXRlbHkgY29udGFpbnMgdGhlIGNvbXBvbmVudC4gIFRoaXMgaXMgd3JpdGUtb25jZSwKLSAgICAgKiAgYW4gYXR0ZW1wdCB0byBjaGFuZ2UgaXQgbGF0ZXIgd2lsbCB0aHJvdyBhbiB7QGxpbmsgQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9ufS4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIHNldFBhZ2UoSVBhZ2UgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgdGhlIHNwZWNpZmljYXRpb24gd2hpY2ggZGVmaW5lcyB0aGUgY29tcG9uZW50LgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIElDb21wb25lbnRTcGVjaWZpY2F0aW9uIGdldFNwZWNpZmljYXRpb24oKTsKLQotICAgIC8qKgotICAgICAqICBTZXRzIHRoZSBzcGVjaWZpY2F0aW9uIHVzZWQgYnkgdGhlIGNvbXBvbmVudC4gIFRoaXMgaXMgd3JpdGUtb25jZSwgYW4gYXR0ZW1wdAotICAgICAqICB0byBjaGFuZ2UgaXQgbGF0ZXIgd2lsbCB0aHJvdyBhbiB7QGxpbmsgQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9ufS4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIHNldFNwZWNpZmljYXRpb24oSUNvbXBvbmVudFNwZWNpZmljYXRpb24gdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogIEludm9rZWQgdG8gbWFrZSB0aGUgcmVjZWl2ZXIgcmVuZGVyIGl0cyBib2R5ICh0aGUgZWxlbWVudHMgYW5kIGNvbXBvbmVudHMKLSAgICAgKiAgaXRzIHRhZyB3cmFwcyBhcm91bmQsIG9uIGl0cyBjb250YWluZXIncyB0ZW1wbGF0ZSkuICAKLSAgICAgKiAgVGhpcyBtZXRob2QgaXMgcHVibGljIHNvIHRoYXQgdGhlCi0gICAgICogIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbXBvbmVudHMuUmVuZGVyQm9keX0gY29tcG9uZW50IG1heSBvcGVyYXRlLgotICAgICAqIAotICAgICAqICBAc2luY2UgMi4yCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgcmVuZGVyQm9keShJTWFya3VwV3JpdGVyIHdyaXRlciwgSVJlcXVlc3RDeWNsZSBjeWNsZSk7Ci0KLSAgICAvKioKLSAgICAgKiAgQWRkcyBhIGJpbmRpbmcgdG8gYSBjb250YWluZXIuICBTaG91bGQgb25seSBiZSBjYWxsZWQgZHVyaW5nIHRoZSBwYWdlCi0gICAgICogIGxvYWRpbmcgcHJvY2VzcyAod2hpY2ggaXMgcmVzcG9uc2libGUgZm9yIGVyb3IgY2hlY2tpbmcpLgotICAgICAqCi0gICAgICogIEBzZWUgSVBhZ2VMb2FkZXIKLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIHNldEJpbmRpbmcoU3RyaW5nIG5hbWUsIElCaW5kaW5nIGJpbmRpbmcpOwotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgdGhlIGNvbnRhaW5lZCBjb21wb25lbnRzIGFzIGFuIHVubW9kaWZpYWJsZSB7QGxpbmsgTWFwfS4gIFRoaXMKLSAgICAgKiAgYWxsb3dzIHBlZXIgY29tcG9uZW50cyB0byB3b3JrIHRvZ2V0aGVyIHdpdGhvdXQgZGlyZWN0bHkgaW52b2x2aW5nIHRoZWlyCi0gICAgICogIGNvbnRhaW5lciAuLi4gdGhlIGNsYXNzaWMgZXhhbXBsZSBpcyB0byBoYXZlIGFuIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbXBvbmVudHMuSW5zZXJ0fSAKLSAgICAgKiAgd29yayB3aXRoIGFuIGVuY2xvc2luZyB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5jb21wb25lbnRzLkZvcmVhY2h9LgotICAgICAqCi0gICAgICogIDxwPlRoaXMgaXMgbGF0ZSBhZGRpdGlvbiB0byBUYXBlc3RyeSwgYmVjYXVzZSBpdCBhbHNvIG9wZW5zIHRoZSBkb29yCi0gICAgICogIHRvIGFidXNlLCBzaW5jZSBpdCBpcyBxdWl0ZSBwb3NzaWJsZSB0byBicmVhayB0aGUgImJsYWNrIGJveCIgYXNwZWN0IG9mCi0gICAgICogIGEgY29tcG9uZW50IGJ5IGludGVyYWN0aW5nIGRpcmVjdGx5IHdpdGggY29tcG9uZW50cyBpdCBlbWJlZHMuICBUaGlzIGNyZWF0ZXMKLSAgICAgKiAgdWdseSBpbnRlcmVsYXRpb25zaGlwcyBiZXR3ZWVuIGNvbXBvbmVudHMgdGhhdCBzaG91bGQgYmUgc2VwZXJhdGVkLgotICAgICAqCi0gICAgICogIEByZXR1cm4gQSBNYXAgb2YgY29tcG9uZW50cyBrZXllZCBvbiBjb21wb25lbnQgaWQuICBNYXkgcmV0dXJuIGFuIGVtcHR5IG1hcCwgYnV0IHdvbid0IHJldHVybgotICAgICAqICBudWxsLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIE1hcCBnZXRDb21wb25lbnRzKCk7Ci0KLSAgICAvKioKLSAgICAgKiAgQWxsb3dzIGEgY29tcG9uZW50IHRvIGZpbmlzaCBhbnkgc2V0dXAgYWZ0ZXIgaXQgaGFzIGJlZW4gY29uc3RydWN0ZWQuCi0gICAgICoKLSAgICAgKiAgPHA+VGhlIGV4YWN0IHRpbWluZyBpcyBub3QKLSAgICAgKiAgc3BlY2lmaWVkLCBidXQgYW55IGNvbXBvbmVudHMgY29udGFpbmVkIGJ5IHRoZQotICAgICAqICByZWNlaXZpbmcgY29tcG9uZW50IHdpbGwgYWxzbyBoYXZlIGJlZW4gY29uc3RydWN0ZWQKLSAgICAgKiAgYmVmb3JlIHRoaXMgbWV0aG9kIGlzIGludm9rZWQuCi0gICAgICoKLSAgICAgKiAgPHA+QXMgb2YgcmVsZWFzZSAxLjAuNiwgdGhpcyBtZXRob2QgaXMgaW52b2tlZCA8ZW0+YmVmb3JlPC9lbT4KLSAgICAgKiAgYmluZGluZ3MgYXJlIHNldC4gIFRoaXMgc2hvdWxkIG5vdCBhZmZlY3QgYW55dGhpbmcsIGFzIGJpbmRpbmdzCi0gICAgICogIHNob3VsZCBvbmx5IGJlIHVzZWQgZHVyaW5nIHJlbmRlcnJpbmcuCi0gICAgICogCi0gICAgICogIDxwPlJlbGVhc2UgMi4yIGFkZGVkIHRoZSBjeWNsZSBwYXJhbWV0ZXIgd2hpY2ggaXMsIHJlZ3JldGZ1bGx5LCBub3QKLSAgICAgKiAgYmFja3dhcmRzIGNvbXBhdGlibGUuCi0gICAgICoKLSAgICAgKiAgQHNpbmNlIDAuMi4xMgotICAgICAqIAotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIGZpbmlzaExvYWQoCi0gICAgICAgIElSZXF1ZXN0Q3ljbGUgY3ljbGUsCi0gICAgICAgIElQYWdlTG9hZGVyIGxvYWRlciwKLSAgICAgICAgSUNvbXBvbmVudFNwZWNpZmljYXRpb24gc3BlY2lmaWNhdGlvbik7Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyBhIGxvY2FsaXplZCBzdHJpbmcgbWVzc2FnZS4gIEVhY2ggY29tcG9uZW50IGhhcyBhbiBvcHRpb25hbAotICAgICAqICBzZXQgb2YgbG9jYWxpemVkIG1lc3NhZ2Ugc3RyaW5ncyB0aGF0IGFyZSByZWFkIGZyb20gcHJvcGVydGllcwotICAgICAqICBmaWxlcy4KLSAgICAgKiAKLSAgICAgKiAgQHBhcmFtIGtleSB0aGUga2V5IHVzZWQgdG8gbG9jYXRlIHRoZSBtZXNzYWdlCi0gICAgICogIEByZXR1cm4gdGhlIGxvY2FsaXplZCBtZXNzYWdlIGZvciB0aGUga2V5LCBvciBhIHBsYWNlaG9sZGVyCi0gICAgICogIGlmIG5vIG1lc3NhZ2UgaXMgZGVmaW5lZCBmb3IgdGhlIGtleS4KLSAgICAgKiAKLSAgICAgKiAgQHNpbmNlIDIuMC40Ci0gICAgICogIEBkZXByZWNhdGVkIFRvIGJlIHJlbW92ZWQgaW4gMy4xLCB1c2Uge0BsaW5rICNnZXRNZXNzYWdlKFN0cmluZyl9LgotICAgICAqKi8KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpOwotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgYSBsb2NhbGl6ZWQgc3RyaW5nIG1lc3NhZ2UuICBFYWNoIGNvbXBvbmVudCBoYXMgYW4gb3B0aW9uYWwKLSAgICAgKiAgc2V0IG9mIGxvY2FsaXplZCBtZXNzYWdlIHN0cmluZ3MgdGhhdCBhcmUgcmVhZCBmcm9tIHByb3BlcnRpZXMKLSAgICAgKiAgZmlsZXMuCi0gICAgICogCi0gICAgICogIEBwYXJhbSBrZXkgdGhlIGtleSB1c2VkIHRvIGxvY2F0ZSB0aGUgbWVzc2FnZQotICAgICAqICBAcmV0dXJuIHRoZSBsb2NhbGl6ZWQgbWVzc2FnZSBmb3IgdGhlIGtleSwgb3IgYSBwbGFjZWhvbGRlcgotICAgICAqICBpZiBubyBtZXNzYWdlIGlzIGRlZmluZWQgZm9yIHRoZSBrZXkuCi0gICAgICogCi0gICAgICogIEBzaW5jZSAzLjAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGtleSk7Ci0gICAgLyoqCi0gICAgICogIFJldHVybnMgY29tcG9uZW50IHN0cmluZ3MgZm9yIHRoZSBjb21wb25lbnQuCi0gICAgICogCi0gICAgICogIEBzaW5jZSAzLjAKLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgSU1lc3NhZ2VzIGdldE1lc3NhZ2VzKCk7Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0aGUge0BsaW5rIElOYW1lc3BhY2V9IGluIHdoaWNoIHRoZSBjb21wb25lbnQgd2FzIGRlZmluZWQKLSAgICAgKiAgKGFzIGFuIGFsaWFzKS4gIAotICAgICAqIAotICAgICAqICBAc2luY2UgMi4yCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIElOYW1lc3BhY2UgZ2V0TmFtZXNwYWNlKCk7Ci0KLSAgICAvKioKLSAgICAgKiAgU2V0cyB0aGUge0BsaW5rIElOYW1lc3BhY2V9IGZvciB0aGUgY29tcG9uZW50LiAgVGhlIG5hbWVzcGFjZQotICAgICAqICBzaG91bGQgb25seSBiZSBzZXQgb25jZS4KLSAgICAgKiAKLSAgICAgKiAgQHNpbmNlIDIuMgotICAgICAqIAotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIHNldE5hbWVzcGFjZShJTmFtZXNwYWNlIG5hbWVzcGFjZSk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogIFNldHMgYSBwcm9wZXJ0eSBvZiBhIGNvbXBvbmVudC4KLSAgICAgKiAgQHBhcmFtIHByb3BlcnR5TmFtZSB0aGUgcHJvcGVydHkgbmFtZQotICAgICAqICBAcGFyYW0gdmFsdWUgdGhlIHByb3ZpZGVkIHZhbHVlCi0gICAgICovCi0JcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IHZhbHVlKTsKLQkKLQkvKioKLQkgKiAgR2V0cyBhIHByb3BlcnR5IG9mIGEgY29tcG9uZW50LgotCSAqICBAcGFyYW0gcHJvcGVydHlOYW1lIHRoZSBwcm9wZXJ0eSBuYW1lCi0JICogIEByZXR1cm4gT2JqZWN0IHRoZSB2YWx1ZSBvZiBwcm9wZXJ0eQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSk7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvSURpcmVjdC5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L0lEaXJlY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRjOTVjNi4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvSURpcmVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnk7Ci0KLS8qKgotICogIEludGVyZmFjZSB0aGF0IGRlZmluZXMgY2xhc3NlcyB0aGF0IG1heSBiZSBtZXNzYWdlZCBieSB0aGUgZGlyZWN0Ci0gKiAgc2VydmljZS4KLSAqCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogIEB2ZXJzaW9uICRJZCQKLSAqKi8KLQotcHVibGljIGludGVyZmFjZSBJRGlyZWN0IGV4dGVuZHMgSUNvbXBvbmVudAotewotICAgIC8qKgotICAgICAqICBJbnZva2VkIGJ5IHRoZSBkaXJlY3Qgc2VydmljZSB0byBoYXZlIHRoZSBjb21wb25lbnQgcGVmb3JtCi0gICAgICogIHRoZSBhcHByb3ByaWF0ZSBhY3Rpb24uICBUaGUge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkubGluay5EaXJlY3RMaW5rfSBjb21wb25lbnQgd2lsbAotICAgICAqICBub3RpZnkgaXRzIGxpc3RlbmVyLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgdHJpZ2dlcihJUmVxdWVzdEN5Y2xlIGN5Y2xlKTsKLQotICAgIC8qKgotICAgICAqICBJbnZva2VkIGJ5IHRoZSBkaXJlY3Qgc2VydmljZSB0byBxdWVyeSB0aGUgY29tcG9uZW50IGFzIHRvCi0gICAgICogIHdoZXRoZXIgaXQgaXMgc3RhdGVmdWwuICBJZiBzdGF0ZWZ1bCBhbmQgbm8gCi0gICAgICogIHtAbGluayBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb259IGlzIGFjdGl2ZSwgdGhlbiBhCi0gICAgICogIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LlN0YWxlU2Vzc2lvbkV4Y2VwdGlvbn0gaXMKLSAgICAgKiAgdGhyb3duIGJ5IHRoZSBzZXJ2aWNlLgotICAgICAqIAotICAgICAqICBAc2luY2UgMi4zCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIGJvb2xlYW4gaXNTdGF0ZWZ1bCgpOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L0lFbmdpbmUuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9JRW5naW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNDAwMTIuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L0lFbmdpbmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4NiArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuYXNzZXQuUmVzb3VyY2VDaGVja3N1bVNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmVuZ2luZS5JQ29tcG9uZW50Q2xhc3NFbmhhbmNlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmVuZ2luZS5JQ29tcG9uZW50TWVzc2FnZXNTb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5lbmdpbmUuSUVuZ2luZVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5lbmdpbmUuSVBhZ2VSZWNvcmRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmVuZ2luZS5JUGFnZVNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmVuZ2luZS5JUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5lbmdpbmUuSVNjcmlwdFNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmVuZ2luZS5JU3BlY2lmaWNhdGlvblNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmVuZ2luZS5JVGVtcGxhdGVTb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5yZXF1ZXN0LlJlcXVlc3RDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuc3BlYy5JQXBwbGljYXRpb25TcGVjaWZpY2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkudXRpbC5pby5EYXRhU3F1ZWV6ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS51dGlsLnBvb2wuUG9vbDsKLQotLyoqCi0gKiBEZWZpbmVzIHRoZSBjb3JlLCBzZXNzaW9uLXBlcnNpc3RhbnQgb2JqZWN0IHVzZWQgdG8gcnVuIGEgVGFwZXN0cnkKLSAqIGFwcGxpY2F0aW9uIGZvciBhIHNpbmdsZSBjbGllbnQgKGVhY2ggY2xpZW50IHdpbGwgaGF2ZSBpdHMgb3duIGluc3RhbmNlIG9mIHRoZSBlbmdpbmUpLgotICoKLSAqIDxwPlRoZSBlbmdpbmUgZXhpc3RzIHRvIHByb3ZpZGUgY29yZSBzZXJ2aWNlcyB0byB0aGUgcGFnZXMgYW5kIGNvbXBvbmVudHMKLSAqIHRoYXQgbWFrZSB1cCB0aGUgYXBwbGljYXRpb24uICBUaGUgZW5naW5lIGlzIGEgZGVsZWdhdGUgdG8gdGhlCi0gKiB7QGxpbmsgQXBwbGljYXRpb25TZXJ2bGV0fSB2aWEgdGhlIHtAbGluayAjc2VydmljZShSZXF1ZXN0Q29udGV4dCl9IG1ldGhvZC4KLSAqCi0gKiA8cD5FbmdpbmUgaW5zdGFuY2VzIGFyZSBwZXJzaXN0ZWQgaW4gdGhlIHtAbGluayBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb259IGFuZCBhcmUgc2VyaWFsaXphYmxlLgotICoKLSAqIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqIEB2ZXJzaW9uICRJZCQKLSAqKi8KLQotcHVibGljIGludGVyZmFjZSBJRW5naW5lCi17Ci0gICAgLyoqCi0gICAgICogIFRoZSBuYW1lICgiSG9tZSIpIG9mIHRoZSBkZWZhdWx0IHBhZ2UgcHJlc2VudGVkIHdoZW4gYSB1c2VyIGZpcnN0IGFjY2Vzc2VzIHRoZQotICAgICAqICBhcHBsaWNhdGlvbi4KLSAgICAgKgotICAgICAqICBAc2VlIG9yZy5hcGFjaGUudGFwZXN0cnkuZW5naW5lLkhvbWVTZXJ2aWNlCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSE9NRV9QQUdFID0gIkhvbWUiOwotCi0gICAgLyoqCi0gICAgICogIFRoZSBuYW1lICgiRXhjZXB0aW9uIikgb2YgdGhlIHBhZ2UgdXNlZCBmb3IgcmVwb3J0aW5nIGV4Y2VwdGlvbnMuCi0gICAgICogIAotICAgICAqICA8cD5TdWNoIGEgcGFnZSBtdXN0IGhhdmUKLSAgICAgKiAgYSB3cml0YWJsZSBKYXZhQmVhbnMgcHJvcGVydHkgbmFtZWQgJ2V4Y2VwdGlvbicgb2YgdHlwZSAKLSAgICAgKiA8Y29kZT5qYXZhLmxhbmcuVGhyb3dhYmxlPC9jb2RlPi4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYQ0VQVElPTl9QQUdFID0gIkV4Y2VwdGlvbiI7Ci0KLSAgICAvKioKLSAgICAgKiAgVGhlIG5hbWUgKCJTdGFsZUxpbmsiKSBvZiB0aGUgcGFnZSB1c2VkIGZvciByZXBvcnRpbmcgc3RhbGUgbGlua3MuCi0gICAgICoKLSAgICAgKiAgPHA+VGhlIHBhZ2UgbXVzdCBpbXBsZW1lbnQgYSB3cml0ZWFibGUgSmF2YUJlYW5zIHByb2VwcnR5IG5hbWVkCi0gICAgICogICdtZXNzYWdlJyBvZiB0eXBlIDxjb2RlPlN0cmluZzwvY29kZT4uCi0gICAgICoKLSAgICAgKiovIAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBTEVfTElOS19QQUdFID0gIlN0YWxlTGluayI7Ci0gICAgCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgYSByZWNvcmRlciBmb3IgYSBwYWdlLiAgUmV0dXJucyBudWxsIGlmIHRoZSBwYWdlIHJlY29yZGVyIGhhcwotICAgICAqICBub3QgYmVlbiBjcmVhdGVkIHlldC4KLSAgICAgKgotICAgICAqICBAc2VlICNjcmVhdGVQYWdlUmVjb3JkZXIoU3RyaW5nLCBJUmVxdWVzdEN5Y2xlKQotICAgICAqIAotICAgICAqKi8KLQotICAgIHB1YmxpYyBJUGFnZVJlY29yZGVyIGdldFBhZ2VSZWNvcmRlcihTdHJpbmcgcGFnZU5hbWUsIElSZXF1ZXN0Q3ljbGUgY3ljbGUpOwotCi0gICAgLyoqCi0gICAgICogIFRoZSBuYW1lICgiU3RhbGVTZXNzaW9uIikgb2YgdGhlIHBhZ2UgdXNlZCBmb3IgcmVwb3J0aW5nIHN0YXRlIHNlc3Npb25zLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBTEVfU0VTU0lPTl9QQUdFID0gIlN0YWxlU2Vzc2lvbiI7Ci0KLSAgICAvKioKLSAgICAgKiAgRm9yZ2V0cyBjaGFuZ2VzIHRvIHRoZSBuYW1lZCBwYWdlIGJ5IGRpc2NhcmRpbmcgdGhlIHBhZ2UgcmVjb3JkZXIgZm9yIHRoZSBwYWdlLgotICAgICAqICBUaGlzIGlzIHVzZWQgd2hlbiB0cmFuc2l0aW9uaW5nIGZyb20gb25lIHBhcnQKLSAgICAgKiAgb2YgYW4gYXBwbGljYXRpb24gdG8gYW5vdGhlci4gIEFsbCBwcm9wZXJ0eSBjaGFuZ2VzIGZvciB0aGUgcGFnZSBhcmUgbG9zdC4KLSAgICAgKgotICAgICAqICA8cD5UaGlzIHNob3VsZCBiZSBkb25lIGlmIHRoZSBwYWdlIGlzIG5vIGxvbmdlciBuZWVkZWQgb3IgcmVsZXZhbnQsIG90aGVyd2lzZQotICAgICAqICB0aGUgcHJvcGVydGllcyBmb3IgdGhlIHBhZ2Ugd2lsbCBjb250aW51ZSB0byBiZSByZWNvcmRlZCBieSB0aGUgZW5naW5lLCB3aGljaAotICAgICAqICBpcyB3YXN0ZWZ1bCAoZXNwZWNpYWxseSBpZiBjbHVzdGVyaW5nIG9yIGZhaWxvdmVyIGlzIGVtcGxveWVkIG9uIHRoZSBhcHBsaWNhdGlvbikuCi0gICAgICoKLSAgICAgKiAgPHA+VGhyb3dzIGFuIHtAbGluayBBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb259IGlmIHRoZXJlIGFyZSB1bmNvbW1pdHRlZCBjaGFuZ2VzCi0gICAgICogIGZvciB0aGUgcmVjb3JkZXIgKGluIHRoZSBjdXJyZW50IHJlcXVlc3QgY3ljbGUpLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgZm9yZ2V0UGFnZShTdHJpbmcgbmFtZSk7Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0aGUgbG9jYWxlIGZvciB0aGUgZW5naW5lLiAgVGhpcyBsb2NhbGUgaXMgdXNlZCB3aGVuIHNlbGVjdGluZwotICAgICAqICB0ZW1wbGF0ZXMgYW5kIGFzc2V0cy4KLSAgICAgKiovCi0KLSAgICBwdWJsaWMgTG9jYWxlIGdldExvY2FsZSgpOwotCi0gICAgLyoqCi0gICAgICogIENoYW5nZXMgdGhlIGVuZ2luZSdzIGxvY2FsZS4gIEFueSBzdWJzZXF1ZW50bHkgbG9hZGVkIHBhZ2VzIHdpbGwgYmUKLSAgICAgKiAgaW4gdGhlIG5ldyBsb2NhbGUgKHRob3VnaCBwYWdlcyBhbHJlYWR5IGxvYWRlZCBzdGF5IGluIHRoZSBvbGQgbG9jYWxlKS4KLSAgICAgKiAgR2VuZXJhbGx5LCB5b3Ugc2hvdWxkIHJlbmRlciBhIG5ldyBwYWdlIGFmdGVyIGNoYW5naW5nIHRoZSBsb2NhbGUsIHRvCi0gICAgICogIHNob3cgdGhhdCB0aGUgbG9jYWxlIGhhcyBjaGFuZ2VkLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgc2V0TG9jYWxlKExvY2FsZSB2YWx1ZSk7Ci0KLQotCi0gICAgLyoqCi0gICAgICogIENyZWF0ZXMgYSBuZXcgcGFnZSByZWNvcmRlciBmb3IgdGhlIG5hbWVkIHBhZ2UuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgSVBhZ2VSZWNvcmRlciBjcmVhdGVQYWdlUmVjb3JkZXIoU3RyaW5nIHBhZ2VOYW1lLCBJUmVxdWVzdEN5Y2xlIGN5Y2xlKTsKLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIHRoZSBvYmplY3QgdXNlZCB0byBsb2FkIGEgcGFnZSBmcm9tIGl0cyBzcGVjaWZpY2F0aW9uLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIElQYWdlU291cmNlIGdldFBhZ2VTb3VyY2UoKTsKLQotICAgIC8qKgotICAgICAqICBHZXRzIHRoZSBuYW1lZCBzZXJ2aWNlLCBvciB0aHJvd3MgYW4ge0BsaW5rCi0gICAgICogIG9yZy5hcGFjaGUudGFwZXN0cnkuQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9ufSAKLSAgICAgKiAgaWYgdGhlIGFwcGxpY2F0aW9uIGNhbid0IHByb3ZpZGUKLSAgICAgKiAgdGhlIG5hbWVkIHNlcnZlci4KLSAgICAgKgotICAgICAqICA8cD5UaGUgb2JqZWN0IHJldHVybmVkIGhhcyBhIHNob3J0IGxpZmVjeWNsZSAoaXQgaXNuJ3QKLSAgICAgKiAgc2VyaWFsaXplZCB3aXRoIHRoZSBlbmdpbmUpLiAgUmVwZWF0ZWQgY2FsbHMgd2l0aCB0aGUKLSAgICAgKiAgc2FtZSBuYW1lIGFyZSBub3QgZ3VhcmVudGVlZCB0byByZXR1cm4gdGhlIHNhbWUgb2JqZWN0LAotICAgICAqICBlc3BlY2lhbGx5IGluIGRpZmZlcmVudCByZXF1ZXN0IGN5Y2xlcy4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBJRW5naW5lU2VydmljZSBnZXRTZXJ2aWNlKFN0cmluZyBuYW1lKTsKLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIHRoZSBVUkwgcGF0aCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBzZXJ2bGV0IGZvciB0aGUgYXBwbGljYXRpb24uICAKLSAgICAgKiAgVGhpcyBpcyByZXF1aXJlZCBieSBpbnN0YW5jZXMgb2Yge0BsaW5rIElFbmdpbmVTZXJ2aWNlfSB0aGF0IG5lZWQgCi0gICAgICogIHRvIGNvbnN0cnVjdCBVUkxzIGZvciB0aGUgYXBwbGljYXRpb24uICBUaGlzIHZhbHVlIHdpbGwgaW5jbHVkZQotICAgICAqICB0aGUgY29udGV4dCBwYXRoLgotICAgICAqKi8KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmxldFBhdGgoKTsKLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIHRoZSBjb250ZXh0IHBhdGgsIGEgc3RyaW5nIHdoaWNoIGlzIHByZXBlbmRlZCB0byB0aGUgbmFtZXMgb2YKLSAgICAgKiAgYW55IGFzc2V0cyBvciBzZXJ2bGV0cy4gIFRoaXMgbWF5IGJlIHRoZSBlbXB0eSBzdHJpbmcsIGJ1dCB3b24ndCBiZSBudWxsLgotICAgICAqCi0gICAgICogIDxwPlRoaXMgdmFsdWUgaXMgb2J0YWluZWQgZnJvbSAKLSAgICAgKiAge0BsaW5rIGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3QjZ2V0Q29udGV4dFBhdGgoKX0uCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIFN0cmluZyBnZXRDb250ZXh0UGF0aCgpOwotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgdGhlIGFwcGxpY2F0aW9uIHNwZWNpZmljYXRpb24gdGhhdCBkZWZpbmVzIHRoZSBhcHBsaWNhdGlvbgotICAgICAqICBhbmQgaXRzIHBhZ2VzLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIElBcHBsaWNhdGlvblNwZWNpZmljYXRpb24gZ2V0U3BlY2lmaWNhdGlvbigpOwotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgdGhlIHNvdXJjZSBvZiBhbGwgY29tcG9uZW50IHNwZWNpZmljYXRpb25zIGZvciB0aGUgYXBwbGljYXRpb24uICAKLSAgICAgKiAgVGhlIHNvdXJjZSBpcyBzaGFyZWQgYmV0d2VlbiBzZXNzaW9ucy4KLSAgICAgKgotICAgICAqICBAc2VlIG9yZy5hcGFjaGUudGFwZXN0cnkuZW5naW5lLkFic3RyYWN0RW5naW5lI2NyZWF0ZVNwZWNpZmljYXRpb25Tb3VyY2UoUmVxdWVzdENvbnRleHQpCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIElTcGVjaWZpY2F0aW9uU291cmNlIGdldFNwZWNpZmljYXRpb25Tb3VyY2UoKTsKLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIHRoZSBzb3VyY2UgZm9yIEhUTUwgdGVtcGxhdGVzLgotICAgICAqCi0gICAgICogIEBzZWUgIG9yZy5hcGFjaGUudGFwZXN0cnkuZW5naW5lLkFic3RyYWN0RW5naW5lI2NyZWF0ZVRlbXBsYXRlU291cmNlKFJlcXVlc3RDb250ZXh0KQotICAgICAqIAotICAgICAqKi8KLQotICAgIHB1YmxpYyBJVGVtcGxhdGVTb3VyY2UgZ2V0VGVtcGxhdGVTb3VyY2UoKTsKLQotICAgIC8qKgotICAgICAqICBNZXRob2QgaW52b2tlZCBmcm9tIHRoZSB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5BcHBsaWNhdGlvblNlcnZsZXR9IAotICAgICAqICB0byBwZXJmb3JtIHByb2Nlc3Npbmcgb2YgdGhlCi0gICAgICogIHJlcXVlc3QuICBJbiByZWxlYXNlIDMuMCwgdGhpcyBoYXMgYmVjb21lIG1vcmUgb2YgYSBkaXJ0eSBmbGFnLCBpbmRpY2F0aW5nCi0gICAgICogIGlmIGFueSBzdGF0ZSBzdG9yZWQgYnkgdGhlIGVuZ2luZSBpbnN0YW5jZSBpdHNlbGYgaGFzIGNoYW5nZWQuCi0gICAgICoKLSAgICAgKiAgQHJldHVybiB0cnVlIGlmIHRoZSBzdGF0ZSBvZiB0aGUgZW5naW5lIHdhcywgb3IgY291bGQgaGF2ZSBiZWVuLCBjaGFuZ2VkIGR1cmluZwotICAgICAqICBwcm9jZXNzaW5nLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIGJvb2xlYW4gc2VydmljZShSZXF1ZXN0Q29udGV4dCBjb250ZXh0KSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyBhbiBvYmplY3QgdGhhdCBjYW4gcmVzb2x2ZSByZXNvdXJjZXMgYW5kIGNsYXNzZXMuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgSVJlc291cmNlUmVzb2x2ZXIgZ2V0UmVzb3VyY2VSZXNvbHZlcigpOwotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgdGhlIHZpc2l0IG9iamVjdCwgYW4gb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgY2xpZW50J3MgdmlzaXQKLSAgICAgKiAgdG8gdGhlIGFwcGxpY2F0aW9uLiAgVGhpcyBpcyB3aGVyZSBtb3N0IHNlcnZlci1zaWRlIHN0YXRlIGlzIHN0b3JlZCAod2l0aAotICAgICAqICB0aGUgZXhjZXB0aW9uIG9mIHBlcnNpc3RlbnQgcGFnZSBwcm9wZXJ0aWVzKS4KLSAgICAgKgotICAgICAqICA8cD5SZXR1cm5zIHRoZSB2aXNpdCwgaWYgaXQgZXhpc3RzLCBvciBudWxsIGlmIGl0IGhhcyBub3QgYmVlbiBjcmVhdGVkLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIE9iamVjdCBnZXRWaXNpdCgpOwotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgdGhlIHZpc2l0IG9iamVjdCwgY3JlYXRpbmcgaXQgaWYgbmVjZXNzYXJ5LgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIE9iamVjdCBnZXRWaXNpdChJUmVxdWVzdEN5Y2xlIGN5Y2xlKTsKLQotICAgIC8qKgotICAgICAqICBBbGxvd3MgdGhlIHZpc2l0IG9iamVjdCB0byBiZSByZW1vdmVkOyB0eXBpY2FsbHkgZG9uZSB3aGVuICJzaHV0dGluZyBkb3duIgotICAgICAqICBhIHVzZXIncyBzZXNzaW9uIChieSBzZXR0aW5nIHRoZSB2aXNpdCB0byBudWxsKS4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIHNldFZpc2l0KE9iamVjdCB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0aGUgZ2xvYmFsbHkgc2hhcmVkIGFwcGxpY2F0aW9uIG9iamVjdC4gVGhlIGdsb2JhbCBvYmplY3QgaXMKLSAgICAgKiAgc3RvcmVkIGluIHRoZSBzZXJ2bGV0IGNvbnRleHQgYW5kIHNoYXJlZCBieSBhbGwgaW5zdGFuY2VzIG9mIHRoZSBlbmdpbmUKLSAgICAgKiAgZm9yIHRoZSBzYW1lIGFwcGxpY2F0aW9uICh3aXRoaW4gdGhlIHNhbWUgSlZNOyB0aGUgZ2xvYmFsIGlzCi0gICAgICogIDxlbT5ub3Q8L2VtPiBzaGFyZWQgYmV0d2VlbiBub2RlcyBpbiBhIGNsdXN0ZXIpLgotICAgICAqCi0gICAgICogIDxwPlJldHVybnMgdGhlIGdsb2JhbCBvYmplY3QsIGlmIGl0IGV4aXN0cywgb3IgbnVsbCBpZiBub3QgZGVmaW5lZC4KLSAgICAgKgotICAgICAqICBAc2luY2UgMi4zCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIE9iamVjdCBnZXRHbG9iYWwoKTsKLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIHRydWUgaWYgdGhlIGFwcGxpY2F0aW9uIGFsbG93cyB0aGUgcmVzZXQgc2VydmljZS4KLSAgICAgKgotICAgICAqICBAc2luY2UgMC4yLjkKLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Jlc2V0U2VydmljZUVuYWJsZWQoKTsKLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIGEgc291cmNlIGZvciBwYXJzZWQgCi0gICAgICogIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LklTY3JpcHR9cy4gIFRoZSBzb3VyY2UgaXMgCi0gICAgICogIHNoYXJlZCBiZXR3ZWVuIGFsbCBzZXNzaW9ucy4KLSAgICAgKgotICAgICAqICBAc2luY2UgMS4wLjIKLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBJU2NyaXB0U291cmNlIGdldFNjcmlwdFNvdXJjZSgpOwotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgdHJ1ZSBpZiB0aGUgZW5naW5lIGhhcyBzdGF0ZSBhbmQsIHRoZXJlZm9yZSwgc2hvdWxkIGJlIHN0b3JlZAotICAgICAqICBpbiB0aGUgSHR0cFNlc3Npb24uICBUaGlzIHN0YXJ0cyBhcyBmYWxzZSwgYnV0IGJlY29tZXMgdHJ1ZSB3aGVuCi0gICAgICogIHRoZSBlbmdpbmUgcmVxdWlyZXMgc3RhdGUgKHN1Y2ggYXMgd2hlbiBhIHZpc2l0IG9iamVjdCBpcyBjcmVhdGVkLAotICAgICAqICBvciB3aGVuIGEgcGVyaXN0ZW50IHBhZ2UgcHJvcGVydHkgaXMgc2V0KS4KLSAgICAgKgotICAgICAqICBAc2luY2UgMS4wLjIKLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBib29sZWFuIGlzU3RhdGVmdWwoKTsKLQotCS8qKgotCSAqICBSZXR1cm5zIGEgc2hhcmVkIG9iamVjdCB0aGF0IGFsbG93cyBjb21wb25lbnRzIHRvIGZpbmQKLQkgKiAgdGhlaXIgc2V0IG9mIGxvY2FsaXplZCBzdHJpbmdzLgotCSAqIAotCSAqICBAc2luY2UgMi4wLjQKLQkgKiAKLSAgICAgKiAgQHNlZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmVuZ2luZS5BYnN0cmFjdEVuZ2luZSNjcmVhdGVDb21wb25lbnRTdHJpbmdzU291cmNlKFJlcXVlc3RDb250ZXh0KQotICAgICAqIAotCSAqKi8KLQkKLQlwdWJsaWMgSUNvbXBvbmVudE1lc3NhZ2VzU291cmNlIGdldENvbXBvbmVudE1lc3NhZ2VzU291cmNlKCk7Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyBhIHNoYXJlZCBpbnN0YW5jZSBvZiB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS51dGlsLmlvLkRhdGFTcXVlZXplcn0uCi0gICAgICogCi0gICAgICogIEBzaW5jZSAyLjIKLSAgICAgKiAKLSAgICAgKiAgQHNlZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmVuZ2luZS5BYnN0cmFjdEVuZ2luZSNjcmVhdGVEYXRhU3F1ZWV6ZXIoKQotICAgICAqIAotICAgICAqKi8KLSAgICAKLSAgICBwdWJsaWMgRGF0YVNxdWVlemVyIGdldERhdGFTcXVlZXplcigpOwotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgYSB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5lbmdpbmUuSVByb3BlcnR5U291cmNlfSB0aGF0IHNob3VsZCBiZQotICAgICAqICB1c2VkIHRvIG9idGFpbiBjb25maWd1cmF0aW9uIGRhdGEuICBUaGUgcmV0dXJuZWQgc291cmNlIHJlcHJlc2VudHMKLSAgICAgKiAgYSBzZWFyY2ggcGF0aCB0aGF0IGluY2x1ZGVzIChhdCBhIG1pbmltdW0pOgotICAgICAqICAKLSAgICAgKiAgPHVsPgotICAgICAqICA8bGk+UHJvcGVydGllcyBvZiB0aGUge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkuc3BlYy5BcHBsaWNhdGlvblNwZWNpZmljYXRpb259Ci0gICAgICogIDxsaT5Jbml0aWFsIFBhcmFtZXRlcnMgb2Ygc2VydmxldCAoY29uZmlndXJlZCBpbiB0aGUgPGNvZGU+d2ViLnhtbDwvY29kZT4gZGVwbG95bWVudCBkZXNjcmlwdG9yKQotICAgICAqICA8bGk+SW5pdGlhbCBQYXJhbWV0ZXIgb2YgdGhlIHNlcnZsZXQgY29udGV4dCAoYWxzbyBjb25maWd1cmVkIGluIDxjb2RlPndlYi54bWw8L2NvZGU+KQotICAgICAqICA8bGk+U3lzdGVtIHByb3BlcnRpZXMgKGRlZmluZWQgd2l0aCB0aGUgPGNvZGU+LUQ8L2NvZGU+IEpWTSBjb21tYW5kIGxpbmUgcGFyYW1ldGVyKQotICAgICAqICA8bGk+SGFyZC1jb2RlZCAiZmFjdG9yeSBkZWZhdWx0cyIgKGZvciBzb21lIHByb3BlcnRpZXMpCi0gICAgICogIDwvdWw+Ci0gICAgICogCi0gICAgICogIEBzaW5jZSAyLjMKLSAgICAgKiAgQHNlZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmVuZ2luZS5BYnN0cmFjdEVuZ2luZSNjcmVhdGVQcm9wZXJ0eVNvdXJjZShSZXF1ZXN0Q29udGV4dCkKLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgSVByb3BlcnR5U291cmNlIGdldFByb3BlcnR5U291cmNlKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgYSB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS51dGlsLnBvb2wuUG9vbH0gdGhhdCBpcyB1c2VkCi0gICAgICogIHRvIHN0b3JlIGFsbCBtYW5uZXIgb2Ygb2JqZWN0cyB0aGF0IGFyZSBuZWVkZWQgdGhyb3VnaG91dCB0aGUgc3lzdGVtLgotICAgICAqICBUaGlzIGlzIHRoZSBiZXN0IHdheSB0byBkZWFsIHdpdGggb2JqZWN0cyB0aGF0IGFyZSBib3RoIGV4cGVuc2l2ZSB0bwotICAgICAqICBjcmVhdGUgYW5kIG5vdCB0aHJlYWRzYWZlLiAgVGhlIHJlc2V0IHNlcnZpY2UKLSAgICAgKiAgd2lsbCBjbGVhciBvdXQgdGhpcyBQb29sLgotICAgICAqIAotICAgICAqICBAc2luY2UgMy4wCi0gICAgICogIEBzZWUgb3JnLmFwYWNoZS50YXBlc3RyeS5lbmdpbmUuQWJzdHJhY3RFbmdpbmUjY3JlYXRlUG9vbChSZXF1ZXN0Q29udGV4dCkKLSAgICAgKiAKLSAgICAgKiovCi0gICAgCi0gICAgcHVibGljIFBvb2wgZ2V0UG9vbCgpOwotICAgIAotICAgIC8qKgotICAgICAqICBSZXR1cm5zIGFuIG9iamVjdCB0aGF0IGNhbiBjcmVhdGUgZW5oYW5jZWQgdmVyc2lvbnMgb2YgY29tcG9uZW50IGNsYXNzZXMuCi0gICAgICogCi0gICAgICogIEBzaW5jZSAzLjAKLSAgICAgKiAgQHNlZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmVuZ2luZS5BYnN0cmFjdEVuZ2luZSNjcmVhdGVDb21wb25lbnRDbGFzc0VuaGFuY2VyKFJlcXVlc3RDb250ZXh0KQotICAgICAqIAotICAgICAqKi8KLSAgICAKLSAgICBwdWJsaWMgSUNvbXBvbmVudENsYXNzRW5oYW5jZXIgZ2V0Q29tcG9uZW50Q2xhc3NFbmhhbmNlcigpOwotICAgIAotICAgIC8qKgotICAgICAqICBSZXR1cm5zIHRoZSBlbmNvZGluZyB0byBiZSB1c2VkIHRvIGdlbmVyYXRlIHRoZSBzZXJ2bGV0IHJlc3BvbnNlcyBhbmQgCi0gICAgICogIGFjY2VwdCB0aGUgc2VydmxldCByZXF1ZXN0cy4KLSAgICAgKiAKLSAgICAgKiAgQHNpbmNlIDMuMAotICAgICAqIAotICAgICAqKi8KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldE91dHB1dEVuY29kaW5nKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBvYmplY3QgdGhhdCBjYW4gY29tcHV0ZSB0aGUgY2hlY2tzdW0gb2YgYSByZXNvdXJjZS4KLSAgICAgKiBAc2luY2UgMy4wLjMKLSAgICAgKi8KLSAgICBwdWJsaWMgUmVzb3VyY2VDaGVja3N1bVNvdXJjZSBnZXRSZXNvdXJjZUNoZWNrc3VtU291cmNlKCk7Ci19CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvSUV4dGVybmFsUGFnZS5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L0lFeHRlcm5hbFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTMwNjg0NS4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvSUV4dGVybmFsUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnk7Ci0KLQotLyoqCi0gKiAgRGVmaW5lcyBhIHBhZ2Ugd2hpY2ggbWF5IGJlIHJlZmVyZW5jZWQgZXh0ZXJuYWxseSB2aWEgYSBVUkwgdXNpbmcgdGhlIAotICogIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LmVuZ2luZS5FeHRlcm5hbFNlcnZpY2V9LiBFeHRlcm5hbCBwYWdlcyBtYXkgYmUgYm9va21hcmtlZCAKLSAqICB2aWEgdGhlaXIgVVJMIGZvciBsYXR0ZXIgZGlzcGxheS4gU2VlIHRoZSAKLSAqICB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5saW5rLkV4dGVybmFsTGlua30gZm9yIGRldGFpbHMgb24gaG93IHRvIGludm9rZQotICogIDx0dD5JRXh0ZXJuYWxQYWdlPC90dD5zLgotICogCi0gKiAgQHNlZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNhbGxiYWNrLkV4dGVybmFsQ2FsbGJhY2sKLSAqICBAc2VlIG9yZy5hcGFjaGUudGFwZXN0cnkuZW5naW5lLkV4dGVybmFsU2VydmljZQotICoKLSAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiAgQGF1dGhvciBNYWxjb2xtIEVkZ2FyCi0gKiAgQHZlcnNpb24gJElkJAotICogIEBzaW5jZSAyLjIKLSAqKi8KLQotcHVibGljIGludGVyZmFjZSBJRXh0ZXJuYWxQYWdlIGV4dGVuZHMgSVBhZ2UKLXsKLSAgICAvKioKLSAgICAgKiAgSW5pdGlhbGl6ZSB0aGUgZXh0ZXJuYWwgcGFnZSB3aXRoIHRoZSBnaXZlbiBhcnJheSBvZiBwYXJhbWV0ZXJzIGFuZAotICAgICAqICByZXF1ZXN0IGN5Y2xlLgotICAgICAqICA8cD4KLSAgICAgKiAgVGhpcyBtZXRob2QgaXMgaW52b2tlZCBhZnRlciB7QGxpbmsgSVBhZ2UjdmFsaWRhdGUoSVJlcXVlc3RDeWNsZSl9LgotICAgICAqCi0gICAgICogIEBwYXJhbSBwYXJhbWV0ZXJzIHRoZSBhcnJheSBvZiBwYWdlIHBhcmFtZXRlcnMKLSAgICAgKiAgQHBhcmFtIGN5Y2xlIGN1cnJlbnQgcmVxdWVzdCBjeWNsZQotICAgICAqIAotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIGFjdGl2YXRlRXh0ZXJuYWxQYWdlKE9iamVjdFtdIHBhcmFtZXRlcnMsIElSZXF1ZXN0Q3ljbGUgY3ljbGUpOwotfQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L0lGb3JtLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvSUZvcm0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFiZTY3Yy4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvSUZvcm0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeTsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuZm9ybS5Gb3JtRXZlbnRUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuZm9ybS5JRm9ybUNvbXBvbmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnZhbGlkLklWYWxpZGF0aW9uRGVsZWdhdGU7Ci0KLS8qKgotICogIEEgZ2VuZXJpYyB3YXkgdG8gYWNjZXNzIGEgY29tcG9uZW50IHdoaWNoIGRlZmluZXMgYW4gSFRNTCBmb3JtLiAgVGhpcyBpbnRlcmZhY2UKLSAqICBleGlzdHMgc28gdGhhdCB0aGUge0BsaW5rIElSZXF1ZXN0Q3ljbGV9IGNhbiBpbnZva2UgdGhlCi0gKiAge0BsaW5rICNyZXdpbmQoSU1hcmt1cFdyaXRlciwgSVJlcXVlc3RDeWNsZSl9IG1ldGhvZCAod2hpY2ggaXMgdXNlZCB0byBkZWFsIHdpdGgKLSAqICBhIEZvcm0gdGhhdCB1c2VzIHRoZSBkaXJlY3Qgc2VydmljZSkuICBJbiByZWxlYXNlIDEuMC41LCBtb3JlIHJlc3BvbnNpYmlsaXR5Ci0gKiAgZm9yIGZvcm1zIHdhcyBtb3ZlZCBoZXJlLgotICoKLSAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiAgQHZlcnNpb24gJElkJAotICogIEBzaW5jZSAxLjAuMgotICoqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElGb3JtIGV4dGVuZHMgSUFjdGlvbgotewotCi0gICAgLyoqCi0gICAgICogIEF0dHJpYnV0ZSBuYW1lIHVzZWQgd2l0aCB0aGUgcmVxdWVzdCBjeWNsZTsgYWxsb3dzIG90aGVyIGNvbXBvbmVudHMgdG8gbG9jYXRlCi0gICAgICogIHRoZSBJRm9ybS4KLSAgICAgKgotICAgICAqICBAc2luY2UgMS4wLjUKLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfTkFNRSA9ICJvcmcuYXBhY2hlLnRhcGVzdHJ5LmFjdGl2ZS5Gb3JtIjsKLQotICAgIC8qKgotICAgICAqICBJbnZva2VkIGJ5IHRoZSB7QGxpbmsgSVJlcXVlc3RDeWNsZX0gdG8gYWxsb3cgYSBmb3JtIHRoYXQgdXNlcwotICAgICAqICB0aGUgZGlyZWN0IHNlcnZpY2UsIHRvIHJlc3BvbmQgdG8gdGhlIGZvcm0gc3VibWlzc2lvbi4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIHJld2luZChJTWFya3VwV3JpdGVyIHdyaXRlciwgSVJlcXVlc3RDeWNsZSBjeWNsZSk7Ci0KLSAgICAvKioKLSAgICAgKiAgQWRkcyBhbiBhZGRpdGlvbmFsIGV2ZW50IGhhbmRsZXIuICBUaGUgdHlwZSBkZXRlcm1pbmVzIHdoZW4gdGhlCi0gICAgICogIGhhbmRsZXIgd2lsbCBiZSBpbnZva2VkLCB7QGxpbmsgRm9ybUV2ZW50VHlwZSNTVUJNSVR9Ci0gICAgICogIGlzIG1vc3QgdHlwaWNhbC4KLSAgICAgKgotICAgICAqIEBzaW5jZSAxLjAuNQotICAgICAqIAotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIGFkZEV2ZW50SGFuZGxlcihGb3JtRXZlbnRUeXBlIHR5cGUsIFN0cmluZyBmdW5jdGlvbk5hbWUpOwotCi0gICAgLyoqCi0gICAgICogIENvbnN0cnVjdHMgYSB1bmlxdWUgaWRlbnRpZmllciAod2l0aGluIHRoZSBGb3JtKS4gIFRoZSBpZGVudGlmaWVyCi0gICAgICogIGNvbnNpc3RzIG9mIHRoZSBjb21wb25lbnQncyBpZCwgd2l0aCBhbiBpbmRleCBudW1iZXIgYWRkZWQgdG8KLSAgICAgKiAgZW5zdXJlIHVuaXF1ZW5lc3MuCi0gICAgICoKLSAgICAgKiAgPHA+U2ltcGx5IGludm9rZXMge0BsaW5rICNnZXRFbGVtZW50SWQoSUZvcm1Db21wb25lbnQsIFN0cmluZyl9IHdpdGggdGhlIGNvbXBvbmVudCdzIGlkLgotICAgICAqCi0gICAgICoKLSAgICAgKiAgQHNpbmNlIDEuMC41Ci0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIFN0cmluZyBnZXRFbGVtZW50SWQoSUZvcm1Db21wb25lbnQgY29tcG9uZW50KTsKLQotICAgIC8qKgotICAgICAqICBDb25zdHJ1Y3RzIGEgdW5pcXVlIGlkZW50aWZpZXIgZnJvbSB0aGUgYmFzZSBpZC4gIElmIHBvc3NpYmxlLCB0aGUKLSAgICAgKiAgaWQgaXMgdXNlZCBhcy1pcy4gIE90aGVyd2lzZSwgYSB1bmlxdWUgaWRlbnRpZmllciBpcyBhcHBlbmRlZAotICAgICAqICB0byB0aGUgaWQuCi0gICAgICoKLSAgICAgKiAgPHA+VGhpcyBtZXRob2QgaXMgcHJvdmlkZWQgc2ltcGx5IHNvIHRoYXQgc29tZSBjb21wb25lbnRzCi0gICAgICogICh7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5mb3JtLkltYWdlU3VibWl0fSkgaGF2ZSBtb3JlIHNwZWNpZmljIGNvbnRyb2wgb3ZlcgotICAgICAqICB0aGVpciBuYW1lcy4KLSAgICAgKiAKLSAgICAgKiAgPHA+SW52b2tlcyB7QGxpbmsgSUZvcm1Db21wb25lbnQjc2V0TmFtZShTdHJpbmcpfSB3aXRoIHRoZSByZXN1bHQsIGFzIHdlbGwKLSAgICAgKiAgYXMgcmV0dXJuaW5nIGl0LgotICAgICAqIAotICAgICAqICBAdGhyb3dzIFN0YWxlTGlua0V4Y2VwdGlvbiBpZiwgd2hlbiB0aGUgZm9ybSBpdHNlbGYgaXMgcmV3aW5kaW5nLCB0aGUKLSAgICAgKiAgZWxlbWVudCBpZCBhbGxvY2F0ZWQgZG9lcyBub3QgbWF0Y2ggdGhlIGV4cGVjdGVkIGlkIChhcyBhbGxvY2F0ZWQgd2hlbiB0aGUgZm9ybSByZW5kZXJlZCkuCi0gICAgICogIFRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlIHN0YXRlIG9mIHRoZSBhcHBsaWNhdGlvbiBoYXMgY2hhbmdlZCBiZXR3ZWVuIHRoZSB0aW1lIHRoZQotICAgICAqICBmb3JtIHJlbmRlcnJlZCBhbmQgdGhlIHRpbWUgaXQgd2FzIHN1Ym1pdHRlZC4KLSAgICAgKgotICAgICAqICBAc2luY2UgMS4wLjUKLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudElkKElGb3JtQ29tcG9uZW50IGNvbXBvbmVudCwgU3RyaW5nIGJhc2VJZCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBmb3JtLgotICAgICAqCi0gICAgICogIEBzaW5jZSAxLjAuNQotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCk7Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0cnVlIGlmIHRoZSBmb3JtIGlzIHJld2luZGluZyAobWVhbmluZywgdGhlIGZvcm0gd2FzIHRoZSBzdWJqZWN0Ci0gICAgICogIG9mIHRoZSByZXF1ZXN0IGN5Y2xlKS4KLSAgICAgKgotICAgICAqICBAc2luY2UgMS4wLjUKLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBib29sZWFuIGlzUmV3aW5kaW5nKCk7Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0aGUgdmFsaWRhdGlvbiBkZWxlZ2F0ZSBmb3IgdGhlIGZvcm0uCi0gICAgICogIFJldHVybnMgbnVsbCBpZiB0aGUgZm9ybSBkb2VzIG5vdCBoYXZlIGEgZGVsZWdhdGUuCi0gICAgICogCi0gICAgICogIEBzaW5jZSAxLjAuOAotICAgICAqIAotICAgICAqKi8KLQotICAgIHB1YmxpYyBJVmFsaWRhdGlvbkRlbGVnYXRlIGdldERlbGVnYXRlKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogIE1heSBiZSBpbnZva2VkIGJ5IGEgY29tcG9uZW50IHRvIGZvcmNlIHRoZSBlbmNvZGluZyB0eXBlIG9mIHRoZQotICAgICAqICBmb3JtIHRvIGEgcGFydGljdWxhciB2YWx1ZS4KLSAgICAgKiAKLSAgICAgKiAgQHNlZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmZvcm0uVXBsb2FkCi0gICAgICogIEB0aHJvd3MgQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uIGlmIHRoZSBjdXJyZW50IGVuY29kaW5nIHR5cGUgaXMgbm90IG51bGwKLSAgICAgKiAgYW5kIGRvZXNuJ3QgbWF0Y2ggdGhlIHN1Z2dlc3RlZCBlbmNvZGluZyB0eXBlCi0gICAgICogIEBzaW5jZSAzLjAKLSAgICAgKiAKLSAgICAgKiovCi0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0RW5jb2RpbmdUeXBlKFN0cmluZyBlbmNvZGluZ1R5cGUpOwotICAgIAotICAgIAotICAgIC8qKgotICAgICAqIEFkZHMgYSBoaWRkZW4gZmllbGQgdmFsdWUgdG8gYmUgc3RvcmVkIGluIHRoZSBmb3JtLiBUaGlzIGVuc3VyZXMgdGhhdCBhbGwKLSAgICAgKiBvZiB0aGUgJmx0O2lucHV0IHR5cGU9ImhpZGRlbiImZ3Q7IChvciBlcXVpdmFsZW50KSBhcmUgZ3JvdXBlZCB0b2dldGhlciwgCi0gICAgICogd2hpY2ggZW5zdXJlcyB0aGF0IHRoZSBvdXRwdXQgSFRNTCBpcyB2YWxpZCAoaWUuIGRvZXNuJ3QgCi0gICAgICogaGF2ZSAmbHQ7aW5wdXQmZ3Q7IGltcHJvcGVybHkgbmVzdGVkIHdpdGggJmx0O3RyJmd0OywgZXRjLikuCi0gICAgICogCi0gICAgICogPHA+Ci0gICAgICogSXQgaXMgYWNjZXB0aWJsZSB0byBhZGQgbXVsdGlwbGUgaGlkZGVuIGZpZWxkcyB3aXRoIHRoZSBzYW1lIG5hbWUuCi0gICAgICogVGhleSB3aWxsIGJlIHdyaXR0ZW4gaW4gdGhlIG9yZGVyIHRoZXkgYXJlIHJlY2VpdmVkLgotICAgICAqIAotICAgICAqIEBzaW5jZSAzLjAKLSAgICAgKi8KLQotCXB1YmxpYyB2b2lkIGFkZEhpZGRlblZhbHVlKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQWRkcyBhIGhpZGRlbiBmaWVsZCB2YWx1ZSB0byBiZSBzdG9yZWQgaW4gdGhlIGZvcm0uIFRoaXMgZW5zdXJlcyB0aGF0IGFsbAotCSAqIG9mIHRoZSAmbHQ7aW5wdXQgdHlwZT0iaGlkZGVuIiZndDsgKG9yIGVxdWl2YWxlbnQpIGFyZSBncm91cGVkIHRvZ2V0aGVyLCAKLQkgKiB3aGljaCBlbnN1cmVzIHRoYXQgdGhlIG91dHB1dCBIVE1MIGlzIHZhbGlkIChpZS4gZG9lc24ndCAKLQkgKiBoYXZlICZsdDtpbnB1dCZndDsgaW1wcm9wZXJseSBuZXN0ZWQgd2l0aCAmbHQ7dHImZ3Q7LCBldGMuKS4KLQkgKiAKLQkgKiA8cD4KLQkgKiBJdCBpcyBhY2NlcHRpYmxlIHRvIGFkZCBtdWx0aXBsZSBoaWRkZW4gZmllbGRzIHdpdGggdGhlIHNhbWUgbmFtZS4KLQkgKiBUaGV5IHdpbGwgYmUgd3JpdHRlbiBpbiB0aGUgb3JkZXIgdGhleSBhcmUgcmVjZWl2ZWQuCi0JICogCi0JICogQHNpbmNlIDMuMAotCSAqLwotCi0JcHVibGljIHZvaWQgYWRkSGlkZGVuVmFsdWUoU3RyaW5nIG5hbWUsIFN0cmluZyBpZCwgU3RyaW5nIHZhbHVlKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvSUxvY2F0YWJsZS5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L0lMb2NhdGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDI3NTJlMS4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvSUxvY2F0YWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnk7Ci0KLS8qKgotICogIEludGVyZmFjZSBmb3IgY2xhc3NlcyB0aGF0IG1heSBiZSBsaW5rZWQgdG8gYSBzcGVjaWZpYwotICogIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LklMb2NhdGlvbiBsb2NhdGlvbn0uICBUaGlzCi0gKiAgaXMgcHJpbWFyaWx5IHVzZWQgd2hlbiByZXBvcnRpbmcgZXJyb3JzLgotICoKLSAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiAgQHZlcnNpb24gJElkJAotICogIEBzaW5jZSAzLjAKLSAqCi0gKiovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSUxvY2F0YWJsZQotewotCS8qKgotCSAqICBSZXR1cm5zIHRoZSB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5JTG9jYXRpb24gbG9jYXRpb259IGZyb20gd2hpY2gKLQkgKiAgdGhpcyBvYmplY3Qgb3JnaW5hdGVzLCBvciBudWxsIGlmIG5vdCBrbm93bi4KLQkgKiAKLQkgKiovCi0JCi0JcHVibGljIElMb2NhdGlvbiBnZXRMb2NhdGlvbigpOwotfQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L0lMb2NhdGlvbi5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L0lMb2NhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2U5ZGRkLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9JTG9jYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5OwotCi0vKioKLSAqICBUT0RPIEFkZCBUeXBlIGNvbW1lbnQKLSAqIAotICogQGF1dGhvciBnbG9uZ21hbkBpbnRlbGxpZ2VudHdvcmtzLmNvbQotICogQHZlcnNpb24gJElkJAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElMb2NhdGlvbgotewotICAgIHB1YmxpYyBhYnN0cmFjdCBJUmVzb3VyY2VMb2NhdGlvbiBnZXRSZXNvdXJjZUxvY2F0aW9uKCk7Ci0gICAgcHVibGljIGFic3RyYWN0IGludCBnZXRMaW5lTnVtYmVyKCk7Ci0gICAgcHVibGljIGFic3RyYWN0IGludCBnZXRDb2x1bW5OdW1iZXIoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvSUxvY2F0aW9uSG9sZGVyLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvSUxvY2F0aW9uSG9sZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmZDlmZTEuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L0lMb2NhdGlvbkhvbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnk7Ci0KLS8qKgotICogIEludGVyZmFjZSBmb3Igb2JqZWN0cyB0aGF0IGFyZQotICogIHJlYWQgZnJvbSByZXNvdXJjZSBmaWxlcywgdXNlZCB0byBiYWNrdHJhY2UKLSAqICBsaXZlIG9iamVjdHMgdG8gdGhlIHJlc291cmNlcyB0aGV5Ci0gKiAgY2FtZSBmcm9tLiAKLSAqCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogIEB2ZXJzaW9uICRJZCQKLSAqICBAc2luY2UgMy4wCi0gKgotICoqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElMb2NhdGlvbkhvbGRlciBleHRlbmRzIElMb2NhdGFibGUKLXsKLSAgICBwdWJsaWMgdm9pZCBzZXRMb2NhdGlvbihJTG9jYXRpb24gbG9jYXRpb24pOwotfQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L0lNYXJrdXBXcml0ZXIuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9JTWFya3VwV3JpdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkYTZiNjYuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L0lNYXJrdXBXcml0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MyArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeTsKLQotLyoqCi0gKiAgRGVmaW5lcyBhbiBvYmplY3QgdGhhdCBjYW4gd3JpdGUgbWFya3VwIChYTUwsIEhUTUwsIFhIVE1MKSBzdHlsZSBvdXRwdXQuCi0gKiAgQSA8Y29kZT5JTWFya3VwV3JpdGVyPC9jb2RlPiBoYW5kbGVzIHRyYW5zbGF0aW9uIGZyb20gdW5pY29kZSB0bwotICogIHRoZSBtYXJrdXAgbGFuZ3VhZ2UgKGVzY2FwaW5nIGNoYXJhY3RlcnMgc3VjaCBhcyAnJmx0OycgYW5kICcmZ3Q7JyB0bwotICogIHRoZWlyIGVudGl0eSBlcXVpdmFsZW50cywgJyZhbXA7bHQ7JyBhbmQgJyZhbXA7Z3Q7JykgYXMgd2VsbCBhcyBhc3Npc3RpbmcKLSAqICB3aXRoIG5lc3RlZCBlbGVtZW50cywgY2xvc2luZyB0YWdzLCBldGMuCi0gKgotICogIEBhdXRob3IgSG93YXJkIFNoaXAsIERhdmlkIFNvbGlzCi0gKiAgQHZlcnNpb24gJElkJAotICoqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElNYXJrdXBXcml0ZXIKLXsKLSAgICAvKioKLSAgICAgKiBXcml0ZXMgYW4gaW50ZWdlciBhdHRyaWJ1dGUgaW50byB0aGUgY3VycmVudGx5IG9wZW4gdGFnLgotICAgICAqCi0gICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlcmUgaXMgbm8gb3BlbiB0YWcuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCBhdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIGludCB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZXMgYSBib29sZWFuIGF0dHJpYnV0ZSBpbnRvIHRoZSBjdXJyZW50bHkgb3BlbiB0YWcuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBubyBvcGVuIHRhZy4KLSAgICAgKgotICAgICAqIEBzaW5jZSAzLjAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCBhdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIGJvb2xlYW4gdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogV3JpdGVzIGFuIGF0dHJpYnV0ZSBpbnRvIHRoZSBtb3N0IHJlY2VudGx5IG9wZW5lZCB0YWcuIFRoaXMgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIKLSAgICAgKiB7QGxpbmsgI2JlZ2luKFN0cmluZyl9Ci0gICAgICogYW5kIGJlZm9yZSBhbnkgb3RoZXIga2luZCBvZiB3cml0aW5nICh3aGljaCBjbG9zZXMgdGhlIHRhZykuCi0gICAgICoKLSAgICAgKiA8cD5UaGUgdmFsdWUgbWF5IGJlIG51bGwuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBubyBvcGVuIHRhZy4KLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCBhdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBTaW1pbGFyIHRvIHtAbGluayAjYXR0cmlidXRlKFN0cmluZywgU3RyaW5nKX0gYnV0IG5vIGVzY2FwaW5nIG9mIGludmFsaWQgZWxlbWVudHMKLSAgICAgKiBpcyBkb25lIGZvciB0aGUgdmFsdWUuCi0gICAgICogCi0gICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlcmUgaXMgbm8gb3BlbiB0YWcuCi0gICAgICoKLSAgICAgKiBAc2luY2UgMy4wCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgYXR0cmlidXRlUmF3KFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogQ2xvc2VzIGFueSBleGlzdGluZyB0YWcgdGhlbiBzdGFydHMgYSBuZXcgZWxlbWVudC4gVGhlIG5ldyBlbGVtZW50IGlzIHB1c2hlZAotICAgICAqIG9udG8gdGhlIGFjdGl2ZSBlbGVtZW50IHN0YWNrLgotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIGJlZ2luKFN0cmluZyBuYW1lKTsKLQotICAgIC8qKgotICAgICAqIFN0YXJ0cyBhbiBlbGVtZW50IHRoYXQgd2lsbCBub3QgbGF0ZXIgYmUgbWF0Y2hlZCB3aXRoIGFuIDxjb2RlPmVuZCgpPC9jb2RlPgotICAgICAqIGNhbGwuIFRoaXMgaXMgdXNlZnVsIGZvciBlbGVtZW50cyB0aGF0Ci0gICAgICogZG8gbm90IG5lZWQgY2xvc2luZyB0YWdzLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgYmVnaW5FbXB0eShTdHJpbmcgbmFtZSk7Ci0KLSAgICAvKioKLSAgICAgKiBJbnZva2VzIGNoZWNrRXJyb3IoKSBvbiB0aGUgPGNvZGU+UHJpbnRXcml0ZXI8L2NvZGU+IHVzZWQgdG8KLSAgICAgKiAgZm9ybWF0IG91dHB1dC4KLSAgICAgKiovCi0KLSAgICBwdWJsaWMgYm9vbGVhbiBjaGVja0Vycm9yKCk7Ci0KLSAgICAvKioKLSAgICAgKiBDbG9zZXMgdGhpcyA8Y29kZT5JTWFya3VwV3JpdGVyPC9jb2RlPi4gQ2xvc2UgdGFncyBhcmUKLSAgICAgKiB3cml0dGVuIGZvciBhbnkgYWN0aXZlIGVsZW1lbnRzLiBUaGUgPGNvZGU+UHJpbnRXcml0ZXI8L2NvZGU+Ci0gICAgICogaXMgdGhlbiBzZW50IDxjb2RlPmNsb3NlKCk8L2NvZGU+LiAgQSBuZXN0ZWQgd3JpdGVyIHdpbGwgY29tbWl0Ci0gICAgICogaXRzIGJ1ZmZlciB0byBpdHMgY29udGFpbmluZyB3cml0ZXIuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCBjbG9zZSgpOwotCi0gICAgLyoqCi0gICAgICogQ2xvc2VzIHRoZSBtb3N0IHJlY2VudGx5IG9wZW5lZCBlbGVtZW50IGJ5IHdyaXRpbmcgdGhlICcmZ3Q7JyB0aGF0IGVuZHMKLSAgICAgKiBpdC4gT25jZSB0aGlzIGlzIGludm9rZWQsIHRoZSA8Y29kZT5hdHRyaWJ1dGUoKTwvY29kZT4gbWV0aG9kcwotICAgICAqIG1heSBub3QgYmUgdXNlZCB1bnRpbCBhIG5ldyBlbGVtZW50IGlzIG9wZW5lZCB3aXRoIHtAbGluayAjYmVnaW4oU3RyaW5nKX0gb3IKLSAgICAgKiBvciB7QGxpbmsgI2JlZ2luRW1wdHkoU3RyaW5nKX0uCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgY2xvc2VUYWcoKTsKLQotICAgIC8qKgotICAgICAqIFdyaXRlcyBhbiBYTUwvSFRNTCBjb21tZW50LiBBbnkgb3BlbiB0YWcgaXMgZmlyc3QgY2xvc2VkLiAKLSAgICAgKiBUaGUgbWV0aG9kIHRha2VzIGNhcmUgb2YKLSAgICAgKiBwcm92aWRpbmcgdGhlIDxjb2RlPiZsdDshLS08L2NvZGU+IGFuZCA8Y29kZT4tLSZndDs8L2NvZGU+LCBhbmQKLSAgICAgKiBwcm92aWRlcyBhIGJsYW5rIGxpbmUgYWZ0ZXIgdGhlIGNsb3NlIG9mIHRoZSBjb21tZW50LgotICAgICAqCi0gICAgICogPHA+PGVtPk1vc3Q8L2VtPiBjaGFyYWN0ZXJzIGFyZSB2YWxpZCBpbnNpZGUgYSBjb21tZW50LCBzbyBubyBjaGVjawotICAgICAqIG9mIHRoZSBjb250ZW50cyBpcyBtYWRlIChtdWNoIGxpa2Uge0BsaW5rICNwcmludFJhdyhTdHJpbmcpfS4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIGNvbW1lbnQoU3RyaW5nIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIEVuZHMgdGhlIGVsZW1lbnQgbW9zdCByZWNlbnRseSBzdGFydGVkIGJ5IHtAbGluawotICAgICAqICNiZWdpbihTdHJpbmcpfS4gIFRoZSBuYW1lIG9mIHRoZSB0YWcgaXMgcG9wcGVkIG9mZiBvZiB0aGUKLSAgICAgKiBhY3RpdmUgZWxlbWVudCBzdGFjayBhbmQgdXNlZCB0byBmb3JtIGFuIEhUTUwgY2xvc2UgdGFnLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgZW5kKCk7Ci0KLSAgICAvKioKLSAgICAgKiBFbmRzIHRoZSBtb3N0IHJlY2VudGx5IHN0YXJ0ZWQgZWxlbWVudCB3aXRoIHRoZSBnaXZlbgotICAgICAqIG5hbWUuIFRoaXMgd2lsbCBhbHNvIGVuZCBhbnkgb3RoZXIgaW50ZXJtZWRpYXRlCi0gICAgICogZWxlbWVudHMuIFRoaXMgaXMgdmVyeSB1c2VmdWwgZm9yIGVhc2lseSBlbmRpbmcgYSB0YWJsZSBvcgotICAgICAqIGV2ZW4gYW4gZW50aXJlIHBhZ2UuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCBlbmQoU3RyaW5nIG5hbWUpOwotCi0gICAgLyoqCi0gICAgICogRm9yd2FyZHMgPGNvZGU+Zmx1c2goKTwvY29kZT4gdG8gdGhpcyAKLSAgICAgKiA8Y29kZT5JTWFya3VwV3JpdGVyPC9jb2RlPidzIDxjb2RlPlByaW50V3JpdGVyPC9jb2RlPi4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIGZsdXNoKCk7Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyBhIG5lc3RlZCB3cml0ZXIsIG9uZSB0aGF0IGFjY3VtdWxhdGVzIGl0cyBjaGFuZ2VzIGluIGEKLSAgICAgKiAgYnVmZmVyLiAgV2hlbiB0aGUgbmVzdGVkICB3cml0ZXIgaXMgY2xvc2VkLCBpdCB3cml0ZXMgaXRzCi0gICAgICogIGJ1ZmZlciBpbnRvIGl0cyBjb250YWluaW5nIDxjb2RlPklNYXJrdXBXcml0ZXI8L2NvZGU+LgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIElNYXJrdXBXcml0ZXIgZ2V0TmVzdGVkV3JpdGVyKCk7Ci0KLSAgICAvKioKLSAgICAgKgotICAgICAqIFRoZSBwcmltYXJ5IDxjb2RlPnByaW50KCk8L2NvZGU+IG1ldGhvZCwgdXNlZCBieSBtb3N0IG90aGVyCi0gICAgICogbWV0aG9kcy4KLSAgICAgKgotICAgICAqIDxwPlByaW50cyB0aGUgY2hhcmFjdGVyIGFycmF5LCBmaXJzdCBjbG9zaW5nIGFueSBvcGVuIHRhZy4gUHJvYmxlbWF0aWMgY2hhcmFjdGVycwotICAgICAqICgnJmx0OycsICcmZ3Q7JyBhbmQgJyZhbXA7JykgYXJlIGNvbnZlcnRlZCB0byBhcHByb3ByaWF0ZQotICAgICAqIGVudGl0aWVzLgotICAgICAqCi0gICAgICogPHA+RG9lcyA8ZW0+bm90aGluZzwvZW0+IGlmIDxjb2RlPmRhdGE8L2NvZGU+IGlzIG51bGwuCi0gICAgICoKLSAgICAgKiA8cD5DbG9zZXMgYW55IG9wZW4gdGFnLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgcHJpbnQoY2hhcltdIGRhdGEsIGludCBvZmZzZXQsIGludCBsZW5ndGgpOwotCi0gICAgLyoqCi0gICAgICogUHJpbnRzIGEgc2luZ2xlIGNoYXJhY3Rlciwgb3IgaXRzIGVxdWl2YWxlbnQgZW50aXR5LgotICAgICAqCi0gICAgICogPHA+Q2xvc2VzIGFueSBvcGVuIHRhZy4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIHByaW50KGNoYXIgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogUHJpbnRzIGFuIGludGVnZXIuCi0gICAgICoKLSAgICAgKiA8cD5DbG9zZXMgYW55IG9wZW4gdGFnLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgcHJpbnQoaW50IHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIEludm9rZXMge0BsaW5rICNwcmludChjaGFyW10sIGludCwgaW50KX0gdG8gcHJpbnQgdGhlIHN0cmluZy4gIFVzZQotICAgICAqIHtAbGluayAjcHJpbnRSYXcoU3RyaW5nKX0gaWYgdGhlIGNoYXJhY3RlciBkYXRhIGlzIGtub3duIHRvIGJlIHNhZmUuCi0gICAgICoKLSAgICAgKiA8cD5Eb2VzIDxlbT5ub3RoaW5nPC9lbT4gaWYgPGNvZGU+dmFsdWU8L2NvZGU+IGlzIG51bGwuCi0gICAgICoKLSAgICAgKiA8cD5DbG9zZXMgYW55IG9wZW4gdGFnLgotICAgICAqCi0gICAgICogQHNlZSAjcHJpbnQoY2hhcltdLCBpbnQsIGludCkKLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIHByaW50KFN0cmluZyB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBDbG9zZXMgdGhlIG9wZW4gdGFnIChpZiBhbnkpLCB0aGVuIHByaW50cyBhIGxpbmUgc2VwZXJhdG9yIHRvCi0gICAgICogdGhlIG91dHB1dCBzdHJlYW0uCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCBwcmludGxuKCk7Ci0KLSAgICAvKioKLSAgICAgKiBQcmludHMgYSBwb3J0aW9uIG9mIGFuIG91dHB1dCBidWZmZXIgdG8gdGhlIHN0cmVhbS4KLSAgICAgKiBObyBlc2NhcGluZyBvZiBpbnZhbGlkIGVsZW1lbnRzIGlzIGRvbmUsIHdoaWNoCi0gICAgICogbWFrZXMgdGhpcyBtb3JlIGVmZmVjaWVudCB0aGFuIDxjb2RlPnByaW50KCk8L2NvZGU+LiAKLSAgICAgKiBEb2VzIDxlbT5ub3RoaW5nPC9lbT4gaWYgPGNvZGU+YnVmZmVyPC9jb2RlPgotICAgICAqIGlzIG51bGwuCi0gICAgICoKLSAgICAgKiA8cD5DbG9zZXMgYW55IG9wZW4gdGFnLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgcHJpbnRSYXcoY2hhcltdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCk7Ci0KLSAgICAvKioKLSAgICAgKiBQcmludHMgb3V0cHV0IHRvIHRoZSBzdHJlYW0uIE5vIGVzY2FwaW5nIG9mIGludmFsaWQgZWxlbWVudHMgaXMgZG9uZSwgd2hpY2gKLSAgICAgKiBtYWtlcyB0aGlzIG1vcmUgZWZmZWNpZW50IHRoYW4gPGNvZGU+cHJpbnQoKTwvY29kZT4uCi0gICAgICoKLSAgICAgKiA8cD5Eb2VzIDxlbT5ub3RoaW5nPC9lbT4gaWYgPGNvZGU+dmFsdWU8L2NvZGU+Ci0gICAgICogaXMgbnVsbC4KLSAgICAgKgotICAgICAqIDxwPkNsb3NlcyBhbnkgb3BlbiB0YWcuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCBwcmludFJhdyhTdHJpbmcgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgdGhlIHR5cGUgb2YgY29udGVudCBnZW5lcmF0ZWQgYnkgdGhpcyByZXNwb25zZSB3cml0ZXIsIGFzCi0gICAgICogIGEgTUlNRSB0eXBlLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIFN0cmluZyBnZXRDb250ZW50VHlwZSgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9JTWVzc2FnZXMuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9JTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ5Nzc1NC4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvSU1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeTsKLQotLyoqCi0gKiBBIHNldCBvZiBsb2NhbGl6ZWQgbWVzc2FnZSBzdHJpbmdzLiAgVGhpcyBpcyBzb21ld2hhdCBsaWtlCi0gKiBhIHtAbGluayBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGV9LCBidXQgd2l0aCBtb3JlCi0gKiBmbGV4aWJpbGl0eSBhYm91dCB3aGVyZSB0aGUgbWVzc2FnZXMgY29tZSBmcm9tLiAgSW4gYWRkaXRpb24sCi0gKiBpdCBpbmNsdWRlcyBtZXRob2RzIHNpbWlsYXIgdG8ge0BsaW5rIGphdmEudGV4dC5NZXNzYWdlRm9ybWF0fQotICogZm9yIGZvcm1hdHRpbmcgdGhlIHN0cmluZ3MuCi0gKgotICogQHNlZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LklDb21wb25lbnQjZ2V0TWVzc2FnZXMKLSAqIEBzZWUgb3JnLmFwYWNoZS50YXBlc3RyeS5lbmdpbmUuSUNvbXBvbmVudE1lc3NhZ2VzU291cmNlCi0gKiAKLSAqIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqIEBzaW5jZSAyLjAuNAotICoKLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElNZXNzYWdlcwotewotICAgIC8qKgotICAgICAqIFNlYXJjaGVzIGZvciBhIGxvY2FsaXplZCBzdHJpbmcgd2l0aCB0aGUgZ2l2ZW4ga2V5LgotICAgICAqIElmIG5vdCBmb3VuZCwgYSBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSBrZXkKLSAgICAgKiBpcyByZXR1cm5lZCAoYWxsIHVwcGVyLWNhc2UgYW5kIHN1cnJvdW5kZWQgYnkgc3F1YXJlCi0gICAgICogYnJhY2tldHMpLgotICAgICAqIAotICAgICAqLwotCi0gICAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBrZXkpOwotCi0gICAgLyoqCi0gICAgICogU2VhcmNoZXMgZm9yIGEgbG9jYWxpemVkIHN0cmluZyB3aXRoIHRoZSBnaXZlbiBrZXkuCi0gICAgICogSWYgbm90IGZvdW5kLCB0aGVuIHRoZSBkZWZhdWx0IHZhbHVlICh3aGljaCBzaG91bGQgYWxyZWFkeQotICAgICAqIGJlIGxvY2FsaXplZCkgaXMgcmV0dXJuZWQuICBQYXNzaW5nIGEgZGVmYXVsdCBvZiBudWxsCi0gICAgICogaXMgdXNlZnVsIHdoZW4gdHJ5aW5nIHRvIGRldGVybWluZSBpZiB0aGUgc3RyaW5ncyBjb250YWlucwotICAgICAqIGEgZ2l2ZW4ga2V5LgotICAgICAqCi0gICAgICovCi0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGtleSwgU3RyaW5nIGRlZmF1bHRWYWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBGb3JtYXRzIGEgc3RyaW5nLCB1c2luZwotICAgICAqIHtAbGluayBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdCNmb3JtYXQoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdFtdKX0uCi0gICAgICogCi0gICAgICogPHA+Ci0gICAgICogSW4gYWRkaXRpb24sIHNwZWNpYWwgcHJvY2Vzc2luZyBvY2N1cnMgZm9yIGFueSBvZiB0aGUgYXJndW1lbnRzIHRoYXQKLSAgICAgKiBpbmhlcml0IGZyb20ge0BsaW5rIFRocm93YWJsZX06IHN1Y2ggYXJndW1lbnRzIGFyZSByZXBsYWNlZCB3aXRoIHRoZSBUaHJvd2FibGUncyBtZXNzYWdlCi0gICAgICogKGlmIG5vbiBibGFuayksIG9yIHRoZSBUaHJvd2FibGUncyBjbGFzcyBuYW1lIChpZiB0aGUgbWVzc2FnZSBpcyBibGFuaykuCi0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkgdXNlZCB0byBvYnRhaW4gYSBsb2NhbGl6ZWQgcGF0dGVybiB1c2luZwotICAgICAqIHtAbGluayAjZ2V0TWVzc2FnZShTdHJpbmcpfQotICAgICAqIEBwYXJhbSBhcmd1bWVudHMgcGFzc2VkIHRvIHRoZSBmb3JtYXR0ZXIKLSAgICAgKgotICAgICAqIEBzaW5jZSAzLjAKLSAgICAgKgotICAgICAqLwotCi0gICAgcHVibGljIFN0cmluZyBmb3JtYXQoU3RyaW5nIGtleSwgT2JqZWN0W10gYXJndW1lbnRzKTsKLQotICAgIC8qKgotICAgICAqIENvbnZpZW5pZW5jZSBtZXRob2QgZm9yIGludm9raW5nIHtAbGluayAjZm9ybWF0KFN0cmluZywgT2JqZWN0W10pfS4KLSAgICAgKiBAc2luY2UgMy4wCi0gICAgICoKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGZvcm1hdChTdHJpbmcga2V5LCBPYmplY3QgYXJndW1lbnQpOwotCi0gICAgLyoqCi0gICAgICogQ29udmllbmllbmNlIG1ldGhvZCBmb3IgaW52b2tpbmcge0BsaW5rICNmb3JtYXQoU3RyaW5nLCBPYmplY3RbXSl9LgotICAgICAqCi0gICAgICogQHNpbmNlIDMuMAotICAgICAqIAotICAgICAqLwotCi0gICAgcHVibGljIFN0cmluZyBmb3JtYXQoU3RyaW5nIGtleSwgT2JqZWN0IGFyZ3VtZW50MSwgT2JqZWN0IGFyZ3VtZW50Mik7Ci0KLSAgICAvKioKLSAgICAgKiBDb252aWVuaWVuY2UgbWV0aG9kIGZvciBpbnZva2luZyB7QGxpbmsgI2Zvcm1hdChTdHJpbmcsIE9iamVjdFtdKX0uCi0gICAgICoKLSAgICAgKiBAc2luY2UgMy4wCi0gICAgICogCi0gICAgICovCi0KLSAgICBwdWJsaWMgU3RyaW5nIGZvcm1hdChTdHJpbmcga2V5LCBPYmplY3QgYXJndW1lbnQxLCBPYmplY3QgYXJndW1lbnQyLCBPYmplY3QgYXJndW1lbnQzKTsKLX0KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9JTmFtZXNwYWNlLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvSU5hbWVzcGFjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDlmMTNmLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9JTmFtZXNwYWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzAgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuc3BlYy5JQ29tcG9uZW50U3BlY2lmaWNhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnNwZWMuSUxpYnJhcnlTcGVjaWZpY2F0aW9uOwotCi0vKioKLSAqICBPcmdhbml6ZXMgZGlmZmVyZW50IGxpYnJhcmllcyBvZiBUYXBlc3RyeSBwYWdlcywgY29tcG9uZW50cwotICogIGFuZCBzZXJ2aWNlcyBpbnRvICJmcmFtZXdvcmtzIiwgdXNlZCB0byBkaXNhbWJpZ3VhdGUgbmFtZXMuCi0gKiAKLSAqICA8cD4KLSAqICBUYXBlc3RyeSByZWxlYXNlIDMuMCBpbmNsdWRlcyBkeW5hbWljIGRpc2NvdmVyeSBvZiBwYWdlcyBhbmQgY29tcG9uZW50czsgYW4gYXBwbGljYXRpb24KLSAqICBvciBsaWJyYXJ5IG1heSBjb250YWluIGEgcGFnZSBvciBjb21wb25lbnQgdGhhdCB3b24ndCBiZSAia25vd24iIHVudGlsIHRoZSBuYW1lCi0gKiAgaXMgcmVzb2x2ZWQgKGJlY2F1c2UgaXQgaW52b2x2ZXMgc2VhcmNoaW5nIGZvciBhIHBhcnRpY3VsYXIgbmFtZWQgZmlsZSkuCi0gKiAKLSAqICBAc2VlIG9yZy5hcGFjaGUudGFwZXN0cnkucmVzb2x2ZXIuUGFnZVNwZWNpZmljYXRpb25SZXNvbHZlcgotICogIEBzZWUgb3JnLmFwYWNoZS50YXBlc3RyeS5yZXNvbHZlci5Db21wb25lbnRTcGVjaWZpY2F0aW9uUmVzb2x2ZXIKLSAqCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogIEB2ZXJzaW9uICRJZCQKLSAqICBAc2luY2UgMi4yCi0gKgotICoqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElOYW1lc3BhY2UgZXh0ZW5kcyBJTG9jYXRhYmxlCi17Ci0gICAgLyoqCi0gICAgICogIFJlc2VydmVkIG5hbWUgb2YgYSB0aGUgaW1wbGljaXQgRnJhbWV3b3JrIGxpYnJhcnkuCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRlJBTUVXT1JLX05BTUVTUEFDRSA9ICJmcmFtZXdvcmsiOwotCi0gICAgLyoqCi0gICAgICogIENoYXJhY3RlciB1c2VkIHRvIHNlcGVyYXRlIHRoZSBuYW1lc3BhY2UgcHJlZml4IGZyb20gdGhlIHBhZ2UgbmFtZQotICAgICAqICBvciBjb21wb25lbnQgdHlwZS4KLSAgICAgKiAKLSAgICAgKiAgQHNpbmNlIDIuMwotICAgICAqIAotICAgICAqKi8KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBTRVBBUkFUT1IgPSAnOic7Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyBhbiBpZGVudGlmaWVyIGZvciB0aGUgbmFtZXNwYWNlLiAgSWRlbnRpZmllcnMKLSAgICAgKiAgYXJlIHNpbXBsZSBuYW1lcyAodGhleSBzdGFydCB3aXRoIGEgbGV0dGVyLAotICAgICAqICBhbmQgbWF5IGNvbnRhaW4gbGV0dGVycywgbnVtYmVycywgdW5kZXJzY29yZXMgYW5kIGRhc2hlcykuCi0gICAgICogIEFuIGlkZW50aWZpZXIgbXVzdCBiZSB1bmlxdWUgYW1vbmcgYSBuYW1lc3BhY2VzIHNpYmxpbmdzLgotICAgICAqIAotICAgICAqICA8cD5UaGUgYXBwbGljYXRpb24gbmFtZXNwYWNlIGhhcyBhIG51bGwgaWQ7IHRoZSBmcmFtZXdvcmsKLSAgICAgKiAgbmFtZXNwYWNlIGhhcyBhbiBpZCBvZiAiZnJhbWV3b3JrIi4KLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgU3RyaW5nIGdldElkKCk7Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0aGUgZXh0ZW5kZWQgaWQgZm9yIHRoaXMgbmFtZXNwYWNlLCB3aGljaCBpcwotICAgICAqICBhIGRvdC1zZXBlcmF0ZWQgc2VxdWVuY2Ugb2YgaWRzLgotICAgICAqIAotICAgICAqKi8KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXh0ZW5kZWRJZCgpOwotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgYSB2ZXJzaW9uIG9mIHRoZSBleHRlbmRlZCBpZCBhcHByb3ByaWF0ZSBmb3IgZXJyb3IKLSAgICAgKiAgbWVzc2FnZXMuICBUaGlzIGlzIHRoZSBiYXNlZCBvbgotICAgICAqICB7QGxpbmsgI2dldEV4dGVuZGVkSWQoKX0sIHVubGVzcyB0aGlzIGlzIHRoZQotICAgICAqICBhcHBsaWNhdGlvbiBvciBmcmFtZXdvcmsgbmFtZXNwYWNlLCBpbiB3aGljaCBjYXNlCi0gICAgICogIHNwZWNpYWwgc3RyaW5ncyBhcmUgcmV0dXJuZWQuCi0gICAgICogIAotICAgICAqICBAc2luY2UgMy4wCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VJZCgpOwotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgdGhlIHBhcmVudCBuYW1lc3BhY2U7IHRoZSBuYW1lc3BhY2Ugd2hpY2gKLSAgICAgKiAgY29udGFpbnMgdGhpcyBuYW1lc3BhY2UuCi0gICAgICogCi0gICAgICogIDxwPgotICAgICAqICBUaGUgYXBwbGljYXRpb24gYW5kIGZyYW1ld29yayBuYW1lc3BhY2VzIHJldHVybiBudWxsCi0gICAgICogIGFzIHRoZSBwYXJlbnQuCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIElOYW1lc3BhY2UgZ2V0UGFyZW50TmFtZXNwYWNlKCk7Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyBhIG5hbWVzcGFjZSBjb250YWluZWQgYnkgdGhpcyBuYW1lc3BhY2UuCi0gICAgICogCi0gICAgICogIEBwYXJhbSBpZCBlaXRoZXIgYSBzaW1wbGUgbmFtZSAob2YgYSBkaXJlY3RseSBjb250YWluZWQgbmFtZXNwYWNlKSwKLSAgICAgKiAgb3IgYSBkb3Qtc2VwZXJhcmF0ZWQgbmFtZSBzZXF1ZW5jZS4KLSAgICAgKiAgQHJldHVybiB0aGUgY2hpbGQgbmFtZXNwYWNlCi0gICAgICogIEB0aHJvd3MgQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uIGlmIG5vIHN1Y2ggbmFtZXNwYWNlIGV4aXN0LgotICAgICAqIAotICAgICAqKi8KLQotICAgIHB1YmxpYyBJTmFtZXNwYWNlIGdldENoaWxkTmFtZXNwYWNlKFN0cmluZyBpZCk7Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyBhIHNvcnRlZCwgaW1tdXRhYmxlIGxpc3Qgb2YgdGhlIGlkcyBvZiB0aGUgaW1tZWRpYXRlCi0gICAgICogIGNoaWxkcmVuIG9mIHRoaXMgbmFtZXNwYWNlLiAgTWF5IHJldHVybiB0aGUgZW1wdHkgbGlzdCwKLSAgICAgKiAgYnV0IHdvbid0IHJldHVybiBudWxsLgotICAgICAqIAotICAgICAqKi8KLQotICAgIHB1YmxpYyBMaXN0IGdldENoaWxkSWRzKCk7Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0aGUgcGFnZSBzcGVjaWZpY2F0aW9uIG9mIHRoZSBuYW1lZAotICAgICAqICBwYWdlIChkZWZpbmVkIHdpdGhpbiB0aGUgbmFtZXNwYWNlKS4KLSAgICAgKiAKLSAgICAgKiAgQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHBhZ2UKLSAgICAgKiAgQHJldHVybiB0aGUgc3BlY2lmaWNhdGlvbgotICAgICAqICBAdGhyb3dzIEFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbiBpZiB0aGUgcGFnZSBzcGVjaWZpY2F0aW9uCi0gICAgICogIGRvZXNuJ3QgZXhpc3Qgb3IgY2FuJ3QgYmUgbG9hZGVkCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIElDb21wb25lbnRTcGVjaWZpY2F0aW9uIGdldFBhZ2VTcGVjaWZpY2F0aW9uKFN0cmluZyBuYW1lKTsKLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIHRydWUgaWYgdGhpcyBuYW1lc3BhY2UgY29udGFpbnMgdGhlIHNwZWNpZmllZAotICAgICAqICBwYWdlIG5hbWUuCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNQYWdlKFN0cmluZyBuYW1lKTsKLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIGEgc29ydGVkIGxpc3Qgb2YgcGFnZSBuYW1lcy4gIE1heSByZXR1cm4gYW4gZW1wdHkKLSAgICAgKiAgbGlzdCwgYnV0IHdvbid0IHJldHVybiBudWxsLiAgVGhlIHJldHVybiBsaXN0IGlzIGltbXV0YWJsZS4KLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgTGlzdCBnZXRQYWdlTmFtZXMoKTsKLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIHRoZSBwYXRoIGZvciB0aGUgbmFtZWQgY29tcG9uZW50ICh3aXRoaW4gdGhlIG5hbWVzcGFjZSkuCi0gICAgICogCi0gICAgICogIEBwYXJhbSB0eXBlIHRoZSBjb21wb25lbnQgYWxpYXMKLSAgICAgKiAgQHJldHVybiB0aGUgc3BlY2lmaWNhdGlvbiBwYXRoIG9mIHRoZSBjb21wb25lbnQKLSAgICAgKiAgQHRocm93cyBBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24gaWYgdGhlIHNwZWNpZmljYXRpb24KLSAgICAgKiAgZG9lc24ndCBleGlzdCBvciBjYW4ndCBiZSBsb2FkZWQKLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgSUNvbXBvbmVudFNwZWNpZmljYXRpb24gZ2V0Q29tcG9uZW50U3BlY2lmaWNhdGlvbihTdHJpbmcgdHlwZSk7Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0cnVlIGlmIHRoZSBuYW1lc3BhY2UgY29udGFpbnMgdGhlIGluZGljYXRlZCBjb21wb25lbnQgdHlwZS4KLSAgICAgKiAKLSAgICAgKiAgQHBhcmFtIHR5cGUgYSBzaW1wbGUgY29tcG9uZW50IHR5cGUgKG5vIG5hbWVzcGFjZSBwcmVmaXggaXMgYWxsb3dlZCkKLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zQ29tcG9uZW50VHlwZShTdHJpbmcgdHlwZSk7Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyBhIHNvcnRlZCBsaXN0IG9mIGNvbXBvbmVudCB0eXBlcy4gIE1heSByZXR1cm4gCi0gICAgICogIGFuIGVtcHR5IGxpc3QsIGJ1dCB3b24ndCByZXR1cm4gbnVsbC4gIFRoZSByZXR1cm4gbGlzdAotICAgICAqICBpcyBpbW11dGFibGUuICBSZXByZXNlbnRzIGp1c3QgdGhlIGtub3duIGNvbXBvbmVudCB0eXBlcwotICAgICAqICAoYWRkaXRpb25hbCB0eXBlcyBtYXkgYmUgZGlzY292ZXJyZWQgZHluYW1pY2FsbHkpLgotICAgICAqIAotICAgICAqICA8cD5JcyB0aGlzIG1ldGhvZCBldmVuIG5lZWRlZD8KLSAgICAgKiAKLSAgICAgKiAgQHNpbmNlIDMuMAotICAgICAqIAotICAgICAqKi8KLQotICAgIHB1YmxpYyBMaXN0IGdldENvbXBvbmVudFR5cGVzKCk7Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0aGUgY2xhc3MgbmFtZSBvZiBhIHNlcnZpY2UgcHJvdmlkZWQgYnkgdGhlCi0gICAgICogIG5hbWVzcGFjZS4KLSAgICAgKiAKLSAgICAgKiAgQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHNlcnZpY2UuCi0gICAgICogIEByZXR1cm4gdGhlIGNvbXBsZXRlIGNsYXNzIG5hbWUgb2YgdGhlIHNlcnZpY2UsIG9yIG51bGwKLSAgICAgKiAgaWYgdGhlIG5hbWVzcGFjZSBkb2VzIG5vdCBjb250YWluIHRoZSBuYW1lZCBzZXJ2aWNlLgotICAgICAqIAotICAgICAqKi8KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmljZUNsYXNzTmFtZShTdHJpbmcgbmFtZSk7Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0aGUgbmFtZXMgb2YgYWxsIHNlcnZpY2VzIHByb3ZpZGVkIGJ5IHRoZQotICAgICAqICBuYW1lc3BhY2UsIGFzIGEgc29ydGVkLCBpbW11dGFibGUgbGlzdC4gIE1heSByZXR1cm4KLSAgICAgKiAgdGhlIGVtcHR5IGxpc3QsIGJ1dCB3b24ndCByZXR1cm4gbnVsbC4KLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgTGlzdCBnZXRTZXJ2aWNlTmFtZXMoKTsKLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIHRoZSB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5zcGVjLkxpYnJhcnlTcGVjaWZpY2F0aW9ufSBmcm9tIHdoaWNoCi0gICAgICogIHRoaXMgbmFtZXNwYWNlIHdhcyBjcmVhdGVkLgotICAgICAqIAotICAgICAqKi8KLQotICAgIHB1YmxpYyBJTGlicmFyeVNwZWNpZmljYXRpb24gZ2V0U3BlY2lmaWNhdGlvbigpOwotCi0gICAgLyoqCi0gICAgICogIENvbnN0cnVjdHMgYSBxdWFsaWZpZWQgbmFtZSBmb3IgdGhlIGdpdmVuIHNpbXBsZSBwYWdlIG5hbWUgYnkKLSAgICAgKiAgYXBwbHlpbmcgdGhlIGNvcnJlY3QgcHJlZml4IChpZiBhbnkpLgotICAgICAqIAotICAgICAqICBAc2luY2UgMi4zCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIFN0cmluZyBjb25zdHJ1Y3RRdWFsaWZpZWROYW1lKFN0cmluZyBwYWdlTmFtZSk7Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0aGUgbG9jYXRpb24gb2YgdGhlIHJlc291cmNlIGZyb20gd2hpY2ggdGhlCi0gICAgICogIHNwZWNpZmljYXRpb24gZm9yIHRoaXMgbmFtZXNwYWNlIHdhcyByZWFkLgotICAgICAqIAotICAgICAqKi8KLQotICAgIHB1YmxpYyBJUmVzb3VyY2VMb2NhdGlvbiBnZXRTcGVjaWZpY2F0aW9uTG9jYXRpb24oKTsKLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIHRydWUgaWYgdGhlIG5hbWVzcGFjZSBpcyB0aGUgc3BlY2lhbAotICAgICAqICBhcHBsaWNhdGlvbiBuYW1lc3BhY2UgKHdoaWNoIGhhcyBzcGVjaWFsIHNlYXJjaCBydWxlcwotICAgICAqICBmb3IgaGFuZGxpbmcgdW5kZWNsYXJlZCBwYWdlcyBhbmQgY29tcG9uZW50cykuCi0gICAgICogCi0gICAgICogIEBzaW5jZSAzLjAKLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0FwcGxpY2F0aW9uTmFtZXNwYWNlKCk7Ci0KLSAgICAvKioKLSAgICAgKiAgVXNlZCB0byBzcGVjaWZ5IGFkZGl0aW9uYWwgcGFnZXMgYmV5b25kIHRob3NlIHRoYXQgY2FtZSBmcm9tCi0gICAgICogIHRoZSBuYW1lc3BhY2UncyBzcGVjaWZpY2F0aW9uLiAgVGhpcyBpcyB1c2VkIHdoZW4gcGFnZXMKLSAgICAgKiAgaW4gdGhlIGFwcGxpY2F0aW9uIG5hbWVzcGFjZSBhcmUgZHluYW1pY2FsbHkgZGlzY292ZXJlZC4KLSAgICAgKiAKLSAgICAgKiAgQHNpbmNlIDMuMAotICAgICAqIAotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIGluc3RhbGxQYWdlU3BlY2lmaWNhdGlvbihTdHJpbmcgcGFnZU5hbWUsIElDb21wb25lbnRTcGVjaWZpY2F0aW9uIHNwZWNpZmljYXRpb24pOwotCi0gICAgLyoqCi0gICAgICogIFVzZWQgdG8gc3BlY2lmeSBhZGRpdGlvbmFsIGNvbXBvbmVudHMgYmV5b25kIHRob3NlIHRoYXQgY2FtZSBmcm9tCi0gICAgICogIHRoZSBuYW1lc3BhY2UncyBzcGVjaWZpY2F0aW9uLiAgVGhpcyBpcyB1c2VkIHdoZW4gY29tcG9uZW50cwotICAgICAqICBpbiB0aGUgYXBwbGljYXRpb24gbmFtZXNwYWNlIGFyZSBkeW5hbWljYWxseSBkaXNjb3ZlcmVkLgotICAgICAqIAotICAgICAqICBAc2luY2UgMy4wCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgaW5zdGFsbENvbXBvbmVudFNwZWNpZmljYXRpb24oU3RyaW5nIHR5cGUsIElDb21wb25lbnRTcGVjaWZpY2F0aW9uIHNwZWNpZmljYXRpb24pOwotCi19CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvSVBhZ2UuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9JUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDcwZjE3Li4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9JUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEyICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5OwotCi1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuZXZlbnQuQ2hhbmdlT2JzZXJ2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5ldmVudC5QYWdlRGV0YWNoTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5ldmVudC5QYWdlUmVuZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5ldmVudC5QYWdlVmFsaWRhdGVMaXN0ZW5lcjsKLQotLyoqCi0gKiAgQSByb290IGxldmVsIGNvbXBvbmVudCByZXNwb25zaWJsZSBmb3IgZ2VuZXJhdGluZyBhbiBlbnRpcmUgYSBwYWdlCi0gKiAgd2l0aGluIHRoZSBhcHBsaWNhdGlvbi4KLSAqCi0gKiAgPHA+UGFnZXMgYXJlIGNyZWF0ZWQgZHluYW1pY2FsbHkgZnJvbSB0aGllciBjbGFzcyBuYW1lcyAocGFydCBvZiB0aGUKLSAqICB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5zcGVjLklDb21wb25lbnRTcGVjaWZpY2F0aW9ufSkuCi0gKgotICogIEBzZWUgb3JnLmFwYWNoZS50YXBlc3RyeS5lbmdpbmUuSVBhZ2VTb3VyY2UKLSAqICBAc2VlIG9yZy5hcGFjaGUudGFwZXN0cnkuZW5naW5lLklQYWdlTG9hZGVyCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAKLSAqKi8KLQotcHVibGljIGludGVyZmFjZSBJUGFnZSBleHRlbmRzIElDb21wb25lbnQKLXsKLSAgICAvKioKLSAgICAgKiAgSW52b2tlZCBvbiBhIHBhZ2Ugd2hlbiBpdCBpcyBubyBsb25nZXIgbmVlZGVkIGJ5Ci0gICAgICogIHRoZSBlbmdpbmUsIGp1c3QgYmVmb3JlIGlzIGlzCi0gICAgICogIHJldHVybmVkIHRvIHRoZSBwb29sLiAgVGhlIHBhZ2UgaXMgZXhwZWN0ZWQgdG8KLSAgICAgKiAgbnVsbCB0aGUgZW5naW5lLCB2aXNpdCBhbmQgY2hhbmdlT2JzZXJ2ZXIgcHJvcGVydGllcy4KLSAgICAgKiAKLSAgICAgKiAgPHA+Q2xhc3NlcyBzaG91bGQgYWxzbyByZXNldCBhbnkgcHJvcGVydGllcyB0bwotICAgICAqICBkZWZhdWx0IHZhbHVlcyAoYXMgaWYgdGhlIGluc3RhbmNlCi0gICAgICogIHdhcyBmcmVzaGx5IGluc3RhbnRpYXRlZCkuCi0gICAgICoKLSAgICAgKiAgQHNlZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmVuZ2luZS5JUGFnZVNvdXJjZSNyZWxlYXNlUGFnZShJUGFnZSkKLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIGRldGFjaCgpOwotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgdGhlIHtAbGluayBJRW5naW5lfSB0aGF0IHRoZSBwYWdlIGlzIGN1cnJlbnRseQotICAgICAqICBhdHRhY2hlZCB0by4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBJRW5naW5lIGdldEVuZ2luZSgpOwotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgdGhlIG9iamVjdCAoZWZmZWN0aXZlbHksIGFuIAotICAgICAqICB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5lbmdpbmUuSVBhZ2VSZWNvcmRlcn0pIHRoYXQgaXMgbm90aWZpZWQKLSAgICAgKiAgb2YgYW55IGNoYW5nZXMgdG8gcGVyc2lzdGFudCBwcm9wZXJ0aWVzIG9mIHRoZSBwYWdlLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIENoYW5nZU9ic2VydmVyIGdldENoYW5nZU9ic2VydmVyKCk7Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0aGUgPGNvZGU+TG9jYWxlPC9jb2RlPiBvZiB0aGUgcGFnZS4KLSAgICAgKiAgVGhlIGxvY2FsZSBtYXkgYmUgdXNlZCB0byBkZXRlcm1pbmUgd2hhdCB0ZW1wbGF0ZSBpcwotICAgICAqICB1c2VkIGJ5IHRoZSBwYWdlIGFuZCB0aGUgY29tcG9uZW50cyBjb250YWluZWQgYnkgdGhlIHBhZ2UuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgTG9jYWxlIGdldExvY2FsZSgpOwotCi0gICAgLyoqCi0gICAgICogIFVwZGF0ZXMgdGhlIHBhZ2UncyBsb2NhbGUuICBUaGlzIGlzIHdyaXRlLW9uY2UsIGEgc3Vic2VxdWVudCBhdHRlbXB0Ci0gICAgICogIHdpbGwgdGhyb3cgYW4ge0BsaW5rIEFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbn0uCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCBzZXRMb2NhbGUoTG9jYWxlIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgcGFnZSwgaW5jbHVkaW5nIGl0cwotICAgICAqICBuYW1lc3BhY2UgcHJlZml4LCBpZiBhbnkuCi0gICAgICogCi0gICAgICogIEBzaW5jZSAyLjMKLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhZ2VOYW1lKCk7Ci0KLSAgICAvKioKLSAgICAgKiAgU2V0cyB0aGUgbmFtZSBvZiB0aGUgcGFnZS4KLSAgICAgKiAKLSAgICAgKiAgQHBhcmFtIHBhZ2VOYW1lIGZ1bGx5IHF1YWxpZmllZCBwYWdlIG5hbWUgKGluY2x1ZGluZyBuYW1lc3BhY2UgcHJlZml4LCBpZiBhbnkpCi0gICAgICogCi0gICAgICogIEBzaW5jZSAzLjAKLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYWdlTmFtZShTdHJpbmcgcGFnZU5hbWUpOwotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgYSBwYXJ0aWN1bGFyIGNvbXBvbmVudCBmcm9tIHdpdGhpbiB0aGUgcGFnZS4gIFRoZSBwYXRoIGlzIGEgZG90dGVkCi0gICAgICogIG5hbWUgc2VxdWVuY2UgaWRlbnRpZnlpbmcgdGhlIGNvbXBvbmVudC4gIEl0IG1heSBiZSBudWxsCi0gICAgICogIGluIHdoaWNoIGNhc2UgdGhlIHBhZ2UgcmV0dXJucyBpdHNlbGYuCi0gICAgICoKLSAgICAgKiAgQGV4Y2VwdGlvbiBBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24gcnVudGltZSBleGNlcHRpb24KLSAgICAgKiAgdGhyb3duIGlmIHRoZSBwYXRoIGRvZXMgbm90IGlkZW50aWZ5IGEgY29tcG9uZW50LgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIElDb21wb25lbnQgZ2V0TmVzdGVkQ29tcG9uZW50KFN0cmluZyBwYXRoKTsKLQotICAgIC8qKgotICAgICAqICBBdHRhY2hlcyB0aGUgcGFnZSB0byB0aGUge0BsaW5rIElFbmdpbmUgZW5naW5lfS4KLSAgICAgKiAgVGhpcyBtZXRob2QgaXMgdXNlZCB3aGVuIGEgcG9vbGVkIHBhZ2UgaXMKLSAgICAgKiAgY2xhaW1lZCBmb3IgdXNlIHdpdGggYSBwYXJ0aWN1bGFyIGVuZ2luZTsgaXQgd2lsbCBzdGF5IGF0dGFjaGVkCi0gICAgICogIHRvIHRoZSBlbmdpbmUgdW50aWwgdGhlIGVuZCBvZiB0aGUgY3VycmVudCByZXF1ZXN0IGN5Y2xlLAotICAgICAqICB0aGVuIGJlIHJldHVybmVkIHRvIHRoZSBwb29sLgotICAgICAqIAotICAgICAqICA8cD5UaGlzIG1ldGhvZCBpcyByYXJlbHkgb3ZlcnJpZGVuOyB0byBpbml0aWFsaXplCi0gICAgICogIHBhZ2UgcHJvcGVydGllcyBiZWZvcmUgYSByZW5kZXIsIG92ZXJyaWRlCi0gICAgICogIHtAbGluayAjYmVnaW5SZXNwb25zZShJTWFya3VwV3JpdGVyLCBJUmVxdWVzdEN5Y2xlKX0uCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCBhdHRhY2goSUVuZ2luZSB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiAgSW52b2tlZCB0byByZW5kZXIgdGhlIGVudGlyZSBwYWdlLiAgVGhpcyBzaG91bGQgb25seSBiZSBpbnZva2VkIGJ5Ci0gICAgICogIHtAbGluayBJUmVxdWVzdEN5Y2xlI3JlbmRlclBhZ2UoSU1hcmt1cFdyaXRlciB3cml0ZXIpfS4KLSAgICAgKgotICAgICAqICA8cD5UaGUgcGFnZSBwZXJmb3JtcyBhIHJlbmRlciB1c2luZyB0aGUgZm9sbG93aW5nIHN0ZXBzOgotICAgICAqCi0gICAgICogPHVsPgotICAgICAqICA8bGk+SW52b2tlcyB7QGxpbmsgUGFnZVJlbmRlckxpc3RlbmVyI3BhZ2VCZWdpblJlbmRlcihvcmcuYXBhY2hlLnRhcGVzdHJ5LmV2ZW50LlBhZ2VFdmVudCl9Ci0gICAgICogIDxsaT5JbnZva2VzIHtAbGluayAjYmVnaW5SZXNwb25zZShJTWFya3VwV3JpdGVyLCBJUmVxdWVzdEN5Y2xlKX0KLSAgICAgKiAgPGxpPkludm9rZXMge0BsaW5rIElSZXF1ZXN0Q3ljbGUjY29tbWl0UGFnZUNoYW5nZXMoKX0gKGlmIG5vdCByZXdpbmRpbmcpCi0gICAgICogIDxsaT5JbnZva2VzIHtAbGluayAjcmVuZGVyKElNYXJrdXBXcml0ZXIsIElSZXF1ZXN0Q3ljbGUpfQotICAgICAqICA8bGk+SW52b2tlcyB7QGxpbmsgUGFnZVJlbmRlckxpc3RlbmVyI3BhZ2VFbmRSZW5kZXIob3JnLmFwYWNoZS50YXBlc3RyeS5ldmVudC5QYWdlRXZlbnQpfSAodGhpcyBvY2N1cnMKLSAgICAgKiAgZXZlbiBpZiBhIHByZXZpb3VzIHN0ZXAgdGhyb3dzIGFuIGV4Y2VwdGlvbikuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIHJlbmRlclBhZ2UoSU1hcmt1cFdyaXRlciB3cml0ZXIsIElSZXF1ZXN0Q3ljbGUgY3ljbGUpOwotCi0gICAgLyoqCi0gICAgICogIEludm9rZWQgYmVmb3JlIGEgcGFydGlhbCByZW5kZXIgb2YgdGhlIHBhZ2Ugb2NjdXJzCi0gICAgICogICh0aGlzIGhhcHBlbnMgd2hlbiByZXdpbmRpbmcgYSB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5mb3JtLkZvcm19Ci0gICAgICogIHdpdGhpbiB0aGUgcGFnZSkuICBUaGUgcGFnZSBpcyBleHBlY3RlZCB0byBmaXJlIGFwcG9wcmlhdGUKLSAgICAgKiAgZXZlbnRzLgotICAgICAqIAotICAgICAqICBAc2luY2UgMi4yCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgYmVnaW5QYWdlUmVuZGVyKCk7Ci0KLSAgICAvKioKLSAgICAgKiAgSW52b2tlZCBhZnRlciBhIHBhcnRpYWwgcmVuZGVyIG9mIHRoZSBwYWdlIG9jY3VycwotICAgICAqICAodGhpcyBoYXBwZW5zIHdoZW4gcmV3aW5kaW5nIGEge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkuZm9ybS5Gb3JtfQotICAgICAqICB3aXRoaW4gdGhlIHBhZ2UpLiAgVGhlIHBhZ2UgaXMgZXhwZWN0ZWQgdG8gZmlyZQotICAgICAqICBhcHByb3ByaWF0ZSBldmVudHMuCi0gICAgICogCi0gICAgICogIEBzaW5jZSAyLjIKLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCBlbmRQYWdlUmVuZGVyKCk7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDaGFuZ2VPYnNlcnZlcihDaGFuZ2VPYnNlcnZlciB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiAgTWV0aG9kIGludm9rZWQgYnkgdGhlIHBhZ2UsIGFjdGlvbiBhbmQgZGlyZWN0IHNlcnZpY2VzIAotICAgICAqICB0byB2YWxpZGF0ZSB0aGF0IHRoZQotICAgICAqICB1c2VyIGlzIGFsbG93ZWQgdG8gdmlzaXQgdGhlIHBhZ2UuCi0gICAgICoKLSAgICAgKiAgPHA+TW9zdCB3ZWIgYXBwbGljYXRpb25zIGhhdmUgYSBjb25jZXB0IG9mICdsb2dnaW5nIGluJyBhbmQKLSAgICAgKiAgcGFnZXMgdGhhdCBhbiBhbm9ueW1vdXMgKG5vdCBsb2dnZWQgaW4pIHVzZXIgc2hvdWxkIG5vdCBiZQotICAgICAqICBhYmxlIHRvIHZpc2l0IGRpcmVjdGx5LiAgVGhpcyBtZXRob2QgYWN0cyBhcyB0aGUgZmlyc3QgbGluZSBvZgotICAgICAqICBkZWZlbnNlIGFnYWluc3QgYSBtYWxpY291cyB1c2VyIGhhY2tpbmcgVVJMcy4KLSAgICAgKgotICAgICAqICA8cD5QYWdlcyB0aGF0IHNob3VsZCBiZSBwcm90ZWN0ZWQgd2lsbCB0eXBpY2FsbHkgdGhyb3cgYSB7QGxpbmsKLSAgICAgKiAgUGFnZVJlZGlyZWN0RXhjZXB0aW9ufSwgdG8gcmVkaXJlY3QgdGhlIHVzZXIgdG8gYW4gYXBwcm9wcmlhdGUKLSAgICAgKiAgcGFydCBvZiB0aGUgc3lzdGVtIChzdWNoIGFzLCBhIGxvZ2luIHBhZ2UpLgotICAgICAqIAotICAgICAqICA8cD5TaW5jZSAzLjAsIGl0IGlzIGVhc2llc3QgdG8gbm90IG92ZXJyaWRlIHRoaXMgbWV0aG9kLAotICAgICAqICBidXQgdG8gaW1wbGVtZW50IHRoZSB7QGxpbmsgUGFnZVZhbGlkYXRlTGlzdGVuZXJ9IGludGVyZmFjZQotICAgICAqICBpbnN0ZWFkLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgdmFsaWRhdGUoSVJlcXVlc3RDeWNsZSBjeWNsZSk7Ci0KLSAgICAvKioKLSAgICAgKiAgSW52b2tlZCB0byBjcmVhdGUgYSByZXNwb25zZSB3cml0ZXIgYXBwcm9wcmlhdGUgdG8gdGhlIHBhZ2UKLSAgICAgKiAgKGkuZS4sIGFwcHJvcHJpYXRlIHRvIHRoZSBjb250ZW50IG9mIHRoZSBwYWdlKS4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBJTWFya3VwV3JpdGVyIGdldFJlc3BvbnNlV3JpdGVyKE91dHB1dFN0cmVhbSBvdXQpOwotCi0gICAgLyoqCi0gICAgICogIEludm9rZWQganVzdCBiZWZvcmUgcmVuZGVyaW5nIG9mIHRoZSBwYWdlIGlzIGluaXRpYXRlZC4gIFRoaXMgZ2l2ZXMKLSAgICAgKiAgdGhlIHBhZ2UgYSBjaGFuY2UgdG8gcGVyZm9ybSBhbnkgYWRkaXRpb25hbCBzZXR1cC4gIE9uZSBwb3NzaWJsZSBiZWhhdmlvciBpcwotICAgICAqICB0byBzZXQgSFRUUCBoZWFkZXJzIGFuZCBjb29raWVzIGJlZm9yZSBhbnkgb3V0cHV0IGlzIGdlbmVyYXRlZC4KLSAgICAgKgotICAgICAqICA8cD5UaGUgdGltaW5nIG9mIHRoaXMgZXhwbGljaXRseSA8ZW0+YmVmb3JlPC9lbT4ge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkuZW5naW5lLklQYWdlUmVjb3JkZXIgcGFnZSByZWNvcmRlcn0KLSAgICAgKiAgY2hhbmdlcyBhcmUgY29tbWl0dGVkLiAgUmVuZGVyaW5nIG9jY3VycyA8ZW0+YWZ0ZXI8L2VtPiB0aGUgcmVjb3JkZXJzCi0gICAgICogIGFyZSBjb21taXR0ZWQsIHdoZW4gaXQgaXMgdG9vIGxhdGUgdG8gbWFrZSBjaGFuZ2VzIHRvIGR5bmFtaWMgcGFnZQotICAgICAqICBwcm9wZXJ0aWVzLgotICAgICAqCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCBiZWdpblJlc3BvbnNlKElNYXJrdXBXcml0ZXIgd3JpdGVyLCBJUmVxdWVzdEN5Y2xlIGN5Y2xlKTsKLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIHRoZSBjdXJyZW50IHtAbGluayBJUmVxdWVzdEN5Y2xlfS4gIFRoaXMgaXMgc2V0IHdoZW4gdGhlCi0gICAgICogIHBhZ2UgaXMgbG9hZGVkIChvciBvYnRhaW5lZCBmcm9tIHRoZSBwb29sKSBhbmQgYXR0YWNoZWQgdG8gdGhlCi0gICAgICogIHtAbGluayBJRW5naW5lIGVuZ2luZX0uCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgSVJlcXVlc3RDeWNsZSBnZXRSZXF1ZXN0Q3ljbGUoKTsKLQotICAgIC8qKgotICAgICAqICBJbnZva2VkIGJ5IHRoZSB7QGxpbmsgSVJlcXVlc3RDeWNsZX0gdG8gaW5mb3JtIHRoZSBwYWdlIG9mIHRoZSBjeWNsZSwKLSAgICAgKiAgYXMgaXQgaXMgbG9hZGVkLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgc2V0UmVxdWVzdEN5Y2xlKElSZXF1ZXN0Q3ljbGUgY3ljbGUpOwotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgdGhlIHZpc2l0IG9iamVjdCBmb3IgdGhlIGFwcGxpY2F0aW9uOyB0aGUgdmlzaXQgb2JqZWN0Ci0gICAgICogIGNvbnRhaW5zIGFwcGxpY2F0aW9uLXNwZWNpZmljIGluZm9ybWF0aW9uLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIE9iamVjdCBnZXRWaXNpdCgpOwotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgdGhlIGdsb2JhbGx5IHNoYXJlZCBhcHBsaWNhdGlvbiBvYmplY3QuIFRoZSBnbG9iYWwgb2JqZWN0IGlzCi0gICAgICogIHN0b3JlZCBpbiB0aGUgc2VydmxldCBjb250ZXh0LgotICAgICAqCi0gICAgICogIDxwPlJldHVybnMgdGhlIGdsb2JhbCBvYmplY3QsIGlmIGl0IGV4aXN0cywgb3IgbnVsbCBpZiBub3QgZGVmaW5lZC4KLSAgICAgKgotICAgICAqICBAc2luY2UgMi4zCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIE9iamVjdCBnZXRHbG9iYWwoKTsKLQotICAgIC8qKgotICAgICAqICBAc2luY2UgMS4wLjUKLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIGFkZFBhZ2VSZW5kZXJMaXN0ZW5lcihQYWdlUmVuZGVyTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0gICAgLyoqCi0gICAgICoKLSAgICAgKiAgQHNpbmNlIDIuMQotICAgICAqIAotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVBhZ2VSZW5kZXJMaXN0ZW5lcihQYWdlUmVuZGVyTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0gICAgLyoqCi0gICAgICogIEBzaW5jZSAxLjAuNQotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgYWRkUGFnZURldGFjaExpc3RlbmVyKFBhZ2VEZXRhY2hMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiAgQHNpbmNlIDIuMQotICAgICAqIAotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVBhZ2VEZXRhY2hMaXN0ZW5lcihQYWdlRGV0YWNoTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0gICAgLyoqCi0gICAgICogIEBzaW5jZSAzLjAKLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIGFkZFBhZ2VWYWxpZGF0ZUxpc3RlbmVyKFBhZ2VWYWxpZGF0ZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotICAgIC8qKgotICAgICAqIAotICAgICAqICBAc2luY2UgMy4wCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlUGFnZVZhbGlkYXRlTGlzdGVuZXIoUGFnZVZhbGlkYXRlTGlzdGVuZXIgbGlzdGVuZXIpOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L0lSZW5kZXIuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9JUmVuZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0YmZjOTAuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L0lSZW5kZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5OwotCi0vKioKLSAqICBBbiBlbGVtZW50IHRoYXQgbWF5IGJlIGFza2VkIHRvIHJlbmRlciBpdHNlbGYgdG8gYW4KLSAqICB7QGxpbmsgSU1hcmt1cFdyaXRlcn0gdXNpbmcgYSB7QGxpbmsgSVJlcXVlc3RDeWNsZX0uCi0gKgotICogIDxwPlRoaXMgcHJpbWFyaWx5IGluY2x1ZGVzIHtAbGluayBJQ29tcG9uZW50fSBhbmQge0BsaW5rIElQYWdlfSwKLSAqICBidXQgYWxzbyBleHRlbmRzIHRvIG90aGVyIHRoaW5ncywgc3VjaCBhcyBvYmplY3RzIHJlc3BvbnNpYmxlIGZvcgotICogIHJlbmRlcmluZyBzdGF0aWMgbWFya3VwIHRleHQuCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKgotICoqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElSZW5kZXIKLXsKLSAgICAvKioKLSAgICAgKiAgVGhlIHByaW5jaXBhbCByZW5kZXJpbmcvcmV3aW5kaW5nIG1ldGhvZC4gIFRoaXMgd2lsbCBjYXVzZQotICAgICAqICB0aGUgcmVjZWl2aW5nIGNvbXBvbmVudCB0byByZW5kZXIgaXRzIHRvcCBsZXZlbCBlbGVtZW50cyAoSFRNTAotICAgICAqICB0ZXh0IGFuZCBjb21wb25lbnRzKS4KLSAgICAgKgotICAgICAqICA8cD5SZW5kZXJyaW5nIGFuZCByZXdpbmRpbmcgYXJlIHRoZSBleGFjdCBzYW1lIHByb2Nlc3MuICBUaGUKLSAgICAgKiAgc2FtZSBjb2RlIHRoYXQgcmVuZGVycyBtdXN0IGJlIGFibGUgdG8gcmVzdG9yZSBzdGF0ZSBieSBnb2luZwotICAgICAqICB0aHJvdWdoIHRoZSBleGFjdCBzYW1lIG9wZXJhdGlvbnMgKGV2ZW4gdGhvdWdoIHRoZSBvdXRwdXQgaXMKLSAgICAgKiAgZGlzY2FyZGVkKS4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIHJlbmRlcihJTWFya3VwV3JpdGVyIHdyaXRlciwgSVJlcXVlc3RDeWNsZSBjeWNsZSk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L0lSZXF1ZXN0Q3ljbGUuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9JUmVxdWVzdEN5Y2xlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzZDU1NWUuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L0lSZXF1ZXN0Q3ljbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxMyArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeTsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuZW5naW5lLklFbmdpbmVTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuZW5naW5lLklNb25pdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkucmVxdWVzdC5SZXF1ZXN0Q29udGV4dDsKLQotLyoqCi0gKiAgQ29udHJvbGxlciBvYmplY3QgdGhhdCBtYW5hZ2VzIGEgc2luZ2xlIHJlcXVlc3QgY3ljbGUuICBBIHJlcXVlc3QgY3ljbGUKLSAqICBpcyBvbmUgJ2hpdCcgb24gdGhlIHdlYiBzZXJ2ZXIuICBJbiB0aGUgY2FzZSBvZiBhIFRhcGVzdHJ5IGFwcGxpY2F0aW9uLAotICogIHRoaXMgd2lsbCBpbnZvbHZlOgotICogIDx1bD4KLSAqICA8bGk+UmVzcG9uZGluZyB0byB0aGUgVVJMIGJ5IGZpbmRpbmcgYW4ge0BsaW5rIElFbmdpbmVTZXJ2aWNlfSBvYmplY3QKLSAqICA8bGk+RGV0ZXJtaW5pbmcgdGhlIHJlc3VsdCBwYWdlCi0gKiAgPGxpPlJlbmRlcnJpbmcgdGhlIHJlc3VsdCBwYWdlCi0gKiAgPGxpPlJlbGVhc2luZyBhbnkgcmVzb3VyY2VzCi0gKiAgPC91bD4KLSAqCi0gKiAgPHA+TWl4ZWQgaW4gd2l0aCB0aGlzIGlzOgotICogIDx1bD4KLSAqICA8bGk+RXhjZXB0aW9uIGhhbmRsaW5nCi0gKiAgPGxpPkxvYWRpbmcgb2YgcGFnZXMgYW5kIHRlbXBsYXRlcyBmcm9tIHJlc291cmNlcwotICogIDxsaT5UcmFja2luZyBjaGFuZ2VzIHRvIHBhZ2UgcHJvcGVydGllcywgYW5kIHJlc3RvcmluZyBwYWdlcyB0byBwcmlvciBzdGF0ZXMKLSAqICA8bGk+UG9vbGluZyBvZiBwYWdlIG9iamVjdHMKLSAqICA8L3VsPgotICoKLSAqICA8cD5BIHJlcXVlc3QgY3ljbGUgaXMgYnJva2VuIHVwIGludG8gdHdvIHBoYXNlcy4gICBUaGUgPGVtPnJld2luZDwvZW0+IHBoYXNlCi0gKiAgaXMgb3B0aW9uYWwsIGFzIGl0IHRpZWQgdG8ge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkubGluay5BY3Rpb25MaW5rfSBvcgotICogIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LmZvcm0uRm9ybX0gY29tcG9uZW50cy4gIEluIHRoZSByZXdpbmQgcGhhc2UsCi0gKiAgYSBwcmV2aW91cyBwYWdlIHJlbmRlciBpcyByZWRvbmUgKGRpc2NhcmRpbmcgb3V0cHV0KSB1bnRpbCBhIHNwZWNpZmljIGNvbXBvbmVudAotICogIG9mIHRoZSBwYWdlIGlzIHJlYWNoZWQuICBUaGlzIHJld2luZGluZyBlbnN1cmVzIHRoYXQgdGhlIHBhZ2UKLSAqICBpcyByZXN0b3JlZCB0byB0aGUgZXhhY3Qgc3RhdGUgaXQgaGFkIHdoZW4gdGhlIFVSTCBmb3IgdGhlIHJlcXVlc3QgY3ljbGUgd2FzCi0gKiAgZ2VuZXJhdGVkLCB0YWtpbmcgaW50byBhY2NvdW50IHRoZSBkeW5hbWljIG5hdHVyZSBvZiB0aGUgcGFnZSAoe0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkuY29tcG9uZW50cy5Gb3JlYWNofSwKLSAqICB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5jb21wb25lbnRzLkNvbmRpdGlvbmFsfSwgZXRjLikuICBPbmNlIHRoaXMgY29tcG9uZW50IGlzIHJlYWNoZWQsIGl0IGNhbiBub3RpZnkKLSAqICBpdHMge0BsaW5rIElBY3Rpb25MaXN0ZW5lcn0uICBUaGUgbGlzdGVuZXIgaGFzIHRoZSBhYmlsaXR5IHRvIHVwZGF0ZSB0aGUgc3RhdGUKLSAqICBvZiBhbnkgcGFnZXMgYW5kIHNlbGVjdCBhIG5ldyByZXN1bHQgcGFnZS4KLSAqCi0gKiAgPHA+Rm9sbG93aW5nIHRoZSByZXdpbmQgcGhhc2UgaXMgdGhlIDxlbT5yZW5kZXI8L2VtPiBwaGFzZS4gIER1cmluZyB0aGUgcmVuZGVyIHBoYXNlLAotICogIGEgcGFnZSBpcyBhY3R1YWxseSByZW5kZXJlZCBhbmQgb3V0cHV0IHNlbnQgdG8gdGhlIGNsaWVudCB3ZWIgYnJvd3Nlci4KLSAqCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAKLSAqKi8KLQotcHVibGljIGludGVyZmFjZSBJUmVxdWVzdEN5Y2xlCi17Ci0gICAgLyoqCi0gICAgICogIEludm9rZWQgYWZ0ZXIgdGhlIHJlcXVlc3QgY3ljbGUgaXMgbm8gbG9uZ2VyIG5lZWRlZCwgdG8gcmVsZWFzZSBhbnkgcmVzb3VyY2VzCi0gICAgICogIGl0IG1heSBoYXZlLiAgVGhpcyBpbmNsdWRlcyByZWxlYXNpbmcgYW55IGxvYWRlZCBwYWdlcyBiYWNrIHRvIHRoZSBwYWdlIHNvdXJjZS4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIGNsZWFudXAoKTsKLQotICAgIC8qKgotICAgICAqICBQYXNzZXMgdGhlIFN0cmluZyB0aHJvdWdoIAotICAgICAqICB7QGxpbmsgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2UjZW5jb2RlVVJMKGphdmEubGFuZy5TdHJpbmcpfSwgd2hpY2gKLSAgICAgKiAgZW5zdXJlcyB0aGF0IHRoZSBzZXNzaW9uIGlkIGlzIGVuY29kZWQgaW4gdGhlIFVSTCAoaWYgbmVjZXNzYXJ5KS4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBTdHJpbmcgZW5jb2RlVVJMKFN0cmluZyBVUkwpOwotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgdGhlIGVuZ2luZSB3aGljaCBpcyBwcm9jZXNzaW5nIHRoaXMgcmVxdWVzdCBjeWNsZS4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBJRW5naW5lIGdldEVuZ2luZSgpOwotCi0gICAgLyoqCi0gICAgICogIFJldHJpZXZlcyBhIHByZXZpb3VzbHkgc3RvcmVkIGF0dHJpYnV0ZSwgcmV0dXJuaW5nIG51bGwKLSAgICAgKiAgaWYgbm90IGZvdW5kLiAgQXR0cmlidXRlcyBhbGxvdyBjb21wb25lbnRzIHRvIGxvY2F0ZSBlYWNoIG90aGVyOyBwcmltYXJpbHkKLSAgICAgKiAgdGhleSBhbGxvdyBhIHdyYXBwZWQgY29tcG9uZW50IHRvIGxvY2F0ZSBhIGNvbXBvbmVudCB3aGljaCB3cmFwcyBpdC4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0QXR0cmlidXRlKFN0cmluZyBuYW1lKTsKLQotICAgIHB1YmxpYyBJTW9uaXRvciBnZXRNb25pdG9yKCk7Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0aGUgbmV4dCBhY3Rpb24gaWQuICBBY3Rpb25MaW5rIGlkcyBhcmUgdXNlZCB0byBpZGVudGlmeSBkaWZmZXJlbnQgYWN0aW9ucyBvbiBhCi0gICAgICogIHBhZ2UgKFVSTHMgdGhhdCBhcmUgcmVsYXRlZCB0byBkeW5hbWljIHBhZ2Ugc3RhdGUpLiAgCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5leHRBY3Rpb25JZCgpOwotCi0gICAgLyoqCi0gICAgICogIElkZW50aWZpZXMgdGhlIGFjdGl2ZSBwYWdlLCB0aGUgcGFnZSB3aGljaCB3aWxsIHVsdGltYXRlbHkgcmVuZGVyIHRoZSByZXNwb25zZS4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBJUGFnZSBnZXRQYWdlKCk7Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0aGUgcGFnZSB3aXRoIHRoZSBnaXZlbiBuYW1lLiAgSWYgdGhlIHBhZ2UgaGFzIGJlZW4KLSAgICAgKiAgcHJldmlvdXNseSBsb2FkZWQgaW4gdGhlIGN1cnJlbnQgcmVxdWVzdCBjeWNsZSwgdGhhdCBwYWdlIGlzCi0gICAgICogIHJldHVybmVkLiAgT3RoZXJ3aXNlLCB0aGUgZW5naW5lJ3MgcGFnZSBsb2FkZXIgaXMgdXNlZCB0bwotICAgICAqICBsb2FkIHRoZSBwYWdlLgotICAgICAqCi0gICAgICogIEBzZWUgSUVuZ2luZSNnZXRQYWdlU291cmNlKCkKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgSVBhZ2UgZ2V0UGFnZShTdHJpbmcgbmFtZSk7Ci0KLSAgICBwdWJsaWMgUmVxdWVzdENvbnRleHQgZ2V0UmVxdWVzdENvbnRleHQoKTsKLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIHRydWUgaWYgdGhlIGNvbnRleHQgaXMgYmVpbmcgdXNlZCB0byByZXdpbmQgYSBwcmlvcgotICAgICAqICBzdGF0ZSBvZiB0aGUgcGFnZS4gIFRoaXMgaXMgb25seSB0cnVlIHdoZW4gdGhlcmUgaXMgYSB0YXJnZXQKLSAgICAgKiAgYWN0aW9uIGlkLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIGJvb2xlYW4gaXNSZXdpbmRpbmcoKTsKLQotICAgIC8qKgotICAgICAqICBDaGVja3MgdG8gc2VlIGlmIHRoZSBjdXJyZW50IGFjdGlvbiBpZCBtYXRjaGVzIHRoZSB0YXJnZXQKLSAgICAgKiAgYWN0aW9uIGlkLiAgUmV0dXJucyB0cnVlIG9ubHkgaWYgdGhleSBtYXRjaC4gIFJldHVybnMgZmFsc2UgaWYKLSAgICAgKiAgdGhlcmUgaXMgbm8gdGFyZ2V0IGFjdGlvbiBpZCAodGhhdCBpcywgZHVyaW5nIHBhZ2UgcmVuZGVyaW5nKS4KLSAgICAgKgotICAgICAqICA8cD5JZiB0aGVyZXMgYSBtYXRjaCBvbiBhY3Rpb24gaWQsIHRoZW4gdGhlIGNvbXBvbmVudAotICAgICAqICBpcyBjb21wYXJlZCBhZ2FpbnN0IHRoZSB0YXJnZXQgY29tcG9uZW50LiAgSWYgdGhlcmUncyBhIG1pc21hdGNoCi0gICAgICogIHRoZW4gYSB7QGxpbmsgU3RhbGVMaW5rRXhjZXB0aW9ufSBpcyB0aHJvd24uCi0gICAgICoqLwotCi0gICAgcHVibGljIGJvb2xlYW4gaXNSZXdvdW5kKElDb21wb25lbnQgY29tcG9uZW50KSB0aHJvd3MgU3RhbGVMaW5rRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogIFJlbW92ZXMgYSBwcmV2aW91c2x5IHN0b3JlZCBhdHRyaWJ1dGUsIGlmIG9uZSB3aXRoIHRoZSBnaXZlbiBuYW1lIGV4aXN0cy4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUF0dHJpYnV0ZShTdHJpbmcgbmFtZSk7Ci0KLSAgICAvKioKLSAgICAgKiAgUmVuZGVycyB0aGUgZ2l2ZW4gcGFnZS4gIEFwcGxpY2F0aW9ucyBzaG91bGQgYWx3YXlzIHVzZSB0aGlzCi0gICAgICogIG1ldGhvZCB0byByZW5kZXIgdGhlIHBhZ2UsIHJhdGhlciB0aGFuIGRpcmVjdGx5IGludm9raW5nCi0gICAgICogIHtAbGluayBJUGFnZSNyZW5kZXIoSU1hcmt1cFdyaXRlciwgSVJlcXVlc3RDeWNsZSl9IHNpbmNlIHRoZQotICAgICAqICByZXF1ZXN0IGN5Y2xlIG11c3QgcGVyZm9ybSBzb21lIHNldHVwIGJlZm9yZSByZW5kZXJpbmcuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCByZW5kZXJQYWdlKElNYXJrdXBXcml0ZXIgd3JpdGVyKTsKLQotICAgIC8qKgotICAgICAqICBSZXdpbmRzIGEgcGFnZSBhbmQgZXhlY3V0ZXMgc29tZSBmb3JtIG9mIGFjdGlvbiB3aGVuIHRoZQotICAgICAqICBjb21wb25lbnQgd2l0aCB0aGUgc3BlY2lmaWVkIGFjdGlvbiBpZCBpcyByZWFjaGVkLgotICAgICAqCi0gICAgICogIEBzZWUgSUFjdGlvbgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgcmV3aW5kUGFnZShTdHJpbmcgdGFyZ2V0QWN0aW9uSWQsIElDb21wb25lbnQgdGFyZ2V0Q29tcG9uZW50KTsKLQotICAgIC8qKgotICAgICAqICBBbGxvd3MgYSB0ZW1wb3Jhcnkgb2JqZWN0IHRvIGJlIHN0b3JlZCBpbiB0aGUgcmVxdWVzdCBjeWNsZSwKLSAgICAgKiAgd2hpY2ggYWxsb3dzIG90aGVyd2lzZSB1bnJlbGF0ZWQgb2JqZWN0cyB0byBjb21tdW5pY2F0ZS4gIFRoaXMKLSAgICAgKiAgaXMgc2ltaWxhciB0byA8Y29kZT5IdHRwU2VydmxldFJlcXVlc3Quc2V0QXR0cmlidXRlKCk8L2NvZGU+LAotICAgICAqICBleGNlcHQgdGhhdCB2YWx1ZXMgY2FuIGJlIGNoYW5nZWQgYW5kIHJlbW92ZWQgYXMgd2VsbC4KLSAgICAgKgotICAgICAqICA8cD5UaGlzIGlzIHVzZWQgYnkgY29tcG9uZW50cyB0byBsb2NhdGUgZWFjaCBvdGhlci4gIEEgY29tcG9uZW50LCBzdWNoCi0gICAgICogIGFzIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5Lmh0bWwuQm9keX0sIHdpbGwgd3JpdGUgaXRzZWxmIHVuZGVyIGEgd2VsbC1rbm93biBuYW1lCi0gICAgICogIGludG8gdGhlIHJlcXVlc3QgY3ljbGUsIGFuZCBjb21wb25lbnRzIGl0IHdyYXBzIGNhbiBsb2NhdGUgaXQgYnkgdGhhdCBuYW1lLgotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqICBTZXRzIHRoZSBwYWdlIHRvIGJlIHJlbmRlcmVkLiAgVGhpcyBpcyBjYWxsZWQgYnkgYSBjb21wb25lbnQKLSAgICAgKiAgZHVyaW5nIHRoZSByZXdpbmQgcGhhc2UgdG8gc3BlY2lmeSBhbiBhbHRlcm5hdGUgcGFnZSB0byByZW5kZXIKLSAgICAgKiAgZHVyaW5nIHRoZSByZXNwb25zZSBwaGFzZS4KLSAgICAgKiAKLSAgICAgKiAgQGRlcHJlY2F0ZWQgVG8gYmUgcmVtb3ZlZCBpbiAzLjEuICBVc2Uge0BsaW5rICNhY3RpdmF0ZShJUGFnZSl9LgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgc2V0UGFnZShJUGFnZSBwYWdlKTsKLQotICAgIC8qKgotICAgICAqICBTZXRzIHRoZSBwYWdlIHRvIGJlIHJlbmRlcmVkLiAgVGhpcyBpcyBjYWxsZWQgYnkgYSBjb21wb25lbnQKLSAgICAgKiAgZHVyaW5nIHRoZSByZXdpbmQgcGhhc2UgdG8gc3BlY2lmeSBhbiBhbHRlcm5hdGUgcGFnZSB0byByZW5kZXIKLSAgICAgKiAgZHVyaW5nIHRoZSByZXNwb25zZSBwaGFzZS4KLSAgICAgKgotICAgICAqIEBkZXByZWNhdGVkIFRvIGJlIHJlbW92ZWQgaW4gMy4xLiAgVXNlIHtAbGluayAjYWN0aXZhdGUoU3RyaW5nKX0uCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgc2V0UGFnZShTdHJpbmcgbmFtZSk7Ci0KLSAgICAvKioKLSAgICAgKiAgSW52b2tlZCBqdXN0IGJlZm9yZSByZW5kZXJpbmcgdGhlIHJlc3BvbnNlIHBhZ2UgdG8gZ2V0IGFsbAotICAgICAqICB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5lbmdpbmUuSVBhZ2VSZWNvcmRlciBwYWdlIHJlY29yZGVyc30gdG91Y2hlZCBpbiB0aGlzIHJlcXVlc3QgY3ljbGUKLSAgICAgKiAgdG8gY29tbWl0IHRoZWlyIGNoYW5nZXMgKHNhdmUgdGhlbSB0byBwZXJzaXN0YW50IHN0b3JhZ2UpLgotICAgICAqCi0gICAgICogIEBzZWUgb3JnLmFwYWNoZS50YXBlc3RyeS5lbmdpbmUuSVBhZ2VSZWNvcmRlciNjb21taXQoKQotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIGNvbW1pdFBhZ2VDaGFuZ2VzKCk7Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0aGUgc2VydmljZSB3aGljaCBpbml0aWF0ZWQgdGhpcyByZXF1ZXN0IGN5Y2xlLiAgVGhpcyBtYXkgcmV0dXJuCi0gICAgICogIG51bGwgKHZlcnkgZWFybHkgZHVyaW5nIHRoZSByZXF1ZXN0IGN5Y2xlKSBpZiB0aGUgc2VydmljZSBoYXMgbm90Ci0gICAgICogIHlldCBiZWVuIGRldGVybWluZWQuCi0gICAgICoKLSAgICAgKiAgQHNpbmNlIDEuMC4xCi0gICAgICoqLwotCi0gICAgcHVibGljIElFbmdpbmVTZXJ2aWNlIGdldFNlcnZpY2UoKTsKLQotICAgIC8qKgotICAgICAqICBVc2VkIGJ5IHtAbGluayBJRm9ybSBmb3Jtc30gdG8gcGVyZm9ybSBhIDxlbT5wYXJ0aWFsPC9lbT4gcmV3aW5kCi0gICAgICogIHNvIGFzIHRvIHJlc3BvbmQgdG8gdGhlIGZvcm0gc3VibWlzc2lvbiAodXNpbmcgdGhlIGRpcmVjdCBzZXJ2aWNlKS4KLSAgICAgKgotICAgICAqICBAc2luY2UgMS4wLjIKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCByZXdpbmRGb3JtKElGb3JtIGZvcm0sIFN0cmluZyB0YXJnZXRBY3Rpb25JZCk7Ci0KLSAgICAvKioKLSAgICAgKiAgTXVjaCBsaWtlIHtAbGluayBJRW5naW5lI2ZvcmdldFBhZ2UoU3RyaW5nKX0sIGJ1dCB0aGUgcGFnZSBzdGF5cyBhY3RpdmUgYW5kIGNhbiBldmVuCi0gICAgICogIHJlY29yZCBjaGFuZ2VzLCB1bnRpbCB0aGUgZW5kIG9mIHRoZSByZXF1ZXN0IGN5Y2xlLCBhdCB3aGljaCBwb2ludCBpdCBpcyBkaXNjYXJkZWQKLSAgICAgKiAgKGFuZCBhbnkgcmVjb3JkZWQgY2hhbmdlcyBhcmUgbG9zdCkuCi0gICAgICogIFRoaXMgaXMgdXNlZCBpbiBjZXJ0YWluIHJhcmUgY2FzZXMgd2hlcmUgYSBwYWdlIGhhcyBwZXJzaXN0ZW50IHN0YXRlIGJ1dCBpcwotICAgICAqICBiZWluZyByZW5kZXJyZWQgImZvciB0aGUgbGFzdCB0aW1lIi4KLSAgICAgKiAKLSAgICAgKiAgQHNpbmNlIDIuMC4yCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgZGlzY2FyZFBhZ2UoU3RyaW5nIG5hbWUpOwotCi0gICAgLyoqCi0gICAgICogIEludm9rZWQgYnkgYSB7QGxpbmsgSUVuZ2luZVNlcnZpY2Ugc2VydmljZX0gdG8gc3RvcmUgYW4gYXJyYXkgb2YgYXBwbGljYXRpb24tc3BlY2lmaWMgcGFyYW1ldGVycy4KLSAgICAgKiAgVGhlc2UgY2FuIGxhdGVyIGJlIHJldHJpZXZlZCAodHlwaWNhbGx5LCBieSBhbiBhcHBsaWNhdGlvbi1zcGVjaWZpYyBsaXN0ZW5lciBtZXRob2QpCi0gICAgICogIGJ5IGludm9raW5nIHtAbGluayAjZ2V0U2VydmljZVBhcmFtZXRlcnMoKX0uCi0gICAgICogCi0gICAgICogIDxwPlRocm91Z2ggcmVsZWFzZSAyLjEsIHBhcmFtZXRlcnMgd2FzIG9mIHR5cGUgU3RyaW5nW10uICBUaGlzIGlzCi0gICAgICogIGFuIGluY29tcGF0aWJsZSBjaGFuZ2UgaW4gMi4yLgotICAgICAqIAotICAgICAqICBAc2VlIG9yZy5hcGFjaGUudGFwZXN0cnkuZW5naW5lLkRpcmVjdFNlcnZpY2UKLSAgICAgKiAgQHNpbmNlIDIuMC4zCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgc2V0U2VydmljZVBhcmFtZXRlcnMoT2JqZWN0W10gcGFyYW1ldGVycyk7Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyBwYXJhbWV0ZXJzIHByZXZpb3VzbHkgc3RvcmVkIGJ5IHtAbGluayAjc2V0U2VydmljZVBhcmFtZXRlcnMoT2JqZWN0W10pfS4KLSAgICAgKiAKLSAgICAgKiAgPHA+Ci0gICAgICogIFRocm91Z2ggcmVsZWFzZSAyLjEsIHRoZSByZXR1cm4gdHlwZSB3YXMgU3RyaW5nW10uICBUaGlzIGlzCi0gICAgICogIGFuIGluY29tcGF0aWJsZSBjaGFuZ2UgaW4gMi4yLgotICAgICAqIAotICAgICAqICBAc2luY2UgMi4wLjMKLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgT2JqZWN0W10gZ2V0U2VydmljZVBhcmFtZXRlcnMoKTsKLQotICAgIC8qKgotICAgICAqICBBIGNvbnZpZW5pZW5jZSBmb3IgaW52b2tpbmcge0BsaW5rICNhY3RpdmF0ZShJUGFnZSl9LiAgSW52b2tlcwotICAgICAqICB7QGxpbmsgI2dldFBhZ2UoU3RyaW5nKX0gdG8gZ2V0IGFuIGluc3RhbmNlIG9mIHRoZSBuYW1lZCBwYWdlLgotICAgICAqCi0gICAgICogIEBzaW5jZSAzLjAKLSAgICAgKiAgCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgYWN0aXZhdGUoU3RyaW5nIG5hbWUpOwotCi0gICAgLyoqCi0gICAgICogIFNldHMgdGhlIGFjdGl2ZSBwYWdlIGZvciB0aGUgcmVxdWVzdC4gIFRoZSBhY3RpdmUgcGFnZSBpcyB0aGUgcGFnZQotICAgICAqICB3aGljaCB3aWxsIHVsdGltYXRlbHkgcmVuZGVyIHRoZSByZXNwb25zZS4gIFRoZSBhY3RpdmF0ZSBwYWdlCi0gICAgICogIGlzIHR5cGljYWxseSBzZXQgYnkgdGhlIHtAbGluayBJRW5naW5lU2VydmljZSBzZXJ2aWNlfS4gIEZyZXF1ZW50bHksCi0gICAgICogIHRoZSBhY3RpdmUgcGFnZSBpcyBjaGFuZ2VkIChmcm9tIGEgbGlzdGVuZXIgbWV0aG9kKSB0byBjaG9vc2UgCi0gICAgICogIGFuIGFsdGVybmF0ZSBwYWdlIHRvIHJlbmRlciB0aGUgcmVzcG9uc2UpLgotICAgICAqIAotICAgICAqICA8cD4KLSAgICAgKiAge0BsaW5rIElQYWdlI3ZhbGlkYXRlKElSZXF1ZXN0Q3ljbGUpfSBpcyBpbnZva2VkIG9uIHRoZQotICAgICAqICBwYWdlIHRvIGJlIGFjdGl2YXRlZC4gIHtAbGluayBQYWdlUmVkaXJlY3RFeGNlcHRpb259IGlzIGNhdWdodAotICAgICAqICBhbmQgdGhlIHBhZ2Ugc3BlY2lmaWVkIGluIHRoZSBleGNlcHRpb24gd2lsbCBiZSB0aGUKLSAgICAgKiAgYWN0aXZlIHBhZ2UgaW5zdGVhZCAodGhhdCBpcywgYSBwYWdlIG1heSAicGFzcyB0aGUgYmF0b24iIHRvIGFub3RoZXIKLSAgICAgKiAgcGFnZSB1c2luZyB0aGUgZXhjZXB0aW9uKS4gIFRoZSBuZXcgcGFnZSBpcyBhbHNvIHZhbGlkYXRlZC4gIFRoaXMKLSAgICAgKiAgY29udGludWVzIHVudGlsIGEgcGFnZSBkb2VzIG5vdCB0aHJvdyB7QGxpbmsgUGFnZVJlZGlyZWN0RXhjZXB0aW9ufS4KLSAgICAgKiAgCi0gICAgICogIDxwPgotICAgICAqICBWYWxpZGF0aW9uIGxvb3BzIGNhbiBvY2N1ciwgd2hlcmUgcGFnZSBBIHJlZGlyZWN0cyB0byBwYWdlIEIgYW5kIHRoZW4gcGFnZSBCCi0gICAgICogIHJlZGlyZWN0cyBiYWNrIHRvIHBhZ2UgQSAocG9zc2libHkgd2l0aCBpbnRlcm1lZGlhdGUgc3RlcHMpLiAgVGhpcyBpcyBkZXRlY3RlZCBhbmQgcmVzdWx0cwotICAgICAqICBpbiBhbiB7QGxpbmsgQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9ufS4KLSAgICAgKiAKLSAgICAgKiAgQHNpbmNlIDMuMAotICAgICAqICAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhY3RpdmF0ZShJUGFnZSBwYWdlKTsKLQotfQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L0lSZXNvdXJjZUxvY2F0aW9uLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvSVJlc291cmNlTG9jYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTMzZTU5Ny4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvSVJlc291cmNlTG9jYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeTsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotCi0vKioKLSAqICBEZXNjcmliZXMgdGhlIGxvY2F0aW9uIG9mIGEgcmVzb3VyY2UsIHN1Y2ggYXMgYSBzcGVjaWZpY2F0aW9uCi0gKiAgb3IgdGVtcGxhdGUuICBSZXNvdXJjZXMgbWF5IGJlIGxvY2F0ZWQgd2l0aGluIHRoZSBjbGFzc3BhdGgsCi0gKiAgb3Igd2l0aGluIHRoZSBXZWIgY29udGV4dCByb290IG9yIHNvbWV3aGVyZSBlbHNlIGVudGlyZWx5LgotICogCi0gKiAgPHA+Ci0gKiAgUmVzb3VyY2VzIG1heSBiZSBlaXRoZXIgYmFzZSBvciBsb2NhbGl6ZWQuICBBIGxvY2FsaXplZAotICogIHZlcnNpb24gb2YgYSBiYXNlIHJlc291cmNlIG1heSBiZSBvYnRhaW5lZAotICogIHZpYSB7QGxpbmsgI2dldExvY2FsaXphdGlvbihMb2NhbGUpfS4KLSAqIAotICogIDxwPgotICogIFJlc291cmNlIGxvY2F0aW9ucyBhcmUgdXNlZCBhcyBNYXAga2V5cywgdGhleSBtdXN0IAotICogIGltcGxlbWVudCB7QGxpbmsgamF2YS5sYW5nLk9iamVjdCNoYXNoQ29kZSgpfSBhbmQKLSAqICB7QGxpbmsgamF2YS5sYW5nLk9iamVjdCNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCl9Ci0gKiAgcHJvcGVybHkuCi0gKiAKLSAqICA8cD4KLSAqICBSZXNvdXJjZSBsb2NhdGlvbnMgYXJlIHZhbGlkIGV2ZW4gaWYgdGhlIGNvcnJlc3BvbmRpbmcKLSAqICByZXNvdXJjZSA8aT5kb2Vzbid0IGV4aXN0PC9pPi4gIFRvIHZlcmlmeSBpZiBhIGxvY2FsaXphdGlvbgotICogIGFjdHVhbGx5IGV4aXN0cywgdXNlIHtAbGluayAjZ2V0UmVzb3VyY2VVUkwoKX0sIHdoaWNoIHJldHVybnMKLSAqICBudWxsIGlmIHRoZSByZXNvdXJjZSBkb2Vzbid0IGV4aXN0LiAge0BsaW5rICNnZXRMb2NhbGl6YXRpb24oTG9jYWxlKX0KLSAqICByZXR1cm5zIG9ubHkgcmVhbCByZXNvdXJjZSBsb2NhdGlvbnMsIHdoZXJlIHRoZSByZXNvdXJjZSBleGlzdHMuCi0gKiAKLSAqICA8cD4KLSAqICBGb2xkZXJzIG11c3QgYmUgcmVwcmVzZW50ZWQgd2l0aCBhIHRyYWlsaW5nIHNsYXNoLgotICoKLSAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiAgQHZlcnNpb24gJElkJAotICogIEBzaW5jZSAzLjAKLSAqCi0gKiovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSVJlc291cmNlTG9jYXRpb24KLXsKLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyBhIFVSTCBmb3IgdGhlIHJlc291cmNlLgotICAgICAqIAotICAgICAqICBAcmV0dXJuIHRoZSBVUkwgZm9yIHRoZSByZXNvdXJjZSBpZiBpdCBleGlzdHMsIG9yIG51bGwgaWYgaXQgZG9lcyBub3QKLSAgICAgKiAKLSAgICAgKiovCi0gICAgCi0gICAgcHVibGljIFVSTCBnZXRSZXNvdXJjZVVSTCgpOwotICAgIAotICAgIC8qKgotICAgICAqICBSZXR1cm5zIHRoZSBmaWxlIG5hbWUgcG9ydGlvbiBvZiB0aGUgcmVzb3VyY2UgbG9jYXRpb24uCi0gICAgICogCi0gICAgICoqLwotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOwotICAgIAotICAgIC8qKgotICAgICAqICBSZXR1cm5zIGEgbG9jYWxpemVkIHZlcnNpb24gb2YgdGhpcyByZXNvdXJjZSAob3IgdGhpcyByZXNvdXJjZSwgaWYgbm8KLSAgICAgKiAgYXBwcm9wcmlhdGUgbG9jYWxpemF0aW9uIGlzIGZvdW5kKS4gIFNob3VsZCBvbmx5IGJlIGludm9rZWQKLSAgICAgKiAgb24gYSBiYXNlIHJlc291cmNlLgotICAgICAqIAotICAgICAqICBAcGFyYW0gbG9jYWxlIHRvIGxvY2FsaXplIGZvciwgb3IgbnVsbCBmb3Igbm8gbG9jYWxpemF0aW9uLgotICAgICAqICBAcmV0dXJuIGEgbG9jYWxpemVkIHZlcnNpb24gb2YgdGhpcyByZXNvdXJjZSwgb2YgbnVsbCBpZiB0aGUgcmVzb3VyY2UKLSAgICAgKiAgaXRzZWxmIGRvZXMgbm90IGV4aXN0LgotICAgICAqIAotICAgICAqKi8KLSAgICAKLSAgICBwdWJsaWMgSVJlc291cmNlTG9jYXRpb24gZ2V0TG9jYWxpemF0aW9uKExvY2FsZSBsb2NhbGUpOwotICAgIAotICAgIC8qKgotICAgICAqICBSZXR1cm5zIGF0IGEgcmVsYXRpdmUgbG9jYXRpb24gdG8gdGhpcyByZXNvdXJjZS4gIAotICAgICAqICBUaGUgbmV3IHJlc291cmNlIG1heSBvciBtYXkgbm90IGV4aXN0OyB0aGlzIGNhbiBiZSBkZXRlcm1pbmVkCi0gICAgICogIHZpYSB7QGxpbmsgI2dldFJlc291cmNlVVJMKCl9LgotICAgICAqIAotICAgICAqICBAcGFyYW0gbmFtZSBuYW1lIG9mIG5ldyByZXNvdXJjZSwgcG9zc2libHkgYXMgYSByZWxhdGl2ZSBwYXRoLCBvcgotICAgICAqICBhcyBhbiBhYnNvbHV0ZSBwYXRoIChzdGFydGluZyB3aXRoIGEgc2xhc2gpLgotICAgICAqIAotICAgICAqKi8KLSAgICAKLSAgICBwdWJsaWMgSVJlc291cmNlTG9jYXRpb24gZ2V0UmVsYXRpdmVMb2NhdGlvbihTdHJpbmcgbmFtZSk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgdGhlIHBhdGggdGhhdCByZXByZXNlbnRzIHRoZSByZXNvdXJjZS4gIFRoaXMgc2hvdWxkIAotICAgICAqICBvbmx5IGJlIHVzZWQgd2hlbiB0aGUgdHlwZSBvZiByZXNvdXJjZSBpcyBrbm93bi4KLSAgICAgKiAKLSAgICAgKiovCi0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXRoKCk7Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0aGUgbG9jYWxlIGZvciB3aGljaCB0aGlzIHJlc291cmNlIGhhcyBiZWVuIGxvY2FsaXplZCAKLSAgICAgKiAgb3IgbnVsbCBpZiB0aGUgcmVzb3VyY2UgaGFzIG5vdCBiZWVuIGxvY2FsaXplZC4gVGhpcyBzaG91bGQgCi0gICAgICogIG9ubHkgYmUgdXNlZCB3aGVuIHRoZSB0eXBlIG9mIHJlc291cmNlIGlzIGtub3duLgotICAgICAqIAotICAgICAqICBUaGlzIGxvY2FsZSBpcyB0aGUgc2FtZSBvciBtb3JlIGdlbmVyYWwgdGhhbiB0aGUgbG9jYWxlIGZvciB3aGljaCBsb2NhbGl6YXRpb24gCi0gICAgICogIHdhcyByZXF1ZXN0ZWQuIEZvciBleGFtcGxlLCBpZiB0aGUgcmVxdWVzdGVkIGxvY2FsZSB3YXMgZW5fVVMsIGJ1dCBvbmx5IHRoZSBmaWxlIAotICAgICAqICBIb21lX2VuIHdhcyBmb3VuZCwgdGhpcyBsb2NhbGUgcmV0dXJuZWQgd291bGQgYmUgZW4uIAotICAgICAqKi8KLSAgICAKLSAgICBwdWJsaWMgTG9jYWxlIGdldExvY2FsZSgpOwotfQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L0lSZXNvdXJjZVJlc29sdmVyLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvSVJlc291cmNlUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDgzNzE3YS4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvSVJlc291cmNlUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5OwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb2dubC5DbGFzc1Jlc29sdmVyOwotCi0vKioKLSAqIEFuIG9iamVjdCB3aGljaCBpcyB1c2VkIHRvIHJlc29sdmUgY2xhc3NlcyBhbmQgY2xhc3MtcGF0aCByZXNvdXJjZXMuCi0gKiBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlLCBpbiBhbiBhcHBsaWNhdGlvbiBzZXJ2ZXIsIGRpZmZlcmVudCBjbGFzcyBsb2FkZXJzCi0gKiB3aWxsIGJlIGxvYWRpbmcgdGhlIFRhcGVzdHJ5IGZyYW1ld29yayBhbmQgdGhlIHNwZWNpZmljIFRhcGVzdHJ5IGFwcGxpY2F0aW9uLgotICoKLSAqIDxwPlRoZSBjbGFzcyBsb2FkZXIgZm9yIHRoZSBmcmFtZXdvcmsgbmVlZHMgdG8gYmUgYWJsZSB0byBzZWUgcmVzb3VyY2VzIGluCi0gKiB0aGUgYXBwbGljYXRpb24sIGJ1dCB0aGUgYXBwbGljYXRpb24ncyBjbGFzcyBsb2FkZXIgaXMgYSBkZXNjZW5kZW50IG9mIHRoZQotICogZnJhbWV3b3JrJ3MgY2xhc3MgbG9hZGVyLiAgVG8gcmVzb2x2ZSB0aGlzLCB3ZSBuZWVkIGEgJ2hvb2snLCBhbiBpbnN0YW5jZQotICogdGhhdCBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGFwcGxpY2F0aW9uJ3MgY2xhc3MgbG9hZGVyLgotICogCi0gKiA8cD5UbyBtb3JlIGVhc2lseSBzdXBwb3J0IE9HTkwsIHRoaXMgaW50ZXJmYWNlIG5vdyBleHRlbmRzCi0gKiAge0BsaW5rIG9nbmwuQ2xhc3NSZXNvbHZlcn0uCi0gKiAKLSAqIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqIEB2ZXJzaW9uICRJZCQKLSAqKi8KLQotcHVibGljIGludGVyZmFjZSBJUmVzb3VyY2VSZXNvbHZlciBleHRlbmRzIENsYXNzUmVzb2x2ZXIKLXsKLSAgICAvKioKLSAgICAgKiAgRm9yd2FyZGVkLCB1bmNoYW5nZWQsIHRvIHRoZSBjbGFzcyBsb2FkZXIuICBSZXR1cm5zIG51bGwgaWYgdGhlCi0gICAgICogIHJlc291cmNlIGlzIG5vdCBmb3VuZC4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBVUkwgZ2V0UmVzb3VyY2UoU3RyaW5nIG5hbWUpOwotCi0gICAgLyoqCi0gICAgICogIEZvcndhcmRlZCwgdG8gdGhlIHRoZSBtZXRob2QKLSAgICAgKiAgPGNvZGU+Q2xhc3MuZm9yTmFtZShTdHJpbmcsIGJvb2xlYW4sIENsYXNzTG9hZGVyKTwvY29kZT4sIHVzaW5nCi0gICAgICogIHRoZSBhcHBsaWNhdGlvbidzIGNsYXNzIGxvYWRlci4KLSAgICAgKgotICAgICAqICBUaHJvd3MgYW4ge0BsaW5rIEFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbn0gb24gYW55IGVycm9yLgotICAgICAqKi8KLQotICAgIHB1YmxpYyBDbGFzcyBmaW5kQ2xhc3MoU3RyaW5nIG5hbWUpOwotICAgIAotICAgIC8qKgotICAgICAqICBSZXR1cm5zIGEge0BsaW5rIGphdmEubGFuZy5DbGFzc0xvYWRlcn0gdGhhdCBjYW4gc2VlCi0gICAgICogIGFsbCB0aGUgY2xhc3NlcyB0aGUgcmVzb2x2ZXIgY2FuIGFjY2Vzcy4KLSAgICAgKiAKLSAgICAgKiAgQHNpbmNlIDMuMAotICAgICAqIAotICAgICAqKi8KLSAgICAKLSAgICBwdWJsaWMgQ2xhc3NMb2FkZXIgZ2V0Q2xhc3NMb2FkZXIoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvSVNjcmlwdC5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L0lTY3JpcHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RkZGVhNS4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvSVNjcmlwdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqICBBbiBvYmplY3QgdGhhdCBjYW4gY29udmVydCBhIHNldCBvZiBzeW1ib2xzIGludG8gYSBjb2xsZWN0aW9uIG9mIEphdmFTY3JpcHQgc3RhdGVtZW50cy4KLSAqCi0gKiAgPHA+SVNjcmlwdCBpbXBsZW1lbnRhdGlvbiBtdXN0IGJlIHRocmVhZHNhZmUuCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQHNpbmNlIDEuMC4yCi0gKiAKLSAqKi8KLQotcHVibGljIGludGVyZmFjZSBJU2NyaXB0Ci17Ci0gICAgLyoqCi0gICAgICogIFJldHVybnMgdGhlIGxvY2F0aW9uIGZyb20gd2hpY2ggdGhlIHNjcmlwdCB3YXMgbG9hZGVkLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIElSZXNvdXJjZUxvY2F0aW9uIGdldFNjcmlwdExvY2F0aW9uKCk7Ci0KLSAgICAvKioKLSAgICAgKiBFeGVjdXRlcyB0aGUgc2NyaXB0LCB3aGljaCB3aWxsIHJlYWQgYW5kIG1vZGlmeSB0aGUgc3ltYm9scyB7QGxpbmsgTWFwfS4gIFRoZQotICAgICAqIHNjcmlwdCB3b3JrcyB3aXRoIHRoZSB7QGxpbmsgSVNjcmlwdFByb2Nlc3Nvcn0gdG8gZ2V0IHRoZSBnZW5lcmF0ZWQgSmF2YVNjcmlwdAotICAgICAqIGluY2x1ZGVkIG9uIHRoZSBwYWdlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjeWNsZSB0aGUgY3VycmVudCByZXF1ZXN0IGN5Y2xlCi0gICAgICogQHBhcmFtIHByb2Nlc3NvciBhbiBvYmplY3QgdGhhdCBwcm9jZXNzZXMgdGhlIHJlc3VsdHMgb2YgdGhlIHNjcmlwdCwgdHlwaWNhbGx5Ci0gICAgICogYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkuaHRtbC5Cb2R5fQotICAgICAqIEBwYXJhbSBzeW1ib2xzIE1hcCBvZiBpbnB1dCBzeW1ib2xzOyBleGVjdXRpb24gb2YgdGhlIHNjcmlwdCBtYXkgbW9kaWZ5IHRoZSBtYXAsCi0gICAgICogY3JlYXRpbmcgbmV3IG91dHB1dCBzeW1ib2xzCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLnRhcGVzdHJ5Lmh0bWwuQm9keSNnZXQoSVJlcXVlc3RDeWNsZSkKLSAgICAgKgotICAgICAqLwotCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZShJUmVxdWVzdEN5Y2xlIGN5Y2xlLCBJU2NyaXB0UHJvY2Vzc29yIHByb2Nlc3NvciwgTWFwIHN5bWJvbHMpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9JU2NyaXB0UHJvY2Vzc29yLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvSVNjcmlwdFByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzUxNzljLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9JU2NyaXB0UHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeTsKLQotLyoqCi0gKiBEZWZpbmVzIG1ldGhvZHMgbmVlZGVkIGJ5IGEge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkuSVNjcmlwdH0gdG8KLSAqIGV4ZWN1dGUuCi0gKgotICogQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogQHZlcnNpb24gJElkJAotICogQHNpbmNlIDMuMAotICogQHNlZSBvcmcuYXBhY2hlLnRhcGVzdHJ5Lmh0bWwuQm9keQotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSVNjcmlwdFByb2Nlc3NvcgotewotCS8qKgotCSAqIEFkZHMgc2NyaXB0aW5nIGNvZGUgdG8gdGhlIG1haW4gYm9keS4gIER1cmluZyB0aGUgcmVuZGVyLCBtdWx0aXBsZSBzY3JpcHRzIG1heQotCSAqIHJlbmRlciBtdWx0aXBsZSBib2RpZXM7IGFsbCBhcmUgY29uY2F0aW5hdGVkIHRvZ2V0aGVyIHRvIGZvcm0KLQkgKiBhIHNpbmdsZSBibG9jay4KLQkgKi8KLQkKLQlwdWJsaWMgdm9pZCBhZGRCb2R5U2NyaXB0KFN0cmluZyBzY3JpcHQpOwotCQotCS8qKgotCSAqIEFkZHMgaW5pdGlhbGl6YXRpb24gc2NyaXB0LiAgSW5pdGlhbGl6YXRpb24gc2NyaXB0IGlzIGV4ZWN1dGVkIG9uY2UsIHdoZW4KLQkgKiB0aGUgY29udGFpbmluZyBwYWdlIGxvYWRzLiAgRWZmZWN0aXZlbHksIHRoaXMgbWVhbnMgdGhhdCBpbml0aWFsaXphdGlvbiBzY3JpcHQKLQkgKiBpcyBzdG9yZWQgaW5zaWRlIHRoZSBIVE1MICZsdDtib2R5Jmd0OyBlbGVtZW50J3MgPGNvZGU+b25sb2FkPC9jb2RlPgotCSAqIGV2ZW50IGhhbmRsZXIuCi0JICovCi0JcHVibGljIHZvaWQgYWRkSW5pdGlhbGl6YXRpb25TY3JpcHQoU3RyaW5nIHNjcmlwdCk7Ci0JCi0JLyoqCi0JICogQWRkcyBhbiBleHRlcm5hbCBzY3JpcHQuICBUaGUgcHJvY2Vzc29yIGlzIGV4cGVjdGVkIHRvIGVuc3VyZQotCSAqIHRoYXQgZXh0ZXJuYWwgc2NyaXB0cyBhcmUgb25seSBsb2FkZWQgYSBzaW5nbGUgdGltZSBwZXIgcGFnZS4KLQkgKi8KLQkKLQlwdWJsaWMgdm9pZCBhZGRFeHRlcm5hbFNjcmlwdChJUmVzb3VyY2VMb2NhdGlvbiBsb2NhdGlvbik7Ci0JCi0JLyoqCi0JICogRW5zdXJlcyB0aGF0IHRoZSBnaXZlbiBzdHJpbmcgaXMgdW5pcXVlLiAgVGhlIHN0cmluZwotCSAqIGlzIGVpdGhlciByZXR1cm5lZCB1bmNoYW5nZWQsIG9yIGEgc3VmZml4IGlzIGFwcGVuZGVkIHRvCi0JICogZW5zdXJlIHVuaXF1ZW5lc3MuCi0JICovCi0JCi0JcHVibGljIFN0cmluZyBnZXRVbmlxdWVTdHJpbmcoU3RyaW5nIGJhc2VWYWx1ZSk7Ci19CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvTG9jYXRpb24uamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9Mb2NhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDcxZTg0Li4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9Mb2NhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuYnVpbGRlci5FcXVhbHNCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLmJ1aWxkZXIuSGFzaENvZGVCdWlsZGVyOwotCi0vKioKLSAqICBJbXBsZW1lbnRhdGlvbiBvZiB0aGUge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkuSUxvY2F0aW9ufSBpbnRlcmZhY2UuCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQHNpbmNlIDMuMAotICoKLSAqKi8KLXB1YmxpYyBjbGFzcyBMb2NhdGlvbiBpbXBsZW1lbnRzIElMb2NhdGlvbgotewotICAgIHByaXZhdGUgSVJlc291cmNlTG9jYXRpb24gX3Jlc291cmNlTG9jYXRpb247Ci0gICAgcHJpdmF0ZSBpbnQgX2xpbmVOdW1iZXIgPSAtMTsKLSAgICBwcml2YXRlIGludCBfY29sdW1uTnVtYmVyID0gLTE7Ci0KLSAgICBwdWJsaWMgTG9jYXRpb24oSVJlc291cmNlTG9jYXRpb24gbG9jYXRpb24pCi0gICAgewotICAgICAgICBfcmVzb3VyY2VMb2NhdGlvbiA9IGxvY2F0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyBMb2NhdGlvbihJUmVzb3VyY2VMb2NhdGlvbiBsb2NhdGlvbiwgaW50IGxpbmVOdW1iZXIpCi0gICAgewotICAgICAgICB0aGlzKGxvY2F0aW9uKTsKLQotICAgICAgICBfbGluZU51bWJlciA9IGxpbmVOdW1iZXI7Ci0gICAgfQotCi0gICAgcHVibGljIExvY2F0aW9uKElSZXNvdXJjZUxvY2F0aW9uIGxvY2F0aW9uLCBpbnQgbGluZU51bWJlciwgaW50IGNvbHVtbk51bWJlcikKLSAgICB7Ci0gICAgICAgIHRoaXMobG9jYXRpb24pOwotCi0gICAgICAgIF9saW5lTnVtYmVyID0gbGluZU51bWJlcjsKLSAgICAgICAgX2NvbHVtbk51bWJlciA9IGNvbHVtbk51bWJlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSVJlc291cmNlTG9jYXRpb24gZ2V0UmVzb3VyY2VMb2NhdGlvbigpCi0gICAgewotICAgICAgICByZXR1cm4gX3Jlc291cmNlTG9jYXRpb247Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRMaW5lTnVtYmVyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfbGluZU51bWJlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldENvbHVtbk51bWJlcigpCi0gICAgewotICAgICAgICByZXR1cm4gX2NvbHVtbk51bWJlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkKLSAgICB7Ci0gICAgICAgIEhhc2hDb2RlQnVpbGRlciBidWlsZGVyID0gbmV3IEhhc2hDb2RlQnVpbGRlcigyMzcsIDUzKTsKLQotICAgICAgICBidWlsZGVyLmFwcGVuZChfcmVzb3VyY2VMb2NhdGlvbik7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKF9saW5lTnVtYmVyKTsKLSAgICAgICAgYnVpbGRlci5hcHBlbmQoX2NvbHVtbk51bWJlcik7Ci0KLSAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9IYXNoQ29kZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb3RoZXIpCi0gICAgewotICAgICAgICBpZiAoIShvdGhlciBpbnN0YW5jZW9mIElMb2NhdGlvbikpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgSUxvY2F0aW9uIGwgPSAoSUxvY2F0aW9uKSBvdGhlcjsKLQotICAgICAgICBFcXVhbHNCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgRXF1YWxzQnVpbGRlcigpOwotICAgICAgICBidWlsZGVyLmFwcGVuZChfbGluZU51bWJlciwgbC5nZXRMaW5lTnVtYmVyKCkpOwotICAgICAgICBidWlsZGVyLmFwcGVuZChfY29sdW1uTnVtYmVyLCBsLmdldENvbHVtbk51bWJlcigpKTsKLSAgICAgICAgYnVpbGRlci5hcHBlbmQoX3Jlc291cmNlTG9jYXRpb24sIGwuZ2V0UmVzb3VyY2VMb2NhdGlvbigpKTsKLQotICAgICAgICByZXR1cm4gYnVpbGRlci5pc0VxdWFscygpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICAgIHsKLSAgICAgICAgaWYgKF9saW5lTnVtYmVyIDw9IDAgJiYgX2NvbHVtbk51bWJlciA8PSAwKQotICAgICAgICAgICAgcmV0dXJuIF9yZXNvdXJjZUxvY2F0aW9uLnRvU3RyaW5nKCk7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKF9yZXNvdXJjZUxvY2F0aW9uLnRvU3RyaW5nKCkpOwotICAgICAgICBpZiAoX2xpbmVOdW1iZXIgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBidWZmZXIuYXBwZW5kKCIsIGxpbmUgIik7Ci0gICAgICAgICAgICBidWZmZXIuYXBwZW5kKF9saW5lTnVtYmVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChfY29sdW1uTnVtYmVyID4gMCkKLSAgICAgICAgewotICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiLCBjb2x1bW4gIik7Ci0gICAgICAgICAgICBidWZmZXIuYXBwZW5kKF9jb2x1bW5OdW1iZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9QYWdlUmVkaXJlY3RFeGNlcHRpb24uamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9QYWdlUmVkaXJlY3RFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk5MGZlZi4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvUGFnZVJlZGlyZWN0RXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeTsKLQotLyoqCi0gKiAgRXhjZXB0aW9uIHRocm93biBieSBhIHtAbGluayBJQ29tcG9uZW50IGNvbXBvbmVudH0gb3Ige0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkuZW5naW5lLklFbmdpbmVTZXJ2aWNlfQotICogIHRoYXQgd2lzaGVzIHRvIGZvcmNlIHRoZSBhcHBsaWNhdGlvbiB0byBhIHBhcnRpY3VsYXIgcGFnZS4gIFRoaXMgaXMgb2Z0ZW4gdXNlZAotICogIHRvIHByb3RlY3QgYSBzZW5zaXRpdmUgcGFnZSB1bnRpbCB0aGUgdXNlciBpcyBhdXRoZW50aWNhdGVkLgotICoKLSAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiAgQHZlcnNpb24gJElkJAotICoqLwotCi1wdWJsaWMgY2xhc3MgUGFnZVJlZGlyZWN0RXhjZXB0aW9uIGV4dGVuZHMgQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uCi17Ci0gICAgcHJpdmF0ZSBTdHJpbmcgX3RhcmdldFBhZ2VOYW1lOwotCi0gICAgcHVibGljIFBhZ2VSZWRpcmVjdEV4Y2VwdGlvbihTdHJpbmcgdGFyZ2V0UGFnZU5hbWUpCi0gICAgewotICAgICAgICB0aGlzKHRhcmdldFBhZ2VOYW1lLCBudWxsLCBudWxsLCB0YXJnZXRQYWdlTmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFBhZ2VSZWRpcmVjdEV4Y2VwdGlvbihJUGFnZSBwYWdlKQotICAgIHsKLSAgICAgICAgdGhpcyhwYWdlLmdldFBhZ2VOYW1lKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBQYWdlUmVkaXJlY3RFeGNlcHRpb24oCi0gICAgICAgIFN0cmluZyBtZXNzYWdlLAotICAgICAgICBPYmplY3QgY29tcG9uZW50LAotICAgICAgICBUaHJvd2FibGUgcm9vdENhdXNlLAotICAgICAgICBTdHJpbmcgdGFyZ2V0UGFnZU5hbWUpCi0gICAgewotICAgICAgICBzdXBlcihtZXNzYWdlLCBjb21wb25lbnQsIG51bGwsIHJvb3RDYXVzZSk7Ci0KLSAgICAgICAgX3RhcmdldFBhZ2VOYW1lID0gdGFyZ2V0UGFnZU5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRUYXJnZXRQYWdlTmFtZSgpCi0gICAgewotICAgICAgICByZXR1cm4gX3RhcmdldFBhZ2VOYW1lOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvUmVkaXJlY3RFeGNlcHRpb24uamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9SZWRpcmVjdEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmM4ZDQ0Li4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9SZWRpcmVjdEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnk7Ci0KLS8qKgotICogIEV4Y2VwdGlvbiB0aHJvd24gdG8gZm9yY2UgYSByZWRpcmVjdGlvbiB0byBhbiBhcmJpdHJhcnkgbG9jYXRpb24uCi0gKiAgVGhpcyBpcyB1c2VkIHdoZW4sIGFmdGVyIHByb2Nlc3NpbmcgYSByZXF1ZXN0IChzdWNoIGFzIGEgZm9ybQotICogIHN1Ym1pc3Npb24gb3IgYSBsaW5rIGJlaW5nIGNsaWNrZWQpLCBpdCBpcyBkZXNpcmFibGUgdG8gZ28KLSAqICB0byBzb21lIGFyYml0cmFyeSBuZXcgbG9jYXRpb24uCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQHNpbmNlIDEuMC42Ci0gKgotICoqLwotCi1wdWJsaWMgY2xhc3MgUmVkaXJlY3RFeGNlcHRpb24gZXh0ZW5kcyBBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24KLXsKLQlwcml2YXRlIFN0cmluZyBfcmVkaXJlY3RMb2NhdGlvbjsKLQotCXB1YmxpYyBSZWRpcmVjdEV4Y2VwdGlvbihTdHJpbmcgcmVkaXJlY3RMb2NhdGlvbikKLQl7Ci0JCXRoaXMobnVsbCwgcmVkaXJlY3RMb2NhdGlvbik7Ci0JfQotCi0JLyoqIAotCSAqICBAcGFyYW0gbWVzc2FnZSBBIG1lc3NhZ2UgZGVzY3JpYmluZyB3aHkgdGhlIHJlZGlyZWN0aW9uIGlzIHRha2luZyBwbGFjZS4KLQkgKiAgQHBhcmFtIHJlZGlyZWN0TG9jYXRpb24gVGhlIGxvY2F0aW9uIHRvIHJlZGlyZWN0IHRvLCBtYXkgYmUgYSByZWxhdGl2ZSBwYXRoIChyZWxhdGl2ZQotCSAqICB0byB0aGUge0BsaW5rIGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHR9KS4KLQkgKgotCSAqICBAc2VlIGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlI3NlbmRSZWRpcmVjdChTdHJpbmcpCi0JICogIEBzZWUgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2UjZW5jb2RlUmVkaXJlY3RVUkwoU3RyaW5nKQotCSAqCi0JICoqLwotCi0JcHVibGljIFJlZGlyZWN0RXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBTdHJpbmcgcmVkaXJlY3RMb2NhdGlvbikKLQl7Ci0JCXN1cGVyKG1lc3NhZ2UpOwotCi0JCV9yZWRpcmVjdExvY2F0aW9uID0gcmVkaXJlY3RMb2NhdGlvbjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFJlZGlyZWN0TG9jYXRpb24oKQotCXsKLQkJcmV0dXJuIF9yZWRpcmVjdExvY2F0aW9uOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvUmVkaXJlY3RGaWx0ZXIuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9SZWRpcmVjdEZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTY3OWI4Li4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9SZWRpcmVjdEZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuRmlsdGVyOwotaW1wb3J0IGphdmF4LnNlcnZsZXQuRmlsdGVyQ2hhaW47Ci1pbXBvcnQgamF2YXguc2VydmxldC5GaWx0ZXJDb25maWc7Ci1pbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldFJlcXVlc3Q7Ci1pbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0UmVzcG9uc2U7Ci1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi0vKioKLSAqIEZpbHRlciB1c2VkIHRvIHJlZGlyZWN0IGEgcm9vdCBjb250ZXh0IFVSTCAoaS5lLiwgIi9jb250ZXh0IiBvciAiL2NvbnRleHQvIgotICogdG8gdGhlIFRhcGVzdHJ5IGFwcGxpY2F0aW9uIHNlcnZsZXQgKHR5cGljYWxseSwgIi9jb250ZXh0L2FwcCIpLiAgVGhpcwotICogc2VydmxldCBpcyBtYXBwZWQgdG8gIi8iIGFuZCBtdXN0IGhhdmUgYSAmbHQ7aW5pdC1wYXJhbWV0ZXImO2d0OyAKLSAqIDxjb2RlPnJlZGlyZWN0LXBhdGg8L2NvZGU+IHRoYXQgaXMgdGhlIGFwcGxpY2F0aW9uIHNlcnZsZXQncyBwYXRoIChpLmUuLAotICogIi9hcHAiKS4gIElmIG5vIHZhbHVlIGlzIHNwZWNpZmllZCwgdGhlbiAiL2FwcCIgaXMgdXNlZC4gIFRoZSBwYXRoCi0gKiBpcyBhbHdheXMgcmVsYXRpdmUgdG8gdGhlIHNlcnZsZXQgY29udGV4dCwgYW5kIHNob3VsZCBhbHdheXMKLSAqIGJlZ2luIHdpdGggYSBsZWFkaW5nIHNsYXNoLgotICogIAotICogPHA+RmlsdGVycyBhcmUgb25seSBhdmFpbGFibGUgaW4gU2VydmxldCBBUEkgMi4zIGFuZCBhYm92ZS4KLSAqIAotICogPHA+U2VydmxldCBBUEkgMi40IGlzIGV4cGVjdGVkIHRvIGFsbG93IGEgc2VydmxldHMgaW4gdGhlIHdlbGNvbWUgbGlzdAotICogKGVxdWl2YWxlbnQgdG8gaW5kZXguaHRtbCBvciBpbmRleC5qc3ApLCBhdCB3aGljaCBwb2ludCB0aGlzIGZpbHRlcgotICogc2hvdWxkIG5vIGxvbmdlciBiZSBuZWNlc3NhcnkuCi0gKgotICogQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogQHZlcnNpb24gJElkJAotICogQHNpbmNlIDMuMAotICovCi0KLXB1YmxpYyBjbGFzcyBSZWRpcmVjdEZpbHRlciBpbXBsZW1lbnRzIEZpbHRlcgotewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBMT0cgPSBMb2dGYWN0b3J5LmdldExvZyhSZWRpcmVjdEZpbHRlci5jbGFzcyk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVESVJFQ1RfUEFUSF9QQVJBTSA9ICJyZWRpcmVjdC1wYXRoIjsKLQotICAgIHByaXZhdGUgU3RyaW5nIF9yZWRpcmVjdFBhdGg7Ci0KLSAgICBwdWJsaWMgdm9pZCBpbml0KEZpbHRlckNvbmZpZyBjb25maWcpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uCi0gICAgewotICAgICAgICBfcmVkaXJlY3RQYXRoID0gY29uZmlnLmdldEluaXRQYXJhbWV0ZXIoUkVESVJFQ1RfUEFUSF9QQVJBTSk7Ci0KLSAgICAgICAgaWYgKFRhcGVzdHJ5LmlzQmxhbmsoX3JlZGlyZWN0UGF0aCkpCi0gICAgICAgICAgICBfcmVkaXJlY3RQYXRoID0gIi9hcHAiOwotCi0gICAgICAgIGlmIChMT0cuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgICAgIExPRy5kZWJ1ZyhUYXBlc3RyeS5mb3JtYXQoIlJlZGlyZWN0U2VydmxldC5yZWRpcmVjdC1wYXRoIiwgX3JlZGlyZWN0UGF0aCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3koKQotICAgIHsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgZmlsdGVyIGludGVyY2VwdHMgdGhlIHNvLWNhbGxlZCAiZGVmYXVsdCIgc2VydmxldCwgd2hvc2Ugam9iIGlzCi0gICAgICogdG8gcHJvdmlkZSBhY2Nlc3MgdG8gc3RhbmRhcmQgcmVzb3VyY2VzIHBhY2thZ2VkIHdpdGhpbiB0aGUgd2ViIGFwcGxpY2F0aW9uCi0gICAgICogY29udGV4dC4gIFRoaXMgY29kZSBpcyBpbnRlcmVzdGVkIGluIG9ubHkgdGhlIHZlcnkgcm9vdCwgcmVkaXJlY3RpbmcKLSAgICAgKiB0byB0aGUgYXBwcm9wcmlhdGUgVGFwZXN0cnkgYXBwbGljYXRpb24gc2VydmxldC4gIE90aGVyIHZhbHVlcwotICAgICAqIGFyZSBwYXNzZWQgdGhyb3VnaCB1bmNoYW5nZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZG9GaWx0ZXIoU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLCBGaWx0ZXJDaGFpbiBjaGFpbikKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uCi0gICAgewotICAgICAgICBIdHRwU2VydmxldFJlcXVlc3QgaHJlcXVlc3QgPSAoSHR0cFNlcnZsZXRSZXF1ZXN0KSByZXF1ZXN0OwotICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIGhyZXNwb25zZSA9IChIdHRwU2VydmxldFJlc3BvbnNlKSByZXNwb25zZTsKLQotICAgICAgICBTdHJpbmcgc2VydmxldFBhdGggPSBocmVxdWVzdC5nZXRTZXJ2bGV0UGF0aCgpOwotICAgICAgICBTdHJpbmcgcGF0aEluZm8gPSBocmVxdWVzdC5nZXRQYXRoSW5mbygpOwotCi0gICAgICAgIC8vIEJlZW4gZXhwZXJpbWVudGluZyB3aXRoIGRpZmZlcmVudCBzZXJ2bGV0IGNvbnRhaW5lcnMuICBJbiBKZXR0eSA0LjIuOCBhbmQgVG9tY2F0IDQuMSwKLSAgICAgICAgLy8gcmVzb3VyY2VzIGhhdmUgYSBub24tbnVsbCBzZXJ2bGV0UGF0aC4gIElmIEpCb3NzV2ViIDMuMC42LCB0aGUgc2VydmxldFBhdGggaXMKLSAgICAgICAgLy8gbnVsbCBhbmQgdGhlIHBhdGhJbmZvIGluZGljYXRlcyB0aGUgcmVsYXRpdmUgbG9jYXRpb24gb2YgdGhlIHJlc291cmNlLgotCi0gICAgICAgIGlmICgoVGFwZXN0cnkuaXNCbGFuayhzZXJ2bGV0UGF0aCkgfHwgc2VydmxldFBhdGguZXF1YWxzKCIvIikpCi0gICAgICAgICAgICAmJiAoVGFwZXN0cnkuaXNCbGFuayhwYXRoSW5mbykgfHwgcGF0aEluZm8uZXF1YWxzKCIvIikpKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgcGF0aCA9IGhyZXF1ZXN0LmdldENvbnRleHRQYXRoKCkgKyBfcmVkaXJlY3RQYXRoOwotCi0gICAgICAgICAgICBpZiAoTE9HLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgTE9HLmRlYnVnKFRhcGVzdHJ5LmZvcm1hdCgiUmVkaXJlY3RTZXJ2bGV0LnJlZGlyZWN0aW5nIiwgcGF0aCkpOwotCi0gICAgICAgICAgICBocmVzcG9uc2Uuc2VuZFJlZGlyZWN0KHBhdGgpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgY2hhaW4uZG9GaWx0ZXIocmVxdWVzdCwgcmVzcG9uc2UpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L1JlbmRlclJld291bmRFeGNlcHRpb24uamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9SZW5kZXJSZXdvdW5kRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjMzFkZGMuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L1JlbmRlclJld291bmRFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5OwotCi0vKioKLSAqICBBIHNwZWNpYWwgc3ViY2xhc3Mgb2Yge0BsaW5rIEFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbn0gdGhhdCBjYW4gYmUgdGhyb3duCi0gKiAgd2hlbiBhIGNvbXBvbmVudCBoYXMgZGV0ZXJtaW5lZCB0aGF0IHRoZSBzdGF0ZSBvZiB0aGUgcGFnZSBoYXMgYmVlbgotICogIHJld291bmQuCi0gKgotICogQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogQHZlcnNpb24gJElkJAotICoqLwotCi1wdWJsaWMgY2xhc3MgUmVuZGVyUmV3b3VuZEV4Y2VwdGlvbiBleHRlbmRzIEFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbgotewotICAgIHB1YmxpYyBSZW5kZXJSZXdvdW5kRXhjZXB0aW9uKE9iamVjdCBjb21wb25lbnQpCi0gICAgewotICAgICAgICBzdXBlcihudWxsLCBjb21wb25lbnQsIG51bGwsIG51bGwpOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvU3RhbGVMaW5rRXhjZXB0aW9uLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvU3RhbGVMaW5rRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjMTBlODguLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L1N0YWxlTGlua0V4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5OwotCi0vKioKLSAqICBFeGNlcHRpb24gdGhyb3duIGJ5IGFuIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LmVuZ2luZS5JRW5naW5lU2VydmljZX0gd2hlbiBpdCBkaXNjb3ZlcnMgdGhhdAotICogIHRoZSBhbiBhY3Rpb24gbGluayB3YXMgZm9yIGFuIG91dC1vZi1kYXRlIHZlcnNpb24gb2YgdGhlIHBhZ2UuCi0gKgotICogIDxwPlRoZSBhcHBsaWNhdGlvbiBzaG91bGQgcmVkaXJlY3QgdG8gdGhlIFN0YWxlTGluayBwYWdlLgotICoKLSAqCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogIEB2ZXJzaW9uICRJZCQKLSAqIAotICoqLwotCi1wdWJsaWMgY2xhc3MgU3RhbGVMaW5rRXhjZXB0aW9uIGV4dGVuZHMgQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uCi17Ci0gICAgcHJpdmF0ZSB0cmFuc2llbnQgSVBhZ2UgX3BhZ2U7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgX3BhZ2VOYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIF90YXJnZXRJZFBhdGg7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgX3RhcmdldEFjdGlvbklkOwotCi0gICAgcHVibGljIFN0YWxlTGlua0V4Y2VwdGlvbigpCi0gICAgewotICAgICAgICBzdXBlcihudWxsLCBudWxsLCBudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgQ29uc3RydWN0b3IgdXNlZCB3aGVuIHRoZSBhY3Rpb24gaWQgaXMgZm91bmQsIGJ1dCB0aGUgdGFyZ2V0IGlkIHBhdGgKLSAgICAgKiAgZGlkIG5vdCBtYXRjaCB0aGUgYWN0dWFsIGlkIHBhdGguCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgU3RhbGVMaW5rRXhjZXB0aW9uKElDb21wb25lbnQgY29tcG9uZW50LCBTdHJpbmcgdGFyZ2V0QWN0aW9uSWQsIFN0cmluZyB0YXJnZXRJZFBhdGgpCi0gICAgewotICAgICAgICBzdXBlcigKLSAgICAgICAgICAgIFRhcGVzdHJ5LmZvcm1hdCgKLSAgICAgICAgICAgICAgICAiU3RhbGVMaW5rRXhjZXB0aW9uLmFjdGlvbi1taXNtYXRjaCIsCi0gICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgdGFyZ2V0QWN0aW9uSWQsIGNvbXBvbmVudC5nZXRJZFBhdGgoKSwgdGFyZ2V0SWRQYXRoIH0pLAotICAgICAgICAgICAgY29tcG9uZW50LAotICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgIG51bGwpOwotCi0gICAgICAgIF9wYWdlID0gY29tcG9uZW50LmdldFBhZ2UoKTsKLSAgICAgICAgX3BhZ2VOYW1lID0gX3BhZ2UuZ2V0UGFnZU5hbWUoKTsKLQotICAgICAgICBfdGFyZ2V0QWN0aW9uSWQgPSB0YXJnZXRBY3Rpb25JZDsKLSAgICAgICAgX3RhcmdldElkUGF0aCA9IHRhcmdldElkUGF0aDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgQ29uc3RydWN0b3IgdXNlZCB3aGVuIHRoZSB0YXJnZXQgYWN0aW9uIGlkIGlzIG5vdCBmb3VuZC4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBTdGFsZUxpbmtFeGNlcHRpb24oSVBhZ2UgcGFnZSwgU3RyaW5nIHRhcmdldEFjdGlvbklkLCBTdHJpbmcgdGFyZ2V0SWRQYXRoKQotICAgIHsKLSAgICAgICAgdGhpcygKLSAgICAgICAgICAgIFRhcGVzdHJ5LmZvcm1hdCgKLSAgICAgICAgICAgICAgICAiU3RhbGVMaW5rRXhjZXB0aW9uLmNvbXBvbmVudC1taXNtYXRjaCIsCi0gICAgICAgICAgICAgICAgdGFyZ2V0QWN0aW9uSWQsCi0gICAgICAgICAgICAgICAgdGFyZ2V0SWRQYXRoKSwKLSAgICAgICAgICAgIHBhZ2UpOwotCi0gICAgICAgIF90YXJnZXRBY3Rpb25JZCA9IHRhcmdldEFjdGlvbklkOwotICAgICAgICBfdGFyZ2V0SWRQYXRoID0gdGFyZ2V0SWRQYXRoOwotICAgIH0KLQotICAgIHB1YmxpYyBTdGFsZUxpbmtFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIElDb21wb25lbnQgY29tcG9uZW50KQotICAgIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSwgY29tcG9uZW50LCBudWxsLCBudWxsKTsKLSAgICB9Ci0KLQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQYWdlTmFtZSgpCi0gICAgewotICAgICAgICByZXR1cm4gX3BhZ2VOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIHRoZSBwYWdlIHJlZmVyZW5jZWQgYnkgdGhlIHNlcnZpY2UgVVJMLCBpZiBrbm93biwgCi0gICAgICogIG9yIG51bGwgb3RoZXJ3aXNlLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIElQYWdlIGdldFBhZ2UoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9wYWdlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldFRhcmdldEFjdGlvbklkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfdGFyZ2V0QWN0aW9uSWQ7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRUYXJnZXRJZFBhdGgoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF90YXJnZXRJZFBhdGg7Ci0gICAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L1N0YWxlU2Vzc2lvbkV4Y2VwdGlvbi5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L1N0YWxlU2Vzc2lvbkV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzBkMzcyLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9TdGFsZVNlc3Npb25FeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5OwotCi0vKioKLSAqICBFeGNlcHRpb24gdGhyb3duIGJ5IGFuIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LmVuZ2luZS5JRW5naW5lU2VydmljZX0gd2hlbiBpdCBkaXNjb3ZlcnMgdGhhdAotICogIHRoZSB7QGxpbmsgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9ufQotICogIGhhcyB0aW1lZCBvdXQgKGFuZCBiZWVuIHJlcGxhY2VkIGJ5IGEgbmV3LCBlbXB0eQotICogIG9uZSkuCi0gKgotICogIDxwPlRoZSBhcHBsaWNhdGlvbiBzaG91bGQgcmVkaXJlY3QgdG8gdGhlIHN0YWxlLXNlc3Npb24gcGFnZS4KLSAqCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKgotICoqLwotCi1wdWJsaWMgY2xhc3MgU3RhbGVTZXNzaW9uRXhjZXB0aW9uIGV4dGVuZHMgQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uCi17Ci0gICAgcHJpdmF0ZSB0cmFuc2llbnQgSVBhZ2UgX3BhZ2U7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgX3BhZ2VOYW1lOwotCi0gICAgcHVibGljIFN0YWxlU2Vzc2lvbkV4Y2VwdGlvbigpCi0gICAgewotICAgICAgICB0aGlzKG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdGFsZVNlc3Npb25FeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIElQYWdlIHBhZ2UpCi0gICAgewotICAgICAgICBzdXBlcihtZXNzYWdlLCBwYWdlLCBudWxsLCBudWxsKTsKLSAgICAgICAgX3BhZ2UgPSBwYWdlOwotCi0gICAgICAgIGlmIChwYWdlICE9IG51bGwpCi0gICAgICAgICAgICBfcGFnZU5hbWUgPSBwYWdlLmdldFBhZ2VOYW1lKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQYWdlTmFtZSgpCi0gICAgewotICAgICAgICByZXR1cm4gX3BhZ2VOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIHRoZSBwYWdlIHJlZmVyZW5jZWQgYnkgdGhlIHNlcnZpY2UgVVJMLCBpZiBrbm93biwgb3IgbnVsbCBvdGhlcndpc2UuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgSVBhZ2UgZ2V0UGFnZSgpCi0gICAgewotICAgICAgICByZXR1cm4gX3BhZ2U7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9UYXBlc3RyeS5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L1RhcGVzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjZjM4MjQuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L1RhcGVzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcxICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmV2ZW50LkNoYW5nZU9ic2VydmVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuZXZlbnQuT2JzZXJ2ZWRDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnJlcXVlc3QuUmVxdWVzdENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5yZXNvdXJjZS5Db250ZXh0UmVzb3VyY2VMb2NhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnNwZWMuSUNvbXBvbmVudFNwZWNpZmljYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS51dGlsLkFkYXB0b3JSZWdpc3RyeTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnV0aWwuU3RyaW5nU3BsaXR0ZXI7Ci0KLS8qKgotICogIEEgcGxhY2Vob2xkZXIgZm9yIGEgbnVtYmVyIG9mIChzdGF0aWMpIG1ldGhvZHMgdGhhdCBkb24ndCBiZWxvbmcgZWxzZXdoZXJlLCBhcyB3ZWxsCi0gKiAgYXMgYSBnbG9iYWwgbG9jYXRpb24gZm9yIHN0YXRpYyBjb25zdGFudHMuCi0gKgotICogIEBzaW5jZSAxLjAuMQotICogIEB2ZXJzaW9uICRJZCQKLSAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKgotICoqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgVGFwZXN0cnkKLXsKLSAgICAvKioKLSAgICAgKiAgTmFtZSBvZiBhIHJlcXVlc3QgYXR0cmlidXRlIHVzZWQgd2l0aCB0aGUKLSAgICAgKiAge0BsaW5rICNUQUdTVVBQT1JUX1NFUlZJQ0V9IHNlcnZpY2UuICBUaGUgYXR0cmlidXRlCi0gICAgICogIGRlZmluZXMgdGhlIHVuZGVybHlpbmcgc2VydmljZSB0byBmb3Igd2hpY2ggYSBVUkwgd2lsbCBiZSBnZW5lcmF0ZWQuCi0gICAgICoKLSAgICAgKiAgQHNpbmNlIDMuMAotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVEFHX1NVUFBPUlRfU0VSVklDRV9BVFRSSUJVVEUgPQotICAgICAgICAib3JnLmFwYWNoZS50YXBlc3RyeS50YWdzdXBwb3J0LnNlcnZpY2UiOwotCi0gICAgLyoqCi0gICAgICogTmFtZSBvZiBhIHJlcXVlc3QgYXR0cmlidXRlIHVzZWQgd2l0aCB0aGUKLSAgICAgKiB7QGxpbmsgI1RBR1NVUFBPUlRfU0VSVklDRX0gc2VydmljZS4gIFRoZSBhdHRyaWJ1dGUKLSAgICAgKiBkZWZpbmVzIHRoZSBjb3JyZWN0IHNlcnZsZXQgcGF0aCBmb3IgdGhlCi0gICAgICogVGFwZXN0cnkgYXBwbGljYXRpb24gKHdoaWNoLCBmb3IgdGhlIG9kZC1tYW4tb3V0IFRBR1NVUFBPUlRfU0VSVklDRQotICAgICAqIG1heSBub3QgbWF0Y2ggSHR0cFNlcnZsZXRSZXF1ZXN0LmdldFNlcnZsZXRQYXRoKCkgYmVjYXVzZSBvZgotICAgICAqIHRoZSB1c2Ugb2YgYW4gaW5jbHVkZS4KLSAgICAgKgotICAgICAqIEBzaW5jZSAzLjAKLSAgICAgKi8KLQotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFRBR19TVVBQT1JUX1NFUlZMRVRfUEFUSF9BVFRSSUJVVEUgPQotICAgICAgICAib3JnLmFwYWNoZS50YXBlc3RyeS50YWdzdXBwb3J0LnNlcnZsZXQtcGF0aCI7Ci0KLSAgICAvKioKLSAgICAgKiAgTmFtZSBvZiBhIHJlcXVlc3QgYXR0cmlidXRlIHVzZWQgd2l0aCB0aGUKLSAgICAgKiAge0BsaW5rICNUQUdTVVBQT1JUX1NFUlZJQ0V9IHNlcnZpY2UuICBUaGUgYXR0cmlidXRlCi0gICAgICogIGRlZmluZXMgYW4gYXJyYXkgb2Ygb2JqZWN0cyB0byBiZSBjb252ZXJ0ZWQgaW50bwotICAgICAqICBzZXJ2aWNlIHBhcmFtZXRlcnMgKGkuZS4sIGZvciB1c2Ugd2l0aCB0aGUKLSAgICAgKiAge0BsaW5rICNFWFRFUk5BTF9TRVJWSUNFfSkuCi0gICAgICoKLSAgICAgKiAgQHNpbmNlIDMuMAotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVEFHX1NVUFBPUlRfUEFSQU1FVEVSU19BVFRSSUJVVEUgPQotICAgICAgICAib3JnLmFwYWNoZS50YXBlc3RyeS50YWdzdXBwb3J0LnBhcmFtZXRlcnMiOwotCi0gICAgLyoqCi0gICAgICogIFNlcnZpY2UgdXNlZCB0byBzdXBwb3J0IHJlbmRlcmluZyBvZiBKU1AgdGFncy4gIHRhZ3N1cHBvcnQgaXMgcHJvdmlkZWQKLSAgICAgKiAgd2l0aCBhIHNlcnZpY2UgYW5kIHNlcnZpY2UgcGFyYW1ldGVycyB2aWEgcmVxdWVzdCBhdHRyaWJ1dGVzCi0gICAgICogIGFuZCBjcmVhdGVzIGEgVVJJIGZyb20gdGhlIHJlc3VsdCwgd2hpY2ggaXMgb3V0cHV0IHRvIHRoZSByZXNwb25zZS4KLSAgICAgKgotICAgICAqICBAc2luY2UgMy4wCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdTVVBQT1JUX1NFUlZJQ0UgPSAidGFnc3VwcG9ydCI7Ci0KLSAgICAvKioKLSAgICAgKiAgVGhlIG5hbWUgKCJhY3Rpb24iKSBvZiBhIHNlcnZpY2UgdGhhdCBhbGxvd3MgYmVoYXZpb3IgdG8gYmUgYXNzb2NpYXRlZCB3aXRoCi0gICAgICogIGFuIHtAbGluayBJQWN0aW9ufSBjb21wb25lbnQsIHN1Y2ggYXMge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkubGluay5BY3Rpb25MaW5rfSBvcgotICAgICAqICB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5mb3JtLkZvcm19LgotICAgICAqCi0gICAgICogIDxwPlRoaXMgc2VydmljZSBpcyB1c2VkIHdpdGggYWN0aW9ucyB0aGF0IGFyZSB0aWVkIHRvIHRoZQotICAgICAqICBkeW5hbWljIHN0YXRlIG9mIHRoZSBwYWdlLCBhbmQgd2hpY2ggcmVxdWlyZSBhIHJld2luZCBvZiB0aGUgcGFnZS4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFDVElPTl9TRVJWSUNFID0gImFjdGlvbiI7Ci0KLSAgICAvKioKLSAgICAgKiAgVGhlIG5hbWUgKCJkaXJlY3QiKSBvZiBhIHNlcnZpY2UgdGhhdCBhbGxvd3Mgc3RhdGVsZXNzIGJlaGF2aW9yIGZvciBhbiB7QGxpbmsKLSAgICAgKiAgb3JnLmFwYWNoZS50YXBlc3RyeS5saW5rLkRpcmVjdExpbmt9IGNvbXBvbmVudC4KLSAgICAgKgotICAgICAqICA8cD5UaGlzIHNlcnZpY2Ugcm9sbHMgYmFjayB0aGUgc3RhdGUgb2YgdGhlIHBhZ2UgYnV0IGRvZXNuJ3QKLSAgICAgKiAgcmV3aW5kIHRoZSB0aGUgZHluYW1pYyBzdGF0ZSBvZiB0aGUgcGFnZSB0aGUgd2FzIHRoZSBhY3Rpb24KLSAgICAgKiAgc2VydmljZSBkb2VzLCB3aGljaCBpcyBtb3JlIGVmZmljaWVudCBidXQgbGVzcyBwb3dlcmZ1bC4KLSAgICAgKgotICAgICAqICA8cD5BbiBhcnJheSBvZiBTdHJpbmcgcGFyYW1ldGVycyBtYXkgYmUgaW5jbHVkZWQgd2l0aCB0aGUKLSAgICAgKiAgc2VydmljZSBVUkw7IHRoZXNlIHdpbGwgYmUgbWFkZSBhdmFpbGFibGUgdG8gdGhlIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LmxpbmsuRGlyZWN0TGlua30KLSAgICAgKiAgY29tcG9uZW50J3MgbGlzdGVuZXIuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBESVJFQ1RfU0VSVklDRSA9ICJkaXJlY3QiOwotCi0gICAgLyoqCi0gICAgICogIFRoZSBuYW1lICgiZXh0ZXJuYWwiKSBvZiBhIHNlcnZpY2UgdGhhdCBhIGFsbG93cyB7QGxpbmsgSUV4dGVybmFsUGFnZX0gdG8gYmUgc2VsZWN0ZWQuCi0gICAgICogIEFzc29jaWF0ZWQgd2l0aCBhIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LmxpbmsuRXh0ZXJuYWxMaW5rfSBjb21wb25lbnQuCi0gICAgICoKLSAgICAgKiAgPHA+VGhpcyBzZXJ2aWNlIGVuYWJsZXMge0BsaW5rIElFeHRlcm5hbFBhZ2V9cyB0byBiZSBhY2Nlc3NlZCB2aWEgYSBVUkwuCi0gICAgICogIEV4dGVybmFsIHBhZ2VzIG1heSBiZSBib29rZWQgbWFya2VkIHVzaW5nIHRoZWlyIFVSTCBmb3IgZnV0dXJlIHJlZmVyZW5jZS4KLSAgICAgKgotICAgICAqICA8cD5BbiBhcnJheSBvZiBPYmplY3QgcGFyYW1ldGVycyBtYXkgYmUgaW5jbHVkZWQgd2l0aCB0aGUKLSAgICAgKiAgc2VydmljZSBVUkw7IHRoZXNlIHdpbGwgYmUgcGFzc2VkIHRvIHRoZQotICAgICAqICB7QGxpbmsgSUV4dGVybmFsUGFnZSNhY3RpdmF0ZUV4dGVybmFsUGFnZShPYmplY3RbXSwgSVJlcXVlc3RDeWNsZSl9IG1ldGhvZC4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEVYVEVSTkFMX1NFUlZJQ0UgPSAiZXh0ZXJuYWwiOwotCi0gICAgLyoqCi0gICAgICogIFRoZSBuYW1lICgicGFnZSIpIG9mIGEgc2VydmljZSB0aGF0IGFsbG93cyBhIG5ldyBwYWdlIHRvIGJlIHNlbGVjdGVkLgotICAgICAqICBBc3NvY2lhdGVkIHdpdGggYSB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5saW5rLlBhZ2VMaW5rfSBjb21wb25lbnQuCi0gICAgICoKLSAgICAgKiAgPHA+VGhlIHNlcnZpY2UgcmVxdWlyZXMgYSBzaW5nbGUgcGFyYW1ldGVyOiAgdGhlIG5hbWUgb2YgdGhlIHRhcmdldCBwYWdlLgotICAgICAqKi8KLQotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBBR0VfU0VSVklDRSA9ICJwYWdlIjsKLQotICAgIC8qKgotICAgICAqICBUaGUgbmFtZSAoImhvbWUiKSBvZiBhIHNlcnZpY2UgdGhhdCBqdW1wcyB0byB0aGUgaG9tZSBwYWdlLiAgQSBzdGFuZC1pbiBmb3IKLSAgICAgKiAgd2hlbiBubyBzZXJ2aWNlIGlzIHByb3ZpZGVkLCB3aGljaCBpcyB0eXBpY2FsbHkgdGhlIGVudHJ5cG9pbnQKLSAgICAgKiAgdG8gdGhlIGFwcGxpY2F0aW9uLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSE9NRV9TRVJWSUNFID0gImhvbWUiOwotCi0gICAgLyoqCi0gICAgICogIFRoZSBuYW1lICgicmVzdGFydCIpIG9mIGEgc2VydmljZSB0aGF0IGludmFsaWRhdGVzIHRoZSBzZXNzaW9uIGFuZCByZXN0YXJ0cwotICAgICAqICB0aGUgYXBwbGljYXRpb24uICBUeXBpY2FsbHkgdXNlZCBqdXN0Ci0gICAgICogIHRvIHJlY292ZXIgZnJvbSBhbiBleGNlcHRpb24uCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNUQVJUX1NFUlZJQ0UgPSAicmVzdGFydCI7Ci0KLSAgICAvKioKLSAgICAgKiAgVGhlIG5hbWUgKCJhc3NldCIpIG9mIGEgc2VydmljZSB1c2VkIHRvIGFjY2VzcyBpbnRlcm5hbCBhc3NldHMuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBU1NFVF9TRVJWSUNFID0gImFzc2V0IjsKLQotICAgIC8qKgotICAgICAqICBUaGUgbmFtZSAoInJlc2V0Iikgb2YgYSBzZXJ2aWNlIHVzZWQgdG8gY2xlYXIgY2FjaGVkIHRlbXBsYXRlCi0gICAgICogIGFuZCBzcGVjaWZpY2F0aW9uIGRhdGEgYW5kIHJlbW92ZSBhbGwgcG9vbGVkIHBhZ2VzLgotICAgICAqICBUaGlzIGlzIG9ubHkgdXNlZCB3aGVuIGRlYnVnZ2luZyBhcwotICAgICAqICBhIHF1aWNrIHdheSB0byBjbGVhciB0aGUgb3V0IGNhY2hlZCBkYXRhLCB0byBhbGxvdyB1cGRhdGVkCi0gICAgICogIHZlcnNpb25zIG9mIHNwZWNpZmljYXRpb25zIGFuZCB0ZW1wbGF0ZXMgdG8gYmUgbG9hZGVkICh3aXRob3V0Ci0gICAgICogIHN0b3BwaW5nIGFuZCByZXN0YXJ0aW5nIHRoZSBzZXJ2bGV0IGNvbnRhaW5lcikuCi0gICAgICoKLSAgICAgKiAgPHA+VGhpcyBzZXJ2aWNlIGlzIG9ubHkgYXZhaWxhYmxlIGlmIHRoZSBKYXZhIHN5c3RlbSBwcm9wZXJ0eQotICAgICAqICA8Y29kZT5vcmcuYXBhY2hlLnRhcGVzdHJ5LmVuYWJsZS1yZXNldC1zZXJ2aWNlPC9jb2RlPgotICAgICAqICBpcyBzZXQgdG8gPGNvZGU+dHJ1ZTwvY29kZT4uCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNFVF9TRVJWSUNFID0gInJlc2V0IjsKLQotICAgIC8qKgotICAgICAqICBRdWVyeSBwYXJhbWV0ZXIgdGhhdCBpZGVudGZpZXMgdGhlIHNlcnZpY2UgZm9yIHRoZQotICAgICAqICByZXF1ZXN0LgotICAgICAqCi0gICAgICogIEBzaW5jZSAxLjAuMwotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVklDRV9RVUVSWV9QQVJBTUVURVJfTkFNRSA9ICJzZXJ2aWNlIjsKLQotICAgIC8qKgotICAgICAqICBUaGUgcXVlcnkgcGFyYW1ldGVyIGZvciBhcHBsaWNhdGlvbiBzcGVjaWZpYyBwYXJhbWV0ZXJzIHRvIHRoZQotICAgICAqICBzZXJ2aWNlICh0aGlzIGlzIHVzZWQgd2l0aCB0aGUgZGlyZWN0IHNlcnZpY2UpLiAgRWFjaCBvZiB0aGVzZQotICAgICAqICB2YWx1ZXMgaXMgZW5jb2RlZCB3aXRoIHtAbGluayBqYXZhLm5ldC5VUkxFbmNvZGVyI2VuY29kZShTdHJpbmcpfSBiZWZvcmUKLSAgICAgKiAgYmVpbmcgYWRkZWQgdG8gdGhlIFVSTC4gIE11bHRpcGxlIHZhbHVlcyBhcmUgaGFuZGxlIGJ5IHJlcGVhdGVkbHkKLSAgICAgKiAgZXN0YWJsaXNoaW5nIGtleS92YWx1ZSBwYWlycyAodGhpcyBpcyBhIGNoYW5nZSBmcm9tIGJlaGF2aW9yIGluCi0gICAgICogIDIuMSBhbmQgZWFybGllcikuCi0gICAgICoKLSAgICAgKiAgQHNpbmNlIDEuMC4zCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTUVURVJTX1FVRVJZX1BBUkFNRVRFUl9OQU1FID0gInNwIjsKLQotICAgIC8qKgotICAgICAqICBQcm9wZXJ0eSBuYW1lIHVzZWQgdG8gZ2V0IHRoZSBleHRlbnNpb24gdXNlZCBmb3IgdGVtcGxhdGVzLiAgVGhpcwotICAgICAqICBtYXkgYmUgc2V0IGluIHRoZSBwYWdlIG9yIGNvbXBvbmVudCBzcGVjaWZpY2F0aW9uLCBvciBpbiB0aGUgcGFnZSAob3IKLSAgICAgKiAgY29tcG9uZW50J3MpIGltbWVkaWF0ZSBjb250YWluZXIgKGxpYnJhcnkgb3IgYXBwbGljYXRpb24gc3BlY2lmaWNhdGlvbikuCi0gICAgICogIFVubGlrZSBtb3N0IHByb3BlcnRpZXMsIHZhbHVlIGlzbid0IGluaGVyaXRlZCBhbGwgdGhlIHdheSB1cCB0aGUgY2hhaW4uCi0gICAgICogIFRoZSBkZWZhdWx0IHRlbXBsYXRlIGV4dGVuc2lvbiBpcyAiaHRtbCIuCi0gICAgICoKLSAgICAgKiAgQHNpbmNlIDMuMAotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVNUExBVEVfRVhURU5TSU9OX1BST1BFUlRZID0KLSAgICAgICAgIm9yZy5hcGFjaGUudGFwZXN0cnkudGVtcGxhdGUtZXh0ZW5zaW9uIjsKLQotICAgIC8qKgotICAgICAqICBUaGUgZGVmYXVsdCBleHRlbnNpb24gZm9yIHRlbXBsYXRlcywgImh0bWwiLgotICAgICAqCi0gICAgICogIEBzaW5jZSAzLjAKLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfVEVNUExBVEVfRVhURU5TSU9OID0gImh0bWwiOwotCi0gICAgLyoqCi0gICAgICogIFRoZSBuYW1lIG9mIGFuIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZXF1ZXN0Q3ljbGV9IGF0dHJpYnV0ZSBpbiB3aGljaCB0aGUKLSAgICAgKiAgY3VycmVudGx5IHJlbmRlcmluZyB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5jb21wb25lbnRzLklMaW5rQ29tcG9uZW50fQotICAgICAqICBpcyBzdG9yZWQuICBMaW5rIGNvbXBvbmVudHMgZG8gbm90IG5lc3QuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5LX0NPTVBPTkVOVF9BVFRSSUJVVEVfTkFNRSA9Ci0gICAgICAgICJvcmcuYXBhY2hlLnRhcGVzdHJ5LmFjdGl2ZS1saW5rLWNvbXBvbmVudCI7Ci0KLSAgICAvKioKLSAgICAgKiAgU3VmZml4IGFwcGVuZGVkIHRvIGEgcGFyYW1ldGVyIG5hbWUgdG8gZm9ybSB0aGUgbmFtZSBvZiBhIHByb3BlcnR5IHRoYXQgc3RvcmVzIHRoZQotICAgICAqICBiaW5kaW5nIGZvciB0aGUgcGFyYW1ldGVyLgotICAgICAqCi0gICAgICogIEBzaW5jZSAzLjAKLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNRVRFUl9QUk9QRVJUWV9OQU1FX1NVRkZJWCA9ICJCaW5kaW5nIjsKLQotICAgIC8qKgotICAgICAqICBOYW1lIG9mIGFwcGxpY2F0aW9uIGV4dGVuc2lvbiB1c2VkIHRvIHJlc29sdmUgcGFnZSBhbmQgY29tcG9uZW50Ci0gICAgICogIHNwZWNpZmljYXRpb25zIHRoYXQgY2FuJ3QgYmUgbG9jYXRlZCBieSB0aGUgbm9ybWFsIG1lYW5zLiAgVGhlCi0gICAgICogIGV4dGVuc2lvbiBtdXN0IGltcGxlbWVudAotICAgICAqICB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5yZXNvbHZlci5JU3BlY2lmaWNhdGlvblJlc29sdmVyRGVsZWdhdGV9LgotICAgICAqCi0gICAgICogIEBzaW5jZSAzLjAKLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNQRUNJRklDQVRJT05fUkVTT0xWRVJfREVMRUdBVEVfRVhURU5TSU9OX05BTUUgPQotICAgICAgICAib3JnLmFwYWNoZS50YXBlc3RyeS5zcGVjaWZpY2F0aW9uLXJlc29sdmVyLWRlbGVnYXRlIjsKLQotICAgIC8qKgotICAgICAqICBOYW1lIG9mIGFwcGxpY2F0aW9uIGV4dGVuc2lvbiB1c2VkIHRvIHJlc29sdmUgcGFnZSBhbmQgY29tcG9uZW50Ci0gICAgICogIHRlbXBsYXRlcyB0aGF0IGNhbid0IGJlIGxvY2F0ZWQgYnkgdGhlIG5vcm1hbCBtZWFucy4KLSAgICAgKiAgVGhlIGV4dGVuc2lvbiBtdXN0IGltcGxlbWVudAotICAgICAqICB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5lbmdpbmUuSVRlbXBsYXRlU291cmNlRGVsZWdhdGV9LgotICAgICAqCi0gICAgICogIEBzaW5jZSAzLjAKLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFTVBMQVRFX1NPVVJDRV9ERUxFR0FURV9FWFRFTlNJT05fTkFNRSA9Ci0gICAgICAgICJvcmcuYXBhY2hlLnRhcGVzdHJ5LnRlbXBsYXRlLXNvdXJjZS1kZWxlZ2F0ZSI7Ci0KLSAgICAvKioKLSAgICAgKiAgIEtleSB1c2VkIHRvIG9idGFpbiBhbiBleHRlbnNpb24gZnJvbSB0aGUgYXBwbGljYXRpb24gc3BlY2lmaWNhdGlvbi4gIFRoZSBleHRlbnNpb24sCi0gICAgICogICBpZiBpdCBleGlzdHMsIGltcGxlbWVudHMge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkucmVxdWVzdC5JUmVxdWVzdERlY29kZXJ9LgotICAgICAqCi0gICAgICogICBAc2luY2UgMi4yCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVFVRVNUX0RFQ09ERVJfRVhURU5TSU9OX05BTUUgPQotICAgICAgICAib3JnLmFwYWNoZS50YXBlc3RyeS5yZXF1ZXN0LWRlY29kZXIiOwotCi0gICAgLyoqCi0gICAgICogIE5hbWUgb2Ygb3B0aW9uYWwgYXBwbGljYXRpb24gZXh0ZW5zaW9uIGZvciB0aGUgbXVsdGlwYXJ0IGRlY29kZXIKLSAgICAgKiAgdXNlZCBieSB0aGUgYXBwbGljYXRpb24uICBUaGUgZXh0ZW5zaW9uIG11c3QgaW1wbGVtZW50Ci0gICAgICogIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5Lm11bHRpcGFydC5JTXVsdGlwYXJ0RGVjb2Rlcn0KLSAgICAgKiAgKGFuZCBpcyBnZW5lcmFsbHkgYSBjb25maWd1cmVkIGluc3RhbmNlIG9mCi0gICAgICogIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5Lm11bHRpcGFydC5EZWZhdWx0TXVsdGlwYXJ0RGVjb2Rlcn0pLgotICAgICAqCi0gICAgICogIEBzaW5jZSAzLjAKLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1VTFRJUEFSVF9ERUNPREVSX0VYVEVOU0lPTl9OQU1FID0KLSAgICAgICAgIm9yZy5hcGFjaGUudGFwZXN0cnkubXVsdGlwYXJ0LWRlY29kZXIiOwotCi0gICAgLyoqCi0gICAgICogTWV0aG9kIGlkIHVzZWQgdG8gY2hlY2sgdGhhdCB7QGxpbmsgSVBhZ2UjdmFsaWRhdGUoSVJlcXVlc3RDeWNsZSl9Ci0gICAgICogaXMgaW52b2tlZC4KLSAgICAgKiBAc2VlICNjaGVja01ldGhvZEludm9jYXRpb24oT2JqZWN0LCBTdHJpbmcsIE9iamVjdCkKLSAgICAgKiBAc2luY2UgMy4wCi0gICAgICovCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQlNUUkFDVFBBR0VfVkFMSURBVEVfTUVUSE9EX0lEID0gIkFic3RyYWN0UGFnZS52YWxpZGF0ZSgpIjsKLQotICAgIC8qKgotICAgICAqIE1ldGhvZCBpZCB1c2VkIHRvIGNoZWNrIHRoYXQge0BsaW5rIElQYWdlI2RldGFjaCgpfSBpcyBpbnZva2VkLgotICAgICAqIEBzZWUgI2NoZWNrTWV0aG9kSW52b2NhdGlvbihPYmplY3QsIFN0cmluZywgT2JqZWN0KQotICAgICAqIEBzaW5jZSAzLjAKLSAgICAgKi8KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFCU1RSQUNUUEFHRV9ERVRBQ0hfTUVUSE9EX0lEID0gIkFic3RyYWN0UGFnZS5kZXRhY2goKSI7Ci0KLSAgICAvKioKLSAgICAgKiAgUmVndWxhciBleHByZXNzaW9uIGRlZmluaW5nIGEgc2ltcGxlIHByb3BlcnR5IG5hbWUuICBVc2VkIGJ5IHNldmVyYWwgZGlmZmVyZW50Ci0gICAgICogIHBhcnNlcnMuIFNpbXBsZSBwcm9wZXJ0eSBuYW1lcyBtYXRjaCBKYXZhIHZhcmlhYmxlIG5hbWVzOyBhIGxlYWRpbmcgbGV0dGVyCi0gICAgICogIChvciB1bmRlcnNjb3JlKSwgZm9sbG93ZWQgYnkgbGV0dGVycywgbnVtYmVycyBhbmQgdW5kZXJzY29yZXMuCi0gICAgICoKLSAgICAgKiAgQHNpbmNlIDMuMAotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0lNUExFX1BST1BFUlRZX05BTUVfUEFUVEVSTiA9ICJeXz9bYS16QS1aXVxcdyokIjsKLQotICAgIC8qKgotICAgICAqIE5hbWUgb2YgYW4gYXBwbGljYXRpb24gZXh0ZW5zaW9uIHVzZWQgYXMgYSBmYWN0b3J5IGZvcgotICAgICAqIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LmVuZ2luZS5JTW9uaXRvcn0gaW5zdGFuY2VzLiAgVGhlIGV4dGVuc2lvbgotICAgICAqIG11c3QgaW1wbGVtZW50IHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LmVuZ2luZS5JTW9uaXRvckZhY3Rvcnl9LgotICAgICAqCi0gICAgICogQHNpbmNlIDMuMAotICAgICAqLwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9OSVRPUl9GQUNUT1JZX0VYVEVOU0lPTl9OQU1FID0KLSAgICAgICAgIm9yZy5hcGFjaGUudGFwZXN0cnkubW9uaXRvci1mYWN0b3J5IjsKLQotICAgIC8qKgotICAgICAqIENsYXNzIG5hbWUgb2YgYW4ge0BsaW5rIG9nbmwuVHlwZUNvbnZlcnRlcn0gaW1wbGVtZW50aW5nIGNsYXNzCi0gICAgICogdG8gdXNlIGFzIGEgdHlwZSBjb252ZXJ0ZXIgZm9yIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LmJpbmRpbmcuRXhwcmVzc2lvbkJpbmRpbmd9Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0dOTF9UWVBFX0NPTlZFUlRFUiA9ICJvcmcuYXBhY2hlLnRhcGVzdHJ5Lm9nbmwtdHlwZS1jb252ZXJ0ZXIiOwotCi0gICAgLyoqCi0gICAgICogIFByZXZlbnQgaW5zdGFudGlhdGlvbi4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHByaXZhdGUgVGFwZXN0cnkoKQotICAgIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgVGhlIHZlcnNpb24gb2YgdGhlIGZyYW1ld29yazsgdGhpcyBpcyB1cGRhdGVkIGZvciBtYWpvciByZWxlYXNlcy4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT04gPSByZWFkVmVyc2lvbigpOwotCi0gICAgLyoqCi0gICAgICogIENvbnRhaW5zIHN0cmluZ3MgbG9hZGVkIGZyb20gVGFwZXN0cnlTdHJpbmdzLnByb3BlcnRpZXMuCi0gICAgICoKLSAgICAgKiAgQHNpbmNlIDEuMC44Ci0gICAgICoKLSAgICAgKiovCi0KLSAgICBwcml2YXRlIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBfc3RyaW5nczsKLQotICAgIC8qKgotICAgICAqICBBIHtAbGluayBNYXB9IHRoYXQgbGlua3MgTG9jYWxlIG5hbWVzIChhcyBpbiB7QGxpbmsgTG9jYWxlI3RvU3RyaW5nKCl9IHRvCi0gICAgICogIHtAbGluayBMb2NhbGV9IGluc3RhbmNlcy4gIFRoaXMgcHJldmVudHMgbmVlZGxlc3MgZHVwbGljYXRpb24KLSAgICAgKiAgb2YgTG9jYWxlcy4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCBfbG9jYWxlTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotICAgIHN0YXRpYyB7Ci0gICAgICAgIExvY2FsZVtdIGxvY2FsZXMgPSBMb2NhbGUuZ2V0QXZhaWxhYmxlTG9jYWxlcygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxvY2FsZXMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9sb2NhbGVNYXAucHV0KGxvY2FsZXNbaV0udG9TdHJpbmcoKSwgbG9jYWxlc1tpXSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgVXNlZCBmb3IgdHJhY2tpbmcgaWYgYSBwYXJ0aWN1bGFyIHN1cGVyLWNsYXNzIG1ldGhvZCBoYXMgYmVlbiBpbnZva2VkLgotICAgICAqLwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVGhyZWFkTG9jYWwgX2ludm9rZWRNZXRob2RJZHMgPSBuZXcgVGhyZWFkTG9jYWwoKTsKLQotICAgIC8qKgotICAgICAqICBBIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LnV0aWwuQWRhcHRvclJlZ2lzdHJ5fSB1c2VkIHRvIGNvZXJjZSBhcmJpdHJhcnkgb2JqZWN0cwotICAgICAqICB0byBib29sZWFuIHZhbHVlcy4KLSAgICAgKgotICAgICAqICBAc2VlICNldmFsdWF0ZUJvb2xlYW4oT2JqZWN0KQotICAgICAqKi8KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEFkYXB0b3JSZWdpc3RyeSBfYm9vbGVhbkFkYXB0b3JzID0gbmV3IEFkYXB0b3JSZWdpc3RyeSgpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgQm9vbEFkYXB0b3IKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiAgSW1wbGVtZW50ZWQgYnkgc3ViY2xhc3NlcyB0byBjb2VyY2UgYW4gb2JqZWN0IHRvIGEgYm9vbGVhbi4KLSAgICAgICAgICoKLSAgICAgICAgICoqLwotCi0gICAgICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGNvZXJjZShPYmplY3QgdmFsdWUpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEJvb2xlYW5BZGFwdG9yIGV4dGVuZHMgQm9vbEFkYXB0b3IKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBib29sZWFuIGNvZXJjZShPYmplY3QgdmFsdWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEJvb2xlYW4gYiA9IChCb29sZWFuKSB2YWx1ZTsKLQotICAgICAgICAgICAgcmV0dXJuIGIuYm9vbGVhblZhbHVlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBOdW1iZXJBZGFwdG9yIGV4dGVuZHMgQm9vbEFkYXB0b3IKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBib29sZWFuIGNvZXJjZShPYmplY3QgdmFsdWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE51bWJlciBuID0gKE51bWJlcikgdmFsdWU7Ci0KLSAgICAgICAgICAgIHJldHVybiBuLmludFZhbHVlKCkgPiAwOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ29sbGVjdGlvbkFkYXB0b3IgZXh0ZW5kcyBCb29sQWRhcHRvcgotICAgIHsKLSAgICAgICAgcHVibGljIGJvb2xlYW4gY29lcmNlKE9iamVjdCB2YWx1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgQ29sbGVjdGlvbiBjID0gKENvbGxlY3Rpb24pIHZhbHVlOwotCi0gICAgICAgICAgICByZXR1cm4gYy5zaXplKCkgPiAwOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU3RyaW5nQWRhcHRvciBleHRlbmRzIEJvb2xBZGFwdG9yCi0gICAgewotICAgICAgICBwdWJsaWMgYm9vbGVhbiBjb2VyY2UoT2JqZWN0IHZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgcyA9IChTdHJpbmcpIHZhbHVlOwotCi0gICAgICAgICAgICBpZiAocy5sZW5ndGgoKSA9PSAwKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICAgICAgU3RyaW5nIHRzID0gcy50cmltKCk7Ci0gICAgICAgICAgICBpZiAodHMubGVuZ3RoKCkgPT0gMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgICAgIC8vIEhlcmUgcHJvYmFibHkgQm9vbGVhbi5nZXRCb29sZWFuKHMpIHNob3VsZCBiZSB1c2VkLAotICAgICAgICAgICAgLy8gYnV0IHdlIG5lZWQgdGhlIG9wcG9zaXRlIGNoZWNrCi0gICAgICAgICAgICBpZiAodHMuZXF1YWxzSWdub3JlQ2FzZSgiZmFsc2UiKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIHsKLSAgICAgICAgX2Jvb2xlYW5BZGFwdG9ycy5yZWdpc3RlcihCb29sZWFuLmNsYXNzLCBuZXcgQm9vbGVhbkFkYXB0b3IoKSk7Ci0gICAgICAgIF9ib29sZWFuQWRhcHRvcnMucmVnaXN0ZXIoTnVtYmVyLmNsYXNzLCBuZXcgTnVtYmVyQWRhcHRvcigpKTsKLSAgICAgICAgX2Jvb2xlYW5BZGFwdG9ycy5yZWdpc3RlcihDb2xsZWN0aW9uLmNsYXNzLCBuZXcgQ29sbGVjdGlvbkFkYXB0b3IoKSk7Ci0gICAgICAgIF9ib29sZWFuQWRhcHRvcnMucmVnaXN0ZXIoU3RyaW5nLmNsYXNzLCBuZXcgU3RyaW5nQWRhcHRvcigpKTsKLQotICAgICAgICAvLyBSZWdpc3RlciBhIGRlZmF1bHQsIGNhdGNoLWFsbCBhZGFwdG9yLgotCi0gICAgICAgIF9ib29sZWFuQWRhcHRvcnMucmVnaXN0ZXIoT2JqZWN0LmNsYXNzLCBuZXcgQm9vbEFkYXB0b3IoKQotICAgICAgICB7Ci0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBjb2VyY2UoT2JqZWN0IHZhbHVlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAge0BsaW5rIEFkYXB0b3JSZWdpc3RyeX0gdXNlZCB0byBleHRyYWN0IGFuIHtAbGluayBJdGVyYXRvcn0gZnJvbQotICAgICAqICBhbiBhcmJpdHJhcnkgb2JqZWN0LgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgQWRhcHRvclJlZ2lzdHJ5IF9pdGVyYXRvckFkYXB0b3JzID0gbmV3IEFkYXB0b3JSZWdpc3RyeSgpOwotCi0gICAgcHJpdmF0ZSBhYnN0cmFjdCBzdGF0aWMgY2xhc3MgSXRlcmF0b3JBZGFwdG9yCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgICogIENvZWVyY2VzIHRoZSBvYmplY3QgaW50byBhbiB7QGxpbmsgSXRlcmF0b3J9LgotICAgICAgICAgKgotICAgICAgICAgKiovCi0KLSAgICAgICAgYWJzdHJhY3QgcHVibGljIEl0ZXJhdG9yIGNvZXJjZShPYmplY3QgdmFsdWUpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIERlZmF1bHRJdGVyYXRvckFkYXB0b3IgZXh0ZW5kcyBJdGVyYXRvckFkYXB0b3IKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBJdGVyYXRvciBjb2VyY2UoT2JqZWN0IHZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKEl0ZXJhdG9yKSB2YWx1ZTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ29sbGVjdGlvbkl0ZXJhdG9yQWRhcHRvciBleHRlbmRzIEl0ZXJhdG9yQWRhcHRvcgotICAgIHsKLSAgICAgICAgcHVibGljIEl0ZXJhdG9yIGNvZXJjZShPYmplY3QgdmFsdWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIENvbGxlY3Rpb24gYyA9IChDb2xsZWN0aW9uKSB2YWx1ZTsKLQotICAgICAgICAgICAgaWYgKGMuc2l6ZSgpID09IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgICAgIHJldHVybiBjLml0ZXJhdG9yKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBPYmplY3RJdGVyYXRvckFkYXB0b3IgZXh0ZW5kcyBJdGVyYXRvckFkYXB0b3IKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBJdGVyYXRvciBjb2VyY2UoT2JqZWN0IHZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uKHZhbHVlKS5pdGVyYXRvcigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgT2JqZWN0QXJyYXlJdGVyYXRvckFkYXB0b3IgZXh0ZW5kcyBJdGVyYXRvckFkYXB0b3IKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBJdGVyYXRvciBjb2VyY2UoT2JqZWN0IHZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgICBPYmplY3RbXSBhcnJheSA9IChPYmplY3RbXSkgdmFsdWU7Ci0KLSAgICAgICAgICAgIGlmIChhcnJheS5sZW5ndGggPT0gMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QoYXJyYXkpLml0ZXJhdG9yKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBCb29sZWFuQXJyYXlJdGVyYXRvckFkYXB0b3IgZXh0ZW5kcyBJdGVyYXRvckFkYXB0b3IKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBJdGVyYXRvciBjb2VyY2UoT2JqZWN0IHZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgICBib29sZWFuW10gYXJyYXkgPSAoYm9vbGVhbltdKSB2YWx1ZTsKLQotICAgICAgICAgICAgaWYgKGFycmF5Lmxlbmd0aCA9PSAwKQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgICAgICBMaXN0IGwgPSBuZXcgQXJyYXlMaXN0KGFycmF5Lmxlbmd0aCk7Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgbC5hZGQoYXJyYXlbaV0gPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFKTsKLQotICAgICAgICAgICAgcmV0dXJuIGwuaXRlcmF0b3IoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEJ5dGVBcnJheUl0ZXJhdG9yQWRhcHRvciBleHRlbmRzIEl0ZXJhdG9yQWRhcHRvcgotICAgIHsKLSAgICAgICAgcHVibGljIEl0ZXJhdG9yIGNvZXJjZShPYmplY3QgdmFsdWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJ5dGVbXSBhcnJheSA9IChieXRlW10pIHZhbHVlOwotCi0gICAgICAgICAgICBpZiAoYXJyYXkubGVuZ3RoID09IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgICAgIExpc3QgbCA9IG5ldyBBcnJheUxpc3QoYXJyYXkubGVuZ3RoKTsKLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICBsLmFkZChuZXcgQnl0ZShhcnJheVtpXSkpOwotCi0gICAgICAgICAgICByZXR1cm4gbC5pdGVyYXRvcigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ2hhckFycmF5SXRlcmF0b3JBZGFwdG9yIGV4dGVuZHMgSXRlcmF0b3JBZGFwdG9yCi0gICAgewotICAgICAgICBwdWJsaWMgSXRlcmF0b3IgY29lcmNlKE9iamVjdCB2YWx1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgY2hhcltdIGFycmF5ID0gKGNoYXJbXSkgdmFsdWU7Ci0KLSAgICAgICAgICAgIGlmIChhcnJheS5sZW5ndGggPT0gMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICAgICAgTGlzdCBsID0gbmV3IEFycmF5TGlzdChhcnJheS5sZW5ndGgpOwotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgICAgIGwuYWRkKG5ldyBDaGFyYWN0ZXIoYXJyYXlbaV0pKTsKLQotICAgICAgICAgICAgcmV0dXJuIGwuaXRlcmF0b3IoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFNob3J0QXJyYXlJdGVyYXRvckFkYXB0b3IgZXh0ZW5kcyBJdGVyYXRvckFkYXB0b3IKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBJdGVyYXRvciBjb2VyY2UoT2JqZWN0IHZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgICBzaG9ydFtdIGFycmF5ID0gKHNob3J0W10pIHZhbHVlOwotCi0gICAgICAgICAgICBpZiAoYXJyYXkubGVuZ3RoID09IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgICAgIExpc3QgbCA9IG5ldyBBcnJheUxpc3QoYXJyYXkubGVuZ3RoKTsKLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICBsLmFkZChuZXcgU2hvcnQoYXJyYXlbaV0pKTsKLQotICAgICAgICAgICAgcmV0dXJuIGwuaXRlcmF0b3IoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEludEFycmF5SXRlcmF0b3JBZGFwdG9yIGV4dGVuZHMgSXRlcmF0b3JBZGFwdG9yCi0gICAgewotICAgICAgICBwdWJsaWMgSXRlcmF0b3IgY29lcmNlKE9iamVjdCB2YWx1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgaW50W10gYXJyYXkgPSAoaW50W10pIHZhbHVlOwotCi0gICAgICAgICAgICBpZiAoYXJyYXkubGVuZ3RoID09IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgICAgIExpc3QgbCA9IG5ldyBBcnJheUxpc3QoYXJyYXkubGVuZ3RoKTsKLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICBsLmFkZChuZXcgSW50ZWdlcihhcnJheVtpXSkpOwotCi0gICAgICAgICAgICByZXR1cm4gbC5pdGVyYXRvcigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTG9uZ0FycmF5SXRlcmF0b3JBZGFwdG9yIGV4dGVuZHMgSXRlcmF0b3JBZGFwdG9yCi0gICAgewotICAgICAgICBwdWJsaWMgSXRlcmF0b3IgY29lcmNlKE9iamVjdCB2YWx1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9uZ1tdIGFycmF5ID0gKGxvbmdbXSkgdmFsdWU7Ci0KLSAgICAgICAgICAgIGlmIChhcnJheS5sZW5ndGggPT0gMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICAgICAgTGlzdCBsID0gbmV3IEFycmF5TGlzdChhcnJheS5sZW5ndGgpOwotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgICAgIGwuYWRkKG5ldyBMb25nKGFycmF5W2ldKSk7Ci0KLSAgICAgICAgICAgIHJldHVybiBsLml0ZXJhdG9yKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBGbG9hdEFycmF5SXRlcmF0b3JBZGFwdG9yIGV4dGVuZHMgSXRlcmF0b3JBZGFwdG9yCi0gICAgewotICAgICAgICBwdWJsaWMgSXRlcmF0b3IgY29lcmNlKE9iamVjdCB2YWx1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgZmxvYXRbXSBhcnJheSA9IChmbG9hdFtdKSB2YWx1ZTsKLQotICAgICAgICAgICAgaWYgKGFycmF5Lmxlbmd0aCA9PSAwKQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgICAgICBMaXN0IGwgPSBuZXcgQXJyYXlMaXN0KGFycmF5Lmxlbmd0aCk7Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgbC5hZGQobmV3IEZsb2F0KGFycmF5W2ldKSk7Ci0KLSAgICAgICAgICAgIHJldHVybiBsLml0ZXJhdG9yKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBEb3VibGVBcnJheUl0ZXJhdG9yQWRhcHRvciBleHRlbmRzIEl0ZXJhdG9yQWRhcHRvcgotICAgIHsKLSAgICAgICAgcHVibGljIEl0ZXJhdG9yIGNvZXJjZShPYmplY3QgdmFsdWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRvdWJsZVtdIGFycmF5ID0gKGRvdWJsZVtdKSB2YWx1ZTsKLQotICAgICAgICAgICAgaWYgKGFycmF5Lmxlbmd0aCA9PSAwKQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgICAgICBMaXN0IGwgPSBuZXcgQXJyYXlMaXN0KGFycmF5Lmxlbmd0aCk7Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgbC5hZGQobmV3IERvdWJsZShhcnJheVtpXSkpOwotCi0gICAgICAgICAgICByZXR1cm4gbC5pdGVyYXRvcigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIHsKLSAgICAgICAgX2l0ZXJhdG9yQWRhcHRvcnMucmVnaXN0ZXIoSXRlcmF0b3IuY2xhc3MsIG5ldyBEZWZhdWx0SXRlcmF0b3JBZGFwdG9yKCkpOwotICAgICAgICBfaXRlcmF0b3JBZGFwdG9ycy5yZWdpc3RlcihDb2xsZWN0aW9uLmNsYXNzLCBuZXcgQ29sbGVjdGlvbkl0ZXJhdG9yQWRhcHRvcigpKTsKLSAgICAgICAgX2l0ZXJhdG9yQWRhcHRvcnMucmVnaXN0ZXIoT2JqZWN0LmNsYXNzLCBuZXcgT2JqZWN0SXRlcmF0b3JBZGFwdG9yKCkpOwotICAgICAgICBfaXRlcmF0b3JBZGFwdG9ycy5yZWdpc3RlcihPYmplY3RbXS5jbGFzcywgbmV3IE9iamVjdEFycmF5SXRlcmF0b3JBZGFwdG9yKCkpOwotICAgICAgICBfaXRlcmF0b3JBZGFwdG9ycy5yZWdpc3Rlcihib29sZWFuW10uY2xhc3MsIG5ldyBCb29sZWFuQXJyYXlJdGVyYXRvckFkYXB0b3IoKSk7Ci0gICAgICAgIF9pdGVyYXRvckFkYXB0b3JzLnJlZ2lzdGVyKGJ5dGVbXS5jbGFzcywgbmV3IEJ5dGVBcnJheUl0ZXJhdG9yQWRhcHRvcigpKTsKLSAgICAgICAgX2l0ZXJhdG9yQWRhcHRvcnMucmVnaXN0ZXIoY2hhcltdLmNsYXNzLCBuZXcgQ2hhckFycmF5SXRlcmF0b3JBZGFwdG9yKCkpOwotICAgICAgICBfaXRlcmF0b3JBZGFwdG9ycy5yZWdpc3RlcihzaG9ydFtdLmNsYXNzLCBuZXcgU2hvcnRBcnJheUl0ZXJhdG9yQWRhcHRvcigpKTsKLSAgICAgICAgX2l0ZXJhdG9yQWRhcHRvcnMucmVnaXN0ZXIoaW50W10uY2xhc3MsIG5ldyBJbnRBcnJheUl0ZXJhdG9yQWRhcHRvcigpKTsKLSAgICAgICAgX2l0ZXJhdG9yQWRhcHRvcnMucmVnaXN0ZXIobG9uZ1tdLmNsYXNzLCBuZXcgTG9uZ0FycmF5SXRlcmF0b3JBZGFwdG9yKCkpOwotICAgICAgICBfaXRlcmF0b3JBZGFwdG9ycy5yZWdpc3RlcihmbG9hdFtdLmNsYXNzLCBuZXcgRmxvYXRBcnJheUl0ZXJhdG9yQWRhcHRvcigpKTsKLSAgICAgICAgX2l0ZXJhdG9yQWRhcHRvcnMucmVnaXN0ZXIoZG91YmxlW10uY2xhc3MsIG5ldyBEb3VibGVBcnJheUl0ZXJhdG9yQWRhcHRvcigpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgQ29weXMgYWxsIGluZm9ybWFsIHtAbGluayBJQmluZGluZyBiaW5kaW5nc30gZnJvbSBhIHNvdXJjZSBjb21wb25lbnQKLSAgICAgKiAgdG8gdGhlIGRlc3RpbmF0aW9uIGNvbXBvbmVudC4gIEluZm9ybWFsIGJpbmRpbmdzIGFyZSBiaW5kaW5ncyBmb3IKLSAgICAgKiAgaW5mb3JtYWwgcGFyYW1ldGVycy4gIFRoaXMgd2lsbCBvdmVyd3JpdGUgcGFyYW1ldGVycyAoZm9ybWFsIG9yCi0gICAgICogIGluZm9ybWFsKSBpbiB0aGUKLSAgICAgKiAgZGVzdGluYXRpb24gY29tcG9uZW50IGlmIHRoZXJlIGlzIGEgbmFtaW5nIGNvbmZsaWN0LgotICAgICAqCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY29weUluZm9ybWFsQmluZGluZ3MoSUNvbXBvbmVudCBzb3VyY2UsIElDb21wb25lbnQgZGVzdGluYXRpb24pCi0gICAgewotICAgICAgICBDb2xsZWN0aW9uIG5hbWVzID0gc291cmNlLmdldEJpbmRpbmdOYW1lcygpOwotCi0gICAgICAgIGlmIChuYW1lcyA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIElDb21wb25lbnRTcGVjaWZpY2F0aW9uIHNwZWNpZmljYXRpb24gPSBzb3VyY2UuZ2V0U3BlY2lmaWNhdGlvbigpOwotICAgICAgICBJdGVyYXRvciBpID0gbmFtZXMuaXRlcmF0b3IoKTsKLQotICAgICAgICB3aGlsZSAoaS5oYXNOZXh0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZykgaS5uZXh0KCk7Ci0KLSAgICAgICAgICAgIC8vIElmIG5vdCBhIGZvcm1hbCBwYXJhbWV0ZXIsIHRoZW4gY29weSBpdCBvdmVyLgotCi0gICAgICAgICAgICBpZiAoc3BlY2lmaWNhdGlvbi5nZXRQYXJhbWV0ZXIobmFtZSkgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBJQmluZGluZyBiaW5kaW5nID0gc291cmNlLmdldEJpbmRpbmcobmFtZSk7Ci0KLSAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbi5zZXRCaW5kaW5nKG5hbWUsIGJpbmRpbmcpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEV2YWx1YXRlcyBhbiBvYmplY3QgdG8gZGV0ZXJtaW5lIGl0cyBib29sZWFuIHZhbHVlLgotICAgICAqCi0gICAgICogIDx0YWJsZSBib3JkZXI9MT4KLSAgICAgKgk8dHI+IDx0aD5DbGFzczwvdGg+IDx0aD5UZXN0PC90aD4gPC90cj4KLSAgICAgKiAgPHRyPgotICAgICAqCQk8dGQ+e0BsaW5rIEJvb2xlYW59PC90ZD4KLSAgICAgKgkJPHRkPlNlbGYgZXhwbGFuYXRvcnkuPC90ZD4KLSAgICAgKgk8L3RyPgotICAgICAqCTx0cj4gPHRkPntAbGluayBOdW1iZXJ9PC90ZD4KLSAgICAgKgkJPHRkPlRydWUgaWYgbm9uLXplcm8sIGZhbHNlIG90aGVyd2lzZS48L3RkPgotICAgICAqCQk8L3RyPgotICAgICAqCTx0cj4KLSAgICAgKgkJPHRkPntAbGluayBDb2xsZWN0aW9ufTwvdGQ+Ci0gICAgICoJCTx0ZD5UcnVlIGlmIGNvbnRhaW5zIGFueSBlbGVtZW50cyAobm9uLXplcm8gc2l6ZSksIGZhbHNlIG90aGVyd2lzZS48L3RkPgotICAgICAqCQk8L3RyPgotICAgICAqCTx0cj4KLSAgICAgKgkJPHRkPntAbGluayBTdHJpbmd9PC90ZD4KLSAgICAgKgkJPHRkPlRydWUgaWYgY29udGFpbnMgYW55IG5vbi13aGl0ZXNwYWNlIGNoYXJhY3RlcnMsIGZhbHNlIG90aGVyd2lzZS48L3RkPgotICAgICAqCQk8L3RyPgotICAgICAqCTx0cj4KLSAgICAgKgkJPHRkPkFueSBPYmplY3QgYXJyYXkgdHlwZTwvdGQ+Ci0gICAgICoJCTx0ZD5UcnVlIGlmIGNvbnRhaW5zIGFueSBlbGVtZW50cyAobm9uLXplcm8gbGVuZ3RoKSwgZmFsc2Ugb3RoZXJ3aXNlLjwvdGQ+Ci0gICAgICoJPHRyPgotICAgICAqPC90YWJsZT4KLSAgICAgKgotICAgICAqIDxwPkFueSBvdGhlciBub24tbnVsbCBvYmplY3QgZXZhbHVhdGVzIHRvIHRydWUuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZXZhbHVhdGVCb29sZWFuKE9iamVjdCB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIENsYXNzIHZhbHVlQ2xhc3MgPSB2YWx1ZS5nZXRDbGFzcygpOwotICAgICAgICBpZiAodmFsdWVDbGFzcy5pc0FycmF5KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE9iamVjdFtdIGFycmF5ID0gKE9iamVjdFtdKSB2YWx1ZTsKLQotICAgICAgICAgICAgcmV0dXJuIGFycmF5Lmxlbmd0aCA+IDA7Ci0gICAgICAgIH0KLQotICAgICAgICBCb29sQWRhcHRvciBhZGFwdG9yID0gKEJvb2xBZGFwdG9yKSBfYm9vbGVhbkFkYXB0b3JzLmdldEFkYXB0b3IodmFsdWVDbGFzcyk7Ci0KLSAgICAgICAgcmV0dXJuIGFkYXB0b3IuY29lcmNlKHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgQ29udmVydHMgYW4gT2JqZWN0IGludG8gYW4ge0BsaW5rIEl0ZXJhdG9yfSwgZm9sbG93aW5nIHNvbWUgYmFzaWMgcnVsZXMuCi0gICAgICoKLSAgICAgKiAgPHRhYmxlIGJvcmRlcj0xPgotICAgICAqIAk8dHI+PHRoPklucHV0IENsYXNzPC90aD4gPHRoPlJlc3VsdDwvdGg+IDwvdHI+Ci0gICAgICogPHRyPjx0ZD5hcnJheTwvdGQ+IDx0ZD5Db252ZXJ0ZWQgdG8gYSB7QGxpbmsgTGlzdH0gYW5kIGl0ZXJhdG9yIHJldHVybmVkLgotICAgICAqIG51bGwgcmV0dXJuZWQgaWYgdGhlIGFycmF5IGlzIGVtcHR5LiAgVGhpcyB3b3JrcyB3aXRoIGJvdGggb2JqZWN0IGFycmF5cyBhbmQKLSAgICAgKiAgYXJyYXlzIG9mIHNjYWxhcnMuIDwvdGQ+Ci0gICAgICogPC90cj4KLSAgICAgKiA8dHI+PHRkPntAbGluayBJdGVyYXRvcn08L3RkPiA8dGQ+UmV0dXJuZWQgYXMtaXMuPC90ZD4KLSAgICAgKiA8dHI+PHRkPntAbGluayBDb2xsZWN0aW9ufTwvdGQ+IDx0ZD5JdGVyYXRvciByZXR1cm5lZCwgb3IgbnVsbAotICAgICAqICBpZiB0aGUgQ29sbGVjdGlvbiBpcyBlbXB0eTwvdGQ+IDwvdHI+Ci0gICAgCi0gICAgICogPHRyPjx0ZD5Bbnkgb3RoZXI8L3RkPiA8dGQ+e0BsaW5rIEl0ZXJhdG9yfSBmb3Igc2luZ2xldG9uIGNvbGxlY3Rpb24gcmV0dXJuZWQ8L3RkPiA8L3RyPgotICAgICAqIDx0cj48dGQ+bnVsbDwvdGQ+IDx0ZD5udWxsIHJldHVybmVkPC90ZD4gPC90cj4KLSAgICAgKiA8L3RhYmxlPgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIHN0YXRpYyBJdGVyYXRvciBjb2VyY2VUb0l0ZXJhdG9yKE9iamVjdCB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgSXRlcmF0b3JBZGFwdG9yIGFkYXB0b3IgPSAoSXRlcmF0b3JBZGFwdG9yKSBfaXRlcmF0b3JBZGFwdG9ycy5nZXRBZGFwdG9yKHZhbHVlLmdldENsYXNzKCkpOwotCi0gICAgICAgIHJldHVybiBhZGFwdG9yLmNvZXJjZSh2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEdldHMgdGhlIHtAbGluayBMb2NhbGV9IGZvciB0aGUgZ2l2ZW4gc3RyaW5nLCB3aGljaCBpcyB0aGUgcmVzdWx0Ci0gICAgICogIG9mIHtAbGluayBMb2NhbGUjdG9TdHJpbmcoKX0uICBJZiBubyBzdWNoIGxvY2FsZSBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQsCi0gICAgICogIGEgbmV3IGluc3RhbmNlIGlzIGNyZWF0ZWQsIHJlZ2lzdGVyZWQgYW5kIHJldHVybmVkLgotICAgICAqCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgc3RhdGljIExvY2FsZSBnZXRMb2NhbGUoU3RyaW5nIHMpCi0gICAgewotICAgICAgICBMb2NhbGUgcmVzdWx0ID0gbnVsbDsKLQotICAgICAgICBzeW5jaHJvbml6ZWQgKF9sb2NhbGVNYXApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IChMb2NhbGUpIF9sb2NhbGVNYXAuZ2V0KHMpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmdTcGxpdHRlciBzcGxpdHRlciA9IG5ldyBTdHJpbmdTcGxpdHRlcignXycpOwotICAgICAgICAgICAgU3RyaW5nW10gdGVybXMgPSBzcGxpdHRlci5zcGxpdFRvQXJyYXkocyk7Ci0KLSAgICAgICAgICAgIHN3aXRjaCAodGVybXMubGVuZ3RoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgMSA6Ci0KLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IExvY2FsZSh0ZXJtc1swXSwgIiIpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgMiA6Ci0KLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IExvY2FsZSh0ZXJtc1swXSwgdGVybXNbMV0pOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgMyA6Ci0KLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IExvY2FsZSh0ZXJtc1swXSwgdGVybXNbMV0sIHRlcm1zWzJdKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBkZWZhdWx0IDoKLQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBjb252ZXJ0ICciICsgcyArICInIHRvIGEgTG9jYWxlLiIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKF9sb2NhbGVNYXApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX2xvY2FsZU1hcC5wdXQocywgcmVzdWx0KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqICBDbG9zZXMgdGhlIHN0cmVhbSAoaWYgbm90IG51bGwpLCBpZ25vcmluZyBhbnkge0BsaW5rIElPRXhjZXB0aW9ufSB0aHJvd24uCi0gICAgICoKLSAgICAgKiAgQHNpbmNlIDEuMC4yCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY2xvc2UoSW5wdXRTdHJlYW0gc3RyZWFtKQotICAgIHsKLSAgICAgICAgaWYgKHN0cmVhbSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBleCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBJZ25vcmUuCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgR2V0cyBhIHN0cmluZyBmcm9tIHRoZSBUYXBlc3RyeVN0cmluZ3MgcmVzb3VyY2UgYnVuZGxlLgotICAgICAqICBUaGUgc3RyaW5nIGluIHRoZSBidW5kbGUKLSAgICAgKiAgaXMgdHJlYXRlZCBhcyBhIHBhdHRlcm4gZm9yIHtAbGluayBNZXNzYWdlRm9ybWF0I2Zvcm1hdChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0W10pfS4KLSAgICAgKgotICAgICAqICBAc2luY2UgMS4wLjgKLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvcm1hdChTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzKQotICAgIHsKLSAgICAgICAgaWYgKF9zdHJpbmdzID09IG51bGwpCi0gICAgICAgICAgICBfc3RyaW5ncyA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgib3JnLmFwYWNoZS50YXBlc3RyeS5UYXBlc3RyeVN0cmluZ3MiKTsKLQotICAgICAgICBTdHJpbmcgcGF0dGVybiA9IF9zdHJpbmdzLmdldFN0cmluZyhrZXkpOwotCi0gICAgICAgIGlmIChhcmdzID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gcGF0dGVybjsKLQotICAgICAgICByZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQocGF0dGVybiwgYXJncyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIENvbnZpZW5pZW5jZSBtZXRob2QgZm9yIGludm9raW5nIHtAbGluayAjZm9ybWF0KFN0cmluZywgT2JqZWN0W10pfS4KLSAgICAgKgotICAgICAqICBAc2luY2UgMy4wCi0gICAgICoqLwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcga2V5KQotICAgIHsKLSAgICAgICAgcmV0dXJuIGZvcm1hdChrZXksIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBDb252aWVuaWVuY2UgbWV0aG9kIGZvciBpbnZva2luZyB7QGxpbmsgI2Zvcm1hdChTdHJpbmcsIE9iamVjdFtdKX0uCi0gICAgICoKLSAgICAgKiAgQHNpbmNlIDMuMAotICAgICAqKi8KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvcm1hdChTdHJpbmcga2V5LCBPYmplY3QgYXJnKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGZvcm1hdChrZXksIG5ldyBPYmplY3RbXSB7IGFyZyB9KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgQ29udmllbmllbmNlIG1ldGhvZCBmb3IgaW52b2tpbmcge0BsaW5rICNmb3JtYXQoU3RyaW5nLCBPYmplY3RbXSl9LgotICAgICAqCi0gICAgICogIEBzaW5jZSAzLjAKLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvcm1hdChTdHJpbmcga2V5LCBPYmplY3QgYXJnMSwgT2JqZWN0IGFyZzIpCi0gICAgewotICAgICAgICByZXR1cm4gZm9ybWF0KGtleSwgbmV3IE9iamVjdFtdIHsgYXJnMSwgYXJnMiB9KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgQ29udmllbmllbmNlIG1ldGhvZCBmb3IgaW52b2tpbmcge0BsaW5rICNmb3JtYXQoU3RyaW5nLCBPYmplY3RbXSl9LgotICAgICAqCi0gICAgICogIEBzaW5jZSAzLjAKLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvcm1hdChTdHJpbmcga2V5LCBPYmplY3QgYXJnMSwgT2JqZWN0IGFyZzIsIE9iamVjdCBhcmczKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGZvcm1hdChrZXksIG5ldyBPYmplY3RbXSB7IGFyZzEsIGFyZzIsIGFyZzMgfSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVOS05PV05fVkVSU0lPTiA9ICJVbmtub3duIjsKLQotICAgIC8qKgotICAgICAqICBJbnZva2VkIHdoZW4gdGhlIGNsYXNzIGlzIGluaXRpYWxpemVkIHRvIHJlYWQgdGhlIGN1cnJlbnQgdmVyc2lvbiBmaWxlLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHJlYWRWZXJzaW9uKCkKLSAgICB7Ci0gICAgICAgIFByb3BlcnRpZXMgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IFRhcGVzdHJ5LmNsYXNzLmdldFJlc291cmNlQXNTdHJlYW0oIlZlcnNpb24ucHJvcGVydGllcyIpOwotCi0gICAgICAgICAgICBpZiAoaW4gPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9WRVJTSU9OOwotCi0gICAgICAgICAgICBwcm9wcy5sb2FkKGluKTsKLQotICAgICAgICAgICAgaW4uY2xvc2UoKTsKLQotICAgICAgICAgICAgcmV0dXJuIHByb3BzLmdldFByb3BlcnR5KCJmcmFtZXdvcmsudmVyc2lvbiIsIFVOS05PV05fVkVSU0lPTik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGV4KQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9WRVJTSU9OOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0aGUgc2l6ZSBvZiBhIGNvbGxlY3Rpb24sIG9yIHplcm8gaWYgdGhlIGNvbGxlY3Rpb24gaXMgbnVsbC4KLSAgICAgKgotICAgICAqICBAc2luY2UgMi4yCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgc3RhdGljIGludCBzaXplKENvbGxlY3Rpb24gYykKLSAgICB7Ci0gICAgICAgIGlmIChjID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gMDsKLQotICAgICAgICByZXR1cm4gYy5zaXplKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgYXJyYXksIG9yIDAgaWYgdGhlIGFycmF5IGlzIG51bGwuCi0gICAgICoKLSAgICAgKiAgQHNpbmNlIDIuMgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIHN0YXRpYyBpbnQgc2l6ZShPYmplY3RbXSBhcnJheSkKLSAgICB7Ci0gICAgICAgIGlmIChhcnJheSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAgICAgcmV0dXJuIGFycmF5Lmxlbmd0aDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0cnVlIGlmIHRoZSBNYXAgaXMgbnVsbCBvciBlbXB0eS4KLSAgICAgKgotICAgICAqICBAc2luY2UgMy4wCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNFbXB0eShNYXAgbWFwKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1hcCA9PSBudWxsIHx8IG1hcC5pc0VtcHR5KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgdHJ1ZSBpZiB0aGUgQ29sbGVjdGlvbiBpcyBudWxsIG9yIGVtcHR5LgotICAgICAqCi0gICAgICogIEBzaW5jZSAzLjAKLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0VtcHR5KENvbGxlY3Rpb24gYykKLSAgICB7Ci0gICAgICAgIHJldHVybiBjID09IG51bGwgfHwgYy5pc0VtcHR5KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIENvbnZlcnRzIGEge0BsaW5rIE1hcH0gdG8gYW4gZXZlbi1zaXplZCBhcnJheSBvZiBrZXkvdmFsdWUKLSAgICAgKiAgcGFpcnMuICBUaGlzIG1heSBiZSB1c2VmdWwgd2hlbiB1c2luZyBhIE1hcCBhcyBzZXJ2aWNlIHBhcmFtZXRlcnMKLSAgICAgKiAgKHdpdGgge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkubGluay5EaXJlY3RMaW5rfS4gIEFzc3VtaW5nIHRoZSBrZXlzCi0gICAgICogIGFuZCB2YWx1ZXMgYXJlIHNpbXBsZSBvYmplY3RzIChTdHJpbmcsIEJvb2xlYW4sIEludGVnZXIsIGV0Yy4pLCB0aGVuCi0gICAgICogIHRoZSByZXByZXNlbnRhdGlvbiBhcyBhbiBhcnJheSB3aWxsIGVuY29kZSBtb3JlIGVmZmljaWVudGx5Ci0gICAgICogICh2aWEge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkudXRpbC5pby5EYXRhU3F1ZWV6ZXJ9IHRoYW4KLSAgICAgKiAgc2VyaWFsaXppbmcgdGhlIE1hcCBhbmQgaXRzIGNvbnRlbnRzLgotICAgICAqCi0gICAgICogIEByZXR1cm4gdGhlIGFycmF5IG9mIGtleXMgYW5kIHZhbHVlcywgb3IgbnVsbCBpZiB0aGUgaW5wdXQKLSAgICAgKiAgTWFwIGlzIG51bGwgb3IgZW1wdHkKLSAgICAgKgotICAgICAqICBAc2luY2UgMi4yCi0gICAgICoqLwotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3RbXSBjb252ZXJ0TWFwVG9BcnJheShNYXAgbWFwKQotICAgIHsKLSAgICAgICAgaWYgKGlzRW1wdHkobWFwKSkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIFNldCBlbnRyaWVzID0gbWFwLmVudHJ5U2V0KCk7Ci0KLSAgICAgICAgT2JqZWN0W10gcmVzdWx0ID0gbmV3IE9iamVjdFsyICogZW50cmllcy5zaXplKCldOwotICAgICAgICBpbnQgeCA9IDA7Ci0KLSAgICAgICAgSXRlcmF0b3IgaSA9IGVudHJpZXMuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpLm5leHQoKTsKLQotICAgICAgICAgICAgcmVzdWx0W3grK10gPSBlbnRyeS5nZXRLZXkoKTsKLSAgICAgICAgICAgIHJlc3VsdFt4KytdID0gZW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIENvbnZlcnRzIGFuIGV2ZW4tc2l6ZWQgYXJyYXkgb2Ygb2JqZWN0cyBiYWNrCi0gICAgICogIGludG8gYSB7QGxpbmsgTWFwfS4KLSAgICAgKgotICAgICAqICBAc2VlICNjb252ZXJ0TWFwVG9BcnJheShNYXApCi0gICAgICogIEByZXR1cm4gYSBNYXAsIG9yIG51bGwgaWYgdGhlIGFycmF5IGlzIG51bGwgb3IgZW1wdHkKLSAgICAgKiAgQHNpbmNlIDIuMgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIHN0YXRpYyBNYXAgY29udmVydEFycmF5VG9NYXAoT2JqZWN0W10gYXJyYXkpCi0gICAgewotICAgICAgICBpZiAoYXJyYXkgPT0gbnVsbCB8fCBhcnJheS5sZW5ndGggPT0gMCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIGlmIChhcnJheS5sZW5ndGggJSAyICE9IDApCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGdldE1lc3NhZ2UoIlRhcGVzdHJ5LmV2ZW4tc2l6ZWQtYXJyYXkiKSk7Ci0KLSAgICAgICAgTWFwIHJlc3VsdCA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICAgICAgaW50IHggPSAwOwotICAgICAgICB3aGlsZSAoeCA8IGFycmF5Lmxlbmd0aCkKLSAgICAgICAgewotICAgICAgICAgICAgT2JqZWN0IGtleSA9IGFycmF5W3grK107Ci0gICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBhcnJheVt4KytdOwotCi0gICAgICAgICAgICByZXN1bHQucHV0KGtleSwgdmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0aGUgYXBwbGljYXRpb24gcm9vdCBsb2NhdGlvbiwgd2hpY2ggaXMgaW4gdGhlCi0gICAgICogIHtAbGluayBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0fSwgYmFzZWQgb24KLSAgICAgKiAgdGhlIHtAbGluayBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0I2dldFNlcnZsZXRQYXRoKCkgc2VydmxldCBwYXRofS4KLSAgICAgKgotICAgICAqICBAc2luY2UgMy4wCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgc3RhdGljIElSZXNvdXJjZUxvY2F0aW9uIGdldEFwcGxpY2F0aW9uUm9vdExvY2F0aW9uKElSZXF1ZXN0Q3ljbGUgY3ljbGUpCi0gICAgewotICAgICAgICBSZXF1ZXN0Q29udGV4dCBjb250ZXh0ID0gY3ljbGUuZ2V0UmVxdWVzdENvbnRleHQoKTsKLSAgICAgICAgU2VydmxldENvbnRleHQgc2VydmxldENvbnRleHQgPSBjb250ZXh0LmdldFNlcnZsZXQoKS5nZXRTZXJ2bGV0Q29udGV4dCgpOwotICAgICAgICBTdHJpbmcgc2VydmxldFBhdGggPSBjb250ZXh0LmdldFJlcXVlc3QoKS5nZXRTZXJ2bGV0UGF0aCgpOwotCi0gICAgICAgIC8vIENvdWxkIHN0cmlwIG9mZiB0aGUgc2VydmxldCBuYW1lIChpLmUuLCAiYXBwIiBpbiAiL2FwcCIpIGJ1dAotICAgICAgICAvLyB0aGVyZSdzIG5vIG5lZWQuCi0KLSAgICAgICAgcmV0dXJuIG5ldyBDb250ZXh0UmVzb3VyY2VMb2NhdGlvbihzZXJ2bGV0Q29udGV4dCwgc2VydmxldFBhdGgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdpdmVuIGEgQ2xhc3MsIGNyZWF0ZXMgYSBwcmVzZW50YWJsZSBuYW1lIGZvciB0aGUgY2xhc3MsIGV2ZW4gaWYgdGhlCi0gICAgICogY2xhc3MgaXMgYSBzY2FsYXIgdHlwZSBvciBBcnJheSB0eXBlLgotICAgICAqCi0gICAgICogQHNpbmNlIDMuMAotICAgICAqLwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKENsYXNzIHN1YmplY3QpCi0gICAgewotICAgICAgICBpZiAoc3ViamVjdC5pc0FycmF5KCkpCi0gICAgICAgICAgICByZXR1cm4gZ2V0Q2xhc3NOYW1lKHN1YmplY3QuZ2V0Q29tcG9uZW50VHlwZSgpKSArICJbXSI7Ci0KLSAgICAgICAgcmV0dXJuIHN1YmplY3QuZ2V0TmFtZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBTZWxlY3RzIHRoZSBmaXJzdCB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5JTG9jYXRpb259IGluIGFuIGFycmF5IG9mIG9iamVjdHMuCi0gICAgICogIFNraXBzIG92ZXIgbnVsbHMuICBUaGUgb2JqZWN0cyBtYXkgYmUgaW5zdGFuY2VzIG9mCi0gICAgICogIHtMb2NhdGlvbiBvciB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5JTG9jYXRhYmxlfS4gIE1heSByZXR1cm4gbnVsbAotICAgICAqICBpZiBubyBMb2NhdGlvbiBmb3VuZCBmb3VuZC4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBzdGF0aWMgSUxvY2F0aW9uIGZpbmRMb2NhdGlvbihPYmplY3RbXSBsb2NhdGlvbnMpCi0gICAgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxvY2F0aW9ucy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgT2JqZWN0IGxvY2F0aW9uID0gbG9jYXRpb25zW2ldOwotCi0gICAgICAgICAgICBpZiAobG9jYXRpb24gPT0gbnVsbCkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgICAgaWYgKGxvY2F0aW9uIGluc3RhbmNlb2YgSUxvY2F0aW9uKQotICAgICAgICAgICAgICAgIHJldHVybiAoSUxvY2F0aW9uKSBsb2NhdGlvbjsKLQotICAgICAgICAgICAgaWYgKGxvY2F0aW9uIGluc3RhbmNlb2YgSUxvY2F0YWJsZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBJTG9jYXRhYmxlIGxvY2F0YWJsZSA9IChJTG9jYXRhYmxlKSBsb2NhdGlvbjsKLSAgICAgICAgICAgICAgICBJTG9jYXRpb24gcmVzdWx0ID0gbG9jYXRhYmxlLmdldExvY2F0aW9uKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgQ3JlYXRlcyBhbiBleGNlcHRpb24gaW5kaWNhdGluZyB0aGUgYmluZGluZyB2YWx1ZSBpcyBudWxsLgotICAgICAqCi0gICAgICogIEBzaW5jZSAzLjAKLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBzdGF0aWMgQmluZGluZ0V4Y2VwdGlvbiBjcmVhdGVOdWxsQmluZGluZ0V4Y2VwdGlvbihJQmluZGluZyBiaW5kaW5nKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBCaW5kaW5nRXhjZXB0aW9uKGdldE1lc3NhZ2UoIm51bGwtdmFsdWUtZm9yLWJpbmRpbmciKSwgYmluZGluZyk7Ci0gICAgfQotCi0gICAgLyoqIEBzaW5jZSAzLjAgKiovCi0KLSAgICBwdWJsaWMgc3RhdGljIEFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbiBjcmVhdGVOb1N1Y2hDb21wb25lbnRFeGNlcHRpb24oCi0gICAgICAgIElDb21wb25lbnQgY29tcG9uZW50LAotICAgICAgICBTdHJpbmcgaWQsCi0gICAgICAgIElMb2NhdGlvbiBsb2NhdGlvbikKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICAgZm9ybWF0KCJuby1zdWNoLWNvbXBvbmVudCIsIGNvbXBvbmVudC5nZXRFeHRlbmRlZElkKCksIGlkKSwKLSAgICAgICAgICAgIGNvbXBvbmVudCwKLSAgICAgICAgICAgIGxvY2F0aW9uLAotICAgICAgICAgICAgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqIEBzaW5jZSAzLjAgKiovCi0KLSAgICBwdWJsaWMgc3RhdGljIEJpbmRpbmdFeGNlcHRpb24gY3JlYXRlUmVxdWlyZWRQYXJhbWV0ZXJFeGNlcHRpb24oCi0gICAgICAgIElDb21wb25lbnQgY29tcG9uZW50LAotICAgICAgICBTdHJpbmcgcGFyYW1ldGVyTmFtZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgQmluZGluZ0V4Y2VwdGlvbigKLSAgICAgICAgICAgIGZvcm1hdCgicmVxdWlyZWQtcGFyYW1ldGVyIiwgcGFyYW1ldGVyTmFtZSwgY29tcG9uZW50LmdldEV4dGVuZGVkSWQoKSksCi0gICAgICAgICAgICBjb21wb25lbnQsCi0gICAgICAgICAgICBudWxsLAotICAgICAgICAgICAgY29tcG9uZW50LmdldEJpbmRpbmcocGFyYW1ldGVyTmFtZSksCi0gICAgICAgICAgICBudWxsKTsKLSAgICB9Ci0KLSAgICAvKiogQHNpbmNlIDMuMCAqKi8KLQotICAgIHB1YmxpYyBzdGF0aWMgQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uIGNyZWF0ZVJlbmRlck9ubHlQcm9wZXJ0eUV4Y2VwdGlvbigKLSAgICAgICAgSUNvbXBvbmVudCBjb21wb25lbnQsCi0gICAgICAgIFN0cmluZyBwcm9wZXJ0eU5hbWUpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IEFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAgIGZvcm1hdCgicmVuZGVyLW9ubHktcHJvcGVydHkiLCBwcm9wZXJ0eU5hbWUsIGNvbXBvbmVudC5nZXRFeHRlbmRlZElkKCkpLAotICAgICAgICAgICAgY29tcG9uZW50LAotICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENsZWFycyB0aGUgbGlzdCBvZiBtZXRob2QgaW52b2NhdGlvbnMuCi0gICAgICogQHNlZSAjY2hlY2tNZXRob2RJbnZvY2F0aW9uKE9iamVjdCwgU3RyaW5nLCBPYmplY3QpCi0gICAgICoKLSAgICAgKiBAc2luY2UgMy4wCi0gICAgICovCi0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY2xlYXJNZXRob2RJbnZvY2F0aW9ucygpCi0gICAgewotICAgICAgICBfaW52b2tlZE1ldGhvZElkcy5zZXQobnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIG1ldGhvZCBpbnZvY2F0aW9uIHRvIHRoZSBsaXN0IG9mIGludm9jYXRpb25zLiBUaGlzIGlzIGRvbmUKLSAgICAgKiBpbiBhIHN1cGVyLWNsYXNzIGltcGxlbWVudGF0aW9ucy4KLSAgICAgKgotICAgICAqIEBzZWUgI2NoZWNrTWV0aG9kSW52b2NhdGlvbihPYmplY3QsIFN0cmluZywgT2JqZWN0KQotICAgICAqIEBzaW5jZSAzLjAKLSAgICAgKgotICAgICAqLwotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZE1ldGhvZEludm9jYXRpb24oT2JqZWN0IG1ldGhvZElkKQotICAgIHsKLSAgICAgICAgTGlzdCBtZXRob2RJZHMgPSAoTGlzdCkgX2ludm9rZWRNZXRob2RJZHMuZ2V0KCk7Ci0KLSAgICAgICAgaWYgKG1ldGhvZElkcyA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBtZXRob2RJZHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICBfaW52b2tlZE1ldGhvZElkcy5zZXQobWV0aG9kSWRzKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1ldGhvZElkcy5hZGQobWV0aG9kSWQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrcyB0byBzZWUgaWYgYSBwYXJ0aWN1bGFyIG1ldGhvZCBoYXMgYmVlbiBpbnZva2VkLiAgVGhlIG1ldGhvZCBpcyBpZGVudGlmaWVkIGJ5IGEKLSAgICAgKiBtZXRob2RJZCAodXN1YWxseSBhIFN0cmluZykuICBUaGUgbWV0aG9kTmFtZSBhbmQgb2JqZWN0IGFyZSB1c2VkIHRvIGNyZWF0ZSBhbgotICAgICAqIGVycm9yIG1lc3NhZ2UuCi0gICAgICoKLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgY2FsbGVyIHNob3VsZCBpbnZva2Uge0BsaW5rICNjbGVhck1ldGhvZEludm9jYXRpb25zKCl9LCB0aGVuIGludm9rZSBhIG1ldGhvZCBvbgotICAgICAqIHRoZSBvYmplY3QuICBUaGUgc3VwZXItY2xhc3MgaW1wbGVtZW50YXRpb24gc2hvdWxkIGludm9rZSB7QGxpbmsgI2FkZE1ldGhvZEludm9jYXRpb24oT2JqZWN0KX0KLSAgICAgKiB0byBpbmRpY2F0ZSB0aGF0IGl0IHdhcywgaW4gZmFjdCwgaW52b2tlZC4gIFRoZSBjYWxsZXIgdGhlbiBpbnZva2VzCi0gICAgICogdGhpcyBtZXRob2QgdG8gdmxhaWRhdGUgdGhhdCB0aGUgc3VwZXItY2xhc3MgaW1wbGVtZW50YXRpb24gd2FzIGludm9rZWQuCi0gICAgICoKLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgbGlzdCBvZiBtZXRob2QgaW52b2NhdGlvbnMgaXMgc3RvcmVkIGluIGEge0BsaW5rIFRocmVhZExvY2FsfSB2YXJpYWJsZS4KLSAgICAgKgotICAgICAqIEBzaW5jZSAzLjAKLSAgICAgKi8KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjaGVja01ldGhvZEludm9jYXRpb24oT2JqZWN0IG1ldGhvZElkLCBTdHJpbmcgbWV0aG9kTmFtZSwgT2JqZWN0IG9iamVjdCkKLSAgICB7Ci0gICAgICAgIExpc3QgbWV0aG9kSWRzID0gKExpc3QpIF9pbnZva2VkTWV0aG9kSWRzLmdldCgpOwotCi0gICAgICAgIGlmIChtZXRob2RJZHMgIT0gbnVsbCAmJiBtZXRob2RJZHMuY29udGFpbnMobWV0aG9kSWQpKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICBUYXBlc3RyeS5mb3JtYXQoCi0gICAgICAgICAgICAgICAgIlRhcGVzdHJ5Lm1pc3NpbmctbWV0aG9kLWludm9jYXRpb24iLAotICAgICAgICAgICAgICAgIG9iamVjdC5nZXRDbGFzcygpLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICBtZXRob2ROYW1lKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWV0aG9kIHVzZWQgYnkgcGFnZXMgYW5kIGNvbXBvbmVudHMgdG8gc2VuZCBub3RpZmljYXRpb25zIGFib3V0Ci0gICAgICogcHJvcGVydHkgY2hhbmdlcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb21wb25lbnQgdGhlIGNvbXBvbmVudCBjb250YWluaW5nIHRoZSBwcm9wZXJ0eQotICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHdoaWNoIGNoYW5nZWQKLSAgICAgKiBAcGFyYW0gbmV3VmFsdWUgdGhlIG5ldyB2YWx1ZSBmb3IgdGhlIHByb3BlcnR5Ci0gICAgICoKLSAgICAgKiBAc2luY2UgMy4wCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGZpcmVPYnNlcnZlZENoYW5nZSgKLSAgICAgICAgSUNvbXBvbmVudCBjb21wb25lbnQsCi0gICAgICAgIFN0cmluZyBwcm9wZXJ0eU5hbWUsCi0gICAgICAgIE9iamVjdCBuZXdWYWx1ZSkKLSAgICB7Ci0gICAgICAgIENoYW5nZU9ic2VydmVyIG9ic2VydmVyID0gY29tcG9uZW50LmdldFBhZ2UoKS5nZXRDaGFuZ2VPYnNlcnZlcigpOwotCi0gICAgICAgIGlmIChvYnNlcnZlciA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIE9ic2VydmVkQ2hhbmdlRXZlbnQgZXZlbnQgPSBuZXcgT2JzZXJ2ZWRDaGFuZ2VFdmVudChjb21wb25lbnQsIHByb3BlcnR5TmFtZSwgbmV3VmFsdWUpOwotCi0gICAgICAgIG9ic2VydmVyLm9ic2VydmVDaGFuZ2UoZXZlbnQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ldGhvZCB1c2VkIGJ5IHBhZ2VzIGFuZCBjb21wb25lbnRzIHRvIHNlbmQgbm90aWZpY2F0aW9ucyBhYm91dAotICAgICAqIHByb3BlcnR5IGNoYW5nZXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29tcG9uZW50IHRoZSBjb21wb25lbnQgY29udGFpbmluZyB0aGUgcHJvcGVydHkKLSAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB3aGljaCBjaGFuZ2VkCi0gICAgICogQHBhcmFtIG5ld1ZhbHVlIHRoZSBuZXcgdmFsdWUgZm9yIHRoZSBwcm9wZXJ0eQotICAgICAqCi0gICAgICogQHNpbmNlIDMuMAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBmaXJlT2JzZXJ2ZWRDaGFuZ2UoCi0gICAgICAgIElDb21wb25lbnQgY29tcG9uZW50LAotICAgICAgICBTdHJpbmcgcHJvcGVydHlOYW1lLAotICAgICAgICBib29sZWFuIG5ld1ZhbHVlKQotICAgIHsKLSAgICAgICAgQ2hhbmdlT2JzZXJ2ZXIgb2JzZXJ2ZXIgPSBjb21wb25lbnQuZ2V0UGFnZSgpLmdldENoYW5nZU9ic2VydmVyKCk7Ci0KLSAgICAgICAgaWYgKG9ic2VydmVyID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgT2JzZXJ2ZWRDaGFuZ2VFdmVudCBldmVudCA9Ci0gICAgICAgICAgICBuZXcgT2JzZXJ2ZWRDaGFuZ2VFdmVudCgKLSAgICAgICAgICAgICAgICBjb21wb25lbnQsCi0gICAgICAgICAgICAgICAgcHJvcGVydHlOYW1lLAotICAgICAgICAgICAgICAgIG5ld1ZhbHVlID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRSk7Ci0KLSAgICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZUNoYW5nZShldmVudCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWV0aG9kIHVzZWQgYnkgcGFnZXMgYW5kIGNvbXBvbmVudHMgdG8gc2VuZCBub3RpZmljYXRpb25zIGFib3V0Ci0gICAgICogcHJvcGVydHkgY2hhbmdlcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb21wb25lbnQgdGhlIGNvbXBvbmVudCBjb250YWluaW5nIHRoZSBwcm9wZXJ0eQotICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHdoaWNoIGNoYW5nZWQKLSAgICAgKiBAcGFyYW0gbmV3VmFsdWUgdGhlIG5ldyB2YWx1ZSBmb3IgdGhlIHByb3BlcnR5Ci0gICAgICoKLSAgICAgKiBAc2luY2UgMy4wCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGZpcmVPYnNlcnZlZENoYW5nZSgKLSAgICAgICAgSUNvbXBvbmVudCBjb21wb25lbnQsCi0gICAgICAgIFN0cmluZyBwcm9wZXJ0eU5hbWUsCi0gICAgICAgIGRvdWJsZSBuZXdWYWx1ZSkKLSAgICB7Ci0gICAgICAgIENoYW5nZU9ic2VydmVyIG9ic2VydmVyID0gY29tcG9uZW50LmdldFBhZ2UoKS5nZXRDaGFuZ2VPYnNlcnZlcigpOwotCi0gICAgICAgIGlmIChvYnNlcnZlciA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIE9ic2VydmVkQ2hhbmdlRXZlbnQgZXZlbnQgPQotICAgICAgICAgICAgbmV3IE9ic2VydmVkQ2hhbmdlRXZlbnQoY29tcG9uZW50LCBwcm9wZXJ0eU5hbWUsIG5ldyBEb3VibGUobmV3VmFsdWUpKTsKLQotICAgICAgICBvYnNlcnZlci5vYnNlcnZlQ2hhbmdlKGV2ZW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgdXNlZCBieSBwYWdlcyBhbmQgY29tcG9uZW50cyB0byBzZW5kIG5vdGlmaWNhdGlvbnMgYWJvdXQKLSAgICAgKiBwcm9wZXJ0eSBjaGFuZ2VzLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbXBvbmVudCB0aGUgY29tcG9uZW50IGNvbnRhaW5pbmcgdGhlIHByb3BlcnR5Ci0gICAgICogQHBhcmFtIHByb3BlcnR5TmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgd2hpY2ggY2hhbmdlZAotICAgICAqIEBwYXJhbSBuZXdWYWx1ZSB0aGUgbmV3IHZhbHVlIGZvciB0aGUgcHJvcGVydHkKLSAgICAgKgotICAgICAqIEBzaW5jZSAzLjAKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZmlyZU9ic2VydmVkQ2hhbmdlKAotICAgICAgICBJQ29tcG9uZW50IGNvbXBvbmVudCwKLSAgICAgICAgU3RyaW5nIHByb3BlcnR5TmFtZSwKLSAgICAgICAgZmxvYXQgbmV3VmFsdWUpCi0gICAgewotICAgICAgICBDaGFuZ2VPYnNlcnZlciBvYnNlcnZlciA9IGNvbXBvbmVudC5nZXRQYWdlKCkuZ2V0Q2hhbmdlT2JzZXJ2ZXIoKTsKLQotICAgICAgICBpZiAob2JzZXJ2ZXIgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBPYnNlcnZlZENoYW5nZUV2ZW50IGV2ZW50ID0KLSAgICAgICAgICAgIG5ldyBPYnNlcnZlZENoYW5nZUV2ZW50KGNvbXBvbmVudCwgcHJvcGVydHlOYW1lLCBuZXcgRmxvYXQobmV3VmFsdWUpKTsKLQotICAgICAgICBvYnNlcnZlci5vYnNlcnZlQ2hhbmdlKGV2ZW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIE1ldGhvZCB1c2VkIGJ5IHBhZ2VzIGFuZCBjb21wb25lbnRzIHRvIHNlbmQgbm90aWZpY2F0aW9ucyBhYm91dAotICAgICogcHJvcGVydHkgY2hhbmdlcy4KLSAgICAqCi0gICAgKiBAcGFyYW0gY29tcG9uZW50IHRoZSBjb21wb25lbnQgY29udGFpbmluZyB0aGUgcHJvcGVydHkKLSAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHdoaWNoIGNoYW5nZWQKLSAgICAqIEBwYXJhbSBuZXdWYWx1ZSB0aGUgbmV3IHZhbHVlIGZvciB0aGUgcHJvcGVydHkKLSAgICAqCi0gICAgKiBAc2luY2UgMy4wCi0gICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZmlyZU9ic2VydmVkQ2hhbmdlKElDb21wb25lbnQgY29tcG9uZW50LCBTdHJpbmcgcHJvcGVydHlOYW1lLCBpbnQgbmV3VmFsdWUpCi0gICAgewotICAgICAgICBDaGFuZ2VPYnNlcnZlciBvYnNlcnZlciA9IGNvbXBvbmVudC5nZXRQYWdlKCkuZ2V0Q2hhbmdlT2JzZXJ2ZXIoKTsKLQotICAgICAgICBpZiAob2JzZXJ2ZXIgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBPYnNlcnZlZENoYW5nZUV2ZW50IGV2ZW50ID0KLSAgICAgICAgICAgIG5ldyBPYnNlcnZlZENoYW5nZUV2ZW50KGNvbXBvbmVudCwgcHJvcGVydHlOYW1lLCBuZXcgSW50ZWdlcihuZXdWYWx1ZSkpOwotCi0gICAgICAgIG9ic2VydmVyLm9ic2VydmVDaGFuZ2UoZXZlbnQpOwotICAgIH0KLQotICAgIC8qKgotICAgICogTWV0aG9kIHVzZWQgYnkgcGFnZXMgYW5kIGNvbXBvbmVudHMgdG8gc2VuZCBub3RpZmljYXRpb25zIGFib3V0Ci0gICAgKiBwcm9wZXJ0eSBjaGFuZ2VzLgotICAgICoKLSAgICAqIEBwYXJhbSBjb21wb25lbnQgdGhlIGNvbXBvbmVudCBjb250YWluaW5nIHRoZSBwcm9wZXJ0eQotICAgICogQHBhcmFtIHByb3BlcnR5TmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgd2hpY2ggY2hhbmdlZAotICAgICogQHBhcmFtIG5ld1ZhbHVlIHRoZSBuZXcgdmFsdWUgZm9yIHRoZSBwcm9wZXJ0eQotICAgICoKLSAgICAqIEBzaW5jZSAzLjAKLSAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBmaXJlT2JzZXJ2ZWRDaGFuZ2UoSUNvbXBvbmVudCBjb21wb25lbnQsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIGxvbmcgbmV3VmFsdWUpCi0gICAgewotICAgICAgICBDaGFuZ2VPYnNlcnZlciBvYnNlcnZlciA9IGNvbXBvbmVudC5nZXRQYWdlKCkuZ2V0Q2hhbmdlT2JzZXJ2ZXIoKTsKLQotICAgICAgICBpZiAob2JzZXJ2ZXIgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBPYnNlcnZlZENoYW5nZUV2ZW50IGV2ZW50ID0KLSAgICAgICAgICAgIG5ldyBPYnNlcnZlZENoYW5nZUV2ZW50KGNvbXBvbmVudCwgcHJvcGVydHlOYW1lLCBuZXcgTG9uZyhuZXdWYWx1ZSkpOwotCi0gICAgICAgIG9ic2VydmVyLm9ic2VydmVDaGFuZ2UoZXZlbnQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ldGhvZCB1c2VkIGJ5IHBhZ2VzIGFuZCBjb21wb25lbnRzIHRvIHNlbmQgbm90aWZpY2F0aW9ucyBhYm91dAotICAgICAqIHByb3BlcnR5IGNoYW5nZXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29tcG9uZW50IHRoZSBjb21wb25lbnQgY29udGFpbmluZyB0aGUgcHJvcGVydHkKLSAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB3aGljaCBjaGFuZ2VkCi0gICAgICogQHBhcmFtIG5ld1ZhbHVlIHRoZSBuZXcgdmFsdWUgZm9yIHRoZSBwcm9wZXJ0eQotICAgICAqCi0gICAgICogQHNpbmNlIDMuMAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBmaXJlT2JzZXJ2ZWRDaGFuZ2UoSUNvbXBvbmVudCBjb21wb25lbnQsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIGNoYXIgbmV3VmFsdWUpCi0gICAgewotICAgICAgICBDaGFuZ2VPYnNlcnZlciBvYnNlcnZlciA9IGNvbXBvbmVudC5nZXRQYWdlKCkuZ2V0Q2hhbmdlT2JzZXJ2ZXIoKTsKLQotICAgICAgICBpZiAob2JzZXJ2ZXIgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBPYnNlcnZlZENoYW5nZUV2ZW50IGV2ZW50ID0KLSAgICAgICAgICAgIG5ldyBPYnNlcnZlZENoYW5nZUV2ZW50KGNvbXBvbmVudCwgcHJvcGVydHlOYW1lLCBuZXcgQ2hhcmFjdGVyKG5ld1ZhbHVlKSk7Ci0KLSAgICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZUNoYW5nZShldmVudCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWV0aG9kIHVzZWQgYnkgcGFnZXMgYW5kIGNvbXBvbmVudHMgdG8gc2VuZCBub3RpZmljYXRpb25zIGFib3V0Ci0gICAgICogcHJvcGVydHkgY2hhbmdlcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb21wb25lbnQgdGhlIGNvbXBvbmVudCBjb250YWluaW5nIHRoZSBwcm9wZXJ0eQotICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHdoaWNoIGNoYW5nZWQKLSAgICAgKiBAcGFyYW0gbmV3VmFsdWUgdGhlIG5ldyB2YWx1ZSBmb3IgdGhlIHByb3BlcnR5Ci0gICAgICoKLSAgICAgKiBAc2luY2UgMy4wCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGZpcmVPYnNlcnZlZENoYW5nZShJQ29tcG9uZW50IGNvbXBvbmVudCwgU3RyaW5nIHByb3BlcnR5TmFtZSwgYnl0ZSBuZXdWYWx1ZSkKLSAgICB7Ci0gICAgICAgIENoYW5nZU9ic2VydmVyIG9ic2VydmVyID0gY29tcG9uZW50LmdldFBhZ2UoKS5nZXRDaGFuZ2VPYnNlcnZlcigpOwotCi0gICAgICAgIGlmIChvYnNlcnZlciA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIE9ic2VydmVkQ2hhbmdlRXZlbnQgZXZlbnQgPQotICAgICAgICAgICAgbmV3IE9ic2VydmVkQ2hhbmdlRXZlbnQoY29tcG9uZW50LCBwcm9wZXJ0eU5hbWUsIG5ldyBCeXRlKG5ld1ZhbHVlKSk7Ci0KLSAgICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZUNoYW5nZShldmVudCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWV0aG9kIHVzZWQgYnkgcGFnZXMgYW5kIGNvbXBvbmVudHMgdG8gc2VuZCBub3RpZmljYXRpb25zIGFib3V0Ci0gICAgICogcHJvcGVydHkgY2hhbmdlcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb21wb25lbnQgdGhlIGNvbXBvbmVudCBjb250YWluaW5nIHRoZSBwcm9wZXJ0eQotICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHdoaWNoIGNoYW5nZWQKLSAgICAgKiBAcGFyYW0gbmV3VmFsdWUgdGhlIG5ldyB2YWx1ZSBmb3IgdGhlIHByb3BlcnR5Ci0gICAgICoKLSAgICAgKiBAc2luY2UgMy4wCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGZpcmVPYnNlcnZlZENoYW5nZSgKLSAgICAgICAgSUNvbXBvbmVudCBjb21wb25lbnQsCi0gICAgICAgIFN0cmluZyBwcm9wZXJ0eU5hbWUsCi0gICAgICAgIHNob3J0IG5ld1ZhbHVlKQotICAgIHsKLSAgICAgICAgQ2hhbmdlT2JzZXJ2ZXIgb2JzZXJ2ZXIgPSBjb21wb25lbnQuZ2V0UGFnZSgpLmdldENoYW5nZU9ic2VydmVyKCk7Ci0KLSAgICAgICAgaWYgKG9ic2VydmVyID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgT2JzZXJ2ZWRDaGFuZ2VFdmVudCBldmVudCA9Ci0gICAgICAgICAgICBuZXcgT2JzZXJ2ZWRDaGFuZ2VFdmVudChjb21wb25lbnQsIHByb3BlcnR5TmFtZSwgbmV3IFNob3J0KG5ld1ZhbHVlKSk7Ci0KLSAgICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZUNoYW5nZShldmVudCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBpbnB1dCBpcyBudWxsIG9yIGNvbnRhaW5zIG9ubHkgd2hpdGVzcGFjZS4KLSAgICAgKiAKLSAgICAgKiA8cD4KLSAgICAgKiBOb3RlOiBZZXMsIHlvdSdkIHRoaW5rIHdlJ2QgdXNlIDxjb2RlPlN0cmluZ1V0aWxzPC9jb2RlPiwgYnV0IHdpdGgKLSAgICAgKiB0aGUgY2hhbmdlIGluIG5hbWVzIGFuZCBiZWhhdmlvciBiZXR3ZWVuIHJlbGVhc2VzLCBpdCBpcyBzbWFydGVyCi0gICAgICogdG8ganVzdCBpbXBsZW1lbnQgb3VyIG93biBsaXR0bGUgbWV0aG9kIQotICAgICAqIAotICAgICAqIEBzaW5jZSAzLjAKLSAgICAgKi8KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0JsYW5rKFN0cmluZyBpbnB1dCkKLSAgICB7Ci0gICAgICAgIGlmIChpbnB1dCA9PSBudWxsIHx8IGlucHV0Lmxlbmd0aCgpID09IDApCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgICAgICByZXR1cm4gaW5wdXQudHJpbSgpLmxlbmd0aCgpID09IDA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBpbnB1dCBpcyBub3QgbnVsbCBhbmQgbm90IGVtcHR5IChvciBvbmx5IHdoaXRlc3BhY2UpLgotICAgICAqIAotICAgICAqIEBzaW5jZSAzLjAKLSAgICAgKiAKLSAgICAgKi8KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc05vbkJsYW5rKFN0cmluZyBpbnB1dCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAhaXNCbGFuayhpbnB1dCk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9UYXBlc3RyeVN0cmluZ3MucHJvcGVydGllcyBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9UYXBlc3RyeVN0cmluZ3MucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FjM2VjNC4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvVGFwZXN0cnlTdHJpbmdzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0ODMgKzAsMCBAQAotIyAkSWQkCi0jIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgIGh0dHA6I3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0jIENvbnRhaW5zIFN0cmluZyBjb250YW50cyB1c2VkIHRocm91Z2hvdXQgdGhlIFRhcGVzdHJ5IGZyYW1ld29yay4KLSMgVG8ga2VlcCB0aGluZ3Mgb3JnYW5pemVkLCBlYWNoIGtleSBpcyBpbiB0d28gcGFydHM6ICB0aGUgc2ltcGxlIGNsYXNzIG5hbWUKLSMgYW5kIGEgc3Via2V5IHdpdGhpbiB0aGUgY2xhc3MgbmFtZS4KLQotCi0jIFNvbWUgZ2VuZXJhbCBtZXNzYWdlcwotCi1zZXJ2aWNlLW5vLXBhcmFtZXRlcnM9U2VydmljZSB7MH0gcmVxdWlyZXMgbm8gc2VydmljZSBwYXJhbWV0ZXJzLgotc2VydmljZS1zaW5nbGUtcGFyYW1ldGVyPVNlcnZpY2UgezB9IHJlcXVpcmVzIGV4YWN0bHkgb25lIHNlcnZpY2UgcGFyYW1ldGVyLgotc2VydmljZS1zaW5nbGUtY29udGV4dC1wYXJhbWV0ZXI9U2VydmljZSB7MH0gcmVxdWlyZXMgZXhhY3RseSBvbmUgY29udGV4dCBwYXJhbWV0ZXIuCi1zZXJ2aWNlLXJlcXVpcmVzLXBhcmFtZXRlcnM9U2VydmljZSB7MH0gcmVxdWlyZXMgYXQgbGVhc3Qgb25lIHNlcnZpY2UgcGFyYW1ldGVyLgotc2VydmljZS1pbmNvcnJlY3QtcGFyYW1ldGVyLWNvdW50PVNlcnZpY2UgezB9IHJlcXVpcmVzIGV4YWN0bHkgezF9IHNlcnZpY2UgcGFyYW1ldGVycy4KLW1pc3NpbmctcmVzb3VyY2U9Q291bGQgbm90IGxvY2F0ZSByZXNvdXJjZSB7MH0uCi1pbnZhbGlkLWZpZWxkLW5hbWU9SW52YWxpZCBmaWVsZCBuYW1lOiB7MH0uCi11bmFibGUtdG8tcmVzb2x2ZS1jbGFzcz1VbmFibGUgdG8gcmVzb2x2ZSBjbGFzcyB7MH0uCi1maWVsZC1ub3QtZGVmaW5lZD1GaWVsZCB7MH0gZG9lcyBub3QgZXhpc3QuCi1pbGxlZ2FsLWZpZWxkLWFjY2Vzcz1DYW5ub3QgYWNjZXNzIGZpZWxkIHswfS4KLWZpZWxkLWlzLWluc3RhbmNlPUZpZWxkIHswfSBpcyBhbiBpbnN0YW5jZSB2YXJpYWJsZSwgbm90IGEgY2xhc3MgdmFyaWFibGUuCi1kZXByZWNhdGVkLWNvbXBvbmVudC1wYXJhbT1QYXJhbWV0ZXIgJyd7MX0nJyBvZiBjb21wb25lbnQgezB9IGlzIGRlcHJlY2F0ZWQsIHVzZSBwYXJhbWV0ZXIgJyd7Mn0nJyBpbnN0ZWFkLgotbXVzdC1iZS13cmFwcGVkLWJ5LWZvcm09ezF9IGNvbXBvbmVudHMgbXVzdCBiZSBlbmNsb3NlZCBieSBhIEZvcm0gY29tcG9uZW50LgotaW52YWxpZC1udWxsLXBhcmFtZXRlcj1QYXJhbWV0ZXIgJyd7MH0nJyBtYXkgbm90IGJlIG51bGwuCi1udWxsLXZhbHVlLWZvci1iaW5kaW5nPUJpbmRpbmcgdmFsdWUgaXMgbnVsbC4KLW5vLXN1Y2gtY29tcG9uZW50PUNvbXBvbmVudCB7MH0gZG9lcyBub3QgY29udGFpbiBhIGNvbXBvbmVudCB7MX0uCi1yZXF1aXJlZC1wYXJhbWV0ZXI9VmFsdWUgZm9yIHBhcmFtZXRlciAnJ3swfScnIGluIGNvbXBvbmVudCB7MX0gaXMgbnVsbCwgYW5kIGEgbm9uLW51bGwgdmFsdWUgaXMgcmVxdWlyZWQuCi1yZW5kZXItb25seS1wcm9wZXJ0eT1Qcm9wZXJ0eSAnJ3swfScnIG9mIHsxfSBtYXkgb25seSBiZSBhY2Nlc3NlZCB3aGlsZSB0aGUgY29tcG9uZW50IGlzIHJlbmRlcmluZy4KLXVuc3VwcG9ydGVkLXByb3BlcnR5PVByb3BlcnR5ICcnezF9JycgaXMgbm90IHN1cHBvcnRlZCBieSB7MH0uCi1tdXN0LWJlLWNvbnRhaW5lZC1ieS1ib2R5PXswfSBjb21wb25lbnRzIG11c3QgYmUgY29udGFpbmVkIGJ5IGEgQm9keSBjb21wb25lbnQuCi1pbGxlZ2FsLWVuY29kaW5nPVRoZSBlbmNvZGluZyAnJ3swfScnIGlzIG5vdCByZWNvZ25pemVkLgotCi0jIG9yZy5hcGFjaGUudGFwZXN0cnkKLQotQWJzdHJhY3RDb21wb25lbnQuYXR0ZW1wdC10by1jaGFuZ2UtY29udGFpbmVyPUF0dGVtcHQgdG8gY2hhbmdlIGV4aXN0aW5nIGNvbnRhaW5lci4KLUFic3RyYWN0Q29tcG9uZW50LmF0dGVtcHQtdG8tY2hhbmdlLWNvbXBvbmVudC1pZD1BdHRlbXB0IHRvIGNoYW5nZSBleGlzdGluZyBjb21wb25lbnQgaWQuCi1BYnN0cmFjdENvbXBvbmVudC5udWxsLWNvbnRhaW5lcj17MH0gY29udGFpbmVyIGlzIG51bGwuCi1BYnN0cmFjdENvbXBvbmVudC5hdHRlbXB0LXRvLWNoYW5nZS1wYWdlPUF0dGVtcHQgdG8gY2hhbmdlIGV4aXN0aW5nIGNvbnRhaW5pbmcgcGFnZS4KLUFic3RyYWN0Q29tcG9uZW50LmF0dGVtcHQtdG8tY2hhbmdlLXNwZWM9QXR0ZW1wdCB0byBjaGFuZ2UgZXhpc3RpbmcgY29tcG9uZW50IHNwZWNpZmljYXRpb24uCi0KLUFic3RyYWN0UGFnZS5hdHRlbXB0LXRvLWNoYW5nZS1sb2NhbGU9QXR0ZW1wdCB0byBjaGFuZ2UgZXhpc3RpbmcgbG9jYWxlIGZvciBhIHBhZ2UuCi1BYnN0cmFjdFBhZ2UuYXR0ZW1wdC10by1jaGFuZ2UtbmFtZT1BdHRlbXB0IHRvIGNoYW5nZSBleGlzdGluZyBuYW1lIGZvciBhIHBhZ2UuCi0KLUFic3RyYWN0TWFya3VwV3JpdGVyLm1pc3NpbmctY29uc3RydWN0b3ItcGFyYW1ldGVycz1JbmNvbXBsZXRlIHBhcmFtZXRlcnMgdG8gQWJzdHJhY3RNYXJrdXBXcml0ZXIgY29uc3RydWN0b3IuCi1BYnN0cmFjdE1hcmt1cFdyaXRlci50YWctbm90LW9wZW49QSB0YWcgbXVzdCBiZSBvcGVuIGJlZm9yZSBhdHRyaWJ1dGVzIG1heSBiZSBzZXQgaW4gYW4gSU1hcmt1cFdyaXRlci4KLQotQXBwbGljYXRpb25TZXJ2bGV0LmNvdWxkLW5vdC1sb2NhdGUtZW5naW5lPUNvdWxkIG5vdCBsb2NhdGUgYW4gZW5naW5lIHRvIHNlcnZpY2UgdGhpcyByZXF1ZXN0LgotQXBwbGljYXRpb25TZXJ2bGV0LmNvdWxkLW5vdC1wYXJzZS1zcGVjPVVuYWJsZSB0byBwYXJzZSBhcHBsaWNhdGlvbiBzcGVjaWZpY2F0aW9uIHswfS4KLUFwcGxpY2F0aW9uU2VydmxldC5nZXQtYXBwLXBhdGgtbm90LW92ZXJyaWRlbj1BcHBsaWNhdGlvbiBzZXJ2bGV0IHswfSBkb2VzIG5vdCBwcm92aWRlIGFuIGltcGxlbWVudGF0aW9uIG9mIG1ldGhvZCBnZXRBcHBsaWNhdGlvblNlcnZsZXRQYXRoKCkuCi1BcHBsaWNhdGlvblNlcnZsZXQubm8tYXBwbGljYXRpb24tc3BlY2lmaWNhdGlvbj1SdW5uaW5nIGFwcGxpY2F0aW9uIHdpdGhvdXQgYW4gYXBwbGljYXRpb24gc3BlY2lmaWNhdGlvbi4KLUFwcGxpY2F0aW9uU2VydmxldC5lbmdpbmUtc3RhdGVmdWwtd2l0aG91dC1zZXNzaW9uPUVuZ2luZSB7MH0gaXMgc3RhdGVmdWwgZXZlbiB0aG91Z2ggdGhlcmUgaXMgbm8gSHR0cFNlc3Npb24uICBEaXNjYXJkaW5nIHRoZSBlbmdpbmUuIAotCi1CYXNlQ29tcG9uZW50Lm11bHRpcGxlLWNvbXBvbmVudC1yZWZlcmVuY2VzPVRlbXBsYXRlIGZvciBjb21wb25lbnQgezB9IGNvbnRhaW5zIG11bHRpcGxlIHJlZmVyZW5jZXMgdG8gZW1iZWRkZWQgY29tcG9uZW50IHsxfS4KLUJhc2VDb21wb25lbnQudW5iYWxhbmNlZC1jbG9zZS10YWdzPU1vcmUgY2xvc2luZyB0YWdzIHRoZSBvcGVuIHRhZ3MgaW4gdGVtcGxhdGUuCi1CYXNlQ29tcG9uZW50LnVuYmFsYW5jZS1vcGVuLXRhZ3M9Tm90IGFsbCB0YWdzIGNsb3NlZCBpbiB0ZW1wbGF0ZS4KLUJhc2VDb21wb25lbnQubWlzc2luZy1jb21wb25lbnQtc3BlYy1zaW5nbGU9VGVtcGxhdGUgZm9yIGNvbXBvbmVudCB7MH0gZG9lcyBub3QgcmVmZXJlbmNlIGVtYmVkZGVkIGNvbXBvbmVudDoKLUJhc2VDb21wb25lbnQubWlzc2luZy1jb21wb25lbnQtc3BlYy1tdWx0aT1UZW1wbGF0ZSBmb3IgY29tcG9uZW50IHswfSBkb2VzIG5vdCByZWZlcmVuY2UgZW1iZWRkZWQgY29tcG9uZW50czoKLUJhc2VDb21wb25lbnQuYW5kPWFuZAotQmFzZUNvbXBvbmVudC5kdXBlLXRlbXBsYXRlLWV4cHJlc3Npb249QW4gZXhwcmVzc2lvbiBmb3IgcGFyYW1ldGVyICcnezB9Jycgb2YgY29tcG9uZW50IHsxfSBpbiB0aGUgdGVtcGxhdGUgZm9yIHsyfSBjb25mbGljdHMgd2l0aCBhbiBleGlzdGluZyBiaW5kaW5nIGluIHRoZSBzcGVjaWZpY2F0aW9uLgotQmFzZUNvbXBvbmVudC50ZW1wbGF0ZS1leHByZXNzaW9uLWZvci1pbmZvcm1hbC1wYXJhbWV0ZXI9VGhlIHRlbXBsYXRlIGZvciB7Mn0gY29udGFpbnMgYW4gZXhwcmVzc2lvbiBmb3IgcGFyYW1ldGVyICcnezB9Jycgb2YgY29tcG9uZW50IHsxfSwgYnV0IHsxfSBkb2VzIG5vdCBhbGxvdyBpbmZvcm1hbCBwYXJhbWV0ZXJzLgotQmFzZUNvbXBvbmVudC50ZW1wbGF0ZS1leHByZXNzaW9uLWZvci1yZXNlcnZlZC1wYXJhbWV0ZXI9VGhlIHRlbXBsYXRlIGZvciB7Mn0gY29udGFpbnMgYW4gZXhwcmVzc2lvbiBmb3IgcGFyYW1ldGVyICcnezB9Jycgb2YgY29tcG9uZW50IHsxfSwgYnV0ICcnezB9JycgaXMgYSByZXNlcnZlZCBwYXJhbWV0ZXIgbmFtZS4KLUJhc2VDb21wb25lbnQuZHVwZS1zdHJpbmc9QSBsb2NhbGl6ZWQgc3RyaW5nIHJlZmVyZW5jZSBmb3IgcGFyYW1ldGVyICcnezB9Jycgb2YgY29tcG9uZW50IHsxfSBpbiB0aGUgdGVtcGxhdGUgZm9yIHsyfSBjb25mbGljdHMgd2l0aCBhbiBleGlzdGluZyBiaW5kaW5nIGluIHRoZSBzcGVjaWZpY2F0aW9uLgotCi1CYXNlQ29tcG9uZW50VGVtcGxhdGVMb2FkZXIuZHVwZS1jb21wb25lbnQtaWQ9Q29tcG9uZW50IHswfSAoYXQgezF9KSBjb25mbGljdHMgd2l0aCBhIHByaW9yIGRlY2xhcmF0aW9uIGluIHRoZSBzcGVjaWZpY2F0aW9uIChhdCB7Mn0pLgotQmFzZUNvbXBvbmVudFRlbXBsYXRlTG9hZGVyLmJvZHlsZXNzLWNvbXBvbmVudD1UaGlzIGNvbXBvbmVudCBtYXkgbm90IGhhdmUgYSBib2R5LgotCi1SZWRpcmVjdFNlcnZsZXQucmVkaXJlY3QtcGF0aD1SZWRpcmVjdGluZyB0byBzZXJ2bGV0IGF0IHBhdGggezB9LgotUmVkaXJlY3RTZXJ2bGV0LnJlZGlyZWN0aW5nPVJlZGlyZWN0aW5nIHNlcnZsZXQgY29udGV4dCBVUkwgdG8gezB9LgotCi1SZXNwb25zZU91dHB1dFN0cmVhbS5jb250ZW50LXR5cGUtbm90LXNldD1Db250ZW50IHR5cGUgb2YgcmVzcG9uc2UgbmV2ZXIgc2V0LgotCi1TdGFsZUxpbmtFeGNlcHRpb24uYWN0aW9uLW1pc21hdGNoPUFjdGlvbiBpZCB7MH0gbWF0Y2hlZCBjb21wb25lbnQgezF9LCBub3QgezJ9LgotU3RhbGVMaW5rRXhjZXB0aW9uLmNvbXBvbmVudC1taXNtYXRjaD1BY3Rpb24gaWQgezB9IGRvZXMgbm90IG1hdGNoIGNvbXBvbmVudCB7MX0uCi0KLVRhcGVzdHJ5LmV2ZW4tc2l6ZWQtYXJyYXk9QW4gZXZlbi1zaXplZCBhcnJheSBvZiBrZXlzIGFuZCB2YWx1ZXMgaXMgcmVxdWlyZWQuCi1UYXBlc3RyeS5taXNzaW5nLW1ldGhvZC1pbnZvY2F0aW9uPUNsYXNzIHswfSBvdmVycmlkZXMgbWV0aG9kICcnezF9JycgYnV0IGRvZXMgbm90IGludm9rZSB0aGUgc3VwZXItY2xhc3MgaW1wbGVtZW50YXRpb24uCi0KLSMgb3JnLmFwYWNoZS50YXBlc3RyeS5hc3NldAotCi1Bc3NldEV4dGVybmFsaXplci5leHRlcm5hbGl6ZS1mYWlsdXJlPUNvdWxkIG5vdCBleHRlcm5hbGl6ZSBhc3NldCB7MH0gdG8gezF9LgotQXNzZXRTZXJ2aWNlLmV4Y2VwdGlvbi1yZXBvcnQtdGl0bGU9RmFpbHVyZSB0byBleHBvcnQgYXNzZXQgezB9LgotQXNzZXRTZXJ2aWNlLmNoZWNrc3VtLWZhaWx1cmU9Q2hlY2tzdW0gezB9IGRvZXMgbm90IG1hdGNoIHRoYXQgb2YgcmVzb3VyY2UgezF9LgotQXNzZXRTZXJ2aWNlLmNoZWNrc3VtLWNvbXB1dGUtZmFpbHVyZT1GYWlsZWQgdG8gY29tcHV0ZSBjaGVja3N1bSBmb3IgcmVzb3VyY2UgezF9LgotCi1FeHRlcm5hbEFzc2V0LnJlc291cmNlLW1pc3Npbmc9Q291bGQgbm90IGFjY2VzcyBleHRlcm5hbCBhc3NldCB7MH0uCi0KLSMgb3JnLmFwYWNoZS50YXBlc3RyeS5iZWFuCi0KLUJlYW5Qcm92aWRlci5iZWFuLW5vdC1kZWZpbmVkPUNvbXBvbmVudCB7MH0gZG9lcyBub3QgZGVmaW5lIGEgYmVhbiBuYW1lIHsxfS4KLUJlYW5Qcm92aWRlci5pbnN0YW50aWF0aW9uLWVycm9yPVVuYWJsZSB0byBpbnN0YW50aWF0ZSBiZWFuICcnezB9JycgKGZvciBjb21wb25lbnQgezF9KSBhcyBjbGFzcyB7Mn06IHszfQotQWJzdHJhY3RCZWFuSW5pdGlhbGl6ZXIudW5hYmxlLXRvLXNldC1wcm9wZXJ0eT1VbmFibGUgdG8gc2V0IHByb3BlcnR5ICcnezB9Jycgb2YgezF9IHRvIHsyfS4KLQotIyBvcmcuYXBhY2hlLnRhcGVzdHJ5LmJpbmRpbmcKLQotQWJzdHJhY3RCaW5kaW5nLndyb25nLXR5cGU9UGFyYW1ldGVyIHswfSAoezF9KSBpcyBhbiBpbnN0YW5jZSBvZiB7Mn0sIHdoaWNoIGRvZXMgbm90IGluaGVyaXQgZnJvbSB7M30uCi1BYnN0cmFjdEJpbmRpbmcud3JvbmctaW50ZXJmYWNlPVBhcmFtZXRlciB7MH0gKHsxfSkgaXMgYW4gaW5zdGFuY2Ugb2YgezJ9LCB3aGljaCBkb2VzIG5vdCBpbXBsZW1lbnQgaW50ZXJmYWNlIHszfS4KLUFic3RyYWN0QmluZGluZy5yZWFkLW9ubHktYmluZGluZz1CaW5kaW5nIHZhbHVlIG1heSBub3QgYmUgdXBkYXRlZC4KLQotRXhwcmVzc2lvbkJpbmRpbmcudW5hYmxlLXRvLXJlc29sdmUtZXhwcmVzc2lvbj1VbmFibGUgdG8gcmVzb2x2ZSBleHByZXNzaW9uICcnezB9JycgZm9yIHsxfS4KLUV4cHJlc3Npb25CaW5kaW5nLnVuYWJsZS10by11cGRhdGUtZXhwcmVzc2lvbj1VbmFibGUgdG8gdXBkYXRlIGV4cHJlc3Npb24gJyd7MH0nJyBmb3IgezF9IHRvIHsyfS4KLQotTGlzdGVuZXJCaW5kaW5nLmludmFsaWQtYWNjZXNzPUluYXBwcm9wcmlhdGUgaW52b2NhdGlvbiBvZiB7MH0gb24gaW5zdGFuY2Ugb2YgTGlzdGVuZXJCaW5kaW5nLgotTGlzdGVuZXJCaW5kaW5nLmJzZi1leGNlcHRpb249VW5hYmxlIHRvIGV4ZWN1dGUgbGlzdGVuZXIgc2NyaXB0ICJ7MH0iOiB7MX0KLUxpc3RlbmVyQmluZGluZy51bmFibGUtdG8tdW5kZWNsYXJlLWJlYW49VW5hYmxlIHRvIHVuZGVjbGFyZSBiZWFuICcnezB9JycgYWZ0ZXIgZXhlY3V0aW5nICJ7MH0iLgotCi0jIG9yZy5hcGFjaGUudGFwZXN0cnkuY2FsbGJhY2sKLQotRGlyZWN0Q2FsbGJhY2sud3JvbmctdHlwZT1Db21wb25lbnQgezB9IGRvZXMgbm90IGltcGxlbWVudCB0aGUgSURpcmVjdCBpbnRlcmZhY2UuCi0KLSMgb3JnLmFwYWNoZS50YXBlc3RyeS5jb21wb25lbnQKLQotSW5zZXJ0LnVuYWJsZS10by1mb3JtYXQ9VW5hYmxlIHRvIGZvcm1hdCBvYmplY3QgezB9LgotQW55LmVsZW1lbnQtbm90LWRlZmluZWQ9VGhlIEFueSBjb21wb25lbnQgaXMgbm90IHVzZWQgaW4gYSB0ZW1wbGF0ZSBhbmQgdGhlICdlbGVtZW50JyBwcm9wZXJ0eSBpcyBub3QgYm91bmQuCi0KLSMgb3JnLmFwYWNoZS50YXBlc3RyeS5wYXJhbQotCi1QYXJhbWV0ZXJNYW5hZ2VyLm5vLWFjY2Vzc29yPUNvbXBvbmVudCB7MH0gZG9lcyBub3QgaGF2ZSBhY2Nlc3NvciBtZXRob2RzIGZvciBwcm9wZXJ0eSB7MX0uCi1QYXJhbWV0ZXJNYW5hZ2VyLnByb3BlcnR5LW5vdC1yZWFkLXdyaXRlPVByb3BlcnR5IHsxfSBvZiBjb21wb25lbnQgezB9IGlzIG5vdCByZWFkLXdyaXRlLgotUGFyYW1ldGVyTWFuYWdlci5qYXZhLXR5cGUtbm90LXNwZWNpZmllZD1ObyBKYXZhIHR5cGUgd2FzIHNwZWNpZmllZCBmb3IgcGFyYW1ldGVyIHswfSBvZiBjb21wb25lbnQgezF9LgotUGFyYW1ldGVyTWFuYWdlci50eXBlLW1pc21hdGNoPVBhcmFtZXRlciB7MH0gb2YgY29tcG9uZW50IHsxfSBpcyBkZWNsYXJlZCBhcyB7Mn0sIGJ1dCB0aGUgcHJvcGVydHkgaXMgezN9LgotUGFyYW1ldGVyTWFuYWdlci5zdGF0aWMtaW5pdGlhbGl6YXRpb24tZmFpbHVyZT1VbmFibGUgdG8gc2V0IHByb3BlcnR5IHswfSBvZiBjb21wb25lbnQgezF9IGZyb20gezJ9LgotUGFyYW1ldGVyTWFuYWdlci5pbmNvbXBhdGlibGUtZGlyZWN0aW9uLWFuZC1iaW5kaW5nPVBhcmFtZXRlciB7MH0gb2YgY29tcG9uZW50IHsxfSBpcyBkaXJlY3Rpb24gezJ9IHdoaWNoIGlzIGluY29tcGF0aWJsZSB3aXRoIHszfS4KLQotIyBvcmcuYXBhY2hlLnRhcGVzdHJ5LmVuZ2luZQotCi1BYnN0cmFjdEVuZ2luZS51bmFibGUtdG8tcHJvY2Vzcy1jbGllbnQtcmVxdWVzdD1VbmFibGUgdG8gcHJvY2VzcyBjbGllbnQgcmVxdWVzdC4KLUFic3RyYWN0RW5naW5lLnVuYWJsZS10by1wcmVzZW50LWV4Y2VwdGlvbi1wYWdlPVVuYWJsZSB0byBwcmVzZW50IGV4Y2VwdGlvbiBwYWdlLgotQWJzdHJhY3RFbmdpbmUudW5rbm93bi1zcGVjaWZpY2F0aW9uPTxVbmtub3duIHNwZWNpZmljYXRpb24+Ci1BYnN0cmFjdEVuZ2luZS51bmtub3duLXNlcnZpY2U9RW5naW5lIGRvZXMgbm90IGltcGxlbWVudCBhIHNlcnZpY2UgbmFtZWQgJyd7MH0nJy4KLUFic3RyYWN0RW5naW5lLnVuYWJsZS10by1iZWdpbi1yZXF1ZXN0PVRhcGVzdHJ5IHVuYWJsZSB0byBiZWdpbiBwcm9jZXNzaW5nIHJlcXVlc3QuCi1BYnN0cmFjdEVuZ2luZS51bmFibGUtdG8tY2xlYW51cC1wYWdlPVVuYWJsZSB0byBjbGVhbnVwIHBhZ2UgezB9LgotQWJzdHJhY3RFbmdpbmUudW5hYmxlLXRvLWluc3RhbnRpYXRlLXZpc2l0PVVuYWJsZSB0byBpbnN0YW50aWF0ZSB2aXNpdCBvYmplY3QgZnJvbSBjbGFzcyB7MH0uCi1BYnN0cmFjdEVuZ2luZS51bmFibGUtdG8taW5zdGFudGlhdGUtZ2xvYmFsPVVuYWJsZSB0byBpbnN0YW50aWF0ZSBnbG9iYWwgb2JqZWN0IGZyb20gY2xhc3MgezB9LgotQWJzdHJhY3RFbmdpbmUudW5hYmxlLXRvLXJlZGlyZWN0PVVuYWJsZSB0byByZWRpcmVjdCB0byB7MH0uCi1BYnN0cmFjdEVuZ2luZS5zZXJ2aWNlLW5hbWUtbWlzbWF0Y2g9Q2xhc3MgezF9IGlzIHJlZ2lzdGVyZWQgYXMgc2VydmljZSB7MH0gYnV0IHByb3ZpZGVzIHNlcnZpY2UgezJ9IGluc3RlYWQuCi1BYnN0cmFjdEVuZ2luZS51bmFibGUtdG8taW5zdGFudGlhdGUtc2VydmljZT1VbmFibGUgdG8gaW5zdGFudGlhdGUgY2xhc3MgezF9IGFzIHNlcnZpY2UgezB9LgotQWJzdHJhY3RFbmdpbmUudW5hYmxlLXRvLWZpbmQtZGlzcGF0Y2hlcj1VbmFibGUgdG8gZmluZCBhIHJlcXVlc3QgZGlzcGF0Y2hlciBmb3IgbG9jYWwgcmVzb3VyY2UgJyd7MH0nJy4KLUFic3RyYWN0RW5naW5lLnVuYWJsZS10by1mb3J3YXJkPVVuYWJsZSB0byBmb3J3YXJkIHRvIGxvY2FsIHJlc291cmNlICcnezB9JycuCi1BYnN0cmFjdEVuZ2luZS51bmFibGUtdG8tY3JlYXRlLWNsZWFudXAtY29udGV4dD1VbmFibGUgdG8gY3JlYXRlIGFuIGluc3RhbmNlIG9mIFJlcXVlc3RDb250ZXh0IHRvIHByb2Nlc3MgZW5kLW9mLXNlc3Npb24gcGFnZSBjbGVhbnVwcy4KLUFic3RyYWN0RW5naW5lLmV4Y2VwdGlvbi1kdXJpbmctY2xlYW51cD1FeGNlcHRpb24gZHVyaW5nIHBvc3QtcmVxdWVzdCBjbGVhbnVwLgotQWJzdHJhY3RFbmdpbmUuZXhjZXB0aW9uLWR1cmluZy1jYWNoZS1jbGVhcj1FeGNlcHRpb24gd2hpbGUgY2xlYXJpbmcgY2FjaGVzIGFmdGVyIHJlcXVlc3QuCi1BYnN0cmFjdEVuZ2luZS52YWxpZGF0ZS1jeWNsZT1BIHZhbGlkYXRlIGN5Y2xlIGR1cmluZyBwYWdlIGFjdGl2YXRpb24gd2FzIGRldGVjdGVkOiB7MH0uCi0KLUFjdGlvblNlcnZpY2UuY29udGV4dC1wYXJhbWV0ZXJzPVNlcnZpY2UgYWN0aW9uIHJlcXVpcmVzIGVpdGhlciB0aHJlZSBvciBmb3VyIHNlcnZpY2UgY29udGVjdCBwYXJhbWV0ZXJzLgotQWN0aW9uU2VydmljZS5hY3Rpb24tY29tcG9uZW50LXdyb25nLXR5cGU9Q29tcG9uZW50IHswfSBkb2VzIG5vdCBpbXBsZW1lbnQgdGhlIElBY3Rpb24gaW50ZXJmYWNlLgotCi1EZWZhdWx0U2NyaXB0U291cmNlLnVuYWJsZS10by1wYXJzZS1zY3JpcHQ9VW5hYmxlIHRvIHBhcnNlIHNjcmlwdCB7MH0uCi0KLURlZmF1bHRTcGVjaWZpY2F0aW9uU291cmNlLm5vLW1hdGNoLWZvci1hbGlhcz1Db3VsZCBub3QgZmluZCBhIGNvbXBvbmVudCBtYXRjaGluZyBhbGlhcyB7MH0uCi1EZWZhdWx0U3BlY2lmaWNhdGlvblNvdXJjZS51bmFibGUtdG8tbG9jYXRlLXNwZWNpZmljYXRpb249Q291bGQgbm90IGxvY2F0ZSByZXNvdXJjZSB7MH0gaW4gdGhlIGNsYXNzcGF0aC4KLURlZmF1bHRTcGVjaWZpY2F0aW9uU291cmNlLnVuYWJsZS10by1vcGVuLXNwZWNpZmljYXRpb249Q291bGQgbm90IG9wZW4gc3BlY2lmaWNhdGlvbiB7MH0uCi1EZWZhdWx0U3BlY2lmaWNhdGlvblNvdXJjZS51bmFibGUtdG8tcGFyc2Utc3BlY2lmaWNhdGlvbj1Db3VsZCBub3QgcGFyc2Ugc3BlY2lmaWNhdGlvbiB7MH0uCi0KLURlZmF1bHRUZW1wbGF0ZVNvdXJjZS5uby10ZW1wbGF0ZS1mb3ItY29tcG9uZW50PUNvdWxkIG5vdCBmaW5kIHRlbXBsYXRlIGZvciBjb21wb25lbnQgezB9IGluIGxvY2FsZSB7MX0uCi1EZWZhdWx0VGVtcGxhdGVTb3VyY2Uubm8tdGVtcGxhdGUtZm9yLXBhZ2U9Q291bGQgbm90IGZpbmQgdGVtcGxhdGUgZm9yIHBhZ2UgezB9IGluIGxvY2FsZSB7MX0uCi1EZWZhdWx0VGVtcGxhdGVTb3VyY2UudW5hYmxlLXRvLXBhcnNlLXRlbXBsYXRlPUNvdWxkIG5vdCBwYXJzZSB0ZW1wbGF0ZSB7MH0uCi1EZWZhdWx0VGVtcGxhdGVTb3VyY2UudW5hYmxlLXRvLXJlYWQtdGVtcGxhdGU9Q291bGQgbm90IHJlYWQgdGVtcGxhdGUgezB9LgotCi1EaXJlY3RTZXJ2aWNlLmNvbnRleHQtcGFyYW1ldGVycz1TZXJ2aWNlIGRpcmVjdCByZXF1aXJlcyBlaXRoZXIgdGhyZWUgb3IgZm91ciBzZXJ2aWNlIGNvbnRleHQgcGFyYW1ldGVycy4KLURpcmVjdFNlcnZpY2UuY29tcG9uZW50LXdyb25nLXR5cGU9Q29tcG9uZW50IHswfSBkb2VzIG5vdCBpbXBsZW1lbnQgdGhlIElEaXJlY3QgaW50ZXJmYWNlLgotRGlyZWN0U2VydmljZS5zdGFsZS1zZXNzaW9uLWV4Y2VwdGlvbj1Db21wb25lbnQgezB9IGlzIHN0YXRlZnVsLCBidXQgdGhlIEh0dHBTZXNzaW9uIGhhcyBleHBpcmVkIChvciBoYXMgbm90IHlldCBiZWVuIGNyZWF0ZWQpLgotCi1FbmdpbmVTZXJ2aWNlTGluay51bmtub3duLXBhcmFtZXRlci1uYW1lPVVua25vd24gcGFyYW1ldGVyIG5hbWUgJyd7MH0nJy4KLQotTmFtZXNwYWNlLm5vLXN1Y2gtcGFnZT1QYWdlICcnezB9Jycgbm90IGZvdW5kIGluIHsxfS4KLU5hbWVzcGFjZS5uby1zdWNoLWNvbXBvbmVudC10eXBlPUNvbXBvbmVudCAnJ3swfScnIG5vdCBmb3VuZCBpbiB7MX0uCi1OYW1lc3BhY2UuYXBwbGljYXRpb24tbmFtZXNwYWNlPWFwcGxpY2F0aW9uIG5hbWVzcGFjZQotTmFtZXNwYWNlLmZyYW1ld29yay1uYW1lc3BhY2U9ZnJhbWV3b3JrIG5hbWVzcGFjZQotTmFtZXNwYWNlLm5lc3RlZC1uYW1lc3BhY2U9bmFtZXNwYWNlICcnezB9JycKLU5hbWVzcGFjZS5saWJyYXJ5LWlkLW5vdC1mb3VuZD1MaWJyYXJ5ICcnezB9Jycgbm90IGZvdW5kIGluIHsxfS4KLQotUmVxdWVzdEN5Y2xlLmludmFsaWQtbnVsbC1uYW1lPVBhcmFtZXRlciBuYW1lIG1heSBub3QgYmUgbnVsbCBpbiBSZXF1ZXN0Q3ljbGUuZ2V0UGFnZShTdHJpbmcpLgotUmVxdWVzdEN5Y2xlLmZvcm0tcmV3aW5kLWZhaWx1cmU9RmFpbHVyZSB0byByZXdpbmQgZm9ybSB7MH0uCi0KLVJlc291cmNlUmVzb2x2ZXIudW5hYmxlLXRvLWxvYWQtY2xhc3M9Q291bGQgbm90IGxvYWQgY2xhc3MgezB9IGZyb20gezF9OiB7Mn0KLQotVGFnU3VwcG9ydFNlcnZpY2Uuc2VydmljZS1vbmx5PVRoZSB0YWdzdXBwb3J0IHNlcnZpY2UgZG9lcyBub3Qgc3VwcG9ydCB0YWcgZ2VuZXJhdGlvbi4KLVRhZ1N1cHBvcnRTZXJ2aWNlLm51bGwtYXR0cmlidXRlPVJlcXVlc3QgYXR0cmlidXRlICcnezB9JycgaXMgcmVxdWlyZWQgYnkgdGhlIHRhZ3N1cHBvcnQgc2VydmljZSwgYnV0IHRoZSB2YWx1ZSBpcyBudWxsLgotVGFnU3VwcG9ydFNlcnZpY2UuYXR0cmlidXRlLW5vdC1zdHJpbmc9UmVxdWVzdCBhdHRyaWJ1dGUgJyd7MH0nJyBpcyBhbiBpbnN0YW5jZSBvZiB7MX0sIG5vdCBhIHN0cmluZy4KLVRhZ1N1cHBvcnRTZXJ2aWNlLmF0dHJpYnV0ZS1ub3QtYXJyYXk9UmVxdWVzdCBhdHRyaWJ1dGUgJyd7MH0nJyBpcyBhbiBpbnN0YW5jZSBvZiB7MH0sIG5vdCBhbiBvYmplY3QgYXJyYXkuCi1CYXNlRW5naW5lLnJlY29yZGVyLWhhcy11bmNvbW1pdGVkLWNoYW5nZXM9Q291bGQgbm90IGZvcmdldCBjaGFuZ2VzIHRvIHBhZ2UgezB9IGJlY2F1c2UgdGhlIHBhZ2UncyByZWNvcmRlciBoYXMgdW5jb21taXR0ZWQgY2hhbmdlcy4KLUJhc2VFbmdpbmUuZHVwbGljYXRlLXBhZ2UtcmVjb3JkZXI9Q291bGQgbm90IGNyZWF0ZSBhIHNlY29uZCBwYWdlIHJlY29yZGVyIGZvciBwYWdlIHswfS4KLQotRXh0ZXJuYWxTZXJ2aWNlLnBhZ2Utbm90LWNvbXBhdGlibGU9UGFnZSB7MH0gZG9lcyBub3QgaW1wbGVtZW50IHRoZSBJRXh0ZXJuYWxQYWdlIGludGVyZmFjZS4KLQotIyBvcmcuYXBhY2hlLnRhcGVzdHJ5LmVuaGFuY2UKLQotQ29tcG9uZW50Q2xhc3NGYWN0b3J5LmJhZC1wcm9wZXJ0eS10eXBlPVVuYWJsZSB0byBjb252ZXJ0ICcnezB9JycgdG8gYSBwcm9wZXJ0eSB0eXBlLgotQ29tcG9uZW50Q2xhc3NGYWN0b3J5LnByb3BlcnR5LXR5cGUtbWlzbWF0Y2g9VW5hYmxlIHRvIGVuaGFuY2UgY2xhc3MgezB9IGJlY2F1c2UgaXQgY29udGFpbnMgcHJvcGVydHkgJyd7MX0nJyBvZiB0eXBlIHsyfSwgbm90IHRoZSBleHBlY3RlZCB0eXBlIHszfS4KLUNvbXBvbmVudENsYXNzRmFjdG9yeS5ub24tYWJzdHJhY3QtcmVhZD1VbmFibGUgdG8gZW5oYW5jZSBjbGFzcyB7MH0gYmVjYXVzZSBpdCBpbXBsZW1lbnRzIGEgbm9uLWFic3RyYWN0IHJlYWQgbWV0aG9kIGZvciBwcm9wZXJ0eSAnJ3sxfScnLgotQ29tcG9uZW50Q2xhc3NGYWN0b3J5Lm5vbi1hYnN0cmFjdC13cml0ZT1VbmFibGUgdG8gZW5oYW5jZSBjbGFzcyB7MH0gYmVjYXVzZSBpdCBpbXBsZW1lbnRzIGEgbm9uLWFic3RyYWN0IHdyaXRlIG1ldGhvZCBmb3IgcHJvcGVydHkgJyd7MX0nJy4KLUNvbXBvbmVudENsYXNzRmFjdG9yeS51bmFibGUtdG8taW50cm9zcGVjdC1jbGFzcz1VbmFibGUgdG8gaW50cm9zcGVjdCBwcm9wZXJ0aWVzIG9mIGNsYXNzIHswfS4KLUNvbXBvbmVudENsYXNzRmFjdG9yeS5hdXRvLW11c3QtYmUtcmVxdWlyZWQ9UGFyYW1ldGVyICcnezB9JycgbXVzdCBiZSByZXF1aXJlZCBvciBoYXZlIGEgZGVmYXVsdCB2YWx1ZSBhcyBpdCB1c2VzIGRpcmVjdGlvbiAnJ2F1dG8nJy4KLUNvbXBvbmVudENsYXNzRmFjdG9yeS5jb2RlLWdlbmVyYXRpb24tZXJyb3I9QSBjb2RlIGdlbmVyYXRpb24gZXJyb3Igb2NjdXJlZCB3aGlsZSBlbmhhbmNpbmcgY2xhc3MgezB9LgotCi0KLUVuaGFuY2VkQ2xhc3NMb2FkZXIudW5hYmxlLXRvLWRlZmluZS1jbGFzcz1VbmFibGUgdG8gZGVmaW5lIGNsYXNzIHswfTogezF9Ci0KLU1ldGhvZEZhYnJpY2F0b3Iubm8tbW9yZS1hcmd1bWVudHM9Tm8gbW9yZSBhcmd1bWVudHMgbWF5IGJlIGFkZGVkIG9uY2UgYW55IGxvY2FsIHZhcmlhYmxlcyBhcmUgYWRkZWQuCi0KLURlZmF1bHRDb21wb25lbnRDbGFzc0VuaGFuY2VyLm5vLWltcGwtZm9yLWFic3RyYWN0LW1ldGhvZD1NZXRob2QgJyd7MH0nJyAoZGVjbGFyZWQgaW4gezF9KSBoYXMgbm8gaW1wbGVtZW50YXRpb24gaW4gY2xhc3MgezJ9IChvciBlbmhhbmNlZCBzdWJjbGFzcyB7M30pLgotCi0KLSMgb3JnLmFwYWNoZS50YXBlc3RyeS5ldmVudAotCi1PYnNlcnZlZENoYW5nZUV2ZW50Lm51bGwtcHJvcGVydHktbmFtZT1NdXN0IHNwZWNpZnkgYSBub24tbnVsbCBwcm9wZXJ0eU5hbWUgd2hlbiBjcmVhdGluZyBPYnNlcnZlZENoYW5nZUV2ZW50IGZvciB7MH0uCi1PYnNlcnZlZENoYW5nZUV2ZW50Lm11c3QtYmUtc2VyaWFsaXphYmxlPU11c3Qgc3BlY2lmeSBhIHNlcmlhbGl6YWJsZSBvYmplY3QgYXMgdGhlIG5ldyB2YWx1ZSBvZiBwcm9wZXJ0eSB3aGVuIGNyZWF0aW5nIGFuIE9ic2VydmVkQ2hhbmdlRXZlbnQuCi0KLSMgb3JnLmFwYWNoZS50YXBlc3RyeS5mb3JtCi0KLUFic3RyYWN0Rm9ybUNvbXBvbmVudC5tdXN0LWJlLWNvbnRhaW5lZC1ieS1mb3JtPVRoaXMgY29tcG9uZW50IG11c3QgYmUgY29udGFpbmVkIHdpdGhpbiBhIEZvcm0uCi0KLUZvcm0uZm9ybXMtbWF5LW5vdC1uZXN0PUZvcm1zIG1heSBub3QgYmUgbmVzdGVkLgotRm9ybS5uZWVkcy1ib2R5LWZvci1ldmVudC1oYW5kbGVycz1BIEZvcm0gd2l0aCBldmVudCBoYW5kbGVycyBtdXN0IGJlIGVuY2xvc2VkIGJ5IGEgQm9keSBjb21wb25lbnQuCi1Gb3JtLnRvby1tYW55LWlkcz1SZXdpbmQgb2YgZm9ybSB7MH0gZXhwZWN0ZWQgb25seSB7MX0gZm9ybSBlbGVtZW50cywgYnV0IGFuIGFkZGl0aW9uYWwgaWQgd2FzIHJlcXVlc3RlZCBieSBjb21wb25lbnQgezJ9LgotRm9ybS50b28tZmV3LWlkcz1SZXdpbmQgb2YgZm9ybSB7MH0gZXhwZWN0ZWQgezF9IG1vcmUgZm9ybSBlbGVtZW50cywgc3RhcnRpbmcgd2l0aCBpZCAnJ3syfScnLgotRm9ybS5pZC1taXNtYXRjaD1SZXdpbmQgb2YgZm9ybSB7MH0gZXhwZWN0ZWQgYWxsb2NhdGVkIGlkICN7MX0gdG8gYmUgJyd7Mn0nJywgYnV0IHdhcyAnJ3szfScnIChyZXF1ZXN0ZWQgYnkgY29tcG9uZW50IHs0fSkuCi1Gb3JtLmVuY29kaW5nLXR5cGUtY29udGVudGlvbj1Db21wb25lbnRzIHdpdGhpbiBGb3JtIHswfSBoYXZlIHJlcXVlc3RlZCBjb25mbGljdGluZyBlbmNvZGluZyB0eXBlcyAnJ3sxfScnIGFuZCAnJ3syfScnLgotCi1MaXN0RWRpdC51bmFibGUtdG8tY29udmVydC12YWx1ZT1VbmFibGUgdG8gY29udmVydCB7MH0gdG8gYW4gZXh0ZXJuYWwgc3RyaW5nIGluIExpc3RFZGl0IGNvbXBvbmVudC4KLUxpc3RFZGl0LnVuYWJsZS10by1jb252ZXJ0LXN0cmluZz1VbmFibGUgdG8gY29udmVydCB7MH0gYmFjayBpbnRvIGFuIG9iamVjdCBpbiBMaXN0RWRpdCBjb21wb25lbnQuCi0KLUZvcm1Db25kaXRpb25hbC51bmFibGUtdG8tY29udmVydC12YWx1ZT1VbmFibGUgdG8gY29udmVydCB7MH0gdG8gYW4gZXh0ZXJuYWwgc3RyaW5nIGluIEZvcm1Db25kaXRpb25hbCBjb21wb25lbnQuCi1Gb3JtQ29uZGl0aW9uYWwudW5hYmxlLXRvLWNvbnZlcnQtc3RyaW5nPVVuYWJsZSB0byBjb252ZXJ0IHswfSBiYWNrIGludG8gYW4gb2JqZWN0IGluIEZvcm1Db25kaXRpb25hbCBjb21wb25lbnQuCi0KLU9wdGlvbi5tdXN0LWJlLWNvbnRhaW5lZC1ieS1zZWxlY3Q9T3B0aW9uIGNvbXBvbmVudCBtdXN0IGJlIGNvbnRhaW5lZCB3aXRoaW4gYSBTZWxlY3QuCi0KLVJhZGlvLm11c3QtYmUtY29udGFpbmVkLWJ5LWdyb3VwPVJhZGlvIGNvbXBvbmVudCBtdXN0IGJlIGNvbnRhaW5lZCB3aXRoaW4gYSBSYWRpb0dyb3VwLgotCi1SYWRpb0dyb3VwLm1heS1ub3QtbmVzdD1SYWRpb0dyb3VwIGNvbXBvbmVudHMgbWF5IG5vdCBiZSBuZXN0ZWQuCi0KLVNlbGVjdC5tYXktbm90LW5lc3Q9U2VsZWN0IGNvbXBvbmVudHMgbWF5IG5vdCBiZSBuZXN0ZWQuCi0KLUxpbmtTdWJtaXQubWF5LW5vdC1uZXN0PUxpbmtTdWJtaXQgY29tcG9uZW50cyBtYXkgbm90IGJlIG5lc3RlZC4KLQotIyBvcmcuYXBhY2hlLnRhcGVzdHJ5Lmh0bWwKLQotQm9keS5tYXktbm90LW5lc3Q9Qm9keSBjb21wb25lbnRzIG1heSBub3QgYmUgbmVzdGVkLgotQm9keS5pbmNsdWRlLWNsYXNzcGF0aC1zY3JpcHQtb25seT1VbmFibGUgdG8gaW5jbHVkZSBleHRlcm5hbCBzY3JpcHQgezB9OiBvbmx5IGNsYXNzcGF0aCByZXNvdXJjZXMgYXJlIHN1cHBvcnRlZC4KLQotSW5zZXJ0VGV4dC5jb252ZXJzaW9uLWVycm9yPUVycm9yIGNvbnZlcnRpbmcgdGV4dCB0byBsaW5lcyAoZm9yIEluc2VydFRleHQgY29tcG9uZW50KS4KLQotUm9sbG92ZXIubXVzdC1iZS1jb250YWluZWQtYnktYm9keT1Sb2xsb3ZlciBjb21wb25lbnRzIG11c3QgYmUgY29udGFpbmVkIHdpdGhpbiBhIEJvZHkgY29tcG9uZW50LgotUm9sbG92ZXIubXVzdC1iZS1jb250YWluZWQtYnktbGluaz1Sb2xsb3ZlciBjb21wb25lbnRzIG11c3QgYmUgY29udGFpbmVkIHdpdGhpbiBhbiBJTGlua0NvbXBvbmVudC4KLQotU2NyaXB0Lm11c3QtYmUtY29udGFpbmVkLWJ5LWJvZHk9U2NyaXB0IGNvbXBvbmVudHMgbXVzdCBiZSBjb250YWluZWQgd2l0aGluIGEgQm9keSBjb21wb25lbnQuCi0KLSMgb3JnLmFwYWNoZS50YXBlc3RyeS5jb250cmliLmluc3BlY3RvcgotCi1TaG93RW5naW5lLmNvdWxkLW5vdC1zZXJpYWxpemU9Q291bGQgbm90IHNlcmlhbGl6ZSB0aGUgYXBwbGljYXRpb24gZW5naW5lLgotCi1JbnNwZWN0b3JCdXR0b24ubXVzdC1iZS1jb250YWluZWQtYnktYm9keT1JbnNwZWN0b3JCdXR0b24gY29tcG9uZW50IG11c3QgYmUgY29udGFpbmVkIHdpdGhpbiBhIEJvZHkgY29tcG9uZW50LgotCi0jIG9yZy5hcGFjaGUudGFwZXN0cnkuanNwCi0KLVVSTFJldHJpZXZlci51bmFibGUtdG8tZmluZC1kaXNwYXRjaGVyPVVuYWJsZSB0byBmaW5kIHJlcXVlc3QgZGlzcGF0Y2hlciBmb3Igc2VydmxldCBhdCAnJ3swfScnLgotVVJMUmV0cmlldmVyLmlvLWV4Y2VwdGlvbj1JL08gZXhjZXB0aW9uIG1lc3NhZ2luZyBzZXJ2bGV0IHswfTogezF9Ci1VUkxSZXRyaWV2ZXIuc2VydmxldC1leGNlcHRpb249U2VydmxldCBleGNlcHRpb24gbWVzc2FnaW5nIHNlcnZsZXQgezB9OiB7MX0KLQotQWJzdHJhY3RMaW5rVGFnLmlvLWV4Y2VwdGlvbj1JL08gZXhjZXB0aW9uIHdyaXRpbmcgb3V0cHV0OiB7MX0KLQotQWJzdHJhY3RUYXBlc3RyeVRhZy51bmFibGUtdG8tZXZhbHVhdGUtZXhwcmVzc2lvbj1VbmFibGUgdG8gZXZhbHVhdGUgT0dOTCBleHByZXNzaW9uICcnezB9Jyc6IHsxfQotCi0jIG9yZy5hcGFjaGUudGFwZXN0cnkubGluawotCi1HZXN0dXJlTGluay5taXNzaW5nLXNlcnZpY2U9Tm8gZW5naW5lIHNlcnZpY2UgbmFtZSB7MH0uCi0KLUFic3RyYWN0TGlua0NvbXBvbmVudC5uby1uZXN0aW5nPUlMaW5rQ29tcG9uZW50cyBtYXkgbm90IGJlIG5lc3RlZC4KLUFic3RyYWN0TGlua0NvbXBvbmVudC5ldmVudHMtbmVlZC1ib2R5PUEgbGluayBjb21wb25lbnQgd2l0aCBtdWx0aXBsZSBmdW5jdGlvbnMgZm9yIGEgc2luZ2xlIGV2ZW50IHR5cGUgbXVzdCBiZSBjb250YWluZWQgd2l0aGluIGEgQm9keS4KLQotIyBvcmcuYXBhY2hlLnRhcGVzdHJ5Lmxpc3RlbmVyCi0KLUxpc3RlbmVyTWFwLm9iamVjdC1taXNzaW5nLW1ldGhvZD1PYmplY3QgezB9IGRvZXMgbm90IGltcGxlbWVudCBhIGxpc3RlbmVyIG1ldGhvZCBuYW1lZCAnJ3sxfScnLgotTGlzdGVuZXJNYXAudW5hYmxlLXRvLWludm9rZS1tZXRob2Q9VW5hYmxlIHRvIGludm9rZSBtZXRob2QgezB9IG9uIHsxfTogezJ9Ci0KLSMgb3JnLmFwYWNoZS50YXBlc3RyeS5tdWx0aXBhcnQKLQotVXBsb2FkUGFydC51bmFibGUtdG8tb3Blbi1jb250ZW50LWZpbGU9VW5hYmxlIHRvIG9wZW4gdXBsb2FkZWQgZmlsZSAnJ3swfScnLgotVXBsb2FkUGFydC53cml0ZS1mYWlsdXJlPUVycm9yIHdyaXRpbmcgdXBsb2FkZWQgY29udGVudCB0byB7MH06IHsxfQotCi1EZWZhdWx0TXVsdGlwYXJ0RGVjb2Rlci51bmFibGUtdG8tZGVjb2RlPVVuYWJsZSB0byBkZWNvZGUgcmVxdWVzdDogezB9Ci1EZWZhdWx0TXVsdGlwYXJ0RGVjb2Rlci5lbmNvZGluZy1ub3Qtc2V0PU5vIGVuY29kaW5nIGhhcyBiZWVuIHNldCBmb3IgdGhpcyByZXF1ZXN0LgotCi0jIG9yZy5hcGFjaGUudGFwZXN0cnkucGFnZWxvYWQKLQotUGFnZUxvYWRlci5mb3JtYWwtcGFyYW1ldGVycy1vbmx5PUNvbXBvbmVudCB7MH0gYWxsb3dzIG9ubHkgZm9ybWFsIHBhcmFtZXRlcnMsIGJpbmRpbmcgezF9IGlzIG5vdCBhbGxvd2VkLgotUGFnZUxvYWRlci5yZXF1aXJlZC1wYXJhbWV0ZXItbm90LWJvdW5kPVJlcXVpcmVkIHBhcmFtZXRlciB7MH0gb2YgY29tcG9uZW50IHsxfSBpcyBub3QgYm91bmQuCi1QYWdlTG9hZGVyLnVuYWJsZS10by1sb2FkLXNwZWNpZmljYXRpb249VW5hYmxlIHRvIGxvYWQgY29tcG9uZW50IHNwZWNpZmljYXRpb24uCi1QYWdlTG9hZGVyLmNsYXNzLW5vdC1jb21wb25lbnQ9Q2xhc3MgezB9IGRvZXMgbm90IGltcGxlbWVudCB0aGUgSUNvbXBvbmVudCBpbnRlcmZhY2UuCi1QYWdlTG9hZGVyLnVuYWJsZS10by1pbnN0YW50aWF0ZT1VbmFibGUgdG8gaW5zdGFudGlhdGUgYW4gaW5zdGFuY2Ugb2YgY2xhc3MgezB9LgotUGFnZUxvYWRlci5wYWdlLW5vdC1hbGxvd2VkPUNvbXBvbmVudCB7MH0gbWF5IG5vdCBpbXBsZW1lbnQgdGhlIElQYWdlIGludGVyZmFjZS4KLVBhZ2VMb2FkZXIuY2xhc3Mtbm90LXBhZ2U9Q2xhc3MgezB9IGRvZXMgbm90IGltcGxlbWVudCB0aGUgSVBhZ2UgaW50ZXJmYWNlLgotUGFnZUxvYWRlci51bmFibGUtdG8taW5zdGFudGlhdGUtY29tcG9uZW50PVVuYWJsZSB0byBpbnN0YW50aWF0ZSBjb21wb25lbnQgezB9OiB7MX0KLVBhZ2VMb2FkZXIubWlzc2luZy1hc3NldD1VbmFibGUgdG8gbG9jYXRlIGFzc2V0ICcnezB9Jycgb2YgY29tcG9uZW50IHsxfSBhcyB7Mn0uCi1QYWdlTG9hZGVyLnVuYWJsZS10by1pbml0aWFsaXplLXByb3BlcnR5PVVuYWJsZSB0byBpbml0aWFsaXplIHByb3BlcnR5IHswfSBvZiB7MX06IHsyfQotUGFnZUxvYWRlci5pbmhlcml0LWluZm9ybWFsLWludmFsaWQtY29tcG9uZW50LWZvcm1hbC1vbmx5PUNvbXBvbmVudCB7MH0gYWxsb3dzIG9ubHkgZm9ybWFsIHBhcmFtZXRlcnMsIGJ1dCBoYXMgaW5oZXJpdC1pbmZvcm1hbC1wYXJhbWV0ZXJzIHNldC4KLVBhZ2VMb2FkZXIuaW5oZXJpdC1pbmZvcm1hbC1pbnZhbGlkLWNvbnRhaW5lci1mb3JtYWwtb25seT1Db21wb25lbnQgezB9IGFsbG93cyBvbmx5IGZvcm1hbCBwYXJhbWV0ZXJzLCBidXQgaXQgY29udGFpbnMgY29tcG9uZW50IHsxfSB0aGF0IGhhcyBpbmhlcml0LWluZm9ybWFsLXBhcmFtZXRlcnMgc2V0LgotCi1Fc3RhYmxpc2hEZWZhdWx0UGFyYW1ldGVyVmFsdWVzVmlzaXRvci5wYXJhbWV0ZXItbXVzdC1oYXZlLW5vLWRlZmF1bHQtdmFsdWU9UGFyYW1ldGVyIHsxfSBvZiBjb21wb25lbnQgezB9IGlzIHJlcXVpcmVkIGFuZCBtdXN0IG5vdCBoYXZlIGEgZGVmYXVsdCB2YWx1ZS4KLQotIyBvcmcuYXBhY2hlLnRhcGVzdHJ5LnBhcnNlCi0KLVRleHRUb2tlbi5lcnJvci10cmltbWluZz17MH06IEZhaWx1cmUgdHJpbW1pbmcgbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZS4KLQotU3BlY2lmaWNhdGlvblBhcnNlci5mYWlsLWNvbnZlcnQtYm9vbGVhbj1Db3VsZCBub3QgY29udmVydCAnJ3swfScnIHRvIGJvb2xlYW4uCi1TcGVjaWZpY2F0aW9uUGFyc2VyLmZhaWwtY29udmVydC1pbnQ9Q291bGQgbm90IGNvbnZlcnQgJyd7MH0nJyB0byBpbnRlZ2VyLgotU3BlY2lmaWNhdGlvblBhcnNlci5mYWlsLWNvbnZlcnQtZG91YmxlPUNvdWxkIG5vdCBjb252ZXJ0ICcnezB9JycgdG8gZG91YmxlLgotU3BlY2lmaWNhdGlvblBhcnNlci5mYWlsLWNvbnZlcnQtbG9uZz1Db3VsZCBub3QgY29udmVydCAnJ3swfScnIHRvIGxvbmcuCi1TcGVjaWZpY2F0aW9uUGFyc2VyLnVuZXhwZWN0ZWQtY29tcG9uZW50LXB1YmxpYy1pZD1VbmV4cGVjdGVkIGNvbXBvbmVudCBzcGVjaWZpY2F0aW9uIHdpdGggcHVibGljIGlkZW50aWZpZXIgezB9LgotU3BlY2lmaWNhdGlvblBhcnNlci51bmV4cGVjdGVkLWFwcGxpY2F0aW9uLXB1YmxpYy1pZD1VbmV4cGVjdGVkIGFwcGxpY2F0aW9uIHNwZWNpZmljYXRpb24gd2l0aCBwdWJsaWMgaWRlbnRpZmllciB7MH0uCi1TcGVjaWZpY2F0aW9uUGFyc2VyLmJvdGgtdHlwZS1hbmQtY29weS1vZj1Db250YWluZWQgY29tcG9uZW50IHswfSBjb250YWlucyBib3RoIHR5cGUgYW5kIGNvcHktb2YgYXR0cmlidXRlcy4KLVNwZWNpZmljYXRpb25QYXJzZXIubWlzc2luZy10eXBlLW9yLWNvcHktb2Y9Q29udGFpbmVkIGNvbXBvbmVudCB7MH0gZG9lcyBub3Qgc3BlY2lmeSBhdHRyaWJ1dGUgdHlwZSBvciBjb3B5LW9mLgotU3BlY2lmaWNhdGlvblBhcnNlci51bmFibGUtdG8tY29weT1VbmFibGUgdG8gY29weSBjb21wb25lbnQgezB9LCB3aGljaCBkb2VzIG5vdCBleGlzdC4KLVNwZWNpZmljYXRpb25QYXJzZXIuaW52YWxpZC1wYXJhbWV0ZXItbmFtZT1QYXJhbWV0ZXIgJyd7MH0nJyBpcyBhbiBpbnZhbGlkIG5hbWUuICBQYXJhbWV0ZXIgbmFtZXMgc2hvdWxkIGJlIHZhbGlkIEphdmEgaWRlbnRpZmllcnMuCi1TcGVjaWZpY2F0aW9uUGFyc2VyLmludmFsaWQtcGFnZS1uYW1lPScnezB9JycgaXMgbm90IGEgdmFsaWQgcGFnZSBuYW1lLiAgUGFnZSBuYW1lcyBtdXN0IHN0YXJ0IHdpdGggYSBsZXR0ZXIgYW5kIGNvbnNpc3Qgb25seSBvZiBsZXR0ZXJzLCBudW1iZXJzLCBwZXJpb2QsIGRhc2ggYW5kIHVuZGVyc2NvcmUuCi1TcGVjaWZpY2F0aW9uUGFyc2VyLmludmFsaWQtY29tcG9uZW50LXR5cGU9Jyd7MH0nJyBpcyBub3QgYSB2YWxpZCBjb21wb25lbnQgdHlwZS4gIFR5cGVzIG11c3QgYmUgdmFsaWQgSmF2YSBpZGVudGlmaWVycy4KLVNwZWNpZmljYXRpb25QYXJzZXIuaW52YWxpZC1wcm9wZXJ0eS1uYW1lPScnezB9JycgaXMgbm90IGEgdmFsaWQgSmF2YUJlYW4gcHJvcGVydHkgbmFtZS4gIFByb3BlcnR5IG5hbWVzIG11c3QgYmUgdmFsaWQgSmF2YSBpZGVudGlmaWVycy4KLVNwZWNpZmljYXRpb25QYXJzZXIuaW52YWxpZC1iZWFuLW5hbWU9Jyd7MH0nJyBpcyBub3QgYSB2YWxpZCBoZWxwZXIgYmVhbiBuYW1lLiAgSGVscGVyIGJlYW4gbmFtZXMgbXVzdCBiZSB2YWxpZCBKYXZhIGlkZW50aWZpZXJzLgotU3BlY2lmaWNhdGlvblBhcnNlci51bmtub3duLXN0YXRpYy12YWx1ZS10eXBlPVVua25vd24gPHN0YXRpYy12YWx1ZT4gdHlwZTogJyd7MH0nJy4KLVNwZWNpZmljYXRpb25QYXJzZXIuaW52YWxpZC1jb21wb25lbnQtaWQ9Jyd7MH0nJyBpcyBub3QgYSB2YWxpZCBjb21wb25lbnQgaWQuICBDb21wb25lbnQgaWRzIG11c3QgYmUgdmFsaWQgSmF2YSBpZGVudGlmaWVycy4KLVNwZWNpZmljYXRpb25QYXJzZXIuaW52YWxpZC1hc3NldC1uYW1lPScnezB9JycgaXMgbm90IGEgdmFsaWQgYXNzZXQgbmFtZS4gIEFzc2V0IG5hbWVzIG11c3QgYmUgdmFsaWQgSmF2YSBpZGVudGlmaWVycy4KLVNwZWNpZmljYXRpb25QYXJzZXIuaW52YWxpZC1zZXJ2aWNlLW5hbWU9Jyd7MH0nJyBpcyBub3QgYSB2YWxpZCBzZXJ2aWNlIG5hbWUuICBTZXJ2aWNlIG5hbWVzIG11c3Qgc3RhcnQgd2l0aCBhIGxldHRlciwgYW5kIGNvbnRhaW4gb25seSBsZXR0ZXJzLCBudW1iZXJzLCBkYXNoLCB1bmRlcnNjb3JlIGFuZCBwZXJpb2QuCi1TcGVjaWZpY2F0aW9uUGFyc2VyLmludmFsaWQtbGlicmFyeS1pZD0nJ3swfScnIGlzIG5vdCBhIHZhbGlkIGxpYnJhcnkgaWQuICBMaWJyYXJ5IGlkcyBtdXN0IGJlIHZhbGlkIEphdmEgaWRlbnRpZmllcnMuCi1TcGVjaWZpY2F0aW9uUGFyc2VyLmludmFsaWQtZXh0ZW5zaW9uLW5hbWU9Jyd7MH0nJyBpcyBub3QgYSB2YWxpZCBleHRlbnNpb24gbmFtZS4gIEV4dGVuc2lvbiBuYW1lcyBtdXN0IHN0YXJ0IHdpdGggYSBsZXR0ZXIsIGFuZCBjb250YWluIG9ubHkgbGV0dGVycywgbnVtYmVycywgZGFzaCBhbmQgdW5kZXJzY29yZS4KLVNwZWNpZmljYXRpb25QYXJzZXIuaW52YWxpZC1jb21wb25lbnQtdHlwZT0nJ3swfScnIGlzIG5vdCBhIHZhbGlkIGNvbXBvbmVudCB0eXBlLgotU3BlY2lmaWNhdGlvblBhcnNlci5mcmFtZXdvcmstbGlicmFyeS1pZC1pcy1yZXNlcnZlZD1UaGUgbGlicmFyeSBpZCAnJ3swfScnIGlzIHJlc2VydmVkIGFuZCBtYXkgbm90IGJlIHVzZWQuCi1TcGVjaWZpY2F0aW9uUGFyc2VyLm5vLWF0dHJpYnV0ZS1hbmQtYm9keT1JdCBpcyBub3QgdmFsaWQgdG8gc3BlY2lmeSBhIHZhbHVlIGZvciBhdHRyaWJ1dGUgJyd7MH0nJyBvZiA8ezF9PiBhbmQgcHJvdmlkZSBhIHZhbHVlIGluIHRoZSBib2R5IG9mIHRoZSBlbGVtZW50LgotU3BlY2lmaWNhdGlvblBhcnNlci5yZXF1aXJlZC1leHRlbmRlZC1hdHRyaWJ1dGU9RWxlbWVudCA8ezB9PiBkb2VzIG5vdCBzcGVjaWZ5IGEgdmFsdWUgZm9yIGF0dHJpYnV0ZSAnJ3sxfScnLCBvciBjb250YWluIGEgYm9keSB2YWx1ZS4KLVNwZWNpZmljYXRpb25QYXJzZXIuZXJyb3ItcmVhZGluZy1yZXNvdXJjZT1VbmFibGUgdG8gcmVhZCB7MH06IHsxfQotCi1WYWxpZGF0ZVB1YmxpY0lkUnVsZS5uby1wdWJsaWMtaWQ9RG9jdW1lbnQgezB9IGRvZXMgbm90IGRlZmluZSBhIHB1YmxpYyBpZC4KLQotVGVtcGxhdGVQYXJzZXIuY29tbWVudC1ub3QtZW5kZWQ9Q29tbWVudCBvbiBsaW5lIHswfSBkaWQgbm90IGVuZC4KLVRlbXBsYXRlUGFyc2VyLnVuY2xvc2VkLXRhZz1UYWcgPHswfT4gb24gbGluZSB7MX0gaXMgbmV2ZXIgY2xvc2VkLgotVGVtcGxhdGVQYXJzZXIudW5jbG9zZWQtdW5rbm93bi10YWc9VGFnIG9uIGxpbmUgezF9IGlzIG5ldmVyIGNsb3NlZC4KLVRlbXBsYXRlUGFyc2VyLm1pc3NpbmctYXR0cmlidXRlLXZhbHVlPVRhZyA8ezB9PiBvbiBsaW5lIHsxfSBpcyBtaXNzaW5nIGEgdmFsdWUgZm9yIGF0dHJpYnV0ZSB7Mn0uCi1UZW1wbGF0ZVBhcnNlci5jb250ZW50LWJsb2NrLW1heS1ub3QtYmUtaWdub3JlZD1UYWcgPHswfT4gb24gbGluZSB7MX0gaXMgdGhlIHRlbXBsYXRlIGNvbnRlbnQsIGFuZCBtYXkgbm90IGJlIGluIGFuIGlnbm9yZWQgYmxvY2suCi1UZW1wbGF0ZVBhcnNlci5jb250ZW50LWJsb2NrLW1heS1ub3QtYmUtZW1wdHk9VGFnIDx7MH0+IG9uIGxpbmUgezF9IGlzIHRoZSB0ZW1wbGF0ZSBjb250ZW50LCBhbmQgbWF5IG5vdCBiZSBlbXB0eS4KLVRlbXBsYXRlUGFyc2VyLnVua25vd24tY29tcG9uZW50LWlkPVRhZyA8ezB9PiBvbiBsaW5lIHsxfSByZWZlcmVuY2VzIHVua25vd24gY29tcG9uZW50IGlkICcnezJ9JycuCi1UZW1wbGF0ZVBhcnNlci5jb21wb25lbnQtbWF5LW5vdC1iZS1pZ25vcmVkPVRhZyA8ezB9PiBvbiBsaW5lIHsxfSBpcyBhIGR5bmFtaWMgY29tcG9uZW50LCBhbmQgbWF5IG5vdCBhcHBlYXIgaW5zaWRlIGFuIGlnbm9yZWQgYmxvY2suCi1UZW1wbGF0ZVBhcnNlci5uZXN0ZWQtaWdub3JlPVRhZyA8ezB9PiBvbiBsaW5lIHsxfSBzaG91bGQgYmUgaWdub3JlZCwgYnV0IGlzIGFscmVhZHkgaW5zaWRlIGFuIGlnbm9yZWQgYmxvY2sgKGlnbm9yZWQgYmxvY2tzIG1heSBub3QgYmUgbmVzdGVkKS4KLVRlbXBsYXRlUGFyc2VyLmluY29tcGxldGUtY2xvc2UtdGFnPUluY29tcGxldGUgY2xvc2UgdGFnIG9uIGxpbmUgezB9LgotVGVtcGxhdGVQYXJzZXIuaW1wcm9wZXJseS1uZXN0ZWQtY2xvc2UtdGFnPUNsb3NpbmcgdGFnIDwvezB9PiBvbiBsaW5lIHsxfSBpcyBpbXByb3Blcmx5IG5lc3RlZCB3aXRoIHRhZyA8ezJ9PiBvbiBsaW5lIHszfS4KLVRlbXBsYXRlUGFyc2VyLnVubWF0Y2hlZC1jbG9zZS10YWc9Q2xvc2luZyB0YWcgPC97MH0+IG9uIGxpbmUgezF9IGRvZXMgbm90IGhhdmUgYSBtYXRjaGluZyBvcGVuIHRhZy4KLVRlbXBsYXRlUGFyc2VyLmNvbXBvbmVudC1pZC1pbnZhbGlkPVRhZyA8ezB9PiBvbiBsaW5lIHsxfSBjb250YWlucyBhbiBpbnZhbGlkIGp3Y2lkICcnezJ9JycuCi1UZW1wbGF0ZVBhcnNlci5kdXBsaWNhdGUtdGFnLWF0dHJpYnV0ZT1UYWcgPHswfT4gb24gbGluZSB7MX0gY29udGFpbnMgbW9yZSB0aGFuIG9uZSAnJ3syfScnIGF0dHJpYnV0ZS4KLQotCi1UZXh0VG9rZW4ucmFuZ2UtZXJyb3I9ezB9OiBvdXQgb2YgcmFuZ2UgZm9yIHRlbXBsYXRlIGxlbmd0aCB7MX0uCi1UZW1wbGF0ZVRva2VuLm1heS1ub3QtcmVuZGVyPXswfSB0b2tlbnMgbWF5IG5vdCByZW5kZXIuCi0KLSMgb3JnLmFwYWNoZS50YXBlc3RyeS5yZWNvcmQKLQotUGFnZVJlY29yZGVyLmNoYW5nZS1hZnRlci1sb2NrPVBhZ2UgcmVjb3JkZXIgZm9yIHBhZ2UgezB9IGlzIGxvY2tlZCBhZnRlciBhIGNvbW1pdCgpLCBidXQgcmVjZWl2ZWQgYSBjaGFuZ2UgdG8gcHJvcGVydHkgezF9IG9mIGNvbXBvbmVudCB7Mn0uCi1QYWdlUmVjb3JkZXIudW5hYmxlLXRvLXBlcnNpc3Q9VW5hYmxlIHRvIHBlcnNpc3QgcHJvcGVydHkgezB9IG9mIGNvbXBvbmVudCB7MX0gYXMgezJ9LgotUGFnZVJlY29yZGVyLm51bGwtcHJvcGVydHktbmFtZT1BIGNoYW5nZSBldmVudCBmb3IgY29tcG9uZW50IHswfSBmYWlsZWQgdG8gc3BlY2lmeSB0aGUgbmFtZSBvZiB0aGUgdXBkYXRlZCBwcm9wZXJ0eS4KLVBhZ2VSZWNvcmRlci51bmFibGUtdG8tcm9sbGJhY2s9VW5hYmxlIHRvIHNldCBwcm9wZXJ0eSB7MH0gb2YgY29tcG9uZW50IHsxfSB0byB7Mn06IHszfQotCi0jIG9yZy5hcGFjaGUudGFwZXN0cnkucmVzb3VyY2UKLQotQ29udGV4dFJlc291cmNlTG9jYXRpb24udW5hYmxlLXRvLXJlZmVyZW5jZS1jb250ZXh0LXBhdGg9VW5hYmxlIHRvIHJlZmVyZW5jZSBjb250ZXh0IHBhdGggJyd7MH0nJy4KLQotCi0jIG9yZy5hcGFjaGUudGFwZXN0cnkuc2NyaXB0Ci0KLVNjcmlwdFBhcnNlci51bmtub3duLXB1YmxpYy1pZD1TY3JpcHQgdXNlcyB1bmtub3duIHB1YmxpYyBpbmRlbnRpZmllciB7MH0uCi1TY3JpcHRQYXJzZXIuaW52YWxpZC1rZXk9Jyd7MH0nJyBpcyBub3QgYSB2YWxpZCBrZXkuICBTeW1ib2wga2V5cyBtdXN0IGJlIHZhbGlkIEphdmEgaWRlbnRpZmllcnMuCi1TY3JpcHRQYXJzZXIudW5hYmxlLXRvLXJlc29sdmUtY2xhc3M9Jyd7MH0nJyBpcyBub3QgYSByZXNvbHZhYmxlIGNsYXNzIG5hbWUuCi0KLUlucHV0U3ltYm9sVG9rZW4ucmVxdWlyZWQ9U2NyaXB0IHN5bWJvbCAnJ3swfScnIGlzIHJlcXVpcmVkLCBidXQgbm90IHNwZWNpZmllZC4KLUlucHV0U3ltYm9sVG9rZW4ud3JvbmctdHlwZT1TY3JpcHQgc3ltYm9sICcnezB9JycgaXMgezF9LCBub3QgezJ9LgotCi0jIG9yZy5hcGFjaGUudGFwZXN0cnkuc3BlYwotCi1MaWJyYXJ5U3BlY2lmaWNhdGlvbi5kdXBsaWNhdGUtY2hpbGQtbmFtZXNwYWNlLWlkPUEgY2hpbGQgbmFtZXNwYWNlIHdpdGggaWQgJyd7MH0nJyBhbHJlYWR5IGV4aXN0cy4KLUxpYnJhcnlTcGVjaWZpY2F0aW9uLmR1cGxpY2F0ZS1wYWdlLW5hbWU9QSBwYWdlIG5hbWVkICcnezB9JycgYWxyZWFkeSBleGlzdHMgaW4gdGhpcyBuYW1lc3BhY2UuCi1MaWJyYXJ5U3BlY2lmaWNhdGlvbi5kdXBsaWNhdGUtY29tcG9uZW50LWFsaWFzPUEgY29tcG9uZW50IGFsaWFzICcnezB9JycgYWxyZWFkeSBleGlzdHMgaW4gdGhpcyBuYW1lc3BhY2UuCi1MaWJyYXJ5U3BlY2lmaWNhdGlvbi5kdXBsaWNhdGUtc2VydmljZS1uYW1lPUEgc2VydmljZSBuYW1lZCAnJ3swfScnIGFscmVhZHkgZXhpc3RzIGluIHRoaXMgbmFtZXNwYWNlLgotTGlicmFyeVNwZWNpZmljYXRpb24uZHVwbGljYXRlLWV4dGVuc2lvbi1uYW1lPUFuIGV4dGVuc2lvbiBuYW1lZCAnJ3swfScnIGFscmVhZHkgZXhpc3RzIGluIHRoaXMgbmFtZXNwYWNlLgotTGlicmFyeVNwZWNpZmljYXRpb24ubm8tc3VjaC1leHRlbnNpb249Tm8gZXh0ZW5zaW9uIG5hbWVkICcnezB9JycgZXhpc3RzIGluIHRoaXMgbmFtZXNwYWNlLgotTGlicmFyeVNwZWNpZmljYXRpb24uZXh0ZW5zaW9uLWRvZXMtbm90LWltcGxlbWVudC1pbnRlcmZhY2U9RXh0ZW5zaW9uICcnezB9JycgKGNsYXNzIHsxfSkgZG9lcyBub3QgaW1wbGVtZW50IGludGVyZmFjZSB7Mn0uCi1MaWJyYXJ5U3BlY2lmaWNhdGlvbi5leHRlbnNpb24tbm90LWEtc3ViY2xhc3M9RXh0ZW5zaW9uICcnezB9JycgKGNsYXNzIHsxfSkgZG9lcyBub3QgaW5oZXJpdCBmcm9tIGNsYXNzIHsyfS4KLQotQ29tcG9uZW50U3BlY2lmaWNhdGlvbi5kdXBsaWNhdGUtYXNzZXQ9ezB9OiBhbHJlYWR5IGNvbnRhaW5zIGFzc2V0ICcnezF9JycuCi1Db21wb25lbnRTcGVjaWZpY2F0aW9uLmR1cGxpY2F0ZS1jb21wb25lbnQ9ezB9OiBhbHJlYWR5IGNvbnRhaW5zIGNvbXBvbmVudCAnJ3sxfScnLgotQ29tcG9uZW50U3BlY2lmaWNhdGlvbi5kdXBsaWNhdGUtcGFyYW1ldGVyPXswfTogYWxyZWFkeSBjb250YWlucyBwYXJhbWV0ZXIgJyd7MX0nJy4KLUNvbXBvbmVudFNwZWNpZmljYXRpb24uZHVwbGljYXRlLWJlYW49ezB9OiBhbHJlYWR5IGNvbnRhaW5zIGJlYW4gZGVmaW5pdGlvbiBmb3IgJyd7MX0nJy4KLUNvbXBvbmVudFNwZWNpZmljYXRpb24uZHVwbGljYXRlLXByb3BlcnR5LXNwZWNpZmljYXRpb249ezB9OiBhbHJlYWR5IGNvbnRhaW5zIHByb3BlcnR5IHNwZWNpZmljYXRpb24gZm9yIHByb3BlcnR5ICcnezF9JycuCi0KLUV4dGVuc2lvblNwZWNpZmljYXRpb24uZHVwbGljYXRlLXByb3BlcnR5PXswfTogYWxyZWFkeSBjb250YWlucyBwcm9wZXJ0eSBjb25maWd1cmF0aW9uIGZvciAnJ3sxfScnLgotRXh0ZW5zaW9uU3BlY2lmaWNhdGlvbi5iYWQtY2xhc3M9VW5hYmxlIHRvIGxvY2F0ZSBjbGFzcyB7MH0uCi0KLURpcmVjdGlvbi5JTj1pbgotRGlyZWN0aW9uLkZPUk09Zm9ybQotRGlyZWN0aW9uLkNVU1RPTT1jdXN0b20KLURpcmVjdGlvbi5BVVRPPWF1dG8KLQotIyBvcmcuYXBhY2hlLnRhcGVzdHJ5LnV0aWwKLQotQWRhcHRvclJlZ2lzdHJ5LmR1cGxpY2F0ZS1yZWdpc3RyYXRpb249QSByZWdpc3RyYXRpb24gZm9yIGNsYXNzIHswfSBhbHJlYWR5IGV4aXN0cy4KLUFkYXB0b3JSZWdpc3RyeS5hZGFwdG9yLW5vdC1mb3VuZD1Db3VsZCBub3QgZmluZCBhbiBhZGFwdG9yIGZvciBjbGFzcyB7MH0uCi0KLUphbml0b3JUaHJlYWQuaW50ZXJ2YWwtbG9ja2VkPVRoZSBpbnRlcnZhbCBmb3IgdGhpcyBqYW5pdG9yIHRocmVhZCBpcyBsb2NrZWQuCi1KYW5pdG9yVGhyZWFkLmlsbGVnYWwtaW50ZXJ2YWw9VGhlIGludGVydmFsIGZvciBhIGphbml0b3IgdGhyZWFkIG1heSBub3QgYmUgbGVzcyB0aGFuIDEgbWlsbGlzZWNvbmQuCi0KLU11bHRpS2V5Lm51bGwta2V5cz1NdXN0IHBhc3MgaW4gbm9uLWVtcHR5IGFycmF5IG9mIGtleXMuCi1NdWx0aUtleS5maXJzdC1lbGVtZW50LW1heS1ub3QtYmUtbnVsbD1GaXJzdCBlbGVtZW50IG9mIGtleXMgbWF5IG5vdCBiZSBudWxsLgotTXVsdGlLZXkubm8ta2V5cz1ObyBrZXlzIGZvciB0aGlzIE11bHRpS2V5LgotCi1Qb29sLnVuYWJsZS10by1pbnN0YW50aWF0ZS1pbnN0YW5jZT1VbmFibGUgdG8gaW5zdGFudGlhdGUgbmV3IGluc3RhbmNlIG9mIGNsYXNzIHswfS4KLQotCi0jIG9yZy5hcGFjaGUudGFwZXN0cnkudXRpbC5pbwotCi1EYXRhU3F1ZWV6ZXIuc2hvcnQtcHJlZml4PVRoZSBhZGFwdG9yIHByZWZpeCBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIGNoYXJhY3Rlci4KLURhdGFTcXVlZXplci5udWxsLWNsYXNzPVRoZSBkYXRhQ2xhc3MgbWF5IG5vdCBiZSBudWxsLgotRGF0YVNxdWVlemVyLm51bGwtYWRhcHRvcj1UaGUgYWRhcHRvciBtYXkgbm90IGJlIG51bGwuCi1EYXRhU3F1ZWV6ZXIucHJlZml4LW91dC1vZi1yYW5nZT1EYXRhU3F1ZWV6ZXIgcHJlZml4IG11c3QgYmUgaW4gdGhlIHJhbmdlICcnIScnIHRvICcneicnLgotRGF0YVNxdWVlemVyLmFkYXB0b3ItcHJlZml4LXRha2VuPUFuIGFkYXB0b3IgZm9yIHByZWZpeCAnJ3swfScnIGlzIGFscmVhZHkgcmVnaXN0ZXJlZC4KLQotU2VyaWFsaXphYmxlQWRhcHRvci5jbGFzcy1ub3QtZm91bmQ9Q2xhc3MgezB9IG5vdCBmb3VuZC4KLVNlcmlhbGl6YWJsZUFkYXB0b3IudW5hYmxlLXRvLWNvbnZlcnQ9Q2Fubm90IGNvbnZlcnQgezB9IGludG8gYSBtb2RpZmllZCBCYXNlNjQgY2hhcmFjdGVyLgotU2VyaWFsaXphYmxlQWRhcHRvci51bmFibGUtdG8taW50ZXJwcmV0LWNoYXI9Q2Fubm90IGludGVycHJldCAnJ3swfScnIGFzIGEgbW9kaWZpZWQgQmFzZTY0IGNoYXJhY3Rlci4KLQotQ29tcG9uZW50QWRkcmVzc0FkYXB0b3Iubm8tc2VwYXJhdG9yPUludmFsaWQgQ29tcG9uZW50QWRkcmVzcyBlbmNvZGluZyAtLSBzZXBhcmF0b3Igbm90IHByZXNlbnQKLQotIyBvcmcuYXBhY2hlLnRhcGVzdHJ5LnV0aWwucHJvcAotCi1Qcm9wZXJ0eUZpbmRlci51bmFibGUtdG8taW50cm9zcGVjdC1jbGFzcz1VbmFibGUgdG8gaW5zdHJvc3BlY3QgcHJvcGVydGllcyBvZiBjbGFzcyB7MH0uCi0KLU9nbmxVdGlscy51bmFibGUtdG8tdXBkYXRlLWV4cHJlc3Npb249VW5hYmxlIHRvIHVwZGF0ZSBleHByZXNzaW9uICcnezB9Jycgb2YgezF9IHRvIHsyfS4KLU9nbmxVdGlscy51bmFibGUtdG8tcmVhZC1leHByZXNzaW9uPVVuYWJsZSB0byByZWFkIGV4cHJlc3Npb24gJyd7MH0nJyBvZiB7MX0uCi1PZ25sVXRpbHMudW5hYmxlLXRvLXBhcnNlLWV4cHJlc3Npb249VW5hYmxlIHRvIHBhcnNlIGV4cHJlc3Npb24gJyd7MH0nJy4KLQotIyBvcmcuYXBhY2hlLnRhcGVzdHJ5LnV0aWwueG1sCi0KLUFic3RyYWN0RG9jdW1lbnRQYXJzZXIuaW5jb3JyZWN0LWRvY3VtZW50LXR5cGU9SW5jb3JyZWN0IGRvY3VtZW50IHR5cGU7IGV4cGVjdGVkIHswfSBidXQgcmVjZWl2ZWQgezF9LgotQWJzdHJhY3REb2N1bWVudFBhcnNlci51bmFibGUtdG8tcGFyc2U9VW5hYmxlIHRvIHBhcnNlIHswfTogezF9Ci1BYnN0cmFjdERvY3VtZW50UGFyc2VyLnVuYWJsZS10by1yZWFkPUVycm9yIHJlYWRpbmcgezB9OiB7MX0KLUFic3RyYWN0RG9jdW1lbnRQYXJzZXIudW5hYmxlLXRvLWNvbnN0cnVjdC1idWlsZGVyPVVuYWJsZSB0byBjb25zdHJ1Y3QgRG9jdW1lbnRCdWlsZGVyOiB7MH0KLUFic3RyYWN0RG9jdW1lbnRQYXJzZXIuaW52YWxpZC1pZGVudGlmaWVyPXswfSBpcyBub3QgYSB2YWxpZCBpZGVudGlmaWVyIChpbiBlbGVtZW50IHsxfSkuCi1BYnN0cmFjdERvY3VtZW50UGFyc2VyLm1pc3NpbmctcmVzb3VyY2U9UmVzb3VyY2UgYXQgezB9IGRvZXMgbm90IGV4aXN0LgotQWJzdHJhY3REb2N1bWVudFBhcnNlci51bmtub3duLXB1YmxpYy1pZD1Eb2N1bWVudCB7MH0gaGFzIGFuIHVuZXhwZWN0ZWQgcHVibGljIGlkIG9mICcnezF9JycuCi0KLVJ1bGVEcml2ZW5QYXJzZXIubm8tcnVsZS1mb3ItZWxlbWVudD1ObyBydWxlIGlzIGRlZmluZWQgZm9yIHBhcnNpbmcgZWxlbWVudCAnJ3swfScnLgotUnVsZURyaXZlblBhcnNlci5yZXNvdXJjZS1taXNzaW5nPVVuYWJsZSB0byBmaW5kIHJlc291cmNlIHswfS4KLVJ1bGVEcml2ZW5QYXJzZXIudW5hYmxlLXRvLW9wZW4tcmVzb3VyY2U9VW5hYmxlIHRvIG9wZW4gcmVzb3VyY2UgezB9LgotUnVsZURyaXZlblBhcnNlci5wYXJzZS1lcnJvcj1VbmFibGUgdG8gcGFyc2UgezB9OiB7MX0KLQotIyBvcmcuYXBhY2hlLnRhcGVzdHJ5LnZhbGlkCi0KLUZpZWxkTGFiZWwubm8tZGlzcGxheS1uYW1lPURpc3BsYXkgbmFtZSBub3Qgc3BlY2lmaWVkIGFuZCBub3QgcHJvdmlkZWQgYnkgZmllbGQgezB9LgotRmllbGRMYWJlbC5tdXN0LWJlLWNvbnRhaW5lZC1ieS1mb3JtPVRoaXMgY29tcG9uZW50IG11c3QgYmUgY29udGFpbmVkIHdpdGhpbiBhIEZvcm0uCi1GaWVsZExhYmVsLm5vLWRlbGVnYXRlPU5vIElWYWxpZGF0aW9uRGVsZWdhdGUgaXMgYXZhaWxhYmxlIHRvIFZhbGlkRmllbGQgezB9OyBpdCBpcyBzcGVjaWZpZWQgYXMgdGhlIGRlbGVnYXRlIHBhcmFtZXRlciBvZiBGb3JtIHsxfS4KLQotVmFsaWRGaWVsZC5uby1kZWxlZ2F0ZT1ObyBJVmFsaWRhdGlvbkRlbGVnYXRlIGlzIGF2YWlsYWJsZSB0byBWYWxpZEZpZWxkIHswfTsgaXQgaXMgc3BlY2lmaWVkIGFzIHRoZSBkZWxlZ2F0ZSBwYXJhbWV0ZXIgb2YgRm9ybSB7MX0uCi1WYWxpZEZpZWxkLm11c3QtYmUtY29udGFpbmVkLWJ5LWJvZHk9QSBWYWxpZEZpZWxkIHVzaW5nIGNsaWVudC1zaWRlIHZhbGlkYXRpb24gbXVzdCBiZSBlbmNsb3NlZCBieSBhIEJvZHkgY29tcG9uZW50LgotCi1OdW1iZXJWYWxpZGF0b3IudW5rbm93bi10eXBlPVVua25vd24gdmFsdWUgdHlwZSB7MH0uCi1OdW1iZXJWYWxpZGF0b3Iubm8tYWRhcHRvci1mb3ItZmllbGQ9VW5hYmxlIHRvIHByb3ZpZGUgdmFsaWRhdGlvbiBmb3IgZmllbGQgezB9ICh2YWx1ZSB0eXBlIHsxfSkuCi0KLVBhdHRlcm5WYWxpZGF0b3IucGF0dGVybi1tYXRjaC1lcnJvcj1VbmFibGUgdG8gbWF0Y2ggcGF0dGVybiB7MH0gZm9yIGZpZWxkIHsxfS4KLQotIyBvcmcuYXBhY2hlLnRhcGVzdHJ5LndtbAotCi1DYXJkLmNhcmRzLW1heS1ub3QtbmVzdD1DYXJkcyBtYXkgbm90IGJlIG5lc3RlZC4KLVBvc3RmaWVsZC5tdXN0LWJlLWNvbnRhaW5lZC1ieS1nbz1UaGlzIHBvc3RmaWVsZCBtdXN0IGJlIGNvbnRhaW5lZCB3aXRoaW4gYSBHby4KLQotIyBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbnRyaWIuY29tcG9uZW50cwotCi1XaGVuLm11c3QtYmUtY29udGFpbmVkLWJ5LWNob29zZT1XaGVuIGNvbXBvbmVudCBtdXN0IGJlIGNvbnRhaW5lZCB3aXRoaW4gYSBDaG9vc2UuCmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvYXNzZXQvQWJzdHJhY3RBc3NldC5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2Fzc2V0L0Fic3RyYWN0QXNzZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY5ZGM2OC4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvYXNzZXQvQWJzdHJhY3RBc3NldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuYXNzZXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5idWlsZGVyLlRvU3RyaW5nQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklBc3NldDsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklMb2NhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZXNvdXJjZUxvY2F0aW9uOwotCi0vKioKLSAqICBCYXNlIGNsYXNzIGZvciB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5JQXNzZXR9IGltcGxlbWVudGF0aW9ucy4gIFByb3ZpZGVzCi0gKiAgdGhlIGxvY2F0aW9uIHByb3BlcnR5LgotICoKLSAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiAgQHZlcnNpb24gJElkJAotICogIEBzaW5jZSAzLjAKLSAqCi0gKiovCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEFzc2V0IGltcGxlbWVudHMgSUFzc2V0Ci17Ci0JcHJpdmF0ZSBJUmVzb3VyY2VMb2NhdGlvbiBfcmVzb3VyY2VMb2NhdGlvbjsKLSAgICBwcml2YXRlIElMb2NhdGlvbiBfbG9jYXRpb247Ci0KLSAgICBwcm90ZWN0ZWQgQWJzdHJhY3RBc3NldChJUmVzb3VyY2VMb2NhdGlvbiByZXNvdXJjZUxvY2F0aW9uLCBJTG9jYXRpb24gbG9jYXRpb24pCi0gICAgewotICAgIAlfcmVzb3VyY2VMb2NhdGlvbiA9IHJlc291cmNlTG9jYXRpb247Ci0gICAgICAgIF9sb2NhdGlvbiA9IGxvY2F0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyBJTG9jYXRpb24gZ2V0TG9jYXRpb24oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9sb2NhdGlvbjsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIElSZXNvdXJjZUxvY2F0aW9uIGdldFJlc291cmNlTG9jYXRpb24oKQotICAgIHsKLSAgICAJcmV0dXJuIF9yZXNvdXJjZUxvY2F0aW9uOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgICB7Ci0gICAgCVRvU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFRvU3RyaW5nQnVpbGRlcih0aGlzKTsKLSAgICAJCi0gICAgCWJ1aWxkZXIuYXBwZW5kKCJyZXNvdXJjZUxvY2F0aW9uIiwgX3Jlc291cmNlTG9jYXRpb24pOwotICAgIAlidWlsZGVyLmFwcGVuZCgibG9jYXRpb24iLCBfbG9jYXRpb24pOwotICAgIAkKLSAgICAJcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvYXNzZXQvQXNzZXRFeHRlcm5hbGl6ZXIuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9hc3NldC9Bc3NldEV4dGVybmFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMmI2NjAwLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9hc3NldC9Bc3NldEV4dGVybmFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg3ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmFzc2V0OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OwotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlcXVlc3RDeWNsZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZXNvdXJjZVJlc29sdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuVGFwZXN0cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5lbmdpbmUuSVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkudXRpbC5TdHJpbmdTcGxpdHRlcjsKLQotLyoqCi0gKiAgUmVzcG9uc2libGUgZm9yIGNvcHlpbmcgYXNzZXRzIGZyb20gdGhlIGNsYXNzcGF0aCB0byBhbiBleHRlcm5hbCBkaXJlY3RvcnkgdGhhdAotICogIGlzIHZpc2libGUgdG8gdGhlIHdlYiBzZXJ2ZXIuIFRoZSBleHRlcm5hbGl6ZXIgaXMgc3RvcmVkIGluc2lkZQotICogIHRoZSB7QGxpbmsgU2VydmxldENvbnRleHR9IGFzIGEgbmFtZWQgYXR0cmlidXRlLgotICoKLSAqICA8cD5UaGUgZXh0ZXJuYWxpemVyIHVzZXMgdGhlIG5hbWUgPGNvZGU+b3JnLmFwYWNoZS50YXBlc3RyeS5Bc3NldEV4dGVybmFsaXplci48aT5hcHBsaWNhdGlvbiBuYW1lPC9pPgotICogIDwvY29kZT4uICBJdCBjb25maWd1cmVzIGl0c2VsZiB1c2luZyB0d28gYWRkaXRpb25hbCAKLSAqICBwcm9wZXJ0aWVzIChzZWFyY2hpbmcgaW4gCi0gKiAge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkuSUVuZ2luZSNnZXRQcm9wZXJ0eVNvdXJjZSgpfS4KLSAqCi0gKiAgPHRhYmxlIGJvcmRlcj0xPgotICogIDx0cj4gPHRoPlBhcmFtZXRlcjwvdGg+IDx0aD5EZXNjcmlwdGlvbjwvdGg+IDwvdHI+Ci0gKiAgPHRyIHZhbGlnbj10b3A+IAotICoJCTx0ZD48Y29kZT5vcmcuYXBhY2hlLnRhcGVzdHJ5LmFzc2V0LmRpcjwvY29kZT4gPC90ZD4KLSAqIAkJIDx0ZD5UaGUgZGlyZWN0b3J5IHRvIHdoaWNoIGFzc2V0cyB3aWxsIGJlIGNvcGllZC48L3RkPiA8L3RyPgotICogIDx0ciB2YWxpZ249dG9wPgotICoJCTx0ZD48Y29kZT5vcmcuYXBhY2hlLnRhcGVzdHJ5LmFzc2V0LlVSTDwvY29kZT4gPC90ZD4KLSAqCQkgIDx0ZD5UaGUgY29ycmVzcG9uZGluZyBVUkwgZm9yIHRoZSBhc3NldCBkaXJlY3RvcnkuPC90ZD4gPC90cj4KLSAqCTwvdGFibGU+Ci0gKgotICogPHA+SWYgZWl0aGVyIG9mIHRoZXNlIHBhcmFtZXRlcnMgaXMgbnVsbCwgdGhlbiBubyBleHRlcm5hbGl6YXRpb24gb2NjdXJzLgotICogUHJpdmF0ZSBhc3NldHMgd2lsbCBzdGlsbCBiZSBhdmFpbGFibGUsIGp1c3QgbGVzcyBlZmZpY2llbnRseSwgYXMgdGhlIGFwcGxpY2F0aW9uCi0gKiB3aWxsIGJlIGludm9rZWQgdmlhIGl0cyBzZXJ2bGV0IGFuZCwgdWx0aW1hdGVseSwgdGhlIHtAbGluayBBc3NldFNlcnZpY2V9IHdpbGwgbmVlZAotICogdG8gcmV0cmlldmUgdGhlIGFzc2V0LgotICoKLSAqIDxwPkFzc2V0cyBtYWludGFpbiB0aGllciBkaXJlY3Rvcnkgc3RydWN0dXJlIHdoZW4gY29waWVkLiAgRm9yIGV4YW1wbGUsCi0gKiBhbiBhc3NldCB3aXRoIGEgcmVzb3VyY2UgcGF0aCBvZiA8Y29kZT4vY29tL3NrdW5rd29yeC9CYW5uZXIuZ2lmPC9jb2RlPiB3b3VsZAotICogYmUgY29waWVkIHRvIHRoZSBmaWxlIHN5c3RlbSBhcyA8Y29kZT48aT5kaXI8L2k+L2NvbS9za3Vua3dvcngvQmFubmVyLmdpZjwvY29kZT4gYW5kCi0gKiB3b3VsZCBoYXZlIGEgVVJMIG9mIDxjb2RlPjxpPlVSTDwvaT4vY29tL3NrdW5rd29yeC9CYW5uZXIuZ2lmPC9jb2RlPi4KLSAqCi0gKiA8cD5UaGUgZXh0ZXJuYWxpemVyIHdpbGwgY3JlYXRlIGFueSBkaXJlY3RvcmllcyBhcyBuZWVkZWQuCi0gKgotICogPHA+VGhlIGV4dGVybmFsaXplciB3aWxsIG5vdCBvdmVyd3JpdGUgZXhpc3RpbmcgZmlsZXMuICBXaGVuIGEgbmV3IHZlcnNpb24gb2YgdGhlIGFwcGxpY2F0aW9uCi0gKiBpcyBkZXBsb3llZCB3aXRoIGNoYW5nZWQgYXNzZXRzLCB0aGVyZSBhcmUgdHdvIGRlcGxveW1lbnQgc3RhdGVnaWVzOgotICogPHVsPgotICogPGxpPkRlbGV0ZSB0aGUgZXhpc3RpbmcgYXNzZXQgZGlyZWN0b3J5IGFuZCBhbGxvdyB0aGUgZXh0ZXJuYWxpemVyIHRvIHJlY3JlYXRlIGFuZAotICogcmVwb3B1bGF0ZSBpdC4KLSAqIDxsaT5DaGFuZ2UgdGhlIGFzc2V0IGRpcmVjdG9yeSBhbmQgVVJMLCBhbGxvd2luZyB0aGUgb2xkIGFuZCBuZXcgYXNzZXRzIHRvIGV4aXN0Ci0gKiAgc2lkZS1ieS1zaWRlLgotICogPC91bD4KLSAqCi0gKiA8cD5XaGVuIHVzaW5nIHRoZSBzZWNvbmQgYXBwcm9hY2gsIGl0IGlzIGJlc3QgdG8gdXNlIGEgZGlyZWN0b3J5IHRoYXQgaGFzCi0gKiBhIHZlcnNpb24gbnVtYmVyIGluIGl0LCBmb3IgZXhhbXBsZSwgPGNvZGU+RDovaW5ldHB1Yi9hc3NldHMvMDwvY29kZT4gbWFwcGVkIHRvIHRoZSBVUkwKLSAqIDxjb2RlPi9hc3NldHMvMDwvY29kZT4uICBXaGVuIGEgbmV3IHZlcnNpb24gb2YgdGhlIGFwcGxpY2F0aW9uIGlzIGRlcGxveWVkLCB0aGUgdHJhaWxpbmcKLSAqIHZlcnNpb24gbnVtYmVyIGlzIGluY3JlbWVudGVkIGZyb20gMCB0byAxLgotICogCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogIEB2ZXJzaW9uICRJZCQKLSAqIAotICoqLwotCi1wdWJsaWMgY2xhc3MgQXNzZXRFeHRlcm5hbGl6ZXIKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgTE9HID0gTG9nRmFjdG9yeS5nZXRMb2coQXNzZXRFeHRlcm5hbGl6ZXIuY2xhc3MpOwotCi0gICAgcHJpdmF0ZSBJUmVzb3VyY2VSZXNvbHZlciBfcmVzb2x2ZXI7Ci0gICAgcHJpdmF0ZSBGaWxlIF9hc3NldERpcjsKLSAgICBwcml2YXRlIFN0cmluZyBfVVJMOwotCi0gICAgLyoqCi0gICAgICogIEEgbWFwIGZyb20gcmVzb3VyY2UgcGF0aCAoYXMgYSBTdHJpbmcpIHRvIGZpbmFsIFVSTCAoYXMgYSBTdHJpbmcpLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHJpdmF0ZSBNYXAgX3Jlc291cmNlcyA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQlVGRkVSX1NJWkUgPSAyMDQ4OwotCi0gICAgcHJvdGVjdGVkIEFzc2V0RXh0ZXJuYWxpemVyKElSZXF1ZXN0Q3ljbGUgY3ljbGUpCi0gICAgewotICAgICAgICBfcmVzb2x2ZXIgPSBjeWNsZS5nZXRFbmdpbmUoKS5nZXRSZXNvdXJjZVJlc29sdmVyKCk7Ci0gICAgCi0gICAgICAgIElQcm9wZXJ0eVNvdXJjZSBwcm9wZXJ0aWVzID0gY3ljbGUuZ2V0RW5naW5lKCkuZ2V0UHJvcGVydHlTb3VyY2UoKTsKLQotCi0gICAgICAgIFN0cmluZyBkaXJlY3RvcnkgPSBwcm9wZXJ0aWVzLmdldFByb3BlcnR5VmFsdWUoIm9yZy5hcGFjaGUudGFwZXN0cnkuYXNzZXQuZGlyIik7Ci0KLSAgICAgICAgaWYgKGRpcmVjdG9yeSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIF9VUkwgPSBwcm9wZXJ0aWVzLmdldFByb3BlcnR5VmFsdWUoIm9yZy5hcGFjaGUudGFwZXN0cnkuYXNzZXQuVVJMIik7Ci0KLSAgICAgICAgaWYgKF9VUkwgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBfYXNzZXREaXIgPSBuZXcgRmlsZShkaXJlY3RvcnkpOwotCi0gICAgICAgIExPRy5kZWJ1ZygiSW5pdGlhbGl6ZWQgd2l0aCBkaXJlY3RvcnkgIiArIF9hc3NldERpciArICIgbWFwcGVkIHRvICIgKyBfVVJMKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBleHRlcm5hbGl6ZShTdHJpbmcgcmVzb3VyY2VQYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFN0cmluZ1tdIHBhdGg7Ci0gICAgICAgIGludCBpOwotICAgICAgICBGaWxlIGZpbGU7Ci0gICAgICAgIFN0cmluZ1NwbGl0dGVyIHNwbGl0dGVyOwotICAgICAgICBJbnB1dFN0cmVhbSBpbjsKLSAgICAgICAgT3V0cHV0U3RyZWFtIG91dDsKLSAgICAgICAgaW50IGJ5dGVzUmVhZDsKLSAgICAgICAgVVJMIGlucHV0VVJMOwotICAgICAgICBieXRlW10gYnVmZmVyOwotCi0gICAgICAgIGlmIChMT0cuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgICAgIExPRy5kZWJ1ZygiRXh0ZXJuYWxpemluZyAiICsgcmVzb3VyY2VQYXRoKTsKLQotICAgICAgICBmaWxlID0gX2Fzc2V0RGlyOwotCi0gICAgICAgIC8vIFJlc291cmNlcyBhcmUgYWx3YXlzIHNwbGl0IGJ5IHRoZSB1bml4IHNlcGVyYXRvciwgZXZlbiBvbiBXaW4zMi4KLQotICAgICAgICBzcGxpdHRlciA9IG5ldyBTdHJpbmdTcGxpdHRlcignLycpOwotCi0gICAgICAgIHBhdGggPSBzcGxpdHRlci5zcGxpdFRvQXJyYXkocmVzb3VyY2VQYXRoKTsKLQotICAgICAgICAvLyBUaGUgcGF0aCBpcyBleHBlY3RlZCB0byBzdGFydCB3aXRoIGEgbGVhZGluZyBzbGFzaCwgYnV0IHRoZSBTdHJpbmdTcGxpdHRlcgotICAgICAgICAvLyB3aWxsIGlnbm9yZSB0aGF0IGxlYWRpbmcgc2xhc2guCi0KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IHBhdGgubGVuZ3RoIC0gMTsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBEb2luZyBpdCB0aGlzIHdheSBtYWtlcyBzdXJlIHRoZSBwYXRoIHNlcGVyYXRvcnMgYXJlIHJpZ2h0LgotCi0gICAgICAgICAgICBmaWxlID0gbmV3IEZpbGUoZmlsZSwgcGF0aFtpXSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIGRpcmVjdG9yaWVzIGV4aXN0LgotCi0gICAgICAgIGZpbGUubWtkaXJzKCk7Ci0KLSAgICAgICAgZmlsZSA9IG5ldyBGaWxlKGZpbGUsIHBhdGhbcGF0aC5sZW5ndGggLSAxXSk7Ci0KLSAgICAgICAgLy8gSWYgdGhlIGZpbGUgZXhpc3RzLCB0aGVuIGFzc3VtZSBhbGwgaXMgd2VsbC4gIFRoaXMgaXMgT0sgZm9yIGRldmVsb3BtZW50LAotICAgICAgICAvLyBidXQgdGhlcmUgbWF5IGJlIG11bHRpdGhyZWFkaW5nIChvciBldmVuIG11bHRpcHJvY2VzcykgcmFjZSBjb25kaXRpb25zCi0gICAgICAgIC8vIGFyb3VuZCB0aGUgY3JlYXRpb24gb2YgdGhlIGZpbGUuCi0KLSAgICAgICAgaWYgKGZpbGUuZXhpc3RzKCkpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgLy8gR2V0IHRoZSByZXNvdXJjZSBhbmQgY29weSBpdCB0byB0aGUgZmlsZS4KLQotICAgICAgICBpbnB1dFVSTCA9IF9yZXNvbHZlci5nZXRSZXNvdXJjZShyZXNvdXJjZVBhdGgpOwotICAgICAgICBpZiAoaW5wdXRVUkwgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihUYXBlc3RyeS5mb3JtYXQoIm1pc3NpbmctcmVzb3VyY2UiLCByZXNvdXJjZVBhdGgpKTsKLQotICAgICAgICBpbiA9IGlucHV0VVJMLm9wZW5TdHJlYW0oKTsKLQotICAgICAgICBvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlKTsKLQotICAgICAgICBidWZmZXIgPSBuZXcgYnl0ZVtCVUZGRVJfU0laRV07Ci0KLSAgICAgICAgd2hpbGUgKHRydWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJ5dGVzUmVhZCA9IGluLnJlYWQoYnVmZmVyLCAwLCBCVUZGRVJfU0laRSk7Ci0gICAgICAgICAgICBpZiAoYnl0ZXNSZWFkIDwgMCkKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgb3V0LndyaXRlKGJ1ZmZlciwgMCwgYnl0ZXNSZWFkKTsKLSAgICAgICAgfQotCi0gICAgICAgIGluLmNsb3NlKCk7Ci0gICAgICAgIG91dC5jbG9zZSgpOwotCi0gICAgICAgIC8vIFRoZSBmaWxlIGlzIGNvcGllZCEKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgR2V0cyB0aGUgZXh0ZXJuYWxpemVyIHNpbmdsZXRvbiBmb3IgdGhlIGFwcGxpY2F0aW9uLiAgSWYgaXQgZG9lcyBub3QgYWxyZWFkeQotICAgICAqICBleGlzdCwgaXQgaXMgY3JlYXRlZCBhbmQgc3RvcmVkIGludG8gdGhlIHtAbGluayBTZXJ2bGV0Q29udGV4dH0uCi0gICAgICoKLSAgICAgKiAgPHA+RWFjaCBUYXBlc3RyeSBhcHBsaWNhdGlvbiB3aXRoaW4gYSBzaW5nbGUge0BsaW5rIFNlcnZsZXRDb250ZXh0fQotICAgICAqICB3aWxsIGhhdmUgaXRzIG93biBleHRlcm5hbGl6ZXI7IHRoZXkgYXJlIGRpZmZlcmVudGlhdGVkIGJ5IHRoZQotICAgICAqICBhcHBsaWNhdGlvbiBuYW1lLgotICAgICAqCi0gICAgICogIEBzZWUgb3JnLmFwYWNoZS50YXBlc3RyeS5zcGVjLkFwcGxpY2F0aW9uU3BlY2lmaWNhdGlvbiNnZXROYW1lKCkKLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBzdGF0aWMgQXNzZXRFeHRlcm5hbGl6ZXIgZ2V0KElSZXF1ZXN0Q3ljbGUgY3ljbGUpCi0gICAgewotICAgICAgICBIdHRwU2VydmxldCBzZXJ2bGV0ID0gY3ljbGUuZ2V0UmVxdWVzdENvbnRleHQoKS5nZXRTZXJ2bGV0KCk7Ci0gICAgICAgIFNlcnZsZXRDb250ZXh0IGNvbnRleHQgPSBzZXJ2bGV0LmdldFNlcnZsZXRDb250ZXh0KCk7Ci0KLSAgICAgICAgU3RyaW5nIHNlcnZsZXROYW1lID0gc2VydmxldC5nZXRTZXJ2bGV0TmFtZSgpOwotICAgICAgICAKLSAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZU5hbWUgPSAib3JnLmFwYWNoZS50YXBlc3RyeS5Bc3NldEV4dGVybmFsaXplcjoiICsgc2VydmxldE5hbWU7Ci0KLSAgICAgICAgQXNzZXRFeHRlcm5hbGl6ZXIgcmVzdWx0ID0gKEFzc2V0RXh0ZXJuYWxpemVyKSBjb250ZXh0LmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTsKLQotICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBBc3NldEV4dGVybmFsaXplcihjeWNsZSk7Ci0gICAgICAgICAgICBjb250ZXh0LnNldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lLCByZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgR2V0cyB0aGUgVVJMIHRvIGEgcHJpdmF0ZSByZXNvdXJjZS4gIElmIHRoZSByZXNvdXJjZSB3YXMKLSAgICAgKiAgcHJldmlvdXNseSBjb3BpZWQgb3V0IG9mIHRoZSBjbGFzc3BhdGgsIHRoZSBwcmV2aW91c2x5Ci0gICAgICogIGdlbmVyYXRlZCBVUkwgaXMgcmV0dXJuZWQuCi0gICAgICogCi0gICAgICogIDxwPklmIHRoZSBhc3NldCBkaXJlY3RvcnkgYW5kIFVSTCBhcmUgbm90IGNvbmZpZ3VyZWQsIHRoZW4KLSAgICAgKiAgcmV0dXJucyBudWxsLgotICAgICAqCi0gICAgICogIDxwPk90aGVyd2lzZSwgdGhlIGFzc2V0IGlzIGNvcGllZCBvdXQgdG8gdGhlIGFzc2V0IGRpcmVjdG9yeSwKLSAgICAgKiAgdGhlIFVSTCBpcyBjb25zdHJ1Y3RlZCAoYW5kIHJlY29yZGVkIGZvciBsYXRlcikgYW5kIHRoZSBVUkwgaXMKLSAgICAgKiAgcmV0dXJuZWQuCi0gICAgICoKLSAgICAgKiAgPHA+VGhpcyBtZXRob2QgaXMgbm90IGV4cGxpY2l0bHkgc3luY2hyb25pemVkIGJ1dCBzaG91bGQgd29yawotICAgICAqICBtdWx0aS10aHJlYWRlZC4gIEl0IHN5bmNocm9uaXplcyBvbiB0aGUgaW50ZXJuYWwKLSAgICAgKiAgPGNvZGU+TWFwPC9jb2RlPiB1c2VkIHRvIG1hcCByZXNvdXJjZSBwYXRocyB0byBVUkxzLgotICAgICAqCi0gICAgICogIEBwYXJhbSByZXNvdXJjZVBhdGggVGhlIGZ1bGwgcGF0aCBvZiB0aGUgcmVzb3VyY2Ugd2l0aGluIHRoZQotICAgICAqICBjbGFzc3BhdGguICBUaGlzIGlzIGV4cGVjdGVkIHRvIGluY2x1ZGUgYSBsZWFkaW5nIHNsYXNoLiAgRm9yCi0gICAgICogIGV4YW1wbGU6IDxjb2RlPi9jb20vc2t1bmt3b3J4L0Jhbm5lci5naWY8L2NvZGU+LgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIFN0cmluZyBnZXRVUkwoU3RyaW5nIHJlc291cmNlUGF0aCkKLSAgICB7Ci0gICAgICAgIFN0cmluZyByZXN1bHQ7Ci0KLSAgICAgICAgaWYgKF9hc3NldERpciA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgc3luY2hyb25pemVkIChfcmVzb3VyY2VzKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQgPSAoU3RyaW5nKSBfcmVzb3VyY2VzLmdldChyZXNvdXJjZVBhdGgpOwotCi0gICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLQotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXh0ZXJuYWxpemUocmVzb3VyY2VQYXRoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBleCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICBUYXBlc3RyeS5mb3JtYXQoIkFzc2V0RXh0ZXJuYWxpemVyLmV4dGVybmFsaXplLWZhaWx1cmUiLCByZXNvdXJjZVBhdGgsIF9hc3NldERpciksCi0gICAgICAgICAgICAgICAgICAgIGV4KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmVzdWx0ID0gX1VSTCArIHJlc291cmNlUGF0aDsKLQotICAgICAgICAgICAgX3Jlc291cmNlcy5wdXQocmVzb3VyY2VQYXRoLCByZXN1bHQpOwotCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9hc3NldC9Bc3NldFNlcnZpY2UuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9hc3NldC9Bc3NldFNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg3MmM2ZC4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvYXNzZXQvQXNzZXRTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjAgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuYXNzZXQ7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0LlVSTENvbm5lY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LkFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVxdWVzdEN5Y2xlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuVGFwZXN0cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5lbmdpbmUuQWJzdHJhY3RTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuZW5naW5lLklFbmdpbmVTZXJ2aWNlVmlldzsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmVuZ2luZS5JTGluazsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnJlcXVlc3QuUmVzcG9uc2VPdXRwdXRTdHJlYW07Ci0KLS8qKgotICogIEEgc2VydmljZSBmb3IgYnVpbGRpbmcgVVJMcyB0byBhbmQgYWNjZXNzaW5nIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LklBc3NldH1zLgotICogIE1vc3Qgb2YgdGhlIHdvcmsgaXMgZGVmZXJyZWQgdG8gdGhlIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LklBc3NldH0gaW5zdGFuY2UuCi0gKgotICogIDxwPlRoZSByZXRyaWV2YWwgcGFydCBpcyBkaXJlY3RseSBsaW5rZWQgdG8ge0BsaW5rIFByaXZhdGVBc3NldH0uCi0gKiAgVGhlIHNlcnZpY2UgcmVzcG9uZHMgdG8gYSBVUkwgdGhhdCBlbmNvZGVzIHRoZSBwYXRoIG9mIGEgcmVzb3VyY2UKLSAqICB3aXRoaW4gdGhlIGNsYXNzcGF0aC4gIFRoZQotICogIHtAbGluayAjc2VydmljZShJRW5naW5lU2VydmljZVZpZXcsIElSZXF1ZXN0Q3ljbGUsIFJlc3BvbnNlT3V0cHV0U3RyZWFtKX0KLSAqICBtZXRob2QgcmVhZHMgdGhlIHJlc291cmNlIGFuZCBzdHJlYW1zIGl0IG91dC4KLSAqCi0gKiAgPHA+VEJEOiBTZWN1cml0eSBpc3N1ZXMuICBTaG91bGQgb25seSBiZSBhYmxlIHRvIHJldHJpZXZlIGEKLSAqICByZXNvdXJjZSB0aGF0IHdhcyBwcmV2aW91c2x5IHJlZ2lzdGVycmVkIGluIHNvbWUgd2F5Ci0gKiAgLi4uIG90aGVyd2lzZSwgaGFja2VycyB3aWxsIGJlIGFibGUgdG8gc3VjayBvdXQgdGhlIC5jbGFzcyBmaWxlcwotICogIG9mIHRoZSBhcHBsaWNhdGlvbiEKLSAqCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogIEB2ZXJzaW9uICRJZCQKLSAqKi8KLQotcHVibGljIGNsYXNzIEFzc2V0U2VydmljZSBleHRlbmRzIEFic3RyYWN0U2VydmljZQotewotICAgIC8qKgotICAgICAqICBEZWZhdWx0cyBNSU1FIHR5cGVzLCBieSBleHRlbnNpb24sIHVzZWQgd2hlbiB0aGUgc2VydmxldCBjb250YWluZXIKLSAgICAgKiAgZG9lc24ndCBwcm92aWRlIE1JTUUgdHlwZXMuICBTZXJ2bGV0RXhlYyBEZWJ1Z2dlciwgZm9yIGV4YW1wbGUsCi0gICAgICogIGZhaWxzIHRvIGRvIHByb3ZpZGUgdGhlc2UuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBNYXAgX21pbWVUeXBlczsKLQotICAgIHN0YXRpYyB7Ci0gICAgICAgIF9taW1lVHlwZXMgPSBuZXcgSGFzaE1hcCgxNyk7Ci0gICAgICAgIF9taW1lVHlwZXMucHV0KCJjc3MiLCAidGV4dC9jc3MiKTsKLSAgICAgICAgX21pbWVUeXBlcy5wdXQoImdpZiIsICJpbWFnZS9naWYiKTsKLSAgICAgICAgX21pbWVUeXBlcy5wdXQoImpwZyIsICJpbWFnZS9qcGVnIik7Ci0gICAgICAgIF9taW1lVHlwZXMucHV0KCJqcGVnIiwgImltYWdlL2pwZWciKTsKLSAgICAgICAgX21pbWVUeXBlcy5wdXQoImh0bSIsICJ0ZXh0L2h0bWwiKTsKLSAgICAgICAgX21pbWVUeXBlcy5wdXQoImh0bWwiLCAidGV4dC9odG1sIik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJVRkZFUl9TSVpFID0gMTAyNDA7Ci0KLSAgICAvKioKLSAgICAgKiAgQnVpbGRzIGEge0BsaW5rIElMaW5rfSBmb3IgYSB7QGxpbmsgUHJpdmF0ZUFzc2V0fS4KLSAgICAgKgotICAgICAqICA8cD5BIHNpbmdsZSBwYXJhbWV0ZXIgaXMgZXhwZWN0ZWQsIHRoZSByZXNvdXJjZSBwYXRoIG9mIHRoZSBhc3NldAotICAgICAqICAod2hpY2ggaXMgZXhwZWN0ZWQgdG8gc3RhcnQgd2l0aCBhIGxlYWRpbmcgc2xhc2gpLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIElMaW5rIGdldExpbmsoSVJlcXVlc3RDeWNsZSBjeWNsZSwgSUNvbXBvbmVudCBjb21wb25lbnQsIE9iamVjdFtdIHBhcmFtZXRlcnMpCi0gICAgewotICAgICAgICBpZiAoVGFwZXN0cnkuc2l6ZShwYXJhbWV0ZXJzKSAhPSAyKQotICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICBUYXBlc3RyeS5mb3JtYXQoInNlcnZpY2UtaW5jb3JyZWN0LXBhcmFtZXRlci1jb3VudCIsIFRhcGVzdHJ5LkFTU0VUX1NFUlZJQ0UsIG5ldyBJbnRlZ2VyKDIpKSk7Ci0KLSAgICAgICAgLy8gU2VydmljZSBpcyBzdGF0ZWxlc3MKLQotICAgICAgICByZXR1cm4gY29uc3RydWN0TGluayhjeWNsZSwgVGFwZXN0cnkuQVNTRVRfU0VSVklDRSwgbnVsbCwgcGFyYW1ldGVycywgZmFsc2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0gICAgewotICAgICAgICByZXR1cm4gVGFwZXN0cnkuQVNTRVRfU0VSVklDRTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0TWltZVR5cGUoU3RyaW5nIHBhdGgpCi0gICAgewotICAgICAgICBTdHJpbmcga2V5OwotICAgICAgICBTdHJpbmcgcmVzdWx0OwotICAgICAgICBpbnQgZG90eDsKLQotICAgICAgICBkb3R4ID0gcGF0aC5sYXN0SW5kZXhPZignLicpOwotICAgICAgICBrZXkgPSBwYXRoLnN1YnN0cmluZyhkb3R4ICsgMSkudG9Mb3dlckNhc2UoKTsKLQotICAgICAgICByZXN1bHQgPSAoU3RyaW5nKSBfbWltZVR5cGVzLmdldChrZXkpOwotCi0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgICAgICAgIHJlc3VsdCA9ICJ0ZXh0L3BsYWluIjsKLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBSZXRyaWV2ZXMgYSByZXNvdXJjZSBmcm9tIHRoZSBjbGFzc3BhdGggYW5kIHJldHVybnMgaXQgdG8gdGhlCi0gICAgICogIGNsaWVudCBpbiBhIGJpbmFyeSBvdXRwdXQgc3RyZWFtLgotICAgICAqCi0gICAgICogIDxwPlRCRDogU2VjdXJpdHkgaXNzdWVzLiAgSGFja2VycyBjYW4gZG93bmxvYWQgLmNsYXNzIGZpbGVzLgotICAgICAqCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCBzZXJ2aWNlKAotICAgICAgICBJRW5naW5lU2VydmljZVZpZXcgZW5naW5lLAotICAgICAgICBJUmVxdWVzdEN5Y2xlIGN5Y2xlLAotICAgICAgICBSZXNwb25zZU91dHB1dFN0cmVhbSBvdXRwdXQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgT2JqZWN0W10gcGFyYW1ldGVycyA9IGdldFBhcmFtZXRlcnMoY3ljbGUpOwotCi0gICAgICAgIGlmIChUYXBlc3RyeS5zaXplKHBhcmFtZXRlcnMpICE9IDIpCi0gICAgICAgICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIFRhcGVzdHJ5LmZvcm1hdCgic2VydmljZS1pbmNvcnJlY3QtcGFyYW1ldGVyLWNvdW50IiwgVGFwZXN0cnkuQVNTRVRfU0VSVklDRSwgbmV3IEludGVnZXIoMikpKTsKLQotICAgICAgICBTdHJpbmcgcmVzb3VyY2VQYXRoID0gKFN0cmluZykgcGFyYW1ldGVyc1swXTsKLSAgICAgICAgU3RyaW5nIGNoZWNrc3VtID0gKFN0cmluZykgcGFyYW1ldGVyc1sxXTsKLQotICAgICAgICBVUkwgcmVzb3VyY2VVUkwgPSBlbmdpbmUuZ2V0UmVzb3VyY2VSZXNvbHZlcigpLmdldFJlc291cmNlKHJlc291cmNlUGF0aCk7Ci0KLSAgICAgICAgaWYgKHJlc291cmNlVVJMID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIFRhcGVzdHJ5LmZvcm1hdCgibWlzc2luZy1yZXNvdXJjZSIsIHJlc291cmNlUGF0aCkpOwotCi0gICAgICAgIFN0cmluZyBhY3R1YWxDaGVja3N1bSA9IGVuZ2luZS5nZXRSZXNvdXJjZUNoZWNrc3VtU291cmNlKCkuZ2V0Q2hlY2tzdW0ocmVzb3VyY2VVUkwpOwotCi0gICAgICAgIGlmICghYWN0dWFsQ2hlY2tzdW0uZXF1YWxzKGNoZWNrc3VtKSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICBUYXBlc3RyeS5mb3JtYXQoIkFzc2V0U2VydmljZS5jaGVja3N1bS1mYWlsdXJlIiwgY2hlY2tzdW0sIHJlc291cmNlUGF0aCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgVVJMQ29ubmVjdGlvbiByZXNvdXJjZUNvbm5lY3Rpb24gPSByZXNvdXJjZVVSTC5vcGVuQ29ubmVjdGlvbigpOwotCi0gICAgICAgIFNlcnZsZXRDb250ZXh0IHNlcnZsZXRDb250ZXh0ID0gY3ljbGUuZ2V0UmVxdWVzdENvbnRleHQoKS5nZXRTZXJ2bGV0KCkuZ2V0U2VydmxldENvbnRleHQoKTsKLQotICAgICAgICB3cml0ZUFzc2V0Q29udGVudChlbmdpbmUsIGN5Y2xlLCBvdXRwdXQsIHJlc291cmNlUGF0aCwgcmVzb3VyY2VDb25uZWN0aW9uLCBzZXJ2bGV0Q29udGV4dCk7Ci0gICAgfQotCi0gICAgLyoqICBAc2luY2UgMi4yICoqLwotCi0gICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXNzZXRDb250ZW50KAotICAgICAgICBJRW5naW5lU2VydmljZVZpZXcgZW5naW5lLAotICAgICAgICBJUmVxdWVzdEN5Y2xlIGN5Y2xlLAotICAgICAgICBSZXNwb25zZU91dHB1dFN0cmVhbSBvdXRwdXQsCi0gICAgICAgIFN0cmluZyByZXNvdXJjZVBhdGgsCi0gICAgICAgIFVSTENvbm5lY3Rpb24gcmVzb3VyY2VDb25uZWN0aW9uLAotICAgICAgICBTZXJ2bGV0Q29udGV4dCBzZXJ2bGV0Q29udGV4dCkKLSAgICB7Ci0gICAgICAgIC8vIEdldHRpbmcgdGhlIGNvbnRlbnQgdHlwZSBhbmQgbGVuZ3RoIGlzIHZlcnkgZGVwZW5kYW50Ci0gICAgICAgIC8vIG9uIHN1cHBvcnQgZnJvbSB0aGUgYXBwbGljYXRpb24gc2VydmVyIChyZXByZXNlbnRlZAotICAgICAgICAvLyBoZXJlIGJ5IHRoZSBzZXJ2bGV0Q29udGV4dCkuCi0KLSAgICAgICAgU3RyaW5nIGNvbnRlbnRUeXBlID0gc2VydmxldENvbnRleHQuZ2V0TWltZVR5cGUocmVzb3VyY2VQYXRoKTsKLSAgICAgICAgaW50IGNvbnRlbnRMZW5ndGggPSByZXNvdXJjZUNvbm5lY3Rpb24uZ2V0Q29udGVudExlbmd0aCgpOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoY29udGVudExlbmd0aCA+IDApCi0gICAgICAgICAgICAgICAgY3ljbGUuZ2V0UmVxdWVzdENvbnRleHQoKS5nZXRSZXNwb25zZSgpLnNldENvbnRlbnRMZW5ndGgoY29udGVudExlbmd0aCk7Ci0KLSAgICAgICAgICAgIC8vIFNldCB0aGUgY29udGVudCB0eXBlLiAgSWYgdGhlIHNlcnZsZXQgY29udGFpbmVyIGRvZXNuJ3QKLSAgICAgICAgICAgIC8vIHByb3ZpZGUgaXQsIHRyeSBhbmQgZ3Vlc3MgaXQgYnkgdGhlIGV4dGVuc2lvbi4KLQotICAgICAgICAgICAgaWYgKGNvbnRlbnRUeXBlID09IG51bGwgfHwgY29udGVudFR5cGUubGVuZ3RoKCkgPT0gMCkKLSAgICAgICAgICAgICAgICBjb250ZW50VHlwZSA9IGdldE1pbWVUeXBlKHJlc291cmNlUGF0aCk7Ci0KLSAgICAgICAgICAgIG91dHB1dC5zZXRDb250ZW50VHlwZShjb250ZW50VHlwZSk7Ci0KLSAgICAgICAgICAgIC8vIERpc2FibGUgYW55IGZ1cnRoZXIgYnVmZmVyaW5nIGluc2lkZSB0aGUgUmVzcG9uc2VPdXRwdXRTdHJlYW0KLQotICAgICAgICAgICAgb3V0cHV0LmZvcmNlRmx1c2goKTsKLQotICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW5wdXQgPSByZXNvdXJjZUNvbm5lY3Rpb24uZ2V0SW5wdXRTdHJlYW0oKTsKLQotICAgICAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlW0JVRkZFUl9TSVpFXTsKLQotICAgICAgICAgICAgd2hpbGUgKHRydWUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IGJ5dGVzUmVhZCA9IGlucHV0LnJlYWQoYnVmZmVyKTsKLQotICAgICAgICAgICAgICAgIGlmIChieXRlc1JlYWQgPCAwKQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIG91dHB1dC53cml0ZShidWZmZXIsIDAsIGJ5dGVzUmVhZCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlucHV0LmNsb3NlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSBleCkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIHRpdGxlID0gVGFwZXN0cnkuZm9ybWF0KCJBc3NldFNlcnZpY2UuZXhjZXB0aW9uLXJlcG9ydC10aXRsZSIsIHJlc291cmNlUGF0aCk7Ci0KLSAgICAgICAgICAgIGVuZ2luZS5yZXBvcnRFeGNlcHRpb24odGl0bGUsIGV4KTsKLSAgICAgICAgfQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvYXNzZXQvQ29udGV4dEFzc2V0LmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvYXNzZXQvQ29udGV4dEFzc2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjNjI1MTAuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2Fzc2V0L0NvbnRleHRBc3NldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuYXNzZXQ7Ci0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUFzc2V0OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUVuZ2luZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklMb2NhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZXF1ZXN0Q3ljbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5UYXBlc3RyeTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnJlc291cmNlLkNvbnRleHRSZXNvdXJjZUxvY2F0aW9uOwotCi0vKioKLSAqICBBbiBhc3NldCB3aG9zZSBwYXRoIGlzIHJlbGF0aXZlIHRvIHRoZSB7QGxpbmsgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dH0gY29udGFpbmluZwotICogIHRoZSBhcHBsaWNhdGlvbi4KLSAqCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogIEB2ZXJzaW9uICRJZCQKLSAqKi8KLQotcHVibGljIGNsYXNzIENvbnRleHRBc3NldCBleHRlbmRzIEFic3RyYWN0QXNzZXQgaW1wbGVtZW50cyBJQXNzZXQKLXsKLSAgICBwcml2YXRlIFN0cmluZyBfcmVzb2x2ZWRVUkw7Ci0KLSAgICBwdWJsaWMgQ29udGV4dEFzc2V0KENvbnRleHRSZXNvdXJjZUxvY2F0aW9uIHJlc291cmNlTG9jYXRpb24sIElMb2NhdGlvbiBsb2NhdGlvbikKLSAgICB7Ci0gICAgICAgIHN1cGVyKHJlc291cmNlTG9jYXRpb24sIGxvY2F0aW9uKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgR2VuZXJhdGVzIGEgVVJMIGZvciB0aGUgY2xpZW50IHRvIHJldHJpZXZlIHRoZSBhc3NldC4gIFRoZSBjb250ZXh0IHBhdGgKLSAgICAgKiAgaXMgcHJlcGVuZGVkIHRvIHRoZSBhc3NldCBwYXRoLCB3aGljaCBtZWFucyB0aGF0IGFzc2V0cyBkZXBsb3llZCBpbnNpZGUKLSAgICAgKiAgd2ViIGFwcGxpY2F0aW9ucyB3aWxsIHN0aWxsIHdvcmsgKGlmIHRoaW5ncyBhcmUgY29uZmlndXJlZCBwcm9wZXJseSkuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgU3RyaW5nIGJ1aWxkVVJMKElSZXF1ZXN0Q3ljbGUgY3ljbGUpCi0gICAgewotICAgICAgICBpZiAoX3Jlc29sdmVkVVJMID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIElFbmdpbmUgZW5naW5lID0gY3ljbGUuZ2V0RW5naW5lKCk7Ci0gICAgICAgICAgICBTdHJpbmcgY29udGV4dFBhdGggPSBlbmdpbmUuZ2V0Q29udGV4dFBhdGgoKTsKLQotICAgICAgICAgICAgX3Jlc29sdmVkVVJMID0gY29udGV4dFBhdGggKyBnZXRSZXNvdXJjZUxvY2F0aW9uKCkuZ2V0UGF0aCgpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gX3Jlc29sdmVkVVJMOwotICAgIH0KLQotICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRSZXNvdXJjZUFzU3RyZWFtKElSZXF1ZXN0Q3ljbGUgY3ljbGUpCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgVVJMIHVybCA9IGdldFJlc291cmNlTG9jYXRpb24oKS5nZXRSZXNvdXJjZVVSTCgpOwotCi0gICAgICAgICAgICByZXR1cm4gdXJsLm9wZW5TdHJlYW0oKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIFRhcGVzdHJ5LmZvcm1hdCgiQ29udGV4dEFzc2V0LnJlc291cmNlLW1pc3NpbmciLCBnZXRSZXNvdXJjZUxvY2F0aW9uKCkpLAotICAgICAgICAgICAgICAgIGV4KTsKLSAgICAgICAgfQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvYXNzZXQvRXh0ZXJuYWxBc3NldC5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2Fzc2V0L0V4dGVybmFsQXNzZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzViNGM2ZS4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvYXNzZXQvRXh0ZXJuYWxBc3NldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuYXNzZXQ7Ci0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUxvY2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlcXVlc3RDeWNsZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LlRhcGVzdHJ5OwotCi0vKioKLSAqICBBIHJlZmVyZW5jZSB0byBhbiBleHRlcm5hbCBVUkwuICB7QGxpbmsgRXh0ZXJuYWxBc3NldH1zIGFyZSBub3QKLSAqICBsb2NhbGl6YWJsZS4KLSAqCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogIEB2ZXJzaW9uICRJZCQKLSAqIAotICoqLwotCi1wdWJsaWMgY2xhc3MgRXh0ZXJuYWxBc3NldCBleHRlbmRzIEFic3RyYWN0QXNzZXQKLXsKLSAgICBwcml2YXRlIFN0cmluZyBfVVJMOwotCi0gICAgcHVibGljIEV4dGVybmFsQXNzZXQoU3RyaW5nIFVSTCwgSUxvY2F0aW9uIGxvY2F0aW9uKQotICAgIHsKLSAgICAJc3VwZXIobnVsbCwgbG9jYXRpb24pOwotICAgIAkKLSAgICAgICAgX1VSTCA9IFVSTDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgU2ltcGx5IHJldHVybnMgdGhlIFVSTCBvZiB0aGUgZXh0ZXJuYWwgYXNzZXQuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgU3RyaW5nIGJ1aWxkVVJMKElSZXF1ZXN0Q3ljbGUgY3ljbGUpCi0gICAgewotICAgICAgICByZXR1cm4gX1VSTDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0UmVzb3VyY2VBc1N0cmVhbShJUmVxdWVzdEN5Y2xlIGN5Y2xlKQotICAgIHsKLSAgICAgICAgVVJMIHVybDsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgdXJsID0gbmV3IFVSTChfVVJMKTsKLQotICAgICAgICAgICAgcmV0dXJuIHVybC5vcGVuU3RyZWFtKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gTWFscmZvcm1lZFVSTEV4Y2VwdGlvbiBvciBJT0V4Y2VwdGlvbgotCi0gICAgICAgICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uKFRhcGVzdHJ5LmZvcm1hdCgiRXh0ZXJuYWxBc3NldC5yZXNvdXJjZS1taXNzaW5nIiwgX1VSTCksIGV4KTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gICAgewotICAgICAgICByZXR1cm4gIkV4dGVybmFsQXNzZXRbIiArIF9VUkwgKyAiXSI7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9hc3NldC9Qcml2YXRlQXNzZXQuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9hc3NldC9Qcml2YXRlQXNzZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmUyYTcwMS4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvYXNzZXQvUHJpdmF0ZUFzc2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuYXNzZXQ7Ci0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUVuZ2luZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklMb2NhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZXF1ZXN0Q3ljbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVzb3VyY2VMb2NhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LlRhcGVzdHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuZW5naW5lLklMaW5rOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkucmVzb3VyY2UuQ2xhc3NwYXRoUmVzb3VyY2VMb2NhdGlvbjsKLQotLyoqCi0gKiAgQW4gaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkuSUFzc2V0fSBmb3IgbG9jYWxpemFibGUgYXNzZXRzIHdpdGhpbgotICogIHRoZSBKVk0ncyBjbGFzc3BhdGguCi0gKgotICogIDxwPlRoZSBsb2NhbGl6YXRpb24gY29kZSBoZXJlIGlzIGxhcmdlbHkgY3V0LWFuZC1wYXN0ZSBmcm9tCi0gKiAge0BsaW5rIENvbnRleHRBc3NldH0uCi0gKgotICogIEBhdXRob3IgSG93YXJkIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAKLSAqKi8KLQotcHVibGljIGNsYXNzIFByaXZhdGVBc3NldCBleHRlbmRzIEFic3RyYWN0QXNzZXQKLXsKLQotICAgIHByaXZhdGUgQXNzZXRFeHRlcm5hbGl6ZXIgX2V4dGVybmFsaXplcjsKLQotICAgIHB1YmxpYyBQcml2YXRlQXNzZXQoQ2xhc3NwYXRoUmVzb3VyY2VMb2NhdGlvbiByZXNvdXJjZUxvY2F0aW9uLCBJTG9jYXRpb24gbG9jYXRpb24pCi0gICAgewotICAgICAgICBzdXBlcihyZXNvdXJjZUxvY2F0aW9uLCBsb2NhdGlvbik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEdldHMgdGhlIGxvY2FsaXplZCB2ZXJzaW9uIG9mIHRoZSByZXNvdXJjZS4gIEJ1aWxkCi0gICAgICogIHRoZSBVUkwgZm9yIHRoZSByZXNvdXJjZS4gIElmIHBvc3NpYmxlLCB0aGUgYXBwbGljYXRpb24ncwotICAgICAqICB7QGxpbmsgQXNzZXRFeHRlcm5hbGl6ZXJ9IGlzIGxvY2F0ZWQsIHRvIGNvcHkgdGhlIHJlc291cmNlIHRvCi0gICAgICogIGEgZGlyZWN0b3J5IHZpc2libGUgdG8gdGhlIHdlYiBzZXJ2ZXIuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgU3RyaW5nIGJ1aWxkVVJMKElSZXF1ZXN0Q3ljbGUgY3ljbGUpCi0gICAgewotICAgICAgICBpZiAoX2V4dGVybmFsaXplciA9PSBudWxsKQotICAgICAgICAgICAgX2V4dGVybmFsaXplciA9IEFzc2V0RXh0ZXJuYWxpemVyLmdldChjeWNsZSk7Ci0KLSAgICAgICAgU3RyaW5nIHBhdGggPSBnZXRSZXNvdXJjZUxvY2F0aW9uKCkuZ2V0UGF0aCgpOwotCi0gICAgICAgIFN0cmluZyBleHRlcm5hbFVSTCA9IF9leHRlcm5hbGl6ZXIuZ2V0VVJMKHBhdGgpOwotCi0gICAgICAgIGlmIChleHRlcm5hbFVSTCAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGV4dGVybmFsVVJMOwotCi0gICAgICAgIC8vIE90aGVyd2lzZSwgdGhlIHNlcnZpY2UgaXMgcmVzcG9uc2libGUgZm9yIGR5bmFtaWNhbGx5IHJldHJpZXZpbmcgdGhlCi0gICAgICAgIC8vIHJlc291cmNlLgotCi0gICAgICAgIElFbmdpbmUgZW5naW5lID0gY3ljbGUuZ2V0RW5naW5lKCk7Ci0gICAgICAgIAotICAgICAgICBVUkwgcmVzb3VyY2VVUkwgPSBlbmdpbmUuZ2V0UmVzb3VyY2VSZXNvbHZlcigpLmdldFJlc291cmNlKHBhdGgpOwotICAgICAgICBTdHJpbmcgY2hlY2tzdW0gPSBlbmdpbmUuZ2V0UmVzb3VyY2VDaGVja3N1bVNvdXJjZSgpLmdldENoZWNrc3VtKHJlc291cmNlVVJMKTsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZ1tdIHBhcmFtZXRlcnMgPSBuZXcgU3RyaW5nW10geyBwYXRoLCBjaGVja3N1bSB9OwotCi0gICAgICAgIEFzc2V0U2VydmljZSBzZXJ2aWNlID0gKEFzc2V0U2VydmljZSkgZW5naW5lLmdldFNlcnZpY2UoVGFwZXN0cnkuQVNTRVRfU0VSVklDRSk7Ci0gICAgICAgIElMaW5rIGxpbmsgPSBzZXJ2aWNlLmdldExpbmsoY3ljbGUsIG51bGwsIHBhcmFtZXRlcnMpOwotCi0gICAgICAgIHJldHVybiBsaW5rLmdldFVSTCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRSZXNvdXJjZUFzU3RyZWFtKElSZXF1ZXN0Q3ljbGUgY3ljbGUpCi0gICAgewotICAgICAgICBJUmVzb3VyY2VMb2NhdGlvbiBsb2NhdGlvbiA9IGdldFJlc291cmNlTG9jYXRpb24oKTsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgVVJMIHVybCA9IGxvY2F0aW9uLmdldFJlc291cmNlVVJMKCk7Ci0KLSAgICAgICAgICAgIHJldHVybiB1cmwub3BlblN0cmVhbSgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgVGFwZXN0cnkuZm9ybWF0KCJQcml2YXRlQXNzZXQucmVzb3VyY2UtbWlzc2luZyIsIGxvY2F0aW9uKSwKLSAgICAgICAgICAgICAgICBleCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvYXNzZXQvUmVzb3VyY2VDaGVja3N1bVNvdXJjZS5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2Fzc2V0L1Jlc291cmNlQ2hlY2tzdW1Tb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmMyMWZlOC4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvYXNzZXQvUmVzb3VyY2VDaGVja3N1bVNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDQsIDIwMDUgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5hc3NldDsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotLyoqCi0gKiBDYWxjdWxhdGVzIHRoZSBjaGVja3N1bSB2YWx1ZSwgYXMgYSBzdHJpbmcsIGZvciBhIHBhcnRpY3VsYXIgY2xhc3NwYXRoIHJlc291cmNlLiBUaGlzIGlzIHByaW1hcmlseQotICogdXNlZCBieSB0aGUge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkuYXNzZXQuQXNzZXRTZXJ2aWNlfSB0byBhdXRoZW50aWNhdGUgcmVxdWVzdHMgKHlvdSBhcmUgbm90Ci0gKiBhbGxvd2VkIGFjY2VzcyB0byBhIHJlc291cmNlIHVubGVzcyB5b3UgY2FuIHByb3ZpZGUgdGhlIGNvcnJlY3QgY2hlY2tzdW0gdmFsdWUpLgotICogCi0gKiBUaGlzIGNvZGUgaXMgYmFzZWQgb24gY29kZSBmcm9tIEhvd2FyZCBMZXdpcyBTaGlwIGZyb20gdGhlIHVwY29taW5nIDMuMSByZWxlYXNlLgotICogCi0gKiBAYXV0aG9yICBQYXVsIEZlcnJhcm8KLSAqIEBzaW5jZSAgIDMuMC4zCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUmVzb3VyY2VDaGVja3N1bVNvdXJjZQotewotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNoZWNrc3VtIHZhbHVlIGZvciB0aGUgZ2l2ZW4gcmVzb3VyY2UuCi0gICAgICogQHBhcmFtIHJlc291cmNlVVJMIHRoZSB1cmwgb2YgYSByZXNvdXJjZQotICAgICAqIEByZXR1cm4gdGhlIGNoZWNrc3VtIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldENoZWNrc3VtKFVSTCByZXNvdXJjZVVSTCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ2xlYXJzIHRoZSBpbnRlcm5hbCBjYWNoZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZXNldCgpOwotfQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2Fzc2V0L1Jlc291cmNlQ2hlY2tzdW1Tb3VyY2VJbXBsLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvYXNzZXQvUmVzb3VyY2VDaGVja3N1bVNvdXJjZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzkwMTVlMi4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvYXNzZXQvUmVzb3VyY2VDaGVja3N1bVNvdXJjZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vL0NvcHlyaWdodCAyMDA1IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuYXNzZXQ7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29kZWMuQmluYXJ5RW5jb2RlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LkFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LlRhcGVzdHJ5OwotCi0vKioKLSAqIEltcGxlbWVudGF0aW9uIG9mIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LmFzc2V0LlJlc291cmNlRGlnZXN0U291cmNlfSB0aGF0IGNhbGN1bGF0ZXMgYW4KLSAqIGNoZWNrc3VtIHVzaW5nIGEgbWVzc2FnZSBkaWdlc3QgYW5kIGNvbmZpZ3VyZWQgZW5jb2Rlci4KLSAqIAotICogVGhpcyBjb2RlIGlzIGJhc2VkIG9uIGNvZGUgZnJvbSBIb3dhcmQgTGV3aXMgU2hpcCBmcm9tIHRoZSB1cGNvbWluZyAzLjEgcmVsZWFzZS4KLSAqIAotICogQGF1dGhvciBQYXVsIEZlcnJhcm8KLSAqIEBzaW5jZSAzLjAuMwotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VDaGVja3N1bVNvdXJjZUltcGwgaW1wbGVtZW50cyBSZXNvdXJjZUNoZWNrc3VtU291cmNlCi17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJVRkZFUl9TSVpFID0gNDA5NjsKLQotICAgIHByaXZhdGUgTWFwIF9jYWNoZSA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgCi0gICAgcHJpdmF0ZSBTdHJpbmcgX2RpZ2VzdEFsZ29yaXRobTsKLQotICAgIHByaXZhdGUgQmluYXJ5RW5jb2RlciBfZW5jb2RlcjsKLSAgICAKLSAgICBwdWJsaWMgUmVzb3VyY2VDaGVja3N1bVNvdXJjZUltcGwoU3RyaW5nIGRpZ2VzdEFsZ29yaXRobSwgQmluYXJ5RW5jb2RlciBlbmNvZGVyKQotICAgIHsKLSAgICAgICAgX2RpZ2VzdEFsZ29yaXRobSA9IGRpZ2VzdEFsZ29yaXRobTsKLSAgICAgICAgX2VuY29kZXIgPSBlbmNvZGVyOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDaGVja3N1bSBpcyBvYnRhaW5lZCBmcm9tIGNhY2hlIGlmIHBvc3NpYmxlLgotICAgICAqIElmIG5vdCwgY2hlY2tzdW0gaXMgY29tcHV0ZWQgdXNpbmcge0BsaW5rICNjb21wdXRlQ2hlY2tzdW0oVVJMKX0KLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUudGFwZXN0cnkuYXNzZXQuUmVzb3VyY2VEaWdlc3RTb3VyY2UjZ2V0Q2hlY2tzdW0oamF2YS5uZXQuVVJMKQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2hlY2tzdW0oVVJMIHJlc291cmNlVVJMKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkIChfY2FjaGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBjaGVja3N1bSA9IChTdHJpbmcpIF9jYWNoZS5nZXQocmVzb3VyY2VVUkwpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoY2hlY2tzdW0gPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjaGVja3N1bSA9IGNvbXB1dGVDaGVja3N1bShyZXNvdXJjZVVSTCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgX2NhY2hlLnB1dChyZXNvdXJjZVVSTCwgY2hlY2tzdW0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gY2hlY2tzdW07Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmFzc2V0LlJlc291cmNlRGlnZXN0U291cmNlI3Jlc2V0KCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZXNldCgpCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKF9jYWNoZSkKLSAgICAgICAgewotICAgICAgICAgICAgX2NhY2hlLmNsZWFyKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ29tcHV0ZXMgYSBtZXNzYWdlIGRpZ2VzdCBvZiB0aGUgc3BlY2lmaWVkIHJlc291cmNlIGFuZCBlbmNvZGVzIGl0IGludG8gYSBzdHJpbmcuCi0gICAgICogQHBhcmFtIHJlc291cmNlVVJMIHRoZSB1cmwgb2YgYSByZXNvdXJjZQotICAgICAqIEByZXR1cm4gdGhlIGNoZWNrc3VtIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGNvbXB1dGVDaGVja3N1bShVUkwgcmVzb3VyY2VVUkwpCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotCSAgICAgICAgTWVzc2FnZURpZ2VzdCBkaWdlc3QgPSBNZXNzYWdlRGlnZXN0LmdldEluc3RhbmNlKF9kaWdlc3RBbGdvcml0aG0pOwotCSAgICAgICAgCi0JICAgICAgICBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKHJlc291cmNlVVJMLm9wZW5TdHJlYW0oKSwgQlVGRkVSX1NJWkUpOwotCSAgICAgICAgCi0JICAgICAgICBieXRlW10gYmxvY2sgPSBuZXcgYnl0ZVtCVUZGRVJfU0laRV07Ci0JICAgICAgICAKLQkgICAgICAgIGludCByZWFkID0gaW5wdXRTdHJlYW0ucmVhZChibG9jayk7Ci0JICAgICAgICAKLQkgICAgICAgIHdoaWxlIChyZWFkID49IDApCi0JICAgICAgICB7Ci0JICAgICAgICAgICAgZGlnZXN0LnVwZGF0ZShibG9jaywgMCwgcmVhZCk7Ci0JICAgICAgICAgICAgCi0JICAgICAgICAgICAgcmVhZCA9IGlucHV0U3RyZWFtLnJlYWQoYmxvY2spOwotCSAgICAgICAgfQotCSAgICAgICAgCi0JICAgICAgICBpbnB1dFN0cmVhbS5jbG9zZSgpOwotCSAgICAgICAgCi0JICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhfZW5jb2Rlci5lbmNvZGUoZGlnZXN0LmRpZ2VzdCgpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIFRhcGVzdHJ5LmZvcm1hdCgiQXNzZXRTZXJ2aWNlLmNoZWNrc3VtLWNvbXB1dGUtZmFpbHVyZSIsIHJlc291cmNlVVJMKSwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2Fzc2V0L3BhY2thZ2UuaHRtbCBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9hc3NldC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiMWFjODAuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2Fzc2V0L3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLTwhZG9jdHlwZSBodG1sIHB1YmxpYyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci08IS0tICRJZCQgLS0+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlRhcGVzdHJ5OiBXZWIgQXBwbGljYXRpb24gRnJhbWV3b3JrPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotCi08cD5JbXBsZW1lbnRhdGlvbnMgb2Yge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkuSUFzc2V0fSwgYXMgd2VsbCBhcwotdGhlIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LmFzc2V0LkFzc2V0RXh0ZXJuYWxpemVyfSwgdXNlZCB0byBoYW5kbGUgcHJpdmF0ZSBhc3NldHMuCi0KLUBhdXRob3IgSG93YXJkIExld2lzIFNoaXAgPGEgaHJlZj0ibWFpbHRvOmhsc2hpcEBhcGFjaGUub3JnIj5obHNoaXBAYXBhY2hlLm9yZzwvYT4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2JlYW4vQWJzdHJhY3RCZWFuSW5pdGlhbGl6ZXIuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9iZWFuL0Fic3RyYWN0QmVhbkluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlYzFkMDguLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2JlYW4vQWJzdHJhY3RCZWFuSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmJlYW47Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LkFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZXNvdXJjZVJlc29sdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuVGFwZXN0cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5zcGVjLkJhc2VMb2NhdGFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS51dGlsLnByb3AuT2dubFV0aWxzOwotCi0vKioKLSAqICBCYXNlIGNsYXNzIGZvciBpbml0aWFsaXppbmcgYSBwcm9wZXJ0eSBvZiBhIEphdmFCZWFuLgotICoKLSAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiAgQHZlcnNpb24gJElkJAotICogIEBzaW5jZSAxLjAuNQotICogCi0gKiovCi0KLWFic3RyYWN0IHB1YmxpYyBjbGFzcyBBYnN0cmFjdEJlYW5Jbml0aWFsaXplciBleHRlbmRzIEJhc2VMb2NhdGFibGUgaW1wbGVtZW50cyBJQmVhbkluaXRpYWxpemVyCi17Ci0gICAgcHJvdGVjdGVkIFN0cmluZyBfcHJvcGVydHlOYW1lOwotCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eU5hbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9wcm9wZXJ0eU5hbWU7Ci0gICAgfQotCi0gICAgLyoqIEBzaW5jZSAzLjAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eU5hbWUoU3RyaW5nIHByb3BlcnR5TmFtZSkKLSAgICB7Ci0gICAgICAgIF9wcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWU7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0QmVhblByb3BlcnR5KElSZXNvdXJjZVJlc29sdmVyIHJlc29sdmVyLCBPYmplY3QgYmVhbiwgT2JqZWN0IHZhbHVlKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIE9nbmxVdGlscy5zZXQoX3Byb3BlcnR5TmFtZSwgcmVzb2x2ZXIsIGJlYW4sIHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uIGV4KQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9Ci0gICAgICAgICAgICAgICAgVGFwZXN0cnkuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAiQWJzdHJhY3RCZWFuSW5pdGlhbGl6ZXIudW5hYmxlLXRvLXNldC1wcm9wZXJ0eSIsCi0gICAgICAgICAgICAgICAgICAgIF9wcm9wZXJ0eU5hbWUsCi0gICAgICAgICAgICAgICAgICAgIGJlYW4sCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlKTsKLQotICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbihtZXNzYWdlLCBnZXRMb2NhdGlvbigpLCBleCk7Ci0gICAgICAgIH0KLQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvYmVhbi9CZWFuUHJvdmlkZXIuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9iZWFuL0JlYW5Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjVkMDgxLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9iZWFuL0JlYW5Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE5ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmJlYW47Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUJlYW5Qcm92aWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JRW5naW5lOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlc291cmNlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5UYXBlc3RyeTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmV2ZW50LlBhZ2VEZXRhY2hMaXN0ZW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmV2ZW50LlBhZ2VFdmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmV2ZW50LlBhZ2VSZW5kZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnNwZWMuQmVhbkxpZmVjeWNsZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnNwZWMuSUJlYW5TcGVjaWZpY2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuc3BlYy5JQ29tcG9uZW50U3BlY2lmaWNhdGlvbjsKLQotLyoqCi0gKiAgQmFzaWMgaW1wbGVtZW50YXRpb24gb2YgdGhlIHtAbGluayBJQmVhblByb3ZpZGVyfSBpbnRlcmZhY2UuCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQHNpbmNlIDEuMC40Ci0gKiovCi0KLXB1YmxpYyBjbGFzcyBCZWFuUHJvdmlkZXIgaW1wbGVtZW50cyBJQmVhblByb3ZpZGVyLCBQYWdlRGV0YWNoTGlzdGVuZXIsIFBhZ2VSZW5kZXJMaXN0ZW5lcgotewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBMT0cgPSBMb2dGYWN0b3J5LmdldExvZyhCZWFuUHJvdmlkZXIuY2xhc3MpOwotCi0gICAgLyoqCi0gICAgICogIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgaW5zdGFuY2UgaGFzIGJlZW4gcmVnaXN0ZXJlZCB3aXRoIGl0cwotICAgICAqICBwYWdlIGFzIGEgUGFnZURldGFjaExpc3RlbmVyLiAgUmVnaXN0cmF0aW9uIG9ubHkgb2NjdXJzCi0gICAgICogIHRoZSBmaXJzdCB0aW1lIGEgYmVhbiB3aXRoIGxpZmVjeWNsZSBSRVFVRVNUIGlzIGluc3RhbnRpYXRlZC4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHByaXZhdGUgYm9vbGVhbiBfcmVnaXN0ZXJlZEZvckRldGFjaCA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICogIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgaW5zdGFuY2UgaGFzIGJlZW4gcmVnaXN0ZXJlZCBhcyBhIHJlbmRlcgotICAgICAqICBsaXN0ZW5lciB3aXRoIHRoZSBwYWdlLgotICAgICAqIAotICAgICAqKi8KLQotICAgIHByaXZhdGUgYm9vbGVhbiBfcmVnaXN0ZXJlZEZvclJlbmRlciA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICogIFRoZSBjb21wb25lbnQgZm9yIHdoaWNoIGJlYW5zIGFyZSBiZWluZyBjcmVhdGVkIGFuZCB0cmFja2VkLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHJpdmF0ZSBJQ29tcG9uZW50IF9jb21wb25lbnQ7Ci0KLSAgICAvKioKLSAgICAgKiAgVXNlZCBmb3IgaW5zdGFudGlhdGluZyBjbGFzc2VzLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHJpdmF0ZSBJUmVzb3VyY2VSZXNvbHZlciBfcmVzb2x2ZXI7Ci0KLSAgICAvKioKLSAgICAgKiAgTWFwIG9mIGJlYW5zLCBrZXllZCBvbiBuYW1lLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHJpdmF0ZSBNYXAgX2JlYW5zOwotCi0gICAgLyoqCi0gICAgICogIFNldCBvZiBiZWFuIG5hbWVzIHByb3ZpZGVkIGJ5IHRoaXMgcHJvdmlkZXIuCi0gICAgICogCi0gICAgICogIEBzaW5jZSAyLjIKLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwcml2YXRlIFNldCBfYmVhbk5hbWVzOwotCi0gICAgcHVibGljIEJlYW5Qcm92aWRlcihJQ29tcG9uZW50IGNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIHRoaXMuX2NvbXBvbmVudCA9IGNvbXBvbmVudDsKLSAgICAgICAgSUVuZ2luZSBlbmdpbmUgPSBjb21wb25lbnQuZ2V0UGFnZSgpLmdldEVuZ2luZSgpOwotICAgICAgICBfcmVzb2x2ZXIgPSBlbmdpbmUuZ2V0UmVzb3VyY2VSZXNvbHZlcigpOwotCi0gICAgICAgIGlmIChMT0cuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgICAgIExPRy5kZWJ1ZygiQ3JlYXRlZCBCZWFuUHJvdmlkZXIgZm9yICIgKyBjb21wb25lbnQpOwotCi0gICAgfQotCi0gICAgLyoqIEBzaW5jZSAxLjAuNiAqKi8KLQotICAgIHB1YmxpYyBDb2xsZWN0aW9uIGdldEJlYW5OYW1lcygpCi0gICAgewotICAgICAgICBpZiAoX2JlYW5OYW1lcyA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBDb2xsZWN0aW9uIGMgPSBfY29tcG9uZW50LmdldFNwZWNpZmljYXRpb24oKS5nZXRCZWFuTmFtZXMoKTsKLQotICAgICAgICAgICAgaWYgKGMgPT0gbnVsbCB8fCBjLmlzRW1wdHkoKSkKLSAgICAgICAgICAgICAgICBfYmVhbk5hbWVzID0gQ29sbGVjdGlvbnMuRU1QVFlfU0VUOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIF9iZWFuTmFtZXMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQobmV3IEhhc2hTZXQoYykpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIF9iZWFuTmFtZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEBzaW5jZSAxLjAuNQotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIElDb21wb25lbnQgZ2V0Q29tcG9uZW50KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfY29tcG9uZW50OwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0QmVhbihTdHJpbmcgbmFtZSkKLSAgICB7Ci0gICAgICAgIE9iamVjdCBiZWFuID0gbnVsbDsKLQotICAgICAgICBpZiAoX2JlYW5zICE9IG51bGwpCi0gICAgICAgICAgICBiZWFuID0gX2JlYW5zLmdldChuYW1lKTsKLQotICAgICAgICBpZiAoYmVhbiAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGJlYW47Ci0KLSAgICAgICAgSUJlYW5TcGVjaWZpY2F0aW9uIHNwZWMgPSBfY29tcG9uZW50LmdldFNwZWNpZmljYXRpb24oKS5nZXRCZWFuU3BlY2lmaWNhdGlvbihuYW1lKTsKLQotICAgICAgICBpZiAoc3BlYyA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICBUYXBlc3RyeS5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICJCZWFuUHJvdmlkZXIuYmVhbi1ub3QtZGVmaW5lZCIsCi0gICAgICAgICAgICAgICAgICAgIF9jb21wb25lbnQuZ2V0RXh0ZW5kZWRJZCgpLAotICAgICAgICAgICAgICAgICAgICBuYW1lKSk7Ci0KLSAgICAgICAgYmVhbiA9IGluc3RhbnRpYXRlQmVhbihuYW1lLCBzcGVjKTsKLQotICAgICAgICBCZWFuTGlmZWN5Y2xlIGxpZmVjeWNsZSA9IHNwZWMuZ2V0TGlmZWN5Y2xlKCk7Ci0KLSAgICAgICAgaWYgKGxpZmVjeWNsZSA9PSBCZWFuTGlmZWN5Y2xlLk5PTkUpCi0gICAgICAgICAgICByZXR1cm4gYmVhbjsKLQotICAgICAgICBpZiAoX2JlYW5zID09IG51bGwpCi0gICAgICAgICAgICBfYmVhbnMgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgICAgIF9iZWFucy5wdXQobmFtZSwgYmVhbik7Ci0KLSAgICAgICAgLy8gVGhlIGZpcnN0IHRpbWUgaW4gYSByZXF1ZXN0IHRoYXQgYSBSRVFVRVNUIGxpZmVjeWNsZSBiZWFuIGlzIGNyZWF0ZWQsCi0gICAgICAgIC8vIHJlZ2lzdGVyIHdpdGggdGhlIHBhZ2UgdG8gYmUgbm90aWZpZWQgYXQgdGhlIGVuZCBvZiB0aGUKLSAgICAgICAgLy8gcmVxdWVzdCBjeWNsZS4KLQotICAgICAgICBpZiAobGlmZWN5Y2xlID09IEJlYW5MaWZlY3ljbGUuUkVRVUVTVCAmJiAhX3JlZ2lzdGVyZWRGb3JEZXRhY2gpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9jb21wb25lbnQuZ2V0UGFnZSgpLmFkZFBhZ2VEZXRhY2hMaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgICAgIF9yZWdpc3RlcmVkRm9yRGV0YWNoID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChsaWZlY3ljbGUgPT0gQmVhbkxpZmVjeWNsZS5SRU5ERVIgJiYgIV9yZWdpc3RlcmVkRm9yUmVuZGVyKQotICAgICAgICB7Ci0gICAgICAgICAgICBfY29tcG9uZW50LmdldFBhZ2UoKS5hZGRQYWdlUmVuZGVyTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgICAgICBfcmVnaXN0ZXJlZEZvclJlbmRlciA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBObyBuZWVkIHRvIHJlZ2lzdGVyIGlmIGEgUEFHRSBsaWZlY3ljbGUgYmVhbjsgdGhvc2UgY2FuIHN0aWNrIGFyb3VuZAotICAgICAgICAvLyBmb3JldmVyLgotCi0gICAgICAgIHJldHVybiBiZWFuOwotICAgIH0KLQotICAgIHByaXZhdGUgT2JqZWN0IGluc3RhbnRpYXRlQmVhbihTdHJpbmcgYmVhbk5hbWUsIElCZWFuU3BlY2lmaWNhdGlvbiBzcGVjKQotICAgIHsKLSAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IHNwZWMuZ2V0Q2xhc3NOYW1lKCk7Ci0gICAgICAgIE9iamVjdCBiZWFuID0gbnVsbDsKLQotICAgICAgICBpZiAoTE9HLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgICAgICBMT0cuZGVidWcoIkluc3RhbnRpYXRpbmcgaW5zdGFuY2Ugb2YgIiArIGNsYXNzTmFtZSk7Ci0KLSAgICAgICAgLy8gRG8gaXQgdGhlIGhhcmQgd2F5IQotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBDbGFzcyBiZWFuQ2xhc3MgPSBfcmVzb2x2ZXIuZmluZENsYXNzKGNsYXNzTmFtZSk7Ci0KLSAgICAgICAgICAgIGJlYW4gPSBiZWFuQ2xhc3MubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQotICAgICAgICB7Ci0KLSAgICAgICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgVGFwZXN0cnkuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAiQmVhblByb3ZpZGVyLmluc3RhbnRpYXRpb24tZXJyb3IiLAotICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10gewotICAgICAgICAgICAgICAgICAgICAgICAgYmVhbk5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBfY29tcG9uZW50LmdldEV4dGVuZGVkSWQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4LmdldE1lc3NhZ2UoKX0pLAotICAgICAgICAgICAgICAgIHNwZWMuZ2V0TG9jYXRpb24oKSwKLSAgICAgICAgICAgICAgICBleCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBPSywgaGF2ZSB0aGUgYmVhbiwgaGF2ZSB0byBpbml0aWFsaXplIGl0LgotCi0gICAgICAgIExpc3QgaW5pdGlhbGl6ZXJzID0gc3BlYy5nZXRJbml0aWFsaXplcnMoKTsKLQotICAgICAgICBpZiAoaW5pdGlhbGl6ZXJzID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gYmVhbjsKLQotICAgICAgICBJdGVyYXRvciBpID0gaW5pdGlhbGl6ZXJzLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgSUJlYW5Jbml0aWFsaXplciBpeiA9IChJQmVhbkluaXRpYWxpemVyKSBpLm5leHQoKTsKLQotICAgICAgICAgICAgaWYgKExPRy5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIExPRy5kZWJ1ZygiSW5pdGlhbGl6aW5nIHByb3BlcnR5ICIgKyBpei5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0KLSAgICAgICAgICAgIGl6LnNldEJlYW5Qcm9wZXJ0eSh0aGlzLCBiZWFuKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBiZWFuOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBSZW1vdmVzIGFsbCBiZWFucyB3aXRoIHRoZSBSRVFVRVNUIGxpZmVjeWNsZS4gIEJlYW5zIHdpdGgKLSAgICAgKiAgdGhlIFBBR0UgbGlmZWN5Y2xlIHN0aWNrIGFyb3VuZCwgYW5kIGJlYW5zIHdpdGggbm8gbGlmZWN5Y2xlCi0gICAgICogIHdlcmUgbmV2ZXIgc3RvcmVkIGluIHRoZSBmaXJzdCBwbGFjZS4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIHBhZ2VEZXRhY2hlZChQYWdlRXZlbnQgZXZlbnQpCi0gICAgewotICAgICAgICByZW1vdmVCZWFucyhCZWFuTGlmZWN5Y2xlLlJFUVVFU1QpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBSZW1vdmVzIGFueSBiZWFucyB3aXRoIHRoZSBzcGVjaWZpZWQgbGlmZWN5Y2xlLgotICAgICAqIAotICAgICAqICBAc2luY2UgMi4yCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHJpdmF0ZSB2b2lkIHJlbW92ZUJlYW5zKEJlYW5MaWZlY3ljbGUgbGlmZWN5Y2xlKQotICAgIHsKLSAgICAgICAgaWYgKF9iZWFucyA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIElDb21wb25lbnRTcGVjaWZpY2F0aW9uIHNwZWMgPSBudWxsOwotCi0gICAgICAgIEl0ZXJhdG9yIGkgPSBfYmVhbnMuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaS5oYXNOZXh0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE1hcC5FbnRyeSBlID0gKE1hcC5FbnRyeSkgaS5uZXh0KCk7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpIGUuZ2V0S2V5KCk7Ci0KLSAgICAgICAgICAgIGlmIChzcGVjID09IG51bGwpCi0gICAgICAgICAgICAgICAgc3BlYyA9IF9jb21wb25lbnQuZ2V0U3BlY2lmaWNhdGlvbigpOwotCi0gICAgICAgICAgICBJQmVhblNwZWNpZmljYXRpb24gcyA9IHNwZWMuZ2V0QmVhblNwZWNpZmljYXRpb24obmFtZSk7Ci0KLSAgICAgICAgICAgIGlmIChzLmdldExpZmVjeWNsZSgpID09IGxpZmVjeWNsZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBPYmplY3QgYmVhbiA9IGUuZ2V0VmFsdWUoKTsKLQotICAgICAgICAgICAgICAgIGlmIChMT0cuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgTE9HLmRlYnVnKCJSZW1vdmluZyAiICsgbGlmZWN5Y2xlLmdldE5hbWUoKSArICIgYmVhbiAiICsgbmFtZSArICI6ICIgKyBiZWFuKTsKLQotICAgICAgICAgICAgICAgIGkucmVtb3ZlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiogQHNpbmNlIDEuMC44ICoqLwotCi0gICAgcHVibGljIElSZXNvdXJjZVJlc29sdmVyIGdldFJlc291cmNlUmVzb2x2ZXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9yZXNvbHZlcjsKLSAgICB9Ci0KLSAgICAvKiogQHNpbmNlIDIuMiAqKi8KLQotICAgIHB1YmxpYyB2b2lkIHBhZ2VCZWdpblJlbmRlcihQYWdlRXZlbnQgZXZlbnQpCi0gICAgewotICAgIH0KLQotICAgIC8qKiBAc2luY2UgMi4yICoqLwotCi0gICAgcHVibGljIHZvaWQgcGFnZUVuZFJlbmRlcihQYWdlRXZlbnQgZXZlbnQpCi0gICAgewotICAgICAgICByZW1vdmVCZWFucyhCZWFuTGlmZWN5Y2xlLlJFTkRFUik7Ci0gICAgfQotCi0gICAgLyoqIEBzaW5jZSAyLjIgKiovCi0KLSAgICBwdWJsaWMgYm9vbGVhbiBjYW5Qcm92aWRlQmVhbihTdHJpbmcgbmFtZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRCZWFuTmFtZXMoKS5jb250YWlucyhuYW1lKTsKLSAgICB9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvYmVhbi9CZWFuUHJvdmlkZXJQcm9wZXJ0eUFjY2Vzc29yLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvYmVhbi9CZWFuUHJvdmlkZXJQcm9wZXJ0eUFjY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyZmJmMjYuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2JlYW4vQmVhblByb3ZpZGVyUHJvcGVydHlBY2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuYmVhbjsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvZ25sLk9iamVjdFByb3BlcnR5QWNjZXNzb3I7Ci1pbXBvcnQgb2dubC5PZ25sRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JQmVhblByb3ZpZGVyOwotCi0vKioKLSAqICBBZGFwdHMgYSB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5JQmVhblByb3ZpZGVyfSB0bwotICogIDxhIGhyZWY9Imh0dHA6Ly93d3cub2dubC5vcmciPk9HTkw8L2E+IGJ5IGV4cG9zaW5nIHRoZSBuYW1lZAotICogIGJlYW5zIHByb3ZpZGVkIGJ5IHRoZSBwcm92aWRlciBhcyByZWFkLW9ubHkgcHJvcGVydGllcyBvZgotICogIHRoZSBwcm92aWRlci4KLSAqIAotICogIDxwPlRoaXMgaXMgcmVnaXN0ZXJlZCBieSB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5BYnN0cmFjdENvbXBvbmVudH0uCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQHNpbmNlIDIuMgotICoKLSAqKi8KLQotcHVibGljIGNsYXNzIEJlYW5Qcm92aWRlclByb3BlcnR5QWNjZXNzb3IgZXh0ZW5kcyBPYmplY3RQcm9wZXJ0eUFjY2Vzc29yCi17Ci0gICAgLyoqCi0gICAgICogIENoZWNrcyB0byBzZWUgaWYgdGhlIG5hbWUgbWF0Y2hlcyB0aGUgbmFtZSBvZiBhIGJlYW4gaW5zaWRlCi0gICAgICogIHRoZSBwcm92aWRlciBhbmQgcmV0dXJucyB0aGF0IGJlYW4gaWYgc28uCi0gICAgICogIE90aGVyd2lzZSwgaW52b2tlcyB0aGUgc3VwZXIgaW1wbGVtZW50YXRpb24uCi0gICAgICogCi0gICAgICoqLwotICAgIAotICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoTWFwIGNvbnRleHQsIE9iamVjdCB0YXJnZXQsIE9iamVjdCBuYW1lKSB0aHJvd3MgT2dubEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgSUJlYW5Qcm92aWRlciBwcm92aWRlciA9IChJQmVhblByb3ZpZGVyKXRhcmdldDsKLSAgICAgICAgU3RyaW5nIGJlYW5OYW1lID0gKFN0cmluZyluYW1lOwotICAgICAgICAKLSAgICAgICAgaWYgKHByb3ZpZGVyLmNhblByb3ZpZGVCZWFuKGJlYW5OYW1lKSkKLSAgICAgICAgICAgIHJldHVybiBwcm92aWRlci5nZXRCZWFuKGJlYW5OYW1lKTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBzdXBlci5nZXRQcm9wZXJ0eShjb250ZXh0LCB0YXJnZXQsIG5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIHRydWUgaWYgdGhlIG5hbWUgbWF0Y2hlcyBhIGJlYW4gcHJvdmlkZWQgYnkgdGhlIHByb3ZpZGVyLgotICAgICAqICBPdGhlcndpc2UgaW52b2tlcyB0aGUgc3VwZXIgaW1wbGVtZW50YXRpb24uCi0gICAgICogCi0gICAgICoqLwotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGhhc0dldFByb3BlcnR5KE1hcCBjb250ZXh0LCBPYmplY3QgdGFyZ2V0LCBPYmplY3Qgb25hbWUpIHRocm93cyBPZ25sRXhjZXB0aW9uCi0gICAgewotICAgICAgICBJQmVhblByb3ZpZGVyIHByb3ZpZGVyID0gKElCZWFuUHJvdmlkZXIpdGFyZ2V0OwotICAgICAgICBTdHJpbmcgYmVhbk5hbWUgPSAoU3RyaW5nKW9uYW1lOwotCi0gICAgICAgIGlmIChwcm92aWRlci5jYW5Qcm92aWRlQmVhbihiZWFuTmFtZSkpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIAotICAgICAgICByZXR1cm4gc3VwZXIuaGFzR2V0UHJvcGVydHkoY29udGV4dCwgdGFyZ2V0LCBvbmFtZSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvYmVhbi9EZWZhdWx0LmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvYmVhbi9EZWZhdWx0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxZWNkNzQuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2JlYW4vRGVmYXVsdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuYmVhbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUJpbmRpbmc7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS51dGlsLnBvb2wuSVBvb2xhYmxlOwotCi0vKioKLSAqICBBIGhlbHBlciBiZWFuIHRvIGFzc2lzdCB3aXRoIHByb3ZpZGluZyBkZWZhdWx0cyBmb3IgdW5zcGVjaWZpZWQKLSAqICBwYXJhbWV0ZXJzLiAgICBJdCBpcyBpbml0YWxpemVkCi0gKiAgd2l0aCBhbiB7QGxpbmsgSUJpbmRpbmd9IGFuZCBhIGRlZmF1bHQgdmFsdWUuICBJdCdzIHZhbHVlIHByb3BlcnR5Ci0gKiAgaXMgZWl0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgYmluZGluZywgYnV0IGlmIHRoZSBiaW5kaW5nIGlzIG51bGwsCi0gKiAgb3IgdGhlIGJpbmRpbmcgcmV0dXJucyBudWxsLCB0aGUgZGVmYXVsdCB2YWx1ZSBpcyByZXR1cm5lZC4KLSAqCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogIEB2ZXJzaW9uICRJZCQKLSAqICBAc2luY2UgMS4wLjUKLSAqIAotICoqLwotCi1wdWJsaWMgY2xhc3MgRGVmYXVsdCBpbXBsZW1lbnRzIElQb29sYWJsZQotewotICAgIHByaXZhdGUgSUJpbmRpbmcgYmluZGluZzsKLSAgICBwcml2YXRlIE9iamVjdCBkZWZhdWx0VmFsdWU7Ci0KLSAgICBwdWJsaWMgdm9pZCByZXNldEZvclBvb2woKQotICAgIHsKLSAgICAgICAgYmluZGluZyA9IG51bGw7Ci0gICAgICAgIGRlZmF1bHRWYWx1ZSA9IG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QmluZGluZyhJQmluZGluZyB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIGJpbmRpbmcgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSUJpbmRpbmcgZ2V0QmluZGluZygpCi0gICAgewotICAgICAgICByZXR1cm4gYmluZGluZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0VmFsdWUoT2JqZWN0IHZhbHVlKQotICAgIHsKLSAgICAgICAgZGVmYXVsdFZhbHVlID0gdmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXREZWZhdWx0VmFsdWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGJpbmRpbmcuICBIb3dldmVyLCBpZiB0aGUgYmluZGluZyBpcyBudWxsLCBvciB0aGUgYmluZGluZwotICAgICAqICByZXR1cm5zIG51bGwsIHRoZW4gdGhlIGRlZmF1bHRWYWx1ZSBpcyByZXR1cm5lZCBpbnN0ZWFkLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpCi0gICAgewotICAgICAgICBpZiAoYmluZGluZyA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTsKLQotICAgICAgICBPYmplY3QgdmFsdWUgPSBiaW5kaW5nLmdldE9iamVjdCgpOwotCi0gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTsKLQotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotICAgIAotICAgIC8qKiBAc2luY2UgMy4wICoqLwotICAgIAotICAgIHB1YmxpYyB2b2lkIGRpc2NhcmRGcm9tUG9vbCgpCi0gICAgewotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9iZWFuL0V2ZW5PZGQuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9iZWFuL0V2ZW5PZGQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI2MzljOC4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvYmVhbi9FdmVuT2RkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5iZWFuOwotCi0vKioKLSAqICBVc2VkIHRvIGVtaXQgYSBzdHJlYW0gb2YgYWx0ZXJhdGluZyBzdHJpbmcgdmFsdWVzOiAiZXZlbiIsICJvZGQiLCBldGMuICBUaGlzCi0gKiAgaXMgb2Z0ZW4gdXNlZCBpbiB0aGUgSW5zcGVjdG9yIHBhZ2VzIHRvIG1ha2UgdGhlIGNsYXNzIG9mIGEgJmx0O3RyJmd0OyBhbHRlcm5hdGUKLSAqICBmb3IgcHJlc2VudGF0aW9uIHJlYXNvbnMuCi0gKgotICogIEB2ZXJzaW9uICRJZCQKLSAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKgotICoqLwotCi1wdWJsaWMgY2xhc3MgRXZlbk9kZAotewotICAgIHByaXZhdGUgYm9vbGVhbiBldmVuID0gdHJ1ZTsKLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zICJldmVuIiBvciAib2RkIi4gIFdoYXRldmVyIGl0IHJldHVybnMgb24gb25lIGludm9jYXRpb24sIGl0IHdpbGwKLSAgICAgKiAgcmV0dXJuIHRoZSBvcHBvc2l0ZSBvbiB0aGUgbmV4dC4gIEJ5IGRlZmF1bHQsIHRoZSBmaXJzdCB2YWx1ZQotICAgICAqICByZXR1cm5lZCBpcyAiZXZlbiIuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5leHQoKQotICAgIHsKLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9IGV2ZW4gPyAiZXZlbiIgOiAib2RkIjsKLQotICAgICAgICBldmVuID0gIWV2ZW47Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gaXNFdmVuKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBldmVuOwotICAgIH0KLQotCS8qKgotCSAqICBPdmVycmlkZXMgdGhlIGV2ZW4gZmxhZy4KLQkgKiAKLQkgKiovCi0JCi0gICAgcHVibGljIHZvaWQgc2V0RXZlbihib29sZWFuIHZhbHVlKQotICAgIHsKLSAgICAgICAgZXZlbiA9IHZhbHVlOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvYmVhbi9FeHByZXNzaW9uQmVhbkluaXRpYWxpemVyLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvYmVhbi9FeHByZXNzaW9uQmVhbkluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5MDQ2NWQuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2JlYW4vRXhwcmVzc2lvbkJlYW5Jbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuYmVhbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUJlYW5Qcm92aWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVzb3VyY2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnV0aWwucHJvcC5PZ25sVXRpbHM7Ci0KLS8qKgotICogCi0gKiAgSW5pdGlhbGl6ZXMgYSBoZWxwZXIgYmVhbiBwcm9wZXJ0eSBmcm9tIGFuIE9HTkwgZXhwcmVzc2lvbiAocmVsYXRpdmUKLSAqICB0byB0aGUgYmVhbidzIHtAbGluayBJQ29tcG9uZW50fSkuCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQHNpbmNlIDIuMgotICoKLSAqKi8KLQotcHVibGljIGNsYXNzIEV4cHJlc3Npb25CZWFuSW5pdGlhbGl6ZXIgZXh0ZW5kcyBBYnN0cmFjdEJlYW5Jbml0aWFsaXplcgotewotICAgIHByb3RlY3RlZCBTdHJpbmcgX2V4cHJlc3Npb247Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRCZWFuUHJvcGVydHkoSUJlYW5Qcm92aWRlciBwcm92aWRlciwgT2JqZWN0IGJlYW4pCi0gICAgewotICAgICAgICBJUmVzb3VyY2VSZXNvbHZlciByZXNvbHZlciA9IHByb3ZpZGVyLmdldFJlc291cmNlUmVzb2x2ZXIoKTsKLSAgICAgICAgSUNvbXBvbmVudCBjb21wb25lbnQgPSBwcm92aWRlci5nZXRDb21wb25lbnQoKTsKLSAgICAgICAgCi0gICAgICAgIE9iamVjdCB2YWx1ZSA9IE9nbmxVdGlscy5nZXQoX2V4cHJlc3Npb24sIHJlc29sdmVyLCBjb21wb25lbnQpOwotCi0gICAgICAgIHNldEJlYW5Qcm9wZXJ0eShyZXNvbHZlciwgYmVhbiwgdmFsdWUpOwotICAgIH0KLQotCS8qKiBAc2luY2UgMy4wICoqLwotCQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXhwcmVzc2lvbigpCi0gICAgewotICAgICAgICByZXR1cm4gX2V4cHJlc3Npb247Ci0gICAgfQotCi0JLyoqIEBzaW5jZSAzLjAgKiovCi0JCi0gICAgcHVibGljIHZvaWQgc2V0RXhwcmVzc2lvbihTdHJpbmcgZXhwcmVzc2lvbikKLSAgICB7Ci0gICAgICAgIF9leHByZXNzaW9uID0gZXhwcmVzc2lvbjsKLSAgICB9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvYmVhbi9GaWVsZEJlYW5Jbml0aWFsaXplci5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2JlYW4vRmllbGRCZWFuSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY2NmNlOC4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvYmVhbi9GaWVsZEJlYW5Jbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmJlYW47Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUJlYW5Qcm92aWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZXNvdXJjZVJlc29sdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuVGFwZXN0cnk7Ci0KLS8qKgotICogIEluaXRpYWxpemVzIGEgYmVhbiB3aXRoIHRoZSB2YWx1ZSBvZiBhIHB1YmxpYyBzdGF0aWMgZmllbGQuCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQHNpbmNlIDEuMC44Ci0gKgotICoqLwotCi1wdWJsaWMgY2xhc3MgRmllbGRCZWFuSW5pdGlhbGl6ZXIgZXh0ZW5kcyBBYnN0cmFjdEJlYW5Jbml0aWFsaXplcgotewotICAgIHByb3RlY3RlZCBTdHJpbmcgX2ZpZWxkTmFtZTsKLSAgICBwcm90ZWN0ZWQgT2JqZWN0IF9maWVsZFZhbHVlOwotICAgIHByaXZhdGUgYm9vbGVhbiBfZmllbGRSZXNvbHZlZCA9IGZhbHNlOwotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldEJlYW5Qcm9wZXJ0eShJQmVhblByb3ZpZGVyIHByb3ZpZGVyLCBPYmplY3QgYmVhbikKLSAgICB7Ci0gICAgICAgIElSZXNvdXJjZVJlc29sdmVyIHJlc29sdmVyID0gcHJvdmlkZXIuZ2V0UmVzb3VyY2VSZXNvbHZlcigpOwotCi0gICAgICAgIGlmICghX2ZpZWxkUmVzb2x2ZWQpCi0gICAgICAgICAgICByZXNvbHZlRmllbGQocmVzb2x2ZXIpOwotCi0gICAgICAgIHNldEJlYW5Qcm9wZXJ0eShyZXNvbHZlciwgYmVhbiwgX2ZpZWxkVmFsdWUpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCByZXNvbHZlRmllbGQoSVJlc291cmNlUmVzb2x2ZXIgcmVzb2x2ZXIpCi0gICAgewotICAgICAgICBpZiAoX2ZpZWxkUmVzb2x2ZWQpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgLy8gVGhpcyBpcyBhbGwgY29waWVkIG91dCBvZiBvZiBGaWVsZEJpbmRpbmchIQotCi0gICAgICAgIGludCBkb3R4ID0gX2ZpZWxkTmFtZS5sYXN0SW5kZXhPZignLicpOwotCi0gICAgICAgIGlmIChkb3R4IDwgMCkKLSAgICAgICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgVGFwZXN0cnkuZm9ybWF0KCJpbnZhbGlkLWZpZWxkLW5hbWUiLCBfZmllbGROYW1lKSk7Ci0KLSAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IF9maWVsZE5hbWUuc3Vic3RyaW5nKDAsIGRvdHgpOwotICAgICAgICBTdHJpbmcgc2ltcGxlRmllbGROYW1lID0gX2ZpZWxkTmFtZS5zdWJzdHJpbmcoZG90eCArIDEpOwotCi0gICAgICAgIC8vIFNpbXBsZSBjbGFzcyBuYW1lcyBhcmUgYXNzdW1lZCB0byBiZSBpbiB0aGUgamF2YS5sYW5nIHBhY2thZ2UuCi0KLSAgICAgICAgaWYgKGNsYXNzTmFtZS5pbmRleE9mKCcuJykgPCAwKQotICAgICAgICAgICAgY2xhc3NOYW1lID0gImphdmEubGFuZy4iICsgY2xhc3NOYW1lOwotCi0gICAgICAgIENsYXNzIHRhcmdldENsYXNzID0gbnVsbDsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgdGFyZ2V0Q2xhc3MgPSByZXNvbHZlci5maW5kQ2xhc3MoY2xhc3NOYW1lKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgVGFwZXN0cnkuZm9ybWF0KCJ1bmFibGUtdG8tcmVzb2x2ZS1jbGFzcyIsIGNsYXNzTmFtZSksCi0gICAgICAgICAgICAgICAgdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBGaWVsZCBmaWVsZCA9IG51bGw7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZpZWxkID0gdGFyZ2V0Q2xhc3MuZ2V0RmllbGQoc2ltcGxlRmllbGROYW1lKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoTm9TdWNoRmllbGRFeGNlcHRpb24gZXgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgVGFwZXN0cnkuZm9ybWF0KCJmaWVsZC1ub3QtZGVmaW5lZCIsIF9maWVsZE5hbWUpLAotICAgICAgICAgICAgICAgIGV4KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEdldCB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkLiAgbnVsbCBtZWFucyBsb29rIGZvciBpdCBhcyBhIHN0YXRpYwotICAgICAgICAvLyB2YXJpYWJsZS4KLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgX2ZpZWxkVmFsdWUgPSBmaWVsZC5nZXQobnVsbCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZXgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgVGFwZXN0cnkuZm9ybWF0KCJpbGxlZ2FsLWZpZWxkLWFjY2VzcyIsIF9maWVsZE5hbWUpLAotICAgICAgICAgICAgICAgIGV4KTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZXgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgVGFwZXN0cnkuZm9ybWF0KCJmaWVsZC1pcy1pbnN0YW5jZSIsIF9maWVsZE5hbWUpLAotICAgICAgICAgICAgICAgIGV4KTsKLSAgICAgICAgfQotCi0gICAgICAgIF9maWVsZFJlc29sdmVkID0gdHJ1ZTsKLSAgICB9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvYmVhbi9JQmVhbkluaXRpYWxpemVyLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvYmVhbi9JQmVhbkluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjY2YxZGEuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2JlYW4vSUJlYW5Jbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuYmVhbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUJlYW5Qcm92aWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklMb2NhdGlvbkhvbGRlcjsKLQotLyoqCi0gKiAgSW50ZXJmYWNlIGZvciBhIHNldCBvZiBjbGFzc2VzIHVzZWQgdG8gaW5pdGlhbGl6ZSBoZWxwZXIgYmVhbnMuCi0gKgotICogIEBhdXRob3IgSG93YXJkIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQHNpbmNlIDEuMC41Ci0gKiAKLSAqKi8KLQotcHVibGljIGludGVyZmFjZSBJQmVhbkluaXRpYWxpemVyIGV4dGVuZHMgSUxvY2F0aW9uSG9sZGVyCi17Ci0gICAgLyoqCi0gICAgICogIEludm9rZWQgYnkgdGhlIHtAbGluayBJQmVhblByb3ZpZGVyfSB0byBpbml0aWFsaXplCi0gICAgICogIGEgcHJvcGVydHkgb2YgdGhlIGJlYW4uCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCBzZXRCZWFuUHJvcGVydHkoSUJlYW5Qcm92aWRlciBwcm92aWRlciwgT2JqZWN0IGJlYW4pOwotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRoaXMgaW5pdGlhbGl6ZXIKLSAgICAgKiAgd2lsbCBzZXQuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5TmFtZSgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9iZWFuL01lc3NhZ2VCZWFuSW5pdGlhbGl6ZXIuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9iZWFuL01lc3NhZ2VCZWFuSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFlMjI3MC4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvYmVhbi9NZXNzYWdlQmVhbkluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5iZWFuOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JQmVhblByb3ZpZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUNvbXBvbmVudDsKLQotLyoqCi0gKiAgQSBiZWFuIGluaXRpYWxpemVyIHRoYXQgdXNlcyBhIGxvY2FsaXplZCBzdHJpbmcgZnJvbSB0aGUgY29udGFpbmluZwotICogIGNvbXBvbmVudC4KLSAqCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogIEB2ZXJzaW9uICRJZCQKLSAqICBAc2luY2UgMi4yCi0gKiAKLSAqKi8KLQotcHVibGljIGNsYXNzIE1lc3NhZ2VCZWFuSW5pdGlhbGl6ZXIgZXh0ZW5kcyBBYnN0cmFjdEJlYW5Jbml0aWFsaXplcgotewotICAgIHByb3RlY3RlZCBTdHJpbmcgX2tleTsKLQkKLQotICAgIHB1YmxpYyB2b2lkIHNldEJlYW5Qcm9wZXJ0eShJQmVhblByb3ZpZGVyIHByb3ZpZGVyLCBPYmplY3QgYmVhbikKLSAgICB7Ci0gICAgICAgIElDb21wb25lbnQgY29tcG9uZW50ID0gcHJvdmlkZXIuZ2V0Q29tcG9uZW50KCk7Ci0gICAgICAgIFN0cmluZyB2YWx1ZSA9IGNvbXBvbmVudC5nZXRNZXNzYWdlKF9rZXkpOwotICAgICAgICAKLSAgICAgICAgc2V0QmVhblByb3BlcnR5KHByb3ZpZGVyLmdldFJlc291cmNlUmVzb2x2ZXIoKSwgYmVhbiwgdmFsdWUpOwotICAgIH0KLSAgICAKLSAgICAvKiogQHNpbmNlIDMuMCAqKi8KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldEtleSgpCi0gICAgewotICAgICAgICByZXR1cm4gX2tleTsKLSAgICB9Ci0KLQkvKiogQHNpbmNlIDMuMCAqKi8KLQkKLSAgICBwdWJsaWMgdm9pZCBzZXRLZXkoU3RyaW5nIGtleSkKLSAgICB7Ci0gICAgICAgIF9rZXkgPSBrZXk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvYmVhbi9TdGF0aWNCZWFuSW5pdGlhbGl6ZXIuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9iZWFuL1N0YXRpY0JlYW5Jbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTgzZjU2Li4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9iZWFuL1N0YXRpY0JlYW5Jbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuYmVhbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUJlYW5Qcm92aWRlcjsKLQotLyoqCi0gKiAgSW5pdGlhbGl6ZXMgYSBiZWFuIHdpdGggYSBzdGF0aWMgdmFsdWUuCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQHNpbmNlIDEuMC41Ci0gKiAKLSAqKi8KLQotcHVibGljIGNsYXNzIFN0YXRpY0JlYW5Jbml0aWFsaXplciBleHRlbmRzIEFic3RyYWN0QmVhbkluaXRpYWxpemVyCi17Ci0gICAgcHJvdGVjdGVkIE9iamVjdCBfdmFsdWU7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRCZWFuUHJvcGVydHkoSUJlYW5Qcm92aWRlciBwcm92aWRlciwgT2JqZWN0IGJlYW4pCi0gICAgewotICAgICAgICBzZXRCZWFuUHJvcGVydHkocHJvdmlkZXIuZ2V0UmVzb3VyY2VSZXNvbHZlcigpLCBiZWFuLCBfdmFsdWUpOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvYmVhbi9wYWNrYWdlLmh0bWwgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvYmVhbi9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjMDNlYjkuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2JlYW4vcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPCFkb2N0eXBlIGh0bWwgcHVibGljICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLTwhLS0gJElkJCAtLT4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+VGFwZXN0cnk6IFdlYiBBcHBsaWNhdGlvbiBGcmFtZXdvcms8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci0KLTxwPkNvbnRhaW5zIHVzZWZ1bCBoZWxwZXIgYmVhbnMsIGFuIGltcGxlbWVudGF0aW9uIG9mCi10aGUge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkuSUJlYW5Qcm92aWRlcn0gaW50ZXJmYWNlLCBhbmQgCi1zZXZlcmFsIGludGVyZmFjZXMgYW5kIGNsYXNzZXMgcmVsYXRlZCB0byBpbml0aWFsaXppbmcgaGVscGVyIGJlYW5zLgotCi1AYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwIDxhIGhyZWY9Im1haWx0bzpobHNoaXBAYXBhY2hlLm9yZyI+aGxzaGlwQGFwYWNoZS5vcmc8L2E+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9iaW5kaW5nL0Fic3RyYWN0QmluZGluZy5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2JpbmRpbmcvQWJzdHJhY3RCaW5kaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiMTNiMmMuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2JpbmRpbmcvQWJzdHJhY3RCaW5kaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDUgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuYmluZGluZzsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LkJpbmRpbmdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JQmluZGluZzsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklMb2NhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LlRhcGVzdHJ5OwotCi0vKioKLSAqICBCYXNlIGNsYXNzIGZvciB7QGxpbmsgSUJpbmRpbmd9IGltcGxlbWVudGF0aW9ucy4KLSAqCi0gKiBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiBAdmVyc2lvbiAkSWQkCi0gKiAKLSAqKi8KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0QmluZGluZyBpbXBsZW1lbnRzIElCaW5kaW5nCi17Ci0gICAgLyoqIEBzaW5jZSAzLjAgKiovCi0KLSAgICBwcml2YXRlIElMb2NhdGlvbiBfbG9jYXRpb247Ci0KLSAgICAvKioKLSAgICAgKiAgQSBtYXBwaW5nIGZyb20gcHJpbWl0aXZlIHR5cGVzIHRvIHdyYXBwZXIgdHlwZXMuCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIFBSSU1JVElWRV9UWVBFUyA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICBzdGF0aWMgewotICAgICAgICBQUklNSVRJVkVfVFlQRVMucHV0KGJvb2xlYW4uY2xhc3MsIEJvb2xlYW4uY2xhc3MpOwotICAgICAgICBQUklNSVRJVkVfVFlQRVMucHV0KGJ5dGUuY2xhc3MsIEJ5dGUuY2xhc3MpOwotICAgICAgICBQUklNSVRJVkVfVFlQRVMucHV0KGNoYXIuY2xhc3MsIENoYXJhY3Rlci5jbGFzcyk7Ci0gICAgICAgIFBSSU1JVElWRV9UWVBFUy5wdXQoc2hvcnQuY2xhc3MsIFNob3J0LmNsYXNzKTsKLSAgICAgICAgUFJJTUlUSVZFX1RZUEVTLnB1dChpbnQuY2xhc3MsIEludGVnZXIuY2xhc3MpOwotICAgICAgICBQUklNSVRJVkVfVFlQRVMucHV0KGxvbmcuY2xhc3MsIExvbmcuY2xhc3MpOwotICAgICAgICBQUklNSVRJVkVfVFlQRVMucHV0KGZsb2F0LmNsYXNzLCBGbG9hdC5jbGFzcyk7Ci0gICAgICAgIFBSSU1JVElWRV9UWVBFUy5wdXQoZG91YmxlLmNsYXNzLCBEb3VibGUuY2xhc3MpOwotICAgIH0KLQotICAgIC8qKiBAc2luY2UgMy4wICoqLwotCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0QmluZGluZyhJTG9jYXRpb24gbG9jYXRpb24pCi0gICAgewotICAgICAgICBfbG9jYXRpb24gPSBsb2NhdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSUxvY2F0aW9uIGdldExvY2F0aW9uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfbG9jYXRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIENvb2VyY2VzIHRoZSByYXcgdmFsdWUgaW50byBhIHRydWUgb3IgZmFsc2UsIGFjY29yZGluZyB0byB0aGUKLSAgICAgKiAgcnVsZXMgc2V0IGJ5IHtAbGluayBUYXBlc3RyeSNldmFsdWF0ZUJvb2xlYW4oT2JqZWN0KX0uCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRCb29sZWFuKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBUYXBlc3RyeS5ldmFsdWF0ZUJvb2xlYW4oZ2V0T2JqZWN0KCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0SW50KCkKLSAgICB7Ci0gICAgICAgIE9iamVjdCByYXc7Ci0KLSAgICAgICAgcmF3ID0gZ2V0T2JqZWN0KCk7Ci0gICAgICAgIGlmIChyYXcgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IFRhcGVzdHJ5LmNyZWF0ZU51bGxCaW5kaW5nRXhjZXB0aW9uKHRoaXMpOwotCi0gICAgICAgIGlmIChyYXcgaW5zdGFuY2VvZiBOdW1iZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAoKE51bWJlcikgcmF3KS5pbnRWYWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHJhdyBpbnN0YW5jZW9mIEJvb2xlYW4pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAoKEJvb2xlYW4pIHJhdykuYm9vbGVhblZhbHVlKCkgPyAxIDogMDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFNhdmUgcGFyc2luZyBmb3IgbGFzdC4gIFRoaXMgbWF5IGFsc28gdGhyb3cgYSBudW1iZXIgZm9ybWF0IGV4Y2VwdGlvbi4KLQotICAgICAgICByZXR1cm4gSW50ZWdlci5wYXJzZUludCgoU3RyaW5nKSByYXcpOwotICAgIH0KLQotICAgIHB1YmxpYyBkb3VibGUgZ2V0RG91YmxlKCkKLSAgICB7Ci0gICAgICAgIE9iamVjdCByYXc7Ci0KLSAgICAgICAgcmF3ID0gZ2V0T2JqZWN0KCk7Ci0gICAgICAgIGlmIChyYXcgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IFRhcGVzdHJ5LmNyZWF0ZU51bGxCaW5kaW5nRXhjZXB0aW9uKHRoaXMpOwotCi0gICAgICAgIGlmIChyYXcgaW5zdGFuY2VvZiBOdW1iZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAoKE51bWJlcikgcmF3KS5kb3VibGVWYWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHJhdyBpbnN0YW5jZW9mIEJvb2xlYW4pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAoKEJvb2xlYW4pIHJhdykuYm9vbGVhblZhbHVlKCkgPyAxIDogMDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFNhdmUgcGFyc2luZyBmb3IgbGFzdC4gIFRoaXMgbWF5IGFsc28gdGhyb3cgYSBudW1iZXIgZm9ybWF0IGV4Y2VwdGlvbi4KLQotICAgICAgICByZXR1cm4gRG91YmxlLnBhcnNlRG91YmxlKChTdHJpbmcpIHJhdyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEdldHMgdGhlIHZhbHVlIGZvciB0aGUgYmluZGluZy4gIElmIG51bGwsIHJldHVybnMgbnVsbCwKLSAgICAgKiAgb3RoZXJ3aXNlLCByZXR1cm5zIHRoZSBTdHJpbmcgKDxjb2RlPnRvU3RyaW5nKCk8L2NvZGU+KSB2ZXJzaW9uIG9mCi0gICAgICogIHRoZSB2YWx1ZS4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKCkKLSAgICB7Ci0gICAgICAgIE9iamVjdCB2YWx1ZTsKLQotICAgICAgICB2YWx1ZSA9IGdldE9iamVjdCgpOwotICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIHJldHVybiB2YWx1ZS50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBAdGhyb3dzIEJpbmRpbmdFeGNlcHRpb24gYWx3YXlzLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgc2V0Qm9vbGVhbihib29sZWFuIHZhbHVlKQotICAgIHsKLSAgICAgICAgdGhyb3cgY3JlYXRlUmVhZE9ubHlCaW5kaW5nRXhjZXB0aW9uKHRoaXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBAdGhyb3dzIEJpbmRpbmdFeGNlcHRpb24gYWx3YXlzLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgc2V0SW50KGludCB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIHRocm93IGNyZWF0ZVJlYWRPbmx5QmluZGluZ0V4Y2VwdGlvbih0aGlzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgQHRocm93cyBCaW5kaW5nRXhjZXB0aW9uIGFsd2F5cy4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIHNldERvdWJsZShkb3VibGUgdmFsdWUpCi0gICAgewotICAgICAgICB0aHJvdyBjcmVhdGVSZWFkT25seUJpbmRpbmdFeGNlcHRpb24odGhpcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEB0aHJvd3MgQmluZGluZ0V4Y2VwdGlvbiBhbHdheXMuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCBzZXRTdHJpbmcoU3RyaW5nIHZhbHVlKQotICAgIHsKLSAgICAgICAgdGhyb3cgY3JlYXRlUmVhZE9ubHlCaW5kaW5nRXhjZXB0aW9uKHRoaXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBAdGhyb3dzIEJpbmRpbmdFeGNlcHRpb24gYWx3YXlzLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgc2V0T2JqZWN0KE9iamVjdCB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIHRocm93IGNyZWF0ZVJlYWRPbmx5QmluZGluZ0V4Y2VwdGlvbih0aGlzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgRGVmYXVsdCBpbXBsZW1lbnRhdGlvbjogcmV0dXJucyB0cnVlLgotICAgICAqIAotICAgICAqICBAc2luY2UgMi4wLjMKLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0ludmFyaWFudCgpCi0gICAgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldE9iamVjdChTdHJpbmcgcGFyYW1ldGVyTmFtZSwgQ2xhc3MgdHlwZSkKLSAgICB7Ci0gICAgICAgIE9iamVjdCByZXN1bHQgPSBnZXRPYmplY3QoKTsKLQotICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotCi0gICAgICAgIENsYXNzIHJlc3VsdENsYXNzID0gcmVzdWx0LmdldENsYXNzKCk7Ci0KLSAgICAgICAgaWYgKHR5cGUuaXNBc3NpZ25hYmxlRnJvbShyZXN1bHRDbGFzcykpCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotCi0gICAgICAgIGlmICh0eXBlLmlzUHJpbWl0aXZlKCkgJiYgaXNXcmFwcGVyKHR5cGUsIHJlc3VsdENsYXNzKSkKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0KLSAgICAgICAgU3RyaW5nIGtleSA9Ci0gICAgICAgICAgICB0eXBlLmlzSW50ZXJmYWNlKCkgPyAiQWJzdHJhY3RCaW5kaW5nLndyb25nLWludGVyZmFjZSIgOiAiQWJzdHJhY3RCaW5kaW5nLndyb25nLXR5cGUiOwotCi0gICAgICAgIFN0cmluZyBtZXNzYWdlID0KLSAgICAgICAgICAgIFRhcGVzdHJ5LmZvcm1hdCgKLSAgICAgICAgICAgICAgICBrZXksCi0gICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsgcGFyYW1ldGVyTmFtZSwgcmVzdWx0LCByZXN1bHRDbGFzcy5nZXROYW1lKCksIHR5cGUuZ2V0TmFtZSgpfSk7Ci0KLSAgICAgICAgdGhyb3cgbmV3IEJpbmRpbmdFeGNlcHRpb24obWVzc2FnZSwgdGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNXcmFwcGVyKENsYXNzIHByaW1pdGl2ZVR5cGUsIENsYXNzIHN1YmplY3RDbGFzcykKLSAgICB7Ci0gICAgICAgIHJldHVybiBQUklNSVRJVkVfVFlQRVMuZ2V0KHByaW1pdGl2ZVR5cGUpLmVxdWFscyhzdWJqZWN0Q2xhc3MpOwotICAgIH0KLQotICAgIC8qKiBAc2luY2UgMy4wICoqLwotCi0gICAgcHJvdGVjdGVkIEJpbmRpbmdFeGNlcHRpb24gY3JlYXRlUmVhZE9ubHlCaW5kaW5nRXhjZXB0aW9uKElCaW5kaW5nIGJpbmRpbmcpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IEJpbmRpbmdFeGNlcHRpb24oCi0gICAgICAgICAgICBUYXBlc3RyeS5nZXRNZXNzYWdlKCJBYnN0cmFjdEJpbmRpbmcucmVhZC1vbmx5LWJpbmRpbmciKSwKLSAgICAgICAgICAgIGJpbmRpbmcpOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvYmluZGluZy9FeHByZXNzaW9uQmluZGluZy5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2JpbmRpbmcvRXhwcmVzc2lvbkJpbmRpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTU0MTllNS4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvYmluZGluZy9FeHByZXNzaW9uQmluZGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAwICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmJpbmRpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb2dubC5PZ25sOwotaW1wb3J0IG9nbmwuT2dubEV4Y2VwdGlvbjsKLWltcG9ydCBvZ25sLlR5cGVDb252ZXJ0ZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LkJpbmRpbmdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JQ29tcG9uZW50OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUxvY2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlc291cmNlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5UYXBlc3RyeTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnNwZWMuQmVhbkxpZmVjeWNsZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnNwZWMuSUJlYW5TcGVjaWZpY2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuc3BlYy5JQXBwbGljYXRpb25TcGVjaWZpY2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkudXRpbC5TdHJpbmdTcGxpdHRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnV0aWwucHJvcC5PZ25sVXRpbHM7Ci0KLS8qKgotICogIEltcGxlbWVudHMgYSBkeW5hbWljIGJpbmRpbmcsIGJhc2VkIG9uIGdldHRpbmcgYW5kIGZldGNoaW5nCi0gKiAgdmFsdWVzIHVzaW5nIEphdmFCZWFucyBwcm9wZXJ0eSBhY2Nlc3MuICBUaGlzIGlzIGJ1aWx0Ci0gKiAgdXBvbiB0aGUgPGEgaHJlZj0iaHR0cDovL3d3dy5vZ25sLm9yZyI+T0dOTDwvYT4gbGlicmFyeS4KLSAqCi0gKiAgPHA+PGI+T3B0aW1pemF0aW9uIG9mIHRoZSBFeHByZXNzaW9uPC9iPgotICogCi0gKiAgPHA+VGhlcmUncyBhIGxvdCBvZiByb29tIGZvciBvcHRpbWl6YXRpb24gaGVyZSBiZWNhdXNlIHdlIGNhbgotICogIGNvdW50IG9uIHNvbWUgcG9ydGlvbnMgb2YgdGhlIGV4cHJlc3Npb24gdG8gYmUKLSAqICBlZmZlY3RpdmVseSBzdGF0aWMuICBOb3RlIHRoYXQgd2UgdHlwZSB0aGUgcm9vdCBvYmplY3QgYXMKLSAqICB7QGxpbmsgSUNvbXBvbmVudH0uICBXZSBoYXZlIHNvbWUgZXhwZWN0YXRpb25zIHRoYXQKLSAqICBjZXJ0YWluIHByb3BlcnRpZXMgb2YgdGhlIHJvb3QgKGFuZCBwcm9wZXJ0aWVzIHJlYWNoYWJsZSBmcm9tIHRoZSByb290KQotICogIHdpbGwgYmUgY29uc3RhbnQgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgYmluZGluZy4gIEZvciBleGFtcGxlLCAKLSAqICBjb21wb25lbnRzIG5ldmVyIGNoYW5nZSB0aGllciBwYWdlIG9yIGNvbnRhaW5lci4gIFRoaXMgbWVhbnMKLSAqICB0aGF0IGNlcnRhaW4gcHJvcGVydHkgcHJlZml4ZXMgY2FuIGJlIG9wdGltaXplZDoKLSAqCi0gKiAgPHVsPgotICogIDxsaT5wYWdlCi0gKiAgPGxpPmNvbnRhaW5lcgotICogIDxsaT5jb21wb25lbnRzLjxpPm5hbWU8L2k+Ci0gKiAgPC91bD4KLSAqCi0gKiAgPHA+VGhpcyBtZWFucyB0aGF0IG9uY2UgYW4gRXhwcmVzc2lvbkJpbmRpbmcgaGFzIGJlZW4gdHJpZ2dlcmVkLCAKLSAqICB0aGUge0BsaW5rICN0b1N0cmluZygpfSBtZXRob2QgbWF5IHJldHVybiBkaWZmZXJlbnQgdmFsdWVzIGZvciB0aGUgcm9vdAotICogIGNvbXBvbmVudCBhbmQgdGhlIGV4cHJlc3Npb24gdGhhbiB3YXMgb3JpZ2luYWxseSBzZXQuCi0gKiAKLSAqICA8cD48Yj5JZGVudGlmeWluZyBJbnZhcmlhbnRzPC9iPgotICogCi0gKiAgPHA+TW9zdCBleHByZXNzaW9ucyBhcmUgZnVsbHkgZHluYW1pYzsgdGhleSBtdXN0IGJlCi0gKiAgcmVzb2x2ZWQgZWFjaCB0aW1lIHRoZXkgYXJlIGFjY2Vzc2VkLiAgVGhpcyBjYW4gYmUgc29tZXdoYXQgaW5lZmZpY2llbnQuCi0gKiAgVGFwZXN0cnkgY2FuIGlkZW50aWZ5IGNlcnRhaW4gcGF0aHMgYXMgaW52YXJpYW50OgotICogCi0gKiAgPHVsPgotICogIDxsaT5BIGNvbXBvbmVudCB3aXRoaW4gdGhlIHBhZ2UgaGllcmFyY2h5IAotICogIDxsaT5BbiB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5JQXNzZXR9IGZyb20gdGhlbiBhc3NldHMgbWFwIChwcm9wZXJ0eSA8Y29kZT5hc3NldHM8L2NvZGU+KQotICogIDxsaT5BIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LklBY3Rpb25MaXN0ZW5lcn0KLSAqICBmcm9tIHRoZSBsaXN0ZW5lciBtYXAgKHByb3BlcnR5IDxjb2RlPmxpc3RlbmVyczwvY29kZT4pCi0gKiAgPGxpPkEgYmVhbiB3aXRoIGEge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkuc3BlYy5CZWFuTGlmZWN5Y2xlI1BBR0V9Ci0gKiAgbGlmZWN5Y2xlIChwcm9wZXJ0eSA8Y29kZT5iZWFuczwvY29kZT4pCi0gKiAgPGxpPkEgYmluZGluZyAocHJvcGVydHkgPGNvZGU+YmluZGluZ3M8L2NvZGU+KQotICogIDwvdWw+Ci0gKiAKLSAqICA8cD4KLSAqICBUaGVzZSBvcHRpbWl6YXRpb25zIGhhdmUgc29tZSBpbmhlcmVudCBkYW5nZXJzOyB0aGV5IGFzc3VtZSB0aGF0Ci0gKiAgdGhlIGNvbXBvbmVudHMgaGF2ZSBub3Qgb3ZlcmlkZGVuIHRoZSBzcGVjaWZpZWQgcHJvcGVydGllczsKLSAqICB0aGUgbGFzdCBvbmUgKGNvbmNlcm5pbmcgaGVscGVyIGJlYW5zKSBhc3N1bWVzIHRoYXQgdGhlCi0gKiAgY29tcG9uZW50IGRvZXMgaW5oZXJpdCBmcm9tIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LkFic3RyYWN0Q29tcG9uZW50fS4KLSAqICBJZiB0aGlzIGJlY29tZXMgYSBwcm9ibGVtIGluIHRoZSBmdXR1cmUsIGl0IG1heSBiZSBuZWNlc3NhcnkgdG8KLSAqICBoYXZlIHRoZSBjb21wb25lbnQgaXRzZWxmIGludm9sdmVkIGluIHRoZXNlIGRldGVybWluYXRpb25zLgotICogIAotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQHNpbmNlIDIuMgotICogCi0gKiovCi0KLXB1YmxpYyBjbGFzcyBFeHByZXNzaW9uQmluZGluZyBleHRlbmRzIEFic3RyYWN0QmluZGluZwotewotICAgIC8qKgotICAgICAqICBUaGUgcm9vdCBvYmplY3QgYWdhaW5zdCB3aGljaCB0aGUgbmVzdGVkIHByb3BlcnR5IG5hbWUgaXMgZXZhbHVhdGVkLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHJpdmF0ZSBJQ29tcG9uZW50IF9yb290OwotCi0gICAgLyoqCi0gICAgICogIFRoZSBPR05MIGV4cHJlc3Npb24sIGFzIGEgc3RyaW5nLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgX2V4cHJlc3Npb247Ci0KLSAgICAvKioKLSAgICAgKiAgSWYgdHJ1ZSwgdGhlbiB0aGUgYmluZGluZyBpcyBpbnZhcmlhbnQsIGFuZCBjYWNoZWRWYWx1ZQotICAgICAqICBpcyB0aGUgdWx0aW1hdGUgdmFsdWUuCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHJpdmF0ZSBib29sZWFuIF9pbnZhcmlhbnQgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqICBTdG9yZXMgdGhlIGNhY2hlZCB2YWx1ZSBmb3IgdGhlIGJpbmRpbmcsIGlmIGludmFyaWFudAotICAgICAqICBpcyB0cnVlLgotICAgICAqIAotICAgICAqKi8KLQotICAgIHByaXZhdGUgT2JqZWN0IF9jYWNoZWRWYWx1ZTsKLQotICAgIC8qKgotICAgICAqICAgUGFyc2VkIE9HTkwgZXhwcmVzc2lvbi4KLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwcml2YXRlIE9iamVjdCBfcGFyc2VkRXhwcmVzc2lvbjsKLQotICAgIC8qKgotICAgICAqICBGbGFnIHNldCBvbmNlIHRoZSBiaW5kaW5nIGhhcyBpbml0aWFsaXplZC4KLSAgICAgKiAgX2NhY2hlZFZhbHVlLCBfaW52YXJpYW50IGFuZCBfZmluYWwgdmFsdWUKLSAgICAgKiAgZm9yIF9leHByZXNzaW9uCi0gICAgICogIGFyZSBub3QgdmFsaWQgdW50aWwgYWZ0ZXIgaW5pdGlhbGl6YXRpb24uCi0gICAgICogCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHJpdmF0ZSBib29sZWFuIF9pbml0aWFsaXplZDsKLQotICAgIHByaXZhdGUgSVJlc291cmNlUmVzb2x2ZXIgX3Jlc29sdmVyOwotCi0gICAgLyoqCi0gICAgICogIFRoZSBPR05MIGNvbnRleHQgZm9yIHRoaXMgYmluZGluZy4gIEl0IGlzIHJldGFpbmVkCi0gICAgICogIGZvciB0aGUgbGlmZXNwYW4gb2YgdGhlIGJpbmRpbmcgb25jZSBjcmVhdGVkLgotICAgICAqIAotICAgICAqKi8KLQotICAgIHByaXZhdGUgTWFwIF9jb250ZXh0OwotCi0gICAgLyoqCi0gICAgICogIENyZWF0ZXMgYSB7QGxpbmsgRXhwcmVzc2lvbkJpbmRpbmd9IGZyb20gdGhlIHJvb3Qgb2JqZWN0Ci0gICAgICogIGFuZCBhbiBPR05MIGV4cHJlc3Npb24uCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIEV4cHJlc3Npb25CaW5kaW5nKAotICAgICAgICBJUmVzb3VyY2VSZXNvbHZlciByZXNvbHZlciwKLSAgICAgICAgSUNvbXBvbmVudCByb290LAotICAgICAgICBTdHJpbmcgZXhwcmVzc2lvbiwKLSAgICAgICAgSUxvY2F0aW9uIGxvY2F0aW9uKQotICAgIHsKLSAgICAgICAgc3VwZXIobG9jYXRpb24pOwotCi0gICAgICAgIF9yZXNvbHZlciA9IHJlc29sdmVyOwotICAgICAgICBfcm9vdCA9IHJvb3Q7Ci0gICAgICAgIF9leHByZXNzaW9uID0gZXhwcmVzc2lvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEV4cHJlc3Npb24oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9leHByZXNzaW9uOwotICAgIH0KLQotICAgIHB1YmxpYyBJQ29tcG9uZW50IGdldFJvb3QoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9yb290OwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgcGF0aCwgd2l0aCB0aGUgYXNzaXN0YW5jZSBvZiBhIAotICAgICAqICBPR05MLgotICAgICAqCi0gICAgICogIEB0aHJvd3MgQmluZGluZ0V4Y2VwdGlvbiBpZiBhbiBleGNlcHRpb24gaXMgdGhyb3duIGFjY2Vzc2luZyB0aGUgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgT2JqZWN0IGdldE9iamVjdCgpCi0gICAgewotICAgICAgICBpbml0aWFsaXplKCk7Ci0KLSAgICAgICAgaWYgKF9pbnZhcmlhbnQpCi0gICAgICAgICAgICByZXR1cm4gX2NhY2hlZFZhbHVlOwotCi0gICAgICAgIHJldHVybiByZXNvbHZlUHJvcGVydHkoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE9iamVjdCByZXNvbHZlUHJvcGVydHkoKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBPZ25sLmdldFZhbHVlKF9wYXJzZWRFeHByZXNzaW9uLCBnZXRPZ25sQ29udGV4dCgpLCBfcm9vdCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKE9nbmxFeGNlcHRpb24gdCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJpbmRpbmdFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgVGFwZXN0cnkuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAiRXhwcmVzc2lvbkJpbmRpbmcudW5hYmxlLXRvLXJlc29sdmUtZXhwcmVzc2lvbiIsCi0gICAgICAgICAgICAgICAgICAgIF9leHByZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICBfcm9vdCksCi0gICAgICAgICAgICAgICAgdGhpcywKLSAgICAgICAgICAgICAgICB0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqICBDcmVhdGVzIGFuIE9HTkwgY29udGV4dCB1c2VkIHRvIGdldCBvciBzZXQgYSB2YWx1ZS4KLSAgICAgKiAgV2UgbWF5IGV4dGVuZCB0aGlzIGluIHRoZSBmdXR1cmUgdG8gc2V0IGFkZGl0aW9uYWwKLSAgICAgKiAgY29udGV4dCB2YXJpYWJsZXMgKHN1Y2ggYXMgcGFnZSwgcmVxdWVzdCBjeWNsZSBhbmQgZW5naW5lKS4KLSAgICAgKiAgQW4gb3B0aW9uYWwgdHlwZSBjb252ZXJ0ZXIgd2lsbCBiZSBhZGRlZCB0byB0aGUgT0dOTCBjb250ZXh0Ci0gICAgICogIGlmIGl0IGlzIHNwZWNpZmllZCBhcyBhbiBhcHBsaWNhdGlvbiBleHRlbnNpb24gd2l0aCB0aGUgbmFtZQotICAgICAqICB7QGxpbmsgVGFwZXN0cnkjT0dOTF9UWVBFX0NPTlZFUlRFUn0uCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHJpdmF0ZSBNYXAgZ2V0T2dubENvbnRleHQoKQotICAgIHsKLSAgICAgICAgaWYgKF9jb250ZXh0ID09IG51bGwpCi0gICAgICAgICAgICBfY29udGV4dCA9IE9nbmwuY3JlYXRlRGVmYXVsdENvbnRleHQoX3Jvb3QsIF9yZXNvbHZlcik7Ci0KLSAgICAgICAgaWYgKF9yb290LmdldFBhZ2UoKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoX3Jvb3QuZ2V0UGFnZSgpLmdldEVuZ2luZSgpICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgSUFwcGxpY2F0aW9uU3BlY2lmaWNhdGlvbiBhcHBTcGVjID0gX3Jvb3QuZ2V0UGFnZSgpLmdldEVuZ2luZSgpLmdldFNwZWNpZmljYXRpb24oKTsKLQotICAgICAgICAgICAgICAgIGlmIChhcHBTcGVjICE9IG51bGwgJiYgYXBwU3BlYy5jaGVja0V4dGVuc2lvbihUYXBlc3RyeS5PR05MX1RZUEVfQ09OVkVSVEVSKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFR5cGVDb252ZXJ0ZXIgdHlwZUNvbnZlcnRlciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoVHlwZUNvbnZlcnRlcikgYXBwU3BlYy5nZXRFeHRlbnNpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFwZXN0cnkuT0dOTF9UWVBFX0NPTlZFUlRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlQ29udmVydGVyLmNsYXNzKTsKLQotICAgICAgICAgICAgICAgICAgICBPZ25sLnNldFR5cGVDb252ZXJ0ZXIoX2NvbnRleHQsIHR5cGVDb252ZXJ0ZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBfY29udGV4dDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0cnVlIGlmIHRoZSBiaW5kaW5nIGlzIGV4cGVjdGVkIHRvIGFsd2F5cyAKLSAgICAgKiAgcmV0dXJuIHRoZSBzYW1lIHZhbHVlLgotICAgICAqIAotICAgICAqIAotICAgICAqKi8KLQotICAgIHB1YmxpYyBib29sZWFuIGlzSW52YXJpYW50KCkKLSAgICB7Ci0gICAgICAgIGluaXRpYWxpemUoKTsKLQotICAgICAgICByZXR1cm4gX2ludmFyaWFudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRCb29sZWFuKGJvb2xlYW4gdmFsdWUpCi0gICAgewotICAgICAgICBzZXRPYmplY3QodmFsdWUgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRJbnQoaW50IHZhbHVlKQotICAgIHsKLSAgICAgICAgc2V0T2JqZWN0KG5ldyBJbnRlZ2VyKHZhbHVlKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RG91YmxlKGRvdWJsZSB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIHNldE9iamVjdChuZXcgRG91YmxlKHZhbHVlKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U3RyaW5nKFN0cmluZyB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIHNldE9iamVjdCh2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFNldHMgdXAgdGhlIGhlbHBlciBvYmplY3QsIGJ1dCBhbHNvIG9wdGltaXplcyB0aGUgcHJvcGVydHkgcGF0aAotICAgICAqICBhbmQgZGV0ZXJtaW5lcyBpZiB0aGUgYmluZGluZyBpcyBpbnZhcmFudC4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHByaXZhdGUgdm9pZCBpbml0aWFsaXplKCkKLSAgICB7Ci0gICAgICAgIGlmIChfaW5pdGlhbGl6ZWQpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgX2luaXRpYWxpemVkID0gdHJ1ZTsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgX3BhcnNlZEV4cHJlc3Npb24gPSBPZ25sVXRpbHMuZ2V0UGFyc2VkRXhwcmVzc2lvbihfZXhwcmVzc2lvbik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJpbmRpbmdFeGNlcHRpb24oZXguZ2V0TWVzc2FnZSgpLCB0aGlzLCBleCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY2hlY2tGb3JDb25zdGFudCgpKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIU9nbmwuaXNTaW1wbGVOYXZpZ2F0aW9uQ2hhaW4oX3BhcnNlZEV4cHJlc3Npb24sIGdldE9nbmxDb250ZXh0KCkpKQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoT2dubEV4Y2VwdGlvbiBleCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJpbmRpbmdFeGNlcHRpb24oZXguZ2V0TWVzc2FnZSgpLCB0aGlzLCBleCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTcGxpdCB0aGUgZXhwcmVzc2lvbiBpbnRvIGluZGl2aWR1YWwgcHJvcGVydHkgbmFtZXMuCi0gICAgICAgIC8vIFdlIHRoZW4gb3B0aW1pemUgd2hhdCB3ZSBjYW4gZnJvbSB0aGUgZXhwcmVzc2lvbi4gIFRoaXMgd2lsbAotICAgICAgICAvLyBzaG9ydGVuIHRoZSBleHByZXNzaW9uIGFuZCwgaW4gc29tZSBjYXNlcywgZWxpbWluYXRlCi0gICAgICAgIC8vIGl0LiAgV2UgYWxzbyBjaGVjayB0byBzZWUgaWYgdGhlIGJpbmRpbmcgY2FuIGJlIGFuIGludmFyaWFudC4KLQotICAgICAgICBTdHJpbmdbXSBzcGxpdCA9IG5ldyBTdHJpbmdTcGxpdHRlcignLicpLnNwbGl0VG9BcnJheShfZXhwcmVzc2lvbik7Ci0KLSAgICAgICAgaW50IGNvdW50ID0gb3B0aW1pemVSb290T2JqZWN0KHNwbGl0KTsKLQotICAgICAgICAvLyBXZSd2ZXIgcmVtb3ZlZCBzb21lIG9yIGFsbCBvZiB0aGUgaW5pdGlhbCBlbGVtZW50cyBvZiBzcGxpdAotICAgICAgICAvLyBidXQgaGF2ZSB0byBhY2NvdW50IGZvciBhbnRoaW5nIGxlZnQgb3Zlci4KLQotICAgICAgICBpZiAoY291bnQgPT0gc3BsaXQubGVuZ3RoKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBUaGUgcHJvcGVydHkgcGF0aCB3YXMgc29tZXRoaW5nIGxpa2UgInBhZ2UiIG9yICJjb21wb25lbnQuZm9vIgotICAgICAgICAgICAgLy8gYW5kIHdhcyBjb21wbGV0ZWx5IGVsaW1pbmF0ZWQuCi0KLSAgICAgICAgICAgIF9leHByZXNzaW9uID0gbnVsbDsKLSAgICAgICAgICAgIF9wYXJzZWRFeHByZXNzaW9uID0gbnVsbDsKLQotICAgICAgICAgICAgX2ludmFyaWFudCA9IHRydWU7Ci0gICAgICAgICAgICBfY2FjaGVkVmFsdWUgPSBfcm9vdDsKLQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgX2V4cHJlc3Npb24gPSByZWFzc2VtYmxlKGNvdW50LCBzcGxpdCk7Ci0gICAgICAgIF9wYXJzZWRFeHByZXNzaW9uID0gT2dubFV0aWxzLmdldFBhcnNlZEV4cHJlc3Npb24oX2V4cHJlc3Npb24pOwotCi0gICAgICAgIGNoZWNrRm9ySW52YXJpYW50KGNvdW50LCBzcGxpdCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIExvb2tzIGZvciBjb21tb24gcHJlZml4ZXMgb24gdGhlIGV4cHJlc3Npb24gKHByb3ZpZGVkIHByZS1zcGxpdCkgdGhhdAotICAgICAqICBhcmUgcmVjb2duaXplZCBhcyByZWZlcmVuY2VzIHRvIG90aGVyIGNvbXBvbmVudHMuCi0gICAgICogCi0gICAgICogIEByZXR1cm4gdGhlIG51bWJlciBvZiBsZWFkaW5nIGVsZW1lbnRzIG9mIHRoZSBzcGxpdCBleHByZXNzaW9uIHRoYXQKLSAgICAgKiAgaGF2ZSBiZWVuIHJlbW92ZWQuCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHJpdmF0ZSBpbnQgb3B0aW1pemVSb290T2JqZWN0KFN0cmluZ1tdIHNwbGl0KQotICAgIHsKLSAgICAgICAgaW50IGk7Ci0KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IHNwbGl0Lmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0KLSAgICAgICAgICAgIGlmIChzcGxpdFtpXS5lcXVhbHMoInBhZ2UiKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfcm9vdCA9IF9yb290LmdldFBhZ2UoKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHNwbGl0W2ldLmVxdWFscygiY29udGFpbmVyIikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX3Jvb3QgPSBfcm9vdC5nZXRDb250YWluZXIoKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gSGVyZSdzIHRoZSB0cmlja3kgb25lIC4uLiBpZiBpdHMgb2YgdGhlIGZvcm0KLSAgICAgICAgICAgIC8vICJjb21wb25lbnRzLmZvbyIgd2UgY2FuIGdldCB0aGUgbmFtZWQgY29tcG9uZW50Ci0gICAgICAgICAgICAvLyBkaXJlY3RseS4KLQotICAgICAgICAgICAgaWYgKHNwbGl0W2ldLmVxdWFscygiY29tcG9uZW50cyIpICYmIGkgKyAxIDwgc3BsaXQubGVuZ3RoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9yb290ID0gX3Jvb3QuZ2V0Q29tcG9uZW50KHNwbGl0W2kgKyAxXSk7Ci0gICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBOb3QgYSByZWNvZ25pemVkIHByZWZpeCwgYnJlYWsgdGhlIGxvb3AKLQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gaTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gY2hlY2tGb3JDb25zdGFudCgpCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKE9nbmwuaXNDb25zdGFudChfcGFyc2VkRXhwcmVzc2lvbiwgZ2V0T2dubENvbnRleHQoKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX2ludmFyaWFudCA9IHRydWU7Ci0KLSAgICAgICAgICAgICAgICBfY2FjaGVkVmFsdWUgPSByZXNvbHZlUHJvcGVydHkoKTsKLQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChPZ25sRXhjZXB0aW9uIGV4KQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQmluZGluZ0V4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICBUYXBlc3RyeS5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICJFeHByZXNzaW9uQmluZGluZy51bmFibGUtdG8tcmVzb2x2ZS1leHByZXNzaW9uIiwKLSAgICAgICAgICAgICAgICAgICAgX2V4cHJlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgIF9yb290KSwKLSAgICAgICAgICAgICAgICB0aGlzLAotICAgICAgICAgICAgICAgIGV4KTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgUmVhc3NlbWJsZXMgdGhlIHJlbWFpbmRlciBvZiB0aGUgc3BsaXQgcHJvcGVydHkgcGF0aAotICAgICAqICBmcm9tIHRoZSBzdGFydCBwb2ludC4KLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwcml2YXRlIFN0cmluZyByZWFzc2VtYmxlKGludCBzdGFydCwgU3RyaW5nW10gc3BsaXQpCi0gICAgewotICAgICAgICBpbnQgY291bnQgPSBzcGxpdC5sZW5ndGggLSBzdGFydDsKLQotICAgICAgICBpZiAoY291bnQgPT0gMCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIGlmIChjb3VudCA9PSAxKQotICAgICAgICAgICAgcmV0dXJuIHNwbGl0W3NwbGl0Lmxlbmd0aCAtIDFdOwotCi0gICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgc3BsaXQubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChpID4gc3RhcnQpCi0gICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgnLicpOwotCi0gICAgICAgICAgICBidWZmZXIuYXBwZW5kKHNwbGl0W2ldKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgQ2hlY2tzIHRvIHNlZSBpZiB0aGUgYmluZGluZyBjYW4gYmUgY29udmVydGVkIHRvIGFuIGludmFyaWFudC4KLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tGb3JJbnZhcmlhbnQoaW50IHN0YXJ0LCBTdHJpbmdbXSBzcGxpdCkKLSAgICB7Ci0gICAgICAgIC8vIEZvciBub3csIGFsbCBvZiBvdXIgY29uZGl0aW9ucyBhcmUgdHdvIHByb3BlcnRpZXMKLSAgICAgICAgLy8gZnJvbSBhIHJvb3QgY29tcG9uZW50LgotCi0gICAgICAgIGlmIChzcGxpdC5sZW5ndGggLSBzdGFydCAhPSAyKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIU9nbmwuaXNTaW1wbGVOYXZpZ2F0aW9uQ2hhaW4oX3BhcnNlZEV4cHJlc3Npb24sIGdldE9nbmxDb250ZXh0KCkpKQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoT2dubEV4Y2VwdGlvbiBleCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJpbmRpbmdFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgVGFwZXN0cnkuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAiRXhwcmVzc2lvbkJpbmRpbmcudW5hYmxlLXRvLXJlc29sdmUtZXhwcmVzc2lvbiIsCi0gICAgICAgICAgICAgICAgICAgIF9leHByZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICBfcm9vdCksCi0gICAgICAgICAgICAgICAgdGhpcywKLSAgICAgICAgICAgICAgICBleCk7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgZmlyc3QgPSBzcGxpdFtzdGFydF07Ci0KLSAgICAgICAgaWYgKGZpcnN0LmVxdWFscygibGlzdGVuZXJzIikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9pbnZhcmlhbnQgPSB0cnVlOwotCi0gICAgICAgICAgICAvLyBDb3VsZCBjYXN0IHRvIEFic3RyYWN0Q29tcG9uZW50LCBnZXQgbGlzdGVuZXJzTWFwLCBldGMuLAotICAgICAgICAgICAgLy8gYnV0IHRoaXMgaXMgZWFzaWVyLgotCi0gICAgICAgICAgICBfY2FjaGVkVmFsdWUgPSByZXNvbHZlUHJvcGVydHkoKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChmaXJzdC5lcXVhbHMoImFzc2V0cyIpKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IHNwbGl0W3N0YXJ0ICsgMV07Ci0KLSAgICAgICAgICAgIF9pbnZhcmlhbnQgPSB0cnVlOwotICAgICAgICAgICAgX2NhY2hlZFZhbHVlID0gX3Jvb3QuZ2V0QXNzZXQobmFtZSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZmlyc3QuZXF1YWxzKCJiZWFucyIpKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IHNwbGl0W3N0YXJ0ICsgMV07Ci0KLSAgICAgICAgICAgIElCZWFuU3BlY2lmaWNhdGlvbiBicyA9IF9yb290LmdldFNwZWNpZmljYXRpb24oKS5nZXRCZWFuU3BlY2lmaWNhdGlvbihuYW1lKTsKLQotICAgICAgICAgICAgaWYgKGJzID09IG51bGwgfHwgYnMuZ2V0TGlmZWN5Y2xlKCkgIT0gQmVhbkxpZmVjeWNsZS5QQUdFKQotICAgICAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAgICAgLy8gQWdhaW4sIGNvdWxkIGNhc3QgdG8gQWJzdHJhY3RDb21wb25lbnQsIGJ1dCB0aGlzCi0gICAgICAgICAgICAvLyBpcyBlYXNpZXIuCi0KLSAgICAgICAgICAgIF9pbnZhcmlhbnQgPSB0cnVlOwotICAgICAgICAgICAgX2NhY2hlZFZhbHVlID0gcmVzb2x2ZVByb3BlcnR5KCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZmlyc3QuZXF1YWxzKCJiaW5kaW5ncyIpKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IHNwbGl0W3N0YXJ0ICsgMV07Ci0KLSAgICAgICAgICAgIF9pbnZhcmlhbnQgPSB0cnVlOwotICAgICAgICAgICAgX2NhY2hlZFZhbHVlID0gX3Jvb3QuZ2V0QmluZGluZyhuYW1lKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIE5vdCBhIHJlY29nbml6ZWQgcGF0dGVybiBmb3IgY29udmVyc2lvbgotICAgICAgICAvLyB0byBpbnZhcmlhbnQuCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFVwZGF0ZXMgdGhlIHByb3BlcnR5IGZvciB0aGUgYmluZGluZyB0byB0aGUgZ2l2ZW4gdmFsdWUuICAKLSAgICAgKgotICAgICAqICBAdGhyb3dzIEJpbmRpbmdFeGNlcHRpb24gaWYgdGhlIHByb3BlcnR5IGNhbid0IGJlIHVwZGF0ZWQgKHR5cGljYWxseQotICAgICAqICBkdWUgdG8gYW4gc2VjdXJpdHkgcHJvYmxlbSwgb3IgYSBtaXNzaW5nIG11dGF0b3IgbWV0aG9kKS4KLSAgICAgKiAgQHRocm93cyBCaW5kaW5nRXhjZXB0aW9uIGlmIHRoZSBiaW5kaW5nIGlzIGludmFyaWFudC4KLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCBzZXRPYmplY3QoT2JqZWN0IHZhbHVlKQotICAgIHsKLSAgICAgICAgaW5pdGlhbGl6ZSgpOwotCi0gICAgICAgIGlmIChfaW52YXJpYW50KQotICAgICAgICAgICAgdGhyb3cgY3JlYXRlUmVhZE9ubHlCaW5kaW5nRXhjZXB0aW9uKHRoaXMpOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBPZ25sLnNldFZhbHVlKF9wYXJzZWRFeHByZXNzaW9uLCBnZXRPZ25sQ29udGV4dCgpLCBfcm9vdCwgdmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChPZ25sRXhjZXB0aW9uIGV4KQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQmluZGluZ0V4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICBUYXBlc3RyeS5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICJFeHByZXNzaW9uQmluZGluZy51bmFibGUtdG8tdXBkYXRlLWV4cHJlc3Npb24iLAotICAgICAgICAgICAgICAgICAgICBfZXhwcmVzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgX3Jvb3QsCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlKSwKLSAgICAgICAgICAgICAgICB0aGlzLAotICAgICAgICAgICAgICAgIGV4KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIHRoZSBhIFN0cmluZyByZXByZXNlbnRpbmcgdGhlIHByb3BlcnR5IHBhdGguICBUaGlzIGluY2x1ZGVzCi0gICAgICogIHRoZSB7QGxpbmsgSUNvbXBvbmVudCNnZXRFeHRlbmRlZElkKCkgZXh0ZW5kZWQgaWR9IG9mIHRoZSByb290IGNvbXBvbmVudAotICAgICAqICBhbmQgdGhlIHByb3BlcnR5IHBhdGggLi4uIG9uY2UgdGhlIGJpbmRpbmcgaXMgdXNlZCwgdGhlc2UgbWF5IGNoYW5nZQotICAgICAqICBkdWUgdG8gb3B0aW1pemF0aW9uIG9mIHRoZSBwcm9wZXJ0eSBwYXRoLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gICAgewotICAgICAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0gICAgICAgIGJ1ZmZlci5hcHBlbmQoIkV4cHJlc3Npb25CaW5kaW5nWyIpOwotICAgICAgICBidWZmZXIuYXBwZW5kKF9yb290LmdldEV4dGVuZGVkSWQoKSk7Ci0KLSAgICAgICAgaWYgKF9leHByZXNzaW9uICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoJyAnKTsKLSAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoX2V4cHJlc3Npb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKF9pbnZhcmlhbnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIiBjYWNoZWRWYWx1ZT0iKTsKLSAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoX2NhY2hlZFZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGJ1ZmZlci5hcHBlbmQoJ10nKTsKLQotICAgICAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0gICAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2JpbmRpbmcvRmllbGRCaW5kaW5nLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvYmluZGluZy9GaWVsZEJpbmRpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQ5ZjI0My4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvYmluZGluZy9GaWVsZEJpbmRpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5iaW5kaW5nOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LkJpbmRpbmdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JTG9jYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVzb3VyY2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LlRhcGVzdHJ5OwotCi0vKioKLSAqCi0gKiAgQSB0eXBlIG9mIHN0YXRpYyB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5JQmluZGluZ30gdGhhdCBnZXRzIGl0IHZhbHVlIGZyb20gYSBwdWJsaWMgZmllbGQKLSAqICAoc3RhdGljIGNsYXNzIHZhcmlhYmxlKSBvZiBzb21lIGNsYXNzIG9yIGludGVyZmFjZS4KLSAqCi0gKiAgPHA+VGhlIGJpbmRpbmcgdXNlcyBhIGZpZWxkIG5hbWUsIHdoaWNoIGNvbnNpc3RzIG9mIGEgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgYW5kCi0gKiAgYSBzdGF0aWMgZmllbGQgb2YgdGhhdCBjbGFzcyBzZXBlcmF0ZWQgYnkgYSBkb3QuICBGb3IgZXhhbXBsZTogPGNvZGU+Y29tLmZvb2Jhci5Tb21lQ2xhc3MuU09NRV9GSUVMRDwvY29kZT4uCi0gKgotICogIDxwPklmIHRoZSBjbGFzcyBzcGVjaWZpZWQgaXMgZm9yIHRoZSA8Y29kZT5qYXZhLmxhbmc8L2NvZGU+IHBhY2thZ2UsIHRoZW4gdGhlIHBhY2thZ2UgbWF5IGJlCi0gKiAgb21taXR0ZWQuICBUaGlzIGFsbG93cyA8Y29kZT5Cb29sZWFuLlRSVUU8L2NvZGU+IHRvIGJlIHJlY29nbml6ZWQgYXMgYSB2YWxpZCB2YWx1ZS4KLSAqCi0gKiAgPHA+VGhlIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LmVuZ2luZS5JUGFnZVNvdXJjZX0gbWFpbnRhaW5zIGEgY2FjaGUgb2YgRmllbGRCaW5kaW5ncy4gIFRoaXMgbWVhbnMgdGhhdAotICogIGVhY2ggZmllbGQgd2lsbCBiZSByZXByZXNlbnRlZCBieSBhIHNpbmdsZSBiaW5kaW5nIC4uLiB0aGF0IG1lYW5zIHRoYXQgZm9yIGFueSBmaWVsZCwKLSAqICB0aGUgPGNvZGU+YWNjZXNzVmFsdWUoKTwvY29kZT4gbWV0aG9kICh3aGljaCBvYnRhaW5zIHRoZSB2YWx1ZSBmb3IgdGhlIGZpZWxkIHVzaW5nCi0gKiAgcmVmbGVjdGlvbikgd2lsbCBvbmx5IGJlIGludm9rZWQgb25jZS4KLSAqCi0gKiBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiBAdmVyc2lvbiAkSWQkCi0gKiBAZGVwcmVjYXRlZCBUbyBiZSByZW1vdmVkIGluIDIuNSB3aXRoIG5vIHJlcGxhY2VtZW50LiAgQ2FuIGJlIGFjY29tcGxpc2hlZCB1c2luZyBPR05MIGV4cHJlc3Npb25zLgotICogCi0gKiovCi0KLXB1YmxpYyBjbGFzcyBGaWVsZEJpbmRpbmcgZXh0ZW5kcyBBYnN0cmFjdEJpbmRpbmcKLXsKLSAgICBwcml2YXRlIFN0cmluZyBmaWVsZE5hbWU7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGFjY2Vzc2VkOwotICAgIHByaXZhdGUgT2JqZWN0IHZhbHVlOwotICAgIHByaXZhdGUgSVJlc291cmNlUmVzb2x2ZXIgcmVzb2x2ZXI7Ci0KLSAgICBwdWJsaWMgRmllbGRCaW5kaW5nKElSZXNvdXJjZVJlc29sdmVyIHJlc29sdmVyLCBTdHJpbmcgZmllbGROYW1lLCBJTG9jYXRpb24gbG9jYXRpb24pCi0gICAgewotICAgIAlzdXBlcihsb2NhdGlvbik7Ci0gICAgCQotICAgICAgICB0aGlzLnJlc29sdmVyID0gcmVzb2x2ZXI7Ci0gICAgICAgIHRoaXMuZmllbGROYW1lID0gZmllbGROYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICAgIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlcjsKLQotICAgICAgICBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCJGaWVsZEJpbmRpbmdbIik7Ci0gICAgICAgIGJ1ZmZlci5hcHBlbmQoZmllbGROYW1lKTsKLQotICAgICAgICBpZiAoYWNjZXNzZWQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIiAoIik7Ci0gICAgICAgICAgICBidWZmZXIuYXBwZW5kKHZhbHVlKTsKLSAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoJyknKTsKLSAgICAgICAgfQotCi0gICAgICAgIGJ1ZmZlci5hcHBlbmQoJ10nKTsKLQotICAgICAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRPYmplY3QoKQotICAgIHsKLSAgICAgICAgaWYgKCFhY2Nlc3NlZCkKLSAgICAgICAgICAgIGFjY2Vzc1ZhbHVlKCk7Ci0KLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhY2Nlc3NWYWx1ZSgpCi0gICAgewotICAgICAgICBTdHJpbmcgY2xhc3NOYW1lOwotICAgICAgICBTdHJpbmcgc2ltcGxlRmllbGROYW1lOwotICAgICAgICBpbnQgZG90eDsKLSAgICAgICAgQ2xhc3MgdGFyZ2V0Q2xhc3M7Ci0gICAgICAgIEZpZWxkIGZpZWxkOwotCi0gICAgICAgIGRvdHggPSBmaWVsZE5hbWUubGFzdEluZGV4T2YoJy4nKTsKLQotICAgICAgICBpZiAoZG90eCA8IDApCi0gICAgICAgICAgICB0aHJvdyBuZXcgQmluZGluZ0V4Y2VwdGlvbihUYXBlc3RyeS5mb3JtYXQoImludmFsaWQtZmllbGQtbmFtZSIsIGZpZWxkTmFtZSksIHRoaXMpOwotCi0gICAgICAgIC8vIEhtLiBTaG91bGQgdmFsaWRhdGUgdGhhdCB0aGVyZSdzIGEgZG90IQotCi0gICAgICAgIGNsYXNzTmFtZSA9IGZpZWxkTmFtZS5zdWJzdHJpbmcoMCwgZG90eCk7Ci0gICAgICAgIHNpbXBsZUZpZWxkTmFtZSA9IGZpZWxkTmFtZS5zdWJzdHJpbmcoZG90eCArIDEpOwotCi0gICAgICAgIC8vIFNpbXBsZSBjbGFzcyBuYW1lcyBhcmUgYXNzdW1lZCB0byBiZSBpbiB0aGUgamF2YS5sYW5nIHBhY2thZ2UuCi0KLSAgICAgICAgaWYgKGNsYXNzTmFtZS5pbmRleE9mKCcuJykgPCAwKQotICAgICAgICAgICAgY2xhc3NOYW1lID0gImphdmEubGFuZy4iICsgY2xhc3NOYW1lOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICB0YXJnZXRDbGFzcyA9IHJlc29sdmVyLmZpbmRDbGFzcyhjbGFzc05hbWUpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJpbmRpbmdFeGNlcHRpb24oVGFwZXN0cnkuZm9ybWF0KCJ1bmFibGUtdG8tcmVzb2x2ZS1jbGFzcyIsIGNsYXNzTmFtZSksIHRoaXMsIHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZpZWxkID0gdGFyZ2V0Q2xhc3MuZ2V0RmllbGQoc2ltcGxlRmllbGROYW1lKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoTm9TdWNoRmllbGRFeGNlcHRpb24gZXgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCaW5kaW5nRXhjZXB0aW9uKFRhcGVzdHJ5LmZvcm1hdCgiZmllbGQtbm90LWRlZmluZWQiLCBmaWVsZE5hbWUpLCB0aGlzLCBleCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBHZXQgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZC4gIG51bGwgbWVhbnMgbG9vayBmb3IgaXQgYXMgYSBzdGF0aWMKLSAgICAgICAgLy8gdmFyaWFibGUuCi0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHZhbHVlID0gZmllbGQuZ2V0KG51bGwpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGV4KQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQmluZGluZ0V4Y2VwdGlvbihUYXBlc3RyeS5mb3JtYXQoImlsbGVnYWwtZmllbGQtYWNjY2VzcyIsIGZpZWxkTmFtZSksIHRoaXMsIGV4KTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZXgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCaW5kaW5nRXhjZXB0aW9uKFRhcGVzdHJ5LmZvcm1hdCgiZmllbGQtaXMtaW5zdGFuY2UiLCBmaWVsZE5hbWUpLCB0aGlzLCBleCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBEb24ndCBsb29rIGZvciBpdCBhZ2FpbiwgZXZlbiBpZiB0aGUgdmFsdWUgaXMgaXRzZWxmIG51bGwuCi0KLSAgICAgICAgYWNjZXNzZWQgPSB0cnVlOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvYmluZGluZy9MaXN0ZW5lckJpbmRpbmcuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9iaW5kaW5nL0xpc3RlbmVyQmluZGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDI0YmQ4Li4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9iaW5kaW5nL0xpc3RlbmVyQmluZGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA2ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmJpbmRpbmc7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmJzZi5CU0ZFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5ic2YuQlNGTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LkFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LkJpbmRpbmdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JQWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JQ29tcG9uZW50OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUVuZ2luZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklMb2NhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklQYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlcXVlc3RDeWNsZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LlRhcGVzdHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkudXRpbC5wb29sLlBvb2w7Ci0KLS8qKgotICogIEEgdmVyeSBzcGVjaWFsaXplZCBiaW5kaW5nIHRoYXQgY2FuIGJlIHVzZWQgYXMgYW4ge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkuSUFjdGlvbkxpc3RlbmVyfSwKLSAqICBleGVjdXRpbmcgYSBzY3JpcHQgaW4gYSBzY3JpcHRpbmcgbGFuZ3VhZ2UsIHZpYQotICogIDxhIGhyZWY9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvYnNmIj5CZWFuIFNjcmlwdGluZyBGcmFtZXdvcms8L2E+LgotICoKLSAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiAgQHZlcnNpb24gJElkJAotICogIEBzaW5jZSAzLjAKLSAqCi0gKiovCi0KLXB1YmxpYyBjbGFzcyBMaXN0ZW5lckJpbmRpbmcgZXh0ZW5kcyBBYnN0cmFjdEJpbmRpbmcgaW1wbGVtZW50cyBJQWN0aW9uTGlzdGVuZXIKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgTE9HID0gTG9nRmFjdG9yeS5nZXRMb2coTGlzdGVuZXJCaW5kaW5nLmNsYXNzKTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCU0ZfUE9PTF9LRVkgPSAib3JnLmFwYWNoZS50YXBlc3RyeS5CU0ZNYW5hZ2VyIjsKLQotICAgIHByaXZhdGUgU3RyaW5nIF9sYW5ndWFnZTsKLSAgICBwcml2YXRlIFN0cmluZyBfc2NyaXB0OwotICAgIHByaXZhdGUgSUNvbXBvbmVudCBfY29tcG9uZW50OwotCi0gICAgcHVibGljIExpc3RlbmVyQmluZGluZyhJQ29tcG9uZW50IGNvbXBvbmVudCwgU3RyaW5nIGxhbmd1YWdlLCBTdHJpbmcgc2NyaXB0LCBJTG9jYXRpb24gbG9jYXRpb24pCi0gICAgewotICAgICAgICBzdXBlcihsb2NhdGlvbik7Ci0KLSAgICAgICAgX2NvbXBvbmVudCA9IGNvbXBvbmVudDsKLSAgICAgICAgX2xhbmd1YWdlID0gbGFuZ3VhZ2U7Ci0gICAgICAgIF9zY3JpcHQgPSBzY3JpcHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEFsd2F5cyByZXR1cm5zIHRydWUuCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0Qm9vbGVhbigpCi0gICAgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldEludCgpCi0gICAgewotICAgICAgICB0aHJvdyBuZXcgQmluZGluZ0V4Y2VwdGlvbigKLSAgICAgICAgICAgIFRhcGVzdHJ5LmZvcm1hdCgiTGlzdGVuZXJCaW5kaW5nLmludmFsaWQtYWNjZXNzIiwgImdldEludCgpIiksCi0gICAgICAgICAgICB0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZG91YmxlIGdldERvdWJsZSgpCi0gICAgewotICAgICAgICB0aHJvdyBuZXcgQmluZGluZ0V4Y2VwdGlvbigKLSAgICAgICAgICAgIFRhcGVzdHJ5LmZvcm1hdCgiTGlzdGVuZXJCaW5kaW5nLmludmFsaWQtYWNjZXNzIiwgImdldERvdWJsZSgpIiksCi0gICAgICAgICAgICB0aGlzKTsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIHRoZSB1bmRlcmx5aW5nIHNjcmlwdC4KLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZygpCi0gICAgewotICAgICAgICByZXR1cm4gX3NjcmlwdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0aGlzLgotICAgICAqIAotICAgICAqKi8KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBBIExpc3RlbmVyQmluZGluZyBpcyBhbHNvIGEge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkuSUFjdGlvbkxpc3RlbmVyfS4gIEl0Ci0gICAgICogIHJlZ2lzdGVycyBhIG51bWJlciBvZiBiZWFucyB3aXRoIHRoZSBCU0YgbWFuYWdlciBhbmQgaW52b2tlcyB0aGUKLSAgICAgKiAgc2NyaXB0LgotICAgICAqIAotICAgICAqICA8cD4KLSAgICAgKiAgUmVnaXN0ZXJzIHRoZSBmb2xsb3dpbmcgYmVhbjoKLSAgICAgKiAgPHVsPgotICAgICAqICA8bGk+Y29tcG9uZW50IC0gdGhlIHJlbGV2YW50IHtAbGluayBJQ29tcG9uZW50fSwgdHlwaWNhbGx5IHRoZSBzYW1lIGFzIHRoZSBwYWdlIAotICAgICAqICA8bGk+cGFnZSAtIHRoZSB7QGxpbmsgSVBhZ2V9IHRyaWdnZWQgYnkgdGhlIHJlcXVlc3QgKG9idGFpbmVkIGJ5IHtAbGluayBJUmVxdWVzdEN5Y2xlI2dldFBhZ2UoKX0KLSAgICAgKiAgPGxpPmN5Y2xlIC0gdGhlIHtAbGluayBJUmVxdWVzdEN5Y2xlfSwgZnJvbSB3aGljaCBjYW4gYmUgZm91bmQKLSAgICAgKiAgdGhlIHtAbGluayBJRW5naW5lfSwgZXRjLgotICAgICAqICA8L3VsPgotICAgICAqIAotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIGFjdGlvblRyaWdnZXJlZChJQ29tcG9uZW50IGNvbXBvbmVudCwgSVJlcXVlc3RDeWNsZSBjeWNsZSkKLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gZGVidWcgPSBMT0cuaXNEZWJ1Z0VuYWJsZWQoKTsKLQotICAgICAgICBsb25nIHN0YXJ0VGltZSA9IGRlYnVnID8gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgOiAwOwotCi0gICAgICAgIEJTRk1hbmFnZXIgYnNmID0gb2J0YWluQlNGTWFuYWdlcihjeWNsZSk7Ci0KLSAgICAgICAgSUxvY2F0aW9uIGxvY2F0aW9uID0gZ2V0TG9jYXRpb24oKTsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgSVBhZ2UgcGFnZSA9IGN5Y2xlLmdldFBhZ2UoKTsKLQotICAgICAgICAgICAgYnNmLmRlY2xhcmVCZWFuKCJjb21wb25lbnQiLCBfY29tcG9uZW50LCBfY29tcG9uZW50LmdldENsYXNzKCkpOwotICAgICAgICAgICAgYnNmLmRlY2xhcmVCZWFuKCJwYWdlIiwgcGFnZSwgcGFnZS5nZXRDbGFzcygpKTsKLSAgICAgICAgICAgIGJzZi5kZWNsYXJlQmVhbigiY3ljbGUiLCBjeWNsZSwgY3ljbGUuZ2V0Q2xhc3MoKSk7Ci0KLSAgICAgICAgICAgIGJzZi5leGVjKAotICAgICAgICAgICAgICAgIF9sYW5ndWFnZSwKLSAgICAgICAgICAgICAgICBsb2NhdGlvbi5nZXRSZXNvdXJjZUxvY2F0aW9uKCkudG9TdHJpbmcoKSwKLSAgICAgICAgICAgICAgICBsb2NhdGlvbi5nZXRMaW5lTnVtYmVyKCksCi0gICAgICAgICAgICAgICAgbG9jYXRpb24uZ2V0TGluZU51bWJlcigpLAotICAgICAgICAgICAgICAgIF9zY3JpcHQpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChCU0ZFeGNlcHRpb24gZXgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0KLSAgICAgICAgICAgICAgICBUYXBlc3RyeS5mb3JtYXQoIkxpc3RlbmVyQmluZGluZy5ic2YtZXhjZXB0aW9uIiwgbG9jYXRpb24sIGV4LmdldE1lc3NhZ2UoKSk7Ci0KLSAgICAgICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24obWVzc2FnZSwgX2NvbXBvbmVudCwgZ2V0TG9jYXRpb24oKSwgZXgpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKExPRy5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIExPRy5kZWJ1ZygiQ2xlYW5pbmcgdXAgIiArIGJzZik7Ci0KLSAgICAgICAgICAgIHVuZGVjbGFyZShic2YsICJjb21wb25lbnQiKTsKLSAgICAgICAgICAgIHVuZGVjbGFyZShic2YsICJwYWdlIik7Ci0gICAgICAgICAgICB1bmRlY2xhcmUoYnNmLCAiY3ljbGUiKTsKLQotICAgICAgICAgICAgY3ljbGUuZ2V0RW5naW5lKCkuZ2V0UG9vbCgpLnN0b3JlKEJTRl9QT09MX0tFWSwgYnNmKTsKLQotICAgICAgICAgICAgaWYgKGRlYnVnKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvbmcgZW5kVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCi0gICAgICAgICAgICAgICAgTE9HLmRlYnVnKAotICAgICAgICAgICAgICAgICAgICAiRXhlY3V0aW9uIG9mIFwiIiArIGxvY2F0aW9uICsgIlwiIHRvb2sgIiArIChlbmRUaW1lIC0gc3RhcnRUaW1lKSArICIgbWlsbGlzIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdW5kZWNsYXJlKEJTRk1hbmFnZXIgYnNmLCBTdHJpbmcgbmFtZSkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBic2YudW5kZWNsYXJlQmVhbihuYW1lKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoQlNGRXhjZXB0aW9uIGV4KQotICAgICAgICB7Ci0gICAgICAgICAgICBMT0cud2FybihUYXBlc3RyeS5mb3JtYXQoIkxpc3RlbmVyQmluZGluZy51bmFibGUtdG8tdW5kZWNsYXJlLWJlYW4iLCBleCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBCU0ZNYW5hZ2VyIG9idGFpbkJTRk1hbmFnZXIoSVJlcXVlc3RDeWNsZSBjeWNsZSkKLSAgICB7Ci0gICAgICAgIElFbmdpbmUgZW5naW5lID0gY3ljbGUuZ2V0RW5naW5lKCk7Ci0gICAgICAgIFBvb2wgcG9vbCA9IGVuZ2luZS5nZXRQb29sKCk7Ci0KLSAgICAgICAgQlNGTWFuYWdlciByZXN1bHQgPSAoQlNGTWFuYWdlcikgcG9vbC5yZXRyaWV2ZShCU0ZfUE9PTF9LRVkpOwotCi0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgTE9HLmRlYnVnKCJDcmVhdGluZyBuZXcgQlNGTWFuYWdlciBpbnN0YW5jZS4iKTsKLQotICAgICAgICAgICAgcmVzdWx0ID0gbmV3IEJTRk1hbmFnZXIoKTsKLQotICAgICAgICAgICAgcmVzdWx0LnNldENsYXNzTG9hZGVyKGVuZ2luZS5nZXRSZXNvdXJjZVJlc29sdmVyKCkuZ2V0Q2xhc3NMb2FkZXIoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9iaW5kaW5nL1N0YXRpY0JpbmRpbmcuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9iaW5kaW5nL1N0YXRpY0JpbmRpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBiZjk1My4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvYmluZGluZy9TdGF0aWNCaW5kaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5iaW5kaW5nOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JTG9jYXRpb247Ci0KLS8qKgotICogU3RvcmVzIGEgc3RhdGljIChpbnZhcmlhbnQpIFN0cmluZyBhcyB0aGUgdmFsdWUuCi0gKgotICogPHA+SXQgbWF5IGJlIHVzZWZ1bCB0byBjYWNoZSBzdGF0aWMgYmluZGluZ3MgdGhlIHdheSB7QGxpbmsgRmllbGRCaW5kaW5nfXMgYXJlIGNhY2hlZC4KLSAqCi0gKiBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiBAdmVyc2lvbiAkSWQkCi0gKiAKLSAqKi8KLQotcHVibGljIGNsYXNzIFN0YXRpY0JpbmRpbmcgZXh0ZW5kcyBBYnN0cmFjdEJpbmRpbmcKLXsKLSAgICBwcml2YXRlIFN0cmluZyBfdmFsdWU7Ci0gICAgcHJpdmF0ZSBib29sZWFuIF9wYXJzZWRJbnQ7Ci0gICAgcHJpdmF0ZSBpbnQgX2ludFZhbHVlOwotICAgIHByaXZhdGUgYm9vbGVhbiBfcGFyc2VkRG91YmxlOwotICAgIHByaXZhdGUgZG91YmxlIF9kb3VibGVWYWx1ZTsKLQotICAgIHB1YmxpYyBTdGF0aWNCaW5kaW5nKFN0cmluZyB2YWx1ZSwgSUxvY2F0aW9uIGxvY2F0aW9uKQotICAgIHsKLSAgICAJc3VwZXIobG9jYXRpb24pOwotICAgIAkKLSAgICAgICAgX3ZhbHVlID0gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEludGVycHJldHMgdGhlIHN0YXRpYyB2YWx1ZSBhcyBhbiBpbnRlZ2VyLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIGludCBnZXRJbnQoKQotICAgIHsKLSAgICAgICAgaWYgKCFfcGFyc2VkSW50KQotICAgICAgICB7Ci0gICAgICAgICAgICBfaW50VmFsdWUgPSBJbnRlZ2VyLnBhcnNlSW50KF92YWx1ZSk7Ci0gICAgICAgICAgICBfcGFyc2VkSW50ID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBfaW50VmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEludGVycHJldHMgdGhlIHN0YXRpYyB2YWx1ZSBhcyBhIGRvdWJsZS4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBkb3VibGUgZ2V0RG91YmxlKCkKLSAgICB7Ci0gICAgICAgIGlmICghX3BhcnNlZERvdWJsZSkKLSAgICAgICAgewotICAgICAgICAgICAgX2RvdWJsZVZhbHVlID0gRG91YmxlLnBhcnNlRG91YmxlKF92YWx1ZSk7Ci0gICAgICAgICAgICBfcGFyc2VkRG91YmxlID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBfZG91YmxlVmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRTdHJpbmcoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF92YWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldE9iamVjdCgpCi0gICAgewotICAgICAgICByZXR1cm4gX3ZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICJTdGF0aWNCaW5kaW5nWyIgKyBfdmFsdWUgKyAiXSI7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9iaW5kaW5nL1N0cmluZ0JpbmRpbmcuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9iaW5kaW5nL1N0cmluZ0JpbmRpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ5ZmY3ZS4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvYmluZGluZy9TdHJpbmdCaW5kaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5iaW5kaW5nOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JQ29tcG9uZW50OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUxvY2F0aW9uOwotCi0vKioKLSAqICBBIGJpbmRpbmcgdGhhdCBjb25uZWN0cyBkaXJlY3RseSB0byBhIGxvY2FsaXplZCBzdHJpbmcgZm9yCi0gKiAgYSBjb21wb25lbnQuCi0gKgotICogIEBzZWUgSUNvbXBvbmVudCNnZXRTdHJpbmcoU3RyaW5nKQotICogCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogIEB2ZXJzaW9uICRJZCQKLSAqICBAc2luY2UgMi4wLjQKLSAqCi0gKiovCi0KLXB1YmxpYyBjbGFzcyBTdHJpbmdCaW5kaW5nIGV4dGVuZHMgQWJzdHJhY3RCaW5kaW5nCi17Ci0gICAgcHJpdmF0ZSBJQ29tcG9uZW50IF9jb21wb25lbnQ7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgX2tleTsKLQotICAgIHB1YmxpYyBTdHJpbmdCaW5kaW5nKElDb21wb25lbnQgY29tcG9uZW50LCBTdHJpbmcga2V5LCBJTG9jYXRpb24gbG9jYXRpb24pCi0gICAgewotICAgIAlzdXBlcihsb2NhdGlvbik7Ci0gICAgCQotICAgICAgICBfY29tcG9uZW50ID0gY29tcG9uZW50OwotICAgICAgICBfa2V5ID0ga2V5OwotICAgIH0KLQotICAgIHB1YmxpYyBJQ29tcG9uZW50IGdldENvbXBvbmVudCgpCi0gICAgewotICAgICAgICByZXR1cm4gX2NvbXBvbmVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEtleSgpCi0gICAgewotICAgICAgICByZXR1cm4gX2tleTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgQWNjZXNzZXMgdGhlIHNwZWNpZmllZCBsb2NhbGl6ZWQgc3RyaW5nLiAgTmV2ZXIgcmV0dXJucyBudWxsLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIE9iamVjdCBnZXRPYmplY3QoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9jb21wb25lbnQuZ2V0TWVzc2FnZXMoKS5nZXRNZXNzYWdlKF9rZXkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIHRydWUuICBMb2NhbGl6ZWQgY29tcG9uZW50IHN0cmluZ3MgYXJlCi0gICAgICogIHJlYWQtb25seS4KLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0ludmFyaWFudCgpCi0gICAgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgICB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCJTdHJpbmdCaW5kaW5nIik7Ci0gICAgICAgIGJ1ZmZlci5hcHBlbmQoJ1snKTsKLSAgICAgICAgYnVmZmVyLmFwcGVuZChfY29tcG9uZW50LmdldEV4dGVuZGVkSWQoKSk7Ci0gICAgICAgIGJ1ZmZlci5hcHBlbmQoJyAnKTsKLSAgICAgICAgYnVmZmVyLmFwcGVuZChfa2V5KTsKLSAgICAgICAgYnVmZmVyLmFwcGVuZCgnXScpOwotCi0gICAgICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2JpbmRpbmcvcGFja2FnZS5odG1sIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2JpbmRpbmcvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODkzMDYzLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9iaW5kaW5nL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLTwhZG9jdHlwZSBodG1sIHB1YmxpYyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci08IS0tICRJZCQgLS0+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlRhcGVzdHJ5OiBXZWIgQXBwbGljYXRpb24gRnJhbWV3b3JrPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotCi08cD5JbXBsZW1lbnRhdGlvbnMgb2Yge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkuSUJpbmRpbmd9LgotCi1AYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwIDxhIGhyZWY9Im1haWx0bzpobHNoaXBAYXBhY2hlLm9yZyI+aGxzaGlwQGFwYWNoZS5vcmc8L2E+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jYWxsYmFjay9EaXJlY3RDYWxsYmFjay5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NhbGxiYWNrL0RpcmVjdENhbGxiYWNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiODkwZGYuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NhbGxiYWNrL0RpcmVjdENhbGxiYWNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuY2FsbGJhY2s7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LkFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JRGlyZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVBhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVxdWVzdEN5Y2xlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuVGFwZXN0cnk7Ci0KLS8qKgotICogIFNpbXBsZSBjYWxsYmFjayBmb3IgcmUtaW52b2tpbmcgYSB7QGxpbmsgSURpcmVjdH0gY29tcG9uZW50IHRyaWdnZXIuLgotICoKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogIEBzaW5jZSAwLjIuOQotICoKLSAqKi8KLQotcHVibGljIGNsYXNzIERpcmVjdENhbGxiYWNrIGltcGxlbWVudHMgSUNhbGxiYWNrCi17Ci0gICAgLyoqCi0gICAgICogIEBzaW5jZSAyLjAuNAotICAgICAqIAotICAgICAqKi8KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC04ODg4ODQ3NjU1OTE3NTAzNDcxTDsKLQotICAgIHByaXZhdGUgU3RyaW5nIF9wYWdlTmFtZTsKLSAgICBwcml2YXRlIFN0cmluZyBfY29tcG9uZW50SWRQYXRoOwotICAgIHByaXZhdGUgT2JqZWN0W10gX3BhcmFtZXRlcnM7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgICB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCJEaXJlY3RDYWxsYmFja1siKTsKLQotICAgICAgICBidWZmZXIuYXBwZW5kKF9wYWdlTmFtZSk7Ci0gICAgICAgIGJ1ZmZlci5hcHBlbmQoJy8nKTsKLSAgICAgICAgYnVmZmVyLmFwcGVuZChfY29tcG9uZW50SWRQYXRoKTsKLQotICAgICAgICBpZiAoX3BhcmFtZXRlcnMgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIHNlcCA9ICIgIjsKLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfcGFyYW1ldGVycy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKHNlcCk7Ci0gICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChfcGFyYW1ldGVyc1tpXSk7Ci0KLSAgICAgICAgICAgICAgICBzZXAgPSAiLCAiOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgYnVmZmVyLmFwcGVuZCgnXScpOwotCi0gICAgICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqICBDcmVhdGVzIGEgbmV3IERpcmVjdENhbGxiYWNrIGZvciB0aGUgY29tcG9uZW50LiAgVGhlIHBhcmFtZXRlcnMKLSAgICAgKiAgKHdoaWNoIG1heSBiZSBudWxsKSBpcyByZXRhaW5lZCwgbm90IGNvcGllZC4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBEaXJlY3RDYWxsYmFjayhJRGlyZWN0IGNvbXBvbmVudCwgT2JqZWN0W10gcGFyYW1ldGVycykKLSAgICB7Ci0gICAgICAgIF9wYWdlTmFtZSA9IGNvbXBvbmVudC5nZXRQYWdlKCkuZ2V0UGFnZU5hbWUoKTsKLSAgICAgICAgX2NvbXBvbmVudElkUGF0aCA9IGNvbXBvbmVudC5nZXRJZFBhdGgoKTsKLSAgICAgICAgX3BhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBMb2NhdGVzIHRoZSB7QGxpbmsgSURpcmVjdH0gY29tcG9uZW50IHRoYXQgd2FzIHByZXZpb3VzbHkgaWRlbnRpZmllZAotICAgICAqICAoYW5kIHdob3NlIHBhZ2UgYW5kIGlkIHBhdGggd2VyZSBzdG9yZWQpLgotICAgICAqICBJbnZva2VzIHtAbGluayBJUmVxdWVzdEN5Y2xlI3NldFNlcnZpY2VQYXJhbWV0ZXJzKE9iamVjdFtdKX0gdG8KLSAgICAgKiAgcmVzdG9yZSB0aGUgc2VydmljZSBwYXJhbWV0ZXJzLCB0aGVuCi0gICAgICogIGludm9rZXMge0BsaW5rIElEaXJlY3QjdHJpZ2dlcihJUmVxdWVzdEN5Y2xlKX0gb24gdGhlIGNvbXBvbmVudC4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIHBlcmZvcm1DYWxsYmFjayhJUmVxdWVzdEN5Y2xlIGN5Y2xlKQotICAgIHsKLSAgICAgICAgSVBhZ2UgcGFnZSA9IGN5Y2xlLmdldFBhZ2UoX3BhZ2VOYW1lKTsKLSAgICAgICAgSUNvbXBvbmVudCBjb21wb25lbnQgPSBwYWdlLmdldE5lc3RlZENvbXBvbmVudChfY29tcG9uZW50SWRQYXRoKTsKLSAgICAgICAgSURpcmVjdCBkaXJlY3QgPSBudWxsOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBkaXJlY3QgPSAoSURpcmVjdCkgY29tcG9uZW50OwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZXgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgVGFwZXN0cnkuZm9ybWF0KCJEaXJlY3RDYWxsYmFjay53cm9uZy10eXBlIiwgY29tcG9uZW50LmdldEV4dGVuZGVkSWQoKSksCi0gICAgICAgICAgICAgICAgY29tcG9uZW50LAotICAgICAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAgICAgZXgpOwotICAgICAgICB9Ci0KLSAgICAgICAgY3ljbGUuc2V0U2VydmljZVBhcmFtZXRlcnMoX3BhcmFtZXRlcnMpOwotICAgICAgICBkaXJlY3QudHJpZ2dlcihjeWNsZSk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jYWxsYmFjay9FeHRlcm5hbENhbGxiYWNrLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY2FsbGJhY2svRXh0ZXJuYWxDYWxsYmFjay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MGQ1MGMzLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jYWxsYmFjay9FeHRlcm5hbENhbGxiYWNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuY2FsbGJhY2s7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LkFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklFeHRlcm5hbFBhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVxdWVzdEN5Y2xlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuVGFwZXN0cnk7Ci0KLS8qKgotICogIEEgY2FsbGJhY2sgZm9yIHJldHVybmluZyB0byBhbiB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5JRXh0ZXJuYWxQYWdlfS4KLSAqICA8cD4KLSAqICBFeGFtcGxlIHVzYWdlIG9mIDx0dD5FeHRlcm5hbENhbGxiYWNrPC90dD46IAotICogIDxwPgotICogIFRoZSBFeHRlcm5hbCBwYWdlIGVuc3VyZSBhIHVzZXIgaXMgYXV0aGVudGljYXRlZCBpbiB0aGUgCi0gKiAge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkuSVBhZ2UjdmFsaWRhdGUoSVJlcXVlc3RDeWNsZSl9IG1ldGhvZC4gCi0gKiAgSWYgdGhlIHVzZXIgaXMgbm90IGF1dGhlbnRpY2F0ZWQsIHRoZXkgYXJlIHJlZGlyZWN0ZWQgdG8gdGhlIExvZ2luIHBhZ2UsIGFmdGVyIAotICogIHNldHRpbmcgYSBjYWxsYmFjayBpbiB0aGUgTG9naW4gcGFnZS4KLSAqICA8cD4KLSAqICBUaGUgTG9naW4gcGFnZSA8dHQ+Zm9ybVN1Ym1pdCgpPC90dD4ge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkuSUFjdGlvbkxpc3RlbmVyfSAKLSAqICBhdXRoZW50aWNhdGVzIHRoZSB1c2VyIGFuZCB0aGVuIGludm9rZXMge0BsaW5rIElDYWxsYmFjayNwZXJmb3JtQ2FsbGJhY2soSVJlcXVlc3RDeWNsZSl9IAotICogIHRvIHRoZSBFeHRlcm5hbCBwYWdlLgotICogIDxwcmU+Ci0gKiAgcHVibGljIGNsYXNzIEV4dGVybmFsIGV4dGVuZHMgQmFzZVBhZ2UgaW1wbGVtZW50cyBJRXh0ZXJuYWxQYWdlIHsKLSAqIAotICogICAgICBwcml2YXRlIEludGVnZXIgX2l0ZW1JZDsKLSAqCi0gKiAgICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlKElSZXF1ZXN0Q3ljbGUgY3ljbGUpIHRocm93cyBSZXF1ZXN0Q3ljbGVFeGNlcHRpb24geyAgICAgICAgICAgIAotICogICAgICAgICAgVmlzaXQgdmlzaXQgPSAoVmlzaXQpIGdldFZpc2l0KCk7Ci0gKiAgICAgIAotICogICAgICAgICAgaWYgKCF2aXNpdC5pc0F1dGhlbnRpY2F0ZWQoKSkgewotICogICAgICAgICAgICAgIExvZ2luIGxvZ2luID0gKExvZ2luKSBjeWNsZS5nZXRQYWdlKCJMb2dpbiIpOwotICoKLSAqICAgICAgICAgICAgICBsb2dpbi5zZXRDYWxsYmFjawotICogICAgICAgICAgICAgICAgICAobmV3IEV4dGVybmFsQ2FsbGJhY2sodGhpcywgY3ljbGUuZ2V0U2VydmljZVBhcmFtZXRlcnMoKSkpOwotICogICAgICAgICAgICAgIAotICogICAgICAgICAgICAgIHRocm93IG5ldyBQYWdlUmVkaXJlY3RFeGNlcHRpb24obG9naW4pOwotICogICAgICAgICAgfSAgICAgICAgICAgIAotICogICAgICB9Ci0gKiAKLSAqICAgICAgcHVibGljIHZvaWQgYWN0aXZhdGVFeHRlcm5hbFBhZ2UoT2JqZWN0W10gcGFyYW1zLCBJUmVxdWVzdEN5Y2xlIGN5Y2xlKQotICogICAgICAgICAgICAgIHRocm93cyBSZXF1ZXN0Q3ljbGVFeGNlcHRpb24geyAgICAgICAgICAgIAotICogICAgICAgICAgX2l0ZW1JZCA9IChJbnRlZ2VyKSBwYXJhbXNbMF07Ci0gKiAgICAgIH0KLSAqICB9Ci0gKgotICogIHB1YmxpYyBMb2dpbiBleHRlbmRzIEJhc2VQYWdlIHsKLSAqIAotICogICAgICBwcml2YXRlIElDYWxsYmFjayBfY2FsbGJhY2s7Ci0gKgotICogICAgICBwdWJsaWMgdm9pZCBzZXRDYWxsYmFjayhJQ2FsbGJhY2sgX2NhbGxiYWNrKSB7Ci0gKiAgICAgICAgICBfY2FsbGJhY2sgPSBjYWxsYmFjazsKLSAqICAgICAgfQotICoKLSAqICAgICAgcHVibGljIHZvaWQgZm9ybVN1Ym1pdChJUmVxdWVzdEN5Y2xlIGN5Y2xlKSB7Ci0gKiAgICAgICAgICAvLyBBdXRoZW50aWNhdGlvbiBjb2RlCi0gKiAgICAgICAgICAuLgotICogICAKLSAqICAgICAgICAgIFZpc2l0IHZpc2l0ID0gKFZpc2l0KSBnZXRWaXNpdCgpOwotICoKLSAqICAgICAgICAgIHZpc2l0LnNldEF1dGhlbnRpY2F0ZWQodHJ1ZSk7Ci0gKiAgCi0gKiAgICAgICAgICBpZiAoX2NhbGxiYWNrICE9IG51bGwpIHsKLSAqICAgICAgICAgICAgICBfY2FsbGJhY2sucGVyZm9ybUNhbGxiYWNrKGN5Y2xlKTsKLSAqICAgICAgICAgIH0KLSAqICAgICAgfQotICogIH0gICAgCi0gKiAgPC9wcmU+Ci0gKiAKLSAqICBAc2VlIG9yZy5hcGFjaGUudGFwZXN0cnkuSUV4dGVybmFsUGFnZQotICogIEBzZWUgb3JnLmFwYWNoZS50YXBlc3RyeS5lbmdpbmUuRXh0ZXJuYWxTZXJ2aWNlCi0gKgotICogIEB2ZXJzaW9uICRJZCQKLSAqICBAYXV0aG9yIE1hbGNvbG0gRWRnYXIKLSAqICBAc2luY2UgMi4zCi0gKgotICoqLwotCi1wdWJsaWMgY2xhc3MgRXh0ZXJuYWxDYWxsYmFjayBpbXBsZW1lbnRzIElDYWxsYmFjawotewotICAgIHByaXZhdGUgU3RyaW5nIF9wYWdlTmFtZTsKLSAgICBwcml2YXRlIE9iamVjdFtdIF9wYXJhbWV0ZXJzOwotCi0gICAgLyoqCi0gICAgICogIENyZWF0ZXMgYSBuZXcgRXh0ZXJuYWxDYWxsYmFjayBmb3IgdGhlIG5hbWVkIDx0dD5JRXh0ZXJuYWxQYWdlPC90dD4uICAKLSAgICAgKiAgVGhlIHBhcmFtZXRlcnMgKHdoaWNoIG1heSBiZSBudWxsKSBpcyByZXRhaW5lZCwgbm90IGNvcGllZC4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBFeHRlcm5hbENhbGxiYWNrKFN0cmluZyBwYWdlTmFtZSwgT2JqZWN0W10gcGFyYW1ldGVycykKLSAgICB7Ci0gICAgICAgIF9wYWdlTmFtZSA9IHBhZ2VOYW1lOwotICAgICAgICBfcGFyYW1ldGVycyA9IHBhcmFtZXRlcnM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIENyZWF0ZXMgYSBuZXcgRXh0ZXJuYWxDYWxsYmFjayBmb3IgdGhlIHBhZ2UuICBUaGUgcGFyYW1ldGVycwotICAgICAqICAod2hpY2ggbWF5IGJlIG51bGwpIGlzIHJldGFpbmVkLCBub3QgY29waWVkLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIEV4dGVybmFsQ2FsbGJhY2soSUV4dGVybmFsUGFnZSBwYWdlLCBPYmplY3RbXSBwYXJhbWV0ZXJzKQotICAgIHsKLSAgICAgICAgX3BhZ2VOYW1lID0gcGFnZS5nZXRQYWdlTmFtZSgpOwotICAgICAgICBfcGFyYW1ldGVycyA9IHBhcmFtZXRlcnM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEludm9rZXMge0BsaW5rIElSZXF1ZXN0Q3ljbGUjc2V0UGFnZShTdHJpbmcpfSB0byBzZWxlY3QgdGhlIHByZXZpb3VzbHkKLSAgICAgKiAgaWRlbnRpZmllZCA8dHQ+SUV4dGVybmFsUGFnZTwvdHQ+IGFzIHRoZSByZXNwb25zZSBwYWdlIGFuZCBhY3RpdmF0ZXMKLSAgICAgKiAgdGhlIHBhZ2UgYnkgaW52b2tpbmcgPHR0PmFjdGl2YXRlRXh0ZXJuYWxQYWdlKCk8L3R0PiB3aXRoIHRoZSBjYWxsYmFjayAKLSAgICAgKiAgcGFyYW1ldGVycyBhbmQgcmVxdWVzdCBjeWNsZS4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIHBlcmZvcm1DYWxsYmFjayhJUmVxdWVzdEN5Y2xlIGN5Y2xlKQotICAgIHsgICAgICAgIAotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgSUV4dGVybmFsUGFnZSBwYWdlID0gKElFeHRlcm5hbFBhZ2UpIGN5Y2xlLmdldFBhZ2UoX3BhZ2VOYW1lKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgY3ljbGUuYWN0aXZhdGUocGFnZSk7Ci0gICAgCi0gICAgICAgICAgICBwYWdlLmFjdGl2YXRlRXh0ZXJuYWxQYWdlKF9wYXJhbWV0ZXJzLCBjeWNsZSk7ICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBleCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICBUYXBlc3RyeS5mb3JtYXQoIkV4dGVybmFsQ2FsbGJhY2sucGFnZS1ub3QtY29tcGF0aWJsZSIsIF9wYWdlTmFtZSksCi0gICAgICAgICAgICAgICAgZXgpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICAgIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoIkV4dGVybmFsQ2FsbGJhY2tbIik7Ci0KLSAgICAgICAgYnVmZmVyLmFwcGVuZChfcGFnZU5hbWUpOwotICAgICAgICBidWZmZXIuYXBwZW5kKCcvJyk7Ci0KLSAgICAgICAgaWYgKF9wYXJhbWV0ZXJzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBzZXAgPSAiICI7Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX3BhcmFtZXRlcnMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChzZXApOwotICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoX3BhcmFtZXRlcnNbaV0pOwotCi0gICAgICAgICAgICAgICAgc2VwID0gIiwgIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGJ1ZmZlci5hcHBlbmQoJ10nKTsKLQotICAgICAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0gICAgfSAgICAKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY2FsbGJhY2svSUNhbGxiYWNrLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY2FsbGJhY2svSUNhbGxiYWNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2MDI4ZWYuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NhbGxiYWNrL0lDYWxsYmFjay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuY2FsbGJhY2s7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlcXVlc3RDeWNsZTsKLQotLyoqCi0gKiAgRGVmaW5lcyBhIGNhbGxiYWNrLCBhbiBvYmplY3Qgd2hpY2ggaXMgdXNlZCB0byBpbnZva2Ugb3IgcmVpbnZva2UgYSBtZXRob2QKLSAqICBvbiBhbiBvYmplY3Qgb3IgY29tcG9uZW50IGluIGEgbGF0ZXIgcmVxdWVzdCBjeWNsZS4gIFRoaXMgaXMgdXNlZCB0bwotICogIGFsbG93IGNlcnRhaW4gb3BlcmF0aW9ucyAoc2F5LCBzdWJtaXR0aW5nIGFuIG9yZGVyKSB0byBkZWZlciB0byBvdGhlciBwcm9jZXNzZXMKLSAqICAoc2F5LCBsb2dnaW5nIGluIGFuZC9vciByZWdpc3RlcnJpbmcpLgotICoKLSAqICA8cD5DYWxsYmFja3MgbXVzdCBiZSB7QGxpbmsgU2VyaWFsaXphYmxlfSwgdG8gZW5zdXJlIHRoYXQgdGhleSBjYW4gYmUgc3RvcmVkCi0gKiAgYmV0d2VlbiByZXF1ZXN0IGN5Y2xlcy4KLSAqCi0gKiAgQHZlcnNpb24gJElkJAotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAc2luY2UgMC4yLjkKLSAqCi0gKiovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSUNhbGxiYWNrIGV4dGVuZHMgU2VyaWFsaXphYmxlCi17Ci0gICAgLyoqCi0gICAgICogIFBlcmZvcm1zIHRoZSBjYWxsIGJhY2suICBUeXBpY2FsIGltcGxlbWVudGF0aW9uIHdpbGwgbG9jYXRlIGEgcGFydGljdWxhcgotICAgICAqICBwYWdlIG9yIGNvbXBvbmVudCBhbmQgaW52b2tlIGEgbWV0aG9kIHVwb24gaXQsIG9yIAotICAgICAqICBpbnZva2UgYSBtZXRob2Qgb24gdGhlIHtAbGluayBJUmVxdWVzdEN5Y2xlIGN5Y2xlfS4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIHBlcmZvcm1DYWxsYmFjayhJUmVxdWVzdEN5Y2xlIGN5Y2xlKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY2FsbGJhY2svUGFnZUNhbGxiYWNrLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY2FsbGJhY2svUGFnZUNhbGxiYWNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4N2M3YmMuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NhbGxiYWNrL1BhZ2VDYWxsYmFjay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNhbGxiYWNrOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUGFnZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZXF1ZXN0Q3ljbGU7Ci0KLS8qKgotICogIFNpbXBsZSBjYWxsYmFjayBmb3IgcmV0dXJuaW5nIHRvIGEgcGFnZS4KLSAqICA8cD4KLSAqICBFeGFtcGxlIHVzYWdlIG9mIDx0dD5QYWdlQ2FsbGJhY2s8L3R0PjoKLSAqICA8cD4KLSAqICBUaGUgSG9tZSBwYWdlIGVuc3VyZSBhIHVzZXIgaXMgCi0gKiAgYXV0aGVudGljYXRlZCBpbiB0aGUge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkuSVBhZ2UjdmFsaWRhdGUoSVJlcXVlc3RDeWNsZSl9IAotICogIG1ldGhvZC4gIElmIHRoZSB1c2VyIGlzIG5vdCBhdXRoZW50aWNhdGVkLCB0aGV5IGFyZSByZWRpcmVjdGVkIHRvIHRoZSBMb2dpbiAKLSAqICBwYWdlLCBhZnRlciBzZXR0aW5nIGEgY2FsbGJhY2sgaW4gdGhlIExvZ2luIHBhZ2UuCi0gKiAgPHA+Ci0gKiAgVGhlIExvZ2luIHBhZ2UgPHR0PmZvcm1TdWJtaXQoKTwvdHQ+IHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LklBY3Rpb25MaXN0ZW5lcn0gCi0gKiAgYXV0aGVudGljYXRlcyB0aGUgdXNlciBhbmQgdGhlbiBpbnZva2VzIHtAbGluayBJQ2FsbGJhY2sjcGVyZm9ybUNhbGxiYWNrKElSZXF1ZXN0Q3ljbGUpfSAKLSAqICB0byB0aGUgSG9tZSBwYWdlLgotICogIDxwcmU+Ci0gKiAgcHVibGljIGNsYXNzIEhvbWUgZXh0ZW5kcyBCYXNlUGFnZSB7Ci0gKiAKLSAqICAgICAgcHVibGljIHZvaWQgdmFsaWRhdGUoSVJlcXVlc3RDeWNsZSBjeWNsZSkgeyAgICAgICAgICAgIAotICogICAgICAgICAgVmlzaXQgdmlzaXQgPSAoVmlzaXQpIGdldFZpc2l0KCk7Ci0gKiAgICAgIAotICogICAgICAgICAgaWYgKCF2aXNpdC5pc0F1dGhlbnRpY2F0ZWQoKSkgewotICogICAgICAgICAgICAgIExvZ2luIGxvZ2luID0gKExvZ2luKSBjeWNsZS5nZXRQYWdlKCJMb2dpbiIpOwotICoKLSAqICAgICAgICAgICAgICBsb2dpbi5zZXRDYWxsYmFjayhuZXcgUGFnZUNhbGxiYWNrKHRoaXMpKTsKLSAqICAgICAgICAgICAgICAKLSAqICAgICAgICAgICAgICB0aHJvdyBuZXcgUGFnZVJlZGlyZWN0RXhjZXB0aW9uKGxvZ2luKTsKLSAqICAgICAgICAgIH0gICAgICAgICAgICAKLSAqICAgICAgfQotICogIH0KLSAqCi0gKiAgcHVibGljIExvZ2luIGV4dGVuZHMgQmFzZVBhZ2UgewotICogCi0gKiAgICAgIHByaXZhdGUgSUNhbGxiYWNrIF9jYWxsYmFjazsKLSAqCi0gKiAgICAgIHB1YmxpYyB2b2lkIHNldENhbGxiYWNrKElDYWxsYmFjayBfY2FsbGJhY2spIHsKLSAqICAgICAgICAgIF9jYWxsYmFjayA9IGNhbGxiYWNrOwotICogICAgICB9Ci0gKgotICogICAgICBwdWJsaWMgdm9pZCBmb3JtU3VibWl0KElSZXF1ZXN0Q3ljbGUgY3ljbGUpIHsKLSAqICAgICAgICAgIC8vIEF1dGhlbnRpY2F0aW9uIGNvZGUKLSAqICAgICAgICAgIC4uCi0gKiAgIAotICogICAgICAgICAgVmlzaXQgdmlzaXQgPSAoVmlzaXQpIGdldFZpc2l0KCk7Ci0gKgotICogICAgICAgICAgdmlzaXQuc2V0QXV0aGVudGljYXRlZCh0cnVlKTsKLSAqICAKLSAqICAgICAgICAgIGlmIChfY2FsbGJhY2sgIT0gbnVsbCkgewotICogICAgICAgICAgICAgIF9jYWxsYmFjay5wZXJmb3JtQ2FsbGJhY2soY3ljbGUpOwotICogICAgICAgICAgfQotICogICAgICB9Ci0gKiAgfSAgICAKLSAqICA8L3ByZT4KLSAqCi0gKiAgQHZlcnNpb24gJElkJAotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAc2luY2UgMC4yLjkKLSAqCi0gKiovCi0KLXB1YmxpYyBjbGFzcyBQYWdlQ2FsbGJhY2sgaW1wbGVtZW50cyBJQ2FsbGJhY2sKLXsKLSAgICAvKioKLSAgICAgKiAgQHNpbmNlIDIuMC40Ci0gICAgICogCi0gICAgICoqLwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTMyODY4MDY3NzYxMDU2OTAwNjhMOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgX3BhZ2VOYW1lOwotCi0gICAgcHVibGljIFBhZ2VDYWxsYmFjayhTdHJpbmcgcGFnZU5hbWUpCi0gICAgewotICAgICAgICBfcGFnZU5hbWUgPSBwYWdlTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUGFnZUNhbGxiYWNrKElQYWdlIHBhZ2UpCi0gICAgewotICAgICAgICB0aGlzKHBhZ2UuZ2V0UGFnZU5hbWUoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gICAgewotICAgICAgICByZXR1cm4gIlBhZ2VDYWxsYmFja1siICsgX3BhZ2VOYW1lICsgIl0iOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBJbnZva2VzIHtAbGluayBJUmVxdWVzdEN5Y2xlI2FjdGl2YXRlKFN0cmluZyl9IHRvIHNlbGVjdCB0aGUgcHJldmlvdXNseQotICAgICAqICBpZGVudGlmaWVkIHBhZ2UgYXMgdGhlIHJlc3BvbnNlIHBhZ2UuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCBwZXJmb3JtQ2FsbGJhY2soSVJlcXVlc3RDeWNsZSBjeWNsZSkKLSAgICB7Ci0gICAgICAgIGN5Y2xlLmFjdGl2YXRlKF9wYWdlTmFtZSk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jYWxsYmFjay9wYWNrYWdlLmh0bWwgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY2FsbGJhY2svcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjIzMzk2Li4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jYWxsYmFjay9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi08IWRvY3R5cGUgaHRtbCBwdWJsaWMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotPCEtLSAkSWQkIC0tPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5UYXBlc3RyeTogV2ViIEFwcGxpY2F0aW9uIEZyYW1ld29yazwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLQotPHA+UHJvdmlkZXMgaW1wbGVtZW50YXRpb25zIG9mIGNhbGxiYWNrcywgb2JqZWN0cyB0aGF0IGVuY2Fwc3VsYXRlIGEgc2VydmVyIHJlcXVlc3QgdGhhdCBpcyBkZWZlcnJlZCwKLXR5cGljYWxseSB0byBhbGxvdyBhIHVzZXIgdG8gbG9naW4gb3Igb3RoZXJ3aXNlIGF1dGhlbnRpY2F0ZSBiZWZvcmUgcHJvY2VlZGluZyB3aXRoCi1zb21lIG90aGVyIGFjdGl2aXR5LgotCi08cD5JbiBwcmFjdGljZSwgYW4gaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkuSVBhZ2UjdmFsaWRhdGUoSVJlcXVlc3RDeWNsZSl9IG9yCi17QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5JQWN0aW9uTGlzdGVuZXJ9IHdpbGwgY3JlYXRlIGEgY2FsbGJhY2ssIGFuZCBhc3NpZ24gaXQgYXMgYQotcGVyc2lzdGVudCBwYWdlIHByb3BlcnR5IG9mIGFuIGFwcGxpY2F0aW9uLXNwZWNpZmljIGxvZ2luIHBhZ2UuICBBZnRlciB0aGUgbG9naW4gY29tcGxldGVzLCBpdCAKLWNhbiB1c2UgdGhlIGNhbGxiYWNrIHRvIHJldHVybiB0aGUgdXNlciB0byB0aGUgZnVuY3Rpb25hbGl0eSB0aGF0IHdhcyBkZWZlcnJlZC4KLQotPHA+QW5vdGhlciBleGFtcGxlIHVzZSB3b3VsZCBiZSB0byBjb2xsZWN0IGJpbGxpbmcgYW5kIHNoaXBwaW5nIGluZm9ybWF0aW9uIGFzIHBhcnQgb2YKLWFuIGUtY29tbWVyY2Ugc2l0ZSdzIGNoZWNrb3V0IHdpemFyZC4KLQotQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcCA8YSBocmVmPSJtYWlsdG86aGxzaGlwQGFwYWNoZS5vcmciPmhsc2hpcEBhcGFjaGUub3JnPC9hPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29tcG9uZW50cy9BbnkuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb21wb25lbnRzL0FueS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGQxZWRlLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb21wb25lbnRzL0FueS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuY29tcG9uZW50czsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuQWJzdHJhY3RDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5BcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JTWFya3VwV3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlcXVlc3RDeWNsZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LlRhcGVzdHJ5OwotCi0vKioKLSAqICBBIGNvbXBvbmVudCB0aGF0IGNhbiBzdWJzdGl0dXRlIGZvciBhbnkgSFRNTCBlbGVtZW50LiAgCi0gKgotICogIFs8YSBocmVmPSIuLi8uLi8uLi8uLi8uLi9Db21wb25lbnRSZWZlcmVuY2UvQW55Lmh0bWwiPkNvbXBvbmVudCBSZWZlcmVuY2U8L2E+XQotICoKLSAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiAgQHZlcnNpb24gJElkJAotICogCi0gKiovCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBbnkgZXh0ZW5kcyBBYnN0cmFjdENvbXBvbmVudAotewotICAgIHByb3RlY3RlZCB2b2lkIHJlbmRlckNvbXBvbmVudChJTWFya3VwV3JpdGVyIHdyaXRlciwgSVJlcXVlc3RDeWNsZSBjeWNsZSkKLSAgICB7Ci0gICAgICAgIFN0cmluZyBlbGVtZW50ID0gZ2V0RWxlbWVudCgpOwotCi0gICAgICAgIGlmIChlbGVtZW50ID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIFRhcGVzdHJ5LmdldE1lc3NhZ2UoIkFueS5lbGVtZW50LW5vdC1kZWZpbmVkIiksCi0gICAgICAgICAgICAgICAgdGhpcywKLSAgICAgICAgICAgICAgICBudWxsLAotICAgICAgICAgICAgICAgIG51bGwpOwotCi0gICAgICAgIGlmICghY3ljbGUuaXNSZXdpbmRpbmcoKSkKLSAgICAgICAgewotICAgICAgICAgICAgd3JpdGVyLmJlZ2luKGVsZW1lbnQpOwotCi0gICAgICAgICAgICByZW5kZXJJbmZvcm1hbFBhcmFtZXRlcnMod3JpdGVyLCBjeWNsZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZW5kZXJCb2R5KHdyaXRlciwgY3ljbGUpOwotCi0gICAgICAgIGlmICghY3ljbGUuaXNSZXdpbmRpbmcoKSkKLSAgICAgICAgewotICAgICAgICAgICAgd3JpdGVyLmVuZChlbGVtZW50KTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRFbGVtZW50KCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbXBvbmVudHMvQW55Lmp3YyBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb21wb25lbnRzL0FueS5qd2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4MDdmYmQuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbXBvbmVudHMvQW55Lmp3YworKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAgCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPCEtLSAkSWQkIC0tPgotPCFET0NUWVBFIGNvbXBvbmVudC1zcGVjaWZpY2F0aW9uIFBVQkxJQyAKLSAgIi0vL0FwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLy9UYXBlc3RyeSBTcGVjaWZpY2F0aW9uIDMuMC8vRU4iIAotICAiaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy90YXBlc3RyeS9kdGQvVGFwZXN0cnlfM18wLmR0ZCI+Ci08Y29tcG9uZW50LXNwZWNpZmljYXRpb24gY2xhc3M9Im9yZy5hcGFjaGUudGFwZXN0cnkuY29tcG9uZW50cy5BbnkiPgotCi0gIDxkZXNjcmlwdGlvbj4KLSAgRHluYW1pY2FsbHkgZW11bGF0ZXMgYW55IGVsZW1lbnQsIGluY2x1ZGluZyBhdHRyaWJ1dGVzIChwcm92aWRlZCBhcwotICBpbmZvcm1hbCBwYXJhbWV0ZXJzKS4KLSAgPC9kZXNjcmlwdGlvbj4KLSAgCi0gIDxwYXJhbWV0ZXIgbmFtZT0iZWxlbWVudCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgZGlyZWN0aW9uPSJpbiIgcmVxdWlyZWQ9Im5vIiBkZWZhdWx0LXZhbHVlPSJ0ZW1wbGF0ZVRhZyI+Ci0gIAk8ZGVzY3JpcHRpb24+Ci0gIAlUaGUgZWxlbWVudCB0byBlbXVsYXRlLgotICAJPC9kZXNjcmlwdGlvbj4KLSAgPC9wYXJhbWV0ZXI+Ci0gIAotICA8cGFyYW1ldGVyIG5hbWU9InRlbXBsYXRlVGFnIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIiBkaXJlY3Rpb249ImF1dG8iIHJlcXVpcmVkPSJubyIgZGVmYXVsdC12YWx1ZT0ibnVsbCI+Ci0gIAk8ZGVzY3JpcHRpb24+Ci0gIAlUaGUgdGFnIHVzZWQgdG8gYWRkIHRoaXMgY29tcG9uZW50IGluIGEgdGVtcGxhdGUuCi0gIAk8L2Rlc2NyaXB0aW9uPgotICA8L3BhcmFtZXRlcj4KLSAgCi08L2NvbXBvbmVudC1zcGVjaWZpY2F0aW9uPgpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbXBvbmVudHMvQmxvY2suamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb21wb25lbnRzL0Jsb2NrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5MjY4MjguLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbXBvbmVudHMvQmxvY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbXBvbmVudHM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LkFic3RyYWN0Q29tcG9uZW50OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUNvbXBvbmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklNYXJrdXBXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVxdWVzdEN5Y2xlOwotCi0vKiogCi0gKiAgUHJldmVudHMgaXRzIGNvbnRlbnRzIGZyb20gYmVpbmcgcmVuZGVyZWQgdW50aWwgdHJpZ2dlcmVkIGJ5Ci0gKiAgYW4ge0BsaW5rIFJlbmRlckJsb2NrfSBjb21wb25lbnQuCi0gKgotICogIFs8YSBocmVmPSIuLi8uLi8uLi8uLi8uLi9Db21wb25lbnRSZWZlcmVuY2UvQmxvY2suaHRtbCI+Q29tcG9uZW50IFJlZmVyZW5jZTwvYT5dCi0gKgotICogIDxwPkJsb2NrIGFuZCB7QGxpbmsgUmVuZGVyQmxvY2t9IGFyZSB1c2VkIHRvIGJ1aWxkIGEgY2VydGFpbiBjbGFzcwotICogIG9mIGNvbXBsaWNhdGVkIGNvbXBvbmVudCB0aGF0IGNhbid0IGJlIGFzc2VtYmxlZCB1c2luZyB0aGUgbm9ybWFsCi0gKiAgd3JhcHBpbmcgY29udGFpbm1lbnQuICBTdWNoIGEgc3VwZXIgY29tcG9uZW50IHdvdWxkIGhhdmUgdHdvIG9yIG1vcmUKLSAqICBzZWN0aW9ucyB0aGF0IG5lZWQgdG8gYmUgc3VwcGxpZWQgYnkgdGhlIGNvbnRhaW5pbmcgcGFnZSAob3IgY29tcG9uZW50KS4KLSAqCi0gKiAgPHA+VXNpbmcgQmxvY2tzLCB0aGUgYmxvY2tzIGNhbiBiZSBwcm92aWRlZCBhcyBwYXJhbWV0ZXJzIHRvIHRoZSBzdXBlcgotICogIGNvbXBvbmVudC4KLSAqIAotICogIDxwPlRoZSBpbnNlcnRlciBwcm9wZXJ0eSBnaXZlcyB0aGUgY29tcG9uZW50cyBpbnNpZGUgdGhlIGJsb2NrIGFjY2VzcyB0bwotICogIHRoZSBjb21wb25lbnQgKHR5cGljYWxseSBhbiB7QGxpbmsgUmVuZGVyQmxvY2t9KSB0aGF0IGluc2VydGVkIHRoZSBibG9jaywKLSAqICBpbmNsdWRpbmcgYWNjZXNzIHRvIGl0cyBpbmZvcm1hbCBiaW5kaW5ncyB3aGljaCBhbGxvd3MgY29tcG9uZW50cyBjb250YWluZWQKLSAqICBieSB0aGUgQmxvY2sgdG8gYmUgcGFzc2VkIHBhcmFtZXRlcnMuICBOb3RlIC0gaXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZQotICogIGluc2VydGluZyBjb21wb25lbnQgdG8gc2V0IGl0c2VsZiBhcyB0aGUgQmxvY2sncyBpbnNlcnRlci4KLSAqCi0gKiAgQHZlcnNpb24gJElkJAotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAc2luY2UgMC4yLjkKLSAqIAotICoqLwotCi1wdWJsaWMgY2xhc3MgQmxvY2sgZXh0ZW5kcyBBYnN0cmFjdENvbXBvbmVudAotewotCXByaXZhdGUgSUNvbXBvbmVudCBfaW5zZXJ0ZXI7Ci0KLSAgICAvKioKLSAgICAgKiAgRG9lcyBub3RoaW5nOyB0aGUgaWRlYSBvZiBhIEJsb2NrIGlzIHRvIGRlZmVyIHRoZSByZW5kZXJpbmcgb2YKLSAgICAgKiAgdGhlIGJvZHkgb2YgdGhlIGJsb2NrIHVudGlsIGFuIHtAbGluayBSZW5kZXJCbG9ja30gZm9yY2VzIGl0Ci0gICAgICogIG91dC4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHByb3RlY3RlZCB2b2lkIHJlbmRlckNvbXBvbmVudChJTWFya3VwV3JpdGVyIHdyaXRlciwgSVJlcXVlc3RDeWNsZSBjeWNsZSkKLSAgICB7Ci0gICAgICAgIC8vIE5vdGhpbmchCi0gICAgfQotICAgIAotICAgIHB1YmxpYyBJQ29tcG9uZW50IGdldEluc2VydGVyKCkKLSAgICB7Ci0gICAgCXJldHVybiBfaW5zZXJ0ZXI7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldEluc2VydGVyKElDb21wb25lbnQgdmFsdWUpCi0gICAgewotICAgIAlfaW5zZXJ0ZXIgPSB2YWx1ZTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbXBvbmVudHMvQmxvY2suandjIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbXBvbmVudHMvQmxvY2suandjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTMyM2Y5Li4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb21wb25lbnRzL0Jsb2NrLmp3YworKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAgCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPCEtLSAkSWQkIC0tPgotPCFET0NUWVBFIGNvbXBvbmVudC1zcGVjaWZpY2F0aW9uIFBVQkxJQyAKLSAgIi0vL0FwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLy9UYXBlc3RyeSBTcGVjaWZpY2F0aW9uIDMuMC8vRU4iIAotICAiaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy90YXBlc3RyeS9kdGQvVGFwZXN0cnlfM18wLmR0ZCI+Ci0KLTxjb21wb25lbnQtc3BlY2lmaWNhdGlvbiBjbGFzcz0ib3JnLmFwYWNoZS50YXBlc3RyeS5jb21wb25lbnRzLkJsb2NrIiBhbGxvdy1pbmZvcm1hbC1wYXJhbWV0ZXJzPSJubyI+Ci0JPGRlc2NyaXB0aW9uPgotCUEgYmxvY2sgb2YgZHluYW1pYyBjb250ZW50LiAgQmxvY2tzIGRvbid0IHJlbmRlciB1bnRpbCBhIFJlbmRlckJsb2NrIGNvbXBvbmVudAotCXRyaWdnZXJzIHRoZW0uCi0JPC9kZXNjcmlwdGlvbj4KLTwvY29tcG9uZW50LXNwZWNpZmljYXRpb24+CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29tcG9uZW50cy9CbG9ja1JlbmRlcmVyLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29tcG9uZW50cy9CbG9ja1JlbmRlcmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzNmM5NzUuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbXBvbmVudHMvQmxvY2tSZW5kZXJlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuY29tcG9uZW50czsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSU1hcmt1cFdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZW5kZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVxdWVzdEN5Y2xlOwotCi0vKioKLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIElSZW5kZXIgdGhhdCByZW5kZXJzIGEgQmxvY2sgY29tcG9uZW50LgotICogCi0gKiA8cD5UaGUgQmxvY2tSZW5kZXJlciBhbGxvd3MgdGhlIGNvbnRlbnRzIG9mIGEge0BsaW5rIEJsb2NrfSB0byBiZSByZW5kZXJlZAotICogdmlhIHtAbGluayBJUmVuZGVyfS4gSXQgY2FuIGJlIHVzZWQgaW4gY2FzZXMgd2hlbiBhbiB7QGxpbmsgSVJlbmRlcn0gb2JqZWN0IGlzCi0gKiByZXF1aXJlZCBhcyBhbiBhcmd1bWVudCBvciBhIGJpbmRpbmcgdG8gcmVuZGVyIGEgcGFydCBvZiBhIENvbXBvbmVudC4gCi0gKiBUbyBwcm92aWRlIGEgY29tcGxpY2F0ZWQgdmlldywgaXQgY291bGQgYmUgZGVmaW5lZCBpbiBhIHtAbGluayBCbG9ja30gYW5kIHRoZW4KLSAqIHJldHVybmVkIGVuY2Fwc3VsYXRlZCBpbiBhIEJsb2NrUmVuZGVyZXIuCi0gKiAKLSAqIDxwPkl0IGlzIGltcG9ydGFudCB0byBub3RlIHRoYXQgYSBzcGVjaWFsIGNhcmUgaGFzIHRvIGJlIHRha2VuIGlmIAotICogdGhlIEJsb2NrUmVuZGVyZXIgaXMgdXNlZCB3aXRoaW4gYW4gaW5uZXIgY2xhc3Mgb2YgYSBjb21wb25lbnQgb3IgYSBwYWdlLiAKLSAqIEluIHN1Y2ggYSBjYXNlIHRoZSBpbnN0YW5jZSBvZiB0aGUgY29tcG9uZW50IHRoYXQgY3JlYXRlZCB0aGUgaW5uZXIgY2xhc3MgCi0gKiBtYXkgbm90IGJlIHRoZSBjdXJyZW50bHkgYWN0aXZlIGluc3RhbmNlIGluIHRoZSBSZXF1ZXN0Q3ljbGUgd2hlbiB0aGUgCi0gKiBCbG9ja1JlbmRlcmVyIGlzIHJlcXVpcmVkLiBUaHVzLCBjYWxsaW5nIGdldENvbXBvbmVudCgiYmxvY2tOYW1lIikgdG8gZ2V0IHRoZQotICogYmxvY2sgY29tcG9uZW50IG1heSByZXR1cm4gYSBCbG9jayBjb21wb25lbnQgdGhhdCBpcyBub3QgaW5pdGlhbGl6ZWQgZm9yIHRoaXMgCi0gKiBSZXF1ZXN0Q3ljbGUuCi0gKiAKLSAqIDxwPlRvIGF2b2lkIHNpbWlsYXIgcHJvYmxlbXMsIHRoZSBDb21wb25lbnRBZGRyZXNzIGNsYXNzIGNvdWxkIGJlIHVzZWQgaW4KLSAqIGNvbmp1bmN0aW9uIHdpdGggQmxvY2tSZW5kZXJlci4gCi0gKiBIZXJlIGlzIGEgcXVpY2sgZXhhbXBsZSBvZiBob3cgQmxvY2tSZW5kZXJlciBjb3VsZCBiZSB1c2VkIHdpdGggQ29tcG9uZW50QWRkcmVzczoKLSAqIDxwPgotICogPGNvZGU+Ci0gKiA8YnI+Ly8gQ3JlYXRlIGEgY29tcG9uZW50IGFkZHJlc3MgZm9yIHRoZSBjdXJyZW50IGNvbXBvbmVudAotICogPGJyPmZpbmFsIENvbXBvbmVudEFkZHJlc3MgYWRkcmVzcyA9IG5ldyBDb21wb25lbnRBZGRyZXNzKHRoaXMpOwotICogPGJyPnJldHVybiBuZXcgU29tZUNsYXNzKCkgewotICogPGJyPiZuYnNwOyZuYnNwO0lSZW5kZXIgZ2V0UmVuZGVyZXIoSVJlcXVlc3RDeWNsZSBjeWNsZSkgewotICogPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO015Q29tcG9uZW50IGNvbXBvbmVudCA9IChNeUNvbXBvbmVudCkgYWRkcmVzcy5maW5kQ29tcG9uZW50KGN5Y2xlKTsKLSAqIDxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsvLyBpbml0aWFsaXplIHZhcmlhYmxlcyBpbiB0aGUgY29tcG9uZW50IHRoYXQgd2lsbCBiZSB1c2VkIGJ5IHRoZSBibG9jayBoZXJlCi0gKiA8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7cmV0dXJuIG5ldyBCbG9ja1JlbmRlcmVyKGNvbXBvbmVudC5nZXRDb21wb25lbnQoImJsb2NrIikpOwotICogPGJyPiZuYnNwOyZuYnNwO30KLSAqIDxicj59Ci0gKiA8L2NvZGU+Ci0gKiAKLSAqIEB2ZXJzaW9uICRJZCQKLSAqIEBhdXRob3IgbWluZGJyaWRnZQotICogQHNpbmNlIDIuMgotICovCi1wdWJsaWMgY2xhc3MgQmxvY2tSZW5kZXJlciBpbXBsZW1lbnRzIElSZW5kZXIKLXsKLQlwcml2YXRlIEJsb2NrIG1fb2JqQmxvY2s7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IEJsb2NrUmVuZGVyZXIgdGhhdCB3aWxsIHJlbmRlciB0aGUgY29udGVudCBvZiB0aGUgYXJndW1lbnQKLQkgKiBAcGFyYW0gb2JqQmxvY2sgdGhlIEJsb2NrIHRvIGJlIHJlbmRlcmVkCi0JICovCi0JcHVibGljIEJsb2NrUmVuZGVyZXIoQmxvY2sgb2JqQmxvY2spCi0JewotCQltX29iakJsb2NrID0gb2JqQmxvY2s7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZW5kZXIjcmVuZGVyKElNYXJrdXBXcml0ZXIsIElSZXF1ZXN0Q3ljbGUpCi0JICovCi0JcHVibGljIHZvaWQgcmVuZGVyKElNYXJrdXBXcml0ZXIgd3JpdGVyLCBJUmVxdWVzdEN5Y2xlIGN5Y2xlKQotCXsKLQkJbV9vYmpCbG9jay5yZW5kZXJCb2R5KHdyaXRlciwgY3ljbGUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbXBvbmVudHMvQ29uZGl0aW9uYWwuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb21wb25lbnRzL0NvbmRpdGlvbmFsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmNTk3NDIuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbXBvbmVudHMvQ29uZGl0aW9uYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbXBvbmVudHM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LkFic3RyYWN0Q29tcG9uZW50OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSU1hcmt1cFdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZXF1ZXN0Q3ljbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5UYXBlc3RyeTsKLQotLyoqCi0gKiAgQSBjb25kaXRpb25hbCBlbGVtZW50IG9uIGEgcGFnZSB3aGljaCB3aWxsIHJlbmRlciBpdHMgd3JhcHBlZCBlbGVtZW50cwotICogIHplcm8gb3Igb25lIHRpbWVzLgotICoKLSAqICBbPGEgaHJlZj0iLi4vLi4vLi4vLi4vLi4vQ29tcG9uZW50UmVmZXJlbmNlL0NvbmRpdGlvbmFsLmh0bWwiPkNvbXBvbmVudCBSZWZlcmVuY2U8L2E+XQotICoKLSAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwLCBEYXZpZCBTb2xpcwotICogIEB2ZXJzaW9uICRJZCQKLSAqIAotICoqLwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29uZGl0aW9uYWwgZXh0ZW5kcyBBYnN0cmFjdENvbXBvbmVudCAKLXsKLQkvKioKLQkgKiAgUmVuZGVycyBpdHMgd3JhcHBlZCBjb21wb25lbnRzIG9ubHkgaWYgdGhlIGNvbmRpdGlvbiBpcyB0cnVlICh0ZWNobmljYWxseSwKLQkgKiAgaWYgY29uZGl0aW9uIG1hdGNoZXMgaW52ZXJ0KS4gCi0JICogIEFkZGl0aW9uYWxseSwgaWYgZWxlbWVudCBpcyBzcGVjaWZpZWQsIGNhbiBlbXVsYXRlIHRoYXQgSFRNTCBlbGVtZW50IGlmIGNvbmRpdGlvbiBpcyBtZXQKLQkgKgotCSAqKi8KLQotCXByb3RlY3RlZCB2b2lkIHJlbmRlckNvbXBvbmVudChJTWFya3VwV3JpdGVyIHdyaXRlciwgSVJlcXVlc3RDeWNsZSBjeWNsZSkgCi0JewotCQlpZiAoZXZhbHVhdGVDb25kaXRpb24oKSkgCi0JCXsKLQkJCVN0cmluZyBlbGVtZW50ID0gZ2V0RWxlbWVudCgpOwotCQkJCi0JCQlib29sZWFuIHJlbmRlciA9ICFjeWNsZS5pc1Jld2luZGluZygpICYmIFRhcGVzdHJ5LmlzTm9uQmxhbmsoZWxlbWVudCk7Ci0JCQkKLQkJCWlmIChyZW5kZXIpCi0JCQl7Ci0JCQkJd3JpdGVyLmJlZ2luKGVsZW1lbnQpOwotCQkJCXJlbmRlckluZm9ybWFsUGFyYW1ldGVycyh3cml0ZXIsIGN5Y2xlKTsKLQkJCX0KLQotCQkJcmVuZGVyQm9keSh3cml0ZXIsIGN5Y2xlKTsKLQkJCQotCQkJaWYgKHJlbmRlcikKLQkJCQl3cml0ZXIuZW5kKGVsZW1lbnQpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGV2YWx1YXRlQ29uZGl0aW9uKCkKLQl7Ci0JCXJldHVybiBnZXRDb25kaXRpb24oKSAhPSBnZXRJbnZlcnQoKTsKLQl9Ci0KLQlwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBnZXRDb25kaXRpb24oKTsKLQlwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBnZXRJbnZlcnQoKTsKLQotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0RWxlbWVudCgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb21wb25lbnRzL0NvbmRpdGlvbmFsLmp3YyBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb21wb25lbnRzL0NvbmRpdGlvbmFsLmp3YwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JmZjY2OC4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29tcG9uZW50cy9Db25kaXRpb25hbC5qd2MKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gIAotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTwhLS0gJElkJCAtLT4KLTwhRE9DVFlQRSBjb21wb25lbnQtc3BlY2lmaWNhdGlvbiBQVUJMSUMgCi0gICItLy9BcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi8vVGFwZXN0cnkgU3BlY2lmaWNhdGlvbiAzLjAvL0VOIiAKLSAgImh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvdGFwZXN0cnkvZHRkL1RhcGVzdHJ5XzNfMC5kdGQiPgotICAKLTxjb21wb25lbnQtc3BlY2lmaWNhdGlvbiBjbGFzcz0ib3JnLmFwYWNoZS50YXBlc3RyeS5jb21wb25lbnRzLkNvbmRpdGlvbmFsIj4KLSAgPGRlc2NyaXB0aW9uPgotICBDb25kaXRpb25hbGx5IGVtdWxhdGVzIGFuIGVsZW1lbnQgYW5kIGl0cyBhdHRyaWJ1dGVzIChpZiBlbGVtZW50IGlzIHNwZWNpZmllZCkgYW5kL29yIGluY2x1ZGVzIGEgYmxvY2sgb2YgY29udGVudCBpZiBhIGNvbmRpdGlvbiBpcyBtZXQuCi0gIDwvZGVzY3JpcHRpb24+Ci0gIAotICA8cGFyYW1ldGVyIG5hbWU9ImNvbmRpdGlvbiIgdHlwZT0iYm9vbGVhbiIgZGlyZWN0aW9uPSJpbiIgcmVxdWlyZWQ9InllcyI+Ci0gICAgPGRlc2NyaXB0aW9uPgotICAgIFRoZSBjb25kaXRpb24gdG8gZXZhbHVhdGUuCi0gICAgPC9kZXNjcmlwdGlvbj4KLSAgPC9wYXJhbWV0ZXI+Ci0gIAotICA8cGFyYW1ldGVyIG5hbWU9ImludmVydCIgdHlwZT0iYm9vbGVhbiIgZGlyZWN0aW9uPSJpbiI+Ci0gICAgPGRlc2NyaXB0aW9uPgotICAgIElmIHRydWUsIGludmVydHMgdGhlIGNvbmRpdGlvbiwgc28gdGhhdCBhIGZhbHNlIGNvbmRpdGlvbiBjYXVzZXMgdGhlIAotICAgIGNvbnRlbnQgdG8gYmUgaW5jbHVkZWQuICBJZiBmYWxzZSAodGhlIGRlZmF1bHQpLCB0aGVuIHRoZSBjb25kaXRpb24KLSAgICBpcyBldmFsdWF0ZWQgbm9ybWFsbHkuCi0gICAgPC9kZXNjcmlwdGlvbj4KLSAgPC9wYXJhbWV0ZXI+Ci0KLSAgPHBhcmFtZXRlciBuYW1lPSJlbGVtZW50IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIiBkaXJlY3Rpb249ImluIiByZXF1aXJlZD0ibm8iPgotICAJPGRlc2NyaXB0aW9uPgotICAJVGhlIGVsZW1lbnQgdG8gZW11bGF0ZS4KLSAgCTwvZGVzY3JpcHRpb24+Ci0gIDwvcGFyYW1ldGVyPgotICAKLTwvY29tcG9uZW50LXNwZWNpZmljYXRpb24+CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29tcG9uZW50cy9EZWxlZ2F0b3IuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb21wb25lbnRzL0RlbGVnYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODE3MTYwLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb21wb25lbnRzL0RlbGVnYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuY29tcG9uZW50czsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuQWJzdHJhY3RDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JTWFya3VwV3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlbmRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZXF1ZXN0Q3ljbGU7Ci0KLS8qKgotICogIEEgY29tcG9uZW50IHdoaWNoIGRlbGVnYXRlcyBpdCdzIGJlaGF2aW9yIHRvIGFub3RoZXIgb2JqZWN0LgotICoKLSAqICBbPGEgaHJlZj0iLi4vLi4vLi4vLi4vLi4vQ29tcG9uZW50UmVmZXJlbmNlL0RlbGVnYXRvci5odG1sIj5Db21wb25lbnQgUmVmZXJlbmNlPC9hPl0KLSAqCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogIEB2ZXJzaW9uICRJZCQKLSAqIAotICoqLwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRGVsZWdhdG9yIGV4dGVuZHMgQWJzdHJhY3RDb21wb25lbnQKLXsKLSAgICAvKioKLSAgICAgKiAgR2V0cyBpdHMgZGVsZWdhdGUgYW5kIGludm9rZXMge0BsaW5rIElSZW5kZXIjcmVuZGVyKElNYXJrdXBXcml0ZXIsIElSZXF1ZXN0Q3ljbGUpfQotICAgICAqICBvbiBpdC4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHByb3RlY3RlZCB2b2lkIHJlbmRlckNvbXBvbmVudChJTWFya3VwV3JpdGVyIHdyaXRlciwgSVJlcXVlc3RDeWNsZSBjeWNsZSkKLSAgICB7Ci0gICAgCUlSZW5kZXIgZGVsZWdhdGUgPSBnZXREZWxlZ2F0ZSgpOwotICAgIAkKLSAgICAgICAgaWYgKGRlbGVnYXRlICE9IG51bGwpCi0gICAgICAgIAlkZWxlZ2F0ZS5yZW5kZXIod3JpdGVyLCBjeWNsZSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBhYnN0cmFjdCBJUmVuZGVyIGdldERlbGVnYXRlKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbXBvbmVudHMvRGVsZWdhdG9yLmp3YyBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb21wb25lbnRzL0RlbGVnYXRvci5qd2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwMDAzMTkuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbXBvbmVudHMvRGVsZWdhdG9yLmp3YworKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAgCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPCEtLSAkSWQkIC0tPgotPCFET0NUWVBFIGNvbXBvbmVudC1zcGVjaWZpY2F0aW9uIFBVQkxJQyAKLSAgIi0vL0FwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLy9UYXBlc3RyeSBTcGVjaWZpY2F0aW9uIDMuMC8vRU4iIAotICAiaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy90YXBlc3RyeS9kdGQvVGFwZXN0cnlfM18wLmR0ZCI+Ci0KLTxjb21wb25lbnQtc3BlY2lmaWNhdGlvbiBjbGFzcz0ib3JnLmFwYWNoZS50YXBlc3RyeS5jb21wb25lbnRzLkRlbGVnYXRvciIKLSAgICBhbGxvdy1ib2R5PSJubyIgCi0JYWxsb3ctaW5mb3JtYWwtcGFyYW1ldGVycz0ibm8iPgotCi0gIDxkZXNjcmlwdGlvbj4KLSAgRGVsZWdhdGVzIHJlbmRlcmluZyB0byBhbiBvYmplY3QgdGhhdCBpbXBsZW1lbnRzIHRoZSBJUmVuZGVyIGludGVyZmFjZS4KLSAgPC9kZXNjcmlwdGlvbj4KLQotICA8cGFyYW1ldGVyIG5hbWU9ImRlbGVnYXRlIiB0eXBlPSJvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZW5kZXIiIGRpcmVjdGlvbj0iaW4iPgotICAgIDxkZXNjcmlwdGlvbj4KLSAgICBUaGUgb2JqZWN0IHdoaWNoIHdpbGwgcGVyZm9ybSB0aGUgcmVuZGVyLgotICAgIDwvZGVzY3JpcHRpb24+Ci0gIDwvcGFyYW1ldGVyPgotICAKLTwvY29tcG9uZW50LXNwZWNpZmljYXRpb24+CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29tcG9uZW50cy9Gb3JlYWNoLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29tcG9uZW50cy9Gb3JlYWNoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0M2VmOWQuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbXBvbmVudHMvRm9yZWFjaC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbXBvbmVudHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LkFic3RyYWN0Q29tcG9uZW50OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUJpbmRpbmc7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JTWFya3VwV3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlcXVlc3RDeWNsZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LlRhcGVzdHJ5OwotCi0vKioKLSAqICBSZXBlYXRlZGx5IHJlbmRlcnMgaXRzIHdyYXBwZWQgY29udGVudHMgd2hpbGUgaXRlcmF0aW5nIHRocm91Z2gKLSAqICBhIGxpc3Qgb2YgdmFsdWVzLgotICoKLSAqICBbPGEgaHJlZj0iLi4vLi4vLi4vLi4vLi4vQ29tcG9uZW50UmVmZXJlbmNlL0ZvcmVhY2guaHRtbCI+Q29tcG9uZW50IFJlZmVyZW5jZTwvYT5dCi0gKgotICogIDxwPgotICogIFdoaWxlIHRoZSBjb21wb25lbnQgaXMgcmVuZGVyaW5nLCB0aGUgcHJvcGVydHkKLSAqICB7QGxpbmsgI2dldFZhbHVlKCkgdmFsdWV9IChhY2Nlc3NlZCBhcwotICogIDxjb2RlPmNvbXBvbmVudHMuPGk+Zm9yZWFjaDwvaT4udmFsdWU8L2NvZGU+Ci0gKiAgaXMgc2V0IHRvIGVhY2ggc3VjY2Vzc2l2ZSB2YWx1ZSBmcm9tIHRoZSBzb3VyY2UsCi0gKiAgYW5kIHRoZSBwcm9wZXJ0eQotICogIHtAbGluayAjZ2V0SW5kZXgoKSBpbmRleH0gaXMgc2V0IHRvIGVhY2ggc3VjY2Vzc2l2ZSBpbmRleAotICogIGludG8gdGhlIHNvdXJjZSAoc3RhcnRpbmcgd2l0aCB6ZXJvKS4KLSAqIAotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAKLSAqKi8KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEZvcmVhY2ggZXh0ZW5kcyBBYnN0cmFjdENvbXBvbmVudAotewotICAgIHByaXZhdGUgT2JqZWN0IF92YWx1ZTsKLSAgICBwcml2YXRlIGludCBfaW5kZXg7Ci0gICAgcHJpdmF0ZSBib29sZWFuIF9yZW5kZXJpbmc7Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgSUJpbmRpbmcgZ2V0SW5kZXhCaW5kaW5nKCk7Ci0KLQotICAgIC8qKgotICAgICAqICBHZXRzIHRoZSBzb3VyY2UgYmluZGluZyBhbmQgcmV0dXJucyBhbiB7QGxpbmsgSXRlcmF0b3J9Ci0gICAgICogIHJlcHJlc2VudGluZwotICAgICAqICB0aGUgdmFsdWVzIGlkZW50aWZpZWQgYnkgdGhlIHNvdXJjZS4gIFJldHVybnMgYW4gZW1wdHkge0BsaW5rIEl0ZXJhdG9yfQotICAgICAqICBpZiB0aGUgYmluZGluZywgb3IgdGhlIGJpbmRpbmcgdmFsdWUsIGlzIG51bGwuCi0gICAgICoKLSAgICAgKiAgPHA+SW52b2tlcyB7QGxpbmsgVGFwZXN0cnkjY29lcmNlVG9JdGVyYXRvcihPYmplY3QpfSB0byBwZXJmb3JtCi0gICAgICogIHRoZSBhY3R1YWwgY29udmVyc2lvbi4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHByb3RlY3RlZCBJdGVyYXRvciBnZXRTb3VyY2VEYXRhKCkKLSAgICB7Ci0gICAgCU9iamVjdCBzb3VyY2UgPSBnZXRTb3VyY2UoKTsKLSAgICAJCi0gCQlpZiAoc291cmNlID09IG51bGwpCi0gCQkJcmV0dXJuIG51bGw7Ci0gCQkKLSAgICAgICAgcmV0dXJuIFRhcGVzdHJ5LmNvZXJjZVRvSXRlcmF0b3Ioc291cmNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgSUJpbmRpbmcgZ2V0VmFsdWVCaW5kaW5nKCk7Ci0KLSAgICAvKioKLSAgICAgKiAgR2V0cyB0aGUgc291cmNlIGJpbmRpbmcgYW5kIGl0ZXJhdGVzIHRocm91Z2gKLSAgICAgKiAgaXRzIHZhbHVlcy4gIEZvciBlYWNoLCBpdCB1cGRhdGVzIHRoZSB2YWx1ZSBiaW5kaW5nIGFuZCByZW5kZXIncyBpdHMgd3JhcHBlZCBlbGVtZW50cy4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHByb3RlY3RlZCB2b2lkIHJlbmRlckNvbXBvbmVudChJTWFya3VwV3JpdGVyIHdyaXRlciwgSVJlcXVlc3RDeWNsZSBjeWNsZSkKLSAgICB7Ci0gICAgICAgIEl0ZXJhdG9yIGRhdGFTb3VyY2UgPSBnZXRTb3VyY2VEYXRhKCk7Ci0KLSAgICAgICAgLy8gVGhlIGRhdGFTb3VyY2Ugd2FzIGVpdGhlciBub3QgY29udmVydGFibGUsIG9yIHdhcyBlbXB0eS4KLQotICAgICAgICBpZiAoZGF0YVNvdXJjZSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotCi0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIF9yZW5kZXJpbmcgPSB0cnVlOwotICAgICAgICAgICAgX3ZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIF9pbmRleCA9IDA7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIElCaW5kaW5nIGluZGV4QmluZGluZyA9IGdldEluZGV4QmluZGluZygpOwotICAgICAgICAgICAgSUJpbmRpbmcgdmFsdWVCaW5kaW5nID0gZ2V0VmFsdWVCaW5kaW5nKCk7Ci0gICAgICAgICAgICBTdHJpbmcgZWxlbWVudCA9IGdldEVsZW1lbnQoKTsKLQotICAgICAgICAgICAgYm9vbGVhbiBoYXNOZXh0ID0gZGF0YVNvdXJjZS5oYXNOZXh0KCk7Ci0KLSAgICAgICAgICAgIHdoaWxlIChoYXNOZXh0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF92YWx1ZSA9IGRhdGFTb3VyY2UubmV4dCgpOwotICAgICAgICAgICAgICAgIGhhc05leHQgPSBkYXRhU291cmNlLmhhc05leHQoKTsKLQotICAgICAgICAgICAgICAgIGlmIChpbmRleEJpbmRpbmcgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgaW5kZXhCaW5kaW5nLnNldEludChfaW5kZXgpOwotCi0gICAgICAgICAgICAgICAgaWYgKHZhbHVlQmluZGluZyAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICB2YWx1ZUJpbmRpbmcuc2V0T2JqZWN0KF92YWx1ZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZWxlbWVudCAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVyLmJlZ2luKGVsZW1lbnQpOwotICAgICAgICAgICAgICAgICAgICByZW5kZXJJbmZvcm1hbFBhcmFtZXRlcnMod3JpdGVyLCBjeWNsZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmVuZGVyQm9keSh3cml0ZXIsIGN5Y2xlKTsKLQotICAgICAgICAgICAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHdyaXRlci5lbmQoKTsKLQotICAgICAgICAgICAgICAgIF9pbmRleCsrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgX3ZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIF9yZW5kZXJpbmcgPSBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIHRoZSBtb3N0IHJlY2VudCB2YWx1ZSBleHRyYWN0ZWQgZnJvbSB0aGUgc291cmNlIHBhcmFtZXRlci4KLSAgICAgKgotICAgICAqICBAdGhyb3dzIG9yZy5hcGFjaGUudGFwZXN0cnkuQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uIGlmIHRoZSBGb3JlYWNoIGlzIG5vdCBjdXJyZW50bHkgcmVuZGVyaW5nLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpCi0gICAgewotICAgICAgICBpZiAoIV9yZW5kZXJpbmcpCi0gICAgICAgICAgICB0aHJvdyBUYXBlc3RyeS5jcmVhdGVSZW5kZXJPbmx5UHJvcGVydHlFeGNlcHRpb24odGhpcywgInZhbHVlIik7Ci0gIAotICAgICAgICByZXR1cm4gX3ZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0RWxlbWVudCgpOwotCi0gICAgcHVibGljIGFic3RyYWN0IE9iamVjdCBnZXRTb3VyY2UoKTsKLQotICAgIC8qKgotICAgICAqICBUaGUgaW5kZXggbnVtYmVyLCB3aXRoaW4gdGhlIHtAbGluayAjZ2V0U291cmNlKCkgc291cmNlfSwgb2YgdGhlCi0gICAgICogIHRoZSBjdXJyZW50IHZhbHVlLgotICAgICAqIAotICAgICAqICBAdGhyb3dzIG9yZy5hcGFjaGUudGFwZXN0cnkuQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uIGlmIHRoZSBGb3JlYWNoIGlzIG5vdCBjdXJyZW50bHkgcmVuZGVyaW5nLgotICAgICAqCi0gICAgICogIEBzaW5jZSAyLjIKLSAgICAgKiAKLSAgICAgKiovCi0gICAgCi0gICAgcHVibGljIGludCBnZXRJbmRleCgpCi0gICAgewotICAgICAgICBpZiAoIV9yZW5kZXJpbmcpCi0gICAgICAgICAgICB0aHJvdyBUYXBlc3RyeS5jcmVhdGVSZW5kZXJPbmx5UHJvcGVydHlFeGNlcHRpb24odGhpcywgImluZGV4Iik7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gX2luZGV4OwotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb21wb25lbnRzL0ZvcmVhY2guandjIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbXBvbmVudHMvRm9yZWFjaC5qd2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlNWNhOTAuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbXBvbmVudHMvRm9yZWFjaC5qd2MKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gIAotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTwhLS0gJElkJCAtLT4KLTwhRE9DVFlQRSBjb21wb25lbnQtc3BlY2lmaWNhdGlvbiBQVUJMSUMKLSAgIi0vL0FwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLy9UYXBlc3RyeSBTcGVjaWZpY2F0aW9uIDMuMC8vRU4iIAotICAiaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy90YXBlc3RyeS9kdGQvVGFwZXN0cnlfM18wLmR0ZCI+Ci0JCi08Y29tcG9uZW50LXNwZWNpZmljYXRpb24gCi0JY2xhc3M9Im9yZy5hcGFjaGUudGFwZXN0cnkuY29tcG9uZW50cy5Gb3JlYWNoIiAKLQlhbGxvdy1pbmZvcm1hbC1wYXJhbWV0ZXJzPSJ5ZXMiPgotCQotICA8ZGVzY3JpcHRpb24+Ci0gIExvb3BzIG92ZXIgYSBjb2xsZWN0aW9uIG9mIHNvdXJjZSB2YWx1ZXMuICBNYXkgYWxzbyBlbXVsYXRlIGFuIGVsZW1lbnQgKGxpa2UgYW4gQW55Ci0gIGNvbXBvbmVudCkuCi0gIDwvZGVzY3JpcHRpb24+Ci0JCi0gIDxwYXJhbWV0ZXIgbmFtZT0ic291cmNlIiB0eXBlPSJqYXZhLmxhbmcuT2JqZWN0IiBkaXJlY3Rpb249ImluIiByZXF1aXJlZD0ieWVzIj4KLSAgICA8ZGVzY3JpcHRpb24+Ci0gICAgVGhlIHNvdXJjZSBvZiB2YWx1ZXMsIGEgSmF2YSBjb2xsZWN0aW9uIG9yIGFycmF5LgotICAgIDwvZGVzY3JpcHRpb24+Ci0gIDwvcGFyYW1ldGVyPgotICAKLSAgPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgZGlyZWN0aW9uPSJjdXN0b20iPgotICAgIDxkZXNjcmlwdGlvbj4KLSAgICBJZiBwcm92aWRlZCwgdGhlbiBvbiBlYWNoIGl0ZXJhdGlvbiwgdGhlIHZhbHVlIHByb3BlcnR5IGlzIHVwZGF0ZWQuCi0gICAgPC9kZXNjcmlwdGlvbj4KLSAgPC9wYXJhbWV0ZXI+Ci0gIAotICA8cGFyYW1ldGVyIG5hbWU9ImluZGV4IiB0eXBlPSJpbnQiIGRpcmVjdGlvbj0iY3VzdG9tIj4KLSAgICA8ZGVzY3JpcHRpb24+Ci0gICAgSWYgcHJvdmlkZWQsIHRoZW4gdGhlIGluZGV4IG9mIHRoZSBsb29wIGlzIHNldCBvbiBlYWNoIGl0ZXJhdGlvbi4KLSAgICA8L2Rlc2NyaXB0aW9uPgotICA8L3BhcmFtZXRlcj4KLSAgCi0gIDxwYXJhbWV0ZXIgbmFtZT0iZWxlbWVudCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgZGlyZWN0aW9uPSJpbiI+Ci0gICAgPGRlc2NyaXB0aW9uPgotICAgIElmIHByb3ZpZGVkLCB0aGVuIHRoZSBGb3JlYWNoIGNyZWF0ZXMgYW4gZWxlbWVudCB3cmFwcGluZyBpdHMgY29udGVudC4KLSAgICBJbmZvcm1hbCBwYXJhbWV0ZXJzIGJlY29tZSBhdHRyaWJ1dGVzIG9mIHRoZSBlbGVtZW50LgotICAgIDwvZGVzY3JpcHRpb24+Ci0gIDwvcGFyYW1ldGVyPgotICAKLTwvY29tcG9uZW50LXNwZWNpZmljYXRpb24+CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29tcG9uZW50cy9JTGlua0NvbXBvbmVudC5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbXBvbmVudHMvSUxpbmtDb21wb25lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFlMjUzNy4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29tcG9uZW50cy9JTGlua0NvbXBvbmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuY29tcG9uZW50czsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUNvbXBvbmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklNYXJrdXBXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVxdWVzdEN5Y2xlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuZW5naW5lLklMaW5rOwotCi0vKioKLSAqICBBIGNvbXBvbmVudCB0aGF0IHJlbmRlcnMgYW4gSFRNTCAmbHQ7YSZndDsgZWxlbWVudC4gIEl0IGV4cG9zZXMgc29tZQotICogIHByb3BlcnRpZXMgdG8gdGhlIGNvbXBvbmVudHMgaXQgd3JhcHMuICBUaGlzIGlzIGJhc2ljYWxseSB0byBmYWNpbGl0YXRlCi0gKiAgdGhlIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5Lmh0bWwuUm9sbG92ZXJ9IGNvbXBvbmVudC4KLSAqCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogIEB2ZXJzaW9uICRJZCQKLSAqIAotICoqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElMaW5rQ29tcG9uZW50IGV4dGVuZHMgSUNvbXBvbmVudAotewotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgd2hldGhlciB0aGlzIHNlcnZpY2UgbGluayBjb21wb25lbnQgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KLSAgICAgKgotICAgICAqICBAc2luY2UgMC4yLjkKLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRGlzYWJsZWQoKTsKLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIHRoZSBhbmNob3IgZGVmaW5lZCBmb3IgdGhpcyBsaW5rLCBvciBudWxsIGZvciBubyBhbmNob3IuCi0gICAgICogCi0gICAgICogIEBzaW5jZSAzLjAKLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEFuY2hvcigpOwotCi0gICAgLyoqCi0gICAgICogIEFkZHMgYSBuZXcgZXZlbnQgaGFuZGxlci4gIFdoZW4gdGhlIGV2ZW50IG9jY3VycywgdGhlIEphdmFTY3JpcHQgZnVuY3Rpb24KLSAgICAgKiAgc3BlY2lmaWVkIGlzIGV4ZWN1dGVkLiAgTXVsdGlwbGUgZnVuY3Rpb25zIGNhbiBiZSBzcGVjaWZpZWQsIGluIHdoaWNoIGNhc2UKLSAgICAgKiAgYWxsIG9mIHRoZW0gYXJlIGV4ZWN1dGVkLgotICAgICAqCi0gICAgICogIDxwPlRoaXMgd2FzIGNyZWF0ZWQgZm9yIHVzZSBieQotICAgICAqICB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5odG1sLlJvbGxvdmVyfSB0byBzZXQgbW91c2Ugb3ZlciBhbmQgbW91c2Ugb3V0IGhhbmRsZXJzIG9uCi0gICAgICogIHRoZSB7QGxpbmsgSUxpbmtDb21wb25lbnR9IHRoYXQgd3JhcHMgaXQsIGJ1dCBjYW4gYmUgdXNlZCBmb3IKLSAgICAgKiAgbWFueSBvdGhlciB0aGluZ3MgYXMgd2VsbC4KLSAgICAgKgotICAgICAqICBAc2luY2UgMC4yLjkKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCBhZGRFdmVudEhhbmRsZXIoTGlua0V2ZW50VHlwZSB0eXBlLCBTdHJpbmcgZnVuY3Rpb25OYW1lKTsKLQotICAgIC8qKgotICAgICAqICBJbnZva2VkIGJ5IHRoZSB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5saW5rLklMaW5rUmVuZGVyZXJ9IChpZgotICAgICAqICB0aGUgbGluayBpcyBub3QgZGlzYWJsZWQpIHRvIHByb3ZpZGUgYQotICAgICAqICB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5lbmdpbmUuRW5naW5lU2VydmljZUxpbmt9IHRoYXQgdGhlIHJlbmRlcmVyIGNhbiBjb252ZXJ0Ci0gICAgICogIGludG8gYSBVUkwuCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIElMaW5rIGdldExpbmsoSVJlcXVlc3RDeWNsZSBjeWNsZSk7Ci0KLSAgICAvKioKLSAgICAgKiAgSW52b2tlZCAoYnkgdGhlIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LmxpbmsuSUxpbmtSZW5kZXJlcn0pCi0gICAgICogIHRvIG1ha2UgdGhlIGxpbmsgcmVuZGVyIGFueSBhZGRpdGlvbmFsIGF0dHJpYnV0ZXMuICBUaGVzZQotICAgICAqICBhcmUgaW5mb3JtYWwgcGFyYW1ldGVycywgcGx1cyBhbnkgYXR0cmlidXRlcyByZWxhdGVkIHRvIGV2ZW50cy4KLSAgICAgKiAgVGhpcyBpcyBvbmx5IGludm9rZWQgZm9yIG5vbi1kaXNhYmxlZCBsaW5rcy4KLSAgICAgKiAKLSAgICAgKiAgQHNpbmNlIDMuMAotICAgICAqIAotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIHJlbmRlckFkZGl0aW9uYWxBdHRyaWJ1dGVzKElNYXJrdXBXcml0ZXIgd3JpdGVyLCBJUmVxdWVzdEN5Y2xlIGN5Y2xlKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29tcG9uZW50cy9JbnNlcnQuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb21wb25lbnRzL0luc2VydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODIwODE5Li4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb21wb25lbnRzL0luc2VydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbXBvbmVudHM7Ci0KLWltcG9ydCBqYXZhLnRleHQuRm9ybWF0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5BYnN0cmFjdENvbXBvbmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LkFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklCaW5kaW5nOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSU1hcmt1cFdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZXF1ZXN0Q3ljbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5UYXBlc3RyeTsKLQotLyoqCi0gKiAgVXNlZCB0byBpbnNlcnQgc29tZSB0ZXh0IChmcm9tIGEgcGFyYW1ldGVyKSBpbnRvIHRoZSBIVE1MLgotICoKLSAqICBbPGEgaHJlZj0iLi4vLi4vLi4vLi4vLi4vQ29tcG9uZW50UmVmZXJlbmNlL0luc2VydC5odG1sIj5Db21wb25lbnQgUmVmZXJlbmNlPC9hPl0KLSAqCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogIEB2ZXJzaW9uICRJZCQKLSAqIAotICoqLwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSW5zZXJ0IGV4dGVuZHMgQWJzdHJhY3RDb21wb25lbnQKLXsKLSAgICBwdWJsaWMgYWJzdHJhY3QgSUJpbmRpbmcgZ2V0Rm9ybWF0QmluZGluZygpOwotCi0gICAgLyoqCi0gICAgICogIFByaW50cyBpdHMgdmFsdWUgcGFyYW1ldGVyLCBwb3NzaWJseSBmb3JtYXR0ZWQgYnkgaXRzIGZvcm1hdCBwYXJhbWV0ZXIuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwcm90ZWN0ZWQgdm9pZCByZW5kZXJDb21wb25lbnQoSU1hcmt1cFdyaXRlciB3cml0ZXIsIElSZXF1ZXN0Q3ljbGUgY3ljbGUpCi0gICAgewotICAgICAgICBpZiAoY3ljbGUuaXNSZXdpbmRpbmcoKSkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBPYmplY3QgdmFsdWUgPSBnZXRWYWx1ZSgpOwotCi0gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIFN0cmluZyBpbnNlcnQgPSBudWxsOwotCi0gICAgICAgIEZvcm1hdCBmb3JtYXQgPSBnZXRGb3JtYXQoKTsKLQotICAgICAgICBpZiAoZm9ybWF0ID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGluc2VydCA9IHZhbHVlLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnNlcnQgPSBmb3JtYXQuZm9ybWF0KHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgVGFwZXN0cnkuZm9ybWF0KCJJbnNlcnQudW5hYmxlLXRvLWZvcm1hdCIsIHZhbHVlKSwKLSAgICAgICAgICAgICAgICAgICAgdGhpcywKLSAgICAgICAgICAgICAgICAgICAgZ2V0Rm9ybWF0QmluZGluZygpLmdldExvY2F0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgIGV4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBzdHlsZUNsYXNzID0gZ2V0U3R5bGVDbGFzcygpOwotCi0gICAgICAgIGlmIChzdHlsZUNsYXNzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdyaXRlci5iZWdpbigic3BhbiIpOwotICAgICAgICAgICAgd3JpdGVyLmF0dHJpYnV0ZSgiY2xhc3MiLCBzdHlsZUNsYXNzKTsKLQotICAgICAgICAgICAgcmVuZGVySW5mb3JtYWxQYXJhbWV0ZXJzKHdyaXRlciwgY3ljbGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGdldFJhdygpKQotICAgICAgICAgICAgd3JpdGVyLnByaW50UmF3KGluc2VydCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHdyaXRlci5wcmludChpbnNlcnQpOwotCi0gICAgICAgIGlmIChzdHlsZUNsYXNzICE9IG51bGwpCi0gICAgICAgICAgICB3cml0ZXIuZW5kKCk7IC8vIDxzcGFuPgotICAgIH0KLQotICAgIHB1YmxpYyBhYnN0cmFjdCBPYmplY3QgZ2V0VmFsdWUoKTsKLQotICAgIHB1YmxpYyBhYnN0cmFjdCBGb3JtYXQgZ2V0Rm9ybWF0KCk7Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFN0eWxlQ2xhc3MoKTsKLQotICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGdldFJhdygpOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbXBvbmVudHMvSW5zZXJ0Lmp3YyBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb21wb25lbnRzL0luc2VydC5qd2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjYjU0MDkuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbXBvbmVudHMvSW5zZXJ0Lmp3YworKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAgCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPCEtLSAkSWQkIC0tPgotPCFET0NUWVBFIGNvbXBvbmVudC1zcGVjaWZpY2F0aW9uIFBVQkxJQwotICAiLS8vQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24vL1RhcGVzdHJ5IFNwZWNpZmljYXRpb24gMy4wLy9FTiIgCi0gICJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL3RhcGVzdHJ5L2R0ZC9UYXBlc3RyeV8zXzAuZHRkIj4KLQkKLTxjb21wb25lbnQtc3BlY2lmaWNhdGlvbiBjbGFzcz0ib3JnLmFwYWNoZS50YXBlc3RyeS5jb21wb25lbnRzLkluc2VydCIgCi0JYWxsb3ctYm9keT0ibm8iPgotICAKLSAgPGRlc2NyaXB0aW9uPgotICBFbWl0cyBhIHZhbHVlIGludG8gdGhlIHJlc3BvbnNlIHBhZ2UuCi0gIDwvZGVzY3JpcHRpb24+Ci0gIAotICAKLSAgPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iamF2YS5sYW5nLk9iamVjdCIgZGlyZWN0aW9uPSJpbiI+Ci0gIAk8ZGVzY3JpcHRpb24+Ci0gIAlUaGUgdmFsdWUgdG8gYmUgZW1pdHRlZC4gIE5vbi1zdHJpbmdzIGFyZSBjb252ZXJ0ZWQgdG8gc3RyaW5ncy4KLSAgCTwvZGVzY3JpcHRpb24+Ci0gIDwvcGFyYW1ldGVyPgotICAKLSAgPHBhcmFtZXRlciBuYW1lPSJmb3JtYXQiIHR5cGU9ImphdmEudGV4dC5Gb3JtYXQiIGRpcmVjdGlvbj0iaW4iPgotICAJPGRlc2NyaXB0aW9uPgotICAJQSBGb3JtYXQgb2JqZWN0IHVzZWQgdG8gY29udmVydCB0aGUgdmFsdWUgdG8gYSBzdHJpbmcuCi0gIAk8L2Rlc2NyaXB0aW9uPgotICA8L3BhcmFtZXRlcj4KLSAgCi0gIDxwYXJhbWV0ZXIgbmFtZT0icmF3IiB0eXBlPSJib29sZWFuIiBkaXJlY3Rpb249ImluIj4KLSAgCTxkZXNjcmlwdGlvbj4KLSAgCUlmIGZhbHNlICh0aGUgZGVmYXVsdCksIHRoZW4gSFRNTCBjaGFyYWN0ZXJzIGluIHRoZSB2YWx1ZSBhcmUgZXNjYXBlZC4gIElmCi0gIAl0cnVlLCB0aGVuIHZhbHVlIGlzIGVtaXR0ZWQgZXhhY3RseSBhcyBpcy4KLSAgCTwvZGVzY3JpcHRpb24+Ci0gIDwvcGFyYW1ldGVyPgotICAKLSAgPHBhcmFtZXRlciBuYW1lPSJjbGFzcyIgCi0gIAl0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAJcHJvcGVydHktbmFtZT0ic3R5bGVDbGFzcyIKLSAgCWRpcmVjdGlvbj0iaW4iPgotICAJPGRlc2NyaXB0aW9uPgotICAJSWYgc3BlY2lmaWVkLCB0aGVuIGFueSBvdXRwdXQgaXMgd3JhcHBlZCBpbiBhbiBIVE1MIHNwYW4gdGFnIHdpdGggdGhlIGdpdmVuIENTUyBjbGFzcy4KLSAgCTwvZGVzY3JpcHRpb24+Ci0gIDwvcGFyYW1ldGVyPgotPC9jb21wb25lbnQtc3BlY2lmaWNhdGlvbj4KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb21wb25lbnRzL0xpbmtFdmVudFR5cGUuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb21wb25lbnRzL0xpbmtFdmVudFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY4MmRkNi4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29tcG9uZW50cy9MaW5rRXZlbnRUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuY29tcG9uZW50czsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLmVudW0uRW51bTsKLQotLyoqCi0gKiAgRGlmZmVyZW50IHR5cGVzIG9mIEphdmFTY3JpcHQgZXZlbnRzIHRoYXQgYW4ge0BsaW5rIElMaW5rQ29tcG9uZW50fQotICogIGNhbiBwcm92aWRlIGhhbmRsZXJzIGZvci4KLSAqCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogIEB2ZXJzaW9uICRJZCQKLSAqICBAc2luY2UgMC4yLjkKLSAqCi0gKiovCi0KLXB1YmxpYyBjbGFzcyBMaW5rRXZlbnRUeXBlIGV4dGVuZHMgRW51bQotewotICAgIHByaXZhdGUgU3RyaW5nIF9hdHRyaWJ1dGVOYW1lOwotCi0gICAgLyoqCi0gICAgICogIFR5cGUgZm9yIDxjb2RlPm9uTW91c2VPdmVyPC9jb2RlPi4gIFRoaXMgbWF5IGFsc28gYmUgY2FsbGVkICJmb2N1cyIuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIExpbmtFdmVudFR5cGUgTU9VU0VfT1ZFUiA9IG5ldyBMaW5rRXZlbnRUeXBlKCJNT1VTRV9PVkVSIiwgIm9uTW91c2VPdmVyIik7Ci0KLSAgICAvKioKLSAgICAgKiBUeXBlIGZvciA8Y29kZT5vbk1vdXNlT3V0PC9jb2RlPi4gIFRoaXMgbWF5IGFsc28gYmUgY2FsbGVkICJibHVyIi4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTGlua0V2ZW50VHlwZSBNT1VTRV9PVVQgPSBuZXcgTGlua0V2ZW50VHlwZSgiTU9VU0VfT1VUIiwgIm9uTW91c2VPdXQiKTsKLQotICAgIC8qKgotICAgICAqIFR5cGUgZm9yIDxjb2RlPm9uQ2xpY2s8L2NvZGU+LgotICAgICAqCi0gICAgICogQHNpbmNlIDEuMC4xCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIExpbmtFdmVudFR5cGUgQ0xJQ0sgPSBuZXcgTGlua0V2ZW50VHlwZSgiQ0xJQ0siLCAib25DbGljayIpOwotCi0gICAgLyoqCi0gICAgICogVHlwZSBmb3IgPGNvZGU+b25EYmxDbGljazwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAc2luY2UgMS4wLjEKLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTGlua0V2ZW50VHlwZSBET1VCTEVfQ0xJQ0sgPQotICAgICAgICBuZXcgTGlua0V2ZW50VHlwZSgiRE9VQkxFX0NMSUNLIiwgIm9uRGJsQ2xpY2siKTsKLQotICAgIC8qKgotICAgICAqIFR5cGUgZm9yIDxjb2RlPm9uTW91c2VEb3duPC9jb2RlPi4KLSAgICAgKgotICAgICAqIEBzaW5jZSAxLjAuMS4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTGlua0V2ZW50VHlwZSBNT1VTRV9ET1dOID0gbmV3IExpbmtFdmVudFR5cGUoIk1PVVNFX0RPV04iLCAib25Nb3VzZURvd24iKTsKLQotICAgIC8qKgotICAgICAqIFR5cGUgZm9yIDxjb2RlPm9uTW91c2VVcDwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAc2luY2UgMS4wLjEKLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTGlua0V2ZW50VHlwZSBNT1VTRV9VUCA9IG5ldyBMaW5rRXZlbnRUeXBlKCJNT1VTRV9VUCIsICJvbk1vdXNlVXAiKTsKLQotICAgIC8qKgotICAgICAqICBDb25zdHJ1Y3RzIGEgbmV3IHR5cGUgb2YgZXZlbnQuICBUaGUgbmFtZSBzaG91bGQgbWF0Y2ggdGhlCi0gICAgICogIHN0YXRpYyBmaW5hbCB2YXJpYWJsZSAoaS5lLiwgTU9VU0VfT1ZFUikgYW5kIHRoZSBhdHRyaWJ1dGVOYW1lCi0gICAgICogIGlzIHRoZSBuYW1lIG9mIHRoZSBIVE1MIGF0dHJpYnV0ZSB0byBiZSBtYW5hZ2VkIChpLmUuLCAib25Nb3VzZU92ZXIiKS4KLSAgICAgKgotICAgICAqICA8cD5UaGlzIG1ldGhvZCBpcyBwcm90ZWN0ZWQgc28gdGhhdCBzdWJjbGFzc2VzIGNhbiBiZSBjcmVhdGVkCi0gICAgICogIHRvIHByb3ZpZGUgYWRkaXRpb25hbCBtYW5hZ2VkIGV2ZW50IHR5cGVzLgotICAgICAqKi8KLQotICAgIHByb3RlY3RlZCBMaW5rRXZlbnRUeXBlKFN0cmluZyBuYW1lLCBTdHJpbmcgYXR0cmlidXRlTmFtZSkKLSAgICB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotCi0gICAgICAgIF9hdHRyaWJ1dGVOYW1lID0gYXR0cmlidXRlTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgSFRNTCBhdHRyaWJ1dGUgY29ycmVzcG9uZGluZyB0byB0aGlzCi0gICAgICogIHR5cGUuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZU5hbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9hdHRyaWJ1dGVOYW1lOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29tcG9uZW50cy9SZW5kZXJCbG9jay5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbXBvbmVudHMvUmVuZGVyQmxvY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQwOGVhYy4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29tcG9uZW50cy9SZW5kZXJCbG9jay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuY29tcG9uZW50czsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuQWJzdHJhY3RDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JQ29tcG9uZW50OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSU1hcmt1cFdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZXF1ZXN0Q3ljbGU7Ci0KLS8qKgotICogIFJlbmRlcnMgdGhlIHRleHQgYW5kIGNvbXBvbmVudHMgd3JhcHBlZCBieSBhIHtAbGluayBCbG9ja30gY29tcG9uZW50LgotICoKLSAqICBbPGEgaHJlZj0iLi4vLi4vLi4vLi4vLi4vQ29tcG9uZW50UmVmZXJlbmNlL1JlbmRlckJsb2NrLmh0bWwiPkNvbXBvbmVudCBSZWZlcmVuY2U8L2E+XQotICoKLSAqICA8cD5JdCBpcyBwb3NzaWJsZSBmb3IgYW4gUmVuZGVyQmxvY2sgdG8gb2J0YWluIGEgQmxvY2sKLSAqICBmcm9tIGEgcGFnZSA8ZW0+b3RoZXIgdGhhbjwvZW0+IHRoZSByZW5kZXIgcGFnZS4gIFRoaXMgd29ya3MsIGV2ZW4gd2hlbgotICogIHRoZSBCbG9jayBjb250YWlucyBsaW5rcywgZm9ybXMgYW5kIGZvcm0gY29tcG9uZW50cy4gIFRoZSBhY3Rpb24gYW5kCi0gKiAgZGlyZWN0IHNlcnZpY2VzIHdpbGwgY3JlYXRlIFVSTHMgdGhhdCBwcm9wZXJseSBhZGRyZXNzIHRoaXMgc2l0dWF0aW9uLgotICoKLSAqICA8cD5Ib3dldmVyLCBiZWNhdXNlIHRoZSByZW5kZXJpbmcgcGFnZSBjYW4ndCBrbm93Ci0gKiAgYWhlYWQgb2YgdGltZSBhYm91dCB0aGVzZSBmb3JpZWduIEJsb2NrcywKLSAqICB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5ldmVudC5QYWdlUmVuZGVyTGlzdGVuZXJ9IG1ldGhvZHMKLSAqICAoZm9yIGNvbXBvbmVudHMgYW5kIG9iamVjdHMgb2YgdGhlIGZvcmllZ24gcGFnZSkKLSAqICB2aWEgUmVuZGVyQmxvY2sgd2lsbCA8ZW0+bm90PC9lbT4gYmUgZXhlY3V0ZWQuICBUaGlzIHNwZWNpZmljYWxseQotICogIGFmZmVjdHMgdGhlIG1ldGhvZHMgb2YgdGhlIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LmV2ZW50LlBhZ2VSZW5kZXJMaXN0ZW5lcn0gCi0gKiAgaW50ZXJmYWNlLgotICogCi0gKiAgPHA+QmVmb3JlIHJlbmRlcmluZyBpdHMge0BsaW5rIEJsb2NrfSwgUmVuZGVyQmxvY2sgd2lsbCBzZXQgaXRzZWxmIGFzIHRoZSAKLSAqICBCbG9jaydzIGluc2VydGVyLCBhbmQgd2lsbCByZXNldCB0aGUgaW5zZXJ0ZXIgYWZ0ZXIgdGhlIHtAbGluayBCbG9ja30gaXMgCi0gKiAgcmVuZGVyZWQuICBUaGlzIGdpdmVzIHRoZSBjb21wb25lbnRzIGNvbnRhaW5lZCBpbiB0aGUge0BsaW5rIEJsb2NrfSBhY2Nlc3MKLSAqICB0byBpdHMgaW5zZXJ0ZWQgZW52aXJvbm1lbnQgdmlhIHRoZSBSZW5kZXJCbG9jay4gIEluIHBhcnRpY3VsYXIgdGhpcyBhbGxvd3MKLSAqICB0aGUgY29udGFpbmVkIGNvbXBvbmVudHMgdG8gYWNjZXNzIHRoZSBpbmZvcm1hbCBwYXJhbWV0ZXJzIG9mIHRoZSBSZW5kZXJCbG9jawotICogIHdoaWNoIGVmZmVjdGl2ZWx5IGFsbG93cyBwYXJhbWV0ZXJzIHRvIGJlIHBhc3NlZCB0byB0aGUgY29tcG9uZW50cyBjb250YWluZWQKLSAqICBpbiBhIEJsb2NrLgotICoKLSAqIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqIEB2ZXJzaW9uICRJZCQKLSAqIAotICoqLwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUmVuZGVyQmxvY2sgZXh0ZW5kcyBBYnN0cmFjdENvbXBvbmVudAotewotICAgIC8qKgotICAgICAqICBJZiBibG9jayBpcyBub3QgbnVsbCwKLSAgICAgKiAgdGhlbiB0aGUgYmxvY2sncyBpbnNlcnRlciBpcyBzZXQgKHRvIHRoaXMpLAotICAgICAqIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LklDb21wb25lbnQjcmVuZGVyQm9keShJTWFya3VwV3JpdGVyLCBJUmVxdWVzdEN5Y2xlKX0KLSAgICAgKiAgaXMgaW52b2tlZCBvbiBpdCwgYW5kIHRoZSBCbG9jaydzIGluc2VydGVyIGlzIHNldCBiYWNrIHRvIGl0cyBwcmV2aW91cyBzdGF0ZS4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHByb3RlY3RlZCB2b2lkIHJlbmRlckNvbXBvbmVudChJTWFya3VwV3JpdGVyIHdyaXRlciwgSVJlcXVlc3RDeWNsZSBjeWNsZSkKLSAgICB7Ci0gICAgCUJsb2NrIGJsb2NrID0gZ2V0QmxvY2soKTsKLSAgICAJCi0gICAgICAgIGlmIChibG9jayAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBtYWtlIGEgY29weSBvZiB0aGUgaW5zZXJ0ZXIgc28gd2UgZG9uJ3Qgb3ZlcndyaXRlIGNvbXBsZXRlbHkKLSAgICAgICAgICAgIElDb21wb25lbnQgcHJldmlvdXNJbnNlcnRlciA9IGJsb2NrLmdldEluc2VydGVyKCk7Ci0gICAgICAgICAgICBibG9jay5zZXRJbnNlcnRlcih0aGlzKTsKLSAgICAgICAgICAgIGJsb2NrLnJlbmRlckJvZHkod3JpdGVyLCBjeWNsZSk7Ci0gICAgICAgICAgICAvLyByZXNldCB0aGUgaW5zZXJ0ZXIgYXMgaXQgd2FzIGJlZm9yZSB3ZSBjaGFuZ2VkIGl0Ci0gICAgICAgICAgICBibG9jay5zZXRJbnNlcnRlcihwcmV2aW91c0luc2VydGVyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBhYnN0cmFjdCBCbG9jayBnZXRCbG9jaygpOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbXBvbmVudHMvUmVuZGVyQmxvY2suandjIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbXBvbmVudHMvUmVuZGVyQmxvY2suandjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzM4NGQ3Li4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb21wb25lbnRzL1JlbmRlckJsb2NrLmp3YworKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAgCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPCEtLSAkSWQkIC0tPgotPCFET0NUWVBFIGNvbXBvbmVudC1zcGVjaWZpY2F0aW9uIFBVQkxJQyAKLSAgIi0vL0FwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLy9UYXBlc3RyeSBTcGVjaWZpY2F0aW9uIDMuMC8vRU4iIAotICAiaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy90YXBlc3RyeS9kdGQvVGFwZXN0cnlfM18wLmR0ZCI+Ci0JCi08Y29tcG9uZW50LXNwZWNpZmljYXRpb24gY2xhc3M9Im9yZy5hcGFjaGUudGFwZXN0cnkuY29tcG9uZW50cy5SZW5kZXJCbG9jayIgCi0JYWxsb3ctYm9keT0ibm8iIAotCWFsbG93LWluZm9ybWFsLXBhcmFtZXRlcnM9InllcyI+Ci0JCi0gIDxwYXJhbWV0ZXIgbmFtZT0iYmxvY2siIAotICAJdHlwZT0ib3JnLmFwYWNoZS50YXBlc3RyeS5jb21wb25lbnRzLkJsb2NrIgotICAJZGlyZWN0aW9uPSJpbiIvPgotICAJCi08L2NvbXBvbmVudC1zcGVjaWZpY2F0aW9uPgpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbXBvbmVudHMvUmVuZGVyQm9keS5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbXBvbmVudHMvUmVuZGVyQm9keS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGFmNTgxLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb21wb25lbnRzL1JlbmRlckJvZHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbXBvbmVudHM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LkFic3RyYWN0Q29tcG9uZW50OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUNvbXBvbmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklNYXJrdXBXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVxdWVzdEN5Y2xlOwotCi0vKioKLSAqICBSZW5kZXJzIHRoZSB0ZXh0IGFuZCBjb21wb25lbnRzIHdyYXBwZWQgYnkgYSBjb21wb25lbnQuCi0gKgotICogIFs8YSBocmVmPSIuLi8uLi8uLi8uLi8uLi9Db21wb25lbnRSZWZlcmVuY2UvUmVuZGVyQm9keS5odG1sIj5Db21wb25lbnQgUmVmZXJlbmNlPC9hPl0KLSAqIAotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAKLSAqKi8KLQotcHVibGljIGNsYXNzIFJlbmRlckJvZHkgZXh0ZW5kcyBBYnN0cmFjdENvbXBvbmVudAotewotICAgIC8qKgotICAgICAqICBGaW5kcyB0aGlzIDxjb2RlPlJlbmRlckJvZHk8L2NvZGU+J3MgY29udGFpbmVyLCBhbmQgaW52b2tlcwotICAgICAqICB7QGxpbmsgSUNvbXBvbmVudCNyZW5kZXJCb2R5KElNYXJrdXBXcml0ZXIsIElSZXF1ZXN0Q3ljbGUpfQotICAgICAqICBvbiBpdC4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHByb3RlY3RlZCB2b2lkIHJlbmRlckNvbXBvbmVudChJTWFya3VwV3JpdGVyIHdyaXRlciwgSVJlcXVlc3RDeWNsZSBjeWNsZSkKLSAgICB7Ci0gICAgICAgIElDb21wb25lbnQgY29udGFpbmVyID0gZ2V0Q29udGFpbmVyKCk7Ci0KLSAgICAgICAgY29udGFpbmVyLnJlbmRlckJvZHkod3JpdGVyLCBjeWNsZSk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb21wb25lbnRzL1JlbmRlckJvZHkuandjIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbXBvbmVudHMvUmVuZGVyQm9keS5qd2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyMWZkNDguLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2NvbXBvbmVudHMvUmVuZGVyQm9keS5qd2MKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gIAotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTwhLS0gJElkJCAtLT4KLTwhRE9DVFlQRSBjb21wb25lbnQtc3BlY2lmaWNhdGlvbiBQVUJMSUMgCi0gICItLy9BcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi8vVGFwZXN0cnkgU3BlY2lmaWNhdGlvbiAzLjAvL0VOIiAKLSAgImh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvdGFwZXN0cnkvZHRkL1RhcGVzdHJ5XzNfMC5kdGQiPgotCi08Y29tcG9uZW50LXNwZWNpZmljYXRpb24gCi0JY2xhc3M9Im9yZy5hcGFjaGUudGFwZXN0cnkuY29tcG9uZW50cy5SZW5kZXJCb2R5IiAKLQlhbGxvdy1ib2R5PSJubyIgCi0JYWxsb3ctaW5mb3JtYWwtcGFyYW1ldGVycz0ibm8iLz4KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb21wb25lbnRzL3BhY2thZ2UuaHRtbCBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9jb21wb25lbnRzL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NjZDAwZS4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvY29tcG9uZW50cy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi08IWRvY3R5cGUgaHRtbCBwdWJsaWMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotPCEtLSAkSWQkIC0tPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5UYXBlc3RyeTogV2ViIEFwcGxpY2F0aW9uIEZyYW1ld29yazwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLQotPHA+QmFzaWMsIGZ1bmRhbWVudGFsIGNvbXBvbmVudHMgdXNlZCB0byBjb25zdHJ1Y3QgbW9yZSBjb21wbGV4IGNvbXBvbmVudHMsIG9yIHBhZ2VzLiAgCi1UaGVzZSBjb21wb25lbnRzIGFyZSBpbmRlcGVuZGFudCBvZiBhbnkgcGFydGljdWxhciBtYXJrdXAgbGFuZ3VhZ2UuCi0KLUBhdXRob3IgSG93YXJkIExld2lzIFNoaXAgPGEgaHJlZj0ibWFpbHRvOmhsc2hpcEBhcGFjaGUub3JnIj5obHNoaXBAYXBhY2hlLm9yZzwvYT4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2VuZ2luZS9BYnN0cmFjdEVuZ2luZS5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2VuZ2luZS9BYnN0cmFjdEVuZ2luZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzFiNjU3Li4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9lbmdpbmUvQWJzdHJhY3RFbmdpbmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNjkgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuZW5naW5lOwotCi1pbXBvcnQgamF2YS5pby5FeHRlcm5hbGl6YWJsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT2JqZWN0SW5wdXQ7Ci1pbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXQ7Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgamF2YXguc2VydmxldC5SZXF1ZXN0RGlzcGF0Y2hlcjsKLWltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OwotaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXQ7Ci1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb247Ci1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uQmluZGluZ0V2ZW50OwotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbkJpbmRpbmdMaXN0ZW5lcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYnNmLkJTRk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjLmJpbmFyeS5IZXg7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuYnVpbGRlci5Ub1N0cmluZ0J1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5BcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5BcHBsaWNhdGlvblNlcnZsZXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JRW5naW5lOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSU1hcmt1cFdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUGFnZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZXF1ZXN0Q3ljbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVzb3VyY2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LlBhZ2VSZWRpcmVjdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LlJlZGlyZWN0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuU3RhbGVMaW5rRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuU3RhbGVTZXNzaW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuVGFwZXN0cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5hc3NldC5SZXNvdXJjZUNoZWNrc3VtU291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuYXNzZXQuUmVzb3VyY2VDaGVja3N1bVNvdXJjZUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5lbmhhbmNlLkRlZmF1bHRDb21wb25lbnRDbGFzc0VuaGFuY2VyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkubGlzdGVuZXIuTGlzdGVuZXJNYXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5wYWdlbG9hZC5QYWdlU291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkucmVxdWVzdC5SZXF1ZXN0Q29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnJlcXVlc3QuUmVzcG9uc2VPdXRwdXRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5zcGVjLklBcHBsaWNhdGlvblNwZWNpZmljYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS51dGlsLkRlbGVnYXRpbmdQcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnV0aWwuUHJvcGVydHlIb2xkZXJQcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnV0aWwuUmVzb3VyY2VCdW5kbGVQcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnV0aWwuU2VydmxldENvbnRleHRQcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnV0aWwuU2VydmxldFByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkudXRpbC5TeXN0ZW1Qcm9wZXJ0aWVzUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS51dGlsLmV4Y2VwdGlvbi5FeGNlcHRpb25BbmFseXplcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnV0aWwuaW8uRGF0YVNxdWVlemVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkudXRpbC5wb29sLlBvb2w7Ci0KLS8qKgotICogIEJhc2lzIGZvciBidWlsZGluZyByZWFsIFRhcGVzdHJ5IGFwcGxpY2F0aW9ucy4gIEltbWVkaWF0ZSBzdWJjbGFzc2VzCi0gKiAgcHJvdmlkZSBkaWZmZXJlbnQgc3RyYXRlZ2llcyBmb3IgbWFuYWdpbmcgcGFnZSBzdGF0ZSBhbmQgb3RoZXIgcmVzb3VyY2VzCi0gKiAgYmV0d2VlbiByZXF1ZXN0IGN5Y2xlcy4KLSAqCi0gKiAgVXNlcyBhIHNoYXJlZCBpbnN0YW5jZSBvZgotICogIHtAbGluayBJVGVtcGxhdGVTb3VyY2V9LCB7QGxpbmsgSVNwZWNpZmljYXRpb25Tb3VyY2V9LAotICogIHtAbGluayBJU2NyaXB0U291cmNlfSBhbmQge0BsaW5rIElDb21wb25lbnRNZXNzYWdlc1NvdXJjZX0KLSAqICBzdG9yZWQgYXMgYXR0cmlidXRlcyBvZiB0aGUgIHtAbGluayBTZXJ2bGV0Q29udGV4dH0KLSAqICAodGhleSB3aWxsIGJlIHNoYXJlZCBieSBhbGwgc2Vzc2lvbnMpLgotICoKLSAqICA8cD5BbiBhcHBsaWNhdGlvbiBpcyBkZXNpZ25lZCB0byBiZSB2ZXJ5IGxpZ2h0d2VpZ2h0LgotICogIFBhcnRpY3VsYXJpbHksIGl0IHNob3VsZCA8Yj5uZXZlcjwvYj4gaG9sZCByZWZlcmVuY2VzIHRvIGFueQotICogIHtAbGluayBJUGFnZX0gb3Ige0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkuSUNvbXBvbmVudH0gb2JqZWN0cy4gIFRoZSBlbnRpcmUgc3lzdGVtIGlzCi0gKiAgYmFzZWQgdXBvbiBiZWluZyBhYmxlIHRvIHF1aWNrbHkgcmVidWlsZCB0aGUgc3RhdGUgb2YgYW55IHBhZ2UocykuCi0gKgotICogPHA+V2hlcmUgcG9zc2libGUsIGluc3RhbmNlIHZhcmlhYmxlcyBzaG91bGQgYmUgdHJhbnNpZW50LiAgVGhleQotICogY2FuIGJlIHJlc3RvcmVkIGluc2lkZSB7QGxpbmsgI3NldHVwRm9yUmVxdWVzdChSZXF1ZXN0Q29udGV4dCl9LgotICoKLSAqICA8cD5JbiBwcmFjdGljZSwgYSBzdWJjbGFzcyAodXN1YWxseSB7QGxpbmsgQmFzZUVuZ2luZX0pCi0gKiAgaXMgdXNlZCB3aXRob3V0IHN1YmNsYXNzaW5nLiAgSW5zdGVhZCwgYQotICogIHZpc2l0IG9iamVjdCBpcyBzcGVjaWZpZWQuICBUbyBmYWNpbGl0YXRlIHRoaXMsIHRoZSBhcHBsaWNhdGlvbiBzcGVjaWZpY2F0aW9uCi0gKiAgbWF5IGluY2x1ZGUgYSBwcm9wZXJ0eSwgPGNvZGU+b3JnLmFwYWNoZS50YXBlc3RyeS52aXNpdC1jbGFzczwvY29kZT4KLSAqICB3aGljaCBpcyB0aGUgY2xhc3MgbmFtZSAgdG8gaW5zdGFudGlhdGUgd2hlbiBhIHZpc2l0IG9iamVjdCBpcyBmaXJzdCBuZWVkZWQuICBTZWUKLSAqICB7QGxpbmsgI2NyZWF0ZVZpc2l0KElSZXF1ZXN0Q3ljbGUpfSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIDxwPlNvbWUgb2YgdGhlIGNsYXNzZXMnIGJlaGF2aW9yIGlzIGNvbnRyb2xsZWQgYnkgSlZNIHN5c3RlbSBwcm9wZXJ0aWVzCi0gKiAodHlwaWNhbGx5IG9ubHkgdXNlZCBkdXJpbmcgZGV2ZWxvcG1lbnQpOgotICoKLSAqIDx0YWJsZSBib3JkZXI9MT4KLSAqIAk8dHI+IDx0aD5Qcm9wZXJ0eTwvdGg+IDx0aD5EZXNjcmlwdGlvbjwvdGg+IDwvdHI+Ci0gKiAgPHRyPiA8dGQ+b3JnLmFwYWNoZS50YXBlc3RyeS5lbmFibGUtcmVzZXQtc2VydmljZTwvdGQ+Ci0gKgkJPHRkPklmIHRydWUsIGVuYWJsZWQgYW4gYWRkaXRpb25hbCBzZXJ2aWNlLCByZXNldCwgdGhhdAotICoJCWFsbG93IHBhZ2UsIHNwZWNpZmljYXRpb24gYW5kIHRlbXBsYXRlIGNhY2hlcyB0byBiZSBjbGVhcmVkIG9uIGRlbWFuZC4KLSAqICAJU2VlIHtAbGluayAjaXNSZXNldFNlcnZpY2VFbmFibGVkKCl9LiA8L3RkPgotICogPC90cj4KLSAqIDx0cj4KLSAqCQk8dGQ+b3JnLmFwYWNoZS50YXBlc3RyeS5kaXNhYmxlLWNhY2hpbmc8L3RkPgotICoJPHRkPklmIHRydWUsIHRoZW4gdGhlIHBhZ2UsIHNwZWNpZmljYXRpb24sIHRlbXBsYXRlIGFuZCBzY3JpcHQgY2FjaGVzCi0gKiAgd2lsbCBiZSBjbGVhcmVkIGFmdGVyIGVhY2ggcmVxdWVzdC4gVGhpcyBzbG93cyB0aGluZ3MgZG93biwKLSAqICBidXQgZW5zdXJlcyB0aGF0IHRoZSBsYXRlc3QgdmVyc2lvbnMgb2Ygc3VjaCBmaWxlcyBhcmUgdXNlZC4KLSAqICBDYXJlIHNob3VsZCBiZSB0YWtlbiB0aGF0IHRoZSBzb3VyY2UgZGlyZWN0b3JpZXMgZm9yIHRoZSBmaWxlcwotICogIHByZWNlZWRzIGFueSB2ZXJzaW9ucyBvZiB0aGUgZmlsZXMgYXZhaWxhYmxlIGluIEpBUnMgb3IgV0FScy4gPC90ZD4KLSAqIDwvdHI+Ci0gKiA8L3RhYmxlPgotICoKLSAqCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogIEB2ZXJzaW9uICRJZCQKLSAqCi0gKiovCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEVuZ2luZQotICAgIGltcGxlbWVudHMgSUVuZ2luZSwgSUVuZ2luZVNlcnZpY2VWaWV3LCBFeHRlcm5hbGl6YWJsZSwgSHR0cFNlc3Npb25CaW5kaW5nTGlzdGVuZXIKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgTE9HID0gTG9nRmFjdG9yeS5nZXRMb2coQWJzdHJhY3RFbmdpbmUuY2xhc3MpOwotCi0gICAgLyoqCi0gICAgICogIEBzaW5jZSAyLjAuNAotICAgICAqCi0gICAgICoqLwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNjg4NDgzNDM5NzY3MzgxNzExN0w7Ci0KLSAgICBwcml2YXRlIHRyYW5zaWVudCBTdHJpbmcgX2NvbnRleHRQYXRoOwotICAgIHByaXZhdGUgdHJhbnNpZW50IFN0cmluZyBfc2VydmxldFBhdGg7Ci0gICAgcHJpdmF0ZSB0cmFuc2llbnQgU3RyaW5nIF9jbGllbnRBZGRyZXNzOwotICAgIHByaXZhdGUgdHJhbnNpZW50IFN0cmluZyBfc2Vzc2lvbklkOwotICAgIHByaXZhdGUgdHJhbnNpZW50IGJvb2xlYW4gX3N0YXRlZnVsOwotICAgIHByaXZhdGUgdHJhbnNpZW50IExpc3RlbmVyTWFwIF9saXN0ZW5lcnM7Ci0KLSAgICAvKiogQHNpbmNlIDIuMiAqKi8KLQotICAgIHByaXZhdGUgdHJhbnNpZW50IERhdGFTcXVlZXplciBfZGF0YVNxdWVlemVyOwotCi0gICAgLyoqCi0gICAgICogIEFuIG9iamVjdCB1c2VkIHRvIGNvbnRhaW4gYXBwbGljYXRpb24tc3BlY2lmaWMgc2VydmVyIHNpZGUgc3RhdGUuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwcml2YXRlIE9iamVjdCBfdmlzaXQ7Ci0KLSAgICAvKioKLSAgICAgKiAgVGhlIGdsb2JhbGx5IHNoYXJlZCBhcHBsaWNhdGlvbiBvYmplY3QuICBUeXBpY2FsbHksIHRoaXMgaXMgY3JlYXRlZAotICAgICAqICB3aGVuIGZpcnN0IG5lZWRlZCwgc2hhcmVkIGJldHdlZW4gc2Vzc2lvbnMgYW5kIGVuZ2luZXMsIGFuZAotICAgICAqICBzdG9yZWQgaW4gdGhlIHtAbGluayBTZXJ2bGV0Q29udGV4dH0uCi0gICAgICoKLSAgICAgKiAgQHNpbmNlIDIuMwotICAgICAqCi0gICAgICoqLwotCi0gICAgcHJpdmF0ZSB0cmFuc2llbnQgT2JqZWN0IF9nbG9iYWw7Ci0KLSAgICAvKioKLSAgICAgKiAgVGhlIGJhc2UgbmFtZSBmb3IgdGhlIHNlcnZsZXQgY29udGV4dCBrZXkgdXNlZCB0byBzdG9yZQotICAgICAqICB0aGUgYXBwbGljYXRpb24tZGVmaW5lZCBHbG9iYWwgb2JqZWN0LCBpZiBhbnkuCi0gICAgICoKLSAgICAgKiAgQHNpbmNlIDIuMwotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0xPQkFMX05BTUUgPSAib3JnLmFwYWNoZS50YXBlc3RyeS5nbG9iYWwiOwotCi0gICAgLyoqCi0gICAgICogIFRoZSBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiBwcm9wZXJ0eSB0aGF0IHdpbGwgYmUgdXNlZCB0bwotICAgICAqICBkZXRlcm1pbmUgdGhlIGVuY29kaW5nIHRvIHVzZSB3aGVuIGdlbmVyYXRpbmcgdGhlIG91dHB1dAotICAgICAqCi0gICAgICogIEBzaW5jZSAzLjAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPVVRQVVRfRU5DT0RJTkdfUFJPUEVSVFlfTkFNRSA9Ci0gICAgICAgICJvcmcuYXBhY2hlLnRhcGVzdHJ5Lm91dHB1dC1lbmNvZGluZyI7Ci0KLSAgICAvKioKLSAgICAgKiAgVGhlIGRlZmF1bHQgZW5jb2RpbmcgdGhhdCB3aWxsIGJlIHVzZWQgd2hlbiBnZW5lcmF0aW5nIHRoZSBvdXRwdXQuCi0gICAgICogIEl0IGlzIHVzZWQgaWYgbm8gb3V0cHV0IGVuY29kaW5nIHByb3BlcnR5IGhhcyBiZWVuIHNwZWNpZmllZC4KLSAgICAgKgotICAgICAqICBAc2luY2UgMy4wCi0gICAgICovCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX09VVFBVVF9FTkNPRElORyA9ICJVVEYtOCI7Ci0KLSAgICAvKioKLSAgICAgKiAgVGhlIGN1cmVudCBsb2NhbGUgZm9yIHRoZSBlbmdpbmUsIHdoaWNoIG1heSBiZSBjaGFuZ2VkIGF0IGFueSB0aW1lLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHJpdmF0ZSBMb2NhbGUgX2xvY2FsZTsKLQotICAgIC8qKgotICAgICAqICBTZXQgYnkge0BsaW5rICNzZXRMb2NhbGUoTG9jYWxlKX0gd2hlbiB0aGUgbG9jYWxlIGlzIGNoYW5nZWQ7Ci0gICAgICogIHRoaXMgYWxsb3dzIHRoZSBsb2NhbGUgY29va2llIHRvIGJlIHVwZGF0ZWQuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwcml2YXRlIGJvb2xlYW4gX2xvY2FsZUNoYW5nZWQ7Ci0KLSAgICAvKioKLSAgICAgKiAgVGhlIHNwZWNpZmljYXRpb24gZm9yIHRoZSBhcHBsaWNhdGlvbiwgd2hpY2gKLSAgICAgKiAgbGl2ZXMgaW4gdGhlIHtAbGluayBTZXJ2bGV0Q29udGV4dH0uICBJZiB0aGUKLSAgICAgKiAgc2Vzc2lvbiAoYW5kIGFwcGxpY2F0aW9uKSBtb3ZlcyB0byBhIGRpZmZlcmVudCBjb250ZXh0IChpLmUuLAotICAgICAqICBhIGRpZmZlcmVudCBKVk0pLCB0aGVuCi0gICAgICogIHdlIHdhbnQgdG8gcmVjb25uZWN0IHRvIHRoZSBzcGVjaWZpY2F0aW9uIGluIHRoZSBuZXcgY29udGV4dC4KLSAgICAgKiAgQSBjaGVjayBpcyBtYWRlIG9uIGV2ZXJ5IHJlcXVlc3QKLSAgICAgKiAgY3ljbGUgYXMgbmVlZGVkLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHJvdGVjdGVkIHRyYW5zaWVudCBJQXBwbGljYXRpb25TcGVjaWZpY2F0aW9uIF9zcGVjaWZpY2F0aW9uOwotCi0gICAgLyoqCi0gICAgICogIFRoZSBzb3VyY2UgZm9yIHRlbXBsYXRlIGRhdGEuIFRoZSB0ZW1wbGF0ZSBzb3VyY2UgaXMgc3RvcmVkCi0gICAgICogIGluIHRoZSB7QGxpbmsgU2VydmxldENvbnRleHR9IGFzIGEgbmFtZWQgYXR0cmlidXRlLgotICAgICAqICBBZnRlciBkZS1zZXJpYWxpemF0aW9uLCB0aGUgYXBwbGljYXRpb24gY2FuIHJlLWNvbm5lY3QgdG8KLSAgICAgKiAgdGhlIHRlbXBsYXRlIHNvdXJjZSAob3IgY3JlYXRlIGEgbmV3IG9uZSkuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwcm90ZWN0ZWQgdHJhbnNpZW50IElUZW1wbGF0ZVNvdXJjZSBfdGVtcGxhdGVTb3VyY2U7Ci0KLSAgICAvKioKLSAgICAgKiAgVGhlIHNvdXJjZSBmb3IgY29tcG9uZW50IHNwZWNpZmljYXRpb25zLCBzdG9yZWQgaW4gdGhlCi0gICAgICogIHtAbGluayBTZXJ2bGV0Q29udGV4dH0gKGxpa2Uge0BsaW5rICNfdGVtcGxhdGVTb3VyY2V9KS4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHByb3RlY3RlZCB0cmFuc2llbnQgSVNwZWNpZmljYXRpb25Tb3VyY2UgX3NwZWNpZmljYXRpb25Tb3VyY2U7Ci0KLSAgICAvKioKLSAgICAgKiAgVGhlIHNvdXJjZSBmb3IgcGFyc2VkIHNjcmlwdHMsIGFnYWluLCBzdG9yZWQgaW4gdGhlCi0gICAgICogIHtAbGluayBTZXJ2bGV0Q29udGV4dH0uCi0gICAgICoKLSAgICAgKiAgQHNpbmNlIDEuMC4yCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwcml2YXRlIHRyYW5zaWVudCBJU2NyaXB0U291cmNlIF9zY3JpcHRTb3VyY2U7Ci0KLSAgICAvKioKLSAgICAgKiAgVGhlIG5hbWUgb2YgdGhlIGNvbnRleHQgYXR0cmlidXRlIGZvciB0aGUge0BsaW5rIElTY3JpcHRTb3VyY2V9IGluc3RhbmNlLgotICAgICAqICBUaGUgYXBwbGljYXRpb24ncyBuYW1lIGlzIGFwcGVuZGVkLgotICAgICAqCi0gICAgICogIEBzaW5jZSAxLjAuMgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NSSVBUX1NPVVJDRV9OQU1FID0gIm9yZy5hcGFjaGUudGFwZXN0cnkuU2NyaXB0U291cmNlIjsKLQotICAgIC8qKgotICAgICAqICBUaGUgbmFtZSBvZiB0aGUgY29udGV4dCBhdHRyaWJ1dGUgZm9yIHRoZSB7QGxpbmsgSUNvbXBvbmVudE1lc3NhZ2VzU291cmNlfQotICAgICAqICBpbnN0YW5jZS4gIFRoZSBhcHBsaWNhdGlvbidzIG5hbWUgaXMgYXBwZW5kZWQuCi0gICAgICoKLSAgICAgKiAgQHNpbmNlIDIuMC40Ci0gICAgICoKLSAgICAgKiovCi0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTVFJJTkdTX1NPVVJDRV9OQU1FID0gIm9yZy5hcGFjaGUudGFwZXN0cnkuU3RyaW5nc1NvdXJjZSI7Ci0KLSAgICBwcml2YXRlIHRyYW5zaWVudCBJQ29tcG9uZW50TWVzc2FnZXNTb3VyY2UgX3N0cmluZ3NTb3VyY2U7Ci0KLSAgICAvKioKLSAgICAgKiAgVGhlIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIHNwZWNpZmljYXRpb24gcHJvcGVydHkgdXNlZCB0byBzcGVjaWZ5IHRoZQotICAgICAqICBjbGFzcyBvZiB0aGUgdmlzaXQgb2JqZWN0LgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklTSVRfQ0xBU1NfUFJPUEVSVFlfTkFNRSA9ICJvcmcuYXBhY2hlLnRhcGVzdHJ5LnZpc2l0LWNsYXNzIjsKLQotICAgIC8qKgotICAgICAqICBTZXJ2bGV0IGNvbnRleHQgYXR0cmlidXRlIG5hbWUgZm9yIHRoZSBkZWZhdWx0IHtAbGluayBJVGVtcGxhdGVTb3VyY2V9Ci0gICAgICogIGluc3RhbmNlLiAgVGhlIGFwcGxpY2F0aW9uJ3MgbmFtZSBpcyBhcHBlbmRlZC4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRFTVBMQVRFX1NPVVJDRV9OQU1FID0gIm9yZy5hcGFjaGUudGFwZXN0cnkuVGVtcGxhdGVTb3VyY2UiOwotCi0gICAgLyoqCi0gICAgICogIFNlcnZsZXQgY29udGV4dCBhdHRyaWJ1dGUgbmFtZSBmb3IgdGhlIGRlZmF1bHQge0BsaW5rIElTcGVjaWZpY2F0aW9uU291cmNlfQotICAgICAqICBpbnN0YW5jZS4gIFRoZSBhcHBsaWNhdGlvbidzIG5hbWUgaXMgYXBwZW5kZWQuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTUEVDSUZJQ0FUSU9OX1NPVVJDRV9OQU1FID0KLSAgICAgICAgIm9yZy5hcGFjaGUudGFwZXN0cnkuU3BlY2lmaWNhdGlvblNvdXJjZSI7Ci0KLSAgICAvKioKLSAgICAgKiAgU2VydmxldCBjb250ZXh0IGF0dHJpYnV0ZSBuYW1lIGZvciB0aGUge0BsaW5rIElQYWdlU291cmNlfQotICAgICAqICBpbnN0YW5jZS4gIFRoZSBhcHBsaWNhdGlvbidzIG5hbWUgaXMgYXBwZW5kZWQuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX1NPVVJDRV9OQU1FID0gIm9yZy5hcGFjaGUudGFwZXN0cnkuUGFnZVNvdXJjZSI7Ci0KLSAgICAvKioKLSAgICAgKiAgU2VydmxldCBjb250ZXh0IGF0dHJpYnV0ZSBuYW1lIGZvciBhIHNoYXJlZCBpbnN0YW5jZQotICAgICAqICBvZiB7QGxpbmsgRGF0YVNxdWVlemVyfS4gIFRoZSBpbnN0YW5jZSBpcyBhY3R1YWxseSBzaGFyZWQKLSAgICAgKiAgYmV0d2VlbiBUYXBlc3RyeSBhcHBsaWNhdGlvbnMgd2l0aGluIHRoZSBzYW1lIGNvbnRleHQKLSAgICAgKiAgKHdoaWNoIHdpbGwgaGF2ZSB0aGUgc2FtZSBDbGFzc0xvYWRlcikuCi0gICAgICoKLSAgICAgKiAgQHNpbmNlIDIuMgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFUQV9TUVVFRVpFUl9OQU1FID0gIm9yZy5hcGFjaGUudGFwZXN0cnkuRGF0YVNxdWVlemVyIjsKLQotICAgIC8qKgotICAgICAqIFNlcnZsZXQgY29udGV4dCBhdHRyaWJ1dGUgbmFtZSBmb3IgYSBzaGFyZWQgaW5zdGFuY2UKLSAgICAgKiBvZiB7QGxpbmsgUmVzb3VyY2VDaGVja3N1bVNvdXJjZX0uCi0gICAgICogQHNpbmNlIDMuMC4zCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTT1VSQ0VfQ0hFQ0tTVU1fU09VUkNFX05BTUUgPSAKLSAgICAgICAgIm9yZy5hcGFjaGUudGFwZXN0cnkuUmVzb3VyY2VDaGVja3N1bVNvdXJjZSI7Ci0gICAgCi0gICAgLyoqCi0gICAgICogIFRoZSBzb3VyY2UgZm9yIHBhZ2VzLCB3aGljaCBhY3RzIGFzIGEgcG9vbCwgYnV0IGlzIGNhcGFibGUgb2YKLSAgICAgKiAgY3JlYXRpbmcgcGFnZXMgYXMgbmVlZGVkLiAgU3RvcmVkIGluIHRoZQotICAgICAqICB7QGxpbmsgU2VydmxldENvbnRleHR9LCBsaWtlIHtAbGluayAjX3RlbXBsYXRlU291cmNlfS4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHByaXZhdGUgdHJhbnNpZW50IElQYWdlU291cmNlIF9wYWdlU291cmNlOwotCi0gICAgLyoqCi0gICAgICogIElmIHRydWUgKHNldCBmcm9tIEpWTSBzeXN0ZW0gcGFyYW1ldGVyCi0gICAgICogIDxjb2RlPm9yZy5hcGFjaGUudGFwZXN0cnkuZW5hYmxlLXJlc2V0LXNlcnZpY2U8L2NvZGU+KQotICAgICAqICB0aGVuIHRoZSByZXNldCBzZXJ2aWNlIHdpbGwgYmUgZW5hYmxlZCwgYWxsb3dpbmcKLSAgICAgKiAgdGhlIGNhY2hlIG9mIHBhZ2VzLCBzcGVjaWZpY2F0aW9ucyBhbmQgdGVtcGxhdGUKLSAgICAgKiAgdG8gYmUgY2xlYXJlZCBvbiBkZW1hbmQuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIF9yZXNldFNlcnZpY2VFbmFibGVkID0KLSAgICAgICAgQm9vbGVhbi5nZXRCb29sZWFuKCJvcmcuYXBhY2hlLnRhcGVzdHJ5LmVuYWJsZS1yZXNldC1zZXJ2aWNlIik7Ci0KLSAgICAvKioKLSAgICAgKiBJZiB0cnVlIChzZXQgZnJvbSB0aGUgSlZNIHN5c3RlbSBwYXJhbWV0ZXIKLSAgICAgKiA8Y29kZT5vcmcuYXBhY2hlLnRhcGVzdHJ5LmRpc2FibGUtY2FjaGluZzwvY29kZT4pCi0gICAgICogdGhlbiB0aGUgY2FjaGUgb2YgcGFnZXMsIHNwZWNpZmljYXRpb25zIGFuZCB0ZW1wbGF0ZQotICAgICAqIHdpbGwgYmUgY2xlYXJlZCBhZnRlciBlYWNoIHJlcXVlc3QuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIF9kaXNhYmxlQ2FjaGluZyA9Ci0gICAgICAgIEJvb2xlYW4uZ2V0Qm9vbGVhbigib3JnLmFwYWNoZS50YXBlc3RyeS5kaXNhYmxlLWNhY2hpbmciKTsKLQotICAgIHByaXZhdGUgdHJhbnNpZW50IElSZXNvdXJjZVJlc29sdmVyIF9yZXNvbHZlcjsKLQotICAgIC8qKgotICAgICAqICBDb25zdGFudCB1c2VkIHRvIHN0b3JlIGEge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkudXRpbC5JUHJvcGVydHlIb2xkZXJ9Ci0gICAgICogIGluIHRoZSBzZXJ2bGV0IGNvbnRleHQuCi0gICAgICoKLSAgICAgKiAgQHNpbmNlIDIuMwotICAgICAqCi0gICAgICoqLwotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfU09VUkNFX05BTUUgPSAib3JnLmFwYWNoZS50YXBlc3RyeS5Qcm9wZXJ0eVNvdXJjZSI7Ci0KLSAgICAvKioKLSAgICAgKiAgQSBzaGFyZWQgaW5zdGFuY2Ugb2Yge0BsaW5rIElQcm9wZXJ0eVNvdXJjZX0KLSAgICAgKgotICAgICAqICBAc2luY2UgMy4wCi0gICAgICogIEBzZWUgI2NyZWF0ZVByb3BlcnR5U291cmNlKFJlcXVlc3RDb250ZXh0KQotICAgICAqCi0gICAgICoqLwotCi0gICAgcHJpdmF0ZSB0cmFuc2llbnQgSVByb3BlcnR5U291cmNlIF9wcm9wZXJ0eVNvdXJjZTsKLQotICAgIC8qKgotICAgICAqICBNYXAgZnJvbSBzZXJ2aWNlIG5hbWUgdG8gc2VydmljZSBpbnN0YW5jZS4KLSAgICAgKgotICAgICAqICBAc2luY2UgMS4wLjkKLSAgICAgKgotICAgICAqKi8KLQotICAgIHByaXZhdGUgdHJhbnNpZW50IE1hcCBfc2VydmljZU1hcDsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZJQ0VfTUFQX05BTUUgPSAib3JnLmFwYWNoZS50YXBlc3RyeS5TZXJ2aWNlTWFwIjsKLQotICAgIC8qKgotICAgICAqICBBIHNoYXJlZCBpbnN0YW5jZSBvZiB7QGxpbmsgUG9vbH0uCi0gICAgICoKLSAgICAgKiAgQHNpbmNlIDMuMAotICAgICAqICBAc2VlICNjcmVhdGVQb29sKFJlcXVlc3RDb250ZXh0KQotICAgICAqCi0gICAgICoqLwotCi0gICAgcHJpdmF0ZSB0cmFuc2llbnQgUG9vbCBfcG9vbDsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBPT0xfTkFNRSA9ICJvcmcuYXBhY2hlLnRhcGVzdHJ5LlBvb2wiOwotCi0gICAgLyoqCi0gICAgICogIE5hbWUgb2YgYSBzaGFyZWQgaW5zdGFuY2Ugb2Yge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkuZW5naW5lLklDb21wb25lbnRDbGFzc0VuaGFuY2VyfQotICAgICAqICBzdG9yZWQgaW4gdGhlIHtAbGluayBTZXJ2bGV0Q29udGV4dH0uCi0gICAgICoKLSAgICAgKiAgQHNpbmNlIDMuMAotICAgICAqCi0gICAgICoqLwotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5IQU5DRVJfTkFNRSA9ICJvcmcuYXBhY2hlLnRhcGVzdHJ5LkNvbXBvbmVudENsYXNzRW5oYW5jZXIiOwotCi0gICAgLyoqCi0gICAgICogIEEgc2hhcmVkIGluc3RhbmNlIG9mIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LmVuZ2luZS5JQ29tcG9uZW50Q2xhc3NFbmhhbmNlcn0uCi0gICAgICoKLSAgICAgKiAgQHNpbmNlIDMuMAotICAgICAqICBAc2VlICNjcmVhdGVDb21wb25lbnRDbGFzc0VuaGFuY2VyKFJlcXVlc3RDb250ZXh0KQotICAgICAqCi0gICAgICoqLwotCi0gICAgcHJpdmF0ZSB0cmFuc2llbnQgSUNvbXBvbmVudENsYXNzRW5oYW5jZXIgX2VuaGFuY2VyOwotCi0gICAgLyoqCi0gICAgICogIFNldCB0byB0cnVlIHdoZW4gdGhlcmUgaXMgYSAocG90ZW50aWFsKQotICAgICAqICBjaGFuZ2UgdG8gdGhlIGludGVybmFsIHN0YXRlIG9mIHRoZSBlbmdpbmUsIHNldAotICAgICAqICB0byBmYWxzZSB3aGVuIHRoZSBlbmdpbmUgaXMgc3RvcmVkIGludG8gdGhlCi0gICAgICogIHtAbGluayBIdHRwU2Vzc2lvbn0uCi0gICAgICoKLSAgICAgKiAgQHNpbmNlIDMuMAotICAgICAqCi0gICAgICoqLwotCi0gICAgcHJpdmF0ZSB0cmFuc2llbnQgYm9vbGVhbiBfZGlydHk7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgaW5zdGFuY2Ugb2Yge0BsaW5rIElNb25pdG9yRmFjdG9yeX0gdXNlZCB0byBjcmVhdGUgYSBtb25pdG9yLgotICAgICAqCi0gICAgICogQHNpbmNlIDMuMAotICAgICAqLwotCi0gICAgcHJpdmF0ZSB0cmFuc2llbnQgSU1vbml0b3JGYWN0b3J5IF9tb25pdG9yRmFjdG9yeTsKLQotICAgIC8qKgotICAgICAqIFVzZWQgdG8gb2J0YWluIHJlc291cmNlIGNoZWNrc3VtcyBmb3IgdGhlIGFzc2V0IHNlcnZpY2UuCi0gICAgICogQHNpbmNlIDMuMC4zCi0gICAgICovCi0gICAgcHJpdmF0ZSB0cmFuc2llbnQgUmVzb3VyY2VDaGVja3N1bVNvdXJjZSBfcmVzb3VyY2VDaGVja3N1bVNvdXJjZTsKLSAgICAKLSAgICAvKioKLSAgICAgKiAgU2V0cyB0aGUgRXhjZXB0aW9uIHBhZ2UncyBleGNlcHRpb24gcHJvcGVydHksIHRoZW4gcmVuZGVycyB0aGUgRXhjZXB0aW9uIHBhZ2UuCi0gICAgICoKLSAgICAgKiAgPHA+SWYgdGhlIHJlbmRlciB0aHJvd3MgYW4gZXhjZXB0aW9uLCB0aGVuIGNvcGlvdXMgb3V0cHV0IGlzIHNlbnQgdG8KLSAgICAgKiAgPGNvZGU+U3lzdGVtLmVycjwvY29kZT4gYW5kIGEge0BsaW5rIFNlcnZsZXRFeGNlcHRpb259IGlzIHRocm93bi4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHByb3RlY3RlZCB2b2lkIGFjdGl2YXRlRXhjZXB0aW9uUGFnZSgKLSAgICAgICAgSVJlcXVlc3RDeWNsZSBjeWNsZSwKLSAgICAgICAgUmVzcG9uc2VPdXRwdXRTdHJlYW0gb3V0cHV0LAotICAgICAgICBUaHJvd2FibGUgY2F1c2UpCi0gICAgICAgIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgSVBhZ2UgZXhjZXB0aW9uUGFnZSA9IGN5Y2xlLmdldFBhZ2UoZ2V0RXhjZXB0aW9uUGFnZU5hbWUoKSk7Ci0KLSAgICAgICAgICAgIGV4Y2VwdGlvblBhZ2Uuc2V0UHJvcGVydHkoImV4Y2VwdGlvbiIsIGNhdXNlKTsKLQotICAgICAgICAgICAgY3ljbGUuYWN0aXZhdGUoZXhjZXB0aW9uUGFnZSk7Ci0KLSAgICAgICAgICAgIHJlbmRlclJlc3BvbnNlKGN5Y2xlLCBvdXRwdXQpOwotCi0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSBleCkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gV29yc3QgY2FzZSBzY2VuYXJpby4gIFRoZSBleGNlcHRpb24gcGFnZSBpdHNlbGYgaXMgYnJva2VuLCBsZWF2aW5nCi0gICAgICAgICAgICAvLyB1cyB3aXRoIG5vIG9wdGlvbiBidXQgdG8gd3JpdGUgdGhlIGNhdXNlIHRvIHRoZSBvdXRwdXQuCi0KLSAgICAgICAgICAgIHJlcG9ydEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICBUYXBlc3RyeS5nZXRNZXNzYWdlKCJBYnN0cmFjdEVuZ2luZS51bmFibGUtdG8tcHJvY2Vzcy1jbGllbnQtcmVxdWVzdCIpLAotICAgICAgICAgICAgICAgIGNhdXNlKTsKLQotICAgICAgICAgICAgLy8gQWxzbywgd3JpdGUgdGhlIGV4Y2VwdGlvbiB0aHJvd24gd2hlbiByZWRlbmRlcmluZyB0aGUgZXhjZXB0aW9uCi0gICAgICAgICAgICAvLyBwYWdlLCBzbyB0aGF0IGNhbiBnZXQgZml4ZWQgYXMgd2VsbC4KLQotICAgICAgICAgICAgcmVwb3J0RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIFRhcGVzdHJ5LmdldE1lc3NhZ2UoIkFic3RyYWN0RW5naW5lLnVuYWJsZS10by1wcmVzZW50LWV4Y2VwdGlvbi1wYWdlIiksCi0gICAgICAgICAgICAgICAgZXgpOwotCi0gICAgICAgICAgICAvLyBBbmQgdGhyb3cgdGhlIGV4Y2VwdGlvbi4KLQotICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24oZXguZ2V0TWVzc2FnZSgpLCBleCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgV3JpdGVzIGEgZGV0YWlsZWQgcmVwb3J0IG9mIHRoZSBleGNlcHRpb24gdG8gPGNvZGU+U3lzdGVtLmVycjwvY29kZT4uCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCByZXBvcnRFeGNlcHRpb24oU3RyaW5nIHJlcG9ydFRpdGxlLCBUaHJvd2FibGUgZXgpCi0gICAgewotICAgICAgICBMT0cud2FybihyZXBvcnRUaXRsZSwgZXgpOwotCi0gICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiXG5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcblxuIik7Ci0KLSAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKHJlcG9ydFRpdGxlKTsKLQotICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oCi0gICAgICAgICAgICAiXG5cbiAgICAgIFNlc3Npb24gaWQ6ICIKLSAgICAgICAgICAgICAgICArIF9zZXNzaW9uSWQKLSAgICAgICAgICAgICAgICArICJcbiAgQ2xpZW50IGFkZHJlc3M6ICIKLSAgICAgICAgICAgICAgICArIF9jbGllbnRBZGRyZXNzCi0gICAgICAgICAgICAgICAgKyAiXG5cbkV4Y2VwdGlvbnM6XG4iKTsKLQotICAgICAgICBuZXcgRXhjZXB0aW9uQW5hbHl6ZXIoKS5yZXBvcnRFeGNlcHRpb24oZXgsIFN5c3RlbS5lcnIpOwotCi0gICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4iKTsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqICBJbnZva2VkIGF0IHRoZSBlbmQgb2YgdGhlIHJlcXVlc3QgY3ljbGUgdG8gcmVsZWFzZSBhbnkgcmVzb3VyY2VzIHNwZWNpZmljCi0gICAgICogIHRvIHRoZSByZXF1ZXN0IGN5Y2xlLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgY2xlYW51cEFmdGVyUmVxdWVzdChJUmVxdWVzdEN5Y2xlIGN5Y2xlKTsKLQotICAgIC8qKgotICAgICAqICBFeHRlbmRzIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgY2xhc3MgZ2VuZXJhdGVkIGJ5IHtAbGluayAjdG9TdHJpbmcoKX0uCi0gICAgICogIElmIGEgc3ViY2xhc3MgYWRkcyBhZGRpdGlvbmFsIGluc3RhbmNlIHZhcmlhYmxlcyB0aGF0IHNob3VsZCBiZSBkZXNjcmliZWQKLSAgICAgKiAgaW4gdGhlIGluc3RhbmNlIGRlc2NyaXB0aW9uLCBpdCBtYXkgb3ZlcmlkZSB0aGlzIG1ldGhvZC4gVGhpcyBpbXBsZW1lbnRhdGlvbgotICAgICAqICBkb2VzIG5vdGhpbmcuCi0gICAgICoKLSAgICAgKiAgQHNlZSAjdG9TdHJpbmcoKQotICAgICAqCi0gICAgICoqLwotCi0gICAgcHJvdGVjdGVkIHZvaWQgZXh0ZW5kRGVzY3JpcHRpb24oVG9TdHJpbmdCdWlsZGVyIGJ1aWxkZXIpCi0gICAgewotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgdGhlIGxvY2FsZSBmb3IgdGhlIGVuZ2luZS4gIFRoaXMgaXMgaW5pdGlhbGx5IHNldAotICAgICAqICBieSB0aGUge0BsaW5rIEFwcGxpY2F0aW9uU2VydmxldH0gYnV0IG1heSBiZSB1cGRhdGVkCi0gICAgICogIGJ5IHRoZSBhcHBsaWNhdGlvbi4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBMb2NhbGUgZ2V0TG9jYWxlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfbG9jYWxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE92ZXJyaWRlbiBpbiBzdWJjbGFzc2VzIHRoYXQgc3VwcG9ydCBtb25pdG9yaW5nLiAgU2hvdWxkIGNyZWF0ZSBhbmQgcmV0dXJuCi0gICAgICogYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIElNb25pdG9yfSB0aGF0IGlzIGFwcHJvcHJpYXRlIGZvciB0aGUgcmVxdWVzdCBjeWNsZSBkZXNjcmliZWQKLSAgICAgKiBieSB0aGUge0BsaW5rIFJlcXVlc3RDb250ZXh0fS4KLSAgICAgKgotICAgICAqIDxwPlRoZSBtb25pdG9yIGlzIHVzZWQgdG8gY3JlYXRlIGEge0BsaW5rIFJlcXVlc3RDeWNsZX0uCi0gICAgICoKLSAgICAgKiA8cD5UaGlzIGltcGxlbWVudGF0aW9uIHVzZXMgYSB7QGxpbmsgSU1vbml0b3JGYWN0b3J5fQotICAgICAqIHRvIGNyZWF0ZSB0aGUgbW9uaXRvciBpbnN0YW5jZS4gIFRoZSBmYWN0b3J5Ci0gICAgICogaXMgcHJvdmlkZWQgYXMgYW4gYXBwbGljYXRpb24gZXh0ZW5zaW9uLiAgSWYgdGhlIGFwcGxpY2F0aW9uCi0gICAgICogZXh0ZW5zaW9uIGRvZXMgbm90IGV4aXN0LCB7QGxpbmsgRGVmYXVsdE1vbml0b3JGYWN0b3J5fSBpcyB1c2VkLgotICAgICAqCi0gICAgICogPHA+QXMgb2YgcmVsZWFzZSAzLjAsIHRoaXMgbWV0aG9kIHNob3VsZCA8ZW0+bm90PC9lbT4gcmV0dXJuIG51bGwuCi0gICAgICoKLSAgICAgKgotICAgICAqLwotCi0gICAgcHVibGljIElNb25pdG9yIGdldE1vbml0b3IoUmVxdWVzdENvbnRleHQgY29udGV4dCkKLSAgICB7Ci0gICAgICAgIGlmIChfbW9uaXRvckZhY3RvcnkgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF9zcGVjaWZpY2F0aW9uLmNoZWNrRXh0ZW5zaW9uKFRhcGVzdHJ5Lk1PTklUT1JfRkFDVE9SWV9FWFRFTlNJT05fTkFNRSkpCi0gICAgICAgICAgICAgICAgX21vbml0b3JGYWN0b3J5ID0KLSAgICAgICAgICAgICAgICAgICAgKElNb25pdG9yRmFjdG9yeSkgX3NwZWNpZmljYXRpb24uZ2V0RXh0ZW5zaW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgVGFwZXN0cnkuTU9OSVRPUl9GQUNUT1JZX0VYVEVOU0lPTl9OQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgSU1vbml0b3JGYWN0b3J5LmNsYXNzKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBfbW9uaXRvckZhY3RvcnkgPSBEZWZhdWx0TW9uaXRvckZhY3RvcnkuU0hBUkVEOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIF9tb25pdG9yRmFjdG9yeS5jcmVhdGVNb25pdG9yKGNvbnRleHQpOwotICAgIH0KLQotICAgIHB1YmxpYyBJUGFnZVNvdXJjZSBnZXRQYWdlU291cmNlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfcGFnZVNvdXJjZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyBhIHNlcnZpY2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4gIFNlcnZpY2VzIGFyZSBjcmVhdGVkIGJ5IHRoZQotICAgICAqICBmaXJzdCBjYWxsIHRvIHtAbGluayAjc2V0dXBGb3JSZXF1ZXN0KFJlcXVlc3RDb250ZXh0KX0uCi0gICAgICoqLwotCi0gICAgcHVibGljIElFbmdpbmVTZXJ2aWNlIGdldFNlcnZpY2UoU3RyaW5nIG5hbWUpCi0gICAgewotICAgICAgICBJRW5naW5lU2VydmljZSByZXN1bHQgPSAoSUVuZ2luZVNlcnZpY2UpIF9zZXJ2aWNlTWFwLmdldChuYW1lKTsKLQotICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIFRhcGVzdHJ5LmZvcm1hdCgiQWJzdHJhY3RFbmdpbmUudW5rbm93bi1zZXJ2aWNlIiwgbmFtZSkpOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRTZXJ2bGV0UGF0aCgpCi0gICAgewotICAgICAgICByZXR1cm4gX3NlcnZsZXRQYXRoOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNvbnRleHQgcGF0aCwgdGhlIHByZWZpeCB0byBhcHBseSB0byBhbnkgVVJMcyBzbyB0aGF0IHRoZXkKLSAgICAgKiBhcmUgcmVjb2duaXplZCBhcyBiZWxvbmdpbmcgdG8gdGhlIFNlcnZsZXQgMi4yIGNvbnRleHQuCi0gICAgICoKLSAgICAgKiAgQHNlZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmFzc2V0LkNvbnRleHRBc3NldAotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIFN0cmluZyBnZXRDb250ZXh0UGF0aCgpCi0gICAgewotICAgICAgICByZXR1cm4gX2NvbnRleHRQYXRoOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIHRoZSBzcGVjaWZpY2F0aW9uLCBpZiBhdmFpbGFibGUsIG9yIG51bGwgb3RoZXJ3aXNlLgotICAgICAqCi0gICAgICogIDxwPlRvIGZhY2lsaXRhdGUgZGVwbG95bWVudCBhY3Jvc3MgbXVsdGlwbGUgc2VydmxldCBjb250YWluZXJzLCB0aGUKLSAgICAgKiAgYXBwbGljYXRpb24gaXMgc2VyaWFsaXphYmxlLiAgSG93ZXZlciwgdGhlIHJlZmVyZW5jZSB0byB0aGUgc3BlY2lmaWNhdGlvbgotICAgICAqICBpcyB0cmFuc2llbnQuICAgV2hlbiBhbiBhcHBsaWNhdGlvbiBpbnN0YW5jZSBpcyBkZXNlcmlhbGl6ZWQsIGl0IHJlY29ubmVjdHMKLSAgICAgKiAgd2l0aCB0aGUgYXBwbGljYXRpb24gc3BlY2lmaWNhdGlvbiBieSBsb2NhdGluZyBpdCBpbiB0aGUge0BsaW5rIFNlcnZsZXRDb250ZXh0fQotICAgICAqICBvciBwYXJzaW5nIGl0IGZyZXNoLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIElBcHBsaWNhdGlvblNwZWNpZmljYXRpb24gZ2V0U3BlY2lmaWNhdGlvbigpCi0gICAgewotICAgICAgICByZXR1cm4gX3NwZWNpZmljYXRpb247Ci0gICAgfQotCi0gICAgcHVibGljIElTcGVjaWZpY2F0aW9uU291cmNlIGdldFNwZWNpZmljYXRpb25Tb3VyY2UoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9zcGVjaWZpY2F0aW9uU291cmNlOwotICAgIH0KLQotICAgIHB1YmxpYyBJVGVtcGxhdGVTb3VyY2UgZ2V0VGVtcGxhdGVTb3VyY2UoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF90ZW1wbGF0ZVNvdXJjZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgUmVhZHMgdGhlIHN0YXRlIHNlcmlhbGl6ZWQgYnkge0BsaW5rICN3cml0ZUV4dGVybmFsKE9iamVjdE91dHB1dCl9LgotICAgICAqCi0gICAgICogIDxwPlRoaXMgYWx3YXlzIHNldCB0aGUgc3RhdGVmdWwgZmxhZy4gIEJ5IGRlZmF1bHQsIGEgZGVzZXJpYWxpemVkCi0gICAgICogIHNlc3Npb24gaXMgc3RhdGVmdWwgKGVsc2UsIGl0IHdvdWxkIG5vdCBoYXZlIGJlZW4gc2VyaWFsaXplZCkuCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgcmVhZEV4dGVybmFsKE9iamVjdElucHV0IGluKSB0aHJvd3MgSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIF9zdGF0ZWZ1bCA9IHRydWU7Ci0KLSAgICAgICAgU3RyaW5nIGxvY2FsZU5hbWUgPSBpbi5yZWFkVVRGKCk7Ci0gICAgICAgIF9sb2NhbGUgPSBUYXBlc3RyeS5nZXRMb2NhbGUobG9jYWxlTmFtZSk7Ci0KLSAgICAgICAgX3Zpc2l0ID0gaW4ucmVhZE9iamVjdCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBXcml0ZXMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOgotICAgICAqCi0gICAgICogIDx1bD4KLSAgICAgKiAgPGxpPmxvY2FsZSBuYW1lICh7QGxpbmsgTG9jYWxlI3RvU3RyaW5nKCl9KQotICAgICAqICA8bGk+dmlzaXQKLSAgICAgKiAgPC91bD4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlRXh0ZXJuYWwoT2JqZWN0T3V0cHV0IG91dCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBvdXQud3JpdGVVVEYoX2xvY2FsZS50b1N0cmluZygpKTsKLSAgICAgICAgb3V0LndyaXRlT2JqZWN0KF92aXNpdCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEludm9rZWQsIHR5cGljYWxseSwgd2hlbiBhbiBleGNlcHRpb24gb2NjdXJzIHdoaWxlIHNlcnZpY2luZyB0aGUgcmVxdWVzdC4KLSAgICAgKiAgVGhpcyBtZXRob2QgcmVzZXRzIHRoZSBvdXRwdXQsIHNldHMgdGhlIG5ldyBwYWdlIGFuZCByZW5kZXJzIGl0LgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVkaXJlY3QoCi0gICAgICAgIFN0cmluZyBwYWdlTmFtZSwKLSAgICAgICAgSVJlcXVlc3RDeWNsZSBjeWNsZSwKLSAgICAgICAgUmVzcG9uc2VPdXRwdXRTdHJlYW0gb3V0LAotICAgICAgICBBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24gZXhjZXB0aW9uKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIC8vIERpc2NhcmQgYW55IG91dHB1dCBmcm9tIHRoZSBwcmV2aW91cyBwYWdlLgotCi0gICAgICAgIG91dC5yZXNldCgpOwotCi0gICAgICAgIElQYWdlIHBhZ2UgPSBjeWNsZS5nZXRQYWdlKHBhZ2VOYW1lKTsKLQotICAgICAgICBjeWNsZS5hY3RpdmF0ZShwYWdlKTsKLQotICAgICAgICByZW5kZXJSZXNwb25zZShjeWNsZSwgb3V0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZW5kZXJSZXNwb25zZShJUmVxdWVzdEN5Y2xlIGN5Y2xlLCBSZXNwb25zZU91dHB1dFN0cmVhbSBvdXRwdXQpCi0gICAgICAgIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaWYgKExPRy5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICAgICAgTE9HLmRlYnVnKCJCZWdpbiByZW5kZXIgcmVzcG9uc2UuIik7Ci0KLSAgICAgICAgLy8gSWYgdGhlIGxvY2FsZSBoYXMgY2hhbmdlZCBkdXJpbmcgdGhpcyByZXF1ZXN0IGN5Y2xlIHRoZW4KLSAgICAgICAgLy8gZG8gdGhlIHdvcmsgdG8gcHJvcG9nYXRlIHRoZSBsb2NhbGUgY2hhbmdlIGludG8KLSAgICAgICAgLy8gc3Vic2VxdWVudCByZXF1ZXN0IGN5Y2xlcy4KLQotICAgICAgICBpZiAoX2xvY2FsZUNoYW5nZWQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9sb2NhbGVDaGFuZ2VkID0gZmFsc2U7Ci0KLSAgICAgICAgICAgIFJlcXVlc3RDb250ZXh0IGNvbnRleHQgPSBjeWNsZS5nZXRSZXF1ZXN0Q29udGV4dCgpOwotICAgICAgICAgICAgQXBwbGljYXRpb25TZXJ2bGV0IHNlcnZsZXQgPSBjb250ZXh0LmdldFNlcnZsZXQoKTsKLQotICAgICAgICAgICAgc2VydmxldC53cml0ZUxvY2FsZUNvb2tpZShfbG9jYWxlLCB0aGlzLCBjb250ZXh0KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIENvbW1pdCBhbGwgY2hhbmdlcyBhbmQgaWdub3JlIGZ1cnRoZXIgY2hhbmdlcy4KLQotICAgICAgICBJUGFnZSBwYWdlID0gY3ljbGUuZ2V0UGFnZSgpOwotCi0gICAgICAgIElNYXJrdXBXcml0ZXIgd3JpdGVyID0gcGFnZS5nZXRSZXNwb25zZVdyaXRlcihvdXRwdXQpOwotCi0gICAgICAgIG91dHB1dC5zZXRDb250ZW50VHlwZSh3cml0ZXIuZ2V0Q29udGVudFR5cGUoKSk7Ci0KLSAgICAgICAgYm9vbGVhbiBkaXNjYXJkID0gdHJ1ZTsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgY3ljbGUucmVuZGVyUGFnZSh3cml0ZXIpOwotCi0gICAgICAgICAgICBkaXNjYXJkID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBDbG9zaW5nIHRoZSB3cml0ZXIgY2xvc2VzIGl0cyBQcmludFdyaXRlciBhbmQgYSB3aG9sZSBzdGFjayBvZiBqYXZhLmlvIG9iamVjdHMsCi0gICAgICAgICAgICAvLyB3aGljaCB0ZW5kIHRvIHN0cmVhbSBhIGxvdCBvZiBvdXRwdXQgdGhhdCBldmVudHVhbGx5IGhpdHMgdGhlCi0gICAgICAgICAgICAvLyBSZXNwb25zZU91dHB1dFN0cmVhbS4gIElmIHdlIGFyZSBkaXNjYXJkaW5nIG91dHB1dCBhbnl3YXkgKGR1ZSB0byBhbiBleGNlcHRpb24KLSAgICAgICAgICAgIC8vIGdldHRpbmcgdGhyb3duIGR1cmluZyB0aGUgcmVuZGVyKSwgd2UgY2FuIHNhdmUgb3Vyc2VsdmVzIHNvbWUgdHJvdWJsZQotICAgICAgICAgICAgLy8gYnkgaWdub3JpbmcgaXQuCi0KLSAgICAgICAgICAgIGlmIChkaXNjYXJkKQotICAgICAgICAgICAgICAgIG91dHB1dC5zZXREaXNjYXJkKHRydWUpOwotCi0gICAgICAgICAgICB3cml0ZXIuY2xvc2UoKTsKLQotICAgICAgICAgICAgaWYgKGRpc2NhcmQpCi0gICAgICAgICAgICAgICAgb3V0cHV0LnNldERpc2NhcmQoZmFsc2UpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbnZhbGlkYXRlcyB0aGUgc2Vzc2lvbiwgdGhlbiByZWRpcmVjdHMgdGhlIGNsaWVudCB3ZWIgYnJvd3NlciB0bwotICAgICAqIHRoZSBzZXJ2bGV0J3MgcHJlZml4LCBzdGFydGluZyBhIG5ldyB2aXNpdC4KLSAgICAgKgotICAgICAqIDxwPlN1YmNsYXNzZXMgc2hvdWxkIHBlcmZvcm0gdGhlaXIgb3duIHJlc3RhcnQgKGlmIG5lY2Vzc2FyeSwgd2hpY2ggaXMKLSAgICAgKiByYXJlbHkpIGJlZm9yZSBpbnZva2luZyB0aGlzIGltcGxlbWVudGF0aW9uLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgcmVzdGFydChJUmVxdWVzdEN5Y2xlIGN5Y2xlKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFJlcXVlc3RDb250ZXh0IGNvbnRleHQgPSBjeWNsZS5nZXRSZXF1ZXN0Q29udGV4dCgpOwotCi0gICAgICAgIEh0dHBTZXNzaW9uIHNlc3Npb24gPSBjb250ZXh0LmdldFNlc3Npb24oKTsKLQotICAgICAgICBpZiAoc2Vzc2lvbiAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzZXNzaW9uLmludmFsaWRhdGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKExPRy5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgICAgICBMT0cuZGVidWcoIkV4Y2VwdGlvbiB0aHJvd24gaW52YWxpZGF0aW5nIEh0dHBTZXNzaW9uLiIsIGV4KTsKLQotICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgaWdub3JlIGl0LgotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTWFrZSBpc1N0YXRlZnVsKCkgcmV0dXJuIGZhbHNlLCBzbyB0aGF0IHRoZSBzZXJ2bGV0IGRvZXNuJ3QKLSAgICAgICAgLy8gdHJ5IHRvIHN0b3JlIHRoZSBlbmdpbmUgYmFjayBpbnRvIHRoZSAobm93IGludmFsaWQpIHNlc3Npb24uCi0KLSAgICAgICAgX3N0YXRlZnVsID0gZmFsc2U7Ci0KLSAgICAgICAgU3RyaW5nIHVybCA9IGNvbnRleHQuZ2V0QWJzb2x1dGVVUkwoX3NlcnZsZXRQYXRoKTsKLQotICAgICAgICBjb250ZXh0LnJlZGlyZWN0KHVybCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIERlbGVnYXRlIG1ldGhvZCBmb3IgdGhlIHNlcnZsZXQuICBTZXJ2aWNlcyB0aGUgcmVxdWVzdC4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBib29sZWFuIHNlcnZpY2UoUmVxdWVzdENvbnRleHQgY29udGV4dCkgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBBcHBsaWNhdGlvblNlcnZsZXQgc2VydmxldCA9IGNvbnRleHQuZ2V0U2VydmxldCgpOwotICAgICAgICBJUmVxdWVzdEN5Y2xlIGN5Y2xlID0gbnVsbDsKLSAgICAgICAgUmVzcG9uc2VPdXRwdXRTdHJlYW0gb3V0cHV0ID0gbnVsbDsKLSAgICAgICAgSU1vbml0b3IgbW9uaXRvciA9IG51bGw7Ci0KLSAgICAgICAgaWYgKExPRy5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICAgICAgTE9HLmRlYnVnKCJCZWdpbiBzZXJ2aWNlICIgKyBjb250ZXh0LmdldFJlcXVlc3RVUkkoKSk7Ci0KLSAgICAgICAgaWYgKF9zcGVjaWZpY2F0aW9uID09IG51bGwpCi0gICAgICAgICAgICBfc3BlY2lmaWNhdGlvbiA9IHNlcnZsZXQuZ2V0QXBwbGljYXRpb25TcGVjaWZpY2F0aW9uKCk7Ci0KLSAgICAgICAgLy8gVGhlIHNlcnZsZXQgaW52b2tlcyBzZXRMb2NhbGUoKSBiZWZvcmUgaW52b2tpbmcgc2VydmljZSgpLiAgV2Ugd2FudAotICAgICAgICAvLyB0byBpZ25vcmUgdGhhdCBzZXRMb2NhbGUoKSAuLi4gdGhhdCBpcywgbm90IGZvcmNlIGEgY29va2llIHRvIGJlCi0gICAgICAgIC8vIHdyaXR0ZW4uCi0KLSAgICAgICAgX2xvY2FsZUNoYW5nZWQgPSBmYWxzZTsKLQotICAgICAgICBpZiAoX3Jlc29sdmVyID09IG51bGwpCi0gICAgICAgICAgICBfcmVzb2x2ZXIgPSBzZXJ2bGV0LmdldFJlc291cmNlUmVzb2x2ZXIoKTsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgc2V0dXBGb3JSZXF1ZXN0KGNvbnRleHQpOwotCi0gICAgICAgICAgICBtb25pdG9yID0gZ2V0TW9uaXRvcihjb250ZXh0KTsKLQotICAgICAgICAgICAgb3V0cHV0ID0gbmV3IFJlc3BvbnNlT3V0cHV0U3RyZWFtKGNvbnRleHQuZ2V0UmVzcG9uc2UoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKLSAgICAgICAgewotICAgICAgICAgICAgcmVwb3J0RXhjZXB0aW9uKFRhcGVzdHJ5LmdldE1lc3NhZ2UoIkFic3RyYWN0RW5naW5lLnVuYWJsZS10by1iZWdpbi1yZXF1ZXN0IiksIGV4KTsKLQotICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24oZXguZ2V0TWVzc2FnZSgpLCBleCk7Ci0gICAgICAgIH0KLQotICAgICAgICBJRW5naW5lU2VydmljZSBzZXJ2aWNlID0gbnVsbDsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHNlcnZpY2VOYW1lOwotCi0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlTmFtZSA9IGV4dHJhY3RTZXJ2aWNlTmFtZShjb250ZXh0KTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoVGFwZXN0cnkuaXNCbGFuayhzZXJ2aWNlTmFtZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlTmFtZSA9IFRhcGVzdHJ5LkhPTUVfU0VSVklDRTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBNdXN0IGhhdmUgYSBzZXJ2aWNlIHRvIGNyZWF0ZSB0aGUgcmVxdWVzdCBjeWNsZS4KLSAgICAgICAgICAgICAgICAgICAgLy8gTXVzdCBoYXZlIGEgcmVxdWVzdCBjeWNsZSB0byByZXBvcnQgYW4gZXhjZXB0aW9uLgotCi0gICAgICAgICAgICAgICAgICAgIHNlcnZpY2UgPSBnZXRTZXJ2aWNlKHNlcnZpY2VOYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHNlcnZpY2UgPSBnZXRTZXJ2aWNlKFRhcGVzdHJ5LkhPTUVfU0VSVklDRSk7Ci0gICAgICAgICAgICAgICAgICAgIGN5Y2xlID0gY3JlYXRlUmVxdWVzdEN5Y2xlKGNvbnRleHQsIHNlcnZpY2UsIG1vbml0b3IpOwotCi0gICAgICAgICAgICAgICAgICAgIHRocm93IGV4OwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGN5Y2xlID0gY3JlYXRlUmVxdWVzdEN5Y2xlKGNvbnRleHQsIHNlcnZpY2UsIG1vbml0b3IpOwotCi0gICAgICAgICAgICAgICAgbW9uaXRvci5zZXJ2aWNlQmVnaW4oc2VydmljZU5hbWUsIGNvbnRleHQuZ2V0UmVxdWVzdFVSSSgpKTsKLQotICAgICAgICAgICAgICAgIC8vIEludm9rZSB0aGUgc2VydmljZSwgd2hpY2ggcmV0dXJucyB0cnVlIGlmIGl0IG1heSBoYXZlIGNoYW5nZWQKLSAgICAgICAgICAgICAgICAvLyB0aGUgc3RhdGUgb2YgdGhlIGVuZ2luZSAobW9zdCBkbyByZXR1cm4gdHJ1ZSkuCi0KLSAgICAgICAgICAgICAgICBzZXJ2aWNlLnNlcnZpY2UodGhpcywgY3ljbGUsIG91dHB1dCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBSZXR1cm4gdHJ1ZSBvbmx5IGlmIHRoZSBlbmdpbmUgaXMgYWN0dWFsbHkgZGlydHkuICBUaGlzIGN1dHMgZG93bgotICAgICAgICAgICAgICAgIC8vIG9uIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGVuZ2luZSBpcyBzdG9yZWQgaW50byB0aGUKLSAgICAgICAgICAgICAgICAvLyBzZXNzaW9uIHVuY2VjY2VzYXJpbHkuCi0KLSAgICAgICAgICAgICAgICByZXR1cm4gX2RpcnR5OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFBhZ2VSZWRpcmVjdEV4Y2VwdGlvbiBleCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVQYWdlUmVkaXJlY3RFeGNlcHRpb24oZXgsIGN5Y2xlLCBvdXRwdXQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFJlZGlyZWN0RXhjZXB0aW9uIGV4KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGhhbmRsZVJlZGlyZWN0RXhjZXB0aW9uKGN5Y2xlLCBleCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoU3RhbGVMaW5rRXhjZXB0aW9uIGV4KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGhhbmRsZVN0YWxlTGlua0V4Y2VwdGlvbihleCwgY3ljbGUsIG91dHB1dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoU3RhbGVTZXNzaW9uRXhjZXB0aW9uIGV4KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGhhbmRsZVN0YWxlU2Vzc2lvbkV4Y2VwdGlvbihleCwgY3ljbGUsIG91dHB1dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKLSAgICAgICAgewotICAgICAgICAgICAgbW9uaXRvci5zZXJ2aWNlRXhjZXB0aW9uKGV4KTsKLQotICAgICAgICAgICAgLy8gRGlzY2FyZCBhbnkgb3V0cHV0IChpZiBwb3NzaWJsZSkuICBJZiBvdXRwdXQgaGFzIGFscmVhZHkgYmVlbiBzZW50IHRvCi0gICAgICAgICAgICAvLyB0aGUgY2xpZW50LCB0aGVuIHRoaW5ncyBnZXQgZGljZXkuICBOb3RlIHRoYXQgdGhpcyBibG9jawotICAgICAgICAgICAgLy8gZ2V0cyBhY3RpdmF0ZWQgaWYgdGhlIFN0YWxlTGluayBvciBTdGFsZVNlc3Npb24gcGFnZXMgdGhyb3dzCi0gICAgICAgICAgICAvLyBhbnkga2luZCBvZiBleGNlcHRpb24uCi0KLSAgICAgICAgICAgIC8vIEF0dGVtcHQgdG8gc3dpdGNoIHRvIHRoZSBleGNlcHRpb24gcGFnZS4gIEhvd2V2ZXIsIHRoaXMgbWF5IGl0c2VsZiBmYWlsCi0gICAgICAgICAgICAvLyBmb3IgYSBudW1iZXIgb2YgcmVhc29ucywgaW4gd2hpY2ggY2FzZSBhIFNlcnZsZXRFeGNlcHRpb24gaXMgdGhyb3duLgotCi0gICAgICAgICAgICBvdXRwdXQucmVzZXQoKTsKLQotICAgICAgICAgICAgaWYgKExPRy5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIExPRy5kZWJ1ZygiVW5jYXVnaHQgZXhjZXB0aW9uIiwgZXgpOwotCi0gICAgICAgICAgICBhY3RpdmF0ZUV4Y2VwdGlvblBhZ2UoY3ljbGUsIG91dHB1dCwgZXgpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHNlcnZpY2UgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBtb25pdG9yLnNlcnZpY2VFbmQoc2VydmljZS5nZXROYW1lKCkpOwotCi0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjeWNsZS5jbGVhbnVwKCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBDbG9zaW5nIHRoZSBidWZmZXJlZCBvdXRwdXQgY2xvc2VzIHRoZSB1bmRlcmx5aW5nIHN0cmVhbSBhcyB3ZWxsLgotCi0gICAgICAgICAgICAgICAgaWYgKG91dHB1dCAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICBvdXRwdXQuZm9yY2VGbHVzaCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXBvcnRFeGNlcHRpb24oVGFwZXN0cnkuZ2V0TWVzc2FnZSgiQWJzdHJhY3RFbmdpbmUuZXhjZXB0aW9uLWR1cmluZy1jbGVhbnVwIiksIGV4KTsKLSAgICAgICAgICAgIH0KLQkJCWZpbmFsbHkKLQkJCXsKLSAgICAgICAgICAgICAgICBjbGVhbnVwQWZ0ZXJSZXF1ZXN0KGN5Y2xlKTsKLQkJCX0KLQotICAgICAgICAgICAgaWYgKF9kaXNhYmxlQ2FjaGluZykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNsZWFyQ2FjaGVkRGF0YSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVwb3J0RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgVGFwZXN0cnkuZ2V0TWVzc2FnZSgiQWJzdHJhY3RFbmdpbmUuZXhjZXB0aW9uLWR1cmluZy1jYWNoZS1jbGVhciIpLAotICAgICAgICAgICAgICAgICAgICAgICAgZXgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKExPRy5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIExPRy5kZWJ1ZygiRW5kIHNlcnZpY2UiKTsKLQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIF9kaXJ0eTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgSGFuZGxlcyB7QGxpbmsgUGFnZVJlZGlyZWN0RXhjZXB0aW9ufSB3aGljaCBpbnZvbHZlcwotICAgICAqICBleGVjdXRpbmcge0BsaW5rIElQYWdlI3ZhbGlkYXRlKElSZXF1ZXN0Q3ljbGUpfSBvbiB0aGUgdGFyZ2V0IHBhZ2UKLSAgICAgKiAgKG9mIHRoZSBleGNlcHRpb24pLCB1bnRpbCBlaXRoZXIgYSBsb29wIGlzIGZvdW5kLCBvciBhIHBhZ2UKLSAgICAgKiAgc3VjY2VzZnVsbHkgdmFsaWRhdGVzIGFuZCBjYW4gYmUgYWN0aXZhdGVkLgotICAgICAqCi0gICAgICogIDxwPlRoaXMgc2hvdWxkIGdlbmVyYWxseSBub3QgYmUgb3ZlcnJpZGVuIGluIHN1YmNsYXNzZXMuCi0gICAgICoKLSAgICAgKiAgQHNpbmNlIDMuMAotICAgICAqLwotCi0gICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlUGFnZVJlZGlyZWN0RXhjZXB0aW9uKAotICAgICAgICBQYWdlUmVkaXJlY3RFeGNlcHRpb24gZXgsCi0gICAgICAgIElSZXF1ZXN0Q3ljbGUgY3ljbGUsCi0gICAgICAgIFJlc3BvbnNlT3V0cHV0U3RyZWFtIG91dHB1dCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uCi0gICAgewotICAgICAgICBMaXN0IHBhZ2VOYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgICBTdHJpbmcgcGFnZU5hbWUgPSBleC5nZXRUYXJnZXRQYWdlTmFtZSgpOwotCi0gICAgICAgIHdoaWxlICh0cnVlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocGFnZU5hbWVzLmNvbnRhaW5zKHBhZ2VOYW1lKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIG9mZmVuZGluZyBwYWdlIHRvIHBhZ2VOYW1lcyBzbyBpdCBzaG93cyBpbiB0aGUKLSAgICAgICAgICAgICAgICAvLyBsaXN0LgotCi0gICAgICAgICAgICAgICAgcGFnZU5hbWVzLmFkZChwYWdlTmFtZSk7Ci0KLSAgICAgICAgICAgICAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgICAgIGludCBjb3VudCA9IHBhZ2VOYW1lcy5zaXplKCk7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDApCi0gICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCI7ICIpOwotCi0gICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQocGFnZU5hbWVzLmdldChpKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgVGFwZXN0cnkuZm9ybWF0KCJBYnN0cmFjdEVuZ2luZS52YWxpZGF0ZS1jeWNsZSIsIGJ1ZmZlci50b1N0cmluZygpKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFJlY29yZCB0aGF0IHRoaXMgcGFnZSBoYXMgYmVlbiBhIHRhcmdldC4KLQotICAgICAgICAgICAgcGFnZU5hbWVzLmFkZChwYWdlTmFtZSk7Ci0KLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIEF0dGVtcHQgdG8gYWN0aXZhdGUgdGhlIG5ldyBwYWdlLgotCi0gICAgICAgICAgICAgICAgY3ljbGUuYWN0aXZhdGUocGFnZU5hbWUpOwotCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoUGFnZVJlZGlyZWN0RXhjZXB0aW9uIGV4MikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwYWdlTmFtZSA9IGV4Mi5nZXRUYXJnZXRQYWdlTmFtZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gRGlzY2FyZCBhbnkgb3V0cHV0IGZyb20gdGhlIHByZXZpb3VzIHBhZ2UuCi0KLSAgICAgICAgb3V0cHV0LnJlc2V0KCk7Ci0KLSAgICAgICAgcmVuZGVyUmVzcG9uc2UoY3ljbGUsIG91dHB1dCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEludm9rZWQgZnJvbSB7QGxpbmsgI3NlcnZpY2UoUmVxdWVzdENvbnRleHQpfSB0byBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YKLSAgICAgKiAge0BsaW5rIElSZXF1ZXN0Q3ljbGV9IGZvciB0aGUgY3VycmVudCByZXF1ZXN0LiAgVGhpcyBpbXBsZW1lbnRhdGlvbiBjcmVhdGVzCi0gICAgICogIGFuIHJldHVybnMgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIFJlcXVlc3RDeWNsZX0uCi0gICAgICoKLSAgICAgKiAgQHNpbmNlIDMuMAotICAgICAqCi0gICAgICoqLwotCi0gICAgcHJvdGVjdGVkIElSZXF1ZXN0Q3ljbGUgY3JlYXRlUmVxdWVzdEN5Y2xlKAotICAgICAgICBSZXF1ZXN0Q29udGV4dCBjb250ZXh0LAotICAgICAgICBJRW5naW5lU2VydmljZSBzZXJ2aWNlLAotICAgICAgICBJTW9uaXRvciBtb25pdG9yKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBSZXF1ZXN0Q3ljbGUodGhpcywgY29udGV4dCwgc2VydmljZSwgbW9uaXRvcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEludm9rZWQgYnkge0BsaW5rICNzZXJ2aWNlKFJlcXVlc3RDb250ZXh0KX0gaWYgYSB7QGxpbmsgU3RhbGVMaW5rRXhjZXB0aW9ufQotICAgICAqICBpcyB0aHJvd24gYnkgdGhlIHtAbGluayBJRW5naW5lU2VydmljZSBzZXJ2aWNlfS4gIFRoaXMgaW1wbGVtZW50YXRpb24KLSAgICAgKiAgc2V0cyB0aGUgbWVzc2FnZSBwcm9wZXJ0eSBvZiB0aGUgU3RhbGVMaW5rIHBhZ2UgdG8gdGhlCi0gICAgICogIG1lc3NhZ2UgcHJvdmlkZWQgaW4gdGhlIGV4Y2VwdGlvbiwKLSAgICAgKiAgdGhlbiBpbnZva2VzCi0gICAgICogIHtAbGluayAjcmVkaXJlY3QoU3RyaW5nLCBJUmVxdWVzdEN5Y2xlLCBSZXNwb25zZU91dHB1dFN0cmVhbSwgQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uKX0KLSAgICAgKiAgdG8gcmVuZGVyIHRoZSBTdGFsZUxpbmsgcGFnZS4KLSAgICAgKgotICAgICAqICA8cD5TdWJjbGFzc2VzIG1heSBvdmVyaWRlIHRoaXMgbWV0aG9kICh3aXRob3V0Ci0gICAgICogIGludm9raW5nIHRoaXMgaW1wbGVtZW50YXRpb24pLiAgQSBjb21tb24gcHJhY3RpY2UKLSAgICAgKiAgaXMgdG8gcHJlc2VudCBhbiBlcnJvciBtZXNzYWdlIG9uIHRoZSBhcHBsaWNhdGlvbidzCi0gICAgICogIEhvbWUgcGFnZS4KLSAgICAgKgotICAgICAqICA8cD5BbHRlcm5hdGVseSwgdGhlIGFwcGxpY2F0aW9uIG1heSBwcm92aWRlIGl0cyBvd24gdmVyc2lvbiBvZgotICAgICAqICB0aGUgU3RhbGVMaW5rIHBhZ2UsIG92ZXJyaWRpbmcKLSAgICAgKiAgdGhlIGZyYW1ld29yaydzIGltcGxlbWVudGF0aW9uIChwcm9iYWJseSBhIGdvb2QgaWRlYSwgYmVjYXVzZSB0aGUKLSAgICAgKiAgZGVmYXVsdCBwYWdlIGhpbnRzIGF0ICJhcHBsaWNhdGlvbiBlcnJvcnMiIGFuZCBpc24ndCBsb2NhbGl6ZWQpLgotICAgICAqICBUaGUgb3ZlcnJpZGluZyBTdGFsZUxpbmsgaW1wbGVtZW50YXRpb24gbXVzdAotICAgICAqICBpbXBsZW1lbnQgYSBtZXNzYWdlIHByb3BlcnR5IG9mIHR5cGUgU3RyaW5nLgotICAgICAqCi0gICAgICogIEBzaW5jZSAwLjIuMTAKLSAgICAgKgotICAgICAqKi8KLQotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZVN0YWxlTGlua0V4Y2VwdGlvbigKLSAgICAgICAgU3RhbGVMaW5rRXhjZXB0aW9uIGV4LAotICAgICAgICBJUmVxdWVzdEN5Y2xlIGN5Y2xlLAotICAgICAgICBSZXNwb25zZU91dHB1dFN0cmVhbSBvdXRwdXQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgU3RyaW5nIHN0YWxlTGlua1BhZ2VOYW1lID0gZ2V0U3RhbGVMaW5rUGFnZU5hbWUoKTsKLSAgICAgICAgSVBhZ2UgcGFnZSA9IGN5Y2xlLmdldFBhZ2Uoc3RhbGVMaW5rUGFnZU5hbWUpOwotCi0gICAgICAgIHBhZ2Uuc2V0UHJvcGVydHkoIm1lc3NhZ2UiLCBleC5nZXRNZXNzYWdlKCkpOwotCi0gICAgICAgIHJlZGlyZWN0KHN0YWxlTGlua1BhZ2VOYW1lLCBjeWNsZSwgb3V0cHV0LCBleCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEludm9rZWQgYnkge0BsaW5rICNzZXJ2aWNlKFJlcXVlc3RDb250ZXh0KX0gaWYgYSB7QGxpbmsgU3RhbGVTZXNzaW9uRXhjZXB0aW9ufQotICAgICAqICBpcyB0aHJvd24gYnkgdGhlIHtAbGluayBJRW5naW5lU2VydmljZSBzZXJ2aWNlfS4gIFRoaXMgaW1wbGVtZW50YXRpb24KLSAgICAgKiAgaW52b2tlcwotICAgICAqICB7QGxpbmsgI3JlZGlyZWN0KFN0cmluZywgSVJlcXVlc3RDeWNsZSwgUmVzcG9uc2VPdXRwdXRTdHJlYW0sIEFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbil9Ci0gICAgICogIHRvIHJlbmRlciB0aGUgU3RhbGVTZXNzaW9uIHBhZ2UuCi0gICAgICoKLSAgICAgKiAgPHA+U3ViY2xhc3NlcyBtYXkgb3ZlcmlkZSB0aGlzIG1ldGhvZCAod2l0aG91dAotICAgICAqICBpbnZva2luZyB0aGlzIGltcGxlbWVudGF0aW9uKS4gIEEgY29tbW9uIHByYWN0aWNlCi0gICAgICogIGlzIHRvIHByZXNlbnQgYW4gZXJvciBtZXNzYWdlIG9uIHRoZSBhcHBsaWNhdGlvbidzCi0gICAgICogIEhvbWUgcGFnZS4KLSAgICAgKgotICAgICAqICBAc2luY2UgMC4yLjEwCi0gICAgICoqLwotCi0gICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlU3RhbGVTZXNzaW9uRXhjZXB0aW9uKAotICAgICAgICBTdGFsZVNlc3Npb25FeGNlcHRpb24gZXgsCi0gICAgICAgIElSZXF1ZXN0Q3ljbGUgY3ljbGUsCi0gICAgICAgIFJlc3BvbnNlT3V0cHV0U3RyZWFtIG91dHB1dCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uCi0gICAgewotICAgICAgICByZWRpcmVjdChnZXRTdGFsZVNlc3Npb25QYWdlTmFtZSgpLCBjeWNsZSwgb3V0cHV0LCBleCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIERpc2NhcmRzIGFsbCBjYWNoZWQgcGFnZXMsIGNvbXBvbmVudCBzcGVjaWZpY2F0aW9ucyBhbmQgdGVtcGxhdGVzLgotICAgICAqICBTdWJjbGFzc2VzIHdobyBvdmVycmlkZSB0aGlzIG1ldGhvZCBzaG91bGQgaW52b2tlIHRoaXMgaW1wbGVtZW50YXRpb24KLSAgICAgKiAgYXMgd2VsbC4KLSAgICAgKgotICAgICAqICBAc2luY2UgMS4wLjEKLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIGNsZWFyQ2FjaGVkRGF0YSgpCi0gICAgewotICAgICAgICBfcG9vbC5jbGVhcigpOwotICAgICAgICBfcGFnZVNvdXJjZS5yZXNldCgpOwotICAgICAgICBfc3BlY2lmaWNhdGlvblNvdXJjZS5yZXNldCgpOwotICAgICAgICBfdGVtcGxhdGVTb3VyY2UucmVzZXQoKTsKLSAgICAgICAgX3NjcmlwdFNvdXJjZS5yZXNldCgpOwotICAgICAgICBfc3RyaW5nc1NvdXJjZS5yZXNldCgpOwotICAgICAgICBfZW5oYW5jZXIucmVzZXQoKTsKLSAgICAgICAgX3Jlc291cmNlQ2hlY2tzdW1Tb3VyY2UucmVzZXQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgQ2hhbmdlcyB0aGUgbG9jYWxlIGZvciB0aGUgZW5naW5lLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgc2V0TG9jYWxlKExvY2FsZSB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTWF5IG5vdCBjaGFuZ2UgZW5naW5lIGxvY2FsZSB0byBudWxsLiIpOwotCi0gICAgICAgIC8vIEJlY2F1c2UgbG9jYWxlIGNoYW5nZXMgYXJlIGV4cGVuc2l2ZSAoaXQgaW52b2x2ZXMgd3JpdGluZyBhIGNvb2tpZSBhbmQgYWxsIHRoYXQpLAotICAgICAgICAvLyB3ZSdyZSBjYXJlZnVsIG5vdCB0byByZWFsbHkgY2hhbmdlIHVubGVzcyB0aGVyZSdzIGEgdHJ1ZSBjaGFuZ2UgaW4gdmFsdWUuCi0KLSAgICAgICAgaWYgKCF2YWx1ZS5lcXVhbHMoX2xvY2FsZSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9sb2NhbGUgPSB2YWx1ZTsKLSAgICAgICAgICAgIF9sb2NhbGVDaGFuZ2VkID0gdHJ1ZTsKLSAgICAgICAgICAgIG1hcmtEaXJ0eSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEludm9rZWQgZnJvbSB7QGxpbmsgI3NlcnZpY2UoUmVxdWVzdENvbnRleHQpfSB0byBlbnN1cmUgdGhhdCB0aGUgZW5naW5lJ3MKLSAgICAgKiAgaW5zdGFuY2UgdmFyaWFibGVzIGFyZSBzZXR1cC4gIFRoaXMgYWxsb3dzIHRoZSBhcHBsaWNhdGlvbiBhIGNoYW5jZSB0bwotICAgICAqICByZXN0b3JlIHRyYW5zaWVudCB2YXJpYWJsZXMgdGhhdCB3aWxsIG5vdCBoYXZlIHN1cnZpdmVkIGRlc2VyaWFsaXphdGlvbi4KLSAgICAgKgotICAgICAqICBEZXRlcm1pbmVzIHRoZSBzZXJ2bGV0IHByZWZpeDogIHRoaXMgaXMgdGhlIGJhc2UgVVJMIHVzZWQgYnkKLSAgICAgKiAge0BsaW5rIElFbmdpbmVTZXJ2aWNlIHNlcnZpY2VzfSB0byBidWlsZCBVUkxzLiAgSXQgY29uc2lzdHMKLSAgICAgKiAgb2YgdHdvIHBhcnRzOiAgdGhlIGNvbnRleHQgcGF0aCBhbmQgdGhlIHNlcnZsZXQgcGF0aC4KLSAgICAgKgotICAgICAqICA8cD5UaGUgc2VydmxldCBwYXRoIGlzIHJldHJpZXZlZCBmcm9tIHtAbGluayBIdHRwU2VydmxldFJlcXVlc3QjZ2V0U2VydmxldFBhdGgoKX0uCi0gICAgICoKLSAgICAgKiAgPHA+VGhlIGNvbnRleHQgcGF0aCBpcyByZXRyaWV2ZWQgZnJvbSB7QGxpbmsgSHR0cFNlcnZsZXRSZXF1ZXN0I2dldENvbnRleHRQYXRoKCl9LgotICAgICAqCi0gICAgICogIDxwPlRoZSBnbG9iYWwgb2JqZWN0IGlzIHJldHJpZXZlZCBmcm9tIHtAbGluayBJRW5naW5lI2dldEdsb2JhbCgpfSBtZXRob2QuCi0gICAgICoKLSAgICAgKiAgPHA+VGhlIGZpbmFsIHBhdGggaXMgYXZhaWxhYmxlIHZpYSB0aGUge0BsaW5rICNnZXRTZXJ2bGV0UGF0aCgpfSBtZXRob2QuCi0gICAgICoKLSAgICAgKiAgPHA+SW4gYWRkaXRpb24sIHRoaXMgbWV0aG9kIGxvY2F0ZXMgYW5kL29yIGNyZWF0ZXMgdGhlOgotICAgICAqICA8dWw+Ci0gICAgICogIDxsaT57QGxpbmsgSUNvbXBvbmVudENsYXNzRW5oYW5jZXJ9Ci0gICAgICogIDxsaT57QGxpbmsgUG9vbH0KLSAgICAgKiAgPGxpPntAbGluayBJVGVtcGxhdGVTb3VyY2V9Ci0gICAgICogIDxsaT57QGxpbmsgSVNwZWNpZmljYXRpb25Tb3VyY2V9Ci0gICAgICogIDxsaT57QGxpbmsgSVBhZ2VTb3VyY2V9Ci0gICAgICogIDxsaT57QGxpbmsgSUVuZ2luZVNlcnZpY2V9IHtAbGluayBNYXB9Ci0gICAgICogIDxsbD57QGxpbmsgSVNjcmlwdFNvdXJjZX0KLSAgICAgKiAgPGxpPntAbGluayBJQ29tcG9uZW50TWVzc2FnZXNTb3VyY2V9Ci0gICAgICogIDxsaT57QGxpbmsgSVByb3BlcnR5U291cmNlfQotICAgICAqICA8L3VsPgotICAgICAqCi0gICAgICogIDxwPlRoaXMgb3JkZXIgaXMgaW1wb3J0YW50LCBiZWNhdXNlIHNvbWUgb2YgdGhlIGxhdGVyIHNoYXJlZCBvYmplY3RzCi0gICAgICogIGRlcGVuZCBvbiBzb21lIG9mIHRoZSBlYXJsaWVyIHNoYXJlZCBvYmplY3RzIGFscmVhZHkgaGF2aW5nCi0gICAgICogIGJlZW4gbG9jYXRlZCBvciBjcmVhdGVkCi0gICAgICogIChlc3BlY2lhbGx5IHtAbGluayAjZ2V0UG9vbCgpIHBvb2x9KS4KLSAgICAgKgotICAgICAqICA8cD5TdWJjbGFzc2VzIHNob3VsZCBpbnZva2UgdGhpcyBpbXBsZW1lbnRhdGlvbiBmaXJzdCwgdGhlbiBwZXJmb3JtIHRoZWlyCi0gICAgICogIG93biBzZXR1cC4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldHVwRm9yUmVxdWVzdChSZXF1ZXN0Q29udGV4dCBjb250ZXh0KQotICAgIHsKLSAgICAgICAgSHR0cFNlcnZsZXQgc2VydmxldCA9IGNvbnRleHQuZ2V0U2VydmxldCgpOwotICAgICAgICBTZXJ2bGV0Q29udGV4dCBzZXJ2bGV0Q29udGV4dCA9IHNlcnZsZXQuZ2V0U2VydmxldENvbnRleHQoKTsKLSAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QgPSBjb250ZXh0LmdldFJlcXVlc3QoKTsKLSAgICAgICAgSHR0cFNlc3Npb24gc2Vzc2lvbiA9IGNvbnRleHQuZ2V0U2Vzc2lvbigpOwotCi0gICAgICAgIGlmIChzZXNzaW9uICE9IG51bGwpCi0gICAgICAgICAgICBfc2Vzc2lvbklkID0gY29udGV4dC5nZXRTZXNzaW9uKCkuZ2V0SWQoKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgX3Nlc3Npb25JZCA9IG51bGw7Ci0KLSAgICAgICAgLy8gUHJldmlvdXNseSwgdGhpcyB1c2VkIGdldFJlbW90ZUhvc3QoKSwgYnV0IHRoYXQgcmVxdWlyZXMgYW4KLSAgICAgICAgLy8gZXhwZW5zaXZlIHJldmVyc2UgRE5TIGxvb2t1cC4gUG9zc2libHksIHRoZSBob3N0IG5hbWUgbG9va3VwCi0gICAgICAgIC8vIHNob3VsZCBvY2N1ciAuLi4gYnV0IG9ubHkgaWYgdGhlcmUncyBhbiBhY3R1YWwgZXJyb3IgbWVzc2FnZQotICAgICAgICAvLyB0byBkaXNwbGF5LgotCi0gICAgICAgIGlmIChfY2xpZW50QWRkcmVzcyA9PSBudWxsKQotICAgICAgICAgICAgX2NsaWVudEFkZHJlc3MgPSByZXF1ZXN0LmdldFJlbW90ZUFkZHIoKTsKLQotICAgICAgICAvLyBzZXJ2bGV0UGF0aCBpcyBudWxsLCBzbyB0aGlzIG1lYW5zIGVpdGhlciB3ZSdyZSBkb2luZyB0aGUKLSAgICAgICAgLy8gZmlyc3QgcmVxdWVzdCBpbiB0aGlzIHNlc3Npb24sIG9yIHdlJ3JlIGhhbmRsaW5nIGEgc3Vic2VxdWVudAotICAgICAgICAvLyByZXF1ZXN0IGluIGFub3RoZXIgSlZNIChpLmUuIGFub3RoZXIgc2VydmVyIGluIHRoZSBjbHVzdGVyKS4KLSAgICAgICAgLy8gSW4gYW55IGNhc2UsIHdlIGhhdmUgdG8gZG8gc29tZSBsYXRlIChyZS0paW5pdGlhbGl6YXRpb24uCi0KLSAgICAgICAgaWYgKF9zZXJ2bGV0UGF0aCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBHZXQgdGhlIHBhdGggKndpdGhpbiogdGhlIHNlcnZsZXQgY29udGV4dAotCi0gICAgICAgICAgICAvLyBJbiByYXJlIGNhc2VzIHJlbGF0ZWQgdG8gdGhlIHRhZ3N1cHBvcnQgc2VydmljZSwgZ2V0U2VydmxldFBhdGgoKSBpcyB3cm9uZwotICAgICAgICAgICAgLy8gKGl0cyBhIEpTUCwgd2hpY2ggaW52b2tlcyBUYXBlc3RyeSBhcyBhbiBpbmNsdWRlLCB0aHVzIG11ZGRsaW5nIHdoYXQKLSAgICAgICAgICAgIC8vIHRoZSByZWFsIHNlcnZsZXQgYW5kIHNlcnZsZXQgcGF0aCBpcykuICBJbiB0aG9zZSBjYXNlcywgdGhlIEpTUCB0YWcKLSAgICAgICAgICAgIC8vIHdpbGwgaW5mb3JtIHVzLgotCi0gICAgICAgICAgICBTdHJpbmcgcGF0aCA9Ci0gICAgICAgICAgICAgICAgKFN0cmluZykgcmVxdWVzdC5nZXRBdHRyaWJ1dGUoVGFwZXN0cnkuVEFHX1NVUFBPUlRfU0VSVkxFVF9QQVRIX0FUVFJJQlVURSk7Ci0KLSAgICAgICAgICAgIGlmIChwYXRoID09IG51bGwpCi0gICAgICAgICAgICAgICAgcGF0aCA9IHJlcXVlc3QuZ2V0U2VydmxldFBhdGgoKTsKLQotICAgICAgICAgICAgLy8gR2V0IHRoZSBjb250ZXh0IHBhdGgsIHdoaWNoIG1heSBiZSB0aGUgZW1wdHkgc3RyaW5nCi0gICAgICAgICAgICAvLyAoYnV0IHdvbid0IGJlIG51bGwpLgotCi0gICAgICAgICAgICBfY29udGV4dFBhdGggPSByZXF1ZXN0LmdldENvbnRleHRQYXRoKCk7Ci0KLSAgICAgICAgICAgIF9zZXJ2bGV0UGF0aCA9IF9jb250ZXh0UGF0aCArIHBhdGg7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgc2VydmxldE5hbWUgPSBjb250ZXh0LmdldFNlcnZsZXQoKS5nZXRTZXJ2bGV0TmFtZSgpOwotCi0gICAgICAgIGlmIChfcHJvcGVydHlTb3VyY2UgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBQUk9QRVJUWV9TT1VSQ0VfTkFNRSArICI6IiArIHNlcnZsZXROYW1lOwotCi0gICAgICAgICAgICBfcHJvcGVydHlTb3VyY2UgPSAoSVByb3BlcnR5U291cmNlKSBzZXJ2bGV0Q29udGV4dC5nZXRBdHRyaWJ1dGUobmFtZSk7Ci0KLSAgICAgICAgICAgIGlmIChfcHJvcGVydHlTb3VyY2UgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfcHJvcGVydHlTb3VyY2UgPSBjcmVhdGVQcm9wZXJ0eVNvdXJjZShjb250ZXh0KTsKLQotICAgICAgICAgICAgICAgIHNlcnZsZXRDb250ZXh0LnNldEF0dHJpYnV0ZShuYW1lLCBfcHJvcGVydHlTb3VyY2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKF9lbmhhbmNlciA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IEVOSEFOQ0VSX05BTUUgKyAiOiIgKyBzZXJ2bGV0TmFtZTsKLQotICAgICAgICAgICAgX2VuaGFuY2VyID0gKElDb21wb25lbnRDbGFzc0VuaGFuY2VyKSBzZXJ2bGV0Q29udGV4dC5nZXRBdHRyaWJ1dGUobmFtZSk7Ci0KLSAgICAgICAgICAgIGlmIChfZW5oYW5jZXIgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfZW5oYW5jZXIgPSBjcmVhdGVDb21wb25lbnRDbGFzc0VuaGFuY2VyKGNvbnRleHQpOwotCi0gICAgICAgICAgICAgICAgc2VydmxldENvbnRleHQuc2V0QXR0cmlidXRlKG5hbWUsIF9lbmhhbmNlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoX3Bvb2wgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBQT09MX05BTUUgKyAiOiIgKyBzZXJ2bGV0TmFtZTsKLQotICAgICAgICAgICAgX3Bvb2wgPSAoUG9vbCkgc2VydmxldENvbnRleHQuZ2V0QXR0cmlidXRlKG5hbWUpOwotCi0gICAgICAgICAgICBpZiAoX3Bvb2wgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfcG9vbCA9IGNyZWF0ZVBvb2woY29udGV4dCk7Ci0KLSAgICAgICAgICAgICAgICBzZXJ2bGV0Q29udGV4dC5zZXRBdHRyaWJ1dGUobmFtZSwgX3Bvb2wpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKF90ZW1wbGF0ZVNvdXJjZSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IFRFTVBMQVRFX1NPVVJDRV9OQU1FICsgIjoiICsgc2VydmxldE5hbWU7Ci0KLSAgICAgICAgICAgIF90ZW1wbGF0ZVNvdXJjZSA9IChJVGVtcGxhdGVTb3VyY2UpIHNlcnZsZXRDb250ZXh0LmdldEF0dHJpYnV0ZShuYW1lKTsKLQotICAgICAgICAgICAgaWYgKF90ZW1wbGF0ZVNvdXJjZSA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF90ZW1wbGF0ZVNvdXJjZSA9IGNyZWF0ZVRlbXBsYXRlU291cmNlKGNvbnRleHQpOwotCi0gICAgICAgICAgICAgICAgc2VydmxldENvbnRleHQuc2V0QXR0cmlidXRlKG5hbWUsIF90ZW1wbGF0ZVNvdXJjZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoX3NwZWNpZmljYXRpb25Tb3VyY2UgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBTUEVDSUZJQ0FUSU9OX1NPVVJDRV9OQU1FICsgIjoiICsgc2VydmxldE5hbWU7Ci0KLSAgICAgICAgICAgIF9zcGVjaWZpY2F0aW9uU291cmNlID0gKElTcGVjaWZpY2F0aW9uU291cmNlKSBzZXJ2bGV0Q29udGV4dC5nZXRBdHRyaWJ1dGUobmFtZSk7Ci0KLSAgICAgICAgICAgIGlmIChfc3BlY2lmaWNhdGlvblNvdXJjZSA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9zcGVjaWZpY2F0aW9uU291cmNlID0gY3JlYXRlU3BlY2lmaWNhdGlvblNvdXJjZShjb250ZXh0KTsKLQotICAgICAgICAgICAgICAgIHNlcnZsZXRDb250ZXh0LnNldEF0dHJpYnV0ZShuYW1lLCBfc3BlY2lmaWNhdGlvblNvdXJjZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoX3BhZ2VTb3VyY2UgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBQQUdFX1NPVVJDRV9OQU1FICsgIjoiICsgc2VydmxldE5hbWU7Ci0KLSAgICAgICAgICAgIF9wYWdlU291cmNlID0gKElQYWdlU291cmNlKSBzZXJ2bGV0Q29udGV4dC5nZXRBdHRyaWJ1dGUobmFtZSk7Ci0KLSAgICAgICAgICAgIGlmIChfcGFnZVNvdXJjZSA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9wYWdlU291cmNlID0gY3JlYXRlUGFnZVNvdXJjZShjb250ZXh0KTsKLQotICAgICAgICAgICAgICAgIHNlcnZsZXRDb250ZXh0LnNldEF0dHJpYnV0ZShuYW1lLCBfcGFnZVNvdXJjZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoX3NjcmlwdFNvdXJjZSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IFNDUklQVF9TT1VSQ0VfTkFNRSArICI6IiArIHNlcnZsZXROYW1lOwotCi0gICAgICAgICAgICBfc2NyaXB0U291cmNlID0gKElTY3JpcHRTb3VyY2UpIHNlcnZsZXRDb250ZXh0LmdldEF0dHJpYnV0ZShuYW1lKTsKLQotICAgICAgICAgICAgaWYgKF9zY3JpcHRTb3VyY2UgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfc2NyaXB0U291cmNlID0gY3JlYXRlU2NyaXB0U291cmNlKGNvbnRleHQpOwotCi0gICAgICAgICAgICAgICAgc2VydmxldENvbnRleHQuc2V0QXR0cmlidXRlKG5hbWUsIF9zY3JpcHRTb3VyY2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKF9zZXJ2aWNlTWFwID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gU0VSVklDRV9NQVBfTkFNRSArICI6IiArIHNlcnZsZXROYW1lOwotCi0gICAgICAgICAgICBfc2VydmljZU1hcCA9IChNYXApIHNlcnZsZXRDb250ZXh0LmdldEF0dHJpYnV0ZShuYW1lKTsKLQotICAgICAgICAgICAgaWYgKF9zZXJ2aWNlTWFwID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX3NlcnZpY2VNYXAgPSBjcmVhdGVTZXJ2aWNlTWFwKCk7Ci0KLSAgICAgICAgICAgICAgICBzZXJ2bGV0Q29udGV4dC5zZXRBdHRyaWJ1dGUobmFtZSwgX3NlcnZpY2VNYXApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKF9zdHJpbmdzU291cmNlID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gU1RSSU5HU19TT1VSQ0VfTkFNRSArICI6IiArIHNlcnZsZXROYW1lOwotCi0gICAgICAgICAgICBfc3RyaW5nc1NvdXJjZSA9IChJQ29tcG9uZW50TWVzc2FnZXNTb3VyY2UpIHNlcnZsZXRDb250ZXh0LmdldEF0dHJpYnV0ZShuYW1lKTsKLQotICAgICAgICAgICAgaWYgKF9zdHJpbmdzU291cmNlID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX3N0cmluZ3NTb3VyY2UgPSBjcmVhdGVDb21wb25lbnRTdHJpbmdzU291cmNlKGNvbnRleHQpOwotCi0gICAgICAgICAgICAgICAgc2VydmxldENvbnRleHQuc2V0QXR0cmlidXRlKG5hbWUsIF9zdHJpbmdzU291cmNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChfZGF0YVNxdWVlemVyID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gREFUQV9TUVVFRVpFUl9OQU1FICsgIjoiICsgc2VydmxldE5hbWU7Ci0KLSAgICAgICAgICAgIF9kYXRhU3F1ZWV6ZXIgPSAoRGF0YVNxdWVlemVyKSBzZXJ2bGV0Q29udGV4dC5nZXRBdHRyaWJ1dGUobmFtZSk7Ci0KLSAgICAgICAgICAgIGlmIChfZGF0YVNxdWVlemVyID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX2RhdGFTcXVlZXplciA9IGNyZWF0ZURhdGFTcXVlZXplcigpOwotCi0gICAgICAgICAgICAgICAgc2VydmxldENvbnRleHQuc2V0QXR0cmlidXRlKG5hbWUsIF9kYXRhU3F1ZWV6ZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKF9nbG9iYWwgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBHTE9CQUxfTkFNRSArICI6IiArIHNlcnZsZXROYW1lOwotCi0gICAgICAgICAgICBfZ2xvYmFsID0gc2VydmxldENvbnRleHQuZ2V0QXR0cmlidXRlKG5hbWUpOwotCi0gICAgICAgICAgICBpZiAoX2dsb2JhbCA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9nbG9iYWwgPSBjcmVhdGVHbG9iYWwoY29udGV4dCk7Ci0KLSAgICAgICAgICAgICAgICBzZXJ2bGV0Q29udGV4dC5zZXRBdHRyaWJ1dGUobmFtZSwgX2dsb2JhbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChfcmVzb3VyY2VDaGVja3N1bVNvdXJjZSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IFJFU09VUkNFX0NIRUNLU1VNX1NPVVJDRV9OQU1FICsgIjoiICsgc2VydmxldE5hbWU7Ci0KLSAgICAgICAgICAgIF9yZXNvdXJjZUNoZWNrc3VtU291cmNlID0gKFJlc291cmNlQ2hlY2tzdW1Tb3VyY2UpIHNlcnZsZXRDb250ZXh0LmdldEF0dHJpYnV0ZShuYW1lKTsKLQotICAgICAgICAgICAgaWYgKF9yZXNvdXJjZUNoZWNrc3VtU291cmNlID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX3Jlc291cmNlQ2hlY2tzdW1Tb3VyY2UgPSBjcmVhdGVSZXNvdXJjZUNoZWNrc3VtU291cmNlKCk7Ci0KLSAgICAgICAgICAgICAgICBzZXJ2bGV0Q29udGV4dC5zZXRBdHRyaWJ1dGUobmFtZSwgX3Jlc291cmNlQ2hlY2tzdW1Tb3VyY2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGVuY29kaW5nID0gcmVxdWVzdC5nZXRDaGFyYWN0ZXJFbmNvZGluZygpOwotICAgICAgICBpZiAoZW5jb2RpbmcgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgZW5jb2RpbmcgPSBnZXRPdXRwdXRFbmNvZGluZygpOwotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVxdWVzdC5zZXRDaGFyYWN0ZXJFbmNvZGluZyhlbmNvZGluZyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oVGFwZXN0cnkuZm9ybWF0KCJpbGxlZ2FsLWVuY29kaW5nIiwgZW5jb2RpbmcpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChOb1N1Y2hNZXRob2RFcnJvciBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIFNlcnZsZXQgQVBJIDIuMiBjb21wYXRpYmlsaXR5Ci0gICAgICAgICAgICAgICAgLy8gQmVoYXZlIG9rYXkgaWYgdGhlIHNldENoYXJhY3RlckVuY29kaW5nKCkgbWV0aG9kIGlzIHVuYXZhaWxhYmxlCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoQWJzdHJhY3RNZXRob2RFcnJvciBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIFNlcnZsZXQgQVBJIDIuMiBjb21wYXRpYmlsaXR5Ci0gICAgICAgICAgICAgICAgLy8gQmVoYXZlIG9rYXkgaWYgdGhlIHNldENoYXJhY3RlckVuY29kaW5nKCkgbWV0aG9kIGlzIHVuYXZhaWxhYmxlCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKgotICAgICAqICBJbnZva2VkIGZyb20ge0BsaW5rICNzZXR1cEZvclJlcXVlc3QoUmVxdWVzdENvbnRleHQpfSB0byBwcm92aWRlCi0gICAgICogIGEgbmV3IGluc3RhbmNlIG9mIHtAbGluayBJQ29tcG9uZW50TWVzc2FnZXNTb3VyY2V9LgotICAgICAqCi0gICAgICogIEByZXR1cm4gYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIERlZmF1bHRDb21wb25lbnRNZXNzYWdlc1NvdXJjZX0KLSAgICAgKiAgQHNpbmNlIDIuMC40Ci0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgSUNvbXBvbmVudE1lc3NhZ2VzU291cmNlIGNyZWF0ZUNvbXBvbmVudFN0cmluZ3NTb3VyY2UoUmVxdWVzdENvbnRleHQgY29udGV4dCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgRGVmYXVsdENvbXBvbmVudE1lc3NhZ2VzU291cmNlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEludm9rZWQgZnJvbSB7QGxpbmsgI3NldHVwRm9yUmVxdWVzdChSZXF1ZXN0Q29udGV4dCl9IHRvIHByb3ZpZGUKLSAgICAgKiAgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIElTY3JpcHRTb3VyY2V9IHRoYXQgd2lsbCBiZSBzdG9yZWQgaW50bwotICAgICAqICB0aGUge0BsaW5rIFNlcnZsZXRDb250ZXh0fS4gIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kCi0gICAgICogIHRvIHByb3ZpZGUgYSBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb24uCi0gICAgICoKLSAgICAgKgotICAgICAqICBAcmV0dXJuIGFuIGluc3RhbmNlIG9mIHtAbGluayBEZWZhdWx0U2NyaXB0U291cmNlfQotICAgICAqICBAc2luY2UgMS4wLjkKLSAgICAgKgotICAgICAqKi8KLQotICAgIHByb3RlY3RlZCBJU2NyaXB0U291cmNlIGNyZWF0ZVNjcmlwdFNvdXJjZShSZXF1ZXN0Q29udGV4dCBjb250ZXh0KQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBEZWZhdWx0U2NyaXB0U291cmNlKGdldFJlc291cmNlUmVzb2x2ZXIoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEludm9rZWQgZnJvbSB7QGxpbmsgI3NldHVwRm9yUmVxdWVzdChSZXF1ZXN0Q29udGV4dCl9IHRvIHByb3ZpZGUKLSAgICAgKiAgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIElQYWdlU291cmNlfSB0aGF0IHdpbGwgYmUgc3RvcmVkIGludG8KLSAgICAgKiAgdGhlIHtAbGluayBTZXJ2bGV0Q29udGV4dH0uICBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZAotICAgICAqICB0byBwcm92aWRlIGEgZGlmZmVyZW50IGltcGxlbWVudGF0aW9uLgotICAgICAqCi0gICAgICogIEByZXR1cm4gYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIFBhZ2VTb3VyY2V9Ci0gICAgICogIEBzaW5jZSAxLjAuOQotICAgICAqCi0gICAgICoqLwotCi0gICAgcHJvdGVjdGVkIElQYWdlU291cmNlIGNyZWF0ZVBhZ2VTb3VyY2UoUmVxdWVzdENvbnRleHQgY29udGV4dCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgUGFnZVNvdXJjZSh0aGlzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgSW52b2tlZCBmcm9tIHtAbGluayAjc2V0dXBGb3JSZXF1ZXN0KFJlcXVlc3RDb250ZXh0KX0gdG8gcHJvdmlkZQotICAgICAqICBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgSVNwZWNpZmljYXRpb25Tb3VyY2V9IHRoYXQgd2lsbCBiZSBzdG9yZWQgaW50bwotICAgICAqICB0aGUge0BsaW5rIFNlcnZsZXRDb250ZXh0fS4gIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kCi0gICAgICogIHRvIHByb3ZpZGUgYSBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb24uCi0gICAgICoKLSAgICAgKiAgQHJldHVybiBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgRGVmYXVsdFNwZWNpZmljYXRpb25Tb3VyY2V9Ci0gICAgICogIEBzaW5jZSAxLjAuOQotICAgICAqKi8KLQotICAgIHByb3RlY3RlZCBJU3BlY2lmaWNhdGlvblNvdXJjZSBjcmVhdGVTcGVjaWZpY2F0aW9uU291cmNlKFJlcXVlc3RDb250ZXh0IGNvbnRleHQpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IERlZmF1bHRTcGVjaWZpY2F0aW9uU291cmNlKGdldFJlc291cmNlUmVzb2x2ZXIoKSwgX3NwZWNpZmljYXRpb24sIF9wb29sKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgSW52b2tlZCBmcm9tIHtAbGluayAjc2V0dXBGb3JSZXF1ZXN0KFJlcXVlc3RDb250ZXh0KX0gdG8gcHJvdmlkZQotICAgICAqICBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgSVRlbXBsYXRlU291cmNlfSB0aGF0IHdpbGwgYmUgc3RvcmVkIGludG8KLSAgICAgKiAgdGhlIHtAbGluayBTZXJ2bGV0Q29udGV4dH0uICBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZAotICAgICAqICB0byBwcm92aWRlIGEgZGlmZmVyZW50IGltcGxlbWVudGF0aW9uLgotICAgICAqCi0gICAgICogIEByZXR1cm4gYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIERlZmF1bHRUZW1wbGF0ZVNvdXJjZX0KLSAgICAgKiAgQHNpbmNlIDEuMC45Ci0gICAgICoKLSAgICAgKiovCi0KLSAgICBwcm90ZWN0ZWQgSVRlbXBsYXRlU291cmNlIGNyZWF0ZVRlbXBsYXRlU291cmNlKFJlcXVlc3RDb250ZXh0IGNvbnRleHQpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IERlZmF1bHRUZW1wbGF0ZVNvdXJjZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEludm9rZWQgZnJvbSB7QGxpbmsgI3NldHVwRm9yUmVxdWVzdChSZXF1ZXN0Q29udGV4dCl9IHRvIHByb3ZpZGUKLSAgICAgKiBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgUmVzb3VyY2VDaGVja3N1bVNvdXJjZX0gdGhhdCB3aWxsIGJlIHN0b3JlZCBpbnRvCi0gICAgICogdGhlIHtAbGluayBTZXJ2bGV0Q29udGV4dH0uICBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZAotICAgICAqIHRvIHByb3ZpZGUgYSBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb24uCi0gICAgICogQHJldHVybiBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgUmVzb3VyY2VDaGVja3N1bVNvdXJjZUltcGx9IHRoYXQgdXNlcyBNRDUgYW5kIEhleCBlbmNvZGluZy4KLSAgICAgKiBAc2luY2UgMy4wLjMKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgUmVzb3VyY2VDaGVja3N1bVNvdXJjZSBjcmVhdGVSZXNvdXJjZUNoZWNrc3VtU291cmNlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDaGVja3N1bVNvdXJjZUltcGwoIk1ENSIsIG5ldyBIZXgoKSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqICBSZXR1cm5zIGFuIG9iamVjdCB3aGljaCBjYW4gZmluZCByZXNvdXJjZXMgYW5kIGNsYXNzZXMuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgSVJlc291cmNlUmVzb2x2ZXIgZ2V0UmVzb3VyY2VSZXNvbHZlcigpCi0gICAgewotICAgICAgICByZXR1cm4gX3Jlc29sdmVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBHZW5lcmF0ZXMgYSBkZXNjcmlwdGlvbiBvZiB0aGUgaW5zdGFuY2UuCi0gICAgICogIEludm9rZXMge0BsaW5rICNleHRlbmREZXNjcmlwdGlvbihUb1N0cmluZ0J1aWxkZXIpfQotICAgICAqICB0byBmaWxsIGluIGRldGFpbHMgYWJvdXQgdGhlIGluc3RhbmNlLgotICAgICAqCi0gICAgICogIEBzZWUgI2V4dGVuZERlc2NyaXB0aW9uKFRvU3RyaW5nQnVpbGRlcikKLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICAgIHsKLSAgICAgICAgVG9TdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgVG9TdHJpbmdCdWlsZGVyKHRoaXMpOwotCi0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKAotICAgICAgICAgICAgIm5hbWUiLAotICAgICAgICAgICAgX3NwZWNpZmljYXRpb24gPT0gbnVsbAotICAgICAgICAgICAgICAgID8gVGFwZXN0cnkuZ2V0TWVzc2FnZSgiQWJzdHJhY3RFbmdpbmUudW5rbm93bi1zcGVjaWZpY2F0aW9uIikKLSAgICAgICAgICAgICAgICA6IF9zcGVjaWZpY2F0aW9uLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgYnVpbGRlci5hcHBlbmQoImRpcnR5IiwgX2RpcnR5KTsKLSAgICAgICAgYnVpbGRlci5hcHBlbmQoImxvY2FsZSIsIF9sb2NhbGUpOwotICAgICAgICBidWlsZGVyLmFwcGVuZCgic3RhdGVmdWwiLCBfc3RhdGVmdWwpOwotICAgICAgICBidWlsZGVyLmFwcGVuZCgidmlzaXQiLCBfdmlzaXQpOwotCi0gICAgICAgIGV4dGVuZERlc2NyaXB0aW9uKGJ1aWxkZXIpOwotCi0gICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgdHJ1ZSBpZiB0aGUgcmVzZXQgc2VydmljZSBpcyBjdXJlbnRseSBlbmFibGVkLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIGJvb2xlYW4gaXNSZXNldFNlcnZpY2VFbmFibGVkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfcmVzZXRTZXJ2aWNlRW5hYmxlZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgSW1wbGVtZW50ZWQgYnkgc3ViY2xhc3NlcyB0byByZXR1cm4gdGhlIG5hbWVzIG9mIHRoZSBhY3RpdmUgcGFnZXMKLSAgICAgKiAgKHBhZ2VzIGZvciB3aGljaCByZWNvcmRlcnMgZXhpc3QpLiAgTWF5IHJldHVybiB0aGUgZW1wdHkgbGlzdCwKLSAgICAgKiAgYnV0IHNob3VsZCBub3QgcmV0dXJuIG51bGwuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBhYnN0cmFjdCBwdWJsaWMgQ29sbGVjdGlvbiBnZXRBY3RpdmVQYWdlTmFtZXMoKTsKLQotICAgIC8qKgotICAgICAqICBHZXRzIHRoZSB2aXNpdCBvYmplY3QsIGlmIGl0IGhhcyBiZWVuIGNyZWF0ZWQgYWxyZWFkeS4KLSAgICAgKgotICAgICAqICA8cD4KLSAgICAgKiAgSWYgdGhlIHZpc2l0IGlzIG5vbi1udWxsIHRoZW4KLSAgICAgKiAgdGhlIHtAbGluayAjaXNEaXJ0eSgpfSBmbGFnIGlzIHNldCAoYmVjYXVzZQotICAgICAqICB0aGUgZW5naW5lIGNhbid0IHRlbGwgd2hhdCB0aGUgY2FsbGVyIHdpbGwKLSAgICAgKiAgPGk+ZG88L2k+IHdpdGggdGhlIHZpc2l0KS4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0VmlzaXQoKQotICAgIHsKLSAgICAgICAgaWYgKF92aXNpdCAhPSBudWxsKQotICAgICAgICAgICAgbWFya0RpcnR5KCk7Ci0KLSAgICAgICAgcmV0dXJuIF92aXNpdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgR2V0cyB0aGUgdmlzaXQgb2JqZWN0LCBpbnZva2luZyB7QGxpbmsgI2NyZWF0ZVZpc2l0KElSZXF1ZXN0Q3ljbGUpfSB0byBjcmVhdGUKLSAgICAgKiAgaXQgbGF6aWx5IGlmIG5lZWRlZC4gIElmIGN5Y2xlIGlzIG51bGwsIHRoZSB2aXNpdCB3aWxsIG5vdCBiZSBsYXppbHkgY3JlYXRlZC4KLSAgICAgKgotICAgICAqICA8cD4KLSAgICAgKiAgQWZ0ZXIgY3JlYXRpbmcgdGhlIHZpc2l0LCBidXQgYmVmb3JlIHJldHVybmluZywKLSAgICAgKiAgdGhlIHtAbGluayBIdHRwU2Vzc2lvbn0gd2lsbCBiZSBjcmVhdGVkLCBhbmQKLSAgICAgKiAge0BsaW5rICNzZXRTdGF0ZWZ1bCgpfSB3aWxsIGJlIGludm9rZWQuCi0gICAgICoKLSAgICAgKiAgPHA+Ci0gICAgICogIFNldHMgdGhlIHtAbGluayAjaXNEaXJ0eSgpfSBmbGFnLCBpZiB0aGUgcmV0dXJuIHZhbHVlCi0gICAgICogIGlzIG5vdCBudWxsLgotICAgICAqCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFZpc2l0KElSZXF1ZXN0Q3ljbGUgY3ljbGUpCi0gICAgewotICAgICAgICBpZiAoX3Zpc2l0ID09IG51bGwgJiYgY3ljbGUgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgX3Zpc2l0ID0gY3JlYXRlVmlzaXQoY3ljbGUpOwotCi0gICAgICAgICAgICAvLyBOb3cgdGhhdCBhIHZpc2l0IG9iamVjdCBleGlzdHMsIHdlIG5lZWQgdG8gZm9yY2UgdGhlIGNyZWF0aW9uCi0gICAgICAgICAgICAvLyBvZiBhIEh0dHBTZXNzaW9uLgotCi0gICAgICAgICAgICBjeWNsZS5nZXRSZXF1ZXN0Q29udGV4dCgpLmNyZWF0ZVNlc3Npb24oKTsKLQotICAgICAgICAgICAgc2V0U3RhdGVmdWwoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChfdmlzaXQgIT0gbnVsbCkKLSAgICAgICAgICAgIG1hcmtEaXJ0eSgpOwotCi0gICAgICAgIHJldHVybiBfdmlzaXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFVwZGF0ZXMgdGhlIHZpc2l0IG9iamVjdCBhbmQKLSAgICAgKiAgc2V0cyB0aGUge0BsaW5rICNpc0RpcnR5KCkgZGlydHkgZmxhZ30uCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCBzZXRWaXNpdChPYmplY3QgdmFsdWUpCi0gICAgewotICAgICAgICBfdmlzaXQgPSB2YWx1ZTsKLQotICAgICAgICBtYXJrRGlydHkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRIYXNWaXNpdCgpCi0gICAgewotICAgICAgICByZXR1cm4gX3Zpc2l0ICE9IG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEludm9rZWQgdG8gbGF6aWx5IGNyZWF0ZSBhIG5ldyB2aXNpdCBvYmplY3Qgd2hlbiBpdCBpcyBmaXJzdAotICAgICAqICByZWZlcmVuY2VkIChieSB7QGxpbmsgI2dldFZpc2l0KElSZXF1ZXN0Q3ljbGUpfSkuICBUaGlzIGltcGxlbWVudGF0aW9uIHdvcmtzCi0gICAgICogIGJ5IGxvb2tpbmcgdXAgdGhlIG5hbWUgb2YgdGhlIGNsYXNzIHRvIGluc3RhbnRpYXRlCi0gICAgICogIGluIHRoZSB7QGxpbmsgI2dldFByb3BlcnR5U291cmNlKCkgY29uZmlndXJhdGlvbn0uCi0gICAgICoKLSAgICAgKiAgPHA+U3ViY2xhc3NlcyBtYXkgd2FudCB0byBvdmVyaWRlIHRoaXMgbWV0aG9kIGlmIHNvbWUgb3RoZXIgbWVhbnMKLSAgICAgKiAgb2YgaW5zdGFudGlhdGluZyBhIHZpc2l0IG9iamVjdCBpcyByZXF1aXJlZC4KLSAgICAgKiovCi0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZVZpc2l0KElSZXF1ZXN0Q3ljbGUgY3ljbGUpCi0gICAgewotICAgICAgICBTdHJpbmcgdmlzaXRDbGFzc05hbWU7Ci0gICAgICAgIENsYXNzIHZpc2l0Q2xhc3M7Ci0gICAgICAgIE9iamVjdCByZXN1bHQgPSBudWxsOwotCi0gICAgICAgIHZpc2l0Q2xhc3NOYW1lID0gX3Byb3BlcnR5U291cmNlLmdldFByb3BlcnR5VmFsdWUoVklTSVRfQ0xBU1NfUFJPUEVSVFlfTkFNRSk7Ci0KLSAgICAgICAgaWYgKExPRy5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICAgICAgTE9HLmRlYnVnKCJDcmVhdGluZyB2aXNpdCBvYmplY3QgYXMgaW5zdGFuY2Ugb2YgIiArIHZpc2l0Q2xhc3NOYW1lKTsKLQotICAgICAgICB2aXNpdENsYXNzID0gX3Jlc29sdmVyLmZpbmRDbGFzcyh2aXNpdENsYXNzTmFtZSk7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IHZpc2l0Q2xhc3MubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgVGFwZXN0cnkuZm9ybWF0KCJBYnN0cmFjdEVuZ2luZS51bmFibGUtdG8taW5zdGFudGlhdGUtdmlzaXQiLCB2aXNpdENsYXNzTmFtZSksCi0gICAgICAgICAgICAgICAgdCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIHRoZSBnbG9iYWwgb2JqZWN0IGZvciB0aGUgYXBwbGljYXRpb24uICBUaGUgZ2xvYmFsIG9iamVjdCBpcyBjcmVhdGVkIGF0IHRoZSBzdGFydAotICAgICAqICBvZiB0aGUgcmVxdWVzdCAoe0BsaW5rICNzZXR1cEZvclJlcXVlc3QoUmVxdWVzdENvbnRleHQpfSBpbnZva2VzCi0gICAgICogIHtAbGluayAjY3JlYXRlR2xvYmFsKFJlcXVlc3RDb250ZXh0KX0gaWYgbmVlZGVkKSwKLSAgICAgKiAgYW5kIGlzIHN0b3JlZCBpbnRvIHRoZSB7QGxpbmsgU2VydmxldENvbnRleHR9LiAgQWxsIGluc3RhbmNlcyBvZiB0aGUgZW5naW5lIGZvcgotICAgICAqICB0aGUgYXBwbGljYXRpb24gc2hhcmUKLSAgICAgKiAgdGhlIGdsb2JhbCBvYmplY3Q7IGhvd2V2ZXIsIHRoZSBnbG9iYWwgb2JqZWN0IGlzIGV4cGxpY2l0bHkgPGVtPm5vdDwvZW0+Ci0gICAgICogIHJlcGxpY2F0ZWQgdG8gb3RoZXIgc2VydmVycyB3aXRoaW4KLSAgICAgKiAgYSBjbHVzdGVyLgotICAgICAqCi0gICAgICogIEBzaW5jZSAyLjMKLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0R2xvYmFsKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfZ2xvYmFsOwotICAgIH0KLQotICAgIHB1YmxpYyBJU2NyaXB0U291cmNlIGdldFNjcmlwdFNvdXJjZSgpCi0gICAgewotICAgICAgICByZXR1cm4gX3NjcmlwdFNvdXJjZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1N0YXRlZnVsKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfc3RhdGVmdWw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEludm9rZWQgYnkgc3ViY2xhc3NlcyB0byBpbmRpY2F0ZSB0aGF0IHNvbWUgc3RhdGUgbXVzdCBub3cgYmUgc3RvcmVkCi0gICAgICogIGluIHRoZSBlbmdpbmUgKGFuZCB0aGF0IHRoZSBlbmdpbmUgc2hvdWxkIG5vdyBiZSBzdG9yZWQgaW4gdGhlCi0gICAgICogIEh0dHBTZXNzaW9uKS4gIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGFjdHVhbGx5IGNyZWF0aW5nCi0gICAgICogIHRoZSBIdHRwU2Vzc2lvbiAoaXQgd2lsbCBoYXZlIGFjY2VzcyB0byB0aGUge0BsaW5rIFJlcXVlc3RDb250ZXh0fSkuCi0gICAgICoKLSAgICAgKiAgQHNpbmNlIDEuMC4yCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRTdGF0ZWZ1bCgpCi0gICAgewotICAgICAgICBfc3RhdGVmdWwgPSB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBBbGxvd3Mgc3ViY2xhc3NlcyB0byBpbmNsdWRlIGxpc3RlbmVyIG1ldGhvZHMgZWFzaWx5LgotICAgICAqCi0gICAgICogQHNpbmNlIDEuMC4yCi0gICAgICoqLwotCi0gICAgcHVibGljIExpc3RlbmVyTWFwIGdldExpc3RlbmVycygpCi0gICAgewotICAgICAgICBpZiAoX2xpc3RlbmVycyA9PSBudWxsKQotICAgICAgICAgICAgX2xpc3RlbmVycyA9IG5ldyBMaXN0ZW5lck1hcCh0aGlzKTsKLQotICAgICAgICByZXR1cm4gX2xpc3RlbmVyczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBSZWRpcmVjdEFuYWx5emVyCi0gICAgewotICAgICAgICBwcml2YXRlIGJvb2xlYW4gX2ludGVybmFsOwotICAgICAgICBwcml2YXRlIFN0cmluZyBfbG9jYXRpb247Ci0KLSAgICAgICAgcHJpdmF0ZSBSZWRpcmVjdEFuYWx5emVyKFN0cmluZyBsb2NhdGlvbikKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKFRhcGVzdHJ5LmlzQmxhbmsobG9jYXRpb24pKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9sb2NhdGlvbiA9ICIiOwotICAgICAgICAgICAgICAgIF9pbnRlcm5hbCA9IHRydWU7Ci0KLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIF9sb2NhdGlvbiA9IGxvY2F0aW9uOwotCi0gICAgICAgICAgICBfaW50ZXJuYWwgPSAhKGxvY2F0aW9uLnN0YXJ0c1dpdGgoIi8iKSB8fCBsb2NhdGlvbi5pbmRleE9mKCI6Ly8iKSA+IDApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcHJvY2VzcyhJUmVxdWVzdEN5Y2xlIGN5Y2xlKQotICAgICAgICB7Ci0gICAgICAgICAgICBSZXF1ZXN0Q29udGV4dCBjb250ZXh0ID0gY3ljbGUuZ2V0UmVxdWVzdENvbnRleHQoKTsKLQotICAgICAgICAgICAgaWYgKF9pbnRlcm5hbCkKLSAgICAgICAgICAgICAgICBmb3J3YXJkKGNvbnRleHQpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHJlZGlyZWN0KGNvbnRleHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGZvcndhcmQoUmVxdWVzdENvbnRleHQgY29udGV4dCkKLSAgICAgICAgewotICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QgPSBjb250ZXh0LmdldFJlcXVlc3QoKTsKLSAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UgPSBjb250ZXh0LmdldFJlc3BvbnNlKCk7Ci0KLSAgICAgICAgICAgIFJlcXVlc3REaXNwYXRjaGVyIGRpc3BhdGNoZXIgPSByZXF1ZXN0LmdldFJlcXVlc3REaXNwYXRjaGVyKCIvIiArIF9sb2NhdGlvbik7Ci0KLSAgICAgICAgICAgIGlmIChkaXNwYXRjaGVyID09IG51bGwpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgVGFwZXN0cnkuZm9ybWF0KCJBYnN0cmFjdEVuZ2luZS51bmFibGUtdG8tZmluZC1kaXNwYXRjaGVyIiwgX2xvY2F0aW9uKSk7Ci0KLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGRpc3BhdGNoZXIuZm9yd2FyZChyZXF1ZXN0LCByZXNwb25zZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoU2VydmxldEV4Y2VwdGlvbiBleCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICBUYXBlc3RyeS5mb3JtYXQoIkFic3RyYWN0RW5naW5lLnVuYWJsZS10by1mb3J3YXJkIiwgX2xvY2F0aW9uKSwKLSAgICAgICAgICAgICAgICAgICAgZXgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGV4KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIFRhcGVzdHJ5LmZvcm1hdCgiQWJzdHJhY3RFbmdpbmUudW5hYmxlLXRvLWZvcndhcmQiLCBfbG9jYXRpb24pLAotICAgICAgICAgICAgICAgICAgICBleCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgcmVkaXJlY3QoUmVxdWVzdENvbnRleHQgY29udGV4dCkKLSAgICAgICAgewotICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSA9IGNvbnRleHQuZ2V0UmVzcG9uc2UoKTsKLQotICAgICAgICAgICAgU3RyaW5nIGZpbmFsVVJMID0gcmVzcG9uc2UuZW5jb2RlUmVkaXJlY3RVUkwoX2xvY2F0aW9uKTsKLQotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZFJlZGlyZWN0KGZpbmFsVVJMKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBleCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICBUYXBlc3RyeS5mb3JtYXQoIkFic3RyYWN0RW5naW5lLnVuYWJsZS10by1yZWRpcmVjdCIsIF9sb2NhdGlvbiksCi0gICAgICAgICAgICAgICAgICAgIGV4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEludm9rZWQgd2hlbiBhIHtAbGluayBSZWRpcmVjdEV4Y2VwdGlvbn0gaXMgdGhyb3duIGR1cmluZyB0aGUgcHJvY2Vzc2luZyBvZiBhIHJlcXVlc3QuCi0gICAgICoKLSAgICAgKiAgQHRocm93cyBBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24gaWYgYW4ge0BsaW5rIElPRXhjZXB0aW9ufSwKLSAgICAgKiAge0BsaW5rIFNlcnZsZXRFeGNlcHRpb259IGlzIHRocm93biBieSB0aGUgcmVkaXJlY3QsIG9yIGlmIG5vCi0gICAgICogIHtAbGluayBSZXF1ZXN0RGlzcGF0Y2hlcn0gY2FuIGJlIGZvdW5kIGZvciBsb2NhbCByZXNvdXJjZS4KLSAgICAgKgotICAgICAqICBAc2luY2UgMi4yCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVSZWRpcmVjdEV4Y2VwdGlvbihJUmVxdWVzdEN5Y2xlIGN5Y2xlLCBSZWRpcmVjdEV4Y2VwdGlvbiBleCkKLSAgICB7Ci0gICAgICAgIFN0cmluZyBsb2NhdGlvbiA9IGV4LmdldFJlZGlyZWN0TG9jYXRpb24oKTsKLQotICAgICAgICBpZiAoTE9HLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgICAgICBMT0cuZGVidWcoIlJlZGlyZWN0aW5nIHRvOiAiICsgbG9jYXRpb24pOwotCi0gICAgICAgIFJlZGlyZWN0QW5hbHl6ZXIgYW5hbHl6ZXIgPSBuZXcgUmVkaXJlY3RBbmFseXplcihsb2NhdGlvbik7Ci0KLSAgICAgICAgYW5hbHl6ZXIucHJvY2VzcyhjeWNsZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIENyZWF0ZXMgYSBNYXAgb2YgYWxsIHRoZSBzZXJ2aWNlcyBhdmFpbGFibGUgdG8gdGhlIGFwcGxpY2F0aW9uLgotICAgICAqCi0gICAgICogIDxwPk5vdGU6IHRoZSBNYXAgcmV0dXJuZWQgaXMgbm90IHN5bmNocm9uaXplZCwgb24gdGhlIHRoZW9yeSB0aGF0IHJldHVybmVkCi0gICAgICogIG1hcCBpcyBub3QgZnVydGhlciBtb2RpZmllZCBhbmQgdGhlcmVmb3JlIHRocmVhZHNhZmUuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwcml2YXRlIE1hcCBjcmVhdGVTZXJ2aWNlTWFwKCkKLSAgICB7Ci0gICAgICAgIGlmIChMT0cuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgICAgIExPRy5kZWJ1ZygiQ3JlYXRpbmcgc2VydmljZSBtYXAuIik7Ci0KLSAgICAgICAgSVNwZWNpZmljYXRpb25Tb3VyY2Ugc291cmNlID0gZ2V0U3BlY2lmaWNhdGlvblNvdXJjZSgpOwotCi0gICAgICAgIC8vIEJ1aWxkIHRoZSBpbml0aWFsIHZlcnNpb24gb2YgdGhlIHJlc3VsdCBtYXAsCi0gICAgICAgIC8vIHdoZXJlIGVhY2ggdmFsdWUgaXMgdGhlICpuYW1lKiBvZiBhIGNsYXNzLgotCi0gICAgICAgIE1hcCByZXN1bHQgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgICAgIC8vIERvIHRoZSBmcmFtZXdvcmsgZmlyc3QuCi0KLSAgICAgICAgYWRkU2VydmljZXMoc291cmNlLmdldEZyYW1ld29ya05hbWVzcGFjZSgpLCByZXN1bHQpOwotCi0gICAgICAgIC8vIEFuZCBhbGxvdyB0aGUgYXBwbGljYXRpb24gdG8gb3ZlcnJpZGUgdGhlIGZyYW1ld29yay4KLQotICAgICAgICBhZGRTZXJ2aWNlcyhzb3VyY2UuZ2V0QXBwbGljYXRpb25OYW1lc3BhY2UoKSwgcmVzdWx0KTsKLQotICAgICAgICBJUmVzb3VyY2VSZXNvbHZlciByZXNvbHZlciA9IGdldFJlc291cmNlUmVzb2x2ZXIoKTsKLQotICAgICAgICBJdGVyYXRvciBpID0gcmVzdWx0LmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLQotICAgICAgICB3aGlsZSAoaS5oYXNOZXh0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGkubmV4dCgpOwotCi0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpIGVudHJ5LmdldEtleSgpOwotICAgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IChTdHJpbmcpIGVudHJ5LmdldFZhbHVlKCk7Ci0KLSAgICAgICAgICAgIGlmIChMT0cuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICBMT0cuZGVidWcoIkNyZWF0aW5nIHNlcnZpY2UgIiArIG5hbWUgKyAiIGFzIGluc3RhbmNlIG9mICIgKyBjbGFzc05hbWUpOwotCi0gICAgICAgICAgICBDbGFzcyBzZXJ2aWNlQ2xhc3MgPSByZXNvbHZlci5maW5kQ2xhc3MoY2xhc3NOYW1lKTsKLQotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgSUVuZ2luZVNlcnZpY2Ugc2VydmljZSA9IChJRW5naW5lU2VydmljZSkgc2VydmljZUNsYXNzLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHNlcnZpY2VOYW1lID0gc2VydmljZS5nZXROYW1lKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoIXNlcnZpY2UuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgIFRhcGVzdHJ5LmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWJzdHJhY3RFbmdpbmUuc2VydmljZS1uYW1lLW1pc21hdGNoIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlTmFtZSkpOwotCi0gICAgICAgICAgICAgICAgLy8gUmVwbGFjZSB0aGUgY2xhc3MgbmFtZSB3aXRoIGFuIGluc3RhbmNlCi0gICAgICAgICAgICAgICAgLy8gb2YgdGhlIG5hbWVkIGNsYXNzLgotCi0gICAgICAgICAgICAgICAgZW50cnkuc2V0VmFsdWUoc2VydmljZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBleCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9Ci0gICAgICAgICAgICAgICAgICAgIFRhcGVzdHJ5LmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJBYnN0cmFjdEVuZ2luZS51bmFibGUtdG8taW5zdGFudGlhdGUtc2VydmljZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lKTsKLQotICAgICAgICAgICAgICAgIExPRy5lcnJvcihtZXNzYWdlLCBleCk7Ci0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uKG1lc3NhZ2UsIGV4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGV4KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0KLSAgICAgICAgICAgICAgICAgICAgVGFwZXN0cnkuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAgICAgIkFic3RyYWN0RW5naW5lLnVuYWJsZS10by1pbnN0YW50aWF0ZS1zZXJ2aWNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUpOwotCi0gICAgICAgICAgICAgICAgTE9HLmVycm9yKG1lc3NhZ2UsIGV4KTsKLQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24obWVzc2FnZSwgZXgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUmVzdWx0IHNob3VsZCBub3QgYmUgbW9kaWZpZWQgYWZ0ZXIgdGhpcyBwb2ludCwgZm9yIHRocmVhZHNhZmV0eSBpc3N1ZXMuCi0gICAgICAgIC8vIFdlIGNvdWxkIHdyYXAgaXQgaW4gYW4gdW5tb2RpZmlhYmxlLCBidXQgZm9yIGVmZmljaWVuY3kgd2UgZG9uJ3QuCi0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgTG9jYXRlcyBhbGwgc2VydmljZXMgaW4gdGhlIG5hbWVzcGFjZSBhbmQgYWRkcyBrZXkvdmFsdWUKLSAgICAgKiAgcGFpcnMgdG8gdGhlIG1hcCAobmFtZSBhbmQgY2xhc3MgbmFtZSkuICBUaGVuIHJlY3Vyc2l2ZWx5Ci0gICAgICogIGRlc2NlbmRlbmRzIGludG8gY2hpbGQgbmFtZXNwYWNlcyB0byBjb2xsZWN0IG1vcmUKLSAgICAgKiAgc2VydmljZSBuYW1lcy4KLSAgICAgKgotICAgICAqICBAc2luY2UgMi4yCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwcml2YXRlIHZvaWQgYWRkU2VydmljZXMoSU5hbWVzcGFjZSBuYW1lc3BhY2UsIE1hcCBtYXApCi0gICAgewotICAgICAgICBMaXN0IG5hbWVzID0gbmFtZXNwYWNlLmdldFNlcnZpY2VOYW1lcygpOwotICAgICAgICBpbnQgY291bnQgPSBuYW1lcy5zaXplKCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpIG5hbWVzLmdldChpKTsKLQotICAgICAgICAgICAgbWFwLnB1dChuYW1lLCBuYW1lc3BhY2UuZ2V0U2VydmljZUNsYXNzTmFtZShuYW1lKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBMaXN0IG5hbWVzcGFjZUlkcyA9IG5hbWVzcGFjZS5nZXRDaGlsZElkcygpOwotICAgICAgICBjb3VudCA9IG5hbWVzcGFjZUlkcy5zaXplKCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgaWQgPSAoU3RyaW5nKSBuYW1lc3BhY2VJZHMuZ2V0KGkpOwotCi0gICAgICAgICAgICBhZGRTZXJ2aWNlcyhuYW1lc3BhY2UuZ2V0Q2hpbGROYW1lc3BhY2UoaWQpLCBtYXApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEBzaW5jZSAyLjAuNAotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIElDb21wb25lbnRNZXNzYWdlc1NvdXJjZSBnZXRDb21wb25lbnRNZXNzYWdlc1NvdXJjZSgpCi0gICAgewotICAgICAgICByZXR1cm4gX3N0cmluZ3NTb3VyY2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEBzaW5jZSAyLjIKLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBEYXRhU3F1ZWV6ZXIgZ2V0RGF0YVNxdWVlemVyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfZGF0YVNxdWVlemVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqCi0gICAgICogIEludm9rZWQgZnJvbSB7QGxpbmsgI3NldHVwRm9yUmVxdWVzdChSZXF1ZXN0Q29udGV4dCl9IHRvIGNyZWF0ZQotICAgICAqICBhIHtAbGluayBEYXRhU3F1ZWV6ZXJ9IHdoZW4gbmVlZGVkICh0eXBpY2FsbHksIGp1c3QgdGhlIHZlcnkgZmlyc3QgdGltZSkuCi0gICAgICogIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBhIHN0YW5kYXJkLCBuZXcgaW5zdGFuY2UuCi0gICAgICoKLSAgICAgKiAgQHNpbmNlIDIuMgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIERhdGFTcXVlZXplciBjcmVhdGVEYXRhU3F1ZWV6ZXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBEYXRhU3F1ZWV6ZXIoX3Jlc29sdmVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgSW52b2tlZCBmcm9tIHtAbGluayAjc2VydmljZShSZXF1ZXN0Q29udGV4dCl9IHRvIGV4dHJhY3QsIGZyb20gdGhlIFVSTCwKLSAgICAgKiAgdGhlIG5hbWUgb2YgdGhlIHNlcnZpY2UuICBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBleHBlY3RzIHRoZSBmaXJzdAotICAgICAqICBwYXRoSW5mbyBlbGVtZW50IHRvIGJlIHRoZSBzZXJ2aWNlIG5hbWUuICBBdCBzb21lIHBvaW50IGluIHRoZSBmdXR1cmUsCi0gICAgICogIHRoZSBtZXRob2Qgb2YgY29uc3RydWN0aW5nIGFuZCBwYXJzaW5nIFVSTHMgbWF5IGJlIGFic3RyYWN0ZWQgaW50bwotICAgICAqICBhIGRldmVsb3Blci1zZWxlY3RlZCBjbGFzcy4KLSAgICAgKgotICAgICAqICA8cD5TdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCBpZiB0aGUgYXBwbGljYXRpb24gZGVmaW5lcwotICAgICAqICBzcGVjaWZpYyBzZXJ2aWNlcyB3aXRoIHVudXN1YWwgVVJMIGVuY29kaW5nIHJ1bGVzLgotICAgICAqCi0gICAgICogIDxwPlRoaXMgaW1wbGVtZW50YXRpb24gc2ltcGx5IGV4dHJhY3RzIHRoZSB2YWx1ZSBmb3IKLSAgICAgKiAgcXVlcnkgcGFyYW1ldGVyIHtAbGluayBUYXBlc3RyeSNTRVJWSUNFX1FVRVJZX1BBUkFNRVRFUl9OQU1FfQotICAgICAqICBhbmQgZXh0cmFjdHMgdGhlIHNlcnZpY2UgbmFtZSBmcm9tIHRoYXQuCi0gICAgICoKLSAgICAgKiAgPHA+Ci0gICAgICogIEZvciBzdXBwb3J0aW5nIHRoZSBKU1AgdGFncywgdGhpcyBtZXRob2QgZmlyc3QKLSAgICAgKiAgY2hlY2tzIGZvciBhdHRyaWJ1dGUge0BsaW5rIFRhcGVzdHJ5I1RBR19TVVBQT1JUX1NFUlZJQ0VfQVRUUklCVVRFfS4gIElmIG5vbi1udWxsLAotICAgICAqICB0aGVuIHtAbGluayBUYXBlc3RyeSNUQUdTVVBQT1JUX1NFUlZJQ0V9IGlzIHJldHVybmVkLgotICAgICAqCi0gICAgICogIEBzaW5jZSAyLjIKLSAgICAgKgotICAgICAqKi8KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZXh0cmFjdFNlcnZpY2VOYW1lKFJlcXVlc3RDb250ZXh0IGNvbnRleHQpCi0gICAgewotICAgICAgICBpZiAoY29udGV4dC5nZXRSZXF1ZXN0KCkuZ2V0QXR0cmlidXRlKFRhcGVzdHJ5LlRBR19TVVBQT1JUX1NFUlZJQ0VfQVRUUklCVVRFKSAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIFRhcGVzdHJ5LlRBR1NVUFBPUlRfU0VSVklDRTsKLQotICAgICAgICBTdHJpbmcgc2VydmljZURhdGEgPSBjb250ZXh0LmdldFBhcmFtZXRlcihUYXBlc3RyeS5TRVJWSUNFX1FVRVJZX1BBUkFNRVRFUl9OQU1FKTsKLQotICAgICAgICBpZiAoc2VydmljZURhdGEgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBUYXBlc3RyeS5IT01FX1NFUlZJQ0U7Ci0KLSAgICAgICAgLy8gVGhlIHNlcnZpY2UgbmFtZSBpcyBhbnl0aGluZyBiZWZvcmUgdGhlIGZpcnN0IHNsYXNoLAotICAgICAgICAvLyBpZiB0aGVyZSBpcyBvbmUuCi0KLSAgICAgICAgaW50IHNsYXNoeCA9IHNlcnZpY2VEYXRhLmluZGV4T2YoJy8nKTsKLQotICAgICAgICBpZiAoc2xhc2h4IDwgMCkKLSAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlRGF0YTsKLQotICAgICAgICByZXR1cm4gc2VydmljZURhdGEuc3Vic3RyaW5nKDAsIHNsYXNoeCk7Ci0gICAgfQotCi0gICAgLyoqIEBzaW5jZSAyLjMgKiovCi0KLSAgICBwdWJsaWMgSVByb3BlcnR5U291cmNlIGdldFByb3BlcnR5U291cmNlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfcHJvcGVydHlTb3VyY2U7Ci0gICAgfQotCi0gICAgLyoqIEBzaW5jZSAzLjAuMyAqLwotICAgIAotICAgIHB1YmxpYyBSZXNvdXJjZUNoZWNrc3VtU291cmNlIGdldFJlc291cmNlQ2hlY2tzdW1Tb3VyY2UoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9yZXNvdXJjZUNoZWNrc3VtU291cmNlOwotICAgIH0KLSAgICAKLSAgICAvKiogQHNpbmNlIDMuMCAqKi8KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RXhjZXB0aW9uUGFnZU5hbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEVYQ0VQVElPTl9QQUdFOwotICAgIH0KLQotICAgIC8qKiBAc2luY2UgMy4wICoqLwotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRTdGFsZUxpbmtQYWdlTmFtZSgpCi0gICAgewotICAgICAgICByZXR1cm4gU1RBTEVfTElOS19QQUdFOwotICAgIH0KLQotICAgIC8qKiBAc2luY2UgMy4wICoqLwotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRTdGFsZVNlc3Npb25QYWdlTmFtZSgpCi0gICAgewotICAgICAgICByZXR1cm4gU1RBTEVfU0VTU0lPTl9QQUdFOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBOYW1lIG9mIGFuIGFwcGxpY2F0aW9uIGV4dGVuc2lvbiB0aGF0IGNhbiBwcm92aWRlIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcy4KLSAgICAgKgotICAgICAqICBAc2VlICNjcmVhdGVQcm9wZXJ0eVNvdXJjZShSZXF1ZXN0Q29udGV4dCkKLSAgICAgKiAgQHNpbmNlIDIuMwotICAgICAqCi0gICAgICoqLwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QUk9QRVJUWV9TT1VSQ0VfTkFNRSA9Ci0gICAgICAgICJvcmcuYXBhY2hlLnRhcGVzdHJ5LnByb3BlcnR5LXNvdXJjZSI7Ci0KLSAgICAvKioKLSAgICAgKiAgQ3JlYXRlcyBhIHNoYXJlZCBwcm9wZXJ0eSBzb3VyY2UgdGhhdCB3aWxsIGJlIHN0b3JlZCBpbnRvCi0gICAgICogIHRoZSBzZXJ2bGV0IGNvbnRleHQuCi0gICAgICogIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGJ1aWxkIHRoaWVyCi0gICAgICogIG93biBzZWFyY2ggcGF0aC4KLSAgICAgKgotICAgICAqICA8cD5JZiB0aGUgYXBwbGljYXRpb24gc3BlY2lmaWNhdGlvbiBjb250YWlucyBhbiBleHRlbnNpb24KLSAgICAgKiAgbmFtZWQgIm9yZy5hcGFjaGUudGFwZXN0cnkucHJvcGVydHktc291cmNlIiBpdCBpcyBpbnNlcnRlZAotICAgICAqICBpbiB0aGUgc2VhcmNoIHBhdGgganVzdCBiZWZvcmUKLSAgICAgKiAgdGhlIHByb3BlcnR5IHNvdXJjZSBmb3IgSlZNIFN5c3RlbSBQcm9wZXJ0aWVzLiAgVGhpcyBpcyBhIHNpbXBsZQotICAgICAqICBob29rIGF0IGFsbG93IGFwcGxpY2F0aW9uLXNwZWNpZmljIG1ldGhvZHMgb2Ygb2J0YWluaW5nCi0gICAgICogIGNvbmZpZ3VyYXRpb24gdmFsdWVzICh0eXBpY2FsbHksIGZyb20gYSBkYXRhYmFzZSBvciBmcm9tIEpNWCwKLSAgICAgKiAgaW4gc29tZSB3YXkpLiAgQWx0ZXJuYXRlbHksIHN1YmNsYXNzZXMgbWF5Ci0gICAgICogIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHByb3ZpZGUgd2hhdGV2ZXIgc2VhcmNoIHBhdGgKLSAgICAgKiAgaXMgYXBwcm9wcmlhdGUuCi0gICAgICoKLSAgICAgKgotICAgICAqICBAc2luY2UgMi4zCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwcm90ZWN0ZWQgSVByb3BlcnR5U291cmNlIGNyZWF0ZVByb3BlcnR5U291cmNlKFJlcXVlc3RDb250ZXh0IGNvbnRleHQpCi0gICAgewotICAgICAgICBEZWxlZ2F0aW5nUHJvcGVydHlTb3VyY2UgcmVzdWx0ID0gbmV3IERlbGVnYXRpbmdQcm9wZXJ0eVNvdXJjZSgpOwotCi0gICAgICAgIEFwcGxpY2F0aW9uU2VydmxldCBzZXJ2bGV0ID0gY29udGV4dC5nZXRTZXJ2bGV0KCk7Ci0gICAgICAgIElBcHBsaWNhdGlvblNwZWNpZmljYXRpb24gc3BlYyA9IHNlcnZsZXQuZ2V0QXBwbGljYXRpb25TcGVjaWZpY2F0aW9uKCk7Ci0KLSAgICAgICAgcmVzdWx0LmFkZFNvdXJjZShuZXcgUHJvcGVydHlIb2xkZXJQcm9wZXJ0eVNvdXJjZShzcGVjKSk7Ci0gICAgICAgIHJlc3VsdC5hZGRTb3VyY2UobmV3IFNlcnZsZXRQcm9wZXJ0eVNvdXJjZShzZXJ2bGV0LmdldFNlcnZsZXRDb25maWcoKSkpOwotICAgICAgICByZXN1bHQuYWRkU291cmNlKG5ldyBTZXJ2bGV0Q29udGV4dFByb3BlcnR5U291cmNlKHNlcnZsZXQuZ2V0U2VydmxldENvbnRleHQoKSkpOwotCi0gICAgICAgIGlmIChzcGVjLmNoZWNrRXh0ZW5zaW9uKEVYVEVOU0lPTl9QUk9QRVJUWV9TT1VSQ0VfTkFNRSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIElQcm9wZXJ0eVNvdXJjZSBzb3VyY2UgPQotICAgICAgICAgICAgICAgIChJUHJvcGVydHlTb3VyY2UpIHNwZWMuZ2V0RXh0ZW5zaW9uKAotICAgICAgICAgICAgICAgICAgICBFWFRFTlNJT05fUFJPUEVSVFlfU09VUkNFX05BTUUsCi0gICAgICAgICAgICAgICAgICAgIElQcm9wZXJ0eVNvdXJjZS5jbGFzcyk7Ci0KLSAgICAgICAgICAgIHJlc3VsdC5hZGRTb3VyY2Uoc291cmNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJlc3VsdC5hZGRTb3VyY2UoU3lzdGVtUHJvcGVydGllc1Byb3BlcnR5U291cmNlLmdldEluc3RhbmNlKCkpOwotCi0gICAgICAgIC8vIExhc3RseSwgYWRkIGEgZmluYWwgc291cmNlIHRvIGhhbmRsZSAiZmFjdG9yeSBkZWZhdWx0cyIuCi0KLSAgICAgICAgUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0KLSAgICAgICAgICAgIFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgib3JnLmFwYWNoZS50YXBlc3RyeS5Db25maWd1cmF0aW9uRGVmYXVsdHMiKTsKLQotICAgICAgICByZXN1bHQuYWRkU291cmNlKG5ldyBSZXNvdXJjZUJ1bmRsZVByb3BlcnR5U291cmNlKGJ1bmRsZSkpOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIENyZWF0ZXMgdGhlIHNoYXJlZCBHbG9iYWwgb2JqZWN0LiAgVGhpcyBpbXBsZW1lbnRhdGlvbiBsb29rcyBmb3IgYW4gY29uZmlndXJhdGlvbgotICAgICAqICBwcm9wZXJ0eSwgPGNvZGU+b3JnLmFwYWNoZS50YXBlc3RyeS5nbG9iYWwtY2xhc3M8L2NvZGU+LCBhbmQgaW5zdGFudGlhdGVzIHRoYXQgY2xhc3MKLSAgICAgKiAgdXNpbmcgYSBuby1hcmd1bWVudHMKLSAgICAgKiAgY29uc3RydWN0b3IuICBJZiB0aGUgcHJvcGVydHkgaXMgbm90IGRlZmluZWQsIGEgc3luY2hyb25pemVkCi0gICAgICogIHtAbGluayBqYXZhLnV0aWwuSGFzaE1hcH0gaXMgY3JlYXRlZC4KLSAgICAgKgotICAgICAqICBAc2luY2UgMi4zCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZUdsb2JhbChSZXF1ZXN0Q29udGV4dCBjb250ZXh0KQotICAgIHsKLSAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IF9wcm9wZXJ0eVNvdXJjZS5nZXRQcm9wZXJ0eVZhbHVlKCJvcmcuYXBhY2hlLnRhcGVzdHJ5Lmdsb2JhbC1jbGFzcyIpOwotCi0gICAgICAgIGlmIChjbGFzc05hbWUgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRNYXAobmV3IEhhc2hNYXAoKSk7Ci0KLSAgICAgICAgQ2xhc3MgZ2xvYmFsQ2xhc3MgPSBfcmVzb2x2ZXIuZmluZENsYXNzKGNsYXNzTmFtZSk7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBnbG9iYWxDbGFzcy5uZXdJbnN0YW5jZSgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgVGFwZXN0cnkuZm9ybWF0KCJBYnN0cmFjdEVuZ2luZS51bmFibGUtdG8taW5zdGFudGlhdGUtZ2xvYmFsIiwgY2xhc3NOYW1lKSwKLSAgICAgICAgICAgICAgICBleCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyBhbiBuZXcgaW5zdGFuY2Ugb2Yge0BsaW5rIFBvb2x9LCB3aXRoIHRoZSBzdGFuZGFyZAotICAgICAqICBzZXQgb2YgYWRhcHRvcnMsIHBsdXMge0BsaW5rIEJTRk1hbmFnZXJQb29sYWJsZUFkYXB0b3J9IGZvcgotICAgICAqICB7QGxpbmsgQlNGTWFuYWdlcn0uCi0gICAgICoKLSAgICAgKiAgPHA+U3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcwotICAgICAqICBtZXRob2QgdG8gY29uZmlndXJlIHRoZSBQb29sIGRpZmZlcmVudGx5LgotICAgICAqCi0gICAgICogIEBzaW5jZSAzLjAKLSAgICAgKgotICAgICAqKi8KLQotICAgIHByb3RlY3RlZCBQb29sIGNyZWF0ZVBvb2woUmVxdWVzdENvbnRleHQgY29udGV4dCkKLSAgICB7Ci0gICAgICAgIFBvb2wgcmVzdWx0ID0gbmV3IFBvb2woKTsKLQotICAgICAgICByZXN1bHQucmVnaXN0ZXJBZGFwdG9yKEJTRk1hbmFnZXIuY2xhc3MsIG5ldyBCU0ZNYW5hZ2VyUG9vbGFibGVBZGFwdG9yKCkpOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqIEBzaW5jZSAzLjAgKiovCi0KLSAgICBwdWJsaWMgUG9vbCBnZXRQb29sKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfcG9vbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKgotICAgICAqIEludm9rZWQgZnJvbSB7QGxpbmsgI3NldHVwRm9yUmVxdWVzdChSZXF1ZXN0Q29udGV4dCl9LiAgQ3JlYXRlcwotICAgICAqIGEgbmV3IGluc3RhbmNlIG9mIHtAbGluayBEZWZhdWx0Q29tcG9uZW50Q2xhc3NFbmhhbmNlcn0uICBTdWJjbGFzc2VzCi0gICAgICogbWF5IG92ZXJyaWRlIHRvIHJldHVybiBhIGRpZmZlcmVudCBvYmplY3QuCi0gICAgICogCi0gICAgICogPHA+Ci0gICAgICogQ2hlY2sgdGhlIHByb3BlcnR5IDxjb2RlPm9yZy5hcGFjaGUudGFwZXN0cnkuZW5oYW5jZS5kaXNhYmxlLWFic3RyYWN0LW1ldGhvZC12YWxpZGF0aW9uPC9jb2RlPgotICAgICAqIGFuZCwgaWYgdHJ1ZSwgZGlzYWJsZXMgYWJzdHJhY3QgbWV0aG9kIHZhbGlkYXRpb24uIFRoaXMgaXMgdXNlZCAgaW4gc29tZQotICAgICAqIGVycmFudCBKREsncyAoc3VjaCBhcyBJQk0ncyAxLjMuMSkgdGhhdCBpbmNvcnJlY3RseSByZXBvcnQgY29uY3JldGUgbWV0aG9kcyBmcm9tCi0gICAgICogYWJzdHJhY3QgY2xhc3NlcyBhcyBhYnN0cmFjdC4KLSAgICAgKgotICAgICAqIEBzaW5jZSAzLjAKLSAgICAgKi8KLQotICAgIHByb3RlY3RlZCBJQ29tcG9uZW50Q2xhc3NFbmhhbmNlciBjcmVhdGVDb21wb25lbnRDbGFzc0VuaGFuY2VyKFJlcXVlc3RDb250ZXh0IGNvbnRleHQpCi0gICAgewotICAgICAgICBib29sZWFuIGRpc2FibGVWYWxpZGF0aW9uID0KLSAgICAgICAgICAgICJ0cnVlIi5lcXVhbHMoCi0gICAgICAgICAgICAgICAgX3Byb3BlcnR5U291cmNlLmdldFByb3BlcnR5VmFsdWUoCi0gICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLnRhcGVzdHJ5LmVuaGFuY2UuZGlzYWJsZS1hYnN0cmFjdC1tZXRob2QtdmFsaWRhdGlvbiIpKTsKLQotICAgICAgICByZXR1cm4gbmV3IERlZmF1bHRDb21wb25lbnRDbGFzc0VuaGFuY2VyKF9yZXNvbHZlciwgZGlzYWJsZVZhbGlkYXRpb24pOwotICAgIH0KLQotICAgIC8qKiBAc2luY2UgMy4wICoqLwotCi0gICAgcHVibGljIElDb21wb25lbnRDbGFzc0VuaGFuY2VyIGdldENvbXBvbmVudENsYXNzRW5oYW5jZXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9lbmhhbmNlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0cnVlIGlmIHRoZSBlbmdpbmUgaGFzIChwb3RlbnRpYWxseSkgY2hhbmdlZAotICAgICAqICBzdGF0ZSBzaW5jZSB0aGUgbGFzdCB0aW1lIGl0IHdhcyBzdG9yZWQKLSAgICAgKiAgaW50byB0aGUge0BsaW5rIGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbn0uICBWYXJpb3VzCi0gICAgICogIGV2ZW50cyBzZXQgdGhpcyBwcm9wZXJ0eSB0byB0cnVlLgotICAgICAqCi0gICAgICogIEBzaW5jZSAzLjAKLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRGlydHkoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9kaXJ0eTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgSW52b2tlZCB0byBzZXQgdGhlIGRpcnR5IGZsYWcsIGluZGljYXRpbmcgdGhhdCB0aGUKLSAgICAgKiAgZW5naW5lIHNob3VsZCBiZSBzdG9yZWQgaW50byB0aGUKLSAgICAgKiAge0BsaW5rIGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbn0uCi0gICAgICoKLSAgICAgKgotICAgICAqICBAc2luY2UgMy4wCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwcm90ZWN0ZWQgdm9pZCBtYXJrRGlydHkoKQotICAgIHsKLSAgICAgICAgaWYgKCFfZGlydHkpCi0gICAgICAgICAgICBMT0cuZGVidWcoIlNldHRpbmcgZGlydHkgZmxhZy4iKTsKLQotICAgICAgICBfZGlydHkgPSB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqCi0gICAgICogIENsZWFycyB0aGUgZGlydHkgZmxhZyB3aGVuIGEgZW5naW5lIGlzIHN0b3JlZCBpbnRvIHRoZQotICAgICAqICB7QGxpbmsgSHR0cFNlc3Npb259LgotICAgICAqCi0gICAgICoKLSAgICAgKiAgQHNpbmNlIDMuMAotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgdmFsdWVCb3VuZChIdHRwU2Vzc2lvbkJpbmRpbmdFdmVudCBhcmcwKQotICAgIHsKLSAgICAgICAgTE9HLmRlYnVnKF9kaXJ0eSA/ICJDbGVhcmluZyBkaXJ0eSBmbGFnLiIgOiAiRGlydHkgZmxhZyBhbHJlYWR5IGNsZWFyZWQuIik7Ci0KLSAgICAgICAgX2RpcnR5ID0gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIERvZXMgbm90aGluZy4KLSAgICAgKgotICAgICAqICBAc2luY2UgMy4wCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCB2YWx1ZVVuYm91bmQoSHR0cFNlc3Npb25CaW5kaW5nRXZlbnQgYXJnMCkKLSAgICB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoKLSAgICAgKiAgVGhlIGVuY29kaW5nIHRvIGJlIHVzZWQgaWYgbm9uZSBoYXMgYmVlbiBkZWZpbmVkIHVzaW5nIHRoZSBvdXRwdXQgZW5jb2RpbmcgcHJvcGVydHkuCi0gICAgICogIE92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGNoYW5nZSB0aGUgZGVmYXVsdC4KLSAgICAgKgotICAgICAqICBAcmV0dXJuIHRoZSBkZWZhdWx0IG91dHB1dCBlbmNvZGluZwotICAgICAqICBAc2luY2UgMy4wCi0gICAgICoKLSAgICAgKiovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0T3V0cHV0RW5jb2RpbmcoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIERFRkFVTFRfT1VUUFVUX0VOQ09ESU5HOwotICAgIH0KLQotICAgIC8qKgotICAgICAqCi0gICAgICogIFJldHVybnMgdGhlIGVuY29kaW5nIHRvIGJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIHNlcnZsZXQgcmVzcG9uc2VzIGFuZAotICAgICAqICBhY2NlcHQgdGhlIHNlcnZsZXQgcmVxdWVzdHMuCi0gICAgICoKLSAgICAgKiAgVGhlIGVuY29kaW5nIGlzIGRlZmluZWQgdXNpbmcgdGhlIG9yZy5hcGFjaGUudGFwZXN0cnkub3V0cHV0LWVuY29kaW5nCi0gICAgICogIGFuZCBpcyBVVEYtOCBieSBkZWZhdWx0Ci0gICAgICoKLSAgICAgKiAgQHNpbmNlIDMuMAotICAgICAqICBAc2VlIG9yZy5hcGFjaGUudGFwZXN0cnkuSUVuZ2luZSNnZXRPdXRwdXRFbmNvZGluZygpCi0gICAgICoKLSAgICAgKiovCi0gICAgcHVibGljIFN0cmluZyBnZXRPdXRwdXRFbmNvZGluZygpCi0gICAgewotICAgICAgICBJUHJvcGVydHlTb3VyY2Ugc291cmNlID0gZ2V0UHJvcGVydHlTb3VyY2UoKTsKLQotICAgICAgICBTdHJpbmcgZW5jb2RpbmcgPSBzb3VyY2UuZ2V0UHJvcGVydHlWYWx1ZShPVVRQVVRfRU5DT0RJTkdfUFJPUEVSVFlfTkFNRSk7Ci0gICAgICAgIGlmIChlbmNvZGluZyA9PSBudWxsKQotICAgICAgICAgICAgZW5jb2RpbmcgPSBnZXREZWZhdWx0T3V0cHV0RW5jb2RpbmcoKTsKLQotICAgICAgICByZXR1cm4gZW5jb2Rpbmc7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZW5naW5lL0Fic3RyYWN0U2VydmljZS5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2VuZ2luZS9BYnN0cmFjdFNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNmZDNkMi4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZW5naW5lL0Fic3RyYWN0U2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmVuZ2luZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LkFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZXF1ZXN0Q3ljbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5UYXBlc3RyeTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnJlcXVlc3QuUmVxdWVzdENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS51dGlsLlN0cmluZ1NwbGl0dGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkudXRpbC5pby5EYXRhU3F1ZWV6ZXI7Ci0KLS8qKgotICogIEFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGltcGxlbWVudGluZyBlbmdpbmUgc2VydmljZXMuICBJbnN0YW5jZXMgb2Ygc2VydmljZXMKLSAqICBhcmUgc2hhcmVkIGJ5IG1hbnkgZW5naW5lcyBhbmQgdGhyZWFkcywgc28gdGhleSBtdXN0IGJlIHRocmVhZHNhZmUuCi0gKiAKLSAqICA8cD4KLSAqICBOb3RlOyB0b28gbXVjaCBvZiB0aGUgVVJMIGVuY29kaW5nL2RlY29kaW5nIHN0YXRlZ3kgaXMgZml4ZWQgaGVyZS4KLSAqICBBIGZ1dHVyZSByZWxlYXNlIG9mIFRhcGVzdHJ5IG1heSBleHRyYWN0IHRoaXMgc3RyYXRlZ3ksIGFsbG93aW5nIGRldmVsb3BlcnMKLSAqICB0byBjaG9vc2UgdGhlIG1ldGhvZCB2aWEgd2hpY2ggVVJMcyBhcmUgZW5jb2RlZC4KLSAqIAotICogIEBzZWUgb3JnLmFwYWNoZS50YXBlc3RyeS5lbmdpbmUuQWJzdHJhY3RFbmdpbmUjZ2V0U2VydmljZShTdHJpbmcpCi0gKiAKLSAqCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogIEB2ZXJzaW9uICRJZCQKLSAqICBAc2luY2UgMS4wLjMKLSAqIAotICoqLwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RTZXJ2aWNlIGltcGxlbWVudHMgSUVuZ2luZVNlcnZpY2UKLXsKLSAgICAvKioKLSAgICAgKiAgQ29uc3RydWN0cyBhIGxpbmsgZm9yIHRoZSBzZXJ2aWNlLgotICAgICAqCi0gICAgICogIEBwYXJhbSBjeWNsZSB0aGUgcmVxdWVzdCBjeWNsZQotICAgICAqICBAcGFyYW0gc2VydmljZU5hbWUgdGhlIG5hbWUgb2YgdGhlIHNlcnZpY2UKLSAgICAgKiAgQHBhcmFtIHNlcnZpY2VDb250ZXh0IGNvbnRleHQgcmVsYXRlZCB0byB0aGUgc2VydmljZSBpdHNlbGYgd2hpY2ggaXMgYWRkZWQgdG8gdGhlIFVSTCBhcy1pcwotICAgICAqICBAcGFyYW0gcGFyYW1ldGVycyBhZGRpdGlvbmFsIHNlcnZpY2UgcGFyYW1ldGVycyBwcm92aWRlZCBieSB0aGUgY29tcG9uZW50OyAKLSAgICAgKiAgdGhpcyBpcyBhcHBsaWNhdGlvbiBzcGVjaWZpYyBpbmZvcm1hdGlvbiwgYW5kIGlzIGVuY29kZWQgd2l0aCAKLSAgICAgKiAge0BsaW5rIGphdmEubmV0LlVSTEVuY29kZXIjZW5jb2RlKFN0cmluZyl9IGJlZm9yZSBiZWluZyBhZGRlZAotICAgICAqICB0byB0aGUgcXVlcnkuCi0gICAgICogIEBwYXJhbSBzdGF0ZWZ1bCBpZiB0cnVlLCB0aGUgZmluYWwgVVJMIG11c3QgYmUgZW5jb2RlZCB3aXRoIHRoZSBIdHRwU2Vzc2lvbiBpZAotICAgICAqCi0gICAgICoqLwotCi0gICAgcHJvdGVjdGVkIElMaW5rIGNvbnN0cnVjdExpbmsoCi0gICAgICAgIElSZXF1ZXN0Q3ljbGUgY3ljbGUsCi0gICAgICAgIFN0cmluZyBzZXJ2aWNlTmFtZSwKLSAgICAgICAgU3RyaW5nW10gc2VydmljZUNvbnRleHQsCi0gICAgICAgIE9iamVjdFtdIHBhcmFtZXRlcnMsCi0gICAgICAgIGJvb2xlYW4gc3RhdGVmdWwpCi0gICAgewotICAgICAgICBEYXRhU3F1ZWV6ZXIgc3F1ZWV6ZXIgPSBjeWNsZS5nZXRFbmdpbmUoKS5nZXREYXRhU3F1ZWV6ZXIoKTsKLSAgICAgICAgU3RyaW5nW10gc3F1ZWV6ZWQgPSBudWxsOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBzcXVlZXplZCA9IHNxdWVlemVyLnNxdWVlemUocGFyYW1ldGVycyk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGV4KQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uKGV4KTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBuZXcgRW5naW5lU2VydmljZUxpbmsoY3ljbGUsIHNlcnZpY2VOYW1lLCBzZXJ2aWNlQ29udGV4dCwgc3F1ZWV6ZWQsIHN0YXRlZnVsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0aGUgc2VydmljZSBjb250ZXh0IGFzIGFuIGFycmF5IG9mIFN0cmluZ3MuCi0gICAgICogIFJldHVybnMgbnVsbCBpZiB0aGVyZSBhcmUgbm8gc2VydmljZSBjb250ZXh0IHN0cmluZ3MuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0U2VydmljZUNvbnRleHQoUmVxdWVzdENvbnRleHQgY29udGV4dCkKLSAgICB7Ci0gICAgICAgIFN0cmluZyBzZXJ2aWNlID0gY29udGV4dC5nZXRQYXJhbWV0ZXIoVGFwZXN0cnkuU0VSVklDRV9RVUVSWV9QQVJBTUVURVJfTkFNRSk7Ci0KLQkJaW50IHNsYXNoeCA9IHNlcnZpY2UuaW5kZXhPZignLycpOwotCQkKLQkJaWYgKHNsYXNoeCA8IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJCQotCQlTdHJpbmcgc2VydmljZUNvbnRleHQgPSBzZXJ2aWNlLnN1YnN0cmluZyhzbGFzaHggKyAxKTsKLQotICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1NwbGl0dGVyKCcvJykuc3BsaXRUb0FycmF5KHNlcnZpY2VDb250ZXh0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0aGUgc2VydmljZSBwYXJhbWV0ZXJzIGFzIGFuIGFycmF5IG9mIFN0cmluZ3MuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0W10gZ2V0UGFyYW1ldGVycyhJUmVxdWVzdEN5Y2xlIGN5Y2xlKQotICAgIHsKLSAgICAgICAgUmVxdWVzdENvbnRleHQgY29udGV4dCA9IGN5Y2xlLmdldFJlcXVlc3RDb250ZXh0KCk7Ci0KLSAgICAgICAgU3RyaW5nW10gc3F1ZWV6ZWQgPSBjb250ZXh0LmdldFBhcmFtZXRlcnMoVGFwZXN0cnkuUEFSQU1FVEVSU19RVUVSWV9QQVJBTUVURVJfTkFNRSk7Ci0KLSAgICAgICAgaWYgKFRhcGVzdHJ5LnNpemUoc3F1ZWV6ZWQpID09IDApCi0gICAgICAgICAgICByZXR1cm4gc3F1ZWV6ZWQ7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIERhdGFTcXVlZXplciBzcXVlZXplciA9IGN5Y2xlLmdldEVuZ2luZSgpLmdldERhdGFTcXVlZXplcigpOwotCi0gICAgICAgICAgICByZXR1cm4gc3F1ZWV6ZXIudW5zcXVlZXplKHNxdWVlemVkKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZXgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24oZXgpOwotICAgICAgICB9Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9lbmdpbmUvQWN0aW9uU2VydmljZS5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2VuZ2luZS9BY3Rpb25TZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlNDhkOGYuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2VuZ2luZS9BY3Rpb25TZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuZW5naW5lOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LkFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklBY3Rpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JQ29tcG9uZW50OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVBhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVxdWVzdEN5Y2xlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuU3RhbGVTZXNzaW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuVGFwZXN0cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5yZXF1ZXN0LlJlc3BvbnNlT3V0cHV0U3RyZWFtOwotCi0vKioKLSAqICBBIGNvbnRleHQtc2Vuc2l0aXZlIHNlcnZpY2UgcmVsYXRlZCB0byB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5mb3JtLkZvcm19IAotICogIGFuZCB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5saW5rLkFjdGlvbkxpbmt9LiAgRW5jb2RlcwotICogIHRoZSBwYWdlLCBjb21wb25lbnQgYW5kIGFuIGFjdGlvbiBpZCBpbiB0aGUgc2VydmljZSBjb250ZXh0LgotICoKLSAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiAgQHZlcnNpb24gJElkJAotICogIEBzaW5jZSAxLjAuOQotICoKLSAqKi8KLQotcHVibGljIGNsYXNzIEFjdGlvblNlcnZpY2UgZXh0ZW5kcyBBYnN0cmFjdFNlcnZpY2UKLXsKLSAgICAvKioKLSAgICAgKiAgRW5jb2RlZCBpbnRvIFVSTCBpZiBlbmdpbmUgd2FzIHN0YXRlZnVsLgotICAgICAqIAotICAgICAqICBAc2luY2UgMy4wCi0gICAgICoqLwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVRFRlVMX09OID0gIjEiOwotCi0gICAgLyoqCi0gICAgICogIEVuY29kZWQgaW50byBVUkwgaWYgZW5naW5lIHdhcyBub3Qgc3RhdGVmdWwuCi0gICAgICogCi0gICAgICogIEBzaW5jZSAzLjAKLSAgICAgKiovCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBVEVGVUxfT0ZGID0gIjAiOwotCi0gICAgcHVibGljIElMaW5rIGdldExpbmsoSVJlcXVlc3RDeWNsZSBjeWNsZSwgSUNvbXBvbmVudCBjb21wb25lbnQsIE9iamVjdFtdIHBhcmFtZXRlcnMpCi0gICAgewotICAgICAgICBpZiAocGFyYW1ldGVycyA9PSBudWxsIHx8IHBhcmFtZXRlcnMubGVuZ3RoICE9IDEpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIFRhcGVzdHJ5LmZvcm1hdCgic2VydmljZS1zaW5nbGUtcGFyYW1ldGVyIiwgVGFwZXN0cnkuQUNUSU9OX1NFUlZJQ0UpKTsKLQotICAgICAgICBTdHJpbmcgc3RhdGVmdWwgPSBjeWNsZS5nZXRFbmdpbmUoKS5pc1N0YXRlZnVsKCkgPyBTVEFURUZVTF9PTiA6IFNUQVRFRlVMX09GRjsKLSAgICAgICAgSVBhZ2UgY29tcG9uZW50UGFnZSA9IGNvbXBvbmVudC5nZXRQYWdlKCk7Ci0gICAgICAgIElQYWdlIHJlc3BvbnNlUGFnZSA9IGN5Y2xlLmdldFBhZ2UoKTsKLQotICAgICAgICBib29sZWFuIGNvbXBsZXggPSAoY29tcG9uZW50UGFnZSAhPSByZXNwb25zZVBhZ2UpOwotCi0gICAgICAgIFN0cmluZ1tdIHNlcnZpY2VDb250ZXh0ID0gbmV3IFN0cmluZ1tjb21wbGV4ID8gNSA6IDRdOwotCi0gICAgICAgIGludCBpID0gMDsKLQotICAgICAgICBzZXJ2aWNlQ29udGV4dFtpKytdID0gc3RhdGVmdWw7Ci0gICAgICAgIHNlcnZpY2VDb250ZXh0W2krK10gPSByZXNwb25zZVBhZ2UuZ2V0UGFnZU5hbWUoKTsKLSAgICAgICAgc2VydmljZUNvbnRleHRbaSsrXSA9IChTdHJpbmcpIHBhcmFtZXRlcnNbMF07Ci0KLSAgICAgICAgLy8gQmVjYXVzZSBvZiBCbG9jay9JbnNlcnRCbG9jaywgdGhlIGNvbXBvbmVudCBtYXkgbm90IGJlIG9uCi0gICAgICAgIC8vIHRoZSBzYW1lIHBhZ2UgYXMgdGhlIHJlc3BvbnNlIHBhZ2UgYW5kIHdlIG5lZWQgdG8gbWFrZQotICAgICAgICAvLyBhbGxvd2FuY2VzIGZvciB0aGlzLgotCi0gICAgICAgIGlmIChjb21wbGV4KQotICAgICAgICAgICAgc2VydmljZUNvbnRleHRbaSsrXSA9IGNvbXBvbmVudFBhZ2UuZ2V0UGFnZU5hbWUoKTsKLQotICAgICAgICBzZXJ2aWNlQ29udGV4dFtpKytdID0gY29tcG9uZW50LmdldElkUGF0aCgpOwotCi0gICAgICAgIHJldHVybiBjb25zdHJ1Y3RMaW5rKGN5Y2xlLCBUYXBlc3RyeS5BQ1RJT05fU0VSVklDRSwgc2VydmljZUNvbnRleHQsIG51bGwsIHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNlcnZpY2UoCi0gICAgICAgIElFbmdpbmVTZXJ2aWNlVmlldyBlbmdpbmUsCi0gICAgICAgIElSZXF1ZXN0Q3ljbGUgY3ljbGUsCi0gICAgICAgIFJlc3BvbnNlT3V0cHV0U3RyZWFtIG91dHB1dCkKLSAgICAgICAgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBJQWN0aW9uIGFjdGlvbiA9IG51bGw7Ci0gICAgICAgIFN0cmluZyBjb21wb25lbnRQYWdlTmFtZTsKLSAgICAgICAgaW50IGNvdW50ID0gMDsKLQotICAgICAgICBTdHJpbmdbXSBzZXJ2aWNlQ29udGV4dCA9IGdldFNlcnZpY2VDb250ZXh0KGN5Y2xlLmdldFJlcXVlc3RDb250ZXh0KCkpOwotCi0gICAgICAgIGlmIChzZXJ2aWNlQ29udGV4dCAhPSBudWxsKQotICAgICAgICAgICAgY291bnQgPSBzZXJ2aWNlQ29udGV4dC5sZW5ndGg7Ci0KLSAgICAgICAgaWYgKGNvdW50ICE9IDQgJiYgY291bnQgIT0gNSkKLSAgICAgICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgVGFwZXN0cnkuZ2V0TWVzc2FnZSgiQWN0aW9uU2VydmljZS5jb250ZXh0LXBhcmFtZXRlcnMiKSk7Ci0KLSAgICAgICAgYm9vbGVhbiBjb21wbGV4ID0gY291bnQgPT0gNTsKLQotICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgIFN0cmluZyBzdGF0ZWZ1bCA9IHNlcnZpY2VDb250ZXh0W2krK107Ci0gICAgICAgIFN0cmluZyBwYWdlTmFtZSA9IHNlcnZpY2VDb250ZXh0W2krK107Ci0gICAgICAgIFN0cmluZyB0YXJnZXRBY3Rpb25JZCA9IHNlcnZpY2VDb250ZXh0W2krK107Ci0KLSAgICAgICAgaWYgKGNvbXBsZXgpCi0gICAgICAgICAgICBjb21wb25lbnRQYWdlTmFtZSA9IHNlcnZpY2VDb250ZXh0W2krK107Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGNvbXBvbmVudFBhZ2VOYW1lID0gcGFnZU5hbWU7Ci0KLSAgICAgICAgU3RyaW5nIHRhcmdldElkUGF0aCA9IHNlcnZpY2VDb250ZXh0W2krK107Ci0KLSAgICAgICAgSVBhZ2UgcGFnZSA9IGN5Y2xlLmdldFBhZ2UocGFnZU5hbWUpOwotCi0JCS8vIFNldHVwIHRoZSBwYWdlIGZvciB0aGUgcmV3aW5kLCB0aGVuIGRvIHRoZSByZXdpbmQuCi0KLQkJY3ljbGUuYWN0aXZhdGUocGFnZSk7Ci0JCQotICAgICAgICBJUGFnZSBjb21wb25lbnRQYWdlID0gY3ljbGUuZ2V0UGFnZShjb21wb25lbnRQYWdlTmFtZSk7Ci0gICAgICAgIElDb21wb25lbnQgY29tcG9uZW50ID0gY29tcG9uZW50UGFnZS5nZXROZXN0ZWRDb21wb25lbnQodGFyZ2V0SWRQYXRoKTsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgYWN0aW9uID0gKElBY3Rpb24pIGNvbXBvbmVudDsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGV4KQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIFRhcGVzdHJ5LmZvcm1hdCgiQWN0aW9uU2VydmljZS5jb21wb25lbnQtd3JvbmctdHlwZSIsIGNvbXBvbmVudC5nZXRFeHRlbmRlZElkKCkpLAotICAgICAgICAgICAgICAgIGNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICBudWxsLAotICAgICAgICAgICAgICAgIGV4KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIE9ubHkgcGVyZm9ybSB0aGUgc3RhdGVmdWwgY2hlY2sgaWYgdGhlIGFwcGxpY2F0aW9uIHdhcyBzdGF0ZWZ1bAotICAgICAgICAvLyB3aGVuIHRoZSBVUkwgd2FzIHJlbmRlcmVkLgotCi0gICAgICAgIGlmIChzdGF0ZWZ1bC5lcXVhbHMoU1RBVEVGVUxfT04pICYmIGFjdGlvbi5nZXRSZXF1aXJlc1Nlc3Npb24oKSkKLSAgICAgICAgewotICAgICAgICAgICAgSHR0cFNlc3Npb24gc2Vzc2lvbiA9IGN5Y2xlLmdldFJlcXVlc3RDb250ZXh0KCkuZ2V0U2Vzc2lvbigpOwotCi0gICAgICAgICAgICBpZiAoc2Vzc2lvbiA9PSBudWxsIHx8IHNlc3Npb24uaXNOZXcoKSkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU3RhbGVTZXNzaW9uRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBjeWNsZS5yZXdpbmRQYWdlKHRhcmdldEFjdGlvbklkLCBhY3Rpb24pOwotCi0gICAgICAgIC8vIER1cmluZyB0aGUgcmV3aW5kLCBhIGNvbXBvbmVudCBtYXkgY2hhbmdlIHRoZSBwYWdlLiAgVGhpcyB3aWxsIHRha2UKLSAgICAgICAgLy8gZWZmZWN0IGR1cmluZyB0aGUgc2Vjb25kIHJlbmRlciwgd2hpY2ggcmVuZGVycyB0aGUgSFRNTCByZXNwb25zZS4KLQotICAgICAgICAvLyBSZW5kZXIgdGhlIHJlc3BvbnNlLgotCi0gICAgICAgIGVuZ2luZS5yZW5kZXJSZXNwb25zZShjeWNsZSwgb3V0cHV0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIFRhcGVzdHJ5LkFDVElPTl9TRVJWSUNFOwotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9lbmdpbmUvQlNGTWFuYWdlclBvb2xhYmxlQWRhcHRvci5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2VuZ2luZS9CU0ZNYW5hZ2VyUG9vbGFibGVBZGFwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjMjBjN2UuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2VuZ2luZS9CU0ZNYW5hZ2VyUG9vbGFibGVBZGFwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5lbmdpbmU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmJzZi5CU0ZNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkudXRpbC5wb29sLklQb29sYWJsZUFkYXB0b3I7Ci0KLS8qKgotICogIEFsbG93cyBhIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LnV0aWwucG9vbC5Qb29sfSB0bwotICogIHByb3Blcmx5IHRlcm1pbmF0ZSBhIHtAbGluayBvcmcuYXBhY2hlLmJzZi5CU0ZNYW5hZ2VyfQotICogIHdoZW4gaXQgaXMgZGlzY2FyZGVkLgotICoKLSAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiAgQHZlcnNpb24gJElkJAotICogIEBzaW5jZSAzLjAKLSAqCi0gKiovCi0KLXB1YmxpYyBjbGFzcyBCU0ZNYW5hZ2VyUG9vbGFibGVBZGFwdG9yIGltcGxlbWVudHMgSVBvb2xhYmxlQWRhcHRvcgotewotICAgIC8qKgotICAgICAqICBEb2VzIG5vdGhpbmcuCi0gICAgICogCi0gICAgICoqLwotICAgIAotICAgIHB1YmxpYyB2b2lkIHJlc2V0Rm9yUG9vbChPYmplY3Qgb2JqZWN0KQotICAgIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgSW52b2tlcyB7QGxpbmsgb3JnLmFwYWNoZS5ic2YuQlNGTWFuYWdlciN0ZXJtaW5hdGUoKX0uCi0gICAgICogCi0gICAgICoqLwotICAgIAotICAgIHB1YmxpYyB2b2lkIGRpc2NhcmRGcm9tUG9vbChPYmplY3Qgb2JqZWN0KQotICAgIHsKLSAgICAgICAgQlNGTWFuYWdlciBtYW5hZ2VyID0gKEJTRk1hbmFnZXIpb2JqZWN0OwotICAgICAgICAKLSAgICAgICAgbWFuYWdlci50ZXJtaW5hdGUoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9lbmdpbmUvQmFzZUVuZ2luZS5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2VuZ2luZS9CYXNlRW5naW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2Zjk1YzIuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2VuZ2luZS9CYXNlRW5naW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzkgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuZW5naW5lOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0OwotaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuYnVpbGRlci5Ub1N0cmluZ0J1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5BcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVxdWVzdEN5Y2xlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuVGFwZXN0cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5yZWNvcmQuU2Vzc2lvblBhZ2VSZWNvcmRlcjsKLQotLyoqCi0gKiAgQ29uY3JldGUgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkuSUVuZ2luZX0gdXNlZCBmb3Igb3JkaW5hcnkKLSAqICBhcHBsaWNhdGlvbnMuICBBbGwgcGFnZSBzdGF0ZSBpbmZvcm1hdGlvbiBpcyBtYWludGFpbmVkIGluCi0gKiAgdGhlIHtAbGluayBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb259IHVzaW5nCi0gKiAgaW5zdGFuY2VzIG9mIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LnJlY29yZC5TZXNzaW9uUGFnZVJlY29yZGVyfS4KLSAqCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogIEB2ZXJzaW9uICRJZCQKLSAqIAotICoqLwotCi1wdWJsaWMgY2xhc3MgQmFzZUVuZ2luZSBleHRlbmRzIEFic3RyYWN0RW5naW5lCi17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTcwNTEwNTA2NDM3NDYzMzMzODBMOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IE1BUF9TSVpFID0gMzsKLQotICAgIHByaXZhdGUgdHJhbnNpZW50IE1hcCBfcmVjb3JkZXJzOwotCi0gICAgcHJpdmF0ZSB0cmFuc2llbnQgU2V0IF9hY3RpdmVQYWdlTmFtZXM7Ci0KLSAgICAvKioKLSAgICAgKiAgUmVtb3ZlcyBhbGwgcGFnZSByZWNvcmRlcnMgdGhhdCBjb250YWluIG5vIGNoYW5nZXMsIG9yCi0gICAgICogIGFyZSBtYXJrZWQgZm9yIGRpc2NhcmQuICBTdWJjbGFzc2VzCi0gICAgICogIHNob3VsZCBpbnZva2UgdGhpcyBpbXBsZW1lbnRhdGlvbiBpbiBhZGRpdGlvbiB0byBwcm92aWRpbmcKLSAgICAgKiAgdGhpZXIgb3duLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHJvdGVjdGVkIHZvaWQgY2xlYW51cEFmdGVyUmVxdWVzdChJUmVxdWVzdEN5Y2xlIGN5Y2xlKQotICAgIHsKLSAgICAgICAgaWYgKFRhcGVzdHJ5LmlzRW1wdHkoX3JlY29yZGVycykpCi0gICAgICAgICAgICByZXR1cm47Ci0KLQkJYm9vbGVhbiBtYXJrRGlydHkgPSBmYWxzZTsKLSAgICAgICAgSXRlcmF0b3IgaSA9IF9yZWNvcmRlcnMuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotCi0gICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaS5uZXh0KCk7Ci0gICAgICAgICAgICBTdHJpbmcgcGFnZU5hbWUgPSAoU3RyaW5nKSBlbnRyeS5nZXRLZXkoKTsKLSAgICAgICAgICAgIElQYWdlUmVjb3JkZXIgcmVjb3JkZXIgPSAoSVBhZ2VSZWNvcmRlcikgZW50cnkuZ2V0VmFsdWUoKTsKLQotICAgICAgICAgICAgaWYgKCFyZWNvcmRlci5nZXRIYXNDaGFuZ2VzKCkgfHwgcmVjb3JkZXIuaXNNYXJrZWRGb3JEaXNjYXJkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVjb3JkZXIuZGlzY2FyZCgpOwotCi0gICAgICAgICAgICAgICAgaS5yZW1vdmUoKTsKLQotICAgICAgICAgICAgICAgIF9hY3RpdmVQYWdlTmFtZXMucmVtb3ZlKHBhZ2VOYW1lKTsKLSAgICAgIAkKLSAgICAgIAkJCW1hcmtEaXJ0eSA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChtYXJrRGlydHkpCi0gICAgICAgIAltYXJrRGlydHkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBmb3JnZXRQYWdlKFN0cmluZyBuYW1lKQotICAgIHsKLSAgICAgICAgaWYgKF9yZWNvcmRlcnMgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBJUGFnZVJlY29yZGVyIHJlY29yZGVyID0gKElQYWdlUmVjb3JkZXIpIF9yZWNvcmRlcnMuZ2V0KG5hbWUpOwotICAgICAgICBpZiAocmVjb3JkZXIgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBpZiAocmVjb3JkZXIuaXNEaXJ0eSgpKQotICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICBUYXBlc3RyeS5mb3JtYXQoIkJhc2VFbmdpbmUucmVjb3JkZXItaGFzLXVuY29tbWl0ZWQtY2hhbmdlcyIsIG5hbWUpKTsKLQotICAgICAgICByZWNvcmRlci5kaXNjYXJkKCk7Ci0gICAgICAgIF9yZWNvcmRlcnMucmVtb3ZlKG5hbWUpOwotICAgICAgICBfYWN0aXZlUGFnZU5hbWVzLnJlbW92ZShuYW1lKTsKLSAgICAgICAgCi0gICAgICAgIG1hcmtEaXJ0eSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIGFuIHVubW9kaWZpYWJsZSB7QGxpbmsgQ29sbGVjdGlvbn0gb2YgdGhlIHBhZ2UgbmFtZXMgZm9yIHdoaWNoCi0gICAgICogIHtAbGluayBJUGFnZVJlY29yZGVyfSBpbnN0YW5jZXMgZXhpc3QuCi0gICAgICogCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgQ29sbGVjdGlvbiBnZXRBY3RpdmVQYWdlTmFtZXMoKQotICAgIHsKLSAgICAgICAgaWYgKF9hY3RpdmVQYWdlTmFtZXMgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCi0gICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVDb2xsZWN0aW9uKF9hY3RpdmVQYWdlTmFtZXMpOwotICAgIH0KLQotICAgIHB1YmxpYyBJUGFnZVJlY29yZGVyIGdldFBhZ2VSZWNvcmRlcihTdHJpbmcgcGFnZU5hbWUsIElSZXF1ZXN0Q3ljbGUgY3ljbGUpCi0gICAgewotICAgICAgICBpZiAoX2FjdGl2ZVBhZ2VOYW1lcyA9PSBudWxsIHx8ICFfYWN0aXZlUGFnZU5hbWVzLmNvbnRhaW5zKHBhZ2VOYW1lKSkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIElQYWdlUmVjb3JkZXIgcmVzdWx0ID0gbnVsbDsKLQotICAgICAgICBpZiAoX3JlY29yZGVycyAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCA9IChJUGFnZVJlY29yZGVyKSBfcmVjb3JkZXJzLmdldChwYWdlTmFtZSk7Ci0KLSAgICAgICAgLy8gU28gdGhlIHBhZ2UgaXMgYWN0aXZlLCBidXQgbm90IGluIHRoZSBjYWNoZSBvZiBwYWdlIHJlY29kZXJzLAotICAgICAgICAvLyBzbyAocmUtKWNyZWF0ZSB0aGUgcGFnZSByZWNvcmRlci4KLQotICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICByZXN1bHQgPSBjcmVhdGVQYWdlUmVjb3JkZXIocGFnZU5hbWUsIGN5Y2xlKTsKLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyBJUGFnZVJlY29yZGVyIGNyZWF0ZVBhZ2VSZWNvcmRlcihTdHJpbmcgcGFnZU5hbWUsIElSZXF1ZXN0Q3ljbGUgY3ljbGUpCi0gICAgewotICAgICAgICBpZiAoX3JlY29yZGVycyA9PSBudWxsKQotICAgICAgICAgICAgX3JlY29yZGVycyA9IG5ldyBIYXNoTWFwKE1BUF9TSVpFKTsKLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoX3JlY29yZGVycy5jb250YWluc0tleShwYWdlTmFtZSkpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgVGFwZXN0cnkuZm9ybWF0KCJCYXNlRW5naW5lLmR1cGxpY2F0ZS1wYWdlLXJlY29yZGVyIiwgcGFnZU5hbWUpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEZvcmNlIHRoZSBjcmVhdGlvbiBvZiB0aGUgSHR0cFNlc3Npb24KLQotICAgICAgICBjeWNsZS5nZXRSZXF1ZXN0Q29udGV4dCgpLmNyZWF0ZVNlc3Npb24oKTsKLSAgICAgICAgc2V0U3RhdGVmdWwoKTsKLSAgICAgICAKLQotICAgICAgICBJUGFnZVJlY29yZGVyIHJlc3VsdCA9IG5ldyBTZXNzaW9uUGFnZVJlY29yZGVyKCk7Ci0gICAgICAgIHJlc3VsdC5pbml0aWFsaXplKHBhZ2VOYW1lLCBjeWNsZSk7Ci0KLSAgICAgICAgX3JlY29yZGVycy5wdXQocGFnZU5hbWUsIHJlc3VsdCk7Ci0KLSAgICAgICAgaWYgKF9hY3RpdmVQYWdlTmFtZXMgPT0gbnVsbCkKLSAgICAgICAgICAgIF9hY3RpdmVQYWdlTmFtZXMgPSBuZXcgSGFzaFNldCgpOwotCi0gICAgICAgIF9hY3RpdmVQYWdlTmFtZXMuYWRkKHBhZ2VOYW1lKTsKLSAgICAgICAgCi0gICAgICAgIG1hcmtEaXJ0eSgpOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFJlY29uc3RydWN0cyB0aGUgbGlzdCBvZiBhY3RpdmUgcGFnZSBuYW1lcwotICAgICAqICB3cml0dGVuIGJ5IHtAbGluayAjd3JpdGVFeHRlcm5hbChPYmplY3RPdXRwdXQpfS4KLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCByZWFkRXh0ZXJuYWwoT2JqZWN0SW5wdXQgaW4pIHRocm93cyBJT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgc3VwZXIucmVhZEV4dGVybmFsKGluKTsKLQotICAgICAgICBpbnQgY291bnQgPSBpbi5yZWFkSW50KCk7Ci0KLSAgICAgICAgaWYgKGNvdW50ID4gMCkKLSAgICAgICAgICAgIF9hY3RpdmVQYWdlTmFtZXMgPSBuZXcgSGFzaFNldChjb3VudCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGluLnJlYWRVVEYoKTsKLQotICAgICAgICAgICAgX2FjdGl2ZVBhZ2VOYW1lcy5hZGQobmFtZSk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIC8qKgotICAgICAqICBXcml0ZXMgdGhlIGVuZ2luZSdzIHBlcnNpc3RlbnQgc3RhdGU7IHRoaXMgaXMgc2ltcGx5IHRoZSBsaXN0IG9mIGFjdGl2ZSBwYWdlCi0gICAgICogIG5hbWVzLiAgRm9yIGVmZmljaWVuY3ksIHRoaXMgaXMgd3JpdHRlbiBhcyBhIGNvdW50IGZvbGxvd2VkIGJ5IGVhY2ggbmFtZQotICAgICAqICBhcyBhIFVURiBTdHJpbmcuCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgd3JpdGVFeHRlcm5hbChPYmplY3RPdXRwdXQgb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHN1cGVyLndyaXRlRXh0ZXJuYWwob3V0KTsKLQotICAgICAgICBpZiAoVGFwZXN0cnkuaXNFbXB0eShfYWN0aXZlUGFnZU5hbWVzKSkKLSAgICAgICAgewotICAgICAgICAgICAgb3V0LndyaXRlSW50KDApOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGNvdW50ID0gX2FjdGl2ZVBhZ2VOYW1lcy5zaXplKCk7Ci0KLSAgICAgICAgb3V0LndyaXRlSW50KGNvdW50KTsKLQotICAgICAgICBJdGVyYXRvciBpID0gX2FjdGl2ZVBhZ2VOYW1lcy5pdGVyYXRvcigpOwotCi0gICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBpLm5leHQoKTsKLQotICAgICAgICAgICAgb3V0LndyaXRlVVRGKG5hbWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZXh0ZW5kRGVzY3JpcHRpb24oVG9TdHJpbmdCdWlsZGVyIGJ1aWxkZXIpCi0gICAgewotCQlidWlsZGVyLmFwcGVuZCgiYWN0aXZlUGFnZU5hbWVzIiwgX2FjdGl2ZVBhZ2VOYW1lcyk7Ci0gICAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2VuZ2luZS9Db21wb25lbnRNZXNzYWdlcy5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2VuZ2luZS9Db21wb25lbnRNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDgxMzA5Li4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9lbmdpbmUvQ29tcG9uZW50TWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5lbmdpbmU7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5UYXBlc3RyeTsKLQotLyoqCi0gKiAgSW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkuSU1lc3NhZ2VzfS4gIFRoaXMgaXMgYmFzaWNhbGx5Ci0gKiAgYSB3cmFwcGVyIGFyb3VuZCBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgUHJvcGVydGllc30uICBUaGlzIGVuc3VyZXMKLSAqICB0aGF0IHRoZSBwcm9wZXJ0aWVzIGFyZSwgaW4gZmFjdCwgcmVhZC1vbmx5ICh3aGljaCBlbnN1cmVzIHRoYXQKLSAqICB0aGV5IGRvbid0IGhhdmUgdG8gYmUgc3luY2hyb25pemVkKS4KLSAqCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogIEBzaW5jZSAyLjAuNAotICoKLSAqKi8KLQotcHVibGljIGNsYXNzIENvbXBvbmVudE1lc3NhZ2VzIGltcGxlbWVudHMgSU1lc3NhZ2VzCi17Ci0gICAgcHJpdmF0ZSBQcm9wZXJ0aWVzIF9wcm9wZXJ0aWVzOwotICAgIHByaXZhdGUgTG9jYWxlIF9sb2NhbGU7Ci0KLSAgICBwdWJsaWMgQ29tcG9uZW50TWVzc2FnZXMoTG9jYWxlIGxvY2FsZSwgUHJvcGVydGllcyBwcm9wZXJ0aWVzKQotICAgIHsKLSAgICAgICAgX2xvY2FsZSA9IGxvY2FsZTsKLSAgICAgICAgX3Byb3BlcnRpZXMgPSBwcm9wZXJ0aWVzOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcga2V5LCBTdHJpbmcgZGVmYXVsdFZhbHVlKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9wcm9wZXJ0aWVzLmdldFByb3BlcnR5KGtleSwgZGVmYXVsdFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGtleSkKLSAgICB7Ci0gICAgICAgIFN0cmluZyByZXN1bHQgPSBfcHJvcGVydGllcy5nZXRQcm9wZXJ0eShrZXkpOwotCi0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgICAgICAgIHJlc3VsdCA9ICJbIiArIGtleS50b1VwcGVyQ2FzZSgpICsgIl0iOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBmb3JtYXQoU3RyaW5nIGtleSwgT2JqZWN0IGFyZ3VtZW50MSwgT2JqZWN0IGFyZ3VtZW50MiwgT2JqZWN0IGFyZ3VtZW50MykKLSAgICB7Ci0gICAgICAgIHJldHVybiBmb3JtYXQoa2V5LCBuZXcgT2JqZWN0W10geyBhcmd1bWVudDEsIGFyZ3VtZW50MiwgYXJndW1lbnQzIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZm9ybWF0KFN0cmluZyBrZXksIE9iamVjdCBhcmd1bWVudDEsIE9iamVjdCBhcmd1bWVudDIpCi0gICAgewotICAgICAgICByZXR1cm4gZm9ybWF0KGtleSwgbmV3IE9iamVjdFtdIHsgYXJndW1lbnQxLCBhcmd1bWVudDIgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBmb3JtYXQoU3RyaW5nIGtleSwgT2JqZWN0IGFyZ3VtZW50KQotICAgIHsKLSAgICAgICAgcmV0dXJuIGZvcm1hdChrZXksIG5ldyBPYmplY3RbXSB7IGFyZ3VtZW50IH0pOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZm9ybWF0KFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3VtZW50cykKLSAgICB7Ci0gICAgICAgIFN0cmluZyBwYXR0ZXJuID0gZ2V0TWVzc2FnZShrZXkpOwotCi0gICAgICAgIC8vIFRoaXMgdWdsaW5lc3MgaXMgbWFuZGF0ZWQgZm9yIEpESyAxLjMgY29tcGF0aWJpbGl0eSwgd2hpY2ggaGFzIGEgYnVnIAotICAgICAgICAvLyBpbiBNZXNzYWdlRm9ybWF0IC4uLiB0aGUKLSAgICAgICAgLy8gcGF0dGVybiBpcyBhcHBsaWVkIGluIHRoZSBjb25zdHJ1Y3RvciwgdXNpbmcgdGhlIHN5c3RlbSBkZWZhdWx0IExvY2FsZSwKLSAgICAgICAgLy8gcmVnYXJkbGVzcyBvZiB3aGF0IGxvY2FsZSBpcyBsYXRlciBzcGVjaWZpZWQhCi0gICAgICAgIC8vIEl0IGFwcGVhcnMgdGhhdCB0aGUgcHJvYmxlbSBkb2VzIG5vdCBleGlzdCBpbiBKREsgMS40LgotCi0gICAgICAgIE1lc3NhZ2VGb3JtYXQgbWVzc2FnZUZvcm1hdCA9IG5ldyBNZXNzYWdlRm9ybWF0KCIiKTsKLSAgICAgICAgbWVzc2FnZUZvcm1hdC5zZXRMb2NhbGUoX2xvY2FsZSk7Ci0gICAgICAgIG1lc3NhZ2VGb3JtYXQuYXBwbHlQYXR0ZXJuKHBhdHRlcm4pOwotCi0gICAgICAgIGludCBjb3VudCA9IFRhcGVzdHJ5LnNpemUoYXJndW1lbnRzKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChhcmd1bWVudHNbaV0gaW5zdGFuY2VvZiBUaHJvd2FibGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVGhyb3dhYmxlIHQgPSAoVGhyb3dhYmxlKSBhcmd1bWVudHNbaV07Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSB0LmdldE1lc3NhZ2UoKTsKLQotICAgICAgICAgICAgICAgIGlmIChUYXBlc3RyeS5pc05vbkJsYW5rKG1lc3NhZ2UpKQotICAgICAgICAgICAgICAgICAgICBhcmd1bWVudHNbaV0gPSBtZXNzYWdlOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgYXJndW1lbnRzW2ldID0gdC5nZXRDbGFzcygpLmdldE5hbWUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBtZXNzYWdlRm9ybWF0LmZvcm1hdChhcmd1bWVudHMpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2VuZ2luZS9EZWZhdWx0Q29tcG9uZW50TWVzc2FnZXNTb3VyY2UuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9lbmdpbmUvRGVmYXVsdENvbXBvbmVudE1lc3NhZ2VzU291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1M2M0MzguLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2VuZ2luZS9EZWZhdWx0Q29tcG9uZW50TWVzc2FnZXNTb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NSArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5lbmdpbmU7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUNvbXBvbmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklNZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZXNvdXJjZUxvY2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuVGFwZXN0cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS51dGlsLk11bHRpS2V5OwotCi0vKioKLSAqICBHbG9iYWwgb2JqZWN0IChzdG9yZWQgaW4gdGhlIHNlcnZsZXQgY29udGV4dCkgdGhhdCBhY2Nlc3NlcwotICogIGxvY2FsaXplZCBwcm9wZXJ0aWVzIGZvciBhIGNvbXBvbmVudC4KLSAqCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogIEB2ZXJzaW9uICRJZCQKLSAqICBAc2luY2UgMi4wLjQKLSAqCi0gKiovCi0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0Q29tcG9uZW50TWVzc2FnZXNTb3VyY2UgaW1wbGVtZW50cyBJQ29tcG9uZW50TWVzc2FnZXNTb3VyY2UKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgTE9HID0gTG9nRmFjdG9yeS5nZXRMb2coRGVmYXVsdENvbXBvbmVudE1lc3NhZ2VzU291cmNlLmNsYXNzKTsKLQotICAgIHByaXZhdGUgUHJvcGVydGllcyBfZW1wdHlQcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoKTsKLQotICAgIC8qKgotICAgICAqICBNYXAgb2Yge0BsaW5rIFByb3BlcnRpZXN9LCBrZXllZCBvbiBhIHtAbGluayBNdWx0aUtleX0gb2YKLSAgICAgKiAgY29tcG9uZW50IHNwZWNpZmljYXRpb24gcGF0aCBhbmQgbG9jYWxlLgotICAgICAqIAotICAgICAqKi8KLQotICAgIHByaXZhdGUgTWFwIF9jYWNoZSA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgUHJvcGVydGllc30gY29udGFpbmluZwotICAgICAqICB0aGUgcHJvcGVybHkgbG9jYWxpemVkIG1lc3NhZ2VzIGZvciB0aGUgY29tcG9uZW50LAotICAgICAqICBpbiB0aGUge0BsaW5rIExvY2FsZX0gaWRlbnRpZmllZCBieSB0aGUgY29tcG9uZW50J3MKLSAgICAgKiAgY29udGFpbmluZyBwYWdlLgotICAgICAqIAotICAgICAqKi8KLQotICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgUHJvcGVydGllcyBnZXRMb2NhbGl6ZWRQcm9wZXJ0aWVzKElDb21wb25lbnQgY29tcG9uZW50KQotICAgIHsKLSAgICAgICAgaWYgKGNvbXBvbmVudCA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICBUYXBlc3RyeS5mb3JtYXQoImludmFsaWQtbnVsbC1wYXJhbWV0ZXIiLCAiY29tcG9uZW50IikpOwotCi0gICAgICAgIElSZXNvdXJjZUxvY2F0aW9uIHNwZWNpZmljYXRpb25Mb2NhdGlvbiA9Ci0gICAgICAgICAgICBjb21wb25lbnQuZ2V0U3BlY2lmaWNhdGlvbigpLmdldFNwZWNpZmljYXRpb25Mb2NhdGlvbigpOwotICAgICAgICBMb2NhbGUgbG9jYWxlID0gY29tcG9uZW50LmdldFBhZ2UoKS5nZXRMb2NhbGUoKTsKLQotICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgYWxyZWFkeSBpbiB0aGUgY2FjaGUKLQotICAgICAgICBNdWx0aUtleSBrZXkgPSBidWlsZEtleShzcGVjaWZpY2F0aW9uTG9jYXRpb24sIGxvY2FsZSk7Ci0KLSAgICAgICAgUHJvcGVydGllcyByZXN1bHQgPSAoUHJvcGVydGllcykgX2NhY2hlLmdldChrZXkpOwotCi0gICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0KLSAgICAgICAgLy8gTm90IGZvdW5kLCBjcmVhdGUgaXQgbm93LgotCi0gICAgICAgIHJlc3VsdCA9IGFzc2VtYmxlUHJvcGVydGllcyhzcGVjaWZpY2F0aW9uTG9jYXRpb24sIGxvY2FsZSk7Ci0KLSAgICAgICAgX2NhY2hlLnB1dChrZXksIHJlc3VsdCk7Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VGRklYID0gIi5wcm9wZXJ0aWVzIjsKLQotICAgIHByaXZhdGUgUHJvcGVydGllcyBhc3NlbWJsZVByb3BlcnRpZXMoSVJlc291cmNlTG9jYXRpb24gYmFzZVJlc291cmNlTG9jYXRpb24sIExvY2FsZSBsb2NhbGUpCi0gICAgewotICAgICAgICBib29sZWFuIGRlYnVnID0gTE9HLmlzRGVidWdFbmFibGVkKCk7Ci0gICAgICAgIGlmIChkZWJ1ZykKLSAgICAgICAgICAgIExPRy5kZWJ1ZygiQXNzZW1ibGluZyBwcm9wZXJ0aWVzIGZvciAiICsgYmFzZVJlc291cmNlTG9jYXRpb24gKyAiICIgKyBsb2NhbGUpOwotCi0gICAgICAgIFN0cmluZyBuYW1lID0gYmFzZVJlc291cmNlTG9jYXRpb24uZ2V0TmFtZSgpOwotCi0gICAgICAgIGludCBkb3R4ID0gbmFtZS5pbmRleE9mKCcuJyk7Ci0gICAgICAgIFN0cmluZyBiYXNlTmFtZSA9IG5hbWUuc3Vic3RyaW5nKDAsIGRvdHgpOwotCi0gICAgICAgIFN0cmluZyBsYW5ndWFnZSA9IGxvY2FsZS5nZXRMYW5ndWFnZSgpOwotICAgICAgICBTdHJpbmcgY291bnRyeSA9IGxvY2FsZS5nZXRDb3VudHJ5KCk7Ci0gICAgICAgIFN0cmluZyB2YXJpYW50ID0gbG9jYWxlLmdldFZhcmlhbnQoKTsKLQotICAgICAgICBQcm9wZXJ0aWVzIHBhcmVudCA9IChQcm9wZXJ0aWVzKSBfY2FjaGUuZ2V0KGJhc2VSZXNvdXJjZUxvY2F0aW9uKTsKLQotICAgICAgICBpZiAocGFyZW50ID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBhcmVudCA9IHJlYWRQcm9wZXJ0aWVzKGJhc2VSZXNvdXJjZUxvY2F0aW9uLCBiYXNlTmFtZSwgbnVsbCwgbnVsbCk7Ci0KLSAgICAgICAgICAgIGlmIChwYXJlbnQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICBwYXJlbnQgPSBfZW1wdHlQcm9wZXJ0aWVzOwotCi0gICAgICAgICAgICBfY2FjaGUucHV0KGJhc2VSZXNvdXJjZUxvY2F0aW9uLCBwYXJlbnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgUHJvcGVydGllcyByZXN1bHQgPSBwYXJlbnQ7Ci0KLSAgICAgICAgaWYgKCFUYXBlc3RyeS5pc0JsYW5rKGxhbmd1YWdlKSkKLSAgICAgICAgewotICAgICAgICAgICAgTG9jYWxlIGwgPSBuZXcgTG9jYWxlKGxhbmd1YWdlLCAiIik7Ci0gICAgICAgICAgICBNdWx0aUtleSBrZXkgPSBidWlsZEtleShiYXNlUmVzb3VyY2VMb2NhdGlvbiwgbCk7Ci0KLSAgICAgICAgICAgIHJlc3VsdCA9IChQcm9wZXJ0aWVzKSBfY2FjaGUuZ2V0KGtleSk7Ci0KLSAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXN1bHQgPSByZWFkUHJvcGVydGllcyhiYXNlUmVzb3VyY2VMb2NhdGlvbiwgYmFzZU5hbWUsIGwsIHBhcmVudCk7Ci0KLSAgICAgICAgICAgIF9jYWNoZS5wdXQoa2V5LCByZXN1bHQpOwotCi0gICAgICAgICAgICBwYXJlbnQgPSByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgbGFuZ3VhZ2UgPSAiIjsKLQotICAgICAgICBpZiAoVGFwZXN0cnkuaXNOb25CbGFuayhjb3VudHJ5KSkKLSAgICAgICAgewotICAgICAgICAgICAgTG9jYWxlIGwgPSBuZXcgTG9jYWxlKGxhbmd1YWdlLCBjb3VudHJ5KTsKLSAgICAgICAgICAgIE11bHRpS2V5IGtleSA9IGJ1aWxkS2V5KGJhc2VSZXNvdXJjZUxvY2F0aW9uLCBsKTsKLQotICAgICAgICAgICAgcmVzdWx0ID0gKFByb3BlcnRpZXMpIF9jYWNoZS5nZXQoa2V5KTsKLQotICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlYWRQcm9wZXJ0aWVzKGJhc2VSZXNvdXJjZUxvY2F0aW9uLCBiYXNlTmFtZSwgbCwgcGFyZW50KTsKLQotICAgICAgICAgICAgX2NhY2hlLnB1dChrZXksIHJlc3VsdCk7Ci0KLSAgICAgICAgICAgIHBhcmVudCA9IHJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICBjb3VudHJ5ID0gIiI7Ci0KLSAgICAgICAgaWYgKFRhcGVzdHJ5LmlzTm9uQmxhbmsodmFyaWFudCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIExvY2FsZSBsID0gbmV3IExvY2FsZShsYW5ndWFnZSwgY291bnRyeSwgdmFyaWFudCk7Ci0gICAgICAgICAgICBNdWx0aUtleSBrZXkgPSBidWlsZEtleShiYXNlUmVzb3VyY2VMb2NhdGlvbiwgbCk7Ci0KLSAgICAgICAgICAgIHJlc3VsdCA9IChQcm9wZXJ0aWVzKSBfY2FjaGUuZ2V0KGtleSk7Ci0KLSAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXN1bHQgPSByZWFkUHJvcGVydGllcyhiYXNlUmVzb3VyY2VMb2NhdGlvbiwgYmFzZU5hbWUsIGwsIHBhcmVudCk7Ci0KLSAgICAgICAgICAgIF9jYWNoZS5wdXQoa2V5LCByZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE11bHRpS2V5IGJ1aWxkS2V5KElSZXNvdXJjZUxvY2F0aW9uIGxvY2F0aW9uLCBMb2NhbGUgbG9jYWxlKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNdWx0aUtleShuZXcgT2JqZWN0W10geyBsb2NhdGlvbiwgbG9jYWxlLnRvU3RyaW5nKCl9LCBmYWxzZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBQcm9wZXJ0aWVzIHJlYWRQcm9wZXJ0aWVzKAotICAgICAgICBJUmVzb3VyY2VMb2NhdGlvbiBiYXNlTG9jYXRpb24sCi0gICAgICAgIFN0cmluZyBiYXNlTmFtZSwKLSAgICAgICAgTG9jYWxlIGxvY2FsZSwKLSAgICAgICAgUHJvcGVydGllcyBwYXJlbnQpCi0gICAgewotICAgICAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihiYXNlTmFtZSk7Ci0KLSAgICAgICAgaWYgKGxvY2FsZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBidWZmZXIuYXBwZW5kKCdfJyk7Ci0gICAgICAgICAgICBidWZmZXIuYXBwZW5kKGxvY2FsZS50b1N0cmluZygpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGJ1ZmZlci5hcHBlbmQoU1VGRklYKTsKLQotICAgICAgICBJUmVzb3VyY2VMb2NhdGlvbiBsb2NhbGl6ZWQgPSBiYXNlTG9jYXRpb24uZ2V0UmVsYXRpdmVMb2NhdGlvbihidWZmZXIudG9TdHJpbmcoKSk7Ci0KLSAgICAgICAgVVJMIHByb3BlcnRpZXNVUkwgPSBsb2NhbGl6ZWQuZ2V0UmVzb3VyY2VVUkwoKTsKLQotICAgICAgICBpZiAocHJvcGVydGllc1VSTCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIHBhcmVudDsKLQotICAgICAgICBQcm9wZXJ0aWVzIHJlc3VsdCA9IG51bGw7Ci0KLSAgICAgICAgaWYgKHBhcmVudCA9PSBudWxsKQotICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFByb3BlcnRpZXMoKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFByb3BlcnRpZXMocGFyZW50KTsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW5wdXQgPSBwcm9wZXJ0aWVzVVJMLm9wZW5TdHJlYW0oKTsKLQotICAgICAgICAgICAgcmVzdWx0LmxvYWQoaW5wdXQpOwotCi0gICAgICAgICAgICBpbnB1dC5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBleCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICBUYXBlc3RyeS5mb3JtYXQoIkNvbXBvbmVudFByb3BlcnRpZXNTdG9yZS51bmFibGUtdG8tcmVhZC1pbnB1dCIsIHByb3BlcnRpZXNVUkwpLAotICAgICAgICAgICAgICAgIGV4KTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIENsZWFycyB0aGUgY2FjaGUgb2YgcmVhZCBwcm9wZXJ0aWVzIGZpbGVzLgotICAgICAqIAotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkKLSAgICB7Ci0gICAgICAgIF9jYWNoZS5jbGVhcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBJTWVzc2FnZXMgZ2V0TWVzc2FnZXMoSUNvbXBvbmVudCBjb21wb25lbnQpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IENvbXBvbmVudE1lc3NhZ2VzKAotICAgICAgICAgICAgY29tcG9uZW50LmdldFBhZ2UoKS5nZXRMb2NhbGUoKSwKLSAgICAgICAgICAgIGdldExvY2FsaXplZFByb3BlcnRpZXMoY29tcG9uZW50KSk7Ci0gICAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2VuZ2luZS9EZWZhdWx0TW9uaXRvckZhY3RvcnkuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9lbmdpbmUvRGVmYXVsdE1vbml0b3JGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyODUyNGYuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2VuZ2luZS9EZWZhdWx0TW9uaXRvckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmVuZ2luZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkucmVxdWVzdC5SZXF1ZXN0Q29udGV4dDsKLQotLyoqCi0gKiBJbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5lbmdpbmUuSU1vbml0b3JGYWN0b3J5fQotICogdGhhdCByZXR1cm5zIHRoZSB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5lbmdpbmUuTnVsbE1vbml0b3J9LgotICoKLSAqIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqIEB2ZXJzaW9uICRJZCQKLSAqLwotcHVibGljIGNsYXNzIERlZmF1bHRNb25pdG9yRmFjdG9yeSBpbXBsZW1lbnRzIElNb25pdG9yRmFjdG9yeQotewotCXB1YmxpYyBzdGF0aWMgZmluYWwgSU1vbml0b3JGYWN0b3J5IFNIQVJFRCA9IG5ldyBEZWZhdWx0TW9uaXRvckZhY3RvcnkoKTsKLQkgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB7QGxpbmsgTnVsbE1vbml0b3IjU0hBUkVEfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgSU1vbml0b3IgY3JlYXRlTW9uaXRvcihSZXF1ZXN0Q29udGV4dCBjb250ZXh0KQotICAgIHsKLSAgICAgICAgcmV0dXJuIE51bGxNb25pdG9yLlNIQVJFRDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9lbmdpbmUvRGVmYXVsdFNjcmlwdFNvdXJjZS5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2VuZ2luZS9EZWZhdWx0U2NyaXB0U291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4YmE4NTcuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2VuZ2luZS9EZWZhdWx0U2NyaXB0U291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuZW5naW5lOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlc291cmNlTG9jYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVzb3VyY2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklTY3JpcHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5UYXBlc3RyeTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnNjcmlwdC5TY3JpcHRQYXJzZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS51dGlsLnhtbC5Eb2N1bWVudFBhcnNlRXhjZXB0aW9uOwotCi0vKioKLSAqICBQcm92aWRlcyBiYXNpYyBhY2Nlc3MgdG8gc2NyaXB0cyBhdmFpbGFibGUgb24gdGhlIGNsYXNzcGF0aC4gIFNjcmlwdHMgYXJlIGNhY2hlZCBpbgotICogIG1lbW9yeSBvbmNlIHBhcnNlZC4KLSAqCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogIEB2ZXJzaW9uICRJZCQKLSAqICBAc2luY2UgMS4wLjIKLSAqIAotICoqLwotCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFNjcmlwdFNvdXJjZSBpbXBsZW1lbnRzIElTY3JpcHRTb3VyY2UKLXsKLSAgICBwcml2YXRlIElSZXNvdXJjZVJlc29sdmVyIF9yZXNvbHZlcjsKLQotICAgIHByaXZhdGUgTWFwIF9jYWNoZSA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICBwdWJsaWMgRGVmYXVsdFNjcmlwdFNvdXJjZShJUmVzb3VyY2VSZXNvbHZlciByZXNvbHZlcikKLSAgICB7Ci0gICAgICAgIF9yZXNvbHZlciA9IHJlc29sdmVyOwotICAgIH0KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZXNldCgpCi0gICAgewotICAgICAgICBfY2FjaGUuY2xlYXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIElTY3JpcHQgZ2V0U2NyaXB0KElSZXNvdXJjZUxvY2F0aW9uIHNjcmlwdExvY2F0aW9uKQotICAgIHsKLSAgICAgICAgSVNjcmlwdCByZXN1bHQgPSAoSVNjcmlwdCkgX2NhY2hlLmdldChzY3JpcHRMb2NhdGlvbik7Ci0KLSAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLQotICAgICAgICByZXN1bHQgPSBwYXJzZShzY3JpcHRMb2NhdGlvbik7Ci0KLSAgICAgICAgX2NhY2hlLnB1dChzY3JpcHRMb2NhdGlvbiwgcmVzdWx0KTsKLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHByaXZhdGUgSVNjcmlwdCBwYXJzZShJUmVzb3VyY2VMb2NhdGlvbiBsb2NhdGlvbikKLSAgICB7Ci0gICAgICAgIFNjcmlwdFBhcnNlciBwYXJzZXIgPSBuZXcgU2NyaXB0UGFyc2VyKF9yZXNvbHZlcik7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBwYXJzZXIucGFyc2UobG9jYXRpb24pOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChEb2N1bWVudFBhcnNlRXhjZXB0aW9uIGV4KQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIFRhcGVzdHJ5LmZvcm1hdCgiRGVmYXVsdFNjcmlwdFNvdXJjZS51bmFibGUtdG8tcGFyc2Utc2NyaXB0IiwgbG9jYXRpb24pLAotICAgICAgICAgICAgICAgIGV4KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICAgIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoIkRlZmF1bHRTY3JpcHRTb3VyY2VAIik7Ci0gICAgICAgIGJ1ZmZlci5hcHBlbmQoSW50ZWdlci50b0hleFN0cmluZyhoYXNoQ29kZSgpKSk7Ci0KLSAgICAgICAgYnVmZmVyLmFwcGVuZCgnWycpOwotCi0gICAgICAgIGlmIChfY2FjaGUgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgc3luY2hyb25pemVkIChfY2FjaGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChfY2FjaGUua2V5U2V0KCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBidWZmZXIuYXBwZW5kKCIsICIpOwotICAgICAgICB9Ci0KLSAgICAgICAgYnVmZmVyLmFwcGVuZCgiXSIpOwotCi0gICAgICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLSAgICB9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZW5naW5lL0RlZmF1bHRTcGVjaWZpY2F0aW9uU291cmNlLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZW5naW5lL0RlZmF1bHRTcGVjaWZpY2F0aW9uU291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2ZGQwMjAuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2VuZ2luZS9EZWZhdWx0U3BlY2lmaWNhdGlvblNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUyICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmVuZ2luZTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5idWlsZGVyLlRvU3RyaW5nQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LkFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklNYXJrdXBXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlc291cmNlTG9jYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVzb3VyY2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LlRhcGVzdHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkucGFyc2UuU3BlY2lmaWNhdGlvblBhcnNlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnJlc291cmNlLkNsYXNzcGF0aFJlc291cmNlTG9jYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5zcGVjLklBcHBsaWNhdGlvblNwZWNpZmljYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5zcGVjLklDb21wb25lbnRTcGVjaWZpY2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuc3BlYy5JTGlicmFyeVNwZWNpZmljYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5zcGVjLkxpYnJhcnlTcGVjaWZpY2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkudXRpbC5JUmVuZGVyRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS51dGlsLnBvb2wuUG9vbDsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnV0aWwueG1sLkRvY3VtZW50UGFyc2VFeGNlcHRpb247Ci0KLS8qKgotICogIERlZmF1bHQgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIElTcGVjaWZpY2F0aW9uU291cmNlfSB0aGF0Ci0gKiAgZXhwZWN0cyB0byB1c2UgdGhlIG5vcm1hbCBjbGFzcyBsb2FkZXIgdG8gbG9jYXRlIGNvbXBvbmVudAotICogIHNwZWNpZmljYXRpb25zIGZyb20gd2l0aGluIHRoZSBjbGFzc3BhdGguCi0gKgotICogPHA+Q2FjaGVzIHNwZWNpZmljYXRpb25zIGluIG1lbW9yeSBmb3JldmVyLCBvciB1bnRpbCB7QGxpbmsgI3Jlc2V0KCl9IGlzIGludm9rZWQuCi0gKgotICogPHA+QW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBhY3RzIGxpa2UgYSBzaW5nbGV0b24gYW5kIGlzIHNoYXJlZCBieSBtdWx0aXBsZSBzZXNzaW9ucywKLSAqIHNvIGl0IG11c3QgYmUgdGhyZWFkc2FmZS4KLSAqCi0gKiBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiBAdmVyc2lvbiAkSWQkCi0gKiAKLSAqKi8KLQotcHVibGljIGNsYXNzIERlZmF1bHRTcGVjaWZpY2F0aW9uU291cmNlIGltcGxlbWVudHMgSVNwZWNpZmljYXRpb25Tb3VyY2UsIElSZW5kZXJEZXNjcmlwdGlvbgotewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBMT0cgPSBMb2dGYWN0b3J5LmdldExvZyhEZWZhdWx0U3BlY2lmaWNhdGlvblNvdXJjZS5jbGFzcyk7Ci0KLSAgICAvKioKLSAgICAgKiAgS2V5IHVzZWQgdG8gZ2V0IGFuZCBzdG9yZSB7QGxpbmsgU3BlY2lmaWNhdGlvblBhcnNlcn0gaW5zdGFuY2VzCi0gICAgICogIGZyb20gdGhlIFBvb2wuCi0gICAgICogCi0gICAgICogIEBzaW5jZSAzLjAKLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSU0VSX1BPT0xfS0VZID0gIm9yZy5hcGFjaGUudGFwZXN0cnkuU3BlY2lmaWNhdGlvblBhcnNlciI7Ci0KLSAgICBwcml2YXRlIElSZXNvdXJjZVJlc29sdmVyIF9yZXNvbHZlcjsKLSAgICBwcml2YXRlIElBcHBsaWNhdGlvblNwZWNpZmljYXRpb24gX3NwZWNpZmljYXRpb247Ci0KLSAgICBwcml2YXRlIElOYW1lc3BhY2UgX2FwcGxpY2F0aW9uTmFtZXNwYWNlOwotICAgIHByaXZhdGUgSU5hbWVzcGFjZSBfZnJhbWV3b3JrTmFtZXNwYWNlOwotCi0gICAgLyoqCi0gICAgICogIENvbnRhaW5zIHByZXZpb3VzbHkgcGFyc2VkIGNvbXBvbmVudCBzcGVjaWZpY2F0aW9ucy4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHByaXZhdGUgTWFwIF9jb21wb25lbnRDYWNoZSA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICAvKioKLSAgICAgKiAgQ29udGFpbnMgcHJldmlvdXNseSBwYXJzZWQgcGFnZSBzcGVjaWZpY2F0aW9ucy4KLSAgICAgKiAKLSAgICAgKiAgQHNpbmNlIDIuMgotICAgICAqIAotICAgICAqKi8KLQotICAgIHByaXZhdGUgTWFwIF9wYWdlQ2FjaGUgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgLyoqCi0gICAgICogIENvbnRhaW5zIHByZXZpb3VzbHkgcGFyc2VkIGxpYnJhcnkgc3BlY2lmaWNhdGlvbnMsIGtleWVkCi0gICAgICogIG9uIHNwZWNpZmljYXRpb24gcmVzb3VyY2UgcGF0aC4KLSAgICAgKiAKLSAgICAgKiAgQHNpbmNlIDIuMgotICAgICAqIAotICAgICAqKi8KLQotICAgIHByaXZhdGUgTWFwIF9saWJyYXJ5Q2FjaGUgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgLyoqCi0gICAgICogIENvbnRhaW5zIHtAbGluayBJTmFtZXNwYWNlfSBpbnN0YW5jZXMsIGtleWVkIG9uIGlkICh3aGljaCB3aWxsCi0gICAgICogIGJlIG51bGwgZm9yIHRoZSBhcHBsaWNhdGlvbiBzcGVjaWZpY2F0aW9uKS4KLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwcml2YXRlIE1hcCBfbmFtZXNwYWNlQ2FjaGUgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgLyoqCi0gICAgICogIFJlZmVyZW5jZSB0byB0aGUgc2hhcmVkIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LnV0aWwucG9vbC5Qb29sfS4KLSAgICAgKiAKLSAgICAgKiAgQHNlZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LklFbmdpbmUjZ2V0UG9vbCgpCi0gICAgICogCi0gICAgICogIEBzaW5jZSAzLjAKLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwcml2YXRlIFBvb2wgX3Bvb2w7Ci0KLSAgICBwdWJsaWMgRGVmYXVsdFNwZWNpZmljYXRpb25Tb3VyY2UoCi0gICAgICAgIElSZXNvdXJjZVJlc29sdmVyIHJlc29sdmVyLAotICAgICAgICBJQXBwbGljYXRpb25TcGVjaWZpY2F0aW9uIHNwZWNpZmljYXRpb24sCi0gICAgICAgIFBvb2wgcG9vbCkKLSAgICB7Ci0gICAgICAgIF9yZXNvbHZlciA9IHJlc29sdmVyOwotICAgICAgICBfc3BlY2lmaWNhdGlvbiA9IHNwZWNpZmljYXRpb247Ci0gICAgICAgIF9wb29sID0gcG9vbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgQ2xlYXJzIHRoZSBzcGVjaWZpY2F0aW9uIGNhY2hlLiAgVGhpcyBpcyB1c2VkIGR1cmluZyBkZWJ1Z2dpbmcuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVzZXQoKQotICAgIHsKLSAgICAgICAgX2NvbXBvbmVudENhY2hlLmNsZWFyKCk7Ci0gICAgICAgIF9wYWdlQ2FjaGUuY2xlYXIoKTsKLSAgICAgICAgX2xpYnJhcnlDYWNoZS5jbGVhcigpOwotICAgICAgICBfbmFtZXNwYWNlQ2FjaGUuY2xlYXIoKTsKLQotICAgICAgICBfYXBwbGljYXRpb25OYW1lc3BhY2UgPSBudWxsOwotICAgICAgICBfZnJhbWV3b3JrTmFtZXNwYWNlID0gbnVsbDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgSUNvbXBvbmVudFNwZWNpZmljYXRpb24gcGFyc2VTcGVjaWZpY2F0aW9uKAotICAgICAgICBJUmVzb3VyY2VMb2NhdGlvbiByZXNvdXJjZUxvY2F0aW9uLAotICAgICAgICBib29sZWFuIGFzUGFnZSkKLSAgICB7Ci0gICAgICAgIElDb21wb25lbnRTcGVjaWZpY2F0aW9uIHJlc3VsdCA9IG51bGw7Ci0KLSAgICAgICAgaWYgKExPRy5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICAgICAgTE9HLmRlYnVnKCJQYXJzaW5nIGNvbXBvbmVudCBzcGVjaWZpY2F0aW9uICIgKyByZXNvdXJjZUxvY2F0aW9uKTsKLQotICAgICAgICBTcGVjaWZpY2F0aW9uUGFyc2VyIHBhcnNlciA9IGdldFBhcnNlcigpOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoYXNQYWdlKQotICAgICAgICAgICAgICAgIHJlc3VsdCA9IHBhcnNlci5wYXJzZVBhZ2VTcGVjaWZpY2F0aW9uKHJlc291cmNlTG9jYXRpb24pOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHJlc3VsdCA9IHBhcnNlci5wYXJzZUNvbXBvbmVudFNwZWNpZmljYXRpb24ocmVzb3VyY2VMb2NhdGlvbik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKERvY3VtZW50UGFyc2VFeGNlcHRpb24gZXgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgVGFwZXN0cnkuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAiRGVmYXVsdFNwZWNpZmljYXRpb25Tb3VyY2UudW5hYmxlLXRvLXBhcnNlLXNwZWNpZmljYXRpb24iLAotICAgICAgICAgICAgICAgICAgICByZXNvdXJjZUxvY2F0aW9uKSwKLSAgICAgICAgICAgICAgICBleCk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBkaXNjYXJkUGFyc2VyKHBhcnNlcik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHByb3RlY3RlZCBJTGlicmFyeVNwZWNpZmljYXRpb24gcGFyc2VMaWJyYXJ5U3BlY2lmaWNhdGlvbihJUmVzb3VyY2VMb2NhdGlvbiByZXNvdXJjZUxvY2F0aW9uKQotICAgIHsKLSAgICAgICAgaWYgKExPRy5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICAgICAgTE9HLmRlYnVnKCJQYXJzaW5nIGxpYnJhcnkgc3BlY2lmaWNhdGlvbiAiICsgcmVzb3VyY2VMb2NhdGlvbik7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRQYXJzZXIoKS5wYXJzZUxpYnJhcnlTcGVjaWZpY2F0aW9uKHJlc291cmNlTG9jYXRpb24pOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChEb2N1bWVudFBhcnNlRXhjZXB0aW9uIGV4KQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIFRhcGVzdHJ5LmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgIkRlZmF1bHRTcGVjaWZpY2F0aW9uU291cmNlLnVuYWJsZS10by1wYXJzZS1zcGVjaWZpY2F0aW9uIiwKLSAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VMb2NhdGlvbiksCi0gICAgICAgICAgICAgICAgZXgpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIFN0cmluZyB0b1N0cmluZygpCi0gICAgewotICAgICAgICBUb1N0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBUb1N0cmluZ0J1aWxkZXIodGhpcyk7Ci0KLSAgICAgICAgYnVpbGRlci5hcHBlbmQoImFwcGxpY2F0aW9uTmFtZXNwYWNlIiwgX2FwcGxpY2F0aW9uTmFtZXNwYWNlKTsKLSAgICAgICAgYnVpbGRlci5hcHBlbmQoImZyYW1ld29ya05hbWVzcGFjZSIsIF9mcmFtZXdvcmtOYW1lc3BhY2UpOwotICAgICAgICBidWlsZGVyLmFwcGVuZCgic3BlY2lmaWNhdGlvbiIsIF9zcGVjaWZpY2F0aW9uKTsKLQotICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKiBAc2luY2UgMS4wLjYgKiovCi0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVuZGVyRGVzY3JpcHRpb24oSU1hcmt1cFdyaXRlciB3cml0ZXIpCi0gICAgewotICAgICAgICB3cml0ZXIucHJpbnQoIkRlZmF1bHRTcGVjaWZpY2F0aW9uU291cmNlWyIpOwotCi0gICAgICAgIHdyaXRlQ2FjaGVEZXNjcmlwdGlvbih3cml0ZXIsICJwYWdlIiwgX3BhZ2VDYWNoZSk7Ci0gICAgICAgIHdyaXRlci5iZWdpbkVtcHR5KCJiciIpOwotICAgICAgICB3cml0ZXIucHJpbnRsbigpOwotCi0gICAgICAgIHdyaXRlQ2FjaGVEZXNjcmlwdGlvbih3cml0ZXIsICJjb21wb25lbnQiLCBfY29tcG9uZW50Q2FjaGUpOwotICAgICAgICB3cml0ZXIucHJpbnQoIl0iKTsKLSAgICAgICAgd3JpdGVyLnByaW50bG4oKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgd3JpdGVDYWNoZURlc2NyaXB0aW9uKElNYXJrdXBXcml0ZXIgd3JpdGVyLCBTdHJpbmcgbmFtZSwgTWFwIGNhY2hlKQotICAgIHsKLSAgICAgICAgU2V0IGtleVNldCA9IGNhY2hlLmtleVNldCgpOwotCi0gICAgICAgIHdyaXRlci5wcmludChUYXBlc3RyeS5zaXplKGtleVNldCkpOwotICAgICAgICB3cml0ZXIucHJpbnQoIiBjYWNoZWQgIik7Ci0gICAgICAgIHdyaXRlci5wcmludChuYW1lKTsKLSAgICAgICAgd3JpdGVyLnByaW50KCIgc3BlY2lmaWNhdGlvbnM6Iik7Ci0KLSAgICAgICAgYm9vbGVhbiBmaXJzdCA9IHRydWU7Ci0KLSAgICAgICAgSXRlcmF0b3IgaSA9IGtleVNldC5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaS5oYXNOZXh0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIFRoZSBrZXlzIGFyZSBub3cgSVJlc291cmNlTG9jYXRpb24gaW5zdGFuY2VzCi0KLSAgICAgICAgICAgIE9iamVjdCBrZXkgPSBpLm5leHQoKTsKLQotICAgICAgICAgICAgaWYgKGZpcnN0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHdyaXRlci5iZWdpbigidWwiKTsKLSAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB3cml0ZXIuYmVnaW4oImxpIik7Ci0gICAgICAgICAgICB3cml0ZXIucHJpbnQoa2V5LnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgd3JpdGVyLmVuZCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFmaXJzdCkKLSAgICAgICAgICAgIHdyaXRlci5lbmQoKTsgLy8gPHVsPgotICAgIH0KLQotICAgIC8qKgotICAgICAqICBHZXRzIGEgY29tcG9uZW50IHNwZWNpZmljYXRpb24uCi0gICAgICogCi0gICAgICogIEBwYXJhbSByZXNvdXJjZUxvY2F0aW9uIHRoZSBjb21wbGV0ZSByZXNvdXJjZSBwYXRoIHRvIHRoZSBzcGVjaWZpY2F0aW9uLgotICAgICAqICBAdGhyb3dzIEFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbiBpZiB0aGUgc3BlY2lmaWNhdGlvbiBjYW5ub3QgYmUgb2J0YWluZWQuCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBJQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBnZXRDb21wb25lbnRTcGVjaWZpY2F0aW9uKElSZXNvdXJjZUxvY2F0aW9uIHJlc291cmNlTG9jYXRpb24pCi0gICAgewotICAgICAgICBJQ29tcG9uZW50U3BlY2lmaWNhdGlvbiByZXN1bHQgPQotICAgICAgICAgICAgKElDb21wb25lbnRTcGVjaWZpY2F0aW9uKSBfY29tcG9uZW50Q2FjaGUuZ2V0KHJlc291cmNlTG9jYXRpb24pOwotCi0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0ID0gcGFyc2VTcGVjaWZpY2F0aW9uKHJlc291cmNlTG9jYXRpb24sIGZhbHNlKTsKLQotICAgICAgICAgICAgX2NvbXBvbmVudENhY2hlLnB1dChyZXNvdXJjZUxvY2F0aW9uLCByZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIElDb21wb25lbnRTcGVjaWZpY2F0aW9uIGdldFBhZ2VTcGVjaWZpY2F0aW9uKElSZXNvdXJjZUxvY2F0aW9uIHJlc291cmNlTG9jYXRpb24pCi0gICAgewotICAgICAgICBJQ29tcG9uZW50U3BlY2lmaWNhdGlvbiByZXN1bHQgPSAoSUNvbXBvbmVudFNwZWNpZmljYXRpb24pIF9wYWdlQ2FjaGUuZ2V0KHJlc291cmNlTG9jYXRpb24pOwotCi0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0ID0gcGFyc2VTcGVjaWZpY2F0aW9uKHJlc291cmNlTG9jYXRpb24sIHRydWUpOwotCi0gICAgICAgICAgICBfcGFnZUNhY2hlLnB1dChyZXNvdXJjZUxvY2F0aW9uLCByZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIElMaWJyYXJ5U3BlY2lmaWNhdGlvbiBnZXRMaWJyYXJ5U3BlY2lmaWNhdGlvbihJUmVzb3VyY2VMb2NhdGlvbiByZXNvdXJjZUxvY2F0aW9uKQotICAgIHsKLSAgICAgICAgSUxpYnJhcnlTcGVjaWZpY2F0aW9uIHJlc3VsdCA9IChMaWJyYXJ5U3BlY2lmaWNhdGlvbikgX2xpYnJhcnlDYWNoZS5nZXQocmVzb3VyY2VMb2NhdGlvbik7Ci0KLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQgPSBwYXJzZUxpYnJhcnlTcGVjaWZpY2F0aW9uKHJlc291cmNlTG9jYXRpb24pOwotICAgICAgICAgICAgX2xpYnJhcnlDYWNoZS5wdXQocmVzb3VyY2VMb2NhdGlvbiwgcmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqIEBzaW5jZSAyLjIgKiovCi0KLSAgICBwcm90ZWN0ZWQgU3BlY2lmaWNhdGlvblBhcnNlciBnZXRQYXJzZXIoKQotICAgIHsKLSAgICAgICAgU3BlY2lmaWNhdGlvblBhcnNlciByZXN1bHQgPSAoU3BlY2lmaWNhdGlvblBhcnNlcikgX3Bvb2wucmV0cmlldmUoUEFSU0VSX1BPT0xfS0VZKTsKLQotICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICByZXN1bHQgPSBuZXcgU3BlY2lmaWNhdGlvblBhcnNlcihfcmVzb2x2ZXIpOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqIEBzaW5jZSAzLjAgKiovCi0KLSAgICBwcm90ZWN0ZWQgdm9pZCBkaXNjYXJkUGFyc2VyKFNwZWNpZmljYXRpb25QYXJzZXIgcGFyc2VyKQotICAgIHsKLSAgICAgICAgX3Bvb2wuc3RvcmUoUEFSU0VSX1BPT0xfS0VZLCBwYXJzZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgSU5hbWVzcGFjZSBnZXRBcHBsaWNhdGlvbk5hbWVzcGFjZSgpCi0gICAgewotICAgICAgICBpZiAoX2FwcGxpY2F0aW9uTmFtZXNwYWNlID09IG51bGwpCi0gICAgICAgICAgICBfYXBwbGljYXRpb25OYW1lc3BhY2UgPSBuZXcgTmFtZXNwYWNlKG51bGwsIG51bGwsIF9zcGVjaWZpY2F0aW9uLCB0aGlzKTsKLQotICAgICAgICByZXR1cm4gX2FwcGxpY2F0aW9uTmFtZXNwYWNlOwotICAgIH0KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgSU5hbWVzcGFjZSBnZXRGcmFtZXdvcmtOYW1lc3BhY2UoKQotICAgIHsKLSAgICAgICAgaWYgKF9mcmFtZXdvcmtOYW1lc3BhY2UgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgSVJlc291cmNlTG9jYXRpb24gZnJhbWV3b3JrTG9jYXRpb24gPQotICAgICAgICAgICAgICAgIG5ldyBDbGFzc3BhdGhSZXNvdXJjZUxvY2F0aW9uKF9yZXNvbHZlciwgIi9vcmcvYXBhY2hlL3RhcGVzdHJ5L0ZyYW1ld29yay5saWJyYXJ5Iik7Ci0KLSAgICAgICAgICAgIElMaWJyYXJ5U3BlY2lmaWNhdGlvbiBscyA9IGdldExpYnJhcnlTcGVjaWZpY2F0aW9uKGZyYW1ld29ya0xvY2F0aW9uKTsKLQotICAgICAgICAgICAgX2ZyYW1ld29ya05hbWVzcGFjZSA9IG5ldyBOYW1lc3BhY2UoSU5hbWVzcGFjZS5GUkFNRVdPUktfTkFNRVNQQUNFLCBudWxsLCBscywgdGhpcyk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gX2ZyYW1ld29ya05hbWVzcGFjZTsKLSAgICB9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZW5naW5lL0RlZmF1bHRUZW1wbGF0ZVNvdXJjZS5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2VuZ2luZS9EZWZhdWx0VGVtcGxhdGVTb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ3NjVlMS4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZW5naW5lL0RlZmF1bHRUZW1wbGF0ZVNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjI4ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmVuZ2luZTsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5idWlsZGVyLlRvU3RyaW5nQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LkFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklBc3NldDsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JRW5naW5lOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUxvY2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSU1hcmt1cFdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVxdWVzdEN5Y2xlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlc291cmNlTG9jYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5UYXBlc3RyeTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnBhcnNlLkNvbXBvbmVudFRlbXBsYXRlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkucGFyc2UuSVRlbXBsYXRlUGFyc2VyRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5wYXJzZS5UZW1wbGF0ZVBhcnNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkucGFyc2UuVGVtcGxhdGVQYXJzZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5wYXJzZS5UZW1wbGF0ZVRva2VuOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkucmVzb2x2ZXIuQ29tcG9uZW50U3BlY2lmaWNhdGlvblJlc29sdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuc3BlYy5JQXBwbGljYXRpb25TcGVjaWZpY2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuc3BlYy5JQ29tcG9uZW50U3BlY2lmaWNhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnV0aWwuRGVsZWdhdGluZ1Byb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkudXRpbC5JUmVuZGVyRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS51dGlsLkxvY2FsaXplZFByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkudXRpbC5NdWx0aUtleTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnV0aWwuUHJvcGVydHlIb2xkZXJQcm9wZXJ0eVNvdXJjZTsKLQotLyoqCi0gKiAgRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgSVRlbXBsYXRlU291cmNlfS4gIFRlbXBsYXRlcywgb25jZSBwYXJzZWQsCi0gKiAgc3RheSBpbiBtZW1vcnkgdW50aWwgZXhwbGljaXRseSBjbGVhcmVkLgotICoKLSAqICA8cD5BbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGFjdHMgYXMgYSBzaW5nbGV0b24gc2hhcmVkIGJ5IGFsbCBzZXNzaW9ucywgc28gaXQKLSAqICBtdXN0IGJlIHRocmVhZHNhZmUuCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAKLSAqKi8KLQotcHVibGljIGNsYXNzIERlZmF1bHRUZW1wbGF0ZVNvdXJjZSBpbXBsZW1lbnRzIElUZW1wbGF0ZVNvdXJjZSwgSVJlbmRlckRlc2NyaXB0aW9uCi17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIExPRyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKERlZmF1bHRUZW1wbGF0ZVNvdXJjZS5jbGFzcyk7Ci0KLQotICAgIC8vIFRoZSBuYW1lIG9mIHRoZSBjb21wb25lbnQvYXBwbGljYXRpb24vZXRjIHByb3BlcnR5IHRoYXQgd2lsbCBiZSB1c2VkIHRvCi0gICAgLy8gZGV0ZXJtaW5lIHRoZSBlbmNvZGluZyB0byB1c2Ugd2hlbiBsb2FkaW5nIHRoZSB0ZW1wbGF0ZQotICAgICAgICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFTVBMQVRFX0VOQ09ESU5HX1BST1BFUlRZX05BTUUgPSAib3JnLmFwYWNoZS50YXBlc3RyeS50ZW1wbGF0ZS1lbmNvZGluZyI7IAotCi0gICAgLy8gQ2FjaGUgb2YgcHJldmlvdXNseSByZXRyaWV2ZWQgdGVtcGxhdGVzLiAgS2V5IGlzIGEgbXVsdGkta2V5IG9mIAotICAgIC8vIHNwZWNpZmljYXRpb24gcmVzb3VyY2UgcGF0aCBhbmQgbG9jYWxlIChsb2NhbCBtYXkgYmUgbnVsbCksIHZhbHVlCi0gICAgLy8gaXMgdGhlIENvbXBvbmVudFRlbXBsYXRlLgotCi0gICAgcHJpdmF0ZSBNYXAgX2NhY2hlID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTWFwKG5ldyBIYXNoTWFwKCkpOwotCi0gICAgLy8gUHJldmlvdXNseSByZWFkIHRlbXBsYXRlczsga2V5IGlzIHRoZSBJUmVzb3VyY2VMb2NhdGlvbiwgdmFsdWUKLSAgICAvLyBpcyB0aGUgQ29tcG9uZW50VGVtcGxhdGUuCi0KLSAgICBwcml2YXRlIE1hcCBfdGVtcGxhdGVzID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTWFwKG5ldyBIYXNoTWFwKCkpOwotCi0gICAgLyoqCi0gICAgICogIE51bWJlciBvZiB0b2tlbnMgKGVhY2ggdGVtcGxhdGUgY29udGFpbnMgbXVsdGlwbGUgdG9rZW5zKS4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHByaXZhdGUgaW50IF90b2tlbkNvdW50OwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJVRkZFUl9TSVpFID0gMjAwMDsKLQotICAgIHByaXZhdGUgVGVtcGxhdGVQYXJzZXIgX3BhcnNlcjsKLQotICAgIC8qKiBAc2luY2UgMi4yICoqLwotCi0gICAgcHJpdmF0ZSBJUmVzb3VyY2VMb2NhdGlvbiBfYXBwbGljYXRpb25Sb290TG9jYXRpb247Ci0KLSAgICAvKiogQHNpbmNlIDMuMCAqKi8KLQotICAgIHByaXZhdGUgSVRlbXBsYXRlU291cmNlRGVsZWdhdGUgX2RlbGVnYXRlOwotCi0gICAgLyoqCi0gICAgICogIENsZWFycyB0aGUgdGVtcGxhdGUgY2FjaGUuICBUaGlzIGlzIHVzZWQgZHVyaW5nIGRlYnVnZ2luZy4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkKLSAgICB7Ci0gICAgICAgIF9jYWNoZS5jbGVhcigpOwotICAgICAgICBfdGVtcGxhdGVzLmNsZWFyKCk7Ci0KLSAgICAgICAgX3Rva2VuQ291bnQgPSAwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBSZWFkcyB0aGUgdGVtcGxhdGUgZm9yIHRoZSBjb21wb25lbnQuCi0gICAgICoKLSAgICAgKiAgPHA+UmV0dXJucyBudWxsIGlmIHRoZSB0ZW1wbGF0ZSBjYW4ndCBiZSBmb3VuZC4KLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgQ29tcG9uZW50VGVtcGxhdGUgZ2V0VGVtcGxhdGUoSVJlcXVlc3RDeWNsZSBjeWNsZSwgSUNvbXBvbmVudCBjb21wb25lbnQpCi0gICAgewotICAgICAgICBJQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBzcGVjaWZpY2F0aW9uID0gY29tcG9uZW50LmdldFNwZWNpZmljYXRpb24oKTsKLSAgICAgICAgSVJlc291cmNlTG9jYXRpb24gc3BlY2lmaWNhdGlvbkxvY2F0aW9uID0gc3BlY2lmaWNhdGlvbi5nZXRTcGVjaWZpY2F0aW9uTG9jYXRpb24oKTsKLQotICAgICAgICBMb2NhbGUgbG9jYWxlID0gY29tcG9uZW50LmdldFBhZ2UoKS5nZXRMb2NhbGUoKTsKLQotICAgICAgICBPYmplY3Qga2V5ID0gbmV3IE11bHRpS2V5KG5ldyBPYmplY3RbXSB7IHNwZWNpZmljYXRpb25Mb2NhdGlvbiwgbG9jYWxlIH0sIGZhbHNlKTsKLQotICAgICAgICBDb21wb25lbnRUZW1wbGF0ZSByZXN1bHQgPSBzZWFyY2hDYWNoZShrZXkpOwotICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotCi0gICAgICAgIHJlc3VsdCA9IGZpbmRUZW1wbGF0ZShjeWNsZSwgc3BlY2lmaWNhdGlvbkxvY2F0aW9uLCBjb21wb25lbnQsIGxvY2FsZSk7Ci0KLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQgPSBnZXRUZW1wbGF0ZUZyb21EZWxlZ2F0ZShjeWNsZSwgY29tcG9uZW50LCBsb2NhbGUpOwotCi0gICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLQotICAgICAgICAgICAgU3RyaW5nIHN0cmluZ0tleSA9Ci0gICAgICAgICAgICAgICAgY29tcG9uZW50LmdldFNwZWNpZmljYXRpb24oKS5pc1BhZ2VTcGVjaWZpY2F0aW9uKCkKLSAgICAgICAgICAgICAgICAgICAgPyAiRGVmYXVsdFRlbXBsYXRlU291cmNlLm5vLXRlbXBsYXRlLWZvci1wYWdlIgotICAgICAgICAgICAgICAgICAgICA6ICJEZWZhdWx0VGVtcGxhdGVTb3VyY2Uubm8tdGVtcGxhdGUtZm9yLWNvbXBvbmVudCI7Ci0KLSAgICAgICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgVGFwZXN0cnkuZm9ybWF0KHN0cmluZ0tleSwgY29tcG9uZW50LmdldEV4dGVuZGVkSWQoKSwgbG9jYWxlKSwKLSAgICAgICAgICAgICAgICBjb21wb25lbnQsCi0gICAgICAgICAgICAgICAgY29tcG9uZW50LmdldExvY2F0aW9uKCksCi0gICAgICAgICAgICAgICAgbnVsbCk7Ci0gICAgICAgIH0KLQotICAgICAgICBzYXZlVG9DYWNoZShrZXksIHJlc3VsdCk7Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIENvbXBvbmVudFRlbXBsYXRlIHNlYXJjaENhY2hlKE9iamVjdCBrZXkpCi0gICAgewotICAgICAgICByZXR1cm4gKENvbXBvbmVudFRlbXBsYXRlKSBfY2FjaGUuZ2V0KGtleSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNhdmVUb0NhY2hlKE9iamVjdCBrZXksIENvbXBvbmVudFRlbXBsYXRlIHRlbXBsYXRlKQotICAgIHsKLSAgICAgICAgX2NhY2hlLnB1dChrZXksIHRlbXBsYXRlKTsKLQotICAgIH0KLQotICAgIHByaXZhdGUgQ29tcG9uZW50VGVtcGxhdGUgZ2V0VGVtcGxhdGVGcm9tRGVsZWdhdGUoCi0gICAgICAgIElSZXF1ZXN0Q3ljbGUgY3ljbGUsCi0gICAgICAgIElDb21wb25lbnQgY29tcG9uZW50LAotICAgICAgICBMb2NhbGUgbG9jYWxlKQotICAgIHsKLSAgICAgICAgaWYgKF9kZWxlZ2F0ZSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBJRW5naW5lIGVuZ2luZSA9IGN5Y2xlLmdldEVuZ2luZSgpOwotICAgICAgICAgICAgSUFwcGxpY2F0aW9uU3BlY2lmaWNhdGlvbiBzcGVjID0gZW5naW5lLmdldFNwZWNpZmljYXRpb24oKTsKLQotICAgICAgICAgICAgaWYgKHNwZWMuY2hlY2tFeHRlbnNpb24oVGFwZXN0cnkuVEVNUExBVEVfU09VUkNFX0RFTEVHQVRFX0VYVEVOU0lPTl9OQU1FKSkKLSAgICAgICAgICAgICAgICBfZGVsZWdhdGUgPQotICAgICAgICAgICAgICAgICAgICAoSVRlbXBsYXRlU291cmNlRGVsZWdhdGUpIHNwZWMuZ2V0RXh0ZW5zaW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgVGFwZXN0cnkuVEVNUExBVEVfU09VUkNFX0RFTEVHQVRFX0VYVEVOU0lPTl9OQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgSVRlbXBsYXRlU291cmNlRGVsZWdhdGUuY2xhc3MpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIF9kZWxlZ2F0ZSA9IE51bGxUZW1wbGF0ZVNvdXJjZURlbGVnYXRlLmdldFNoYXJlZEluc3RhbmNlKCk7Ci0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBfZGVsZWdhdGUuZmluZFRlbXBsYXRlKGN5Y2xlLCBjb21wb25lbnQsIGxvY2FsZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEZpbmRzIHRoZSB0ZW1wbGF0ZSBmb3IgdGhlIGdpdmVuIGNvbXBvbmVudCwgdXNpbmcgdGhlIGZvbGxvd2luZyBydWxlczoKLSAgICAgKiAgPHVsPgotICAgICAqICA8bGk+SWYgdGhlIGNvbXBvbmVudCBoYXMgYSAkdGVtcGxhdGUgYXNzZXQsIHVzZSB0aGF0Ci0gICAgICogIDxsaT5Mb29rIGZvciBhIHRlbXBsYXRlIGluIHRoZSBzYW1lIGZvbGRlciBhcyB0aGUgY29tcG9uZW50Ci0gICAgICogIDxsaT5JZiBhIHBhZ2UgaW4gdGhlIGFwcGxpY2F0aW9uIG5hbWVzcGFjZSwgc2VhcmNoIGluIHRoZSBhcHBsaWNhdGlvbiByb290Ci0gICAgICogIDxsaT5GYWlsIQotICAgICAqICA8L3VsPgotICAgICAqIAotICAgICAqICBAcmV0dXJuIHRoZSB0ZW1wbGF0ZSwgb3IgbnVsbCBpZiBub3QgZm91bmQKLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwcml2YXRlIENvbXBvbmVudFRlbXBsYXRlIGZpbmRUZW1wbGF0ZSgKLSAgICAgICAgSVJlcXVlc3RDeWNsZSBjeWNsZSwKLSAgICAgICAgSVJlc291cmNlTG9jYXRpb24gbG9jYXRpb24sCi0gICAgICAgIElDb21wb25lbnQgY29tcG9uZW50LAotICAgICAgICBMb2NhbGUgbG9jYWxlKQotICAgIHsKLSAgICAgICAgSUFzc2V0IHRlbXBsYXRlQXNzZXQgPSBjb21wb25lbnQuZ2V0QXNzZXQoVEVNUExBVEVfQVNTRVRfTkFNRSk7Ci0KLSAgICAgICAgaWYgKHRlbXBsYXRlQXNzZXQgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiByZWFkVGVtcGxhdGVGcm9tQXNzZXQoY3ljbGUsIGNvbXBvbmVudCwgdGVtcGxhdGVBc3NldCk7Ci0KLSAgICAgICAgU3RyaW5nIG5hbWUgPSBsb2NhdGlvbi5nZXROYW1lKCk7Ci0gICAgICAgIGludCBkb3R4ID0gbmFtZS5sYXN0SW5kZXhPZignLicpOwotICAgICAgICBTdHJpbmcgdGVtcGxhdGVCYXNlTmFtZSA9IG5hbWUuc3Vic3RyaW5nKDAsIGRvdHggKyAxKSArIGdldFRlbXBsYXRlRXh0ZW5zaW9uKGNvbXBvbmVudCk7Ci0KLSAgICAgICAgQ29tcG9uZW50VGVtcGxhdGUgcmVzdWx0ID0KLSAgICAgICAgICAgIGZpbmRTdGFuZGFyZFRlbXBsYXRlKGN5Y2xlLCBsb2NhdGlvbiwgY29tcG9uZW50LCB0ZW1wbGF0ZUJhc2VOYW1lLCBsb2NhbGUpOwotCi0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbAotICAgICAgICAgICAgJiYgY29tcG9uZW50LmdldFNwZWNpZmljYXRpb24oKS5pc1BhZ2VTcGVjaWZpY2F0aW9uKCkKLSAgICAgICAgICAgICYmIGNvbXBvbmVudC5nZXROYW1lc3BhY2UoKS5pc0FwcGxpY2F0aW9uTmFtZXNwYWNlKCkpCi0gICAgICAgICAgICByZXN1bHQgPSBmaW5kUGFnZVRlbXBsYXRlSW5BcHBsaWNhdGlvblJvb3QoY3ljbGUsIGNvbXBvbmVudCwgdGVtcGxhdGVCYXNlTmFtZSwgbG9jYWxlKTsKLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHByaXZhdGUgQ29tcG9uZW50VGVtcGxhdGUgZmluZFBhZ2VUZW1wbGF0ZUluQXBwbGljYXRpb25Sb290KAotICAgICAgICBJUmVxdWVzdEN5Y2xlIGN5Y2xlLAotICAgICAgICBJQ29tcG9uZW50IGNvbXBvbmVudCwKLSAgICAgICAgU3RyaW5nIHRlbXBsYXRlQmFzZU5hbWUsCi0gICAgICAgIExvY2FsZSBsb2NhbGUpCi0gICAgewotICAgICAgICBpZiAoTE9HLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgICAgICBMT0cuZGVidWcoIkNoZWNraW5nIGZvciAiICsgdGVtcGxhdGVCYXNlTmFtZSArICIgaW4gYXBwbGljYXRpb24gcm9vdCIpOwotCi0gICAgICAgIGlmIChfYXBwbGljYXRpb25Sb290TG9jYXRpb24gPT0gbnVsbCkKLSAgICAgICAgICAgIF9hcHBsaWNhdGlvblJvb3RMb2NhdGlvbiA9IFRhcGVzdHJ5LmdldEFwcGxpY2F0aW9uUm9vdExvY2F0aW9uKGN5Y2xlKTsKLQotICAgICAgICBJUmVzb3VyY2VMb2NhdGlvbiBiYXNlTG9jYXRpb24gPQotICAgICAgICAgICAgX2FwcGxpY2F0aW9uUm9vdExvY2F0aW9uLmdldFJlbGF0aXZlTG9jYXRpb24odGVtcGxhdGVCYXNlTmFtZSk7Ci0gICAgICAgIElSZXNvdXJjZUxvY2F0aW9uIGxvY2FsaXplZExvY2F0aW9uID0gYmFzZUxvY2F0aW9uLmdldExvY2FsaXphdGlvbihsb2NhbGUpOwotCi0gICAgICAgIGlmIChsb2NhbGl6ZWRMb2NhdGlvbiA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgcmV0dXJuIGdldE9yUGFyc2VUZW1wbGF0ZShjeWNsZSwgbG9jYWxpemVkTG9jYXRpb24sIGNvbXBvbmVudCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFJlYWRzIGFuIGFzc2V0IHRvIGdldCB0aGUgdGVtcGxhdGUuCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHJpdmF0ZSBDb21wb25lbnRUZW1wbGF0ZSByZWFkVGVtcGxhdGVGcm9tQXNzZXQoCi0gICAgICAgIElSZXF1ZXN0Q3ljbGUgY3ljbGUsCi0gICAgICAgIElDb21wb25lbnQgY29tcG9uZW50LAotICAgICAgICBJQXNzZXQgYXNzZXQpCi0gICAgewotICAgICAgICBJbnB1dFN0cmVhbSBzdHJlYW0gPSBhc3NldC5nZXRSZXNvdXJjZUFzU3RyZWFtKGN5Y2xlKTsKLQotICAgICAgICBjaGFyW10gdGVtcGxhdGVEYXRhID0gbnVsbDsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIGVuY29kaW5nID0gZ2V0VGVtcGxhdGVFbmNvZGluZyhjeWNsZSwgY29tcG9uZW50LCBudWxsKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgdGVtcGxhdGVEYXRhID0gcmVhZFRlbXBsYXRlU3RyZWFtKHN0cmVhbSwgZW5jb2RpbmcpOwotCi0gICAgICAgICAgICBzdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZXgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgVGFwZXN0cnkuZm9ybWF0KCJEZWZhdWx0VGVtcGxhdGVTb3VyY2UudW5hYmxlLXRvLXJlYWQtdGVtcGxhdGUiLCBhc3NldCksCi0gICAgICAgICAgICAgICAgZXgpOwotICAgICAgICB9Ci0KLSAgICAgICAgSVJlc291cmNlTG9jYXRpb24gcmVzb3VyY2VMb2NhdGlvbiA9IGFzc2V0LmdldFJlc291cmNlTG9jYXRpb24oKTsKLQotICAgICAgICByZXR1cm4gY29uc3RydWN0VGVtcGxhdGVJbnN0YW5jZShjeWNsZSwgdGVtcGxhdGVEYXRhLCByZXNvdXJjZUxvY2F0aW9uLCBjb21wb25lbnQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBTZWFyY2ggZm9yIHRoZSB0ZW1wbGF0ZSBjb3JyZXNwb25kaW5nIHRvIHRoZSByZXNvdXJjZSBhbmQgdGhlIGxvY2FsZS4KLSAgICAgKiAgVGhpcyBtYXkgYmUgaW4gdGhlIHRlbXBsYXRlIG1hcCBhbHJlYWR5LCBvciBtYXkgaW52b2x2ZSByZWFkaW5nIGFuZAotICAgICAqICBwYXJzaW5nIHRoZSB0ZW1wbGF0ZS4KLSAgICAgKgotICAgICAqICBAcmV0dXJuIHRoZSB0ZW1wbGF0ZSwgb3IgbnVsbCBpZiBub3QgZm91bmQuCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHJpdmF0ZSBDb21wb25lbnRUZW1wbGF0ZSBmaW5kU3RhbmRhcmRUZW1wbGF0ZSgKLSAgICAgICAgSVJlcXVlc3RDeWNsZSBjeWNsZSwKLSAgICAgICAgSVJlc291cmNlTG9jYXRpb24gbG9jYXRpb24sCi0gICAgICAgIElDb21wb25lbnQgY29tcG9uZW50LAotICAgICAgICBTdHJpbmcgdGVtcGxhdGVCYXNlTmFtZSwKLSAgICAgICAgTG9jYWxlIGxvY2FsZSkKLSAgICB7Ci0gICAgICAgIGlmIChMT0cuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgICAgIExPRy5kZWJ1ZygKLSAgICAgICAgICAgICAgICAiU2VhcmNoaW5nIGZvciBsb2NhbGl6ZWQgdmVyc2lvbiBvZiB0ZW1wbGF0ZSBmb3IgIgotICAgICAgICAgICAgICAgICAgICArIGxvY2F0aW9uCi0gICAgICAgICAgICAgICAgICAgICsgIiBpbiBsb2NhbGUgIgotICAgICAgICAgICAgICAgICAgICArIGxvY2FsZS5nZXREaXNwbGF5TmFtZSgpKTsKLQotICAgICAgICBJUmVzb3VyY2VMb2NhdGlvbiBiYXNlVGVtcGxhdGVMb2NhdGlvbiA9IGxvY2F0aW9uLmdldFJlbGF0aXZlTG9jYXRpb24odGVtcGxhdGVCYXNlTmFtZSk7Ci0KLSAgICAgICAgSVJlc291cmNlTG9jYXRpb24gbG9jYWxpemVkVGVtcGxhdGVMb2NhdGlvbiA9IGJhc2VUZW1wbGF0ZUxvY2F0aW9uLmdldExvY2FsaXphdGlvbihsb2NhbGUpOwotCi0gICAgICAgIGlmIChsb2NhbGl6ZWRUZW1wbGF0ZUxvY2F0aW9uID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICByZXR1cm4gZ2V0T3JQYXJzZVRlbXBsYXRlKGN5Y2xlLCBsb2NhbGl6ZWRUZW1wbGF0ZUxvY2F0aW9uLCBjb21wb25lbnQpOwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgYSBwcmV2aW91c2x5IHBhcnNlZCB0ZW1wbGF0ZSBhdCB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uICh3aGljaCBtdXN0IGFscmVhZHkKLSAgICAgKiAgYmUgbG9jYWxpemVkKS4gIElmIG5vdCBhbHJlYWR5IGluIHRoZSB0ZW1wbGF0ZSBNYXAsIHRoZW4gdGhlCi0gICAgICogIGxvY2F0aW9uIGlzIHBhcnNlZCBhbmQgc3RvcmVkIGludG8gdGhlIHRlbXBsYXRlcyBNYXAsIHRoZW4gcmV0dXJuZWQuCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHJpdmF0ZSBDb21wb25lbnRUZW1wbGF0ZSBnZXRPclBhcnNlVGVtcGxhdGUoCi0gICAgICAgIElSZXF1ZXN0Q3ljbGUgY3ljbGUsCi0gICAgICAgIElSZXNvdXJjZUxvY2F0aW9uIGxvY2F0aW9uLAotICAgICAgICBJQ29tcG9uZW50IGNvbXBvbmVudCkKLSAgICB7Ci0KLSAgICAgICAgQ29tcG9uZW50VGVtcGxhdGUgcmVzdWx0ID0gKENvbXBvbmVudFRlbXBsYXRlKSBfdGVtcGxhdGVzLmdldChsb2NhdGlvbik7Ci0gICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0KLSAgICAgICAgLy8gT2ssIHNlZSBpZiBpdCBleGlzdHMuCi0KLSAgICAgICAgcmVzdWx0ID0gcGFyc2VUZW1wbGF0ZShjeWNsZSwgbG9jYXRpb24sIGNvbXBvbmVudCk7Ci0KLSAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQotICAgICAgICAgICAgX3RlbXBsYXRlcy5wdXQobG9jYXRpb24sIHJlc3VsdCk7Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgUmVhZHMgdGhlIHRlbXBsYXRlIGZvciB0aGUgZ2l2ZW4gcmVzb3VyY2U7IHJldHVybnMgbnVsbCBpZiB0aGUKLSAgICAgKiAgcmVzb3VyY2UgZG9lc24ndCBleGlzdC4gIE5vdGUgdGhhdCB0aGlzIG1ldGhvZCBpcyBvbmx5IGludm9rZWQKLSAgICAgKiAgZnJvbSBhIHN5bmNocm9uaXplZCBibG9jaywgc28gdGhlcmUgc2hvdWxkbid0IGJlIHRocmVhZGluZwotICAgICAqICBpc3N1ZXMgaGVyZS4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHByaXZhdGUgQ29tcG9uZW50VGVtcGxhdGUgcGFyc2VUZW1wbGF0ZSgKLSAgICAgICAgSVJlcXVlc3RDeWNsZSBjeWNsZSwKLSAgICAgICAgSVJlc291cmNlTG9jYXRpb24gbG9jYXRpb24sCi0gICAgICAgIElDb21wb25lbnQgY29tcG9uZW50KQotICAgIHsKLSAgICAgICAgU3RyaW5nIGVuY29kaW5nID0gZ2V0VGVtcGxhdGVFbmNvZGluZyhjeWNsZSwgY29tcG9uZW50LCBsb2NhdGlvbi5nZXRMb2NhbGUoKSk7Ci0gICAgICAgIAotICAgICAgICBjaGFyW10gdGVtcGxhdGVEYXRhID0gcmVhZFRlbXBsYXRlKGxvY2F0aW9uLCBlbmNvZGluZyk7Ci0gICAgICAgIGlmICh0ZW1wbGF0ZURhdGEgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIHJldHVybiBjb25zdHJ1Y3RUZW1wbGF0ZUluc3RhbmNlKGN5Y2xlLCB0ZW1wbGF0ZURhdGEsIGxvY2F0aW9uLCBjb21wb25lbnQpOwotICAgIH0KLQotICAgIC8qKiAKLSAgICAgKiAgVGhpcyBtZXRob2QgaXMgY3VycmVudGx5IHN5bmNocm9uaXplZCwgYmVjYXVzZQotICAgICAqICB7QGxpbmsgVGVtcGxhdGVQYXJzZXJ9IGlzIG5vdCB0aHJlYWRzYWZlLiAgQW5vdGhlciBnb29kIGNhbmRpZGF0ZQotICAgICAqICBmb3IgYSBwb29saW5nIG1lY2hhbmlzbSwgZXNwZWNpYWxseSBiZWNhdXNlIHBhcnNpbmcgYSB0ZW1wbGF0ZQotICAgICAqICBtYXkgdGFrZSBhIHdoaWxlLgotICAgICAqIAotICAgICAqKi8KLQotICAgIHByaXZhdGUgc3luY2hyb25pemVkIENvbXBvbmVudFRlbXBsYXRlIGNvbnN0cnVjdFRlbXBsYXRlSW5zdGFuY2UoCi0gICAgICAgIElSZXF1ZXN0Q3ljbGUgY3ljbGUsCi0gICAgICAgIGNoYXJbXSB0ZW1wbGF0ZURhdGEsCi0gICAgICAgIElSZXNvdXJjZUxvY2F0aW9uIGxvY2F0aW9uLAotICAgICAgICBJQ29tcG9uZW50IGNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIGlmIChfcGFyc2VyID09IG51bGwpCi0gICAgICAgICAgICBfcGFyc2VyID0gbmV3IFRlbXBsYXRlUGFyc2VyKCk7Ci0KLSAgICAgICAgSVRlbXBsYXRlUGFyc2VyRGVsZWdhdGUgZGVsZWdhdGUgPSBuZXcgVGVtcGxhdGVQYXJzZXJEZWxlZ2F0ZUltcGwoY29tcG9uZW50LCBjeWNsZSk7Ci0KLSAgICAgICAgVGVtcGxhdGVUb2tlbltdIHRva2VuczsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgdG9rZW5zID0gX3BhcnNlci5wYXJzZSh0ZW1wbGF0ZURhdGEsIGRlbGVnYXRlLCBsb2NhdGlvbik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFRlbXBsYXRlUGFyc2VFeGNlcHRpb24gZXgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgVGFwZXN0cnkuZm9ybWF0KCJEZWZhdWx0VGVtcGxhdGVTb3VyY2UudW5hYmxlLXRvLXBhcnNlLXRlbXBsYXRlIiwgbG9jYXRpb24pLAotICAgICAgICAgICAgICAgIGV4KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChMT0cuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgICAgIExPRy5kZWJ1ZygiUGFyc2VkICIgKyB0b2tlbnMubGVuZ3RoICsgIiB0b2tlbnMgZnJvbSB0ZW1wbGF0ZSIpOwotCi0gICAgICAgIF90b2tlbkNvdW50ICs9IHRva2Vucy5sZW5ndGg7Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBDb21wb25lbnRUZW1wbGF0ZSh0ZW1wbGF0ZURhdGEsIHRva2Vucyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFJlYWRzIHRoZSB0ZW1wbGF0ZSwgZ2l2ZW4gdGhlIGNvbXBsZXRlIHBhdGggdG8gdGhlCi0gICAgICogIHJlc291cmNlLiAgUmV0dXJucyBudWxsIGlmIHRoZSByZXNvdXJjZSBkb2Vzbid0IGV4aXN0LgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHJpdmF0ZSBjaGFyW10gcmVhZFRlbXBsYXRlKElSZXNvdXJjZUxvY2F0aW9uIGxvY2F0aW9uLCBTdHJpbmcgZW5jb2RpbmcpCi0gICAgewotICAgICAgICBpZiAoTE9HLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgICAgICBMT0cuZGVidWcoIlJlYWRpbmcgdGVtcGxhdGUgIiArIGxvY2F0aW9uKTsKLQotICAgICAgICBVUkwgdXJsID0gbG9jYXRpb24uZ2V0UmVzb3VyY2VVUkwoKTsKLQotICAgICAgICBpZiAodXJsID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChMT0cuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICBMT0cuZGVidWcoIlRlbXBsYXRlIGRvZXMgbm90IGV4aXN0LiIpOwotCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChMT0cuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgICAgIExPRy5kZWJ1ZygiUmVhZGluZyB0ZW1wbGF0ZSBmcm9tIFVSTCAiICsgdXJsKTsKLQotICAgICAgICBJbnB1dFN0cmVhbSBzdHJlYW0gPSBudWxsOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBzdHJlYW0gPSB1cmwub3BlblN0cmVhbSgpOwotCi0gICAgICAgICAgICByZXR1cm4gcmVhZFRlbXBsYXRlU3RyZWFtKHN0cmVhbSwgZW5jb2RpbmcpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBleCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICBUYXBlc3RyeS5mb3JtYXQoIkRlZmF1bHRUZW1wbGF0ZVNvdXJjZS51bmFibGUtdG8tcmVhZC10ZW1wbGF0ZSIsIGxvY2F0aW9uKSwKLSAgICAgICAgICAgICAgICBleCk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBUYXBlc3RyeS5jbG9zZShzdHJlYW0pOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgUmVhZHMgYSBTdHJlYW0gaW50byBtZW1vcnkgYXMgYW4gYXJyYXkgb2YgY2hhcmFjdGVycy4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHByaXZhdGUgY2hhcltdIHJlYWRUZW1wbGF0ZVN0cmVhbShJbnB1dFN0cmVhbSBzdHJlYW0sIFN0cmluZyBlbmNvZGluZykgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBjaGFyW10gY2hhckJ1ZmZlciA9IG5ldyBjaGFyW0JVRkZFUl9TSVpFXTsKLSAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotICAgICAgICBJbnB1dFN0cmVhbVJlYWRlciByZWFkZXI7Ci0gICAgICAgIGlmIChlbmNvZGluZyAhPSBudWxsKQotICAgICAgICAgICAgcmVhZGVyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKHN0cmVhbSksIGVuY29kaW5nKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmVhZGVyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKHN0cmVhbSkpOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICB3aGlsZSAodHJ1ZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQgY2hhcnNSZWFkID0gcmVhZGVyLnJlYWQoY2hhckJ1ZmZlciwgMCwgQlVGRkVSX1NJWkUpOwotCi0gICAgICAgICAgICAgICAgaWYgKGNoYXJzUmVhZCA8PSAwKQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoY2hhckJ1ZmZlciwgMCwgY2hhcnNSZWFkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJlYWRlci5jbG9zZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gT0ssIG5vdyByZXVzZSB0aGUgY2hhckJ1ZmZlciB2YXJpYWJsZSB0bwotICAgICAgICAvLyBwcm9kdWNlIHRoZSBmaW5hbCByZXN1bHQuCi0KLSAgICAgICAgaW50IGxlbmd0aCA9IGJ1ZmZlci5sZW5ndGgoKTsKLQotICAgICAgICBjaGFyQnVmZmVyID0gbmV3IGNoYXJbbGVuZ3RoXTsKLQotICAgICAgICAvLyBDb3B5IHRoZSBjaGFyYWN0ZXIgb3V0IG9mIHRoZSBTdHJpbmdCdWZmZXIgYW5kIGludG8gdGhlCi0gICAgICAgIC8vIGFycmF5LgotCi0gICAgICAgIGJ1ZmZlci5nZXRDaGFycygwLCBsZW5ndGgsIGNoYXJCdWZmZXIsIDApOwotCi0gICAgICAgIHJldHVybiBjaGFyQnVmZmVyOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICAgIHsKLSAgICAgICAgVG9TdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgVG9TdHJpbmdCdWlsZGVyKHRoaXMpOwotCi0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJ0b2tlbkNvdW50IiwgX3Rva2VuQ291bnQpOwotCi0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJ0ZW1wbGF0ZXMiLCBfdGVtcGxhdGVzLmtleVNldCgpKTsKLQotICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBDaGVja3MgZm9yIHRoZSB7QGxpbmsgVGFwZXN0cnkjVEVNUExBVEVfRVhURU5TSU9OX1BST1BFUlRZfSBpbiB0aGUgY29tcG9uZW50J3MKLSAgICAgKiAgc3BlY2lmaWNhdGlvbiwgdGhlbiBpbiB0aGUgY29tcG9uZW50J3MgbmFtZXNwYWNlJ3Mgc3BlY2lmaWNhdGlvbi4gIFJldHVybnMKLSAgICAgKiAge0BsaW5rIFRhcGVzdHJ5I0RFRkFVTFRfVEVNUExBVEVfRVhURU5TSU9OfSBpZiBub3Qgb3RoZXJ3aXNlIG92ZXJyaWRlbi4KLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRUZW1wbGF0ZUV4dGVuc2lvbihJQ29tcG9uZW50IGNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIFN0cmluZyBleHRlbnNpb24gPQotICAgICAgICAgICAgY29tcG9uZW50LmdldFNwZWNpZmljYXRpb24oKS5nZXRQcm9wZXJ0eShUYXBlc3RyeS5URU1QTEFURV9FWFRFTlNJT05fUFJPUEVSVFkpOwotCi0gICAgICAgIGlmIChleHRlbnNpb24gIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBleHRlbnNpb247Ci0KLSAgICAgICAgZXh0ZW5zaW9uID0KLSAgICAgICAgICAgIGNvbXBvbmVudC5nZXROYW1lc3BhY2UoKS5nZXRTcGVjaWZpY2F0aW9uKCkuZ2V0UHJvcGVydHkoCi0gICAgICAgICAgICAgICAgVGFwZXN0cnkuVEVNUExBVEVfRVhURU5TSU9OX1BST1BFUlRZKTsKLQotICAgICAgICBpZiAoZXh0ZW5zaW9uICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZXh0ZW5zaW9uOwotCi0gICAgICAgIHJldHVybiBUYXBlc3RyeS5ERUZBVUxUX1RFTVBMQVRFX0VYVEVOU0lPTjsKLSAgICB9Ci0KLSAgICAvKiogQHNpbmNlIDEuMC42ICoqLwotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbmRlckRlc2NyaXB0aW9uKElNYXJrdXBXcml0ZXIgd3JpdGVyKQotICAgIHsKLSAgICAgICAgd3JpdGVyLnByaW50KCJEZWZhdWx0VGVtcGxhdGVTb3VyY2VbIik7Ci0KLSAgICAgICAgaWYgKF90b2tlbkNvdW50ID4gMCkKLSAgICAgICAgewotICAgICAgICAgICAgd3JpdGVyLnByaW50KF90b2tlbkNvdW50KTsKLSAgICAgICAgICAgIHdyaXRlci5wcmludCgiIHRva2VucyIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKF9jYWNoZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKLSAgICAgICAgICAgIEl0ZXJhdG9yIGkgPSBfY2FjaGUuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotCi0gICAgICAgICAgICB3aGlsZSAoaS5oYXNOZXh0KCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGZpcnN0KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVyLmJlZ2luKCJ1bCIpOwotICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIE1hcC5FbnRyeSBlID0gKE1hcC5FbnRyeSkgaS5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IGtleSA9IGUuZ2V0S2V5KCk7Ci0gICAgICAgICAgICAgICAgQ29tcG9uZW50VGVtcGxhdGUgdGVtcGxhdGUgPSAoQ29tcG9uZW50VGVtcGxhdGUpIGUuZ2V0VmFsdWUoKTsKLQotICAgICAgICAgICAgICAgIHdyaXRlci5iZWdpbigibGkiKTsKLSAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnQoa2V5LnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIHdyaXRlci5wcmludCgiICgiKTsKLSAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnQodGVtcGxhdGUuZ2V0VG9rZW5Db3VudCgpKTsKLSAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnQoIiB0b2tlbnMpIik7Ci0gICAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oKTsKLSAgICAgICAgICAgICAgICB3cml0ZXIuZW5kKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghZmlyc3QpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgd3JpdGVyLmVuZCgpOyAvLyA8dWw+Ci0gICAgICAgICAgICAgICAgd3JpdGVyLmJlZ2luRW1wdHkoImJyIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB3cml0ZXIucHJpbnQoIl0iKTsKLQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIFN0cmluZyBnZXRUZW1wbGF0ZUVuY29kaW5nKElSZXF1ZXN0Q3ljbGUgY3ljbGUsIElDb21wb25lbnQgY29tcG9uZW50LCBMb2NhbGUgbG9jYWxlKQotICAgIHsKLSAgICAgICAgSVByb3BlcnR5U291cmNlIHNvdXJjZSA9IGdldENvbXBvbmVudFByb3BlcnR5U291cmNlKGN5Y2xlLCBjb21wb25lbnQpOwotCi0gICAgICAgIGlmIChsb2NhbGUgIT0gbnVsbCkKLSAgICAgICAgICAgIHNvdXJjZSA9IG5ldyBMb2NhbGl6ZWRQcm9wZXJ0eVNvdXJjZShsb2NhbGUsIHNvdXJjZSk7Ci0KLSAgICAgICAgcmV0dXJuIGdldFRlbXBsYXRlRW5jb2RpbmdQcm9wZXJ0eShzb3VyY2UpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIElQcm9wZXJ0eVNvdXJjZSBnZXRDb21wb25lbnRQcm9wZXJ0eVNvdXJjZShJUmVxdWVzdEN5Y2xlIGN5Y2xlLCBJQ29tcG9uZW50IGNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIERlbGVnYXRpbmdQcm9wZXJ0eVNvdXJjZSBzb3VyY2UgPSBuZXcgRGVsZWdhdGluZ1Byb3BlcnR5U291cmNlKCk7Ci0KLSAgICAgICAgLy8gU2VhcmNoIGZvciB0aGUgZW5jb2RpbmcgcHJvcGVydHkgaW4gdGhlIGZvbGxvd2luZyBvcmRlcjoKLSAgICAgICAgLy8gRmlyc3Qgc2VhcmNoIHRoZSBjb21wb25lbnQgc3BlY2lmaWNhdGlvbgotICAgICAgICBzb3VyY2UuYWRkU291cmNlKG5ldyBQcm9wZXJ0eUhvbGRlclByb3BlcnR5U291cmNlKGNvbXBvbmVudC5nZXRTcGVjaWZpY2F0aW9uKCkpKTsKLQotICAgICAgICAvLyBUaGVuIHNlYXJjaCBpdHMgbGlicmFyeSBzcGVjaWZpY2F0aW9uCi0gICAgICAgIHNvdXJjZS5hZGRTb3VyY2UobmV3IFByb3BlcnR5SG9sZGVyUHJvcGVydHlTb3VyY2UoY29tcG9uZW50LmdldE5hbWVzcGFjZSgpLmdldFNwZWNpZmljYXRpb24oKSkpOwotCi0gICAgICAgIC8vIFRoZW4gc2VhcmNoIHRoZSByZXN0IG9mIHRoZSBzdGFuZGFyZCBwYXRoCi0gICAgICAgIHNvdXJjZS5hZGRTb3VyY2UoY3ljbGUuZ2V0RW5naW5lKCkuZ2V0UHJvcGVydHlTb3VyY2UoKSk7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gc291cmNlOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIFN0cmluZyBnZXRUZW1wbGF0ZUVuY29kaW5nUHJvcGVydHkoSVByb3BlcnR5U291cmNlIHNvdXJjZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBzb3VyY2UuZ2V0UHJvcGVydHlWYWx1ZShURU1QTEFURV9FTkNPRElOR19QUk9QRVJUWV9OQU1FKTsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZW5naW5lL0RpcmVjdFNlcnZpY2UuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9lbmdpbmUvRGlyZWN0U2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTc3YWMyLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9lbmdpbmUvRGlyZWN0U2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmVuZ2luZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5BcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JQ29tcG9uZW50OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSURpcmVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklQYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlcXVlc3RDeWNsZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LlN0YWxlU2Vzc2lvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LlRhcGVzdHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkucmVxdWVzdC5SZXF1ZXN0Q29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnJlcXVlc3QuUmVzcG9uc2VPdXRwdXRTdHJlYW07Ci0KLS8qKgotICogIEltcGxlbWVudGF0aW9uIG9mIHRoZSBkaXJlY3Qgc2VydmljZSwgd2hpY2ggZW5jb2RlcyB0aGUgcGFnZSBhbmQgY29tcG9uZW50IGlkIGluCi0gKiAgdGhlIHNlcnZpY2UgY29udGV4dCwgYW5kIHBhc3NlcyBhcHBsaWNhdGlvbi1kZWZpbmVkIHBhcmFtZXRlcnMgYXMgd2VsbC4KLSAqCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogIEB2ZXJzaW9uICRJZCQKLSAqICBAc2luY2UgMS4wLjkKLSAqCi0gKiovCi0KLXB1YmxpYyBjbGFzcyBEaXJlY3RTZXJ2aWNlIGV4dGVuZHMgQWJzdHJhY3RTZXJ2aWNlCi17Ci0gICAgLyoqCi0gICAgICogIEVuY29kZWQgaW50byBVUkwgaWYgZW5naW5lIHdhcyBzdGF0ZWZ1bC4KLSAgICAgKiAKLSAgICAgKiAgQHNpbmNlIDMuMAotICAgICAqKi8KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFURUZVTF9PTiA9ICIxIjsKLQotICAgIC8qKgotICAgICAqICBFbmNvZGVkIGludG8gVVJMIGlmIGVuZ2luZSB3YXMgbm90IHN0YXRlZnVsLgotICAgICAqIAotICAgICAqICBAc2luY2UgMy4wCi0gICAgICoqLwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVRFRlVMX09GRiA9ICIwIjsKLQotICAgIHB1YmxpYyBJTGluayBnZXRMaW5rKElSZXF1ZXN0Q3ljbGUgY3ljbGUsIElDb21wb25lbnQgY29tcG9uZW50LCBPYmplY3RbXSBwYXJhbWV0ZXJzKQotICAgIHsKLQotICAgICAgICAvLyBOZXcgc2luY2UgMS4wLjEsIHdlIHVzZSB0aGUgY29tcG9uZW50IHRvIGRldGVybWluZQotICAgICAgICAvLyB0aGUgcGFnZSwgbm90IHRoZSBjeWNsZS4gIFRocm91Z2ggdGhlIHVzZSBvZiB0cmlja3kKLSAgICAgICAgLy8gdGhpbmdzIHN1Y2ggYXMgQmxvY2svSW5zZXJ0QmxvY2ssIGl0IGlzIHBvc3NpYmxlIAotICAgICAgICAvLyB0aGF0IGEgY29tcG9uZW50IGZyb20gYSBwYWdlIGRpZmZlcmVudCB0aGFuCi0gICAgICAgIC8vIHRoZSByZXNwb25zZSBwYWdlIHdpbGwgcmVuZGVyLgotICAgICAgICAvLyBJbiAxLjAuNiwgd2Ugc3RhcnQgdG8gcmVjb3JkICpib3RoKiB0aGUgcmVuZGVyIHBhZ2UKLSAgICAgICAgLy8gYW5kIHRoZSBjb21wb25lbnQgcGFnZSAoaWYgZGlmZmVyZW50KSwgYXMgdGhlIGV4dGVuZGVkCi0gICAgICAgIC8vIGNvbnRleHQuCi0KLSAgICAgICAgSVBhZ2UgcmVuZGVyUGFnZSA9IGN5Y2xlLmdldFBhZ2UoKTsKLSAgICAgICAgSVBhZ2UgY29tcG9uZW50UGFnZSA9IGNvbXBvbmVudC5nZXRQYWdlKCk7Ci0KLSAgICAgICAgYm9vbGVhbiBjb21wbGV4ID0gcmVuZGVyUGFnZSAhPSBjb21wb25lbnRQYWdlOwotCi0gICAgICAgIFN0cmluZ1tdIGNvbnRleHQgPSBjb21wbGV4ID8gbmV3IFN0cmluZ1s0XSA6IG5ldyBTdHJpbmdbM107Ci0KLSAgICAgICAgaW50IGkgPSAwOwotCi0gICAgICAgIFN0cmluZyBzdGF0ZWZ1bCA9IGN5Y2xlLmdldEVuZ2luZSgpLmlzU3RhdGVmdWwoKSA/IFNUQVRFRlVMX09OIDogU1RBVEVGVUxfT0ZGOwotCi0gICAgICAgIGNvbnRleHRbaSsrXSA9IHN0YXRlZnVsOwotCi0gICAgICAgIGlmIChjb21wbGV4KQotICAgICAgICAgICAgY29udGV4dFtpKytdID0gcmVuZGVyUGFnZS5nZXRQYWdlTmFtZSgpOwotCi0gICAgICAgIGNvbnRleHRbaSsrXSA9IGNvbXBvbmVudFBhZ2UuZ2V0UGFnZU5hbWUoKTsKLSAgICAgICAgY29udGV4dFtpKytdID0gY29tcG9uZW50LmdldElkUGF0aCgpOwotCi0gICAgICAgIHJldHVybiBjb25zdHJ1Y3RMaW5rKGN5Y2xlLCBUYXBlc3RyeS5ESVJFQ1RfU0VSVklDRSwgY29udGV4dCwgcGFyYW1ldGVycywgdHJ1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2VydmljZSgKLSAgICAgICAgSUVuZ2luZVNlcnZpY2VWaWV3IGVuZ2luZSwKLSAgICAgICAgSVJlcXVlc3RDeWNsZSBjeWNsZSwKLSAgICAgICAgUmVzcG9uc2VPdXRwdXRTdHJlYW0gb3V0cHV0KQotICAgICAgICB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIElEaXJlY3QgZGlyZWN0OwotICAgICAgICBpbnQgY291bnQgPSAwOwotICAgICAgICBTdHJpbmcgY29tcG9uZW50UGFnZU5hbWU7Ci0gICAgICAgIElQYWdlIGNvbXBvbmVudFBhZ2U7Ci0gICAgICAgIFJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0ID0gY3ljbGUuZ2V0UmVxdWVzdENvbnRleHQoKTsKLSAgICAgICAgU3RyaW5nW10gc2VydmljZUNvbnRleHQgPSBnZXRTZXJ2aWNlQ29udGV4dChyZXF1ZXN0Q29udGV4dCk7Ci0KLSAgICAgICAgaWYgKHNlcnZpY2VDb250ZXh0ICE9IG51bGwpCi0gICAgICAgICAgICBjb3VudCA9IHNlcnZpY2VDb250ZXh0Lmxlbmd0aDsKLQotICAgICAgICBpZiAoY291bnQgIT0gMyAmJiBjb3VudCAhPSA0KQotICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICBUYXBlc3RyeS5nZXRNZXNzYWdlKCJEaXJlY3RTZXJ2aWNlLmNvbnRleHQtcGFyYW1ldGVycyIpKTsKLQotICAgICAgICBib29sZWFuIGNvbXBsZXggPSBjb3VudCA9PSA0OwotCi0gICAgICAgIGludCBpID0gMDsKLSAgICAgICAgU3RyaW5nIHN0YXRlZnVsID0gc2VydmljZUNvbnRleHRbaSsrXTsKLSAgICAgICAgU3RyaW5nIHBhZ2VOYW1lID0gc2VydmljZUNvbnRleHRbaSsrXTsKLQotICAgICAgICBpZiAoY29tcGxleCkKLSAgICAgICAgICAgIGNvbXBvbmVudFBhZ2VOYW1lID0gc2VydmljZUNvbnRleHRbaSsrXTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgY29tcG9uZW50UGFnZU5hbWUgPSBwYWdlTmFtZTsKLQotICAgICAgICBTdHJpbmcgY29tcG9uZW50UGF0aCA9IHNlcnZpY2VDb250ZXh0W2krK107Ci0KLSAgICAgICAgSVBhZ2UgcGFnZSA9IGN5Y2xlLmdldFBhZ2UocGFnZU5hbWUpOwotCi0gICAgICAgIGN5Y2xlLmFjdGl2YXRlKHBhZ2UpOwotCi0gICAgICAgIGlmIChjb21wbGV4KQotICAgICAgICAgICAgY29tcG9uZW50UGFnZSA9IGN5Y2xlLmdldFBhZ2UoY29tcG9uZW50UGFnZU5hbWUpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBjb21wb25lbnRQYWdlID0gcGFnZTsKLQotICAgICAgICBJQ29tcG9uZW50IGNvbXBvbmVudCA9IGNvbXBvbmVudFBhZ2UuZ2V0TmVzdGVkQ29tcG9uZW50KGNvbXBvbmVudFBhdGgpOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBkaXJlY3QgPSAoSURpcmVjdCkgY29tcG9uZW50OwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZXgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgVGFwZXN0cnkuZm9ybWF0KCJEaXJlY3RTZXJ2aWNlLmNvbXBvbmVudC13cm9uZy10eXBlIiwgY29tcG9uZW50LmdldEV4dGVuZGVkSWQoKSksCi0gICAgICAgICAgICAgICAgY29tcG9uZW50LAotICAgICAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAgICAgZXgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ2hlY2sgZm9yIGEgU3RhdGVTZXNzaW9uIG9ubHkgdGhlIHNlc3Npb24gd2FzIHN0YXRlZnVsIHdoZW4KLSAgICAgICAgLy8gdGhlIEdlc3R1cmUgd2FzIGNyZWF0ZWQuCi0KLSAgICAgICAgaWYgKHN0YXRlZnVsLmVxdWFscyhTVEFURUZVTF9PTikgJiYgZGlyZWN0LmlzU3RhdGVmdWwoKSkKLSAgICAgICAgewotICAgICAgICAgICAgSHR0cFNlc3Npb24gc2Vzc2lvbiA9IGN5Y2xlLmdldFJlcXVlc3RDb250ZXh0KCkuZ2V0U2Vzc2lvbigpOwotCi0gICAgICAgICAgICBpZiAoc2Vzc2lvbiA9PSBudWxsIHx8IHNlc3Npb24uaXNOZXcoKSkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU3RhbGVTZXNzaW9uRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICBUYXBlc3RyeS5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAiRGlyZWN0U2VydmljZS5zdGFsZS1zZXNzaW9uLWV4Y2VwdGlvbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3QuZ2V0RXh0ZW5kZWRJZCgpKSwKLSAgICAgICAgICAgICAgICAgICAgZGlyZWN0LmdldFBhZ2UoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBPYmplY3RbXSBwYXJhbWV0ZXJzID0gZ2V0UGFyYW1ldGVycyhjeWNsZSk7Ci0KLSAgICAgICAgY3ljbGUuc2V0U2VydmljZVBhcmFtZXRlcnMocGFyYW1ldGVycyk7Ci0gICAgICAgIGRpcmVjdC50cmlnZ2VyKGN5Y2xlKTsKLQotICAgICAgICAvLyBSZW5kZXIgdGhlIHJlc3BvbnNlLiAgVGhpcyB3aWxsIGJlIHRoZSByZXNwb25zZSBwYWdlICh0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgY29udGV4dCkKLSAgICAgICAgLy8gdW5sZXNzIHRoZSBkaXJlY3QgKG9yIGl0cyBkZWxlZ2F0ZSkgY2hhbmdlcyBpdC4KLQotICAgICAgICBlbmdpbmUucmVuZGVyUmVzcG9uc2UoY3ljbGUsIG91dHB1dCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBUYXBlc3RyeS5ESVJFQ1RfU0VSVklDRTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2VuZ2luZS9FbmdpbmVTZXJ2aWNlTGluay5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2VuZ2luZS9FbmdpbmVTZXJ2aWNlTGluay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzY2MDQ4Li4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9lbmdpbmUvRW5naW5lU2VydmljZUxpbmsuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MCArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5lbmdpbmU7Ci0KLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2RlYy5uZXQuVVJMQ29kZWM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuYnVpbGRlci5Ub1N0cmluZ0J1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5BcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVxdWVzdEN5Y2xlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuVGFwZXN0cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5yZXF1ZXN0LlJlcXVlc3RDb250ZXh0OwotCi0vKioKLSAqICBBIEVuZ2luZVNlcnZpY2VMaW5rIHJlcHJlc2VudHMgYSBwb3NzaWJsZSBhY3Rpb24gd2l0aGluIHRoZSBjbGllbnQgd2ViIGJyb3dzZXI7Ci0gKiAgZWl0aGVyIGNsaWNraW5nIGEgbGluayBvciBzdWJtaXR0aW5nIGEgZm9ybSwgd2hpY2ggaXMgY29uc3RydWN0ZWQgcHJpbWFyaWx5Ci0gKiAgZnJvbSB0aGUge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkuSUVuZ2luZSNnZXRTZXJ2bGV0UGF0aCgpIHNlcnZsZXQgcGF0aH0sCi0gKiAgd2l0aCBzb21lIGFkZGl0aW9uYWwgcXVlcnkgcGFyYW1ldGVycy4gIEEgZnVsbCBVUkwgZm9yIHRoZSBFbmdpbmVTZXJ2aWNlTGluawotICogIGNhbiBiZSBnZW5lcmF0ZWQsIG9yIHRoZSBxdWVyeSBwYXJhbWV0ZXJzIGZvciB0aGUgRW5naW5lU2VydmljZUxpbmsgY2FuIGJlIGV4dHJhY3RlZAotICogIChzZXBhcmF0ZWx5IGZyb20gdGhlIHNlcnZsZXQgcGF0aCkuICBUaGUgbGF0dGVyIGNhc2UgaXMgdXNlZCB3aGVuIHN1Ym1pdHRpbmcKLSAqICBjb25zdHJ1Y3Rpbmcge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkuZm9ybS5Gb3JtIGZvcm1zfS4KLSAqCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogIEB2ZXJzaW9uICRJZCQKLSAqICBAc2luY2UgMy4wCi0gKiAKLSAqKi8KLQotcHVibGljIGNsYXNzIEVuZ2luZVNlcnZpY2VMaW5rIGltcGxlbWVudHMgSUxpbmsKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9IVFRQX1BPUlQgPSA4MDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBVUkxDb2RlYyBfdXJsQ29kZWMgPSBuZXcgVVJMQ29kZWMoKTsKLQotICAgIHByaXZhdGUgSVJlcXVlc3RDeWNsZSBfY3ljbGU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgX3NlcnZpY2U7Ci0gICAgcHJpdmF0ZSBTdHJpbmdbXSBfcGFyYW1ldGVyczsKLSAgICBwcml2YXRlIGJvb2xlYW4gX3N0YXRlZnVsOwotCi0gICAgLyoqCi0gICAgICogIENyZWF0ZXMgYSBuZXcgRW5naW5lU2VydmljZUxpbmsuICBBIEVuZ2luZVNlcnZpY2VMaW5rIGFsd2F5cyBuYW1lcyBhIHNlcnZpY2UgdG8gYmUgYWN0aXZhdGVkCi0gICAgICogIGJ5IHRoZSBsaW5rLCBoYXMgYW4gb3B0aW9uYWwgbGlzdCBvZiBzZXJ2aWNlIGNvbnRleHQgc3RyaW5ncywKLSAgICAgKiAgYW4gb3B0aW9uYWwgbGlzdCBvZiBzZXJ2aWNlIHBhcmFtZXRlciBzdHJpbmdzIGFuZCBtYXkgYmUgc3RhdGVmdWwKLSAgICAgKiAgb3Igc3RhdGVsZXNzLgotICAgICAqIAotICAgICAqICA8cD5TZXJ2aWNlTGluayBwYXJhbWV0ZXIgc3RyaW5ncyBtYXkgY29udGFpbiBhbnkgY2hhcmFjdGVycy4KLSAgICAgKiAKLSAgICAgKiAgPHA+U2VydmljZUxpbmsgY29udGV4dCBzdHJpbmdzIG11c3QgYmUgVVJMIHNhZmUsIGFuZCBtYXkgbm90IGNvbnRhaW4KLSAgICAgKiAgc2xhc2ggKCcvJykgY2hhcmFjdGVycy4gIFR5cGljYWxseSwgb25seSBsZXR0ZXJzLCBudW1iZXJzIGFuZCBzaW1wbGUKLSAgICAgKiAgcHVuY3R1YXRpb24gKCcuJywgJy0nLCAnXycsICc6JykgaXMgcmVjb21tZW5kZWQgKG5vIGNoZWNrcyBhcmUgY3VycmVudGx5IG1hZGUsCi0gICAgICogIGhvd2V2ZXIpLiAgQ29udGV4dCBzdHJpbmdzIGFyZSBnZW5lcmFsbHkgYnVpbHQgZnJvbSBwYWdlIG5hbWVzCi0gICAgICogIGFuZCBjb21wb25lbnQgaWRzLCB3aGljaCBhcmUgbGltaXRlZCB0byBzYWZlIGNoYXJhY3RlcnMuCi0gICAgICogIAotICAgICAqICBAcGFyYW0gY3ljbGUgVGhlIHtAbGluayBJUmVxdWVzdEN5Y2xlfSB0aGUgRW5naW5lU2VydmljZUxpbmsgaXMgdG8gYmUgY3JlYXRlZCBmb3IuCi0gICAgICogIEBwYXJhbSBzZXJ2aWNlTmFtZSBUaGUgbmFtZSBvZiB0aGUgc2VydmljZSB0byBiZSBpbnZva2VkIGJ5IHRoZSBFbmdpbmVTZXJ2aWNlTGluay4KLSAgICAgKiAgQHBhcmFtIHNlcnZpY2VDb250ZXh0IGFuIG9wdGlvbmFsIGFycmF5IG9mIHN0cmluZ3MgdG8gYmUgcHJvdmlkZWQKLSAgICAgKiAgdG8gdGhlIHNlcnZpY2UgdG8gcHJvdmlkZSBhIGNvbnRleHQgZm9yIGV4ZWN1dGluZyB0aGUgc2VydmljZS4gIE1heSBiZSBudWxsCi0gICAgICogIG9yIGVtcHR5LiAgPGI+Tm90ZTogY29waWVkLCBub3QgcmV0YWluZWQuPC9iPgotICAgICAqICBAcGFyYW0gc2VydmljZVBhcmFtZXRlcnMgQW4gYXJyYXkgb2YgcGFyYW1ldGVycywgbWF5IGJlIAotICAgICAqICBudWxsIG9yIGVtcHR5LiA8Yj5Ob3RlOiByZXRhaW5lZCwgbm90IGNvcGllZC48L2I+Ci0gICAgICogIEBwYXJhbSBzdGF0ZWZ1bCBpZiB0cnVlLCB0aGUgc2VydmljZSB3aGljaCBnZW5lcmF0ZWQgdGhlIEVuZ2luZVNlcnZpY2VMaW5rCi0gICAgICogIGlzIHN0YXRlZnVsIGFuZCBleHBlY3RzIHRoYXQgdGhlIGZpbmFsIFVSTCB3aWxsIGJlIHBhc3NlZCB0aHJvdWdoCi0gICAgICogIHtAbGluayBJUmVxdWVzdEN5Y2xlI2VuY29kZVVSTChTdHJpbmcpfS4KLSAgICAgKiovCi0KLSAgICBwdWJsaWMgRW5naW5lU2VydmljZUxpbmsoCi0gICAgICAgIElSZXF1ZXN0Q3ljbGUgY3ljbGUsCi0gICAgICAgIFN0cmluZyBzZXJ2aWNlTmFtZSwKLSAgICAgICAgU3RyaW5nW10gc2VydmljZUNvbnRleHQsCi0gICAgICAgIFN0cmluZ1tdIHNlcnZpY2VQYXJhbWV0ZXJzLAotICAgICAgICBib29sZWFuIHN0YXRlZnVsKQotICAgIHsKLSAgICAgICAgX2N5Y2xlID0gY3ljbGU7Ci0gICAgICAgIF9zZXJ2aWNlID0gY29uc3RydWN0U2VydmljZVZhbHVlKHNlcnZpY2VOYW1lLCBzZXJ2aWNlQ29udGV4dCk7Ci0gICAgICAgIF9wYXJhbWV0ZXJzID0gc2VydmljZVBhcmFtZXRlcnM7Ci0gICAgICAgIF9zdGF0ZWZ1bCA9IHN0YXRlZnVsOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGNvbnN0cnVjdFNlcnZpY2VWYWx1ZShTdHJpbmcgc2VydmljZU5hbWUsIFN0cmluZ1tdIHNlcnZpY2VDb250ZXh0KQotICAgIHsKLSAgICAgICAgaW50IGNvdW50ID0gVGFwZXN0cnkuc2l6ZShzZXJ2aWNlQ29udGV4dCk7Ci0KLSAgICAgICAgaWYgKGNvdW50ID09IDApCi0gICAgICAgICAgICByZXR1cm4gc2VydmljZU5hbWU7Ci0KLSAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoc2VydmljZU5hbWUpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgnLycpOwotCi0gICAgICAgICAgICBidWZmZXIuYXBwZW5kKHNlcnZpY2VDb250ZXh0W2ldKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFVSTCgpCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0VVJMKG51bGwsIHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VVJMKFN0cmluZyBhbmNob3IsIGJvb2xlYW4gaW5jbHVkZVBhcmFtZXRlcnMpCi0gICAgewotICAgICAgICByZXR1cm4gY29uc3RydWN0VVJMKG5ldyBTdHJpbmdCdWZmZXIoKSwgYW5jaG9yLCBpbmNsdWRlUGFyYW1ldGVycyk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBYnNvbHV0ZVVSTCgpCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0QWJzb2x1dGVVUkwobnVsbCwgbnVsbCwgMCwgbnVsbCwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBYnNvbHV0ZVVSTCgKLSAgICAgICAgU3RyaW5nIHNjaGVtZSwKLSAgICAgICAgU3RyaW5nIHNlcnZlciwKLSAgICAgICAgaW50IHBvcnQsCi0gICAgICAgIFN0cmluZyBhbmNob3IsCi0gICAgICAgIGJvb2xlYW4gaW5jbHVkZVBhcmFtZXRlcnMpCi0gICAgewotICAgICAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBSZXF1ZXN0Q29udGV4dCBjb250ZXh0ID0gX2N5Y2xlLmdldFJlcXVlc3RDb250ZXh0KCk7Ci0KLSAgICAgICAgaWYgKHNjaGVtZSA9PSBudWxsKQotICAgICAgICAgICAgc2NoZW1lID0gY29udGV4dC5nZXRTY2hlbWUoKTsKLQotICAgICAgICBidWZmZXIuYXBwZW5kKHNjaGVtZSk7Ci0gICAgICAgIGJ1ZmZlci5hcHBlbmQoIjovLyIpOwotCi0gICAgICAgIGlmIChzZXJ2ZXIgPT0gbnVsbCkKLSAgICAgICAgICAgIHNlcnZlciA9IGNvbnRleHQuZ2V0U2VydmVyTmFtZSgpOwotCi0gICAgICAgIGJ1ZmZlci5hcHBlbmQoc2VydmVyKTsKLQotICAgICAgICBpZiAocG9ydCA9PSAwKQotICAgICAgICAgICAgcG9ydCA9IGNvbnRleHQuZ2V0U2VydmVyUG9ydCgpOwotCi0gICAgICAgIGlmICghKHNjaGVtZS5lcXVhbHMoImh0dHAiKSAmJiBwb3J0ID09IERFRkFVTFRfSFRUUF9QT1JUKSkKLSAgICAgICAgewotICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgnOicpOwotICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChwb3J0KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEFkZCB0aGUgc2VydmxldCBwYXRoIGFuZCB0aGUgcmVzdCBvZiB0aGUgVVJMICYgcXVlcnkgcGFyYW1ldGVycy4KLSAgICAgICAgLy8gVGhlIHNlcnZsZXQgcGF0aCBzdGFydHMgd2l0aCBhIGxlYWRpbmcgc2xhc2guCi0KLSAgICAgICAgcmV0dXJuIGNvbnN0cnVjdFVSTChidWZmZXIsIGFuY2hvciwgaW5jbHVkZVBhcmFtZXRlcnMpOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGNvbnN0cnVjdFVSTChTdHJpbmdCdWZmZXIgYnVmZmVyLCBTdHJpbmcgYW5jaG9yLCBib29sZWFuIGluY2x1ZGVQYXJhbWV0ZXJzKQotICAgIHsKLSAgICAgICAgYnVmZmVyLmFwcGVuZChfY3ljbGUuZ2V0RW5naW5lKCkuZ2V0U2VydmxldFBhdGgoKSk7Ci0KLSAgICAgICAgaWYgKGluY2x1ZGVQYXJhbWV0ZXJzKQotICAgICAgICB7Ci0gICAgICAgICAgICBidWZmZXIuYXBwZW5kKCc/Jyk7Ci0gICAgICAgICAgICBidWZmZXIuYXBwZW5kKFRhcGVzdHJ5LlNFUlZJQ0VfUVVFUllfUEFSQU1FVEVSX05BTUUpOwotICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgnPScpOwotICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChfc2VydmljZSk7Ci0KLSAgICAgICAgICAgIGludCBjb3VudCA9IFRhcGVzdHJ5LnNpemUoX3BhcmFtZXRlcnMpOwotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgnJicpOwotCi0gICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChUYXBlc3RyeS5QQVJBTUVURVJTX1FVRVJZX1BBUkFNRVRFUl9OQU1FKTsKLSAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCc9Jyk7Ci0KLSAgICAgICAgICAgICAgICBTdHJpbmcgZW5jb2RpbmcgPSBfY3ljbGUuZ2V0RW5naW5lKCkuZ2V0T3V0cHV0RW5jb2RpbmcoKTsKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBlbmNvZGVkID0gX3VybENvZGVjLmVuY29kZShfcGFyYW1ldGVyc1tpXSwgZW5jb2RpbmcpOwotICAgICAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKGVuY29kZWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgIFRhcGVzdHJ5LmZvcm1hdCgiaWxsZWdhbC1lbmNvZGluZyIsIGVuY29kaW5nKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChhbmNob3IgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgnIycpOwotICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChhbmNob3IpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9IGJ1ZmZlci50b1N0cmluZygpOwotCi0gICAgICAgIGlmIChfc3RhdGVmdWwpCi0gICAgICAgICAgICByZXN1bHQgPSBfY3ljbGUuZW5jb2RlVVJMKHJlc3VsdCk7Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0UGFyYW1ldGVyTmFtZXMoKQotICAgIHsKLSAgICAgICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgICAgIGxpc3QuYWRkKFRhcGVzdHJ5LlNFUlZJQ0VfUVVFUllfUEFSQU1FVEVSX05BTUUpOwotCi0gICAgICAgIGlmIChUYXBlc3RyeS5zaXplKF9wYXJhbWV0ZXJzKSAhPSAwKQotICAgICAgICAgICAgbGlzdC5hZGQoVGFwZXN0cnkuUEFSQU1FVEVSU19RVUVSWV9QQVJBTUVURVJfTkFNRSk7Ci0KLSAgICAgICAgcmV0dXJuIChTdHJpbmdbXSkgbGlzdC50b0FycmF5KG5ldyBTdHJpbmdbbGlzdC5zaXplKCldKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0UGFyYW1ldGVyVmFsdWVzKFN0cmluZyBuYW1lKQotICAgIHsKLSAgICAgICAgaWYgKG5hbWUuZXF1YWxzKFRhcGVzdHJ5LlNFUlZJQ0VfUVVFUllfUEFSQU1FVEVSX05BTUUpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdIHsgX3NlcnZpY2UgfTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChuYW1lLmVxdWFscyhUYXBlc3RyeS5QQVJBTUVURVJTX1FVRVJZX1BBUkFNRVRFUl9OQU1FKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIF9wYXJhbWV0ZXJzOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgIFRhcGVzdHJ5LmZvcm1hdCgiRW5naW5lU2VydmljZUxpbmsudW5rbm93bi1wYXJhbWV0ZXItbmFtZSIsIG5hbWUpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgICB7Ci0gICAgICAgIFRvU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFRvU3RyaW5nQnVpbGRlcih0aGlzKTsKLQotICAgICAgICBidWlsZGVyLmFwcGVuZCgic2VydmljZSIsIF9zZXJ2aWNlKTsKLSAgICAgICAgYnVpbGRlci5hcHBlbmQoInBhcmFtZXRlcnMiLCBfcGFyYW1ldGVycyk7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJzdGF0ZWZ1bCIsIF9zdGF0ZWZ1bCk7Ci0KLSAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICB9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZW5naW5lL0V4dGVybmFsU2VydmljZS5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2VuZ2luZS9FeHRlcm5hbFNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWUwNzkwZi4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZW5naW5lL0V4dGVybmFsU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg1ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmVuZ2luZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LkFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JRXh0ZXJuYWxQYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlcXVlc3RDeWNsZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LlRhcGVzdHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkucmVxdWVzdC5SZXNwb25zZU91dHB1dFN0cmVhbTsKLQotLyoqCi0gKiBUaGUgZXh0ZXJuYWwgc2VydmljZSBlbmFibGVzIGV4dGVybmFsIGFwcGxpY2F0aW9ucwotICogdG8gcmVmZXJlbmNlIFRhcGVzdHJ5IHBhZ2VzIHZpYSBhIFVSTC4gUGFnZXMgd2hpY2ggY2FuIGJlIHJlZmVyZW5jZWQKLSAqIGJ5IHRoZSBleHRlcm5hbCBzZXJ2aWNlIG11c3QgaW1wbGVtZW50IHRoZSB7QGxpbmsgSUV4dGVybmFsUGFnZX0KLSAqIGludGVyZmFjZS4gVGhlIGV4dGVybmFsIHNlcnZpY2UgZW5hYmxlcyB0aGUgYm9va21hcmtpbmcgb2YgcGFnZXMuCi0gKiAKLSAqIDxwPgotICogVGhlIGV4dGVybmFsIHNlcnZpY2UgbWF5IGFsc28gYmUgdXNlZCBieSB0aGUgVGFwZXN0cnkgSlNQIHRhZ2xpYnJhcnkKLSAqICh7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5qc3AuRXh0ZXJuYWxVUkxUYWd9IGFuZCB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5qc3AuRXh0ZXJuYWxUYWd9KS4KLSAqIAotICogPHA+IAotICogWW91IGNhbiB0cnkgYW5kIHNlY29uZCBndWVzcyB0aGUgVVJMIGZvcm1hdCB1c2VkIGJ5IFRhcGVzdHJ5LiAKLSAqIFRoZSBkZWZhdWx0IFVSTCBmb3JtYXQgZm9yIHRoZSBleHRlcm5hbCBzZXJ2aWNlIGlzOgotICogPGJsb2NrcXVvdGU+Ci0gKiA8dHQ+aHR0cDovL2xvY2FsaG9zdC9hcHA/c2VydmljZT1leHRlcm5hbC88aT5bUGFnZSBOYW1lXTwvaT4mYW1wO3NwPVtQYXJhbSAwXSZhbXA7c3A9W1BhcmFtIDFdLi4uPC90dD4KLSAqIDwvYmxvY2txdW90ZT4KLSAqIEZvciBleGFtcGxlIHRvIHZpZXcgdGhlICJWaWV3Q3VzdG9tZXIiIHBhZ2UgdGhlIHNlcnZpY2UgcGFyYW1ldGVycyA1MDU2IChjdXN0b21lciBJRCkgYW5kCi0gKiAzMDkgKGNvbXBhbnkgSUQpIHRoZSBleHRlcm5hbCBzZXJ2aWNlIFVSTCB3b3VsZCBiZToKLSAqIDxibG9ja3F1b3RlPgotICogPHR0Pmh0dHA6Ly9sb2NhbGhvc3QvbXlhcHA/c2VydmljZT1leHRlcm5hbCZhbXA7Y29udGV4dD08Yj5WaWV3Q3VzdG9tZXI8L2I+JmFtcDtzcD08Yj41MDU2PC9iPiZhbXA7c3A9PGI+MzAyPC9iPjwvdHQ+Ci0gKiA8L2Jsb2NrcXVvdGU+Ci0gKiBJbiB0aGlzIGV4YW1wbGUgZXh0ZXJuYWwgc2VydmljZSB3aWxsIGdldCBhICJWaWV3Q3VzdG9tZXIiIHBhZ2UgYW5kIGludm9rZSB0aGUgCi0gKiB7QGxpbmsgSUV4dGVybmFsUGFnZSNhY3RpdmF0ZUV4dGVybmFsUGFnZShPYmplY3RbXSwgSVJlcXVlc3RDeWNsZSl9IG1ldGhvZCB3aXRoIHRoZSBwYXJhbWV0ZXJzOiAgCi0gKiBPYmplY3RbXSB7IG5ldyBJbnRlZ2VyKDUwNTYpLCBuZXcgSW50ZWdlcigzMDIpIH0uCi0gKiA8cD4KLSAqIE5vdGUgc2VydmljZSBwYXJhbWV0ZXJzIChzcCkgbmVlZCB0byBiZSBwcmVmaXhlZCBieSB2YWxpZAotICoge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkudXRpbC5pby5EYXRhU3F1ZWV6ZXJ9IGFkYXB0b3IgY2hhci4gVGhlc2UgYWRhcHRvciBjaGFycyBhcmUgYXV0b21hdGljYWxseSBwcm92aWRlZCBpbgotICogVVJMJ3MgY3JlYXRlZCBieSB0aGUgPHR0PmJ1aWxkR2VzdHVyZSgpPC90dD4gbWV0aG9kLiBIb3dldmVyIGlmIHlvdSBoYW5kIGNvZGVkIGFuIGV4dGVybmFsIAotICogc2VydmljZSBVUkwgeW91IHdpbGwgbmVlZCB0byBlbnN1cmUgdmFsaWQgcHJlZml4IGNoYXJzIGFyZSBwcmVzZW50LgotICogPHA+Ci0gKiA8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiI+Ci0gKiAgPHRyPgotICogICA8dGg+UHJlZml4IGNoYXIocyk8L3RoPjx0aD5NYXBwZWQgSmF2YSBUeXBlPC90aD4KLSAqICA8L3RyPgotICogIDx0cj4KLSAqICAgPHRkPiZuYnNwO1RGPC90ZD48dGQ+Jm5ic3A7Ym9vbGVhbjwvdGQ+Ci0gKiAgPC90cj4KLSAqICA8dHI+Ci0gKiAgIDx0ZD4mbmJzcDtiPC90ZD48dGQ+Jm5ic3A7Ynl0ZTwvdGQ+Ci0gKiAgPC90cj4KLSAqICA8dHI+Ci0gKiAgIDx0ZD4mbmJzcDtjPC90ZD48dGQ+Jm5ic3A7Y2hhcjwvdGQ+Ci0gKiAgPC90cj4KLSAqICA8dHI+Ci0gKiAgIDx0ZD4mbmJzcDtkPC90ZD48dGQ+Jm5ic3A7ZG91YmxlPC90ZD4KLSAqICA8L3RyPgotICogIDx0cj4KLSAqICAgPHRkPiZuYnNwOy0wMTIzNDU2Nzg5PC90ZD48dGQ+Jm5ic3A7aW50ZWdlcjwvdGQ+Ci0gKiAgPC90cj4KLSAqICA8dHI+Ci0gKiAgIDx0ZD4mbmJzcDtsPC90ZD48dGQ+Jm5ic3A7bG9uZzwvdGQ+Ci0gKiAgPC90cj4KLSAqICA8dHI+Ci0gKiAgIDx0ZD4mbmJzcDtTPC90ZD48dGQ+Jm5ic3A7U3RyaW5nPC90ZD4KLSAqICA8L3RyPgotICogIDx0cj4KLSAqICAgPHRkPiZuYnNwO3M8L3RkPjx0ZD4mbmJzcDtzaG9ydDwvdGQ+Ci0gKiAgPC90cj4KLSAqICA8dHI+Ci0gKiAgIDx0ZD4mbmJzcDtvdGhlciBjaGFyczwvdGQ+Ci0gKiAgIDx0ZD4mbmJzcDs8dHQ+U3RyaW5nPC90dD4gd2l0aG91dCB0cnVuY2F0aW9uIG9mIGZpcnN0IGNoYXI8L3RkPgotICogIDwvdHI+Ci0gKiA8dGFibGU+Ci0gKiAgPHA+Ci0gKiAgPHA+Ci0gKiAgQSBnb29kIHJ1bGUgb2YgdGh1bWIgaXMgdG8ga2VlcCB0aGUgaW5mb3JtYXRpb24gZW5jb2RlZCBpbiB0aGUgVVJMIHNob3J0IGFuZCBzaW1wbGUsIGFuZCByZXN0cmljdCBpdAotICogIHRvIGp1c3QgU3RyaW5ncyBhbmQgSW50ZWdlcnMuICBJbnRlZ2VycyBjYW4gYmUgZW5jb2RlZCBhcy1pcy4gIFByZWZpeGluZyBhbGwgU3RyaW5ncyB3aXRoIHRoZSBsZXR0ZXIgJ1MnCi0gKiAgd2lsbCBlbnN1cmUgdGhhdCB0aGV5IGFyZSBkZWNvZGVkIHByb3Blcmx5LiAgQWdhaW4sIHRoaXMgaXMgb25seSByZWxldmFudCBpZiBhbiAKLSAqICB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5JRXh0ZXJuYWxQYWdlfSBpcyBiZWluZyByZWZlcmVuY2VkIGZyb20gc3RhdGljIEhUTUwgb3IgSlNQIGFuZCB0aGUKLSAqICBVUkwgbXVzdCBiZSBhc3NlbWJsZWQgaW4gdXNlciBjb2RlIC4uLiB3aGVuIHRoZSBVUkwgaXMgZ2VuZXJhdGVkIGJ5IFRhcGVzdHJ5LCBpdCBpcyBhdXRvbWF0aWNhbGx5Ci0gKiAgY3JlYXRlZCB3aXRoIHRoZSBjb3JyZWN0IHByZWZpeGVzIGFuZCBlbmNvZGluZ3MgKGFzIHdpdGggYW55IG90aGVyIHNlcnZpY2UpLgotICogCi0gKiBAc2VlIG9yZy5hcGFjaGUudGFwZXN0cnkuSUV4dGVybmFsUGFnZQotICogQHNlZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmpzcC5FeHRlcm5hbFRhZwotICogQHNlZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmpzcC5FeHRlcm5hbFVSTFRhZwotICoKLSAqIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqIEBhdXRob3IgTWFsY29sbSBFZGdhcgotICogQHNpbmNlIDIuMgotICogIAotICoqLwotCi1wdWJsaWMgY2xhc3MgRXh0ZXJuYWxTZXJ2aWNlIGV4dGVuZHMgQWJzdHJhY3RTZXJ2aWNlCi17Ci0KLSAgLyoqCi0gICAqICBCdWlsZHMgYSBVUkwgZm9yIGEgc2VydmljZS4gIFRoaXMgaXMgcGVyZm9ybWVkIGR1cmluZyB0aGUKLSAgICogIHJlbmRlcmluZyBwaGFzZSBvZiBvbmUgcmVxdWVzdCBjeWNsZSBhbmQgYnVsZHMgVVJMcyB0aGF0IHdpbGwKLSAgICogIGludm9rZSBhY3Rpdml0eSBpbiBhIHN1YnNlcXVlbnQgcmVxdWVzdCBjeWNsZS4KLSAgICoKLSAgICogIEBwYXJhbSBjeWNsZSBEZWZpbmVzIHRoZSByZXF1ZXN0IGN5Y2xlIGJlaW5nIHByb2Nlc3NlZC4KLSAgICogIEBwYXJhbSBjb21wb25lbnQgVGhlIGNvbXBvbmVudCByZXF1ZXN0aW5nIHRoZSBVUkwuICBHZW5lcmFsbHksIHRoZQotICAgKiAgc2VydmljZSBjb250ZXh0IGlzIGVzdGFibGlzaGVkIGZyb20gdGhlIGNvbXBvbmVudC4KLSAgICogIEBwYXJhbSBwYXJhbWV0ZXJzIEFkZGl0aW9uYWwgcGFyYW1ldGVycyBzcGVjaWZpYyB0byB0aGUKLSAgICogIGNvbXBvbmVudCByZXF1ZXN0aW5nIHRoZSBFbmdpbmVTZXJ2aWNlTGluay4KLSAgICogIEByZXR1cm4gVGhlIFVSTCBmb3IgdGhlIHNlcnZpY2UuICBUaGUgVVJMIGFsd2F5cyBiZSBlbmNvZGVkIHdoZW4gaXQgaXMgcmV0dXJuZWQuCi0gICAqCi0gICAqKi8KLSAgCi0gICAgcHVibGljIElMaW5rIGdldExpbmsoSVJlcXVlc3RDeWNsZSBjeWNsZSwgSUNvbXBvbmVudCBjb21wb25lbnQsIE9iamVjdFtdIHBhcmFtZXRlcnMpCi0gICAgewotICAgICAgICBpZiAocGFyYW1ldGVycyA9PSBudWxsIHx8IHBhcmFtZXRlcnMubGVuZ3RoID09IDApCi0gICAgICAgICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIFRhcGVzdHJ5LmZvcm1hdCgic2VydmljZS1yZXF1aXJlcy1wYXJhbWV0ZXJzIiwgVGFwZXN0cnkuRVhURVJOQUxfU0VSVklDRSkpOwotCi0gICAgICAgIFN0cmluZyBwYWdlTmFtZSA9IChTdHJpbmcpIHBhcmFtZXRlcnNbMF07Ci0gICAgICAgIFN0cmluZ1tdIGNvbnRleHQgPSBuZXcgU3RyaW5nW10geyBwYWdlTmFtZSB9OwotCi0gICAgICAgIE9iamVjdFtdIHBhZ2VQYXJhbWV0ZXJzID0gbmV3IE9iamVjdFtwYXJhbWV0ZXJzLmxlbmd0aCAtIDFdOwotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHBhcmFtZXRlcnMsIDEsIHBhZ2VQYXJhbWV0ZXJzLCAwLCBwYXJhbWV0ZXJzLmxlbmd0aCAtIDEpOwotCi0gICAgICAgIHJldHVybiBjb25zdHJ1Y3RMaW5rKGN5Y2xlLCBUYXBlc3RyeS5FWFRFUk5BTF9TRVJWSUNFLCBjb250ZXh0LCBwYWdlUGFyYW1ldGVycywgdHJ1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2VydmljZSgKLSAgICAgICAgSUVuZ2luZVNlcnZpY2VWaWV3IGVuZ2luZSwKLSAgICAgICAgSVJlcXVlc3RDeWNsZSBjeWNsZSwKLSAgICAgICAgUmVzcG9uc2VPdXRwdXRTdHJlYW0gb3V0cHV0KQotICAgICAgICB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIElFeHRlcm5hbFBhZ2UgcGFnZSA9IG51bGw7Ci0KLSAgICAgICAgU3RyaW5nW10gY29udGV4dCA9IGdldFNlcnZpY2VDb250ZXh0KGN5Y2xlLmdldFJlcXVlc3RDb250ZXh0KCkpOwotCi0gICAgICAgIGlmIChjb250ZXh0ID09IG51bGwgfHwgY29udGV4dC5sZW5ndGggIT0gMSkKLSAgICAgICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgVGFwZXN0cnkuZm9ybWF0KCJzZXJ2aWNlLXNpbmdsZS1jb250ZXh0LXBhcmFtZXRlciIsIFRhcGVzdHJ5LkVYVEVSTkFMX1NFUlZJQ0UpKTsKLQotICAgICAgICBTdHJpbmcgcGFnZU5hbWUgPSBjb250ZXh0WzBdOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBwYWdlID0gKElFeHRlcm5hbFBhZ2UpIGN5Y2xlLmdldFBhZ2UocGFnZU5hbWUpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZXgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgVGFwZXN0cnkuZm9ybWF0KCJFeHRlcm5hbFNlcnZpY2UucGFnZS1ub3QtY29tcGF0aWJsZSIsIHBhZ2VOYW1lKSwKLSAgICAgICAgICAgICAgICBleCk7Ci0gICAgICAgIH0KLQotICAgICAgICBPYmplY3RbXSBwYXJhbWV0ZXJzID0gZ2V0UGFyYW1ldGVycyhjeWNsZSk7Ci0KLSAgICAgICAgY3ljbGUuc2V0U2VydmljZVBhcmFtZXRlcnMocGFyYW1ldGVycyk7Ci0KLSAgICAgICAgY3ljbGUuYWN0aXZhdGUocGFnZSk7Ci0KLSAgICAgICAgcGFnZS5hY3RpdmF0ZUV4dGVybmFsUGFnZShwYXJhbWV0ZXJzLCBjeWNsZSk7Ci0KLSAgICAgICAgLy8gUmVuZGVyIHRoZSByZXNwb25zZS4KLSAgICAgICAgZW5naW5lLnJlbmRlclJlc3BvbnNlKGN5Y2xlLCBvdXRwdXQpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0gICAgewotICAgICAgICByZXR1cm4gVGFwZXN0cnkuRVhURVJOQUxfU0VSVklDRTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2VuZ2luZS9Ib21lU2VydmljZS5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2VuZ2luZS9Ib21lU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGQ2YzMzLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9lbmdpbmUvSG9tZVNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmVuZ2luZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JRW5naW5lOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVBhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVxdWVzdEN5Y2xlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuVGFwZXN0cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5yZXF1ZXN0LlJlc3BvbnNlT3V0cHV0U3RyZWFtOwotCi0vKioKLSAqICBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgaG9tZSBzZXJ2aWNlIHRoYXQgcmVuZGVycyB0aGUgSG9tZSBwYWdlLgotICogIFRoaXMgaXMgdGhlIG1vc3QgbGlrZWx5IGNhbmRpZGF0ZSBmb3Igb3ZlcnJpZGluZyAuLi4gZm9yIGV4YW1wbGUsCi0gKiAgdG8gc2VsZWN0IHRoZSBwYWdlIHRvIHJlbmRlciBiYXNlZCBvbiBrbm93biBpbmZvcm1hdGlvbiBhYm91dCB0aGUKLSAqICB1c2VyIChzdG9yZWQgYXMgYSBjb29raWUpLgotICogCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQHNpbmNlIDEuMC45Ci0gKgotICoqLwotCi1wdWJsaWMgY2xhc3MgSG9tZVNlcnZpY2UgZXh0ZW5kcyBBYnN0cmFjdFNlcnZpY2UKLXsKLQotICAgIHB1YmxpYyBJTGluayBnZXRMaW5rKElSZXF1ZXN0Q3ljbGUgY3ljbGUsIElDb21wb25lbnQgY29tcG9uZW50LCBPYmplY3RbXSBwYXJhbWV0ZXJzKQotICAgIHsKLSAgICAgICAgaWYgKFRhcGVzdHJ5LnNpemUocGFyYW1ldGVycykgIT0gMCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgVGFwZXN0cnkuZm9ybWF0KCJzZXJ2aWNlLW5vLXBhcmFtZXRlcnMiLCBUYXBlc3RyeS5IT01FX1NFUlZJQ0UpKTsKLQotICAgICAgICByZXR1cm4gY29uc3RydWN0TGluayhjeWNsZSwgVGFwZXN0cnkuSE9NRV9TRVJWSUNFLCBudWxsLCBudWxsLCB0cnVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXJ2aWNlKAotICAgICAgICBJRW5naW5lU2VydmljZVZpZXcgZW5naW5lLAotICAgICAgICBJUmVxdWVzdEN5Y2xlIGN5Y2xlLAotICAgICAgICBSZXNwb25zZU91dHB1dFN0cmVhbSBvdXRwdXQpCi0gICAgICAgIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgSVBhZ2UgaG9tZSA9IGN5Y2xlLmdldFBhZ2UoSUVuZ2luZS5IT01FX1BBR0UpOwotCi0gICAgICAgIGN5Y2xlLmFjdGl2YXRlKGhvbWUpOwotCi0gICAgICAgIGVuZ2luZS5yZW5kZXJSZXNwb25zZShjeWNsZSwgb3V0cHV0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIFRhcGVzdHJ5LkhPTUVfU0VSVklDRTsKLSAgICB9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZW5naW5lL0lDb21wb25lbnRDbGFzc0VuaGFuY2VyLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZW5naW5lL0lDb21wb25lbnRDbGFzc0VuaGFuY2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzZmU0ZDIuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2VuZ2luZS9JQ29tcG9uZW50Q2xhc3NFbmhhbmNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuZW5naW5lOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5zcGVjLklDb21wb25lbnRTcGVjaWZpY2F0aW9uOwotCi0vKioKLSAqCi0gKiAgQSBwcm92aWRlciBvZiBlbmhhbmNlZCBjbGFzc2VzLCBjbGFzc2VzIHdpdGggbmV3IG1ldGhvZHMgCi0gKiAgYW5kIG5ldyBhdHRyaWJ1dGVzLCBhbmQgcG9zc2libHksIGltcGxlbWVudGluZyBuZXcKLSAqICBKYXZhIGludGVyZmFjZXMuICBUaGUgcHJpbWFyeSB1c2Ugb2YgY2xhc3MgZW5oYW5jZW1lbnQgaXMgdG8KLSAqICBhdXRvbWF0ZSB0aGUgY3JlYXRpb24gb2YgdHJhbnNpZW50IGFuZCBwZXJzaXN0YW50IHByb3BlcnRpZXMuCi0gKiAKLSAqICA8cD4KLSAqICBJbXBsZW1lbnRhdGlvbnMgb2YgdGhpcyBpbnRlcmZhY2UgbXVzdCBiZSB0aHJlYWRzYWZlLgotICoKLSAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiAgQHZlcnNpb24gJElkJAotICogIEBzaW5jZSAzLjAKLSAqIAotICoqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElDb21wb25lbnRDbGFzc0VuaGFuY2VyCi17Ci0JLyoqCi0JICogIENsZWFycyBhbGwgY2FjaGVkIGRhdGEgZm9yIHRoZSBlbmhhbmNlcjsgdGhpcyBpbmNsdWRlcyByZWZlcmVuY2VzIHRvCi0JICogIGVuaGFuY2VkIGNsYXNzZXMuCi0JICogCi0JICoqLwotCQotCXB1YmxpYyB2b2lkIHJlc2V0KCk7Ci0JCi0JLyoqCi0JICogIFVzZWQgdG8gYWNjZXNzIHRoZSBjbGFzcyBmb3IgYSBnaXZlbiBjb21wb25lbnQgKG9yIHBhZ2UpLiAgUmV0dXJucyB0aGUKLQkgKiAgc3BlY2lmaWVkIGNsYXNzLCBvciBhbiBlbmhhbmNlZCB2ZXJzaW9uIG9mIHRoZSBjbGFzcyBpZiB0aGUKLQkgKiAgY29tcG9uZW50IHJlcXVpcmVzIGVuaGFuY2VtZW50LgotCSAqIAotCSAqICBAcGFyYW0gc3BlY2lmaWNhdGlvbiB0aGUgc3BlY2lmaWNhdGlvbiBmb3IgdGhlIGNvbXBvbmVudAotCSAqICBAcGFyYW0gY2xhc3NOYW1lIHRoZSBuYW1lIG9mIGJhc2UgY2xhc3MgdG8gZW5oYW5jZSwgYXMgZXh0cmFjdGVkCi0JICogIGZyb20gdGhlIHNwZWNpZmljYXRpb24gKG9yIHBvc3NpYmx5LCBmcm9tIGEgZGVmYXVsdCkuCi0JICogCi0JICogIEB0aHJvd3Mgb3JnLmFwYWNoZS50YXBlc3RyeS5BcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24gaWYgdGhlIGNsYXNzIGRvZXMgbm90IGV4aXN0LCBpcyBpbnZhbGlkLAotCSAqICBvciBtYXkgbm90IGJlIGVuaGFuY2VkLgotCSAqIAotCSAqKi8KLQkKLQlwdWJsaWMgQ2xhc3MgZ2V0RW5oYW5jZWRDbGFzcyhJQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBzcGVjaWZpY2F0aW9uLCBTdHJpbmcgY2xhc3NOYW1lKTsKLX0KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9lbmdpbmUvSUNvbXBvbmVudE1lc3NhZ2VzU291cmNlLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZW5naW5lL0lDb21wb25lbnRNZXNzYWdlc1NvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTZlMDYxLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9lbmdpbmUvSUNvbXBvbmVudE1lc3NhZ2VzU291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5lbmdpbmU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JTWVzc2FnZXM7Ci0KLS8qKgotICogIERlZmluZXMgYW4gb2JqZWN0IHRoYXQgY2FuIHByb3ZpZGUgYSBjb21wb25lbnQgd2l0aCBpdHMKLSAqICB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5JTWVzc2FnZXN9LgotICoKLSAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiAgQHZlcnNpb24gJElkJAotICogIEBzaW5jZSAyLjAuNAotICoKLSAqKi8KLQotcHVibGljIGludGVyZmFjZSBJQ29tcG9uZW50TWVzc2FnZXNTb3VyY2UKLXsKLQlwdWJsaWMgSU1lc3NhZ2VzIGdldE1lc3NhZ2VzKElDb21wb25lbnQgY29tcG9uZW50KTsKLQkKLQkvKioKLQkgKiAgQ2xlYXJzIGFsbCBjYWNoZWQgaW5mb3JtYXRpb24gZm9yIHRoZSBzb3VyY2UuCi0JICogCi0JICoqLwotCQotCXB1YmxpYyB2b2lkIHJlc2V0KCk7Ci19CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZW5naW5lL0lFbmdpbmVTZXJ2aWNlLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZW5naW5lL0lFbmdpbmVTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyZDdhMTUuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2VuZ2luZS9JRW5naW5lU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuZW5naW5lOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUNvbXBvbmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZXF1ZXN0Q3ljbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5yZXF1ZXN0LlJlc3BvbnNlT3V0cHV0U3RyZWFtOwotCi0vKioKLSAqICBBIHNlcnZpY2UsIHByb3ZpZGVkIGJ5IHRoZSB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5JRW5naW5lfSwgZm9yIGl0cyBwYWdlcyBhbmQvb3IgY29tcG9uZW50cy4KLSAqICBTZXJ2aWNlcyBhcmUKLSAqICByZXNwb25zaWJsZSBmb3IgY29uc3RydWN0aW5nIHtAbGluayBFbmdpbmVTZXJ2aWNlTGlua31zIChhbiBlbmNvZGluZyBvZiBVUkxzKQotICogIHRvIHJlcHJlc2VudCBkeW5hbWljIGFwcGxpY2F0aW9uIGJlaGF2aW9yLCBhbmQgZm9yCi0gKiAgcGFyc2luZyB0aG9zZSBVUkxzIHdoZW4gYSBzdWJzZXF1ZW50IHJlcXVlc3QgaW52b2x2ZXMgdGhlbS4KLSAqCi0gKiAgQHNlZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LklFbmdpbmUjZ2V0U2VydmljZShTdHJpbmcpCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAKLSAqKi8KLQotcHVibGljIGludGVyZmFjZSBJRW5naW5lU2VydmljZQotewotICAgIC8qKgotICAgICAqICBCdWlsZHMgYSBVUkwgZm9yIGEgc2VydmljZS4gIFRoaXMgaXMgcGVyZm9ybWVkIGR1cmluZyB0aGUKLSAgICAgKiAgcmVuZGVyaW5nIHBoYXNlIG9mIG9uZSByZXF1ZXN0IGN5Y2xlIGFuZCBidWxkcyBVUkxzIHRoYXQgd2lsbAotICAgICAqICBpbnZva2UgYWN0aXZpdHkgaW4gYSBzdWJzZXF1ZW50IHJlcXVlc3QgY3ljbGUuCi0gICAgICoKLSAgICAgKiAgQHBhcmFtIGN5Y2xlIERlZmluZXMgdGhlIHJlcXVlc3QgY3ljbGUgYmVpbmcgcHJvY2Vzc2VkLgotICAgICAqICBAcGFyYW0gY29tcG9uZW50IFRoZSBjb21wb25lbnQgcmVxdWVzdGluZyB0aGUgVVJMLiAgR2VuZXJhbGx5LCB0aGUKLSAgICAgKiAgc2VydmljZSBjb250ZXh0IGlzIGVzdGFibGlzaGVkIGZyb20gdGhlIGNvbXBvbmVudC4KLSAgICAgKiAgQHBhcmFtIHBhcmFtZXRlcnMgQWRkaXRpb25hbCBwYXJhbWV0ZXJzIHNwZWNpZmljIHRvIHRoZQotICAgICAqICBjb21wb25lbnQgcmVxdWVzdGluZyB0aGUgRW5naW5lU2VydmljZUxpbmsuCi0gICAgICogIEByZXR1cm4gVGhlIFVSTCBmb3IgdGhlIHNlcnZpY2UuICBUaGUgVVJMIHdpbGwgaGF2ZSB0byBiZSBlbmNvZGVkCi0gICAgICogIHZpYSB7QGxpbmsgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2UjZW5jb2RlVVJMKGphdmEubGFuZy5TdHJpbmcpfS4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBJTGluayBnZXRMaW5rKElSZXF1ZXN0Q3ljbGUgY3ljbGUsIElDb21wb25lbnQgY29tcG9uZW50LCBPYmplY3RbXSBwYXJhbWV0ZXJzKTsKLQotICAgIC8qKgotICAgICAqICBQZXJmb3JtIHRoZSBzZXJ2aWNlLCBpbnRlcnByZXRpbmcgdGhlIFVSTCAoZnJvbSB0aGUKLSAgICAgKiAge0BsaW5rIGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3R9KSAKLSAgICAgKiAgcmVzcG9uZGluZyBhcHByb3ByaWF0ZWx5LCBhbmQKLSAgICAgKiAgcmVuZGVyaW5nIGEgcmVzdWx0IHBhZ2UuCi0gICAgICoKLSAgICAgKgotICAgICAqICBAc2VlIG9yZy5hcGFjaGUudGFwZXN0cnkuSUVuZ2luZSNzZXJ2aWNlKG9yZy5hcGFjaGUudGFwZXN0cnkucmVxdWVzdC5SZXF1ZXN0Q29udGV4dCkKLSAgICAgKiAgQHBhcmFtIGVuZ2luZSBhIHZpZXcgb2YgdGhlIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LklFbmdpbmV9IHdpdGggYWRkaXRpb25hbCBtZXRob2RzIG5lZWRlZCBieSBzZXJ2aWNlcwotICAgICAqICBAcGFyYW0gY3ljbGUgdGhlIGluY29taW5nIHJlcXVlc3QKLSAgICAgKiAgQHBhcmFtIG91dHB1dCBzdHJlYW0gdG8gd2hpY2ggb3V0cHV0IHNob3VsZCB1bHRpbWF0ZWx5IGJlIGRpcmVjdGVkCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgc2VydmljZSgKLSAgICAgICAgSUVuZ2luZVNlcnZpY2VWaWV3IGVuZ2luZSwKLSAgICAgICAgSVJlcXVlc3RDeWNsZSBjeWNsZSwKLSAgICAgICAgUmVzcG9uc2VPdXRwdXRTdHJlYW0gb3V0cHV0KQotICAgICAgICB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgc2VydmljZS4KLSAgICAgKgotICAgICAqICBAc2luY2UgMS4wLjEKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZW5naW5lL0lFbmdpbmVTZXJ2aWNlVmlldy5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2VuZ2luZS9JRW5naW5lU2VydmljZVZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWE2MTJlOC4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZW5naW5lL0lFbmdpbmVTZXJ2aWNlVmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuZW5naW5lOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUVuZ2luZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZXF1ZXN0Q3ljbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5yZXF1ZXN0LlJlc3BvbnNlT3V0cHV0U3RyZWFtOwotCi0vKioKLSAqICBBZGRpdGlvbmFsIG1ldGhvZHMgaW1wbGVtZW50ZWQgYnkgdGhlIGVuZ2luZSB0aGF0IGFyZSAKLSAqICBleHBvc2VkIHRvIHtAbGluayBJRW5naW5lU2VydmljZSBlbmdpbmUgc2VydmljZXN9LgotICoKLSAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiAgQHZlcnNpb24gJElkJAotICogIEBzaW5jZSAxLjAuOQotICoKLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElFbmdpbmVTZXJ2aWNlVmlldyBleHRlbmRzIElFbmdpbmUKLXsKLSAgICAvKioKLSAgICAgKiAgSW52b2tlZCBieSBhIHNlcnZpY2UgdG8gZm9yY2UgdGhlIHBhZ2Ugc2VsZWN0ZWQgYnkgdGhlIHtAbGluayBJUmVxdWVzdEN5Y2xlfQotICAgICAqICB0byBiZSByZW5kZXJyZWQuICBUaGlzIHRha2VzIGNhcmUgb2YgYSBudW1iZXIgb2YgYm9va2tlZXBpbmcgaXNzdWVzLCBzdWNoCi0gICAgICogIGFzIGNvbW1pdHRpbmcgY2hhbmdlcyBpbiBwYWdlIHJlY29yZGVycy4KLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCByZW5kZXJSZXNwb25zZShJUmVxdWVzdEN5Y2xlIGN5Y2xlLCBSZXNwb25zZU91dHB1dFN0cmVhbSBvdXRwdXQpCi0gICAgICAgIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqICBJbnZva2VkIHRvIHJlc3RhcnQgdGhlIGFwcGxpY2F0aW9uIGZyb20gc3RhcnQ7IHRoaXMgbW9zdCBmcmVxdWVudGx5IGZvbGxvd3MKLSAgICAgKiAgc29tZSBraW5kIG9mIGNhdGFzdHJvcGhpYyBmYWlsdXJlLiAgVGhpcyB3aWxsIGludmFsaWRhdGUgYW55IHtAbGluayBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb259Ci0gICAgICogIGFuZCBmb3JjZSBhIHJlZGlyZWN0IHRvIHRoZSBhcHBsaWNhdGlvbiBzZXJ2bGV0IChpLmUuLCBpbnZva2luZyB0aGUgaG9tZSBzZXJ2aWNlCi0gICAgICogIGluIGEgc3Vic2VxdWVudCByZXF1ZXN0IGN5Y2xlKS4KLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCByZXN0YXJ0KElSZXF1ZXN0Q3ljbGUgY3ljbGUpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqICBJbnZva2VkICh0eXBpY2FsbHkgYnkgdGhlIHJlc2V0IHNlcnZpY2UpIHRvIGNsZWFyIGFsbCBjYWNoZWQgZGF0YSBrbm93bgotICAgICAqICB0byB0aGUgZW5naW5lLiAgVGhpcyBpbmNsdWRlcyAKLSAgICAgKiAgcGFnZXMsIHRlbXBsYXRlcywgaGVscGVyIGJlYW5zLCBzcGVjaWZpY2F0aW9ucywKLSAgICAgKiAgbG9jYWxpemVkIHN0cmluZ3MsIGV0Yy4sIGFuZAotICAgICAqICBpcyB1c2VkIGR1cmluZyBkZWJ1Z2dpbmcuCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgY2xlYXJDYWNoZWREYXRhKCk7Ci0KLSAgICAvKioKLSAgICAgKiAgV3JpdGVzIGEgZGV0YWlsZWQgcmVwb3J0IG9mIHRoZSBleGNlcHRpb24gdG8gPGNvZGU+U3lzdGVtLmVycjwvY29kZT4uCi0gICAgICogIFRoaXMgaXMgaW52b2tlZCBieSBzZXJ2aWNlcyB0aGF0IGNhbid0IHdyaXRlIGFuIEhUTUwgZGVzY3JpcHRpb24KLSAgICAgKiAgb2YgdGhlIGVycm9yIGJlY2F1c2UgdGhleSBkb24ndCBwcm92aWRlIHRleHQvaHRtbCBjb250ZW50IChzdWNoIGFzCi0gICAgICogIGFuIGFzc2V0IHRoYXQgY3JlYXRlcyBhbiBpbWFnZSkuCi0gICAgICoKLSAgICAgKiAgQHNpbmNlIDEuMC4xMAotICAgICAqLwotCi0gICAgcHVibGljIHZvaWQgcmVwb3J0RXhjZXB0aW9uKFN0cmluZyByZXBvcnRUaXRsZSwgVGhyb3dhYmxlIGV4KTsKLX0KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9lbmdpbmUvSUxpbmsuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9lbmdpbmUvSUxpbmsuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjdmNmEyMS4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZW5naW5lL0lMaW5rLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuZW5naW5lOwotCi0vKioKLSAqICBEZWZpbmUgYSBsaW5rIHRoYXQgbWF5IGJlIGdlbmVyYXRlZCBhcyBwYXJ0IG9mIGEgcGFnZSByZW5kZXIuICBUaGUgdmFzdCBtYWpvcml0eQotICogIG9mIGxpbmtzIGFyZSB0aWVkIHRvIHtAbGluayBJRW5naW5lU2VydmljZSBzZXJ2aWNlc30gYW5kIGFyZSwgaW4KLSAqICBmYWN0LCBjYWxsYmFja3MuICBBIHNtYWxsIG51bWJlciwgc3VjaCBhcyB0aG9zZSBnZW5lcmF0ZWQgYnkKLSAqICB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5saW5rLkdlbmVyaWNMaW5rfSBjb21wb25lbnQsIGFyZSB0byBhcmJpdHJhcnkgbG9jYXRpb25zLgotICogIEluIGFkZGl0aW9uLCBJTGluayBkaWZmZXJlbnRpYXRlcyBiZXR3ZWVuIHRoZSBwYXRoIHBvcnRpb24gb2YgdGhlIGxpbmssIGFuZCBhbnkKLSAqICBxdWVyeSBwYXJhbWV0ZXJzIGVuY29kZWQgaW50byBhIGxpbmssIHByaW1hcmlseSB0byBiZW5lZml0IHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LmZvcm0uRm9ybX0sCi0gKiAgd2hpY2ggbmVlZHMgdG8gZW5jb2RlIHRoZSBxdWVyeSBwYXJhbWV0ZXJzIGFzIGhpZGRlbiBmb3JtIGZpZWxkcy4KLSAqCi0gKiAgPHA+Ci0gKiAgSW4gYWRkaXRpb24sIGFuIElMaW5rIGlzIHJlc3BvbnNpYmxlIGZvcgotICogIHBhc3NpbmcgY29uc3RydWN0ZWQgVVJMcyB0aHJvdWdoCi0gKiAge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlcXVlc3RDeWNsZSNlbmNvZGVVUkwoU3RyaW5nKX0KLSAqICBhcyBuZWVkZWQuCi0gKiAKLSAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiAgQHZlcnNpb24gJElkJAotICogIEBzaW5jZSAzLjAKLSAqIAotICoqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElMaW5rCi17Ci0JLyoqCi0JICogIFJldHVybnMgdGhlIHJlbGF0aXZlIFVSTCBhcyBhIFN0cmluZy4gIEEgcmVsYXRpdmUKLQkgKiAgVVJMIG1heSBpbmNsdWRlIGEgbGVhZGluZyBzbGFzaCwgYnV0IG9taXRzCi0JICogIHRoZSBzY2hlbWUsIGhvc3QgYW5kIHBvcnQgcG9ydGlvbnMgb2YgYSBmdWxsIFVSTC4KLQkgKiAgCi0JICogIEByZXR1cm4gdGhlIHJlbGF0aXZlIFVSTCwgd2l0aCBubyBhbmNob3IsIGJ1dCBpbmNsdWRpbmcKLQkgKiAgcXVlcnkgcGFyYW1ldGVycy4KLQkgKiAKLQkgKiovCi0JCi0JcHVibGljIFN0cmluZyBnZXRVUkwoKTsKLQkKLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0aGUgcmVsYXRpdmUgVVJMIGFzIGEgU3RyaW5nLiAgVGhpcyBpcyB1c2VkCi0gICAgICogIGZvciBtb3N0IGxpbmtzLgotICAgICAqIAotICAgICAqICBAcGFyYW0gYW5jaG9yIGlmIG5vdCBudWxsLCBhcHBlbmRlZCB0byB0aGUgVVJMCi0gICAgICogIEBwYXJhbSBpbmNsdWRlUGFyYW1ldGVycyBpZiB0cnVlLCBwYXJhbWV0ZXJzIGFyZSBpbmNsdWRlZAotICAgICAqIAotICAgICAqKi8KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VVJMKFN0cmluZyBhbmNob3IsIGJvb2xlYW4gaW5jbHVkZVBhcmFtZXRlcnMpOwotCi0JLyoqCi0JICogIFJldHVybnMgdGhlIGFic29sdXRlIFVSTCBhcyBhIFN0cmluZywgdXNpbmcKLQkgKiAgZGVmYXVsdCBzY2hlbWUsIHNlcnZlciBhbmQgcG9ydCwgaW5jbHVkaW5nCi0JICogIHBhcmFtZXRlcnMsIGFuZCBubyBhbmNob3IuCi0JICogCi0JICoqLwotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QWJzb2x1dGVVUkwoKTsKLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIHRoZSBhYnNvbHV0ZSBVUkwgYXMgYSBTdHJpbmcuICAKLSAgICAgKiAKLSAgICAgKiAgQHBhcmFtIHNjaGVtZSBpZiBub3QgbnVsbCwgb3ZlcnJpZGVzIHRoZSBkZWZhdWx0IHNjaGVtZS4KLSAgICAgKiAgQHBhcmFtIHNlcnZlciBpZiBub3QgbnVsbCwgb3ZlcnJpZGVzIHRoZSBkZWZhdWx0IHNlcnZlcgotICAgICAqICBAcGFyYW0gcG9ydCBpZiBub24temVybywgb3ZlcnJpZGVzIHRoZSBkZWZhdWx0IHBvcnQKLSAgICAgKiAgQHBhcmFtIGFuY2hvciBpZiBub3QgbnVsbCwgYXBwZW5kZWQgdG8gdGhlIFVSTAotICAgICAqICBAcGFyYW0gaW5jbHVkZVBhcmFtZXRlcnMgaWYgdHJ1ZSwgcGFyYW1ldGVycyBhcmUgaW5jbHVkZWQKLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEFic29sdXRlVVJMKAotICAgICAgICBTdHJpbmcgc2NoZW1lLAotICAgICAgICBTdHJpbmcgc2VydmVyLAotICAgICAgICBpbnQgcG9ydCwKLSAgICAgICAgU3RyaW5nIGFuY2hvciwKLSAgICAgICAgYm9vbGVhbiBpbmNsdWRlUGFyYW1ldGVycyk7Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiAgUmV0dXJucyBhbiBhcnJheSBvZiBwYXJhbWV0ZXJzIG5hbWVzIChpbgotICAgICAqICBubyBzcGVjaWZpZWQgb3JkZXIpLgotICAgICAqIAotICAgICAqICBAc2VlICNnZXRQYXJhbWV0ZXJWYWx1ZXMoU3RyaW5nKQotICAgICAqIAotICAgICAqKi8KLQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRQYXJhbWV0ZXJOYW1lcygpOwotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgdGhlIHZhbHVlcyBmb3IgdGhlIG5hbWVkIHBhcmFtZXRlci4KLSAgICAgKiAgCi0gICAgICogIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZQotICAgICAqICBsaW5rIGRvZXMgbm90IGRlZmluZSB2YWx1ZXMgZm9yIHRoZQotICAgICAqICBzcGVjaWZpZWQgbmFtZS4KLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0UGFyYW1ldGVyVmFsdWVzKFN0cmluZyBuYW1lKTsKLX0KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9lbmdpbmUvSU1vbml0b3IuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9lbmdpbmUvSU1vbml0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU5ZGI1Yi4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZW5naW5lL0lNb25pdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuZW5naW5lOwotCi0vKioKLSAqICBCYXNpYyBzdXBwb3J0IGZvciBhcHBsaWNhdGlvbiBtb25pdG9yaW5nIGFuZCBtZXRyaWNzLiAgCi0gKiAgVGhpcyBpbnRlcmZhY2UgZGVmaW5lcyBldmVudHM7IHRoZSBpbXBsZW1lbnRhdGlvbgotICogIGRlY2lkZXMgd2hhdCB0byBkbyB3aXRoIHRoZW0gKHN1Y2ggYXMgcmVjb3JkIHRoZW0gdG8gYSBkYXRhYmFzZSkuCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAKLSAqKi8KLQotcHVibGljIGludGVyZmFjZSBJTW9uaXRvcgotewotCS8qKgotCSAqICBJbnZva2VkIGJlZm9yZSBjb25zdHJ1Y3RpbmcgYSBwYWdlLgotCSAqCi0JICoqLwotCi0JcHVibGljIHZvaWQgcGFnZUNyZWF0ZUJlZ2luKFN0cmluZyBwYWdlTmFtZSk7Ci0KLQkvKioKLQkgKiAgSW52b2tlZCBhZnRlciBzdWNjZXNzZnVsbHkgY29uc3RydWN0aW5nIGEgcGFnZSBhbmQgYWxsIG9mIGl0cyBjb21wb25lbnRzLgotCSAqCi0JICoqLwotCi0JcHVibGljIHZvaWQgcGFnZUNyZWF0ZUVuZChTdHJpbmcgcGFnZU5hbWUpOwotCi0JLyoqCi0JICogIEludm9rZWQgd2hlbiBhIHBhZ2UgaXMgbG9hZGVkLiAgVGhpcyBpbmNsdWRlcyB0aW1lIHRvIGxvY2F0ZSBvciBjcmVhdGUgYW4gaW5zdGFuY2UKLQkgKiAgb2YgdGhlIHBhZ2UgYW5kIHJvbGxiYWNrIGl0cyBzdGF0ZSAodG8gYW55IHByZXZpb3VzbHkgcmVjb3JkZWQgdmFsdWUpLgotCSAqCi0JICoqLwotCi0JcHVibGljIHZvaWQgcGFnZUxvYWRCZWdpbihTdHJpbmcgcGFnZU5hbWUpOwotCi0JLyoqCi0JICogIEludm9rZWQgb25jZSBhIHBhZ2UgaXMgY29tcGxldGVseSBsb2FkZWQgYW5kIHJvbGxlZCBiYWNrIHRvIGl0cyBwcmlvciBzdGF0ZS4KLQkgKgotCSAqKi8KLQotCXB1YmxpYyB2b2lkIHBhZ2VMb2FkRW5kKFN0cmluZyBwYWdlTmFtZSk7Ci0KLQkvKioKLQkgKiAgSW52b2tlZCBiZWZvcmUgYSBwYWdlIHJlbmRlciBiZWdpbnMuCi0JICoKLQkgKiovCi0KLQlwdWJsaWMgdm9pZCBwYWdlUmVuZGVyQmVnaW4oU3RyaW5nIHBhZ2VOYW1lKTsKLQotCS8qKgotCSAqICBJbnZva2VkIGFmdGVyIGEgcGFnZSBoYXMgc3VjY2VzZnVsbHkgcmVuZGVyZWQuCi0JICoKLQkgKiovCi0KLQlwdWJsaWMgdm9pZCBwYWdlUmVuZGVyRW5kKFN0cmluZyBwYWdlTmFtZSk7Ci0KLQkvKioKLQkgKiAgSW52b2tlZCBiZWZvcmUgYSBwYWdlIHJld2luZCAodG8gcmVzcG9uZCB0byBhbiBhY3Rpb24pIGJlZ2lucy4KLQkgKgotCSAqKi8KLQotCXB1YmxpYyB2b2lkIHBhZ2VSZXdpbmRCZWdpbihTdHJpbmcgcGFnZU5hbWUpOwotCi0JLyoqCi0JICogIEludm9rZWQgYWZ0ZXIgYSBwYWdlIGhhcyBzdWNjZXNmdWxseSBiZWVuIHJld291bmQgKHdoaWNoIGluY2x1ZGVzCi0JICogIGFueSBhY3Rpdml0eSByZWxhdGVkIHRvIHRoZSBhY3Rpb24gbGlzdGVuZXIpLgotCSAqCi0JICoqLwotCi0JcHVibGljIHZvaWQgcGFnZVJld2luZEVuZChTdHJpbmcgcGFnZU5hbWUpOwotCi0JLyoqCi0JICogIEludm9rZWQgd2hlbiBhIHNlcnZpY2UgYmVnaW5zIHByb2Nlc3NpbmcuCi0JICoKLQkgKiovCi0KLQlwdWJsaWMgdm9pZCBzZXJ2aWNlQmVnaW4oU3RyaW5nIHNlcnZpY2VOYW1lLCBTdHJpbmcgZGV0YWlsTWVzc2FnZSk7Ci0KLQkvKioKLQkgKiAgSW52b2tlZCB3aGVuIGEgc2VydmljZSBzdWNjZXNzZnVsbHkgZW5kcy4KLQkgKgotCSAqKi8KLQotCXB1YmxpYyB2b2lkIHNlcnZpY2VFbmQoU3RyaW5nIHNlcnZpY2VOYW1lKTsKLQotCS8qKgotCSAqICBJbnZva2VkIHdoZW4gYSBzZXJ2aWNlIHRocm93cyBhbiBleGNlcHRpb24gcmF0aGVyIHRoYW4gY29tcGxldGluZyBub3JtYWxseS4KLQkgKiAgUHJvY2Vzc2luZyBvZiB0aGUgcmVxdWVzdCBtYXkgY29udGludWUgd2l0aCB0aGUgZGlzcGxheSBvZiBhbiBleGNlcHRpb24KLQkgKiAgcGFnZS4KLQkgKiAKLQkgKiAgPHA+Ci0JICogIHNlcnZpY2VFeGNlcHRpb24oKSBpcyBhbHdheXMgaW52b2tlZCA8ZW0+YmVmb3JlPC9lbT4KLQkgKiB7QGxpbmsgI3NlcnZpY2VFbmQoU3RyaW5nKX0uCi0JICoKLQkgKiovCi0KLQlwdWJsaWMgdm9pZCBzZXJ2aWNlRXhjZXB0aW9uKFRocm93YWJsZSBleGNlcHRpb24pOwotCi0JLyoqCi0JICogIEludm9rZWQgd2hlbiBhIHNlc3Npb24gaXMgaW5pdGlhdGVkLiAgVGhpcyBpcyB0eXBpY2FsbHkKLQkgKiAgZG9uZSBmcm9tIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgaG9tZSBzZXJ2aWNlLgotCSAqCi0JICoqLwotCi0JcHVibGljIHZvaWQgc2Vzc2lvbkJlZ2luKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2VuZ2luZS9JTW9uaXRvckZhY3RvcnkuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9lbmdpbmUvSU1vbml0b3JGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiN2Y1YTMuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2VuZ2luZS9JTW9uaXRvckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmVuZ2luZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkucmVxdWVzdC5SZXF1ZXN0Q29udGV4dDsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIGFuIG9iamVjdCB0aGF0IGNhbiBjcmVhdGUgYSB7QGxpbmsgSU1vbml0b3J9IGluc3RhbmNlCi0gKiBmb3IgYSBwYXJ0aWN1bGFyIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LnJlcXVlc3QuUmVxdWVzdENvbnRleHR9LgotICogVGhlIGVuZ2luZSBleHBlY3RzIHRoZXJlIHRvIGJlIGEgbW9uaXRvciBmYWN0b3J5Ci0gKiBhcyBhcHBsaWNhdGlvbiBleHRlbnNpb24KLSAqIDxjb2RlPm9yZy5hcGFjaGUudGFwZXN0cnkubW9uaXRvci1mYWN0b3J5PC9jb2RlPi4gIElmIG5vIHN1Y2gKLSAqIGV4dGVuc2lvbiBleGlzdHMsIHRoZW4ge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkuZW5naW5lLkRlZmF1bHRNb25pdG9yRmFjdG9yeX0KLSAqIGlzIHVzZWQgaW5zdGVhZC4KLSAqCi0gKiBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiBAdmVyc2lvbiAkSWQkCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU1vbml0b3JGYWN0b3J5Ci17Ci0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmV3IHtAbGluayBJTW9uaXRvcn0gaW5zdGFuY2UuICBBbHRlcm5hdGVseSwgcmV0dXJuIGEgc2hhcmVkIGluc3RhbmNlLgotICAgICAqIFRoaXMgbWV0aG9kIG1heSBiZSBpbnZva2VkIGJ5IG11bHRpcGxlIHRocmVhZHMuCi0gICAgICogCi0gICAgICovCi0KLSAgICBwdWJsaWMgSU1vbml0b3IgY3JlYXRlTW9uaXRvcihSZXF1ZXN0Q29udGV4dCBjb250ZXh0KTsKLX0KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9lbmdpbmUvSVBhZ2VMb2FkZXIuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9lbmdpbmUvSVBhZ2VMb2FkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWViMTIyNi4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZW5naW5lL0lQYWdlTG9hZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5lbmdpbmU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JRW5naW5lOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUxvY2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlcXVlc3RDeWNsZTsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZXhwb3NlZCB0byBjb21wb25lbnRzIGFzIHRoZXkgYXJlIGxvYWRlZCBieSB0aGUgcGFnZSBsb2FkZXIuCi0gKgotICogQHNlZSBJQ29tcG9uZW50I2ZpbmlzaExvYWQoSVJlcXVlc3RDeWNsZSwgSVBhZ2VMb2FkZXIsIG9yZy5hcGFjaGUudGFwZXN0cnkuc3BlYy5JQ29tcG9uZW50U3BlY2lmaWNhdGlvbikKLSAqIAotICogQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogQHZlcnNpb24gJElkJAotICogCi0gKiovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSVBhZ2VMb2FkZXIKLXsKLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0aGUgZW5naW5lIGZvciB3aGljaCB0aGlzIHBhZ2UgbG9hZGVyIGlzIGN1cmVudGx5Ci0gICAgICogIGNvbnN0cnVjdGluZyBhIHBhZ2UuCi0gICAgICoKLSAgICAgKiAgQHNpbmNlIDAuMi4xMgotICAgICAqIAotICAgICAqKi8KLQotICAgIHB1YmxpYyBJRW5naW5lIGdldEVuZ2luZSgpOwotCi0gICAgLyoqCi0gICAgICogIEEgY29udmllbmllbmNlOyByZXR1cm5zIHRoZSB0ZW1wbGF0ZSBzb3VyY2UgcHJvdmlkZWQgYnkKLSAgICAgKiAgdGhlIHtAbGluayBJRW5naW5lIGVuZ2luZX0uCi0gICAgICoKLSAgICAgKiAgQHNpbmNlIDAuMi4xMgotICAgICAqIAotICAgICAqKi8KLQotICAgIHB1YmxpYyBJVGVtcGxhdGVTb3VyY2UgZ2V0VGVtcGxhdGVTb3VyY2UoKTsKLQotICAgIC8qKgotICAgICAqICBJbnZva2VkIHRvIGNyZWF0ZSBhbiBpbXBsaWNpdCBjb21wb25lbnQgKG9uZSB3aGljaCBpcyBkZWZpbmVkIGluIHRoZQotICAgICAqICBjb250YWluaW5nIGNvbXBvbmVudCdzIHRlbXBsYXRlLCByYXRoZXIgdGhhdCBpbiB0aGUgY29udGFpbmluZyBjb21wb25lbnQncwotICAgICAqICBzcGVjaWZpY2F0aW9uKS4KLSAgICAgKiAKLSAgICAgKiAgQHNlZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LkJhc2VDb21wb25lbnRUZW1wbGF0ZUxvYWRlcgotICAgICAqICBAc2luY2UgMy4wCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIElDb21wb25lbnQgY3JlYXRlSW1wbGljaXRDb21wb25lbnQoCi0gICAgICAgIElSZXF1ZXN0Q3ljbGUgY3ljbGUsCi0gICAgICAgIElDb21wb25lbnQgY29udGFpbmVyLAotICAgICAgICBTdHJpbmcgY29tcG9uZW50SWQsCi0gICAgICAgIFN0cmluZyBjb21wb25lbnRUeXBlLAotICAgICAgICBJTG9jYXRpb24gbG9jYXRpb24pOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9lbmdpbmUvSVBhZ2VSZWNvcmRlci5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2VuZ2luZS9JUGFnZVJlY29yZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwZjZiYmUuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2VuZ2luZS9JUGFnZVJlY29yZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuZW5naW5lOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklQYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlcXVlc3RDeWNsZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmV2ZW50LkNoYW5nZU9ic2VydmVyOwotCi0vKioKLSAqICBEZWZpbmVzIGFuIG9iamVjdCB0aGF0IGNhbiBvYnNlcnZlIGNoYW5nZXMgdG8gcHJvcGVydGllcyBvZgotICogIGEgcGFnZSBhbmQgaXRzIGNvbXBvbmVudHMsIHN0b3JlIHRoZSBzdGF0ZSBvZiB0aGUgcGFnZSBiZXR3ZWVuIHJlcXVlc3QgY3ljbGVzLAotICogIGFuZCByZXN0b3JlIGEgcGFnZSdzIHN0YXRlIG9uIGEgc3Vic2VxdWVudCByZXF1ZXN0IGN5Y2xlLgotICoKLSAqICA8cD5Db25jcmV0ZSBpbXBsZW1lbnRhdGlvbnMgb2YgdGhpcyBjYW4gc3RvcmUgdGhlIGNoYW5nZXMgaW4gbWVtb3J5LAotICogIGFzIGNsaWVudC1zaWRlIGNvb2tpZXMsIGluIGEgZmxhdCBmaWxlLCBvciBpbiBhIGRhdGFiYXNlLgotICoKLSAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiAgQHZlcnNpb24gJElkJAotICogCi0gKiovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSVBhZ2VSZWNvcmRlciBleHRlbmRzIENoYW5nZU9ic2VydmVyCi17Ci0gICAgLyoqCi0gICAgICogIEludm9rZWQgYWZ0ZXIgdGhlIHJlY29yZGVyIGlzIGluc3RhbnRpYXRlZCB0byBpbml0aWFsaXplCi0gICAgICogIGl0IGZvciB0aGUgY3VycmVudCByZXF1ZXN0IGN5Y2xlLgotICAgICAqIAotICAgICAqICBAcGFyYW0gcGFnZU5hbWUgdGhlIGZ1bGx5IHF1YWxpZmllZCBwYWdlIG5hbWUKLSAgICAgKiAgQHBhcmFtIGN5Y2xlIHRoZSBjdXJyZW50IHJlcXVlc3QgY3ljbGUKLSAgICAgKiAKLSAgICAgKiAgQHNpbmNlIDMuMAotICAgICAqIAotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoU3RyaW5nIHBhZ2VOYW1lLCBJUmVxdWVzdEN5Y2xlIGN5Y2xlKTsKLQotICAgIC8qKgotICAgICAqICBJbnZva2VkIGF0IHRoZSBlbmQgb2YgYSByZXF1ZXN0IGN5Y2xlIGluIHdoaWNoIHRoZQotICAgICAqICBwYWdlIHJlY29yZGVyIGlzIGRpc2NhcmRlZCAoZWl0aGVyIGltcGxpY2l0bHksIGJlY2F1c2UKLSAgICAgKiAgdGhlIHBhZ2UgcmVjb3JkZXIgaGFzIG5vIGNoYW5nZXMsIG9yIGV4cGxpY2l0bHkKLSAgICAgKiAgYmVjYXVzZSBvZiB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5JRW5naW5lI2ZvcmdldFBhZ2UoU3RyaW5nKX0gb3IKLSAgICAgKiAge0BsaW5rICNtYXJrRm9yRGlzY2FyZCgpfS4KLSAgICAgKiAKLSAgICAgKiAgQHNpbmNlIDMuMAotICAgICAqIAotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIGRpc2NhcmQoKTsKLQotICAgIC8qKgotICAgICAqICBQZXJzaXN0cyBhbGwgY2hhbmdlcyB0aGF0IGhhdmUgYmVlbiBhY2N1bXVsYXRlZC4gIElmIHRoZSByZWNvcmRlcgotICAgICAqICBzYXZlcyBjaGFuZ2UgaW5jcmVtZW50YWxseSwgdGhpcyBzaG91bGQgZW5zdXJlIHRoYXQgYWxsIGNoYW5nZXMgaGF2ZSBiZWVuIHBlcnNpc3RlZC4KLSAgICAgKgotICAgICAqICA8cD5BZnRlciBjb21taXRpbmcsIGEgcGFnZSByZWNvcmRlciBhdXRvbWF0aWNhbGx5IGxvY2tzIGl0c2VsZi4KLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCBjb21taXQoKTsKLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIGEge0BsaW5rIENvbGxlY3Rpb259IG9mIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LnJlY29yZC5JUGFnZUNoYW5nZX0gb2JqZWN0cyB0aGF0IHJlcHJlc2VudAotICAgICAqICB0aGUgcGVyc2lzdGFudCBzdGF0ZSBvZiB0aGUgcGFnZS4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBDb2xsZWN0aW9uIGdldENoYW5nZXMoKTsKLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIHRydWUgaWYgdGhlIHJlY29yZGVyIGhhcyBhbnkgY2hhbmdlcyBmb3IgdGhlIHBhZ2UuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRIYXNDaGFuZ2VzKCk7Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0cnVlIGlmIHRoZSByZWNvcmRlciBoYXMgb2JzZXJ2ZWQgYW55IGNoYW5nZXMgdGhhdCBoYXZlIG5vdAotICAgICAqICBiZWVuIGNvbW1pdHRlZCB0byBleHRlcm5hbCBzdG9yYWdlLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIGJvb2xlYW4gaXNEaXJ0eSgpOwotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgdHJ1ZSBpZiB0aGUgcmVjb3JkZXIgaXMgaW4gYSBsb2NrZWQgc3RhdGUsIGZvbGxvd2luZwotICAgICAqICBhIHtAbGluayAjY29tbWl0KCl9LgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIGJvb2xlYW4gaXNMb2NrZWQoKTsKLQotICAgIC8qKgotICAgICAqICBSb2xscyBiYWNrIHRoZSBwYWdlIHRvIHRoZSBjdXJyZW50bHkgcGVyc2lzdGVkIHN0YXRlLgotICAgICAqCi0gICAgICogIDxwPkEgcGFnZSByZWNvcmRlciBjYW4gb25seSByb2xsYmFjayBjaGFuZ2VzIHRvIHByb3BlcnRpZXMKLSAgICAgKiAgd2hpY2ggaGF2ZSBjaGFuZ2VkIGF0IHNvbWUgcG9pbnQuICBUaGlzIGNhbiBjYXVzZSBzb21lIG1pbm9yCi0gICAgICogIHByb2JsZW1zLCBhZGRyZXNzZWQgYnkKLSAgICAgKiAge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkuZXZlbnQuUGFnZURldGFjaExpc3RlbmVyI3BhZ2VEZXRhY2hlZChvcmcuYXBhY2hlLnRhcGVzdHJ5LmV2ZW50LlBhZ2VFdmVudCl9LgotICAgICAqIAotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIHJvbGxiYWNrKElQYWdlIHBhZ2UpOwotCi0gICAgLyoqCi0gICAgICogIEludm9rZWQgdG8gbG9jayBvciB1bmxvY2sgdGhlIHJlY29yZGVyLiAgUmVjb2RlcnMgYXJlIGxvY2tlZAotICAgICAqICBhZnRlciB0aGV5IGFyZSBjb21taXRlZCwgYW5kIHN0YXkgbG9ja2VkIHVudGlsCi0gICAgICogIGV4cGxpY2l0bHkgdW5sb2NrZWQgaW4gYSBzdWJzZXF1ZW50IHJlcXVlc3QgY3ljbGUuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCBzZXRMb2NrZWQoYm9vbGVhbiB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiAgSW52b2tlZCB0byBtYXJrIHRoZSByZWNvcmRlciBmb3IgZGlzY2FyZGluZyBhdCB0aGUgZW5kIG9mIHRoZSByZXF1ZXN0IGN5Y2xlLgotICAgICAqIAotICAgICAqICBAc2luY2UgMi4wLjIKLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCBtYXJrRm9yRGlzY2FyZCgpOwotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgdHJ1ZSBpZiB0aGUgcmVjb3JkZXIgaGFzIGJlZW4gbWFya2VkIGZvciBkaXNjYXJkLgotICAgICAqIAotICAgICAqKi8KLQotICAgIHB1YmxpYyBib29sZWFuIGlzTWFya2VkRm9yRGlzY2FyZCgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9lbmdpbmUvSVBhZ2VTb3VyY2UuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9lbmdpbmUvSVBhZ2VTb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzMzYzk4ZC4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZW5naW5lL0lQYWdlU291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5lbmdpbmU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklQYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlcXVlc3RDeWNsZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZXNvdXJjZVJlc29sdmVyOwotCi0vKioKLSAqICBBYnN0cmFjdHMgdGhlIHByb2Nlc3Mgb2YgbG9hZGluZyBwYWdlcyBmcm9tIHRoaWVyIHNwZWNpZmljYXRpb25zIGFzCi0gKiAgd2VsbCBhcyBwb29saW5nIG9mIHBhZ2VzIG9uY2UgbG9hZGVkLiAgCi0gKgotICogIDxwPklmIHRoZSByZXF1aXJlZCBwYWdlIGlzIG5vdCBhdmFpbGFibGUsIGEgcGFnZSBzb3VyY2UgbWF5IHVzZSBhbgotICogIGluc3RhbmNlIG9mIHtAbGluayBJUGFnZUxvYWRlcn0gdG8gYWN0dWFsbHkgbG9hZCB0aGUKLSAqICBwYWdlIChhbmQgYWxsIG9mIGl0cyBuZXN0ZWQgY29tcG9uZW50cykuCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAKLSAqKi8KLQotcHVibGljIGludGVyZmFjZSBJUGFnZVNvdXJjZQotewotICAgIC8qKgotICAgICAqICBHZXRzIGEgZ2l2ZW4gcGFnZSBmb3IgdGhlIGVuZ2luZS4gIFRoaXMgbWF5IGludm9sdmUgdXNpbmcgYSBwcmV2aW91c2x5Ci0gICAgICogIGxvYWRlZCBwYWdlIGZyb20gYSBwb29sIG9mIGF2YWlsYWJsZSBwYWdlcywgb3IgdGhlIHBhZ2UgbWF5IGJlIGxvYWRlZCBhcyBuZWVkZWQuCi0gICAgICogCi0gICAgICogIEBwYXJhbSBjeWNsZSB0aGUgY3VycmVudCByZXF1ZXN0IGN5Y2xlCi0gICAgICogIEBwYXJhbSBwYWdlTmFtZSB0aGUgbmFtZSBvZiB0aGUgcGFnZS4gIE1heSBiZSBxdWFsaWZpZWQgd2l0aCBhIGxpYnJhcnkgaWQgcHJlZml4LCB3aGljaAotICAgICAqICBtYXkgZXZlbiBiZSBuZXN0ZWQuIFVucXVhbGlmaWVkIG5hbWVzIGFyZSBzZWFyY2hlZCBmb3IgZXh0ZW5zaXZlbHkgaW4gdGhlIGFwcGxpY2F0aW9uCi0gICAgICogIG5hbWVzcGFjZSwgYW5kIHRoZW4gaW4gdGhlIGZyYW1ld29yayBuYW1lc3BhY2UuCi0gICAgICogIEBwYXJhbSBtb25pdG9yIGluZm9ybWVkIG9mIGFueSBwYWdlIGxvYWRpbmcgYWN0aXZpdHkKLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBJUGFnZSBnZXRQYWdlKElSZXF1ZXN0Q3ljbGUgY3ljbGUsIFN0cmluZyBwYWdlTmFtZSwgSU1vbml0b3IgbW9uaXRvcik7Ci0KLSAgICAvKioKLSAgICAgKiAgSW52b2tlZCBhZnRlciB0aGUgZW5naW5lIGlzIGRvbmUgd2l0aCB0aGUgcGFnZQotICAgICAqICAodHlwaWNhbGx5LCBhZnRlciB0aGUgcmVzcG9uc2UgdG8gdGhlIGNsaWVudCBoYXMgYmVlbiBzZW50KS4KLSAgICAgKiAgVGhlIHBhZ2UgaXMgcmV0dXJuZWQgdG8gdGhlIHBvb2wgZm9yIGxhdGVyIHJldXNlLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgcmVsZWFzZVBhZ2UoSVBhZ2UgcGFnZSk7Ci0KLSAgICAvKioKLSAgICAgKiAgSW52b2tlZCB0byBoYXZlIHRoZSBzb3VyY2UgY2xlYXIgYW55IGludGVybmFsIGNhY2hlLiAgVGhpcyBpcyBtb3N0IG9mdGVuCi0gICAgICogIHVzZWQgd2hlbiBkZWJ1Z2dpbmcgYW4gYXBwbGljYXRpb24uCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCByZXNldCgpOwotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogIEBzaW5jZSAzLjAKLSAgICAgKiAKLSAgICAgKiovCi0gICAgCi0gICAgcHVibGljIElSZXNvdXJjZVJlc29sdmVyIGdldFJlc291cmNlUmVzb2x2ZXIoKTsKLSAgICAgICAgCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2VuZ2luZS9JUHJvcGVydHlTb3VyY2UuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9lbmdpbmUvSVByb3BlcnR5U291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzNjFlMzEuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2VuZ2luZS9JUHJvcGVydHlTb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmVuZ2luZTsKLQotLyoqCi0gKiAgQSBzb3VyY2UgZm9yIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcy4KLSAqCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogIEB2ZXJzaW9uICRJZCQKLSAqICBAc2luY2UgMi4zCi0gKgotICoqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElQcm9wZXJ0eVNvdXJjZQotewotICAgIC8qKgotICAgICAqICBSZXR1cm5zIHRoZSB2YWx1ZSBmb3IgYSBnaXZlbiBwcm9wZXJ0eSwgb3IgbnVsbCBpZiB0aGUKLSAgICAgKiAgc291cmNlIGRvZXMgbm90IHByb3ZpZGUgYSB2YWx1ZSBmb3IgdGhlIG5hbWVkIHByb3BlcnR5LgotICAgICAqICBJbXBsZW1lbnRhdGlvbnMgb2YgSVByb3BlcnR5U291cmNlIG1heSB1c2UgZGVsZWdhdGlvbgotICAgICAqICB0byByZXNvbHZlIHRoZSB2YWx1ZSAodGhhdCBpcywgaWYgb25lIHByb3BlcnR5IHNvdXJjZSByZXR1cm5zIG51bGwsCi0gICAgICogIGl0IG1heSBmb3J3YXJkIHRoZSByZXF1ZXN0IHRvIGFub3RoZXIgc291cmNlKS4KLSAgICAgKiAKLSAgICAgKiovCi0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eVZhbHVlKFN0cmluZyBwcm9wZXJ0eU5hbWUpOwotfQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2VuZ2luZS9JU2NyaXB0U291cmNlLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZW5naW5lL0lTY3JpcHRTb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjliMGNhMC4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZW5naW5lL0lTY3JpcHRTb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmVuZ2luZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlc291cmNlTG9jYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JU2NyaXB0OwotCi0vKioKLSAqICBQcm92aWRlcyBhY2Nlc3MgdG8gYW4ge0BsaW5rIElTY3JpcHR9LgotICoKLSAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiAgQHZlcnNpb24gJElkJAotICogIEBzaW5jZSAxLjAuMgotICoqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElTY3JpcHRTb3VyY2UKLXsKLSAgICAvKioKLSAgICAgKiAgUmV0cmlldmVzIHRoZSBzY3JpcHQgaWRlbnRpZmllZCBieSB0aGUgbG9jYXRpb24gZnJvbSB0aGUgc291cmNlJ3MKLSAgICAgKiAgY2FjaGUsIHJlYWRpbmcgYW5kIHBhcnNpbmcgdGhlIHNjcmlwdCBpZiBuZWNlc3NhcnkuCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIElTY3JpcHQgZ2V0U2NyaXB0KElSZXNvdXJjZUxvY2F0aW9uIHNjcmlwdExvY2F0aW9uKTsKLQotICAgIC8qKgotICAgICAqICBJbnZva2VkIHRvIGNsZWFyIGFueSBjYWNoZWQgc2NyaXB0cy4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIHJlc2V0KCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2VuZ2luZS9JU3BlY2lmaWNhdGlvblNvdXJjZS5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2VuZ2luZS9JU3BlY2lmaWNhdGlvblNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWQ3MjY4Li4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9lbmdpbmUvSVNwZWNpZmljYXRpb25Tb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5lbmdpbmU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVzb3VyY2VMb2NhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnNwZWMuSUNvbXBvbmVudFNwZWNpZmljYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5zcGVjLklMaWJyYXJ5U3BlY2lmaWNhdGlvbjsKLQotLyoqCi0gKiAgRGVmaW5lcyBhY2Nlc3MgdG8gY29tcG9uZW50IHNwZWNpZmljYXRpb25zLgotICoKLSAqICBAc2VlIElDb21wb25lbnRTcGVjaWZpY2F0aW9uCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAKLSAqKi8KLQotcHVibGljIGludGVyZmFjZSBJU3BlY2lmaWNhdGlvblNvdXJjZQotewotICAgIC8qKgotICAgICAqICBSZXRyaWV2ZXMgYSBjb21wb25lbnQgc3BlY2lmaWNhdGlvbiwgcGFyc2luZyBpdCBhcyBuZWNlc3NhcnkuCi0gICAgICogIAotICAgICAqICBAcGFyYW0gc3BlY2lmaWNhdGlvbkxvY2F0aW9uIHRoZSBsb2NhdGlvbiB3aGVyZSB0aGUgc3BlY2lmaWNhdGlvbgotICAgICAqICBtYXkgYmUgcmVhZCBmcm9tLgotICAgICAqIAotICAgICAqICBAdGhyb3dzIG9yZy5hcGFjaGUudGFwZXN0cnkuQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uIGlmIHRoZSBzcGVjaWZpY2F0aW9uIGRvZXNuJ3QKLSAgICAgKiAgZXhpc3QsIGlzIHVucmVhZGFibGUgb3IgaW52YWxpZC4KLSAgICAgKiAKLSAgICAgKiAgQHNpbmNlIDIuMgotICAgICAqIAotICAgICAqKi8KLQotICAgIHB1YmxpYyBJQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBnZXRDb21wb25lbnRTcGVjaWZpY2F0aW9uKElSZXNvdXJjZUxvY2F0aW9uIHNwZWNpZmljYXRpb25Mb2NhdGlvbik7Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0cmlldmVzIGEgY29tcG9uZW50IHNwZWNpZmljYXRpb24sIHBhcnNpbmcgaXQgYXMgbmVjZXNzYXJ5LgotICAgICAqICAKLSAgICAgKiAgQHBhcmFtIHNwZWNpZmljYXRpb25Mb2NhdGlvbiB0aGUgbG9jYXRpb24gd2hlcmUgdGhlIHNwZWNpZmljYXRpb24KLSAgICAgKiAgbWF5IGJlIHJlYWQgZnJvbS4KLSAgICAgKiAKLSAgICAgKiAgQHRocm93cyBvcmcuYXBhY2hlLnRhcGVzdHJ5LkFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbiBpZiB0aGUgc3BlY2lmaWNhdGlvbiBkb2Vzbid0Ci0gICAgICogIGV4aXN0LCBpcyB1bnJlYWRhYmxlIG9yIGludmFsaWQuCi0gICAgICogCi0gICAgICogIEBzaW5jZSAyLjIKLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgSUNvbXBvbmVudFNwZWNpZmljYXRpb24gZ2V0UGFnZVNwZWNpZmljYXRpb24oSVJlc291cmNlTG9jYXRpb24gc3BlY2lmaWNhdGlvbkxvY2F0aW9uKTsKLQotICAgIC8qKgotICAgICAqICBJbnZva2VkIHRvIGhhdmUgdGhlIHNvdXJjZSBjbGVhciBhbnkgaW50ZXJuYWwgY2FjaGUuICBUaGlzIGlzIG1vc3Qgb2Z0ZW4KLSAgICAgKiAgdXNlZCB3aGVuIGRlYnVnZ2luZyBhbiBhcHBsaWNhdGlvbi4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIHJlc2V0KCk7Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyBhIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LnNwZWMuTGlicmFyeVNwZWNpZmljYXRpb259IHdpdGggdGhlIGdpdmVuIHBhdGguCi0gICAgICogCi0gICAgICogIEBwYXJhbSBzcGVjaWZpY2F0aW9uTG9jYXRpb24gdGhlIHJlc291cmNlIHBhdGggb2YgdGhlIHNwZWNpZmljYXRpb24KLSAgICAgKiAgdG8gcmV0dXJuCi0gICAgICogIEB0aHJvd3Mgb3JnLmFwYWNoZS50YXBlc3RyeS5BcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24gaWYgdGhlIHNwZWNpZmljYXRpb24KLSAgICAgKiAgY2Fubm90IGJlIHJlYWQKLSAgICAgKiAKLSAgICAgKiAgQHNpbmNlIDIuMgotICAgICAqIAotICAgICAqKi8KLQotICAgIHB1YmxpYyBJTGlicmFyeVNwZWNpZmljYXRpb24gZ2V0TGlicmFyeVNwZWNpZmljYXRpb24oSVJlc291cmNlTG9jYXRpb24gc3BlY2lmaWNhdGlvbkxvY2F0aW9uKTsKLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIHRoZSB7QGxpbmsgSU5hbWVzcGFjZX0gZm9yIHRoZSBhcHBsaWNhdGlvbi4KLSAgICAgKiAKLSAgICAgKiAgQHNpbmNlIDIuMgotICAgICAqIAotICAgICAqKi8KLQotICAgIHB1YmxpYyBJTmFtZXNwYWNlIGdldEFwcGxpY2F0aW9uTmFtZXNwYWNlKCk7Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0aGUge0BsaW5rIElOYW1lc3BhY2V9IGZvciB0aGUgZnJhbWV3b3JrIGl0c2VsZi4KLSAgICAgKiAKLSAgICAgKiAgQHNpbmNlIDIuMgotICAgICAqIAotICAgICAqKi8KLQotICAgIHB1YmxpYyBJTmFtZXNwYWNlIGdldEZyYW1ld29ya05hbWVzcGFjZSgpOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2VuZ2luZS9JVGVtcGxhdGVTb3VyY2UuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9lbmdpbmUvSVRlbXBsYXRlU291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlYmRiY2MuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2VuZ2luZS9JVGVtcGxhdGVTb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmVuZ2luZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUNvbXBvbmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZXF1ZXN0Q3ljbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5wYXJzZS5Db21wb25lbnRUZW1wbGF0ZTsKLQotLyoqCi0gKiBBIHNvdXJjZSBvZiBsb2NhbGl6ZWQgSFRNTCB0ZW1wbGF0ZXMgZm9yIGNvbXBvbmVudHMuICAKLSAqIFRoZSBjYWNoZSBpcyB0aGUgbWVhbnMgb2YgYWNjZXNzIGZvciBjb21wb25lbnRzIHRvIGxvYWQgdGhpZXIgdGVtcGxhdGVzLAotICogd2hpY2ggdGhleSBuZWVkIG5vdCBkbyB1bnRpbCBqdXN0IGJlZm9yZSByZW5kZXJpbmcuCi0gKgotICogPHA+VGhlIHRlbXBsYXRlIGNhY2hlIG11c3QgYmUgYWJsZSB0byBsb2NhdGUgYW5kIHBhcnNlIHRlbXBsYXRlcyBhcyBuZWVkZWQuCi0gKiBJdCBtYXkgbWFpbnRhaW4gdGVtcGxhdGVzIGluIG1lbW9yeS4KLSAqCi0gKiBAYXV0aG9yIEhvd2FyZCBTaGlwCi0gKiBAdmVyc2lvbiAkSWQkCi0gKiAKLSAqKi8KLQotcHVibGljIGludGVyZmFjZSBJVGVtcGxhdGVTb3VyY2UKLXsKLSAgICAvKioKLSAgICAgKiAgTmFtZSBvZiBhbiB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5JQXNzZXR9IG9mIGEgY29tcG9uZW50IHRoYXQgcHJvdmlkZXMgdGhlIHRlbXBsYXRlCi0gICAgICogIGZvciB0aGUgYXNzZXQuICBUaGlzIG92ZXJyaWRlcyB0aGUgZGVmYXVsdCAodGhhdCB0aGUgdGVtcGxhdGUgaXMgaW4KLSAgICAgKiAgdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoZSBzcGVjaWZpY2F0aW9uKS4gIFRoaXMgYWxsb3dzCi0gICAgICogIHBhZ2VzIG9yIGNvbXBvbmVudCB0ZW1wbGF0ZXMgdG8gYmUgbG9jYXRlZCBwcm9wZXJseSwgcmVsYXRpdmUgdG8gc3RhdGljCi0gICAgICogIGFzc2V0cyAoc3VjaCBhcyBpbWFnZXMgYW5kIHN0eWxlc2hlZXRzKS4KLSAgICAgKiAKLSAgICAgKiAgQHNpbmNlIDIuMgotICAgICAqIAotICAgICAqKi8KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURU1QTEFURV9BU1NFVF9OQU1FID0gIiR0ZW1wbGF0ZSI7Ci0KLSAgICAvKioKLSAgICAgKiAgTmFtZSBvZiB0aGUgY29tcG9uZW50IHBhcmFtZXRlciB0aGF0IHdpbGwgYmUgYXV0b21hdGljYWxseSBib3VuZCB0bwotICAgICAqICB0aGUgSFRNTCB0YWcgdGhhdCBpcyB1c2VkIHRvIGluc2VydCB0aGUgY29tcG9uZW50IGluIHRoZSBwYXJlbnQgdGVtcGxhdGUuCi0gICAgICogIElmIHRoZSBwYXJlbnQgY29tcG9uZW50IGRvZXMgbm90IGhhdmUgYSB0ZW1wbGF0ZSAoaS5lLiBpdCBleHRlbmRzIAotICAgICAqICBBYnN0cmFjdENvbXBvbmVudCwgbm90IEJhc2VDb21wb25lbnQpLCB0aGVuIHRoaXMgcGFyYW1ldGVyIGlzIGJvdW5kIHRvIG51bGwuCi0gICAgICogCi0gICAgICogIEBzaW5jZSAzLjAKLSAgICAgKiAKLSAgICAgKiovCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVNUExBVEVfVEFHX1BBUkFNRVRFUl9OQU1FID0gInRlbXBsYXRlVGFnIjsKLSAgICAKLSAgICAvKioKLSAgICAgKiAgTG9jYXRlcyB0aGUgdGVtcGxhdGUgZm9yIHRoZSBjb21wb25lbnQuCi0gICAgICogCi0gICAgICogIEBwYXJhbSBjeWNsZSBUaGUgcmVxdWVzdCBjeWNsZSBsb2FkaW5nIHRoZSB0ZW1wbGF0ZTsgdGhpcyBpcyByZXF1aXJlZAotICAgICAqICBpbiBzb21lIGNhc2VzIHdoZW4gdGhlIHRlbXBsYXRlIGlzIGxvYWRlZCBmcm9tIGFuIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LklBc3NldH0uCi0gICAgICogIEBwYXJhbSBjb21wb25lbnQgVGhlIGNvbXBvbmVudCBmb3Igd2hpY2ggYSB0ZW1wbGF0ZSBzaG91bGQgYmUgbG9hZGVkLgotICAgICAqCi0gICAgICogIEB0aHJvd3Mgb3JnLmFwYWNoZS50YXBlc3RyeS5BcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24gaWYgdGhlIHJlc291cmNlIGNhbm5vdCBiZSBsb2NhdGVkIG9yIGxvYWRlZC4KLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgQ29tcG9uZW50VGVtcGxhdGUgZ2V0VGVtcGxhdGUoSVJlcXVlc3RDeWNsZSBjeWNsZSwgSUNvbXBvbmVudCBjb21wb25lbnQpOwotCi0gICAgLyoqCi0gICAgICogIEludm9rZWQgdG8gaGF2ZSB0aGUgc291cmNlIGNsZWFyIGFueSBpbnRlcm5hbCBjYWNoZS4gIFRoaXMgaXMgbW9zdCBvZnRlbgotICAgICAqICB1c2VkIHdoZW4gZGVidWdnaW5nIGFuIGFwcGxpY2F0aW9uLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgcmVzZXQoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZW5naW5lL0lUZW1wbGF0ZVNvdXJjZURlbGVnYXRlLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZW5naW5lL0lUZW1wbGF0ZVNvdXJjZURlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2NjgyOTYuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2VuZ2luZS9JVGVtcGxhdGVTb3VyY2VEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuZW5naW5lOwotCi1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUNvbXBvbmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZXF1ZXN0Q3ljbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5wYXJzZS5Db21wb25lbnRUZW1wbGF0ZTsKLQotLyoqCi0gKiAgQWN0cyBhcyBhIGRlbGVnYXRlIHRvIHRoZSB7QGxpbmsgSVRlbXBsYXRlU291cmNlfSwgcHJvdmlkaW5nIGFjY2VzcyB0bwotICogIHBhZ2UgYW5kIGNvbXBvbmVudCB0ZW1wbGF0ZXMgYWZ0ZXIgdGhlIG5vcm1hbCBzZWFyY2ggbWVjaGFuaXNtcyBoYXZlIGZhaWxlZC4KLSAqIAotICogIDxwPgotICogIFRoZSBkZWxlZ2F0ZSBtdXN0IGJlIHRocmVhZHNhZmUuCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQHNpbmNlIDMuMAotICogIEBzZWUgb3JnLmFwYWNoZS50YXBlc3RyeS5lbmdpbmUuRGVmYXVsdFRlbXBsYXRlU291cmNlCi0gKiAKLSAqKi8KLQotcHVibGljIGludGVyZmFjZSBJVGVtcGxhdGVTb3VyY2VEZWxlZ2F0ZQotewotCS8qKgotCSAqICBJbnZva2VkIGJ5IHRoZSB7QGxpbmsgSVRlbXBsYXRlU291cmNlfSB3aGVuIGEgdGVtcGxhdGUgY2FuJ3QgYmUgZm91bmQKLQkgKiAgYnkgbm9ybWFsIG1lYW5zIChpLmUuLCBpbiB0aGUgbm9ybWFsIGxvY2F0aW9ucykuICBUaGlzIG1ldGhvZAotCSAqICBzaG91bGQgZmluZCB0aGUgdGVtcGxhdGUuICBUaGUgcmVzdWx0IG1heSBiZSBudWxsLiAgVGhlIGRlbGVnYXRlCi0JICogIGlzIHJlc3BvbnNpYmxlIGZvciBjYWNoaW5nIHRoZSByZXN1bHQuCi0JICogCi0JICogIEBwYXJhbSBjeWNsZSBmb3IgYWNjZXNzIHRvIFRhcGVzdHJ5IGFuZCBTZXJ2bGV0IEFQSSBvYmplY3RzCi0JICogIEBwYXJhbSBjb21wb25lbnQgY29tcG9uZW50IChvciBwYWdlKSBmb3Igd2hpY2ggYSB0ZW1wbGF0ZSBpcyBuZWVkZWQKLQkgKiAgQHBhcmFtIGxvY2FsZSB0aGUgZGVzaXJlZCBsb2NhbGUgZm9yIHRoZSB0ZW1wbGF0ZQotCSAqIAotCSAqKi8KLQkKLQlwdWJsaWMgQ29tcG9uZW50VGVtcGxhdGUgZmluZFRlbXBsYXRlKElSZXF1ZXN0Q3ljbGUgY3ljbGUsCi0JSUNvbXBvbmVudCBjb21wb25lbnQsCi0JTG9jYWxlIGxvY2FsZSk7Ci19CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZW5naW5lL05hbWVzcGFjZS5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2VuZ2luZS9OYW1lc3BhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk0ZmZmMS4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZW5naW5lL05hbWVzcGFjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk1ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmVuZ2luZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUxvY2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZXNvdXJjZUxvY2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuVGFwZXN0cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5yZXNvdXJjZS5DbGFzc3BhdGhSZXNvdXJjZUxvY2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuc3BlYy5JQ29tcG9uZW50U3BlY2lmaWNhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnNwZWMuSUxpYnJhcnlTcGVjaWZpY2F0aW9uOwotCi0vKioKLSAqICBJbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5JTmFtZXNwYWNlfQotICogIHRoYXQgd29ya3Mgd2l0aCBhIHtAbGluayBJU3BlY2lmaWNhdGlvblNvdXJjZX0gdG8KLSAqICBvYnRhaW4gcGFnZSBhbmQgY29tcG9uZW50IHNwZWNpZmljYXRpb25zIGFzIG5lZWRlZC4KLSAqCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogIEB2ZXJzaW9uICRJZCQKLSAqICBAc2luY2UgMi4yCi0gKgotICoqLwotCi1wdWJsaWMgY2xhc3MgTmFtZXNwYWNlIGltcGxlbWVudHMgSU5hbWVzcGFjZQotewotICAgIHByaXZhdGUgSUxpYnJhcnlTcGVjaWZpY2F0aW9uIF9zcGVjaWZpY2F0aW9uOwotICAgIHByaXZhdGUgSVNwZWNpZmljYXRpb25Tb3VyY2UgX3NwZWNpZmljYXRpb25Tb3VyY2U7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgX2lkOwotICAgIHByaXZhdGUgU3RyaW5nIF9leHRlbmRlZElkOwotICAgIHByaXZhdGUgSU5hbWVzcGFjZSBfcGFyZW50OwotICAgIHByaXZhdGUgYm9vbGVhbiBfZnJhbWV3b3JrTmFtZXNwYWNlOwotICAgIHByaXZhdGUgYm9vbGVhbiBfYXBwbGljYXRpb25OYW1lc3BhY2U7Ci0KLSAgICAvKioKLSAgICAgKiAgTWFwIG9mIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LnNwZWMuQ29tcG9uZW50U3BlY2lmaWNhdGlvbn0ga2V5ZWQgb24gcGFnZSBuYW1lLgotICAgICAqICBUaGUgbWFwIGlzIHN5bmNocm9uaXplZCBiZWNhdXNlIGRpZmZlcmVudCB0aHJlYWRzIG1heQotICAgICAqICB0cnkgdG8gdXBkYXRlIGl0IHNpbXVsdGFuZW91c2x5IChkdWUgdG8gZHluYW1pYyBwYWdlCi0gICAgICogIGRpc2NvdmVyeSBpbiB0aGUgYXBwbGljYXRpb24gbmFtZXNwYWNlKS4KLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwcml2YXRlIE1hcCBfcGFnZXMgPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRNYXAobmV3IEhhc2hNYXAoKSk7Ci0KLSAgICAvKioKLSAgICAgKiAgTWFwIG9mIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LnNwZWMuQ29tcG9uZW50U3BlY2lmaWNhdGlvbn0ga2V5ZWQgb24KLSAgICAgKiAgY29tcG9uZW50IGFsaWFzLgotICAgICAqIAotICAgICAqKi8KLQotICAgIHByaXZhdGUgTWFwIF9jb21wb25lbnRzID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTWFwKG5ldyBIYXNoTWFwKCkpOwotCi0gICAgLyoqCi0gICAgICogIE1hcCwga2V5ZWQgb24gaWQsIG9mIHtAbGluayBJTmFtZXNwYWNlfS4KLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwcml2YXRlIE1hcCBfY2hpbGRyZW4gPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRNYXAobmV3IEhhc2hNYXAoKSk7Ci0KLSAgICBwdWJsaWMgTmFtZXNwYWNlKAotICAgICAgICBTdHJpbmcgaWQsCi0gICAgICAgIElOYW1lc3BhY2UgcGFyZW50LAotICAgICAgICBJTGlicmFyeVNwZWNpZmljYXRpb24gc3BlY2lmaWNhdGlvbiwKLSAgICAgICAgSVNwZWNpZmljYXRpb25Tb3VyY2Ugc3BlY2lmaWNhdGlvblNvdXJjZSkKLSAgICB7Ci0gICAgICAgIF9pZCA9IGlkOwotICAgICAgICBfcGFyZW50ID0gcGFyZW50OwotICAgICAgICBfc3BlY2lmaWNhdGlvbiA9IHNwZWNpZmljYXRpb247Ci0gICAgICAgIF9zcGVjaWZpY2F0aW9uU291cmNlID0gc3BlY2lmaWNhdGlvblNvdXJjZTsKLQotICAgICAgICBfYXBwbGljYXRpb25OYW1lc3BhY2UgPSAoX2lkID09IG51bGwpOwotICAgICAgICBfZnJhbWV3b3JrTmFtZXNwYWNlID0gRlJBTUVXT1JLX05BTUVTUEFDRS5lcXVhbHMoX2lkKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgICB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCJOYW1lc3BhY2VAIik7Ci0gICAgICAgIGJ1ZmZlci5hcHBlbmQoSW50ZWdlci50b0hleFN0cmluZyhoYXNoQ29kZSgpKSk7Ci0gICAgICAgIGJ1ZmZlci5hcHBlbmQoJ1snKTsKLQotICAgICAgICBpZiAoX2FwcGxpY2F0aW9uTmFtZXNwYWNlKQotICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiPGFwcGxpY2F0aW9uPiIpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBidWZmZXIuYXBwZW5kKGdldEV4dGVuZGVkSWQoKSk7Ci0KLSAgICAgICAgYnVmZmVyLmFwcGVuZCgnXScpOwotCi0gICAgICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldElkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfaWQ7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRFeHRlbmRlZElkKCkKLSAgICB7Ci0gICAgICAgIGlmIChfYXBwbGljYXRpb25OYW1lc3BhY2UpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICBpZiAoX2V4dGVuZGVkSWQgPT0gbnVsbCkKLSAgICAgICAgICAgIF9leHRlbmRlZElkID0gYnVpbGRFeHRlbmRlZElkKCk7Ci0KLSAgICAgICAgcmV0dXJuIF9leHRlbmRlZElkOwotICAgIH0KLQotICAgIHB1YmxpYyBJTmFtZXNwYWNlIGdldFBhcmVudE5hbWVzcGFjZSgpCi0gICAgewotICAgICAgICByZXR1cm4gX3BhcmVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSU5hbWVzcGFjZSBnZXRDaGlsZE5hbWVzcGFjZShTdHJpbmcgaWQpCi0gICAgewotICAgICAgICBTdHJpbmcgZmlyc3RJZCA9IGlkOwotICAgICAgICBTdHJpbmcgbmV4dElkcyA9IG51bGw7Ci0KLSAgICAgICAgLy8gU3BsaXQgdGhlIGlkIGludG8gZmlyc3QgYW5kIG5leHQgaWYgaXQgaXMgYSBkb3Qgc2VwYXJhdGVkIHNlcXVlbmNlCi0gICAgICAgIGludCBpbmRleCA9IGlkLmluZGV4T2YoJy4nKTsKLSAgICAgICAgaWYgKGluZGV4ID49IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpcnN0SWQgPSBpZC5zdWJzdHJpbmcoMCwgaW5kZXgpOwotICAgICAgICAgICAgbmV4dElkcyA9IGlkLnN1YnN0cmluZyhpbmRleCArIDEpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gR2V0IHRoZSBmaXJzdCBuYW1lc3BhY2UKLSAgICAgICAgSU5hbWVzcGFjZSByZXN1bHQgPSAoSU5hbWVzcGFjZSkgX2NoaWxkcmVuLmdldChmaXJzdElkKTsKLQotICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IGNyZWF0ZU5hbWVzcGFjZShmaXJzdElkKTsKLQotICAgICAgICAgICAgX2NoaWxkcmVuLnB1dChmaXJzdElkLCByZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSWYgdGhlIGlkIGlzIGEgZG90IHNlcGFyYXRlZCBzZXF1ZW5jZSwgcmVjdXJzZSB0byBmaW5kIAotICAgICAgICAvLyB0aGUgbmVlZGVkIG5hbWVzcGFjZQotICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwgJiYgbmV4dElkcyAhPSBudWxsKQotICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmdldENoaWxkTmFtZXNwYWNlKG5leHRJZHMpOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3QgZ2V0Q2hpbGRJZHMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9zcGVjaWZpY2F0aW9uLmdldExpYnJhcnlJZHMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSUNvbXBvbmVudFNwZWNpZmljYXRpb24gZ2V0UGFnZVNwZWNpZmljYXRpb24oU3RyaW5nIG5hbWUpCi0gICAgewotICAgICAgICBJQ29tcG9uZW50U3BlY2lmaWNhdGlvbiByZXN1bHQgPSAoSUNvbXBvbmVudFNwZWNpZmljYXRpb24pIF9wYWdlcy5nZXQobmFtZSk7Ci0KLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQgPSBsb2NhdGVQYWdlU3BlY2lmaWNhdGlvbihuYW1lKTsKLQotICAgICAgICAgICAgX3BhZ2VzLnB1dChuYW1lLCByZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdCBnZXRQYWdlTmFtZXMoKQotICAgIHsKLSAgICAgICAgU2V0IG5hbWVzID0gbmV3IEhhc2hTZXQoKTsKLQotICAgICAgICBuYW1lcy5hZGRBbGwoX3BhZ2VzLmtleVNldCgpKTsKLSAgICAgICAgbmFtZXMuYWRkQWxsKF9zcGVjaWZpY2F0aW9uLmdldFBhZ2VOYW1lcygpKTsKLQotICAgICAgICBMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QobmFtZXMpOwotCi0gICAgICAgIENvbGxlY3Rpb25zLnNvcnQocmVzdWx0KTsKLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyBJQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBnZXRDb21wb25lbnRTcGVjaWZpY2F0aW9uKFN0cmluZyBhbGlhcykKLSAgICB7Ci0gICAgICAgIElDb21wb25lbnRTcGVjaWZpY2F0aW9uIHJlc3VsdCA9IChJQ29tcG9uZW50U3BlY2lmaWNhdGlvbikgX2NvbXBvbmVudHMuZ2V0KGFsaWFzKTsKLQotICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IGxvY2F0ZUNvbXBvbmVudFNwZWNpZmljYXRpb24oYWxpYXMpOwotICAgICAgICAgICAgX2NvbXBvbmVudHMucHV0KGFsaWFzLCByZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNlcnZpY2VDbGFzc05hbWUoU3RyaW5nIG5hbWUpCi0gICAgewotICAgICAgICByZXR1cm4gX3NwZWNpZmljYXRpb24uZ2V0U2VydmljZUNsYXNzTmFtZShuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdCBnZXRTZXJ2aWNlTmFtZXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9zcGVjaWZpY2F0aW9uLmdldFNlcnZpY2VOYW1lcygpOwotICAgIH0KLQotICAgIHB1YmxpYyBJTGlicmFyeVNwZWNpZmljYXRpb24gZ2V0U3BlY2lmaWNhdGlvbigpCi0gICAgewotICAgICAgICByZXR1cm4gX3NwZWNpZmljYXRpb247Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgYnVpbGRFeHRlbmRlZElkKCkKLSAgICB7Ci0gICAgICAgIGlmIChfcGFyZW50ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gX2lkOwotCi0gICAgICAgIFN0cmluZyBwYXJlbnRJZCA9IF9wYXJlbnQuZ2V0RXh0ZW5kZWRJZCgpOwotCi0gICAgICAgIC8vIElmIGltbWVkaWF0ZSBjaGlsZCBvZiBhcHBsaWNhdGlvbiBuYW1lc3BhY2UKLQotICAgICAgICBpZiAocGFyZW50SWQgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBfaWQ7Ci0KLSAgICAgICAgcmV0dXJuIHBhcmVudElkICsgIi4iICsgX2lkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIGEgc3RyaW5nIGlkZW50aWZ5aW5nIHRoZSBuYW1lc3BhY2UsIGZvciB1c2UgaW4KLSAgICAgKiAgZXJyb3IgbWVzc2FnZXMuICBJLmUuLCAiQXBwbGljYXRpb24gbmFtZXNwYWNlIiBvciAibmFtZXNwYWNlICdmb28nIi4KLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZUlkKCkKLSAgICB7Ci0gICAgICAgIGlmIChfZnJhbWV3b3JrTmFtZXNwYWNlKQotICAgICAgICAgICAgcmV0dXJuIFRhcGVzdHJ5LmdldE1lc3NhZ2UoIk5hbWVzcGFjZS5mcmFtZXdvcmstbmFtZXNwYWNlIik7Ci0KLSAgICAgICAgaWYgKF9hcHBsaWNhdGlvbk5hbWVzcGFjZSkKLSAgICAgICAgICAgIHJldHVybiBUYXBlc3RyeS5nZXRNZXNzYWdlKCJOYW1lc3BhY2UuYXBwbGljYXRpb24tbmFtZXNwYWNlIik7Ci0KLSAgICAgICAgcmV0dXJuIFRhcGVzdHJ5LmZvcm1hdCgiTmFtZXNwYWNlLm5lc3RlZC1uYW1lc3BhY2UiLCBnZXRFeHRlbmRlZElkKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBHZXRzIHRoZSBzcGVjaWZpY2F0aW9uIGZyb20gdGhlIHNwZWNpZmljYXRpb24gc291cmNlLgotICAgICAqIAotICAgICAqICBAdGhyb3dzIEFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbiBpZiB0aGUgbmFtZWQgcGFnZSBpcyBub3QgZGVmaW5lZC4KLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwcml2YXRlIElDb21wb25lbnRTcGVjaWZpY2F0aW9uIGxvY2F0ZVBhZ2VTcGVjaWZpY2F0aW9uKFN0cmluZyBuYW1lKQotICAgIHsKLSAgICAgICAgU3RyaW5nIHBhdGggPSBfc3BlY2lmaWNhdGlvbi5nZXRQYWdlU3BlY2lmaWNhdGlvblBhdGgobmFtZSk7Ci0KLSAgICAgICAgaWYgKHBhdGggPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgVGFwZXN0cnkuZm9ybWF0KCJOYW1lc3BhY2Uubm8tc3VjaC1wYWdlIiwgbmFtZSwgZ2V0TmFtZXNwYWNlSWQoKSkpOwotCi0gICAgICAgIElSZXNvdXJjZUxvY2F0aW9uIGxvY2F0aW9uID0gZ2V0U3BlY2lmaWNhdGlvbkxvY2F0aW9uKCkuZ2V0UmVsYXRpdmVMb2NhdGlvbihwYXRoKTsKLQotICAgICAgICByZXR1cm4gX3NwZWNpZmljYXRpb25Tb3VyY2UuZ2V0UGFnZVNwZWNpZmljYXRpb24obG9jYXRpb24pOwotICAgIH0KLQotICAgIHByaXZhdGUgSUNvbXBvbmVudFNwZWNpZmljYXRpb24gbG9jYXRlQ29tcG9uZW50U3BlY2lmaWNhdGlvbihTdHJpbmcgdHlwZSkKLSAgICB7Ci0gICAgICAgIFN0cmluZyBwYXRoID0gX3NwZWNpZmljYXRpb24uZ2V0Q29tcG9uZW50U3BlY2lmaWNhdGlvblBhdGgodHlwZSk7Ci0KLSAgICAgICAgaWYgKHBhdGggPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgVGFwZXN0cnkuZm9ybWF0KCJOYW1lc3BhY2Uubm8tc3VjaC1hbGlhcyIsIHR5cGUsIGdldE5hbWVzcGFjZUlkKCkpKTsKLQotICAgICAgICBJUmVzb3VyY2VMb2NhdGlvbiBsb2NhdGlvbiA9IGdldFNwZWNpZmljYXRpb25Mb2NhdGlvbigpLmdldFJlbGF0aXZlTG9jYXRpb24ocGF0aCk7Ci0KLSAgICAgICAgcmV0dXJuIF9zcGVjaWZpY2F0aW9uU291cmNlLmdldENvbXBvbmVudFNwZWNpZmljYXRpb24obG9jYXRpb24pOwotICAgIH0KLQotICAgIHByaXZhdGUgSU5hbWVzcGFjZSBjcmVhdGVOYW1lc3BhY2UoU3RyaW5nIGlkKQotICAgIHsKLSAgICAgICAgU3RyaW5nIHBhdGggPSBfc3BlY2lmaWNhdGlvbi5nZXRMaWJyYXJ5U3BlY2lmaWNhdGlvblBhdGgoaWQpOwotCi0gICAgICAgIGlmIChwYXRoID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIFRhcGVzdHJ5LmZvcm1hdCgiTmFtZXNwYWNlLmxpYnJhcnktaWQtbm90LWZvdW5kIiwgaWQsIGdldE5hbWVzcGFjZUlkKCkpKTsKLQotICAgICAgICBJUmVzb3VyY2VMb2NhdGlvbiBsb2NhdGlvbiA9IGdldFNwZWNpZmljYXRpb25Mb2NhdGlvbigpLmdldFJlbGF0aXZlTG9jYXRpb24ocGF0aCk7Ci0KLSAgICAgICAgLy8gT2ssIGFuIGFic29sdXRlIHBhdGggdG8gYSBsaWJyYXJ5IGZvciBhbiBhcHBsaWNhdGlvbiB3aG9zZSBzcGVjaWZpY2F0aW9uCi0gICAgICAgIC8vIGlzIGluIHRoZSBjb250ZXh0IHJvb3QgaXMgcHJvYmxlbWF0aWMsIGNhdXNlIGdldFJlbGF0aXZlTG9jYXRpb24oKQotICAgICAgICAvLyB3aWxsIHN0aWxsIGJlIGxvb2tpbmcgaW4gdGhlIGNvbnRleHQuICBIYW5kbGUgdGhpcyBjYXNlIHdpdGggdGhlCi0gICAgICAgIC8vIGZvbGxvd2luZyBsaXR0bGUga2x1ZGdlOgotCi0gICAgICAgIGlmIChsb2NhdGlvbi5nZXRSZXNvdXJjZVVSTCgpID09IG51bGwgJiYgcGF0aC5zdGFydHNXaXRoKCIvIikpCi0gICAgICAgICAgICBsb2NhdGlvbiA9IG5ldyBDbGFzc3BhdGhSZXNvdXJjZUxvY2F0aW9uKF9zcGVjaWZpY2F0aW9uLmdldFJlc291cmNlUmVzb2x2ZXIoKSwgcGF0aCk7Ci0KLSAgICAgICAgSUxpYnJhcnlTcGVjaWZpY2F0aW9uIGxzID0gX3NwZWNpZmljYXRpb25Tb3VyY2UuZ2V0TGlicmFyeVNwZWNpZmljYXRpb24obG9jYXRpb24pOwotCi0gICAgICAgIHJldHVybiBuZXcgTmFtZXNwYWNlKGlkLCB0aGlzLCBscywgX3NwZWNpZmljYXRpb25Tb3VyY2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zUGFnZShTdHJpbmcgbmFtZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfcGFnZXMuY29udGFpbnNLZXkobmFtZSkgfHwgKF9zcGVjaWZpY2F0aW9uLmdldFBhZ2VTcGVjaWZpY2F0aW9uUGF0aChuYW1lKSAhPSBudWxsKTsKLSAgICB9Ci0KLSAgICAvKiogQHNpbmNlIDIuMyAqKi8KLQotICAgIHB1YmxpYyBTdHJpbmcgY29uc3RydWN0UXVhbGlmaWVkTmFtZShTdHJpbmcgcGFnZU5hbWUpCi0gICAgewotICAgICAgICBTdHJpbmcgcHJlZml4ID0gZ2V0RXh0ZW5kZWRJZCgpOwotCi0gICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBwYWdlTmFtZTsKLQotICAgICAgICByZXR1cm4gcHJlZml4ICsgU0VQQVJBVE9SICsgcGFnZU5hbWU7Ci0gICAgfQotCi0gICAgLyoqIEBzaW5jZSAzLjAgKiovCi0KLSAgICBwdWJsaWMgSVJlc291cmNlTG9jYXRpb24gZ2V0U3BlY2lmaWNhdGlvbkxvY2F0aW9uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfc3BlY2lmaWNhdGlvbi5nZXRTcGVjaWZpY2F0aW9uTG9jYXRpb24oKTsKLSAgICB9Ci0KLSAgICAvKiogQHNpbmNlIDMuMCAqKi8KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQXBwbGljYXRpb25OYW1lc3BhY2UoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9hcHBsaWNhdGlvbk5hbWVzcGFjZTsKLSAgICB9Ci0KLSAgICAvKiogQHNpbmNlIDMuMCAqKi8KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBpbnN0YWxsUGFnZVNwZWNpZmljYXRpb24oCi0gICAgICAgIFN0cmluZyBwYWdlTmFtZSwKLSAgICAgICAgSUNvbXBvbmVudFNwZWNpZmljYXRpb24gc3BlY2lmaWNhdGlvbikKLSAgICB7Ci0gICAgICAgIF9wYWdlcy5wdXQocGFnZU5hbWUsIHNwZWNpZmljYXRpb24pOwotICAgIH0KLQotICAgIC8qKiBAc2luY2UgMy4wICoqLwotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGluc3RhbGxDb21wb25lbnRTcGVjaWZpY2F0aW9uKAotICAgICAgICBTdHJpbmcgdHlwZSwKLSAgICAgICAgSUNvbXBvbmVudFNwZWNpZmljYXRpb24gc3BlY2lmaWNhdGlvbikKLSAgICB7Ci0gICAgICAgIF9jb21wb25lbnRzLnB1dCh0eXBlLCBzcGVjaWZpY2F0aW9uKTsKLSAgICB9Ci0KLSAgICAvKiogQHNpbmNlIDMuMCAqKi8KLQotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zQ29tcG9uZW50VHlwZShTdHJpbmcgdHlwZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfY29tcG9uZW50cy5jb250YWluc0tleSh0eXBlKQotICAgICAgICAgICAgfHwgKF9zcGVjaWZpY2F0aW9uLmdldENvbXBvbmVudFNwZWNpZmljYXRpb25QYXRoKHR5cGUpICE9IG51bGwpOwotICAgIH0KLQotICAgIC8qKiBAc2luY2UgMy4wICoqLwotCi0gICAgcHVibGljIExpc3QgZ2V0Q29tcG9uZW50VHlwZXMoKQotICAgIHsKLSAgICAgICAgU2V0IHR5cGVzID0gbmV3IEhhc2hTZXQoKTsKLQotICAgICAgICB0eXBlcy5hZGRBbGwoX2NvbXBvbmVudHMua2V5U2V0KCkpOwotICAgICAgICB0eXBlcy5hZGRBbGwoX3NwZWNpZmljYXRpb24uZ2V0Q29tcG9uZW50VHlwZXMoKSk7Ci0KLSAgICAgICAgTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KHR5cGVzKTsKLQotICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KHJlc3VsdCk7Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKiogQHNpbmNlIDMuMCAqKi8KLQotICAgIHB1YmxpYyBJTG9jYXRpb24gZ2V0TG9jYXRpb24oKQotICAgIHsKLSAgICAgICAgaWYgKF9zcGVjaWZpY2F0aW9uID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICByZXR1cm4gX3NwZWNpZmljYXRpb24uZ2V0TG9jYXRpb24oKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9lbmdpbmUvTnVsbE1vbml0b3IuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9lbmdpbmUvTnVsbE1vbml0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNhMmI2Yy4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZW5naW5lL051bGxNb25pdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5lbmdpbmU7Ci0KLQotCi0vKioKLSAqICBOdWxsIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LmVuZ2luZS5JTW9uaXRvcn0uCi0gKiAKLSAqCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogIEB2ZXJzaW9uICRJZCQKLSAqICBAc2luY2UgMy4wCi0gKgotICoqLwotCi1wdWJsaWMgY2xhc3MgTnVsbE1vbml0b3IgaW1wbGVtZW50cyBJTW9uaXRvcgotewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTnVsbE1vbml0b3IgU0hBUkVEID0gbmV3IE51bGxNb25pdG9yKCk7Ci0KLSAgICBwdWJsaWMgdm9pZCBwYWdlQ3JlYXRlQmVnaW4oU3RyaW5nIHBhZ2VOYW1lKQotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwYWdlQ3JlYXRlRW5kKFN0cmluZyBwYWdlTmFtZSkKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcGFnZUxvYWRCZWdpbihTdHJpbmcgcGFnZU5hbWUpCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHBhZ2VMb2FkRW5kKFN0cmluZyBwYWdlTmFtZSkKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcGFnZVJlbmRlckJlZ2luKFN0cmluZyBwYWdlTmFtZSkKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcGFnZVJlbmRlckVuZChTdHJpbmcgcGFnZU5hbWUpCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHBhZ2VSZXdpbmRCZWdpbihTdHJpbmcgcGFnZU5hbWUpCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHBhZ2VSZXdpbmRFbmQoU3RyaW5nIHBhZ2VOYW1lKQotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXJ2aWNlQmVnaW4oU3RyaW5nIHNlcnZpY2VOYW1lLCBTdHJpbmcgZGV0YWlsTWVzc2FnZSkKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2VydmljZUVuZChTdHJpbmcgc2VydmljZU5hbWUpCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNlcnZpY2VFeGNlcHRpb24oVGhyb3dhYmxlIGV4Y2VwdGlvbikKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2Vzc2lvbkJlZ2luKCkKLSAgICB7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZW5naW5lL051bGxUZW1wbGF0ZVNvdXJjZURlbGVnYXRlLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZW5naW5lL051bGxUZW1wbGF0ZVNvdXJjZURlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhYTMxMDUuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2VuZ2luZS9OdWxsVGVtcGxhdGVTb3VyY2VEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuZW5naW5lOwotCi1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUNvbXBvbmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZXF1ZXN0Q3ljbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5wYXJzZS5Db21wb25lbnRUZW1wbGF0ZTsKLQotLyoqCi0gKiAgTnVsbCBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5lbmdpbmUuSVRlbXBsYXRlU291cmNlRGVsZWdhdGV9LiAKLSAqCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogIEB2ZXJzaW9uICRJZCQKLSAqICBAc2luY2UgMy4wCi0gKgotICoqLwotCi1wdWJsaWMgY2xhc3MgTnVsbFRlbXBsYXRlU291cmNlRGVsZWdhdGUgaW1wbGVtZW50cyBJVGVtcGxhdGVTb3VyY2VEZWxlZ2F0ZQotewotCXByaXZhdGUgc3RhdGljIE51bGxUZW1wbGF0ZVNvdXJjZURlbGVnYXRlIF9zaGFyZWQ7Ci0JCi0JLyoqCi0JICogIFJldHVybnMgYSBzaGFyZWQgaW5zdGFuY2Ugb2YgTnVsbFRlbXBsYXRlU291cmNlRGVsZWdhdGUuCi0JICogCi0JICoqLwotCQotCXB1YmxpYyBzdGF0aWMgTnVsbFRlbXBsYXRlU291cmNlRGVsZWdhdGUgZ2V0U2hhcmVkSW5zdGFuY2UoKQotCXsKLQkJaWYgKF9zaGFyZWQgPT0gbnVsbCkKLQkJCV9zaGFyZWQgPSBuZXcgTnVsbFRlbXBsYXRlU291cmNlRGVsZWdhdGUoKTsKLQkJCQotCQlyZXR1cm4gX3NoYXJlZDsKLQl9Ci0KLQkvKioKLQkgKiAgU2ltcGx5IHJldHVybnMgbnVsbC4KLQkgKiAKLQkgKiovCi0JCi0gICAgcHVibGljIENvbXBvbmVudFRlbXBsYXRlIGZpbmRUZW1wbGF0ZShJUmVxdWVzdEN5Y2xlIGN5Y2xlLCBJQ29tcG9uZW50IGNvbXBvbmVudCwgTG9jYWxlIGxvY2FsZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2VuZ2luZS9OdWxsV3JpdGVyLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZW5naW5lL051bGxXcml0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ZiNWQ4Yy4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZW5naW5lL051bGxXcml0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5lbmdpbmU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklNYXJrdXBXcml0ZXI7Ci0KLS8qKgotICogIEEge0BsaW5rIElNYXJrdXBXcml0ZXJ9IHRoYXQgZG9lcyBhYnNvbHV0ZWx5IDxlbT5ub3RoaW5nPC9lbT47IHRoaXMKLSAqICBpcyB1c2VkIGR1cmluZyB0aGUgcmV3aW5kIHBoYXNlIG9mIHRoZSByZXF1ZXN0IGN5Y2xlIHdoZW4gb3V0cHV0Ci0gKiAgaXMgZGlzY2FyZGVkIGFueXdheS4KLSAqCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcCwgRGF2aWQgU29saXMKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQHNpbmNlIDAuMi45Ci0gKgotICoqLwotCi1wdWJsaWMgY2xhc3MgTnVsbFdyaXRlciBpbXBsZW1lbnRzIElNYXJrdXBXcml0ZXIKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBJTWFya3VwV3JpdGVyIHNoYXJlZDsKLQotICAgIHB1YmxpYyBzdGF0aWMgSU1hcmt1cFdyaXRlciBnZXRTaGFyZWRJbnN0YW5jZSgpCi0gICAgewotICAgICAgICBpZiAoc2hhcmVkID09IG51bGwpCi0gICAgICAgICAgICBzaGFyZWQgPSBuZXcgTnVsbFdyaXRlcigpOwotCi0gICAgICAgIHJldHVybiBzaGFyZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJpbnRSYXcoY2hhcltdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJpbnRSYXcoU3RyaW5nIHZhbHVlKQotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcmludGxuKCkKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJpbnQoY2hhcltdIGRhdGEsIGludCBvZmZzZXQsIGludCBsZW5ndGgpCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByaW50KGNoYXIgdmFsdWUpCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByaW50KGludCB2YWx1ZSkKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJpbnQoU3RyaW5nIHZhbHVlKQotICAgIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyA8Y29kZT50aGlzPC9jb2RlPjogc2luY2UgYSBOdWxsV3JpdGVyIGRvZXNuJ3QgYWN0dWFsbHkKLSAgICAgKiAgZG8gYW55dGhpbmcsIG9uZSBpcyBhcyBnb29kIGFzIGFub3RoZXIhLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIElNYXJrdXBXcml0ZXIgZ2V0TmVzdGVkV3JpdGVyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudFR5cGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZmx1c2goKQotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBlbmQoKQotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBlbmQoU3RyaW5nIG5hbWUpCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNvbW1lbnQoU3RyaW5nIHZhbHVlKQotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjbG9zZVRhZygpCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkKLSAgICB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEFsd2F5cyByZXR1cm5zIGZhbHNlLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIGJvb2xlYW4gY2hlY2tFcnJvcigpCi0gICAgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYmVnaW5FbXB0eShTdHJpbmcgbmFtZSkKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYmVnaW4oU3RyaW5nIG5hbWUpCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgaW50IHZhbHVlKQotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkKLSAgICB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEBzZWUgb3JnLmFwYWNoZS50YXBlc3RyeS5JTWFya3VwV3JpdGVyI2F0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nLCBib29sZWFuKQotICAgICAqCi0gICAgICogIEBzaW5jZSAzLjAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCBhdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIGJvb2xlYW4gdmFsdWUpCi0gICAgewotICAgIH0KLQotICAgIC8qKgotICAgICAqICBAc2VlIG9yZy5hcGFjaGUudGFwZXN0cnkuSU1hcmt1cFdyaXRlciNhdHRyaWJ1dGVSYXcoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLSAgICAgKgotICAgICAqICBAc2luY2UgMy4wCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgYXR0cmlidXRlUmF3KFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpCi0gICAgewotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZW5naW5lL1BhZ2VTZXJ2aWNlLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZW5naW5lL1BhZ2VTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0Njc0MDguLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2VuZ2luZS9QYWdlU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuZW5naW5lOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUNvbXBvbmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklQYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlcXVlc3RDeWNsZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LlRhcGVzdHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkucmVxdWVzdC5SZXF1ZXN0Q29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnJlcXVlc3QuUmVzcG9uc2VPdXRwdXRTdHJlYW07Ci0KLS8qKgotICogIEJhc2ljIHNlcnZlciBmb3IgY3JlYXRpbmcgYSBsaW5rIHRvIGFub3RoZXIgcGFnZSBpbiB0aGUgYXBwbGljYXRpb24uCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQHNpbmNlIDEuMC45Ci0gKgotICoqLwotCi1wdWJsaWMgY2xhc3MgUGFnZVNlcnZpY2UgZXh0ZW5kcyBBYnN0cmFjdFNlcnZpY2UKLXsKLQotICAgIHB1YmxpYyBJTGluayBnZXRMaW5rKElSZXF1ZXN0Q3ljbGUgY3ljbGUsIElDb21wb25lbnQgY29tcG9uZW50LCBPYmplY3RbXSBwYXJhbWV0ZXJzKQotICAgIHsKLSAgICAgICAgaWYgKFRhcGVzdHJ5LnNpemUocGFyYW1ldGVycykgIT0gMSkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgVGFwZXN0cnkuZm9ybWF0KCJzZXJ2aWNlLXNpbmdsZS1wYXJhbWV0ZXIiLCBUYXBlc3RyeS5QQUdFX1NFUlZJQ0UpKTsKLQotICAgICAgICByZXR1cm4gY29uc3RydWN0TGluayhjeWNsZSwgVGFwZXN0cnkuUEFHRV9TRVJWSUNFLCBuZXcgU3RyaW5nW10geyhTdHJpbmcpIHBhcmFtZXRlcnNbMF19LCBudWxsLCB0cnVlKTsKLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNlcnZpY2UoCi0gICAgICAgIElFbmdpbmVTZXJ2aWNlVmlldyBlbmdpbmUsCi0gICAgICAgIElSZXF1ZXN0Q3ljbGUgY3ljbGUsCi0gICAgICAgIFJlc3BvbnNlT3V0cHV0U3RyZWFtIG91dHB1dCkKLSAgICAgICAgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBSZXF1ZXN0Q29udGV4dCBjb250ZXh0ID0gY3ljbGUuZ2V0UmVxdWVzdENvbnRleHQoKTsKLSAgICAgICAgU3RyaW5nW10gc2VydmljZUNvbnRleHQgPSBnZXRTZXJ2aWNlQ29udGV4dChjb250ZXh0KTsKLQotICAgICAgICBpZiAoVGFwZXN0cnkuc2l6ZShzZXJ2aWNlQ29udGV4dCkgIT0gMSkKLSAgICAgICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgVGFwZXN0cnkuZm9ybWF0KCJzZXJ2aWNlLXNpbmdsZS1wYXJhbWV0ZXIiLCBUYXBlc3RyeS5QQUdFX1NFUlZJQ0UpKTsKLQotICAgICAgICBTdHJpbmcgcGFnZU5hbWUgPSBzZXJ2aWNlQ29udGV4dFswXTsKLQotICAgICAgICAvLyBBdCBvbmUgdGltZSwgdGhlIHBhZ2Ugc2VydmljZSByZXF1aXJlZCBhIHNlc3Npb24sIGJ1dCB0aGF0IGlzIG5vIGxvbmdlciBuZWNlc3NhcnkuCi0gICAgICAgIC8vIFVzZXJzIGNhbiBub3cgYm9va21hcmsgcGFnZXMgd2l0aGluIGEgVGFwZXN0cnkgYXBwbGljYXRpb24uICBQYWdlcwotICAgICAgICAvLyBjYW4gaW1wbGVtZW50IHZhbGlkYXRlKCkgYW5kIHRocm93IGEgUGFnZVJlZGlyZWN0RXhjZXB0aW9uIGlmIHRoZXkgZG9uJ3QKLSAgICAgICAgLy8gd2FudCB0byBiZSBhY2Nlc3NlZCB0aGlzIHdheS4gIEZvciBleGFtcGxlLCBtb3N0IGFwcGxpY2F0aW9ucyBoYXZlIGEgY29uY2VwdAotICAgICAgICAvLyBvZiBhICJsb2dpbiIgYW5kIGhhdmUgYSBmZXcgcGFnZXMgdGhhdCBkb24ndCByZXF1aXJlIHRoZSB1c2VyIHRvIGJlIGxvZ2dlZCBpbiwKLSAgICAgICAgLy8gYW5kIG90aGVyIHBhZ2VzIHRoYXQgZG8uICBUaGUgcHJvdGVjdGVkIHBhZ2VzIHNob3VsZCByZWRpcmVjdCB0byBhIGxvZ2luIHBhZ2UuCi0KLSAgICAgICAgSVBhZ2UgcGFnZSA9IGN5Y2xlLmdldFBhZ2UocGFnZU5hbWUpOwotCi0gICAgICAgIGN5Y2xlLmFjdGl2YXRlKHBhZ2UpOwotCi0gICAgICAgIGVuZ2luZS5yZW5kZXJSZXNwb25zZShjeWNsZSwgb3V0cHV0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIFRhcGVzdHJ5LlBBR0VfU0VSVklDRTsKLSAgICB9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZW5naW5lL1JlcXVlc3RDeWNsZS5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2VuZ2luZS9SZXF1ZXN0Q3ljbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI1NzExMC4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZW5naW5lL1JlcXVlc3RDeWNsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzE4ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmVuZ2luZTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5idWlsZGVyLlRvU3RyaW5nQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LkFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JRW5naW5lOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUZvcm07Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JTWFya3VwV3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVBhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVxdWVzdEN5Y2xlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuUmVuZGVyUmV3b3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LlN0YWxlTGlua0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LlRhcGVzdHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuZXZlbnQuQ2hhbmdlT2JzZXJ2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5ldmVudC5PYnNlcnZlZENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkucmVxdWVzdC5SZXF1ZXN0Q29udGV4dDsKLQotLyoqCi0gKiAgUHJvdmlkZXMgdGhlIGxvZ2ljIGZvciBwcm9jZXNzaW5nIGEgc2luZ2xlIHJlcXVlc3QgY3ljbGUuICBQcm92aWRlcyBhY2Nlc3MgdG8KLSAqICB0aGUge0BsaW5rIElFbmdpbmUgZW5naW5lfSBhbmQgdGhlIHtAbGluayBSZXF1ZXN0Q29udGV4dH0uCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqIAotICoqLwotCi1wdWJsaWMgY2xhc3MgUmVxdWVzdEN5Y2xlIGltcGxlbWVudHMgSVJlcXVlc3RDeWNsZSwgQ2hhbmdlT2JzZXJ2ZXIKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgTE9HID0gTG9nRmFjdG9yeS5nZXRMb2coUmVxdWVzdEN5Y2xlLmNsYXNzKTsKLQotICAgIHByaXZhdGUgSVBhZ2UgX3BhZ2U7Ci0gICAgcHJpdmF0ZSBJRW5naW5lIF9lbmdpbmU7Ci0gICAgcHJpdmF0ZSBJRW5naW5lU2VydmljZSBfc2VydmljZTsKLQotICAgIHByaXZhdGUgUmVxdWVzdENvbnRleHQgX3JlcXVlc3RDb250ZXh0OwotCi0gICAgcHJpdmF0ZSBJTW9uaXRvciBfbW9uaXRvcjsKLQotICAgIHByaXZhdGUgSHR0cFNlcnZsZXRSZXNwb25zZSBfcmVzcG9uc2U7Ci0KLSAgICAvKioKLSAgICAgKiAgQSBtYXBwaW5nIG9mIHBhZ2VzIGxvYWRlZCBkdXJpbmcgdGhlIGN1cnJlbnQgcmVxdWVzdCBjeWNsZS4KLSAgICAgKiAgS2V5IGlzIHRoZSBwYWdlIG5hbWUsIHZhbHVlIGlzIHRoZSB7QGxpbmsgSVBhZ2V9IGluc3RhbmNlLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHJpdmF0ZSBNYXAgX2xvYWRlZFBhZ2VzOwotCi0gICAgLyoqCi0gICAgICogQSBtYXBwaW5nIG9mIHBhZ2UgcmVjb3JkZXJzIGZvciB0aGUgY3VycmVudCByZXF1ZXN0IGN5Y2xlLgotICAgICAqIEtleSBpcyB0aGUgcGFnZSBuYW1lLCB2YWx1ZSBpcyB0aGUge0BsaW5rIElQYWdlUmVjb3JkZXJ9IGluc3RhbmNlLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHJpdmF0ZSBNYXAgX2xvYWRlZFJlY29yZGVyczsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBfcmV3aW5kaW5nID0gZmFsc2U7Ci0KLSAgICBwcml2YXRlIE1hcCBfYXR0cmlidXRlczsKLQotICAgIHByaXZhdGUgaW50IF9hY3Rpb25JZDsKLSAgICBwcml2YXRlIGludCBfdGFyZ2V0QWN0aW9uSWQ7Ci0gICAgcHJpdmF0ZSBJQ29tcG9uZW50IF90YXJnZXRDb21wb25lbnQ7Ci0KLSAgICAvKiogQHNpbmNlIDIuMC4zICoqLwotCi0gICAgcHJpdmF0ZSBPYmplY3RbXSBfc2VydmljZVBhcmFtZXRlcnM7Ci0KLSAgICAvKioKLSAgICAgKiAgU3RhbmRhcmQgY29uc3RydWN0b3IgdXNlZCB0byByZW5kZXIgYSByZXNwb25zZSBwYWdlLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIFJlcXVlc3RDeWNsZSgKLSAgICAgICAgSUVuZ2luZSBlbmdpbmUsCi0gICAgICAgIFJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0LAotICAgICAgICBJRW5naW5lU2VydmljZSBzZXJ2aWNlLAotICAgICAgICBJTW9uaXRvciBtb25pdG9yKQotICAgIHsKLSAgICAgICAgX2VuZ2luZSA9IGVuZ2luZTsKLSAgICAgICAgX3JlcXVlc3RDb250ZXh0ID0gcmVxdWVzdENvbnRleHQ7Ci0gICAgICAgIF9zZXJ2aWNlID0gc2VydmljZTsKLSAgICAgICAgX21vbml0b3IgPSBtb25pdG9yOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBDYWxsZWQgYXQgdGhlIGVuZCBvZiB0aGUgcmVxdWVzdCBjeWNsZSAoaS5lLiwgYWZ0ZXIgYWxsIHJlc3BvbnNlcyBoYXZlIGJlZW4KLSAgICAgKiAgc2VudCBiYWNrIHRvIHRoZSBjbGllbnQpLCB0byByZWxlYXNlIGFsbCBwYWdlcyBsb2FkZWQgZHVyaW5nIHRoZSByZXF1ZXN0IGN5Y2xlLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgY2xlYW51cCgpCi0gICAgewotICAgICAgICBpZiAoX2xvYWRlZFBhZ2VzID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgSVBhZ2VTb3VyY2Ugc291cmNlID0gX2VuZ2luZS5nZXRQYWdlU291cmNlKCk7Ci0gICAgICAgIEl0ZXJhdG9yIGkgPSBfbG9hZGVkUGFnZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQotICAgICAgICB3aGlsZSAoaS5oYXNOZXh0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIElQYWdlIHBhZ2UgPSAoSVBhZ2UpIGkubmV4dCgpOwotCi0gICAgICAgICAgICBzb3VyY2UucmVsZWFzZVBhZ2UocGFnZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBfbG9hZGVkUGFnZXMgPSBudWxsOwotICAgICAgICBfbG9hZGVkUmVjb3JkZXJzID0gbnVsbDsKLQotICAgIH0KLQotICAgIHB1YmxpYyBJRW5naW5lU2VydmljZSBnZXRTZXJ2aWNlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfc2VydmljZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGVuY29kZVVSTChTdHJpbmcgVVJMKQotICAgIHsKLSAgICAgICAgaWYgKF9yZXNwb25zZSA9PSBudWxsKQotICAgICAgICAgICAgX3Jlc3BvbnNlID0gX3JlcXVlc3RDb250ZXh0LmdldFJlc3BvbnNlKCk7Ci0KLSAgICAgICAgcmV0dXJuIF9yZXNwb25zZS5lbmNvZGVVUkwoVVJMKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSUVuZ2luZSBnZXRFbmdpbmUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9lbmdpbmU7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpCi0gICAgewotICAgICAgICBpZiAoX2F0dHJpYnV0ZXMgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIHJldHVybiBfYXR0cmlidXRlcy5nZXQobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIElNb25pdG9yIGdldE1vbml0b3IoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9tb25pdG9yOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmV4dEFjdGlvbklkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBJbnRlZ2VyLnRvSGV4U3RyaW5nKCsrX2FjdGlvbklkKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSVBhZ2UgZ2V0UGFnZSgpCi0gICAgewotICAgICAgICByZXR1cm4gX3BhZ2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEdldHMgdGhlIHBhZ2UgZnJvbSB0aGUgZW5naW5lcydzIHtAbGluayBJUGFnZVNvdXJjZX0uCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgSVBhZ2UgZ2V0UGFnZShTdHJpbmcgbmFtZSkKLSAgICB7Ci0gICAgICAgIElQYWdlIHJlc3VsdCA9IG51bGw7Ci0KLSAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbihUYXBlc3RyeS5nZXRNZXNzYWdlKCJSZXF1ZXN0Q3ljbGUuaW52YWxpZC1udWxsLW5hbWUiKSk7Ci0KLSAgICAgICAgaWYgKF9sb2FkZWRQYWdlcyAhPSBudWxsKQotICAgICAgICAgICAgcmVzdWx0ID0gKElQYWdlKSBfbG9hZGVkUGFnZXMuZ2V0KG5hbWUpOwotCi0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgX21vbml0b3IucGFnZUxvYWRCZWdpbihuYW1lKTsKLQotICAgICAgICAgICAgSVBhZ2VTb3VyY2UgcGFnZVNvdXJjZSA9IF9lbmdpbmUuZ2V0UGFnZVNvdXJjZSgpOwotCi0gICAgICAgICAgICByZXN1bHQgPSBwYWdlU291cmNlLmdldFBhZ2UodGhpcywgbmFtZSwgX21vbml0b3IpOwotCi0gICAgICAgICAgICAvLyBHZXQgdGhlIHJlY29yZGVyIHRoYXQgd2lsbCBldmVudHVhbGx5IG9ic2VydmUgYW5kIHJlY29yZAotICAgICAgICAgICAgLy8gY2hhbmdlcyB0byBwZXJzaXN0ZW50IHByb3BlcnRpZXMgb2YgdGhlIHBhZ2UuICBJZiB0aGUgcGFnZQotICAgICAgICAgICAgLy8gaGFzIG5ldmVyIGVtaXR0ZWQgYW55IHBhZ2UgY2hhbmdlcywgdGhlbiBpdCB3aWxsCi0gICAgICAgICAgICAvLyBub3QgaGF2ZSBhIHJlY29yZGVyLgotCi0gICAgICAgICAgICBJUGFnZVJlY29yZGVyIHJlY29yZGVyID0gZ2V0UGFnZVJlY29yZGVyKG5hbWUpOwotCi0gICAgICAgICAgICBpZiAocmVjb3JkZXIgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBIYXZlIGl0IHJvbGxiYWNrIHRoZSBwYWdlIHRvIHRoZSBwcmlvciBzdGF0ZS4gIE5vdGUgdGhhdAotICAgICAgICAgICAgICAgIC8vIHRoZSBwYWdlIGhhcyBhIG51bGwgb2JzZXJ2ZXIgYXQgdGhpcyB0aW1lLgotCi0gICAgICAgICAgICAgICAgcmVjb3JkZXIucm9sbGJhY2socmVzdWx0KTsKLQotICAgICAgICAgICAgICAgIC8vIE5vdywgaGF2ZSB0aGUgcGFnZSB1c2UgdGhlIHJlY29yZGVyIGZvciBhbnkgZnV0dXJlCi0gICAgICAgICAgICAgICAgLy8gcHJvcGVydHkgY2hhbmdlcy4KLQotICAgICAgICAgICAgICAgIHJlc3VsdC5zZXRDaGFuZ2VPYnNlcnZlcihyZWNvcmRlcik7Ci0KLSAgICAgICAgICAgICAgICAvLyBBbmQsIGlmIHRoaXMgcmVjb3JkZXIgb2JzZXJ2ZWQgY2hhbmdlcyBpbiBhIHByaW9yIHJlcXVlc3QgY3ljbGUKLSAgICAgICAgICAgICAgICAvLyAoYW5kIHdhcyBsb2NrZWQgYWZ0ZXIgY29tbWl0dGluZyBpbiB0aGF0IGN5Y2xlKSwgaXQncyB0aW1lCi0gICAgICAgICAgICAgICAgLy8gdG8gdW5sb2NrLgotCi0gICAgICAgICAgICAgICAgcmVjb3JkZXIuc2V0TG9ja2VkKGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBObyBwYWdlIHJlY29yZGVyIGZvciB0aGUgcGFnZS4gIFdlJ2xsIG9ic2VydmUgaXRzCi0gICAgICAgICAgICAgICAgLy8gY2hhbmdlcyBhbmQgY3JlYXRlIHRoZSBwYWdlIHJlY29yZGVyIGR5bmFtaWNhbGx5Ci0gICAgICAgICAgICAgICAgLy8gaWYgaXQgZW1pdHMgYW55LgotCi0gICAgICAgICAgICAgICAgcmVzdWx0LnNldENoYW5nZU9ic2VydmVyKHRoaXMpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBfbW9uaXRvci5wYWdlTG9hZEVuZChuYW1lKTsKLQotICAgICAgICAgICAgaWYgKF9sb2FkZWRQYWdlcyA9PSBudWxsKQotICAgICAgICAgICAgICAgIF9sb2FkZWRQYWdlcyA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICAgICAgICAgIF9sb2FkZWRQYWdlcy5wdXQobmFtZSwgcmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgdGhlIHBhZ2UgcmVjb3JkZXIgZm9yIHRoZSBuYW1lZCBwYWdlLiAgVGhpcyBtYXkgY29tZQotICAgICAqICBmcm9tIHRoZSBjeWNsZSdzIGNhY2hlIG9mIHBhZ2UgcmVjb3JkZXJzIG9yLCBpZiBub3QgeWV0IGVuY291bnRlcmVkCi0gICAgICogIGluIHRoaXMgcmVxdWVzdCBjeWNsZSwgdGhlIHtAbGluayBJRW5naW5lI2dldFBhZ2VSZWNvcmRlcihTdHJpbmcsIElSZXF1ZXN0Q3ljbGUpfSBpcwotICAgICAqICBpbnZva2VkIHRvIGdldCB0aGUgcmVjb3JkZXIsIGlmIGl0IGV4aXN0cy4KLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwcm90ZWN0ZWQgSVBhZ2VSZWNvcmRlciBnZXRQYWdlUmVjb3JkZXIoU3RyaW5nIG5hbWUpCi0gICAgewotICAgICAgICBJUGFnZVJlY29yZGVyIHJlc3VsdCA9IG51bGw7Ci0KLSAgICAgICAgaWYgKF9sb2FkZWRSZWNvcmRlcnMgIT0gbnVsbCkKLSAgICAgICAgICAgIHJlc3VsdCA9IChJUGFnZVJlY29yZGVyKSBfbG9hZGVkUmVjb3JkZXJzLmdldChuYW1lKTsKLQotICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotCi0gICAgICAgIHJlc3VsdCA9IF9lbmdpbmUuZ2V0UGFnZVJlY29yZGVyKG5hbWUsIHRoaXMpOwotCi0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIGlmIChfbG9hZGVkUmVjb3JkZXJzID09IG51bGwpCi0gICAgICAgICAgICBfbG9hZGVkUmVjb3JkZXJzID0gbmV3IEhhc2hNYXAoKTsKLQotICAgICAgICBfbG9hZGVkUmVjb3JkZXJzLnB1dChuYW1lLCByZXN1bHQpOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqIAotICAgICAqIAotICAgICAqICBHZXRzIHRoZSBwYWdlIHJlY29yZGVyIGZyb20gdGhlIGxvYWRlZFJlY29yZGVycyBjYWNoZSwgb3IgZnJvbSB0aGUgZW5naW5lCi0gICAgICogIChwdXR0aW5nIGl0IGludG8gbG9hZGVkUmVjb3JkZXJzKS4gIElmIHRoZSByZWNvcmRlciBkb2VzIG5vdCB5ZXQgZXhpc3QsCi0gICAgICogIGl0IGlzIGNyZWF0ZWQuCi0gICAgICogCi0gICAgICogIEBzZWUgSUVuZ2luZSNjcmVhdGVQYWdlUmVjb3JkZXIoU3RyaW5nLCBJUmVxdWVzdEN5Y2xlKQotICAgICAqICBAc2luY2UgMi4wLjMKLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwcml2YXRlIElQYWdlUmVjb3JkZXIgY3JlYXRlUGFnZVJlY29yZGVyKFN0cmluZyBuYW1lKQotICAgIHsKLSAgICAgICAgSVBhZ2VSZWNvcmRlciByZXN1bHQgPSBnZXRQYWdlUmVjb3JkZXIobmFtZSk7Ci0KLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQgPSBfZW5naW5lLmNyZWF0ZVBhZ2VSZWNvcmRlcihuYW1lLCB0aGlzKTsKLQotICAgICAgICAgICAgaWYgKF9sb2FkZWRSZWNvcmRlcnMgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICBfbG9hZGVkUmVjb3JkZXJzID0gbmV3IEhhc2hNYXAoKTsKLQotICAgICAgICAgICAgX2xvYWRlZFJlY29yZGVycy5wdXQobmFtZSwgcmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIFJlcXVlc3RDb250ZXh0IGdldFJlcXVlc3RDb250ZXh0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfcmVxdWVzdENvbnRleHQ7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNSZXdpbmRpbmcoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9yZXdpbmRpbmc7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNSZXdvdW5kKElDb21wb25lbnQgY29tcG9uZW50KSB0aHJvd3MgU3RhbGVMaW5rRXhjZXB0aW9uCi0gICAgewotICAgICAgICAvLyBJZiBub3QgcmV3aW5kaW5nIC4uLgotCi0gICAgICAgIGlmICghX3Jld2luZGluZykKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBpZiAoX2FjdGlvbklkICE9IF90YXJnZXRBY3Rpb25JZCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICAvLyBPSywgd2UncmUgdGhlcmUsIGlzIHRoZSBwYWdlIGlzIGdvb2Qgb3JkZXI/Ci0KLSAgICAgICAgaWYgKGNvbXBvbmVudCA9PSBfdGFyZ2V0Q29tcG9uZW50KQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAgICAgLy8gV29vcHMuICBNaXNtYXRjaC4KLQotICAgICAgICB0aHJvdyBuZXcgU3RhbGVMaW5rRXhjZXB0aW9uKAotICAgICAgICAgICAgY29tcG9uZW50LAotICAgICAgICAgICAgSW50ZWdlci50b0hleFN0cmluZyhfdGFyZ2V0QWN0aW9uSWQpLAotICAgICAgICAgICAgX3RhcmdldENvbXBvbmVudC5nZXRFeHRlbmRlZElkKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUF0dHJpYnV0ZShTdHJpbmcgbmFtZSkKLSAgICB7Ci0gICAgICAgIGlmIChMT0cuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgICAgIExPRy5kZWJ1ZygiUmVtb3ZpbmcgYXR0cmlidXRlICIgKyBuYW1lKTsKLQotICAgICAgICBpZiAoX2F0dHJpYnV0ZXMgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBfYXR0cmlidXRlcy5yZW1vdmUobmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFJlbmRlcnMgdGhlIHBhZ2UgYnkgaW52b2tpbmcgCi0gICAgICoge0BsaW5rIElQYWdlI3JlbmRlclBhZ2UoSU1hcmt1cFdyaXRlciwgSVJlcXVlc3RDeWNsZSl9LiAgCi0gICAgICogIFRoaXMgY2xlYXJzIGFsbCBhdHRyaWJ1dGVzLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgcmVuZGVyUGFnZShJTWFya3VwV3JpdGVyIHdyaXRlcikKLSAgICB7Ci0gICAgICAgIFN0cmluZyBwYWdlTmFtZSA9IF9wYWdlLmdldFBhZ2VOYW1lKCk7Ci0gICAgICAgIF9tb25pdG9yLnBhZ2VSZW5kZXJCZWdpbihwYWdlTmFtZSk7Ci0KLSAgICAgICAgX3Jld2luZGluZyA9IGZhbHNlOwotICAgICAgICBfYWN0aW9uSWQgPSAtMTsKLSAgICAgICAgX3RhcmdldEFjdGlvbklkID0gMDsKLQotICAgICAgICAvLyBGb3JnZXQgYW55IGF0dHJpYnV0ZXMgZnJvbSBhIHByZXZpb3VzIHJlbmRlciBjeWNsZS4KLQotICAgICAgICBpZiAoX2F0dHJpYnV0ZXMgIT0gbnVsbCkKLSAgICAgICAgICAgIF9hdHRyaWJ1dGVzLmNsZWFyKCk7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIF9wYWdlLnJlbmRlclBhZ2Uod3JpdGVyLCB0aGlzKTsKLQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24gZXgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIE5vdGhpbmcgbXVjaCB0byBhZGQgaGVyZS4KLQotICAgICAgICAgICAgdGhyb3cgZXg7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSBleCkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gQnV0IHdyYXAgb3RoZXIgZXhjZXB0aW9ucyBpbiBhIFJlcXVlc3RDeWNsZUV4Y2VwdGlvbiAuLi4gdGhpcwotICAgICAgICAgICAgLy8gd2lsbCBlbnN1cmUgdGhhdCBzb21lIG9mIHRoZSBjb250ZXh0IGlzIGF2YWlsYWJsZS4KLQotICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbihleC5nZXRNZXNzYWdlKCksIF9wYWdlLCBudWxsLCBleCk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBfYWN0aW9uSWQgPSAwOwotICAgICAgICAgICAgX3RhcmdldEFjdGlvbklkID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIF9tb25pdG9yLnBhZ2VSZW5kZXJFbmQocGFnZU5hbWUpOwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFJld2luZHMgYW4gaW5kaXZpZHVhbCBmb3JtIGJ5IGludm9raW5nIAotICAgICAqICB7QGxpbmsgSUZvcm0jcmV3aW5kKElNYXJrdXBXcml0ZXIsIElSZXF1ZXN0Q3ljbGUpfS4KLSAgICAgKgotICAgICAqIDxwPlRoZSBwcm9jZXNzIGlzIGV4cGVjdGVkIHRvIGVuZCB3aXRoIGEge0BsaW5rIFJlbmRlclJld291bmRFeGNlcHRpb259LgotICAgICAqIElmIHRoZSBlbnRpcmUgcGFnZSBpcyByZW5kZXJyZWQgd2l0aG91dCB0aGlzIGV4Y2VwdGlvbiBiZWluZyB0aHJvd24sIGl0IG1lYW5zCi0gICAgICogdGhhdCB0aGUgdGFyZ2V0IGFjdGlvbiBpZCB3YXMgbm90IHZhbGlkLCBhbmQgYSAKLSAgICAgKiB7QGxpbmsgQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9ufQotICAgICAqIGlzIHRocm93bi4KLSAgICAgKgotICAgICAqIDxwPlRoaXMgY2xlYXJzIGFsbCBhdHRyaWJ1dGVzLgotICAgICAqCi0gICAgICogIEBzaW5jZSAxLjAuMgotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIHJld2luZEZvcm0oSUZvcm0gZm9ybSwgU3RyaW5nIHRhcmdldEFjdGlvbklkKQotICAgIHsKLSAgICAgICAgSVBhZ2UgcGFnZSA9IGZvcm0uZ2V0UGFnZSgpOwotICAgICAgICBTdHJpbmcgcGFnZU5hbWUgPSBwYWdlLmdldFBhZ2VOYW1lKCk7Ci0KLSAgICAgICAgX3Jld2luZGluZyA9IHRydWU7Ci0KLSAgICAgICAgX21vbml0b3IucGFnZVJld2luZEJlZ2luKHBhZ2VOYW1lKTsKLQotICAgICAgICBpZiAoX2F0dHJpYnV0ZXMgIT0gbnVsbCkKLSAgICAgICAgICAgIF9hdHRyaWJ1dGVzLmNsZWFyKCk7Ci0KLSAgICAgICAgLy8gRmFrZSB0aGluZ3MgYSBsaXR0bGUgZm9yIGdldE5leHRBY3Rpb25JZCgpIC8gaXNSZXdvdW5kKCkKLQotICAgICAgICBfdGFyZ2V0QWN0aW9uSWQgPSBJbnRlZ2VyLnBhcnNlSW50KHRhcmdldEFjdGlvbklkLCAxNik7Ci0gICAgICAgIF9hY3Rpb25JZCA9IF90YXJnZXRBY3Rpb25JZCAtIDE7Ci0KLSAgICAgICAgX3RhcmdldENvbXBvbmVudCA9IGZvcm07Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHBhZ2UuYmVnaW5QYWdlUmVuZGVyKCk7Ci0KLSAgICAgICAgICAgIGZvcm0ucmV3aW5kKE51bGxXcml0ZXIuZ2V0U2hhcmVkSW5zdGFuY2UoKSwgdGhpcyk7Ci0KLSAgICAgICAgICAgIC8vIFNob3VsZG4ndCBnZXQgdGhpcyBmYXIsIGJlY2F1c2UgdGhlIGZvcm0gc2hvdWxkCi0gICAgICAgICAgICAvLyB0aHJvdyB0aGUgUmVuZGVyUmV3b3VuZEV4Y2VwdGlvbi4KLQotICAgICAgICAgICAgdGhyb3cgbmV3IFN0YWxlTGlua0V4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICBUYXBlc3RyeS5mb3JtYXQoIlJlcXVlc3RDeWNsZS5mb3JtLXJld2luZC1mYWlsdXJlIiwgZm9ybS5nZXRFeHRlbmRlZElkKCkpLAotICAgICAgICAgICAgICAgIGZvcm0pOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChSZW5kZXJSZXdvdW5kRXhjZXB0aW9uIGV4KQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBUaGlzIGlzIGFjY2VwdGlibGUgYW5kIGV4cGVjdGVkLgotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24gZXgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIFJlcXVlc3RDeWNsZUV4Y2VwdGlvbnMgZG9uJ3QgbmVlZCB0byBiZSB3cmFwcGVkLgotICAgICAgICAgICAgdGhyb3cgZXg7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSBleCkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gQnV0IHdyYXAgb3RoZXIgZXhjZXB0aW9ucyBpbiBhIEFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbiAuLi4gdGhpcwotICAgICAgICAgICAgLy8gd2lsbCBlbnN1cmUgdGhhdCBzb21lIG9mIHRoZSBjb250ZXh0IGlzIGF2YWlsYWJsZS4KLQotICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbihleC5nZXRNZXNzYWdlKCksIHBhZ2UsIG51bGwsIGV4KTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIF9hY3Rpb25JZCA9IDA7Ci0gICAgICAgICAgICBfdGFyZ2V0QWN0aW9uSWQgPSAwOwotICAgICAgICAgICAgX3RhcmdldENvbXBvbmVudCA9IG51bGw7Ci0KLSAgICAgICAgICAgIHBhZ2UuZW5kUGFnZVJlbmRlcigpOwotCi0gICAgICAgICAgICBfbW9uaXRvci5wYWdlUmV3aW5kRW5kKHBhZ2VOYW1lKTsKLQotICAgICAgICAgICAgX3Jld2luZGluZyA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFJld2luZHMgdGhlIHBhZ2UgYnkgaW52b2tpbmcgCi0gICAgICogIHtAbGluayBJUGFnZSNyZW5kZXJQYWdlKElNYXJrdXBXcml0ZXIsIElSZXF1ZXN0Q3ljbGUpfS4KLSAgICAgKgotICAgICAqIDxwPlRoZSBwcm9jZXNzIGlzIGV4cGVjdGVkIHRvIGVuZCB3aXRoIGEge0BsaW5rIFJlbmRlclJld291bmRFeGNlcHRpb259LgotICAgICAqIElmIHRoZSBlbnRpcmUgcGFnZSBpcyByZW5kZXJyZWQgd2l0aG91dCB0aGlzIGV4Y2VwdGlvbiBiZWluZyB0aHJvd24sIGl0IG1lYW5zCi0gICAgICogdGhhdCB0aGUgdGFyZ2V0IGFjdGlvbiBpZCB3YXMgbm90IHZhbGlkLCBhbmQgYSAKLSAgICAgKiB7QGxpbmsgQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9ufQotICAgICAqIGlzIHRocm93bi4KLSAgICAgKgotICAgICAqIDxwPlRoaXMgY2xlYXJzIGFsbCBhdHRyaWJ1dGVzLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgcmV3aW5kUGFnZShTdHJpbmcgdGFyZ2V0QWN0aW9uSWQsIElDb21wb25lbnQgdGFyZ2V0Q29tcG9uZW50KQotICAgIHsKLSAgICAgICAgU3RyaW5nIHBhZ2VOYW1lID0gX3BhZ2UuZ2V0UGFnZU5hbWUoKTsKLQotICAgICAgICBfcmV3aW5kaW5nID0gdHJ1ZTsKLQotICAgICAgICBfbW9uaXRvci5wYWdlUmV3aW5kQmVnaW4ocGFnZU5hbWUpOwotCi0gICAgICAgIGlmIChfYXR0cmlidXRlcyAhPSBudWxsKQotICAgICAgICAgICAgX2F0dHJpYnV0ZXMuY2xlYXIoKTsKLQotICAgICAgICBfYWN0aW9uSWQgPSAtMTsKLQotICAgICAgICAvLyBQYXJzZSB0aGUgYWN0aW9uIElkIGFzIGhleCBzaW5jZSB0aGF0J3Mgd2hhdHMgZ2VuZXJhdGVkCi0gICAgICAgIC8vIGJ5IGdldE5leHRBY3Rpb25JZCgpCi0gICAgICAgIF90YXJnZXRBY3Rpb25JZCA9IEludGVnZXIucGFyc2VJbnQodGFyZ2V0QWN0aW9uSWQsIDE2KTsKLSAgICAgICAgX3RhcmdldENvbXBvbmVudCA9IHRhcmdldENvbXBvbmVudDsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgX3BhZ2UucmVuZGVyUGFnZShOdWxsV3JpdGVyLmdldFNoYXJlZEluc3RhbmNlKCksIHRoaXMpOwotCi0gICAgICAgICAgICAvLyBTaG91bGRuJ3QgZ2V0IHRoaXMgZmFyLCBiZWNhdXNlIHRoZSB0YXJnZXQgY29tcG9uZW50IHNob3VsZAotICAgICAgICAgICAgLy8gdGhyb3cgdGhlIFJlbmRlclJld291bmRFeGNlcHRpb24uCi0KLSAgICAgICAgICAgIHRocm93IG5ldyBTdGFsZUxpbmtFeGNlcHRpb24oX3BhZ2UsIHRhcmdldEFjdGlvbklkLCB0YXJnZXRDb21wb25lbnQuZ2V0RXh0ZW5kZWRJZCgpKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoUmVuZGVyUmV3b3VuZEV4Y2VwdGlvbiBleCkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gVGhpcyBpcyBhY2NlcHRpYmxlIGFuZCBleHBlY3RlZC4KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uIGV4KQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb25zIGRvbid0IG5lZWQgdG8gYmUgd3JhcHBlZC4KLSAgICAgICAgICAgIHRocm93IGV4OwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgZXgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIEJ1dCB3cmFwIG90aGVyIGV4Y2VwdGlvbnMgaW4gYSBSZXF1ZXN0Q3ljbGVFeGNlcHRpb24gLi4uIHRoaXMKLSAgICAgICAgICAgIC8vIHdpbGwgZW5zdXJlIHRoYXQgc29tZSBvZiB0aGUgY29udGV4dCBpcyBhdmFpbGFibGUuCi0KLSAgICAgICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24oZXguZ2V0TWVzc2FnZSgpLCBfcGFnZSwgbnVsbCwgZXgpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotCi0gICAgICAgICAgICBfYWN0aW9uSWQgPSAwOwotICAgICAgICAgICAgX3RhcmdldEFjdGlvbklkID0gMDsKLSAgICAgICAgICAgIF90YXJnZXRDb21wb25lbnQgPSBudWxsOwotCi0gICAgICAgICAgICBfbW9uaXRvci5wYWdlUmV3aW5kRW5kKHBhZ2VOYW1lKTsKLQotICAgICAgICAgICAgX3Jld2luZGluZyA9IGZhbHNlOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIGlmIChMT0cuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgICAgIExPRy5kZWJ1ZygiU2V0IGF0dHJpYnV0ZSAiICsgbmFtZSArICIgdG8gIiArIHZhbHVlKTsKLQotICAgICAgICBpZiAoX2F0dHJpYnV0ZXMgPT0gbnVsbCkKLSAgICAgICAgICAgIF9hdHRyaWJ1dGVzID0gbmV3IEhhc2hNYXAoKTsKLQotICAgICAgICBfYXR0cmlidXRlcy5wdXQobmFtZSwgdmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBhZ2UoSVBhZ2UgdmFsdWUpCi0gICAgewotICAgICAgICBpZiAoTE9HLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgICAgICBMT0cuZGVidWcoIlNldCBwYWdlIHRvICIgKyB2YWx1ZSk7Ci0KLSAgICAgICAgX3BhZ2UgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYWdlKFN0cmluZyBuYW1lKQotICAgIHsKLSAgICAgICAgaWYgKExPRy5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICAgICAgTE9HLmRlYnVnKCJTZXQgcGFnZSB0byAiICsgbmFtZSk7Ci0KLSAgICAgICAgX3BhZ2UgPSBnZXRQYWdlKG5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBJbnZva2VzIHtAbGluayBJUGFnZVJlY29yZGVyI2NvbW1pdCgpfSBvbiBlYWNoIHBhZ2UgcmVjb3JkZXIgbG9hZGVkCi0gICAgICogIGR1cmluZyB0aGUgcmVxdWVzdCBjeWNsZSAoZXZlbiByZWNvcmRlcnMgbWFya2VkIGZvciBkaXNjYXJkKS4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIGNvbW1pdFBhZ2VDaGFuZ2VzKCkKLSAgICB7Ci0gICAgICAgIGlmIChMT0cuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgICAgIExPRy5kZWJ1ZygiQ29tbWl0dGluZyBwYWdlIGNoYW5nZXMiKTsKLQotICAgICAgICBpZiAoX2xvYWRlZFJlY29yZGVycyA9PSBudWxsIHx8IF9sb2FkZWRSZWNvcmRlcnMuaXNFbXB0eSgpKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIEl0ZXJhdG9yIGkgPSBfbG9hZGVkUmVjb3JkZXJzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0KLSAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBJUGFnZVJlY29yZGVyIHJlY29yZGVyID0gKElQYWdlUmVjb3JkZXIpIGkubmV4dCgpOwotCi0gICAgICAgICAgICByZWNvcmRlci5jb21taXQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqICBGb3IgcGFnZXMgd2l0aG91dCBhIHtAbGluayBJUGFnZVJlY29yZGVyIHBhZ2UgcmVjb3JkZXJ9LCAKLSAgICAgKiAgd2UncmUgdGhlIHtAbGluayBDaGFuZ2VPYnNlcnZlciBjaGFuZ2Ugb2JzZXJ2ZXJ9LgotICAgICAqICBJZiBzdWNoIGEgcGFnZSBhY3R1YWxseSBlbWl0cyBhIGNoYW5nZSwgdGhlbgotICAgICAqICB3ZSdsbCBvYnRhaW4gYSBuZXcgcGFnZSByZWNvcmRlciBmcm9tIHRoZQotICAgICAqICB7QGxpbmsgSUVuZ2luZSBlbmdpbmV9LCBzZXQgdGhlIHJlY29yZGVyCi0gICAgICogIGFzIHRoZSBwYWdlJ3MgY2hhbmdlIG9ic2VydmVyLCBhbmQgZm9yd2FyZCB0aGUgZXZlbnQKLSAgICAgKiAgdG8gdGhlIG5ld2x5IGNyZWF0ZWQgcmVjb3JkZXIuICBJbiBhZGRpdGlvbiwgdGhlCi0gICAgICogIG5ldyBwYWdlIHJlY29yZGVyIGlzIHJlbWVtYmVyZWQgc28gdGhhdCBpdCB3aWxsCi0gICAgICogIGJlIGNvbW1pdHRlZCBieSB7QGxpbmsgI2NvbW1pdFBhZ2VDaGFuZ2VzKCl9LgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgb2JzZXJ2ZUNoYW5nZShPYnNlcnZlZENoYW5nZUV2ZW50IGV2ZW50KQotICAgIHsKLSAgICAgICAgSVBhZ2UgcGFnZSA9IGV2ZW50LmdldENvbXBvbmVudCgpLmdldFBhZ2UoKTsKLSAgICAgICAgU3RyaW5nIHBhZ2VOYW1lID0gcGFnZS5nZXRQYWdlTmFtZSgpOwotCi0gICAgICAgIGlmIChMT0cuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgICAgIExPRy5kZWJ1ZygiT2JzZXJ2ZWQgY2hhbmdlIGluIHBhZ2UgIiArIHBhZ2VOYW1lICsgIjsgY3JlYXRpbmcgcGFnZSByZWNvcmRlci4iKTsKLQotICAgICAgICBJUGFnZVJlY29yZGVyIHJlY29yZGVyID0gY3JlYXRlUGFnZVJlY29yZGVyKHBhZ2VOYW1lKTsKLQotICAgICAgICBwYWdlLnNldENoYW5nZU9ic2VydmVyKHJlY29yZGVyKTsKLQotICAgICAgICByZWNvcmRlci5vYnNlcnZlQ2hhbmdlKGV2ZW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgRmluZHMgdGhlIHBhZ2UgYW5kIGl0cyBwYWdlIHJlY29yZGVyLCBjcmVhdGluZyB0aGUgcGFnZSByZWNvcmRlciBpZiBuZWNlc3NhcnkuCi0gICAgICogIFRoZSBwYWdlIHJlY29yZGVyIGlzIG1hcmtlZCBmb3IgZGlzY2FyZCByZWdhcmRsZXNzIG9mIGl0cyBjdXJyZW50IHN0YXRlLgotICAgICAqIAotICAgICAqICA8cD5UaGlzIG1heSBtYWtlIHRoZSBhcHBsaWNhdGlvbiBzdGF0ZWZ1bCBldmVuIGlmIHRoZSBwYWdlIHJlY29yZGVyIGRvZXMKLSAgICAgKiAgbm90IHlldCBleGlzdC4KLSAgICAgKiAKLSAgICAgKiAgPHA+VGhlIHBhZ2UgcmVjb3JkZXIgd2lsbCBiZSBkaXNjYXJkZWQgYXQgdGhlIGVuZCBvZiB0aGUgY3VycmVudCByZXF1ZXN0IGN5Y2xlLgotICAgICAqIAotICAgICAqICBAc2luY2UgMi4wLjIKLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCBkaXNjYXJkUGFnZShTdHJpbmcgbmFtZSkKLSAgICB7Ci0gICAgICAgIGlmIChMT0cuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgICAgIExPRy5kZWJ1ZygiRGlzY2FyZGluZyBwYWdlICIgKyBuYW1lKTsKLQotICAgICAgICBJUGFnZVJlY29yZGVyIHJlY29yZGVyID0gX2VuZ2luZS5nZXRQYWdlUmVjb3JkZXIobmFtZSwgdGhpcyk7Ci0KLSAgICAgICAgaWYgKHJlY29yZGVyID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9wYWdlID0gZ2V0UGFnZShuYW1lKTsKLQotICAgICAgICAgICAgcmVjb3JkZXIgPSBjcmVhdGVQYWdlUmVjb3JkZXIobmFtZSk7Ci0KLSAgICAgICAgICAgIF9wYWdlLnNldENoYW5nZU9ic2VydmVyKHJlY29yZGVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJlY29yZGVyLm1hcmtGb3JEaXNjYXJkKCk7Ci0gICAgfQotCi0gICAgLyoqIEBzaW5jZSAyLjAuMyAqKi8KLQotICAgIHB1YmxpYyBPYmplY3RbXSBnZXRTZXJ2aWNlUGFyYW1ldGVycygpCi0gICAgewotICAgICAgICByZXR1cm4gX3NlcnZpY2VQYXJhbWV0ZXJzOwotICAgIH0KLQotICAgIC8qKiBAc2luY2UgMi4wLjMgKiovCi0KLSAgICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlUGFyYW1ldGVycyhPYmplY3RbXSBzZXJ2aWNlUGFyYW1ldGVycykKLSAgICB7Ci0gICAgICAgIF9zZXJ2aWNlUGFyYW1ldGVycyA9IHNlcnZpY2VQYXJhbWV0ZXJzOwotICAgIH0KLQotICAgIC8qKiBAc2luY2UgMy4wICoqLwotCi0gICAgcHVibGljIHZvaWQgYWN0aXZhdGUoU3RyaW5nIG5hbWUpCi0gICAgewotICAgICAgICBJUGFnZSBwYWdlID0gZ2V0UGFnZShuYW1lKTsKLQotICAgICAgICBhY3RpdmF0ZShwYWdlKTsKLSAgICB9Ci0KLSAgICAvKiogQHNpbmNlIDMuMCAqLwotCi0gICAgcHVibGljIHZvaWQgYWN0aXZhdGUoSVBhZ2UgcGFnZSkKLSAgICB7Ci0gICAgICAgIGlmIChMT0cuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgICAgIExPRy5kZWJ1ZygiQWN0aXZhdGluZyBwYWdlICIgKyBwYWdlKTsKLQotICAgICAgICBUYXBlc3RyeS5jbGVhck1ldGhvZEludm9jYXRpb25zKCk7Ci0KLSAgICAgICAgcGFnZS52YWxpZGF0ZSh0aGlzKTsKLQotICAgICAgICBUYXBlc3RyeS5jaGVja01ldGhvZEludm9jYXRpb24oCi0gICAgICAgICAgICBUYXBlc3RyeS5BQlNUUkFDVFBBR0VfVkFMSURBVEVfTUVUSE9EX0lELAotICAgICAgICAgICAgInZhbGlkYXRlKCkiLAotICAgICAgICAgICAgcGFnZSk7Ci0KLSAgICAgICAgc2V0UGFnZShwYWdlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2luY2UgMy4wCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gICAgewotICAgICAgICBUb1N0cmluZ0J1aWxkZXIgYiA9IG5ldyBUb1N0cmluZ0J1aWxkZXIodGhpcyk7Ci0KLSAgICAgICAgYi5hcHBlbmQoInJld2luZGluZyIsIF9yZXdpbmRpbmcpOwotCi0gICAgICAgIGlmIChfc2VydmljZSAhPSBudWxsKQotICAgICAgICAgICAgYi5hcHBlbmQoInNlcnZpY2UiLCBfc2VydmljZS5nZXROYW1lKCkpOwotCi0gICAgICAgIGIuYXBwZW5kKCJzZXJ2aWNlUGFyYW1ldGVycyIsIF9zZXJ2aWNlUGFyYW1ldGVycyk7Ci0KLSAgICAgICAgaWYgKF9sb2FkZWRQYWdlcyAhPSBudWxsKQotICAgICAgICAgICAgYi5hcHBlbmQoImxvYWRlZFBhZ2VzIiwgX2xvYWRlZFBhZ2VzLmtleVNldCgpKTsKLQotICAgICAgICBiLmFwcGVuZCgiYXR0cmlidXRlcyIsIF9hdHRyaWJ1dGVzKTsKLSAgICAgICAgYi5hcHBlbmQoInRhcmdldEFjdGlvbklkIiwgX3RhcmdldEFjdGlvbklkKTsKLSAgICAgICAgYi5hcHBlbmQoInRhcmdldENvbXBvbmVudCIsIF90YXJnZXRDb21wb25lbnQpOwotCi0gICAgICAgIHJldHVybiBiLnRvU3RyaW5nKCk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9lbmdpbmUvUmVzZXRTZXJ2aWNlLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZW5naW5lL1Jlc2V0U2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzZlOTU1Li4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9lbmdpbmUvUmVzZXRTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5lbmdpbmU7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5BcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JQ29tcG9uZW50OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVBhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVxdWVzdEN5Y2xlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuVGFwZXN0cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5yZXF1ZXN0LlJlc3BvbnNlT3V0cHV0U3RyZWFtOwotCi0vKioKLSAqICBTZXJ2aWNlTGluayB1c2VkIHRvIGRpc2NhcmQgYWxsIGNhY2hlZCBkYXRhICh0ZW1wbGF0ZXMsIHNwZWNpZmljYXRpb25zLCBldCBjZXRlcmEpLgotICogIFRoaXMgaXMgcHJpbWFyaWx5IHVzZWQgZHVyaW5nIGRldmVsb3BtZW50LiAgSXQgY291bGQgYmUgYSB3ZWFrbmVzcyBvZiBhIFRhcGVzdHJ5Ci0gKiAgYXBwbGljYXRpb24sIG1ha2luZyBpdCBzdXNjZXB0aWJsZSB0byBkZW5pYWwgb2Ygc2VydmljZSBhdHRhY2tzLCB3aGljaCBpcyB3aHkKLSAqICBpdCBpcyBkaXNhYmxlZCBieSBkZWZhdWx0LiAgVGhlIGxpbmsgZ2VuZXJhdGVkIGJ5IHRoZSBSZXNldFNlcnZpY2UgcmVkaXNwbGF5cyB0aGUKLSAqICBjdXJyZW50IHBhZ2UgYWZ0ZXIgZGlzY2FyZGluZyBhbGwgZGF0YS4KLSAqCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogIEB2ZXJzaW9uICRJZCQKLSAqICBAc2luY2UgMS4wLjkKLSAqICBAc2VlIG9yZy5hcGFjaGUudGFwZXN0cnkuSUVuZ2luZSNpc1Jlc2V0U2VydmljZUVuYWJsZWQoKQotICogCi0gKiovCi0KLXB1YmxpYyBjbGFzcyBSZXNldFNlcnZpY2UgZXh0ZW5kcyBBYnN0cmFjdFNlcnZpY2UKLXsKLQotICAgIHB1YmxpYyBJTGluayBnZXRMaW5rKElSZXF1ZXN0Q3ljbGUgY3ljbGUsIElDb21wb25lbnQgY29tcG9uZW50LCBPYmplY3RbXSBwYXJhbWV0ZXJzKQotICAgIHsKLSAgICAgICAgaWYgKFRhcGVzdHJ5LnNpemUocGFyYW1ldGVycykgIT0gMCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgVGFwZXN0cnkuZm9ybWF0KCJzZXJ2aWNlLW5vLXBhcmFtZXRlcnMiLCBUYXBlc3RyeS5SRVNFVF9TRVJWSUNFKSk7Ci0KLSAgICAgICAgU3RyaW5nW10gY29udGV4dCA9IG5ldyBTdHJpbmdbMV07Ci0gICAgICAgIGNvbnRleHRbMF0gPSBjb21wb25lbnQuZ2V0UGFnZSgpLmdldFBhZ2VOYW1lKCk7Ci0KLSAgICAgICAgcmV0dXJuIGNvbnN0cnVjdExpbmsoY3ljbGUsIFRhcGVzdHJ5LlJFU0VUX1NFUlZJQ0UsIGNvbnRleHQsIG51bGwsIHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0gICAgewotICAgICAgICByZXR1cm4gVGFwZXN0cnkuUkVTRVRfU0VSVklDRTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXJ2aWNlKAotICAgICAgICBJRW5naW5lU2VydmljZVZpZXcgZW5naW5lLAotICAgICAgICBJUmVxdWVzdEN5Y2xlIGN5Y2xlLAotICAgICAgICBSZXNwb25zZU91dHB1dFN0cmVhbSBvdXRwdXQpCi0gICAgICAgIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgU3RyaW5nW10gY29udGV4dCA9IGdldFNlcnZpY2VDb250ZXh0KGN5Y2xlLmdldFJlcXVlc3RDb250ZXh0KCkpOwotCi0gICAgICAgIGlmIChUYXBlc3RyeS5zaXplKGNvbnRleHQpICE9IDEpCi0gICAgICAgICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIFRhcGVzdHJ5LmZvcm1hdCgic2VydmljZS1zaW5nbGUtcGFyYW1ldGVyIiwgVGFwZXN0cnkuUkVTRVRfU0VSVklDRSkpOwotCi0gICAgICAgIFN0cmluZyBwYWdlTmFtZSA9IGNvbnRleHRbMF07Ci0KLSAgICAgICAgaWYgKGVuZ2luZS5pc1Jlc2V0U2VydmljZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIGVuZ2luZS5jbGVhckNhY2hlZERhdGEoKTsKLQotICAgICAgICBJUGFnZSBwYWdlID0gY3ljbGUuZ2V0UGFnZShwYWdlTmFtZSk7Ci0KLSAgICAgICAgY3ljbGUuYWN0aXZhdGUocGFnZSk7Ci0KLSAgICAgICAgLy8gUmVuZGVyIHRoZSBzYW1lIHBhZ2UgKHRoYXQgY29udGFpbmVkIHRoZSByZXNldCBsaW5rKS4KLQotICAgICAgICBlbmdpbmUucmVuZGVyUmVzcG9uc2UoY3ljbGUsIG91dHB1dCk7Ci0gICAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2VuZ2luZS9SZXN0YXJ0U2VydmljZS5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2VuZ2luZS9SZXN0YXJ0U2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGI2NGJjLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9lbmdpbmUvUmVzdGFydFNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmVuZ2luZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVxdWVzdEN5Y2xlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuVGFwZXN0cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5yZXF1ZXN0LlJlc3BvbnNlT3V0cHV0U3RyZWFtOwotCi0vKioKLSAqICBSZXN0YXJ0cyB0aGUgVGFwZXN0cnkgYXBwbGljYXRpb24uICBUaGlzIGlzIG5vcm1hbGx5IHJlc2VydmVkIGZvciBkZWFsaW5nIHdpdGgKLSAqICBjYXRhc3Ryb3BoaWMgZmFpbHVyZXMgb2YgdGhlIGFwcGxpY2F0aW9uLiAgRGlzY2FyZHMgdGhlIHtAbGluayBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb259LCBpZiBhbnksCi0gKiAgYW5kIHJlZGlyZWN0cyB0byB0aGUgVGFwZXN0cnkgYXBwbGljYXRpb24gc2VydmxldCBVUkwgKGludm9raW5nIHRoZSB7QGxpbmsgSG9tZVNlcnZpY2V9KS4KLSAqCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogIEB2ZXJzaW9uICRJZCQKLSAqICBAc2luY2UgMS4wLjkKLSAqCi0gKiovCi0KLXB1YmxpYyBjbGFzcyBSZXN0YXJ0U2VydmljZSBleHRlbmRzIEFic3RyYWN0U2VydmljZQotewotCi0gICAgcHVibGljIElMaW5rIGdldExpbmsoSVJlcXVlc3RDeWNsZSBjeWNsZSwgSUNvbXBvbmVudCBjb21wb25lbnQsIE9iamVjdFtdIHBhcmFtZXRlcnMpCi0gICAgewotICAgICAgICBpZiAoVGFwZXN0cnkuc2l6ZShwYXJhbWV0ZXJzKSAhPSAwKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICBUYXBlc3RyeS5mb3JtYXQoInNlcnZpY2Utbm8tcGFyYW1ldGVycyIsIFRhcGVzdHJ5LlJFU1RBUlRfU0VSVklDRSkpOwotCi0gICAgICAgIHJldHVybiBjb25zdHJ1Y3RMaW5rKGN5Y2xlLCBUYXBlc3RyeS5SRVNUQVJUX1NFUlZJQ0UsIG51bGwsIG51bGwsIHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNlcnZpY2UoCi0gICAgICAgIElFbmdpbmVTZXJ2aWNlVmlldyBlbmdpbmUsCi0gICAgICAgIElSZXF1ZXN0Q3ljbGUgY3ljbGUsCi0gICAgICAgIFJlc3BvbnNlT3V0cHV0U3RyZWFtIG91dHB1dCkKLSAgICAgICAgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBlbmdpbmUucmVzdGFydChjeWNsZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBUYXBlc3RyeS5SRVNUQVJUX1NFUlZJQ0U7Ci0gICAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2VuZ2luZS9UYWdTdXBwb3J0U2VydmljZS5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2VuZ2luZS9UYWdTdXBwb3J0U2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWFlZGQzLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9lbmdpbmUvVGFnU3VwcG9ydFNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5lbmdpbmU7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotCi1pbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7Ci1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LkFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JTWFya3VwV3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlcXVlc3RDeWNsZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LlRhcGVzdHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuaHRtbC5IVE1MV3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkucmVxdWVzdC5SZXF1ZXN0Q29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnJlcXVlc3QuUmVzcG9uc2VPdXRwdXRTdHJlYW07Ci0KLS8qKgotICogIEEgdmVyeSBzcGVjaWFsaXplZCBzZXJ2aWNlIHVzZWQgYnkgSlNQcyB0byBhY2Nlc3MgVGFwZXN0cnkgVVJMcy4gCi0gKiAgVGhpcyBpcyB1c2VkIGJ5IHRoZSBUYXBlc3RyeSBKU1AgdGFncywgc3VjaCBhcwotICogIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LmpzcC5QYWdlVGFnfS4KLSAqCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogIEB2ZXJzaW9uICRJZCQKLSAqICBAc2luY2UgMy4wCi0gKiAgQHNlZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmpzcC5VUkxSZXRyaWV2ZXIKLSAqIAotICoqLwotCi1wdWJsaWMgY2xhc3MgVGFnU3VwcG9ydFNlcnZpY2UgaW1wbGVtZW50cyBJRW5naW5lU2VydmljZQotewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBMT0cgPSBMb2dGYWN0b3J5LmdldExvZyhUYWdTdXBwb3J0U2VydmljZS5jbGFzcyk7Ci0KLSAgICAvKioKLSAgICAgKiAgTm90IHRvIGJlIGludm9rZWQ7IHRoaXMgc2VydmljZSBpcyBkaWZmZXJlbnQgdGhhbiB0aGUgb3RoZXJzLgotICAgICAqIAotICAgICAqICBAdGhyb3dzIEFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbiBhbHdheXMKLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgSUxpbmsgZ2V0TGluayhJUmVxdWVzdEN5Y2xlIGN5Y2xlLCBJQ29tcG9uZW50IGNvbXBvbmVudCwgT2JqZWN0W10gcGFyYW1ldGVycykKLSAgICB7Ci0gICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICBUYXBlc3RyeS5nZXRNZXNzYWdlKCJUYWdTdXBwb3J0U2VydmljZS5zZXJ2aWNlLW9ubHkiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2VydmljZSgKLSAgICAgICAgSUVuZ2luZVNlcnZpY2VWaWV3IGVuZ2luZSwKLSAgICAgICAgSVJlcXVlc3RDeWNsZSBjeWNsZSwKLSAgICAgICAgUmVzcG9uc2VPdXRwdXRTdHJlYW0gb3V0cHV0KQotICAgICAgICB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFJlcXVlc3RDb250ZXh0IGNvbnRleHQgPSBjeWNsZS5nZXRSZXF1ZXN0Q29udGV4dCgpOwotICAgICAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCA9IGNvbnRleHQuZ2V0UmVxdWVzdCgpOwotCi0gICAgICAgIFN0cmluZyBzZXJ2aWNlTmFtZSA9IGdldEF0dHJpYnV0ZShyZXF1ZXN0LCBUYXBlc3RyeS5UQUdfU1VQUE9SVF9TRVJWSUNFX0FUVFJJQlVURSk7Ci0KLSAgICAgICAgT2JqZWN0IHJhdyA9IHJlcXVlc3QuZ2V0QXR0cmlidXRlKFRhcGVzdHJ5LlRBR19TVVBQT1JUX1BBUkFNRVRFUlNfQVRUUklCVVRFKTsKLSAgICAgICAgT2JqZWN0W10gcGFyYW1ldGVycyA9IG51bGw7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHBhcmFtZXRlcnMgPSAoT2JqZWN0W10pIHJhdzsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGV4KQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICBUYXBlc3RyeS5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICJUYWdTdXBwb3J0U2VydmljZS5hdHRyaWJ1dGUtbm90LWFycmF5IiwKLSAgICAgICAgICAgICAgICAgICAgVGFwZXN0cnkuVEFHX1NVUFBPUlRfUEFSQU1FVEVSU19BVFRSSUJVVEUsCi0gICAgICAgICAgICAgICAgICAgIFRhcGVzdHJ5LmdldENsYXNzTmFtZShyYXcuZ2V0Q2xhc3MoKSkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIElFbmdpbmVTZXJ2aWNlIHNlcnZpY2UgPSBjeWNsZS5nZXRFbmdpbmUoKS5nZXRTZXJ2aWNlKHNlcnZpY2VOYW1lKTsKLQotICAgICAgICBJTGluayBsaW5rID0gc2VydmljZS5nZXRMaW5rKGN5Y2xlLCBudWxsLCBwYXJhbWV0ZXJzKTsKLQotICAgICAgICBTdHJpbmcgVVJJID0gbGluay5nZXRVUkwoKTsKLQotICAgICAgICBpZiAoTE9HLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgCUxPRy5kZWJ1ZygiUmVxdWVzdCBzZXJ2bGV0IHBhdGggPSAiICsgcmVxdWVzdC5nZXRTZXJ2bGV0UGF0aCgpKTsKLSAgICAgICAgCQotICAgICAgICAgICAgRW51bWVyYXRpb24gZSA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyTmFtZXMoKTsKLSAgICAgICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZykgZS5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgICAgIExPRy5kZWJ1ZygiUmVxdWVzdCBwYXJhbWV0ZXIgIiArIG5hbWUgKyAiID0gIiArIHJlcXVlc3QuZ2V0UGFyYW1ldGVyKG5hbWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGUgPSByZXF1ZXN0LmdldEF0dHJpYnV0ZU5hbWVzKCk7Ci0gICAgICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpIGUubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICBMT0cuZGVidWcoIlJlcXVlc3QgYXR0cmlidXRlICIgKyBuYW1lICsgIiA9ICIgKyByZXF1ZXN0LmdldEF0dHJpYnV0ZShuYW1lKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIExPRy5kZWJ1ZygiUmVzdWx0IFVSSTogIiArIFVSSSk7Ci0gICAgICAgIH0KLQotICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlID0gY29udGV4dC5nZXRSZXNwb25zZSgpOwotICAgICAgICBQcmludFdyaXRlciBzZXJ2bGV0V3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7Ci0KLSAgICAgICAgSU1hcmt1cFdyaXRlciB3cml0ZXIgPSBuZXcgSFRNTFdyaXRlcihzZXJ2bGV0V3JpdGVyKTsKLQotICAgICAgICB3cml0ZXIucHJpbnQoVVJJKTsKLQotICAgICAgICB3cml0ZXIuZmx1c2goKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRBdHRyaWJ1dGUoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIFN0cmluZyBuYW1lKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgT2JqZWN0IHJlc3VsdCA9IHJlcXVlc3QuZ2V0QXR0cmlidXRlKG5hbWUpOwotCi0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uKFRhcGVzdHJ5LmZvcm1hdCgiVGFnU3VwcG9ydFNlcnZpY2UubnVsbC1hdHRyaWJ1dGUiLCBuYW1lKSk7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAoU3RyaW5nKSByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBleCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgVGFwZXN0cnkuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAiVGFnU3VwcG9ydFNlcnZpY2UuYXR0cmlidXRlLW5vdC1zdHJpbmciLAotICAgICAgICAgICAgICAgICAgICBuYW1lLAotICAgICAgICAgICAgICAgICAgICBUYXBlc3RyeS5nZXRDbGFzc05hbWUocmVzdWx0LmdldENsYXNzKCkpKSk7Ci0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqICBAcmV0dXJuIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LlRhcGVzdHJ5I1RBR1NVUFBPUlRfU0VSVklDRX0uCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBUYXBlc3RyeS5UQUdTVVBQT1JUX1NFUlZJQ0U7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZW5naW5lL1RlbXBsYXRlUGFyc2VyRGVsZWdhdGVJbXBsLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZW5naW5lL1RlbXBsYXRlUGFyc2VyRGVsZWdhdGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1Y2JlMWYuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2VuZ2luZS9UZW1wbGF0ZVBhcnNlckRlbGVnYXRlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuZW5naW5lOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JQ29tcG9uZW50OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUxvY2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZXF1ZXN0Q3ljbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5UYXBlc3RyeTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnBhcnNlLklUZW1wbGF0ZVBhcnNlckRlbGVnYXRlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkucmVzb2x2ZXIuQ29tcG9uZW50U3BlY2lmaWNhdGlvblJlc29sdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuc3BlYy5JQ29tcG9uZW50U3BlY2lmaWNhdGlvbjsKLQotLyoqCi0gKiBCYXNpYyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkucGFyc2UuSVRlbXBsYXRlUGFyc2VyRGVsZWdhdGV9IGludGVyZmFjZS4KLSAqCi0gKiBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKi8KLXB1YmxpYyBjbGFzcyBUZW1wbGF0ZVBhcnNlckRlbGVnYXRlSW1wbCBpbXBsZW1lbnRzIElUZW1wbGF0ZVBhcnNlckRlbGVnYXRlCi17Ci0gICAgcHJpdmF0ZSBJQ29tcG9uZW50IF9jb21wb25lbnQ7Ci0gICAgcHJpdmF0ZSBDb21wb25lbnRTcGVjaWZpY2F0aW9uUmVzb2x2ZXIgX3Jlc29sdmVyOwotICAgIHByaXZhdGUgSVJlcXVlc3RDeWNsZSBfY3ljbGU7Ci0KLSAgICBwdWJsaWMgVGVtcGxhdGVQYXJzZXJEZWxlZ2F0ZUltcGwoSUNvbXBvbmVudCBjb21wb25lbnQsIElSZXF1ZXN0Q3ljbGUgY3ljbGUpCi0gICAgewotICAgICAgICBfY29tcG9uZW50ID0gY29tcG9uZW50OwotICAgICAgICBfcmVzb2x2ZXIgPSBuZXcgQ29tcG9uZW50U3BlY2lmaWNhdGlvblJlc29sdmVyKGN5Y2xlKTsKLSAgICAgICAgX2N5Y2xlID0gY3ljbGU7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0S25vd25Db21wb25lbnQoU3RyaW5nIGNvbXBvbmVudElkKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9jb21wb25lbnQuZ2V0U3BlY2lmaWNhdGlvbigpLmdldENvbXBvbmVudChjb21wb25lbnRJZCkgIT0gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRBbGxvd0JvZHkoU3RyaW5nIGNvbXBvbmVudElkLCBJTG9jYXRpb24gbG9jYXRpb24pCi0gICAgewotICAgICAgICBJQ29tcG9uZW50IGVtYmVkZGVkID0gX2NvbXBvbmVudC5nZXRDb21wb25lbnQoY29tcG9uZW50SWQpOwotCi0gICAgICAgIGlmIChlbWJlZGRlZCA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgVGFwZXN0cnkuY3JlYXRlTm9TdWNoQ29tcG9uZW50RXhjZXB0aW9uKF9jb21wb25lbnQsIGNvbXBvbmVudElkLCBsb2NhdGlvbik7Ci0KLSAgICAgICAgcmV0dXJuIGVtYmVkZGVkLmdldFNwZWNpZmljYXRpb24oKS5nZXRBbGxvd0JvZHkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRBbGxvd0JvZHkoU3RyaW5nIGxpYnJhcnlJZCwgU3RyaW5nIHR5cGUsIElMb2NhdGlvbiBsb2NhdGlvbikKLSAgICB7Ci0gICAgICAgIElOYW1lc3BhY2UgbmFtZXNwYWNlID0gX2NvbXBvbmVudC5nZXROYW1lc3BhY2UoKTsKLQotICAgICAgICBfcmVzb2x2ZXIucmVzb2x2ZShfY3ljbGUsIG5hbWVzcGFjZSwgbGlicmFyeUlkLCB0eXBlLCBsb2NhdGlvbik7Ci0KLSAgICAgICAgSUNvbXBvbmVudFNwZWNpZmljYXRpb24gc3BlYyA9IF9yZXNvbHZlci5nZXRTcGVjaWZpY2F0aW9uKCk7Ci0KLSAgICAgICAgcmV0dXJuIHNwZWMuZ2V0QWxsb3dCb2R5KCk7Ci0gICAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2VuZ2luZS9wYWNrYWdlLmh0bWwgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZW5naW5lL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZlYTM4My4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZW5naW5lL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTwhZG9jdHlwZSBodG1sIHB1YmxpYyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci08IS0tICRJZCQgLS0+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlRhcGVzdHJ5OiBXZWIgQXBwbGljYXRpb24gRnJhbWV3b3JrPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotCi08cD5JbXBsZW1lbnRhdGlvbnMgb2YgdGhlIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LklFbmdpbmV9IGludGVyZmFjZSwgaW5jbHVkaW5nCi10aGUgc3RhbmRhcmQgaW1wbGVtZW50YXRpb246Ci17QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5lbmdpbmUuQmFzZUVuZ2luZX0uICBBbHNvIGxvY2F0ZWQgaGVyZSBhcmUKLWRlZmF1bHQgaW1wbGVtZW50YXRpb25zIG9mIGFsbCB0aGUgYmFzaWMgc3VwcG9ydCBvYmplY3RzLCBpbmNsdWRpbmcKLXtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LmVuZ2luZS5SZXF1ZXN0Q3ljbGV9IAotKHdoaWNoIGltcGxlbWVudHMge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlcXVlc3RDeWNsZX0pLgotCi1AYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwIDxhIGhyZWY9Im1haWx0bzpobHNoaXBAYXBhY2hlLm9yZyI+aGxzaGlwQGFwYWNoZS5vcmc8L2E+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9lbmhhbmNlL0Jhc2VFbmhhbmNlZENsYXNzLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZW5oYW5jZS9CYXNlRW5oYW5jZWRDbGFzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OWIwYmNlLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9lbmhhbmNlL0Jhc2VFbmhhbmNlZENsYXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5lbmhhbmNlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKgotICogIEBhdXRob3IgTWluZGJyaWRnZQotICogIEB2ZXJzaW9uICRJZCQKLSAqICBAc2luY2UgMy4wCi0gKgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzZUVuaGFuY2VkQ2xhc3MgaW1wbGVtZW50cyBJRW5oYW5jZWRDbGFzcwotewotCi0gICAgLyoqCi0gICAgICogIExpc3Qgb2Yge0BsaW5rIElFbmhhbmNlcn0uCi0gICAgICogCi0gICAgICoqLwotICAgIHByaXZhdGUgTGlzdCBfZW5oYW5jZXJzOwotCi0gICAgcHJvdGVjdGVkIExpc3QgZ2V0RW5oYW5jZXJzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfZW5oYW5jZXJzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZEVuaGFuY2VyKElFbmhhbmNlciBlbmhhbmNlcikKLSAgICB7Ci0gICAgICAgIGlmIChfZW5oYW5jZXJzID09IG51bGwpCi0gICAgICAgICAgICBfZW5oYW5jZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgICAgIF9lbmhhbmNlcnMuYWRkKGVuaGFuY2VyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUudGFwZXN0cnkuZW5oYW5jZS5JRW5oYW5jZWRDbGFzcyNoYXNNb2RpZmljYXRpb25zKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNNb2RpZmljYXRpb25zKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfZW5oYW5jZXJzICE9IG51bGwgJiYgIV9lbmhhbmNlcnMuaXNFbXB0eSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHBlcmZvcm1FbmhhbmNlbWVudCgpCi0gICAgewotICAgICAgICBMaXN0IGVuaGFuY2VycyA9IGdldEVuaGFuY2VycygpOwotCi0gICAgICAgIGlmIChlbmhhbmNlcnMgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBpbnQgY291bnQgPSBlbmhhbmNlcnMuc2l6ZSgpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgSUVuaGFuY2VyIGVuaGFuY2VyID0gKElFbmhhbmNlcikgZW5oYW5jZXJzLmdldChpKTsKLQotICAgICAgICAgICAgZW5oYW5jZXIucGVyZm9ybUVuaGFuY2VtZW50KHRoaXMpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZW5oYW5jZS9Db2RlR2VuZXJhdGlvbkV4Y2VwdGlvbi5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2VuaGFuY2UvQ29kZUdlbmVyYXRpb25FeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdjOTFiMS4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZW5oYW5jZS9Db2RlR2VuZXJhdGlvbkV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuZW5oYW5jZTsKLQotLyoqCi0gKiAgVGhpcyBpcyBhbiB1bnJlY292ZXJhYmxlIGVycm9yIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0gKiAgSXQgc2hvdWxkIG5vdCBvY2N1ciBhbmQgd291bGQgdHlwaWNhbGx5IGJlIHRoZSByZXN1bHQgCi0gKiAgb2YgYSBidWcgaW4gdGhlIFRhcGVzdHJ5IGNvZGUuCi0gKiAgIAotICogIEBhdXRob3IgTWluZGJyaWRnZQotICogIEB2ZXJzaW9uICRJZCQKLSAqICBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb2RlR2VuZXJhdGlvbkV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24KLXsKLQlUaHJvd2FibGUgX2NhdXNlOwotCi0gICAgcHVibGljIENvZGVHZW5lcmF0aW9uRXhjZXB0aW9uKCkKLSAgICB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIENvZGVHZW5lcmF0aW9uRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKQotICAgIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSk7Ci0gICAgfQotCi0gICAgcHVibGljIENvZGVHZW5lcmF0aW9uRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpCi0gICAgewotICAgICAgICBzdXBlcihtZXNzYWdlKTsKLSAgICAgICAgX2NhdXNlID0gY2F1c2U7Ci0gICAgfQotCi0gICAgcHVibGljIENvZGVHZW5lcmF0aW9uRXhjZXB0aW9uKFRocm93YWJsZSBjYXVzZSkKLSAgICB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIF9jYXVzZSA9IGNhdXNlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgVGhyb3dhYmxlIGdldENhdXNlKCkKLSAgICB7Ci0gICAgCXJldHVybiBfY2F1c2U7Ci0gICAgfQotICAgIAotICAgIAotCi19CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZW5oYW5jZS9Db21wb25lbnRDbGFzc0ZhY3RvcnkuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9lbmhhbmNlL0NvbXBvbmVudENsYXNzRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTZiYWQ0Li4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9lbmhhbmNlL0NvbXBvbmVudENsYXNzRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTI5ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmVuaGFuY2U7Ci0KLWltcG9ydCBqYXZhLmJlYW5zLkJlYW5JbmZvOwotaW1wb3J0IGphdmEuYmVhbnMuSW50cm9zcGVjdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmJlYW5zLkludHJvc3BlY3RvcjsKLWltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUJpbmRpbmc7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JTG9jYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVzb3VyY2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LlRhcGVzdHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuc3BlYy5EaXJlY3Rpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5zcGVjLklDb21wb25lbnRTcGVjaWZpY2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuc3BlYy5JUGFyYW1ldGVyU3BlY2lmaWNhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnNwZWMuSVByb3BlcnR5U3BlY2lmaWNhdGlvbjsKLQotLyoqCi0gKiAgQ29udGFpbnMgdGhlIGxvZ2ljIGZvciBhbmFseXppbmcgYW5kIGVuaGFuY2luZyBhIHNpbmdsZSBjb21wb25lbnQgY2xhc3MuCi0gKiAgSW50ZXJuYWxseSwgdGhpcyBjbGFzcyBtYWtlcyB1c2Ugb2Yge0BsaW5rIElFbmhhbmNlZENsYXNzRmFjdG9yeX0uCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAc2luY2UgMy4wCi0gKgotICoqLwotCi1wdWJsaWMgY2xhc3MgQ29tcG9uZW50Q2xhc3NGYWN0b3J5Ci17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIExPRyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKENvbXBvbmVudENsYXNzRmFjdG9yeS5jbGFzcyk7Ci0KLSAgICAvKioKLSAgICAgKiAgUGFja2FnZSBwcmVmaXggdG8gYmUgYWRkZWQgaWYgdGhlIGVuaGFuY2VkIG9iamVjdCBpcyBpbiBhICdzeXNlbScgcGFja2FnZSAKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFDS0FHRV9QUkVGSVggPSAib3JnLmFwYWNoZS50YXBlc3RyeS4iOwotCi0gICAgLyoqCi0gICAgICogIFVJRCB1c2VkIHRvIGdlbmVyYXRlIG5ldyBjbGFzcyBuYW1lcy4KLSAgICAgKiovCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IF91aWQgPSAwOwotCi0gICAgLyoqCi0gICAgICogIE1hcHBpbmcgYmV0d2VlbiBhIHByaW1pdGl2ZSB0eXBlIGFuZCBpdHMgSmF2YSBWTSByZXByZXNlbnRhdGlvbgotICAgICAqICBVc2VkIGZvciB0aGUgZW5jb2Rpbmcgb2YgYXJyYXkgdHlwZXMKLSAgICAgKiovCi0gICAgcHJpdmF0ZSBzdGF0aWMgTWFwIF9wcmltaXRpdmVUeXBlcyA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICBzdGF0aWMgewotICAgICAgICBfcHJpbWl0aXZlVHlwZXMucHV0KCJib29sZWFuIiwgIloiKTsKLSAgICAgICAgX3ByaW1pdGl2ZVR5cGVzLnB1dCgic2hvcnQiLCAiUyIpOwotICAgICAgICBfcHJpbWl0aXZlVHlwZXMucHV0KCJpbnQiLCAiSSIpOwotICAgICAgICBfcHJpbWl0aXZlVHlwZXMucHV0KCJsb25nIiwgIkoiKTsKLSAgICAgICAgX3ByaW1pdGl2ZVR5cGVzLnB1dCgiZmxvYXQiLCAiRiIpOwotICAgICAgICBfcHJpbWl0aXZlVHlwZXMucHV0KCJkb3VibGUiLCAiRCIpOwotICAgICAgICBfcHJpbWl0aXZlVHlwZXMucHV0KCJjaGFyIiwgIkMiKTsKLSAgICAgICAgX3ByaW1pdGl2ZVR5cGVzLnB1dCgiYnl0ZSIsICJCIik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBJUmVzb3VyY2VSZXNvbHZlciBfcmVzb2x2ZXI7Ci0KLSAgICBwcml2YXRlIElFbmhhbmNlZENsYXNzRmFjdG9yeSBfZW5oYW5jZWRDbGFzc0ZhY3Rvcnk7Ci0gICAgcHJpdmF0ZSBJRW5oYW5jZWRDbGFzcyBfZW5oYW5jZWRDbGFzczsKLSAgICBwcml2YXRlIE1hcCBfYmVhblByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcCgpOwotICAgIHByaXZhdGUgSUNvbXBvbmVudFNwZWNpZmljYXRpb24gX3NwZWNpZmljYXRpb247Ci0gICAgcHJpdmF0ZSBDbGFzcyBfY29tcG9uZW50Q2xhc3M7Ci0gICAgcHJpdmF0ZSBKYXZhQ2xhc3NNYXBwaW5nIF9jbGFzc01hcHBpbmcgPSBuZXcgSmF2YUNsYXNzTWFwcGluZygpOwotCi0gICAgcHVibGljIENvbXBvbmVudENsYXNzRmFjdG9yeSgKLSAgICAgICAgSVJlc291cmNlUmVzb2x2ZXIgcmVzb2x2ZXIsCi0gICAgICAgIElDb21wb25lbnRTcGVjaWZpY2F0aW9uIHNwZWNpZmljYXRpb24sCi0gICAgICAgIENsYXNzIGNvbXBvbmVudENsYXNzLAotICAgICAgICBJRW5oYW5jZWRDbGFzc0ZhY3RvcnkgZW5oYW5jZWRDbGFzc0ZhY3RvcnkpCi0gICAgewotICAgICAgICBfcmVzb2x2ZXIgPSByZXNvbHZlcjsKLQotICAgICAgICBfc3BlY2lmaWNhdGlvbiA9IHNwZWNpZmljYXRpb247Ci0KLSAgICAgICAgX2NvbXBvbmVudENsYXNzID0gY29tcG9uZW50Q2xhc3M7Ci0KLSAgICAgICAgX2VuaGFuY2VkQ2xhc3NGYWN0b3J5ID0gZW5oYW5jZWRDbGFzc0ZhY3Rvcnk7Ci0KLSAgICAgICAgYnVpbGRCZWFuUHJvcGVydGllcygpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBidWlsZEJlYW5Qcm9wZXJ0aWVzKCkKLSAgICB7Ci0gICAgICAgIEJlYW5JbmZvIGluZm8gPSBudWxsOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBpbmZvID0gSW50cm9zcGVjdG9yLmdldEJlYW5JbmZvKF9jb21wb25lbnRDbGFzcyk7Ci0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSW50cm9zcGVjdGlvbkV4Y2VwdGlvbiBleCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICBUYXBlc3RyeS5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICJDb21wb25lbnRDbGFzc0ZhY3RvcnkudW5hYmxlLXRvLWludHJvc3BlY3QtY2xhc3MiLAotICAgICAgICAgICAgICAgICAgICBfY29tcG9uZW50Q2xhc3MuZ2V0TmFtZSgpKSwKLSAgICAgICAgICAgICAgICBleCk7Ci0gICAgICAgIH0KLQotICAgICAgICBQcm9wZXJ0eURlc2NyaXB0b3JbXSBkZXNjcmlwdG9ycyA9IGluZm8uZ2V0UHJvcGVydHlEZXNjcmlwdG9ycygpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcnMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9iZWFuUHJvcGVydGllcy5wdXQoZGVzY3JpcHRvcnNbaV0uZ2V0TmFtZSgpLCBkZXNjcmlwdG9yc1tpXSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgUHJvcGVydHlEZXNjcmlwdG9yIGdldFByb3BlcnR5RGVzY3JpcHRvcihTdHJpbmcgbmFtZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoUHJvcGVydHlEZXNjcmlwdG9yKSBfYmVhblByb3BlcnRpZXMuZ2V0KG5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBJbnZva2VzIHtAbGluayAjc2NhbkZvckVuaGFuY2VtZW50cygpfSB0byBpZGVudGlmeSBhbnkKLSAgICAgKiAgZW5oYW5jZW1lbnRzIG5lZWRlZCBvbiB0aGUgY2xhc3MsIHJldHVybmluZyB0cnVlCi0gICAgICogIGlmIHRoZXJlIGFyZSBhbnkgZW5oYW5jZW1lbnRzIHRvIGJlIHBlcmZvcm1lZC4gCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIGJvb2xlYW4gbmVlZHNFbmhhbmNlbWVudCgpCi0gICAgewotICAgICAgICBzY2FuRm9yRW5oYW5jZW1lbnRzKCk7Ci0KLSAgICAgICAgcmV0dXJuIF9lbmhhbmNlZENsYXNzICE9IG51bGwgJiYgX2VuaGFuY2VkQ2xhc3MuaGFzTW9kaWZpY2F0aW9ucygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBwZCBpcyBub3QgbnVsbCBhbmQgYm90aCByZWFkL3dyaXRlIG1ldGhvZHMgYXJlIGltcGxlbWVudGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNJbXBsZW1lbnRlZChQcm9wZXJ0eURlc2NyaXB0b3IgcGQpCi0gICAgewotICAgICAgICBpZiAocGQgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICByZXR1cm4gaXNJbXBsZW1lbnRlZChwZC5nZXRSZWFkTWV0aG9kKCkpICYmIGlzSW1wbGVtZW50ZWQocGQuZ2V0V3JpdGVNZXRob2QoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0cnVlIGlmIG0gaXMgbm90IG51bGwgYW5kIGlzIGFic3RyYWN0LgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzQWJzdHJhY3QoTWV0aG9kIG0pCi0gICAgewotICAgICAgICBpZiAobSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIHJldHVybiBNb2RpZmllci5pc0Fic3RyYWN0KG0uZ2V0TW9kaWZpZXJzKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBtIGlzIG5vdCBudWxsIGFuZCBub3QgYWJzdHJhY3QgIAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzSW1wbGVtZW50ZWQoTWV0aG9kIG0pCi0gICAgewotICAgICAgICBpZiAobSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIHJldHVybiAhTW9kaWZpZXIuaXNBYnN0cmFjdChtLmdldE1vZGlmaWVycygpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgR2l2ZW4gYSBjbGFzcyBuYW1lLCByZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIGNsYXNzLiAgSW4gYWRkaXRpb24sCi0gICAgICogIHNjYWxhciB0eXBlcywgYXJyYXlzIG9mIHNjYWxhciB0eXBlcywgamF2YS5sYW5nLk9iamVjdFtdIGFuZAotICAgICAqICBqYXZhLmxhbmcuU3RyaW5nW10gYXJlIHN1cHBvcnRlZC4KLSAgICAgKiAKLSAgICAgKiAgQHBhcmFtIHR5cGUgdG8gY29udmVydCB0byBhIENsYXNzCi0gICAgICogIEBwYXJhbSBsb2NhdGlvbiBvZiB0aGUgaW52b2x2ZWQgc3BlY2lmaWNhdGlvbiBlbGVtZW50IChmb3IgZXhjZXB0aW9uIHJlcG9ydGluZykKLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgQ2xhc3MgY29udmVydFByb3BlcnR5VHlwZShTdHJpbmcgdHlwZSwgSUxvY2F0aW9uIGxvY2F0aW9uKQotICAgIHsKLSAgICAgICAgQ2xhc3MgcmVzdWx0ID0gX2NsYXNzTWFwcGluZy5nZXRUeXBlKHR5cGUpOwotCi0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHR5cGVOYW1lID0gdHJhbnNsYXRlQ2xhc3NOYW1lKHR5cGUpOwotICAgICAgICAgICAgICAgIHJlc3VsdCA9IF9yZXNvbHZlci5maW5kQ2xhc3ModHlwZU5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICBUYXBlc3RyeS5mb3JtYXQoIkNvbXBvbmVudENsYXNzRmFjdG9yeS5iYWQtcHJvcGVydHktdHlwZSIsIHR5cGUpLAotICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgZXgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBfY2xhc3NNYXBwaW5nLnJlY29yZFR5cGUodHlwZSwgcmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFRyYW5zbGF0ZXMgdHlwZXMgZnJvbSBzdGFuZGFyZCBKYXZhIGZvcm1hdCB0byBKYXZhIFZNIGZvcm1hdC4KLSAgICAgKiAgRm9yIGV4YW1wbGUsIGphdmEudXRpbC5Mb2NhbGUgcmVtYWlucyBqYXZhLnV0aWwuTG9jYWxlLCBidXQKLSAgICAgKiAgaW50W11bXSBpcyB0cmFuc2xhdGVkIHRvIFtbSSBhbmQgamF2YS5sYW5nLk9iamVjdFtdIHRvIAotICAgICAqICBbTGphdmEubGFuZy5PYmplY3Q7ICAgCi0gICAgICogIFRoaXMgbWV0aG9kIGFuZCBpdHMgc3RhdGljIE1hcCBzaG91bGQgZ28gaW50byBhIHV0aWxpdHkgY2xhc3MKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zbGF0ZUNsYXNzTmFtZShTdHJpbmcgdHlwZSkKLSAgICB7Ci0gICAgICAgIC8vIGlmIGl0IGlzIG5vdCBhbiBhcnJheSwganVzdCByZXR1cm4gdGhlIHR5cGUgaXRzZWxmCi0gICAgICAgIGlmICghdHlwZS5lbmRzV2l0aCgiW10iKSkKLSAgICAgICAgICAgIHJldHVybiB0eXBlOwotCi0gICAgICAgIC8vIGlmIGl0IGlzIGFuIGFycmF5LCBjb252ZXJ0IGl0IHRvIEphdmFWTS1zdHlsZSBmb3JtYXQKLSAgICAgICAgU3RyaW5nQnVmZmVyIGphdmFUeXBlID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICB3aGlsZSAodHlwZS5lbmRzV2l0aCgiW10iKSkKLSAgICAgICAgewotICAgICAgICAgICAgamF2YVR5cGUuYXBwZW5kKCJbIik7Ci0gICAgICAgICAgICB0eXBlID0gdHlwZS5zdWJzdHJpbmcoMCwgdHlwZS5sZW5ndGgoKSAtIDIpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIHByaW1pdGl2ZUlkZW50aWZpZXIgPSAoU3RyaW5nKSBfcHJpbWl0aXZlVHlwZXMuZ2V0KHR5cGUpOwotICAgICAgICBpZiAocHJpbWl0aXZlSWRlbnRpZmllciAhPSBudWxsKQotICAgICAgICAgICAgamF2YVR5cGUuYXBwZW5kKHByaW1pdGl2ZUlkZW50aWZpZXIpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBqYXZhVHlwZS5hcHBlbmQoIkwiICsgdHlwZSArICI7Iik7Ci0KLSAgICAgICAgcmV0dXJuIGphdmFUeXBlLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgY2hlY2tQcm9wZXJ0eVR5cGUoUHJvcGVydHlEZXNjcmlwdG9yIHBkLCBDbGFzcyBwcm9wZXJ0eVR5cGUsIElMb2NhdGlvbiBsb2NhdGlvbikKLSAgICB7Ci0gICAgICAgIGlmICghcGQuZ2V0UHJvcGVydHlUeXBlKCkuZXF1YWxzKHByb3BlcnR5VHlwZSkpCi0gICAgICAgICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIFRhcGVzdHJ5LmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgIkNvbXBvbmVudENsYXNzRmFjdG9yeS5wcm9wZXJ0eS10eXBlLW1pc21hdGNoIiwKLSAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIF9jb21wb25lbnRDbGFzcy5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBwZC5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBwZC5nZXRQcm9wZXJ0eVR5cGUoKS5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVR5cGUuZ2V0TmFtZSgpfSksCi0gICAgICAgICAgICAgICAgbG9jYXRpb24sCi0gICAgICAgICAgICAgICAgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIENoZWNrcyB0byBzZWUgdGhhdCB0aGF0IGNsYXNzIGVpdGhlciBkb2Vzbid0IHByb3ZpZGUgdGhlIHByb3BlcnR5LCBvciBkb2VzCi0gICAgICogIGJ1dCB0aGUgYWNjZXNzb3IocykgYXJlIGFic3RyYWN0LiAgUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgcmVhZCBhY2Nlc3NvciwKLSAgICAgKiAgb3IgbnVsbCBpZiB0aGVyZSBpcyBubyBzdWNoIGFjY2Vzc29yICh0aGlzIGlzIGhlbHBmdWwgaWYgdGhlIGJlYW5DbGFzcwotICAgICAqICBkZWZpbmVzIGEgYm9vbGVhbiBwcm9wZXJ0eSwgd2hlcmUgdGhlIG5hbWUgb2YgdGhlIGFjY2Vzc29yIG1heSBiZSBpc1hYWCBvcgotICAgICAqICBnZXRYWFgpLgotICAgICAqIAotICAgICAqKi8KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgY2hlY2tBY2Nlc3NvcnMoU3RyaW5nIHByb3BlcnR5TmFtZSwgQ2xhc3MgcHJvcGVydHlUeXBlLCBJTG9jYXRpb24gbG9jYXRpb24pCi0gICAgewotICAgICAgICBQcm9wZXJ0eURlc2NyaXB0b3IgZCA9IGdldFByb3BlcnR5RGVzY3JpcHRvcihwcm9wZXJ0eU5hbWUpOwotCi0gICAgICAgIGlmIChkID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICBjaGVja1Byb3BlcnR5VHlwZShkLCBwcm9wZXJ0eVR5cGUsIGxvY2F0aW9uKTsKLQotICAgICAgICBNZXRob2Qgd3JpdGUgPSBkLmdldFdyaXRlTWV0aG9kKCk7Ci0gICAgICAgIE1ldGhvZCByZWFkID0gZC5nZXRSZWFkTWV0aG9kKCk7Ci0KLSAgICAgICAgaWYgKGlzSW1wbGVtZW50ZWQod3JpdGUpKQotICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICBUYXBlc3RyeS5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICJDb21wb25lbnRDbGFzc0ZhY3Rvcnkubm9uLWFic3RyYWN0LXdyaXRlIiwKLSAgICAgICAgICAgICAgICAgICAgd3JpdGUuZ2V0RGVjbGFyaW5nQ2xhc3MoKS5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgIHByb3BlcnR5TmFtZSksCi0gICAgICAgICAgICAgICAgbG9jYXRpb24sCi0gICAgICAgICAgICAgICAgbnVsbCk7Ci0KLSAgICAgICAgaWYgKGlzSW1wbGVtZW50ZWQocmVhZCkpCi0gICAgICAgICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIFRhcGVzdHJ5LmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgIkNvbXBvbmVudENsYXNzRmFjdG9yeS5ub24tYWJzdHJhY3QtcmVhZCIsCi0gICAgICAgICAgICAgICAgICAgIHJlYWQuZ2V0RGVjbGFyaW5nQ2xhc3MoKS5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgIHByb3BlcnR5TmFtZSksCi0gICAgICAgICAgICAgICAgbG9jYXRpb24sCi0gICAgICAgICAgICAgICAgbnVsbCk7Ci0KLSAgICAgICAgcmV0dXJuIHJlYWQgPT0gbnVsbCA/IG51bGwgOiByZWFkLmdldE5hbWUoKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc01pc3NpbmdQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKQotICAgIHsKLSAgICAgICAgUHJvcGVydHlEZXNjcmlwdG9yIHBkID0gZ2V0UHJvcGVydHlEZXNjcmlwdG9yKHByb3BlcnR5TmFtZSk7Ci0KLSAgICAgICAgcmV0dXJuICFpc0ltcGxlbWVudGVkKHBkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgSW52b2tlZCBieSB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5lbmhhbmNlLkRlZmF1bHRDb21wb25lbnRDbGFzc0VuaGFuY2VyfSB0bwotICAgICAqICBjcmVhdGUgYW4gZW5haGFuY2VkCi0gICAgICogIHN1YmNsYXNzIG9mIHRoZSBjb21wb25lbnQgY2xhc3MuICBUaGlzIG1lYW5zIGNyZWF0aW5nIGEgZGVmYXVsdCBjb25zdHJ1Y3RvciwKLSAgICAgKiAgbmV3IGZpZWxkcywgYW5kIG5ldyBhY2Nlc3NvciBhbmQgbXV0YXRvciBtZXRob2RzLiAgUHJvcGVydGllcyBhcmUgY3JlYXRlZAotICAgICAqICBmb3IgY29ubmVjdGVkIHBhcmFtZXRlcnMsIGZvciBhbGwgZm9ybWFsIHBhcmFtZXRlcnMgKHRoZSBiaW5kaW5nIHByb3BlcnR5KSwKLSAgICAgKiAgYW5kIGZvciBhbGwgc3BlY2lmaWVkIHBhcmFtZXRlcnMgKHdoaWNoIG1heSBiZSB0cmFuc2llbnQgb3IgcGVyc2lzdGVudCkuCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIENsYXNzIGNyZWF0ZUVuaGFuY2VkU3ViY2xhc3MoKQotICAgIHsKLSAgICAgICAgSUVuaGFuY2VkQ2xhc3MgZW5oYW5jZWRDbGFzcyA9IGdldEVuaGFuY2VkQ2xhc3MoKTsKLQotICAgICAgICBTdHJpbmcgc3RhcnRDbGFzc05hbWUgPSBfY29tcG9uZW50Q2xhc3MuZ2V0TmFtZSgpOwotICAgICAgICBTdHJpbmcgc3ViY2xhc3NOYW1lID0gZW5oYW5jZWRDbGFzcy5nZXRDbGFzc05hbWUoKTsKLQotICAgICAgICBpZiAoTE9HLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgICAgICBMT0cuZGVidWcoCi0gICAgICAgICAgICAgICAgIkVuaGFuY2luZyBzdWJjbGFzcyBvZiAiCi0gICAgICAgICAgICAgICAgICAgICsgc3RhcnRDbGFzc05hbWUKLSAgICAgICAgICAgICAgICAgICAgKyAiIGZvciAiCi0gICAgICAgICAgICAgICAgICAgICsgX3NwZWNpZmljYXRpb24uZ2V0U3BlY2lmaWNhdGlvbkxvY2F0aW9uKCkpOwotCi0gICAgICAgIENsYXNzIHJlc3VsdCA9IGVuaGFuY2VkQ2xhc3MuY3JlYXRlRW5oYW5jZWRTdWJjbGFzcygpOwotCi0gICAgICAgIGlmIChMT0cuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgICAgIExPRy5kZWJ1ZygiRmluaXNoZWQgY3JlYXRpbmcgZW5oYW5jZWQgY2xhc3MgIiArIHN1YmNsYXNzTmFtZSk7Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgSW52b2tlZCBieSB7QGxpbmsgI25lZWRzRW5oYW5jZW1lbnQoKX0gdG8gZmluZCBhbnkgZW5oYW5jZW1lbnRzCi0gICAgICogIHRoYXQgbWF5IGJlIG5lZWRlZC4gIFNob3VsZCBjcmVhdGUgYW4ge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkuZW5oYW5jZS5JRW5oYW5jZXJ9Ci0gICAgICogIGZvciBlYWNoIG9uZSwgYW5kIGFkZCBpdCB0byB0aGUgcXVldWUuCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2NhbkZvckVuaGFuY2VtZW50cygpCi0gICAgewotICAgICAgICBzY2FuRm9yUGFyYW1ldGVyRW5oYW5jZW1lbnRzKCk7Ci0gICAgICAgIHNjYW5Gb3JTcGVjaWZpZWRQcm9wZXJ0eUVuaGFuY2VtZW50cygpOwotICAgICAgICBzY2FuRm9yQWJzdHJhY3RDbGFzcygpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNjYW5Gb3JBYnN0cmFjdENsYXNzKCkKLSAgICB7Ci0gICAgICAgIGlmIChNb2RpZmllci5pc0Fic3RyYWN0KF9jb21wb25lbnRDbGFzcy5nZXRNb2RpZmllcnMoKSkpCi0gICAgICAgICAgICBnZXRFbmhhbmNlZENsYXNzKCkuYWRkRW5oYW5jZXIobmV3IE5vT3BFbmhhbmNlcigpKTsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqICBJbnZva2VkIGJ5IHtAbGluayAjc2NhbkZvckVuaGFuY2VtZW50cygpfSB0byBsb2NhdGUKLSAgICAgKiAgYW55IGVuaGFuY2VtZW50cyBuZWVkZWQgZm9yIGNvbXBvbmVudCBwYXJhbWV0ZXJzICh0aGlzIGluY2x1ZGVzCi0gICAgICogIGJpbmRpbmcgcHJvcGVydGllcyBhbmQgY29ubmVjdGVkIHBhcmFtZXRlciBwcm9wZXJ0eSkuCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2NhbkZvclBhcmFtZXRlckVuaGFuY2VtZW50cygpCi0gICAgewotICAgICAgICBMaXN0IG5hbWVzID0gX3NwZWNpZmljYXRpb24uZ2V0UGFyYW1ldGVyTmFtZXMoKTsKLSAgICAgICAgaW50IGNvdW50ID0gbmFtZXMuc2l6ZSgpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBuYW1lcy5nZXQoaSk7Ci0KLSAgICAgICAgICAgIElQYXJhbWV0ZXJTcGVjaWZpY2F0aW9uIHBzID0gX3NwZWNpZmljYXRpb24uZ2V0UGFyYW1ldGVyKG5hbWUpOwotCi0gICAgICAgICAgICBzY2FuRm9yQmluZGluZ1Byb3BlcnR5KG5hbWUsIHBzKTsKLQotICAgICAgICAgICAgc2NhbkZvclBhcmFtZXRlclByb3BlcnR5KG5hbWUsIHBzKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2NhbkZvclNwZWNpZmllZFByb3BlcnR5RW5oYW5jZW1lbnRzKCkKLSAgICB7Ci0gICAgICAgIExpc3QgbmFtZXMgPSBfc3BlY2lmaWNhdGlvbi5nZXRQcm9wZXJ0eVNwZWNpZmljYXRpb25OYW1lcygpOwotICAgICAgICBpbnQgY291bnQgPSBuYW1lcy5zaXplKCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpIG5hbWVzLmdldChpKTsKLQotICAgICAgICAgICAgSVByb3BlcnR5U3BlY2lmaWNhdGlvbiBwcyA9IF9zcGVjaWZpY2F0aW9uLmdldFByb3BlcnR5U3BlY2lmaWNhdGlvbihuYW1lKTsKLQotICAgICAgICAgICAgc2NhbkZvclNwZWNpZmllZFByb3BlcnR5KHBzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNjYW5Gb3JCaW5kaW5nUHJvcGVydHkoU3RyaW5nIHBhcmFtZXRlck5hbWUsIElQYXJhbWV0ZXJTcGVjaWZpY2F0aW9uIHBzKQotICAgIHsKLSAgICAgICAgU3RyaW5nIHByb3BlcnR5TmFtZSA9IHBhcmFtZXRlck5hbWUgKyBUYXBlc3RyeS5QQVJBTUVURVJfUFJPUEVSVFlfTkFNRV9TVUZGSVg7Ci0gICAgICAgIFByb3BlcnR5RGVzY3JpcHRvciBwZCA9IGdldFByb3BlcnR5RGVzY3JpcHRvcihwcm9wZXJ0eU5hbWUpOwotCi0gICAgICAgIC8vIG9ubHkgZW5oYW5jZSBjdXN0b20gcGFyYW1ldGVyIGJpbmRpbmcgcHJvcGVydGllcyBpZiB0aGV5IGFyZSBkZWNsYXJlZCBhYnN0cmFjdAotICAgICAgICBpZiAocHMuZ2V0RGlyZWN0aW9uKCkgPT0gRGlyZWN0aW9uLkNVU1RPTSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHBkID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgICAgICBpZiAoIShpc0Fic3RyYWN0KHBkLmdldFJlYWRNZXRob2QoKSkgfHwgaXNBYnN0cmFjdChwZC5nZXRXcml0ZU1ldGhvZCgpKSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGlzSW1wbGVtZW50ZWQocGQpKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIC8vIE5lZWQgdG8gY3JlYXRlIHRoZSBwcm9wZXJ0eS4KLSAgICAgICAgZ2V0RW5oYW5jZWRDbGFzcygpLmNyZWF0ZVByb3BlcnR5KHByb3BlcnR5TmFtZSwgSUJpbmRpbmcuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzY2FuRm9yUGFyYW1ldGVyUHJvcGVydHkoU3RyaW5nIHBhcmFtZXRlck5hbWUsIElQYXJhbWV0ZXJTcGVjaWZpY2F0aW9uIHBzKQotICAgIHsKLSAgICAgICAgRGlyZWN0aW9uIGRpcmVjdGlvbiA9IHBzLmdldERpcmVjdGlvbigpOwotCi0gICAgICAgIGlmIChkaXJlY3Rpb24gPT0gRGlyZWN0aW9uLkNVU1RPTSkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBpZiAoZGlyZWN0aW9uID09IERpcmVjdGlvbi5BVVRPKQotICAgICAgICB7Ci0gICAgICAgICAgICBhZGRBdXRvUGFyYW1ldGVyRW5oYW5jZXIocGFyYW1ldGVyTmFtZSwgcHMpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIHByb3BlcnR5TmFtZSA9IHBzLmdldFByb3BlcnR5TmFtZSgpOwotCi0gICAgICAgIC8vIFllcywgYnV0IGRvZXMgaXQgKm5lZWQqIGEgcHJvcGVydHkgY3JlYXRlZD8KLQotICAgICAgICBpZiAoIWlzTWlzc2luZ1Byb3BlcnR5KHByb3BlcnR5TmFtZSkpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgSUxvY2F0aW9uIGxvY2F0aW9uID0gcHMuZ2V0TG9jYXRpb24oKTsKLQotICAgICAgICBDbGFzcyBwcm9wZXJ0eVR5cGUgPSBjb252ZXJ0UHJvcGVydHlUeXBlKHBzLmdldFR5cGUoKSwgbG9jYXRpb24pOwotCi0gICAgICAgIFN0cmluZyByZWFkTWV0aG9kTmFtZSA9IGNoZWNrQWNjZXNzb3JzKHByb3BlcnR5TmFtZSwgcHJvcGVydHlUeXBlLCBsb2NhdGlvbik7Ci0KLSAgICAgICAgZ2V0RW5oYW5jZWRDbGFzcygpLmNyZWF0ZVByb3BlcnR5KHByb3BlcnR5TmFtZSwgcHMuZ2V0VHlwZSgpLCByZWFkTWV0aG9kTmFtZSwgZmFsc2UpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFkZEF1dG9QYXJhbWV0ZXJFbmhhbmNlcihTdHJpbmcgcGFyYW1ldGVyTmFtZSwgSVBhcmFtZXRlclNwZWNpZmljYXRpb24gcHMpCi0gICAgewotICAgICAgICBJTG9jYXRpb24gbG9jYXRpb24gPSBwcy5nZXRMb2NhdGlvbigpOwotICAgICAgICBTdHJpbmcgcHJvcGVydHlOYW1lID0gcHMuZ2V0UHJvcGVydHlOYW1lKCk7Ci0KLSAgICAgICAgaWYgKCFwcy5pc1JlcXVpcmVkKCkgJiYgcHMuZ2V0RGVmYXVsdFZhbHVlKCkgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgVGFwZXN0cnkuZm9ybWF0KCJDb21wb25lbnRDbGFzc0ZhY3RvcnkuYXV0by1tdXN0LWJlLXJlcXVpcmVkIiwgcGFyYW1ldGVyTmFtZSksCi0gICAgICAgICAgICAgICAgbG9jYXRpb24sCi0gICAgICAgICAgICAgICAgbnVsbCk7Ci0KLSAgICAgICAgQ2xhc3MgcHJvcGVydHlUeXBlID0gY29udmVydFByb3BlcnR5VHlwZShwcy5nZXRUeXBlKCksIGxvY2F0aW9uKTsKLQotICAgICAgICBTdHJpbmcgcmVhZE1ldGhvZE5hbWUgPSBjaGVja0FjY2Vzc29ycyhwcm9wZXJ0eU5hbWUsIHByb3BlcnR5VHlwZSwgbG9jYXRpb24pOwotCi0gICAgICAgIGdldEVuaGFuY2VkQ2xhc3MoKS5jcmVhdGVBdXRvUGFyYW1ldGVyKAotICAgICAgICAgICAgcHJvcGVydHlOYW1lLAotICAgICAgICAgICAgcGFyYW1ldGVyTmFtZSwKLSAgICAgICAgICAgIHBzLmdldFR5cGUoKSwKLSAgICAgICAgICAgIHJlYWRNZXRob2ROYW1lKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzY2FuRm9yU3BlY2lmaWVkUHJvcGVydHkoSVByb3BlcnR5U3BlY2lmaWNhdGlvbiBwcykKLSAgICB7Ci0gICAgICAgIFN0cmluZyBwcm9wZXJ0eU5hbWUgPSBwcy5nZXROYW1lKCk7Ci0gICAgICAgIElMb2NhdGlvbiBsb2NhdGlvbiA9IHBzLmdldExvY2F0aW9uKCk7Ci0gICAgICAgIENsYXNzIHByb3BlcnR5VHlwZSA9IGNvbnZlcnRQcm9wZXJ0eVR5cGUocHMuZ2V0VHlwZSgpLCBsb2NhdGlvbik7Ci0KLSAgICAgICAgUHJvcGVydHlEZXNjcmlwdG9yIHBkID0gZ2V0UHJvcGVydHlEZXNjcmlwdG9yKHByb3BlcnR5TmFtZSk7Ci0KLSAgICAgICAgaWYgKGlzSW1wbGVtZW50ZWQocGQpKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIHByb3BlcnR5IGlzIGF0IGxlYXN0IHRoZSByaWdodCB0eXBlLgotCi0gICAgICAgICAgICBjaGVja1Byb3BlcnR5VHlwZShwZCwgcHJvcGVydHlUeXBlLCBsb2NhdGlvbik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgcmVhZE1ldGhvZE5hbWUgPSBjaGVja0FjY2Vzc29ycyhwcm9wZXJ0eU5hbWUsIHByb3BlcnR5VHlwZSwgbG9jYXRpb24pOwotCi0gICAgICAgIGdldEVuaGFuY2VkQ2xhc3MoKS5jcmVhdGVQcm9wZXJ0eSgKLSAgICAgICAgICAgIHByb3BlcnR5TmFtZSwKLSAgICAgICAgICAgIHBzLmdldFR5cGUoKSwKLSAgICAgICAgICAgIHJlYWRNZXRob2ROYW1lLAotICAgICAgICAgICAgcHMuaXNQZXJzaXN0ZW50KCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBJRW5oYW5jZWRDbGFzcyBnZXRFbmhhbmNlZENsYXNzKCkKLSAgICB7Ci0gICAgICAgIGlmIChfZW5oYW5jZWRDbGFzcyA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgc3RhcnRDbGFzc05hbWUgPSBfY29tcG9uZW50Q2xhc3MuZ2V0TmFtZSgpOwotICAgICAgICAgICAgU3RyaW5nIHN1YmNsYXNzTmFtZSA9IHN0YXJ0Q2xhc3NOYW1lICsgIiRFbmhhbmNlXyIgKyBnZW5lcmF0ZVVJRCgpOwotCi0gICAgICAgICAgICAvLyBJZiB0aGUgbmV3IGNsYXNzIGlzIGxvY2F0ZWQgaW4gYSAncmVzdHJpY3RlZCcgcGFja2FnZSwgCi0gICAgICAgICAgICAvLyBhZGQgYSBuZXV0cmFsIHBhY2thZ2UgcHJlZml4IHRvIHRoZSBuYW1lLiAKLSAgICAgICAgICAgIC8vIFRoZSBjbGFzcyBlbmhhbmNlbWVudCB3aWxsIGxpa2VseSBmYWlsIGFueXdheSwgc2luY2UgdGhlIG9yaWdpbmFsIG9iamVjdCAKLSAgICAgICAgICAgIC8vIHdvdWxkIG5vdCBpbXBsZW1lbnQgSUNvbXBvbmVudCwgYnV0IHdlIGRvIG5vdCBrbm93IHdoYXQgdGhlIGVuaGFuY2VtZW50Ci0gICAgICAgICAgICAvLyB3aWxsIGRvIGluIHRoZSBmdXR1cmUgLS0gaXQgbWlnaHQgaW1wbGVtZW50IHRoYXQgaW50ZXJmYWNlIGF1dG9tYXRpY2FsbHkuIAotICAgICAgICAgICAgaWYgKHN1YmNsYXNzTmFtZS5zdGFydHNXaXRoKCJqYXZhLiIpIHx8IHN1YmNsYXNzTmFtZS5zdGFydHNXaXRoKCJqYXZheC4iKSkKLSAgICAgICAgICAgICAgICBzdWJjbGFzc05hbWUgPSBQQUNLQUdFX1BSRUZJWCArIHN1YmNsYXNzTmFtZTsKLQotICAgICAgICAgICAgX2VuaGFuY2VkQ2xhc3MgPQotICAgICAgICAgICAgICAgIF9lbmhhbmNlZENsYXNzRmFjdG9yeS5jcmVhdGVFbmhhbmNlZENsYXNzKHN1YmNsYXNzTmFtZSwgX2NvbXBvbmVudENsYXNzKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gX2VuaGFuY2VkQ2xhc3M7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgc3luY2hyb25pemVkIGludCBnZW5lcmF0ZVVJRCgpCi0gICAgewotICAgICAgICByZXR1cm4gX3VpZCsrOwotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9lbmhhbmNlL0RlZmF1bHRDb21wb25lbnRDbGFzc0VuaGFuY2VyLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZW5oYW5jZS9EZWZhdWx0Q29tcG9uZW50Q2xhc3NFbmhhbmNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NmMzOGRmLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9lbmhhbmNlL0RlZmF1bHRDb21wb25lbnRDbGFzc0VuaGFuY2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjQgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuZW5oYW5jZTsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5BcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVzb3VyY2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LlRhcGVzdHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuZW5naW5lLklDb21wb25lbnRDbGFzc0VuaGFuY2VyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuZW5oYW5jZS5qYXZhc3Npc3QuRW5oYW5jZWRDbGFzc0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5zcGVjLklDb21wb25lbnRTcGVjaWZpY2F0aW9uOwotCi0vKioKLSAqICBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBJQ29tcG9uZW50Q2xhc3NFbmhhbmNlcn0uCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQHNpbmNlIDMuMAotICogCi0gKiovCi0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0Q29tcG9uZW50Q2xhc3NFbmhhbmNlciBpbXBsZW1lbnRzIElDb21wb25lbnRDbGFzc0VuaGFuY2VyCi17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIExPRyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKERlZmF1bHRDb21wb25lbnRDbGFzc0VuaGFuY2VyLmNsYXNzKTsKLQotICAgIC8qKgotICAgICAqICBNYXAgb2YgQ2xhc3MsIGtleWVkIG9uIElDb21wb25lbnRTcGVjaWZpY2F0aW9uLgotICAgICAqIAotICAgICAqKi8KLQotICAgIHByaXZhdGUgTWFwIF9jYWNoZWRDbGFzc2VzOwotICAgIHByaXZhdGUgSVJlc291cmNlUmVzb2x2ZXIgX3Jlc29sdmVyOwotICAgIHByaXZhdGUgSUVuaGFuY2VkQ2xhc3NGYWN0b3J5IF9mYWN0b3J5OwotICAgIHByaXZhdGUgYm9vbGVhbiBfZGlzYWJsZVZhbGlkYXRpb247Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gcmVzb2x2ZXIgcmVzb3VyY2UgcmVzb2x2ZXIgdXNlZCB0byBsb2NhdGUgY2xhc3NlcwotICAgICAqIEBwYXJhbSBkaXNhYmxlVmFsaWRhdGlvbiBpZiB0cnVlLCB0aGVuIHZhbGlkYXRpb24gKG9mIHVuaW1wbGVtZW50ZWQgYWJzdHJhY3QgbWV0aG9kcykKLSAgICAgKiBpcyBza2lwcGVkCi0gICAgICovCi0gICAgcHVibGljIERlZmF1bHRDb21wb25lbnRDbGFzc0VuaGFuY2VyKElSZXNvdXJjZVJlc29sdmVyIHJlc29sdmVyLCBib29sZWFuIGRpc2FibGVWYWxpZGF0aW9uKQotICAgIHsKLSAgICAgICAgX2NhY2hlZENsYXNzZXMgPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRNYXAobmV3IEhhc2hNYXAoKSk7Ci0gICAgICAgIF9yZXNvbHZlciA9IHJlc29sdmVyOwotICAgICAgICBfZmFjdG9yeSA9IGNyZWF0ZUVuaGFuY2VkQ2xhc3NGYWN0b3J5KCk7Ci0gICAgICAgIF9kaXNhYmxlVmFsaWRhdGlvbiA9IGRpc2FibGVWYWxpZGF0aW9uOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBJRW5oYW5jZWRDbGFzc0ZhY3RvcnkgY3JlYXRlRW5oYW5jZWRDbGFzc0ZhY3RvcnkoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBFbmhhbmNlZENsYXNzRmFjdG9yeShnZXRSZXNvdXJjZVJlc29sdmVyKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZXNldCgpCi0gICAgewotICAgICAgICBfY2FjaGVkQ2xhc3Nlcy5jbGVhcigpOwotICAgICAgICBfZmFjdG9yeS5yZXNldCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBJUmVzb3VyY2VSZXNvbHZlciBnZXRSZXNvdXJjZVJlc29sdmVyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfcmVzb2x2ZXI7Ci0gICAgfQotCi0gICAgcHVibGljIENsYXNzIGdldEVuaGFuY2VkQ2xhc3MoSUNvbXBvbmVudFNwZWNpZmljYXRpb24gc3BlY2lmaWNhdGlvbiwgU3RyaW5nIGNsYXNzTmFtZSkKLSAgICB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHNwZWNpZmljYXRpb24pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ2xhc3MgcmVzdWx0ID0gZ2V0Q2FjaGVkQ2xhc3Moc3BlY2lmaWNhdGlvbik7Ci0KLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBjb25zdHJ1Y3RDb21wb25lbnRDbGFzcyhzcGVjaWZpY2F0aW9uLCBjbGFzc05hbWUpOwotICAgICAgICAgICAgICAgICAgICBzdG9yZUNhY2hlZENsYXNzKHNwZWNpZmljYXRpb24sIHJlc3VsdCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzdG9yZUNhY2hlZENsYXNzKElDb21wb25lbnRTcGVjaWZpY2F0aW9uIHNwZWNpZmljYXRpb24sIENsYXNzIGNhY2hlZENsYXNzKQotICAgIHsKLSAgICAgICAgX2NhY2hlZENsYXNzZXMucHV0KHNwZWNpZmljYXRpb24sIGNhY2hlZENsYXNzKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgQ2xhc3MgZ2V0Q2FjaGVkQ2xhc3MoSUNvbXBvbmVudFNwZWNpZmljYXRpb24gc3BlY2lmaWNhdGlvbikKLSAgICB7Ci0gICAgICAgIHJldHVybiAoQ2xhc3MpIF9jYWNoZWRDbGFzc2VzLmdldChzcGVjaWZpY2F0aW9uKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0aGUgY2xhc3MgdG8gYmUgdXNlZCBmb3IgdGhlIGNvbXBvbmVudCwgd2hpY2ggaXMgZWl0aGVyCi0gICAgICogIHRoZSBjbGFzcyB3aXRoIHRoZSBnaXZlbiBuYW1lLCBvciBhbiBlbmhhbmNlZCBzdWJjbGFzcy4KLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwcm90ZWN0ZWQgQ2xhc3MgY29uc3RydWN0Q29tcG9uZW50Q2xhc3MoCi0gICAgICAgIElDb21wb25lbnRTcGVjaWZpY2F0aW9uIHNwZWNpZmljYXRpb24sCi0gICAgICAgIFN0cmluZyBjbGFzc05hbWUpCi0gICAgewotICAgICAgICBDbGFzcyByZXN1bHQgPSBudWxsOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQgPSBfcmVzb2x2ZXIuZmluZENsYXNzKGNsYXNzTmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbihleC5nZXRNZXNzYWdlKCksIHNwZWNpZmljYXRpb24uZ2V0TG9jYXRpb24oKSwgZXgpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIENvbXBvbmVudENsYXNzRmFjdG9yeSBmYWN0b3J5ID0gY3JlYXRlQ29tcG9uZW50Q2xhc3NGYWN0b3J5KHNwZWNpZmljYXRpb24sIHJlc3VsdCk7Ci0KLSAgICAgICAgICAgIGlmIChmYWN0b3J5Lm5lZWRzRW5oYW5jZW1lbnQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBmYWN0b3J5LmNyZWF0ZUVuaGFuY2VkU3ViY2xhc3MoKTsKLQotICAgICAgICAgICAgICAgIGlmICghX2Rpc2FibGVWYWxpZGF0aW9uKQotICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZUVuaGFuY2VkQ2xhc3MocmVzdWx0LCBjbGFzc05hbWUsIHNwZWNpZmljYXRpb24pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChDb2RlR2VuZXJhdGlvbkV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIFRhcGVzdHJ5LmZvcm1hdCgiQ29tcG9uZW50Q2xhc3NGYWN0b3J5LmNvZGUtZ2VuZXJhdGlvbi1lcnJvciIsIGNsYXNzTmFtZSksCi0gICAgICAgICAgICAgICAgZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBDb25zdHJ1Y3RzIGEgbmV3IGZhY3RvcnkgZm9yIGVuaGFuY2luZyB0aGUgc3BlY2lmaWVkIGNsYXNzLiBBZHZhbmNlZCB1c2VycwotICAgICAqICBtYXkgd2FudCB0byBwcm92aWRlIHRoaWVyIG93biBlbmhhbmNlbWVudHMgdG8gY2xhc3NlcyBhbmQgdGhpcyBtZXRob2QKLSAgICAgKiAgaXMgdGhlIGhvb2sgdGhhdCBhbGxvd3MgdGhlbSB0byBwcm92aWRlIGEgc3ViY2xhc3Mgb2YKLSAgICAgKiAge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkuZW5oYW5jZS5Db21wb25lbnRDbGFzc0ZhY3Rvcnl9IGFkZGluZyB0aG9zZQotICAgICAqICBlbmhhbmNlbWVudHMuCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHJvdGVjdGVkIENvbXBvbmVudENsYXNzRmFjdG9yeSBjcmVhdGVDb21wb25lbnRDbGFzc0ZhY3RvcnkoCi0gICAgICAgIElDb21wb25lbnRTcGVjaWZpY2F0aW9uIHNwZWNpZmljYXRpb24sCi0gICAgICAgIENsYXNzIGNvbXBvbmVudENsYXNzKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBDb21wb25lbnRDbGFzc0ZhY3RvcnkoX3Jlc29sdmVyLCBzcGVjaWZpY2F0aW9uLCBjb21wb25lbnRDbGFzcywgX2ZhY3RvcnkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBJbnZva2VkIHRvIHZhbGlkYXRlIHRoYXQgYW4gZW5oYW5jZWQgY2xhc3MgaXMgYWNjZXB0aWJsZS4gIFByaW1hcmlseSwgdGhpcyBpcyB0byBlbnN1cmUKLSAgICAgKiAgdGhhdCB0aGUgY2xhc3MgY29udGFpbnMgbm8gdW5pbXBsZW1lbnRlZCBhYnN0cmFjdCBtZXRob2RzIG9yIGZpZWxkcy4gIE5vcm1hbGx5LAotICAgICAqICB0aGlzIGtpbmQgb2YgY2hlY2tpbmcgaXMgZG9uZSBhdCBjb21waWxlIHRpbWUsIGJ1dCBmb3IgZ2VuZXJhdGVkCi0gICAgICogIGNsYXNzZXMsIHRoZXJlIGlzIG5vIGNvbXBpbGUgdGltZSBjaGVjayAoISkgYW5kIHlvdSBjYW4gZ2V0IHJ1bnRpbWUKLSAgICAgKiAgZXJyb3JzIHdoZW4gYWNjZXNzaW5nIHVuaW1wbGVtZW50ZWQgYWJzdHJhY3QgbWV0aG9kcy4KLSAgICAgKiAKLSAgICAgKgotICAgICAqKi8KLQotICAgIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlRW5oYW5jZWRDbGFzcygKLSAgICAgICAgQ2xhc3Mgc3ViamVjdCwKLSAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSwKLSAgICAgICAgSUNvbXBvbmVudFNwZWNpZmljYXRpb24gc3BlY2lmaWNhdGlvbikKLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gZGVidWcgPSBMT0cuaXNEZWJ1Z0VuYWJsZWQoKTsKLQotICAgICAgICBpZiAoZGVidWcpCi0gICAgICAgICAgICBMT0cuZGVidWcoIlZhbGlkYXRpbmcgIiArIHN1YmplY3QpOwotCi0gICAgICAgIFNldCBpbXBsZW1lbnRlZE1ldGhvZHMgPSBuZXcgSGFzaFNldCgpOwotICAgICAgICBDbGFzcyBjdXJyZW50ID0gc3ViamVjdDsKLQotICAgICAgICB3aGlsZSAodHJ1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgTWV0aG9kIG0gPSBjaGVja0ZvckFic3RyYWN0TWV0aG9kcyhjdXJyZW50LCBpbXBsZW1lbnRlZE1ldGhvZHMpOwotCi0gICAgICAgICAgICBpZiAobSAhPSBudWxsKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIFRhcGVzdHJ5LmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJEZWZhdWx0Q29tcG9uZW50Q2xhc3NFbmhhbmNlci5uby1pbXBsLWZvci1hYnN0cmFjdC1tZXRob2QiLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsgbSwgY3VycmVudCwgY2xhc3NOYW1lLCBzdWJqZWN0LmdldE5hbWUoKX0pLAotICAgICAgICAgICAgICAgICAgICBzcGVjaWZpY2F0aW9uLmdldExvY2F0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgIG51bGwpOwotCi0gICAgICAgICAgICAvLyBBbiBlYXJsaWVyIHZlcnNpb24gb2YgdGhpcyBjb2RlIHdhbGtlZCB0aGUgaW50ZXJmYWNlcyBkaXJlY3RseSwKLSAgICAgICAgICAgIC8vIGJ1dCBpdCBhcHBlYXJzIHRoYXQgaW1wbGVtZW50aW5nIGFuIGludGVyZmFjZSBhY3R1YWxseQotICAgICAgICAgICAgLy8gcHV0cyBhYnN0cmFjdCBtZXRob2QgZGVjbGFyYXRpb25zIGludG8gdGhlIGNsYXNzCi0gICAgICAgICAgICAvLyAoYXQgbGVhc3QsIGluIHRlcm1zIG9mIHdoYXQgZ2V0RGVjbGFyZWRNZXRob2RzKCkgcmV0dXJucykuCi0KLSAgICAgICAgICAgIC8vIE1hcmNoIHVwIHRvIHRoZSBzdXBlciBjbGFzcy4KLQotICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQuZ2V0U3VwZXJjbGFzcygpOwotCi0gICAgICAgICAgICAvLyBPbmNlIGFkdmFuY2VkIHVwIHRvIGEgY29uY3JldGUgY2xhc3MsIHdlIHRydXN0IHRoYXQKLSAgICAgICAgICAgIC8vIHRoZSBjb21waWxlciBkaWQgaXRzIGNoZWNraW5nLgotCi0gICAgICAgICAgICBpZiAoIU1vZGlmaWVyLmlzQWJzdHJhY3QoY3VycmVudC5nZXRNb2RpZmllcnMoKSkpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIC8qKgotICAgICAqICBTZWFyY2hlcyB0aGUgY2xhc3MgZm9yIGFic3RyYWN0IG1ldGhvZHMsIHJldHVybmluZyB0aGUgZmlyc3QgZm91bmQuCi0gICAgICogIFJlY29yZHMgbm9uLWFic3RyYWN0IG1ldGhvZHMgaW4gdGhlIGltcGxlbWVudGVkTWV0aG9kcyBzZXQuCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHJpdmF0ZSBNZXRob2QgY2hlY2tGb3JBYnN0cmFjdE1ldGhvZHMoQ2xhc3MgY3VycmVudCwgU2V0IGltcGxlbWVudGVkTWV0aG9kcykKLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gZGVidWcgPSBMT0cuaXNEZWJ1Z0VuYWJsZWQoKTsKLQotICAgICAgICBpZiAoZGVidWcpCi0gICAgICAgICAgICBMT0cuZGVidWcoIlNlYXJjaGluZyBmb3IgYWJzdHJhY3QgbWV0aG9kcyBpbiAiICsgY3VycmVudCk7Ci0KLSAgICAgICAgTWV0aG9kW10gbWV0aG9kcyA9IGN1cnJlbnQuZ2V0RGVjbGFyZWRNZXRob2RzKCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBNZXRob2QgbSA9IG1ldGhvZHNbaV07Ci0KLSAgICAgICAgICAgIGlmIChkZWJ1ZykKLSAgICAgICAgICAgICAgICBMT0cuZGVidWcoIkNoZWNraW5nICIgKyBtKTsKLQotICAgICAgICAgICAgYm9vbGVhbiBpc0Fic3RyYWN0ID0gTW9kaWZpZXIuaXNBYnN0cmFjdChtLmdldE1vZGlmaWVycygpKTsKLQotICAgICAgICAgICAgTWV0aG9kU2lnbmF0dXJlIHMgPSBuZXcgTWV0aG9kU2lnbmF0dXJlKG0pOwotCi0gICAgICAgICAgICBpZiAoaXNBYnN0cmFjdCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoaW1wbGVtZW50ZWRNZXRob2RzLmNvbnRhaW5zKHMpKQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgICAgICAgIHJldHVybiBtOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbXBsZW1lbnRlZE1ldGhvZHMuYWRkKHMpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2VuaGFuY2UvRW5oYW5jZWRDbGFzc0xvYWRlci5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2VuaGFuY2UvRW5oYW5jZWRDbGFzc0xvYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTYyYjc4Li4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9lbmhhbmNlL0VuaGFuY2VkQ2xhc3NMb2FkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmVuaGFuY2U7Ci0KLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByb3RlY3Rpb25Eb21haW47Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LkFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LlRhcGVzdHJ5OwotCi0vKioKLSAqICBBIGNsYXNzIGxvYWRlciB0aGF0IGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBuZXcgY2xhc3NlcyAKLSAqICBhcyBuZWVkZWQuCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQHNpbmNlIDMuMAotICogCi0gKiovCi0KLXB1YmxpYyBjbGFzcyBFbmhhbmNlZENsYXNzTG9hZGVyIGV4dGVuZHMgQ2xhc3NMb2FkZXIKLXsKLQotICAgIHB1YmxpYyBFbmhhbmNlZENsYXNzTG9hZGVyKENsYXNzTG9hZGVyIHBhcmVudENsYXNzTG9hZGVyKQotICAgIHsKLSAgICAgICAgc3VwZXIocGFyZW50Q2xhc3NMb2FkZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBEZWZpbmVzIHRoZSBuZXcgY2xhc3MuCi0gICAgICogCi0gICAgICogIEB0aHJvd3MgQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uIGlmIGRlZmluaW5nIHRoZSBjbGFzcyBmYWlscy4KLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgQ2xhc3MgZGVmaW5lQ2xhc3MoU3RyaW5nIGVuaGFuY2VkQ2xhc3NOYW1lLCBieXRlW10gYnl0ZUNvZGUsIFByb3RlY3Rpb25Eb21haW4gZG9tYWluKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBkZWZpbmVDbGFzcyhlbmhhbmNlZENsYXNzTmFtZSwgYnl0ZUNvZGUsIDAsIGJ5dGVDb2RlLmxlbmd0aCwgZG9tYWluKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIGV4KQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIFRhcGVzdHJ5LmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgIkVuaGFuY2VkQ2xhc3NMb2FkZXIudW5hYmxlLXRvLWRlZmluZS1jbGFzcyIsCi0gICAgICAgICAgICAgICAgICAgIGVuaGFuY2VkQ2xhc3NOYW1lLAotICAgICAgICAgICAgICAgICAgICBleC5nZXRNZXNzYWdlKCkpLAotICAgICAgICAgICAgICAgIGV4KTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9lbmhhbmNlL0lFbmhhbmNlZENsYXNzLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZW5oYW5jZS9JRW5oYW5jZWRDbGFzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDMyOTkwLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9lbmhhbmNlL0lFbmhhbmNlZENsYXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5lbmhhbmNlOwotCi0vKioKLSAqICBUaGlzIGludGVyZmFjZSByZXByZXNlbnRzIGEgY2xhc3MgdG8gYmUgZW5oYW5jZWQuIEFuIGltcGxlbWVudGF0aW9uIAotICogIGlzIGdlbmVyYXRlZCBieSB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5lbmhhbmNlLklFbmhhbmNlZENsYXNzRmFjdG9yeX0gCi0gKiAgYW5kIGlzIHNwZWNpZmljIHRvIHRoZSBzZWxlY3RlZCBzeXN0ZW0gb2YgZW5oYW5jZW1lbnQuCi0gKiAKLSAqICBAYXV0aG9yIE1pbmRicmlkZ2UKLSAqICBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUVuaGFuY2VkQ2xhc3MKLXsKLSAgICBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQWRkcyBhbiBlbmhhbmNlciBmb3IgY3JlYXRpbmcgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eS4KLSAgICAgKi8KLSAgICB2b2lkIGNyZWF0ZVByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyBwcm9wZXJ0eVR5cGUpOwotCi0gICAgdm9pZCBjcmVhdGVQcm9wZXJ0eSgKLSAgICAgICAgU3RyaW5nIHByb3BlcnR5TmFtZSwKLSAgICAgICAgU3RyaW5nIHByb3BlcnR5VHlwZSwKLSAgICAgICAgU3RyaW5nIHJlYWRNZXRob2ROYW1lLAotICAgICAgICBib29sZWFuIHBlcnNpc3RlbnQpOwotCi0gICAgdm9pZCBjcmVhdGVBdXRvUGFyYW1ldGVyKAotICAgICAgICBTdHJpbmcgcHJvcGVydHlOYW1lLAotICAgICAgICBTdHJpbmcgcGFyYW1ldGVyTmFtZSwKLSAgICAgICAgU3RyaW5nIHR5cGVDbGFzc05hbWUsCi0gICAgICAgIFN0cmluZyByZWFkTWV0aG9kTmFtZSk7Ci0KLSAgICBib29sZWFuIGhhc01vZGlmaWNhdGlvbnMoKTsKLQotICAgIENsYXNzIGNyZWF0ZUVuaGFuY2VkU3ViY2xhc3MoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBBZGRzIGFuIGFyYml0cmFyeSBlbmhhbmNlci4KLSAgICAgKi8KLSAgICB2b2lkIGFkZEVuaGFuY2VyKElFbmhhbmNlciBlbmhhbmNlcik7Ci19CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZW5oYW5jZS9JRW5oYW5jZWRDbGFzc0ZhY3RvcnkuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9lbmhhbmNlL0lFbmhhbmNlZENsYXNzRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Mjg3MjcwLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9lbmhhbmNlL0lFbmhhbmNlZENsYXNzRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuZW5oYW5jZTsKLQotLyoqCi0gKiAgQW4gaW50ZXJmYWNlIGRlZmluaW5nIHRoZSBmYWN0b3J5IGZvciBjcmVhdGlvbiBvZiBuZXcgb2JqZWN0cyByZXByZXNlbnRpbmcgCi0gKiAgYW4gZW5oYW5jZWQgY2xhc3MuIFRoaXMgb2JqZWN0IGlzIHVzZWQgZXNzZW50aWFsbHkgYXMgYSBzaW5nbGV0b24gLS0gdGhlcmUgaXMKLSAqICB0eXBpY2FsbHkgb25seSBvbmUgaW5zdGFuY2Ugb2YgaXQgaW4gdGhlIHN5c3RlbS4gQ29tbW9uIGZ1bmN0aW9uYWxpdHksIHN1Y2ggYXMKLSAqICBjYWNoZXMsIGNhbiBiZSBzdG9yZWQgaGVyZS4KLSAqIAotICogIEBhdXRob3IgTWluZGJyaWRnZQotICogIEB2ZXJzaW9uICRJZCQKLSAqICBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUVuaGFuY2VkQ2xhc3NGYWN0b3J5Ci17Ci0gICAgdm9pZCByZXNldCgpOwotICAgIElFbmhhbmNlZENsYXNzIGNyZWF0ZUVuaGFuY2VkQ2xhc3MoU3RyaW5nIGNsYXNzTmFtZSwgQ2xhc3MgcGFyZW50Q2xhc3MpOwotfQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2VuaGFuY2UvSUVuaGFuY2VyLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZW5oYW5jZS9JRW5oYW5jZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk0N2YzNS4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZW5oYW5jZS9JRW5oYW5jZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmVuaGFuY2U7Ci0KLS8qKgotICogIERlZmluZXMgYW4gb2JqZWN0IHdoaWNoIG1heSB3b3JrIHdpdGggYSAKLSAqICB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5lbmhhbmNlLkNvbXBvbmVudENsYXNzRmFjdG9yeX0KLSAqICB0byBjcmVhdGUgYW4gZW5oYW5jZW1lbnQgdG8gYSBjbGFzcy4gIFRoZXNlIGVuaGFuY2VtZW50cyBhcmUKLSAqICB0eXBpY2FsbHkgaW4gdGhlIGZvcm0gb2YgYWRkaW5nIG5ldyBmaWVsZHMgYW5kIG1ldGhvZHMuCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQHNpbmNlIDMuMAotICoKLSAqKi8KLQotcHVibGljIGludGVyZmFjZSBJRW5oYW5jZXIKLXsKLSAgICBwdWJsaWMgdm9pZCBwZXJmb3JtRW5oYW5jZW1lbnQoSUVuaGFuY2VkQ2xhc3MgZW5oYW5jZWRDbGFzcyk7Ci19CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZW5oYW5jZS9KYXZhQ2xhc3NNYXBwaW5nLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZW5oYW5jZS9KYXZhQ2xhc3NNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjMmFhMTguLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2VuaGFuY2UvSmF2YUNsYXNzTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuZW5oYW5jZTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogIEBhdXRob3IgTWluZGJyaWRnZQotICogIEB2ZXJzaW9uICRJZCQKLSAqICBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhQ2xhc3NNYXBwaW5nCi17Ci0KLSAgICAvKioKLSAgICAgKiAgTWFwIG9mIHR5cGUgKGFzIENsYXNzKSwga2V5ZWQgb24gdHlwZSBuYW1lLiAKLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwcml2YXRlIE1hcCBfdHlwZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQotICAgIHsKLSAgICAgICAgcmVjb3JkVHlwZSgiYm9vbGVhbiIsIGJvb2xlYW4uY2xhc3MpOwotICAgICAgICByZWNvcmRUeXBlKCJib29sZWFuW10iLCBib29sZWFuW10uY2xhc3MpOwotCi0gICAgICAgIHJlY29yZFR5cGUoInNob3J0Iiwgc2hvcnQuY2xhc3MpOwotICAgICAgICByZWNvcmRUeXBlKCJzaG9ydFtdIiwgc2hvcnRbXS5jbGFzcyk7Ci0KLSAgICAgICAgcmVjb3JkVHlwZSgiaW50IiwgaW50LmNsYXNzKTsKLSAgICAgICAgcmVjb3JkVHlwZSgiaW50W10iLCBpbnRbXS5jbGFzcyk7Ci0KLSAgICAgICAgcmVjb3JkVHlwZSgibG9uZyIsIGxvbmcuY2xhc3MpOwotICAgICAgICByZWNvcmRUeXBlKCJsb25nW10iLCBsb25nW10uY2xhc3MpOwotCi0gICAgICAgIHJlY29yZFR5cGUoImZsb2F0IiwgZmxvYXQuY2xhc3MpOwotICAgICAgICByZWNvcmRUeXBlKCJmbG9hdFtdIiwgZmxvYXRbXS5jbGFzcyk7Ci0KLSAgICAgICAgcmVjb3JkVHlwZSgiZG91YmxlIiwgZG91YmxlLmNsYXNzKTsKLSAgICAgICAgcmVjb3JkVHlwZSgiZG91YmxlW10iLCBkb3VibGVbXS5jbGFzcyk7Ci0KLSAgICAgICAgcmVjb3JkVHlwZSgiY2hhciIsIGNoYXIuY2xhc3MpOwotICAgICAgICByZWNvcmRUeXBlKCJjaGFyW10iLCBjaGFyW10uY2xhc3MpOwotCi0gICAgICAgIHJlY29yZFR5cGUoImJ5dGUiLCBieXRlLmNsYXNzKTsKLSAgICAgICAgcmVjb3JkVHlwZSgiYnl0ZVtdIiwgYnl0ZVtdLmNsYXNzKTsKLQotICAgICAgICByZWNvcmRUeXBlKCJqYXZhLmxhbmcuT2JqZWN0IiwgT2JqZWN0LmNsYXNzKTsKLSAgICAgICAgcmVjb3JkVHlwZSgiamF2YS5sYW5nLk9iamVjdFtdIiwgT2JqZWN0W10uY2xhc3MpOwotCi0gICAgICAgIHJlY29yZFR5cGUoImphdmEubGFuZy5TdHJpbmciLCBTdHJpbmcuY2xhc3MpOwotICAgICAgICByZWNvcmRUeXBlKCJqYXZhLmxhbmcuU3RyaW5nW10iLCBTdHJpbmdbXS5jbGFzcyk7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCByZWNvcmRUeXBlKFN0cmluZyBuYW1lLCBDbGFzcyB0eXBlKQotICAgIHsKLSAgICAgICAgX3R5cGVNYXAucHV0KG5hbWUsIHR5cGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBDbGFzcyBnZXRUeXBlKFN0cmluZyBuYW1lKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChDbGFzcykgX3R5cGVNYXAuZ2V0KG5hbWUpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2VuaGFuY2UvTWV0aG9kU2lnbmF0dXJlLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZW5oYW5jZS9NZXRob2RTaWduYXR1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FiYmU5ZS4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZW5oYW5jZS9NZXRob2RTaWduYXR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5lbmhhbmNlOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuYnVpbGRlci5FcXVhbHNCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLmJ1aWxkZXIuSGFzaENvZGVCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLmJ1aWxkZXIuVG9TdHJpbmdCdWlsZGVyOwotCi0vKioKLSAqICBUaGUgc2lnbmF0dXJlIG9mIGEge0BsaW5rIGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZH0sIGluY2x1ZGluZwotICogIHRoZSBuYW1lLCByZXR1cm4gdHlwZSwgYW5kIHBhcmFtZXRlciB0eXBlcy4gIFVzZWQgd2hlbiBjaGVja2luZwotICogIGZvciB1bmltcGxlbWVudGVkIG1ldGhvZHMgaW4gZW5oYW5jZWQgc3ViY2xhc3Nlcy4gIAotICogCi0gKiAgPHA+Ci0gKiAgVGhlIG1vZGlmaWVycyAoaS5lLiwgInB1YmxpYyIsICJhYnN0cmFjdCIpIGFuZCB0aHJvd24KLSAqICBleGNlcHRpb25zIGFyZSBub3QgcmVsZXZhbnQgZm9yIHRoZXNlIHB1cnBvc2VzLCBhbmQKLSAqICBhcmUgbm90IHBhcnQgb2YgdGhlIHNpZ25hdHVyZS4KLSAqIAotICogIDxwPgotICogIEluc3RhbmNlcyBvZiBNZXRob2RTaWduYXR1cmUgYXJlIGltbXV0YWJsZSBhbmQKLSAqICBpbXBsZW1lbnQgZXF1YWxzKCkgYW5kIGhhc2hDb2RlKCkgcHJvcGVybHkgZm9yIHVzZQotICogIGluIFNldHMgb3IgYXMgTWFwIGtleXMuCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQHNpbmNlIDMuMAotICoKLSAqKi8KLQotcHVibGljIGNsYXNzIE1ldGhvZFNpZ25hdHVyZQotewotICAgIHByaXZhdGUgU3RyaW5nIF9uYW1lOwotICAgIHByaXZhdGUgQ2xhc3MgX3JldHVyblR5cGU7Ci0gICAgcHJpdmF0ZSBDbGFzc1tdIF9wYXJhbWV0ZXJUeXBlczsKLSAgICBwcml2YXRlIGludCBfaGFzaENvZGUgPSAwOwotCi0gICAgcHVibGljIE1ldGhvZFNpZ25hdHVyZShNZXRob2QgbSkKLSAgICB7Ci0gICAgICAgIF9uYW1lID0gbS5nZXROYW1lKCk7Ci0gICAgICAgIF9yZXR1cm5UeXBlID0gbS5nZXRSZXR1cm5UeXBlKCk7Ci0KLSAgICAgICAgLy8gZ2V0UGFyYW1ldGVyVHlwZXMoKSByZXR1cm5zIGEgY29weSBmb3IgdXMgdG8ga2VlcC4KLQotICAgICAgICBfcGFyYW1ldGVyVHlwZXMgPSBtLmdldFBhcmFtZXRlclR5cGVzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopCi0gICAgewotICAgICAgICBpZiAob2JqID09IG51bGwgfHwgIShvYmogaW5zdGFuY2VvZiBNZXRob2RTaWduYXR1cmUpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIE1ldGhvZFNpZ25hdHVyZSBvdGhlciA9IChNZXRob2RTaWduYXR1cmUpIG9iajsKLQotICAgICAgICBFcXVhbHNCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgRXF1YWxzQnVpbGRlcigpOwotICAgICAgICBidWlsZGVyLmFwcGVuZChfbmFtZSwgb3RoZXIuX25hbWUpOwotICAgICAgICBidWlsZGVyLmFwcGVuZChfcmV0dXJuVHlwZSwgb3RoZXIuX3JldHVyblR5cGUpOwotICAgICAgICBidWlsZGVyLmFwcGVuZChfcGFyYW1ldGVyVHlwZXMsIG90aGVyLl9wYXJhbWV0ZXJUeXBlcyk7Ci0KLSAgICAgICAgcmV0dXJuIGJ1aWxkZXIuaXNFcXVhbHMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkKLSAgICB7Ci0gICAgICAgIGlmIChfaGFzaENvZGUgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgSGFzaENvZGVCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgSGFzaENvZGVCdWlsZGVyKDI1MywgOTcpOwotCi0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZChfbmFtZSk7Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZChfcmV0dXJuVHlwZSk7Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZChfcGFyYW1ldGVyVHlwZXMpOwotCi0gICAgICAgICAgICBfaGFzaENvZGUgPSBidWlsZGVyLnRvSGFzaENvZGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBfaGFzaENvZGU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gICAgewotICAgICAgICBUb1N0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBUb1N0cmluZ0J1aWxkZXIodGhpcyk7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJuYW1lIiwgX25hbWUpOwotICAgICAgICBidWlsZGVyLmFwcGVuZCgicmV0dXJuVHlwZSIsIF9yZXR1cm5UeXBlKTsKLSAgICAgICAgYnVpbGRlci5hcHBlbmQoInBhcmFtZXRlclR5cGVzIiwgX3BhcmFtZXRlclR5cGVzKTsKLQotICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2VuaGFuY2UvTm9PcEVuaGFuY2VyLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZW5oYW5jZS9Ob09wRW5oYW5jZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDViOWMwOS4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZW5oYW5jZS9Ob09wRW5oYW5jZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmVuaGFuY2U7Ci0KLS8qKgotICogRG9lcyBub3RoaW5nOyBhZGRlZCB0byBhbGwgYWJzdHJhY3QgY2xhc3NlcyB0byBmb3JjZSB0aGVtIHRvIGJlIHN1YmNsYXNzZWQgYXMgY29uY3JldGUKLSAqIChldmVuIGlmIG5vIG90aGVyIGVuaGFuY2VtZW50IHRha2VzIHBsYWNlKS4KLSAqCi0gKiBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiBAc2luY2QgMy4wCi0gKi8KLXB1YmxpYyBjbGFzcyBOb09wRW5oYW5jZXIgaW1wbGVtZW50cyBJRW5oYW5jZXIKLXsKLQotCS8qKgotCSAqIERvZXMgbm90aGluZy4KLQkgKi8KLSAgICBwdWJsaWMgdm9pZCBwZXJmb3JtRW5oYW5jZW1lbnQoSUVuaGFuY2VkQ2xhc3MgZW5oYW5jZWRDbGFzcykKLSAgICB7Ci0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9lbmhhbmNlL2phdmFzc2lzdC9DbGFzc01hcHBpbmcuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9lbmhhbmNlL2phdmFzc2lzdC9DbGFzc01hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM5OWI4My4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZW5oYW5jZS9qYXZhc3Npc3QvQ2xhc3NNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuZW5oYW5jZS5qYXZhc3Npc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXNzaXN0LkNsYXNzUG9vbDsKLWltcG9ydCBqYXZhc3Npc3QuQ3RDbGFzczsKLWltcG9ydCBqYXZhc3Npc3QuTm90Rm91bmRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmVuaGFuY2UuQ29kZUdlbmVyYXRpb25FeGNlcHRpb247Ci0KLS8qKgotICogIEBhdXRob3IgTWluZGJyaWRnZQotICogIEB2ZXJzaW9uICRJZCQKLSAqICBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDbGFzc01hcHBpbmcKLXsKLQotICAgIC8qKgotICAgICAqICBNYXAgb2YgdHlwZSAoYXMgVHlwZSksIGtleWVkIG9uIHR5cGUgbmFtZS4KLSAgICAgKiAKLSAgICAgKiAgVGhpcyBzaG91bGQgYmUga2VwdCBpbiBzeW5jaCB3aXRoIFBhcmFtZXRlck1hbmFnZXIsIHdoaWNoIG1haW50YWlucwotICAgICAqICBhIHNpbWlsYXIgbGlzdC4KLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwcml2YXRlIE1hcCBfb2JqZWN0VHlwZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgcHJpdmF0ZSBDbGFzc1Bvb2wgX2NsYXNzUG9vbDsKLQotICAgIHB1YmxpYyBDbGFzc01hcHBpbmcoQ2xhc3NQb29sIGNsYXNzUG9vbCkKLSAgICB7Ci0gICAgICAgIF9jbGFzc1Bvb2wgPSBjbGFzc1Bvb2w7Ci0gICAgICAgIGluaXRpYWxpemUoKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkKLSAgICB7Ci0gICAgICAgIHJlY29yZFR5cGUoImJvb2xlYW4iLCBDdENsYXNzLmJvb2xlYW5UeXBlKTsKLSAgICAgICAgcmVjb3JkVHlwZSgic2hvcnQiLCBDdENsYXNzLnNob3J0VHlwZSk7Ci0gICAgICAgIHJlY29yZFR5cGUoImludCIsIEN0Q2xhc3MuaW50VHlwZSk7Ci0gICAgICAgIHJlY29yZFR5cGUoImxvbmciLCBDdENsYXNzLmxvbmdUeXBlKTsKLSAgICAgICAgcmVjb3JkVHlwZSgiZmxvYXQiLCBDdENsYXNzLmZsb2F0VHlwZSk7Ci0gICAgICAgIHJlY29yZFR5cGUoImRvdWJsZSIsIEN0Q2xhc3MuZG91YmxlVHlwZSk7Ci0gICAgICAgIHJlY29yZFR5cGUoImNoYXIiLCBDdENsYXNzLmNoYXJUeXBlKTsKLSAgICAgICAgcmVjb3JkVHlwZSgiYnl0ZSIsIEN0Q2xhc3MuYnl0ZVR5cGUpOwotICAgICAgICAKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGxvYWRUeXBlKCJib29sZWFuW10iKTsKLSAgICAgICAgICAgIGxvYWRUeXBlKCJzaG9ydFtdIik7Ci0gICAgICAgICAgICBsb2FkVHlwZSgiaW50W10iKTsKLSAgICAgICAgICAgIGxvYWRUeXBlKCJsb25nW10iKTsKLSAgICAgICAgICAgIGxvYWRUeXBlKCJmbG9hdFtdIik7Ci0gICAgICAgICAgICBsb2FkVHlwZSgiZG91YmxlW10iKTsKLSAgICAgICAgICAgIGxvYWRUeXBlKCJjaGFyW10iKTsKLSAgICAgICAgICAgIGxvYWRUeXBlKCJieXRlW10iKTsKLQotICAgICAgICAgICAgbG9hZFR5cGUoImphdmEubGFuZy5PYmplY3QiKTsKLSAgICAgICAgICAgIGxvYWRUeXBlKCJqYXZhLmxhbmcuT2JqZWN0W10iKTsKLQotICAgICAgICAgICAgbG9hZFR5cGUoImphdmEubGFuZy5TdHJpbmciKTsKLSAgICAgICAgICAgIGxvYWRUeXBlKCJqYXZhLmxhbmcuU3RyaW5nW10iKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoTm90Rm91bmRFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gVGhpcyBleGNlcHRpb24gc2hvdWxkIG5vdCBvY2N1ciBzaW5jZSB0aGUgdHlwZXMgYWJvdmUgbXVzdCBleGlzdC4KLSAgICAgICAgICAgIC8vIE5ldmVydGhlbGVzcy4uLgotICAgICAgICAgICAgdGhyb3cgbmV3IENvZGVHZW5lcmF0aW9uRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbG9hZFR5cGUoU3RyaW5nIHR5cGUpIHRocm93cyBOb3RGb3VuZEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgQ3RDbGFzcyBvYmplY3RUeXBlID0gX2NsYXNzUG9vbC5nZXQodHlwZSk7Ci0gICAgICAgIF9vYmplY3RUeXBlTWFwLnB1dCh0eXBlLCBvYmplY3RUeXBlKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgcmVjb3JkVHlwZShTdHJpbmcgdHlwZSwgQ3RDbGFzcyBvYmplY3RUeXBlKQotICAgIHsKLSAgICAgICAgX29iamVjdFR5cGVNYXAucHV0KHR5cGUsIG9iamVjdFR5cGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBDdENsYXNzIGdldFR5cGUoU3RyaW5nIHR5cGUpCi0gICAgewotICAgICAgICByZXR1cm4gKEN0Q2xhc3MpIF9vYmplY3RUeXBlTWFwLmdldCh0eXBlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZW5oYW5jZS9qYXZhc3Npc3QvQ3JlYXRlQXV0b1BhcmFtZXRlckVuaGFuY2VyLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZW5oYW5jZS9qYXZhc3Npc3QvQ3JlYXRlQXV0b1BhcmFtZXRlckVuaGFuY2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxYmFmYzcuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2VuaGFuY2UvamF2YXNzaXN0L0NyZWF0ZUF1dG9QYXJhbWV0ZXJFbmhhbmNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIwICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmVuaGFuY2UuamF2YXNzaXN0OwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGphdmFzc2lzdC5DYW5ub3RDb21waWxlRXhjZXB0aW9uOwotaW1wb3J0IGphdmFzc2lzdC5DdENsYXNzOwotaW1wb3J0IGphdmFzc2lzdC5DdE1ldGhvZDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuVGFwZXN0cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5lbmhhbmNlLkNvZGVHZW5lcmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuZW5oYW5jZS5JRW5oYW5jZWRDbGFzczsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmVuaGFuY2UuSUVuaGFuY2VyOwotCi0vKioKLSAqICBDcmVhdGVzIGEgc3ludGhldGljIHByb3BlcnR5IGZvciBhCi0gKiAge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkuc3BlYy5EaXJlY3Rpb24jQVVUT30KLSAqICBwYXJhbWV0ZXIuCi0gKgotICogIEBhdXRob3IgTWluZGJyaWRnZQotICogIEB2ZXJzaW9uICRJZCQKLSAqICBAc2luY2UgMy4wCi0gKgotICoqLwotCi1wdWJsaWMgY2xhc3MgQ3JlYXRlQXV0b1BhcmFtZXRlckVuaGFuY2VyIGltcGxlbWVudHMgSUVuaGFuY2VyCi17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIExPRyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKENyZWF0ZUF1dG9QYXJhbWV0ZXJFbmhhbmNlci5jbGFzcyk7Ci0KLSAgICAvKioKLSAgICAgKiAgVGhlIGNvZGUgdGVtcGxhdGUgZm9yIHRoZSBwYXJhbWV0ZXIgYWNjZXNzb3IgbWV0aG9kLiAgICAKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+Ci0gICAgICogIExlZ2VuZDogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxicj4KLSAgICAgKiAgICAgIHswfSA9IHJlYWRCaW5kaW5nTWV0aG9kTmFtZSAgICAgPGJyPgotICAgICAqICAgICAgezF9ID0gYmluZGluZyB2YWx1ZSBhY2Nlc3NvciAgICA8YnI+Ci0gICAgICogICAgICB7Mn0gPSBjYXN0IChpZiBuZWVkZWQpICAgICAgICAgIDxicj4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTUVURVJfQUNDRVNTT1JfVEVNUExBVEUgPQotICAgICAgICAiIgotICAgICAgICAgICAgKyAiJ3snIgotICAgICAgICAgICAgKyAiICBvcmcuYXBhY2hlLnRhcGVzdHJ5LklCaW5kaW5nIGJpbmRpbmcgPSB7MH0oKTsiCi0gICAgICAgICAgICArICIgIHJldHVybiB7Mn0gYmluZGluZy57MX0oKTsgIgotICAgICAgICAgICAgKyAiJ30nIjsKLQotICAgIC8qKgotICAgICAqICBUaGUgY29kZSB0ZW1wbGF0ZSBmb3IgdGhlIHBhcmFtZXRlciBtdXRhdG9yIG1ldGhvZC4gICAgCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPgotICAgICAqICBMZWdlbmQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnI+Ci0gICAgICogICAgICB7MH0gPSByZWFkQmluZGluZ01ldGhvZE5hbWUgICAgIDxicj4KLSAgICAgKiAgICAgIHsxfSA9IGJpbmRpbmcgdmFsdWUgbXV0YXRvciAgICAgPGJyPgotICAgICAqICAgICAgezJ9ID0gdmFsdWUgY2FzdAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNRVRFUl9NVVRBVE9SX1RFTVBMQVRFID0KLSAgICAgICAgIiIKLSAgICAgICAgICAgICsgIid7JyIKLSAgICAgICAgICAgICsgIiAgb3JnLmFwYWNoZS50YXBlc3RyeS5JQmluZGluZyBiaW5kaW5nID0gezB9KCk7IgotICAgICAgICAgICAgKyAiICBiaW5kaW5nLnsxfSh7Mn0gJDEpOyAiCi0gICAgICAgICAgICArICInfSciOwotCi0gICAgLyoqCi0gICAgICogIFRoZSBsaXN0IG9mIHR5cGVzIHRoYXQgaGF2ZSBhY2Nlc3NvcnMgYW5kIG11dGF0b3JzIAotICAgICAqICBvdGhlciB0aGFuIGdldE9iamVjdCgpL3NldE9iamVjdC4KLSAgICAgKiAgVGhlIGtleSBpbiB0aGUgTWFwIGlzIHRoZSB0eXBlLCB0aGUgdmFsdWUgaXMgdGhlIHByb3BlcnR5IG5hbWUgaW4gSUJpbmRpbmcgCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIFNQRUNJQUxfQklORElOR19UWVBFUyA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICBzdGF0aWMgewotICAgICAgICBTUEVDSUFMX0JJTkRJTkdfVFlQRVMucHV0KCJib29sZWFuIiwgImJvb2xlYW4iKTsKLSAgICAgICAgU1BFQ0lBTF9CSU5ESU5HX1RZUEVTLnB1dCgiaW50IiwgImludCIpOwotICAgICAgICBTUEVDSUFMX0JJTkRJTkdfVFlQRVMucHV0KCJkb3VibGUiLCAiZG91YmxlIik7Ci0gICAgICAgIFNQRUNJQUxfQklORElOR19UWVBFUy5wdXQoImphdmEubGFuZy5TdHJpbmciLCAic3RyaW5nIik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIFZBTFVFX0NBU1RfVFlQRVMgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgc3RhdGljIHsKLSAgICAgICAgVkFMVUVfQ0FTVF9UWVBFUy5wdXQoImJ5dGUiLCAiKCR3KSIpOwotICAgICAgICBWQUxVRV9DQVNUX1RZUEVTLnB1dCgibG9uZyIsICIoJHcpIik7Ci0gICAgICAgIFZBTFVFX0NBU1RfVFlQRVMucHV0KCJzaG9ydCIsICIoJHcpIik7Ci0gICAgICAgIFZBTFVFX0NBU1RfVFlQRVMucHV0KCJjaGFyIiwgIigkdykiKTsKLSAgICAgICAgVkFMVUVfQ0FTVF9UWVBFUy5wdXQoImZsb2F0IiwgIigkdykiKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEVuaGFuY2VkQ2xhc3MgX2VuaGFuY2VkQ2xhc3M7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgX3Byb3BlcnR5TmFtZTsKLSAgICBwcml2YXRlIFN0cmluZyBfcGFyYW1ldGVyTmFtZTsKLSAgICBwcml2YXRlIEN0Q2xhc3MgX3R5cGU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgX3JlYWRNZXRob2ROYW1lOwotCi0gICAgcHVibGljIENyZWF0ZUF1dG9QYXJhbWV0ZXJFbmhhbmNlcigKLSAgICAgICAgRW5oYW5jZWRDbGFzcyBlbmhhbmNlZENsYXNzLAotICAgICAgICBTdHJpbmcgcHJvcGVydHlOYW1lLAotICAgICAgICBTdHJpbmcgcGFyYW1ldGVyTmFtZSwKLSAgICAgICAgQ3RDbGFzcyB0eXBlLAotICAgICAgICBTdHJpbmcgcmVhZE1ldGhvZE5hbWUpCi0gICAgewotICAgICAgICBfZW5oYW5jZWRDbGFzcyA9IGVuaGFuY2VkQ2xhc3M7Ci0gICAgICAgIF9wcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWU7Ci0gICAgICAgIF9wYXJhbWV0ZXJOYW1lID0gcGFyYW1ldGVyTmFtZTsKLSAgICAgICAgX3R5cGUgPSB0eXBlOwotICAgICAgICBfcmVhZE1ldGhvZE5hbWUgPSByZWFkTWV0aG9kTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwZXJmb3JtRW5oYW5jZW1lbnQoSUVuaGFuY2VkQ2xhc3MgZW5oYW5jZWRDbGFzcykKLSAgICB7Ci0gICAgICAgIGlmIChMT0cuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgICAgIExPRy5kZWJ1ZygiQ3JlYXRpbmcgYXV0byBwcm9wZXJ0eTogIiArIF9wcm9wZXJ0eU5hbWUpOwotCi0gICAgICAgIEVuaGFuY2VkQ2xhc3MgamFFbmhhbmNlZENsYXNzID0gKEVuaGFuY2VkQ2xhc3MpIGVuaGFuY2VkQ2xhc3M7Ci0gICAgICAgIENsYXNzRmFicmljYXRvciBjZiA9IGphRW5oYW5jZWRDbGFzcy5nZXRDbGFzc0ZhYnJpY2F0b3IoKTsKLQotICAgICAgICBTdHJpbmcgcmVhZEJpbmRpbmdNZXRob2ROYW1lID0KLSAgICAgICAgICAgIGNmLmJ1aWxkTWV0aG9kTmFtZSgiZ2V0IiwgX3BhcmFtZXRlck5hbWUgKyBUYXBlc3RyeS5QQVJBTUVURVJfUFJPUEVSVFlfTkFNRV9TVUZGSVgpOwotCi0gICAgICAgIGNyZWF0ZVJlYWRNZXRob2QoY2YsIHJlYWRCaW5kaW5nTWV0aG9kTmFtZSk7Ci0gICAgICAgIGNyZWF0ZVdyaXRlTWV0aG9kKGNmLCByZWFkQmluZGluZ01ldGhvZE5hbWUpOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldFNwZWNpYWxCaW5kaW5nVHlwZSgpCi0gICAgewotICAgICAgICBTdHJpbmcgdHlwZU5hbWUgPSBfdHlwZS5nZXROYW1lKCk7Ci0gICAgICAgIHJldHVybiAoU3RyaW5nKSBTUEVDSUFMX0JJTkRJTkdfVFlQRVMuZ2V0KHR5cGVOYW1lKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRWYWx1ZUNhc3RUeXBlKCkKLSAgICB7Ci0gICAgICAgIFN0cmluZyB0eXBlTmFtZSA9IF90eXBlLmdldE5hbWUoKTsKLQotICAgICAgICByZXR1cm4gKFN0cmluZykgVkFMVUVfQ0FTVF9UWVBFUy5nZXQodHlwZU5hbWUpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVSZWFkTWV0aG9kKENsYXNzRmFicmljYXRvciBjZiwgU3RyaW5nIHJlYWRCaW5kaW5nTWV0aG9kTmFtZSkKLSAgICB7Ci0gICAgICAgIFN0cmluZyBjYXN0VG9UeXBlOwotICAgICAgICBTdHJpbmcgYmluZGluZ1ZhbHVlQWNjZXNzb3I7Ci0KLSAgICAgICAgU3RyaW5nIHNwZWNpYWxCaW5kaW5nVHlwZSA9IGdldFNwZWNpYWxCaW5kaW5nVHlwZSgpOwotICAgICAgICBpZiAoc3BlY2lhbEJpbmRpbmdUeXBlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc3RUb1R5cGUgPSAiIjsKLSAgICAgICAgICAgIGJpbmRpbmdWYWx1ZUFjY2Vzc29yID0gY2YuYnVpbGRNZXRob2ROYW1lKCJnZXQiLCBzcGVjaWFsQmluZGluZ1R5cGUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgY2FzdFRvVHlwZSA9ICIoJHIpIjsKLSAgICAgICAgICAgIGJpbmRpbmdWYWx1ZUFjY2Vzc29yID0gImdldE9iamVjdCI7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgcmVhZE1ldGhvZEJvZHkgPQotICAgICAgICAgICAgTWVzc2FnZUZvcm1hdC5mb3JtYXQoCi0gICAgICAgICAgICAgICAgUEFSQU1FVEVSX0FDQ0VTU09SX1RFTVBMQVRFLAotICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7IHJlYWRCaW5kaW5nTWV0aG9kTmFtZSwgYmluZGluZ1ZhbHVlQWNjZXNzb3IsIGNhc3RUb1R5cGUgfSk7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIEN0TWV0aG9kIG1ldGhvZCA9IGNmLmNyZWF0ZUFjY2Vzc29yKF90eXBlLCBfcHJvcGVydHlOYW1lLCBfcmVhZE1ldGhvZE5hbWUpOwotICAgICAgICAgICAgbWV0aG9kLnNldEJvZHkocmVhZE1ldGhvZEJvZHkpOwotICAgICAgICAgICAgY2YuYWRkTWV0aG9kKG1ldGhvZCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKENhbm5vdENvbXBpbGVFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IENvZGVHZW5lcmF0aW9uRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVdyaXRlTWV0aG9kKENsYXNzRmFicmljYXRvciBjZiwgU3RyaW5nIHJlYWRCaW5kaW5nTWV0aG9kTmFtZSkKLSAgICB7Ci0gICAgICAgIFN0cmluZyBiaW5kaW5nVmFsdWVBY2Nlc3NvcjsKLSAgICAgICAgU3RyaW5nIHZhbHVlQ2FzdCA9ICIiOwotCi0gICAgICAgIFN0cmluZyBzcGVjaWFsQmluZGluZ1R5cGUgPSBnZXRTcGVjaWFsQmluZGluZ1R5cGUoKTsKLSAgICAgICAgaWYgKHNwZWNpYWxCaW5kaW5nVHlwZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBiaW5kaW5nVmFsdWVBY2Nlc3NvciA9IGNmLmJ1aWxkTWV0aG9kTmFtZSgic2V0Iiwgc3BlY2lhbEJpbmRpbmdUeXBlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJpbmRpbmdWYWx1ZUFjY2Vzc29yID0gInNldE9iamVjdCI7Ci0KLSAgICAgICAgICAgIFN0cmluZyBjYXN0Rm9yVHlwZSA9IGdldFZhbHVlQ2FzdFR5cGUoKTsKLQotICAgICAgICAgICAgaWYgKGNhc3RGb3JUeXBlICE9IG51bGwpCi0gICAgICAgICAgICAgICAgdmFsdWVDYXN0ID0gY2FzdEZvclR5cGU7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgd3JpdGVNZXRob2RCb2R5ID0KLSAgICAgICAgICAgIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAotICAgICAgICAgICAgICAgIFBBUkFNRVRFUl9NVVRBVE9SX1RFTVBMQVRFLAotICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7IHJlYWRCaW5kaW5nTWV0aG9kTmFtZSwgYmluZGluZ1ZhbHVlQWNjZXNzb3IsIHZhbHVlQ2FzdCB9KTsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgQ3RNZXRob2QgbWV0aG9kID0gY2YuY3JlYXRlTXV0YXRvcihfdHlwZSwgX3Byb3BlcnR5TmFtZSk7Ci0gICAgICAgICAgICBtZXRob2Quc2V0Qm9keSh3cml0ZU1ldGhvZEJvZHkpOwotICAgICAgICAgICAgY2YuYWRkTWV0aG9kKG1ldGhvZCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKENhbm5vdENvbXBpbGVFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IENvZGVHZW5lcmF0aW9uRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZW5oYW5jZS9qYXZhc3Npc3QvQ3JlYXRlUHJvcGVydHlFbmhhbmNlci5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2VuaGFuY2UvamF2YXNzaXN0L0NyZWF0ZVByb3BlcnR5RW5oYW5jZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQxNjg3OS4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZW5oYW5jZS9qYXZhc3Npc3QvQ3JlYXRlUHJvcGVydHlFbmhhbmNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuZW5oYW5jZS5qYXZhc3Npc3Q7Ci0KLWltcG9ydCBqYXZhc3Npc3QuQ3RDbGFzczsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuZW5oYW5jZS5JRW5oYW5jZWRDbGFzczsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmVuaGFuY2UuSUVuaGFuY2VyOwotCi0vKioKLSAqICBAYXV0aG9yIE1pbmRicmlkZ2UKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQHNpbmNlIDMuMAotICovCi1wdWJsaWMgY2xhc3MgQ3JlYXRlUHJvcGVydHlFbmhhbmNlciBpbXBsZW1lbnRzIElFbmhhbmNlcgotewotICAgIHByaXZhdGUgU3RyaW5nIF9wcm9wZXJ0eU5hbWU7Ci0gICAgcHJpdmF0ZSBDdENsYXNzIF9wcm9wZXJ0eVR5cGU7Ci0gICAgcHJpdmF0ZSBib29sZWFuIF9wZXJzaXN0ZW50OwotICAgIHByaXZhdGUgU3RyaW5nIF9yZWFkTWV0aG9kTmFtZTsKLQotICAgIHB1YmxpYyBDcmVhdGVQcm9wZXJ0eUVuaGFuY2VyKFN0cmluZyBwcm9wZXJ0eU5hbWUsIEN0Q2xhc3MgcHJvcGVydHlUeXBlKQotICAgIHsKLSAgICAgICAgdGhpcyhwcm9wZXJ0eU5hbWUsIHByb3BlcnR5VHlwZSwgbnVsbCwgZmFsc2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBDcmVhdGVQcm9wZXJ0eUVuaGFuY2VyKAotICAgICAgICBTdHJpbmcgcHJvcGVydHlOYW1lLAotICAgICAgICBDdENsYXNzIHByb3BlcnR5VHlwZSwKLSAgICAgICAgU3RyaW5nIHJlYWRNZXRob2ROYW1lLAotICAgICAgICBib29sZWFuIHBlcnNpc3RlbnQpCi0gICAgewotICAgICAgICBfcHJvcGVydHlOYW1lID0gcHJvcGVydHlOYW1lOwotICAgICAgICBfcHJvcGVydHlUeXBlID0gcHJvcGVydHlUeXBlOwotICAgICAgICBfcmVhZE1ldGhvZE5hbWUgPSByZWFkTWV0aG9kTmFtZTsKLSAgICAgICAgX3BlcnNpc3RlbnQgPSBwZXJzaXN0ZW50OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHBlcmZvcm1FbmhhbmNlbWVudChJRW5oYW5jZWRDbGFzcyBlbmhhbmNlZENsYXNzKQotICAgIHsKLSAgICAgICAgU3RyaW5nIGZpZWxkTmFtZSA9ICJfJCIgKyBfcHJvcGVydHlOYW1lOwotCi0gICAgICAgIEVuaGFuY2VkQ2xhc3MgamFFbmhhbmNlZENsYXNzID0gKEVuaGFuY2VkQ2xhc3MpIGVuaGFuY2VkQ2xhc3M7Ci0gICAgICAgIENsYXNzRmFicmljYXRvciBjbGFzc0ZhYnJpY2F0b3IgPSBqYUVuaGFuY2VkQ2xhc3MuZ2V0Q2xhc3NGYWJyaWNhdG9yKCk7IAotCi0gICAgICAgIGNsYXNzRmFicmljYXRvci5jcmVhdGVGaWVsZChfcHJvcGVydHlUeXBlLCBmaWVsZE5hbWUpOwotICAgICAgICBjbGFzc0ZhYnJpY2F0b3IuY3JlYXRlUHJvcGVydHlBY2Nlc3NvcihfcHJvcGVydHlUeXBlLCBmaWVsZE5hbWUsIF9wcm9wZXJ0eU5hbWUsIF9yZWFkTWV0aG9kTmFtZSk7Ci0gICAgICAgIGNsYXNzRmFicmljYXRvci5jcmVhdGVQcm9wZXJ0eU11dGF0b3IoX3Byb3BlcnR5VHlwZSwgZmllbGROYW1lLCBfcHJvcGVydHlOYW1lLCBfcGVyc2lzdGVudCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZW5oYW5jZS9qYXZhc3Npc3QvRW5oYW5jZWRDbGFzcy5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2VuaGFuY2UvamF2YXNzaXN0L0VuaGFuY2VkQ2xhc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVmMGFkYy4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZW5oYW5jZS9qYXZhc3Npc3QvRW5oYW5jZWRDbGFzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmVuaGFuY2UuamF2YXNzaXN0OwotCi1pbXBvcnQgamF2YXNzaXN0LkNsYXNzUG9vbDsKLWltcG9ydCBqYXZhc3Npc3QuQ3RDbGFzczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuZW5oYW5jZS5CYXNlRW5oYW5jZWRDbGFzczsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmVuaGFuY2UuRW5oYW5jZWRDbGFzc0xvYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmVuaGFuY2UuSUVuaGFuY2VyOwotCi0vKioKLSAqICBSZXByZXNlbnRzIGEgY2xhc3MgdG8gYmUgZW5oYW5jZWQgdXNpbmcgSmF2YXNzaXN0LiAKLSAqIAotICogIEBhdXRob3IgTWluZGJyaWRnZQotICogIEB2ZXJzaW9uICRJZCQKLSAqICBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFbmhhbmNlZENsYXNzIGV4dGVuZHMgQmFzZUVuaGFuY2VkQ2xhc3MKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgTE9HID0gTG9nRmFjdG9yeS5nZXRMb2coRW5oYW5jZWRDbGFzcy5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBfY2xhc3NOYW1lOwotICAgIHByaXZhdGUgQ2xhc3MgX3BhcmVudENsYXNzOwotICAgIHByaXZhdGUgRW5oYW5jZWRDbGFzc0ZhY3RvcnkgX2NsYXNzRmFjdG9yeTsKLQotICAgIHByaXZhdGUgQ2xhc3NGYWJyaWNhdG9yIF9jbGFzc0ZhYnJpY2F0b3IgPSBudWxsOwotCi0gICAgcHVibGljIEVuaGFuY2VkQ2xhc3MoU3RyaW5nIGNsYXNzTmFtZSwgQ2xhc3MgcGFyZW50Q2xhc3MsIEVuaGFuY2VkQ2xhc3NGYWN0b3J5IGNsYXNzRmFjdG9yeSkKLSAgICB7Ci0gICAgICAgIF9jbGFzc05hbWUgPSBjbGFzc05hbWU7Ci0gICAgICAgIF9wYXJlbnRDbGFzcyA9IHBhcmVudENsYXNzOwotICAgICAgICBfY2xhc3NGYWN0b3J5ID0gY2xhc3NGYWN0b3J5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS50YXBlc3RyeS5lbmhhbmNlLklFbmhhbmNlZENsYXNzI2dldENsYXNzTmFtZSgpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9jbGFzc05hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIEN0Q2xhc3MgZ2V0T2JqZWN0VHlwZShTdHJpbmcgdHlwZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfY2xhc3NGYWN0b3J5LmdldE9iamVjdFR5cGUodHlwZSk7Ci0gICAgfQotCi0gICAgcHVibGljIENsYXNzRmFicmljYXRvciBnZXRDbGFzc0ZhYnJpY2F0b3IoKQotICAgIHsKLSAgICAgICAgaWYgKF9jbGFzc0ZhYnJpY2F0b3IgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgQ3RDbGFzcyBqYVBhcmVudENsYXNzID0gZ2V0T2JqZWN0VHlwZShfcGFyZW50Q2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIENsYXNzUG9vbCBjbGFzc1Bvb2wgPSBfY2xhc3NGYWN0b3J5LmdldENsYXNzUG9vbCgpOwotICAgICAgICAgICAgX2NsYXNzRmFicmljYXRvciA9IG5ldyBDbGFzc0ZhYnJpY2F0b3IoX2NsYXNzTmFtZSwgamFQYXJlbnRDbGFzcywgY2xhc3NQb29sKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gX2NsYXNzRmFicmljYXRvcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUudGFwZXN0cnkuZW5oYW5jZS5JRW5oYW5jZWRDbGFzcyNjcmVhdGVQcm9wZXJ0eShqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZVByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyBwcm9wZXJ0eVR5cGUpCi0gICAgewotICAgICAgICBjcmVhdGVQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHByb3BlcnR5VHlwZSwgbnVsbCwgZmFsc2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS50YXBlc3RyeS5lbmhhbmNlLklFbmhhbmNlZENsYXNzI2NyZWF0ZVByb3BlcnR5KGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGJvb2xlYW4pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY3JlYXRlUHJvcGVydHkoCi0gICAgICAgIFN0cmluZyBwcm9wZXJ0eU5hbWUsCi0gICAgICAgIFN0cmluZyBwcm9wZXJ0eVR5cGUsCi0gICAgICAgIFN0cmluZyByZWFkTWV0aG9kTmFtZSwKLSAgICAgICAgYm9vbGVhbiBwZXJzaXN0ZW50KQotICAgIHsKLSAgICAgICAgSUVuaGFuY2VyIGVuaGFuY2VyID0KLSAgICAgICAgICAgIG5ldyBDcmVhdGVQcm9wZXJ0eUVuaGFuY2VyKAotICAgICAgICAgICAgICAgIHByb3BlcnR5TmFtZSwKLSAgICAgICAgICAgICAgICBnZXRPYmplY3RUeXBlKHByb3BlcnR5VHlwZSksCi0gICAgICAgICAgICAgICAgcmVhZE1ldGhvZE5hbWUsCi0gICAgICAgICAgICAgICAgcGVyc2lzdGVudCk7Ci0gICAgICAgIGFkZEVuaGFuY2VyKGVuaGFuY2VyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUudGFwZXN0cnkuZW5oYW5jZS5JRW5oYW5jZWRDbGFzcyNjcmVhdGVBdXRvUGFyYW1ldGVyKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY3JlYXRlQXV0b1BhcmFtZXRlcigKLSAgICAgICAgU3RyaW5nIHByb3BlcnR5TmFtZSwKLSAgICAgICAgU3RyaW5nIHBhcmFtZXRlck5hbWUsCi0gICAgICAgIFN0cmluZyB0eXBlQ2xhc3NOYW1lLAotICAgICAgICBTdHJpbmcgcmVhZE1ldGhvZE5hbWUpCi0gICAgewotICAgICAgICBJRW5oYW5jZXIgZW5oYW5jZXIgPQotICAgICAgICAgICAgbmV3IENyZWF0ZUF1dG9QYXJhbWV0ZXJFbmhhbmNlcigKLSAgICAgICAgICAgICAgICB0aGlzLAotICAgICAgICAgICAgICAgIHByb3BlcnR5TmFtZSwKLSAgICAgICAgICAgICAgICBwYXJhbWV0ZXJOYW1lLAotICAgICAgICAgICAgICAgIGdldE9iamVjdFR5cGUodHlwZUNsYXNzTmFtZSksCi0gICAgICAgICAgICAgICAgcmVhZE1ldGhvZE5hbWUpOwotICAgICAgICBhZGRFbmhhbmNlcihlbmhhbmNlcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmVuaGFuY2UuSUVuaGFuY2VkQ2xhc3MjY3JlYXRlRW5oYW5jZWRTdWJjbGFzcygpCi0gICAgICovCi0gICAgcHVibGljIENsYXNzIGNyZWF0ZUVuaGFuY2VkU3ViY2xhc3MoKQotICAgIHsKLSAgICAgICAgcGVyZm9ybUVuaGFuY2VtZW50KCk7Ci0KLSAgICAgICAgQ2xhc3NGYWJyaWNhdG9yIGNmID0gZ2V0Q2xhc3NGYWJyaWNhdG9yKCk7Ci0gICAgICAgIGNmLmNvbW1pdCgpOwotCi0gICAgICAgIFN0cmluZyBlbmhhbmNlZENsYXNzTmFtZSA9IGdldENsYXNzTmFtZSgpOwotICAgICAgICBieXRlW10gZW5oYW5jZWRDbGFzc0J5dGVzID0gY2YuZ2V0Qnl0ZUNvZGUoKTsKLQotICAgICAgICBFbmhhbmNlZENsYXNzTG9hZGVyIGxvYWRlciA9IF9jbGFzc0ZhY3RvcnkuZ2V0RW5oYW5jZWRDbGFzc0xvYWRlcigpOwotICAgICAgICByZXR1cm4gbG9hZGVyLmRlZmluZUNsYXNzKAotICAgICAgICAgICAgZW5oYW5jZWRDbGFzc05hbWUsCi0gICAgICAgICAgICBlbmhhbmNlZENsYXNzQnl0ZXMsCi0gICAgICAgICAgICBfcGFyZW50Q2xhc3MuZ2V0UHJvdGVjdGlvbkRvbWFpbigpKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9lbmhhbmNlL2phdmFzc2lzdC9FbmhhbmNlZENsYXNzRmFjdG9yeS5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2VuaGFuY2UvamF2YXNzaXN0L0VuaGFuY2VkQ2xhc3NGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4NTgyMTkuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2VuaGFuY2UvamF2YXNzaXN0L0VuaGFuY2VkQ2xhc3NGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuZW5oYW5jZS5qYXZhc3Npc3Q7Ci0KLWltcG9ydCBqYXZhc3Npc3QuQ2xhc3NQb29sOwotaW1wb3J0IGphdmFzc2lzdC5DdENsYXNzOwotaW1wb3J0IGphdmFzc2lzdC5Mb2FkZXJDbGFzc1BhdGg7Ci1pbXBvcnQgamF2YXNzaXN0Lk5vdEZvdW5kRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVzb3VyY2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmVuaGFuY2UuQ29kZUdlbmVyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5lbmhhbmNlLkVuaGFuY2VkQ2xhc3NMb2FkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5lbmhhbmNlLklFbmhhbmNlZENsYXNzOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuZW5oYW5jZS5JRW5oYW5jZWRDbGFzc0ZhY3Rvcnk7Ci0KLS8qKgotICogIFRoaXMgY2xhc3MgZGVmaW5lcyB0aGUgZmFjdG9yeSBmb3IgY3JlYXRpb24gb2YgbmV3IEphdmFzc2lzdCBlbmhhbmNlZCBjbGFzc2VzLiAKLSAqICBUaGVyZSBpcyB0eXBpY2FsbHkgb25seSBvbmUgb2JqZWN0IG9mIHRoaXMgY2xhc3MgaW4gdGhlIHN5c3RlbS4gCi0gKiAgQ29tbW9uIGZ1bmN0aW9uYWxpdHkgb2JqZWN0cyBmb3IgSmF2YXNzaXN0IGVuaGFuY2VtZW50IGFyZSBzdG9yZWQgaGVyZS4KLSAqIAotICogIEBhdXRob3IgTWluZGJyaWRnZQotICogIEB2ZXJzaW9uICRJZCQKLSAqICBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFbmhhbmNlZENsYXNzRmFjdG9yeSBpbXBsZW1lbnRzIElFbmhhbmNlZENsYXNzRmFjdG9yeQotewotICAgIHByaXZhdGUgSVJlc291cmNlUmVzb2x2ZXIgX3Jlc291cmNlUmVzb2x2ZXI7Ci0gICAgcHJpdmF0ZSBFbmhhbmNlZENsYXNzTG9hZGVyIF9lbmhhbmNlZENsYXNzTG9hZGVyOwotICAgIHByaXZhdGUgQ2xhc3NQb29sIF9jbGFzc1Bvb2w7Ci0KLSAgICBwcml2YXRlIENsYXNzTWFwcGluZyBfdHlwZU1hcCA9IG51bGw7Ci0KLSAgICBwdWJsaWMgRW5oYW5jZWRDbGFzc0ZhY3RvcnkoSVJlc291cmNlUmVzb2x2ZXIgcmVzb3VyY2VSZXNvbHZlcikKLSAgICB7Ci0gICAgICAgIF9yZXNvdXJjZVJlc29sdmVyID0gcmVzb3VyY2VSZXNvbHZlcjsKLQotICAgICAgICByZXNldCgpOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgQ2xhc3NQb29sIGNyZWF0ZUNsYXNzUG9vbCgpCi0gICAgewotICAgICAgICBDbGFzc0xvYWRlciBsb2FkZXIgPSBfcmVzb3VyY2VSZXNvbHZlci5nZXRDbGFzc0xvYWRlcigpOwotICAgICAgICAKLSAgICAgICAgLy8gY3JlYXRlIGEgbmV3IENsYXNzUG9vbCBhbmQgbWFrZSBzdXJlIGl0IHVzZXMgdGhlIGFwcGxpY2F0aW9uIHJlc291cmNlIHJlc29sdmVyIAotICAgICAgICBDbGFzc1Bvb2wgY2xhc3NQb29sID0gbmV3IENsYXNzUG9vbChudWxsKTsKLSAgICAgICAgY2xhc3NQb29sLmluc2VydENsYXNzUGF0aChuZXcgTG9hZGVyQ2xhc3NQYXRoKGxvYWRlcikpOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGNsYXNzUG9vbDsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmVuaGFuY2UuSUVuaGFuY2VkQ2xhc3NGYWN0b3J5I3Jlc2V0KCkKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVzZXQoKQotICAgIHsKLSAgICAgICAgLy8gY3JlYXRlIGEgbmV3IGNsYXNzIHBvb2wgYW5kIGRpc2NhcmQgdGhlIHByZXZpb3VzIG9uZQotICAgICAgICBfY2xhc3NQb29sID0gY3JlYXRlQ2xhc3NQb29sKCk7Ci0gICAgICAgIF90eXBlTWFwID0gbmV3IENsYXNzTWFwcGluZyhfY2xhc3NQb29sKTsKLQotICAgICAgICBDbGFzc0xvYWRlciBsb2FkZXIgPSBfcmVzb3VyY2VSZXNvbHZlci5nZXRDbGFzc0xvYWRlcigpOwotICAgICAgICBfZW5oYW5jZWRDbGFzc0xvYWRlciA9IG5ldyBFbmhhbmNlZENsYXNzTG9hZGVyKGxvYWRlcik7Ci0gICAgfQotICAgCi0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUudGFwZXN0cnkuZW5oYW5jZS5JRW5oYW5jZWRDbGFzc0ZhY3RvcnkjY3JlYXRlRW5oYW5jZWRDbGFzcyhqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuQ2xhc3MpCi0gICAgICovCi0gICAgcHVibGljIElFbmhhbmNlZENsYXNzIGNyZWF0ZUVuaGFuY2VkQ2xhc3MoU3RyaW5nIGNsYXNzTmFtZSwgQ2xhc3MgcGFyZW50Q2xhc3MpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IEVuaGFuY2VkQ2xhc3MoY2xhc3NOYW1lLCBwYXJlbnRDbGFzcywgdGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIENsYXNzUG9vbCBnZXRDbGFzc1Bvb2woKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9jbGFzc1Bvb2w7Ci0gICAgfQotCi0gICAgcHVibGljIENsYXNzTWFwcGluZyBnZXRDbGFzc01hcHBpbmcoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF90eXBlTWFwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBHaXZlbiB0aGUgamF2YSBjbGFzcywgcmV0dXJucyB0aGUgZXF1aXZhbGVudCB7QGxpbmsgQ3RDbGFzcyB0eXBlfS4gIEluIGFkZGl0aW9uLAotICAgICAqICBrbm93cyBhYm91dCBzY2FsYXIgdHlwZXMsIGFycmF5cyBvZiBzY2FsYXIgdHlwZXMsIGphdmEubGFuZy5PYmplY3RbXSBhbmQKLSAgICAgKiAgamF2YS5sYW5nLlN0cmluZ1tdLgotICAgICAqIAotICAgICAqKi8KLQotICAgIHB1YmxpYyBDdENsYXNzIGdldE9iamVjdFR5cGUoU3RyaW5nIHR5cGUpCi0gICAgewotCi0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgICAgICAgICAgICBDdENsYXNzIHJlc3VsdCA9IGdldENsYXNzTWFwcGluZygpLmdldFR5cGUodHlwZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gX2NsYXNzUG9vbC5nZXQodHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBnZXRDbGFzc01hcHBpbmcoKS5yZWNvcmRUeXBlKHR5cGUsIHJlc3VsdCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKE5vdEZvdW5kRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb2RlR2VuZXJhdGlvbkV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgfQotCi0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBjbGFzcyBsb2FkZXIgdG8gYmUgdXNlZCB0byBjcmVhdGUgdGhlIGVuaGFuY2VkIGNsYXNzCi0gICAgICovCi0gICAgcHVibGljIEVuaGFuY2VkQ2xhc3NMb2FkZXIgZ2V0RW5oYW5jZWRDbGFzc0xvYWRlcigpCi0gICAgewotICAgICAgICByZXR1cm4gX2VuaGFuY2VkQ2xhc3NMb2FkZXI7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZW5oYW5jZS9wYWNrYWdlLmh0bWwgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZW5oYW5jZS9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5MDQ5MmIuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2VuaGFuY2UvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotPCFkb2N0eXBlIGh0bWwgcHVibGljICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLTwhLS0gJElkJCAtLT4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+VGFwZXN0cnk6IFdlYiBBcHBsaWNhdGlvbiBGcmFtZXdvcms8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci0KLUNsYXNzZXMgdXNlZCBmb3IgcGVyZm9ybWluZyBkeW5hbWljIGJ5dGVjb2RlIGVuaGFuY2VtZW50IG9mIGNvbXBvbmVudCBhbmQgcGFnZSBjbGFzc2VzLgotCi1AYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwIDxhIGhyZWY9Im1haWx0bzpobHNoaXBAYXBhY2hlLm9yZyI+aGxzaGlwQGFwYWNoZS5vcmc8L2E+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9ldmVudC9DaGFuZ2VPYnNlcnZlci5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2V2ZW50L0NoYW5nZU9ic2VydmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmN2I2MzIuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2V2ZW50L0NoYW5nZU9ic2VydmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5ldmVudDsKLQotLyoqCi0gKiBNYXkgb2JzZXJ2ZSBjaGFuZ2VzIGluIGFuIG9iamVjdCdzIHByb3BlcnRpZXMuICBUaGlzIGlzIGEgIndlYWsiIHZhcmlhdGlvbgotICogb24gSmF2YUJlYW4ncyBzdHlsZSBib3VuZCBwcm9wZXJ0aWVzLiAgSXQgaXMgdXNlZCB3aGVuIHRoZXJlIHdpbGwgYmUgYXQgbW9zdAotICogYSBzaW5nbGUgbGlzdGVuZXIgb24gcHJvcGVydHkgY2hhbmdlcywgYW5kIHRoYXQgdGhlIGxpc3RlbmVyIGlzIG5vdCBpbnRlcmVzdGVkCi0gKiBpbiB0aGUgb2xkIHZhbHVlLgotICoKLSAqIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqIEB2ZXJzaW9uICRJZCQKLSAqIAotICoqLwotCi1wdWJsaWMgaW50ZXJmYWNlIENoYW5nZU9ic2VydmVyCi17Ci0gICAgLyoqCi0gICAgICogIFNlbnQgd2hlbiB0aGUgb2JzZXJ2ZWQgb2JqZWN0IGNoYW5nZXMgYSBwcm9wZXJ0eS4gIFRoZSBldmVudCBpZGVudGlmaWVzCi0gICAgICogIHRoZSBvYmplY3QsIHRoZSBwcm9wZXJ0eSBhbmQgdGhlIG5ldyB2YWx1ZS4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIG9ic2VydmVDaGFuZ2UoT2JzZXJ2ZWRDaGFuZ2VFdmVudCBldmVudCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2V2ZW50L09ic2VydmVkQ2hhbmdlRXZlbnQuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9ldmVudC9PYnNlcnZlZENoYW5nZUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhZGNmMjIuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2V2ZW50L09ic2VydmVkQ2hhbmdlRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5ldmVudDsKLQotaW1wb3J0IGphdmEudXRpbC5FdmVudE9iamVjdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUNvbXBvbmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LlRhcGVzdHJ5OwotCi0vKioKLSAqIEV2ZW50IHdoaWNoIGRlc2NyaWJlcyBhIGNoYW5nZSB0byBhIHBhcnRpY3VsYXIge0BsaW5rIElDb21wb25lbnR9LgotICoKLSAqIEBhdXRob3IgSG93YXJkIFNoaXAKLSAqIEB2ZXJzaW9uICRJZCQKLSAqIAotICoqLwotCi1wdWJsaWMgY2xhc3MgT2JzZXJ2ZWRDaGFuZ2VFdmVudCBleHRlbmRzIEV2ZW50T2JqZWN0Ci17Ci0gICAgcHJpdmF0ZSBJQ29tcG9uZW50IF9jb21wb25lbnQ7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgX3Byb3BlcnR5TmFtZTsKLSAgICBwcml2YXRlIE9iamVjdCBfbmV3VmFsdWU7Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBUbyBiZSByZW1vdmVkIGluIDMuMS4gVXNlIHtAbGluayAjT2JzZXJ2ZWRDaGFuZ2VFdmVudChJQ29tcG9uZW50LCBTdHJpbmcsIE9iamVjdCl9IGluc3RlYWQuCi0JICovCi0gICAgcHVibGljIE9ic2VydmVkQ2hhbmdlRXZlbnQoSUNvbXBvbmVudCBjb21wb25lbnQsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIGNoYXIgbmV3VmFsdWUpCi0gICAgewotICAgICAgICB0aGlzKGNvbXBvbmVudCwgcHJvcGVydHlOYW1lLCBuZXcgQ2hhcmFjdGVyKG5ld1ZhbHVlKSk7Ci0gICAgfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgVG8gYmUgcmVtb3ZlZCBpbiAzLjEuIFVzZSB7QGxpbmsgI09ic2VydmVkQ2hhbmdlRXZlbnQoSUNvbXBvbmVudCwgU3RyaW5nLCBPYmplY3QpfSBpbnN0ZWFkLgotCSAqLwotICAgIHB1YmxpYyBPYnNlcnZlZENoYW5nZUV2ZW50KElDb21wb25lbnQgY29tcG9uZW50LCBTdHJpbmcgcHJvcGVydHlOYW1lLCBieXRlIG5ld1ZhbHVlKQotICAgIHsKLSAgICAgICAgdGhpcyhjb21wb25lbnQsIHByb3BlcnR5TmFtZSwgbmV3IEJ5dGUobmV3VmFsdWUpKTsKLSAgICB9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBUbyBiZSByZW1vdmVkIGluIDMuMS4gVXNlIHtAbGluayAjT2JzZXJ2ZWRDaGFuZ2VFdmVudChJQ29tcG9uZW50LCBTdHJpbmcsIE9iamVjdCl9IGluc3RlYWQuCi0JICovCi0gICAgcHVibGljIE9ic2VydmVkQ2hhbmdlRXZlbnQoSUNvbXBvbmVudCBjb21wb25lbnQsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIHNob3J0IG5ld1ZhbHVlKQotICAgIHsKLSAgICAgICAgdGhpcyhjb21wb25lbnQsIHByb3BlcnR5TmFtZSwgbmV3IFNob3J0KG5ld1ZhbHVlKSk7Ci0gICAgfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgVG8gYmUgcmVtb3ZlZCBpbiAzLjEuIFVzZSB7QGxpbmsgI09ic2VydmVkQ2hhbmdlRXZlbnQoSUNvbXBvbmVudCwgU3RyaW5nLCBPYmplY3QpfSBpbnN0ZWFkLgotCSAqLwotICAgIHB1YmxpYyBPYnNlcnZlZENoYW5nZUV2ZW50KElDb21wb25lbnQgY29tcG9uZW50LCBTdHJpbmcgcHJvcGVydHlOYW1lLCBpbnQgbmV3VmFsdWUpCi0gICAgewotICAgICAgICB0aGlzKGNvbXBvbmVudCwgcHJvcGVydHlOYW1lLCBuZXcgSW50ZWdlcihuZXdWYWx1ZSkpOwotICAgIH0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIFRvIGJlIHJlbW92ZWQgaW4gMy4xLiBVc2Uge0BsaW5rICNPYnNlcnZlZENoYW5nZUV2ZW50KElDb21wb25lbnQsIFN0cmluZywgT2JqZWN0KX0gaW5zdGVhZC4KLQkgKi8KLSAgICBwdWJsaWMgT2JzZXJ2ZWRDaGFuZ2VFdmVudChJQ29tcG9uZW50IGNvbXBvbmVudCwgU3RyaW5nIHByb3BlcnR5TmFtZSwgbG9uZyBuZXdWYWx1ZSkKLSAgICB7Ci0gICAgICAgIHRoaXMoY29tcG9uZW50LCBwcm9wZXJ0eU5hbWUsIG5ldyBMb25nKG5ld1ZhbHVlKSk7Ci0gICAgfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgVG8gYmUgcmVtb3ZlZCBpbiAzLjEuIFVzZSB7QGxpbmsgI09ic2VydmVkQ2hhbmdlRXZlbnQoSUNvbXBvbmVudCwgU3RyaW5nLCBPYmplY3QpfSBpbnN0ZWFkLgotCSAqLwotICAgcHVibGljIE9ic2VydmVkQ2hhbmdlRXZlbnQoSUNvbXBvbmVudCBjb21wb25lbnQsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIGRvdWJsZSBuZXdWYWx1ZSkKLSAgICB7Ci0gICAgICAgIHRoaXMoY29tcG9uZW50LCBwcm9wZXJ0eU5hbWUsIG5ldyBEb3VibGUobmV3VmFsdWUpKTsKLSAgICB9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBUbyBiZSByZW1vdmVkIGluIDMuMS4gVXNlIHtAbGluayAjT2JzZXJ2ZWRDaGFuZ2VFdmVudChJQ29tcG9uZW50LCBTdHJpbmcsIE9iamVjdCl9IGluc3RlYWQuCi0JICovCi0gICBwdWJsaWMgT2JzZXJ2ZWRDaGFuZ2VFdmVudChJQ29tcG9uZW50IGNvbXBvbmVudCwgU3RyaW5nIHByb3BlcnR5TmFtZSwgZmxvYXQgbmV3VmFsdWUpCi0gICAgewotICAgICAgICB0aGlzKGNvbXBvbmVudCwgcHJvcGVydHlOYW1lLCBuZXcgRmxvYXQobmV3VmFsdWUpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgQ3JlYXRlcyB0aGUgZXZlbnQuICBUaGUgbmV3IHZhbHVlIG11c3QgYmUgbnVsbCwgb3IgYmUgYSBzZXJpYWxpemFibGUgb2JqZWN0LgotICAgICAqICAoSXQgaXMgZGVjbGFyZWQgYXMgT2JqZWN0IGFzIGEgY29uY2Vzc2lvbiB0byB0aGUgSmF2YSAyIGNvbGxlY3Rpb25zIGZyYW1ld29yaywgd2hlcmUKLSAgICAgKiAgdGhlIGltcGxlbWVudGF0aW9ucyBhcmUgc2VyaWFsaXphYmxlIGJ1dCB0aGUgaW50ZXJmYWNlcyAoTWFwLCBMaXN0LCBldGMuKSBkb24ndAotICAgICAqICBleHRlbmQgU2VyaWFsaXphYmxlIC4uLiBzbyB3ZSB3YWl0IHVudGlsIHJ1bnRpbWUgdG8gY2hlY2spLgotICAgICAqCi0gICAgICogIEBwYXJhbSBjb21wb25lbnQgVGhlIGNvbXBvbmVudCAobm90IG5lY2Vzc2FyaWx5IGEgcGFnZSkgd2hvc2UgcHJvcGVydHkgY2hhbmdlZC4KLSAgICAgKiAgQHBhcmFtIHByb3BlcnR5TmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgd2hpY2ggd2FzIGNoYW5nZWQuCi0gICAgICogIEBwYXJhbSBuZXdWYWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS4gCi0gICAgICoKLSAgICAgKiAgQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgcHJvcGVydHlOYW1lIGlzIG51bGwsIG9yCi0gICAgICogIGlmIHRoZSBuZXcgdmFsdWUgaXMgbm90IHNlcmlhbGl6YWJsZQotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIE9ic2VydmVkQ2hhbmdlRXZlbnQoSUNvbXBvbmVudCBjb21wb25lbnQsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBuZXdWYWx1ZSkKLSAgICB7Ci0gICAgICAgIHN1cGVyKGNvbXBvbmVudCk7Ci0KLSAgICAgICAgaWYgKHByb3BlcnR5TmFtZSA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICBUYXBlc3RyeS5mb3JtYXQoIk9ic2VydmVkQ2hhbmdlRXZlbnQubnVsbC1wcm9wZXJ0eS1uYW1lIiwgY29tcG9uZW50KSk7Ci0KLSAgICAgICAgX2NvbXBvbmVudCA9IGNvbXBvbmVudDsKLSAgICAgICAgX3Byb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZTsKLSAgICAgICAgX25ld1ZhbHVlID0gbmV3VmFsdWU7Ci0gICAgfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgVG8gYmUgcmVtb3ZlZCBpbiAzLjEuIFVzZSB7QGxpbmsgI09ic2VydmVkQ2hhbmdlRXZlbnQoSUNvbXBvbmVudCwgU3RyaW5nLCBPYmplY3QpfSBpbnN0ZWFkLgotCSAqLwotICAgIHB1YmxpYyBPYnNlcnZlZENoYW5nZUV2ZW50KElDb21wb25lbnQgY29tcG9uZW50LCBTdHJpbmcgcHJvcGVydHlOYW1lLCBib29sZWFuIG5ld1ZhbHVlKQotICAgIHsKLSAgICAgICAgdGhpcyhjb21wb25lbnQsIHByb3BlcnR5TmFtZSwgbmV3VmFsdWUgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSUNvbXBvbmVudCBnZXRDb21wb25lbnQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9jb21wb25lbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXROZXdWYWx1ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gX25ld1ZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHlOYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfcHJvcGVydHlOYW1lOwotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9ldmVudC9QYWdlRGV0YWNoTGlzdGVuZXIuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9ldmVudC9QYWdlRGV0YWNoTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjljNzliMS4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZXZlbnQvUGFnZURldGFjaExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5ldmVudDsKLQotaW1wb3J0IGphdmEudXRpbC5FdmVudExpc3RlbmVyOwotCi0vKioKLSAqICBBbiBpbnRlcmZhY2UgZm9yIG9iamVjdHMgdGhhdCB3YW50IHRvIGtub3cgd2hlbiB0aGUgZW5kIG9mIHRoZQotICogIHJlcXVlc3QgY3ljbGUgb2NjdXJzLCBzbyB0aGF0IGFueSByZXNvdXJjZXMgdGhhdCBzaG91bGQgYmUgbGltaXRlZAotICogIHRvIGp1c3Qgb25lIHJlcXVlc3QgY3ljbGUgY2FuIGJlIHJlbGVhc2VkLgotICoKLSAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiAgQHZlcnNpb24gJElkJAotICogIEBzaW5jZSAxLjAuNQotICoqLwotCi1wdWJsaWMgaW50ZXJmYWNlIFBhZ2VEZXRhY2hMaXN0ZW5lciBleHRlbmRzIEV2ZW50TGlzdGVuZXIKLXsKLSAgICAvKioKLSAgICAgKiAgSW52b2tlZCBieSB0aGUgcGFnZSBmcm9tIGl0cyB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5JUGFnZSNkZXRhY2goKX0gbWV0aG9kLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgcGFnZURldGFjaGVkKFBhZ2VFdmVudCBldmVudCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2V2ZW50L1BhZ2VFdmVudC5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2V2ZW50L1BhZ2VFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWEzMzM1Li4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9ldmVudC9QYWdlRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmV2ZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkV2ZW50T2JqZWN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUGFnZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZXF1ZXN0Q3ljbGU7Ci0KLS8qKgotICogIEVuY2Fwc3VsYXRlcyBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIHRoZSBwYWdlIGxpc3RlbmVyCi0gKiAgaW50ZXJmYWNlcy4KLSAqCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogIEB2ZXJzaW9uICRJZCQKLSAqICBAc2luY2UgMS4wLjUKLSAqIAotICoqLwotCi1wdWJsaWMgY2xhc3MgUGFnZUV2ZW50IGV4dGVuZHMgRXZlbnRPYmplY3QKLXsKLSAgICBwcml2YXRlIHRyYW5zaWVudCBJUGFnZSBwYWdlOwotICAgIHByaXZhdGUgdHJhbnNpZW50IElSZXF1ZXN0Q3ljbGUgcmVxdWVzdEN5Y2xlOwotCi0gICAgLyoqCi0gICAgICogIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIGV2ZW50LiAgVGhlCi0gICAgICogIHtAbGluayBFdmVudE9iamVjdCNnZXRTb3VyY2UoKX0gb2YgdGhlIGV2ZW50IHdpbGwKLSAgICAgKiAgYmUgdGhlIHtAbGluayBJUGFnZX0uCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgUGFnZUV2ZW50KElQYWdlIHBhZ2UsIElSZXF1ZXN0Q3ljbGUgY3ljbGUpCi0gICAgewotICAgICAgICBzdXBlcihwYWdlKTsKLQotICAgICAgICB0aGlzLnBhZ2UgPSBwYWdlOwotICAgICAgICB0aGlzLnJlcXVlc3RDeWNsZSA9IGN5Y2xlOwotICAgIH0KLQotICAgIHB1YmxpYyBJUGFnZSBnZXRQYWdlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBwYWdlOwotICAgIH0KLQotICAgIHB1YmxpYyBJUmVxdWVzdEN5Y2xlIGdldFJlcXVlc3RDeWNsZSgpCi0gICAgewotICAgICAgICByZXR1cm4gcmVxdWVzdEN5Y2xlOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZXZlbnQvUGFnZVJlbmRlckxpc3RlbmVyLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZXZlbnQvUGFnZVJlbmRlckxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhMmZkOTkuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2V2ZW50L1BhZ2VSZW5kZXJMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuZXZlbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKLQotLyoqCi0gKiAgQW4gb2JqZWN0IHRoYXQgbGlzdGVucyB0byBwYWdlIGV2ZW50cy4gIFRoZSB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5JUGFnZSBwYWdlfSBnZW5lcmF0ZXMKLSAqICBldmVudHMgYmVmb3JlIGFuZCBhZnRlciByZW5kZXJpbmcgYSByZXNwb25zZS4gIFRoZXNlIGV2ZW50cyBhbHNvIG9jY3VyIGJlZm9yZSBhbmQKLSAqICBhZnRlciBhIGZvcm0gcmV3aW5kcy4KLSAqCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogIEB2ZXJzaW9uICRJZCQKLSAqICBAc2luY2UgMS4wLjUKLSAqIAotICoqLwotCi1wdWJsaWMgaW50ZXJmYWNlIFBhZ2VSZW5kZXJMaXN0ZW5lciBleHRlbmRzIEV2ZW50TGlzdGVuZXIKLXsKLSAgICAvKioKLSAgICAgKiAgSW52b2tlZCBiZWZvcmUganVzdCBiZWZvcmUgdGhlIHBhZ2UgcmVuZGVycyBhIHJlc3BvbnNlLiAgVGhpcyBwcm92aWRlcwotICAgICAqICBsaXN0ZW5lcnMgd2l0aCBhIGxhc3QgY2hhbmNlIHRvIGluaXRpYWxpemUgdGhlbXNlbHZlcyBmb3IgdGhlIHJlbmRlci4KLSAgICAgKiAgVGhpcyBpbml0aWFsaXphdGlvbiBjYW4gaW5jbHVkZSBtb2RpZnlpbmcgcGVyaXN0ZW50IHBhZ2UgcHJvcGVydGllcy4KLSAgICAgKgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgcGFnZUJlZ2luUmVuZGVyKFBhZ2VFdmVudCBldmVudCk7Ci0KLSAgICAvKioKLSAgICAgKiAgSW52b2tlZCBhZnRlciBhIHN1Y2Nlc3NmdWwgcmVuZGVyIG9mIHRoZSBwYWdlLgotICAgICAqICBBbGxvd3Mgb2JqZWN0cyB0byByZWxlYXNlIGFueSByZXNvdXJjZXMgdGhleSBuZWVkZWQgZHVyaW5nIHRoZQotICAgICAqICB0aGUgcmVuZGVyLgotICAgICAqIAotICAgICAqICBAc2VlIG9yZy5hcGFjaGUudGFwZXN0cnkuQWJzdHJhY3RDb21wb25lbnQjcGFnZUVuZFJlbmRlcihQYWdlRXZlbnQpCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCBwYWdlRW5kUmVuZGVyKFBhZ2VFdmVudCBldmVudCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2V2ZW50L1BhZ2VWYWxpZGF0ZUxpc3RlbmVyLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZXZlbnQvUGFnZVZhbGlkYXRlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmMzMDg3ZS4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZXZlbnQvUGFnZVZhbGlkYXRlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmV2ZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7Ci0KLS8qKgotICogIEFuIGludGVyZmFjZSBmb3Igb2JqZWN0cyB0aGF0IHdhbnQgdG8gdGFrZSBwYXJ0IGluIHRoZSB2YWxpZGF0aW9uIG9mIHRoZSBwYWdlLgotICoKLSAqICBAYXV0aG9yIE1pbmRicmlkZ2UKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQHNpbmNlIDMuMAotICoqLwotCi1wdWJsaWMgaW50ZXJmYWNlIFBhZ2VWYWxpZGF0ZUxpc3RlbmVyIGV4dGVuZHMgRXZlbnRMaXN0ZW5lcgotewotICAgIC8qKgotICAgICAqICBJbnZva2VkIGJ5IHRoZSBwYWdlIGZyb20gaXRzCi0gICAgICogIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LklQYWdlI3ZhbGlkYXRlKG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlcXVlc3RDeWNsZSl9IG1ldGhvZC4KLSAgICAgKgotICAgICAqICA8cD5NYXkgdGhyb3cgYSB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5QYWdlUmVkaXJlY3RFeGNlcHRpb259LCB0byByZWRpcmVjdCB0aGUgdXNlcgotICAgICAqICB0byBhbiBhcHByb3ByaWF0ZSBwYXJ0IG9mIHRoZSBzeXN0ZW0gKHN1Y2ggYXMsIGEgbG9naW4gcGFnZSkuCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgcGFnZVZhbGlkYXRlKFBhZ2VFdmVudCBldmVudCk7Ci19CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZXZlbnQvcGFja2FnZS5odG1sIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2V2ZW50L3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzBlMzIwNi4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZXZlbnQvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFkb2N0eXBlIGh0bWwgcHVibGljICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLTwhLS0gJElkJCAtLT4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+VGFwZXN0cnk6IFdlYiBBcHBsaWNhdGlvbiBGcmFtZXdvcms8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci0KLURlZmluZXMgZXZlbnRzIGFuZCBsaXN0ZW5lciBpbnRlcmZhY2VzIGZvciBUYXBlc3RyeS4KLQotPHA+Ci17QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5ldmVudC5DaGFuZ2VPYnNlcnZlcn0KLWFuZAote0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkuZXZlbnQuT2JzZXJ2ZWRDaGFuZ2VFdmVudH0KLWFyZSB1c2VkIHRvIGNvbW11bmljYXRlIGNoYW5nZXMgaW4gcGVyc2lzdGVudCBwcm9wZXJ0aWVzCi1mcm9tIHBhZ2VzIGFuZCBjb21wb25lbnRzIHRvIHBhZ2UgcmVjb3JkZXJzLgotCi08cD4KLVRoZSByZW1haW5pbmcgaW50ZXJmYWNlcwote0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkuZXZlbnQuUGFnZURldGFjaExpc3RlbmVyfSBhbmQKLXtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LmV2ZW50LlBhZ2VSZW5kZXJMaXN0ZW5lcn0gYWxsb3cKLW9iamVjdHMgdG8ga25vdyBhYm91dCBrZXkgbGlmZWN5Y2xlIGV2ZW50cyByZWdhcmRpbmcKLWEgcGFnZS4KLQotQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcCA8YSBocmVmPSJtYWlsdG86aGxzaGlwQGFwYWNoZS5vcmciPmhsc2hpcEBhcGFjaGUub3JnPC9hPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZm9ybS9BYnN0cmFjdEZvcm1Db21wb25lbnQuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9mb3JtL0Fic3RyYWN0Rm9ybUNvbXBvbmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzRkZmUzLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9mb3JtL0Fic3RyYWN0Rm9ybUNvbXBvbmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuZm9ybTsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuQWJzdHJhY3RDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5BcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JRm9ybTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZXF1ZXN0Q3ljbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5UYXBlc3RyeTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnZhbGlkLklWYWxpZGF0aW9uRGVsZWdhdGU7Ci0KLS8qKgotICogIEEgYmFzZSBjbGFzcyBmb3IgYnVpbGRpbmcgY29tcG9uZW50cyB0aGF0IGNvcnJlc3BvbmQgdG8gSFRNTCBmb3JtIGVsZW1lbnRzLgotICogIEFsbCBzdWNoIGNvbXBvbmVudHMgbXVzdCBiZSB3cmFwcGVkIChkaXJlY3RseSBvciBpbmRpcmVjdGx5KSBieQotICogIGEge0BsaW5rIEZvcm19IGNvbXBvbmVudC4KLSAqCi0gKiAgQHZlcnNpb24gJElkJAotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAc2luY2UgMS4wLjMKLSAqIAotICoqLwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RGb3JtQ29tcG9uZW50IGV4dGVuZHMgQWJzdHJhY3RDb21wb25lbnQgaW1wbGVtZW50cyBJRm9ybUNvbXBvbmVudAotewotICAgIC8qKgotICAgICAqICBSZXR1cm5zIHRoZSB7QGxpbmsgRm9ybX0gd3JhcHBpbmcgdGhpcyBjb21wb25lbnQuICBJbnZva2VzCi0gICAgICogIHtAbGluayAjc2V0Rm9ybShJRm9ybSl9IChzbyB0aGF0IHRoZSBjb21wb25lbnQgbWF5IGtub3csIGxhdGVyLCB3aGF0IHRoZQotICAgICAqICBmb3JtIGlzKS4gIEFsc28sIGlmIHRoZSBmb3JtIGhhcyBhIGRlbGVnYXRlLCAKLSAgICAgKiAgdGhlbiB7QGxpbmsgSVZhbGlkYXRpb25EZWxlZ2F0ZSNzZXRGb3JtQ29tcG9uZW50KElGb3JtQ29tcG9uZW50KX0gaXMgaW52b2tlZC4KLSAgICAgKgotICAgICAqICBAdGhyb3dzIEFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbiBpZiB0aGUgY29tcG9uZW50IGlzIG5vdCB3cmFwcGVkIGJ5IGEge0BsaW5rIEZvcm19LgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIElGb3JtIGdldEZvcm0oSVJlcXVlc3RDeWNsZSBjeWNsZSkKLSAgICB7Ci0gICAgICAgIElGb3JtIHJlc3VsdCA9IEZvcm0uZ2V0KGN5Y2xlKTsKLQotICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIFRhcGVzdHJ5LmdldE1lc3NhZ2UoIkFic3RyYWN0Rm9ybUNvbXBvbmVudC5tdXN0LWJlLWNvbnRhaW5lZC1ieS1mb3JtIiksCi0gICAgICAgICAgICAgICAgdGhpcywKLSAgICAgICAgICAgICAgICBudWxsLAotICAgICAgICAgICAgICAgIG51bGwpOwotCi0gICAgICAgIHNldEZvcm0ocmVzdWx0KTsKLQotICAgICAgICBJVmFsaWRhdGlvbkRlbGVnYXRlIGRlbGVnYXRlID0gcmVzdWx0LmdldERlbGVnYXRlKCk7Ci0KLSAgICAgICAgaWYgKGRlbGVnYXRlICE9IG51bGwpCi0gICAgICAgICAgICBkZWxlZ2F0ZS5zZXRGb3JtQ29tcG9uZW50KHRoaXMpOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIGFic3RyYWN0IElGb3JtIGdldEZvcm0oKTsKLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRGb3JtKElGb3JtIGZvcm0pOwotCi0gICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXROYW1lKCk7Ci0gICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSk7Ci0KLSAgICAvKioKLSAgICAgKiAgSW1wbGVtZW50ZWQgaW4gc29tZSBzdWJjbGFzc2VzIHRvIHByb3ZpZGUgYSBkaXNwbGF5IG5hbWUgKHN1aXRhYmxlCi0gICAgICogIGZvciBwcmVzZW50YXRpb24gdG8gdGhlIHVzZXIgYXMgYSBsYWJlbCBvciBlcnJvciBtZXNzYWdlKS4gIFRoaXMgaW1wbGVtZW50YXRpb24KLSAgICAgKiAgcmV0dXJuIG51bGwuCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIFN0cmluZyBnZXREaXNwbGF5TmFtZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2Zvcm0vQWJzdHJhY3RUZXh0RmllbGQuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9mb3JtL0Fic3RyYWN0VGV4dEZpZWxkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3Y2Q4ZTQuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2Zvcm0vQWJzdHJhY3RUZXh0RmllbGQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5mb3JtOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JRm9ybTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklNYXJrdXBXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVxdWVzdEN5Y2xlOwotCi0vKioKLSAqICBCYXNlIGNsYXNzIGZvciBpbXBsZW1lbnRpbmcgdmFyaW91cyB0eXBlcyBvZiB0ZXh0IGlucHV0IGZpZWxkcy4KLSAqICBUaGlzIGluY2x1ZGVzIHtAbGluayBUZXh0RmllbGR9IGFuZAotICogIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LnZhbGlkLlZhbGlkRmllbGR9LgotICoKLSAqCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogIEB2ZXJzaW9uICRJZCQKLSAqICBAc2luY2UgMS4wLjIKLSAqIAotICoqLwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RUZXh0RmllbGQgZXh0ZW5kcyBBYnN0cmFjdEZvcm1Db21wb25lbnQKLXsKLSAgICAvKioKLSAgICAgKiAgUmVuZGVycyB0aGUgZm9ybSBlbGVtZW50LCBvciByZXNwb25kcyB3aGVuIHRoZSBmb3JtIGNvbnRhaW5pbmcgdGhlIGVsZW1lbnQKLSAgICAgKiAgaXMgc3VibWl0dGVkIChieSBjaGVja2luZyB7QGxpbmsgRm9ybSNpc1Jld2luZGluZygpfS4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHByb3RlY3RlZCB2b2lkIHJlbmRlckNvbXBvbmVudChJTWFya3VwV3JpdGVyIHdyaXRlciwgSVJlcXVlc3RDeWNsZSBjeWNsZSkKLSAgICB7Ci0gICAgICAgIFN0cmluZyB2YWx1ZTsKLQotICAgICAgICBJRm9ybSBmb3JtID0gZ2V0Rm9ybShjeWNsZSk7Ci0KLSAgICAgICAgLy8gSXQgaXNuJ3QgZW5vdWdoIHRvIGtub3cgd2hldGhlciB0aGUgY3ljbGUgaW4gZ2VuZXJhbCBpcyByZXdpbmRpbmcsIG5lZWQgdG8ga25vdwotICAgICAgICAvLyBzcGVjaWZpY2FsbHkgaWYgdGhlIGZvcm0gd2hpY2ggY29udGFpbnMgdGhpcyBjb21wb25lbnQgaXMgcmV3aW5kaW5nLgotCi0gICAgICAgIGJvb2xlYW4gcmV3aW5kaW5nID0gZm9ybS5pc1Jld2luZGluZygpOwotCi0gICAgICAgIC8vIElmIHRoZSBjeWNsZSBpcyByZXdpbmRpbmcsIGJ1dCB0aGUgZm9ybSBjb250YWluaW5nIHRoaXMgZmllbGQgaXMgbm90LAotICAgICAgICAvLyB0aGVuIHRoZXJlJ3Mgbm8gcG9pbnQgaW4gZG9pbmcgbW9yZSB3b3JrLgotCi0gICAgICAgIGlmICghcmV3aW5kaW5nICYmIGN5Y2xlLmlzUmV3aW5kaW5nKCkpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgLy8gVXNlZCB3aGV0aGVyIHJld2luZGluZyBvciBub3QuCi0KLSAgICAgICAgU3RyaW5nIG5hbWUgPSBmb3JtLmdldEVsZW1lbnRJZCh0aGlzKTsKLQkJCi0gICAgICAgIGlmIChyZXdpbmRpbmcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghaXNEaXNhYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhbHVlID0gY3ljbGUuZ2V0UmVxdWVzdENvbnRleHQoKS5nZXRQYXJhbWV0ZXIobmFtZSk7Ci0KLSAgICAgICAgICAgICAgICB1cGRhdGVWYWx1ZSh2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHdyaXRlci5iZWdpbkVtcHR5KCJpbnB1dCIpOwotCi0gICAgICAgIHdyaXRlci5hdHRyaWJ1dGUoInR5cGUiLCBpc0hpZGRlbigpID8gInBhc3N3b3JkIiA6ICJ0ZXh0Iik7Ci0KLSAgICAgICAgaWYgKGlzRGlzYWJsZWQoKSkKLSAgICAgICAgICAgIHdyaXRlci5hdHRyaWJ1dGUoImRpc2FibGVkIiwgImRpc2FibGVkIik7Ci0KLSAgICAgICAgd3JpdGVyLmF0dHJpYnV0ZSgibmFtZSIsIG5hbWUpOwotCi0gICAgICAgIHZhbHVlID0gcmVhZFZhbHVlKCk7Ci0gICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKQotICAgICAgICAgICAgd3JpdGVyLmF0dHJpYnV0ZSgidmFsdWUiLCB2YWx1ZSk7Ci0KLSAgICAgICAgcmVuZGVySW5mb3JtYWxQYXJhbWV0ZXJzKHdyaXRlciwgY3ljbGUpOwotCi0gICAgICAgIGJlZm9yZUNsb3NlVGFnKHdyaXRlciwgY3ljbGUpOwotCi0gICAgICAgIHdyaXRlci5jbG9zZVRhZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBJbnZva2VkIGZyb20ge0BsaW5rICNyZW5kZXIoSU1hcmt1cFdyaXRlciwgSVJlcXVlc3RDeWNsZSl9Ci0gICAgICogIGp1c3QgYmVmb3JlIHRoZSB0YWcgaXMgY2xvc2VkLiAgVGhpcyBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcsCi0gICAgICogIHN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHJvdGVjdGVkIHZvaWQgYmVmb3JlQ2xvc2VUYWcoSU1hcmt1cFdyaXRlciB3cml0ZXIsIElSZXF1ZXN0Q3ljbGUgY3ljbGUpCi0gICAgewotICAgICAgICAvLyBEbyBub3RoaW5nLgotICAgIH0KLQotICAgIC8qKgotICAgICAqICBJbnZva2VkIGJ5IHtAbGluayAjcmVuZGVyKElNYXJrdXBXcml0ZXIgd3JpdGVyLCBJUmVxdWVzdEN5Y2xlIGN5Y2xlKX0KLSAgICAgKiAgd2hlbiBhIHZhbHVlIGlzIG9idGFpbmVkIGZyb20gdGhlCi0gICAgICogIHtAbGluayBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0fS4KLSAgICAgKgotICAgICAqKi8KLQotICAgIGFic3RyYWN0IHByb3RlY3RlZCB2b2lkIHVwZGF0ZVZhbHVlKFN0cmluZyB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiAgSW52b2tlZCBieSB7QGxpbmsgI3JlbmRlcihJTWFya3VwV3JpdGVyIHdyaXRlciwgSVJlcXVlc3RDeWNsZSBjeWNsZSl9Ci0gICAgICogIHdoZW4gcmVuZGVyaW5nIGEgcmVzcG9uc2UuCi0gICAgICoKLSAgICAgKiAgQHJldHVybiB0aGUgY3VycmVudCB2YWx1ZSBmb3IgdGhlIGZpZWxkLCBhcyBhIFN0cmluZywgb3IgbnVsbC4KLSAgICAgKiovCi0KLSAgICBhYnN0cmFjdCBwcm90ZWN0ZWQgU3RyaW5nIHJlYWRWYWx1ZSgpOwotCi0gICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNIaWRkZW4oKTsKLQotICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzRGlzYWJsZWQoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZm9ybS9CdXR0b24uamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9mb3JtL0J1dHRvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTBlNmYzLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9mb3JtL0J1dHRvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuZm9ybTsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUZvcm07Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JTWFya3VwV3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlcXVlc3RDeWNsZTsKLQotLyoqCi0gKiAgSW1wbGVtZW50cyBhIGNvbXBvbmVudCB0aGF0IG1hbmFnZXMgYW4gSFRNTCAmbHQ7aW5wdXQgdHlwZT1idXR0b24mZ3Q7IGZvcm0gZWxlbWVudC4KLSAqCi0gKiAgWzxhIGhyZWY9Ii4uLy4uLy4uLy4uLy4uL0NvbXBvbmVudFJlZmVyZW5jZS9CdXR0b24uaHRtbCI+Q29tcG9uZW50IFJlZmVyZW5jZTwvYT5dCi0gKiAgCi0gKiAgPHA+VGhpcyBjb21wb25lbnQgaXMgdXNlZnVsIGZvciBhdHRhY2hpbmcgSmF2YVNjcmlwdCBvbmNsaWNrIGV2ZW50IGhhbmRsZXJzLgotICoKLSAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiAgQGF1dGhvciBQYXVsIEdlZXJ0cwotICogIEBhdXRob3IgTWFsY29sbSBFZGdhcgotICogIEB2ZXJzaW9uICRJZCQKLSAqKi8KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEJ1dHRvbiBleHRlbmRzIEFic3RyYWN0Rm9ybUNvbXBvbmVudAotewotICAgIHByb3RlY3RlZCB2b2lkIHJlbmRlckNvbXBvbmVudChJTWFya3VwV3JpdGVyIHdyaXRlciwgSVJlcXVlc3RDeWNsZSBjeWNsZSkKLSAgICB7Ci0gICAgICAgIElGb3JtIGZvcm0gPSBnZXRGb3JtKGN5Y2xlKTsKLQotICAgICAgICBib29sZWFuIHJld2luZGluZyA9IGZvcm0uaXNSZXdpbmRpbmcoKTsKLQotICAgICAgICBTdHJpbmcgbmFtZSA9IGZvcm0uZ2V0RWxlbWVudElkKHRoaXMpOwotCi0gICAgICAgIGlmIChyZXdpbmRpbmcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHdyaXRlci5iZWdpbkVtcHR5KCJpbnB1dCIpOwotICAgICAgICB3cml0ZXIuYXR0cmlidXRlKCJ0eXBlIiwgImJ1dHRvbiIpOwotICAgICAgICB3cml0ZXIuYXR0cmlidXRlKCJuYW1lIiwgbmFtZSk7Ci0KLSAgICAgICAgaWYgKGlzRGlzYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgd3JpdGVyLmF0dHJpYnV0ZSgiZGlzYWJsZWQiLCAiZGlzYWJsZWQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBsYWJlbCA9IGdldExhYmVsKCk7Ci0KLSAgICAgICAgaWYgKGxhYmVsICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdyaXRlci5hdHRyaWJ1dGUoInZhbHVlIiwgbGFiZWwpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmVuZGVySW5mb3JtYWxQYXJhbWV0ZXJzKHdyaXRlciwgY3ljbGUpOwotCi0gICAgICAgIHdyaXRlci5jbG9zZVRhZygpOwotICAgIH0KLQotICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0TGFiZWwoKTsKLQotICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzRGlzYWJsZWQoKTsKLX0KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9mb3JtL0J1dHRvbi5qd2MgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZm9ybS9CdXR0b24uandjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1M2IzZGFkLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9mb3JtL0J1dHRvbi5qd2MKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gIAotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTwhLS0gJElkJCAtLT4KLTwhRE9DVFlQRSBjb21wb25lbnQtc3BlY2lmaWNhdGlvbiBQVUJMSUMgCi0gICItLy9BcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi8vVGFwZXN0cnkgU3BlY2lmaWNhdGlvbiAzLjAvL0VOIiAKLSAgImh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvdGFwZXN0cnkvZHRkL1RhcGVzdHJ5XzNfMC5kdGQiPgotICAKLTxjb21wb25lbnQtc3BlY2lmaWNhdGlvbiBjbGFzcz0ib3JnLmFwYWNoZS50YXBlc3RyeS5mb3JtLkJ1dHRvbiIgYWxsb3ctYm9keT0ibm8iPgotCi0gIDxkZXNjcmlwdGlvbj4KLSAgQ3JlYXRlcyBhIGxhYmVsZWQgYnV0dG9uIHdpdGhpbiBhIGZvcm0uCi0gIDwvZGVzY3JpcHRpb24+Ci0KLSAgPHBhcmFtZXRlciBuYW1lPSJsYWJlbCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgZGlyZWN0aW9uPSJpbiIvPgotICA8cGFyYW1ldGVyIG5hbWU9ImRpc2FibGVkIiB0eXBlPSJib29sZWFuIiBkaXJlY3Rpb249ImluIi8+Ci0gIAotICA8cmVzZXJ2ZWQtcGFyYW1ldGVyIG5hbWU9Im5hbWUiLz4KLSAgPHJlc2VydmVkLXBhcmFtZXRlciBuYW1lPSJ0eXBlIi8+Ci0gIAotICA8cHJvcGVydHktc3BlY2lmaWNhdGlvbiBuYW1lPSJuYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+Ci0gIDxwcm9wZXJ0eS1zcGVjaWZpY2F0aW9uIG5hbWU9ImZvcm0iIHR5cGU9Im9yZy5hcGFjaGUudGFwZXN0cnkuSUZvcm0iLz4KLQotPC9jb21wb25lbnQtc3BlY2lmaWNhdGlvbj4KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9mb3JtL0NoZWNrYm94LmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZm9ybS9DaGVja2JveC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzQ3ZWU1Li4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9mb3JtL0NoZWNrYm94LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5mb3JtOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JRm9ybTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklNYXJrdXBXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVxdWVzdEN5Y2xlOwotCi0vKioKLSAqICBJbXBsZW1lbnRzIGEgY29tcG9uZW50IHRoYXQgbWFuYWdlcyBhbiBIVE1MICZsdDtpbnB1dCB0eXBlPWNoZWNrYm94Jmd0OwotICogIGZvcm0gZWxlbWVudC4KLSAqCi0gKiAgWzxhIGhyZWY9Ii4uLy4uLy4uLy4uLy4uL0NvbXBvbmVudFJlZmVyZW5jZS9DaGVja2JveC5odG1sIj5Db21wb25lbnQgUmVmZXJlbmNlPC9hPl0KLSAqCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogIEB2ZXJzaW9uICRJZCQKLSAqIAotICoqLwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ2hlY2tib3ggZXh0ZW5kcyBBYnN0cmFjdEZvcm1Db21wb25lbnQKLXsKLSAgICAvKioKLSAgICAgKiAgUmVuZGVycyB0aGUgZm9ybSBlbGVtZW50cywgb3IgcmVzcG9uZHMgd2hlbiB0aGUgZm9ybSBjb250YWluaW5nIHRoZSBlbGVtZW50Ci0gICAgICogIGlzIHN1Ym1pdHRlZCAoYnkgY2hlY2tpbmcge0BsaW5rIEZvcm0jaXNSZXdpbmRpbmcoKX0uCi0gICAgICoKLSAgICAgKiAgPHA+SW4gdHJhZGl0aW9uYWwgSFRNTCwgbWFueSBjaGVja2JveGVzIHdvdWxkIGhhdmUgdGhlIHNhbWUgbmFtZSBidXQgZGlmZmVyZW50IHZhbHVlcy4KLSAgICAgKiAgVW5kZXIgVGFwZXN0cnksIGl0IG1ha2VzIG1vcmUgc2Vuc2UgdG8gaGF2ZSBkaWZmZXJlbnQgbmFtZXMgYW5kIGEgZml4ZWQgdmFsdWUuCi0gICAgICogIEZvciBhIGNoZWNrYm94LCB3ZSBvbmx5IGNhcmUgYWJvdXQgd2hldGhlciB0aGUgbmFtZSBhcHBlYXJzIGFzIGEgcmVxdWVzdCBwYXJhbWV0ZXIuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwcm90ZWN0ZWQgdm9pZCByZW5kZXJDb21wb25lbnQoSU1hcmt1cFdyaXRlciB3cml0ZXIsIElSZXF1ZXN0Q3ljbGUgY3ljbGUpCi0gICAgewotICAgICAgICBJRm9ybSBmb3JtID0gZ2V0Rm9ybShjeWNsZSk7Ci0JCQotICAgICAgICAvLyBVc2VkIHdoZXRoZXIgcmV3aW5kaW5nIG9yIG5vdC4KLQotICAgICAgICBTdHJpbmcgbmFtZSA9IGZvcm0uZ2V0RWxlbWVudElkKHRoaXMpOwotCi0gICAgICAgIGlmIChmb3JtLmlzUmV3aW5kaW5nKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IGN5Y2xlLmdldFJlcXVlc3RDb250ZXh0KCkuZ2V0UGFyYW1ldGVyKG5hbWUpOwotCi0gICAgICAgICAgICBzZXRTZWxlY3RlZCgodmFsdWUgIT0gbnVsbCkpOwotCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICB3cml0ZXIuYmVnaW5FbXB0eSgiaW5wdXQiKTsKLSAgICAgICAgd3JpdGVyLmF0dHJpYnV0ZSgidHlwZSIsICJjaGVja2JveCIpOwotCi0gICAgICAgIHdyaXRlci5hdHRyaWJ1dGUoIm5hbWUiLCBuYW1lKTsKLQotICAgICAgICBpZiAoaXNEaXNhYmxlZCgpKQotICAgICAgICAgICAgd3JpdGVyLmF0dHJpYnV0ZSgiZGlzYWJsZWQiLCAiZGlzYWJsZWQiKTsKLQotICAgICAgICBpZiAoaXNTZWxlY3RlZCgpKQotICAgICAgICAgICAgd3JpdGVyLmF0dHJpYnV0ZSgiY2hlY2tlZCIsICJjaGVja2VkIik7Ci0KLSAgICAgICAgcmVuZGVySW5mb3JtYWxQYXJhbWV0ZXJzKHdyaXRlciwgY3ljbGUpOwotCi0gICAgICAgIHdyaXRlci5jbG9zZVRhZygpOwotICAgIH0KLQotICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzRGlzYWJsZWQoKTsKLQotICAgIC8qKiBAc2luY2UgMi4yICoqLwotCi0gICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNTZWxlY3RlZCgpOwotCi0gICAgLyoqIEBzaW5jZSAyLjIgKiovCi0KLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRTZWxlY3RlZChib29sZWFuIHNlbGVjdGVkKTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9mb3JtL0NoZWNrYm94Lmp3YyBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9mb3JtL0NoZWNrYm94Lmp3YwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGYxYjMwNy4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZm9ybS9DaGVja2JveC5qd2MKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gIAotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTwhLS0gJElkJCAtLT4KLTwhRE9DVFlQRSBjb21wb25lbnQtc3BlY2lmaWNhdGlvbiBQVUJMSUMKLSAgIi0vL0FwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLy9UYXBlc3RyeSBTcGVjaWZpY2F0aW9uIDMuMC8vRU4iIAotICAiaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy90YXBlc3RyeS9kdGQvVGFwZXN0cnlfM18wLmR0ZCI+Ci0JCi08Y29tcG9uZW50LXNwZWNpZmljYXRpb24gY2xhc3M9Im9yZy5hcGFjaGUudGFwZXN0cnkuZm9ybS5DaGVja2JveCIgYWxsb3ctYm9keT0ibm8iPgotCi0gIDxkZXNjcmlwdGlvbj4KLSAgSW1wbGVtZW50cyBhIGNoZWNrYm94IHdpdGhpbiBhIEZvcm0uCi0gIDwvZGVzY3JpcHRpb24+Ci0gIAotICA8cGFyYW1ldGVyIG5hbWU9InNlbGVjdGVkIiAKLSAgCXR5cGU9ImJvb2xlYW4iCi0gIAlyZXF1aXJlZD0ieWVzIiAKLSAgCWRpcmVjdGlvbj0iZm9ybSI+Ci0gICAgPGRlc2NyaXB0aW9uPgotICAgIFRoZSBwcm9wZXJ0eSByZWFkIGFuZCB1cGRhdGVkIGJ5IHRoZSBDaGVja2JveC4KLSAgICA8L2Rlc2NyaXB0aW9uPgotICA8L3BhcmFtZXRlcj4KLSAgCi0gIDxwYXJhbWV0ZXIgbmFtZT0iZGlzYWJsZWQiIHR5cGU9ImJvb2xlYW4iIGRpcmVjdGlvbj0iaW4iPgotICAgIDxkZXNjcmlwdGlvbj4KLSAgICBJZiB0cnVlLCB0aGVuIHRoZSBjaGVja2JveCB3aWxsIGJlIGRpc2FibGVkIGFuZCBhbnkgaW5wdXQgZnJvbSB0aGUgY2hlY2tib3gKLSAgICB3aWxsIGJlIGlnbm9yZWQuCi0gICAgPC9kZXNjcmlwdGlvbj4KLSAgPC9wYXJhbWV0ZXI+Ci0gIAotICA8cmVzZXJ2ZWQtcGFyYW1ldGVyIG5hbWU9InR5cGUiLz4KLSAgPHJlc2VydmVkLXBhcmFtZXRlciBuYW1lPSJjaGVja2VkIi8+Ci0gIDxyZXNlcnZlZC1wYXJhbWV0ZXIgbmFtZT0ibmFtZSIvPgotICAKLSAgPHByb3BlcnR5LXNwZWNpZmljYXRpb24gbmFtZT0ibmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgotICA8cHJvcGVydHktc3BlY2lmaWNhdGlvbiBuYW1lPSJmb3JtIiB0eXBlPSJvcmcuYXBhY2hlLnRhcGVzdHJ5LklGb3JtIi8+Ci0gIAotPC9jb21wb25lbnQtc3BlY2lmaWNhdGlvbj4KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9mb3JtL0RhdGVQaWNrZXIuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9mb3JtL0RhdGVQaWNrZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNmMWRlOC4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZm9ybS9EYXRlUGlja2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTAgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuZm9ybTsKLQotaW1wb3J0IGphdmEudGV4dC5EYXRlRm9ybWF0U3ltYm9sczsKLWltcG9ydCBqYXZhLnRleHQuUGFyc2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUFzc2V0OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUVuZ2luZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklGb3JtOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSU1hcmt1cFdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZXF1ZXN0Q3ljbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVzb3VyY2VMb2NhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklTY3JpcHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5UYXBlc3RyeTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmVuZ2luZS5JU2NyaXB0U291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuaHRtbC5Cb2R5OwotCi0vKioKLSAqIFByb3ZpZGVzIGEgRm9ybSA8dHQ+amF2YS51dGlsLkRhdGU8L3R0PiBmaWVsZCBjb21wb25lbnQgZm9yIHNlbGVjdGluZyBkYXRlcy4KLSAqCi0gKiAgWzxhIGhyZWY9Ii4uLy4uLy4uLy4uLy4uL0NvbXBvbmVudFJlZmVyZW5jZS9EYXRlUGlja2VyLmh0bWwiPkNvbXBvbmVudCBSZWZlcmVuY2U8L2E+XQotICoKLSAqIEBhdXRob3IgUGF1bCBHZWVydHMKLSAqIEBhdXRob3IgTWFsY29sbSBFZGdhcgotICogQHZlcnNpb24gJElkJAotICogQHNpbmNlIDIuMgotICogCi0gKi8KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIERhdGVQaWNrZXIgZXh0ZW5kcyBBYnN0cmFjdEZvcm1Db21wb25lbnQKLXsKLSAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldEZvcm1hdCgpOwotCi0gICAgcHVibGljIGFic3RyYWN0IERhdGUgZ2V0VmFsdWUoKTsKLQotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFZhbHVlKERhdGUgdmFsdWUpOwotCi0gICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNEaXNhYmxlZCgpOwotCi0gICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gZ2V0SW5jbHVkZVdlZWsoKTsKLQotICAgIHB1YmxpYyBhYnN0cmFjdCBJQXNzZXQgZ2V0SWNvbigpOwotCi0gICAgcHJpdmF0ZSBJU2NyaXB0IF9zY3JpcHQ7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1lNX05BTUUgPSAibmFtZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNZTV9GT1JNTkFNRSA9ICJmb3JtTmFtZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNZTV9NT05USE5BTUVTID0gIm1vbnRoTmFtZXMiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTWU1fU0hPUlRfTU9OVEhOQU1FUyA9ICJzaG9ydE1vbnRoTmFtZXMiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTWU1fV0VFS0RBWU5BTUVTID0gIndlZWtEYXlOYW1lcyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNZTV9TSE9SVF9XRUVLREFZTkFNRVMgPSAic2hvcnRXZWVrRGF5TmFtZXMiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTWU1fRklSU1REQVlJTldFRUsgPSAiZmlyc3REYXlJbldlZWsiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTWU1fTUlOREFZU0lORklSU1RXRUVLID0gIm1pbmltYWxEYXlzSW5GaXJzdFdlZWsiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTWU1fRk9STUFUID0gImZvcm1hdCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNZTV9JTkNMX1dFRUsgPSAiaW5jbHVkZVdlZWsiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTWU1fVkFMVUUgPSAidmFsdWUiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTWU1fQlVUVE9OT05DTElDS0hBTkRMRVIgPSAiYnV0dG9uT25jbGlja0hhbmRsZXIiOwotCi0gICAgLy8gT3V0cHV0IHN5bWJvbAotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNZTV9CVVRUT05OQU1FID0gImJ1dHRvbk5hbWUiOwotCi0gICAgcHJvdGVjdGVkIHZvaWQgZmluaXNoTG9hZCgpCi0gICAgewotICAgICAgICBJRW5naW5lIGVuZ2luZSA9IGdldFBhZ2UoKS5nZXRFbmdpbmUoKTsKLSAgICAgICAgSVNjcmlwdFNvdXJjZSBzb3VyY2UgPSBlbmdpbmUuZ2V0U2NyaXB0U291cmNlKCk7Ci0KLSAgICAgICAgSVJlc291cmNlTG9jYXRpb24gbG9jYXRpb24gPQotICAgICAgICAgICAgZ2V0U3BlY2lmaWNhdGlvbigpLmdldFNwZWNpZmljYXRpb25Mb2NhdGlvbigpLmdldFJlbGF0aXZlTG9jYXRpb24oIkRhdGVQaWNrZXIuc2NyaXB0Iik7Ci0KLSAgICAgICAgX3NjcmlwdCA9IHNvdXJjZS5nZXRTY3JpcHQobG9jYXRpb24pOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHJlbmRlckNvbXBvbmVudChJTWFya3VwV3JpdGVyIHdyaXRlciwgSVJlcXVlc3RDeWNsZSBjeWNsZSkKLSAgICB7Ci0gICAgICAgIElGb3JtIGZvcm0gPSBnZXRGb3JtKGN5Y2xlKTsKLQotICAgICAgICBTdHJpbmcgbmFtZSA9IGZvcm0uZ2V0RWxlbWVudElkKHRoaXMpOwotCi0gICAgICAgIFN0cmluZyBmb3JtYXQgPSBnZXRGb3JtYXQoKTsKLQotICAgICAgICBpZiAoZm9ybWF0ID09IG51bGwpCi0gICAgICAgICAgICBmb3JtYXQgPSAiZGQgTU1NIHl5eXkiOwotCi0gICAgICAgIFNpbXBsZURhdGVGb3JtYXQgZm9ybWF0dGVyID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoZm9ybWF0LCBnZXRQYWdlKCkuZ2V0TG9jYWxlKCkpOwotCi0gICAgICAgIGJvb2xlYW4gZGlzYWJsZWQgPSBpc0Rpc2FibGVkKCk7Ci0KLSAgICAgICAgaWYgKCFjeWNsZS5pc1Jld2luZGluZygpKQotICAgICAgICB7Ci0gICAgICAgICAgICBCb2R5IGJvZHkgPSBCb2R5LmdldChjeWNsZSk7Ci0KLSAgICAgICAgICAgIGlmIChib2R5ID09IG51bGwpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgVGFwZXN0cnkuZm9ybWF0KCJtdXN0LWJlLWNvbnRhaW5lZC1ieS1ib2R5IiwgIkRhdGVQaWNrZXIiKSwKLSAgICAgICAgICAgICAgICAgICAgdGhpcywKLSAgICAgICAgICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgbnVsbCk7Ci0KLSAgICAgICAgICAgIExvY2FsZSBsb2NhbGUgPSBnZXRQYWdlKCkuZ2V0TG9jYWxlKCk7Ci0gICAgICAgICAgICBEYXRlRm9ybWF0U3ltYm9scyBkZnMgPSBuZXcgRGF0ZUZvcm1hdFN5bWJvbHMobG9jYWxlKTsKLSAgICAgICAgICAgIENhbGVuZGFyIGNhbCA9IENhbGVuZGFyLmdldEluc3RhbmNlKGxvY2FsZSk7Ci0KLSAgICAgICAgICAgIERhdGUgdmFsdWUgPSBnZXRWYWx1ZSgpOwotCi0gICAgICAgICAgICBNYXAgc3ltYm9scyA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICAgICAgICAgIHN5bWJvbHMucHV0KFNZTV9OQU1FLCBuYW1lKTsKLSAgICAgICAgICAgIHN5bWJvbHMucHV0KFNZTV9GT1JNQVQsIGZvcm1hdCk7Ci0gICAgICAgICAgICBzeW1ib2xzLnB1dChTWU1fSU5DTF9XRUVLLCBnZXRJbmNsdWRlV2VlaygpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRSk7Ci0KLSAgICAgICAgICAgIHN5bWJvbHMucHV0KFNZTV9NT05USE5BTUVTLCBtYWtlU3RyaW5nTGlzdChkZnMuZ2V0TW9udGhzKCksIDAsIDEyKSk7Ci0gICAgICAgICAgICBzeW1ib2xzLnB1dChTWU1fU0hPUlRfTU9OVEhOQU1FUywgbWFrZVN0cmluZ0xpc3QoZGZzLmdldFNob3J0TW9udGhzKCksIDAsIDEyKSk7Ci0gICAgICAgICAgICBzeW1ib2xzLnB1dChTWU1fV0VFS0RBWU5BTUVTLCBtYWtlU3RyaW5nTGlzdChkZnMuZ2V0V2Vla2RheXMoKSwgMSwgOCkpOwotICAgICAgICAgICAgc3ltYm9scy5wdXQoU1lNX1NIT1JUX1dFRUtEQVlOQU1FUywgbWFrZVN0cmluZ0xpc3QoZGZzLmdldFNob3J0V2Vla2RheXMoKSwgMSwgOCkpOwotICAgICAgICAgICAgc3ltYm9scy5wdXQoU1lNX0ZJUlNUREFZSU5XRUVLLCBuZXcgSW50ZWdlcihjYWwuZ2V0Rmlyc3REYXlPZldlZWsoKSAtIDEpKTsKLSAgICAgICAgICAgIHN5bWJvbHMucHV0KFNZTV9NSU5EQVlTSU5GSVJTVFdFRUssIG5ldyBJbnRlZ2VyKGNhbC5nZXRNaW5pbWFsRGF5c0luRmlyc3RXZWVrKCkpKTsKLSAgICAgICAgICAgIHN5bWJvbHMucHV0KFNZTV9GT1JNTkFNRSwgZm9ybS5nZXROYW1lKCkpOwotICAgICAgICAgICAgc3ltYm9scy5wdXQoU1lNX1ZBTFVFLCB2YWx1ZSk7Ci0KLSAgICAgICAgICAgIF9zY3JpcHQuZXhlY3V0ZShjeWNsZSwgYm9keSwgc3ltYm9scyk7Ci0KLSAgICAgICAgICAgIHdyaXRlci5iZWdpbkVtcHR5KCJpbnB1dCIpOwotICAgICAgICAgICAgd3JpdGVyLmF0dHJpYnV0ZSgidHlwZSIsICJ0ZXh0Iik7Ci0gICAgICAgICAgICB3cml0ZXIuYXR0cmlidXRlKCJuYW1lIiwgbmFtZSk7Ci0gICAgICAgICAgICB3cml0ZXIuYXR0cmlidXRlKCJ0aXRsZSIsIGZvcm1hdHRlci50b0xvY2FsaXplZFBhdHRlcm4oKSk7Ci0KLSAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKQotICAgICAgICAgICAgICAgIHdyaXRlci5hdHRyaWJ1dGUoInZhbHVlIiwgZm9ybWF0dGVyLmZvcm1hdCh2YWx1ZSkpOwotCi0gICAgICAgICAgICBpZiAoZGlzYWJsZWQpCi0gICAgICAgICAgICAgICAgd3JpdGVyLmF0dHJpYnV0ZSgiZGlzYWJsZWQiLCAiZGlzYWJsZWQiKTsKLQotICAgICAgICAgICAgcmVuZGVySW5mb3JtYWxQYXJhbWV0ZXJzKHdyaXRlciwgY3ljbGUpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICB3cml0ZXIucHJpbnRSYXcoIiZuYnNwOyIpOwotCi0gICAgICAgICAgICBpZiAoIWRpc2FibGVkKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHdyaXRlci5iZWdpbigiYSIpOwotICAgICAgICAgICAgICAgIHdyaXRlci5hdHRyaWJ1dGUoImhyZWYiLCAoU3RyaW5nKSBzeW1ib2xzLmdldChTWU1fQlVUVE9OT05DTElDS0hBTkRMRVIpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgSUFzc2V0IGljb24gPSBnZXRJY29uKCk7Ci0KLSAgICAgICAgICAgIHdyaXRlci5iZWdpbkVtcHR5KCJpbWciKTsKLSAgICAgICAgICAgIHdyaXRlci5hdHRyaWJ1dGUoInNyYyIsIGljb24uYnVpbGRVUkwoY3ljbGUpKTsKLSAgICAgICAgICAgIHdyaXRlci5hdHRyaWJ1dGUoImJvcmRlciIsIDApOwotCi0gICAgICAgICAgICBpZiAoIWRpc2FibGVkKQotICAgICAgICAgICAgICAgIHdyaXRlci5lbmQoKTsgLy8gPGE+Ci0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChmb3JtLmlzUmV3aW5kaW5nKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChkaXNhYmxlZCkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgICAgIFN0cmluZyB0ZXh0VmFsdWUgPSBjeWNsZS5nZXRSZXF1ZXN0Q29udGV4dCgpLmdldFBhcmFtZXRlcihuYW1lKTsKLQotICAgICAgICAgICAgaWYgKFRhcGVzdHJ5LmlzQmxhbmsodGV4dFZhbHVlKSkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIERhdGUgdmFsdWUgPSBmb3JtYXR0ZXIucGFyc2UodGV4dFZhbHVlKTsKLQotICAgICAgICAgICAgICAgIHNldFZhbHVlKHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBleCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbGlzdCBvZiBxdW90ZWQgc3RyaW5ncy4gVGhlIGxpc3QgaXMgc3VpdGFibGUgZm9yCi0gICAgICogaW5pdGlhbGl6aW5nIGEgSmF2YVNjcmlwdCBhcnJheS4KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBtYWtlU3RyaW5nTGlzdChTdHJpbmdbXSBhLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKQotICAgIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIGIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSBvZmZzZXQ7IGkgPCBsZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgLy8gSmF2YVNjcmlwdCBpcyBzZW5zaXRpdmUgdG8gc29tZSBVTklDT0RFIGNoYXJhY3RlcnMuIFNvIGZvcgotICAgICAgICAgICAgLy8gdGhlIHNha2Ugb2Ygc2ltcGxpY2l0eSwgd2UganVzdCBlc2NhcGUgZXZlcnl0aGluZwotICAgICAgICAgICAgYi5hcHBlbmQoJyInKTsKLSAgICAgICAgICAgIGNoYXJbXSBjaCA9IGFbaV0udG9DaGFyQXJyYXkoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgY2gubGVuZ3RoOyBqKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGNoW2pdIDwgMTI4KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYi5hcHBlbmQoY2hbal0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBiLmFwcGVuZChlc2NhcGUoY2hbal0pKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGIuYXBwZW5kKCciJyk7Ci0gICAgICAgICAgICBpZiAoaSA8IGxlbmd0aCAtIDEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYi5hcHBlbmQoIiwgIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGIudG9TdHJpbmcoKTsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBlc2NhcGVkIFVuaWNvZGUgY2hhcmFjdGVyCi0gICAgICogQHBhcmFtIGMKLSAgICAgKiBAcmV0dXJuIFRoZSB1bmljb2RlIGNoYXJhY3RlciBpbiBlc2NhcGVkIHN0cmluZyBmb3JtCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGVzY2FwZShjaGFyIGMpCi0gICAgewotICAgICAgICBTdHJpbmdCdWZmZXIgYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGIuYXBwZW5kKEludGVnZXIudG9IZXhTdHJpbmcoYyAmIDB4MDAwRikudG9VcHBlckNhc2UoKSk7Ci0gICAgICAgICAgICBjID4+Pj0gNDsKLSAgICAgICAgfQotICAgICAgICBiLmFwcGVuZCgidVxcIik7Ci0gICAgICAgIHJldHVybiBiLnJldmVyc2UoKS50b1N0cmluZygpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2Zvcm0vRGF0ZVBpY2tlci5qcyBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9mb3JtL0RhdGVQaWNrZXIuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3NGQ2Y2UuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2Zvcm0vRGF0ZVBpY2tlci5qcworKysgL2Rldi9udWxsCkBAIC0xLDk5MiArMCwwIEBACi0vLw0KLS8vIGNhbGVuZGFyIC0tIGEgamF2YXNjcmlwdCBkYXRlIHBpY2tlciBkZXNpZ25lZCBmb3IgZWFzeSBsb2NhbGl6YXRpb24uDQotLy8NCi0vLyAkSWQkDQotLy8NCi0vLw0KLS8vIEF1dGhvcjogUGVyIE5vcnJtYW4gKHBlcm5vcnJtYW5AdGVsaWEuY29tKQ0KLS8vIA0KLS8vIEJhc2VkIG9uIFRhcGVzdHJ5IDIuMy1iZXRhMSBEYXRlcGlja2VyIGJ5IFBhdWwgR2VlcnRzDQotLy8gDQotLy8gVGhhbmtzIHRvOg0KLS8vICAgICBWbGFkaW1pciBbdnljQHF1b3J1cy1tcy5ydV0gZm9yIGZpeGluZyB0aGUgSUU2IHpJbmRleCBwcm9ibGVtLg0KLS8vDQotLy8gVGhlIG5vcm1hbCBzZXR1cCB3b3VsZCBiZSB0byBoYXZlIG9uZSB0ZXh0IGZpZWxkIGZvciBkaXNwbGF5aW5nIHRoZSANCi0vLyBzZWxlY3RlZCBkYXRlLCBhbmQgb25lIGJ1dHRvbiB0byBzaG93L2hpZGUgdGhlIGRhdGUgcGlja2VyIGNvbnRyb2wuDQotLy8gVGhpcyBpcyAgdGhlIHJlY29tbWVuZGVkIGphdmFzY3JpcHQgY29kZToNCi0vLyANCi0vLwk8c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4NCi0vLwkJdmFyIGNhbDsNCi0vLw0KLS8vCQlmdW5jdGlvbiBpbml0KCkgew0KLS8vCQkJY2FsID0gbmV3IENhbGVuZGFyKCk7DQotLy8JCQljYWwuc2V0SW5jbHVkZVdlZWsodHJ1ZSk7DQotLy8JCQljYWwuc2V0Rm9ybWF0KCJ5eXl5LU1NLWRkIik7DQotLy8JCQljYWwuc2V0TW9udGhOYW1lcyguLi4uLik7DQotLy8JCQljYWwuc2V0U2hvcnRNb250aE5hbWVzKC4uLi4pOw0KLS8vCQkJY2FsLmNyZWF0ZSgpOw0KLS8vCQkJDQotLy8JCQlkb2N1bWVudC5mb3JtLmJ1dHRvbjEub25jbGljayA9IGZ1bmN0aW9uKCkgew0KLS8vCQkJCWNhbC50b2dnbGUoZG9jdW1lbnQuZm9ybS5idXR0b24xKTsNCi0vLwkJCX0NCi0vLwkJCWNhbC5vbmNoYW5nZSA9IGZ1bmN0aW9uKCkgew0KLS8vCQkJCWRvY3VtZW50LmZvcm0udGV4dGZpZWxkMS52YWx1ZSAgPSBjYWwuZm9ybWF0RGF0ZSgpOw0KLS8vCQkJfQ0KLS8vCQl9DQotLy8JPC9zY3JpcHQ+DQotLy8NCi0vLyBUaGUgaW5pdCBmdW5jdGlvbiBpcyBpbnZva2VkIHdoZW4gdGhlIGJvZHkgaXMgbG9hZGVkLg0KLS8vDQotLy8NCi0NCi1mdW5jdGlvbiBDYWxlbmRhcihkYXRlKSB7DQotCWlmIChhcmd1bWVudHMubGVuZ3RoID09IDApIHsNCi0JCXRoaXMuX2N1cnJlbnREYXRlID0gbmV3IERhdGUoKTsNCi0JCXRoaXMuX3NlbGVjdGVkRGF0ZSA9IG51bGw7DQotCX0NCi0JZWxzZSB7DQotCQl0aGlzLl9jdXJyZW50RGF0ZSA9IG5ldyBEYXRlKGRhdGUpOw0KLQkJdGhpcy5fc2VsZWN0ZWREYXRlID0gbmV3IERhdGUoZGF0ZSk7DQotCX0NCi0NCi0JLy8gQWNjdW11bGF0ZWQgZGF5cyBwZXIgbW9udGgsIGZvciBub3JtYWwgYW5kIGZvciBsZWFwIHllYXJzLg0KLQkvLyBVc2VkIGluIHdlZWsgbnVtYmVyIGNhbGN1bGF0aW9ucy4JDQotICAgIENhbGVuZGFyLk5VTV9EQVlTID0gWzAsMzEsNTksOTAsMTIwLDE1MSwxODEsMjEyLDI0MywyNzMsMzA0LDMzNF07DQotICAgIA0KLSAgICBDYWxlbmRhci5MRUFQX05VTV9EQVlTID0gWzAsMzEsNjAsOTEsMTIxLDE1MiwxODIsMjEzLDI0NCwyNzQsMzA1LDMzNV07DQotICAgIA0KLQ0KLQl0aGlzLl9idyA9IG5ldyBid19jaGVjaygpOw0KLQl0aGlzLl9zaG93aW5nID0gZmFsc2U7CQ0KLQl0aGlzLl9pbmNsdWRlV2VlayA9IGZhbHNlOw0KLQl0aGlzLl9oaWRlT25TZWxlY3QgPSB0cnVlOw0KLQl0aGlzLl9hbHdheXNWaXNpYmxlID0gZmFsc2U7DQotCQ0KLQl0aGlzLl9kYXRlU2xvdCA9IG5ldyBBcnJheSg0Mik7DQotCXRoaXMuX3dlZWtTbG90ID0gbmV3IEFycmF5KDYpOw0KLQkNCi0JdGhpcy5fZmlyc3REYXlPZldlZWsgPSAxOw0KLQl0aGlzLl9taW5pbWFsRGF5c0luRmlyc3RXZWVrID0gNDsNCi0JDQotCXRoaXMuX21vbnRoTmFtZXMgPSBbCQ0KLQkJIkphbnVhcnkiLAkJIkZlYnJ1YXJ5IiwJCSJNYXJjaCIsCSJBcHJpbCIsDQotCQkiTWF5IiwJCQkiSnVuZSIsCQkJIkp1bHkiLAkJIkF1Z3VzdCIsDQotCQkiU2VwdGVtYmVyIiwJIk9jdG9iZXIiLAkJIk5vdmVtYmVyIiwJIkRlY2VtYmVyIg0KLQldOw0KLQkNCi0JdGhpcy5fc2hvcnRNb250aE5hbWVzID0gWyANCi0JCSJqYW4iLCAiZmViIiwgIm1hciIsICJhcHIiLCAibWF5IiwgImp1biIsIA0KLQkJImp1bCIsICJhdWciLCAic2VwIiwgIm9jdCIsICJub3YiLCAiZGVjIg0KLQldOw0KLQkNCi0JLy8gV2VlayBkYXlzIHN0YXJ0IHdpdGggU3VuZGF5PTAsIC4uLiBTYXR1cmRheT02DQotCXRoaXMuX3dlZWtEYXlOYW1lcyA9IFsNCi0JCSJTdW5kYXkiLCAiTW9uZGF5IiwgIlR1ZXNkYXkiLCAiV2VkbmVzZGF5IiwgIlRodXJzZGF5IiwgIkZyaWRheSIsICJTYXR1cmRheSIgDQotCV07DQotCQ0KLQl0aGlzLl9zaG9ydFdlZWtEYXlOYW1lcyA9IA0KLQkJWyJTdW4iLCAiTW9uIiwgIlR1ZSIsICJXZWQiLCAiVGh1IiwgIkZyaSIsICJTYXQiIF07DQotCQ0KLQl0aGlzLl9kZWZhdWx0Rm9ybWF0ID0gInl5eXktTU0tZGQiOw0KLQkNCi0JdGhpcy5fZm9ybWF0ID0gdGhpcy5fZGVmYXVsdEZvcm1hdDsgDQotDQotCXRoaXMuX2NhbERpdiA9IG51bGw7DQotCQ0KLQkNCi19DQotDQotLyoqDQotICoJQ1JFQVRFIHRoZSBDYWxlbmRhciBET00gZWxlbWVudA0KLSAqLw0KLUNhbGVuZGFyLnByb3RvdHlwZS5jcmVhdGUgPSBmdW5jdGlvbigpIHsNCi0JdmFyIGRpdjsNCi0JdmFyIHRhYmxlOw0KLQl2YXIgdGJvZHk7DQotCXZhciB0cjsNCi0JdmFyIHRkOw0KLQl2YXIgZHAgPSB0aGlzOw0KLQkNCi0JLy8gQ3JlYXRlIHRoZSB0b3AtbGV2ZWwgZGl2IGVsZW1lbnQNCi0JdGhpcy5fY2FsRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7DQotCXRoaXMuX2NhbERpdi5jbGFzc05hbWUgPSAiY2FsZW5kYXIiOw0KLQl0aGlzLl9jYWxEaXYuc3R5bGUucG9zaXRpb24gPSAiYWJzb2x1dGUiOw0KLQl0aGlzLl9jYWxEaXYuc3R5bGUuZGlzcGxheSA9ICJub25lIjsNCi0JdGhpcy5fY2FsRGl2LnN0eWxlLmJvcmRlciA9ICIxcHggc29saWQgV2luZG93VGV4dCI7DQotCXRoaXMuX2NhbERpdi5zdHlsZS50ZXh0QWxpZ24gPSAiY2VudGVyIjsNCi0JdGhpcy5fY2FsRGl2LnN0eWxlLmJhY2tncm91bmQgPSAiV2luZG93IjsNCi0JdGhpcy5fY2FsRGl2LnN0eWxlLnpJbmRleCA9ICI0MDAiOw0KLQkNCi0JDQotCS8vIGhlYWRlciBkaXYNCi0JZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7DQotCWRpdi5jbGFzc05hbWUgPSAiY2FsZW5kYXJIZWFkZXIiOw0KLQlkaXYuc3R5bGUuYmFja2dyb3VuZCA9ICJBY3RpdmVDYXB0aW9uIjsNCi0JZGl2LnN0eWxlLnBhZGRpbmcgPSAiM3B4IjsNCi0JZGl2LnN0eWxlLmJvcmRlckJvdHRvbSA9ICIxcHggc29saWQgV2luZG93VGV4dCI7DQotCXRoaXMuX2NhbERpdi5hcHBlbmRDaGlsZChkaXYpOw0KLQkNCi0JdGFibGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0YWJsZSIpOw0KLQl0YWJsZS5zdHlsZS5jZWxsU3BhY2luZyA9IDA7DQotCWRpdi5hcHBlbmRDaGlsZCh0YWJsZSk7DQotCQ0KLQl0Ym9keSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRib2R5Iik7DQotCXRhYmxlLmFwcGVuZENoaWxkKHRib2R5KTsNCi0JDQotCXRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidHIiKTsNCi0JdGJvZHkuYXBwZW5kQ2hpbGQodHIpOw0KLQkNCi0JLy8gUHJldmlvdXMgTW9udGggQnV0dG9uDQotCXRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTsNCi0JdGhpcy5fcHJldmlvdXNNb250aCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImJ1dHRvbiIpOw0KLQl0aGlzLl9wcmV2aW91c01vbnRoLmNsYXNzTmFtZSA9ICJwcmV2TW9udGhCdXR0b24iDQotCXRoaXMuX3ByZXZpb3VzTW9udGguYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIjw8IikpOw0KLQkvL3RoaXMuX3ByZXZpb3VzTW9udGguYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSg5NjY4KSkpOw0KLQl0ZC5hcHBlbmRDaGlsZCh0aGlzLl9wcmV2aW91c01vbnRoKTsNCi0JdHIuYXBwZW5kQ2hpbGQodGQpOw0KLQkNCi0JDQotCQ0KLQkvLw0KLQkvLyBDcmVhdGUgdGhlIG1vbnRoIGRyb3AgZG93biANCi0JLy8NCi0JdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpOw0KLQl0ZC5jbGFzc05hbWUgPSAibGFiZWxDb250YWluZXIiOw0KLQl0ci5hcHBlbmRDaGlsZCh0ZCk7DQotCXRoaXMuX21vbnRoU2VsZWN0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2VsZWN0Iik7DQotICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IHRoaXMuX21vbnRoTmFtZXMubGVuZ3RoIDsgaSsrKSB7DQotICAgICAgICB2YXIgb3B0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgib3B0aW9uIik7DQotICAgICAgICBvcHQuaW5uZXJIVE1MID0gdGhpcy5fbW9udGhOYW1lc1tpXTsNCi0gICAgICAgIG9wdC52YWx1ZSA9IGk7DQotICAgICAgICBpZiAoaSA9PSB0aGlzLl9jdXJyZW50RGF0ZS5nZXRNb250aCgpKSB7DQotICAgICAgICAgICAgb3B0LnNlbGVjdGVkID0gdHJ1ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIHRoaXMuX21vbnRoU2VsZWN0LmFwcGVuZENoaWxkKG9wdCk7DQotICAgIH0NCi0JdGQuYXBwZW5kQ2hpbGQodGhpcy5fbW9udGhTZWxlY3QpOw0KLQkNCi0NCi0JLy8gDQotCS8vIENyZWF0ZSB0aGUgeWVhciBkcm9wIGRvd24NCi0JLy8NCi0JdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpOw0KLQl0ZC5jbGFzc05hbWUgPSAibGFiZWxDb250YWluZXIiOw0KLQl0ci5hcHBlbmRDaGlsZCh0ZCk7DQotCXRoaXMuX3llYXJTZWxlY3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzZWxlY3QiKTsNCi0JZm9yKHZhciBpPTE5MjA7IGkgPCAyMDUwOyArK2kpIHsNCi0JCXZhciBvcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJvcHRpb24iKTsNCi0JCW9wdC5pbm5lckhUTUwgPSBpOw0KLQkJb3B0LnZhbHVlID0gaTsNCi0JCWlmIChpID09IHRoaXMuX2N1cnJlbnREYXRlLmdldEZ1bGxZZWFyKCkpIHsNCi0JCQlvcHQuc2VsZWN0ZWQgPSBmYWxzZTsNCi0JCX0NCi0JCXRoaXMuX3llYXJTZWxlY3QuYXBwZW5kQ2hpbGQob3B0KTsNCi0JfQ0KLQl0ZC5hcHBlbmRDaGlsZCh0aGlzLl95ZWFyU2VsZWN0KTsNCi0JDQotCQ0KLQl0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7DQotCXRoaXMuX25leHRNb250aCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImJ1dHRvbiIpOw0KLQl0aGlzLl9uZXh0TW9udGguYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIj4+IikpOw0KLQkvL3RoaXMuX25leHRNb250aC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcuZnJvbUNoYXJDb2RlKDk2NTQpKSk7DQotCXRoaXMuX25leHRNb250aC5jbGFzc05hbWUgPSAibmV4dE1vbnRoQnV0dG9uIjsNCi0JdGQuYXBwZW5kQ2hpbGQodGhpcy5fbmV4dE1vbnRoKTsNCi0JdHIuYXBwZW5kQ2hpbGQodGQpOw0KLQkNCi0JLy8gQ2FsZW5kYXIgYm9keQ0KLQlkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsNCi0JZGl2LmNsYXNzTmFtZSA9ICJjYWxlbmRhckJvZHkiOw0KLQl0aGlzLl9jYWxEaXYuYXBwZW5kQ2hpbGQoZGl2KTsNCi0JdGhpcy5fdGFibGUgPSBkaXY7DQotCQ0KLQkvLyBDcmVhdGUgdGhlIGluc2lkZSBvZiBjYWxlbmRhciBib2R5CQ0KLQkNCi0JdmFyIHRleHQ7DQotCXRhYmxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGFibGUiKTsNCi0JLy90YWJsZS5zdHlsZS53aWR0aD0iMTAwJSI7DQotCXRhYmxlLmNsYXNzTmFtZSA9ICJncmlkIjsNCi0JdGFibGUuc3R5bGUuZm9udCAJIAk9ICJzbWFsbC1jYXB0aW9uIjsNCi0JdGFibGUuc3R5bGUuZm9udFdlaWdodCAJPSAibm9ybWFsIjsNCi0JdGFibGUuc3R5bGUudGV4dEFhbGlnbgk9ICJjZW50ZXIiOw0KLQl0YWJsZS5zdHlsZS5jb2xvcgkJPSAiV2luZG93VGV4dCI7DQotCXRhYmxlLnN0eWxlLmN1cnNvcgkJPSAiZGVmYXVsdCI7DQotCXRhYmxlLmNlbGxQYWRkaW5nCQk9ICIzIjsNCi0JdGFibGUuY2VsbFNwYWNpbmcJCT0gIjAiOw0KLQkNCi0gICAgZGl2LmFwcGVuZENoaWxkKHRhYmxlKTsNCi0JdmFyIHRoZWFkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGhlYWQiKTsNCi0JdGFibGUuYXBwZW5kQ2hpbGQodGhlYWQpOw0KLQl0ciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRyIik7DQotCXRoZWFkLmFwcGVuZENoaWxkKHRyKTsNCi0JDQotCS8vIHdlZWtkYXlzIGhlYWRlcg0KLQlpZiAodGhpcy5faW5jbHVkZVdlZWspIHsNCi0JCXRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGgiKTsNCi0JCXRleHQgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgidyIpOw0KLQkJdGQuYXBwZW5kQ2hpbGQodGV4dCk7DQotCQl0ZC5jbGFzc05hbWUgPSAid2Vla051bWJlckhlYWQiOw0KLQkJdGQuc3R5bGUudGV4dEFsaWduID0gImxlZnQiOw0KLQkJdHIuYXBwZW5kQ2hpbGQodGQpOw0KLQl9DQotCWZvcihpPTA7IGkgPCA3OyArK2kpIHsNCi0JCXRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGgiKTsNCi0JCXRleHQgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0aGlzLl9zaG9ydFdlZWtEYXlOYW1lc1soaSt0aGlzLl9maXJzdERheU9mV2VlayklN10pOw0KLQkJdGQuYXBwZW5kQ2hpbGQodGV4dCk7DQotCQl0ZC5jbGFzc05hbWUgPSAid2Vla0RheUhlYWQiOw0KLQkJdGQuc3R5bGUuZm9udFdlaWdodCA9ICJib2xkIjsNCi0JCXRkLnN0eWxlLmJvcmRlckJvdHRvbSA9ICIxcHggc29saWQgV2luZG93VGV4dCI7DQotCQl0ci5hcHBlbmRDaGlsZCh0ZCk7DQotCX0NCi0JDQotCS8vIERhdGUgZ3JpZA0KLQl0Ym9keSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRib2R5Iik7DQotCXRhYmxlLmFwcGVuZENoaWxkKHRib2R5KTsNCi0JDQotCWZvcih3ZWVrPTA7IHdlZWs8NjsgKyt3ZWVrKSB7DQotCQl0ciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRyIik7DQotCQl0Ym9keS5hcHBlbmRDaGlsZCh0cik7DQotDQotCQlpZiAodGhpcy5faW5jbHVkZVdlZWspIHsNCi0JCQl0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7DQotCQkJdGQuY2xhc3NOYW1lID0gIndlZWtOdW1iZXIiOw0KLQkJCXRkLnN0eWxlLmZvbnRXZWlnaHQgPSAibm9ybWFsIjsNCi0JCQl0ZC5zdHlsZS5ib3JkZXJSaWdodCA9ICIxcHggc29saWQgV2luZG93VGV4dCI7DQotCQkJdGQuc3R5bGUudGV4dEFsaWduID0gImxlZnQiOw0KLQkJCXRleHQgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcuZnJvbUNoYXJDb2RlKDE2MCkpOw0KLQkJCXRkLmFwcGVuZENoaWxkKHRleHQpOw0KLSAgICAgICAgICAgIC8vc2V0Q3Vyc29yKHRkKTsNCi0gICAgICAgICAgICB0ZC5hbGlnbj0iY2VudGVyIjsNCi0JCQl0ci5hcHBlbmRDaGlsZCh0ZCk7DQotCQkJdmFyIHRtcCA9IG5ldyBPYmplY3QoKTsNCi0JCQl0bXAudGFnID0gIldFRUsiOw0KLQkJCXRtcC52YWx1ZSA9IC0xOw0KLQkJCXRtcC5kYXRhID0gdGV4dDsNCi0JCQl0aGlzLl93ZWVrU2xvdFt3ZWVrXSA9IHRtcDsNCi0JCX0NCi0NCi0JCWZvcihkYXk9MDsgZGF5PDc7ICsrZGF5KSB7DQotCQkJdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpOw0KLQkJCXRleHQgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcuZnJvbUNoYXJDb2RlKDE2MCkpOw0KLQkJCXRkLmFwcGVuZENoaWxkKHRleHQpOw0KLSAgICAgICAgICAgIHNldEN1cnNvcih0ZCk7DQotICAgICAgICAgICAgdGQuYWxpZ249ImNlbnRlciI7DQotICAgICAgICAgICAgdGQuc3R5bGUuZm9udFdlaWdodD0ibm9ybWFsIjsNCi0gICAgICAgICAgICANCi0JCQl0ci5hcHBlbmRDaGlsZCh0ZCk7DQotCQkJdmFyIHRtcCA9IG5ldyBPYmplY3QoKTsNCi0JCQl0bXAudGFnID0gIkRBVEUiOw0KLQkJCXRtcC52YWx1ZSA9IC0xOw0KLQkJCXRtcC5kYXRhID0gdGV4dDsNCi0JCQl0aGlzLl9kYXRlU2xvdFsod2Vlayo3KStkYXldID0gdG1wOw0KLQkJCQ0KLQkJfQ0KLQl9DQotCQ0KLQkvLyBDYWxlbmRhciBGb290ZXINCi0JZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7DQotCWRpdi5jbGFzc05hbWUgPSAiY2FsZW5kYXJGb290ZXIiOw0KLQl0aGlzLl9jYWxEaXYuYXBwZW5kQ2hpbGQoZGl2KTsNCi0JDQotCXRhYmxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGFibGUiKTsNCi0JLy90YWJsZS5zdHlsZS53aWR0aD0iMTAwJSI7DQotCXRhYmxlLmNsYXNzTmFtZSA9ICJmb290ZXJUYWJsZSI7DQotCXRhYmxlLmNlbGxTcGFjaW5nID0gMDsNCi0JZGl2LmFwcGVuZENoaWxkKHRhYmxlKTsNCi0JDQotCXRib2R5ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGJvZHkiKTsNCi0JdGFibGUuYXBwZW5kQ2hpbGQodGJvZHkpOw0KLQkNCi0JdHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ciIpOw0KLQl0Ym9keS5hcHBlbmRDaGlsZCh0cik7DQotDQotCS8vDQotCS8vIFRoZSBUT0RBWSBidXR0b24JDQotCS8vDQotCXRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTsNCi0JdGhpcy5fdG9kYXlCdXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJidXR0b24iKTsNCi0JdmFyIHRvZGF5ID0gbmV3IERhdGUoKTsNCi0JdmFyIGJ1dHRvblRleHQgPSB0b2RheS5nZXREYXRlKCkgKyAiICIgKyB0aGlzLl9tb250aE5hbWVzW3RvZGF5LmdldE1vbnRoKCldICsgIiwgIiArIHRvZGF5LmdldEZ1bGxZZWFyKCk7DQotCXRoaXMuX3RvZGF5QnV0dG9uLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGJ1dHRvblRleHQpKTsNCi0JdGQuYXBwZW5kQ2hpbGQodGhpcy5fdG9kYXlCdXR0b24pOw0KLQl0ci5hcHBlbmRDaGlsZCh0ZCk7DQotCQ0KLQkvLw0KLQkvLyBUaGUgQ0xFQVIgYnV0dG9uDQotCS8vDQotCXRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTsNCi0JdGhpcy5fY2xlYXJCdXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJidXR0b24iKTsNCi0JdmFyIHRvZGF5ID0gbmV3IERhdGUoKTsNCi0JYnV0dG9uVGV4dCA9ICJDbGVhciI7DQotCXRoaXMuX2NsZWFyQnV0dG9uLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGJ1dHRvblRleHQpKTsNCi0JdGQuYXBwZW5kQ2hpbGQodGhpcy5fY2xlYXJCdXR0b24pOw0KLQl0ci5hcHBlbmRDaGlsZCh0ZCk7DQotCQ0KLQkNCi0JdGhpcy5fdXBkYXRlKCk7DQotCXRoaXMuX3VwZGF0ZUhlYWRlcigpOw0KLQkNCi0NCi0NCi0JLy8gSUU1NSsgZXh0ZW5zaW9uCQkNCi0JdGhpcy5fcHJldmlvdXNNb250aC5oaWRlRm9jdXMgPSB0cnVlOw0KLQl0aGlzLl9uZXh0TW9udGguaGlkZUZvY3VzID0gdHJ1ZTsNCi0JdGhpcy5fdG9kYXlCdXR0b24uaGlkZUZvY3VzID0gdHJ1ZTsNCi0JLy8gZW5kIElFNTUrIGV4dGVuc2lvbg0KLQkNCi0JLy8gaG9vayB1cCBldmVudHMNCi0JLy8gYnV0dG9ucw0KLQl0aGlzLl9wcmV2aW91c01vbnRoLm9uY2xpY2sgPSBmdW5jdGlvbiAoKSB7DQotCQlkcC5wcmV2TW9udGgoKTsNCi0JfTsNCi0NCi0JdGhpcy5fbmV4dE1vbnRoLm9uY2xpY2sgPSBmdW5jdGlvbiAoKSB7DQotCQlkcC5uZXh0TW9udGgoKTsNCi0JfTsNCi0NCi0JdGhpcy5fdG9kYXlCdXR0b24ub25jbGljayA9IGZ1bmN0aW9uICgpIHsNCi0JCWRwLnNldFNlbGVjdGVkRGF0ZShuZXcgRGF0ZSgpKTsNCi0JCWRwLmhpZGUoKTsNCi0JfTsNCi0NCi0JdGhpcy5fY2xlYXJCdXR0b24ub25jbGljayA9IGZ1bmN0aW9uICgpIHsNCi0JCWRwLmNsZWFyU2VsZWN0ZWREYXRlKCk7DQotCQlkcC5oaWRlKCk7DQotCX07DQotCQ0KLQ0KLQl0aGlzLl9jYWxEaXYub25zZWxlY3RzdGFydCA9IGZ1bmN0aW9uICgpIHsNCi0JCXJldHVybiBmYWxzZTsNCi0JfTsNCi0JDQotCXRoaXMuX3RhYmxlLm9uY2xpY2sgPSBmdW5jdGlvbiAoZSkgew0KLQkJLy8gZmluZCBldmVudA0KLQkJaWYgKGUgPT0gbnVsbCkgZSA9IGRvY3VtZW50LnBhcmVudFdpbmRvdy5ldmVudDsNCi0JCQ0KLQkJLy8gZmluZCB0ZA0KLQkJdmFyIGVsID0gZS50YXJnZXQgIT0gbnVsbCA/IGUudGFyZ2V0IDogZS5zcmNFbGVtZW50Ow0KLQkJd2hpbGUgKGVsLm5vZGVUeXBlICE9IDEpDQotCQkJZWwgPSBlbC5wYXJlbnROb2RlOw0KLQkJd2hpbGUgKGVsICE9IG51bGwgJiYgZWwudGFnTmFtZSAmJiBlbC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgIT0gInRkIikNCi0JCQllbCA9IGVsLnBhcmVudE5vZGU7DQotCQkNCi0JCS8vIGlmIG5vIHRkIGZvdW5kLCByZXR1cm4NCi0JCWlmIChlbCA9PSBudWxsIHx8IGVsLnRhZ05hbWUgPT0gbnVsbCB8fCBlbC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgIT0gInRkIikNCi0JCQlyZXR1cm47DQotCQkNCi0JCXZhciBkID0gbmV3IERhdGUoZHAuX2N1cnJlbnREYXRlKTsNCi0JCXZhciBuID0gTnVtYmVyKGVsLmZpcnN0Q2hpbGQuZGF0YSk7DQotCQlpZiAoaXNOYU4obikgfHwgbiA8PSAwIHx8IG4gPT0gbnVsbCkNCi0JCQlyZXR1cm47DQotCQkNCi0JCWlmIChlbC5jbGFzc05hbWUgPT0gIndlZWtOdW1iZXIiKQ0KLQkJCXJldHVybjsNCi0JCQkNCi0JCWQuc2V0RGF0ZShuKTsNCi0JCWRwLnNldFNlbGVjdGVkRGF0ZShkKTsNCi0NCi0JCWlmICghZHAuX2Fsd2F5c1Zpc2libGUgJiYgZHAuX2hpZGVPblNlbGVjdCkgew0KLQkJCWRwLmhpZGUoKTsNCi0JCX0NCi0JCQ0KLQl9Ow0KLQkNCi0JDQotCXRoaXMuX2NhbERpdi5vbmtleWRvd24gPSBmdW5jdGlvbiAoZSkgew0KLQkJaWYgKGUgPT0gbnVsbCkgZSA9IGRvY3VtZW50LnBhcmVudFdpbmRvdy5ldmVudDsNCi0JCXZhciBrYyA9IGUua2V5Q29kZSAhPSBudWxsID8gZS5rZXlDb2RlIDogZS5jaGFyQ29kZTsNCi0NCi0JCWlmKGtjID09IDEzKSB7DQotCQkJdmFyIGQgPSBuZXcgRGF0ZShkcC5fY3VycmVudERhdGUpLnZhbHVlT2YoKTsNCi0JCQlkcC5zZXRTZWxlY3RlZERhdGUoZCk7DQotDQotCQkJaWYgKCFkcC5fYWx3YXlzVmlzaWJsZSAmJiBkcC5faGlkZU9uU2VsZWN0KSB7DQotCQkJCWRwLmhpZGUoKTsNCi0JCQl9DQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQkJCQ0KLQkJDQotCQlpZiAoa2MgPCAzNyB8fCBrYyA+IDQwKSByZXR1cm4gdHJ1ZTsNCi0JCQ0KLQkJdmFyIGQgPSBuZXcgRGF0ZShkcC5fY3VycmVudERhdGUpLnZhbHVlT2YoKTsNCi0JCWlmIChrYyA9PSAzNykgLy8gbGVmdA0KLQkJCWQgLT0gMjQgKiA2MCAqIDYwICogMTAwMDsNCi0JCWVsc2UgaWYgKGtjID09IDM5KSAvLyByaWdodA0KLQkJCWQgKz0gMjQgKiA2MCAqIDYwICogMTAwMDsNCi0JCWVsc2UgaWYgKGtjID09IDM4KSAvLyB1cA0KLQkJCWQgLT0gNyAqIDI0ICogNjAgKiA2MCAqIDEwMDA7DQotCQllbHNlIGlmIChrYyA9PSA0MCkgLy8gZG93bg0KLQkJCWQgKz0gNyAqIDI0ICogNjAgKiA2MCAqIDEwMDA7DQotDQotCQlkcC5zZXRDdXJyZW50RGF0ZShuZXcgRGF0ZShkKSk7DQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi0JDQotCS8vIGllNiBleHRlbnNpb24NCi0JdGhpcy5fY2FsRGl2Lm9ubW91c2V3aGVlbCA9IGZ1bmN0aW9uIChlKSB7DQotCQlpZiAoZSA9PSBudWxsKSBlID0gZG9jdW1lbnQucGFyZW50V2luZG93LmV2ZW50Ow0KLQkJdmFyIG4gPSAtIGUud2hlZWxEZWx0YSAvIDEyMDsNCi0JCXZhciBkID0gbmV3IERhdGUoZHAuX2N1cnJlbnREYXRlKTsNCi0JCXZhciBtID0gZC5nZXRNb250aCgpICsgbjsNCi0JCWQuc2V0TW9udGgobSk7DQotCQkNCi0JCQ0KLQkJZHAuc2V0Q3VycmVudERhdGUoZCk7DQotCQkNCi0JCXJldHVybiBmYWxzZTsNCi0JfQ0KLQ0KLQl0aGlzLl9tb250aFNlbGVjdC5vbmNoYW5nZSA9IGZ1bmN0aW9uKGUpIHsNCi0JCWlmIChlID09IG51bGwpIGUgPSBkb2N1bWVudC5wYXJlbnRXaW5kb3cuZXZlbnQ7DQotCQllID0gZ2V0RXZlbnRPYmplY3QoZSk7DQotCQlkcC5zZXRNb250aChlLnZhbHVlKTsNCi0JfQ0KLQ0KLQl0aGlzLl9tb250aFNlbGVjdC5vbmNsaWNrID0gZnVuY3Rpb24oZSkgew0KLQkJaWYgKGUgPT0gbnVsbCkgZSA9IGRvY3VtZW50LnBhcmVudFdpbmRvdy5ldmVudDsNCi0JCWUgPSBnZXRFdmVudE9iamVjdChlKTsNCi0JCWUuY2FuY2VsQnViYmxlID0gdHJ1ZTsNCi0JfQ0KLQkNCi0JdGhpcy5feWVhclNlbGVjdC5vbmNoYW5nZSA9IGZ1bmN0aW9uKGUpIHsNCi0JCWlmIChlID09IG51bGwpIGUgPSBkb2N1bWVudC5wYXJlbnRXaW5kb3cuZXZlbnQ7DQotCQllID0gZ2V0RXZlbnRPYmplY3QoZSk7DQotCQlkcC5zZXRZZWFyKGUudmFsdWUpOw0KLQl9DQotDQotDQotCWRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5fY2FsRGl2KTsNCi0JDQotCQ0KLQlyZXR1cm4gdGhpcy5fY2FsRGl2Ow0KLX0NCi0NCi1DYWxlbmRhci5wcm90b3R5cGUuX3VwZGF0ZSA9IGZ1bmN0aW9uKCkgew0KLQ0KLQ0KLQkvLyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBkYXlzIGluIHRoZSBtb250aCBmb3IgdGhlIHNlbGVjdGVkIGRhdGUNCi0JdmFyIGRhdGUgPSB0aGlzLl9jdXJyZW50RGF0ZTsNCi0JdmFyIHRvZGF5ID0gdG9JU09EYXRlKG5ldyBEYXRlKCkpOw0KLQkNCi0JDQotCXZhciBzZWxlY3RlZCA9ICIiOw0KLQlpZiAodGhpcy5fc2VsZWN0ZWREYXRlICE9IG51bGwpIHsNCi0JCXNlbGVjdGVkID0gdG9JU09EYXRlKHRoaXMuX3NlbGVjdGVkRGF0ZSk7DQotCX0NCi0JdmFyIGN1cnJlbnQgPSB0b0lTT0RhdGUodGhpcy5fY3VycmVudERhdGUpOw0KLQl2YXIgZDEgPSBuZXcgRGF0ZShkYXRlLmdldEZ1bGxZZWFyKCksIGRhdGUuZ2V0TW9udGgoKSwgMSk7DQotCXZhciBkMiA9IG5ldyBEYXRlKGRhdGUuZ2V0RnVsbFllYXIoKSwgZGF0ZS5nZXRNb250aCgpKzEsIDEpOw0KLQl2YXIgbW9udGhMZW5ndGggPSBNYXRoLnJvdW5kKChkMiAtIGQxKSAvICgyNCAqIDYwICogNjAgKiAxMDAwKSk7DQotCQ0KLQkvLyBGaW5kIG91dCB0aGUgd2Vla0RheSBpbmRleCBmb3IgdGhlIGZpcnN0IG9mIHRoaXMgbW9udGgNCi0JdmFyIGZpcnN0SW5kZXggPSAoZDEuZ2V0RGF5KCkgLSB0aGlzLl9maXJzdERheU9mV2VlaykgJSA3IDsNCi0gICAgaWYgKGZpcnN0SW5kZXggPCAwKSB7DQotICAgIAlmaXJzdEluZGV4ICs9IDc7DQotICAgIH0NCi0JDQotCXZhciBpbmRleCA9IDA7DQotCXdoaWxlIChpbmRleCA8IGZpcnN0SW5kZXgpIHsNCi0JCXRoaXMuX2RhdGVTbG90W2luZGV4XS52YWx1ZSA9IC0xOw0KLQkJdGhpcy5fZGF0ZVNsb3RbaW5kZXhdLmRhdGEuZGF0YSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoMTYwKTsNCi0JCXRoaXMuX2RhdGVTbG90W2luZGV4XS5kYXRhLnBhcmVudE5vZGUuY2xhc3NOYW1lID0gIiI7DQotCQl0aGlzLl9kYXRlU2xvdFtpbmRleF0uZGF0YS5wYXJlbnROb2RlLnN0eWxlLmZvbnRXZWlnaHQgPSAibm9ybWFsIjsNCi0JCXRoaXMuX2RhdGVTbG90W2luZGV4XS5kYXRhLnBhcmVudE5vZGUuc3R5bGUuYm9yZGVyPSAibm9uZSI7DQotCQlpbmRleCsrOw0KLQl9DQotICAgICAgICANCi0gICAgZm9yIChpID0gMTsgaSA8PSBtb250aExlbmd0aDsgaSsrLCBpbmRleCsrKSB7DQotCQl0aGlzLl9kYXRlU2xvdFtpbmRleF0udmFsdWUgPSBpOw0KLQkJdGhpcy5fZGF0ZVNsb3RbaW5kZXhdLmRhdGEuZGF0YSA9IGk7DQotCQl0aGlzLl9kYXRlU2xvdFtpbmRleF0uZGF0YS5wYXJlbnROb2RlLmNsYXNzTmFtZSA9ICIiOw0KLQkJdGhpcy5fZGF0ZVNsb3RbaW5kZXhdLmRhdGEucGFyZW50Tm9kZS5zdHlsZS5mb250V2VpZ2h0ID0gIm5vcm1hbCI7DQotCQl0aGlzLl9kYXRlU2xvdFtpbmRleF0uZGF0YS5wYXJlbnROb2RlLnN0eWxlLmJvcmRlcj0gIm5vbmUiOw0KLQkJaWYgKHRvSVNPRGF0ZShkMSkgPT0gdG9kYXkpIHsNCi0JCQl0aGlzLl9kYXRlU2xvdFtpbmRleF0uZGF0YS5wYXJlbnROb2RlLmNsYXNzTmFtZSA9ICJ0b2RheSI7DQotCQkJdGhpcy5fZGF0ZVNsb3RbaW5kZXhdLmRhdGEucGFyZW50Tm9kZS5zdHlsZS5mb250V2VpZ2h0ID0gImJvbGQiOw0KLQkJfQ0KLQkJaWYgKHRvSVNPRGF0ZShkMSkgPT0gY3VycmVudCkgew0KLQkJCXRoaXMuX2RhdGVTbG90W2luZGV4XS5kYXRhLnBhcmVudE5vZGUuY2xhc3NOYW1lICs9ICIgY3VycmVudCI7DQotCQkJdGhpcy5fZGF0ZVNsb3RbaW5kZXhdLmRhdGEucGFyZW50Tm9kZS5zdHlsZS5ib3JkZXI9ICIxcHggZG90dGVkIFdpbmRvd1RleHQiOw0KLQkJfQ0KLQkJaWYgKHRvSVNPRGF0ZShkMSkgPT0gc2VsZWN0ZWQpIHsNCi0JCQl0aGlzLl9kYXRlU2xvdFtpbmRleF0uZGF0YS5wYXJlbnROb2RlLmNsYXNzTmFtZSArPSAiIHNlbGVjdGVkIjsNCi0JCQl0aGlzLl9kYXRlU2xvdFtpbmRleF0uZGF0YS5wYXJlbnROb2RlLnN0eWxlLmJvcmRlcj0gIjFweCBzb2xpZCBXaW5kb3dUZXh0IjsNCi0JCX0NCi0JCWQxID0gbmV3IERhdGUoZDEuZ2V0RnVsbFllYXIoKSwgZDEuZ2V0TW9udGgoKSwgZDEuZ2V0RGF0ZSgpKzEpOw0KLQl9DQotCQ0KLQl2YXIgbGFzdERhdGVJbmRleCA9IGluZGV4Ow0KLSAgICAgICAgDQotICAgIHdoaWxlKGluZGV4IDwgNDIpIHsNCi0JCXRoaXMuX2RhdGVTbG90W2luZGV4XS52YWx1ZSA9IC0xOw0KLQkJdGhpcy5fZGF0ZVNsb3RbaW5kZXhdLmRhdGEuZGF0YSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoMTYwKTsNCi0JCXRoaXMuX2RhdGVTbG90W2luZGV4XS5kYXRhLnBhcmVudE5vZGUuY2xhc3NOYW1lID0gIiI7DQotCQl0aGlzLl9kYXRlU2xvdFtpbmRleF0uZGF0YS5wYXJlbnROb2RlLnN0eWxlLmZvbnRXZWlnaHQgPSAibm9ybWFsIjsNCi0JCXRoaXMuX2RhdGVTbG90W2luZGV4XS5kYXRhLnBhcmVudE5vZGUuc3R5bGUuYm9yZGVyPSAibm9uZSI7DQotCQkrK2luZGV4Ow0KLQl9DQotCQ0KLQkvLyBXZWVrIG51bWJlcnMNCi0JaWYgKHRoaXMuX2luY2x1ZGVXZWVrKSB7DQotCQlkMSA9IG5ldyBEYXRlKGRhdGUuZ2V0RnVsbFllYXIoKSwgZGF0ZS5nZXRNb250aCgpLCAxKTsNCi0JCWZvciAoaT0wOyBpIDwgNjsgKytpKSB7DQotCQkJaWYgKGkgPT0gNSAmJiBsYXN0RGF0ZUluZGV4IDwgMzYpIHsNCi0JCQkJdGhpcy5fd2Vla1Nsb3RbaV0uZGF0YS5kYXRhID0gU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApOw0KLQkJCQl0aGlzLl93ZWVrU2xvdFtpXS5kYXRhLnBhcmVudE5vZGUuc3R5bGUuYm9yZGVyUmlnaHQgPSAibm9uZSI7DQotCQkJfSBlbHNlIHsNCi0JCQkJd2VlayA9IHdlZWtOdW1iZXIodGhpcywgZDEpOw0KLQkJCQl0aGlzLl93ZWVrU2xvdFtpXS5kYXRhLmRhdGEgPSB3ZWVrOw0KLQkJCQl0aGlzLl93ZWVrU2xvdFtpXS5kYXRhLnBhcmVudE5vZGUuc3R5bGUuYm9yZGVyUmlnaHQgPSAiMXB4IHNvbGlkIFdpbmRvd1RleHQiOw0KLQkJCX0NCi0JCQlkMSA9IG5ldyBEYXRlKGQxLmdldEZ1bGxZZWFyKCksIGQxLmdldE1vbnRoKCksIGQxLmdldERhdGUoKSs3KTsNCi0JCX0NCi0JfQ0KLX0NCi0NCi1DYWxlbmRhci5wcm90b3R5cGUuc2hvdyA9IGZ1bmN0aW9uKGVsZW1lbnQpIHsNCi0JaWYoIXRoaXMuX3Nob3dpbmcpIHsNCi0JCXZhciBwID0gZ2V0UG9pbnQoZWxlbWVudCk7DQotCQl0aGlzLl9jYWxEaXYuc3R5bGUuZGlzcGxheSA9ICJibG9jayI7DQotCQl0aGlzLl9jYWxEaXYuc3R5bGUudG9wID0gKHAueSArIGVsZW1lbnQub2Zmc2V0SGVpZ2h0ICsgMSkgKyAicHgiOw0KLQkJdGhpcy5fY2FsRGl2LnN0eWxlLmxlZnQgPSBwLnggKyAicHgiOw0KLQkJdGhpcy5fc2hvd2luZyA9IHRydWU7DQotCQkNCi0JCS8qIC0tLS0tLS0tICovDQotCSAgIAlpZiggdGhpcy5fYncuaWU2ICkNCi0JICAgCXsNCi0JICAgICAJZHcgPSB0aGlzLl9jYWxEaXYub2Zmc2V0V2lkdGg7DQotCSAgICAgCWRoID0gdGhpcy5fY2FsRGl2Lm9mZnNldEhlaWdodDsNCi0JICAgICAJdmFyIGVscyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJib2R5Iik7DQotCSAgICAgCXZhciBib2R5ID0gZWxzWzBdOw0KLQkgICAgIAlpZiggIWJvZHkgKSByZXR1cm47DQotCSANCi0JICAgIAkvL3Bhc3RlIGlmcmFtZSB1bmRlciB0aGUgbW9kYWwNCi0JCSAgICAgdmFyIHVuZGVyRGl2ID0gdGhpcy5fY2FsRGl2LmNsb25lTm9kZShmYWxzZSk7IA0KLQkJICAgICB1bmRlckRpdi5zdHlsZS56SW5kZXg9IjM5MCI7DQotCQkgICAgIHVuZGVyRGl2LnN0eWxlLm1hcmdpbiA9ICIwcHgiOw0KLQkJICAgICB1bmRlckRpdi5zdHlsZS5wYWRkaW5nID0gIjBweCI7DQotCQkgICAgIHVuZGVyRGl2LnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siOw0KLQkJICAgICB1bmRlckRpdi5zdHlsZS53aWR0aCA9IGR3Ow0KLQkJICAgICB1bmRlckRpdi5zdHlsZS5oZWlnaHQgPSBkaDsNCi0JCSAgICAgdW5kZXJEaXYuc3R5bGUuYm9yZGVyID0gIjFweCBzb2xpZCBXaW5kb3dUZXh0IjsNCi0JCSAgICAgdW5kZXJEaXYuaW5uZXJIVE1MID0gIjxpZnJhbWUgd2lkdGg9XCIxMDAlXCIgaGVpZ2h0PVwiMTAwJVwiIGZyYW1lYm9yZGVyPVwiMFwiPjwvaWZyYW1lPiI7DQotCQkgICAgIGJvZHkuYXBwZW5kQ2hpbGQodW5kZXJEaXYpOw0KLQkJICAgICB0aGlzLl91bmRlckRpdiA9IHVuZGVyRGl2Ow0KLQkgICB9DQotCQkvKiAtLS0tLS0tLSAqLw0KLQkJdGhpcy5fY2FsRGl2LmZvY3VzKCk7DQotCQkNCi0JfQ0KLX07DQotDQotQ2FsZW5kYXIucHJvdG90eXBlLmhpZGUgPSBmdW5jdGlvbigpIHsgICANCi0JaWYodGhpcy5fc2hvd2luZykgew0KLQkJdGhpcy5fY2FsRGl2LnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7DQotCQl0aGlzLl9zaG93aW5nID0gZmFsc2U7DQotCQlpZiggdGhpcy5fYncuaWU2ICkgew0KLQkJICAgIGlmKCB0aGlzLl91bmRlckRpdiApIHRoaXMuX3VuZGVyRGl2LnJlbW92ZU5vZGUodHJ1ZSk7DQotCQl9DQotCX0NCi19DQotDQotQ2FsZW5kYXIucHJvdG90eXBlLnRvZ2dsZSA9IGZ1bmN0aW9uKGVsZW1lbnQpIHsNCi0JaWYodGhpcy5fc2hvd2luZykgew0KLQkJdGhpcy5oaWRlKCk7IA0KLQl9IGVsc2Ugew0KLQkJdGhpcy5zaG93KGVsZW1lbnQpOw0KLQl9DQotfQ0KLQ0KLQ0KLQ0KLUNhbGVuZGFyLnByb3RvdHlwZS5vbmNoYW5nZSA9IGZ1bmN0aW9uKCkge307DQotDQotDQotQ2FsZW5kYXIucHJvdG90eXBlLnNldEN1cnJlbnREYXRlID0gZnVuY3Rpb24oZGF0ZSkgew0KLQlpZiAoZGF0ZSA9PSBudWxsKSB7DQotCQlyZXR1cm47DQotCX0NCi0NCi0JLy8gaWYgc3RyaW5nIG9yIG51bWJlciBjcmVhdGUgYSBEYXRlIG9iamVjdA0KLQlpZiAodHlwZW9mIGRhdGUgPT0gInN0cmluZyIgfHwgdHlwZW9mIGRhdGUgPT0gIm51bWJlciIpIHsNCi0JCWRhdGUgPSBuZXcgRGF0ZShkYXRlKTsNCi0JfQ0KLQkNCi0JDQotCS8vIGRvIG5vdCB1cGRhdGUgaWYgbm90IHJlYWxseSBjaGFuZ2VkDQotCWlmICh0aGlzLl9jdXJyZW50RGF0ZS5nZXREYXRlKCkgIT0gZGF0ZS5nZXREYXRlKCkgfHwNCi0JCXRoaXMuX2N1cnJlbnREYXRlLmdldE1vbnRoKCkgIT0gZGF0ZS5nZXRNb250aCgpIHx8IA0KLQkJdGhpcy5fY3VycmVudERhdGUuZ2V0RnVsbFllYXIoKSAhPSBkYXRlLmdldEZ1bGxZZWFyKCkpIHsNCi0JCQ0KLQkJdGhpcy5fY3VycmVudERhdGUgPSBuZXcgRGF0ZShkYXRlKTsNCi0JDQotCQl0aGlzLl91cGRhdGVIZWFkZXIoKTsNCi0JCXRoaXMuX3VwZGF0ZSgpOw0KLQkJDQotCX0NCi0JDQotfQ0KLQ0KLUNhbGVuZGFyLnByb3RvdHlwZS5zZXRTZWxlY3RlZERhdGUgPSBmdW5jdGlvbihkYXRlKSB7DQotCXRoaXMuX3NlbGVjdGVkRGF0ZSA9IG5ldyBEYXRlKGRhdGUpOw0KLQl0aGlzLnNldEN1cnJlbnREYXRlKHRoaXMuX3NlbGVjdGVkRGF0ZSk7DQotCWlmICh0eXBlb2YgdGhpcy5vbmNoYW5nZSA9PSAiZnVuY3Rpb24iKSB7DQotCQl0aGlzLm9uY2hhbmdlKCk7DQotCX0NCi19DQotDQotQ2FsZW5kYXIucHJvdG90eXBlLmNsZWFyU2VsZWN0ZWREYXRlID0gZnVuY3Rpb24oKSB7DQotCXRoaXMuX3NlbGVjdGVkRGF0ZSA9IG51bGw7DQotCWlmICh0eXBlb2YgdGhpcy5vbmNoYW5nZSA9PSAiZnVuY3Rpb24iKSB7DQotCQl0aGlzLm9uY2hhbmdlKCk7DQotCX0NCi19DQotDQotQ2FsZW5kYXIucHJvdG90eXBlLmdldEVsZW1lbnQgPSBmdW5jdGlvbigpIHsNCi0JcmV0dXJuIHRoaXMuX2NhbERpdjsNCi19DQotDQotQ2FsZW5kYXIucHJvdG90eXBlLnNldEluY2x1ZGVXZWVrID0gZnVuY3Rpb24odikgew0KLQlpZiAodGhpcy5fY2FsRGl2ID09IG51bGwpIHsNCi0JCXRoaXMuX2luY2x1ZGVXZWVrID0gdjsNCi0JfQ0KLX0NCi0NCi1DYWxlbmRhci5wcm90b3R5cGUuZ2V0U2VsZWN0ZWREYXRlID0gZnVuY3Rpb24gKCkgew0KLQlpZiAodGhpcy5fc2VsZWN0ZWREYXRlID09IG51bGwpIHsNCi0JCXJldHVybiBudWxsOw0KLQl9IGVsc2Ugew0KLQkJcmV0dXJuIG5ldyBEYXRlKHRoaXMuX3NlbGVjdGVkRGF0ZSk7DQotCX0NCi19DQotDQotDQotDQotQ2FsZW5kYXIucHJvdG90eXBlLl91cGRhdGVIZWFkZXIgPSBmdW5jdGlvbiAoKSB7DQotDQotCS8vIA0KLQl2YXIgb3B0aW9ucyA9IHRoaXMuX21vbnRoU2VsZWN0Lm9wdGlvbnM7DQotCXZhciBtID0gdGhpcy5fY3VycmVudERhdGUuZ2V0TW9udGgoKTsNCi0JZm9yKHZhciBpPTA7IGkgPCBvcHRpb25zLmxlbmd0aDsgKytpKSB7DQotCQlvcHRpb25zW2ldLnNlbGVjdGVkID0gZmFsc2U7DQotCQlpZiAob3B0aW9uc1tpXS52YWx1ZSA9PSBtKSB7DQotCQkJb3B0aW9uc1tpXS5zZWxlY3RlZCA9IHRydWU7DQotCQl9DQotCX0NCi0JDQotCW9wdGlvbnMgPSB0aGlzLl95ZWFyU2VsZWN0Lm9wdGlvbnM7DQotCXZhciB5ZWFyID0gdGhpcy5fY3VycmVudERhdGUuZ2V0RnVsbFllYXIoKTsNCi0JZm9yKHZhciBpPTA7IGkgPCBvcHRpb25zLmxlbmd0aDsgKytpKSB7DQotCQlvcHRpb25zW2ldLnNlbGVjdGVkID0gZmFsc2U7DQotCQlpZiAob3B0aW9uc1tpXS52YWx1ZSA9PSB5ZWFyKSB7DQotCQkJb3B0aW9uc1tpXS5zZWxlY3RlZCA9IHRydWU7DQotCQl9DQotCX0NCi0JDQotfQ0KLQ0KLUNhbGVuZGFyLnByb3RvdHlwZS5zZXRZZWFyID0gZnVuY3Rpb24oeWVhcikgew0KLQl2YXIgZCA9IG5ldyBEYXRlKHRoaXMuX2N1cnJlbnREYXRlKTsNCi0JZC5zZXRGdWxsWWVhcih5ZWFyKTsNCi0JdGhpcy5zZXRDdXJyZW50RGF0ZShkKTsNCi19DQotDQotQ2FsZW5kYXIucHJvdG90eXBlLnNldE1vbnRoID0gZnVuY3Rpb24gKG1vbnRoKSB7DQotCXZhciBkID0gbmV3IERhdGUodGhpcy5fY3VycmVudERhdGUpOw0KLQlkLnNldE1vbnRoKG1vbnRoKTsNCi0JdGhpcy5zZXRDdXJyZW50RGF0ZShkKTsNCi19DQotDQotQ2FsZW5kYXIucHJvdG90eXBlLm5leHRNb250aCA9IGZ1bmN0aW9uICgpIHsNCi0JdGhpcy5zZXRNb250aCh0aGlzLl9jdXJyZW50RGF0ZS5nZXRNb250aCgpKzEpOw0KLX0NCi0NCi1DYWxlbmRhci5wcm90b3R5cGUucHJldk1vbnRoID0gZnVuY3Rpb24gKCkgew0KLQl0aGlzLnNldE1vbnRoKHRoaXMuX2N1cnJlbnREYXRlLmdldE1vbnRoKCktMSk7DQotfQ0KLQ0KLUNhbGVuZGFyLnByb3RvdHlwZS5zZXRGaXJzdERheU9mV2VlayA9IGZ1bmN0aW9uIChuRmlyc3RXZWVrRGF5KSB7DQotCXRoaXMuX2ZpcnN0RGF5T2ZXZWVrID0gbkZpcnN0V2Vla0RheTsNCi19DQotDQotQ2FsZW5kYXIucHJvdG90eXBlLmdldEZpcnN0RGF5T2ZXZWVrID0gZnVuY3Rpb24gKCkgew0KLQlyZXR1cm4gdGhpcy5fZmlyc3REYXlPZldlZWs7DQotfQ0KLQ0KLUNhbGVuZGFyLnByb3RvdHlwZS5zZXRNaW5pbWFsRGF5c0luRmlyc3RXZWVrID0gZnVuY3Rpb24obikgew0KLQl0aGlzLl9taW5pbWFsRGF5c0luRmlyc3RXZWVrID0gbjsNCi19DQotDQotDQotQ2FsZW5kYXIucHJvdG90eXBlLmdldE1pbmltYWxEYXlzSW5GaXJzdFdlZWsgPSBmdW5jdGlvbiAoKSB7DQotCXJldHVybiB0aGlzLl9taW5pbWFsRGF5c0luRmlyc3RXZWVrOw0KLX0NCi0NCi1DYWxlbmRhci5wcm90b3R5cGUuc2V0TW9udGhOYW1lcyA9IGZ1bmN0aW9uKGEpIHsNCi0JLy8gc2FuaXR5IHRlc3QNCi0JdGhpcy5fbW9udGhOYW1lcyA9IGE7DQotfQ0KLQ0KLUNhbGVuZGFyLnByb3RvdHlwZS5zZXRTaG9ydE1vbnRoTmFtZXMgPSBmdW5jdGlvbihhKSB7DQotCS8vIHNhbml0eSB0ZXN0DQotCXRoaXMuX3Nob3J0TW9udGhOYW1lcyA9IGE7DQotfQ0KLQ0KLUNhbGVuZGFyLnByb3RvdHlwZS5zZXRXZWVrRGF5TmFtZXMgPSBmdW5jdGlvbihhKSB7DQotCS8vIHNhbml0eSB0ZXN0DQotCXRoaXMuX3dlZWtEYXlOYW1lcyA9IGE7DQotfQ0KLQ0KLUNhbGVuZGFyLnByb3RvdHlwZS5zZXRTaG9ydFdlZWtEYXlOYW1lcyA9IGZ1bmN0aW9uKGEpIHsNCi0JLy8gc2FuaXR5IHRlc3QNCi0JdGhpcy5fc2hvcnRXZWVrRGF5TmFtZXMgPSBhOw0KLX0NCi0NCi1DYWxlbmRhci5wcm90b3R5cGUuZ2V0Rm9ybWF0ID0gZnVuY3Rpb24oKSB7DQotCXJldHVybiB0aGlzLl9mb3JtYXQ7DQotfQ0KLQkNCi1DYWxlbmRhci5wcm90b3R5cGUuc2V0Rm9ybWF0ID0gZnVuY3Rpb24oZikgew0KLQl0aGlzLl9mb3JtYXQgPSBmOw0KLX0NCi0NCi1DYWxlbmRhci5wcm90b3R5cGUuZm9ybWF0RGF0ZSA9IGZ1bmN0aW9uKCkgeyAgDQotCWlmICh0aGlzLl9zZWxlY3RlZERhdGUgPT0gbnVsbCkgew0KLQkJcmV0dXJuICIiOw0KLQl9DQotCQ0KLSAgICB2YXIgYml0cyA9IG5ldyBBcnJheSgpOw0KLSAgICAvLyB3b3JrIG91dCB3aGF0IGVhY2ggYml0IHNob3VsZCBiZQ0KLSAgICB2YXIgZGF0ZSA9IHRoaXMuX3NlbGVjdGVkRGF0ZTsNCi0gICAgYml0c1snZCddID0gZGF0ZS5nZXREYXRlKCk7DQotICAgIGJpdHNbJ2RkJ10gPSBwYWQoZGF0ZS5nZXREYXRlKCksMik7DQotICAgIGJpdHNbJ2RkZCddID0gdGhpcy5fc2hvcnRXZWVrRGF5TmFtZXNbZGF0ZS5nZXREYXkoKV07DQotICAgIGJpdHNbJ2RkZGQnXSA9IHRoaXMuX3dlZWtEYXlOYW1lc1tkYXRlLmdldERheSgpXTsNCi0NCi0gICAgYml0c1snTSddID0gZGF0ZS5nZXRNb250aCgpKzE7DQotICAgIGJpdHNbJ01NJ10gPSBwYWQoZGF0ZS5nZXRNb250aCgpKzEsMik7DQotICAgIGJpdHNbJ01NTSddID0gdGhpcy5fc2hvcnRNb250aE5hbWVzW2RhdGUuZ2V0TW9udGgoKV07DQotICAgIGJpdHNbJ01NTU0nXSA9IHRoaXMuX21vbnRoTmFtZXNbZGF0ZS5nZXRNb250aCgpXTsNCi0gICAgDQotICAgIHZhciB5ZWFyU3RyID0gIiIgKyBkYXRlLmdldEZ1bGxZZWFyKCk7DQotICAgIHllYXJTdHIgPSAoeWVhclN0ci5sZW5ndGggPT0gMikgPyAnMTknICsgeWVhclN0cjogeWVhclN0cjsNCi0gICAgYml0c1sneXl5eSddID0geWVhclN0cjsNCi0gICAgYml0c1sneXknXSA9IGJpdHNbJ3l5eXknXS50b1N0cmluZygpLnN1YnN0cigyLDIpOw0KLQ0KLSAgICAvLyBkbyBzb21lIGZ1bmt5IHJlZ2V4cyB0byByZXBsYWNlIHRoZSBmb3JtYXQgc3RyaW5nDQotICAgIC8vIHdpdGggdGhlIHJlYWwgdmFsdWVzDQotICAgIHZhciBmcm0gPSBuZXcgU3RyaW5nKHRoaXMuX2Zvcm1hdCk7DQotICAgIHZhciBzZWN0Ow0KLSAgICBmb3IgKHNlY3QgaW4gYml0cykgew0KLSAgICAgIGZybSA9IGV2YWwoImZybS5yZXBsYWNlKC9cXGIiICsgc2VjdCArICJcXGIvLCciICsgYml0c1tzZWN0XSArICInKTsiKTsNCi0gICAgfQ0KLQ0KLSAgICByZXR1cm4gZnJtOw0KLX0NCi0JDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLWZ1bmN0aW9uIGlzTGVhcFllYXIoeWVhcikgew0KLQlyZXR1cm4gKCh5ZWFyJTQgPT0gMCkgJiYgKCh5ZWFyJTEwMCAhPSAwKSB8fCAoeWVhciU0MDAgPT0gMCkpKTsNCi19DQotDQotZnVuY3Rpb24geWVhckxlbmd0aCh5ZWFyKSB7DQotCWlmIChpc0xlYXBZZWFyKHllYXIpKQ0KLQkJcmV0dXJuIDM2NjsNCi0JZWxzZQ0KLQkJcmV0dXJuIDM2NTsNCi19DQotDQotZnVuY3Rpb24gZGF5T2ZZZWFyKGRhdGUpIHsNCi0JdmFyIGEgPSBDYWxlbmRhci5OVU1fREFZUzsNCi0JaWYgKGlzTGVhcFllYXIoZGF0ZS5nZXRGdWxsWWVhcigpKSkgew0KLQkJYSA9IENhbGVuZGFyLkxFQVBfTlVNX0RBWVM7DQotCX0NCi0JdmFyIG1vbnRoID0gZGF0ZS5nZXRNb250aCgpOw0KLQkNCi0JcmV0dXJuIGFbbW9udGhdICsgZGF0ZS5nZXREYXRlKCk7DQotfQ0KLQ0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS8vIFdlZWsgbnVtYmVyIHN0dWZmDQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotDQotZnVuY3Rpb24gd2Vla051bWJlcihjYWwsIGRhdGUpIHsNCi0NCi0JdmFyIGRvdyA9IGRhdGUuZ2V0RGF5KCk7DQotCXZhciBkb3kgPSBkYXlPZlllYXIoZGF0ZSk7DQotCXZhciB5ZWFyID0gZGF0ZS5nZXRGdWxsWWVhcigpOw0KLQ0KLQkvLyBDb21wdXRlIHRoZSB3ZWVrIG9mIHRoZSB5ZWFyLiAgVmFsaWQgd2VlayBudW1iZXJzIHJ1biBmcm9tIDEgdG8gNTINCi0JLy8gb3IgNTMsIGRlcGVuZGluZyBvbiB0aGUgeWVhciwgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2VlaywgYW5kIHRoZQ0KLQkvLyBtaW5pbWFsIGRheXMgaW4gdGhlIGZpcnN0IHdlZWsuICBEYXlzIGF0IHRoZSBzdGFydCBvZiB0aGUgeWVhciBtYXkNCi0JLy8gZmFsbCBpbnRvIHRoZSBsYXN0IHdlZWsgb2YgdGhlIHByZXZpb3VzIHllYXI7IGRheXMgYXQgdGhlIGVuZCBvZg0KLQkvLyB0aGUgeWVhciBtYXkgZmFsbCBpbnRvIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSBuZXh0IHllYXIuDQotCXZhciByZWxEb3cgPSAoZG93ICsgNyAtIGNhbC5nZXRGaXJzdERheU9mV2VlaygpKSAlIDc7IC8vIDAuLjYNCi0JdmFyIHJlbERvd0phbjEgPSAoZG93IC0gZG95ICsgNzAxIC0gY2FsLmdldEZpcnN0RGF5T2ZXZWVrKCkpICUgNzsgLy8gMC4uNg0KLQl2YXIgd2VlayA9IE1hdGguZmxvb3IoKGRveSAtIDEgKyByZWxEb3dKYW4xKSAvIDcpOyAvLyAwLi41Mw0KLQlpZiAoKDcgLSByZWxEb3dKYW4xKSA+PSBjYWwuZ2V0TWluaW1hbERheXNJbkZpcnN0V2VlaygpKSB7DQotCQkrK3dlZWs7DQotCX0NCi0NCi0JaWYgKGRveSA+IDM1OSkgeyAvLyBGYXN0IGNoZWNrIHdoaWNoIGVsaW1pbmF0ZXMgbW9zdCBjYXNlcw0KLQkJLy8gQ2hlY2sgdG8gc2VlIGlmIHdlIGFyZSBpbiB0aGUgbGFzdCB3ZWVrOyBpZiBzbywgd2UgbmVlZA0KLQkJLy8gdG8gaGFuZGxlIHRoZSBjYXNlIGluIHdoaWNoIHdlIGFyZSB0aGUgZmlyc3Qgd2VlayBvZiB0aGUNCi0JCS8vIG5leHQgeWVhci4NCi0JCXZhciBsYXN0RG95ID0geWVhckxlbmd0aCh5ZWFyKTsNCi0JCXZhciBsYXN0UmVsRG93ID0gKHJlbERvdyArIGxhc3REb3kgLSBkb3kpICUgNzsNCi0JCWlmIChsYXN0UmVsRG93IDwgMCkgew0KLQkJCWxhc3RSZWxEb3cgKz0gNzsNCi0JCX0NCi0JCWlmICgoKDYgLSBsYXN0UmVsRG93KSA+PSBjYWwuZ2V0TWluaW1hbERheXNJbkZpcnN0V2VlaygpKQ0KLQkJCSYmICgoZG95ICsgNyAtIHJlbERvdykgPiBsYXN0RG95KSkgew0KLQkJCXdlZWsgPSAxOw0KLQkJfQ0KLQl9IGVsc2UgaWYgKHdlZWsgPT0gMCkgew0KLQkJLy8gV2UgYXJlIHRoZSBsYXN0IHdlZWsgb2YgdGhlIHByZXZpb3VzIHllYXIuDQotCQl2YXIgcHJldkRveSA9IGRveSArIHllYXJMZW5ndGgoeWVhciAtIDEpOw0KLQkJd2VlayA9IHdlZWtPZlBlcmlvZChjYWwsIHByZXZEb3ksIGRvdyk7DQotCX0NCi0NCi0JcmV0dXJuIHdlZWs7DQotfQ0KLQ0KLWZ1bmN0aW9uIHdlZWtPZlBlcmlvZChjYWwsIGRheU9mUGVyaW9kLCBkYXlPZldlZWspIHsNCi0JLy8gRGV0ZXJtaW5lIHRoZSBkYXkgb2YgdGhlIHdlZWsgb2YgdGhlIGZpcnN0IGRheSBvZiB0aGUgcGVyaW9kDQotCS8vIGluIHF1ZXN0aW9uIChlaXRoZXIgYSB5ZWFyIG9yIGEgbW9udGgpLiAgWmVybyByZXByZXNlbnRzIHRoZQ0KLQkvLyBmaXJzdCBkYXkgb2YgdGhlIHdlZWsgb24gdGhpcyBjYWxlbmRhci4NCi0JdmFyIHBlcmlvZFN0YXJ0RGF5T2ZXZWVrID0NCi0JCShkYXlPZldlZWsgLSBjYWwuZ2V0Rmlyc3REYXlPZldlZWsoKSAtIGRheU9mUGVyaW9kICsgMSkgJSA3Ow0KLQlpZiAocGVyaW9kU3RhcnREYXlPZldlZWsgPCAwKSB7DQotCQlwZXJpb2RTdGFydERheU9mV2VlayArPSA3Ow0KLQl9DQotDQotCS8vIENvbXB1dGUgdGhlIHdlZWsgbnVtYmVyLiAgSW5pdGlhbGx5LCBpZ25vcmUgdGhlIGZpcnN0IHdlZWssIHdoaWNoDQotCS8vIG1heSBiZSBmcmFjdGlvbmFsIChvciBtYXkgbm90IGJlKS4gIFdlIGFkZCBwZXJpb2RTdGFydERheU9mV2VlayBpbg0KLQkvLyBvcmRlciB0byBmaWxsIG91dCB0aGUgZmlyc3Qgd2VlaywgaWYgaXQgaXMgZnJhY3Rpb25hbC4NCi0JdmFyIHdlZWtObyA9IE1hdGguZmxvb3IoKGRheU9mUGVyaW9kICsgcGVyaW9kU3RhcnREYXlPZldlZWsgLSAxKSAvIDcpOw0KLQ0KLQkvLyBJZiB0aGUgZmlyc3Qgd2VlayBpcyBsb25nIGVub3VnaCwgdGhlbiBjb3VudCBpdC4gIElmDQotCS8vIHRoZSBtaW5pbWFsIGRheXMgaW4gdGhlIGZpcnN0IHdlZWsgaXMgb25lLCBvciBpZiB0aGUgcGVyaW9kIHN0YXJ0DQotCS8vIGlzIHplcm8sIHdlIGFsd2F5cyBpbmNyZW1lbnQgd2Vla05vLg0KLQlpZiAoKDcgLSBwZXJpb2RTdGFydERheU9mV2VlaykgPj0gY2FsLmdldE1pbmltYWxEYXlzSW5GaXJzdFdlZWsoKSkgew0KLQkJKyt3ZWVrTm87DQotCX0NCi0NCi0JcmV0dXJuIHdlZWtObzsNCi19DQotDQotDQotDQotDQotZnVuY3Rpb24gZ2V0RXZlbnRPYmplY3QoZSkgeyAgLy8gdXRpbGl0eSBmdW5jdGlvbiB0byByZXRyaWV2ZSBvYmplY3QgZnJvbSBldmVudA0KLSAgICBpZiAobmF2aWdhdG9yLmFwcE5hbWUgPT0gIk1pY3Jvc29mdCBJbnRlcm5ldCBFeHBsb3JlciIpIHsNCi0gICAgICAgIHJldHVybiBlLnNyY0VsZW1lbnQ7DQotICAgIH0gZWxzZSB7ICAvLyBpcyBtb3ppbGxhL25ldHNjYXBlDQotICAgICAgICAvLyBuZWVkIHRvIGNyYXdsIHVwIHRoZSB0cmVlIHRvIGdldCB0aGUgZmlyc3QgInJlYWwiIGVsZW1lbnQNCi0gICAgICAgIC8vIGkuZS4gYSB0YWcsIG5vdCByYXcgdGV4dA0KLSAgICAgICAgdmFyIG8gPSBlLnRhcmdldDsNCi0gICAgICAgIHdoaWxlICghby50YWdOYW1lKSB7DQotICAgICAgICAgICAgbyA9IG8ucGFyZW50Tm9kZTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBvOw0KLSAgICB9DQotfQ0KLQ0KLWZ1bmN0aW9uIGFkZEV2ZW50KG5hbWUsIG9iaiwgZnVuY3QpIHsgLy8gdXRpbGl0eSBmdW5jdGlvbiB0byBhZGQgZXZlbnQgaGFuZGxlcnMNCi0NCi0gICAgaWYgKG5hdmlnYXRvci5hcHBOYW1lID09ICJNaWNyb3NvZnQgSW50ZXJuZXQgRXhwbG9yZXIiKSB7DQotICAgICAgICBvYmouYXR0YWNoRXZlbnQoIm9uIituYW1lLCBmdW5jdCk7DQotICAgIH0gZWxzZSB7ICAvLyBpcyBtb3ppbGxhL25ldHNjYXBlDQotICAgICAgICBvYmouYWRkRXZlbnRMaXN0ZW5lcihuYW1lLCBmdW5jdCwgZmFsc2UpOw0KLSAgICB9DQotfQ0KLQ0KLQ0KLWZ1bmN0aW9uIGRlbGV0ZUV2ZW50KG5hbWUsIG9iaiwgZnVuY3QpIHsgLy8gdXRpbGl0eSBmdW5jdGlvbiB0byBkZWxldGUgZXZlbnQgaGFuZGxlcnMNCi0NCi0gICAgaWYgKG5hdmlnYXRvci5hcHBOYW1lID09ICJNaWNyb3NvZnQgSW50ZXJuZXQgRXhwbG9yZXIiKSB7DQotICAgICAgICBvYmouZGV0YWNoRXZlbnQoIm9uIituYW1lLCBmdW5jdCk7DQotICAgIH0gZWxzZSB7ICAvLyBpcyBtb3ppbGxhL25ldHNjYXBlDQotICAgICAgICBvYmoucmVtb3ZlRXZlbnRMaXN0ZW5lcihuYW1lLCBmdW5jdCwgZmFsc2UpOw0KLSAgICB9DQotfQ0KLQ0KLWZ1bmN0aW9uIHNldEN1cnNvcihvYmopIHsNCi0gICBpZiAobmF2aWdhdG9yLmFwcE5hbWUgPT0gIk1pY3Jvc29mdCBJbnRlcm5ldCBFeHBsb3JlciIpIHsNCi0gICAgICAgIG9iai5zdHlsZS5jdXJzb3IgPSAiaGFuZCI7DQotICAgIH0gZWxzZSB7ICAvLyBpcyBtb3ppbGxhL25ldHNjYXBlDQotICAgICAgICBvYmouc3R5bGUuY3Vyc29yID0gInBvaW50ZXIiOw0KLSAgICB9DQotfQ0KLQ0KLWZ1bmN0aW9uIFBvaW50KGlYLCBpWSkNCi17DQotICAgdGhpcy54ID0gaVg7DQotICAgdGhpcy55ID0gaVk7DQotfQ0KLQ0KLQ0KLWZ1bmN0aW9uIGdldFBvaW50KGFUYWcpDQotew0KLSAgIHZhciBvVG1wID0gYVRhZzsgIA0KLSAgIHZhciBwb2ludCA9IG5ldyBQb2ludCgwLDApOw0KLSAgDQotICAgZG8gDQotICAgew0KLSAgICAgIHBvaW50LnggKz0gb1RtcC5vZmZzZXRMZWZ0Ow0KLSAgICAgIHBvaW50LnkgKz0gb1RtcC5vZmZzZXRUb3A7DQotICAgICAgb1RtcCA9IG9UbXAub2Zmc2V0UGFyZW50Ow0KLSAgIH0gDQotICAgd2hpbGUgKG9UbXAudGFnTmFtZSAhPSAiQk9EWSIpOw0KLQ0KLSAgIHJldHVybiBwb2ludDsNCi19DQotDQotZnVuY3Rpb24gdG9JU09EYXRlKGRhdGUpIHsNCi0JdmFyIHMgPSBkYXRlLmdldEZ1bGxZZWFyKCk7DQotCXZhciBtID0gZGF0ZS5nZXRNb250aCgpICsgMTsNCi0JaWYgKG0gPCAxMCkgew0KLQkJbSA9ICIwIiArIG07DQotCX0NCi0JdmFyIGRheSA9IGRhdGUuZ2V0RGF0ZSgpOw0KLQlpZiAoZGF5IDwgMTApIHsNCi0JCWRheSA9ICIwIiArIGRheTsNCi0JfQ0KLQlyZXR1cm4gU3RyaW5nKHMpICsgU3RyaW5nKG0pICsgU3RyaW5nKGRheSk7DQotCQ0KLX0NCi0NCi1mdW5jdGlvbiBwYWQobnVtYmVyLFgpIHsgICAvLyB1dGlsaXR5IGZ1bmN0aW9uIHRvIHBhZCBhIG51bWJlciB0byBhIGdpdmVuIHdpZHRoDQotCVggPSAoIVggPyAyIDogWCk7DQotCW51bWJlciA9ICIiK251bWJlcjsNCi0Jd2hpbGUgKG51bWJlci5sZW5ndGggPCBYKSB7DQotCSAgICBudW1iZXIgPSAiMCIgKyBudW1iZXI7DQotCX0NCi0JcmV0dXJuIG51bWJlcjsNCi19DQotDQotZnVuY3Rpb24gYndfY2hlY2soKQ0KLXsNCi0gICAgdmFyIGlzX21ham9yID0gcGFyc2VJbnQoIG5hdmlnYXRvci5hcHBWZXJzaW9uICk7DQotICAgIHRoaXMubnZlciA9IGlzX21ham9yOw0KLSAgICB0aGlzLnZlciA9IG5hdmlnYXRvci5hcHBWZXJzaW9uOw0KLSAgICB0aGlzLmFnZW50ID0gbmF2aWdhdG9yLnVzZXJBZ2VudDsNCi0gICAgdGhpcy5kb20gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCA/IDEgOiAwOw0KLSAgICB0aGlzLm9wZXJhID0gd2luZG93Lm9wZXJhID8gMSA6IDA7DQotICAgIHRoaXMuaWU1ID0gKCB0aGlzLnZlci5pbmRleE9mKCAiTVNJRSA1IiApID4gLTEgJiYgdGhpcy5kb20gJiYgIXRoaXMub3BlcmEgKSA/IDEgOiAwOw0KLSAgICB0aGlzLmllNiA9ICggdGhpcy52ZXIuaW5kZXhPZiggIk1TSUUgNiIgKSA+IC0xICYmIHRoaXMuZG9tICYmICF0aGlzLm9wZXJhICkgPyAxIDogMDsNCi0gICAgdGhpcy5pZTQgPSAoIGRvY3VtZW50LmFsbCAmJiAhdGhpcy5kb20gJiYgIXRoaXMub3BlcmEgKSA/IDEgOiAwOw0KLSAgICB0aGlzLmllID0gdGhpcy5pZTQgfHwgdGhpcy5pZTUgfHwgdGhpcy5pZTY7DQotICAgIHRoaXMubWFjID0gdGhpcy5hZ2VudC5pbmRleE9mKCAiTWFjIiApID4gLTE7DQotICAgIHRoaXMubnM2ID0gKCB0aGlzLmRvbSAmJiBwYXJzZUludCggdGhpcy52ZXIgKSA+PSA1ICkgPyAxIDogMDsNCi0gICAgdGhpcy5pZTMgPSAoIHRoaXMudmVyLmluZGV4T2YoICJNU0lFIiApICYmICggaXNfbWFqb3IgPCA0ICkgKTsNCi0gICAgdGhpcy5ob3RqYXZhID0gKCB0aGlzLmFnZW50LnRvTG93ZXJDYXNlKCkuaW5kZXhPZiggJ2hvdGphdmEnICkgIT0gLTEgKSA/IDEgOiAwOw0KLSAgICB0aGlzLm5zNCA9ICggZG9jdW1lbnQubGF5ZXJzICYmICF0aGlzLmRvbSAmJiAhdGhpcy5ob3RqYXZhICkgPyAxIDogMDsNCi0gICAgdGhpcy5idyA9ICggdGhpcy5pZTYgfHwgdGhpcy5pZTUgfHwgdGhpcy5pZTQgfHwgdGhpcy5uczQgfHwgdGhpcy5uczYgfHwgdGhpcy5vcGVyYSApOw0KLSAgICB0aGlzLnZlcjMgPSAoIHRoaXMuaG90amF2YSB8fCB0aGlzLmllMyApOw0KLSAgICB0aGlzLm9wZXJhNyA9ICggKCB0aGlzLmFnZW50LnRvTG93ZXJDYXNlKCkuaW5kZXhPZiggJ29wZXJhIDcnICkgPiAtMSApIHx8ICggdGhpcy5hZ2VudC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoICdvcGVyYS83JyApID4gLTEgKSApOw0KLSAgICB0aGlzLm9wZXJhT2xkID0gdGhpcy5vcGVyYSAmJiAhdGhpcy5vcGVyYTc7DQotICAgIHJldHVybiB0aGlzOw0KLX07DQotDQotDQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2Zvcm0vRGF0ZVBpY2tlci5qd2MgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZm9ybS9EYXRlUGlja2VyLmp3YwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJjZmY2Zi4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZm9ybS9EYXRlUGlja2VyLmp3YworKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAgCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPCEtLSAkSWQkIC0tPgotPCFET0NUWVBFIGNvbXBvbmVudC1zcGVjaWZpY2F0aW9uIFBVQkxJQyAKLSAgIi0vL0FwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLy9UYXBlc3RyeSBTcGVjaWZpY2F0aW9uIDMuMC8vRU4iIAotICAiaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy90YXBlc3RyeS9kdGQvVGFwZXN0cnlfM18wLmR0ZCI+Ci0KLTxjb21wb25lbnQtc3BlY2lmaWNhdGlvbgotCWNsYXNzPSJvcmcuYXBhY2hlLnRhcGVzdHJ5LmZvcm0uRGF0ZVBpY2tlciIKLQlhbGxvdy1pbmZvcm1hbC1wYXJhbWV0ZXJzPSJ5ZXMiIAotCWFsbG93LWJvZHk9Im5vIj4KLQotICA8cGFyYW1ldGVyIG5hbWU9InZhbHVlIiBkaXJlY3Rpb249ImZvcm0iIHR5cGU9ImphdmEudXRpbC5EYXRlIiByZXF1aXJlZD0ieWVzIi8+Ci0gIDxwYXJhbWV0ZXIgbmFtZT0iZm9ybWF0IiBkaXJlY3Rpb249ImluIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIiByZXF1aXJlZD0ibm8iLz4KLSAgPHBhcmFtZXRlciBuYW1lPSJkaXNhYmxlZCIgZGlyZWN0aW9uPSJpbiIgdHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Im5vIi8+Ci0gIDxwYXJhbWV0ZXIgbmFtZT0iaW5jbHVkZVdlZWsiIHR5cGU9ImJvb2xlYW4iIGRpcmVjdGlvbj0iaW4iIHJlcXVpcmVkPSJubyIvPgotICA8cGFyYW1ldGVyIG5hbWU9Imljb24iIHR5cGU9Im9yZy5hcGFjaGUudGFwZXN0cnkuSUFzc2V0IiBkaXJlY3Rpb249ImluIiByZXF1aXJlZD0ibm8iCi0gIAkgIGRlZmF1bHQtdmFsdWU9ImFzc2V0cy5kZWZhdWx0SWNvbiIvPgotICAgICAgICAKLSAgPHByb3BlcnR5LXNwZWNpZmljYXRpb24gbmFtZT0ibmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgotICA8cHJvcGVydHktc3BlY2lmaWNhdGlvbiBuYW1lPSJmb3JtIiB0eXBlPSJvcmcuYXBhY2hlLnRhcGVzdHJ5LklGb3JtIi8+Ci0gIAotICA8cHJpdmF0ZS1hc3NldCBuYW1lPSJzY3JpcHQiIHJlc291cmNlLXBhdGg9IkRhdGVQaWNrZXIuanMiLz4KLSAgCi0gIDxwcml2YXRlLWFzc2V0IG5hbWU9ImRlZmF1bHRJY29uIiByZXNvdXJjZS1wYXRoPSJEYXRlUGlja2VySWNvbi5wbmciLz4KLSAgICAgICAgICAgICAgICAKLTwvY29tcG9uZW50LXNwZWNpZmljYXRpb24+CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZm9ybS9EYXRlUGlja2VyLnNjcmlwdCBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9mb3JtL0RhdGVQaWNrZXIuc2NyaXB0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWNhMDgzLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9mb3JtL0RhdGVQaWNrZXIuc2NyaXB0CisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gJElkJCAtLT4KLTwhRE9DVFlQRSBzY3JpcHQgUFVCTElDCi0JIi0vL0FwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLy9UYXBlc3RyeSBTY3JpcHQgU3BlY2lmaWNhdGlvbiAzLjAvL0VOIgotCSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL3RhcGVzdHJ5L2R0ZC9TY3JpcHRfM18wLmR0ZCI+Ci0gIAotPHNjcmlwdD4KLQotPGluY2x1ZGUtc2NyaXB0IHJlc291cmNlLXBhdGg9IkRhdGVQaWNrZXIuanMiLz4KLQotPGlucHV0LXN5bWJvbCBrZXk9Im5hbWUiICBjbGFzcz0iamF2YS5sYW5nLlN0cmluZyIgcmVxdWlyZWQ9InllcyIvPgotPGlucHV0LXN5bWJvbCBrZXk9ImZvcm1OYW1lIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZyIgcmVxdWlyZWQ9InllcyIvPgotPGlucHV0LXN5bWJvbCBrZXk9Im1vbnRoTmFtZXMiICByZXF1aXJlZD0ieWVzIi8+Ci08aW5wdXQtc3ltYm9sIGtleT0ic2hvcnRNb250aE5hbWVzIiByZXF1aXJlZD0ieWVzIi8+Ci08aW5wdXQtc3ltYm9sIGtleT0id2Vla0RheU5hbWVzIiByZXF1aXJlZD0ieWVzIi8+Ci08aW5wdXQtc3ltYm9sIGtleT0ic2hvcnRXZWVrRGF5TmFtZXMiICByZXF1aXJlZD0ieWVzIi8+Ci08aW5wdXQtc3ltYm9sIGtleT0iZmlyc3REYXlJbldlZWsiIHJlcXVpcmVkPSJ5ZXMiLz4KLTxpbnB1dC1zeW1ib2wga2V5PSJtaW5pbWFsRGF5c0luRmlyc3RXZWVrIiByZXF1aXJlZD0ieWVzIi8+Ci08aW5wdXQtc3ltYm9sIGtleT0iZm9ybWF0IiByZXF1aXJlZD0ieWVzIi8+Ci08aW5wdXQtc3ltYm9sIGtleT0iaW5jbHVkZVdlZWsiIHJlcXVpcmVkPSJ5ZXMiLz4KLTxpbnB1dC1zeW1ib2wga2V5PSJ2YWx1ZSIgcmVxdWlyZWQ9Im5vIi8+Ci0KLTxsZXQga2V5PSJjYWxlbmRhck9iamVjdCIgdW5pcXVlPSJ5ZXMiPgotCWNhbGVuZGFyXyR7bmFtZX0JCi08L2xldD4KLQotPGxldCBrZXk9ImJ1dHRvbk9uY2xpY2tIYW5kbGVyIj4KLSAgamF2YXNjcmlwdDoke2NhbGVuZGFyT2JqZWN0fS50b2dnbGUoZG9jdW1lbnQuJHtmb3JtTmFtZX0uJHtuYW1lfSk7CQotPC9sZXQ+Ci0KLTxib2R5PgotdmFyICR7Y2FsZW5kYXJPYmplY3R9OwotPC9ib2R5PgotCi08aW5pdGlhbGl6YXRpb24+Ci0JCi08aWYgZXhwcmVzc2lvbj0idmFsdWUgPT0gbnVsbCI+Ci0ke2NhbGVuZGFyT2JqZWN0fSA9IG5ldyBDYWxlbmRhcigpOwotPC9pZj4KLTxpZiBleHByZXNzaW9uPSJ2YWx1ZSAhPSBudWxsIj4KLSR7Y2FsZW5kYXJPYmplY3R9ID0gbmV3IENhbGVuZGFyKCR7dmFsdWUudGltZX0pOwotPC9pZj4KLQkJCi0ke2NhbGVuZGFyT2JqZWN0fS5zZXRNb250aE5hbWVzKG5ldyBBcnJheSgke21vbnRoTmFtZXN9KSk7Ci0ke2NhbGVuZGFyT2JqZWN0fS5zZXRTaG9ydE1vbnRoTmFtZXMobmV3IEFycmF5KCR7c2hvcnRNb250aE5hbWVzfSkpOwotJHtjYWxlbmRhck9iamVjdH0uc2V0V2Vla0RheU5hbWVzKG5ldyBBcnJheSgke3dlZWtEYXlOYW1lc30pKTsKLSR7Y2FsZW5kYXJPYmplY3R9LnNldFNob3J0V2Vla0RheU5hbWVzKG5ldyBBcnJheSgke3Nob3J0V2Vla0RheU5hbWVzfSkpOwotJHtjYWxlbmRhck9iamVjdH0uc2V0Rm9ybWF0KCIke2Zvcm1hdH0iKTsKLSR7Y2FsZW5kYXJPYmplY3R9LnNldEZpcnN0RGF5T2ZXZWVrKCR7Zmlyc3REYXlJbldlZWt9KTsKLSR7Y2FsZW5kYXJPYmplY3R9LnNldE1pbmltYWxEYXlzSW5GaXJzdFdlZWsoJHttaW5pbWFsRGF5c0luRmlyc3RXZWVrfSk7Ci0ke2NhbGVuZGFyT2JqZWN0fS5zZXRJbmNsdWRlV2Vlaygke2luY2x1ZGVXZWVrfSk7Ci0KLSR7Y2FsZW5kYXJPYmplY3R9LmNyZWF0ZSgpOwotCi0ke2NhbGVuZGFyT2JqZWN0fS5vbmNoYW5nZSA9IGZ1bmN0aW9uKCkgewotICB2YXIgZmllbGQgPSBkb2N1bWVudC4ke2Zvcm1OYW1lfS4ke25hbWV9OwotICB2YXIgdmFsdWUgPSAke2NhbGVuZGFyT2JqZWN0fS5mb3JtYXREYXRlKCk7Ci0gIGlmIChmaWVsZC52YWx1ZSAhPSB2YWx1ZSkgewotICAgIGZpZWxkLnZhbHVlID0gdmFsdWU7Ci0gICAgaWYgKGZpZWxkLm9uY2hhbmdlKSB7Ci0gICAgICBmaWVsZC5vbmNoYW5nZSgpOwotICAgIH0KLSAgfQotfQotCi08L2luaXRpYWxpemF0aW9uPgotPC9zY3JpcHQ+CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZm9ybS9EYXRlUGlja2VySWNvbi5wbmcgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZm9ybS9EYXRlUGlja2VySWNvbi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiOWE5NmUuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2Zvcm0vRGF0ZVBpY2tlckljb24ucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2Zvcm0vRW51bVByb3BlcnR5U2VsZWN0aW9uTW9kZWwuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9mb3JtL0VudW1Qcm9wZXJ0eVNlbGVjdGlvbk1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmZmRmYWQuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2Zvcm0vRW51bVByb3BlcnR5U2VsZWN0aW9uTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5mb3JtOwotCi1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuZW51bS5FbnVtOwotCi0vKioKLSAqICBJbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgSVByb3BlcnR5U2VsZWN0aW9uTW9kZWx9IHRoYXQgd3JhcHMgYXJvdW5kCi0gKiAgYSBzZXQgb2Yge0BsaW5rIEVudW19cy4KLSAqIAotICogIDxwPlVzZXMgYSBzaW1wbGUgaW5kZXggbnVtYmVyIGFzIHRoZSB2YWx1ZSAodXNlZCB0byByZXByZXNlbnQgdGhlIG9wdGlvbikuCi0gKgotICogIDxwPlRoZSByZXNvdXJjZSBidW5kbGUgZnJvbSB3aGljaCBsYWJlbHMgYXJlIGV4dHJhY3RlZCBpcyB1c3VhbGx5Ci0gKiAgYSByZXNvdXJjZSB3aXRoaW4gdGhlIFRhcGVzdHJ5IGFwcGxpY2F0aW9uLiAgU2luY2UgCi0gKiAge0BsaW5rIFJlc291cmNlQnVuZGxlI2dldEJ1bmRsZShTdHJpbmcsIGphdmEudXRpbC5Mb2NhbGUpfSB1c2VzIGl0cyBjYWxsZXIncyBjbGFzcyBsb2FkZXIsCi0gKiAgYW5kIHRoYXQgY2xhc3Nsb2FkZXIgd2lsbCBiZSB0aGUgVGFwZXN0cnkgZnJhbWV3b3JrJ3MgY2xhc3Nsb2FkZXIsIHRoZSBhcHBsaWNhdGlvbidzCi0gKiAgcmVzb3VyY2VzIHdvbid0IGJlIHZpc2libGUuICBUaGlzIHJlcXVpcmVzIHRoYXQgdGhlIGFwcGxpY2F0aW9uIHJlc29sdmUKLSAqICB0aGUgcmVzb3VyY2UgdG8gYSB7QGxpbmsgUmVzb3VyY2VCdW5kbGV9IGJlZm9yZSBjcmVhdGluZyB0aGlzIG1vZGVsLgotICogIAotICogIEB2ZXJzaW9uICRJZCQKLSAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiAKLSAqKi8KLQotcHVibGljIGNsYXNzIEVudW1Qcm9wZXJ0eVNlbGVjdGlvbk1vZGVsIGltcGxlbWVudHMgSVByb3BlcnR5U2VsZWN0aW9uTW9kZWwKLXsKLSAgICBwcml2YXRlIEVudW1bXSBfb3B0aW9uczsKLSAgICBwcml2YXRlIFN0cmluZ1tdIF9sYWJlbHM7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBfcmVzb3VyY2VQcmVmaXg7Ci0gICAgcHJpdmF0ZSBSZXNvdXJjZUJ1bmRsZSBfYnVuZGxlOwotCi0gICAgLyoqCi0gICAgICogIFN0YW5kYXJkIGNvbnN0cnVjdG9yLgotICAgICAqCi0gICAgICogIDxwPkxhYmVscyBmb3IgdGhlIG9wdGlvbnMgYXJlIGV4dHJhY3RlZCBmcm9tIGEgcmVzb3VyY2UgYnVuZGxlLiAgcmVzb3VyY2VCYXNlTmFtZQotICAgICAqICBpZGVudGlmaWVzIHRoZSBidW5kbGUuICBUeXBpY2FsbHksIHRoZSBidW5kbGUgd2lsbCBiZSBhIDxjb2RlPi5wcm9wZXJ0aWVzPC9jb2RlPgotICAgICAqICBmaWxlIHdpdGhpbiB0aGUgY2xhc3NwYXRoLiAgU3BlY2lmeSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgZXF1aXZhbGVudCwgaS5lLiwKLSAgICAgKiAgZm9yIGZpbGUgPGNvZGU+L2NvbS9leGFtcGxlL2Zvby9MYWJlbFN0cmluZ3MucHJvcGVydGllczwvY29kZT4gdXNlCi0gICAgICogIDxjb2RlPmNvbS5leGFtcGxlLmZvby5MYWJlbFN0cmluZ3M8L2NvZGU+IGFzIHRoZSByZXNvdXJjZSBiYXNlIG5hbWUuCi0gICAgICoKLSAgICAgKiAgPHA+Tm9ybWFsbHkgKHdoZW4gcmVzb3VyY2VQcmVmaXggaXMgbnVsbCksIHRoZSBrZXlzIHVzZWQgdG8gZXh0cmFjdCBsYWJlbHMKLSAgICAgKiAgbWF0Y2hlcyB0aGUge0BsaW5rIEVudW0jZ2V0TmFtZSgpIGVudW1lcmF0aW9uIGlkfSBvZiB0aGUgb3B0aW9uLiAgQnkKLSAgICAgKiAgY29udmVudGlvbiwgdGhlIGVudW1lcmF0aW9uIGlkIG1hdGNoZXMgdGhlIG5hbWUgb2YgdGhlIHN0YXRpYyB2YXJpYWJsZS4KLSAgICAgKgotICAgICAqICA8cD5UbyBhdm9pZCBuYW1pbmcgY29uZmxpY3RzIHdoZW4gdXNpbmcgYSBzaW5nbGUgcmVzb3VyY2UgYnVuZGxlIGZvciBtdWx0aXBsZQotICAgICAqICBtb2RlbHMsIHVzZSBhIHJlc291cmNlIHByZWZpeC4gIFRoaXMgaXMgYSBzdHJpbmcgd2hpY2ggaXMgcHJlcGVuZGVkIHRvCi0gICAgICogIHRoZSBlbnVtZXJhdGlvbiBpZCAodGhleSBwcmVmaXggYW5kIGVudW1lcmF0aW9uIGlkIGFyZSBzZXBlcmF0ZWQgd2l0aCBhIHBlcmlvZCkuCi0gICAgICoKLSAgICAgKiAgQHBhcmFtICAgb3B0aW9ucyBUaGUgbGlzdCBvZiBwb3NzaWJsZSB2YWx1ZXMgZm9yIHRoaXMgbW9kZWwsIGluIHRoZSBvcmRlciB0aGV5Ci0gICAgICogIHNob3VsZCBhcHBlYXIuIFRoaXMgZXhhY3QgYXJyYXkgaXMgcmV0YWluZWQgKG5vdCBjb3BpZWQpLgotICAgICAqCi0gICAgICogIEBwYXJhbSAgIGJ1bmRsZSBUaGUge0BsaW5rIFJlc291cmNlQnVuZGxlfSBmcm9tIHdoaWNoIGxhYmVscyBtYXkgYmUgZXh0cmFjdGVkLgotICAgICAqCi0gICAgICogIEBwYXJhbSAgIHJlc291cmNlUHJlZml4IEFuIG9wdGlvbmFsIHByZWZpeCB1c2VkIHdoZW4gYWNjZXNzaW5nIGtleXMgd2l0aGluIHRoZSBidW5kbGUuIAotICAgICAqICBVc2VkIHRvIGFsbG93IGEgc2luZ2xlIFJlc291Y2VCdW5kbGUgdG8gY29udGFpbiBsYWJlbHMgZm9yIG11bHRpcGxlIEVudW1zLgotICAgICAqKi8KLQotICAgIHB1YmxpYyBFbnVtUHJvcGVydHlTZWxlY3Rpb25Nb2RlbChFbnVtW10gb3B0aW9ucywgUmVzb3VyY2VCdW5kbGUgYnVuZGxlLCBTdHJpbmcgcmVzb3VyY2VQcmVmaXgpCi0gICAgewotICAgICAgICBfb3B0aW9ucyA9IG9wdGlvbnM7Ci0gICAgICAgIF9idW5kbGUgPSBidW5kbGU7Ci0gICAgICAgIF9yZXNvdXJjZVByZWZpeCA9IHJlc291cmNlUHJlZml4OwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBTaW1wbGlmaWVkIGNvbnN0cnVjdG9yIHVzaW5nIG5vIHByZWZpeC4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBFbnVtUHJvcGVydHlTZWxlY3Rpb25Nb2RlbChFbnVtW10gb3B0aW9ucywgUmVzb3VyY2VCdW5kbGUgYnVuZGxlKQotICAgIHsKLSAgICAgICAgdGhpcyhvcHRpb25zLCBidW5kbGUsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0T3B0aW9uQ291bnQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9vcHRpb25zLmxlbmd0aDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldE9wdGlvbihpbnQgaW5kZXgpCi0gICAgewotICAgICAgICByZXR1cm4gX29wdGlvbnNbaW5kZXhdOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoaW50IGluZGV4KQotICAgIHsKLSAgICAgICAgaWYgKF9sYWJlbHMgPT0gbnVsbCkKLSAgICAgICAgICAgIHJlYWRMYWJlbHMoKTsKLQotICAgICAgICByZXR1cm4gX2xhYmVsc1tpbmRleF07Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRWYWx1ZShpbnQgaW5kZXgpCi0gICAgewotICAgICAgICByZXR1cm4gSW50ZWdlci50b1N0cmluZyhpbmRleCk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCB0cmFuc2xhdGVWYWx1ZShTdHJpbmcgdmFsdWUpCi0gICAgewotICAgICAgICBpbnQgaW5kZXg7Ci0KLSAgICAgICAgaW5kZXggPSBJbnRlZ2VyLnBhcnNlSW50KHZhbHVlKTsKLQotICAgICAgICByZXR1cm4gX29wdGlvbnNbaW5kZXhdOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCByZWFkTGFiZWxzKCkKLSAgICB7Ci0gICAgICAgIF9sYWJlbHMgPSBuZXcgU3RyaW5nW19vcHRpb25zLmxlbmd0aF07Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfb3B0aW9ucy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIGVudW1lcmF0aW9uSWQgPSBfb3B0aW9uc1tpXS5nZXROYW1lKCk7Ci0KLSAgICAgICAgICAgIFN0cmluZyBrZXk7Ci0KLSAgICAgICAgICAgIGlmIChfcmVzb3VyY2VQcmVmaXggPT0gbnVsbCkKLSAgICAgICAgICAgICAgICBrZXkgPSBlbnVtZXJhdGlvbklkOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGtleSA9IF9yZXNvdXJjZVByZWZpeCArICIuIiArIGVudW1lcmF0aW9uSWQ7Ci0KLSAgICAgICAgICAgIF9sYWJlbHNbaV0gPSBfYnVuZGxlLmdldFN0cmluZyhrZXkpOwotICAgICAgICB9Ci0KLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2Zvcm0vRm9ybS5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2Zvcm0vRm9ybS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMGUzMTc1Li4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9mb3JtL0Zvcm0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyOCArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5mb3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuQWJzdHJhY3RDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5BcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JQWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JQmluZGluZzsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklEaXJlY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JRW5naW5lOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUZvcm07Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JTWFya3VwV3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlcXVlc3RDeWNsZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LlJlbmRlclJld291bmRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5TdGFsZUxpbmtFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5UYXBlc3RyeTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmVuZ2luZS5JRW5naW5lU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmVuZ2luZS5JTGluazsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5Lmh0bWwuQm9keTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnV0aWwuSWRBbGxvY2F0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS51dGlsLlN0cmluZ1NwbGl0dGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkudmFsaWQuSVZhbGlkYXRpb25EZWxlZ2F0ZTsKLQotLyoqCi0gKiAgQ29tcG9uZW50IHdoaWNoIGNvbnRhaW5zIGZvcm0gZWxlbWVudCBjb21wb25lbnRzLiAgRm9ybXMgdXNlIHRoZQotICogIGFjdGlvbiBvciBkaXJlY3Qgc2VydmljZXMgdG8gaGFuZGxlIHRoZSBmb3JtIHN1Ym1pc3Npb24uICBBIEZvcm0gd2lsbCB3cmFwCi0gKiAgb3RoZXIgY29tcG9uZW50cyBhbmQgc3RhdGljIEhUTUwsIGluY2x1ZGluZwotICogIGZvcm0gY29tcG9uZW50cyBzdWNoIGFzIHtAbGluayBUZXh0QXJlYX0sIHtAbGluayBUZXh0RmllbGR9LCB7QGxpbmsgQ2hlY2tib3h9LCBldGMuCi0gKiAKLSAqICBbPGEgaHJlZj0iLi4vLi4vLi4vLi4vLi4vQ29tcG9uZW50UmVmZXJlbmNlL0Zvcm0uaHRtbCI+Q29tcG9uZW50IFJlZmVyZW5jZTwvYT5dCi0gKiAKLSAqICA8cD5XaGVuIGEgZm9ybSBpcyBzdWJtaXR0ZWQsIGl0IGNvbnRpbnVlcyB0aHJvdWdoIHRoZSByZXdpbmQgY3ljbGUgdW50aWwKLSAqICA8ZW0+YWZ0ZXI8L2VtPiBhbGwgb2YgaXRzIHdyYXBwZWQgZWxlbWVudHMgaGF2ZSByZW5kZXJyZWQuICBBcyB0aGUgZm9ybQotICogIGNvbXBvbmVudCByZW5kZXIgKGluIHRoZSByZXdpbmQgY3ljbGUpLCB0aGV5IHdpbGwgYmUgdXBkYXRpbmcKLSAqICBwcm9wZXJ0aWVzIG9mIHRoZSBjb250YWluaW5nIHBhZ2UgYW5kIG5vdGlmeWluZyB0aGllciBsaXN0ZW5lcnMuICBBZ2FpbjoKLSAqICBlYWNoIGZvcm0gY29tcG9uZW50IGlzIHJlc3BvbnNpYmxlIG5vdCBvbmx5IGZvciByZW5kZXJpbmcgSFRNTCAodG8gcHJlc2VudCB0aGUKLSAqICBmb3JtKSwgYnV0IGZvciBoYW5kbGluZyBpdCdzIHNoYXJlIG9mIHRoZSBmb3JtIHN1Ym1pc3Npb24uCi0gKgotICogIDxwPk9ubHkgYWZ0ZXIgYWxsIHRoYXQgaXMgZG9uZSB3aWxsIHRoZSBGb3JtIG5vdGlmeSBpdHMgbGlzdGVuZXIuCi0gKgotICogIDxwPlN0YXJ0aW5nIGluIHJlbGVhc2UgMS4wLjIsIGEgRm9ybSBjYW4gdXNlIGVpdGhlciB0aGUgZGlyZWN0IHNlcnZpY2Ugb3IKLSAqICB0aGUgYWN0aW9uIHNlcnZpY2UuICBUaGUgZGVmYXVsdCBpcyB0aGUgZGlyZWN0IHNlcnZpY2UsIGV2ZW4gdGhvdWdoCi0gKiAgaW4gZWFybGllciByZWxlYXNlcywgb25seSB0aGUgYWN0aW9uIHNlcnZpY2Ugd2FzIGF2YWlsYWJsZS4KLSAqCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcCwgRGF2aWQgU29saXMKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiovCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBGb3JtIGV4dGVuZHMgQWJzdHJhY3RDb21wb25lbnQgaW1wbGVtZW50cyBJRm9ybSwgSURpcmVjdAotewotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEhpZGRlblZhbHVlCi0gICAgewotICAgICAgICBTdHJpbmcgX25hbWU7Ci0gICAgICAgIFN0cmluZyBfdmFsdWU7Ci0gICAgICAgIFN0cmluZyBfaWQ7Ci0KLSAgICAgICAgcHJpdmF0ZSBIaWRkZW5WYWx1ZShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKQotICAgICAgICB7Ci0JCQl0aGlzKG5hbWUsIG51bGwsIHZhbHVlKTsKLSAgICAgICAgfQotCi0JCXByaXZhdGUgSGlkZGVuVmFsdWUoU3RyaW5nIG5hbWUsIFN0cmluZyBpZCwgU3RyaW5nIHZhbHVlKQotCQl7Ci0JCQlfbmFtZQk9IG5hbWU7Ci0JCQlfaWQJCT0gaWQ7Ci0JCQlfdmFsdWUJPSB2YWx1ZTsKLQkJfQotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBfcmV3aW5kaW5nOwotICAgIHByaXZhdGUgYm9vbGVhbiBfcmVuZGVyaW5nOwotICAgIHByaXZhdGUgU3RyaW5nIF9uYW1lOwotCi0gICAgLyoqCi0gICAgICogIFVzZWQgd2hlbiByZXdpbmRpbmcgdGhlIGZvcm0gdG8gZmlndXJlIHRvIG1hdGNoIGFsbG9jYXRlZCBpZHMgKGFsbG9jYXRlZCBkdXJpbmcKLSAgICAgKiAgdGhlIHJld2luZCkgYWdhaW5zdCBleHBlY3RlZCBpZHMgKGFsbG9jYXRlZCBpbiB0aGUgcHJldmlvdXMgcmVxdWVzdCBjeWNsZSwgd2hlbgotICAgICAqICB0aGUgZm9ybSB3YXMgcmVuZGVyZWQpLgotICAgICAqIAotICAgICAqICBAc2luY2UgMy4wCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHJpdmF0ZSBpbnQgX2FsbG9jYXRlZElkSW5kZXg7Ci0KLSAgICAvKioKLSAgICAgKiAgVGhlIGxpc3Qgb2YgYWxsb2NhdGVkIGlkcyBmb3IgZm9ybSBlbGVtZW50cyB3aXRoaW4gdGhpcyBmb3JtLiAgVGhpcyBsaXN0Ci0gICAgICogIGlzIGNvbnN0cnVjdGVkIHdoZW4gYSBmb3JtIHJlbmRlcnMsIGFuZCBpcyB2YWxpZGF0ZWQgYWdhaW5zdCB3aGVuIHRoZQotICAgICAqICBmb3JtIGlzIHJld291bmQuCi0gICAgICogCi0gICAgICogIEBzaW5jZSAzLjAKLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwcml2YXRlIExpc3QgX2FsbG9jYXRlZElkcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgIC8qKgotICAgICAqICB7QGxpbmsgTWFwfSwga2V5ZWQgb24ge0BsaW5rIEZvcm1FdmVudFR5cGV9LiAgVmFsdWVzIGFyZSBlaXRoZXIgYSBTdHJpbmcgKHRoZSBuYW1lCi0gICAgICogIG9mIGEgc2luZ2xlIGV2ZW50KSwgb3IgYSB7QGxpbmsgTGlzdH0gb2YgU3RyaW5ncy4KLSAgICAgKgotICAgICAqICBAc2luY2UgMS4wLjIKLSAgICAgKiovCi0KLSAgICBwcml2YXRlIE1hcCBfZXZlbnRzOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UX01BUF9TSVpFID0gMzsKLQotICAgIHByaXZhdGUgSWRBbGxvY2F0b3IgX2VsZW1lbnRJZEFsbG9jYXRvciA9IG5ldyBJZEFsbG9jYXRvcigpOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgX2VuY29kaW5nVHlwZTsKLQotICAgIHByaXZhdGUgTGlzdCBfaGlkZGVuVmFsdWVzOwotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgdGhlIGN1cnJlbnRseSBhY3RpdmUge0BsaW5rIElGb3JtfSwgb3IgbnVsbCBpZiBubyBmb3JtIGlzCi0gICAgICogIGFjdGl2ZS4gIFRoaXMgaXMgYSBjb252aWVuaWVuY2UgbWV0aG9kLCB0aGUgcmVzdWx0IHdpbGwgYmUKLSAgICAgKiAgbnVsbCwgb3IgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIElGb3JtfSwgYnV0IG5vdCBuZWNlc3NhcmlseSBhCi0gICAgICogIDxjb2RlPkZvcm08L2NvZGU+LgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIHN0YXRpYyBJRm9ybSBnZXQoSVJlcXVlc3RDeWNsZSBjeWNsZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoSUZvcm0pIGN5Y2xlLmdldEF0dHJpYnV0ZShBVFRSSUJVVEVfTkFNRSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEluZGljYXRlcyB0byBhbnkgd3JhcHBlZCBmb3JtIGNvbXBvbmVudHMgdGhhdCB0aGV5IHNob3VsZCByZXNwb25kIHRvIHRoZSBmb3JtCi0gICAgICogIHN1Ym1pc3Npb24uCi0gICAgICoKLSAgICAgKiAgQHRocm93cyBBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24gaWYgbm90IHJlbmRlcmluZy4KLSAgICAgKiovCi0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Jld2luZGluZygpCi0gICAgewotICAgICAgICBpZiAoIV9yZW5kZXJpbmcpCi0gICAgICAgICAgICB0aHJvdyBUYXBlc3RyeS5jcmVhdGVSZW5kZXJPbmx5UHJvcGVydHlFeGNlcHRpb24odGhpcywgInJld2luZGluZyIpOwotCi0gICAgICAgIHJldHVybiBfcmV3aW5kaW5nOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIHRydWUgaWYgdGhpcyBGb3JtIGlzIGNvbmZpZ3VyZWQgdG8gdXNlIHRoZSBkaXJlY3QKLSAgICAgKiAgc2VydmljZS4KLSAgICAgKgotICAgICAqICA8cD5UaGlzIGlzIGRlcml2ZWQgZnJvbSB0aGUgZGlyZWN0IHBhcmFtZXRlciwgYW5kIGRlZmF1bHRzCi0gICAgICogIHRvIHRydWUgaWYgbm90IGJvdW5kLgotICAgICAqCi0gICAgICogIEBzaW5jZSAxLjAuMgotICAgICAqKi8KLQotICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzRGlyZWN0KCk7Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0cnVlIGlmIHRoZSBzdGF0ZWZ1bCBwYXJhbWV0ZXIgaXMgYm91bmQgdG8KLSAgICAgKiAgYSB0cnVlIHZhbHVlLiAgSWYgc3RhdGVmdWwgaXMgbm90IGJvdW5kLCBhbHNvIHJldHVybnMKLSAgICAgKiAgdGhlIGRlZmF1bHQsIHRydWUuCi0gICAgICoKLSAgICAgKiAgQHNpbmNlIDEuMC4xCi0gICAgICoqLwotCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0UmVxdWlyZXNTZXNzaW9uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBpc1N0YXRlZnVsKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIENvbnN0cnVjdHMgYSB1bmlxdWUgaWRlbnRpZmllciAod2l0aGluIHRoZSBGb3JtKS4gIFRoZSBpZGVudGlmaWVyCi0gICAgICogIGNvbnNpc3RzIG9mIHRoZSBjb21wb25lbnQncyBpZCwgd2l0aCBhbiBpbmRleCBudW1iZXIgYWRkZWQgdG8KLSAgICAgKiAgZW5zdXJlIHVuaXF1ZW5lc3MuCi0gICAgICoKLSAgICAgKiAgPHA+U2ltcGx5IGludm9rZXMge0BsaW5rICNnZXRFbGVtZW50SWQob3JnLmFwYWNoZS50YXBlc3RyeS5mb3JtLklGb3JtQ29tcG9uZW50LCBqYXZhLmxhbmcuU3RyaW5nKX0KLSAgICAgKiAgd2l0aCB0aGUgY29tcG9uZW50J3MgaWQuCi0gICAgICoKLSAgICAgKgotICAgICAqICBAc2luY2UgMS4wLjIKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnRJZChJRm9ybUNvbXBvbmVudCBjb21wb25lbnQpCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0RWxlbWVudElkKGNvbXBvbmVudCwgY29tcG9uZW50LmdldElkKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBDb25zdHJ1Y3RzIGEgdW5pcXVlIGlkZW50aWZpZXIgZnJvbSB0aGUgYmFzZSBpZC4gIElmIHBvc3NpYmxlLCB0aGUKLSAgICAgKiAgaWQgaXMgdXNlZCBhcy1pcy4gIE90aGVyd2lzZSwgYSB1bmlxdWUgaWRlbnRpZmllciBpcyBhcHBlbmRlZAotICAgICAqICB0byB0aGUgaWQuCi0gICAgICoKLSAgICAgKiAgPHA+VGhpcyBtZXRob2QgaXMgcHJvdmlkZWQgc2ltcGx5IHNvIHRoYXQgc29tZSBjb21wb25lbnRzCi0gICAgICogKHtAbGluayBJbWFnZVN1Ym1pdH0pIGhhdmUgbW9yZSBzcGVjaWZpYyBjb250cm9sIG92ZXIKLSAgICAgKiAgdGhlaXIgbmFtZXMuCi0gICAgICoKLSAgICAgKiAgQHNpbmNlIDEuMC4zCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnRJZChJRm9ybUNvbXBvbmVudCBjb21wb25lbnQsIFN0cmluZyBiYXNlSWQpCi0gICAgewotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gX2VsZW1lbnRJZEFsbG9jYXRvci5hbGxvY2F0ZUlkKGJhc2VJZCk7Ci0KLSAgICAgICAgaWYgKF9yZXdpbmRpbmcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChfYWxsb2NhdGVkSWRJbmRleCA+PSBfYWxsb2NhdGVkSWRzLnNpemUoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU3RhbGVMaW5rRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICBUYXBlc3RyeS5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAiRm9ybS50b28tbWFueS1pZHMiLAotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RXh0ZW5kZWRJZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhfYWxsb2NhdGVkSWRzLnNpemUoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuZ2V0RXh0ZW5kZWRJZCgpKSwKLSAgICAgICAgICAgICAgICAgICAgdGhpcyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZyBleHBlY3RlZCA9IChTdHJpbmcpIF9hbGxvY2F0ZWRJZHMuZ2V0KF9hbGxvY2F0ZWRJZEluZGV4KTsKLQotICAgICAgICAgICAgaWYgKCFyZXN1bHQuZXF1YWxzKGV4cGVjdGVkKSkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU3RhbGVMaW5rRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICBUYXBlc3RyeS5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAiRm9ybS5pZC1taXNtYXRjaCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEV4dGVuZGVkSWQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKF9hbGxvY2F0ZWRJZEluZGV4ICsgMSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5nZXRFeHRlbmRlZElkKCl9KSwKLSAgICAgICAgICAgICAgICAgICAgdGhpcyk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBfYWxsb2NhdGVkSWRzLmFkZChyZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgX2FsbG9jYXRlZElkSW5kZXgrKzsKLQotICAgICAgICBjb21wb25lbnQuc2V0TmFtZShyZXN1bHQpOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgdGhlIG5hbWUgZ2VuZXJhdGVkIGZvciB0aGUgZm9ybS4gIFRoaXMgaXMgdXNlZCB0byBmYWNpbGlhdGUKLSAgICAgKiAgY29tcG9uZW50cyB0aGF0IHdyaXRlIEphdmFTY3JpcHQgYW5kIG5lZWQgdG8gYWNjZXNzIHRoZSBmb3JtIG9yCi0gICAgICogIGl0cyBjb250ZW50cy4KLSAgICAgKgotICAgICAqICA8cD5UaGlzIHZhbHVlIGlzIGdlbmVyYXRlZCB3aGVuIHRoZSBmb3JtIHJlbmRlcnMsIGFuZCBpcyBub3QgY2xlYXJlZC4KLSAgICAgKiAgSWYgdGhlIEZvcm0gaXMgaW5zaWRlIGEge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkuY29tcG9uZW50cy5Gb3JlYWNofSwgCi0gICAgICogIHRoaXMgd2lsbCBiZSB0aGUgbW9zdCByZWNlbnRseQotICAgICAqICBnZW5lcmF0ZWQgbmFtZSBmb3IgdGhlIEZvcm0uCi0gICAgICoKLSAgICAgKiAgPHA+VGhpcyBwcm9wZXJ0eSBpcyBleHBvc2VkIHNvIHRoYXQgc29waGlzdGljYXRlZCBhcHBsaWNhdGlvbnMgY2FuIHdyaXRlCi0gICAgICogIEphdmFTY3JpcHQgaGFuZGxlcnMgZm9yIHRoZSBmb3JtIGFuZCBjb21wb25lbnRzIHdpdGhpbiB0aGUgZm9ybS4KLSAgICAgKgotICAgICAqICBAc2VlIEFic3RyYWN0Rm9ybUNvbXBvbmVudCNnZXROYW1lKCkKLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0gICAgewotICAgICAgICByZXR1cm4gX25hbWU7Ci0gICAgfQotCi0gICAgLyoqIEBzaW5jZSAzLjAgKiovCi0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcmVwYXJlRm9yUmVuZGVyKElSZXF1ZXN0Q3ljbGUgY3ljbGUpCi0gICAgewotICAgICAgICBzdXBlci5wcmVwYXJlRm9yUmVuZGVyKGN5Y2xlKTsKLQotICAgICAgICBpZiAoY3ljbGUuZ2V0QXR0cmlidXRlKEFUVFJJQlVURV9OQU1FKSAhPSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICBUYXBlc3RyeS5nZXRNZXNzYWdlKCJGb3JtLmZvcm1zLW1heS1ub3QtbmVzdCIpLAotICAgICAgICAgICAgICAgIHRoaXMsCi0gICAgICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgICAgICBudWxsKTsKLQotICAgICAgICBjeWNsZS5zZXRBdHRyaWJ1dGUoQVRUUklCVVRFX05BTUUsIHRoaXMpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGNsZWFudXBBZnRlclJlbmRlcihJUmVxdWVzdEN5Y2xlIGN5Y2xlKQotICAgIHsKLSAgICAgICAgX3JlbmRlcmluZyA9IGZhbHNlOwotCi0gICAgICAgIF9hbGxvY2F0ZWRJZEluZGV4ID0gMDsKLSAgICAgICAgX2FsbG9jYXRlZElkcy5jbGVhcigpOwotCi0gICAgICAgIF9ldmVudHMgPSBudWxsOwotCi0gICAgICAgIF9lbGVtZW50SWRBbGxvY2F0b3IuY2xlYXIoKTsKLQotICAgICAgICBpZiAoX2hpZGRlblZhbHVlcyAhPSBudWxsKQotICAgICAgICAgICAgX2hpZGRlblZhbHVlcy5jbGVhcigpOwotCi0gICAgICAgIGN5Y2xlLnJlbW92ZUF0dHJpYnV0ZShBVFRSSUJVVEVfTkFNRSk7Ci0KLSAgICAgICAgX2VuY29kaW5nVHlwZSA9IG51bGw7Ci0KLSAgICAgICAgSVZhbGlkYXRpb25EZWxlZ2F0ZSBkZWxlZ2F0ZSA9IGdldERlbGVnYXRlKCk7Ci0KLSAgICAgICAgaWYgKGRlbGVnYXRlICE9IG51bGwpCi0gICAgICAgICAgICBkZWxlZ2F0ZS5zZXRGb3JtQ29tcG9uZW50KG51bGwpOwotCi0gICAgICAgIHN1cGVyLmNsZWFudXBBZnRlclJlbmRlcihjeWNsZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgd3JpdGVBdHRyaWJ1dGVzKElNYXJrdXBXcml0ZXIgd3JpdGVyLCBJTGluayBsaW5rKQotICAgIHsKLSAgICAgICAgU3RyaW5nIG1ldGhvZCA9IGdldE1ldGhvZCgpOwotCi0gICAgICAgIHdyaXRlci5iZWdpbihnZXRUYWcoKSk7Ci0gICAgICAgIHdyaXRlci5hdHRyaWJ1dGUoIm1ldGhvZCIsIChtZXRob2QgPT0gbnVsbCkgPyAicG9zdCIgOiBtZXRob2QpOwotICAgICAgICB3cml0ZXIuYXR0cmlidXRlKCJuYW1lIiwgX25hbWUpOwotICAgICAgICB3cml0ZXIuYXR0cmlidXRlKCJhY3Rpb24iLCBsaW5rLmdldFVSTChudWxsLCBmYWxzZSkpOwotCi0gICAgICAgIGlmIChfZW5jb2RpbmdUeXBlICE9IG51bGwpCi0gICAgICAgICAgICB3cml0ZXIuYXR0cmlidXRlKCJlbmN0eXBlIiwgX2VuY29kaW5nVHlwZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVuZGVyQ29tcG9uZW50KElNYXJrdXBXcml0ZXIgd3JpdGVyLCBJUmVxdWVzdEN5Y2xlIGN5Y2xlKQotICAgIHsKLSAgICAgICAgU3RyaW5nIGFjdGlvbklkID0gY3ljbGUuZ2V0TmV4dEFjdGlvbklkKCk7Ci0gICAgICAgIF9uYW1lID0gZ2V0RGlzcGxheU5hbWUoKSArIGFjdGlvbklkOwotCi0gICAgICAgIGJvb2xlYW4gcmVuZGVyRm9ybSA9ICFjeWNsZS5pc1Jld2luZGluZygpOwotICAgICAgICBib29sZWFuIHJld291bmQgPSBjeWNsZS5pc1Jld291bmQodGhpcyk7Ci0KLSAgICAgICAgX3Jld2luZGluZyA9IHJld291bmQ7Ci0KLSAgICAgICAgX2FsbG9jYXRlZElkSW5kZXggPSAwOwotCi0gICAgICAgIF9yZW5kZXJpbmcgPSB0cnVlOwotCi0gICAgICAgIGlmIChyZXdvdW5kKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgc3RvcmVkSWRMaXN0ID0gY3ljbGUuZ2V0UmVxdWVzdENvbnRleHQoKS5nZXRQYXJhbWV0ZXIoX25hbWUpOwotCi0gICAgICAgICAgICByZWNvbnN0cnVjdEFsbG9jYXRlZElkcyhzdG9yZWRJZExpc3QpOwotICAgICAgICB9Ci0KLSAgICAgICAgSUxpbmsgbGluayA9IGdldExpbmsoY3ljbGUsIGFjdGlvbklkKTsKLQotICAgICAgICAvLyBXaGVuIHJlbmRlcmluZywgdXNlIGEgbmVzdGVkIHdyaXRlciBzbyB0aGF0IGFuIGVtYmVkZGVkIFVwbG9hZAotICAgICAgICAvLyBjb21wb25lbnQgY2FuIGZvcmNlIHRoZSBlbmNvZGluZyB0eXBlLgotCi0gICAgICAgIElNYXJrdXBXcml0ZXIgbmVzdGVkID0gd3JpdGVyLmdldE5lc3RlZFdyaXRlcigpOwotCi0gICAgICAgIHJlbmRlckJvZHkobmVzdGVkLCBjeWNsZSk7Ci0KLSAgICAgICAgaWYgKHJlbmRlckZvcm0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlcyh3cml0ZXIsIGxpbmspOwotCi0gICAgICAgICAgICByZW5kZXJJbmZvcm1hbFBhcmFtZXRlcnMod3JpdGVyLCBjeWNsZSk7Ci0gICAgICAgICAgICB3cml0ZXIucHJpbnRsbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gV3JpdGUgdGhlIGhpZGRlbidzLCBvciBhdCBsZWFzdCwgcmVzZXJ2ZSB0aGUgcXVlcnkgcGFyYW1ldGVycwotICAgICAgICAvLyByZXF1aXJlZCBieSB0aGUgR2VzdHVyZS4KLQotICAgICAgICB3cml0ZUxpbmtQYXJhbWV0ZXJzKHdyaXRlciwgbGluaywgIXJlbmRlckZvcm0pOwotCi0gICAgICAgIGlmIChyZW5kZXJGb3JtKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBXaGF0J3MgdGhpcyBmb3I/ICBJdCdzIHBhcnQgb2YgY2hlY2tpbmcgZm9yIHN0YWxlIGxpbmtzLiAgCi0gICAgICAgICAgICAvLyBXZSByZWNvcmQgdGhlIGxpc3Qgb2YgYWxsb2NhdGVkIGlkcy4KLSAgICAgICAgICAgIC8vIE9uIHJld2luZCwgd2UgY2hlY2sgdGhhdCB0aGUgc3RvcmVkIGxpc3QgYWdhaW5zdCB3aGljaAotICAgICAgICAgICAgLy8gaWRzIHdlcmUgYWxsb2NhdGVkLiAgSWYgdGhlIHBlcnNpc3RlbnQgc3RhdGUgb2YgdGhlIHBhZ2Ugb3IKLSAgICAgICAgICAgIC8vIGFwcGxpY2F0aW9uIGNoYW5nZWQgYmV0d2VlbiByZW5kZXIgKHByZXZpb3VzIHJlcXVlc3QgY3ljbGUpCi0gICAgICAgICAgICAvLyBhbmQgcmV3aW5kIChjdXJyZW50IHJlcXVlc3QgY3ljbGUpLCB0aGVuIHRoZSBsaXN0Ci0gICAgICAgICAgICAvLyBvZiBpZHMgd2lsbCBjaGFuZ2UgYXMgd2VsbC4KLQotICAgICAgICAgICAgd3JpdGVIaWRkZW5GaWVsZCh3cml0ZXIsIF9uYW1lLCBidWlsZEFsbG9jYXRlZElkTGlzdCgpKTsKLSAgICAgICAgICAgIHdyaXRlSGlkZGVuVmFsdWVzKHdyaXRlcik7Ci0KLSAgICAgICAgICAgIG5lc3RlZC5jbG9zZSgpOwotCi0gICAgICAgICAgICB3cml0ZXIuZW5kKGdldFRhZygpKTsKLQotICAgICAgICAgICAgLy8gV3JpdGUgb3V0IGV2ZW50IGhhbmRsZXJzIGNvbGxlY3RlZCBkdXJpbmcgdGhlIHJlbmRlcmluZy4KLQotICAgICAgICAgICAgZW1pdEV2ZW50SGFuZGxlcnMod3JpdGVyLCBjeWNsZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocmV3b3VuZCkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IGV4cGVjdGVkID0gX2FsbG9jYXRlZElkcy5zaXplKCk7Ci0KLSAgICAgICAgICAgIC8vIFRoZSBvdGhlciBjYXNlLCBfYWxsb2NhdGVkSWRJbmRleCA+IGV4cGVjdGVkLCBpcwotICAgICAgICAgICAgLy8gY2hlY2tlZCBmb3IgaW5zaWRlIGdldEVsZW1lbnRJZCgpLiAgUmVtZW1iZXIgdGhhdAotICAgICAgICAgICAgLy8gX2FsbG9jYXRlZElkSW5kZXggaXMgaW5jcmVtZW50ZWQgYWZ0ZXIgYWxsb2NhdGluZy4KLQotICAgICAgICAgICAgaWYgKF9hbGxvY2F0ZWRJZEluZGV4IDwgZXhwZWN0ZWQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG5leHRFeHBlY3RlZElkID0gKFN0cmluZykgX2FsbG9jYXRlZElkcy5nZXQoX2FsbG9jYXRlZElkSW5kZXgpOwotCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN0YWxlTGlua0V4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgVGFwZXN0cnkuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAgICAgIkZvcm0udG9vLWZldy1pZHMiLAotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RXh0ZW5kZWRJZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhleHBlY3RlZCAtIF9hbGxvY2F0ZWRJZEluZGV4KSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5leHRFeHBlY3RlZElkKSwKLSAgICAgICAgICAgICAgICAgICAgdGhpcyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIElBY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IGdldExpc3RlbmVyKCk7Ci0KLSAgICAgICAgICAgIGlmIChsaXN0ZW5lciAhPSBudWxsKQotICAgICAgICAgICAgICAgIGxpc3RlbmVyLmFjdGlvblRyaWdnZXJlZCh0aGlzLCBjeWNsZSk7Ci0KLSAgICAgICAgICAgIC8vIEFib3J0IHRoZSByZXdpbmQgcmVuZGVyLgotCi0gICAgICAgICAgICB0aHJvdyBuZXcgUmVuZGVyUmV3b3VuZEV4Y2VwdGlvbih0aGlzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqICBBZGRzIGFuIGFkZGl0aW9uYWwgZXZlbnQgaGFuZGxlci4KLSAgICAgKgotICAgICAqICBAc2luY2UgMS4wLjIKLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCBhZGRFdmVudEhhbmRsZXIoRm9ybUV2ZW50VHlwZSB0eXBlLCBTdHJpbmcgZnVuY3Rpb25OYW1lKQotICAgIHsKLSAgICAgICAgaWYgKF9ldmVudHMgPT0gbnVsbCkKLSAgICAgICAgICAgIF9ldmVudHMgPSBuZXcgSGFzaE1hcChFVkVOVF9NQVBfU0laRSk7Ci0KLSAgICAgICAgT2JqZWN0IHZhbHVlID0gX2V2ZW50cy5nZXQodHlwZSk7Ci0KLSAgICAgICAgLy8gVGhlIHZhbHVlIGNhbiBlaXRoZXIgYmUgYSBTdHJpbmcsIG9yIGEgTGlzdCBvZiBTdHJpbmcuICBTaW5jZQotICAgICAgICAvLyBpdCBpcyByYXJlIGZvciB0aGVyZSB0byBiZSBtb3JlIHRoYW4gb25lIGV2ZW50IGhhbmRsaW5nIGZ1bmN0aW9uLAotICAgICAgICAvLyB3ZSBzdGFydCB3aXRoIGp1c3QgYSBTdHJpbmcuCi0KLSAgICAgICAgaWYgKHZhbHVlID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9ldmVudHMucHV0KHR5cGUsIGZ1bmN0aW9uTmFtZSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBUaGUgc2Vjb25kIGZ1bmN0aW9uIGFkZGVkIGNvbnZlcnRzIGl0IHRvIGEgTGlzdC4KLQotICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIGxpc3QuYWRkKHZhbHVlKTsKLSAgICAgICAgICAgIGxpc3QuYWRkKGZ1bmN0aW9uTmFtZSk7Ci0KLSAgICAgICAgICAgIF9ldmVudHMucHV0KHR5cGUsIGxpc3QpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVGhlIHRoaXJkIGFuZCBzdWJzZXF1ZW50IGZ1bmN0aW9uIGp1c3QKLSAgICAgICAgLy8gYWRkcyB0byB0aGUgTGlzdC4KLQotICAgICAgICBMaXN0IGxpc3QgPSAoTGlzdCkgdmFsdWU7Ci0gICAgICAgIGxpc3QuYWRkKGZ1bmN0aW9uTmFtZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgZW1pdEV2ZW50SGFuZGxlcnMoSU1hcmt1cFdyaXRlciB3cml0ZXIsIElSZXF1ZXN0Q3ljbGUgY3ljbGUpCi0gICAgewotCi0gICAgICAgIGlmIChfZXZlbnRzID09IG51bGwgfHwgX2V2ZW50cy5pc0VtcHR5KCkpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgQm9keSBib2R5ID0gQm9keS5nZXQoY3ljbGUpOwotCi0gICAgICAgIGlmIChib2R5ID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIFRhcGVzdHJ5LmdldE1lc3NhZ2UoIkZvcm0ubmVlZHMtYm9keS1mb3ItZXZlbnQtaGFuZGxlcnMiKSwKLSAgICAgICAgICAgICAgICB0aGlzLAotICAgICAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAgICAgbnVsbCk7Ci0KLSAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotICAgICAgICBJdGVyYXRvciBpID0gX2V2ZW50cy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkKLSAgICAgICAgewotCi0gICAgICAgICAgICBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpLm5leHQoKTsKLSAgICAgICAgICAgIEZvcm1FdmVudFR5cGUgdHlwZSA9IChGb3JtRXZlbnRUeXBlKSBlbnRyeS5nZXRLZXkoKTsKLSAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IGVudHJ5LmdldFZhbHVlKCk7Ci0KLSAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoImRvY3VtZW50LiIpOwotICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChfbmFtZSk7Ci0gICAgICAgICAgICBidWZmZXIuYXBwZW5kKCIuIik7Ci0gICAgICAgICAgICBidWZmZXIuYXBwZW5kKHR5cGUuZ2V0UHJvcGVydHlOYW1lKCkpOwotICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiID0gIik7Ci0KLSAgICAgICAgICAgIC8vIFRoZSB0eXBpY2FsIGNhc2U7IG9uZSBldmVudCBvbmUgZXZlbnQgaGFuZGxlci4gIEVhc3kgZW5vdWdoLgotCi0gICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCh2YWx1ZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCI7Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gQnVpbGQgYSBjb21wb3NpdGUgZnVuY3Rpb24gaW4tcGxhY2UKLQotICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoImZ1bmN0aW9uICgpXG57XG4iKTsKLQotICAgICAgICAgICAgICAgIGJvb2xlYW4gY29tYmluZVdpdGhBbmQgPSB0eXBlLmdldENvbWJpbmVVc2luZ0FuZCgpOwotCi0gICAgICAgICAgICAgICAgTGlzdCBsID0gKExpc3QpIHZhbHVlOwotICAgICAgICAgICAgICAgIGludCBjb3VudCA9IGwuc2l6ZSgpOwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBjb3VudDsgaisrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZ1bmN0aW9uTmFtZSA9IChTdHJpbmcpIGwuZ2V0KGopOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChqID4gMCkKLSAgICAgICAgICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29tYmluZVdpdGhBbmQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiICYmIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiOyIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiXG4gICIpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChjb21iaW5lV2l0aEFuZCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGogPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCJyZXR1cm4gIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiICAiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoZnVuY3Rpb25OYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiKCkiKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCI7XG59Iik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIlxuXG4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIGJvZHkuYWRkSW5pdGlhbGl6YXRpb25TY3JpcHQoYnVmZmVyLnRvU3RyaW5nKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBTaW1wbHkgaW52b2tlcyB7QGxpbmsgI3JlbmRlcihJTWFya3VwV3JpdGVyLCBJUmVxdWVzdEN5Y2xlKX0uCi0gICAgICoKLSAgICAgKiAgQHNpbmNlIDEuMC4yCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgcmV3aW5kKElNYXJrdXBXcml0ZXIgd3JpdGVyLCBJUmVxdWVzdEN5Y2xlIGN5Y2xlKQotICAgIHsKLSAgICAgICAgcmVuZGVyKHdyaXRlciwgY3ljbGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBNZXRob2QgaW52b2tlZCBieSB0aGUgZGlyZWN0IHNlcnZpY2UuCi0gICAgICoKLSAgICAgKiAgQHNpbmNlIDEuMC4yCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCB0cmlnZ2VyKElSZXF1ZXN0Q3ljbGUgY3ljbGUpCi0gICAgewotICAgICAgICBPYmplY3RbXSBwYXJhbWV0ZXJzID0gY3ljbGUuZ2V0U2VydmljZVBhcmFtZXRlcnMoKTsKLQotICAgICAgICBjeWNsZS5yZXdpbmRGb3JtKHRoaXMsIChTdHJpbmcpIHBhcmFtZXRlcnNbMF0pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBCdWlsZHMgdGhlIEVuZ2luZVNlcnZpY2VMaW5rIGZvciB0aGUgZm9ybSwgdXNpbmcgZWl0aGVyIHRoZSBkaXJlY3Qgb3IKLSAgICAgKiAgYWN0aW9uIHNlcnZpY2UuIAotICAgICAqCi0gICAgICogIEBzaW5jZSAxLjAuMwotICAgICAqCi0gICAgICoqLwotCi0gICAgcHJpdmF0ZSBJTGluayBnZXRMaW5rKElSZXF1ZXN0Q3ljbGUgY3ljbGUsIFN0cmluZyBhY3Rpb25JZCkKLSAgICB7Ci0gICAgICAgIFN0cmluZyBzZXJ2aWNlTmFtZSA9IG51bGw7Ci0KLSAgICAgICAgaWYgKGlzRGlyZWN0KCkpCi0gICAgICAgICAgICBzZXJ2aWNlTmFtZSA9IFRhcGVzdHJ5LkRJUkVDVF9TRVJWSUNFOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBzZXJ2aWNlTmFtZSA9IFRhcGVzdHJ5LkFDVElPTl9TRVJWSUNFOwotCi0gICAgICAgIElFbmdpbmUgZW5naW5lID0gY3ljbGUuZ2V0RW5naW5lKCk7Ci0gICAgICAgIElFbmdpbmVTZXJ2aWNlIHNlcnZpY2UgPSBlbmdpbmUuZ2V0U2VydmljZShzZXJ2aWNlTmFtZSk7Ci0KLSAgICAgICAgLy8gQSBzaW5nbGUgc2VydmljZSBwYXJhbWV0ZXIgaXMgdXNlZCB0byBzdG9yZSB0aGUgYWN0aW9uSWQuCi0KLSAgICAgICAgcmV0dXJuIHNlcnZpY2UuZ2V0TGluayhjeWNsZSwgdGhpcywgbmV3IFN0cmluZ1tdIHsgYWN0aW9uSWQgfSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHdyaXRlTGlua1BhcmFtZXRlcnMoSU1hcmt1cFdyaXRlciB3cml0ZXIsIElMaW5rIGxpbmssIGJvb2xlYW4gcmVzZXJ2ZU9ubHkpCi0gICAgewotICAgICAgICBTdHJpbmdbXSBuYW1lcyA9IGxpbmsuZ2V0UGFyYW1ldGVyTmFtZXMoKTsKLSAgICAgICAgaW50IGNvdW50ID0gVGFwZXN0cnkuc2l6ZShuYW1lcyk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IG5hbWVzW2ldOwotCi0gICAgICAgICAgICAvLyBSZXNlcnZlIHRoZSBuYW1lLgotCi0gICAgICAgICAgICBfZWxlbWVudElkQWxsb2NhdG9yLmFsbG9jYXRlSWQobmFtZSk7Ci0KLSAgICAgICAgICAgIGlmICghcmVzZXJ2ZU9ubHkpCi0gICAgICAgICAgICAgICAgd3JpdGVIaWRkZW5GaWVsZHNGb3JQYXJhbWV0ZXIod3JpdGVyLCBsaW5rLCBuYW1lKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqICBAc2luY2UgMy4wCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwcm90ZWN0ZWQgdm9pZCB3cml0ZUhpZGRlbkZpZWxkKElNYXJrdXBXcml0ZXIgd3JpdGVyLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKQotICAgIHsKLQkJd3JpdGVIaWRkZW5GaWVsZCh3cml0ZXIsIG5hbWUsIG51bGwsIHZhbHVlKTsKLSAgICB9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB3cml0ZUhpZGRlbkZpZWxkKElNYXJrdXBXcml0ZXIgd3JpdGVyLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGlkLCBTdHJpbmcgdmFsdWUpCi0JewotCQl3cml0ZXIuYmVnaW5FbXB0eSgiaW5wdXQiKTsKLQkJd3JpdGVyLmF0dHJpYnV0ZSgidHlwZSIsICJoaWRkZW4iKTsKLQkJd3JpdGVyLmF0dHJpYnV0ZSgibmFtZSIsIG5hbWUpOwotCi0JCWlmKGlkICE9IG51bGwgJiYgaWQubGVuZ3RoKCkgIT0gMCkKLQkJCXdyaXRlci5hdHRyaWJ1dGUoImlkIiwgaWQpOwotCQkKLQkJd3JpdGVyLmF0dHJpYnV0ZSgidmFsdWUiLCB2YWx1ZSk7Ci0JCXdyaXRlci5wcmludGxuKCk7Ci0JfQotCi0gICAgLyoqCi0gICAgICogIEBzaW5jZSAyLjIKLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwcml2YXRlIHZvaWQgd3JpdGVIaWRkZW5GaWVsZHNGb3JQYXJhbWV0ZXIoCi0gICAgICAgIElNYXJrdXBXcml0ZXIgd3JpdGVyLAotICAgICAgICBJTGluayBsaW5rLAotICAgICAgICBTdHJpbmcgcGFyYW1ldGVyTmFtZSkKLSAgICB7Ci0gICAgICAgIFN0cmluZ1tdIHZhbHVlcyA9IGxpbmsuZ2V0UGFyYW1ldGVyVmFsdWVzKHBhcmFtZXRlck5hbWUpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICB3cml0ZUhpZGRlbkZpZWxkKHdyaXRlciwgcGFyYW1ldGVyTmFtZSwgdmFsdWVzW2ldKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqICBDb252ZXJ0cyB0aGUgYWxsb2NhdGVJZHMgcHJvcGVydHkgaW50byBhIHN0cmluZywgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBpZHMuCi0gICAgICogIFRoaXMgaXMgaW5jbHVkZWQgYXMgYSBoaWRkZW4gZmllbGQgaW4gdGhlIGZvcm0gYW5kIGlzIHVzZWQgdG8gaWRlbnRpZnkKLSAgICAgKiAgZGlzY3JlcGVuY2llcyB3aGVuIHRoZSBmb3JtIGlzIHN1Ym1pdHRlZC4KLSAgICAgKiAKLSAgICAgKiAgQHNpbmNlIDMuMAotICAgICAqIAotICAgICAqKi8KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgYnVpbGRBbGxvY2F0ZWRJZExpc3QoKQotICAgIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgaW50IGNvdW50ID0gX2FsbG9jYXRlZElkcy5zaXplKCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoaSA+IDApCi0gICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgnLCcpOwotCi0gICAgICAgICAgICBidWZmZXIuYXBwZW5kKF9hbGxvY2F0ZWRJZHMuZ2V0KGkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgQ29udmVydHMgYSBzdHJpbmcgcGFzc2VkIGFzIGEgcGFyYW1ldGVyIChhbmQgY29udGFpbmluZyBhIGNvbW1hCi0gICAgICogIHNlcGFyYXRlZCBsaXN0IG9mIGlkcykgYmFjayBpbnRvIHRoZSBhbGxvY2F0ZUlkcyBwcm9wZXJ0eS4KLSAgICAgKiAKLSAgICAgKiAgQHNlZSAjYnVpbGRBbGxvY2F0ZWRJZExpc3QoKQotICAgICAqIAotICAgICAqICBAc2luY2UgMy4wCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVjb25zdHJ1Y3RBbGxvY2F0ZWRJZHMoU3RyaW5nIHN0b3JlZElkTGlzdCkKLSAgICB7Ci0gICAgICAgIGlmIChUYXBlc3RyeS5pc0JsYW5rKHN0b3JlZElkTGlzdCkpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgU3RyaW5nU3BsaXR0ZXIgc3BsaXR0ZXIgPSBuZXcgU3RyaW5nU3BsaXR0ZXIoJywnKTsKLQotICAgICAgICBTdHJpbmdbXSBpZHMgPSBzcGxpdHRlci5zcGxpdFRvQXJyYXkoc3RvcmVkSWRMaXN0KTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGlkcy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgIF9hbGxvY2F0ZWRJZHMuYWRkKGlkc1tpXSk7Ci0gICAgfQotCi0gICAgcHVibGljIGFic3RyYWN0IElWYWxpZGF0aW9uRGVsZWdhdGUgZ2V0RGVsZWdhdGUoKTsKLQotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldERlbGVnYXRlKElWYWxpZGF0aW9uRGVsZWdhdGUgZGVsZWdhdGUpOwotCi0gICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0RGlyZWN0KGJvb2xlYW4gZGlyZWN0KTsKLQotICAgIHB1YmxpYyBhYnN0cmFjdCBJQWN0aW9uTGlzdGVuZXIgZ2V0TGlzdGVuZXIoKTsKLQotICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0TWV0aG9kKCk7Ci0KLSAgICAvKioKLSAgICAgKiAgSW52b2tlZCB3aGVuIG5vdCByZW5kZXJpbmcsIHNvIGl0IHVzZXMgdGhlIHN0YXRlZnVsIGJpbmRpbmcuCi0gICAgICogIElmIG5vdCBib3VuZCwgcmV0dXJucyB0cnVlLgotICAgICAqIAotICAgICAqKi8KLQotICAgIHB1YmxpYyBib29sZWFuIGlzU3RhdGVmdWwoKQotICAgIHsKLSAgICAgICAgSUJpbmRpbmcgc3RhdGVmdWxCaW5kaW5nID0gZ2V0U3RhdGVmdWxCaW5kaW5nKCk7Ci0KLSAgICAgICAgaWYgKHN0YXRlZnVsQmluZGluZyA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAgICAgcmV0dXJuIHN0YXRlZnVsQmluZGluZy5nZXRCb29sZWFuKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGFic3RyYWN0IElCaW5kaW5nIGdldFN0YXRlZnVsQmluZGluZygpOwotCi0gICAgcHJvdGVjdGVkIHZvaWQgZmluaXNoTG9hZCgpCi0gICAgewotICAgICAgICBzZXREaXJlY3QodHJ1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RW5jb2RpbmdUeXBlKFN0cmluZyBlbmNvZGluZ1R5cGUpCi0gICAgewotICAgICAgICBpZiAoX2VuY29kaW5nVHlwZSAhPSBudWxsICYmICFfZW5jb2RpbmdUeXBlLmVxdWFscyhlbmNvZGluZ1R5cGUpKQotICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICBUYXBlc3RyeS5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICJGb3JtLmVuY29kaW5nLXR5cGUtY29udGVudGlvbiIsCi0gICAgICAgICAgICAgICAgICAgIGdldEV4dGVuZGVkSWQoKSwKLSAgICAgICAgICAgICAgICAgICAgX2VuY29kaW5nVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmdUeXBlKSwKLSAgICAgICAgICAgICAgICB0aGlzLAotICAgICAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAgICAgbnVsbCk7Ci0KLSAgICAgICAgX2VuY29kaW5nVHlwZSA9IGVuY29kaW5nVHlwZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0aGUgdGFnIG9mIHRoZSBmb3JtLgotICAgICAqCi0gICAgICogIEBzaW5jZSAzLjAKLSAgICAgKgotICAgICAqKi8KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VGFnKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAiZm9ybSI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgZWxlbWVudC4KLSAgICAgKgotICAgICAqCi0gICAgICogIEBzaW5jZSAzLjAKLSAgICAgKiovCi0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldERpc3BsYXlOYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAiRm9ybSI7Ci0gICAgfQotCi0gICAgLyoqIEBzaW5jZSAzLjAgKi8KLQotICAgIHB1YmxpYyB2b2lkIGFkZEhpZGRlblZhbHVlKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpCi0gICAgewotCQlpZiAoX2hpZGRlblZhbHVlcyA9PSBudWxsKQotCQkJX2hpZGRlblZhbHVlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlfaGlkZGVuVmFsdWVzLmFkZChuZXcgSGlkZGVuVmFsdWUobmFtZSwgdmFsdWUpKTsKLSAgICB9Ci0KLQkvKiogQHNpbmNlIDMuMCAqLwotCi0JcHVibGljIHZvaWQgYWRkSGlkZGVuVmFsdWUoU3RyaW5nIG5hbWUsIFN0cmluZyBpZCwgU3RyaW5nIHZhbHVlKQotCXsKLQkJaWYgKF9oaWRkZW5WYWx1ZXMgPT0gbnVsbCkKLQkJCV9oaWRkZW5WYWx1ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJX2hpZGRlblZhbHVlcy5hZGQobmV3IEhpZGRlblZhbHVlKG5hbWUsIGlkLCB2YWx1ZSkpOwotCX0KLQotICAgIC8qKiAKLSAgICAgKiBXcml0ZXMgaGlkZGVuIHZhbHVlcyBhY2N1bXVsYXRlZCBkdXJpbmcgdGhlIHJlbmRlcgotICAgICAqIChieSBjb21wb25lbnRzIGludm9raW5nIHtAbGluayAjYWRkSGlkZGVuVmFsdWUoU3RyaW5nLCBTdHJpbmcpfS4KLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMy4wCi0gICAgICovCi0KLSAgICBwcm90ZWN0ZWQgdm9pZCB3cml0ZUhpZGRlblZhbHVlcyhJTWFya3VwV3JpdGVyIHdyaXRlcikKLSAgICB7Ci0gICAgICAgIGludCBjb3VudCA9IFRhcGVzdHJ5LnNpemUoX2hpZGRlblZhbHVlcyk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBIaWRkZW5WYWx1ZSBodiA9IChIaWRkZW5WYWx1ZSkgX2hpZGRlblZhbHVlcy5nZXQoaSk7Ci0KLSAgICAgICAgICAgIHdyaXRlSGlkZGVuRmllbGQod3JpdGVyLCBodi5fbmFtZSwgaHYuX2lkLCBodi5fdmFsdWUpOwotICAgICAgICB9Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9mb3JtL0Zvcm0uandjIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2Zvcm0vRm9ybS5qd2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkNGMyYzguLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2Zvcm0vRm9ybS5qd2MKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gIAotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTwhLS0gJElkJCAtLT4KLTwhRE9DVFlQRSBjb21wb25lbnQtc3BlY2lmaWNhdGlvbiBQVUJMSUMgCi0gICItLy9BcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi8vVGFwZXN0cnkgU3BlY2lmaWNhdGlvbiAzLjAvL0VOIiAKLSAgImh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvdGFwZXN0cnkvZHRkL1RhcGVzdHJ5XzNfMC5kdGQiPgotICAKLTxjb21wb25lbnQtc3BlY2lmaWNhdGlvbiBjbGFzcz0ib3JnLmFwYWNoZS50YXBlc3RyeS5mb3JtLkZvcm0iPgotCi0gIDxkZXNjcmlwdGlvbj4KLSAgVXNlZCB0byBpbXBsZW1lbnQgYW4gSFRNTCBmb3JtLgotICA8L2Rlc2NyaXB0aW9uPgotCi0gIDxwYXJhbWV0ZXIgbmFtZT0ibWV0aG9kIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIiBkaXJlY3Rpb249ImluIj4KLSAgICA8ZGVzY3JpcHRpb24+Ci0gICAgVGhlIG1ldGhvZCB1c2VkIGJ5IHRoZSBmb3JtIHdoZW4gaXQgaXMgc3VibWl0dGVkLCBkZWZhdWx0cyB0byBQT1NULgotICAgIDwvZGVzY3JpcHRpb24+Ci0gIDwvcGFyYW1ldGVyPgotICAKLSAgPHBhcmFtZXRlciBuYW1lPSJsaXN0ZW5lciIgCi0gIAl0eXBlPSJvcmcuYXBhY2hlLnRhcGVzdHJ5LklBY3Rpb25MaXN0ZW5lciIgCi0gIAlyZXF1aXJlZD0ibm8iCi0gIAlkaXJlY3Rpb249ImluIj4KLSAgICA8ZGVzY3JpcHRpb24+Ci0gIAlPYmplY3QgaW52b2tlZCB3aGVuIHRoZSBmb3JtIGlzIHN1Ym1pdHRlZCwgYWZ0ZXIgYWxsIGZvcm0gY29tcG9uZW50cyBoYXZlIHJlc3BvbmRlZAotICAJdG8gdGhlIHN1Ym1pc3Npb24uCi0gICAgPC9kZXNjcmlwdGlvbj4KLSAgPC9wYXJhbWV0ZXI+Ci0gIAotICA8cGFyYW1ldGVyIG5hbWU9InN0YXRlZnVsIiAKLSAgCXR5cGU9ImJvb2xlYW4iIAotICAJZGlyZWN0aW9uPSJjdXN0b20iPgotICAgIDxkZXNjcmlwdGlvbj4KLSAgICBJZiB0cnVlICh0aGUgZGVmYXVsdCksIHRoZW4gYW4gYWN0aXZlIEh0dHBTZXNzaW9uIGlzIHJlcXVpcmVkLgotICAgIDwvZGVzY3JpcHRpb24+Ci0gIDwvcGFyYW1ldGVyPgotICAKLSAgPHBhcmFtZXRlciBuYW1lPSJkaXJlY3QiIHR5cGU9ImJvb2xlYW4iIGRpcmVjdGlvbj0iaW4iPgotICAgIDxkZXNjcmlwdGlvbj4KLSAgICBJZiB0cnVlICh0aGUgZGVmYXVsdCksIHRoZW4gdGhlIG1vcmUgZWZmaWNpZW50IGRpcmVjdCBzZXJ2aWNlIGlzIHVzZWQuCi0gICAgSWYgZmFsc2UsIHRoZW4gdGhlIGFjdGlvbiBzZXJ2aWNlIGlzIHVzZWQuCi0gICAgPC9kZXNjcmlwdGlvbj4KLSAgPC9wYXJhbWV0ZXI+Ci0gIAotICA8cGFyYW1ldGVyIG5hbWU9ImRlbGVnYXRlIiAKLSAgCXR5cGU9Im9yZy5hcGFjaGUudGFwZXN0cnkudmFsaWQuSVZhbGlkYXRpb25EZWxlZ2F0ZSIgZGlyZWN0aW9uPSJpbiI+Ci0gICAgPGRlc2NyaXB0aW9uPgotICAgIFNwZWNpZmllcyB0aGUgZGVsZWdhdGUgdG8gYmUgdXNlZCBieSBmaWVsZHMgdG8gdHJhY2sgaW5wdXQgZXJyb3JzLgotICAgIDwvZGVzY3JpcHRpb24+Ci0gIDwvcGFyYW1ldGVyPgotCi0gIDxyZXNlcnZlZC1wYXJhbWV0ZXIgbmFtZT0iYWN0aW9uIi8+Ci0KLTwvY29tcG9uZW50LXNwZWNpZmljYXRpb24+CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZm9ybS9Gb3JtRXZlbnRUeXBlLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZm9ybS9Gb3JtRXZlbnRUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwYjFmOWQuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2Zvcm0vRm9ybUV2ZW50VHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuZm9ybTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLmVudW0uRW51bTsKLQotLyoqCi0gKiAgTGlzdHMgZGlmZmVyZW50IHR5cGVzIG9mIEphdmFTY3JpcHQgZXZlbnRzIHRoYXQgY2FuIGJlIGFzc29jaWF0ZWQKLSAqICB3aXRoIGEge0BsaW5rIEZvcm19IHZpYSB7QGxpbmsgRm9ybSNhZGRFdmVudEhhbmRsZXIoRm9ybUV2ZW50VHlwZSwgU3RyaW5nKX0uCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQHNpbmNlIDEuMC4yCi0gKiovCi0KLXB1YmxpYyBjbGFzcyBGb3JtRXZlbnRUeXBlIGV4dGVuZHMgRW51bQotewotICAgIC8qKgotICAgICAqICBGb3JtIGV2ZW50IHRyaWdnZXJlZCB3aGVuIHRoZSBmb3JtIGlzIHN1Ym1pdHRlZC4gIEFsbG93cyBhbiBldmVudCBoYW5kbGVyCi0gICAgICogIHRvIHBlcmZvcm0gYW55IGZpbmFsIGNoYW5nZXMgYmVmb3JlIHRoZSByZXN1bHRzIGFyZSBwb3N0ZWQgdG8gdGhlIHNlcnZlci4KLSAgICAgKgotICAgICAqICA8cD5UaGUgSmF2YVNjcmlwdCBtZXRob2Qgc2hvdWxkIHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBvcgotICAgICAqIDxjb2RlPmZhbHNlPC9jb2RlPi4gIElmIHRoZXJlIGFyZSBtdWx0aXBsZSBldmVudCBoYW5kbGVycyBmb3IgdGhlIGZvcm0KLSAgICAgKiB0aGV5IHdpbGwgYmUgY29tYmluZWQgdXNpbmcgdGhlIGJpbmFyeSBhbmQgb3BlcmF0b3IgKDxjb2RlPiZhbXA7JmFtcDs8L2NvZGU+KS4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRm9ybUV2ZW50VHlwZSBTVUJNSVQgPSBuZXcgRm9ybUV2ZW50VHlwZSgiU1VCTUlUIiwgIm9uc3VibWl0Iik7Ci0KLSAgICAvKioKLSAgICAgKiAgRm9ybSBldmVudCB0cmlnZ2VyZWQgd2hlbiB0aGUgZm9ybSBpcyByZXNldDsgdGhpcyBhbGxvd3MgYW4gZXZlbnQgaGFuZGxlcgotICAgICAqICB0byBkZWFsIHdpdGggYW55IHNwZWNpYWwgY2FzZXMgcmVsYXRlZCB0byByZXNldHRpbmcuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEZvcm1FdmVudFR5cGUgUkVTRVQgPSBuZXcgRm9ybUV2ZW50VHlwZSgiUkVTRVQiLCAib25yZXNldCIpOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgX3Byb3BlcnR5TmFtZTsKLQotICAgIHByaXZhdGUgRm9ybUV2ZW50VHlwZShTdHJpbmcgbmFtZSwgU3RyaW5nIHByb3BlcnR5TmFtZSkKLSAgICB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotCi0gICAgICAgIF9wcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWU7Ci0gICAgfQotCi0gICAgLyoqIAotICAgICAqICBSZXR1cm5zIHRoZSBET00gcHJvcGVydHkgY29ycmVzcG9uZGluZyB0byBldmVudCB0eXBlICh1c2VkIHdoZW4gZ2VuZXJhdGluZwotICAgICAqICBjbGllbnQtc2lkZSBzY3JpcHRpbmcpLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eU5hbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9wcm9wZXJ0eU5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgdHJ1ZSBpZiBtdWx0aXBsZSBmdW5jdGlvbnMgc2hvdWxkIGJlIGNvbWJpbmVkCi0gICAgICogIHdpdGggdGhlIDxjb2RlPiZhbXA7JmFtcDs8L2NvZGU+IG9wZXJhdG9yLiAgT3RoZXJ3aXNlLAotICAgICAqICB0aGUgZXZlbnQgaGFuZGxlciBmdW5jdGlvbnMgYXJlIHNpbXBseSBpbnZva2VkCi0gICAgICogIHNlcXVlbnRpYWxseSAoYXMgYSBzZXJpZXMgb2YgSmF2YVNjcmlwdCBzdGF0ZW1lbnRzKS4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBib29sZWFuIGdldENvbWJpbmVVc2luZ0FuZCgpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcyA9PSBGb3JtRXZlbnRUeXBlLlNVQk1JVDsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2Zvcm0vSGlkZGVuLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZm9ybS9IaWRkZW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY0M2RlMS4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZm9ybS9IaWRkZW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NiArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5mb3JtOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUFjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUJpbmRpbmc7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JRm9ybTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklNYXJrdXBXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVxdWVzdEN5Y2xlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkudXRpbC5pby5EYXRhU3F1ZWV6ZXI7Ci0KLS8qKgotICogIEltcGxlbWVudHMgYSBoaWRkZW4gZmllbGQgd2l0aGluIGEge0BsaW5rIEZvcm19LgotICoKLSAqICBbPGEgaHJlZj0iLi4vLi4vLi4vLi4vLi4vQ29tcG9uZW50UmVmZXJlbmNlL0hpZGRlbi5odG1sIj5Db21wb25lbnQgUmVmZXJlbmNlPC9hPl0KLSAqCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogIEB2ZXJzaW9uICRJZCQKLSAqIAotICoqLwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSGlkZGVuIGV4dGVuZHMgQWJzdHJhY3RGb3JtQ29tcG9uZW50Ci17Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCByZW5kZXJDb21wb25lbnQoSU1hcmt1cFdyaXRlciB3cml0ZXIsIElSZXF1ZXN0Q3ljbGUgY3ljbGUpCi0gICAgewotICAgICAgICBJRm9ybSBmb3JtID0gZ2V0Rm9ybShjeWNsZSk7Ci0gICAgICAgIGJvb2xlYW4gZm9ybVJld291bmQgPSBmb3JtLmlzUmV3aW5kaW5nKCk7Ci0KLSAgICAgICAgU3RyaW5nIG5hbWUgPSBmb3JtLmdldEVsZW1lbnRJZCh0aGlzKTsKLQotICAgICAgICAvLyBJZiB0aGUgZm9ybSBjb250YWluaW5nIHRoZSBIaWRkZW4gaXNuJ3QgcmV3b3VuZCwgdGhlbiByZW5kZXIuCi0KLSAgICAgICAgaWYgKCFmb3JtUmV3b3VuZCkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gT3B0aW1pemlhdGlvbjogaWYgdGhlIHBhZ2UgaXMgcmV3aW5kaW5nIChzb21lIG90aGVyIGFjdGlvbiBvcgotICAgICAgICAgICAgLy8gZm9ybSB3YXMgc3VibWl0dGVkKSwgdGhlbiBkb24ndCBib3RoZXIgcmVuZGVyaW5nLgotCi0gICAgICAgICAgICBpZiAoY3ljbGUuaXNSZXdpbmRpbmcoKSkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgICAgIFN0cmluZyBleHRlcm5hbFZhbHVlID0gbnVsbDsKLQotICAgICAgICAgICAgaWYgKGdldEVuY29kZSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IGdldFZhbHVlQmluZGluZygpLmdldE9iamVjdCgpOwotCi0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBleHRlcm5hbFZhbHVlID0gZ2V0RGF0YVNxdWVlemVyKCkuc3F1ZWV6ZSh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBleCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24oZXguZ2V0TWVzc2FnZSgpLCB0aGlzLCBudWxsLCBleCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGV4dGVybmFsVmFsdWUgPSAoU3RyaW5nKSBnZXRWYWx1ZUJpbmRpbmcoKS5nZXRPYmplY3QoInZhbHVlIiwgU3RyaW5nLmNsYXNzKTsKLQotICAgICAgICAgICAgU3RyaW5nIGlkID0gZ2V0RWxlbWVudElkKCk7Ci0gICAgICAgICAgICAvL2lmIHdlIHdvdWxkIGxpa2UgdG8gdGVzdCB0aGUgSUZvcm0uYWRkSGlkZGVuVmFsdWUobmFtZSwgZXh0ZXJuYWxWYWx1ZSkgbWV0aG9kIHdpdGgKLSAgICAgICAgICAgIC8vSGlkZGVuIEpVbml0IHRlc3QgdGhlIGZvbGxvd2luZyBjb2RlIG11c3QgYmUgZGVmYXVsdC4gQnV0IGZyb20gdGhlIHBlcmZvcm1hbmNlIGlzc3VlCi0gICAgICAgICAgICAvL0kgZG9uJ3QgdXNlIHRoZSBpZCBwYXJhbWV0ZXIgY2xhdXNlcy4gIAotLyoJCQlpZihpZCA9PSBudWxsIHx8IGlkLmxlbmd0aCgpID09IDApewotCQkJCWZvcm0uYWRkSGlkZGVuVmFsdWUobmFtZSwgZXh0ZXJuYWxWYWx1ZSk7Ci0gICAgICAgICAgICB9ZWxzZXsKLQkJCQlmb3JtLmFkZEhpZGRlblZhbHVlKG5hbWUsIGlkLCBleHRlcm5hbFZhbHVlKTsKLSAgICAgICAgICAgIH0KLSovCi0JCQlmb3JtLmFkZEhpZGRlblZhbHVlKG5hbWUsIGlkLCBleHRlcm5hbFZhbHVlKTsKLSAgICAgICAgICAgIAotCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgZXh0ZXJuYWxWYWx1ZSA9IGN5Y2xlLmdldFJlcXVlc3RDb250ZXh0KCkuZ2V0UGFyYW1ldGVyKG5hbWUpOwotICAgICAgICBPYmplY3QgdmFsdWUgPSBudWxsOwotCi0gICAgICAgIGlmIChnZXRFbmNvZGUoKSkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSBnZXREYXRhU3F1ZWV6ZXIoKS51bnNxdWVlemUoZXh0ZXJuYWxWYWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZXgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbihleC5nZXRNZXNzYWdlKCksIHRoaXMsIG51bGwsIGV4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICB2YWx1ZSA9IGV4dGVybmFsVmFsdWU7Ci0KLSAgICAgICAgLy8gQSBsaXN0ZW5lciBpcyBub3QgYWx3YXlzIG5lY2Vzc2FyeSAuLi4gaXQncyBlYXN5IHRvIGNvZGUKLSAgICAgICAgLy8gdGhlIHN5bmNocm9uaXphdGlvbiBhcyBhIHNpZGUtZWZmZWN0IG9mIHRoZSBhY2Nlc3NvciBtZXRob2QuCi0KLSAgICAgICAgZ2V0VmFsdWVCaW5kaW5nKCkuc2V0T2JqZWN0KHZhbHVlKTsKLQotICAgICAgICBJQWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBnZXRMaXN0ZW5lcigpOwotCi0gICAgICAgIGlmIChsaXN0ZW5lciAhPSBudWxsKQotICAgICAgICAgICAgbGlzdGVuZXIuYWN0aW9uVHJpZ2dlcmVkKHRoaXMsIGN5Y2xlKTsKLSAgICB9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnRJZCgpewotCQlTdHJpbmcgdmFsdWUgPSBudWxsOwotCQlJQmluZGluZyBpZEJpbmRpbmcgPSBnZXRJZEJpbmRpbmcoKTsKLQkJaWYoaWRCaW5kaW5nICE9IG51bGwpewotCQkJdmFsdWUgPSBpZEJpbmRpbmcuZ2V0U3RyaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotICAgIC8qKiBAc2luY2UgMi4yICoqLwotCi0gICAgcHJpdmF0ZSBEYXRhU3F1ZWV6ZXIgZ2V0RGF0YVNxdWVlemVyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRQYWdlKCkuZ2V0RW5naW5lKCkuZ2V0RGF0YVNxdWVlemVyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGFic3RyYWN0IElBY3Rpb25MaXN0ZW5lciBnZXRMaXN0ZW5lcigpOwotCi0gICAgcHVibGljIGFic3RyYWN0IElCaW5kaW5nIGdldFZhbHVlQmluZGluZygpOwotCXB1YmxpYyBhYnN0cmFjdCBJQmluZGluZyBnZXRJZEJpbmRpbmcoKTsKLQotICAgIC8qKgotICAgICAqIAotICAgICAqICBSZXR1cm5zIGZhbHNlLiAgSGlkZGVuIGNvbXBvbmVudHMgYXJlIG5ldmVyIGRpc2FibGVkLgotICAgICAqIAotICAgICAqICBAc2luY2UgMi4yCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIGJvb2xlYW4gaXNEaXNhYmxlZCgpCi0gICAgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqIAotICAgICAqIAotICAgICAqICBSZXR1cm5zIHRydWUgaWYgdGhlIGNvbXBlbnQgZW5jb2RlcyBvYmplY3QgdmFsdWVzIHVzaW5nIGEKLSAgICAgKiAge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkudXRpbC5pby5EYXRhU3F1ZWV6ZXJ9LCBmYWxzZQotICAgICAqICBpZiB2YWx1ZXMgYXJlIGFsd2F5cyBTdHJpbmdzLgotICAgICAqIAotICAgICAqICBAc2luY2UgMi4yCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gZ2V0RW5jb2RlKCk7Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRFbmNvZGUoYm9vbGVhbiBlbmNvZGUpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZW5jb2RlIHBhcmFtZXRlciBwcm9wZXJ0eSB0byBpdHMgZGVmYXVsdCwgdHJ1ZS4KLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMy4wCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZmluaXNoTG9hZCgpCi0gICAgewotICAgICAgICBzZXRFbmNvZGUodHJ1ZSk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9mb3JtL0hpZGRlbi5qd2MgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZm9ybS9IaWRkZW4uandjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWVjMTQ5Li4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9mb3JtL0hpZGRlbi5qd2MKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gIAotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTwhLS0gJElkJCAtLT4KLTwhRE9DVFlQRSBjb21wb25lbnQtc3BlY2lmaWNhdGlvbiBQVUJMSUMgCi0gICItLy9BcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi8vVGFwZXN0cnkgU3BlY2lmaWNhdGlvbiAzLjAvL0VOIiAKLSAgImh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvdGFwZXN0cnkvZHRkL1RhcGVzdHJ5XzNfMC5kdGQiPgotCQotPGNvbXBvbmVudC1zcGVjaWZpY2F0aW9uIGNsYXNzPSJvcmcuYXBhY2hlLnRhcGVzdHJ5LmZvcm0uSGlkZGVuIiAKLQlhbGxvdy1ib2R5PSJubyIgCi0JYWxsb3ctaW5mb3JtYWwtcGFyYW1ldGVycz0ibm8iPgotCi0gIDxkZXNjcmlwdGlvbj4KLSAgU3RvcmVzIGEgdmFsdWUgaW4gYSBoaWRkZW4gZmllbGQgb2YgdGhlIGZvcm0uCi0gIDwvZGVzY3JpcHRpb24+Ci0gIAotICA8cGFyYW1ldGVyIG5hbWU9InZhbHVlIiAKLSAgCXJlcXVpcmVkPSJ5ZXMiIAotICAJdHlwZT0iamF2YS5sYW5nLk9iamVjdCIKLSAgCWRpcmVjdGlvbj0iY3VzdG9tIj4KLSAgICA8ZGVzY3JpcHRpb24+Ci0gICAgVmFsdWUgdG8gc2F2ZSBpbiB0aGUgZm9ybS4KLSAgICA8L2Rlc2NyaXB0aW9uPgotICA8L3BhcmFtZXRlcj4KLSAgCi0gIDxwYXJhbWV0ZXIgbmFtZT0ibGlzdGVuZXIiIAotICAJdHlwZT0ib3JnLmFwYWNoZS50YXBlc3RyeS5JQWN0aW9uTGlzdGVuZXIiCi0gIAlkaXJlY3Rpb249ImluIj4KLSAgICA8ZGVzY3JpcHRpb24+Ci0gICAgTGlzdGVuZXIgbm90aWZpZWQgYWZ0ZXIgdGhlIHZhbHVlIGlzIHJlc3RvcmVkLgotICAgIDwvZGVzY3JpcHRpb24+Ci0gIDwvcGFyYW1ldGVyPgotICAKLSAgPHBhcmFtZXRlciBuYW1lPSJpZCIgCi0gIAlyZXF1aXJlZD0ibm8iIAotICAJdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgCWRpcmVjdGlvbj0iY3VzdG9tIj4KLSAgICA8ZGVzY3JpcHRpb24+Ci0gICAgSUQgcGFyYW1ldGVyIG9mIEhUTUwgaGlkZGVuIG9iamVjdC4KLSAgICA8L2Rlc2NyaXB0aW9uPgotICA8L3BhcmFtZXRlcj4KLQotICA8cGFyYW1ldGVyIG5hbWU9ImVuY29kZSIgdHlwZT0iYm9vbGVhbiIgZGlyZWN0aW9uPSJpbiIvPgotCi0gIDxwcm9wZXJ0eS1zcGVjaWZpY2F0aW9uIG5hbWU9Im5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KLSAgPHByb3BlcnR5LXNwZWNpZmljYXRpb24gbmFtZT0iZm9ybSIgdHlwZT0ib3JnLmFwYWNoZS50YXBlc3RyeS5JRm9ybSIvPgotICAgCi08L2NvbXBvbmVudC1zcGVjaWZpY2F0aW9uPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9mb3JtL0lGb3JtQ29tcG9uZW50LmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZm9ybS9JRm9ybUNvbXBvbmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTUxODEzLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9mb3JtL0lGb3JtQ29tcG9uZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5mb3JtOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JQ29tcG9uZW50OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUZvcm07Ci0KLS8qKgotICogIEEgY29tbW9uIGludGVyZmFjZSBpbXBsZW1lbnRlZCBieSBhbGwgZm9ybSBjb21wb25lbnRzIChjb21wb25lbnRzIHRoYXQKLSAqICBjcmVhdGUgaW50ZXJhY3RpdmUgZWxlbWVudHMgaW4gdGhlIHJlbmRlcmVkIHBhZ2UpLgotICoKLSAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiAgQHZlcnNpb24gJElkJAotICoqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElGb3JtQ29tcG9uZW50IGV4dGVuZHMgSUNvbXBvbmVudAotewotICAgIC8qKgotICAgICAqICBSZXR1cm5zIHRoZSB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5JRm9ybX0gd2hpY2ggY29udGFpbnMgdGhlIGNvbXBvbmVudCwKLSAgICAgKiAgb3IgbnVsbCBpZiB0aGUgY29tcG9uZW50IGlzIG5vdCBjb250YWluZWQgYnkgYSBmb3JtLAotICAgICAqICBvZiBpZiB0aGUgY29udGFpbmluZyBGb3JtIGlzIG5vdCBjdXJyZW50bHkgcmVuZGVycmluZy4KLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgSUZvcm0gZ2V0Rm9ybSgpOwotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGNvbXBvbmVudCwgd2hpY2ggaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQKLSAgICAgKiAgZHVyaW5nIHJlbmRlcnJpbmcuCi0gICAgICoKLSAgICAgKiAgPHA+VGhpcyB2YWx1ZSBpcyBzZXQgaW5zaWRlIHRoZSBjb21wb25lbnQncyByZW5kZXIgbWV0aG9kIGFuZCBpcwotICAgICAqICA8ZW0+bm90PC9lbT4gY2xlYXJlZC4gIElmIHRoZSBjb21wb25lbnQgaXMgaW5zaWRlIGEge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkuY29tcG9uZW50cy5Gb3JlYWNofSwgdGhlCi0gICAgICogIHZhbHVlIHJldHVybmVkIGlzIHRoZSBtb3N0IHJlY2VudCBuYW1lIGdlbmVyYXRlZCBmb3IgdGhlIGNvbXBvbmVudC4KLSAgICAgKgotICAgICAqICA8cD5UaGlzIHByb3BlcnR5IGlzIG1hZGUgYXZhaWxhYmxlIHRvIGZhY2lsaXRhdGUgd3JpdGluZyBKYXZhU2NyaXB0IHRoYXQKLSAgICAgKiAgYWxsb3dzIGNvbXBvbmVudHMgKGluIHRoZSBjbGllbnQgd2ViIGJyb3dzZXIpIHRvIGludGVyYWN0LgotICAgICAqCi0gICAgICogIDxwPkluIHByYWN0aWNlLCBhIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5Lmh0bWwuU2NyaXB0fSBjb21wb25lbnQKLSAgICAgKiAgd29ya3Mgd2l0aCB0aGUge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkuaHRtbC5Cb2R5fSBjb21wb25lbnQgdG8gZ2V0IHRoZQotICAgICAqICBKYXZhU2NyaXB0IGNvZGUgaW5zZXJ0ZWQgYW5kIHJlZmVyZW5jZWQuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiAgSW52b2tlZCBieSB7QGxpbmsgSUZvcm0jZ2V0RWxlbWVudElkKElGb3JtQ29tcG9uZW50KX0gd2hlbiBhIG5hbWUgaXMgY3JlYXRlZAotICAgICAqICBmb3IgYSBmb3JtIGNvbXBvbmVudC4KLSAgICAgKiAKLSAgICAgKiAgQHNpbmNlIDMuMAotICAgICAqIAotICAgICAqKi8KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKTsKLQotICAgIC8qKgotICAgICAqICBNYXkgYmUgaW1wbGVtZW50ZWQgdG8gcmV0dXJuIGEgdXNlci1wcmVzZW50YWJsZSwgbG9jYWxpemVkIG5hbWUgZm9yIHRoZSBjb21wb25lbnQsCi0gICAgICogIHdoaWNoIGlzIHVzZWQgaW4gbGFiZWxzIG9yIGVycm9yIG1lc3NhZ2VzLiAgTW9zdCBjb21wb25lbnRzIHNpbXBseSByZXR1cm4gbnVsbC4KLSAgICAgKiAKLSAgICAgKiAgQHNpbmNlIDEuMC45Ci0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIFN0cmluZyBnZXREaXNwbGF5TmFtZSgpOwotICAgIAotICAgIC8qKgotICAgICAqICBSZXR1cm5zIHRydWUgaWYgdGhlIGNvbXBvbmVudCBpcyBkaXNhYmxlZC4gIFRoaXMgaXMgaW1wb3J0YW50IHdoZW4gdGhlIGNvbnRhaW5pbmcKLSAgICAgKiAgZm9ybSBpcyBzdWJtaXR0ZWQsIHNpbmNlIGRpc2FibGVkIHBhcmFtZXRlcnMgZG8gbm90IHVwZGF0ZSB0aGVpciBiaW5kaW5ncy4KLSAgICAgKiAKLSAgICAgKiAgQHNpbmNlIDIuMgotICAgICAqIAotICAgICAqKi8KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0Rpc2FibGVkKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2Zvcm0vSVByb3BlcnR5U2VsZWN0aW9uTW9kZWwuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9mb3JtL0lQcm9wZXJ0eVNlbGVjdGlvbk1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMzFlYzYuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2Zvcm0vSVByb3BlcnR5U2VsZWN0aW9uTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmZvcm07Ci0KLS8qKgotICogIFVzZWQgYnkgYSB7QGxpbmsgUHJvcGVydHlTZWxlY3Rpb259IHRvIHByb3ZpZGUgbGFiZWxzIGZvciBvcHRpb25zLgotICoKLSAqICA8cD5UaGUgY29tcG9uZW50IHJlcXVpcmVzIHRocmVlIGRpZmZlcmVudCByZXByZXNlbnRhdGlvbnMKLSAqICBvZiBlYWNoIG9wdGlvbjoKLSAqICA8dWw+Ci0gKiAgPGxpPlRoZSBvcHRpb24gdmFsdWUsIGEgSmF2YSBvYmplY3QgdGhhdCB3aWxsIGV2ZW50dWFsbHkgYmUgYXNzaWduZWQgdG8KLSAqICBhIHByb3BlcnR5Ci0gKiAgPGxpPlRoZSBsYWJlbCwgYSBTdHJpbmcgd2hpY2ggaXMgaW5jb3JwcmF0ZWQgaW50byB0aGUgSFRNTCB0byBpZGVudGlmeSB0aGUKLSAqICBvcHRpb24gdG8gdGhlIHVzZXIKLSAqICA8bGk+VGhlIHZhbHVlLCBhIFN0cmluZyB3aGljaCBpcyB1c2VkIHRvIHJlcHJlc2VudCB0aGUgb3B0aW9uIGFzIHRoZSB2YWx1ZQotICogIG9mIHRoZSAmbHQ7b3B0aW9uJmd0OyBvciAmbHQ7aW5wdXQgdHlwZT1yYWRpbyZndDsgZ2VuZXJhdGVkIGJ5IHRoZQotICogIHtAbGluayBQcm9wZXJ0eVNlbGVjdGlvbn0uCi0gKiAgPC91bD4KLSAqCi0gKiAgPHA+VGhlIG9wdGlvbiBpcyB1c3VhbGx5IGVpdGhlciBhbiB7QGxpbmsgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuZW51bS5FbnVtfSAKLSAqICAoc2VlIHtAbGluayBFbnVtUHJvcGVydHlTZWxlY3Rpb25Nb2RlbH0pCi0gKiAgb3Igc29tZSBraW5kIG9mIGJ1c2luZXNzIG9iamVjdC4gIFRoZSBsYWJlbCBpcyBvZnRlbiBhIHByb3BlcnR5IG9mIHRoZQotICogIG9wdGlvbiBvYmplY3QgKGZvciBleGFtcGxlLCBmb3IgYSBsaXN0IG9mIGN1c3RvbWVycywgaXQgY291bGQgYmUgdGhlIGN1c3RvbWVyIG5hbWUpLgotICoKLSAqICA8cD5JdCBzaG91bGQgYmUgZWFzeSB0byBjb252ZXJ0IGJldHdlZW4gdGhlIHZhbHVlIGFuZCB0aGUgb3B0aW9uLiAgSXQgbWF5IHNpbXBseQotICogIGJlIGFuIGluZGV4IGludG8gYW4gYXJyYXkuICBGb3IgYnVzaW5lc3Mgb2JqZWN0cywgaXQgaXMgb2Z0ZW4gdGhlIHByaW1hcnkga2V5Ci0gKiAgb2YgdGhlIG9iamVjdCwgZXhwcmVzc2VkIGFzIGEgU3RyaW5nLgotICoKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICoKLSAqKi8KLQotcHVibGljIGludGVyZmFjZSBJUHJvcGVydHlTZWxlY3Rpb25Nb2RlbAotewotICAgIC8qKgotICAgICAqICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgcG9zc2libGUgb3B0aW9ucy4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBpbnQgZ2V0T3B0aW9uQ291bnQoKTsKLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIG9uZSBwb3NzaWJsZSBvcHRpb24uCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgT2JqZWN0IGdldE9wdGlvbihpbnQgaW5kZXgpOwotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgdGhlIGxhYmVsIGZvciBhbiBvcHRpb24uICBJdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlCi0gICAgICogIGFkYXB0b3IgdG8gbWFrZSB0aGlzIHZhbHVlIGxvY2FsaXplZC4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoaW50IGluZGV4KTsKLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIGEgU3RyaW5nIHVzZWQgdG8gcmVwcmVzZW50IHRoZSBvcHRpb24gaW4gdGhlIEhUTUwgKGFzIHRoZQotICAgICAqICB2YWx1ZSBvZiBhbiAmbHQ7b3B0aW9uJmd0OyBvciAmbHQ7aW5wdXQgdHlwZT1yYWRpbyZndDsuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKGludCBpbmRleCk7Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0aGUgb3B0aW9uIGNvcnJlc3BvbmRpbmcgdG8gYSB2YWx1ZS4gIFRoaXMgaXMgdXNlZCB3aGVuCi0gICAgICogIGludGVycHJldGluZyBzdWJtaXR0ZWQgZm9ybSBwYXJhbWV0ZXJzLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIE9iamVjdCB0cmFuc2xhdGVWYWx1ZShTdHJpbmcgdmFsdWUpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9mb3JtL0lQcm9wZXJ0eVNlbGVjdGlvblJlbmRlcmVyLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZm9ybS9JUHJvcGVydHlTZWxlY3Rpb25SZW5kZXJlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzdjZjZjLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9mb3JtL0lQcm9wZXJ0eVNlbGVjdGlvblJlbmRlcmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5mb3JtOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JTWFya3VwV3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlcXVlc3RDeWNsZTsKLQotLyoqCi0gKiAgRGVmaW5lcyBhbiBvYmplY3QgdGhhdCB3b3JrcyB3aXRoIGEge0BsaW5rIFByb3BlcnR5U2VsZWN0aW9ufSBjb21wb25lbnQKLSAqICB0byByZW5kZXIgdGhlIGluZGl2aWR1YWwgZWxlbWVudHMgb2J0YWluZWQgZnJvbSB0aGUge0BsaW5rIElQcm9wZXJ0eVNlbGVjdGlvbk1vZGVsIG1vZGVsfS4KLSAqCi0gKiAgQHZlcnNpb24gJElkJAotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqCi0gKiovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSVByb3BlcnR5U2VsZWN0aW9uUmVuZGVyZXIKLXsKLSAgICAvKioKLSAgICAgKiAgQmVnaW5zIHRoZSByZW5kZXJpbmcgb2YgdGhlIHtAbGluayBQcm9wZXJ0eVNlbGVjdGlvbn0uCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCBiZWdpblJlbmRlcihQcm9wZXJ0eVNlbGVjdGlvbiBjb21wb25lbnQsIElNYXJrdXBXcml0ZXIgd3JpdGVyLCBJUmVxdWVzdEN5Y2xlIGN5Y2xlKTsKLQotICAgIC8qKgotICAgICAqICBJbnZva2VkIGZvciBlYWNoIGVsZW1lbnQgb2J0YWluZWQgZnJvbSB0aGUge0BsaW5rIElQcm9wZXJ0eVNlbGVjdGlvbk1vZGVsIG1vZGVsfS4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIHJlbmRlck9wdGlvbigKLSAgICAgICAgUHJvcGVydHlTZWxlY3Rpb24gY29tcG9uZW50LAotICAgICAgICBJTWFya3VwV3JpdGVyIHdyaXRlciwKLSAgICAgICAgSVJlcXVlc3RDeWNsZSBjeWNsZSwKLSAgICAgICAgSVByb3BlcnR5U2VsZWN0aW9uTW9kZWwgbW9kZWwsCi0gICAgICAgIE9iamVjdCBvcHRpb24sCi0gICAgICAgIGludCBpbmRleCwKLSAgICAgICAgYm9vbGVhbiBzZWxlY3RlZCk7Ci0KLSAgICAvKioKLSAgICAgKiAgRW5kcyB0aGUgcmVuZGVyaW5nIG9mIHRoZSB7QGxpbmsgUHJvcGVydHlTZWxlY3Rpb259LgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgZW5kUmVuZGVyKFByb3BlcnR5U2VsZWN0aW9uIGNvbXBvbmVudCwgSU1hcmt1cFdyaXRlciB3cml0ZXIsIElSZXF1ZXN0Q3ljbGUgY3ljbGUpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9mb3JtL0ltYWdlU3VibWl0LmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZm9ybS9JbWFnZVN1Ym1pdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTFhZTJmLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9mb3JtL0ltYWdlU3VibWl0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuZm9ybTsKLQotaW1wb3J0IGphdmEuYXd0LlBvaW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JQWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JQXNzZXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JQmluZGluZzsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklGb3JtOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSU1hcmt1cFdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZXF1ZXN0Q3ljbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5UYXBlc3RyeTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnJlcXVlc3QuUmVxdWVzdENvbnRleHQ7Ci0KLS8qKgotICogIFVzZWQgdG8gY3JlYXRlIGFuIGltYWdlIGJ1dHRvbiBpbnNpZGUgYSB7QGxpbmsgRm9ybX0uICBBbHRob3VnaCBpdAotICogIGlzIG9jY2FzaW9uYWxseSB1c2VmdWwgdG8ga25vdyB0aGUge0BsaW5rIFBvaW50fSBvbiB0aGUgaW1hZ2UgdGhhdCB3YXMgY2xpY2tlZAotICogIChpLmUuLCB1c2UgdGhlIGltYWdlIGFzIGEga2luZCBvZiBpbWFnZSBtYXAsIHdoaWNoIHdhcyB0aGUgb3JpZ2luYWwgaW50ZW50Ci0gKiAgb2YgdGhlIEhUTUwgZWxlbWVudCksIGl0IGlzIG1vcmUgY29tbW9ubHkgdXNlZCB0byBwcm92aWRlIGEgZ3JhcGhpYwotICogIGltYWdlIGZvciB0aGUgdXNlciB0byBjbGljaywgcmF0aGVyIHRoYW4gdGhlIHJhdGhlciBwbGFpbiAmbHQ7aW5wdXQgdHlwZT1zdWJtaXQmZ3Q7LgotICoKLSAqICBbPGEgaHJlZj0iLi4vLi4vLi4vLi4vLi4vQ29tcG9uZW50UmVmZXJlbmNlL0ltYWdlU3VibWl0Lmh0bWwiPkNvbXBvbmVudCBSZWZlcmVuY2U8L2E+XQotICoKLSAqCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogIEB2ZXJzaW9uICRJZCQKLSAqKi8KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEltYWdlU3VibWl0IGV4dGVuZHMgQWJzdHJhY3RGb3JtQ29tcG9uZW50Ci17Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgSUJpbmRpbmcgZ2V0UG9pbnRCaW5kaW5nKCk7Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgSUJpbmRpbmcgZ2V0U2VsZWN0ZWRCaW5kaW5nKCk7Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCByZW5kZXJDb21wb25lbnQoSU1hcmt1cFdyaXRlciB3cml0ZXIsIElSZXF1ZXN0Q3ljbGUgY3ljbGUpCi0gICAgewotICAgICAgICBJRm9ybSBmb3JtID0gZ2V0Rm9ybShjeWNsZSk7Ci0KLSAgICAgICAgYm9vbGVhbiByZXdpbmRpbmcgPSBmb3JtLmlzUmV3aW5kaW5nKCk7Ci0KLSAgICAgICAgU3RyaW5nIG5hbWVPdmVycmlkZSA9IGdldE5hbWVPdmVycmlkZSgpOwotCi0gICAgICAgIFN0cmluZyBuYW1lID0KLSAgICAgICAgICAgIG5hbWVPdmVycmlkZSA9PSBudWxsID8gZm9ybS5nZXRFbGVtZW50SWQodGhpcykgOiBmb3JtLmdldEVsZW1lbnRJZCh0aGlzLCBuYW1lT3ZlcnJpZGUpOwotCi0gICAgICAgIGlmIChyZXdpbmRpbmcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIElmIGRpc2FibGVkLCBkbyBub3RoaW5nLgotCi0gICAgICAgICAgICBpZiAoaXNEaXNhYmxlZCgpKQotICAgICAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAgICAgUmVxdWVzdENvbnRleHQgY29udGV4dCA9IGN5Y2xlLmdldFJlcXVlc3RDb250ZXh0KCk7Ci0KLSAgICAgICAgICAgIC8vIEltYWdlIGNsaWNrcyBnZXQgc3VibWl0dGVkIGFzIHR3byByZXF1ZXN0IHBhcmFtZXRlcnM6IAotICAgICAgICAgICAgLy8gZm9vLnggYW5kIGZvby55Ci0KLSAgICAgICAgICAgIFN0cmluZyBwYXJhbWV0ZXJOYW1lID0gbmFtZSArICIueCI7Ci0KLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IGNvbnRleHQuZ2V0UGFyYW1ldGVyKHBhcmFtZXRlck5hbWUpOwotCi0gICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgICAgIC8vIFRoZSBwb2ludCBwYXJhbWV0ZXIgaXMgbm90IHJlYWxseSB1c2VkLCB1bmxlc3MgdGhlCi0gICAgICAgICAgICAvLyBJbWFnZUJ1dHRvbiBpcyB1c2VkIGZvciBpdHMgb3JpZ2luYWwgcHVycG9zZSAoYXMgYSBraW5kCi0gICAgICAgICAgICAvLyBvZiBpbWFnZSBtYXApLiAgSW4gbW9kZXJuIHVzYWdlLCB3ZSBvbmx5IGNhcmUgYWJvdXQKLSAgICAgICAgICAgIC8vIHdoZXRoZXIgdGhlIHVzZXIgY2xpY2tlZCBvbiB0aGUgaW1hZ2UgKGFuZCB0aHVzIHN1Ym1pdHRlZAotICAgICAgICAgICAgLy8gdGhlIGZvcm0pLCBub3Qgd2hlcmUgaW4gdGhlIGltYWdlIHRoZSB1c2VyIGFjdHVhbGx5IGNsaWNrZWQuCi0KLSAgICAgICAgICAgIElCaW5kaW5nIHBvaW50QmluZGluZyA9IGdldFBvaW50QmluZGluZygpOwotCi0gICAgICAgICAgICBpZiAocG9pbnRCaW5kaW5nICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IHggPSBJbnRlZ2VyLnBhcnNlSW50KHZhbHVlKTsKLQotICAgICAgICAgICAgICAgIHBhcmFtZXRlck5hbWUgPSBuYW1lICsgIi55IjsKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IGNvbnRleHQuZ2V0UGFyYW1ldGVyKHBhcmFtZXRlck5hbWUpOwotCi0gICAgICAgICAgICAgICAgaW50IHkgPSBJbnRlZ2VyLnBhcnNlSW50KHZhbHVlKTsKLQotICAgICAgICAgICAgICAgIHBvaW50QmluZGluZy5zZXRPYmplY3QobmV3IFBvaW50KHgsIHkpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gTm90aWZ5IHRoZSBhcHBsaWNhdGlvbiwgYnkgc2V0dGluZyB0aGUgc2VsZWN0IHBhcmFtZXRlcgotICAgICAgICAgICAgLy8gdG8gdGhlIHRhZyBwYXJhbWV0ZXIuCi0KLSAgICAgICAgICAgIElCaW5kaW5nIHNlbGVjdGVkQmluZGluZyA9IGdldFNlbGVjdGVkQmluZGluZygpOwotCi0gICAgICAgICAgICBpZiAoc2VsZWN0ZWRCaW5kaW5nICE9IG51bGwpCi0gICAgICAgICAgICAgICAgc2VsZWN0ZWRCaW5kaW5nLnNldE9iamVjdChnZXRUYWcoKSk7Ci0KLSAgICAgICAgICAgIElBY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IGdldExpc3RlbmVyKCk7Ci0KLSAgICAgICAgICAgIGlmIChsaXN0ZW5lciAhPSBudWxsKQotICAgICAgICAgICAgICAgIGxpc3RlbmVyLmFjdGlvblRyaWdnZXJlZCh0aGlzLCBjeWNsZSk7Ci0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIE5vdCByZXdpbmRpbmcsIGRvIHRoZSByZWFsIHJlbmRlcgotCi0gICAgICAgIGJvb2xlYW4gZGlzYWJsZWQgPSBpc0Rpc2FibGVkKCk7Ci0gICAgICAgIElBc3NldCBkaXNhYmxlZEltYWdlID0gZ2V0RGlzYWJsZWRJbWFnZSgpOwotCi0gICAgICAgIElBc3NldCBmaW5hbEltYWdlID0gKGRpc2FibGVkICYmIGRpc2FibGVkSW1hZ2UgIT0gbnVsbCkgPyBkaXNhYmxlZEltYWdlIDogZ2V0SW1hZ2UoKTsKLQotICAgICAgICBTdHJpbmcgaW1hZ2VVUkwgPSBmaW5hbEltYWdlLmJ1aWxkVVJMKGN5Y2xlKTsKLQotICAgICAgICB3cml0ZXIuYmVnaW5FbXB0eSgiaW5wdXQiKTsKLSAgICAgICAgd3JpdGVyLmF0dHJpYnV0ZSgidHlwZSIsICJpbWFnZSIpOwotICAgICAgICB3cml0ZXIuYXR0cmlidXRlKCJuYW1lIiwgbmFtZSk7Ci0KLSAgICAgICAgaWYgKGRpc2FibGVkKQotICAgICAgICAgICAgd3JpdGVyLmF0dHJpYnV0ZSgiZGlzYWJsZWQiLCAiZGlzYWJsZWQiKTsKLQotICAgICAgICAvLyBOTjQgcGxhY2VzIGEgYm9yZGVyIHVubGVzcyB5b3UgdGVsbCBpdCBvdGhlcndpc2UuCi0gICAgICAgIC8vIElFIGlnbm9yZXMgdGhlIGJvcmRlciBhdHRyaWJ1dGUgYW5kIG5ldmVyIHNob3dzIGEgYm9yZGVyLgotCi0gICAgICAgIHdyaXRlci5hdHRyaWJ1dGUoImJvcmRlciIsIDApOwotCi0gICAgICAgIHdyaXRlci5hdHRyaWJ1dGUoInNyYyIsIGltYWdlVVJMKTsKLQotICAgICAgICByZW5kZXJJbmZvcm1hbFBhcmFtZXRlcnMod3JpdGVyLCBjeWNsZSk7Ci0KLSAgICAgICAgd3JpdGVyLmNsb3NlVGFnKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNEaXNhYmxlZCgpOwotCi0gICAgcHVibGljIGFic3RyYWN0IElBc3NldCBnZXREaXNhYmxlZEltYWdlKCk7Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgSUFzc2V0IGdldEltYWdlKCk7Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgSUFjdGlvbkxpc3RlbmVyIGdldExpc3RlbmVyKCk7Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgT2JqZWN0IGdldFRhZygpOwotCi0gICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXROYW1lT3ZlcnJpZGUoKTsKLQotICAgIHByb3RlY3RlZCB2b2lkIHByZXBhcmVGb3JSZW5kZXIoSVJlcXVlc3RDeWNsZSBjeWNsZSkKLSAgICB7Ci0gICAgICAgIHN1cGVyLnByZXBhcmVGb3JSZW5kZXIoY3ljbGUpOwotCi0gICAgICAgIGlmIChnZXRJbWFnZSgpID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBUYXBlc3RyeS5jcmVhdGVSZXF1aXJlZFBhcmFtZXRlckV4Y2VwdGlvbih0aGlzLCAiaW1hZ2UiKTsKLSAgICB9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZm9ybS9JbWFnZVN1Ym1pdC5qd2MgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZm9ybS9JbWFnZVN1Ym1pdC5qd2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmNWM4ZGUuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2Zvcm0vSW1hZ2VTdWJtaXQuandjCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICAKLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08IS0tICRJZCQgLS0+Ci08IURPQ1RZUEUgY29tcG9uZW50LXNwZWNpZmljYXRpb24gUFVCTElDIAotICAiLS8vQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24vL1RhcGVzdHJ5IFNwZWNpZmljYXRpb24gMy4wLy9FTiIgCi0gICJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL3RhcGVzdHJ5L2R0ZC9UYXBlc3RyeV8zXzAuZHRkIj4KLSAgCi08Y29tcG9uZW50LXNwZWNpZmljYXRpb24gY2xhc3M9Im9yZy5hcGFjaGUudGFwZXN0cnkuZm9ybS5JbWFnZVN1Ym1pdCIgYWxsb3ctYm9keT0ibm8iPgotCi0gIDxkZXNjcmlwdGlvbj4KLSAgQ3JlYXRlcyBhIGNsaWNrYWJsZSBpbWFnZSB3aXRoaW4gYSBmb3JtLgotICA8L2Rlc2NyaXB0aW9uPgotCi0gIDxwYXJhbWV0ZXIgbmFtZT0iaW1hZ2UiIAotICAJdHlwZT0ib3JnLmFwYWNoZS50YXBlc3RyeS5JQXNzZXQiIAotICAJcmVxdWlyZWQ9InllcyIKLSAgCWRpcmVjdGlvbj0iaW4iPgotICAJPGRlc2NyaXB0aW9uPgotICAJSW1hZ2UgdXNlZCBmb3IgdGhlIGJ1dHRvbi4KLSAgCTwvZGVzY3JpcHRpb24+Ci0gIDwvcGFyYW1ldGVyPgotICAJCi0gIDxwYXJhbWV0ZXIgbmFtZT0ibmFtZSIgCi0gICAgcHJvcGVydHktbmFtZT0ibmFtZU92ZXJyaWRlIgotICAJdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgCWRpcmVjdGlvbj0iaW4iLz4KLSAgCQotICA8cGFyYW1ldGVyIG5hbWU9ImRpc2FibGVkSW1hZ2UiIAotICAJdHlwZT0ib3JnLmFwYWNoZS50YXBlc3RyeS5JQXNzZXQiCi0gIAlkaXJlY3Rpb249ImluIj4KLSAgCTxkZXNjcmlwdGlvbj4KLSAgCUltYWdlIHVzZWQgZm9yIHRoZSBidXR0b24sIGlmIGRpc2FibGVkLgotICAJPC9kZXNjcmlwdGlvbj4KLSAgPC9wYXJhbWV0ZXI+Ci0gIAkKLSAgPHBhcmFtZXRlciBuYW1lPSJkaXNhYmxlZCIKLSAgCXR5cGU9ImJvb2xlYW4iCi0gIAlkaXJlY3Rpb249ImluIi8+Ci0gIAkKLSAgPHBhcmFtZXRlciBuYW1lPSJwb2ludCIgdHlwZT0iamF2YS5hd3QuUG9pbnQiLz4KLSAgCi0gIDxwYXJhbWV0ZXIgbmFtZT0ic2VsZWN0ZWQiCi0gIAl0eXBlPSJqYXZhLmxhbmcuT2JqZWN0Ij4KLSAgCTxkZXNjcmlwdGlvbj4KLSAgCVByb3BlcnR5IHVwZGF0ZWQgd2hlbiB0aGUgYnV0dG9uIGlzIGNsaWNrZWQuCi0gIAk8L2Rlc2NyaXB0aW9uPgotICA8L3BhcmFtZXRlcj4KLSAgCi0gIDxwYXJhbWV0ZXIgbmFtZT0idGFnIiAKLSAgCXR5cGU9ImphdmEubGFuZy5PYmplY3QiIAotICAJZGlyZWN0aW9uPSJpbiI+Ci0gIAk8ZGVzY3JpcHRpb24+Ci0gIAlWYWx1ZSB1c2VkIHdoZW4gdXBkYXRpbmcgdGhlIHNlbGVjdGVkIHBhcmFtZXRlci4KLSAgCTwvZGVzY3JpcHRpb24+Ci0gIDwvcGFyYW1ldGVyPgotICAKLSAgPHBhcmFtZXRlciBuYW1lPSJsaXN0ZW5lciIgCi0gIAl0eXBlPSJvcmcuYXBhY2hlLnRhcGVzdHJ5LklBY3Rpb25MaXN0ZW5lciIKLSAgCWRpcmVjdGlvbj0iaW4iPgotICAJPGRlc2NyaXB0aW9uPgotICAJTm90aWZpZWQgd2hlbiB0aGUgYnV0dG9uIGlzIGNsaWNrZWQuCi0gIAk8L2Rlc2NyaXB0aW9uPgotICA8L3BhcmFtZXRlcj4KLSAgCi0gIDxyZXNlcnZlZC1wYXJhbWV0ZXIgbmFtZT0idHlwZSIvPgotICA8cmVzZXJ2ZWQtcGFyYW1ldGVyIG5hbWU9InNyYyIvPgotICA8cmVzZXJ2ZWQtcGFyYW1ldGVyIG5hbWU9ImJvcmRlciIvPgotCi0gIDxwcm9wZXJ0eS1zcGVjaWZpY2F0aW9uIG5hbWU9Im5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KLSAgPHByb3BlcnR5LXNwZWNpZmljYXRpb24gbmFtZT0iZm9ybSIgdHlwZT0ib3JnLmFwYWNoZS50YXBlc3RyeS5JRm9ybSIvPgotIAotPC9jb21wb25lbnQtc3BlY2lmaWNhdGlvbj4KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9mb3JtL0xpbmtTdWJtaXQuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9mb3JtL0xpbmtTdWJtaXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ1ODYwYi4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZm9ybS9MaW5rU3VibWl0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuZm9ybTsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUFjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUJpbmRpbmc7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JRm9ybTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklNYXJrdXBXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVxdWVzdEN5Y2xlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuVGFwZXN0cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5odG1sLkJvZHk7Ci0KLS8qKgotICogIEltcGxlbWVudHMgYSBjb21wb25lbnQgdGhhdCBzdWJtaXRzIGl0cyBlbmNsb3NpbmcgZm9ybSB2aWEgYSBKYXZhU2NyaXB0IGxpbmsuCi0gKiAKLSAqICBbPGEgaHJlZj0iLi4vLi4vLi4vLi4vLi4vQ29tcG9uZW50UmVmZXJlbmNlL0xpbmtTdWJtaXQuaHRtbCI+Q29tcG9uZW50IFJlZmVyZW5jZTwvYT5dCi0gKgotICogIEBhdXRob3IgUmljaGFyZCBMZXdpcy1TaGVsbAotICogIEB2ZXJzaW9uICRJZDogU3VibWl0LmphdmEsdiAxLjYgMjAwMy8wNC8yMSAxMzoxNTo0MSBnbG9uZ21hbiBFeHAgJAotICogCi0gKiovCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBMaW5rU3VibWl0IGV4dGVuZHMgQWJzdHJhY3RGb3JtQ29tcG9uZW50Ci17Ci0gICAgLyoqCi0gICAgICogIFRoZSBuYW1lIG9mIGFuIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZXF1ZXN0Q3ljbGV9IGF0dHJpYnV0ZSBpbiB3aGljaCB0aGUKLSAgICAgKiAgY3VycmVudCBzdWJtaXQgbGluayBpcyBzdG9yZWQuICBMaW5rU3VibWl0cyBkbyBub3QgbmVzdC4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9OQU1FID0gIm9yZy5hcGFjaGUudGFwZXN0cnkuZm9ybS5MaW5rU3VibWl0IjsKLQotICAgIC8qKgotICAgICAqIFRoZSBuYW1lIG9mIGFuICB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVxdWVzdEN5Y2xlfSBhdHRyaWJ1dGUgaW4gd2hpY2ggdGhlCi0gICAgICogbGluayBzdWJtaXQgY29tcG9uZW50IHRoYXQgZ2VuZXJhdGVzIHRoZSBqYXZhc2NyaXB0IGZ1bmN0aW9uIGlzIHN0b3JlZC4gIFRoZQotICAgICAqIGZ1bmN0aW9uIGlzIG9ubHkgcmVxdWlyZWQgb25jZSBwZXIgcGFnZSAoY29udGFpbmluZyBhIGZvcm0gd2l0aCBhIG5vbi1kaXNhYmxlZAotICAgICAqIExpbmtTdWJtaXQpCi0gICAgICogCi0gICAgICoqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9GVU5DVElPTl9OQU1FID0KLSAgICAgICAgIm9yZy5hcGFjaGUudGFwZXN0cnkuZm9ybS5MaW5rU3VibWl0X2Z1bmN0aW9uIjsKLQotICAgIHByb3RlY3RlZCB2b2lkIHJlbmRlckNvbXBvbmVudChJTWFya3VwV3JpdGVyIHdyaXRlciwgSVJlcXVlc3RDeWNsZSBjeWNsZSkKLSAgICB7Ci0KLSAgICAgICAgSUZvcm0gZm9ybSA9IGdldEZvcm0oY3ljbGUpOwotICAgICAgICBTdHJpbmcgZm9ybU5hbWUgPSBmb3JtLmdldE5hbWUoKTsKLQotICAgICAgICBib29sZWFuIHJld2luZGluZyA9IGZvcm0uaXNSZXdpbmRpbmcoKTsKLQotICAgICAgICBTdHJpbmcgbmFtZSA9IGZvcm0uZ2V0RWxlbWVudElkKHRoaXMpOwotCi0gICAgICAgIElNYXJrdXBXcml0ZXIgd3JhcHBlZFdyaXRlcjsKLQotICAgICAgICBpZiAoY3ljbGUuZ2V0QXR0cmlidXRlKEFUVFJJQlVURV9OQU1FKSAhPSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICBUYXBlc3RyeS5nZXRNZXNzYWdlKCJMaW5rU3VibWl0Lm1heS1ub3QtbmVzdCIpLAotICAgICAgICAgICAgICAgIHRoaXMsCi0gICAgICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgICAgICBudWxsKTsKLQotICAgICAgICBjeWNsZS5zZXRBdHRyaWJ1dGUoQVRUUklCVVRFX05BTUUsIHRoaXMpOwotCi0gICAgICAgIGJvb2xlYW4gZGlzYWJsZWQgPSBpc0Rpc2FibGVkKCk7Ci0gICAgICAgIGlmICghZGlzYWJsZWQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghcmV3aW5kaW5nKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEJvZHkgYm9keSA9IEJvZHkuZ2V0KGN5Y2xlKTsKLQotCQkJCWlmIChib2R5ID09IG51bGwpCi0JCQkJICAgIHRocm93IG5ldyBBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24oCi0JCQkJICAgICAgICBUYXBlc3RyeS5mb3JtYXQoIm11c3QtYmUtY29udGFpbmVkLWJ5LWJvZHkiLCAiTGlua1N1Ym1pdCIpLAotCQkJCSAgICAgICAgdGhpcywKLQkJCQkgICAgICAgIG51bGwsCi0JCQkJICAgICAgICBudWxsKTsKLQkJCQkgICAgICAgIAkJCQkKLSAgICAgICAgICAgICAgICAvLyBtYWtlIHN1cmUgdGhlIHN1Ym1pdCBmdW5jdGlvbiBpcyBvbiB0aGUgcGFnZSAob25jZSkKLSAgICAgICAgICAgICAgICBpZiAoY3ljbGUuZ2V0QXR0cmlidXRlKEFUVFJJQlVURV9GVU5DVElPTl9OQU1FKSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYm9keS5hZGRCb2R5U2NyaXB0KAotICAgICAgICAgICAgICAgICAgICAgICAgImZ1bmN0aW9uIHN1Ym1pdExpbmsoZm9ybSwgZWxlbWVudElkKSB7IGZvcm0uX2xpbmtTdWJtaXQudmFsdWUgPSBlbGVtZW50SWQ7IGlmIChmb3JtLm9uc3VibWl0ID09IG51bGwgfHwgZm9ybS5vbnN1Ym1pdCgpKSBmb3JtLnN1Ym1pdCgpOyB9Iik7Ci0gICAgICAgICAgICAgICAgICAgIGN5Y2xlLnNldEF0dHJpYnV0ZShBVFRSSUJVVEVfRlVOQ1RJT05fTkFNRSwgdGhpcyk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gb25lIGhpZGRlbiBmaWVsZCBwZXIgZm9ybToKLSAgICAgICAgICAgICAgICBTdHJpbmcgZm9ybUhpZGRlbkZpZWxkQXR0cmlidXRlTmFtZSA9IEFUVFJJQlVURV9GVU5DVElPTl9OQU1FICsgZm9ybU5hbWU7Ci0gICAgICAgICAgICAgICAgaWYgKGN5Y2xlLmdldEF0dHJpYnV0ZShmb3JtSGlkZGVuRmllbGRBdHRyaWJ1dGVOYW1lKSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAJYm9keS5hZGRJbml0aWFsaXphdGlvblNjcmlwdCgiZG9jdW1lbnQuIiArIGZvcm1OYW1lICsgIi5fbGlua1N1Ym1pdC52YWx1ZSA9IG51bGw7Iik7IAotICAgICAgICAgICAgICAgICAgICB3cml0ZXIuYmVnaW5FbXB0eSgiaW5wdXQiKTsKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVyLmF0dHJpYnV0ZSgidHlwZSIsICJoaWRkZW4iKTsKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVyLmF0dHJpYnV0ZSgibmFtZSIsICJfbGlua1N1Ym1pdCIpOwotICAgICAgICAgICAgICAgICAgICBjeWNsZS5zZXRBdHRyaWJ1dGUoZm9ybUhpZGRlbkZpZWxkQXR0cmlidXRlTmFtZSwgdGhpcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIEhvdyB0byBrbm93IHdoaWNoIFN1Ym1pdCBsaW5rIHdhcyBhY3R1YWxseQotICAgICAgICAgICAgICAgIC8vIGNsaWNrZWQ/ICBXaGVuIHN1Ym1pdHRlZCwgaXQgc2V0cyBpdHMgZWxlbWVudElkIGludG8gYSBoaWRkZW4gZmllbGQKLQotICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IGN5Y2xlLmdldFJlcXVlc3RDb250ZXh0KCkuZ2V0UGFyYW1ldGVyKCJfbGlua1N1Ym1pdCIpOwotCi0gICAgICAgICAgICAgICAgLy8gSWYgdGhlIHZhbHVlIGlzbid0IHRoZSBlbGVtZW50SWQgb2YgdGhpcyBjb21wb25lbnQsIHRoZW4gdGhpcyBsaW5rIHdhc24ndAotICAgICAgICAgICAgICAgIC8vIHNlbGVjdGVkLgotCi0gICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUuZXF1YWxzKG5hbWUpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgSUJpbmRpbmcgc2VsZWN0ZWRCaW5kaW5nID0gZ2V0U2VsZWN0ZWRCaW5kaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZEJpbmRpbmcgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkQmluZGluZy5zZXRPYmplY3QoZ2V0VGFnKCkpOwotICAgICAgICAgICAgICAgICAgICBJQWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBnZXRMaXN0ZW5lcigpOwotICAgICAgICAgICAgICAgICAgICBpZiAobGlzdGVuZXIgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLmFjdGlvblRyaWdnZXJlZCh0aGlzLCBjeWNsZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB3cml0ZXIuYmVnaW4oImEiKTsKLSAgICAgICAgICAgIHdyaXRlci5hdHRyaWJ1dGUoCi0gICAgICAgICAgICAgICAgImhyZWYiLAotICAgICAgICAgICAgICAgICJqYXZhc2NyaXB0OnN1Ym1pdExpbmsoZG9jdW1lbnQuIiArIGZvcm1OYW1lICsgIixcIiIgKyBuYW1lICsgIlwiKTsiKTsKLQotICAgICAgICAgICAgLy8gQWxsb3cgdGhlIHdyYXBwZWQgY29tcG9uZW50cyBhIGNoYW5jZSB0byByZW5kZXIuCi0gICAgICAgICAgICAvLyBBbG9uZyB0aGUgd2F5LCB0aGV5IG1heSBpbnRlcmFjdCB3aXRoIHRoaXMgY29tcG9uZW50Ci0gICAgICAgICAgICAvLyBhbmQgY2F1c2UgdGhlIG5hbWUgdmFyaWFibGUgdG8gZ2V0IHNldC4KLQotICAgICAgICAgICAgd3JhcHBlZFdyaXRlciA9IHdyaXRlci5nZXROZXN0ZWRXcml0ZXIoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICB3cmFwcGVkV3JpdGVyID0gd3JpdGVyOwotCi0gICAgICAgIHJlbmRlckJvZHkod3JhcHBlZFdyaXRlciwgY3ljbGUpOwotCi0gICAgICAgIGlmICghZGlzYWJsZWQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIEdlbmVyYXRlIGFkZGl0aW9uYWwgYXR0cmlidXRlcyBmcm9tIGluZm9ybWFsIHBhcmFtZXRlcnMuCi0KLSAgICAgICAgICAgIHJlbmRlckluZm9ybWFsUGFyYW1ldGVycyh3cml0ZXIsIGN5Y2xlKTsKLQotICAgICAgICAgICAgLy8gRHVtcCBpbiBIVE1MIHByb3ZpZGVkIGJ5IHdyYXBwZWQgY29tcG9uZW50cwotCi0gICAgICAgICAgICB3cmFwcGVkV3JpdGVyLmNsb3NlKCk7Ci0KLSAgICAgICAgICAgIC8vIENsb3NlIHRoZSA8YT4gdGFnCi0KLSAgICAgICAgICAgIHdyaXRlci5lbmQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGN5Y2xlLnJlbW92ZUF0dHJpYnV0ZShBVFRSSUJVVEVfTkFNRSk7Ci0gICAgfQotCi0gICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNEaXNhYmxlZCgpOwotCi0gICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0RGlzYWJsZWQoYm9vbGVhbiBkaXNhYmxlZCk7Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgSUFjdGlvbkxpc3RlbmVyIGdldExpc3RlbmVyKCk7Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRMaXN0ZW5lcihJQWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0gICAgcHVibGljIGFic3RyYWN0IE9iamVjdCBnZXRUYWcoKTsKLQotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFRhZyhPYmplY3QgdGFnKTsKLQotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFNlbGVjdGVkQmluZGluZyhJQmluZGluZyB2YWx1ZSk7Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgSUJpbmRpbmcgZ2V0U2VsZWN0ZWRCaW5kaW5nKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9mb3JtL0xpbmtTdWJtaXQuandjIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2Zvcm0vTGlua1N1Ym1pdC5qd2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0MTQ1MmIuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2Zvcm0vTGlua1N1Ym1pdC5qd2MKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS0NCi0gICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0gIA0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIA0KLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIA0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08IS0tICRJZDogU3VibWl0Lmp3Yyx2IDEuMiAyMDAzLzAzLzE3IDE4OjEwOjQ4IGhsc2hpcCBFeHAgJCAtLT4NCi08IURPQ1RZUEUgY29tcG9uZW50LXNwZWNpZmljYXRpb24gUFVCTElDIA0KLSAgIi0vL0FwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLy9UYXBlc3RyeSBTcGVjaWZpY2F0aW9uIDMuMC8vRU4iIA0KLSAgImh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvdGFwZXN0cnkvZHRkL1RhcGVzdHJ5XzNfMC5kdGQiPg0KLQ0KLTxjb21wb25lbnQtc3BlY2lmaWNhdGlvbiBjbGFzcz0ib3JnLmFwYWNoZS50YXBlc3RyeS5mb3JtLkxpbmtTdWJtaXQiIGFsbG93LWJvZHk9InllcyI+DQotDQotICA8ZGVzY3JpcHRpb24+DQotICBDcmVhdGVzIGEgaHlwZXJsaW5rIHRoYXQgc3VibWl0cyBpdHMgZW5jbG9zaW5nIGZvcm0gdXNpbmcgSmF2YVNjcmlwdC4NCi0gIDwvZGVzY3JpcHRpb24+DQotDQotICA8cGFyYW1ldGVyIG5hbWU9Imxpc3RlbmVyIiANCi0gIAl0eXBlPSJvcmcuYXBhY2hlLnRhcGVzdHJ5LklBY3Rpb25MaXN0ZW5lciIgDQotICAJZGlyZWN0aW9uPSJpbiI+DQotICAJPGRlc2NyaXB0aW9uPg0KLQkgICAgVGhlIGxpc3RlbmVyIGlzIGludm9rZWQgZHVyaW5nIHRoZSByZXdpbmQgYXMgdGhlIGxpbmsgY29tcG9uZW50IGlzIGVuY291bnRlcmVkLiAgVGhpcyBpcw0KLQkgICAgYm90aCBhdHRyYWN0aXZlIGFuZCBkYW5nZXJvdXMgd2hlbiBjb21iaW5lZCB3aXRoIGEgZm9ybS4gIFdoZW4gdGhlIGxpc3RlbmVyIGlzDQotCSAgICBpbnZva2VkLCB0aGUgZm9ybSBoYXMgbm90IGNvbXBsZXRlbHkgcmV3b3VuZCwgc28gbm90IGFsbCBmb3JtIHZhbHVlcyBoYXZlIG5lY2Vzc2FyaWx5DQotCSAgICBiZWVuIHByb2Nlc3NlZCwgc28gdGhlIGxpc3RlbmVyIG1pZ2h0IGJlIHBlcmZvcm1pbmcgaXRzIGxvZ2ljIGJhc2VkIG9uIGluY29uc2lzdGVudA0KLQkgICAgZGF0YS4NCi0gIAk8L2Rlc2NyaXB0aW9uPg0KLSAgPC9wYXJhbWV0ZXI+DQotICAJDQotICA8cGFyYW1ldGVyIG5hbWU9ImRpc2FibGVkIiB0eXBlPSJib29sZWFuIiBkaXJlY3Rpb249ImluIi8+DQotICA8cGFyYW1ldGVyIG5hbWU9InNlbGVjdGVkIi8+DQotICA8cGFyYW1ldGVyIG5hbWU9InRhZyIgdHlwZT0iamF2YS5sYW5nLk9iamVjdCIgZGlyZWN0aW9uPSJpbiIvPg0KLQ0KLSAgPHJlc2VydmVkLXBhcmFtZXRlciBuYW1lPSJuYW1lIi8+DQotICA8cmVzZXJ2ZWQtcGFyYW1ldGVyIG5hbWU9ImhyZWYiLz4NCi0NCi0gIDxwcm9wZXJ0eS1zcGVjaWZpY2F0aW9uIG5hbWU9Im5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4NCi0gIDxwcm9wZXJ0eS1zcGVjaWZpY2F0aW9uIG5hbWU9ImZvcm0iIHR5cGU9Im9yZy5hcGFjaGUudGFwZXN0cnkuSUZvcm0iLz4gIA0KLSAgDQotPC9jb21wb25lbnQtc3BlY2lmaWNhdGlvbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZm9ybS9MaXN0RWRpdC5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2Zvcm0vTGlzdEVkaXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjIyMjc1Mi4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZm9ybS9MaXN0RWRpdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg0ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmZvcm07Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUFjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUJpbmRpbmc7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JRm9ybTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklNYXJrdXBXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVxdWVzdEN5Y2xlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuVGFwZXN0cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5yZXF1ZXN0LlJlcXVlc3RDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkudXRpbC5pby5EYXRhU3F1ZWV6ZXI7Ci0KLS8qKgotICogIEEgc3BlY2lhbGl6ZWQgY29tcG9uZW50IHVzZWQgdG8gZWRpdCBhIGxpc3Qgb2YgaXRlbXMKLSAqICB3aXRoaW4gYSBmb3JtOyBpdCBpcyBzaW1pbGFyIHRvIGEge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkuY29tcG9uZW50cy5Gb3JlYWNofSBidXQgbGV2ZXJhZ2VzCi0gKiAgaGlkZGVuIGlucHV0cyB3aXRoaW4gdGhlICZsdDtmb3JtJmd0OyB0byBzdG9yZSB0aGUgaXRlbXMgaW4gdGhlIGxpc3QuCi0gKgotICogIFs8YSBocmVmPSIuLi8uLi8uLi8uLi8uLi9Db21wb25lbnRSZWZlcmVuY2UvTGlzdEVkaXQuaHRtbCI+Q29tcG9uZW50IFJlZmVyZW5jZTwvYT5dCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQHNpbmNlIDEuMC4yCi0gKiAKLSAqKi8KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIExpc3RFZGl0IGV4dGVuZHMgQWJzdHJhY3RGb3JtQ29tcG9uZW50Ci17Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCByZW5kZXJDb21wb25lbnQoSU1hcmt1cFdyaXRlciB3cml0ZXIsIElSZXF1ZXN0Q3ljbGUgY3ljbGUpCi0gICAgewotICAgICAgICBJdGVyYXRvciBpID0gbnVsbDsKLQotICAgICAgICBJRm9ybSBmb3JtID0gZ2V0Rm9ybShjeWNsZSk7Ci0KLSAgICAgICAgYm9vbGVhbiBjeWNsZVJld2luZGluZyA9IGN5Y2xlLmlzUmV3aW5kaW5nKCk7Ci0KLSAgICAgICAgLy8gSWYgdGhlIGN5Y2xlIGlzIHJld2luZGluZywgYnV0IG5vdCB0aGlzIHBhcnRpY3VsYXIgZm9ybSwKLSAgICAgICAgLy8gdGhlbiBkbyBub3RoaW5nIChkb24ndCBldmVuIHJlbmRlciB0aGUgYm9keSkuCi0KLSAgICAgICAgaWYgKGN5Y2xlUmV3aW5kaW5nICYmICFmb3JtLmlzUmV3aW5kaW5nKCkpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgU3RyaW5nIG5hbWUgPSBmb3JtLmdldEVsZW1lbnRJZCh0aGlzKTsKLQotICAgICAgICBpZiAoIWN5Y2xlUmV3aW5kaW5nKQotICAgICAgICB7Ci0gICAgICAgICAgICBpID0gVGFwZXN0cnkuY29lcmNlVG9JdGVyYXRvcihnZXRTb3VyY2VCaW5kaW5nKCkuZ2V0T2JqZWN0KCkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgUmVxdWVzdENvbnRleHQgY29udGV4dCA9IGN5Y2xlLmdldFJlcXVlc3RDb250ZXh0KCk7Ci0gICAgICAgICAgICBTdHJpbmdbXSBzdWJtaXR0ZWRWYWx1ZXMgPSBjb250ZXh0LmdldFBhcmFtZXRlcnMobmFtZSk7Ci0KLSAgICAgICAgICAgIGkgPSBUYXBlc3RyeS5jb2VyY2VUb0l0ZXJhdG9yKHN1Ym1pdHRlZFZhbHVlcyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBJZiB0aGUgc291cmNlICh3aGVuIHJlbmRlcmluZyksIG9yIHRoZSBzdWJtaXR0ZWQgdmFsdWVzIChvbiBzdWJtaXQpCi0gICAgICAgIC8vIGFyZSBudWxsLCB0aGVuIHNraXAgdGhlIHJlbWFpbmRlciAobm90aGluZyB0byB1cGRhdGUsIG5vdGhpbmcgdG8KLSAgICAgICAgLy8gcmVuZGVyKS4KLQotICAgICAgICBpZiAoaSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIGludCBpbmRleCA9IDA7Ci0KLSAgICAgICAgSUJpbmRpbmcgaW5kZXhCaW5kaW5nID0gZ2V0SW5kZXhCaW5kaW5nKCk7Ci0gICAgICAgIElCaW5kaW5nIHZhbHVlQmluZGluZyA9IGdldFZhbHVlQmluZGluZygpOwotICAgICAgICBJQWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBnZXRMaXN0ZW5lcigpOwotICAgICAgICBTdHJpbmcgZWxlbWVudCA9IGdldEVsZW1lbnQoKTsKLQotICAgICAgICB3aGlsZSAoaS5oYXNOZXh0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IG51bGw7Ci0KLSAgICAgICAgICAgIGlmIChpbmRleEJpbmRpbmcgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBpbmRleEJpbmRpbmcuc2V0SW50KGluZGV4KyspOwotCi0gICAgICAgICAgICBpZiAoY3ljbGVSZXdpbmRpbmcpCi0gICAgICAgICAgICAgICAgdmFsdWUgPSBjb252ZXJ0VmFsdWUoKFN0cmluZykgaS5uZXh0KCkpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhbHVlID0gaS5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgd3JpdGVWYWx1ZShmb3JtLCBuYW1lLCB2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHZhbHVlQmluZGluZy5zZXRPYmplY3QodmFsdWUpOwotCi0gICAgICAgICAgICBpZiAobGlzdGVuZXIgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBsaXN0ZW5lci5hY3Rpb25UcmlnZ2VyZWQodGhpcywgY3ljbGUpOwotCi0gICAgICAgICAgICBpZiAoZWxlbWVudCAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHdyaXRlci5iZWdpbihlbGVtZW50KTsKLSAgICAgICAgICAgICAgICByZW5kZXJJbmZvcm1hbFBhcmFtZXRlcnMod3JpdGVyLCBjeWNsZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJlbmRlckJvZHkod3JpdGVyLCBjeWNsZSk7Ci0KLSAgICAgICAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgd3JpdGVyLmVuZCgpOwotCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgd3JpdGVWYWx1ZShJRm9ybSBmb3JtLCBTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKQotICAgIHsKLSAgICAgICAgU3RyaW5nIGV4dGVybmFsVmFsdWU7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGV4dGVybmFsVmFsdWUgPSBnZXREYXRhU3F1ZWV6ZXIoKS5zcXVlZXplKHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZXgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgVGFwZXN0cnkuZm9ybWF0KCJMaXN0RWRpdC51bmFibGUtdG8tY29udmVydC12YWx1ZSIsIHZhbHVlKSwKLSAgICAgICAgICAgICAgICB0aGlzLAotICAgICAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAgICAgZXgpOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9ybS5hZGRIaWRkZW5WYWx1ZShuYW1lLCBleHRlcm5hbFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE9iamVjdCBjb252ZXJ0VmFsdWUoU3RyaW5nIHZhbHVlKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBnZXREYXRhU3F1ZWV6ZXIoKS51bnNxdWVlemUodmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBleCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICBUYXBlc3RyeS5mb3JtYXQoIkxpc3RFZGl0LnVuYWJsZS10by1jb252ZXJ0LXN0cmluZyIsIHZhbHVlKSwKLSAgICAgICAgICAgICAgICB0aGlzLAotICAgICAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAgICAgZXgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRFbGVtZW50KCk7Ci0KLSAgICBwcml2YXRlIERhdGFTcXVlZXplciBnZXREYXRhU3F1ZWV6ZXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldFBhZ2UoKS5nZXRFbmdpbmUoKS5nZXREYXRhU3F1ZWV6ZXIoKTsKLSAgICB9Ci0KLSAgICAvKiogQHNpbmNlIDIuMiAqKi8KLQotICAgIHB1YmxpYyBhYnN0cmFjdCBJQWN0aW9uTGlzdGVuZXIgZ2V0TGlzdGVuZXIoKTsKLQotICAgIC8qKiBAc2luY2UgMy4wICoqLwotCi0gICAgcHVibGljIGFic3RyYWN0IElCaW5kaW5nIGdldFNvdXJjZUJpbmRpbmcoKTsKLQotICAgIHB1YmxpYyBhYnN0cmFjdCBJQmluZGluZyBnZXRWYWx1ZUJpbmRpbmcoKTsKLQotICAgIHB1YmxpYyBhYnN0cmFjdCBJQmluZGluZyBnZXRJbmRleEJpbmRpbmcoKTsKLQotICAgIC8qKiBAc2luY2UgMy4wICoqLwotCi0gICAgcHVibGljIGJvb2xlYW4gaXNEaXNhYmxlZCgpCi0gICAgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2Zvcm0vTGlzdEVkaXQuandjIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2Zvcm0vTGlzdEVkaXQuandjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTAzYzQzLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9mb3JtL0xpc3RFZGl0Lmp3YworKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAgCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPCEtLSAkSWQkIC0tPgotPCFET0NUWVBFIGNvbXBvbmVudC1zcGVjaWZpY2F0aW9uIFBVQkxJQyAKLSAgIi0vL0FwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLy9UYXBlc3RyeSBTcGVjaWZpY2F0aW9uIDMuMC8vRU4iIAotICAiaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy90YXBlc3RyeS9kdGQvVGFwZXN0cnlfM18wLmR0ZCI+Ci0gIAotPGNvbXBvbmVudC1zcGVjaWZpY2F0aW9uIGFsbG93LWJvZHk9InllcyIgYWxsb3ctaW5mb3JtYWwtcGFyYW1ldGVycz0ieWVzIgotCWNsYXNzPSJvcmcuYXBhY2hlLnRhcGVzdHJ5LmZvcm0uTGlzdEVkaXQiPgotCQotICA8ZGVzY3JpcHRpb24+Ci0gIEEgbG9vcGluZyBjb21wb25lbnQsIGxpa2UgRm9yZWFjaCwgd2hpY2ggd29ya3Mgd2VsbCBpbiBhIGZvcm0KLSAgYmVjYXVzZSBpdCBzdG9yZXMgZWFjaCBlbGVtZW50IGFzIGEgaGlkZGVuIGZpZWxkLgotICA8L2Rlc2NyaXB0aW9uPgotCQotICA8cGFyYW1ldGVyIG5hbWU9InNvdXJjZSIgcmVxdWlyZWQ9InllcyIgdHlwZT0iamF2YS5sYW5nLk9iamVjdCIvPgotICAKLSAgPHBhcmFtZXRlciBuYW1lPSJsaXN0ZW5lciIgdHlwZT0ib3JnLmFwYWNoZS50YXBlc3RyeS5JQWN0aW9uTGlzdGVuZXIiIGRpcmVjdGlvbj0iaW4iLz4KLSAgCi0gIDxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHJlcXVpcmVkPSJ5ZXMiIHR5cGU9ImphdmEubGFuZy5PYmplY3QiLz4KLSAgCi0gIDxwYXJhbWV0ZXIgbmFtZT0iaW5kZXgiIHR5cGU9ImludCIvPgotICAKLSAgPHBhcmFtZXRlciBuYW1lPSJlbGVtZW50IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIiBkaXJlY3Rpb249ImluIi8+Ci0KLSAgPHByb3BlcnR5LXNwZWNpZmljYXRpb24gbmFtZT0ibmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgotICA8cHJvcGVydHktc3BlY2lmaWNhdGlvbiBuYW1lPSJmb3JtIiB0eXBlPSJvcmcuYXBhY2hlLnRhcGVzdHJ5LklGb3JtIi8+Ci0gIAotPC9jb21wb25lbnQtc3BlY2lmaWNhdGlvbj4KLQotCmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZm9ybS9MaXN0RWRpdE1hcC5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2Zvcm0vTGlzdEVkaXRNYXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJlZmE3MS4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZm9ybS9MaXN0RWRpdE1hcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcxICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmZvcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LlRhcGVzdHJ5OwotCi0vKioKLSAqIEEgdXRpbGl0eSBjbGFzcyBvZnRlbiB1c2VkIHdpdGggdGhlIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LmZvcm0uTGlzdEVkaXR9Y29tcG9uZW50LiBBCi0gKiBMaXN0RWRpdE1hcCBpcyBsb2FkZWQgd2l0aCBkYXRhIG9iamVjdHMgYmVmb3JlIHRoZSBMaXN0RWRpdCByZW5kZXJzLCBhbmQgYWdhaW4gYmVmb3JlIHRoZQotICogTGlzdEVkaXQgcmV3aW5kcy4gVGhpcyBzdHJlYW1saW5lcyB0aGUgc3luY2hyb25pemF0aW9uIG9mIHRoZSBmb3JtIGFnYWluc3QgZGF0YSBvbiB0aGUgc2VydmVyLiBJdAotICogaXMgbW9zdCB1c2VmdWwgd2hlbiB0aGUgc2V0IG9mIG9iamVjdHMgaXMgb2YgYSBtYW5hZ2VhYmxlIHNpemUgKHNheSwgbm8gbW9yZSB0aGFuIGEgZmV3IGh1bmRyZWQKLSAqIG9iamVjdHMpLgotICogPHA+Ci0gKiBUaGUgbWFwIHN0b3JlcyBhIGxpc3Qgb2Yga2V5cywgYW5kIHJlbGF0ZXMgZWFjaCBrZXkgdG8gYSB2YWx1ZS4gSXQgYWxzbyB0cmFja3MgYSBkZWxldGVkIGZsYWcgZm9yCi0gKiBlYWNoIGtleS4KLSAqIDxwPgotICogVXNhZ2U6IDxicj4KLSAqIFRoZSBwYWdlIG9yIGNvbXBvbmVudCBzaG91bGQgaW1wbGVtZW50IHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LmV2ZW50LlBhZ2VSZW5kZXJMaXN0ZW5lcn1hbmQKLSAqIGltcGxlbWVudAotICoge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkuZXZlbnQuUGFnZVJlbmRlckxpc3RlbmVyI3BhZ2VCZWdpblJlbmRlcihvcmcuYXBhY2hlLnRhcGVzdHJ5LmV2ZW50LlBhZ2VFdmVudCl9Ci0gKiB0byBpbml0aWFsaXplIHRoZSBtYXAuCi0gKiA8cD4KLSAqIFRoZSBleHRlcm5hbCBkYXRhIChmcm9tIHdoaWNoIGtleXMgYW5kIHZhbHVlcyBhcmUgb2J0YWluZWQpIGlzIHF1ZXJpZWQsIGFuZCBlYWNoIGtleS92YWx1ZSBwYWlyCi0gKiBpcyB7QGxpbmsgI2FkZChPYmplY3QsIE9iamVjdCkgYWRkZWR9dG8gdGhlIG1hcCwgaW4gdGhlIG9yZGVyIHRoYXQgaXRlbXMgc2hvdWxkIGJlIHByZXNlbnRlZC4KLSAqIDxwPgotICogVGhlIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LmZvcm0uTGlzdEVkaXR9J3Mgc291cmNlIHBhcmFtZXRlciBzaG91bGQgYmUgYm91bmQgdG8gdGhlIG1hcCdzCi0gKiB7QGxpbmsgI2dldEtleXMoKSBrZXlzfXByb3BlcnR5LiBUaGUgdmFsdWUgcGFyYW1ldGVyIHNob3VsZCBiZSBib3VuZCB0byB0aGUgbWFwJ3MKLSAqIHtAbGluayAjc2V0S2V5KE9iamVjdCkga2V5fXByb3BlcnR5LgotICogPHA+Ci0gKiBUaGUge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkuZm9ybS5MaXN0RWRpdH0ncyBsaXN0ZW5lciBwYXJhbWV0ZXIgc2hvdWxkIGJlIGJvdW5kIHRvIGEgbGlzdGVuZXIKLSAqIG1ldGhvZCB0byBzeW5jaHJvbml6ZSBhIHByb3BlcnR5IG9mIHRoZSBjb21wb25lbnQgZnJvbSB0aGUgbWFwLgotICogCi0gKiA8cHJlPjxjb2RlPgotICogCi0gKiAgCi0gKiAgIAotICogICAgIHB1YmxpYyB2b2lkIHN5bmNocm9uaXplKHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZXF1ZXN0Q3ljbGV9IGN5Y2xlKQotICogICAgIHsKLSAqICAgICAgICBMaXN0RWRpdE1hcCBtYXAgPSAuLi47Ci0gKiAgICAgICAgJmx0O2kmZ3Q7VHlwZSZsdDsvaSZndDsgb2JqZWN0ID0gKCZsdDtpJmd0O1R5cGUmbHQ7L2kmZ3Q7KW1hcC5nZXRWYWx1ZSgpOwotICogICAgCi0gKiAgICAgICAgaWYgKG9iamVjdCA9PSBudWxsKQotICogICAgICAgICAgLi4uCi0gKiAgICAKLSAqICAgICAgICBzZXQmbHQ7aSZndDtQcm9wZXJ0eSZsdDsvaSZndDsob2JqZWN0KTsKLSAqICAgICB9Ci0gKiAgICAgCi0gKiAgIAotICogIAotICogPC9jb2RlPjwvcHJlPgotICogCi0gKiA8cD4KLSAqIFlvdSBtYXkgYWxzbyBjb25uZWN0IGEge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkuZm9ybS5DaGVja2JveH0ncyBzZWxlY3RlZCBwYXJhbWV0ZXIgdG8gdGhlCi0gKiBtYXAncyB7QGxpbmsgI2lzRGVsZXRlZCgpIGRlbGV0ZWR9cHJvcGVydHkuCi0gKiA8cD4KLSAqIFlvdSBtYXkgdHJhY2sgaW5jbHVzaW9uIGluIG90aGVyIHNldHMgYnkgc3ViY2xhc3NlcyBhbmQgaW1wbGVtZW50aW5nIG5ldyBib29sZWFuIHByb3BlcnRpZXMuIFRoZQotICogYWNjZXNzb3IgbWV0aG9kIHNob3VsZCBiZSBhIGNhbGwgdG8ge0BsaW5rICNjaGVja1NldChTZXQpfWFuZCB0aGUgbXV0YXRvciBtZXRob2Qgc2hvdWxkIGJlIGEKLSAqIGNhbGwgdG8ge0BsaW5rICN1cGRhdGVTZXQoU2V0LCBib29sZWFuKX0uCi0gKiAKLSAqIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqIEBzaW5jZSAzLjAKLSAqLwotCi1wdWJsaWMgY2xhc3MgTGlzdEVkaXRNYXAKLXsKLSAgICBwcml2YXRlIE1hcCBfbWFwID0gbmV3IEhhc2hNYXAoKTsKLQotICAgIHByaXZhdGUgTGlzdCBfa2V5cyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgIHByaXZhdGUgU2V0IF9kZWxldGVkS2V5czsKLQotICAgIHByaXZhdGUgT2JqZWN0IF9jdXJyZW50S2V5OwotCi0gICAgLyoqCi0gICAgICogUmVjb3JkcyB0aGUga2V5IGFuZCB2YWx1ZSBpbnRvIHRoaXMgbWFwLiBUaGUga2V5cyBtYXkgYmUgb2J0YWluZWQsIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5Ci0gICAgICogYXJlIGFkZGVkLCB1c2luZyB7QGxpbmsgI2dldEtleXMoKX0uIFRoaXMgYWxzbyBzZXRzIHRoZSBjdXJyZW50IGtleSAoc28gdGhhdCB5b3UgbWF5IGludm9rZQotICAgICAqIHtAbGluayAjc2V0RGVsZXRlZChib29sZWFuKX0sIGZvciBleGFtcGxlKS4KLSAgICAgKi8KLQotICAgIHB1YmxpYyB2b2lkIGFkZChPYmplY3Qga2V5LCBPYmplY3QgdmFsdWUpCi0gICAgewotICAgICAgICBfY3VycmVudEtleSA9IGtleTsKLQotICAgICAgICBfa2V5cy5hZGQoX2N1cnJlbnRLZXkpOwotICAgICAgICBfbWFwLnB1dChfY3VycmVudEtleSwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBMaXN0IG9mIGtleXMsIGluIHRoZSBvcmRlciB0aGF0IGtleXMgd2VyZSBhZGRlZCB0byB0aGUgbWFwICh1c2luZwotICAgICAqIHtAbGluayAjYWRkKE9iamVjdCwgT2JqZWN0KX0uIFRoZSBjYWxsZXIgbXVzdCBub3QgbW9kaWZ5IHRoZSBMaXN0LgotICAgICAqLwotCi0gICAgcHVibGljIExpc3QgZ2V0S2V5cygpCi0gICAgewotICAgICAgICByZXR1cm4gX2tleXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUga2V5IGZvciB0aGUgbWFwLiBUaGlzIGRlZmluZXMgdGhlIGtleSB1c2VkIHdpdGggdGhlIG90aGVyIG1ldGhvZHM6Ci0gICAgICoge0BsaW5rICNnZXRWYWx1ZSgpfSx7QGxpbmsgI2lzRGVsZXRlZCgpfSx7QGxpbmsgI3NldERlbGV0ZWQoYm9vbGVhbil9LgotICAgICAqLwotCi0gICAgcHVibGljIHZvaWQgc2V0S2V5KE9iamVjdCBrZXkpCi0gICAgewotICAgICAgICBfY3VycmVudEtleSA9IGtleTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGtleSB3aXRoaW4gdGhlIG1hcC4KLSAgICAgKi8KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0S2V5KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfY3VycmVudEtleTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBmb3IgdGhlIGtleSAoc2V0IHVzaW5nIHtAbGluayAjc2V0S2V5KE9iamVjdCl9KS4gTWF5IHJldHVybiBudWxsIGlmIG5vCi0gICAgICogc3VjaCBrZXkgaGFzIGJlZW4gYWRkZWQgKHRoaXMgY2FuIG9jY3VyIGlmIGEgZGF0YSBvYmplY3QgaXMgZGVsZXRlZCBiZXR3ZWVuIHRoZSB0aW1lIGEgZm9ybQotICAgICAqIGlzIHJlbmRlcmVkIGFuZCB0aGUgdGltZSBhIGZvcm0gaXMgc3VibWl0dGVkKS4KLSAgICAgKi8KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9tYXAuZ2V0KF9jdXJyZW50S2V5KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHtAbGluayAjc2V0S2V5KE9iamVjdCkgY3VycmVudCBrZXl9aXMgaW4gdGhlIHNldCBvZiBkZWxldGVkIGtleXMuCi0gICAgICovCi0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0RlbGV0ZWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGNoZWNrU2V0KF9kZWxldGVkS2V5cyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzZXQgY29udGFpbnMgdGhlIHtAbGluayAjZ2V0S2V5KCkgY3VycmVudCBrZXl9LiBSZXR1cm5zIGZhbHNlIGlzIHRoZSBzZXQKLSAgICAgKiBpcyBudWxsLCBvciBkb2Vzbid0IGNvbnRhaW4gdGhlIGN1cnJlbnQga2V5LgotICAgICAqLwotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gY2hlY2tTZXQoU2V0IHNldCkKLSAgICB7Ci0gICAgICAgIGlmIChzZXQgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICByZXR1cm4gc2V0LmNvbnRhaW5zKF9jdXJyZW50S2V5KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIG9yIHJlbW92ZXMgdGhlIHtAbGluayAjc2V0S2V5KE9iamVjdCkgY3VycmVudCBrZXl9ZnJvbSB0aGUgc2V0IG9mIGRlbGV0ZWQga2V5cy4KLSAgICAgKi8KLQotICAgIHB1YmxpYyB2b2lkIHNldERlbGV0ZWQoYm9vbGVhbiB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIF9kZWxldGVkS2V5cyA9IHVwZGF0ZVNldChfZGVsZXRlZEtleXMsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVcGRhdGVzIHRoZSBzZXQsIGFkZGluZyBvciByZW1vdmluZyB0aGUge0BsaW5rICNnZXRLZXkoKSBjdXJyZW50IGtleX1mcm9tIGl0LiBSZXR1cm5zIHRoZQotICAgICAqIHNldCBwYXNzZWQgaW4uIElmIHRoZSB2YWx1ZSBpcyB0cnVlIGFuZCB0aGUgc2V0IGlzIG51bGwsIGFuIG5ldyBpbnN0YW5jZSBvZiB7QGxpbmsgSGFzaFNldH0KLSAgICAgKiBpcyBjcmVhdGVkIGFuZCByZXR1cm5lZC4KLSAgICAgKi8KLQotICAgIHByb3RlY3RlZCBTZXQgdXBkYXRlU2V0KFNldCBzZXQsIGJvb2xlYW4gdmFsdWUpCi0gICAgewotICAgICAgICBpZiAodmFsdWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzZXQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICBzZXQgPSBuZXcgSGFzaFNldCgpOwotCi0gICAgICAgICAgICBzZXQuYWRkKF9jdXJyZW50S2V5KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzZXQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBzZXQucmVtb3ZlKF9jdXJyZW50S2V5KTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzZXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZGVsZXRlZCBrZXlzIGluIGFuIHVuc3BlY2lmaWVkIG9yZGVyLiBNYXkgcmV0dXJuIGFuIGVtcHR5IGxpc3QuCi0gICAgICovCi0KLSAgICBwdWJsaWMgTGlzdCBnZXREZWxldGVkS2V5cygpCi0gICAgewotICAgICAgICByZXR1cm4gY29udmVydFNldFRvTGlzdChfZGVsZXRlZEtleXMpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBMaXN0IGNvbnZlcnRTZXRUb0xpc3QoU2V0IHNldCkKLSAgICB7Ci0gICAgICAgIGlmIChUYXBlc3RyeS5pc0VtcHR5KHNldCkpCi0gICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQotICAgICAgICByZXR1cm4gbmV3IEFycmF5TGlzdChzZXQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYWxsIHRoZSB2YWx1ZXMgc3RvcmVkIGluIHRoZSBtYXAsIGluIHRoZSBvcmRlciBpbiB3aGljaCB2YWx1ZXMgd2VyZSBhZGRlZCB0byB0aGUgbWFwCi0gICAgICogdXNpbmcge0BsaW5rICNhZGQoT2JqZWN0LCBPYmplY3QpfS4KLSAgICAgKi8KLQotICAgIHB1YmxpYyBMaXN0IGdldEFsbFZhbHVlcygpCi0gICAgewotICAgICAgICBpbnQgY291bnQgPSBfa2V5cy5zaXplKCk7Ci0gICAgICAgIExpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdChjb3VudCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBPYmplY3Qga2V5ID0gX2tleXMuZ2V0KGkpOwotICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gX21hcC5nZXQoa2V5KTsKLQotICAgICAgICAgICAgcmVzdWx0LmFkZCh2YWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYWxsIHRoZSB2YWx1ZXMgc3RvcmVkIGluIHRoZSBtYXAsIGV4Y2x1ZGluZyB0aG9zZSB3aG9zZSBpZCBoYXMgYmVlbiBtYXJrZWQgZGVsZXRlZCwKLSAgICAgKiBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdmFsdWVzIHdlcmUgYWRkZWQgdG8gdGhlIG1hcCB1c2luZyB7QGxpbmsgI2FkZChPYmplY3QsIE9iamVjdCl9LgotICAgICAqLwotCi0gICAgcHVibGljIExpc3QgZ2V0VmFsdWVzKCkKLSAgICB7Ci0gICAgICAgIGludCBkZWxldGVkQ291bnQgPSBUYXBlc3RyeS5zaXplKF9kZWxldGVkS2V5cyk7Ci0KLSAgICAgICAgaWYgKGRlbGV0ZWRDb3VudCA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIGdldEFsbFZhbHVlcygpOwotCi0gICAgICAgIGludCBjb3VudCA9IF9rZXlzLnNpemUoKTsKLQotICAgICAgICBMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoY291bnQgLSBkZWxldGVkQ291bnQpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgT2JqZWN0IGtleSA9IF9rZXlzLmdldChpKTsKLQotICAgICAgICAgICAgaWYgKF9kZWxldGVkS2V5cy5jb250YWlucyhrZXkpKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBfbWFwLmdldChrZXkpOwotICAgICAgICAgICAgcmVzdWx0LmFkZCh2YWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9mb3JtL09wdGlvbi5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2Zvcm0vT3B0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5NTllM2UuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2Zvcm0vT3B0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5mb3JtOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5BYnN0cmFjdENvbXBvbmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LkFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklCaW5kaW5nOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSU1hcmt1cFdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZXF1ZXN0Q3ljbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5UYXBlc3RyeTsKLQotLyoqCi0gKiAgQSBjb21wb25lbnQgdGhhdCByZW5kZXJzIGFuIEhUTUwgJmx0O29wdGlvbiZndDsgZm9ybSBlbGVtZW50LgotICogIFN1Y2ggYSBjb21wb25lbnQgbXVzdCBiZSB3cmFwcGVkIChwb3NzaWJseSBpbmRpcmVjdGx5KQotICogIGluc2lkZSBhIHtAbGluayBTZWxlY3R9IGNvbXBvbmVudC4KLSAqCi0gKiAgWzxhIGhyZWY9Ii4uLy4uLy4uLy4uLy4uL0NvbXBvbmVudFJlZmVyZW5jZS9PcHRpb24uaHRtbCI+Q29tcG9uZW50IFJlZmVyZW5jZTwvYT5dCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAKLSAqKi8KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIE9wdGlvbiBleHRlbmRzIEFic3RyYWN0Q29tcG9uZW50Ci17Ci0gICAgLyoqCi0gICAgICogIFJlbmRlcnMgdGhlICZsdDtvcHRpb24mZ3Q7IGVsZW1lbnQsIG9yIHJlc3BvbmRzIHdoZW4gdGhlIGZvcm0gY29udGFpbmluZyB0aGUgZWxlbWVudCAKLSAgICAgKiAgaXMgc3VibWl0dGVkIChieSBjaGVja2luZyB7QGxpbmsgRm9ybSNpc1Jld2luZGluZygpfS4KLSAgICAgKgotICAgICAqICA8cD5JZiB0aGUgPGNvZGU+bGFiZWw8L2NvZGU+IHByb3BlcnR5IGlzIHNldCwgaXQgaXMgaW5zZXJ0ZWQgaW5zaWRlIHRoZQotICAgICAqICAmbHQ7b3B0aW9uJmd0OyBlbGVtZW50LgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVuZGVyQ29tcG9uZW50KElNYXJrdXBXcml0ZXIgd3JpdGVyLCBJUmVxdWVzdEN5Y2xlIGN5Y2xlKQotICAgIHsKLSAgICAgICAgU2VsZWN0IHNlbGVjdCA9IFNlbGVjdC5nZXQoY3ljbGUpOwotICAgICAgICBpZiAoc2VsZWN0ID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIFRhcGVzdHJ5LmdldE1lc3NhZ2UoIk9wdGlvbi5tdXN0LWJlLWNvbnRhaW5lZC1ieS1zZWxlY3QiKSwKLSAgICAgICAgICAgICAgICB0aGlzLAotICAgICAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAgICAgbnVsbCk7Ci0KLSAgICAgICAgLy8gSXQgaXNuJ3QgZW5vdWdoIHRvIGtub3cgd2hldGhlciB0aGUgY3ljbGUgaW4gZ2VuZXJhbCBpcyByZXdpbmRpbmcsIG5lZWQgdG8ga25vdwotICAgICAgICAvLyBzcGVjaWZpY2FsbHkgaWYgdGhlIGZvcm0gd2hpY2ggY29udGFpbnMgdGhpcyBjb21wb25lbnQgaXMgcmV3aW5kaW5nLgotCi0gICAgICAgIGJvb2xlYW4gcmV3aW5kaW5nID0gc2VsZWN0LmlzUmV3aW5kaW5nKCk7Ci0KLSAgICAgICAgU3RyaW5nIHZhbHVlID0gc2VsZWN0LmdldE5leHRPcHRpb25JZCgpOwotCi0gICAgICAgIGlmIChyZXdpbmRpbmcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghc2VsZWN0LmlzRGlzYWJsZWQoKSkKLSAgICAgICAgICAgICAgICBnZXRTZWxlY3RlZEJpbmRpbmcoKS5zZXRCb29sZWFuKHNlbGVjdC5pc1NlbGVjdGVkKHZhbHVlKSk7Ci0KLSAgICAgICAgICAgIHJlbmRlckJvZHkod3JpdGVyLCBjeWNsZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB3cml0ZXIuYmVnaW4oIm9wdGlvbiIpOwotCi0gICAgICAgICAgICB3cml0ZXIuYXR0cmlidXRlKCJ2YWx1ZSIsIHZhbHVlKTsKLQotICAgICAgICAgICAgaWYgKGdldFNlbGVjdGVkQmluZGluZygpLmdldEJvb2xlYW4oKSkKLSAgICAgICAgICAgICAgICB3cml0ZXIuYXR0cmlidXRlKCJzZWxlY3RlZCIsICJzZWxlY3RlZCIpOwotCi0gICAgICAgICAgICByZW5kZXJJbmZvcm1hbFBhcmFtZXRlcnMod3JpdGVyLCBjeWNsZSk7Ci0KLSAgICAgICAgICAgIFN0cmluZyBsYWJlbCA9IGdldExhYmVsKCk7Ci0KLSAgICAgICAgICAgIGlmIChsYWJlbCAhPSBudWxsKQotICAgICAgICAgICAgICAgIHdyaXRlci5wcmludChsYWJlbCk7Ci0KLSAgICAgICAgICAgIHJlbmRlckJvZHkod3JpdGVyLCBjeWNsZSk7Ci0KLSAgICAgICAgICAgIHdyaXRlci5lbmQoKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHVibGljIGFic3RyYWN0IElCaW5kaW5nIGdldFNlbGVjdGVkQmluZGluZygpOwotCi0gICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRMYWJlbCgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9mb3JtL09wdGlvbi5qd2MgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZm9ybS9PcHRpb24uandjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjA0MGU0Li4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9mb3JtL09wdGlvbi5qd2MKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gIAotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTwhLS0gJElkJCAtLT4KLTwhRE9DVFlQRSBjb21wb25lbnQtc3BlY2lmaWNhdGlvbiBQVUJMSUMgCi0gICItLy9BcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi8vVGFwZXN0cnkgU3BlY2lmaWNhdGlvbiAzLjAvL0VOIiAKLSAgImh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvdGFwZXN0cnkvZHRkL1RhcGVzdHJ5XzNfMC5kdGQiPgotCQotPGNvbXBvbmVudC1zcGVjaWZpY2F0aW9uIGNsYXNzPSJvcmcuYXBhY2hlLnRhcGVzdHJ5LmZvcm0uT3B0aW9uIiBhbGxvdy1ib2R5PSJ5ZXMiPgotCi0gIDxkZXNjcmlwdGlvbj4KLSAgQSBzaW5nbGUgb3B0aW9uIHdpdGhpbiBhIFNlbGVjdC4KLSAgPC9kZXNjcmlwdGlvbj4KLSAgCi0gIDxwYXJhbWV0ZXIgbmFtZT0ic2VsZWN0ZWQiIHR5cGU9ImphdmEubGFuZy5Cb29sZWFuIiByZXF1aXJlZD0ieWVzIi8+ICAKLSAgPHBhcmFtZXRlciBuYW1lPSJsYWJlbCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgZGlyZWN0aW9uPSJpbiIvPgotICAKLSAgPHJlc2VydmVkLXBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIvPgotICAKLTwvY29tcG9uZW50LXNwZWNpZmljYXRpb24+CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZm9ybS9Qcm9wZXJ0eVNlbGVjdGlvbi5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2Zvcm0vUHJvcGVydHlTZWxlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmIxOWM1Mi4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZm9ybS9Qcm9wZXJ0eVNlbGVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ4ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmZvcm07Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklGb3JtOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSU1hcmt1cFdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZXF1ZXN0Q3ljbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5UYXBlc3RyeTsKLQotLyoqCi0gKiAgQSBjb21wb25lbnQgdXNlZCB0byByZW5kZXIgYSBkcm9wLWRvd24gbGlzdCBvZiBvcHRpb25zIHRoYXQKLSAqICB0aGUgdXNlciBtYXkgc2VsZWN0LgotICogCi0gKiAgWzxhIGhyZWY9Ii4uLy4uLy4uLy4uLy4uL0NvbXBvbmVudFJlZmVyZW5jZS9Qcm9wZXJ0eVNlbGVjdGlvbi5odG1sIj5Db21wb25lbnQgUmVmZXJlbmNlPC9hPl0KLSAqCi0gKiAgPHA+RWFybGllciB2ZXJzaW9ucyBvZiBQcm9wZXJ0eVNlbGVjdGlvbiAodGhyb3VnaCByZWxlYXNlIDIuMikKLSAqICB3ZXJlIG1vcmUgZmxleGlibGUsIHRoZXkgaW5jbHVkZWQgYSA8Yj5yZW5kZXJlcjwvYj4gcHJvcGVydHkKLSAqICB0aGF0IGNvbnRyb2xsZWQgaG93IHRoZSBzZWxlY3Rpb24gd2FzIHJlbmRlcmVkLiAgVWx0aW1hdGVseSwKLSAqICB0aGlzIHByb3ZlZCBvZiBsaXR0bGUgdmFsdWUgYW5kIHRoaXMgcG9ydGlvbiBvZgotICogIGZ1bmN0aW9uYWxpdHkgd2FzIGRlcHJlY2F0ZWQgaW4gMi4zIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gMi4zLgotICogCi0gKiAgPHA+VHlwaWNhbGx5LCB0aGUgdmFsdWVzIGF2YWlsYWJsZSB0byBiZSBzZWxlY3RlZAotICogIGFyZSBkZWZpbmVkIHVzaW5nIGFuIHtAbGluayBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5lbnVtLkVudW19LgotICogIEEgUHJvcGVydHlTZWxlY3Rpb24gaXMgZGVwZW5kZW50IG9uCi0gKiAgYW4ge0BsaW5rIElQcm9wZXJ0eVNlbGVjdGlvbk1vZGVsfSB0byBwcm92aWRlIHRoZSBsaXN0IG9mIHBvc3NpYmxlIHZhbHVlcy4KLSAqCi0gKiAgPHA+T2Z0ZW4sIHRoaXMgaXMgdXNlZCB0byBzZWxlY3QgYSBwYXJ0aWN1bGFyIAotICogIHtAbGluayBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5lbnVtLkVudW19IHRvIGFzc2lnbiB0byBhIHByb3BlcnR5OyB0aGUKLSAqICB7QGxpbmsgRW51bVByb3BlcnR5U2VsZWN0aW9uTW9kZWx9IGNsYXNzIHNpbXBsaWZpZXMgdGhpcy4KLSAqCi0gKgotICogIEB2ZXJzaW9uICRJZCQKLSAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKgotICoqLwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUHJvcGVydHlTZWxlY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdEZvcm1Db21wb25lbnQKLXsKLSAgICAvKioKLSAgICAgKiAgQSBzaGFyZWQgaW5zdGFuY2Ugb2Yge0BsaW5rIFNlbGVjdFByb3BlcnR5U2VsZWN0aW9uUmVuZGVyZXJ9LgotICAgICAqCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBJUHJvcGVydHlTZWxlY3Rpb25SZW5kZXJlciBERUZBVUxUX1NFTEVDVF9SRU5ERVJFUiA9Ci0gICAgICAgIG5ldyBTZWxlY3RQcm9wZXJ0eVNlbGVjdGlvblJlbmRlcmVyKCk7Ci0KLSAgICAvKioKLSAgICAgKiAgQSBzaGFyZWQgaW5zdGFuY2Ugb2Yge0BsaW5rIFJhZGlvUHJvcGVydHlTZWxlY3Rpb25SZW5kZXJlcn0uCi0gICAgICoKLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIElQcm9wZXJ0eVNlbGVjdGlvblJlbmRlcmVyIERFRkFVTFRfUkFESU9fUkVOREVSRVIgPQotICAgICAgICBuZXcgUmFkaW9Qcm9wZXJ0eVNlbGVjdGlvblJlbmRlcmVyKCk7Ci0KLSAgICAvKioKLSAgICAgKiAgUmVuZGVycyB0aGUgY29tcG9uZW50LCBtdWNoIG9mIHdoaWNoIGlzIHRoZSByZXNwb25zaWJsaXR5Ci0gICAgICogIG9mIHRoZSB7QGxpbmsgSVByb3BlcnR5U2VsZWN0aW9uUmVuZGVyZXIgcmVuZGVyZXJ9LiAgVGhlIHBvc3NpYmxlIG9wdGlvbnMsCi0gICAgICogIHRoaWVyIGxhYmVscywgYW5kIHRoZSB2YWx1ZXMgdG8gYmUgZW5jb2RlZCBpbiB0aGUgZm9ybSBhcmUgcHJvdmlkZWQKLSAgICAgKiAgYnkgdGhlIHtAbGluayBJUHJvcGVydHlTZWxlY3Rpb25Nb2RlbCBtb2RlbH0uCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwcm90ZWN0ZWQgdm9pZCByZW5kZXJDb21wb25lbnQoSU1hcmt1cFdyaXRlciB3cml0ZXIsIElSZXF1ZXN0Q3ljbGUgY3ljbGUpCi0gICAgewotICAgICAgICBJRm9ybSBmb3JtID0gZ2V0Rm9ybShjeWNsZSk7Ci0KLSAgICAgICAgYm9vbGVhbiByZXdpbmRpbmcgPSBmb3JtLmlzUmV3aW5kaW5nKCk7Ci0KLSAgICAgICAgU3RyaW5nIG5hbWUgPSBmb3JtLmdldEVsZW1lbnRJZCh0aGlzKTsKLQotICAgICAgICBpZiAocmV3aW5kaW5nKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJZiBkaXNhYmxlZCwgaWdub3JlIGFueXRoaW5nIHRoYXQgY29tZXMgdXAgZnJvbSB0aGUgY2xpZW50LgotCi0gICAgICAgICAgICBpZiAoaXNEaXNhYmxlZCgpKQotICAgICAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAgICAgU3RyaW5nIG9wdGlvblZhbHVlID0gY3ljbGUuZ2V0UmVxdWVzdENvbnRleHQoKS5nZXRQYXJhbWV0ZXIobmFtZSk7Ci0KLSAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IChvcHRpb25WYWx1ZSA9PSBudWxsKSA/IG51bGwgOiBnZXRNb2RlbCgpLnRyYW5zbGF0ZVZhbHVlKG9wdGlvblZhbHVlKTsKLQotICAgICAgICAgICAgc2V0VmFsdWUodmFsdWUpOwotCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBJUHJvcGVydHlTZWxlY3Rpb25SZW5kZXJlciByZW5kZXJlciA9IGdldFJlbmRlcmVyKCk7Ci0KLSAgICAgICAgaWYgKHJlbmRlcmVyICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlbmRlcldpdGhSZW5kZXJlcih3cml0ZXIsIGN5Y2xlLCByZW5kZXJlcik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICB3cml0ZXIuYmVnaW4oInNlbGVjdCIpOwotICAgICAgICB3cml0ZXIuYXR0cmlidXRlKCJuYW1lIiwgbmFtZSk7Ci0KLSAgICAgICAgaWYgKGlzRGlzYWJsZWQoKSkKLSAgICAgICAgICAgIHdyaXRlci5hdHRyaWJ1dGUoImRpc2FibGVkIiwgImRpc2FibGVkIik7Ci0KLSAgICAgICAgaWYgKGdldFN1Ym1pdE9uQ2hhbmdlKCkpCi0gICAgICAgICAgICB3cml0ZXIuYXR0cmlidXRlKCJvbmNoYW5nZSIsICJqYXZhc2NyaXB0OnRoaXMuZm9ybS5zdWJtaXQoKTsiKTsKLQotICAgICAgICAvLyBBcHBseSBpbmZvcm1hbCBhdHRyaWJ1dGVzLgotCi0gICAgICAgIHJlbmRlckluZm9ybWFsUGFyYW1ldGVycyh3cml0ZXIsIGN5Y2xlKTsKLQotICAgICAgICB3cml0ZXIucHJpbnRsbigpOwotCi0gICAgICAgIElQcm9wZXJ0eVNlbGVjdGlvbk1vZGVsIG1vZGVsID0gZ2V0TW9kZWwoKTsKLQotICAgICAgICBpZiAobW9kZWwgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IFRhcGVzdHJ5LmNyZWF0ZVJlcXVpcmVkUGFyYW1ldGVyRXhjZXB0aW9uKHRoaXMsICJtb2RlbCIpOwotCi0gICAgICAgIGludCBjb3VudCA9IG1vZGVsLmdldE9wdGlvbkNvdW50KCk7Ci0gICAgICAgIGJvb2xlYW4gZm91bmRTZWxlY3RlZCA9IGZhbHNlOwotICAgICAgICBib29sZWFuIHNlbGVjdGVkID0gZmFsc2U7Ci0gICAgICAgIE9iamVjdCB2YWx1ZSA9IGdldFZhbHVlKCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBPYmplY3Qgb3B0aW9uID0gbW9kZWwuZ2V0T3B0aW9uKGkpOwotCi0gICAgICAgICAgICBpZiAoIWZvdW5kU2VsZWN0ZWQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2VsZWN0ZWQgPSBpc0VxdWFsKG9wdGlvbiwgdmFsdWUpOwotICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZCkKLSAgICAgICAgICAgICAgICAgICAgZm91bmRTZWxlY3RlZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHdyaXRlci5iZWdpbigib3B0aW9uIik7Ci0gICAgICAgICAgICB3cml0ZXIuYXR0cmlidXRlKCJ2YWx1ZSIsIG1vZGVsLmdldFZhbHVlKGkpKTsKLQotICAgICAgICAgICAgaWYgKHNlbGVjdGVkKQotICAgICAgICAgICAgICAgIHdyaXRlci5hdHRyaWJ1dGUoInNlbGVjdGVkIiwgInNlbGVjdGVkIik7Ci0KLSAgICAgICAgICAgIHdyaXRlci5wcmludChtb2RlbC5nZXRMYWJlbChpKSk7Ci0KLSAgICAgICAgICAgIHdyaXRlci5lbmQoKTsKLQotICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oKTsKLQotICAgICAgICAgICAgc2VsZWN0ZWQgPSBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHdyaXRlci5lbmQoKTsgLy8gPHNlbGVjdD4KLQotICAgIH0KLQotICAgIC8qKgotICAgICAqICBSZW5kZXJzIHRoZSBwcm9wZXJ0eSBzZWxlY3Rpb24gdXNpbmcgYSB7QGxpbmsgSVByb3BlcnR5U2VsZWN0aW9uUmVuZGVyZXJ9LgotICAgICAqICBTdXBwb3J0IGZvciB0aGlzIHdpbGwgYmUgcmVtb3ZlZCBpbiAyLjMuCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHJpdmF0ZSB2b2lkIHJlbmRlcldpdGhSZW5kZXJlcigKLSAgICAgICAgSU1hcmt1cFdyaXRlciB3cml0ZXIsCi0gICAgICAgIElSZXF1ZXN0Q3ljbGUgY3ljbGUsCi0gICAgICAgIElQcm9wZXJ0eVNlbGVjdGlvblJlbmRlcmVyIHJlbmRlcmVyKQotICAgIHsKLSAgICAgICAgcmVuZGVyZXIuYmVnaW5SZW5kZXIodGhpcywgd3JpdGVyLCBjeWNsZSk7Ci0KLSAgICAgICAgSVByb3BlcnR5U2VsZWN0aW9uTW9kZWwgbW9kZWwgPSBnZXRNb2RlbCgpOwotCi0gICAgICAgIGludCBjb3VudCA9IG1vZGVsLmdldE9wdGlvbkNvdW50KCk7Ci0KLSAgICAgICAgYm9vbGVhbiBmb3VuZFNlbGVjdGVkID0gZmFsc2U7Ci0gICAgICAgIGJvb2xlYW4gc2VsZWN0ZWQgPSBmYWxzZTsKLQotICAgICAgICBPYmplY3QgdmFsdWUgPSBnZXRWYWx1ZSgpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgT2JqZWN0IG9wdGlvbiA9IG1vZGVsLmdldE9wdGlvbihpKTsKLQotICAgICAgICAgICAgaWYgKCFmb3VuZFNlbGVjdGVkKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNlbGVjdGVkID0gaXNFcXVhbChvcHRpb24sIHZhbHVlKTsKLSAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWQpCi0gICAgICAgICAgICAgICAgICAgIGZvdW5kU2VsZWN0ZWQgPSB0cnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZW5kZXJlci5yZW5kZXJPcHRpb24odGhpcywgd3JpdGVyLCBjeWNsZSwgbW9kZWwsIG9wdGlvbiwgaSwgc2VsZWN0ZWQpOwotCi0gICAgICAgICAgICBzZWxlY3RlZCA9IGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQSBQcm9wZXJ0eVNlbGVjdGlvbiBkb2Vzbid0IGFsbG93IGEgYm9keSwgc28gbm8gbmVlZCB0byB3b3JyeSBhYm91dAotICAgICAgICAvLyB3cmFwcGVkIGNvbXBvbmVudHMuCi0KLSAgICAgICAgcmVuZGVyZXIuZW5kUmVuZGVyKHRoaXMsIHdyaXRlciwgY3ljbGUpOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0VxdWFsKE9iamVjdCBsZWZ0LCBPYmplY3QgcmlnaHQpCi0gICAgewotICAgICAgICAvLyBCb3RoIG51bGwsIG9yIHNhbWUgb2JqZWN0LCB0aGVuIGFyZSBlcXVhbAotCi0gICAgICAgIGlmIChsZWZ0ID09IHJpZ2h0KQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAgICAgLy8gSWYgb25lIGlzIG51bGwsIHRoZSBvdGhlciBpc24ndCwgdGhlbiBub3QgZXF1YWwuCi0KLSAgICAgICAgaWYgKGxlZnQgPT0gbnVsbCB8fCByaWdodCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIC8vIEJvdGggbm9uLW51bGw7IHVzZSBzdGFuZGFyZCBjb21wYXJpc29uLgotCi0gICAgICAgIHJldHVybiBsZWZ0LmVxdWFscyhyaWdodCk7Ci0gICAgfQotCi0gICAgcHVibGljIGFic3RyYWN0IElQcm9wZXJ0eVNlbGVjdGlvbk1vZGVsIGdldE1vZGVsKCk7Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgSVByb3BlcnR5U2VsZWN0aW9uUmVuZGVyZXIgZ2V0UmVuZGVyZXIoKTsKLQotICAgIC8qKiBAc2luY2UgMi4yICoqLwotCi0gICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gZ2V0U3VibWl0T25DaGFuZ2UoKTsKLQotICAgIC8qKiBAc2luY2UgMi4yICoqLwotCi0gICAgcHVibGljIGFic3RyYWN0IE9iamVjdCBnZXRWYWx1ZSgpOwotCi0gICAgLyoqIEBzaW5jZSAyLjIgKiovCi0KLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRWYWx1ZShPYmplY3QgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgdHJ1ZSBpZiB0aGlzIFByb3BlcnR5U2VsZWN0aW9uJ3MgZGlzYWJsZWQgcGFyYW1ldGVyIHlpZWxkcyB0cnVlLgotICAgICAqICBUaGUgY29ycmVzcG9uZGluZyBIVE1MIGNvbnRyb2wocykgc2hvdWxkIGJlIGRpc2FibGVkLgotICAgICAqKi8KLQotICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzRGlzYWJsZWQoKTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9mb3JtL1Byb3BlcnR5U2VsZWN0aW9uLmp3YyBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9mb3JtL1Byb3BlcnR5U2VsZWN0aW9uLmp3YwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE4OGVkYy4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZm9ybS9Qcm9wZXJ0eVNlbGVjdGlvbi5qd2MKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gIAotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTwhLS0gJElkJCAtLT4KLTwhRE9DVFlQRSBjb21wb25lbnQtc3BlY2lmaWNhdGlvbiBQVUJMSUMgCi0gICItLy9BcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi8vVGFwZXN0cnkgU3BlY2lmaWNhdGlvbiAzLjAvL0VOIiAKLSAgImh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvdGFwZXN0cnkvZHRkL1RhcGVzdHJ5XzNfMC5kdGQiPgotICAKLTxjb21wb25lbnQtc3BlY2lmaWNhdGlvbiBjbGFzcz0ib3JnLmFwYWNoZS50YXBlc3RyeS5mb3JtLlByb3BlcnR5U2VsZWN0aW9uIiAKLQlhbGxvdy1ib2R5PSJubyIgCi0JYWxsb3ctaW5mb3JtYWwtcGFyYW1ldGVycz0ieWVzIj4KLSAgCi0gIDxkZXNjcmlwdGlvbj4KLSAgQ3JlYXRlcyBhbiBIVE1MIHNlbGVjdCB0byBjaG9vc2UgYSBzaW5nbGUgcHJvcGVydHkgZnJvbSBhIGxpc3Qgb2Ygb3B0aW9ucy4KLSAgPC9kZXNjcmlwdGlvbj4KLSAgCi0gIDxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHJlcXVpcmVkPSJ5ZXMiIHR5cGU9ImphdmEubGFuZy5PYmplY3QiIGRpcmVjdGlvbj0iZm9ybSIvPgotICAKLSAgPHBhcmFtZXRlciBuYW1lPSJtb2RlbCIgCi0gIAl0eXBlPSJvcmcuYXBhY2hlLnRhcGVzdHJ5LmZvcm0uSVByb3BlcnR5U2VsZWN0aW9uTW9kZWwiIAotICAJcmVxdWlyZWQ9InllcyIKLSAgCWRpcmVjdGlvbj0iaW4iLz4KLSAgCQotICA8cGFyYW1ldGVyIG5hbWU9ImRpc2FibGVkIgotICAJdHlwZT0iYm9vbGVhbiIKLSAgCWRpcmVjdGlvbj0iaW4iLz4KLSAgCQotICA8cGFyYW1ldGVyIG5hbWU9InJlbmRlcmVyIiAKLSAgCXR5cGU9Im9yZy5hcGFjaGUudGFwZXN0cnkuZm9ybS5JUHJvcGVydHlTZWxlY3Rpb25SZW5kZXJlciIKLSAgCWRpcmVjdGlvbj0iaW4iPgotICAJPGRlc2NyaXB0aW9uPgotCUFuIGFsdGVybmF0ZSByZW5kZXJlZCBmb3IgdGhlIHByb3BlcnR5IHNlbGVjdGlvbi4KLSAgCTwvZGVzY3JpcHRpb24+Ci0gIDwvcGFyYW1ldGVyPgotICAKLSAgPHBhcmFtZXRlciBuYW1lPSJzdWJtaXRPbkNoYW5nZSIKLSAgCXR5cGU9ImJvb2xlYW4iCi0gIAlkaXJlY3Rpb249ImluIj4KLSAgCTxkZXNjcmlwdGlvbj4KLSAgCUVuYWJsZXMgbG9naWMgdG8gc3VibWl0IGNvbnRhaW5pbmcgZm9ybSB3aGVuIHZhbHVlIGNoYW5nZXMuCi0gIAk8L2Rlc2NyaXB0aW9uPgotICA8L3BhcmFtZXRlcj4KLSAgCQotICA8cmVzZXJ2ZWQtcGFyYW1ldGVyIG5hbWU9Im5hbWUiLz4KLQotICA8cHJvcGVydHktc3BlY2lmaWNhdGlvbiBuYW1lPSJuYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+Ci0gIDxwcm9wZXJ0eS1zcGVjaWZpY2F0aW9uIG5hbWU9ImZvcm0iIHR5cGU9Im9yZy5hcGFjaGUudGFwZXN0cnkuSUZvcm0iLz4KLSAgICAKLTwvY29tcG9uZW50LXNwZWNpZmljYXRpb24+CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZm9ybS9SYWRpby5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2Zvcm0vUmFkaW8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTIwYmU0YS4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZm9ybS9SYWRpby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmZvcm07Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LkFic3RyYWN0Q29tcG9uZW50OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSU1hcmt1cFdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZXF1ZXN0Q3ljbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5UYXBlc3RyeTsKLQotLyoqCi0gKiAgSW1wbGVtZW50cyBhIGNvbXBvbmVudCB0aGF0IG1hbmFnZXMgYW4gSFRNTCAmbHQ7aW5wdXQgdHlwZT1yYWRpbyZndDsgZm9ybSBlbGVtZW50LgotICogIFN1Y2ggYSBjb21wb25lbnQgbXVzdCBiZSB3cmFwcGVkIChwb3NzaWJseSBpbmRpcmVjdGx5KQotICogIGluc2lkZSBhIHtAbGluayBSYWRpb0dyb3VwfSBjb21wb25lbnQuCi0gKgotICogIFs8YSBocmVmPSIuLi8uLi8uLi8uLi8uLi9Db21wb25lbnRSZWZlcmVuY2UvUmFkaW8uaHRtbCI+Q29tcG9uZW50IFJlZmVyZW5jZTwvYT5dCi0gKgotICogCi0gKiAgPHA+e0BsaW5rIFJhZGlvfSBhbmQge0BsaW5rIFJhZGlvR3JvdXB9IGFyZSBnZW5lcmFsbHkgbm90IHVzZWQgKGV4Y2VwdAotICogIGZvciB2ZXJ5IHNwZWNpYWwgY2FzZXMpLiAgSW5zdGVhZCwgYSB7QGxpbmsgUHJvcGVydHlTZWxlY3Rpb259IGNvbXBvbmVudCBpcyB1c2VkLgotICoKLSAqCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogIEB2ZXJzaW9uICRJZCQKLSAqIAotICoqLwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUmFkaW8gZXh0ZW5kcyBBYnN0cmFjdENvbXBvbmVudAotewotICAgIC8qKgotICAgICAqICBSZW5kZXJzIHRoZSBmb3JtIGVsZW1lbnQsIG9yIHJlc3BvbmRzIHdoZW4gdGhlIGZvcm0gY29udGFpbmluZyB0aGUgZWxlbWVudAotICAgICAqICBpcyBzdWJtaXR0ZWQgKGJ5IGNoZWNraW5nIHtAbGluayBGb3JtI2lzUmV3aW5kaW5nKCl9LgotICAgICAqCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwcm90ZWN0ZWQgdm9pZCByZW5kZXJDb21wb25lbnQoSU1hcmt1cFdyaXRlciB3cml0ZXIsIElSZXF1ZXN0Q3ljbGUgY3ljbGUpCi0gICAgewotCi0gICAgICAgIFJhZGlvR3JvdXAgZ3JvdXAgPSBSYWRpb0dyb3VwLmdldChjeWNsZSk7Ci0gICAgICAgIGlmIChncm91cCA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICBUYXBlc3RyeS5nZXRNZXNzYWdlKCJSYWRpby5tdXN0LWJlLWNvbnRhaW5lZC1ieS1ncm91cCIpLAotICAgICAgICAgICAgICAgIHRoaXMsCi0gICAgICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgICAgICBudWxsKTsKLQotICAgICAgICAvLyBUaGUgZ3JvdXAgZGV0ZXJtaW5lcyByZXdpbmRpbmcgZnJvbSB0aGUgZm9ybS4KLQotICAgICAgICBib29sZWFuIHJld2luZGluZyA9IGdyb3VwLmlzUmV3aW5kaW5nKCk7Ci0KLSAgICAgICAgaW50IG9wdGlvbiA9IGdyb3VwLmdldE5leHRPcHRpb25JZCgpOwotCi0gICAgICAgIGlmIChyZXdpbmRpbmcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIElmIG5vdCBkaXNhYmxlZCBhbmQgdGhpcyBpcyB0aGUgc2VsZWN0ZWQgYnV0dG9uIHdpdGhpbiB0aGUgcmFkaW8gZ3JvdXAsCi0gICAgICAgICAgICAvLyB0aGVuIHVwZGF0ZSBzZXQgdGhlIHNlbGVjdGlvbiBmcm9tIHRoZSBncm91cCB0byB0aGUgdmFsdWUgZm9yIHRoaXMKLSAgICAgICAgICAgIC8vIHJhZGlvIGJ1dHRvbi4gIFRoaXMgd2lsbCB1cGRhdGUgdGhlIHNlbGVjdGVkIHBhcmFtZXRlciBvZiB0aGUgUmFkaW9Hcm91cC4KLQotICAgICAgICAgICAgaWYgKCFpc0Rpc2FibGVkKCkgJiYgIWdyb3VwLmlzRGlzYWJsZWQoKSAmJiBncm91cC5pc1NlbGVjdGVkKG9wdGlvbikpCi0gICAgICAgICAgICAgICAgZ3JvdXAudXBkYXRlU2VsZWN0aW9uKGdldFZhbHVlKCkpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgd3JpdGVyLmJlZ2luRW1wdHkoImlucHV0Iik7Ci0KLSAgICAgICAgd3JpdGVyLmF0dHJpYnV0ZSgidHlwZSIsICJyYWRpbyIpOwotCi0gICAgICAgIHdyaXRlci5hdHRyaWJ1dGUoIm5hbWUiLCBncm91cC5nZXROYW1lKCkpOwotCi0gICAgICAgIC8vIEFzIHRoZSBncm91cCBpZiB0aGUgdmFsdWUgZm9yIHRoaXMgUmFkaW8gbWF0Y2hlcyB0aGUgc2VsZWN0aW9uCi0gICAgICAgIC8vIGZvciB0aGUgZ3JvdXAgYXMgYSB3aG9sZTsgaWYgc28gdGhpcyBpcyB0aGUgZGVmYXVsdCByYWRpbyBhbmQgaXMgY2hlY2tlZC4KLQotICAgICAgICBpZiAoZ3JvdXAuaXNTZWxlY3Rpb24oZ2V0VmFsdWUoKSkpCi0gICAgICAgICAgICB3cml0ZXIuYXR0cmlidXRlKCJjaGVja2VkIiwgImNoZWNrZWQiKTsKLQotICAgICAgICBpZiAoaXNEaXNhYmxlZCgpIHx8IGdyb3VwLmlzRGlzYWJsZWQoKSkKLSAgICAgICAgICAgIHdyaXRlci5hdHRyaWJ1dGUoImRpc2FibGVkIiwgImRpc2FibGVkIik7Ci0KLSAgICAgICAgLy8gVGhlIHZhbHVlIGZvciB0aGUgUmFkaW8gbWF0Y2hlcyB0aGUgb3B0aW9uIG51bWJlciAocHJvdmlkZWQgYnkgdGhlIFJhZGlvR3JvdXApLgotICAgICAgICAvLyBXaGVuIHRoZSBmb3JtIGlzIHN1Ym1pdHRlZCwgdGhlIFJhZGlvR3JvdXAgd2lsbCBrbm93IHdoaWNoIG9wdGlvbiB3YXMsCi0gICAgICAgIC8vIGluIGZhY3QsIHNlbGVjdGVkIGJ5IHRoZSB1c2VyLgotCi0gICAgICAgIHdyaXRlci5hdHRyaWJ1dGUoInZhbHVlIiwgb3B0aW9uKTsKLQotICAgICAgICByZW5kZXJJbmZvcm1hbFBhcmFtZXRlcnMod3JpdGVyLCBjeWNsZSk7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0Rpc2FibGVkKCk7Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgT2JqZWN0IGdldFZhbHVlKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2Zvcm0vUmFkaW8uandjIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2Zvcm0vUmFkaW8uandjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Nzg1Nzk0Li4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9mb3JtL1JhZGlvLmp3YworKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAgCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPCEtLSAkSWQkIC0tPgotPCFET0NUWVBFIGNvbXBvbmVudC1zcGVjaWZpY2F0aW9uIFBVQkxJQyAKLSAgIi0vL0FwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLy9UYXBlc3RyeSBTcGVjaWZpY2F0aW9uIDMuMC8vRU4iIAotICAiaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy90YXBlc3RyeS9kdGQvVGFwZXN0cnlfM18wLmR0ZCI+Ci0gIAotPGNvbXBvbmVudC1zcGVjaWZpY2F0aW9uIGNsYXNzPSJvcmcuYXBhY2hlLnRhcGVzdHJ5LmZvcm0uUmFkaW8iIGFsbG93LWJvZHk9Im5vIj4KLQotICA8ZGVzY3JpcHRpb24+Ci0gIEEgc2luZ2xlIHBvc3NpYmxlIHNlbGVjdGlvbiB3aXRoaW4gYSBSYWRpb0dyb3VwLgotICA8L2Rlc2NyaXB0aW9uPgotICAKLSAgPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iamF2YS5sYW5nLk9iamVjdCIgZGlyZWN0aW9uPSJpbiIvPgotICAKLSAgPHBhcmFtZXRlciBuYW1lPSJkaXNhYmxlZCIgdHlwZT0iYm9vbGVhbiIgZGlyZWN0aW9uPSJpbiIvPgotICAKLSAgPHJlc2VydmVkLXBhcmFtZXRlciBuYW1lPSJjaGVja2VkIi8+Ci0gIDxyZXNlcnZlZC1wYXJhbWV0ZXIgbmFtZT0idHlwZSIvPgotICA8cmVzZXJ2ZWQtcGFyYW1ldGVyIG5hbWU9Im5hbWUiLz4KLSAgCi08L2NvbXBvbmVudC1zcGVjaWZpY2F0aW9uPgpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2Zvcm0vUmFkaW9Hcm91cC5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2Zvcm0vUmFkaW9Hcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTQ0MWFjLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9mb3JtL1JhZGlvR3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NiArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5mb3JtOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5BcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JQmluZGluZzsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklGb3JtOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSU1hcmt1cFdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZXF1ZXN0Q3ljbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5UYXBlc3RyeTsKLQotLyoqCi0gKiAgQSBzcGVjaWFsIHR5cGUgb2YgZm9ybSBjb21wb25lbnQgdGhhdCBpcyB1c2VkIHRvIGNvbnRhaW4ge0BsaW5rIFJhZGlvfQotICogIGNvbXBvbmVudHMuICBUaGUgUmFkaW8gYW5kIHtAbGluayBSYWRpb30gZ3JvdXAgY29tcG9uZW50cyB3b3JrIHRvZ2V0aGVyIHRvCi0gKiAgdXBkYXRlIGEgcHJvcGVydHkgb2Ygc29tZSBvdGhlciBvYmplY3QsIG11Y2ggbGlrZSBhIG1vcmUgZmxleGlibGUKLSAqICB2ZXJzaW9uIG9mIGEge0BsaW5rIFByb3BlcnR5U2VsZWN0aW9ufS4KLSAqCi0gKiAgWzxhIGhyZWY9Ii4uLy4uLy4uLy4uLy4uL0NvbXBvbmVudFJlZmVyZW5jZS9SYWRpb0dyb3VwLmh0bWwiPkNvbXBvbmVudCBSZWZlcmVuY2U8L2E+XQotICoKLSAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiAgQHZlcnNpb24gJElkJAotICogCi0gKiovCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBSYWRpb0dyb3VwIGV4dGVuZHMgQWJzdHJhY3RGb3JtQ29tcG9uZW50Ci17Ci0gICAgLy8gQ2FjaGVkIGNvcHkgb2YgdGhlIHZhbHVlIGZyb20gdGhlIHNlbGVjdGVkQmluZGluZwotICAgIHByaXZhdGUgT2JqZWN0IF9zZWxlY3Rpb247Ci0KLSAgICAvLyBUaGUgdmFsdWUgZnJvbSB0aGUgSFRUUCByZXF1ZXN0IGluZGljYXRpbmcgd2hpY2gKLSAgICAvLyBSYWRpbyB3YXMgc2VsZWN0ZWQgYnkgdGhlIHVzZXIuCi0gICAgcHJpdmF0ZSBpbnQgX3NlbGVjdGVkT3B0aW9uOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIF9yZXdpbmRpbmc7Ci0gICAgcHJpdmF0ZSBib29sZWFuIF9yZW5kZXJpbmc7Ci0gICAgcHJpdmF0ZSBpbnQgX25leHRPcHRpb25JZDsKLQotICAgIC8qKgotICAgICAqICBBIDxjb2RlPlJhZGlvR3JvdXA8L2NvZGU+IHBsYWNlcyBpdHNlbGYgaW50byB0aGUge0BsaW5rIElSZXF1ZXN0Q3ljbGV9IGFzCi0gICAgICogIGFuIGF0dHJpYnV0ZSwgc28gdGhhdCBpdHMgd3JhcHBlZCB7QGxpbmsgUmFkaW99IGNvbXBvbmVudHMgY2FuIGlkZW50aWZ5IHRoaWVyCi0gICAgICogIHN0YXRlLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9OQU1FID0gIm9yZy5hcGFjaGUudGFwZXN0cnkuYWN0aXZlLlJhZGlvR3JvdXAiOwotCi0gICAgcHVibGljIHN0YXRpYyBSYWRpb0dyb3VwIGdldChJUmVxdWVzdEN5Y2xlIGN5Y2xlKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChSYWRpb0dyb3VwKSBjeWNsZS5nZXRBdHRyaWJ1dGUoQVRUUklCVVRFX05BTUUpOwotICAgIH0KLQotICAgIHB1YmxpYyBhYnN0cmFjdCBJQmluZGluZyBnZXRTZWxlY3RlZEJpbmRpbmcoKTsKLQotICAgIHB1YmxpYyBpbnQgZ2V0TmV4dE9wdGlvbklkKCkKLSAgICB7Ci0gICAgICAgIGlmICghX3JlbmRlcmluZykKLSAgICAgICAgICAgIHRocm93IFRhcGVzdHJ5LmNyZWF0ZVJlbmRlck9ubHlQcm9wZXJ0eUV4Y2VwdGlvbih0aGlzLCAibmV4dE9wdGlvbklkIik7Ci0KLSAgICAgICAgcmV0dXJuIF9uZXh0T3B0aW9uSWQrKzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgVXNlZCBieSB7QGxpbmsgUmFkaW99IGNvbXBvbmVudHMgd3JhcHBlZCBieSB0aGlzIDxjb2RlPlJhZGlvR3JvdXA8L2NvZGU+IHRvIHNlZQotICAgICAqICBpZiB0aGUgZ3JvdXAgYXMgYSB3aG9sZSBpcyBkaXNhYmxlZC4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzRGlzYWJsZWQoKTsKLQotICAgIHB1YmxpYyBib29sZWFuIGlzUmV3aW5kaW5nKCkKLSAgICB7Ci0gICAgICAgIGlmICghX3JlbmRlcmluZykKLSAgICAgICAgICAgIHRocm93IFRhcGVzdHJ5LmNyZWF0ZVJlbmRlck9ubHlQcm9wZXJ0eUV4Y2VwdGlvbih0aGlzLCAicmV3aW5kaW5nIik7Ci0KLSAgICAgICAgcmV0dXJuIF9yZXdpbmRpbmc7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgdHJ1ZSBpZiB0aGUgdmFsdWUgaXMgZXF1YWwgdG8gdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGZvciB0aGUKLSAgICAgKiAgZ3JvdXAuICBUaGlzIGlzIGludm9rZWQgYnkgYSB7QGxpbmsgUmFkaW99IGR1cmluZyByZW5kZXJpbmcKLSAgICAgKiAgdG8gZGV0ZXJtaW5lIGlmIGl0IHNob3VsZCBiZSBtYXJrZWQgJ2NoZWNrZWQnLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIGJvb2xlYW4gaXNTZWxlY3Rpb24oT2JqZWN0IHZhbHVlKQotICAgIHsKLSAgICAgICAgaWYgKCFfcmVuZGVyaW5nKQotICAgICAgICAgICAgdGhyb3cgVGFwZXN0cnkuY3JlYXRlUmVuZGVyT25seVByb3BlcnR5RXhjZXB0aW9uKHRoaXMsICJzZWxlY3Rpb24iKTsKLQotICAgICAgICBpZiAoX3NlbGVjdGlvbiA9PSB2YWx1ZSkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgIGlmIChfc2VsZWN0aW9uID09IG51bGwgfHwgdmFsdWUgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICByZXR1cm4gX3NlbGVjdGlvbi5lcXVhbHModmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICogIEludm9rZWQgYnkgdGhlIHtAbGluayBSYWRpb30gd2hpY2ggaXMgc2VsZWN0ZWQgdG8gdXBkYXRlIHRoZSAKLSAgICAqICBwcm9wZXJ0eSBib3VuZCB0byB0aGUgc2VsZWN0ZWQgcGFyYW1ldGVyLgotICAgICoKLSAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZVNlbGVjdGlvbihPYmplY3QgdmFsdWUpCi0gICAgewotICAgICAgICBnZXRTZWxlY3RlZEJpbmRpbmcoKS5zZXRPYmplY3QodmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICogIFVzZWQgYnkge0BsaW5rIFJhZGlvfSBjb21wb25lbnRzIHdoZW4gcmV3aW5kaW5nIHRvIHNlZSBpZiB0aGVpciB2YWx1ZSB3YXMgc3VibWl0dGVkLgotICAgICoKLSAgICAqKi8KLQotICAgIHB1YmxpYyBib29sZWFuIGlzU2VsZWN0ZWQoaW50IG9wdGlvbikKLSAgICB7Ci0gICAgICAgIHJldHVybiBfc2VsZWN0ZWRPcHRpb24gPT0gb3B0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERvZXNuJ3QgYWN0dWFsIHJlbmRlciBhbiBIVE1MIGVsZW1lbnQgYXMgdGhlcmUgaXMgbm8gZGlyZWN0IGVxdWl2YWxlbnQgZm9yCi0gICAgICogYW4gSFRNTCBlbGVtZW50LiAgQSA8Y29kZT5SYWRpb0dyb3VwPC9jb2RlPiBjb21wb25lbnQgZXhpc3RzIHRvIG9yZ2FuaXplIHRoZQotICAgICAqIHtAbGluayBSYWRpb30gY29tcG9uZW50cyBpdCB3cmFwcyAoZGlyZWN0bHkgb3IgaW5kaXJlY3RseSkuCi0gICAgICoKLSAgICAgKiBBIHtAbGluayBSYWRpb30gY2FuIGZpbmRzIGl0cyB7QGxpbmsgUmFkaW9Hcm91cH0gYXMgYSB7QGxpbmsgSVJlcXVlc3RDeWNsZX0gYXR0cmlidXRlLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVuZGVyQ29tcG9uZW50KElNYXJrdXBXcml0ZXIgd3JpdGVyLCBJUmVxdWVzdEN5Y2xlIGN5Y2xlKQotICAgIHsKLSAgICAgICAgSUZvcm0gZm9ybSA9IGdldEZvcm0oY3ljbGUpOwotCi0gICAgICAgIGlmIChjeWNsZS5nZXRBdHRyaWJ1dGUoQVRUUklCVVRFX05BTUUpICE9IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIFRhcGVzdHJ5LmdldE1lc3NhZ2UoIlJhZGlvR3JvdXAubWF5LW5vdC1uZXN0IiksCi0gICAgICAgICAgICAgICAgdGhpcywKLSAgICAgICAgICAgICAgICBudWxsLAotICAgICAgICAgICAgICAgIG51bGwpOwotCi0gICAgICAgIC8vIEl0IGlzbid0IGVub3VnaCB0byBrbm93IHdoZXRoZXIgdGhlIGN5Y2xlIGluIGdlbmVyYWwgaXMgcmV3aW5kaW5nLCBuZWVkIHRvIGtub3cKLSAgICAgICAgLy8gc3BlY2lmaWNhbGx5IGlmIHRoZSBmb3JtIHdoaWNoIGNvbnRhaW5zIHRoaXMgY29tcG9uZW50IGlzIHJld2luZGluZy4KLQotICAgICAgICBfcmV3aW5kaW5nID0gZm9ybS5pc1Jld2luZGluZygpOwotCi0gICAgICAgIC8vIFVzZWQgd2hldGhlciByZXdpbmRpbmcgb3Igbm90LgotCi0gICAgICAgIFN0cmluZyBuYW1lID0gZm9ybS5nZXRFbGVtZW50SWQodGhpcyk7Ci0KLSAgICAgICAgY3ljbGUuc2V0QXR0cmlidXRlKEFUVFJJQlVURV9OQU1FLCB0aGlzKTsKLQotICAgICAgICAvLyBXaGVuIHJld2luZGluZywgZmluZCBvdXQgd2hpY2ggKGlmIGFueSkgcmFkaW8gd2FzIHNlbGVjdGVkIGJ5Ci0gICAgICAgIC8vIHRoZSB1c2VyLgotCi0gICAgICAgIGlmIChfcmV3aW5kaW5nKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBjeWNsZS5nZXRSZXF1ZXN0Q29udGV4dCgpLmdldFBhcmFtZXRlcihuYW1lKTsKLSAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQotICAgICAgICAgICAgICAgIF9zZWxlY3RlZE9wdGlvbiA9IC0xOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIF9zZWxlY3RlZE9wdGlvbiA9IEludGVnZXIucGFyc2VJbnQodmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIF9yZW5kZXJpbmcgPSB0cnVlOwotICAgICAgICAgICAgX25leHRPcHRpb25JZCA9IDA7Ci0KLSAgICAgICAgICAgIC8vIEZvciByZW5kZXJpbmcsIHRoZSBSYWRpbyBjb21wb25lbnRzIG5lZWQgdG8ga25vdyB3aGF0IHRoZSBjdXJyZW50Ci0gICAgICAgICAgICAvLyBzZWxlY3Rpb24gaXMsIHNvIHRoYXQgdGhlIGNvcnJlY3Qgb25lIGNhbiBtYXJrIGl0c2VsZiAnY2hlY2tlZCcuCi0KLSAgICAgICAgICAgIGlmICghX3Jld2luZGluZykKLSAgICAgICAgICAgICAgICBfc2VsZWN0aW9uID0gZ2V0U2VsZWN0ZWRCaW5kaW5nKCkuZ2V0T2JqZWN0KCk7Ci0KLSAgICAgICAgICAgIHJlbmRlckJvZHkod3JpdGVyLCBjeWNsZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBfcmVuZGVyaW5nID0gZmFsc2U7Ci0gICAgICAgICAgICBfc2VsZWN0aW9uID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIGN5Y2xlLnJlbW92ZUF0dHJpYnV0ZShBVFRSSUJVVEVfTkFNRSk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9mb3JtL1JhZGlvR3JvdXAuandjIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2Zvcm0vUmFkaW9Hcm91cC5qd2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmM2Y2ZGQuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2Zvcm0vUmFkaW9Hcm91cC5qd2MKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gIAotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTwhLS0gJElkJCAtLT4KLTwhRE9DVFlQRSBjb21wb25lbnQtc3BlY2lmaWNhdGlvbiBQVUJMSUMgCi0gICItLy9BcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi8vVGFwZXN0cnkgU3BlY2lmaWNhdGlvbiAzLjAvL0VOIiAKLSAgImh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvdGFwZXN0cnkvZHRkL1RhcGVzdHJ5XzNfMC5kdGQiPgotICAKLTxjb21wb25lbnQtc3BlY2lmaWNhdGlvbiBjbGFzcz0ib3JnLmFwYWNoZS50YXBlc3RyeS5mb3JtLlJhZGlvR3JvdXAiIGFsbG93LWluZm9ybWFsLXBhcmFtZXRlcnM9Im5vIj4KLQotICA8ZGVzY3JpcHRpb24+Ci0gIEdyb3VwcyB0b2dldGhlciBhIG51bWJlciBvZiBSYWRpbyBjb21wb25lbnRzLgotICA8L2Rlc2NyaXB0aW9uPgotICAKLSAgPHBhcmFtZXRlciBuYW1lPSJzZWxlY3RlZCIgcmVxdWlyZWQ9InllcyIvPgotICAKLSAgPHBhcmFtZXRlciBuYW1lPSJkaXNhYmxlZCIgdHlwZT0iYm9vbGVhbiIgZGlyZWN0aW9uPSJpbiIvPgotICAKLSAgPHByb3BlcnR5LXNwZWNpZmljYXRpb24gbmFtZT0ibmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgotICA8cHJvcGVydHktc3BlY2lmaWNhdGlvbiBuYW1lPSJmb3JtIiB0eXBlPSJvcmcuYXBhY2hlLnRhcGVzdHJ5LklGb3JtIi8+Ci0gIAotPC9jb21wb25lbnQtc3BlY2lmaWNhdGlvbj4KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9mb3JtL1JhZGlvUHJvcGVydHlTZWxlY3Rpb25SZW5kZXJlci5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2Zvcm0vUmFkaW9Qcm9wZXJ0eVNlbGVjdGlvblJlbmRlcmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlYjI3YTIuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2Zvcm0vUmFkaW9Qcm9wZXJ0eVNlbGVjdGlvblJlbmRlcmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5mb3JtOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JTWFya3VwV3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlcXVlc3RDeWNsZTsKLQotLyoqCi0gKiAgSW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIElQcm9wZXJ0eVNlbGVjdGlvblJlbmRlcmVyfSB0aGF0Ci0gKiAgcHJvZHVjZXMgYSB0YWJsZSBvZiByYWRpbyAoJmx0O2lucHV0IHR5cGU9cmFkaW8mZ3Q7KSBlbGVtZW50cy4KLSAqCi0gKiAgQHZlcnNpb24gJElkJAotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqCi0gKiovCi0KLXB1YmxpYyBjbGFzcyBSYWRpb1Byb3BlcnR5U2VsZWN0aW9uUmVuZGVyZXIgaW1wbGVtZW50cyBJUHJvcGVydHlTZWxlY3Rpb25SZW5kZXJlcgotewotCi0gICAgLyoqCi0gICAgICogIFdyaXRlcyB0aGUgJmx0O3RhYmxlJmd0OyBlbGVtZW50LgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgYmVnaW5SZW5kZXIoUHJvcGVydHlTZWxlY3Rpb24gY29tcG9uZW50LCBJTWFya3VwV3JpdGVyIHdyaXRlciwgSVJlcXVlc3RDeWNsZSBjeWNsZSkKLSAgICB7Ci0gICAgICAgIHdyaXRlci5iZWdpbigidGFibGUiKTsKLSAgICAgICAgd3JpdGVyLmF0dHJpYnV0ZSgiYm9yZGVyIiwgMCk7Ci0gICAgICAgIHdyaXRlci5hdHRyaWJ1dGUoImNlbGxwYWRkaW5nIiwgMCk7Ci0gICAgICAgIHdyaXRlci5hdHRyaWJ1dGUoImNlbGxzcGFjaW5nIiwgMik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIENsb3NlcyB0aGUgJmx0O3RhYmxlJmd0OyBlbGVtZW50LgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgZW5kUmVuZGVyKFByb3BlcnR5U2VsZWN0aW9uIGNvbXBvbmVudCwgSU1hcmt1cFdyaXRlciB3cml0ZXIsIElSZXF1ZXN0Q3ljbGUgY3ljbGUpCi0gICAgewotICAgICAgICB3cml0ZXIuZW5kKCk7IC8vIDx0YWJsZT4KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgV3JpdGVzIGEgcm93IG9mIHRoZSB0YWJsZS4gIFRoZSB0YWJsZSBjb250YWlucyB0d28gY2VsbHM7IHRoZSBmaXJzdCBpcyB0aGUgcmFkaW8KLSAgICAgKiAgYnV0dG9uLCB0aGUgc2Vjb25kIGlzIHRoZSBsYWJlbCBmb3IgdGhlIHJhZGlvIGJ1dHRvbi4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIHJlbmRlck9wdGlvbigKLSAgICAgICAgUHJvcGVydHlTZWxlY3Rpb24gY29tcG9uZW50LAotICAgICAgICBJTWFya3VwV3JpdGVyIHdyaXRlciwKLSAgICAgICAgSVJlcXVlc3RDeWNsZSBjeWNsZSwKLSAgICAgICAgSVByb3BlcnR5U2VsZWN0aW9uTW9kZWwgbW9kZWwsCi0gICAgICAgIE9iamVjdCBvcHRpb24sCi0gICAgICAgIGludCBpbmRleCwKLSAgICAgICAgYm9vbGVhbiBzZWxlY3RlZCkKLSAgICB7Ci0gICAgICAgIHdyaXRlci5iZWdpbigidHIiKTsKLSAgICAgICAgd3JpdGVyLmJlZ2luKCJ0ZCIpOwotCi0gICAgICAgIHdyaXRlci5iZWdpbkVtcHR5KCJpbnB1dCIpOwotICAgICAgICB3cml0ZXIuYXR0cmlidXRlKCJ0eXBlIiwgInJhZGlvIik7Ci0gICAgICAgIHdyaXRlci5hdHRyaWJ1dGUoIm5hbWUiLCBjb21wb25lbnQuZ2V0TmFtZSgpKTsKLSAgICAgICAgd3JpdGVyLmF0dHJpYnV0ZSgidmFsdWUiLCBtb2RlbC5nZXRWYWx1ZShpbmRleCkpOwotCi0gICAgICAgIGlmIChjb21wb25lbnQuaXNEaXNhYmxlZCgpKQotICAgICAgICAgICAgd3JpdGVyLmF0dHJpYnV0ZSgiZGlzYWJsZWQiLCAiZGlzYWJsZWQiKTsKLQotICAgICAgICBpZiAoc2VsZWN0ZWQpCi0gICAgICAgICAgICB3cml0ZXIuYXR0cmlidXRlKCJjaGVja2VkIiwgImNoZWNrZWQiKTsKLQotICAgICAgICB3cml0ZXIuZW5kKCk7IC8vIDx0ZD4KLQotICAgICAgICB3cml0ZXIucHJpbnRsbigpOwotCi0gICAgICAgIHdyaXRlci5iZWdpbigidGQiKTsKLSAgICAgICAgd3JpdGVyLnByaW50KG1vZGVsLmdldExhYmVsKGluZGV4KSk7Ci0gICAgICAgIHdyaXRlci5lbmQoKTsgLy8gPHRkPgotICAgICAgICB3cml0ZXIuZW5kKCk7IC8vIDx0cj4JCi0KLSAgICAgICAgd3JpdGVyLnByaW50bG4oKTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2Zvcm0vU2VsZWN0LmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZm9ybS9TZWxlY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmUyYmVkZi4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZm9ybS9TZWxlY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5mb3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUZvcm07Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JTWFya3VwV3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlcXVlc3RDeWNsZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LlRhcGVzdHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkucmVxdWVzdC5SZXF1ZXN0Q29udGV4dDsKLQotLyoqCi0gKiAgSW1wbGVtZW50cyBhIGNvbXBvbmVudCB0aGF0IG1hbmFnZXMgYW4gSFRNTCAmbHQ7c2VsZWN0Jmd0OyBmb3JtIGVsZW1lbnQuCi0gKiAgVGhlIG1vc3QgY29tbW9uIHNpdHVhdGlvbiwgdXNpbmcgYSAmbHQ7c2VsZWN0Jmd0OyB0byBzZXQgYSBzcGVjaWZpYwotICogIHByb3BlcnR5IG9mIHNvbWUgb2JqZWN0LCBpcyBiZXN0IGhhbmRsZWQgdXNpbmcgYSB7QGxpbmsgUHJvcGVydHlTZWxlY3Rpb259IGNvbXBvbmVudC4KLSAqCi0gKiAgWzxhIGhyZWY9Ii4uLy4uLy4uLy4uLy4uL0NvbXBvbmVudFJlZmVyZW5jZS9TZWxlY3QuaHRtbCI+Q29tcG9uZW50IFJlZmVyZW5jZTwvYT5dCi0gKiAKLSAqICA8cD5PdGhlcndpc2UsIHRoaXMgY29tcG9uZW50IGlzIHZlcnkgc2ltaWxhciB0byB7QGxpbmsgUmFkaW9Hcm91cH0uCi0gKgotICoKLSAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiAgQHZlcnNpb24gJElkJAotICogCi0gKiovCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTZWxlY3QgZXh0ZW5kcyBBYnN0cmFjdEZvcm1Db21wb25lbnQKLXsKLSAgICBwcml2YXRlIGJvb2xlYW4gX3Jld2luZGluZzsKLSAgICBwcml2YXRlIGJvb2xlYW4gX3JlbmRlcmluZzsKLQotICAgIHByaXZhdGUgU2V0IF9zZWxlY3Rpb25zOwotICAgIHByaXZhdGUgaW50IF9uZXh0T3B0aW9uSWQ7Ci0KLSAgICAvKioKLSAgICAgKiAgVXNlZCBieSB0aGUgPGNvZGU+U2VsZWN0PC9jb2RlPiB0byByZWNvcmQgaXRzZWxmIGFzIGEKLSAgICAgKiAge0BsaW5rIElSZXF1ZXN0Q3ljbGV9IGF0dHJpYnV0ZSwgc28gdGhhdCB0aGUKLSAgICAgKiAge0BsaW5rIE9wdGlvbn0gY29tcG9uZW50cyBpdCB3cmFwcyBjYW4gaGF2ZSBhY2Nlc3MgdG8gaXQuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQVRUUklCVVRFX05BTUUgPSAib3JnLmFwYWNoZS50YXBlc3RyeS5hY3RpdmUuU2VsZWN0IjsKLQotICAgIHB1YmxpYyBzdGF0aWMgU2VsZWN0IGdldChJUmVxdWVzdEN5Y2xlIGN5Y2xlKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChTZWxlY3QpIGN5Y2xlLmdldEF0dHJpYnV0ZShBVFRSSUJVVEVfTkFNRSk7Ci0gICAgfQotCi0gICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNEaXNhYmxlZCgpOwotCi0gICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNNdWx0aXBsZSgpOwotCi0gICAgcHVibGljIGJvb2xlYW4gaXNSZXdpbmRpbmcoKQotICAgIHsKLSAgICAgICAgaWYgKCFfcmVuZGVyaW5nKQotICAgICAgICAgICAgdGhyb3cgVGFwZXN0cnkuY3JlYXRlUmVuZGVyT25seVByb3BlcnR5RXhjZXB0aW9uKHRoaXMsICJyZXdpbmRpbmciKTsKLQotICAgICAgICByZXR1cm4gX3Jld2luZGluZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5leHRPcHRpb25JZCgpCi0gICAgewotICAgICAgICBpZiAoIV9yZW5kZXJpbmcpCi0gICAgICAgICAgICB0aHJvdyBUYXBlc3RyeS5jcmVhdGVSZW5kZXJPbmx5UHJvcGVydHlFeGNlcHRpb24odGhpcywgIm5leHRPcHRpb25JZCIpOwotCi0gICAgICAgIC8vIFJldHVybiBpdCBhcyBhIGhleCB2YWx1ZS4KLQotICAgICAgICByZXR1cm4gSW50ZWdlci50b1N0cmluZyhfbmV4dE9wdGlvbklkKyspOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzU2VsZWN0ZWQoU3RyaW5nIHZhbHVlKQotICAgIHsKLSAgICAgICAgaWYgKF9zZWxlY3Rpb25zID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgcmV0dXJuIF9zZWxlY3Rpb25zLmNvbnRhaW5zKHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgUmVuZGVycyB0aGUgJmx0O29wdGlvbiZndDsgZWxlbWVudCwgb3IgcmVzcG9uZHMgd2hlbiB0aGUgZm9ybSBjb250YWluaW5nIHRoZSBlbGVtZW50Ci0gICAgICogIGlzIHN1Ym1pdHRlZCAoYnkgY2hlY2tpbmcge0BsaW5rIElGb3JtI2lzUmV3aW5kaW5nKCl9LgotICAgICAqKi8KLQotICAgIHByb3RlY3RlZCB2b2lkIHJlbmRlckNvbXBvbmVudChJTWFya3VwV3JpdGVyIHdyaXRlciwgSVJlcXVlc3RDeWNsZSBjeWNsZSkKLSAgICB7Ci0gICAgICAgIElGb3JtIGZvcm0gPSBnZXRGb3JtKGN5Y2xlKTsKLQotICAgICAgICBpZiAoY3ljbGUuZ2V0QXR0cmlidXRlKEFUVFJJQlVURV9OQU1FKSAhPSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICBUYXBlc3RyeS5nZXRNZXNzYWdlKCJTZWxlY3QubWF5LW5vdC1uZXN0IiksCi0gICAgICAgICAgICAgICAgdGhpcywKLSAgICAgICAgICAgICAgICBudWxsLAotICAgICAgICAgICAgICAgIG51bGwpOwotCi0gICAgICAgIC8vIEl0IGlzbid0IGVub3VnaCB0byBrbm93IHdoZXRoZXIgdGhlIGN5Y2xlIGluIGdlbmVyYWwgaXMgcmV3aW5kaW5nLCBuZWVkIHRvIGtub3cKLSAgICAgICAgLy8gc3BlY2lmaWNhbGx5IGlmIHRoZSBmb3JtIHdoaWNoIGNvbnRhaW5zIHRoaXMgY29tcG9uZW50IGlzIHJld2luZGluZy4KLQotICAgICAgICBfcmV3aW5kaW5nID0gZm9ybS5pc1Jld2luZGluZygpOwotCi0gICAgICAgIC8vIFVzZWQgd2hldGhlciByZXdpbmRpbmcgb3Igbm90LgotCi0gICAgICAgIFN0cmluZyBuYW1lID0gZm9ybS5nZXRFbGVtZW50SWQodGhpcyk7Ci0KLSAgICAgICAgY3ljbGUuc2V0QXR0cmlidXRlKEFUVFJJQlVURV9OQU1FLCB0aGlzKTsKLQotICAgICAgICBpZiAoX3Jld2luZGluZykKLSAgICAgICAgewotICAgICAgICAgICAgX3NlbGVjdGlvbnMgPSBidWlsZFNlbGVjdGlvbnMoY3ljbGUsIG5hbWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgd3JpdGVyLmJlZ2luKCJzZWxlY3QiKTsKLQotICAgICAgICAgICAgd3JpdGVyLmF0dHJpYnV0ZSgibmFtZSIsIG5hbWUpOwotCi0gICAgICAgICAgICBpZiAoaXNNdWx0aXBsZSgpKQotICAgICAgICAgICAgICAgIHdyaXRlci5hdHRyaWJ1dGUoIm11bHRpcGxlIiwgIm11bHRpcGxlIik7Ci0KLSAgICAgICAgICAgIGlmIChpc0Rpc2FibGVkKCkpCi0gICAgICAgICAgICAgICAgd3JpdGVyLmF0dHJpYnV0ZSgiZGlzYWJsZWQiLCAiZGlzYWJsZWQiKTsKLQotICAgICAgICAgICAgcmVuZGVySW5mb3JtYWxQYXJhbWV0ZXJzKHdyaXRlciwgY3ljbGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgX3JlbmRlcmluZyA9IHRydWU7Ci0gICAgICAgIF9uZXh0T3B0aW9uSWQgPSAwOwotCi0gICAgICAgIHJlbmRlckJvZHkod3JpdGVyLCBjeWNsZSk7Ci0KLSAgICAgICAgaWYgKCFfcmV3aW5kaW5nKQotICAgICAgICB7Ci0gICAgICAgICAgICB3cml0ZXIuZW5kKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBjeWNsZS5yZW1vdmVBdHRyaWJ1dGUoQVRUUklCVVRFX05BTUUpOwotCi0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgY2xlYW51cEFmdGVyUmVuZGVyKElSZXF1ZXN0Q3ljbGUgY3ljbGUpCi0gICAgewotICAgICAgICBfcmVuZGVyaW5nID0gZmFsc2U7Ci0gICAgICAgIF9zZWxlY3Rpb25zID0gbnVsbDsKLQotICAgICAgICBzdXBlci5jbGVhbnVwQWZ0ZXJSZW5kZXIoY3ljbGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBDdXQtYW5kLXBhc3RlIHdpdGgge0BsaW5rIFJhZGlvR3JvdXB9IQotICAgICAqCi0gICAgICoqLwotCi0gICAgcHJpdmF0ZSBTZXQgYnVpbGRTZWxlY3Rpb25zKElSZXF1ZXN0Q3ljbGUgY3ljbGUsIFN0cmluZyBwYXJhbWV0ZXJOYW1lKQotICAgIHsKLSAgICAgICAgUmVxdWVzdENvbnRleHQgY29udGV4dCA9IGN5Y2xlLmdldFJlcXVlc3RDb250ZXh0KCk7Ci0KLSAgICAgICAgU3RyaW5nW10gcGFyYW1ldGVycyA9IGNvbnRleHQuZ2V0UGFyYW1ldGVycyhwYXJhbWV0ZXJOYW1lKTsKLQotICAgICAgICBpZiAocGFyYW1ldGVycyA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgaW50IGxlbmd0aCA9IHBhcmFtZXRlcnMubGVuZ3RoOwotCi0gICAgICAgIGludCBzaXplID0gKHBhcmFtZXRlcnMubGVuZ3RoID4gMzApID8gMTAxIDogNzsKLQotICAgICAgICBTZXQgcmVzdWx0ID0gbmV3IEhhc2hTZXQoc2l6ZSk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKLSAgICAgICAgICAgIHJlc3VsdC5hZGQocGFyYW1ldGVyc1tpXSk7Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2Zvcm0vU2VsZWN0Lmp3YyBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9mb3JtL1NlbGVjdC5qd2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4NTA3ZWQuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2Zvcm0vU2VsZWN0Lmp3YworKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAgCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPCEtLSAkSWQkIC0tPgotPCFET0NUWVBFIGNvbXBvbmVudC1zcGVjaWZpY2F0aW9uIFBVQkxJQwotICAiLS8vQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24vL1RhcGVzdHJ5IFNwZWNpZmljYXRpb24gMy4wLy9FTiIKLSAgImh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvdGFwZXN0cnkvZHRkL1RhcGVzdHJ5XzNfMC5kdGQiPgotCi08Y29tcG9uZW50LXNwZWNpZmljYXRpb24gY2xhc3M9Im9yZy5hcGFjaGUudGFwZXN0cnkuZm9ybS5TZWxlY3QiPgotCi0gIDxkZXNjcmlwdGlvbj4KLSAgQ3JlYXRlcyBhbiBIVE1MIHNlbGVjdCBwb3B1bGF0ZWQgd2l0aCBhIG51bWJlciBvZiBvcHRpb25zLgotICA8L2Rlc2NyaXB0aW9uPgotCi0gIDxwYXJhbWV0ZXIgbmFtZT0ibXVsdGlwbGUiIHR5cGU9ImJvb2xlYW4iIGRpcmVjdGlvbj0iaW4iLz4KLSAgPHBhcmFtZXRlciBuYW1lPSJkaXNhYmxlZCIgdHlwZT0iYm9vbGVhbiIgZGlyZWN0aW9uPSJpbiIvPgotCi0gIDxyZXNlcnZlZC1wYXJhbWV0ZXIgbmFtZT0ibmFtZSIvPgotCi0gIDxwcm9wZXJ0eS1zcGVjaWZpY2F0aW9uIG5hbWU9Im5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KLSAgPHByb3BlcnR5LXNwZWNpZmljYXRpb24gbmFtZT0iZm9ybSIgdHlwZT0ib3JnLmFwYWNoZS50YXBlc3RyeS5JRm9ybSIvPgotCi08L2NvbXBvbmVudC1zcGVjaWZpY2F0aW9uPgpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2Zvcm0vU2VsZWN0UHJvcGVydHlTZWxlY3Rpb25SZW5kZXJlci5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2Zvcm0vU2VsZWN0UHJvcGVydHlTZWxlY3Rpb25SZW5kZXJlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTQ2YWQ2Li4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9mb3JtL1NlbGVjdFByb3BlcnR5U2VsZWN0aW9uUmVuZGVyZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmZvcm07Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklNYXJrdXBXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVxdWVzdEN5Y2xlOwotCi0vKioKLSAqICBJbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgSVByb3BlcnR5U2VsZWN0aW9uUmVuZGVyZXJ9IHRoYXQKLSAqICBwcm9kdWNlcyBhICZsdDtzZWxlY3QmZ3Q7IGVsZW1lbnQgKGNvbnRhaW5pbmcgJmx0O29wdGlvbiZndDsgZWxlbWVudHMpLgotICoKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICoKLSAqKi8KLQotcHVibGljIGNsYXNzIFNlbGVjdFByb3BlcnR5U2VsZWN0aW9uUmVuZGVyZXIKLSAgICBpbXBsZW1lbnRzIElQcm9wZXJ0eVNlbGVjdGlvblJlbmRlcmVyCi17Ci0gICAgLyoqCi0gICAgICogIFdyaXRlcyB0aGUgJmx0O3NlbGVjdCZndDsgZWxlbWVudC4gIElmIHRoZQotICAgICAqICB7QGxpbmsgUHJvcGVydHlTZWxlY3Rpb259IGlzIHtAbGluayBQcm9wZXJ0eVNlbGVjdGlvbiNpc0Rpc2FibGVkKCkgZGlzYWJsZWR9Ci0gICAgICogIHRoZW4gYSA8Y29kZT5kaXNhYmxlZDwvY29kZT4gYXR0cmlidXRlIGlzIHdyaXR0ZW4gaW50byB0aGUgdGFnCi0gICAgICogICh0aG91Z2ggTmF2aWdhdG9yIDQgd2lsbCBpZ25vcmUgdGhpcykuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCBiZWdpblJlbmRlcigKLSAgICAgICAgUHJvcGVydHlTZWxlY3Rpb24gY29tcG9uZW50LAotICAgICAgICBJTWFya3VwV3JpdGVyIHdyaXRlciwKLSAgICAgICAgSVJlcXVlc3RDeWNsZSBjeWNsZSkKLSAgICB7Ci0gICAgICAgIHdyaXRlci5iZWdpbigic2VsZWN0Iik7Ci0gICAgICAgIHdyaXRlci5hdHRyaWJ1dGUoIm5hbWUiLCBjb21wb25lbnQuZ2V0TmFtZSgpKTsKLQotICAgICAgICBpZiAoY29tcG9uZW50LmlzRGlzYWJsZWQoKSkKLSAgICAgICAgICAgIHdyaXRlci5hdHRyaWJ1dGUoImRpc2FibGVkIiwgImRpc2FibGVkIik7Ci0KLSAgICAgICAgd3JpdGVyLnByaW50bG4oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgQ2xvc2VzIHRoZSAmbHQ7c2VsZWN0Jmd0OyBlbGVtZW50LgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgZW5kUmVuZGVyKAotICAgICAgICBQcm9wZXJ0eVNlbGVjdGlvbiBjb21wb25lbnQsCi0gICAgICAgIElNYXJrdXBXcml0ZXIgd3JpdGVyLAotICAgICAgICBJUmVxdWVzdEN5Y2xlIGN5Y2xlKQotICAgIHsKLSAgICAgICAgd3JpdGVyLmVuZCgpOyAvLyA8c2VsZWN0PgotICAgIH0KLQotICAgIC8qKgotICAgICAqICBXcml0ZXMgYW4gJmx0O29wdGlvbiZndDsgZWxlbWVudC4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIHJlbmRlck9wdGlvbigKLSAgICAgICAgUHJvcGVydHlTZWxlY3Rpb24gY29tcG9uZW50LAotICAgICAgICBJTWFya3VwV3JpdGVyIHdyaXRlciwKLSAgICAgICAgSVJlcXVlc3RDeWNsZSBjeWNsZSwKLSAgICAgICAgSVByb3BlcnR5U2VsZWN0aW9uTW9kZWwgbW9kZWwsCi0gICAgICAgIE9iamVjdCBvcHRpb24sCi0gICAgICAgIGludCBpbmRleCwKLSAgICAgICAgYm9vbGVhbiBzZWxlY3RlZCkKLSAgICB7Ci0gICAgICAgIHdyaXRlci5iZWdpbkVtcHR5KCJvcHRpb24iKTsKLSAgICAgICAgd3JpdGVyLmF0dHJpYnV0ZSgidmFsdWUiLCBtb2RlbC5nZXRWYWx1ZShpbmRleCkpOwotCi0gICAgICAgIGlmIChzZWxlY3RlZCkKLSAgICAgICAgICAgIHdyaXRlci5hdHRyaWJ1dGUoInNlbGVjdGVkIiwgInNlbGVjdGVkIik7Ci0KLSAgICAgICAgd3JpdGVyLnByaW50KG1vZGVsLmdldExhYmVsKGluZGV4KSk7Ci0KLSAgICAgICAgd3JpdGVyLmVuZCgpOwotICAgICAgICAKLSAgICAgICAgd3JpdGVyLnByaW50bG4oKTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2Zvcm0vU3RyaW5nUHJvcGVydHlTZWxlY3Rpb25Nb2RlbC5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2Zvcm0vU3RyaW5nUHJvcGVydHlTZWxlY3Rpb25Nb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOWE1OTFmLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9mb3JtL1N0cmluZ1Byb3BlcnR5U2VsZWN0aW9uTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmZvcm07Ci0KLS8qKgotICogIEltcGxlbWVudGF0aW9uIG9mIHtAbGluayBJUHJvcGVydHlTZWxlY3Rpb25Nb2RlbH0gdGhhdCBhbGxvd3Mgb25lIFN0cmluZyBmcm9tCi0gKiAgYW4gYXJyYXkgb2YgU3RyaW5ncyB0byBiZSBzZWxlY3RlZCBhcyB0aGUgcHJvcGVydHkuCi0gKgotICogIDxwPlVzZXMgYSBzaW1wbGUgaW5kZXggbnVtYmVyIGFzIHRoZSB2YWx1ZSAodXNlZCB0byByZXByZXNlbnQgdGhlIHNlbGVjdGVkIFN0cmluZykuCi0gKiAgVGhpcyBhc3N1bWVzIHRoYXQgdGhlIHBvc3NpYmxlIHZhbHVlcyBmb3IgdGhlIFN0cmluZ3Mgd2lsbCByZW1haW4gY29uc3RhbnQgYmV0d2VlbgotICogIHJlcXVlc3QgY3ljbGVzLgotICoKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogCi0gKiovCi0KLXB1YmxpYyBjbGFzcyBTdHJpbmdQcm9wZXJ0eVNlbGVjdGlvbk1vZGVsIGltcGxlbWVudHMgSVByb3BlcnR5U2VsZWN0aW9uTW9kZWwKLXsKLSAgICBwcml2YXRlIFN0cmluZ1tdIG9wdGlvbnM7Ci0KLSAgICAvKioKLSAgICAgKiBTdGFuZGFyZCBjb25zdHJ1Y3Rvci4KLSAgICAgKgotICAgICAqIFRoZSBvcHRpb25zIGFyZSByZXRhaW5lZCAobm90IGNvcGllZCkuCi0gICAgICoqLwotCi0gICAgcHVibGljIFN0cmluZ1Byb3BlcnR5U2VsZWN0aW9uTW9kZWwoU3RyaW5nW10gb3B0aW9ucykKLSAgICB7Ci0gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRPcHRpb25Db3VudCgpCi0gICAgewotICAgICAgICByZXR1cm4gb3B0aW9ucy5sZW5ndGg7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRPcHRpb24oaW50IGluZGV4KQotICAgIHsKLSAgICAgICAgcmV0dXJuIG9wdGlvbnNbaW5kZXhdOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBMYWJlbHMgbWF0Y2ggb3B0aW9ucy4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoaW50IGluZGV4KQotICAgIHsKLSAgICAgICAgcmV0dXJuIG9wdGlvbnNbaW5kZXhdOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBWYWx1ZXMgYXJlIGluZGV4ZXMgaW50byB0aGUgYXJyYXkgb2Ygb3B0aW9ucy4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoaW50IGluZGV4KQotICAgIHsKLSAgICAgICAgcmV0dXJuIEludGVnZXIudG9TdHJpbmcoaW5kZXgpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgdHJhbnNsYXRlVmFsdWUoU3RyaW5nIHZhbHVlKQotICAgIHsKLSAgICAgICAgaW50IGluZGV4OwotCi0gICAgICAgIGluZGV4ID0gSW50ZWdlci5wYXJzZUludCh2YWx1ZSk7Ci0KLSAgICAgICAgcmV0dXJuIG9wdGlvbnNbaW5kZXhdOwotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9mb3JtL1N1Ym1pdC5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2Zvcm0vU3VibWl0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkZTMzNWMuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2Zvcm0vU3VibWl0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuZm9ybTsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUFjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUJpbmRpbmc7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JRm9ybTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklNYXJrdXBXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVxdWVzdEN5Y2xlOwotCi0KLS8qKgotICogIEltcGxlbWVudHMgYSBjb21wb25lbnQgdGhhdCBtYW5hZ2VzIGFuIEhUTUwgJmx0O2lucHV0IHR5cGU9c3VibWl0Jmd0OyBmb3JtIGVsZW1lbnQuCi0gKiAKLSAqICBbPGEgaHJlZj0iLi4vLi4vLi4vLi4vLi4vQ29tcG9uZW50UmVmZXJlbmNlL1N1Ym1pdC5odG1sIj5Db21wb25lbnQgUmVmZXJlbmNlPC9hPl0KLSAqCi0gKiAgPHA+VGhpcyBjb21wb25lbnQgaXMgZ2VuZXJhbGx5IG9ubHkgdXNlZCB3aGVuIHRoZSBmb3JtIGhhcyBtdWx0aXBsZQotICogIHN1Ym1pdCBidXR0b25zLCBhbmQgaXQgaXMgaW1wb3J0YW50IGZvciB0aGUgYXBwbGljYXRpb24gdG8ga25vdwotICogIHdoaWNoIG9uZSB3YXMgcHJlc3NlZC4gIFlvdSBtYXkgYWxzbyB3YW50IHRvIHVzZQotICogIHtAbGluayBJbWFnZVN1Ym1pdH0gd2hpY2ggYWNjb21wbGlzaGVzIG11Y2ggdGhlIHNhbWUgdGhpbmcsIGJ1dCB1c2VzCi0gKiAgYSBncmFwaGljIGltYWdlIGluc3RlYWQuCi0gKgotICoKLSAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiAgQHZlcnNpb24gJElkJAotICogCi0gKiovCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTdWJtaXQgZXh0ZW5kcyBBYnN0cmFjdEZvcm1Db21wb25lbnR7Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCByZW5kZXJDb21wb25lbnQoSU1hcmt1cFdyaXRlciB3cml0ZXIsIElSZXF1ZXN0Q3ljbGUgY3ljbGUpCi0gICAgewotCi0gICAgICAgIElGb3JtIGZvcm0gPSBnZXRGb3JtKGN5Y2xlKTsKLQkJCi0gICAgICAgIGJvb2xlYW4gcmV3aW5kaW5nID0gZm9ybS5pc1Jld2luZGluZygpOwotCi0gICAgICAgIFN0cmluZyBuYW1lID0gZm9ybS5nZXRFbGVtZW50SWQodGhpcyk7Ci0KLSAgICAgICAgaWYgKHJld2luZGluZykKLSAgICAgICAgewotICAgICAgICAgICAgLy8gRG9uJ3QgYm90aGVyIGRvaW5nIGFueXRoaW5nIGlmIGRpc2FibGVkLgotCi0gICAgICAgICAgICBpZiAoaXNEaXNhYmxlZCgpKQotICAgICAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAgICAgLy8gSG93IHRvIGtub3cgd2hpY2ggU3VibWl0IGJ1dHRvbiB3YXMgYWN0dWFsbHkKLSAgICAgICAgICAgIC8vIGNsaWNrZWQ/ICBXaGVuIHN1Ym1pdHRlZCwgaXQgcHJvZHVjZXMgYSByZXF1ZXN0IHBhcmFtZXRlcgotICAgICAgICAgICAgLy8gd2l0aCBpdHMgbmFtZSBhbmQgdmFsdWUgKHRoZSB2YWx1ZSBzZXJ2ZXMgZG91YmxlIGR1dHkgYXMgYm90aAotICAgICAgICAgICAgLy8gdGhlIGxhYmVsIG9uIHRoZSBidXR0b24sIGFuZCB0aGUgcGFyYW1ldGVyIHZhbHVlKS4KLQotICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gY3ljbGUuZ2V0UmVxdWVzdENvbnRleHQoKS5nZXRQYXJhbWV0ZXIobmFtZSk7Ci0KLSAgICAgICAgICAgIC8vIElmIHRoZSB2YWx1ZSBpc24ndCB0aGVyZSwgdGhlbiB0aGlzIGJ1dHRvbiB3YXNuJ3QKLSAgICAgICAgICAgIC8vIHNlbGVjdGVkLgotCi0gICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgICAgIElCaW5kaW5nIHNlbGVjdGVkQmluZGluZyA9IGdldFNlbGVjdGVkQmluZGluZygpOwotCi0gICAgICAgICAgICBpZiAoc2VsZWN0ZWRCaW5kaW5nICE9IG51bGwpCi0gICAgICAgICAgICAgICAgc2VsZWN0ZWRCaW5kaW5nLnNldE9iamVjdChnZXRUYWcoKSk7Ci0KLSAgICAgICAgICAgIElBY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IGdldExpc3RlbmVyKCk7Ci0KLSAgICAgICAgICAgIGlmIChsaXN0ZW5lciAhPSBudWxsKQotICAgICAgICAgICAgICAgIGxpc3RlbmVyLmFjdGlvblRyaWdnZXJlZCh0aGlzLCBjeWNsZSk7Ci0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHdyaXRlci5iZWdpbkVtcHR5KCJpbnB1dCIpOwotICAgICAgICB3cml0ZXIuYXR0cmlidXRlKCJ0eXBlIiwgInN1Ym1pdCIpOwotICAgICAgICB3cml0ZXIuYXR0cmlidXRlKCJuYW1lIiwgbmFtZSk7Ci0KLSAgICAgICAgaWYgKGlzRGlzYWJsZWQoKSkKLSAgICAgICAgICAgIHdyaXRlci5hdHRyaWJ1dGUoImRpc2FibGVkIiwgImRpc2FibGVkIik7Ci0KLSAgICAgICAgU3RyaW5nIGxhYmVsID0gZ2V0TGFiZWwoKTsKLQotICAgICAgICBpZiAobGFiZWwgIT0gbnVsbCkKLSAgICAgICAgICAgIHdyaXRlci5hdHRyaWJ1dGUoInZhbHVlIiwgbGFiZWwpOwotCi0gICAgICAgIHJlbmRlckluZm9ybWFsUGFyYW1ldGVycyh3cml0ZXIsIGN5Y2xlKTsKLQotICAgICAgICB3cml0ZXIuY2xvc2VUYWcoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldExhYmVsKCk7Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgSUJpbmRpbmcgZ2V0U2VsZWN0ZWRCaW5kaW5nKCk7Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0Rpc2FibGVkKCk7Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgSUFjdGlvbkxpc3RlbmVyIGdldExpc3RlbmVyKCk7Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgT2JqZWN0IGdldFRhZygpOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2Zvcm0vU3VibWl0Lmp3YyBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9mb3JtL1N1Ym1pdC5qd2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzYThkM2YuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2Zvcm0vU3VibWl0Lmp3YworKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAgCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPCEtLSAkSWQkIC0tPgotPCFET0NUWVBFIGNvbXBvbmVudC1zcGVjaWZpY2F0aW9uIFBVQkxJQyAKLSAgIi0vL0FwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLy9UYXBlc3RyeSBTcGVjaWZpY2F0aW9uIDMuMC8vRU4iIAotICAiaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy90YXBlc3RyeS9kdGQvVGFwZXN0cnlfM18wLmR0ZCI+Ci0gIAotPGNvbXBvbmVudC1zcGVjaWZpY2F0aW9uIGNsYXNzPSJvcmcuYXBhY2hlLnRhcGVzdHJ5LmZvcm0uU3VibWl0IiBhbGxvdy1ib2R5PSJubyI+Ci0KLSAgPGRlc2NyaXB0aW9uPgotICBDcmVhdGVzIGEgbGFiZWxlZCBzdWJtaXQgYnV0dG9uIHdpdGhpbiBhIGZvcm0uCi0gIDwvZGVzY3JpcHRpb24+Ci0KLSAgPHBhcmFtZXRlciBuYW1lPSJsYWJlbCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgZGlyZWN0aW9uPSJpbiIvPgotICA8cGFyYW1ldGVyIG5hbWU9ImRpc2FibGVkIiB0eXBlPSJib29sZWFuIiBkaXJlY3Rpb249ImluIi8+Ci0gIDxwYXJhbWV0ZXIgbmFtZT0ic2VsZWN0ZWQiLz4KLSAgPHBhcmFtZXRlciBuYW1lPSJ0YWciIHR5cGU9ImphdmEubGFuZy5PYmplY3QiIGRpcmVjdGlvbj0iaW4iLz4KLSAgPHBhcmFtZXRlciBuYW1lPSJsaXN0ZW5lciIgCi0gIAl0eXBlPSJvcmcuYXBhY2hlLnRhcGVzdHJ5LklBY3Rpb25MaXN0ZW5lciIKLSAgCWRpcmVjdGlvbj0iaW4iLz4KLSAgCi0gIDxyZXNlcnZlZC1wYXJhbWV0ZXIgbmFtZT0ibmFtZSIvPgotICA8cmVzZXJ2ZWQtcGFyYW1ldGVyIG5hbWU9InR5cGUiLz4KLQotICA8cHJvcGVydHktc3BlY2lmaWNhdGlvbiBuYW1lPSJuYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+Ci0gIDxwcm9wZXJ0eS1zcGVjaWZpY2F0aW9uIG5hbWU9ImZvcm0iIHR5cGU9Im9yZy5hcGFjaGUudGFwZXN0cnkuSUZvcm0iLz4gIAotICAKLTwvY29tcG9uZW50LXNwZWNpZmljYXRpb24+CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZm9ybS9UZXh0QXJlYS5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2Zvcm0vVGV4dEFyZWEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZjMzUxNi4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZm9ybS9UZXh0QXJlYS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuZm9ybTsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUZvcm07Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JTWFya3VwV3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlcXVlc3RDeWNsZTsKLQotLyoqCi0gKiAgSW1wbGVtZW50cyBhIGNvbXBvbmVudCB0aGF0IG1hbmFnZXMgYW4gSFRNTCAmbHQ7dGV4dGFyZWEmZ3Q7IGZvcm0gZWxlbWVudC4KLSAqCi0gKiAgWzxhIGhyZWY9Ii4uLy4uLy4uLy4uLy4uL0NvbXBvbmVudFJlZmVyZW5jZS9UZXh0QXJlYS5odG1sIj5Db21wb25lbnQgUmVmZXJlbmNlPC9hPl0KLSAqCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAKLSAqKi8KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFRleHRBcmVhIGV4dGVuZHMgQWJzdHJhY3RGb3JtQ29tcG9uZW50Ci17Ci0KLSAgICAvKioKLSAgICAgKiAgUmVuZGVycyB0aGUgZm9ybSBlbGVtZW50LCBvciByZXNwb25kcyB3aGVuIHRoZSBmb3JtIGNvbnRhaW5pbmcgdGhlIGVsZW1lbnQKLSAgICAgKiAgaXMgc3VibWl0dGVkIChieSBjaGVja2luZyB7QGxpbmsgRm9ybSNpc1Jld2luZGluZygpfS4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHByb3RlY3RlZCB2b2lkIHJlbmRlckNvbXBvbmVudChJTWFya3VwV3JpdGVyIHdyaXRlciwgSVJlcXVlc3RDeWNsZSBjeWNsZSkKLSAgICB7Ci0gICAgICAgIElGb3JtIGZvcm0gPSBnZXRGb3JtKGN5Y2xlKTsKLQkJCi0gICAgICAgIC8vIEl0IGlzbid0IGVub3VnaCB0byBrbm93IHdoZXRoZXIgdGhlIGN5Y2xlIGluIGdlbmVyYWwgaXMgcmV3aW5kaW5nLCBuZWVkIHRvIGtub3cKLSAgICAgICAgLy8gc3BlY2lmaWNhbGx5IGlmIHRoZSBmb3JtIHdoaWNoIGNvbnRhaW5zIHRoaXMgY29tcG9uZW50IGlzIHJld2luZGluZy4KLQotICAgICAgICBib29sZWFuIHJld2luZGluZyA9IGZvcm0uaXNSZXdpbmRpbmcoKTsKLQotICAgICAgICAvLyBVc2VkIHdoZXRoZXIgcmV3aW5kaW5nIG9yIG5vdC4KLQotICAgICAgICBTdHJpbmcgbmFtZSA9IGZvcm0uZ2V0RWxlbWVudElkKHRoaXMpOwotCi0gICAgICAgIGlmIChyZXdpbmRpbmcpCi0gICAgICAgIHsKLSAgICAgICAgCWlmICghaXNEaXNhYmxlZCgpKQotCSAgICAgICAgICAgIHNldFZhbHVlKGN5Y2xlLmdldFJlcXVlc3RDb250ZXh0KCkuZ2V0UGFyYW1ldGVyKG5hbWUpKTsKLQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoY3ljbGUuaXNSZXdpbmRpbmcoKSkKLSAgICAgICAgCXJldHVybjsKLQotICAgICAgICB3cml0ZXIuYmVnaW4oInRleHRhcmVhIik7Ci0KLSAgICAgICAgd3JpdGVyLmF0dHJpYnV0ZSgibmFtZSIsIG5hbWUpOwotCi0gICAgICAgIGlmIChpc0Rpc2FibGVkKCkpCi0gICAgICAgICAgICB3cml0ZXIuYXR0cmlidXRlKCJkaXNhYmxlZCIsICJkaXNhYmxlZCIpOwotCi0gICAgICAgIHJlbmRlckluZm9ybWFsUGFyYW1ldGVycyh3cml0ZXIsIGN5Y2xlKTsKLQotICAgICAgICBTdHJpbmcgdmFsdWUgPSBnZXRWYWx1ZSgpOwotCi0gICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKQotICAgICAgICAgICAgd3JpdGVyLnByaW50KHZhbHVlKTsKLQotICAgICAgICB3cml0ZXIuZW5kKCk7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0Rpc2FibGVkKCk7Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFZhbHVlKCk7Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9mb3JtL1RleHRBcmVhLmp3YyBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9mb3JtL1RleHRBcmVhLmp3YwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE2ZTU4NC4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZm9ybS9UZXh0QXJlYS5qd2MKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gIAotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTwhLS0gJElkJCAtLT4KLTwhRE9DVFlQRSBjb21wb25lbnQtc3BlY2lmaWNhdGlvbiBQVUJMSUMgCi0gICItLy9BcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi8vVGFwZXN0cnkgU3BlY2lmaWNhdGlvbiAzLjAvL0VOIiAKLSAgImh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvdGFwZXN0cnkvZHRkL1RhcGVzdHJ5XzNfMC5kdGQiPgotICAKLTxjb21wb25lbnQtc3BlY2lmaWNhdGlvbiBjbGFzcz0ib3JnLmFwYWNoZS50YXBlc3RyeS5mb3JtLlRleHRBcmVhIiBhbGxvdy1ib2R5PSJubyI+Ci0KLSAgPGRlc2NyaXB0aW9uPgotICBBIG11bHRpLWxpbmUgdGV4dCBhcmVhLgotICA8L2Rlc2NyaXB0aW9uPgotICAKLSAgPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgcmVxdWlyZWQ9InllcyIgZGlyZWN0aW9uPSJmb3JtIi8+Ci0gIAotICA8cGFyYW1ldGVyIG5hbWU9ImRpc2FibGVkIiB0eXBlPSJib29sZWFuIiBkaXJlY3Rpb249ImluIi8+Ci0gIAotICA8cmVzZXJ2ZWQtcGFyYW1ldGVyIG5hbWU9Im5hbWUiLz4KLSAgCi0gIDxwcm9wZXJ0eS1zcGVjaWZpY2F0aW9uIG5hbWU9Im5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KLSAgPHByb3BlcnR5LXNwZWNpZmljYXRpb24gbmFtZT0iZm9ybSIgdHlwZT0ib3JnLmFwYWNoZS50YXBlc3RyeS5JRm9ybSIvPgotICAKLTwvY29tcG9uZW50LXNwZWNpZmljYXRpb24+CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZm9ybS9UZXh0RmllbGQuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9mb3JtL1RleHRGaWVsZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjMyZTU2Li4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9mb3JtL1RleHRGaWVsZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuZm9ybTsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUJpbmRpbmc7Ci0KLS8qKgotICogIEltcGxlbWVudHMgYSBjb21wb25lbnQgdGhhdCBtYW5hZ2VzIGFuIEhUTUwgJmx0O2lucHV0IHR5cGU9dGV4dCZndDsgb3IKLSAqICAmbHQ7aW5wdXQgdHlwZT1wYXNzd29yZCZndDsgZm9ybSBlbGVtZW50LgotICoKLSAqICBbPGEgaHJlZj0iLi4vLi4vLi4vLi4vLi4vQ29tcG9uZW50UmVmZXJlbmNlL1RleHRGaWVsZC5odG1sIj5Db21wb25lbnQgUmVmZXJlbmNlPC9hPl0KLSAqCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogIEB2ZXJzaW9uICRJZCQKLSAqIAotICoqLwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVGV4dEZpZWxkIGV4dGVuZHMgQWJzdHJhY3RUZXh0RmllbGQKLXsKLSAgICBwdWJsaWMgYWJzdHJhY3QgSUJpbmRpbmcgZ2V0VmFsdWVCaW5kaW5nKCk7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHJlYWRWYWx1ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gKFN0cmluZykgZ2V0VmFsdWVCaW5kaW5nKCkuZ2V0T2JqZWN0KCJ2YWx1ZSIsIFN0cmluZy5jbGFzcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdXBkYXRlVmFsdWUoU3RyaW5nIHZhbHVlKQotICAgIHsKLSAgICAgICAgZ2V0VmFsdWVCaW5kaW5nKCkuc2V0U3RyaW5nKHZhbHVlKTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2Zvcm0vVGV4dEZpZWxkLmp3YyBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9mb3JtL1RleHRGaWVsZC5qd2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwMDIwOGQuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2Zvcm0vVGV4dEZpZWxkLmp3YworKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAgCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPCEtLSAkSWQkIC0tPgotPCFET0NUWVBFIGNvbXBvbmVudC1zcGVjaWZpY2F0aW9uIFBVQkxJQyAKLSAgIi0vL0FwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLy9UYXBlc3RyeSBTcGVjaWZpY2F0aW9uIDMuMC8vRU4iIAotICAiaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy90YXBlc3RyeS9kdGQvVGFwZXN0cnlfM18wLmR0ZCI+Ci0JCi08Y29tcG9uZW50LXNwZWNpZmljYXRpb24gY2xhc3M9Im9yZy5hcGFjaGUudGFwZXN0cnkuZm9ybS5UZXh0RmllbGQiIGFsbG93LWJvZHk9Im5vIj4KLQotICA8ZGVzY3JpcHRpb24+Ci0gIEEgdGV4dCBpbnB1dCBmaWVsZC4KLSAgPC9kZXNjcmlwdGlvbj4KLSAgCi0gIDxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciIHJlcXVpcmVkPSJ5ZXMiLz4KLSAgCi0gIDxwYXJhbWV0ZXIgbmFtZT0iZGlzYWJsZWQiIHR5cGU9ImJvb2xlYW4iIGRpcmVjdGlvbj0iaW4iLz4KLSAgCi0gIDxwYXJhbWV0ZXIgbmFtZT0iaGlkZGVuIiB0eXBlPSJib29sZWFuIiBkaXJlY3Rpb249ImluIi8+Ci0gIAotICA8cmVzZXJ2ZWQtcGFyYW1ldGVyIG5hbWU9Im5hbWUiLz4KLSAgPHJlc2VydmVkLXBhcmFtZXRlciBuYW1lPSJ0eXBlIi8+Ci0gIDxyZXNlcnZlZC1wYXJhbWV0ZXIgbmFtZT0idmFsdWUiLz4KLSAgCi0gIDxwcm9wZXJ0eS1zcGVjaWZpY2F0aW9uIG5hbWU9Im5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KLSAgPHByb3BlcnR5LXNwZWNpZmljYXRpb24gbmFtZT0iZm9ybSIgdHlwZT0ib3JnLmFwYWNoZS50YXBlc3RyeS5JRm9ybSIvPgotICAKLTwvY29tcG9uZW50LXNwZWNpZmljYXRpb24+CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZm9ybS9VcGxvYWQuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9mb3JtL1VwbG9hZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzFkYmMxLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9mb3JtL1VwbG9hZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuZm9ybTsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUZvcm07Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JTWFya3VwV3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlcXVlc3RDeWNsZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnJlcXVlc3QuSVVwbG9hZEZpbGU7Ci0KLS8qKgotICogIEZvcm0gZWxlbWVudCB1c2VkIHRvIHVwbG9hZCBmaWxlcy4gIEZvciB0aGUgbW9tZW1lbnQsIGl0IGlzIG5lY2Vzc2FyeSB0bwotICogIGV4cGxpY2l0bHkgc2V0IHRoZSBmb3JtJ3MgZW5jdHlwZSB0byAibXVsdGlwYXJ0L2Zvcm0tZGF0YSIuCi0gKiAKLSAqICBbPGEgaHJlZj0iLi4vLi4vLi4vLi4vLi4vQ29tcG9uZW50UmVmZXJlbmNlL1VwbG9hZC5odG1sIj5Db21wb25lbnQgUmVmZXJlbmNlPC9hPl0KLSAqIAotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQHNpbmNlIDEuMC44Ci0gKiAKLSAqKi8KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFVwbG9hZCBleHRlbmRzIEFic3RyYWN0Rm9ybUNvbXBvbmVudAotewotICAgIHByb3RlY3RlZCB2b2lkIHJlbmRlckNvbXBvbmVudChJTWFya3VwV3JpdGVyIHdyaXRlciwgSVJlcXVlc3RDeWNsZSBjeWNsZSkKLSAgICB7Ci0gICAgICAgIElGb3JtIGZvcm0gPSBnZXRGb3JtKGN5Y2xlKTsKLQkJCi0gICAgICAgIFN0cmluZyBuYW1lID0gZm9ybS5nZXRFbGVtZW50SWQodGhpcyk7Ci0KLSAgICAgICAgaWYgKGZvcm0uaXNSZXdpbmRpbmcoKSkKLSAgICAgICAgewotICAgICAgICAJaWYgKCFpc0Rpc2FibGVkKCkpCi0JICAgICAgICAgICAgc2V0RmlsZShjeWNsZS5nZXRSZXF1ZXN0Q29udGV4dCgpLmdldFVwbG9hZEZpbGUobmFtZSkpOwotCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotCQkvLyBGb3JjZSB0aGUgZm9ybSB0byB1c2UgdGhlIGNvcnJlY3QgZW5jb2RpbmcgdHlwZSBmb3IKLQkJLy8gZmlsZSB1cGxvYWRzLgotCQkKLQkJZm9ybS5zZXRFbmNvZGluZ1R5cGUoIm11bHRpcGFydC9mb3JtLWRhdGEiKTsKLQotICAgICAgICB3cml0ZXIuYmVnaW5FbXB0eSgiaW5wdXQiKTsKLSAgICAgICAgd3JpdGVyLmF0dHJpYnV0ZSgidHlwZSIsICJmaWxlIik7Ci0gICAgICAgIHdyaXRlci5hdHRyaWJ1dGUoIm5hbWUiLCBuYW1lKTsKLQotICAgICAgICBpZiAoaXNEaXNhYmxlZCgpKQotICAgICAgICAgICAgd3JpdGVyLmF0dHJpYnV0ZSgiZGlzYWJsZWQiLCAiZGlzYWJsZWQiKTsKLQotICAgICAgICAvLyBTaXplLCB3aWR0aCwgZXRjLiBjYW4gYmUgc3BlY2lmaWVkIGFzIGluZm9ybWFsIHBhcmFtZXRlcnMKLSAgICAgICAgLy8gKE5vdCBtYWtpbmcgdGhlIHNhbWUgbWlzdGFrZSBoZXJlIHRoYXQgd2FzIG1hZGUgd2l0aCBUZXh0RmllbGQKLSAgICAgICAgLy8gYW5kIGZyaWVuZHMpLgotCi0gICAgICAgIHJlbmRlckluZm9ybWFsUGFyYW1ldGVycyh3cml0ZXIsIGN5Y2xlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0Rpc2FibGVkKCk7Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRGaWxlKElVcGxvYWRGaWxlIGZpbGUpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9mb3JtL1VwbG9hZC5qd2MgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvZm9ybS9VcGxvYWQuandjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDgyY2JlLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9mb3JtL1VwbG9hZC5qd2MKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gIAotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQkIC0tPgotCi08IURPQ1RZUEUgY29tcG9uZW50LXNwZWNpZmljYXRpb24gUFVCTElDIAotICAiLS8vQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24vL1RhcGVzdHJ5IFNwZWNpZmljYXRpb24gMy4wLy9FTiIgCi0gICJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL3RhcGVzdHJ5L2R0ZC9UYXBlc3RyeV8zXzAuZHRkIj4KLQkKLQkKLTxjb21wb25lbnQtc3BlY2lmaWNhdGlvbiBjbGFzcz0ib3JnLmFwYWNoZS50YXBlc3RyeS5mb3JtLlVwbG9hZCIgYWxsb3ctYm9keT0ibm8iPgotCi0gIDxkZXNjcmlwdGlvbj4KLSAgQWxsb3dzIGEgZmlsZSB0byBiZSB1cGxvYWRlZCBhcyBwYXJ0IG9mIGEgZm9ybS4KLSAgPC9kZXNjcmlwdGlvbj4KLQotICA8cGFyYW1ldGVyIG5hbWU9ImZpbGUiIHR5cGU9Im9yZy5hcGFjaGUudGFwZXN0cnkucmVxdWVzdC5JVXBsb2FkRmlsZSIgcmVxdWlyZWQ9InllcyIgZGlyZWN0aW9uPSJmb3JtIj4KLSAgCTxkZXNjcmlwdGlvbj4KLSAgCVBhcmFtZXRlciB1cGRhdGVkIHdpdGggdGhlIGluZm9ybWF0aW9uIChmaWxlbmFtZSBhbmQgY29udGVudCkgb2YgdGhlIGZpbGUKLSAgCXdoZW4gdGhlIGZvcm0gaXMgc3VibWl0dGVkLgotICAJPC9kZXNjcmlwdGlvbj4KLSAgPC9wYXJhbWV0ZXI+Ci0KLSAgPHBhcmFtZXRlciBuYW1lPSJkaXNhYmxlZCIgdHlwZT0iYm9vbGVhbiIgZGlyZWN0aW9uPSJpbiIvPgotIAotICA8cmVzZXJ2ZWQtcGFyYW1ldGVyIG5hbWU9InR5cGUiLz4KLSAgPHJlc2VydmVkLXBhcmFtZXRlciBuYW1lPSJuYW1lIi8+Ci0gIAotICA8cHJvcGVydHktc3BlY2lmaWNhdGlvbiBuYW1lPSJuYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+Ci0gIDxwcm9wZXJ0eS1zcGVjaWZpY2F0aW9uIG5hbWU9ImZvcm0iIHR5cGU9Im9yZy5hcGFjaGUudGFwZXN0cnkuSUZvcm0iLz4KLSAgCi08L2NvbXBvbmVudC1zcGVjaWZpY2F0aW9uPgpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2Zvcm0vcGFja2FnZS5odG1sIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2Zvcm0vcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmI5NzAxLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9mb3JtL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLTwhZG9jdHlwZSBodG1sIHB1YmxpYyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci08IS0tICRJZCQgLS0+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlRhcGVzdHJ5OiBXZWIgQXBwbGljYXRpb24gRnJhbWV3b3JrPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotCi08cD5Db21wb25lbnRzIGZvciBpbXBsZW1lbnRpbmcgYmFzaWMgSFRNTCBGb3Jtcy4gIE1vc3QKLWNvbXBvbmVudHMgYXJlIHN0cmFpZ2h0IGZvcndhcmQgMToxIG1hcHBpbmdzIGJldHdlZW4gVGFwZXN0cnkgY29tcG9uZW50cyBhbmQgYQotY29ycmVzcG9uZGluZyBIVE1MIGVsZW1lbnQuIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LmZvcm0uUHJvcGVydHlTZWxlY3Rpb259IGlzIG1vcmUgY29tcGxpY2F0ZWQsCi1hcyBpdCBtYW5hZ2VzIHdheSBtb3JlIG9mIHRoZSBwcm9jZXNzIG9mIGltcGxlbWVudGluZyBhICZsdDtzZWxlY3QmZ3Q7IGFuZCBpdHMgJmx0O29wdGlvbiZndDtzLgotCi08cD5QYWNrYWdlIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LnZhbGlkfSBjb250YWlucyBtb3JlIGNvbXBsZXggY29tcG9uZW50cyB0aGF0IG5vdCBvbmx5IGNvbGxlY3QKLWlucHV0LCBidXQgdmFsaWRhdGUgaXQgYXMgd2VsbC4KLQotQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcCA8YSBocmVmPSJtYWlsdG86aGxzaGlwQGFwYWNoZS5vcmciPmhsc2hpcEBhcGFjaGUub3JnPC9hPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvaHRtbC9CYXNlUGFnZS5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2h0bWwvQmFzZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDUyYjQyMi4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvaHRtbC9CYXNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuaHRtbDsKLQotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5BYnN0cmFjdFBhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JTWFya3VwV3JpdGVyOwotCi0vKioKLSAqICBDb25jcmV0ZSBjbGFzcyBmb3IgSFRNTCBwYWdlcy4gTW9zdCBwYWdlcwotICogIHNob3VsZCBiZSBhYmxlIHRvIHNpbXBseSBzdWJjbGFzcyB0aGlzLCBhZGRpbmcgbmV3IHByb3BlcnRpZXMgYW5kCi0gKiAgbWV0aG9kcy4gIEFuIHVubGlrZWx5IGV4Y2VwdGlvbiB3b3VsZCBiZSBhIHBhZ2UgdGhhdCB3YXMgbm90IGJhc2VkCi0gKiAgb24gYSB0ZW1wbGF0ZS4KLSAqCi0gKiAgQHZlcnNpb24gJElkJAotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqKi8KLQotcHVibGljIGNsYXNzIEJhc2VQYWdlIGV4dGVuZHMgQWJzdHJhY3RQYWdlCi17Ci0gICAgLyoqCi0gICAgICogIFJldHVybnMgYSBuZXcge0BsaW5rIEhUTUxXcml0ZXJ9LgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIElNYXJrdXBXcml0ZXIgZ2V0UmVzcG9uc2VXcml0ZXIoT3V0cHV0U3RyZWFtIG91dCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgSFRNTFdyaXRlcihvdXQsIGdldE91dHB1dEVuY29kaW5nKCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9odG1sL0JvZHkuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9odG1sL0JvZHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRjY2E5Yy4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvaHRtbC9Cb2R5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDYgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuaHRtbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuQWJzdHJhY3RDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5BcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JTWFya3VwV3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlcXVlc3RDeWNsZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZXNvdXJjZUxvY2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVNjcmlwdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LlRhcGVzdHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuYXNzZXQuUHJpdmF0ZUFzc2V0OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkucmVzb3VyY2UuQ2xhc3NwYXRoUmVzb3VyY2VMb2NhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnV0aWwuSWRBbGxvY2F0b3I7Ci0KLS8qKgotICogIFRoZSBib2R5IG9mIGEgVGFwZXN0cnkgcGFnZS4gIFRoaXMgaXMgdXNlZCBzaW5jZSBpdCBhbGxvd3MgY29tcG9uZW50cyBvbiB0aGUKLSAqICBwYWdlIGFjY2VzcyB0byBhbiBpbml0aWFsaXphdGlvbiBzY3JpcHQgKHRoYXQgaXMgd3JpdHRlbiB0aGUgc3RhcnQsIGp1c3QgaW5zaWRlCi0gKiAgdGhlICZsdDtib2R5Jmd0OyB0YWcpLiAgVGhpcyBpcyBjdXJyZW50bHkgdXNlZCBieSB7QGxpbmsgUm9sbG92ZXJ9IGFuZCB7QGxpbmsgU2NyaXB0fQotICogIGNvbXBvbmVudHMuCi0gKiAKLSAqICBbPGEgaHJlZj0iLi4vLi4vLi4vLi4vLi4vQ29tcG9uZW50UmVmZXJlbmNlL0JvZHkuaHRtbCI+Q29tcG9uZW50IFJlZmVyZW5jZTwvYT5dCi0gKiAKLSAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiAgQHZlcnNpb24gJElkJAotICogCi0gKiovCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCb2R5IGV4dGVuZHMgQWJzdHJhY3RDb21wb25lbnQgaW1wbGVtZW50cyBJU2NyaXB0UHJvY2Vzc29yCi17Ci0gICAgLy8gTGluZXMgdGhhdCBiZWxvbmcgaW5zaWRlIHRoZSBvbkxvYWQgZXZlbnQgaGFuZGxlciBmb3IgdGhlIDxib2R5PiB0YWcuCi0gICAgcHJpdmF0ZSBTdHJpbmdCdWZmZXIgX2luaXRpYWxpemF0aW9uU2NyaXB0OwotCi0gICAgLy8gVGhlIHdyaXRlciBpbml0aWFsbHkgcGFzc2VkIHRvIHJlbmRlcigpIC4uLiB3cmFwcGVkIGVsZW1lbnRzIHJlbmRlcgotICAgIC8vIGludG8gYSBuZXN0ZWQgcmVzcG9uc2Ugd3JpdGVyLgotCi0gICAgcHJpdmF0ZSBJTWFya3VwV3JpdGVyIF9vdXRlcldyaXRlcjsKLQotICAgIC8vIEFueSBvdGhlciBzY3JpcHRpbmcgZGVzaXJlZAotCi0gICAgcHJpdmF0ZSBTdHJpbmdCdWZmZXIgX2JvZHlTY3JpcHQ7Ci0KLSAgICAvLyBDb250YWlucyB0ZXh0IGxpbmVzIHJlbGF0ZWQgdG8gaW1hZ2UgaW5pdGlhbGl6YXRpb25zCi0KLSAgICBwcml2YXRlIFN0cmluZ0J1ZmZlciBfaW1hZ2VJbml0aWFsaXphdGlvbnM7Ci0KLSAgICAvKioKLSAgICAgKiAgTWFwIG9mIFVSTHMgdG8gU3RyaW5ncyAocHJlbG9hZGVkIGltYWdlIHJlZmVyZW5jZXMpLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHJpdmF0ZSBNYXAgX2ltYWdlTWFwOwotCi0gICAgLyoqCi0gICAgICogIExpc3Qgb2YgaW5jbHVkZWQgc2NyaXB0cy4gIFZhbHVlcyBhcmUgU3RyaW5ncy4KLSAgICAgKgotICAgICAqICBAc2luY2UgMS4wLjUKLSAgICAgKgotICAgICAqKi8KLQotICAgIHByaXZhdGUgTGlzdCBfZXh0ZXJuYWxTY3JpcHRzOwotCi0gICAgcHJpdmF0ZSBJZEFsbG9jYXRvciBfaWRBbGxvY2F0b3I7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX05BTUUgPSAib3JnLmFwYWNoZS50YXBlc3RyeS5hY3RpdmUuQm9keSI7Ci0KLSAgICAvKioKLSAgICAgKiAgVHJhY2tzIGEgcGFydGljdWxhciBwcmVsb2FkZWQgaW1hZ2UuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICAvKioKLSAgICAgKiAgQWRkcyB0byB0aGUgc2NyaXB0IGFuIGluaXRpYWxpemF0aW9uIGZvciB0aGUgbmFtZWQgdmFyaWFibGUgYXMKLSAgICAgKiAgYW4gSW1hZ2UoKSwgdG8gdGhlIGdpdmVuIFVSTC4KLSAgICAgKgotICAgICAqICA8cD5SZXR1cm5zIGEgcmVmZXJlbmNlLCBhIHN0cmluZyB0aGF0IGNhbiBiZSB1c2VkIHRvIHJlcHJlc2VudAotICAgICAqICB0aGUgcHJlbG9hZGVkIGltYWdlIGluIGEgSmF2YVNjcmlwdCBmdW5jdGlvbi4KLSAgICAgKgotICAgICAqICBAc2luY2UgMS4wLjIKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByZWxvYWRlZEltYWdlUmVmZXJlbmNlKFN0cmluZyBVUkwpCi0gICAgewotICAgICAgICBpZiAoX2ltYWdlTWFwID09IG51bGwpCi0gICAgICAgICAgICBfaW1hZ2VNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgICAgIFN0cmluZyByZWZlcmVuY2UgPSAoU3RyaW5nKSBfaW1hZ2VNYXAuZ2V0KFVSTCk7Ci0KLSAgICAgICAgaWYgKHJlZmVyZW5jZSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgY291bnQgPSBfaW1hZ2VNYXAuc2l6ZSgpOwotICAgICAgICAgICAgU3RyaW5nIHZhck5hbWUgPSAidGFwZXN0cnlfcHJlbG9hZFsiICsgY291bnQgKyAiXSI7Ci0gICAgICAgICAgICByZWZlcmVuY2UgPSB2YXJOYW1lICsgIi5zcmMiOwotCi0gICAgICAgICAgICBpZiAoX2ltYWdlSW5pdGlhbGl6YXRpb25zID09IG51bGwpCi0gICAgICAgICAgICAgICAgX2ltYWdlSW5pdGlhbGl6YXRpb25zID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0gICAgICAgICAgICBfaW1hZ2VJbml0aWFsaXphdGlvbnMuYXBwZW5kKCIgICIpOwotICAgICAgICAgICAgX2ltYWdlSW5pdGlhbGl6YXRpb25zLmFwcGVuZCh2YXJOYW1lKTsKLSAgICAgICAgICAgIF9pbWFnZUluaXRpYWxpemF0aW9ucy5hcHBlbmQoIiA9IG5ldyBJbWFnZSgpO1xuIik7Ci0gICAgICAgICAgICBfaW1hZ2VJbml0aWFsaXphdGlvbnMuYXBwZW5kKCIgICIpOwotICAgICAgICAgICAgX2ltYWdlSW5pdGlhbGl6YXRpb25zLmFwcGVuZChyZWZlcmVuY2UpOwotICAgICAgICAgICAgX2ltYWdlSW5pdGlhbGl6YXRpb25zLmFwcGVuZCgiID0gXCIiKTsKLSAgICAgICAgICAgIF9pbWFnZUluaXRpYWxpemF0aW9ucy5hcHBlbmQoVVJMKTsKLSAgICAgICAgICAgIF9pbWFnZUluaXRpYWxpemF0aW9ucy5hcHBlbmQoIlwiO1xuIik7Ci0KLSAgICAgICAgICAgIF9pbWFnZU1hcC5wdXQoVVJMLCByZWZlcmVuY2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlZmVyZW5jZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgQWRkcyBvdGhlciBpbml0aWFsaXphdGlvbiwgaW4gdGhlIGZvcm0gb2YgYWRkaXRpb25hbCBKYXZhU2NyaXB0Ci0gICAgICogIGNvZGUgdG8gZXhlY3V0ZSBmcm9tIHRoZSAmbHQ7Ym9keSZndDsncyA8Y29kZT5vbkxvYWQ8L2NvZGU+IGV2ZW50Ci0gICAgICogIGhhbmRsZXIuICBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBhZGRpbmcgYSBzZW1pY29sb24gKHN0YXRlbWVudAotICAgICAqICB0ZXJtaW5hdG9yKS4gIFRoaXMgbWV0aG9kIHdpbGwgYWRkIGEgbmV3bGluZSBhZnRlciB0aGUgc2NyaXB0LgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgYWRkSW5pdGlhbGl6YXRpb25TY3JpcHQoU3RyaW5nIHNjcmlwdCkKLSAgICB7Ci0gICAgICAgIGlmIChfaW5pdGlhbGl6YXRpb25TY3JpcHQgPT0gbnVsbCkKLSAgICAgICAgICAgIF9pbml0aWFsaXphdGlvblNjcmlwdCA9IG5ldyBTdHJpbmdCdWZmZXIoc2NyaXB0Lmxlbmd0aCgpICsgMSk7Ci0KLSAgICAgICAgX2luaXRpYWxpemF0aW9uU2NyaXB0LmFwcGVuZChzY3JpcHQpOwotICAgICAgICBfaW5pdGlhbGl6YXRpb25TY3JpcHQuYXBwZW5kKCdcbicpOwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEFkZHMgYWRkaXRpb25hbCBzY3JpcHRpbmcgY29kZSB0byB0aGUgcGFnZS4gIFRoaXMgY29kZQotICAgICAqICB3aWxsIGJlIGFkZGVkIHRvIGEgbGFyZ2UgYmxvY2sgb2Ygc2NyaXB0aW5nIGNvZGUgYXQgdGhlCi0gICAgICogIHRvcCBvZiB0aGUgcGFnZSAoaS5lLiwgdGhlIGJlZm9yZSB0aGUgJmx0O2JvZHkmZ3Q7IHRhZykuCi0gICAgICoKLSAgICAgKiAgPHA+VGhpcyBpcyB0eXBpY2FsbHkgdXNlZCB0byBhZGQgc29tZSBmb3JtIG9mIEphdmFTY3JpcHQKLSAgICAgKiAgZXZlbnQgaGFuZGxlciB0byBhIHBhZ2UuICBGb3IgZXhhbXBsZSwgdGhlCi0gICAgICogIHtAbGluayBSb2xsb3Zlcn0gY29tcG9uZW50IG1ha2VzIHVzZSBvZiB0aGlzLgotICAgICAqCi0gICAgICogIDxwPkFub3RoZXIgd2F5IHRoaXMgaXMgaW52b2tlZCBpcyBieSB1c2luZyB0aGUKLSAgICAgKiAge0BsaW5rIFNjcmlwdH0gY29tcG9uZW50LgotICAgICAqCi0gICAgICogIDxwPlRoZSBzdHJpbmcgd2lsbCBiZSBhZGRlZCwgYXMtaXMsIHdpdGhpbgotICAgICAqICB0aGUgJmx0O3NjcmlwdCZndDsgYmxvY2sgZ2VuZXJhdGVkIGJ5IHRoaXMgPGNvZGU+Qm9keTwvY29kZT4gY29tcG9uZW50LgotICAgICAqICBUaGUgc2NyaXB0IHNob3VsZCA8ZW0+bm90PC9lbT4gY29udGFpbiBIVE1MIGNvbW1lbnRzLCB0aG9zZSB3aWxsCi0gICAgICogIGJlIHN1cHBsaWVkIGJ5IHRoaXMgQm9keSBjb21wb25lbnQuCi0gICAgICoKLSAgICAgKiAgPHA+QSBmcmVxdWVudCB1c2UgaXMgdG8gYWRkIGFuIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uIHVzaW5nCi0gICAgICogIHRoaXMgbWV0aG9kLCB0aGVuIGNhdXNlIGl0IHRvIGJlIGV4ZWN1dGVkIHVzaW5nCi0gICAgICogIHtAbGluayAjYWRkSW5pdGlhbGl6YXRpb25TY3JpcHQoU3RyaW5nKX0uCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCBhZGRCb2R5U2NyaXB0KFN0cmluZyBzY3JpcHQpCi0gICAgewotICAgICAgICBpZiAoX2JvZHlTY3JpcHQgPT0gbnVsbCkKLSAgICAgICAgICAgIF9ib2R5U2NyaXB0ID0gbmV3IFN0cmluZ0J1ZmZlcihzY3JpcHQubGVuZ3RoKCkpOwotCi0gICAgICAgIF9ib2R5U2NyaXB0LmFwcGVuZChzY3JpcHQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBVc2VkIHRvIGluY2x1ZGUgYSBzY3JpcHQgZnJvbSBhbiBvdXRzaWRlIFVSTCAodGhlIHNjcmlwdExvY2F0aW9uCi0gICAgICogIGlzIGEgVVJMLCBwcm9iYWJseSBvYnRhaW5lZCBmcm9tIGFuIGFzc2V0LiAgVGhpcyBhZGRzCi0gICAgICogIGFuICZsdDtzY3JpcHQgc3JjPSIuLi4iJmd0OyB0YWcgYmVmb3JlIHRoZSBtYWluCi0gICAgICogICZsdDtzY3JpcHQmZ3Q7IHRhZy4gIFRoZSBCb2R5IGNvbXBvbmVudCBlbnN1cmVzCi0gICAgICogIHRoYXQgZWFjaCBVUkwgaXMgaW5jbHVkZWQgb25seSBvbmNlLgotICAgICAqCi0gICAgICogIEBzaW5jZSAxLjAuNQotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgYWRkRXh0ZXJuYWxTY3JpcHQoSVJlc291cmNlTG9jYXRpb24gc2NyaXB0TG9jYXRpb24pCi0gICAgewotICAgICAgICBpZiAoX2V4dGVybmFsU2NyaXB0cyA9PSBudWxsKQotICAgICAgICAgICAgX2V4dGVybmFsU2NyaXB0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgICBpZiAoX2V4dGVybmFsU2NyaXB0cy5jb250YWlucyhzY3JpcHRMb2NhdGlvbikpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgLy8gQWxhcywgdGhpcyB3b24ndCBnaXZlIGEgZ29vZCBJTG9jYXRpb24gZm9yIHRoZSBhY3R1YWwgcHJvYmxlbS4KLQotICAgICAgICBpZiAoIShzY3JpcHRMb2NhdGlvbiBpbnN0YW5jZW9mIENsYXNzcGF0aFJlc291cmNlTG9jYXRpb24pKQotICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICBUYXBlc3RyeS5mb3JtYXQoIkJvZHkuaW5jbHVkZS1jbGFzc3BhdGgtc2NyaXB0LW9ubHkiLCBzY3JpcHRMb2NhdGlvbiksCi0gICAgICAgICAgICAgICAgdGhpcywKLSAgICAgICAgICAgICAgICBudWxsLAotICAgICAgICAgICAgICAgIG51bGwpOwotCi0gICAgICAgIC8vIFJlY29yZCB0aGUgVVJMIHNvIHdlIGRvbid0IGluY2x1ZGUgaXQgdHdpY2UuCi0KLSAgICAgICAgX2V4dGVybmFsU2NyaXB0cy5hZGQoc2NyaXB0TG9jYXRpb24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdyaXRlcyAmbHQ7c2NyaXB0Jmd0OyBlbGVtZW50cyBmb3IgYWxsIHRoZSBleHRlcm5hbCBzY3JpcHRzLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB3cml0ZUV4dGVybmFsU2NyaXB0cyhJTWFya3VwV3JpdGVyIHdyaXRlcikKLSAgICB7Ci0gICAgICAgIGludCBjb3VudCA9IFRhcGVzdHJ5LnNpemUoX2V4dGVybmFsU2NyaXB0cyk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgQ2xhc3NwYXRoUmVzb3VyY2VMb2NhdGlvbiBzY3JpcHRMb2NhdGlvbiA9Ci0gICAgICAgICAgICAgICAgKENsYXNzcGF0aFJlc291cmNlTG9jYXRpb24pIF9leHRlcm5hbFNjcmlwdHMuZ2V0KGkpOwotCi0gICAgICAgICAgICAvLyBUaGlzIGlzIHN0aWxsIHZlcnkgYXdrd2FyZCEgIFNob3VsZCBtb3ZlIHRoZSBjb2RlIGluc2lkZSBQcml2YXRlQXNzZXQgc29tZXdoZXJlCi0gICAgICAgICAgICAvLyBlbHNlLCBzbyB0aGF0IGFuIGFzc2V0IGRvZXMgbm90IGhhdmUgdG8gYmUgY3JlYXRlZCB0byB0byBidWlsZCB0aGUgVVJMLgotICAgICAgICAgICAgUHJpdmF0ZUFzc2V0IGFzc2V0ID0gbmV3IFByaXZhdGVBc3NldChzY3JpcHRMb2NhdGlvbiwgbnVsbCk7Ci0gICAgICAgICAgICBTdHJpbmcgdXJsID0gYXNzZXQuYnVpbGRVUkwoZ2V0UGFnZSgpLmdldFJlcXVlc3RDeWNsZSgpKTsKLQotICAgICAgICAgICAgLy8gTm90ZTogaW1wb3J0YW50IHRvIHVzZSBiZWdpbigpLCBub3QgYmVnaW5FbXB0eSgpLCBiZWNhdXNlIGJyb3dzZXIgZG9uJ3QKLSAgICAgICAgICAgIC8vIGludGVycHJldCA8c2NyaXB0IC4uLi8+IHByb3Blcmx5LgotCi0gICAgICAgICAgICB3cml0ZXIuYmVnaW4oInNjcmlwdCIpOwotICAgICAgICAgICAgd3JpdGVyLmF0dHJpYnV0ZSgibGFuZ3VhZ2UiLCAiSmF2YVNjcmlwdCIpOwotICAgICAgICAgICAgd3JpdGVyLmF0dHJpYnV0ZSgidHlwZSIsICJ0ZXh0L2phdmFzY3JpcHQiKTsKLSAgICAgICAgICAgIHdyaXRlci5hdHRyaWJ1dGUoInNyYyIsIHVybCk7Ci0gICAgICAgICAgICB3cml0ZXIuZW5kKCk7Ci0gICAgICAgICAgICB3cml0ZXIucHJpbnRsbigpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0cmlldmVzIHRoZSA8Y29kZT5Cb2R5PC9jb2RlPiB0aGF0IHdhcyBzdG9yZWQgaW50byB0aGUKLSAgICAgKiAgcmVxdWVzdCBjeWNsZS4gIFRoaXMgYWxsb3dzIGNvbXBvbmVudHMgd3JhcHBlZCBieSB0aGUKLSAgICAgKiAgPGNvZGU+Qm9keTwvY29kZT4gdG8gbG9jYXRlIGl0IGFuZCBhY2Nlc3MgdGhlIHNlcnZpY2VzIGl0Ci0gICAgICogIHByb3ZpZGVzLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIHN0YXRpYyBCb2R5IGdldChJUmVxdWVzdEN5Y2xlIGN5Y2xlKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChCb2R5KSBjeWNsZS5nZXRBdHRyaWJ1dGUoQVRUUklCVVRFX05BTUUpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHJlbmRlckNvbXBvbmVudChJTWFya3VwV3JpdGVyIHdyaXRlciwgSVJlcXVlc3RDeWNsZSBjeWNsZSkKLSAgICB7Ci0gICAgICAgIGlmIChjeWNsZS5nZXRBdHRyaWJ1dGUoQVRUUklCVVRFX05BTUUpICE9IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIFRhcGVzdHJ5LmdldE1lc3NhZ2UoIkJvZHkubWF5LW5vdC1uZXN0IiksCi0gICAgICAgICAgICAgICAgdGhpcywKLSAgICAgICAgICAgICAgICBudWxsLAotICAgICAgICAgICAgICAgIG51bGwpOwotCi0gICAgICAgIGN5Y2xlLnNldEF0dHJpYnV0ZShBVFRSSUJVVEVfTkFNRSwgdGhpcyk7Ci0KLSAgICAgICAgX291dGVyV3JpdGVyID0gd3JpdGVyOwotCi0gICAgICAgIElNYXJrdXBXcml0ZXIgbmVzdGVkID0gd3JpdGVyLmdldE5lc3RlZFdyaXRlcigpOwotCi0gICAgICAgIHJlbmRlckJvZHkobmVzdGVkLCBjeWNsZSk7Ci0KLSAgICAgICAgLy8gU3RhcnQgdGhlIGJvZHkgdGFnLgotICAgICAgICB3cml0ZXIucHJpbnRsbigpOwotICAgICAgICB3cml0ZXIuYmVnaW4oZ2V0RWxlbWVudCgpKTsKLSAgICAgICAgcmVuZGVySW5mb3JtYWxQYXJhbWV0ZXJzKHdyaXRlciwgY3ljbGUpOwotCi0gICAgICAgIHdyaXRlci5wcmludGxuKCk7Ci0KLSAgICAgICAgLy8gV3JpdGUgdGhlIHBhZ2UncyBzY3JpcHRpbmcuICBUaGlzIGlzIGluY2x1ZGVkIHNjcmlwdHMKLSAgICAgICAgLy8gYW5kIGR5bmFtaWMgSmF2YVNjcmlwdCwgaW5jbHVkaW5nIGluaXRpYWxpemF0aW9uLgotCi0gICAgICAgIHdyaXRlU2NyaXB0KF9vdXRlcldyaXRlcik7Ci0KLSAgICAgICAgLy8gQ2xvc2UgdGhlIG5lc3RlZCB3cml0ZXIsIHdoaWNoIGR1bXBzIGl0cyBidWZmZXJlZCBjb250ZW50Ci0gICAgICAgIC8vIGludG8gaXRzIHBhcmVudC4KLQotICAgICAgICBuZXN0ZWQuY2xvc2UoKTsKLQotICAgICAgICB3cml0ZXIuZW5kKCk7IC8vIDxib2R5PgotCi0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgY2xlYW51cEFmdGVyUmVuZGVyKElSZXF1ZXN0Q3ljbGUgY3ljbGUpCi0gICAgewotICAgICAgICBzdXBlci5jbGVhbnVwQWZ0ZXJSZW5kZXIoY3ljbGUpOwotCi0gICAgICAgIGlmIChfaWRBbGxvY2F0b3IgIT0gbnVsbCkKLSAgICAgICAgICAgIF9pZEFsbG9jYXRvci5jbGVhcigpOwotCi0gICAgICAgIGlmIChfaW1hZ2VNYXAgIT0gbnVsbCkKLSAgICAgICAgICAgIF9pbWFnZU1hcC5jbGVhcigpOwotCi0gICAgICAgIGlmIChfZXh0ZXJuYWxTY3JpcHRzICE9IG51bGwpCi0gICAgICAgICAgICBfZXh0ZXJuYWxTY3JpcHRzLmNsZWFyKCk7Ci0KLSAgICAgICAgaWYgKF9pbml0aWFsaXphdGlvblNjcmlwdCAhPSBudWxsKQotICAgICAgICAgICAgX2luaXRpYWxpemF0aW9uU2NyaXB0LnNldExlbmd0aCgwKTsKLQotICAgICAgICBpZiAoX2ltYWdlSW5pdGlhbGl6YXRpb25zICE9IG51bGwpCi0gICAgICAgICAgICBfaW1hZ2VJbml0aWFsaXphdGlvbnMuc2V0TGVuZ3RoKDApOwotCi0gICAgICAgIGlmIChfYm9keVNjcmlwdCAhPSBudWxsKQotICAgICAgICAgICAgX2JvZHlTY3JpcHQuc2V0TGVuZ3RoKDApOwotCi0gICAgICAgIF9vdXRlcldyaXRlciA9IG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFdyaXRlcyBhIHNpbmdsZSBsYXJnZSBKYXZhU2NyaXB0IGJsb2NrIGNvbnRhaW5pbmc6Ci0gICAgICogIDx1bD4KLSAgICAgKiAgPGxpPkFueSBpbWFnZSBpbml0aWFsaXphdGlvbnMKLSAgICAgKiAgPGxpPkFueSBzY3JpcHRpbmcKLSAgICAgKiAgPGxpPkFueSBpbml0aWFsaXphdGlvbnMKLSAgICAgKiAgPC91bD4KLSAgICAgKgotICAgICAqICA8cD5UaGUgc2NyaXB0IGlzIHdyaXR0ZW4gaW50byBhIG5lc3RlZCBtYXJrdXAgd3JpdGVyLgotICAgICAqCi0gICAgICogIDxwPklmIHRoZXJlIGFyZSBhbnkgb3RoZXIgaW5pdGlhbGl6YXRpb25zIAotICAgICAqICAoc2VlIHtAbGluayAjYWRkSW5pdGlhbGl6YXRpb25TY3JpcHQoU3RyaW5nKX0pLAotICAgICAqICB0aGVuIGEgZnVuY3Rpb24gdG8gZXhlY3V0ZSB0aGVtIGlzIGNyZWF0ZWQuCi0gICAgICoqLwotCi0gICAgcHJvdGVjdGVkIHZvaWQgd3JpdGVTY3JpcHQoSU1hcmt1cFdyaXRlciB3cml0ZXIpCi0gICAgewotICAgICAgICBpZiAoIVRhcGVzdHJ5LmlzRW1wdHkoX2V4dGVybmFsU2NyaXB0cykpCi0gICAgICAgICAgICB3cml0ZUV4dGVybmFsU2NyaXB0cyh3cml0ZXIpOwotCi0gICAgICAgIGlmICghKGFueShfaW5pdGlhbGl6YXRpb25TY3JpcHQpIHx8IGFueShfYm9keVNjcmlwdCkgfHwgYW55KF9pbWFnZUluaXRpYWxpemF0aW9ucykpKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIHdyaXRlci5iZWdpbigic2NyaXB0Iik7Ci0gICAgICAgIHdyaXRlci5hdHRyaWJ1dGUoImxhbmd1YWdlIiwgIkphdmFTY3JpcHQiKTsKLSAgICAgICAgd3JpdGVyLmF0dHJpYnV0ZSgidHlwZSIsICJ0ZXh0L2phdmFzY3JpcHQiKTsKLSAgICAgICAgd3JpdGVyLnByaW50UmF3KCI8IS0tIik7Ci0KLSAgICAgICAgaWYgKGFueShfaW1hZ2VJbml0aWFsaXphdGlvbnMpKQotICAgICAgICB7Ci0gICAgICAgICAgICB3cml0ZXIucHJpbnRSYXcoIlxuXG52YXIgdGFwZXN0cnlfcHJlbG9hZCA9IG5ldyBBcnJheSgpO1xuIik7Ci0gICAgICAgICAgICB3cml0ZXIucHJpbnRSYXcoImlmIChkb2N1bWVudC5pbWFnZXMpXG4iKTsKLSAgICAgICAgICAgIHdyaXRlci5wcmludFJhdygie1xuIik7Ci0gICAgICAgICAgICB3cml0ZXIucHJpbnRSYXcoX2ltYWdlSW5pdGlhbGl6YXRpb25zLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgd3JpdGVyLnByaW50UmF3KCJ9XG4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChhbnkoX2JvZHlTY3JpcHQpKQotICAgICAgICB7Ci0gICAgICAgICAgICB3cml0ZXIucHJpbnRSYXcoIlxuXG4iKTsKLSAgICAgICAgICAgIHdyaXRlci5wcmludFJhdyhfYm9keVNjcmlwdC50b1N0cmluZygpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChhbnkoX2luaXRpYWxpemF0aW9uU2NyaXB0KSkKLSAgICAgICAgewotCi0gICAgICAgICAgICB3cml0ZXIucHJpbnRSYXcoIlxuXG4iICsgIndpbmRvdy5vbmxvYWQgPSBmdW5jdGlvbiAoKVxuIiArICJ7XG4iKTsKLQotICAgICAgICAgICAgd3JpdGVyLnByaW50UmF3KF9pbml0aWFsaXphdGlvblNjcmlwdC50b1N0cmluZygpKTsKLQotICAgICAgICAgICAgd3JpdGVyLnByaW50UmF3KCJ9Iik7Ci0gICAgICAgIH0KLQotICAgICAgICB3cml0ZXIucHJpbnRSYXcoIlxuXG4vLyAtLT4iKTsKLSAgICAgICAgd3JpdGVyLmVuZCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBhbnkoU3RyaW5nQnVmZmVyIGJ1ZmZlcikKLSAgICB7Ci0gICAgICAgIGlmIChidWZmZXIgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICByZXR1cm4gYnVmZmVyLmxlbmd0aCgpID4gMDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldEVsZW1lbnQoKTsKLQotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEVsZW1lbnQoU3RyaW5nIGVsZW1lbnQpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZWxlbWVudCBwYXJhbWV0ZXIgcHJvcGVydHkgdG8gaXRzIGRlZmF1bHQsICJib2R5Ii4KLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMy4wCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZmluaXNoTG9hZCgpCi0gICAgewotICAgICAgICBzZXRFbGVtZW50KCJib2R5Iik7Ci0gICAgfQotCi0gICAgLyoqIEBzaW5jZSAzLjAgKi8KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VW5pcXVlU3RyaW5nKFN0cmluZyBiYXNlVmFsdWUpCi0gICAgewotICAgICAgICBpZiAoX2lkQWxsb2NhdG9yID09IG51bGwpCi0gICAgICAgICAgICBfaWRBbGxvY2F0b3IgPSBuZXcgSWRBbGxvY2F0b3IoKTsKLQotICAgICAgICByZXR1cm4gX2lkQWxsb2NhdG9yLmFsbG9jYXRlSWQoYmFzZVZhbHVlKTsKLSAgICB9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvaHRtbC9Cb2R5Lmp3YyBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9odG1sL0JvZHkuandjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDJiYzVjLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9odG1sL0JvZHkuandjCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICAKLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08IS0tICRJZCQgLS0+Ci08IURPQ1RZUEUgY29tcG9uZW50LXNwZWNpZmljYXRpb24gUFVCTElDIAotICAiLS8vQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24vL1RhcGVzdHJ5IFNwZWNpZmljYXRpb24gMy4wLy9FTiIgCi0gICJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL3RhcGVzdHJ5L2R0ZC9UYXBlc3RyeV8zXzAuZHRkIj4KLSAgCi08Y29tcG9uZW50LXNwZWNpZmljYXRpb24gY2xhc3M9Im9yZy5hcGFjaGUudGFwZXN0cnkuaHRtbC5Cb2R5Ij4KLQotICA8ZGVzY3JpcHRpb24+Ci0gIFRha2VzIHRoZSBwbGFjZSBvZiB0aGUgbm9ybWFsIEhUTUwgJmx0O2JvZHkmZ3Q7IGVsZW1lbnQsIHByb3ZpZGluZyB2YXJpb3VzCi0gIGZvcm1zIG9mIHN1cHBvcnQgdG8gYWxsIGNvbXBvbmVudHMgaXQgd3JhcHMuCi0gIDwvZGVzY3JpcHRpb24+Ci0KLSAgPHBhcmFtZXRlcgotICAJbmFtZT0iZWxlbWVudCIKLSAgCXR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gIAlkaXJlY3Rpb249ImluIj4KLSAgCTxkZXNjcmlwdGlvbj4KLSAgCU5hbWUgb2YgZWxlbWVudCB0byB1c2UsIGRlZmF1bHRzIHRvICJib2R5Ii4KLSAgCTwvZGVzY3JpcHRpb24+Ci0gIDwvcGFyYW1ldGVyPgotIAotICA8cmVzZXJ2ZWQtcGFyYW1ldGVyIG5hbWU9Im9ubG9hZCIvPgotICAgIAotPC9jb21wb25lbnQtc3BlY2lmaWNhdGlvbj4KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9odG1sL0V4Y2VwdGlvbkRpc3BsYXkuaHRtbCBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9odG1sL0V4Y2VwdGlvbkRpc3BsYXkuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE5ZmE2YS4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvaHRtbC9FeGNlcHRpb25EaXNwbGF5Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi08IS0tICRJZCQgLS0+Ci08aHRtbD4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3BhZ2VzL0V4Y2VwdGlvbi5jc3MiPgotCi08Ym9keT4KLQotPHNwYW4gandjaWQ9IiRjb250ZW50JCI+Ci08cD4KLQotPHRhYmxlIGNsYXNzPSJleGNlcHRpb24tZGlzcGxheSI+Ci0KLTxzcGFuIGp3Y2lkPSJlRXhjZXB0aW9uIj4KLQkKLQkJPHRyIGNsYXNzPSJleGNlcHRpb24tbmFtZSI+Ci0JCQk8dGQgY29sc3Bhbj0iMiI+PHNwYW4gandjaWQ9Imluc2VydENsYXNzIj5zb21lLmV4Y2VwdGlvbi5DbGFzczwvc3Bhbj48L3RkPgotCQk8L3RyPgotCQkKLQkJPHRyIGNsYXNzPSJleGNlcHRpb24tbWVzc2FnZSI+Ci0JCQk8dGQgY29sc3Bhbj0iMiI+PHNwYW4gandjaWQ9Imluc2VydE1lc3NhZ2UiPkEgbWVzc2FnZSBkZXNjcmliaW5nIHRoZSBleGNlcHRpb24uPC9zcGFuPjwvdGQ+Ci0JCTwvdHI+Ci0JCQotCQk8dHIgandjaWQ9ImVQcm9wZXJ0eSI+Ci0JCQk8dGg+PHNwYW4gandjaWQ9Imluc2VydFByb3BlcnR5TmFtZSI+UHJvcGVydHkgTmFtZTwvc3Bhbj46PC90aD4KLQkJCTx0ZD48c3BhbiBqd2NpZD0iaW5zZXJ0UHJvcGVydHlWYWx1ZSI+UHJvcGVydHkgVmFsdWU8L3NwYW4+PC90ZD4KLQkJPC90cj4KLQotCQk8dHIgandjaWQ9IiRyZW1vdmUkIiBjbGFzcz0ib2RkIj4KLQkJCTx0aD5Qcm9wZXJ0eSBOYW1lIDI6PC90aD4KLQkJCTx0ZD5Qcm9wZXJ0eSBWYWx1ZSAyPC90ZD4KLQkJPC90cj4KLQotCQk8dHIgandjaWQ9IiRyZW1vdmUkIiBjbGFzcz0iZXZlbiI+Ci0JCQk8dGg+UHJvcGVydHkgTmFtZSAzOjwvdGg+Ci0JCQk8dGQ+UHJvcGVydHkgVmFsdWUgMzwvdGQ+Ci0JCTwvdHI+Ci0KLQkJPHRyIGp3Y2lkPSIkcmVtb3ZlJCIgY2xhc3M9Im9kZCI+Ci0JCQk8dGg+UHJvcGVydHkgTmFtZSA0OjwvdGg+Ci0JCQk8dGQ+UHJvcGVydHkgVmFsdWUgNDwvdGQ+Ci0JCTwvdHI+CQkKLQkJCi08c3BhbiBqd2NpZD0iaWZOb3RMYXN0Ij4KLQkJPHRyPiA8dGQgY29sc3Bhbj0yPiAmbmJzcDsgPC90ZD4gPC90cj4KLTwvc3Bhbj4KLQkKLTxzcGFuIGp3Y2lkPSJpZkxhc3QiPgotCQk8dHIgY2xhc3M9InN0YWNrLXRyYWNlLWxhYmVsIj4KLQkJCTx0ZCBjb2xzcGFuPSIyIj5TdGFjayBUcmFjZTo8L3RkPgotCQk8L3RyPgotCi0JCTx0ciBjbGFzcz0ic3RhY2stdHJhY2UiPgotCQkJPHRkIGNvbHNwYW49Mj4KLQkJCQk8dWw+Ci0JCQkJCTxsaSBqd2NpZD0iZVN0YWNrIj48c3BhbiBqd2NpZD0iaW5zZXJ0U3RhY2tUcmFjZSI+Zm9vLmJhci5iYXooTGluZTp4eXopPC9zcGFuPgotCQkJCQk8L2xpPgotCQkJCQk8bGkgandjaWQ9IiRyZW1vdmUkIj5mb28uYmFyLmJheihMaW5lOnh5eik8L2xpPgotCQkJCQk8bGkgandjaWQ9IiRyZW1vdmUkIj5mb28uYmFyLmJheihMaW5lOnh5eik8L2xpPgotCQkJCQk8bGkgandjaWQ9IiRyZW1vdmUkIj5mb28uYmFyLmJheihMaW5lOnh5eik8L2xpPgkJCQkJCi0JCQkJCTxsaSBqd2NpZD0iJHJlbW92ZSQiPmZvby5iYXIuYmF6KExpbmU6eHl6KTwvbGk+Ci0JCQkJPC91bD4KLQkJCTwvdGQ+Ci0JCTwvdHI+Ci08L3NwYW4+IDwhLS0gaWZMYXN0IC0tPgotPC9zcGFuPiA8IS0tIGUtZXhjZXB0aW9uIC0tPgotCi08L3RhYmxlPgotCi08L3NwYW4+IDwhLS0gJGNvbnRlbnQkIC0tPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvaHRtbC9FeGNlcHRpb25EaXNwbGF5LmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvaHRtbC9FeGNlcHRpb25EaXNwbGF5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0OTgyZDkuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2h0bWwvRXhjZXB0aW9uRGlzcGxheS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5Lmh0bWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LkJhc2VDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JQmluZGluZzsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklNYXJrdXBXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVxdWVzdEN5Y2xlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuYmVhbi5FdmVuT2RkOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkudXRpbC5leGNlcHRpb24uRXhjZXB0aW9uRGVzY3JpcHRpb247Ci0KLS8qKgotICogIENvbXBvbmVudCB1c2VkIHRvIGRpc3BsYXkgYW4gYWxyZWFkeSBmb3JtYXR0ZWQgZXhjZXB0aW9uLgotICogCi0gKiAgWzxhIGhyZWY9Ii4uLy4uLy4uLy4uLy4uL0NvbXBvbmVudFJlZmVyZW5jZS9FeGNlcHRpb25EaXNwbGF5Lmh0bWwiPkNvbXBvbmVudCBSZWZlcmVuY2U8L2E+XQotICoKLSAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiAgQHZlcnNpb24gJElkJAotICogCi0gKiovCi0KLXB1YmxpYyBjbGFzcyBFeGNlcHRpb25EaXNwbGF5IGV4dGVuZHMgQmFzZUNvbXBvbmVudAotewotICAgIHByaXZhdGUgSUJpbmRpbmcgX2V4Y2VwdGlvbnNCaW5kaW5nOwotICAgIHByaXZhdGUgRXhjZXB0aW9uRGVzY3JpcHRpb24gX2V4Y2VwdGlvbjsKLSAgICBwcml2YXRlIGludCBfY291bnQ7Ci0gICAgcHJpdmF0ZSBpbnQgX2luZGV4OwotICAgIHByaXZhdGUgRXZlbk9kZCBfZXZlbk9kZDsKLQotICAgIHB1YmxpYyB2b2lkIHNldEV4Y2VwdGlvbnNCaW5kaW5nKElCaW5kaW5nIHZhbHVlKQotICAgIHsKLSAgICAgICAgX2V4Y2VwdGlvbnNCaW5kaW5nID0gdmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIElCaW5kaW5nIGdldEV4Y2VwdGlvbnNCaW5kaW5nKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfZXhjZXB0aW9uc0JpbmRpbmc7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEVhY2ggdGltZSB0aGUgY3VycmVudCBleGNlcHRpb24gaXMgc2V0LCBhcyBhIHNpZGUgZWZmZWN0LAotICAgICAqICB0aGUgZXZlbk9kZCBoZWxwZXIgYmVhbiBpcyByZXNldCB0byBldmVuLgotICAgICAqIAotICAgICAqKi8KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRFeGNlcHRpb24oRXhjZXB0aW9uRGVzY3JpcHRpb24gdmFsdWUpCi0gICAgewotICAgICAgICBfZXhjZXB0aW9uID0gdmFsdWU7Ci0gICAgICAgIAotICAgICAgICBfZXZlbk9kZC5zZXRFdmVuKHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBFeGNlcHRpb25EZXNjcmlwdGlvbiBnZXRFeGNlcHRpb24oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9leGNlcHRpb247Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVuZGVyQ29tcG9uZW50KElNYXJrdXBXcml0ZXIgd3JpdGVyLCBJUmVxdWVzdEN5Y2xlIGN5Y2xlKQotICAgIHsKLSAgICAgICAgRXhjZXB0aW9uRGVzY3JpcHRpb25bXSBleGNlcHRpb25zID0KLSAgICAgICAgICAgIChFeGNlcHRpb25EZXNjcmlwdGlvbltdKSBfZXhjZXB0aW9uc0JpbmRpbmcuZ2V0T2JqZWN0KAotICAgICAgICAgICAgICAgICJleGNlcHRpb25zIiwKLSAgICAgICAgICAgICAgICBFeGNlcHRpb25EZXNjcmlwdGlvbltdLmNsYXNzKTsKLQotICAgICAgICBfY291bnQgPSBleGNlcHRpb25zLmxlbmd0aDsKLSAgICAgICAgCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBfZXZlbk9kZCA9IChFdmVuT2RkKWdldEJlYW5zKCkuZ2V0QmVhbigiZXZlbk9kZCIpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBzdXBlci5yZW5kZXJDb21wb25lbnQod3JpdGVyLCBjeWNsZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBfZXhjZXB0aW9uID0gbnVsbDsKLSAgICAgICAgICAgIF9ldmVuT2RkID0gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEluZGV4KGludCB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIF9pbmRleCA9IHZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzTGFzdCgpCi0gICAgewotICAgICAgICByZXR1cm4gX2luZGV4ID09IChfY291bnQgLSAxKTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2h0bWwvRXhjZXB0aW9uRGlzcGxheS5qd2MgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvaHRtbC9FeGNlcHRpb25EaXNwbGF5Lmp3YwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdjZjhhZS4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvaHRtbC9FeGNlcHRpb25EaXNwbGF5Lmp3YworKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAgCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPCEtLSAkSWQkIC0tPgotPCFET0NUWVBFIGNvbXBvbmVudC1zcGVjaWZpY2F0aW9uIFBVQkxJQyAKLSAgIi0vL0FwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLy9UYXBlc3RyeSBTcGVjaWZpY2F0aW9uIDMuMC8vRU4iIAotICAiaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy90YXBlc3RyeS9kdGQvVGFwZXN0cnlfM18wLmR0ZCI+Ci0JCQotPGNvbXBvbmVudC1zcGVjaWZpY2F0aW9uIGNsYXNzPSJvcmcuYXBhY2hlLnRhcGVzdHJ5Lmh0bWwuRXhjZXB0aW9uRGlzcGxheSIgCi0JYWxsb3ctYm9keT0ibm8iIAotCWFsbG93LWluZm9ybWFsLXBhcmFtZXRlcnM9Im5vIj4KLSAgCi0gIDxkZXNjcmlwdGlvbj4KLSAgVXNlZCB0byBwcmVzZW50IGEgZGV0YWlsIGV4Y2VwdGlvbiBkZXNjcmlwdGlvbi4KLSAgPC9kZXNjcmlwdGlvbj4KLSAgCi0gIDxwYXJhbWV0ZXIgbmFtZT0iZXhjZXB0aW9ucyIgcmVxdWlyZWQ9InllcyI+Ci0gICAgPGRlc2NyaXB0aW9uPgotICAgIEFuIGFycmF5IG9mIEV4Y2VwdGlvbkRlc2NyaXB0aW9uIG9iamVjdHMuCi0gICAgPC9kZXNjcmlwdGlvbj4KLSAgPC9wYXJhbWV0ZXI+Ci0gIAotICA8YmVhbiBuYW1lPSJldmVuT2RkIiBjbGFzcz0ib3JnLmFwYWNoZS50YXBlc3RyeS5iZWFuLkV2ZW5PZGQiLz4KLSAgICAKLSAgPGNvbXBvbmVudCBpZD0iZUV4Y2VwdGlvbiIgdHlwZT0iRm9yZWFjaCI+Ci0gICAgPGluaGVyaXRlZC1iaW5kaW5nIG5hbWU9InNvdXJjZSIgcGFyYW1ldGVyLW5hbWU9ImV4Y2VwdGlvbnMiLz4KLSAgICA8YmluZGluZyBuYW1lPSJ2YWx1ZSIgZXhwcmVzc2lvbj0iZXhjZXB0aW9uIi8+Ci0gICAgPGJpbmRpbmcgbmFtZT0iaW5kZXgiIGV4cHJlc3Npb249ImluZGV4Ii8+Ci0gIDwvY29tcG9uZW50PgotICAKLSAgPGNvbXBvbmVudCBpZD0iaW5zZXJ0Q2xhc3MiIHR5cGU9Ikluc2VydCI+Ci0gICAgPGJpbmRpbmcgbmFtZT0idmFsdWUiIGV4cHJlc3Npb249ImV4Y2VwdGlvbi5leGNlcHRpb25DbGFzc05hbWUiLz4KLSAgPC9jb21wb25lbnQ+Ci0gIAotICA8Y29tcG9uZW50IGlkPSJpbnNlcnRNZXNzYWdlIiB0eXBlPSJJbnNlcnQiPgotICAgIDxiaW5kaW5nIG5hbWU9InZhbHVlIiBleHByZXNzaW9uPSJleGNlcHRpb24ubWVzc2FnZSIvPgotICA8L2NvbXBvbmVudD4KLSAgCi0gIDxjb21wb25lbnQgaWQ9ImVQcm9wZXJ0eSIgdHlwZT0iRm9yZWFjaCI+Ci0gIAk8c3RhdGljLWJpbmRpbmcgbmFtZT0iZWxlbWVudCIgdmFsdWU9InRyIi8+Ci0gIAk8YmluZGluZyBuYW1lPSJjbGFzcyIgZXhwcmVzc2lvbj0iYmVhbnMuZXZlbk9kZC5uZXh0Ii8+Ci0gICAgPGJpbmRpbmcgbmFtZT0ic291cmNlIiBleHByZXNzaW9uPSJleGNlcHRpb24ucHJvcGVydGllcyIvPgotICA8L2NvbXBvbmVudD4KLSAgCi0gIDxjb21wb25lbnQgaWQ9Imluc2VydFByb3BlcnR5TmFtZSIgdHlwZT0iSW5zZXJ0Ij4KLSAgICA8YmluZGluZyBuYW1lPSJ2YWx1ZSIgZXhwcmVzc2lvbj0iY29tcG9uZW50cy5lUHJvcGVydHkudmFsdWUubmFtZSIvPgotICA8L2NvbXBvbmVudD4KLSAgCi0gIDxjb21wb25lbnQgaWQ9Imluc2VydFByb3BlcnR5VmFsdWUiIHR5cGU9Ikluc2VydCI+Ci0gICAgPGJpbmRpbmcgbmFtZT0idmFsdWUiIGV4cHJlc3Npb249ImNvbXBvbmVudHMuZVByb3BlcnR5LnZhbHVlLnZhbHVlIi8+Ci0gIDwvY29tcG9uZW50PgotICAKLSAgPGNvbXBvbmVudCBpZD0iaWZMYXN0IiB0eXBlPSJDb25kaXRpb25hbCI+Ci0gICAgPGJpbmRpbmcgbmFtZT0iY29uZGl0aW9uIiBleHByZXNzaW9uPSJsYXN0Ii8+Ci0gIDwvY29tcG9uZW50PgotICAKLSAgPGNvbXBvbmVudCBpZD0iaWZOb3RMYXN0IiB0eXBlPSJDb25kaXRpb25hbCI+Ci0gICAgPGJpbmRpbmcgbmFtZT0iY29uZGl0aW9uIiBleHByZXNzaW9uPSIhIGxhc3QiLz4KLSAgPC9jb21wb25lbnQ+Ci0gIAotICA8Y29tcG9uZW50IGlkPSJlU3RhY2siIHR5cGU9IkZvcmVhY2giPgotICAgIDxzdGF0aWMtYmluZGluZyBuYW1lPSJlbGVtZW50IiB2YWx1ZT0ibGkiLz4KLSAgICA8YmluZGluZyBuYW1lPSJzb3VyY2UiIGV4cHJlc3Npb249ImV4Y2VwdGlvbi5zdGFja1RyYWNlIi8+Ci0gIDwvY29tcG9uZW50PgotICAKLSAgPGNvbXBvbmVudCBpZD0iaW5zZXJ0U3RhY2tUcmFjZSIgdHlwZT0iSW5zZXJ0Ij4KLSAgICA8YmluZGluZyBuYW1lPSJ2YWx1ZSIgZXhwcmVzc2lvbj0iY29tcG9uZW50cy5lU3RhY2sudmFsdWUiLz4KLSAgPC9jb21wb25lbnQ+Ci0gIAotPC9jb21wb25lbnQtc3BlY2lmaWNhdGlvbj4KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9odG1sL0ZyYW1lLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvaHRtbC9GcmFtZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzEzODdmLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9odG1sL0ZyYW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5odG1sOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5BYnN0cmFjdENvbXBvbmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklFbmdpbmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JTWFya3VwV3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlcXVlc3RDeWNsZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LlRhcGVzdHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuZW5naW5lLklFbmdpbmVTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuZW5naW5lLklMaW5rOwotCi0vKioKLSAqICBJbXBsZW1lbnRzIGEgJmx0O2ZyYW1lJmd0OyB3aXRoaW4gYSAmbHQ7ZnJhbWVzZXQmZ3Q7LgotICogCi0gKiAgWzxhIGhyZWY9Ii4uLy4uLy4uLy4uLy4uL0NvbXBvbmVudFJlZmVyZW5jZS9GcmFtZS5odG1sIj5Db21wb25lbnQgUmVmZXJlbmNlPC9hPl0KLSAqIAotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKgotICoqLwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRnJhbWUgZXh0ZW5kcyBBYnN0cmFjdENvbXBvbmVudAotewotICAgIHByb3RlY3RlZCB2b2lkIHJlbmRlckNvbXBvbmVudChJTWFya3VwV3JpdGVyIHdyaXRlciwgSVJlcXVlc3RDeWNsZSBjeWNsZSkKLSAgICB7Ci0gICAgICAgIGlmIChjeWNsZS5pc1Jld2luZGluZygpKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIElFbmdpbmUgZW5naW5lID0gY3ljbGUuZ2V0RW5naW5lKCk7Ci0gICAgICAgIElFbmdpbmVTZXJ2aWNlIHBhZ2VTZXJ2aWNlID0gZW5naW5lLmdldFNlcnZpY2UoVGFwZXN0cnkuUEFHRV9TRVJWSUNFKTsKLSAgICAgICAgSUxpbmsgbGluayA9IHBhZ2VTZXJ2aWNlLmdldExpbmsoY3ljbGUsIHRoaXMsIG5ldyBTdHJpbmdbXSB7IGdldFRhcmdldFBhZ2UoKSB9KTsKLQotICAgICAgICB3cml0ZXIuYmVnaW5FbXB0eSgiZnJhbWUiKTsKLSAgICAgICAgd3JpdGVyLmF0dHJpYnV0ZSgic3JjIiwgbGluay5nZXRVUkwoKSk7Ci0KLSAgICAgICAgcmVuZGVySW5mb3JtYWxQYXJhbWV0ZXJzKHdyaXRlciwgY3ljbGUpOwotCi0gICAgICAgIHdyaXRlci5jbG9zZVRhZygpOwotICAgIH0KLQotICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0VGFyZ2V0UGFnZSgpOwotCi0gICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0VGFyZ2V0UGFnZShTdHJpbmcgdGFyZ2V0UGFnZSk7Ci19CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvaHRtbC9GcmFtZS5qd2MgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvaHRtbC9GcmFtZS5qd2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxY2U3YmMuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2h0bWwvRnJhbWUuandjCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICAKLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08IS0tICRJZCQgLS0+Ci08IURPQ1RZUEUgY29tcG9uZW50LXNwZWNpZmljYXRpb24gUFVCTElDIAotICAiLS8vQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24vL1RhcGVzdHJ5IFNwZWNpZmljYXRpb24gMy4wLy9FTiIgCi0gICJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL3RhcGVzdHJ5L2R0ZC9UYXBlc3RyeV8zXzAuZHRkIj4KLQkKLTxjb21wb25lbnQtc3BlY2lmaWNhdGlvbiBjbGFzcz0ib3JnLmFwYWNoZS50YXBlc3RyeS5odG1sLkZyYW1lIiAKLQlhbGxvdy1ib2R5PSJubyIKLQlhbGxvdy1pbmZvcm1hbC1wYXJhbWV0ZXJzPSJ5ZXMiPgotCi0gIDxkZXNjcmlwdGlvbj4KLSAgSWRlbnRpZmllcyBhIHBhZ2UgYXMgdGhlIGNvbnRlbnRzIG9mIGEgZnJhbWUgd2l0aGluIGEgZnJhbWVzZXQuCi0gIDwvZGVzY3JpcHRpb24+Ci0KLSAgPHBhcmFtZXRlciBuYW1lPSJwYWdlIiAKLSAgCQlwcm9wZXJ0eS1uYW1lPSJ0YXJnZXRQYWdlIgotICAJCXR5cGU9ImphdmEubGFuZy5TdHJpbmciIAotICAJCXJlcXVpcmVkPSJ5ZXMiIAotICAJCWRpcmVjdGlvbj0iaW4iPgotICAgIDxkZXNjcmlwdGlvbj4KLQlUaGUgcGFnZSB0byBkaXNwbGF5IGluIHRoZSBmcmFtZS4KLSAgICA8L2Rlc2NyaXB0aW9uPgotICA8L3BhcmFtZXRlcj4KLSAgCi0gIDxyZXNlcnZlZC1wYXJhbWV0ZXIgbmFtZT0ic3JjIi8+Ci0gIAotPC9jb21wb25lbnQtc3BlY2lmaWNhdGlvbj4KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9odG1sL0hUTUxXcml0ZXIuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9odG1sL0hUTUxXcml0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZjMDEwZC4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvaHRtbC9IVE1MV3JpdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuaHRtbDsKLQotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LkFic3RyYWN0TWFya3VwV3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSU1hcmt1cFdyaXRlcjsKLQotLyoqCi0gKiAgVGhpcyBjbGFzcyBpcyB1c2VkIHRvIGNyZWF0ZSBIVE1MIG91dHB1dC4KLSAqCi0gKiAgPHA+VGhlIDxjb2RlPkhUTUxXcml0ZXI8L2NvZGU+IGhhbmRsZXMgdGhlIG5lY2Vzc2FyeSBlc2NhcGluZyAKLSAqICBvZiBpbnZhbGlkIGNoYXJhY3RlcnMuCi0gKiAgU3BlY2lmaWNhbGx5LCB0aGUgJyZsdDsnLCAnJmd0OycgYW5kICcmYW1wOycgY2hhcmFjdGVycyBhcmUgcHJvcGVybHkKLSAqICBjb252ZXJ0ZWQgdG8gdGhlaXIgSFRNTCBlbnRpdGllcyBieSB0aGUgPGNvZGU+cHJpbnQoKTwvY29kZT4gbWV0aG9kcy4KLSAqICBTaW1pbGFyIG1lYXN1cmVzIGFyZSB0YWtlbiBieSB0aGUge0BsaW5rICNhdHRyaWJ1dGUoU3RyaW5nLCBTdHJpbmcpfSBtZXRob2QuCi0gKiAgT3RoZXIgaW52YWxpZCBjaGFyYWN0ZXJzIGFyZSBjb252ZXJ0ZWQgdG8gdGhlaXIgbnVtZXJpYyBlbnRpdHkgZXF1aXZhbGVudC4KLSAqCi0gKiAgQHZlcnNpb24gJElkJAotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqKi8KLQotcHVibGljIGNsYXNzIEhUTUxXcml0ZXIgZXh0ZW5kcyBBYnN0cmFjdE1hcmt1cFdyaXRlcgotewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gZW50aXRpZXMgPSBuZXcgU3RyaW5nWzY0XTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuW10gc2FmZSA9IG5ldyBib29sZWFuWzEyOF07Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FGRV9DSEFSQUNURVJTID0KLSAgICAgICAgIjAxMjM0NTY3ODkwIgotICAgICAgICAgICAgKyAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiCi0gICAgICAgICAgICArICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiIKLSAgICAgICAgICAgICsgIlx0XG5cciAhXCIjJCUnKCkqKywtLi86Oz0/QFtcXF1eX2B7fH1+IjsKLQotICAgIHN0YXRpYyB7Ci0gICAgICAgIGVudGl0aWVzWyciJ10gPSAiJnF1b3Q7IjsKLSAgICAgICAgZW50aXRpZXNbJzwnXSA9ICImbHQ7IjsKLSAgICAgICAgZW50aXRpZXNbJz4nXSA9ICImZ3Q7IjsKLSAgICAgICAgZW50aXRpZXNbJyYnXSA9ICImYW1wOyI7Ci0KLSAgICAgICAgaW50IGxlbmd0aCA9IFNBRkVfQ0hBUkFDVEVSUy5sZW5ndGgoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKLSAgICAgICAgICAgIHNhZmVbU0FGRV9DSEFSQUNURVJTLmNoYXJBdChpKV0gPSB0cnVlOwotICAgIH0KLQotCS8qKgotCSAqICBDcmVhdGVzIGEgbmV3IG1hcmt1cCB3cml0ZXIgYXJvdW5kIHRoZSB7QGxpbmsgUHJpbnRXcml0ZXJ9LgotCSAqICBUaGUgd3JpdGVyIHdpbGwgbm90IGJlIGNsb3NlZCB3aGVuIHRoZSBtYXJrdXAgd3JpdGVyIGNsb3Nlcy4KLQkgKiAgVGhlIGNvbnRlbnQgdHlwZSBpcyBjdXJyZW50bHkgaGFyZC13aXJlZCB0bwotCSAqICA8Y29kZT50ZXh0L2h0bWw8L2NvZGU+LgotCSAqIAotCSAqICBAc2luY2UgMy4wCi0JICogCi0JICoqLwotCQotCXB1YmxpYyBIVE1MV3JpdGVyKFByaW50V3JpdGVyIHdyaXRlcikKLQl7Ci0JCXN1cGVyKHNhZmUsIGVudGl0aWVzLCAidGV4dC9odG1sIiwgd3JpdGVyKTsKLQl9Ci0KLSAgICBwdWJsaWMgSFRNTFdyaXRlcihTdHJpbmcgY29udGVudFR5cGUsIE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0pCi0gICAgewotICAgICAgICBzdXBlcihzYWZlLCBlbnRpdGllcywgY29udGVudFR5cGUsIG91dHB1dFN0cmVhbSk7Ci0gICAgfQotCi0gICAgcHVibGljIEhUTUxXcml0ZXIoU3RyaW5nIGNvbnRlbnRUeXBlLCBTdHJpbmcgZW5jb2RpbmcsIE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0pCi0gICAgewotICAgICAgICBzdXBlcihzYWZlLCBlbnRpdGllcywgY29udGVudFR5cGUsIGVuY29kaW5nLCBvdXRwdXRTdHJlYW0pOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBIVE1MV3JpdGVyKFN0cmluZyBjb250ZW50VHlwZSkKLSAgICB7Ci0gICAgICAgIHN1cGVyKHNhZmUsIGVudGl0aWVzLCBjb250ZW50VHlwZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIENyZWF0ZXMgYSBkZWZhdWx0IHdyaXRlciBmb3IgY29udGVudCB0eXBlICJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiLgotICAgICAqIAotICAgICAqKi8KLQotICAgIHB1YmxpYyBIVE1MV3JpdGVyKE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0pCi0gICAgewotICAgICAgICB0aGlzKG91dHB1dFN0cmVhbSwgIlVURi04Iik7Ci0gICAgfQotCi0gICAgcHVibGljIEhUTUxXcml0ZXIoT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSwgU3RyaW5nIGVuY29kaW5nKQotICAgIHsKLSAgICAgICAgdGhpcygidGV4dC9odG1sIiwgZW5jb2RpbmcsIG91dHB1dFN0cmVhbSk7Ci0gICAgfQotCi0gICAgcHVibGljIElNYXJrdXBXcml0ZXIgZ2V0TmVzdGVkV3JpdGVyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgTmVzdGVkSFRNTFdyaXRlcih0aGlzKTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2h0bWwvSW1hZ2UuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9odG1sL0ltYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlODRjZmUuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2h0bWwvSW1hZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5Lmh0bWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LkFic3RyYWN0Q29tcG9uZW50OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUFzc2V0OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSU1hcmt1cFdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZXF1ZXN0Q3ljbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5UYXBlc3RyeTsKLQotLyoqCi0gKiAgVXNlZCB0byBpbnNlcnQgYW4gaW1hZ2UuICBUbyBjcmVhdGUgYSByb2xsb3ZlciBpbWFnZSwgdXNlIHRoZQotICogIHtAbGluayBSb2xsb3Zlcn0gY2xhc3MsIHdoaWNoIGludGVncmF0ZXMgYSBsaW5rIHdpdGggdGhlIGltYWdlIGFzc2V0cwotICogIHVzZWQgd2l0aCB0aGUgYnV0dG9uLgotICoKLSAqICBbPGEgaHJlZj0iLi4vLi4vLi4vLi4vLi4vQ29tcG9uZW50UmVmZXJlbmNlL0ltYWdlLmh0bWwiPkNvbXBvbmVudCBSZWZlcmVuY2U8L2E+XQotICoKLSAqCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogIEB2ZXJzaW9uICRJZCQKLSAqIAotICoqLwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSW1hZ2UgZXh0ZW5kcyBBYnN0cmFjdENvbXBvbmVudAotewotICAgIC8qKgotICAgICAqICBSZW5kZXJzIHRoZSAmbHQ7aW1nJmd0OyBlbGVtZW50LgotICAgICAqCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwcm90ZWN0ZWQgdm9pZCByZW5kZXJDb21wb25lbnQoSU1hcmt1cFdyaXRlciB3cml0ZXIsIElSZXF1ZXN0Q3ljbGUgY3ljbGUpCi0gICAgewotICAgICAgICAvLyBEb2Vzbid0IGNvbnRhaW4gYSBib2R5IHNvIG5vIG5lZWQgdG8gZG8gYW55dGhpbmcgb24gcmV3aW5kIChhc3N1bWVzIG5vCi0gICAgICAgIC8vIHNpZGVmZmVjdHMgdG8gYWNjZXNzb3IgbWV0aG9kcyB2aWEgYmluZGluZ3MpLgotCi0gICAgICAgIGlmIChjeWNsZS5pc1Jld2luZGluZygpKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIElBc3NldCBpbWFnZUFzc2V0ID0gZ2V0SW1hZ2UoKTsKLQotICAgICAgICBpZiAoaW1hZ2VBc3NldCA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgVGFwZXN0cnkuY3JlYXRlUmVxdWlyZWRQYXJhbWV0ZXJFeGNlcHRpb24odGhpcywgImltYWdlIik7Ci0KLSAgICAgICAgU3RyaW5nIGltYWdlVVJMID0gaW1hZ2VBc3NldC5idWlsZFVSTChjeWNsZSk7Ci0KLSAgICAgICAgd3JpdGVyLmJlZ2luRW1wdHkoImltZyIpOwotCi0gICAgICAgIHdyaXRlci5hdHRyaWJ1dGUoInNyYyIsIGltYWdlVVJMKTsKLQotICAgICAgICB3cml0ZXIuYXR0cmlidXRlKCJib3JkZXIiLCBnZXRCb3JkZXIoKSk7Ci0KLSAgICAgICAgcmVuZGVySW5mb3JtYWxQYXJhbWV0ZXJzKHdyaXRlciwgY3ljbGUpOwotCi0gICAgICAgIHdyaXRlci5jbG9zZVRhZygpOwotCi0gICAgfQotCi0gICAgcHVibGljIGFic3RyYWN0IElBc3NldCBnZXRJbWFnZSgpOwotCi0gICAgcHVibGljIGFic3RyYWN0IGludCBnZXRCb3JkZXIoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvaHRtbC9JbWFnZS5qd2MgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvaHRtbC9JbWFnZS5qd2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3MjgyNzkuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2h0bWwvSW1hZ2UuandjCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICAKLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08IS0tICRJZCQgLS0+Ci08IURPQ1RZUEUgY29tcG9uZW50LXNwZWNpZmljYXRpb24gUFVCTElDIAotICAiLS8vQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24vL1RhcGVzdHJ5IFNwZWNpZmljYXRpb24gMy4wLy9FTiIgCi0gICJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL3RhcGVzdHJ5L2R0ZC9UYXBlc3RyeV8zXzAuZHRkIj4KLSAgCi08Y29tcG9uZW50LXNwZWNpZmljYXRpb24gY2xhc3M9Im9yZy5hcGFjaGUudGFwZXN0cnkuaHRtbC5JbWFnZSIgYWxsb3ctYm9keT0ibm8iPgotCi0gIDxkZXNjcmlwdGlvbj4KLSAgRGlzcGxheXMgYW4gaW1hZ2UsIGRlcml2aW5nIHRoZSBzb3VyY2UgVVJMIGZvciB0aGUgaW1hZ2UgZnJvbSBhbiBhc3NldC4KLSAgPC9kZXNjcmlwdGlvbj4KLQotICA8cGFyYW1ldGVyIG5hbWU9ImltYWdlIiAKLSAgCXR5cGU9Im9yZy5hcGFjaGUudGFwZXN0cnkuSUFzc2V0IiAKLSAgCXJlcXVpcmVkPSJ5ZXMiCi0gIAlkaXJlY3Rpb249ImluIj4KLSAgICA8ZGVzY3JpcHRpb24+Ci0gICAgVGhlIGFzc2V0IHRvIGRpc3BsYXkuCi0gICAgPC9kZXNjcmlwdGlvbj4KLSAgPC9wYXJhbWV0ZXI+Ci0gIAotICA8cGFyYW1ldGVyIG5hbWU9ImJvcmRlciIKLSAgCXR5cGU9ImludCIKLSAgCWRpcmVjdGlvbj0iaW4iPgotICAgIDxkZXNjcmlwdGlvbj4KLSAgICBOdW1iZXIgb2YgcGl4ZWxzIG9mIGJvcmRlci4KLSAgICA8L2Rlc2NyaXB0aW9uPgotICA8L3BhcmFtZXRlcj4KLSAgCi0gIDxyZXNlcnZlZC1wYXJhbWV0ZXIgbmFtZT0ic3JjIi8+Ci0gIAotPC9jb21wb25lbnQtc3BlY2lmaWNhdGlvbj4KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9odG1sL0luc2VydFRleHQuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9odG1sL0luc2VydFRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQ0YTdmMS4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvaHRtbC9JbnNlcnRUZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuaHRtbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5MaW5lTnVtYmVyUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5BYnN0cmFjdENvbXBvbmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LkFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklNYXJrdXBXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVxdWVzdEN5Y2xlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuVGFwZXN0cnk7Ci0KLS8qKgotICogIEluc2VydHMgZm9ybWF0dGVkIHRleHQgKHBvc3NpYmx5IGNvbGxlY3RlZCB1c2luZyBhIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LmZvcm0uVGV4dEFyZWF9IAotICogIGNvbXBvbmVudC4KLSAqIAotICogIFs8YSBocmVmPSIuLi8uLi8uLi8uLi8uLi9Db21wb25lbnRSZWZlcmVuY2UvSW5zZXJ0VGV4dC5odG1sIj5Db21wb25lbnQgUmVmZXJlbmNlPC9hPl0KLSAqCi0gKiAgPHA+VG8gbWFpbnRhaW4gdGhlIGxpbmUgYnJlYWtzIHByb3ZpZGVkIG9yaWdpbmFsbHksIHRoaXMgY29tcG9uZW50IHdpbGwKLSAqICBicmVhayB0aGUgaW5wdXQgaW50byBpbmRpdmlkdWFsIGxpbmVzIGFuZCBpbnNlcnQgYWRkaXRpb25hbAotICogIEhUTUwgdG8gbWFrZSBlYWNoIGxpbmUgc2VwZXJhdGUuCi0gKgotICogIDxwPlRoaXMgY2FuIGJlIGRvd24gbW9yZSBzaW1wbHksIHVzaW5nIHRoZSAmbHQ7cHJlJmd0OyBIVE1MIGVsZW1lbnQsIGJ1dAotICogIHRoYXQgdXN1YWxseSByZW5kZXJzIHRoZSB0ZXh0IGluIGEgbm9uLXByb3BvcnRpb25hbCBmb250LgotICoKLSAqIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqIEB2ZXJzaW9uICRJZCQKLSAqIAotICoqLwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSW5zZXJ0VGV4dCBleHRlbmRzIEFic3RyYWN0Q29tcG9uZW50Ci17Ci0gICAgcHJvdGVjdGVkIHZvaWQgcmVuZGVyQ29tcG9uZW50KElNYXJrdXBXcml0ZXIgd3JpdGVyLCBJUmVxdWVzdEN5Y2xlIGN5Y2xlKQotICAgIHsKLSAgICAgICAgU3RyaW5nIHZhbHVlID0gZ2V0VmFsdWUoKTsKLQotICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBTdHJpbmdSZWFkZXIgcmVhZGVyID0gbnVsbDsKLSAgICAgICAgTGluZU51bWJlclJlYWRlciBsaW5lUmVhZGVyID0gbnVsbDsKLSAgICAgICAgSW5zZXJ0VGV4dE1vZGUgbW9kZSA9IGdldE1vZGUoKTsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcmVhZGVyID0gbmV3IFN0cmluZ1JlYWRlcih2YWx1ZSk7Ci0KLSAgICAgICAgICAgIGxpbmVSZWFkZXIgPSBuZXcgTGluZU51bWJlclJlYWRlcihyZWFkZXIpOwotCi0gICAgICAgICAgICBpbnQgbGluZU51bWJlciA9IDA7Ci0KLSAgICAgICAgICAgIHdoaWxlICh0cnVlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZyBsaW5lID0gbGluZVJlYWRlci5yZWFkTGluZSgpOwotCi0gICAgICAgICAgICAgICAgLy8gRXhpdCBsb29wIGF0IGVuZCBvZiBmaWxlLgotCi0gICAgICAgICAgICAgICAgaWYgKGxpbmUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBtb2RlLndyaXRlTGluZShsaW5lTnVtYmVyLCBsaW5lLCB3cml0ZXIpOwotCi0gICAgICAgICAgICAgICAgbGluZU51bWJlcisrOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGV4KQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIFRhcGVzdHJ5LmdldE1lc3NhZ2UoIkluc2VydFRleHQuY29udmVyc2lvbi1lcnJvciIpLAotICAgICAgICAgICAgICAgIHRoaXMsCi0gICAgICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgICAgICBleCk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBjbG9zZShsaW5lUmVhZGVyKTsKLSAgICAgICAgICAgIGNsb3NlKHJlYWRlcik7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjbG9zZShSZWFkZXIgcmVhZGVyKQotICAgIHsKLSAgICAgICAgaWYgKHJlYWRlciA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZWFkZXIuY2xvc2UoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGFic3RyYWN0IEluc2VydFRleHRNb2RlIGdldE1vZGUoKTsKLQotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldE1vZGUoSW5zZXJ0VGV4dE1vZGUgbW9kZSk7Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFZhbHVlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBtb2RlIHBhcmFtZXRlciBwcm9wZXJ0eSB0byBpdHMgZGVmYXVsdCwKLSAgICAgKiB7QGxpbmsgSW5zZXJ0VGV4dE1vZGUjQlJFQUt9LgotICAgICAqIAotICAgICAqIEBzaW5jZSAzLjAKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBmaW5pc2hMb2FkKCkKLSAgICB7Ci0gICAgICAgIHNldE1vZGUoSW5zZXJ0VGV4dE1vZGUuQlJFQUspOwotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9odG1sL0luc2VydFRleHQuandjIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2h0bWwvSW5zZXJ0VGV4dC5qd2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyOGFmMDcuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2h0bWwvSW5zZXJ0VGV4dC5qd2MKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gIAotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTwhLS0gJElkJCAtLT4KLTwhRE9DVFlQRSBjb21wb25lbnQtc3BlY2lmaWNhdGlvbiBQVUJMSUMgCi0gICItLy9BcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi8vVGFwZXN0cnkgU3BlY2lmaWNhdGlvbiAzLjAvL0VOIiAKLSAgImh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvdGFwZXN0cnkvZHRkL1RhcGVzdHJ5XzNfMC5kdGQiPgotCQotPGNvbXBvbmVudC1zcGVjaWZpY2F0aW9uIGNsYXNzPSJvcmcuYXBhY2hlLnRhcGVzdHJ5Lmh0bWwuSW5zZXJ0VGV4dCIgCi0JYWxsb3ctYm9keT0ibm8iIAotCWFsbG93LWluZm9ybWFsLXBhcmFtZXRlcnM9Im5vIj4KLQotICA8ZGVzY3JpcHRpb24+Ci0gIEluc2VydHMgbGluZS1vcmllbnRlZCB0ZXh0IGludG8gdGhlIHJlc3BvbnNlIEhUTUwsIGluc2VydGluZyBhZGRpdGlvbmFsCi0gIG1hcmt1cCB0byBkZWxpbWl0IGxpbmVzLgotICA8L2Rlc2NyaXB0aW9uPgotICAKLSAgIDxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciIGRpcmVjdGlvbj0iaW4iPgotICAgIDxkZXNjcmlwdGlvbj4KLSAgCVRoZSB0ZXh0IHRvIGluc2VydC4KLSAgICA8L2Rlc2NyaXB0aW9uPgotICA8L3BhcmFtZXRlcj4KLQotICA8cGFyYW1ldGVyIG5hbWU9Im1vZGUiIAotICAJdHlwZT0ib3JnLmFwYWNoZS50YXBlc3RyeS5odG1sLkluc2VydFRleHRNb2RlIgotICAJZGlyZWN0aW9uPSJpbiI+Ci0gICAgPGRlc2NyaXB0aW9uPgotICAgIERldGVybWluZXMgd2hpY2ggbW9kZSB0byB1c2U6IGJyZWFrcyBhZnRlciBlYWNoIGxpbmUsIG9yIHdyYXAgZWFjaCBsaW5lCi0gICAgYXMgYSBwYXJhZ3JhcGguICBUaGUgZGVmYXVsdCBpcyBicmVha3MuCi0gICAgPC9kZXNjcmlwdGlvbj4KLSAgPC9wYXJhbWV0ZXI+Ci0KLTwvY29tcG9uZW50LXNwZWNpZmljYXRpb24+CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvaHRtbC9JbnNlcnRUZXh0TW9kZS5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2h0bWwvSW5zZXJ0VGV4dE1vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM2Nzg5ZC4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvaHRtbC9JbnNlcnRUZXh0TW9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuaHRtbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLmVudW0uRW51bTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklNYXJrdXBXcml0ZXI7Ci0KLS8qKgotICogIERlZmluZXMgYSBudW1iZXIgb2Ygd2F5cyB0byBmb3JtYXQgbXVsdGktbGluZSB0ZXh0IGZvciBwcm9wZXIKLSAqICByZW5kZXJyaW5nLgotICoKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICoKLSAqKi8KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEluc2VydFRleHRNb2RlIGV4dGVuZHMgRW51bQotewotICAgIC8qKgotICAgICAqICBNb2RlIHdoZXJlIGVhY2ggbGluZSAoYWZ0ZXIgdGhlIGZpcnN0KSBpcyBwcmVjZWRlZCBieSBhICZsdDticiZndDsgdGFnLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBJbnNlcnRUZXh0TW9kZSBCUkVBSyA9IG5ldyBCcmVha01vZGUoKTsKLQotICAgIC8qKgotICAgICAqICBNb2RlIHdoZXJlIGVhY2ggbGluZSBpcyB3cmFwcGVkIHdpdGggYSAmbHQ7cCZndDsgZWxlbWVudC4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSW5zZXJ0VGV4dE1vZGUgUEFSQUdSQVBIID0gbmV3IFBhcmFncmFwaE1vZGUoKTsKLQotICAgIHByb3RlY3RlZCBJbnNlcnRUZXh0TW9kZShTdHJpbmcgbmFtZSkKLSAgICB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBJbnZva2VkIGJ5IHRoZSB7QGxpbmsgSW5zZXJ0VGV4dH0gY29tcG9uZW50IHRvIHdyaXRlIHRoZSBuZXh0IGxpbmUuCi0gICAgICoKLSAgICAgKiAgQHBhcmFtIGxpbmVOdW1iZXIgdGhlIGxpbmUgbnVtYmVyIG9mIHRoZSBsaW5lLCBzdGFydGluZyB3aXRoIDAgZm9yIHRoZSBmaXJzdCBsaW5lLgotICAgICAqICBAcGFyYW0gbGluZSB0aGUgU3RyaW5nIGZvciB0aGUgY3VycmVudCBsaW5lLgotICAgICAqICBAcGFyYW0gd3JpdGVyIHRoZSB7QGxpbmsgSU1hcmt1cFdyaXRlcn0gdG8gc2VuZCBvdXRwdXQgdG8uCi0gICAgICoqLwotCi0gICAgcHVibGljIGFic3RyYWN0IHZvaWQgd3JpdGVMaW5lKAotICAgICAgICBpbnQgbGluZU51bWJlciwKLSAgICAgICAgU3RyaW5nIGxpbmUsCi0gICAgICAgIElNYXJrdXBXcml0ZXIgd3JpdGVyKTsKLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEJyZWFrTW9kZSBleHRlbmRzIEluc2VydFRleHRNb2RlCi0gICAgewotICAgICAgICBwcml2YXRlIEJyZWFrTW9kZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN1cGVyKCJCUkVBSyIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgd3JpdGVMaW5lKGludCBsaW5lTnVtYmVyLCBTdHJpbmcgbGluZSwgSU1hcmt1cFdyaXRlciB3cml0ZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChsaW5lTnVtYmVyID4gMCkKLSAgICAgICAgICAgICAgICB3cml0ZXIuYmVnaW5FbXB0eSgiYnIiKTsKLQotICAgICAgICAgICAgd3JpdGVyLnByaW50KGxpbmUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUGFyYWdyYXBoTW9kZSBleHRlbmRzIEluc2VydFRleHRNb2RlCi0gICAgewotICAgICAgICBwcml2YXRlIFBhcmFncmFwaE1vZGUoKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdXBlcigiUEFSQUdSQVBIIik7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZUxpbmUoaW50IGxpbmVOdW1iZXIsIFN0cmluZyBsaW5lLCBJTWFya3VwV3JpdGVyIHdyaXRlcikKLSAgICAgICAgewotICAgICAgICAgICAgd3JpdGVyLmJlZ2luKCJwIik7Ci0KLSAgICAgICAgICAgIHdyaXRlci5wcmludChsaW5lKTsKLQotICAgICAgICAgICAgd3JpdGVyLmVuZCgpOwotICAgICAgICB9Ci0gICAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2h0bWwvTmVzdGVkSFRNTFdyaXRlci5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2h0bWwvTmVzdGVkSFRNTFdyaXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTAzMmZmLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9odG1sL05lc3RlZEhUTUxXcml0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5Lmh0bWw7Ci0KLWltcG9ydCBqYXZhLmlvLkNoYXJBcnJheVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JTWFya3VwV3JpdGVyOwotCi0vKioKLSAqICBTdWJjbGFzcyBvZiB7QGxpbmsgSFRNTFdyaXRlcn0gdGhhdCBpcyBuZXN0ZWQuICBBIG5lc3RlZCB3cml0ZXIKLSAqICBidWZmZXJzIGl0cyBvdXRwdXQsIHRoZW4gaW5zZXJ0cyBpdCBpbnRvIGl0cyBwYXJlbnQgd3JpdGVyIHdoZW4gaXQgaXMKLSAqICBjbG9zZWQuCi0gKgotICogIEBhdXRob3IgSG93YXJkIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKi8KLQotcHVibGljIGNsYXNzIE5lc3RlZEhUTUxXcml0ZXIgZXh0ZW5kcyBIVE1MV3JpdGVyCi17Ci0JcHJpdmF0ZSBJTWFya3VwV3JpdGVyIF9wYXJlbnQ7Ci0JcHJpdmF0ZSBDaGFyQXJyYXlXcml0ZXIgX2ludGVybmFsQnVmZmVyOwotCi0JcHVibGljIE5lc3RlZEhUTUxXcml0ZXIoSU1hcmt1cFdyaXRlciBwYXJlbnQpCi0JewotCQlzdXBlcihwYXJlbnQuZ2V0Q29udGVudFR5cGUoKSk7Ci0KLQkJX3BhcmVudCA9IHBhcmVudDsKLQotCQlfaW50ZXJuYWxCdWZmZXIgPSBuZXcgQ2hhckFycmF5V3JpdGVyKCk7Ci0KLQkJc2V0V3JpdGVyKG5ldyBQcmludFdyaXRlcihfaW50ZXJuYWxCdWZmZXIpKTsKLQl9Ci0KLQkvKioKLQkqICBJbnZva2VzIHRoZSB7QGxpbmsgSFRNTFdyaXRlciNjbG9zZSgpIHN1cGVyLWNsYXNzCi0JKiAgaW1wbGVtZW50YXRpb259LCB0aGVuIGdldHMgdGhlIGRhdGEgYWNjdW11bGF0ZWQgaW4gdGhlCi0JKiAgaW50ZXJuYWwgYnVmZmVyIGFuZCBwcm92aWRlcyBpdCB0byB0aGUgY29udGFpbmluZyB3cml0ZXIgdXNpbmcKLQkqICB7QGxpbmsgSU1hcmt1cFdyaXRlciNwcmludFJhdyhjaGFyW10sIGludCwgaW50KX0uCi0JKgotCSovCi0KLQlwdWJsaWMgdm9pZCBjbG9zZSgpCi0JewotCQlzdXBlci5jbG9zZSgpOwotCi0JCWNoYXJbXSBkYXRhID0gX2ludGVybmFsQnVmZmVyLnRvQ2hhckFycmF5KCk7Ci0KLQkJX3BhcmVudC5wcmludFJhdyhkYXRhLCAwLCBkYXRhLmxlbmd0aCk7Ci0KLQkJX2ludGVybmFsQnVmZmVyID0gbnVsbDsKLQkJX3BhcmVudCA9IG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9odG1sL1ByYWN0aWNhbEJyb3dzZXJTbmlmZmVyLmpzIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2h0bWwvUHJhY3RpY2FsQnJvd3NlclNuaWZmZXIuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1YjkzNjAuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2h0bWwvUHJhY3RpY2FsQnJvd3NlclNuaWZmZXIuanMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotLy8gUHJhY3RpY2FsQnJvd3NlclNuaWZmZXIuanMgLSBEZXRlY3QgQnJvd3Nlcg0KLS8vIFJlcXVpcmVzIEphdmFTY3JpcHQgMS4xDQotLyoNCi1UaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBOZXRzY2FwZSBQdWJsaWMNCi1MaWNlbnNlIFZlcnNpb24gMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQ0KLWV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZg0KLXRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTlBMLw0KLQ0KLVNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUw0KLUlTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi1pbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcNCi1yaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLVRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBCb2IgQ2xhcnkuDQotDQotQ29udHJpYnV0b3Iocyk6IEJvYiBDbGFyeSwgT3JpZ2luYWwgV29yaywgQ29weXJpZ2h0IDE5OTktMjAwMA0KLSAgICAgICAgICAgICAgICBCb2IgQ2xhcnksIE5ldHNjYXBlIENvbW11bmljYXRpb25zLCBDb3B5cmlnaHQgMjAwMQ0KLQ0KLQ0KLU5vdGU6DQotDQotQWNxdWlyZWQgZnJvbTogaHR0cDovL2RldmVsb3Blci5uZXRzY2FwZS5jb20vZXZhbmdlbGlzbS90b29scy9wcmFjdGljYWwtYnJvd3Nlci1zbmlmZmluZy8NCi1MYXN0IHVwZGF0ZTogSnVseSAxNywgMjAwMQ0KLQ0KLSovDQotDQotLy8gd29yayBhcm91bmQgYnVnIGluIHhwY2RvbSBNb3ppbGxhIDAuOS4xDQotd2luZG93LnNhdmVOYXZpZ2F0b3IgPSB3aW5kb3cubmF2aWdhdG9yOw0KLQ0KLS8vIEhhbmR5IGZ1bmN0aW9ucw0KLWZ1bmN0aW9uIG5vb3AoKSB7fQ0KLWZ1bmN0aW9uIG5vZXJyb3IoKSB7IHJldHVybiB0cnVlOyB9DQotDQotZnVuY3Rpb24gZGVmYXVsdE9uRXJyb3IobXNnLCB1cmwsIGxpbmUpDQotew0KLQkvLyBjdXN0b21pemUgdGhpcyBmb3IgeW91ciBzaXRlDQotCWlmICh0b3AubG9jYXRpb24uaHJlZi5pbmRleE9mKCdfZmlsZXMvZXJyb3JzLycpID09IC0xKQ0KLQkJdG9wLmxvY2F0aW9uID0gJy9ldmFuZ2VsaXNtL3hiUHJvamVjdHMvX2ZpbGVzL2Vycm9ycy9pbmRleC5odG1sP21zZz0nICsgZXNjYXBlKG1zZykgKyAnJnVybD0nICsgZXNjYXBlKHVybCkgKyAnJmxpbmU9JyArIGVzY2FwZShsaW5lKTsNCi19DQotDQotLy8gRGlzcGxheSBFcnJvciBwYWdlLi4uIA0KLS8vIFhYWDogbW9yZSB3b3JrIHRvIGJlIGRvbmUgaGVyZQ0KLS8vDQotZnVuY3Rpb24gcmVwb3J0RXJyb3IobWVzc2FnZSkNCi17DQotCS8vIGN1c3RvbWl6ZSB0aGlzIGZvciB5b3VyIHNpdGUNCi0JaWYgKHRvcC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoJ19maWxlcy9lcnJvcnMvJykgPT0gLTEpDQotCQl0b3AubG9jYXRpb24gPSAnL2V2YW5nZWxpc20veGJQcm9qZWN0cy9fZmlsZXMvZXJyb3JzL2luZGV4Lmh0bWw/bXNnPScgKyBlc2NhcGUobWVzc2FnZSk7DQotfQ0KLQ0KLWZ1bmN0aW9uIHBhZ2VSZXF1aXJlcyhjb25kLCBtc2csIHJlZGlyZWN0VG8pDQotew0KLQlpZiAoIWNvbmQpDQotCXsNCi0JCW1zZyA9ICdUaGlzIHBhZ2UgcmVxdWlyZXMgJyArIG1zZzsNCi0JCXRvcC5sb2NhdGlvbiA9IHJlZGlyZWN0VG8gKyAnP21zZz0nICsgZXNjYXBlKG1zZyk7DQotCX0NCi0JLy8gcmV0dXJuIGNvbmQgc28gY2FuIHVzZSBpbiA8QT4gb25jbGljayBoYW5kbGVycyB0byBleGNsdWRlIGJyb3dzZXJzDQotCS8vIGZyb20gcGFnZXMgdGhleSBkbyBub3Qgc3VwcG9ydC4NCi0JcmV0dXJuIGNvbmQ7DQotfQ0KLQ0KLWZ1bmN0aW9uIGRldGVjdEJyb3dzZXIoKQ0KLXsNCi0JdmFyIG9sZE9uRXJyb3IgPSB3aW5kb3cub25lcnJvcjsNCi0JdmFyIGVsZW1lbnQgPSBudWxsOw0KLQkNCi0Jd2luZG93Lm9uZXJyb3IgPSBkZWZhdWx0T25FcnJvcjsNCi0NCi0JbmF2aWdhdG9yLk9TCQk9ICcnOw0KLQluYXZpZ2F0b3IudmVyc2lvbgk9IDA7DQotCW5hdmlnYXRvci5vcmcJCT0gJyc7DQotCW5hdmlnYXRvci5mYW1pbHkJPSAnJzsNCi0NCi0JdmFyIHBsYXRmb3JtOw0KLQlpZiAodHlwZW9mKHdpbmRvdy5uYXZpZ2F0b3IucGxhdGZvcm0pICE9ICd1bmRlZmluZWQnKQ0KLQl7DQotCQlwbGF0Zm9ybSA9IHdpbmRvdy5uYXZpZ2F0b3IucGxhdGZvcm0udG9Mb3dlckNhc2UoKTsNCi0JCWlmIChwbGF0Zm9ybS5pbmRleE9mKCd3aW4nKSAhPSAtMSkNCi0JCQluYXZpZ2F0b3IuT1MgPSAnd2luJzsNCi0JCWVsc2UgaWYgKHBsYXRmb3JtLmluZGV4T2YoJ21hYycpICE9IC0xKQ0KLQkJCW5hdmlnYXRvci5PUyA9ICdtYWMnOw0KLQkJZWxzZSBpZiAocGxhdGZvcm0uaW5kZXhPZigndW5peCcpICE9IC0xIHx8IHBsYXRmb3JtLmluZGV4T2YoJ2xpbnV4JykgIT0gLTEgfHwgcGxhdGZvcm0uaW5kZXhPZignc3VuJykgIT0gLTEpDQotCQkJbmF2aWdhdG9yLk9TID0gJ25peCc7DQotCX0NCi0NCi0JdmFyIGkgPSAwOw0KLQl2YXIgdWEgPSB3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpOw0KLQkNCi0JaWYgKHVhLmluZGV4T2YoJ3NhZmFyaScpICE9IC0xKSB7DQotCSAgbmF2aWdhdG9yLmZhbWlseSA9ICdubjQnOw0KLQkgIG5hdmlnYXRvci52ZXJzaW9uID0gNDsNCi0JICBuYXZpZ2F0b3Iub3JnID0gJ25ldHNjYXBlJzsNCi0JfQ0KLQllbHNlIGlmICh1YS5pbmRleE9mKCdvcGVyYScpICE9IC0xKQ0KLQl7DQotCQlpID0gdWEuaW5kZXhPZignb3BlcmEnKTsNCi0JCW5hdmlnYXRvci5mYW1pbHkJPSAnb3BlcmEnOw0KLQkJbmF2aWdhdG9yLm9yZwkJPSAnb3BlcmEnOw0KLQkJbmF2aWdhdG9yLnZlcnNpb24JPSBwYXJzZUZsb2F0KCcwJyArIHVhLnN1YnN0cihpKzYpLCAxMCk7DQotCX0NCi0JZWxzZSBpZiAoKGkgPSB1YS5pbmRleE9mKCdtc2llJykpICE9IC0xKQ0KLQl7DQotCQluYXZpZ2F0b3Iub3JnCQk9ICdtaWNyb3NvZnQnOw0KLQkJbmF2aWdhdG9yLnZlcnNpb24JPSBwYXJzZUZsb2F0KCcwJyArIHVhLnN1YnN0cihpKzUpLCAxMCk7DQotCQkNCi0JCWlmIChuYXZpZ2F0b3IudmVyc2lvbiA8IDQpDQotCQkJbmF2aWdhdG9yLmZhbWlseSA9ICdpZTMnOw0KLQkJZWxzZQ0KLQkJCW5hdmlnYXRvci5mYW1pbHkgPSAnaWU0Jw0KLQl9DQotCWVsc2UgaWYgKHR5cGVvZih3aW5kb3cuY29udHJvbGxlcnMpICE9ICd1bmRlZmluZWQnICYmIHR5cGVvZih3aW5kb3cubG9jYXRpb25iYXIpICE9ICd1bmRlZmluZWQnKQ0KLQl7DQotCQlpID0gdWEubGFzdEluZGV4T2YoJy8nKQ0KLQkJbmF2aWdhdG9yLnZlcnNpb24gPSBwYXJzZUZsb2F0KCcwJyArIHVhLnN1YnN0cihpKzEpLCAxMCk7DQotCQluYXZpZ2F0b3IuZmFtaWx5ID0gJ2dlY2tvJzsNCi0NCi0JCWlmICh1YS5pbmRleE9mKCduZXRzY2FwZScpICE9IC0xKQ0KLQkJCW5hdmlnYXRvci5vcmcgPSAnbmV0c2NhcGUnOw0KLQkJZWxzZSBpZiAodWEuaW5kZXhPZignY29tcHVzZXJ2ZScpICE9IC0xKQ0KLQkJCW5hdmlnYXRvci5vcmcgPSAnY29tcHVzZXJ2ZSc7DQotCQllbHNlDQotCQkJbmF2aWdhdG9yLm9yZyA9ICdtb3ppbGxhJzsNCi0JfQ0KLQllbHNlIGlmICgodWEuaW5kZXhPZignbW96aWxsYScpICE9LTEpICYmICh1YS5pbmRleE9mKCdzcG9vZmVyJyk9PS0xKSAmJiAodWEuaW5kZXhPZignY29tcGF0aWJsZScpID09IC0xKSAmJiAodWEuaW5kZXhPZignb3BlcmEnKT09LTEpJiYgKHVhLmluZGV4T2YoJ3dlYnR2Jyk9PS0xKSAmJiAodWEuaW5kZXhPZignaG90amF2YScpPT0tMSkpDQotCXsNCi0JICAgIHZhciBpc19tYWpvciA9IHBhcnNlRmxvYXQobmF2aWdhdG9yLmFwcFZlcnNpb24pOw0KLSAgICANCi0JCWlmIChpc19tYWpvciA8IDQpDQotCQkJbmF2aWdhdG9yLnZlcnNpb24gPSBpc19tYWpvcjsNCi0JCWVsc2UNCi0JCXsNCi0JCQlpID0gdWEubGFzdEluZGV4T2YoJy8nKQ0KLQkJCW5hdmlnYXRvci52ZXJzaW9uID0gcGFyc2VGbG9hdCgnMCcgKyB1YS5zdWJzdHIoaSsxKSwgMTApOw0KLQkJfQ0KLQkJbmF2aWdhdG9yLm9yZyA9ICduZXRzY2FwZSc7DQotCQluYXZpZ2F0b3IuZmFtaWx5ID0gJ25uJyArIHBhcnNlSW50KG5hdmlnYXRvci5hcHBWZXJzaW9uKTsNCi0JfQ0KLQllbHNlIGlmICgoaSA9IHVhLmluZGV4T2YoJ2FvbCcpKSAhPSAtMSApDQotCXsNCi0JCS8vIGFvbA0KLQkJbmF2aWdhdG9yLmZhbWlseQk9ICdhb2wnOw0KLQkJbmF2aWdhdG9yLm9yZwkJPSAnYW9sJzsNCi0JCW5hdmlnYXRvci52ZXJzaW9uCT0gcGFyc2VGbG9hdCgnMCcgKyB1YS5zdWJzdHIoaSs0KSwgMTApOw0KLQl9DQotDQotCW5hdmlnYXRvci5ET01DT1JFMQk9ICh0eXBlb2YoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUpICE9ICd1bmRlZmluZWQnICYmIHR5cGVvZihkb2N1bWVudC5jcmVhdGVFbGVtZW50KSAhPSAndW5kZWZpbmVkJyk7DQotCW5hdmlnYXRvci5ET01DT1JFMgk9IChuYXZpZ2F0b3IuRE9NQ09SRTEgJiYgdHlwZW9mKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKSAhPSAndW5kZWZpbmVkJyAmJiB0eXBlb2YoZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKSAhPSAndW5kZWZpbmVkJyk7DQotCW5hdmlnYXRvci5ET01IVE1MCT0gKG5hdmlnYXRvci5ET01DT1JFMSAmJiB0eXBlb2YoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQpICE9ICd1bmRlZmluZWQnKTsNCi0JbmF2aWdhdG9yLkRPTUNTUzEJPSAoIChuYXZpZ2F0b3IuZmFtaWx5ID09ICdnZWNrbycpIHx8IChuYXZpZ2F0b3IuZmFtaWx5ID09ICdpZTQnKSApOw0KLQ0KLQluYXZpZ2F0b3IuRE9NQ1NTMiAgID0gZmFsc2U7DQotCWlmIChuYXZpZ2F0b3IuRE9NQ09SRTEpDQotCXsNCi0JCWVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdwJyk7DQotCQluYXZpZ2F0b3IuRE9NQ1NTMiA9ICh0eXBlb2YoZWxlbWVudC5zdHlsZSkgPT0gJ29iamVjdCcpOw0KLQl9DQotDQotCW5hdmlnYXRvci5ET01FVkVOVFMJPSAodHlwZW9mKGRvY3VtZW50LmNyZWF0ZUV2ZW50KSAhPSAndW5kZWZpbmVkJyk7DQotDQotCXdpbmRvdy5vbmVycm9yID0gb2xkT25FcnJvcjsNCi19DQotDQotZGV0ZWN0QnJvd3NlcigpOw0KLQ0KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9odG1sL1JvbGxvdmVyLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvaHRtbC9Sb2xsb3Zlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDkzODhiLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9odG1sL1JvbGxvdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTcgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuaHRtbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LkFic3RyYWN0Q29tcG9uZW50OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUFzc2V0OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUVuZ2luZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklNYXJrdXBXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVxdWVzdEN5Y2xlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlc291cmNlTG9jYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JU2NyaXB0OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuVGFwZXN0cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5jb21wb25lbnRzLklMaW5rQ29tcG9uZW50OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuY29tcG9uZW50cy5MaW5rRXZlbnRUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuZW5naW5lLklTY3JpcHRTb3VyY2U7Ci0KLS8qKgotICogIENvbWJpbmVzIGEgbGluayBjb21wb25lbnQgKHN1Y2ggYXMge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkubGluay5EaXJlY3RMaW5rfSkgCi0gKiAgd2l0aCBhbiAmbHQ7aW1nJmd0OyBhbmQgSmF2YVNjcmlwdCBjb2RlCi0gKiAgdG8gY3JlYXRlIGEgcm9sbG92ZXIgZWZmZWN0IHRoYXQgd29ya3Mgd2l0aCBib3RoIE5ldHNjYXBlIE5hdmlnYXRvciBhbmQgCi0gKiAgSW50ZXJuZXQgRXhwbG9yZXIuCi0gKgotICogIFs8YSBocmVmPSIuLi8uLi8uLi8uLi8uLi9Db21wb25lbnRSZWZlcmVuY2UvUm9sbG92ZXIuaHRtbCI+Q29tcG9uZW50IFJlZmVyZW5jZTwvYT5dCi0gKgotICoKLSAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiAgQHZlcnNpb24gJElkJAotICogCi0gKiovCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBSb2xsb3ZlciBleHRlbmRzIEFic3RyYWN0Q29tcG9uZW50Ci17Ci0gICAgcHJpdmF0ZSBJU2NyaXB0IF9wYXJzZWRTY3JpcHQ7Ci0KLSAgICAvKioKLSAgICAgKiAgQ29udmVydHMgYW4ge0BsaW5rIElBc3NldH0gYmluZGluZyBpbnRvIGEgdXNhYmxlIFVSTC4gIFJldHVybnMgbnVsbAotICAgICAqICBpZiB0aGUgYmluZGluZyBkb2VzIG5vdCBleGlzdCBvciB0aGUgYmluZGluZydzIHZhbHVlIGlzIG51bGwuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEFzc2V0VVJMKElBc3NldCBhc3NldCwgSVJlcXVlc3RDeWNsZSBjeWNsZSkKLSAgICB7Ci0gICAgICAgIGlmIChhc3NldCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgcmV0dXJuIGFzc2V0LmJ1aWxkVVJMKGN5Y2xlKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCByZW5kZXJDb21wb25lbnQoSU1hcmt1cFdyaXRlciB3cml0ZXIsIElSZXF1ZXN0Q3ljbGUgY3ljbGUpCi0gICAgewotICAgICAgICAvLyBObyBib2R5LCBzbyB3ZSBza2lwIGl0IGFsbCBpZiBub3QgcmV3aW5kaW5nIChhc3N1bWVzIG5vIHNpZGUgZWZmZWN0cyBvbgotICAgICAgICAvLyBhY2Nlc3NvcnMpLgotCi0gICAgICAgIGlmIChjeWNsZS5pc1Jld2luZGluZygpKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIFN0cmluZyBpbWFnZVVSTCA9IG51bGw7Ci0gICAgICAgIFN0cmluZyBmb2N1c1VSTCA9IG51bGw7Ci0gICAgICAgIFN0cmluZyBibHVyVVJMID0gbnVsbDsKLSAgICAgICAgYm9vbGVhbiBkeW5hbWljID0gZmFsc2U7Ci0gICAgICAgIFN0cmluZyBpbWFnZU5hbWUgPSBudWxsOwotCi0gICAgICAgIEJvZHkgYm9keSA9IEJvZHkuZ2V0KGN5Y2xlKTsKLSAgICAgICAgaWYgKGJvZHkgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgVGFwZXN0cnkuZ2V0TWVzc2FnZSgiUm9sbG92ZXIubXVzdC1iZS1jb250YWluZWQtYnktYm9keSIpLAotICAgICAgICAgICAgICAgIHRoaXMsCi0gICAgICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgICAgICBudWxsKTsKLQotICAgICAgICBJTGlua0NvbXBvbmVudCBzZXJ2aWNlTGluayA9Ci0gICAgICAgICAgICAoSUxpbmtDb21wb25lbnQpIGN5Y2xlLmdldEF0dHJpYnV0ZShUYXBlc3RyeS5MSU5LX0NPTVBPTkVOVF9BVFRSSUJVVEVfTkFNRSk7Ci0KLSAgICAgICAgaWYgKHNlcnZpY2VMaW5rID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIFRhcGVzdHJ5LmdldE1lc3NhZ2UoIlJvbGxvdmVyLm11c3QtYmUtY29udGFpbmVkLWJ5LWxpbmsiKSwKLSAgICAgICAgICAgICAgICB0aGlzLAotICAgICAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAgICAgbnVsbCk7Ci0KLSAgICAgICAgYm9vbGVhbiBsaW5rRGlzYWJsZWQgPSBzZXJ2aWNlTGluay5pc0Rpc2FibGVkKCk7Ci0KLSAgICAgICAgaWYgKGxpbmtEaXNhYmxlZCkKLSAgICAgICAgewotICAgICAgICAgICAgaW1hZ2VVUkwgPSBnZXRBc3NldFVSTChnZXREaXNhYmxlZCgpLCBjeWNsZSk7Ci0KLSAgICAgICAgICAgIGlmIChpbWFnZVVSTCA9PSBudWxsKQotICAgICAgICAgICAgICAgIGltYWdlVVJMID0gZ2V0QXNzZXRVUkwoZ2V0SW1hZ2UoKSwgY3ljbGUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaW1hZ2VVUkwgPSBnZXRBc3NldFVSTChnZXRJbWFnZSgpLCBjeWNsZSk7Ci0gICAgICAgICAgICBmb2N1c1VSTCA9IGdldEFzc2V0VVJMKGdldEZvY3VzKCksIGN5Y2xlKTsKLSAgICAgICAgICAgIGJsdXJVUkwgPSBnZXRBc3NldFVSTChnZXRCbHVyKCksIGN5Y2xlKTsKLQotICAgICAgICAgICAgZHluYW1pYyA9IChmb2N1c1VSTCAhPSBudWxsKSB8fCAoYmx1clVSTCAhPSBudWxsKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpbWFnZVVSTCA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgVGFwZXN0cnkuY3JlYXRlUmVxdWlyZWRQYXJhbWV0ZXJFeGNlcHRpb24odGhpcywgImltYWdlIik7Ci0KLSAgICAgICAgd3JpdGVyLmJlZ2luRW1wdHkoImltZyIpOwotCi0gICAgICAgIHdyaXRlci5hdHRyaWJ1dGUoInNyYyIsIGltYWdlVVJMKTsKLQotICAgICAgICB3cml0ZXIuYXR0cmlidXRlKCJib3JkZXIiLCAwKTsKLQotICAgICAgICBpZiAoZHluYW1pYykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGZvY3VzVVJMID09IG51bGwpCi0gICAgICAgICAgICAgICAgZm9jdXNVUkwgPSBpbWFnZVVSTDsKLQotICAgICAgICAgICAgaWYgKGJsdXJVUkwgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICBibHVyVVJMID0gaW1hZ2VVUkw7Ci0KLSAgICAgICAgICAgIGltYWdlTmFtZSA9IHdyaXRlU2NyaXB0KGN5Y2xlLCBib2R5LCBzZXJ2aWNlTGluaywgZm9jdXNVUkwsIGJsdXJVUkwpOwotCi0gICAgICAgICAgICB3cml0ZXIuYXR0cmlidXRlKCJuYW1lIiwgaW1hZ2VOYW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJlbmRlckluZm9ybWFsUGFyYW1ldGVycyh3cml0ZXIsIGN5Y2xlKTsKLQotICAgICAgICB3cml0ZXIuY2xvc2VUYWcoKTsKLQotICAgIH0KLQotICAgIHByaXZhdGUgSVNjcmlwdCBnZXRQYXJzZWRTY3JpcHQoKQotICAgIHsKLSAgICAgICAgaWYgKF9wYXJzZWRTY3JpcHQgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgSUVuZ2luZSBlbmdpbmUgPSBnZXRQYWdlKCkuZ2V0RW5naW5lKCk7Ci0gICAgICAgICAgICBJU2NyaXB0U291cmNlIHNvdXJjZSA9IGVuZ2luZS5nZXRTY3JpcHRTb3VyY2UoKTsKLQotICAgICAgICAgICAgSVJlc291cmNlTG9jYXRpb24gc2NyaXB0TG9jYXRpb24gPQotICAgICAgICAgICAgICAgIGdldFNwZWNpZmljYXRpb24oKS5nZXRTcGVjaWZpY2F0aW9uTG9jYXRpb24oKS5nZXRSZWxhdGl2ZUxvY2F0aW9uKAotICAgICAgICAgICAgICAgICAgICAiUm9sbG92ZXIuc2NyaXB0Iik7Ci0KLSAgICAgICAgICAgIF9wYXJzZWRTY3JpcHQgPSBzb3VyY2UuZ2V0U2NyaXB0KHNjcmlwdExvY2F0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBfcGFyc2VkU2NyaXB0OwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIHdyaXRlU2NyaXB0KAotICAgICAgICBJUmVxdWVzdEN5Y2xlIGN5Y2xlLAotICAgICAgICBCb2R5IGJvZHksCi0gICAgICAgIElMaW5rQ29tcG9uZW50IGxpbmssCi0gICAgICAgIFN0cmluZyBmb2N1c1VSTCwKLSAgICAgICAgU3RyaW5nIGJsdXJVUkwpCi0gICAgewotICAgICAgICBTdHJpbmcgaW1hZ2VOYW1lID0gYm9keS5nZXRVbmlxdWVTdHJpbmcoZ2V0SWQoKSk7Ci0gICAgICAgIFN0cmluZyBmb2N1c0ltYWdlVVJMID0gYm9keS5nZXRQcmVsb2FkZWRJbWFnZVJlZmVyZW5jZShmb2N1c1VSTCk7Ci0gICAgICAgIFN0cmluZyBibHVySW1hZ2VVUkwgPSBib2R5LmdldFByZWxvYWRlZEltYWdlUmVmZXJlbmNlKGJsdXJVUkwpOwotCi0gICAgICAgIE1hcCBzeW1ib2xzID0gbmV3IEhhc2hNYXAoKTsKLQotICAgICAgICBzeW1ib2xzLnB1dCgiaW1hZ2VOYW1lIiwgaW1hZ2VOYW1lKTsKLSAgICAgICAgc3ltYm9scy5wdXQoImZvY3VzSW1hZ2VVUkwiLCBmb2N1c0ltYWdlVVJMKTsKLSAgICAgICAgc3ltYm9scy5wdXQoImJsdXJJbWFnZVVSTCIsIGJsdXJJbWFnZVVSTCk7Ci0KLSAgICAgICAgZ2V0UGFyc2VkU2NyaXB0KCkuZXhlY3V0ZShjeWNsZSwgYm9keSwgc3ltYm9scyk7Ci0KLSAgICAgICAgLy8gQWRkIGF0dHJpYnV0ZXMgdG8gdGhlIGxpbmsgdG8gY29udHJvbCBtb3VzZSBvdmVyL291dC4KLSAgICAgICAgLy8gQmVjYXVzZSB0aGUgc2NyaXB0IGlzIHdyaXR0ZW4gYmVmb3JlIHRoZSA8Ym9keT4gdGFnLAotICAgICAgICAvLyB0aGVyZSB3b24ndCBiZSBhbnkgdGltaW5nIGlzc3VlcyAoc3VjaCBhcyBjYXVzZQotICAgICAgICAvLyBidWcgIzExMzg5MykuCi0KLSAgICAgICAgbGluay5hZGRFdmVudEhhbmRsZXIoTGlua0V2ZW50VHlwZS5NT1VTRV9PVkVSLCAoU3RyaW5nKSBzeW1ib2xzLmdldCgib25Nb3VzZU92ZXJOYW1lIikpOwotICAgICAgICBsaW5rLmFkZEV2ZW50SGFuZGxlcihMaW5rRXZlbnRUeXBlLk1PVVNFX09VVCwgKFN0cmluZykgc3ltYm9scy5nZXQoIm9uTW91c2VPdXROYW1lIikpOwotCi0gICAgICAgIHJldHVybiBpbWFnZU5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIGFic3RyYWN0IElBc3NldCBnZXRCbHVyKCk7Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgSUFzc2V0IGdldERpc2FibGVkKCk7Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgSUFzc2V0IGdldEZvY3VzKCk7Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgSUFzc2V0IGdldEltYWdlKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2h0bWwvUm9sbG92ZXIuandjIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2h0bWwvUm9sbG92ZXIuandjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzUyZDdjLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9odG1sL1JvbGxvdmVyLmp3YworKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAgCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPCEtLSAkSWQkIC0tPgotPCFET0NUWVBFIGNvbXBvbmVudC1zcGVjaWZpY2F0aW9uIFBVQkxJQwotICAiLS8vQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24vL1RhcGVzdHJ5IFNwZWNpZmljYXRpb24gMy4wLy9FTiIgCi0gICJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL3RhcGVzdHJ5L2R0ZC9UYXBlc3RyeV8zXzAuZHRkIj4KLQkKLTxjb21wb25lbnQtc3BlY2lmaWNhdGlvbiBjbGFzcz0ib3JnLmFwYWNoZS50YXBlc3RyeS5odG1sLlJvbGxvdmVyIiBhbGxvdy1ib2R5PSJubyI+Ci0KLSAgPGRlc2NyaXB0aW9uPgotICBBIGNvbXBsZXggaW1hZ2UgY29tcG9uZW50IHdoaWNoIG11c3QgYmUgd3JhcHBlZCBieSBhIGxpbmsgY29tcG9uZW50LiAgUm9sbG92ZXJzCi0gIGNhbiByZWZsZWN0IHRoZSBlbmFibGVkIHN0YXR1cyBvZiB0aGUgbGluaywgYW5kIGRpc3BsYXkgcm9sbG92ZXIgZWZmZWN0cy4KLSAgPC9kZXNjcmlwdGlvbj4KLQotICA8cGFyYW1ldGVyIG5hbWU9ImltYWdlIiAKLSAgCXR5cGU9Im9yZy5hcGFjaGUudGFwZXN0cnkuSUFzc2V0IiAKLSAgCXJlcXVpcmVkPSJ5ZXMiCi0gIAlkaXJlY3Rpb249ImluIj4KLSAgICA8ZGVzY3JpcHRpb24+Ci0gICAgVGhlIG5vcm1hbCBvciBkZWZhdWx0IGltYWdlIHRvIGRpc3BsYXksIHVzZWQgYXMgYSBkZWZhdWx0IGltYWdlIGZvcgotICAgIHRoZSBvdGhlciBwYXJhbWV0ZXJzLgotICAgIDwvZGVzY3JpcHRpb24+Ci0gIDwvcGFyYW1ldGVyPgotICAKLSAgPHBhcmFtZXRlciBuYW1lPSJmb2N1cyIKLSAgCXR5cGU9Im9yZy5hcGFjaGUudGFwZXN0cnkuSUFzc2V0IgotICAJZGlyZWN0aW9uPSJpbiI+Ci0gICAgPGRlc2NyaXB0aW9uPgotICAgIElmIHNwZWNpZmllZCwgcHJvdmlkZXMgYW4gaW1hZ2UgZGlzcGxheWVkIHdoZW4gdGhlIGN1cnNvciBpcyBtb3ZlZAotICAgIG92ZXIgdGhlIGxpbmsuCi0gICAgPC9kZXNjcmlwdGlvbj4KLSAgPC9wYXJhbWV0ZXI+Ci0gIAotICA8cGFyYW1ldGVyIG5hbWU9ImJsdXIiIAotICAJdHlwZT0ib3JnLmFwYWNoZS50YXBlc3RyeS5JQXNzZXQiCi0gIAlkaXJlY3Rpb249ImluIj4KLSAgICA8ZGVzY3JpcHRpb24+Ci0gICAgSWYgc3BlY2lmaWVkLCBwcm92aWRlcyBhbiBpbWFnZSBkaXNwbGF5ZWQgd2hlbiB0aGUgY3Vyc29yIGlzIG1vdmVkCi0gICAgb2ZmIG9mIHRoZSBsaW5rLgotICAgIDwvZGVzY3JpcHRpb24+Ci0gIDwvcGFyYW1ldGVyPgotICAKLSAgPHBhcmFtZXRlciBuYW1lPSJkaXNhYmxlZCIKLSAgCXR5cGU9Im9yZy5hcGFjaGUudGFwZXN0cnkuSUFzc2V0IgotICAJZGlyZWN0aW9uPSJpbiI+Ci0gICAgPGRlc2NyaXB0aW9uPgotICAgIElmIHNwZWNpZmllZCwgcHJvdmlkZXMgYW4gaW1hZ2UgZGlzcGxheWVkIHdoZW4gdGhlIHN1cnJvdW5kaW5nCi0gICAgbGluayBpcyBkaXNhYmxlZC4KLSAgICA8L2Rlc2NyaXB0aW9uPgotICA8L3BhcmFtZXRlcj4KLSAgCi0gIDxyZXNlcnZlZC1wYXJhbWV0ZXIgbmFtZT0ibmFtZSIvPgotICA8cmVzZXJ2ZWQtcGFyYW1ldGVyIG5hbWU9InNyYyIvPgotICA8cmVzZXJ2ZWQtcGFyYW1ldGVyIG5hbWU9ImJvcmRlciIvPgotICAKLTwvY29tcG9uZW50LXNwZWNpZmljYXRpb24+CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvaHRtbC9Sb2xsb3Zlci5zY3JpcHQgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvaHRtbC9Sb2xsb3Zlci5zY3JpcHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkMmY2NDEuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2h0bWwvUm9sbG92ZXIuc2NyaXB0CisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tICRJZCQgLS0+Ci08IURPQ1RZUEUgc2NyaXB0IFBVQkxJQwotCSItLy9BcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi8vVGFwZXN0cnkgU2NyaXB0IFNwZWNpZmljYXRpb24gMy4wLy9FTiIKLQkiaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy90YXBlc3RyeS9kdGQvU2NyaXB0XzNfMC5kdGQiPgotPHNjcmlwdD4KLTwhLS0gCi0KLWlucHV0IHN5bWJvbHM6Ci0KLXVuaXF1ZUlkIC0gdW5pcXVlSWQgdXNlZCB0byBidWlsZCBuYW1lcwotZm9jdXNJbWFnZVVSTCAtIFVSTCBmb3IgZm9jdXMgKG1vdXNlIG92ZXIpCi1ibHVySW1hZ2VVUkwgLSBVUkwgZm9yIGJsdXIgaW1hZ2UgKG1vdXNlIG91dCkKLQotb3V0cHV0IHN5bWJvbHM6Ci0KLWltYWdlTmFtZSAtIG5hbWUgZm9yIHRoZSBpbWFnZSAoaS5lLiBuYW1lIGF0dHJpYnV0ZSBvZiA8aW1nPiBlbGVtZW50KQotb25Nb3VzZU92ZXJOYW1lIC0gbmFtZSBvZiBtb3VzZSBvdmVyIGZ1bmN0aW9uCi1vbk1vdXNlT3V0TmFtZSAtIG5hbWUgb2YgbW91c2Ugb3V0IGZ1bmN0aW9uCi0KLS0tPgotCi08aW5wdXQtc3ltYm9sIGtleT0iaW1hZ2VOYW1lIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZyIgcmVxdWlyZWQ9InllcyIvPgotPGlucHV0LXN5bWJvbCBrZXk9ImZvY3VzSW1hZ2VVUkwiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIiByZXF1aXJlZD0ieWVzIi8+Ci08aW5wdXQtc3ltYm9sIGtleT0iYmx1ckltYWdlVVJMIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZyIgcmVxdWlyZWQ9InllcyIvPgotCi0KLTxsZXQga2V5PSJvbk1vdXNlT3Zlck5hbWUiPgotCWZvY3VzXyR7aW1hZ2VOYW1lfQotPC9sZXQ+Ci08bGV0IGtleT0ib25Nb3VzZU91dE5hbWUiPgotCWJsdXJfJHtpbWFnZU5hbWV9Ci08L2xldD4KLQotPGxldCBrZXk9ImF0dHJpYnV0ZSI+Ci0JZG9jdW1lbnQuJHtpbWFnZU5hbWV9LnNyYwotPC9sZXQ+Ci0KLTxib2R5PgotCi1mdW5jdGlvbiAke29uTW91c2VPdmVyTmFtZX0oKQotewotICBpZiAoZG9jdW1lbnQuaW1hZ2VzKQotICAgICR7YXR0cmlidXRlfSA9ICR7Zm9jdXNJbWFnZVVSTH07Ci19Ci0KLWZ1bmN0aW9uICR7b25Nb3VzZU91dE5hbWV9KCkKLXsKLSAgaWYgKGRvY3VtZW50LmltYWdlcykKLSAgICAke2F0dHJpYnV0ZX0gPSAke2JsdXJJbWFnZVVSTH07Ci19Ci0KLTwvYm9keT4KLTwvc2NyaXB0PgpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2h0bWwvU2NyaXB0LmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvaHRtbC9TY3JpcHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU1NmY1Zi4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvaHRtbC9TY3JpcHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NSArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5odG1sOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LkFic3RyYWN0Q29tcG9uZW50OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUJpbmRpbmc7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JRW5naW5lOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSU1hcmt1cFdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZXF1ZXN0Q3ljbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVzb3VyY2VMb2NhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklTY3JpcHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5UYXBlc3RyeTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmVuZ2luZS5JU2NyaXB0U291cmNlOwotCi0vKioKLSAqICBXb3JrcyB3aXRoIHRoZSB7QGxpbmsgQm9keX0gY29tcG9uZW50IHRvIGFkZCBhIHNjcmlwdCAoYW5kIHBlcmhhcHMgc29tZSBpbml0aWFsaXphdGlvbikgCi0gKiAgdG8gdGhlIEhUTUwgcmVzcG9uc2UuCi0gKgotICogIFs8YSBocmVmPSIuLi8uLi8uLi8uLi8uLi9Db21wb25lbnRSZWZlcmVuY2UvU2NyaXB0Lmh0bWwiPkNvbXBvbmVudCBSZWZlcmVuY2U8L2E+XQotICoKLSAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiAgQHZlcnNpb24gJElkJAotICoKLSAqKi8KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFNjcmlwdCBleHRlbmRzIEFic3RyYWN0Q29tcG9uZW50Ci17Ci0gICAgcHJpdmF0ZSBNYXAgX2Jhc2VTeW1ib2xzOwotCi0gICAgLyoqCi0gICAgICogIEEgTWFwIG9mIGlucHV0IGFuZCBvdXRwdXQgc3ltYm9scyB2aXNpYmxlIHRvIHRoZSBib2R5IG9mIHRoZSBTY3JpcHQuCi0gICAgICogCi0gICAgICogIEBzaW5jZSAyLjIKLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwcml2YXRlIE1hcCBfc3ltYm9sczsKLQotICAgIC8qKgotICAgICAqICBDb25zdHJ1Y3RzIHRoZSBzeW1ib2xzIHtAbGluayBNYXB9LiAgVGhpcyBzdGFydHMgd2l0aCB0aGUKLSAgICAgKiAgY29udGVudHMgb2YgdGhlIHN5bWJvbHMgcGFyYW1ldGVyIChpZiBzcGVjaWZpZWQpIHRvIHdoaWNoIGlzIGFkZGVkCi0gICAgICogIGFueSBpbmZvcm1hbCBwYXJhbWV0ZXJzLiAgSWYgYm90aCBhIHN5bWJvbHMgcGFyYW1ldGVyIGFuZCBpbmZvcm1hbAotICAgICAqICBwYXJhbWV0ZXJzIGFyZSBib3VuZCwgdGhlbiBhIGNvcHkgb2YgdGhlIHN5bWJvbHMgcGFyYW1ldGVyJ3MgdmFsdWUgaXMgbWFkZQotICAgICAqICAodGhhdCBpcywgdGhlIHtAbGluayBNYXB9IHByb3ZpZGVkIGJ5IHRoZSBzeW1ib2xzIHBhcmFtZXRlciBpcyByZWFkLCBidXQgbm90IG1vZGlmaWVkKS4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHByaXZhdGUgTWFwIGdldElucHV0U3ltYm9scygpCi0gICAgewotICAgICAgICBNYXAgcmVzdWx0ID0gbmV3IEhhc2hNYXAoKTsKLQotICAgICAgICBpZiAoX2Jhc2VTeW1ib2xzICE9IG51bGwpCi0gICAgICAgICAgICByZXN1bHQucHV0QWxsKF9iYXNlU3ltYm9scyk7Ci0KLSAgICAgICAgLy8gTm93LCBpdGVyYXRlIHRocm91Z2ggYWxsIHRoZSBiaW5kaW5nIG5hbWVzICh3aGljaCBpbmNsdWRlcyBib3RoCi0gICAgICAgIC8vIGZvcm1hbCBhbmQgaW5mb3JtYWwgcGFybWV0ZXJzKS4gIFNraXAgdGhlIGZvcm1hbCBvbmVzIGFuZAotICAgICAgICAvLyBhY2Nlc3MgdGhlIGluZm9ybWFsIG9uZXMuCi0KLSAgICAgICAgSXRlcmF0b3IgaSA9IGdldEJpbmRpbmdOYW1lcygpLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIGJpbmRpbmdOYW1lID0gKFN0cmluZykgaS5uZXh0KCk7Ci0KLSAgICAgICAgICAgIC8vIFNraXAgZm9ybWFsIHBhcmFtZXRlcnMKLQotICAgICAgICAgICAgaWYgKGdldFNwZWNpZmljYXRpb24oKS5nZXRQYXJhbWV0ZXIoYmluZGluZ05hbWUpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICAgIElCaW5kaW5nIGJpbmRpbmcgPSBnZXRCaW5kaW5nKGJpbmRpbmdOYW1lKTsKLQotICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gYmluZGluZy5nZXRPYmplY3QoKTsKLQotICAgICAgICAgICAgcmVzdWx0LnB1dChiaW5kaW5nTmFtZSwgdmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgR2V0cyB0aGUge0BsaW5rIElTY3JpcHR9IGZvciB0aGUgY29ycmVjdCBzY3JpcHQuCi0gICAgICoKLSAgICAgKgotICAgICAqKi8KLQotICAgIHByaXZhdGUgSVNjcmlwdCBnZXRQYXJzZWRTY3JpcHQoSVJlcXVlc3RDeWNsZSBjeWNsZSkKLSAgICB7Ci0gICAgICAgIFN0cmluZyBzY3JpcHRQYXRoID0gZ2V0U2NyaXB0UGF0aCgpOwotCi0gICAgICAgIGlmIChzY3JpcHRQYXRoID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBUYXBlc3RyeS5jcmVhdGVSZXF1aXJlZFBhcmFtZXRlckV4Y2VwdGlvbih0aGlzLCAic2NyaXB0UGF0aCIpOwotCi0gICAgICAgIElFbmdpbmUgZW5naW5lID0gY3ljbGUuZ2V0RW5naW5lKCk7Ci0gICAgICAgIElTY3JpcHRTb3VyY2Ugc291cmNlID0gZW5naW5lLmdldFNjcmlwdFNvdXJjZSgpOwotCi0gICAgICAgIC8vIElmIHRoZSBzY3JpcHQgcGF0aCBpcyByZWxhdGl2ZSwgaXQgc2hvdWxkIGJlIHJlbGF0aXZlIHRvIHRoZSBTY3JpcHQgY29tcG9uZW50J3MKLSAgICAgICAgLy8gY29udGFpbmVyIChpLmUuLCByZWxhdGl2ZSB0byBhIHBhZ2UgaW4gdGhlIGFwcGxpY2F0aW9uKS4KLQotICAgICAgICBJUmVzb3VyY2VMb2NhdGlvbiByb290TG9jYXRpb24gPQotICAgICAgICAgICAgZ2V0Q29udGFpbmVyKCkuZ2V0U3BlY2lmaWNhdGlvbigpLmdldFNwZWNpZmljYXRpb25Mb2NhdGlvbigpOwotICAgICAgICBJUmVzb3VyY2VMb2NhdGlvbiBzY3JpcHRMb2NhdGlvbiA9IHJvb3RMb2NhdGlvbi5nZXRSZWxhdGl2ZUxvY2F0aW9uKHNjcmlwdFBhdGgpOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gc291cmNlLmdldFNjcmlwdChzY3JpcHRMb2NhdGlvbik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24oZXguZ2V0TWVzc2FnZSgpLCB0aGlzLCBudWxsLCBleCk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHJlbmRlckNvbXBvbmVudChJTWFya3VwV3JpdGVyIHdyaXRlciwgSVJlcXVlc3RDeWNsZSBjeWNsZSkKLSAgICB7Ci0gICAgICAgIGlmICghY3ljbGUuaXNSZXdpbmRpbmcoKSkKLSAgICAgICAgewotICAgICAgICAgICAgQm9keSBib2R5ID0gQm9keS5nZXQoY3ljbGUpOwotCi0gICAgICAgICAgICBpZiAoYm9keSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIFRhcGVzdHJ5LmdldE1lc3NhZ2UoIlNjcmlwdC5tdXN0LWJlLWNvbnRhaW5lZC1ieS1ib2R5IiksCi0gICAgICAgICAgICAgICAgICAgIHRoaXMsCi0gICAgICAgICAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAgICAgICAgIG51bGwpOwotCi0gICAgICAgICAgICBfc3ltYm9scyA9IGdldElucHV0U3ltYm9scygpOwotCi0gICAgICAgICAgICBnZXRQYXJzZWRTY3JpcHQoY3ljbGUpLmV4ZWN1dGUoY3ljbGUsIGJvZHksIF9zeW1ib2xzKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFJlbmRlciB0aGUgYm9keSBvZiB0aGUgU2NyaXB0OwotICAgICAgICByZW5kZXJCb2R5KHdyaXRlciwgY3ljbGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0U2NyaXB0UGF0aCgpOwotCi0gICAgcHVibGljIE1hcCBnZXRCYXNlU3ltYm9scygpCi0gICAgewotICAgICAgICByZXR1cm4gX2Jhc2VTeW1ib2xzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEJhc2VTeW1ib2xzKE1hcCBiYXNlU3ltYm9scykKLSAgICB7Ci0gICAgICAgIF9iYXNlU3ltYm9scyA9IGJhc2VTeW1ib2xzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIHRoZSBjb21wbGV0ZSBzZXQgb2Ygc3ltYm9scyAoaW5wdXQgYW5kIG91dHB1dCkKLSAgICAgKiAgZnJvbSB0aGUgc2NyaXB0IGV4ZWN1dGlvbi4gIFRoaXMgaXMgdmlzaWJsZSB0byB0aGUgYm9keQotICAgICAqICBvZiB0aGUgU2NyaXB0LCBidXQgaXMgY2xlYXJlZCBhZnRlciB0aGUgU2NyaXB0Ci0gICAgICogIGZpbmlzaGVzIHJlbmRlcmluZy4KLSAgICAgKiAKLSAgICAgKiAgQHNpbmNlIDIuMgotICAgICAqKi8KLQotICAgIHB1YmxpYyBNYXAgZ2V0U3ltYm9scygpCi0gICAgewotICAgICAgICByZXR1cm4gX3N5bWJvbHM7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgY2xlYW51cEFmdGVyUmVuZGVyKElSZXF1ZXN0Q3ljbGUgY3ljbGUpCi0gICAgewotICAgICAgICBfc3ltYm9scyA9IG51bGw7Ci0KLSAgICAgICAgc3VwZXIuY2xlYW51cEFmdGVyUmVuZGVyKGN5Y2xlKTsKLSAgICB9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvaHRtbC9TY3JpcHQuandjIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2h0bWwvU2NyaXB0Lmp3YwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM3ODUwZS4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvaHRtbC9TY3JpcHQuandjCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICAKLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08IS0tICRJZCQgLS0+Ci08IURPQ1RZUEUgY29tcG9uZW50LXNwZWNpZmljYXRpb24gUFVCTElDCi0gICItLy9BcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi8vVGFwZXN0cnkgU3BlY2lmaWNhdGlvbiAzLjAvL0VOIiAKLSAgImh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvdGFwZXN0cnkvZHRkL1RhcGVzdHJ5XzNfMC5kdGQiPgotICAKLTxjb21wb25lbnQtc3BlY2lmaWNhdGlvbiBjbGFzcz0ib3JnLmFwYWNoZS50YXBlc3RyeS5odG1sLlNjcmlwdCIgYWxsb3ctYm9keT0ieWVzIj4KLQotICA8ZGVzY3JpcHRpb24+Ci0gIENvbnN0cnVjdHMgZHluYW1pYyBKYXZhU2NyaXB0IHdoaWNoIGlzIGFkZGVkIHRvIHRoZSBwYWdlLgotICA8L2Rlc2NyaXB0aW9uPgotICAKLSAgPHBhcmFtZXRlciBuYW1lPSJzY3JpcHQiIAotICAJcHJvcGVydHktbmFtZT0ic2NyaXB0UGF0aCIKLSAgCXR5cGU9ImphdmEubGFuZy5TdHJpbmciIAotICAJcmVxdWlyZWQ9InllcyIgCi0gIAlkaXJlY3Rpb249ImluIj4KLSAgICA8ZGVzY3JpcHRpb24+Ci0gICAgVGhlIHJlc291cmNlIHBhdGggb2YgdGhlIHNjcmlwdCB0byBleGVjdXRlLgotICAgIDwvZGVzY3JpcHRpb24+Ci0gIDwvcGFyYW1ldGVyPgotCi0gIDxwYXJhbWV0ZXIgbmFtZT0ic3ltYm9scyIKLSAgCXByb3BlcnR5LW5hbWU9ImJhc2VTeW1ib2xzIgotICAJdHlwZT0iamF2YS51dGlsLk1hcCIgCi0gIAlkaXJlY3Rpb249ImluIj4KLSAgICA8ZGVzY3JpcHRpb24+Ci0gICAgUHJvdmlkZXMgYSBiYXNlIHNldCBvZiBzeW1ib2xzIHRvIHdoaWNoLCBpbiBhIGNvcHksIGFyZSBhZGRlZAotICAgIGFueSBpbmZvcm1hbCBwYXJhbWV0ZXJzLgotICAgIDwvZGVzY3JpcHRpb24+Ci0gIDwvcGFyYW1ldGVyPgotCi08L2NvbXBvbmVudC1zcGVjaWZpY2F0aW9uPgpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2h0bWwvU2hlbGwuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9odG1sL1NoZWxsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViYTNlYjkuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2h0bWwvU2hlbGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwOCArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5odG1sOwotCi1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5BYnN0cmFjdENvbXBvbmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklBc3NldDsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklNYXJrdXBXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUGFnZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZW5kZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVxdWVzdEN5Y2xlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuVGFwZXN0cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5lbmdpbmUuSUVuZ2luZVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5lbmdpbmUuSUxpbms7Ci0KLS8qKgotICogIENvbXBvbmVudCBmb3IgY3JlYXRpbmcgYSBzdGFuZGFyZCAnc2hlbGwnIGZvciBhIHBhZ2UsIHdoaWNoIGNvbXByaXNlcwotICogIHRoZSAmbHQ7aHRtbCZndDsgYW5kICZsdDtoZWFkJmd0OyBwb3J0aW9ucyBvZiB0aGUgcGFnZS4KLSAqIAotICogIFs8YSBocmVmPSIuLi8uLi8uLi8uLi8uLi9Db21wb25lbnRSZWZlcmVuY2UvU2hlbGwuaHRtbCI+Q29tcG9uZW50IFJlZmVyZW5jZTwvYT5dCi0gKgotICogIDxwPlNwZWNpZmljYWxseSBkb2VzIDxlbT5ub3Q8L2VtPiBwcm92aWRlIGEgJmx0O2JvZHkmZ3Q7IHRhZywgdGhhdCBpcwotICogIHVzdWFsbHkgYWNjb21wbGlzaGVkIHVzaW5nIGEge0BsaW5rIEJvZHl9IGNvbXBvbmVudC4KLSAqCi0gKiAgQHZlcnNpb24gJElkJAotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqIAotICoqLwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2hlbGwgZXh0ZW5kcyBBYnN0cmFjdENvbXBvbmVudAotewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGdlbmVyYXRvckNvbnRlbnQgPQotICAgICAgICAiVGFwZXN0cnkgQXBwbGljYXRpb24gRnJhbWV3b3JrLCB2ZXJzaW9uICIgKyBUYXBlc3RyeS5WRVJTSU9OOwotCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVuZGVyQ29tcG9uZW50KElNYXJrdXBXcml0ZXIgd3JpdGVyLCBJUmVxdWVzdEN5Y2xlIGN5Y2xlKQotICAgIHsKLSAgICAgICAgbG9uZyBzdGFydFRpbWUgPSAwOwotCi0gICAgICAgIGJvb2xlYW4gcmV3aW5kaW5nID0gY3ljbGUuaXNSZXdpbmRpbmcoKTsKLQotICAgICAgICBpZiAoIXJld2luZGluZykKLSAgICAgICAgewotICAgICAgICAgICAgc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0KLSAgICAgICAgICAgIHdyaXRlRG9jVHlwZSh3cml0ZXIsIGN5Y2xlKTsKLQotICAgICAgICAgICAgSVBhZ2UgcGFnZSA9IGdldFBhZ2UoKTsKLQotICAgICAgICAgICAgd3JpdGVyLmNvbW1lbnQoIkFwcGxpY2F0aW9uOiAiICsgcGFnZS5nZXRFbmdpbmUoKS5nZXRTcGVjaWZpY2F0aW9uKCkuZ2V0TmFtZSgpKTsKLQotICAgICAgICAgICAgd3JpdGVyLmNvbW1lbnQoIlBhZ2U6ICIgKyBwYWdlLmdldFBhZ2VOYW1lKCkpOwotICAgICAgICAgICAgd3JpdGVyLmNvbW1lbnQoIkdlbmVyYXRlZDogIiArIG5ldyBEYXRlKCkpOwotCi0gICAgICAgICAgICB3cml0ZXIuYmVnaW4oImh0bWwiKTsKLSAgICAgICAgICAgIHJlbmRlckluZm9ybWFsUGFyYW1ldGVycyh3cml0ZXIsIGN5Y2xlKTsKLSAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCk7Ci0gICAgICAgICAgICB3cml0ZXIuYmVnaW4oImhlYWQiKTsKLSAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCk7Ci0KLSAgICAgICAgICAgIHdyaXRlci5iZWdpbkVtcHR5KCJtZXRhIik7Ci0gICAgICAgICAgICB3cml0ZXIuYXR0cmlidXRlKCJuYW1lIiwgImdlbmVyYXRvciIpOwotICAgICAgICAgICAgd3JpdGVyLmF0dHJpYnV0ZSgiY29udGVudCIsIGdlbmVyYXRvckNvbnRlbnQpOwotICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oKTsKLQotICAgICAgICAgICAgaWYgKGdldFJlbmRlckNvbnRlbnRUeXBlKCkpIHsKLSAgICAgICAgICAgICAgICAvLyBUaGlzIHNob3VsZCBub3QgYmUgbmVjZXNzYXJ5ICh0aGUgSFRUUCBjb250ZW50IHR5cGUgc2hvdWxkIGJlIHN1ZmZpY2llbnQpLCAKLSAgICAgICAgICAgICAgICAvLyBidXQgc29tZSBicm93c2VycyByZXF1aXJlIGl0IGZvciBzb21lIHJlYXNvbgotICAgICAgICAgICAgICAgIHdyaXRlci5iZWdpbkVtcHR5KCJtZXRhIik7Ci0gICAgICAgICAgICAgICAgd3JpdGVyLmF0dHJpYnV0ZSgiaHR0cC1lcXVpdiIsICJDb250ZW50LVR5cGUiKTsKLSAgICAgICAgICAgICAgICB3cml0ZXIuYXR0cmlidXRlKCJjb250ZW50Iiwgd3JpdGVyLmdldENvbnRlbnRUeXBlKCkpOwotICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHdyaXRlci5iZWdpbigidGl0bGUiKTsKLQotICAgICAgICAgICAgd3JpdGVyLnByaW50KGdldFRpdGxlKCkpOwotICAgICAgICAgICAgd3JpdGVyLmVuZCgpOyAvLyB0aXRsZQotICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oKTsKLQotICAgICAgICAgICAgSVJlbmRlciBkZWxlZ2F0ZSA9IGdldERlbGVnYXRlKCk7Ci0KLSAgICAgICAgICAgIGlmIChkZWxlZ2F0ZSAhPSBudWxsKQotICAgICAgICAgICAgICAgIGRlbGVnYXRlLnJlbmRlcih3cml0ZXIsIGN5Y2xlKTsKLQotICAgICAgICAgICAgSUFzc2V0IHN0eWxlc2hlZXQgPSBnZXRTdHlsZXNoZWV0KCk7Ci0KLSAgICAgICAgICAgIGlmIChzdHlsZXNoZWV0ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgd3JpdGVTdHlsZXNoZWV0TGluayh3cml0ZXIsIGN5Y2xlLCBzdHlsZXNoZWV0KTsKLQotICAgICAgICAgICAgSXRlcmF0b3IgaSA9IFRhcGVzdHJ5LmNvZXJjZVRvSXRlcmF0b3IoZ2V0U3R5bGVzaGVldHMoKSk7Ci0KLSAgICAgICAgICAgIGlmIChpICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3R5bGVzaGVldCA9IChJQXNzZXQpIGkubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgICAgIHdyaXRlU3R5bGVzaGVldExpbmsod3JpdGVyLCBjeWNsZSwgc3R5bGVzaGVldCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB3cml0ZVJlZnJlc2god3JpdGVyLCBjeWNsZSk7Ci0KLSAgICAgICAgICAgIHdyaXRlci5lbmQoKTsgLy8gaGVhZAotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUmVuZGVyIHRoZSBib2R5LCB0aGUgYWN0dWFsIHBhZ2UgY29udGVudAotCi0gICAgICAgIHJlbmRlckJvZHkod3JpdGVyLCBjeWNsZSk7Ci0KLSAgICAgICAgaWYgKCFyZXdpbmRpbmcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdyaXRlci5lbmQoKTsgLy8gaHRtbAotICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oKTsKLQotICAgICAgICAgICAgbG9uZyBlbmRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0KLSAgICAgICAgICAgIHdyaXRlci5jb21tZW50KCJSZW5kZXIgdGltZTogfiAiICsgKGVuZFRpbWUgLSBzdGFydFRpbWUpICsgIiBtcyIpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgd3JpdGVEb2NUeXBlKElNYXJrdXBXcml0ZXIgd3JpdGVyLCBJUmVxdWVzdEN5Y2xlIGN5Y2xlKQotICAgIHsKLSAgICAgICAgLy8gVGhpcyBjb2RlIGlzIGRlcHJlY2F0ZWQgYW5kIGlzIGhlcmUgb25seSBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eQotICAgICAgICBTdHJpbmcgRFREID0gZ2V0RFREKCk7Ci0gICAgICAgIGlmIChUYXBlc3RyeS5pc05vbkJsYW5rKERURCkpIHsKLSAgICAgICAgICAgIHdyaXRlci5wcmludFJhdygiPCFET0NUWVBFIEhUTUwgUFVCTElDIFwiIiArIERURCArICJcIj4iKTsKLSAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBUaGlzIGlzIHRoZSByZWFsIGNvZGUKLSAgICAgICAgU3RyaW5nIGRvY3R5cGUgPSBnZXREb2N0eXBlKCk7Ci0gICAgICAgIGlmIChUYXBlc3RyeS5pc05vbkJsYW5rKGRvY3R5cGUpKSB7Ci0gICAgICAgICAgICB3cml0ZXIucHJpbnRSYXcoIjwhRE9DVFlQRSAiICsgZG9jdHlwZSArICI+Iik7Ci0gICAgICAgICAgICB3cml0ZXIucHJpbnRsbigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHdyaXRlU3R5bGVzaGVldExpbmsoSU1hcmt1cFdyaXRlciB3cml0ZXIsIElSZXF1ZXN0Q3ljbGUgY3ljbGUsIElBc3NldCBzdHlsZXNoZWV0KQotICAgIHsKLSAgICAgICAgd3JpdGVyLmJlZ2luRW1wdHkoImxpbmsiKTsKLSAgICAgICAgd3JpdGVyLmF0dHJpYnV0ZSgicmVsIiwgInN0eWxlc2hlZXQiKTsKLSAgICAgICAgd3JpdGVyLmF0dHJpYnV0ZSgidHlwZSIsICJ0ZXh0L2NzcyIpOwotICAgICAgICB3cml0ZXIuYXR0cmlidXRlKCJocmVmIiwgc3R5bGVzaGVldC5idWlsZFVSTChjeWNsZSkpOwotICAgICAgICB3cml0ZXIucHJpbnRsbigpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB3cml0ZVJlZnJlc2goSU1hcmt1cFdyaXRlciB3cml0ZXIsIElSZXF1ZXN0Q3ljbGUgY3ljbGUpCi0gICAgewotICAgICAgICBpbnQgcmVmcmVzaCA9IGdldFJlZnJlc2goKTsKLQotICAgICAgICBpZiAocmVmcmVzaCA8PSAwKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIC8vIEhlcmUgY29tZXMgdGhlIHRyaWNreSBwYXJ0IC4uLiBoYXZlIHRvIGFzc2VtYmxlIGEgY29tcGxldGUgVVJMCi0gICAgICAgIC8vIGZvciB0aGUgY3VycmVudCBwYWdlLgotCi0gICAgICAgIElFbmdpbmVTZXJ2aWNlIHBhZ2VTZXJ2aWNlID0gY3ljbGUuZ2V0RW5naW5lKCkuZ2V0U2VydmljZShUYXBlc3RyeS5QQUdFX1NFUlZJQ0UpOwotICAgICAgICBTdHJpbmcgcGFnZU5hbWUgPSBnZXRQYWdlKCkuZ2V0UGFnZU5hbWUoKTsKLQotICAgICAgICBJTGluayBsaW5rID0gcGFnZVNlcnZpY2UuZ2V0TGluayhjeWNsZSwgbnVsbCwgbmV3IFN0cmluZ1tdIHsgcGFnZU5hbWUgfSk7Ci0KLSAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgYnVmZmVyLmFwcGVuZChyZWZyZXNoKTsKLSAgICAgICAgYnVmZmVyLmFwcGVuZCgiOyBVUkw9Iik7Ci0gICAgICAgIGJ1ZmZlci5hcHBlbmQobGluay5nZXRBYnNvbHV0ZVVSTCgpKTsKLQotICAgICAgICAvLyBXcml0ZSBvdXQgdGhlIDxtZXRhPiB0YWcKLQotICAgICAgICB3cml0ZXIuYmVnaW5FbXB0eSgibWV0YSIpOwotICAgICAgICB3cml0ZXIuYXR0cmlidXRlKCJodHRwLWVxdWl2IiwgIlJlZnJlc2giKTsKLSAgICAgICAgd3JpdGVyLmF0dHJpYnV0ZSgiY29udGVudCIsIGJ1ZmZlci50b1N0cmluZygpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgSVJlbmRlciBnZXREZWxlZ2F0ZSgpOwotCi0gICAgcHVibGljIGFic3RyYWN0IGludCBnZXRSZWZyZXNoKCk7Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgSUFzc2V0IGdldFN0eWxlc2hlZXQoKTsKLQotICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0VGl0bGUoKTsKLQotICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0RG9jdHlwZSgpOwotCi0gICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXREVEQoKTsKLQotICAgIHB1YmxpYyBhYnN0cmFjdCBPYmplY3QgZ2V0U3R5bGVzaGVldHMoKTsKLQotICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGdldFJlbmRlckNvbnRlbnRUeXBlKCk7Ci0gICAgCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2h0bWwvU2hlbGwuandjIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2h0bWwvU2hlbGwuandjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWI3ODk0Li4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9odG1sL1NoZWxsLmp3YworKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gIAotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTwhRE9DVFlQRSBjb21wb25lbnQtc3BlY2lmaWNhdGlvbiBQVUJMSUMgCi0gICItLy9BcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi8vVGFwZXN0cnkgU3BlY2lmaWNhdGlvbiAzLjAvL0VOIiAKLSAgImh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvdGFwZXN0cnkvZHRkL1RhcGVzdHJ5XzNfMC5kdGQiPgotCQotPGNvbXBvbmVudC1zcGVjaWZpY2F0aW9uIGNsYXNzPSJvcmcuYXBhY2hlLnRhcGVzdHJ5Lmh0bWwuU2hlbGwiIGFsbG93LWluZm9ybWFsLXBhcmFtZXRlcnM9InllcyI+Ci0KLSAgPGRlc2NyaXB0aW9uPgotICBQcm92aWRlcyB0aGUgb3V0ZXIgdGFncyBpbiBhbiBIVE1MIHBhZ2U6ICZsdDtodG1sJmd0OywgJmx0O2hlYWQmZ3Q7IGFuZCAmbHQ7dGl0bGUmZ3Q7LgotICA8L2Rlc2NyaXB0aW9uPgotCi0gIDxwYXJhbWV0ZXIgbmFtZT0idGl0bGUiIAotICAJdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgCi0gIAlyZXF1aXJlZD0ieWVzIgotICAJZGlyZWN0aW9uPSJpbiI+Ci0gICAgPGRlc2NyaXB0aW9uPgotICAgIFRoZSB0aXRsZSBmb3IgdGhlIHBhZ2UuCi0gICAgPC9kZXNjcmlwdGlvbj4KLSAgPC9wYXJhbWV0ZXI+Ci0gIAotICA8cGFyYW1ldGVyIG5hbWU9InN0eWxlc2hlZXQiIAotICAJdHlwZT0ib3JnLmFwYWNoZS50YXBlc3RyeS5JQXNzZXQiCi0gIAlkaXJlY3Rpb249ImluIj4KLSAgICA8ZGVzY3JpcHRpb24+Ci0gICAgSWYgc3BlY2lmaWVkLCBwcm92aWRlcyBhbiBleHRlcm5hbCBzdHlsZXNoZWV0IGZvciB0aGUgcGFnZS4KLSAgICA8L2Rlc2NyaXB0aW9uPgotICA8L3BhcmFtZXRlcj4KLSAgCi0gIDxwYXJhbWV0ZXIgbmFtZT0ic3R5bGVzaGVldHMiIHR5cGU9ImphdmEubGFuZy5PYmplY3QiIGRpcmVjdGlvbj0iaW4iPgotICAJPGRlc2NyaXB0aW9uPgotICAJQXJyYXkgb3IgY29sbGVjdGlvbiBvZiBzdHlsZXNoZWV0IGFzc2V0cy4KLSAgCTwvZGVzY3JpcHRpb24+CQotICA8L3BhcmFtZXRlcj4KLQotICA8cGFyYW1ldGVyIG5hbWU9ImRvY3R5cGUiIAotICAJdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgCWRpcmVjdGlvbj0iaW4iCi0gIAlkZWZhdWx0LXZhbHVlPSciSFRNTCBQVUJMSUMgXCItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTlwiIFwiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkXCIiJz4KLSAgICA8ZGVzY3JpcHRpb24+Ci0gICAgVXNlZCB0byBzcGVjaWZ5IHRoZSBmdWxsIGRlZmluaXRpb24gb2YgdGhlIERPQ1RZUEUgZWxlbWVudCBpbiB0aGUgcmVzcG9uc2UgcGFnZSwKLSAgICBmb3IgZXhhbXBsZSAnbWF0aCBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL01hdGgvRFREL21hdGhtbDEvbWF0aG1sLmR0ZCInIAotCi0gICAgVGhlIGxpc3Qgb2YgY3VycmVudGx5IHZhbGlkIERPQ1RZUEUgc2V0dGluZ3MgY2FuIGJlIGZvdW5kIGhlcmU6Ci0gICAgaHR0cDovL3d3dy53My5vcmcvUUEvMjAwMi8wNC92YWxpZC1kdGQtbGlzdC5odG1sCi0KLSAgICBJZiB0aGUgcGFyYW1ldGVyIGlzIG51bGwgb3IgZW1wdHksIG5vIERPQ1RZUEUgdGFnIHdpbGwgYmUgcmVuZGVyZWQKLSAgICA8L2Rlc2NyaXB0aW9uPgotICA8L3BhcmFtZXRlcj4KLQotICA8cGFyYW1ldGVyIG5hbWU9IkRURCIgCi0gIAl0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAJZGlyZWN0aW9uPSJpbiIKLSAgCWRlZmF1bHQtdmFsdWU9J251bGwnPgotICAgIDxkZXNjcmlwdGlvbj4KLSAgICBUaGlzIHBhcmFtZXRlciBpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIHRoZSAnZG9jdHlwZScgcGFyYW1ldGVyIGluc3RlYWQuCi0KLSAgICBVc2VkIHRvIHNwZWNpZnkgdGhlIERPQ1RZUEUgRFREIG9mIHRoZSByZXNwb25zZSBwYWdlLgotICAgIDwvZGVzY3JpcHRpb24+Ci0gIDwvcGFyYW1ldGVyPgotICAKLSAgPHBhcmFtZXRlciAKLSAgCW5hbWU9InJlbmRlckNvbnRlbnRUeXBlIiAKLSAgCXR5cGU9ImJvb2xlYW4iCi0gIAlkaXJlY3Rpb249ImluIgotICAJZGVmYXVsdC12YWx1ZT0idHJ1ZSI+Ci0gICAgPGRlc2NyaXB0aW9uPgotICAgIERldGVybWluZXMgd2hldGhlciB0byByZW5kZXIgYW4gaHR0cC1lcXVpdiBlbGVtZW50IHdpdGggdGhlIENvbnRlbnQgVHlwZSBvZiB0aGlzIHJlc3BvbnNlLgotICAgIDwvZGVzY3JpcHRpb24+Ci0gIDwvcGFyYW1ldGVyPgotICAKLSAgPHBhcmFtZXRlciAKLSAgCW5hbWU9InJlZnJlc2giIAotICAJdHlwZT0iaW50IgotICAJZGlyZWN0aW9uPSJpbiI+Ci0gICAgPGRlc2NyaXB0aW9uPgotICAgIElmIHNwZWNpZmllZCwgdGhlIHBhZ2Ugd2lsbCByZWZyZXNoIGl0c2VsZiBhZnRlciB0aGUgc3BlY2lmaWVkIGRlbGF5IChpbiBzZWNvbmRzKS4KLSAgICA8L2Rlc2NyaXB0aW9uPgotICA8L3BhcmFtZXRlcj4KLSAgCi0gIDxwYXJhbWV0ZXIgCi0gIAluYW1lPSJkZWxlZ2F0ZSIgCi0gIAl0eXBlPSJvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZW5kZXIiCi0gIAlkaXJlY3Rpb249ImluIj4KLSAgICA8ZGVzY3JpcHRpb24+Ci0gICAgSWYgc3BlY2lmaWVkLCB0aGUgZGVsZWdhdGUgaXMgcmVuZGVyZWQgYmVmb3JlIHRoZSBjbG9zZSBvZiB0aGUgJmx0O2hlYWQmZ3Q7Ci0gICAgdGFnICh0eXBpY2FsbHkgdXNlZCB0byBwcm92aWRlICZsdDttZXRhJmd0OyB0YWdzKS4KLSAgICA8L2Rlc2NyaXB0aW9uPgotICA8L3BhcmFtZXRlcj4KLSAgCi08L2NvbXBvbmVudC1zcGVjaWZpY2F0aW9uPgpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2h0bWwvcGFja2FnZS5odG1sIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2h0bWwvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzRkMDEwLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9odG1sL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLTwhZG9jdHlwZSBodG1sIHB1YmxpYyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci08IS0tICRJZCQgLS0+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlRhcGVzdHJ5OiBXZWIgQXBwbGljYXRpb24gRnJhbWV3b3JrPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotCi08cD5Db21wb25lbnRzIHNwZWNpZmljIHRvIHRoZSBjcmVhdGlvbiBvZiBIVE1MIHBhZ2VzLCBpbmNsdWRpbmcgc29waGlzdGljYXRlZAotREhUTUwgSmF2YVNjcmlwdCBlZmZlY3RzLgotCi1AYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwIDxhIGhyZWY9Im1haWx0bzpobHNoaXBAYXBhY2hlLm9yZyI+aGxzaGlwQGFwYWNoZS5vcmc8L2E+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9qc3AvQWJzdHJhY3RMaW5rVGFnLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvanNwL0Fic3RyYWN0TGlua1RhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmRhNmQ2Li4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9qc3AvQWJzdHJhY3RMaW5rVGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuanNwOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLkpzcEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC5Kc3BXcml0ZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LlRhcGVzdHJ5OwotCi0vKioKLSAqICBBYnN0cmFjdCBzdXBlci1jbGFzcyBvZiBUYXBlc3RyeSBKU1AgdGFncyB0aGF0IHByb2R1Y2UgYSBoeXBlcmxpbmsKLSAqICAoPGNvZGU+Jmx0O2EmZ3Q7PC9jb2RlPikgdGFnLiAgVGFncyB1c2UgYQotICogIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LmpzcC5VUkxSZXRyaWV2ZXJ9IGZvciB0aGUgPGNvZGU+aHJlZjwvY29kZT4KLSAqICBhdHRyaWJ1dGUsIGFuZCBtYXkgaW5jbHVkZSBhIAotICogIDxjb2RlPmNsYXNzPC9jb2RlPiBhdHRyaWJ1dGUgKGJhc2VkIG9uCi0gKiAgdGhlIHtAbGluayAjZ2V0U3R5bGVDbGFzcygpIHN0eWxlQ2xhc3MgcHJvcGVydHl9LgotICoKLSAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiAgQHZlcnNpb24gJElkJAotICogIEBzaW5jZSAzLjAKLSAqCi0gKiovCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdExpbmtUYWcgZXh0ZW5kcyBBYnN0cmFjdFRhcGVzdHJ5VGFnCi17Ci0gICAgcHJpdmF0ZSBTdHJpbmcgX3N0eWxlQ2xhc3M7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN0eWxlQ2xhc3MoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9zdHlsZUNsYXNzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFN0eWxlQ2xhc3MoU3RyaW5nIHN0eWxlQ2xhc3MpCi0gICAgewotICAgICAgICBfc3R5bGVDbGFzcyA9IHN0eWxlQ2xhc3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiAgV3JpdGVzIGEgPGNvZGU+Jmx0Oy9hJmd0OzwvY29kZT4gdGFnLgotICAgICogCi0gICAgKiAgQHJldHVybiB7QGxpbmsgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlRhZyNFVkFMX1BBR0V9Ci0gICAgKiAKLSAgICAqKi8KLQotICAgIHB1YmxpYyBpbnQgZG9FbmRUYWcoKSB0aHJvd3MgSnNwRXhjZXB0aW9uCi0gICAgewotICAgICAgICBKc3BXcml0ZXIgb3V0ID0gcGFnZUNvbnRleHQuZ2V0T3V0KCk7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIG91dC5wcmludCgiPC9hPiIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBleCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IEpzcEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICBUYXBlc3RyeS5mb3JtYXQoIkFic3RyYWN0TGlua1RhZy5pby1leGNlcHRpb24iLCBleC5nZXRNZXNzYWdlKCkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBFVkFMX1BBR0U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiAgV3JpdGVzIGEgPGNvZGU+Jmx0O2EmZ3Q7IHRhZy4gIFRoZSB0YWcgbWF5Ci0gICAgKiAgaGF2ZSBhIDxjb2RlPmNsYXNzPC9jb2RlPiBhdHRyaWJ1dGUgaWYgdGhlCi0gICAgKiAge0BsaW5rICNnZXRTdHlsZUNsYXNzKCkgc3R5bGVDbGFzcyBwcm9wZXJ0eX0KLSAgICAqICBpcyBub3QgbnVsbC4gIFRoZSA8Y29kZT5ocmVmPC9jb2RlPgotICAgICogIGF0dHJpYnV0ZSBpcyBwcm92aWRlZCB2aWEKLSAgICAqICBhIHtAbGluayAjZ2V0VVJMUmV0cmlldmVyKCkgVVJMUmV0cmlldmVyfS4KLSAgICAqIAotICAgICogIEByZXR1cm4ge0BsaW5rIGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5UYWcjRVZBTF9CT0RZX0lOQ0xVREV9Ci0gICAgKiAKLSAgICAqKi8KLQotICAgIHB1YmxpYyBpbnQgZG9TdGFydFRhZygpIHRocm93cyBKc3BFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIEpzcFdyaXRlciBvdXQgPSBwYWdlQ29udGV4dC5nZXRPdXQoKTsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgb3V0LnByaW50KCI8YSIpOwotCi0gICAgICAgICAgICBpZiAoX3N0eWxlQ2xhc3MgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBvdXQucHJpbnQoIiBjbGFzcz1cIiIpOwotICAgICAgICAgICAgICAgIG91dC5wcmludChfc3R5bGVDbGFzcyk7Ci0gICAgICAgICAgICAgICAgb3V0LnByaW50KCciJyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG91dC5wcmludCgiIGhyZWY9XCIiKTsKLQotICAgICAgICAgICAgZ2V0VVJMUmV0cmlldmVyKCkuaW5zZXJ0VVJMKGdldFNlcnZsZXQoKSk7Ci0KLSAgICAgICAgICAgIC8vIEFuZCB3ZSdyZSBiYWNrISAgRmluaXNoIG9mZiB0aGUgdGFnLgotCi0gICAgICAgICAgICBvdXQucHJpbnQoIlwiPiIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBleCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IEpzcEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICBUYXBlc3RyeS5mb3JtYXQoIkFic3RyYWN0TGlua1RhZy5pby1leGNlcHRpb24iLCBleC5nZXRNZXNzYWdlKCkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBFVkFMX0JPRFlfSU5DTFVERTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvanNwL0Fic3RyYWN0VGFwZXN0cnlUYWcuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9qc3AvQWJzdHJhY3RUYXBlc3RyeVRhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmJlZDU1Li4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9qc3AvQWJzdHJhY3RUYXBlc3RyeVRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmpzcDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLkpzcEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVGFnU3VwcG9ydDsKLQotaW1wb3J0IG9nbmwuQ2xhc3NSZXNvbHZlcjsKLWltcG9ydCBvZ25sLkRlZmF1bHRDbGFzc1Jlc29sdmVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5UYXBlc3RyeTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmxpbmsuRGlyZWN0TGluazsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnBhcnNlLlRlbXBsYXRlUGFyc2VyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkudXRpbC5wcm9wLk9nbmxVdGlsczsKLQotLyoqCi0gKiAgQ29udGFpbnMgY29tbW9uIGNvZGUgYW5kIG1ldGhvZHMgZm9yIGFsbCB0aGUgVGFwZXN0cnkgSlNQIHRhZyBpbXBsZW1lbnRhdGlvbnMuCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQHNpbmNlIDMuMAotICoKLSAqKi8KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VGFwZXN0cnlUYWcgZXh0ZW5kcyBUYWdTdXBwb3J0Ci17Ci0KLSAgICBwcml2YXRlIFN0cmluZyBfc2VydmxldCA9ICIvYXBwIjsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmxldCgpCi0gICAgewotICAgICAgICByZXR1cm4gX3NlcnZsZXQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2VydmxldChTdHJpbmcgc2VydmxldCkKLSAgICB7Ci0gICAgICAgIF9zZXJ2bGV0ID0gc2VydmxldDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgSW1wbGVtZW50ZWQgaW4gc3ViY2xhc3NlcyB0byBwcm92aWRlIGEgCi0gICAgICogIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LmpzcC5VUkxSZXRyaWV2ZXJ9IGluc3RhbmNlIHRoYXQKLSAgICAgKiAgY2FuIGluc2VydCB0aGUgY29ycmVjdCBVUkwgaW50byB0aGUgb3V0cHV0LgotICAgICAqIAotICAgICAqKi8KLQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBVUkxSZXRyaWV2ZXIgZ2V0VVJMUmV0cmlldmVyKCkgdGhyb3dzIEpzcEV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqICBCdWlsZHMgYW4gb2JqZWN0IGFycmF5IGFwcHJvcHJpYXRlIGZvciB1c2UgYXMgdGhlIHNlcnZpY2UgcGFyYW1ldGVycwotICAgICAqICBmb3IgdGhlIGV4dGVybmFsIHNlcnZpY2UuIFRoZSBmaXJzdCBvYmplY3QgaW4gdGhlIGFycmF5IGlzIHRoZSBuYW1lCi0gICAgICogIG9mIHRoZSBwYWdlLiAgQW55IGFkZGl0aW9uYWwgb2JqZWN0cyBhcmUgc2VydmljZSBwYXJhbWV0ZXJzIHRvIGJlCi0gICAgICogIHN1cHBsaWVkIHRvIHRoZSBsaXN0ZW5lciBtZXRob2QuCi0gICAgICogCi0gICAgICogIDxwPgotICAgICAqICBUaGUgcGFyYW1ldGVycyBhcmUgY29udmVydGVkIHRvIGFuIGFycmF5IG9mIG9iamVjdHMKLSAgICAgKiAgdmlhIHtAbGluayAjY29udmVydFBhcmFtZXRlcnMoU3RyaW5nKX0uCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHJvdGVjdGVkIE9iamVjdFtdIGNvbnN0cnVjdEV4dGVybmFsU2VydmljZVBhcmFtZXRlcnMoU3RyaW5nIHBhZ2VOYW1lLCBTdHJpbmcgcGFyYW1ldGVycykKLSAgICAgICAgdGhyb3dzIEpzcEV4Y2VwdGlvbgotICAgIHsKLQotICAgICAgICBPYmplY3RbXSByZXNvbHZlZFBhcmFtZXRlcnMgPSBjb252ZXJ0UGFyYW1ldGVycyhwYXJhbWV0ZXJzKTsKLQotICAgICAgICBpbnQgY291bnQgPSBUYXBlc3RyeS5zaXplKHJlc29sdmVkUGFyYW1ldGVycyk7Ci0KLSAgICAgICAgaWYgKGNvdW50ID09IDApCi0gICAgICAgICAgICByZXR1cm4gbmV3IE9iamVjdFtdIHsgcGFnZU5hbWUgfTsKLQotICAgICAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGxpc3QuYWRkKHBhZ2VOYW1lKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCi0gICAgICAgICAgICBsaXN0LmFkZChyZXNvbHZlZFBhcmFtZXRlcnNbaV0pOwotCi0gICAgICAgIHJldHVybiBsaXN0LnRvQXJyYXkoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgPHA+VGhlIGV4dGVybmFsIHNlcnZpY2UgYWxsb3dzIHNlcnZpY2UgcGFyYW1ldGVycyAoYW4gYXJyYXkgb2YKLSAgICAgKiAgb2JqZWN0cykgdG8gYmUgcGFzc2VkIGFsb25nIGluc2lkZSB0aGUgVVJMLiAgVGhpcyBtZXRob2QgY29udmVydHMKLSAgICAgKiAgdGhlIGlucHV0IHN0cmluZyBpbnRvIGFuIGFycmF5IG9mIHBhcmFtZXRlciBvYmplY3RzLgotICAgICAqICA8dWw+Ci0gICAgICogIDxsaT5JZiBwYXJhbWV0ZXJzIGlzIG51bGwsIHRoZSBubyBwYXJhbWV0ZXJzIGFyZSBwYXNzZWQKLSAgICAgKiAgPGxpPklmIHBhcmFtZXRlcnMgc3RhcnRzIHdpdGggIm9nbmw6IiBpdCBpcyB0cmVhdGVkIGFzIGFuIE9HTkwgZXhwcmVzc2lvbjoKLSAgICAgKiAgICAgPHVsPgotICAgICAqICAgICA8bGk+VGhlIGV4cHJlc3Npb24gaXMgZXZhbHVhdGVkIHVzaW5nIHRoZSAKLSAgICAgKiAgICAgICAgIHtAbGluayBqYXZheC5zZXJ2bGV0LmpzcC5QYWdlQ29udGV4dCBwYWdlIGNvbnRleHR9IGFzIHRoZSByb290IG9iamVjdAotICAgICAqICAgICA8bGk+SWYgdGhlIGV4cHJlc3Npb24gdmFsdWUgaXMgYSBNYXAsIHRoZW4gdGhlIE1hcCBpcyBjb252ZXJ0ZWQgdG8KLSAgICAgKiAgCSAgIGFuIGFycmF5IHZpYSAoQGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5UYXBlc3RyeSNjb252ZXJ0TWFwVG9BcnJheShNYXApfQotICAgICAqICAgICA8bGk+T3RoZXJ3aXNlLCB0aGUgZXhwcmVzc2lvbiB2YWx1ZSBpcyBjb252ZXJ0ZWQgdXNpbmcKLSAgICAgKiAge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkubGluay5EaXJlY3RMaW5rI2NvbnN0cnVjdFNlcnZpY2VQYXJhbWV0ZXJzKE9iamVjdCl9LgotICAgICAqIAkJPC91bD4KLSAgICAgKiAgIDxsaT5PdGhlcndpc2UsIHBhcmFtZXRlcnMgYXJlIHNpbXBseSBhIHN0cmluZywgd2hpY2ggaXMgaW5jbHVkZWQgYXMgdGhlIGxvbmUKLSAgICAgKiAgc2VydmljZSBwYXJhbWV0ZXIKLSAgICAgKiAgPC91bD4KLSAgICAgKiovCi0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0W10gY29udmVydFBhcmFtZXRlcnMoU3RyaW5nIF9wYXJhbWV0ZXJzKSB0aHJvd3MgSnNwRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiAoX3BhcmFtZXRlcnMgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIGlmIChfcGFyYW1ldGVycy5zdGFydHNXaXRoKFRlbXBsYXRlUGFyc2VyLk9HTkxfRVhQUkVTU0lPTl9QUkVGSVgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgZXhwcmVzc2lvbiA9Ci0gICAgICAgICAgICAgICAgX3BhcmFtZXRlcnMuc3Vic3RyaW5nKFRlbXBsYXRlUGFyc2VyLk9HTkxfRVhQUkVTU0lPTl9QUkVGSVgubGVuZ3RoKCkgKyAxKTsKLQotICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRFeHByZXNzaW9uKGV4cHJlc3Npb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RbXSB7IF9wYXJhbWV0ZXJzIH07Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBPYmplY3RbXSBjb252ZXJ0RXhwcmVzc2lvbihTdHJpbmcgZXhwcmVzc2lvbikgdGhyb3dzIEpzcEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgT2JqZWN0IHZhbHVlID0gZXZhbHVhdGVFeHByZXNzaW9uKGV4cHJlc3Npb24pOwotCi0gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgTWFwKQotICAgICAgICAgICAgcmV0dXJuIFRhcGVzdHJ5LmNvbnZlcnRNYXBUb0FycmF5KChNYXApIHZhbHVlKTsKLQotICAgICAgICByZXR1cm4gRGlyZWN0TGluay5jb25zdHJ1Y3RTZXJ2aWNlUGFyYW1ldGVycyh2YWx1ZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBPYmplY3QgZXZhbHVhdGVFeHByZXNzaW9uKFN0cmluZyBleHByZXNzaW9uKSB0aHJvd3MgSnNwRXhjZXB0aW9uCi0gICAgewotICAgICAgICBDbGFzc1Jlc29sdmVyIHJlc29sdmVyID0gbmV3IERlZmF1bHRDbGFzc1Jlc29sdmVyKCk7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBPZ25sVXRpbHMuZ2V0KGV4cHJlc3Npb24sIHJlc29sdmVyLCBwYWdlQ29udGV4dCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSnNwRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIFRhcGVzdHJ5LmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgIkFic3RyYWN0VGFwZXN0cnlUYWcudW5hYmxlLXRvLWV2YWx1YXRlLWV4cHJlc3Npb24iLAotICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICB0LmdldE1lc3NhZ2UoKSkpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2pzcC9BYnN0cmFjdFVSTFRhZy5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2pzcC9BYnN0cmFjdFVSTFRhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTE2MzEyLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9qc3AvQWJzdHJhY3RVUkxUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmpzcDsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLkpzcEV4Y2VwdGlvbjsKLQotLyoqCi0gKiAgQmFzZSBjbGFzcyBmb3IgdGFncyB3aGljaCBzaW1wbHkgaW5zZXJ0IGEgVVJMIGludG8gdGhlIG91dHB1dC4KLSAqCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogIEB2ZXJzaW9uICRJZCQKLSAqICBAc2luY2UgMy4wCi0gKgotICoqLwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RVUkxUYWcgZXh0ZW5kcyBBYnN0cmFjdFRhcGVzdHJ5VGFnCi17Ci0KLSAgICAvKioKLQkgKiAgSW5zZXJ0cyB0aGUgVVJMIGFuZCByZXR1cm5zIHtAbGluayBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVGFnI1NLSVBfQk9EWX0uCi0JICogCi0JICoqLwotCQotICAgIHB1YmxpYyBpbnQgZG9TdGFydFRhZygpIHRocm93cyBKc3BFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGdldFVSTFJldHJpZXZlcigpLmluc2VydFVSTChnZXRTZXJ2bGV0KCkpOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIFNLSVBfQk9EWTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvanNwL0V4dGVybmFsVGFnLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvanNwL0V4dGVybmFsVGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkZDgwZTQuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2pzcC9FeHRlcm5hbFRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuanNwOwotCi1pbXBvcnQgamF2YXguc2VydmxldC5qc3AuSnNwRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5UYXBlc3RyeTsKLQotLyoqCi0gKiAgSlNQIHRhZyB0aGF0IG1ha2VzIHVzZSBvZiB0aGUgVGFwZXN0cnkgZXh0ZXJuYWwgc2VydmljZS4KLSAqICBQYXJhbWV0ZXJzIG1heSBiZSBwYXNzZWQgaW4gdGhlIFVSTC4KLSAqCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogIEB2ZXJzaW9uICRJZCQKLSAqICBAc2luY2UgMy4wCi0gKgotICoqLwotCi1wdWJsaWMgY2xhc3MgRXh0ZXJuYWxUYWcgZXh0ZW5kcyBBYnN0cmFjdExpbmtUYWcKLXsKLSAgICBwcml2YXRlIFN0cmluZyBfcGFyYW1ldGVyczsKLSAgICBwcml2YXRlIFN0cmluZyBfcGFnZTsKLQotICAgIHByb3RlY3RlZCBVUkxSZXRyaWV2ZXIgZ2V0VVJMUmV0cmlldmVyKCkgdGhyb3dzIEpzcEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBVUkxSZXRyaWV2ZXIocGFnZUNvbnRleHQsIFRhcGVzdHJ5LkVYVEVSTkFMX1NFUlZJQ0UsIAotICAgICAgICBjb25zdHJ1Y3RFeHRlcm5hbFNlcnZpY2VQYXJhbWV0ZXJzKF9wYWdlLCBfcGFyYW1ldGVycykpOwotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFyYW1ldGVycyhTdHJpbmcgcGFyYW1ldGVycykKLSAgICB7Ci0gICAgICAgIF9wYXJhbWV0ZXJzID0gcGFyYW1ldGVyczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhZ2UoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9wYWdlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBhZ2UoU3RyaW5nIHBhZ2UpCi0gICAgewotICAgICAgICBfcGFnZSA9IHBhZ2U7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXJhbWV0ZXJzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfcGFyYW1ldGVyczsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9qc3AvRXh0ZXJuYWxVUkxUYWcuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9qc3AvRXh0ZXJuYWxVUkxUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk5OTQ1My4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvanNwL0V4dGVybmFsVVJMVGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5qc3A7Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC5Kc3BFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LlRhcGVzdHJ5OwotCi0vKioKLSAqICBMaWtlIHRoZSB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5qc3AuRXh0ZXJuYWxUYWd9LCBidXQgaW5zZXJ0cyBqdXN0Ci0gKiAgdGhlIFVSTC4KLSAqCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogIEB2ZXJzaW9uICRJZCQKLSAqICBAc2luY2UgMy4wCi0gKgotICoqLwotcHVibGljIGNsYXNzIEV4dGVybmFsVVJMVGFnIGV4dGVuZHMgQWJzdHJhY3RVUkxUYWcKLXsKLQotICAgIHByaXZhdGUgU3RyaW5nIF9wYXJhbWV0ZXJzOwotICAgIHByaXZhdGUgU3RyaW5nIF9wYWdlOwotCi0gICAgcHJvdGVjdGVkIFVSTFJldHJpZXZlciBnZXRVUkxSZXRyaWV2ZXIoKSB0aHJvd3MgSnNwRXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IFVSTFJldHJpZXZlcigKLSAgICAgICAgICAgIHBhZ2VDb250ZXh0LAotICAgICAgICAgICAgVGFwZXN0cnkuRVhURVJOQUxfU0VSVklDRSwKLSAgICAgICAgICAgIGNvbnN0cnVjdEV4dGVybmFsU2VydmljZVBhcmFtZXRlcnMoX3BhZ2UsIF9wYXJhbWV0ZXJzKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFyYW1ldGVycyhTdHJpbmcgcGFyYW1ldGVycykKLSAgICB7Ci0gICAgICAgIF9wYXJhbWV0ZXJzID0gcGFyYW1ldGVyczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhZ2UoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9wYWdlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBhZ2UoU3RyaW5nIHBhZ2UpCi0gICAgewotICAgICAgICBfcGFnZSA9IHBhZ2U7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXJhbWV0ZXJzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfcGFyYW1ldGVyczsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9qc3AvUGFnZVRhZy5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2pzcC9QYWdlVGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlNTg3YWQuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2pzcC9QYWdlVGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5qc3A7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LlRhcGVzdHJ5OwotCi0vKioKLSAqICBDcmVhdGVzIGEgbGluayBmcm9tIGEgSlNQIHBhZ2UgdG8gYSBUYXBlc3RyeSBhcHBsaWNhdGlvbiBwYWdlLgotICoKLSAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiAgQHZlcnNpb24gJElkJAotICogIEBzaW5jZSAzLjAKLSAqCi0gKiovCi0KLXB1YmxpYyBjbGFzcyBQYWdlVGFnIGV4dGVuZHMgQWJzdHJhY3RMaW5rVGFnCi17Ci0gICAgcHJpdmF0ZSBTdHJpbmcgX3BhZ2U7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhZ2UoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9wYWdlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBhZ2UoU3RyaW5nIHBhZ2VOYW1lKQotICAgIHsKLSAgICAgICAgX3BhZ2UgPSBwYWdlTmFtZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgVVJMUmV0cmlldmVyIGdldFVSTFJldHJpZXZlcigpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IFVSTFJldHJpZXZlcihwYWdlQ29udGV4dCwgVGFwZXN0cnkuUEFHRV9TRVJWSUNFLCBuZXcgU3RyaW5nW10geyBfcGFnZSB9KTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9qc3AvUGFnZVVSTFRhZy5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2pzcC9QYWdlVVJMVGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyMTgyMGYuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2pzcC9QYWdlVVJMVGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5qc3A7Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC5Kc3BFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LlRhcGVzdHJ5OwotCi0vKioKLSAqICBJbnNlcnRzIGp1c3QgdGhlIFVSTCBmb3IgYSBwYWdlIHNlcnZpY2UgcmVxdWVzdCBpbnRvIHRoZSBvdXRwdXQuCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQHNpbmNlIDMuMAotICoKLSAqKi8KLQotcHVibGljIGNsYXNzIFBhZ2VVUkxUYWcgZXh0ZW5kcyBBYnN0cmFjdFVSTFRhZwotewotCXByaXZhdGUgU3RyaW5nIF9wYWdlOwkKLQotICAgIHByb3RlY3RlZCBVUkxSZXRyaWV2ZXIgZ2V0VVJMUmV0cmlldmVyKCkgdGhyb3dzIEpzcEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBVUkxSZXRyaWV2ZXIocGFnZUNvbnRleHQsIFRhcGVzdHJ5LlBBR0VfU0VSVklDRSwgbmV3IFN0cmluZ1tdIHsgX3BhZ2UgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQYWdlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfcGFnZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYWdlKFN0cmluZyBwYWdlKQotICAgIHsKLSAgICAgICAgX3BhZ2UgPSBwYWdlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2pzcC9VUkxSZXRyaWV2ZXIuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9qc3AvVVJMUmV0cmlldmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkNDU0MzEuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2pzcC9VUkxSZXRyaWV2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5qc3A7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YXguc2VydmxldC5SZXF1ZXN0RGlzcGF0Y2hlcjsKLWltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0UmVxdWVzdDsKLWltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC5Kc3BFeGNlcHRpb247Ci1pbXBvcnQgamF2YXguc2VydmxldC5qc3AuUGFnZUNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LlRhcGVzdHJ5OwotCi0vKioKLSAqICBFbmNhcHN1bGF0ZXMgdGhlIHByb2Nlc3Mgb2YgY2FsbGluZyBpbnRvIHRoZSBUYXBlc3RyeSBzZXJ2bGV0IHRvIHJldHJpZXZlCi0gKiAgYSBVUkwuCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQHNpbmNlIDMuMAotICoKLSAqKi8KLXB1YmxpYyBjbGFzcyBVUkxSZXRyaWV2ZXIKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgTE9HID0gTG9nRmFjdG9yeS5nZXRMb2coVVJMUmV0cmlldmVyLmNsYXNzKTsKLQotICAgIHByaXZhdGUgUGFnZUNvbnRleHQgX3BhZ2VDb250ZXh0OwotICAgIHByaXZhdGUgU3RyaW5nIF9zZXJ2aWNlTmFtZTsKLSAgICBwcml2YXRlIE9iamVjdFtdIF9zZXJ2aWNlUGFyYW1ldGVyczsKLQotICAgIHB1YmxpYyBVUkxSZXRyaWV2ZXIoUGFnZUNvbnRleHQgcGFnZUNvbnRleHQsIFN0cmluZyBzZXJ2aWNlTmFtZSwgT2JqZWN0W10gc2VydmljZVBhcmFtZXRlcnMpCi0gICAgewotICAgICAgICBfcGFnZUNvbnRleHQgPSBwYWdlQ29udGV4dDsKLSAgICAgICAgX3NlcnZpY2VOYW1lID0gc2VydmljZU5hbWU7Ci0gICAgICAgIF9zZXJ2aWNlUGFyYW1ldGVycyA9IHNlcnZpY2VQYXJhbWV0ZXJzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBJbnZva2VzIHRoZSBzZXJ2bGV0IHRvIHJldHJpZXZlIHRoZSBVUkwuICBUaGUgVVJMIGlzIGluc2VydGVkCi0gICAgICogIGludG8gdGhlIG91dHB1dCAoYXMgd2l0aAotICAgICAqICB7QGxpbmsgUmVxdWVzdERpc3BhdGNoZXIjaW5jbHVkZShqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXF1ZXN0LCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXNwb25zZSl9KS4gCi0gICAgICogCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCBpbnNlcnRVUkwoU3RyaW5nIHNlcnZsZXRQYXRoKSB0aHJvd3MgSnNwRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiAoTE9HLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgICAgICBMT0cuZGVidWcoIk9idGFpbmluZyBUYXBlc3RyeSBVUkwgZm9yIHNlcnZpY2UgIiArIF9zZXJ2aWNlTmFtZSArICIgYXQgIiArIHNlcnZsZXRQYXRoKTsKLQotICAgICAgICBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0ID0gX3BhZ2VDb250ZXh0LmdldFJlcXVlc3QoKTsKLQotICAgICAgICBSZXF1ZXN0RGlzcGF0Y2hlciBkaXNwYXRjaGVyID0gcmVxdWVzdC5nZXRSZXF1ZXN0RGlzcGF0Y2hlcihzZXJ2bGV0UGF0aCk7Ci0KLSAgICAgICAgaWYgKGRpc3BhdGNoZXIgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBKc3BFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgVGFwZXN0cnkuZm9ybWF0KCJVUkxSZXRyaWV2ZXIudW5hYmxlLXRvLWZpbmQtZGlzcGF0Y2hlciIsIHNlcnZsZXRQYXRoKSk7Ci0KLSAgICAgICAgcmVxdWVzdC5zZXRBdHRyaWJ1dGUoVGFwZXN0cnkuVEFHX1NVUFBPUlRfU0VSVklDRV9BVFRSSUJVVEUsIF9zZXJ2aWNlTmFtZSk7Ci0gICAgICAgIHJlcXVlc3Quc2V0QXR0cmlidXRlKFRhcGVzdHJ5LlRBR19TVVBQT1JUX1BBUkFNRVRFUlNfQVRUUklCVVRFLCBfc2VydmljZVBhcmFtZXRlcnMpOwotICAgICAgICByZXF1ZXN0LnNldEF0dHJpYnV0ZShUYXBlc3RyeS5UQUdfU1VQUE9SVF9TRVJWTEVUX1BBVEhfQVRUUklCVVRFLCBzZXJ2bGV0UGF0aCk7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIF9wYWdlQ29udGV4dC5nZXRPdXQoKS5mbHVzaCgpOwotCi0gICAgICAgICAgICBkaXNwYXRjaGVyLmluY2x1ZGUocmVxdWVzdCwgX3BhZ2VDb250ZXh0LmdldFJlc3BvbnNlKCkpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBleCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IEpzcEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICBUYXBlc3RyeS5mb3JtYXQoIlVSTFJldHJpZXZlci5pby1leGNlcHRpb24iLCBzZXJ2bGV0UGF0aCwgZXguZ2V0TWVzc2FnZSgpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFNlcnZsZXRFeGNlcHRpb24gZXgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKc3BFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgVGFwZXN0cnkuZm9ybWF0KCJVUkxSZXRyaWV2ZXIuc2VydmxldC1leGNlcHRpb24iLCBzZXJ2bGV0UGF0aCwgZXguZ2V0TWVzc2FnZSgpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICByZXF1ZXN0LnJlbW92ZUF0dHJpYnV0ZShUYXBlc3RyeS5UQUdfU1VQUE9SVF9TRVJWSUNFX0FUVFJJQlVURSk7Ci0gICAgICAgICAgICByZXF1ZXN0LnJlbW92ZUF0dHJpYnV0ZShUYXBlc3RyeS5UQUdfU1VQUE9SVF9QQVJBTUVURVJTX0FUVFJJQlVURSk7Ci0gICAgICAgICAgICByZXF1ZXN0LnJlbW92ZUF0dHJpYnV0ZShUYXBlc3RyeS5UQUdfU1VQUE9SVF9TRVJWTEVUX1BBVEhfQVRUUklCVVRFKTsKLSAgICAgICAgfQotCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2pzcC9wYWNrYWdlLmh0bWwgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvanNwL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ5MjE5Yi4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvanNwL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci0KLTxodG1sPgotPGJvZHk+Ci0KLUEgc2ltcGxlIEpTUCB0YWcgbGlicmFyeSB0aGF0IGFsbG93cyBKU1BzIHRvIGluY2x1ZGUgbGlua3MgdG8gYSBUYXBlc3RyeSBhcHBsaWNhdGlvbi4KLUN1cnJlbnRseSBzdXBwb3J0cyBqdXN0IHRoZSBwYWdlIGFuZCBleHRlcm5hbCBzZXJ2aWNlcy4KLQotQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcCA8YSBocmVmPSJtYWlsdG86aGxzaGlwQGFwYWNoZS5vcmciPmhsc2hpcEBhcGFjaGUub3JnPC9hPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvbGluay9BYnNvbHV0ZUxpbmtSZW5kZXJlci5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2xpbmsvQWJzb2x1dGVMaW5rUmVuZGVyZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA5ZWUxYy4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvbGluay9BYnNvbHV0ZUxpbmtSZW5kZXJlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkubGluazsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlcXVlc3RDeWNsZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmVuZ2luZS5JTGluazsKLQotLyoqCi0gKiAgUmVuZGVycyBhIGxpbmsgdXNpbmcgYW4gYWJzb2x1dGUgVVJMLCBub3Qgc2ltcGx5IGEgVVJJCi0gKiAgKGFzIHdpdGgge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkubGluay5EZWZhdWx0TGlua1JlbmRlcmVyfS4gIEluIGFkZGl0aW9uLAotICogIHRoZSBzY2hlbWUsIHNlcnZlciBhbmQgcG9ydCBtYXkgYmUgY2hhbmdlZCAodGhpcyBtYXkgYmUgYXBwcm9wcmlhdGUgd2hlbgotICogIHN3aXRjaGluZyBiZXR3ZWVuIHNlY3VyZSBhbmQgaW5zZWN1cmUgcG9ydGlvbnMgb2YgYW4gYXBwbGljYXRpb24pLgotICoKLSAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiAgQHZlcnNpb24gJElkJAotICogIEBzaW5jZSAzLjAKLSAqIAotICoqLwotCi1wdWJsaWMgY2xhc3MgQWJzb2x1dGVMaW5rUmVuZGVyZXIgZXh0ZW5kcyBEZWZhdWx0TGlua1JlbmRlcmVyCi17Ci0gICAgcHJpdmF0ZSBTdHJpbmcgX3NjaGVtZTsKLSAgICBwcml2YXRlIFN0cmluZyBfc2VydmVyTmFtZTsKLSAgICBwcml2YXRlIGludCBfcG9ydDsKLQotICAgIHB1YmxpYyBpbnQgZ2V0UG9ydCgpCi0gICAgewotICAgICAgICByZXR1cm4gX3BvcnQ7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRTY2hlbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9zY2hlbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRTZXJ2ZXJOYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfc2VydmVyTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgVXNlZCB0byBvdmVycmlkZSB0aGUgcG9ydCBpbiB0aGUgZmluYWwgVVJMLCBpZiBzcGVjaWZpZWQuICBJZiBub3Qgc3BlY2lmaWVkLAotICAgICAqICB0aGUgcG9ydCBwcm92aWRlZCBieSB0aGUge0BsaW5rIGphdmF4LnNlcnZsZXQuU2VydmxldFJlcXVlc3QjZ2V0U2VydmVyUG9ydCgpIHJlcXVlc3R9Ci0gICAgICogIGlzIHVzZWQgKHR5cGljYWxseSwgdGhlIHZhbHVlIDgwKS4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIHNldFBvcnQoaW50IHBvcnQpCi0gICAgewotICAgICAgICBfcG9ydCA9IHBvcnQ7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqICBVc2VkIHRvIG92ZXJyaWRlIHRoZSBzY2hlbWUgaW4gdGhlIGZpbmFsIFVSTCwgaWYgc3BlY2lmaWVkLiAgSWYgbm90IHNwZWNpZmllZCwKLSAgICAgKiAgdGhlIHNjaGVtZSBwcm92aWRlZCBieSB0aGUge0BsaW5rIGphdmF4LnNlcnZsZXQuU2VydmxldFJlcXVlc3QjZ2V0U2NoZW1lKCkgcmVxdWVzdH0KLSAgICAgKiAgaXMgdXNlZCAodHlwaWNhbGx5LCA8Y29kZT5odHRwPC9jb2RlPikuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCBzZXRTY2hlbWUoU3RyaW5nIHNjaGVtZSkKLSAgICB7Ci0gICAgICAgIF9zY2hlbWUgPSBzY2hlbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFVzZWQgdG8gb3ZlcnJpZGUgdGhlIHNlcnZlciBuYW1lIGluIHRoZSBmaW5hbCBVUkwsIGlmIHNwZWNpZmllZC4gIElmIG5vdCBzcGVjaWZpZWQsCi0gICAgICogIHRoZSBwb3J0IHByb3ZpZGVkIGJ5IHRoZSB7QGxpbmsgamF2YXguc2VydmxldC5TZXJ2bGV0UmVxdWVzdCNnZXRTZXJ2ZXJOYW1lKCkgcmVxdWVzdH0KLSAgICAgKiAgaXMgdXNlZC4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIHNldFNlcnZlck5hbWUoU3RyaW5nIHNlcnZlck5hbWUpCi0gICAgewotICAgICAgICBfc2VydmVyTmFtZSA9IHNlcnZlck5hbWU7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBjb25zdHJ1Y3RVUkwoSUxpbmsgbGluaywgU3RyaW5nIGFuY2hvciwgSVJlcXVlc3RDeWNsZSBjeWNsZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBsaW5rLmdldEFic29sdXRlVVJMKF9zY2hlbWUsIF9zZXJ2ZXJOYW1lLCBfcG9ydCwgYW5jaG9yLCB0cnVlKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9saW5rL0Fic3RyYWN0TGlua0NvbXBvbmVudC5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2xpbmsvQWJzdHJhY3RMaW5rQ29tcG9uZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjYmI3NmUuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2xpbmsvQWJzdHJhY3RMaW5rQ29tcG9uZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzQgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkubGluazsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LkFic3RyYWN0Q29tcG9uZW50OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSU1hcmt1cFdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZXF1ZXN0Q3ljbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5UYXBlc3RyeTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbXBvbmVudHMuSUxpbmtDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5jb21wb25lbnRzLkxpbmtFdmVudFR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5lbmdpbmUuSUVuZ2luZVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5lbmdpbmUuSUxpbms7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5odG1sLkJvZHk7Ci0KLS8qKgotICogIEJhc2UgY2xhc3MgZm9yCi0gKiAgaW1wbGVtZW50YXRpb25zIG9mIHtAbGluayBJTGlua0NvbXBvbmVudH0uICBJbmNsdWRlcyBhIGRpc2FibGVkIGF0dHJpYnV0ZQotICogICh0aGF0IHNob3VsZCBiZSBib3VuZCB0byBhIGRpc2FibGVkIHBhcmFtZXRlciksIAotICogIGFuIGFuY2hvciBhdHRyaWJ1dGUsIGFuZCBhCi0gKiAgcmVuZGVyZXIgYXR0cmlidXRlICh0aGF0IHNob3VsZCBiZSBib3VuZCB0byBhIHJlbmRlcmVyIHBhcmFtZXRlcikuICBBIGRlZmF1bHQsCi0gKiAgc2hhcmVkIGluc3RhbmNlIG9mIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LmxpbmsuRGVmYXVsdExpbmtSZW5kZXJlcn0gaXMKLSAqICB1c2VkIHdoZW4gbm8gc3BlY2lmaWMgcmVuZGVyZXIgaXMgcHJvdmlkZWQuCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKgotICoqLwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RMaW5rQ29tcG9uZW50IGV4dGVuZHMgQWJzdHJhY3RDb21wb25lbnQgaW1wbGVtZW50cyBJTGlua0NvbXBvbmVudAotewotICAgIHByaXZhdGUgTWFwIF9ldmVudEhhbmRsZXJzOwotCi0gICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNEaXNhYmxlZCgpOwotCi0gICAgLyoqCi0gICAgICogIEFkZHMgYW4gZXZlbnQgaGFuZGxlciAodHlwaWNhbGx5LCBmcm9tIGEgd3JhcHBlZCBjb21wb25lbnQgc3VjaAotICAgICAqICBhcyBhIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5Lmh0bWwuUm9sbG92ZXJ9KS4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIGFkZEV2ZW50SGFuZGxlcihMaW5rRXZlbnRUeXBlIGV2ZW50VHlwZSwgU3RyaW5nIGZ1bmN0aW9uTmFtZSkKLSAgICB7Ci0gICAgICAgIE9iamVjdCBjdXJyZW50VmFsdWU7Ci0KLSAgICAgICAgaWYgKF9ldmVudEhhbmRsZXJzID09IG51bGwpCi0gICAgICAgICAgICBfZXZlbnRIYW5kbGVycyA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICAgICAgY3VycmVudFZhbHVlID0gX2V2ZW50SGFuZGxlcnMuZ2V0KGV2ZW50VHlwZSk7Ci0KLSAgICAgICAgLy8gVGhlIGZpcnN0IHZhbHVlIGlzIGFkZGVkIGFzIGEgU3RyaW5nCi0KLSAgICAgICAgaWYgKGN1cnJlbnRWYWx1ZSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBfZXZlbnRIYW5kbGVycy5wdXQoZXZlbnRUeXBlLCBmdW5jdGlvbk5hbWUpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gV2hlbiBhZGRpbmcgdGhlIHNlY29uZCB2YWx1ZSwgY29udmVydCB0byBhIExpc3QKLQotICAgICAgICBpZiAoY3VycmVudFZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKQotICAgICAgICB7Ci0gICAgICAgICAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICBsaXN0LmFkZChjdXJyZW50VmFsdWUpOwotICAgICAgICAgICAgbGlzdC5hZGQoZnVuY3Rpb25OYW1lKTsKLQotICAgICAgICAgICAgX2V2ZW50SGFuZGxlcnMucHV0KGV2ZW50VHlwZSwgbGlzdCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBGb3IgdGhlIHRoaXJkIGFuZCB1cCwgYWRkIHRoZSBuZXcgZnVuY3Rpb24gdG8gdGhlIExpc3QKLQotICAgICAgICBMaXN0IGxpc3QgPSAoTGlzdCkgY3VycmVudFZhbHVlOwotICAgICAgICBsaXN0LmFkZChmdW5jdGlvbk5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBSZW5kZXJzIHRoZSBsaW5rIGJ5IGRlbGVnYXRpbmcgdG8gYW4gaW5zdGFuY2UKLSAgICAgKiAgb2Yge0BsaW5rIElMaW5rUmVuZGVyZXJ9LgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVuZGVyQ29tcG9uZW50KElNYXJrdXBXcml0ZXIgd3JpdGVyLCBJUmVxdWVzdEN5Y2xlIGN5Y2xlKQotICAgIHsKLSAgICAgICAgZ2V0UmVuZGVyZXIoKS5yZW5kZXJMaW5rKHdyaXRlciwgY3ljbGUsIHRoaXMpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGNsZWFudXBBZnRlclJlbmRlcihJUmVxdWVzdEN5Y2xlIGN5Y2xlKQotICAgIHsKLSAgICAgICAgX2V2ZW50SGFuZGxlcnMgPSBudWxsOwotCi0gICAgICAgIHN1cGVyLmNsZWFudXBBZnRlclJlbmRlcihjeWNsZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgd3JpdGVFdmVudEhhbmRsZXJzKElNYXJrdXBXcml0ZXIgd3JpdGVyLCBJUmVxdWVzdEN5Y2xlIGN5Y2xlKQotICAgIHsKLSAgICAgICAgU3RyaW5nIG5hbWUgPSBudWxsOwotCi0gICAgICAgIGlmIChfZXZlbnRIYW5kbGVycyA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIEJvZHkgYm9keSA9IEJvZHkuZ2V0KGN5Y2xlKTsKLQotICAgICAgICBpZiAoYm9keSA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICBUYXBlc3RyeS5nZXRNZXNzYWdlKCJBYnN0cmFjdExpbmtDb21wb25lbnQuZXZlbnRzLW5lZWQtYm9keSIpLAotICAgICAgICAgICAgICAgIHRoaXMsCi0gICAgICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgICAgICBudWxsKTsKLQotICAgICAgICBJdGVyYXRvciBpID0gX2V2ZW50SGFuZGxlcnMuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotCi0gICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaS5uZXh0KCk7Ci0gICAgICAgICAgICBMaW5rRXZlbnRUeXBlIHR5cGUgPSAoTGlua0V2ZW50VHlwZSkgZW50cnkuZ2V0S2V5KCk7Ci0KLSAgICAgICAgICAgIG5hbWUgPSB3cml0ZUV2ZW50SGFuZGxlcih3cml0ZXIsIGJvZHksIG5hbWUsIHR5cGUuZ2V0QXR0cmlidXRlTmFtZSgpLCBlbnRyeS5nZXRWYWx1ZSgpKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyB3cml0ZUV2ZW50SGFuZGxlcigKLSAgICAgICAgSU1hcmt1cFdyaXRlciB3cml0ZXIsCi0gICAgICAgIEJvZHkgYm9keSwKLSAgICAgICAgU3RyaW5nIG5hbWUsCi0gICAgICAgIFN0cmluZyBhdHRyaWJ1dGVOYW1lLAotICAgICAgICBPYmplY3QgdmFsdWUpCi0gICAgewotICAgICAgICBTdHJpbmcgd3JhcHBlckZ1bmN0aW9uTmFtZTsKLQotICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdyYXBwZXJGdW5jdGlvbk5hbWUgPSAoU3RyaW5nKSB2YWx1ZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBmaW5hbE5hbWUgPSBuYW1lID09IG51bGwgPyBib2R5LmdldFVuaXF1ZVN0cmluZygiTGluayIpIDogbmFtZTsKLQotICAgICAgICAgICAgd3JhcHBlckZ1bmN0aW9uTmFtZSA9IGF0dHJpYnV0ZU5hbWUgKyAiXyIgKyBmaW5hbE5hbWU7Ci0KLSAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLSAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoImZ1bmN0aW9uICIpOwotICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCh3cmFwcGVyRnVuY3Rpb25OYW1lKTsKLSAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIiAoKVxue1xuIik7Ci0KLSAgICAgICAgICAgIEl0ZXJhdG9yIGkgPSAoKExpc3QpIHZhbHVlKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZyBmdW5jdGlvbk5hbWUgPSAoU3RyaW5nKSBpLm5leHQoKTsKLSAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCIgICIpOwotICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoZnVuY3Rpb25OYW1lKTsKLSAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCIoKTtcbiIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBidWZmZXIuYXBwZW5kKCJ9XG5cbiIpOwotCi0gICAgICAgICAgICBib2R5LmFkZEJvZHlTY3JpcHQoYnVmZmVyLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgd3JpdGVyLmF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lLCAiamF2YXNjcmlwdDoiICsgd3JhcHBlckZ1bmN0aW9uTmFtZSArICIoKTsiKTsKLQotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0KLSAgICAvKiogQHNpbmNlIDMuMCAqKi8KLQotICAgIHB1YmxpYyBhYnN0cmFjdCBJTGlua1JlbmRlcmVyIGdldFJlbmRlcmVyKCk7Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRSZW5kZXJlcihJTGlua1JlbmRlcmVyIHJlbmRlcmVyKTsKLQotICAgIHB1YmxpYyB2b2lkIHJlbmRlckFkZGl0aW9uYWxBdHRyaWJ1dGVzKElNYXJrdXBXcml0ZXIgd3JpdGVyLCBJUmVxdWVzdEN5Y2xlIGN5Y2xlKQotICAgIHsKLSAgICAgICAgd3JpdGVFdmVudEhhbmRsZXJzKHdyaXRlciwgY3ljbGUpOwotCi0gICAgICAgIC8vIEdlbmVyYXRlIGFkZGl0aW9uYWwgYXR0cmlidXRlcyBmcm9tIGluZm9ybWFsIHBhcmFtZXRlcnMuCi0KLSAgICAgICAgcmVuZGVySW5mb3JtYWxQYXJhbWV0ZXJzKHdyaXRlciwgY3ljbGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBVdGlsaXR5IG1ldGhvZCBmb3Igc3ViY2xhc3NlczsgR2V0cyB0aGUgbmFtZWQgc2VydmljZSBmcm9tIHRoZSBlbmdpbmUKLSAgICAgKiAgYW5kIGludm9rZXMge0BsaW5rIElFbmdpbmVTZXJ2aWNlI2dldExpbmsoSVJlcXVlc3RDeWNsZSwgb3JnLmFwYWNoZS50YXBlc3RyeS5JQ29tcG9uZW50LCBPYmplY3RbXSl9Ci0gICAgICogIG9uIGl0LgotICAgICAqIAotICAgICAqICBAc2luY2UgMy4wCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHJvdGVjdGVkIElMaW5rIGdldExpbmsoSVJlcXVlc3RDeWNsZSBjeWNsZSwgU3RyaW5nIHNlcnZpY2VOYW1lLCBPYmplY3RbXSBzZXJ2aWNlUGFyYW1ldGVycykKLSAgICB7Ci0gICAgICAgIElFbmdpbmVTZXJ2aWNlIHNlcnZpY2UgPSBjeWNsZS5nZXRFbmdpbmUoKS5nZXRTZXJ2aWNlKHNlcnZpY2VOYW1lKTsKLQotICAgICAgICByZXR1cm4gc2VydmljZS5nZXRMaW5rKGN5Y2xlLCB0aGlzLCBzZXJ2aWNlUGFyYW1ldGVycyk7Ci0gICAgfQotCi0gICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRBbmNob3IoKTsKLQotICAgIHB1YmxpYyBJTGluayBnZXRMaW5rKElSZXF1ZXN0Q3ljbGUgY3ljbGUpCi0gICAgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSByZW5kZXJlciBwYXJhbWV0ZXIgcHJvcGVydHkgdG8gaXRzIGRlZmF1bHQgdmFsdWUKLSAgICAgKiB7QGxpbmsgRGVmYXVsdExpbmtSZW5kZXJlciNTSEFSRURfSU5TVEFOQ0V9LgotICAgICAqIAotICAgICAqIEBzaW5jZSAzLjAKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBmaW5pc2hMb2FkKCkKLSAgICB7Ci0gICAgICAgIHNldFJlbmRlcmVyKERlZmF1bHRMaW5rUmVuZGVyZXIuU0hBUkVEX0lOU1RBTkNFKTsKLSAgICB9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvbGluay9BY3Rpb25MaW5rLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvbGluay9BY3Rpb25MaW5rLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhMDFkMDEuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2xpbmsvQWN0aW9uTGluay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkubGluazsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUFjdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklBY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklCaW5kaW5nOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlcXVlc3RDeWNsZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LlJlbmRlclJld291bmRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5UYXBlc3RyeTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmVuZ2luZS5JTGluazsKLQotLyoqCi0gKiAgQSBjb21wb25lbnQgZm9yIGNyZWF0aW5nIGEgbGluayB0aGF0IGlzIGhhbmRsZWQgdXNpbmcgdGhlIGFjdGlvbiBzZXJ2aWNlLgotICogCi0gKiAgWzxhIGhyZWY9Ii4uLy4uLy4uLy4uLy4uL0NvbXBvbmVudFJlZmVyZW5jZS9BY3Rpb25MaW5rLmh0bWwiPkNvbXBvbmVudCBSZWZlcmVuY2U8L2E+XQotICoKLSAqCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogIEB2ZXJzaW9uICRJZCQKLSAqCi0gKiovCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBY3Rpb25MaW5rIGV4dGVuZHMgQWJzdHJhY3RMaW5rQ29tcG9uZW50IGltcGxlbWVudHMgSUFjdGlvbgotewotICAgIC8qKgotICAgICAqICBSZXR1cm5zIHRydWUgaWYgdGhlIHN0YXRlZnVsIHBhcmFtZXRlciBpcyBib3VuZCB0bwotICAgICAqICBhIHRydWUgdmFsdWUuICBJZiBzdGF0ZWZ1bCBpcyBub3QgYm91bmQsIGFsc28gcmV0dXJucwotICAgICAqICB0aGUgZGVmYXVsdCwgdHJ1ZS4KLSAgICAgKiAKLSAgICAgKiAgPHA+Tm90ZSB0aGF0IHRoaXMgbWV0aG9kIGNhbiBiZSBjYWxsZWQgd2hlbiB0aGUKLSAgICAgKiAgY29tcG9uZW50IGlzIG5vdCByZW5kZXJpbmcsIHRoZXJlZm9yZSBpdCBtdXN0Ci0gICAgICogIGRpcmVjdGx5IGFjY2VzcyB0aGUge0BsaW5rIElCaW5kaW5nfSBmb3IgdGhlIHN0YXRlZnVsCi0gICAgICogIHBhcmFtZXRlci4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBib29sZWFuIGdldFJlcXVpcmVzU2Vzc2lvbigpCi0gICAgewotICAgIAlJQmluZGluZyBzdGF0ZWZ1bEJpbmRpbmcgPSBnZXRTdGF0ZWZ1bEJpbmRpbmcoKTsKLSAgICAJCi0gICAgICAgIGlmIChzdGF0ZWZ1bEJpbmRpbmcgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgIHJldHVybiBzdGF0ZWZ1bEJpbmRpbmcuZ2V0Qm9vbGVhbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBJTGluayBnZXRMaW5rKElSZXF1ZXN0Q3ljbGUgY3ljbGUpCi0gICAgewotICAgICAgICBTdHJpbmcgYWN0aW9uSWQgPSBjeWNsZS5nZXROZXh0QWN0aW9uSWQoKTsKLQotICAgICAgICBpZiAoY3ljbGUuaXNSZXdvdW5kKHRoaXMpKQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXRMaXN0ZW5lcigpLmFjdGlvblRyaWdnZXJlZCh0aGlzLCBjeWNsZSk7Ci0KLSAgICAgICAgICAgIHRocm93IG5ldyBSZW5kZXJSZXdvdW5kRXhjZXB0aW9uKHRoaXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGdldExpbmsoY3ljbGUsIFRhcGVzdHJ5LkFDVElPTl9TRVJWSUNFLCBuZXcgT2JqZWN0W10geyBhY3Rpb25JZCB9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgSUJpbmRpbmcgZ2V0U3RhdGVmdWxCaW5kaW5nKCk7Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgSUFjdGlvbkxpc3RlbmVyIGdldExpc3RlbmVyKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2xpbmsvQWN0aW9uTGluay5qd2MgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvbGluay9BY3Rpb25MaW5rLmp3YwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjU4YWQ1ZS4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvbGluay9BY3Rpb25MaW5rLmp3YworKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAgCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPCEtLSAkSWQkIC0tPgotPCFET0NUWVBFIGNvbXBvbmVudC1zcGVjaWZpY2F0aW9uIFBVQkxJQyAKLSAgIi0vL0FwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLy9UYXBlc3RyeSBTcGVjaWZpY2F0aW9uIDMuMC8vRU4iIAotICAiaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy90YXBlc3RyeS9kdGQvVGFwZXN0cnlfM18wLmR0ZCI+Ci0gIAotPGNvbXBvbmVudC1zcGVjaWZpY2F0aW9uIGNsYXNzPSJvcmcuYXBhY2hlLnRhcGVzdHJ5LmxpbmsuQWN0aW9uTGluayI+Ci0KLSAgPGRlc2NyaXB0aW9uPgotICBDcmVhdGVzIGEgY29udGV4dHVhbCBsaW5rIHdpdGhpbiB0aGUgcmVzcG9uc2UgcGFnZS4gIFRoZSBwYWdlIHdpbGwgYmUgcmV3b3VuZCB0byBpdHMKLSAgb3JpZ2luYWwgc3RhdGUgYmVmb3JlIHRoZSBsaXN0ZW5lciBpcyBpbnZva2VkLgotICA8L2Rlc2NyaXB0aW9uPgotICAKLSAgPHBhcmFtZXRlciBuYW1lPSJsaXN0ZW5lciIgCi0gIAl0eXBlPSJvcmcuYXBhY2hlLnRhcGVzdHJ5LklBY3Rpb25MaXN0ZW5lciIgCi0gIAlyZXF1aXJlZD0ieWVzIgotICAJZGlyZWN0aW9uPSJpbiIvPgotICAJCi0gIDxwYXJhbWV0ZXIgbmFtZT0iZGlzYWJsZWQiCi0gIAl0eXBlPSJib29sZWFuIgotICAJZGlyZWN0aW9uPSJpbiIvPgotICAJICAJCi0gIDxwYXJhbWV0ZXIgbmFtZT0iYW5jaG9yIiAKLSAgCXR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gIAlkaXJlY3Rpb249ImluIi8+Ci0gIAkKLSAgPHBhcmFtZXRlciBuYW1lPSJyZW5kZXJlciIKLSAgCXR5cGU9Im9yZy5hcGFjaGUudGFwZXN0cnkubGluay5JTGlua1JlbmRlcmVyIgotICAJZGlyZWN0aW9uPSJpbiIvPgotICAJCi0gIDxwYXJhbWV0ZXIgbmFtZT0ic3RhdGVmdWwiIHR5cGU9ImJvb2xlYW4iIGRpcmVjdGlvbj0iY3VzdG9tIiBwcm9wZXJ0eS1uYW1lPSJzdGF0ZWZ1bCIvPgkKLSAgCi0gIDxyZXNlcnZlZC1wYXJhbWV0ZXIgbmFtZT0iaHJlZiIvPgotICAKLTwvY29tcG9uZW50LXNwZWNpZmljYXRpb24+CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvbGluay9EZWZhdWx0TGlua1JlbmRlcmVyLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvbGluay9EZWZhdWx0TGlua1JlbmRlcmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhM2NlYjYuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2xpbmsvRGVmYXVsdExpbmtSZW5kZXJlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5Lmxpbms7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LkFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklNYXJrdXBXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVxdWVzdEN5Y2xlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuVGFwZXN0cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5jb21wb25lbnRzLklMaW5rQ29tcG9uZW50OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuZW5naW5lLklMaW5rOwotCi0vKioKLSAqICBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LmxpbmsuSUxpbmtSZW5kZXJlcn0sIHdoaWNoCi0gKiAgZG9lcyBub3RoaW5nIHNwZWNpYWwuICBDYW4gYmUgdXNlZCBhcyBhIGJhc2UgY2xhc3MgdG8gcHJvdmlkZQotICogIGFkZGl0aW9uYWwgaGFuZGxpbmcuCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAsIERhdmlkIFNvbGlzCi0gKiAgQHZlcnNpb24gJElkJAotICogIEBzaW5jZSAzLjAKLSAqKi8KLQotcHVibGljIGNsYXNzIERlZmF1bHRMaW5rUmVuZGVyZXIgaW1wbGVtZW50cyBJTGlua1JlbmRlcmVyCi17Ci0gICAgLyoqCi0gICAgICogIEEgc2hhcmVkIGluc3RhbmNlIHVzZWQgYXMgYSBkZWZhdWx0IGZvciBhbnkgbGluayB0aGF0IGRvZXNuJ3QgZXhwbGljaXRseQotICAgICAqICBvdmVycmlkZS4KLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIElMaW5rUmVuZGVyZXIgU0hBUkVEX0lOU1RBTkNFID0gbmV3IERlZmF1bHRMaW5rUmVuZGVyZXIoKTsKLQotICAgIHB1YmxpYyB2b2lkIHJlbmRlckxpbmsoSU1hcmt1cFdyaXRlciB3cml0ZXIsIElSZXF1ZXN0Q3ljbGUgY3ljbGUsIElMaW5rQ29tcG9uZW50IGxpbmtDb21wb25lbnQpCi0gICAgewotICAgICAgICBJTWFya3VwV3JpdGVyIHdyYXBwZWRXcml0ZXIgPSBudWxsOwotCi0gICAgICAgIGlmIChjeWNsZS5nZXRBdHRyaWJ1dGUoVGFwZXN0cnkuTElOS19DT01QT05FTlRfQVRUUklCVVRFX05BTUUpICE9IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIFRhcGVzdHJ5LmdldE1lc3NhZ2UoIkFic3RyYWN0TGlua0NvbXBvbmVudC5uby1uZXN0aW5nIiksCi0gICAgICAgICAgICAgICAgbGlua0NvbXBvbmVudCwKLSAgICAgICAgICAgICAgICBudWxsLAotICAgICAgICAgICAgICAgIG51bGwpOwotCi0gICAgICAgIGN5Y2xlLnNldEF0dHJpYnV0ZShUYXBlc3RyeS5MSU5LX0NPTVBPTkVOVF9BVFRSSUJVVEVfTkFNRSwgbGlua0NvbXBvbmVudCk7Ci0KLSAgICAgICAgYm9vbGVhbiBoYXNCb2R5ID0gZ2V0SGFzQm9keSgpOwotCi0gICAgICAgIGJvb2xlYW4gZGlzYWJsZWQgPSBsaW5rQ29tcG9uZW50LmlzRGlzYWJsZWQoKTsKLQotICAgICAgICBpZiAoIWRpc2FibGVkKQotICAgICAgICB7Ci0gICAgICAgICAgICBJTGluayBsID0gbGlua0NvbXBvbmVudC5nZXRMaW5rKGN5Y2xlKTsKLQotICAgICAgICAgICAgaWYgKGhhc0JvZHkpCi0gICAgICAgICAgICAgICAgd3JpdGVyLmJlZ2luKGdldEVsZW1lbnQoKSk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgd3JpdGVyLmJlZ2luRW1wdHkoZ2V0RWxlbWVudCgpKTsKLQotICAgICAgICAgICAgd3JpdGVyLmF0dHJpYnV0ZShnZXRVcmxBdHRyaWJ1dGUoKSwgY29uc3RydWN0VVJMKGwsIGxpbmtDb21wb25lbnQuZ2V0QW5jaG9yKCksIGN5Y2xlKSk7Ci0KLSAgICAgICAgICAgIGJlZm9yZUJvZHlSZW5kZXIod3JpdGVyLCBjeWNsZSwgbGlua0NvbXBvbmVudCk7Ci0KLSAgICAgICAgICAgIC8vIEFsbG93IHRoZSB3cmFwcGVkIGNvbXBvbmVudHMgYSBjaGFuY2UgdG8gcmVuZGVyLgotICAgICAgICAgICAgLy8gQWxvbmcgdGhlIHdheSwgdGhleSBtYXkgaW50ZXJhY3Qgd2l0aCB0aGlzIGNvbXBvbmVudAotICAgICAgICAgICAgLy8gYW5kIGNhdXNlIHRoZSBuYW1lIHZhcmlhYmxlIHRvIGdldCBzZXQuCi0KLSAgICAgICAgICAgIHdyYXBwZWRXcml0ZXIgPSB3cml0ZXIuZ2V0TmVzdGVkV3JpdGVyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgd3JhcHBlZFdyaXRlciA9IHdyaXRlcjsKLQotICAgICAgICBpZiAoaGFzQm9keSkKLSAgICAgICAgICAgIGxpbmtDb21wb25lbnQucmVuZGVyQm9keSh3cmFwcGVkV3JpdGVyLCBjeWNsZSk7Ci0KLSAgICAgICAgaWYgKCFkaXNhYmxlZCkKLSAgICAgICAgewotICAgICAgICAgICAgYWZ0ZXJCb2R5UmVuZGVyKHdyaXRlciwgY3ljbGUsIGxpbmtDb21wb25lbnQpOwotCi0gICAgICAgICAgICBsaW5rQ29tcG9uZW50LnJlbmRlckFkZGl0aW9uYWxBdHRyaWJ1dGVzKHdyaXRlciwgY3ljbGUpOwotCi0gICAgICAgICAgICBpZiAoaGFzQm9keSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB3cmFwcGVkV3JpdGVyLmNsb3NlKCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBDbG9zZSB0aGUgPGVsZW1lbnQ+IHRhZwotCi0gICAgICAgICAgICAgICAgd3JpdGVyLmVuZCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHdyaXRlci5jbG9zZVRhZygpOwotICAgICAgICB9Ci0KLSAgICAgICAgY3ljbGUucmVtb3ZlQXR0cmlidXRlKFRhcGVzdHJ5LkxJTktfQ09NUE9ORU5UX0FUVFJJQlVURV9OQU1FKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgQ29udmVydHMgdGhlIEVuZ2luZVNlcnZpY2VMaW5rIGludG8gYSBVUkkgb3IgVVJMLiAgVGhpcyBpbXBsZW1lbnRhdGlvbgotICAgICAqICBzaW1wbHkgaW52b2tlcyB7QGxpbmsgSUxpbmsjZ2V0VVJMKFN0cmluZywgYm9vbGVhbil9LgotICAgICAqIAotICAgICAqKi8KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgY29uc3RydWN0VVJMKElMaW5rIGxpbmssIFN0cmluZyBhbmNob3IsIElSZXF1ZXN0Q3ljbGUgY3ljbGUpCi0gICAgewotICAgICAgICByZXR1cm4gbGluay5nZXRVUkwoYW5jaG9yLCB0cnVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgSW52b2tlZCBhZnRlciB0aGUgaHJlZiBhdHRyaWJ1dGUgaGFzIGJlZW4gd3JpdHRlbiBidXQgYmVmb3JlCi0gICAgICogIHRoZSBib2R5IG9mIHRoZSBsaW5rIGlzIHJlbmRlcmVkIChidXQgb25seSBpZiB0aGUgbGluawotICAgICAqICBpcyBub3QgZGlzYWJsZWQpLgotICAgICAqIAotICAgICAqICA8cD4KLSAgICAgKiAgVGhpcyBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcuCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHJvdGVjdGVkIHZvaWQgYmVmb3JlQm9keVJlbmRlcihJTWFya3VwV3JpdGVyIHdyaXRlciwgSVJlcXVlc3RDeWNsZSBjeWNsZSwgSUxpbmtDb21wb25lbnQgbGluaykKLSAgICB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEludm9rZWQgYWZ0ZXIgdGhlIGJvZHkgb2YgdGhlIGxpbmsgaXMgcmVuZGVyZWQsIGJ1dCBiZWZvcmUKLSAgICAgKiAge0BsaW5rIElMaW5rQ29tcG9uZW50I3JlbmRlckFkZGl0aW9uYWxBdHRyaWJ1dGVzKElNYXJrdXBXcml0ZXIsIElSZXF1ZXN0Q3ljbGUpfSBpcyBpbnZva2VkCi0gICAgICogIChidXQgb25seSBpZiB0aGUgbGluayBpcyBub3QgZGlzYWJsZWQpLgotICAgICAqIAotICAgICAqICA8cD4KLSAgICAgKiAgVGhpcyBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcuCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHJvdGVjdGVkIHZvaWQgYWZ0ZXJCb2R5UmVuZGVyKElNYXJrdXBXcml0ZXIgd3JpdGVyLCBJUmVxdWVzdEN5Y2xlIGN5Y2xlLCBJTGlua0NvbXBvbmVudCBsaW5rKQotICAgIHsKLSAgICB9Ci0KLSAgICAvKiogQHNpbmNlIDMuMCAqKi8KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RWxlbWVudCgpCi0gICAgewotICAgICAgICByZXR1cm4gImEiOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VXJsQXR0cmlidXRlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAiaHJlZiI7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZ2V0SGFzQm9keSgpCi0gICAgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvbGluay9EaXJlY3RMaW5rLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvbGluay9EaXJlY3RMaW5rLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjN2ZmMjAuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2xpbmsvRGlyZWN0TGluay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5Lmxpbms7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUFjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUJpbmRpbmc7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JRGlyZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlcXVlc3RDeWNsZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LlRhcGVzdHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuZW5naW5lLklMaW5rOwotCi0vKioKLSAqICBBIGNvbXBvbmVudCBmb3IgY3JlYXRpbmcgYSBsaW5rIHVzaW5nIHRoZSBkaXJlY3Qgc2VydmljZTsgdXNlZCBmb3IgYWN0aW9ucyB0aGF0Ci0gKiAgYXJlIG5vdCBkZXBlbmRhbnQgb24gZHluYW1pYyBwYWdlIHN0YXRlLgotICoKLSAqICBbPGEgaHJlZj0iLi4vLi4vLi4vLi4vLi4vQ29tcG9uZW50UmVmZXJlbmNlL0RpcmVjdExpbmsuaHRtbCI+Q29tcG9uZW50IFJlZmVyZW5jZTwvYT5dCi0gKgotICogQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogQHZlcnNpb24gJElkJAotICoKLSAqKi8KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIERpcmVjdExpbmsgZXh0ZW5kcyBBYnN0cmFjdExpbmtDb21wb25lbnQgaW1wbGVtZW50cyBJRGlyZWN0Ci17Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgSUJpbmRpbmcgZ2V0U3RhdGVmdWxCaW5kaW5nKCk7Ci0gICAgcHVibGljIGFic3RyYWN0IElBY3Rpb25MaXN0ZW5lciBnZXRMaXN0ZW5lcigpOwotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3RhdGVmdWwgcGFyYW1ldGVyIGlzIGJvdW5kIHRvCi0gICAgICogIGEgdHJ1ZSB2YWx1ZS4gIElmIHN0YXRlZnVsIGlzIG5vdCBib3VuZCwgYWxzbyByZXR1cm5zCi0gICAgICogIHRoZSBkZWZhdWx0LCB0cnVlLiAgTWF5IGJlIGludm9rZWQgd2hlbiBub3QgcmVuZGVycmluZy4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBib29sZWFuIGlzU3RhdGVmdWwoKQotICAgIHsKLSAgICAgICAgSUJpbmRpbmcgc3RhdGVmdWxCaW5kaW5nID0gZ2V0U3RhdGVmdWxCaW5kaW5nKCk7Ci0KLSAgICAgICAgaWYgKHN0YXRlZnVsQmluZGluZyA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAgICAgcmV0dXJuIHN0YXRlZnVsQmluZGluZy5nZXRCb29sZWFuKCk7Ci0gICAgfQotCi0gICAgcHVibGljIElMaW5rIGdldExpbmsoSVJlcXVlc3RDeWNsZSBjeWNsZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRMaW5rKGN5Y2xlLCBUYXBlc3RyeS5ESVJFQ1RfU0VSVklDRSwgY29uc3RydWN0U2VydmljZVBhcmFtZXRlcnMoZ2V0UGFyYW1ldGVycygpKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIENvbnZlcnRzIGEgc2VydmljZSBwYXJhbWV0ZXJzIHZhbHVlIHRvIGFuIGFycmF5Ci0gICAgICogIG9mIG9iamVjdHMuICAKLSAgICAgKiAgVGhpcyBpcyB1c2VkIGJ5IHRoZSB7QGxpbmsgRGlyZWN0TGlua30sIHtAbGluayBTZXJ2aWNlTGlua30KLSAgICAgKiAgYW5kIHtAbGluayBFeHRlcm5hbExpbmt9Ci0gICAgICogIGNvbXBvbmVudHMuCi0gICAgICoKLSAgICAgKiAgQHBhcmFtIHBhcmFtZXRlclZhbHVlIHRoZSBpbnB1dCB2YWx1ZSB3aGljaCBtYXkgYmUKLSAgICAgKiAgPHVsPgotICAgICAqICA8bGk+bnVsbCAgKHJldHVybnMgbnVsbCkKLSAgICAgKiAgPGxpPkFuIGFycmF5IG9mIE9iamVjdCAocmV0dXJucyB0aGUgYXJyYXkpCi0gICAgICogIDxsaT5BIHtAbGluayBMaXN0fSAocmV0dXJucyBhbiBhcnJheSBvZiB0aGUgdmFsdWVzIGluIHRoZSBMaXN0fSkKLSAgICAgKiAgPGxpPkEgc2luZ2xlIG9iamVjdCAocmV0dXJucyB0aGUgb2JqZWN0IGFzIGEgc2luZ2xlLWVsZW1lbnQgYXJyYXkpCi0gICAgICogIDwvdWw+Ci0gICAgICogCi0gICAgICogIEByZXR1cm4gQW4gYXJyYXkgcmVwcmVzZW50YXRpb24gb2YgdGhlIGlucHV0IG9iamVjdC4KLSAgICAgKiAKLSAgICAgKiAgQHNpbmNlIDIuMgotICAgICAqKi8KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0W10gY29uc3RydWN0U2VydmljZVBhcmFtZXRlcnMoT2JqZWN0IHBhcmFtZXRlclZhbHVlKQotICAgIHsKLSAgICAgICAgaWYgKHBhcmFtZXRlclZhbHVlID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICBpZiAocGFyYW1ldGVyVmFsdWUgaW5zdGFuY2VvZiBPYmplY3RbXSkKLSAgICAgICAgICAgIHJldHVybiAoT2JqZWN0W10pIHBhcmFtZXRlclZhbHVlOwotCi0gICAgICAgIGlmIChwYXJhbWV0ZXJWYWx1ZSBpbnN0YW5jZW9mIExpc3QpCi0gICAgICAgIHsKLSAgICAgICAgICAgIExpc3QgbGlzdCA9IChMaXN0KSBwYXJhbWV0ZXJWYWx1ZTsKLQotICAgICAgICAgICAgcmV0dXJuIGxpc3QudG9BcnJheSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RbXSB7IHBhcmFtZXRlclZhbHVlIH07Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEludm9rZWQgYnkgdGhlIGRpcmVjdCBzZXJ2aWNlIHRvIHRyaWdnZXIgdGhlIGFwcGxpY2F0aW9uLXNwZWNpZmljCi0gICAgICogIGFjdGlvbiBieSBub3RpZnlpbmcgdGhlIHtAbGluayBJQWN0aW9uTGlzdGVuZXIgbGlzdGVuZXJ9LgotICAgICAqCi0gICAgICogIEB0aHJvd3Mgb3JnLmFwYWNoZS50YXBlc3RyeS5TdGFsZVNlc3Npb25FeGNlcHRpb24gaWYgdGhlIGNvbXBvbmVudCBpcyBzdGF0ZWZ1bCwgYW5kCi0gICAgICogIHRoZSBzZXNzaW9uIGlzIG5ldy4KLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCB0cmlnZ2VyKElSZXF1ZXN0Q3ljbGUgY3ljbGUpCi0gICAgewotICAgICAgICBJQWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBnZXRMaXN0ZW5lcigpOwotICAgICAgICAKLSAgICAgICAgaWYgKGxpc3RlbmVyID09IG51bGwpCi0gICAgICAgIAl0aHJvdyBUYXBlc3RyeS5jcmVhdGVSZXF1aXJlZFBhcmFtZXRlckV4Y2VwdGlvbih0aGlzLCAibGlzdGVuZXIiKTsKLQotICAgICAgICBsaXN0ZW5lci5hY3Rpb25UcmlnZ2VyZWQodGhpcywgY3ljbGUpOwotICAgIH0KLQotICAgIC8qKiBAc2luY2UgMi4yICoqLwotCi0gICAgcHVibGljIGFic3RyYWN0IE9iamVjdCBnZXRQYXJhbWV0ZXJzKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2xpbmsvRGlyZWN0TGluay5qd2MgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvbGluay9EaXJlY3RMaW5rLmp3YwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNhMjE0ZS4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvbGluay9EaXJlY3RMaW5rLmp3YworKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAgCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPCEtLSAkSWQkIC0tPgotPCFET0NUWVBFIGNvbXBvbmVudC1zcGVjaWZpY2F0aW9uIFBVQkxJQyAKLSAgIi0vL0FwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLy9UYXBlc3RyeSBTcGVjaWZpY2F0aW9uIDMuMC8vRU4iIAotICAiaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy90YXBlc3RyeS9kdGQvVGFwZXN0cnlfM18wLmR0ZCI+Ci0gIAotPGNvbXBvbmVudC1zcGVjaWZpY2F0aW9uIGNsYXNzPSJvcmcuYXBhY2hlLnRhcGVzdHJ5LmxpbmsuRGlyZWN0TGluayI+Ci0KLSAgPGRlc2NyaXB0aW9uPgotICBDcmVhdGVzIGEgbm9uLWNvbnRleHR1YWwgbGluay4gIE5vbi1wZXJzaXN0ZW50IHN0YXRlIGNhbiBiZSBzdG9yZWQgd2l0aGluIHRoZSBsaW5rCi0gIHVzaW5nIHRoZSBjb250ZXh0LgotICA8L2Rlc2NyaXB0aW9uPgotCi0gIDxwYXJhbWV0ZXIgbmFtZT0ibGlzdGVuZXIiIAotICAJdHlwZT0ib3JnLmFwYWNoZS50YXBlc3RyeS5JQWN0aW9uTGlzdGVuZXIiIAotICAJcmVxdWlyZWQ9InllcyIKLSAgCWRpcmVjdGlvbj0iYXV0byIvPgotICAJCi0gIDxwYXJhbWV0ZXIgbmFtZT0icGFyYW1ldGVycyIgdHlwZT0iamF2YS5sYW5nLk9iamVjdCIgZGlyZWN0aW9uPSJpbiI+Ci0gICAgPGRlc2NyaXB0aW9uPgotICAgIEFuIG9iamVjdCwgb3IgbGlzdCBvZiBvYmplY3RzLCBlbmNvZGVkIGludG8gdGhlIFVSTAotICAgIGFzIHNlcnZpY2UgcGFyYW1ldGVycy4KLSAgICA8L2Rlc2NyaXB0aW9uPgotICA8L3BhcmFtZXRlcj4KLSAgICAgCi0gIDxwYXJhbWV0ZXIgbmFtZT0ic3RhdGVmdWwiIHR5cGU9ImJvb2xlYW4iIGRpcmVjdGlvbj0iY3VzdG9tIi8+Ci0gIAotICA8cGFyYW1ldGVyIG5hbWU9ImRpc2FibGVkIgotICAJdHlwZT0iYm9vbGVhbiIKLSAgCWRpcmVjdGlvbj0iaW4iLz4KLSAgCSAgCQotICA8cGFyYW1ldGVyIG5hbWU9ImFuY2hvciIgCi0gIAl0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAJZGlyZWN0aW9uPSJpbiIvPgotICAJCi0gIDxwYXJhbWV0ZXIgbmFtZT0icmVuZGVyZXIiCi0gIAl0eXBlPSJvcmcuYXBhY2hlLnRhcGVzdHJ5LmxpbmsuSUxpbmtSZW5kZXJlciIKLSAgCWRpcmVjdGlvbj0iaW4iLz4KLSAgCi0gIDxyZXNlcnZlZC1wYXJhbWV0ZXIgbmFtZT0iaHJlZiIvPgotICAgIAotPC9jb21wb25lbnQtc3BlY2lmaWNhdGlvbj4KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9saW5rL0V4dGVybmFsTGluay5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2xpbmsvRXh0ZXJuYWxMaW5rLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2ZTY5NTguLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2xpbmsvRXh0ZXJuYWxMaW5rLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5saW5rOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVxdWVzdEN5Y2xlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuVGFwZXN0cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5lbmdpbmUuSUxpbms7Ci0KLS8qKgotICogIEEgY29tcG9uZW50IGZvciBjcmVhdGluZyBhIGxpbmsgdG8ge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkuSUV4dGVybmFsUGFnZX0gdXNpbmcgdGhlCi0gKiB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5lbmdpbmUuRXh0ZXJuYWxTZXJ2aWNlfS4KLSAqCi0gKiAgWzxhIGhyZWY9Ii4uLy4uLy4uLy4uLy4uL0NvbXBvbmVudFJlZmVyZW5jZS9FeHRlcm5hbExpbmsuaHRtbCI+Q29tcG9uZW50IFJlZmVyZW5jZTwvYT5dCi0gKgotICogQHNlZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LklFeHRlcm5hbFBhZ2UKLSAqIEBzZWUgb3JnLmFwYWNoZS50YXBlc3RyeS5lbmdpbmUuRXh0ZXJuYWxTZXJ2aWNlCi0gKgotICogQGF1dGhvciBNYWxjb2xtIEVkZ2FyCi0gKiBAdmVyc2lvbiAkSWQkCi0gKgotICoqLwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRXh0ZXJuYWxMaW5rIGV4dGVuZHMgQWJzdHJhY3RMaW5rQ29tcG9uZW50Ci17Ci0gICAgcHVibGljIElMaW5rIGdldExpbmsoSVJlcXVlc3RDeWNsZSBjeWNsZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRMaW5rKGN5Y2xlLCBUYXBlc3RyeS5FWFRFUk5BTF9TRVJWSUNFLCBnZXRTZXJ2aWNlUGFyYW1ldGVycygpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE9iamVjdFtdIGdldFNlcnZpY2VQYXJhbWV0ZXJzKCkKLSAgICB7Ci0gICAgICAgIE9iamVjdFtdIHBhZ2VQYXJhbWV0ZXJzID0gRGlyZWN0TGluay5jb25zdHJ1Y3RTZXJ2aWNlUGFyYW1ldGVycyhnZXRQYXJhbWV0ZXJzKCkpOwotICAgICAgICBTdHJpbmcgdGFyZ2V0UGFnZSA9IGdldFRhcmdldFBhZ2UoKTsKLQotICAgICAgICBpZiAocGFnZVBhcmFtZXRlcnMgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBuZXcgT2JqZWN0W10geyB0YXJnZXRQYWdlIH07Ci0KLSAgICAgICAgT2JqZWN0W10gcGFyYW1ldGVycyA9IG5ldyBPYmplY3RbcGFnZVBhcmFtZXRlcnMubGVuZ3RoICsgMV07Ci0KLSAgICAgICAgcGFyYW1ldGVyc1swXSA9IHRhcmdldFBhZ2U7Ci0KLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShwYWdlUGFyYW1ldGVycywgMCwgcGFyYW1ldGVycywgMSwgcGFnZVBhcmFtZXRlcnMubGVuZ3RoKTsKLQotICAgICAgICByZXR1cm4gcGFyYW1ldGVyczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgT2JqZWN0IGdldFBhcmFtZXRlcnMoKTsKLQotICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0VGFyZ2V0UGFnZSgpOwotfQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2xpbmsvRXh0ZXJuYWxMaW5rLmp3YyBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9saW5rL0V4dGVybmFsTGluay5qd2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxYjMxZTUuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2xpbmsvRXh0ZXJuYWxMaW5rLmp3YworKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAgCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPCEtLSAkSWQkIC0tPgotPCFET0NUWVBFIGNvbXBvbmVudC1zcGVjaWZpY2F0aW9uIFBVQkxJQyAKLSAgIi0vL0FwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLy9UYXBlc3RyeSBTcGVjaWZpY2F0aW9uIDMuMC8vRU4iIAotICAiaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy90YXBlc3RyeS9kdGQvVGFwZXN0cnlfM18wLmR0ZCI+Ci0gIAotPGNvbXBvbmVudC1zcGVjaWZpY2F0aW9uIGNsYXNzPSJvcmcuYXBhY2hlLnRhcGVzdHJ5LmxpbmsuRXh0ZXJuYWxMaW5rIj4KLQotICA8ZGVzY3JpcHRpb24+Q3JlYXRlcyBhIElFeHRlcm5hbFBhZ2UgbGluay48L2Rlc2NyaXB0aW9uPgotCi0gIDxwYXJhbWV0ZXIgbmFtZT0icGFnZSIgCi0gIAl0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIiAKLSAgCXJlcXVpcmVkPSJ5ZXMiIAotICAJcHJvcGVydHktbmFtZT0idGFyZ2V0UGFnZSIKLSAgCWRpcmVjdGlvbj0iaW4iLz4KLQotICA8cGFyYW1ldGVyIG5hbWU9InBhcmFtZXRlcnMiIHR5cGU9ImphdmEubGFuZy5PYmplY3QiIGRpcmVjdGlvbj0iaW4iPgotICAgIDxkZXNjcmlwdGlvbj4KLSAgICBBbiBvYmplY3QsIG9yIGxpc3Qgb2Ygb2JqZWN0cywgZW5jb2RlZCBpbnRvIHRoZSBVUkwKLSAgICBhcyBzZXJ2aWNlIHBhcmFtZXRlcnMuCi0gICAgPC9kZXNjcmlwdGlvbj4KLSAgPC9wYXJhbWV0ZXI+Ci0gIAotICA8cGFyYW1ldGVyIG5hbWU9ImRpc2FibGVkIgotICAJdHlwZT0iYm9vbGVhbiIKLSAgCWRpcmVjdGlvbj0iaW4iLz4KLSAgCSAgCQotICA8cGFyYW1ldGVyIG5hbWU9ImFuY2hvciIgCi0gIAl0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAJZGlyZWN0aW9uPSJpbiIvPgotICAJCi0gIDxwYXJhbWV0ZXIgbmFtZT0icmVuZGVyZXIiCi0gIAl0eXBlPSJvcmcuYXBhY2hlLnRhcGVzdHJ5LmxpbmsuSUxpbmtSZW5kZXJlciIKLSAgCWRpcmVjdGlvbj0iaW4iLz4KLSAgCQotICA8cmVzZXJ2ZWQtcGFyYW1ldGVyIG5hbWU9ImhyZWYiLz4KLSAgICAKLTwvY29tcG9uZW50LXNwZWNpZmljYXRpb24+CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvbGluay9HZW5lcmljTGluay5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2xpbmsvR2VuZXJpY0xpbmsuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M0MmY2YS4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvbGluay9HZW5lcmljTGluay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkubGluazsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlcXVlc3RDeWNsZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmVuZ2luZS5JTGluazsKLQotLyoqCi0gKiAgQW4gaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkuY29tcG9uZW50cy5JTGlua0NvbXBvbmVudH0gCi0gKiAgdGhhdCBhbGxvd3MKLSAqICB0aGUgZXhhY3QgSFJFRiB0byBiZSBzcGVjaWZpZWQsIHVzdWFsbHkgdXNlZCBmb3IgY2xpZW50IHNpZGUKLSAqICBzY3JpcHRpbmcuICAKLSAqIAotICogIFs8YSBocmVmPSIuLi8uLi8uLi8uLi8uLi9Db21wb25lbnRSZWZlcmVuY2UvR2VuZXJpY0xpbmsuaHRtbCI+Q29tcG9uZW50IFJlZmVyZW5jZTwvYT5dCi0gKiAKLSAqCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogIEB2ZXJzaW9uICRJZCQKLSAqICBAc2luY2UgMi4wLjIKLSAqIAotICoqLwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgR2VuZXJpY0xpbmsgZXh0ZW5kcyBBYnN0cmFjdExpbmtDb21wb25lbnQKLXsKLSAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldEhyZWYoKTsKLQotICAgIHB1YmxpYyBJTGluayBnZXRMaW5rKElSZXF1ZXN0Q3ljbGUgY3ljbGUpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IFN0YXRpY0xpbmsoZ2V0SHJlZigpKTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2xpbmsvR2VuZXJpY0xpbmsuandjIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2xpbmsvR2VuZXJpY0xpbmsuandjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTMzMTMwLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9saW5rL0dlbmVyaWNMaW5rLmp3YworKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAgCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPCEtLSAkSWQkIC0tPgotPCFET0NUWVBFIGNvbXBvbmVudC1zcGVjaWZpY2F0aW9uIFBVQkxJQyAKLSAgIi0vL0FwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLy9UYXBlc3RyeSBTcGVjaWZpY2F0aW9uIDMuMC8vRU4iIAotICAiaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy90YXBlc3RyeS9kdGQvVGFwZXN0cnlfM18wLmR0ZCI+Ci0gIAotPGNvbXBvbmVudC1zcGVjaWZpY2F0aW9uIGNsYXNzPSJvcmcuYXBhY2hlLnRhcGVzdHJ5LmxpbmsuR2VuZXJpY0xpbmsiPgotCi0gIDxkZXNjcmlwdGlvbj4KLSAgQ3JlYXRlcyBhIGxpbmsgdG8gYW4gYXBwbGljYXRpb24gc3BlY2lmaWVkIFVSTC4KLSAgPC9kZXNjcmlwdGlvbj4KLSAgCi0gIDxwYXJhbWV0ZXIgbmFtZT0iaHJlZiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgcmVxdWlyZWQ9InllcyIgZGlyZWN0aW9uPSJpbiIvPgotCi0gIDxwYXJhbWV0ZXIgbmFtZT0iZGlzYWJsZWQiCi0gIAl0eXBlPSJib29sZWFuIgotICAJZGlyZWN0aW9uPSJpbiIvPgotICAJICAJCi0gIDxwYXJhbWV0ZXIgbmFtZT0iYW5jaG9yIiAKLSAgCXR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gIAlkaXJlY3Rpb249ImluIi8+Ci0gIAkKLSAgPHBhcmFtZXRlciBuYW1lPSJyZW5kZXJlciIKLSAgCXR5cGU9Im9yZy5hcGFjaGUudGFwZXN0cnkubGluay5JTGlua1JlbmRlcmVyIgotICAJZGlyZWN0aW9uPSJpbiIvPgotICAKLTwvY29tcG9uZW50LXNwZWNpZmljYXRpb24+CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvbGluay9JTGlua1JlbmRlcmVyLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvbGluay9JTGlua1JlbmRlcmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0ZDEzMDkuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2xpbmsvSUxpbmtSZW5kZXJlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkubGluazsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSU1hcmt1cFdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZXF1ZXN0Q3ljbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5jb21wb25lbnRzLklMaW5rQ29tcG9uZW50OwotCi0vKioKLSAqICBVc2VkIGJ5IHZhcmlvdXMgaW5zdGFuY2VzIG9mIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbXBvbmVudHMuSUxpbmtDb21wb25lbnR9IHRvCi0gKiAgYWN0dWFsbHkgcmVuZGVyZXIgYSBsaW5rLiAgSW1wbGVtZW50YXRpb25zIG9mIHRoZSBpbnRlcmZhY2UgY2FuIG1hbmlwdWxhdGUKLSAqICBzb21lIG9mIHRoZSBkZXRhaWxzIG9mIGhvdyB0aGUgbGluayBpcyB3cml0dGVuLgotICogCi0gKiAgPHA+Ci0gKiAgQSBsaW5rIHJlbmRlcmVkIG1heSBiZSB1c2VkIGluIG1hbnkgdGhyZWFkcywgYW5kIG11c3QgYmUgdGhyZWFkc2FmZS4KLSAqCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogIEB2ZXJzaW9uICRJZCQKLSAqICBAc2luY2UgMy4wCi0gKiAKLSAqKi8KLQotcHVibGljIGludGVyZmFjZSBJTGlua1JlbmRlcmVyCi17Ci0gICAgLyoqCi0gICAgICogIFJlbmRlcnMgdGhlIGxpbmssIHRha2luZyBpbnRvIGFjY291bnQgd2hldGhlciB0aGUgbGluayBpcwotICAgICAqICB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5jb21wb25lbnRzLklMaW5rQ29tcG9uZW50I2lzRGlzYWJsZWQoKSBkaXNhYmxlZH0uCi0gICAgICogIFRoaXMgaXMgY29tcGxpY2F0ZWQgYnkgdGhlIGZhY3QgdGhhdCB0aGUgcmVuZGVyaW5nIG9mIHRoZSBib2R5IG11c3QgYmUgZG9uZQotICAgICAqICB3aXRoaW4gYSBuZXN0ZWQgd3JpdGVyLCBzaW5jZSB0aGUgTGluayBjb21wb25lbnQgd2lsbCBub3QgcmVuZGVyIGl0cyB0YWcKLSAgICAgKiAgdW50aWwgYWZ0ZXIgaXRzIGJvZHkgcmVuZGVycyAodG8gYWxsb3cgZm9yIGFueSB3cmFwcGVkIGNvbXBvbmVudHMgdGhhdCBuZWVkCi0gICAgICogIHRvIHdyaXRlIGV2ZW50IGhhbmRsZXJzIGZvciB0aGUgbGluaykuCi0gICAgICogCi0gICAgICogIDxwPgotICAgICAqICBUaGUgcmVuZGVyZXIgaXMgZXhwZWN0ZWQgdG8gY2FsbCBiYWNrIGludG8gdGhlIGxpbmsgY29tcG9uZW50IHRvIGhhbmRsZQotICAgICAqICBhbnkgaW5mb3JtYWwgcGFyYW1ldGVycywgYW5kIHRvIGhhbmRsZSBldmVudHMgb3V0cHV0LgotICAgICAqIAotICAgICAqIAotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIHJlbmRlckxpbmsoSU1hcmt1cFdyaXRlciB3cml0ZXIsIElSZXF1ZXN0Q3ljbGUgY3ljbGUsIElMaW5rQ29tcG9uZW50IGxpbmtDb21wb25lbnQpOwotCi19CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvbGluay9QYWdlTGluay5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2xpbmsvUGFnZUxpbmsuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU3Njc4NS4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvbGluay9QYWdlTGluay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkubGluazsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZXF1ZXN0Q3ljbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5UYXBlc3RyeTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmVuZ2luZS5JTGluazsKLQotLyoqCi0gKiAgQSBjb21wb25lbnQgZm9yIGNyZWF0aW5nIGEgbmF2aWdhdGlvbiBsaW5rIHRvIGFub3RoZXIgcGFnZSwgCi0gKiAgdXNpbmcgdGhlIHBhZ2Ugc2VydmljZS4KLSAqCi0gKiAgWzxhIGhyZWY9Ii4uLy4uLy4uLy4uLy4uL0NvbXBvbmVudFJlZmVyZW5jZS9QYWdlTGluay5odG1sIj5Db21wb25lbnQgUmVmZXJlbmNlPC9hPl0KLSAqCi0gKiBAYXV0aG9yIEhvd2FyZCBTaGlwCi0gKiBAdmVyc2lvbiAkSWQkCi0gKgotICoqLwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUGFnZUxpbmsgZXh0ZW5kcyBBYnN0cmFjdExpbmtDb21wb25lbnQKLXsKLSAgICBwdWJsaWMgSUxpbmsgZ2V0TGluayhJUmVxdWVzdEN5Y2xlIGN5Y2xlKQotICAgIHsKLSAgICAgICAgU3RyaW5nIHBhcmFtZXRlciA9IG51bGw7Ci0gICAgICAgIElOYW1lc3BhY2UgbmFtZXNwYWNlID0gZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgIFN0cmluZyB0YXJnZXRQYWdlID0gZ2V0VGFyZ2V0UGFnZSgpOwotCi0gICAgICAgIGlmIChuYW1lc3BhY2UgPT0gbnVsbCkKLSAgICAgICAgICAgIHBhcmFtZXRlciA9IHRhcmdldFBhZ2U7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHBhcmFtZXRlciA9IG5hbWVzcGFjZS5jb25zdHJ1Y3RRdWFsaWZpZWROYW1lKHRhcmdldFBhZ2UpOwotCi0gICAgICAgIHJldHVybiBnZXRMaW5rKGN5Y2xlLCBUYXBlc3RyeS5QQUdFX1NFUlZJQ0UsIG5ldyBTdHJpbmdbXSB7IHBhcmFtZXRlciB9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFRhcmdldFBhZ2UoKTsKLQotICAgIC8qKiBAc2luY2UgMi4yICoqLwotCi0gICAgcHVibGljIGFic3RyYWN0IElOYW1lc3BhY2UgZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2xpbmsvUGFnZUxpbmsuandjIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2xpbmsvUGFnZUxpbmsuandjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTA3MjM3Li4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9saW5rL1BhZ2VMaW5rLmp3YworKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAgCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPCEtLSAkSWQkIC0tPgotPCFET0NUWVBFIGNvbXBvbmVudC1zcGVjaWZpY2F0aW9uIFBVQkxJQyAKLSAgIi0vL0FwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLy9UYXBlc3RyeSBTcGVjaWZpY2F0aW9uIDMuMC8vRU4iIAotICAiaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy90YXBlc3RyeS9kdGQvVGFwZXN0cnlfM18wLmR0ZCI+Ci0JCi08Y29tcG9uZW50LXNwZWNpZmljYXRpb24gY2xhc3M9Im9yZy5hcGFjaGUudGFwZXN0cnkubGluay5QYWdlTGluayI+Ci0KLSAgPGRlc2NyaXB0aW9uPgotICBDcmVhdGVzIGEgbGluayB0byBhbm90aGVyIHBhZ2Ugd2l0aGluIHRoZSBhcHBsaWNhdGlvbi4KLSAgPC9kZXNjcmlwdGlvbj4KLSAgCi0gIDxwYXJhbWV0ZXIgbmFtZT0icGFnZSIgCi0gIAl0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIiAKLSAgCXJlcXVpcmVkPSJ5ZXMiIAotICAJcHJvcGVydHktbmFtZT0idGFyZ2V0UGFnZSIKLSAgCWRpcmVjdGlvbj0iaW4iLz4KLSAgCi0gIDxwYXJhbWV0ZXIgbmFtZT0ibmFtZXNwYWNlIiAKLSAgCXR5cGU9Im9yZy5hcGFjaGUudGFwZXN0cnkuSU5hbWVzcGFjZSIgCi0gIAlyZXF1aXJlZD0ibm8iIAotICAJcHJvcGVydHktbmFtZT0idGFyZ2V0TmFtZXNwYWNlIgotICAJZGlyZWN0aW9uPSJpbiIvPgotICAJICAJCi0gIDxwYXJhbWV0ZXIgbmFtZT0iZGlzYWJsZWQiCi0gIAl0eXBlPSJib29sZWFuIgotICAJZGlyZWN0aW9uPSJpbiIvPgotICAJICAJCi0gIDxwYXJhbWV0ZXIgbmFtZT0iYW5jaG9yIiAKLSAgCXR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gIAlkaXJlY3Rpb249ImluIi8+Ci0gIAkKLSAgPHBhcmFtZXRlciBuYW1lPSJyZW5kZXJlciIKLSAgCXR5cGU9Im9yZy5hcGFjaGUudGFwZXN0cnkubGluay5JTGlua1JlbmRlcmVyIgotICAJZGlyZWN0aW9uPSJpbiIvPgotICAKLSAgPHJlc2VydmVkLXBhcmFtZXRlciBuYW1lPSJocmVmIi8+Ci0KLTwvY29tcG9uZW50LXNwZWNpZmljYXRpb24+CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvbGluay9TZXJ2aWNlTGluay5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2xpbmsvU2VydmljZUxpbmsuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYzNzhhNS4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvbGluay9TZXJ2aWNlTGluay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkubGluazsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlcXVlc3RDeWNsZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmVuZ2luZS5JTGluazsKLQotLyoqCi0gKiAgQSBjb21wb25lbnQgZm9yIGNyZWF0aW5nIGEgbGluayBmb3IgYW4gYXJiaXRyYXJ5IHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LmVuZ2luZS5JRW5naW5lU2VydmljZQotICogIGVuZ2luZSBzZXJ2aWNlfS4gIEEgU2VydmljZUxpbmsgY29tcG9uZW50IGNhbiBlbXVsYXRlIGFuIHtAbGluayBBY3Rpb25MaW5rfSwKLSAqICB7QGxpbmsgUGFnZUxpbmt9IG9yIHtAbGluayBEaXJlY3RMaW5rfSBjb21wb25lbnQsIGJ1dCBpcyBtb3N0IG9mdGVuIHVzZWQgaW4KLSAqICBjb25qdW5jdGlvbiB3aXRoIGFuIGFwcGxpY2F0aW9uLXNwZWNpZmljIHNlcnZpY2UuICAKLSAqCi0gKiAgWzxhIGhyZWY9Ii4uLy4uLy4uLy4uLy4uL0NvbXBvbmVudFJlZmVyZW5jZS9TZXJ2aWNlTGluay5odG1sIj5Db21wb25lbnQgUmVmZXJlbmNlPC9hPl0KLSAqCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogIEB2ZXJzaW9uICRJZCQKLSAqCi0gKiovCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTZXJ2aWNlTGluayBleHRlbmRzIEFic3RyYWN0TGlua0NvbXBvbmVudAotewotICAgIHB1YmxpYyBJTGluayBnZXRMaW5rKElSZXF1ZXN0Q3ljbGUgY3ljbGUpCi0gICAgewotICAgICAgICBPYmplY3RbXSBwYXJhbWV0ZXJzID0gRGlyZWN0TGluay5jb25zdHJ1Y3RTZXJ2aWNlUGFyYW1ldGVycyhnZXRQYXJhbWV0ZXJzKCkpOwotCi0gICAgICAgIHJldHVybiBnZXRMaW5rKGN5Y2xlLCBnZXRTZXJ2aWNlKCksIHBhcmFtZXRlcnMpOwotICAgIH0KLQotICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0U2VydmljZSgpOwotCi0gICAgcHVibGljIGFic3RyYWN0IE9iamVjdCBnZXRQYXJhbWV0ZXJzKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2xpbmsvU2VydmljZUxpbmsuandjIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2xpbmsvU2VydmljZUxpbmsuandjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmMyMDQ3Li4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9saW5rL1NlcnZpY2VMaW5rLmp3YworKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAgCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPCEtLSAkSWQkIC0tPgotPCFET0NUWVBFIGNvbXBvbmVudC1zcGVjaWZpY2F0aW9uIFBVQkxJQyAKLSAgIi0vL0FwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLy9UYXBlc3RyeSBTcGVjaWZpY2F0aW9uIDMuMC8vRU4iIAotICAiaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy90YXBlc3RyeS9kdGQvVGFwZXN0cnlfM18wLmR0ZCI+Ci0JCi08Y29tcG9uZW50LXNwZWNpZmljYXRpb24gY2xhc3M9Im9yZy5hcGFjaGUudGFwZXN0cnkubGluay5TZXJ2aWNlTGluayI+Ci0KLSAgPGRlc2NyaXB0aW9uPgotICBDcmVhdGVzIGEgbGluayB1c2luZyBhbiBhcmJpdHJhcnkgZW5naW5lIHNlcnZpY2UuCi0gIDwvZGVzY3JpcHRpb24+Ci0gIAotICA8cGFyYW1ldGVyIG5hbWU9InNlcnZpY2UiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciIHJlcXVpcmVkPSJ5ZXMiIGRpcmVjdGlvbj0iaW4iLz4KLQotICA8cGFyYW1ldGVyIG5hbWU9InBhcmFtZXRlcnMiIHR5cGU9ImphdmEubGFuZy5PYmplY3QiIGRpcmVjdGlvbj0iaW4iPgotICAgIDxkZXNjcmlwdGlvbj4KLSAgICBBIG9iamVjdCBvciBzdHJpbmcsIG9yIGFycmF5IG9mIG9iamVjdHMgYW5kIHN0cmluZ3MsIGVuY29kZWQgaW50byB0aGUgVVJMCi0gICAgYXMgc2VydmljZSBwYXJhbWV0ZXJzLgotICAgIDwvZGVzY3JpcHRpb24+Ci0gIDwvcGFyYW1ldGVyPgotCi0gIDxwYXJhbWV0ZXIgbmFtZT0iZGlzYWJsZWQiCi0gIAl0eXBlPSJib29sZWFuIgotICAJZGlyZWN0aW9uPSJpbiIvPgotICAJICAJCi0gIDxwYXJhbWV0ZXIgbmFtZT0iYW5jaG9yIiAKLSAgCXR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gIAlkaXJlY3Rpb249ImluIi8+Ci0gIAkKLSAgPHBhcmFtZXRlciBuYW1lPSJyZW5kZXJlciIKLSAgCXR5cGU9Im9yZy5hcGFjaGUudGFwZXN0cnkubGluay5JTGlua1JlbmRlcmVyIgotICAJZGlyZWN0aW9uPSJpbiIvPgotCi0gIDxyZXNlcnZlZC1wYXJhbWV0ZXIgbmFtZT0iaHJlZiIvPgotICAKLTwvY29tcG9uZW50LXNwZWNpZmljYXRpb24+CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvbGluay9TdGF0aWNMaW5rLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvbGluay9TdGF0aWNMaW5rLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlZTA4MzYuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2xpbmsvU3RhdGljTGluay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkubGluazsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuZW5naW5lLklMaW5rOwotCi0vKioKLSAqICBVc2VkIGJ5IHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LmxpbmsuR2VuZXJpY0xpbmt9IHRvIHJlcHJlc2VudAotICogIGFuIGV4dGVybmFsLCBzdGF0aWMgVVJMLgotICoKLSAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiAgQHZlcnNpb24gJElkJAotICogIEBzaW5jZSAzLjAKLSAqIAotICoqLwotcHVibGljIGNsYXNzIFN0YXRpY0xpbmsgaW1wbGVtZW50cyBJTGluawotewotCXByaXZhdGUgU3RyaW5nIF91cmw7Ci0KLQlwdWJsaWMgU3RhdGljTGluayhTdHJpbmcgdXJsKQotCXsKLQkJX3VybCA9IHVybDsKLQl9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFVSTCgpCi0gICAgewotICAgICAgICByZXR1cm4gX3VybDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFVSTChTdHJpbmcgYW5jaG9yLCBib29sZWFuIGluY2x1ZGVQYXJhbWV0ZXJzKQotICAgIHsKLSAgICAgICAgaWYgKGFuY2hvciA9PSBudWxsKQotICAgICAgICAJcmV0dXJuIF91cmw7Ci0gICAgICAgIAkKLSAgICAgICAgCXJldHVybiBfdXJsICsgIiMiICsgYW5jaG9yOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWJzb2x1dGVVUkwoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF91cmw7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBYnNvbHV0ZVVSTCgKLSAgICAgICAgU3RyaW5nIHNjaGVtZSwKLSAgICAgICAgU3RyaW5nIHNlcnZlciwKLSAgICAgICAgaW50IHBvcnQsCi0gICAgICAgIFN0cmluZyBhbmNob3IsCi0gICAgICAgIGJvb2xlYW4gaW5jbHVkZVBhcmFtZXRlcnMpCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0VVJMKGFuY2hvciwgZmFsc2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRQYXJhbWV0ZXJOYW1lcygpCi0gICAgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0UGFyYW1ldGVyVmFsdWVzKFN0cmluZyBuYW1lKQotICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2xpbmsvcGFja2FnZS5odG1sIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2xpbmsvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Yzk5ZDdmLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9saW5rL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLTwhZG9jdHlwZSBodG1sIHB1YmxpYyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci08IS0tICRJZCQgLS0+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlRhcGVzdHJ5OiBXZWIgQXBwbGljYXRpb24gRnJhbWV3b3JrPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotCi08cD5Db21wb25lbnRzIGZvciBjcmVhdGluZyBsaW5rcyBvbiB0aGUgcGFnZSB0aGF0IHRyaWdnZXIgYXBwbGljYXRpb24gYmVoYXZpb3IKLXdoZW4gY2xpY2tlZC4gIFRoZXNlIGxpbmtzIGFyZSBjb21wYXRpYmxlIHdpdGggSFRNTCBhbmQgV01MICh0aGV5Ci11c2UgdGhlIGJhc2ljICZsdDthJmd0OyBlbGVtZW50KS4KLQotPHA+RWFjaCBjb21wb25lbnQgaXMgcmVsYXRlZCB0byBhIGRpZmZlcmVudCAKLXtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LmVuZ2luZS5JRW5naW5lU2VydmljZX0sIGV4Y2VwdCBmb3Ige0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkubGluay5TZXJ2aWNlTGlua30KLXdoaWNoIGlzIHBhcmFtZXRlcml6ZWQgdG8gdXNlIGFueSBvZiB0aGUgYXZhaWxhYmxlIHNlcnZpY2VzIC4uLiB3aGljaCBpcyB1c2VmdWwgd2l0aAotYXBwbGljYXRpb25zIHRoYXQgZGVmaW5lIHRoZWlyIG93biBzZXJ2aWNlcy4KLQotPHA+TGluayBjb21wb25lbnRzIGhhdmUgYSBzZWNvbmQgZnVuY3Rpb24sIHRvIHByb3ZpZGUgZXZlbnQgaGFuZGxpbmcgc3VwcG9ydCB0byB0aGUgCi1jb21wb25lbnRzIHRoZXkgd3JhcC4gIFRoaXMgaXMgaG93IGEge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkuaHRtbC5Sb2xsb3Zlcn0gY29tcG9uZW50IG1hbmFnZXMKLXRvIGluY2x1ZGUgREhUTUwgYW5kIEphdmFTY3JpcHQgdGhhdCBwcmVsb2FkcyB0aGUgaW1hZ2VzIGFuZCBjaGFuZ2VzIHRoZSBkaXNwbGF5ZWQgaW1hZ2UgYXMgdGhlCi1tb3VzZSBlbnRlcnMgYW5kIGV4aXRzIHRoZSAiaG90IiBhcmVhIGRlZmluZWQgYnkgdGhlIGxpbmsuCi0KLUBhdXRob3IgSG93YXJkIExld2lzIFNoaXAgPGEgaHJlZj0ibWFpbHRvOmhsc2hpcEBhcGFjaGUub3JnIj5obHNoaXBAYXBhY2hlLm9yZzwvYT4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2xpc3RlbmVyL0xpc3RlbmVyTWFwLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvbGlzdGVuZXIvTGlzdGVuZXJNYXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI1ODE4OC4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvbGlzdGVuZXIvTGlzdGVuZXJNYXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxOSArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5saXN0ZW5lcjsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb2dubC5PZ25sUnVudGltZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUFjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUNvbXBvbmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZXF1ZXN0Q3ljbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5UYXBlc3RyeTsKLQotLyoqCi0gKiAgTWFwcyBhIGNsYXNzIHRvIGEgc2V0IG9mIGxpc3RlbmVycyBiYXNlZCBvbiB0aGUgcHVibGljIG1ldGhvZHMgb2YgdGhlIGNsYXNzLgotICogIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5Lmxpc3RlbmVyLkxpc3RlbmVyTWFwUHJvcGVydHlBY2Nlc3Nvcn0gaXMgc2V0dXAKLSAqICB0byBwcm92aWRlIHRoZXNlIG1ldGhvZHMgYXMgbmFtZWQgcHJvcGVydGllcyBvZiB0aGUgTGlzdGVuZXJNYXAuCi0gKgotICogIEBhdXRob3IgSG93YXJkIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQHNpbmNlIDEuMC4yCi0gKiAKLSAqKi8KLQotcHVibGljIGNsYXNzIExpc3RlbmVyTWFwCi17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIExPRyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKExpc3RlbmVyTWFwLmNsYXNzKTsKLQotICAgIHN0YXRpYyB7Ci0gICAgICAgIE9nbmxSdW50aW1lLnNldFByb3BlcnR5QWNjZXNzb3IoTGlzdGVuZXJNYXAuY2xhc3MsIG5ldyBMaXN0ZW5lck1hcFByb3BlcnR5QWNjZXNzb3IoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBPYmplY3QgX3RhcmdldDsKLQotICAgIC8qKgotICAgICAqICBBIHtAbGluayBNYXB9IG9mIHJlbGV2YW50IHtAbGluayBNZXRob2R9cywga2V5ZWQgb24gbWV0aG9kIG5hbWUuCi0gICAgICogIFRoaXMgaXMganVzdCB0aGUgcHVibGljIHZvaWQgbWV0aG9kcyB0aGF0IHRha2UgYW4ge0BsaW5rIElSZXF1ZXN0Q3ljbGV9Ci0gICAgICogIGFuZCB0aHJvdyBub3RoaW5nIG9yIGp1c3Qge0BsaW5rIEFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbn0uCi0gICAgICovCi0KLSAgICBwcml2YXRlIE1hcCBfbWV0aG9kTWFwOwotCi0gICAgLyoqCi0gICAgICogQSB7QGxpbmsgTWFwfSBvZiBjYWNoZWQgbGlzdGVuZXIgaW5zdGFuY2VzLCBrZXllZCBvbiBtZXRob2QgbmFtZQotICAgICAqCi0gICAgICoqLwotCi0gICAgcHJpdmF0ZSBNYXAgX2xpc3RlbmVyQ2FjaGUgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgLyoqCi0gICAgICogQSB7QGxpbmsgTWFwfSwga2V5ZWQgb24gQ2xhc3MsIG9mIHtAbGluayBNYXB9IC4uLiB0aGUgbWV0aG9kIG1hcAotICAgICAqIGZvciBhbnkgcGFydGljdWxhciBpbnN0YW5jZSBvZiB0aGUgZ2l2ZW4gY2xhc3MuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwcml2YXRlIHN0YXRpYyBNYXAgX2NsYXNzTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotICAgIC8qKgotICAgICAqICBJbXBsZW1lbnRzIGJvdGggbGlzdGVuZXIgaW50ZXJmYWNlcy4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHByaXZhdGUgY2xhc3MgU3ludGhldGljTGlzdGVuZXIgaW1wbGVtZW50cyBJQWN0aW9uTGlzdGVuZXIKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgTWV0aG9kIF9tZXRob2Q7Ci0KLSAgICAgICAgU3ludGhldGljTGlzdGVuZXIoTWV0aG9kIG1ldGhvZCkKLSAgICAgICAgewotICAgICAgICAgICAgX21ldGhvZCA9IG1ldGhvZDsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBpbnZva2UoSVJlcXVlc3RDeWNsZSBjeWNsZSkKLSAgICAgICAgewotICAgICAgICAgICAgT2JqZWN0W10gYXJncyA9IG5ldyBPYmplY3RbXSB7IGN5Y2xlIH07Ci0KLSAgICAgICAgICAgIGludm9rZVRhcmdldE1ldGhvZChfdGFyZ2V0LCBfbWV0aG9kLCBhcmdzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblRyaWdnZXJlZChJQ29tcG9uZW50IGNvbXBvbmVudCwgSVJlcXVlc3RDeWNsZSBjeWNsZSkKLSAgICAgICAgewotICAgICAgICAgICAgaW52b2tlKGN5Y2xlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigiU3ludGhldGljTGlzdGVuZXJbIik7Ci0KLSAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoX3RhcmdldCk7Ci0gICAgICAgICAgICBidWZmZXIuYXBwZW5kKCcgJyk7Ci0gICAgICAgICAgICBidWZmZXIuYXBwZW5kKF9tZXRob2QpOwotICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgnXScpOwotCi0gICAgICAgICAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0ZW5lck1hcChPYmplY3QgdGFyZ2V0KQotICAgIHsKLSAgICAgICAgX3RhcmdldCA9IHRhcmdldDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgR2V0cyBhIGxpc3RlbmVyIGZvciB0aGUgZ2l2ZW4gbmFtZSAod2hpY2ggaXMgYm90aCBhIHByb3BlcnR5IG5hbWUKLSAgICAgKiAgYW5kIGEgbWV0aG9kIG5hbWUpLiAgVGhlIGxpc3RlbmVyIGlzIGNyZWF0ZWQgYXMgbmVlZGVkLCBidXQgaXMKLSAgICAgKiAgYWxzbyBjYWNoZWQgZm9yIGxhdGVyIHVzZS4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uIGlmIHRoZSBsaXN0ZW5lciBjYW4gbm90IGJlIGNyZWF0ZWQuCi0gICAgICoqLwotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBPYmplY3QgZ2V0TGlzdGVuZXIoU3RyaW5nIG5hbWUpCi0gICAgewotICAgICAgICBPYmplY3QgbGlzdGVuZXIgPSBudWxsOwotCi0gICAgICAgIGxpc3RlbmVyID0gX2xpc3RlbmVyQ2FjaGUuZ2V0KG5hbWUpOwotCi0gICAgICAgIGlmIChsaXN0ZW5lciA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBsaXN0ZW5lciA9IGNyZWF0ZUxpc3RlbmVyKG5hbWUpOwotCi0gICAgICAgICAgICBfbGlzdGVuZXJDYWNoZS5wdXQobmFtZSwgbGlzdGVuZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGxpc3RlbmVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIGFuIG9iamVjdCB0aGF0IGltcGxlbWVudHMge0BsaW5rIElBY3Rpb25MaXN0ZW5lcn0uCi0gICAgICogIFRoaXMgaW52b2x2ZXMgbG9va2luZyB1cCB0aGUgbWV0aG9kIGJ5IG5hbWUgYW5kIGRldGVybWluaW5nIHdoaWNoCi0gICAgICogIGlubmVyIGNsYXNzIHRvIGNyZWF0ZS4KLSAgICAgKiovCi0KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCBPYmplY3QgY3JlYXRlTGlzdGVuZXIoU3RyaW5nIG5hbWUpCi0gICAgewotICAgICAgICBpZiAoX21ldGhvZE1hcCA9PSBudWxsKQotICAgICAgICAgICAgZ2V0TWV0aG9kTWFwKCk7Ci0KLSAgICAgICAgTWV0aG9kIG1ldGhvZCA9IChNZXRob2QpIF9tZXRob2RNYXAuZ2V0KG5hbWUpOwotCi0gICAgICAgIGlmIChtZXRob2QgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgVGFwZXN0cnkuZm9ybWF0KCJMaXN0ZW5lck1hcC5vYmplY3QtbWlzc2luZy1tZXRob2QiLCBfdGFyZ2V0LCBuYW1lKSk7Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBTeW50aGV0aWNMaXN0ZW5lcihtZXRob2QpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBHZXRzIHRoZSBtZXRob2QgbWFwIGZvciB0aGUgY3VycmVudCBpbnN0YW5jZS4gIElmIG5lY2Vzc2FyeSwgaXQgaXMgY29uc3RydWN0ZWQgYW5kIGNhY2hlZCAoZm9yIG90aGVyIGluc3RhbmNlcwotICAgICAqICBvZiB0aGUgc2FtZSBjbGFzcykuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCBNYXAgZ2V0TWV0aG9kTWFwKCkKLSAgICB7Ci0gICAgICAgIGlmIChfbWV0aG9kTWFwICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gX21ldGhvZE1hcDsKLQotICAgICAgICBDbGFzcyBiZWFuQ2xhc3MgPSBfdGFyZ2V0LmdldENsYXNzKCk7Ci0KLSAgICAgICAgc3luY2hyb25pemVkIChfY2xhc3NNYXApCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9tZXRob2RNYXAgPSAoTWFwKSBfY2xhc3NNYXAuZ2V0KGJlYW5DbGFzcyk7Ci0KLSAgICAgICAgICAgIGlmIChfbWV0aG9kTWFwID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX21ldGhvZE1hcCA9IGJ1aWxkTWV0aG9kTWFwKGJlYW5DbGFzcyk7Ci0KLSAgICAgICAgICAgICAgICBfY2xhc3NNYXAucHV0KGJlYW5DbGFzcywgX21ldGhvZE1hcCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gX21ldGhvZE1hcDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBNYXAgYnVpbGRNZXRob2RNYXAoQ2xhc3MgYmVhbkNsYXNzKQotICAgIHsKLSAgICAgICAgaWYgKExPRy5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICAgICAgTE9HLmRlYnVnKCJCdWlsZGluZyBtZXRob2QgbWFwIGZvciBjbGFzcyAiICsgYmVhbkNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgTWFwIHJlc3VsdCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIE1ldGhvZFtdIG1ldGhvZHMgPSBiZWFuQ2xhc3MuZ2V0TWV0aG9kcygpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kcy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgTWV0aG9kIG0gPSBtZXRob2RzW2ldOwotICAgICAgICAgICAgaW50IG1vZHMgPSBtLmdldE1vZGlmaWVycygpOwotCi0gICAgICAgICAgICBpZiAoTW9kaWZpZXIuaXNTdGF0aWMobW9kcykpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICAgIC8vIFByb2JhYmx5IG5vdCBuZWNlc3NhcnksIGdldE1ldGhvZHMoKSByZXR1cm5zIG9ubHkgcHVibGljCi0gICAgICAgICAgICAvLyBtZXRob2RzLgotCi0gICAgICAgICAgICBpZiAoIU1vZGlmaWVyLmlzUHVibGljKG1vZHMpKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICAvLyBNdXN0IHJldHVybiB2b2lkCi0KLSAgICAgICAgICAgIGlmIChtLmdldFJldHVyblR5cGUoKSAhPSBWb2lkLlRZUEUpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICAgIENsYXNzW10gcGFybVR5cGVzID0gbS5nZXRQYXJhbWV0ZXJUeXBlcygpOwotCi0gICAgICAgICAgICBpZiAocGFybVR5cGVzLmxlbmd0aCAhPSAxKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICAvLyBwYXJtIG11c3QgYmUgSVJlcXVlc3RDeWNsZQotCi0gICAgICAgICAgICBpZiAoIXBhcm1UeXBlc1swXS5lcXVhbHMoSVJlcXVlc3RDeWNsZS5jbGFzcykpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICAgIC8vIEhhISAgUGFzc2VkIGFsbCB0ZXN0cy4KLQotICAgICAgICAgICAgcmVzdWx0LnB1dChtLmdldE5hbWUoKSwgbSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEludm9rZWQgYnkgdGhlIGlubmVyIGxpc3RlbmVyL2FkYXB0b3IgY2xhc3NlcyB0bwotICAgICAqICBpbnZva2UgdGhlIG1ldGhvZC4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgaW52b2tlVGFyZ2V0TWV0aG9kKE9iamVjdCB0YXJnZXQsIE1ldGhvZCBtZXRob2QsIE9iamVjdFtdIGFyZ3MpCi0gICAgewotICAgICAgICBpZiAoTE9HLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgICAgICBMT0cuZGVidWcoIkludm9raW5nIGxpc3RlbmVyIG1ldGhvZCAiICsgbWV0aG9kICsgIiBvbiAiICsgdGFyZ2V0KTsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbWV0aG9kLmludm9rZSh0YXJnZXQsIGFyZ3MpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVGhyb3dhYmxlIGlubmVyID0gZXguZ2V0VGFyZ2V0RXhjZXB0aW9uKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoaW5uZXIgaW5zdGFuY2VvZiBBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24pCi0gICAgICAgICAgICAgICAgICAgIHRocm93IChBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24pIGlubmVyOwotCi0gICAgICAgICAgICAgICAgLy8gRWRpdCBvdXQgdGhlIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIGlmIHBvc3NpYmxlLgotCi0gICAgICAgICAgICAgICAgaWYgKGlubmVyIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pIGlubmVyOwotCi0gICAgICAgICAgICAgICAgdGhyb3cgZXg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbiBleCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgZXg7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gQ2F0Y2ggSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBvciwgcHJlZmVycmFibHksCi0gICAgICAgICAgICAvLyB0aGUgaW5uZXIgZXhjZXB0aW9uIGhlcmUgKGlmIGl0cyBhIHJ1bnRpbWUgZXhjZXB0aW9uKS4KLQotICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICBUYXBlc3RyeS5mb3JtYXQoIkxpc3RlbmVyTWFwLnVuYWJsZS10by1pbnZva2UtbWV0aG9kIiwgbWV0aG9kLmdldE5hbWUoKSwgdGFyZ2V0LCBleC5nZXRNZXNzYWdlKCkpLAotICAgICAgICAgICAgICAgIGV4KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKiAKLSAgICAgKiAgUmV0dXJucyBhbiB1bm1vZGlmaWFibGUgY29sbGVjdGlvbiBvZiB0aGUgCi0gICAgICogIG5hbWVzIG9mIHRoZSBsaXN0ZW5lcnMgaW1wbGVtZW50ZWQgYnkgdGhlIHRhcmdldCBjbGFzcy4KLSAgICAgKgotICAgICAqICBAc2luY2UgMS4wLjYKLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgQ29sbGVjdGlvbiBnZXRMaXN0ZW5lck5hbWVzKCkKLSAgICB7Ci0gICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlQ29sbGVjdGlvbihnZXRNZXRob2RNYXAoKS5rZXlTZXQoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgdHJ1ZSBpZiB0aGlzIExpc3RlbmVyTWFwIGNhbiBwcm92aWRlIGEgbGlzdGVuZXIKLSAgICAgKiAgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLSAgICAgKiAKLSAgICAgKiAgQHNpbmNlIDIuMgotICAgICAqIAotICAgICAqKi8KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBjYW5Qcm92aWRlTGlzdGVuZXIoU3RyaW5nIG5hbWUpCi0gICAgewotICAgICAgICAgcmV0dXJuIGdldE1ldGhvZE1hcCgpLmNvbnRhaW5zS2V5KG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICJMaXN0ZW5lck1hcFsiICsgX3RhcmdldCArICJdIjsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2xpc3RlbmVyL0xpc3RlbmVyTWFwUHJvcGVydHlBY2Nlc3Nvci5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L2xpc3RlbmVyL0xpc3RlbmVyTWFwUHJvcGVydHlBY2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDU4YmNmLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9saXN0ZW5lci9MaXN0ZW5lck1hcFByb3BlcnR5QWNjZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5Lmxpc3RlbmVyOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9nbmwuT2JqZWN0UHJvcGVydHlBY2Nlc3NvcjsKLWltcG9ydCBvZ25sLk9nbmxFeGNlcHRpb247Ci0KLS8qKgotICogIEV4cG9zZXMge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkuSUFjdGlvbkxpc3RlbmVyfSBsaXN0ZW5lcnMKLSAqICBwcm92aWRlZCBieSB0aGUge0BsaW5rIExpc3RlbmVyTWFwfSBhcyByZWFkLW9ubHkgcHJvcGVydGllcwotICogIG9mIHRoZSBMaXN0ZW5lck1hcC4KLSAqCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogIEB2ZXJzaW9uICRJZCQKLSAqICBAc2luY2UgMi4yCi0gKgotICoqLwotCi1wdWJsaWMgY2xhc3MgTGlzdGVuZXJNYXBQcm9wZXJ0eUFjY2Vzc29yIGV4dGVuZHMgT2JqZWN0UHJvcGVydHlBY2Nlc3NvcgotewotICAgIC8qKgotICAgICAqICBDaGVja3MgdG8gc2VlIGlmIHRoZSBMaXN0ZW5lck1hcCBwcm92aWRlcyB0aGUgbmFtZWQKLSAgICAgKiAgbGlzdGVuZXIsIHJldHVybmluZyB0aGUgbGlzdGVuZXIgaWYgaXQgZG9lcy4gIE90aGVyd2lzZSwKLSAgICAgKiAgaW52b2tlcyB0aGUgc3VwZXIgaW1wbGVtZW50YXRpb24uCi0gICAgICogCi0gICAgICoqLwotICAgIAotICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoTWFwIGNvbnRleHQsIE9iamVjdCB0YXJnZXQsIE9iamVjdCBuYW1lKSB0aHJvd3MgT2dubEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgTGlzdGVuZXJNYXAgbWFwID0gKExpc3RlbmVyTWFwKSB0YXJnZXQ7Ci0gICAgICAgIFN0cmluZyBsaXN0ZW5lck5hbWUgPSAoU3RyaW5nKSBuYW1lOwotCi0gICAgICAgIGlmIChtYXAuY2FuUHJvdmlkZUxpc3RlbmVyKGxpc3RlbmVyTmFtZSkpCi0gICAgICAgICAgICByZXR1cm4gbWFwLmdldExpc3RlbmVyKGxpc3RlbmVyTmFtZSk7Ci0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldFByb3BlcnR5KGNvbnRleHQsIHRhcmdldCwgbmFtZSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqICBSZXR1cm5zIHRydWUgaWYgdGhlIExpc3RlbmVyTWFwIGNvbnRhaW5zIHRoZSBuYW1lZCBsaXN0ZW5lciwKLSAgICAgKiAgb3RoZXJ3aXNlIGludm9rZXMgc3VwZXItaW1wbGVtZW50YXRpb24uCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIGJvb2xlYW4gaGFzR2V0UHJvcGVydHkoTWFwIGNvbnRleHQsIE9iamVjdCB0YXJnZXQsIE9iamVjdCBvbmFtZSkgdGhyb3dzIE9nbmxFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIExpc3RlbmVyTWFwIG1hcCA9IChMaXN0ZW5lck1hcCkgdGFyZ2V0OwotICAgICAgICBTdHJpbmcgbGlzdGVuZXJOYW1lID0gKFN0cmluZykgb25hbWU7Ci0KLSAgICAgICAgaWYgKG1hcC5jYW5Qcm92aWRlTGlzdGVuZXIobGlzdGVuZXJOYW1lKSkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgIHJldHVybiBzdXBlci5oYXNHZXRQcm9wZXJ0eShjb250ZXh0LCB0YXJnZXQsIG9uYW1lKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9saXN0ZW5lci9wYWNrYWdlLmh0bWwgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvbGlzdGVuZXIvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjEwYzA3Li4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9saXN0ZW5lci9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotCi08aHRtbD4KLTxib2R5PgotCi08cD5TdXBwb3J0IGNsYXNzZXMgdGhhdCBhbGxvd3MgYW4gb2JqZWN0Ci10byBleHBvc2UgbGlzdGVuZXIgPGVtPm1ldGhvZHM8L2VtPiBpbnN0ZWFkIG9mIGxpc3RlbmVyIDxlbT5wcm9wZXJ0aWVzPC9lbT4uCi0KLTxwPgotTm9ybWFsbHksIGEgbGlzdGVuZXIgcHJvcGVydHkgbXVzdCBiZSBhbiBvYmplY3QgdGhhdCBpbXBsZW1lbnQKLXtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LklBY3Rpb25MaXN0ZW5lcn0uICBUaGlzIGNhbiBiZSBjdW1iZXJzb21lLCBpbiBwcmFjdGljZSwgYXMgaXQKLXR5cGljYWxseSBpbnZvbHZlcyBjcmVhdGluZyBhbiBhbm9ueW1vdXMgaW5uZXIgY2xhc3MuCi0KLTxwPgotVXNpbmcgdGhpcyBtZWNoYW5pc20sIGNsYXNzZXMgY2FuIGluc3RlYWQgaW1wbGVtZW50IGxpc3RlbmVyIDxlbT5tZXRob2RzPC9lbT4uCi1BIGxpc3RlbmVyIG1ldGhvZCB0YWtlcyB0aGUgZm9ybToKLQotPHByZT4KLXB1YmxpYyB2b2lkIDxlbT5tZXRob2QtbmFtZTwvZW0+KHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZXF1ZXN0Q3ljbGV9IGN5Y2xlKSAKLXRocm93cyB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5BcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb259PC9jb2RlPgotPC9wcmU+Ci0KLTxwPlRoZSA8Y29kZT50aHJvd3M8L2NvZGU+IGNsYXVzZSBpcyBvcHRpb25hbCwgYnV0IG1heSBub3QgdGhyb3cgYW55IAotYWRkaXRpb25hbCBleGNlcHRpb25zLgotCi08cD5UYXBlc3RyeSB3aWxsIGNyZWF0ZSBhbiBhcHByb3ByaWF0ZSBsaXN0ZW5lciBvYmplY3QgdGhhdCB3aWxsIGludm9rZSB0aGUKLWNvcnJlc3BvbmRpbmcgbWV0aG9kLgotCi08cD5UaGUgbWV0aG9kcyBjYW4gYmUgYWNjZXNzZWQgdXNpbmcgdGhlIHByb3BlcnR5IHBhdGggIjxjb2RlPmxpc3RlbmVycy48ZW0+bWV0aG9kLW5hbWU8L2VtPjwvY29kZT4iCi0KLUBzZWUgb3JnLmFwYWNoZS50YXBlc3RyeS5saXN0ZW5lci5MaXN0ZW5lck1hcAotQHNlZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LkFic3RyYWN0Q29tcG9uZW50I2dldExpc3RlbmVycygpCi1Ac2VlIG9yZy5hcGFjaGUudGFwZXN0cnkuZW5naW5lLkFic3RyYWN0RW5naW5lI2dldExpc3RlbmVycygpCi1Ac2luY2UgMS4wLjIKLQotQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcCA8YSBocmVmPSJtYWlsdG86aGxzaGlwQGFwYWNoZS5vcmciPmhsc2hpcEBhcGFjaGUub3JnPC9hPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvbXVsdGlwYXJ0L0RlZmF1bHRNdWx0aXBhcnREZWNvZGVyLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvbXVsdGlwYXJ0L0RlZmF1bHRNdWx0aXBhcnREZWNvZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlM2YzMjcuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L211bHRpcGFydC9EZWZhdWx0TXVsdGlwYXJ0RGVjb2Rlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ3ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5Lm11bHRpcGFydDsKLQotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuZmlsZXVwbG9hZC5EaXNrRmlsZVVwbG9hZDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuZmlsZXVwbG9hZC5GaWxlSXRlbTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuZmlsZXVwbG9hZC5GaWxlVXBsb2FkOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5maWxldXBsb2FkLkZpbGVVcGxvYWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5BcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5UYXBlc3RyeTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnJlcXVlc3QuSVVwbG9hZEZpbGU7Ci0KLS8qKgotICogIERlY29kZXMgdGhlIGRhdGEgaW4gYSA8Y29kZT5tdWx0aXBhcnQvZm9ybS1kYXRhPC9jb2RlPiBIVFRQIHJlcXVlc3QsIGhhbmRsaW5nCi0gKiAgZmlsZSB1cGxvYWRzIGFuZCBtdWx0aS12YWx1ZWQgcGFyYW1ldGVycy4gIEFmdGVyIGRlY29kaW5nLCB0aGUgY2xhc3MgaXMgdXNlZAotICogIHRvIGFjY2VzcyB0aGUgcGFyYW1ldGVyIHZhbHVlcy4KLSAqIAotICogIDxwPlRoaXMgaW1wbGVtZW50YXRpb24gaXMgYSB0aGluIHdyYXBwZXIgYXJvdW5kIHRoZSBBcGFjaGUgSmFrYXJ0YQotICogIDxhIGhyZWY9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvY29tbW9ucy9maWxldXBsb2FkLyI+RmlsZVVwbG9hZDwvYT4uIAotICogIAotICogIDxwPlN1cHBvcnRzIHNpbmdsZSB2YWx1ZWQgcGFyYW1ldGVycywgbXVsdGktdmFsdWVkIHBhcmFtZXRlcnMgYW5kIGluZGl2aWR1YWwKLSAqICBmaWxlIHVwbG9hZHMuICBUaGF0IGlzLCBmb3IgZmlsZSB1cGxvYWRzLCBlYWNoIHVwbG9hZCBtdXN0IGJlIGEgdW5pcXVlIHBhcmFtZXRlcgotICogICh0aGF0IGlzIGFsbCB0aGUge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkuZm9ybS5VcGxvYWR9IGNvbXBvbmVudCBuZWVkcykuCi0KLSAqCi0gKiAgQGF1dGhvciBKb2UgUGFuaWNvCi0gKiAgQHZlcnNpb24gJElkJAotICogIEBzaW5jZSAyLjAuMQotICoKLSAqKi8KLXB1YmxpYyBjbGFzcyBEZWZhdWx0TXVsdGlwYXJ0RGVjb2RlciBpbXBsZW1lbnRzIElNdWx0aXBhcnREZWNvZGVyCi17Ci0gICAgLyoqCi0gICAgICogIFJlcXVlc3QgYXR0cmlidXRlIGtleSB1c2VkIHRvIHN0b3JlIHRoZSBwYXJ0IG1hcCBmb3IgdGhpcyByZXF1ZXN0LgotICAgICAqICBUaGUgcGFydCBtYXAgaXMgY3JlYXRlZCBpbiB7QGxpbmsgI2RlY29kZShIdHRwU2VydmxldFJlcXVlc3QpfS4gIEJ5IHN0b3JpbmcKLSAgICAgKiAgdGhlIHBhcnQgbWFwIGluIHRoZSByZXF1ZXN0IGluc3RlYWQgb2YgYW4gaW5zdGFuY2UgdmFyaWFibGUsIERlZmF1bHRNdWx0aXBhcnREZWNvZGVyCi0gICAgICogIGJlY29tZXMgdGhyZWFkc2FmZSAobm8gY2xpZW50LXNwZWNpZmljIHN0YXRlIGluIGluc3RhbmNlIHZhcmlhYmxlcykuCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSVF9NQVBfQVRUUklCVVRFX05BTUUgPSAib3JnLmFwYWNoZS50YXBlc3RyeS5tdWx0aXBhcnQucGFydC1tYXAiOwotCi0gICAgcHJpdmF0ZSBpbnQgX21heFNpemUgPSAxMDAwMDAwMDsKLSAgICBwcml2YXRlIGludCBfdGhyZXNob2xkU2l6ZSA9IDEwMjQ7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgX3JlcG9zaXRvcnlQYXRoID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmlvLnRtcGRpciIpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgRGVmYXVsdE11bHRpcGFydERlY29kZXIgX3NoYXJlZDsKLQotICAgIHB1YmxpYyBzdGF0aWMgRGVmYXVsdE11bHRpcGFydERlY29kZXIgZ2V0U2hhcmVkSW5zdGFuY2UoKQotICAgIHsKLSAgICAgICAgaWYgKF9zaGFyZWQgPT0gbnVsbCkKLSAgICAgICAgICAgIF9zaGFyZWQgPSBuZXcgRGVmYXVsdE11bHRpcGFydERlY29kZXIoKTsKLQotICAgICAgICByZXR1cm4gX3NoYXJlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRNYXhTaXplKGludCBtYXhTaXplKQotICAgIHsKLSAgICAgICAgX21heFNpemUgPSBtYXhTaXplOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0TWF4U2l6ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gX21heFNpemU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VGhyZXNob2xkU2l6ZShpbnQgdGhyZXNob2xkU2l6ZSkKLSAgICB7Ci0gICAgICAgIF90aHJlc2hvbGRTaXplID0gdGhyZXNob2xkU2l6ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldFRocmVzaG9sZFNpemUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF90aHJlc2hvbGRTaXplOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFJlcG9zaXRvcnlQYXRoKFN0cmluZyByZXBvc2l0b3J5UGF0aCkKLSAgICB7Ci0gICAgICAgIF9yZXBvc2l0b3J5UGF0aCA9IHJlcG9zaXRvcnlQYXRoOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVwb3NpdG9yeVBhdGgoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9yZXBvc2l0b3J5UGF0aDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNNdWx0aXBhcnRSZXF1ZXN0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KQotICAgIHsKLSAgICAgICAgcmV0dXJuIEZpbGVVcGxvYWQuaXNNdWx0aXBhcnRDb250ZW50KHJlcXVlc3QpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBJbnZva2VzIHtAbGluayBJUGFydCNjbGVhbnVwKCl9IG9uIGVhY2ggcGFydC4KLSAgICAgKiAKLSAgICAgKiovCi0gICAgcHVibGljIHZvaWQgY2xlYW51cChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkKLSAgICB7Ci0gICAgICAgIE1hcCBwYXJ0TWFwID0gZ2V0UGFydE1hcChyZXF1ZXN0KTsKLQotICAgICAgICBJdGVyYXRvciBpID0gcGFydE1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaS5oYXNOZXh0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIElQYXJ0IHBhcnQgPSAoSVBhcnQpIGkubmV4dCgpOwotICAgICAgICAgICAgcGFydC5jbGVhbnVwKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZWNvZGVzIHRoZSByZXF1ZXN0LCBzdG9yaW5nIHRoZSBwYXJ0IG1hcCAoa2V5ZWQgb24gcXVlcnkgcGFyYW1ldGVyIG5hbWUsIAotICAgICAqIHZhbHVlIGlzIHtAbGluayBJUGFydH0gaW50byB0aGUgcmVxdWVzdCBhcyBhbiBhdHRyaWJ1dGUuCi0gICAgICogCi0gICAgICogQHRocm93cyBBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24gaWYgZGVjb2RlIGZhaWxzLCBmb3IgaW5zdGFuY2UgdGhlCi0gICAgICogcmVxdWVzdCBleGNlZWRzIGdldE1heFNpemUoKQotICAgICAqIAotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIGRlY29kZShIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkKLSAgICB7Ci0gICAgICAgIE1hcCBwYXJ0TWFwID0gbmV3IEhhc2hNYXAoKTsKLQotICAgICAgICByZXF1ZXN0LnNldEF0dHJpYnV0ZShQQVJUX01BUF9BVFRSSUJVVEVfTkFNRSwgcGFydE1hcCk7Ci0KLSAgICAgICAgLy8gVGhlIGVuY29kaW5nIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGRlY29kZSB0aGUgc3RyaW5nIHBhcmFtZXRlcnMKLSAgICAgICAgLy8gSXQgc2hvdWxkIE5PVCBiZSBudWxsIGF0IHRoaXMgcG9pbnQsIGJ1dCBpdCBtYXkgYmUgCi0gICAgICAgIC8vIGlmIHRoZSBvbGRlciBTZXJ2bGV0IEFQSSAyLjIgaXMgdXNlZAotICAgICAgICBTdHJpbmcgZW5jb2RpbmcgPSByZXF1ZXN0LmdldENoYXJhY3RlckVuY29kaW5nKCk7Ci0KLSAgICAgICAgLy8gRGlza0ZpbGVVcGxvYWQgaXMgbm90IHF1aXRlIHRocmVhZHNhZmUsIHNvIHdlIGNyZWF0ZSBhIG5ldyBpbnN0YW5jZQotICAgICAgICAvLyBmb3IgZWFjaCByZXF1ZXN0LgotCi0gICAgICAgIERpc2tGaWxlVXBsb2FkIHVwbG9hZCA9IG5ldyBEaXNrRmlsZVVwbG9hZCgpOwotCi0gICAgICAgIExpc3QgcGFydHMgPSBudWxsOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZW5jb2RpbmcgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB1cGxvYWQuc2V0SGVhZGVyRW5jb2RpbmcoZW5jb2RpbmcpOwotICAgICAgICAgICAgcGFydHMgPSB1cGxvYWQucGFyc2VSZXF1ZXN0KHJlcXVlc3QsIF90aHJlc2hvbGRTaXplLCBfbWF4U2l6ZSwgX3JlcG9zaXRvcnlQYXRoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRmlsZVVwbG9hZEV4Y2VwdGlvbiBleCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICBUYXBlc3RyeS5mb3JtYXQoIkRlZmF1bHRNdWx0aXBhcnREZWNvZGVyLnVuYWJsZS10by1kZWNvZGUiLCBleC5nZXRNZXNzYWdlKCkpLAotICAgICAgICAgICAgICAgIGV4KTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBjb3VudCA9IFRhcGVzdHJ5LnNpemUocGFydHMpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgRmlsZUl0ZW0gdXBsb2FkSXRlbSA9IChGaWxlSXRlbSkgcGFydHMuZ2V0KGkpOwotCi0gICAgICAgICAgICBpZiAodXBsb2FkSXRlbS5pc0Zvcm1GaWVsZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSB1cGxvYWRJdGVtLmdldEZpZWxkTmFtZSgpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChlbmNvZGluZyA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB1cGxvYWRJdGVtLmdldFN0cmluZygpOwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHVwbG9hZEl0ZW0uZ2V0U3RyaW5nKGVuY29kaW5nKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBWYWx1ZVBhcnQgdmFsdWVQYXJ0ID0gKFZhbHVlUGFydCkgcGFydE1hcC5nZXQobmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZVBhcnQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVQYXJ0LmFkZCh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVBhcnQgPSBuZXcgVmFsdWVQYXJ0KHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRNYXAucHV0KG5hbWUsIHZhbHVlUGFydCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZXgpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgVGFwZXN0cnkuZm9ybWF0KCJpbGxlZ2FsLWVuY29kaW5nIiwgZW5jb2RpbmcpLAotICAgICAgICAgICAgICAgICAgICAgICAgZXgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBVcGxvYWRQYXJ0IHVwbG9hZFBhcnQgPSBuZXcgVXBsb2FkUGFydCh1cGxvYWRJdGVtKTsKLQotICAgICAgICAgICAgICAgIHBhcnRNYXAucHV0KHVwbG9hZEl0ZW0uZ2V0RmllbGROYW1lKCksIHVwbG9hZFBhcnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgU3RyaW5nIG5hbWUpCi0gICAgewotICAgICAgICBNYXAgcGFydE1hcCA9IGdldFBhcnRNYXAocmVxdWVzdCk7Ci0KLSAgICAgICAgVmFsdWVQYXJ0IHBhcnQgPSAoVmFsdWVQYXJ0KSBwYXJ0TWFwLmdldChuYW1lKTsKLSAgICAgICAgaWYgKHBhcnQgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBwYXJ0LmdldFZhbHVlKCk7Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZ1tdIGdldFN0cmluZ3MoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIFN0cmluZyBuYW1lKQotICAgIHsKLSAgICAgICAgTWFwIHBhcnRNYXAgPSBnZXRQYXJ0TWFwKHJlcXVlc3QpOwotCi0gICAgICAgIFZhbHVlUGFydCBwYXJ0ID0gKFZhbHVlUGFydCkgcGFydE1hcC5nZXQobmFtZSk7Ci0gICAgICAgIGlmIChwYXJ0ICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gcGFydC5nZXRWYWx1ZXMoKTsKLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSVVwbG9hZEZpbGUgZ2V0VXBsb2FkRmlsZShIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgU3RyaW5nIG5hbWUpCi0gICAgewotICAgICAgICBNYXAgcGFydE1hcCA9IGdldFBhcnRNYXAocmVxdWVzdCk7Ci0KLSAgICAgICAgcmV0dXJuIChJVXBsb2FkRmlsZSkgcGFydE1hcC5nZXQobmFtZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBNYXAgZ2V0UGFydE1hcChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoTWFwKSByZXF1ZXN0LmdldEF0dHJpYnV0ZShQQVJUX01BUF9BVFRSSUJVVEVfTkFNRSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvbXVsdGlwYXJ0L0lNdWx0aXBhcnREZWNvZGVyLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvbXVsdGlwYXJ0L0lNdWx0aXBhcnREZWNvZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5ZWJiZDUuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L211bHRpcGFydC9JTXVsdGlwYXJ0RGVjb2Rlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkubXVsdGlwYXJ0OwotCi1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkucmVxdWVzdC5JVXBsb2FkRmlsZTsKLQotLyoqCi0gKiAgRGVmaW5lcyBob3cgYSBtdWx0aXBhcnQgSFRUUCByZXF1ZXN0IGNhbiBiZSBicm9rZW4gaW50byBpbmRpdmlkdWFsCi0gKiAgZWxlbWVudHMgKGluY2x1ZGluZyBmaWxlIHVwbG9hZHMpLgotICogCi0gKiAgPHA+TXVsdGlwYXJ0IGRlY29kZXIgaW1wbGVtZW50YXRpb25zIG11c3QgYmUgdGhyZWFkc2FmZS4KLSAqICAKLSAqCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogIEB2ZXJzaW9uICRJZCQKLSAqICBAc2luY2UgMi4zCi0gKiovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSU11bHRpcGFydERlY29kZXIKLXsKLSAgICAvKioKLSAgICAgKiAgRGVjb2RlcyB0aGUgaW5jb21pbmcgcmVxdWVzdCwgaWRlbnRpZnlpbmcgYWxsCi0gICAgICogIHRoZSBwYXJ0cyAodmFsdWVzIGFuZCB1cGxvYWRlZCBmaWxlcykgY29udGFpbmVkCi0gICAgICogIHdpdGhpbi4KLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCBkZWNvZGUoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpOwotCi0gICAgLyoqCi0gICAgICogIEludm9rZWQgdG8gcmVsZWFzZSBhbnkgcmVzb3VyY2VzIG5lZWRlZCBieSB0Z2hlCi0gICAgICogIGRlY29kZXIuICBJbiBzb21lIGNhc2VzLCBsYXJnZSBpbmNvbWluZyBwYXJ0cwotICAgICAqICBhcmUgd3JpdHRlbiB0byB0ZW1wb3JhcnkgZmlsZXM7IHRoaXMgbWV0aG9kCi0gICAgICogIGVuc3VyZXMgdGhvc2UgdGVtcG9yYXJ5IGZpbGVzIGFyZSBkZWxldGVkLgotICAgICAqIAotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIGNsZWFudXAoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpOwotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgdGhlIHNpbmdsZSB2YWx1ZSAob3IgZmlyc3QgdmFsdWUpIGZvciB0aGUgcGFyYW1ldGVyCi0gICAgICogIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLiAgUmV0dXJucyBudWxsIGlmIG5vIHN1Y2ggcGFyYW1ldGVyCi0gICAgICogIHdhcyBpbiB0aGUgcmVxdWVzdC4KLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgU3RyaW5nIG5hbWUpOwotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgYW4gYXJyYXkgb2YgdmFsdWVzIChwb3NzaWJseSBhIHNpbmdsZSBlbGVtZW50IGFycmF5KS4KLSAgICAgKiAgUmV0dXJucyBudWxsIGlmIG5vIHN1Y2ggcGFyYW1ldGVyIHdhcyBpbiB0aGUgcmVxdWVzdC4KLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0U3RyaW5ncyhIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgU3RyaW5nIG5hbWUpOwotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgdGhlIHVwbG9hZGVkIGZpbGUgd2l0aCB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlciBuYW1lLAotICAgICAqICBvciBudWxsIGlmIG5vIHN1Y2ggcGFyYW1ldGVyIHdhcyBpbiB0aGUgcmVxdWVzdC4KLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgSVVwbG9hZEZpbGUgZ2V0VXBsb2FkRmlsZShIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgU3RyaW5nIG5hbWUpOwotfQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L211bHRpcGFydC9JUGFydC5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L211bHRpcGFydC9JUGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmMwYmMxLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9tdWx0aXBhcnQvSVBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5Lm11bHRpcGFydDsKLQotLyoqCi0gKiAgQ29tbW9uIGludGVyZmFjZSBmb3IgZGF0YSBwYXJ0cyBmcm9tIG11bHRpcGFydCBmb3JtIHN1Ym1pc3Npb25zLgotICoKLSAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiAgQHZlcnNpb24gJElkJAotICogIEBzaW5jZSAyLjAuMQotICogCi0gKiovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSVBhcnQKLXsKLSAgICAvKioKLSAgICAgKiAgSW52b2tlZCBhdCB0aGUgZW5kIG9mIGEgcmVxdWVzdCBjeWNsZSB0byBkZWxldGUgYW55IHJlc291cmNlcyBoZWxkIGJ5Ci0gICAgICogIHRoZSBwYXJ0LgotICAgICAqIAotICAgICAqICBAc2VlIFVwbG9hZFBhcnQjY2xlYW51cCgpCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgY2xlYW51cCgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9tdWx0aXBhcnQvVXBsb2FkUGFydC5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L211bHRpcGFydC9VcGxvYWRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3MDg5ZTguLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L211bHRpcGFydC9VcGxvYWRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkubXVsdGlwYXJ0OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5maWxldXBsb2FkLkZpbGVJdGVtOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuVGFwZXN0cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5yZXF1ZXN0LklVcGxvYWRGaWxlOwotCi0vKioKLSAqICBQb3J0aW9uIG9mIGEgbXVsdGktcGFydCByZXF1ZXN0IHJlcHJlc2VudGluZyBhbiB1cGxvYWRlZCBmaWxlLgotICoKLSAqICBAYXV0aG9yIEpvZSBQYW5pY28KLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQHNpbmNlIDIuMC4xCi0gKgotICoqLwotcHVibGljIGNsYXNzIFVwbG9hZFBhcnQgZXh0ZW5kcyBPYmplY3QgaW1wbGVtZW50cyBJVXBsb2FkRmlsZSwgSVBhcnQKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgTE9HID0gTG9nRmFjdG9yeS5nZXRMb2coVXBsb2FkUGFydC5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIEZpbGVJdGVtIF9maWxlSXRlbTsKLQotICAgIHB1YmxpYyBVcGxvYWRQYXJ0KEZpbGVJdGVtIGZpbGVJdGVtKQotICAgIHsKLSAgICAgICAgaWYgKGZpbGVJdGVtID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIFRhcGVzdHJ5LmZvcm1hdCgiaW52YWxpZC1udWxsLXBhcmFtZXRlciIsICJmaWxlSXRlbSIpKTsKLQotICAgICAgICBfZmlsZUl0ZW0gPSBmaWxlSXRlbTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRUeXBlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfZmlsZUl0ZW0uZ2V0Q29udGVudFR5cGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgTGV2ZXJhZ2VzIHtAbGluayBGaWxlfSB0byBjb252ZXJ0IHRoZSBmdWxsIGZpbGUgcGF0aCBhbmQgZXh0cmFjdAotICAgICAqICB0aGUgbmFtZS4KLSAgICAgKiAKLSAgICAgKiovCi0gICAgcHVibGljIFN0cmluZyBnZXRGaWxlTmFtZSgpCi0gICAgewotICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZSh0aGlzLmdldEZpbGVQYXRoKCkpOwotCi0gICAgICAgIHJldHVybiBmaWxlLmdldE5hbWUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgQHNpbmNlIDIuMC40Ci0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIFN0cmluZyBnZXRGaWxlUGF0aCgpCi0gICAgewotICAgICAgICByZXR1cm4gX2ZpbGVJdGVtLmdldE5hbWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0U3RyZWFtKCkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gX2ZpbGVJdGVtLmdldElucHV0U3RyZWFtKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGV4KQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIFRhcGVzdHJ5LmZvcm1hdCgiVXBsb2FkUGFydC51bmFibGUtdG8tb3Blbi1jb250ZW50LWZpbGUiLCBfZmlsZUl0ZW0uZ2V0TmFtZSgpKSwKLSAgICAgICAgICAgICAgICBleCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgRGVsZXRlcyB0aGUgZXh0ZXJuYWwgY29udGVudCBmaWxlLCBpZiBvbmUgZXhpc3RzLgotICAgICAqIAotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIGNsZWFudXAoKQotICAgIHsKLSAgICAgICAgX2ZpbGVJdGVtLmRlbGV0ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdyaXRlcyB0aGUgdXBsb2FkZWQgY29udGVudCB0byBhIGZpbGUuICBUaGlzIHNob3VsZCBiZSBpbnZva2VkIGF0IG1vc3Qgb25jZQotICAgICAqIChwZXJoYXBzIHdlIHNob3VsZCBhZGQgYSBjaGVjayBmb3IgdGhpcykuICBUaGlzIHdpbGwgb2Z0ZW4KLSAgICAgKiBiZSBhIHNpbXBsZSBmaWxlIHJlbmFtZS4KLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMy4wCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgd3JpdGUoRmlsZSBmaWxlKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIF9maWxlSXRlbS53cml0ZShmaWxlKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIFRhcGVzdHJ5LmZvcm1hdCgiVXBsb2FkUGFydC53cml0ZS1mYWlsdXJlIiwgZmlsZSwgZXguZ2V0TWVzc2FnZSgpKSwKLSAgICAgICAgICAgICAgICBleCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2luY2UgMy4wCi0gICAgICovCi0gICAgcHVibGljIGxvbmcgZ2V0U2l6ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gX2ZpbGVJdGVtLmdldFNpemUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2luY2UgMy4wCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNJbk1lbW9yeSgpCi0gICAgewotICAgICAgICByZXR1cm4gX2ZpbGVJdGVtLmlzSW5NZW1vcnkoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9tdWx0aXBhcnQvVmFsdWVQYXJ0LmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvbXVsdGlwYXJ0L1ZhbHVlUGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmUyN2UxLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9tdWx0aXBhcnQvVmFsdWVQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkubXVsdGlwYXJ0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiAgQSBwb3J0aW9uIG9mIGEgbXVsdGlwYXJ0IHJlcXVlc3QgdGhhdCBzdG9yZXMgYSB2YWx1ZSwgb3IgdmFsdWVzLCBmb3IKLSAqICBhIHBhcmFtZXRlci4KLSAqCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogIEB2ZXJzaW9uICRJZCQKLSAqICBAc2luY2UgMi4wLjEKLSAqCi0gKiovCi0KLXB1YmxpYyBjbGFzcyBWYWx1ZVBhcnQgaW1wbGVtZW50cyBJUGFydAotewotICAgIHByaXZhdGUgaW50IF9jb3VudDsKLSAgICAvLyBTdG9yZXMgZWl0aGVyIFN0cmluZyBvciBMaXN0IG9mIFN0cmluZwotICAgIHByaXZhdGUgT2JqZWN0IF92YWx1ZTsKLQotICAgIHB1YmxpYyBWYWx1ZVBhcnQoU3RyaW5nIHZhbHVlKQotICAgIHsKLSAgICAgICAgX2NvdW50ID0gMTsKLSAgICAgICAgX3ZhbHVlID0gdmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRDb3VudCgpCi0gICAgewotICAgICAgICByZXR1cm4gX2NvdW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIHRoZSB2YWx1ZSwgb3IgdGhlIGZpcnN0IHZhbHVlIChpZiBtdWx0aS12YWx1ZWQpLgotICAgICAqIAotICAgICAqKi8KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKQotICAgIHsKLSAgICAgICAgaWYgKF9jb3VudCA9PSAxKQotICAgICAgICAgICAgcmV0dXJuIChTdHJpbmcpIF92YWx1ZTsKLQotICAgICAgICBMaXN0IGwgPSAoTGlzdCkgX3ZhbHVlOwotCi0gICAgICAgIHJldHVybiAoU3RyaW5nKSBsLmdldCgwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0aGUgdmFsdWVzIGFzIGFuIGFycmF5IG9mIHN0cmluZ3MuICBJZiB0aGVyZSBpcyBvbmx5IG9uZSB2YWx1ZSwKLSAgICAgKiAgaXQgaXMgcmV0dXJuZWQgd3JhcHBlZCBhcyBhIHNpbmdsZSBlbGVtZW50IGFycmF5LgotICAgICAqIAotICAgICAqKi8KLQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYWx1ZXMoKQotICAgIHsKLSAgICAgICAgaWYgKF9jb3VudCA9PSAxKQotICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXSB7KFN0cmluZykgX3ZhbHVlIH07Ci0KLSAgICAgICAgTGlzdCBsID0gKExpc3QpIF92YWx1ZTsKLQotICAgICAgICByZXR1cm4gKFN0cmluZ1tdKSBsLnRvQXJyYXkobmV3IFN0cmluZ1tfY291bnRdKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGQoU3RyaW5nIG5ld1ZhbHVlKQotICAgIHsKLSAgICAgICAgaWYgKF9jb3VudCA9PSAxKQotICAgICAgICB7Ci0gICAgICAgICAgICBMaXN0IGwgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICBsLmFkZChfdmFsdWUpOwotICAgICAgICAgICAgbC5hZGQobmV3VmFsdWUpOwotCi0gICAgICAgICAgICBfdmFsdWUgPSBsOwotICAgICAgICAgICAgX2NvdW50Kys7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBMaXN0IGwgPSAoTGlzdCkgX3ZhbHVlOwotICAgICAgICBsLmFkZChuZXdWYWx1ZSk7Ci0gICAgICAgIF9jb3VudCsrOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBEb2VzIG5vdGhpbmcuCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgY2xlYW51cCgpCi0gICAgewotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvbXVsdGlwYXJ0L29yZy5hcGFjaGUudGFwZXN0cnkubXVsdGlwYXJ0LnBhdGNoIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L211bHRpcGFydC9vcmcuYXBhY2hlLnRhcGVzdHJ5Lm11bHRpcGFydC5wYXRjaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdjZWRhMC4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvbXVsdGlwYXJ0L29yZy5hcGFjaGUudGFwZXN0cnkubXVsdGlwYXJ0LnBhdGNoCisrKyAvZGV2L251bGwKQEAgLTEsMTE1NiArMCwwIEBACi1JbmRleDogRGVmYXVsdE11bHRpcGFydERlY29kZXIuamF2YQ0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi1SQ1MgZmlsZTogL2hvbWUvY3ZzcHVibGljL2pha2FydGEtdGFwZXN0cnkvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L211bHRpcGFydC9EZWZhdWx0TXVsdGlwYXJ0RGVjb2Rlci5qYXZhLHYNCi1yZXRyaWV2aW5nIHJldmlzaW9uIDEuMQ0KLWRpZmYgLWMgLXIxLjEgRGVmYXVsdE11bHRpcGFydERlY29kZXIuamF2YQ0KLSoqKiBEZWZhdWx0TXVsdGlwYXJ0RGVjb2Rlci5qYXZhCTUgTWFyIDIwMDMgMjI6NTk6NDkgLTAwMDAJMS4xDQotLS0tIERlZmF1bHRNdWx0aXBhcnREZWNvZGVyLmphdmEJMjEgTWFyIDIwMDMgMjI6NTE6MTEgLTAwMDANCi0qKioqKioqKioqKioqKioNCi0qKiogMSw3NSAqKioqDQotISAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSEgICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQ0KLSEgICoNCi0hICAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMNCi0hICAqIHJlc2VydmVkLg0KLSEgICoNCi0hICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KLSEgICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zDQotISAgKiBhcmUgbWV0Og0KLSEgICoNCi0hICAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQotISAgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQotISAgKg0KLSEgICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQNCi0hICAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbg0KLSEgICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQ0KLSEgICogICAgZGlzdHJpYnV0aW9uLg0KLSEgICoNCi0hICAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLA0KLSEgICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoNCi0hICAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQ0KLSEgICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vYXBhY2hlLm9yZy8pLiINCi0hICAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwNCi0hICAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuDQotISAgKg0KLSEgICogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iLCAiVGFwZXN0cnkiIA0KLSEgICogICAgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMNCi0hICAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbg0KLSEgICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuDQotISAgKg0KLSEgICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIgDQotISAgKiAgICBvciAiVGFwZXN0cnkiLCBub3IgbWF5ICJBcGFjaGUiIG9yICJUYXBlc3RyeSIgYXBwZWFyIGluIHRoZWlyIA0KLSEgICogICAgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLg0KLSEgICoNCi0hICAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQNCi0hICAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTDQotISAgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQ0KLSEgICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBUQVBFU1RSWSBDT05UUklCVVRPUiBDT01NVU5JVFkNCi0hICAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsDQotISAgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQotISAgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GDQotISAgKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EDQotISAgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwNCi0hICAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVA0KLSEgICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GDQotISAgKiBTVUNIIERBTUFHRS4NCi0hICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotISAgKg0KLSEgICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkNCi0hICAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQ0KLSEgICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlDQotISAgKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uDQotISAgKg0KLSAgICovDQotLSANCi0gIHBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5tdWx0aXBhcnQ7DQotICANCi0tIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsNCi0tIGltcG9ydCBqYXZhLmlvLkZpbGU7DQotLSBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCi0tIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOw0KLS0gaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOw0KLSAgaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLSAgaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCi0gIGltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLS0gDQotICBpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsNCi0gIA0KLSAgaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uOw0KLS0gaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuVGFwZXN0cnk7DQotICBpbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5yZXF1ZXN0LklVcGxvYWRGaWxlOw0KLSEgaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkudXRpbC5TdHJpbmdTcGxpdHRlcjsNCi0gIGltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotICBpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0gIA0KLS0tLSAxLDcyIC0tLS0NCi0hIC8qDQotISAgKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0hICAqICBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xDQotISAgKg0KLSEgICogIENvcHlyaWdodCAoYykgMjAwMiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzDQotISAgKiAgcmVzZXJ2ZWQuDQotISAgKg0KLSEgICogIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KLSEgICogIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucw0KLSEgICogIGFyZSBtZXQ6DQotISAgKg0KLSEgICogIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQotISAgKiAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KLSEgICoNCi0hICAqICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodA0KLSEgICogIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbg0KLSEgICogIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUNCi0hICAqICBkaXN0cmlidXRpb24uDQotISAgKg0KLSEgICogIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLA0KLSEgICogIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6DQotISAgKiAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlDQotISAgKiAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiINCi0hICAqICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsDQotISAgKiAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4NCi0hICAqDQotISAgKiAgNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIGFuZA0KLSEgICogICJBcGFjaGUgVGFwZXN0cnkiIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzDQotISAgKiAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvcg0KLSEgICogIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuDQotISAgKg0KLSEgICogIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLA0KLSEgICogICJBcGFjaGUgVGFwZXN0cnkiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0DQotISAgKiAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4NCi0hICAqDQotISAgKiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRA0KLSEgICogIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTDQotISAgKiAgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUNCi0hICAqICBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SDQotISAgKiAgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KLSEgICogIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCi0hICAqICBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GDQotISAgKiAgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORA0KLSEgICogIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLA0KLSEgICogIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVA0KLSEgICogIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRg0KLSEgICogIFNVQ0ggREFNQUdFLg0KLSEgICogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotISAgKg0KLSEgICogIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55DQotISAgKiAgaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlDQotISAgKiAgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlDQotISAgKiAgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+Lg0KLSAgICovDQotICBwYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkubXVsdGlwYXJ0Ow0KLSAgDQotICBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotICBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KLSsgaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLSAgaW1wb3J0IGphdmEudXRpbC5NYXA7DQotICBpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsNCi0gIA0KLSAgaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uOw0KLSAgaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkucmVxdWVzdC5JVXBsb2FkRmlsZTsNCi0hIA0KLSEgaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5maWxldXBsb2FkLkZpbGVJdGVtOw0KLSEgaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5maWxldXBsb2FkLkZpbGVVcGxvYWQ7DQotISBpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmZpbGV1cGxvYWQuRmlsZVVwbG9hZEV4Y2VwdGlvbjsNCi0hIA0KLSAgaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi0gIGltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLSAgDQotKioqKioqKioqKioqKioqDQotKioqIDc4LDQ3NSAqKioqDQotICAgKiAgZmlsZSB1cGxvYWRzIGFuZCBtdWx0aS12YWx1ZWQgcGFyYW1ldGVycy4gIEFmdGVyIGRlY29kaW5nLCB0aGUgY2xhc3MgaXMgdXNlZA0KLSAgICogIHRvIGFjY2VzcyB0aGUgcGFyYW1ldGVyIHZhbHVlcy4NCi0gICAqIA0KLSEgICogIDxwPlRoaXMgaW1wbGVtZW50YXRpb24gaXMgcGFydGlhbGx5IGJhc2VkIG9uIHRoZSBNdWx0aXBhcnRSZXF1ZXN0IGZyb20NCi0hICAqICA8YSBocmVmPSJodHRwOi8vc2YubmV0L3Byb2plY3RzL2pldHR5Ij5KZXR0eTwvYT4gKHdoaWNoIGlzIExHUEwpLCBhbmQNCi0hICAqICBwYXJ0bHkgZnJvbSByZXNlYXJjaCBvbiB0aGUgd2ViLCBpbmNsdWRpbmcgYSBkaXNjdXNzaW9uIG9mIHRoZSANCi0hICAqICA8YSBocmVmPSJodHRwOi8vd3d3LmNpcy5vaGlvLXN0YXRlLmVkdS9jZ2ktYmluL3JmYy9yZmMxODY3Lmh0bWwiPlJGQzwvYT4uDQotICAgKiAgDQotICAgKiAgPHA+U3VwcG9ydHMgc2luZ2xlIHZhbHVlZCBwYXJhbWV0ZXJzLCBtdWx0aS12YWx1ZWQgcGFyYW1ldGVycyBhbmQgaW5kaXZpZHVhbA0KLSAgICogIGZpbGUgdXBsb2Fkcy4gIFRoYXQgaXMsIGZvciBmaWxlIHVwbG9hZHMsIGVhY2ggdXBsb2FkIG11c3QgYmUgYSB1bmlxdWUgcGFyYW1ldGVyDQotISAgKiAgKHRoYXQgaXMgYWxsIHRoZSB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5mb3JtLlVwbG9hZH0gY29tcG9uZW50IG5lZWRzKS4NCi0gIA0KLSAgICoNCi0hICAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwDQotISAgKiAgQHZlcnNpb24gJElkOiBEZWZhdWx0TXVsdGlwYXJ0RGVjb2Rlci5qYXZhLHYgMS4xIDIwMDMvMDMvMDUgMjI6NTk6NDkgaGxzaGlwIEV4cCAkDQotICAgKiAgQHNpbmNlIDIuMC4xDQotICAgKg0KLSAgICoqLw0KLSEgDQotISBwdWJsaWMgY2xhc3MgRGVmYXVsdE11bHRpcGFydERlY29kZXIgaW1wbGVtZW50cyBJTXVsdGlwYXJ0RGVjb2Rlcg0KLSAgew0KLSEgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBMT0cgPSBMb2dGYWN0b3J5LmdldExvZyhEZWZhdWx0TXVsdGlwYXJ0RGVjb2Rlci5jbGFzcyk7DQotISANCi0hICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNVUxUSVBBUlRfRk9STV9EQVRBX0NPTlRFTlRfVFlQRSA9ICJtdWx0aXBhcnQvZm9ybS1kYXRhIjsNCi0hIA0KLSEgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBRVU9URSA9ICJcIiI7DQotISANCi0hICAgICBwcml2YXRlIE1hcCBwYXJ0TWFwID0gbmV3IEhhc2hNYXAoKTsNCi0hIA0KLSEgICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc011bHRpcGFydFJlcXVlc3QoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpDQotISAgICAgew0KLSEgICAgICAgICBTdHJpbmcgY29udGVudFR5cGUgPSByZXF1ZXN0LmdldENvbnRlbnRUeXBlKCk7DQotISANCi0hICAgICAgICAgaWYgKGNvbnRlbnRUeXBlID09IG51bGwpDQotISAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotISANCi0hICAgICAgICAgcmV0dXJuIGNvbnRlbnRUeXBlLnN0YXJ0c1dpdGgoTVVMVElQQVJUX0ZPUk1fREFUQV9DT05URU5UX1RZUEUpOw0KLSEgICAgIH0NCi0hIA0KLSEgICAgIHByaXZhdGUgdm9pZCBjbG9zZShJbnB1dFN0cmVhbSBzdHJlYW0pDQotISAgICAgew0KLSEgICAgICAgICB0cnkNCi0hICAgICAgICAgew0KLSEgICAgICAgICAgICAgaWYgKHN0cmVhbSAhPSBudWxsKQ0KLSEgICAgICAgICAgICAgICAgIHN0cmVhbS5jbG9zZSgpOw0KLSEgICAgICAgICB9DQotISAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBleCkNCi0hICAgICAgICAgew0KLSEgICAgICAgICAgICAgLy8gSWdub3JlLg0KLSEgICAgICAgICB9DQotISAgICAgfQ0KLSEgDQotISAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJPVU5EQVJZID0gImJvdW5kYXJ5PSI7DQotISANCi0hICAgICBwdWJsaWMgdm9pZCBkZWNvZGUoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpDQotISAgICAgew0KLSEgICAgICAgICBpZiAoIWlzTXVsdGlwYXJ0UmVxdWVzdChyZXF1ZXN0KSkNCi0hICAgICAgICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24oDQotISAgICAgICAgICAgICAgICAgVGFwZXN0cnkuZ2V0U3RyaW5nKA0KLSEgICAgICAgICAgICAgICAgICAgICAiTXVsdGlwYXJ0RGVjb2Rlci53cm9uZy1jb250ZW50LXR5cGUiLA0KLSEgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmdldENvbnRlbnRUeXBlKCkpKTsNCi0hIA0KLSEgICAgICAgICBTdHJpbmcgY29udGVudFR5cGUgPSByZXF1ZXN0LmdldENvbnRlbnRUeXBlKCk7DQotISAgICAgICAgIGludCBwb3MgPSBjb250ZW50VHlwZS5pbmRleE9mKEJPVU5EQVJZKTsNCi0hIA0KLSEgICAgICAgICBTdHJpbmcgYm91bmRhcnlTdHJpbmcgPSAiLS0iICsgY29udGVudFR5cGUuc3Vic3RyaW5nKHBvcyArIEJPVU5EQVJZLmxlbmd0aCgpKTsNCi0hICAgICAgICAgYnl0ZVtdIGJvdW5kYXJ5ID0gKGJvdW5kYXJ5U3RyaW5nICsgIi0tIikuZ2V0Qnl0ZXMoKTsNCi0hIA0KLSEgICAgICAgICBMaW5lSW5wdXQgaW5wdXQgPSBudWxsOw0KLSEgDQotISAgICAgICAgIHRyeQ0KLSEgICAgICAgICB7DQotISAgICAgICAgICAgICBpbnB1dCA9IG5ldyBMaW5lSW5wdXQocmVxdWVzdC5nZXRJbnB1dFN0cmVhbSgpKTsNCi0hIA0KLSEgICAgICAgICAgICAgY2hlY2tGb3JJbml0aWFsQm91bmRhcnkoaW5wdXQsIGJvdW5kYXJ5U3RyaW5nKTsNCi0hIA0KLSEgICAgICAgICAgICAgYm9vbGVhbiBsYXN0ID0gZmFsc2U7DQotISANCi0hICAgICAgICAgICAgIHdoaWxlICghbGFzdCkNCi0hICAgICAgICAgICAgIHsNCi0hICAgICAgICAgICAgICAgICBsYXN0ID0gcmVhZE5leHRQYXJ0KGlucHV0LCBib3VuZGFyeSk7DQotISAgICAgICAgICAgICB9DQotISAgICAgICAgIH0NCi0hICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGV4KQ0KLSEgICAgICAgICB7DQotISAgICAgICAgICAgICBMT0cuZXJyb3IoDQotISAgICAgICAgICAgICAgICAgVGFwZXN0cnkuZ2V0U3RyaW5nKCJNdWx0aXBhcnREZWNvZGVyLmlvLWV4Y2VwdGlvbi1yZWFkaW5nLWlucHV0IiwgZXguZ2V0TWVzc2FnZSgpKSwNCi0hICAgICAgICAgICAgICAgICBleCk7DQotISANCi0hICAgICAgICAgICAgIC8vIENsZWFudXAgYW55IHBhcnRpYWwgdXBsb2FkIGZpbGVzLg0KLSEgDQotISAgICAgICAgICAgICBjbGVhbnVwKCk7DQotISANCi0hICAgICAgICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24oZXgpOw0KLSEgICAgICAgICB9DQotISAgICAgICAgIGZpbmFsbHkNCi0hICAgICAgICAgew0KLSEgICAgICAgICAgICAgLy8JCWNsb3NlKGlucHV0KTsNCi0hICAgICAgICAgfQ0KLSEgDQotISAgICAgfQ0KLSEgDQotISAgICAgcHJpdmF0ZSB2b2lkIGNoZWNrRm9ySW5pdGlhbEJvdW5kYXJ5KExpbmVJbnB1dCBpbnB1dCwgU3RyaW5nIGJvdW5kYXJ5KSB0aHJvd3MgSU9FeGNlcHRpb24NCi0hICAgICB7DQotISAgICAgICAgIFN0cmluZyBsaW5lID0gaW5wdXQucmVhZExpbmUoKTsNCi0hIA0KLSEgICAgICAgICBpZiAobGluZSAhPSBudWxsICYmIGxpbmUuZXF1YWxzKGJvdW5kYXJ5KSkNCi0hICAgICAgICAgICAgIHJldHVybjsNCi0hIA0KLSEgICAgICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uKA0KLSEgICAgICAgICAgICAgVGFwZXN0cnkuZ2V0U3RyaW5nKCJNdWx0aXBhcnREZWNvZGVyLm1pc3NpbmctaW5pdGlhbC1ib3VuZGFyeSIpKTsNCi0hICAgICB9DQotISANCi0hICAgICBwcml2YXRlIGJvb2xlYW4gcmVhZE5leHRQYXJ0KExpbmVJbnB1dCBpbnB1dCwgYnl0ZVtdIGJvdW5kYXJ5KSB0aHJvd3MgSU9FeGNlcHRpb24NCi0hICAgICB7DQotISAgICAgICAgIFN0cmluZyBkaXNwb3NpdGlvbiA9IG51bGw7DQotISAgICAgICAgIFN0cmluZyBjb250ZW50VHlwZSA9IG51bGw7DQotISANCi0hICAgICAgICAgLy8gRmlyc3QgcmVhZCB0aGUgdmFyaW91cyBoZWFkZXJzIChiZWZvcmUgdGhlIGNvbnRlbnQpDQotISANCi0hICAgICAgICAgd2hpbGUgKHRydWUpDQotISAgICAgICAgIHsNCi0hICAgICAgICAgICAgIFN0cmluZyBsaW5lID0gaW5wdXQucmVhZExpbmUoKTsNCi0hIA0KLSEgICAgICAgICAgICAgaWYgKGxpbmUgPT0gbnVsbCB8fCBsaW5lLmxlbmd0aCgpID09IDApDQotISAgICAgICAgICAgICAgICAgYnJlYWs7DQotISANCi0hICAgICAgICAgICAgIGludCBjb2xvbnggPSBsaW5lLmluZGV4T2YoJzonKTsNCi0hIA0KLSEgICAgICAgICAgICAgaWYgKGNvbG9ueCA+IDApDQotISAgICAgICAgICAgICB7DQotISAgICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IGxpbmUuc3Vic3RyaW5nKDAsIGNvbG9ueCkudG9Mb3dlckNhc2UoKTsNCi0hIA0KLSEgICAgICAgICAgICAgICAgIGlmIChrZXkuZXF1YWxzKCJjb250ZW50LWRpc3Bvc2l0aW9uIikpDQotISAgICAgICAgICAgICAgICAgew0KLSEgICAgICAgICAgICAgICAgICAgICBkaXNwb3NpdGlvbiA9IGxpbmUuc3Vic3RyaW5nKGNvbG9ueCArIDEpLnRyaW0oKTsNCi0hICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotISAgICAgICAgICAgICAgICAgfQ0KLSEgDQotISAgICAgICAgICAgICAgICAgaWYgKGtleS5lcXVhbHMoImNvbnRlbnQtdHlwZSIpKQ0KLSEgICAgICAgICAgICAgICAgIHsNCi0hICAgICAgICAgICAgICAgICAgICAgY29udGVudFR5cGUgPSBsaW5lLnN1YnN0cmluZyhjb2xvbnggKyAxKS50cmltKCk7DQotISAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSEgICAgICAgICAgICAgICAgIH0NCi0hICAgICAgICAgICAgIH0NCi0hIA0KLSEgICAgICAgICB9DQotISANCi0hICAgICAgICAgaWYgKGRpc3Bvc2l0aW9uID09IG51bGwpDQotISAgICAgICAgICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uKA0KLSEgICAgICAgICAgICAgICAgIFRhcGVzdHJ5LmdldFN0cmluZygiTXVsdGlwYXJ0RGVjb2Rlci5taXNzaW5nLWNvbnRlbnQtZGlzcG9zaXRpb24iKSk7DQotISANCi0hICAgICAgICAgTWFwIGRpc3Bvc2l0aW9uTWFwID0gZXhwbG9kZURpc3Bvc2l0aW9uKGRpc3Bvc2l0aW9uKTsNCi0hICAgICAgICAgU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBkaXNwb3NpdGlvbk1hcC5nZXQoIm5hbWUiKTsNCi0hIA0KLSEgICAgICAgICBpZiAoVGFwZXN0cnkuaXNOdWxsKG5hbWUpKQ0KLSEgICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbigNCi0hICAgICAgICAgICAgICAgICBUYXBlc3RyeS5nZXRTdHJpbmcoIk11bHRpcGFydERlY29kZXIuaW52YWxpZC1jb250ZW50LWRpc3Bvc2l0aW9uIiwgZGlzcG9zaXRpb24pKTsNCi0hIA0KLSEgICAgICAgICBpZiAoIWRpc3Bvc2l0aW9uTWFwLmNvbnRhaW5zS2V5KCJmaWxlbmFtZSIpKQ0KLSEgICAgICAgICAgICAgcmV0dXJuIHJlYWRWYWx1ZVBhcnQoaW5wdXQsIGJvdW5kYXJ5LCBuYW1lKTsNCi0hIA0KLSEgICAgICAgICBTdHJpbmcgZmlsZU5hbWUgPSAoU3RyaW5nKSBkaXNwb3NpdGlvbk1hcC5nZXQoImZpbGVuYW1lIik7DQotISANCi0hICAgICAgICAgcmV0dXJuIHJlYWRGaWxlUGFydChpbnB1dCwgYm91bmRhcnksIG5hbWUsIGZpbGVOYW1lLCBjb250ZW50VHlwZSk7DQotISAgICAgfQ0KLSEgDQotISAgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nU3BsaXR0ZXIgc3BsaXR0ZXIgPSBuZXcgU3RyaW5nU3BsaXR0ZXIoJzsnKTsNCi0hIA0KLSEgICAgIHByaXZhdGUgTWFwIGV4cGxvZGVEaXNwb3NpdGlvbihTdHJpbmcgZGlzcG9zaXRpb24pDQotISAgICAgew0KLSEgICAgICAgICBNYXAgcmVzdWx0ID0gbmV3IEhhc2hNYXAoKTsNCi0hIA0KLSEgICAgICAgICBTdHJpbmdbXSBlbGVtZW50cyA9IHNwbGl0dGVyLnNwbGl0VG9BcnJheShkaXNwb3NpdGlvbik7DQotISANCi0hICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykNCi0hICAgICAgICAgew0KLSEgICAgICAgICAgICAgU3RyaW5nIGVsZW1lbnQgPSBlbGVtZW50c1tpXTsNCi0hICAgICAgICAgICAgIGludCB4ID0gZWxlbWVudC5pbmRleE9mKCc9Jyk7DQotISANCi0hICAgICAgICAgICAgIGlmICh4IDwgMCkNCi0hICAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0hIA0KLSEgICAgICAgICAgICAgU3RyaW5nIGtleSA9IGVsZW1lbnQuc3Vic3RyaW5nKDAsIHgpLnRyaW0oKTsNCi0hICAgICAgICAgICAgIFN0cmluZyByYXdWYWx1ZSA9IGVsZW1lbnQuc3Vic3RyaW5nKHggKyAxKTsNCi0hIA0KLSEgICAgICAgICAgICAgaWYgKCEocmF3VmFsdWUuc3RhcnRzV2l0aChRVU9URSkgJiYgcmF3VmFsdWUuZW5kc1dpdGgoUVVPVEUpKSkNCi0hICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uKA0KLSEgICAgICAgICAgICAgICAgICAgICBUYXBlc3RyeS5nZXRTdHJpbmcoDQotISAgICAgICAgICAgICAgICAgICAgICAgICAiTXVsdGlwYXJ0RGVjb2Rlci5pbnZhbGlkLWNvbnRlbnQtZGlzcG9zaXRpb24iLA0KLSEgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcG9zaXRpb24pKTsNCi0hIA0KLSEgICAgICAgICAgICAgcmVzdWx0LnB1dChrZXksIHJhd1ZhbHVlLnN1YnN0cmluZygxLCByYXdWYWx1ZS5sZW5ndGgoKSAtIDEpKTsNCi0hIA0KLSEgICAgICAgICB9DQotISANCi0hICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0hICAgICB9DQotISANCi0hICAgICBwcml2YXRlIGJvb2xlYW4gcmVhZEZpbGVQYXJ0KA0KLSEgICAgICAgICBMaW5lSW5wdXQgaW5wdXQsDQotISAgICAgICAgIGJ5dGVbXSBib3VuZGFyeSwNCi0hICAgICAgICAgU3RyaW5nIG5hbWUsDQotISAgICAgICAgIFN0cmluZyBmaWxlTmFtZSwNCi0hICAgICAgICAgU3RyaW5nIGNvbnRlbnRUeXBlKQ0KLSEgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24NCi0hICAgICB7DQotISAgICAgICAgIFVwbG9hZE91dHB1dFN0cmVhbSB1cGxvYWRTdHJlYW0gPSBuZXcgVXBsb2FkT3V0cHV0U3RyZWFtKCk7DQotISANCi0hICAgICAgICAgYm9vbGVhbiBsYXN0ID0gcmVhZEludG9TdHJlYW0oaW5wdXQsIGJvdW5kYXJ5LCB1cGxvYWRTdHJlYW0pOw0KLSEgDQotISAgICAgICAgIHVwbG9hZFN0cmVhbS5jbG9zZSgpOw0KLSEgDQotISAgICAgICAgIEZpbGUgZmlsZSA9IHVwbG9hZFN0cmVhbS5nZXRDb250ZW50RmlsZSgpOw0KLSEgDQotISAgICAgICAgIFVwbG9hZFBhcnQgcDsNCi0hIA0KLSEgICAgICAgICBpZiAoTE9HLmlzRGVidWdFbmFibGVkKCkpDQotISAgICAgICAgICAgICBMT0cuZGVidWcoIlJlYWQgZmlsZSBwYXJ0ICciICsgbmFtZSArICInLiIpOw0KLSEgDQotISAgICAgICAgIGlmIChmaWxlICE9IG51bGwpDQotISAgICAgICAgICAgICBwID0gbmV3IFVwbG9hZFBhcnQoZmlsZU5hbWUsIGNvbnRlbnRUeXBlLCBmaWxlKTsNCi0hICAgICAgICAgZWxzZQ0KLSEgICAgICAgICAgICAgcCA9IG5ldyBVcGxvYWRQYXJ0KGZpbGVOYW1lLCBjb250ZW50VHlwZSwgdXBsb2FkU3RyZWFtLmdldENvbnRlbnQoKSk7DQotISANCi0hICAgICAgICAgcGFydE1hcC5wdXQobmFtZSwgcCk7DQotISANCi0hICAgICAgICAgcmV0dXJuIGxhc3Q7DQotISAgICAgfQ0KLSEgDQotISAgICAgcHJpdmF0ZSBib29sZWFuIHJlYWRWYWx1ZVBhcnQoTGluZUlucHV0IGlucHV0LCBieXRlW10gYm91bmRhcnksIFN0cmluZyBuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24NCi0hICAgICB7DQotISAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOw0KLSEgDQotISAgICAgICAgIGJvb2xlYW4gbGFzdCA9IHJlYWRJbnRvU3RyZWFtKGlucHV0LCBib3VuZGFyeSwgYmFvcyk7DQotISANCi0hICAgICAgICAgYmFvcy5jbG9zZSgpOw0KLSEgDQotISAgICAgICAgIFN0cmluZyB2YWx1ZSA9IGJhb3MudG9TdHJpbmcoKTsNCi0hIA0KLSEgICAgICAgICBpZiAoTE9HLmlzRGVidWdFbmFibGVkKCkpDQotISAgICAgICAgICAgICBMT0cuZGVidWcoIlJlYWQgdmFsdWUgcGFydCAnIiArIG5hbWUgKyAiJyB3aXRoIHZhbHVlOiAiICsgdmFsdWUpOw0KLSEgDQotISAgICAgICAgIFZhbHVlUGFydCBwID0gKFZhbHVlUGFydCkgcGFydE1hcC5nZXQobmFtZSk7DQotISANCi0hICAgICAgICAgaWYgKHAgPT0gbnVsbCkNCi0hICAgICAgICAgew0KLSEgICAgICAgICAgICAgcCA9IG5ldyBWYWx1ZVBhcnQodmFsdWUpOw0KLSEgICAgICAgICAgICAgcGFydE1hcC5wdXQobmFtZSwgcCk7DQotISAgICAgICAgIH0NCi0hICAgICAgICAgZWxzZQ0KLSEgICAgICAgICAgICAgcC5hZGQodmFsdWUpOw0KLSEgDQotISAgICAgICAgIHJldHVybiBsYXN0Ow0KLSEgICAgIH0NCi0hIA0KLSEgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDUiA9IDEzOw0KLSEgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMRiA9IDEwOw0KLSEgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTUEVDSUFMID0gLTI7DQotISANCi0hICAgICAvKioNCi0hICAgICAgKiAgQ29waWVzIHRoZSBpbnB1dCBzdHJlYW0gaW50byB0aGUgb3V0cHV0IHN0cmVhbSwgc3RvcHBpbmcgb25jZSB0aGUgYm91bmRhcnkgaXMgc2Vlbg0KLSEgICAgICAqICAodGhlIGJvdW5kYXJ5IGlzIG5vdCBjb3BpZWQpLiAgUmV0dXJucyB0cnVlIHdoZW4gdGhlIGlucHV0IHN0cmVhbSBpcyBleGhhdXN0ZWQsDQotISAgICAgICogIGZhbHNlIG90aGVyd2lzZS4NCi0hICAgICAgKiANCi0hICAgICAgKiAgVGhpcyBpcyBhbiB1Z2x5IGN1dCBhbmQgcGFzdCBvZiB1Z2x5IGNvZGUgZnJvbSBKZXR0eS4gIFRoaXMgcmVhbGx5IG5lZWRzIHRvIGJlIGZpeGVkIQ0KLSEgICAgICAqIA0KLSEgICAgICAqKi8NCi0hIA0KLSEgICAgIHByaXZhdGUgYm9vbGVhbiByZWFkSW50b1N0cmVhbShMaW5lSW5wdXQgaW5wdXQsIGJ5dGVbXSBib3VuZGFyeSwgT3V0cHV0U3RyZWFtIHN0cmVhbSkNCi0hICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uDQotISAgICAgew0KLSEgICAgICAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOw0KLSEgICAgICAgICBpbnQgYyA9IDA7DQotISAgICAgICAgIGJvb2xlYW4gY3IgPSBmYWxzZTsNCi0hICAgICAgICAgYm9vbGVhbiBsZiA9IGZhbHNlOw0KLSEgICAgICAgICBpbnQgX2NoYXIgPSBTUEVDSUFMOw0KLSEgICAgICAgICBib29sZWFuIG1vcmUgPSB0cnVlOw0KLSEgDQotISAgICAgICAgIHdoaWxlICh0cnVlKQ0KLSEgICAgICAgICB7DQotISAgICAgICAgICAgICBpbnQgYiA9IDA7DQotISANCi0hICAgICAgICAgICAgIHdoaWxlIChtb3JlKQ0KLSEgICAgICAgICAgICAgew0KLSEgICAgICAgICAgICAgICAgIGMgPSAoX2NoYXIgIT0gU1BFQ0lBTCkgPyBfY2hhciA6IGlucHV0LnJlYWQoKTsNCi0hIA0KLSEgICAgICAgICAgICAgICAgIGlmIChjID09IC0xKQ0KLSEgICAgICAgICAgICAgICAgIHsNCi0hICAgICAgICAgICAgICAgICAgICAgbW9yZSA9IGZhbHNlOw0KLSEgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0hICAgICAgICAgICAgICAgICB9DQotISANCi0hICAgICAgICAgICAgICAgICBfY2hhciA9IFNQRUNJQUw7DQotISANCi0hICAgICAgICAgICAgICAgICAvLyBsb29rIGZvciBDUiBhbmQvb3IgTEYNCi0hICAgICAgICAgICAgICAgICBpZiAoYyA9PSBDUiB8fCBjID09IExGKQ0KLSEgICAgICAgICAgICAgICAgIHsNCi0hICAgICAgICAgICAgICAgICAgICAgaWYgKGMgPT0gQ1IpDQotISAgICAgICAgICAgICAgICAgICAgICAgICBfY2hhciA9IGlucHV0LnJlYWQoKTsNCi0hICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotISAgICAgICAgICAgICAgICAgfQ0KLSEgDQotISAgICAgICAgICAgICAgICAgLy8gbG9vayBmb3IgYm91bmRhcnkNCi0hICAgICAgICAgICAgICAgICBpZiAoYiA+PSAwICYmIGIgPCBib3VuZGFyeS5sZW5ndGggJiYgYyA9PSBib3VuZGFyeVtiXSkNCi0hICAgICAgICAgICAgICAgICAgICAgYisrOw0KLSEgICAgICAgICAgICAgICAgIGVsc2UNCi0hICAgICAgICAgICAgICAgICB7DQotISAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgbm90IGEgYm91bmRhcnkNCi0hICAgICAgICAgICAgICAgICAgICAgaWYgKGNyKQ0KLSEgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLndyaXRlKENSKTsNCi0hICAgICAgICAgICAgICAgICAgICAgaWYgKGxmKQ0KLSEgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLndyaXRlKExGKTsNCi0hICAgICAgICAgICAgICAgICAgICAgY3IgPSBsZiA9IGZhbHNlOw0KLSEgDQotISAgICAgICAgICAgICAgICAgICAgIGlmIChiID4gMCkNCi0hICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS53cml0ZShib3VuZGFyeSwgMCwgYik7DQotISAgICAgICAgICAgICAgICAgICAgIGIgPSAtMTsNCi0hIA0KLSEgICAgICAgICAgICAgICAgICAgICBzdHJlYW0ud3JpdGUoYyk7DQotISAgICAgICAgICAgICAgICAgfQ0KLSEgICAgICAgICAgICAgfQ0KLSEgDQotISAgICAgICAgICAgICAvLyBjaGVjayBwYXJ0aWFsIGJvdW5kYXJ5DQotISAgICAgICAgICAgICBpZiAoKGIgPiAwICYmIGIgPCBib3VuZGFyeS5sZW5ndGggLSAyKSB8fCAoYiA9PSBib3VuZGFyeS5sZW5ndGggLSAxKSkNCi0hICAgICAgICAgICAgIHsNCi0hICAgICAgICAgICAgICAgICBzdHJlYW0ud3JpdGUoYm91bmRhcnksIDAsIGIpOw0KLSEgICAgICAgICAgICAgICAgIGIgPSAtMTsNCi0hICAgICAgICAgICAgIH0NCi0hIA0KLSEgICAgICAgICAgICAgLy8gYm91bmRhcnkgbWF0Y2gNCi0hICAgICAgICAgICAgIGlmIChiID4gMCB8fCBjID09IC0xKQ0KLSEgICAgICAgICAgICAgew0KLSEgICAgICAgICAgICAgICAgIGlmIChiID09IGJvdW5kYXJ5Lmxlbmd0aCkNCi0hICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTsNCi0hIA0KLSEgICAgICAgICAgICAgICAgIGlmIChfY2hhciA9PSBMRikNCi0hICAgICAgICAgICAgICAgICAgICAgX2NoYXIgPSBTUEVDSUFMOw0KLSEgDQotISAgICAgICAgICAgICAgICAgYnJlYWs7DQotISAgICAgICAgICAgICB9DQotISANCi0hICAgICAgICAgICAgIC8vIGhhbmRsZSBDUiBMRg0KLSEgICAgICAgICAgICAgaWYgKGNyKQ0KLSEgICAgICAgICAgICAgICAgIHN0cmVhbS53cml0ZShDUik7DQotISAgICAgICAgICAgICBpZiAobGYpDQotISAgICAgICAgICAgICAgICAgc3RyZWFtLndyaXRlKExGKTsNCi0hIA0KLSEgICAgICAgICAgICAgY3IgPSAoYyA9PSBDUik7DQotISAgICAgICAgICAgICBsZiA9IChjID09IExGIHx8IF9jaGFyID09IExGKTsNCi0hIA0KLSEgICAgICAgICAgICAgaWYgKF9jaGFyID09IExGKQ0KLSEgICAgICAgICAgICAgICAgIF9jaGFyID0gU1BFQ0lBTDsNCi0hICAgICAgICAgfQ0KLSEgDQotISAgICAgICAgIHJldHVybiByZXN1bHQ7DQotISAgICAgfQ0KLSAgDQotICAgICAgLyoqDQotICAgICAgICogIEludm9rZXMge0BsaW5rIElQYXJ0I2NsZWFudXAoKX0gb24gZWFjaCBwYXJ0Lg0KLSAgICAgICAqIA0KLSAgICAgICAqKi8NCi0tIA0KLSAgICAgIHB1YmxpYyB2b2lkIGNsZWFudXAoKQ0KLSAgICAgIHsNCi0hICAgICAgICAgSXRlcmF0b3IgaSA9IHBhcnRNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsNCi0gICAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKQ0KLSAgICAgICAgICB7DQotICAgICAgICAgICAgICBJUGFydCBwYXJ0ID0gKElQYXJ0KSBpLm5leHQoKTsNCi0gICAgICAgICAgICAgIHBhcnQuY2xlYW51cCgpOw0KLSAgICAgICAgICB9DQotICAgICAgfQ0KLSAgDQotISAgICAgcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIG5hbWUpDQotISAgICAgew0KLSEgICAgICAgICBWYWx1ZVBhcnQgcCA9IChWYWx1ZVBhcnQpIHBhcnRNYXAuZ2V0KG5hbWUpOw0KLSEgDQotISAgICAgICAgIGlmIChwID09IG51bGwpDQotISAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0hIA0KLSEgICAgICAgICByZXR1cm4gcC5nZXRWYWx1ZSgpOw0KLSEgICAgIH0NCi0hIA0KLSEgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRTdHJpbmdzKFN0cmluZyBuYW1lKQ0KLSEgICAgIHsNCi0hICAgICAgICAgVmFsdWVQYXJ0IHAgPSAoVmFsdWVQYXJ0KSBwYXJ0TWFwLmdldChuYW1lKTsNCi0hIA0KLSEgICAgICAgICBpZiAocCA9PSBudWxsKQ0KLSEgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotISANCi0hICAgICAgICAgcmV0dXJuIHAuZ2V0VmFsdWVzKCk7DQotISAgICAgfQ0KLSEgDQotISAgICAgcHVibGljIElVcGxvYWRGaWxlIGdldFVwbG9hZEZpbGUoU3RyaW5nIG5hbWUpDQotISAgICAgew0KLSEgICAgICAgICByZXR1cm4gKFVwbG9hZFBhcnQpIHBhcnRNYXAuZ2V0KG5hbWUpOw0KLSEgICAgIH0NCi0hIH0NCi1cIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUNCi0tLS0gNzUsMjY2IC0tLS0NCi0gICAqICBmaWxlIHVwbG9hZHMgYW5kIG11bHRpLXZhbHVlZCBwYXJhbWV0ZXJzLiAgQWZ0ZXIgZGVjb2RpbmcsIHRoZSBjbGFzcyBpcyB1c2VkDQotICAgKiAgdG8gYWNjZXNzIHRoZSBwYXJhbWV0ZXIgdmFsdWVzLg0KLSAgICogDQotISAgKiAgPHA+VGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBhIHRoaW4gd3JhcHBlciBhcm91bmQgdGhlIEFwYWNoZSBKYWthcnRhDQotISAgKiAgPGEgaHJlZj0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9jb21tb25zL2ZpbGV1cGxvYWQvIj5GaWxlVXBsb2FkPC9hPi4gDQotICAgKiAgDQotICAgKiAgPHA+U3VwcG9ydHMgc2luZ2xlIHZhbHVlZCBwYXJhbWV0ZXJzLCBtdWx0aS12YWx1ZWQgcGFyYW1ldGVycyBhbmQgaW5kaXZpZHVhbA0KLSAgICogIGZpbGUgdXBsb2Fkcy4gIFRoYXQgaXMsIGZvciBmaWxlIHVwbG9hZHMsIGVhY2ggdXBsb2FkIG11c3QgYmUgYSB1bmlxdWUgcGFyYW1ldGVyDQotISAgKiAgKHRoYXQgaXMgYWxsIHRoZSB7QGxpbmsgbmV0LnNmLnRhcGVzdHJ5LmZvcm0uVXBsb2FkfSBjb21wb25lbnQgbmVlZHMpLg0KLSAgDQotICAgKg0KLSEgICogIEBhdXRob3IgSm9lIFBhbmljbw0KLSEgICogIEB2ZXJzaW9uICRJZDogRGVmYXVsdE11bHRpcGFydERlY29kZXIuamF2YSx2IDEuMSAyMDAzLzAxLzE2IDAwOjUzOjU2IGhsc2hpcCBFeHAgJA0KLSAgICogIEBzaW5jZSAyLjAuMQ0KLSAgICoNCi0gICAqKi8NCi0hIHB1YmxpYyBjbGFzcyBEZWZhdWx0TXVsdGlwYXJ0RGVjb2Rlcg0KLSEgCWV4dGVuZHMgT2JqZWN0DQotISAJaW1wbGVtZW50cyBJTXVsdGlwYXJ0RGVjb2Rlcg0KLSAgew0KLSEgCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfTUFYX1NJWkUgPSAxMDAwMDAwMDsNCi0hIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1RIUkVTSE9MRF9TSVpFID0gMTAyNDsNCi0hIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1JFUE9TSVRPUllfUEFUSCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5pby50bXBkaXIiKTsNCi0hIAkgCQ0KLSEgCXByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBMT0cgPQ0KLSEgCQlMb2dGYWN0b3J5LmdldExvZyhEZWZhdWx0TXVsdGlwYXJ0RGVjb2Rlci5jbGFzcyk7DQotISAJCQ0KLSEgCXByaXZhdGUgc3RhdGljIGludCBfbWF4U2l6ZSA9IERFRkFVTFRfTUFYX1NJWkU7DQotISAJcHJpdmF0ZSBzdGF0aWMgaW50IF90aHJlc2hvbGRTaXplID0gREVGQVVMVF9USFJFU0hPTERfU0laRTsNCi0hIAlwcml2YXRlIHN0YXRpYyBTdHJpbmcgX3JlcG9zaXRvcnlQYXRoID0gREVGQVVMVF9SRVBPU0lUT1JZX1BBVEg7DQotISAJDQotISAJcHJpdmF0ZSBNYXAgX3BhcnRNYXAgPSBuZXcgSGFzaE1hcCgpOw0KLSEgDQotISANCi0hIAlwdWJsaWMgc3RhdGljIHZvaWQgc2V0TWF4U2l6ZShpbnQgbWF4U2l6ZSkNCi0hIAl7DQotISAJCV9tYXhTaXplID0gbWF4U2l6ZTsNCi0hIAl9DQotISAJDQotISAJcHVibGljIHN0YXRpYyBpbnQgZ2V0TWF4U2l6ZSgpDQotISAJew0KLSEgCQlyZXR1cm4gX21heFNpemU7DQotISAJfQ0KLSEgCQ0KLSEgCXB1YmxpYyBzdGF0aWMgIHZvaWQgc2V0VGhyZXNob2xkU2l6ZShpbnQgdGhyZXNob2xkU2l6ZSkNCi0hIAl7DQotISAJCV90aHJlc2hvbGRTaXplID0gdGhyZXNob2xkU2l6ZTsNCi0hIAl9DQotISAJDQotISAJcHVibGljIHN0YXRpYyBpbnQgZ2V0VGhyZXNob2xkU2l6ZSgpDQotISAJew0KLSEgCQlyZXR1cm4gX3RocmVzaG9sZFNpemU7DQotISAJfQ0KLSEgCQ0KLSEgCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRSZXBvc2l0b3J5UGF0aChTdHJpbmcgcmVwb3NpdG9yeVBhdGgpDQotISAJew0KLSEgCQlfcmVwb3NpdG9yeVBhdGggPSByZXBvc2l0b3J5UGF0aDsNCi0hIAl9DQotISAJDQotISAJcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVwb3NpdG9yeVBhdGgoKQ0KLSEgCXsNCi0hIAkJcmV0dXJuIF9yZXBvc2l0b3J5UGF0aDsNCi0hIAl9DQotISAJDQotISAJcHVibGljIHN0YXRpYyBib29sZWFuIGlzTXVsdGlwYXJ0UmVxdWVzdChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkNCi0hIAl7DQotISAJCXJldHVybiBGaWxlVXBsb2FkLmlzTXVsdGlwYXJ0Q29udGVudChyZXF1ZXN0KTsNCi0hIAl9DQotICANCi0gICAgICAvKioNCi0gICAgICAgKiAgSW52b2tlcyB7QGxpbmsgSVBhcnQjY2xlYW51cCgpfSBvbiBlYWNoIHBhcnQuDQotICAgICAgICogDQotICAgICAgICoqLw0KLSAgICAgIHB1YmxpYyB2b2lkIGNsZWFudXAoKQ0KLSAgICAgIHsNCi0hICAgICAgICAgSXRlcmF0b3IgaSA9IF9wYXJ0TWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7DQotICAgICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkNCi0gICAgICAgICAgew0KLSAgICAgICAgICAgICAgSVBhcnQgcGFydCA9IChJUGFydCkgaS5uZXh0KCk7DQotICAgICAgICAgICAgICBwYXJ0LmNsZWFudXAoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgIH0NCi0rIAkNCi0rIAkvKioNCi0rIAkgKiBAc2VlIG5ldC5zZi50YXBlc3RyeS5tdWx0aXBhcnQuSU11bHRpcGFydERlY29kZXIjZGVjb2RlKEh0dHBTZXJ2bGV0UmVxdWVzdCkNCi0rIAkgKiANCi0rIAkgKiBAdGhyb3dzIEFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbiBpZiBkZWNvZGUgZmFpbHMsIGZvciBpbnN0YW5jZSB0aGUNCi0rIAkgKiByZXF1ZXN0IGV4Y2VlZHMgZ2V0TWF4U2l6ZSgpDQotKyAJICovDQotKyAJcHVibGljIHZvaWQgZGVjb2RlKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KQ0KLSsgCXsNCi0rIAkJaWYgKHJlcXVlc3QgIT0gbnVsbCkNCi0rIAkJew0KLSsgCQkJdHJ5DQotKyAJCQl7DQotKyAJCQkJRmlsZVVwbG9hZCBhRmlsZVVwbG9hZCA9IG5ldyBGaWxlVXBsb2FkKCk7DQotKyANCi0rIAkJCQlhRmlsZVVwbG9hZC5zZXRTaXplTWF4KF9tYXhTaXplKTsNCi0rIAkJCQlhRmlsZVVwbG9hZC5zZXRTaXplVGhyZXNob2xkKF90aHJlc2hvbGRTaXplKTsNCi0rIAkJCQlhRmlsZVVwbG9hZC5zZXRSZXBvc2l0b3J5UGF0aChfcmVwb3NpdG9yeVBhdGgpOw0KLSsgDQotKyAJCQkJTGlzdCBzb21lUGFydHMgPSBhRmlsZVVwbG9hZC5wYXJzZVJlcXVlc3QocmVxdWVzdCk7DQotKyANCi0rIAkJCQlpZiAoKHNvbWVQYXJ0cyAhPSBudWxsKSAmJiAoc29tZVBhcnRzLnNpemUoKSA+IDApKQ0KLSsgCQkJCXsNCi0rIAkJCQkJSXRlcmF0b3IgYVBhcnRJdGVyYXRvciA9IHNvbWVQYXJ0cy5pdGVyYXRvcigpOw0KLSsgCQkJCQl3aGlsZSAoYVBhcnRJdGVyYXRvci5oYXNOZXh0KCkpDQotKyAJCQkJCXsNCi0rIAkJCQkJCUZpbGVJdGVtIGFQYXJ0ID0gKEZpbGVJdGVtKSBhUGFydEl0ZXJhdG9yLm5leHQoKTsNCi0rIAkJCQkJCWlmIChhUGFydC5pc0Zvcm1GaWVsZCgpKQ0KLSsgCQkJCQkJew0KLSsgCQkJCQkJCVN0cmluZyBhUGFydE5hbWUgPSBhUGFydC5nZXRGaWVsZE5hbWUoKTsNCi0rIAkJCQkJCQlWYWx1ZVBhcnQgYVZhbHVlUGFydCA9IChWYWx1ZVBhcnQpIF9wYXJ0TWFwLmdldChhUGFydE5hbWUpOw0KLSsgCQkJCQkJCWlmIChhVmFsdWVQYXJ0ICE9IG51bGwpDQotKyAJCQkJCQkJew0KLSsgCQkJCQkJCQlhVmFsdWVQYXJ0LmFkZChhUGFydC5nZXRTdHJpbmcoKSk7DQotKyAJCQkJCQkJfQ0KLSsgCQkJCQkJCWVsc2UNCi0rIAkJCQkJCQl7DQotKyAJCQkJCQkJCWFWYWx1ZVBhcnQgPSBuZXcgVmFsdWVQYXJ0KGFQYXJ0LmdldFN0cmluZygpKTsNCi0rIAkJCQkJCQkJX3BhcnRNYXAucHV0KGFQYXJ0TmFtZSwgYVZhbHVlUGFydCk7DQotKyAJCQkJCQkJfQ0KLSsgCQkJCQkJfQ0KLSsgCQkJCQkJZWxzZQ0KLSsgCQkJCQkJew0KLSsgCQkJCQkJCVVwbG9hZFBhcnQgYUZpbGUgPSBuZXcgVXBsb2FkUGFydChhUGFydCk7DQotKyANCi0rIAkJCQkJCQlfcGFydE1hcC5wdXQoYVBhcnQuZ2V0RmllbGROYW1lKCksIGFGaWxlKTsNCi0rIAkJCQkJCX0NCi0rIAkJCQkJfQ0KLSsgCQkJCX0NCi0rIAkJCX0NCi0rIAkJCWNhdGNoIChGaWxlVXBsb2FkRXhjZXB0aW9uIGUpDQotKyAJCQl7DQotKyAJCQkJTE9HLndhcm4oImRlY29kZSIsIGUpOw0KLSsgCQkJCXRocm93IG5ldyBBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24oZSk7DQotKyAJCQl9DQotKyAJCX0NCi0rIA0KLSsgCX0NCi0rIA0KLSsgCS8qKg0KLSsgCSAqIEBzZWUgbmV0LnNmLnRhcGVzdHJ5Lm11bHRpcGFydC5JTXVsdGlwYXJ0RGVjb2RlciNnZXRTdHJpbmcoU3RyaW5nKQ0KLSsgCSAqLw0KLSsgCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBuYW1lKQ0KLSsgCXsNCi0rIAkJU3RyaW5nIGdldFN0cmluZyA9IG51bGw7DQotKyANCi0rIAkJaWYgKG5hbWUgIT0gbnVsbCkNCi0rIAkJew0KLSsgCQkJVmFsdWVQYXJ0IGFQYXJ0ID0gKFZhbHVlUGFydCkgX3BhcnRNYXAuZ2V0KG5hbWUpOw0KLSsgCQkJaWYgKGFQYXJ0ICE9IG51bGwpDQotKyAJCQl7DQotKyAJCQkJZ2V0U3RyaW5nID0gYVBhcnQuZ2V0VmFsdWUoKTsNCi0rIAkJCX0NCi0rIAkJfQ0KLSsgCQlyZXR1cm4gZ2V0U3RyaW5nOw0KLSsgCX0NCi0rIA0KLSsgCS8qKg0KLSsgCSAqIEBzZWUgbmV0LnNmLnRhcGVzdHJ5Lm11bHRpcGFydC5JTXVsdGlwYXJ0RGVjb2RlciNnZXRTdHJpbmdzKFN0cmluZykNCi0rIAkgKi8NCi0rIAlwdWJsaWMgU3RyaW5nW10gZ2V0U3RyaW5ncyhTdHJpbmcgbmFtZSkNCi0rIAl7DQotKyAJCVN0cmluZ1tdIGdldFN0cmluZ3MgPSBudWxsOw0KLSsgDQotKyAJCWlmIChuYW1lICE9IG51bGwpDQotKyAJCXsNCi0rIAkJCVZhbHVlUGFydCBhUGFydCA9IChWYWx1ZVBhcnQpIF9wYXJ0TWFwLmdldChuYW1lKTsNCi0rIAkJCWlmIChhUGFydCAhPSBudWxsKQ0KLSsgCQkJew0KLSsgCQkJCWdldFN0cmluZ3MgPSBhUGFydC5nZXRWYWx1ZXMoKTsNCi0rIAkJCX0NCi0rIAkJfQ0KLSsgCQlyZXR1cm4gZ2V0U3RyaW5nczsNCi0rIAl9DQotKyANCi0rIAkvKioNCi0rIAkgKiBAc2VlIG5ldC5zZi50YXBlc3RyeS5tdWx0aXBhcnQuSU11bHRpcGFydERlY29kZXIjZ2V0VXBsb2FkRmlsZShTdHJpbmcpDQotKyAJICovDQotKyAJcHVibGljIElVcGxvYWRGaWxlIGdldFVwbG9hZEZpbGUoU3RyaW5nIG5hbWUpDQotKyAJew0KLSsgCQlJVXBsb2FkRmlsZSBnZXRVcGxvYWRGaWxlID0gbnVsbDsNCi0rIA0KLSsgCQlpZiAobmFtZSAhPSBudWxsKQ0KLSsgCQl7DQotKyAJCQlnZXRVcGxvYWRGaWxlID0gKElVcGxvYWRGaWxlKSBfcGFydE1hcC5nZXQobmFtZSk7DQotKyAJCX0NCi0rIAkJcmV0dXJuIGdldFVwbG9hZEZpbGU7DQotKyAJfQ0KLSAgDQotISB9DQotSW5kZXg6IFVwbG9hZFBhcnQuamF2YQ0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi1SQ1MgZmlsZTogL2hvbWUvY3ZzcHVibGljL2pha2FydGEtdGFwZXN0cnkvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L211bHRpcGFydC9VcGxvYWRQYXJ0LmphdmEsdg0KLXJldHJpZXZpbmcgcmV2aXNpb24gMS4xDQotZGlmZiAtYyAtcjEuMSBVcGxvYWRQYXJ0LmphdmENCi0qKiogVXBsb2FkUGFydC5qYXZhCTUgTWFyIDIwMDMgMjI6NTk6NDkgLTAwMDAJMS4xDQotLS0tIFVwbG9hZFBhcnQuamF2YQkyMSBNYXIgMjAwMyAyMjo1MToxMSAtMDAwMA0KLSoqKioqKioqKioqKioqKg0KLSoqKiAxLDE5MyAqKioqDQotISAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSEgICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQ0KLSEgICoNCi0hICAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMNCi0hICAqIHJlc2VydmVkLg0KLSEgICoNCi0hICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KLSEgICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zDQotISAgKiBhcmUgbWV0Og0KLSEgICoNCi0hICAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQotISAgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQotISAgKg0KLSEgICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQNCi0hICAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbg0KLSEgICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQ0KLSEgICogICAgZGlzdHJpYnV0aW9uLg0KLSEgICoNCi0hICAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLA0KLSEgICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoNCi0hICAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQ0KLSEgICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vYXBhY2hlLm9yZy8pLiINCi0hICAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwNCi0hICAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuDQotISAgKg0KLSEgICogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iLCAiVGFwZXN0cnkiIA0KLSEgICogICAgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMNCi0hICAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbg0KLSEgICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuDQotISAgKg0KLSEgICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIgDQotISAgKiAgICBvciAiVGFwZXN0cnkiLCBub3IgbWF5ICJBcGFjaGUiIG9yICJUYXBlc3RyeSIgYXBwZWFyIGluIHRoZWlyIA0KLSEgICogICAgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLg0KLSEgICoNCi0hICAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQNCi0hICAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTDQotISAgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQ0KLSEgICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBUQVBFU1RSWSBDT05UUklCVVRPUiBDT01NVU5JVFkNCi0hICAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsDQotISAgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQotISAgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GDQotISAgKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EDQotISAgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwNCi0hICAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVA0KLSEgICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GDQotISAgKiBTVUNIIERBTUFHRS4NCi0hICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotISAgKg0KLSEgICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkNCi0hICAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQ0KLSEgICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlDQotISAgKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uDQotISAgKg0KLSAgICovDQotLSANCi0gIHBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5tdWx0aXBhcnQ7DQotICANCi0tIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOw0KLSAgaW1wb3J0IGphdmEuaW8uRmlsZTsNCi0tIGltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsNCi0gIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLSAgaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07DQotICANCi0gIGltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotICBpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0gIA0KLS0gaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uOw0KLS0gaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuVGFwZXN0cnk7DQotLSBpbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5yZXF1ZXN0LklVcGxvYWRGaWxlOw0KLSAgDQotICAvKioNCi0gICAqICBQb3J0aW9uIG9mIGEgbXVsdGktcGFydCByZXF1ZXN0IHJlcHJlc2VudGluZyBhbiB1cGxvYWRlZCBmaWxlLg0KLSAgICoNCi0hICAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwDQotISAgKiAgQHZlcnNpb24gJElkOiBVcGxvYWRQYXJ0LmphdmEsdiAxLjEgMjAwMy8wMy8wNSAyMjo1OTo0OSBobHNoaXAgRXhwICQNCi0gICAqICBAc2luY2UgMi4wLjENCi0gICAqDQotICAgKiovDQotISANCi0hIHB1YmxpYyBjbGFzcyBVcGxvYWRQYXJ0IGltcGxlbWVudHMgSVVwbG9hZEZpbGUsIElQYXJ0DQotICB7DQotISAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIExPRyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFVwbG9hZFBhcnQuY2xhc3MpOw0KLSAgDQotISAgICAgcHJpdmF0ZSBieXRlW10gX2NvbnRlbnQ7DQotISAgICAgcHJpdmF0ZSBGaWxlIF9jb250ZW50RmlsZTsNCi0hICAgICBwcml2YXRlIFN0cmluZyBfZmlsZVBhdGg7DQotISAgICAgcHJpdmF0ZSBTdHJpbmcgX2NvbnRlbnRUeXBlOw0KLSEgDQotISAgICAgcHVibGljIFVwbG9hZFBhcnQoU3RyaW5nIGZpbGVQYXRoLCBTdHJpbmcgY29udGVudFR5cGUsIGJ5dGVbXSBjb250ZW50KQ0KLSEgICAgIHsNCi0hICAgICAgICAgX2ZpbGVQYXRoID0gZmlsZVBhdGg7DQotISAgICAgICAgIF9jb250ZW50VHlwZSA9IGNvbnRlbnRUeXBlOw0KLSEgICAgICAgICBfY29udGVudCA9IGNvbnRlbnQ7DQotISAgICAgfQ0KLSEgDQotISAgICAgcHVibGljIFVwbG9hZFBhcnQoU3RyaW5nIGZpbGVQYXRoLCBTdHJpbmcgY29udGVudFR5cGUsIEZpbGUgY29udGVudEZpbGUpDQotISAgICAgew0KLSEgICAgICAgICBfZmlsZVBhdGggPSBmaWxlUGF0aDsNCi0hICAgICAgICAgX2NvbnRlbnRUeXBlID0gY29udGVudFR5cGU7ICAgICAgICANCi0hICAgICAgICAgX2NvbnRlbnRGaWxlID0gY29udGVudEZpbGU7DQotISAgICAgfQ0KLSAgDQotICAJLyoqDQotICAJICogIEBzaW5jZSAyLjAuNA0KLSAgCSAqIA0KLSAgCSAqKi8NCi0hIAkNCi0hICAgICBwdWJsaWMgU3RyaW5nIGdldEZpbGVQYXRoKCkNCi0hICAgICB7DQotISAgICAgICAgIHJldHVybiBfZmlsZVBhdGg7DQotISAgICAgfQ0KLSAgDQotICAJLyoqDQotISAJICogIEFsd2F5cyByZXR1cm5zIGZhbHNlLCBhdCBsZWFzdCBzbyBmYXIuICBGdXR1cmUgZW5oYW5jZW1lbnRzDQotISAJICogIG1heSBpbnZvbHZlIHRydW5jYXRpbmcgdGhlIGlucHV0IGlmIGl0IGV4Y2VlZHMgYSBjZXJ0YWluDQotISAJICogIHNpemUgb3IgdXBsb2FkIHRpbWUgKHN1Y2ggdGhpbmdzIG1heSBiZSB1c2VkIGZvciBkZW5pYWwNCi0hIAkgKiAgb2Ygc2VydmljZSBhdHRhY2tzKS4NCi0hIAkgKiANCi0hIAkgKiovDQotISAJDQotISAgICAgcHVibGljIGJvb2xlYW4gaXNUcnVuY2F0ZWQoKQ0KLSEgICAgIHsNCi0hICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSEgICAgIH0NCi0hIA0KLSEgICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRTdHJlYW0oKQ0KLSEgICAgIHsNCi0hICAgICAgICAgaWYgKF9jb250ZW50ICE9IG51bGwpDQotISAgICAgICAgICAgICByZXR1cm4gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKF9jb250ZW50KTsNCi0hIA0KLSEgICAgICAgICB0cnkNCi0hICAgICAgICAgew0KLSEgICAgICAgICAgICAgcmV0dXJuIG5ldyBGaWxlSW5wdXRTdHJlYW0oX2NvbnRlbnRGaWxlKTsNCi0hICAgICAgICAgfQ0KLSEgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZXgpDQotISAgICAgICAgIHsNCi0hICAgICAgICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24oDQotISAgICAgICAgICAgICAgICAgVGFwZXN0cnkuZ2V0U3RyaW5nKA0KLSEgICAgICAgICAgICAgICAgICAgICAiVXBsb2FkUGFydC51bmFibGUtdG8tb3Blbi1jb250ZW50LWZpbGUiLA0KLSEgICAgICAgICAgICAgICAgICAgICBfZmlsZVBhdGgsDQotISAgICAgICAgICAgICAgICAgICAgIF9jb250ZW50RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSksDQotISAgICAgICAgICAgICAgICAgZXgpOw0KLSEgICAgICAgICB9DQotISAgICAgfQ0KLSAgDQotISAgICAgLyoqDQotISAgICAgICogIERlbGV0ZXMgdGhlIGV4dGVybmFsIGNvbnRlbnQgZmlsZSwgaWYgb25lIGV4aXN0cy4NCi0hICAgICAgKiANCi0hICAgICAgKiovDQotICANCi0tICAgICBwdWJsaWMgdm9pZCBjbGVhbnVwKCkNCi0tICAgICB7DQotLSAgICAgICAgIGlmIChfY29udGVudEZpbGUgIT0gbnVsbCkNCi0tICAgICAgICAgew0KLS0gICAgICAgICAgICAgaWYgKExPRy5pc0RlYnVnRW5hYmxlZCgpKQ0KLS0gICAgICAgICAgICAgICAgIExPRy5kZWJ1ZygiRGVsZXRpbmcgdXBsb2FkIGZpbGUgIiArIF9jb250ZW50RmlsZSArICIuIik7DQotLSANCi0tICAgICAgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9IF9jb250ZW50RmlsZS5kZWxldGUoKTsNCi0tIA0KLS0gICAgICAgICAgICAgaWYgKCFzdWNjZXNzKQ0KLS0gICAgICAgICAgICAgICAgIExPRy53YXJuKA0KLS0gICAgICAgICAgICAgICAgICAgICBUYXBlc3RyeS5nZXRTdHJpbmcoDQotLSAgICAgICAgICAgICAgICAgICAgICAgICAiVXBsb2FkUGFydC50ZW1wb3JhcnktZmlsZS1ub3QtZGVsZXRlZCIsDQotLSAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGVudEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpKTsNCi0tIA0KLS0gICAgICAgICAgICAgLy8gSW4gcmFyZSBjYXNlcyAod2hlbiBleGNlcHRpb25zIGFyZSB0aHJvd24gd2hpbGUgdGhlIHJlcXVlc3QNCi0tICAgICAgICAgICAgIC8vIGlzIGRlY29kZWQpLCBjbGVhbnVwKCkgbWF5IGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4NCi0tIA0KLS0gICAgICAgICAgICAgX2NvbnRlbnRGaWxlID0gbnVsbDsNCi0tICAgICAgICAgfQ0KLS0gDQotLSAgICAgfQ0KLS0gICAgIA0KLS0gICAgIA0KLSAgICAgIC8qKg0KLSEgICAgICAqICBMZXZlcmFnZXMge0BsaW5rIEZpbGV9IHRvIGNvbnZlcnQgdGhlIGZ1bGwgZmlsZSBwYXRoIGFuZCBleHRyYWN0DQotISAgICAgICogIHRoZSBuYW1lLg0KLSAgICAgICAqIA0KLSAgICAgICAqKi8NCi0hICAgICANCi0hICAgICBwdWJsaWMgU3RyaW5nIGdldEZpbGVOYW1lKCkNCi0hICAgICB7DQotISAgIAkJRmlsZSBmaWxlID0gbmV3IEZpbGUoX2ZpbGVQYXRoKTsNCi0hICAgCQkNCi0hICAgCQlyZXR1cm4gZmlsZS5nZXROYW1lKCk7DQotISAgICAgfQ0KLSEgDQotISAgICAgcHVibGljIFN0cmluZyBnZXRDb250ZW50VHlwZSgpDQotISAgICAgew0KLSEgICAgICAgICByZXR1cm4gX2NvbnRlbnRUeXBlOw0KLSEgICAgIH0NCi0gIA0KLSEgfQ0KLVwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQ0KLS0tLSAxLDIwMSAtLS0tDQotISAvKg0KLSEgICogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotISAgKiAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQ0KLSEgICoNCi0hICAqICBDb3B5cmlnaHQgKGMpIDIwMDIgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cw0KLSEgICogIHJlc2VydmVkLg0KLSEgICoNCi0hICAqICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCi0hICAqICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMNCi0hICAqICBhcmUgbWV0Og0KLSEgICoNCi0hICAqICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodA0KLSEgICogIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4NCi0hICAqDQotISAgKiAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQNCi0hICAqICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4NCi0hICAqICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlDQotISAgKiAgZGlzdHJpYnV0aW9uLg0KLSEgICoNCi0hICAqICAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwNCi0hICAqICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50Og0KLSEgICogICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQ0KLSEgICogIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iDQotISAgKiAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLA0KLSEgICogIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuDQotISAgKg0KLSEgICogIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBhbmQNCi0hICAqICAiQXBhY2hlIFRhcGVzdHJ5IiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cw0KLSEgICogIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3INCi0hICAqICB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLg0KLSEgICoNCi0hICAqICA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIiwNCi0hICAqICAiQXBhY2hlIFRhcGVzdHJ5Iiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dA0KLSEgICogIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uDQotISAgKg0KLSEgICogIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQNCi0hICAqICBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUw0KLSEgICogIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFDQotISAgKiAgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUg0KLSEgICogIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwNCi0hICAqICBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQotISAgKiAgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRg0KLSEgICogIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQNCi0hICAqICBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwNCi0hICAqICBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQNCi0hICAqICBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YNCi0hICAqICBTVUNIIERBTUFHRS4NCi0hICAqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSEgICoNCi0hICAqICBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQ0KLSEgICogIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQ0KLSEgICogIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQ0KLSEgICogIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4NCi0gICAqLw0KLSAgcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5Lm11bHRpcGFydDsNCi0gIA0KLSAgaW1wb3J0IGphdmEuaW8uRmlsZTsNCi0gIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLSAgaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07DQotICANCi0rIGltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LkFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbjsNCi0rIGltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnJlcXVlc3QuSVVwbG9hZEZpbGU7DQotKyANCi0rIGltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuZmlsZXVwbG9hZC5EZWZhdWx0RmlsZUl0ZW07DQotKyBpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmZpbGV1cGxvYWQuRmlsZUl0ZW07DQotICBpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLSAgaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotICANCi0gIA0KLSAgLyoqDQotICAgKiAgUG9ydGlvbiBvZiBhIG11bHRpLXBhcnQgcmVxdWVzdCByZXByZXNlbnRpbmcgYW4gdXBsb2FkZWQgZmlsZS4NCi0gICAqDQotISAgKiAgQGF1dGhvciBKb2UgUGFuaWNvDQotISAgKiAgQHZlcnNpb24gJElkOiBVcGxvYWRQYXJ0LmphdmEsdiAxLjEwIDIwMDMvMDEvMTMgMDM6MzM6MjMgaGxzaGlwIEV4cCAkDQotICAgKiAgQHNpbmNlIDIuMC4xDQotICAgKg0KLSAgICoqLw0KLSEgcHVibGljIGNsYXNzIFVwbG9hZFBhcnQgZXh0ZW5kcyBPYmplY3QgDQotISAJaW1wbGVtZW50cyBJVXBsb2FkRmlsZSwgSVBhcnQNCi0gIHsNCi0hIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgTE9HID0NCi0hIAkJTG9nRmFjdG9yeS5nZXRMb2coVXBsb2FkUGFydC5jbGFzcyk7DQotISAJCQ0KLSEgCUZpbGVJdGVtIF9maWxlSXRlbTsNCi0hIAkNCi0hIAlwdWJsaWMgVXBsb2FkUGFydChGaWxlSXRlbSBmaWxlSXRlbSkNCi0hIAl7DQotISAJCWlmKCBmaWxlSXRlbSAhPSBudWxsKQ0KLSEgCQl7DQotISAJCQlfZmlsZUl0ZW0gPSBmaWxlSXRlbTsNCi0hIAkJfQ0KLSEgCQllbHNlDQotISAJCXsNCi0hIAkJCVN0cmluZyBhTWVzc2FnZSA9ICJVcGxvYWRQYXJ0KEZpbGVJdGVtKSBkb2VzIG5vdCBhY2NlcHQgbnVsbCBhcmdzIjsNCi0hIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIGFNZXNzYWdlKTsNCi0hIAkJfQ0KLSEgCX0NCi0hIAkNCi0hIAlwdWJsaWMgc3RhdGljIFVwbG9hZFBhcnQgbmV3SW5zdGFuY2UoDQotISAJCVN0cmluZyBwYXRoLA0KLSEgCQlTdHJpbmcgbmFtZSwNCi0hIAkJU3RyaW5nIGNvbnRlbnRUeXBlLA0KLSEgCQlpbnQgcmVxdWVzdFNpemUsDQotISAJCWludCB0aHJlc2hvbGQpDQotISAJew0KLSEgCQlVcGxvYWRQYXJ0IG5ld0luc3RhbmNlID0gbnVsbDsNCi0hIAkJRmlsZUl0ZW0gYUZpbGVJdGVtID0NCi0hIAkJCURlZmF1bHRGaWxlSXRlbS5uZXdJbnN0YW5jZSgNCi0hIAkJCQlwYXRoLA0KLSEgCQkJCW5hbWUsDQotISAJCQkJY29udGVudFR5cGUsDQotISAJCQkJcmVxdWVzdFNpemUsDQotISAJCQkJdGhyZXNob2xkKTsNCi0hIAkJDQotISAJCWlmKCBhRmlsZUl0ZW0gIT0gbnVsbCkNCi0hIAkJew0KLSEgCQkJbmV3SW5zdGFuY2UgPSBuZXcgVXBsb2FkUGFydCggYUZpbGVJdGVtKTsNCi0hIAkJfQ0KLSEgCQlyZXR1cm4gbmV3SW5zdGFuY2U7DQotISAJfQ0KLSEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotISAJLyoqDQotISAJICogQHNlZSBuZXQuc2YudGFwZXN0cnkuSVVwbG9hZEZpbGUjZ2V0Q29udGVudFR5cGUoKQ0KLSEgCSAqLw0KLSEgCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudFR5cGUoKQ0KLSEgCXsNCi0hIAkJcmV0dXJuIF9maWxlSXRlbS5nZXRDb250ZW50VHlwZSgpOw0KLSEgCX0NCi0gIA0KLSEgICAgIC8qKg0KLSEgICAgICAqICBMZXZlcmFnZXMge0BsaW5rIEZpbGV9IHRvIGNvbnZlcnQgdGhlIGZ1bGwgZmlsZSBwYXRoIGFuZCBleHRyYWN0DQotISAgICAgICogIHRoZSBuYW1lLg0KLSEgICAgICAqIA0KLSEgICAgICAqKi8NCi0hIAlwdWJsaWMgU3RyaW5nIGdldEZpbGVOYW1lKCkNCi0hIAl7DQotISAgIAkJRmlsZSBhRmlsZSA9IG5ldyBGaWxlKCB0aGlzLmdldEZpbGVQYXRoKCkgKTsNCi0hICAgCQkNCi0hICAgCQlyZXR1cm4gYUZpbGUuZ2V0TmFtZSgpOw0KLSEgCX0NCi0gIA0KLSAgCS8qKg0KLSAgCSAqICBAc2luY2UgMi4wLjQNCi0gIAkgKiANCi0gIAkgKiovDQotISAJcHVibGljIFN0cmluZyBnZXRGaWxlUGF0aCgpDQotISAJew0KLSEgCQlyZXR1cm4gX2ZpbGVJdGVtLmdldE5hbWUoKTsNCi0hIAl9DQotICANCi0gIAkvKioNCi0hIAkgKiBAc2VlIG5ldC5zZi50YXBlc3RyeS5JVXBsb2FkRmlsZSNnZXRTdHJlYW0oKQ0KLSEgCSAqLw0KLSEgCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRTdHJlYW0oKQ0KLSEgCXsNCi0hIAkJSW5wdXRTdHJlYW0gZ2V0U3RyZWFtID0gbnVsbDsNCi0hIAkJDQotISAJCXRyeQ0KLSEgCQl7DQotISAJCQlnZXRTdHJlYW0gPSBfZmlsZUl0ZW0uZ2V0SW5wdXRTdHJlYW0oKTsNCi0hIAkJfQ0KLSEgCQljYXRjaCAoSU9FeGNlcHRpb24gZSkNCi0hIAkJew0KLSEgCQkJTE9HLndhcm4oImdldFN0cmVhbSIsIGUpOw0KLSEgCQkJDQotISAJCQl0aHJvdyBuZXcgQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uKA0KLSEgCQkJCSJVbmFibGUgdG8gb3BlbiB1cGxvYWRlZCBmaWxlIiwNCi0hIAkJCQllKTsNCi0hIAkJfQ0KLSEgCQkNCi0hIAkJcmV0dXJuIGdldFN0cmVhbTsNCi0hIAl9DQotICANCi0hIAkvKioNCi0hIAkgKiBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCB0cnVuY2F0ZS4gUGFydHMgdGhhdCBhcmUgdG9vDQotISAJICogbGFyZ2UgY2F1c2UgYSBkZWNvZGUgZmFpbHVyZQ0KLSEgCSAqLw0KLSEgCXB1YmxpYyBib29sZWFuIGlzVHJ1bmNhdGVkKCkNCi0hIAl7DQotISAJCXJldHVybiBmYWxzZTsNCi0hIAl9DQotICANCi0gICAgICAvKioNCi0hICAgICAgKiAgRGVsZXRlcyB0aGUgZXh0ZXJuYWwgY29udGVudCBmaWxlLCBpZiBvbmUgZXhpc3RzLg0KLSAgICAgICAqIA0KLSAgICAgICAqKi8NCi0hIAlwdWJsaWMgdm9pZCBjbGVhbnVwKCkNCi0hIAl7DQotISAJCV9maWxlSXRlbS5kZWxldGUoKTsNCi0hIAkJLy8gdW5mb3J0dW5hdGVseSBGaWxlSXRlbS5kZWxldGUoKSBkb2VzIG5vdCBzaWduYWwgc3VjY2Vzcywgc28NCi0hIAkJLy8gd2UgcmVseSBvbiBhIGxpdHRsZSBtb3JlIGludGVybmFsIGtub3dsZWRnZSB0aGFuIGlzIGlkZWFsDQotISAJCUZpbGUgYVN0b3JhZ2VMb2NhdGlvbiA9IF9maWxlSXRlbS5nZXRTdG9yZUxvY2F0aW9uKCk7DQotISAJCWlmKCAoYVN0b3JhZ2VMb2NhdGlvbiAhPSBudWxsKSAmJiAoYVN0b3JhZ2VMb2NhdGlvbi5leGlzdHMoKSkgKQ0KLSEgCQl7DQotISAJCQlTdHJpbmcgYU1lc3NhZ2UgPSAiVW5hYmxlIHRvIGRlbGV0ZSBGaWxlSXRlbTogIiArIF9maWxlSXRlbTsNCi0hIAkJCQ0KLSEgCQkJdGhyb3cgbmV3IEFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbihhTWVzc2FnZSk7DQotISAJCX0NCi0hIAl9DQotICANCi0hIH0NCmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvcGFja2FnZS5odG1sIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjgyMWI1MS4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotPCFkb2N0eXBlIGh0bWwgcHVibGljICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLTwhLS0gJElkJCAtLT4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+VGFwZXN0cnk6IFdlYiBBcHBsaWNhdGlvbiBGcmFtZXdvcms8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci0KLTxiPlRhcGVzdHJ5PC9iPiBpcyBhIGNvbXByZWhlbnNpdmUgd2ViIGFwcGxpY2F0aW9uIGZyYW1ld29yaywgd3JpdHRlbiBpbiBKYXZhLgotCi08cD5UYXBlc3RyeSBpcyBub3QgYW4gYXBwbGljYXRpb24gc2VydmVyLgotSXQgaXMgZGVzaWduZWQgdG8gYmUgdXNlZCBpbnNpZGUgYW4gYXBwbGljYXRpb24gc2VydmVyLgotCi08cD5UYXBlc3RyeSBpcyBub3QgYW4gYXBwbGljYXRpb24uCi1UYXBlc3RyeSBpcyBhIGZyYW1ld29yayBmb3IgY3JlYXRpbmcgd2ViIGFwcGxpY2F0aW9ucy4KLQotPHA+VGFwZXN0cnkgaXMgbm90IGEgd2F5IG9mIHVzaW5nIEphdmFTZXJ2ZXIgUGFnZXMuCi1UYXBlc3RyeSBpcyBhbiA8aT5hbHRlcm5hdGl2ZSB0bzwvaT4gdXNpbmcgSmF2YVNlcnZlciBQYWdlcy4KLQotPHA+VGFwZXN0cnkgaXMgbm90IGEgc2NyaXB0aW5nIGVudmlyb25tZW50LgotVGFwZXN0cnkgdXNlcyBhIGNvbXBvbmVudCBvYmplY3QgbW9kZWwsIG5vdCBzaW1wbGUgc2NyaXB0aW5nLAotdG8gY3JlYXRlIGhpZ2hseSBkeW5hbWljLCBpbnRlcmFjdGl2ZSB3ZWIgcGFnZXMuCi0KLTxwPlRhcGVzdHJ5IGlzIGJhc2VkIG9uIHRoZSBKYXZhIFNlcnZsZXQgQVBJIHZlcnNpb24gMi4yLgotCi08cD5UYXBlc3RyeSB1c2VzIGEgc29waGlzdGljYXRlZCBjb21wb25lbnQgbW9kZWwgdG8gZGl2aWRlIGEgd2ViIGFwcGxpY2F0aW9uIGludG8KLWEgaGllcmFyY2h5IG9mIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LklDb21wb25lbnQgY29tcG9uZW50c30uCi1FYWNoIGNvbXBvbmVudCBoYXMgc3BlY2lmaWMgcmVzcG9uc2liaWxpdGllcyBmb3IgcmVuZGVyaW5nIHdlYiBwYWdlcwotKHRoYXQgaXMsIGdlbmVyYXRpbmcgYSBwb3J0aW9uIG9mIGFuIEhUTUwgcGFnZSkgYW5kIHJlc3BvbmRpbmcgdG8gSFRNTCBxdWVyaWVzCi0oc3VjaCBhcyBjbGlja2luZyBvbiBhIGxpbmssIG9yIHN1Ym1pdHRpbmcgYSBmb3JtKS4KLQotPHA+VGhlIFRhcGVzdHJ5IGZyYW1ld29yayB0YWtlcyBvbiB2aXJ0dWFsbHkgYWxsIG9mIHRoZSByZXNwb25zaWJpbGl0aWVzCi1mb3IgbWFuYWdpbmcgYXBwbGljYXRpb24gZmxvdyBhbmQgc2VydmVyLXNpZGUgY2xpZW50IHN0YXRlLiAgCi1UaGlzIGFsbG93cyBkZXZlbG9wZXJzIHRvIGNvbmNlbnRyYXRlIG9uIHRoZSBidXNpbmVzcyBhbmQgcHJlc2VudGF0aW9uIGFzcGVjdHMgb2YgdGhlIGFwcGxpY2F0aW9uLgotCi08aHI+Ci0KLTxwPlZpc2l0IFRhcGVzdHJ5J3MgaG9tZSBwYWdlIGF0Ci08YSBocmVmPSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL3RhcGVzdHJ5Ij5odHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL3RhcGVzdHJ5PC9hPgotZm9yIG1vcmUgZGV0YWlscyBvbiBsaWNlbnNpbmcuCi0KLUBhdXRob3IgSG93YXJkIFNoaXAgPGEgaHJlZj0ibWFpbHRvOmhsc2hpcEBhcGFjaGUub3JnIj5obHNoaXBAYXBhY2hlLm9yZzwvYT4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3BhZ2Vsb2FkL0NvbXBvbmVudFRyZWVXYWxrZXIuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9wYWdlbG9hZC9Db21wb25lbnRUcmVlV2Fsa2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzMDk0OTcuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3BhZ2Vsb2FkL0NvbXBvbmVudFRyZWVXYWxrZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LnBhZ2Vsb2FkOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JQ29tcG9uZW50OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuVGFwZXN0cnk7Ci0KLS8qKgotICogIFdhbGtzIHRocm91Z2ggdGhlIHRyZWUgb2YgY29tcG9uZW50cyBhbmQgaW52b2tlcyB0aGUgdmlzaXRvcnMgb24gZWFjaCBvZiAKLSAqICBvZiB0aGUgY29tcG9uZW50cyBpbiB0aGUgdHJlZS4KLSAqIAotICogIEBhdXRob3IgbWluZGJyaWRnZQotICogIEB2ZXJzaW9uICRJZCQKLSAqICBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21wb25lbnRUcmVlV2Fsa2VyCi17Ci0gICAgcHJpdmF0ZSBJQ29tcG9uZW50VmlzaXRvcltdIF92aXNpdG9yczsKLSAgICAKLSAgICBwdWJsaWMgQ29tcG9uZW50VHJlZVdhbGtlcihJQ29tcG9uZW50VmlzaXRvcltdIHZpc2l0b3JzKQotICAgIHsKLSAgICAgICAgX3Zpc2l0b3JzID0gdmlzaXRvcnM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd2Fsa0NvbXBvbmVudFRyZWUoSUNvbXBvbmVudCBjb21wb25lbnQpCi0gICAgewotICAgICAgICAvLyBJbnZva2UgdmlzaXRvcnMKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfdmlzaXRvcnMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIElDb21wb25lbnRWaXNpdG9yIHZpc2l0b3IgPSBfdmlzaXRvcnNbaV07Ci0gICAgICAgICAgICB2aXNpdG9yLnZpc2l0Q29tcG9uZW50KGNvbXBvbmVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBSZWN1cnNlIGludG8gdGhlIGVtYmVkZGVkIGNvbXBvbmVudHMKLSAgICAgICAgQ29sbGVjdGlvbiBjb21wb25lbnRzID0gY29tcG9uZW50LmdldENvbXBvbmVudHMoKS52YWx1ZXMoKTsKLQotICAgICAgICBpZiAoVGFwZXN0cnkuc2l6ZShjb21wb25lbnRzKSA9PSAwKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBjb21wb25lbnRzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0gICAgICAgIHsKLSAgICAgICAgICAgIElDb21wb25lbnQgZW1iZWRkZWQgPSAoSUNvbXBvbmVudCkgaXQubmV4dCgpOwotICAgICAgICAgICAgd2Fsa0NvbXBvbmVudFRyZWUoZW1iZWRkZWQpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3BhZ2Vsb2FkL0VzdGFibGlzaERlZmF1bHRQYXJhbWV0ZXJWYWx1ZXNWaXNpdG9yLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvcGFnZWxvYWQvRXN0YWJsaXNoRGVmYXVsdFBhcmFtZXRlclZhbHVlc1Zpc2l0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFhMzU1Yi4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvcGFnZWxvYWQvRXN0YWJsaXNoRGVmYXVsdFBhcmFtZXRlclZhbHVlc1Zpc2l0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LnBhZ2Vsb2FkOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5BcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JQmluZGluZzsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVzb3VyY2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LlRhcGVzdHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuYmluZGluZy5FeHByZXNzaW9uQmluZGluZzsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnNwZWMuSUNvbXBvbmVudFNwZWNpZmljYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5zcGVjLklQYXJhbWV0ZXJTcGVjaWZpY2F0aW9uOwotCi0vKioKLSAqICBGb3IgYWxsIHBhcmFtZXRlcnMgaW4gdGhlIGV4YW1pbmVkIGNvbXBvbmVudCB0aGF0IGhhdmUgZGVmYXVsdCB2YWx1ZXMsIGJ1dCBhcmUgbm90IGJvdW5kLAotICogIGF1dG9tYXRpY2FsbHkgYWRkIGFuIEV4cHJlc3Npb25CaW5kaW5nIHdpdGggdGhlIGRlZmF1bHQgdmFsdWUuCi0gKiAgIAotICogIEBhdXRob3IgbWluZGJyaWRnZQotICogIEB2ZXJzaW9uICRJZCQKLSAqICBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFc3RhYmxpc2hEZWZhdWx0UGFyYW1ldGVyVmFsdWVzVmlzaXRvciBpbXBsZW1lbnRzIElDb21wb25lbnRWaXNpdG9yCi17Ci0gICAgcHJpdmF0ZSBJUmVzb3VyY2VSZXNvbHZlciBfcmVzb2x2ZXI7Ci0gICAgCi0gICAgcHVibGljIEVzdGFibGlzaERlZmF1bHRQYXJhbWV0ZXJWYWx1ZXNWaXNpdG9yKElSZXNvdXJjZVJlc29sdmVyIHJlc29sdmVyKQotICAgIHsKLSAgICAgICAgX3Jlc29sdmVyID0gcmVzb2x2ZXI7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS50YXBlc3RyeS5wYWdlbG9hZC5JQ29tcG9uZW50VmlzaXRvciN2aXNpdENvbXBvbmVudChvcmcuYXBhY2hlLnRhcGVzdHJ5LklDb21wb25lbnQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdmlzaXRDb21wb25lbnQoSUNvbXBvbmVudCBjb21wb25lbnQpCi0gICAgewotICAgICAgICBJQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBzcGVjID0gY29tcG9uZW50LmdldFNwZWNpZmljYXRpb24oKTsKLQotICAgICAgICBJdGVyYXRvciBpID0gc3BlYy5nZXRQYXJhbWV0ZXJOYW1lcygpLml0ZXJhdG9yKCk7Ci0KLSAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpIGkubmV4dCgpOwotICAgICAgICAgICAgSVBhcmFtZXRlclNwZWNpZmljYXRpb24gcGFyYW1ldGVyU3BlYyA9IHNwZWMuZ2V0UGFyYW1ldGVyKG5hbWUpOwotCi0gICAgICAgICAgICBTdHJpbmcgZGVmYXVsdFZhbHVlID0gcGFyYW1ldGVyU3BlYy5nZXREZWZhdWx0VmFsdWUoKTsKLSAgICAgICAgICAgIGlmIChkZWZhdWx0VmFsdWUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gdGhlIHBhcmFtZXRlciBoYXMgYSBkZWZhdWx0IHZhbHVlLCBzbyBpdCBtdXN0IG5vdCBiZSByZXF1aXJlZAotICAgICAgICAgICAgaWYgKHBhcmFtZXRlclNwZWMuaXNSZXF1aXJlZCgpKQotICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICBUYXBlc3RyeS5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICJFc3RhYmxpc2hEZWZhdWx0UGFyYW1ldGVyVmFsdWVzVmlzaXRvci5wYXJhbWV0ZXItbXVzdC1oYXZlLW5vLWRlZmF1bHQtdmFsdWUiLAotICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuZ2V0RXh0ZW5kZWRJZCgpLAotICAgICAgICAgICAgICAgICAgICBuYW1lKSwKLSAgICAgICAgICAgICAgICBjb21wb25lbnQsCi0gICAgICAgICAgICAgICAgcGFyYW1ldGVyU3BlYy5nZXRMb2NhdGlvbigpLAotICAgICAgICAgICAgICAgIG51bGwpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBpZiB0aGVyZSBpcyBubyBiaW5kaW5nIGZvciB0aGlzIHBhcmFtZXRlciwgYmluZCBpdCB0byB0aGUgZGVmYXVsdCB2YWx1ZQotICAgICAgICAgICAgaWYgKGNvbXBvbmVudC5nZXRCaW5kaW5nKG5hbWUpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBJQmluZGluZyBiaW5kaW5nID0gbmV3IEV4cHJlc3Npb25CaW5kaW5nKF9yZXNvbHZlciwgY29tcG9uZW50LCBkZWZhdWx0VmFsdWUsIHBhcmFtZXRlclNwZWMuZ2V0TG9jYXRpb24oKSk7Ci0gICAgICAgICAgICAgICAgY29tcG9uZW50LnNldEJpbmRpbmcobmFtZSwgYmluZGluZyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9wYWdlbG9hZC9JQ29tcG9uZW50VmlzaXRvci5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3BhZ2Vsb2FkL0lDb21wb25lbnRWaXNpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjYTAzNjUuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3BhZ2Vsb2FkL0lDb21wb25lbnRWaXNpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5wYWdlbG9hZDsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUNvbXBvbmVudDsKLQotLyoqCi0gKiAgQW4gaW50ZXJmYWNlIGRlZmluaW5nIGFuIGVudGl0eSB0aGF0IGlzIGludGVyZXN0ZWQgaW4gZXhhbWluaW5nIGEgcGFydGljdWxhciBjb21wb25lbnQgCi0gKiAKLSAqICBAYXV0aG9yIG1pbmRicmlkZ2UKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQHNpbmNlIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDb21wb25lbnRWaXNpdG9yCi17Ci0gICAgdm9pZCB2aXNpdENvbXBvbmVudChJQ29tcG9uZW50IGNvbXBvbmVudCk7Ci19CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvcGFnZWxvYWQvUGFnZUxvYWRlci5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3BhZ2Vsb2FkL1BhZ2VMb2FkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ4ZDRmYS4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvcGFnZWxvYWQvUGFnZUxvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTY0ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LnBhZ2Vsb2FkOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LkFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LkJhc2VDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JQXNzZXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JQmluZGluZzsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JRW5naW5lOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUxvY2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklQYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlcXVlc3RDeWNsZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZXNvdXJjZUxvY2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlc291cmNlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5UYXBlc3RyeTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmFzc2V0LkNvbnRleHRBc3NldDsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmFzc2V0LkV4dGVybmFsQXNzZXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5hc3NldC5Qcml2YXRlQXNzZXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5iaW5kaW5nLkV4cHJlc3Npb25CaW5kaW5nOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuYmluZGluZy5GaWVsZEJpbmRpbmc7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5iaW5kaW5nLkxpc3RlbmVyQmluZGluZzsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmJpbmRpbmcuU3RhdGljQmluZGluZzsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmJpbmRpbmcuU3RyaW5nQmluZGluZzsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmVuZ2luZS5JQ29tcG9uZW50Q2xhc3NFbmhhbmNlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmVuZ2luZS5JUGFnZUxvYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmVuZ2luZS5JU3BlY2lmaWNhdGlvblNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmVuZ2luZS5JVGVtcGxhdGVTb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5ldmVudC5QYWdlRGV0YWNoTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5odG1sLkJhc2VQYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkucmVxdWVzdC5SZXF1ZXN0Q29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnJlc29sdmVyLkNvbXBvbmVudFNwZWNpZmljYXRpb25SZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnJlc291cmNlLkNsYXNzcGF0aFJlc291cmNlTG9jYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5yZXNvdXJjZS5Db250ZXh0UmVzb3VyY2VMb2NhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnNwZWMuQXNzZXRUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuc3BlYy5CaW5kaW5nVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnNwZWMuSUFzc2V0U3BlY2lmaWNhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnNwZWMuSUJpbmRpbmdTcGVjaWZpY2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuc3BlYy5JQ29tcG9uZW50U3BlY2lmaWNhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnNwZWMuSUNvbnRhaW5lZENvbXBvbmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnNwZWMuSUxpc3RlbmVyQmluZGluZ1NwZWNpZmljYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5zcGVjLklQcm9wZXJ0eVNwZWNpZmljYXRpb247Ci0KLS8qKgotICogIFJ1bnMgdGhlIHByb2Nlc3Mgb2YgYnVpbGRpbmcgdGhlIGNvbXBvbmVudCBoaWVyYXJjaHkgZm9yIGFuIGVudGlyZSBwYWdlLgotICogCi0gKiAgPHA+Ci0gKiAgVGhpcyBjbGFzcyBpcyBub3QgdGhyZWFkc2FmZTsgaG93ZXZlciwge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkucGFnZWxvYWQuUGFnZVNvdXJjZX0KLSAqICBjcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIGl0IGZvciBlYWNoIHBhZ2UgdG8gYmUgbG9hZGVkLCB3aGljaCBieXBhc3NlcwotICogIG11bHRpdGhyZWFkaW5nIGlzc3Vlcy4KLSAqCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogCi0gKiovCi0KLXB1YmxpYyBjbGFzcyBQYWdlTG9hZGVyIGltcGxlbWVudHMgSVBhZ2VMb2FkZXIKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgTE9HID0gTG9nRmFjdG9yeS5nZXRMb2coUGFnZUxvYWRlci5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIElFbmdpbmUgX2VuZ2luZTsKLSAgICBwcml2YXRlIElSZXNvdXJjZVJlc29sdmVyIF9yZXNvbHZlcjsKLSAgICBwcml2YXRlIElDb21wb25lbnRDbGFzc0VuaGFuY2VyIF9lbmhhbmNlcjsKLSAgICBwcml2YXRlIElTcGVjaWZpY2F0aW9uU291cmNlIF9zcGVjaWZpY2F0aW9uU291cmNlOwotICAgIHByaXZhdGUgQ29tcG9uZW50U3BlY2lmaWNhdGlvblJlc29sdmVyIF9jb21wb25lbnRSZXNvbHZlcjsKLSAgICBwcml2YXRlIExpc3QgX2luaGVyaXRlZEJpbmRpbmdRdWV1ZSA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBwcml2YXRlIExpc3QgX3Byb3BlcnR5SW5pdGlhbGl6ZXJzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIHByaXZhdGUgQ29tcG9uZW50VHJlZVdhbGtlciBfZXN0YWJsaXNoRGVmYXVsdFBhcmFtZXRlclZhbHVlc1dhbGtlcjsKLSAgICBwcml2YXRlIENvbXBvbmVudFRyZWVXYWxrZXIgX3ZlcmlmeVJlcXVpcmVkUGFyYW1ldGVyc1dhbGtlcjsKLQotICAgIC8qKgotICAgICAqIFRoZSBsb2NhbGUgb2YgdGhlIGFwcGxpY2F0aW9uLCB3aGljaCBpcyBhbHNvIHRoZSBsb2NhbGUKLSAgICAgKiBvZiB0aGUgcGFnZSBiZWluZyBsb2FkZWQuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwcml2YXRlIExvY2FsZSBfbG9jYWxlOwotCi0gICAgLyoqCi0gICAgICogIE51bWJlciBvZiBjb21wb25lbnRzIGluc3RhbnRpYXRlZCwgZXhjbHVkaW5nIHRoZSBwYWdlIGl0c2VsZi4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHByaXZhdGUgaW50IF9jb3VudDsKLQotICAgIC8qKgotICAgICAqICBUaGUgcmVjdXJzaW9uIGRlcHRoLiAgQSBwYWdlIHdpdGggbm8gY29tcG9uZW50cyBpcyB6ZXJvLiAgQSBjb21wb25lbnQgb24KLSAgICAgKiAgYSBwYWdlIGlzIG9uZS4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHByaXZhdGUgaW50IF9kZXB0aDsKLQotICAgIC8qKgotICAgICAqICBUaGUgbWF4aW11bSBkZXB0aCByZWFjaGVkIHdoaWxlIGJ1aWxkaW5nIHRoZSBwYWdlLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHJpdmF0ZSBpbnQgX21heERlcHRoOwotCi0gICAgLyoqCi0gICAgICogIFVzZWQgdG8gZmlndXJlIHJlbGF0aXZlIHBhdGhzIGZvciBjb250ZXh0IGFzc2V0cy4KLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwcml2YXRlIElSZXNvdXJjZUxvY2F0aW9uIF9zZXJ2bGV0TG9jYXRpb247Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBpbnRlcmZhY2UgSVF1ZXVlZEluaGVyaXRlZEJpbmRpbmcKLSAgICB7Ci0gICAgICAgIHZvaWQgY29ubmVjdCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFF1ZXVlZEluaGVyaXRlZEJpbmRpbmcgaW1wbGVtZW50cyBJUXVldWVkSW5oZXJpdGVkQmluZGluZwotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBJQ29tcG9uZW50IF9jb21wb25lbnQ7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIF9jb250YWluZXJQYXJhbWV0ZXJOYW1lOwotICAgICAgICBwcml2YXRlIFN0cmluZyBfcGFyYW1ldGVyTmFtZTsKLQotICAgICAgICBwcml2YXRlIFF1ZXVlZEluaGVyaXRlZEJpbmRpbmcoCi0gICAgICAgICAgICBJQ29tcG9uZW50IGNvbXBvbmVudCwKLSAgICAgICAgICAgIFN0cmluZyBjb250YWluZXJQYXJhbWV0ZXJOYW1lLAotICAgICAgICAgICAgU3RyaW5nIHBhcmFtZXRlck5hbWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9jb21wb25lbnQgPSBjb21wb25lbnQ7Ci0gICAgICAgICAgICBfY29udGFpbmVyUGFyYW1ldGVyTmFtZSA9IGNvbnRhaW5lclBhcmFtZXRlck5hbWU7Ci0gICAgICAgICAgICBfcGFyYW1ldGVyTmFtZSA9IHBhcmFtZXRlck5hbWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBjb25uZWN0KCkKLSAgICAgICAgewotICAgICAgICAgICAgSUJpbmRpbmcgYmluZGluZyA9IF9jb21wb25lbnQuZ2V0Q29udGFpbmVyKCkuZ2V0QmluZGluZyhfY29udGFpbmVyUGFyYW1ldGVyTmFtZSk7Ci0KLSAgICAgICAgICAgIGlmIChiaW5kaW5nID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgICAgICBfY29tcG9uZW50LnNldEJpbmRpbmcoX3BhcmFtZXRlck5hbWUsIGJpbmRpbmcpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUXVldWVkSW5oZXJpdEluZm9ybWFsQmluZGluZ3MgaW1wbGVtZW50cyBJUXVldWVkSW5oZXJpdGVkQmluZGluZwotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBJQ29tcG9uZW50IF9jb21wb25lbnQ7Ci0KLSAgICAgICAgcHJpdmF0ZSBRdWV1ZWRJbmhlcml0SW5mb3JtYWxCaW5kaW5ncyhJQ29tcG9uZW50IGNvbXBvbmVudCkKLSAgICAgICAgewotICAgICAgICAgICAgX2NvbXBvbmVudCA9IGNvbXBvbmVudDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGNvbm5lY3QoKQotICAgICAgICB7Ci0KLSAgICAgICAgICAgIElDb21wb25lbnQgY29udGFpbmVyID0gX2NvbXBvbmVudC5nZXRDb250YWluZXIoKTsKLQotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IGNvbnRhaW5lci5nZXRCaW5kaW5nTmFtZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZyBiaW5kaW5nTmFtZSA9IChTdHJpbmcpIGl0Lm5leHQoKTsKLSAgICAgICAgICAgICAgICBjb25uZWN0SW5mb3JtYWxCaW5kaW5nKGNvbnRhaW5lciwgX2NvbXBvbmVudCwgYmluZGluZ05hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGNvbm5lY3RJbmZvcm1hbEJpbmRpbmcoCi0gICAgICAgICAgICBJQ29tcG9uZW50IGNvbnRhaW5lciwKLSAgICAgICAgICAgIElDb21wb25lbnQgY29tcG9uZW50LAotICAgICAgICAgICAgU3RyaW5nIGJpbmRpbmdOYW1lKQotICAgICAgICB7Ci0gICAgICAgICAgICBJQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBjb21wb25lbnRTcGVjID0gY29tcG9uZW50LmdldFNwZWNpZmljYXRpb24oKTsKLSAgICAgICAgICAgIElDb21wb25lbnRTcGVjaWZpY2F0aW9uIGNvbnRhaW5lclNwZWMgPSBjb250YWluZXIuZ2V0U3BlY2lmaWNhdGlvbigpOwotCi0gICAgICAgICAgICAvLyBjaGVjayBpZiBiaW5kaW5nIGFscmVhZHkgZXhpc3RzIGluIHRoZSBjb21wb25lbnQKLSAgICAgICAgICAgIGlmIChjb21wb25lbnQuZ2V0QmluZGluZyhiaW5kaW5nTmFtZSkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgICAgIC8vIGNoZWNrIGlmIHBhcmFtZXRlciBpcyBpbmZvcm1hbCBmb3IgdGhlIGNvbXBvbmVudAotICAgICAgICAgICAgaWYgKGNvbXBvbmVudFNwZWMuZ2V0UGFyYW1ldGVyKGJpbmRpbmdOYW1lKSAhPSBudWxsCi0gICAgICAgICAgICAgICAgfHwgY29tcG9uZW50U3BlYy5pc1Jlc2VydmVkUGFyYW1ldGVyTmFtZShiaW5kaW5nTmFtZSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgICAgICAvLyBjaGVjayBpZiBwYXJhbWV0ZXIgaXMgaW5mb3JtYWwgZm9yIHRoZSBjb250YWluZXIKLSAgICAgICAgICAgIGlmIChjb250YWluZXJTcGVjLmdldFBhcmFtZXRlcihiaW5kaW5nTmFtZSkgIT0gbnVsbAotICAgICAgICAgICAgICAgIHx8IGNvbnRhaW5lclNwZWMuaXNSZXNlcnZlZFBhcmFtZXRlck5hbWUoYmluZGluZ05hbWUpKQotICAgICAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAgICAgLy8gaWYgZXZlcnl0aGluZyBwYXNzZXMsIGVzdGFibGlzaCBiaW5kaW5nCi0gICAgICAgICAgICBJQmluZGluZyBiaW5kaW5nID0gY29udGFpbmVyLmdldEJpbmRpbmcoYmluZGluZ05hbWUpOwotICAgICAgICAgICAgY29tcG9uZW50LnNldEJpbmRpbmcoYmluZGluZ05hbWUsIGJpbmRpbmcpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIENvbnN0cnVjdG9yLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIFBhZ2VMb2FkZXIoSVJlcXVlc3RDeWNsZSBjeWNsZSkKLSAgICB7Ci0gICAgICAgIElFbmdpbmUgZW5naW5lID0gY3ljbGUuZ2V0RW5naW5lKCk7Ci0KLSAgICAgICAgX3NwZWNpZmljYXRpb25Tb3VyY2UgPSBlbmdpbmUuZ2V0U3BlY2lmaWNhdGlvblNvdXJjZSgpOwotICAgICAgICBfcmVzb2x2ZXIgPSBlbmdpbmUuZ2V0UmVzb3VyY2VSZXNvbHZlcigpOwotICAgICAgICBfZW5oYW5jZXIgPSBlbmdpbmUuZ2V0Q29tcG9uZW50Q2xhc3NFbmhhbmNlcigpOwotICAgICAgICBfY29tcG9uZW50UmVzb2x2ZXIgPSBuZXcgQ29tcG9uZW50U3BlY2lmaWNhdGlvblJlc29sdmVyKGN5Y2xlKTsKLQotICAgICAgICBSZXF1ZXN0Q29udGV4dCBjb250ZXh0ID0gY3ljbGUuZ2V0UmVxdWVzdENvbnRleHQoKTsKLQotICAgICAgICAvLyBOZWVkIHRoZSBsb2NhdGlvbiBvZiB0aGUgc2VydmxldCB3aXRoaW4gdGhlIGNvbnRleHQgYXMgdGhlIGJhc2lzCi0gICAgICAgIC8vIGZvciBidWlsZGluZyByZWxhdGl2ZSBjb250ZXh0IGFzc2V0IHBhdGhzLgotCi0gICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0ID0gY29udGV4dC5nZXRSZXF1ZXN0KCk7Ci0KLSAgICAgICAgU3RyaW5nIHNlcnZsZXRQYXRoID0gcmVxdWVzdC5nZXRTZXJ2bGV0UGF0aCgpOwotCi0gICAgICAgIF9zZXJ2bGV0TG9jYXRpb24gPQotICAgICAgICAgICAgbmV3IENvbnRleHRSZXNvdXJjZUxvY2F0aW9uKGNvbnRleHQuZ2V0U2VydmxldCgpLmdldFNlcnZsZXRDb250ZXh0KCksIHNlcnZsZXRQYXRoKTsKLQotICAgICAgICAvLyBDcmVhdGUgdGhlIG1lY2hhbmlzbXMgZm9yIHdhbGtpbmcgdGhlIGNvbXBvbmVudCB0cmVlIHdoZW4gaXQgaXMgY29tcGxldGUKLSAgICAgICAgSUNvbXBvbmVudFZpc2l0b3IgdmVyaWZ5UmVxdWlyZWRQYXJhbWV0ZXJzVmlzaXRvciA9IG5ldyBWZXJpZnlSZXF1aXJlZFBhcmFtZXRlcnNWaXNpdG9yKCk7Ci0gICAgICAgIF92ZXJpZnlSZXF1aXJlZFBhcmFtZXRlcnNXYWxrZXIgPSBuZXcgQ29tcG9uZW50VHJlZVdhbGtlcihuZXcgSUNvbXBvbmVudFZpc2l0b3JbXSB7IHZlcmlmeVJlcXVpcmVkUGFyYW1ldGVyc1Zpc2l0b3IgfSk7Ci0KLSAgICAgICAgSUNvbXBvbmVudFZpc2l0b3IgZXN0YWJsaXNoRGVmYXVsdFBhcmFtZXRlclZhbHVlc1Zpc2l0b3IgPQotICAgICAgICAgICAgbmV3IEVzdGFibGlzaERlZmF1bHRQYXJhbWV0ZXJWYWx1ZXNWaXNpdG9yKF9yZXNvbHZlcik7Ci0gICAgICAgIF9lc3RhYmxpc2hEZWZhdWx0UGFyYW1ldGVyVmFsdWVzV2Fsa2VyID0gbmV3IENvbXBvbmVudFRyZWVXYWxrZXIobmV3IElDb21wb25lbnRWaXNpdG9yW10geyBlc3RhYmxpc2hEZWZhdWx0UGFyYW1ldGVyVmFsdWVzVmlzaXRvciB9KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgQmluZHMgcHJvcGVydGllcyBvZiB0aGUgY29tcG9uZW50IGFzIGRlZmluZWQgYnkgdGhlIGNvbnRhaW5lcidzIHNwZWNpZmljYXRpb24uCi0gICAgICoKLSAgICAgKiA8cD5UaGlzIGltcGxlbWVudGF0aW9uIGlzIHZlcnkgc2ltcGxlLCB3ZSB3aWxsIG5lZWQgYSBsb3QgbW9yZQotICAgICAqICBzYW5pdHkgY2hlY2tpbmcgYW5kIGVyb3IgY2hlY2tpbmcgaW4gdGhlIGZpbmFsIHZlcnNpb24uCi0gICAgICoKLSAgICAgKiAgQHBhcmFtIGNvbnRhaW5lciBUaGUgY29udGFpbmluZyBjb21wb25lbnQuICBGb3IgYSBkeW5hbWljCi0gICAgICogIGJpbmRpbmcgKHtAbGluayBFeHByZXNzaW9uQmluZGluZ30pIHRoZSBwcm9wZXJ0eSBuYW1lCi0gICAgICogIGlzIGV2YWx1YXRlZCB3aXRoIHRoZSBjb250YWluZXIgYXMgdGhlIHJvb3QuCi0gICAgICogIEBwYXJhbSBjb21wb25lbnQgVGhlIGNvbnRhaW5lZCBjb21wb25lbnQgYmVpbmcgYm91bmQuCi0gICAgICogIEBwYXJhbSBzcGVjIFRoZSBzcGVjaWZpY2F0aW9uIG9mIHRoZSBjb250YWluZWQgY29tcG9uZW50LgotICAgICAqICBAcGFyYW0gY29udGFpbmVkIFRoZSBjb250YWluZWQgY29tcG9uZW50IHNwZWNpZmljYXRpb24gKGZyb20gdGhlIGNvbnRhaW5lcidzCi0gICAgICogIHtAbGluayBJQ29tcG9uZW50U3BlY2lmaWNhdGlvbn0pLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHJpdmF0ZSB2b2lkIGJpbmQoSUNvbXBvbmVudCBjb250YWluZXIsIElDb21wb25lbnQgY29tcG9uZW50LCBJQ29udGFpbmVkQ29tcG9uZW50IGNvbnRhaW5lZCkKLSAgICB7Ci0gICAgICAgIElDb21wb25lbnRTcGVjaWZpY2F0aW9uIHNwZWMgPSBjb21wb25lbnQuZ2V0U3BlY2lmaWNhdGlvbigpOwotICAgICAgICBib29sZWFuIGZvcm1hbE9ubHkgPSAhc3BlYy5nZXRBbGxvd0luZm9ybWFsUGFyYW1ldGVycygpOwotCi0gICAgICAgIElDb21wb25lbnRTcGVjaWZpY2F0aW9uIGNvbnRhaW5lclNwZWMgPSBjb250YWluZXIuZ2V0U3BlY2lmaWNhdGlvbigpOwotICAgICAgICBib29sZWFuIGNvbnRhaW5lckZvcm1hbE9ubHkgPSAhY29udGFpbmVyU3BlYy5nZXRBbGxvd0luZm9ybWFsUGFyYW1ldGVycygpOwotCi0gICAgICAgIGlmIChjb250YWluZWQuZ2V0SW5oZXJpdEluZm9ybWFsUGFyYW1ldGVycygpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZm9ybWFsT25seSkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICBUYXBlc3RyeS5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAiUGFnZUxvYWRlci5pbmhlcml0LWluZm9ybWFsLWludmFsaWQtY29tcG9uZW50LWZvcm1hbC1vbmx5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5nZXRFeHRlbmRlZElkKCkpLAotICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lZC5nZXRMb2NhdGlvbigpLAotICAgICAgICAgICAgICAgICAgICBudWxsKTsKLQotICAgICAgICAgICAgaWYgKGNvbnRhaW5lckZvcm1hbE9ubHkpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgVGFwZXN0cnkuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAgICAgIlBhZ2VMb2FkZXIuaW5oZXJpdC1pbmZvcm1hbC1pbnZhbGlkLWNvbnRhaW5lci1mb3JtYWwtb25seSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXIuZ2V0RXh0ZW5kZWRJZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LmdldEV4dGVuZGVkSWQoKSksCi0gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgY29udGFpbmVkLmdldExvY2F0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgIG51bGwpOwotCi0gICAgICAgICAgICBJUXVldWVkSW5oZXJpdGVkQmluZGluZyBxdWV1ZWQgPSBuZXcgUXVldWVkSW5oZXJpdEluZm9ybWFsQmluZGluZ3MoY29tcG9uZW50KTsKLSAgICAgICAgICAgIF9pbmhlcml0ZWRCaW5kaW5nUXVldWUuYWRkKHF1ZXVlZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBJdGVyYXRvciBpID0gY29udGFpbmVkLmdldEJpbmRpbmdOYW1lcygpLml0ZXJhdG9yKCk7Ci0KLSAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpIGkubmV4dCgpOwotCi0gICAgICAgICAgICBib29sZWFuIGlzRm9ybWFsID0gc3BlYy5nZXRQYXJhbWV0ZXIobmFtZSkgIT0gbnVsbDsKLQotICAgICAgICAgICAgSUJpbmRpbmdTcGVjaWZpY2F0aW9uIGJzcGVjID0gY29udGFpbmVkLmdldEJpbmRpbmcobmFtZSk7Ci0KLSAgICAgICAgICAgIC8vIElmIG5vdCBhbGxvd2luZyBpbmZvcm1hbCBwYXJhbWV0ZXJzLCBjaGVjayB0aGF0IGVhY2ggYmluZGluZyBtYXRjaGVzCi0gICAgICAgICAgICAvLyBhIGZvcm1hbCBwYXJhbWV0ZXIuCi0KLSAgICAgICAgICAgIGlmIChmb3JtYWxPbmx5ICYmICFpc0Zvcm1hbCkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICBUYXBlc3RyeS5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAiUGFnZUxvYWRlci5mb3JtYWwtcGFyYW1ldGVycy1vbmx5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5nZXRFeHRlbmRlZElkKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lKSwKLSAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICBic3BlYy5nZXRMb2NhdGlvbigpLAotICAgICAgICAgICAgICAgICAgICBudWxsKTsKLQotICAgICAgICAgICAgLy8gSWYgYW4gaW5mb3JtYWwgcGFyYW1ldGVyIHRoYXQgY29uZmxpY3RzIHdpdGggYSByZXNlcnZlZCBuYW1lLCB0aGVuCi0gICAgICAgICAgICAvLyBza2lwIGl0LgotCi0gICAgICAgICAgICBpZiAoIWlzRm9ybWFsICYmIHNwZWMuaXNSZXNlcnZlZFBhcmFtZXRlck5hbWUobmFtZSkpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICAgIC8vIFRoZSB0eXBlIGRldGVybWluZXMgaG93IHRvIGludGVycHJldCB0aGUgdmFsdWU6Ci0gICAgICAgICAgICAvLyBBcyBhIHNpbXBsZSBzdGF0aWMgU3RyaW5nCi0gICAgICAgICAgICAvLyBBcyBhIG5lc3RlZCBwcm9wZXJ0eSBuYW1lIChyZWxhdGl2ZSB0byB0aGUgY29tcG9uZW50KQotICAgICAgICAgICAgLy8gQXMgdGhlIG5hbWUgb2YgYSBiaW5kaW5nIGluaGVyaXRlZCBmcm9tIHRoZSBjb250YWluaW5nIGNvbXBvbmVudC4KLSAgICAgICAgICAgIC8vIEFzIHRoZSBuYW1lIG9mIGEgcHVibGljIGZpZWxkCi0gICAgICAgICAgICAvLyBBcyBhIHNjcmlwdCBmb3IgYSBsaXN0ZW5lcgotCi0gICAgICAgICAgICBCaW5kaW5nVHlwZSB0eXBlID0gYnNwZWMuZ2V0VHlwZSgpOwotCi0gICAgICAgICAgICAvLyBGb3IgaW5oZXJpdGVkIGJpbmRpbmdzLCBkZWZlciB1bnRpbCBsYXRlci4gIFRoaXMgZ2l2ZXMgY29tcG9uZW50cwotICAgICAgICAgICAgLy8gYSBjaGFuY2UgdG8gc2V0dXAgYmluZGluZ3MgZnJvbSBzdGF0aWMgdmFsdWVzIGFuZCBleHByZXNzaW9ucyBpbiB0aGUKLSAgICAgICAgICAgIC8vIHRlbXBsYXRlLiAgVGhlIG9yZGVyIG9mIG9wZXJhdGlvbnMgaXMgdHJpY2t5LCB0ZW1wbGF0ZSBiaW5kaW5ncyBjb21lCi0gICAgICAgICAgICAvLyBsYXRlci4KLQotICAgICAgICAgICAgaWYgKHR5cGUgPT0gQmluZGluZ1R5cGUuSU5IRVJJVEVEKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFF1ZXVlZEluaGVyaXRlZEJpbmRpbmcgcXVldWVkID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IFF1ZXVlZEluaGVyaXRlZEJpbmRpbmcoY29tcG9uZW50LCBic3BlYy5nZXRWYWx1ZSgpLCBuYW1lKTsKLSAgICAgICAgICAgICAgICBfaW5oZXJpdGVkQmluZGluZ1F1ZXVlLmFkZChxdWV1ZWQpOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAodHlwZSA9PSBCaW5kaW5nVHlwZS5MSVNURU5FUikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb25zdHJ1Y3RMaXN0ZW5lckJpbmRpbmcoY29tcG9uZW50LCBuYW1lLCAoSUxpc3RlbmVyQmluZGluZ1NwZWNpZmljYXRpb24pIGJzcGVjKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgSUJpbmRpbmcgYmluZGluZyA9IGNvbnZlcnQoY29udGFpbmVyLCBic3BlYyk7Ci0KLSAgICAgICAgICAgIGlmIChiaW5kaW5nICE9IG51bGwpCi0gICAgICAgICAgICAgICAgY29tcG9uZW50LnNldEJpbmRpbmcobmFtZSwgYmluZGluZyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIElCaW5kaW5nIGNvbnZlcnQoSUNvbXBvbmVudCBjb250YWluZXIsIElCaW5kaW5nU3BlY2lmaWNhdGlvbiBzcGVjKQotICAgIHsKLSAgICAgICAgQmluZGluZ1R5cGUgdHlwZSA9IHNwZWMuZ2V0VHlwZSgpOwotICAgICAgICBJTG9jYXRpb24gbG9jYXRpb24gPSBzcGVjLmdldExvY2F0aW9uKCk7Ci0gICAgICAgIFN0cmluZyB2YWx1ZSA9IHNwZWMuZ2V0VmFsdWUoKTsKLQotICAgICAgICAvLyBUaGUgbW9zdCBjb21tb24gdHlwZS4gCi0gICAgICAgIC8vIFRPRE8gVGhlc2UgYmluZGluZ3Mgc2hvdWxkIGJlIGNyZWF0ZWQgc29tZWhvdyB1c2luZyB0aGUgU3BlY0ZhY3RvcnkgaW4gU3BlY2lmaWNhdGlvblBhcnNlcgotICAgICAgICBpZiAodHlwZSA9PSBCaW5kaW5nVHlwZS5EWU5BTUlDKQotICAgICAgICAgICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uQmluZGluZyhfcmVzb2x2ZXIsIGNvbnRhaW5lciwgdmFsdWUsIGxvY2F0aW9uKTsKLQotICAgICAgICAvLyBTdHJpbmcgYmluZGluZ3MgYXJlIG5ldyBpbiAyLjAuNC4gIEZvciB0aGUgbW9tZW1lbnQsCi0gICAgICAgIC8vIHdlIGRvbid0IGV2ZW4gdHJ5IHRvIGNhY2hlIGFuZCBzaGFyZSB0aGVtIC4uLiB0aGV5Ci0gICAgICAgIC8vIGFyZSBtb3N0IG9mdGVuIHVuaXF1ZSB3aXRoaW4gYSBwYWdlLgotCi0gICAgICAgIGlmICh0eXBlID09IEJpbmRpbmdUeXBlLlNUUklORykKLSAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nQmluZGluZyhjb250YWluZXIsIHZhbHVlLCBsb2NhdGlvbik7Ci0KLSAgICAgICAgLy8gc3RhdGljIGFuZCBmaWVsZCBiaW5kaW5ncyBhcmUgcG9vbGVkLiAgVGhpcyBhbGxvd3MgdGhlCi0gICAgICAgIC8vIHNhbWUgaW5zdGFuY2UgdG8gYmUgdXNlZCB3aXRoIG1hbnkgY29tcG9uZW50cy4KLQotICAgICAgICBpZiAodHlwZSA9PSBCaW5kaW5nVHlwZS5TVEFUSUMpCi0gICAgICAgICAgICByZXR1cm4gbmV3IFN0YXRpY0JpbmRpbmcodmFsdWUsIGxvY2F0aW9uKTsKLQotICAgICAgICAvLyBCaW5kaW5nVHlwZS5GSUVMRCBpcyBvbiB0aGUgd2F5IG91dCwgaXQgaXMgaW4gdGhlCi0gICAgICAgIC8vIDEuMyBEVEQgYnV0IG5vdCB0aGUgMS40IERURC4KLQotICAgICAgICBpZiAodHlwZSA9PSBCaW5kaW5nVHlwZS5GSUVMRCkKLSAgICAgICAgICAgIHJldHVybiBuZXcgRmllbGRCaW5kaW5nKF9yZXNvbHZlciwgdmFsdWUsIGxvY2F0aW9uKTsKLQotICAgICAgICAvLyBUaGlzIGNvZGUgaXMgdW5yZWFjaGFibGUsIGF0IGxlYXN0IHVudGlsIGEgbmV3IHR5cGUKLSAgICAgICAgLy8gb2YgYmluZGluZyBpcyBjcmVhdGVkLgotCi0gICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24oIlVuZXhwZWN0ZWQgdHlwZTogIiArIHR5cGUgKyAiLiIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBDb25zdHJ1Y3QgYSB7QGxpbmsgTGlzdGVuZXJCaW5kaW5nfSBmb3IgdGhlIGNvbXBvbmVudCwgYW5kIGFkZCBpdC4KLSAgICAgKiAKLSAgICAgKiAgQHNpbmNlIDMuMAotICAgICAqIAotICAgICAqKi8KLQotICAgIHByaXZhdGUgdm9pZCBjb25zdHJ1Y3RMaXN0ZW5lckJpbmRpbmcoCi0gICAgICAgIElDb21wb25lbnQgY29tcG9uZW50LAotICAgICAgICBTdHJpbmcgYmluZGluZ05hbWUsCi0gICAgICAgIElMaXN0ZW5lckJpbmRpbmdTcGVjaWZpY2F0aW9uIHNwZWMpCi0gICAgewotICAgICAgICBTdHJpbmcgbGFuZ3VhZ2UgPSBzcGVjLmdldExhbmd1YWdlKCk7Ci0KLSAgICAgICAgLy8gSWYgbm90IHByb3ZpZGVkIGluIHRoZSBwYWdlIG9yIGNvbXBvbmVudCBzcGVjaWZpY2F0aW9uLCB0aGVuCi0gICAgICAgIC8vIHNlYXJjaCBmb3IgYSBkZWZhdWx0IChmYWN0b3J5IGRlZmF1bHQgaXMgImp5dGhvbiIpLgotCi0gICAgICAgIGlmIChUYXBlc3RyeS5pc0JsYW5rKGxhbmd1YWdlKSkKLSAgICAgICAgICAgIGxhbmd1YWdlID0KLSAgICAgICAgICAgICAgICBfZW5naW5lLmdldFByb3BlcnR5U291cmNlKCkuZ2V0UHJvcGVydHlWYWx1ZSgKLSAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGFwZXN0cnkuZGVmYXVsdC1zY3JpcHQtbGFuZ3VhZ2UiKTsKLQotICAgICAgICAvLyBDb25zdHJ1Y3QgdGhlIGJpbmRpbmcuICBUaGUgZmlyc3QgcGFyYW1ldGVyIGlzIHRoZSBjb21wb25vbmVudAotICAgICAgICAvLyAobm90IHRoZSBEaXJlY3RMaW5rIG9yIEZvcm0sIGJ1dCB0aGUgcGFnZSBvciBjb21wb25lbnQgY29udGFpbmluZyB0aGUgbGluayBvciBmb3JtKS4KLQotICAgICAgICBJQmluZGluZyBiaW5kaW5nID0KLSAgICAgICAgICAgIG5ldyBMaXN0ZW5lckJpbmRpbmcoCi0gICAgICAgICAgICAgICAgY29tcG9uZW50LmdldENvbnRhaW5lcigpLAotICAgICAgICAgICAgICAgIGxhbmd1YWdlLAotICAgICAgICAgICAgICAgIHNwZWMuZ2V0U2NyaXB0KCksCi0gICAgICAgICAgICAgICAgc3BlYy5nZXRMb2NhdGlvbigpKTsKLQotICAgICAgICBjb21wb25lbnQuc2V0QmluZGluZyhiaW5kaW5nTmFtZSwgYmluZGluZyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFNldHMgdXAgYSBjb21wb25lbnQuICBUaGlzIGludm9sdmVzOgotICAgICAqICA8dWw+Ci0gICAgICogPGxpPkluc3RhbnRpYXRpbmcgYW55IGNvbnRhaW5lZCBjb21wb25lbnRzLgotICAgICAqIDxsaT5BZGQgdGhlIGNvbnRhaW5lZCBjb21wb25lbnRzIHRvIHRoZSBjb250YWluZXIuCi0gICAgICogPGxpPlNldHRpbmcgdXAgYmluZGluZ3MgYmV0d2VlbiBjb250YWluZXIgYW5kIGNvbnRhaW5lZXMuCi0gICAgICogPGxpPkNvbnN0cnVjdCB0aGUgY29udGFpbmVlcyByZWN1cnNpdmVseS4KLSAgICAgKiA8bGk+SW52b2tpbmcge0BsaW5rIElDb21wb25lbnQjZmluaXNoTG9hZChJUmVxdWVzdEN5Y2xlLCBJUGFnZUxvYWRlciwgSUNvbXBvbmVudFNwZWNpZmljYXRpb24pfQotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiAgQHBhcmFtIGN5Y2xlIHRoZSByZXF1ZXN0IGN5Y2xlIGZvciB3aGljaCB0aGUgcGFnZSBpcyBiZWluZyAoaW5pdGlhbGx5KSBjb25zdHJ1Y3RlZAotICAgICAqICBAcGFyYW0gcGFnZSBUaGUgcGFnZSBvbiB3aGljaCB0aGUgY29udGFpbmVyIGV4aXN0cy4KLSAgICAgKiAgQHBhcmFtIGNvbnRhaW5lciBUaGUgY29tcG9uZW50IHRvIGJlIHNldCB1cC4KLSAgICAgKiAgQHBhcmFtIGNvbnRhaW5lclNwZWMgVGhlIHNwZWNpZmljYXRpb24gZm9yIHRoZSBjb250YWluZXIuCi0gICAgICogIEBwYXJhbSB0aGUgbmFtZXNwYWNlIG9mIHRoZSBjb250YWluZXIKLSAgICAgKgotICAgICAqKi8KLQotICAgIHByaXZhdGUgdm9pZCBjb25zdHJ1Y3RDb21wb25lbnQoCi0gICAgICAgIElSZXF1ZXN0Q3ljbGUgY3ljbGUsCi0gICAgICAgIElQYWdlIHBhZ2UsCi0gICAgICAgIElDb21wb25lbnQgY29udGFpbmVyLAotICAgICAgICBJQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBjb250YWluZXJTcGVjLAotICAgICAgICBJTmFtZXNwYWNlIG5hbWVzcGFjZSkKLSAgICB7Ci0gICAgICAgIF9kZXB0aCsrOwotICAgICAgICBpZiAoX2RlcHRoID4gX21heERlcHRoKQotICAgICAgICAgICAgX21heERlcHRoID0gX2RlcHRoOwotCi0gICAgICAgIExpc3QgaWRzID0gbmV3IEFycmF5TGlzdChjb250YWluZXJTcGVjLmdldENvbXBvbmVudElkcygpKTsKLSAgICAgICAgaW50IGNvdW50ID0gaWRzLnNpemUoKTsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZyBpZCA9IChTdHJpbmcpIGlkcy5nZXQoaSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIHN1Yi1jb21wb25lbnQgc3BlY2lmaWNhdGlvbiBmcm9tIHRoZQotICAgICAgICAgICAgICAgIC8vIGNvbnRhaW5lcidzIHNwZWNpZmljYXRpb24uCi0KLSAgICAgICAgICAgICAgICBJQ29udGFpbmVkQ29tcG9uZW50IGNvbnRhaW5lZCA9IGNvbnRhaW5lclNwZWMuZ2V0Q29tcG9uZW50KGlkKTsKLQotICAgICAgICAgICAgICAgIFN0cmluZyB0eXBlID0gY29udGFpbmVkLmdldFR5cGUoKTsKLSAgICAgICAgICAgICAgICBJTG9jYXRpb24gbG9jYXRpb24gPSBjb250YWluZWQuZ2V0TG9jYXRpb24oKTsKLQotICAgICAgICAgICAgICAgIF9jb21wb25lbnRSZXNvbHZlci5yZXNvbHZlKGN5Y2xlLCBuYW1lc3BhY2UsIHR5cGUsIGxvY2F0aW9uKTsKLQotICAgICAgICAgICAgICAgIElDb21wb25lbnRTcGVjaWZpY2F0aW9uIGNvbXBvbmVudFNwZWNpZmljYXRpb24gPQotICAgICAgICAgICAgICAgICAgICBfY29tcG9uZW50UmVzb2x2ZXIuZ2V0U3BlY2lmaWNhdGlvbigpOwotICAgICAgICAgICAgICAgIElOYW1lc3BhY2UgY29tcG9uZW50TmFtZXNwYWNlID0gX2NvbXBvbmVudFJlc29sdmVyLmdldE5hbWVzcGFjZSgpOwotCi0gICAgICAgICAgICAgICAgLy8gSW5zdGFudGlhdGUgdGhlIGNvbnRhaW5lZCBjb21wb25lbnQuCi0KLSAgICAgICAgICAgICAgICBJQ29tcG9uZW50IGNvbXBvbmVudCA9Ci0gICAgICAgICAgICAgICAgICAgIGluc3RhbnRpYXRlQ29tcG9uZW50KAotICAgICAgICAgICAgICAgICAgICAgICAgcGFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50U3BlY2lmaWNhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudE5hbWVzcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uKTsKLQotICAgICAgICAgICAgICAgIC8vIEFkZCBpdCwgYnkgbmFtZSwgdG8gdGhlIGNvbnRhaW5lci4KLQotICAgICAgICAgICAgICAgIGNvbnRhaW5lci5hZGRDb21wb25lbnQoY29tcG9uZW50KTsKLQotICAgICAgICAgICAgICAgIC8vIFNldCB1cCBhbnkgYmluZGluZ3MgaW4gdGhlIElDb250YWluZWRDb21wb25lbnQgc3BlY2lmaWNhdGlvbgotCi0gICAgICAgICAgICAgICAgYmluZChjb250YWluZXIsIGNvbXBvbmVudCwgY29udGFpbmVkKTsKLQotICAgICAgICAgICAgICAgIC8vIE5vdyBjb25zdHJ1Y3QgdGhlIGNvbXBvbmVudCByZWN1c2l2ZWx5OyBpdCBnZXRzIGl0cyBjaGFuY2UKLSAgICAgICAgICAgICAgICAvLyB0byBjcmVhdGUgaXRzIHN1YmNvbXBvbmVudHMgYW5kIHNldCB0aGVpciBiaW5kaW5ncy4KLQotICAgICAgICAgICAgICAgIGNvbnN0cnVjdENvbXBvbmVudCgKLSAgICAgICAgICAgICAgICAgICAgY3ljbGUsCi0gICAgICAgICAgICAgICAgICAgIHBhZ2UsCi0gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50U3BlY2lmaWNhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50TmFtZXNwYWNlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYWRkQXNzZXRzKGNvbnRhaW5lciwgY29udGFpbmVyU3BlYyk7Ci0KLSAgICAgICAgICAgIC8vIEZpbmlzaCB0aGUgbG9hZCBvZiB0aGUgY29tcG9uZW50OyBtb3N0IGNvbXBvbmVudHMgKHdoaWNoCi0gICAgICAgICAgICAvLyBzdWJjbGFzcyBCYXNlQ29tcG9uZW50KSBsb2FkIHRoZWlyIHRlbXBsYXRlcyBoZXJlLgotICAgICAgICAgICAgLy8gVGhhdCBtYXkgY2F1c2UgeWV0IG1vcmUgY29tcG9uZW50cyB0byBiZSBjcmVhdGVkLCBhbmQgbW9yZQotICAgICAgICAgICAgLy8gYmluZGluZ3MgdG8gYmUgc2V0LCBzbyB3ZSBkZWZlciBzb21lIGNoZWNraW5nIHVudGlsCi0gICAgICAgICAgICAvLyBsYXRlci4KLQotICAgICAgICAgICAgY29udGFpbmVyLmZpbmlzaExvYWQoY3ljbGUsIHRoaXMsIGNvbnRhaW5lclNwZWMpOwotCi0gICAgICAgICAgICAvLyBGaW5hbGx5LCB3ZSBjcmVhdGUgYW4gaW5pdGlhbGl6ZXIgZm9yIGVhY2gKLSAgICAgICAgICAgIC8vIHNwZWNpZmllZCBwcm9wZXJ0eS4KLQotICAgICAgICAgICAgY3JlYXRlUHJvcGVydHlJbml0aWFsaXplcnMocGFnZSwgY29udGFpbmVyLCBjb250YWluZXJTcGVjKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uIGV4KQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBleDsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICBUYXBlc3RyeS5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICJQYWdlTG9hZGVyLnVuYWJsZS10by1pbnN0YW50aWF0ZS1jb21wb25lbnQiLAotICAgICAgICAgICAgICAgICAgICBjb250YWluZXIuZ2V0RXh0ZW5kZWRJZCgpLAotICAgICAgICAgICAgICAgICAgICBleC5nZXRNZXNzYWdlKCkpLAotICAgICAgICAgICAgICAgIGNvbnRhaW5lciwKLSAgICAgICAgICAgICAgICBudWxsLAotICAgICAgICAgICAgICAgIGV4KTsKLSAgICAgICAgfQotCi0gICAgICAgIF9kZXB0aC0tOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBJbnZva2VkIHRvIGNyZWF0ZSBhbiBpbXBsaWNpdCBjb21wb25lbnQgKG9uZSB3aGljaCBpcyBkZWZpbmVkIGluIHRoZQotICAgICAqICBjb250YWluaW5nIGNvbXBvbmVudCdzIHRlbXBsYXRlLCByYXRoZXIgdGhhdCBpbiB0aGUgY29udGFpbmluZyBjb21wb25lbnQncwotICAgICAqICBzcGVjaWZpY2F0aW9uKS4KLSAgICAgKiAKLSAgICAgKiAgQHNlZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LkJhc2VDb21wb25lbnRUZW1wbGF0ZUxvYWRlcgotICAgICAqICBAc2luY2UgMy4wCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIElDb21wb25lbnQgY3JlYXRlSW1wbGljaXRDb21wb25lbnQoCi0gICAgICAgIElSZXF1ZXN0Q3ljbGUgY3ljbGUsCi0gICAgICAgIElDb21wb25lbnQgY29udGFpbmVyLAotICAgICAgICBTdHJpbmcgY29tcG9uZW50SWQsCi0gICAgICAgIFN0cmluZyBjb21wb25lbnRUeXBlLAotICAgICAgICBJTG9jYXRpb24gbG9jYXRpb24pCi0gICAgewotICAgICAgICBJUGFnZSBwYWdlID0gY29udGFpbmVyLmdldFBhZ2UoKTsKLQotICAgICAgICBfY29tcG9uZW50UmVzb2x2ZXIucmVzb2x2ZShjeWNsZSwgY29udGFpbmVyLmdldE5hbWVzcGFjZSgpLCBjb21wb25lbnRUeXBlLCBsb2NhdGlvbik7Ci0KLSAgICAgICAgSU5hbWVzcGFjZSBjb21wb25lbnROYW1lc3BhY2UgPSBfY29tcG9uZW50UmVzb2x2ZXIuZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgIElDb21wb25lbnRTcGVjaWZpY2F0aW9uIHNwZWMgPSBfY29tcG9uZW50UmVzb2x2ZXIuZ2V0U3BlY2lmaWNhdGlvbigpOwotCi0gICAgICAgIElDb21wb25lbnQgcmVzdWx0ID0KLSAgICAgICAgICAgIGluc3RhbnRpYXRlQ29tcG9uZW50KHBhZ2UsIGNvbnRhaW5lciwgY29tcG9uZW50SWQsIHNwZWMsIGNvbXBvbmVudE5hbWVzcGFjZSwgbG9jYXRpb24pOwotCi0gICAgICAgIGNvbnRhaW5lci5hZGRDb21wb25lbnQocmVzdWx0KTsKLQotICAgICAgICAvLyBSZWN1c2l2ZWx5IGJ1aWxkIHRoZSBjb21wb25lbnQuCi0KLSAgICAgICAgY29uc3RydWN0Q29tcG9uZW50KGN5Y2xlLCBwYWdlLCByZXN1bHQsIHNwZWMsIGNvbXBvbmVudE5hbWVzcGFjZSk7Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgSW5zdGFudGlhdGVzIGEgY29tcG9uZW50IGZyb20gaXRzIHNwZWNpZmljYXRpb24uIFdlIGluc3RhbnRpYXRlCi0gICAgICogIHRoZSBjb21wb25lbnQgb2JqZWN0LCB0aGVuIHNldCBpdHMgc3BlY2lmaWNhdGlvbiwgcGFnZSwgY29udGFpbmVyIGFuZCBpZC4KLSAgICAgKgotICAgICAqICBAc2VlIEFic3RyYWN0Q29tcG9uZW50Ci0gICAgICogCi0gICAgICoqLwotCi0gICAgcHJpdmF0ZSBJQ29tcG9uZW50IGluc3RhbnRpYXRlQ29tcG9uZW50KAotICAgICAgICBJUGFnZSBwYWdlLAotICAgICAgICBJQ29tcG9uZW50IGNvbnRhaW5lciwKLSAgICAgICAgU3RyaW5nIGlkLAotICAgICAgICBJQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBzcGVjLAotICAgICAgICBJTmFtZXNwYWNlIG5hbWVzcGFjZSwKLSAgICAgICAgSUxvY2F0aW9uIGxvY2F0aW9uKQotICAgIHsKLSAgICAgICAgSUNvbXBvbmVudCByZXN1bHQgPSBudWxsOwotICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gc3BlYy5nZXRDb21wb25lbnRDbGFzc05hbWUoKTsKLQotICAgICAgICBpZiAoVGFwZXN0cnkuaXNCbGFuayhjbGFzc05hbWUpKQotICAgICAgICAgICAgY2xhc3NOYW1lID0gQmFzZUNvbXBvbmVudC5jbGFzcy5nZXROYW1lKCk7Ci0KLSAgICAgICAgQ2xhc3MgY29tcG9uZW50Q2xhc3MgPSBfZW5oYW5jZXIuZ2V0RW5oYW5jZWRDbGFzcyhzcGVjLCBjbGFzc05hbWUpOwotICAgICAgICBTdHJpbmcgZW5oYW5jZWRDbGFzc05hbWUgPSBjb21wb25lbnRDbGFzcy5nZXROYW1lKCk7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IChJQ29tcG9uZW50KSBjb21wb25lbnRDbGFzcy5uZXdJbnN0YW5jZSgpOwotCi0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBleCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICBUYXBlc3RyeS5mb3JtYXQoIlBhZ2VMb2FkZXIuY2xhc3Mtbm90LWNvbXBvbmVudCIsIGVuaGFuY2VkQ2xhc3NOYW1lKSwKLSAgICAgICAgICAgICAgICBjb250YWluZXIsCi0gICAgICAgICAgICAgICAgc3BlYy5nZXRMb2NhdGlvbigpLAotICAgICAgICAgICAgICAgIGV4KTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIGV4KQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIFRhcGVzdHJ5LmZvcm1hdCgiUGFnZUxvYWRlci51bmFibGUtdG8taW5zdGFudGlhdGUiLCBlbmhhbmNlZENsYXNzTmFtZSksCi0gICAgICAgICAgICAgICAgY29udGFpbmVyLAotICAgICAgICAgICAgICAgIHNwZWMuZ2V0TG9jYXRpb24oKSwKLSAgICAgICAgICAgICAgICBleCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgSVBhZ2UpCi0gICAgICAgICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIFRhcGVzdHJ5LmZvcm1hdCgiUGFnZUxvYWRlci5wYWdlLW5vdC1hbGxvd2VkIiwgcmVzdWx0LmdldEV4dGVuZGVkSWQoKSksCi0gICAgICAgICAgICAgICAgcmVzdWx0LAotICAgICAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAgICAgbnVsbCk7Ci0KLSAgICAgICAgcmVzdWx0LnNldE5hbWVzcGFjZShuYW1lc3BhY2UpOwotICAgICAgICByZXN1bHQuc2V0U3BlY2lmaWNhdGlvbihzcGVjKTsKLSAgICAgICAgcmVzdWx0LnNldFBhZ2UocGFnZSk7Ci0gICAgICAgIHJlc3VsdC5zZXRDb250YWluZXIoY29udGFpbmVyKTsKLSAgICAgICAgcmVzdWx0LnNldElkKGlkKTsKLSAgICAgICAgcmVzdWx0LnNldExvY2F0aW9uKGxvY2F0aW9uKTsKLQotICAgICAgICBfY291bnQrKzsKLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBJbnN0YW50aXRhdGVzIGEgcGFnZSBmcm9tIGl0cyBzcGVjaWZpY2F0aW9uLgotICAgICAqCi0gICAgICogIEBwYXJhbSBuYW1lIHRoZSB1bnF1YWxpZmllZCwgc2ltcGxlLCBuYW1lIGZvciB0aGUgcGFnZQotICAgICAqICBAcGFyYW0gbmFtZXNwYWNlIHRoZSBuYW1lc3BhY2UgY29udGFpbmluZyB0aGUgcGFnZSdzIHNwZWNpZmljYXRpb24KLSAgICAgKiAgQHBhcmFtIHNwZWMgdGhlIHBhZ2UncyBzcGVjaWZpY2F0aW9uCi0gICAgICogCi0gICAgICogIFdlIGluc3RhbnRpYXRlIHRoZSBwYWdlIG9iamVjdCwgdGhlbiBzZXQgaXRzIHNwZWNpZmljYXRpb24sCi0gICAgICogIG5hbWVzIGFuZCBsb2NhbGUuCi0gICAgICoKLSAgICAgKiAgQHNlZSBJRW5naW5lCi0gICAgICogIEBzZWUgQ2hhbmdlT2JzZXJ2ZXIKLSAgICAgKiovCi0KLSAgICBwcml2YXRlIElQYWdlIGluc3RhbnRpYXRlUGFnZShTdHJpbmcgbmFtZSwgSU5hbWVzcGFjZSBuYW1lc3BhY2UsIElDb21wb25lbnRTcGVjaWZpY2F0aW9uIHNwZWMpCi0gICAgewotICAgICAgICBJUGFnZSByZXN1bHQgPSBudWxsOwotCi0gICAgICAgIFN0cmluZyBwYWdlTmFtZSA9IG5hbWVzcGFjZS5jb25zdHJ1Y3RRdWFsaWZpZWROYW1lKG5hbWUpOwotICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gc3BlYy5nZXRDb21wb25lbnRDbGFzc05hbWUoKTsKLSAgICAgICAgSUxvY2F0aW9uIGxvY2F0aW9uID0gc3BlYy5nZXRMb2NhdGlvbigpOwotCi0gICAgICAgIGlmIChUYXBlc3RyeS5pc0JsYW5rKGNsYXNzTmFtZSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChMT0cuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICBMT0cuZGVidWcoCi0gICAgICAgICAgICAgICAgICAgICJQYWdlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgbmFtZXNwYWNlLmNvbnN0cnVjdFF1YWxpZmllZE5hbWUobmFtZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiBkb2VzIG5vdCBzcGVjaWZ5IGEgY29tcG9uZW50IGNsYXNzLiIpOwotCi0gICAgICAgICAgICBjbGFzc05hbWUgPQotICAgICAgICAgICAgICAgIF9lbmdpbmUuZ2V0UHJvcGVydHlTb3VyY2UoKS5nZXRQcm9wZXJ0eVZhbHVlKAotICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS50YXBlc3RyeS5kZWZhdWx0LXBhZ2UtY2xhc3MiKTsKLQotICAgICAgICAgICAgaWYgKGNsYXNzTmFtZSA9PSBudWxsKQotICAgICAgICAgICAgICAgIGNsYXNzTmFtZSA9IEJhc2VQYWdlLmNsYXNzLmdldE5hbWUoKTsKLQotICAgICAgICAgICAgaWYgKExPRy5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIExPRy5kZWJ1ZygiRGVmYXVsdGluZyB0byBjbGFzcyAiICsgY2xhc3NOYW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIENsYXNzIHBhZ2VDbGFzcyA9IF9lbmhhbmNlci5nZXRFbmhhbmNlZENsYXNzKHNwZWMsIGNsYXNzTmFtZSk7Ci0gICAgICAgIFN0cmluZyBlbmhhbmNlZENsYXNzTmFtZSA9IHBhZ2VDbGFzcy5nZXROYW1lKCk7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IChJUGFnZSkgcGFnZUNsYXNzLm5ld0luc3RhbmNlKCk7Ci0KLSAgICAgICAgICAgIHJlc3VsdC5zZXROYW1lc3BhY2UobmFtZXNwYWNlKTsKLSAgICAgICAgICAgIHJlc3VsdC5zZXRTcGVjaWZpY2F0aW9uKHNwZWMpOwotICAgICAgICAgICAgcmVzdWx0LnNldFBhZ2VOYW1lKHBhZ2VOYW1lKTsKLSAgICAgICAgICAgIHJlc3VsdC5zZXRQYWdlKHJlc3VsdCk7Ci0gICAgICAgICAgICByZXN1bHQuc2V0TG9jYWxlKF9sb2NhbGUpOwotICAgICAgICAgICAgcmVzdWx0LnNldExvY2F0aW9uKGxvY2F0aW9uKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGV4KQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIFRhcGVzdHJ5LmZvcm1hdCgiUGFnZUxvYWRlci5jbGFzcy1ub3QtcGFnZSIsIGVuaGFuY2VkQ2xhc3NOYW1lKSwKLSAgICAgICAgICAgICAgICBsb2NhdGlvbiwKLSAgICAgICAgICAgICAgICBleCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICBUYXBlc3RyeS5mb3JtYXQoIlBhZ2VMb2FkZXIudW5hYmxlLXRvLWluc3RhbnRpYXRlIiwgZW5oYW5jZWRDbGFzc05hbWUpLAotICAgICAgICAgICAgICAgIGxvY2F0aW9uLAotICAgICAgICAgICAgICAgIGV4KTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEludm9rZWQgYnkgdGhlIHtAbGluayBQYWdlU291cmNlfSB0byBsb2FkIGEgc3BlY2lmaWMgcGFnZS4gIFRoaXMKLSAgICAgKiAgbWV0aG9kIGlzIG5vdCByZWVudHJhbnQgLi4uIHRoZSBQYWdlU291cmNlIGVuc3VyZXMgdGhhdAotICAgICAqICBhbnkgZ2l2ZW4gaW5zdGFuY2Ugb2YgUGFnZUxvYWRlciBpcyBsb2FkaW5nIG9ubHkgYSBzaW5nbGUgcGFnZSBhdCBhIHRpbWUuCi0gICAgICogIFRoZSBwYWdlIGlzIGltbWVkaWF0ZWx5IGF0dGFjaGVkIHRvIHRoZSB7QGxpbmsgSUVuZ2luZSBlbmdpbmV9LgotICAgICAqCi0gICAgICogIEBwYXJhbSBuYW1lIHRoZSBzaW1wbGUgKHVucXVhbGlmaWVkKSBuYW1lIG9mIHRoZSBwYWdlIHRvIGxvYWQKLSAgICAgKiAgQHBhcmFtIG5hbWVzcGFjZSBmcm9tIHdoaWNoIHRoZSBwYWdlIGlzIHRvIGJlIGxvYWRlZCAodXNlZAotICAgICAqICB3aGVuIHJlc29sdmluZyBjb21wb25lbnRzIGVtYmVkZGVkIGJ5IHRoZSBwYWdlKQotICAgICAqICBAcGFyYW0gY3ljbGUgdGhlIHJlcXVlc3QgY3ljbGUgdGhlIHBhZ2UgaXMgCi0gICAgICogIGluaXRpYWxseSBsb2FkZWQgZm9yICh0aGlzIGlzIHVzZWQKLSAgICAgKiAgdG8gZGVmaW5lIHRoZSBsb2NhbGUgb2YgdGhlIG5ldyBwYWdlLCBhbmQgcHJvdmlkZSBhY2Nlc3MKLSAgICAgKiAgdG8gdGhlIGNvcmVjdCBzcGVjaWZpY2F0aW9uIHNvdXJjZSwgZXRjLikuCi0gICAgICogIEBwYXJhbSBzcGVjaWZpY2F0aW9uIHRoZSBzcGVjaWZpY2F0aW9uIGZvciB0aGUgcGFnZQotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIElQYWdlIGxvYWRQYWdlKAotICAgICAgICBTdHJpbmcgbmFtZSwKLSAgICAgICAgSU5hbWVzcGFjZSBuYW1lc3BhY2UsCi0gICAgICAgIElSZXF1ZXN0Q3ljbGUgY3ljbGUsCi0gICAgICAgIElDb21wb25lbnRTcGVjaWZpY2F0aW9uIHNwZWNpZmljYXRpb24pCi0gICAgewotICAgICAgICBJUGFnZSBwYWdlID0gbnVsbDsKLQotICAgICAgICBfZW5naW5lID0gY3ljbGUuZ2V0RW5naW5lKCk7Ci0KLSAgICAgICAgX2xvY2FsZSA9IF9lbmdpbmUuZ2V0TG9jYWxlKCk7Ci0KLSAgICAgICAgX2NvdW50ID0gMDsKLSAgICAgICAgX2RlcHRoID0gMDsKLSAgICAgICAgX21heERlcHRoID0gMDsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcGFnZSA9IGluc3RhbnRpYXRlUGFnZShuYW1lLCBuYW1lc3BhY2UsIHNwZWNpZmljYXRpb24pOwotCi0gICAgICAgICAgICBwYWdlLmF0dGFjaChfZW5naW5lKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gQXMgb2YgMy4wLjEsIHRoaXMgaXMgZG9uZSBub3csIHJhdGhlciB0aGFuIGFmdGVyIGNvbnN0cnVjdGluZyB0aGUgcGFnZSBhbmQgaXRzIAotICAgICAgICAgICAgLy8gY29tcG9uZW50cy4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgcGFnZS5zZXRSZXF1ZXN0Q3ljbGUoY3ljbGUpOwotCi0gICAgICAgICAgICBjb25zdHJ1Y3RDb21wb25lbnQoY3ljbGUsIHBhZ2UsIHBhZ2UsIHNwZWNpZmljYXRpb24sIG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgIC8vIFdhbGsgdGhyb3VnaCB0aGUgY29tcGxldGUgY29tcG9uZW50IHRyZWUgdG8gc2V0IHVwIHRoZSBkZWZhdWx0IHBhcmFtZXRlciB2YWx1ZXMuCi0gICAgICAgICAgICBfZXN0YWJsaXNoRGVmYXVsdFBhcmFtZXRlclZhbHVlc1dhbGtlci53YWxrQ29tcG9uZW50VHJlZShwYWdlKTsKLQotICAgICAgICAgICAgZXN0YWJsaXNoSW5oZXJpdGVkQmluZGluZ3MoKTsKLQotICAgICAgICAgICAgLy8gV2FsayB0aHJvdWdoIHRoZSBjb21wbGV0ZSBjb21wb25lbnQgdHJlZSB0byBlbnN1cmUgdGhhdCByZXF1aXJlZCBwYXJhbWV0ZXJzIGFyZSBib3VuZCAKLSAgICAgICAgICAgIF92ZXJpZnlSZXF1aXJlZFBhcmFtZXRlcnNXYWxrZXIud2Fsa0NvbXBvbmVudFRyZWUocGFnZSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGVzdGFibGlzaERlZmF1bHRQcm9wZXJ0eVZhbHVlcygpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgX2xvY2FsZSA9IG51bGw7Ci0gICAgICAgICAgICBfZW5naW5lID0gbnVsbDsKLSAgICAgICAgICAgIF9pbmhlcml0ZWRCaW5kaW5nUXVldWUuY2xlYXIoKTsKLSAgICAgICAgICAgIF9wcm9wZXJ0eUluaXRpYWxpemVycy5jbGVhcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKExPRy5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICAgICAgTE9HLmRlYnVnKAotICAgICAgICAgICAgICAgICJMb2FkZWQgcGFnZSAiCi0gICAgICAgICAgICAgICAgICAgICsgcGFnZQotICAgICAgICAgICAgICAgICAgICArICIgd2l0aCAiCi0gICAgICAgICAgICAgICAgICAgICsgX2NvdW50Ci0gICAgICAgICAgICAgICAgICAgICsgIiBjb21wb25lbnRzIChtYXhpbXVtIGRlcHRoICIKLSAgICAgICAgICAgICAgICAgICAgKyBfbWF4RGVwdGgKLSAgICAgICAgICAgICAgICAgICAgKyAiKSIpOwotCi0gICAgICAgIHJldHVybiBwYWdlOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBlc3RhYmxpc2hJbmhlcml0ZWRCaW5kaW5ncygpCi0gICAgewotICAgICAgICBMT0cuZGVidWcoIkVzdGFibGlzaGluZyBpbmhlcml0ZWQgYmluZGluZ3MiKTsKLQotICAgICAgICBpbnQgY291bnQgPSBfaW5oZXJpdGVkQmluZGluZ1F1ZXVlLnNpemUoKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIElRdWV1ZWRJbmhlcml0ZWRCaW5kaW5nIHF1ZXVlZCA9Ci0gICAgICAgICAgICAgICAgKElRdWV1ZWRJbmhlcml0ZWRCaW5kaW5nKSBfaW5oZXJpdGVkQmluZGluZ1F1ZXVlLmdldChpKTsKLQotICAgICAgICAgICAgcXVldWVkLmNvbm5lY3QoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgZXN0YWJsaXNoRGVmYXVsdFByb3BlcnR5VmFsdWVzKCkKLSAgICB7Ci0gICAgICAgIExPRy5kZWJ1ZygiU2V0dGluZyBkZWZhdWx0IHByb3BlcnR5IHZhbHVlcyIpOwotCi0gICAgICAgIGludCBjb3VudCA9IF9wcm9wZXJ0eUluaXRpYWxpemVycy5zaXplKCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBQYWdlRGV0YWNoTGlzdGVuZXIgaW5pdGlhbGl6ZXIgPQotICAgICAgICAgICAgICAgIChQYWdlRGV0YWNoTGlzdGVuZXIpIF9wcm9wZXJ0eUluaXRpYWxpemVycy5nZXQoaSk7Ci0KLSAgICAgICAgICAgIGluaXRpYWxpemVyLnBhZ2VEZXRhY2hlZChudWxsKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGRBc3NldHMoSUNvbXBvbmVudCBjb21wb25lbnQsIElDb21wb25lbnRTcGVjaWZpY2F0aW9uIHNwZWNpZmljYXRpb24pCi0gICAgewotICAgICAgICBMaXN0IG5hbWVzID0gc3BlY2lmaWNhdGlvbi5nZXRBc3NldE5hbWVzKCk7Ci0KLSAgICAgICAgaWYgKG5hbWVzLmlzRW1wdHkoKSkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBJUmVzb3VyY2VMb2NhdGlvbiBzcGVjTG9jYXRpb24gPSBzcGVjaWZpY2F0aW9uLmdldFNwZWNpZmljYXRpb25Mb2NhdGlvbigpOwotCi0gICAgICAgIEl0ZXJhdG9yIGkgPSBuYW1lcy5pdGVyYXRvcigpOwotCi0gICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBpLm5leHQoKTsKLSAgICAgICAgICAgIElBc3NldFNwZWNpZmljYXRpb24gYXNzZXRTcGVjID0gc3BlY2lmaWNhdGlvbi5nZXRBc3NldChuYW1lKTsKLSAgICAgICAgICAgIElBc3NldCBhc3NldCA9IGNvbnZlcnQobmFtZSwgY29tcG9uZW50LCBhc3NldFNwZWMsIHNwZWNMb2NhdGlvbik7Ci0KLSAgICAgICAgICAgIGNvbXBvbmVudC5hZGRBc3NldChuYW1lLCBhc3NldCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgSW52b2tlZCBmcm9tIAotICAgICAqICB7QGxpbmsgI2NvbnN0cnVjdENvbXBvbmVudChJUmVxdWVzdEN5Y2xlLCBJUGFnZSwgSUNvbXBvbmVudCwgSUNvbXBvbmVudFNwZWNpZmljYXRpb24sIElOYW1lc3BhY2UpfQotICAgICAqICBhZnRlciB7QGxpbmsgSUNvbXBvbmVudCNmaW5pc2hMb2FkKElSZXF1ZXN0Q3ljbGUsIElQYWdlTG9hZGVyLCBJQ29tcG9uZW50U3BlY2lmaWNhdGlvbil9Ci0gICAgICogIGlzIGludm9rZWQuICBUaGlzIGl0ZXJhdGVzIG92ZXIgYW55Ci0gICAgICogIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LnNwZWMuSVByb3BlcnR5U3BlY2lmaWNhdGlvbn1zIGZvciB0aGUgY29tcG9uZW50LAotICAgICAqICBjcmVhdGUgYW4gaW5pdGlhbGl6ZXIgZm9yIGVhY2guCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVByb3BlcnR5SW5pdGlhbGl6ZXJzKAotICAgICAgICBJUGFnZSBwYWdlLAotICAgICAgICBJQ29tcG9uZW50IGNvbXBvbmVudCwKLSAgICAgICAgSUNvbXBvbmVudFNwZWNpZmljYXRpb24gc3BlYykKLSAgICB7Ci0gICAgICAgIExpc3QgbmFtZXMgPSBzcGVjLmdldFByb3BlcnR5U3BlY2lmaWNhdGlvbk5hbWVzKCk7Ci0gICAgICAgIGludCBjb3VudCA9IG5hbWVzLnNpemUoKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZykgbmFtZXMuZ2V0KGkpOwotICAgICAgICAgICAgSVByb3BlcnR5U3BlY2lmaWNhdGlvbiBwcyA9IHNwZWMuZ2V0UHJvcGVydHlTcGVjaWZpY2F0aW9uKG5hbWUpOwotICAgICAgICAgICAgU3RyaW5nIGV4cHJlc3Npb24gPSBwcy5nZXRJbml0aWFsVmFsdWUoKTsKLQotICAgICAgICAgICAgUGFnZURldGFjaExpc3RlbmVyIGluaXRpYWxpemVyID0KLSAgICAgICAgICAgICAgICBuZXcgUHJvcGVydHlJbml0aWFsaXplcihfcmVzb2x2ZXIsIGNvbXBvbmVudCwgbmFtZSwgZXhwcmVzc2lvbiwgcHMuZ2V0TG9jYXRpb24oKSk7Ci0KLSAgICAgICAgICAgIF9wcm9wZXJ0eUluaXRpYWxpemVycy5hZGQoaW5pdGlhbGl6ZXIpOwotICAgICAgICAgICAgcGFnZS5hZGRQYWdlRGV0YWNoTGlzdGVuZXIoaW5pdGlhbGl6ZXIpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgQnVpbGRzIGFuIGluc3RhbmNlIG9mIHtAbGluayBJQXNzZXR9IGZyb20gdGhlIHNwZWNpZmljYXRpb24uCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwcml2YXRlIElBc3NldCBjb252ZXJ0KAotICAgICAgICBTdHJpbmcgYXNzZXROYW1lLAotICAgICAgICBJQ29tcG9uZW50IGNvbXBvbmVudCwKLSAgICAgICAgSUFzc2V0U3BlY2lmaWNhdGlvbiBzcGVjLAotICAgICAgICBJUmVzb3VyY2VMb2NhdGlvbiBzcGVjaWZpY2F0aW9uTG9jYXRpb24pCi0gICAgewotICAgICAgICBBc3NldFR5cGUgdHlwZSA9IHNwZWMuZ2V0VHlwZSgpOwotICAgICAgICBTdHJpbmcgcGF0aCA9IHNwZWMuZ2V0UGF0aCgpOwotICAgICAgICBJTG9jYXRpb24gbG9jYXRpb24gPSBzcGVjLmdldExvY2F0aW9uKCk7Ci0KLSAgICAgICAgaWYgKHR5cGUgPT0gQXNzZXRUeXBlLkVYVEVSTkFMKQotICAgICAgICAgICAgcmV0dXJuIG5ldyBFeHRlcm5hbEFzc2V0KHBhdGgsIGxvY2F0aW9uKTsKLQotICAgICAgICBpZiAodHlwZSA9PSBBc3NldFR5cGUuUFJJVkFURSkKLSAgICAgICAgewotICAgICAgICAgICAgSVJlc291cmNlTG9jYXRpb24gYmFzZUxvY2F0aW9uID0gc3BlY2lmaWNhdGlvbkxvY2F0aW9uOwotCi0gICAgICAgICAgICAvLyBGdWRnZSBhIHNwZWNpYWwgY2FzZSBmb3IgcHJpdmF0ZSBhc3NldHMgd2l0aCBjb21wbGV0ZSBwYXRocy4gIFRoZSBzcGVjaWZpY2F0aW9uTG9jYXRpb24KLSAgICAgICAgICAgIC8vIGNhbid0IGJlIHVzZWQgYmVjYXVzZSBpdCBpcyBvZnRlbiBhIENvbnRleHRSZXNvdXJjZUxvY2F0aW9uLAotICAgICAgICAgICAgLy8gbm90IGEgQ2xhc3NwYXRoUmVzb3VyY2VMb2NhdGlvbi4KLQotICAgICAgICAgICAgaWYgKHBhdGguc3RhcnRzV2l0aCgiLyIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJhc2VMb2NhdGlvbiA9IG5ldyBDbGFzc3BhdGhSZXNvdXJjZUxvY2F0aW9uKF9yZXNvbHZlciwgIi8iKTsKLSAgICAgICAgICAgICAgICBwYXRoID0gcGF0aC5zdWJzdHJpbmcoMSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBuZXcgUHJpdmF0ZUFzc2V0KAotICAgICAgICAgICAgICAgIChDbGFzc3BhdGhSZXNvdXJjZUxvY2F0aW9uKSBmaW5kQXNzZXQoYXNzZXROYW1lLAotICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgIGJhc2VMb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgcGF0aCwKLSAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24pLAotICAgICAgICAgICAgICAgIGxvY2F0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBuZXcgQ29udGV4dEFzc2V0KAotICAgICAgICAgICAgKENvbnRleHRSZXNvdXJjZUxvY2F0aW9uKSBmaW5kQXNzZXQoYXNzZXROYW1lLAotICAgICAgICAgICAgICAgIGNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICBfc2VydmxldExvY2F0aW9uLAotICAgICAgICAgICAgICAgIHBhdGgsCi0gICAgICAgICAgICAgICAgbG9jYXRpb24pLAotICAgICAgICAgICAgbG9jYXRpb24pOwotICAgIH0KLQotICAgIHByaXZhdGUgSVJlc291cmNlTG9jYXRpb24gZmluZEFzc2V0KAotICAgICAgICBTdHJpbmcgYXNzZXROYW1lLAotICAgICAgICBJQ29tcG9uZW50IGNvbXBvbmVudCwKLSAgICAgICAgSVJlc291cmNlTG9jYXRpb24gYmFzZUxvY2F0aW9uLAotICAgICAgICBTdHJpbmcgcGF0aCwKLSAgICAgICAgSUxvY2F0aW9uIGxvY2F0aW9uKQotICAgIHsKLSAgICAgICAgSVJlc291cmNlTG9jYXRpb24gYXNzZXRMb2NhdGlvbiA9IGJhc2VMb2NhdGlvbi5nZXRSZWxhdGl2ZUxvY2F0aW9uKHBhdGgpOwotICAgICAgICBJUmVzb3VyY2VMb2NhdGlvbiBsb2NhbGl6ZWRMb2NhdGlvbiA9IGFzc2V0TG9jYXRpb24uZ2V0TG9jYWxpemF0aW9uKF9sb2NhbGUpOwotCi0gICAgICAgIGlmIChsb2NhbGl6ZWRMb2NhdGlvbiA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICBUYXBlc3RyeS5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICJQYWdlTG9hZGVyLm1pc3NpbmctYXNzZXQiLAotICAgICAgICAgICAgICAgICAgICBhc3NldE5hbWUsCi0gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5nZXRFeHRlbmRlZElkKCksCi0gICAgICAgICAgICAgICAgICAgIGFzc2V0TG9jYXRpb24pLAotICAgICAgICAgICAgICAgIGNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICBsb2NhdGlvbiwKLSAgICAgICAgICAgICAgICBudWxsKTsKLQotICAgICAgICByZXR1cm4gbG9jYWxpemVkTG9jYXRpb247Ci0gICAgfQotCi0gICAgcHVibGljIElFbmdpbmUgZ2V0RW5naW5lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfZW5naW5lOwotICAgIH0KLQotICAgIHB1YmxpYyBJVGVtcGxhdGVTb3VyY2UgZ2V0VGVtcGxhdGVTb3VyY2UoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9lbmdpbmUuZ2V0VGVtcGxhdGVTb3VyY2UoKTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3BhZ2Vsb2FkL1BhZ2VTb3VyY2UuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9wYWdlbG9hZC9QYWdlU291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3MmMyNWQuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3BhZ2Vsb2FkL1BhZ2VTb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4MCArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5wYWdlbG9hZDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLmJ1aWxkZXIuVG9TdHJpbmdCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUVuZ2luZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklQYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlcXVlc3RDeWNsZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZXNvdXJjZVJlc29sdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuVGFwZXN0cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5lbmdpbmUuSU1vbml0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5lbmdpbmUuSVBhZ2VTb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5yZXNvbHZlci5QYWdlU3BlY2lmaWNhdGlvblJlc29sdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkudXRpbC5NdWx0aUtleTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnV0aWwucG9vbC5Qb29sOwotCi0vKioKLSAqICBBIHNvdXJjZSBmb3IgcGFnZXMgZm9yIGEgcGFydGljdWxhciBhcHBsaWNhdGlvbi4gIEVhY2ggYXBwbGljYXRpb24KLSAqICBzaG91bGQgaGF2ZSBpdHMgb3duIDxjb2RlPlBhZ2VTb3VyY2U8L2NvZGU+LCBzdG9yaW5nIGl0IGludG8gdGhlCi0gKiAge0BsaW5rIGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHR9IHVzaW5nIGEgdW5pcXVlIGtleSAodXN1YWxseSBidWlsdCBmcm9tCi0gKiAgdGhlIGFwcGxpY2F0aW9uIG5hbWUpLgotICoKLSAqICA8cD5UaGUgPGNvZGU+UGFnZVNvdXJjZTwvY29kZT4gYWN0cyBhcyBhIHBvb2wgZm9yIHtAbGluayBJUGFnZX0gaW5zdGFuY2VzLgotICogIFBhZ2VzIGFyZSByZXRyaWV2ZWQgZnJvbSB0aGUgcG9vbCB1c2luZyB7QGxpbmsgI2dldFBhZ2UoSVJlcXVlc3RDeWNsZSwgU3RyaW5nLCBJTW9uaXRvcil9Ci0gKiAgYW5kIGFyZSBsYXRlciByZXR1cm5lZCB0byB0aGUgcG9vbCB1c2luZyB7QGxpbmsgI3JlbGVhc2VQYWdlKElQYWdlKX0uCi0gKgotICoKLSAqICA8cD5UQkQ6IFBvb2xlZCBwYWdlcyBzdGF5IGZvcmV2ZXIuICBOZWVkIGEgc3RyYXRlZ3kgZm9yIGNsZWFuaW5nIHVwIHRoZSBwb29sLAotICogIHRyYWNraW5nIHdoaWNoIHBhZ2VzIGhhdmUgYmVlbiBpbiB0aGUgcG9vbCB0aGUgbG9uZ2VzdCwgZXRjLiAgQSBtZWNoYW5pc20KLSAqICBmb3IgcmVwb3J0aW5nIHBvb2wgc3RhdGlzdGljcyB3b3VsZCBiZSB1c2VmdWwuCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqIAotICoqLwotCi1wdWJsaWMgY2xhc3MgUGFnZVNvdXJjZSBpbXBsZW1lbnRzIElQYWdlU291cmNlCi17Ci0gICAgLyoqCi0gICAgICogIEtleSB1c2VkIHRvIGZpbmQgUGFnZUxvYWRlciBpbnN0YW5jZXMgaW4gdGhlIFBvb2wuCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfTE9BREVSX1BPT0xfS0VZID0gIm9yZy5hcGFjaGUudGFwZXN0cnkuUGFnZUxvYWRlciI7Ci0KLSAgICAvKioKLSAgICAgKiBLZXkgdXNlZCB0byBmaW5kIHtAbGluayBQYWdlU3BlY2lmaWNhdGlvblJlc29sdmVyfSBpbnN0YW5jZQotICAgICAqIGluIHRoZSBwb29sLgotICAgICAqLwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfU1BFQ0lGSUNBVElPTl9SRVNPTFZFUl9LRVkgPQotICAgICAgICAib3JnLmFwYWNoZS50YXBlc3RyeS5QYWdlU3BlY2lmaWNhdGlvblJlc29sdmVyIjsKLQotICAgIHByaXZhdGUgSVJlc291cmNlUmVzb2x2ZXIgX3Jlc29sdmVyOwotCi0gICAgLyoqCi0gICAgICogIFRoZSBwb29sIG9mIHtAbGluayBJUGFnZX1zLiAgVGhlIGtleSBpcyBhIHtAbGluayBNdWx0aUtleX0sCi0gICAgICogIGJ1aWx0IGZyb20gdGhlIHBhZ2UgbmFtZSBhbmQgdGhlIHBhZ2UgbG9jYWxlLiAgVGhpcyBpcyBhIHJlZmVyZW5jZQotICAgICAqICB0byBhIHNoYXJlZCBwb29sLgotICAgICAqIAotICAgICAqICBAc2VlIElFbmdpbmUjZ2V0UG9vbCgpCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwcml2YXRlIFBvb2wgX3Bvb2w7Ci0KLSAgICBwdWJsaWMgUGFnZVNvdXJjZShJRW5naW5lIGVuZ2luZSkKLSAgICB7Ci0gICAgICAgIF9yZXNvbHZlciA9IGVuZ2luZS5nZXRSZXNvdXJjZVJlc29sdmVyKCk7Ci0gICAgICAgIF9wb29sID0gZW5naW5lLmdldFBvb2woKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSVJlc291cmNlUmVzb2x2ZXIgZ2V0UmVzb3VyY2VSZXNvbHZlcigpCi0gICAgewotICAgICAgICByZXR1cm4gX3Jlc29sdmVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBCdWlsZHMgYSBrZXkgZm9yIGEgbmFtZWQgcGFnZSBpbiB0aGUgYXBwbGljYXRpb24ncyBjdXJyZW50IGxvY2FsZS4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHByb3RlY3RlZCBNdWx0aUtleSBidWlsZEtleShJRW5naW5lIGVuZ2luZSwgU3RyaW5nIHBhZ2VOYW1lKQotICAgIHsKLSAgICAgICAgT2JqZWN0W10ga2V5czsKLQotICAgICAgICBrZXlzID0gbmV3IE9iamVjdFtdIHsgcGFnZU5hbWUsIGVuZ2luZS5nZXRMb2NhbGUoKX07Ci0KLSAgICAgICAgLy8gRG9uJ3QgbWFrZSBhIGNvcHksIHRoaXMgYXJyYXkgaXMganVzdCBmb3IgdGhlIE11bHRpS2V5LgotCi0gICAgICAgIHJldHVybiBuZXcgTXVsdGlLZXkoa2V5cywgZmFsc2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBCdWlsZHMgYSBrZXkgZnJvbSBhbiBleGlzdGluZyBwYWdlLCB1c2luZyB0aGUgcGFnZSdzIG5hbWUgYW5kIGxvY2FsZS4gIFRoaXMgaXMKLSAgICAgKiAgdXNlZCB3aGVuIHN0b3JpbmcgYSBwYWdlIGludG8gdGhlIHBvb2wuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwcm90ZWN0ZWQgTXVsdGlLZXkgYnVpbGRLZXkoSVBhZ2UgcGFnZSkKLSAgICB7Ci0gICAgICAgIE9iamVjdFtdIGtleXM7Ci0KLSAgICAgICAga2V5cyA9IG5ldyBPYmplY3RbXSB7IHBhZ2UuZ2V0UGFnZU5hbWUoKSwgcGFnZS5nZXRMb2NhbGUoKX07Ci0KLSAgICAgICAgLy8gRG9uJ3QgbWFrZSBhIGNvcHksIHRoaXMgYXJyYXkgaXMganVzdCBmb3IgdGhlIE11bHRpS2V5LgotCi0gICAgICAgIHJldHVybiBuZXcgTXVsdGlLZXkoa2V5cywgZmFsc2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBHZXRzIHRoZSBwYWdlIGZyb20gYSBwb29sLCBvciBvdGhlcndpc2UgbG9hZHMgdGhlIHBhZ2UuICBUaGlzIG9wZXJhdGlvbgotICAgICAqICBpcyB0aHJlYWRzYWZlLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIElQYWdlIGdldFBhZ2UoSVJlcXVlc3RDeWNsZSBjeWNsZSwgU3RyaW5nIHBhZ2VOYW1lLCBJTW9uaXRvciBtb25pdG9yKQotICAgIHsKLSAgICAgICAgSUVuZ2luZSBlbmdpbmUgPSBjeWNsZS5nZXRFbmdpbmUoKTsKLSAgICAgICAgT2JqZWN0IGtleSA9IGJ1aWxkS2V5KGVuZ2luZSwgcGFnZU5hbWUpOwotICAgICAgICBJUGFnZSByZXN1bHQgPSAoSVBhZ2UpIF9wb29sLnJldHJpZXZlKGtleSk7Ci0KLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBtb25pdG9yLnBhZ2VDcmVhdGVCZWdpbihwYWdlTmFtZSk7Ci0KLSAgICAgICAgICAgIC8vIFJlc29sdmVycyBhcmUgbm90IHRocmVhZHNhZmUsIHNvIHdlIGdldCBvbmUgZnJvbQotICAgICAgICAgICAgLy8gdGhlIHBvb2wgb3IgY3JlYXRlIGFzIG5lZWRlZC4KLQotICAgICAgICAgICAgUGFnZVNwZWNpZmljYXRpb25SZXNvbHZlciBwYWdlU3BlY2lmaWNhdGlvblJlc29sdmVyID0KLSAgICAgICAgICAgICAgICBnZXRQYWdlU3BlY2lmaWNhdGlvblJlc29sdmVyKGN5Y2xlKTsKLQotICAgICAgICAgICAgcGFnZVNwZWNpZmljYXRpb25SZXNvbHZlci5yZXNvbHZlKGN5Y2xlLCBwYWdlTmFtZSk7Ci0KLSAgICAgICAgICAgIC8vIExpa2V3aXNlIFBhZ2VMb2FkZXIKLQotICAgICAgICAgICAgUGFnZUxvYWRlciBsb2FkZXIgPSBnZXRQYWdlTG9hZGVyKGN5Y2xlKTsKLQotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0KLSAgICAgICAgICAgICAgICAgICAgbG9hZGVyLmxvYWRQYWdlKAotICAgICAgICAgICAgICAgICAgICAgICAgcGFnZVNwZWNpZmljYXRpb25SZXNvbHZlci5nZXRTaW1wbGVQYWdlTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgcGFnZVNwZWNpZmljYXRpb25SZXNvbHZlci5nZXROYW1lc3BhY2UoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGN5Y2xlLAotICAgICAgICAgICAgICAgICAgICAgICAgcGFnZVNwZWNpZmljYXRpb25SZXNvbHZlci5nZXRTcGVjaWZpY2F0aW9uKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWxseQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGRpc2NhcmRQYWdlTG9hZGVyKGxvYWRlcik7Ci0gICAgICAgICAgICAgICAgZGlzY2FyZFBhZ2VTcGVjaWZpY2F0aW9uUmVzb2x2ZXIocGFnZVNwZWNpZmljYXRpb25SZXNvbHZlcik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1vbml0b3IucGFnZUNyZWF0ZUVuZChwYWdlTmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBUaGUgcGFnZSBsb2FkZXIgYXR0YWNoZXMgdGhlIGVuZ2luZSwgYnV0IGEgcGFnZSBmcm9tCi0gICAgICAgICAgICAvLyB0aGUgcG9vbCBuZWVkcyB0byBiZSBleHBsaWNpdGx5IGF0dGFjaGVkLgotCi0gICAgICAgICAgICByZXN1bHQuYXR0YWNoKGVuZ2luZSk7Ci0gICAgICAgICAgICByZXN1bHQuc2V0UmVxdWVzdEN5Y2xlKGN5Y2xlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEludm9rZWQgdG8gb2J0YWluIGFuIGluc3RhbmNlIG9mIAotICAgICAqICB7QGxpbmsgUGFnZUxvYWRlcn0uICBBbiBpbnN0YW5jZSBpZiBhcXVpcmVkIGZyb20gdGhlIHBvb2wgb3IsCi0gICAgICogIGlmIG5vbmUgYXJlIGF2YWlsYWJsZSwgY3JlYXRlZCBmcmVzaC4KLSAgICAgKiAKLSAgICAgKiAgQHNpbmNlIDMuMAotICAgICAqIAotICAgICAqKi8KLQotICAgIHByb3RlY3RlZCBQYWdlTG9hZGVyIGdldFBhZ2VMb2FkZXIoSVJlcXVlc3RDeWNsZSBjeWNsZSkKLSAgICB7Ci0gICAgICAgIFBhZ2VMb2FkZXIgcmVzdWx0ID0gKFBhZ2VMb2FkZXIpIF9wb29sLnJldHJpZXZlKFBBR0VfTE9BREVSX1BPT0xfS0VZKTsKLQotICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICByZXN1bHQgPSBuZXcgUGFnZUxvYWRlcihjeWNsZSk7Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgSW52b2tlZCBvbmNlIHRoZSB7QGxpbmsgUGFnZUxvYWRlcn0gaXMgbm90Ci0gICAgICogIGxvbmdlciBuZWVkZWQ7IGl0IGlzIHRoZW4gcmV0dXJuZWQgdG8gdGhlIHBvb2wuCi0gICAgICogCi0gICAgICogIEBzaW5jZSAzLjAKLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwcm90ZWN0ZWQgdm9pZCBkaXNjYXJkUGFnZUxvYWRlcihQYWdlTG9hZGVyIGxvYWRlcikKLSAgICB7Ci0gICAgICAgIF9wb29sLnN0b3JlKFBBR0VfTE9BREVSX1BPT0xfS0VZLCBsb2FkZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEludm9rZWQgdG8gb2J0YWluIGFuIGluc3RhbmNlIG9mIHtAbGluayBQYWdlU3BlY2lmaWNhdGlvblJlc29sdmVyfS4KLSAgICAgKiBBbiBpbnN0YW5jZSBpcyBhY3F1aXJlZCBmb3JtIHRoZSBwb29sIG9yLCBpZiBub25lIGFyZSBhdmFpbGFibGUsCi0gICAgICogYSBuZXcgb25lIGlzIGluc3RhbnRpYXRlZC4KLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMy4wCi0gICAgICovCi0KLSAgICBwcm90ZWN0ZWQgUGFnZVNwZWNpZmljYXRpb25SZXNvbHZlciBnZXRQYWdlU3BlY2lmaWNhdGlvblJlc29sdmVyKElSZXF1ZXN0Q3ljbGUgY3ljbGUpCi0gICAgewotICAgICAgICBQYWdlU3BlY2lmaWNhdGlvblJlc29sdmVyIHJlc3VsdCA9Ci0gICAgICAgICAgICAoUGFnZVNwZWNpZmljYXRpb25SZXNvbHZlcikgX3Bvb2wucmV0cmlldmUoUEFHRV9TUEVDSUZJQ0FUSU9OX1JFU09MVkVSX0tFWSk7Ci0KLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFBhZ2VTcGVjaWZpY2F0aW9uUmVzb2x2ZXIoY3ljbGUpOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW52b2tlZCBvbmNlIHRoZSB7QGxpbmsgUGFnZVNwZWNpZmljYXRpb25SZXNvbHZlcn0gaXMgbm8gbG9uZ2VyCi0gICAgICogbmVlZGVkLCBpdCBpcyByZXR1cm5lZCB0byB0aGUgcG9vbC4KLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMy4wCi0gICAgICovCi0KLSAgICBwcm90ZWN0ZWQgdm9pZCBkaXNjYXJkUGFnZVNwZWNpZmljYXRpb25SZXNvbHZlcihQYWdlU3BlY2lmaWNhdGlvblJlc29sdmVyIHJlc29sdmVyKQotICAgIHsKLSAgICAgICAgX3Bvb2wuc3RvcmUoUEFHRV9TUEVDSUZJQ0FUSU9OX1JFU09MVkVSX0tFWSwgcmVzb2x2ZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIHRoZSBwYWdlIHRvIHRoZSBhcHByb3ByaWF0ZSBwb29sLiAgSW52b2tlcwotICAgICAqICB7QGxpbmsgSVBhZ2UjZGV0YWNoKCl9LgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgcmVsZWFzZVBhZ2UoSVBhZ2UgcGFnZSkKLSAgICB7Ci0gICAgICAgIFRhcGVzdHJ5LmNsZWFyTWV0aG9kSW52b2NhdGlvbnMoKTsKLQotICAgICAgICBwYWdlLmRldGFjaCgpOwotCi0gICAgICAgIFRhcGVzdHJ5LmNoZWNrTWV0aG9kSW52b2NhdGlvbihUYXBlc3RyeS5BQlNUUkFDVFBBR0VfREVUQUNIX01FVEhPRF9JRCwgImRldGFjaCgpIiwgcGFnZSk7Ci0KLSAgICAgICAgX3Bvb2wuc3RvcmUoYnVpbGRLZXkocGFnZSksIHBhZ2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBJbnZva2VkIChkdXJpbmcgdGVzdGluZyBwcmltYXJpbHkpIHRvIHJlbGVhc2UgdGhlIGVudGlyZSBwb29sCi0gICAgICogIG9mIHBhZ2VzLCBhbmQgdGhlIGNhY2hlcyBvZiBiaW5kaW5ncyBhbmQgYXNzZXRzLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlc2V0KCkKLSAgICB7Ci0gICAgICAgIF9wb29sLmNsZWFyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gICAgewotICAgICAgICBUb1N0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBUb1N0cmluZ0J1aWxkZXIodGhpcyk7Ci0KLSAgICAgICAgYnVpbGRlci5hcHBlbmQoInBvb2wiLCBfcG9vbCk7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJyZXNvbHZlciIsIF9yZXNvbHZlcik7Ci0KLSAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICB9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvcGFnZWxvYWQvUHJvcGVydHlJbml0aWFsaXplci5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3BhZ2Vsb2FkL1Byb3BlcnR5SW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQzZDllYi4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvcGFnZWxvYWQvUHJvcGVydHlJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LnBhZ2Vsb2FkOwotCi1pbXBvcnQgb2dubC5PZ25sOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5BcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JQ29tcG9uZW50OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUxvY2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlc291cmNlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5UYXBlc3RyeTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmV2ZW50LlBhZ2VEZXRhY2hMaXN0ZW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmV2ZW50LlBhZ2VFdmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnV0aWwucHJvcC5PZ25sVXRpbHM7Ci0KLS8qKgotICogIEdpdmVuIGEgY29tcG9uZW50LCBhIHByb3BlcnR5IGFuZCBhIHZhbHVlLCB0aGlzIG9iamVjdCB3aWxsCi0gKiAgcmVzZXQgdGhlIHByb3BlcnR5IHRvIHRoZSB2YWx1ZSB3aGVuZXZlciB0aGUgcGFnZQotICogIChjb250YWluaW5nIHRoZSBjb21wb25lbnQpIGlzIGRldGFjaGVkLiAgVGhpcyBpcyByZWxhdGVkCi0gKiAgdG8gc3VwcG9ydCBmb3Ige0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkuc3BlYy5JUHJvcGVydHlTcGVjaWZpY2F0aW9ufXMuCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQHNpbmNlIDMuMAotICoqLwotCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlJbml0aWFsaXplciBpbXBsZW1lbnRzIFBhZ2VEZXRhY2hMaXN0ZW5lcgotewotICAgIHByaXZhdGUgSVJlc291cmNlUmVzb2x2ZXIgX3Jlc29sdmVyOwotICAgIHByaXZhdGUgSUNvbXBvbmVudCBfY29tcG9uZW50OwotICAgIHByaXZhdGUgU3RyaW5nIF9wcm9wZXJ0eU5hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgX2V4cHJlc3Npb247Ci0gICAgcHJpdmF0ZSBib29sZWFuIF9pbnZhcmlhbnQ7Ci0gICAgcHJpdmF0ZSBPYmplY3QgX3ZhbHVlOwotICAgIHByaXZhdGUgSUxvY2F0aW9uIF9sb2NhdGlvbjsKLQotICAgIHB1YmxpYyBQcm9wZXJ0eUluaXRpYWxpemVyKAotICAgICAgICBJUmVzb3VyY2VSZXNvbHZlciByZXNvbHZlciwKLSAgICAgICAgSUNvbXBvbmVudCBjb21wb25lbnQsCi0gICAgICAgIFN0cmluZyBwcm9wZXJ0eU5hbWUsCi0gICAgICAgIFN0cmluZyBleHByZXNzaW9uLAotICAgICAgICBJTG9jYXRpb24gbG9jYXRpb24pCi0gICAgewotICAgICAgICBfcmVzb2x2ZXIgPSByZXNvbHZlcjsKLSAgICAgICAgX2NvbXBvbmVudCA9IGNvbXBvbmVudDsKLSAgICAgICAgX3Byb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZTsKLSAgICAgICAgX2V4cHJlc3Npb24gPSBleHByZXNzaW9uOwotICAgICAgICBfbG9jYXRpb24gPSBsb2NhdGlvbjsKLQotICAgICAgICBwcmVwYXJlSW52YXJpYW50KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJlcGFyZUludmFyaWFudCgpCi0gICAgewotICAgICAgICBfaW52YXJpYW50ID0gZmFsc2U7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIElmIG5vIGluaXRpYWwgdmFsdWUgZXhwcmVzc2lvbiBpcyBwcm92aWRlZCwgdGhlbiByZWFkIHRoZSBjdXJyZW50Ci0gICAgICAgICAgICAvLyBwcm9wZXJ0eSBvZiB0aGUgZXhwcmVzc2lvbi4gIFRoaXMgbWF5IGJlIG51bGwsIG9yIG1heSBiZQotICAgICAgICAgICAgLy8gYSB2YWx1ZSBzZXQgaW4gZmluaXNoTG9hZCgpICh2aWEgYW4gYWJzdHJhY3QgYWNjZXNzb3IpLgotCi0gICAgICAgICAgICBpZiAoVGFwZXN0cnkuaXNCbGFuayhfZXhwcmVzc2lvbikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX2ludmFyaWFudCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgX3ZhbHVlID0gT2dubFV0aWxzLmdldChfcHJvcGVydHlOYW1lLCBfcmVzb2x2ZXIsIF9jb21wb25lbnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGlmIChPZ25sLmlzQ29uc3RhbnQoX2V4cHJlc3Npb24sIE9nbmwuY3JlYXRlRGVmYXVsdENvbnRleHQoX2NvbXBvbmVudCwgX3Jlc29sdmVyKSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgZXhwcmVzc2lvbiBpcyBhIGNvbnN0YW50LCBldmFsdWF0ZSBpdCBhbmQgcmVtZW1iZXIgdGhlIHZhbHVlIAotICAgICAgICAgICAgICAgICAgICBfaW52YXJpYW50ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgX3ZhbHVlID0gT2dubFV0aWxzLmdldChfZXhwcmVzc2lvbiwgX3Jlc29sdmVyLCBfY29tcG9uZW50KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICBUYXBlc3RyeS5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICJQYWdlTG9hZGVyLnVuYWJsZS10by1pbml0aWFsaXplLXByb3BlcnR5IiwKLSAgICAgICAgICAgICAgICAgICAgX3Byb3BlcnR5TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgX2NvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgZXguZ2V0TWVzc2FnZSgpKSwKLSAgICAgICAgICAgICAgICBfbG9jYXRpb24sCi0gICAgICAgICAgICAgICAgZXgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcGFnZURldGFjaGVkKFBhZ2VFdmVudCBldmVudCkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoX2ludmFyaWFudCkKLSAgICAgICAgICAgICAgICBPZ25sVXRpbHMuc2V0KF9wcm9wZXJ0eU5hbWUsIF9yZXNvbHZlciwgX2NvbXBvbmVudCwgX3ZhbHVlKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBPZ25sVXRpbHMuZ2V0KF9leHByZXNzaW9uLCBfcmVzb2x2ZXIsIF9jb21wb25lbnQpOwotICAgICAgICAgICAgICAgIE9nbmxVdGlscy5zZXQoX3Byb3BlcnR5TmFtZSwgX3Jlc29sdmVyLCBfY29tcG9uZW50LCB2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICBUYXBlc3RyeS5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICJQYWdlTG9hZGVyLnVuYWJsZS10by1pbml0aWFsaXplLXByb3BlcnR5IiwKLSAgICAgICAgICAgICAgICAgICAgX3Byb3BlcnR5TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgX2NvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgZXguZ2V0TWVzc2FnZSgpKSwKLSAgICAgICAgICAgICAgICBfbG9jYXRpb24sCi0gICAgICAgICAgICAgICAgZXgpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvcGFnZWxvYWQvVmVyaWZ5UmVxdWlyZWRQYXJhbWV0ZXJzVmlzaXRvci5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3BhZ2Vsb2FkL1ZlcmlmeVJlcXVpcmVkUGFyYW1ldGVyc1Zpc2l0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM2OGNhZC4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvcGFnZWxvYWQvVmVyaWZ5UmVxdWlyZWRQYXJhbWV0ZXJzVmlzaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkucGFnZWxvYWQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LkFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5UYXBlc3RyeTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnNwZWMuSUNvbXBvbmVudFNwZWNpZmljYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5zcGVjLklQYXJhbWV0ZXJTcGVjaWZpY2F0aW9uOwotCi0vKioKLSAqICBWZXJpZnkgd2hldGhlciBhbGwgcmVxdWlyZWQgcGFyYW1ldGVycyBpbiB0aGUgZXhhbWluZWQgY29tcG9uZW50IGFyZSBib3VuZCwKLSAqICBhbmQgaWYgdGhleSBhcmUgbm90LCB0aHJvdyBhbiBleGNlcHRpb24uCi0gKiAKLSAqICBAYXV0aG9yIG1pbmRicmlkZ2UKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQHNpbmNlIDMuMAotICovCi1wdWJsaWMgY2xhc3MgVmVyaWZ5UmVxdWlyZWRQYXJhbWV0ZXJzVmlzaXRvciBpbXBsZW1lbnRzIElDb21wb25lbnRWaXNpdG9yCi17Ci0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LnBhZ2Vsb2FkLklDb21wb25lbnRWaXNpdG9yI3Zpc2l0Q29tcG9uZW50KG9yZy5hcGFjaGUudGFwZXN0cnkuSUNvbXBvbmVudCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB2aXNpdENvbXBvbmVudChJQ29tcG9uZW50IGNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIElDb21wb25lbnRTcGVjaWZpY2F0aW9uIHNwZWMgPSBjb21wb25lbnQuZ2V0U3BlY2lmaWNhdGlvbigpOwotCi0gICAgICAgIEl0ZXJhdG9yIGkgPSBzcGVjLmdldFBhcmFtZXRlck5hbWVzKCkuaXRlcmF0b3IoKTsKLQotICAgICAgICB3aGlsZSAoaS5oYXNOZXh0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZykgaS5uZXh0KCk7Ci0gICAgICAgICAgICBJUGFyYW1ldGVyU3BlY2lmaWNhdGlvbiBwYXJhbWV0ZXJTcGVjID0gc3BlYy5nZXRQYXJhbWV0ZXIobmFtZSk7Ci0KLSAgICAgICAgICAgIGlmIChwYXJhbWV0ZXJTcGVjLmlzUmVxdWlyZWQoKSAmJiBjb21wb25lbnQuZ2V0QmluZGluZyhuYW1lKSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIFRhcGVzdHJ5LmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJQYWdlTG9hZGVyLnJlcXVpcmVkLXBhcmFtZXRlci1ub3QtYm91bmQiLAotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5nZXRFeHRlbmRlZElkKCkpLAotICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5nZXRMb2NhdGlvbigpLAotICAgICAgICAgICAgICAgICAgICBudWxsKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3BhZ2Vsb2FkL3BhY2thZ2UuaHRtbCBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9wYWdlbG9hZC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlNWE0ZGIuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3BhZ2Vsb2FkL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLTwhZG9jdHlwZSBodG1sIHB1YmxpYyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci08IS0tICRJZCQgLS0+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlRhcGVzdHJ5OiBXZWIgQXBwbGljYXRpb24gRnJhbWV3b3JrPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotCi08cD5DbGFzc2VzIHVzZWQgd2hlbiBsb2FkaW5nIHBhZ2VzIChhbmQgdGhpZXIgaGVpcmFyY2hpZXMgb2YgY29tcG9uZW50cykgZnJvbSB0aGllcgotc3BlY2lmaWNhdGlvbnMsIGFzIHdlbGwgYXMgb3JnYW5pemFpbmcgdGhpZXIgdGVtcGxhdGVzLgotCi1AYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwIDxhIGhyZWY9Im1haWx0bzpobHNoaXBAYXBhY2hlLm9yZyI+aGxzaGlwQGFwYWNoZS5vcmc8L2E+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9wYWdlcy9FeGNlcHRpb24uY3NzIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3BhZ2VzL0V4Y2VwdGlvbi5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiY2VjMTkuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3BhZ2VzL0V4Y2VwdGlvbi5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotUCAge30NCi0NCi1IMSAge30NCi0NCi1IMiAge30NCi0NCi1IMyAge30NCi0NCi1BICB7fQ0KLQ0KLUE6VmlzaXRlZCAge30NCi0NCi1BOkFjdGl2ZSAge30NCi0NCi1BOkhvdmVyICB7fQ0KLQ0KLUJPRFkgIHt9DQotDQotVEFCTEUuZXhjZXB0aW9uLWRpc3BsYXkgVFIuZXZlbiAgew0KLQl0b3AgOiBhdXRvOw0KLX0NCi0NCi1UQUJMRS5leGNlcHRpb24tZGlzcGxheSBUUi5vZGQgIHsNCi0JdG9wIDogYXV0bzsNCi0JYmFja2dyb3VuZC1jb2xvciA6ICNDMEMwRkY7DQotfQ0KLQ0KLVRBQkxFLmV4Y2VwdGlvbi1kaXNwbGF5IFRIICB7DQotCXRleHQtYWxpZ24gOiByaWdodDsNCi0JZm9udC13ZWlnaHQgOiBib2xkOw0KLX0NCi0NCi1UQUJMRS5leGNlcHRpb24tZGlzcGxheSBURCAgew0KLQl0ZXh0LWFsaWduIDogbGVmdDsNCi0Jd2lkdGggOiAxMDAlOwkNCi19DQotDQotVEFCTEUuZXhjZXB0aW9uLWRpc3BsYXkgVFIuc3RhY2stdHJhY2UgIHsNCi0JZm9udC1zaXplIDogc21hbGw7DQotCWZvbnQtZmFtaWx5IDogc2Fucy1zZXJpZjsNCi0JdGV4dC1hbGlnbiA6IGxlZnQ7DQotfQ0KLQ0KLVNQQU4uZXhjZXB0aW9uLWhlYWRlciAgew0KLQlmb250LXNpemUgOiBsYXJnZTsNCi0JZm9udC13ZWlnaHQgOiBib2xkOw0KLQljb2xvciA6IFJlZDsNCi19DQotDQotU1BBTi5leGNlcHRpb24tbWVzc2FnZSB7DQotCWZvbnQtd2VpZ2h0OiBib2xkOw0KLX0NCi0NCi1UQUJMRS5yZXF1ZXN0LWNvbnRleHQtYm9yZGVyICB7DQotCWJvcmRlci13aWR0aCA6IDE7DQotCWJvcmRlci1jb2xvciA6IEJsYWNrOw0KLX0NCi0NCi1TUEFOLnJlcXVlc3QtY29udGV4dC1vYmplY3QgIHsNCi0JZm9udC1zaXplIDogbGFyZ2U7DQotCWZvbnQtZmFtaWx5IDogc2Fucy1zZXJpZjsNCi0JZm9udC13ZWlnaHQgOiBib2xkOw0KLQl0ZXh0LWFsaWduIDogbGVmdDsNCi19DQotDQotVFIucmVxdWVzdC1jb250ZXh0LXNlY3Rpb24gVEggIHsNCi0JZm9udC1zaXplIDogbWVkaXVtOw0KLQlmb250LWZhbWlseSA6IHNhbnMtc2VyaWY7DQotCWZvbnQtd2VpZ2h0IDogYm9sZDsNCi0JdGV4dC1hbGlnbiA6IGNlbnRlcjsNCi0JY29sb3IgOiBXaGl0ZTsNCi0JYmFja2dyb3VuZC1jb2xvciA6IEJsdWU7DQotfQ0KLQ0KLVRSLnJlcXVlc3QtY29udGV4dC1oZWFkZXIgVEggIHsNCi0JZm9udC1zaXplIDogc21hbGw7DQotCWZvbnQtZmFtaWx5IDogc2Fucy1zZXJpZjsNCi0JZm9udC13ZWlnaHQgOiBib2xkOw0KLQl0ZXh0LWFsaWduIDogY2VudGVyOw0KLQljb2xvciA6IFdoaXRlOw0KLQliYWNrZ3JvdW5kLWNvbG9yIDogQmx1ZTsNCi19DQotDQotVEFCTEUucmVxdWVzdC1jb250ZXh0LW9iamVjdCBURA0KLXsNCi0Jd2lkdGg6IDEwMCU7DQotfQ0KLQ0KLVRBQkxFLnJlcXVlc3QtY29udGV4dC1vYmplY3QgVFIub2RkIFREICB7DQotCXRleHQtYWxpZ24gOiBsZWZ0Ow0KLQljb2xvciA6IEJsYWNrOw0KLQliYWNrZ3JvdW5kLWNvbG9yIDogI0MwQzBGRjsNCi0Jd2lkdGg6IDEwMCU7DQotfQ0KLQ0KLVRBQkxFLnJlcXVlc3QtY29udGV4dC1vYmplY3QgVFIub2RkIFRIICB7DQotCWNvbG9yIDogQmxhY2s7DQotCWJhY2tncm91bmQtY29sb3IgOiAjQzBDMEZGOw0KLQl0ZXh0LWFsaWduIDogcmlnaHQ7DQotfQ0KLQ0KLVRBQkxFLnJlcXVlc3QtY29udGV4dC1vYmplY3QgVFIuZXZlbiBURCAgew0KLQl0ZXh0LWFsaWduIDogbGVmdDsNCi19DQotDQotVEFCTEUucmVxdWVzdC1jb250ZXh0LW9iamVjdCBUUi5ldmVuIFRIICB7DQotCXRleHQtYWxpZ24gOiByaWdodDsNCi19DQotDQotVEFCTEUucmVxdWVzdC1jb250ZXh0LW9iamVjdCAgew0KLQl3aWR0aCA6IDEwMCU7DQotfQ0KLQ0KLVRBQkxFLnJlcXVlc3QtY29udGV4dC1vYmplY3QgVFIgIHsNCi0JdmVydGljYWwtYWxpZ24gOiB0ZXh0LXRvcDsNCi19DQotDQotVUwgIHsNCi0JbWFyZ2luLXRvcCA6IDBweDsNCi0JbWFyZ2luLWJvdHRvbSA6IDBweDsNCi0JbWFyZ2luLWxlZnQgOiAyMHB4Ow0KLX0NCi0NCi1UQUJMRS5leGNlcHRpb24tZGlzcGxheSBUUi5leGNlcHRpb24tbmFtZSBURCAgew0KLQlmb250LXNpemUgOiBsYXJnZXI7DQotCWZvbnQtd2VpZ2h0IDogYm9sZDsNCi0JdGV4dC1hbGlnbiA6IGNlbnRlcjsNCi0JYmFja2dyb3VuZC1jb2xvciA6IEJsdWU7DQotCWNvbG9yIDogV2hpdGU7DQotfQ0KLQ0KLVRBQkxFLmV4Y2VwdGlvbi1kaXNwbGF5ICB7DQotCXdpZHRoIDogMTAwJTsNCi19DQotDQotVEFCTEUuZXhjZXB0aW9uLWRpc3BsYXkgVFIuZXhjZXB0aW9uLW1lc3NhZ2UgVEQgIHsNCi0JYm9yZGVyLXdpZHRoIDogMTsNCi0JYm9yZGVyLWNvbG9yIDogQmxhY2s7DQotCWJvcmRlci1zdHlsZSA6IHNvbGlkOw0KLQlwYWRkaW5nIDogMjsNCi0JdGV4dC1hbGlnbiA6IGxlZnQ7DQotCWZvbnQtc3R5bGUgOiBpdGFsaWM7DQotfQ0KLQ0KLVRBQkxFLmV4Y2VwdGlvbi1kaXNwbGF5IFRSLnN0cmFjay10cmFjZS1sYWJlbCBURCAgew0KLQltYXJnaW4gOiAyOw0KLQlib3JkZXItd2lkdGggOiAxOw0KLQlib3JkZXItY29sb3IgOiBCbGFjazsNCi0JYm9yZGVyLXN0eWxlIDogc29saWQ7DQotCXRleHQtYWxpZ24gOiBjZW50ZXI7DQotfQ0KLQ0KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9wYWdlcy9FeGNlcHRpb24uaHRtbCBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9wYWdlcy9FeGNlcHRpb24uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU0MWVmYy4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvcGFnZXMvRXhjZXB0aW9uLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08IS0tICRJZCQgLS0+Ci0KLTxzcGFuIGp3Y2lkPSJAU2hlbGwiIHRpdGxlPSJFeGNlcHRpb24iIHN0eWxlc2hlZXQ9Im9nbmw6YXNzZXRzLnN0eWxlc2hlZXQiPgotPGJvZHk+Ci0KLTxzcGFuIGNsYXNzPSJleGNlcHRpb24taGVhZGVyIj4KLUFuIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCi08L3NwYW4+Ci0KLTxwPllvdSBtYXkgY29udGludWUgYnkgPGI+PGEgandjaWQ9InJlc3RhcnQiPnJlc3RhcnRpbmc8L2E+PC9iPiB0aGUgc2Vzc2lvbi4KLQotPHNwYW4gandjaWQ9IkBFeGNlcHRpb25EaXNwbGF5IiBleGNlcHRpb25zPSJvZ25sOmV4Y2VwdGlvbnMiLz4KLQotPHA+Ci0KLTxzcGFuIGp3Y2lkPSJARGVsZWdhdG9yIiBkZWxlZ2F0ZT0ib2dubDpyZXF1ZXN0Q3ljbGUucmVxdWVzdENvbnRleHQiLz4KLQotPC9ib2R5PgotPC9zcGFuPgpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3BhZ2VzL0V4Y2VwdGlvbi5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3BhZ2VzL0V4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzM5MGM3Li4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9wYWdlcy9FeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LnBhZ2VzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5odG1sLkJhc2VQYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkudXRpbC5leGNlcHRpb24uRXhjZXB0aW9uQW5hbHl6ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS51dGlsLmV4Y2VwdGlvbi5FeGNlcHRpb25EZXNjcmlwdGlvbjsKLQotLyoqCi0gKiAgRGVmYXVsdCBleGNlcHRpb24gcmVwb3J0aW5nIHBhZ2UuCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAKLSAqKi8KLQotcHVibGljIGNsYXNzIEV4Y2VwdGlvbiBleHRlbmRzIEJhc2VQYWdlCi17Ci0gICAgcHJpdmF0ZSBFeGNlcHRpb25EZXNjcmlwdGlvbltdIF9leGNlcHRpb25zOwotCi0gICAgcHVibGljIHZvaWQgZGV0YWNoKCkKLSAgICB7Ci0gICAgICAgIF9leGNlcHRpb25zID0gbnVsbDsKLQotICAgICAgICBzdXBlci5kZXRhY2goKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRXhjZXB0aW9uRGVzY3JpcHRpb25bXSBnZXRFeGNlcHRpb25zKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfZXhjZXB0aW9uczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRFeGNlcHRpb24oVGhyb3dhYmxlIHZhbHVlKQotICAgIHsKLSAgICAgICAgRXhjZXB0aW9uQW5hbHl6ZXIgYW5hbHl6ZXI7Ci0KLSAgICAgICAgYW5hbHl6ZXIgPSBuZXcgRXhjZXB0aW9uQW5hbHl6ZXIoKTsKLQotICAgICAgICBfZXhjZXB0aW9ucyA9IGFuYWx5emVyLmFuYWx5emUodmFsdWUpOwotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9wYWdlcy9FeGNlcHRpb24ucGFnZSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9wYWdlcy9FeGNlcHRpb24ucGFnZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRlOGY1Yi4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvcGFnZXMvRXhjZXB0aW9uLnBhZ2UKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gIAotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTwhLS0gJElkJCAtLT4KLTwhRE9DVFlQRSBwYWdlLXNwZWNpZmljYXRpb24gUFVCTElDIAotICAiLS8vQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24vL1RhcGVzdHJ5IFNwZWNpZmljYXRpb24gMy4wLy9FTiIgCi0gICJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL3RhcGVzdHJ5L2R0ZC9UYXBlc3RyeV8zXzAuZHRkIj4KLQkKLTxwYWdlLXNwZWNpZmljYXRpb24gY2xhc3M9Im9yZy5hcGFjaGUudGFwZXN0cnkucGFnZXMuRXhjZXB0aW9uIj4KLSAgCi0gIDxjb21wb25lbnQgaWQ9InJlc3RhcnQiIHR5cGU9IlNlcnZpY2VMaW5rIj4KLSAgICA8YmluZGluZyBuYW1lPSJzZXJ2aWNlIiBleHByZXNzaW9uPSJAb3JnLmFwYWNoZS50YXBlc3RyeS5UYXBlc3RyeUBSRVNUQVJUX1NFUlZJQ0UiLz4KLSAgPC9jb21wb25lbnQ+Ci0gIAotICA8cHJpdmF0ZS1hc3NldCBuYW1lPSJzdHlsZXNoZWV0IiByZXNvdXJjZS1wYXRoPSJFeGNlcHRpb24uY3NzIi8+Ci08L3BhZ2Utc3BlY2lmaWNhdGlvbj4KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9wYWdlcy9TdGFsZUxpbmsuaHRtbCBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9wYWdlcy9TdGFsZUxpbmsuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFjZWQ2MS4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvcGFnZXMvU3RhbGVMaW5rLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08IS0tICRJZCQgLS0+Ci0KLTxzcGFuIGp3Y2lkPSJAU2hlbGwiIHN0eWxlc2hlZXQ9Im9nbmw6YXNzZXRzLnN0eWxlc2hlZXQiIHRpdGxlPSJTdGFsZSBMaW5rIj4KLQotPGJvZHk+Ci0KLVlvdSBoYXZlIGNsaWNrZWQgb24gYSA8aT5zdGFsZSBsaW5rPC9pPi4gIAotCi08cD4KLTxzcGFuIGp3Y2lkPSJASW5zZXJ0IiB2YWx1ZT0ib2dubDptZXNzYWdlIiBjbGFzcz0iZXhjZXB0aW9uLW1lc3NhZ2UiPgotRXhjZXB0aW9uIG1lc3NhZ2UgZ29lcyBoZXJlLgotPC9zcGFuPgotCi08cD5UaGlzIGlzIG1vc3QgbGlrZWx5IHRoZSByZXN1bHQgb2YgdXNpbmcgeW91cgotYnJvd3NlcidzIDxiPmJhY2s8L2I+IGJ1dHRvbiwgYnV0IGNhbiBhbHNvIGJlIGFuIGFwcGxpY2F0aW9uIGVycm9yLgotCi08cD5Zb3UgbWF5IGNvbnRpbnVlIGJ5IHJldHVybmluZyB0byB0aGUKLWFwcGxpY2F0aW9uJ3MKLQotPGI+Ci08YSBqd2NpZD0iaG9tZSI+aG9tZSBwYWdlPC9hPjwvYj4uCi0KLTwvYm9keT4KLQotPC9zcGFuPgpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3BhZ2VzL1N0YWxlTGluay5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3BhZ2VzL1N0YWxlTGluay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzU3NDU1Li4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9wYWdlcy9TdGFsZUxpbmsuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LnBhZ2VzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5odG1sLkJhc2VQYWdlOwotCi0vKioKLSAqICBTdG9yZXMgYSBtZXNzYWdlICh0YWtlbiBmcm9tIHRoZSB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5TdGFsZUxpbmtFeGNlcHRpb259KQotICogIHRoYXQgaXMgZGlzcGxheWVkIGFzIHBhcnQgb2YgdGhlIHBhZ2UuCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQHNpbmNlIDMuMAotICoKLSAqKi8KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFN0YWxlTGluayBleHRlbmRzIEJhc2VQYWdlCi17Ci0gICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0TWVzc2FnZShTdHJpbmcgbWVzc2FnZSk7Ci19CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvcGFnZXMvU3RhbGVMaW5rLnBhZ2UgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvcGFnZXMvU3RhbGVMaW5rLnBhZ2UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1NWE5OWQuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3BhZ2VzL1N0YWxlTGluay5wYWdlCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICAKLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08IS0tICRJZCQgLS0+Ci08IURPQ1RZUEUgcGFnZS1zcGVjaWZpY2F0aW9uIFBVQkxJQyAKLSAgIi0vL0FwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLy9UYXBlc3RyeSBTcGVjaWZpY2F0aW9uIDMuMC8vRU4iIAotICAiaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy90YXBlc3RyeS9kdGQvVGFwZXN0cnlfM18wLmR0ZCI+Ci0gIAotPHBhZ2Utc3BlY2lmaWNhdGlvbiBjbGFzcz0ib3JnLmFwYWNoZS50YXBlc3RyeS5wYWdlcy5TdGFsZUxpbmsiPgotICAKLSAgPHByb3BlcnR5LXNwZWNpZmljYXRpb24gbmFtZT0ibWVzc2FnZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgotICAKLSAgPGNvbXBvbmVudCBpZD0iaG9tZSIgdHlwZT0iU2VydmljZUxpbmsiPgotICAgIDxiaW5kaW5nIG5hbWU9InNlcnZpY2UiIGV4cHJlc3Npb249IkBvcmcuYXBhY2hlLnRhcGVzdHJ5LlRhcGVzdHJ5QEhPTUVfU0VSVklDRSIvPgotICA8L2NvbXBvbmVudD4KLSAgCi0gIDxwcml2YXRlLWFzc2V0IG5hbWU9InN0eWxlc2hlZXQiIHJlc291cmNlLXBhdGg9IkV4Y2VwdGlvbi5jc3MiLz4KLQotPC9wYWdlLXNwZWNpZmljYXRpb24+CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvcGFnZXMvU3RhbGVTZXNzaW9uLmh0bWwgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvcGFnZXMvU3RhbGVTZXNzaW9uLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmYzA5YWMuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3BhZ2VzL1N0YWxlU2Vzc2lvbi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPCEtLSAkSWQkIC0tPgotCi08c3BhbiBqd2NpZD0iQFNoZWxsIiB0aXRsZT0iU3RhbGUgU2Vzc2lvbiIgc3R5bGVzaGVldD0ib2dubDphc3NldHMuc3R5bGVzaGVldCI+Ci0KLTxib2R5PgotWW91ciBzZXNzaW9uIGhhcyB0aW1lZCBvdXQuCi0KLTxwPldlYiBhcHBsaWNhdGlvbnMgc3RvcmUgaW5mb3JtYXRpb24gYWJvdXQgd2hhdCB5b3UgYXJlIGRvaW5nIG9uIHRoZSBzZXJ2ZXIuICBUaGlzIGluZm9ybWF0aW9uCi1pcyBjYWxsZWQgdGhlIDxlbT5zZXNzaW9uPC9lbT4uCi0KLTxwPldlYiBzZXJ2ZXJzIG11c3QgdHJhY2sgbWFueSwgbWFueSBzZXNzaW9ucy4gIElmIHlvdQotYXJlIGluYWN0aXZlIGZvciBhIGxvbmcgZW5vdWdoIHRpbWUgKHVzdWFsbHksIGEgZmV3IG1pbnV0ZXMpLCB0aGlzIGluZm9ybWF0aW9uIGlzIGRpc2NhcmRlZCB0bwotbWFrZSByb29tIGZvciBhY3RpdmUgdXNlcnMuCi0KLTxwPkF0IHRoaXMgcG9pbnQgeW91IG1heSA8Yj4KLTxhIGp3Y2lkPSJyZXN0YXJ0Ij5yZXN0YXJ0PC9hPjwvYj4gdGhlIHNlc3Npb24gdG8gY29udGludWUuCi0KLTwvYm9keT4KLTwvc3Bhbj4KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9wYWdlcy9TdGFsZVNlc3Npb24ucGFnZSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9wYWdlcy9TdGFsZVNlc3Npb24ucGFnZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTExYjZmMi4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvcGFnZXMvU3RhbGVTZXNzaW9uLnBhZ2UKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICAKLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08IS0tICRJZCQgLS0+Ci08IURPQ1RZUEUgcGFnZS1zcGVjaWZpY2F0aW9uIFBVQkxJQyAKLSAgIi0vL0FwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLy9UYXBlc3RyeSBTcGVjaWZpY2F0aW9uIDMuMC8vRU4iIAotICAiaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy90YXBlc3RyeS9kdGQvVGFwZXN0cnlfM18wLmR0ZCI+Ci0JCi08cGFnZS1zcGVjaWZpY2F0aW9uPgotICAKLSAgPGNvbXBvbmVudCBpZD0icmVzdGFydCIgdHlwZT0iU2VydmljZUxpbmsiPgotICAgIDxiaW5kaW5nIG5hbWU9InNlcnZpY2UiIGV4cHJlc3Npb249IkBvcmcuYXBhY2hlLnRhcGVzdHJ5LlRhcGVzdHJ5QFJFU1RBUlRfU0VSVklDRSIvPgotICA8L2NvbXBvbmVudD4KLSAgCi0gIDxwcml2YXRlLWFzc2V0IG5hbWU9InN0eWxlc2hlZXQiIHJlc291cmNlLXBhdGg9IkV4Y2VwdGlvbi5jc3MiLz4KLTwvcGFnZS1zcGVjaWZpY2F0aW9uPgpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3BhZ2VzL3BhY2thZ2UuaHRtbCBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9wYWdlcy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlYWRlNGQuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3BhZ2VzL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLTwhZG9jdHlwZSBodG1sIHB1YmxpYyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci08IS0tICRJZCQgLS0+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlRhcGVzdHJ5OiBXZWIgQXBwbGljYXRpb24gRnJhbWV3b3JrPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotCi1CYXNpYyBwYWdlcyB1c2VkIGZvciBlcnJvcnMsIHN0YWxlIGxpbmtzIGFuZCBzdGFsZSBzZXNzaW9ucy4gIFRoZXNlIGNhbiBhbGwgYmUKLW92ZXJyaWRlbiBpbiB0aGUgYXBwbGljYXRpb24gc3BlY2lmaWNhdGlvbi4KLQotQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcCA8YSBocmVmPSJtYWlsdG86aGxzaGlwQGFwYWNoZS5vcmciPmhsc2hpcEBhcGFjaGUub3JnPC9hPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvcGFyYW0vQWJzdHJhY3RQYXJhbWV0ZXJDb25uZWN0b3IuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9wYXJhbS9BYnN0cmFjdFBhcmFtZXRlckNvbm5lY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWExOTE4Li4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9wYXJhbS9BYnN0cmFjdFBhcmFtZXRlckNvbm5lY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg5ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LnBhcmFtOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JQmluZGluZzsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JRm9ybTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZXF1ZXN0Q3ljbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVzb3VyY2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmZvcm0uRm9ybTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmZvcm0uSUZvcm1Db21wb25lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5zcGVjLkRpcmVjdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnNwZWMuSVBhcmFtZXRlclNwZWNpZmljYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS51dGlsLnByb3AuT2dubFV0aWxzOwotCi0vKioKLSAqICBTdGFuZGFyZCBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgSVBhcmFtZXRlckNvbm5lY3Rvcn0uCi0gKiAgU3ViY2xhc3NlcyBhZGQgaW4gdGhlIGFiaWxpdHkgdG8gY2xlYXIgcGFyYW1ldGVycy4KLSAqCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogIEB2ZXJzaW9uICRJZCQKLSAqICBAc2luY2UgMi4wLjMKLSAqIAotICoqLwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RQYXJhbWV0ZXJDb25uZWN0b3IgaW1wbGVtZW50cyBJUGFyYW1ldGVyQ29ubmVjdG9yCi17Ci0gICAgcHJpdmF0ZSBTdHJpbmcgX3BhcmFtZXRlck5hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgX3Byb3BlcnR5TmFtZTsKLSAgICBwcml2YXRlIElCaW5kaW5nIF9iaW5kaW5nOwotICAgIHByaXZhdGUgSUNvbXBvbmVudCBfY29tcG9uZW50OwotICAgIHByaXZhdGUgYm9vbGVhbiBfcmVxdWlyZWQ7Ci0gICAgcHJpdmF0ZSBPYmplY3QgX2NsZWFyVmFsdWU7Ci0gICAgcHJpdmF0ZSBEaXJlY3Rpb24gX2RpcmVjdGlvbjsKLSAgICBwcml2YXRlIElSZXNvdXJjZVJlc29sdmVyIF9yZXNvbHZlcjsKLQotICAgIC8qKgotICAgICAqICBDcmVhdGVzIGEgY29ubmVjdG9yLiAgSW4gYWRkaXRpb24sIG9idGFpbnMgdGhlIGN1cnJlbnQgdmFsdWUKLSAgICAgKiAgb2YgdGhlIGNvbXBvbmVudCBwcm9wZXJ0eTsgdGhpcyB2YWx1ZSB3aWxsIGJlIHVzZWQgdG8KLSAgICAgKiAgcmVzdG9yZSB0aGUgY29tcG9uZW50IHByb3BlcnR5LgotICAgICAqIAotICAgICAqKi8KLQotICAgIHByb3RlY3RlZCBBYnN0cmFjdFBhcmFtZXRlckNvbm5lY3RvcihJQ29tcG9uZW50IGNvbXBvbmVudCwgU3RyaW5nIHBhcmFtZXRlck5hbWUsIElCaW5kaW5nIGJpbmRpbmcpCi0gICAgewotICAgICAgICBfY29tcG9uZW50ID0gY29tcG9uZW50OwotICAgICAgICBfcGFyYW1ldGVyTmFtZSA9IHBhcmFtZXRlck5hbWU7Ci0gICAgICAgIF9iaW5kaW5nID0gYmluZGluZzsKLQotICAgICAgICBfcmVzb2x2ZXIgPSBjb21wb25lbnQuZ2V0UGFnZSgpLmdldEVuZ2luZSgpLmdldFJlc291cmNlUmVzb2x2ZXIoKTsKLQotICAgICAgICBJUGFyYW1ldGVyU3BlY2lmaWNhdGlvbiBwc3BlYyA9IF9jb21wb25lbnQuZ2V0U3BlY2lmaWNhdGlvbigpLmdldFBhcmFtZXRlcihfcGFyYW1ldGVyTmFtZSk7Ci0gICAgICAgIF9yZXF1aXJlZCA9IHBzcGVjLmlzUmVxdWlyZWQoKTsKLSAgICAgICAgX3Byb3BlcnR5TmFtZSA9IHBzcGVjLmdldFByb3BlcnR5TmFtZSgpOwotICAgICAgICBfZGlyZWN0aW9uID0gcHNwZWMuZ2V0RGlyZWN0aW9uKCk7Ci0KLSAgICAgICAgX2NsZWFyVmFsdWUgPSByZWFkQ3VycmVudFByb3BlcnR5VmFsdWUoKTsKLSAgICB9Ci0KLSAgICAvKiogQHNpbmNlIDIuMiAqKi8KLQotICAgIHByaXZhdGUgT2JqZWN0IHJlYWRDdXJyZW50UHJvcGVydHlWYWx1ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gT2dubFV0aWxzLmdldChfcHJvcGVydHlOYW1lLCBfcmVzb2x2ZXIsIF9jb21wb25lbnQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBTZXRzIHRoZSBwcm9wZXJ0eSBvZiB0aGUgY29tcG9uZW50IHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0UHJvcGVydHlWYWx1ZShPYmplY3QgdmFsdWUpCi0gICAgewotICAgICAgICBPZ25sVXRpbHMuc2V0KF9wcm9wZXJ0eU5hbWUsIF9yZXNvbHZlciwgX2NvbXBvbmVudCwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgYmluZGluZy4KLSAgICAgKiAgQHBhcmFtIHJlcXVpcmVkVHlwZSBpZiBub3QgbnVsbCwgdGhlIGV4cGVjdGVkIHR5cGUgb2YgdGhlIHZhbHVlIG9iamVjdC4KLSAgICAgKiAKLSAgICAgKiAKLSAgICAgKiAgQHNlZSBJQmluZGluZyNnZXRPYmplY3QoKQotICAgICAqICBAc2VlIElCaW5kaW5nI2dldE9iamVjdChTdHJpbmcsIENsYXNzKQotICAgICAqKi8KLQotICAgIHByb3RlY3RlZCBPYmplY3QgZ2V0QmluZGluZ1ZhbHVlKENsYXNzIHJlcXVpcmVkVHlwZSkKLSAgICB7Ci0gICAgICAgIE9iamVjdCByZXN1bHQ7Ci0KLSAgICAgICAgaWYgKHJlcXVpcmVkVHlwZSA9PSBudWxsKQotICAgICAgICAgICAgcmVzdWx0ID0gX2JpbmRpbmcuZ2V0T2JqZWN0KCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJlc3VsdCA9IF9iaW5kaW5nLmdldE9iamVjdChfcGFyYW1ldGVyTmFtZSwgcmVxdWlyZWRUeXBlKTsKLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHByb3RlY3RlZCBJQmluZGluZyBnZXRCaW5kaW5nKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfYmluZGluZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgICB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotICAgICAgICBidWZmZXIuYXBwZW5kKCdbJyk7Ci0gICAgICAgIGJ1ZmZlci5hcHBlbmQoX2NvbXBvbmVudC5nZXRFeHRlbmRlZElkKCkpOwotICAgICAgICBidWZmZXIuYXBwZW5kKCcgJyk7Ci0gICAgICAgIGJ1ZmZlci5hcHBlbmQoX3BhcmFtZXRlck5hbWUpOwotICAgICAgICBidWZmZXIuYXBwZW5kKCcgJyk7Ci0gICAgICAgIGJ1ZmZlci5hcHBlbmQoX2JpbmRpbmcpOwotCi0gICAgICAgIGJ1ZmZlci5hcHBlbmQoJyAnKTsKLSAgICAgICAgYnVmZmVyLmFwcGVuZChfZGlyZWN0aW9uLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgaWYgKF9yZXF1aXJlZCkKLSAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIiByZXF1aXJlZCIpOwotCi0gICAgICAgIGJ1ZmZlci5hcHBlbmQoJ10nKTsKLQotICAgICAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFJlc3RvcmVzIHRoZSBwcm9wZXJ0eSB0byBpdHMgZGVmYXVsdCB2YWx1ZS4gIEZvcgotICAgICAqICB7QGxpbmsgRGlyZWN0aW9uI0ZPUk19IHBhcmFtZXRlcnMsIGV4dHJhY3RzIHRoZQotICAgICAqICBwcm9wZXJ0eSB2YWx1ZSBhbmQgc2V0cyB0aGUgYmluZGluZyBmb3JtIGl0Ci0gICAgICogICh3aGVuIGFwcHJvcHJpYXRlKS4KLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCByZXNldFBhcmFtZXRlcihJUmVxdWVzdEN5Y2xlIGN5Y2xlKQotICAgIHsKLSAgICAgICAgaWYgKF9kaXJlY3Rpb24gPT0gRGlyZWN0aW9uLkZPUk0gJiYgY3ljbGUuaXNSZXdpbmRpbmcoKSkKLSAgICAgICAgewotICAgICAgICAgICAgSUZvcm1Db21wb25lbnQgY29tcG9uZW50ID0gKElGb3JtQ29tcG9uZW50KSBfY29tcG9uZW50OwotCi0gICAgICAgICAgICBpZiAoIWNvbXBvbmVudC5pc0Rpc2FibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgSUZvcm0gZm9ybSA9IEZvcm0uZ2V0KGN5Y2xlKTsKLQotICAgICAgICAgICAgICAgIGlmIChmb3JtICE9IG51bGwgJiYgZm9ybS5pc1Jld2luZGluZygpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gcmVhZEN1cnJlbnRQcm9wZXJ0eVZhbHVlKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgX2JpbmRpbmcuc2V0T2JqZWN0KHZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBFaXRoZXIgd2F5LCBjbGVhciB0aGUgdmFsdWUuCi0KLSAgICAgICAgc2V0UHJvcGVydHlWYWx1ZShfY2xlYXJWYWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgdHJ1ZSBpZiB0aGUgY29ubmVjdG9yIHNob3VsZCB1cGRhdGUgdGhlIHByb3BlcnR5IHZhbHVlIGZyb20KLSAgICAgKiAgdGhlIGJpbmRpbmcuICBGb3Ige0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkuc3BlYy5EaXJlY3Rpb24jSU59LCB0aGlzCi0gICAgICogIGFsd2F5cyByZXR1cm5zIHRydWUuICBGb3Ige0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkuc3BlYy5EaXJlY3Rpb24jRk9STX0sCi0gICAgICogIHRoaXMgcmV0dXJucyB0cnVlIG9ubHkgaWYgdGhlIHJlcXVlc3QgY3ljbGUgYW5kIHRoZSBhY3RpdmUgZm9ybQotICAgICAqICBhcmUgcmV3aW5kaW5nLgotICAgICAqIAotICAgICAqICBAc2luY2UgMi4yCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkU2V0UHJvcGVydHlWYWx1ZShJUmVxdWVzdEN5Y2xlIGN5Y2xlKQotICAgIHsKLSAgICAgICAgaWYgKF9kaXJlY3Rpb24gPT0gRGlyZWN0aW9uLklOKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAgICAgLy8gTXVzdCBiZSBGT1JNCi0KLSAgICAgICAgcmV0dXJuICFjeWNsZS5pc1Jld2luZGluZygpOwotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9wYXJhbS9Cb29sZWFuUGFyYW1ldGVyQ29ubmVjdG9yLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvcGFyYW0vQm9vbGVhblBhcmFtZXRlckNvbm5lY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDMyZTVhLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9wYXJhbS9Cb29sZWFuUGFyYW1ldGVyQ29ubmVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5wYXJhbTsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUJpbmRpbmc7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JQ29tcG9uZW50OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlcXVlc3RDeWNsZTsKLQotLyoqCi0gKiAgIENvbm5lY3RvciBmb3IgYm9vbGVhbiBwYXJhbWV0ZXJzLgotICogCi0gKiAgIEBzZWUgSUJpbmRpbmcjZ2V0Qm9vbGVhbigpCi0gKiAKLSAqICAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogICBAdmVyc2lvbiAkSWQkCi0gKiAgIEBzaW5jZSAyLjAuMwotICogCi0gKiovCi0KLXB1YmxpYyBjbGFzcyBCb29sZWFuUGFyYW1ldGVyQ29ubmVjdG9yIGV4dGVuZHMgQWJzdHJhY3RQYXJhbWV0ZXJDb25uZWN0b3IKLXsKLQotICAgIHByb3RlY3RlZCBCb29sZWFuUGFyYW1ldGVyQ29ubmVjdG9yKElDb21wb25lbnQgY29tcG9uZW50LCBTdHJpbmcgcGFyYW1ldGVyTmFtZSwgSUJpbmRpbmcgYmluZGluZykKLSAgICB7Ci0gICAgICAgIHN1cGVyKGNvbXBvbmVudCwgcGFyYW1ldGVyTmFtZSwgYmluZGluZyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEludm9rZXMge0BsaW5rIElCaW5kaW5nI2dldEJvb2xlYW4oKX0sIHdoaWNoIGFsd2F5cwotICAgICAqICByZXR1cm5zIHRydWUgb3IgZmFsc2UgKHRoZXJlIGlzIG5vIGNvbmNlcHQgb2YgYSBudWxsCi0gICAgICogIHZhbHVlKS4KLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJhbWV0ZXIoSVJlcXVlc3RDeWNsZSBjeWNsZSkKLSAgICB7Ci0gICAgICAgIGlmIChzaG91bGRTZXRQcm9wZXJ0eVZhbHVlKGN5Y2xlKSkKLSAgICAgICAgewotICAgICAgICAgICAgYm9vbGVhbiB2YWx1ZSA9IGdldEJpbmRpbmcoKS5nZXRCb29sZWFuKCk7Ci0KLSAgICAgICAgICAgIHNldFByb3BlcnR5VmFsdWUodmFsdWUgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3BhcmFtL0Nvbm5lY3RlZFBhcmFtZXRlckV4Y2VwdGlvbi5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3BhcmFtL0Nvbm5lY3RlZFBhcmFtZXRlckV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjgxODlkLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9wYXJhbS9Db25uZWN0ZWRQYXJhbWV0ZXJFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LnBhcmFtOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5BcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JTG9jYXRpb247Ci0KLS8qKgotICogIElkZW50aWZpZXMgZXhjZXB0aW9ucyBpbiBjb25uZWN0ZWQgcGFyYW1ldGVycyAocGFyYW1ldGVycyB0aGF0Ci0gKiAgYXJlIGF1dG9tYXRpY2FsbHkgYXNzaWduZWQgdG8gY29tcG9uZW50IHByb3BlcnRpZXMgYnkgdGhlIGZyYW1ld29yaykuCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQHNpbmNlIDIuMC4zCi0gKgotICoqLwotCi1wdWJsaWMgY2xhc3MgQ29ubmVjdGVkUGFyYW1ldGVyRXhjZXB0aW9uIGV4dGVuZHMgQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uCi17Ci0gICAgcHJpdmF0ZSBTdHJpbmcgX3BhcmFtZXRlck5hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgX3Byb3BlcnR5TmFtZTsKLQotICAgIHB1YmxpYyBDb25uZWN0ZWRQYXJhbWV0ZXJFeGNlcHRpb24oCi0gICAgICAgIFN0cmluZyBtZXNzYWdlLAotICAgICAgICBPYmplY3QgY29tcG9uZW50LAotICAgICAgICBTdHJpbmcgcGFyYW1ldGVyTmFtZSwKLSAgICAgICAgU3RyaW5nIHByb3BlcnR5TmFtZSwKLSAgICAgICAgVGhyb3dhYmxlIHJvb3RDYXVzZSkKLSAgICB7Ci0gICAgICAgIHRoaXMobWVzc2FnZSwgY29tcG9uZW50LCBwYXJhbWV0ZXJOYW1lLCBwcm9wZXJ0eU5hbWUsIG51bGwsIHJvb3RDYXVzZSk7Ci0gICAgfQotCi0gICAgLyoqIEBzaW5jZSAzLjAgKiovCi0KLSAgICBwdWJsaWMgQ29ubmVjdGVkUGFyYW1ldGVyRXhjZXB0aW9uKAotICAgICAgICBTdHJpbmcgbWVzc2FnZSwKLSAgICAgICAgT2JqZWN0IGNvbXBvbmVudCwKLSAgICAgICAgU3RyaW5nIHBhcmFtZXRlck5hbWUsCi0gICAgICAgIFN0cmluZyBwcm9wZXJ0eU5hbWUsCi0gICAgICAgIElMb2NhdGlvbiBsb2NhdGlvbiwKLSAgICAgICAgVGhyb3dhYmxlIHJvb3RDYXVzZSkKLSAgICB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UsIGxvY2F0aW9uLCByb290Q2F1c2UpOwotCi0gICAgICAgIF9wYXJhbWV0ZXJOYW1lID0gcGFyYW1ldGVyTmFtZTsKLSAgICAgICAgX3Byb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhcmFtZXRlck5hbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9wYXJhbWV0ZXJOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHlOYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfcHJvcGVydHlOYW1lOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvcGFyYW0vRG91YmxlUGFyYW1ldGVyQ29ubmVjdG9yLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvcGFyYW0vRG91YmxlUGFyYW1ldGVyQ29ubmVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjNzZlMzAuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3BhcmFtL0RvdWJsZVBhcmFtZXRlckNvbm5lY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkucGFyYW07Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklCaW5kaW5nOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUNvbXBvbmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZXF1ZXN0Q3ljbGU7Ci0KLS8qKgotICogIENvbm5lY3RzIGEgcGFyYW1ldGVyIHRvIGEgcHJvcGVydHkgb2YgdHlwZSBkb3VibGUuCi0gKiAKLSAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwIAotICogIEB2ZXJzaW9uICRJZCQKLSAqICBAc2luY2UgMi4wLjMKLSAqIAotICoqLwotCi1wdWJsaWMgY2xhc3MgRG91YmxlUGFyYW1ldGVyQ29ubmVjdG9yIGV4dGVuZHMgQWJzdHJhY3RQYXJhbWV0ZXJDb25uZWN0b3IKLXsKLQotICAgIHByb3RlY3RlZCBEb3VibGVQYXJhbWV0ZXJDb25uZWN0b3IoSUNvbXBvbmVudCBjb21wb25lbnQsIFN0cmluZyBwYXJhbWV0ZXJOYW1lLCBJQmluZGluZyBiaW5kaW5nKQotICAgIHsKLSAgICAgICAgc3VwZXIoY29tcG9uZW50LCBwYXJhbWV0ZXJOYW1lLCBiaW5kaW5nKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgSW52b2tlcyB7QGxpbmsgSUJpbmRpbmcjZ2V0RG91YmxlKCl9IHRvIG9idGFpbiB0aGUgdmFsdWUKLSAgICAgKiAgdG8gYXNzaWduIHRvIHRoZSBwcm9wZXJ0eS4KLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJhbWV0ZXIoSVJlcXVlc3RDeWNsZSBjeWNsZSkKLSAgICB7Ci0gICAgICAgIGlmIChzaG91bGRTZXRQcm9wZXJ0eVZhbHVlKGN5Y2xlKSkKLSAgICAgICAgewotICAgICAgICAgICAgZG91YmxlIHNjYWxhciA9IGdldEJpbmRpbmcoKS5nZXREb3VibGUoKTsKLQotICAgICAgICAgICAgc2V0UHJvcGVydHlWYWx1ZShuZXcgRG91YmxlKHNjYWxhcikpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvcGFyYW0vSVBhcmFtZXRlckNvbm5lY3Rvci5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3BhcmFtL0lQYXJhbWV0ZXJDb25uZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODdiZTYzNS4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvcGFyYW0vSVBhcmFtZXRlckNvbm5lY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkucGFyYW07Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZXF1ZXN0Q3ljbGU7Ci0KLS8qKgotICogIERlZmluZSBhIHR5cGUgb2YgY29ubmVjdG9yIGJldHdlZW4gYSBiaW5kaW5nIG9mIGEgY29tcG9uZW50IGFuZCBhIEphdmFCZWFucwotICogIHByb3BlcnR5IG9mIHRoZSBjb21wb25lbnQgKHdpdGggdGhlIHNhbWUgbmFtZSkuICBBbGxvd3MKLSAqICBmb3IgdGhlIHBhcmFtZXRlciB0byBiZSBzZXQgYmVmb3JlIHRoZSBjb21wb25lbnQgaXMgcmVuZGVyZWQsCi0gKiAgdGhlbiBjbGVhcmVkIGFmdGVyIHRoZSBjb21wb25lbnQgaXMgcmVuZGVyZWQuCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQHNpbmNlIDIuMC4zCi0gKiAKLSAqKi8KLQotcHVibGljIGludGVyZmFjZSBJUGFyYW1ldGVyQ29ubmVjdG9yCi17Ci0gICAgLyoqCi0gICAgICogIFNldHMgdGhlIHBhcmFtZXRlciBmcm9tIHRoZSBiaW5kaW5nLgotICAgICAqICAKLSAgICAgKiAgQHRocm93cyBSZXF1aXJlZFBhcmFtZXRlckV4Y2VwdGlvbiBpZiB0aGUgcGFyYW1ldGVyIGlzCi0gICAgICogIHJlcXVpcmVkLCBidXQgdGhlIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LklCaW5kaW5nfQotICAgICAqICBzdXBwbGllcyBhIG51bGwgdmFsdWUuCi0gICAgICogCi0gICAgICoqLwotICAgIAotCXB1YmxpYyB2b2lkIHNldFBhcmFtZXRlcihJUmVxdWVzdEN5Y2xlIGN5Y2xlKTsKLQkKLQkvKioKLQkgKiAgQ2xlYXJzIHRoZSBwYXJhbWV0ZXJzIHRvIGEgbnVsbCwgMCBvciBmYWxzZSB2YWx1ZQotCSAqICAoZGVwZW5kaW5nIG9uIHR5cGUpLgotCSAqIAotCSAqKi8KLQkKLQlwdWJsaWMgdm9pZCByZXNldFBhcmFtZXRlcihJUmVxdWVzdEN5Y2xlIGN5Y2xlKTsKLX0KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9wYXJhbS9JbnRQYXJhbWV0ZXJDb25uZWN0b3IuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9wYXJhbS9JbnRQYXJhbWV0ZXJDb25uZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU5OTUwZS4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvcGFyYW0vSW50UGFyYW1ldGVyQ29ubmVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5wYXJhbTsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUJpbmRpbmc7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JQ29tcG9uZW50OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlcXVlc3RDeWNsZTsKLQotLyoqCi0gKiAgQ29ubmVjdHMgYSBwYXJhbWV0ZXIgdG8gYW4gaW50IHByb3BlcnR5LgotICoKLSAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiAgQHZlcnNpb24gJElkJAotICogIEBzaW5jZSAyLjAuMwotICoKLSAqKi8KLQotcHVibGljIGNsYXNzIEludFBhcmFtZXRlckNvbm5lY3RvciBleHRlbmRzIEFic3RyYWN0UGFyYW1ldGVyQ29ubmVjdG9yCi17Ci0KLSAgICBwcm90ZWN0ZWQgSW50UGFyYW1ldGVyQ29ubmVjdG9yKElDb21wb25lbnQgY29tcG9uZW50LCBTdHJpbmcgcGFyYW1ldGVyTmFtZSwgSUJpbmRpbmcgYmluZGluZykKLSAgICB7Ci0gICAgICAgIHN1cGVyKGNvbXBvbmVudCwgcGFyYW1ldGVyTmFtZSwgYmluZGluZyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEludm9rZXMge0BsaW5rIElCaW5kaW5nI2dldEludCgpfSB0byBvYnRhaW4KLSAgICAgKiAgYW4gaW50IHZhbHVlIHRvIGFzc2lnbi4KLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJhbWV0ZXIoSVJlcXVlc3RDeWNsZSBjeWNsZSkKLSAgICB7Ci0gICAgICAgIGlmIChzaG91bGRTZXRQcm9wZXJ0eVZhbHVlKGN5Y2xlKSkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IHNjYWxhciA9IGdldEJpbmRpbmcoKS5nZXRJbnQoKTsKLQotICAgICAgICAgICAgc2V0UHJvcGVydHlWYWx1ZShuZXcgSW50ZWdlcihzY2FsYXIpKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3BhcmFtL09iamVjdFBhcmFtZXRlckNvbm5lY3Rvci5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3BhcmFtL09iamVjdFBhcmFtZXRlckNvbm5lY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzAyMDAzLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9wYXJhbS9PYmplY3RQYXJhbWV0ZXJDb25uZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LnBhcmFtOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JQmluZGluZzsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVxdWVzdEN5Y2xlOwotCi0vKioKLSAqICBJbXBsZW1lbnRzIHtAbGluayBJUGFyYW1ldGVyQ29ubmVjdG9yfSBmb3Igb2JqZWN0IHBhcmFtZXRlcnMuCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQHNpbmNlIDIuMC4zCi0gKgotICoqLwotCi1wdWJsaWMgY2xhc3MgT2JqZWN0UGFyYW1ldGVyQ29ubmVjdG9yIGV4dGVuZHMgQWJzdHJhY3RQYXJhbWV0ZXJDb25uZWN0b3IKLXsKLSAgICBwcml2YXRlIENsYXNzIF9yZXF1aXJlZFR5cGU7Ci0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0UGFyYW1ldGVyQ29ubmVjdG9yKAotICAgICAgICBJQ29tcG9uZW50IGNvbXBvbmVudCwKLSAgICAgICAgU3RyaW5nIHBhcmFtZXRlck5hbWUsCi0gICAgICAgIElCaW5kaW5nIGJpbmRpbmcsCi0gICAgICAgIENsYXNzIHJlcXVpcmVkVHlwZSkKLSAgICB7Ci0gICAgICAgIHN1cGVyKGNvbXBvbmVudCwgcGFyYW1ldGVyTmFtZSwgYmluZGluZyk7Ci0KLSAgICAgICAgX3JlcXVpcmVkVHlwZSA9IHJlcXVpcmVkVHlwZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgU2V0cyB0aGUgcGFyYW1ldGVyIHByb3BlcnR5IHRvIG51bGwuCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgc2V0UGFyYW1ldGVyKElSZXF1ZXN0Q3ljbGUgY3ljbGUpCi0gICAgewotICAgICAgICBpZiAoc2hvdWxkU2V0UHJvcGVydHlWYWx1ZShjeWNsZSkpCi0gICAgICAgICAgICBzZXRQcm9wZXJ0eVZhbHVlKGdldEJpbmRpbmdWYWx1ZShfcmVxdWlyZWRUeXBlKSk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9wYXJhbS9QYXJhbWV0ZXJNYW5hZ2VyLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvcGFyYW0vUGFyYW1ldGVyTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2FiM2M5Li4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9wYXJhbS9QYXJhbWV0ZXJNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTUgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkucGFyYW07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5CaW5kaW5nRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUJpbmRpbmc7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JQ29tcG9uZW50OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlcXVlc3RDeWNsZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZXNvdXJjZVJlc29sdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuVGFwZXN0cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5zcGVjLkRpcmVjdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnNwZWMuSUNvbXBvbmVudFNwZWNpZmljYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5zcGVjLklQYXJhbWV0ZXJTcGVjaWZpY2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkudXRpbC5wcm9wLlByb3BlcnR5RmluZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkudXRpbC5wcm9wLlByb3BlcnR5SW5mbzsKLQotLyoqCi0gKiAgTWFuYWdlcyBhIHNldCBvZiB7QGxpbmsgSVBhcmFtZXRlckNvbm5lY3Rvcn1zIGZvciBhCi0gKiAge0BsaW5rIElDb21wb25lbnR9LgotICoKLSAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiAgQHZlcnNpb24gJElkJAotICogIEBzaW5jZSAyLjAuMwotICoKLSAqKi8KLQotcHVibGljIGNsYXNzIFBhcmFtZXRlck1hbmFnZXIKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgTE9HID0gTG9nRmFjdG9yeS5nZXRMb2coUGFyYW1ldGVyTWFuYWdlci5jbGFzcyk7Ci0KLSAgICAvKioKLSAgICAgKiAgU3BlY2lhbCB0eXBlcyB0aGF0IGFyZW4ndCByZXNvbHZlZCBieSBjbGFzcyBsb29rdXBzLCBpbmNsdWRpbmcKLSAgICAgKiAgc2NhbGFycywgYXJyYXlzIG9mIHNjYWxhcnMsIGV0Yy4KLSAgICAgKiAKLSAgICAgKiAgPHA+Ci0gICAgICogIFRoZXJlJ3Mgc29tZSBvdmVybGFwIGhlcmUgd2l0aCBDb21wb25lbnRDbGFzc0ZhY3RvcnkuCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIFNQRUNJQUxfVFlQRV9NQVAgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgc3RhdGljIHsKLSAgICAgICAgU1BFQ0lBTF9UWVBFX01BUC5wdXQoImJvb2xlYW4iLCBib29sZWFuLmNsYXNzKTsKLSAgICAgICAgU1BFQ0lBTF9UWVBFX01BUC5wdXQoImJvb2xlYW5bXSIsIGJvb2xlYW5bXS5jbGFzcyk7Ci0gICAgICAgIFNQRUNJQUxfVFlQRV9NQVAucHV0KCJieXRlIiwgYnl0ZS5jbGFzcyk7Ci0gICAgICAgIFNQRUNJQUxfVFlQRV9NQVAucHV0KCJieXRlW10iLCBieXRlW10uY2xhc3MpOwotICAgICAgICBTUEVDSUFMX1RZUEVfTUFQLnB1dCgiY2hhciIsIGNoYXIuY2xhc3MpOwotICAgICAgICBTUEVDSUFMX1RZUEVfTUFQLnB1dCgiY2hhcltdIiwgY2hhcltdLmNsYXNzKTsKLSAgICAgICAgU1BFQ0lBTF9UWVBFX01BUC5wdXQoInNob3J0Iiwgc2hvcnQuY2xhc3MpOwotICAgICAgICBTUEVDSUFMX1RZUEVfTUFQLnB1dCgic2hvcnRbXSIsIHNob3J0W10uY2xhc3MpOwotICAgICAgICBTUEVDSUFMX1RZUEVfTUFQLnB1dCgiaW50IiwgaW50LmNsYXNzKTsKLSAgICAgICAgU1BFQ0lBTF9UWVBFX01BUC5wdXQoImludFtdIiwgaW50W10uY2xhc3MpOwotICAgICAgICBTUEVDSUFMX1RZUEVfTUFQLnB1dCgibG9uZyIsIGxvbmcuY2xhc3MpOwotICAgICAgICBTUEVDSUFMX1RZUEVfTUFQLnB1dCgibG9uZ1tdIiwgbG9uZ1tdLmNsYXNzKTsKLSAgICAgICAgU1BFQ0lBTF9UWVBFX01BUC5wdXQoImZsb2F0IiwgZmxvYXQuY2xhc3MpOwotICAgICAgICBTUEVDSUFMX1RZUEVfTUFQLnB1dCgiZmxvYXRbXSIsIGZsb2F0W10uY2xhc3MpOwotICAgICAgICBTUEVDSUFMX1RZUEVfTUFQLnB1dCgiZG91YmxlIiwgZG91YmxlLmNsYXNzKTsKLSAgICAgICAgU1BFQ0lBTF9UWVBFX01BUC5wdXQoImRvdWJsZVtdIiwgZG91YmxlW10uY2xhc3MpOwotCi0gICAgICAgIFNQRUNJQUxfVFlQRV9NQVAucHV0KCJqYXZhLmxhbmcuT2JqZWN0W10iLCBPYmplY3RbXS5jbGFzcyk7Ci0gICAgICAgIFNQRUNJQUxfVFlQRV9NQVAucHV0KCJqYXZhLmxhbmcuU3RyaW5nW10iLCBTdHJpbmdbXS5jbGFzcyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBJQ29tcG9uZW50IF9jb21wb25lbnQ7Ci0gICAgcHJpdmF0ZSBJUGFyYW1ldGVyQ29ubmVjdG9yW10gX2Nvbm5lY3RvcnM7Ci0KLSAgICBwdWJsaWMgUGFyYW1ldGVyTWFuYWdlcihJQ29tcG9uZW50IGNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIF9jb21wb25lbnQgPSBjb21wb25lbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEludm9rZWQganVzdCBiZWZvcmUgYSBjb21wb25lbnQgcmVuZGVycy4gIENvbnZlcnRzIGJpbmRpbmdzIHRvIHZhbHVlcwotICAgICAqICB0aGF0IGFyZSBhc3NpZ25lZCB0byBjb25uZWN0ZWQgcHJvcGVydGllcy4KLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJhbWV0ZXJzKElSZXF1ZXN0Q3ljbGUgY3ljbGUpCi0gICAgewotICAgICAgICBpZiAoX2Nvbm5lY3RvcnMgPT0gbnVsbCkKLSAgICAgICAgICAgIHNldHVwKGN5Y2xlKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9jb25uZWN0b3JzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgX2Nvbm5lY3RvcnNbaV0uc2V0UGFyYW1ldGVyKGN5Y2xlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgSW52b2tlZCBqdXN0IGFmdGVyIHRoZSBjb21wb25lbnQgcmVuZGVycy4gIFJldHVybnMgY29tcG9uZW50IHByb3BlcnRpZXMKLSAgICAgKiAgYmFjayB0byBpbml0aWFsIHZhbHVlcyAodW5sZXNzIHRoZSBjb3JyZXNwb25kaW5nIGJpbmRpbmcgaXMKLSAgICAgKiAge0BsaW5rIElCaW5kaW5nI2lzSW52YXJpYW50KCkgaW52YXJpYW50fSkuICBJbiBhZGRpdGlvbiwgZm9yCi0gICAgICogIHtAbGluayBEaXJlY3Rpb24jRk9STX0gcGFyYW1ldGVycywgdGhlIHByb3BlcnR5IGlzIHJlYWQgYW5kIHRoZSBiaW5kaW5nCi0gICAgICogIGlzIHNldCBmcm9tIHRoZSBwcm9wZXJ0eSB2YWx1ZSAoaWYgdGhlIGN5Y2xlIGlzIHJld2luZGluZyBhbmQgdGhlIGN1cnJlbnQKLSAgICAgKiAgZm9ybSBpcyByZXdpbmRpbmcpLgotICAgICAqIAotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIHJlc2V0UGFyYW1ldGVycyhJUmVxdWVzdEN5Y2xlIGN5Y2xlKQotICAgIHsKLSAgICAgICAgaWYgKF9jb25uZWN0b3JzID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfY29ubmVjdG9ycy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgIF9jb25uZWN0b3JzW2ldLnJlc2V0UGFyYW1ldGVyKGN5Y2xlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2V0dXAoSVJlcXVlc3RDeWNsZSBjeWNsZSkKLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gZGVidWcgPSBMT0cuaXNEZWJ1Z0VuYWJsZWQoKTsKLQotICAgICAgICBpZiAoZGVidWcpCi0gICAgICAgICAgICBMT0cuZGVidWcoX2NvbXBvbmVudCArICI6IGNvbm5lY3RpbmcgcGFyYW1ldGVycyBhbmQgcHJvcGVydGllcyIpOwotCi0gICAgICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgSUNvbXBvbmVudFNwZWNpZmljYXRpb24gc3BlYyA9IF9jb21wb25lbnQuZ2V0U3BlY2lmaWNhdGlvbigpOwotICAgICAgICBJUmVzb3VyY2VSZXNvbHZlciByZXNvbHZlciA9IF9jb21wb25lbnQuZ2V0UGFnZSgpLmdldEVuZ2luZSgpLmdldFJlc291cmNlUmVzb2x2ZXIoKTsKLQotICAgICAgICBJUGFyYW1ldGVyQ29ubmVjdG9yIGRpc2FibGVkQ29ubmVjdG9yID0gbnVsbDsKLQotICAgICAgICBDb2xsZWN0aW9uIG5hbWVzID0gc3BlYy5nZXRQYXJhbWV0ZXJOYW1lcygpOwotICAgICAgICBJdGVyYXRvciBpID0gbmFtZXMuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpIGkubmV4dCgpOwotCi0gICAgICAgICAgICBpZiAoZGVidWcpCi0gICAgICAgICAgICAgICAgTE9HLmRlYnVnKCJDb25uZWN0aW5nIHBhcmFtZXRlciAiICsgbmFtZSArICIuIik7Ci0KLSAgICAgICAgICAgIElCaW5kaW5nIGJpbmRpbmcgPSBfY29tcG9uZW50LmdldEJpbmRpbmcobmFtZSk7Ci0gICAgICAgICAgICBpZiAoYmluZGluZyA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChkZWJ1ZykKLSAgICAgICAgICAgICAgICAgICAgTE9HLmRlYnVnKCJOb3QgYm91bmQuIik7Ci0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgSVBhcmFtZXRlclNwZWNpZmljYXRpb24gcHNwZWMgPSBzcGVjLmdldFBhcmFtZXRlcihuYW1lKTsKLSAgICAgICAgICAgIERpcmVjdGlvbiBkaXJlY3Rpb24gPSBwc3BlYy5nZXREaXJlY3Rpb24oKTsKLQotICAgICAgICAgICAgaWYgKGRpcmVjdGlvbiAhPSBEaXJlY3Rpb24uSU4gJiYgZGlyZWN0aW9uICE9IERpcmVjdGlvbi5GT1JNKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChkZWJ1ZykKLSAgICAgICAgICAgICAgICAgICAgTE9HLmRlYnVnKCJQYXJhbWV0ZXIgaXMgIiArIHBzcGVjLmdldERpcmVjdGlvbigpLmdldE5hbWUoKSArICIuIik7Ci0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFkaXJlY3Rpb24uZ2V0QWxsb3dJbnZhcmlhbnQoKSAmJiBiaW5kaW5nLmlzSW52YXJpYW50KCkpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvbm5lY3RlZFBhcmFtZXRlckV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgVGFwZXN0cnkuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAgICAgIlBhcmFtZXRlck1hbmFnZXIuaW5jb21wYXRpYmxlLWRpcmVjdGlvbi1hbmQtYmluZGluZyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbXBvbmVudC5nZXRFeHRlbmRlZElkKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uLmdldERpc3BsYXlOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZGluZyB9KSwKLSAgICAgICAgICAgICAgICAgICAgX2NvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgYmluZGluZy5nZXRMb2NhdGlvbigpLAotICAgICAgICAgICAgICAgICAgICBudWxsKTsKLQotICAgICAgICAgICAgU3RyaW5nIHByb3BlcnR5TmFtZSA9IHBzcGVjLmdldFByb3BlcnR5TmFtZSgpOwotCi0gICAgICAgICAgICBpZiAoZGVidWcgJiYgIW5hbWUuZXF1YWxzKHByb3BlcnR5TmFtZSkpCi0gICAgICAgICAgICAgICAgTE9HLmRlYnVnKCJDb25uZWN0aW5nIHRvIHByb3BlcnR5ICIgKyBwcm9wZXJ0eU5hbWUgKyAiLiIpOwotCi0gICAgICAgICAgICAvLyBOZXh0LHZlcmlmeSB0aGF0IHRoZXJlIGlzIGEgd3JpdGFibGUgcHJvcGVydHkgd2l0aCB0aGUgc2FtZQotICAgICAgICAgICAgLy8gbmFtZSBhcyB0aGUgcGFyYW1ldGVyLgotCi0gICAgICAgICAgICBQcm9wZXJ0eUluZm8gcHJvcGVydHlJbmZvID0KLSAgICAgICAgICAgICAgICBQcm9wZXJ0eUZpbmRlci5nZXRQcm9wZXJ0eUluZm8oX2NvbXBvbmVudC5nZXRDbGFzcygpLCBwcm9wZXJ0eU5hbWUpOwotCi0gICAgICAgICAgICBpZiAocHJvcGVydHlJbmZvID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvbm5lY3RlZFBhcmFtZXRlckV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgVGFwZXN0cnkuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAgICAgIlBhcmFtZXRlck1hbmFnZXIubm8tYWNjZXNzb3IiLAotICAgICAgICAgICAgICAgICAgICAgICAgX2NvbXBvbmVudC5nZXRFeHRlbmRlZElkKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWUpLAotICAgICAgICAgICAgICAgICAgICBfY29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICBuYW1lLAotICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWUsCi0gICAgICAgICAgICAgICAgICAgIGJpbmRpbmcuZ2V0TG9jYXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgbnVsbCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghcHJvcGVydHlJbmZvLmlzUmVhZFdyaXRlKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvbm5lY3RlZFBhcmFtZXRlckV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgVGFwZXN0cnkuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAgICAgIlBhcmFtZXRlck1hbmFnZXIucHJvcGVydHktbm90LXJlYWQtd3JpdGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgX2NvbXBvbmVudC5nZXRFeHRlbmRlZElkKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWUpLAotICAgICAgICAgICAgICAgICAgICBfY29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICBuYW1lLAotICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWUsCi0gICAgICAgICAgICAgICAgICAgIGJpbmRpbmcuZ2V0TG9jYXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgbnVsbCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBwYXJhbWV0ZXIgdHlwZSBtYXRjaGVzIHRoZSBwcm9wZXJ0eSB0eXBlCi0KLSAgICAgICAgICAgIENsYXNzIHByb3BlcnR5VHlwZSA9IHByb3BlcnR5SW5mby5nZXRUeXBlKCk7Ci0gICAgICAgICAgICBDbGFzcyBwYXJhbWV0ZXJUeXBlID0gZ2V0VHlwZShwc3BlYy5nZXRUeXBlKCksIHJlc29sdmVyKTsKLQotICAgICAgICAgICAgaWYgKHBhcmFtZXRlclR5cGUgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29ubmVjdGVkUGFyYW1ldGVyRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICBUYXBlc3RyeS5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAiUGFyYW1ldGVyTWFuYWdlci5qYXZhLXR5cGUtbm90LXNwZWNpZmllZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgX2NvbXBvbmVudC5nZXRFeHRlbmRlZElkKCkpLAotICAgICAgICAgICAgICAgICAgICBfY29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICBuYW1lLAotICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWUsCi0gICAgICAgICAgICAgICAgICAgIGJpbmRpbmcuZ2V0TG9jYXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgbnVsbCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghcHJvcGVydHlUeXBlLmVxdWFscyhwYXJhbWV0ZXJUeXBlKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29ubmVjdGVkUGFyYW1ldGVyRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICBUYXBlc3RyeS5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAiUGFyYW1ldGVyTWFuYWdlci50eXBlLW1pc21hdGNoIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY29tcG9uZW50LmdldEV4dGVuZGVkSWQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJUeXBlLnRvU3RyaW5nKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlUeXBlLnRvU3RyaW5nKCl9KSwKLSAgICAgICAgICAgICAgICAgICAgX2NvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlOYW1lLAotICAgICAgICAgICAgICAgICAgICBiaW5kaW5nLmdldExvY2F0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgIG51bGwpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBIZXJlJ3Mgd2hlcmUgd2Ugd2lsbCBzbmlmZiBpdCBmb3IgdHlwZSwgZm9yIHRoZSBtb21lbnQKLSAgICAgICAgICAgIC8vIGFzc3VtZSBpdHMgc29tZSBmb3JtIG9mIG9iamVjdCAobm90IHNjYWxhcikgdHlwZS4KLQotICAgICAgICAgICAgSVBhcmFtZXRlckNvbm5lY3RvciBjb25uZWN0b3IgPQotICAgICAgICAgICAgICAgIGNyZWF0ZUNvbm5lY3RvcihfY29tcG9uZW50LCBuYW1lLCBiaW5kaW5nLCBwcm9wZXJ0eVR5cGUsIHBhcmFtZXRlclR5cGUpOwotCi0gICAgICAgICAgICAvLyBTdGF0aWMgYmluZGluZ3MgYXJlIHNldCBoZXJlIGFuZCB0aGVuIGZvcmdvdHRlbgotICAgICAgICAgICAgLy8gYWJvdXQuICBEeW5hbWljIGJpbmRpbmdzIGFyZSBrZXB0IGZvciBsYXRlci4KLQotICAgICAgICAgICAgaWYgKGJpbmRpbmcuaXNJbnZhcmlhbnQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoZGVidWcpCi0gICAgICAgICAgICAgICAgICAgIExPRy5kZWJ1ZygiU2V0dGluZyBpbnZhcmlhbnQgdmFsdWUgdXNpbmcgIiArIGNvbm5lY3RvciArICIuIik7Ci0KLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rvci5zZXRQYXJhbWV0ZXIoY3ljbGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoQmluZGluZ0V4Y2VwdGlvbiBleCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb25uZWN0ZWRQYXJhbWV0ZXJFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICBUYXBlc3RyeS5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBhcmFtZXRlck1hbmFnZXIuc3RhdGljLWluaXRpYWxpemF0aW9uLWZhaWx1cmUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY29tcG9uZW50LmdldEV4dGVuZGVkSWQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kaW5nLnRvU3RyaW5nKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgX2NvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBleCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChkZWJ1ZykKLSAgICAgICAgICAgICAgICBMT0cuZGVidWcoIkFkZGluZyAiICsgY29ubmVjdG9yICsgIi4iKTsKLQotICAgICAgICAgICAgLy8gVG8gcHJvcGVybHkgc3VwcG9ydCBmb3JtcyBlbGVtZW50cywgdGhlIGRpc2FibGVkIHBhcmFtZXRlcgotICAgICAgICAgICAgLy8gbXVzdCBhbHdheXMgYmUgcHJvY2Vzc2VkIGxhc3QuCi0KLSAgICAgICAgICAgIGlmIChuYW1lLmVxdWFscygiZGlzYWJsZWQiKSkKLSAgICAgICAgICAgICAgICBkaXNhYmxlZENvbm5lY3RvciA9IGNvbm5lY3RvcjsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBsaXN0LmFkZChjb25uZWN0b3IpOwotCi0gICAgICAgIH0KLQotICAgICAgICBpZiAoZGlzYWJsZWRDb25uZWN0b3IgIT0gbnVsbCkKLSAgICAgICAgICAgIGxpc3QuYWRkKGRpc2FibGVkQ29ubmVjdG9yKTsKLQotICAgICAgICAvLyBDb252ZXJ0IGZvciBMaXN0IHRvIGFycmF5Ci0KLSAgICAgICAgX2Nvbm5lY3RvcnMgPSAoSVBhcmFtZXRlckNvbm5lY3RvcltdKSBsaXN0LnRvQXJyYXkobmV3IElQYXJhbWV0ZXJDb25uZWN0b3JbbGlzdC5zaXplKCldKTsKLQotICAgIH0KLQotICAgIHByaXZhdGUgSVBhcmFtZXRlckNvbm5lY3RvciBjcmVhdGVDb25uZWN0b3IoCi0gICAgICAgIElDb21wb25lbnQgY29tcG9uZW50LAotICAgICAgICBTdHJpbmcgcGFyYW1ldGVyTmFtZSwKLSAgICAgICAgSUJpbmRpbmcgYmluZGluZywKLSAgICAgICAgQ2xhc3MgcHJvcGVydHlUeXBlLAotICAgICAgICBDbGFzcyByZXF1aXJlZFR5cGUpCi0gICAgewotICAgICAgICAvLyBDb3VsZCBjb252ZXJ0IHRoaXMgY29kZSB0byB1c2UgYSBEZWNvcmF0b3IsIGJ1dCB0aGVuIEknZCBuZWVkCi0gICAgICAgIC8vIHNvbWUga2luZCBvZiBmYWN0b3J5IGZvciB0aGVzZSBwYXJhbWV0ZXIgY29ubmVjdG9ycy4KLQotICAgICAgICBpZiAocHJvcGVydHlUeXBlLmVxdWFscyhCb29sZWFuLlRZUEUpKQotICAgICAgICAgICAgcmV0dXJuIG5ldyBCb29sZWFuUGFyYW1ldGVyQ29ubmVjdG9yKGNvbXBvbmVudCwgcGFyYW1ldGVyTmFtZSwgYmluZGluZyk7Ci0KLSAgICAgICAgaWYgKHByb3BlcnR5VHlwZS5lcXVhbHMoSW50ZWdlci5UWVBFKSkKLSAgICAgICAgICAgIHJldHVybiBuZXcgSW50UGFyYW1ldGVyQ29ubmVjdG9yKGNvbXBvbmVudCwgcGFyYW1ldGVyTmFtZSwgYmluZGluZyk7Ci0KLSAgICAgICAgaWYgKHByb3BlcnR5VHlwZS5lcXVhbHMoRG91YmxlLlRZUEUpKQotICAgICAgICAgICAgcmV0dXJuIG5ldyBEb3VibGVQYXJhbWV0ZXJDb25uZWN0b3IoY29tcG9uZW50LCBwYXJhbWV0ZXJOYW1lLCBiaW5kaW5nKTsKLQotICAgICAgICBpZiAocHJvcGVydHlUeXBlLmVxdWFscyhTdHJpbmcuY2xhc3MpKQotICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdQYXJhbWV0ZXJDb25uZWN0b3IoY29tcG9uZW50LCBwYXJhbWV0ZXJOYW1lLCBiaW5kaW5nKTsKLQotICAgICAgICAvLyBUaGUgZGVmYXVsdCBpcyBmb3IgYW55IGtpbmQgb2Ygb2JqZWN0IHR5cGUKLQotICAgICAgICByZXR1cm4gbmV3IE9iamVjdFBhcmFtZXRlckNvbm5lY3Rvcihjb21wb25lbnQsIHBhcmFtZXRlck5hbWUsIGJpbmRpbmcsIHJlcXVpcmVkVHlwZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBDbGFzcyBnZXRUeXBlKFN0cmluZyBuYW1lLCBJUmVzb3VyY2VSZXNvbHZlciByZXNvbHZlcikKLSAgICB7Ci0gICAgICAgIGlmIChUYXBlc3RyeS5pc0JsYW5rKG5hbWUpKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgQ2xhc3MgcmVzdWx0ID0gKENsYXNzKSBTUEVDSUFMX1RZUEVfTUFQLmdldChuYW1lKTsKLQotICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotCi0gICAgICAgIHJldHVybiByZXNvbHZlci5maW5kQ2xhc3MobmFtZSk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9wYXJhbS9TdHJpbmdQYXJhbWV0ZXJDb25uZWN0b3IuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9wYXJhbS9TdHJpbmdQYXJhbWV0ZXJDb25uZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTYzNmFkMS4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvcGFyYW0vU3RyaW5nUGFyYW1ldGVyQ29ubmVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5wYXJhbTsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUJpbmRpbmc7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JQ29tcG9uZW50OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlcXVlc3RDeWNsZTsKLQotLyoqCi0gKiAgQ3JlYXRlcyBhIGNvbm5lY3Rpb24gYmV0d2VlbiBhIHBhcmFtZXRlciBhbmQgYSBwcm9wZXJ0eSBvZiB0eXBlIHtAbGluayBTdHJpbmd9LgotICoKLSAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiAgQHZlcnNpb24gJElkJAotICogIEBzaW5jZSAyLjAuMwotICoKLSAqKi8KLQotcHVibGljIGNsYXNzIFN0cmluZ1BhcmFtZXRlckNvbm5lY3RvciBleHRlbmRzIEFic3RyYWN0UGFyYW1ldGVyQ29ubmVjdG9yCi17Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nUGFyYW1ldGVyQ29ubmVjdG9yKAotICAgICAgICBJQ29tcG9uZW50IGNvbXBvbmVudCwKLSAgICAgICAgU3RyaW5nIHBhcmFtZXRlck5hbWUsCi0gICAgICAgIElCaW5kaW5nIGJpbmRpbmcpCi0gICAgewotICAgICAgICBzdXBlcihjb21wb25lbnQsIHBhcmFtZXRlck5hbWUsIGJpbmRpbmcpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBJbnZva2VzIHtAbGluayBJQmluZGluZyNnZXRTdHJpbmcoKX0gdG8gb2J0YWluIHRoZSBwcm9wZXJ0eQotICAgICAqICB2YWx1ZS4KLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJhbWV0ZXIoSVJlcXVlc3RDeWNsZSBjeWNsZSkKLSAgICB7Ci0gICAgICAgIGlmIChzaG91bGRTZXRQcm9wZXJ0eVZhbHVlKGN5Y2xlKSkKLSAgICAgICAgICAgIHNldFByb3BlcnR5VmFsdWUoZ2V0QmluZGluZygpLmdldFN0cmluZygpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvcGFyYW0vcGFja2FnZS5odG1sIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3BhcmFtL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE0NGE5NC4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvcGFyYW0vcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotPCFkb2N0eXBlIGh0bWwgcHVibGljICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLTwhLS0gJElkJCAtLT4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+VGFwZXN0cnk6IFdlYiBBcHBsaWNhdGlvbiBGcmFtZXdvcms8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci0KLUNvZGUgdG8gYXNzaXN0IHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LklDb21wb25lbnR9IGluIHNldHRpbmcgSmF2YUJlYW5zIHByb3BlcnRpZXMgCi1mcm9tIGJvdW5kIHBhcmFtZXRlcnMuCi0KLUBhdXRob3IgSG93YXJkIExld2lzIFNoaXAgPGEgaHJlZj0ibWFpbHRvOmhsc2hpcEBhcGFjaGUub3JnIj5obHNoaXBAYXBhY2hlLm9yZzwvYT4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3BhcnNlL0Fic3RyYWN0U3BlY2lmaWNhdGlvblJ1bGUuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9wYXJzZS9BYnN0cmFjdFNwZWNpZmljYXRpb25SdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5ZTMwZTYuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3BhcnNlL0Fic3RyYWN0U3BlY2lmaWNhdGlvblJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LnBhcnNlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmJlYW51dGlscy5Qcm9wZXJ0eVV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5kaWdlc3Rlci5SdWxlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUxvY2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlc291cmNlTG9jYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5UYXBlc3RyeTsKLWltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOwotCi0vKioKLSAqICBQbGFjZWhvbGRlciBmb3IgdXRpbGl0eSBtZXRob2RzIG5lZWRlZCBieSB0aGUgdmFyaW91cwotICogIHNwZWNpZmljYXRpb24tb3JpZW50ZWQge0BsaW5rIG9yZy5hcGFjaGUuY29tbW9ucy5kaWdlc3Rlci5SdWxlfXMuCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQHNpbmNlIDMuMAotICoKLSAqKi8KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U3BlY2lmaWNhdGlvblJ1bGUgZXh0ZW5kcyBSdWxlCi17Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFZhbHVlKEF0dHJpYnV0ZXMgYXR0cmlidXRlcywgU3RyaW5nIG5hbWUpCi0gICAgewotICAgICAgICBpbnQgY291bnQgPSBhdHRyaWJ1dGVzLmdldExlbmd0aCgpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLSAgICAgICAgewotICAgICAgICAJU3RyaW5nIGF0dHJpYnV0ZU5hbWUgPSBhdHRyaWJ1dGVzLmdldExvY2FsTmFtZShpKTsKLSAgICAgICAgCQotICAgICAgICAJaWYgKFRhcGVzdHJ5LmlzQmxhbmsoYXR0cmlidXRlTmFtZSkpCi0gICAgICAgIAkJYXR0cmlidXRlTmFtZSA9IGF0dHJpYnV0ZXMuZ2V0UU5hbWUoaSk7Ci0gICAgICAgIAkKLSAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVOYW1lLmVxdWFscyhuYW1lKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gYXR0cmlidXRlcy5nZXRWYWx1ZShpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgdmFsdWUpCi0gICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAJUHJvcGVydHlVdGlscy5zZXRQcm9wZXJ0eShkaWdlc3Rlci5wZWVrKCksIHByb3BlcnR5TmFtZSwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBHZXRzIHRoZSBjdXJyZW50IGxvY2F0aW9uIHRhZy4gIFRoaXMgcmVxdWlyZXMgdGhhdCB0aGUKLSAgICAgKiAgcnVsZSdzIGRpZ2VzdGVyIGJlIHtAbGluayBTcGVjaWZpY2F0aW9uRGlnZXN0ZXJ9LgotICAgICAqIAotICAgICAqKi8KLQotICAgIHByb3RlY3RlZCBJTG9jYXRpb24gZ2V0TG9jYXRpb24oKQotICAgIHsKLSAgICAgICAgU3BlY2lmaWNhdGlvbkRpZ2VzdGVyIGxvY2F0YWJsZURpZ2VzdGVyID0gKFNwZWNpZmljYXRpb25EaWdlc3RlcikgZGlnZXN0ZXI7Ci0KLSAgICAgICAgcmV0dXJuIGxvY2F0YWJsZURpZ2VzdGVyLmdldExvY2F0aW9uVGFnKCk7Ci0gICAgfQotCi0gICAgLy8gVGVtcG9yYXJ5LCB1bnRpbCBEb2N1bWVudFBhcnNlRXhjZXB0aW9uIGlzIGZpeGVkLgotCi0gICAgcHJvdGVjdGVkIElSZXNvdXJjZUxvY2F0aW9uIGdldFJlc291cmNlTG9jYXRpb24oKQotICAgIHsKLSAgICAgICAgU3BlY2lmaWNhdGlvbkRpZ2VzdGVyIGxvY2F0YWJsZURpZ2VzdGVyID0gKFNwZWNpZmljYXRpb25EaWdlc3RlcikgZGlnZXN0ZXI7Ci0KLSAgICAgICAgcmV0dXJuIGxvY2F0YWJsZURpZ2VzdGVyLmdldFJlc291cmNlTG9jYXRpb24oKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvcGFyc2UvQXR0cmlidXRlVHlwZS5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3BhcnNlL0F0dHJpYnV0ZVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTcyNDQ0Ny4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvcGFyc2UvQXR0cmlidXRlVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkucGFyc2U7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5lbnVtLkVudW07Ci0KLS8qKgotICogIFRoZSB0eXBlIG9mIGFuIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LnBhcnNlLlRlbXBsYXRlQXR0cmlidXRlfS4KLSAqICBOZXcgdHlwZXMgY2FuIGJlIGNyZWF0ZWQgYnkgbW9kaWZ5aW5nCi0gKiAge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkucGFyc2UuVGVtcGxhdGVQYXJzZXJ9IHRvIHJlY29nbml6ZQotICogIHRoZSBhdHRyaWJ1dGUgcHJlZml4IGluIGNvbXBuZW50IHRhZ3MsIGFuZAotICogIGJ5IG1vZGlmeWluZwotICogIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LkJhc2VDb21wb25lbnRUZW1wbGF0ZUxvYWRlcn0KLSAqICB0byBhY3R1YWxseSBkbyBzb21ldGhpbmcgd2l0aCB0aGUgVGVtcGxhdGVBdHRyaWJ1dGUsIGJhc2VkIG9uIHR5cGUuCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQHNpbmNlIDMuMAotICoKLSAqKi8KLQotcHVibGljIGNsYXNzIEF0dHJpYnV0ZVR5cGUgZXh0ZW5kcyBFbnVtCi17Ci0JLyoqCi0JICogIEluZGljYXRlcyB0aGUgYXR0cmlidXRlIGlzIHNpbXBsZSwgbGl0ZXJhbCB0ZXh0LiAgVGhpcyBpcwotCSAqICB0aGUgZGVmYXVsdCBmb3IgYW55IGF0dHJpYnV0ZXMgd2l0aG91dCBhIHJlY29nbml6ZWQKLQkgKiAgcHJlZml4LgotCSAqIAotCSAqICBAc2VlIG9yZy5hcGFjaGUudGFwZXN0cnkuYmluZGluZy5TdGF0aWNCaW5kaW5nCi0JICogCi0JICoqLwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQXR0cmlidXRlVHlwZSBMSVRFUkFMID0gbmV3IEF0dHJpYnV0ZVR5cGUoIkxJVEVSQUwiKTsKLQotCS8qKgotCSAqICBJbmRpY2F0ZXMgdGhlIGF0dHJpYnV0ZSBpcyBhIE9HTkwgZXhwcmVzc2lvbi4KLQkgKiAKLQkgKiAgQHNlZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmJpbmRpbmcuRXhwcmVzc2lvbkJpbmRpbmcKLQkgKiAKLQkgKiovCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBBdHRyaWJ1dGVUeXBlIE9HTkxfRVhQUkVTU0lPTiA9IG5ldyBBdHRyaWJ1dGVUeXBlKCJPR05MX0VYUFJFU1NJT04iKTsKLQkKLQkvKioKLQkgKiAgSW5kaWNhdGVzIHRoZSBhdHRyaWJ1dGUgaXMgYSBsb2NhbGl6YXRpb24ga2V5LgotCSAqIAotCSAqICBAc2VlIG9yZy5hcGFjaGUudGFwZXN0cnkuYmluZGluZy5TdHJpbmdCaW5kaW5nCi0JICogCi0JICoqLwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQXR0cmlidXRlVHlwZSBMT0NBTElaQVRJT05fS0VZID0gbmV3IEF0dHJpYnV0ZVR5cGUoIkxPQ0FMSVpBVElPTl9LRVkiKTsKLQotICAgIHByaXZhdGUgQXR0cmlidXRlVHlwZShTdHJpbmcgbmFtZSkKLSAgICB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3BhcnNlL0Jhc2VEb2N1bWVudFJ1bGUuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9wYXJzZS9CYXNlRG9jdW1lbnRSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwMjMzYjkuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3BhcnNlL0Jhc2VEb2N1bWVudFJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LnBhcnNlOwotCi1pbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKLQotLyoqCi0gKiAgQmFzZSBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5wYXJzZS5JRG9jdW1lbnRSdWxlfS4KLSAqCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogIEB2ZXJzaW9uICRJZCQKLSAqICBAc2luY2UgMy4wCi0gKgotICoqLwotcHVibGljIGNsYXNzIEJhc2VEb2N1bWVudFJ1bGUgaW1wbGVtZW50cyBJRG9jdW1lbnRSdWxlCi17Ci0JcHJpdmF0ZSBTcGVjaWZpY2F0aW9uRGlnZXN0ZXIgX2RpZ2VzdGVyOwotCQotCXB1YmxpYyBTcGVjaWZpY2F0aW9uRGlnZXN0ZXIgZ2V0RGlnZXN0ZXIoKQotCXsKLQkJcmV0dXJuIF9kaWdlc3RlcjsKLQl9Ci0JCi0gICAgcHVibGljIHZvaWQgc2V0RGlnZXN0ZXIoU3BlY2lmaWNhdGlvbkRpZ2VzdGVyIGRpZ2VzdGVyKQotICAgIHsKLSAgICAJX2RpZ2VzdGVyID0gZGlnZXN0ZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RhcnREb2N1bWVudChTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVuZERvY3VtZW50KCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBmaW5pc2goKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3BhcnNlL0JvZHlSdWxlLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvcGFyc2UvQm9keVJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZmNTg5NS4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvcGFyc2UvQm9keVJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LnBhcnNlOwotCi0vKioKLSAqICBWYXJpYXRpb24gb2Yge0BsaW5rIG9yZy5hcGFjaGUuY29tbW9ucy5kaWdlc3Rlci5CZWFuUHJvcGVydHlTZXR0ZXJSdWxlfQotICogIHRoYXQgZG9lcyA8ZW0+bm90PC9lbT4gdHJpbSB0aGUgYm9keSB0ZXh0IG9mIGxlYWRpbmcgYW5kIHRyYWlsaW5nCi0gKiAgd2hpdGVzcGFjZS4gIFRoaXMgaXMgaW1wb3J0YW50IGZvciB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5zcGVjLklMaXN0ZW5lckJpbmRpbmdTcGVjaWZpY2F0aW9ufXMsCi0gKiAgd2hlcmUgdGhlIHdoaXRlc3BhY2UgbWF5IGJlIHJlbGV2YW50IQotICoKLSAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiAgQHZlcnNpb24gJElkJAotICogIEBzaW5jZSAzLjAKLSAqCi0gKiovCi0KLXB1YmxpYyBjbGFzcyBCb2R5UnVsZSBleHRlbmRzIEFic3RyYWN0U3BlY2lmaWNhdGlvblJ1bGUKLXsKLQlwcml2YXRlIFN0cmluZyBfcHJvcGVydHlOYW1lOwotCQotCXB1YmxpYyBCb2R5UnVsZShTdHJpbmcgcHJvcGVydHlOYW1lKQotCXsKLQkJX3Byb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZTsKLQl9CQotCi0gICAgcHVibGljIHZvaWQgYm9keShTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHRleHQpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0JCXNldFByb3BlcnR5KF9wcm9wZXJ0eU5hbWUsIHRleHQpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3BhcnNlL0Nsb3NlVG9rZW4uamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9wYXJzZS9DbG9zZVRva2VuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiMWI0MmIuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3BhcnNlL0Nsb3NlVG9rZW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LnBhcnNlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuYnVpbGRlci5Ub1N0cmluZ0J1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JTG9jYXRpb247Ci0KLS8qKgotICogIFJlcHJlc2VudHMgdGhlIGNsb3NpbmcgdGFnIG9mIGEgY29tcG9uZW50IGVsZW1lbnQgaW4gdGhlIHRlbXBsYXRlLgotICoKLSAqICBAc2VlIFRva2VuVHlwZSNDTE9TRQotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQHNpbmNlIDMuMAotICoKLSAqKi8KLQotcHVibGljIGNsYXNzIENsb3NlVG9rZW4gZXh0ZW5kcyBUZW1wbGF0ZVRva2VuCi17Ci0gICAgcHJpdmF0ZSBTdHJpbmcgX3RhZzsKLSAgICAKLSAgICBwdWJsaWMgQ2xvc2VUb2tlbihTdHJpbmcgdGFnLCBJTG9jYXRpb24gbG9jYXRpb24pCi0gICAgewotICAgICAgICBzdXBlcihUb2tlblR5cGUuQ0xPU0UsIGxvY2F0aW9uKTsKLSAgICAgICAgCi0gICAgICAgIF90YWcgPSB0YWc7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGFnKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfdGFnOwotICAgIH0KLSAgICAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBleHRlbmREZXNjcmlwdGlvbihUb1N0cmluZ0J1aWxkZXIgYnVpbGRlcikKLSAgICB7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJ0YWciLCBfdGFnKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9wYXJzZS9Db21wb25lbnRDb3B5T2ZSdWxlLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvcGFyc2UvQ29tcG9uZW50Q29weU9mUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODc3ZWM4Li4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9wYXJzZS9Db21wb25lbnRDb3B5T2ZSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5wYXJzZTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuVGFwZXN0cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5zcGVjLklCaW5kaW5nU3BlY2lmaWNhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnNwZWMuSUNvbXBvbmVudFNwZWNpZmljYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5zcGVjLklDb250YWluZWRDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS51dGlsLnhtbC5Eb2N1bWVudFBhcnNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7Ci0KLS8qKgotICogIEEgcnVsZSBmb3IgcHJvY2Vzc2luZyB0aGUgY29weS1vZiBhdHRyaWJ1dGUKLSAqICBvZiB0aGUgJmx0O2NvbXBvbmVudCZndDsgZWxlbWVudCAoaW4gYSBwYWdlCi0gKiAgb3IgY29tcG9uZW50IHNwZWNpZmljYXRpb24pLgotICoKLSAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiAgQHZlcnNpb24gJElkJAotICogIEBzaW5jZSAzLjAKLSAqCi0gKiovCi0KLXB1YmxpYyBjbGFzcyBDb21wb25lbnRDb3B5T2ZSdWxlIGV4dGVuZHMgQWJzdHJhY3RTcGVjaWZpY2F0aW9uUnVsZQotewotICAgIC8qKgotICAgICAqICBWYWxpZGF0ZXMgdGhhdCB0aGUgZWxlbWVudCBoYXMgZWl0aGVyIHR5cGUgb3IgY29weS1vZiAobm90IGJvdGgsIG5vdCBuZWl0aGVyKS4KLSAgICAgKiAgVXNlcyB0aGUgY29weS1vZiBhdHRyaWJ1dGUgdG8gZmluZCBhIHByZXZpb3VzbHkgZGVjbGFyZWQgY29tcG9uZW50Ci0gICAgICogIGFuZCBjb3BpZXMgaXRzIHR5cGUgYW5kIGJpbmRpbmdzIGludG8gdGhlIG5ldyBjb21wb25lbnQgKG9uIHRvcCBvZiB0aGUgc3RhY2spLgotICAgICAqIAotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIGJlZ2luKFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBuYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFN0cmluZyBpZCA9IGdldFZhbHVlKGF0dHJpYnV0ZXMsICJpZCIpOwotICAgICAgICBTdHJpbmcgY29weU9mID0gZ2V0VmFsdWUoYXR0cmlidXRlcywgImNvcHktb2YiKTsKLSAgICAgICAgU3RyaW5nIHR5cGUgPSBnZXRWYWx1ZShhdHRyaWJ1dGVzLCAidHlwZSIpOwotCi0gICAgICAgIGlmIChUYXBlc3RyeS5pc0JsYW5rKGNvcHlPZikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChUYXBlc3RyeS5pc0JsYW5rKHR5cGUpKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBEb2N1bWVudFBhcnNlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICBUYXBlc3RyeS5mb3JtYXQoIlNwZWNpZmljYXRpb25QYXJzZXIubWlzc2luZy10eXBlLW9yLWNvcHktb2YiLCBpZCksCi0gICAgICAgICAgICAgICAgICAgIGdldFJlc291cmNlTG9jYXRpb24oKSk7Ci0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChUYXBlc3RyeS5pc05vbkJsYW5rKHR5cGUpKQotICAgICAgICAgICAgdGhyb3cgbmV3IERvY3VtZW50UGFyc2VFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgVGFwZXN0cnkuZm9ybWF0KCJTcGVjaWZpY2F0aW9uUGFyc2VyLmJvdGgtdHlwZS1hbmQtY29weS1vZiIsIGlkKSwKLSAgICAgICAgICAgICAgICBnZXRSZXNvdXJjZUxvY2F0aW9uKCkpOwotCi0gICAgICAgIElDb21wb25lbnRTcGVjaWZpY2F0aW9uIHNwZWMgPSAoSUNvbXBvbmVudFNwZWNpZmljYXRpb24pIGRpZ2VzdGVyLmdldFJvb3QoKTsKLQotICAgICAgICBJQ29udGFpbmVkQ29tcG9uZW50IHNvdXJjZSA9IHNwZWMuZ2V0Q29tcG9uZW50KGNvcHlPZik7Ci0gICAgICAgIGlmIChzb3VyY2UgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBEb2N1bWVudFBhcnNlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIFRhcGVzdHJ5LmZvcm1hdCgiU3BlY2lmaWNhdGlvblBhcnNlci51bmFibGUtdG8tY29weSIsIGNvcHlPZiksCi0gICAgICAgICAgICAgICAgZ2V0UmVzb3VyY2VMb2NhdGlvbigpKTsKLQotICAgICAgICBJQ29udGFpbmVkQ29tcG9uZW50IHRhcmdldCA9IChJQ29udGFpbmVkQ29tcG9uZW50KSBkaWdlc3Rlci5wZWVrKCk7Ci0KLSAgICAgICAgdGFyZ2V0LnNldFR5cGUoc291cmNlLmdldFR5cGUoKSk7Ci0gICAgICAgIHRhcmdldC5zZXRDb3B5T2YoY29weU9mKTsKLQotICAgICAgICBJdGVyYXRvciBpID0gc291cmNlLmdldEJpbmRpbmdOYW1lcygpLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIGJpbmRpbmdOYW1lID0gKFN0cmluZykgaS5uZXh0KCk7Ci0gICAgICAgICAgICBJQmluZGluZ1NwZWNpZmljYXRpb24gYmluZGluZyA9IHNvdXJjZS5nZXRCaW5kaW5nKGJpbmRpbmdOYW1lKTsKLSAgICAgICAgICAgIHRhcmdldC5zZXRCaW5kaW5nKGJpbmRpbmdOYW1lLCBiaW5kaW5nKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3BhcnNlL0NvbXBvbmVudFRlbXBsYXRlLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvcGFyc2UvQ29tcG9uZW50VGVtcGxhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTgzN2EwYS4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvcGFyc2UvQ29tcG9uZW50VGVtcGxhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LnBhcnNlOwotCi0vKioKLSAqICBFbmFwc3VsYXRlcyBhIHBhcnNlZCBjb21wb25lbnQgdGVtcGxhdGUsIGFsbG93aW5nIGFjY2VzcyB0byB0aGUKLSAqICB0b2tlbnMgcGFyc2VkLgotICoKLSAqICA8cD5UQkQ6ICBSZWNvcmQgdGhlIG5hbWUgb2YgdGhlIHJlc291cmNlIChvciBvdGhlciBsb2NhdGlvbikgZnJvbSB3aGljaAotICogIHRoZSB0ZW1wbGF0ZSB3YXMgcGFyc2VkICh1c2VmdWwgZHVyaW5nIGRlYnVnZ2luZykuCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAKLSAqKi8KLQotcHVibGljIGNsYXNzIENvbXBvbmVudFRlbXBsYXRlCi17Ci0gICAgLyoqCi0gICAgICogIFRoZSBIVE1MIHRlbXBsYXRlIGZyb20gd2hpY2ggdGhlIHRva2VucyB3ZXJlIGdlbmVyYXRlZC4gIFRoaXMgaXMgYSBzdHJpbmcKLSAgICAgKiAgcmVhZCBmcm9tIGEgcmVzb3VyY2UuICBUaGUgdG9rZW5zIHJlcHJlc2VudHMgb2Zmc2V0cyBhbmQgbGVuZ3RocyBpbnRvCi0gICAgICogIHRoaXMgc3RyaW5nLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHJpdmF0ZSBjaGFyW10gX3RlbXBsYXRlRGF0YTsKLQotICAgIHByaXZhdGUgVGVtcGxhdGVUb2tlbltdIF90b2tlbnM7Ci0KLSAgICAvKioKLSAgICAgKiAgQ3JlYXRlcyBhIG5ldyBDb21wb25lbnRUZW1wbGF0ZS4KLSAgICAgKgotICAgICAqICBAcGFyYW0gdGVtcGxhdGVEYXRhIFRoZSB0ZW1wbGF0ZSBkYXRhLiAgVGhpcyBpcyA8ZW0+bm90PC9lbT4gY29waWVkLCBzbwotICAgICAqICB0aGUgYXJyYXkgcGFzc2VkIGluIHNob3VsZCBub3QgYmUgbW9kaWZpZWQgZnVydGhlci4KLSAgICAgKgotICAgICAqICBAcGFyYW0gdG9rZW5zICBUaGUgdG9rZW5zIG1ha2luZyB1cCB0aGUgdGVtcGxhdGUuICBUaGlzIGlzIGFsc28KLSAgICAgKiAgcmV0YWluZWQgKDxlbT5ub3Q8L2VtPiBjb3BpZWQpLCBhbmQgc28gc2hvdWxkIG5vdAotICAgICAqICBiZSBtb2RpZmllZCBvbmNlIHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3IuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgQ29tcG9uZW50VGVtcGxhdGUoY2hhcltdIHRlbXBsYXRlRGF0YSwgVGVtcGxhdGVUb2tlbltdIHRva2VucykKLSAgICB7Ci0gICAgICAgIF90ZW1wbGF0ZURhdGEgPSB0ZW1wbGF0ZURhdGE7Ci0gICAgICAgIF90b2tlbnMgPSB0b2tlbnM7Ci0gICAgfQotCi0gICAgcHVibGljIGNoYXJbXSBnZXRUZW1wbGF0ZURhdGEoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF90ZW1wbGF0ZURhdGE7Ci0gICAgfQotCi0gICAgcHVibGljIFRlbXBsYXRlVG9rZW4gZ2V0VG9rZW4oaW50IGluZGV4KQotICAgIHsKLSAgICAgICAgcmV0dXJuIF90b2tlbnNbaW5kZXhdOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0VG9rZW5Db3VudCgpCi0gICAgewotICAgICAgICByZXR1cm4gX3Rva2Vucy5sZW5ndGg7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9wYXJzZS9Db25uZWN0Q2hpbGRSdWxlLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvcGFyc2UvQ29ubmVjdENoaWxkUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjEzODkwLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9wYXJzZS9Db25uZWN0Q2hpbGRSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5wYXJzZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5iZWFudXRpbHMuTWV0aG9kVXRpbHM7Ci1pbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKLQotLyoqCi0gKiAgQ29ubmVjdHMgYSBjaGlsZCBvYmplY3QgdG8gYSBwYXJlbnQgb2JqZWN0IHVzaW5nIGEgbmFtZWQgbWV0aG9kLiAgVGhlIG1ldGhvZAotICogIHRha2VzIHR3byBwYXJhbWV0ZXJzOiB0aGUgbmFtZSBvZiB0aGUgY2hpbGQgb2JqZWN0IGFuZCB0aGUgY2hpbGQgb2JqZWN0IGl0c2VsZi4KLSAqICBUaGUgY2hpbGQgb2JqZWN0IG5hbWUgaXMgdGFrZW4gZnJvbSBhbiBhdHRyaWJ1dGUuCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQHNpbmNlIDMuMAotICoKLSAqKi8KLQotcHVibGljIGNsYXNzIENvbm5lY3RDaGlsZFJ1bGUgZXh0ZW5kcyBBYnN0cmFjdFNwZWNpZmljYXRpb25SdWxlCi17Ci0gICAgcHJpdmF0ZSBTdHJpbmcgX21ldGhvZE5hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgX2F0dHJpYnV0ZU5hbWU7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBfYXR0cmlidXRlVmFsdWU7Ci0KLSAgICBwdWJsaWMgQ29ubmVjdENoaWxkUnVsZShTdHJpbmcgbWV0aG9kTmFtZSwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUpCi0gICAgewotICAgICAgICBfbWV0aG9kTmFtZSA9IG1ldGhvZE5hbWU7Ci0gICAgICAgIF9hdHRyaWJ1dGVOYW1lID0gYXR0cmlidXRlTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBiZWdpbihTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBfYXR0cmlidXRlVmFsdWUgPSBnZXRWYWx1ZShhdHRyaWJ1dGVzLCBfYXR0cmlidXRlTmFtZSk7Ci0KLSAgICAgICAgLy8gQ2hlY2sgZm9yIG51bGw/Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFBlcmZvcm1zIHRoZSBhZGQuICBUaGlzIGlzIGRvbmUgaW4gPGNvZGU+ZW5kKCk8L2NvZGU+IHRvIGVuc3VyZQotICAgICAqICB0aGF0IHRoZSBjaGlsZCBvYmplY3QgKG9uIHRvcCBvZiB0aGUgc3RhY2spIGlzIGZ1bGx5IGluaXRpYWxpemVkLgotICAgICAqIAotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIGVuZChTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbmFtZSkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgT2JqZWN0IGNoaWxkID0gZGlnZXN0ZXIucGVlaygpOwotICAgICAgICBPYmplY3QgcGFyZW50ID0gZGlnZXN0ZXIucGVlaygxKTsKLQotICAgICAgICBNZXRob2RVdGlscy5pbnZva2VNZXRob2QocGFyZW50LCBfbWV0aG9kTmFtZSwgbmV3IE9iamVjdFtdIHsgX2F0dHJpYnV0ZVZhbHVlLCBjaGlsZCB9KTsKLQotICAgICAgICBfYXR0cmlidXRlVmFsdWUgPSBudWxsOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3BhcnNlL0Rpc2FsbG93RnJhbWV3b3JrTmFtZXNwYWNlUnVsZS5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3BhcnNlL0Rpc2FsbG93RnJhbWV3b3JrTmFtZXNwYWNlUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjMyZTVhLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9wYXJzZS9EaXNhbGxvd0ZyYW1ld29ya05hbWVzcGFjZVJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LnBhcnNlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuVGFwZXN0cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS51dGlsLnhtbC5Eb2N1bWVudFBhcnNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7Ci0KLS8qKgotICogIFNwZWNpYWwgcHVycG9zZSBydWxlIHRoYXQgc2ltcGxlIHZhbGlkYXRlcyB0aGF0IGEgbGlicmFyeSBkb2VzCi0gKiAgbm90IHVzZSB0aGUgcmVzZXJ2ZWQgZnJhbWV3b3JrIG5hbWVzcGFjZS4KLSAqCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogIEB2ZXJzaW9uICRJZCQKLSAqICBAc2luY2UgMy4wCi0gKgotICoqLwotCi1wdWJsaWMgY2xhc3MgRGlzYWxsb3dGcmFtZXdvcmtOYW1lc3BhY2VSdWxlIGV4dGVuZHMgQWJzdHJhY3RTcGVjaWZpY2F0aW9uUnVsZQotewotCi0gICAgcHVibGljIHZvaWQgYmVnaW4oU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIG5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgU3RyaW5nIGlkID0gZ2V0VmFsdWUoYXR0cmlidXRlcywgImlkIik7Ci0KLSAgICAgICAgaWYgKGlkLmVxdWFscyhJTmFtZXNwYWNlLkZSQU1FV09SS19OQU1FU1BBQ0UpKQotICAgICAgICAgICAgdGhyb3cgbmV3IERvY3VtZW50UGFyc2VFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgVGFwZXN0cnkuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAiU3BlY2lmaWNhdGlvblBhcnNlci5mcmFtZXdvcmstbGlicmFyeS1pZC1pcy1yZXNlcnZlZCIsCi0gICAgICAgICAgICAgICAgICAgIElOYW1lc3BhY2UuRlJBTUVXT1JLX05BTUVTUEFDRSksCi0gICAgICAgICAgICAgICAgZ2V0UmVzb3VyY2VMb2NhdGlvbigpKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9wYXJzZS9JRG9jdW1lbnRSdWxlLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvcGFyc2UvSURvY3VtZW50UnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiN2ViZDVmLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9wYXJzZS9JRG9jdW1lbnRSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5wYXJzZTsKLQotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7Ci0KLS8qKgotICogIEEge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkucGFyc2UuU3BlY2lmaWNhdGlvbkRpZ2VzdGVyfSBydWxlIHRoYXQgZXhlY3V0ZXMKLSAqICBhdCB0aGUgc3RhcnQgYW5kIGVuZCBvZiB0aGUgZG9jdW1lbnQuCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQHNpbmNlIDMuMAotICoKLSAqKi8KLQotcHVibGljIGludGVyZmFjZSBJRG9jdW1lbnRSdWxlCi17Ci0gICAgcHVibGljIHZvaWQgc2V0RGlnZXN0ZXIoU3BlY2lmaWNhdGlvbkRpZ2VzdGVyIGRpZ2VzdGVyKTsKLQotCS8qKgotCSAqICBJbnZva2VkIGF0IHRoZSB0aW1lIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBkb2N1bWVudCBpcyBwYXJzZWQuCi0JICogCi0JICogIEJ5IHRoaXMgdGltZSwgdGhlIHB1YmxpY0lkIHdpbGwgYmUga25vd24uCi0JICogCi0JICoqLwotCQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0RG9jdW1lbnQoU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIG5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgdGhyb3dzIEV4Y2VwdGlvbjsKLQotICAgIHB1YmxpYyB2b2lkIGVuZERvY3VtZW50KCkgdGhyb3dzIEV4Y2VwdGlvbjsKLQotICAgIHB1YmxpYyB2b2lkIGZpbmlzaCgpIHRocm93cyBFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvcGFyc2UvSVRlbXBsYXRlUGFyc2VyRGVsZWdhdGUuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9wYXJzZS9JVGVtcGxhdGVQYXJzZXJEZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWNmNTRjLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9wYXJzZS9JVGVtcGxhdGVQYXJzZXJEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkucGFyc2U7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklMb2NhdGlvbjsKLQotLyoqCi0gKiAgUHJvdmlkZXMgYSB7QGxpbmsgVGVtcGxhdGVQYXJzZXJ9IHdpdGggYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dAotICogIGR5bmFtaWMgY29tcG9uZW50cy4KLSAqCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogIEB2ZXJzaW9uICRJZCQKLSAqIAotICoqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElUZW1wbGF0ZVBhcnNlckRlbGVnYXRlCi17Ci0gICAgLyoqCi0gICAgICogIFJldHVybnMgdHJ1ZSBpZiB0aGUgY29tcG9uZW50IGlkIGlzIHZhbGlkLCBmYWxzZSBpZiB0aGUKLSAgICAgKiAgY29tcG9uZW50IGlkIGlzIG5vdCByZWNvZ25pemVkLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0S25vd25Db21wb25lbnQoU3RyaW5nIGNvbXBvbmVudElkKTsKLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCBjb21wb25lbnQgYWxsb3dzIGEgYm9keSwgZmFsc2UKLSAgICAgKiAgb3RoZXJ3aXNlLiAgVGhlIHBhcnNlciB1c2VzIHRoaXMgaW5mb3JtYXRpb24gdG8gZGV0ZXJtaW5lCi0gICAgICogIGlmIGl0IHNob3VsZCBpZ25vcmUgdGhlIGJvZHkgb2YgYSB0YWcuCi0gICAgICoKLSAgICAgKiAgQHRocm93cyBvcmcuYXBhY2hlLnRhcGVzdHJ5LkFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbiBpZiBubyBzdWNoIGNvbXBvbmVudCBleGlzdHMKLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRBbGxvd0JvZHkoU3RyaW5nIGNvbXBvbmVudElkLCBJTG9jYXRpb24gbG9jYXRpb24pOwotCi0gICAgLyoqCi0gICAgICogIFVzZWQgd2l0aCBpbXBsaWNpdCBjb21wb25lbnRzIHRvIGRldGVybWluZSBpZiB0aGUgY29tcG9uZW50Ci0gICAgICogIGFsbG93cyBhIGJvZHkgb3Igbm90LgotICAgICAqIAotICAgICAqICBAcGFyYW0gbGlicmFyeUlkIHRoZSBzcGVjaWZpZWQgbGlicmFyeSBpZCwgcG9zc2libHkgbnVsbAotICAgICAqICBAcGFyYW0gdHlwZSB0aGUgY29tcG9uZW50IHR5cGUKLSAgICAgKiAKLSAgICAgKiAgQHRocm93cyBvcmcuYXBhY2hlLnRhcGVzdHJ5LkFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbiBpZiB0aGUgc3BlY2lmaWNhdGlvbiBjYW5ub3QgYmUgZm91bmQKLSAgICAgKiAKLSAgICAgKiAgQHNpbmNlIDMuMAotICAgICAqIAotICAgICAqKi8KLQotICAgIHB1YmxpYyBib29sZWFuIGdldEFsbG93Qm9keShTdHJpbmcgbGlicmFyeUlkLCBTdHJpbmcgdHlwZSwgSUxvY2F0aW9uIGxvY2F0aW9uKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvcGFyc2UvSW5pdGlhbGl6ZVByb3BlcnR5UnVsZS5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3BhcnNlL0luaXRpYWxpemVQcm9wZXJ0eVJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM3NmM4Mi4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvcGFyc2UvSW5pdGlhbGl6ZVByb3BlcnR5UnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkucGFyc2U7Ci0KLWltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOwotCi0vKioKLSAqICBVc2VkIHRvIGluaXRpYWxpemUgYSBwcm9wZXJ0eSBvZiBhbiBvYmplY3Qgb24gdGhlIHRvcCBvZiB0aGUgZGlnZXN0ZXIgc3RhY2suCi0gKiAgVGhpcyBzaG91bGQgY29tZSBhZnRlciB0aGUge0BsaW5rIG9yZy5hcGFjaGUuY29tbW9ucy5kaWdlc3Rlci5PYmplY3RDcmVhdGVSdWxlfQotICogIChvciB2YXJpYXRpb24pIGFuZCBiZWZvcmUgYW5kIHByb3BlcnR5IHNldHRpbmcgZm9yIHRoZSBvYmplY3QuICBSZW1lbWJlcgotICogIHRoYXQgcnVsZXMgb3JkZXIgbWF0dGVycyB3aXRoIHRoZSBkaWdlc3Rlci4KLSAqCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogIEB2ZXJzaW9uICRJZCQKLSAqICBAc2luY2UgMy4wCi0gKgotICoqLwotCi1wdWJsaWMgY2xhc3MgSW5pdGlhbGl6ZVByb3BlcnR5UnVsZSBleHRlbmRzIEFic3RyYWN0U3BlY2lmaWNhdGlvblJ1bGUKLXsKLSAgICBwcml2YXRlIFN0cmluZyBfcHJvcGVydHlOYW1lOwotICAgIHByaXZhdGUgT2JqZWN0IF92YWx1ZTsKLQotICAgIHB1YmxpYyBJbml0aWFsaXplUHJvcGVydHlSdWxlKFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIF9wcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWU7Ci0gICAgICAgIF92YWx1ZSA9IHZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGJlZ2luKFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBuYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHNldFByb3BlcnR5KF9wcm9wZXJ0eU5hbWUsIF92YWx1ZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3BhcnNlL0xvY2FsaXphdGlvblRva2VuLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvcGFyc2UvTG9jYWxpemF0aW9uVG9rZW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEwMjZiOS4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvcGFyc2UvTG9jYWxpemF0aW9uVG9rZW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LnBhcnNlOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUxvY2F0aW9uOwotCi0vKioKLSAqICBSZXByZXNlbnRzIGxvY2FsaXplZCB0ZXh0IGZyb20gdGhlIHRlbXBsYXRlLgotICoKLSAqICBAc2VlIFRva2VuVHlwZSNMT0NBTElaQVRJT04KLSAqIAotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQHNpbmNlIDMuMAotICoKLSAqKi8KLQotcHVibGljIGNsYXNzIExvY2FsaXphdGlvblRva2VuIGV4dGVuZHMgVGVtcGxhdGVUb2tlbgotewotICAgIHByaXZhdGUgU3RyaW5nIF90YWc7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgX2tleTsKLSAgICBwcml2YXRlIGJvb2xlYW4gX3JhdzsKLSAgICBwcml2YXRlIE1hcCBfYXR0cmlidXRlczsKLSAgICAKLSAgICAvKioKLSAgICAgKiAgQ3JlYXRlcyBhIG5ldyB0b2tlbi4KLSAgICAgKiAKLSAgICAgKiAKLSAgICAgKiAgQHBhcmFtIHRhZyB0aGUgdGFnIG9mIHRoZSBlbGVtZW50IGZyb20gdGhlIHRlbXBsYXRlCi0gICAgICogIEBwYXJhbSBrZXkgdGhlIGxvY2FsaXphdGlvbiBrZXkgc3BlY2lmaWVkCi0gICAgICogIEBwYXJhbSByYXcgaWYgdHJ1ZSwgdGhlbiB0aGUgbG9jYWxpemVkIHZhbHVlIGNvbnRhaW5zIG1hcmt1cCB0aGF0IHNob3VsZCBub3QgYmUgZXNjYXBlZAotICAgICAqICBAcGFyYW0gYXR0cmlidXRlcyBhbnkgYWRkaXRpb25hbCBhdHRyaWJ1dGVzIChiZXlvbmQgdGhvc2UgdXNlZCB0byBkZWZpbmUga2V5IGFuZCByYXcpCi0gICAgICogIHRoYXQgd2VyZSBzcGVjaWZpZWQuICBUaGlzIHZhbHVlIGlzIHJldGFpbmVkLCBub3QgY29waWVkLgotICAgICAqICBAcGFyYW0gbG9jYXRpb24gbG9jYXRpb24gb2YgdGhlIHRhZyB3aGljaCBkZWZpbmVzIHRoaXMgdG9rZW4KLSAgICAgKiAKLSAgICAgKiovCi0gICAgCi0gICAgcHVibGljIExvY2FsaXphdGlvblRva2VuKFN0cmluZyB0YWcsIFN0cmluZyBrZXksIGJvb2xlYW4gcmF3LCBNYXAgYXR0cmlidXRlcywgSUxvY2F0aW9uIGxvY2F0aW9uKQotICAgIHsKLSAgICAgICAgc3VwZXIoVG9rZW5UeXBlLkxPQ0FMSVpBVElPTiwgbG9jYXRpb24pOwotICAgICAgICAKLSAgICAgICAgX3RhZyA9IHRhZzsKLSAgICAgICAgX2tleSA9IGtleTsKLSAgICAgICAgX3JhdyA9IHJhdzsKLSAgICAgICAgX2F0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyBhbnkgYXR0cmlidXRlcyBmb3IgdGhlIHRva2VuLCB3aGljaCBtYXkgYmUgbnVsbC4gIERvIG5vdCBtb2RpZnkKLSAgICAgKiAgdGhlIHJldHVybiB2YWx1ZS4KLSAgICAgKiAKLSAgICAgKiovCi0gICAgCi0gICAgcHVibGljIE1hcCBnZXRBdHRyaWJ1dGVzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfYXR0cmlidXRlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1JhdygpCi0gICAgewotICAgICAgICByZXR1cm4gX3JhdzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRhZygpCi0gICAgewotICAgICAgICByZXR1cm4gX3RhZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEtleSgpCi0gICAgewotICAgICAgICByZXR1cm4gX2tleTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvcGFyc2UvT3BlblRva2VuLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvcGFyc2UvT3BlblRva2VuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmZWM2ZmYuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3BhcnNlL09wZW5Ub2tlbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LnBhcnNlOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLmJ1aWxkZXIuVG9TdHJpbmdCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUxvY2F0aW9uOwotCi0vKioKLSAqICBUb2tlbiByZXByZXNlbnRpbmcgdGhlIG9wZW4gdGFnIGZvciBhIGNvbXBvbmVudC4gIENvbXBvbmVudHMgbWF5IGJlIGVpdGhlcgotICogIHNwZWNpZmllZCBvciBpbXBsaWNpdC4gIFNwZWNpZmllZCBjb21wb25lbnRzICh0aGUgdHJhZGl0aW9uYWwgdHlwZSwgZGF0aW5nCi0gKiAgYmFjayB0byB0aGUgb3JpZ2luIG9mIFRhcGVzdHJ5KSBhcmUgbWF0Y2hlZCBieSBhbiBlbnRyeSBpbiB0aGUKLSAqICBjb250YWluaW5nIGNvbXBvbmVudCdzIHNwZWNpZmljYXRpb24uICBJbXBsaWNpdCBjb21wb25lbnRzIHNwZWNpZnkgdGhlaXIKLSAqICB0eXBlIGluIHRoZSBjb21wb25lbnQgdGVtcGxhdGUgYW5kIG11c3Qgbm90IGhhdmUgYW4gZW50cnkgaW4KLSAqICB0aGUgY29udGFpbmluZyBjb21wb25lbnQncyBzcGVjaWZpY2F0aW9uLgotICoKLSAqICBAc2VlIFRva2VuVHlwZSNPUEVOCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogIEB2ZXJzaW9uICRJZCQKLSAqICBAc2luY2UgMy4wCi0gKgotICoqLwotCi1wdWJsaWMgY2xhc3MgT3BlblRva2VuIGV4dGVuZHMgVGVtcGxhdGVUb2tlbgotewotICAgIHByaXZhdGUgU3RyaW5nIF90YWc7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgX2lkOwotICAgIHByaXZhdGUgU3RyaW5nIF9jb21wb25lbnRUeXBlOwotICAgIHByaXZhdGUgTWFwIF9hdHRyaWJ1dGVzOwotCi0gICAgLyoqCi0gICAgICogIENyZWF0ZXMgYSBuZXcgdG9rZW4gd2l0aCB0aGUgZ2l2ZW4gdGFnLCBpZCBhbmQgdHlwZSAKLSAgICAgKiAKLSAgICAgKiAgQHBhcmFtIHRhZyB0aGUgdGVtcGxhdGUgdGFnIHdoaWNoIHJlcHJlc2VudHMgdGhlIGNvbXBvbmVudCwgdHlwaWNhbGx5ICJzcGFuIgotICAgICAqICBAcGFyYW0gaWQgdGhlIGlkIGZvciB0aGUgY29tcG9uZW50LCB3aGljaCBtYXkgYmUgYXNzaWduZWQgYnkgdGhlIHRlbXBsYXRlCi0gICAgICogIHBhcnNlciBmb3IgaW1wbGljaXQgY29tcG9uZW50cwotICAgICAqICBAcGFyYW0gIGNvbXBvbmVudFR5cGUgdGhlIHR5cGUgb2YgY29tcG9uZW50LCBpZiBhbiBpbXBsaWNpdCBjb21wb25lbnQsIG9yIG51bGwgZm9yCi0gICAgICogIGEgc3BlY2lmaWVkIGNvbXBvbmVudAotICAgICAqICBAcGFyYW0gbG9jYXRpb24gbG9jYXRpb24gb2YgdGFnIHJlcHJlc2VudGVkIGJ5IHRoaXMgdG9rZW4KLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgT3BlblRva2VuKFN0cmluZyB0YWcsIFN0cmluZyBpZCwgU3RyaW5nIGNvbXBvbmVudFR5cGUsIElMb2NhdGlvbiBsb2NhdGlvbikKLSAgICB7Ci0gICAgICAgIHN1cGVyKFRva2VuVHlwZS5PUEVOLCBsb2NhdGlvbik7Ci0KLSAgICAgICAgX3RhZyA9IHRhZzsKLSAgICAgICAgX2lkID0gaWQ7Ci0gICAgICAgIF9jb21wb25lbnRUeXBlID0gY29tcG9uZW50VHlwZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0aGUgaWQgZm9yIHRoZSBjb21wb25lbnQuCi0gICAgICogCi0gICAgICoqLwotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9pZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0aGUgdGFnIHVzZWQgdG8gcmVwcmVzZW50IHRoZSBjb21wb25lbnQgd2l0aGluIHRoZSB0ZW1wbGF0ZS4KLSAgICAgKiAKLSAgICAgKiovCi0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXRUYWcoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF90YWc7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqICBSZXR1cm5zIHRoZSBzcGVjaWZpZWQgY29tcG9uZW50IHR5cGUsIG9yIG51bGwgZm9yIGEgY29tcG9uZW50IHdoZXJlIHRoZSB0eXBlCi0gICAgICogIGlzIG5vdCBkZWZpbmVkIGluIHRoZSB0ZW1wbGF0ZS4gIFRoZSB0eXBlIG1heSBpbmNsdWRlIGEgbGlicmFyeSBpZCBwcmVmaXguCi0gICAgICogCi0gICAgICoqLwotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29tcG9uZW50VHlwZSgpCi0gICAgewotICAgICAgICByZXR1cm4gX2NvbXBvbmVudFR5cGU7Ci0gICAgfQotCi0JcHVibGljIHZvaWQgYWRkQXR0cmlidXRlKFN0cmluZyBuYW1lLCBBdHRyaWJ1dGVUeXBlIHR5cGUsIFN0cmluZyB2YWx1ZSkKLQl7Ci0JCVRlbXBsYXRlQXR0cmlidXRlIGF0dHJpYnV0ZSA9IG5ldyBUZW1wbGF0ZUF0dHJpYnV0ZSh0eXBlLCB2YWx1ZSk7Ci0JCQotCQlpZiAoX2F0dHJpYnV0ZXMgPT0gbnVsbCkKLQkJX2F0dHJpYnV0ZXMgPSBuZXcgSGFzaE1hcCgpOwotCQkKLQkJX2F0dHJpYnV0ZXMucHV0KG5hbWUsIGF0dHJpYnV0ZSk7Ci0JfQotCQotCS8qKgotCSAqICBSZXR1cm5zIGEgTWFwIG9mIGF0dHJpYnV0ZXMuICBLZXkgaXMgdGhlIGF0dHJpYnV0ZSBuYW1lLCB2YWx1ZQotCSAqICBpcyBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5wYXJzZS5UZW1wbGF0ZUF0dHJpYnV0ZX0uCi0JICogIFRoZSBjYWxsZXIgc2hvdWxkIG5vdCBtb2RpZnkgdGhlIE1hcC4gIFJldHVybnMgbnVsbCBpZgotCSAqICB0aGlzIE9wZW5Ub2tlbiBjb250YWlucyBubyBhdHRyaWJ1dGVzLgotCSAqIAotCSAqKi8KLQkKLQlwdWJsaWMgTWFwIGdldEF0dHJpYnV0ZXNNYXAoKQotCXsKLQkJcmV0dXJuIF9hdHRyaWJ1dGVzOwotCX0KLQotICAgIHByb3RlY3RlZCB2b2lkIGV4dGVuZERlc2NyaXB0aW9uKFRvU3RyaW5nQnVpbGRlciBidWlsZGVyKQotICAgIHsKLSAgICAgICAgYnVpbGRlci5hcHBlbmQoImlkIiwgX2lkKTsKLSAgICAgICAgYnVpbGRlci5hcHBlbmQoImNvbXBvbmVudFR5cGUiLCBfY29tcG9uZW50VHlwZSk7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJ0YWciLCBfdGFnKTsKLSAgICAgICAgYnVpbGRlci5hcHBlbmQoImF0dHJpYnV0ZXMiLCBfYXR0cmlidXRlcyk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvcGFyc2UvU2V0Qm9vbGVhblByb3BlcnR5UnVsZS5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3BhcnNlL1NldEJvb2xlYW5Qcm9wZXJ0eVJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTgwOGI5Yy4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvcGFyc2UvU2V0Qm9vbGVhblByb3BlcnR5UnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkucGFyc2U7Ci0KLWltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOwotCi0vKioKLSAqICBTZXRzIGEgYm9vbGVhbiBwcm9wZXJ0eSBmcm9tIGFuIGF0dHJpYnV0ZSBvZiB0aGUgY3VycmVudCBlbGVtZW50LgotICogIFRoZSB2YWx1ZSBtdXN0IGJlIGVpdGhlciAieWVzIiBvciAibm8iIChvciBub3QgcHJlc2VudCkuCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQHNpbmNlIDMuMAotICoKLSAqKi8KLXB1YmxpYyBjbGFzcyBTZXRCb29sZWFuUHJvcGVydHlSdWxlIGV4dGVuZHMgQWJzdHJhY3RTcGVjaWZpY2F0aW9uUnVsZQotewotICAgIHByaXZhdGUgU3RyaW5nIF9hdHRyaWJ1dGVOYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIF9wcm9wZXJ0eU5hbWU7Ci0KLSAgICBwdWJsaWMgU2V0Qm9vbGVhblByb3BlcnR5UnVsZShTdHJpbmcgYXR0cmlidXRlTmFtZSwgU3RyaW5nIHByb3BlcnR5TmFtZSkKLSAgICB7Ci0gICAgICAgIF9hdHRyaWJ1dGVOYW1lID0gYXR0cmlidXRlTmFtZTsKLSAgICAgICAgX3Byb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBiZWdpbihTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBTdHJpbmcgYXR0cmlidXRlVmFsdWUgPSBnZXRWYWx1ZShhdHRyaWJ1dGVzLCBfYXR0cmlidXRlTmFtZSk7Ci0KLSAgICAgICAgaWYgKGF0dHJpYnV0ZVZhbHVlID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgQm9vbGVhbiBwcm9wZXJ0eVZhbHVlID0gYXR0cmlidXRlVmFsdWUuZXF1YWxzKCJ5ZXMiKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0KLSAgICAgICAgc2V0UHJvcGVydHkoX3Byb3BlcnR5TmFtZSwgcHJvcGVydHlWYWx1ZSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvcGFyc2UvU2V0Q29udmVydGVkUHJvcGVydHlSdWxlLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvcGFyc2UvU2V0Q29udmVydGVkUHJvcGVydHlSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1MTY5NzEuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3BhcnNlL1NldENvbnZlcnRlZFByb3BlcnR5UnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkucGFyc2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKLQotLyoqCi0gKiAgUnVsZSB0aGF0IGFwcGxpZXMgYSBjb252ZXJzaW9uIG9mIGEgc3RyaW5nIHZhbHVlIGZyb20gYW4gYXR0cmlidXRlIGludG8KLSAqICBhbiBvYmplY3QgdmFsdWUgYmVmb3JlIGFzc2lnbmluZyBpdCB0byB0aGUgcHJvcGVydHkuICBUaGlzIGlzIHVzZWQKLSAqICB0byB0cmFuc2xhdGUgdmFsdWVzIGZyb20gc3RyaW5ncyB0bwotICogIHtAbGluayBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5lbnVtLkVudW19cy4KLSAqCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogIEB2ZXJzaW9uICRJZCQKLSAqICBAc2luY2UgMy4wCi0gKgotICoqLwotCi1wdWJsaWMgY2xhc3MgU2V0Q29udmVydGVkUHJvcGVydHlSdWxlIGV4dGVuZHMgQWJzdHJhY3RTcGVjaWZpY2F0aW9uUnVsZQotewotICAgIHByaXZhdGUgTWFwIF9tYXA7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgX2F0dHJpYnV0ZU5hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgX3Byb3BlcnR5TmFtZTsKLQotICAgIHB1YmxpYyBTZXRDb252ZXJ0ZWRQcm9wZXJ0eVJ1bGUoTWFwIG1hcCwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIFN0cmluZyBwcm9wZXJ0eU5hbWUpCi0gICAgewotICAgICAgICBfbWFwID0gbWFwOwotICAgICAgICBfYXR0cmlidXRlTmFtZSA9IGF0dHJpYnV0ZU5hbWU7Ci0gICAgICAgIF9wcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYmVnaW4oU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIG5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZVZhbHVlID0gZ2V0VmFsdWUoYXR0cmlidXRlcywgX2F0dHJpYnV0ZU5hbWUpOwotICAgICAgICBpZiAoYXR0cmlidXRlVmFsdWUgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBPYmplY3QgcHJvcGVydHlWYWx1ZSA9IF9tYXAuZ2V0KGF0dHJpYnV0ZVZhbHVlKTsKLQotICAgICAgICAvLyBDaGVjayBmb3IgbnVsbCBoZXJlPwotCi0gICAgICAgIHNldFByb3BlcnR5KF9wcm9wZXJ0eU5hbWUsIHByb3BlcnR5VmFsdWUpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3BhcnNlL1NldEV4dGVuZGVkUHJvcGVydHlSdWxlLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvcGFyc2UvU2V0RXh0ZW5kZWRQcm9wZXJ0eVJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg5NjRkOS4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvcGFyc2UvU2V0RXh0ZW5kZWRQcm9wZXJ0eVJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LnBhcnNlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5UYXBlc3RyeTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnV0aWwueG1sLkRvY3VtZW50UGFyc2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKLQotLyoqCi0gKiAgU2V0cyBhIHByb3BlcnR5IGZyb20gYW4gZXh0ZW5kZWQgYXR0cmlidXRlLiAgQW4gZXh0ZW5kZWQgYXR0cmlidXRlCi0gKiAgaXMgYSB2YWx1ZSB0aGF0IG1heSBlaXRoZXIgYmUgc3BlY2lmaWVkIGluc2lkZSBhbiBYTUwgYXR0cmlidXRlIG9yLAotICogIGlmIHRoZSBhdHRyaWJ1dGUgaXMgbm90IHByZXNlbnQsIGluIHRoZSBib2R5IG9mIHRoZSBlbGVtZW50LgotICogIEl0IGlzIG5vdCBhbGxvd2VkIHRoYXQgdGhlIHZhbHVlIGJlIHNwZWNpZmllZCBpbiBib3RoIHBsYWNlcy4KLSAqICBUaGUgdmFsdWUgbWF5IGJlIG9wdGlvbmFsIG9yIHJlcXVpcmVkLgotICoKLSAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiAgQHZlcnNpb24gJElkJAotICogIEBzaW5jZSAzLjAKLSAqCi0gKiovCi0KLXB1YmxpYyBjbGFzcyBTZXRFeHRlbmRlZFByb3BlcnR5UnVsZSBleHRlbmRzIEFic3RyYWN0U3BlY2lmaWNhdGlvblJ1bGUKLXsKLSAgICBwcml2YXRlIFN0cmluZyBfYXR0cmlidXRlTmFtZTsKLSAgICBwcml2YXRlIFN0cmluZyBfcHJvcGVydHlOYW1lOwotICAgIHByaXZhdGUgYm9vbGVhbiBfcmVxdWlyZWQ7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gX3ZhbHVlU2V0OwotCi0gICAgcHVibGljIFNldEV4dGVuZGVkUHJvcGVydHlSdWxlKFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBTdHJpbmcgcHJvcGVydHlOYW1lLCBib29sZWFuIHJlcXVpcmVkKQotICAgIHsKLSAgICAgICAgX2F0dHJpYnV0ZU5hbWUgPSBhdHRyaWJ1dGVOYW1lOwotICAgICAgICBfcHJvcGVydHlOYW1lID0gcHJvcGVydHlOYW1lOwotICAgICAgICBfcmVxdWlyZWQgPSByZXF1aXJlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBiZWdpbihTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBTdHJpbmcgdmFsdWUgPSBnZXRWYWx1ZShhdHRyaWJ1dGVzLCBfYXR0cmlidXRlTmFtZSk7Ci0KLSAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNldFByb3BlcnR5KF9wcm9wZXJ0eU5hbWUsIHZhbHVlKTsKLSAgICAgICAgICAgIF92YWx1ZVNldCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBib2R5KFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBuYW1lLCBTdHJpbmcgdGV4dCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaWYgKFRhcGVzdHJ5LmlzQmxhbmsodGV4dCkpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgaWYgKF92YWx1ZVNldCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IERvY3VtZW50UGFyc2VFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgVGFwZXN0cnkuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAiU3BlY2lmaWNhdGlvblBhcnNlci5uby1hdHRyaWJ1dGUtYW5kLWJvZHkiLAotICAgICAgICAgICAgICAgICAgICBfYXR0cmlidXRlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgbmFtZSksCi0gICAgICAgICAgICAgICAgZ2V0UmVzb3VyY2VMb2NhdGlvbigpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHNldFByb3BlcnR5KF9wcm9wZXJ0eU5hbWUsIHRleHQudHJpbSgpKTsKLSAgICAgICAgX3ZhbHVlU2V0ID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBlbmQoU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIG5hbWUpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmICghX3ZhbHVlU2V0ICYmIF9yZXF1aXJlZCkKLSAgICAgICAgICAgIHRocm93IG5ldyBEb2N1bWVudFBhcnNlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIFRhcGVzdHJ5LmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgIlNwZWNpZmljYXRpb25QYXJzZXIucmVxdWlyZWQtZXh0ZW5kZWQtYXR0cmlidXRlIiwKLSAgICAgICAgICAgICAgICAgICAgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgX2F0dHJpYnV0ZU5hbWUpLAotICAgICAgICAgICAgICAgIGdldFJlc291cmNlTG9jYXRpb24oKSk7Ci0KLSAgICAgICAgX3ZhbHVlU2V0ID0gZmFsc2U7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvcGFyc2UvU2V0TGltaXRlZFByb3BlcnRpZXNSdWxlLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvcGFyc2UvU2V0TGltaXRlZFByb3BlcnRpZXNSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkNWVmNDQuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3BhcnNlL1NldExpbWl0ZWRQcm9wZXJ0aWVzUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkucGFyc2U7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuYmVhbnV0aWxzLlByb3BlcnR5VXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5UYXBlc3RyeTsKLWltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOwotCi0vKioKLSAqICBNdWNoIGxpa2Uge0BsaW5rIG9yZy5hcGFjaGUuY29tbW9ucy5kaWdlc3Rlci5TZXRQcm9wZXJ0aWVzUnVsZX0sIGJ1dAotICogIG9ubHkgcHJvcGVydGllcyB0aGF0IGFyZSBkZWNsYXJlZCB3aWxsIGJlIGNvcGllZDsgb3RoZXIgcHJvcGVydGllcwotICogIHdpbGwgYmUgaWdub3JlZC4KLSAqCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogIEB2ZXJzaW9uICRJZCQKLSAqICBAc2luY2UgMy4wCi0gKgotICoqLwotcHVibGljIGNsYXNzIFNldExpbWl0ZWRQcm9wZXJ0aWVzUnVsZSBleHRlbmRzIEFic3RyYWN0U3BlY2lmaWNhdGlvblJ1bGUKLXsKLSAgICBwcml2YXRlIFN0cmluZ1tdIF9hdHRyaWJ1dGVOYW1lczsKLSAgICBwcml2YXRlIFN0cmluZ1tdIF9wcm9wZXJ0eU5hbWVzOwotCi0gICAgcHVibGljIFNldExpbWl0ZWRQcm9wZXJ0aWVzUnVsZShTdHJpbmcgYXR0cmlidXRlTmFtZSwgU3RyaW5nIHByb3BlcnR5TmFtZSkKLSAgICB7Ci0gICAgICAgIHRoaXMobmV3IFN0cmluZ1tdIHsgYXR0cmlidXRlTmFtZSB9LCBuZXcgU3RyaW5nW10geyBwcm9wZXJ0eU5hbWUgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIFNldExpbWl0ZWRQcm9wZXJ0aWVzUnVsZShTdHJpbmdbXSBhdHRyaWJ1dGVOYW1lcywgU3RyaW5nW10gcHJvcGVydHlOYW1lcykKLSAgICB7Ci0gICAgICAgIF9hdHRyaWJ1dGVOYW1lcyA9IGF0dHJpYnV0ZU5hbWVzOwotICAgICAgICBfcHJvcGVydHlOYW1lcyA9IHByb3BlcnR5TmFtZXM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYmVnaW4oU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIG5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgT2JqZWN0IHRvcCA9IGRpZ2VzdGVyLnBlZWsoKTsKLQotICAgICAgICBpbnQgY291bnQgPSBhdHRyaWJ1dGVzLmdldExlbmd0aCgpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZU5hbWUgPSBhdHRyaWJ1dGVzLmdldExvY2FsTmFtZShpKTsKLQotICAgICAgICAgICAgaWYgKFRhcGVzdHJ5LmlzQmxhbmsoYXR0cmlidXRlTmFtZSkpCi0gICAgICAgICAgICAgICAgYXR0cmlidXRlTmFtZSA9IGF0dHJpYnV0ZXMuZ2V0UU5hbWUoaSk7Ci0KLSAgICAgICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgX2F0dHJpYnV0ZU5hbWVzLmxlbmd0aDsgeCsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChfYXR0cmlidXRlTmFtZXNbeF0uZXF1YWxzKGF0dHJpYnV0ZU5hbWUpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gYXR0cmlidXRlcy5nZXRWYWx1ZShpKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByb3BlcnR5TmFtZSA9IF9wcm9wZXJ0eU5hbWVzW3hdOwotCi0gICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VXRpbHMuc2V0UHJvcGVydHkodG9wLCBwcm9wZXJ0eU5hbWUsIHZhbHVlKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBUZXJtaW5hdGUgaW5uZXIgbG9vcCB3aGVuIGF0dHJpYnV0ZSBuYW1lIGlzIGZvdW5kLgotCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3BhcnNlL1NldE1ldGFQcm9wZXJ0eVJ1bGUuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9wYXJzZS9TZXRNZXRhUHJvcGVydHlSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3ZjIxZTQuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3BhcnNlL1NldE1ldGFQcm9wZXJ0eVJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LnBhcnNlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5UYXBlc3RyeTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnV0aWwuSVByb3BlcnR5SG9sZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkudXRpbC54bWwuRG9jdW1lbnRQYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOwotCi0vKioKLSAqICBIYW5kbGVzIHRoZSAmbHQ7cHJvcGVydHkmZ3Q7IGVsZW1lbnQgaW4gVGFwZXN0cnkgc3BlY2lmaWNhdGlvbnMsIHdoaWNoIGlzIAotICogIGRlc2lnbmVkIHRvIGhvbGQgbWV0YS1kYXRhIGFib3V0IHNwZWNpZmljYXRpb25zLgotICogIEV4cGVjdHMgdGhlIHRvcCBvYmplY3Qgb24gdGhlIHN0YWNrIHRvIGJlIGEge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkudXRpbC5JUHJvcGVydHlIb2xkZXJ9LgotICoKLSAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiAgQHZlcnNpb24gJElkJAotICogIEBzaW5jZSAzLjAKLSAqCi0gKiovCi0KLXB1YmxpYyBjbGFzcyBTZXRNZXRhUHJvcGVydHlSdWxlIGV4dGVuZHMgQWJzdHJhY3RTcGVjaWZpY2F0aW9uUnVsZQotewotICAgIHByaXZhdGUgU3RyaW5nIF9uYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIF92YWx1ZTsKLQotICAgIHB1YmxpYyB2b2lkIGJlZ2luKFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBuYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIF9uYW1lID0gZ2V0VmFsdWUoYXR0cmlidXRlcywgIm5hbWUiKTsKLQotICAgICAgICAvLyBGaXJzdCwgZ2V0IHRoZSB2YWx1ZSBmcm9tIHRoZSBhdHRyaWJ1dGUsIGlmIHByZXNlbnQKLQotICAgICAgICBfdmFsdWUgPSBnZXRWYWx1ZShhdHRyaWJ1dGVzLCAidmFsdWUiKTsKLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGJvZHkoU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIG5hbWUsIFN0cmluZyB0ZXh0KSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiAoVGFwZXN0cnkuaXNCbGFuayh0ZXh0KSkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBpZiAoX3ZhbHVlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBEb2N1bWVudFBhcnNlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIFRhcGVzdHJ5LmZvcm1hdCgiU3BlY2lmaWNhdGlvblBhcnNlci5uby1hdHRyaWJ1dGUtYW5kLWJvZHkiLCAidmFsdWUiLCBuYW1lKSwKLSAgICAgICAgICAgICAgICBnZXRSZXNvdXJjZUxvY2F0aW9uKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgX3ZhbHVlID0gdGV4dC50cmltKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZW5kKFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBuYW1lKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiAoX3ZhbHVlID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgRG9jdW1lbnRQYXJzZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICBUYXBlc3RyeS5mb3JtYXQoIlNwZWNpZmljYXRpb25QYXJzZXIucmVxdWlyZWQtZXh0ZW5kZWQtYXR0cmlidXRlIiwgbmFtZSwgInZhbHVlIiksCi0gICAgICAgICAgICAgICAgZ2V0UmVzb3VyY2VMb2NhdGlvbigpKTsKLQotICAgICAgICBJUHJvcGVydHlIb2xkZXIgaG9sZGVyID0gKElQcm9wZXJ0eUhvbGRlcikgZGlnZXN0ZXIucGVlaygpOwotCi0gICAgICAgIGhvbGRlci5zZXRQcm9wZXJ0eShfbmFtZSwgX3ZhbHVlKTsKLQotICAgICAgICBfbmFtZSA9IG51bGw7Ci0gICAgICAgIF92YWx1ZSA9IG51bGw7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvcGFyc2UvU2V0UHVibGljSWRSdWxlLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvcGFyc2UvU2V0UHVibGljSWRSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlNjQ4OTMuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3BhcnNlL1NldFB1YmxpY0lkUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkucGFyc2U7Ci0KLWltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOwotCi0vKioKLSAqICBTZXRzIHRoZSBwdWJsaWNJZAotICogIHByb3BlcnR5IG9mIHRoZSBwYXJzZWQgc3BlY2lmaWNhdGlvbi4KLSAqCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogIEB2ZXJzaW9uICRJZCQKLSAqICBAc2luY2UgMy4wCi0gKgotICoqLwotCi1wdWJsaWMgY2xhc3MgU2V0UHVibGljSWRSdWxlIGV4dGVuZHMgQWJzdHJhY3RTcGVjaWZpY2F0aW9uUnVsZQotewotCi0gICAgcHVibGljIHZvaWQgYmVnaW4oU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIG5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgc2V0UHJvcGVydHkoInB1YmxpY0lkIiwgZGlnZXN0ZXIuZ2V0UHVibGljSWQoKSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvcGFyc2UvU3BlY2lmaWNhdGlvbkRpZ2VzdGVyLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvcGFyc2UvU3BlY2lmaWNhdGlvbkRpZ2VzdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4NDdkNmEuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3BhcnNlL1NwZWNpZmljYXRpb25EaWdlc3Rlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAwICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LnBhcnNlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmRpZ2VzdGVyLkRpZ2VzdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUxvY2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlc291cmNlTG9jYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5Mb2NhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LlRhcGVzdHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkudXRpbC5SZWdleHBNYXRjaGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLnhtbC5zYXguTG9jYXRvcjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb247Ci0KLS8qKgotICogIEV4dGVuc2lvbiBvZiB7QGxpbmsgb3JnLmFwYWNoZS5jb21tb25zLmRpZ2VzdGVyLkRpZ2VzdGVyfSB3aXRoIGFkZGl0aW9uYWwgcnVsZXMsIGhvb2tzCi0gKiAgYW5kIG1ldGhvZHMgbmVlZGVkIHdoZW4gcGFyc2luZyBUYXBlc3RyeSBzcGVjaWZpY2F0aW9ucy4KLSAqCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogIEB2ZXJzaW9uICRJZCQKLSAqICBAc2luY2UgMy4wCi0gKgotICoqLwotCi1wdWJsaWMgY2xhc3MgU3BlY2lmaWNhdGlvbkRpZ2VzdGVyIGV4dGVuZHMgRGlnZXN0ZXIKLXsKLSAgICBwcml2YXRlIExpc3QgX2RvY3VtZW50UnVsZXM7Ci0gICAgcHJpdmF0ZSBJUmVzb3VyY2VMb2NhdGlvbiBfcmVzb3VyY2VMb2NhdGlvbjsKLSAgICBwcml2YXRlIFJlZ2V4cE1hdGNoZXIgX21hdGNoZXI7Ci0KLSAgICBwcml2YXRlIElMb2NhdGlvbiBfbGFzdExvY2F0aW9uOwotICAgIHByaXZhdGUgaW50IF9sYXN0TGluZTsKLSAgICBwcml2YXRlIGludCBfbGFzdENvbHVtbjsKLQotICAgIC8qKgotICAgICAqICBOb3RpZmljYXRpb25zIGFyZSBzZW50IHdpdGggdGhlIHZlcnkgZmlyc3QgZWxlbWVudC4KLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwcml2YXRlIGJvb2xlYW4gX2ZpcnN0RWxlbWVudCA9IHRydWU7Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGREb2N1bWVudFJ1bGUoSURvY3VtZW50UnVsZSBydWxlKQotICAgIHsKLSAgICAgICAgaWYgKF9kb2N1bWVudFJ1bGVzID09IG51bGwpCi0gICAgICAgICAgICBfZG9jdW1lbnRSdWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgICBydWxlLnNldERpZ2VzdGVyKHRoaXMpOwotCi0gICAgICAgIF9kb2N1bWVudFJ1bGVzLmFkZChydWxlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRTZXRCb29sZWFuUHJvcGVydHkoU3RyaW5nIHBhdHRlcm4sIFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBTdHJpbmcgcHJvcGVydHlOYW1lKQotICAgIHsKLSAgICAgICAgYWRkUnVsZShwYXR0ZXJuLCBuZXcgU2V0Qm9vbGVhblByb3BlcnR5UnVsZShhdHRyaWJ1dGVOYW1lLCBwcm9wZXJ0eU5hbWUpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRTZXRFeHRlbmRlZFByb3BlcnR5KAotICAgICAgICBTdHJpbmcgcGF0dGVybiwKLSAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZU5hbWUsCi0gICAgICAgIFN0cmluZyBwcm9wZXJ0eU5hbWUsCi0gICAgICAgIGJvb2xlYW4gcmVxdWlyZWQpCi0gICAgewotICAgICAgICBhZGRSdWxlKHBhdHRlcm4sIG5ldyBTZXRFeHRlbmRlZFByb3BlcnR5UnVsZShhdHRyaWJ1dGVOYW1lLCBwcm9wZXJ0eU5hbWUsIHJlcXVpcmVkKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkVmFsaWRhdGUoCi0gICAgICAgIFN0cmluZyBwYXR0ZXJuLAotICAgICAgICBTdHJpbmcgYXR0cmlidXRlTmFtZSwKLSAgICAgICAgU3RyaW5nIHZhbHVlUGF0dGVybiwKLSAgICAgICAgU3RyaW5nIGVycm9yS2V5KQotICAgIHsKLSAgICAgICAgYWRkUnVsZShwYXR0ZXJuLCBuZXcgVmFsaWRhdGVSdWxlKGdldE1hdGNoZXIoKSwgYXR0cmlidXRlTmFtZSwgdmFsdWVQYXR0ZXJuLCBlcnJvcktleSkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFNldENvbnZlcnRlZFByb3BlcnR5KAotICAgICAgICBTdHJpbmcgcGF0dGVybiwKLSAgICAgICAgTWFwIG1hcCwKLSAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZU5hbWUsCi0gICAgICAgIFN0cmluZyBwcm9wZXJ0eU5hbWUpCi0gICAgewotICAgICAgICBhZGRSdWxlKHBhdHRlcm4sIG5ldyBTZXRDb252ZXJ0ZWRQcm9wZXJ0eVJ1bGUobWFwLCBhdHRyaWJ1dGVOYW1lLCBwcm9wZXJ0eU5hbWUpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRDb25uZWN0Q2hpbGQoU3RyaW5nIHBhdHRlcm4sIFN0cmluZyBtZXRob2ROYW1lLCBTdHJpbmcgYXR0cmlidXRlTmFtZSkKLSAgICB7Ci0gICAgICAgIGFkZFJ1bGUocGF0dGVybiwgbmV3IENvbm5lY3RDaGlsZFJ1bGUobWV0aG9kTmFtZSwgYXR0cmlidXRlTmFtZSkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZEluaXRpYWxpemVQcm9wZXJ0eShTdHJpbmcgcGF0dGVybiwgU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IHZhbHVlKQotICAgIHsKLSAgICAgICAgYWRkUnVsZShwYXR0ZXJuLCBuZXcgSW5pdGlhbGl6ZVByb3BlcnR5UnVsZShwcm9wZXJ0eU5hbWUsIHZhbHVlKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkU2V0TGltaXRlZFByb3BlcnRpZXMoU3RyaW5nIHBhdHRlcm4sIFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBTdHJpbmcgcHJvcGVydHlOYW1lKQotICAgIHsKLSAgICAgICAgYWRkUnVsZShwYXR0ZXJuLCBuZXcgU2V0TGltaXRlZFByb3BlcnRpZXNSdWxlKGF0dHJpYnV0ZU5hbWUsIHByb3BlcnR5TmFtZSkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFNldExpbWl0ZWRQcm9wZXJ0aWVzKAotICAgICAgICBTdHJpbmcgcGF0dGVybiwKLSAgICAgICAgU3RyaW5nW10gYXR0cmlidXRlTmFtZXMsCi0gICAgICAgIFN0cmluZ1tdIHByb3BlcnR5TmFtZXMpCi0gICAgewotICAgICAgICBhZGRSdWxlKHBhdHRlcm4sIG5ldyBTZXRMaW1pdGVkUHJvcGVydGllc1J1bGUoYXR0cmlidXRlTmFtZXMsIHByb3BlcnR5TmFtZXMpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRCb2R5KFN0cmluZyBwYXR0ZXJuLCBTdHJpbmcgcHJvcGVydHlOYW1lKQotICAgIHsKLSAgICAgICAgYWRkUnVsZShwYXR0ZXJuLCBuZXcgQm9keVJ1bGUocHJvcGVydHlOYW1lKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgdGhlIHtAbGluayBvcmcueG1sLnNheC5Mb2NhdG9yfSBmb3IgdGhlIERpZ2VzdGVyLiAgVGhpcyBvYmplY3QKLSAgICAgKiAgaXMgcHJvdmlkZWQgYnkgdGhlIHVuZGVybHlpbmcgU0FYIHBhcnNlciB0byBpZGVudGlmeSB3aGVyZSBpbiB0aGUKLSAgICAgKiAgZG9jdW1lbnQgdGhlIHBhcnNlIGlzIGN1cnJlbnRseSBsb2NhdGVkOyB0aGlzIGluZm9ybWF0aW9uIGNhbiBiZQotICAgICAqICB1c2VkIHRvIGJ1aWxkIGEge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkuSUxvY2F0aW9ufS4KLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgTG9jYXRvciBnZXRMb2NhdG9yKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBsb2NhdG9yOwotICAgIH0KLQotICAgIHB1YmxpYyBJTG9jYXRpb24gZ2V0TG9jYXRpb25UYWcoKQotICAgIHsKLSAgICAgICAgaW50IGxpbmUgPSAtMTsKLSAgICAgICAgaW50IGNvbHVtbiA9IC0xOwotCi0gICAgICAgIGlmIChsb2NhdG9yICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxpbmUgPSBsb2NhdG9yLmdldExpbmVOdW1iZXIoKTsKLSAgICAgICAgICAgIGNvbHVtbiA9IGxvY2F0b3IuZ2V0Q29sdW1uTnVtYmVyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoX2xhc3RMaW5lICE9IGxpbmUgfHwgX2xhc3RDb2x1bW4gIT0gY29sdW1uKQotICAgICAgICAgICAgX2xhc3RMb2NhdGlvbiA9IG51bGw7Ci0KLSAgICAgICAgaWYgKF9sYXN0TG9jYXRpb24gPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgX2xhc3RMaW5lID0gbGluZTsKLSAgICAgICAgICAgIF9sYXN0Q29sdW1uID0gY29sdW1uOwotICAgICAgICAgICAgX2xhc3RMb2NhdGlvbiA9IG5ldyBMb2NhdGlvbihfcmVzb3VyY2VMb2NhdGlvbiwgbGluZSwgY29sdW1uKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBfbGFzdExvY2F0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyBJUmVzb3VyY2VMb2NhdGlvbiBnZXRSZXNvdXJjZUxvY2F0aW9uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfcmVzb3VyY2VMb2NhdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZUxvY2F0aW9uKElSZXNvdXJjZUxvY2F0aW9uIHJlc291cmNlTG9jYXRpb24pCi0gICAgewotICAgICAgICBfcmVzb3VyY2VMb2NhdGlvbiA9IHJlc291cmNlTG9jYXRpb247Ci0KLSAgICAgICAgX2xhc3RMb2NhdGlvbiA9IG51bGw7Ci0gICAgICAgIF9sYXN0TGluZSA9IC0xOwotICAgICAgICBfbGFzdENvbHVtbiA9IC0xOwotICAgIH0KLQotICAgIHB1YmxpYyBSZWdleHBNYXRjaGVyIGdldE1hdGNoZXIoKQotICAgIHsKLSAgICAgICAgaWYgKF9tYXRjaGVyID09IG51bGwpCi0gICAgICAgICAgICBfbWF0Y2hlciA9IG5ldyBSZWdleHBNYXRjaGVyKCk7Ci0KLSAgICAgICAgcmV0dXJuIF9tYXRjaGVyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVuZERvY3VtZW50KCkgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaW50IGNvdW50ID0gVGFwZXN0cnkuc2l6ZShfZG9jdW1lbnRSdWxlcyk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBJRG9jdW1lbnRSdWxlIHJ1bGUgPSAoSURvY3VtZW50UnVsZSkgX2RvY3VtZW50UnVsZXMuZ2V0KGkpOwotCi0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgIHJ1bGUuZW5kRG9jdW1lbnQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgY3JlYXRlU0FYRXhjZXB0aW9uKGV4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHN1cGVyLmVuZERvY3VtZW50KCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBJRG9jdW1lbnRSdWxlIHJ1bGUgPSAoSURvY3VtZW50UnVsZSkgX2RvY3VtZW50UnVsZXMuZ2V0KGkpOwotCi0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBydWxlLmZpbmlzaCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBjcmVhdGVTQVhFeGNlcHRpb24oZXgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RhcnREb2N1bWVudCgpIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIF9maXJzdEVsZW1lbnQgPSB0cnVlOwotCi0gICAgICAgIHN1cGVyLnN0YXJ0RG9jdW1lbnQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoCi0gICAgICAgIFN0cmluZyBuYW1lc3BhY2VVUkksCi0gICAgICAgIFN0cmluZyBsb2NhbE5hbWUsCi0gICAgICAgIFN0cmluZyBxTmFtZSwKLSAgICAgICAgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKQotICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiAoX2ZpcnN0RWxlbWVudCkKLSAgICAgICAgewotICAgICAgICAgICAgc2VuZFN0YXJ0RG9jdW1lbnROb3RpZmljYXRpb24obmFtZXNwYWNlVVJJLCBsb2NhbE5hbWUsIHFOYW1lLCBhdHRyaWJ1dGVzKTsKLQotICAgICAgICAgICAgX2ZpcnN0RWxlbWVudCA9IGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgc3VwZXIuc3RhcnRFbGVtZW50KG5hbWVzcGFjZVVSSSwgbG9jYWxOYW1lLCBxTmFtZSwgYXR0cmlidXRlcyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNlbmRTdGFydERvY3VtZW50Tm90aWZpY2F0aW9uKAotICAgICAgICBTdHJpbmcgbmFtZXNwYWNlVVJJLAotICAgICAgICBTdHJpbmcgbG9jYWxOYW1lLAotICAgICAgICBTdHJpbmcgcU5hbWUsCi0gICAgICAgIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykKLSAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaW50IGNvdW50ID0gVGFwZXN0cnkuc2l6ZShfZG9jdW1lbnRSdWxlcyk7Ci0KLSAgICAgICAgU3RyaW5nIG5hbWUgPSBUYXBlc3RyeS5pc0JsYW5rKGxvY2FsTmFtZSkgPyBxTmFtZSA6IGxvY2FsTmFtZTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIElEb2N1bWVudFJ1bGUgcnVsZSA9IChJRG9jdW1lbnRSdWxlKSBfZG9jdW1lbnRSdWxlcy5nZXQoaSk7Ci0KLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJ1bGUuc3RhcnREb2N1bWVudChuYW1lc3BhY2VVUkksIG5hbWUsIGF0dHJpYnV0ZXMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBjcmVhdGVTQVhFeGNlcHRpb24oZXgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbnZva2VzIHtAbGluayAjZmF0YWxFcnJvcihTQVhQYXJzZUV4Y2VwdGlvbil9LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZmF0YWxFcnJvcihleGNlcHRpb24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNpbXBseSByZS10aHJvd3MgdGhlIGV4Y2VwdGlvbi4gIEFsbCBleGNlcHRpb25zIHdoZW4gcGFyc2luZwotICAgICAqIGRvY3VtZW50cyBhcmUgZmF0YWwuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZmF0YWxFcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHRocm93IGV4Y2VwdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbnZva2VzIHtAbGluayAjZmF0YWxFcnJvcihTQVhQYXJzZUV4Y2VwdGlvbil9LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHdhcm5pbmcoU0FYUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmYXRhbEVycm9yKGV4Y2VwdGlvbik7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvcGFyc2UvU3BlY2lmaWNhdGlvblBhcnNlci5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3BhcnNlL1NwZWNpZmljYXRpb25QYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFjOTMxOC4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvcGFyc2UvU3BlY2lmaWNhdGlvblBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI5NSArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5wYXJzZTsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmRpZ2VzdGVyLlJ1bGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JTG9jYXRpb25Ib2xkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVzb3VyY2VMb2NhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZXNvdXJjZVJlc29sdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuVGFwZXN0cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5zcGVjLkFzc2V0VHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnNwZWMuQmVhbkxpZmVjeWNsZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnNwZWMuQmluZGluZ1R5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5zcGVjLkRpcmVjdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnNwZWMuSUFwcGxpY2F0aW9uU3BlY2lmaWNhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnNwZWMuSUNvbXBvbmVudFNwZWNpZmljYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5zcGVjLklFeHRlbnNpb25TcGVjaWZpY2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuc3BlYy5JTGlicmFyeVNwZWNpZmljYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5zcGVjLlNwZWNGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkudXRpbC54bWwuRG9jdW1lbnRQYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uOwotCi0vKioKLSAqICBVc2VkIHRvIHBhcnNlIGFuIGFwcGxpY2F0aW9uIG9yIGNvbXBvbmVudCBzcGVjaWZpY2F0aW9uIGludG8gYQotICogIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LnNwZWMuQXBwbGljYXRpb25TcGVjaWZpY2F0aW9ufSBvciB7QGxpbmsgSUNvbXBvbmVudFNwZWNpZmljYXRpb259LgotICoKLSAqCi0gKiAgPHRhYmxlIGJvcmRlcj0xCi0gKgk8dHI+Ci0gKgkgIDx0aD5WZXJzaW9uPC90aD4gPHRoPlBVQkxJQyBJRDwvdGg+IDx0aD5TWVNURU0gSUQ8L3RoPiA8dGg+RGVzY3JpcHRpb248L3RoPgotICogIDwvdHI+Ci0gKgotICogCi0gKiAgPHRyIHZhbGlnbj0idG9wIj4KLSAqICA8dGQ+MS4zPC90ZD4KLSAqICA8dGQ+PGNvZGU+LS8vSG93YXJkIExld2lzIFNoaXAvL1RhcGVzdHJ5IFNwZWNpZmljYXRpb24gMS4zLy9FTjwvY29kZT48L3RkPgotICogPHRkPjxjb2RlPmh0dHA6Ly90YXBlc3RyeS5zZi5uZXQvZHRkL1RhcGVzdHJ5XzFfMy5kdGQ8L2NvZGU+PC90ZD4KLSAqICA8dGQ+Ci0gKiAgVmVyc2lvbiBvZiBzcGVjaWZpY2F0aW9uIGludHJvZHVjZWQgaW4gcmVsZWFzZSAyLjIuCi0gKiA8L3RkPgotICogPC90cj4KLSAqCi0gKiAgPHRyIHZhbGlnbj0idG9wIj4KLSAqICA8dGQ+My4wPC90ZD4KLSAqICA8dGQ+PGNvZGU+LS8vSG93YXJkIExld2lzIFNoaXAvL1RhcGVzdHJ5IFNwZWNpZmljYXRpb24gMy4wLy9FTjwvY29kZT48L3RkPgotICogPHRkPjxjb2RlPmh0dHA6Ly90YXBlc3RyeS5zZi5uZXQvZHRkL1RhcGVzdHJ5XzNfMC5kdGQ8L2NvZGU+PC90ZD4KLSAqICA8dGQ+Ci0gKiAgVmVyc2lvbiBvZiBzcGVjaWZpY2F0aW9uIGludHJvZHVjZWQgaW4gcmVsZWFzZSAzLjAuCi0gKiAgPGJyLz4KLSAqICBOb3RlOiBGdXR1cmUgRFREIHZlcnNpb25zIHdpbGwgdHJhY2sgVGFwZXN0cnkgcmVsZWFzZSBudW1iZXJzLgotICogPC90ZD4KLSAqIDwvdHI+Ci0gKiAKLSAqIAotICogIDwvdGFibGU+Ci0gKgotICogIEB2ZXJzaW9uICRJZCQKLSAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiAKLSAqKi8KLQotcHVibGljIGNsYXNzIFNwZWNpZmljYXRpb25QYXJzZXIKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgTE9HID0gTG9nRmFjdG9yeS5nZXRMb2coU3BlY2lmaWNhdGlvblBhcnNlci5jbGFzcyk7Ci0KLSAgICAvKiogQHNpbmNlIDIuMiAqKi8KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBUEVTVFJZX0RURF8xXzNfUFVCTElDX0lEID0KLSAgICAgICAgIi0vL0hvd2FyZCBMZXdpcyBTaGlwLy9UYXBlc3RyeSBTcGVjaWZpY2F0aW9uIDEuMy8vRU4iOwotCi0gICAgLyoqIEBzaW5jZSAzLjAgKiovCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVBFU1RSWV9EVERfM18wX1BVQkxJQ19JRCA9Ci0gICAgICAgICItLy9BcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi8vVGFwZXN0cnkgU3BlY2lmaWNhdGlvbiAzLjAvL0VOIjsKLQotICAgIC8qKgotICAgICAqICBMaWtlIG1vZGlmaWVkIHByb3BlcnR5IG5hbWUsIGJ1dCBhbGxvd3MgcGVyaW9kcyBpbiB0aGUgbmFtZSBhcwotICAgICAqICB3ZWxsLgotICAgICAqIAotICAgICAqICBAc2luY2UgMi4yCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5ERURfUFJPUEVSVFlfTkFNRV9QQVRURVJOID0gIl5fP1thLXpBLVpdKFxcd3wtfFxcLikqJCI7Ci0KLSAgICAvKioKLSAgICAgKiAgUGVybDUgcGF0dGVybiB0aGF0IHBhcmFtZXRlciBuYW1lcyBtdXN0IGNvbmZvcm0gdG8uICAKLSAgICAgKiAgTGV0dGVyLCBmb2xsb3dlZCBieSBsZXR0ZXIsIG51bWJlciBvciB1bmRlcnNjb3JlLgotICAgICAqIAotICAgICAqICBAc2luY2UgMi4yCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1FVEVSX05BTUVfUEFUVEVSTiA9IFRhcGVzdHJ5LlNJTVBMRV9QUk9QRVJUWV9OQU1FX1BBVFRFUk47Ci0KLSAgICAvKioKLSAgICAgKiAgUGVybDUgcGF0dGVybiB0aGF0IHByb3BlcnR5IG5hbWVzICh0aGF0IGNhbiBiZSBjb25uZWN0ZWQgdG8KLSAgICAgKiAgcGFyYW1ldGVycykgbXVzdCBjb25mb3JtIHRvLiAgCi0gICAgICogIExldHRlciwgZm9sbG93ZWQgYnkgbGV0dGVyLCBudW1iZXIgb3IgdW5kZXJzY29yZS4KLSAgICAgKiAgCi0gICAgICogCi0gICAgICogIEBzaW5jZSAyLjIKLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9OQU1FX1BBVFRFUk4gPSBUYXBlc3RyeS5TSU1QTEVfUFJPUEVSVFlfTkFNRV9QQVRURVJOOwotCi0gICAgLyoqCi0gICAgICogIFBlcmw1IHBhdHRlcm4gZm9yIHBhZ2UgbmFtZXMuICBMZXR0ZXIKLSAgICAgKiAgZm9sbG93ZWQgYnkgbGV0dGVyLCBudW1iZXIsIGRhc2gsIHVuZGVyc2NvcmUgb3IgcGVyaW9kLgotICAgICAqIAotICAgICAqICBAc2luY2UgMi4yCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9OQU1FX1BBVFRFUk4gPSBFWFRFTkRFRF9QUk9QRVJUWV9OQU1FX1BBVFRFUk47Ci0KLSAgICAvKioKLSAgICAgKiAgUGVybDUgcGF0dGVybiBmb3IgY29tcG9uZW50IGFsaWFzLiAKLSAgICAgKiAgTGV0dGVyLCBmb2xsb3dlZCBieSBsZXR0ZXIsIG51bWJlciwgb3IgdW5kZXJzY29yZS4KLSAgICAgKiAgVGhpcyBpcyB1c2VkIHRvIHZhbGlkYXRlIGNvbXBvbmVudCB0eXBlcyByZWdpc3RlcmVkCi0gICAgICogIGluIHRoZSBhcHBsaWNhdGlvbiBvciBsaWJyYXJ5IHNwZWNpZmljYXRpb25zLgotICAgICAqIAotICAgICAqICBAc2luY2UgMi4yCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUE9ORU5UX0FMSUFTX1BBVFRFUk4gPSBUYXBlc3RyeS5TSU1QTEVfUFJPUEVSVFlfTkFNRV9QQVRURVJOOwotCi0gICAgLyoqCi0gICAgICogIFBlcmw1IHBhdHRlcm4gZm9yIGhlbHBlciBiZWFuIG5hbWVzLiAgCi0gICAgICogIExldHRlciwgZm9sbG93ZWQgYnkgbGV0dGVyLCBudW1iZXIgb3IgdW5kZXJzY29yZS4KLSAgICAgKiAKLSAgICAgKiAgQHNpbmNlIDIuMgotICAgICAqIAotICAgICAqKi8KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJFQU5fTkFNRV9QQVRURVJOID0gVGFwZXN0cnkuU0lNUExFX1BST1BFUlRZX05BTUVfUEFUVEVSTjsKLQotICAgIC8qKgotICAgICAqICBQZXJsNSBwYXR0ZXJuIGZvciBjb21wb25lbnQgaWRzLiAgTGV0dGVyLCBmb2xsb3dlZCBieQotICAgICAqICBsZXR0ZXIsIG51bWJlciBvciB1bmRlcnNjb3JlLgotICAgICAqIAotICAgICAqICBAc2luY2UgMi4yCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUE9ORU5UX0lEX1BBVFRFUk4gPSBUYXBlc3RyeS5TSU1QTEVfUFJPUEVSVFlfTkFNRV9QQVRURVJOOwotCi0gICAgLyoqCi0gICAgICogIFBlcmw1IHBhdHRlcm4gZm9yIGFzc2V0IG5hbWVzLiAgTGV0dGVyLCBmb2xsb3dlZCBieQotICAgICAqICBsZXR0ZXIsIG51bWJlciBvciB1bmRlcnNjb3JlLiAgQWxzbyBhbGxvd3MKLSAgICAgKiAgdGhlIHNwZWNpYWwgIiR0ZW1wbGF0ZSIgdmFsdWUuCi0gICAgICogCi0gICAgICogIEBzaW5jZSAyLjIKLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBU1NFVF9OQU1FX1BBVFRFUk4gPQotICAgICAgICAiKFxcJHRlbXBsYXRlKXwoIiArIFRhcGVzdHJ5LlNJTVBMRV9QUk9QRVJUWV9OQU1FX1BBVFRFUk4gKyAiKSI7Ci0KLSAgICAvKioKLSAgICAgKiAgUGVybDUgcGF0dGVybiBmb3Igc2VydmljZSBuYW1lcy4gIExldHRlcgotICAgICAqICBmb2xsb3dlZCBieSBsZXR0ZXIsIG51bWJlciwgZGFzaCwgdW5kZXJzY29yZSBvciBwZXJpb2QuCi0gICAgICogCi0gICAgICogIEBzaW5jZSAyLjIKLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWSUNFX05BTUVfUEFUVEVSTiA9IEVYVEVOREVEX1BST1BFUlRZX05BTUVfUEFUVEVSTjsKLQotICAgIC8qKgotICAgICAqICBQZXJsNSBwYXR0ZXJuIGZvciBsaWJyYXJ5IGlkcy4gIExldHRlciBmb2xsb3dlZAotICAgICAqICBieSBsZXR0ZXIsIG51bWJlciBvciB1bmRlcnNjb3JlLgotICAgICAqIAotICAgICAqICBAc2luY2UgMi4yCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElCUkFSWV9JRF9QQVRURVJOID0gVGFwZXN0cnkuU0lNUExFX1BST1BFUlRZX05BTUVfUEFUVEVSTjsKLQotICAgIC8qKgotICAgICAqICBQZXI1IHBhdHRlcm4gZm9yIGV4dGVuc2lvbiBuYW1lcy4gIExldHRlciBmb2xsb3dlZAotICAgICAqICBieSBsZXR0ZXIsIG51bWJlciwgZGFzaCwgcGVyaW9kIG9yIHVuZGVyc2NvcmUuIAotICAgICAqIAotICAgICAqICBAc2luY2UgMi4yCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX05BTUVfUEFUVEVSTiA9IEVYVEVOREVEX1BST1BFUlRZX05BTUVfUEFUVEVSTjsKLQotICAgIC8qKgotICAgICAqICBQZXJsNSBwYXR0ZXJuIGZvciBjb21wb25lbnQgdHlwZXMuICBDb21wb25lbnQgdHlwZXMgYXJlIGFuIG9wdGlvbmFsCi0gICAgICogIG5hbWVzcGFjZSBwcmVmaXggZm9sbG93ZWQgYnkgYSBub3JtYWwgaWRlbnRpZmllci4KLSAgICAgKiAKLSAgICAgKiAgQHNpbmNlIDIuMgotICAgICAqKi8KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBPTkVOVF9UWVBFX1BBVFRFUk4gPSAiXihfP1thLXpBLVpdXFx3KjopP1thLXpBLVpfXShcXHcpKiQiOwotCi0gICAgLyoqCi0gICAgICogIFdlIGNhbiBzaGFyZSBhIHNpbmdsZSBtYXAgZm9yIGFsbCB0aGUgWE1MIGF0dHJpYnV0ZSB0byBvYmplY3QgY29udmVyc2lvbnMsCi0gICAgICogIHNpbmNlIHRoZSBrZXlzIGFyZSB1bmlxdWUuCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIENPTlZFUlNJT05fTUFQID0gbmV3IEhhc2hNYXAoKTsKLQotICAgIC8qKiBAc2luY2UgMS4wLjkgKiovCi0KLSAgICBwcml2YXRlIFNwZWNGYWN0b3J5IF9mYWN0b3J5OwotCi0gICAgLyoqIAotICAgICAqICAgRGlnZXN0ZXIgdXNlZCBmb3IgY29tcG9uZW50IHNwZWNpZmljYXRpb25zLgotICAgICAqIAotICAgICAqICBAc2luY2UgMy4wIAotICAgICAqIAotICAgICAqKi8KLQotICAgIHByaXZhdGUgU3BlY2lmaWNhdGlvbkRpZ2VzdGVyIF9jb21wb25lbnREaWdlc3RlcjsKLQotICAgIC8qKgotICAgICAqICBEaWdlc3RnZXIgdXNlZCBmb3IgcGFnZSBzcGVjaWZpY2F0aW9ucy4KLSAgICAgKiAKLSAgICAgKiAgQHNpbmNlIDMuMAotICAgICAqIAotICAgICAqKi8KLQotICAgIHByaXZhdGUgU3BlY2lmaWNhdGlvbkRpZ2VzdGVyIF9wYWdlRGlnZXN0ZXI7Ci0KLSAgICAvKioKLSAgICAgKiAgRGlnZXN0ZXIgdXNlIGZvciBsaWJyYXJ5IHNwZWNpZmljYXRpb25zLgotICAgICAqIAotICAgICAqICBAc2luY2UgMy4wCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHJpdmF0ZSBTcGVjaWZpY2F0aW9uRGlnZXN0ZXIgX2xpYnJhcnlEaWdlc3RlcjsKLQotICAgIC8qKgotICAgICAqICBAc2luY2UgMy4wIAotICAgICAqIAotICAgICAqKi8KLQotICAgIHByaXZhdGUgSVJlc291cmNlUmVzb2x2ZXIgX3Jlc29sdmVyOwotCi0gICAgcHJpdmF0ZSBpbnRlcmZhY2UgSUNvbnZlcnRlcgotICAgIHsKLSAgICAgICAgcHVibGljIE9iamVjdCBjb252ZXJ0KFN0cmluZyB2YWx1ZSkgdGhyb3dzIERvY3VtZW50UGFyc2VFeGNlcHRpb247Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQm9vbGVhbkNvbnZlcnRlciBpbXBsZW1lbnRzIElDb252ZXJ0ZXIKLSAgICAKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBPYmplY3QgY29udmVydChTdHJpbmcgdmFsdWUpIHRocm93cyBEb2N1bWVudFBhcnNlRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIE9iamVjdCByZXN1bHQgPSBDT05WRVJTSU9OX01BUC5nZXQodmFsdWUudG9Mb3dlckNhc2UoKSk7Ci0KLSAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCB8fCAhKHJlc3VsdCBpbnN0YW5jZW9mIEJvb2xlYW4pKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBEb2N1bWVudFBhcnNlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICBUYXBlc3RyeS5mb3JtYXQoIlNwZWNpZmljYXRpb25QYXJzZXIuZmFpbC1jb252ZXJ0LWJvb2xlYW4iLCB2YWx1ZSkpOwotCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSW50Q29udmVydGVyIGltcGxlbWVudHMgSUNvbnZlcnRlcgotICAgIHsKLSAgICAgICAgcHVibGljIE9iamVjdCBjb252ZXJ0KFN0cmluZyB2YWx1ZSkgdGhyb3dzIERvY3VtZW50UGFyc2VFeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBJbnRlZ2VyKHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZXgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IERvY3VtZW50UGFyc2VFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIFRhcGVzdHJ5LmZvcm1hdCgiU3BlY2lmaWNhdGlvblBhcnNlci5mYWlsLWNvbnZlcnQtaW50IiwgdmFsdWUpLAotICAgICAgICAgICAgICAgICAgICBleCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBMb25nQ29udmVydGVyIGltcGxlbWVudHMgSUNvbnZlcnRlcgotICAgIHsKLSAgICAgICAgcHVibGljIE9iamVjdCBjb252ZXJ0KFN0cmluZyB2YWx1ZSkgdGhyb3dzIERvY3VtZW50UGFyc2VFeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBMb25nKHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZXgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IERvY3VtZW50UGFyc2VFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIFRhcGVzdHJ5LmZvcm1hdCgiU3BlY2lmaWNhdGlvblBhcnNlci5mYWlsLWNvbnZlcnQtbG9uZyIsIHZhbHVlKSwKLSAgICAgICAgICAgICAgICAgICAgZXgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRG91YmxlQ29udmVydGVyIGltcGxlbWVudHMgSUNvbnZlcnRlcgotICAgIHsKLSAgICAgICAgcHVibGljIE9iamVjdCBjb252ZXJ0KFN0cmluZyB2YWx1ZSkgdGhyb3dzIERvY3VtZW50UGFyc2VFeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEb3VibGUodmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBleCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRG9jdW1lbnRQYXJzZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgVGFwZXN0cnkuZm9ybWF0KCJTcGVjaWZpY2F0aW9uUGFyc2VyLmZhaWwtY29udmVydC1kb3VibGUiLCB2YWx1ZSksCi0gICAgICAgICAgICAgICAgICAgIGV4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFN0cmluZ0NvbnZlcnRlciBpbXBsZW1lbnRzIElDb252ZXJ0ZXIKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBPYmplY3QgY29udmVydChTdHJpbmcgdmFsdWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB2YWx1ZS50cmltKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiogCi0gICAgICogIEJhc2UgY2xhc3MgZm9yIGNyZWF0aW5nIGxvY2F0YWJsZSBvYmplY3RzIHVzaW5nIHRoZSAKLSAgICAgKiAge0BsaW5rIFNwZWNGYWN0b3J5fS4KLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwcml2YXRlIGFic3RyYWN0IHN0YXRpYyBjbGFzcyBTcGVjRmFjdG9yeUNyZWF0ZVJ1bGUgZXh0ZW5kcyBBYnN0cmFjdFNwZWNpZmljYXRpb25SdWxlCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgICogIEltcGxlbWVudCBpbiBzdWJjbGFzcyB0byBjcmVhdGUgY29ycmVjdCBsb2NhdGFibGUgb2JqZWN0LgotICAgICAgICAgKiAKLSAgICAgICAgICoqLwotCi0gICAgICAgIHB1YmxpYyBhYnN0cmFjdCBJTG9jYXRpb25Ib2xkZXIgY3JlYXRlKCk7Ci0KLSAgICAgICAgcHVibGljIHZvaWQgYmVnaW4oU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIG5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgdGhyb3dzIEV4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICBJTG9jYXRpb25Ib2xkZXIgaG9sZGVyID0gY3JlYXRlKCk7Ci0KLSAgICAgICAgICAgIGhvbGRlci5zZXRMb2NhdGlvbihnZXRMb2NhdGlvbigpKTsKLQotICAgICAgICAgICAgZGlnZXN0ZXIucHVzaChob2xkZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgZW5kKFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBuYW1lKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRpZ2VzdGVyLnBvcCgpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIENyZWF0ZUV4cHJlc3Npb25CZWFuSW5pdGlhbGl6ZXJSdWxlIGV4dGVuZHMgU3BlY0ZhY3RvcnlDcmVhdGVSdWxlCi0gICAgewotICAgICAgICBwdWJsaWMgSUxvY2F0aW9uSG9sZGVyIGNyZWF0ZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBfZmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uQmVhbkluaXRpYWxpemVyKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIENyZWF0ZVN0cmluZ0JlYW5Jbml0aWFsaXplclJ1bGUgZXh0ZW5kcyBTcGVjRmFjdG9yeUNyZWF0ZVJ1bGUKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBJTG9jYXRpb25Ib2xkZXIgY3JlYXRlKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIF9mYWN0b3J5LmNyZWF0ZU1lc3NhZ2VCZWFuSW5pdGlhbGl6ZXIoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgQ3JlYXRlQ29udGFpbmVkQ29tcG9uZW50UnVsZSBleHRlbmRzIFNwZWNGYWN0b3J5Q3JlYXRlUnVsZQotICAgIHsKLSAgICAgICAgcHVibGljIElMb2NhdGlvbkhvbGRlciBjcmVhdGUoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gX2ZhY3RvcnkuY3JlYXRlQ29udGFpbmVkQ29tcG9uZW50KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIENyZWF0ZVBhcmFtZXRlclNwZWNpZmljYXRpb25SdWxlIGV4dGVuZHMgU3BlY0ZhY3RvcnlDcmVhdGVSdWxlCi0gICAgewotICAgICAgICBwdWJsaWMgSUxvY2F0aW9uSG9sZGVyIGNyZWF0ZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBfZmFjdG9yeS5jcmVhdGVQYXJhbWV0ZXJTcGVjaWZpY2F0aW9uKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIENyZWF0ZUNvbXBvbmVudFNwZWNpZmljYXRpb25SdWxlIGV4dGVuZHMgU3BlY0ZhY3RvcnlDcmVhdGVSdWxlCi0gICAgewotICAgICAgICBwdWJsaWMgSUxvY2F0aW9uSG9sZGVyIGNyZWF0ZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBfZmFjdG9yeS5jcmVhdGVDb21wb25lbnRTcGVjaWZpY2F0aW9uKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIENyZWF0ZUJpbmRpbmdTcGVjaWZpY2F0aW9uUnVsZSBleHRlbmRzIFNwZWNGYWN0b3J5Q3JlYXRlUnVsZQotICAgIHsKLSAgICAgICAgcHVibGljIElMb2NhdGlvbkhvbGRlciBjcmVhdGUoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gX2ZhY3RvcnkuY3JlYXRlQmluZGluZ1NwZWNpZmljYXRpb24oKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgQ3JlYXRlQmVhblNwZWNpZmljYXRpb25SdWxlIGV4dGVuZHMgU3BlY0ZhY3RvcnlDcmVhdGVSdWxlCi0gICAgewotICAgICAgICBwdWJsaWMgSUxvY2F0aW9uSG9sZGVyIGNyZWF0ZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBfZmFjdG9yeS5jcmVhdGVCZWFuU3BlY2lmaWNhdGlvbigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBDcmVhdGVMaXN0ZW5lckJpbmRpbmdTcGVjaWZpY2F0aW9uUnVsZSBleHRlbmRzIFNwZWNGYWN0b3J5Q3JlYXRlUnVsZQotICAgIHsKLSAgICAgICAgcHVibGljIElMb2NhdGlvbkhvbGRlciBjcmVhdGUoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gX2ZhY3RvcnkuY3JlYXRlTGlzdGVuZXJCaW5kaW5nU3BlY2lmaWNhdGlvbigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBDcmVhdGVBc3NldFNwZWNpZmljYXRpb25SdWxlIGV4dGVuZHMgU3BlY0ZhY3RvcnlDcmVhdGVSdWxlCi0gICAgewotICAgICAgICBwdWJsaWMgSUxvY2F0aW9uSG9sZGVyIGNyZWF0ZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBfZmFjdG9yeS5jcmVhdGVBc3NldFNwZWNpZmljYXRpb24oKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgQ3JlYXRlUHJvcGVydHlTcGVjaWZpY2F0aW9uUnVsZSBleHRlbmRzIFNwZWNGYWN0b3J5Q3JlYXRlUnVsZQotICAgIHsKLSAgICAgICAgcHVibGljIElMb2NhdGlvbkhvbGRlciBjcmVhdGUoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gX2ZhY3RvcnkuY3JlYXRlUHJvcGVydHlTcGVjaWZpY2F0aW9uKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIENyZWF0ZUFwcGxpY2F0aW9uU3BlY2lmaWNhdGlvblJ1bGUgZXh0ZW5kcyBTcGVjRmFjdG9yeUNyZWF0ZVJ1bGUKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBJTG9jYXRpb25Ib2xkZXIgY3JlYXRlKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIF9mYWN0b3J5LmNyZWF0ZUFwcGxpY2F0aW9uU3BlY2lmaWNhdGlvbigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBDcmVhdGVMaWJyYXJ5U3BlY2lmaWNhdGlvblJ1bGUgZXh0ZW5kcyBTcGVjRmFjdG9yeUNyZWF0ZVJ1bGUKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBJTG9jYXRpb25Ib2xkZXIgY3JlYXRlKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIF9mYWN0b3J5LmNyZWF0ZUxpYnJhcnlTcGVjaWZpY2F0aW9uKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIENyZWF0ZUV4dGVuc2lvblNwZWNpZmljYXRpb25SdWxlIGV4dGVuZHMgU3BlY0ZhY3RvcnlDcmVhdGVSdWxlCi0gICAgewotICAgICAgICBwdWJsaWMgSUxvY2F0aW9uSG9sZGVyIGNyZWF0ZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBfZmFjdG9yeS5jcmVhdGVFeHRlbnNpb25TcGVjaWZpY2F0aW9uKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBQcm9jZXNzRXh0ZW5zaW9uQ29uZmlndXJhdGlvblJ1bGUgZXh0ZW5kcyBBYnN0cmFjdFNwZWNpZmljYXRpb25SdWxlCi0gICAgewotICAgICAgICBwcml2YXRlIFN0cmluZyBfdmFsdWU7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIF9wcm9wZXJ0eU5hbWU7Ci0gICAgICAgIHByaXZhdGUgSUNvbnZlcnRlciBfY29udmVydGVyOwotCi0gICAgICAgIHB1YmxpYyB2b2lkIGJlZ2luKFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBuYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHRocm93cyBFeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgX3Byb3BlcnR5TmFtZSA9IGdldFZhbHVlKGF0dHJpYnV0ZXMsICJwcm9wZXJ0eS1uYW1lIik7Ci0gICAgICAgICAgICBfdmFsdWUgPSBnZXRWYWx1ZShhdHRyaWJ1dGVzLCAidmFsdWUiKTsKLQotICAgICAgICAgICAgU3RyaW5nIHR5cGUgPSBnZXRWYWx1ZShhdHRyaWJ1dGVzLCAidHlwZSIpOwotCi0gICAgICAgICAgICBfY29udmVydGVyID0gKElDb252ZXJ0ZXIpIENPTlZFUlNJT05fTUFQLmdldCh0eXBlKTsKLQotICAgICAgICAgICAgaWYgKF9jb252ZXJ0ZXIgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRG9jdW1lbnRQYXJzZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgVGFwZXN0cnkuZm9ybWF0KCJTcGVjaWZpY2F0aW9uUGFyc2VyLnVua25vd24tc3RhdGljLXZhbHVlLXR5cGUiLCB0eXBlKSwKLSAgICAgICAgICAgICAgICAgICAgZ2V0UmVzb3VyY2VMb2NhdGlvbigpKTsKLQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgYm9keShTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHRleHQpIHRocm93cyBFeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgaWYgKFRhcGVzdHJ5LmlzQmxhbmsodGV4dCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgICAgICBpZiAoX3ZhbHVlICE9IG51bGwpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IERvY3VtZW50UGFyc2VFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIFRhcGVzdHJ5LmZvcm1hdCgiU3BlY2lmaWNhdGlvblBhcnNlci5uby1hdHRyaWJ1dGUtYW5kLWJvZHkiLCAidmFsdWUiLCBuYW1lKSwKLSAgICAgICAgICAgICAgICAgICAgZ2V0UmVzb3VyY2VMb2NhdGlvbigpKTsKLQotICAgICAgICAgICAgX3ZhbHVlID0gdGV4dC50cmltKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBlbmQoU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIG5hbWUpIHRocm93cyBFeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF92YWx1ZSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBEb2N1bWVudFBhcnNlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICBUYXBlc3RyeS5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAiU3BlY2lmaWNhdGlvblBhcnNlci5yZXF1aXJlZC1leHRlbmRlZC1hdHRyaWJ1dGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSIpLAotICAgICAgICAgICAgICAgICAgICBnZXRSZXNvdXJjZUxvY2F0aW9uKCkpOwotCi0gICAgICAgICAgICBPYmplY3Qgb2JqZWN0VmFsdWUgPSBfY29udmVydGVyLmNvbnZlcnQoX3ZhbHVlKTsKLQotICAgICAgICAgICAgSUV4dGVuc2lvblNwZWNpZmljYXRpb24gdG9wID0gKElFeHRlbnNpb25TcGVjaWZpY2F0aW9uKSBkaWdlc3Rlci5wZWVrKCk7Ci0KLSAgICAgICAgICAgIHRvcC5hZGRDb25maWd1cmF0aW9uKF9wcm9wZXJ0eU5hbWUsIG9iamVjdFZhbHVlKTsKLQotICAgICAgICAgICAgX2NvbnZlcnRlciA9IG51bGw7Ci0gICAgICAgICAgICBfdmFsdWUgPSBudWxsOwotICAgICAgICAgICAgX3Byb3BlcnR5TmFtZSA9IG51bGw7Ci0KLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgLy8gSWRlbnRpZnkgYWxsIHRoZSBkaWZmZXJlbnQgYWNjZXB0aWJsZSB2YWx1ZXMuCi0gICAgLy8gV2UgY29udGludWUgdG8gc25lYWsgYnkgd2l0aCBhIHNpbmdsZSBtYXAgYmVjYXVzZQotICAgIC8vIHRoZXJlIGFyZW4ndCBjb25mbGljdHM7ICB3aGVuIHdlIGhhdmUgJ2ZvbycgbWVhbmluZwotICAgIC8vIGRpZmZlcmVudCB0aGluZ3MgaW4gZGlmZmVyZW50IHBsYWNlcyBpbiB0aGUgRFRELCB3ZSdsbAotICAgIC8vIG5lZWQgbXVsdGlwbGUgbWFwcy4KLQotICAgIHN0YXRpYyB7Ci0KLSAgICAgICAgQ09OVkVSU0lPTl9NQVAucHV0KCJ0cnVlIiwgQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgQ09OVkVSU0lPTl9NQVAucHV0KCJ0IiwgQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgQ09OVkVSU0lPTl9NQVAucHV0KCIxIiwgQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgQ09OVkVSU0lPTl9NQVAucHV0KCJ5IiwgQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgQ09OVkVSU0lPTl9NQVAucHV0KCJ5ZXMiLCBCb29sZWFuLlRSVUUpOwotICAgICAgICBDT05WRVJTSU9OX01BUC5wdXQoIm9uIiwgQm9vbGVhbi5UUlVFKTsKLQotICAgICAgICBDT05WRVJTSU9OX01BUC5wdXQoImZhbHNlIiwgQm9vbGVhbi5GQUxTRSk7Ci0gICAgICAgIENPTlZFUlNJT05fTUFQLnB1dCgiZiIsIEJvb2xlYW4uRkFMU0UpOwotICAgICAgICBDT05WRVJTSU9OX01BUC5wdXQoIjAiLCBCb29sZWFuLkZBTFNFKTsKLSAgICAgICAgQ09OVkVSU0lPTl9NQVAucHV0KCJvZmYiLCBCb29sZWFuLkZBTFNFKTsKLSAgICAgICAgQ09OVkVSU0lPTl9NQVAucHV0KCJubyIsIEJvb2xlYW4uRkFMU0UpOwotICAgICAgICBDT05WRVJTSU9OX01BUC5wdXQoIm4iLCBCb29sZWFuLkZBTFNFKTsKLQotICAgICAgICBDT05WRVJTSU9OX01BUC5wdXQoIm5vbmUiLCBCZWFuTGlmZWN5Y2xlLk5PTkUpOwotICAgICAgICBDT05WRVJTSU9OX01BUC5wdXQoInJlcXVlc3QiLCBCZWFuTGlmZWN5Y2xlLlJFUVVFU1QpOwotICAgICAgICBDT05WRVJTSU9OX01BUC5wdXQoInBhZ2UiLCBCZWFuTGlmZWN5Y2xlLlBBR0UpOwotICAgICAgICBDT05WRVJTSU9OX01BUC5wdXQoInJlbmRlciIsIEJlYW5MaWZlY3ljbGUuUkVOREVSKTsKLQotICAgICAgICBDT05WRVJTSU9OX01BUC5wdXQoImJvb2xlYW4iLCBuZXcgQm9vbGVhbkNvbnZlcnRlcigpKTsKLSAgICAgICAgQ09OVkVSU0lPTl9NQVAucHV0KCJpbnQiLCBuZXcgSW50Q29udmVydGVyKCkpOwotICAgICAgICBDT05WRVJTSU9OX01BUC5wdXQoImRvdWJsZSIsIG5ldyBEb3VibGVDb252ZXJ0ZXIoKSk7Ci0gICAgICAgIENPTlZFUlNJT05fTUFQLnB1dCgiU3RyaW5nIiwgbmV3IFN0cmluZ0NvbnZlcnRlcigpKTsKLSAgICAgICAgQ09OVkVSU0lPTl9NQVAucHV0KCJsb25nIiwgbmV3IExvbmdDb252ZXJ0ZXIoKSk7Ci0KLSAgICAgICAgQ09OVkVSU0lPTl9NQVAucHV0KCJpbiIsIERpcmVjdGlvbi5JTik7Ci0gICAgICAgIENPTlZFUlNJT05fTUFQLnB1dCgiZm9ybSIsIERpcmVjdGlvbi5GT1JNKTsKLSAgICAgICAgQ09OVkVSU0lPTl9NQVAucHV0KCJjdXN0b20iLCBEaXJlY3Rpb24uQ1VTVE9NKTsKLSAgICAgICAgQ09OVkVSU0lPTl9NQVAucHV0KCJhdXRvIiwgRGlyZWN0aW9uLkFVVE8pOwotICAgIH0KLQotICAgIHB1YmxpYyBTcGVjaWZpY2F0aW9uUGFyc2VyKElSZXNvdXJjZVJlc29sdmVyIHJlc29sdmVyKQotICAgIHsKLSAgICAgICAgX3Jlc29sdmVyID0gcmVzb2x2ZXI7Ci0gICAgICAgIHNldEZhY3RvcnkobmV3IFNwZWNGYWN0b3J5KCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBQYXJzZXMgYW4gaW5wdXQgc3RyZWFtIGNvbnRhaW5pbmcgYSBwYWdlIG9yIGNvbXBvbmVudCBzcGVjaWZpY2F0aW9uIGFuZCBhc3NlbWJsZXMKLSAgICAgKiAgYW4ge0BsaW5rIElDb21wb25lbnRTcGVjaWZpY2F0aW9ufSBmcm9tIGl0LiAgCi0gICAgICoKLSAgICAgKiAgQHRocm93cyBEb2N1bWVudFBhcnNlRXhjZXB0aW9uIGlmIHRoZSBpbnB1dCBzdHJlYW0gY2Fubm90IGJlIGZ1bGx5Ci0gICAgICogIHBhcnNlZCBvciBjb250YWlucyBpbnZhbGlkIGRhdGEuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgSUNvbXBvbmVudFNwZWNpZmljYXRpb24gcGFyc2VDb21wb25lbnRTcGVjaWZpY2F0aW9uKElSZXNvdXJjZUxvY2F0aW9uIHJlc291cmNlTG9jYXRpb24pCi0gICAgICAgIHRocm93cyBEb2N1bWVudFBhcnNlRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiAoX2NvbXBvbmVudERpZ2VzdGVyID09IG51bGwpCi0gICAgICAgICAgICBfY29tcG9uZW50RGlnZXN0ZXIgPSBjb25zdHJ1Y3RDb21wb25lbnREaWdlc3RlcigpOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBJQ29tcG9uZW50U3BlY2lmaWNhdGlvbiByZXN1bHQgPQotICAgICAgICAgICAgICAgIChJQ29tcG9uZW50U3BlY2lmaWNhdGlvbikgcGFyc2UoX2NvbXBvbmVudERpZ2VzdGVyLCByZXNvdXJjZUxvY2F0aW9uKTsKLQotICAgICAgICAgICAgcmVzdWx0LnNldFNwZWNpZmljYXRpb25Mb2NhdGlvbihyZXNvdXJjZUxvY2F0aW9uKTsKLQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRG9jdW1lbnRQYXJzZUV4Y2VwdGlvbiBleCkKLSAgICAgICAgewotICAgICAgICAgICAgX2NvbXBvbmVudERpZ2VzdGVyID0gbnVsbDsKLQotICAgICAgICAgICAgdGhyb3cgZXg7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgUGFyc2VzIGEgcmVzb3VyY2UgdXNpbmcgYSBwYXJ0aWN1bGFyIGRpZ2VzdGVyLgotICAgICAqIAotICAgICAqICBAc2luY2UgMy4wCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHJvdGVjdGVkIE9iamVjdCBwYXJzZShTcGVjaWZpY2F0aW9uRGlnZXN0ZXIgZGlnZXN0ZXIsIElSZXNvdXJjZUxvY2F0aW9uIGxvY2F0aW9uKQotICAgICAgICB0aHJvd3MgRG9jdW1lbnRQYXJzZUV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChMT0cuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICBMT0cuZGVidWcoIlBhcnNpbmcgIiArIGxvY2F0aW9uKTsKLQotICAgICAgICAgICAgVVJMIHVybCA9IGxvY2F0aW9uLmdldFJlc291cmNlVVJMKCk7Ci0KLSAgICAgICAgICAgIGlmICh1cmwgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRG9jdW1lbnRQYXJzZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgVGFwZXN0cnkuZm9ybWF0KCJBYnN0cmFjdERvY3VtZW50UGFyc2VyLm1pc3NpbmctcmVzb3VyY2UiLCBsb2NhdGlvbiksCi0gICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uKTsKLQotICAgICAgICAgICAgSW5wdXRTb3VyY2Ugc291cmNlID0gbmV3IElucHV0U291cmNlKHVybC50b0V4dGVybmFsRm9ybSgpKTsKLQotICAgICAgICAgICAgZGlnZXN0ZXIuc2V0UmVzb3VyY2VMb2NhdGlvbihsb2NhdGlvbik7Ci0KLSAgICAgICAgICAgIE9iamVjdCByZXN1bHQgPSBkaWdlc3Rlci5wYXJzZShzb3VyY2UpOwotCi0gICAgICAgICAgICBpZiAoTE9HLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgTE9HLmRlYnVnKCJSZXN1bHQ6ICIgKyByZXN1bHQpOwotCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChTQVhQYXJzZUV4Y2VwdGlvbiBleCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IERvY3VtZW50UGFyc2VFeGNlcHRpb24oZXgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChEb2N1bWVudFBhcnNlRXhjZXB0aW9uIGV4KQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBleDsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRG9jdW1lbnRQYXJzZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICBUYXBlc3RyeS5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICJTcGVjaWZpY2F0aW9uUGFyc2VyLmVycm9yLXJlYWRpbmctcmVzb3VyY2UiLAotICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgZXguZ2V0TWVzc2FnZSgpKSwKLSAgICAgICAgICAgICAgICBsb2NhdGlvbiwKLSAgICAgICAgICAgICAgICBleCk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBkaWdlc3Rlci5zZXRSZXNvdXJjZUxvY2F0aW9uKG51bGwpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFBhcnNlcyBhbiBpbnB1dCBzdHJlYW0gY29udGFpbmluZyBhIHBhZ2Ugc3BlY2lmaWNhdGlvbiBhbmQgYXNzZW1ibGVzCi0gICAgICogIGFuIHtAbGluayBJQ29tcG9uZW50U3BlY2lmaWNhdGlvbn0gZnJvbSBpdC4gIAotICAgICAqCi0gICAgICogIEB0aHJvd3MgRG9jdW1lbnRQYXJzZUV4Y2VwdGlvbiBpZiB0aGUgaW5wdXQgc3RyZWFtIGNhbm5vdCBiZSBmdWxseQotICAgICAqICBwYXJzZWQgb3IgY29udGFpbnMgaW52YWxpZCBkYXRhLgotICAgICAqIAotICAgICAqICBAc2luY2UgMi4yCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgSUNvbXBvbmVudFNwZWNpZmljYXRpb24gcGFyc2VQYWdlU3BlY2lmaWNhdGlvbihJUmVzb3VyY2VMb2NhdGlvbiByZXNvdXJjZUxvY2F0aW9uKQotICAgICAgICB0aHJvd3MgRG9jdW1lbnRQYXJzZUV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaWYgKF9wYWdlRGlnZXN0ZXIgPT0gbnVsbCkKLSAgICAgICAgICAgIF9wYWdlRGlnZXN0ZXIgPSBjb25zdHJ1Y3RQYWdlRGlnZXN0ZXIoKTsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgSUNvbXBvbmVudFNwZWNpZmljYXRpb24gcmVzdWx0ID0KLSAgICAgICAgICAgICAgICAoSUNvbXBvbmVudFNwZWNpZmljYXRpb24pIHBhcnNlKF9wYWdlRGlnZXN0ZXIsIHJlc291cmNlTG9jYXRpb24pOwotCi0gICAgICAgICAgICByZXN1bHQuc2V0U3BlY2lmaWNhdGlvbkxvY2F0aW9uKHJlc291cmNlTG9jYXRpb24pOwotCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChEb2N1bWVudFBhcnNlRXhjZXB0aW9uIGV4KQotICAgICAgICB7Ci0gICAgICAgICAgICBfcGFnZURpZ2VzdGVyID0gbnVsbDsKLQotICAgICAgICAgICAgdGhyb3cgZXg7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgUGFyc2VzIGFuIHJlc291cmNlIGNvbnRhaW5pbmcgYW4gYXBwbGljYXRpb24gc3BlY2lmaWNhdGlvbiBhbmQgYXNzZW1ibGVzCi0gICAgICogIGFuIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LnNwZWMuQXBwbGljYXRpb25TcGVjaWZpY2F0aW9ufSBmcm9tIGl0LgotICAgICAqCi0gICAgICogIEB0aHJvd3MgRG9jdW1lbnRQYXJzZUV4Y2VwdGlvbiBpZiB0aGUgaW5wdXQgc3RyZWFtIGNhbm5vdCBiZSBmdWxseQotICAgICAqICBwYXJzZWQgb3IgY29udGFpbnMgaW52YWxpZCBkYXRhLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIElBcHBsaWNhdGlvblNwZWNpZmljYXRpb24gcGFyc2VBcHBsaWNhdGlvblNwZWNpZmljYXRpb24oSVJlc291cmNlTG9jYXRpb24gcmVzb3VyY2VMb2NhdGlvbikKLSAgICAgICAgdGhyb3dzIERvY3VtZW50UGFyc2VFeGNlcHRpb24KLSAgICB7Ci0KLSAgICAgICAgLy8gVXNlIGEgb25lLXNob3QgZGlnZXN0ZXIsIGJlY2F1c2UgeW91IG9ubHkgcGFyc2UgdGhlIGFwcCBzcGVjCi0gICAgICAgIC8vIG9uY2UuCi0KLSAgICAgICAgSUFwcGxpY2F0aW9uU3BlY2lmaWNhdGlvbiByZXN1bHQgPQotICAgICAgICAgICAgKElBcHBsaWNhdGlvblNwZWNpZmljYXRpb24pIHBhcnNlKGNvbnN0cnVjdEFwcGxpY2F0aW9uRGlnZXN0ZXIoKSwgcmVzb3VyY2VMb2NhdGlvbik7Ci0KLSAgICAgICAgcmVzdWx0LnNldFJlc291cmNlUmVzb2x2ZXIoX3Jlc29sdmVyKTsKLSAgICAgICAgcmVzdWx0LnNldFNwZWNpZmljYXRpb25Mb2NhdGlvbihyZXNvdXJjZUxvY2F0aW9uKTsKLSAgICAgICAgcmVzdWx0Lmluc3RhbnRpYXRlSW1tZWRpYXRlRXh0ZW5zaW9ucygpOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFBhcnNlcyBhbiBpbnB1dCBzdHJlYW0gY29udGFpbmluZyBhIGxpYnJhcnkgc3BlY2lmaWNhdGlvbiBhbmQgYXNzZW1ibGVzCi0gICAgICogIGEge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkuc3BlYy5MaWJyYXJ5U3BlY2lmaWNhdGlvbn0gZnJvbSBpdC4KLSAgICAgKgotICAgICAqICBAdGhyb3dzIERvY3VtZW50UGFyc2VFeGNlcHRpb24gaWYgdGhlIGlucHV0IHN0cmVhbSBjYW5ub3QgYmUgZnVsbHkKLSAgICAgKiAgcGFyc2VkIG9yIGNvbnRhaW5zIGludmFsaWQgZGF0YS4KLSAgICAgKiAKLSAgICAgKiAgQHNpbmNlIDIuMgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIElMaWJyYXJ5U3BlY2lmaWNhdGlvbiBwYXJzZUxpYnJhcnlTcGVjaWZpY2F0aW9uKElSZXNvdXJjZUxvY2F0aW9uIHJlc291cmNlTG9jYXRpb24pCi0gICAgICAgIHRocm93cyBEb2N1bWVudFBhcnNlRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiAoX2xpYnJhcnlEaWdlc3RlciA9PSBudWxsKQotICAgICAgICAgICAgX2xpYnJhcnlEaWdlc3RlciA9IGNvbnN0cnVjdExpYnJhcnlEaWdlc3RlcigpOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBJTGlicmFyeVNwZWNpZmljYXRpb24gcmVzdWx0ID0KLSAgICAgICAgICAgICAgICAoSUxpYnJhcnlTcGVjaWZpY2F0aW9uKSBwYXJzZShfbGlicmFyeURpZ2VzdGVyLCByZXNvdXJjZUxvY2F0aW9uKTsKLQotICAgICAgICAgICAgcmVzdWx0LnNldFJlc291cmNlUmVzb2x2ZXIoX3Jlc29sdmVyKTsKLSAgICAgICAgICAgIHJlc3VsdC5zZXRTcGVjaWZpY2F0aW9uTG9jYXRpb24ocmVzb3VyY2VMb2NhdGlvbik7Ci0gICAgICAgICAgICByZXN1bHQuaW5zdGFudGlhdGVJbW1lZGlhdGVFeHRlbnNpb25zKCk7Ci0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKERvY3VtZW50UGFyc2VFeGNlcHRpb24gZXgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9saWJyYXJ5RGlnZXN0ZXIgPSBudWxsOwotCi0gICAgICAgICAgICB0aHJvdyBleDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqICBTZXRzIHRoZSBTcGVjRmFjdG9yeSB3aGljaCBpbnN0YW50aWF0ZXMgVGFwZXN0cnkgc3BlYyBvYmplY3RzLgotICAgICAqIAotICAgICAqICBAc2luY2UgMS4wLjkKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCBzZXRGYWN0b3J5KFNwZWNGYWN0b3J5IGZhY3RvcnkpCi0gICAgewotICAgICAgICBfZmFjdG9yeSA9IGZhY3Rvcnk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgdGhlIGN1cnJlbnQgU3BlY0ZhY3Rvcnkgd2hpY2ggaW5zdGFudGlhdGVzIFRhcGVzdHJ5IHNwZWMgb2JqZWN0cy4KLSAgICAgKiAKLSAgICAgKiAgQHNpbmNlIDEuMC45Ci0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIFNwZWNGYWN0b3J5IGdldEZhY3RvcnkoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9mYWN0b3J5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBDb25zdHJ1Y3RzIGEgZGlnZXN0ZXIsIHJlZ2lzdGVycmluZyB0aGUga25vd24gRFREcyBhbmQgdGhlCi0gICAgICogIGdsb2JhbCBydWxlcyAoZm9yICZsdDtwcm9wZXJ0eSZndDsgYW5kICZsdDtkZXNjcmlwdGlvbiZndDspLgotICAgICAqIAotICAgICAqICBAc2luY2UgMy4wCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHJvdGVjdGVkIFNwZWNpZmljYXRpb25EaWdlc3RlciBjb25zdHJ1Y3RCYXNlRGlnZXN0ZXIoU3RyaW5nIHJvb3RFbGVtZW50KQotICAgIHsKLSAgICAgICAgU3BlY2lmaWNhdGlvbkRpZ2VzdGVyIHJlc3VsdCA9IG5ldyBTcGVjaWZpY2F0aW9uRGlnZXN0ZXIoKTsKLQotICAgICAgICAvLyA8ZGVzY3JpcHRpb24+Ci0KLSAgICAgICAgcmVzdWx0LmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiKi9kZXNjcmlwdGlvbiIsICJkZXNjcmlwdGlvbiIpOwotCi0gICAgICAgIC8vIDxwcm9wZXJ0eT4gCi0KLSAgICAgICAgcmVzdWx0LmFkZFJ1bGUoIiovcHJvcGVydHkiLCBuZXcgU2V0TWV0YVByb3BlcnR5UnVsZSgpKTsKLQotICAgICAgICByZXN1bHQucmVnaXN0ZXIoVEFQRVNUUllfRFREXzFfM19QVUJMSUNfSUQsIGdldFVSTCgiVGFwZXN0cnlfMV8zLmR0ZCIpKTsKLSAgICAgICAgcmVzdWx0LnJlZ2lzdGVyKFRBUEVTVFJZX0RURF8zXzBfUFVCTElDX0lELCBnZXRVUkwoIlRhcGVzdHJ5XzNfMC5kdGQiKSk7Ci0KLSAgICAgICAgcmVzdWx0LmFkZERvY3VtZW50UnVsZSgKLSAgICAgICAgICAgIG5ldyBWYWxpZGF0ZVB1YmxpY0lkUnVsZSgKLSAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyBUQVBFU1RSWV9EVERfMV8zX1BVQkxJQ19JRCwgVEFQRVNUUllfRFREXzNfMF9QVUJMSUNfSUQgfSwKLSAgICAgICAgICAgICAgICByb290RWxlbWVudCkpOwotCi0gICAgICAgIHJlc3VsdC5zZXRWYWxpZGF0aW5nKHRydWUpOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgQ29uc3RydWN0cyBhIGRpZ2VzdGVyIGNvbmZpZ3VlZCB0byBwYXJzZSBhcHBsaWNhdGlvbiBzcGVjaWZpY2F0aW9ucy4KLSAgICAgKiAKLSAgICAgKiAgQHNpbmNlIDMuMAotICAgICAqIAotICAgICAqKi8KLQotICAgIHByb3RlY3RlZCBTcGVjaWZpY2F0aW9uRGlnZXN0ZXIgY29uc3RydWN0QXBwbGljYXRpb25EaWdlc3RlcigpCi0gICAgewotICAgICAgICBTcGVjaWZpY2F0aW9uRGlnZXN0ZXIgcmVzdWx0ID0gY29uc3RydWN0QmFzZURpZ2VzdGVyKCJhcHBsaWNhdGlvbiIpOwotCi0gICAgICAgIFN0cmluZyBwYXR0ZXJuID0gImFwcGxpY2F0aW9uIjsKLQotICAgICAgICByZXN1bHQuYWRkUnVsZShwYXR0ZXJuLCBuZXcgQ3JlYXRlQXBwbGljYXRpb25TcGVjaWZpY2F0aW9uUnVsZSgpKTsKLSAgICAgICAgcmVzdWx0LmFkZFNldExpbWl0ZWRQcm9wZXJ0aWVzKAotICAgICAgICAgICAgcGF0dGVybiwKLSAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7ICJuYW1lIiwgImVuZ2luZS1jbGFzcyIgfSwKLSAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7ICJuYW1lIiwgImVuZ2luZUNsYXNzTmFtZSIgfSk7Ci0gICAgICAgIHJlc3VsdC5hZGRSdWxlKHBhdHRlcm4sIG5ldyBTZXRQdWJsaWNJZFJ1bGUoKSk7Ci0KLSAgICAgICAgY29uZmlndXJlTGlicmFyeUNvbW1vbihyZXN1bHQsICJhcHBsaWNhdGlvbiIpOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIENvbnN0cnVjdHMgYSBkaWdlc3RlciBjb25maWd1cmVkIHRvIHBhcnNlIGxpYnJhcnkgc3BlY2lmaWNhdGlvbnMuCi0gICAgICogCi0gICAgICogIEBzaW5jZSAzLjAKLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwcm90ZWN0ZWQgU3BlY2lmaWNhdGlvbkRpZ2VzdGVyIGNvbnN0cnVjdExpYnJhcnlEaWdlc3RlcigpCi0gICAgewotICAgICAgICBTcGVjaWZpY2F0aW9uRGlnZXN0ZXIgcmVzdWx0ID0gY29uc3RydWN0QmFzZURpZ2VzdGVyKCJsaWJyYXJ5LXNwZWNpZmljYXRpb24iKTsKLQotICAgICAgICBTdHJpbmcgcGF0dGVybiA9ICJsaWJyYXJ5LXNwZWNpZmljYXRpb24iOwotCi0gICAgICAgIHJlc3VsdC5hZGRSdWxlKHBhdHRlcm4sIG5ldyBDcmVhdGVMaWJyYXJ5U3BlY2lmaWNhdGlvblJ1bGUoKSk7Ci0gICAgICAgIHJlc3VsdC5hZGRSdWxlKHBhdHRlcm4sIG5ldyBTZXRQdWJsaWNJZFJ1bGUoKSk7Ci0KLSAgICAgICAgLy8gSGFzIG5vIGF0dHJpYnV0ZXMKLQotICAgICAgICBjb25maWd1cmVMaWJyYXJ5Q29tbW9uKHJlc3VsdCwgImxpYnJhcnktc3BlY2lmaWNhdGlvbiIpOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIENvbmZpZ3VyZXMgYSBkaWdlc3RlciB0byBwYXJzZSB0aGUgY29tbW9uIGVsZW1lbnRzIG9mCi0gICAgICogIGEgJmx0O2FwcGxpY2F0aW9uJmd0OyBvciAmbHQ7bGlicmFyeS1zcGVjaWZpY2F0aW9uJmd0Oy4KLSAgICAgKiAKLSAgICAgKiAgQHNpbmNlIDMuMAotICAgICAqIAotICAgICAqKi8KLQotICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUxpYnJhcnlDb21tb24oU3BlY2lmaWNhdGlvbkRpZ2VzdGVyIGRpZ2VzdGVyLCBTdHJpbmcgcm9vdEVsZW1lbnROYW1lKQotICAgIHsKLSAgICAgICAgU3RyaW5nIHBhdHRlcm4gPSByb290RWxlbWVudE5hbWUgKyAiL3BhZ2UiOwotCi0gICAgICAgIC8vIDxwYWdlPgotCi0gICAgICAgIGRpZ2VzdGVyLmFkZFZhbGlkYXRlKAotICAgICAgICAgICAgcGF0dGVybiwKLSAgICAgICAgICAgICJuYW1lIiwKLSAgICAgICAgICAgIFBBR0VfTkFNRV9QQVRURVJOLAotICAgICAgICAgICAgIlNwZWNpZmljYXRpb25QYXJzZXIuaW52YWxpZC1wYWdlLW5hbWUiKTsKLSAgICAgICAgZGlnZXN0ZXIuYWRkQ2FsbE1ldGhvZChwYXR0ZXJuLCAic2V0UGFnZVNwZWNpZmljYXRpb25QYXRoIiwgMik7Ci0gICAgICAgIGRpZ2VzdGVyLmFkZENhbGxQYXJhbShwYXR0ZXJuLCAwLCAibmFtZSIpOwotICAgICAgICBkaWdlc3Rlci5hZGRDYWxsUGFyYW0ocGF0dGVybiwgMSwgInNwZWNpZmljYXRpb24tcGF0aCIpOwotCi0gICAgICAgIC8vIDxjb21wb25lbnQtdHlwZT4KLQotICAgICAgICBwYXR0ZXJuID0gcm9vdEVsZW1lbnROYW1lICsgIi9jb21wb25lbnQtdHlwZSI7Ci0gICAgICAgIGRpZ2VzdGVyLmFkZFZhbGlkYXRlKAotICAgICAgICAgICAgcGF0dGVybiwKLSAgICAgICAgICAgICJ0eXBlIiwKLSAgICAgICAgICAgIENPTVBPTkVOVF9BTElBU19QQVRURVJOLAotICAgICAgICAgICAgIlNwZWNpZmljYXRpb25QYXJzZXIuaW52YWxpZC1jb21wb25lbnQtdHlwZSIpOwotICAgICAgICBkaWdlc3Rlci5hZGRDYWxsTWV0aG9kKHBhdHRlcm4sICJzZXRDb21wb25lbnRTcGVjaWZpY2F0aW9uUGF0aCIsIDIpOwotICAgICAgICBkaWdlc3Rlci5hZGRDYWxsUGFyYW0ocGF0dGVybiwgMCwgInR5cGUiKTsKLSAgICAgICAgZGlnZXN0ZXIuYWRkQ2FsbFBhcmFtKHBhdHRlcm4sIDEsICJzcGVjaWZpY2F0aW9uLXBhdGgiKTsKLQotICAgICAgICAvLyA8Y29tcG9uZW50LWFsaWFzPgotICAgICAgICAvLyBGcm9tIDEuMyBEVEQsIHJlcGxhY2VkIHdpdGggPGNvbXBvbmVudC10eXBlPiBpbiAzLjAgRFRECi0KLSAgICAgICAgcGF0dGVybiA9IHJvb3RFbGVtZW50TmFtZSArICIvY29tcG9uZW50LWFsaWFzIjsKLSAgICAgICAgZGlnZXN0ZXIuYWRkVmFsaWRhdGUoCi0gICAgICAgICAgICBwYXR0ZXJuLAotICAgICAgICAgICAgInR5cGUiLAotICAgICAgICAgICAgQ09NUE9ORU5UX0FMSUFTX1BBVFRFUk4sCi0gICAgICAgICAgICAiU3BlY2lmaWNhdGlvblBhcnNlci5pbnZhbGlkLWNvbXBvbmVudC10eXBlIik7Ci0gICAgICAgIGRpZ2VzdGVyLmFkZENhbGxNZXRob2QocGF0dGVybiwgInNldENvbXBvbmVudFNwZWNpZmljYXRpb25QYXRoIiwgMik7Ci0gICAgICAgIGRpZ2VzdGVyLmFkZENhbGxQYXJhbShwYXR0ZXJuLCAwLCAidHlwZSIpOwotICAgICAgICBkaWdlc3Rlci5hZGRDYWxsUGFyYW0ocGF0dGVybiwgMSwgInNwZWNpZmljYXRpb24tcGF0aCIpOwotCi0gICAgICAgIC8vIDxzZXJ2aWNlPgotCi0gICAgICAgIHBhdHRlcm4gPSByb290RWxlbWVudE5hbWUgKyAiL3NlcnZpY2UiOwotCi0gICAgICAgIGRpZ2VzdGVyLmFkZFZhbGlkYXRlKAotICAgICAgICAgICAgcGF0dGVybiwKLSAgICAgICAgICAgICJuYW1lIiwKLSAgICAgICAgICAgIFNFUlZJQ0VfTkFNRV9QQVRURVJOLAotICAgICAgICAgICAgIlNwZWNpZmljYXRpb25QYXJzZXIuaW52YWxpZC1zZXJ2aWNlLW5hbWUiKTsKLSAgICAgICAgZGlnZXN0ZXIuYWRkQ2FsbE1ldGhvZChwYXR0ZXJuLCAic2V0U2VydmljZUNsYXNzTmFtZSIsIDIpOwotICAgICAgICBkaWdlc3Rlci5hZGRDYWxsUGFyYW0ocGF0dGVybiwgMCwgIm5hbWUiKTsKLSAgICAgICAgZGlnZXN0ZXIuYWRkQ2FsbFBhcmFtKHBhdHRlcm4sIDEsICJjbGFzcyIpOwotCi0gICAgICAgIC8vIDxsaWJyYXJ5PgotCi0gICAgICAgIHBhdHRlcm4gPSByb290RWxlbWVudE5hbWUgKyAiL2xpYnJhcnkiOwotCi0gICAgICAgIGRpZ2VzdGVyLmFkZFZhbGlkYXRlKAotICAgICAgICAgICAgcGF0dGVybiwKLSAgICAgICAgICAgICJpZCIsCi0gICAgICAgICAgICBMSUJSQVJZX0lEX1BBVFRFUk4sCi0gICAgICAgICAgICAiU3BlY2lmaWNhdGlvblBhcnNlci5pbnZhbGlkLWxpYnJhcnktaWQiKTsKLSAgICAgICAgZGlnZXN0ZXIuYWRkUnVsZShwYXR0ZXJuLCBuZXcgRGlzYWxsb3dGcmFtZXdvcmtOYW1lc3BhY2VSdWxlKCkpOwotICAgICAgICBkaWdlc3Rlci5hZGRDYWxsTWV0aG9kKHBhdHRlcm4sICJzZXRMaWJyYXJ5U3BlY2lmaWNhdGlvblBhdGgiLCAyKTsKLSAgICAgICAgZGlnZXN0ZXIuYWRkQ2FsbFBhcmFtKHBhdHRlcm4sIDAsICJpZCIpOwotICAgICAgICBkaWdlc3Rlci5hZGRDYWxsUGFyYW0ocGF0dGVybiwgMSwgInNwZWNpZmljYXRpb24tcGF0aCIpOwotCi0gICAgICAgIC8vIDxleHRlbnNpb24+Ci0KLSAgICAgICAgcGF0dGVybiA9IHJvb3RFbGVtZW50TmFtZSArICIvZXh0ZW5zaW9uIjsKLQotICAgICAgICBkaWdlc3Rlci5hZGRSdWxlKHBhdHRlcm4sIG5ldyBDcmVhdGVFeHRlbnNpb25TcGVjaWZpY2F0aW9uUnVsZSgpKTsKLSAgICAgICAgZGlnZXN0ZXIuYWRkVmFsaWRhdGUoCi0gICAgICAgICAgICBwYXR0ZXJuLAotICAgICAgICAgICAgIm5hbWUiLAotICAgICAgICAgICAgRVhURU5TSU9OX05BTUVfUEFUVEVSTiwKLSAgICAgICAgICAgICJTcGVjaWZpY2F0aW9uUGFyc2VyLmludmFsaWQtZXh0ZW5zaW9uLW5hbWUiKTsKLSAgICAgICAgZGlnZXN0ZXIuYWRkU2V0Qm9vbGVhblByb3BlcnR5KHBhdHRlcm4sICJpbW1lZGlhdGUiLCAiaW1tZWRpYXRlIik7Ci0gICAgICAgIGRpZ2VzdGVyLmFkZFNldExpbWl0ZWRQcm9wZXJ0aWVzKHBhdHRlcm4sICJjbGFzcyIsICJjbGFzc05hbWUiKTsKLSAgICAgICAgZGlnZXN0ZXIuYWRkQ29ubmVjdENoaWxkKHBhdHRlcm4sICJhZGRFeHRlbnNpb25TcGVjaWZpY2F0aW9uIiwgIm5hbWUiKTsKLQotICAgICAgICAvLyA8Y29uZmlndXJlPiB3aXRoaW4gPGV4dGVuc2lvbj4KLQotICAgICAgICBwYXR0ZXJuID0gcm9vdEVsZW1lbnROYW1lICsgIi9leHRlbnNpb24vY29uZmlndXJlIjsKLSAgICAgICAgZGlnZXN0ZXIuYWRkVmFsaWRhdGUoCi0gICAgICAgICAgICBwYXR0ZXJuLAotICAgICAgICAgICAgInByb3BlcnR5LW5hbWUiLAotICAgICAgICAgICAgUFJPUEVSVFlfTkFNRV9QQVRURVJOLAotICAgICAgICAgICAgIlNwZWNpZmljYXRpb25QYXJzZXIuaW52YWxpZC1wcm9wZXJ0eS1uYW1lIik7Ci0gICAgICAgIGRpZ2VzdGVyLmFkZFJ1bGUocGF0dGVybiwgbmV3IFByb2Nlc3NFeHRlbnNpb25Db25maWd1cmF0aW9uUnVsZSgpKTsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIGEgZGlnZXN0ZXIgY29uZmlndXJlZCB0byBwYXJzZSBwYWdlIHNwZWNpZmljYXRpb25zLgotICAgICAqIAotICAgICAqICBAc2luY2UgMy4wCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHJvdGVjdGVkIFNwZWNpZmljYXRpb25EaWdlc3RlciBjb25zdHJ1Y3RQYWdlRGlnZXN0ZXIoKQotICAgIHsKLSAgICAgICAgU3BlY2lmaWNhdGlvbkRpZ2VzdGVyIHJlc3VsdCA9IGNvbnN0cnVjdEJhc2VEaWdlc3RlcigicGFnZS1zcGVjaWZpY2F0aW9uIik7Ci0KLSAgICAgICAgLy8gPHBhZ2Utc3BlY2lmaWNhdGlvbj4KLQotICAgICAgICBTdHJpbmcgcGF0dGVybiA9ICJwYWdlLXNwZWNpZmljYXRpb24iOwotCi0gICAgICAgIHJlc3VsdC5hZGRSdWxlKHBhdHRlcm4sIG5ldyBDcmVhdGVDb21wb25lbnRTcGVjaWZpY2F0aW9uUnVsZSgpKTsKLSAgICAgICAgcmVzdWx0LmFkZFJ1bGUocGF0dGVybiwgbmV3IFNldFB1YmxpY0lkUnVsZSgpKTsKLSAgICAgICAgcmVzdWx0LmFkZEluaXRpYWxpemVQcm9wZXJ0eShwYXR0ZXJuLCAicGFnZVNwZWNpZmljYXRpb24iLCBCb29sZWFuLlRSVUUpOwotICAgICAgICByZXN1bHQuYWRkSW5pdGlhbGl6ZVByb3BlcnR5KHBhdHRlcm4sICJhbGxvd0JvZHkiLCBCb29sZWFuLlRSVUUpOwotICAgICAgICByZXN1bHQuYWRkSW5pdGlhbGl6ZVByb3BlcnR5KHBhdHRlcm4sICJhbGxvd0luZm9ybWFsUGFyYW1ldGVycyIsIEJvb2xlYW4uRkFMU0UpOwotICAgICAgICByZXN1bHQuYWRkU2V0TGltaXRlZFByb3BlcnRpZXMocGF0dGVybiwgImNsYXNzIiwgImNvbXBvbmVudENsYXNzTmFtZSIpOwotCi0gICAgICAgIGNvbmZpZ3VyZUNvbW1vbihyZXN1bHQsICJwYWdlLXNwZWNpZmljYXRpb24iKTsKLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIGEgZGlnZXN0ZXIgY29uZmlndXJlZCB0byBwYXJzZSBjb21wb25lbnQgc3BlY2lmaWNhdGlvbnMuCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHJvdGVjdGVkIFNwZWNpZmljYXRpb25EaWdlc3RlciBjb25zdHJ1Y3RDb21wb25lbnREaWdlc3RlcigpCi0gICAgewotICAgICAgICBTcGVjaWZpY2F0aW9uRGlnZXN0ZXIgcmVzdWx0ID0gY29uc3RydWN0QmFzZURpZ2VzdGVyKCJjb21wb25lbnQtc3BlY2lmaWNhdGlvbiIpOwotCi0gICAgICAgIC8vIDxjb21wb25lbnQtc3BlY2lmaWNhdGlvbj4KLQotICAgICAgICBTdHJpbmcgcGF0dGVybiA9ICJjb21wb25lbnQtc3BlY2lmaWNhdGlvbiI7Ci0KLSAgICAgICAgcmVzdWx0LmFkZFJ1bGUocGF0dGVybiwgbmV3IENyZWF0ZUNvbXBvbmVudFNwZWNpZmljYXRpb25SdWxlKCkpOwotICAgICAgICByZXN1bHQuYWRkUnVsZShwYXR0ZXJuLCBuZXcgU2V0UHVibGljSWRSdWxlKCkpOwotCi0gICAgICAgIHJlc3VsdC5hZGRTZXRCb29sZWFuUHJvcGVydHkocGF0dGVybiwgImFsbG93LWJvZHkiLCAiYWxsb3dCb2R5Iik7Ci0gICAgICAgIHJlc3VsdC5hZGRTZXRCb29sZWFuUHJvcGVydHkoCi0gICAgICAgICAgICBwYXR0ZXJuLAotICAgICAgICAgICAgImFsbG93LWluZm9ybWFsLXBhcmFtZXRlcnMiLAotICAgICAgICAgICAgImFsbG93SW5mb3JtYWxQYXJhbWV0ZXJzIik7Ci0gICAgICAgIHJlc3VsdC5hZGRTZXRMaW1pdGVkUHJvcGVydGllcyhwYXR0ZXJuLCAiY2xhc3MiLCAiY29tcG9uZW50Q2xhc3NOYW1lIik7Ci0KLSAgICAgICAgLy8gVE9ETzogcHVibGljSWQKLQotICAgICAgICAvLyA8cGFyYW1ldGVyPgotCi0gICAgICAgIHBhdHRlcm4gPSAiY29tcG9uZW50LXNwZWNpZmljYXRpb24vcGFyYW1ldGVyIjsKLQotICAgICAgICByZXN1bHQuYWRkUnVsZShwYXR0ZXJuLCBuZXcgQ3JlYXRlUGFyYW1ldGVyU3BlY2lmaWNhdGlvblJ1bGUoKSk7Ci0gICAgICAgIHJlc3VsdC5hZGRWYWxpZGF0ZSgKLSAgICAgICAgICAgIHBhdHRlcm4sCi0gICAgICAgICAgICAibmFtZSIsCi0gICAgICAgICAgICBQQVJBTUVURVJfTkFNRV9QQVRURVJOLAotICAgICAgICAgICAgIlNwZWNpZmljYXRpb25QYXJzZXIuaW52YWxpZC1wYXJhbWV0ZXItbmFtZSIpOwotCi0gICAgICAgIHJlc3VsdC5hZGRWYWxpZGF0ZSgKLSAgICAgICAgICAgIHBhdHRlcm4sCi0gICAgICAgICAgICAicHJvcGVydHktbmFtZSIsCi0gICAgICAgICAgICBQUk9QRVJUWV9OQU1FX1BBVFRFUk4sCi0gICAgICAgICAgICAiU3BlY2lmaWNhdGlvblBhcnNlci5pbnZhbGlkLXByb3BlcnR5LW5hbWUiKTsKLQotICAgICAgICAvLyBXZSB1c2UgYSBzbGlnaHQga2x1ZGdlIHRvIHNldCB0aGUgZGVmYXVsdCBwcm9wZXJ0eU5hbWUgZnJvbSB0aGUgCi0gICAgICAgIC8vIG5hbWUgYXR0cmlidXRlLiAgSWYgdGhlIHNwZWMgaW5jbHVkZXMgYSBwcm9wZXJ0eS1uYW1lIGF0dHJpYnV0ZSwgdGhhdAotICAgICAgICAvLyB3aWxsIG92ZXJ3cml0ZSB0aGUgZGVmYXVsdCBwcm9wZXJ0eSBuYW1lKS4KLSAgICAgICAgLy8gUmVtZW1iZXIgdGhhdCBkaWdlc3RlciBydWxlIG9yZGVyIGNvdW50cyEKLQotICAgICAgICByZXN1bHQuYWRkU2V0TGltaXRlZFByb3BlcnRpZXMocGF0dGVybiwgIm5hbWUiLCAicHJvcGVydHlOYW1lIik7Ci0KLSAgICAgICAgLy8gamF2YS10eXBlIGlzIGEgaG9sZG92ZXIgZnJvbSB0aGUgMS4zIERURCBhbmQgd2lsbCBldmVudHVhbGx5IGJlIHJlbW92ZWQuCi0KLSAgICAgICAgcmVzdWx0LmFkZFNldExpbWl0ZWRQcm9wZXJ0aWVzKAotICAgICAgICAgICAgcGF0dGVybiwKLSAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7ICJwcm9wZXJ0eS1uYW1lIiwgInR5cGUiLCAiamF2YS10eXBlIiwgImRlZmF1bHQtdmFsdWUiIH0sCi0gICAgICAgICAgICBuZXcgU3RyaW5nW10geyAicHJvcGVydHlOYW1lIiwgInR5cGUiLCAidHlwZSIsICJkZWZhdWx0VmFsdWUiIH0pOwotCi0gICAgICAgIHJlc3VsdC5hZGRTZXRCb29sZWFuUHJvcGVydHkocGF0dGVybiwgInJlcXVpcmVkIiwgInJlcXVpcmVkIik7Ci0KLSAgICAgICAgcmVzdWx0LmFkZFNldENvbnZlcnRlZFByb3BlcnR5KHBhdHRlcm4sIENPTlZFUlNJT05fTUFQLCAiZGlyZWN0aW9uIiwgImRpcmVjdGlvbiIpOwotCi0gICAgICAgIHJlc3VsdC5hZGRDb25uZWN0Q2hpbGQocGF0dGVybiwgImFkZFBhcmFtZXRlciIsICJuYW1lIik7Ci0KLSAgICAgICAgLy8gPHJlc2VydmVkLXBhcmFtZXRlcj4KLQotICAgICAgICBwYXR0ZXJuID0gImNvbXBvbmVudC1zcGVjaWZpY2F0aW9uL3Jlc2VydmVkLXBhcmFtZXRlciI7Ci0KLSAgICAgICAgcmVzdWx0LmFkZENhbGxNZXRob2QocGF0dGVybiwgImFkZFJlc2VydmVkUGFyYW1ldGVyTmFtZSIsIDEpOwotICAgICAgICByZXN1bHQuYWRkQ2FsbFBhcmFtKHBhdHRlcm4sIDAsICJuYW1lIik7Ci0KLSAgICAgICAgY29uZmlndXJlQ29tbW9uKHJlc3VsdCwgImNvbXBvbmVudC1zcGVjaWZpY2F0aW9uIik7Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgQ29uZmlndXJlIHRoZSBjb21tb24gZWxlbWVudHMgc2hhcmVkIGJ5IGJvdGggJmx0O3BhZ2Utc3BlY2lmaWNhdGlvbiZndDsKLSAgICAgKiAgYW5kICZsdDtjb21wb25lbnQtc3BlY2lmaWNhdGlvbiZndDsuCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlQ29tbW9uKFNwZWNpZmljYXRpb25EaWdlc3RlciBkaWdlc3RlciwgU3RyaW5nIHJvb3RFbGVtZW50TmFtZSkKLSAgICB7Ci0gICAgICAgIC8vIDxiZWFuPgotCi0gICAgICAgIFN0cmluZyBwYXR0ZXJuID0gcm9vdEVsZW1lbnROYW1lICsgIi9iZWFuIjsKLQotICAgICAgICBkaWdlc3Rlci5hZGRSdWxlKHBhdHRlcm4sIG5ldyBDcmVhdGVCZWFuU3BlY2lmaWNhdGlvblJ1bGUoKSk7Ci0gICAgICAgIGRpZ2VzdGVyLmFkZFZhbGlkYXRlKAotICAgICAgICAgICAgcGF0dGVybiwKLSAgICAgICAgICAgICJuYW1lIiwKLSAgICAgICAgICAgIEJFQU5fTkFNRV9QQVRURVJOLAotICAgICAgICAgICAgIlNwZWNpZmljYXRpb25QYXJzZXIuaW52YWxpZC1iZWFuLW5hbWUiKTsKLSAgICAgICAgZGlnZXN0ZXIuYWRkU2V0Q29udmVydGVkUHJvcGVydHkocGF0dGVybiwgQ09OVkVSU0lPTl9NQVAsICJsaWZlY3ljbGUiLCAibGlmZWN5Y2xlIik7Ci0gICAgICAgIGRpZ2VzdGVyLmFkZFNldExpbWl0ZWRQcm9wZXJ0aWVzKHBhdHRlcm4sICJjbGFzcyIsICJjbGFzc05hbWUiKTsKLSAgICAgICAgZGlnZXN0ZXIuYWRkQ29ubmVjdENoaWxkKHBhdHRlcm4sICJhZGRCZWFuU3BlY2lmaWNhdGlvbiIsICJuYW1lIik7Ci0KLSAgICAgICAgLy8gPHNldC1wcm9wZXJ0eT4gaW5zaWRlIDxiZWFuPgotCi0gICAgICAgIHBhdHRlcm4gPSByb290RWxlbWVudE5hbWUgKyAiL2JlYW4vc2V0LXByb3BlcnR5IjsKLQotICAgICAgICBkaWdlc3Rlci5hZGRSdWxlKHBhdHRlcm4sIG5ldyBDcmVhdGVFeHByZXNzaW9uQmVhbkluaXRpYWxpemVyUnVsZSgpKTsKLSAgICAgICAgZGlnZXN0ZXIuYWRkU2V0TGltaXRlZFByb3BlcnRpZXMocGF0dGVybiwgIm5hbWUiLCAicHJvcGVydHlOYW1lIik7Ci0gICAgICAgIGRpZ2VzdGVyLmFkZFNldEV4dGVuZGVkUHJvcGVydHkocGF0dGVybiwgImV4cHJlc3Npb24iLCAiZXhwcmVzc2lvbiIsIHRydWUpOwotICAgICAgICBkaWdlc3Rlci5hZGRTZXROZXh0KHBhdHRlcm4sICJhZGRJbml0aWFsaXplciIpOwotCi0gICAgICAgIC8vIDxzZXQtc3RyaW5nLXByb3BlcnR5PiBpbnNpZGUgPGJlYW4+Ci0gICAgICAgIC8vIFRoaXMgaXMgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgMS4zIERURAotCi0gICAgICAgIHBhdHRlcm4gPSByb290RWxlbWVudE5hbWUgKyAiL2JlYW4vc2V0LXN0cmluZy1wcm9wZXJ0eSI7Ci0KLSAgICAgICAgZGlnZXN0ZXIuYWRkUnVsZShwYXR0ZXJuLCBuZXcgQ3JlYXRlU3RyaW5nQmVhbkluaXRpYWxpemVyUnVsZSgpKTsKLSAgICAgICAgZGlnZXN0ZXIuYWRkU2V0TGltaXRlZFByb3BlcnRpZXMoCi0gICAgICAgICAgICBwYXR0ZXJuLAotICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgIm5hbWUiLCAia2V5IiB9LAotICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgInByb3BlcnR5TmFtZSIsICJrZXkiIH0pOwotCi0gICAgICAgIGRpZ2VzdGVyLmFkZFNldE5leHQocGF0dGVybiwgImFkZEluaXRpYWxpemVyIik7Ci0KLSAgICAgICAgLy8gSXQncyBub3cgc2V0LW1lc3NhZ2UtcHJvcGVydHkgaW4gdGhlIDMuMCBEVEQKLQotICAgICAgICBwYXR0ZXJuID0gcm9vdEVsZW1lbnROYW1lICsgIi9iZWFuL3NldC1tZXNzYWdlLXByb3BlcnR5IjsKLQotICAgICAgICBkaWdlc3Rlci5hZGRSdWxlKHBhdHRlcm4sIG5ldyBDcmVhdGVTdHJpbmdCZWFuSW5pdGlhbGl6ZXJSdWxlKCkpOwotICAgICAgICBkaWdlc3Rlci5hZGRTZXRMaW1pdGVkUHJvcGVydGllcygKLSAgICAgICAgICAgIHBhdHRlcm4sCi0gICAgICAgICAgICBuZXcgU3RyaW5nW10geyAibmFtZSIsICJrZXkiIH0sCi0gICAgICAgICAgICBuZXcgU3RyaW5nW10geyAicHJvcGVydHlOYW1lIiwgImtleSIgfSk7Ci0KLSAgICAgICAgZGlnZXN0ZXIuYWRkU2V0TmV4dChwYXR0ZXJuLCAiYWRkSW5pdGlhbGl6ZXIiKTsKLQotICAgICAgICAvLyA8Y29tcG9uZW50PgotCi0gICAgICAgIHBhdHRlcm4gPSByb290RWxlbWVudE5hbWUgKyAiL2NvbXBvbmVudCI7Ci0KLSAgICAgICAgZGlnZXN0ZXIuYWRkUnVsZShwYXR0ZXJuLCBuZXcgQ3JlYXRlQ29udGFpbmVkQ29tcG9uZW50UnVsZSgpKTsKLSAgICAgICAgZGlnZXN0ZXIuYWRkVmFsaWRhdGUoCi0gICAgICAgICAgICBwYXR0ZXJuLAotICAgICAgICAgICAgImlkIiwKLSAgICAgICAgICAgIENPTVBPTkVOVF9JRF9QQVRURVJOLAotICAgICAgICAgICAgIlNwZWNpZmljYXRpb25QYXJzZXIuaW52YWxpZC1jb21wb25lbnQtaWQiKTsKLSAgICAgICAgZGlnZXN0ZXIuYWRkVmFsaWRhdGUoCi0gICAgICAgICAgICBwYXR0ZXJuLAotICAgICAgICAgICAgInR5cGUiLAotICAgICAgICAgICAgQ09NUE9ORU5UX1RZUEVfUEFUVEVSTiwKLSAgICAgICAgICAgICJTcGVjaWZpY2F0aW9uUGFyc2VyLmludmFsaWQtY29tcG9uZW50LXR5cGUiKTsKLSAgICAgICAgZGlnZXN0ZXIuYWRkU2V0TGltaXRlZFByb3BlcnRpZXMocGF0dGVybiwgInR5cGUiLCAidHlwZSIpOwotICAgICAgICBkaWdlc3Rlci5hZGRSdWxlKHBhdHRlcm4sIG5ldyBDb21wb25lbnRDb3B5T2ZSdWxlKCkpOwotICAgICAgICBkaWdlc3Rlci5hZGRDb25uZWN0Q2hpbGQocGF0dGVybiwgImFkZENvbXBvbmVudCIsICJpZCIpOwotICAgICAgICBkaWdlc3Rlci5hZGRTZXRCb29sZWFuUHJvcGVydHkoCi0gICAgICAgICAgICBwYXR0ZXJuLAotICAgICAgICAgICAgImluaGVyaXQtaW5mb3JtYWwtcGFyYW1ldGVycyIsCi0gICAgICAgICAgICAiaW5oZXJpdEluZm9ybWFsUGFyYW1ldGVycyIpOwotCi0gICAgICAgIC8vIDxiaW5kaW5nPiBpbnNpZGUgPGNvbXBvbmVudD4KLQotICAgICAgICBwYXR0ZXJuID0gcm9vdEVsZW1lbnROYW1lICsgIi9jb21wb25lbnQvYmluZGluZyI7Ci0KLSAgICAgICAgUnVsZSBjcmVhdGVCaW5kaW5nU3BlY2lmaWNhdGlvblJ1bGUgPSBuZXcgQ3JlYXRlQmluZGluZ1NwZWNpZmljYXRpb25SdWxlKCk7Ci0KLSAgICAgICAgZGlnZXN0ZXIuYWRkUnVsZShwYXR0ZXJuLCBjcmVhdGVCaW5kaW5nU3BlY2lmaWNhdGlvblJ1bGUpOwotICAgICAgICBkaWdlc3Rlci5hZGRJbml0aWFsaXplUHJvcGVydHkocGF0dGVybiwgInR5cGUiLCBCaW5kaW5nVHlwZS5EWU5BTUlDKTsKLSAgICAgICAgZGlnZXN0ZXIuYWRkU2V0RXh0ZW5kZWRQcm9wZXJ0eShwYXR0ZXJuLCAiZXhwcmVzc2lvbiIsICJ2YWx1ZSIsIHRydWUpOwotICAgICAgICBkaWdlc3Rlci5hZGRDb25uZWN0Q2hpbGQocGF0dGVybiwgInNldEJpbmRpbmciLCAibmFtZSIpOwotCi0gICAgICAgIC8vIDxmaWVsZC1iaW5kaW5nPiBpbnNpZGUgPGNvbXBvbmVudD4KLSAgICAgICAgLy8gRm9yIGNvbXBhdGliaWxpdHkgd2l0aCAxLjMgRFREIG9ubHksIHJlbW92ZWQgaW4gMy4wIERURAotCi0gICAgICAgIHBhdHRlcm4gPSByb290RWxlbWVudE5hbWUgKyAiL2NvbXBvbmVudC9maWVsZC1iaW5kaW5nIjsKLQotICAgICAgICBkaWdlc3Rlci5hZGRSdWxlKHBhdHRlcm4sIGNyZWF0ZUJpbmRpbmdTcGVjaWZpY2F0aW9uUnVsZSk7Ci0gICAgICAgIGRpZ2VzdGVyLmFkZEluaXRpYWxpemVQcm9wZXJ0eShwYXR0ZXJuLCAidHlwZSIsIEJpbmRpbmdUeXBlLkZJRUxEKTsKLSAgICAgICAgZGlnZXN0ZXIuYWRkU2V0RXh0ZW5kZWRQcm9wZXJ0eShwYXR0ZXJuLCAiZmllbGQtbmFtZSIsICJ2YWx1ZSIsIHRydWUpOwotICAgICAgICBkaWdlc3Rlci5hZGRDb25uZWN0Q2hpbGQocGF0dGVybiwgInNldEJpbmRpbmciLCAibmFtZSIpOwotCi0gICAgICAgIC8vIDxpbmhlcml0ZWQtYmluZGluZz4gaW5zaWRlIDxjb21wb25lbnQ+Ci0KLSAgICAgICAgcGF0dGVybiA9IHJvb3RFbGVtZW50TmFtZSArICIvY29tcG9uZW50L2luaGVyaXRlZC1iaW5kaW5nIjsKLQotICAgICAgICBkaWdlc3Rlci5hZGRSdWxlKHBhdHRlcm4sIGNyZWF0ZUJpbmRpbmdTcGVjaWZpY2F0aW9uUnVsZSk7Ci0gICAgICAgIGRpZ2VzdGVyLmFkZEluaXRpYWxpemVQcm9wZXJ0eShwYXR0ZXJuLCAidHlwZSIsIEJpbmRpbmdUeXBlLklOSEVSSVRFRCk7Ci0gICAgICAgIGRpZ2VzdGVyLmFkZFNldExpbWl0ZWRQcm9wZXJ0aWVzKHBhdHRlcm4sICJwYXJhbWV0ZXItbmFtZSIsICJ2YWx1ZSIpOwotICAgICAgICBkaWdlc3Rlci5hZGRDb25uZWN0Q2hpbGQocGF0dGVybiwgInNldEJpbmRpbmciLCAibmFtZSIpOwotCi0gICAgICAgIC8vIDxzdGF0aWMtYmluZGluZz4gaW5zaWRlIDxjb21wb25lbnQ+Ci0KLSAgICAgICAgcGF0dGVybiA9IHJvb3RFbGVtZW50TmFtZSArICIvY29tcG9uZW50L3N0YXRpYy1iaW5kaW5nIjsKLQotICAgICAgICBkaWdlc3Rlci5hZGRSdWxlKHBhdHRlcm4sIGNyZWF0ZUJpbmRpbmdTcGVjaWZpY2F0aW9uUnVsZSk7Ci0gICAgICAgIGRpZ2VzdGVyLmFkZEluaXRpYWxpemVQcm9wZXJ0eShwYXR0ZXJuLCAidHlwZSIsIEJpbmRpbmdUeXBlLlNUQVRJQyk7Ci0gICAgICAgIGRpZ2VzdGVyLmFkZFNldEV4dGVuZGVkUHJvcGVydHkocGF0dGVybiwgInZhbHVlIiwgInZhbHVlIiwgdHJ1ZSk7Ci0gICAgICAgIGRpZ2VzdGVyLmFkZENvbm5lY3RDaGlsZChwYXR0ZXJuLCAic2V0QmluZGluZyIsICJuYW1lIik7Ci0KLSAgICAgICAgLy8gPHN0cmluZy1iaW5kaW5nPiBpbnNpZGUgPGNvbXBvbmVudD4KLSAgICAgICAgLy8gTWFpbnRhaW5lZCBqdXN0IGZvciAxLjMgRFREIGNvbXBhdGliaWxpdHkKLQotICAgICAgICBwYXR0ZXJuID0gcm9vdEVsZW1lbnROYW1lICsgIi9jb21wb25lbnQvc3RyaW5nLWJpbmRpbmciOwotCi0gICAgICAgIGRpZ2VzdGVyLmFkZFJ1bGUocGF0dGVybiwgY3JlYXRlQmluZGluZ1NwZWNpZmljYXRpb25SdWxlKTsKLSAgICAgICAgZGlnZXN0ZXIuYWRkSW5pdGlhbGl6ZVByb3BlcnR5KHBhdHRlcm4sICJ0eXBlIiwgQmluZGluZ1R5cGUuU1RSSU5HKTsKLSAgICAgICAgZGlnZXN0ZXIuYWRkU2V0TGltaXRlZFByb3BlcnRpZXMocGF0dGVybiwgImtleSIsICJ2YWx1ZSIpOwotICAgICAgICBkaWdlc3Rlci5hZGRDb25uZWN0Q2hpbGQocGF0dGVybiwgInNldEJpbmRpbmciLCAibmFtZSIpOwotCi0gICAgICAgIC8vIFJlbmFtZWQgdG8gPG1lc3NhZ2UtYmluZGluZz4gaW4gdGhlIDMuMCBEVEQKLQotICAgICAgICBwYXR0ZXJuID0gcm9vdEVsZW1lbnROYW1lICsgIi9jb21wb25lbnQvbWVzc2FnZS1iaW5kaW5nIjsKLQotICAgICAgICBkaWdlc3Rlci5hZGRSdWxlKHBhdHRlcm4sIGNyZWF0ZUJpbmRpbmdTcGVjaWZpY2F0aW9uUnVsZSk7Ci0gICAgICAgIGRpZ2VzdGVyLmFkZEluaXRpYWxpemVQcm9wZXJ0eShwYXR0ZXJuLCAidHlwZSIsIEJpbmRpbmdUeXBlLlNUUklORyk7Ci0gICAgICAgIGRpZ2VzdGVyLmFkZFNldExpbWl0ZWRQcm9wZXJ0aWVzKHBhdHRlcm4sICJrZXkiLCAidmFsdWUiKTsKLSAgICAgICAgZGlnZXN0ZXIuYWRkQ29ubmVjdENoaWxkKHBhdHRlcm4sICJzZXRCaW5kaW5nIiwgIm5hbWUiKTsKLQotICAgICAgICAvLyA8bGlzdGVuZXItYmluZGluZz4gaW5zaWRlIDxjb21wb25lbnQ+Ci0KLSAgICAgICAgcGF0dGVybiA9IHJvb3RFbGVtZW50TmFtZSArICIvY29tcG9uZW50L2xpc3RlbmVyLWJpbmRpbmciOwotCi0gICAgICAgIGRpZ2VzdGVyLmFkZFJ1bGUocGF0dGVybiwgbmV3IENyZWF0ZUxpc3RlbmVyQmluZGluZ1NwZWNpZmljYXRpb25SdWxlKCkpOwotICAgICAgICBkaWdlc3Rlci5hZGRTZXRMaW1pdGVkUHJvcGVydGllcyhwYXR0ZXJuLCAibGFuZ3VhZ2UiLCAibGFuZ3VhZ2UiKTsKLSAgICAgICAgZGlnZXN0ZXIuYWRkQm9keShwYXR0ZXJuLCAidmFsdWUiKTsKLSAgICAgICAgZGlnZXN0ZXIuYWRkQ29ubmVjdENoaWxkKHBhdHRlcm4sICJzZXRCaW5kaW5nIiwgIm5hbWUiKTsKLQotICAgICAgICAvLyA8ZXh0ZXJuYWwtYXNzZXQ+Ci0KLSAgICAgICAgcGF0dGVybiA9IHJvb3RFbGVtZW50TmFtZSArICIvZXh0ZXJuYWwtYXNzZXQiOwotCi0gICAgICAgIFJ1bGUgY3JlYXRlQXNzZXRTcGVjaWZpY2F0aW9uUnVsZSA9IG5ldyBDcmVhdGVBc3NldFNwZWNpZmljYXRpb25SdWxlKCk7Ci0KLSAgICAgICAgZGlnZXN0ZXIuYWRkUnVsZShwYXR0ZXJuLCBjcmVhdGVBc3NldFNwZWNpZmljYXRpb25SdWxlKTsKLSAgICAgICAgZGlnZXN0ZXIuYWRkSW5pdGlhbGl6ZVByb3BlcnR5KHBhdHRlcm4sICJ0eXBlIiwgQXNzZXRUeXBlLkVYVEVSTkFMKTsKLSAgICAgICAgZGlnZXN0ZXIuYWRkVmFsaWRhdGUoCi0gICAgICAgICAgICBwYXR0ZXJuLAotICAgICAgICAgICAgIm5hbWUiLAotICAgICAgICAgICAgQVNTRVRfTkFNRV9QQVRURVJOLAotICAgICAgICAgICAgIlNwZWNpZmljYXRpb25QYXJzZXIuaW52YWxpZC1hc3NldC1uYW1lIik7Ci0gICAgICAgIGRpZ2VzdGVyLmFkZFNldExpbWl0ZWRQcm9wZXJ0aWVzKHBhdHRlcm4sICJVUkwiLCAicGF0aCIpOwotICAgICAgICBkaWdlc3Rlci5hZGRDb25uZWN0Q2hpbGQocGF0dGVybiwgImFkZEFzc2V0IiwgIm5hbWUiKTsKLQotICAgICAgICAvLyA8Y29udGV4dC1hc3NldD4KLQotICAgICAgICBwYXR0ZXJuID0gcm9vdEVsZW1lbnROYW1lICsgIi9jb250ZXh0LWFzc2V0IjsKLQotICAgICAgICBkaWdlc3Rlci5hZGRSdWxlKHBhdHRlcm4sIGNyZWF0ZUFzc2V0U3BlY2lmaWNhdGlvblJ1bGUpOwotICAgICAgICBkaWdlc3Rlci5hZGRJbml0aWFsaXplUHJvcGVydHkocGF0dGVybiwgInR5cGUiLCBBc3NldFR5cGUuQ09OVEVYVCk7Ci0gICAgICAgIGRpZ2VzdGVyLmFkZFZhbGlkYXRlKAotICAgICAgICAgICAgcGF0dGVybiwKLSAgICAgICAgICAgICJuYW1lIiwKLSAgICAgICAgICAgIEFTU0VUX05BTUVfUEFUVEVSTiwKLSAgICAgICAgICAgICJTcGVjaWZpY2F0aW9uUGFyc2VyLmludmFsaWQtYXNzZXQtbmFtZSIpOwotCi0gICAgICAgIC8vIFRPRE86ICR0ZW1wbGF0ZSQKLQotICAgICAgICBkaWdlc3Rlci5hZGRTZXRMaW1pdGVkUHJvcGVydGllcyhwYXR0ZXJuLCAicGF0aCIsICJwYXRoIik7Ci0gICAgICAgIGRpZ2VzdGVyLmFkZENvbm5lY3RDaGlsZChwYXR0ZXJuLCAiYWRkQXNzZXQiLCAibmFtZSIpOwotCi0gICAgICAgIC8vIDxwcml2YXRlLWFzc2V0PgotCi0gICAgICAgIHBhdHRlcm4gPSByb290RWxlbWVudE5hbWUgKyAiL3ByaXZhdGUtYXNzZXQiOwotCi0gICAgICAgIGRpZ2VzdGVyLmFkZFJ1bGUocGF0dGVybiwgY3JlYXRlQXNzZXRTcGVjaWZpY2F0aW9uUnVsZSk7Ci0gICAgICAgIGRpZ2VzdGVyLmFkZEluaXRpYWxpemVQcm9wZXJ0eShwYXR0ZXJuLCAidHlwZSIsIEFzc2V0VHlwZS5QUklWQVRFKTsKLSAgICAgICAgZGlnZXN0ZXIuYWRkVmFsaWRhdGUoCi0gICAgICAgICAgICBwYXR0ZXJuLAotICAgICAgICAgICAgIm5hbWUiLAotICAgICAgICAgICAgQVNTRVRfTkFNRV9QQVRURVJOLAotICAgICAgICAgICAgIlNwZWNpZmljYXRpb25QYXJzZXIuaW52YWxpZC1hc3NldC1uYW1lIik7Ci0KLSAgICAgICAgLy8gVE9ETzogJHRlbXBsYXRlJAotCi0gICAgICAgIGRpZ2VzdGVyLmFkZFNldExpbWl0ZWRQcm9wZXJ0aWVzKHBhdHRlcm4sICJyZXNvdXJjZS1wYXRoIiwgInBhdGgiKTsKLSAgICAgICAgZGlnZXN0ZXIuYWRkQ29ubmVjdENoaWxkKHBhdHRlcm4sICJhZGRBc3NldCIsICJuYW1lIik7Ci0KLSAgICAgICAgLy8gPHByb3BlcnR5LXNwZWNpZmljYXRpb24+Ci0KLSAgICAgICAgcGF0dGVybiA9IHJvb3RFbGVtZW50TmFtZSArICIvcHJvcGVydHktc3BlY2lmaWNhdGlvbiI7Ci0KLSAgICAgICAgZGlnZXN0ZXIuYWRkUnVsZShwYXR0ZXJuLCBuZXcgQ3JlYXRlUHJvcGVydHlTcGVjaWZpY2F0aW9uUnVsZSgpKTsKLSAgICAgICAgZGlnZXN0ZXIuYWRkVmFsaWRhdGUoCi0gICAgICAgICAgICBwYXR0ZXJuLAotICAgICAgICAgICAgIm5hbWUiLAotICAgICAgICAgICAgUFJPUEVSVFlfTkFNRV9QQVRURVJOLAotICAgICAgICAgICAgIlNwZWNpZmljYXRpb25QYXJzZXIuaW52YWxpZC1wcm9wZXJ0eS1uYW1lIik7Ci0gICAgICAgIGRpZ2VzdGVyLmFkZFNldExpbWl0ZWRQcm9wZXJ0aWVzKAotICAgICAgICAgICAgcGF0dGVybiwKLSAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7ICJuYW1lIiwgInR5cGUiIH0sCi0gICAgICAgICAgICBuZXcgU3RyaW5nW10geyAibmFtZSIsICJ0eXBlIiB9KTsKLSAgICAgICAgZGlnZXN0ZXIuYWRkU2V0Qm9vbGVhblByb3BlcnR5KHBhdHRlcm4sICJwZXJzaXN0ZW50IiwgInBlcnNpc3RlbnQiKTsKLSAgICAgICAgZGlnZXN0ZXIuYWRkU2V0RXh0ZW5kZWRQcm9wZXJ0eShwYXR0ZXJuLCAiaW5pdGlhbC12YWx1ZSIsICJpbml0aWFsVmFsdWUiLCBmYWxzZSk7Ci0gICAgICAgIGRpZ2VzdGVyLmFkZFNldE5leHQocGF0dGVybiwgImFkZFByb3BlcnR5U3BlY2lmaWNhdGlvbiIpOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldFVSTChTdHJpbmcgcmVzb3VyY2UpCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZShyZXNvdXJjZSkudG9FeHRlcm5hbEZvcm0oKTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3BhcnNlL1RhcGVzdHJ5XzFfMy5kdGQgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvcGFyc2UvVGFwZXN0cnlfMV8zLmR0ZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmEyZmQxNC4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvcGFyc2UvVGFwZXN0cnlfMV8zLmR0ZAorKysgL2Rldi9udWxsCkBAIC0xLDU0OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS0gJElkOiBUYXBlc3RyeV8xXzMuZHRkLHYgMS4xOCAyMDAyLzA5LzE5IDE3OjI1OjI4IGhzaGlwIEV4cCAkIC0tPg0KLTwhLS0NCi0NCi1UaGUgRFREIGZvciBUYXBlc3RyeSBhcHBsaWNhdGlvbiwgcGFnZSBhbmQgY29tcG9uZW50IHNwZWNpZmljYXRpb25zLg0KLUFzc29jaWF0ZWQgd2l0aCB0aGUgcHVibGljIGlkZW50aWZpZXI6DQotDQotCS0vL0hvd2FyZCBMZXdpcyBTaGlwLy9UYXBlc3RyeSBTcGVjaWZpY2F0aW9uIDEuMy8vRU4NCi0JDQotVGhlIGNhbm9uaWNhbCBsb2NhdGlvbiBmb3IgdGhlIERURCBpczoNCi0NCi0JaHR0cDovL3RhcGVzdHJ5LnNmLm5ldC9kdGQvVGFwZXN0cnlfMV8zLmR0ZA0KLQ0KLUZvciBhcHBsaWNhdGlvbiBzcGVjaWZpY2F0aW9ucywgdGhlIHJvb3QgZWxlbWVudCBpcyBhcHBsaWNhdGlvbi4NCi0NCi1Gb3IgY29tcG9uZW50IHNwZWNpZmljYXRpb25zLCB0aGUgcm9vdCBlbGVtZW50IGlzIGNvbXBvbmVudC1zcGVjaWZpY2F0aW9uLg0KLQ0KLUZvciBwYWdlIHNwZWNpZmljYXRpb25zLCB0aGUgcm9vdCBlbGVtZW50IGlzIHBhZ2Utc3BlY2lmaWNhdGlvbi4NCi0NCi1Gb3IgbGlicmFyeSBzcGVjaWZpYXRpb25zLCB0aGUgcm9vdCBlbGVtZW50IGlzIGxpYnJhcnktc3BlY2lmaWNhdGlvbi4NCi0NCi1UaGlzIERURCBpcyBiYWNrd2FyZHMgY29tcGF0aWJsZSB3aXRoIHRoZSAxLjIgRFRELCB3aXRoIHRoZSBmb2xsb3dpbmcgZXhjZXB0aW9uczoNCi0tIHNwZWNpZmljYXRpb24gKGluIDEuMSkgaGFzIGJlZW4gc3BsaXQgaW50byBwYWdlLXNwZWNpZmljYXRpb24gYW5kIGNvbXBvbmVudC1zcGVjaWZpY2F0aW9uDQotLSBhZGRlZCBzdHJpbmctdmFsdWUgZWxlbWVudA0KLS0gYWRkZWQgbGlicmFyeS1zcGVjaWZpY2F0aW9uIHJvb3QgZWxlbWVudA0KLS0gYWRkZWQgbGlicmFyeSBlbGVtZW50DQotLSBhZGRlZCBleHRlbnNpb24gZWxlbWVudA0KLS0gYWRkZWQgc3RhdGljIHZhbHVlIHR5cGUgJ2xvbmcnDQotLSBhbGxvdyA8cHJvcGVydHk+IHdpdGhpbiA8YmVhbj4sIDxjb21wb25lbnQ+LCA8ZXh0ZW5zaW9uPiwgPHByaXZhdGUtYXNzZXQ+LCA8Y29udGV4dC1hc3NldD4gYW5kIDxleHRlcm5hbC1hc3NldD4NCi0tIGFkZCAicmVuZGVyIiB0byBiZWFuIGxpZmVjeWNsZSB2YWx1ZQ0KLS0gcmVuYW1lIDxiaW5kaW5nPidzIHByb3BlcnR5LXBhdGggYXR0cmlidXRlIHRvIGV4cHJlc3Npb24NCi0tIHNpbXBsaWZ5IHNldC1wcm9wZXJ0eSB0byB1c2UgT0dOTCBleHByZXNzaW9ucw0KLS0gYWRkICJmb3JtIiBhcyBwYXJhbWV0ZXIgZGlyZWN0aW9uDQotLS0+DQotDQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotRW50aXR5OiBhdHRyaWJ1dGUtZmxhZw0KLQ0KLUZvciBlbnRpdHkgYXR0cmlidXRlc3RoYXQgdGFrZSBhIGJvb2xlYW4gdmFsdWUsIGRlZmluZXMgJ3llcycgYW5kICdubycuDQotVGhlIGRlZmF1bHQgdmFyaWVzLCBzbyBpc24ndCBpbmNsdWRlZCBoZXJlLg0KLS0tPg0KLTwhRU5USVRZICUgYXR0cmlidXRlLWZsYWcgIih5ZXN8bm8pIj4NCi0NCi0NCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi1FbnRpdHk6IHN0YXRpYy12YWx1ZS10eXBlDQotDQotRm9yIGVudGl0eSBhdHRyaWJ1dGVzIHRoYXQgdGFrZSBhIHN0cmluZyBidXQgY29udmVydCBpdCB0byBhIHJlYWwNCi10eXBlLiAgRGVmYXVsdHMgdG8gU3RyaW5nLg0KLQ0KLS0tPg0KLTwhRU5USVRZICUgc3RhdGljLXZhbHVlLXR5cGUgIihib29sZWFufGludHxsb25nfGRvdWJsZXxTdHJpbmcpICdTdHJpbmcnIj4NCi0NCi08IUVOVElUWSAlIGxpYnJhcnktY29udGVudCAiKGRlc2NyaXB0aW9uKiwgcHJvcGVydHkqLCAocGFnZXxjb21wb25lbnQtYWxpYXN8c2VydmljZXxsaWJyYXJ5fGV4dGVuc2lvbikqKSI+DQotDQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotRWxlbWVudDogYXBwbGljYXRpb24NCi1Sb290IGVsZW1lbnQNCi0NCi1EZWZpbmVzIGEgVGFwZXN0cnkgYXBwbGljYXRpb24uDQotDQotQXR0cmlidXRlczoNCi0gIG5hbWU6IEEgdGV4dHVhbCBuYW1lIHVzZWQgdG8gdW5pcXVlbHkgaWRlbnRpZnkgdGhlIGFwcGxpY2F0aW9uLg0KLSAgZW5naW5lLWNsYXNzOiAgVGhlIEphdmEgY2xhc3MgdG8gaW5zdGFudGlhdGUgYXMgdGhlIGFwcGxpY2F0aW9uIGVuZ2luZS4NCi0tLT4NCi08IUVMRU1FTlQgYXBwbGljYXRpb24gJWxpYnJhcnktY29udGVudDs+DQotPCFBVFRMSVNUIGFwcGxpY2F0aW9uDQotICBuYW1lIENEQVRBICNSRVFVSVJFRA0KLSAgZW5naW5lLWNsYXNzIENEQVRBICNSRVFVSVJFRA0KLT4NCi0NCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi1FbGVtZW50OiBiZWFuDQotQXBwZWFycyBpbjogY29tcG9uZW50LXNwZWNpZmljYXRpb24sIHBhZ2Utc3BlY2lmaWNhdGlvbg0KLQ0KLURlZmluZXMgYSBKYXZhQmVhbiB0aGF0IHdpbGwgYmUgdXNlZCBpbiBzb21lIHdheSBieSB0aGUgY29tcG9uZW50LiAgQmVhbnMNCi1hcmUgYWNjZXNzaWJsZSB2aWEgdGhlIGNvbXBvbmVudHMnIGJlYW5zIHByb3BlcnR5ICh3aGljaCBjb250YWlucyBhIHByb3BlcnR5DQotZm9yIGVhY2ggYmVhbikuICBCZWFucyBhcmUgY3JlYXRlZCBhcyBuZWVkZWQsIGFuZCBhcmUgZGlzY2FyZGVkIGJhc2VkIG9uDQotdGhlIGxpZmVjeWNsZSBhdHRyaWJ1dGUuICBCZWFucyBhcmUgdHlwaWNhbGx5IHVzZWQgdG8gZXh0ZW5kIHRoZQ0KLWltcGxlbWVudGF0aW9uIG9mIGEgY29tcG9uZW50IHZpYSBhZ2dyZWdhdGlvbi4NCi0NCi1BdHRyaWJ1dGVzOg0KLSAgbmFtZTogdGhlIG5hbWUgb2YgdGhlIGJlYW4NCi0gIGNsYXNzOiB0aGUgSmF2YSBjbGFzcyB0byBpbnN0YW50aWF0ZQ0KLSAgbGlmZWN5Y2xlOiB3aGVuIHRoZSByZWZlcmVuY2UgdG8gdGhlIGJlYW4gc2hvdWxkIGJlIGRpc2NhcmQNCi0gIAkibm9uZSIgbm8gbGlmZWN5Y2xlLCB0aGUgYmVhbiBpcyBjcmVhdGVkIGFuZCByZXR1cm5lZCwgYnV0IG5vdCBzdG9yZWQNCi0gIAkicmVxdWVzdCIgdGhlIGJlYW4gaXMgcmV0YWluZWQgdW50aWwgdGhlIGVuZCBvZiB0aGUgcmVxdWVzdCBjeWNsZQ0KLSAgCSJwYWdlIiB0aGUgYmVhbiBpcyByZXRhaW5lZCBmb3IgdGhlIGxpZmVzcGFuIG9mIHRoZSBwYWdlDQotICAJInJlbmRlciIgdGhlIGJlYW4gaXMgcmV0YWluZWQgdW50aWwgdGhlIGVuZCBvZiB0aGUgY3VycmVudCBwYWdlIHJlbmRlcg0KLSAgCQ0KLU5vdGhpbmcgcHJldmVudHMgYSBiZWFuIGZvciBzdG9yaW5nIHN0YXRlOyBob3dldmVyLCBzdWNoIHN0YXRlIHdpbGwNCi1ub3QgYmUgYXNzb2NpYXRlZCB3aXRoIGFueSBwYXJ0aWN1bGFyIHNlc3Npb24gKHVubGlrZSBwZXJzaXN0YW50IHBhZ2UNCi1wcm9wZXJ0aWVzKS4gIEZ1cnRoZXIsIGJlY2F1c2Ugb2YgcGFnZSBwb29saW5nLCBzdWJzZXF1ZW50IHJlcXVlc3RzDQotZnJvbSB0aGUgc2FtZSBjbGllbnQgbWF5IGJlIHNlcnZpY2VkIGJ5IGRpZmZlcmVudCBpbnN0YW5jZXMgb2YgYSBwYWdlIGFuZA0KLSh0aGVyZWZvcmUpIGRpZmZlcmVudCBiZWFuIGluc3RhbmNlcy4NCi0NCi1CZWFucyB0aGF0IGhhdmUgdGhlICJyZXF1ZXN0IiBsaWZlY3ljbGUgbWF5IGJlIHN0b3JlZCBpbnRvIGEgcG9vbA0KLWZvciBsYXRlciByZS11c2UgKGluIHRoZSBzYW1lIG9yIGRpZmZlcmVudCBwYWdlKS4NCi0NCi1UaGUgYmVhbiBtYXkgaGF2ZSBpdHMgcHJvcGVydGllcyBzZXQuICBQcm9wZXJ0aWVzIGFyZSBzZXQgb24gYm90aA0KLW5ld2x5IGluc3RhbnRpYXRlZCBiZWFucywgYW5kIGJlYW5zIHRoYXQgYXJlIHJldHJpZXZlZCBmcm9tIGEgcG9vbC4NCi0NCi0tLT4NCi08IUVMRU1FTlQgYmVhbiAoZGVzY3JpcHRpb24qLCBwcm9wZXJ0eSosIChzZXQtcHJvcGVydHkgfCBzZXQtc3RyaW5nLXByb3BlcnR5KSopPg0KLTwhQVRUTElTVCBiZWFuDQotICBuYW1lIENEQVRBICNSRVFVSVJFRA0KLSAgY2xhc3MgQ0RBVEEgI1JFUVVJUkVEDQotICBsaWZlY3ljbGUgKG5vbmV8cmVxdWVzdHxwYWdlfHJlbmRlcikgInJlcXVlc3QiDQotPg0KLQ0KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLUVsZW1lbnQ6IGJpbmRpbmcNCi1BcHBlYXJzIGluOiBjb21wb25lbnQNCi0NCi1CaW5kcyBhIHBhcmFtZXRlciBvZiB0aGUgY29tcG9uZW50IHRvIGEgcHJvcGVydHkgb2YgaXRzIGNvbnRhaW5lci4NCi0NCi1BdHRyaWJ1dGVzOg0KLSAgbmFtZTogVGhlIG5hbWUgb2YgdGhlIGNvbXBvbmVudCBwYXJhbWV0ZXIgdG8gYmluZC4NCi0gIGV4cHJlc3Npb246IFRoZSBPR05MIGV4cHJlc3Npb24uDQotLS0+DQotPCFFTEVNRU5UIGJpbmRpbmcgRU1QVFk+DQotPCFBVFRMSVNUIGJpbmRpbmcNCi0gIG5hbWUgQ0RBVEEgI1JFUVVJUkVEDQotICBleHByZXNzaW9uIENEQVRBICNSRVFVSVJFRA0KLT4NCi0NCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi1FbGVtZW50OiBjb25maWd1cmUNCi1BcHBlYXJzIGluOiBleHRlbnNpb24NCi0NCi1Db25maWd1cmVzIG9uZSBKYXZhQmVhbiBwcm9wZXJ0eSBvZiBhbiBleHRlbnNpb24uDQotDQotQXR0cmlidXRlczoNCi0gIHByb3BlcnR5LW5hbWU6ICBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gY29uZmlndXJlLg0KLSAgdHlwZTogQ29udmVyc2lvbiBvZiBwcm9wZXJ0eSB2YWx1ZS4NCi0gIA0KLSANCi0tLT4NCi0NCi08IUVMRU1FTlQgY29uZmlndXJlICgjUENEQVRBKT4NCi08IUFUVExJU1QgY29uZmlndXJlIA0KLSAgcHJvcGVydHktbmFtZSBDREFUQSAjUkVRVUlSRUQNCi0gIHR5cGUgJXN0YXRpYy12YWx1ZS10eXBlOw0KLT4NCi0gIA0KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLUVsZW1lbnQ6IGNvbXBvbmVudA0KLUNvbnRhaW5lZCBieTogY29tcG9uZW50LXNwZWNpZmljYXRpb24sIHBhZ2Utc3BlY2lmaWNhdGlvbg0KLQ0KLURlZmluZXMgYSBjb21wb25lbnQgY29udGFpbmVkIGJ5IHRoZSBjb21wb25lbnQgYmVpbmcgc3BlY2lmaWVkLg0KLQ0KLUF0dHJpYnV0ZToNCi0gIGlkOiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgY29tcG9uZW50IHdpdGhpbiB0aGUgY29udGFpbmVyLg0KLSAgdHlwZTogVGhlIHR5cGUgb2YgY29tcG9uZW50LCBlaXRoZXIgYSB3ZWxsIGtub3duIGxvZ2ljYWwgbmFtZSwgb3IgdGhlIGNvbXBsZXRlIHBhdGgNCi0gICAgdG8gdGhlIGNvbXBvbmVudCdzIHNwZWNpZmljYXRpb24uDQotICBjb3B5LW9mOiBUaGUgaWQgb2YgYSBwcmV2aW91c2x5IGRlZmluZWQgY29tcG9uZW50OyB0aGlzIGNvbXBvbmVudCB3aWxsIGJlIGEgY29weQ0KLSAgICBvZiB0aGUgb3RoZXIgY29tcG9uZW50Lg0KLQ0KLVRoZSBUYXBlc3RyeSBwYWdlIGxvYWRlciBlbnN1cmVzIHRoYXQgZWl0aGVyIHR5cGUgb3IgY29weS1vZiBpcyBzcGVjaWZpZWQsIGJ1dCBub3QgYm90aC4NCi0tLT4NCi08IUVMRU1FTlQgY29tcG9uZW50IChwcm9wZXJ0eSosIChiaW5kaW5nIHwgZmllbGQtYmluZGluZyB8IGluaGVyaXRlZC1iaW5kaW5nIHwgc3RhdGljLWJpbmRpbmcgfCBzdHJpbmctYmluZGluZykqKT4NCi08IUFUVExJU1QgY29tcG9uZW50DQotICBpZCBJRCAjUkVRVUlSRUQNCi0gIHR5cGUgQ0RBVEEgI0lNUExJRUQNCi0gIGNvcHktb2YgSURSRUYgI0lNUExJRUQNCi0+DQotDQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotRWxlbWVudDogY29tcG9uZW50LWFsaWFzDQotQ29udGFpbmVkIGJ5OiBhcHBsaWNhdGlvbg0KLQ0KLUVzdGFibGlzaGVzIGEgc2hvcnQgbG9naWMgbmFtZSBmb3IgYSBwYXJ0aWN1bGFyIGNvbXBvbmVudCB0aGF0IGlzIHVzZWQNCi13aXRoaW4gdGhlIGFwcGxpY2F0aW9uLg0KLQ0KLUF0dHJpYnV0ZXM6DQotICB0eXBlOiBUaGUgbG9naWNhbCBuYW1lIGZvciB0aGUgY29tcG9uZW50Lg0KLSAgc3BlY2lmaWNhdGlvbi1wYXRoOiAgVGhlIGNvbXBsZXRlIHBhdGggdG8gdGhlIGNvbXBvbmVudCdzIHNwZWNpZmljYXRpb24uDQotLS0+DQotPCFFTEVNRU5UIGNvbXBvbmVudC1hbGlhcyBFTVBUWT4NCi08IUFUVExJU1QgY29tcG9uZW50LWFsaWFzDQotICB0eXBlIENEQVRBICNSRVFVSVJFRA0KLSAgc3BlY2lmaWNhdGlvbi1wYXRoIENEQVRBICNSRVFVSVJFRA0KLT4NCi0NCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi1FbGVtZW50OiBjb21wb25lbnQtc3BlY2lmaWNhdGlvbg0KLVJvb3QgZWxlbWVudA0KLQ0KLUEgY29tcG9uZW50IHNwZWNpZmljYXRpb24uICBJdCdzIGF0dHJpYnV0ZXMgZGVmaW5lIHRoZSBKYXZhIGNsYXNzIHRvDQotaW5zdGFudGlhdGUsIHdoZXRoZXIgdGhlIGNvbXBvbmVudCBtYXkgd3JhcCBvdGhlciBlbGVtZW50cywgYW5kIHdoZXRoZXINCi1pbmZvcm1hbCAodW5kZWNsYXJlZCkgcGFyYW1ldGVycyBhcmUgYWxsb3dlZC4gIFZlcnkgc2ltaWxhciB0byBhIHBhZ2Utc3BlY2lmaWNhdGlvbiwNCi1leGNlcHQgdGhhdCBjb21wb25lbnQtc3BlY2lmaWNhdGlvbiBhbGxvd3MgZm9yIHBhcmFtZXRlcnMgKGZvcm1hbCBhbmQgaW5mb3JtYWwpLg0KLQ0KLUF0dHJpYnV0ZXM6DQotICBjbGFzczogVGhlIEphdmEgY2xhc3MgdG8gaW5zdGFudGlhdGUgZm9yIHRoZSBjb21wb25lbnQuDQotICBhbGxvdy1ib2R5OiAgSWYgeWVzICh0aGUgZGVmYXVsdCksIHRoZSBjb21wb25lbnQgbWF5IHdyYXAgb3RoZXIgZWxlbWVudHMgKGhhdmUgYSBib2R5KS4NCi0gIGFsbG93LWluZm9ybWFsLXBhcmFtZXRlcnM6ICBJZiB5ZXMgKHRoZSBkZWZhdWx0KSwgaW5mb3JtYWwgcGFyYW1ldGVycyAocGFyYW1ldGVycyB0aGF0IGFyZSBub3QNCi0gICAgZXhwbGljdGlseSBkZWZpbmVkKSBhcmUgYWxsb3dlZC4NCi0tLT4NCi08IUVMRU1FTlQgY29tcG9uZW50LXNwZWNpZmljYXRpb24gDQotCShkZXNjcmlwdGlvbiosIHBhcmFtZXRlciosIHJlc2VydmVkLXBhcmFtZXRlciosIHByb3BlcnR5KiwNCi0JKGJlYW4gfAljb21wb25lbnQgfCBleHRlcm5hbC1hc3NldCB8IGNvbnRleHQtYXNzZXQgfCBwcml2YXRlLWFzc2V0KSopPg0KLTwhQVRUTElTVCBjb21wb25lbnQtc3BlY2lmaWNhdGlvbg0KLSAgY2xhc3MgQ0RBVEEgI1JFUVVJUkVEDQotICBhbGxvdy1ib2R5ICVhdHRyaWJ1dGUtZmxhZzsgInllcyINCi0gIGFsbG93LWluZm9ybWFsLXBhcmFtZXRlcnMgJWF0dHJpYnV0ZS1mbGFnOyAieWVzIg0KLT4NCi0NCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi1FbGVtZW50OiBjb250ZXh0LWFzc2V0DQotQ29udGFpbmVkIGJ5OiBjb21wb25lbnQtc3BlY2lmaWNhdGlvbiwgcGFnZS1zcGVjaWZpY2F0aW9uDQotDQotQW4gYXNzZXQgbG9jYXRlZCBpbiB0aGUgc2FtZSB3ZWIgYXBwbGljYXRpb24gY29udGV4dCBhcyB0aGUgcnVubmluZw0KLWFwcGxpY2F0aW9uLg0KLQ0KLUF0dHJpYnV0ZXM6DQotICBuYW1lOiBUaGUgbmFtZSBvZiB0aGUgYXNzZXQuDQotICBwYXRoOiBUaGUgcGF0aCwgcmVsYXRpdmUgdG8gdGhlIHdlYiBhcHBsaWNhdGlvbiBjb250ZXh0LCBvZiB0aGUgcmVzb3VyY2UuDQotLS0+DQotPCFFTEVNRU5UIGNvbnRleHQtYXNzZXQgKHByb3BlcnR5Kik+DQotPCFBVFRMSVNUIGNvbnRleHQtYXNzZXQNCi0gIG5hbWUgQ0RBVEEgI1JFUVVJUkVEDQotICBwYXRoIENEQVRBICNSRVFVSVJFRA0KLT4NCi0NCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi1FbGVtZW50OiBkZXNjcmlwdGlvbg0KLUFwcGVhcnMgaW46IG1hbnkNCi0NCi1TZXZlcmFsIGVsZW1lbnRzIG1heSBjb250YWluIGRlc2NyaXB0aW9uczsgdGhlc2UgZGVzY3JpcHRpb25zIGFyZQ0KLW9wdGlvbmFsLiAgVGhlIGV2ZW50dWFsIGdvYWwgaXMgdG8gcHJvdmlkZSBoZWxwIGluIHNvbWUgZm9ybSBvZiBJREUuDQotQ3VycmVudGx5LCBkZXNjcmlwdGlvbnMgYXJlIG9wdGlvbmFsIGFuZCBpZ25vcmVkLg0KLQ0KLUF0dHJpYnV0ZXM6DQotICB4bWw6bGFuZyB0aGUgbGFuZ3VhZ2UgdGhhdCB0aGUgZGVzY3JpcHRpb24gaXMgZXhwcmVzc2VkIGluLg0KLS0tPg0KLTwhRUxFTUVOVCBkZXNjcmlwdGlvbiAoI1BDREFUQSk+DQotPCFBVFRMSVNUIGRlc2NyaXB0aW9uDQotICB4bWw6bGFuZyBOTVRPS0VOICJlbiINCi0+DQotDQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotRWxlbWVudDogZXh0ZW5zaW9uDQotQ29udGFpbmVkIGJ5OiBhcHBsaWNhdGlvbiwgbGlicmFyeS1zcGVjaWZpY2F0aW9uDQotDQotRGVmaW5lcyBhbiBleHRlbnNpb24sIGFuIG9iamVjdCB0aGF0IGlzIGluc3RhbnRpYXRlZCBhbmQgY29uZmlndXJlZA0KLShsaWtlIGEgaGVscGVyIGJlYW4pIGFuZCBpcyB0aGVuIGFjY2Vzc2libGUsIGJ5IG5hbWUsIGZyb20gdGhlDQotY29udGFpbmluZyBsaWJyYXJ5IChvciBhcHBsaWNhdGlvbikuDQotDQotQXR0cmlidXRlczoNCi0gIG5hbWU6IE5hbWUgb2YgdGhlIGV4dGVuc2lvbi4NCi0gIGNsYXNzOiBKYXZhIGNsYXNzIHRvIGluc3RhbnRpYXRlLg0KLSAgaW1tZWRpYXRlOiBJZiB0cnVlLCB0aGUgZXh0ZW5zaW9uIGlzIGluc3RhbnRpYXRlZCBlYXJseSBpbnN0ZWFkIG9mIGFzLW5lZWRlZC4NCi0gIA0KLS0tPg0KLTwhRUxFTUVOVCBleHRlbnNpb24gKHByb3BlcnR5KiwgY29uZmlndXJlKik+DQotPCFBVFRMSVNUIGV4dGVuc2lvbg0KLSAgbmFtZSBDREFUQSAjUkVRVUlSRUQNCi0gIGNsYXNzIENEQVRBICNSRVFVSVJFRA0KLSAgaW1tZWRpYXRlICVhdHRyaWJ1dGUtZmxhZzsgIm5vIg0KLT4NCi0NCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi1FbGVtZW50OiBleHRlcm5hbC1hc3NldA0KLUNvbnRhaW5lZCBieTogY29tcG9uZW50LXNwZWNpZmljYXRpb24sIHBhZ2Utc3BlY2lmaWNhdGlvbg0KLQ0KLURlZmluZXMgYW4gYXNzZXQgYXQgc29tZSBleHRlcm5hbCBzb3VyY2UuDQotDQotQXR0cmlidXRlczoNCi0gIG5hbWU6IFRoZSBuYW1lIG9mIHRoZSBhc3NldC4NCi0gIFVSTDogVGhlIFVSTCB1c2VkIHRvIHJlZmVyZW5jZSB0aGUgYXNzZXQuDQotLS0+DQotPCFFTEVNRU5UIGV4dGVybmFsLWFzc2V0IChwcm9wZXJ0eSopPg0KLTwhQVRUTElTVCBleHRlcm5hbC1hc3NldA0KLSAgbmFtZSBDREFUQSAjUkVRVUlSRUQNCi0gIFVSTCBDREFUQSAjUkVRVUlSRUQNCi0+DQotDQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotRWxlbWVudDogZmllbGQtYmluZGluZw0KLUFwcGVhcnMgaW46IGNvbXBvbmVudA0KLQ0KLUJpbmRzIGEgcGFyYW1ldGVyIG9mIHRoZSBjb21wb25lbnQgdG8gYSBwdWJsaWMgc3RhdGljIGZpZWxkIG9mDQotc29tZSBKYXZhIG9iamVjdC4NCi0NCi1BdHRyaWJ1dGVzOg0KLSAgbmFtZTogVGhlIG5hbWUgb2YgdGhlIGNvbXBvbmVudCBwYXJhbWV0ZXIgdG8gYmluZC4NCi0gIGZpZWxkLW5hbWU6ICBUaGUgbmFtZSBvZiB0aGUgZmllbGQsIG9mIHRoZSBmb3JtIFtwYWNrYWdlLl1jbGFzcy5maWVsZC4NCi0gICAgVGhlIHBhY2thZ2UgbWF5IGJlIG9tbWl0dGVkIGlmIGl0IGlzICJqYXZhLmxhbmciLg0KLS0tPg0KLTwhRUxFTUVOVCBmaWVsZC1iaW5kaW5nIEVNUFRZPg0KLTwhQVRUTElTVCBmaWVsZC1iaW5kaW5nDQotICBuYW1lIENEQVRBICNSRVFVSVJFRA0KLSAgZmllbGQtbmFtZSBDREFUQSAjUkVRVUlSRUQNCi0+DQotDQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotRWxlbWVudDogaW5oZXJpdGVkLWJpbmRpbmcNCi1BcHBlYXJzIGluOiBjb21wb25lbnQNCi0NCi1CaW5kcyBhIHBhcmFtZXRlciBvZiB0aGUgY29tcG9uZW50IHRvIGEgcGFyYW1ldGVyIG9mIHRoZSBjb250YWluZXIuDQotDQotQXR0cmlidXRlczoNCi0gIG5hbWU6IFRoZSBuYW1lIG9mIHRoZSBjb21wb25lbnQgcGFyYW1ldGVyIHRvIGJpbmQuDQotICBwYXJhbWV0ZXItbmFtZTogVGhlIG5hbWUgb2YgdGhlIGNvbnRhaW5lciBwYXJhbWV0ZXIgdG8gYmluZCB0aGUNCi0gICAgY29tcG9uZW50IHBhcmFtZXRlciB0by4NCi0tLT4NCi08IUVMRU1FTlQgaW5oZXJpdGVkLWJpbmRpbmcgRU1QVFk+DQotPCFBVFRMSVNUIGluaGVyaXRlZC1iaW5kaW5nDQotICBuYW1lIENEQVRBICNSRVFVSVJFRA0KLSAgcGFyYW1ldGVyLW5hbWUgQ0RBVEEgI1JFUVVJUkVEDQotPg0KLQ0KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLUVsZW1lbnQ6IGxpYnJhcnkNCi1BcHBlYXJzIGluOiBhcHBsaWNhdGlvbi1zcGVjaWZpY2F0aW9uLCBsaWJyYXJ5LXNwZWNpZmljYXRpb24NCi0NCi1EZWZpbmVzIGEgbGlicmFyeSB1c2VkIGluIHRoZSBjb25zdHJ1Y3Rpb24gb2YgdGhlIGNvbnRhaW5lcg0KLShlaXRoZXIgYW5vdGhlciBsaWJyYXJ5LCBvciB0aGUgYXBwbGljYXRpb24gaXRzZWxmKS4NCi0NCi1BdHRyaWJ1dGVzOg0KLSAgaWQ6IEFuIGlkZW50aWZpZXIgdXNlZCB0byByZWZlcmVuY2UgcGFnZXMgYW5kIGNvbXBvbmVudHMNCi0gICAgcHJvdmlkZWQgYnkgdGhlIGxpYnJhcnkuDQotICBzcGVjaWZpY2F0aW9uLXBhdGg6IFRoZSBwYXRoIHRvIHRoZSByZXNvdXJjZSB0aGF0IHByb3ZpZGVzDQotICAgIHRoZSBsaWJyYXJ5IHNwZWNpZmljYXRpb24uDQotLS0+DQotPCFFTEVNRU5UIGxpYnJhcnkgRU1QVFk+DQotPCFBVFRMSVNUIGxpYnJhcnkNCi0gIGlkIENEQVRBICNSRVFVSVJFRA0KLSAgc3BlY2lmaWNhdGlvbi1wYXRoIENEQVRBICNSRVFVSVJFRA0KLT4NCi0NCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi1FbGVtZW50OiBsaWJyYXJ5LXNwZWNpZmljYXRpb24NCi1Sb290IGVsZW1lbnQNCi0NCi1EZWZpbmVzIGEgbGlicmFyeSB0aGF0IG1heSBiZSB1c2VkIGluIHRoZSBjb25zdHJ1Y3Rpb24gDQotb2YgYW4gYXBwbGljYXRpb24gKG9yIGFub3RoZXIgbGlicmFyeSkuICBBbiBhcHBsaWNhdGlvbiBjYW4NCi1iZSB0aG91Z2h0IG9mIGFzIGEgc3BlY2lhbGl6ZWQga2luZCBvZiBsaWJyYXJ5Lg0KLQ0KLS0tPg0KLTwhRUxFTUVOVCBsaWJyYXJ5LXNwZWNpZmljYXRpb24gJWxpYnJhcnktY29udGVudDs+DQotDQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotRWxlbWVudDogcGFnZQ0KLUNvbnRhaW5lZCBieTogYXBwbGljYXRpb24sIGxpYnJhcnktc3BlY2lmaWNhdGlvbg0KLQ0KLURlZmluZXMgYSBzaW5nbGUgcGFnZSB3aXRoaW4gdGhlIGFwcGxpY2F0aW9uLiAgRWFjaCBhcHBsaWNhdGlvbiB3aWxsIGNvbnRhaW4NCi1hdCBsZWFzdCBvbmUgb2YgdGhlc2UsIHRvIGRlZmluZSB0aGUgSG9tZSBwYWdlLg0KLQ0KLUF0dHJpYnV0ZXM6DQotICBuYW1lOiBBIHVuaXF1ZSBuYW1lIGZvciB0aGUgYXBwbGljYXRpb24uDQotICBzcGVjaWZpY2F0aW9uLXBhdGg6ICBUaGUgcmVzb3VyY2UgY2xhc3NwYXRoIG9mIHRoZSBjb21wb25lbnQgc3BlY2lmaWNhdGlvbg0KLSAgICBmb3IgdGhlIHBhZ2UuDQotLS0+DQotPCFFTEVNRU5UIHBhZ2UgRU1QVFk+DQotPCFBVFRMSVNUIHBhZ2UNCi0gIG5hbWUgQ0RBVEEgI1JFUVVJUkVEDQotICBzcGVjaWZpY2F0aW9uLXBhdGggQ0RBVEEgI1JFUVVJUkVEDQotPg0KLQ0KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLUVsZW1lbnQ6IHBhZ2Utc3BlY2lmaWNhdGlvbg0KLVJvb3QgZWxlbWVudA0KLQ0KLUEgcGFnZSBzcGVjaWZpY2F0aW9uLiAgSXQncyBhdHRyaWJ1dGVzIGRlZmluZSB0aGUgSmF2YSBjbGFzcyB0bw0KLWluc3RhbnRpYXRlLiAgUGFnZXMgYXJlIGxpa2UgY29tcG9uZW50cywgZXhjZXB0IHRoZXkgYWx3YXlzIGFsbG93DQotYSBib2R5LCBhbmQgbmV2ZXIgYWxsb3cgcGFyYW1ldGVycyAoZm9ybWFsIG9yIG90aGVyd2lzZSkuDQotDQotQXR0cmlidXRlczoNCi0gIGNsYXNzOiBUaGUgSmF2YSBjbGFzcyB0byBpbnN0YW50aWF0ZSBmb3IgdGhlIGNvbXBvbmVudC4NCi0tLT4NCi08IUVMRU1FTlQgcGFnZS1zcGVjaWZpY2F0aW9uIChkZXNjcmlwdGlvbiosIHByb3BlcnR5KiwNCi0gICAgKGJlYW4gfCBjb21wb25lbnQgfCBleHRlcm5hbC1hc3NldCB8IGNvbnRleHQtYXNzZXQgfCBwcml2YXRlLWFzc2V0KSopPg0KLTwhQVRUTElTVCBwYWdlLXNwZWNpZmljYXRpb24NCi0gIGNsYXNzIENEQVRBICNSRVFVSVJFRA0KLT4NCi0NCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi1FbGVtZW50OiBwYXJhbWV0ZXINCi1Db250YWluZWQgYnk6IGNvbXBvbmVudC1zcGVjaWZpY2F0aW9uDQotDQotRGVmaW5lcyBhIGZvcm1hbCBwYXJhbWV0ZXIgZm9yIHRoZSBjb21wb25lbnQuDQotDQotQXR0cmlidXRlczoNCi0gIG5hbWU6IEEgdW5xaXVlIG5hbWUgZm9yIHRoZSBwYXJhbWV0ZXIuDQotICBqYXZhLXR5cGU6IFRoZSBuYW1lIG9mIGEgSmF2YSBjbGFzcyBvciBwcmltaXRpdmUgdHlwZSBleHBlY3RlZCBieSB0aGUgcGFyYW1ldGVyLg0KLSAgICBUaGlzIGlzIGZvciBkb2N1bWVudGF0aW9uIHB1cnBvc2VzIG9ubHksIGl0IGlzIG5vdCBlbmZvcmNlZC4NCi0gIHJlcXVpcmVkOiBJZiB5ZXMsIHRoZW4gdGhlIHBhcmFtZXRlciBtdXN0IGJlIGJvdW5kLiAgSWYgbm8gKHRoZSBkZWZhdWx0KSwNCi0gICAgdGhlbiB0aGUgcGFyYW1ldGVyIGlzIG9wdGlvbmFsLg0KLSAgcHJvcGVydHktbmFtZTogVGhlIG5hbWUgdG8gdXNlLCBpbnN0ZWFkIG9mIHRoZSBwYXJhbWV0ZXIgbmFtZSwgZm9yIHRoZQ0KLSAgICBKYXZhQmVhbiBwcm9wZXJ0eSBjb25uZWN0ZWQgdG8gdGhpcyBwYXJhbWV0ZXIuDQotICBkaXJlY3Rpb246IFRoZSBub3JtYWwgZmxvdyBvZiBkYXRhIHRocm91Z2ggdGhlIGNvbXBvbmVudC4NCi0tLT4NCi0NCi08IUVMRU1FTlQgcGFyYW1ldGVyIChkZXNjcmlwdGlvbiopPg0KLTwhQVRUTElTVCBwYXJhbWV0ZXINCi0gIG5hbWUgQ0RBVEEgI1JFUVVJUkVEDQotICBqYXZhLXR5cGUgQ0RBVEEgI0lNUExJRUQNCi0gIHJlcXVpcmVkICVhdHRyaWJ1dGUtZmxhZzsgIm5vIg0KLSAgcHJvcGVydHktbmFtZSBDREFUQSAjSU1QTElFRA0KLSAgZGlyZWN0aW9uIChpbnxmb3JtfGN1c3RvbSkgImN1c3RvbSINCi0+DQotDQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotRWxlbWVudDogcHJpdmF0ZS1hc3NldA0KLUNvbnRhaW5lZCBieTogY29tcG9uZW50LXNwZWNpZmljYXRpb24sIHBhZ2Utc3BlY2lmaWNhdGlvbg0KLQ0KLUFuIGFzc2V0IGF2YWlsYWJsZSB3aXRoaW4gdGhlIEphdmEgY2xhc3NwYXRoIChpLmUuLCBidW5kbGVkIGluc2lkZSBhIEpBUiBvciBXQVIpLg0KLQ0KLUF0dHJpYnV0ZXM6DQotICBuYW1lOiBUaGUgbmFtZSBvZiB0aGUgYXNzZXQuDQotICByZXNvdXJjZS1wYXRoOiBUaGUgY29tcGxldGUgcGF0aG5hbWUgb2YgdGhlIHJlc291cmNlLg0KLS0tPg0KLTwhRUxFTUVOVCBwcml2YXRlLWFzc2V0IChwcm9wZXJ0eSopPg0KLTwhQVRUTElTVCBwcml2YXRlLWFzc2V0DQotICBuYW1lIENEQVRBICNSRVFVSVJFRA0KLSAgcmVzb3VyY2UtcGF0aCBDREFUQSAjUkVRVUlSRUQNCi0+DQotDQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotRWxlbWVudDogcHJvcGVydHkNCi1Db250YWluZWQgYnk6IChtYW55IG90aGVyIGVsZW1lbnRzKQ0KLQ0KLURlZmluZXMgYSBrZXkvdmFsdWUgcGFpciBhc3NvY2lhdGVkIHdpdGggdGhlIGFwcGxpY2F0aW9uIG9yIGNvbXBvbmVudCBzcGVjaWZpY2F0aW9uLiAgUHJvcGVydGllcw0KLWFyZSB1c2VkIHRvIGNhcHR1cmUgaW5mb3JtYXRpb24gdGhhdCBkb2Vzbid0IGZpdCBpbnRvIHRoZSBEVEQuICBUaGUgdmFsdWUgZm9yIHRoZSBwcm9wZXJ0eSBpcw0KLXRoZSBQQ0RBVEEgd3JhcHBlZCBieSB0aGUgcHJvcGVydHkgdGFnICh3aGljaCBpcyB0cmltbWVkIG9mIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UpLg0KLQ0KLVRoaXMgc2hvdWxkIG5vdCBiZSBjb25mdXNlZCB3aXRoIHNldmVyYWwgb3RoZXIgdGFncyB3aGljaCBhcmUgdXNlZCB0byBzZXQgSmF2YUJlYW5zIHByb3BlcnRpZXMNCi1vZiB2YXJpb3VzIG9iamVjdHMuICBUaGUgPHByb3BlcnR5PiB0YWcgZXhpc3RzIHRvIGFsbG93IG1ldGEtZGF0YSB0byBiZSBzdG9yZWQgaW4gdGhlIHNwZWNpZmljYXRpb24uDQotDQotQXR0cmlidXRlczoNCi0gIG5hbWU6IFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBzZXQuDQotICANCi0tLT4NCi08IUVMRU1FTlQgcHJvcGVydHkgKCNQQ0RBVEEpPg0KLTwhQVRUTElTVCBwcm9wZXJ0eQ0KLSAgbmFtZSBDREFUQSAjUkVRVUlSRUQNCi0+DQotDQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotRWxlbWVudDogcmVzZXJ2ZWQtcGFyYW1ldGVyDQotQXBwZWFycyBpbjogY29tcG9uZW50LXNwZWNpZmljYXRpb24NCi0NCi1JZGVudGlmaWVzIGEgbmFtZSB3aGljaCBtYXkgbm90IGJlIHVzZWQgYXMgYW4gaW5mb3JtYWwgcGFyYW1ldGVyLg0KLUluZm9ybWFsIHBhcmFtZXRlcnMgYXJlIHR5cGljYWxseSBIVE1MIGF0dHJpYnV0ZSBuYW1lczsgdGhpcw0KLWxpc3QgaWRlbnRpZmllcyBIVE1MIGF0dHJpYnV0ZXMgdGhhdCBhcmUgd3JpdHRlbiBleGNsdXNpdmVseQ0KLWJ5IHRoZSBjb21wb25lbnQgYW5kIG1heSBub3QgYmUgYWZmZWN0ZWQgYnkgaW5mb3JtYWwgcGFyYW1ldGVycy4NCi0NCi1BdHRyaWJ1dGVzOg0KLSAgbmFtZTogVGhlIHBhcmFtZXRlciBuYW1lIHRvIHJlc2VydmUuDQotLS0+DQotDQotPCFFTEVNRU5UIHJlc2VydmVkLXBhcmFtZXRlciBFTVBUWT4NCi08IUFUVExJU1QgcmVzZXJ2ZWQtcGFyYW1ldGVyDQotICBuYW1lIENEQVRBICNSRVFVSVJFRA0KLT4NCi0NCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi1FbGVtZW50OiBzZXJ2aWNlDQotQXBwZWFycyBpbjogYXBwbGljYXRpb24NCi0NCi1EZWZpbmVzIGFuIGVuZ2luZSBzZXJ2aWNlLiAgWW91IG1heSBvdmVycmlkZSB0aGUgZGVmYXVsdA0KLXNldCBvZiBlbmdpbmUgc2VydmljZXMgb3IgcHJvdmlkZSBjb21wbGV0ZWx5IG5ldyBzZXJ2aWNlcy4NCi0NCi1BdHRyaWJ1dGVzOg0KLSAgbmFtZTogVGhlIG5hbWUgb2YgdGhlIHNlcnZpY2UuDQotICBjbGFzczogVGhlIEphdmEgY2xhc3MgdG8gaW5zdGFudGlhdGUgZm9yIHRoZSBzZXJ2aWNlLg0KLQ0KLS0tPg0KLQ0KLTwhRUxFTUVOVCBzZXJ2aWNlIEVNUFRZPg0KLTwhQVRUTElTVCBzZXJ2aWNlDQotICBuYW1lIENEQVRBICNSRVFVSVJFRA0KLSAgY2xhc3MgQ0RBVEEgI1JFUVVJUkVEDQotPg0KLQ0KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLUVsZW1lbnQ6IHNldC1wcm9wZXJ0eQ0KLUFwcGVhcnMgaW46IGJlYW4NCi0NCi1Vc2VkIHRvIGluaXRpYWxpemUgYSBwcm9wZXJ0eSBvZiBhIGhlbHBlciBiZWFuLg0KLQ0KLUF0dHJpYnV0ZXM6DQotICBuYW1lOiBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gYmUgc2V0Lg0KLSAgZXhwcmVzc2lvbjogVGhlIE9HTkwgZXhwcmVzc2lvbiB0aGF0IHByb3ZpZGVzIGEgdmFsdWUuDQotLS0+DQotDQotPCFFTEVNRU5UIHNldC1wcm9wZXJ0eSBFTVBUWT4NCi08IUFUVExJU1Qgc2V0LXByb3BlcnR5DQotICBuYW1lIENEQVRBICNSRVFVSVJFRA0KLSAgZXhwcmVzc2lvbiBDREFUQSAjUkVRVUlSRUQNCi0+DQotDQotDQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotRWxlbWVudDogc2V0LXN0cmluZy1wcm9wZXJ0eQ0KLUFwcGVhcnMgaW46IGJlYW4NCi0NCi1BIGxvY2FsaXplZCBzdHJpbmcuDQotDQotQXR0cmlidXRlczoNCi0gIGtleTogIFNldHMgYSBwcm9wZXJ0eSBvZiBhIHN0cmluZyBmcm9tIGEgbG9jYWxpemVkIHN0cmluZy4NCi0NCi0tLT4NCi0NCi08IUVMRU1FTlQgc2V0LXN0cmluZy1wcm9wZXJ0eSBFTVBUWT4NCi08IUFUVExJU1Qgc2V0LXN0cmluZy1wcm9wZXJ0eQ0KLSAgbmFtZSBDREFUQSAjUkVRVUlSRUQNCi0gIGtleSBDREFUQSAjUkVRVUlSRUQNCi0+DQotDQotDQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotRWxlbWVudDogc3RhdGljLWJpbmRpbmcNCi1BcHBlYXJzIGluOiBjb21wb25lbnQNCi0NCi1CaW5kcyBhIHBhcmFtZXRlciBvZiB0aGUgY29tcG9uZW50IHRvIGEgc3RhdGljIHZhbHVlIGRlZmluZWQgZGlyZWN0bHkNCi13aXRoaW4gdGhpcyBzcGVjaWZpY2F0aW9uLiBUaGUgdmFsdWUgaXMgdGhlIFBDREFUQSB3cmFwcGVkIGJ5IHRoZSBlbGVtZW50DQotKHdpdGggbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZSByZW1vdmVkKS4NCi0NCi1BdHRyaWJ1dGVzOg0KLSAgbmFtZTogVGhlIG5hbWUgb2YgdGhlIGNvbXBvbmVudCBwYXJhbWV0ZXIgdG8gYmluZC4NCi0NCi0tLT4NCi08IUVMRU1FTlQgc3RhdGljLWJpbmRpbmcgKCNQQ0RBVEEpPg0KLTwhQVRUTElTVCBzdGF0aWMtYmluZGluZw0KLSAgbmFtZSBDREFUQSAjUkVRVUlSRUQNCi0+DQotDQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotRWxlbWVudDogc3RyaW5nLWJpbmRpbmcNCi1BcHBlYXJzIGluOiBjb21wb25lbnQNCi0NCi1CaW5kcyBhIHBhcmFtZXRlciBvZiB0aGUgY29tcG9uZW50IHRvIGEgbG9jYWxpemVkIHN0cmluZyBvZg0KLWl0cyBjb250YWluZXIuDQotDQotQXR0cmlidXRlczoNCi0gIG5hbWU6IFRoZSBuYW1lIG9mIHRoZSBjb21wb25lbnQgcGFyYW1ldGVyIHRvIGJpbmQuDQotICBrZXk6IFRoZSBrZXkgdXNlZCB0byBhY2Nlc3MgYSBsb2NhbGl6ZWQgc3RyaW5nLg0KLSAgDQotLS0+DQotDQotPCFFTEVNRU5UIHN0cmluZy1iaW5kaW5nIEVNUFRZPg0KLTwhQVRUTElTVCBzdHJpbmctYmluZGluZw0KLSAgbmFtZSBDREFUQSAjUkVRVUlSRUQNCi0gIGtleSBDREFUQSAjUkVRVUlSRUQNCi0+DQotDQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3BhcnNlL1RhcGVzdHJ5XzNfMC5kdGQgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvcGFyc2UvVGFwZXN0cnlfM18wLmR0ZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAzNmE1Yi4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvcGFyc2UvVGFwZXN0cnlfM18wLmR0ZAorKysgL2Rldi9udWxsCkBAIC0xLDU0NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS0gJElkOiBUYXBlc3RyeV8xXzMuZHRkLHYgMS4xOCAyMDAyLzA5LzE5IDE3OjI1OjI4IGhzaGlwIEV4cCAkIC0tPg0KLTwhLS0NCi0NCi1UaGUgRFREIGZvciBUYXBlc3RyeSBhcHBsaWNhdGlvbiwgbGlicmFyeSwgcGFnZSBhbmQgY29tcG9uZW50IHNwZWNpZmljYXRpb25zLg0KLUFzc29jaWF0ZWQgd2l0aCB0aGUgcHVibGljIGlkZW50aWZpZXI6DQotDQotCS0vL0FwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLy9UYXBlc3RyeSBTcGVjaWZpY2F0aW9uIDMuMC8vRU4NCi0JDQotVGhlIGNhbm9uaWNhbCBsb2NhdGlvbiBmb3IgdGhlIERURCBpczoNCi0NCi0JaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy90YXBlc3RyeS9kdGQvVGFwZXN0cnlfM18wLmR0ZA0KLQ0KLUZvciBhcHBsaWNhdGlvbiBzcGVjaWZpY2F0aW9ucywgdGhlIHJvb3QgZWxlbWVudCBpcyBhcHBsaWNhdGlvbi4NCi0NCi1Gb3IgY29tcG9uZW50IHNwZWNpZmljYXRpb25zLCB0aGUgcm9vdCBlbGVtZW50IGlzIGNvbXBvbmVudC1zcGVjaWZpY2F0aW9uLg0KLQ0KLUZvciBwYWdlIHNwZWNpZmljYXRpb25zLCB0aGUgcm9vdCBlbGVtZW50IGlzIHBhZ2Utc3BlY2lmaWNhdGlvbi4NCi0NCi1Gb3IgbGlicmFyeSBzcGVjaWZpYXRpb25zLCB0aGUgcm9vdCBlbGVtZW50IGlzIGxpYnJhcnktc3BlY2lmaWNhdGlvbi4NCi0NCi1UaGlzIERURCBpcyBiYWNrd2FyZHMgY29tcGF0aWJsZSB3aXRoIHRoZSAxLjMgRFRELCB3aXRoIHRoZSBmb2xsb3dpbmcgZXhjZXB0aW9uczoNCi0tIDxmaWVsZC1iaW5kaW5nPiBoYXMgYmVlbiByZW1vdmVkDQotLSBhdHRyaWJ1dGUgY2xhc3Mgb2YgPGNvbXBvbmVudC1zcGVjaWZpY2F0aW9uPiBhbmQgPHBhZ2Utc3BlY2lmaWNhdGlvbiBpcyBub3cgb3B0aW9uYWwNCi0tIGF0dHJpYnV0ZXMgbmFtZSBhbmQgZW5naW5lLWNsYXNzIG9mIDxhcHBsaWNhdGlvbj4gYXJlIG5vdyBvcHRpb25hbA0KLS0gYWRkZWQgdmFsdWUgYXR0cmlidXRlIHRvIDxzdGF0aWMtYmluZGluZz4NCi0tIGFkZGVkIHZhbHVlIGF0dHJpYnV0ZSB0byA8cHJvcGVydHk+DQotLSByZW5hbWVkIDxjb21wb25lbnQtYWxpYXM+IHRvIDxjb21wb25lbnQtdHlwZT4NCi0tIHJlbmFtZSA8c2V0LXN0cmluZy1wcm9wZXJ0eT4gdG8gPHNldC1tZXNzYWdlLXByb3BlcnR5Pg0KLS0gYWRkZWQgPGxpc3RlbmVyLWJpbmRpbmc+IGVsZW1lbnQNCi0tIGFkZGVkIDxwcm9wZXJ0eS1zcGVjaWZpY2F0aW9uPiBlbGVtZW50DQotLSByZW5hbWVkIGphdmEtdHlwZSB0byB0eXBlIGluc2lkZSA8cGFyYW1ldGVyPg0KLS0gYWxsb3cgdmFsdWVzIHRvIGJlIHNwZWNpZmllZCBhcyBhdHRyaWJ1dGVzIG9yIHdyYXBwZWQgY2hhcmFjdGVyIGRhdGEgaW4gbWFueSBlbGVtZW50cw0KLS0gYWxsb3cgb25seSBhIHNpbmdsZSA8ZGVzY3JpcHRpb24+IHBlciBlbGVtZW50DQotLS0+DQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotRW50aXR5OiBhdHRyaWJ1dGUtZmxhZw0KLQ0KLUZvciBlbnRpdHkgYXR0cmlidXRlcyB0aGF0IHRha2UgYSBib29sZWFuIHZhbHVlLCBkZWZpbmVzICd5ZXMnIGFuZCAnbm8nLg0KLVRoZSBkZWZhdWx0IHZhcmllcywgc28gaXNuJ3QgaW5jbHVkZWQgaGVyZS4NCi0tLT4NCi08IUVOVElUWSAlIGF0dHJpYnV0ZS1mbGFnICIoeWVzfG5vKSI+DQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotRW50aXR5OiBzdGF0aWMtdmFsdWUtdHlwZQ0KLQ0KLUZvciBlbnRpdHkgYXR0cmlidXRlcyB0aGF0IHRha2UgYSBzdHJpbmcgYnV0IGNvbnZlcnQgaXQgdG8gYSByZWFsDQotdHlwZS4gIERlZmF1bHRzIHRvIFN0cmluZy4NCi0NCi0tLT4NCi08IUVOVElUWSAlIHN0YXRpYy12YWx1ZS10eXBlICIoYm9vbGVhbnxpbnR8bG9uZ3xkb3VibGV8U3RyaW5nKSAnU3RyaW5nJyI+DQotPCFFTlRJVFkgJSBsaWJyYXJ5LWNvbnRlbnQgIihkZXNjcmlwdGlvbj8sIHByb3BlcnR5KiwgKHBhZ2V8Y29tcG9uZW50LXR5cGV8c2VydmljZXxsaWJyYXJ5fGV4dGVuc2lvbikqKSI+DQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotRWxlbWVudDogYXBwbGljYXRpb24NCi1Sb290IGVsZW1lbnQNCi0NCi1EZWZpbmVzIGEgVGFwZXN0cnkgYXBwbGljYXRpb24uDQotDQotQXR0cmlidXRlczoNCi0gIG5hbWU6IEEgdGV4dHVhbCBuYW1lIHVzZWQgdG8gdW5pcXVlbHkgaWRlbnRpZnkgdGhlIGFwcGxpY2F0aW9uLg0KLSAgZW5naW5lLWNsYXNzOiAgVGhlIEphdmEgY2xhc3MgdG8gaW5zdGFudGlhdGUgYXMgdGhlIGFwcGxpY2F0aW9uIGVuZ2luZS4NCi0tLT4NCi08IUVMRU1FTlQgYXBwbGljYXRpb24gJWxpYnJhcnktY29udGVudDs+DQotPCFBVFRMSVNUIGFwcGxpY2F0aW9uDQotCW5hbWUgQ0RBVEEgI0lNUExJRUQNCi0JZW5naW5lLWNsYXNzIENEQVRBICNJTVBMSUVEDQotPg0KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLUVsZW1lbnQ6IGJlYW4NCi1BcHBlYXJzIGluOiBjb21wb25lbnQtc3BlY2lmaWNhdGlvbiwgcGFnZS1zcGVjaWZpY2F0aW9uDQotDQotRGVmaW5lcyBhIEphdmFCZWFuIHRoYXQgd2lsbCBiZSB1c2VkIGluIHNvbWUgd2F5IGJ5IHRoZSBjb21wb25lbnQuICBCZWFucw0KLWFyZSBhY2Nlc3NpYmxlIHZpYSB0aGUgY29tcG9uZW50cycgYmVhbnMgcHJvcGVydHkgKHdoaWNoIGNvbnRhaW5zIGEgcHJvcGVydHkNCi1mb3IgZWFjaCBiZWFuKS4gIEJlYW5zIGFyZSBjcmVhdGVkIGFzIG5lZWRlZCwgYW5kIGFyZSBkaXNjYXJkZWQgYmFzZWQgb24NCi10aGUgbGlmZWN5Y2xlIGF0dHJpYnV0ZS4gIEJlYW5zIGFyZSB0eXBpY2FsbHkgdXNlZCB0byBleHRlbmQgdGhlDQotaW1wbGVtZW50YXRpb24gb2YgYSBjb21wb25lbnQgdmlhIGFnZ3JlZ2F0aW9uLg0KLQ0KLUF0dHJpYnV0ZXM6DQotICBuYW1lOiB0aGUgbmFtZSBvZiB0aGUgYmVhbg0KLSAgY2xhc3M6IHRoZSBKYXZhIGNsYXNzIHRvIGluc3RhbnRpYXRlDQotICBsaWZlY3ljbGU6IHdoZW4gdGhlIHJlZmVyZW5jZSB0byB0aGUgYmVhbiBzaG91bGQgYmUgZGlzY2FyZA0KLSAgCSJub25lIiBubyBsaWZlY3ljbGUsIHRoZSBiZWFuIGlzIGNyZWF0ZWQgYW5kIHJldHVybmVkLCBidXQgbm90IHN0b3JlZA0KLSAgCSJyZXF1ZXN0IiB0aGUgYmVhbiBpcyByZXRhaW5lZCB1bnRpbCB0aGUgZW5kIG9mIHRoZSByZXF1ZXN0IGN5Y2xlDQotICAJInBhZ2UiIHRoZSBiZWFuIGlzIHJldGFpbmVkIGZvciB0aGUgbGlmZXNwYW4gb2YgdGhlIHBhZ2UNCi0gIAkicmVuZGVyIiB0aGUgYmVhbiBpcyByZXRhaW5lZCB1bnRpbCB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IHBhZ2UgcmVuZGVyDQotICAJDQotTm90aGluZyBwcmV2ZW50cyBhIGJlYW4gZm9yIHN0b3Jpbmcgc3RhdGU7IGhvd2V2ZXIsIHN1Y2ggc3RhdGUgd2lsbA0KLW5vdCBiZSBhc3NvY2lhdGVkIHdpdGggYW55IHBhcnRpY3VsYXIgc2Vzc2lvbiAodW5saWtlIHBlcnNpc3RhbnQgcGFnZQ0KLXByb3BlcnRpZXMpLiAgRnVydGhlciwgYmVjYXVzZSBvZiBwYWdlIHBvb2xpbmcsIHN1YnNlcXVlbnQgcmVxdWVzdHMNCi1mcm9tIHRoZSBzYW1lIGNsaWVudCBtYXkgYmUgc2VydmljZWQgYnkgZGlmZmVyZW50IGluc3RhbmNlcyBvZiBhIHBhZ2UgYW5kDQotKHRoZXJlZm9yZSkgZGlmZmVyZW50IGJlYW4gaW5zdGFuY2VzLg0KLQ0KLUJlYW5zIHRoYXQgaGF2ZSB0aGUgInJlcXVlc3QiIGxpZmVjeWNsZSBtYXkgYmUgc3RvcmVkIGludG8gYSBwb29sDQotZm9yIGxhdGVyIHJlLXVzZSAoaW4gdGhlIHNhbWUgb3IgZGlmZmVyZW50IHBhZ2UpLg0KLQ0KLVRoZSBiZWFuIG1heSBoYXZlIGl0cyBwcm9wZXJ0aWVzIHNldC4gIFByb3BlcnRpZXMgYXJlIHNldCBvbiBib3RoDQotbmV3bHkgaW5zdGFudGlhdGVkIGJlYW5zLCBhbmQgYmVhbnMgdGhhdCBhcmUgcmV0cmlldmVkIGZyb20gYSBwb29sLg0KLQ0KLS0tPg0KLTwhRUxFTUVOVCBiZWFuIChkZXNjcmlwdGlvbj8sIHByb3BlcnR5KiwgKHNldC1wcm9wZXJ0eSB8IHNldC1tZXNzYWdlLXByb3BlcnR5KSopPg0KLTwhQVRUTElTVCBiZWFuDQotCW5hbWUgQ0RBVEEgI1JFUVVJUkVEDQotCWNsYXNzIENEQVRBICNSRVFVSVJFRA0KLQlsaWZlY3ljbGUgKG5vbmUgfCByZXF1ZXN0IHwgcGFnZSB8IHJlbmRlcikgInJlcXVlc3QiDQotPg0KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLUVsZW1lbnQ6IGJpbmRpbmcNCi1BcHBlYXJzIGluOiBjb21wb25lbnQNCi0NCi1CaW5kcyBhIHBhcmFtZXRlciBvZiB0aGUgY29tcG9uZW50IHRvIGEgT0dOTCBleHByZXNzaW9uLCByZWxhdGl2ZQ0KLXRvIGl0cyBjb250YWluZXIuICBUaGUgZXhwcmVzc2lvbiBtYXkgYmUgcHJvdmlkZWQgYXMgYW4gYXR0cmlidXRlLCBvciANCi1hcyB0aGUgYm9keSBvZiB0aGUgZWxlbWVudC4gIFRoZSBsYXR0ZXIgY2FzZSBpcyB1c2VmdWwgd2hlbiB0aGUgDQotZXhwcmVzc2lvbiBpcyBsb25nLCBvciB1c2VzIHByb2JsZW1hdGljIGNoYXJhY3RlcnMgKHN1Y2ggYXMgYSANCi1taXggb2Ygc2luZ2xlIGFuZCBkb3VibGUgcXVvdGVzKS4NCi0NCi1BdHRyaWJ1dGVzOg0KLSAgbmFtZTogVGhlIG5hbWUgb2YgdGhlIGNvbXBvbmVudCBwYXJhbWV0ZXIgdG8gYmluZC4NCi0gIGV4cHJlc3Npb246IFRoZSBPR05MIGV4cHJlc3Npb24uDQotLS0+DQotPCFFTEVNRU5UIGJpbmRpbmcgKCNQQ0RBVEEpPg0KLTwhQVRUTElTVCBiaW5kaW5nDQotCW5hbWUgQ0RBVEEgI1JFUVVJUkVEDQotCWV4cHJlc3Npb24gQ0RBVEEgI0lNUExJRUQNCi0+DQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotRWxlbWVudDogY29uZmlndXJlDQotQXBwZWFycyBpbjogZXh0ZW5zaW9uDQotDQotQ29uZmlndXJlcyBvbmUgSmF2YUJlYW4gcHJvcGVydHkgb2YgYW4gZXh0ZW5zaW9uLg0KLQ0KLUF0dHJpYnV0ZXM6DQotICBwcm9wZXJ0eS1uYW1lOiAgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGNvbmZpZ3VyZS4NCi0gIHR5cGU6IENvbnZlcnNpb24gb2YgcHJvcGVydHkgdmFsdWUuDQotICB2YWx1ZTogVGhlIHZhbHVlIHRvIGJlIGNvbnZlcnRlZCBhbmQgYXBwbGllZC4gIElmIG5vdCANCi0gICAgc3BlY2lmaWVkLCB0aGUgZWxlbWVudCdzIGNoYXJhY3RlciBkYXRhIGlzDQotICAgIHVzZWQuICANCi0gDQotLS0+DQotPCFFTEVNRU5UIGNvbmZpZ3VyZSAoI1BDREFUQSk+DQotPCFBVFRMSVNUIGNvbmZpZ3VyZQ0KLQlwcm9wZXJ0eS1uYW1lIENEQVRBICNSRVFVSVJFRA0KLQl0eXBlICVzdGF0aWMtdmFsdWUtdHlwZTsNCi0JdmFsdWUgQ0RBVEEgI0lNUExJRUQNCi0+DQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotRWxlbWVudDogY29tcG9uZW50DQotQ29udGFpbmVkIGJ5OiBjb21wb25lbnQtc3BlY2lmaWNhdGlvbiwgcGFnZS1zcGVjaWZpY2F0aW9uDQotDQotRGVmaW5lcyBhIGNvbXBvbmVudCBjb250YWluZWQgYnkgdGhlIGNvbXBvbmVudCBiZWluZyBzcGVjaWZpZWQuDQotDQotQXR0cmlidXRlOg0KLSAgaWQ6IEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBjb21wb25lbnQgd2l0aGluIHRoZSBjb250YWluZXIuDQotICB0eXBlOiBUaGUgdHlwZSBvZiBjb21wb25lbnQsIGVpdGhlciBhIHdlbGwga25vd24gbG9naWNhbCBuYW1lLCBvciB0aGUgY29tcGxldGUgcGF0aA0KLSAgICB0byB0aGUgY29tcG9uZW50J3Mgc3BlY2lmaWNhdGlvbi4NCi0gIGNvcHktb2Y6IFRoZSBpZCBvZiBhIHByZXZpb3VzbHkgZGVmaW5lZCBjb21wb25lbnQ7IHRoaXMgY29tcG9uZW50IHdpbGwgYmUgYSBjb3B5DQotICAgIG9mIHRoZSBvdGhlciBjb21wb25lbnQuDQotDQotVGhlIFRhcGVzdHJ5IHBhZ2UgbG9hZGVyIGVuc3VyZXMgdGhhdCBlaXRoZXIgdHlwZSBvciBjb3B5LW9mIGlzIHNwZWNpZmllZCwgYnV0IG5vdCBib3RoLg0KLS0tPg0KLTwhRUxFTUVOVCBjb21wb25lbnQgKHByb3BlcnR5KiwgKGJpbmRpbmcgfCBpbmhlcml0ZWQtYmluZGluZyB8IGxpc3RlbmVyLWJpbmRpbmcgfCBzdGF0aWMtYmluZGluZyB8IG1lc3NhZ2UtYmluZGluZykqKT4NCi08IUFUVExJU1QgY29tcG9uZW50DQotCWlkIElEICNSRVFVSVJFRA0KLQl0eXBlIENEQVRBICNJTVBMSUVEDQotCWNvcHktb2YgSURSRUYgI0lNUExJRUQNCi0JaW5oZXJpdC1pbmZvcm1hbC1wYXJhbWV0ZXJzICVhdHRyaWJ1dGUtZmxhZzsgIm5vIg0KLT4NCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi1FbGVtZW50OiBjb21wb25lbnQtdHlwZQ0KLUNvbnRhaW5lZCBieTogYXBwbGljYXRpb24NCi0NCi1Fc3RhYmxpc2hlcyBhIHNob3J0IGxvZ2ljIG5hbWUgZm9yIGEgcGFydGljdWxhciBjb21wb25lbnQgdGhhdCBpcyB1c2VkDQotd2l0aGluIHRoZSBhcHBsaWNhdGlvbi4NCi0NCi1BdHRyaWJ1dGVzOg0KLSAgdHlwZTogVGhlIGxvZ2ljYWwgbmFtZSBmb3IgdGhlIGNvbXBvbmVudC4NCi0gIHNwZWNpZmljYXRpb24tcGF0aDogIFRoZSBjb21wbGV0ZSBwYXRoIHRvIHRoZSBjb21wb25lbnQncyBzcGVjaWZpY2F0aW9uLg0KLS0tPg0KLTwhRUxFTUVOVCBjb21wb25lbnQtdHlwZSBFTVBUWT4NCi08IUFUVExJU1QgY29tcG9uZW50LXR5cGUNCi0JdHlwZSBDREFUQSAjUkVRVUlSRUQNCi0Jc3BlY2lmaWNhdGlvbi1wYXRoIENEQVRBICNSRVFVSVJFRA0KLT4NCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi1FbGVtZW50OiBjb21wb25lbnQtc3BlY2lmaWNhdGlvbg0KLVJvb3QgZWxlbWVudA0KLQ0KLUEgY29tcG9uZW50IHNwZWNpZmljYXRpb24uICBJdCdzIGF0dHJpYnV0ZXMgZGVmaW5lIHRoZSBKYXZhIGNsYXNzIHRvDQotaW5zdGFudGlhdGUsIHdoZXRoZXIgdGhlIGNvbXBvbmVudCBtYXkgd3JhcCBvdGhlciBlbGVtZW50cywgYW5kIHdoZXRoZXINCi1pbmZvcm1hbCAodW5kZWNsYXJlZCkgcGFyYW1ldGVycyBhcmUgYWxsb3dlZC4gIFZlcnkgc2ltaWxhciB0byBhIHBhZ2Utc3BlY2lmaWNhdGlvbiwNCi1leGNlcHQgdGhhdCBjb21wb25lbnQtc3BlY2lmaWNhdGlvbiBhbGxvd3MgZm9yIHBhcmFtZXRlcnMgKGZvcm1hbCBhbmQgaW5mb3JtYWwpLg0KLQ0KLUF0dHJpYnV0ZXM6DQotICBjbGFzczogVGhlIEphdmEgY2xhc3MgdG8gaW5zdGFudGlhdGUgZm9yIHRoZSBjb21wb25lbnQuDQotICBhbGxvdy1ib2R5OiAgSWYgeWVzICh0aGUgZGVmYXVsdCksIHRoZSBjb21wb25lbnQgbWF5IHdyYXAgb3RoZXIgZWxlbWVudHMgKGhhdmUgYSBib2R5KS4NCi0gIGFsbG93LWluZm9ybWFsLXBhcmFtZXRlcnM6ICBJZiB5ZXMgKHRoZSBkZWZhdWx0KSwgaW5mb3JtYWwgcGFyYW1ldGVycyAocGFyYW1ldGVycyB0aGF0IGFyZSBub3QNCi0gICAgZXhwbGljdGlseSBkZWZpbmVkKSBhcmUgYWxsb3dlZC4NCi0tLT4NCi08IUVMRU1FTlQgY29tcG9uZW50LXNwZWNpZmljYXRpb24gKGRlc2NyaXB0aW9uPywgcGFyYW1ldGVyKiwgcmVzZXJ2ZWQtcGFyYW1ldGVyKiwgcHJvcGVydHkqLCAoYmVhbiB8IGNvbXBvbmVudCB8IGV4dGVybmFsLWFzc2V0IHwgY29udGV4dC1hc3NldCB8IHByaXZhdGUtYXNzZXQgfCBwcm9wZXJ0eS1zcGVjaWZpY2F0aW9uKSopPg0KLTwhQVRUTElTVCBjb21wb25lbnQtc3BlY2lmaWNhdGlvbg0KLQljbGFzcyBDREFUQSAjSU1QTElFRA0KLQlhbGxvdy1ib2R5ICVhdHRyaWJ1dGUtZmxhZzsgInllcyINCi0JYWxsb3ctaW5mb3JtYWwtcGFyYW1ldGVycyAlYXR0cmlidXRlLWZsYWc7ICJ5ZXMiDQotPg0KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLUVsZW1lbnQ6IGNvbnRleHQtYXNzZXQNCi1Db250YWluZWQgYnk6IGNvbXBvbmVudC1zcGVjaWZpY2F0aW9uLCBwYWdlLXNwZWNpZmljYXRpb24NCi0NCi1BbiBhc3NldCBsb2NhdGVkIGluIHRoZSBzYW1lIHdlYiBhcHBsaWNhdGlvbiBjb250ZXh0IGFzIHRoZSBydW5uaW5nDQotYXBwbGljYXRpb24uDQotDQotQXR0cmlidXRlczoNCi0gIG5hbWU6IFRoZSBuYW1lIG9mIHRoZSBhc3NldC4NCi0gIHBhdGg6IFRoZSBwYXRoLCByZWxhdGl2ZSB0byB0aGUgd2ViIGFwcGxpY2F0aW9uIGNvbnRleHQsIG9mIHRoZSByZXNvdXJjZS4NCi0tLT4NCi08IUVMRU1FTlQgY29udGV4dC1hc3NldCAocHJvcGVydHkqKT4NCi08IUFUVExJU1QgY29udGV4dC1hc3NldA0KLQluYW1lIENEQVRBICNSRVFVSVJFRA0KLQlwYXRoIENEQVRBICNSRVFVSVJFRA0KLT4NCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi1FbGVtZW50OiBkZXNjcmlwdGlvbg0KLUFwcGVhcnMgaW46IG1hbnkNCi0NCi1TZXZlcmFsIGVsZW1lbnRzIG1heSBjb250YWluIGRlc2NyaXB0aW9uczsgdGhlc2UgZGVzY3JpcHRpb25zIGFyZQ0KLW9wdGlvbmFsLiAgVGhlIGV2ZW50dWFsIGdvYWwgaXMgdG8gcHJvdmlkZSBoZWxwIGluIHNvbWUgZm9ybSBvZiBJREUuDQotQ3VycmVudGx5LCBkZXNjcmlwdGlvbnMgYXJlIG9wdGlvbmFsIGFuZCBpZ25vcmVkLg0KLQ0KLS0tPg0KLTwhRUxFTUVOVCBkZXNjcmlwdGlvbiAoI1BDREFUQSk+DQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotRWxlbWVudDogZXh0ZW5zaW9uDQotQ29udGFpbmVkIGJ5OiBhcHBsaWNhdGlvbiwgbGlicmFyeS1zcGVjaWZpY2F0aW9uDQotDQotRGVmaW5lcyBhbiBleHRlbnNpb24sIGFuIG9iamVjdCB0aGF0IGlzIGluc3RhbnRpYXRlZCBhbmQgY29uZmlndXJlZA0KLShsaWtlIGEgaGVscGVyIGJlYW4pIGFuZCBpcyB0aGVuIGFjY2Vzc2libGUsIGJ5IG5hbWUsIGZyb20gdGhlDQotY29udGFpbmluZyBsaWJyYXJ5IChvciBhcHBsaWNhdGlvbikuDQotDQotQXR0cmlidXRlczoNCi0gIG5hbWU6IE5hbWUgb2YgdGhlIGV4dGVuc2lvbi4NCi0gIGNsYXNzOiBKYXZhIGNsYXNzIHRvIGluc3RhbnRpYXRlLg0KLSAgaW1tZWRpYXRlOiBJZiB0cnVlLCB0aGUgZXh0ZW5zaW9uIGlzIGluc3RhbnRpYXRlZCBlYXJseSBpbnN0ZWFkIG9mIGFzLW5lZWRlZC4NCi0gIA0KLS0tPg0KLTwhRUxFTUVOVCBleHRlbnNpb24gKHByb3BlcnR5KiwgY29uZmlndXJlKik+DQotPCFBVFRMSVNUIGV4dGVuc2lvbg0KLQluYW1lIENEQVRBICNSRVFVSVJFRA0KLQljbGFzcyBDREFUQSAjUkVRVUlSRUQNCi0JaW1tZWRpYXRlICVhdHRyaWJ1dGUtZmxhZzsgIm5vIg0KLT4NCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi1FbGVtZW50OiBleHRlcm5hbC1hc3NldA0KLUNvbnRhaW5lZCBieTogY29tcG9uZW50LXNwZWNpZmljYXRpb24sIHBhZ2Utc3BlY2lmaWNhdGlvbg0KLQ0KLURlZmluZXMgYW4gYXNzZXQgYXQgc29tZSBleHRlcm5hbCBzb3VyY2UuDQotDQotQXR0cmlidXRlczoNCi0gIG5hbWU6IFRoZSBuYW1lIG9mIHRoZSBhc3NldC4NCi0gIFVSTDogVGhlIFVSTCB1c2VkIHRvIHJlZmVyZW5jZSB0aGUgYXNzZXQuDQotLS0+DQotPCFFTEVNRU5UIGV4dGVybmFsLWFzc2V0IChwcm9wZXJ0eSopPg0KLTwhQVRUTElTVCBleHRlcm5hbC1hc3NldA0KLQluYW1lIENEQVRBICNSRVFVSVJFRA0KLQlVUkwgQ0RBVEEgI1JFUVVJUkVEDQotPg0KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLUVsZW1lbnQ6IGluaGVyaXRlZC1iaW5kaW5nDQotQXBwZWFycyBpbjogY29tcG9uZW50DQotDQotQmluZHMgYSBwYXJhbWV0ZXIgb2YgdGhlIGNvbXBvbmVudCB0byBhIHBhcmFtZXRlciBvZiB0aGUgY29udGFpbmVyLg0KLQ0KLUF0dHJpYnV0ZXM6DQotICBuYW1lOiBUaGUgbmFtZSBvZiB0aGUgY29tcG9uZW50IHBhcmFtZXRlciB0byBiaW5kLg0KLSAgcGFyYW1ldGVyLW5hbWU6IFRoZSBuYW1lIG9mIHRoZSBjb250YWluZXIgcGFyYW1ldGVyIHRvIGJpbmQgdGhlDQotICAgIGNvbXBvbmVudCBwYXJhbWV0ZXIgdG8uDQotLS0+DQotPCFFTEVNRU5UIGluaGVyaXRlZC1iaW5kaW5nIEVNUFRZPg0KLTwhQVRUTElTVCBpbmhlcml0ZWQtYmluZGluZw0KLQluYW1lIENEQVRBICNSRVFVSVJFRA0KLQlwYXJhbWV0ZXItbmFtZSBDREFUQSAjUkVRVUlSRUQNCi0+DQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotRWxlbWVudDogbGlicmFyeQ0KLUFwcGVhcnMgaW46IGFwcGxpY2F0aW9uLXNwZWNpZmljYXRpb24sIGxpYnJhcnktc3BlY2lmaWNhdGlvbg0KLQ0KLURlZmluZXMgYSBsaWJyYXJ5IHVzZWQgaW4gdGhlIGNvbnN0cnVjdGlvbiBvZiB0aGUgY29udGFpbmVyDQotKGVpdGhlciBhbm90aGVyIGxpYnJhcnksIG9yIHRoZSBhcHBsaWNhdGlvbiBpdHNlbGYpLg0KLQ0KLUF0dHJpYnV0ZXM6DQotICBpZDogQW4gaWRlbnRpZmllciB1c2VkIHRvIHJlZmVyZW5jZSBwYWdlcyBhbmQgY29tcG9uZW50cw0KLSAgICBwcm92aWRlZCBieSB0aGUgbGlicmFyeS4NCi0gIHNwZWNpZmljYXRpb24tcGF0aDogVGhlIHBhdGggdG8gdGhlIHJlc291cmNlIHRoYXQgcHJvdmlkZXMNCi0gICAgdGhlIGxpYnJhcnkgc3BlY2lmaWNhdGlvbi4NCi0tLT4NCi08IUVMRU1FTlQgbGlicmFyeSBFTVBUWT4NCi08IUFUVExJU1QgbGlicmFyeQ0KLQlpZCBDREFUQSAjUkVRVUlSRUQNCi0Jc3BlY2lmaWNhdGlvbi1wYXRoIENEQVRBICNSRVFVSVJFRA0KLT4NCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi1FbGVtZW50OiBsaWJyYXJ5LXNwZWNpZmljYXRpb24NCi1Sb290IGVsZW1lbnQNCi0NCi1EZWZpbmVzIGEgbGlicmFyeSB0aGF0IG1heSBiZSB1c2VkIGluIHRoZSBjb25zdHJ1Y3Rpb24gDQotb2YgYW4gYXBwbGljYXRpb24gKG9yIGFub3RoZXIgbGlicmFyeSkuICBBbiBhcHBsaWNhdGlvbiBjYW4NCi1iZSB0aG91Z2h0IG9mIGFzIGEgc3BlY2lhbGl6ZWQga2luZCBvZiBsaWJyYXJ5Lg0KLQ0KLS0tPg0KLTwhRUxFTUVOVCBsaWJyYXJ5LXNwZWNpZmljYXRpb24gJWxpYnJhcnktY29udGVudDs+DQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotRWxlbWVudDogcGFnZQ0KLUNvbnRhaW5lZCBieTogYXBwbGljYXRpb24sIGxpYnJhcnktc3BlY2lmaWNhdGlvbg0KLQ0KLURlZmluZXMgYSBzaW5nbGUgcGFnZSB3aXRoaW4gdGhlIGFwcGxpY2F0aW9uLiAgRWFjaCBhcHBsaWNhdGlvbiB3aWxsIGNvbnRhaW4NCi1hdCBsZWFzdCBvbmUgb2YgdGhlc2UsIHRvIGRlZmluZSB0aGUgSG9tZSBwYWdlLg0KLQ0KLUF0dHJpYnV0ZXM6DQotICBuYW1lOiBBIHVuaXF1ZSBuYW1lIGZvciB0aGUgYXBwbGljYXRpb24uDQotICBzcGVjaWZpY2F0aW9uLXBhdGg6ICBUaGUgcmVzb3VyY2UgY2xhc3NwYXRoIG9mIHRoZSBjb21wb25lbnQgc3BlY2lmaWNhdGlvbg0KLSAgICBmb3IgdGhlIHBhZ2UuDQotLS0+DQotPCFFTEVNRU5UIHBhZ2UgRU1QVFk+DQotPCFBVFRMSVNUIHBhZ2UNCi0JbmFtZSBDREFUQSAjUkVRVUlSRUQNCi0Jc3BlY2lmaWNhdGlvbi1wYXRoIENEQVRBICNSRVFVSVJFRA0KLT4NCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi1FbGVtZW50OiBsaXN0ZW5lci1iaW5kaW5nDQotQXBwZWFycyBpbjogY29tcG9uZW50DQotDQotRGVmaW5lcyBhbiBpbi1wbGFjZSBzY3JpcHQgdXNpbmcgdGhlIHNjcmlwdGluZyBsYW5ndWFnZQ0KLXN1cHBvcnRlZCBieSBCZWFuIFNjcmlwdGluZyBGcmFtZXdvcmsgKGh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvYnNmKS4NCi1UaGUgc2NyaXB0IGl0c2VsZiBpcyB0aGUgZWxlbWVudCdzIGNoYXJhY3RlciBkYXRhIChvZnRlbiwgaW5zaWRlDQotYSBDREFUQSBibG9jaykuDQotDQotVGhlIGRlZmF1bHQgbGFuZ3VhZ2UgaXMganl0aG9uLCB0aG91Z2ggdGhpcyBjYW4gYmUgb3ZlcnJpZGRlbi4NCi0NCi1BdHRyaWJ1dGVzOg0KLSAgbmFtZTogVGhlIG5hbWUgb2YgdGhlIGNvbXBvbmVudCBwYXJhbWV0ZXIgdG8gYmluZC4NCi0gIGxhbmd1YWdlOiBUaGUgbGFuZ3VhZ2UgdGhlIHNjcmlwdCBpcyB3cml0dGVuIGluLg0KLS0tPg0KLTwhRUxFTUVOVCBsaXN0ZW5lci1iaW5kaW5nICgjUENEQVRBKT4NCi08IUFUVExJU1QgbGlzdGVuZXItYmluZGluZw0KLQluYW1lIENEQVRBICNSRVFVSVJFRA0KLQlsYW5ndWFnZSBDREFUQSAjSU1QTElFRA0KLT4NCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi1FbGVtZW50OiBwYWdlLXNwZWNpZmljYXRpb24NCi1Sb290IGVsZW1lbnQNCi0NCi1BIHBhZ2Ugc3BlY2lmaWNhdGlvbi4gIEl0J3MgYXR0cmlidXRlcyBkZWZpbmUgdGhlIEphdmEgY2xhc3MgdG8NCi1pbnN0YW50aWF0ZS4gIFBhZ2VzIGFyZSBsaWtlIGNvbXBvbmVudHMsIGV4Y2VwdCB0aGV5IGFsd2F5cyBhbGxvdw0KLWEgYm9keSwgYW5kIG5ldmVyIGFsbG93IHBhcmFtZXRlcnMgKGZvcm1hbCBvciBvdGhlcndpc2UpLg0KLQ0KLUF0dHJpYnV0ZXM6DQotICBjbGFzczogVGhlIEphdmEgY2xhc3MgdG8gaW5zdGFudGlhdGUgZm9yIHRoZSBjb21wb25lbnQuDQotLS0+DQotPCFFTEVNRU5UIHBhZ2Utc3BlY2lmaWNhdGlvbiAoZGVzY3JpcHRpb24/LCBwcm9wZXJ0eSosIChiZWFuIHwgY29tcG9uZW50IHwgZXh0ZXJuYWwtYXNzZXQgfCBjb250ZXh0LWFzc2V0IHwgcHJpdmF0ZS1hc3NldCB8IHByb3BlcnR5LXNwZWNpZmljYXRpb24pKik+DQotPCFBVFRMSVNUIHBhZ2Utc3BlY2lmaWNhdGlvbg0KLQljbGFzcyBDREFUQSAjSU1QTElFRA0KLT4NCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi1FbGVtZW50OiBwYXJhbWV0ZXINCi1Db250YWluZWQgYnk6IGNvbXBvbmVudC1zcGVjaWZpY2F0aW9uDQotDQotRGVmaW5lcyBhIGZvcm1hbCBwYXJhbWV0ZXIgZm9yIHRoZSBjb21wb25lbnQuDQotDQotQXR0cmlidXRlczoNCi0gIG5hbWU6IEEgdW5pcXVlIG5hbWUgZm9yIHRoZSBwYXJhbWV0ZXIuDQotICB0eXBlOiBUaGUgbmFtZSBvZiBhIEphdmEgY2xhc3Mgb3IgcHJpbWl0aXZlIHR5cGUgZXhwZWN0ZWQgYnkgdGhlIHBhcmFtZXRlci4NCi0gIHJlcXVpcmVkOiBJZiB5ZXMsIHRoZW4gdGhlIHBhcmFtZXRlciBtdXN0IGJlIGJvdW5kLiAgSWYgbm8gKHRoZSBkZWZhdWx0KSwNCi0gICAgdGhlbiB0aGUgcGFyYW1ldGVyIGlzIG9wdGlvbmFsLg0KLSAgcHJvcGVydHktbmFtZTogVGhlIG5hbWUgdG8gdXNlLCBpbnN0ZWFkIG9mIHRoZSBwYXJhbWV0ZXIgbmFtZSwgZm9yIHRoZQ0KLSAgICBKYXZhQmVhbiBwcm9wZXJ0eSBjb25uZWN0ZWQgdG8gdGhpcyBwYXJhbWV0ZXIuDQotICBkaXJlY3Rpb246IFRoZSBub3JtYWwgZmxvdyBvZiBkYXRhIHRocm91Z2ggdGhlIGNvbXBvbmVudCANCi0gIAkJCShpbiwgZm9ybSwgY3VzdG9tLCBhdXRvKS4NCi0gIGRlZmF1bHQtdmFsdWU6IFNwZWNpZmllcyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHBhcmFtZXRlciwgDQotICAJCQkJaWYgdGhlIHBhcmFtZXRlciBpcyBub3QgYm91bmQuDQotLS0+DQotPCFFTEVNRU5UIHBhcmFtZXRlciAoZGVzY3JpcHRpb24/KT4NCi08IUFUVExJU1QgcGFyYW1ldGVyDQotCW5hbWUgQ0RBVEEgI1JFUVVJUkVEDQotCXR5cGUgQ0RBVEEgI0lNUExJRUQNCi0JcmVxdWlyZWQgJWF0dHJpYnV0ZS1mbGFnOyAibm8iDQotCXByb3BlcnR5LW5hbWUgQ0RBVEEgI0lNUExJRUQNCi0JZGVmYXVsdC12YWx1ZSBDREFUQSAjSU1QTElFRA0KLQlkaXJlY3Rpb24gKGluIHwgZm9ybSB8IGN1c3RvbSB8IGF1dG8pICJjdXN0b20iDQotPg0KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLUVsZW1lbnQ6IHByaXZhdGUtYXNzZXQNCi1Db250YWluZWQgYnk6IGNvbXBvbmVudC1zcGVjaWZpY2F0aW9uLCBwYWdlLXNwZWNpZmljYXRpb24NCi0NCi1BbiBhc3NldCBhdmFpbGFibGUgd2l0aGluIHRoZSBKYXZhIGNsYXNzcGF0aCAoaS5lLiwgYnVuZGxlZCBpbnNpZGUgYSBKQVIgb3IgV0FSKS4NCi0NCi1BdHRyaWJ1dGVzOg0KLSAgbmFtZTogVGhlIG5hbWUgb2YgdGhlIGFzc2V0Lg0KLSAgcmVzb3VyY2UtcGF0aDogVGhlIGNvbXBsZXRlIHBhdGhuYW1lIG9mIHRoZSByZXNvdXJjZS4NCi0tLT4NCi08IUVMRU1FTlQgcHJpdmF0ZS1hc3NldCAocHJvcGVydHkqKT4NCi08IUFUVExJU1QgcHJpdmF0ZS1hc3NldA0KLQluYW1lIENEQVRBICNSRVFVSVJFRA0KLQlyZXNvdXJjZS1wYXRoIENEQVRBICNSRVFVSVJFRA0KLT4NCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi1FbGVtZW50OiBwcm9wZXJ0eQ0KLUNvbnRhaW5lZCBieTogKG1hbnkgb3RoZXIgZWxlbWVudHMpDQotDQotRGVmaW5lcyBhIGtleS92YWx1ZSBwYWlyIGFzc29jaWF0ZWQgd2l0aCB0aGUgYXBwbGljYXRpb24gb3IgY29tcG9uZW50IHNwZWNpZmljYXRpb24uICBQcm9wZXJ0aWVzDQotYXJlIHVzZWQgdG8gY2FwdHVyZSBpbmZvcm1hdGlvbiB0aGF0IGRvZXNuJ3QgZml0IGludG8gdGhlIERURC4gIFRoZSB2YWx1ZSBmb3IgdGhlIHByb3BlcnR5IGlzDQotdGhlIFBDREFUQSB3cmFwcGVkIGJ5IHRoZSBwcm9wZXJ0eSB0YWcgKHdoaWNoIGlzIHRyaW1tZWQgb2YgbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZSkuDQotDQotVGhpcyBzaG91bGQgbm90IGJlIGNvbmZ1c2VkIHdpdGggc2V2ZXJhbCBvdGhlciB0YWdzIHdoaWNoIGFyZSB1c2VkIHRvIHNldCBKYXZhQmVhbnMgcHJvcGVydGllcw0KLW9mIHZhcmlvdXMgb2JqZWN0cy4gIFRoZSA8cHJvcGVydHk+IHRhZyBleGlzdHMgdG8gYWxsb3cgbWV0YS1kYXRhIHRvIGJlIHN0b3JlZCBpbiB0aGUgc3BlY2lmaWNhdGlvbi4NCi0NCi1BdHRyaWJ1dGVzOg0KLSAgbmFtZTogVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIHNldC4NCi0gIHZhbHVlOiBJZiBzcGVjaWZpZWQsIGlzIHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHksIG90aGVyd2lzZSwgdGhlIFBDREFUQSBpcyB1c2VkLg0KLSAgDQotLS0+DQotPCFFTEVNRU5UIHByb3BlcnR5ICgjUENEQVRBKT4NCi08IUFUVExJU1QgcHJvcGVydHkNCi0JbmFtZSBDREFUQSAjUkVRVUlSRUQNCi0JdmFsdWUgQ0RBVEEgI0lNUExJRUQNCi0+DQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotRWxlbWVudDogcHJvcGVydHktc3BlY2lmaWNhdGlvbg0KLUFwcGVhcnMgaW46IHBhZ2Utc3BlY2lmaWNhdGlvbiwgY29tcG9uZW50LXNwZWNpZmljYXRpb24NCi0NCi1JZGVudGlmaWVzIGEgdHJhbnNpZW50IG9yIHBlcnNpc3RlbnQgcHJvcGVydHkuDQotDQotQXR0cmlidXRlczoNCi0gIG5hbWU6IFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eS4NCi0gIHR5cGU6IFRoZSB0eXBlIG9mIHRoZSB2YWx1ZSwgZWl0aGVyIHRoZSBuYW1lIG9mIGEgc2NhbGFyIHR5cGUsDQotICAgIG9yIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhIGNsYXNzLiAgSWYgb21pdHRlZCwNCi0gICAgamF2YS5sYW5nLk9iamVjdCBpcyB1c2VkLg0KLSAgcGVyc2lzdGVudDogSWYgInllcyIsIHRoZSB2YWx1ZSB3aWxsIGJlIG1hZGUgcGVyc2lzdGFudC4gIERlZmF1bHQNCi0gICAgaXMgIm5vIi4NCi0gIGluaXRpYWwtdmFsdWU6ICBJZiBwcm92aWRlZCwgdGhpcyBpcyBhbiBPR05MIGV4cHJlc3Npb24gdXNlZA0KLSAgICB0byBpbml0aWFsaXplIHRoZSBwcm9wZXJ0eS4gIElmIG5vdCBzcGVjaWZpZWQsIHRoZQ0KLSAgICBib2R5IG9mIHRoZSBlbGVtZW50IGlzIHVzZWQgYXMgdGhlIGluaXRpYWwgdmFsdWUuDQotICAgIA0KLS0tPg0KLTwhRUxFTUVOVCBwcm9wZXJ0eS1zcGVjaWZpY2F0aW9uICgjUENEQVRBKT4NCi08IUFUVExJU1QgcHJvcGVydHktc3BlY2lmaWNhdGlvbg0KLQluYW1lIENEQVRBICNSRVFVSVJFRA0KLQl0eXBlIENEQVRBICNJTVBMSUVEDQotCXBlcnNpc3RlbnQgJWF0dHJpYnV0ZS1mbGFnOyAibm8iDQotCWluaXRpYWwtdmFsdWUgQ0RBVEEgI0lNUExJRUQNCi0+DQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotRWxlbWVudDogcmVzZXJ2ZWQtcGFyYW1ldGVyDQotQXBwZWFycyBpbjogY29tcG9uZW50LXNwZWNpZmljYXRpb24NCi0NCi1JZGVudGlmaWVzIGEgbmFtZSB3aGljaCBtYXkgbm90IGJlIHVzZWQgYXMgYW4gaW5mb3JtYWwgcGFyYW1ldGVyLg0KLUluZm9ybWFsIHBhcmFtZXRlcnMgYXJlIHR5cGljYWxseSBIVE1MIGF0dHJpYnV0ZSBuYW1lczsgdGhpcw0KLWxpc3QgaWRlbnRpZmllcyBIVE1MIGF0dHJpYnV0ZXMgdGhhdCBhcmUgd3JpdHRlbiBleGNsdXNpdmVseQ0KLWJ5IHRoZSBjb21wb25lbnQgYW5kIG1heSBub3QgYmUgYWZmZWN0ZWQgYnkgaW5mb3JtYWwgcGFyYW1ldGVycy4NCi0NCi1BdHRyaWJ1dGVzOg0KLSAgbmFtZTogVGhlIHBhcmFtZXRlciBuYW1lIHRvIHJlc2VydmUuDQotLS0+DQotPCFFTEVNRU5UIHJlc2VydmVkLXBhcmFtZXRlciBFTVBUWT4NCi08IUFUVExJU1QgcmVzZXJ2ZWQtcGFyYW1ldGVyDQotCW5hbWUgQ0RBVEEgI1JFUVVJUkVEDQotPg0KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLUVsZW1lbnQ6IHNlcnZpY2UNCi1BcHBlYXJzIGluOiBhcHBsaWNhdGlvbg0KLQ0KLURlZmluZXMgYW4gZW5naW5lIHNlcnZpY2UuICBZb3UgbWF5IG92ZXJyaWRlIHRoZSBkZWZhdWx0DQotc2V0IG9mIGVuZ2luZSBzZXJ2aWNlcyBvciBwcm92aWRlIGNvbXBsZXRlbHkgbmV3IHNlcnZpY2VzLg0KLQ0KLUF0dHJpYnV0ZXM6DQotICBuYW1lOiBUaGUgbmFtZSBvZiB0aGUgc2VydmljZS4NCi0gIGNsYXNzOiBUaGUgSmF2YSBjbGFzcyB0byBpbnN0YW50aWF0ZSBmb3IgdGhlIHNlcnZpY2UuDQotDQotLS0+DQotPCFFTEVNRU5UIHNlcnZpY2UgRU1QVFk+DQotPCFBVFRMSVNUIHNlcnZpY2UNCi0JbmFtZSBDREFUQSAjUkVRVUlSRUQNCi0JY2xhc3MgQ0RBVEEgI1JFUVVJUkVEDQotPg0KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLUVsZW1lbnQ6IHNldC1wcm9wZXJ0eQ0KLUFwcGVhcnMgaW46IGJlYW4NCi0NCi1Vc2VkIHRvIGluaXRpYWxpemUgYSBwcm9wZXJ0eSBvZiBhIGhlbHBlciBiZWFuLiAgQW4gT0dOTCBleHByZXNzaW9uDQotaXMgcHJvdmlkZWQgYXMgdGhlIGV4cHJlc3Npb24gYXR0cmlidXRlLCBvciBhcyB3cmFwcGVkDQotY2hhcmFjdGVyIGRhdGEuDQotDQotQXR0cmlidXRlczoNCi0gIG5hbWU6IFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBiZSBzZXQuDQotICBleHByZXNzaW9uOiBUaGUgT0dOTCBleHByZXNzaW9uIHRoYXQgcHJvdmlkZXMgYSB2YWx1ZS4NCi0tLT4NCi08IUVMRU1FTlQgc2V0LXByb3BlcnR5ICgjUENEQVRBKT4NCi08IUFUVExJU1Qgc2V0LXByb3BlcnR5DQotCW5hbWUgQ0RBVEEgI1JFUVVJUkVEDQotCWV4cHJlc3Npb24gQ0RBVEEgI0lNUExJRUQNCi0+DQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotRWxlbWVudDogc2V0LW1lc3NhZ2UtcHJvcGVydHkNCi1BcHBlYXJzIGluOiBiZWFuDQotDQotQSBsb2NhbGl6ZWQgc3RyaW5nLg0KLQ0KLUF0dHJpYnV0ZXM6DQotICBrZXk6ICBTZXRzIGEgcHJvcGVydHkgb2YgYSBzdHJpbmcgZnJvbSBhIGxvY2FsaXplZCBzdHJpbmcuDQotDQotLS0+DQotPCFFTEVNRU5UIHNldC1tZXNzYWdlLXByb3BlcnR5IEVNUFRZPg0KLTwhQVRUTElTVCBzZXQtbWVzc2FnZS1wcm9wZXJ0eQ0KLQluYW1lIENEQVRBICNSRVFVSVJFRA0KLQlrZXkgQ0RBVEEgI1JFUVVJUkVEDQotPg0KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLUVsZW1lbnQ6IHN0YXRpYy1iaW5kaW5nDQotQXBwZWFycyBpbjogY29tcG9uZW50DQotDQotQmluZHMgYSBwYXJhbWV0ZXIgb2YgdGhlIGNvbXBvbmVudCB0byBhIHN0YXRpYyB2YWx1ZSBkZWZpbmVkIGRpcmVjdGx5DQotd2l0aGluIHRoaXMgc3BlY2lmaWNhdGlvbi4gVGhlIHZhbHVlIGVpdGhlciB0aGUgdmFsdWUgdHRyaWJ1dGUsIG9yDQotdGhlIFBDREFUQSB3cmFwcGVkIGJ5IHRoZSBlbGVtZW50ICh3aXRoIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UgcmVtb3ZlZCkuDQotDQotQXR0cmlidXRlczoNCi0gIG5hbWU6IFRoZSBuYW1lIG9mIHRoZSBjb21wb25lbnQgcGFyYW1ldGVyIHRvIGJpbmQuDQotICB2YWx1ZTogVGhlIHZhbHVlIG9mIHRoZSBiaW5kaW5nLiAgSWYgbm90IHNwZWNpZWQsIHRoZSBQQ0RBVEEgd3JhcHBlZA0KLSAgICBieSB0aGUgZWxlbWVudCBpcyB0aGUgYmluZGluZy4NCi0tLT4NCi08IUVMRU1FTlQgc3RhdGljLWJpbmRpbmcgKCNQQ0RBVEEpPg0KLTwhQVRUTElTVCBzdGF0aWMtYmluZGluZw0KLQluYW1lIENEQVRBICNSRVFVSVJFRA0KLQl2YWx1ZSBDREFUQSAjSU1QTElFRA0KLT4NCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi1FbGVtZW50OiBtZXNzYWdlLWJpbmRpbmcNCi1BcHBlYXJzIGluOiBjb21wb25lbnQNCi0NCi1CaW5kcyBhIHBhcmFtZXRlciBvZiB0aGUgY29tcG9uZW50IHRvIGEgbG9jYWxpemVkIG1lc3NhZ2Ugb2YNCi1pdHMgY29udGFpbmVyLg0KLQ0KLUF0dHJpYnV0ZXM6DQotICBuYW1lOiBUaGUgbmFtZSBvZiB0aGUgY29tcG9uZW50IHBhcmFtZXRlciB0byBiaW5kLg0KLSAga2V5OiBUaGUga2V5IHVzZWQgdG8gYWNjZXNzIGEgbG9jYWxpemVkIHN0cmluZy4NCi0gIA0KLS0tPg0KLTwhRUxFTUVOVCBtZXNzYWdlLWJpbmRpbmcgRU1QVFk+DQotPCFBVFRMSVNUIG1lc3NhZ2UtYmluZGluZw0KLQluYW1lIENEQVRBICNSRVFVSVJFRA0KLQlrZXkgQ0RBVEEgI1JFUVVJUkVEDQotPg0KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9wYXJzZS9UZW1wbGF0ZUF0dHJpYnV0ZS5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3BhcnNlL1RlbXBsYXRlQXR0cmlidXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiZTFhMTIuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3BhcnNlL1RlbXBsYXRlQXR0cmlidXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5wYXJzZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLmJ1aWxkZXIuVG9TdHJpbmdCdWlsZGVyOwotCi0vKioKLSAqICBBbiBhdHRyaWJ1dGUsIGFzc29jaWF0ZWQgd2l0aCBhIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LnBhcnNlLk9wZW5Ub2tlbn0sIHRha2VuCi0gKiAgZnJvbSBhIHRlbXBsYXRlLiAgRWFjaCBhdHRyaWJ1dGUgaGFzIGEgdHlwZSBhbmQgYSB2YWx1ZS4gIFRoZSBpbnRlcnByZXRhdGlvbiBvZiB0aGUKLSAqICB2YWx1ZSBpcyBiYXNlZCBvbiB0aGUgdHlwZS4KLSAqCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogIEB2ZXJzaW9uICRJZCQKLSAqICBAc2luY2UgMy4wCi0gKgotICoqLwotCi1wdWJsaWMgY2xhc3MgVGVtcGxhdGVBdHRyaWJ1dGUKLXsKLQlwcml2YXRlIEF0dHJpYnV0ZVR5cGUgX3R5cGU7Ci0JcHJpdmF0ZSBTdHJpbmcgX3ZhbHVlOwotCQotCXB1YmxpYyBUZW1wbGF0ZUF0dHJpYnV0ZShBdHRyaWJ1dGVUeXBlIHR5cGUsIFN0cmluZyB2YWx1ZSkKLQl7Ci0JCV90eXBlID0gdHlwZTsKLQkJX3ZhbHVlID0gdmFsdWU7Ci0JfQotCQotCXB1YmxpYyBBdHRyaWJ1dGVUeXBlIGdldFR5cGUoKQotCXsKLQkJcmV0dXJuIF90eXBlOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkKLQl7Ci0JCXJldHVybiBfdmFsdWU7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJVG9TdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgVG9TdHJpbmdCdWlsZGVyKHRoaXMpOwotCQlidWlsZGVyLmFwcGVuZCgidHlwZSIsIF90eXBlKTsKLQkJYnVpbGRlci5hcHBlbmQoInZhbHVlIiwgX3ZhbHVlKTsKLQkJCi0JCXJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3BhcnNlL1RlbXBsYXRlUGFyc2VFeGNlcHRpb24uamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9wYXJzZS9UZW1wbGF0ZVBhcnNlRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjODYxZmUuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3BhcnNlL1RlbXBsYXRlUGFyc2VFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LnBhcnNlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JTG9jYXRhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUxvY2F0aW9uOwotCi0vKioKLSAqICBFeGNlcHRpb24gdGhyb3duIGluZGljYXRpbmcgYSBwcm9ibGVtIHBhcnNpbmcgYW4gSFRNTCB0ZW1wbGF0ZS4KLSAqCi0gKiAgQGF1dGhvciBIb3dhcmQgU2hpcAotICogIEB2ZXJzaW9uICRJZCQKLSAqIAotICoqLwotCi1wdWJsaWMgY2xhc3MgVGVtcGxhdGVQYXJzZUV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiBpbXBsZW1lbnRzIElMb2NhdGFibGUKLXsKLSAgICBwcml2YXRlIElMb2NhdGlvbiBfbG9jYXRpb247Ci0gICAgcHJpdmF0ZSBUaHJvd2FibGUgX3Jvb3RDYXVzZTsKLQotICAgIHB1YmxpYyBUZW1wbGF0ZVBhcnNlRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKQotICAgIHsKLSAgICAgICAgdGhpcyhtZXNzYWdlLCBudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVGVtcGxhdGVQYXJzZUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgSUxvY2F0aW9uIGxvY2F0aW9uKQotICAgIHsKLSAgICAgICAgdGhpcyhtZXNzYWdlLCBsb2NhdGlvbiwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFRlbXBsYXRlUGFyc2VFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIElMb2NhdGlvbiBsb2NhdGlvbiwgVGhyb3dhYmxlIHJvb3RDYXVzZSkKLSAgICB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UpOwotCi0gICAgICAgIF9sb2NhdGlvbiA9IGxvY2F0aW9uOwotCi0gICAgICAgIF9yb290Q2F1c2UgPSByb290Q2F1c2U7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgSUxvY2F0aW9uIGdldExvY2F0aW9uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfbG9jYXRpb247Ci0gICAgfQotCi0gICAgcHVibGljIFRocm93YWJsZSBnZXRSb290Q2F1c2UoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9yb290Q2F1c2U7Ci0gICAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3BhcnNlL1RlbXBsYXRlUGFyc2VyLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvcGFyc2UvVGVtcGxhdGVQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU5MjgwNS4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvcGFyc2UvVGVtcGxhdGVQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MTUgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkucGFyc2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUub3JvLnRleHQucmVnZXguTWFsZm9ybWVkUGF0dGVybkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm9yby50ZXh0LnJlZ2V4Lk1hdGNoUmVzdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUub3JvLnRleHQucmVnZXguUGF0dGVybjsKLWltcG9ydCBvcmcuYXBhY2hlLm9yby50ZXh0LnJlZ2V4LlBhdHRlcm5NYXRjaGVyOwotaW1wb3J0IG9yZy5hcGFjaGUub3JvLnRleHQucmVnZXguUGVybDVDb21waWxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm9yby50ZXh0LnJlZ2V4LlBlcmw1TWF0Y2hlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LkFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklMb2NhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZXNvdXJjZUxvY2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuTG9jYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5UYXBlc3RyeTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnV0aWwuSWRBbGxvY2F0b3I7Ci0KLS8qKgotICogIFBhcnNlcyBUYXBlc3RyeSB0ZW1wbGF0ZXMsIGJyZWFraW5nIHRoZW0gaW50byBhIHNlcmllcyBvZgotICogIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LnBhcnNlLlRlbXBsYXRlVG9rZW4gdG9rZW5zfS4KLSAqICBBbHRob3VnaCBvZnRlbiByZWZlcnJlZCB0byBhcyBhbiAiSFRNTCB0ZW1wbGF0ZSIsIHRoZXJlIGlzIG5vIHJlYWwKLSAqICByZXF1aXJlbWVudCB0aGF0IHRoZSB0ZW1wbGF0ZSBiZSBIVE1MLiAgVGhpcyBwYXJzZXIgY2FuIGhhbmRsZQotICogIGFueSByZWFzb25hYmxlIFNHTUwgZGVyaXZlZCBtYXJrdXAgKGluY2x1ZGluZyBYTUwpLCAKLSAqICBidXQgc3BlY2lmaWNhbGx5IHdvcmtzIGFyb3VuZCB0aGUgYW1iaWd1aXRpZXMKLSAqICBvZiBIVE1MIHJlYXNvbmFibHkuCi0gKiAKLSAqICA8cD5EeW5hbWljIG1hcmt1cCBpbiBUYXBlc3RyeSBhdHRlbXB0cyB0byBiZSBpbnZpc2libGUuCi0gKiAgQ29tcG9uZW50cyBhcmUgYXJiaXRyYXJ5IHRhZ3MgY29udGFpbmluZyBhIDxjb2RlPmp3Y2lkPC9jb2RlPiBhdHRyaWJ1dGUuCi0gKiAgU3VjaCBjb21wb25lbnRzIG11c3QgYmUgd2VsbCBiYWxhbmNlZCAoaGF2ZSBhIG1hdGNoaW5nIGNsb3NlIHRhZywgb3IKLSAqICBlbmQgdGhlIHRhZyB3aXRoICI8Y29kZT4vJmd0OzwvY29kZT4iLgotICogCi0gKiAgPHA+R2VuZXJhbGx5LCB0aGUgaWQgc3BlY2lmaWVkIGluIHRoZSB0ZW1wbGF0ZSBpcyBtYXRjaGVkIGFnYWluc3QKLSAqICBhbiBjb21wb25lbnQgZGVmaW5lZCBpbiB0aGUgc3BlY2lmaWNhdGlvbi4gIEhvd2V2ZXIsIGltcGxpY2l0Ci0gKiAgY29tcG9uZW50cyBhcmUgYWxzbyBwb3NzaWJsZS4gIFRoZSBqd2NpZCBhdHRyaWJ1dGUgdXNlcwotICogIHRoZSBzeW50YXggIjxjb2RlPkBUeXBlPC9jb2RlPiIgZm9yIGltcGxpY2l0IGNvbXBvbmVudHMuCi0gKiAgVHlwZSBpcyB0aGUgY29tcG9uZW50IHR5cGUsIGFuZCBtYXkgaW5jbHVkZSBhIGxpYnJhcnkgaWQgcHJlZml4LiAgU3VjaAotICogIGEgY29tcG9uZW50IGlzIGFub255bW91cyAoYnV0IGlzIGdpdmVuIGEgdW5pcXVlIGlkKS4KLSAqIAotICogIDxwPgotICogIChUaGUgdW5pcXVlIGlkcyBhc3NpZ25lZCBzdGFydCB3aXRoIGEgZG9sbGFyIHNpZ24sIHdoaWNoIGlzIG5vcm1hbGx5Ci0gKiAgbm8gYWxsb3dlZCBmb3IgY29tcG9uZW50IGlkcyAuLi4gdGhpcyBoZWxwcyB0byBtYWtlIHRoZW0gc3RhbmQgb3V0Ci0gKiAgYW5kIGFzc3VyZXMgdGhhdCB0aGV5IGRvIG5vdCBjb25mbGljdCB3aXRoCi0gKiAgdXNlci1kZWZpbmVkIGNvbXBvbmVudCBpZHMuICBUaGVzZSBpZHMgdGVuZCB0byBwcm9wYWdhdGUKLSAqICBpbnRvIFVSTHMgYW5kIGJlY29tZSBIVE1MIGVsZW1lbnQgbmFtZXMgYW5kIGV2ZW4gSmF2YVNjcmlwdAotICogIHZhcmlhYmxlIG5hbWVzIC4uLiB0aGUgZG9sbGFyIHNpZ24gaXMgYWNjZXB0aWJsZSBpbiB0aGVzZSBjb250ZXh0cyBhcyAKLSAqICB3ZWxsKS4KLSAqIAotICogIDxwPkltcGxpY2l0IGNvbXBvbmVudCBtYXkgYWxzbyBiZSBnaXZlbiBhIG5hbWUgdXNpbmcgdGhlIHN5bnRheAotICogICI8Y29kZT5jb21wb25lbnRJZDpAVHlwZTwvY29kZT4iLiAgU3VjaCBhIGNvbXBvbmVudCBzaG91bGQKLSAqICA8Yj5ub3Q8L2I+IGJlIGRlZmluZWQgaW4gdGhlIHNwZWNpZmljYXRpb24sIGJ1dCBtYXkgc3RpbGwgYmUKLSAqICBhY2Nlc3NlZCB2aWEge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkuSUNvbXBvbmVudCNnZXRDb21wb25lbnQoU3RyaW5nKX0uCi0gKiAKLSAqICA8cD4KLSAqICBCb3RoIGRlZmluZWQgYW5kIGltcGxpY2l0IGNvbXBvbmVudHMgbWF5IGhhdmUgYWRkaXRpb25hbCBhdHRyaWJ1dGVzCi0gKiAgZGVmaW5lZCwgc2ltcGx5IGJ5IGluY2x1ZGluZyB0aGVtIGluIHRoZSB0ZW1wbGF0ZS4gIFRoZXkgc2V0IGZvcm1hbCBvcgotICogIGluZm9ybWFsIHBhcmFtZXRlcnMgb2YgdGhlIGNvbXBvbmVudCB0byBzdGF0aWMgc3RyaW5ncy4KLSAqICB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5zcGVjLklDb21wb25lbnRTcGVjaWZpY2F0aW9uI2dldEFsbG93SW5mb3JtYWxQYXJhbWV0ZXJzKCl9LAotICogIGlmIGZhbHNlLCB3aWxsIGNhdXNlIHN1Y2ggYXR0cmlidXRlcyB0byBiZSBzaW1wbHkgaWdub3JlZC4gIEZvciBkZWZpbmVkCi0gKiAgY29tcG9uZW50cywgY29uZmxpY3RpbmcgdmFsdWVzIGRlZmluZWQgaW4gdGhlIHRlbXBsYXRlIGFyZSBpZ25vcmVkLgotICogCi0gKiAgPHA+QXR0cmlidXRlcyBpbiBjb21wb25lbnQgdGFncyB3aWxsIGJlY29tZSBmb3JtYWwgYW5kIGluZm9ybWFsIHBhcmFtZXRlcnMKLSAqICBvZiB0aGUgY29ycmVzcG9uZGluZyBjb21wb25lbnQuICBNb3N0IGF0dHJpYnV0ZXMgd2lsbCBiZQotICoKLSAqICA8cD5UaGUgcGFyc2VyIHJlbW92ZXMKLSAqICB0aGUgYm9keSBvZiBzb21lIHRhZ3MgKHdoZW4gdGhlIGNvcnJlc3BvbmRpbmcgY29tcG9uZW50IGRvZXNuJ3QKLSAqICB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5zcGVjLklDb21wb25lbnRTcGVjaWZpY2F0aW9uI2dldEFsbG93Qm9keSgpIGFsbG93IGEgYm9keX0sCi0gKiAgYW5kIGFsbG93cwotICogIHBvcnRpb25zIG9mIHRoZSB0ZW1wbGF0ZSB0byBiZSBjb21wbGV0ZWx5IHJlbW92ZWQuCi0gKgotICogIDxwPlRoZSBwYXJzZXIgZG9lcyBhIHByZXR0eSB0aG9yb3VnaCBsZXhpY2FsIGFuYWx5c2lzIG9mIHRoZSB0ZW1wbGF0ZSwKLSAqICBhbmQgcmVwb3J0cyBhIGdyZWF0IG51bWJlciBvZiBlcnJvcnMsIGluY2x1ZGluZyBpbXByb3BlciBuZXN0aW5nCi0gKiAgb2YgdGFncy4KLSAqCi0gKiAgPHA+VGhlIHBhcnNlciBzdXBwb3J0cyA8ZW0+aW52aXNpYmxlIGxvY2FsaXphdGlvbjwvZW0+OgotICogIFRoZSBwYXJzZXIgcmVjb2duaXplcyBIVE1MIG9mIHRoZSBmb3JtOgotICogIDxjb2RlPiZsdDtzcGFuIGtleT0iPGk+dmFsdWU8L2k+IiZndDsgLi4uICZsdDsvc3BhbiZndDs8L2NvZGU+Ci0gKiAgYW5kIGNvbnZlcnRzIHRoZW0gaW50byBhIHtAbGluayBUb2tlblR5cGUjTE9DQUxJWkFUSU9OfQotICogIHRva2VuLiAgWW91IG1heSBhbHNvIHNwZWNpZmlmeSBhIDxjb2RlPnJhdzwvY29kZT4gYXR0cmlidXRlIC4uLiBpZiB0aGUgdmFsdWUKLSAqICBpcyA8Y29kZT50cnVlPC9jb2RlPiwgdGhlbiB0aGUgbG9jYWxpemVkIHZhbHVlIGlzIAotICogIHNlbnQgdG8gdGhlIGNsaWVudCB3aXRob3V0IGZpbHRlcmluZywgd2hpY2ggaXMgYXBwcm9wcmlhdGUgaWYgdGhlCi0gKiAgdmFsdWUgaGFzIGFueSBtYXJrdXAgdGhhdCBzaG91bGQgbm90IGJlIGVzY2FwZWQuCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAsIEdlb2ZmIExvbmdtYW4KLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAKLSAqKi8KLQotcHVibGljIGNsYXNzIFRlbXBsYXRlUGFyc2VyCi17Ci0gICAgLyoqCi0gICAgICogIEEgRmFjdG9yeSB1c2VkIGJ5IHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LnBhcnNlLlRlbXBsYXRlUGFyc2VyfSB0byBjcmVhdGUgCi0gICAgICogIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LnBhcnNlLlRlbXBsYXRlVG9rZW59IG9iamVjdHMuCi0gICAgICogCi0gICAgICogIDxwPgotICAgICAqICBUaGlzIGNsYXNzIGlzIGV4dGVuZGVkIGJ5IFNwaW5kbGUgLSB0aGUgRWNsaXBzZSBQbHVnaW4gZm9yIFRhcGVzdHJ5LgotICAgICAqICA8cD4KLSAgICAgKiAgQGF1dGhvciBnbG9uZ21hbkBpbnRlbGxpZ2VudHdvcmtzLmNvbQotICAgICAqICBAc2luY2UgMy4wCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBUZW1wbGF0ZVRva2VuRmFjdG9yeQotICAgIHsKLQotICAgICAgICBwdWJsaWMgT3BlblRva2VuIGNyZWF0ZU9wZW5Ub2tlbihTdHJpbmcgdGFnTmFtZSwgU3RyaW5nIGp3Y0lkLCBTdHJpbmcgdHlwZSwgSUxvY2F0aW9uIGxvY2F0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IE9wZW5Ub2tlbih0YWdOYW1lLCBqd2NJZCwgdHlwZSwgbG9jYXRpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIENsb3NlVG9rZW4gY3JlYXRlQ2xvc2VUb2tlbihTdHJpbmcgdGFnTmFtZSwgSUxvY2F0aW9uIGxvY2F0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IENsb3NlVG9rZW4odGFnTmFtZSwgbG9jYXRpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFRleHRUb2tlbiBjcmVhdGVUZXh0VG9rZW4oY2hhcltdIHRlbXBsYXRlRGF0YSwgaW50IGJsb2NrU3RhcnQsIGludCBlbmQsIElMb2NhdGlvbiB0ZW1wbGF0ZUxvY2F0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFRleHRUb2tlbih0ZW1wbGF0ZURhdGEsIGJsb2NrU3RhcnQsIGVuZCwgdGVtcGxhdGVMb2NhdGlvbik7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgTG9jYWxpemF0aW9uVG9rZW4gY3JlYXRlTG9jYWxpemF0aW9uVG9rZW4oCi0gICAgICAgICAgICBTdHJpbmcgdGFnTmFtZSwKLSAgICAgICAgICAgIFN0cmluZyBsb2NhbGl6YXRpb25LZXksCi0gICAgICAgICAgICBib29sZWFuIHJhdywKLSAgICAgICAgICAgIE1hcCBhdHRyaWJ1dGVzLAotICAgICAgICAgICAgSUxvY2F0aW9uIHN0YXJ0TG9jYXRpb24pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgTG9jYWxpemF0aW9uVG9rZW4odGFnTmFtZSwgbG9jYWxpemF0aW9uS2V5LCByYXcsIGF0dHJpYnV0ZXMsIHN0YXJ0TG9jYXRpb24pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEF0dHJpYnV0ZSB2YWx1ZSBwcmVmaXggaW5kaWNhdGluZyB0aGF0IHRoZSBhdHRyaWJ1dGUgaXMgYW4gT0dOTCBleHByZXNzaW9uLgotICAgICAqIAotICAgICAqICBAc2luY2UgMy4wCi0gICAgICoqLwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0dOTF9FWFBSRVNTSU9OX1BSRUZJWCA9ICJvZ25sOiI7Ci0KLSAgICAvKioKLSAgICAgKiAgQXR0cmlidXRlIHZhbHVlIHByZWZpeCBpbmRpY2F0aW5nIHRoYXQgdGhlIGF0dHJpYnV0ZSBpcyBhIGxvY2FsaXphdGlvbgotICAgICAqICBrZXkuCi0gICAgICogCi0gICAgICogIEBzaW5jZSAzLjAKLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NBTElaQVRJT05fS0VZX1BSRUZJWCA9ICJtZXNzYWdlOiI7Ci0KLSAgICAvKioKLSAgICAgKiAgQSAibWFnaWMiIGNvbXBvbmVudCBpZCB0aGF0IGNhdXNlcyB0aGUgdGFnIHdpdGggdGhlIGlkIGFuZCBpdHMgZW50aXJlCi0gICAgICogIGJvZHkgdG8gYmUgaWdub3JlZCBkdXJpbmcgcGFyc2luZy4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRU1PVkVfSUQgPSAiJHJlbW92ZSQiOwotCi0gICAgLyoqCi0gICAgICogQSAibWFnaWMiIGNvbXBvbmVudCBpZCB0aGF0IGNhdXNlcyB0aGUgdGFnIHRvIHJlcHJlc2VudCB0aGUgdHJ1ZQotICAgICAqIGNvbnRlbnQgb2YgdGhlIHRlbXBsYXRlLiAgQW55IGNvbnRlbnQgcHJpb3IgdG8gdGhlIHRhZyBpcyBkaXNjYXJkZWQsCi0gICAgICogYW5kIGFueSBjb250ZW50IGFmdGVyIHRoZSB0YWcgaXMgaWdub3JlZC4gIFRoZSB0YWcgaXRzZWxmIGlzIG5vdAotICAgICAqIGluY2x1ZGVkLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfSUQgPSAiJGNvbnRlbnQkIjsKLQotICAgIC8qKgotICAgICAqICAKLSAgICAgKiAgVGhlIGF0dHJpYnV0ZSwgY2hlY2tlZCBmb3IgaW4gJmx0O3NwYW4mZ3Q7IHRhZ3MsIHRoYXQgc2lnbmZpZXMKLSAgICAgKiAgdGhhdCB0aGUgc3BhbiBpcyBiZWluZyB1c2VkIGFzIGFuIGludmlzaWJsZSBsb2NhbGl6YXRpb24uCi0gICAgICogCi0gICAgICogIEBzaW5jZSAyLjAuNAotICAgICAqIAotICAgICAqKi8KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPQ0FMSVpBVElPTl9LRVlfQVRUUklCVVRFX05BTUUgPSAia2V5IjsKLQotICAgIC8qKgotICAgICAqICBVc2VkIHdpdGgge0BsaW5rICNMT0NBTElaQVRJT05fS0VZX0FUVFJJQlVURV9OQU1FfSB0byBpbmRpY2F0ZSBhIHN0cmluZwotICAgICAqICB0aGF0IHNob3VsZCBiZSByZW5kZXJlZCAicmF3IiAod2l0aG91dCBlc2NhcGluZyBIVE1MKS4gIElmIG5vdCBzcGVjaWZpZWQsCi0gICAgICogIGRlZmF1bHRzIHRvICJmYWxzZSIuICBUaGUgdmFsdWUgbXVzdCBlcXVhbCAidHJ1ZSIgKGNhc2VsZXNzbHkpLgotICAgICAqIAotICAgICAqICBAc2luY2UgMi4zCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkFXX0FUVFJJQlVURV9OQU1FID0gInJhdyI7Ci0KLSAgICAvKioKLSAgICAgKiAgQXR0cmlidXRlIHVzZWQgdG8gaWRlbnRpZnkgY29tcG9uZW50cy4KLSAgICAgKiAKLSAgICAgKiAgQHNpbmNlIDIuMwotICAgICAqIAotICAgICAqKi8KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpXQ0lEX0FUVFJJQlVURV9OQU1FID0gImp3Y2lkIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9OQU1FX1BBVFRFUk4gPSAiXz9bYS16QS1aXVxcdyoiOwotCi0gICAgLyoqCi0gICAgICogIFBhdHRlcm4gdXNlZCB0byByZWNvZ25pemUgb3JkaW5hcnkgY29tcG9uZW50cyAoZGVmaW5lZCBpbiB0aGUgc3BlY2lmaWNhdGlvbikuCi0gICAgICogCi0gICAgICogIEBzaW5jZSAzLjAKLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSU1QTEVfSURfUEFUVEVSTiA9ICJeKCIgKyBQUk9QRVJUWV9OQU1FX1BBVFRFUk4gKyAiKSQiOwotCi0gICAgLyoqCi0gICAgICogIFBhdHRlcm4gdXNlZCB0byByZWNvZ25pemUgaW1wbGljaXQgY29tcG9uZW50cyAod2hvc2UgdHlwZSBpcyBkZWZpbmVkIGluCi0gICAgICogIHRoZSB0ZW1wbGF0ZSkuICBTdWJncm91cCAxIGlzIHRoZSBpZCAod2hpY2ggbWF5IGJlIG51bGwpIGFuZCBzdWJncm91cCAyCi0gICAgICogIGlzIHRoZSB0eXBlICh3aGljaCBtYXkgYmUgcXVhbGlmaWVkIHdpdGggYSBsaWJyYXJ5IHByZWZpeCkuCi0gICAgICogIFN1Ymdyb3VwIDQgaXMgdGhlIGxpYnJhcnkgaWQsIFN1Ymdyb3VwIDUgaXMgdGhlIHNpbXBsZSBjb21wb25lbnQgdHlwZS4KLSAgICAgKiAKLSAgICAgKiAgQHNpbmNlIDMuMAotICAgICAqIAotICAgICAqKi8KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNUExJQ0lUX0lEX1BBVFRFUk4gPQotICAgICAgICAiXigiICsgUFJPUEVSVFlfTkFNRV9QQVRURVJOICsgIik/QCgoKCIgKyBQUk9QRVJUWV9OQU1FX1BBVFRFUk4gKyAiKTopPygiICsgUFJPUEVSVFlfTkFNRV9QQVRURVJOICsgIikpJCI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU1QTElDSVRfSURfUEFUVEVSTl9JRF9HUk9VUCA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElNUExJQ0lUX0lEX1BBVFRFUk5fVFlQRV9HUk9VUCA9IDI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElNUExJQ0lUX0lEX1BBVFRFUk5fTElCUkFSWV9JRF9HUk9VUCA9IDQ7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElNUExJQ0lUX0lEX1BBVFRFUk5fU0lNUExFX1RZUEVfR1JPVVAgPSA1OwotCi0gICAgcHJpdmF0ZSBQYXR0ZXJuIF9zaW1wbGVJZFBhdHRlcm47Ci0gICAgcHJpdmF0ZSBQYXR0ZXJuIF9pbXBsaWNpdElkUGF0dGVybjsKLSAgICBwcml2YXRlIFBhdHRlcm5NYXRjaGVyIF9wYXR0ZXJuTWF0Y2hlcjsKLQotICAgIHByaXZhdGUgSWRBbGxvY2F0b3IgX2lkQWxsb2NhdG9yID0gbmV3IElkQWxsb2NhdG9yKCk7Ci0KLSAgICBwcml2YXRlIElUZW1wbGF0ZVBhcnNlckRlbGVnYXRlIF9kZWxlZ2F0ZTsKLQotICAgIC8qKgotICAgICAqICBJZGVudGlmaWVzIHRoZSB0ZW1wbGF0ZSBiZWluZyBwYXJzZWQ7IHVzZWQgd2l0aCBlcnJvciBtZXNzYWdlcy4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHByaXZhdGUgSVJlc291cmNlTG9jYXRpb24gX3Jlc291cmNlTG9jYXRpb247Ci0KLSAgICAvKioKLSAgICAgKiAgU2hhcmVkIGluc3RhbmNlIG9mIHtAbGluayBMb2NhdGlvbn0gdXNlZCBieQotICAgICAqICBhbGwge0BsaW5rIFRleHRUb2tlbn0gaW5zdGFuY2VzIGluIHRoZSB0ZW1wbGF0ZS4KLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwcml2YXRlIElMb2NhdGlvbiBfdGVtcGxhdGVMb2NhdGlvbjsKLQotICAgIC8qKgotICAgICAqICBMb2NhdGlvbiB3aXRoIGluIHRoZSByZXNvdXJjZSBmb3IgdGhlIGN1cnJlbnQgbGluZS4KLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwcml2YXRlIElMb2NhdGlvbiBfY3VycmVudExvY2F0aW9uOwotCi0gICAgLyoqCi0gICAgICogIExvY2FsIHJlZmVyZW5jZSB0byB0aGUgdGVtcGxhdGUgZGF0YSB0aGF0IGlzIHRvIGJlIHBhcnNlZC4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHByaXZhdGUgY2hhcltdIF90ZW1wbGF0ZURhdGE7Ci0KLSAgICAvKioKLSAgICAgKiAgTGlzdCBvZiBUYWcKLSAgICAgKgotICAgICAqKi8KLQotICAgIHByaXZhdGUgTGlzdCBfc3RhY2sgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBUYWcKLSAgICB7Ci0gICAgICAgIC8vIFRoZSBlbGVtZW50LCBpLmUuLCA8andjPiBvciB2aXJ0dWFsbHkgYW55IG90aGVyIGVsZW1lbnQgKHZpYSBqd2NpZCBhdHRyaWJ1dGUpCi0gICAgICAgIFN0cmluZyBfdGFnTmFtZTsKLSAgICAgICAgLy8gSWYgdHJ1ZSwgdGhlIHRhZyBpcyBhIHBsYWNlaG9sZGVyIGZvciBhIGR5bmFtaWMgZWxlbWVudAotICAgICAgICBib29sZWFuIF9jb21wb25lbnQ7Ci0gICAgICAgIC8vIElmIHRydWUsIHRoZSBib2R5IG9mIHRoZSB0YWcgaXMgYmVpbmcgaWdub3JlZCwgYW5kIHRoZQotICAgICAgICAvLyBpZ25vcmUgZmxhZyBpcyBjbGVhcmVkIHdoZW4gdGhlIGNsb3NlIHRhZyBpcyByZWFjaGVkCi0gICAgICAgIGJvb2xlYW4gX2lnbm9yaW5nQm9keTsKLSAgICAgICAgLy8gSWYgdHJ1ZSwgdGhlbiB0aGUgZW50aXJlIHRhZyAoYW5kIGl0cyBib2R5KSBpcyBiZWluZyBpZ25vcmVkCi0gICAgICAgIGJvb2xlYW4gX3JlbW92ZVRhZzsKLSAgICAgICAgLy8gSWYgdHJ1ZSwgdGhlbiB0aGUgdGFnIG11c3QgaGF2ZSBhIGJhbGFuY2VkIGNsb3NpbmcgdGFnLgotICAgICAgICAvLyBUaGlzIGlzIGFsd2F5cyB0cnVlIGZvciBjb21wb25lbnRzLgotICAgICAgICBib29sZWFuIF9tdXN0QmFsYW5jZTsKLSAgICAgICAgLy8gVGhlIGxpbmUgb24gd2hpY2ggdGhlIHN0YXJ0IHRhZyBleGlzdHMKLSAgICAgICAgaW50IF9saW5lOwotICAgICAgICAvLyBJZiB0cnVlLCB0aGVuIHRoZSBwYXJzZSBlbmRzIHdoZW4gdGhlIGNsb3NpbmcgdGFnIGlzIGZvdW5kLgotICAgICAgICBib29sZWFuIF9jb250ZW50OwotCi0gICAgICAgIFRhZyhTdHJpbmcgdGFnTmFtZSwgaW50IGxpbmUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF90YWdOYW1lID0gdGFnTmFtZTsKLSAgICAgICAgICAgIF9saW5lID0gbGluZTsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gbWF0Y2goU3RyaW5nIG1hdGNoVGFnTmFtZSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIF90YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UobWF0Y2hUYWdOYW1lKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqICBMaXN0IG9mIHtAbGluayBUZW1wbGF0ZVRva2VufSwgdGhpcyBmb3JtcyB0aGUgdWx0aW1hdGUgcmVzcG9uc2UuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwcml2YXRlIExpc3QgX3Rva2VucyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgIC8qKgotICAgICAqICBUaGUgbG9jYXRpb24gb2YgdGhlICdjdXJzb3InIHdpdGhpbiB0aGUgdGVtcGxhdGUgZGF0YS4gIFRoZQotICAgICAqICBhZHZhbmNlKCkgbWV0aG9kIG1vdmVzIHRoaXMgZm9yd2FyZC4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHByaXZhdGUgaW50IF9jdXJzb3I7Ci0KLSAgICAvKioKLSAgICAgKiAgVGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50IGJsb2NrIG9mIHN0YXRpYyB0ZXh0LCBvciAtMSBpZiBubyBibG9jawotICAgICAqICBpcyBhY3RpdmUuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwcml2YXRlIGludCBfYmxvY2tTdGFydDsKLQotICAgIC8qKgotICAgICAqICBUaGUgY3VycmVudCBsaW5lIG51bWJlcjsgdHJhY2tlZCBieSBhZHZhbmNlKCkuICBTdGFydHMgYXQgMS4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHByaXZhdGUgaW50IF9saW5lOwotCi0gICAgLyoqCi0gICAgICogIFNldCB0byB0cnVlIHdoZW4gdGhlIGJvZHkgb2YgYSB0YWcgaXMgYmVpbmcgaWdub3JlZC4gIFRoaXMgaXMgdHlwaWNhbGx5Ci0gICAgICogIHVzZWQgdG8gc2tpcCBvdmVyIHRoZSBib2R5IG9mIGEgdGFnIHdoZW4gaXRzIGNvcnJlc3BvbmRpbmcKLSAgICAgKiAgY29tcG9uZW50IGRvZXNuJ3QgYWxsb3cgYSBib2R5LCBvciB3aGUgdGhlIHNwZWNpYWwKLSAgICAgKiAgandjaWQgb2YgJHJlbW92ZSQgaXMgdXNlZC4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHByaXZhdGUgYm9vbGVhbiBfaWdub3Jpbmc7Ci0KLSAgICAvKioKLSAgICAgKiAgQSB7QGxpbmsgTWFwfSBvZiB7QGxpbmsgU3RyaW5nfXMsIHVzZWQgdG8gc3RvcmUgYXR0cmlidXRlcyBjb2xsZWN0ZWQKLSAgICAgKiAgd2hpbGUgcGFyc2luZyBhIHRhZy4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHByaXZhdGUgTWFwIF9hdHRyaWJ1dGVzID0gbmV3IEhhc2hNYXAoKTsKLQotICAgIC8qKgotICAgICAqICBBIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdGVtcGxhdGUgdG9rZW5zLgotICAgICAqIDxwPgotICAgICAqIGF1dGhvciBnbG9uZ21hbkBpbnRlbGxpZ2VudHdvcmtzLmNvbQotICAgICAqLwotCi0gICAgcHJvdGVjdGVkIFRlbXBsYXRlVG9rZW5GYWN0b3J5IF9mYWN0b3J5OwotCi0gICAgcHVibGljIFRlbXBsYXRlUGFyc2VyKCkKLSAgICB7Ci0gICAgICAgIFBlcmw1Q29tcGlsZXIgY29tcGlsZXIgPSBuZXcgUGVybDVDb21waWxlcigpOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBfc2ltcGxlSWRQYXR0ZXJuID0gY29tcGlsZXIuY29tcGlsZShTSU1QTEVfSURfUEFUVEVSTik7Ci0gICAgICAgICAgICBfaW1wbGljaXRJZFBhdHRlcm4gPSBjb21waWxlci5jb21waWxlKElNUExJQ0lUX0lEX1BBVFRFUk4pOwotICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRQYXR0ZXJuRXhjZXB0aW9uIGV4KQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uKGV4KTsKLSAgICAgICAgfQotCi0gICAgICAgIF9wYXR0ZXJuTWF0Y2hlciA9IG5ldyBQZXJsNU1hdGNoZXIoKTsKLQotICAgICAgICBfZmFjdG9yeSA9IG5ldyBUZW1wbGF0ZVRva2VuRmFjdG9yeSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBQYXJzZXMgdGhlIHRlbXBsYXRlIGRhdGEgaW50byBhbiBhcnJheSBvZiB7QGxpbmsgVGVtcGxhdGVUb2tlbn1zLgotICAgICAqCi0gICAgICogIDxwPlRoZSBwYXJzZXIgaXMgPGk+ZGVjaWRlZGx5PC9pPiBub3QgdGhyZWFkc2FmZSwgc28gY2FyZSBzaG91bGQgYmUgdGFrZW4KLSAgICAgKiAgdGhhdCBvbmx5IGEgc2luZ2xlIHRocmVhZCBhY2Nlc3NlcyBpdC4KLSAgICAgKgotICAgICAqICBAcGFyYW0gdGVtcGxhdGVEYXRhIHRoZSBIVE1MIHRlbXBsYXRlIHRvIHBhcnNlLiAgU29tZSB0b2tlbnMgd2lsbCBob2xkCi0gICAgICogIGEgcmVmZXJlbmNlIHRvIHRoaXMgYXJyYXkuCi0gICAgICogIEBwYXJhbSBkZWxlZ2F0ZSAgb2JqZWN0IHRoYXQgImtub3dzIiBhYm91dCBkZWZpbmVkIGNvbXBvbmVudHMKLSAgICAgKiAgQHBhcmFtIHJlc291cmNlTG9jYXRpb24gYSBkZXNjcmlwdGlvbiBvZiB3aGVyZSB0aGUgdGVtcGxhdGUgb3JpZ2luYXRlZCBmcm9tLAotICAgICAqICB1c2VkIHdpdGggZXJyb3IgbWVzc2FnZXMuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgVGVtcGxhdGVUb2tlbltdIHBhcnNlKAotICAgICAgICBjaGFyW10gdGVtcGxhdGVEYXRhLAotICAgICAgICBJVGVtcGxhdGVQYXJzZXJEZWxlZ2F0ZSBkZWxlZ2F0ZSwKLSAgICAgICAgSVJlc291cmNlTG9jYXRpb24gcmVzb3VyY2VMb2NhdGlvbikKLSAgICAgICAgdGhyb3dzIFRlbXBsYXRlUGFyc2VFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFRlbXBsYXRlVG9rZW5bXSByZXN1bHQgPSBudWxsOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBiZWZvcmVQYXJzZSh0ZW1wbGF0ZURhdGEsIGRlbGVnYXRlLCByZXNvdXJjZUxvY2F0aW9uKTsKLQotICAgICAgICAgICAgcGFyc2UoKTsKLQotICAgICAgICAgICAgcmVzdWx0ID0gKFRlbXBsYXRlVG9rZW5bXSkgX3Rva2Vucy50b0FycmF5KG5ldyBUZW1wbGF0ZVRva2VuW190b2tlbnMuc2l6ZSgpXSk7Ci0gICAgICAgIH0gZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBhZnRlclBhcnNlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBwZXJmb3JtIGRlZmF1bHQgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhcnNlci4KLSAgICAgKiAgPHA+Ci0gICAgICogIGF1dGhvciBnbG9uZ21hbkBpbnRlbGxpZ2VudHdvcmtzLmNvbQotICAgICAqLwotCi0gICAgcHJvdGVjdGVkIHZvaWQgYmVmb3JlUGFyc2UoCi0gICAgICAgIGNoYXJbXSB0ZW1wbGF0ZURhdGEsCi0gICAgICAgIElUZW1wbGF0ZVBhcnNlckRlbGVnYXRlIGRlbGVnYXRlLAotICAgICAgICBJUmVzb3VyY2VMb2NhdGlvbiByZXNvdXJjZUxvY2F0aW9uKQotICAgIHsKLSAgICAgICAgX3RlbXBsYXRlRGF0YSA9IHRlbXBsYXRlRGF0YTsKLSAgICAgICAgX3Jlc291cmNlTG9jYXRpb24gPSByZXNvdXJjZUxvY2F0aW9uOwotICAgICAgICBfdGVtcGxhdGVMb2NhdGlvbiA9IG5ldyBMb2NhdGlvbihyZXNvdXJjZUxvY2F0aW9uKTsKLSAgICAgICAgX2RlbGVnYXRlID0gZGVsZWdhdGU7Ci0gICAgICAgIF9pZ25vcmluZyA9IGZhbHNlOwotICAgICAgICBfbGluZSA9IDE7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFBlcmZvcm0gZGVmYXVsdCBjbGVhbnVwIGFmdGVyIHBhcnNpbmcgY29tcGxldGVzLgotICAgICAqICA8cD4KLSAgICAgKiAgYXV0aG9yIGdsb25nbWFuQGludGVsbGlnZW50d29ya3MuY29tCi0gICAgICovCi0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZnRlclBhcnNlKCkKLSAgICB7Ci0gICAgICAgIF9kZWxlZ2F0ZSA9IG51bGw7Ci0gICAgICAgIF90ZW1wbGF0ZURhdGEgPSBudWxsOwotICAgICAgICBfcmVzb3VyY2VMb2NhdGlvbiA9IG51bGw7Ci0gICAgICAgIF90ZW1wbGF0ZUxvY2F0aW9uID0gbnVsbDsKLSAgICAgICAgX2N1cnJlbnRMb2NhdGlvbiA9IG51bGw7Ci0gICAgICAgIF9zdGFjay5jbGVhcigpOwotICAgICAgICBfdG9rZW5zLmNsZWFyKCk7Ci0gICAgICAgIF9hdHRyaWJ1dGVzLmNsZWFyKCk7Ci0gICAgICAgIF9pZEFsbG9jYXRvci5jbGVhcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVzZWQgYnkgdGhlIHBhcnNlciB0byByZXBvcnQgcHJvYmxlbXMgaW4gdGhlIHBhcnNlLgotICAgICAqIFBhcnNpbmcgPGI+bXVzdDwvYj4gc3RvcCB3aGVuIGEgcHJvYmxlbSBpcyByZXBvcnRlZC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBzaW1wbHkgdGhyb3dzIGFuIGV4Y2VwdGlvbiB0aGF0IGNvbnRhaW5zCi0gICAgICogdGhlIG1lc3NhZ2UgYW5kIGxvY2F0aW9uIHBhcmFtZXRlcnMuCi0gICAgICogPHA+Ci0gICAgICogU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgYnV0IDxiPm11c3Q8L2I+IGVuc3VyZSB0aGV5IHRocm93IHRoZSByZXF1aXJlZCBleGNlcHRpb24uCi0gICAgICogPHA+Ci0gICAgICoKLSAgICAgKiBhdXRob3IgZ2xvbmdtYW5AaW50ZWxsaWdlbnR3b3Jrcy5jb20KLSAgICAgKiAgCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gbG9jYXRpb24KLSAgICAgKiBAcGFyYW0gbGluZSBpZ25vcmVkIGJ5IHRoZSBkZWZhdWx0IGltcGwKLSAgICAgKiBAcGFyYW0gY3Vyc29yIGlnbm9yZWQgYnkgdGhlIGRlZmF1bHQgaW1wbAotICAgICAqIEB0aHJvd3MgVGVtcGxhdGVQYXJzZUV4Y2VwdGlvbiBhbHdheXMgdGhyb3duIGluIG9yZGVyIHRvIHRlcm1pbmF0ZSB0aGUgcGFyc2UuCi0gICAgICovCi0KLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZW1wbGF0ZVBhcnNlUHJvYmxlbShTdHJpbmcgbWVzc2FnZSwgSUxvY2F0aW9uIGxvY2F0aW9uLCBpbnQgbGluZSwgaW50IGN1cnNvcikKLSAgICAgICAgdGhyb3dzIFRlbXBsYXRlUGFyc2VFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHRocm93IG5ldyBUZW1wbGF0ZVBhcnNlRXhjZXB0aW9uKG1lc3NhZ2UsIGxvY2F0aW9uKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVc2VkIGJ5IHRoZSBwYXJzZXIgdG8gcmVwb3J0IHRhcGVzdHJ5IHJ1bnRpbWUgc3BlY2lmaWMgcHJvYmxlbXMgaW4gdGhlIHBhcnNlLgotICAgICAqIFBhcnNpbmcgPGI+bXVzdDwvYj4gc3RvcCB3aGVuIGEgcHJvYmxlbSBpcyByZXBvcnRlZC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBzaW1wbHkgcmV0aHJvd3MgdGhlIGV4Y2VwdGlvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSBidXQgPGI+bXVzdDwvYj4gZW5zdXJlIHRoZXkgcmV0aHJvdyB0aGUgZXhjZXB0aW9uLgotICAgICAqIDxwPgotICAgICAqCi0gICAgICogYXV0aG9yIGdsb25nbWFuQGludGVsbGlnZW50d29ya3MuY29tCi0gICAgICogIAotICAgICAqIEBwYXJhbSBleGNlcHRpb24KLSAgICAgKiBAcGFyYW0gbGluZSBpZ25vcmVkIGJ5IHRoZSBkZWZhdWx0IGltcGwKLSAgICAgKiBAcGFyYW0gY3Vyc29yIGlnbm9yZWQgYnkgdGhlIGRlZmF1bHQgaW1wbAotICAgICAqIEB0aHJvd3MgQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uIGFsd2F5cyByZXRocm93biBpbiBvcmRlciB0byB0ZXJtaW5hdGUgdGhlIHBhcnNlLgotICAgICAqLwotCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVtcGxhdGVQYXJzZVByb2JsZW0oQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uIGV4Y2VwdGlvbiwgaW50IGxpbmUsIGludCBjdXJzb3IpCi0gICAgICAgIHRocm93cyBBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHRocm93IGV4Y2VwdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHaXZlIHN1YmNsYXNzZXMgYWNjZXNzIHRvIHRoZSBwYXJzZSByZXN1bHRzLgotICAgICAqIDxwPgotICAgICAqCi0gICAgICogYXV0aG9yIGdsb25nbWFuQGludGVsbGlnZW50d29ya3MuY29tCi0gICAgICovCi0gICAgcHJvdGVjdGVkIExpc3QgZ2V0VG9rZW5zKCkKLSAgICB7Ci0gICAgICAgIGlmIChfdG9rZW5zID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQotICAgICAgICByZXR1cm4gX3Rva2VuczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgQ2hlY2tzIHRvIHNlZSBpZiB0aGUgbmV4dCBmZXcgY2hhcmFjdGVycyBtYXRjaCBhIGdpdmVuIHBhdHRlcm4uCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwcml2YXRlIGJvb2xlYW4gbG9va2FoZWFkKGNoYXJbXSBtYXRjaCkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1hdGNoLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChfdGVtcGxhdGVEYXRhW19jdXJzb3IgKyBpXSAhPSBtYXRjaFtpXSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBFdmVyeSBjaGFyYWN0ZXIgbWF0Y2hlZC4KLQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZXgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBDT01NRU5UX1NUQVJUID0gbmV3IGNoYXJbXSB7ICc8JywgJyEnLCAnLScsICctJyB9OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBDT01NRU5UX0VORCA9IG5ldyBjaGFyW10geyAnLScsICctJywgJz4nIH07Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIENMT1NFX1RBRyA9IG5ldyBjaGFyW10geyAnPCcsICcvJyB9OwotCi0gICAgcHJvdGVjdGVkIHZvaWQgcGFyc2UoKSB0aHJvd3MgVGVtcGxhdGVQYXJzZUV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgX2N1cnNvciA9IDA7Ci0gICAgICAgIF9ibG9ja1N0YXJ0ID0gLTE7Ci0gICAgICAgIGludCBsZW5ndGggPSBfdGVtcGxhdGVEYXRhLmxlbmd0aDsKLQotICAgICAgICB3aGlsZSAoX2N1cnNvciA8IGxlbmd0aCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF90ZW1wbGF0ZURhdGFbX2N1cnNvcl0gIT0gJzwnKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChfYmxvY2tTdGFydCA8IDAgJiYgIV9pZ25vcmluZykKLSAgICAgICAgICAgICAgICAgICAgX2Jsb2NrU3RhcnQgPSBfY3Vyc29yOwotCi0gICAgICAgICAgICAgICAgYWR2YW5jZSgpOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBPSywgc3RhcnQgb2Ygc29tZXRoaW5nLgotCi0gICAgICAgICAgICBpZiAobG9va2FoZWFkKENMT1NFX1RBRykpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2xvc2VUYWcoKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGxvb2thaGVhZChDT01NRU5UX1NUQVJUKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBza2lwQ29tbWVudCgpOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBUaGUgc3RhcnQgb2Ygc29tZSB0YWcuCi0KLSAgICAgICAgICAgIHN0YXJ0VGFnKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBVc3VhbGx5IHRoZXJlJ3Mgc29tZSB0ZXh0IGF0IHRoZSBlbmQgb2YgdGhlIHRlbXBsYXRlIChhZnRlciB0aGUgbGFzdCBjbG9zaW5nIHRhZykgdGhhdCBzaG91bGQKLSAgICAgICAgLy8gYmUgYWRkZWQuICBPZnRlbiB0aGUgbGFzdCBmZXcgdGFncyBhcmUgc3RhdGljIHRhZ3Mgc28gd2UgZGVmaW5hdGVseQotICAgICAgICAvLyBuZWVkIHRvIGVuZCB0aGUgdGV4dCBibG9jay4KLQotICAgICAgICBhZGRUZXh0VG9rZW4oX3RlbXBsYXRlRGF0YS5sZW5ndGggLSAxKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgQWR2YW5jZSBmb3J3YXJkIGluIHRoZSBkb2N1bWVudCB1bnRpbCB0aGUgZW5kIG9mIHRoZSBjb21tZW50IGlzIHJlYWNoZWQuCi0gICAgICogIEluIGFkZGl0aW9uLCBza2lwIGFueSB3aGl0ZXNwYWNlIGZvbGxvd2luZyB0aGUgY29tbWVudC4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHByaXZhdGUgdm9pZCBza2lwQ29tbWVudCgpIHRocm93cyBUZW1wbGF0ZVBhcnNlRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpbnQgbGVuZ3RoID0gX3RlbXBsYXRlRGF0YS5sZW5ndGg7Ci0gICAgICAgIGludCBzdGFydExpbmUgPSBfbGluZTsKLQotICAgICAgICBpZiAoX2Jsb2NrU3RhcnQgPCAwICYmICFfaWdub3JpbmcpCi0gICAgICAgICAgICBfYmxvY2tTdGFydCA9IF9jdXJzb3I7Ci0KLSAgICAgICAgd2hpbGUgKHRydWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChfY3Vyc29yID49IGxlbmd0aCkKLSAgICAgICAgICAgICAgICB0ZW1wbGF0ZVBhcnNlUHJvYmxlbSgKLSAgICAgICAgICAgICAgICAgICAgVGFwZXN0cnkuZm9ybWF0KCJUZW1wbGF0ZVBhcnNlci5jb21tZW50LW5vdC1lbmRlZCIsIEludGVnZXIudG9TdHJpbmcoc3RhcnRMaW5lKSksCi0gICAgICAgICAgICAgICAgICAgIG5ldyBMb2NhdGlvbihfcmVzb3VyY2VMb2NhdGlvbiwgc3RhcnRMaW5lKSwKLSAgICAgICAgICAgICAgICAgICAgc3RhcnRMaW5lLAotICAgICAgICAgICAgICAgICAgICBfY3Vyc29yKTsKLQotICAgICAgICAgICAgaWYgKGxvb2thaGVhZChDT01NRU5UX0VORCkpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIC8vIE5vdCB0aGUgZW5kIG9mIHRoZSBjb21tZW50LCBhZHZhbmNlIG92ZXIgaXQuCi0KLSAgICAgICAgICAgIGFkdmFuY2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIF9jdXJzb3IgKz0gQ09NTUVOVF9FTkQubGVuZ3RoOwotICAgICAgICBhZHZhbmNlT3ZlcldoaXRlc3BhY2UoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkVGV4dFRva2VuKGludCBlbmQpCi0gICAgewotICAgICAgICAvLyBObyBhY3RpdmUgYmxvY2sgdG8gYWRkIHRvLgotCi0gICAgICAgIGlmIChfYmxvY2tTdGFydCA8IDApCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgaWYgKF9ibG9ja1N0YXJ0IDw9IGVuZCkKLSAgICAgICAgewotICAgICAgICAgICAgVGVtcGxhdGVUb2tlbiB0b2tlbiA9IF9mYWN0b3J5LmNyZWF0ZVRleHRUb2tlbihfdGVtcGxhdGVEYXRhLCBfYmxvY2tTdGFydCwgZW5kLCBfdGVtcGxhdGVMb2NhdGlvbik7Ci0KLSAgICAgICAgICAgIF90b2tlbnMuYWRkKHRva2VuKTsKLSAgICAgICAgfQotCi0gICAgICAgIF9ibG9ja1N0YXJ0ID0gLTE7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFdBSVRfRk9SX0FUVFJJQlVURV9OQU1FID0gMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09MTEVDVF9BVFRSSUJVVEVfTkFNRSA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFEVkFOQ0VfUEFTVF9FUVVBTFMgPSAyOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBXQUlUX0ZPUl9BVFRSSUJVVEVfVkFMVUUgPSAzOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT0xMRUNUX1FVT1RFRF9WQUxVRSA9IDQ7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPTExFQ1RfVU5RVU9URURfVkFMVUUgPSA1OwotCi0gICAgcHJpdmF0ZSB2b2lkIHN0YXJ0VGFnKCkgdGhyb3dzIFRlbXBsYXRlUGFyc2VFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGludCBjdXJzb3JTdGFydCA9IF9jdXJzb3I7Ci0gICAgICAgIGludCBsZW5ndGggPSBfdGVtcGxhdGVEYXRhLmxlbmd0aDsKLSAgICAgICAgU3RyaW5nIHRhZ05hbWUgPSBudWxsOwotICAgICAgICBib29sZWFuIGVuZE9mVGFnID0gZmFsc2U7Ci0gICAgICAgIGJvb2xlYW4gZW1wdHlUYWcgPSBmYWxzZTsKLSAgICAgICAgaW50IHN0YXJ0TGluZSA9IF9saW5lOwotICAgICAgICBJTG9jYXRpb24gc3RhcnRMb2NhdGlvbiA9IG5ldyBMb2NhdGlvbihfcmVzb3VyY2VMb2NhdGlvbiwgc3RhcnRMaW5lKTsKLQotICAgICAgICB0YWdCZWdpbkV2ZW50KHN0YXJ0TGluZSwgX2N1cnNvcik7Ci0KLSAgICAgICAgYWR2YW5jZSgpOwotCi0gICAgICAgIC8vIENvbGxlY3QgdGhlIGVsZW1lbnQgdHlwZQotCi0gICAgICAgIHdoaWxlIChfY3Vyc29yIDwgbGVuZ3RoKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGFyIGNoID0gX3RlbXBsYXRlRGF0YVtfY3Vyc29yXTsKLQotICAgICAgICAgICAgaWYgKGNoID09ICcvJyB8fCBjaCA9PSAnPicgfHwgQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShjaCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGFnTmFtZSA9IG5ldyBTdHJpbmcoX3RlbXBsYXRlRGF0YSwgY3Vyc29yU3RhcnQgKyAxLCBfY3Vyc29yIC0gY3Vyc29yU3RhcnQgLSAxKTsKLQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBhZHZhbmNlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgYXR0cmlidXRlTmFtZSA9IG51bGw7Ci0gICAgICAgIGludCBhdHRyaWJ1dGVOYW1lU3RhcnQgPSAtMTsKLSAgICAgICAgaW50IGF0dHJpYnV0ZVZhbHVlU3RhcnQgPSAtMTsKLSAgICAgICAgaW50IHN0YXRlID0gV0FJVF9GT1JfQVRUUklCVVRFX05BTUU7Ci0gICAgICAgIGNoYXIgcXVvdGVDaGFyID0gMDsKLQotICAgICAgICBfYXR0cmlidXRlcy5jbGVhcigpOwotCi0gICAgICAgIC8vIENvbGxlY3QgZWFjaCBhdHRyaWJ1dGUKLQotICAgICAgICB3aGlsZSAoIWVuZE9mVGFnKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoX2N1cnNvciA+PSBsZW5ndGgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9ICh0YWdOYW1lID09IG51bGwpID8gIlRlbXBsYXRlUGFyc2VyLnVuY2xvc2VkLXVua25vd24tdGFnIiA6ICJUZW1wbGF0ZVBhcnNlci51bmNsb3NlZC10YWciOwotCi0gICAgICAgICAgICAgICAgdGVtcGxhdGVQYXJzZVByb2JsZW0oCi0gICAgICAgICAgICAgICAgICAgIFRhcGVzdHJ5LmZvcm1hdChrZXksIHRhZ05hbWUsIEludGVnZXIudG9TdHJpbmcoc3RhcnRMaW5lKSksCi0gICAgICAgICAgICAgICAgICAgIHN0YXJ0TG9jYXRpb24sCi0gICAgICAgICAgICAgICAgICAgIHN0YXJ0TGluZSwKLSAgICAgICAgICAgICAgICAgICAgY3Vyc29yU3RhcnQpOwotCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNoYXIgY2ggPSBfdGVtcGxhdGVEYXRhW19jdXJzb3JdOwotCi0gICAgICAgICAgICBzd2l0Y2ggKHN0YXRlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgV0FJVF9GT1JfQVRUUklCVVRFX05BTUUgOgotCi0gICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSB3aGl0ZXNwYWNlIGJlZm9yZSB0aGUgbmV4dCBhdHRyaWJ1dGUgbmFtZSwgd2hpbGUKLSAgICAgICAgICAgICAgICAgICAgLy8gbG9va2luZyBmb3IgdGhlIGVuZCBvZiB0aGUgY3VycmVudCB0YWcuCi0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09ICcvJykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZW1wdHlUYWcgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgYWR2YW5jZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJz4nKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbmRPZlRhZyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGNoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYWR2YW5jZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvLyBGb3VuZCBub24td2hpdGVzcGFjZSwgYXNzdW1lIGl0cyB0aGUgYXR0cmlidXRlIG5hbWUuCi0gICAgICAgICAgICAgICAgICAgIC8vIE5vdGU6IGNvdWxkIHVzZSBhIGNoZWNrIGhlcmUgZm9yIG5vbi1hbHBoYS4KLQotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVOYW1lU3RhcnQgPSBfY3Vyc29yOwotICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IENPTExFQ1RfQVRUUklCVVRFX05BTUU7Ci0gICAgICAgICAgICAgICAgICAgIGFkdmFuY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIENPTExFQ1RfQVRUUklCVVRFX05BTUUgOgotCi0gICAgICAgICAgICAgICAgICAgIC8vIExvb2tpbmcgZm9yIGVuZCBvZiBhdHRyaWJ1dGUgbmFtZS4KLQotICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJz0nIHx8IGNoID09ICcvJyB8fCBjaCA9PSAnPicgfHwgQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShjaCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZU5hbWUgPSBuZXcgU3RyaW5nKF90ZW1wbGF0ZURhdGEsIGF0dHJpYnV0ZU5hbWVTdGFydCwgX2N1cnNvciAtIGF0dHJpYnV0ZU5hbWVTdGFydCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gQURWQU5DRV9QQVNUX0VRVUFMUzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gUGFydCBvZiB0aGUgYXR0cmlidXRlIG5hbWUKLQotICAgICAgICAgICAgICAgICAgICBhZHZhbmNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBBRFZBTkNFX1BBU1RfRVFVQUxTIDoKLQotICAgICAgICAgICAgICAgICAgICAvLyBMb29raW5nIGZvciB0aGUgJz0nIHNpZ24uICBNYXkgaGl0IHRoZSBlbmQgb2YgdGhlIHRhZywgb3IgKGZvciBiYXJlIGF0dHJpYnV0ZXMpLAotICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbmV4dCBhdHRyaWJ1dGUgbmFtZS4KLQotICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJy8nIHx8IGNoID09ICc+JykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBiYXJlIGF0dHJpYnV0ZSwgd2hpY2ggaXMgbm90IGludGVyZXN0aW5nIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyB1cy4KLQotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBXQUlUX0ZPUl9BVFRSSUJVVEVfTkFNRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKENoYXJhY3Rlci5pc1doaXRlc3BhY2UoY2gpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZHZhbmNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnPScpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gV0FJVF9GT1JfQVRUUklCVVRFX1ZBTFVFOwotICAgICAgICAgICAgICAgICAgICAgICAgcXVvdGVDaGFyID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlU3RhcnQgPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkdmFuY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCBhbiBIVE1MIHN0eWxlICJiYXJlIiBhdHRyaWJ1dGUgKHN1Y2ggYXMgPHNlbGVjdCBtdWx0aXBsZT4pLgotICAgICAgICAgICAgICAgICAgICAvLyBXZSBhcmVuJ3QgaW50ZXJlc3RlZCBpbiB0aG9zZSAod2UncmUganVzdCBsb29raW5nIGZvciB0aGUgaWQgb3IgandjaWQgYXR0cmlidXRlKS4KLQotICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IFdBSVRfRk9SX0FUVFJJQlVURV9OQU1FOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgV0FJVF9GT1JfQVRUUklCVVRFX1ZBTFVFIDoKLQotICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJy8nIHx8IGNoID09ICc+JykKLSAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlUGFyc2VQcm9ibGVtKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhcGVzdHJ5LmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRlbXBsYXRlUGFyc2VyLm1pc3NpbmctYXR0cmlidXRlLXZhbHVlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhfbGluZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZU5hbWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEN1cnJlbnRMb2NhdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9saW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jdXJzb3IpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSB3aGl0ZXNwYWNlIGJldHdlZW4gJz0nIGFuZCB0aGUgYXR0cmlidXRlIHZhbHVlLiAgQWxzbywgbG9vawotICAgICAgICAgICAgICAgICAgICAvLyBmb3IgaW5pdGlhbCBxdW90ZS4KLQotICAgICAgICAgICAgICAgICAgICBpZiAoQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShjaCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkdmFuY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09ICdcJycgfHwgY2ggPT0gJyInKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBxdW90ZUNoYXIgPSBjaDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBDT0xMRUNUX1FVT1RFRF9WQUxVRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkdmFuY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlU3RhcnQgPSBfY3Vyc29yOwotICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlQmVnaW5FdmVudChhdHRyaWJ1dGVOYW1lLCBfbGluZSwgYXR0cmlidXRlVmFsdWVTdGFydCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8vIE5vdCB3aGl0ZXNwYWNlIG9yIHF1b3RlLCBtdXN0IGJlIHN0YXJ0IG9mIHVucXVvdGVkIGF0dHJpYnV0ZS4KLQotICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IENPTExFQ1RfVU5RVU9URURfVkFMVUU7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlU3RhcnQgPSBfY3Vyc29yOwotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVCZWdpbkV2ZW50KGF0dHJpYnV0ZU5hbWUsIF9saW5lLCBhdHRyaWJ1dGVWYWx1ZVN0YXJ0KTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIENPTExFQ1RfUVVPVEVEX1ZBTFVFIDoKLQotICAgICAgICAgICAgICAgICAgICAvLyBTdGFydCBjb2xsZWN0aW5nIHRoZSBxdW90ZWQgYXR0cmlidXRlIHZhbHVlLiAgU3RvcCBhdCB0aGUgbWF0Y2hpbmcgcXVvdGUgY2hhcmFjdGVyLAotICAgICAgICAgICAgICAgICAgICAvLyB1bmxlc3MgYmFyZSwgaW4gd2hpY2ggY2FzZSwgc3RvcCBhdCB0aGUgbmV4dCB3aGl0ZXNwYWNlLgotCi0gICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSBxdW90ZUNoYXIpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhdHRyaWJ1dGVWYWx1ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZyhfdGVtcGxhdGVEYXRhLCBhdHRyaWJ1dGVWYWx1ZVN0YXJ0LCBfY3Vyc29yIC0gYXR0cmlidXRlVmFsdWVTdGFydCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVFbmRFdmVudChfY3Vyc29yKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9hdHRyaWJ1dGVzLmNvbnRhaW5zS2V5KGF0dHJpYnV0ZU5hbWUpKQotICAgICAgICAgICAgICAgICAgICAgICAgCXRlbXBsYXRlUGFyc2VQcm9ibGVtKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFwZXN0cnkuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUZW1wbGF0ZVBhcnNlci5kdXBsaWNhdGUtdGFnLWF0dHJpYnV0ZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKF9saW5lKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVOYW1lKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEN1cnJlbnRMb2NhdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2xpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY3Vyc29yKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgX2F0dHJpYnV0ZXMucHV0KGF0dHJpYnV0ZU5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWR2YW5jZSBvdmVyIHRoZSBxdW90ZS4KLSAgICAgICAgICAgICAgICAgICAgICAgIGFkdmFuY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gV0FJVF9GT1JfQVRUUklCVVRFX05BTUU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGFkdmFuY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIENPTExFQ1RfVU5RVU9URURfVkFMVUUgOgotCi0gICAgICAgICAgICAgICAgICAgIC8vIEFuIHVucXVvdGVkIGF0dHJpYnV0ZSB2YWx1ZSBlbmRzIHdpdGggd2hpdGVzcGFjZSAKLSAgICAgICAgICAgICAgICAgICAgLy8gb3IgdGhlIGVuZCBvZiB0aGUgZW5jbG9zaW5nIHRhZy4KLQotICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJy8nIHx8IGNoID09ICc+JyB8fCBDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGNoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZVZhbHVlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nKF90ZW1wbGF0ZURhdGEsIGF0dHJpYnV0ZVZhbHVlU3RhcnQsIF9jdXJzb3IgLSBhdHRyaWJ1dGVWYWx1ZVN0YXJ0KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlRW5kRXZlbnQoX2N1cnNvcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfYXR0cmlidXRlcy5jb250YWluc0tleShhdHRyaWJ1dGVOYW1lKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIAl0ZW1wbGF0ZVBhcnNlUHJvYmxlbSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhcGVzdHJ5LmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGVtcGxhdGVQYXJzZXIuZHVwbGljYXRlLXRhZy1hdHRyaWJ1dGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhfbGluZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlTmFtZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDdXJyZW50TG9jYXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9saW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2N1cnNvcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgIF9hdHRyaWJ1dGVzLnB1dChhdHRyaWJ1dGVOYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gV0FJVF9GT1JfQVRUUklCVVRFX05BTUU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGFkdmFuY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHRhZ0VuZEV2ZW50KF9jdXJzb3IpOwotCi0gICAgICAgIC8vIENoZWNrIGZvciBpbnZpc2libGUgbG9jYWxpemF0aW9ucwotCi0gICAgICAgIFN0cmluZyBsb2NhbGl6YXRpb25LZXkgPSBmaW5kVmFsdWVDYXNlbGVzc2x5KExPQ0FMSVpBVElPTl9LRVlfQVRUUklCVVRFX05BTUUsIF9hdHRyaWJ1dGVzKTsKLSAgICAgICAgU3RyaW5nIGp3Y0lkID0gZmluZFZhbHVlQ2FzZWxlc3NseShKV0NJRF9BVFRSSUJVVEVfTkFNRSwgX2F0dHJpYnV0ZXMpOwotCi0gICAgICAgIGlmIChsb2NhbGl6YXRpb25LZXkgIT0gbnVsbCAmJiB0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoInNwYW4iKSAmJiBqd2NJZCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoX2lnbm9yaW5nKQotICAgICAgICAgICAgICAgIHRlbXBsYXRlUGFyc2VQcm9ibGVtKAotICAgICAgICAgICAgICAgICAgICBUYXBlc3RyeS5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAiVGVtcGxhdGVQYXJzZXIuY29tcG9uZW50LW1heS1ub3QtYmUtaWdub3JlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICB0YWdOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhzdGFydExpbmUpKSwKLSAgICAgICAgICAgICAgICAgICAgc3RhcnRMb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgc3RhcnRMaW5lLAotICAgICAgICAgICAgICAgICAgICBjdXJzb3JTdGFydCk7Ci0KLSAgICAgICAgICAgIC8vIElmIHRoZSB0YWcgaXNuJ3QgZW1wdHksIHRoZW4gY3JlYXRlIGEgVGFnIGluc3RhbmNlIHRvIGlnbm9yZSB0aGUKLSAgICAgICAgICAgIC8vIGJvZHkgb2YgdGhlIHRhZy4KLQotICAgICAgICAgICAgaWYgKCFlbXB0eVRhZykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBUYWcgdGFnID0gbmV3IFRhZyh0YWdOYW1lLCBzdGFydExpbmUpOwotCi0gICAgICAgICAgICAgICAgdGFnLl9jb21wb25lbnQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB0YWcuX3JlbW92ZVRhZyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgdGFnLl9pZ25vcmluZ0JvZHkgPSB0cnVlOwotICAgICAgICAgICAgICAgIHRhZy5fbXVzdEJhbGFuY2UgPSB0cnVlOwotCi0gICAgICAgICAgICAgICAgX3N0YWNrLmFkZCh0YWcpOwotCi0gICAgICAgICAgICAgICAgLy8gU3RhcnQgaWdub3JpbmcgY29udGVudCB1bnRpbCB0aGUgY2xvc2UgdGFnLgotCi0gICAgICAgICAgICAgICAgX2lnbm9yaW5nID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIEN1cnNvciBpcyBhdCB0aGUgY2xvc2luZyBjYXJhdCwgYWR2YW5jZSBvdmVyIGl0IGFuZCBhbnkgd2hpdGVzcGFjZS4gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgYWR2YW5jZSgpOwotICAgICAgICAgICAgICAgIGFkdmFuY2VPdmVyV2hpdGVzcGFjZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBFbmQgYW55IG9wZW4gYmxvY2suCi0KLSAgICAgICAgICAgIGFkZFRleHRUb2tlbihjdXJzb3JTdGFydCAtIDEpOwotCi0gICAgICAgICAgICBib29sZWFuIHJhdyA9IGNoZWNrQm9vbGVhbihSQVdfQVRUUklCVVRFX05BTUUsIF9hdHRyaWJ1dGVzKTsKLQotICAgICAgICAgICAgTWFwIGF0dHJpYnV0ZXMgPSBmaWx0ZXIoX2F0dHJpYnV0ZXMsIG5ldyBTdHJpbmdbXSB7IExPQ0FMSVpBVElPTl9LRVlfQVRUUklCVVRFX05BTUUsIFJBV19BVFRSSUJVVEVfTkFNRSB9KTsKLQotICAgICAgICAgICAgVGVtcGxhdGVUb2tlbiB0b2tlbiA9Ci0gICAgICAgICAgICAgICAgX2ZhY3RvcnkuY3JlYXRlTG9jYWxpemF0aW9uVG9rZW4odGFnTmFtZSwgbG9jYWxpemF0aW9uS2V5LCByYXcsIGF0dHJpYnV0ZXMsIHN0YXJ0TG9jYXRpb24pOwotCi0gICAgICAgICAgICBfdG9rZW5zLmFkZCh0b2tlbik7Ci0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChqd2NJZCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBwcm9jZXNzQ29tcG9uZW50U3RhcnQodGFnTmFtZSwgandjSWQsIGVtcHR5VGFnLCBzdGFydExpbmUsIGN1cnNvclN0YXJ0LCBzdGFydExvY2F0aW9uKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEEgc3RhdGljIHRhZyAobm90IGEgdGFnIHdpdGhvdXQgYSBqd2NpZCBhdHRyaWJ1dGUpLgotICAgICAgICAvLyBXZSBuZWVkIHRvIHJlY29yZCB0aGlzIHNvIHRoYXQgd2UgY2FuIG1hdGNoIGNsb3NlIHRhZ3MgbGF0ZXIuCi0KLSAgICAgICAgaWYgKCFlbXB0eVRhZykKLSAgICAgICAgewotICAgICAgICAgICAgVGFnIHRhZyA9IG5ldyBUYWcodGFnTmFtZSwgc3RhcnRMaW5lKTsKLSAgICAgICAgICAgIF9zdGFjay5hZGQodGFnKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIElmIHRoZXJlIHdhc24ndCBhbiBhY3RpdmUgYmxvY2ssIHRoZW4gc3RhcnQgb25lLgotCi0gICAgICAgIGlmIChfYmxvY2tTdGFydCA8IDAgJiYgIV9pZ25vcmluZykKLSAgICAgICAgICAgIF9ibG9ja1N0YXJ0ID0gY3Vyc29yU3RhcnQ7Ci0KLSAgICAgICAgYWR2YW5jZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBQcm9jZXNzZXMgYSB0YWcgdGhhdCBpcyB0aGUgb3BlbiB0YWcgZm9yIGEgY29tcG9uZW50IChidXQgYWxzbyBoYW5kbGVzCi0gICAgICogIHRoZSAkcmVtb3ZlJCBhbmQgJGNvbnRlbnQkIHRhZ3MpLgotICAgICAqIAotICAgICAqKi8KLQotICAgIC8qKgotICAgICAqIE5vdGlmeSB0aGF0IHRoZSBiZWdpbm5pbmcgb2YgYSB0YWcgaGFzIGJlZW4gZGV0ZWN0ZWQuCi0gICAgICogPHA+Ci0gICAgICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcuCi0gICAgICogPHA+Ci0gICAgICoKLSAgICAgKiBhdXRob3IgZ2xvbmdtYW5AaW50ZWxsaWdlbnR3b3Jrcy5jb20KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB0YWdCZWdpbkV2ZW50KGludCBzdGFydExpbmUsIGludCBjdXJzb3JQb3NpdGlvbikKLSAgICB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTm90aWZ5IHRoYXQgdGhlIGVuZCBvZiB0aGUgY3VycmVudCB0YWcgaGFzIGJlZW4gZGV0ZWN0ZWQuCi0gICAgICogPHA+Ci0gICAgICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcuCi0gICAgICogPHA+Ci0gICAgICogYXV0aG9yIGdsb25nbWFuQGludGVsbGlnZW50d29ya3MuY29tCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgdGFnRW5kRXZlbnQoaW50IGN1cnNvclBvc2l0aW9uKQotICAgIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBOb3RpZnkgdGhhdCB0aGUgYmVnaW5uaW5nIG9mIGFuIGF0dHJpYnV0ZSB2YWx1ZSBoYXMgYmVlbiBkZXRlY3RlZC4KLSAgICAgKiA8cD4KLSAgICAgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZy4KLSAgICAgKiA8cD4KLSAgICAgKiBhdXRob3IgZ2xvbmdtYW5AaW50ZWxsaWdlbnR3b3Jrcy5jb20KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBhdHRyaWJ1dGVCZWdpbkV2ZW50KFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBpbnQgc3RhcnRMaW5lLCBpbnQgY3Vyc29yUG9zaXRpb24pCi0gICAgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIE5vdGlmeSB0aGF0IHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgYXR0cmlidXRlIHZhbHVlIGhhcyBiZWVuIGRldGVjdGVkLgotICAgICAqIDxwPgotICAgICAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nLgotICAgICAqIDxwPgotICAgICAqIGF1dGhvciBnbG9uZ21hbkBpbnRlbGxpZ2VudHdvcmtzLmNvbQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGF0dHJpYnV0ZUVuZEV2ZW50KGludCBjdXJzb3JQb3NpdGlvbikKLSAgICB7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NDb21wb25lbnRTdGFydCgKLSAgICAgICAgU3RyaW5nIHRhZ05hbWUsCi0gICAgICAgIFN0cmluZyBqd2NJZCwKLSAgICAgICAgYm9vbGVhbiBlbXB0eVRhZywKLSAgICAgICAgaW50IHN0YXJ0TGluZSwKLSAgICAgICAgaW50IGN1cnNvclN0YXJ0LAotICAgICAgICBJTG9jYXRpb24gc3RhcnRMb2NhdGlvbikKLSAgICAgICAgdGhyb3dzIFRlbXBsYXRlUGFyc2VFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmIChqd2NJZC5lcXVhbHNJZ25vcmVDYXNlKENPTlRFTlRfSUQpKQotICAgICAgICB7Ci0gICAgICAgICAgICBwcm9jZXNzQ29udGVudFRhZyh0YWdOYW1lLCBzdGFydExpbmUsIGN1cnNvclN0YXJ0LCBlbXB0eVRhZyk7Ci0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gaXNSZW1vdmVJZCA9IGp3Y0lkLmVxdWFsc0lnbm9yZUNhc2UoUkVNT1ZFX0lEKTsKLQotICAgICAgICBpZiAoX2lnbm9yaW5nICYmICFpc1JlbW92ZUlkKQotICAgICAgICAgICAgdGVtcGxhdGVQYXJzZVByb2JsZW0oCi0gICAgICAgICAgICAgICAgVGFwZXN0cnkuZm9ybWF0KCJUZW1wbGF0ZVBhcnNlci5jb21wb25lbnQtbWF5LW5vdC1iZS1pZ25vcmVkIiwgdGFnTmFtZSwgSW50ZWdlci50b1N0cmluZyhzdGFydExpbmUpKSwKLSAgICAgICAgICAgICAgICBzdGFydExvY2F0aW9uLAotICAgICAgICAgICAgICAgIHN0YXJ0TGluZSwKLSAgICAgICAgICAgICAgICBjdXJzb3JTdGFydCk7Ci0KLSAgICAgICAgU3RyaW5nIHR5cGUgPSBudWxsOwotICAgICAgICBib29sZWFuIGFsbG93Qm9keSA9IGZhbHNlOwotCi0gICAgICAgIGlmIChfcGF0dGVybk1hdGNoZXIubWF0Y2hlcyhqd2NJZCwgX2ltcGxpY2l0SWRQYXR0ZXJuKSkKLSAgICAgICAgewotICAgICAgICAgICAgTWF0Y2hSZXN1bHQgbWF0Y2ggPSBfcGF0dGVybk1hdGNoZXIuZ2V0TWF0Y2goKTsKLQotICAgICAgICAgICAgandjSWQgPSBtYXRjaC5ncm91cChJTVBMSUNJVF9JRF9QQVRURVJOX0lEX0dST1VQKTsKLSAgICAgICAgICAgIHR5cGUgPSBtYXRjaC5ncm91cChJTVBMSUNJVF9JRF9QQVRURVJOX1RZUEVfR1JPVVApOwotCi0gICAgICAgICAgICBTdHJpbmcgbGlicmFyeUlkID0gbWF0Y2guZ3JvdXAoSU1QTElDSVRfSURfUEFUVEVSTl9MSUJSQVJZX0lEX0dST1VQKTsKLSAgICAgICAgICAgIFN0cmluZyBzaW1wbGVUeXBlID0gbWF0Y2guZ3JvdXAoSU1QTElDSVRfSURfUEFUVEVSTl9TSU1QTEVfVFlQRV9HUk9VUCk7Ci0KLSAgICAgICAgICAgIC8vIElmIChhbmQgdGhpcyBpcyB0eXBpY2FsKSBubyBhY3R1YWwgY29tcG9uZW50IGlkIHdhcyBzcGVjaWZpZWQsCi0gICAgICAgICAgICAvLyB0aGVuIGdlbmVyYXRlIG9uZSBvbiB0aGUgZmx5LgotICAgICAgICAgICAgLy8gVGhlIGFsbG9jYXRlZCBpZCBmb3IgYW5vbnltb3VzIGNvbXBvbmVudHMgaXMKLSAgICAgICAgICAgIC8vIGJhc2VkIG9uIHRoZSBzaW1wbGUgKHVucHJlZml4ZWQpIHR5cGUsIGJ1dCBzdGFydHMKLSAgICAgICAgICAgIC8vIHdpdGggYSBsZWFkaW5nIGRvbGxhciBzaWduIHRvIGVuc3VyZSBubyBjb25mbGljdHMKLSAgICAgICAgICAgIC8vIHdpdGggdXNlciBkZWZpbmVkIGNvbXBvbmVudCBpZHMgKHdoaWNoIGRvbid0IGFsbG93IGRvbGxhciBzaWducwotICAgICAgICAgICAgLy8gaW4gdGhlIGlkKS4KLQotICAgICAgICAgICAgaWYgKGp3Y0lkID09IG51bGwpCi0gICAgICAgICAgICAgICAgandjSWQgPSBfaWRBbGxvY2F0b3IuYWxsb2NhdGVJZCgiJCIgKyBzaW1wbGVUeXBlKTsKLQotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYWxsb3dCb2R5ID0gX2RlbGVnYXRlLmdldEFsbG93Qm9keShsaWJyYXJ5SWQsIHNpbXBsZVR5cGUsIHN0YXJ0TG9jYXRpb24pOwotICAgICAgICAgICAgfSBjYXRjaCAoQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gZ2l2ZSBzdWJjbGFzc2VzIGEgY2hhbmNlIHRvIGhhbmRsZSBhbmQgcmV0aHJvdwotICAgICAgICAgICAgICAgIHRlbXBsYXRlUGFyc2VQcm9ibGVtKGUsIHN0YXJ0TGluZSwgY3Vyc29yU3RhcnQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIWlzUmVtb3ZlSWQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCFfcGF0dGVybk1hdGNoZXIubWF0Y2hlcyhqd2NJZCwgX3NpbXBsZUlkUGF0dGVybikpCi0gICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlUGFyc2VQcm9ibGVtKAotICAgICAgICAgICAgICAgICAgICAgICAgVGFwZXN0cnkuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUZW1wbGF0ZVBhcnNlci5jb21wb25lbnQtaWQtaW52YWxpZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKHN0YXJ0TGluZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgandjSWQpLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRMb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0TGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvclN0YXJ0KTsKLQotICAgICAgICAgICAgICAgIGlmICghX2RlbGVnYXRlLmdldEtub3duQ29tcG9uZW50KGp3Y0lkKSkKLSAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVQYXJzZVByb2JsZW0oCi0gICAgICAgICAgICAgICAgICAgICAgICBUYXBlc3RyeS5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRlbXBsYXRlUGFyc2VyLnVua25vd24tY29tcG9uZW50LWlkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcoc3RhcnRMaW5lKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBqd2NJZCksCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGFydExvY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRMaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgY3Vyc29yU3RhcnQpOwotCi0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBhbGxvd0JvZHkgPSBfZGVsZWdhdGUuZ2V0QWxsb3dCb2R5KGp3Y0lkLCBzdGFydExvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGdpdmUgc3ViY2xhc3NlcyBhIGNoYW5jZSB0byBoYW5kbGUgYW5kIHJldGhyb3cKLSAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVQYXJzZVByb2JsZW0oZSwgc3RhcnRMaW5lLCBjdXJzb3JTdGFydCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSWdub3JlIHRoZSBib2R5IGlmIHdlJ3JlIHJlbW92aW5nIHRoZSBlbnRpcmUgdGFnLAotICAgICAgICAvLyBvZiBpZiB0aGUgY29ycmVzcG9uZGluZyBjb21wb25lbnQgZG9lc24ndCBhbGxvdwotICAgICAgICAvLyBhIGJvZHkuCi0KLSAgICAgICAgYm9vbGVhbiBpZ25vcmVCb2R5ID0gIWVtcHR5VGFnICYmIChpc1JlbW92ZUlkIHx8ICFhbGxvd0JvZHkpOwotCi0gICAgICAgIGlmIChfaWdub3JpbmcgJiYgaWdub3JlQm9keSkKLSAgICAgICAgICAgIHRlbXBsYXRlUGFyc2VQcm9ibGVtKAotICAgICAgICAgICAgICAgIFRhcGVzdHJ5LmZvcm1hdCgiVGVtcGxhdGVQYXJzZXIubmVzdGVkLWlnbm9yZSIsIHRhZ05hbWUsIEludGVnZXIudG9TdHJpbmcoc3RhcnRMaW5lKSksCi0gICAgICAgICAgICAgICAgbmV3IExvY2F0aW9uKF9yZXNvdXJjZUxvY2F0aW9uLCBzdGFydExpbmUpLAotICAgICAgICAgICAgICAgIHN0YXJ0TGluZSwKLSAgICAgICAgICAgICAgICBjdXJzb3JTdGFydCk7Ci0KLSAgICAgICAgaWYgKCFlbXB0eVRhZykKLSAgICAgICAgICAgIHB1c2hOZXdUYWcodGFnTmFtZSwgc3RhcnRMaW5lLCBpc1JlbW92ZUlkLCBpZ25vcmVCb2R5KTsKLQotICAgICAgICAvLyBFbmQgYW55IG9wZW4gYmxvY2suCi0KLSAgICAgICAgYWRkVGV4dFRva2VuKGN1cnNvclN0YXJ0IC0gMSk7Ci0KLSAgICAgICAgaWYgKCFpc1JlbW92ZUlkKQotICAgICAgICB7Ci0gICAgICAgICAgICBhZGRPcGVuVG9rZW4odGFnTmFtZSwgandjSWQsIHR5cGUsIHN0YXJ0TG9jYXRpb24pOwotCi0gICAgICAgICAgICBpZiAoZW1wdHlUYWcpCi0gICAgICAgICAgICAgICAgX3Rva2Vucy5hZGQoX2ZhY3RvcnkuY3JlYXRlQ2xvc2VUb2tlbih0YWdOYW1lLCBnZXRDdXJyZW50TG9jYXRpb24oKSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgYWR2YW5jZSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwdXNoTmV3VGFnKFN0cmluZyB0YWdOYW1lLCBpbnQgc3RhcnRMaW5lLCBib29sZWFuIGlzUmVtb3ZlSWQsIGJvb2xlYW4gaWdub3JlQm9keSkKLSAgICB7Ci0gICAgICAgIFRhZyB0YWcgPSBuZXcgVGFnKHRhZ05hbWUsIHN0YXJ0TGluZSk7Ci0KLSAgICAgICAgdGFnLl9jb21wb25lbnQgPSAhaXNSZW1vdmVJZDsKLSAgICAgICAgdGFnLl9yZW1vdmVUYWcgPSBpc1JlbW92ZUlkOwotCi0gICAgICAgIHRhZy5faWdub3JpbmdCb2R5ID0gaWdub3JlQm9keTsKLQotICAgICAgICBfaWdub3JpbmcgPSB0YWcuX2lnbm9yaW5nQm9keTsKLQotICAgICAgICB0YWcuX211c3RCYWxhbmNlID0gdHJ1ZTsKLQotICAgICAgICBfc3RhY2suYWRkKHRhZyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NDb250ZW50VGFnKFN0cmluZyB0YWdOYW1lLCBpbnQgc3RhcnRMaW5lLCBpbnQgY3Vyc29yU3RhcnQsIGJvb2xlYW4gZW1wdHlUYWcpCi0gICAgICAgIHRocm93cyBUZW1wbGF0ZVBhcnNlRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiAoX2lnbm9yaW5nKQotICAgICAgICAgICAgdGVtcGxhdGVQYXJzZVByb2JsZW0oCi0gICAgICAgICAgICAgICAgVGFwZXN0cnkuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAiVGVtcGxhdGVQYXJzZXIuY29udGVudC1ibG9jay1tYXktbm90LWJlLWlnbm9yZWQiLAotICAgICAgICAgICAgICAgICAgICB0YWdOYW1lLAotICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKHN0YXJ0TGluZSkpLAotICAgICAgICAgICAgICAgIG5ldyBMb2NhdGlvbihfcmVzb3VyY2VMb2NhdGlvbiwgc3RhcnRMaW5lKSwKLSAgICAgICAgICAgICAgICBzdGFydExpbmUsCi0gICAgICAgICAgICAgICAgY3Vyc29yU3RhcnQpOwotCi0gICAgICAgIGlmIChlbXB0eVRhZykKLSAgICAgICAgICAgIHRlbXBsYXRlUGFyc2VQcm9ibGVtKAotICAgICAgICAgICAgICAgIFRhcGVzdHJ5LmZvcm1hdCgiVGVtcGxhdGVQYXJzZXIuY29udGVudC1ibG9jay1tYXktbm90LWJlLWVtcHR5IiwgdGFnTmFtZSwgSW50ZWdlci50b1N0cmluZyhzdGFydExpbmUpKSwKLSAgICAgICAgICAgICAgICBuZXcgTG9jYXRpb24oX3Jlc291cmNlTG9jYXRpb24sIHN0YXJ0TGluZSksCi0gICAgICAgICAgICAgICAgc3RhcnRMaW5lLAotICAgICAgICAgICAgICAgIGN1cnNvclN0YXJ0KTsKLQotICAgICAgICBfdG9rZW5zLmNsZWFyKCk7Ci0gICAgICAgIF9ibG9ja1N0YXJ0ID0gLTE7Ci0KLSAgICAgICAgVGFnIHRhZyA9IG5ldyBUYWcodGFnTmFtZSwgc3RhcnRMaW5lKTsKLQotICAgICAgICB0YWcuX211c3RCYWxhbmNlID0gdHJ1ZTsKLSAgICAgICAgdGFnLl9jb250ZW50ID0gdHJ1ZTsKLQotICAgICAgICBfc3RhY2suY2xlYXIoKTsKLSAgICAgICAgX3N0YWNrLmFkZCh0YWcpOwotCi0gICAgICAgIGFkdmFuY2UoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkT3BlblRva2VuKFN0cmluZyB0YWdOYW1lLCBTdHJpbmcgandjSWQsIFN0cmluZyB0eXBlLCBJTG9jYXRpb24gbG9jYXRpb24pCi0gICAgewotICAgICAgICBPcGVuVG9rZW4gdG9rZW4gPSBfZmFjdG9yeS5jcmVhdGVPcGVuVG9rZW4odGFnTmFtZSwgandjSWQsIHR5cGUsIGxvY2F0aW9uKTsKLSAgICAgICAgX3Rva2Vucy5hZGQodG9rZW4pOwotCi0gICAgICAgIGlmIChfYXR0cmlidXRlcy5pc0VtcHR5KCkpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgSXRlcmF0b3IgaSA9IF9hdHRyaWJ1dGVzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpLm5leHQoKTsKLQotICAgICAgICAgICAgU3RyaW5nIGtleSA9IChTdHJpbmcpIGVudHJ5LmdldEtleSgpOwotCi0gICAgICAgICAgICBpZiAoa2V5LmVxdWFsc0lnbm9yZUNhc2UoSldDSURfQVRUUklCVVRFX05BTUUpKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKSBlbnRyeS5nZXRWYWx1ZSgpOwotCi0gICAgICAgICAgICBhZGRBdHRyaWJ1dGVUb1Rva2VuKHRva2VuLCBrZXksIHZhbHVlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqICBBbmFseXplcyB0aGUgYXR0cmlidXRlIHZhbHVlLCBsb29raW5nIGZvciBwb3NzaWJsZSBwcmVmaXhlcyB0aGF0IGluZGljYXRlCi0gICAgICogIHRoZSB2YWx1ZSBpcyBub3QgYSBsaXRlcmFsLiAgQWRkcyB0aGUgYXR0cmlidXRlIHRvIHRoZQotICAgICAqICB0b2tlbi4KLSAgICAgKiAKLSAgICAgKiAgQHNpbmNlIDMuMAotICAgICAqIAotICAgICAqKi8KLQotICAgIHByaXZhdGUgdm9pZCBhZGRBdHRyaWJ1dGVUb1Rva2VuKE9wZW5Ub2tlbiB0b2tlbiwgU3RyaW5nIG5hbWUsIFN0cmluZyBhdHRyaWJ1dGVWYWx1ZSkKLSAgICB7Ci0gICAgICAgIGludCBwb3MgPSBhdHRyaWJ1dGVWYWx1ZS5pbmRleE9mKCI6Iik7Ci0KLSAgICAgICAgaWYgKHBvcyA+IDApCi0gICAgICAgIHsKLQotICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9IGF0dHJpYnV0ZVZhbHVlLnN1YnN0cmluZygwLCBwb3MgKyAxKTsKLQotICAgICAgICAgICAgaWYgKHByZWZpeC5lcXVhbHMoT0dOTF9FWFBSRVNTSU9OX1BSRUZJWCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdG9rZW4uYWRkQXR0cmlidXRlKAotICAgICAgICAgICAgICAgICAgICBuYW1lLAotICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVUeXBlLk9HTkxfRVhQUkVTU0lPTiwKLSAgICAgICAgICAgICAgICAgICAgZXh0cmFjdEV4cHJlc3Npb24oYXR0cmlidXRlVmFsdWUuc3Vic3RyaW5nKHBvcyArIDEpKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocHJlZml4LmVxdWFscyhMT0NBTElaQVRJT05fS0VZX1BSRUZJWCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdG9rZW4uYWRkQXR0cmlidXRlKG5hbWUsIEF0dHJpYnV0ZVR5cGUuTE9DQUxJWkFUSU9OX0tFWSwgYXR0cmlidXRlVmFsdWUuc3Vic3RyaW5nKHBvcyArIDEpLnRyaW0oKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB0b2tlbi5hZGRBdHRyaWJ1dGUobmFtZSwgQXR0cmlidXRlVHlwZS5MSVRFUkFMLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEludm9rZWQgdG8gaGFuZGxlIGEgY2xvc2luZyB0YWcsIGkuZS4sICZsdDsvZm9vJmd0Oy4gIFdoZW4gYSB0YWcgY2xvc2VzLCBpdCB3aWxsIG1hdGNoIGFnYWluc3QKLSAgICAgKiAgYSB0YWcgb24gdGhlIG9wZW4gdGFnIHN0YXJ0LiAgUHJlZmVyYWJseSB0aGUgdG9wIHRhZyBvbiB0aGUgc3RhY2sgKGlmIGV2ZXJ5dGhpbmcgaXMgd2VsbCBiYWxhbmNlZCksIGJ1dCB0aGlzCi0gICAgICogIGlzIEhUTUwsIG5vdCBYTUwsIHNvIG1hbnkgdGFncyB3b24ndCBiYWxhbmNlLgotICAgICAqCi0gICAgICogIDxwPk9uY2UgdGhlIG1hdGNoaW5nIHRhZyBpcyBsb2NhdGVkLCB0aGUgcXVlc3Rpb24gaXMgLi4uIGlzIHRoZSB0YWcgZHluYW1pYyBvciBzdGF0aWM/ICBJZiBzdGF0aWMsIHRoZW4KLSAgICAgKiB0aGUgY3VycmVudCB0ZXh0IGJsb2NrIGlzIGV4dGVuZGVkIHRvIGluY2x1ZGUgdGhpcyBjbG9zZSB0YWcuICBJZiBkeW5hbWljLCB0aGVuIHRoZSBjdXJyZW50IHRleHQgYmxvY2sKLSAgICAgKiBpcyBlbmRlZCAoYmVmb3JlIHRoZSAnJmx0OycgdGhhdCBzdGFydHMgdGhlIHRhZykgYW5kIGEgY2xvc2UgdG9rZW4gaXMgYWRkZWQuCi0gICAgICoKLSAgICAgKiA8cD5JbiBlaXRoZXIgY2FzZSwgdGhlIG1hdGNoaW5nIHN0YXRpYyBlbGVtZW50IGFuZCBhbnl0aGluZyBhYm92ZSBpdCBpcyByZW1vdmVkLCBhbmQgdGhlIGN1cnNvciBpcyBsZWZ0Ci0gICAgICogb24gdGhlIGNoYXJhY3RlciBmb2xsb3dpbmcgdGhlICcmZ3Q7Jy4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHByaXZhdGUgdm9pZCBjbG9zZVRhZygpIHRocm93cyBUZW1wbGF0ZVBhcnNlRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpbnQgY3Vyc29yU3RhcnQgPSBfY3Vyc29yOwotICAgICAgICBpbnQgbGVuZ3RoID0gX3RlbXBsYXRlRGF0YS5sZW5ndGg7Ci0gICAgICAgIGludCBzdGFydExpbmUgPSBfbGluZTsKLQotICAgICAgICBJTG9jYXRpb24gc3RhcnRMb2NhdGlvbiA9IGdldEN1cnJlbnRMb2NhdGlvbigpOwotCi0gICAgICAgIF9jdXJzb3IgKz0gQ0xPU0VfVEFHLmxlbmd0aDsKLQotICAgICAgICBpbnQgdGFnU3RhcnQgPSBfY3Vyc29yOwotCi0gICAgICAgIHdoaWxlICh0cnVlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoX2N1cnNvciA+PSBsZW5ndGgpCi0gICAgICAgICAgICAgICAgdGVtcGxhdGVQYXJzZVByb2JsZW0oCi0gICAgICAgICAgICAgICAgICAgIFRhcGVzdHJ5LmZvcm1hdCgiVGVtcGxhdGVQYXJzZXIuaW5jb21wbGV0ZS1jbG9zZS10YWciLCBJbnRlZ2VyLnRvU3RyaW5nKHN0YXJ0TGluZSkpLAotICAgICAgICAgICAgICAgICAgICBzdGFydExvY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICBzdGFydExpbmUsCi0gICAgICAgICAgICAgICAgICAgIGN1cnNvclN0YXJ0KTsKLQotICAgICAgICAgICAgY2hhciBjaCA9IF90ZW1wbGF0ZURhdGFbX2N1cnNvcl07Ci0KLSAgICAgICAgICAgIGlmIChjaCA9PSAnPicpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGFkdmFuY2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyB0YWdOYW1lID0gbmV3IFN0cmluZyhfdGVtcGxhdGVEYXRhLCB0YWdTdGFydCwgX2N1cnNvciAtIHRhZ1N0YXJ0KTsKLQotICAgICAgICBpbnQgc3RhY2tQb3MgPSBfc3RhY2suc2l6ZSgpIC0gMTsKLSAgICAgICAgVGFnIHRhZyA9IG51bGw7Ci0KLSAgICAgICAgd2hpbGUgKHN0YWNrUG9zID49IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRhZyA9IChUYWcpIF9zdGFjay5nZXQoc3RhY2tQb3MpOwotCi0gICAgICAgICAgICBpZiAodGFnLm1hdGNoKHRhZ05hbWUpKQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBpZiAodGFnLl9tdXN0QmFsYW5jZSkKLSAgICAgICAgICAgICAgICB0ZW1wbGF0ZVBhcnNlUHJvYmxlbSgKLSAgICAgICAgICAgICAgICAgICAgVGFwZXN0cnkuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAgICAgIlRlbXBsYXRlUGFyc2VyLmltcHJvcGVybHktbmVzdGVkLWNsb3NlLXRhZyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhzdGFydExpbmUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZy5fdGFnTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKHRhZy5fbGluZSl9KSwKLSAgICAgICAgICAgICAgICAgICAgc3RhcnRMb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgc3RhcnRMaW5lLAotICAgICAgICAgICAgICAgICAgICBjdXJzb3JTdGFydCk7Ci0KLSAgICAgICAgICAgIHN0YWNrUG9zLS07Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc3RhY2tQb3MgPCAwKQotICAgICAgICAgICAgdGVtcGxhdGVQYXJzZVByb2JsZW0oCi0gICAgICAgICAgICAgICAgVGFwZXN0cnkuZm9ybWF0KCJUZW1wbGF0ZVBhcnNlci51bm1hdGNoZWQtY2xvc2UtdGFnIiwgdGFnTmFtZSwgSW50ZWdlci50b1N0cmluZyhzdGFydExpbmUpKSwKLSAgICAgICAgICAgICAgICBzdGFydExvY2F0aW9uLAotICAgICAgICAgICAgICAgIHN0YXJ0TGluZSwKLSAgICAgICAgICAgICAgICBjdXJzb3JTdGFydCk7Ci0KLSAgICAgICAgLy8gU3BlY2lhbCBjYXNlIGZvciB0aGUgY29udGVudCB0YWcKLQotICAgICAgICBpZiAodGFnLl9jb250ZW50KQotICAgICAgICB7Ci0gICAgICAgICAgICBhZGRUZXh0VG9rZW4oY3Vyc29yU3RhcnQgLSAxKTsKLQotICAgICAgICAgICAgLy8gQWR2YW5jZSB0aGUgY3Vyc29yIHJpZ2h0IHRvIHRoZSBlbmQuCi0KLSAgICAgICAgICAgIF9jdXJzb3IgPSBsZW5ndGg7Ci0gICAgICAgICAgICBfc3RhY2suY2xlYXIoKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFdoZW4gYSBjb21wb25lbnQgY2xvc2VzLCBhZGQgYSBDTE9TRSB0YWcuCi0gICAgICAgIGlmICh0YWcuX2NvbXBvbmVudCkKLSAgICAgICAgewotICAgICAgICAgICAgYWRkVGV4dFRva2VuKGN1cnNvclN0YXJ0IC0gMSk7Ci0KLSAgICAgICAgICAgIF90b2tlbnMuYWRkKF9mYWN0b3J5LmNyZWF0ZUNsb3NlVG9rZW4odGFnTmFtZSwgZ2V0Q3VycmVudExvY2F0aW9uKCkpKTsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIFRoZSBjbG9zZSBvZiBhIHN0YXRpYyB0YWcuICBVbmxlc3MgcmVtb3ZpbmcgdGhlIHRhZwotICAgICAgICAgICAgLy8gZW50aXJlbHksIG1ha2Ugc3VyZSB0aGUgYmxvY2sgdGFnIGlzIHBhcnQgb2YgYSB0ZXh0IGJsb2NrLgotCi0gICAgICAgICAgICBpZiAoX2Jsb2NrU3RhcnQgPCAwICYmICF0YWcuX3JlbW92ZVRhZyAmJiAhX2lnbm9yaW5nKQotICAgICAgICAgICAgICAgIF9ibG9ja1N0YXJ0ID0gY3Vyc29yU3RhcnQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBSZW1vdmUgYWxsIGVsZW1lbnRzIGF0IHN0YWNrUG9zIG9yIGFib3ZlLgotCi0gICAgICAgIGZvciAoaW50IGkgPSBfc3RhY2suc2l6ZSgpIC0gMTsgaSA+PSBzdGFja1BvczsgaS0tKQotICAgICAgICAgICAgX3N0YWNrLnJlbW92ZShpKTsKLQotICAgICAgICAvLyBBZHZhbmNlIGN1cnNvciBwYXN0ICc+JwotCi0gICAgICAgIGFkdmFuY2UoKTsKLQotICAgICAgICAvLyBJZiBlZGl0dGluZyBvdXQgdGhlIHRhZyAoaS5lLiwgJHJlbW92ZSQpIHRoZW4ga2lsbCBhbnkgd2hpdGVzcGFjZS4KLSAgICAgICAgLy8gRm9yIGNvbXBvbmVudHMgdGhhdCBzaW1wbHkgZG9uJ3QgY29udGFpbiBhIGJvZHksIHJlbW92ZVRhZyB3aWxsCi0gICAgICAgIC8vIGJlIGZhbHNlLgotCi0gICAgICAgIGlmICh0YWcuX3JlbW92ZVRhZykKLSAgICAgICAgICAgIGFkdmFuY2VPdmVyV2hpdGVzcGFjZSgpOwotCi0gICAgICAgIC8vIElmIHdlIHdlcmUgaWdub3JpbmcgdGhlIGJvZHkgb2YgdGhlIHRhZywgdGhlbiBjbGVhciB0aGUgaWdub3JpbmcKLSAgICAgICAgLy8gZmxhZywgc2luY2Ugd2UncmUgb3V0IG9mIHRoZSBib2R5LgotCi0gICAgICAgIGlmICh0YWcuX2lnbm9yaW5nQm9keSkKLSAgICAgICAgICAgIF9pZ25vcmluZyA9IGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBBZHZhbmNlcyB0aGUgY3Vyc29yIHRvIHRoZSBuZXh0IGNoYXJhY3Rlci4KLSAgICAgKiAgSWYgdGhlIGVuZC1vZi1saW5lIGlzIHJlYWNoZWQsIHRoZW4gaW5jcmVtZW50cwotICAgICAqICB0aGUgbGluZSBjb3VudGVyLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHJpdmF0ZSB2b2lkIGFkdmFuY2UoKQotICAgIHsKLSAgICAgICAgaW50IGxlbmd0aCA9IF90ZW1wbGF0ZURhdGEubGVuZ3RoOwotCi0gICAgICAgIGlmIChfY3Vyc29yID49IGxlbmd0aCkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBjaGFyIGNoID0gX3RlbXBsYXRlRGF0YVtfY3Vyc29yXTsKLQotICAgICAgICBfY3Vyc29yKys7Ci0KLSAgICAgICAgaWYgKGNoID09ICdcbicpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9saW5lKys7Ci0gICAgICAgICAgICBfY3VycmVudExvY2F0aW9uID0gbnVsbDsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEEgXHIsIG9yIGEgXHJcbiBhbHNvIGNvdW50cyBhcyBhIG5ldyBsaW5lLgotCi0gICAgICAgIGlmIChjaCA9PSAnXHInKQotICAgICAgICB7Ci0gICAgICAgICAgICBfbGluZSsrOwotICAgICAgICAgICAgX2N1cnJlbnRMb2NhdGlvbiA9IG51bGw7Ci0KLSAgICAgICAgICAgIGlmIChfY3Vyc29yIDwgbGVuZ3RoICYmIF90ZW1wbGF0ZURhdGFbX2N1cnNvcl0gPT0gJ1xuJykKLSAgICAgICAgICAgICAgICBfY3Vyc29yKys7Ci0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIE5vdCBhbiBlbmQtb2YtbGluZSBjaGFyYWN0ZXIuCi0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWR2YW5jZU92ZXJXaGl0ZXNwYWNlKCkKLSAgICB7Ci0gICAgICAgIGludCBsZW5ndGggPSBfdGVtcGxhdGVEYXRhLmxlbmd0aDsKLQotICAgICAgICB3aGlsZSAoX2N1cnNvciA8IGxlbmd0aCkKLSAgICAgICAgewotICAgICAgICAgICAgY2hhciBjaCA9IF90ZW1wbGF0ZURhdGFbX2N1cnNvcl07Ci0gICAgICAgICAgICBpZiAoIUNoYXJhY3Rlci5pc1doaXRlc3BhY2UoY2gpKQotICAgICAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAgICAgYWR2YW5jZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgYSBuZXcgTWFwIHRoYXQgaXMgYSBjb3B5IG9mIHRoZSBpbnB1dCBNYXAgd2l0aCBzb21lCi0gICAgICogIGtleS92YWx1ZSBwYWlycyByZW1vdmVkLiAgQSBsaXN0IG9mIGtleXMgaXMgcGFzc2VkIGluCi0gICAgICogIGFuZCBtYXRjaGluZyBrZXlzIChjYXNlbGVzcyBjb21wYXJpc29uKSBmcm9tIHRoZSBpbnB1dAotICAgICAqICBNYXAgYXJlIGV4Y2x1ZGVkIGZyb20gdGhlIG91dHB1dCBtYXAuICBNYXkgcmV0dXJuIG51bGwKLSAgICAgKiAgKHJhdGhlciB0aGFuIHJldHVybiBhbiBlbXB0eSBNYXApLgotICAgICAqIAotICAgICAqKi8KLQotICAgIHByaXZhdGUgTWFwIGZpbHRlcihNYXAgaW5wdXQsIFN0cmluZ1tdIHJlbW92ZUtleXMpCi0gICAgewotICAgICAgICBpZiAoaW5wdXQgPT0gbnVsbCB8fCBpbnB1dC5pc0VtcHR5KCkpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICBNYXAgcmVzdWx0ID0gbnVsbDsKLQotICAgICAgICBJdGVyYXRvciBpID0gaW5wdXQuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotCi0gICAgICAgIG5leHRrZXkgOiB3aGlsZSAoaS5oYXNOZXh0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGkubmV4dCgpOwotCi0gICAgICAgICAgICBTdHJpbmcga2V5ID0gKFN0cmluZykgZW50cnkuZ2V0S2V5KCk7Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgcmVtb3ZlS2V5cy5sZW5ndGg7IGorKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoa2V5LmVxdWFsc0lnbm9yZUNhc2UocmVtb3ZlS2V5c1tqXSkpCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIG5leHRrZXk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgSGFzaE1hcChpbnB1dC5zaXplKCkpOwotCi0gICAgICAgICAgICByZXN1bHQucHV0KGtleSwgZW50cnkuZ2V0VmFsdWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBTZWFyY2hlcyBhIE1hcCBmb3IgZ2l2ZW4ga2V5LCBjYXNlbGVzc2x5LiAgVGhlIE1hcCBpcyBleHBlY3RlZCB0byBjb25zaXN0IG9mIFN0cmluZ3MgZm9yIGtleXMgYW5kCi0gICAgICogIHZhbHVlcy4gIFJldHVybnMgdGhlIHZhbHVlIGZvciB0aGUgZmlyc3Qga2V5IGZvdW5kIHRoYXQgbWF0Y2hlcyAoY2FzZWxlc3NseSkgdGhlIGlucHV0IGtleS4gIFJldHVybnMgbnVsbAotICAgICAqICBpZiBubyB2YWx1ZSBmb3VuZC4KLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGZpbmRWYWx1ZUNhc2VsZXNzbHkoU3RyaW5nIGtleSwgTWFwIG1hcCkKLSAgICB7Ci0gICAgICAgIFN0cmluZyByZXN1bHQgPSAoU3RyaW5nKSBtYXAuZ2V0KGtleSk7Ci0KLSAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLQotICAgICAgICBJdGVyYXRvciBpID0gbWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpLm5leHQoKTsKLQotICAgICAgICAgICAgU3RyaW5nIGVudHJ5S2V5ID0gKFN0cmluZykgZW50cnkuZ2V0S2V5KCk7Ci0KLSAgICAgICAgICAgIGlmIChlbnRyeUtleS5lcXVhbHNJZ25vcmVDYXNlKGtleSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIChTdHJpbmcpIGVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgQ29udmVyc2lvbnMgbmVlZGVkIGJ5IHtAbGluayAjZXh0cmFjdEV4cHJlc3Npb24oU3RyaW5nKX0KLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBDT05WRVJTSU9OUyA9IHsgIiZsdDsiLCAiPCIsICImZ3Q7IiwgIj4iLCAiJnF1b3Q7IiwgIlwiIiwgIiZhbXA7IiwgIiYiIH07Ci0KLSAgICAvKioKLSAgICAgKiAgUHJvdmlkZWQgYSByYXcgaW5wdXQgc3RyaW5nIHRoYXQgaGFzIGJlZW4gcmVjb2duaXplZCB0byBiZSBhbiBleHByZXNzaW9uLAotICAgICAqICB0aGlzIHJlbW92ZXMgZXhjZXNzIHdoaXRlIHNwYWNlIGFuZCBjb252ZXJ0cyAmYW1wO2FtcDssICZhbXA7cXVvdDsgJmFtcDtsdDsgYW5kICZhbXA7Z3Q7Ci0gICAgICogIHRvIHRoZWlyIG5vcm1hbCBjaGFyYWN0ZXIgdmFsdWVzIChvdGhlcndpc2UgaXRzIGltcG9zc2libGUgdG8gc3BlY2lmeQotICAgICAqICB0aG9zZSB2YWx1ZXMgaW4gZXhwcmVzc2lvbnMgaW4gdGhlIHRlbXBsYXRlKS4KLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwcml2YXRlIFN0cmluZyBleHRyYWN0RXhwcmVzc2lvbihTdHJpbmcgaW5wdXQpCi0gICAgewotICAgICAgICBpbnQgaW5wdXRMZW5ndGggPSBpbnB1dC5sZW5ndGgoKTsKLQotICAgICAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihpbnB1dExlbmd0aCk7Ci0KLSAgICAgICAgaW50IGN1cnNvciA9IDA7Ci0KLSAgICAgICAgb3V0ZXIgOiB3aGlsZSAoY3Vyc29yIDwgaW5wdXRMZW5ndGgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQ09OVkVSU0lPTlMubGVuZ3RoOyBpICs9IDIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGVudGl0eSA9IENPTlZFUlNJT05TW2ldOwotICAgICAgICAgICAgICAgIGludCBlbnRpdHlMZW5ndGggPSBlbnRpdHkubGVuZ3RoKCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gQ09OVkVSU0lPTlNbaSArIDFdOwotCi0gICAgICAgICAgICAgICAgaWYgKGN1cnNvciArIGVudGl0eUxlbmd0aCA+IGlucHV0TGVuZ3RoKQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgICAgICAgIGlmIChpbnB1dC5zdWJzdHJpbmcoY3Vyc29yLCBjdXJzb3IgKyBlbnRpdHlMZW5ndGgpLmVxdWFscyhlbnRpdHkpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGN1cnNvciArPSBlbnRpdHlMZW5ndGg7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIG91dGVyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChpbnB1dC5jaGFyQXQoY3Vyc29yKSk7Ci0gICAgICAgICAgICBjdXJzb3IrKzsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKS50cmltKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgdHJ1ZSBpZiB0aGUgIG1hcCBjb250YWlucyB0aGUgZ2l2ZW4ga2V5IChjYXNlbGVzcyBzZWFyY2gpIGFuZCB0aGUgdmFsdWUKLSAgICAgKiAgaXMgInRydWUiIChjYXNlbGVzcyBjb21wYXJpc29uKS4KLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwcml2YXRlIGJvb2xlYW4gY2hlY2tCb29sZWFuKFN0cmluZyBrZXksIE1hcCBtYXApCi0gICAgewotICAgICAgICBTdHJpbmcgdmFsdWUgPSBmaW5kVmFsdWVDYXNlbGVzc2x5KGtleSwgbWFwKTsKLQotICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICByZXR1cm4gdmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBHZXRzIHRoZSBjdXJyZW50IGxvY2F0aW9uIHdpdGhpbiB0aGUgZmlsZS4gIFRoaXMgYWxsb3dzIHRoZSBsb2NhdGlvbiB0byBiZQotICAgICAqICBjcmVhdGVkIG9ubHkgYXMgbmVlZGVkLCBhbmQgbXVsdGlwbGUgb2JqZWN0cyBvbiB0aGUgc2FtZSBsaW5lIGNhbiBzaGFyZQotICAgICAqICB0aGUgc2FtZSBMb2NhdGlvbiBpbnN0YW5jZS4KLSAgICAgKiAKLSAgICAgKiAgQHNpbmNlIDMuMAotICAgICAqIAotICAgICAqKi8KLQotICAgIHByb3RlY3RlZCBJTG9jYXRpb24gZ2V0Q3VycmVudExvY2F0aW9uKCkKLSAgICB7Ci0gICAgICAgIGlmIChfY3VycmVudExvY2F0aW9uID09IG51bGwpCi0gICAgICAgICAgICBfY3VycmVudExvY2F0aW9uID0gbmV3IExvY2F0aW9uKF9yZXNvdXJjZUxvY2F0aW9uLCBfbGluZSk7Ci0KLSAgICAgICAgcmV0dXJuIF9jdXJyZW50TG9jYXRpb247Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9wYXJzZS9UZW1wbGF0ZVRva2VuLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvcGFyc2UvVGVtcGxhdGVUb2tlbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzIxOTI4Li4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9wYXJzZS9UZW1wbGF0ZVRva2VuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5wYXJzZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLmJ1aWxkZXIuVG9TdHJpbmdCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUxvY2F0YWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklMb2NhdGlvbjsKLQotLyoqCi0gKiAgQmFzZSBjbGFzcyBmb3IgYSBudW1iZXIgb2YgZGlmZmVyZW50IHR5cGVzIG9mIHRva2VucyB0aGF0IGNhbiBiZSBleHRyYWN0ZWQKLSAqICBmcm9tIGEgcGFnZS9jb21wb25lbnQgdGVtcGxhdGUuICBUaGlzIGNsYXNzIGRlZmluZXMgdGhlCi0gKiAgdHlwZSBvZiB0aGUgdG9rZW4sCi0gKiAgc3ViY2xhc3NlcyBwcm92aWRlIGludGVycHJldGF0aW9ucyBvbiB0aGUgdG9rZW4uCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAKLSAqKi8KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFRlbXBsYXRlVG9rZW4gaW1wbGVtZW50cyBJTG9jYXRhYmxlCi17Ci0gICAgcHJpdmF0ZSBUb2tlblR5cGUgX3R5cGU7Ci0gICAgcHJpdmF0ZSBJTG9jYXRpb24gX2xvY2F0aW9uOwotCi0gICAgcHJvdGVjdGVkIFRlbXBsYXRlVG9rZW4oVG9rZW5UeXBlIHR5cGUsIElMb2NhdGlvbiBsb2NhdGlvbikKLSAgICB7Ci0gICAgICAgIF90eXBlID0gdHlwZTsKLSAgICAgICAgX2xvY2F0aW9uID0gbG9jYXRpb247Ci0gICAgfQotCi0gICAgcHVibGljIFRva2VuVHlwZSBnZXRUeXBlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfdHlwZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIElMb2NhdGlvbiBnZXRMb2NhdGlvbigpCi0gICAgewotICAgIAlyZXR1cm4gX2xvY2F0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICAgIHsKLSAgICAgICAgVG9TdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgVG9TdHJpbmdCdWlsZGVyKHRoaXMpOwotCi0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJ0eXBlIiwgX3R5cGUuZ2V0TmFtZSgpKTsKLSAgICAgICAgYnVpbGRlci5hcHBlbmQoImxvY2F0aW9uIiwgX2xvY2F0aW9uKTsKLQotICAgICAgICBleHRlbmREZXNjcmlwdGlvbihidWlsZGVyKTsKLQotICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBPdmVycmlkZGVuIGluIHN1YmNsYXNzZXMgdG8gYXBwZW5kIGFkZGl0aW9uYWwgZmllbGRzIChkZWZpbmVkIGluIHRoZSBzdWJjbGFzcykKLSAgICAgKiAgdG8gdGhlIGRlc2NyaXB0aW9uLiAgU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2Qgd2l0aG91dCBpbnZva2luZwotICAgICAqICB0aGlzIGltcGxlbWVudGF0aW9uLCB3aGljaCBpcyBlbXB0eS4KLSAgICAgKiAKLSAgICAgKiAgQHNpbmNlIDMuMAotICAgICAqIAotICAgICAqKi8KLQotICAgIHByb3RlY3RlZCB2b2lkIGV4dGVuZERlc2NyaXB0aW9uKFRvU3RyaW5nQnVpbGRlciBidWlsZGVyKQotICAgIHsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3BhcnNlL1RleHRUb2tlbi5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3BhcnNlL1RleHRUb2tlbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODQwODkxLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9wYXJzZS9UZXh0VG9rZW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MyArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5wYXJzZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLmJ1aWxkZXIuVG9TdHJpbmdCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUxvY2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSU1hcmt1cFdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZW5kZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVxdWVzdEN5Y2xlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuVGFwZXN0cnk7Ci0KLS8qKgotICogIFJlcHJlc2VudHMgc3RhdGljIHRleHQgaW4gdGhlIHRlbXBsYXRlIHRoYXQgbWF5IGJlIHBhc3NlZCB0aHJvdWdoCi0gKiAgdG8gdGhlIGNsaWVudCB1bmNoYW5nZWQgKGV4Y2VwdCwgcGVyaGFwcywgZm9yIHRoZSByZW1vdmFsIG9mCi0gKiAgc29tZSB3aGl0ZXNwYWNlKS4KLSAqCi0gKiAgQHNlZSBUb2tlblR5cGUjVEVYVAotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQHNpbmNlIDMuMAotICoKLSAqKi8KLQotcHVibGljIGNsYXNzIFRleHRUb2tlbiBleHRlbmRzIFRlbXBsYXRlVG9rZW4gaW1wbGVtZW50cyBJUmVuZGVyCi17Ci0gICAgcHJpdmF0ZSBjaGFyW10gX3RlbXBsYXRlRGF0YTsKLQotICAgIHByaXZhdGUgaW50IF9zdGFydEluZGV4ID0gLTE7Ci0gICAgcHJpdmF0ZSBpbnQgX2VuZEluZGV4ID0gLTE7Ci0KLSAgICBwcml2YXRlIGludCBfb2Zmc2V0OwotICAgIHByaXZhdGUgaW50IF9sZW5ndGg7Ci0gICAgcHJpdmF0ZSBib29sZWFuIF9uZWVkc1RyaW0gPSB0cnVlOwotCi0gICAgcHVibGljIFRleHRUb2tlbihjaGFyW10gdGVtcGxhdGVEYXRhLCBpbnQgc3RhcnRJbmRleCwgaW50IGVuZEluZGV4LCBJTG9jYXRpb24gbG9jYXRpb24pCi0gICAgewotICAgICAgICBzdXBlcihUb2tlblR5cGUuVEVYVCwgbG9jYXRpb24pOwotCi0gICAgICAgIGlmIChzdGFydEluZGV4IDwgMAotICAgICAgICAgICAgfHwgZW5kSW5kZXggPCAwCi0gICAgICAgICAgICB8fCBzdGFydEluZGV4ID4gdGVtcGxhdGVEYXRhLmxlbmd0aAotICAgICAgICAgICAgfHwgZW5kSW5kZXggPiB0ZW1wbGF0ZURhdGEubGVuZ3RoKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICBUYXBlc3RyeS5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICJUZXh0VG9rZW4ucmFuZ2UtZXJyb3IiLAotICAgICAgICAgICAgICAgICAgICB0aGlzLAotICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKHRlbXBsYXRlRGF0YS5sZW5ndGgpKSk7Ci0KLSAgICAgICAgX3RlbXBsYXRlRGF0YSA9IHRlbXBsYXRlRGF0YTsKLSAgICAgICAgX3N0YXJ0SW5kZXggPSBzdGFydEluZGV4OwotICAgICAgICBfZW5kSW5kZXggPSBlbmRJbmRleDsKLQotICAgICAgICAvLyBWYWx1ZXMgYWN0dWFsbHkgdXNlZCB0byByZW5kZXIsIG1heSBiZSBhZGp1c3RlZCB0byByZW1vdmUgZXhjZXNzCi0gICAgICAgIC8vIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UuCi0KLSAgICAgICAgX29mZnNldCA9IHN0YXJ0SW5kZXg7Ci0gICAgICAgIF9sZW5ndGggPSBlbmRJbmRleCAtIHN0YXJ0SW5kZXggKyAxOwotICAgIH0KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW5kZXIoSU1hcmt1cFdyaXRlciB3cml0ZXIsIElSZXF1ZXN0Q3ljbGUgY3ljbGUpCi0gICAgewotICAgICAgICBpZiAoX25lZWRzVHJpbSkKLSAgICAgICAgewotICAgICAgICAgICAgdHJpbSgpOwotICAgICAgICAgICAgX25lZWRzVHJpbSA9IGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKF9sZW5ndGggPT0gMCkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAvLyBBdCBvbmUgdGltZSwgd2Ugd291bGQgY2hlY2sgdG8gc2VlIGlmIHRoZSBjeWNsZSB3YXMgcmV3aW5kaW5nIGFuZAotICAgICAgICAvLyBvbmx5IGludm9rZSBwcmludFJhdygpIGlmIGl0IHdhcy4gIEhvd2V2ZXIsIHRoYXQgc2xvd3MgZG93bgotICAgICAgICAvLyBub3JtYWwgcmVuZGVyaW5nIChtaWNyb3Njb3BpY2FsbHkpIGFuZCwgd2l0aCB0aGUgbmV3Ci0gICAgICAgIC8vIE51bGxSZXNwb25zZVdyaXRlciBjbGFzcywgdGhlICJjb3N0IiBvZiBpbnZva2luZyBjeWNsZS5pc1Jld2luZGluZygpCi0gICAgICAgIC8vIGlzIGFwcHJveGltYXRlbHkgdGhlIHNhbWUgYXMgdGhlICJjb3N0IiBvZiBpbnZva2luZyB3cml0ZXIucHJpbnRSYXcoKS4KLQotICAgICAgICB3cml0ZXIucHJpbnRSYXcoX3RlbXBsYXRlRGF0YSwgX29mZnNldCwgX2xlbmd0aCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICAqICBTdHJpcCBvZmYgYWxsIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UgYnkgYWRqdXN0aW5nIG9mZnNldCBhbmQgbGVuZ3RoLgotICAgICAgKgotICAgICAgKiovCi0KLSAgICBwcml2YXRlIHZvaWQgdHJpbSgpCi0gICAgewotICAgICAgICBpZiAoX2xlbmd0aCA9PSAwKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBib29sZWFuIGRpZFRyaW0gPSBmYWxzZTsKLQotICAgICAgICAgICAgLy8gU2hhdmUgY2hhcmFjdGVycyBvZmYgdGhlIGVuZCB1bnRpbCB3ZSBoaXQgYSBub24td2hpdGVzcGFjZQotICAgICAgICAgICAgLy8gY2hhcmFjdGVyLgotCi0gICAgICAgICAgICB3aGlsZSAoX2xlbmd0aCA+IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2hhciBjaCA9IF90ZW1wbGF0ZURhdGFbX29mZnNldCArIF9sZW5ndGggLSAxXTsKLQotICAgICAgICAgICAgICAgIGlmICghQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShjaCkpCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgX2xlbmd0aC0tOwotICAgICAgICAgICAgICAgIGRpZFRyaW0gPSB0cnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBSZXN0b3JlIG9uZSBjaGFyYWN0ZXIgb2Ygd2hpdGVzcGFjZSB0byB0aGUgZW5kCi0KLSAgICAgICAgICAgIGlmIChkaWRUcmltKQotICAgICAgICAgICAgICAgIF9sZW5ndGgrKzsKLQotICAgICAgICAgICAgZGlkVHJpbSA9IGZhbHNlOwotCi0gICAgICAgICAgICAvLyBTdHJpcCBjaGFyYWN0ZXJzIG9mZiB0aGUgZnJvbnQgdW50aWwgd2UgaGl0IGEgbm9uLXdoaXRlc3BhY2UKLSAgICAgICAgICAgIC8vIGNoYXJhY3Rlci4KLQotICAgICAgICAgICAgd2hpbGUgKF9sZW5ndGggPiAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNoYXIgY2ggPSBfdGVtcGxhdGVEYXRhW19vZmZzZXRdOwotCi0gICAgICAgICAgICAgICAgaWYgKCFDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGNoKSkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBfb2Zmc2V0Kys7Ci0gICAgICAgICAgICAgICAgX2xlbmd0aC0tOwotICAgICAgICAgICAgICAgIGRpZFRyaW0gPSB0cnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBBZ2FpbiwgcmVzdG9yZSBvbmUgY2hhcmFjdGVyIG9mIHdoaXRlc3BhY2UuCi0KLSAgICAgICAgICAgIGlmIChkaWRUcmltKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9vZmZzZXQtLTsKLSAgICAgICAgICAgICAgICBfbGVuZ3RoKys7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBleCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oVGFwZXN0cnkuZm9ybWF0KCJUZXh0VG9rZW4uZXJyb3ItdHJpbW1pbmciLCB0aGlzKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBPaywgdGhpcyBpc24ndCBwZXJmZWN0LiAgSSBkb24ndCB3YW50IHRvIHdyaXRlIGludG8gdGVtcGxhdGVEYXRhW10gZXZlbgotICAgICAgICAvLyB0aG91Z2ggSSdkIHByZWZlciB0aGF0IG15IHNpbmdsZSBjaGFyYWN0ZXIgb2Ygd2hpdGVzcGFjZSB3YXMgYWx3YXlzIGEgc3BhY2UuCi0gICAgICAgIC8vIEl0IHdvdWxkIGFsc28gYmUga2luZCBvZiBuZWF0IHRvIHNoYXZlIHdoaXRlc3BhY2Ugd2l0aGluIHRoZSBzdGF0aWMgSFRNTCwgcmF0aGVyCi0gICAgICAgIC8vIHRoYW4ganVzdCBvbiB0aGUgZWRnZXMuCi0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgZXh0ZW5kRGVzY3JpcHRpb24oVG9TdHJpbmdCdWlsZGVyIGJ1aWxkZXIpCi0gICAgewotICAgICAgICBidWlsZGVyLmFwcGVuZCgic3RhcnRJbmRleCIsIF9zdGFydEluZGV4KTsKLSAgICAgICAgYnVpbGRlci5hcHBlbmQoImVuZEluZGV4IiwgX2VuZEluZGV4KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldEVuZEluZGV4KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfZW5kSW5kZXg7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRTdGFydEluZGV4KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfc3RhcnRJbmRleDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgY2hhcltdIGdldFRlbXBsYXRlRGF0YSgpCi0gICAgewotICAgICAgICByZXR1cm4gX3RlbXBsYXRlRGF0YTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9wYXJzZS9Ub2tlblR5cGUuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9wYXJzZS9Ub2tlblR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBjODU0MC4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvcGFyc2UvVG9rZW5UeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5wYXJzZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLmVudW0uRW51bTsKLQotLyoqCi0gKiBBbiB7QGxpbmsgRW51bX0gb2YgdGhlIGRpZmZlcmVudCBwb3NzaWJsZSB0b2tlbiB0eXBlcy4KLSAqCi0gKiBAc2VlIFRlbXBsYXRlVG9rZW4KLSAqCi0gKiBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiBAdmVyc2lvbiAkSWQkCi0gKiAKLSAqKi8KLQotcHVibGljIGNsYXNzIFRva2VuVHlwZSBleHRlbmRzIEVudW0KLXsKLSAgICAvKioKLSAgICAgKiAgUmF3IEhUTUwgdGV4dC4KLSAgICAgKiAKLSAgICAgKiAgQHNlZSBUZXh0VG9rZW4KLSAgICAgKiAKLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVG9rZW5UeXBlIFRFWFQgPSBuZXcgVG9rZW5UeXBlKCJURVhUIik7Ci0KLSAgICAvKioKLSAgICAgKiAgVGhlIG9wZW5pbmcgdGFnIG9mIGFuIGVsZW1lbnQuCi0gICAgICogCi0gICAgICogIEBzZWUgT3BlblRva2VuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFRva2VuVHlwZSBPUEVOID0gbmV3IFRva2VuVHlwZSgiT1BFTiIpOwotCi0gICAgLyoqCi0gICAgICogIFRoZSBjbG9zaW5nIHRhZyBvZiBhbiBlbGVtZW50LgotICAgICAqIAotICAgICAqICBAc2VlIENsb3NlVG9rZW4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVG9rZW5UeXBlIENMT1NFID0gbmV3IFRva2VuVHlwZSgiQ0xPU0UiKTsKLQotICAgIC8qKgotICAgICAqIAotICAgICAqICBBIHJlZmVyZW5jZSB0byBhIGxvY2FsaXplZCBzdHJpbmcuCi0gICAgICogCi0gICAgICogIEBzaW5jZSAyLjAuNAotICAgICAqIAotICAgICAqKi8KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFRva2VuVHlwZSBMT0NBTElaQVRJT04gPSBuZXcgVG9rZW5UeXBlKCJMT0NBTElaQVRJT04iKTsKLSAgICAKLSAgICBwcml2YXRlIFRva2VuVHlwZShTdHJpbmcgbmFtZSkKLSAgICB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9wYXJzZS9WYWxpZGF0ZVB1YmxpY0lkUnVsZS5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3BhcnNlL1ZhbGlkYXRlUHVibGljSWRSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1NDU4NWUuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3BhcnNlL1ZhbGlkYXRlUHVibGljSWRSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5wYXJzZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlc291cmNlTG9jYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5UYXBlc3RyeTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnV0aWwueG1sLkRvY3VtZW50UGFyc2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKLQotLyoqCi0gKiAgUnVsZSB1c2VkIHRvIHZhbGlkYXRlIHRoZSBwdWJsaWMgaWQgb2YgdGhlIGRvY3VtZW50LCBlbnN1cmluZyB0aGF0Ci0gKiAgaXQgaXMgbm90IG51bGwsIGFuZCB0aGF0IGl0IG1hdGNoZXMgYW4gZXhwZWN0ZWQgdmFsdWUuCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQHNpbmNlIDMuMAotICoKLSAqKi8KLQotcHVibGljIGNsYXNzIFZhbGlkYXRlUHVibGljSWRSdWxlIGV4dGVuZHMgQmFzZURvY3VtZW50UnVsZQotewotICAgIHByaXZhdGUgU3RyaW5nW10gX3B1YmxpY0lkczsKLSAgICBwcml2YXRlIFN0cmluZyBfcm9vdEVsZW1lbnQ7Ci0KLSAgICBwdWJsaWMgVmFsaWRhdGVQdWJsaWNJZFJ1bGUoU3RyaW5nW10gcHVibGljSWRzLCBTdHJpbmcgcm9vdEVsZW1lbnQpCi0gICAgewotICAgICAgICBfcHVibGljSWRzID0gcHVibGljSWRzOwotICAgICAgICBfcm9vdEVsZW1lbnQgPSByb290RWxlbWVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdGFydERvY3VtZW50KFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBuYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFNwZWNpZmljYXRpb25EaWdlc3RlciBkaWdlc3RlciA9IGdldERpZ2VzdGVyKCk7Ci0gICAgICAgIElSZXNvdXJjZUxvY2F0aW9uIGxvY2F0aW9uID0gZGlnZXN0ZXIuZ2V0UmVzb3VyY2VMb2NhdGlvbigpOwotCi0gICAgICAgIFN0cmluZyBwdWJsaWNJZCA9IGRpZ2VzdGVyLmdldFB1YmxpY0lkKCk7Ci0KLQkJLy8gcHVibGljSWQgd2lsbCBuZXZlciBiZSBudWxsIGJlY2F1c2Ugd2UgdXNlIGEgdmFsaWRhdGluZyBwYXJzZXIuCi0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfcHVibGljSWRzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoX3B1YmxpY0lkc1tpXS5lcXVhbHMocHVibGljSWQpKQotICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgaWYgKCFuYW1lLmVxdWFscyhfcm9vdEVsZW1lbnQpKQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRG9jdW1lbnRQYXJzZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgIFRhcGVzdHJ5LmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWJzdHJhY3REb2N1bWVudFBhcnNlci5pbmNvcnJlY3QtZG9jdW1lbnQtdHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3Jvb3RFbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24pOwotCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotICAgICAgICB0aHJvdyBuZXcgRG9jdW1lbnRQYXJzZUV4Y2VwdGlvbigKLSAgICAgICAgICAgIFRhcGVzdHJ5LmZvcm1hdCgiQWJzdHJhY3REb2N1bWVudFBhcnNlci51bmtub3duLXB1YmxpYy1pZCIsIGxvY2F0aW9uLCBwdWJsaWNJZCksCi0gICAgICAgICAgICBsb2NhdGlvbik7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvcGFyc2UvVmFsaWRhdGVSdWxlLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvcGFyc2UvVmFsaWRhdGVSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlMDdlNWEuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3BhcnNlL1ZhbGlkYXRlUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkucGFyc2U7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LlRhcGVzdHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkudXRpbC5SZWdleHBNYXRjaGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkudXRpbC54bWwuSW52YWxpZFN0cmluZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOwotCi0vKioKLSAqICBWYWxpZGF0ZXMgdGhhdCBhbiBhdHRyaWJ1dGUgbWF0Y2hlcyBhIHNwZWNpZmllZCBwYXR0ZXJuLgotICoKLSAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiAgQHZlcnNpb24gJElkJAotICogIEBzaW5jZSAzLjAKLSAqCi0gKiovCi0KLXB1YmxpYyBjbGFzcyBWYWxpZGF0ZVJ1bGUgZXh0ZW5kcyBBYnN0cmFjdFNwZWNpZmljYXRpb25SdWxlCi17Ci0gICAgcHJpdmF0ZSBSZWdleHBNYXRjaGVyIF9tYXRjaGVyOwotICAgIHByaXZhdGUgU3RyaW5nIF9hdHRyaWJ1dGVOYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIF9wYXR0ZXJuOwotICAgIHByaXZhdGUgU3RyaW5nIF9lcnJvcktleTsKLQotCXB1YmxpYyBWYWxpZGF0ZVJ1bGUoUmVnZXhwTWF0Y2hlciBtYXRjaGVyLCBTdHJpbmcgYXR0cmlidXRlTmFtZSwgU3RyaW5nIHBhdHRlcm4sIFN0cmluZyBlcnJvcktleSkKLQl7Ci0JCV9tYXRjaGVyID0gbWF0Y2hlcjsKLQkJX2F0dHJpYnV0ZU5hbWUgPSBhdHRyaWJ1dGVOYW1lOwotCQlfcGF0dGVybiA9IHBhdHRlcm47Ci0JCV9lcnJvcktleSA9IGVycm9yS2V5OwotCX0KLQotCS8qKgotCSAqICBWYWxpZGF0ZXMgdGhhdCB0aGUgYXR0cmlidXRlLCBpZiBwcm92aWRlZCwgbWF0Y2hlcyB0aGUgcGF0dGVybi4KLQkgKiAKLQkgKiAgQHRocm93cyBJbnZhbGlkU3RyaW5nRXhjZXB0aW9uIGlmIHRoZSB2YWx1ZSBkb2VzIG5vdCBtYXRjaCB0aGUgcGF0dGVybi4KLQkgKiAKLQkgKiovCi0JCi0gICAgcHVibGljIHZvaWQgYmVnaW4oU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIG5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgU3RyaW5nIHZhbHVlID0gZ2V0VmFsdWUoYXR0cmlidXRlcywgX2F0dHJpYnV0ZU5hbWUpOwotICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBpZiAoX21hdGNoZXIubWF0Y2hlcyhfcGF0dGVybiwgdmFsdWUpKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIHRocm93IG5ldyBJbnZhbGlkU3RyaW5nRXhjZXB0aW9uKAotICAgICAgICAgICAgVGFwZXN0cnkuZm9ybWF0KF9lcnJvcktleSwgdmFsdWUpLAotICAgICAgICAgICAgdmFsdWUsCi0gICAgICAgICAgICBnZXRSZXNvdXJjZUxvY2F0aW9uKCkpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3BhcnNlL3BhY2thZ2UuaHRtbCBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9wYXJzZS9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmNjQyMmMuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3BhcnNlL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLTwhZG9jdHlwZSBodG1sIHB1YmxpYyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci08IS0tICRJZCQgLS0+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlRhcGVzdHJ5OiBXZWIgQXBwbGljYXRpb24gRnJhbWV3b3JrPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotCi08cD5DbGFzc2VzIHVzZWQgd2hlbiBwYXJzaW5nIHRlbXBsYXRlcywgYXBwbGljYXRpb24gYW5kIGNvbXBvbmVudCBzcGVjaWZpY2F0aW9ucy4KLQotQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcCA8YSBocmVmPSJtYWlsdG86aGxzaGlwQGFwYWNoZS5vcmciPmhsc2hpcEBhcGFjaGUub3JnPC9hPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvcmVjb3JkL0NoYW5nZUtleS5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3JlY29yZC9DaGFuZ2VLZXkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzllNjFiNy4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvcmVjb3JkL0NoYW5nZUtleS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkucmVjb3JkOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuYnVpbGRlci5FcXVhbHNCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLmJ1aWxkZXIuSGFzaENvZGVCdWlsZGVyOwotCi0vKioKLSAqICBVc2VkIHRvIGlkZW50aWZ5IGEgcHJvcGVydHkgY2hhbmdlLgotICoKLSAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiAgQHZlcnNpb24gJElkJAotICogCi0gKiovCi0KLXB1YmxpYyBjbGFzcyBDaGFuZ2VLZXkKLXsKLSAgICBwcml2YXRlIGludCBfaGFzaENvZGUgPSAtMTsKLSAgICBwcml2YXRlIFN0cmluZyBfY29tcG9uZW50UGF0aDsKLSAgICBwcml2YXRlIFN0cmluZyBfcHJvcGVydHlOYW1lOwotCi0gICAgcHVibGljIENoYW5nZUtleShTdHJpbmcgY29tcG9uZW50UGF0aCwgU3RyaW5nIHByb3BlcnR5TmFtZSkKLSAgICB7Ci0gICAgICAgIF9jb21wb25lbnRQYXRoID0gY29tcG9uZW50UGF0aDsKLSAgICAgICAgX3Byb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iamVjdCkKLSAgICB7Ci0gICAgICAgIGlmIChvYmplY3QgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBpZiAodGhpcyA9PSBvYmplY3QpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgICAgICBpZiAoIShvYmplY3QgaW5zdGFuY2VvZiBDaGFuZ2VLZXkpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIENoYW5nZUtleSBvdGhlciA9IChDaGFuZ2VLZXkpIG9iamVjdDsKLQotICAgICAgICBFcXVhbHNCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgRXF1YWxzQnVpbGRlcigpOwotCi0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKF9wcm9wZXJ0eU5hbWUsIG90aGVyLl9wcm9wZXJ0eU5hbWUpOwotICAgICAgICBidWlsZGVyLmFwcGVuZChfY29tcG9uZW50UGF0aCwgb3RoZXIuX2NvbXBvbmVudFBhdGgpOwotCi0gICAgICAgIHJldHVybiBidWlsZGVyLmlzRXF1YWxzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRDb21wb25lbnRQYXRoKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfY29tcG9uZW50UGF0aDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5TmFtZSgpCi0gICAgewotICAgICAgICByZXR1cm4gX3Byb3BlcnR5TmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKgotICAgICAqICBSZXR1cm5zIGEgaGFzaCBjb2RlIGNvbXB1dGVkIGZyb20gdGhlCi0gICAgICogIHByb3BlcnR5IG5hbWUgYW5kIGNvbXBvbmVudCBwYXRoLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpCi0gICAgewotICAgICAgICBpZiAoX2hhc2hDb2RlID09IC0xKQotICAgICAgICB7Ci0gICAgICAgICAgICBIYXNoQ29kZUJ1aWxkZXIgYnVpbGRlciA9IG5ldyBIYXNoQ29kZUJ1aWxkZXIoMjU3LCAyMyk7IC8vIFJhbmRvbQotCi0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZChfcHJvcGVydHlOYW1lKTsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKF9jb21wb25lbnRQYXRoKTsKLQotICAgICAgICAgICAgX2hhc2hDb2RlID0gYnVpbGRlci50b0hhc2hDb2RlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gX2hhc2hDb2RlOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvcmVjb3JkL0lQYWdlQ2hhbmdlLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvcmVjb3JkL0lQYWdlQ2hhbmdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4NjYxMjUuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3JlY29yZC9JUGFnZUNoYW5nZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkucmVjb3JkOwotCi0vKioKLSAqICBSZXByZXNlbnRzIGEgY2hhbmdlIHRvIGEgY29tcG9uZW50IG9uIGEgcGFnZSwgdGhpcyByZXByZXNlbnRzCi0gKiAgYSBkYXR1bSBvZiBpbmZvcm1hdGlvbiBzdG9yZWQgYnkgYSB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5lbmdpbmUuSVBhZ2VSZWNvcmRlcn0uCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSVBhZ2VDaGFuZ2UKLXsKLSAgICAvKioKLSAgICAgKiAgVGhlIHBhdGggdG8gdGhlIGNvbXBvbmVudCBvbiB0aGUgcGFnZSwgb3IgbnVsbCBpZiB0aGUgcHJvcGVydHkgaXMgYSBwcm9wZXJ0eQotICAgICAqICBvZiB0aGUgcGFnZS4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29tcG9uZW50UGF0aCgpOwotCi0gICAgLyoqCi0gICAgICogIFRoZSBuZXcgdmFsdWUgZm9yIHRoZSBwcm9wZXJ0eSwgd2hpY2ggbWF5IGJlIG51bGwuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgT2JqZWN0IGdldE5ld1ZhbHVlKCk7Ci0KLSAgICAvKioKLSAgICAgKiAgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRoYXQgY2hhbmdlZC4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHlOYW1lKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3JlY29yZC9QYWdlQ2hhbmdlLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvcmVjb3JkL1BhZ2VDaGFuZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmUxOTZiMC4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvcmVjb3JkL1BhZ2VDaGFuZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LnJlY29yZDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLmJ1aWxkZXIuVG9TdHJpbmdCdWlsZGVyOwotCi0KLS8qKgotICogIFJlcHJlc2VudHMgYSBjaGFuZ2UgdG8gYSBjb21wb25lbnQgb24gYSBwYWdlLgotICoKLSAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiAgQHZlcnNpb24gJElkJAotICogCi0gKiovCi0KLXB1YmxpYyBjbGFzcyBQYWdlQ2hhbmdlIGltcGxlbWVudHMgSVBhZ2VDaGFuZ2UKLXsKLSAgICBwcml2YXRlIFN0cmluZyBfY29tcG9uZW50UGF0aDsKLSAgICBwcml2YXRlIFN0cmluZyBfcHJvcGVydHlOYW1lOwotICAgIHByaXZhdGUgT2JqZWN0IF9uZXdWYWx1ZTsKLQotICAgIHB1YmxpYyBQYWdlQ2hhbmdlKFN0cmluZyBjb21wb25lbnRQYXRoLCBTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgbmV3VmFsdWUpCi0gICAgewotICAgICAgICBfY29tcG9uZW50UGF0aCA9IGNvbXBvbmVudFBhdGg7Ci0gICAgICAgIF9wcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWU7Ci0gICAgICAgIF9uZXdWYWx1ZSA9IG5ld1ZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBUaGUgcGF0aCB0byB0aGUgY29tcG9uZW50IG9uIHRoZSBwYWdlLCBvciBudWxsIGlmIHRoZSBwcm9wZXJ0eQotICAgICAqICBpcyBhIHByb3BlcnR5IG9mIHRoZSBwYWdlLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIFN0cmluZyBnZXRDb21wb25lbnRQYXRoKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfY29tcG9uZW50UGF0aDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgVGhlIG5ldyB2YWx1ZSBmb3IgdGhlIHByb3BlcnR5LCB3aGljaCBtYXkgYmUgbnVsbC4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0TmV3VmFsdWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9uZXdWYWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRoYXQgY2hhbmdlZC4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHlOYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfcHJvcGVydHlOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICAgIHsKLSAgICAgICAgVG9TdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgVG9TdHJpbmdCdWlsZGVyKHRoaXMpOwotICAgICAgICAKLSAgICAgICAgYnVpbGRlci5hcHBlbmQoImNvbXBvbmVudFBhdGgiLCBfY29tcG9uZW50UGF0aCk7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJwcm9wZXJ0eU5hbWUiLCBfcHJvcGVydHlOYW1lKTsKLSAgICAgICAgYnVpbGRlci5hcHBlbmQoIm5ld1ZhbHVlIiwgX25ld1ZhbHVlKTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9yZWNvcmQvUGFnZVJlY29yZGVyLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvcmVjb3JkL1BhZ2VSZWNvcmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDAzMTU1Li4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9yZWNvcmQvUGFnZVJlY29yZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzggKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkucmVjb3JkOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5BcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JQ29tcG9uZW50OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVBhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVzb3VyY2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LlRhcGVzdHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuZW5naW5lLklQYWdlUmVjb3JkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5ldmVudC5PYnNlcnZlZENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkudXRpbC5wcm9wLk9nbmxVdGlsczsKLQotLyoqCi0gKiAgVHJhY2tzIGNoYW5nZXMgdG8gY29tcG9uZW50cyBvbiBhIHBhZ2UsIGFsbG93aW5nIGNoYW5nZXMgdG8gYmUgcGVyc2lzdGVkIGFjcm9zcwotICogIHJlcXVlc3QgY3ljbGVzLCBhbmQgcmVzdG9yaW5nIHRoZSBzdGF0ZSBvZiBhIHBhZ2UgYW5kIGNvbXBvbmVudCB3aGVuIG5lZWRlZC4KLSAqCi0gKiAgPHA+VGhpcyBpcyBhbiBhYnN0cmFjdCBpbXBsZW1lbnRhdGlvbjsgc3BlY2lmaWMgaW1wbGVtZW50YXRpb25zIGNhbiBjaG9vc2Ugd2hlcmUKLSAqICBhbmQgaG93IHRvIHBlcnNpc3QgdGhlIGRhdGEuCi0gKgotICogQGF1dGhvciBIb3dhcmQgU2hpcAotICogQHZlcnNpb24gJElkJAotICogCi0gKiovCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQYWdlUmVjb3JkZXIgaW1wbGVtZW50cyBJUGFnZVJlY29yZGVyCi17Ci0gICAgcHJpdmF0ZSBib29sZWFuIF9kaXJ0eSA9IGZhbHNlOwotICAgIHByaXZhdGUgYm9vbGVhbiBfbG9ja2VkID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBib29sZWFuIF9kaXNjYXJkID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiAgSW52b2tlZCB0byBwZXJzaXN0IGFsbCBjaGFuZ2VzIHRoYXQgaGF2ZSBiZWVuIGFjY3VtdWxhdGVkLiAgSWYgdGhlIHJlY29yZGVyCi0gICAgICogIHNhdmVzIGNoYW5nZSBpbmNyZW1lbnRhbGx5LCB0aGlzIHNob3VsZCBlbnN1cmUgdGhhdCBhbGwgY2hhbmdlcyBoYXZlIGJlZW4gcGVyc2lzdGVkLgotICAgICAqCi0gICAgICogIDxwPlN1YmNsYXNzZXMgc2hvdWxkIGNoZWNrIHRoZSBkaXJ0eSBmbGFnLiAgSWYgdGhlIHJlY29yZGVyIGlzIGRpcnR5LCBjaGFuZ2VzCi0gICAgICogIHNob3VsZCBiZSByZWNvcmRlZCBhbmQgdGhlIGRpcnR5IGZsYWcgY2xlYXJlZC4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGNvbW1pdCgpOwotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgYSA8Y29kZT5Db2xsZWN0aW9uPC9jb2RlPiBvZiAKLSAgICAgKiAge0BsaW5rIElQYWdlQ2hhbmdlfSBvYmplY3RzCi0gICAgICogIGlkZW50aWZ5aW5nIGNoYW5nZXMgdG8gdGhlIHBhZ2UgYW5kIGl0cyBjb21wb25lbnRzLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIGFic3RyYWN0IENvbGxlY3Rpb24gZ2V0Q2hhbmdlcygpOwotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgdHJ1ZSBpZiB0aGUgcGFnZSBoYXMgb2JzZXJ2ZWQgYSBjaGFuZ2UuCi0gICAgICogIFRoZSBkaXJ0eSBmbGFnIGlzIGNsZWFyZWQgYnkKLSAgICAgKiAge0BsaW5rICNjb21taXQoKX0uCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0RpcnR5KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfZGlydHk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgdHJ1ZSBpZiB0aGUgcmVjb3JkZXIgaXMgbG9ja2VkLiAgVGhlIGxvY2tlZCBmbGFnCi0gICAgICogIGlzIHNldCBieSB7QGxpbmsgI2NvbW1pdCgpfS4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBib29sZWFuIGlzTG9ja2VkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfbG9ja2VkOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldExvY2tlZChib29sZWFuIHZhbHVlKQotICAgIHsKLSAgICAgICAgX2xvY2tlZCA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBPYnNlcnZlcyB0aGUgY2hhbmdlLiAgVGhlIG9iamVjdCBvZiB0aGUgZXZlbnQgaXMgZXhwZWN0ZWQgdG8KLSAgICAgKiAgYmUgYW4ge0BsaW5rIElDb21wb25lbnR9LiAgSWdub3JlcyB0aGUgY2hhbmdlIGlmIG5vdCBhY3RpdmUsCi0gICAgICogIG90aGVyd2lzZSwgc2V0cyBpbnZva2VzIHtAbGluayAjcmVjb3JkQ2hhbmdlKFN0cmluZywgU3RyaW5nLAotICAgICAqICBPYmplY3QpfS4KLSAgICAgKgotICAgICAqICA8cD5JZiB0aGUgcHJvcGVydHkgbmFtZSBpbiB0aGUgZXZlbnQgaXMgbnVsbCwgdGhlbiB0aGUgcmVjb3JkZXIKLSAgICAgKiAgaXMgbWFya2VkIGRpcnR5IChidXQgCi0gICAgICogIHtAbGluayAjcmVjb3JkQ2hhbmdlKFN0cmluZywgU3RyaW5nLAotICAgICAqICBPYmplY3QpfSBpcyBub3QgaW52b2tlZC4gIFRoaXMgaXMgaG93IGEgImRpc3RhbnQiIHByb3BlcnR5IGNoYW5nZXMKLSAgICAgKiAgYXJlIHByb3BvZ2F0ZWQgdG8gdGhlIHBhZ2UgcmVjb3JkZXIgKGEgZGlzdGFudCBwcm9wZXJ0eSBjaGFuZ2UgaXMgYSBjaGFuZ2UgdG8KLSAgICAgKiAgYSBwcm9wZXJ0eSBvZiBhbiBvYmplY3QgdGhhdCBpcyBpdHNlbGYgYSBwcm9wZXJ0eSBvZiB0aGUgcGFnZSkuCi0gICAgICoKLSAgICAgKiAgPHA+SWYgdGhlIHJlY29yZGVyIGlzIG5vdCBhY3RpdmUgKHR5cGljYWxseSwgd2hlbiBhIHBhZ2UgaXMKLSAgICAgKiAgYmVpbmcgcmV3b3VuZCksIHRoZW4gdGhlIGV2ZW50IGlzIHNpbXBseSBpZ25vcmVkLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgb2JzZXJ2ZUNoYW5nZShPYnNlcnZlZENoYW5nZUV2ZW50IGV2ZW50KQotICAgIHsKLSAgICAgICAgSUNvbXBvbmVudCBjb21wb25lbnQgPSBldmVudC5nZXRDb21wb25lbnQoKTsKLSAgICAgICAgU3RyaW5nIHByb3BlcnR5TmFtZSA9IGV2ZW50LmdldFByb3BlcnR5TmFtZSgpOwotCi0gICAgICAgIGlmIChfbG9ja2VkKQotICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICBUYXBlc3RyeS5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICJQYWdlUmVjb3JkZXIuY2hhbmdlLWFmdGVyLWxvY2siLAotICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuZ2V0UGFnZSgpLmdldFBhZ2VOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgIHByb3BlcnR5TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LmdldEV4dGVuZGVkSWQoKSkpOwotCi0gICAgICAgIGlmIChwcm9wZXJ0eU5hbWUgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgVGFwZXN0cnkuZm9ybWF0KCJQYWdlUmVjb3JkZXIubnVsbC1wcm9wZXJ0eS1uYW1lIiwgY29tcG9uZW50LmdldEV4dGVuZGVkSWQoKSkpOwotCi0gICAgICAgIE9iamVjdCBhY3RpdmVWYWx1ZSA9IGV2ZW50LmdldE5ld1ZhbHVlKCk7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJlY29yZENoYW5nZShjb21wb25lbnQuZ2V0SWRQYXRoKCksIHByb3BlcnR5TmFtZSwgYWN0aXZlVmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICAgICAgewotICAgICAgICAgICAgdC5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgVGFwZXN0cnkuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAiUGFnZVJlY29yZGVyLnVuYWJsZS10by1wZXJzaXN0IiwKLSAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlOYW1lLAotICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuZ2V0RXh0ZW5kZWRJZCgpLAotICAgICAgICAgICAgICAgICAgICBhY3RpdmVWYWx1ZSksCi0gICAgICAgICAgICAgICAgdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgUmVjb3JkcyBhIGNoYW5nZSB0byBhIHBhcnRpY3VsYXIgY29tcG9uZW50LiAgU3ViY2xhc3NlcyBtYXkKLSAgICAgKiAgY2FjaGUgdGhlc2UgaW4gbWVtb3J5LCBvciByZWNvcmQgdGhlbSBleHRlcm5hbGx5IGF0IHRoaXMgdGltZS4KLSAgICAgKgotICAgICAqICA8cD5UaGlzIG1ldGhvZCBpcyByZXNwb25zaWJsZSBmb3Igc2V0dGluZyB0aGUgZGlydHkgZmxhZyBpZgotICAgICAqICB0aGUgZGVzY3JpYmVkIGNoYW5nZSBpcyByZWFsLgotICAgICAqCi0gICAgICogIEBwYXJhbSBjb21wb25lbnRQYXRoIHRoZSBuYW1lIG9mIHRoZSBjb21wb25lbnQgcmVsYXRpdmUgdG8gdGhlCi0gICAgICogIHBhZ2Ugd2hpY2ggY29udGFpbnMgaXQuICBNYXkgYmUgbnVsbCBpZiB0aGUgY2hhbmdlIHdhcyB0byBhCi0gICAgICogIHByb3BlcnR5IG9mIHRoZSBwYWdlIGl0c2VsZi4KLSAgICAgKgotICAgICAqICBAcGFyYW0gcHJvcGVydHlOYW1lIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB3aGljaCBjaGFuZ2VkLgotICAgICAqCi0gICAgICogIEBwYXJhbSBuZXdWYWx1ZSB0aGUgbmV3IHZhbHVlIGZvciB0aGUgcHJvcGVydHksIHdoaWNoIG1heSBhbHNvCi0gICAgICogIGJlIG51bGwuCi0gICAgICoKLSAgICAgKiAgQHNlZSBJQ29tcG9uZW50I2dldElkUGF0aCgpCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCByZWNvcmRDaGFuZ2UoCi0gICAgICAgIFN0cmluZyBjb21wb25lbnRQYXRoLAotICAgICAgICBTdHJpbmcgcHJvcGVydHlOYW1lLAotICAgICAgICBPYmplY3QgbmV3VmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogIFJvbGxzIGJhY2sgdGhlIHBhZ2UgdG8gdGhlIGN1cnJlbnRseSBwZXJzaXN0ZWQgc3RhdGUuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCByb2xsYmFjayhJUGFnZSBwYWdlKQotICAgIHsKLSAgICAgICAgQ29sbGVjdGlvbiBjaGFuZ2VzID0gZ2V0Q2hhbmdlcygpOwotCi0gICAgICAgIGlmIChjaGFuZ2VzLmlzRW1wdHkoKSkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBJUmVzb3VyY2VSZXNvbHZlciByZXNvbHZlciA9IHBhZ2UuZ2V0RW5naW5lKCkuZ2V0UmVzb3VyY2VSZXNvbHZlcigpOwotICAgICAgICBJdGVyYXRvciBpID0gY2hhbmdlcy5pdGVyYXRvcigpOwotCi0gICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgUGFnZUNoYW5nZSBjaGFuZ2UgPSAoUGFnZUNoYW5nZSkgaS5uZXh0KCk7Ci0KLSAgICAgICAgICAgIFN0cmluZyBwcm9wZXJ0eU5hbWUgPSBjaGFuZ2UuZ2V0UHJvcGVydHlOYW1lKCk7Ci0KLSAgICAgICAgICAgIElDb21wb25lbnQgY29tcG9uZW50ID0gcGFnZS5nZXROZXN0ZWRDb21wb25lbnQoY2hhbmdlLmdldENvbXBvbmVudFBhdGgoKSk7Ci0KLSAgICAgICAgICAgIE9iamVjdCBzdG9yZWRWYWx1ZSA9IGNoYW5nZS5nZXROZXdWYWx1ZSgpOwotCi0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBPZ25sVXRpbHMuc2V0KHByb3BlcnR5TmFtZSwgcmVzb2x2ZXIsIGNvbXBvbmVudCwgc3RvcmVkVmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIFRhcGVzdHJ5LmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJQYWdlUmVjb3JkZXIudW5hYmxlLXRvLXJvbGxiYWNrIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7IHByb3BlcnR5TmFtZSwgY29tcG9uZW50LCBzdG9yZWRWYWx1ZSwgdC5nZXRNZXNzYWdlKCl9KSwKLSAgICAgICAgICAgICAgICAgICAgdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiogQHNpbmNlIDIuMC4yICoqLwotCi0gICAgcHVibGljIGJvb2xlYW4gaXNNYXJrZWRGb3JEaXNjYXJkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfZGlzY2FyZDsKLSAgICB9Ci0KLSAgICAvKiogQHNpbmNlIDIuMC4yICoqLwotCi0gICAgcHVibGljIHZvaWQgbWFya0ZvckRpc2NhcmQoKQotICAgIHsKLSAgICAgICAgX2Rpc2NhcmQgPSB0cnVlOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldERpcnR5KGJvb2xlYW4gZGlydHkpCi0gICAgewotICAgICAgICBfZGlydHkgPSBkaXJ0eTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBnZXREaXJ0eSgpCi0gICAgewotICAgICAgICByZXR1cm4gX2RpcnR5OwotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9yZWNvcmQvU2Vzc2lvblBhZ2VSZWNvcmRlci5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3JlY29yZC9TZXNzaW9uUGFnZVJlY29yZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzZmM3MDUuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3JlY29yZC9TZXNzaW9uUGFnZVJlY29yZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDggKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkucmVjb3JkOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVxdWVzdEN5Y2xlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuVGFwZXN0cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5yZXF1ZXN0LlJlcXVlc3RDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkudXRpbC5TdHJpbmdTcGxpdHRlcjsKLQotLyoqCi0gKiBTaW1wbGUgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkuZW5naW5lLklQYWdlUmVjb3JkZXJ9dGhhdCBzdG9yZXMgcGFnZQotICogY2hhbmdlcyBhcyB7QGxpbmsgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9ufWF0dHJpYnV0ZXMuCi0gKiAKLSAqIEBhdXRob3IgSG93YXJkIFNoaXAKLSAqIEB2ZXJzaW9uICRJZCQKLSAqLwotCi1wdWJsaWMgY2xhc3MgU2Vzc2lvblBhZ2VSZWNvcmRlciBleHRlbmRzIFBhZ2VSZWNvcmRlcgotewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBMT0cgPSBMb2dGYWN0b3J5LmdldExvZyhTZXNzaW9uUGFnZVJlY29yZGVyLmNsYXNzKTsKLQotICAgIC8qKgotICAgICAqIERpY3Rpb25hcnkgb2YgY2hhbmdlcywga2V5ZWQgb24gYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIENoYW5nZUtleX0od2hpY2ggZW5hcHN1bGF0ZXMgY29tcG9uZW50Ci0gICAgICogcGF0aCBhbmQgcHJvcGVydHkgbmFtZSkuIFRoZSB2YWx1ZSBpcyB0aGUgbmV3IHZhbHVlIGZvciB0aGUgb2JqZWN0LiBUaGUgc2FtZSBpbmZvcm1hdGlvbiBpcwotICAgICAqIHN0b3JlZCBpbnRvIHRoZSB7QGxpbmsgSHR0cFNlc3Npb259LCB3aGljaCBpcyB1c2VkIGFzIGEga2luZCBvZiB3cml0ZS1iZWhpbmQgY2FjaGUuCi0gICAgICovCi0KLSAgICBwcml2YXRlIE1hcCBfY2hhbmdlczsKLQotICAgIC8qKgotICAgICAqIFRoZSBzZXNzaW9uIGludG8gd2hpY2ggY2hhbmdlcyBhcmUgcmVjb3JkZWQuCi0gICAgICogCi0gICAgICogQHNpbmNlIDMuMAotICAgICAqLwotCi0gICAgcHJpdmF0ZSBIdHRwU2Vzc2lvbiBfc2Vzc2lvbjsKLQotICAgIC8qKgotICAgICAqIFRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgcGFnZSBiZWluZyByZWNvcmRlZC4KLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMy4wCi0gICAgICovCi0KLSAgICBwcml2YXRlIFN0cmluZyBfcGFnZU5hbWU7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgcHJlZml4IChmb3Ige0BsaW5rIEh0dHBTZXNzaW9ufWF0dHJpYnV0ZXMpIHVzZWQgYnkgdGhpcyBwYWdlIHJlY29yZGVyLgotICAgICAqLwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgX2F0dHJpYnV0ZVByZWZpeDsKLQotICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoU3RyaW5nIHBhZ2VOYW1lLCBJUmVxdWVzdEN5Y2xlIGN5Y2xlKQotICAgIHsKLSAgICAgICAgaWYgKExPRy5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICAgICAgTE9HLmRlYnVnKCJJbml0aWFsaXppbmcgZm9yICIgKyBwYWdlTmFtZSk7Ci0KLSAgICAgICAgUmVxdWVzdENvbnRleHQgY29udGV4dCA9IGN5Y2xlLmdldFJlcXVlc3RDb250ZXh0KCk7Ci0KLSAgICAgICAgX3BhZ2VOYW1lID0gcGFnZU5hbWU7Ci0gICAgICAgIF9zZXNzaW9uID0gY29udGV4dC5nZXRTZXNzaW9uKCk7Ci0KLSAgICAgICAgX2F0dHJpYnV0ZVByZWZpeCA9IGNvbnRleHQuZ2V0U2VydmxldCgpLmdldFNlcnZsZXROYW1lKCkgKyAiLyIgKyBfcGFnZU5hbWUgKyAiLyI7Ci0KLSAgICAgICAgcmVzdG9yZVBhZ2VDaGFuZ2VzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGlzY2FyZCgpCi0gICAgewotICAgICAgICBpZiAoVGFwZXN0cnkuaXNFbXB0eShfY2hhbmdlcykpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgSXRlcmF0b3IgaSA9IF9jaGFuZ2VzLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0KLSAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBDaGFuZ2VLZXkga2V5ID0gKENoYW5nZUtleSkgaS5uZXh0KCk7Ci0KLSAgICAgICAgICAgIFN0cmluZyBhdHRyaWJ1dGVLZXkgPSBjb25zdHJ1Y3RBdHRyaWJ1dGVLZXkoa2V5LmdldENvbXBvbmVudFBhdGgoKSwga2V5Ci0gICAgICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0KLSAgICAgICAgICAgIGlmIChMT0cuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICBMT0cuZGVidWcoIlJlbW92aW5nIHNlc3Npb24gYXR0cmlidXRlICIgKyBhdHRyaWJ1dGVLZXkpOwotCi0gICAgICAgICAgICBfc2Vzc2lvbi5yZW1vdmVBdHRyaWJ1dGUoYXR0cmlidXRlS2V5KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNpbXBseSBjbGVhcnMgdGhlIGRpcnR5IGZsYWcsIGJlY2F1c2UgdGhlcmUgaXMgbm8gZXh0ZXJuYWwgcGxhY2UgdG8gc3RvcmUgY2hhbmdlZCBwYWdlCi0gICAgICogcHJvcGVydGllcy4gU2V0cyB0aGUgbG9ja2VkIGZsYWcgdG8gcHJldmVudCBzdWJzZXF1ZW50IGNoYW5nZXMgZnJvbSBvY2N1cmluZyBub3cuCi0gICAgICovCi0KLSAgICBwdWJsaWMgdm9pZCBjb21taXQoKQotICAgIHsKLSAgICAgICAgc2V0RGlydHkoZmFsc2UpOwotICAgICAgICBzZXRMb2NrZWQodHJ1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSByZWNvcmRlciBoYXMgYW55IGNoYW5nZXMgcmVjb3JkZWQuCi0gICAgICovCi0KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRIYXNDaGFuZ2VzKCkKLSAgICB7Ci0gICAgICAgIGlmIChfY2hhbmdlcyA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIHJldHVybiAoX2NoYW5nZXMuc2l6ZSgpID4gMCk7Ci0gICAgfQotCi0gICAgcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hhbmdlcygpCi0gICAgewotICAgICAgICBpZiAoX2NoYW5nZXMgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCi0gICAgICAgIGludCBjb3VudCA9IF9jaGFuZ2VzLnNpemUoKTsKLSAgICAgICAgQ29sbGVjdGlvbiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KGNvdW50KTsKLQotICAgICAgICBJdGVyYXRvciBpID0gX2NoYW5nZXMuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaS5oYXNOZXh0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGkubmV4dCgpOwotCi0gICAgICAgICAgICBDaGFuZ2VLZXkga2V5ID0gKENoYW5nZUtleSkgZW50cnkuZ2V0S2V5KCk7Ci0KLSAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IGVudHJ5LmdldFZhbHVlKCk7Ci0KLSAgICAgICAgICAgIFBhZ2VDaGFuZ2UgY2hhbmdlID0gbmV3IFBhZ2VDaGFuZ2Uoa2V5LmdldENvbXBvbmVudFBhdGgoKSwga2V5LmdldFByb3BlcnR5TmFtZSgpLCB2YWx1ZSk7Ci0KLSAgICAgICAgICAgIHJlc3VsdC5hZGQoY2hhbmdlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVjb3JkQ2hhbmdlKFN0cmluZyBjb21wb25lbnRQYXRoLCBTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgbmV3VmFsdWUpCi0gICAgewotICAgICAgICBDaGFuZ2VLZXkga2V5ID0gbmV3IENoYW5nZUtleShjb21wb25lbnRQYXRoLCBwcm9wZXJ0eU5hbWUpOwotCi0gICAgICAgIGlmIChfY2hhbmdlcyA9PSBudWxsKQotICAgICAgICAgICAgX2NoYW5nZXMgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgICAgIHNldERpcnR5KHRydWUpOwotCi0gICAgICAgIF9jaGFuZ2VzLnB1dChrZXksIG5ld1ZhbHVlKTsKLQotICAgICAgICAvLyBOb3csIGJ1aWxkIGEga2V5IHVzZWQgdG8gc3RvcmUgdGhlIG5ldyB2YWx1ZQotICAgICAgICAvLyBpbiB0aGUgSHR0cFNlc3Npb24KLQotICAgICAgICBTdHJpbmcgYXR0cmlidXRlS2V5ID0gY29uc3RydWN0QXR0cmlidXRlS2V5KGNvbXBvbmVudFBhdGgsIHByb3BlcnR5TmFtZSk7Ci0KLSAgICAgICAgaWYgKG5ld1ZhbHVlID09IG51bGwpCi0gICAgICAgICAgICBfc2Vzc2lvbi5yZW1vdmVBdHRyaWJ1dGUoYXR0cmlidXRlS2V5KTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgX3Nlc3Npb24uc2V0QXR0cmlidXRlKGF0dHJpYnV0ZUtleSwgbmV3VmFsdWUpOwotCi0gICAgICAgIGlmIChMT0cuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgICAgIExPRy5kZWJ1ZygiU3RvcmVkIHNlc3Npb24gYXR0cmlidXRlICIgKyBhdHRyaWJ1dGVLZXkgKyAiID0gIiArIG5ld1ZhbHVlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBjb25zdHJ1Y3RBdHRyaWJ1dGVLZXkoU3RyaW5nIGNvbXBvbmVudFBhdGgsIFN0cmluZyBwcm9wZXJ0eU5hbWUpCi0gICAgewotICAgICAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihfYXR0cmlidXRlUHJlZml4KTsKLQotICAgICAgICBpZiAoY29tcG9uZW50UGF0aCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBidWZmZXIuYXBwZW5kKGNvbXBvbmVudFBhdGgpOwotICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgnLycpOwotICAgICAgICB9Ci0KLSAgICAgICAgYnVmZmVyLmFwcGVuZChwcm9wZXJ0eU5hbWUpOwotCi0gICAgICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcmVzdG9yZVBhZ2VDaGFuZ2VzKCkKLSAgICB7Ci0gICAgICAgIGludCBjb3VudCA9IDA7Ci0gICAgICAgIEVudW1lcmF0aW9uIGUgPSBfc2Vzc2lvbi5nZXRBdHRyaWJ1dGVOYW1lcygpOwotICAgICAgICBTdHJpbmdTcGxpdHRlciBzcGxpdHRlciA9IG51bGw7Ci0KLSAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBrZXkgPSAoU3RyaW5nKSBlLm5leHRFbGVtZW50KCk7Ci0KLSAgICAgICAgICAgIGlmICgha2V5LnN0YXJ0c1dpdGgoX2F0dHJpYnV0ZVByZWZpeCkpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICAgIGlmIChMT0cuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICBMT0cuZGVidWcoIlJlc3RvcmluZyBwYWdlIGNoYW5nZSBmcm9tIHNlc3Npb24gYXR0cmlidXRlICIgKyBrZXkpOwotCi0gICAgICAgICAgICBpZiAoX2NoYW5nZXMgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfY2hhbmdlcyA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICAgICAgICAgICAgICBzcGxpdHRlciA9IG5ldyBTdHJpbmdTcGxpdHRlcignLycpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdHJpbmdbXSBuYW1lcyA9IHNwbGl0dGVyLnNwbGl0VG9BcnJheShrZXkpOwotCi0gICAgICAgICAgICAvLyBUaGUgZmlyc3QgbmFtZSBpcyB0aGUgc2VydmxldCBuYW1lLCB3aGljaCBhbGxvd3MKLSAgICAgICAgICAgIC8vIG11bHRpcGxlIFRhcGVzdHJ5IGFwcHMgdG8gc2hhcmUgYSBIdHRwU2Vzc2lvbiwgZXZlbgotICAgICAgICAgICAgLy8gd2hlbiB0aGV5IHVzZSB0aGUgc2FtZSBwYWdlIG5hbWVzLiBUaGUgc2Vjb25kIG5hbWUKLSAgICAgICAgICAgIC8vIGlzIHRoZSBwYWdlIG5hbWUsIHdoaWNoIHdlIGFscmVhZHkga25vdy4KLQotICAgICAgICAgICAgaW50IGkgPSAyOwotCi0gICAgICAgICAgICBTdHJpbmcgY29tcG9uZW50UGF0aCA9IChuYW1lcy5sZW5ndGggPT0gNCkgPyBuYW1lc1tpKytdIDogbnVsbDsKLSAgICAgICAgICAgIFN0cmluZyBwcm9wZXJ0eU5hbWUgPSBuYW1lc1tpKytdOwotICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gX3Nlc3Npb24uZ2V0QXR0cmlidXRlKGtleSk7Ci0KLSAgICAgICAgICAgIENoYW5nZUtleSBjaGFuZ2VLZXkgPSBuZXcgQ2hhbmdlS2V5KGNvbXBvbmVudFBhdGgsIHByb3BlcnR5TmFtZSk7Ci0KLSAgICAgICAgICAgIF9jaGFuZ2VzLnB1dChjaGFuZ2VLZXksIHZhbHVlKTsKLQotICAgICAgICAgICAgY291bnQrKzsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChMT0cuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgICAgIExPRy5kZWJ1Zyhjb3VudCA9PSAwID8gIk5vIHJlY29yZGVkIGNoYW5nZXMuIiA6ICJSZXN0b3JlZCAiICsgY291bnQKLSAgICAgICAgICAgICAgICAgICAgKyAiIHJlY29yZGVkIGNoYW5nZXMuIik7Ci0gICAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3JlY29yZC9wYWNrYWdlLmh0bWwgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvcmVjb3JkL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRhMGE5NS4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvcmVjb3JkL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLTwhZG9jdHlwZSBodG1sIHB1YmxpYyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci08IS0tICRJZCQgLS0+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlRhcGVzdHJ5OiBXZWIgQXBwbGljYXRpb24gRnJhbWV3b3JrPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotCi08cD5BYnN0cmFjdCBhbmQgc2ltcGxlIChtZW1vcnktYmFzZWQpIGltcGxlbWVudGF0aW9ucyBvZgote0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkuZW5naW5lLklQYWdlUmVjb3JkZXJ9LgotCi1AYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwIDxhIGhyZWY9Im1haWx0bzpobHNoaXBAYXBhY2hlLm9yZyI+aGxzaGlwQGFwYWNoZS5vcmc8L2E+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9yZXF1ZXN0L0RlY29kZWRSZXF1ZXN0LmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvcmVxdWVzdC9EZWNvZGVkUmVxdWVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzIxMDFiLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9yZXF1ZXN0L0RlY29kZWRSZXF1ZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5yZXF1ZXN0OwotCi0vKioKLSAqICBDb250YWlucyBwcm9wZXJ0aWVzIG9mIGFuIHtAbGluayBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0fQotICogIHRoYXQgaGF2ZSBiZWVuIGV4dHJhY3RlZCBmcm9tIHRoZSByZXF1ZXN0IChvciBvdGhlcndpc2UgZGV0ZXJtaW5lZCkuCi0gKiAKLSAqICA8cD5BbiBhbHRlcm5hdGl2ZSBpZGVhIHdvdWxkIGhhdmUgYmVlbiB0byBjcmVhdGUgYSBuZXcgCi0gKiAge0BsaW5rIGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3R9Ci0gKiAgd3JhcHBlciB0aGF0IG92ZXJvZGUgdGhlIHZhcmlvdXMgbWV0aG9kcy4gIFRoYXQgc3RydWNrIG1lIGFzIGNhdXNpbmcKLSAqICBtb3JlIGNvbmZ1c2lvbjsgaW5zdGVhZCAoaW4gdGhlIGZldyBwbGFjZXMgaXQgY291bnRzKSwgY2xhc3NlcyB3aWxsCi0gKiAgZ2V0IHRoZSBkZWNvZGVkIHByb3BlcnRpZXMgZnJvbSB0aGUge0BsaW5rIFJlcXVlc3RDb250ZXh0fS4KLSAqCi0gKiAgQHNlZSBJUmVxdWVzdERlY29kZXIKLSAqICBAc2VlIFJlcXVlc3RDb250ZXh0I2dldFNjaGVtZSgpCi0gKiAgQHNlZSBSZXF1ZXN0Q29udGV4dCNnZXRTZXJ2ZXJOYW1lKCkKLSAqICBAc2VlIFJlcXVlc3RDb250ZXh0I2dldFNlcnZlclBvcnQoKQotICogIEBzZWUgUmVxdWVzdENvbnRleHQjZ2V0UmVxdWVzdFVSSSgpCi0gKiAKLSAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiAgQHZlcnNpb24gRGVjb2RlZFJlcXVlc3QuamF2YSx2IDEuMSAyMDAyLzA4LzIwIDIxOjQ5OjU4IGhzaGlwIEV4cAotICogIEBzaW5jZSAyLjIKLSAqIAotICoqLwotCi1wdWJsaWMgY2xhc3MgRGVjb2RlZFJlcXVlc3QKLXsKLSAgICBwcml2YXRlIFN0cmluZyBfc2NoZW1lOwotICAgIHByaXZhdGUgU3RyaW5nIF9zZXJ2ZXJOYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIF9yZXF1ZXN0VVJJOwotICAgIHByaXZhdGUgaW50IF9zZXJ2ZXJQb3J0OwotCi0gICAgcHVibGljIGludCBnZXRTZXJ2ZXJQb3J0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfc2VydmVyUG9ydDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNjaGVtZSgpCi0gICAgewotICAgICAgICByZXR1cm4gX3NjaGVtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNlcnZlck5hbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9zZXJ2ZXJOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVxdWVzdFVSSSgpCi0gICAgewotICAgICAgICByZXR1cm4gX3JlcXVlc3RVUkk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2VydmVyUG9ydChpbnQgc2VydmVyUG9ydCkKLSAgICB7Ci0gICAgICAgIF9zZXJ2ZXJQb3J0ID0gc2VydmVyUG9ydDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTY2hlbWUoU3RyaW5nIHNjaGVtZSkKLSAgICB7Ci0gICAgICAgIF9zY2hlbWUgPSBzY2hlbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2VydmVyTmFtZShTdHJpbmcgc2VydmVyTmFtZSkKLSAgICB7Ci0gICAgICAgIF9zZXJ2ZXJOYW1lID0gc2VydmVyTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRSZXF1ZXN0VVJJKFN0cmluZyBVUkkpCi0gICAgewotICAgICAgICBfcmVxdWVzdFVSSSA9IFVSSTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3JlcXVlc3QvSVJlcXVlc3REZWNvZGVyLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvcmVxdWVzdC9JUmVxdWVzdERlY29kZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc0MzAxOS4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvcmVxdWVzdC9JUmVxdWVzdERlY29kZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LnJlcXVlc3Q7Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OwotCi0vKioKLSAqICBHaXZlbiBhIHtAbGluayBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0fSwgaWRlbnRpZmllcwotICogIHRoZSBjb3JyZWN0IHJlcXVlc3QgcHJvcGVydGllcyAoc2VydmVyLCBzY2hlbWUsIFVSSSBhbmQgcG9ydCkuCi0gKiAKLSAqICA8cD5BbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGNsYXNzIG1heSBiZSBuZWNlc3Nhcnkgd2hlbiB1c2luZwotICogIFRhcGVzdHJ5IHdpdGggc3BlY2lmaWMgZmlyZXdhbGxzIHdoaWNoIG1heSBvYnNjdXJlCi0gKiAgdGhlIHNjaGVtZSwgc2VydmVyLCBldGMuIHZpc2libGUgdG8gdGhlIGNsaWVudCB3ZWIgYnJvd3NlcgotICogICh0aGUgcmVxdWVzdCBhcHBlYXJzIHRvIGFycml2ZSBmcm9tIHRoZSBmaXJld2FsbCBzZXJ2ZXIsIG5vdCB0aGUKLSAqICBjbGllbnQgd2ViIGJyb3dzZXIpLgotICoKLSAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiAgQHZlcnNpb24gSVJlcXVlc3REZWNvZGVyLmphdmEsdiAxLjEgMjAwMi8wOC8yMCAyMTo0OTo1OCBoc2hpcCBFeHAKLSAqICBAc2luY2UgMi4yCi0gKiAKLSAqKi8KLQotcHVibGljIGludGVyZmFjZSBJUmVxdWVzdERlY29kZXIKLXsKLQotICAgIC8qKgotICAgICAqICBJbnZva2VkIHRvIGlkZW50aWZ5IHRoZSBhY3R1YWwgcHJvcGVydGllcyBmcm9tIHRoZSByZXF1ZXN0LgotICAgICAqIAotICAgICAqKi8KLQotICAgIHB1YmxpYyBEZWNvZGVkUmVxdWVzdCBkZWNvZGVSZXF1ZXN0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KTsKLX0KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9yZXF1ZXN0L0lVcGxvYWRGaWxlLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvcmVxdWVzdC9JVXBsb2FkRmlsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTEyNzFhLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9yZXF1ZXN0L0lVcGxvYWRGaWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5yZXF1ZXN0OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLS8qKgotICogIFJlcHJlc2VudHMgYSBmaWxlIHVwbG9hZGVkIGZyb20gYSBjbGllbnQgc2lkZSBmb3JtLgotICogCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogIEB2ZXJzaW9uICRJZCQKLSAqICBAc2luY2UgMS4wLjgKLSAqCi0gKiovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSVVwbG9hZEZpbGUKLXsKLQkvKioKLQkgKiAgUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgZmlsZSB0aGF0IHdhcyB1cGxvYWRlZC4gIFRoaXMKLQkgKiAgaXMganVzdCB0aGUgZmlsZW5hbWUgcG9ydGlvbiBvZiB0aGUgY29tcGxldGUgcGF0aC4KLQkgKiAKLQkgKiovCi0KLQlwdWJsaWMgU3RyaW5nIGdldEZpbGVOYW1lKCk7Ci0KLQkvKioKLQkgKiAgUmV0dXJucyB0aGUgY29tcGxldGUgcGF0aCwgYXMgcmVwb3J0ZWQgYnkgdGhlIGNsaWVudAotCSAqICBicm93c2VyLiAgRGlmZmVyZW50IGJyb3dzZXJzIHJlcG9ydCBkaWZmZXJlbnQgdGhpbmdzCi0JICogIGhlcmUuCi0JICogCi0JICogCi0JICogIEBzaW5jZSAyLjAuNAotCSAqIAotCSAqKi8KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEZpbGVQYXRoKCk7Ci0KLQkvKioKLQkgKiAgUmV0dXJucyBhbiBpbnB1dCBzdHJlYW0gb2YgdGhlIGNvbnRlbnQgb2YgdGhlIGZpbGUuICBUaGVyZSBpcyBubyBndWFyYW50ZWUKLQkgKiAgdGhhdCB0aGlzIHN0cmVhbSB3aWxsIGJlIHZhbGlkIGFmdGVyIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgcmVxdWVzdCBjeWNsZSwKLQkgKiAgc28gaXQgc2hvdWxkIGJlIHByb2Nlc3NlZCBpbW1lZGlhdGVseS4KLQkgKiAKLQkgKiAgPHA+QXMgb2YgcmVsZWFzZSAxLjAuOCwgdGhpcyB3aWxsIGJlIGEgYSB7QGxpbmsgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbX0sCi0JICogIGJ1dCB0aGF0LCB0b28sIG1heSBjaGFuZ2UgKGEgZnV0dXJlIGltcGxlbWVudGF0aW9uIG1heSB1cGxvYWQgdGhlIHN0cmVhbQotCSAqICB0byBhIHRlbXBvcmFyeSBmaWxlIGFuZCByZXR1cm4gYW4gaW5wdXQgc3RyZWFtIGZyb20gdGhhdCkuCi0JICogCi0JICoqLwotCi0JcHVibGljIElucHV0U3RyZWFtIGdldFN0cmVhbSgpOwotICAgIAotICAgIC8qKgotICAgICAqICBSZXR1cm5zIHRoZSBNSU1FIHR5cGUgc3BlY2lmaWVkIHdoZW4gdGhlIGZpbGUgd2FzIHVwbG9hZGVkLiAgTWF5IHJldHVybiBudWxsCi0gICAgICogIGlmIHRoZSBjb250ZW50IHR5cGUgaXMgbm90IGtub3duLgotICAgICAqIAotICAgICAqICBAc2luY2UgMi4yCi0gICAgICogCi0gICAgICoqLwotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudFR5cGUoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBXcml0ZXMgdGhlIGNvbnRlbnQgb2YgdGhlIGZpbGUgdG8gYSBrbm93biBsb2NhdGlvbi4gIFRoaXMgc2hvdWxkCi0gICAgICogYmUgaW52b2tlZCBhdCBtb3N0IG9uY2UuICBJbiBhIHN0YW5kYXJkCi0gICAgICogaW1wbGVtZW50YXRpb24gYmFzZWQgb24gSmFrYXJ0YSBGaWxlVXBsb2FkLCB0aGlzIHdpbGwgb2Z0ZW4KLSAgICAgKiBiZSBpbXBsZW1lbnRlZCBlZmZpY2llbnRseSBhcyBhIGZpbGUgcmVuYW1lLgotICAgICAqIAotICAgICAqIEBzaW5jZSAzLjAKLSAgICAgKi8KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB3cml0ZShGaWxlIGZpbGUpOwotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdXBsb2FkZWQgY29udGVudCBpcyBpbiBtZW1vcnkuICBGYWxzZSBnZW5lcmFsbHkKLSAgICAgKiBtZWFucyB0aGUgY29udGVudCBpcyBzdG9yZWQgaW4gYSB0ZW1wb3JhcnkgZmlsZS4KLSAgICAgKi8KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0luTWVtb3J5KCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2l6ZSwgaW4gYnl0ZXMsIG9mIHRoZSB1cGxvYWRlZCBjb250ZW50LgotICAgICAqIAotICAgICAqIEBzaW5jZSAzLjAKLSAgICAgKiovCi0gICAgCi0gICAgcHVibGljIGxvbmcgZ2V0U2l6ZSgpOyAKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvcmVxdWVzdC9SZXF1ZXN0Q29udGV4dC5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3JlcXVlc3QvUmVxdWVzdENvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRmZmMwYy4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvcmVxdWVzdC9SZXF1ZXN0Q29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5NiArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5yZXF1ZXN0OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29uZmlnOwotaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQ7Ci1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkNvb2tpZTsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OwotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOwotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuQXBwbGljYXRpb25TZXJ2bGV0OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSU1hcmt1cFdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZW5kZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVxdWVzdEN5Y2xlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuVGFwZXN0cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5tdWx0aXBhcnQuRGVmYXVsdE11bHRpcGFydERlY29kZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5tdWx0aXBhcnQuSU11bHRpcGFydERlY29kZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5zcGVjLklBcHBsaWNhdGlvblNwZWNpZmljYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS51dGlsLklSZW5kZXJEZXNjcmlwdGlvbjsKLQotLyoqCi0gKiAgVGhpcyBjbGFzcyBlbmNhcHN1bGF0ZXMgYWxsIHRoZSByZWxldmFudCBkYXRhIGZvciBvbmUgcmVxdWVzdCBjeWNsZSBvZiBhbgotICogIHtAbGluayBBcHBsaWNhdGlvblNlcnZsZXR9LiAgVGhpcyBpbmNsdWRlczoKLSAqICA8dWw+Ci0gKiAgCTxsaT57QGxpbmsgSHR0cFNlcnZsZXRSZXF1ZXN0fQotICoJCTxsaT57QGxpbmsgSHR0cFNlcnZsZXRSZXNwb25zZX0KLSAqCQk8bGk+e0BsaW5rIEh0dHBTZXNzaW9ufQotICogCQk8bGk+e0BsaW5rIGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldH0KLSAqICA8L3VsPgotICogIDxwPkl0IGFsc28gcHJvdmlkZXMgbWV0aG9kcyBmb3I6Ci0gKiAgPHVsPgotICogIDxsaT5SZXRyaWV2aW5nIHRoZSByZXF1ZXN0IHBhcmFtZXRlcnMgKGV2ZW4gaWYgYSBmaWxlIHVwbG9hZCBpcyBpbnZvbHZlZCkKLSAqICA8bGk+R2V0dGluZywgc2V0dGluZyBhbmQgcmVtb3ZpbmcgcmVxdWVzdCBhdHRyaWJ1dGVzCi0gKiAgPGxpPkZvcndhcmRpbmcgcmVxdWVzdHMKLSAqICA8bGk+UmVkaXJlY3RpbmcgcmVxdWVzdHMKLSAqICA8bGk+R2V0dGluZyBhbmQgc2V0dGluZyBDb29raWVzCi0gKiAgPGxpPkludGVwcmV0aW5nIHRoZSByZXF1ZXN0IHBhdGggaW5mbwotICogIDxsaT5Xcml0aW5nIGFuIEhUTUwgZGVzY3JpcHRpb24gb2YgdGhlIDxjb2RlPlJlcXVlc3RDb250ZXh0PC9jb2RlPiAoZm9yIGRlYnVnZ2luZykuCi0gKiAgPC91bD4KLSAqCi0gKiAKLSAqICA8cD4KLSAqICBJZiBzb21lIGNhc2VzLCBpdCBpcyBuZWNlc2FyeSB0byBwcm92aWRlIGFuIGltcGxlbWVudGF0aW9uIG9mCi0gKiAge0BsaW5rIElSZXF1ZXN0RGVjb2Rlcn0gKG9mdGVuLCBkdWUgdG8gYSBmaXJld2FsbCkuCi0gKiAgSWYgdGhlIGFwcGxpY2F0aW9uIHNwZWNpZmlmaWNhdGlvbgotICogIHByb3ZpZGVzIGFuIGV4dGVuc2lvbiBuYW1lZAotICogIDxjb2RlPm9yZy5hcGFjaGUudGFwZXN0cnkucmVxdWVzdC1kZWNvZGVyPC9jb2RlPgotICogIHRoZW4gaXQgd2lsbCBiZSB1c2VkLCBpbnN0ZWFkIG9mIGEgZGVmYXVsdCBkZWNvZGVyLgotICogCi0gKiAgPHA+VGhpcyBjbGFzcyBpcyBub3QgYSBjb21wb25lbnQsIGJ1dCBkb2VzIGltcGxlbWVudCB7QGxpbmsgSVJlbmRlcn0uICBXaGVuIGFza2VkIHRvIHJlbmRlcgotICogIChwZXJoYXBzIGFzIHRoZSBkZWxlZ2F0ZSBvZiBhIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LmNvbXBvbmVudHMuRGVsZWdhdG9yfSBjb21wb25lbnR9Ci0gKiAgaXQgc2ltcGx5IGludm9rZXMge0BsaW5rICN3cml0ZShJTWFya3VwV3JpdGVyKX0gdG8gZGlzcGxheSBhbGwgZGVidWdnaW5nIG91dHB1dC4KLSAqCi0gKiAgPHA+VGhpcyBjbGFzcyBpcyBkZXJpdmVkIGZyb20gdGhlIG9yaWdpbmFsIGNsYXNzIAotICogIDxjb2RlPmNvbS5wcmltaXguc2VydmxldC5SZXF1ZXN0Q29udGV4dDwvY29kZT4sCi0gKiAgcGFydCBvZiB0aGUgPGI+U2VydmxldFV0aWxzPC9iPiBmcmFtZXdvcmsgYXZhaWxhYmxlIGZyb20KLSAqICA8YSBocmVmPSJodHRwOi8vd3d3LmdqdC5vcmcvc2VydmxldHMvSkNWU2xldC9saXN0L2dqdC9jb20vcHJpbWl4L3NlcnZsZXQiPlRoZSBHaWFudCAKLSAqICBKYXZhIFRyZWU8L2E+LgotICoKLSAqCi0gKiAgQHZlcnNpb24gJElkJAotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqIAotICoqLwotCi1wdWJsaWMgY2xhc3MgUmVxdWVzdENvbnRleHQgaW1wbGVtZW50cyBJUmVuZGVyCi17Ci0gICAgLyoqIEBzaW5jZSAyLjIgKiovCi0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBEZWZhdWx0UmVxdWVzdERlY29kZXIgaW1wbGVtZW50cyBJUmVxdWVzdERlY29kZXIKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBEZWNvZGVkUmVxdWVzdCBkZWNvZGVSZXF1ZXN0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KQotICAgICAgICB7Ci0gICAgICAgICAgICBEZWNvZGVkUmVxdWVzdCByZXN1bHQgPSBuZXcgRGVjb2RlZFJlcXVlc3QoKTsKLQotICAgICAgICAgICAgcmVzdWx0LnNldFJlcXVlc3RVUkkocmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCkpOwotICAgICAgICAgICAgcmVzdWx0LnNldFNjaGVtZShyZXF1ZXN0LmdldFNjaGVtZSgpKTsKLSAgICAgICAgICAgIHJlc3VsdC5zZXRTZXJ2ZXJOYW1lKHJlcXVlc3QuZ2V0U2VydmVyTmFtZSgpKTsKLSAgICAgICAgICAgIHJlc3VsdC5zZXRTZXJ2ZXJQb3J0KHJlcXVlc3QuZ2V0U2VydmVyUG9ydCgpKTsKLQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBMT0cgPSBMb2dGYWN0b3J5LmdldExvZyhSZXF1ZXN0Q29udGV4dC5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIEh0dHBTZXNzaW9uIF9zZXNzaW9uOwotICAgIHByaXZhdGUgSHR0cFNlcnZsZXRSZXF1ZXN0IF9yZXF1ZXN0OwotICAgIHByaXZhdGUgSHR0cFNlcnZsZXRSZXNwb25zZSBfcmVzcG9uc2U7Ci0gICAgcHJpdmF0ZSBBcHBsaWNhdGlvblNlcnZsZXQgX3NlcnZsZXQ7Ci0gICAgcHJpdmF0ZSBEZWNvZGVkUmVxdWVzdCBfZGVjb2RlZFJlcXVlc3Q7Ci0gICAgcHJpdmF0ZSBJTXVsdGlwYXJ0RGVjb2RlciBfZGVjb2RlcjsKLSAgICBwcml2YXRlIGJvb2xlYW4gX2RlY29kZWQ7Ci0KLSAgICAvKioKLSAgICAgKiBBIG1hcHBpbmcgb2YgdGhlIGNvb2tpZXMgYXZhaWxhYmxlIGluIHRoZSByZXF1ZXN0LgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHJpdmF0ZSBNYXAgX2Nvb2tpZU1hcDsKLQotICAgIC8qKgotICAgICAqICBVc2VkIGR1cmluZyB7QGxpbmsgI3dyaXRlKElNYXJrdXBXcml0ZXIpfS4KLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwcml2YXRlIGJvb2xlYW4gX2V2ZW5Sb3c7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgPGNvZGU+UmVxdWVzdENvbnRleHQ8L2NvZGU+IGZyb20gaXRzIGNvbXBvbmVudHMuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgUmVxdWVzdENvbnRleHQoCi0gICAgICAgIEFwcGxpY2F0aW9uU2VydmxldCBzZXJ2bGV0LAotICAgICAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKLSAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBfc2VydmxldCA9IHNlcnZsZXQ7Ci0gICAgICAgIF9yZXF1ZXN0ID0gcmVxdWVzdDsKLSAgICAgICAgX3Jlc3BvbnNlID0gcmVzcG9uc2U7Ci0KLSAgICAgICAgLy8gQWxsIHRocmVlIHBhcmFtZXRlcnMgbWF5IGJlIG51bGwgaWYgY3JlYXRlZCBmcm9tCi0gICAgICAgIC8vIEFic3RyYWN0RW5naW5lLmNsZWFudXBFbmdpbmUoKS4KLQotICAgICAgICBpZiAoX3JlcXVlc3QgIT0gbnVsbCAmJiBEZWZhdWx0TXVsdGlwYXJ0RGVjb2Rlci5pc011bHRpcGFydFJlcXVlc3QocmVxdWVzdCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIElNdWx0aXBhcnREZWNvZGVyIGRlY29kZXIgPSBvYnRhaW5NdWx0aXBhcnREZWNvZGVyKHNlcnZsZXQsIHJlcXVlc3QpOwotICAgICAgICAgICAgc2V0RGVjb2RlcihkZWNvZGVyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqICBJbnZva2VkIGZyb20gdGhlIGNvbnN0cnVjdG9yIHRvIGNyZWF0ZSBhIHtAbGluayBEZWZhdWx0TXVsdGlwYXJ0RGVjb2Rlcn0gaW5zdGFuY2UuCi0gICAgICogIEFwcGxpY2F0aW9ucyB3aXRoIHNwZWNpZmljIHVwbG9hZCBuZWVkcyBtYXkgbmVlZCB0byBvdmVycmlkZSB0aGlzIHRvCi0gICAgICogIHByb3ZpZGUgYSBzdWJjbGFzcyBpbnN0YW5jZSBpbnN0ZWFkLiAgVGhlIGNhbGxlciB3aWxsIGludm9rZQotICAgICAqICB7QGxpbmsgSU11bHRpcGFydERlY29kZXIjZGVjb2RlKEh0dHBTZXJ2bGV0UmVxdWVzdCl9IG9uIHRoZQotICAgICAqICByZXR1cm5lZCBvYmplY3QuCi0gICAgICogCi0gICAgICogIDxwPgotICAgICAqICBUaGlzIGltcGxlbWVudGF0aW9uIGNoZWNrcyBmb3IgYXBwbGljYXRpb24gZXh0ZW5zaW9uCi0gICAgICogIHtAbGluayBUYXBlc3RyeSNNVUxUSVBBUlRfREVDT0RFUl9FWFRFTlNJT05fTkFNRX0uICBJZiB0aGF0IGlzIG5vdAotICAgICAqICBkZWZpbmVkLCBhIHNoYXJlZCBpbnN0YW5jZSBvZiB7QGxpbmsgRGVmYXVsdE11bHRpcGFydERlY29kZXJ9Ci0gICAgICogIGlzIHJldHVybmVkLiAgCi0gICAgICoKLSAgICAgKiAKLSAgICAgKiAgQHNlZSBBcHBsaWNhdGlvblNlcnZsZXQjY3JlYXRlUmVxdWVzdENvbnRleHQoSHR0cFNlcnZsZXRSZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlKQotICAgICAqICBAc2luY2UgMy4wCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHJvdGVjdGVkIElNdWx0aXBhcnREZWNvZGVyIG9idGFpbk11bHRpcGFydERlY29kZXIoCi0gICAgICAgIEFwcGxpY2F0aW9uU2VydmxldCBzZXJ2bGV0LAotICAgICAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBJQXBwbGljYXRpb25TcGVjaWZpY2F0aW9uIHNwZWMgPSBzZXJ2bGV0LmdldEFwcGxpY2F0aW9uU3BlY2lmaWNhdGlvbigpOwotCi0gICAgICAgIGlmIChzcGVjLmNoZWNrRXh0ZW5zaW9uKFRhcGVzdHJ5Lk1VTFRJUEFSVF9ERUNPREVSX0VYVEVOU0lPTl9OQU1FKSkKLSAgICAgICAgICAgIHJldHVybiAoSU11bHRpcGFydERlY29kZXIpIHNwZWMuZ2V0RXh0ZW5zaW9uKAotICAgICAgICAgICAgICAgIFRhcGVzdHJ5Lk1VTFRJUEFSVF9ERUNPREVSX0VYVEVOU0lPTl9OQU1FLAotICAgICAgICAgICAgICAgIElNdWx0aXBhcnREZWNvZGVyLmNsYXNzKTsKLQotICAgICAgICByZXR1cm4gRGVmYXVsdE11bHRpcGFydERlY29kZXIuZ2V0U2hhcmVkSW5zdGFuY2UoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgc2ltcGxlIHtAbGluayBDb29raWV9LiBUbyBzZXQgYSBDb29raWUgd2l0aCBhdHRyaWJ1dGVzLAotICAgICAqIHVzZSB7QGxpbmsgI2FkZENvb2tpZShDb29raWUpfS4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIGFkZENvb2tpZShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKQotICAgIHsKLSAgICAgICAgYWRkQ29va2llKG5ldyBDb29raWUobmFtZSwgdmFsdWUpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEge0BsaW5rIENvb2tpZX0gdG8gdGhlIHJlc3BvbnNlLiBPbmNlIGFkZGVkLCB0aGUKLSAgICAgKiBDb29raWUgd2lsbCBhbHNvIGJlIGF2YWlsYWJsZSB0byB7QGxpbmsgI2dldENvb2tpZShTdHJpbmcpfSBtZXRob2QuCi0gICAgICoKLSAgICAgKiA8cD5Db29raWVzIHNob3VsZCBvbmx5IGJlIGFkZGVkIDxlbT5iZWZvcmU8L2VtPiBpbnZva2luZwotICAgICAqIHtAbGluayBIdHRwU2VydmxldFJlc3BvbnNlI2dldFdyaXRlcigpfS4uCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCBhZGRDb29raWUoQ29va2llIGNvb2tpZSkKLSAgICB7Ci0gICAgICAgIGlmIChMT0cuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgICAgIExPRy5kZWJ1ZygiQWRkaW5nIGNvb2tpZSAiICsgY29va2llKTsKLQotICAgICAgICBfcmVzcG9uc2UuYWRkQ29va2llKGNvb2tpZSk7Ci0KLSAgICAgICAgaWYgKF9jb29raWVNYXAgPT0gbnVsbCkKLSAgICAgICAgICAgIHJlYWRDb29raWVNYXAoKTsKLQotICAgICAgICBfY29va2llTWFwLnB1dChjb29raWUuZ2V0TmFtZSgpLCBjb29raWUpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkYXRlUGFpcihJTWFya3VwV3JpdGVyIHdyaXRlciwgU3RyaW5nIG5hbWUsIGxvbmcgdmFsdWUpCi0gICAgewotICAgICAgICBwYWlyKHdyaXRlciwgbmFtZSwgbmV3IERhdGUodmFsdWUpKTsKLSAgICB9Ci0KLSAgICAvKiogQHNpbmNlIDIuMiAqKi8KLQotICAgIHByaXZhdGUgRGVjb2RlZFJlcXVlc3QgZ2V0RGVjb2RlZFJlcXVlc3QoKQotICAgIHsKLSAgICAgICAgaWYgKF9kZWNvZGVkUmVxdWVzdCAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIF9kZWNvZGVkUmVxdWVzdDsKLQotICAgICAgICBJQXBwbGljYXRpb25TcGVjaWZpY2F0aW9uIHNwZWMgPSBfc2VydmxldC5nZXRBcHBsaWNhdGlvblNwZWNpZmljYXRpb24oKTsKLSAgICAgICAgSVJlcXVlc3REZWNvZGVyIGRlY29kZXIgPSBudWxsOwotCi0gICAgICAgIGlmICghc3BlYy5jaGVja0V4dGVuc2lvbihUYXBlc3RyeS5SRVFVRVNUX0RFQ09ERVJfRVhURU5TSU9OX05BTUUpKQotICAgICAgICAgICAgZGVjb2RlciA9IG5ldyBEZWZhdWx0UmVxdWVzdERlY29kZXIoKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZGVjb2RlciA9Ci0gICAgICAgICAgICAgICAgKElSZXF1ZXN0RGVjb2Rlcikgc3BlYy5nZXRFeHRlbnNpb24oCi0gICAgICAgICAgICAgICAgICAgIFRhcGVzdHJ5LlJFUVVFU1RfREVDT0RFUl9FWFRFTlNJT05fTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgSVJlcXVlc3REZWNvZGVyLmNsYXNzKTsKLQotICAgICAgICBfZGVjb2RlZFJlcXVlc3QgPSBkZWNvZGVyLmRlY29kZVJlcXVlc3QoX3JlcXVlc3QpOwotCi0gICAgICAgIHJldHVybiBfZGVjb2RlZFJlcXVlc3Q7Ci0gICAgfQotCi0gICAgLyoqIAotICAgICAqIAotICAgICAqICBSZXR1cm5zIHRoZSBhY3R1YWwgc2NoZW1lLCBwb3NzaWJseSBkZWNvZGVkIGZyb20gdGhlIHJlcXVlc3QuCi0gICAgICogCi0gICAgICogIEBzZWUgSVJlcXVlc3REZWNvZGVyCi0gICAgICogIEBzZWUgamF2YXguc2VydmxldC5TZXJ2bGV0UmVxdWVzdCNnZXRTY2hlbWUoKQotICAgICAqICBAc2luY2UgMi4yICAKLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNjaGVtZSgpCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0RGVjb2RlZFJlcXVlc3QoKS5nZXRTY2hlbWUoKTsKLSAgICB9Ci0KLSAgICAvKiogCi0gICAgICogCi0gICAgICogIFJldHVybnMgdGhlIGFjdHVhbCBzZXJ2ZXIgbmFtZSwgcG9zc2libHkgZGVjb2RlZCBmcm9tIHRoZSByZXF1ZXN0LgotICAgICAqIAotICAgICAqICBAc2VlIElSZXF1ZXN0RGVjb2RlcgotICAgICAqICBAc2VlIGphdmF4LnNlcnZsZXQuU2VydmxldFJlcXVlc3QjZ2V0U2VydmVyTmFtZSgpCi0gICAgICogIEBzaW5jZSAyLjIgIAotICAgICAqIAotICAgICAqKi8KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmVyTmFtZSgpCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0RGVjb2RlZFJlcXVlc3QoKS5nZXRTZXJ2ZXJOYW1lKCk7Ci0gICAgfQotCi0gICAgLyoqIAotICAgICAqIAotICAgICAqICBSZXR1cm5zIHRoZSBhY3R1YWwgc2VydmVyIHBvcnQsIHBvc3NpYmx5IGRlY29kZWQgZnJvbSB0aGUgcmVxdWVzdC4KLSAgICAgKiAKLSAgICAgKiAgQHNlZSBJUmVxdWVzdERlY29kZXIKLSAgICAgKiAgQHNlZSBqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXF1ZXN0I2dldFNlcnZlclBvcnQoKQotICAgICAqICBAc2luY2UgMi4yICAKLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgaW50IGdldFNlcnZlclBvcnQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldERlY29kZWRSZXF1ZXN0KCkuZ2V0U2VydmVyUG9ydCgpOwotICAgIH0KLQotICAgIC8qKiAKLSAgICAgKiAKLSAgICAgKiAgUmV0dXJucyB0aGUgYWN0dWFsIHJlcXVlc3QgVVJJLCBwb3NzaWJseSBkZWNvZGVkIGZyb20gdGhlIHJlcXVlc3QuCi0gICAgICogCi0gICAgICogIEBzZWUgSVJlcXVlc3REZWNvZGVyCi0gICAgICogIEBzZWUgSHR0cFNlcnZsZXRSZXF1ZXN0I2dldFJlcXVlc3RVUkkoKQotICAgICAqICBAc2luY2UgMi4yICAKLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFJlcXVlc3RVUkkoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldERlY29kZWRSZXF1ZXN0KCkuZ2V0UmVxdWVzdFVSSSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEJ1aWxkcyBhbiBhYnNvbHV0ZSBVUkwgZnJvbSB0aGUgZ2l2ZW4gVVJJLCB1c2luZyB0aGUge0BsaW5rIEh0dHBTZXJ2bGV0UmVxdWVzdH0KLSAgICAgKiBhcyB0aGUgc291cmNlIGZvciBzY2hlbWUsIHNlcnZlciBuYW1lIGFuZCBwb3J0LgotICAgICAqCi0gICAgICogQHNlZSAjZ2V0QWJzb2x1dGVVUkwoU3RyaW5nLCBTdHJpbmcsIFN0cmluZywgaW50KQotICAgICAqIAotICAgICAqKi8KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWJzb2x1dGVVUkwoU3RyaW5nIFVSSSkKLSAgICB7Ci0gICAgICAgIFN0cmluZyBzY2hlbWUgPSBnZXRTY2hlbWUoKTsKLSAgICAgICAgU3RyaW5nIHNlcnZlciA9IGdldFNlcnZlck5hbWUoKTsKLSAgICAgICAgaW50IHBvcnQgPSBnZXRTZXJ2ZXJQb3J0KCk7Ci0KLSAgICAgICAgLy8gS2VlcCB0aGluZ3Mgc2ltcGxlIC4uLiBwb3J0IDgwIGlzIGFjY2VwdGVkIGFzIHRoZQotICAgICAgICAvLyBzdGFuZGFyZCBwb3J0IGZvciBodHRwIHNvIGl0IGNhbiBiZSBvbW1pdHRlZC4KLSAgICAgICAgLy8gU29tZSBvZiB0aGUgVG9tY2F0IGNvZGUgaW5kaWNhdGVzIHRoYXQgcG9ydCA0NDMgaXMgdGhlIGRlZmF1bHQKLSAgICAgICAgLy8gZm9yIGh0dHBzLCBhbmQgdGhhdCBuZWVkcyB0byBiZSByZXNlYXJjaGVkLgotCi0gICAgICAgIGlmIChzY2hlbWUuZXF1YWxzKCJodHRwIikgJiYgcG9ydCA9PSA4MCkKLSAgICAgICAgICAgIHBvcnQgPSAwOwotCi0gICAgICAgIHJldHVybiBnZXRBYnNvbHV0ZVVSTChVUkksIHNjaGVtZSwgc2VydmVyLCBwb3J0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEb2VzIHNvbWUgZWFzeSBjaGVja3MgdG8gdHVybiBhIHBhdGggKG9yIFVSSSkgaW50byBhbiBhYnNvbHV0ZSBVUkwuIFdlIGFzc3VtZQotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+VGhlIHByZXNlbnNlIG9mIGEgY29sb24gbWVhbnMgdGhlIHBhdGggaXMgY29tcGxldGUgYWxyZWFkeSAoYW55IG90aGVyIGNvbG9ucwotICAgICAqIGluIHRoZSBVUkkgcG9ydGlvbiBzaG91bGQgaGF2ZSBiZWVuIGNvbnZlcnRlZCB0byAlM0EpLgotICAgICAqCi0gICAgICogPGxpPkEgbGVhZGluZyBwYWlyIG9mIGZvcndhcmQgc2xhc2hlcyBtZWFucyB0aGUgcGF0aCBpcyBzaW1wbHkgbWlzc2luZwotICAgICAqIHRoZSBzY2hlbWUuCi0gICAgICogPGxpPk90aGVyd2lzZSwgd2UgYXNzZW1ibGUgdGhlIHNjaGVtZSwgc2VydmVyLCBwb3J0IChpZiBub24temVybykgYW5kIHRoZSBVUkkKLSAgICAgKiBhcyBnaXZlbi4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIFN0cmluZyBnZXRBYnNvbHV0ZVVSTChTdHJpbmcgVVJJLCBTdHJpbmcgc2NoZW1lLCBTdHJpbmcgc2VydmVyLCBpbnQgcG9ydCkKLSAgICB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLSAgICAgICAgLy8gVGhvdWdoLCByZWFsbHksIHdoYXQgZG9lcyBhIGxlYWRpbmcgY29sb24gd2l0aCBubyBzY2hlbWUgYmVmb3JlIGl0Ci0gICAgICAgIC8vIG1lYW4/Ci0KLSAgICAgICAgaWYgKFVSSS5pbmRleE9mKCc6JykgPj0gMCkKLSAgICAgICAgICAgIHJldHVybiBVUkk7Ci0KLSAgICAgICAgLy8gU2hvdWxkIGNoZWNrIHRoZSBsZW5ndGggaGVyZSwgZmlyc3QuCi0KLSAgICAgICAgaWYgKFVSSS5zdWJzdHJpbmcoMCwgMSkuZXF1YWxzKCIvLyIpKQotICAgICAgICB7Ci0gICAgICAgICAgICBidWZmZXIuYXBwZW5kKHNjaGVtZSk7Ci0gICAgICAgICAgICBidWZmZXIuYXBwZW5kKCc6Jyk7Ci0gICAgICAgICAgICBidWZmZXIuYXBwZW5kKFVSSSk7Ci0gICAgICAgICAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBidWZmZXIuYXBwZW5kKHNjaGVtZSk7Ci0gICAgICAgIGJ1ZmZlci5hcHBlbmQoIjovLyIpOwotICAgICAgICBidWZmZXIuYXBwZW5kKHNlcnZlcik7Ci0KLSAgICAgICAgaWYgKHBvcnQgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBidWZmZXIuYXBwZW5kKCc6Jyk7Ci0gICAgICAgICAgICBidWZmZXIuYXBwZW5kKHBvcnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKFVSSS5jaGFyQXQoMCkgIT0gJy8nKQotICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgnLycpOwotCi0gICAgICAgIGJ1ZmZlci5hcHBlbmQoVVJJKTsKLQotICAgICAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIG5hbWVkIHtAbGluayBDb29raWV9LgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIENvb2tpZS4KLSAgICAgKiBAcmV0dXJuIFRoZSBDb29raWUsIG9yIG51bGwgaWYgbm8gQ29va2llIHdpdGggdGhhdAotICAgICAqIG5hbWUgZXhpc3RzLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIENvb2tpZSBnZXRDb29raWUoU3RyaW5nIG5hbWUpCi0gICAgewotICAgICAgICBpZiAoX2Nvb2tpZU1hcCA9PSBudWxsKQotICAgICAgICAgICAgcmVhZENvb2tpZU1hcCgpOwotCi0gICAgICAgIHJldHVybiAoQ29va2llKSBfY29va2llTWFwLmdldChuYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWFkcyB0aGUgbmFtZWQge0BsaW5rIENvb2tpZX0gYW5kIHJldHVybnMgaXRzIHZhbHVlIChpZiBpdCBleGlzdHMpLCBvcgotICAgICAqIG51bGwgaWYgaXQgZG9lcyBub3QgZXhpc3QuCi0gICAgICoqLwotCi0gICAgcHVibGljIFN0cmluZyBnZXRDb29raWVWYWx1ZShTdHJpbmcgbmFtZSkKLSAgICB7Ci0gICAgICAgIENvb2tpZSBjb29raWU7Ci0KLSAgICAgICAgY29va2llID0gZ2V0Q29va2llKG5hbWUpOwotCi0gICAgICAgIGlmIChjb29raWUgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIHJldHVybiBjb29raWUuZ2V0VmFsdWUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0aGUgbmFtZWQgcGFyYW1ldGVyIGZyb20gdGhlIHtAbGluayBIdHRwU2VydmxldFJlcXVlc3R9LgotICAgICAqCi0gICAgICogIDxwPlVzZSB7QGxpbmsgI2dldFBhcmFtZXRlcnMoU3RyaW5nKX0gZm9yIHBhcmFtZXRlcnMgdGhhdCBtYXkKLSAgICAgKiAgaW5jbHVkZSBtdWx0aXBsZSB2YWx1ZXMuCi0gICAgICogCi0gICAgICogIDxwPlRoaXMgaXMgdGhlIHByZWZlcnJlZCB3YXkgdG8gb2J0YWluIHBhcmFtZXRlciB2YWx1ZXMgKHJhdGhlciB0aGFuCi0gICAgICogIG9idGFpbmluZyB0aGUge0BsaW5rIEh0dHBTZXJ2bGV0UmVxdWVzdH0gaXRzZWxmKS4gIEZvciBmb3JtL211bHRpcGFydC1kYXRhCi0gICAgICogIGVuY29kZWQgcmVxdWVzdHMsIHRoaXMgbWV0aG9kIHdpbGwgc3RpbGwgd29yay4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFyYW1ldGVyKFN0cmluZyBuYW1lKQotICAgIHsKLSAgICAgICAgSU11bHRpcGFydERlY29kZXIgZGVjb2RlciA9IGdldERlY29kZXIoKTsKLSAgICAgICAgaWYgKGRlY29kZXIgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBkZWNvZGVyLmdldFN0cmluZyhfcmVxdWVzdCwgbmFtZSk7Ci0KLSAgICAgICAgcmV0dXJuIF9yZXF1ZXN0LmdldFBhcmFtZXRlcihuYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgQ29udmllbmllbmNlIG1ldGhvZCBmb3IgZ2V0dGluZyBhIHtAbGluayBIdHRwU2VydmxldFJlcXVlc3R9IGF0dHJpYnV0ZS4KLSAgICAgKiAKLSAgICAgKiAgQHNpbmNlIDIuMwotICAgICAqIAotICAgICAqKi8KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0QXR0cmlidXRlKFN0cmluZyBuYW1lKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9yZXF1ZXN0LmdldEF0dHJpYnV0ZShuYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGb3IgcGFyYW1ldGVycyB0aGF0IGFyZSwgb3IgYXJlIHBvc3NpYmx5LCBtdWx0aS12YWx1ZWQsIHRoaXMKLSAgICAgKiBtZXRob2QgcmV0dXJucyBhbGwgdGhlIHZhbHVlcyBhcyBhbiBhcnJheSBvZiBTdHJpbmdzLgotICAgICAqIAotICAgICAqICBAc2VlICNnZXRQYXJhbWV0ZXIoU3RyaW5nKQotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIFN0cmluZ1tdIGdldFBhcmFtZXRlcnMoU3RyaW5nIG5hbWUpCi0gICAgewotICAgICAgICAvLyBOb3RlOiB0aGlzIG1heSBub3QgYmUgcXVpdGUgaG93IHdlIHdhbnQgaXQgdG8gd29yazsgd2UnbGwgaGF2ZSB0byBzZWUuCi0KLSAgICAgICAgSU11bHRpcGFydERlY29kZXIgZGVjb2RlciA9IGdldERlY29kZXIoKTsKLSAgICAgICAgaWYgKGRlY29kZXIgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBkZWNvZGVyLmdldFN0cmluZ3MoX3JlcXVlc3QsIG5hbWUpOwotCi0gICAgICAgIHJldHVybiBfcmVxdWVzdC5nZXRQYXJhbWV0ZXJWYWx1ZXMobmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbmFtZWQge0BsaW5rIElVcGxvYWRGaWxlfSwgaWYgaXQgZXhpc3RzLCBvciBudWxsIGlmIGl0IGRvZXNuJ3QuCi0gICAgICogVXBsb2FkcyByZXF1aXJlIGFuIGVuY29kaW5nIG9mIDxjb2RlPm11bHRpcGFydC9mb3JtLWRhdGE8L2NvZGU+Ci0gICAgICogKHRoaXMgaXMgc3BlY2lmaWVkIGluIHRoZQotICAgICAqIGZvcm0ncyBlbmN0eXBlIGF0dHJpYnV0ZSkuICBJZiB0aGUgZW5jb2RpbmcgdHlwZQotICAgICAqIGlzIG5vdCBzbywgb3IgaWYgbm8gdXBsb2FkIG1hdGNoZXMgdGhlIG5hbWUsIHRoZW4gdGhpcyBtZXRob2QgcmV0dXJucyBudWxsLgotICAgICAqIAotICAgICAqKi8KLQotICAgIHB1YmxpYyBJVXBsb2FkRmlsZSBnZXRVcGxvYWRGaWxlKFN0cmluZyBuYW1lKQotICAgIHsKLSAgICAgICAgSU11bHRpcGFydERlY29kZXIgZGVjb2RlciA9IGdldERlY29kZXIoKTsKLSAgICAgICAgaWYgKGRlY29kZXIgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIHJldHVybiBkZWNvZGVyLmdldFVwbG9hZEZpbGUoX3JlcXVlc3QsIG5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBJbnZva2VkIGF0IHRoZSBlbmQgb2YgdGhlIHJlcXVlc3QgY3ljbGUgdG8gY2xlYW51cCBhbmQgdGVtcG9yYXJ5IHJlc291cmNlcy4KLSAgICAgKiAgVGhpcyBpcyBjaGFpbmVkIHRvIHRoZSB7QGxpbmsgRGVmYXVsdE11bHRpcGFydERlY29kZXJ9LCBpZiB0aGVyZSBpcyBvbmUuCi0gICAgICogCi0gICAgICogIEBzaW5jZSAyLjAuMQotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIGNsZWFudXAoKQotICAgIHsKLSAgICAgICAgaWYgKF9kZWNvZGVyICE9IG51bGwpCi0gICAgICAgICAgICBfZGVjb2Rlci5jbGVhbnVwKF9yZXF1ZXN0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0aGUgcmVxdWVzdCB3aGljaCBpbml0aWF0ZWQgdGhlIGN1cnJlbnQgcmVxdWVzdCBjeWNsZS4gIE5vdGUgdGhhdAotICAgICAqICB0aGUgbWV0aG9kcyB7QGxpbmsgI2dldFBhcmFtZXRlcihTdHJpbmcpfSBhbmQge0BsaW5rICNnZXRQYXJhbWV0ZXJzKFN0cmluZyl9Ci0gICAgICogIHNob3VsZCBiZSB1c2VkLCByYXRoZXIgdGhhbiBvYnRhaW5pbmcgcGFyYW1ldGVycyBkaXJlY3RseSBmcm9tIHRoZSByZXF1ZXN0Ci0gICAgICogIChzaW5jZSB0aGUgUmVxdWVzdENvbnRleHQgaGFuZGxlcyB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiBub3JtYWwgYW5kIG11bHRpcGFydC9mb3JtCi0gICAgICogIHJlcXVlc3RzKS4KLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgSHR0cFNlcnZsZXRSZXF1ZXN0IGdldFJlcXVlc3QoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9yZXF1ZXN0OwotICAgIH0KLQotICAgIHB1YmxpYyBIdHRwU2VydmxldFJlc3BvbnNlIGdldFJlc3BvbnNlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfcmVzcG9uc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0Um93Q2xhc3MoKQotICAgIHsKLSAgICAgICAgU3RyaW5nIHJlc3VsdDsKLQotICAgICAgICByZXN1bHQgPSBfZXZlblJvdyA/ICJldmVuIiA6ICJvZGQiOwotCi0gICAgICAgIF9ldmVuUm93ID0gIV9ldmVuUm93OwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIEFwcGxpY2F0aW9uU2VydmxldCBnZXRTZXJ2bGV0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfc2VydmxldDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0aGUge0BsaW5rIEh0dHBTZXNzaW9ufSwgaWYgbmVjZXNzYXJ5LCBpbnZva2luZwotICAgICAqIHtAbGluayBIdHRwU2VydmxldFJlcXVlc3QjZ2V0U2Vzc2lvbihib29sZWFuKX0uICBIb3dldmVyLAotICAgICAqIHRoaXMgbWV0aG9kIHdpbGwgPGVtPm5vdDwvZW0+IGNyZWF0ZSBhIHNlc3Npb24uCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgSHR0cFNlc3Npb24gZ2V0U2Vzc2lvbigpCi0gICAgewotICAgICAgICBpZiAoX3Nlc3Npb24gPT0gbnVsbCkKLSAgICAgICAgICAgIF9zZXNzaW9uID0gX3JlcXVlc3QuZ2V0U2Vzc2lvbihmYWxzZSk7Ci0KLSAgICAgICAgcmV0dXJuIF9zZXNzaW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBMaWtlIHtAbGluayAjZ2V0U2Vzc2lvbigpfSwgYnV0IGZvcmNlcyB0aGUgY3JlYXRpb24gb2YKLSAgICAgKiAgdGhlIHtAbGluayBIdHRwU2Vzc2lvbn0sIGlmIG5lY2Vzc2FyeS4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBIdHRwU2Vzc2lvbiBjcmVhdGVTZXNzaW9uKCkKLSAgICB7Ci0gICAgICAgIGlmIChfc2Vzc2lvbiA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoTE9HLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgTE9HLmRlYnVnKCJDcmVhdGluZyBIdHRwU2Vzc2lvbiIpOwotCi0gICAgICAgICAgICBfc2Vzc2lvbiA9IF9yZXF1ZXN0LmdldFNlc3Npb24odHJ1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gX3Nlc3Npb247Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGhlYWRlcihJTWFya3VwV3JpdGVyIHdyaXRlciwgU3RyaW5nIHZhbHVlTmFtZSwgU3RyaW5nIGRhdGFOYW1lKQotICAgIHsKLSAgICAgICAgd3JpdGVyLmJlZ2luKCJ0ciIpOwotICAgICAgICB3cml0ZXIuYXR0cmlidXRlKCJjbGFzcyIsICJyZXF1ZXN0LWNvbnRleHQtaGVhZGVyIik7Ci0KLSAgICAgICAgd3JpdGVyLmJlZ2luKCJ0aCIpOwotICAgICAgICB3cml0ZXIucHJpbnQodmFsdWVOYW1lKTsKLSAgICAgICAgd3JpdGVyLmVuZCgpOwotCi0gICAgICAgIHdyaXRlci5iZWdpbigidGgiKTsKLSAgICAgICAgd3JpdGVyLnByaW50KGRhdGFOYW1lKTsKLSAgICAgICAgd3JpdGVyLmVuZCgidHIiKTsKLQotICAgICAgICBfZXZlblJvdyA9IHRydWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIG9iamVjdChJTWFya3VwV3JpdGVyIHdyaXRlciwgU3RyaW5nIG9iamVjdE5hbWUpCi0gICAgewotICAgICAgICB3cml0ZXIuYmVnaW4oInNwYW4iKTsKLSAgICAgICAgd3JpdGVyLmF0dHJpYnV0ZSgiY2xhc3MiLCAicmVxdWVzdC1jb250ZXh0LW9iamVjdCIpOwotICAgICAgICB3cml0ZXIucHJpbnQob2JqZWN0TmFtZSk7Ci0gICAgICAgIHdyaXRlci5lbmQoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcGFpcihJTWFya3VwV3JpdGVyIHdyaXRlciwgU3RyaW5nIG5hbWUsIGludCB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIHBhaXIod3JpdGVyLCBuYW1lLCBJbnRlZ2VyLnRvU3RyaW5nKHZhbHVlKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHBhaXIoSU1hcmt1cFdyaXRlciB3cml0ZXIsIFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpCi0gICAgewotICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBJUmVuZGVyRGVzY3JpcHRpb24pCi0gICAgICAgIHsKLSAgICAgICAgICAgIElSZW5kZXJEZXNjcmlwdGlvbiByZW5kZXJWYWx1ZSA9IChJUmVuZGVyRGVzY3JpcHRpb24pIHZhbHVlOwotCi0gICAgICAgICAgICB3cml0ZXIuYmVnaW4oInRyIik7Ci0gICAgICAgICAgICB3cml0ZXIuYXR0cmlidXRlKCJjbGFzcyIsIGdldFJvd0NsYXNzKCkpOwotCi0gICAgICAgICAgICB3cml0ZXIuYmVnaW4oInRoIik7Ci0gICAgICAgICAgICB3cml0ZXIucHJpbnQobmFtZSk7Ci0gICAgICAgICAgICB3cml0ZXIuZW5kKCk7Ci0KLSAgICAgICAgICAgIHdyaXRlci5iZWdpbigidGQiKTsKLQotICAgICAgICAgICAgcmVuZGVyVmFsdWUucmVuZGVyRGVzY3JpcHRpb24od3JpdGVyKTsKLQotICAgICAgICAgICAgd3JpdGVyLmVuZCgidHIiKTsKLSAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBwYWlyKHdyaXRlciwgbmFtZSwgdmFsdWUudG9TdHJpbmcoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHBhaXIoSU1hcmt1cFdyaXRlciB3cml0ZXIsIFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpCi0gICAgewotICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBpZiAodmFsdWUubGVuZ3RoKCkgPT0gMCkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICB3cml0ZXIuYmVnaW4oInRyIik7Ci0gICAgICAgIHdyaXRlci5hdHRyaWJ1dGUoImNsYXNzIiwgZ2V0Um93Q2xhc3MoKSk7Ci0KLSAgICAgICAgd3JpdGVyLmJlZ2luKCJ0aCIpOwotICAgICAgICB3cml0ZXIucHJpbnQobmFtZSk7Ci0gICAgICAgIHdyaXRlci5lbmQoKTsKLQotICAgICAgICB3cml0ZXIuYmVnaW4oInRkIik7Ci0gICAgICAgIHdyaXRlci5wcmludCh2YWx1ZSk7Ci0gICAgICAgIHdyaXRlci5lbmQoInRyIik7Ci0gICAgICAgIHdyaXRlci5wcmludGxuKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHBhaXIoSU1hcmt1cFdyaXRlciB3cml0ZXIsIFN0cmluZyBuYW1lLCBib29sZWFuIHZhbHVlKQotICAgIHsKLSAgICAgICAgcGFpcih3cml0ZXIsIG5hbWUsIHZhbHVlID8gInllcyIgOiAibm8iKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcmVhZENvb2tpZU1hcCgpCi0gICAgewotICAgICAgICBfY29va2llTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotICAgICAgICBDb29raWVbXSBjb29raWVzID0gX3JlcXVlc3QuZ2V0Q29va2llcygpOwotCi0gICAgICAgIGlmIChjb29raWVzICE9IG51bGwpCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvb2tpZXMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgX2Nvb2tpZU1hcC5wdXQoY29va2llc1tpXS5nZXROYW1lKCksIGNvb2tpZXNbaV0pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBJbnZva2VzIHtAbGluayBIdHRwU2VydmxldFJlc3BvbnNlI3NlbmRSZWRpcmVjdChTdHJpbmcpfTwvY29kZT4sIAotICAgICAqICBidXQgbWFzc2FnZXMgPGNvZGU+cGF0aDwvY29kZT4sIHN1cHBseWluZyBtaXNzaW5nIGVsZW1lbnRzIHRvCi0gICAgICogIG1ha2UgaXQgYW4gYWJzb2x1dGUgVVJMIChpLmUuLCBzcGVjaWZ5aW5nIHNjaGVtZSwgc2VydmVyLCBwb3J0LCBldGMuKS4KLSAgICAgKgotICAgICAqICA8cD5UaGUgMi4yIFNlcnZsZXQgQVBJIHdpbGwgZG8gdGhpcyBhdXRvbWF0aWNhbGx5LCBhbmQgYSBsaXR0bGUgbW9yZSwKLSAgICAgKiAgYWNjb3JkaW5nIHRvIHRoZSBlYXJseSBkb2N1bWVudGF0aW9uLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgcmVkaXJlY3QoU3RyaW5nIHBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgLy8gTm93IGEgbGl0dGxlIG1hZ2ljIHRvIGNvbnZlcnQgcGF0aCBpbnRvIGEgY29tcGxldGUgVVJMLiBUaGUgU2VydmxldAotICAgICAgICAvLyAyLjIgQVBJIGRvZXMgdGhpcyBhdXRvbWF0aWNhbGx5LgotCi0gICAgICAgIFN0cmluZyBhYnNvbHV0ZVBhdGggPSBnZXRBYnNvbHV0ZVVSTChwYXRoKTsKLQotICAgICAgICBTdHJpbmcgZW5jb2RlZFVSTCA9IF9yZXNwb25zZS5lbmNvZGVSZWRpcmVjdFVSTChhYnNvbHV0ZVBhdGgpOwotCi0gICAgICAgIF9yZXNwb25zZS5zZW5kUmVkaXJlY3QoZW5jb2RlZFVSTCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNlY3Rpb24oSU1hcmt1cFdyaXRlciB3cml0ZXIsIFN0cmluZyBzZWN0aW9uTmFtZSkKLSAgICB7Ci0gICAgICAgIHdyaXRlci5iZWdpbigidHIiKTsKLSAgICAgICAgd3JpdGVyLmF0dHJpYnV0ZSgiY2xhc3MiLCAicmVxdWVzdC1jb250ZXh0LXNlY3Rpb24iKTsKLSAgICAgICAgd3JpdGVyLmJlZ2luKCJ0aCIpOwotICAgICAgICB3cml0ZXIuYXR0cmlidXRlKCJjb2xzcGFuIiwgMik7Ci0KLSAgICAgICAgd3JpdGVyLnByaW50KHNlY3Rpb25OYW1lKTsKLSAgICAgICAgd3JpdGVyLmVuZCgidHIiKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIExpc3QgZ2V0U29ydGVkKEVudW1lcmF0aW9uIGUpCi0gICAgewotICAgICAgICBMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgICAvLyBKREsgMS40IGluY2x1ZGVzIGEgaGVscGVyIG1ldGhvZCBpbiBDb2xsZWN0aW9ucyBmb3IKLSAgICAgICAgLy8gdGhpczsgYnV0IHdlIHdhbnQgMS4yIGNvbXBhdGliaWxpdHkgZm9yIHRoZQotICAgICAgICAvLyBmb3JzZWFibGUgZnV0dXJlLgotCi0gICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKQotICAgICAgICAgICAgcmVzdWx0LmFkZChlLm5leHRFbGVtZW50KCkpOwotCi0gICAgICAgIENvbGxlY3Rpb25zLnNvcnQocmVzdWx0KTsKLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdyaXRlcyB0aGUgc3RhdGUgb2YgdGhlIGNvbnRleHQgdG8gdGhlIHdyaXRlciwgdHlwaWNhbGx5IGZvciBpbmNsdXNpb24KLSAgICAgKiBpbiBhIEhUTUwgcGFnZSByZXR1cm5lZCB0byB0aGUgdXNlci4gVGhpcyBpcyB1c2VmdWwKLSAgICAgKiB3aGVuIGRlYnVnZ2luZy4gIFRoZSBJbnNwZWN0b3IgdXNlcyB0aGlzIGFzIHdlbGwuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZShJTWFya3VwV3JpdGVyIHdyaXRlcikKLSAgICB7Ci0gICAgICAgIC8vIENyZWF0ZSBhIGJveCBhcm91bmQgYWxsIG9mIHRoaXMgc3R1ZmYgLi4uCi0KLSAgICAgICAgd3JpdGVyLmJlZ2luKCJ0YWJsZSIpOwotICAgICAgICB3cml0ZXIuYXR0cmlidXRlKCJjbGFzcyIsICJyZXF1ZXN0LWNvbnRleHQtYm9yZGVyIik7Ci0gICAgICAgIHdyaXRlci5iZWdpbigidHIiKTsKLSAgICAgICAgd3JpdGVyLmJlZ2luKCJ0ZCIpOwotCi0gICAgICAgIC8vIEdldCB0aGUgc2Vzc2lvbiwgaWYgaXQgZXhpc3RzLCBhbmQgZGlzcGxheSBpdC4KLQotICAgICAgICBIdHRwU2Vzc2lvbiBzZXNzaW9uID0gZ2V0U2Vzc2lvbigpOwotCi0gICAgICAgIGlmIChzZXNzaW9uICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG9iamVjdCh3cml0ZXIsICJTZXNzaW9uIik7Ci0gICAgICAgICAgICB3cml0ZXIuYmVnaW4oInRhYmxlIik7Ci0gICAgICAgICAgICB3cml0ZXIuYXR0cmlidXRlKCJjbGFzcyIsICJyZXF1ZXN0LWNvbnRleHQtb2JqZWN0Iik7Ci0KLSAgICAgICAgICAgIHNlY3Rpb24od3JpdGVyLCAiUHJvcGVydGllcyIpOwotICAgICAgICAgICAgaGVhZGVyKHdyaXRlciwgIk5hbWUiLCAiVmFsdWUiKTsKLQotICAgICAgICAgICAgcGFpcih3cml0ZXIsICJpZCIsIHNlc3Npb24uZ2V0SWQoKSk7Ci0gICAgICAgICAgICBkYXRlUGFpcih3cml0ZXIsICJjcmVhdGlvblRpbWUiLCBzZXNzaW9uLmdldENyZWF0aW9uVGltZSgpKTsKLSAgICAgICAgICAgIGRhdGVQYWlyKHdyaXRlciwgImxhc3RBY2Nlc3NlZFRpbWUiLCBzZXNzaW9uLmdldExhc3RBY2Nlc3NlZFRpbWUoKSk7Ci0gICAgICAgICAgICBwYWlyKHdyaXRlciwgIm1heEluYWN0aXZlSW50ZXJ2YWwiLCBzZXNzaW9uLmdldE1heEluYWN0aXZlSW50ZXJ2YWwoKSk7Ci0gICAgICAgICAgICBwYWlyKHdyaXRlciwgIm5ldyIsIHNlc3Npb24uaXNOZXcoKSk7Ci0KLSAgICAgICAgICAgIExpc3QgbmFtZXMgPSBnZXRTb3J0ZWQoc2Vzc2lvbi5nZXRBdHRyaWJ1dGVOYW1lcygpKTsKLSAgICAgICAgICAgIGludCBjb3VudCA9IG5hbWVzLnNpemUoKTsKLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChpID09IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzZWN0aW9uKHdyaXRlciwgIkF0dHJpYnV0ZXMiKTsKLSAgICAgICAgICAgICAgICAgICAgaGVhZGVyKHdyaXRlciwgIk5hbWUiLCAiVmFsdWUiKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpIG5hbWVzLmdldChpKTsKLSAgICAgICAgICAgICAgICBwYWlyKHdyaXRlciwgbmFtZSwgc2Vzc2lvbi5nZXRBdHRyaWJ1dGUobmFtZSkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB3cml0ZXIuZW5kKCk7IC8vIFNlc3Npb24KLQotICAgICAgICB9Ci0KLSAgICAgICAgb2JqZWN0KHdyaXRlciwgIlJlcXVlc3QiKTsKLSAgICAgICAgd3JpdGVyLmJlZ2luKCJ0YWJsZSIpOwotICAgICAgICB3cml0ZXIuYXR0cmlidXRlKCJjbGFzcyIsICJyZXF1ZXN0LWNvbnRleHQtb2JqZWN0Iik7Ci0KLSAgICAgICAgLy8gUGFyYW1ldGVycyAuLi4KLQotICAgICAgICBMaXN0IHBhcmFtZXRlcnMgPSBnZXRTb3J0ZWQoX3JlcXVlc3QuZ2V0UGFyYW1ldGVyTmFtZXMoKSk7Ci0gICAgICAgIGludCBjb3VudCA9IHBhcmFtZXRlcnMuc2l6ZSgpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLSAgICAgICAgewotCi0gICAgICAgICAgICBpZiAoaSA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNlY3Rpb24od3JpdGVyLCAiUGFyYW1ldGVycyIpOwotICAgICAgICAgICAgICAgIGhlYWRlcih3cml0ZXIsICJOYW1lIiwgIlZhbHVlKHMpIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZykgcGFyYW1ldGVycy5nZXQoaSk7Ci0gICAgICAgICAgICBTdHJpbmdbXSB2YWx1ZXMgPSBfcmVxdWVzdC5nZXRQYXJhbWV0ZXJWYWx1ZXMobmFtZSk7Ci0KLSAgICAgICAgICAgIHdyaXRlci5iZWdpbigidHIiKTsKLSAgICAgICAgICAgIHdyaXRlci5hdHRyaWJ1dGUoImNsYXNzIiwgZ2V0Um93Q2xhc3MoKSk7Ci0gICAgICAgICAgICB3cml0ZXIuYmVnaW4oInRoIik7Ci0gICAgICAgICAgICB3cml0ZXIucHJpbnQobmFtZSk7Ci0gICAgICAgICAgICB3cml0ZXIuZW5kKCk7Ci0gICAgICAgICAgICB3cml0ZXIuYmVnaW4oInRkIik7Ci0KLSAgICAgICAgICAgIGlmICh2YWx1ZXMubGVuZ3RoID4gMSkKLSAgICAgICAgICAgICAgICB3cml0ZXIuYmVnaW4oInVsIik7Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgdmFsdWVzLmxlbmd0aDsgaisrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICh2YWx1ZXMubGVuZ3RoID4gMSkKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVyLmJlZ2luRW1wdHkoImxpIik7Ci0KLSAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnQodmFsdWVzW2pdKTsKLQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB3cml0ZXIuZW5kKCJ0ciIpOwotICAgICAgICB9Ci0KLSAgICAgICAgc2VjdGlvbih3cml0ZXIsICJQcm9wZXJ0aWVzIik7Ci0gICAgICAgIGhlYWRlcih3cml0ZXIsICJOYW1lIiwgIlZhbHVlIik7Ci0KLSAgICAgICAgcGFpcih3cml0ZXIsICJhdXRoVHlwZSIsIF9yZXF1ZXN0LmdldEF1dGhUeXBlKCkpOwotICAgICAgICBwYWlyKHdyaXRlciwgImNoYXJhY3RlckVuY29kaW5nIiwgX3JlcXVlc3QuZ2V0Q2hhcmFjdGVyRW5jb2RpbmcoKSk7Ci0gICAgICAgIHBhaXIod3JpdGVyLCAiY29udGVudExlbmd0aCIsIF9yZXF1ZXN0LmdldENvbnRlbnRMZW5ndGgoKSk7Ci0gICAgICAgIHBhaXIod3JpdGVyLCAiY29udGVudFR5cGUiLCBfcmVxdWVzdC5nZXRDb250ZW50VHlwZSgpKTsKLSAgICAgICAgcGFpcih3cml0ZXIsICJtZXRob2QiLCBfcmVxdWVzdC5nZXRNZXRob2QoKSk7Ci0gICAgICAgIHBhaXIod3JpdGVyLCAicGF0aEluZm8iLCBfcmVxdWVzdC5nZXRQYXRoSW5mbygpKTsKLSAgICAgICAgcGFpcih3cml0ZXIsICJwYXRoVHJhbnNsYXRlZCIsIF9yZXF1ZXN0LmdldFBhdGhUcmFuc2xhdGVkKCkpOwotICAgICAgICBwYWlyKHdyaXRlciwgInByb3RvY29sIiwgX3JlcXVlc3QuZ2V0UHJvdG9jb2woKSk7Ci0gICAgICAgIHBhaXIod3JpdGVyLCAicXVlcnlTdHJpbmciLCBfcmVxdWVzdC5nZXRRdWVyeVN0cmluZygpKTsKLSAgICAgICAgcGFpcih3cml0ZXIsICJyZW1vdGVBZGRyIiwgX3JlcXVlc3QuZ2V0UmVtb3RlQWRkcigpKTsKLSAgICAgICAgcGFpcih3cml0ZXIsICJyZW1vdGVIb3N0IiwgX3JlcXVlc3QuZ2V0UmVtb3RlSG9zdCgpKTsKLSAgICAgICAgcGFpcih3cml0ZXIsICJyZW1vdGVVc2VyIiwgX3JlcXVlc3QuZ2V0UmVtb3RlVXNlcigpKTsKLSAgICAgICAgcGFpcih3cml0ZXIsICJyZXF1ZXN0ZWRTZXNzaW9uSWQiLCBfcmVxdWVzdC5nZXRSZXF1ZXN0ZWRTZXNzaW9uSWQoKSk7Ci0gICAgICAgIHBhaXIod3JpdGVyLCAicmVxdWVzdGVkU2Vzc2lvbklkRnJvbUNvb2tpZSIsIF9yZXF1ZXN0LmlzUmVxdWVzdGVkU2Vzc2lvbklkRnJvbUNvb2tpZSgpKTsKLSAgICAgICAgcGFpcih3cml0ZXIsICJyZXF1ZXN0ZWRTZXNzaW9uSWRGcm9tVVJMIiwgX3JlcXVlc3QuaXNSZXF1ZXN0ZWRTZXNzaW9uSWRGcm9tVVJMKCkpOwotICAgICAgICBwYWlyKHdyaXRlciwgInJlcXVlc3RlZFNlc3Npb25JZFZhbGlkIiwgX3JlcXVlc3QuaXNSZXF1ZXN0ZWRTZXNzaW9uSWRWYWxpZCgpKTsKLSAgICAgICAgcGFpcih3cml0ZXIsICJyZXF1ZXN0VVJJIiwgX3JlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpKTsKLSAgICAgICAgcGFpcih3cml0ZXIsICJzY2hlbWUiLCBfcmVxdWVzdC5nZXRTY2hlbWUoKSk7Ci0gICAgICAgIHBhaXIod3JpdGVyLCAic2VydmVyTmFtZSIsIF9yZXF1ZXN0LmdldFNlcnZlck5hbWUoKSk7Ci0gICAgICAgIHBhaXIod3JpdGVyLCAic2VydmVyUG9ydCIsIF9yZXF1ZXN0LmdldFNlcnZlclBvcnQoKSk7Ci0gICAgICAgIHBhaXIod3JpdGVyLCAiY29udGV4dFBhdGgiLCBfcmVxdWVzdC5nZXRDb250ZXh0UGF0aCgpKTsKLSAgICAgICAgcGFpcih3cml0ZXIsICJzZXJ2bGV0UGF0aCIsIF9yZXF1ZXN0LmdldFNlcnZsZXRQYXRoKCkpOwotCi0gICAgICAgIC8vIE5vdyBkZWFsIHdpdGggYW55IGhlYWRlcnMKLQotICAgICAgICBMaXN0IGhlYWRlcnMgPSBnZXRTb3J0ZWQoX3JlcXVlc3QuZ2V0SGVhZGVyTmFtZXMoKSk7Ci0gICAgICAgIGNvdW50ID0gaGVhZGVycy5zaXplKCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoaSA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNlY3Rpb24od3JpdGVyLCAiSGVhZGVycyIpOwotICAgICAgICAgICAgICAgIGhlYWRlcih3cml0ZXIsICJOYW1lIiwgIlZhbHVlIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZykgaGVhZGVycy5nZXQoaSk7Ci0gICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBfcmVxdWVzdC5nZXRIZWFkZXIobmFtZSk7Ci0KLSAgICAgICAgICAgIHBhaXIod3JpdGVyLCBuYW1lLCB2YWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBBdHRyaWJ1dGVzCi0KLSAgICAgICAgTGlzdCBhdHRyaWJ1dGVzID0gZ2V0U29ydGVkKF9yZXF1ZXN0LmdldEF0dHJpYnV0ZU5hbWVzKCkpOwotICAgICAgICBjb3VudCA9IGF0dHJpYnV0ZXMuc2l6ZSgpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGkgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzZWN0aW9uKHdyaXRlciwgIkF0dHJpYnV0ZXMiKTsKLSAgICAgICAgICAgICAgICBoZWFkZXIod3JpdGVyLCAiTmFtZSIsICJWYWx1ZSIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpIGF0dHJpYnV0ZXMuZ2V0KGkpOwotCi0gICAgICAgICAgICBwYWlyKHdyaXRlciwgbmFtZSwgX3JlcXVlc3QuZ2V0QXR0cmlidXRlKG5hbWUpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIENvb2tpZXMgLi4uCi0KLSAgICAgICAgQ29va2llW10gY29va2llcyA9IF9yZXF1ZXN0LmdldENvb2tpZXMoKTsKLQotICAgICAgICBpZiAoY29va2llcyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvb2tpZXMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICBpZiAoaSA9PSAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc2VjdGlvbih3cml0ZXIsICJDb29raWVzIik7Ci0gICAgICAgICAgICAgICAgICAgIGhlYWRlcih3cml0ZXIsICJOYW1lIiwgIlZhbHVlIik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgQ29va2llIGNvb2tpZSA9IGNvb2tpZXNbaV07Ci0KLSAgICAgICAgICAgICAgICBwYWlyKHdyaXRlciwgY29va2llLmdldE5hbWUoKSwgY29va2llLmdldFZhbHVlKCkpOwotCi0gICAgICAgICAgICB9IC8vIENvb2tpZXMgbG9vcAotICAgICAgICB9Ci0KLSAgICAgICAgd3JpdGVyLmVuZCgpOyAvLyBSZXF1ZXN0Ci0KLSAgICAgICAgb2JqZWN0KHdyaXRlciwgIlNlcnZsZXQiKTsKLSAgICAgICAgd3JpdGVyLmJlZ2luKCJ0YWJsZSIpOwotICAgICAgICB3cml0ZXIuYXR0cmlidXRlKCJjbGFzcyIsICJyZXF1ZXN0LWNvbnRleHQtb2JqZWN0Iik7Ci0KLSAgICAgICAgc2VjdGlvbih3cml0ZXIsICJQcm9wZXJ0aWVzIik7Ci0gICAgICAgIGhlYWRlcih3cml0ZXIsICJOYW1lIiwgIlZhbHVlIik7Ci0KLSAgICAgICAgcGFpcih3cml0ZXIsICJzZXJ2bGV0IiwgX3NlcnZsZXQpOwotICAgICAgICBwYWlyKHdyaXRlciwgIm5hbWUiLCBfc2VydmxldC5nZXRTZXJ2bGV0TmFtZSgpKTsKLSAgICAgICAgcGFpcih3cml0ZXIsICJzZXJ2bGV0SW5mbyIsIF9zZXJ2bGV0LmdldFNlcnZsZXRJbmZvKCkpOwotCi0gICAgICAgIFNlcnZsZXRDb25maWcgY29uZmlnID0gX3NlcnZsZXQuZ2V0U2VydmxldENvbmZpZygpOwotCi0gICAgICAgIExpc3QgbmFtZXMgPSBnZXRTb3J0ZWQoY29uZmlnLmdldEluaXRQYXJhbWV0ZXJOYW1lcygpKTsKLSAgICAgICAgY291bnQgPSBuYW1lcy5zaXplKCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQotICAgICAgICB7Ci0KLSAgICAgICAgICAgIGlmIChpID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2VjdGlvbih3cml0ZXIsICJJbml0IFBhcmFtZXRlcnMiKTsKLSAgICAgICAgICAgICAgICBoZWFkZXIod3JpdGVyLCAiTmFtZSIsICJWYWx1ZSIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpIG5hbWVzLmdldChpKTsKLSAgICAgICAgICAgIDsKLSAgICAgICAgICAgIHBhaXIod3JpdGVyLCBuYW1lLCBjb25maWcuZ2V0SW5pdFBhcmFtZXRlcihuYW1lKSk7Ci0KLSAgICAgICAgfQotCi0gICAgICAgIHdyaXRlci5lbmQoKTsgLy8gU2VydmxldAotCi0gICAgICAgIFNlcnZsZXRDb250ZXh0IGNvbnRleHQgPSBjb25maWcuZ2V0U2VydmxldENvbnRleHQoKTsKLQotICAgICAgICBvYmplY3Qod3JpdGVyLCAiU2VydmxldCBDb250ZXh0Iik7Ci0gICAgICAgIHdyaXRlci5iZWdpbigidGFibGUiKTsKLSAgICAgICAgd3JpdGVyLmF0dHJpYnV0ZSgiY2xhc3MiLCAicmVxdWVzdC1jb250ZXh0LW9iamVjdCIpOwotCi0gICAgICAgIHNlY3Rpb24od3JpdGVyLCAiUHJvcGVydGllcyIpOwotICAgICAgICBoZWFkZXIod3JpdGVyLCAiTmFtZSIsICJWYWx1ZSIpOwotCi0gICAgICAgIHBhaXIod3JpdGVyLCAibWFqb3JWZXJzaW9uIiwgY29udGV4dC5nZXRNYWpvclZlcnNpb24oKSk7Ci0gICAgICAgIHBhaXIod3JpdGVyLCAibWlub3JWZXJzaW9uIiwgY29udGV4dC5nZXRNaW5vclZlcnNpb24oKSk7Ci0gICAgICAgIHBhaXIod3JpdGVyLCAic2VydmVySW5mbyIsIGNvbnRleHQuZ2V0U2VydmVySW5mbygpKTsKLQotICAgICAgICBuYW1lcyA9IGdldFNvcnRlZChjb250ZXh0LmdldEluaXRQYXJhbWV0ZXJOYW1lcygpKTsKLSAgICAgICAgY291bnQgPSBuYW1lcy5zaXplKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGkgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzZWN0aW9uKHdyaXRlciwgIkluaXRpYWwgUGFyYW1ldGVycyIpOwotICAgICAgICAgICAgICAgIGhlYWRlcih3cml0ZXIsICJOYW1lIiwgIlZhbHVlIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZykgbmFtZXMuZ2V0KGkpOwotICAgICAgICAgICAgcGFpcih3cml0ZXIsIG5hbWUsIGNvbnRleHQuZ2V0SW5pdFBhcmFtZXRlcihuYW1lKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBuYW1lcyA9IGdldFNvcnRlZChjb250ZXh0LmdldEF0dHJpYnV0ZU5hbWVzKCkpOwotICAgICAgICBjb3VudCA9IG5hbWVzLnNpemUoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoaSA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNlY3Rpb24od3JpdGVyLCAiQXR0cmlidXRlcyIpOwotICAgICAgICAgICAgICAgIGhlYWRlcih3cml0ZXIsICJOYW1lIiwgIlZhbHVlIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZykgbmFtZXMuZ2V0KGkpOwotICAgICAgICAgICAgcGFpcih3cml0ZXIsIG5hbWUsIGNvbnRleHQuZ2V0QXR0cmlidXRlKG5hbWUpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHdyaXRlci5lbmQoKTsgLy8gU2VydmxldCBDb250ZXh0Ci0KLSAgICAgICAgd3JpdGVTeXN0ZW1Qcm9wZXJ0aWVzKHdyaXRlcik7Ci0KLSAgICAgICAgd3JpdGVyLmVuZCgidGFibGUiKTsgLy8gVGhlIGVuY2xvc2luZyBib3JkZXIKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgd3JpdGVTeXN0ZW1Qcm9wZXJ0aWVzKElNYXJrdXBXcml0ZXIgd3JpdGVyKQotICAgIHsKLSAgICAgICAgUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbnVsbDsKLQotICAgICAgICBvYmplY3Qod3JpdGVyLCAiSlZNIFN5c3RlbSBQcm9wZXJ0aWVzIik7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHByb3BlcnRpZXMgPSBTeXN0ZW0uZ2V0UHJvcGVydGllcygpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBzZSkKLSAgICAgICAgewotICAgICAgICAgICAgd3JpdGVyLnByaW50KCI8cD4iKTsKLSAgICAgICAgICAgIHdyaXRlci5wcmludChzZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBwYXRoU2VwYXJhdG9yID0gU3lzdGVtLmdldFByb3BlcnR5KCJwYXRoLnNlcGFyYXRvciIsICI7Iik7Ci0KLSAgICAgICAgd3JpdGVyLmJlZ2luKCJ0YWJsZSIpOwotICAgICAgICB3cml0ZXIuYXR0cmlidXRlKCJjbGFzcyIsICJyZXF1ZXN0LWNvbnRleHQtb2JqZWN0Iik7Ci0KLSAgICAgICAgTGlzdCBuYW1lcyA9IG5ldyBBcnJheUxpc3QocHJvcGVydGllcy5rZXlTZXQoKSk7Ci0gICAgICAgIENvbGxlY3Rpb25zLnNvcnQobmFtZXMpOwotICAgICAgICBpbnQgY291bnQgPSBuYW1lcy5zaXplKCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQotICAgICAgICB7Ci0KLSAgICAgICAgICAgIGlmIChpID09IDApCi0gICAgICAgICAgICAgICAgaGVhZGVyKHdyaXRlciwgIk5hbWUiLCAiVmFsdWUiKTsKLQotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBuYW1lcy5nZXQoaSk7Ci0KLSAgICAgICAgICAgIFN0cmluZyBwcm9wZXJ0eSA9IHByb3BlcnRpZXMuZ2V0UHJvcGVydHkobmFtZSk7Ci0KLSAgICAgICAgICAgIGlmIChwcm9wZXJ0eSAhPSBudWxsICYmIHByb3BlcnR5LmluZGV4T2YocGF0aFNlcGFyYXRvcikgPiAwICYmIG5hbWUuZW5kc1dpdGgoIi5wYXRoIikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgd3JpdGVyLmJlZ2luKCJ0ciIpOwotICAgICAgICAgICAgICAgIHdyaXRlci5hdHRyaWJ1dGUoImNsYXNzIiwgZ2V0Um93Q2xhc3MoKSk7Ci0KLSAgICAgICAgICAgICAgICB3cml0ZXIuYmVnaW4oInRoIik7Ci0gICAgICAgICAgICAgICAgd3JpdGVyLnByaW50KG5hbWUpOwotICAgICAgICAgICAgICAgIHdyaXRlci5lbmQoKTsKLQotICAgICAgICAgICAgICAgIHdyaXRlci5iZWdpbigidGQiKTsKLSAgICAgICAgICAgICAgICB3cml0ZXIuYmVnaW4oInVsIik7Ci0KLSAgICAgICAgICAgICAgICBTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihwcm9wZXJ0eSwgcGF0aFNlcGFyYXRvcik7Ci0KLSAgICAgICAgICAgICAgICB3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlci5iZWdpbkVtcHR5KCJsaSIpOwotICAgICAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnQodG9rZW5pemVyLm5leHRUb2tlbigpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB3cml0ZXIuZW5kKCJ0ciIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBhaXIod3JpdGVyLCBuYW1lLCBwcm9wZXJ0eSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB3cml0ZXIuZW5kKCk7IC8vIFN5c3RlbSBQcm9wZXJ0aWVzCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEludm9rZXMge0BsaW5rICN3cml0ZShJTWFya3VwV3JpdGVyKX0sIHdoaWNoIGlzIHVzZWQgZm9yIGRlYnVnZ2luZy4KLSAgICAgKiAgRG9lcyBub3RoaW5nIGlmIHRoZSBjeWNsZSBpcyByZXdpbmRpbmcuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCByZW5kZXIoSU1hcmt1cFdyaXRlciB3cml0ZXIsIElSZXF1ZXN0Q3ljbGUgY3ljbGUpCi0gICAgewotICAgICAgICBpZiAoIWN5Y2xlLmlzUmV3aW5kaW5nKCkpCi0gICAgICAgICAgICB3cml0ZSh3cml0ZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIHRoZSBtdWx0aXBhcnQgZGVjb2RlciBhbmQgbGF6aWx5IGRlY29kZXMgdGhlIHJlcXVlc3QgcGFyYW1ldGVycy4KLSAgICAgKiAgVGhpcyBhbGxvd3MgYm90aCBmb3IgdGhpcyBvcGVyYXRpb24gdG8gYmUgcGVyZm9ybWVkIG9ubHkgd2hlbiByZWFsbHkgbmVlZGVkCi0gICAgICogIGFuZCBmb3Igb3BlbmluZyB0aGUgcmVxdWVzdCBmb3IgcmVhZGluZyBtdWNoIGxhdGVyLCBzbyB0aGF0IHRoZSBFbmdpbmUgY2FuCi0gICAgICogIGhhdmUgYSBjaGFuY2UgdG8gc2V0IHRoZSBlbmNvZGluZyB0aGF0IHRoZSByZXF1ZXN0IG5lZWRzIHRvIHVzZS4KLSAgICAgKiAKLSAgICAgKiAgQHJldHVybiB0aGUgbXVsdGlwYXJ0IGRlY29kZXIgb3IgbnVsbCBpZiBub3QgbmVlZGVkIGZvciB0aGlzIHJlcXVlc3QKLSAgICAgKiAgQHNpbmNlIDMuMAotICAgICAqKi8KLSAgICBwcml2YXRlIElNdWx0aXBhcnREZWNvZGVyIGdldERlY29kZXIoKQotICAgIHsKLSAgICAgICAgaWYgKF9kZWNvZGVyICE9IG51bGwgJiYgIV9kZWNvZGVkKSB7Ci0gICAgICAgICAgICBfZGVjb2Rlci5kZWNvZGUoX3JlcXVlc3QpOwotICAgICAgICAgICAgX2RlY29kZWQgPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIF9kZWNvZGVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBTZXRzIHRoZSBtdWx0aXBhcnQgZGVjb2RlciB0byBiZSB1c2VkIGZvciB0aGUgcmVxdWVzdC4KLSAgICAgKiAKLSAgICAgKiAgQHBhcmFtIGRlY29kZXIgdGhlIG11bHRpcGFydCBkZWNvZGVyCi0gICAgICogIEBzaW5jZSAzLjAKLSAgICAgKiovCi0gICAgcHVibGljIHZvaWQgc2V0RGVjb2RlcihJTXVsdGlwYXJ0RGVjb2RlciBkZWNvZGVyKQotICAgIHsKLSAgICAgICAgX2RlY29kZXIgPSBkZWNvZGVyOwotICAgICAgICBfZGVjb2RlZCA9IGZhbHNlOwotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9yZXF1ZXN0L1Jlc3BvbnNlT3V0cHV0U3RyZWFtLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvcmVxdWVzdC9SZXNwb25zZU91dHB1dFN0cmVhbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjIwNTEwLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9yZXF1ZXN0L1Jlc3BvbnNlT3V0cHV0U3RyZWFtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTggKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkucmVxdWVzdDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuU29ja2V0RXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LlRhcGVzdHJ5OwotCi0vKioKLSAqICBBIHNwZWNpYWwgb3V0cHV0IHN0cmVhbSB3b3JrcyB3aXRoIGEge0BsaW5rIEh0dHBTZXJ2bGV0UmVzcG9uc2V9LCBidWZmZXJpbmcKLSAqICBkYXRhIHNvIGFzIHRvIGRlZmVyIG9wZW5pbmcgdGhlIHJlc3BvbnNlJ3Mgb3V0cHV0IHN0cmVhbS4KLSAqCi0gKiAgPHA+VGhlIGJ1ZmZlcmluZyBpcyBwcmV0dHkgc2ltcGxlIGJlY2F1c2UgdGhlIGNvZGUKLSAqICBiZXR3ZWVuIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LklNYXJrdXBXcml0ZXJ9IGFuZCB0aGlzIHNob3dzIGxvdHMgb2YgYnVmZmVyaW5nCi0gKiAgYWZ0ZXIgdGhlIDxjb2RlPlByaW50V3JpdGVyPC9jb2RlPiBhbmQgaW5zaWRlIHRoZSA8Y29kZT5PdXRwdXRTdHJlYW1Xcml0ZXI8L2NvZGU+IHRoYXQKLSAqICBjYW4ndCBiZSBjb25maWd1cmVkLgotICoKLSAqICA8cD5UaGlzIGNsYXNzIHBlcmZvcm1zIHNvbWUgYnVmZmVyaW5nLCBidXQgaXQgaXMgbm90IGFsbCB0aGF0Ci0gKiAgdXNlZnVsIGJlY2F1c2UgdGhlIAotICogIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5Lmh0bWwuQm9keX0gY29tcG9uZW50ICh3aGljaCB3aWxsCi0gKiAgYmUgdXNlZCBvbiB2aXJ0dWFsbHkgYWxsIFRhcGVzdHJ5IHBhZ2VzKSwgYnVmZmVycyBpdHMgd3JhcHBlZCBjb250ZW50cwotICogICh0aGF0IGlzLCBldmVydHloaW5nIGluc2lkZSB0aGUgJmx0O2JvZHkmZ3Q7IHRhZyBpbiB0aGUgZ2VuZXJhdGVkIEhUTUwpLgotICoKLSAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiAgQHZlcnNpb24gJElkJAotICogCi0gKiovCi0KLXB1YmxpYyBjbGFzcyBSZXNwb25zZU91dHB1dFN0cmVhbSBleHRlbmRzIE91dHB1dFN0cmVhbQotewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBMT0cgPSBMb2dGYWN0b3J5LmdldExvZyhSZXNwb25zZU91dHB1dFN0cmVhbS5jbGFzcyk7Ci0KLSAgICAvKioKLSAgICAgKiAgRGVmYXVsdCBzaXplIGZvciB0aGUgYnVmZmVyICgyMDAwIGJ5dGVzKS4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfU0laRSA9IDIwMDA7Ci0KLSAgICBwcml2YXRlIGludCBfcG9zOwotICAgIHByaXZhdGUgaW50IF9tYXhTaXplOwotICAgIHByaXZhdGUgYnl0ZVtdIF9idWZmZXI7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBfY29udGVudFR5cGU7Ci0gICAgcHJpdmF0ZSBIdHRwU2VydmxldFJlc3BvbnNlIF9yZXNwb25zZTsKLSAgICBwcml2YXRlIE91dHB1dFN0cmVhbSBfb3V0OwotCi0gICAgcHJpdmF0ZSBib29sZWFuIF9kaXNjYXJkID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiAgQ3JlYXRlcyB0aGUgc3RyZWFtIHdpdGggdGhlIGRlZmF1bHQgbWF4aW11bSBidWZmZXIgc2l6ZS4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBSZXNwb25zZU91dHB1dFN0cmVhbShIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQotICAgIHsKLSAgICAgICAgdGhpcyhyZXNwb25zZSwgREVGQVVMVF9TSVpFKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgU3RhbmRhcmQgY29uc3RydWN0b3IuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgUmVzcG9uc2VPdXRwdXRTdHJlYW0oSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSwgaW50IG1heFNpemUpCi0gICAgewotICAgICAgICBfcmVzcG9uc2UgPSByZXNwb25zZTsKLSAgICAgICAgX21heFNpemUgPSBtYXhTaXplOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBEb2VzIG5vdGhpbmcuICBUaGlzIGlzIGJlY2F1c2Ugb2YgY2hhaW5pbmcgb2YgPGNvZGU+Y2xvc2UoKTwvY29kZT4gZnJvbQotICAgICAqICB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5JTWFya3VwV3JpdGVyI2Nsb3NlKCl9IC4uLiBzZWUge0BsaW5rICNmbHVzaCgpfS4KLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgLy8gRG9lcyBub3RoaW5nLgotICAgIH0KLQotICAgIC8qKgotICAgICAqICBGbHVzaGVzIHRoZSB1bmRlcmx5aW5nIG91dHB1dCBzdHJlYW0sIGlmIGlzIGhhcyBiZWVuIG9wZW5lZC4gIAotICAgICAqCi0gICAgICogIDxwPlRoaXMgbWV0aG9kIGV4cGxpY2l0bHkgPGVtPmRvZXMgbm90PC9lbT4gZmx1c2ggdGhlIGludGVybmFsIGJ1ZmZlciAuLi4KLSAgICAgKiAgdGhhdCdzIGJlY2F1c2Ugd2hlbiBhbiB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5JTWFya3VwV3JpdGVyfSBpcyBjbG9zZWQgKGZvciBpbnN0YW5jZSwgYmVjYXVzZQotICAgICAqICBhbiBleGNlcHRpb24gaXMgdGhyb3duKSwgdGhhdCA8Y29kZT5jbG9zZSgpPC9jb2RlPiBzcGF3bnMgPGNvZGU+Zmx1c2goKTwvY29kZT5lcwotICAgICAqICBhbmQgPGNvZGU+Y2xvc2UoKTwvY29kZT5zIHRocm91Z2hvdXQgdGhlIG91dHB1dCBzdHJlYW0gY2hhaW4sIGV2ZW50dWFsbHkKLSAgICAgKiAgcmVhY2hpbmcgdGhpcyBtZXRob2QuCi0gICAgICoKLSAgICAgKiAgQHNlZSAjZm9yY2VGbHVzaCgpCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCBmbHVzaCgpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChfb3V0ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgX291dC5mbHVzaCgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChTb2NrZXRFeGNlcHRpb24gZXgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIExPRy5kZWJ1ZygiU29ja2V0IGV4Y2VwdGlvbi4iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqICBXcml0ZXMgdGhlIGludGVybmFsIGJ1ZmZlciB0byB0aGUgb3V0cHV0IHN0cmVhbSwgb3BlbmluZyBpdCBpZiBuZWNlc3NhcnksIHRoZW4KLSAgICAgKiAgZmx1c2hlcyB0aGUgb3V0cHV0IHN0cmVhbS4gIEZ1dHVyZSB3cml0ZXMgd2lsbCBnbyBkaXJlY3RseSB0byB0aGUgb3V0cHV0IHN0cmVhbS4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIGZvcmNlRmx1c2goKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmIChfb3V0ID09IG51bGwpCi0gICAgICAgIHsKLQotICAgICAgICAgICAgLy8gSW4gY2VydGFpbiBjYXNlcyAoc3VjaCBhcyB3aGVuIHRoZSBUYXBlc3RyeSBzZXJ2aWNlIHNlbmRzIGEgcmVkaXJlY3QpLAotICAgICAgICAgICAgLy8gdGhlcmUgaXMgbm8gb3V0cHV0IHRvIHNlbmQgYmFjayAoYW5kIG5vIGNvbnRlbnQgdHlwZSBzZXQpLiAgSW4gdGhpcwotICAgICAgICAgICAgLy8gY2FzZSwgZm9yY2VGbHVzaCgpIGRvZXMgbm90aGluZy4KLQotICAgICAgICAgICAgaWYgKF9idWZmZXIgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgICAgIG9wZW4oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBfb3V0LmZsdXNoKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFNvY2tldEV4Y2VwdGlvbiBleCkKLSAgICAgICAgewotICAgICAgICAgICAgTE9HLmRlYnVnKCJTb2NrZXQgZXhjZXB0aW9uLiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRDb250ZW50VHlwZSgpCi0gICAgewotICAgICAgICByZXR1cm4gX2NvbnRlbnRUeXBlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGdldERpc2NhcmQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9kaXNjYXJkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBTZXRzIHRoZSByZXNwb25zZSB0eXBlIHRvIGZyb20gdGhlIGNvbnRlbnRUeXBlIHByb3BlcnR5ICh3aGljaAotICAgICAqICBkZWZhdWx0cyB0byAidGV4dC9odG1sIikgYW5kIGdldHMgYW4gb3V0cHV0IHN0cmVhbQotICAgICAqICBmcm9tIHRoZSByZXNwb25zZSwgdGhlbiB3cml0ZXMgdGhlIGN1cnJlbnQgYnVmZmVyIHRvIGl0IGFuZAotICAgICAqICByZWxlYXNlcyB0aGUgYnVmZmVyLgotICAgICAqCi0gICAgICogIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlIGNvbnRlbnQgdHlwZSBoYXMgbmV2ZXIgYmVlbiBzZXQuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwcml2YXRlIHZvaWQgb3BlbigpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaWYgKF9jb250ZW50VHlwZSA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKFRhcGVzdHJ5LmdldE1lc3NhZ2UoIlJlc3BvbnNlT3V0cHV0U3RyZWFtLmNvbnRlbnQtdHlwZS1ub3Qtc2V0IikpOwotCi0gICAgICAgIF9yZXNwb25zZS5zZXRDb250ZW50VHlwZShfY29udGVudFR5cGUpOwotCi0gICAgICAgIF9vdXQgPSBfcmVzcG9uc2UuZ2V0T3V0cHV0U3RyZWFtKCk7Ci0KLSAgICAgICAgaW5uZXJXcml0ZShfYnVmZmVyLCAwLCBfcG9zKTsKLQotICAgICAgICBfcG9zID0gMDsKLSAgICAgICAgX2J1ZmZlciA9IG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIERpc2NhcmRzIGFsbCBvdXRwdXQgaW4gdGhlIGJ1ZmZlci4gIFRoaXMgaXMgdXNlZCBhZnRlciBhbiBlcnJvciB0bwotICAgICAqICByZXN0YXJ0IHRoZSBvdXRwdXQgKHNvIHRoYXQgdGhlIGVycm9yIG1heSBiZSBwcmVzZW50ZWQpLgotICAgICAqCi0gICAgICogIDxwPkNsZWFycyB0aGUgZGlzY2FyZCBmbGFnLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgcmVzZXQoKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIF9wb3MgPSAwOwotICAgICAgICBfZGlzY2FyZCA9IGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBDaGFuZ2VzIHRoZSBtYXhpbXVtIGJ1ZmZlciBzaXplLiAgSWYgdGhlIG5ldyBidWZmZXIgc2l6ZSBpcyBzbWFsbGVyCi0gICAgICogIHRoYW4gdGhlIG51bWJlciBvZgotICAgICAqICBieXRlcyBhbHJlYWR5IGluIHRoZSBidWZmZXIsIHRoZSBidWZmZXIgaXMgaW1tZWRpYXRlbHkgZmx1c2hlZC4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIHNldEJ1ZmZlclNpemUoaW50IHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmICh2YWx1ZSA8IF9wb3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG9wZW4oKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIF9tYXhTaXplID0gdmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q29udGVudFR5cGUoU3RyaW5nIHZhbHVlKQotICAgIHsKLSAgICAgICAgX2NvbnRlbnRUeXBlID0gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEluZGljYXRlcyB3aGV0aGVyIHRoZSBzdHJlYW0gc2hvdWxkIGlnbm9yZSBhbGwgZGF0YSB3cml0dGVuIHRvIGl0LgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgc2V0RGlzY2FyZChib29sZWFuIHZhbHVlKQotICAgIHsKLSAgICAgICAgX2Rpc2NhcmQgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5uZXJXcml0ZShieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiAoYiA9PSBudWxsIHx8IGxlbiA9PSAwIHx8IF9kaXNjYXJkKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBfb3V0LndyaXRlKGIsIG9mZiwgbGVuKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoU29ja2V0RXhjZXB0aW9uIGV4KQotICAgICAgICB7Ci0gICAgICAgICAgICBMT0cuZGVidWcoIlNvY2tldCBleGNlcHRpb24uIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZShieXRlIGJbXSwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiAobGVuID09IDAgfHwgX2Rpc2NhcmQpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgaWYgKF9vdXQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgX291dC53cml0ZShiLCBvZmYsIGxlbik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBJZiB0b28gbGFyZ2UgZm9yIHRoZSBtYXhpbXVtIHNpemUgYnVmZmVyLCB0aGVuIG9wZW4gdGhlIG91dHB1dCBzdHJlYW0KLSAgICAgICAgLy8gd3JpdGUgb3V0IGFuZCBmcmVlIHRoZSBidWZmZXIsIGFuZCB3cml0ZSBvdXQgdGhlIG5ldyBzdHVmZi4KLQotICAgICAgICBpZiAoX3BvcyArIGxlbiA+PSBfbWF4U2l6ZSkKLSAgICAgICAgewotICAgICAgICAgICAgb3BlbigpOwotICAgICAgICAgICAgaW5uZXJXcml0ZShiLCBvZmYsIGxlbik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBBbGxvY2F0ZSB0aGUgYnVmZmVyIHdoZW4gaXQgaXMgaW5pdGlhbGx5IG5lZWRlZC4KLQotICAgICAgICBpZiAoX2J1ZmZlciA9PSBudWxsKQotICAgICAgICAgICAgX2J1ZmZlciA9IG5ldyBieXRlW19tYXhTaXplXTsKLQotICAgICAgICAvLyBDb3B5IHRoZSBuZXcgYnl0ZXMgaW50byB0aGUgYnVmZmVyIGFuZCBhZHZhbmNlIHRoZSBwb3NpdGlvbi4KLQotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGIsIG9mZiwgX2J1ZmZlciwgX3BvcywgbGVuKTsKLSAgICAgICAgX3BvcyArPSBsZW47Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGUoaW50IGIpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaWYgKF9kaXNjYXJkKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIC8vIFRoaXMgbWV0aG9kIGlzIHJhcmVseSBjYWxsZWQgc28gdGhpcyBsaXR0bGUgaW5lZmZpY2llbmN5IGlzIGJldHRlciB0aGFuCi0gICAgICAgIC8vIG1haW50YWluaW5nIHRoYXQgdWdseSBidWZmZXIgZXhwYW5zaW9uIGNvZGUgaW4gdHdvIHBsYWNlcy4KLQotICAgICAgICBieXRlW10gdGlueSA9IG5ldyBieXRlW10geyhieXRlKSBiIH07Ci0KLSAgICAgICAgd3JpdGUodGlueSwgMCwgMSk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9yZXNvbHZlci9BYnN0cmFjdFNwZWNpZmljYXRpb25SZXNvbHZlci5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3Jlc29sdmVyL0Fic3RyYWN0U3BlY2lmaWNhdGlvblJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjNGNhZmUuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3Jlc29sdmVyL0Fic3RyYWN0U3BlY2lmaWNhdGlvblJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDAgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkucmVzb2x2ZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklFbmdpbmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlcXVlc3RDeWNsZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZXNvdXJjZUxvY2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuVGFwZXN0cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5lbmdpbmUuSVNwZWNpZmljYXRpb25Tb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5zcGVjLklBcHBsaWNhdGlvblNwZWNpZmljYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5zcGVjLklDb21wb25lbnRTcGVjaWZpY2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkudXRpbC5wb29sLklQb29sYWJsZTsKLQotLyoqCi0gKiAgQmFzZSBjbGFzcyBmb3IgcmVzb2x2aW5nIGEge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkuc3BlYy5JQ29tcG9uZW50U3BlY2lmaWNhdGlvbn0KLSAqICBmb3IgYSBwYXJ0aWN1bGFyIHBhZ2Ugb3IgY29tcG9uZW50LCB3aXRoaW4gYSBzcGVjaWZpZWQgCi0gKiAge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkuSU5hbWVzcGFjZX0uICBJbiBzb21lIGNhc2VzLCBhIHNlYXJjaCBpcyBuZWNlc3NhcnkuCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQHNpbmNlIDMuMAotICoKLSAqKi8KLQotcHVibGljIGNsYXNzIEFic3RyYWN0U3BlY2lmaWNhdGlvblJlc29sdmVyIGltcGxlbWVudHMgSVBvb2xhYmxlCi17Ci0gICAgcHJpdmF0ZSBJU3BlY2lmaWNhdGlvblNvdXJjZSBfc3BlY2lmaWNhdGlvblNvdXJjZTsKLQotICAgIHByaXZhdGUgSU5hbWVzcGFjZSBfbmFtZXNwYWNlOwotCi0gICAgcHJpdmF0ZSBJQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBfc3BlY2lmaWNhdGlvbjsKLQotICAgIHByaXZhdGUgSVJlc291cmNlTG9jYXRpb24gX2FwcGxpY2F0aW9uUm9vdExvY2F0aW9uOwotCi0gICAgcHJpdmF0ZSBJUmVzb3VyY2VMb2NhdGlvbiBfd2ViSW5mTG9jYXRpb247Ci0KLSAgICBwcml2YXRlIElSZXNvdXJjZUxvY2F0aW9uIF93ZWJJbmZBcHBMb2NhdGlvbjsKLQotICAgIHByaXZhdGUgSVNwZWNpZmljYXRpb25SZXNvbHZlckRlbGVnYXRlIF9kZWxlZ2F0ZTsKLQotICAgIHB1YmxpYyBBYnN0cmFjdFNwZWNpZmljYXRpb25SZXNvbHZlcihJUmVxdWVzdEN5Y2xlIGN5Y2xlKQotICAgIHsKLSAgICAgICAgSUVuZ2luZSBlbmdpbmUgPSBjeWNsZS5nZXRFbmdpbmUoKTsKLQotICAgICAgICBfc3BlY2lmaWNhdGlvblNvdXJjZSA9IGVuZ2luZS5nZXRTcGVjaWZpY2F0aW9uU291cmNlKCk7Ci0KLSAgICAgICAgX2FwcGxpY2F0aW9uUm9vdExvY2F0aW9uID0gVGFwZXN0cnkuZ2V0QXBwbGljYXRpb25Sb290TG9jYXRpb24oY3ljbGUpOwotCi0gICAgICAgIFN0cmluZyBzZXJ2bGV0TmFtZSA9Ci0gICAgICAgICAgICBjeWNsZS5nZXRSZXF1ZXN0Q29udGV4dCgpLmdldFNlcnZsZXQoKS5nZXRTZXJ2bGV0Q29uZmlnKCkuZ2V0U2VydmxldE5hbWUoKTsKLQotICAgICAgICBfd2ViSW5mTG9jYXRpb24gPSBfYXBwbGljYXRpb25Sb290TG9jYXRpb24uZ2V0UmVsYXRpdmVMb2NhdGlvbigiL1dFQi1JTkYvIik7Ci0KLSAgICAgICAgX3dlYkluZkFwcExvY2F0aW9uID0gX3dlYkluZkxvY2F0aW9uLmdldFJlbGF0aXZlTG9jYXRpb24oc2VydmxldE5hbWUgKyAiLyIpOwotCi0gICAgICAgIElBcHBsaWNhdGlvblNwZWNpZmljYXRpb24gc3BlY2lmaWNhdGlvbiA9IGVuZ2luZS5nZXRTcGVjaWZpY2F0aW9uKCk7Ci0KLSAgICAgICAgaWYgKHNwZWNpZmljYXRpb24uY2hlY2tFeHRlbnNpb24oVGFwZXN0cnkuU1BFQ0lGSUNBVElPTl9SRVNPTFZFUl9ERUxFR0FURV9FWFRFTlNJT05fTkFNRSkpCi0gICAgICAgICAgICBfZGVsZWdhdGUgPQotICAgICAgICAgICAgICAgIChJU3BlY2lmaWNhdGlvblJlc29sdmVyRGVsZWdhdGUpIGVuZ2luZS5nZXRTcGVjaWZpY2F0aW9uKCkuZ2V0RXh0ZW5zaW9uKAotICAgICAgICAgICAgICAgICAgICBUYXBlc3RyeS5TUEVDSUZJQ0FUSU9OX1JFU09MVkVSX0RFTEVHQVRFX0VYVEVOU0lPTl9OQU1FLAotICAgICAgICAgICAgICAgICAgICBJU3BlY2lmaWNhdGlvblJlc29sdmVyRGVsZWdhdGUuY2xhc3MpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBfZGVsZWdhdGUgPSBOdWxsU3BlY2lmaWNhdGlvblJlc29sdmVyRGVsZWdhdGUuZ2V0U2hhcmVkSW5zdGFuY2UoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0aGUge0BsaW5rIElTcGVjaWZpY2F0aW9uUmVzb2x2ZXJEZWxlZ2F0ZX0gaW5zdGFuY2UgcmVnaXN0ZXJlZAotICAgICAqICBpbiB0aGUgYXBwbGljYXRpb24gc3BlY2lmaWNhdGlvbiBhcyBleHRlbnNpb24KLSAgICAgKiAge0BsaW5rIFRhcGVzdHJ5I1NQRUNJRklDQVRJT05fUkVTT0xWRVJfREVMRUdBVEVfRVhURU5TSU9OX05BTUV9LAotICAgICAqICBvciBudWxsIGlmIG5vIHN1Y2ggZXh0ZW5zaW9uIGV4aXN0cy4KLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgSVNwZWNpZmljYXRpb25SZXNvbHZlckRlbGVnYXRlIGdldERlbGVnYXRlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfZGVsZWdhdGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgdGhlIGxvY2F0aW9uIG9mIHRoZSBzZXJ2bGV0LCB3aXRoaW4gdGhlCi0gICAgICogIHNlcnZsZXQgY29udGV4dC4KLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwcm90ZWN0ZWQgSVJlc291cmNlTG9jYXRpb24gZ2V0QXBwbGljYXRpb25Sb290TG9jYXRpb24oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9hcHBsaWNhdGlvblJvb3RMb2NhdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgSW52b2tlZCBpbiBzdWJjbGFzc2VzIHRvIGlkZW50aWZ5IHRoZSByZXNvbHZlZCBuYW1lc3BhY2UuCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0TmFtZXNwYWNlKElOYW1lc3BhY2UgbmFtZXNwYWNlKQotICAgIHsKLSAgICAgICAgX25hbWVzcGFjZSA9IG5hbWVzcGFjZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0aGUgcmVzb2x2ZSBuYW1lc3BhY2UuCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIElOYW1lc3BhY2UgZ2V0TmFtZXNwYWNlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfbmFtZXNwYWNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIHRoZSBzcGVjaWZpY2F0aW9uIHNvdXJjZSBmb3IgdGhlIHJ1bm5pbmcgYXBwbGljYXRpb24uCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHJvdGVjdGVkIElTcGVjaWZpY2F0aW9uU291cmNlIGdldFNwZWNpZmljYXRpb25Tb3VyY2UoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9zcGVjaWZpY2F0aW9uU291cmNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIHRoZSBsb2NhdGlvbiBvZiAvV0VCLUlORi8sIGluIHRoZSBzZXJ2bGV0IGNvbnRleHQuCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHJvdGVjdGVkIElSZXNvdXJjZUxvY2F0aW9uIGdldFdlYkluZkxvY2F0aW9uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfd2ViSW5mTG9jYXRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgdGhlIGxvY2F0aW9uIG9mIHRoZSBhcHBsaWNhdGlvbi1zcGVjaWZpYyBzdWJkaXJlY3RvcnksIHVuZGVyCi0gICAgICogIC9XRUItSU5GLywgaW4gdGhlIHNlcnZsZXQgY29udGV4dC4KLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwcm90ZWN0ZWQgSVJlc291cmNlTG9jYXRpb24gZ2V0V2ViSW5mQXBwTG9jYXRpb24oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF93ZWJJbmZBcHBMb2NhdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0aGUgcmVzb2x2ZWQgc3BlY2lmaWNhdGlvbi4KLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgSUNvbXBvbmVudFNwZWNpZmljYXRpb24gZ2V0U3BlY2lmaWNhdGlvbigpCi0gICAgewotICAgICAgICByZXR1cm4gX3NwZWNpZmljYXRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEludm9rZWQgaW4gc3ViY2xhc3MgdG8gc2V0IHRoZSBmaW5hbCBzcGVjaWZpY2F0aW9uIHRoZSBpbml0aWFsCi0gICAgICogIGlucHV0cyBhcmUgcmVzb2x2ZWQgdG8uCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWNhdGlvbihJQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBzcGVjaWZpY2F0aW9uKQotICAgIHsKLSAgICAgICAgX3NwZWNpZmljYXRpb24gPSBzcGVjaWZpY2F0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBDbGVhcnMgdGhlIG5hbWVzcGFjZSwgc3BlY2lmaWNhdGlvbiBhbmQgc2ltcGxlTmFtZSBwcm9wZXJ0aWVzLgotICAgICAqIAotICAgICAqKi8KLQotICAgIHByb3RlY3RlZCB2b2lkIHJlc2V0KCkKLSAgICB7Ci0gICAgICAgIF9uYW1lc3BhY2UgPSBudWxsOwotICAgICAgICBfc3BlY2lmaWNhdGlvbiA9IG51bGw7Ci0gICAgfQotCi0gICAgLyoqIERvZXMgbm90aGluZy4gKi8KLSAgICBwdWJsaWMgdm9pZCBkaXNjYXJkRnJvbVBvb2woKQotICAgIHsKLQotICAgIH0KLQotICAgIC8qKiBJbnZva2VzIHtAbGluayAjcmVzZXQoKX0gKi8KLQotICAgIHB1YmxpYyB2b2lkIHJlc2V0Rm9yUG9vbCgpCi0gICAgewotICAgICAgICByZXNldCgpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3Jlc29sdmVyL0NvbXBvbmVudFNwZWNpZmljYXRpb25SZXNvbHZlci5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3Jlc29sdmVyL0NvbXBvbmVudFNwZWNpZmljYXRpb25SZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjhiM2RjLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9yZXNvbHZlci9Db21wb25lbnRTcGVjaWZpY2F0aW9uUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1OSArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5yZXNvbHZlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUxvY2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZXF1ZXN0Q3ljbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVzb3VyY2VMb2NhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LlRhcGVzdHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuc3BlYy5JQ29tcG9uZW50U3BlY2lmaWNhdGlvbjsKLQotLyoqCi0gKiAgVXRpbGl0eSBjbGFzcyB0aGF0IHVuZGVyc3RhbmRzIHRoZSBydWxlcyBvZiBjb21wb25lbnQgdHlwZXMgKHdoaWNoCi0gKiAgbWF5IG9wdGlvbmFsbHkgaGF2ZSBhIGxpYnJhcnkgcHJlZml4KSBhbmQgY2FuIHJlc29sdmUgCi0gKiAgdGhlIHR5cGUgdG8gYSB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5JTmFtZXNwYWNlfSBhbmQgYSAKLSAqICB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5zcGVjLklDb21wb25lbnRTcGVjaWZpY2F0aW9ufS4KLSAqIAotICogIDxwPkxpa2Uge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkucmVzb2x2ZXIuUGFnZVNwZWNpZmljYXRpb25SZXNvbHZlcn0sCi0gKiAgaWYgdGhlIGNvbXBvbmVudCBpcyBub3QgZGVmaW5lZCBleHBsaWNpdGx5IGluIHRoZSBuYW1lc3BhY2UsIGEgc2VhcmNoCi0gKiAgbWF5IG9jY3VyOgotICogCi0gKiAgUGVyZm9ybXMgdGhlIHRyaWNreSB3b3JrIG9mIHJlc29sdmluZyBhIHBhZ2UgbmFtZSB0byBhIHBhZ2Ugc3BlY2lmaWNhdGlvbi4KLSAqICBUaGUgc2VhcmNoIGZvciBwYWdlcyBpbiB0aGUgYXBwbGljYXRpb24gbmFtZXNwYWNlIGlzIHRoZSBtb3N0IGNvbXBsaWNhdGVkLAotICogIHNpbmNlIFRhcGVzdHJ5IHNlYXJjaGVzIGZvciBwYWdlcyB0aGF0IGFyZW4ndCBleHBsaWNpdGx5IGRlZmluZWQgaW4gdGhlCi0gKiAgYXBwbGljYXRpb24gc3BlY2lmaWNhdGlvbi4gIFRoZSBzZWFyY2gsIGJhc2VkIG9uIHRoZSA8aT5zaW1wbGUtbmFtZTwvaT4KLSAqICBvZiB0aGUgcGFnZSwgZ29lcyBhcyBmb2xsb3dzOgotICogCi0gKiAgPHVsPgotICogIDxsaT5BcyBkZWNsYXJlZCBpbiB0aGUgYXBwbGljYXRpb24gc3BlY2lmaWNhdGlvbgotICogIDxsaT48aT50eXBlPC9pPi5qd2MgaW4gdGhlIHNhbWUgZm9sZGVyIGFzIHRoZSBhcHBsaWNhdGlvbiBzcGVjaWZpY2F0aW9uCi0gKiAgPGxpPjxpPnR5cGU8L2k+IGp3YyBpbiB0aGUgV0VCLUlORi88aT5zZXJ2bGV0LW5hbWU8L2k+IGRpcmVjdG9yeSBvZiB0aGUgY29udGV4dCByb290Ci0gKiAgPGxpPjxpPnR5cGU8L2k+Lmp3YyBpbiBXRUItSU5GCi0gKiAgPGxpPjxpPnR5cGU8L2k+Lmp3YyBpbiB0aGUgYXBwbGljYXRpb24gcm9vdCAod2l0aGluIHRoZSBjb250ZXh0IHJvb3QpCi0gKiAgPGxpPkJ5IHNlYXJjaGluZyB0aGUgZnJhbWV3b3JrIG5hbWVzcGFjZQotICogIDwvdWw+IAotICogCi0gKiAgVGhlIHNlYXJjaCBmb3IgY29tcG9uZW50cyBpbiBsaWJyYXJ5IG5hbWVzcGFjZXMgaXMgbW9yZSBhYmJyZXZpYXRlZDoKLSAqICA8bGk+QXMgZGVjbGFyZWQgaW4gdGhlIGxpYnJhcnkgc3BlY2lmaWNhdGlvbgotICogIDxsaT48aT50eXBlPC9pPi5qd2MgaW4gdGhlIHNhbWUgZm9sZGVyIGFzIHRoZSBsaWJyYXJ5IHNwZWNpZmljYXRpb24KLSAqICA8bGk+Qnkgc2VhcmNoaW5nIHRoZSBmcmFtZXdvcmsgbmFtZXNwYWNlCi0gKiAgPC91bD4KLSAqCi0gKiAKLSAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiAgQHZlcnNpb24gJElkJAotICogIEBzaW5jZSAzLjAKLSAqCi0gKiovCi0KLXB1YmxpYyBjbGFzcyBDb21wb25lbnRTcGVjaWZpY2F0aW9uUmVzb2x2ZXIgZXh0ZW5kcyBBYnN0cmFjdFNwZWNpZmljYXRpb25SZXNvbHZlcgotewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBMT0cgPSBMb2dGYWN0b3J5LmdldExvZyhDb21wb25lbnRTcGVjaWZpY2F0aW9uUmVzb2x2ZXIuY2xhc3MpOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgX3R5cGU7Ci0KLSAgICBwdWJsaWMgQ29tcG9uZW50U3BlY2lmaWNhdGlvblJlc29sdmVyKElSZXF1ZXN0Q3ljbGUgY3ljbGUpCi0gICAgewotICAgICAgICBzdXBlcihjeWNsZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVzZXQoKQotICAgIHsKLSAgICAgICAgX3R5cGUgPSBudWxsOwotCi0gICAgICAgIHN1cGVyLnJlc2V0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFBhc3NlZCB0aGUgbmFtZXNwYWNlIG9mIGEgY29udGFpbmVyICh0byByZXNvbHZlIHRoZSB0eXBlIGluKQotICAgICAqICBhbmQgdGhlIHR5cGUgdG8gcmVzb2x2ZSwgcGVyZm9ybXMgdGhlIHByb2Nlc3NpbmcuICBBICJiYXJlIHR5cGUiCi0gICAgICogICh3aXRob3V0IGEgbGlicmFyeSBwcmVmaXgpIG1heSBiZSBpbiB0aGUgY29udGFpbmVyTmFtZXNwYWNlLAotICAgICAqICBvciB0aGUgZnJhbWV3b3JrIG5hbWVzcGFjZQotICAgICAqICAoYSBzZWFyY2ggb2NjdXJzIGluIHRoYXQgb3JkZXIpLgotICAgICAqIAotICAgICAqICBAcGFyYW0gY3ljbGUgY3VycmVudCByZXF1ZXN0IGN5Y2xlCi0gICAgICogIEBwYXJhbSBjb250YWluZXJOYW1lc3BhY2UgbmFtZXNwYWNlIHRoYXQgbWF5IGNvbnRhaW4KLSAgICAgKiAgYSBsaWJyYXJ5IHJlZmVyZW5jZWQgaW4gdGhlIHR5cGUKLSAgICAgKiAgQHBhcmFtIHR5cGUgdGhlIGNvbXBvbmVudCBzcGVjaWZpY2F0aW9uCi0gICAgICogIHRvICBmaW5kLCBlaXRoZXIgYSBzaW1wbGUgbmFtZSwgb3IgcHJlZml4ZWQgd2l0aCBhIGxpYnJhcnkgaWQKLSAgICAgKiAgKGRlZmluZWQgZm9yIHRoZSBjb250YWluZXIgbmFtZXNwYWNlKQotICAgICAqIAotICAgICAqICBAc2VlICNnZXROYW1lc3BhY2UoKQotICAgICAqICBAc2VlICNnZXRTcGVjaWZpY2F0aW9uKCkKLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCByZXNvbHZlKAotICAgICAgICBJUmVxdWVzdEN5Y2xlIGN5Y2xlLAotICAgICAgICBJTmFtZXNwYWNlIGNvbnRhaW5lck5hbWVzcGFjZSwKLSAgICAgICAgU3RyaW5nIHR5cGUsCi0gICAgICAgIElMb2NhdGlvbiBsb2NhdGlvbikKLSAgICB7Ci0gICAgICAgIGludCBjb2xvbnggPSB0eXBlLmluZGV4T2YoJzonKTsKLQotICAgICAgICBpZiAoY29sb254ID4gMCkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIGxpYnJhcnlJZCA9IHR5cGUuc3Vic3RyaW5nKDAsIGNvbG9ueCk7Ci0gICAgICAgICAgICBTdHJpbmcgc2ltcGxlVHlwZSA9IHR5cGUuc3Vic3RyaW5nKGNvbG9ueCArIDEpOwotCi0gICAgICAgICAgICByZXNvbHZlKGN5Y2xlLCBjb250YWluZXJOYW1lc3BhY2UsIGxpYnJhcnlJZCwgc2ltcGxlVHlwZSwgbG9jYXRpb24pOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJlc29sdmUoY3ljbGUsIGNvbnRhaW5lck5hbWVzcGFjZSwgbnVsbCwgdHlwZSwgbG9jYXRpb24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBMaWtlIHtAbGluayAjcmVzb2x2ZShvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZXF1ZXN0Q3ljbGUsIG9yZy5hcGFjaGUudGFwZXN0cnkuSU5hbWVzcGFjZSwgamF2YS5sYW5nLlN0cmluZywgb3JnLmFwYWNoZS50YXBlc3RyeS5JTG9jYXRpb24pfSwKLSAgICAgKiAgYnV0IHVzZWQgd2hlbiB0aGUgdHlwZSBoYXMgYWxyZWFkeSBiZWVuIHBhcnNlZCBpbnRvIGEgbGlicmFyeSBpZCBhbmQgYSBzaW1wbGUgdHlwZS4KLSAgICAgKiAKLSAgICAgKiAgQHBhcmFtIGN5Y2xlIGN1cnJlbnQgcmVxdWVzdCBjeWNsZQotICAgICAqICBAcGFyYW0gY29udGFpbmVyTmFtZXNwYWNlIG5hbWVzcGFjZSB0aGF0IG1heSBjb250YWluCi0gICAgICogIGEgbGlicmFyeSByZWZlcmVuY2VkIGluIHRoZSB0eXBlCi0gICAgICogIEBwYXJhbSBsaWJyYXJ5SWQgdGhlIGxpYnJhcnkgaWQgd2l0aGluIHRoZSBjb250YWluZXIgbmFtZXNwYWNlLCBvciBudWxsCi0gICAgICogIEBwYXJhbSB0eXBlIHRoZSBjb21wb25lbnQgc3BlY2lmaWNhdGlvbgotICAgICAqICB0byAgZmluZCBhcyBhIHNpbXBsZSBuYW1lICh3aXRob3V0IGEgbGlicmFyeSBwcmVmaXgpCi0gICAgICogIEBwYXJhbSBsb2NhdGlvbiBvZiByZWZlcmVuY2UgdG8gYmUgcmVzb2x2ZWQKLSAgICAgKiAgQHRocm93cyBBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24gaWYgdGhlIHR5cGUgY2Fubm90IGJlIHJlc29sdmVkCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgcmVzb2x2ZSgKLSAgICAgICAgSVJlcXVlc3RDeWNsZSBjeWNsZSwKLSAgICAgICAgSU5hbWVzcGFjZSBjb250YWluZXJOYW1lc3BhY2UsCi0gICAgICAgIFN0cmluZyBsaWJyYXJ5SWQsCi0gICAgICAgIFN0cmluZyB0eXBlLAotICAgICAgICBJTG9jYXRpb24gbG9jYXRpb24pCi0gICAgewotICAgICAgICByZXNldCgpOwotICAgICAgICBfdHlwZSA9IHR5cGU7Ci0KLSAgICAgICAgSU5hbWVzcGFjZSBuYW1lc3BhY2UgPSBudWxsOwotCi0gICAgICAgIGlmIChsaWJyYXJ5SWQgIT0gbnVsbCkKLSAgICAgICAgICAgIG5hbWVzcGFjZSA9IGNvbnRhaW5lck5hbWVzcGFjZS5nZXRDaGlsZE5hbWVzcGFjZShsaWJyYXJ5SWQpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBuYW1lc3BhY2UgPSBjb250YWluZXJOYW1lc3BhY2U7Ci0KLSAgICAgICAgc2V0TmFtZXNwYWNlKG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgaWYgKG5hbWVzcGFjZS5jb250YWluc0NvbXBvbmVudFR5cGUodHlwZSkpCi0gICAgICAgICAgICBzZXRTcGVjaWZpY2F0aW9uKG5hbWVzcGFjZS5nZXRDb21wb25lbnRTcGVjaWZpY2F0aW9uKHR5cGUpKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgc2VhcmNoRm9yQ29tcG9uZW50KGN5Y2xlKTsKLQotICAgICAgICAvLyBJZiBub3QgZm91bmQgYWZ0ZXIgc2VhcmNoLCBjaGVjayB0byBzZWUgaWYgaXQncyBpbgotICAgICAgICAvLyB0aGUgZnJhbWV3b3JrIGluc3RlYWQuCi0KLSAgICAgICAgaWYgKGdldFNwZWNpZmljYXRpb24oKSA9PSBudWxsKQotICAgICAgICB7Ci0KLSAgICAgICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgVGFwZXN0cnkuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAiTmFtZXNwYWNlLm5vLXN1Y2gtY29tcG9uZW50LXR5cGUiLAotICAgICAgICAgICAgICAgICAgICB0eXBlLAotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UuZ2V0TmFtZXNwYWNlSWQoKSksCi0gICAgICAgICAgICAgICAgbG9jYXRpb24sCi0gICAgICAgICAgICAgICAgbnVsbCk7Ci0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZWFyY2hGb3JDb21wb25lbnQoSVJlcXVlc3RDeWNsZSBjeWNsZSkKLSAgICB7Ci0gICAgICAgIElOYW1lc3BhY2UgbmFtZXNwYWNlID0gZ2V0TmFtZXNwYWNlKCk7Ci0KLSAgICAgICAgaWYgKExPRy5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICAgICAgTE9HLmRlYnVnKCJSZXNvbHZpbmcgdW5rbm93biBjb21wb25lbnQgJyIgKyBfdHlwZSArICInIGluICIgKyBuYW1lc3BhY2UpOwotCi0gICAgICAgIFN0cmluZyBleHBlY3RlZE5hbWUgPSBfdHlwZSArICIuandjIjsKLSAgICAgICAgSVJlc291cmNlTG9jYXRpb24gbmFtZXNwYWNlTG9jYXRpb24gPSBuYW1lc3BhY2UuZ2V0U3BlY2lmaWNhdGlvbkxvY2F0aW9uKCk7Ci0KLSAgICAgICAgLy8gTG9vayBmb3IgYXBwcm9wcmlhdGUgZmlsZSBpbiBzYW1lIGZvbGRlciBhcyB0aGUgbGlicmFyeSAob3IgYXBwbGljYXRpb24pCi0gICAgICAgIC8vIHNwZWNpZmljYWl0b24uCi0KLSAgICAgICAgaWYgKGZvdW5kKG5hbWVzcGFjZUxvY2F0aW9uLmdldFJlbGF0aXZlTG9jYXRpb24oZXhwZWN0ZWROYW1lKSkpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgaWYgKG5hbWVzcGFjZS5pc0FwcGxpY2F0aW9uTmFtZXNwYWNlKCkpCi0gICAgICAgIHsKLQotICAgICAgICAgICAgLy8gVGhlIGFwcGxpY2F0aW9uIG5hbWVzcGFjZSBnZXRzIHNvbWUgZXh0cmEgc2VhcmNoaW5nLgotCi0gICAgICAgICAgICBpZiAoZm91bmQoZ2V0V2ViSW5mQXBwTG9jYXRpb24oKS5nZXRSZWxhdGl2ZUxvY2F0aW9uKGV4cGVjdGVkTmFtZSkpKQotICAgICAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAgICAgaWYgKGZvdW5kKGdldFdlYkluZkxvY2F0aW9uKCkuZ2V0UmVsYXRpdmVMb2NhdGlvbihleHBlY3RlZE5hbWUpKSkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgICAgIGlmIChmb3VuZChnZXRBcHBsaWNhdGlvblJvb3RMb2NhdGlvbigpLmdldFJlbGF0aXZlTG9jYXRpb24oZXhwZWN0ZWROYW1lKSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTm90IGluIHRoZSBsaWJyYXJ5IG9yIGFwcCBzcGVjOyBkb2VzIGl0IG1hdGNoIGEgY29tcG9uZW50Ci0gICAgICAgIC8vIHByb3ZpZGVkIGJ5IHRoZSBGcmFtZXdvcms/Ci0KLSAgICAgICAgSU5hbWVzcGFjZSBmcmFtZXdvcmsgPSBnZXRTcGVjaWZpY2F0aW9uU291cmNlKCkuZ2V0RnJhbWV3b3JrTmFtZXNwYWNlKCk7Ci0KLSAgICAgICAgaWYgKGZyYW1ld29yay5jb250YWluc0NvbXBvbmVudFR5cGUoX3R5cGUpKQotICAgICAgICB7Ci0gICAgICAgICAgICBzZXRTcGVjaWZpY2F0aW9uKGZyYW1ld29yay5nZXRDb21wb25lbnRTcGVjaWZpY2F0aW9uKF90eXBlKSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBJQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBzcGVjaWZpY2F0aW9uID0KLSAgICAgICAgICAgIGdldERlbGVnYXRlKCkuZmluZENvbXBvbmVudFNwZWNpZmljYXRpb24oY3ljbGUsIG5hbWVzcGFjZSwgX3R5cGUpOwotCi0gICAgICAgIHNldFNwZWNpZmljYXRpb24oc3BlY2lmaWNhdGlvbik7Ci0KLSAgICAgICAgLy8gSWYgbm90IGZvdW5kIGJ5IGhlcmUsIGFuIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gZm91bmQoSVJlc291cmNlTG9jYXRpb24gbG9jYXRpb24pCi0gICAgewotICAgICAgICBpZiAoTE9HLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgICAgICBMT0cuZGVidWcoIkNoZWNraW5nOiAiICsgbG9jYXRpb24pOwotCi0gICAgICAgIGlmIChsb2NhdGlvbi5nZXRSZXNvdXJjZVVSTCgpID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgc2V0U3BlY2lmaWNhdGlvbihnZXRTcGVjaWZpY2F0aW9uU291cmNlKCkuZ2V0Q29tcG9uZW50U3BlY2lmaWNhdGlvbihsb2NhdGlvbikpOwotCi0gICAgICAgIGluc3RhbGwoKTsKLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5zdGFsbCgpCi0gICAgewotICAgICAgICBJTmFtZXNwYWNlIG5hbWVzcGFjZSA9IGdldE5hbWVzcGFjZSgpOwotICAgICAgICBJQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBzcGVjaWZpY2F0aW9uID0gZ2V0U3BlY2lmaWNhdGlvbigpOwotCi0gICAgICAgIGlmIChMT0cuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgICAgIExPRy5kZWJ1ZygKLSAgICAgICAgICAgICAgICAiSW5zdGFsbGluZyBjb21wb25lbnQgdHlwZSAiCi0gICAgICAgICAgICAgICAgICAgICsgX3R5cGUKLSAgICAgICAgICAgICAgICAgICAgKyAiIGludG8gIgotICAgICAgICAgICAgICAgICAgICArIG5hbWVzcGFjZQotICAgICAgICAgICAgICAgICAgICArICIgYXMgIgotICAgICAgICAgICAgICAgICAgICArIHNwZWNpZmljYXRpb24pOwotCi0gICAgICAgIG5hbWVzcGFjZS5pbnN0YWxsQ29tcG9uZW50U3BlY2lmaWNhdGlvbihfdHlwZSwgc3BlY2lmaWNhdGlvbik7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvcmVzb2x2ZXIvSVNwZWNpZmljYXRpb25SZXNvbHZlckRlbGVnYXRlLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvcmVzb2x2ZXIvSVNwZWNpZmljYXRpb25SZXNvbHZlckRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjZjE1MjUuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3Jlc29sdmVyL0lTcGVjaWZpY2F0aW9uUmVzb2x2ZXJEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkucmVzb2x2ZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVxdWVzdEN5Y2xlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuc3BlYy5JQ29tcG9uZW50U3BlY2lmaWNhdGlvbjsKLQotLyoqCi0gKiAgRGVsZWdhdGUgaW50ZXJmYWNlIHVzZWQgd2hlbiBhIHBhZ2Ugb3IgY29tcG9uZW50IHNwZWNpZmljYXRpb24KLSAqICBjYW4gbm90IGJlIGZvdW5kIGJ5IHRoZSBub3JtYWwgbWVhbnMuICBUaGlzIGFsbG93cyBob29rcwotICogIHRvIHN1cHBvcnQgc3BlY2lmaWNhdGlvbnMgZnJvbSB1bnVzdWFsIGxvY2F0aW9ucywgb3IgZ2VuZXJhdGVkCi0gKiAgb24gdGhlIGZseS4KLSAqIAotICogIDxwPlRoZSBkZWxlZ2F0ZSBtdXN0IGJlIGNvZGVkIGluIGEgdGhyZWFkc2FmZSBtYW5uZXIuCi0gKiAKLSAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiAgQHZlcnNpb24gJElkJAotICogIEBzaW5jZSAzLjAKLSAqCi0gKiovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSVNwZWNpZmljYXRpb25SZXNvbHZlckRlbGVnYXRlCi17Ci0gICAgLyoqCi0gICAgICogIEludm9rZWQgYnkge0BsaW5rIFBhZ2VTcGVjaWZpY2F0aW9uUmVzb2x2ZXJ9IHRvIGZpbmQgdGhlIGluZGljYXRlZAotICAgICAqICBwYWdlIHNwZWNpZmljYXRpb24uICBSZXR1cm5zCi0gICAgICogIHRoZSBzcGVjaWZpY2F0aW9uLCBvciBudWxsLiAgVGhlIHNwZWNpZmljYXRpb24sIGlmIHJldHVybmVkLCBpcyBub3QgY2FjaGVkIGJ5IFRhcGVzdHJ5Ci0gICAgICogIChpdCBpcyB1cCB0byB0aGUgZGVsZWdhdGUgdG8gY2FjaGUgdGhlIHNwZWNpZmljYXRpb24gaWYgZGVzaXJlZCkuCi0gICAgICogCi0gICAgICogIEBwYXJhbSBjeWNsZSB1c2VkIHRvIGdhaW4gYWNjZXNzIHRvIGZyYW1ld29yayBhbmQgU2VydmxldCBBUEkgb2JqZWN0cwotICAgICAqICBAcGFyYW0gbmFtZXNwYWNlIHRoZSBuYW1lc3BhY2UgY29udGFpbmluZyB0aGUgcGFnZQotICAgICAqICBAcGFyYW0gc2ltcGxlUGFnZU5hbWUgdGhlIG5hbWUgb2YgdGhlIHBhZ2UgKHdpdGhvdXQgYW55IG5hbWVzcGFjZSBwcmVmaXgpCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIElDb21wb25lbnRTcGVjaWZpY2F0aW9uIGZpbmRQYWdlU3BlY2lmaWNhdGlvbigKLSAgICAgICAgSVJlcXVlc3RDeWNsZSBjeWNsZSwKLSAgICAgICAgSU5hbWVzcGFjZSBuYW1lc3BhY2UsCi0gICAgICAgIFN0cmluZyBzaW1wbGVQYWdlTmFtZSk7Ci0KLSAgICAvKioKLSAgICAgKiAgSW52b2tlZCBieSB7QGxpbmsgUGFnZVNwZWNpZmljYXRpb25SZXNvbHZlcn0gdG8gZmluZCB0aGUgaW5kaWNhdGVkCi0gICAgICogIGNvbXBvbmVudCBzcGVjaWZpY2F0aW9uLiAgUmV0dXJucwotICAgICAqICB0aGUgc3BlY2lmaWNhdGlvbiwgb3IgbnVsbC4gIFRoZSBzcGVjaWZpY2F0aW9uLCBpZiByZXR1cm5lZCwgaXMgbm90IGNhY2hlZCBieSBUYXBlc3RyeQotICAgICAqICAoaXQgaXMgdXAgdG8gdGhlIGRlbGVnYXRlIHRvIGNhY2hlIHRoZSBzcGVjaWZpY2F0aW9uIGlmIGRlc2lyZWQpLgotICAgICAqIAotICAgICAqICA8cD5UaGUgZGVsZWdhdGUgbXVzdCBiZSBjb2RlZCBpbiBhIHRocmVhZHNhZmUgbWFubmVyLgotICAgICAqIAotICAgICAqICBAcGFyYW0gY3ljbGUgdXNlZCB0byBnYWluIGFjY2VzcyB0byBmcmFtZXdvcmsgYW5kIFNlcnZsZXQgQVBJIG9iamVjdHMKLSAgICAgKiAgQHBhcmFtIG5hbWVzcGFjZSB0aGUgbmFtZXNwYWNlIGNvbnRhaW5pbmcgdGhlIGNvbXBvbmVudAotICAgICAqICBAcGFyYW0gdHlwZSB0aGUgY29tcG9uZW50IHR5cGUgKHdpdGhvdXQgYW55IG5hbWVzcGFjZSBwcmVmaXgpCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIElDb21wb25lbnRTcGVjaWZpY2F0aW9uIGZpbmRDb21wb25lbnRTcGVjaWZpY2F0aW9uKAotICAgICAgICBJUmVxdWVzdEN5Y2xlIGN5Y2xlLAotICAgICAgICBJTmFtZXNwYWNlIG5hbWVzcGFjZSwKLSAgICAgICAgU3RyaW5nIHR5cGUpOwotfQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3Jlc29sdmVyL051bGxTcGVjaWZpY2F0aW9uUmVzb2x2ZXJEZWxlZ2F0ZS5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3Jlc29sdmVyL051bGxTcGVjaWZpY2F0aW9uUmVzb2x2ZXJEZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDczMWQ2Li4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9yZXNvbHZlci9OdWxsU3BlY2lmaWNhdGlvblJlc29sdmVyRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LnJlc29sdmVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlcXVlc3RDeWNsZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnNwZWMuSUNvbXBvbmVudFNwZWNpZmljYXRpb247Ci0KLS8qKgotICogIFN0YW5kLWluIGNsYXNzIHVzZWQgd2hlbiB0aGUgYXBwbGljYXRpb24gZmFpbHMgdG8gc3BlY2lmeSBhbiBhY3R1YWwgZGVsZWdhdGUuCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQHNpbmNlIDMuMAotICoKLSAqKi8KLQotcHVibGljIGNsYXNzIE51bGxTcGVjaWZpY2F0aW9uUmVzb2x2ZXJEZWxlZ2F0ZSBpbXBsZW1lbnRzIElTcGVjaWZpY2F0aW9uUmVzb2x2ZXJEZWxlZ2F0ZQotewotICAgIHByaXZhdGUgc3RhdGljIE51bGxTcGVjaWZpY2F0aW9uUmVzb2x2ZXJEZWxlZ2F0ZSBfc2hhcmVkOwotCi0gICAgcHVibGljIHN0YXRpYyBOdWxsU3BlY2lmaWNhdGlvblJlc29sdmVyRGVsZWdhdGUgZ2V0U2hhcmVkSW5zdGFuY2UoKQotICAgIHsKLSAgICAgICAgaWYgKF9zaGFyZWQgPT0gbnVsbCkKLSAgICAgICAgICAgIF9zaGFyZWQgPSBuZXcgTnVsbFNwZWNpZmljYXRpb25SZXNvbHZlckRlbGVnYXRlKCk7Ci0KLSAgICAgICAgcmV0dXJuIF9zaGFyZWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgbnVsbC4KLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgSUNvbXBvbmVudFNwZWNpZmljYXRpb24gZmluZFBhZ2VTcGVjaWZpY2F0aW9uKAotICAgICAgICBJUmVxdWVzdEN5Y2xlIGN5Y2xlLAotICAgICAgICBJTmFtZXNwYWNlIG5hbWVzcGFjZSwKLSAgICAgICAgU3RyaW5nIHNpbXBsZVBhZ2VOYW1lKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgbnVsbC4KLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgSUNvbXBvbmVudFNwZWNpZmljYXRpb24gZmluZENvbXBvbmVudFNwZWNpZmljYXRpb24oCi0gICAgICAgIElSZXF1ZXN0Q3ljbGUgY3ljbGUsCi0gICAgICAgIElOYW1lc3BhY2UgbmFtZXNwYWNlLAotICAgICAgICBTdHJpbmcgdHlwZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3Jlc29sdmVyL1BhZ2VTcGVjaWZpY2F0aW9uUmVzb2x2ZXIuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9yZXNvbHZlci9QYWdlU3BlY2lmaWNhdGlvblJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjM2NmYTEuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3Jlc29sdmVyL1BhZ2VTcGVjaWZpY2F0aW9uUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MyArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5yZXNvbHZlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZXF1ZXN0Q3ljbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVzb3VyY2VMb2NhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LlRhcGVzdHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuc3BlYy5Db21wb25lbnRTcGVjaWZpY2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuc3BlYy5JQ29tcG9uZW50U3BlY2lmaWNhdGlvbjsKLQotLyoqCi0gKiAgUGVyZm9ybXMgdGhlIHRyaWNreSB3b3JrIG9mIHJlc29sdmluZyBhIHBhZ2UgbmFtZSB0byBhIHBhZ2Ugc3BlY2lmaWNhdGlvbi4KLSAqICBUaGUgc2VhcmNoIGZvciBwYWdlcyBpbiB0aGUgYXBwbGljYXRpb24gbmFtZXNwYWNlIGlzIHRoZSBtb3N0IGNvbXBsaWNhdGVkLAotICogIHNpbmNlIFRhcGVzdHJ5IHNlYXJjaGVzIGZvciBwYWdlcyB0aGF0IGFyZW4ndCBleHBsaWNpdGx5IGRlZmluZWQgaW4gdGhlCi0gKiAgYXBwbGljYXRpb24gc3BlY2lmaWNhdGlvbi4gIFRoZSBzZWFyY2gsIGJhc2VkIG9uIHRoZSA8aT5zaW1wbGUtbmFtZTwvaT4KLSAqICBvZiB0aGUgcGFnZSwgZ29lcyBhcyBmb2xsb3dzOgotICogCi0gKiAgPHVsPgotICogIDxsaT5BcyBkZWNsYXJlZCBpbiB0aGUgYXBwbGljYXRpb24gc3BlY2lmaWNhdGlvbgotICogIDxsaT48aT5zaW1wbGUtbmFtZTwvaT4ucGFnZSBpbiB0aGUgc2FtZSBmb2xkZXIgYXMgdGhlIGFwcGxpY2F0aW9uIHNwZWNpZmljYXRpb24KLSAqICA8bGk+PGk+c2ltcGxlLW5hbWU8L2k+IHBhZ2UgaW4gdGhlIFdFQi1JTkYvPGk+c2VydmxldC1uYW1lPC9pPiBkaXJlY3Rvcnkgb2YgdGhlIGNvbnRleHQgcm9vdAotICogIDxsaT48aT5zaW1wbGUtbmFtZTwvaT4ucGFnZSBpbiBXRUItSU5GCi0gKiAgPGxpPjxpPnNpbXBsZS1uYW1lPC9pPi5wYWdlIGluIHRoZSBhcHBsaWNhdGlvbiByb290ICh3aXRoaW4gdGhlIGNvbnRleHQgcm9vdCkKLSAqICA8bGk+PGk+c2ltcGxlLW5hbWU8L2k+Lmh0bWwgYXMgYSB0ZW1wbGF0ZSBpbiB0aGUgYXBwbGljYXRpb24gcm9vdCwgCi0gKiAgICAgIGZvciB3aGljaCBhbiBpbXBsaWNpdCBzcGVjaWZpY2F0aW9uIGlzIGdlbmVyYXRlZAotICogIDxsaT5CeSBzZWFyY2hpbmcgdGhlIGZyYW1ld29yayBuYW1lc3BhY2UKLSAqICA8bGk+QnkgaW52b2tpbmcge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkucmVzb2x2ZXIuSVNwZWNpZmljYXRpb25SZXNvbHZlckRlbGVnYXRlI2ZpbmRQYWdlU3BlY2lmaWNhdGlvbihJUmVxdWVzdEN5Y2xlLCBJTmFtZXNwYWNlLCBTdHJpbmcpfQotICogIDwvdWw+Ci0gKiAKLSAqICA8cD5QYWdlcyBpbiBhIGNvbXBvbmVudCBsaWJyYXJ5IGFyZSBzZWFyY2hlZCBmb3IgaW4gYSBtb3JlIGFiYnJldmlhdGVkIGZhc2hpb246Ci0gKiAgPHVsPgotICogIDxsaT5BcyBkZWNsYXJlZCBpbiB0aGUgbGlicmFyeSBzcGVjaWZpY2F0aW9uCi0gKiAgPGxpPjxpPnNpbXBsZS1uYW1lPC9pPi5wYWdlIGluIHRoZSBzYW1lIGZvbGRlciBhcyB0aGUgbGlicmFyeSBzcGVjaWZpY2F0aW9uCi0gKiAgPGxpPkJ5IHNlYXJjaGluZyB0aGUgZnJhbWV3b3JrIG5hbWVzcGFjZQotICogIDxsaT5CeSBpbnZva2luZyB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5yZXNvbHZlci5JU3BlY2lmaWNhdGlvblJlc29sdmVyRGVsZWdhdGUjZmluZFBhZ2VTcGVjaWZpY2F0aW9uKElSZXF1ZXN0Q3ljbGUsIElOYW1lc3BhY2UsIFN0cmluZyl9Ci0gKiAgPC91bD4KLSAqCi0gKiAgQHNlZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmVuZ2luZS5JUGFnZVNvdXJjZQotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQHNpbmNlIDMuMAotICoKLSAqKi8KLQotcHVibGljIGNsYXNzIFBhZ2VTcGVjaWZpY2F0aW9uUmVzb2x2ZXIgZXh0ZW5kcyBBYnN0cmFjdFNwZWNpZmljYXRpb25SZXNvbHZlcgotewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBMT0cgPSBMb2dGYWN0b3J5LmdldExvZyhQYWdlU3BlY2lmaWNhdGlvblJlc29sdmVyLmNsYXNzKTsKLQotICAgIHByaXZhdGUgU3RyaW5nIF9zaW1wbGVOYW1lOwotCi0gICAgcHVibGljIFBhZ2VTcGVjaWZpY2F0aW9uUmVzb2x2ZXIoSVJlcXVlc3RDeWNsZSBjeWNsZSkKLSAgICB7Ci0gICAgICAgIHN1cGVyKGN5Y2xlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgUmVzb2x2ZSB0aGUgbmFtZSAod2hpY2ggbWF5IGhhdmUgYSBsaWJyYXJ5IGlkIHByZWZpeCkgdG8gYSBuYW1lc3BhY2UKLSAgICAgKiAgKHNlZSB7QGxpbmsgI2dldE5hbWVzcGFjZSgpfSkgYW5kIGEgc3BlY2lmaWNhdGlvbiAoc2VlIHtAbGluayAjZ2V0U3BlY2lmaWNhdGlvbigpfSkuCi0gICAgICogCi0gICAgICogIEB0aHJvd3MgQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uIGlmIHRoZSBuYW1lIGNhbm5vdCBiZSByZXNvbHZlZAotICAgICAqIAotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIHJlc29sdmUoSVJlcXVlc3RDeWNsZSBjeWNsZSwgU3RyaW5nIHByZWZpeGVkTmFtZSkKLSAgICB7Ci0gICAgICAgIHJlc2V0KCk7Ci0KLSAgICAgICAgSU5hbWVzcGFjZSBuYW1lc3BhY2UgPSBudWxsOwotCi0gICAgICAgIGludCBjb2xvbnggPSBwcmVmaXhlZE5hbWUuaW5kZXhPZignOicpOwotCi0gICAgICAgIGlmIChjb2xvbnggPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBfc2ltcGxlTmFtZSA9IHByZWZpeGVkTmFtZS5zdWJzdHJpbmcoY29sb254ICsgMSk7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZXNwYWNlSWQgPSBwcmVmaXhlZE5hbWUuc3Vic3RyaW5nKDAsIGNvbG9ueCk7Ci0KLSAgICAgICAgICAgIGlmIChuYW1lc3BhY2VJZC5lcXVhbHMoSU5hbWVzcGFjZS5GUkFNRVdPUktfTkFNRVNQQUNFKSkKLSAgICAgICAgICAgICAgICBuYW1lc3BhY2UgPSBnZXRTcGVjaWZpY2F0aW9uU291cmNlKCkuZ2V0RnJhbWV3b3JrTmFtZXNwYWNlKCk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgbmFtZXNwYWNlID0KLSAgICAgICAgICAgICAgICAgICAgZ2V0U3BlY2lmaWNhdGlvblNvdXJjZSgpLmdldEFwcGxpY2F0aW9uTmFtZXNwYWNlKCkuZ2V0Q2hpbGROYW1lc3BhY2UoCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VJZCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBfc2ltcGxlTmFtZSA9IHByZWZpeGVkTmFtZTsKLQotICAgICAgICAgICAgbmFtZXNwYWNlID0gZ2V0U3BlY2lmaWNhdGlvblNvdXJjZSgpLmdldEFwcGxpY2F0aW9uTmFtZXNwYWNlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBzZXROYW1lc3BhY2UobmFtZXNwYWNlKTsKLQotICAgICAgICBpZiAobmFtZXNwYWNlLmNvbnRhaW5zUGFnZShfc2ltcGxlTmFtZSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNldFNwZWNpZmljYXRpb24obmFtZXNwYWNlLmdldFBhZ2VTcGVjaWZpY2F0aW9uKF9zaW1wbGVOYW1lKSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBOb3QgZGVmaW5lZCBpbiB0aGUgc3BlY2lmaWNhdGlvbiwgc28gaXQncyB0aW1lIHRvIGh1bnQgaXQgZG93bi4KLQotICAgICAgICBzZWFyY2hGb3JQYWdlKGN5Y2xlKTsKLQotICAgICAgICBpZiAoZ2V0U3BlY2lmaWNhdGlvbigpID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIFRhcGVzdHJ5LmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgIk5hbWVzcGFjZS5uby1zdWNoLXBhZ2UiLAotICAgICAgICAgICAgICAgICAgICBfc2ltcGxlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlLmdldE5hbWVzcGFjZUlkKCkpKTsKLQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2ltcGxlUGFnZU5hbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9zaW1wbGVOYW1lOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZWFyY2hGb3JQYWdlKElSZXF1ZXN0Q3ljbGUgY3ljbGUpCi0gICAgewotICAgICAgICBJTmFtZXNwYWNlIG5hbWVzcGFjZSA9IGdldE5hbWVzcGFjZSgpOwotCi0gICAgICAgIGlmIChMT0cuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgICAgIExPRy5kZWJ1ZygiUmVzb2x2aW5nIHVua25vd24gcGFnZSAnIiArIF9zaW1wbGVOYW1lICsgIicgaW4gIiArIG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgU3RyaW5nIGV4cGVjdGVkTmFtZSA9IF9zaW1wbGVOYW1lICsgIi5wYWdlIjsKLQotICAgICAgICBJUmVzb3VyY2VMb2NhdGlvbiBuYW1lc3BhY2VMb2NhdGlvbiA9IG5hbWVzcGFjZS5nZXRTcGVjaWZpY2F0aW9uTG9jYXRpb24oKTsKLQotICAgICAgICAvLyBTZWUgaWYgdGhlcmUncyBhIHNwZWNpZmljYXRpb24gZmlsZSBpbiB0aGUgc2FtZSBmb2xkZXIKLSAgICAgICAgLy8gYXMgdGhlIGxpYnJhcnkgb3IgYXBwbGljYXRpb24gc3BlY2lmaWNhdGlvbiB0aGF0J3MKLSAgICAgICAgLy8gc3VwcG9zZWQgdG8gY29udGFpbiB0aGUgcGFnZS4KLQotICAgICAgICBpZiAoZm91bmQobmFtZXNwYWNlTG9jYXRpb24uZ2V0UmVsYXRpdmVMb2NhdGlvbihleHBlY3RlZE5hbWUpKSkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBpZiAobmFtZXNwYWNlLmlzQXBwbGljYXRpb25OYW1lc3BhY2UoKSkKLSAgICAgICAgewotCi0gICAgICAgICAgICAvLyBUaGUgYXBwbGljYXRpb24gbmFtZXNwYWNlIGdldHMgc29tZSBleHRyYSBzZWFyY2hpbmcuCi0KLSAgICAgICAgICAgIGlmIChmb3VuZChnZXRXZWJJbmZBcHBMb2NhdGlvbigpLmdldFJlbGF0aXZlTG9jYXRpb24oZXhwZWN0ZWROYW1lKSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgICAgICBpZiAoZm91bmQoZ2V0V2ViSW5mTG9jYXRpb24oKS5nZXRSZWxhdGl2ZUxvY2F0aW9uKGV4cGVjdGVkTmFtZSkpKQotICAgICAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAgICAgaWYgKGZvdW5kKGdldEFwcGxpY2F0aW9uUm9vdExvY2F0aW9uKCkuZ2V0UmVsYXRpdmVMb2NhdGlvbihleHBlY3RlZE5hbWUpKSkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgICAgIC8vIFRoZSB3aWVyZCBvbmUgLi4uIHdoZXJlIHdlIHNlZSBpZiB0aGVyZSdzIGEgdGVtcGxhdGUgaW4gdGhlIGFwcGxpY2F0aW9uIHJvb3QgbG9jYXRpb24uCi0KLSAgICAgICAgICAgIFN0cmluZyB0ZW1wbGF0ZU5hbWUgPSBfc2ltcGxlTmFtZSArICIuIiArIGdldFRlbXBsYXRlRXh0ZW5zaW9uKCk7Ci0KLSAgICAgICAgICAgIElSZXNvdXJjZUxvY2F0aW9uIHRlbXBsYXRlTG9jYXRpb24gPQotICAgICAgICAgICAgICAgIGdldEFwcGxpY2F0aW9uUm9vdExvY2F0aW9uKCkuZ2V0UmVsYXRpdmVMb2NhdGlvbih0ZW1wbGF0ZU5hbWUpOwotCi0gICAgICAgICAgICBpZiAodGVtcGxhdGVMb2NhdGlvbi5nZXRSZXNvdXJjZVVSTCgpICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2V0dXBJbXBsaWNpdFBhZ2UodGVtcGxhdGVMb2NhdGlvbik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBOb3QgZm91bmQgaW4gYXBwbGljYXRpb24gbmFtZXNwYWNlLCBzbyBtYXliZSBpdHMgYSBmcmFtZXdvcmsgcGFnZS4KLQotICAgICAgICAgICAgSU5hbWVzcGFjZSBmcmFtZXdvcmsgPSBnZXRTcGVjaWZpY2F0aW9uU291cmNlKCkuZ2V0RnJhbWV3b3JrTmFtZXNwYWNlKCk7Ci0KLSAgICAgICAgICAgIGlmIChmcmFtZXdvcmsuY29udGFpbnNQYWdlKF9zaW1wbGVOYW1lKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoTE9HLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgICAgIExPRy5kZWJ1ZygiRm91bmQgIiArIF9zaW1wbGVOYW1lICsgIiBpbiBmcmFtZXdvcmsgbmFtZXNwYWNlLiIpOwotCi0gICAgICAgICAgICAgICAgc2V0TmFtZXNwYWNlKGZyYW1ld29yayk7Ci0KLSAgICAgICAgICAgICAgICAvLyBOb3RlOiAgVGhpcyBpbXBsaWVzIHRoYXQgbm9ybWFsIGxvb2t1cCBydWxlcyBkb24ndCB3b3JrCi0gICAgICAgICAgICAgICAgLy8gZm9yIHRoZSBmcmFtZXdvcmshICBGcmFtZXdvcmsgcGFnZXMgbXVzdCBiZQotICAgICAgICAgICAgICAgIC8vIGRlZmluZWQgaW4gdGhlIGZyYW1ld29yayBsaWJyYXJ5IHNwZWNpZmljYXRpb24uCi0KLSAgICAgICAgICAgICAgICBzZXRTcGVjaWZpY2F0aW9uKGZyYW1ld29yay5nZXRQYWdlU3BlY2lmaWNhdGlvbihfc2ltcGxlTmFtZSkpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIE5vdCBmb3VuZCBieSBhbnkgbm9ybWFsIHJ1bGUsIHNvIGl0cyB0aW1lIHRvCi0gICAgICAgIC8vIGNvbnN1bHQgdGhlIGRlbGVnYXRlLgotCi0gICAgICAgIElDb21wb25lbnRTcGVjaWZpY2F0aW9uIHNwZWNpZmljYXRpb24gPQotICAgICAgICAgICAgZ2V0RGVsZWdhdGUoKS5maW5kUGFnZVNwZWNpZmljYXRpb24oY3ljbGUsIG5hbWVzcGFjZSwgX3NpbXBsZU5hbWUpOwotICAgICAgICAgICAgCi0gICAgICAgIHNldFNwZWNpZmljYXRpb24oc3BlY2lmaWNhdGlvbik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNldHVwSW1wbGljaXRQYWdlKElSZXNvdXJjZUxvY2F0aW9uIGxvY2F0aW9uKQotICAgIHsKLSAgICAgICAgaWYgKExPRy5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICAgICAgTE9HLmRlYnVnKCJGb3VuZCBIVE1MIHRlbXBsYXRlIGF0ICIgKyBsb2NhdGlvbik7Ci0JCS8vIFRPRE8gVGhlIFNwZWNGYWN0b3J5IGluIFNwZWNpZmljYXRpb24gcGFyc2VyIHNob3VsZCBiZSB1c2VkIGluIHNvbWUgd2F5IHRvIGNyZWF0ZSBhbiBJQ29tcG9uZW50U3BlY2lmY2lhdGlvbiEKLSAgICAgICAgSUNvbXBvbmVudFNwZWNpZmljYXRpb24gc3BlY2lmaWNhdGlvbiA9IG5ldyBDb21wb25lbnRTcGVjaWZpY2F0aW9uKCk7Ci0gICAgICAgIHNwZWNpZmljYXRpb24uc2V0UGFnZVNwZWNpZmljYXRpb24odHJ1ZSk7Ci0gICAgICAgIHNwZWNpZmljYXRpb24uc2V0U3BlY2lmaWNhdGlvbkxvY2F0aW9uKGxvY2F0aW9uKTsKLQotICAgICAgICBzZXRTcGVjaWZpY2F0aW9uKHNwZWNpZmljYXRpb24pOwotCi0gICAgICAgIGluc3RhbGwoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gZm91bmQoSVJlc291cmNlTG9jYXRpb24gbG9jYXRpb24pCi0gICAgewotICAgICAgICBpZiAoTE9HLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgICAgICBMT0cuZGVidWcoIkNoZWNraW5nOiAiICsgbG9jYXRpb24pOwotCi0gICAgICAgIGlmIChsb2NhdGlvbi5nZXRSZXNvdXJjZVVSTCgpID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgc2V0U3BlY2lmaWNhdGlvbihnZXRTcGVjaWZpY2F0aW9uU291cmNlKCkuZ2V0UGFnZVNwZWNpZmljYXRpb24obG9jYXRpb24pKTsKLQotICAgICAgICBpbnN0YWxsKCk7Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluc3RhbGwoKQotICAgIHsKLSAgICAgICAgSU5hbWVzcGFjZSBuYW1lc3BhY2UgPSBnZXROYW1lc3BhY2UoKTsKLSAgICAgICAgSUNvbXBvbmVudFNwZWNpZmljYXRpb24gc3BlY2lmaWNhdGlvbiA9IGdldFNwZWNpZmljYXRpb24oKTsKLQotICAgICAgICBpZiAoTE9HLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgICAgICBMT0cuZGVidWcoCi0gICAgICAgICAgICAgICAgIkluc3RhbGxpbmcgcGFnZSAiICsgX3NpbXBsZU5hbWUgKyAiIGludG8gIiArIG5hbWVzcGFjZSArICIgYXMgIiArIHNwZWNpZmljYXRpb24pOwotCi0gICAgICAgIG5hbWVzcGFjZS5pbnN0YWxsUGFnZVNwZWNpZmljYXRpb24oX3NpbXBsZU5hbWUsIHNwZWNpZmljYXRpb24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBJZiB0aGUgbmFtZXNwYWNlIGRlZmluZXMgdGhlIHRlbXBsYXRlIGV4dGVuc2lvbiAoYXMgcHJvcGVydHkKLSAgICAgKiAge0BsaW5rIFRhcGVzdHJ5I1RFTVBMQVRFX0VYVEVOU0lPTl9QUk9QRVJUWX0sIHRoZW4gdGhhdCBpcyB1c2VkLCBvdGhlcndpc2UKLSAgICAgKiAgdGhlIGRlZmF1bHQgaXMgdXNlZC4KLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRUZW1wbGF0ZUV4dGVuc2lvbigpCi0gICAgewotICAgICAgICBTdHJpbmcgZXh0ZW5zaW9uID0KLSAgICAgICAgICAgIGdldE5hbWVzcGFjZSgpLmdldFNwZWNpZmljYXRpb24oKS5nZXRQcm9wZXJ0eShUYXBlc3RyeS5URU1QTEFURV9FWFRFTlNJT05fUFJPUEVSVFkpOwotCi0gICAgICAgIGlmIChleHRlbnNpb24gPT0gbnVsbCkKLSAgICAgICAgICAgIGV4dGVuc2lvbiA9IFRhcGVzdHJ5LkRFRkFVTFRfVEVNUExBVEVfRVhURU5TSU9OOwotCi0gICAgICAgIHJldHVybiBleHRlbnNpb247Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIHJlc2V0KCkKLSAgICB7Ci0gICAgCV9zaW1wbGVOYW1lID0gbnVsbDsKLSAgICAJCi0gICAgICAgIHN1cGVyLnJlc2V0KCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvcmVzb3VyY2UvQWJzdHJhY3RSZXNvdXJjZUxvY2F0aW9uLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvcmVzb3VyY2UvQWJzdHJhY3RSZXNvdXJjZUxvY2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhZmY4ZDUuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3Jlc291cmNlL0Fic3RyYWN0UmVzb3VyY2VMb2NhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LnJlc291cmNlOwotCi1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlc291cmNlTG9jYXRpb247Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFJlc291cmNlTG9jYXRpb24gaW1wbGVtZW50cyBJUmVzb3VyY2VMb2NhdGlvbgotewotICAgIHByaXZhdGUgU3RyaW5nIF9wYXRoOwotICAgIHByaXZhdGUgU3RyaW5nIF9uYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIF9mb2xkZXJQYXRoOwotICAgIHByaXZhdGUgTG9jYWxlIF9sb2NhbGU7Ci0KLSAgICBwcm90ZWN0ZWQgQWJzdHJhY3RSZXNvdXJjZUxvY2F0aW9uKFN0cmluZyBwYXRoKQotICAgIHsKLSAgICAgICAgdGhpcyhwYXRoLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgQWJzdHJhY3RSZXNvdXJjZUxvY2F0aW9uKFN0cmluZyBwYXRoLCBMb2NhbGUgbG9jYWxlKQotICAgIHsKLSAgICAgICAgX3BhdGggPSBwYXRoOwotICAgICAgICBfbG9jYWxlID0gbG9jYWxlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0gICAgewotICAgICAgICBpZiAoX25hbWUgPT0gbnVsbCkKLSAgICAgICAgICAgIHNwbGl0KCk7Ci0KLSAgICAgICAgcmV0dXJuIF9uYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBJUmVzb3VyY2VMb2NhdGlvbiBnZXRSZWxhdGl2ZUxvY2F0aW9uKFN0cmluZyBuYW1lKQotICAgIHsKLSAgICAgICAgaWYgKG5hbWUuc3RhcnRzV2l0aCgiLyIpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAobmFtZS5lcXVhbHMoX3BhdGgpKQotICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwotCi0gICAgICAgICAgICByZXR1cm4gYnVpbGROZXdSZXNvdXJjZUxvY2F0aW9uKG5hbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKF9mb2xkZXJQYXRoID09IG51bGwpCi0gICAgICAgICAgICBzcGxpdCgpOwotCi0gICAgICAgIGlmIChuYW1lLmVxdWFscyhfbmFtZSkpCi0gICAgICAgICAgICByZXR1cm4gdGhpczsKLQotICAgICAgICByZXR1cm4gYnVpbGROZXdSZXNvdXJjZUxvY2F0aW9uKF9mb2xkZXJQYXRoICsgbmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXRoKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfcGF0aDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTG9jYWxlIGdldExvY2FsZSgpCi0gICAgewotICAgICAgICByZXR1cm4gX2xvY2FsZTsKLSAgICB9Ci0KLQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBJUmVzb3VyY2VMb2NhdGlvbiBidWlsZE5ld1Jlc291cmNlTG9jYXRpb24oU3RyaW5nIHBhdGgpOwotCi0gICAgcHJpdmF0ZSB2b2lkIHNwbGl0KCkKLSAgICB7Ci0gICAgICAgIGludCBsYXN0U2xhc2h4ID0gX3BhdGgubGFzdEluZGV4T2YoJy8nKTsKLQotICAgICAgICBfZm9sZGVyUGF0aCA9IF9wYXRoLnN1YnN0cmluZygwLCBsYXN0U2xhc2h4ICsgMSk7Ci0gICAgICAgIF9uYW1lID0gX3BhdGguc3Vic3RyaW5nKGxhc3RTbGFzaHggKyAxKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIHRydWUgaWYgdGhlIG90aGVyIG9iamVjdCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUKLSAgICAgKiAgc2FtZSBjbGFzcywgYW5kIHRoZSBwYXRocyBhcmUgZXF1YWwuCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopCi0gICAgewotICAgICAgICBpZiAob2JqID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgaWYgKG9iai5nZXRDbGFzcygpLmVxdWFscyhnZXRDbGFzcygpKSkKLSAgICAgICAgewotICAgICAgICAgICAgQWJzdHJhY3RSZXNvdXJjZUxvY2F0aW9uIG90aGVyTG9jYXRpb24gPSAoQWJzdHJhY3RSZXNvdXJjZUxvY2F0aW9uKSBvYmo7Ci0KLSAgICAgICAgICAgIHJldHVybiBfcGF0aC5lcXVhbHMob3RoZXJMb2NhdGlvbi5fcGF0aCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3Jlc291cmNlL0NsYXNzcGF0aFJlc291cmNlTG9jYXRpb24uamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9yZXNvdXJjZS9DbGFzc3BhdGhSZXNvdXJjZUxvY2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1ODZkYzEuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3Jlc291cmNlL0NsYXNzcGF0aFJlc291cmNlTG9jYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5yZXNvdXJjZTsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuYnVpbGRlci5IYXNoQ29kZUJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVzb3VyY2VMb2NhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZXNvdXJjZVJlc29sdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkudXRpbC5Mb2NhbGl6ZWRSZXNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnV0aWwuTG9jYWxpemVkUmVzb3VyY2VGaW5kZXI7Ci0KLS8qKgotICogIEltcGxlbWVudGF0aW9uIG9mIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZXNvdXJjZUxvY2F0aW9ufQotICogIGZvciByZXNvdXJjZXMgZm91bmQgd2l0aGluIHRoZSBjbGFzc3BhdGguCi0gKiAKLSAqCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogIEB2ZXJzaW9uICRJZCQKLSAqICBAc2luY2UgMy4wCi0gKgotICoqLwotCi1wdWJsaWMgY2xhc3MgQ2xhc3NwYXRoUmVzb3VyY2VMb2NhdGlvbiBleHRlbmRzIEFic3RyYWN0UmVzb3VyY2VMb2NhdGlvbgotewotICAgIHByaXZhdGUgSVJlc291cmNlUmVzb2x2ZXIgX3Jlc29sdmVyOwotCi0gICAgcHVibGljIENsYXNzcGF0aFJlc291cmNlTG9jYXRpb24oSVJlc291cmNlUmVzb2x2ZXIgcmVzb2x2ZXIsIFN0cmluZyBwYXRoKQotICAgIHsKLSAgICAgICAgdGhpcyhyZXNvbHZlciwgcGF0aCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIENsYXNzcGF0aFJlc291cmNlTG9jYXRpb24oSVJlc291cmNlUmVzb2x2ZXIgcmVzb2x2ZXIsIFN0cmluZyBwYXRoLCBMb2NhbGUgbG9jYWxlKQotICAgIHsKLSAgICAgICAgc3VwZXIocGF0aCwgbG9jYWxlKTsKLQotICAgICAgICBfcmVzb2x2ZXIgPSByZXNvbHZlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgTG9jYXRlcyB0aGUgbG9jYWxpemF0aW9uIG9mIHRoZQotICAgICAqICByZXNvdXJjZSB1c2luZyB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS51dGlsLkxvY2FsaXplZFJlc291cmNlRmluZGVyfQotICAgICAqIAotICAgICAqKi8KLQotICAgIHB1YmxpYyBJUmVzb3VyY2VMb2NhdGlvbiBnZXRMb2NhbGl6YXRpb24oTG9jYWxlIGxvY2FsZSkKLSAgICB7Ci0gICAgICAgIFN0cmluZyBwYXRoID0gZ2V0UGF0aCgpOwotICAgICAgICBMb2NhbGl6ZWRSZXNvdXJjZUZpbmRlciBmaW5kZXIgPSBuZXcgTG9jYWxpemVkUmVzb3VyY2VGaW5kZXIoX3Jlc29sdmVyKTsKLQotICAgICAgICBMb2NhbGl6ZWRSZXNvdXJjZSBsb2NhbGl6ZWRSZXNvdXJjZSA9IGZpbmRlci5yZXNvbHZlKHBhdGgsIGxvY2FsZSk7Ci0KLSAgICAgICAgaWYgKGxvY2FsaXplZFJlc291cmNlID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICBTdHJpbmcgbG9jYWxpemVkUGF0aCA9IGxvY2FsaXplZFJlc291cmNlLmdldFJlc291cmNlUGF0aCgpOwotICAgICAgICBMb2NhbGUgcGF0aExvY2FsZSA9IGxvY2FsaXplZFJlc291cmNlLmdldFJlc291cmNlTG9jYWxlKCk7Ci0KLSAgICAgICAgaWYgKGxvY2FsaXplZFBhdGggPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIGlmIChwYXRoLmVxdWFscyhsb2NhbGl6ZWRQYXRoKSkKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotCi0gICAgICAgIHJldHVybiBuZXcgQ2xhc3NwYXRoUmVzb3VyY2VMb2NhdGlvbihfcmVzb2x2ZXIsIGxvY2FsaXplZFBhdGgsIHBhdGhMb2NhbGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBJbnZva2VzIHtAbGluayBJUmVzb3VyY2VSZXNvbHZlciNnZXRSZXNvdXJjZShTdHJpbmcpfQotICAgICAqIAotICAgICAqKi8KLQotICAgIHB1YmxpYyBVUkwgZ2V0UmVzb3VyY2VVUkwoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9yZXNvbHZlci5nZXRSZXNvdXJjZShnZXRQYXRoKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICJjbGFzc3BhdGg6IiArIGdldFBhdGgoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkKLSAgICB7Ci0gICAgICAgIEhhc2hDb2RlQnVpbGRlciBidWlsZGVyID0gbmV3IEhhc2hDb2RlQnVpbGRlcig0NzgzLCAyMyk7Ci0KLSAgICAgICAgYnVpbGRlci5hcHBlbmQoZ2V0UGF0aCgpKTsKLQotICAgICAgICByZXR1cm4gYnVpbGRlci50b0hhc2hDb2RlKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIElSZXNvdXJjZUxvY2F0aW9uIGJ1aWxkTmV3UmVzb3VyY2VMb2NhdGlvbihTdHJpbmcgcGF0aCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgQ2xhc3NwYXRoUmVzb3VyY2VMb2NhdGlvbihfcmVzb2x2ZXIsIHBhdGgpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3Jlc291cmNlL0NvbnRleHRSZXNvdXJjZUxvY2F0aW9uLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvcmVzb3VyY2UvQ29udGV4dFJlc291cmNlTG9jYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRmYmIzMS4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvcmVzb3VyY2UvQ29udGV4dFJlc291cmNlTG9jYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5yZXNvdXJjZTsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5idWlsZGVyLkhhc2hDb2RlQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZXNvdXJjZUxvY2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuVGFwZXN0cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS51dGlsLkxvY2FsaXplZENvbnRleHRSZXNvdXJjZUZpbmRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnV0aWwuTG9jYWxpemVkUmVzb3VyY2U7Ci0KLS8qKgotICogIEltcGxlbWVudGF0aW9uIG9mIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZXNvdXJjZUxvY2F0aW9ufQotICogIGZvciByZXNvdXJjZXMgZm91bmQgd2l0aGluIHRoZSB3ZWIgYXBwbGljYXRpb24gY29udGV4dC4KLSAqIAotICoKLSAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiAgQHZlcnNpb24gJElkJAotICogIEBzaW5jZSAzLjAKLSAqCi0gKiovCi0KLXB1YmxpYyBjbGFzcyBDb250ZXh0UmVzb3VyY2VMb2NhdGlvbiBleHRlbmRzIEFic3RyYWN0UmVzb3VyY2VMb2NhdGlvbgotewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBMT0cgPSBMb2dGYWN0b3J5LmdldExvZyhDb250ZXh0UmVzb3VyY2VMb2NhdGlvbi5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIFNlcnZsZXRDb250ZXh0IF9jb250ZXh0OwotCi0gICAgcHVibGljIENvbnRleHRSZXNvdXJjZUxvY2F0aW9uKFNlcnZsZXRDb250ZXh0IGNvbnRleHQsIFN0cmluZyBwYXRoKQotICAgIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCBwYXRoLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29udGV4dFJlc291cmNlTG9jYXRpb24oU2VydmxldENvbnRleHQgY29udGV4dCwgU3RyaW5nIHBhdGgsIExvY2FsZSBsb2NhbGUpCi0gICAgewotICAgICAgICBzdXBlcihwYXRoLCBsb2NhbGUpOwotCi0gICAgICAgIF9jb250ZXh0ID0gY29udGV4dDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgTG9jYXRlcyB0aGUgcmVzb3VyY2UgdXNpbmcge0BsaW5rIExvY2FsaXplZENvbnRleHRSZXNvdXJjZUZpbmRlcn0KLSAgICAgKiAgYW5kIHtAbGluayBTZXJ2bGV0Q29udGV4dCNnZXRSZXNvdXJjZShqYXZhLmxhbmcuU3RyaW5nKX0uCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIElSZXNvdXJjZUxvY2F0aW9uIGdldExvY2FsaXphdGlvbihMb2NhbGUgbG9jYWxlKQotICAgIHsKLSAgICAgICAgTG9jYWxpemVkQ29udGV4dFJlc291cmNlRmluZGVyIGZpbmRlciA9IG5ldyBMb2NhbGl6ZWRDb250ZXh0UmVzb3VyY2VGaW5kZXIoX2NvbnRleHQpOwotCi0gICAgICAgIFN0cmluZyBwYXRoID0gZ2V0UGF0aCgpOwotICAgICAgICBMb2NhbGl6ZWRSZXNvdXJjZSBsb2NhbGl6ZWRSZXNvdXJjZSA9IGZpbmRlci5yZXNvbHZlKHBhdGgsIGxvY2FsZSk7Ci0KLSAgICAgICAgaWYgKGxvY2FsaXplZFJlc291cmNlID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICBTdHJpbmcgbG9jYWxpemVkUGF0aCA9IGxvY2FsaXplZFJlc291cmNlLmdldFJlc291cmNlUGF0aCgpOwotICAgICAgICBMb2NhbGUgcGF0aExvY2FsZSA9IGxvY2FsaXplZFJlc291cmNlLmdldFJlc291cmNlTG9jYWxlKCk7Ci0KLSAgICAgICAgaWYgKGxvY2FsaXplZFBhdGggPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIGlmIChwYXRoLmVxdWFscyhsb2NhbGl6ZWRQYXRoKSkKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotCi0gICAgICAgIHJldHVybiBuZXcgQ29udGV4dFJlc291cmNlTG9jYXRpb24oX2NvbnRleHQsIGxvY2FsaXplZFBhdGgsIHBhdGhMb2NhbGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBVUkwgZ2V0UmVzb3VyY2VVUkwoKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5nZXRSZXNvdXJjZShnZXRQYXRoKCkpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZXgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIExPRy53YXJuKAotICAgICAgICAgICAgICAgIFRhcGVzdHJ5LmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgIkNvbnRleHRSZXNvdXJjZUxvY2F0aW9uLnVuYWJsZS10by1yZWZlcmVuY2UtY29udGV4dC1wYXRoIiwKLSAgICAgICAgICAgICAgICAgICAgZ2V0UGF0aCgpKSwKLSAgICAgICAgICAgICAgICBleCk7Ci0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gICAgewotICAgICAgICByZXR1cm4gImNvbnRleHQ6IiArIGdldFBhdGgoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkKLSAgICB7Ci0gICAgICAgIEhhc2hDb2RlQnVpbGRlciBidWlsZGVyID0gbmV3IEhhc2hDb2RlQnVpbGRlcigzMjY1LCAxNDMpOwotCi0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKGdldFBhdGgoKSk7Ci0KLSAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9IYXNoQ29kZSgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBJUmVzb3VyY2VMb2NhdGlvbiBidWlsZE5ld1Jlc291cmNlTG9jYXRpb24oU3RyaW5nIHBhdGgpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IENvbnRleHRSZXNvdXJjZUxvY2F0aW9uKF9jb250ZXh0LCBwYXRoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9zY3JpcHQvQWJzdHJhY3RUb2tlbi5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3NjcmlwdC9BYnN0cmFjdFRva2VuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3ZTU1NzAuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3NjcmlwdC9BYnN0cmFjdFRva2VuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5zY3JpcHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUxvY2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlc291cmNlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS51dGlsLnByb3AuT2dubFV0aWxzOwotCi0vKioKLSAqICBCYXNlIGNsYXNzIGZvciBjcmVhdGluZyB0b2tlbnMgd2hpY2ggbWF5IGNvbnRhaW4gb3RoZXIgdG9rZW5zLgotICoKLSAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiAgQHZlcnNpb24gJElkJAotICogIEBzaW5jZSAwLjIuOQotICogCi0gKiovCi0KLWFic3RyYWN0IGNsYXNzIEFic3RyYWN0VG9rZW4gaW1wbGVtZW50cyBJU2NyaXB0VG9rZW4KLXsKLSAgICBwcml2YXRlIExpc3QgX3Rva2VuczsKLSAgICBwcml2YXRlIElMb2NhdGlvbiBfbG9jYXRpb247Ci0gICAgcHJpdmF0ZSBJUmVzb3VyY2VSZXNvbHZlciBfcmVzb2x2ZXI7Ci0KLSAgICBwcm90ZWN0ZWQgQWJzdHJhY3RUb2tlbihJTG9jYXRpb24gbG9jYXRpb24pCi0gICAgewotICAgICAgICBfbG9jYXRpb24gPSBsb2NhdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSUxvY2F0aW9uIGdldExvY2F0aW9uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfbG9jYXRpb247Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkVG9rZW4oSVNjcmlwdFRva2VuIHRva2VuKQotICAgIHsKLSAgICAgICAgaWYgKF90b2tlbnMgPT0gbnVsbCkKLSAgICAgICAgICAgIF90b2tlbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgX3Rva2Vucy5hZGQodG9rZW4pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBJbnZva2VzIHtAbGluayBJU2NyaXB0VG9rZW4jd3JpdGUoU3RyaW5nQnVmZmVyLFNjcmlwdFNlc3Npb24pfQotICAgICAqICBvbiBlYWNoIGNoaWxkIHRva2VuIChpZiB0aGVyZSBhcmUgYW55KS4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHByb3RlY3RlZCB2b2lkIHdyaXRlQ2hpbGRyZW4oU3RyaW5nQnVmZmVyIGJ1ZmZlciwgU2NyaXB0U2Vzc2lvbiBzZXNzaW9uKQotICAgIHsKLSAgICAgICAgaWYgKF90b2tlbnMgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBJdGVyYXRvciBpID0gX3Rva2Vucy5pdGVyYXRvcigpOwotCi0gICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgSVNjcmlwdFRva2VuIHRva2VuID0gKElTY3JpcHRUb2tlbikgaS5uZXh0KCk7Ci0KLSAgICAgICAgICAgIHRva2VuLndyaXRlKGJ1ZmZlciwgc2Vzc2lvbik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFdmFsdWF0ZXMgdGhlIGV4cHJlc3Npb24gYWdhaW5zdCB0aGUgc2Vzc2lvbidzIHN5bWJvbHMsIHVzaW5nCi0gICAgICoge0BsaW5rIE9nbmxVdGlscyNnZXQoU3RyaW5nLCBDbGFzc1Jlc29sdmVyLCBPYmplY3QpfSBhbmQKLSAgICAgKiByZXR1cm5zIHRoZSByZXN1bHQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIE9iamVjdCBldmFsdWF0ZShTdHJpbmcgZXhwcmVzc2lvbiwgU2NyaXB0U2Vzc2lvbiBzZXNzaW9uKQotICAgIHsKLSAgICAgICAgaWYgKF9yZXNvbHZlciA9PSBudWxsKQotICAgICAgICAgICAgX3Jlc29sdmVyID0gc2Vzc2lvbi5nZXRSZXF1ZXN0Q3ljbGUoKS5nZXRFbmdpbmUoKS5nZXRSZXNvdXJjZVJlc29sdmVyKCk7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBPZ25sVXRpbHMuZ2V0KGV4cHJlc3Npb24sIF9yZXNvbHZlciwgc2Vzc2lvbi5nZXRTeW1ib2xzKCkpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24oZXguZ2V0TWVzc2FnZSgpLCBfbG9jYXRpb24sIGV4KTsKLSAgICAgICAgfQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvc2NyaXB0L0Fic3RyYWN0VG9rZW5SdWxlLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvc2NyaXB0L0Fic3RyYWN0VG9rZW5SdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlZDYxMzkuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3NjcmlwdC9BYnN0cmFjdFRva2VuUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkyICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LnNjcmlwdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUxvY2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkudXRpbC54bWwuQmFzZVJ1bGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS51dGlsLnhtbC5SdWxlRGlyZWN0ZWRQYXJzZXI7Ci0KLS8qKgotICogQmFzZSBjbGFzcyBmb3IgdGhlIHJ1bGVzIHRoYXQgYnVpbGQge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkuc2NyaXB0LklTY3JpcHRUb2tlbn1zLgotICogVXNlZCB3aXRoIGNsYXNzZXMgdGhhdCBjYW4gY29udGFpbiBhIG1peCBvZiB0ZXh0IGFuZCBlbGVtZW50cyAodGhvc2UgdGhhdAotICogYWNjZXB0ICJmdWxsIGNvbnRlbnQiKS4KLSAqIAotICoKLSAqIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqIEB2ZXJzaW9uICRJZCQKLSAqIEBzaW5jZSAzLjAKLSAqKi8KLQotYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RUb2tlblJ1bGUgZXh0ZW5kcyBCYXNlUnVsZQotewotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIHRva2VuIHRvIGl0cyBwYXJlbnQsIHRoZSB0b3Agb2JqZWN0IG9uIHRoZSBzdGFjay4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRUb1BhcmVudChSdWxlRGlyZWN0ZWRQYXJzZXIgcGFyc2VyLCBJU2NyaXB0VG9rZW4gdG9rZW4pCi0gICAgewotICAgICAgICBJU2NyaXB0VG9rZW4gcGFyZW50ID0gKElTY3JpcHRUb2tlbikgcGFyc2VyLnBlZWsoKTsKLQotICAgICAgICBwYXJlbnQuYWRkVG9rZW4odG9rZW4pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBlZWtzIGF0IHRoZSB0b3Agb2JqZWN0IG9uIHRoZSBzdGFjayAod2hpY2ggbXVzdCBiZSBhIHtAbGluayBJU2NyaXB0VG9rZW59KSwKLSAgICAgKiBhbmQgY29udmVydHMgdGhlIHRleHQgaW50byBhIHNlcmllcyBvZiB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5zY3JpcHQuU3RhdGljVG9rZW59IGFuZAotICAgICAqIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LnNjcmlwdC5JbnNlcnRUb2tlbn1zLgotICAgICAqLwotCi0gICAgcHVibGljIHZvaWQgY29udGVudChSdWxlRGlyZWN0ZWRQYXJzZXIgcGFyc2VyLCBTdHJpbmcgY29udGVudCkKLSAgICB7Ci0gICAgICAgIElTY3JpcHRUb2tlbiB0b2tlbiA9IChJU2NyaXB0VG9rZW4pIHBhcnNlci5wZWVrKCk7Ci0KLSAgICAgICAgYWRkVGV4dFRva2Vucyh0b2tlbiwgY29udGVudCwgcGFyc2VyLmdldExvY2F0aW9uKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9TVEFSVCA9IDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0RPTExBUiA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0NPTExFQ1RfRVhQUkVTU0lPTiA9IDI7Ci0KLSAgICAvKioKLSAgICAgKiBQYXJzZXMgdGhlIHByb3ZpZGVkIHRleHQgYW5kIGNvbnZlcnRzIGl0IGludG8gYSBzZXJpZXMgb2YgCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkVGV4dFRva2VucyhJU2NyaXB0VG9rZW4gdG9rZW4sIFN0cmluZyB0ZXh0LCBJTG9jYXRpb24gbG9jYXRpb24pCi0gICAgewotICAgICAgICBjaGFyW10gYnVmZmVyID0gdGV4dC50b0NoYXJBcnJheSgpOwotICAgICAgICBpbnQgc3RhdGUgPSBTVEFURV9TVEFSVDsKLSAgICAgICAgaW50IGJsb2NrU3RhcnQgPSAwOwotICAgICAgICBpbnQgYmxvY2tMZW5ndGggPSAwOwotICAgICAgICBpbnQgZXhwcmVzc2lvblN0YXJ0ID0gLTE7Ci0gICAgICAgIGludCBleHByZXNzaW9uTGVuZ3RoID0gMDsKLSAgICAgICAgaW50IGkgPSAwOwotICAgICAgICBpbnQgYnJhY2VEZXB0aCA9IDA7Ci0KLSAgICAgICAgd2hpbGUgKGkgPCBidWZmZXIubGVuZ3RoKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGFyIGNoID0gYnVmZmVyW2ldOwotCi0gICAgICAgICAgICBzd2l0Y2ggKHN0YXRlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgU1RBVEVfU1RBUlQgOgotCi0gICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnJCcpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gU1RBVEVfRE9MTEFSOwotICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBibG9ja0xlbmd0aCsrOwotICAgICAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICAgICAgY2FzZSBTVEFURV9ET0xMQVIgOgotCi0gICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSAneycpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gU1RBVEVfQ09MTEVDVF9FWFBSRVNTSU9OOwotICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uU3RhcnQgPSBpOwotICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbkxlbmd0aCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmFjZURlcHRoID0gMTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvLyBUaGUgJyQnIHdhcyBqdXN0IHdoYXQgaXQgd2FzLCBub3QgdGhlIHN0YXJ0IG9mIGEgJHt9IGV4cHJlc3Npb24KLSAgICAgICAgICAgICAgICAgICAgLy8gYmxvY2ssIHNvIGluY2x1ZGUgaXQgYXMgcGFydCBvZiB0aGUgc3RhdGljIHRleHQgYmxvY2suCi0KLSAgICAgICAgICAgICAgICAgICAgYmxvY2tMZW5ndGgrKzsKLQotICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IFNUQVRFX1NUQVJUOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgICAgICAgIGNhc2UgU1RBVEVfQ09MTEVDVF9FWFBSRVNTSU9OIDoKLQotICAgICAgICAgICAgICAgICAgICBpZiAoY2ggIT0gJ30nKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJ3snKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyYWNlRGVwdGgrKzsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbkxlbmd0aCsrOwotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBicmFjZURlcHRoLS07Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGJyYWNlRGVwdGggPiAwKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uTGVuZ3RoKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8vIEhpdCB0aGUgY2xvc2luZyBicmFjZSBvZiBhbiBleHByZXNzaW9uLgotCi0gICAgICAgICAgICAgICAgICAgIC8vIERlZ2VuZXJhdGUgY2FzZTogIHRoZSBzdHJpbmcgIiR7fSIuCi0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGV4cHJlc3Npb25MZW5ndGggPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrTGVuZ3RoICs9IDM7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGJsb2NrTGVuZ3RoID4gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuLmFkZFRva2VuKGNvbnN0cnVjdFN0YXRpYyh0ZXh0LCBibG9ja1N0YXJ0LCBibG9ja0xlbmd0aCwgbG9jYXRpb24pKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoZXhwcmVzc2lvbkxlbmd0aCA+IDApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBleHByZXNzaW9uID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0LnN1YnN0cmluZyhleHByZXNzaW9uU3RhcnQsIGV4cHJlc3Npb25TdGFydCArIGV4cHJlc3Npb25MZW5ndGgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICB0b2tlbi5hZGRUb2tlbihuZXcgSW5zZXJ0VG9rZW4oZXhwcmVzc2lvbiwgbG9jYXRpb24pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICAgICAgYmxvY2tTdGFydCA9IGk7Ci0gICAgICAgICAgICAgICAgICAgIGJsb2NrTGVuZ3RoID0gMDsKLQotICAgICAgICAgICAgICAgICAgICAvLyBBbmQgZHJvcCBpbnRvIHN0YXRlIHN0YXJ0Ci0KLSAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBTVEFURV9TVEFSVDsKLQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gT0ssIHRvIGhhbmRsZSB0aGUgZW5kLiAgQ291cGxlIG9mIGRlZ2VuZXJhdGUgY2FzZXMgd2hlcmUKLSAgICAgICAgLy8gYSAkey4uLn0gd2FzIGluY29tcGxldGUsIHNvIHdlIGFkdXN0IHRoZSBibG9jayBsZW5ndGguCi0KLSAgICAgICAgaWYgKHN0YXRlID09IFNUQVRFX0RPTExBUikKLSAgICAgICAgICAgIGJsb2NrTGVuZ3RoKys7Ci0KLSAgICAgICAgaWYgKHN0YXRlID09IFNUQVRFX0NPTExFQ1RfRVhQUkVTU0lPTikKLSAgICAgICAgICAgIGJsb2NrTGVuZ3RoICs9IGV4cHJlc3Npb25MZW5ndGggKyAyOwotCi0gICAgICAgIGlmIChibG9ja0xlbmd0aCA+IDApCi0gICAgICAgICAgICB0b2tlbi5hZGRUb2tlbihjb25zdHJ1Y3RTdGF0aWModGV4dCwgYmxvY2tTdGFydCwgYmxvY2tMZW5ndGgsIGxvY2F0aW9uKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBJU2NyaXB0VG9rZW4gY29uc3RydWN0U3RhdGljKAotICAgICAgICBTdHJpbmcgdGV4dCwKLSAgICAgICAgaW50IGJsb2NrU3RhcnQsCi0gICAgICAgIGludCBibG9ja0xlbmd0aCwKLSAgICAgICAgSUxvY2F0aW9uIGxvY2F0aW9uKQotICAgIHsKLSAgICAgICAgU3RyaW5nIGxpdGVyYWwgPSB0ZXh0LnN1YnN0cmluZyhibG9ja1N0YXJ0LCBibG9ja1N0YXJ0ICsgYmxvY2tMZW5ndGgpOwotCi0gICAgICAgIHJldHVybiBuZXcgU3RhdGljVG9rZW4obGl0ZXJhbCwgbG9jYXRpb24pOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9zY3JpcHQvQm9keVJ1bGUuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9zY3JpcHQvQm9keVJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGUwZGRmZS4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvc2NyaXB0L0JvZHlSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5zY3JpcHQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnV0aWwueG1sLlJ1bGVEaXJlY3RlZFBhcnNlcjsKLWltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOwotCi0vKioKLSAqIENvbnN0cnVjdHMgYSB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5zY3JpcHQuQm9keVRva2VufSBmcm9tCi0gKiBhICZsdDtib2R5Jmd0OyBlbGVtZW50LCB3aGljaCBjb250YWlucyBmdWxsIGNvbnRlbnQuCi0gKgotICogQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogQHZlcnNpb24gJElkJAotICogQHNpbmNlIDMuMAotICovCi1jbGFzcyBCb2R5UnVsZSBleHRlbmRzIEFic3RyYWN0VG9rZW5SdWxlCi17Ci0gICAgcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFJ1bGVEaXJlY3RlZFBhcnNlciBwYXJzZXIsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykKLSAgICB7Ci0gICAgICAgIEJvZHlUb2tlbiB0b2tlbiA9IG5ldyBCb2R5VG9rZW4ocGFyc2VyLmdldExvY2F0aW9uKCkpOwotICAgICAgICBhZGRUb1BhcmVudChwYXJzZXIsIHRva2VuKTsKLQotICAgICAgICBwYXJzZXIucHVzaCh0b2tlbik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZW5kRWxlbWVudChSdWxlRGlyZWN0ZWRQYXJzZXIgcGFyc2VyKQotICAgIHsKLSAgICAgICAgcGFyc2VyLnBvcCgpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3NjcmlwdC9Cb2R5VG9rZW4uamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9zY3JpcHQvQm9keVRva2VuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiYjE4ZDMuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3NjcmlwdC9Cb2R5VG9rZW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LnNjcmlwdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUxvY2F0aW9uOwotCi0KLS8qKgotICogIEdlbmVyYXRlcyBhIFN0cmluZyBmcm9tIGl0cyBjaGlsZCB0b2tlbnMsIHRoZW4gYXBwbGllcyBpdAotICogIHRvIHtAbGluayBTY3JpcHRTZXNzaW9uI3NldEJvZHkoU3RyaW5nKX0uCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQHNpbmNlIDAuMi45Ci0gKiAKLSAqKi8KLQotY2xhc3MgQm9keVRva2VuIGV4dGVuZHMgQWJzdHJhY3RUb2tlbgotewotICAgIHByaXZhdGUgaW50IF9idWZmZXJMZW5ndGhIaWdod2F0ZXIgPSAxMDA7Ci0KLQlwdWJsaWMgQm9keVRva2VuKElMb2NhdGlvbiBsb2NhdGlvbikKLQl7Ci0JCXN1cGVyKGxvY2F0aW9uKTsKLQl9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZShTdHJpbmdCdWZmZXIgYnVmZmVyLCBTY3JpcHRTZXNzaW9uIHNlc3Npb24pCi0gICAgewotICAgICAgICBpZiAoYnVmZmVyICE9IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0KLSAgICAgICAgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihfYnVmZmVyTGVuZ3RoSGlnaHdhdGVyKTsKLQotICAgICAgICB3cml0ZUNoaWxkcmVuKGJ1ZmZlciwgc2Vzc2lvbik7Ci0KLQkJc2Vzc2lvbi5nZXRQcm9jZXNzb3IoKS5hZGRCb2R5U2NyaXB0KGJ1ZmZlci50b1N0cmluZygpKTsKLQotICAgICAgICAvLyBTdG9yZSB0aGUgYnVmZmVyIGxlbmd0aCBmcm9tIHRoaXMgcnVuIGZvciB0aGUgbmV4dCBydW4sIHNpbmNlIGl0cwotICAgICAgICAvLyBnb2luZyB0byBiZSBhcHByb3hpbWF0ZWx5IHRoZSByaWdodCBzaXplLgotCi0gICAgICAgIF9idWZmZXJMZW5ndGhIaWdod2F0ZXIgPSBNYXRoLm1heChfYnVmZmVyTGVuZ3RoSGlnaHdhdGVyLCBidWZmZXIubGVuZ3RoKCkpOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvc2NyaXB0L0ZvcmVhY2hSdWxlLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvc2NyaXB0L0ZvcmVhY2hSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyOGM4ODUuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3NjcmlwdC9Gb3JlYWNoUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuc2NyaXB0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS51dGlsLnhtbC5SdWxlRGlyZWN0ZWRQYXJzZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKLQotLyoqCi0gKiBDb25zdHJ1Y3RzIGEge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkuc2NyaXB0LkZvcmVhY2hUb2tlbn0KLSAqIGZyb20gYSAmbHQ7Zm9yZWFjaCZndDsgZWxlbWVudCwgd2hpY2ggY29udGFpbnMgZnVsbCBjb250ZW50LgotICogCi0gKiA8cD5BcyBvZiAzLjAsIHRoZW4gaW5kZXggYXR0cmlidXRlIGhhcyBiZWVuIGFkZGVkIHRvIGZvcmVhY2ggdG8ga2VlcCAKLSAqIHRyYWNrIG9mIHRoZSBjdXJyZW50IGluZGV4IG9mIHRoZSBpdGVyYXRpbmcgY29sbGVjdGlvbi48L3A+Ci0gKgotICogQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcCwgSGFyaXNoIEtyaXNobmFzd2FteQotICogQHZlcnNpb24gJElkJAotICogQHNpbmNlIDMuMAotICovCi1jbGFzcyBGb3JlYWNoUnVsZSBleHRlbmRzIEFic3RyYWN0VG9rZW5SdWxlCi17Ci0KLSAgICBwdWJsaWMgdm9pZCBlbmRFbGVtZW50KFJ1bGVEaXJlY3RlZFBhcnNlciBwYXJzZXIpCi0gICAgewotICAgICAgICBwYXJzZXIucG9wKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFJ1bGVEaXJlY3RlZFBhcnNlciBwYXJzZXIsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykKLSAgICB7Ci0gICAgICAgIFN0cmluZyBrZXkgPSBnZXRBdHRyaWJ1dGUoYXR0cmlidXRlcywgImtleSIpOwotICAgICAgICBTdHJpbmcgaW5kZXggPSBnZXRBdHRyaWJ1dGUoYXR0cmlidXRlcywgImluZGV4Iik7Ci0gICAgICAgIFN0cmluZyBleHByZXNzaW9uID0gZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZXMsICJleHByZXNzaW9uIik7Ci0KLSAgICAgICAgaWYgKGV4cHJlc3Npb24gPT0gbnVsbCkKLSAgICAgICAgICAgIGV4cHJlc3Npb24gPSBnZXRBdHRyaWJ1dGUoYXR0cmlidXRlcywgInByb3BlcnR5LXBhdGgiKTsgLy8gMS4wLCAxLjEgRFRECi0KLSAgICAgICAgSVNjcmlwdFRva2VuIHRva2VuID0gbmV3IEZvcmVhY2hUb2tlbihrZXksIGluZGV4LCBleHByZXNzaW9uLCBwYXJzZXIuZ2V0TG9jYXRpb24oKSk7Ci0KLSAgICAgICAgYWRkVG9QYXJlbnQocGFyc2VyLCB0b2tlbik7Ci0KLSAgICAgICAgcGFyc2VyLnB1c2godG9rZW4pOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3NjcmlwdC9Gb3JlYWNoVG9rZW4uamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9zY3JpcHQvRm9yZWFjaFRva2VuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3MmZjZjkuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3NjcmlwdC9Gb3JlYWNoVG9rZW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LnNjcmlwdDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JTG9jYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5UYXBlc3RyeTsKLQotLyoqCi0gKiAgQSBsb29waW5nIG9wZXJhdG9yLCBtb2RlbGVkIGFmdGVyIHRoZSBGb3JlYWNoIGNvbXBvbmVudC4gIEl0IHRha2VzCi0gKiAgYXMgaXRzIHNvdXJjZSBhcyBwcm9wZXJ0eSBhbmQgaXRlcmF0ZXMgdGhyb3VnaCB0aGUgdmFsdWVzLCB1cGRhdGluZwotICogIGEgc3ltYm9sIG9uIGVhY2ggcGFzcy4KLSAqIAotICogIDxwPkFzIG9mIDMuMCwgdGhlIGluZGV4IGF0dHJpYnV0ZSBoYXMgYmVlbiBhZGRlZCB0byBmb3JlYWNoIHRvIGtlZXAgCi0gKiAgdHJhY2sgb2YgdGhlIGN1cnJlbnQgaW5kZXggb2YgdGhlIGl0ZXJhdGluZyBjb2xsZWN0aW9uLjwvcD4KLSAqCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcCwgSGFyaXNoIEtyaXNobmFzd2FteQotICogIEB2ZXJzaW9uICRJZCQKLSAqICBAc2luY2UgMS4wLjEKLSAqIAotICoqLwotCi1jbGFzcyBGb3JlYWNoVG9rZW4gZXh0ZW5kcyBBYnN0cmFjdFRva2VuCi17Ci0gICAgcHJpdmF0ZSBTdHJpbmcgX2tleTsKLSAgICBwcml2YXRlIFN0cmluZyBfaW5kZXg7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgX2V4cHJlc3Npb247Ci0KLSAgICBGb3JlYWNoVG9rZW4oU3RyaW5nIGtleSwgU3RyaW5nIGluZGV4LCBTdHJpbmcgZXhwcmVzc2lvbiwgSUxvY2F0aW9uIGxvY2F0aW9uKQotICAgIHsKLSAgICAgICAgc3VwZXIobG9jYXRpb24pOwotCi0gICAgICAgIF9rZXkgPSBrZXk7Ci0gICAgICAgIF9pbmRleCA9IGluZGV4OwotICAgICAgICBfZXhwcmVzc2lvbiA9IGV4cHJlc3Npb247Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGUoU3RyaW5nQnVmZmVyIGJ1ZmZlciwgU2NyaXB0U2Vzc2lvbiBzZXNzaW9uKQotICAgIHsKLSAgICAgICAgTWFwIHN5bWJvbHMgPSBzZXNzaW9uLmdldFN5bWJvbHMoKTsKLQotICAgICAgICBPYmplY3QgcmF3U291cmNlID0gZXZhbHVhdGUoX2V4cHJlc3Npb24sIHNlc3Npb24pOwotCi0gICAgICAgIEl0ZXJhdG9yIGkgPSBUYXBlc3RyeS5jb2VyY2VUb0l0ZXJhdG9yKHJhd1NvdXJjZSk7Ci0gICAgICAgIAotICAgICAgICBpZiAoaSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIGludCBpbmRleCA9IDA7Ci0KLSAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBPYmplY3QgbmV3VmFsdWUgPSBpLm5leHQoKTsKLQotICAgICAgICAgICAgc3ltYm9scy5wdXQoX2tleSwgbmV3VmFsdWUpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoX2luZGV4ICE9IG51bGwpCi0gICAgICAgICAgICAJc3ltYm9scy5wdXQoX2luZGV4LCBTdHJpbmcudmFsdWVPZihpbmRleCkpOwotCi0gICAgICAgICAgICB3cml0ZUNoaWxkcmVuKGJ1ZmZlciwgc2Vzc2lvbik7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGluZGV4Kys7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBXZSBsZWF2ZSB0aGUgbGFzdCB2YWx1ZSBhcyBhIHN5bWJvbDsgZG9uJ3Qga25vdyBpZiB0aGF0J3MKLSAgICAgICAgLy8gZ29vZCBvciBiYWQuCi0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9zY3JpcHQvSVNjcmlwdFRva2VuLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvc2NyaXB0L0lTY3JpcHRUb2tlbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTgxZGE1Li4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9zY3JpcHQvSVNjcmlwdFRva2VuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5zY3JpcHQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklMb2NhdGFibGU7Ci0KLQotLyoqCi0gKiAgRGVmaW5lcyB0aGUgcmVzcG9uc2liaWxpdGllcyBvZiBhIHRlbXBsYXRlIHRva2VuIHVzZWQgYnkgYQotICogIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LklTY3JpcHR9LgotICoKLSAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiAgQHZlcnNpb24gJElkJAotICogCi0gKiovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSVNjcmlwdFRva2VuIGV4dGVuZHMgSUxvY2F0YWJsZQotewotCS8qKgotCSAqICBJbnZva2VkIHRvIGhhdmUgdGhlIHRva2VuCi0JICogIGFkZCBpdHMgdGV4dCB0byB0aGUgYnVmZmVyLiAgQSB0b2tlbiBtYXkgbmVlZCBhY2Nlc3MKLQkgKiAgdG8gdGhlIHN5bWJvbHMgaW4gb3JkZXIgdG8gcHJvZHVjZSBpdHMgb3V0cHV0LgotCSAqCi0JICogIDxwPlRvcCBsZXZlbCB0b2tlbnMgKHN1Y2ggYXMgQm9keVRva2VuKSBjYW4gZXhwZWN0IHRoYXQKLQkgKiAgYnVmZmVyIHdpbGwgYmUgbnVsbC4KLQkgKgotCSAqKi8KLQotCXB1YmxpYyB2b2lkIHdyaXRlKFN0cmluZ0J1ZmZlciBidWZmZXIsIFNjcmlwdFNlc3Npb24gc2Vzc2lvbik7Ci0KLQkvKioKLQkgKiAgSW52b2tlZCBkdXJpbmcgcGFyc2luZyB0byBhZGQgdGhlIHRva2VuIHBhcmFtZXRlciBhcyBhIGNoaWxkCi0JICogIG9mIHRoaXMgdG9rZW4uCi0JICoKLQkgKiAgQHNpbmNlIDAuMi45Ci0JICoqLwotCi0JcHVibGljIHZvaWQgYWRkVG9rZW4oSVNjcmlwdFRva2VuIHRva2VuKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvc2NyaXB0L0lmUnVsZS5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3NjcmlwdC9JZlJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQ0ZDIwMi4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvc2NyaXB0L0lmUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuc2NyaXB0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS51dGlsLnhtbC5SdWxlRGlyZWN0ZWRQYXJzZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKLQotLyoqCi0gKiBDb25zdHJ1Y3RzIGFuIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LnNjcmlwdC5JZlRva2VufQotICogZnJvbSBhbiAmbHQ7aWYmZ3Q7IG9yICZsdDtpZi1ub3QmZ3Q7IGVsZW1lbnQsIHdoaWNoCi0gKiBjb250YWlucyBmdWxsIGNvbnRlbnQuCi0gKgotICogQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogQHZlcnNpb24gJElkJAotICogQHNpbmNlIDMuMAotICovCi1jbGFzcyBJZlJ1bGUgZXh0ZW5kcyBBYnN0cmFjdFRva2VuUnVsZQotewotICAgIHByaXZhdGUgYm9vbGVhbiBfY29uZGl0aW9uOwotCi0gICAgcHVibGljIElmUnVsZShib29sZWFuIGNvbmRpdGlvbikKLSAgICB7Ci0gICAgICAgIF9jb25kaXRpb24gPSBjb25kaXRpb247Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZW5kRWxlbWVudChSdWxlRGlyZWN0ZWRQYXJzZXIgcGFyc2VyKQotICAgIHsKLSAgICAgICAgcGFyc2VyLnBvcCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChSdWxlRGlyZWN0ZWRQYXJzZXIgcGFyc2VyLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpCi0gICAgewotICAgICAgICBTdHJpbmcgZXhwcmVzc2lvbiA9IGdldEF0dHJpYnV0ZShhdHRyaWJ1dGVzLCAiZXhwcmVzc2lvbiIpOwotCi0gICAgICAgIGlmIChleHByZXNzaW9uID09IG51bGwpCi0gICAgICAgICAgICBleHByZXNzaW9uID0gZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZXMsICJwcm9wZXJ0eS1wYXRoIik7IC8vIDEuMCwgMS4xIERURAotICAgIAotICAgIAlJU2NyaXB0VG9rZW4gdG9rZW4gPSBuZXcgSWZUb2tlbihfY29uZGl0aW9uLCBleHByZXNzaW9uLCBwYXJzZXIuZ2V0TG9jYXRpb24oKSk7Ci0gICAgCQotICAgIAlhZGRUb1BhcmVudChwYXJzZXIsIHRva2VuKTsKLSAgICAJCi0gICAgCXBhcnNlci5wdXNoKHRva2VuKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9zY3JpcHQvSWZUb2tlbi5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3NjcmlwdC9JZlRva2VuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2ZWMzODQuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3NjcmlwdC9JZlRva2VuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5zY3JpcHQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklMb2NhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LlRhcGVzdHJ5OwotCi0vKioKLSAqICBBIGNvbmRpdGlvbmFsIHBvcnRpb24gb2YgdGhlIGdlbmVyYXRlZCBzY3JpcHQuCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQHNpbmNlIDEuMC4xCi0gKgotICoqLwotCi1jbGFzcyBJZlRva2VuIGV4dGVuZHMgQWJzdHJhY3RUb2tlbgotewotICAgIHByaXZhdGUgYm9vbGVhbiBfY29uZGl0aW9uOwotICAgIHByaXZhdGUgU3RyaW5nIF9leHByZXNzaW9uOwotCi0gICAgSWZUb2tlbihib29sZWFuIGNvbmRpdGlvbiwgU3RyaW5nIGV4cHJlc3Npb24sIElMb2NhdGlvbiBsb2NhdGlvbikKLSAgICB7Ci0gICAgICAgIHN1cGVyKGxvY2F0aW9uKTsKLQotICAgICAgICBfY29uZGl0aW9uID0gY29uZGl0aW9uOwotICAgICAgICBfZXhwcmVzc2lvbiA9IGV4cHJlc3Npb247Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGV2YWx1YXRlKFNjcmlwdFNlc3Npb24gc2Vzc2lvbikKLSAgICB7Ci0gICAgICAgIE9iamVjdCB2YWx1ZSA9IGV2YWx1YXRlKF9leHByZXNzaW9uLCBzZXNzaW9uKTsKLQotICAgICAgICByZXR1cm4gVGFwZXN0cnkuZXZhbHVhdGVCb29sZWFuKHZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZShTdHJpbmdCdWZmZXIgYnVmZmVyLCBTY3JpcHRTZXNzaW9uIHNlc3Npb24pCi0gICAgewotICAgICAgICBpZiAoZXZhbHVhdGUoc2Vzc2lvbikgPT0gX2NvbmRpdGlvbikKLSAgICAgICAgICAgIHdyaXRlQ2hpbGRyZW4oYnVmZmVyLCBzZXNzaW9uKTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3NjcmlwdC9JbmNsdWRlU2NyaXB0UnVsZS5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3NjcmlwdC9JbmNsdWRlU2NyaXB0UnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMmM3NGYyLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9zY3JpcHQvSW5jbHVkZVNjcmlwdFJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LnNjcmlwdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkudXRpbC54bWwuQmFzZVJ1bGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS51dGlsLnhtbC5SdWxlRGlyZWN0ZWRQYXJzZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKLQotLyoqCi0gKiBDb25zdHJ1Y3RzIGFuIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LnNjcmlwdC5JbmNsdWRlU2NyaXB0VG9rZW59Ci0gKiBmcm9tIGEgJmx0O2luY2x1ZGUtc2NyaXB0Jmd0OyBlbGVtZW50LCB3aGljaCBjb250YWlucyBubyBjb250ZW50LgotICoKLSAqIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqIEB2ZXJzaW9uICRJZCQKLSAqIEBzaW5jZSAzLjAKLSAqLwotY2xhc3MgSW5jbHVkZVNjcmlwdFJ1bGUgZXh0ZW5kcyBCYXNlUnVsZQotewotCi0gICAgcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFJ1bGVEaXJlY3RlZFBhcnNlciBwYXJzZXIsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykKLSAgICB7Ci0gICAgICAgIFN0cmluZyBwYXRoID0gZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZXMsICJyZXNvdXJjZS1wYXRoIik7Ci0gICAgICAgIAotICAgICAgICBJbmNsdWRlU2NyaXB0VG9rZW4gdG9rZW4gPSBuZXcgSW5jbHVkZVNjcmlwdFRva2VuKHBhdGgsIHBhcnNlci5nZXRMb2NhdGlvbigpKTsKLQotCQlJU2NyaXB0VG9rZW4gcGFyZW50ID0gKElTY3JpcHRUb2tlbikgcGFyc2VyLnBlZWsoKTsKLSAgICAgICAgcGFyZW50LmFkZFRva2VuKHRva2VuKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9zY3JpcHQvSW5jbHVkZVNjcmlwdFRva2VuLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvc2NyaXB0L0luY2x1ZGVTY3JpcHRUb2tlbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OWE2OTRjLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9zY3JpcHQvSW5jbHVkZVNjcmlwdFRva2VuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5zY3JpcHQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklMb2NhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZXNvdXJjZUxvY2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkucmVzb3VyY2UuQ2xhc3NwYXRoUmVzb3VyY2VMb2NhdGlvbjsKLQotLyoqCi0gKiAgQSB0b2tlbiBmb3IgaW5jbHVkZWQgc2NyaXB0cy4KLSAqCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogIEB2ZXJzaW9uICRJZCQKLSAqICBAc2luY2UgMS4wLjUKLSAqIAotICoqLwotCi1jbGFzcyBJbmNsdWRlU2NyaXB0VG9rZW4gZXh0ZW5kcyBBYnN0cmFjdFRva2VuCi17Ci0gICAgcHJpdmF0ZSBTdHJpbmcgX3Jlc291cmNlUGF0aDsKLQotICAgIHB1YmxpYyBJbmNsdWRlU2NyaXB0VG9rZW4oU3RyaW5nIHJlc291cmNlUGF0aCwgSUxvY2F0aW9uIGxvY2F0aW9uKQotICAgIHsKLSAgICAgICAgc3VwZXIobG9jYXRpb24pOwotCi0gICAgICAgIF9yZXNvdXJjZVBhdGggPSByZXNvdXJjZVBhdGg7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGUoU3RyaW5nQnVmZmVyIGJ1ZmZlciwgU2NyaXB0U2Vzc2lvbiBzZXNzaW9uKQotICAgIHsKLSAgICAgICAgSVJlc291cmNlTG9jYXRpb24gaW5jbHVkZUxvY2F0aW9uID0gbnVsbDsKLQotICAgICAgICBpZiAoX3Jlc291cmNlUGF0aC5zdGFydHNXaXRoKCIvIikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGluY2x1ZGVMb2NhdGlvbiA9Ci0gICAgICAgICAgICAgICAgbmV3IENsYXNzcGF0aFJlc291cmNlTG9jYXRpb24oCi0gICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0UmVxdWVzdEN5Y2xlKCkuZ2V0RW5naW5lKCkuZ2V0UmVzb3VyY2VSZXNvbHZlcigpLAotICAgICAgICAgICAgICAgICAgICBfcmVzb3VyY2VQYXRoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIElSZXNvdXJjZUxvY2F0aW9uIGJhc2VMb2NhdGlvbiA9IHNlc3Npb24uZ2V0U2NyaXB0UGF0aCgpOwotICAgICAgICAgICAgaW5jbHVkZUxvY2F0aW9uID0gYmFzZUxvY2F0aW9uLmdldFJlbGF0aXZlTG9jYXRpb24oX3Jlc291cmNlUGF0aCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBUT0RPOiBBbGxvdyBmb3Igc2NyaXB0cyByZWxhdGl2ZSB0byBjb250ZXh0IHJlc291cmNlcyEKLQotICAgICAgICBzZXNzaW9uLmdldFByb2Nlc3NvcigpLmFkZEV4dGVybmFsU2NyaXB0KGluY2x1ZGVMb2NhdGlvbik7Ci0gICAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3NjcmlwdC9Jbml0UnVsZS5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3NjcmlwdC9Jbml0UnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODcyZjk5Li4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9zY3JpcHQvSW5pdFJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LnNjcmlwdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkudXRpbC54bWwuUnVsZURpcmVjdGVkUGFyc2VyOwotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7Ci0KLS8qKgotICogQ29uc3RydWN0cyBhbiB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5zY3JpcHQuSW5pdFRva2VufQotICogZnJvbSBhbiAmbHQ7aW5pdGlhbGl6YXRpb24mZ3Q7IGVsZW1lbnQsIHdoaWNoCi0gKiBjb250YWlucyBmdWxsIGNvbnRlbnQuCi0gKgotICogQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogQHZlcnNpb24gJElkJAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgY2xhc3MgSW5pdFJ1bGUgZXh0ZW5kcyBBYnN0cmFjdFRva2VuUnVsZQotewotCi0gICAgcHVibGljIHZvaWQgZW5kRWxlbWVudChSdWxlRGlyZWN0ZWRQYXJzZXIgcGFyc2VyKQotICAgIHsKLQkJcGFyc2VyLnBvcCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChSdWxlRGlyZWN0ZWRQYXJzZXIgcGFyc2VyLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpCi0gICAgewotCQlJU2NyaXB0VG9rZW4gdG9rZW4gPSBuZXcgSW5pdFRva2VuKHBhcnNlci5nZXRMb2NhdGlvbigpKTsKLQkJCi0JCWFkZFRvUGFyZW50KHBhcnNlciwgdG9rZW4pOwotCQkKLQkJcGFyc2VyLnB1c2godG9rZW4pOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3NjcmlwdC9Jbml0VG9rZW4uamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9zY3JpcHQvSW5pdFRva2VuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4MmE5OTUuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3NjcmlwdC9Jbml0VG9rZW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LnNjcmlwdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUxvY2F0aW9uOwotCi0vKioKLSAqICBHZW5lcmF0ZXMgYSBTdHJpbmcgZnJvbSBpdHMgY2hpbGQgdG9rZW5zLCB0aGVuIGFwcGxpZXMgaXQKLSAqICB0byB7QGxpbmsgU2NyaXB0U2Vzc2lvbiNzZXRJbml0aWFsaXphdGlvbihTdHJpbmcpfS4KLSAqCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogIEB2ZXJzaW9uICRJZCQKLSAqICBAc2luY2UgMC4yLjkKLSAqCi0gKiovCi0KLWNsYXNzIEluaXRUb2tlbiBleHRlbmRzIEFic3RyYWN0VG9rZW4KLXsKLSAgICBwcml2YXRlIGludCBfYnVmZmVyTGVuZ3RoSGlnaHdhdGVyID0gMTAwOwotCi0gICAgcHVibGljIEluaXRUb2tlbihJTG9jYXRpb24gbG9jYXRpb24pCi0gICAgewotICAgICAgICBzdXBlcihsb2NhdGlvbik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGUoU3RyaW5nQnVmZmVyIGJ1ZmZlciwgU2NyaXB0U2Vzc2lvbiBzZXNzaW9uKQotICAgIHsKLSAgICAgICAgaWYgKGJ1ZmZlciAhPSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCi0gICAgICAgIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoX2J1ZmZlckxlbmd0aEhpZ2h3YXRlcik7Ci0KLSAgICAgICAgd3JpdGVDaGlsZHJlbihidWZmZXIsIHNlc3Npb24pOwotCi0gICAgICAgIHNlc3Npb24uZ2V0UHJvY2Vzc29yKCkuYWRkSW5pdGlhbGl6YXRpb25TY3JpcHQoYnVmZmVyLnRvU3RyaW5nKCkpOwotCi0gICAgICAgIC8vIFN0b3JlIHRoZSBidWZmZXIgbGVuZ3RoIGZyb20gdGhpcyBydW4gZm9yIHRoZSBuZXh0IHJ1biwgc2luY2UgaXRzCi0gICAgICAgIC8vIGdvaW5nIHRvIGJlIGFwcHJveGltYXRlbHkgdGhlIHJpZ2h0IHNpemUuCi0KLSAgICAgICAgX2J1ZmZlckxlbmd0aEhpZ2h3YXRlciA9IE1hdGgubWF4KF9idWZmZXJMZW5ndGhIaWdod2F0ZXIsIGJ1ZmZlci5sZW5ndGgoKSk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9zY3JpcHQvSW5wdXRTeW1ib2xSdWxlLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvc2NyaXB0L0lucHV0U3ltYm9sUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDJmNGYzLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9zY3JpcHQvSW5wdXRTeW1ib2xSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5zY3JpcHQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZXNvdXJjZVJlc29sdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuVGFwZXN0cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS51dGlsLnhtbC5CYXNlUnVsZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnV0aWwueG1sLkRvY3VtZW50UGFyc2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS51dGlsLnhtbC5SdWxlRGlyZWN0ZWRQYXJzZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKLQotLyoqCi0gKiBDb25zdHJ1Y3RzIGFuIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LnNjcmlwdC5JbnB1dFN5bWJvbFRva2VufQotICogZnJvbSBhbiAmbHQ7aW5wdXQtc3ltYm9sJmd0OyBlbGVtZW50LgotICoKLSAqIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqIEB2ZXJzaW9uICRJZCQKLSAqIEBzaW5jZSAzLjAKLSAqLwotY2xhc3MgSW5wdXRTeW1ib2xSdWxlIGV4dGVuZHMgQmFzZVJ1bGUKLXsKLSAgICBwcml2YXRlIElSZXNvdXJjZVJlc29sdmVyIF9yZXNvbHZlcjsKLQotICAgIHB1YmxpYyBJbnB1dFN5bWJvbFJ1bGUoSVJlc291cmNlUmVzb2x2ZXIgcmVzb2x2ZXIpCi0gICAgewotICAgICAgICBfcmVzb2x2ZXIgPSByZXNvbHZlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoUnVsZURpcmVjdGVkUGFyc2VyIHBhcnNlciwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKQotICAgIHsKLSAgICAgICAgU3RyaW5nIGtleSA9IGdldEF0dHJpYnV0ZShhdHRyaWJ1dGVzLCAia2V5Iik7Ci0KLSAgICAgICAgcGFyc2VyLnZhbGlkYXRlKGtleSwgVGFwZXN0cnkuU0lNUExFX1BST1BFUlRZX05BTUVfUEFUVEVSTiwgIlNjcmlwdFBhcnNlci5pbnZhbGlkLWtleSIpOwotCi0gICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBnZXRBdHRyaWJ1dGUoYXR0cmlidXRlcywgImNsYXNzIik7Ci0gICAgICAgIENsYXNzIGV4cGVjdGVkQ2xhc3MgPSBsb29rdXBDbGFzcyhwYXJzZXIsIGNsYXNzTmFtZSk7Ci0KLSAgICAgICAgU3RyaW5nIHJlcXVpcmVkID0gZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZXMsICJyZXF1aXJlZCIpOwotCi0gICAgICAgIElucHV0U3ltYm9sVG9rZW4gdG9rZW4gPQotICAgICAgICAgICAgbmV3IElucHV0U3ltYm9sVG9rZW4oa2V5LCBleHBlY3RlZENsYXNzLCByZXF1aXJlZC5lcXVhbHMoInllcyIpLCBwYXJzZXIuZ2V0TG9jYXRpb24oKSk7Ci0KLSAgICAgICAgSVNjcmlwdFRva2VuIHBhcmVudCA9IChJU2NyaXB0VG9rZW4pIHBhcnNlci5wZWVrKCk7Ci0gICAgICAgIHBhcmVudC5hZGRUb2tlbih0b2tlbik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBDbGFzcyBsb29rdXBDbGFzcyhSdWxlRGlyZWN0ZWRQYXJzZXIgcGFyc2VyLCBTdHJpbmcgY2xhc3NOYW1lKQotICAgIHsKLSAgICAgICAgaWYgKFRhcGVzdHJ5LmlzQmxhbmsoY2xhc3NOYW1lKSkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gX3Jlc29sdmVyLmZpbmRDbGFzcyhjbGFzc05hbWUpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBEb2N1bWVudFBhcnNlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIFRhcGVzdHJ5LmZvcm1hdCgiU2NyaXB0UGFyc2VyLnVuYWJsZS10by1yZXNvbHZlLWNsYXNzIiwgY2xhc3NOYW1lKSwKLSAgICAgICAgICAgICAgICBwYXJzZXIuZ2V0RG9jdW1lbnRMb2NhdGlvbigpLAotICAgICAgICAgICAgICAgIHBhcnNlci5nZXRMb2NhdGlvbigpLAotICAgICAgICAgICAgICAgIGV4KTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9zY3JpcHQvSW5wdXRTeW1ib2xUb2tlbi5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3NjcmlwdC9JbnB1dFN5bWJvbFRva2VuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiZWNmZDYuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3NjcmlwdC9JbnB1dFN5bWJvbFRva2VuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5zY3JpcHQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LkFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklMb2NhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LlRhcGVzdHJ5OwotCi0vKioKLSAqICBBIHRva2VuIHRoYXQgdmFsaWRhdGVzIHRoYXQgYW4gaW5wdXQgc3ltYm9sIGV4aXN0cyBvciBpcyBvZiBhCi0gKiAgZGVjbGFyZWQgdHlwZS4KLSAqCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQHNpbmNlIDIuMgotICogCi0gKiovCi0KLWNsYXNzIElucHV0U3ltYm9sVG9rZW4gZXh0ZW5kcyBBYnN0cmFjdFRva2VuCi17Ci0gICAgcHJpdmF0ZSBTdHJpbmcgX2tleTsKLSAgICBwcml2YXRlIENsYXNzIF9jbGFzczsKLSAgICBwcml2YXRlIGJvb2xlYW4gX3JlcXVpcmVkOwotCi0gICAgSW5wdXRTeW1ib2xUb2tlbihTdHJpbmcga2V5LCBDbGFzcyBjbGF6eiwgYm9vbGVhbiByZXF1aXJlZCwgSUxvY2F0aW9uIGxvY2F0aW9uKQotICAgIHsKLSAgICAgICAgc3VwZXIobG9jYXRpb24pOwotCi0gICAgICAgIF9rZXkgPSBrZXk7Ci0gICAgICAgIF9jbGFzcyA9IGNsYXp6OwotICAgICAgICBfcmVxdWlyZWQgPSByZXF1aXJlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZShTdHJpbmdCdWZmZXIgYnVmZmVyLCBTY3JpcHRTZXNzaW9uIHNlc3Npb24pCi0gICAgewotICAgICAgICBPYmplY3QgdmFsdWUgPSBzZXNzaW9uLmdldFN5bWJvbHMoKS5nZXQoX2tleSk7Ci0KLSAgICAgICAgaWYgKF9yZXF1aXJlZCAmJiB2YWx1ZSA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICBUYXBlc3RyeS5mb3JtYXQoIklucHV0U3ltYm9sVG9rZW4ucmVxdWlyZWQiLCBfa2V5KSwKLSAgICAgICAgICAgICAgICBnZXRMb2NhdGlvbigpLAotICAgICAgICAgICAgICAgIG51bGwpOwotCi0gICAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmIF9jbGFzcyAhPSBudWxsICYmICFfY2xhc3MuaXNBc3NpZ25hYmxlRnJvbSh2YWx1ZS5nZXRDbGFzcygpKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgVGFwZXN0cnkuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAiSW5wdXRTeW1ib2xUb2tlbi53cm9uZy10eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgX2tleSwKLSAgICAgICAgICAgICAgICAgICAgdmFsdWUuZ2V0Q2xhc3MoKS5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgIF9jbGFzcy5nZXROYW1lKCkpLAotICAgICAgICAgICAgICAgIGdldExvY2F0aW9uKCksCi0gICAgICAgICAgICAgICAgbnVsbCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvc2NyaXB0L0luc2VydFJ1bGUuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9zY3JpcHQvSW5zZXJ0UnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2I5MTlmLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9zY3JpcHQvSW5zZXJ0UnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuc2NyaXB0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS51dGlsLnhtbC5SdWxlRGlyZWN0ZWRQYXJzZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKLQotLyoqCi0gKiBDb25zdHJ1Y3RzIGFuIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LnNjcmlwdC5JbnNlcnRUb2tlbn0KLSAqIGZyb20gYW4gJmx0O2luc2VydCZndDsgZWxlbWVudCwgd2hpY2ggY29udGFpbnMgZnVsbCBjb250ZW50LgotICogJmx0O2luc2VydCZndDsgaXMgYSB0aHJvd2JhY2sgdG8gdGhlIDEuMCBhbmQgMS4xIERURHMuCi0gKgotICogQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogQHZlcnNpb24gJElkJAotICogQHNpbmNlIDMuMAotICovCi1jbGFzcyBJbnNlcnRSdWxlIGV4dGVuZHMgQWJzdHJhY3RUb2tlblJ1bGUKLXsKLQotICAgIHB1YmxpYyB2b2lkIGVuZEVsZW1lbnQoUnVsZURpcmVjdGVkUGFyc2VyIHBhcnNlcikKLSAgICB7Ci0gICAgICAgIHBhcnNlci5wb3AoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoUnVsZURpcmVjdGVkUGFyc2VyIHBhcnNlciwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKQotICAgIHsKLSAgICAgICAgLy8gcHJvcGVydHktcGF0aCBpcyByZWFsbHkgYW4gT0dOTCBleHByZXNzaW9uLgotICAgICAgICBTdHJpbmcgZXhwcmVzc2lvbiA9IGdldEF0dHJpYnV0ZShhdHRyaWJ1dGVzLCAicHJvcGVydHktcGF0aCIpOwotCi0gICAgICAgIC8vIFdhcyBjYWxsZWQga2V5IGluIHRoZSAxLjAgRFRECi0gICAgICAgIGlmIChleHByZXNzaW9uID09IG51bGwpCi0gICAgICAgICAgICBleHByZXNzaW9uID0gZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZXMsICJrZXkiKTsKLQotICAgICAgICBJU2NyaXB0VG9rZW4gdG9rZW4gPSBuZXcgSW5zZXJ0VG9rZW4oZXhwcmVzc2lvbiwgcGFyc2VyLmdldExvY2F0aW9uKCkpOwotCi0gICAgICAgIGFkZFRvUGFyZW50KHBhcnNlciwgdG9rZW4pOwotCi0gICAgICAgIHBhcnNlci5wdXNoKHRva2VuKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9zY3JpcHQvSW5zZXJ0VG9rZW4uamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9zY3JpcHQvSW5zZXJ0VG9rZW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmIzNGRjNy4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvc2NyaXB0L0luc2VydFRva2VuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5zY3JpcHQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklMb2NhdGlvbjsKLQotLyoqCi0gKiAgQSB0b2tlbiB0aGF0IHdyaXRlcyB0aGUgdmFsdWUgb2YgYSBwcm9wZXJ0eSB1c2luZyBhIHByb3BlcnR5IHBhdGgKLSAqICByb3V0ZWQgaW4gdGhlIHN5bWJvbHMuLgotICoKLSAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiAgQHZlcnNpb24gJElkJAotICoKLSAqKi8KLQotY2xhc3MgSW5zZXJ0VG9rZW4gZXh0ZW5kcyBBYnN0cmFjdFRva2VuCi17Ci0gICAgcHJpdmF0ZSBTdHJpbmcgX2V4cHJlc3Npb247Ci0KLSAgICBJbnNlcnRUb2tlbihTdHJpbmcgZXhwcmVzc2lvbiwgSUxvY2F0aW9uIGxvY2F0aW9uKQotICAgIHsKLSAgICAgICAgc3VwZXIobG9jYXRpb24pOwotCi0gICAgICAgIF9leHByZXNzaW9uID0gZXhwcmVzc2lvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgR2V0cyB0aGUgbmFtZWQgc3ltYm9sIGZyb20gdGhlIHN5bWJvbHMge0BsaW5rIE1hcH0sIHZlcmlmaWVzIHRoYXQKLSAgICAgKiAgaXQgaXMgYSBTdHJpbmcsIGFuZCB3cml0ZXMgaXQgdG8gdGhlIHtAbGluayBXcml0ZXJ9LgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgd3JpdGUoU3RyaW5nQnVmZmVyIGJ1ZmZlciwgU2NyaXB0U2Vzc2lvbiBzZXNzaW9uKQotICAgIHsKLSAgICAgICAgT2JqZWN0IHZhbHVlID0gZXZhbHVhdGUoX2V4cHJlc3Npb24sIHNlc3Npb24pOwotCi0gICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKQotICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCh2YWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkVG9rZW4oSVNjcmlwdFRva2VuIHRva2VuKQotICAgIHsKLSAgICAgICAgLy8gU2hvdWxkIG5ldmVyIGJlIGludm9rZWQuCi0gICAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3NjcmlwdC9MZXRSdWxlLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvc2NyaXB0L0xldFJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjNhZWY1MC4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvc2NyaXB0L0xldFJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LnNjcmlwdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuVGFwZXN0cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS51dGlsLnhtbC5SdWxlRGlyZWN0ZWRQYXJzZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKLQotLyoqCi0gKiBDb25zdHJ1Y3RzIGFuIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LnNjcmlwdC5MZXRUb2tlbn0KLSAqIGZyb20gYSAmbHQ7bGV0Jmd0OyBlbGVtZW50LCB3aGljaCBtYXkgY29udGFpbiBmdWxsIGNvbnRlbnQuCi0gKgotICogQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogQHZlcnNpb24gJElkJAotICogQHNpbmNlIDMuMAotICovCi1jbGFzcyBMZXRSdWxlIGV4dGVuZHMgQWJzdHJhY3RUb2tlblJ1bGUKLXsKLQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChSdWxlRGlyZWN0ZWRQYXJzZXIgcGFyc2VyLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpCi0gICAgewotICAgICAgICBTdHJpbmcga2V5ID0gZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZXMsICJrZXkiKTsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyB1bmlxdWUgPSBnZXRBdHRyaWJ1dGUoYXR0cmlidXRlcywgInVuaXF1ZSIpOwotICAgICAgICBib29sZWFuIHVuaXF1ZUZsYWcgPSB1bmlxdWUgIT0gbnVsbCAmJiB1bmlxdWUuZXF1YWxzKCJ5ZXMiKTsgCi0KLSAgICAgICAgcGFyc2VyLnZhbGlkYXRlKGtleSwgVGFwZXN0cnkuU0lNUExFX1BST1BFUlRZX05BTUVfUEFUVEVSTiwgIlNjcmlwdFBhcnNlci5pbnZhbGlkLWtleSIpOwotCi0gICAgICAgIExldFRva2VuIHRva2VuID0gbmV3IExldFRva2VuKGtleSwgdW5pcXVlRmxhZywgcGFyc2VyLmdldExvY2F0aW9uKCkpOwotCi0gICAgICAgIGFkZFRvUGFyZW50KHBhcnNlciwgdG9rZW4pOwotCi0gICAgICAgIHBhcnNlci5wdXNoKHRva2VuKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBlbmRFbGVtZW50KFJ1bGVEaXJlY3RlZFBhcnNlciBwYXJzZXIpCi0gICAgewotICAgICAgICBwYXJzZXIucG9wKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvc2NyaXB0L0xldFRva2VuLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvc2NyaXB0L0xldFRva2VuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1NjFlYzQuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3NjcmlwdC9MZXRUb2tlbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuc2NyaXB0OwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUxvY2F0aW9uOwotCi0vKioKLSAqICBBbGxvd3MgZm9yIHRoZSBjcmVhdGlvbiBvZiBuZXcgc3ltYm9scyB0aGF0IGNhbiBiZSB1c2VkIGluIHRoZSBzY3JpcHQKLSAqICBvciByZXR1cm5lZCB0byB0aGUgY2FsbGVyLgotICoKLSAqICA8cD5UaGUgJmx0O2xldCZndDsgdGFnIHdyYXBzIGFyb3VuZCBzdGF0aWMgdGV4dCBhbmQgJmx0O2luc2VydCZndDsKLSAqICBlbGVtZW50cy4gIFRoZSByZXN1bHRzIGFyZSB0cmltbWVkLgotICoKLSAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiAgQHZlcnNpb24gJElkJAotICogIEBzaW5jZSAwLjIuOQotICogCi0gKiovCi0KLWNsYXNzIExldFRva2VuIGV4dGVuZHMgQWJzdHJhY3RUb2tlbgotewotICAgIHByaXZhdGUgU3RyaW5nIF9rZXk7Ci0gICAgcHJpdmF0ZSBib29sZWFuIF91bmlxdWU7Ci0gICAgcHJpdmF0ZSBpbnQgX2J1ZmZlckxlbmd0aEhpZ2h3YXRlciA9IDIwOwotCi0gICAgcHVibGljIExldFRva2VuKFN0cmluZyBrZXksIGJvb2xlYW4gdW5pcXVlLCBJTG9jYXRpb24gbG9jYXRpb24pCi0gICAgewotICAgICAgICBzdXBlcihsb2NhdGlvbik7Ci0KLSAgICAgICAgX2tleSA9IGtleTsKLSAgICAgICAgX3VuaXF1ZSA9IHVuaXF1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZShTdHJpbmdCdWZmZXIgYnVmZmVyLCBTY3JpcHRTZXNzaW9uIHNlc3Npb24pCi0gICAgewotICAgICAgICBpZiAoYnVmZmVyICE9IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0KLSAgICAgICAgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihfYnVmZmVyTGVuZ3RoSGlnaHdhdGVyKTsKLQotICAgICAgICB3cml0ZUNoaWxkcmVuKGJ1ZmZlciwgc2Vzc2lvbik7Ci0KLSAgICAgICAgLy8gU3RvcmUgdGhlIHN5bWJvbCBiYWNrIGludG8gdGhlIHJvb3Qgc2V0IG9mIHN5bWJvbHMuCi0KLSAgICAgICAgTWFwIHN5bWJvbHMgPSBzZXNzaW9uLmdldFN5bWJvbHMoKTsKLQotICAgICAgICBTdHJpbmcgdmFsdWUgPSBidWZmZXIudG9TdHJpbmcoKS50cmltKCk7Ci0KLSAgICAgICAgaWYgKF91bmlxdWUpCi0gICAgICAgICAgICB2YWx1ZSA9IHNlc3Npb24uZ2V0UHJvY2Vzc29yKCkuZ2V0VW5pcXVlU3RyaW5nKHZhbHVlKTsKLQotICAgICAgICBzeW1ib2xzLnB1dChfa2V5LCB2YWx1ZSk7Ci0KLSAgICAgICAgLy8gU3RvcmUgdGhlIGJ1ZmZlciBsZW5ndGggZnJvbSB0aGlzIHJ1biBmb3IgdGhlIG5leHQgcnVuLCBzaW5jZSBpdHMKLSAgICAgICAgLy8gZ29pbmcgdG8gYmUgYXBwcm94aW1hdGVseSB0aGUgcmlnaHQgc2l6ZS4KLQotICAgICAgICBfYnVmZmVyTGVuZ3RoSGlnaHdhdGVyID0gTWF0aC5tYXgoX2J1ZmZlckxlbmd0aEhpZ2h3YXRlciwgYnVmZmVyLmxlbmd0aCgpKTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3NjcmlwdC9QYXJzZWRTY3JpcHQuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9zY3JpcHQvUGFyc2VkU2NyaXB0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0ZTcwMzYuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3NjcmlwdC9QYXJzZWRTY3JpcHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LnNjcmlwdDsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklMb2NhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZXF1ZXN0Q3ljbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVzb3VyY2VMb2NhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklTY3JpcHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JU2NyaXB0UHJvY2Vzc29yOwotCi0vKioKLSAqICBBIHRvcCBsZXZlbCBjb250YWluZXIgZm9yIGEgbnVtYmVyIG9mIHtAbGluayBJU2NyaXB0VG9rZW4gc2NyaXB0IHRva2Vuc30uCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQHNpbmNlIDAuMi45Ci0gKiAKLSAqKi8KLQotcHVibGljIGNsYXNzIFBhcnNlZFNjcmlwdCBleHRlbmRzIEFic3RyYWN0VG9rZW4gaW1wbGVtZW50cyBJU2NyaXB0Ci17Ci0gICAgcHJpdmF0ZSBJUmVzb3VyY2VMb2NhdGlvbiBfc2NyaXB0TG9jYXRpb247Ci0KLSAgICBwdWJsaWMgUGFyc2VkU2NyaXB0KElMb2NhdGlvbiBsb2NhdGlvbikKLSAgICB7Ci0gCQlzdXBlcihsb2NhdGlvbik7Ci0gCQkKLSAJCV9zY3JpcHRMb2NhdGlvbiA9IGxvY2F0aW9uLmdldFJlc291cmNlTG9jYXRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSVJlc291cmNlTG9jYXRpb24gZ2V0U2NyaXB0TG9jYXRpb24oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9zY3JpcHRMb2NhdGlvbjsKLSAgICB9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSB7QGxpbmsgU2NyaXB0U2Vzc2lvbn0gYW5kIGludm9rZXMgCi0JICoge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkuc2NyaXB0LkFic3RyYWN0VG9rZW4jd3JpdGVDaGlsZHJlbihqYXZhLmxhbmcuU3RyaW5nQnVmZmVyLCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnNjcmlwdC5TY3JpcHRTZXNzaW9uKX0uCi0JICovCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZShJUmVxdWVzdEN5Y2xlIGN5Y2xlLCBJU2NyaXB0UHJvY2Vzc29yIHByb2Nlc3NvciwgTWFwIHN5bWJvbHMpCi0gICAgewotICAgICAgICBTY3JpcHRTZXNzaW9uIHNlc3Npb24gPSBuZXcgU2NyaXB0U2Vzc2lvbihfc2NyaXB0TG9jYXRpb24sIGN5Y2xlLCBwcm9jZXNzb3IsIHN5bWJvbHMpOwotCQl3cml0ZUNoaWxkcmVuKG51bGwsIHNlc3Npb24pOwotICAgIH0KLSAgICAKLSAgICAvKiogCi0gICAgICogRG9lcyBub3RoaW5nOyBuZXZlciBpbnZva2VkLiAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB3cml0ZShTdHJpbmdCdWZmZXIgYnVmZmVyLCBTY3JpcHRTZXNzaW9uIHNlc3Npb24pCi0gICAgewotCi0gICAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3NjcmlwdC9TY3JpcHRQYXJzZXIuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9zY3JpcHQvU2NyaXB0UGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlZmUwZGUuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3NjcmlwdC9TY3JpcHRQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5zY3JpcHQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZXNvdXJjZUxvY2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlc291cmNlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JU2NyaXB0OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkudXRpbC54bWwuRG9jdW1lbnRQYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnV0aWwueG1sLlJ1bGVEaXJlY3RlZFBhcnNlcjsKLQotLyoqCi0gKiAgUGFyc2VzIGEgVGFwZXN0cnkgU2NyaXB0LCBhbiBYTUwgZmlsZSBkZWZpbmVkIGJ5IG9uZSBvZiB0aGUgZm9sbG93aW5nCi0gKiAgcHVibGljIGlkZW50aWZpZXJzOgotICogIDx1bD4KLSAqICA8bGk+PGNvZGU+LS8vUHJpbWl4IFNvbHV0aW9ucy8vVGFwZXN0cnkgU2NyaXB0IDEuMC8vRU48L2NvZGU+PC9saT4gCi0gKiAgPGxpPjxjb2RlPi0vL0hvd2FyZCBTaGlwLy9UYXBlc3RyeSBTY3JpcHQgMS4xLy9FTjwvY29kZT48L2xpPgotICogIDxsaT48Y29kZT4tLy9Ib3dhcmQgTGV3aXMgU2hpcC8vVGFwZXN0cnkgU2NyaXB0IDEuMi8vRU48L2NvZGU+PC9saT4KLSAqIC4KLSAqCi0gKiAgPHA+VGhlIHZlcnNpb24gMS4xLCBpcyBsYXJnZWx5IGJhY2t3YXJkcyBjb21wYXRpYmxlIHRvIHRoZQotICogIG9sZCBzY3JpcHQsIGJ1dCBhZGRzIGEgbnVtYmVyIG9mIG5ldyBmZWF0dXJlcyAoaWYsIGlmLW5vdCwgZm9yZWFjaAotICogIGFuZCB0aGUgdXNlIG9mIHByb3BlcnR5IHBhdGhzIHdpdGggaW5zZXJ0KS4KLSAqIAotICogIDxwPlZlcnNpb24gMS4yIHJlbW92ZXMgdGhlICZsdDtpbnNlcnQmZ3Q7IGVsZW1lbnQsIHVzaW5nIGFuIEFudC1saWtlCi0gKiAgc3ludGF4ICg8Y29kZT4kezxpPmV4cHJlc3Npb248L2k+fTwvY29kZT4pLiAgSXQgYWxzbyByZXBsYWNlcwotICogIHRoZSBhdHRyaWJ1dGUgbmFtZSA8Y29kZT5wcm9wZXJ0eS1wYXRoPC9jb2RlPiB3aXRoIDxjb2RlPmV4cHJlc3Npb248L2NvZGU+Ci0gKiAgKGJlY2F1c2UgT0dOTCBpcyB1c2VkKS4KLSAqCi0gKiAgPHA+QSBUYXBlc3RyeSBTY3JpcHQgaXMgdXNlZCwgaW4gYXNzb2NpYXRpb24gd2l0aCB0aGUgCi0gKiAge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkuaHRtbC5Cb2R5fSBhbmQvb3IgCi0gKiAge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkuaHRtbC5TY3JpcHR9IGNvbXBvbmVudHMsCi0gKiAgdG8gZ2VuZXJhdGUgSmF2YVNjcmlwdCBmb3IgdXNlIHdpdGggYSBUYXBlc3RyeSBjb21wb25lbnQuICBUd28gc2VwZXJhdGUgcGllY2VzCi0gKiAgb2YgSmF2YVNjcmlwdCBjYW4gYmUgZ2VuZXJhdGVkLiAgVGhlIGJvZHkgc2VjdGlvbiAoYXNzb2NpYXRlZCB3aXRoIHRoZSA8Y29kZT5ib2R5PC9jb2RlPgotICogIGVsZW1lbnQgb2YgdGhlIFhNTCBkb2N1bWVudCkgaXMgdHlwaWNhbGx5IHVzZWQgdG8gZGVmaW5lIEphdmFTY3JpcHQgZnVuY3Rpb25zCi0gKiAgKG1vc3Qgb2Z0ZW4sIGV2ZW50IGhhbmRsZXJzKS4gIFRoZSBpbml0aWFsaXphdGlvbiBzZWN0aW9uCi0gKiAgKGFzc29jaWF0ZWQgd2l0aCB0aGUgPGNvZGU+aW5pdGlhbGl6YXRpb248L2NvZGU+IGVsZW1lbnQgb2YgdGhlIFhNTCBkb2N1bWVudCkKLSAqICBpcyB1c2VkIHRvIGFkZCBKYXZhU2NyaXB0IHRoYXQgd2lsbCBiZSBldmFsdWF0ZWQgd2hlbiB0aGUgcGFnZSBmaW5pc2hlcyBsb2FkaW5nCi0gKiAgKGkuZS4sIGZyb20gdGhlIEhUTUwgJmx0O2JvZHkmZ3Q7IGVsZW1lbnQncyBvbkxvYWQgZXZlbnQgaGFuZGxlcikuCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAKLSAqKi8KLQotcHVibGljIGNsYXNzIFNjcmlwdFBhcnNlcgotewotICAgIHByaXZhdGUgUnVsZURpcmVjdGVkUGFyc2VyIF9wYXJzZXI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQ1JJUFRfRFREXzFfMF9QVUJMSUNfSUQgPQotICAgICAgICAiLS8vUHJpbWl4IFNvbHV0aW9ucy8vVGFwZXN0cnkgU2NyaXB0IDEuMC8vRU4iOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NSSVBUX0RURF8xXzFfUFVCTElDX0lEID0gIi0vL0hvd2FyZCBTaGlwLy9UYXBlc3RyeSBTY3JpcHQgMS4xLy9FTiI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQ1JJUFRfRFREXzFfMl9QVUJMSUNfSUQgPQotICAgICAgICAiLS8vSG93YXJkIExld2lzIFNoaXAvL1RhcGVzdHJ5IFNjcmlwdCAxLjIvL0VOIjsKLQotICAgIC8qKiBAc2luY2UgMy4wICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NSSVBUX0RURF8zXzBfUFVCTElDX0lEID0KLSAgICAgICAgIi0vL0FwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLy9UYXBlc3RyeSBTY3JpcHQgU3BlY2lmaWNhdGlvbiAzLjAvL0VOIjsKLQotICAgIHB1YmxpYyBTY3JpcHRQYXJzZXIoSVJlc291cmNlUmVzb2x2ZXIgcmVzb2x2ZXIpCi0gICAgewotICAgICAgICBfcGFyc2VyID0gbmV3IFJ1bGVEaXJlY3RlZFBhcnNlcigpOwotCi0gICAgICAgIF9wYXJzZXIucmVnaXN0ZXJFbnRpdHkoCi0gICAgICAgICAgICBTQ1JJUFRfRFREXzFfMF9QVUJMSUNfSUQsCi0gICAgICAgICAgICAiL29yZy9hcGFjaGUvdGFwZXN0cnkvc2NyaXB0L1NjcmlwdF8xXzAuZHRkIik7Ci0gICAgICAgIF9wYXJzZXIucmVnaXN0ZXJFbnRpdHkoCi0gICAgICAgICAgICBTQ1JJUFRfRFREXzFfMV9QVUJMSUNfSUQsCi0gICAgICAgICAgICAiL29yZy9hcGFjaGUvdGFwZXN0cnkvc2NyaXB0L1NjcmlwdF8xXzEuZHRkIik7Ci0gICAgICAgIF9wYXJzZXIucmVnaXN0ZXJFbnRpdHkoCi0gICAgICAgICAgICBTQ1JJUFRfRFREXzFfMl9QVUJMSUNfSUQsCi0gICAgICAgICAgICAiL29yZy9hcGFjaGUvdGFwZXN0cnkvc2NyaXB0L1NjcmlwdF8xXzIuZHRkIik7Ci0gICAgICAgIF9wYXJzZXIucmVnaXN0ZXJFbnRpdHkoCi0gICAgICAgICAgICBTQ1JJUFRfRFREXzNfMF9QVUJMSUNfSUQsCi0gICAgICAgICAgICAiL29yZy9hcGFjaGUvdGFwZXN0cnkvc2NyaXB0L1NjcmlwdF8zXzAuZHRkIik7Ci0KLSAgICAgICAgX3BhcnNlci5hZGRSdWxlKCJzY3JpcHQiLCBuZXcgU2NyaXB0UnVsZSgpKTsKLSAgICAgICAgX3BhcnNlci5hZGRSdWxlKCJsZXQiLCBuZXcgTGV0UnVsZSgpKTsKLSAgICAgICAgX3BhcnNlci5hZGRSdWxlKCJzZXQiLCBuZXcgU2V0UnVsZSgpKTsKLSAgICAgICAgX3BhcnNlci5hZGRSdWxlKCJpbmNsdWRlLXNjcmlwdCIsIG5ldyBJbmNsdWRlU2NyaXB0UnVsZSgpKTsKLSAgICAgICAgX3BhcnNlci5hZGRSdWxlKCJpbnB1dC1zeW1ib2wiLCBuZXcgSW5wdXRTeW1ib2xSdWxlKHJlc29sdmVyKSk7Ci0gICAgICAgIF9wYXJzZXIuYWRkUnVsZSgiYm9keSIsIG5ldyBCb2R5UnVsZSgpKTsKLSAgICAgICAgX3BhcnNlci5hZGRSdWxlKCJpbml0aWFsaXphdGlvbiIsIG5ldyBJbml0UnVsZSgpKTsKLSAgICAgICAgX3BhcnNlci5hZGRSdWxlKCJpZiIsIG5ldyBJZlJ1bGUodHJ1ZSkpOwotICAgICAgICBfcGFyc2VyLmFkZFJ1bGUoImlmLW5vdCIsIG5ldyBJZlJ1bGUoZmFsc2UpKTsKLSAgICAgICAgX3BhcnNlci5hZGRSdWxlKCJmb3JlYWNoIiwgbmV3IEZvcmVhY2hSdWxlKCkpOwotICAgICAgICBfcGFyc2VyLmFkZFJ1bGUoInVuaXF1ZSIsIG5ldyBVbmlxdWVSdWxlKCkpOwotCi0gICAgICAgIC8vIFRoaXMgd2lsbCBnbyBhd2F5IHdoZW4gdGhlIDEuMSBhbmQgZWFybGVyIERURHMgYXJlIHJldGlyZWQuCi0gICAgICAgIF9wYXJzZXIuYWRkUnVsZSgiaW5zZXJ0IiwgbmV3IEluc2VydFJ1bGUoKSk7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgUGFyc2VzIHRoZSBnaXZlbiBpbnB1dCBzdHJlYW0gdG8gcHJvZHVjZSBhIHBhcnNlZCBzY3JpcHQsCi0gICAgICogIHJlYWR5IHRvIGV4ZWN1dGUuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgSVNjcmlwdCBwYXJzZShJUmVzb3VyY2VMb2NhdGlvbiByZXNvdXJjZUxvY2F0aW9uKSB0aHJvd3MgRG9jdW1lbnRQYXJzZUV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuIChJU2NyaXB0KSBfcGFyc2VyLnBhcnNlKHJlc291cmNlTG9jYXRpb24pOwotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9zY3JpcHQvU2NyaXB0UnVsZS5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3NjcmlwdC9TY3JpcHRSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlY2NhZDguLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3NjcmlwdC9TY3JpcHRSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5zY3JpcHQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnV0aWwueG1sLkJhc2VSdWxlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkudXRpbC54bWwuUnVsZURpcmVjdGVkUGFyc2VyOwotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7Ci0KLS8qKgotICogUnVsZSBmb3IgJmx0O3NjcmlwdCZndDsgZWxlbWVudC4gIENyZWF0ZXMgYSB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5zY3JpcHQuUGFyc2VkU2NyaXB0fS4KLSAqCi0gKiBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiBAdmVyc2lvbiAkSWQkCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTY3JpcHRSdWxlIGV4dGVuZHMgQmFzZVJ1bGUKLXsKLQotICAgIHB1YmxpYyB2b2lkIGVuZEVsZW1lbnQoUnVsZURpcmVjdGVkUGFyc2VyIHBhcnNlcikKLSAgICB7Ci0gICAgICAgIHBhcnNlci5wb3AoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoUnVsZURpcmVjdGVkUGFyc2VyIHBhcnNlciwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKQotICAgIHsKLSAgICAgICAgUGFyc2VkU2NyaXB0IHNjcmlwdCA9IG5ldyBQYXJzZWRTY3JpcHQocGFyc2VyLmdldExvY2F0aW9uKCkpOwotCi0gICAgICAgIHBhcnNlci5wdXNoKHNjcmlwdCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvc2NyaXB0L1NjcmlwdFNlc3Npb24uamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9zY3JpcHQvU2NyaXB0U2Vzc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGRhZTA2Li4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9zY3JpcHQvU2NyaXB0U2Vzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuc2NyaXB0OwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlcXVlc3RDeWNsZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZXNvdXJjZUxvY2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVNjcmlwdFByb2Nlc3NvcjsKLQotLyoqCi0gKiAgVGhlIHJlc3VsdCBvZiBleGVjdXRpbmcgYSBzY3JpcHQsIHRoZSBzZXNzaW9uIGlzIHVzZWQgZHVyaW5nIHRoZSBwYXJzaW5nCi0gKiAgcHJvY2VzcyBhcyB3ZWxsLiAgRm9sbG93aW5nIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LklTY3JpcHQjZXhlY3V0ZShvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZXF1ZXN0Q3ljbGUsIG9yZy5hcGFjaGUudGFwZXN0cnkuSVNjcmlwdFByb2Nlc3NvciwgamF2YS51dGlsLk1hcCl9LCB0aGUgc2Vzc2lvbgotICogIHByb3ZpZGVzIGFjY2VzcyB0byBvdXRwdXQgc3ltYm9scyBhcyB3ZWxsIGFzIHRoZSBib2R5IGFuZCBpbml0aWFsaXphdGlvbgotICogIGJsb2NrcyBjcmVhdGVkIGJ5IHRoZSBzY3JpcHQgdG9rZW5zLgotICoKLSAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiAgQHZlcnNpb24gJElkJAotICogIEBzaW5jZSAwLjIuOQotICogCi0gKiovCi0KLXB1YmxpYyBjbGFzcyBTY3JpcHRTZXNzaW9uCi17Ci0gICAgcHJpdmF0ZSBJUmVxdWVzdEN5Y2xlIF9jeWNsZTsKLSAgICBwcml2YXRlIElTY3JpcHRQcm9jZXNzb3IgX3Byb2Nlc3NvcjsKLSAgICBwcml2YXRlIElSZXNvdXJjZUxvY2F0aW9uIF9zY3JpcHRMb2NhdGlvbjsKLSAgICBwcml2YXRlIE1hcCBfc3ltYm9sczsKLQotICAgIHB1YmxpYyBTY3JpcHRTZXNzaW9uKAotICAgICAgICBJUmVzb3VyY2VMb2NhdGlvbiBzY3JpcHRMb2NhdGlvbiwKLSAgICAgICAgSVJlcXVlc3RDeWNsZSBjeWNsZSwKLSAgICAgICAgSVNjcmlwdFByb2Nlc3NvciBwcm9jZXNzb3IsCi0gICAgICAgIE1hcCBzeW1ib2xzKQotICAgIHsKLSAgICAgICAgX3NjcmlwdExvY2F0aW9uID0gc2NyaXB0TG9jYXRpb247Ci0gICAgICAgIF9jeWNsZSA9IGN5Y2xlOwotICAgICAgICBfcHJvY2Vzc29yID0gcHJvY2Vzc29yOwotICAgICAgICBfc3ltYm9scyA9IHN5bWJvbHM7Ci0gICAgfQotCi0gICAgcHVibGljIElSZXNvdXJjZUxvY2F0aW9uIGdldFNjcmlwdFBhdGgoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9zY3JpcHRMb2NhdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWFwIGdldFN5bWJvbHMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9zeW1ib2xzOwotICAgIH0KLQotCXB1YmxpYyBJUmVxdWVzdEN5Y2xlIGdldFJlcXVlc3RDeWNsZSgpCi0JewotCQlyZXR1cm4gX2N5Y2xlOwotCX0KLQotICAgIHB1YmxpYyBJU2NyaXB0UHJvY2Vzc29yIGdldFByb2Nlc3NvcigpCi0gICAgewotICAgICAgICByZXR1cm4gX3Byb2Nlc3NvcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgICB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLSAgICAgICAgYnVmZmVyLmFwcGVuZCgiU2NyaXB0U2Vzc2lvblsiKTsKLSAgICAgICAgYnVmZmVyLmFwcGVuZChfc2NyaXB0TG9jYXRpb24pOwotICAgICAgICBidWZmZXIuYXBwZW5kKCddJyk7Ci0KLSAgICAgICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvc2NyaXB0L1NjcmlwdF8xXzAuZHRkIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3NjcmlwdC9TY3JpcHRfMV8wLmR0ZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM5MWQ1ZC4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvc2NyaXB0L1NjcmlwdF8xXzAuZHRkCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tICRJZDogU2NyaXB0XzFfMC5kdGQsdiAxLjMgMjAwMi8wNS8wMiAxNzo1MjozOSBoc2hpcCBFeHAgJCAtLT4NCi08IS0tRFREIGZvciB0aGUgZmlsZXMgdXNlZCB3aXRoIHRoZSBTY3JpcHRHZW5lcmF0b3IgY2xhc3MgYW5kIFNjcmlwdCBjb21wb25lbnQuICBUaGlzIGlzIHJlY29nbml6ZWQgd2l0aCB0aGUgcHVibGljIGlkZW50aWZpZXI6DQotDQotCS0vL1ByaW1peCBTb2x1dGlvbnMvL1RhcGVzdHJ5IFNjcmlwdCAxLjAvL0VODQotDQotLS0+DQotDQotPCEtLQ0KLQ0KLUVsZW1lbnQ6IHNjcmlwdA0KLQ0KLVJvb3QgZWxlbWVudC4NCi0NCi0tLT4NCi0NCi08IUVMRU1FTlQgc2NyaXB0IChsZXQqLCBib2R5PywgaW5pdGlhbGl6YXRpb24/KT4NCi0NCi08IS0tDQotDQotRWxlbWVudDogbGV0DQotQ29udGFpbmVkIGJ5OiBzY3JpcHQNCi0NCi1Vc2VkIHRvIGNyZWF0ZSBhIG5ldyBzeW1ib2wuDQotDQotLS0+DQotDQotPCFFTEVNRU5UIGxldCAoI1BDREFUQSB8IGluc2VydCkqPg0KLTwhQVRUTElTVCBsZXQNCi0Ja2V5IENEQVRBICNSRVFVSVJFRA0KLT4NCi0NCi08IS0tDQotDQotRWxlbWVudDogYm9keQ0KLUNvbnRhaW5lZCBieTogc2NyaXB0DQotDQotQWxsb3dzIGEgbWl4IG9mIHRleHQgYW5kIGluc2VydCBlbGVtZW50cy4gIFRoaXMgdGV4dCBpcyBhZGRlZCB0bw0KLXRoZSBsYXJnZSBzY3JpcHRpbmcgYmxvY2sganVzdCBiZWZvcmUgdGhlIDxib2R5PiB0YWcuDQotLS0+DQotDQotPCFFTEVNRU5UIGJvZHkgKCNQQ0RBVEEgfCBpbnNlcnQpKj4NCi0NCi08IS0tDQotRWxlbWVudDogaW5pdGlhbGl6YXRpb24NCi1Db250YWluZWQgYnk6IHNjcmlwdA0KLQ0KLVRleHQgaW4gdGhpcyBibG9jayBpcyBhZGRlZCB0byB0aGUgZXZlbnQgaGFuZGxlciBmb3IgdGhlIDxib2R5Pg0KLXRhZydzIG9uTG9hZCBldmVudC4NCi0tLT4NCi0NCi08IUVMRU1FTlQgaW5pdGlhbGl6YXRpb24gKCNQQ0RBVEEgfCBpbnNlcnQpKj4NCi0NCi08IS0tDQotRWxlbWVudDogaW5zZXJ0DQotQ29udGFpbmVkIGJ5OiBib2R5LCBpbml0aWFsaXphdGlvbg0KLQ0KLUFsbG93cyBhbiBhcmJpdHJhcnkgc3ltYm9sIHRvIGJlIGluc2VydGVkLg0KLS0tPg0KLQ0KLTwhRUxFTUVOVCBpbnNlcnQgKCNQQ0RBVEEpPg0KLTwhQVRUTElTVCBpbnNlcnQNCi0Ja2V5IENEQVRBICNSRVFVSVJFRA0KLT4NCmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvc2NyaXB0L1NjcmlwdF8xXzEuZHRkIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3NjcmlwdC9TY3JpcHRfMV8xLmR0ZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTExNjI0Yy4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvc2NyaXB0L1NjcmlwdF8xXzEuZHRkCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPCEtLSAkSWQ6IFNjcmlwdF8xXzEuZHRkLHYgMS4zIDIwMDIvMDUvMDIgMTc6NTI6MzkgaHNoaXAgRXhwICQgLS0+DQotPCEtLQ0KLQ0KLURURCBmb3IgdGhlIGZpbGVzIHVzZWQgd2l0aCB0aGUgU2NyaXB0R2VuZXJhdG9yIGNsYXNzIGFuZCBTY3JpcHQgY29tcG9uZW50LiAgDQotVGhpcyBpcyByZWNvZ25pemVkIHdpdGggdGhlIHB1YmxpYyBpZGVudGlmaWVyOg0KLQ0KLQktLy9Ib3dhcmQgU2hpcC8vVGFwZXN0cnkgU2NyaXB0IDEuMS8vRU4NCi0NCi1UaGUgY2Fub25pY2FsIGxvY2F0aW9uIGZvciB0aGUgRFREIGlzOg0KLQ0KLQlodHRwOi8vdGFwZXN0cnkuc2YubmV0L2R0ZC9UYXBlc3RyeV8xXzEuZHRkDQotDQotVGhlIHJvb3QgZWxlbWVudCBpcyBhbHdheXMgc2NyaXB0Lg0KLQkNCi0tLT4NCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0NCi1FbnRpdHk6IGZ1bGwtY29udGVudA0KLQ0KLUlkZW50aWZpZXMgdGhlIGNvbnRlbnRzIG9mIG1vc3Qgb2YgdGhlIG90aGVyIGVsZW1lbnRzLg0KLQ0KLS0tPg0KLTwhRU5USVRZICUgZnVsbC1jb250ZW50ICIoI1BDREFUQSB8IGZvcmVhY2ggfCBpbnNlcnQgfCBpZiB8IGlmLW5vdCkqIj4NCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0NCi1FbGVtZW50OiBib2R5DQotQ29udGFpbmVkIGJ5OiBzY3JpcHQNCi0NCi1BbGxvd3MgYSBtaXggb2YgdGV4dCBhbmQgaW5zZXJ0IGVsZW1lbnRzLiAgVGhpcyB0ZXh0IGlzIGFkZGVkIHRvDQotdGhlIGxhcmdlIHNjcmlwdGluZyBibG9jayBqdXN0IGJlZm9yZSB0aGUgPGJvZHk+IHRhZy4NCi0tLT4NCi08IUVMRU1FTlQgYm9keSAlZnVsbC1jb250ZW50Oz4NCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0NCi1FbGVtZW50OiBmb3JlYWNoDQotQXBwZWFycyBpbjogJWZ1bGwtY29udGVudDsNCi0NCi1JdGVyYXRlcyBvdmVyIGEgbGlzdCBvZiBpdGVtczsgdGhpcyBpcyBtb2RlbGVkIGFmdGVyIHRoZQ0KLUZvcmVhY2ggY29tcG9uZW50LiAgTm8gaXRlcmF0aW9uIG9jY3VycyBpZiB0aGUgdmFsdWUNCi1mcm9tIHRoZSBwcm9wZXJ0eSBwYXRoIGlzIG51bGwuDQotDQotQXR0cmlidXRlczoNCi0gIGtleTogRGVmaW5lcyB0aGUgc3ltYm9sIGludG8gd2hpY2ggZWFjaCBzdWNjZXNpdmUgdmFsdWUgaXMgc3RvcmVkLg0KLSAgcHJvcGVydHktcGF0aDogVGhlIHNvdXJjZSBvZiB2YWx1ZXMuDQotLS0+DQotPCFFTEVNRU5UIGZvcmVhY2ggJWZ1bGwtY29udGVudDs+DQotPCFBVFRMSVNUIGZvcmVhY2gNCi0gIGtleSBDREFUQSAjUkVRVUlSRUQNCi0gIHByb3BlcnR5LXBhdGggQ0RBVEEgI1JFUVVJUkVEDQotPg0KLQ0KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLUVsZW1lbnQ6IGluY2x1ZGUtc2NyaXB0DQotQ29udGFpbmVkIGJ5OiBzY3JpcHQNCi0NCi1JbnNlcnRzIGEgcmVmZXJlbmNlIHRvIGFuIGV4dGVybmFsLCBzdGF0aWMsIEphdmFTY3JpcHQgZmlsZS4NCi0NCi1BdHRyaWJ1dGVzOg0KLSAgcmVzb3VyY2UtcGF0aDogVGhlIHBhdGggdG8gdGhlIHNjcmlwdCB3aXRoaW4gdGhlIGNsYXNzcGF0aC4NCi0tLT4NCi08IUVMRU1FTlQgaW5jbHVkZS1zY3JpcHQgRU1QVFk+DQotPCFBVFRMSVNUIGluY2x1ZGUtc2NyaXB0DQotICByZXNvdXJjZS1wYXRoIENEQVRBICNSRVFVSVJFRA0KLT4NCi0NCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0NCi1FbGVtZW50OiBpZg0KLUFwcGVhcnMgaW46ICVmdWxsLWNvbnRlbnQ7DQotDQotQ3JlYXRlcyBhIGNvbmRpdGlvbmFsIHBvcnRpb24gb2YgdGhlIHNjcmlwdDsgVGhlIGJvZHkgb2YgdGhlIGVsZW1lbnQgDQotaXMgb25seSBpbmNsdWRlZCBpZiB0aGUgcHJvcGVydHktcGF0aCBldmF1bGF0ZXMgdG8gdHJ1ZS4NCi0NCi0tLT4NCi08IUVMRU1FTlQgaWYgJWZ1bGwtY29udGVudDs+DQotPCFBVFRMSVNUIGlmDQotICBwcm9wZXJ0eS1wYXRoIENEQVRBICNSRVFVSVJFRA0KLT4NCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0NCi1FbGVtZW50OiBpZi1ub3QNCi1BcHBlYXJzIGluOiAlZnVsbC1jb250ZW50Ow0KLQ0KLUNyZWF0ZXMgYSBjb25kaXRpb25hbCBwb3J0aW9uIG9mIHRoZSBzY3JpcHQ7IFRoZSBib2R5IG9mIHRoZSBlbGVtZW50IA0KLWlzIG9ubHkgaW5jbHVkZWQgaWYgdGhlIHByb3BlcnR5LXBhdGggZXZhdWxhdGVzIHRvIGZhbHNlLg0KLQ0KLS0tPg0KLTwhRUxFTUVOVCBpZi1ub3QgJWZ1bGwtY29udGVudDs+DQotPCFBVFRMSVNUIGlmLW5vdA0KLSAgcHJvcGVydHktcGF0aCBDREFUQSAjUkVRVUlSRUQNCi0+DQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotRWxlbWVudDogaW5pdGlhbGl6YXRpb24NCi1Db250YWluZWQgYnk6IHNjcmlwdA0KLQ0KLVRleHQgaW4gdGhpcyBibG9jayBpcyBhZGRlZCB0byB0aGUgZXZlbnQgaGFuZGxlciBmb3IgdGhlIDxib2R5Pg0KLXRhZydzIG9uTG9hZCBldmVudC4NCi0tLT4NCi08IUVMRU1FTlQgaW5pdGlhbGl6YXRpb24gJWZ1bGwtY29udGVudDs+DQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotRWxlbWVudDogaW5zZXJ0DQotQ29udGFpbmVkIGJ5OiBib2R5LCBpbml0aWFsaXphdGlvbg0KLQ0KLUFsbG93cyBhbiBhcmJpdHJhcnkgc3ltYm9sIHRvIGJlIGluc2VydGVkLg0KLQ0KLUF0dHJpYnV0ZXM6DQotICBwcm9wZXJ0eS1wYXRoOiBUaGUgcGF0aCB0byB0aGUgdmFsdWUgdG8gaW5zZXJ0Lg0KLS0tPg0KLTwhRUxFTUVOVCBpbnNlcnQgRU1QVFk+DQotPCFBVFRMSVNUIGluc2VydA0KLSAgcHJvcGVydHktcGF0aCBDREFUQSAjUkVRVUlSRUQNCi0+DQotDQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotDQotRWxlbWVudDogbGV0DQotQ29udGFpbmVkIGJ5OiBzY3JpcHQNCi0NCi1Vc2VkIHRvIGNyZWF0ZSBhIG5ldyBzeW1ib2wuDQotDQotLS0+DQotPCFFTEVNRU5UIGxldCAlZnVsbC1jb250ZW50Oz4NCi08IUFUVExJU1QgbGV0DQotICBrZXkgQ0RBVEEgI1JFUVVJUkVEDQotPg0KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLQ0KLUVsZW1lbnQ6IHNjcmlwdA0KLQ0KLVJvb3QgZWxlbWVudC4NCi0NCi1BbGxvd3MgemVybyBvciBtb3JlIGxldCBlbGVtZW50cyAodG8gZXN0YWJsaXNoIG5ldyBzeW1ib2xzKSwNCi1mb2xsb3dlZCBieSBhIGJvZHkgYW5kL29yIGluaXRpYWxpemF0aW9uIGVsZW1lbnQuDQotDQotLS0+DQotPCFFTEVNRU5UIHNjcmlwdCAoaW5jbHVkZS1zY3JpcHQqLCBsZXQqLCBib2R5PywgaW5pdGlhbGl6YXRpb24/KT4NCmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvc2NyaXB0L1NjcmlwdF8xXzIuZHRkIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3NjcmlwdC9TY3JpcHRfMV8yLmR0ZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTJlZjQ3Ni4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvc2NyaXB0L1NjcmlwdF8xXzIuZHRkCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPCEtLSAkSWQ6IFNjcmlwdF8xXzIuZHRkLHYgMS4zIDIwMDIvMDkvMTYgMTk6MzM6MDIgaHNoaXAgRXhwICQgLS0+DQotPCEtLQ0KLQ0KLURURCBmb3IgdGhlIGZpbGVzIHVzZWQgd2l0aCB0aGUgU2NyaXB0UGFyc2VyIGNsYXNzIGFuZCBTY3JpcHQgY29tcG9uZW50LiAgDQotVGhpcyBpcyByZWNvZ25pemVkIHdpdGggdGhlIHB1YmxpYyBpZGVudGlmaWVyOg0KLQ0KLQktLy9Ib3dhcmQgTGV3aXMgU2hpcC8vVGFwZXN0cnkgU2NyaXB0IDEuMi8vRU4NCi0NCi1UaGUgY2Fub25pY2FsIGxvY2F0aW9uIGZvciB0aGUgRFREIGlzOg0KLQ0KLQlodHRwOi8vdGFwZXN0cnkuc2YubmV0L2R0ZC9TY3JpcHRfMV8yLmR0ZA0KLQ0KLVRoZSByb290IGVsZW1lbnQgaXMgYWx3YXlzIHNjcmlwdC4NCi0JDQotLS0+DQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotDQotRW50aXR5OiBmdWxsLWNvbnRlbnQNCi0NCi1JZGVudGlmaWVzIHRoZSBjb250ZW50cyBvZiBtb3N0IG9mIHRoZSBvdGhlciBlbGVtZW50cy4NCi0NCi0tLT4NCi08IUVOVElUWSAlIGZ1bGwtY29udGVudCAiKCNQQ0RBVEEgfCBmb3JlYWNoIHwgaWYgfCBpZi1ub3QpKiI+DQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotDQotRWxlbWVudDogYm9keQ0KLUNvbnRhaW5lZCBieTogc2NyaXB0DQotDQotQWxsb3dzIGEgbWl4IG9mIHRleHQgYW5kIGluc2VydCBlbGVtZW50cy4gIFRoaXMgdGV4dCBpcyBhZGRlZCB0bw0KLXRoZSBsYXJnZSBzY3JpcHRpbmcgYmxvY2sganVzdCBiZWZvcmUgdGhlIDxib2R5PiB0YWcuDQotLS0+DQotPCFFTEVNRU5UIGJvZHkgJWZ1bGwtY29udGVudDs+DQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotDQotRWxlbWVudDogZm9yZWFjaA0KLUFwcGVhcnMgaW46ICVmdWxsLWNvbnRlbnQ7DQotDQotSXRlcmF0ZXMgb3ZlciBhIGxpc3Qgb2YgaXRlbXM7IHRoaXMgaXMgbW9kZWxlZCBhZnRlciB0aGUNCi1Gb3JlYWNoIGNvbXBvbmVudC4gIE5vIGl0ZXJhdGlvbiBvY2N1cnMgaWYgdGhlIHZhbHVlDQotZnJvbSB0aGUgcHJvcGVydHkgcGF0aCBpcyBudWxsLg0KLQ0KLUF0dHJpYnV0ZXM6DQotICBrZXk6IERlZmluZXMgdGhlIHN5bWJvbCBpbnRvIHdoaWNoIGVhY2ggc3VjY2VzaXZlIHZhbHVlIGlzIHN0b3JlZC4NCi0gIGV4cHJlc3Npb246IFRoZSBzb3VyY2Ugb2YgdmFsdWVzLCBhcyBhbiBPR05MIGV4cHJlc3Npb24gcm9vdGVkIGluIHRoZSBzeW1ib2xzIE1hcC4NCi0tLT4NCi08IUVMRU1FTlQgZm9yZWFjaCAlZnVsbC1jb250ZW50Oz4NCi08IUFUVExJU1QgZm9yZWFjaA0KLSAga2V5IENEQVRBICNSRVFVSVJFRA0KLSAgZXhwcmVzc2lvbiBDREFUQSAjUkVRVUlSRUQNCi0+DQotDQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotRWxlbWVudDogaW5jbHVkZS1zY3JpcHQNCi1Db250YWluZWQgYnk6IHNjcmlwdA0KLQ0KLUluc2VydHMgYSByZWZlcmVuY2UgdG8gYW4gZXh0ZXJuYWwsIHN0YXRpYywgSmF2YVNjcmlwdCBmaWxlLg0KLQ0KLUF0dHJpYnV0ZXM6DQotICByZXNvdXJjZS1wYXRoOiBUaGUgcGF0aCB0byB0aGUgc2NyaXB0IHdpdGhpbiB0aGUgY2xhc3NwYXRoLg0KLS0tPg0KLTwhRUxFTUVOVCBpbmNsdWRlLXNjcmlwdCBFTVBUWT4NCi08IUFUVExJU1QgaW5jbHVkZS1zY3JpcHQNCi0gIHJlc291cmNlLXBhdGggQ0RBVEEgI1JFUVVJUkVEDQotPg0KLQ0KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLQ0KLUVsZW1lbnQ6IGlmDQotQXBwZWFycyBpbjogJWZ1bGwtY29udGVudDsNCi0NCi1DcmVhdGVzIGEgY29uZGl0aW9uYWwgcG9ydGlvbiBvZiB0aGUgc2NyaXB0OyBUaGUgYm9keSBvZiB0aGUgZWxlbWVudCANCi1pcyBvbmx5IGluY2x1ZGVkIGlmIHRoZSBleHByZXNzaW9uIGV2YXVsYXRlcyB0byB0cnVlLg0KLQ0KLUF0dHJpYnV0ZXM6DQotICBleHByZXNzaW9uOiBUaGUgdHJpZ2dlciBleHByZXNzaW9uLCBhcyBhbiBPR05MIGV4cHJlc3Npb24gcm9vdGVkIGluIA0KLSAgICB0aGUgc3ltYm9scyBNYXAuDQotDQotLS0+DQotPCFFTEVNRU5UIGlmICVmdWxsLWNvbnRlbnQ7Pg0KLTwhQVRUTElTVCBpZg0KLSAgZXhwcmVzc2lvbiBDREFUQSAjUkVRVUlSRUQNCi0+DQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotDQotRWxlbWVudDogaWYtbm90DQotQXBwZWFycyBpbjogJWZ1bGwtY29udGVudDsNCi0NCi1DcmVhdGVzIGEgY29uZGl0aW9uYWwgcG9ydGlvbiBvZiB0aGUgc2NyaXB0OyBUaGUgYm9keSBvZiB0aGUgZWxlbWVudCANCi1pcyBvbmx5IGluY2x1ZGVkIGlmIHRoZSBwcm9wZXJ0eS1wYXRoIGV2YXVsYXRlcyB0byBmYWxzZS4NCi0NCi1BdHRyaWJ1dGVzOg0KLSAgZXhwcmVzc2lvbjogVGhlIHRyaWdnZXIgZXhwcmVzc2lvbiwgYXMgYW4gT0dOTCBleHByZXNzaW9uIHJvb3RlZCBpbiANCi0gICAgdGhlIHN5bWJvbHMgTWFwLg0KLQ0KLS0tPg0KLTwhRUxFTUVOVCBpZi1ub3QgJWZ1bGwtY29udGVudDs+DQotPCFBVFRMSVNUIGlmLW5vdA0KLSAgZXhwcmVzc2lvbiBDREFUQSAjUkVRVUlSRUQNCi0+DQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotRWxlbWVudDogaW5pdGlhbGl6YXRpb24NCi1Db250YWluZWQgYnk6IHNjcmlwdA0KLQ0KLVRleHQgaW4gdGhpcyBibG9jayBpcyBhZGRlZCB0byB0aGUgZXZlbnQgaGFuZGxlciBmb3IgdGhlIDxib2R5Pg0KLXRhZydzIG9uTG9hZCBldmVudC4NCi0tLT4NCi08IUVMRU1FTlQgaW5pdGlhbGl6YXRpb24gJWZ1bGwtY29udGVudDs+DQotDQotDQotDQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotRWxlbWVudDogaW5wdXQtc3ltYm9sDQotQ29udGFpbmVkIGJ5OiBzY3JpcHQNCi0NCi1EZWZpbmVzIGFuIGlucHV0IHN5bWJvbCB1c2VkIGJ5IHRoZSBzY3JpcHQuDQotQXR0cmlidXRlczoNCi0gIGtleTogVGhlIG5hbWUgb2YgdGhlIHN5bWJvbC4NCi0gIGNsYXNzOiAgSWYgc3BlY2lmaWVkLCB0aGUgZXhlY3RlZCBjbGFzcyBvciBpbnRlcmZhY2UgZm9yIHRoZSBzeW1ib2wuDQotICByZXF1aXJlZDogSWYgeWVzLCB0aGVuIHRoZSBzeW1ib2wgbXVzdCBiZSBub24tbnVsbC4NCi0tLT4NCi0NCi08IUVMRU1FTlQgaW5wdXQtc3ltYm9sIEVNUFRZPg0KLTwhQVRUTElTVCBpbnB1dC1zeW1ib2wNCi0gIGtleSBDREFUQSAjUkVRVUlSRUQNCi0gIGNsYXNzIENEQVRBICNJTVBMSUVEDQotICByZXF1aXJlZCAoeWVzfG5vKSAibm8iDQotPg0KLQ0KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLQ0KLUVsZW1lbnQ6IGxldA0KLUNvbnRhaW5lZCBieTogc2NyaXB0DQotDQotVXNlZCB0byBjcmVhdGUgYSBuZXcgc3ltYm9sLg0KLQ0KLS0tPg0KLTwhRUxFTUVOVCBsZXQgJWZ1bGwtY29udGVudDs+DQotPCFBVFRMSVNUIGxldA0KLSAga2V5IENEQVRBICNSRVFVSVJFRA0KLT4NCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0NCi1FbGVtZW50OiBzY3JpcHQNCi0NCi1Sb290IGVsZW1lbnQuDQotDQotQWxsb3dzIHplcm8gb3IgbW9yZSBsZXQgZWxlbWVudHMgKHRvIGVzdGFibGlzaCBuZXcgc3ltYm9scyksDQotZm9sbG93ZWQgYnkgYSBib2R5IGFuZC9vciBpbml0aWFsaXphdGlvbiBlbGVtZW50Lg0KLQ0KLS0tPg0KLTwhRUxFTUVOVCBzY3JpcHQgKGluY2x1ZGUtc2NyaXB0KiwgaW5wdXQtc3ltYm9sKiwgDQotCShsZXQgfCBzZXQpKiwgYm9keT8sIGluaXRpYWxpemF0aW9uPyk+DQotDQotDQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotDQotRWxlbWVudDogc2V0DQotQ29udGFpbmVkIGJ5OiBzY3JpcHQNCi0NCi1DcmVhdGVzIGEgbmV3IHN5bWJvbCBhcyB0aGUgcmVzdWx0IG9mIGV2YWx1YXRpbmcgYW4gT0dOTCBleHByZXNzaW9uLg0KLQ0KLS0tPg0KLTwhRUxFTUVOVCBzZXQgRU1QVFk+DQotPCFBVFRMSVNUIHNldA0KLSAga2V5IENEQVRBICNSRVFVSVJFRA0KLSAgZXhwcmVzc2lvbiBDREFUQSAjUkVRVUlSRUQNCi0+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3NjcmlwdC9TY3JpcHRfM18wLmR0ZCBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9zY3JpcHQvU2NyaXB0XzNfMC5kdGQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzNmE4NTcuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3NjcmlwdC9TY3JpcHRfM18wLmR0ZAorKysgL2Rldi9udWxsCkBAIC0xLDE5NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS0gJElkOiBTY3JpcHRfMV8yLmR0ZCx2IDEuMyAyMDAyLzA5LzE2IDE5OjMzOjAyIGhzaGlwIEV4cCAkIC0tPg0KLTwhLS0NCi0NCi1EVEQgZm9yIHRoZSBmaWxlcyB1c2VkIHdpdGggdGhlIFNjcmlwdFBhcnNlciBjbGFzcyBhbmQgU2NyaXB0IGNvbXBvbmVudC4gIA0KLVRoaXMgaXMgcmVjb2duaXplZCB3aXRoIHRoZSBwdWJsaWMgaWRlbnRpZmllcjoNCi0NCi0JLS8vQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24vL1RhcGVzdHJ5IFNjcmlwdCBTcGVjaWZpY2F0aW9uIDEuMy8vRU4NCi0NCi1UaGUgY2Fub25pY2FsIGxvY2F0aW9uIGZvciB0aGUgRFREIGlzOg0KLQ0KLQlodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL3RhcGVzdHJ5L2R0ZC9TY3JpcHRfMV8zLmR0ZA0KLQ0KLVRoZSByb290IGVsZW1lbnQgaXMgYWx3YXlzIHNjcmlwdC4NCi0JDQotVGhpcyBEVEQgaXMgYmFja3dhcmRzIGNvbXBhdGlibGUgd2l0aCB0aGUgMS4yIERURCwgd2l0aCB0aGUgZm9sbG93aW5nIGV4Y2VwdGlvbnM6DQotLSBBZGRpdGlvbiBvZiA8dW5pcXVlPiBlbGVtZW50DQotLSBBZGRpdGlvbiBvZiB1bmlxdWUgYXR0cmlidXRlIHRvIDxsZXQ+IGVsZW1lbnQNCi0tIEFkZGl0aW9uIG9mIGluZGV4IGF0dHJpYnV0ZSB0byA8Zm9yZWFjaD4gZWxlbWVudA0KLS0tPg0KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLQ0KLUVudGl0eTogZnVsbC1jb250ZW50DQotDQotSWRlbnRpZmllcyB0aGUgY29udGVudHMgb2YgbW9zdCBvZiB0aGUgb3RoZXIgZWxlbWVudHMuDQotDQotLS0+DQotPCFFTlRJVFkgJSBmdWxsLWNvbnRlbnQgIigjUENEQVRBIHwgZm9yZWFjaCB8IGlmIHwgaWYtbm90IHwgdW5pcXVlKSoiPg0KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLQ0KLUVsZW1lbnQ6IGJvZHkNCi1Db250YWluZWQgYnk6IHNjcmlwdA0KLQ0KLUFsbG93cyBhIG1peCBvZiB0ZXh0IGFuZCBpbnNlcnQgZWxlbWVudHMuICBUaGlzIHRleHQgaXMgYWRkZWQgdG8NCi10aGUgbGFyZ2Ugc2NyaXB0aW5nIGJsb2NrIGp1c3QgYmVmb3JlIHRoZSA8Ym9keT4gdGFnLg0KLS0tPg0KLTwhRUxFTUVOVCBib2R5ICVmdWxsLWNvbnRlbnQ7Pg0KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLQ0KLUVsZW1lbnQ6IGZvcmVhY2gNCi1BcHBlYXJzIGluOiAlZnVsbC1jb250ZW50Ow0KLQ0KLUl0ZXJhdGVzIG92ZXIgYSBsaXN0IG9mIGl0ZW1zOyB0aGlzIGlzIG1vZGVsZWQgYWZ0ZXIgdGhlDQotRm9yZWFjaCBjb21wb25lbnQuICBObyBpdGVyYXRpb24gb2NjdXJzIGlmIHRoZSB2YWx1ZQ0KLWZyb20gdGhlIHByb3BlcnR5IHBhdGggaXMgbnVsbC4NCi0NCi1BdHRyaWJ1dGVzOg0KLSAga2V5OiBEZWZpbmVzIHRoZSBzeW1ib2wgaW50byB3aGljaCBlYWNoIHN1Y2Nlc2l2ZSB2YWx1ZSBpcyBzdG9yZWQuDQotICBpbmRleDogRGVmaW5lcyB0aGUgc3ltYm9sIGludG8gd2hpY2ggdGhlIGluZGV4IG9mIHRoZSB2YWx1ZSBvZiB0aGUgY3VycmVudCBpdGVyYXRpb24gaXMgc3RvcmVkLg0KLSAgZXhwcmVzc2lvbjogVGhlIHNvdXJjZSBvZiB2YWx1ZXMsIGFzIGFuIE9HTkwgZXhwcmVzc2lvbiByb290ZWQgaW4gdGhlIHN5bWJvbHMgTWFwLg0KLS0tPg0KLTwhRUxFTUVOVCBmb3JlYWNoICVmdWxsLWNvbnRlbnQ7Pg0KLTwhQVRUTElTVCBmb3JlYWNoDQotICBrZXkgQ0RBVEEgI0lNUExJRUQNCi0gIGluZGV4IENEQVRBICNJTVBMSUVEDQotICBleHByZXNzaW9uIENEQVRBICNSRVFVSVJFRA0KLT4NCi0NCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi1FbGVtZW50OiBpbmNsdWRlLXNjcmlwdA0KLUNvbnRhaW5lZCBieTogc2NyaXB0DQotDQotSW5zZXJ0cyBhIHJlZmVyZW5jZSB0byBhbiBleHRlcm5hbCwgc3RhdGljLCBKYXZhU2NyaXB0IGZpbGUuDQotDQotQXR0cmlidXRlczoNCi0gIHJlc291cmNlLXBhdGg6IFRoZSBwYXRoIHRvIHRoZSBzY3JpcHQgd2l0aGluIHRoZSBjbGFzc3BhdGguDQotLS0+DQotPCFFTEVNRU5UIGluY2x1ZGUtc2NyaXB0IEVNUFRZPg0KLTwhQVRUTElTVCBpbmNsdWRlLXNjcmlwdA0KLSAgcmVzb3VyY2UtcGF0aCBDREFUQSAjUkVRVUlSRUQNCi0+DQotDQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotDQotRWxlbWVudDogaWYNCi1BcHBlYXJzIGluOiAlZnVsbC1jb250ZW50Ow0KLQ0KLUNyZWF0ZXMgYSBjb25kaXRpb25hbCBwb3J0aW9uIG9mIHRoZSBzY3JpcHQ7IFRoZSBib2R5IG9mIHRoZSBlbGVtZW50IA0KLWlzIG9ubHkgaW5jbHVkZWQgaWYgdGhlIGV4cHJlc3Npb24gZXZhdWxhdGVzIHRvIHRydWUuDQotDQotQXR0cmlidXRlczoNCi0gIGV4cHJlc3Npb246IFRoZSB0cmlnZ2VyIGV4cHJlc3Npb24sIGFzIGFuIE9HTkwgZXhwcmVzc2lvbiByb290ZWQgaW4gDQotICAgIHRoZSBzeW1ib2xzIE1hcC4NCi0NCi0tLT4NCi08IUVMRU1FTlQgaWYgJWZ1bGwtY29udGVudDs+DQotPCFBVFRMSVNUIGlmDQotICBleHByZXNzaW9uIENEQVRBICNSRVFVSVJFRA0KLT4NCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0NCi1FbGVtZW50OiBpZi1ub3QNCi1BcHBlYXJzIGluOiAlZnVsbC1jb250ZW50Ow0KLQ0KLUNyZWF0ZXMgYSBjb25kaXRpb25hbCBwb3J0aW9uIG9mIHRoZSBzY3JpcHQ7IFRoZSBib2R5IG9mIHRoZSBlbGVtZW50IA0KLWlzIG9ubHkgaW5jbHVkZWQgaWYgdGhlIHByb3BlcnR5LXBhdGggZXZhdWxhdGVzIHRvIGZhbHNlLg0KLQ0KLUF0dHJpYnV0ZXM6DQotICBleHByZXNzaW9uOiBUaGUgdHJpZ2dlciBleHByZXNzaW9uLCBhcyBhbiBPR05MIGV4cHJlc3Npb24gcm9vdGVkIGluIA0KLSAgICB0aGUgc3ltYm9scyBNYXAuDQotDQotLS0+DQotPCFFTEVNRU5UIGlmLW5vdCAlZnVsbC1jb250ZW50Oz4NCi08IUFUVExJU1QgaWYtbm90DQotICBleHByZXNzaW9uIENEQVRBICNSRVFVSVJFRA0KLT4NCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi1FbGVtZW50OiBpbml0aWFsaXphdGlvbg0KLUNvbnRhaW5lZCBieTogc2NyaXB0DQotDQotVGV4dCBpbiB0aGlzIGJsb2NrIGlzIGFkZGVkIHRvIHRoZSBldmVudCBoYW5kbGVyIGZvciB0aGUgPGJvZHk+DQotdGFnJ3Mgb25Mb2FkIGV2ZW50Lg0KLS0tPg0KLTwhRUxFTUVOVCBpbml0aWFsaXphdGlvbiAlZnVsbC1jb250ZW50Oz4NCi0NCi0NCi0NCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi1FbGVtZW50OiBpbnB1dC1zeW1ib2wNCi1Db250YWluZWQgYnk6IHNjcmlwdA0KLQ0KLURlZmluZXMgYW4gaW5wdXQgc3ltYm9sIHVzZWQgYnkgdGhlIHNjcmlwdC4NCi1BdHRyaWJ1dGVzOg0KLSAga2V5OiBUaGUgbmFtZSBvZiB0aGUgc3ltYm9sLg0KLSAgY2xhc3M6ICBJZiBzcGVjaWZpZWQsIHRoZSBleGVjdGVkIGNsYXNzIG9yIGludGVyZmFjZSBmb3IgdGhlIHN5bWJvbC4NCi0gIHJlcXVpcmVkOiBJZiB5ZXMsIHRoZW4gdGhlIHN5bWJvbCBtdXN0IGJlIG5vbi1udWxsLg0KLS0tPg0KLQ0KLTwhRUxFTUVOVCBpbnB1dC1zeW1ib2wgRU1QVFk+DQotPCFBVFRMSVNUIGlucHV0LXN5bWJvbA0KLSAga2V5IENEQVRBICNSRVFVSVJFRA0KLSAgY2xhc3MgQ0RBVEEgI0lNUExJRUQNCi0gIHJlcXVpcmVkICh5ZXN8bm8pICJubyINCi0+DQotDQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotDQotRWxlbWVudDogbGV0DQotQ29udGFpbmVkIGJ5OiBzY3JpcHQNCi0NCi1Vc2VkIHRvIGNyZWF0ZSBhIG5ldyBzeW1ib2wuIFRoZSBjb250ZW50IG9mIHRoZSB0YWcNCi1pcyB1c2VkIHRvIGNyZWF0ZSBhIHN0cmluZyB0aGF0IGlzIHRoZSBuYW1lLiAgSWYgdGhlDQotdW5pcXVlIGZsYWcgaXMgZW5hYmxlZCwgdGhlIG5hbWUgaXMgZW5zdXJlZCB0byBiZSB1bmlxdWUNCi0oYSBzdWZmaXggbWF5IGJlIGFwcGVuZGVkIHRvIGVuc3VyZSBpdCBpcyB1bmlxdWUNCi1hbW9uZyBhbGwgbmFtZXMgc28gZ2VuZXJhdGVkKS4NCi0NCi1BdHRyaWJ1dGVzOg0KLSAga2V5OiBUaGUgbmFtZSBvZiB0aGUgc3ltYm9sIHRvIGNyZWF0ZS4NCi0gIHVuaXF1ZTogSWYgeWVzLCB0aGUgbmFtZSBpcyBlbnN1cmVkIHRvIGJlIHVuaXF1ZS4NCi0gIFRoZSBkZWZhdWx0IGlzIG5vLg0KLQ0KLS0tPg0KLTwhRUxFTUVOVCBsZXQgJWZ1bGwtY29udGVudDs+DQotPCFBVFRMSVNUIGxldA0KLSAga2V5IENEQVRBICNSRVFVSVJFRA0KLSAgdW5pcXVlICh5ZXN8bm8pICJubyINCi0+DQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotDQotRWxlbWVudDogc2NyaXB0DQotDQotUm9vdCBlbGVtZW50Lg0KLQ0KLUFsbG93cyB6ZXJvIG9yIG1vcmUgbGV0IGVsZW1lbnRzICh0byBlc3RhYmxpc2ggbmV3IHN5bWJvbHMpLA0KLWZvbGxvd2VkIGJ5IGEgYm9keSBhbmQvb3IgaW5pdGlhbGl6YXRpb24gZWxlbWVudC4NCi0NCi0tLT4NCi08IUVMRU1FTlQgc2NyaXB0IChpbmNsdWRlLXNjcmlwdCosIGlucHV0LXN5bWJvbCosIA0KLQkobGV0IHwgc2V0KSosIGJvZHk/LCBpbml0aWFsaXphdGlvbj8pPg0KLQ0KLQ0KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLQ0KLUVsZW1lbnQ6IHNldA0KLUNvbnRhaW5lZCBieTogc2NyaXB0DQotDQotQ3JlYXRlcyBhIG5ldyBzeW1ib2wgYXMgdGhlIHJlc3VsdCBvZiBldmFsdWF0aW5nIGFuIE9HTkwgZXhwcmVzc2lvbi4NCi0NCi0tLT4NCi08IUVMRU1FTlQgc2V0IEVNUFRZPg0KLTwhQVRUTElTVCBzZXQNCi0gIGtleSBDREFUQSAjUkVRVUlSRUQNCi0gIGV4cHJlc3Npb24gQ0RBVEEgI1JFUVVJUkVEDQotPg0KLQ0KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLQ0KLUVsZW1lbnQ6IHVuaXF1ZQ0KLUFwcGVhcnMgaW46ICVmdWxsLWNvbnRlbnQ7DQotDQotRGVmaW5lcyBhIGJsb2NrIHRoYXQgb25seSBpcyByZW5kZXJlZCBvbmNlIHBlciBwYWdlLg0KLVRoaXMgaXMgYXBwcm9wcmlhdGUgdG8gY2VydGFpbiBraW5kcyBvZiBpbml0aWFsaXphdGlvbiBjb2RlDQotdGhhdCBzaG91bGQgbm90IGJlIGR1cGxpY2F0ZWQsIGV2ZW4gaWYgdGhlIHNjcmlwdCBpcw0KLWV4ZWN1dGVkIG11bHRpcGxlIHRpbWVzLg0KLQ0KLS0tPg0KLTwhRUxFTUVOVCB1bmlxdWUgJWZ1bGwtY29udGVudDs+DQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3NjcmlwdC9TZXRSdWxlLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvc2NyaXB0L1NldFJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRlMDAzYy4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvc2NyaXB0L1NldFJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LnNjcmlwdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuVGFwZXN0cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS51dGlsLnhtbC5CYXNlUnVsZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnV0aWwueG1sLlJ1bGVEaXJlY3RlZFBhcnNlcjsKLWltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOwotCi0vKioKLSAqIENvbnN0cnVjdHMgYXQge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkuc2NyaXB0LlNldFRva2VufSBmcm9tIGF0ICZsdDtzZXQmZ3Q7IGVsZW1lbnQsCi0gKiB3aGljaCBjb250YWlucyBmdWxsIGNvbnRlbnQuCi0gKgotICogQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogQHZlcnNpb24gJElkJAotICogQHNpbmNlIDMuMAotICovCi0KLWNsYXNzIFNldFJ1bGUgZXh0ZW5kcyBCYXNlUnVsZQotewotICAgIHB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChSdWxlRGlyZWN0ZWRQYXJzZXIgcGFyc2VyLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpCi0gICAgewotICAgICAgICBTdHJpbmcga2V5ID0gZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZXMsICJrZXkiKTsKLQotICAgICAgICBwYXJzZXIudmFsaWRhdGUoa2V5LCBUYXBlc3RyeS5TSU1QTEVfUFJPUEVSVFlfTkFNRV9QQVRURVJOLCAiU2NyaXB0UGFyc2VyLmludmFsaWQta2V5Iik7Ci0KLSAgICAgICAgU3RyaW5nIGV4cHJlc3Npb24gPSBnZXRBdHRyaWJ1dGUoYXR0cmlidXRlcywgImV4cHJlc3Npb24iKTsKLQotICAgICAgICBTZXRUb2tlbiB0b2tlbiA9IG5ldyBTZXRUb2tlbihrZXksIGV4cHJlc3Npb24sIHBhcnNlci5nZXRMb2NhdGlvbigpKTsKLQotICAgICAgICBJU2NyaXB0VG9rZW4gcGFyZW50ID0gKElTY3JpcHRUb2tlbikgcGFyc2VyLnBlZWsoKTsKLSAgICAgICAgcGFyZW50LmFkZFRva2VuKHRva2VuKTsKLQotICAgICAgICBwYXJzZXIucHVzaCh0b2tlbik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZW5kRWxlbWVudChSdWxlRGlyZWN0ZWRQYXJzZXIgcGFyc2VyKQotICAgIHsKLSAgICAgICAgcGFyc2VyLnBvcCgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9zY3JpcHQvU2V0VG9rZW4uamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9zY3JpcHQvU2V0VG9rZW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTIwMzhlZi4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvc2NyaXB0L1NldFRva2VuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5zY3JpcHQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklMb2NhdGlvbjsKLQotLyoqCi0gKiAgCi0gKiAgTGlrZSB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5zY3JpcHQuTGV0VG9rZW59LCBidXQgc2V0cyB0aGUgdmFsdWUKLSAqICBmcm9tIGFuIGV4cHJlc3Npb24gYXR0cmlidXRlLCByYXRoZXIgdGhhbiBhIGJvZHkgb2YgZnVsbCBjb250ZW50LgotICoKLSAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiAgQHZlcnNpb24gJElkJAotICogIEBzaW5jZSAyLjIKLSAqCi0gKiovCi0KLWNsYXNzIFNldFRva2VuIGV4dGVuZHMgQWJzdHJhY3RUb2tlbgotewotICAgIHByaXZhdGUgU3RyaW5nIF9rZXk7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgX2V4cHJlc3Npb247Ci0KLSAgICBTZXRUb2tlbihTdHJpbmcga2V5LCBTdHJpbmcgZXhwcmVzc2lvbiwgSUxvY2F0aW9uIGxvY2F0aW9uKQotICAgIHsKLSAgICAgICAgc3VwZXIobG9jYXRpb24pOwotICAgICAgICBfa2V5ID0ga2V5OwotICAgICAgICBfZXhwcmVzc2lvbiA9IGV4cHJlc3Npb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogICAKLSAgICAgKiAgRG9lc24ndCA8ZW0+d3JpdGU8L2VtPiwgaXQgZXZhbHVhdGVzIHRoZSBleHByZXNzaW9uIGFuZCBhc3NpZ25zCi0gICAgICogIHRoZSByZXN1bHQgYmFjayB0byB0aGUga2V5LiAKLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZShTdHJpbmdCdWZmZXIgYnVmZmVyLCBTY3JpcHRTZXNzaW9uIHNlc3Npb24pCi0gICAgewotCi0gICAgICAgIE9iamVjdCB2YWx1ZSA9IGV2YWx1YXRlKF9leHByZXNzaW9uLCBzZXNzaW9uKTsKLQotICAgICAgICBzZXNzaW9uLmdldFN5bWJvbHMoKS5wdXQoX2tleSwgdmFsdWUpOwotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9zY3JpcHQvU3RhdGljVG9rZW4uamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9zY3JpcHQvU3RhdGljVG9rZW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWExYjUyNS4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvc2NyaXB0L1N0YXRpY1Rva2VuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5zY3JpcHQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklMb2NhdGlvbjsKLQotCi0vKioKLSAqICBBIHRva2VuIGZvciBzdGF0aWMgcG9ydGlvbnMgb2YgdGhlIHRlbXBsYXRlLgotICoKLSAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiAgQHZlcnNpb24gJElkJAotICoKLSAqKi8KLQotY2xhc3MgU3RhdGljVG9rZW4gZXh0ZW5kcyBBYnN0cmFjdFRva2VuCi17Ci0gICAgcHJpdmF0ZSBTdHJpbmcgX3RleHQ7Ci0KLSAgICBTdGF0aWNUb2tlbihTdHJpbmcgdGV4dCwgSUxvY2F0aW9uIGxvY2F0aW9uCSkKLSAgICB7Ci0gICAgCXN1cGVyKGxvY2F0aW9uKTsKLSAgICAJCi0gICAgICAgIF90ZXh0ID0gdGV4dDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgV3JpdGVzIHRoZSB0ZXh0IHRvIHRoZSB3cml0ZXIuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZShTdHJpbmdCdWZmZXIgYnVmZmVyLCBTY3JpcHRTZXNzaW9uIHNlc3Npb24pCi0gICAgewotICAgICAgICBidWZmZXIuYXBwZW5kKF90ZXh0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRUb2tlbihJU2NyaXB0VG9rZW4gdG9rZW4pCi0gICAgewotICAgICAgICAvLyBTaG91bGQgbmV2ZXIgYmUgaW52b2tlZC4KLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3NjcmlwdC9VbmlxdWVSdWxlLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvc2NyaXB0L1VuaXF1ZVJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjI5NGYyZS4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvc2NyaXB0L1VuaXF1ZVJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LnNjcmlwdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkudXRpbC54bWwuUnVsZURpcmVjdGVkUGFyc2VyOwotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7Ci0KLS8qKgotICogQ29uc3RydWN0cyBhIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LnNjcmlwdC5VbmlxdWVUb2tlbn0KLSAqIGZyb20gYW4gJmx0O3VuaXF1ZSZndDsgZWxlbWVudCwgd2hpY2ggY29udGFpbnMgZnVsbCBjb250ZW50LgotICoKLSAqIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqIEB2ZXJzaW9uICRJZCQKLSAqIEBzaW5jZSAzLjAKLSAqLwotCi1wdWJsaWMgY2xhc3MgVW5pcXVlUnVsZSBleHRlbmRzIEFic3RyYWN0VG9rZW5SdWxlCi17Ci0KLSAgICBwdWJsaWMgdm9pZCBlbmRFbGVtZW50KFJ1bGVEaXJlY3RlZFBhcnNlciBwYXJzZXIpCi0gICAgewotICAgICAgICBwYXJzZXIucG9wKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFJ1bGVEaXJlY3RlZFBhcnNlciBwYXJzZXIsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykKLSAgICB7Ci0gICAgICAgIElTY3JpcHRUb2tlbiB0b2tlbiA9IG5ldyBVbmlxdWVUb2tlbihwYXJzZXIuZ2V0TG9jYXRpb24oKSk7Ci0KLSAgICAgICAgYWRkVG9QYXJlbnQocGFyc2VyLCB0b2tlbik7Ci0gICAgICAgIHBhcnNlci5wdXNoKHRva2VuKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9zY3JpcHQvVW5pcXVlVG9rZW4uamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9zY3JpcHQvVW5pcXVlVG9rZW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ0MTk5MS4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvc2NyaXB0L1VuaXF1ZVRva2VuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5zY3JpcHQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklMb2NhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZXF1ZXN0Q3ljbGU7Ci0KLS8qKgotICogV3JpdGVzIG91dCBpdHMgY2hpbGQgdG9rZW5zIG9ubHkgdGhlIGZpcnN0IHRpbWUgaXQgZXhlY3V0ZXMKLSAqICh3aXRoIGEgZ2l2ZW4gdGFnKS4gIFVzZXMKLSAqIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZXF1ZXN0Q3ljbGUjc2V0QXR0cmlidXRlKFN0cmluZywgT2JqZWN0KX0KLSAqIHRvIGlkZW50aWZ5IHdoZXRoZXIgYSBwYXJ0aWN1bGFyIGJsb2NrIGhhcyByZW5kZXJlZCB5ZXQuCi0gKgotICogQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogQHZlcnNpb24gJElkJAotICogQHNpbmNlIDMuMAotICovCi0KLWNsYXNzIFVuaXF1ZVRva2VuIGV4dGVuZHMgQWJzdHJhY3RUb2tlbgotewotICAgIHB1YmxpYyBVbmlxdWVUb2tlbihJTG9jYXRpb24gbG9jYXRpb24pCi0gICAgewotICAgICAgICBzdXBlcihsb2NhdGlvbik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGUoU3RyaW5nQnVmZmVyIGJ1ZmZlciwgU2NyaXB0U2Vzc2lvbiBzZXNzaW9uKQotICAgIHsKLSAgICAgICAgSVJlcXVlc3RDeWNsZSBjeWNsZSA9IHNlc3Npb24uZ2V0UmVxdWVzdEN5Y2xlKCk7Ci0KLSAgICAgICAgSUxvY2F0aW9uIGxvY2F0aW9uID0gZ2V0TG9jYXRpb24oKTsKLSAgICAgICAgU3RyaW5nIHRhZyA9ICI8dW5pcXVlPiAiICsgbG9jYXRpb24udG9TdHJpbmcoKTsKLQotICAgICAgICBpZiAoY3ljbGUuZ2V0QXR0cmlidXRlKHRhZykgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBjeWNsZS5zZXRBdHRyaWJ1dGUodGFnLCBCb29sZWFuLlRSVUUpOwotCi0gICAgICAgIHdyaXRlQ2hpbGRyZW4oYnVmZmVyLCBzZXNzaW9uKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9zY3JpcHQvcGFja2FnZS5odG1sIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3NjcmlwdC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyNzcyOWMuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3NjcmlwdC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08IWRvY3R5cGUgaHRtbCBwdWJsaWMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotPCEtLSAkSWQkIC0tPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5UYXBlc3RyeTogV2ViIEFwcGxpY2F0aW9uIEZyYW1ld29yazwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLQotPHA+UGFyc2VyIGFuZCByZWxhdGVkIGNsYXNzZXMgZm9yIGR5bmFtaWNhbGx5IGdlbmVyYXRpbmcgSmF2YVNjcmlwdCBmb3IKLWluY2x1c2lvbiBpbiBhbiBIVE1MIHJlc3BvbnNlLiAgVGhpcyBpcyB1c2VkIGJ5IGEgbnVtYmVyIG9mCi10YXBlc3RyeSBjb21wb25lbnRzLCBpbmNsdWRpbmcgCi17QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5odG1sLlJvbGxvdmVyfSwgYXMgd2VsbAotYXMge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkuaHRtbC5TY3JpcHR9ICh1c2VkIGZvcgotaW5jbHVkaW5nIGFyYml0cmFyeSB1c2VyLXdyaXR0ZW4gSmF2YVNjcmlwdCkuCi0KLUBhdXRob3IgSG93YXJkIExld2lzIFNoaXAgPGEgaHJlZj0ibWFpbHRvOmhsc2hpcEBhcGFjaGUub3JnIj5obHNoaXBAYXBhY2hlLm9yZzwvYT4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3NwZWMvQXBwbGljYXRpb25TcGVjaWZpY2F0aW9uLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvc3BlYy9BcHBsaWNhdGlvblNwZWNpZmljYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U5Njg3Yi4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvc3BlYy9BcHBsaWNhdGlvblNwZWNpZmljYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LnNwZWM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5idWlsZGVyLlRvU3RyaW5nQnVpbGRlcjsKLQotLyoqCi0gKiAgRGVmaW5lcyB0aGUgY29uZmlndXJhdGlvbiBmb3IgYSBUYXBlc3RyeSBhcHBsaWNhdGlvbi4gIEFuIEFwcGxpY2F0aW9uU3BlY2lmaWNhdGlvbgotICogIGV4dGVuZHMge0BsaW5rIExpYnJhcnlTcGVjaWZpY2F0aW9ufSBieSBhZGRpbmcgbmV3IHByb3BlcnRpZXMKLSAqICBuYW1lIGFuZCBlbmdpbmVDbGFzc05hbWUuCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKgotICoqLwotCi1wdWJsaWMgY2xhc3MgQXBwbGljYXRpb25TcGVjaWZpY2F0aW9uCi0gICAgZXh0ZW5kcyBMaWJyYXJ5U3BlY2lmaWNhdGlvbgotICAgIGltcGxlbWVudHMgSUFwcGxpY2F0aW9uU3BlY2lmaWNhdGlvbgotewotICAgIHByaXZhdGUgU3RyaW5nIF9uYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIF9lbmdpbmVDbGFzc05hbWU7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9uYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEVuZ2luZUNsYXNzTmFtZShTdHJpbmcgdmFsdWUpCi0gICAgewotICAgICAgICBfZW5naW5lQ2xhc3NOYW1lID0gdmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRFbmdpbmVDbGFzc05hbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9lbmdpbmVDbGFzc05hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkKLSAgICB7Ci0gICAgICAgIF9uYW1lID0gbmFtZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBleHRlbmREZXNjcmlwdGlvbihUb1N0cmluZ0J1aWxkZXIgYnVpbGRlcikKLSAgICB7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJuYW1lIiwgX25hbWUpOwotICAgICAgICBidWlsZGVyLmFwcGVuZCgiZW5naW5lQ2xhc3NOYW1lIiwgX2VuZ2luZUNsYXNzTmFtZSk7Ci0gICAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3NwZWMvQXNzZXRTcGVjaWZpY2F0aW9uLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvc3BlYy9Bc3NldFNwZWNpZmljYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA2OWM2Zi4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvc3BlYy9Bc3NldFNwZWNpZmljYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LnNwZWM7Ci0KLS8qKgotICogIERlZmluZXMgYW4gaW50ZXJuYWwsIGV4dGVybmFsIG9yIHByaXZhdGUgYXNzZXQuCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKgotICoqLwotCi1wdWJsaWMgY2xhc3MgQXNzZXRTcGVjaWZpY2F0aW9uIGV4dGVuZHMgTG9jYXRhYmxlUHJvcGVydHlIb2xkZXIgaW1wbGVtZW50cyBJQXNzZXRTcGVjaWZpY2F0aW9uCi17Ci0gICAgcHJpdmF0ZSBBc3NldFR5cGUgdHlwZTsKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHBhdGg7Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0aGUgYmFzZSBwYXRoIGZvciB0aGUgYXNzZXQuICBUaGlzIG1heSBiZSBpbnRlcnByZXRlZCBhcyBhIFVSTCwgcmVsYXRpdmUgVVJMCi0gICAgICogIG9yIHRoZSBwYXRoIHRvIGEgcmVzb3VyY2UsIGRlcGVuZGluZyBvbiB0aGUgdHlwZSBvZiBhc3NldC4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aCgpCi0gICAgewotICAgICAgICByZXR1cm4gcGF0aDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXNzZXRUeXBlIGdldFR5cGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHR5cGU7Ci0gICAgfQotCi0gICAgLyoqIEBzaW5jZSAzLjAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXRoKFN0cmluZyBwYXRoKQotICAgIHsKLSAgICAgICAgdGhpcy5wYXRoID0gcGF0aDsKLSAgICB9Ci0KLSAgICAvKiogQHNpbmNlIDMuMCAqKi8KLQotICAgIHB1YmxpYyB2b2lkIHNldFR5cGUoQXNzZXRUeXBlIHR5cGUpCi0gICAgewotICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOwotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9zcGVjL0Fzc2V0VHlwZS5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3NwZWMvQXNzZXRUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkYmQ0NjguLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3NwZWMvQXNzZXRUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5zcGVjOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuZW51bS5FbnVtOwotCi0vKioKLSAqICBEZWZpbmVzIHRoZSB0eXBlcyBvZiBhc3NldHMuCi0gKgotICogIEBzZWUgSUFzc2V0U3BlY2lmaWNhdGlvbgotICoKLSAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiAgQHZlcnNpb24gJElkJAotICogCi0gKiovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBBc3NldFR5cGUgZXh0ZW5kcyBFbnVtCi17Ci0gICAgLyoqCi0gICAgICogIEFuIGV4dGVybmFsIHJlc291cmNlLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBBc3NldFR5cGUgRVhURVJOQUwgPSBuZXcgQXNzZXRUeXBlKCJFWFRFUk5BTCIpOwotCi0gICAgLyoqCi0gICAgICogIEEgcmVzb3VyY2UgdmlzaWJsZSB0byB0aGUge0BsaW5rIGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHR9LgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBBc3NldFR5cGUgQ09OVEVYVCA9IG5ldyBBc3NldFR5cGUoIkNPTlRFWFQiKTsKLQotICAgIC8qKgotICAgICAqICBBbiBpbnRlcm5hbCByZXNvdXJjZSB2aXNpYmxlIG9ubHkgb24gdGhlIGNsYXNzcGF0aC4gIFR5cGljYWxseSwKLSAgICAgKiAgYSByZXNvdXJjZSBwYWNrYWdlIGluIGEgV0FSIG9yIEpBUiBmaWxlIGFsb25nc2lkZSB0aGUgY2xhc3Nlcy4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQXNzZXRUeXBlIFBSSVZBVEUgPSBuZXcgQXNzZXRUeXBlKCJQUklWQVRFIik7Ci0KLSAgICBwcml2YXRlIEFzc2V0VHlwZShTdHJpbmcgbmFtZSkKLSAgICB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9zcGVjL0Jhc2VMb2NhdGFibGUuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9zcGVjL0Jhc2VMb2NhdGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ0ZTZmMC4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvc3BlYy9CYXNlTG9jYXRhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5zcGVjOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JTG9jYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JTG9jYXRpb25Ib2xkZXI7Ci0KLS8qKgotICogIEJhc2UgY2xhc3MgZm9yIGNsYXNzZXMgd2hpY2ggaW1wbGVtZW50Ci0gKiAge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkuSUxvY2F0aW9uSG9sZGVyfS4KLSAqIAotICoKLSAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiAgQHZlcnNpb24gJElkJAotICogIEBzaW5jZSAzLjAKLSAqCi0gKiovCi0KLXB1YmxpYyBjbGFzcyBCYXNlTG9jYXRhYmxlIGltcGxlbWVudHMgSUxvY2F0aW9uSG9sZGVyCi17Ci0JcHJpdmF0ZSBJTG9jYXRpb24gX2xvY2F0aW9uOwotCQotICAgIHB1YmxpYyB2b2lkIHNldExvY2F0aW9uKElMb2NhdGlvbiBsb2NhdGlvbikKLSAgICB7Ci0gICAgCV9sb2NhdGlvbiA9IGxvY2F0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyBJTG9jYXRpb24gZ2V0TG9jYXRpb24oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9sb2NhdGlvbjsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9zcGVjL0JlYW5MaWZlY3ljbGUuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9zcGVjL0JlYW5MaWZlY3ljbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI2MTdjMi4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvc3BlYy9CZWFuTGlmZWN5Y2xlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5zcGVjOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuZW51bS5FbnVtOwotCi0KLS8qKgotICogIEFuIHtAbGluayBFbnVtfSBvZiB0aGUgZGlmZmVyZW50IHBvc3NpYmxlIGxpZmVjeWNsZXMgZm9yIGEgSmF2YUJlYW4uCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQHNpbmNlIDEuMC40Ci0gKiAKLSAqKi8KLQotcHVibGljIGNsYXNzIEJlYW5MaWZlY3ljbGUgZXh0ZW5kcyBFbnVtCi17Ci0JLyoqCi0JICogIE5vIGxpZmVjeWNsZTsgdGhlIGJlYW4gaXMgY3JlYXRlZCBmcmVzaCBvbiBlYWNoIHJlZmVyZW5jZSBhbmQgbm90IHJldGFpbmVkLgotCSAqCi0JICoqLwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBCZWFuTGlmZWN5Y2xlIE5PTkUgPSBuZXcgQmVhbkxpZmVjeWNsZSgiTk9ORSIpOwotCi0JLyoqCi0JICogVGhlIHN0YW5kYXJkIGxpZmVjeWNsZTsgdGhlIGJlYW4gaXMgcmV0YWluZWQgZm9yIHRoZQotCSAqIGR1cmF0aW9uIG9mIHRoZSByZXF1ZXN0IGN5Y2xlIGFuZCBpcyBkaXNjYXJkZWQgYXQgdGhlIGVuZCBvZiB0aGUKLQkgKiByZXF1ZXN0IGN5Y2xlLgotCSAqCi0JICoqLwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBCZWFuTGlmZWN5Y2xlIFJFUVVFU1QgPSBuZXcgQmVhbkxpZmVjeWNsZSgiUkVRVUVTVCIpOwotCi0JLyoqCi0JICogVGhlIGJlYW4gaXMgY3JlYXRlZCBvbmNlIGFuZCByZXVzZWQgZm9yIHRoZSBsaWZlc3BhbiBvZiB0aGUgcGFnZQotCSAqIGNvbnRhaW5pbmcgdGhlIGNvbXBvbmVudC4KLQkgKgotCSAqKi8KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQmVhbkxpZmVjeWNsZSBQQUdFID0gbmV3IEJlYW5MaWZlY3ljbGUoIlBBR0UiKTsKLQotICAgIC8qKgotICAgICAqICBUaGUgYmVhbiBpcyBjcmVhdGUgYW5kIHJldXNlZCB1bnRpbCB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IHJlbmRlciwKLSAgICAgKiAgYXQgd2hpY2ggcG9pbnQgaXQgaXMgZGlzY2FyZGVkLgotICAgICAqIAotICAgICAqICBAc2luY2UgMi4yCi0gICAgICogCi0gICAgICoqLwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQmVhbkxpZmVjeWNsZSBSRU5ERVIgPSBuZXcgQmVhbkxpZmVjeWNsZSgiUkVOREVSIik7Ci0gICAgCi0JcHJpdmF0ZSBCZWFuTGlmZWN5Y2xlKFN0cmluZyBuYW1lKQotCXsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3NwZWMvQmVhblNwZWNpZmljYXRpb24uamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9zcGVjL0JlYW5TcGVjaWZpY2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5MzVlNDQuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3NwZWMvQmVhblNwZWNpZmljYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5zcGVjOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuYmVhbi5JQmVhbkluaXRpYWxpemVyOwotCi0vKioKLSAqICBBIHNwZWNpZmljYXRpb24gb2YgYSBoZWxwZXIgYmVhbiBmb3IgYSBjb21wb25lbnQuCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQHNpbmNlIDEuMC40Ci0gKiAKLSAqKi8KLQotcHVibGljIGNsYXNzIEJlYW5TcGVjaWZpY2F0aW9uIGV4dGVuZHMgTG9jYXRhYmxlUHJvcGVydHlIb2xkZXIgaW1wbGVtZW50cyBJQmVhblNwZWNpZmljYXRpb24KLXsKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGNsYXNzTmFtZTsKLSAgICBwcm90ZWN0ZWQgQmVhbkxpZmVjeWNsZSBsaWZlY3ljbGU7Ci0KLSAgICAvKiogQHNpbmNlIDEuMC45ICoqLwotICAgIHByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogIEEgTGlzdCBvZiB7QGxpbmsgSUJlYW5Jbml0aWFsaXplcn0uCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwcm90ZWN0ZWQgTGlzdCBpbml0aWFsaXplcnM7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZSgpCi0gICAgewotICAgICAgICByZXR1cm4gY2xhc3NOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBCZWFuTGlmZWN5Y2xlIGdldExpZmVjeWNsZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbGlmZWN5Y2xlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBAc2luY2UgMS4wLjUKLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIGFkZEluaXRpYWxpemVyKElCZWFuSW5pdGlhbGl6ZXIgaW5pdGlhbGl6ZXIpCi0gICAgewotICAgICAgICBpZiAoaW5pdGlhbGl6ZXJzID09IG51bGwpCi0gICAgICAgICAgICBpbml0aWFsaXplcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgaW5pdGlhbGl6ZXJzLmFkZChpbml0aWFsaXplcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgdGhlIHtAbGluayBMaXN0fSBvZiB7QGxpbmsgSUJlYW5Jbml0aWFsaXplcn1zLiAgVGhlIGNhbGxlcgotICAgICAqICBzaG91bGQgbm90IG1vZGlmeSB0aGlzIHZhbHVlIS4gIE1heSByZXR1cm4gbnVsbCBpZiB0aGVyZQotICAgICAqICBhcmUgbm8gaW5pdGlhbGl6ZXJzLgotICAgICAqCi0gICAgICogIEBzaW5jZSAxLjAuNQotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIExpc3QgZ2V0SW5pdGlhbGl6ZXJzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBpbml0aWFsaXplcnM7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gICAgewotICAgICAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigiQmVhblNwZWNpZmljYXRpb25bIik7Ci0KLSAgICAgICAgYnVmZmVyLmFwcGVuZChjbGFzc05hbWUpOwotICAgICAgICBidWZmZXIuYXBwZW5kKCIsIGxpZmVjeWNsZSAiKTsKLSAgICAgICAgYnVmZmVyLmFwcGVuZChsaWZlY3ljbGUuZ2V0TmFtZSgpKTsKLQotICAgICAgICBpZiAoaW5pdGlhbGl6ZXJzICE9IG51bGwgJiYgaW5pdGlhbGl6ZXJzLnNpemUoKSA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIiwgIik7Ci0gICAgICAgICAgICBidWZmZXIuYXBwZW5kKGluaXRpYWxpemVycy5zaXplKCkpOwotICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiIGluaXRpYWxpemVycyIpOwotICAgICAgICB9Ci0KLSAgICAgICAgYnVmZmVyLmFwcGVuZCgnXScpOwotCi0gICAgICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBkZXNjcmlwdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzYykKLSAgICB7Ci0gICAgICAgIGRlc2NyaXB0aW9uID0gZGVzYzsKLSAgICB9Ci0KLSAgICAvKiogQHNpbmNlIDMuMCAqKi8KLQotICAgIHB1YmxpYyB2b2lkIHNldENsYXNzTmFtZShTdHJpbmcgY2xhc3NOYW1lKQotICAgIHsKLSAgICAgICAgdGhpcy5jbGFzc05hbWUgPSBjbGFzc05hbWU7Ci0gICAgfQotICAgIAotICAgIC8qKiBAc2luY2UgMy4wICoqLwotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldExpZmVjeWNsZShCZWFuTGlmZWN5Y2xlIGxpZmVjeWNsZSkKLSAgICB7Ci0gICAgICAgIHRoaXMubGlmZWN5Y2xlID0gbGlmZWN5Y2xlOwotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9zcGVjL0JpbmRpbmdTcGVjaWZpY2F0aW9uLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvc3BlYy9CaW5kaW5nU3BlY2lmaWNhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWM0MGUwLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9zcGVjL0JpbmRpbmdTcGVjaWZpY2F0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5zcGVjOwotCi0vKioKLSAqICBTdG9yZXMgYSBiaW5kaW5nIHNwZWNpZmljYXRpb24sIHdoaWNoIGlkZW50aWZpZXMgdGhlIHN0YXRpYyB2YWx1ZQotICogIG9yIE9HTkwgZXhwcmVzc2lvbiBmb3IgdGhlIGJpbmRpbmcuICBUaGUgbmFtZSBvZiB0aGUgYmluZGluZyAod2hpY2gKLSAqICBtYXRjaGVzIGEgYmluZGFibGUgcHJvcGVydHkgb2YgdGhlIGNvbnRpbmVkIGNvbXBvbmVudCkgaXMgaW1wbGljaXRseSBrbm93bi4KLSAqCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogIEB2ZXJzaW9uICRJZCQKLSAqIAotICoqLwotCi1wdWJsaWMgY2xhc3MgQmluZGluZ1NwZWNpZmljYXRpb24gZXh0ZW5kcyBCYXNlTG9jYXRhYmxlIGltcGxlbWVudHMgSUJpbmRpbmdTcGVjaWZpY2F0aW9uCi17Ci0gICAgcHJpdmF0ZSBCaW5kaW5nVHlwZSBfdHlwZTsKLSAgICBwcml2YXRlIFN0cmluZyBfdmFsdWU7Ci0JCi0gICAgcHVibGljIEJpbmRpbmdUeXBlIGdldFR5cGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF90eXBlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF92YWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRUeXBlKEJpbmRpbmdUeXBlIHR5cGUpCi0gICAgewotICAgICAgICBfdHlwZSA9IHR5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKQotICAgIHsKLSAgICAgICAgX3ZhbHVlID0gdmFsdWU7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9zcGVjL0JpbmRpbmdUeXBlLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvc3BlYy9CaW5kaW5nVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTBhZTRiLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9zcGVjL0JpbmRpbmdUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5zcGVjOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuZW51bS5FbnVtOwotCi0vKioKLSAqICBEZWZpbmVzIHRoZSBkaWZmZXJlbnQgdHlwZXMgb2YgYmluZGluZ3MgcG9zc2libGUgZm9yIGEgY29tcG9uZW50LgotICogIFRoZXNlIGFyZSB1c2VkIGluIHRoZSB7QGxpbmsgSUJpbmRpbmdTcGVjaWZpY2F0aW9ufSBhbmQgdWx0aW1hdGVseQotICogIHVzZWQgdG8gY3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LklCaW5kaW5nfS4KLSAqCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAKLSAqKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIEJpbmRpbmdUeXBlIGV4dGVuZHMgRW51bQotewotICAgIC8qKgotICAgICAqICBJbmRpY2F0ZXMgYSB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5iaW5kaW5nLlN0YXRpY0JpbmRpbmd9LgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaW5kaW5nVHlwZSBTVEFUSUMgPSBuZXcgQmluZGluZ1R5cGUoIlNUQVRJQyIpOwotCi0gICAgLyoqCi0gICAgICogIEluZGljYXRlcyBhIHN0YW5kYXJkIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LmJpbmRpbmcuRXhwcmVzc2lvbkJpbmRpbmd9LgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaW5kaW5nVHlwZSBEWU5BTUlDID0gbmV3IEJpbmRpbmdUeXBlKCJEWU5BTUlDIik7Ci0KLSAgICAvKioKLSAgICAgKiAgSW5kaWNhdGVzIHRoYXQgYW4gZXhpc3RpbmcgYmluZGluZyAoZnJvbSB0aGUgY29udGFpbmVyKSB3aWxsIGJlCi0gICAgICogIHJlLXVzZWQuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpbmRpbmdUeXBlIElOSEVSSVRFRCA9IG5ldyBCaW5kaW5nVHlwZSgiSU5IRVJJVEVEIik7Ci0KLSAgICAvKioKLSAgICAgKiAgSW5kaWNhdGVzIGEge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkuYmluZGluZy5GaWVsZEJpbmRpbmd9LgotICAgICAqCi0gICAgICogIDxwPgotICAgICAqICBGaWVsZCBiaW5kaW5ncyBhcmUgb25seSBhdmFpbGFibGUgaW4gdGhlIDEuMyBEVEQuICBUaGUgMS40IERURAotICAgICAqICBkb2VzIG5vdCBzdXBwb3J0IHRoZW0gKHNpbmNlIE9HTkwgZXhwcmVzc2lvbnMgY2FuIGRvIHRoZSBzYW1lIHRoaW5nKS4KLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpbmRpbmdUeXBlIEZJRUxEID0gbmV3IEJpbmRpbmdUeXBlKCJGSUVMRCIpOwotCi0gICAgLyoqCi0gICAgICogIEluZGljYXRlcyBhIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LmJpbmRpbmcuTGlzdGVuZXJCaW5kaW5nfSwgYQotICAgICAqICBzcGVjaWFsaXplZCBraW5kIG9mIGJpbmRpbmcgdGhhdCBlbmNhcHN1bGF0ZXMgYSBjb21wb25lbnQgbGlzdGVuZXIKLSAgICAgKiAgYXMgYSBzY3JpcHQuICBVc2VzIGEgc3ViY2xhc3Mgb2Yge0BsaW5rIEJpbmRpbmdTcGVjaWZpY2F0aW9ufSwKLSAgICAgKiAge0BsaW5rIExpc3RlbmVyQmluZGluZ1NwZWNpZmljYXRpb259LgotICAgICAqICB7QGxpbmsgSUxpc3RlbmVyQmluZGluZ1NwZWNpZmljYXRpb259LgotICAgICAqIAotICAgICAqICBAc2luY2UgMy4wCi0gICAgICogCi0gICAgICoqLwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQmluZGluZ1R5cGUgTElTVEVORVIgPSBuZXcgQmluZGluZ1R5cGUoIkxJU1RFTkVSIik7Ci0KLQkvKioKLQkgKiAgQSBiaW5kaW5nIHRvIG9uZSBvZiBhIGNvbXBvbmVudCdzIGxvY2FsaXplZCBzdHJpbmdzLgotCSAqIAotCSAqICBAc2VlIG9yZy5hcGFjaGUudGFwZXN0cnkuSUNvbXBvbmVudCNnZXRTdHJpbmcoU3RyaW5nKQotCSAqIAotCSAqICBAc2luY2UgMi4wLjQKLQkgKiAKLQkgKiovCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBCaW5kaW5nVHlwZSBTVFJJTkcgPSBuZXcgQmluZGluZ1R5cGUoIlNUUklORyIpOwotCQotICAgIHByaXZhdGUgQmluZGluZ1R5cGUoU3RyaW5nIG5hbWUpCi0gICAgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvc3BlYy9Db21wb25lbnRTcGVjaWZpY2F0aW9uLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvc3BlYy9Db21wb25lbnRTcGVjaWZpY2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwZWUyMTQuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3NwZWMvQ29tcG9uZW50U3BlY2lmaWNhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAzICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LnNwZWM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5idWlsZGVyLlRvU3RyaW5nQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZXNvdXJjZUxvY2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuVGFwZXN0cnk7Ci0KLS8qKgotICogIEEgc3BlY2lmaWNhdGlvbiBmb3IgYSBjb21wb25lbnQsIGFzIHJlYWQgZnJvbSBhbiBYTUwgc3BlY2lmaWNhdGlvbiBmaWxlLgotICoKLSAqICA8cD5BIHNwZWNpZmljYXRpb24gY29uc2lzdHMgb2YKLSAqICA8dWw+Ci0gKiAgPGxpPkFuIGltcGxlbWVudGluZyBjbGFzcwotICogIDxsaT5BbiBvcHRpb25hbCB0ZW1wbGF0ZQotICogIDxsaT5BbiBvcHRpb25hbCBkZXNjcmlwdGlvbgotICogIDxsaT5BIHNldCBvZiBjb250YWluZWQgY29tcG9uZW50cwotICogIDxsaT5CaW5kaW5ncyBmb3IgdGhlIHByb3BlcnRpZXMgb2YgZWFjaCBjb250YWluZWQgY29tcG9uZW50Ci0gKiAgPGxpPkEgc2V0IG9mIG5hbWVkIGFzc2V0cwotICogIDxsaT5EZWZpbml0aW9ucyBmb3IgaGVscGVyIGJlYW5zCi0gKiAgPGxpPkFueSByZXNlcnZlZCBuYW1lcyAodXNlZCBmb3IgSFRNTCBhdHRyaWJ1dGVzKQotICogIDwvdWw+Ci0gKgotICogIDxwPkZyb20gdGhpcyBpbmZvcm1hdGlvbiwgYW4gYWN0dWFsIGNvbXBvbmVudCBtYXkgYmUgaW5zdGFudGlhdGVkIGFuZAotICogIGluaXRpYWxpemVkLiAgSW5zdGFudGlhdGluZyBhIGNvbXBvbmVudCBpcyB1c3VhbGx5IGEgcmVjdXJzaXZlIHByb2Nlc3MsIHNpbmNlCi0gKiAgdG8gaW5pdGlhbGl6ZSBhIGNvbnRhaW5lciBjb21wb25lbnQsIGl0IGlzIG5lY2Vzc2FyeSB0byBpbnN0YW50aWF0ZSBhbmQgaW5pdGlhbGl6ZQotICogIGl0cyBjb250YWluZWQgY29tcG9uZW50cyBhcyB3ZWxsLgotICoKLSAqICBAc2VlIG9yZy5hcGFjaGUudGFwZXN0cnkuSUNvbXBvbmVudAotICogIEBzZWUgSUNvbnRhaW5lZENvbXBvbmVudAotICogIEBzZWUgb3JnLmFwYWNoZS50YXBlc3RyeS5lbmdpbmUuSVBhZ2VMb2FkZXIKLSAqCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogIEB2ZXJzaW9uICRJZCQKLSAqCi0gKiovCi0KLXB1YmxpYyBjbGFzcyBDb21wb25lbnRTcGVjaWZpY2F0aW9uIGV4dGVuZHMgTG9jYXRhYmxlUHJvcGVydHlIb2xkZXIgaW1wbGVtZW50cyBJQ29tcG9uZW50U3BlY2lmaWNhdGlvbgotewotICAgIHByaXZhdGUgU3RyaW5nIF9jb21wb25lbnRDbGFzc05hbWU7IAotCi0gICAgLyoqIEBzaW5jZSAxLjAuOSAqKi8KLQotICAgIHByaXZhdGUgU3RyaW5nIF9kZXNjcmlwdGlvbjsKLQotICAgIC8qKgotICAgICAqICBLZXllZCBvbiBjb21wb25lbnQgaWQsIHZhbHVlIGlzIHtAbGluayBJQ29udGFpbmVkQ29tcG9uZW50fS4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHByb3RlY3RlZCBNYXAgX2NvbXBvbmVudHM7Ci0KLSAgICAvKioKLSAgICAgKiAgS2V5ZWQgb24gYXNzZXQgbmFtZSwgdmFsdWUgaXMge0BsaW5rIElBc3NldFNwZWNpZmljYXRpb259LgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHJvdGVjdGVkIE1hcCBfYXNzZXRzOwotCi0gICAgLyoqCi0gICAgICogIERlZmluZXMgYWxsIGZvcm1hbCBwYXJhbWV0ZXJzLiAgS2V5ZWQgb24gcGFyYW1ldGVyIG5hbWUsIHZhbHVlIGlzCi0gICAgICoge0BsaW5rIElQYXJhbWV0ZXJTcGVjaWZpY2F0aW9ufS4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHByb3RlY3RlZCBNYXAgX3BhcmFtZXRlcnM7Ci0KLSAgICAvKioKLSAgICAgKiAgRGVmaW5lcyBhbGwgaGVscGVyIGJlYW5zLiAgS2V5ZWQgb24gbmFtZSwgdmFsdWUgaXMge0BsaW5rIElCZWFuU3BlY2lmaWNhdGlvbn0uCi0gICAgICoKLSAgICAgKiAgQHNpbmNlIDEuMC40Ci0gICAgICoqLwotCi0gICAgcHJvdGVjdGVkIE1hcCBfYmVhbnM7Ci0KLSAgICAvKioKLSAgICAgKiAgVGhlIG5hbWVzIG9mIGFsbCByZXNlcnZlZCBpbmZvcm1hbCBwYXJhbWV0ZXIgbmFtZXMgKGFzIGxvd2VyLWNhc2UpLiAgVGhpcwotICAgICAqICBhbGxvd3MgdGhlIHBhZ2UgbG9hZGVyIHRvIGZpbHRlciBvdXQgYW55IGluZm9ybWFsIHBhcmFtZXRlcnMgZHVyaW5nIHBhZ2UgbG9hZCwKLSAgICAgKiAgcmF0aGVyIHRoYW4gZHVyaW5nIHJlbmRlci4KLSAgICAgKgotICAgICAqICAgQHNpbmNlIDEuMC41Ci0gICAgICoKLSAgICAgKiovCi0KLSAgICBwcm90ZWN0ZWQgU2V0IF9yZXNlcnZlZFBhcmFtZXRlck5hbWVzOwotCi0gICAgLyoqCi0gICAgICogIElzIHRoZSBjb21wb25lbnQgYWxsb3dlZCB0byBoYXZlIGEgYm9keSAodGhhdCBpcywgd3JhcCBvdGhlciBlbGVtZW50cz8pLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHJpdmF0ZSBib29sZWFuIF9hbGxvd0JvZHkgPSB0cnVlOwotCi0gICAgLyoqCi0gICAgICogIElzIHRoZSBjb21wb25lbnQgYWxsb3cgdG8gaGF2ZSBpbmZvcm1hbCBwYXJhbWV0ZXIgc3BlY2lmaWVkLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHJpdmF0ZSBib29sZWFuIF9hbGxvd0luZm9ybWFsUGFyYW1ldGVycyA9IHRydWU7Ci0KLSAgICAvKioKLSAgICAgKiAgVGhlIFhNTCBQdWJsaWMgSWQgdXNlZCB3aGVuIHRoZSBwYWdlIG9yIGNvbXBvbmVudCBzcGVjaWZpY2F0aW9uIHdhcyByZWFkCi0gICAgICogIChpZiBhcHBsaWNhYmxlKS4KLSAgICAgKiAKLSAgICAgKiAgQHNpbmNlIDIuMgotICAgICAqIAotICAgICAqKi8KLQotICAgIHByaXZhdGUgU3RyaW5nIF9wdWJsaWNJZDsKLQotICAgIC8qKgotICAgICAqICBJbmRpY2F0ZXMgdGhhdCB0aGUgc3BlY2lmaWNhdGlvbiBpcyBmb3IgYSBwYWdlLCBub3QgYSBjb21wb25lbnQuCi0gICAgICogCi0gICAgICogIEBzaW5jZSAyLjIKLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwcml2YXRlIGJvb2xlYW4gX3BhZ2VTcGVjaWZpY2F0aW9uOwotCi0gICAgLyoqCi0gICAgICogIFRoZSBsb2NhdGlvbiBmcm9tIHdoaWNoIHRoZSBzcGVjaWZpY2F0aW9uIHdhcyBvYnRhaW5lZC4KLSAgICAgKiAKLSAgICAgKiAgQHNpbmNlIDMuMAotICAgICAqIAotICAgICAqKi8KLQotICAgIHByaXZhdGUgSVJlc291cmNlTG9jYXRpb24gX3NwZWNpZmljYXRpb25Mb2NhdGlvbjsKLQotICAgIC8qKgotICAgICAqICBBIE1hcCBvZiB7QGxpbmsgSVByb3BlcnR5U3BlY2lmaWNhdGlvbn0ga2V5ZWQgb24gdGhlIG5hbWUKLSAgICAgKiAgb2YgdGhlIHByb3BlcnR5LgotICAgICAqCi0gICAgICogIEBzaW5jZSAzLjAKLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwcml2YXRlIE1hcCBfcHJvcGVydHlTcGVjaWZpY2F0aW9uczsKLQotICAgIC8qKgotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBuYW1lIGFscmVhZHkgZXhpc3RzLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgYWRkQXNzZXQoU3RyaW5nIG5hbWUsIElBc3NldFNwZWNpZmljYXRpb24gYXNzZXQpCi0gICAgewotICAgICAgICBpZiAoX2Fzc2V0cyA9PSBudWxsKQotICAgICAgICAgICAgX2Fzc2V0cyA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICAgICAgaWYgKF9hc3NldHMuY29udGFpbnNLZXkobmFtZSkpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIFRhcGVzdHJ5LmZvcm1hdCgiQ29tcG9uZW50U3BlY2lmaWNhdGlvbi5kdXBsaWNhdGUtYXNzZXQiLCB0aGlzLCBuYW1lKSk7Ci0KLSAgICAgICAgX2Fzc2V0cy5wdXQobmFtZSwgYXNzZXQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgaWQgaXMgYWxyZWFkeSBkZWZpbmVkLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgYWRkQ29tcG9uZW50KFN0cmluZyBpZCwgSUNvbnRhaW5lZENvbXBvbmVudCBjb21wb25lbnQpCi0gICAgewotICAgICAgICBpZiAoX2NvbXBvbmVudHMgPT0gbnVsbCkKLSAgICAgICAgICAgIF9jb21wb25lbnRzID0gbmV3IEhhc2hNYXAoKTsKLQotICAgICAgICBpZiAoX2NvbXBvbmVudHMuY29udGFpbnNLZXkoaWQpKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICBUYXBlc3RyeS5mb3JtYXQoIkNvbXBvbmVudFNwZWNpZmljYXRpb24uZHVwbGljYXRlLWNvbXBvbmVudCIsIHRoaXMsIGlkKSk7Ci0KLSAgICAgICAgX2NvbXBvbmVudHMucHV0KGlkLCBjb21wb25lbnQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBBZGRzIHRoZSBwYXJhbWV0ZXIuICAgVGhlIG5hbWUgaXMgYWRkZWQgYXMgYSByZXNlcnZlZCBuYW1lLgotICAgICAqCi0gICAgICogIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBuYW1lIGFscmVhZHkgZXhpc3RzLgotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIGFkZFBhcmFtZXRlcihTdHJpbmcgbmFtZSwgSVBhcmFtZXRlclNwZWNpZmljYXRpb24gc3BlYykKLSAgICB7Ci0gICAgICAgIGlmIChfcGFyYW1ldGVycyA9PSBudWxsKQotICAgICAgICAgICAgX3BhcmFtZXRlcnMgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgICAgIGlmIChfcGFyYW1ldGVycy5jb250YWluc0tleShuYW1lKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgVGFwZXN0cnkuZm9ybWF0KCJDb21wb25lbnRTcGVjaWZpY2F0aW9uLmR1cGxpY2F0ZS1wYXJhbWV0ZXIiLCB0aGlzLCBuYW1lKSk7Ci0KLSAgICAgICAgX3BhcmFtZXRlcnMucHV0KG5hbWUsIHNwZWMpOwotCi0gICAgICAgIGFkZFJlc2VydmVkUGFyYW1ldGVyTmFtZShuYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0cnVlIGlmIHRoZSBjb21wb25lbnQgaXMgYWxsb3dlZCB0byB3cmFwIG90aGVyIGVsZW1lbnRzIChzdGF0aWMgSFRNTAotICAgICAqICBvciBvdGhlciBjb21wb25lbnRzKS4gIFRoZSBkZWZhdWx0IGlzIHRydWUuCi0gICAgICoKLSAgICAgKiAgQHNlZSAjc2V0QWxsb3dCb2R5KGJvb2xlYW4pCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRBbGxvd0JvZHkoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9hbGxvd0JvZHk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgdHJ1ZSBpZiB0aGUgY29tcG9uZW50IGFsbG93cyBpbmZvcm1hbCBwYXJhbWV0ZXJzIChwYXJhbWV0ZXJzCi0gICAgICogIG5vdCBmb3JtYWxseSBkZWZpbmVkKS4gIEluZm9ybWFsIHBhcmFtZXRlcnMgYXJlIGdlbmVyYWxseSB1c2VkIHRvIGNyZWF0ZQotICAgICAqICBhZGRpdGlvbmFsIEhUTUwgYXR0cmlidXRlcyBmb3IgYW4gSFRNTCB0YWcgcmVuZGVyZWQgYnkgdGhlCi0gICAgICogIGNvbXBvbmVudC4gIFRoaXMgaXMgb2Z0ZW4gdXNlZCB0byBzcGVjaWZ5IEphdmFTY3JpcHQgZXZlbnQgaGFuZGxlcnMgb3IgdGhlIGNsYXNzCi0gICAgICogIG9mIHRoZSBjb21wb25lbnQgKGZvciBDYXNjYXJkaW5nIFN0eWxlIFNoZWV0cykuCi0gICAgICoKLSAgICAgKiA8cD5UaGUgZGVmYXVsdCB2YWx1ZSBpcyB0cnVlLgotICAgICAqCi0gICAgICogIEBzZWUgI3NldEFsbG93SW5mb3JtYWxQYXJhbWV0ZXJzKGJvb2xlYW4pCi0gICAgICoqLwotCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0QWxsb3dJbmZvcm1hbFBhcmFtZXRlcnMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9hbGxvd0luZm9ybWFsUGFyYW1ldGVyczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0aGUge0BsaW5rIElBc3NldFNwZWNpZmljYXRpb259IHdpdGggdGhlIGdpdmVuIG5hbWUsIG9yIG51bGwKLSAgICAgKiAgaWYgbm8gc3VjaCBzcGVjaWZpY2F0aW9uIGV4aXN0cy4KLSAgICAgKgotICAgICAqICBAc2VlICNhZGRBc3NldChTdHJpbmcsSUFzc2V0U3BlY2lmaWNhdGlvbikKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgSUFzc2V0U3BlY2lmaWNhdGlvbiBnZXRBc3NldChTdHJpbmcgbmFtZSkKLSAgICB7Ci0KLSAgICAgICAgcmV0dXJuIChJQXNzZXRTcGVjaWZpY2F0aW9uKSBnZXQoX2Fzc2V0cywgbmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgYSA8Y29kZT5MaXN0PC9jb2RlPgotICAgICAqICBvZiB0aGUgU3RyaW5nIG5hbWVzIG9mIGFsbCBhc3NldHMsIGluIGFscGhhYmV0aWNhbAotICAgICAqICBvcmRlcgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIExpc3QgZ2V0QXNzZXROYW1lcygpCi0gICAgewotICAgICAgICByZXR1cm4gc29ydGVkS2V5cyhfYXNzZXRzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0aGUgc3BlY2lmaWNhdGlvbiBvZiBhIGNvbnRhaW5lZCBjb21wb25lbnQgd2l0aCB0aGUgZ2l2ZW4gaWQsIG9yCi0gICAgICogIG51bGwgaWYgbm8gc3VjaCBjb250YWluZWQgY29tcG9uZW50IGV4aXN0cy4KLSAgICAgKgotICAgICAqICBAc2VlICNhZGRDb21wb25lbnQoU3RyaW5nLCBJQ29udGFpbmVkQ29tcG9uZW50KQotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIElDb250YWluZWRDb21wb25lbnQgZ2V0Q29tcG9uZW50KFN0cmluZyBpZCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoSUNvbnRhaW5lZENvbXBvbmVudCkgZ2V0KF9jb21wb25lbnRzLCBpZCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRDb21wb25lbnRDbGFzc05hbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9jb21wb25lbnRDbGFzc05hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgYW4gPGNvZGU+TGlzdDwvY29kZT4KLSAgICAgKiAgb2YgdGhlIFN0cmluZyBuYW1lcyBvZiB0aGUge0BsaW5rIElDb250YWluZWRDb21wb25lbnR9cwotICAgICAqICBmb3IgdGhpcyBjb21wb25lbnQuCi0gICAgICoKLSAgICAgKiAgQHNlZSAjYWRkQ29tcG9uZW50KFN0cmluZywgSUNvbnRhaW5lZENvbXBvbmVudCkKLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBMaXN0IGdldENvbXBvbmVudElkcygpCi0gICAgewotICAgICAgICByZXR1cm4gc29ydGVkS2V5cyhfY29tcG9uZW50cyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgdGhlIHNwZWNpZmljYXRpb24gb2YgYSBwYXJhbWV0ZXIgd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgb3IKLSAgICAgKiAgbnVsbCBpZiBubyBzdWNoIHBhcmFtZXRlciBleGlzdHMuCi0gICAgICoKLSAgICAgKiAgQHNlZSAjYWRkUGFyYW1ldGVyKFN0cmluZywgSVBhcmFtZXRlclNwZWNpZmljYXRpb24pCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgSVBhcmFtZXRlclNwZWNpZmljYXRpb24gZ2V0UGFyYW1ldGVyKFN0cmluZyBuYW1lKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChJUGFyYW1ldGVyU3BlY2lmaWNhdGlvbikgZ2V0KF9wYXJhbWV0ZXJzLCBuYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyBhIExpc3Qgb2YKLSAgICAgKiAgb2YgU3RyaW5nIG5hbWVzIG9mIGFsbCBwYXJhbWV0ZXJzLiAgVGhpcyBsaXN0Ci0gICAgICogIGlzIGluIGFscGhhYmV0aWNhbCBvcmRlci4KLSAgICAgKgotICAgICAqICBAc2VlICNhZGRQYXJhbWV0ZXIoU3RyaW5nLCBJUGFyYW1ldGVyU3BlY2lmaWNhdGlvbikKLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBMaXN0IGdldFBhcmFtZXRlck5hbWVzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBzb3J0ZWRLZXlzKF9wYXJhbWV0ZXJzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRBbGxvd0JvZHkoYm9vbGVhbiB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIF9hbGxvd0JvZHkgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRBbGxvd0luZm9ybWFsUGFyYW1ldGVycyhib29sZWFuIHZhbHVlKQotICAgIHsKLSAgICAgICAgX2FsbG93SW5mb3JtYWxQYXJhbWV0ZXJzID0gdmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q29tcG9uZW50Q2xhc3NOYW1lKFN0cmluZyB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIF9jb21wb25lbnRDbGFzc05hbWUgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgQHNpbmNlIDEuMC40Ci0gICAgICoKLSAgICAgKiAgQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGJlYW4gYWxyZWFkeSBoYXMgYSBzcGVjaWZpY2F0aW9uLgotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIGFkZEJlYW5TcGVjaWZpY2F0aW9uKFN0cmluZyBuYW1lLCBJQmVhblNwZWNpZmljYXRpb24gc3BlY2lmaWNhdGlvbikKLSAgICB7Ci0gICAgICAgIGlmIChfYmVhbnMgPT0gbnVsbCkKLSAgICAgICAgICAgIF9iZWFucyA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgaWYgKF9iZWFucy5jb250YWluc0tleShuYW1lKSkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICBUYXBlc3RyeS5mb3JtYXQoIkNvbXBvbmVudFNwZWNpZmljYXRpb24uZHVwbGljYXRlLWJlYW4iLCB0aGlzLCBuYW1lKSk7Ci0KLSAgICAgICAgX2JlYW5zLnB1dChuYW1lLCBzcGVjaWZpY2F0aW9uKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgSUJlYW5TcGVjaWZpY2F0aW9ufSBmb3IgdGhlIGdpdmVuIG5hbWUsIG9yIG51bGwKLSAgICAgKiBpZiBub3Qgc3VjaCBzcGVjaWZpY2F0aW9uIGV4aXN0cy4KLSAgICAgKgotICAgICAqIEBzaW5jZSAxLjAuNAotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIElCZWFuU3BlY2lmaWNhdGlvbiBnZXRCZWFuU3BlY2lmaWNhdGlvbihTdHJpbmcgbmFtZSkKLSAgICB7Ci0gICAgICAgIGlmIChfYmVhbnMgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIHJldHVybiAoSUJlYW5TcGVjaWZpY2F0aW9uKSBfYmVhbnMuZ2V0KG5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIGFuIHVubW9kaWZpYWJsZSBjb2xsZWN0aW9uIG9mIHRoZSBuYW1lcyBvZiBhbGwgYmVhbnMuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgQ29sbGVjdGlvbiBnZXRCZWFuTmFtZXMoKQotICAgIHsKLSAgICAgICAgaWYgKF9iZWFucyA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0KLSAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUNvbGxlY3Rpb24oX2JlYW5zLmtleVNldCgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgQWRkcyB0aGUgdmFsdWUgYXMgYSByZXNlcnZlZCBuYW1lLiAgUmVzZXJ2ZWQgbmFtZXMgYXJlIG5vdCBhbGxvd2VkCi0gICAgICogIGFzIHRoZSBuYW1lcyBvZiBpbmZvcm1hbCBwYXJhbWV0ZXJzLiAgU2luY2UgdGhlIGNvbXBhcmlzb24gaXMKLSAgICAgKiAgY2FzZWxlc3MsIHRoZSB2YWx1ZSBpcyBjb252ZXJ0ZWQgdG8gbG93ZXJjYXNlIGJlZm9yZSBiZWluZwotICAgICAqICBzdG9yZWQuCi0gICAgICoKLSAgICAgKiAgQHNpbmNlIDEuMC41Ci0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCBhZGRSZXNlcnZlZFBhcmFtZXRlck5hbWUoU3RyaW5nIHZhbHVlKQotICAgIHsKLSAgICAgICAgaWYgKF9yZXNlcnZlZFBhcmFtZXRlck5hbWVzID09IG51bGwpCi0gICAgICAgICAgICBfcmVzZXJ2ZWRQYXJhbWV0ZXJOYW1lcyA9IG5ldyBIYXNoU2V0KCk7Ci0KLSAgICAgICAgX3Jlc2VydmVkUGFyYW1ldGVyTmFtZXMuYWRkKHZhbHVlLnRvTG93ZXJDYXNlKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIHRydWUgaWYgdGhlIHZhbHVlIHNwZWNpZmllZCBpcyBpbiB0aGUgcmVzZXJ2ZWQgbmFtZSBsaXN0LgotICAgICAqICBUaGUgY29tcGFyaXNvbiBpcyBjYXNlbGVzcy4gIEFsbCBmb3JtYWwgcGFyYW1ldGVycyBhcmUgYXV0b21hdGljYWxseQotICAgICAqICBpbiB0aGUgcmVzZXJ2ZWQgbmFtZSBsaXN0LCBhcyB3ZWxsIGFzIGFueSBhZGRpdGlvbmFsCi0gICAgICogIHJlc2VydmVkIG5hbWVzIHNwZWNpZmllZCBpbiB0aGUgY29tcG9uZW50IHNwZWNpZmljYXRpb24uICBUaGUgbGF0dGVyCi0gICAgICogIHJlZmVyIHRvIEhUTUwgYXR0cmlidXRlcyBnZW5lcmF0ZWQgZGlyZWN0bHkgYnkgdGhlIGNvbXBvbmVudC4KLSAgICAgKgotICAgICAqICBAc2luY2UgMS4wLjUKLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBib29sZWFuIGlzUmVzZXJ2ZWRQYXJhbWV0ZXJOYW1lKFN0cmluZyB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIGlmIChfcmVzZXJ2ZWRQYXJhbWV0ZXJOYW1lcyA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIHJldHVybiBfcmVzZXJ2ZWRQYXJhbWV0ZXJOYW1lcy5jb250YWlucyh2YWx1ZS50b0xvd2VyQ2FzZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgICB7Ci0gICAgICAgIFRvU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFRvU3RyaW5nQnVpbGRlcih0aGlzKTsKLQotICAgICAgICBidWlsZGVyLmFwcGVuZCgiY29tcG9uZW50Q2xhc3NOYW1lIiwgX2NvbXBvbmVudENsYXNzTmFtZSk7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJwYWdlU3BlY2lmaWNhdGlvbiIsIF9wYWdlU3BlY2lmaWNhdGlvbik7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJzcGVjaWZpY2F0aW9uTG9jYXRpb24iLCBfc3BlY2lmaWNhdGlvbkxvY2F0aW9uKTsKLSAgICAgICAgYnVpbGRlci5hcHBlbmQoImFsbG93Qm9keSIsIF9hbGxvd0JvZHkpOwotICAgICAgICBidWlsZGVyLmFwcGVuZCgiYWxsb3dJbmZvcm1hbFBhcmFtZXRlciIsIF9hbGxvd0luZm9ybWFsUGFyYW1ldGVycyk7Ci0KLSAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhpcyBjb21wb25lbnQuCi0gICAgICogCi0gICAgICogIEBzaW5jZSAxLjAuOQotICAgICAqKi8KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9kZXNjcmlwdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgU2V0cyB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhpcyBjb21wb25lbnQuCi0gICAgICogCi0gICAgICogIEBzaW5jZSAxLjAuOQotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikKLSAgICB7Ci0gICAgICAgIF9kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIHRoZSBYTUwgUHVibGljIElkIGZvciB0aGUgc3BlY2lmaWNhdGlvbiBmaWxlLCBvciBudWxsCi0gICAgICogIGlmIG5vdCBhcHBsaWNhYmxlLgotICAgICAqIAotICAgICAqICA8cD4KLSAgICAgKiAgVGhpcyBtZXRob2QgZXhpc3RzIGFzIGEgY29udmllbmllbmNlIGZvciB0aGUgU3BpbmRsZSBwbHVnaW4uCi0gICAgICogIEEgcHJldmlvdXMgbWV0aG9kIHVzZWQgYW4gYXJiaXRyYXJ5IHZlcnNpb24gc3RyaW5nLCB0aGUKLSAgICAgKiAgcHVibGljIGlkIGlzIG1vcmUgdXNlZnVsIGFuZCBsZXNzIGFtYmlndW91cy4KLSAgICAgKiAgCi0gICAgICogIEBzaW5jZSAyLjIKLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFB1YmxpY0lkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfcHVibGljSWQ7Ci0gICAgfQotCi0gICAgLyoqIEBzaW5jZSAyLjIgKiovCi0KLSAgICBwdWJsaWMgdm9pZCBzZXRQdWJsaWNJZChTdHJpbmcgcHVibGljSWQpCi0gICAgewotICAgICAgICBfcHVibGljSWQgPSBwdWJsaWNJZDsKLSAgICB9Ci0KLSAgICAvKiogCi0gICAgICogCi0gICAgICogIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWNhdGlvbiBpcyBrbm93biB0byBiZSBhIHBhZ2UKLSAgICAgKiAgc3BlY2lmaWNhdGlvbiBhbmQgbm90IGEgY29tcG9uZW50IHNwZWNpZmljYXRpb24uICBFYXJsaWVyIHZlcnNpb25zCi0gICAgICogIG9mIHRoZSBmcmFtZXdvcmsgZGlkIG5vdCBkaXN0aW5ndWlzaCBiZXR3ZWVuIHRoZSB0d28sIGJ1dCBzdGFydGluZwotICAgICAqICBpbiAyLjIsIHRoZXJlIGFyZSBzZXBlcmF0ZSBYTUwgZW50aXRpZXMgZm9yIHBhZ2VzIGFuZCBjb21wb25lbnRzLgotICAgICAqICBQYWdlcyBvbWl0IHNldmVyYWwgYXR0cmlidXRlcyBhbmQgZW50aXRpZXMgcmVsYXRlZAotICAgICAqICB0byBwYXJhbWV0ZXJzLCBhcyBwYXJhbWV0ZXJzIG9ubHkgbWFrZSBzZW5zZSBmb3IgY29tcG9uZW50cy4KLSAgICAgKiAgCi0gICAgICogIEBzaW5jZSAyLjIgCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIGJvb2xlYW4gaXNQYWdlU3BlY2lmaWNhdGlvbigpCi0gICAgewotICAgICAgICByZXR1cm4gX3BhZ2VTcGVjaWZpY2F0aW9uOwotICAgIH0KLQotICAgIC8qKiBAc2luY2UgMi4yICoqLwotCi0gICAgcHVibGljIHZvaWQgc2V0UGFnZVNwZWNpZmljYXRpb24oYm9vbGVhbiBwYWdlU3BlY2lmaWNhdGlvbikKLSAgICB7Ci0gICAgICAgIF9wYWdlU3BlY2lmaWNhdGlvbiA9IHBhZ2VTcGVjaWZpY2F0aW9uOwotICAgIH0KLQotICAgIC8qKiBAc2luY2UgMi4yICoqLwotCi0gICAgcHJpdmF0ZSBMaXN0IHNvcnRlZEtleXMoTWFwIGlucHV0KQotICAgIHsKLSAgICAgICAgaWYgKGlucHV0ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQotICAgICAgICBMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoaW5wdXQua2V5U2V0KCkpOwotCi0gICAgICAgIENvbGxlY3Rpb25zLnNvcnQocmVzdWx0KTsKLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKiBAc2luY2UgMi4yICoqLwotCi0gICAgcHJpdmF0ZSBPYmplY3QgZ2V0KE1hcCBtYXAsIE9iamVjdCBrZXkpCi0gICAgewotICAgICAgICBpZiAobWFwID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICByZXR1cm4gbWFwLmdldChrZXkpOwotICAgIH0KLQotICAgIC8qKiBAc2luY2UgMy4wICoqLwotCi0gICAgcHVibGljIElSZXNvdXJjZUxvY2F0aW9uIGdldFNwZWNpZmljYXRpb25Mb2NhdGlvbigpCi0gICAgewotICAgICAgICByZXR1cm4gX3NwZWNpZmljYXRpb25Mb2NhdGlvbjsKLSAgICB9Ci0KLSAgICAvKiogQHNpbmNlIDMuMCAqKi8KLQotICAgIHB1YmxpYyB2b2lkIHNldFNwZWNpZmljYXRpb25Mb2NhdGlvbihJUmVzb3VyY2VMb2NhdGlvbiBzcGVjaWZpY2F0aW9uTG9jYXRpb24pCi0gICAgewotICAgICAgICBfc3BlY2lmaWNhdGlvbkxvY2F0aW9uID0gc3BlY2lmaWNhdGlvbkxvY2F0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBBZGRzIGEgbmV3IHByb3BlcnR5IHNwZWNpZmljYXRpb24uICBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgbXVzdAotICAgICAqICBub3QgYWxyZWFkeSBiZSBkZWZpbmVkIChhbmQgbXVzdCBub3QgY2hhbmdlIGFmdGVyIGJlaW5nIGFkZGVkKS4KLSAgICAgKiAKLSAgICAgKiAgQHNpbmNlIDMuMAotICAgICAqIAotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIGFkZFByb3BlcnR5U3BlY2lmaWNhdGlvbihJUHJvcGVydHlTcGVjaWZpY2F0aW9uIHNwZWMpCi0gICAgewotICAgICAgICBpZiAoX3Byb3BlcnR5U3BlY2lmaWNhdGlvbnMgPT0gbnVsbCkKLSAgICAgICAgICAgIF9wcm9wZXJ0eVNwZWNpZmljYXRpb25zID0gbmV3IEhhc2hNYXAoKTsKLQotICAgICAgICBTdHJpbmcgbmFtZSA9IHNwZWMuZ2V0TmFtZSgpOwotCi0gICAgICAgIGlmIChfcHJvcGVydHlTcGVjaWZpY2F0aW9ucy5jb250YWluc0tleShuYW1lKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgVGFwZXN0cnkuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAiQ29tcG9uZW50U3BlY2lmaWNhdGlvbi5kdXBsaWNhdGUtcHJvcGVydHktc3BlY2lmaWNhdGlvbiIsCi0gICAgICAgICAgICAgICAgICAgIHRoaXMsCi0gICAgICAgICAgICAgICAgICAgIG5hbWUpKTsKLQotICAgICAgICBfcHJvcGVydHlTcGVjaWZpY2F0aW9ucy5wdXQobmFtZSwgc3BlYyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgYSBzb3J0ZWQsIGltbXV0YWJsZSBsaXN0IG9mIHRoZSBuYW1lcyBvZiBhbGwgCi0gICAgICogIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LnNwZWMuSVByb3BlcnR5U3BlY2lmaWNhdGlvbn1zLgotICAgICAqIAotICAgICAqICBAc2luY2UgMy4wCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIExpc3QgZ2V0UHJvcGVydHlTcGVjaWZpY2F0aW9uTmFtZXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHNvcnRlZEtleXMoX3Byb3BlcnR5U3BlY2lmaWNhdGlvbnMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIHRoZSBuYW1lZCB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5zcGVjLklQcm9wZXJ0eVNwZWNpZmljYXRpb259LAotICAgICAqICBvciBudWxsICBpZiBubyBzdWNoIHNwZWNpZmljYXRpb24gZXhpc3QuCi0gICAgICogCi0gICAgICogIEBzaW5jZSAzLjAKLSAgICAgKiAgQHNlZSAjYWRkUHJvcGVydHlTcGVjaWZpY2F0aW9uKElQcm9wZXJ0eVNwZWNpZmljYXRpb24pCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIElQcm9wZXJ0eVNwZWNpZmljYXRpb24gZ2V0UHJvcGVydHlTcGVjaWZpY2F0aW9uKFN0cmluZyBuYW1lKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChJUHJvcGVydHlTcGVjaWZpY2F0aW9uKSBnZXQoX3Byb3BlcnR5U3BlY2lmaWNhdGlvbnMsIG5hbWUpOwotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9zcGVjL0NvbnRhaW5lZENvbXBvbmVudC5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3NwZWMvQ29udGFpbmVkQ29tcG9uZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5ZDY3MTMuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3NwZWMvQ29udGFpbmVkQ29tcG9uZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuc3BlYzsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIERlZmluZXMgYSBjb250YWluZWQgY29tcG9uZW50LiAgVGhpcyBpbmNsdWRlcyB0aGUgaW5mb3JtYXRpb24gbmVlZGVkIHRvCi0gKiBnZXQgdGhlIGNvbnRhaW5lZCBjb21wb25lbnQncyBzcGVjaWZpY2F0aW9uLCBhcyB3ZWxsIGFzIGFueSBiaW5kaW5ncwotICogZm9yIHRoZSBjb21wb25lbnQuCi0gKgotICogQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogQHZlcnNpb24gJElkJAotICogCi0gKiovCi0KLXB1YmxpYyBjbGFzcyBDb250YWluZWRDb21wb25lbnQgZXh0ZW5kcyBMb2NhdGFibGVQcm9wZXJ0eUhvbGRlciBpbXBsZW1lbnRzIElDb250YWluZWRDb21wb25lbnQKLXsKLQlwcml2YXRlIFN0cmluZyB0eXBlOwotCi0JcHJpdmF0ZSBTdHJpbmcgY29weU9mOwotICAgIAotICAgIHByaXZhdGUgYm9vbGVhbiBpbmhlcml0SW5mb3JtYWxQYXJhbWV0ZXJzOwotCi0JcHJvdGVjdGVkIE1hcCBiaW5kaW5nczsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVBfU0laRSA9IDM7Ci0KLQkvKioKLQkgKiAgUmV0dXJucyB0aGUgbmFtZWQgYmluZGluZywgb3IgbnVsbCBpZiB0aGUgYmluZGluZyBkb2VzIG5vdAotCSAqICBleGlzdC4KLQkgKgotCSAqKi8KLQotCXB1YmxpYyBJQmluZGluZ1NwZWNpZmljYXRpb24gZ2V0QmluZGluZyhTdHJpbmcgbmFtZSkKLQl7Ci0JCWlmIChiaW5kaW5ncyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJcmV0dXJuIChJQmluZGluZ1NwZWNpZmljYXRpb24pIGJpbmRpbmdzLmdldChuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiAgUmV0dXJucyBhbiB1bW9kaWZpYWJsZSA8Y29kZT5Db2xsZWN0aW9uPC9jb2RlPgotCSAqICBvZiBTdHJpbmdzLCBlYWNoIHRoZSBuYW1lIG9mIG9uZSBiaW5kaW5nCi0JICogIGZvciB0aGUgY29tcG9uZW50LgotCSAqCi0JICoqLwotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0QmluZGluZ05hbWVzKCkKLQl7Ci0JCWlmIChiaW5kaW5ncyA9PSBudWxsKQotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0KLQkJcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUNvbGxlY3Rpb24oYmluZGluZ3Mua2V5U2V0KCkpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpCi0JewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRCaW5kaW5nKFN0cmluZyBuYW1lLCBJQmluZGluZ1NwZWNpZmljYXRpb24gc3BlYykKLQl7Ci0JCWlmIChiaW5kaW5ncyA9PSBudWxsKQotCQkJYmluZGluZ3MgPSBuZXcgSGFzaE1hcChNQVBfU0laRSk7Ci0KLQkJYmluZGluZ3MucHV0KG5hbWUsIHNwZWMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIHZhbHVlKQotCXsKLQkJdHlwZSA9IHZhbHVlOwotCX0KLQotCS8qKgotCSAqIAlTZXRzIHRoZSBTdHJpbmcgSWQgb2YgdGhlIGNvbXBvbmVudCBiZWluZyBjb3BpZWQgZnJvbS4KLQkgKiAgRm9yIHVzZSBieSBJREUgdG9vbHMgbGlrZSBTcGluZGxlLgotCSAqIAotCSAqICBAc2luY2UgMS4wLjkKLQkgKiovCi0KLQlwdWJsaWMgdm9pZCBzZXRDb3B5T2YoU3RyaW5nIGlkKQotCXsKLQkJY29weU9mID0gaWQ7Ci0JfQotCi0JLyoqCi0JICogCVJldHVybnMgdGhlIGlkIG9mIHRoZSBjb21wb25lbnQgYmVpbmcgY29waWVkIGZyb20uCi0JICogIEZvciB1c2UgYnkgSURFIHRvb2xzIGxpa2UgU3BpbmRsZS4KLQkgKiAKLQkgKiAgQHNpbmNlIDEuMC45Ci0JICoqLwotCi0JcHVibGljIFN0cmluZyBnZXRDb3B5T2YoKQotCXsKLQkJcmV0dXJuIGNvcHlPZjsKLQl9Ci0KLQkvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGNvbnRhaW5lZCBjb21wb25lbnQgd2lsbCBpbmhlcml0IAotICAgICAqIHRoZSBpbmZvcm1hbCBwYXJhbWV0ZXJzIG9mIGl0cyBwYXJlbnQuIAotICAgICAqIAotCSAqIEBzaW5jZSAzLjAKLQkgKiovCi0JcHVibGljIGJvb2xlYW4gZ2V0SW5oZXJpdEluZm9ybWFsUGFyYW1ldGVycygpCi0JewotCQlyZXR1cm4gaW5oZXJpdEluZm9ybWFsUGFyYW1ldGVyczsKLQl9Ci0KLQkvKioKLSAgICAgKiBTZXRzIHdoZXRoZXIgdGhlIGNvbnRhaW5lZCBjb21wb25lbnQgd2lsbCBpbmhlcml0IAotICAgICAqIHRoZSBpbmZvcm1hbCBwYXJhbWV0ZXJzIG9mIGl0cyBwYXJlbnQuIAotICAgICAqIAotICAgICAqIEBzaW5jZSAzLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbmhlcml0SW5mb3JtYWxQYXJhbWV0ZXJzKGJvb2xlYW4gdmFsdWUpCi0JewotCQlpbmhlcml0SW5mb3JtYWxQYXJhbWV0ZXJzID0gdmFsdWU7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3NwZWMvRGlyZWN0aW9uLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvc3BlYy9EaXJlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE5MjcxNC4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvc3BlYy9EaXJlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5zcGVjOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuZW51bS5FbnVtOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuVGFwZXN0cnk7Ci0KLS8qKgotICogIFJlcHJlc2VudHMgZGlmZmVyZW50IHR5cGVzIG9mIHBhcmFtZXRlcnMuICBDdXJyZW50bHkgb25seSAKLSAqICBpbiBhbmQgY3VzdG9tIGFyZSBzdXBwb3J0ZWQsIGJ1dCB0aGlzIHdpbGwgbGlrZWx5IGNoYW5nZQotICogIHdoZW4gVGFwZXN0cnkgc3VwcG9ydHMgb3V0IHBhcmFtZXRlcnMgaXMgc29tZSBmb3JtICh0aGF0IHJlZmxlY3RzCi0gKiAgZm9ybSBzdHlsZSBwcm9jZXNzaW5nKS4KLSAqCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogIEB2ZXJzaW9uICRJZCQKLSAqICBAc2luY2UgMi4wLjMKLSAqCi0gKi8KLSAKLXB1YmxpYyBjbGFzcyBEaXJlY3Rpb24gZXh0ZW5kcyBFbnVtCi17Ci0gICAgLyoqCi0gICAgICogIFRoZSBwYXJhbWV0ZXIgdmFsdWUgaXMgaW5wdXQgb25seTsgdGhlIGNvbXBvbmVudCBwcm9wZXJ0eSB2YWx1ZQotICAgICAqICBpcyB1bmNoYW5nZWQgb3Igbm90IHJlbGV2YW50IGFmdGVyIHRoZSBjb21wb25lbnQgcmVuZGVycy4KLSAgICAgKiAgVGhlIHByb3BlcnR5IGlzIHNldCBmcm9tIHRoZSBiaW5kaW5nIGJlZm9yZSB0aGUgY29tcG9uZW50IHJlbmRlcnMsCi0gICAgICogIHRoZW4gcmVzZXQgdG8gaW5pdGlhbCB2YWx1ZSBhZnRlciB0aGUgY29tcG9uZW50IHJlbmRlcnMuCi0gICAgICogCi0gICAgICovCi0gICAgCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEaXJlY3Rpb24gSU4gPSBuZXcgRGlyZWN0aW9uKCJJTiIpOwotCQotICAgIAotICAgIC8qKgotICAgICAqICBFbmNhcHN1bGF0ZXMgdGhlIHNlbWFudGljcyBvZiBhIGZvcm0gY29tcG9uZW50J3MgdmFsdWUgcGFyYW1ldGVyLgotICAgICAqIAotICAgICAqICA8cD5UaGUgcGFyYW1ldGVyIGlzIGFzc29jaWF0ZWQgd2l0aCBhIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LmZvcm0uSUZvcm1Db21wb25lbnR9LgotICAgICAqICBUaGUgcHJvcGVydHkgdmFsdWUgaXMgc2V0IGZyb20gdGhlIGJpbmRpbmcgYmVmb3JlIHRoZSBjb21wb25lbnQgcmVuZGVycyAod2hlbiByZW5kZXJyaW5nLAotICAgICAqICBidXQgbm90IHdoZW4gcmV3aW5kaW5nKS4KLSAgICAgKiAgVGhlIGJpbmRpbmcgaXMgdXBkYXRlZCBmcm9tIHRoZSBwcm9wZXJ0eSB2YWx1ZQotICAgICAqICBhZnRlciBhZnRlciB0aGUgY29tcG9uZW50IHJlbmRlcnMgd2hlbiB0aGUKLSAgICAgKiAgPGI+Y29udGFpbmluZyBmb3JtPC9iPiBpcyA8Yj5yZXdpbmRpbmc8L2I+LCA8aT5hbmQ8L2k+Ci0gICAgICogIHRoZSBjb21wb25lbnQgaXMgbm90IHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LmZvcm0uSUZvcm1Db21wb25lbnQjaXNEaXNhYmxlZCgpIGRpc2FibGVkfS4KLSAgICAgKiAKLSAgICAgKiAgQHNpbmNlIDIuMgotICAgICAqIAotICAgICAqLwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBEaXJlY3Rpb24gRk9STSA9IG5ldyBEaXJlY3Rpb24oIkZPUk0iLCBmYWxzZSk7ICAgIAotICAgIAotCS8qKgotCSAqICBQcm9jZXNzaW5nIG9mIHRoZSBwYXJhbWV0ZXIgaXMgZW50aXJlbHkgdGhlIHJlc3BvbnNpYmlsaXR5Ci0JICogIG9mIHRoZSBjb21wb25lbnQsIHdoaWNoIG11c3Qgb2J0YWluIGFuIG1hbmlwdWxhdGUKLQkgKiAgdGhlIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LklCaW5kaW5nfSAoaWYgYW55KSBmb3IgdGhlIHBhcmFtZXRlci4KLQkgKiAKLQkgKiovCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEaXJlY3Rpb24gQ1VTVE9NID0gbmV3IERpcmVjdGlvbigiQ1VTVE9NIik7Ci0KLQotCS8qKgotCSAqICBDYXVzZXMgYSBzeW50aGV0aWMgcHJvcGVydHkgdG8gYmUgY3JlYXRlZCB0aGF0IGF1dG9tYXRpY2FsbHkKLQkgKiAgcmVmZXJlbmNlcyBhbmQgZGUtcmVmZXJlbmNlcyB0aGUgdW5kZXJseWluZyBiaW5kaW5nLgotCSAqIAotCSAqICBAc2luY2UgMy4wCi0JICogCi0JICovCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEaXJlY3Rpb24gQVVUTyA9IG5ldyBEaXJlY3Rpb24oIkFVVE8iKTsKLQkKLQkvKioKLQkgKiBJZiB0cnVlLCB0aGVuIHRoaXMgZGlyZWN0aW9uIGlzIGFsbG93ZWQgd2l0aCBpbnZhcmlhbnQgYmluZGluZ3MgKHRoZSB1c3VhbCBjYXNlKS4KLQkgKiBJZiBmYWxzZSwgdGhlbiB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5wYXJhbS5QYXJhbWV0ZXJNYW5hZ2VyfSB3aWxsIG5vdCBhbGxvdwotCSAqIGFuIGludmFyaWFudCBiaW5kaW5nLgotCSAqIAotCSAqIEBzaW5jZSAzLjAKLQkgKi8KLQkKLQlwcml2YXRlIGJvb2xlYW4gX2FsbG93SW52YXJpYW50OwotCQotICAgIHByb3RlY3RlZCBEaXJlY3Rpb24oU3RyaW5nIG5hbWUpCi0gICAgewotICAgICAgICB0aGlzKG5hbWUsIHRydWUpOwotICAgIH0KLQotCXByb3RlY3RlZCBEaXJlY3Rpb24oU3RyaW5nIG5hbWUsIGJvb2xlYW4gYWxsb3dJbnZhcmlhbnQpCi0JewotCQlzdXBlcihuYW1lKTsKLQkJCi0JCV9hbGxvd0ludmFyaWFudCA9IGFsbG93SW52YXJpYW50OwotCX0KLQkKLQkvKioKLQkgKiBAc2luY2UgMy4wCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0QWxsb3dJbnZhcmlhbnQoKQotCXsKLQkJcmV0dXJuIF9hbGxvd0ludmFyaWFudDsKLQl9Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyBhIHVzZXItcHJlc2VudGFibGUgbmFtZSBmb3IgdGhlIGRpcmVjdGlvbi4KLSAgICAgKiAKLSAgICAgKi8KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlOYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBUYXBlc3RyeS5nZXRNZXNzYWdlKCJEaXJlY3Rpb24uIiArIGdldE5hbWUoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3NwZWMvRXh0ZW5zaW9uU3BlY2lmaWNhdGlvbi5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3NwZWMvRXh0ZW5zaW9uU3BlY2lmaWNhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZmU4ZTdlLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9zcGVjL0V4dGVuc2lvblNwZWNpZmljYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5zcGVjOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5BcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVzb3VyY2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LlRhcGVzdHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkudXRpbC5wcm9wLk9nbmxVdGlsczsKLQotLyoqCi0gKiAgRGVmaW5lcyBhbiAiZXh0ZW5zaW9uIiwgd2hpY2ggaXMgbXVjaCBsaWtlIGEgaGVscGVyIGJlYW4sIGJ1dCAKLSAqICBpcyBwYXJ0IG9mIGEgbGlicmFyeSBvciBhcHBsaWNhdGlvbiBzcGVjaWZpY2F0aW9uIChhbmQgaGFzIHRoZSBzYW1lCi0gKiAgbGlmZWN5Y2xlIGFzIHRoZSBhcHBsaWNhdGlvbikuCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQHNpbmNlIDIuMgotICogCi0gKiovCi0KLXB1YmxpYyBjbGFzcyBFeHRlbnNpb25TcGVjaWZpY2F0aW9uCi0gICAgZXh0ZW5kcyBMb2NhdGFibGVQcm9wZXJ0eUhvbGRlcgotICAgIGltcGxlbWVudHMgSUV4dGVuc2lvblNwZWNpZmljYXRpb24KLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgTE9HID0gTG9nRmFjdG9yeS5nZXRMb2coRXh0ZW5zaW9uU3BlY2lmaWNhdGlvbi5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBfY2xhc3NOYW1lOwotICAgIHByb3RlY3RlZCBNYXAgX2NvbmZpZ3VyYXRpb24gPSBuZXcgSGFzaE1hcCgpOwotICAgIHByaXZhdGUgYm9vbGVhbiBfaW1tZWRpYXRlOwotCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9jbGFzc05hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q2xhc3NOYW1lKFN0cmluZyBjbGFzc05hbWUpCi0gICAgewotICAgICAgICBfY2xhc3NOYW1lID0gY2xhc3NOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZENvbmZpZ3VyYXRpb24oU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IHZhbHVlKQotICAgIHsKLSAgICAgICAgaWYgKF9jb25maWd1cmF0aW9uLmNvbnRhaW5zS2V5KHByb3BlcnR5TmFtZSkpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIFRhcGVzdHJ5LmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgIkV4dGVuc2lvblNwZWNpZmljYXRpb24uZHVwbGljYXRlLXByb3BlcnR5IiwKLSAgICAgICAgICAgICAgICAgICAgdGhpcywKLSAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlOYW1lKSk7Ci0KLSAgICAgICAgX2NvbmZpZ3VyYXRpb24ucHV0KHByb3BlcnR5TmFtZSwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIGFuIGltbXV0YWJsZSBNYXAgb2YgdGhlIGNvbmZpZ3VyYXRpb247IGtleWVkIG9uIHByb3BlcnR5IG5hbWUsCi0gICAgICogIHdpdGggdmFsdWVzIGFzIHByb3BlcnRpZXMgdG8gYXNzaWduLgotICAgICAqIAotICAgICAqKi8KLQotICAgIHB1YmxpYyBNYXAgZ2V0Q29uZmlndXJhdGlvbigpCi0gICAgewotICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKF9jb25maWd1cmF0aW9uKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgSW52b2tlZCB0byBpbnN0YW50aWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgZXh0ZW5zaW9uIGFuZCByZXR1cm4gaXQuCi0gICAgICogIEl0IGFsc28gY29uZmlndXJlcyBwcm9wZXJ0aWVzIG9mIHRoZSBleHRlbnNpb24uCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIE9iamVjdCBpbnN0YW50aWF0ZUV4dGVuc2lvbihJUmVzb3VyY2VSZXNvbHZlciByZXNvbHZlcikKLSAgICB7Ci0gICAgICAgIGlmIChMT0cuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgICAgIExPRy5kZWJ1ZygiSW5zdGFudGlhdGluZyBleHRlbnNpb24gY2xhc3MgIiArIF9jbGFzc05hbWUgKyAiLiIpOwotICAgICAgICBDbGFzcyBleHRlbnNpb25DbGFzcyA9IG51bGw7Ci0gICAgICAgIE9iamVjdCByZXN1bHQgPSBudWxsOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBleHRlbnNpb25DbGFzcyA9IHJlc29sdmVyLmZpbmRDbGFzcyhfY2xhc3NOYW1lKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIFRhcGVzdHJ5LmZvcm1hdCgiRXh0ZW5zaW9uU3BlY2lmaWNhdGlvbi5iYWQtY2xhc3MiLCBfY2xhc3NOYW1lKSwKLSAgICAgICAgICAgICAgICBnZXRMb2NhdGlvbigpLAotICAgICAgICAgICAgICAgIGV4KTsKLSAgICAgICAgfQotCi0gICAgICAgIHJlc3VsdCA9IGluc3RhbnRpYXRlSW5zdGFuY2UoZXh0ZW5zaW9uQ2xhc3MsIHJlc3VsdCk7Ci0KLSAgICAgICAgaW5pdGlhbGl6ZVByb3BlcnRpZXMocmVzb2x2ZXIsIHJlc3VsdCk7Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVByb3BlcnRpZXMoSVJlc291cmNlUmVzb2x2ZXIgcmVzb2x2ZXIsIE9iamVjdCBleHRlbnNpb24pCi0gICAgewotICAgICAgICBpZiAoX2NvbmZpZ3VyYXRpb24uaXNFbXB0eSgpKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIEl0ZXJhdG9yIGkgPSBfY29uZmlndXJhdGlvbi5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaS5uZXh0KCk7Ci0KLSAgICAgICAgICAgIFN0cmluZyBwcm9wZXJ0eU5hbWUgPSAoU3RyaW5nKSBlbnRyeS5nZXRLZXkoKTsKLQotICAgICAgICAgICAgT2dubFV0aWxzLnNldChwcm9wZXJ0eU5hbWUsIHJlc29sdmVyLCBleHRlbnNpb24sIGVudHJ5LmdldFZhbHVlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBPYmplY3QgaW5zdGFudGlhdGVJbnN0YW5jZShDbGFzcyBleHRlbnNpb25DbGFzcywgT2JqZWN0IHJlc3VsdCkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQgPSBleHRlbnNpb25DbGFzcy5uZXdJbnN0YW5jZSgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24oZXguZ2V0TWVzc2FnZSgpLCBnZXRMb2NhdGlvbigpLCBleCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICAgIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoIkV4dGVuc2lvblNwZWNpZmljYXRpb25AIik7Ci0gICAgICAgIGJ1ZmZlci5hcHBlbmQoSW50ZWdlci50b0hleFN0cmluZyhoYXNoQ29kZSgpKSk7Ci0gICAgICAgIGJ1ZmZlci5hcHBlbmQoJ1snKTsKLSAgICAgICAgYnVmZmVyLmFwcGVuZChfY2xhc3NOYW1lKTsKLQotICAgICAgICBpZiAoX2NvbmZpZ3VyYXRpb24gIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgnICcpOwotICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChfY29uZmlndXJhdGlvbik7Ci0gICAgICAgIH0KLQotICAgICAgICBidWZmZXIuYXBwZW5kKCddJyk7Ci0KLSAgICAgICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIHRydWUgaWYgdGhlIGV4dGVuc2lvbnMgc2hvdWxkIGJlIGluc3RhbnRpYXRlZAotICAgICAqICBpbW1lZGlhdGVseSBhZnRlciB0aGUgY29udGFpbmluZyAKLSAgICAgKiAge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkuc3BlYy5MaWJyYXJ5U3BlY2lmaWNhdGlvbn0KLSAgICAgKiAgaWYgcGFyc2VkLiAgTm9uLWltbWVkaWF0ZSBleHRlbnNpb25zIGFyZSBpbnN0YW50aWF0ZWQKLSAgICAgKiAgb25seSBhcyBuZWVkZWQuCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIGJvb2xlYW4gaXNJbW1lZGlhdGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9pbW1lZGlhdGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SW1tZWRpYXRlKGJvb2xlYW4gaW1tZWRpYXRlKQotICAgIHsKLSAgICAgICAgX2ltbWVkaWF0ZSA9IGltbWVkaWF0ZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9zcGVjL0lBcHBsaWNhdGlvblNwZWNpZmljYXRpb24uamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9zcGVjL0lBcHBsaWNhdGlvblNwZWNpZmljYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTZjNjc5ZS4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvc3BlYy9JQXBwbGljYXRpb25TcGVjaWZpY2F0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5zcGVjOwotCi0KLQotLyoqCi0gKiAgRGVmaW5lcyBhbmQgaW50ZXJmYWNlIGZvciB0aGUgY29uZmlndXJhdGlvbiBmb3IgYSBUYXBlc3RyeSBhcHBsaWNhdGlvbi4gIEFuIEFwcGxpY2F0aW9uU3BlY2lmaWNhdGlvbgotICogIGV4dGVuZHMge0BsaW5rIElMaWJyYXJ5U3BlY2lmaWNhdGlvbn0gYnkgYWRkaW5nIG5ldyBwcm9wZXJ0aWVzIAotICogIG5hbWUgYW5kIGVuZ2luZUNsYXNzTmFtZS4KLSAqCi0gKiAgQGF1dGhvciBHZW9mZnJleSBMb25nbWFuCi0gKiAgQHZlcnNpb24gJElkJAotICoKLSAqKi8KLQotcHVibGljIGludGVyZmFjZSBJQXBwbGljYXRpb25TcGVjaWZpY2F0aW9uIGV4dGVuZHMgSUxpYnJhcnlTcGVjaWZpY2F0aW9uCi17Ci0gICAgLyoqCi0gICAgICogIFJldHVybnMgYSAidXNlciBmcmllbmRseSIgbmFtZSBmb3IgdGhlIGFwcGxpY2F0aW9uICh3aGljaCBpcyBvcHRpb25hbCkuCi0gICAgICogCi0gICAgICoqLwotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOwotCi0gICAgcHVibGljIHZvaWQgc2V0RW5naW5lQ2xhc3NOYW1lKFN0cmluZyB2YWx1ZSk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGNsYXNzICh3aGljaCBpbXBsZW1lbnRzIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LklFbmdpbmV9KS4KLSAgICAgKiAgTWF5IHJldHVybiBudWxsLCBpbiB3aGljaCBjYXNlIGEgZGVmYXVsdCBpcyB1c2VkLgotICAgICAqIAotICAgICAqKi8KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldEVuZ2luZUNsYXNzTmFtZSgpOwotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9zcGVjL0lBc3NldFNwZWNpZmljYXRpb24uamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9zcGVjL0lBc3NldFNwZWNpZmljYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVkNDRiOC4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvc3BlYy9JQXNzZXRTcGVjaWZpY2F0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5zcGVjOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JTG9jYXRhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUxvY2F0aW9uSG9sZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkudXRpbC5JUHJvcGVydHlIb2xkZXI7Ci0KLS8qKgotICogIERlZmluZXMgYW4gaW50ZXJuYWwsIGV4dGVybmFsIG9yIHByaXZhdGUgYXNzZXQuCi0gKiAKLSAqIEBhdXRob3IgZ2xvbmdtYW5AaW50ZWxsaWdlbnR3b3Jrcy5jb20KLSAqIEB2ZXJzaW9uICRJZCQKLSAqLwotcHVibGljIGludGVyZmFjZSBJQXNzZXRTcGVjaWZpY2F0aW9uIGV4dGVuZHMgSVByb3BlcnR5SG9sZGVyLCBJTG9jYXRpb25Ib2xkZXIsIElMb2NhdGFibGUKLXsKLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0aGUgYmFzZSBwYXRoIGZvciB0aGUgYXNzZXQuICBUaGlzIG1heSBiZSBpbnRlcnByZXRlZCBhcyBhIFVSTCwgcmVsYXRpdmUgVVJMCi0gICAgICogIG9yIHRoZSBwYXRoIHRvIGEgcmVzb3VyY2UsIGRlcGVuZGluZyBvbiB0aGUgdHlwZSBvZiBhc3NldC4KLSAgICAgKgotICAgICAqKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFBhdGgoKTsKLSAgICBwdWJsaWMgYWJzdHJhY3QgQXNzZXRUeXBlIGdldFR5cGUoKTsKLSAgICAvKiogQHNpbmNlIDMuMCAqKi8KLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRQYXRoKFN0cmluZyBwYXRoKTsKLSAgICAvKiogQHNpbmNlIDMuMCAqKi8KLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRUeXBlKEFzc2V0VHlwZSB0eXBlKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvc3BlYy9JQmVhblNwZWNpZmljYXRpb24uamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9zcGVjL0lCZWFuU3BlY2lmaWNhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTI3YjZmLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9zcGVjL0lCZWFuU3BlY2lmaWNhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuc3BlYzsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JTG9jYXRhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUxvY2F0aW9uSG9sZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuYmVhbi5JQmVhbkluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkudXRpbC5JUHJvcGVydHlIb2xkZXI7Ci0KLS8qKgotICogIEEgc3BlY2lmaWNhdGlvbiBvZiBhIGhlbHBlciBiZWFuIGZvciBhIGNvbXBvbmVudC4KLSAqCi0gKiBAYXV0aG9yIGdsb25nbWFuQGludGVsbGlnZW50d29ya3MuY29tCi0gKiBAdmVyc2lvbiAkSWQkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUJlYW5TcGVjaWZpY2F0aW9uIGV4dGVuZHMgSVByb3BlcnR5SG9sZGVyLCBJTG9jYXRpb25Ib2xkZXIsIElMb2NhdGFibGUKLXsKLSAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldENsYXNzTmFtZSgpOwotICAgIHB1YmxpYyBhYnN0cmFjdCBCZWFuTGlmZWN5Y2xlIGdldExpZmVjeWNsZSgpOwotICAgIC8qKgotICAgICAqICBAc2luY2UgMS4wLjUKLSAgICAgKgotICAgICAqKi8KLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBhZGRJbml0aWFsaXplcihJQmVhbkluaXRpYWxpemVyIGluaXRpYWxpemVyKTsKLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0aGUge0BsaW5rIExpc3R9IG9mIHtAbGluayBJQmVhbkluaXRpYWxpemVyfXMuICBUaGUgY2FsbGVyCi0gICAgICogIHNob3VsZCBub3QgbW9kaWZ5IHRoaXMgdmFsdWUhLiAgTWF5IHJldHVybiBudWxsIGlmIHRoZXJlCi0gICAgICogIGFyZSBubyBpbml0aWFsaXplcnMuCi0gICAgICoKLSAgICAgKiAgQHNpbmNlIDEuMC41Ci0gICAgICoKLSAgICAgKiovCi0gICAgcHVibGljIGFic3RyYWN0IExpc3QgZ2V0SW5pdGlhbGl6ZXJzKCk7Ci0gICAgcHVibGljIGFic3RyYWN0IFN0cmluZyB0b1N0cmluZygpOwotICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzYyk7Ci0gICAgLyoqIEBzaW5jZSAzLjAgKiovCi0gICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0Q2xhc3NOYW1lKFN0cmluZyBjbGFzc05hbWUpOwotICAgIC8qKiBAc2luY2UgMy4wICoqLwotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldExpZmVjeWNsZShCZWFuTGlmZWN5Y2xlIGxpZmVjeWNsZSk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3NwZWMvSUJpbmRpbmdTcGVjaWZpY2F0aW9uLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvc3BlYy9JQmluZGluZ1NwZWNpZmljYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdlNDI3YS4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvc3BlYy9JQmluZGluZ1NwZWNpZmljYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LnNwZWM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklMb2NhdGFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JTG9jYXRpb25Ib2xkZXI7Ci0KLS8qKgotICogIFN0b3JlcyBhIGJpbmRpbmcgc3BlY2lmaWNhdGlvbiwgd2hpY2ggaWRlbnRpZmllcyB0aGUgc3RhdGljIHZhbHVlCi0gKiAgb3IgT0dOTCBleHByZXNzaW9uIGZvciB0aGUgYmluZGluZy4gIFRoZSBuYW1lIG9mIHRoZSBiaW5kaW5nICh3aGljaAotICogIG1hdGNoZXMgYSBiaW5kYWJsZSBwcm9wZXJ0eSBvZiB0aGUgY29udGluZWQgY29tcG9uZW50KSBpcyBpbXBsaWNpdGx5IGtub3duLgotICoKLSAqIEBhdXRob3IgZ2xvbmdtYW5AaW50ZWxsaWdlbnR3b3Jrcy5jb20KLSAqIEB2ZXJzaW9uICRJZCQKLSAqLwotcHVibGljIGludGVyZmFjZSBJQmluZGluZ1NwZWNpZmljYXRpb24gZXh0ZW5kcyBJTG9jYXRpb25Ib2xkZXIsIElMb2NhdGFibGUKLXsKLSAgICBwdWJsaWMgYWJzdHJhY3QgQmluZGluZ1R5cGUgZ2V0VHlwZSgpOwotICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0VmFsdWUoKTsKLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRUeXBlKEJpbmRpbmdUeXBlIHR5cGUpOwotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3NwZWMvSUNvbXBvbmVudFNwZWNpZmljYXRpb24uamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9zcGVjL0lDb21wb25lbnRTcGVjaWZpY2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4ZmRmMDcuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3NwZWMvSUNvbXBvbmVudFNwZWNpZmljYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NCArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5zcGVjOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklMb2NhdGFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JTG9jYXRpb25Ib2xkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVzb3VyY2VMb2NhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnV0aWwuSVByb3BlcnR5SG9sZGVyOwotCi0vKioKLSAqICBBIHNwZWNpZmljYXRpb24gZm9yIGEgY29tcG9uZW50LCBhcyByZWFkIGZyb20gYW4gWE1MIHNwZWNpZmljYXRpb24gZmlsZS4KLSAqCi0gKiAgPHA+QSBzcGVjaWZpY2F0aW9uIGNvbnNpc3RzIG9mCi0gKiAgPHVsPgotICogIDxsaT5BbiBpbXBsZW1lbnRpbmcgY2xhc3MKLSAqICA8bGk+QW4gb3B0aW9uYWwgdGVtcGxhdGUKLSAqICA8bGk+QW4gb3B0aW9uYWwgZGVzY3JpcHRpb24KLSAqICA8bGk+QSBzZXQgb2YgY29udGFpbmVkIGNvbXBvbmVudHMKLSAqICA8bGk+QmluZGluZ3MgZm9yIHRoZSBwcm9wZXJ0aWVzIG9mIGVhY2ggY29udGFpbmVkIGNvbXBvbmVudAotICogIDxsaT5BIHNldCBvZiBuYW1lZCBhc3NldHMKLSAqICA8bGk+RGVmaW5pdGlvbnMgZm9yIGhlbHBlciBiZWFucwotICogIDxsaT5BbnkgcmVzZXJ2ZWQgbmFtZXMgKHVzZWQgZm9yIEhUTUwgYXR0cmlidXRlcykKLSAqICA8L3VsPgotICoKLSAqICA8cD5Gcm9tIHRoaXMgaW5mb3JtYXRpb24sIGFuIGFjdHVhbCBjb21wb25lbnQgbWF5IGJlIGluc3RhbnRpYXRlZCBhbmQKLSAqICBpbml0aWFsaXplZC4gIEluc3RhbnRpYXRpbmcgYSBjb21wb25lbnQgaXMgdXN1YWxseSBhIHJlY3Vyc2l2ZSBwcm9jZXNzLCBzaW5jZQotICogIHRvIGluaXRpYWxpemUgYSBjb250YWluZXIgY29tcG9uZW50LCBpdCBpcyBuZWNlc3NhcnkgdG8gaW5zdGFudGlhdGUgYW5kIGluaXRpYWxpemUKLSAqICBpdHMgY29udGFpbmVkIGNvbXBvbmVudHMgYXMgd2VsbC4KLSAqCi0gKiAgQHNlZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LklDb21wb25lbnQKLSAqICBAc2VlIElDb250YWluZWRDb21wb25lbnQKLSAqICBAc2VlIElDb21wb25lbnRTcGVjaWZpY2F0aW9uCi0gKiAgQHNlZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LmVuZ2luZS5JUGFnZUxvYWRlcgotICogCi0gKiBAYXV0aG9yIGdsb25nbWFuQGludGVsbGlnZW50d29ya3MuY29tCi0gKiBAdmVyc2lvbiAkSWQkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbXBvbmVudFNwZWNpZmljYXRpb24gZXh0ZW5kcyBJUHJvcGVydHlIb2xkZXIsIElMb2NhdGlvbkhvbGRlciwgSUxvY2F0YWJsZQotewotICAgIC8qKgotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBuYW1lIGFscmVhZHkgZXhpc3RzLgotICAgICAqCi0gICAgICoqLwotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGFkZEFzc2V0KFN0cmluZyBuYW1lLCBJQXNzZXRTcGVjaWZpY2F0aW9uIGFzc2V0KTsKLSAgICAvKioKLSAgICAgKiAgQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGlkIGlzIGFscmVhZHkgZGVmaW5lZC4KLSAgICAgKgotICAgICAqKi8KLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBhZGRDb21wb25lbnQoU3RyaW5nIGlkLCBJQ29udGFpbmVkQ29tcG9uZW50IGNvbXBvbmVudCk7Ci0gICAgLyoqCi0gICAgICogIEFkZHMgdGhlIHBhcmFtZXRlci4gICBUaGUgbmFtZSBpcyBhZGRlZCBhcyBhIHJlc2VydmVkIG5hbWUuCi0gICAgICoKLSAgICAgKiAgQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIG5hbWUgYWxyZWFkeSBleGlzdHMuCi0gICAgICoqLwotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGFkZFBhcmFtZXRlcihTdHJpbmcgbmFtZSwgSVBhcmFtZXRlclNwZWNpZmljYXRpb24gc3BlYyk7Ci0gICAgLyoqCi0gICAgICogIFJldHVybnMgdHJ1ZSBpZiB0aGUgY29tcG9uZW50IGlzIGFsbG93ZWQgdG8gd3JhcCBvdGhlciBlbGVtZW50cyAoc3RhdGljIEhUTUwKLSAgICAgKiAgb3Igb3RoZXIgY29tcG9uZW50cykuICBUaGUgZGVmYXVsdCBpcyB0cnVlLgotICAgICAqCi0gICAgICogIEBzZWUgI3NldEFsbG93Qm9keShib29sZWFuKQotICAgICAqCi0gICAgICoqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGdldEFsbG93Qm9keSgpOwotICAgIC8qKgotICAgICAqICBSZXR1cm5zIHRydWUgaWYgdGhlIGNvbXBvbmVudCBhbGxvd3MgaW5mb3JtYWwgcGFyYW1ldGVycyAocGFyYW1ldGVycwotICAgICAqICBub3QgZm9ybWFsbHkgZGVmaW5lZCkuICBJbmZvcm1hbCBwYXJhbWV0ZXJzIGFyZSBnZW5lcmFsbHkgdXNlZCB0byBjcmVhdGUKLSAgICAgKiAgYWRkaXRpb25hbCBIVE1MIGF0dHJpYnV0ZXMgZm9yIGFuIEhUTUwgdGFnIHJlbmRlcmVkIGJ5IHRoZQotICAgICAqICBjb21wb25lbnQuICBUaGlzIGlzIG9mdGVuIHVzZWQgdG8gc3BlY2lmeSBKYXZhU2NyaXB0IGV2ZW50IGhhbmRsZXJzIG9yIHRoZSBjbGFzcwotICAgICAqICBvZiB0aGUgY29tcG9uZW50IChmb3IgQ2FzY2FyZGluZyBTdHlsZSBTaGVldHMpLgotICAgICAqCi0gICAgICogPHA+VGhlIGRlZmF1bHQgdmFsdWUgaXMgdHJ1ZS4KLSAgICAgKgotICAgICAqICBAc2VlICNzZXRBbGxvd0luZm9ybWFsUGFyYW1ldGVycyhib29sZWFuKQotICAgICAqKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBnZXRBbGxvd0luZm9ybWFsUGFyYW1ldGVycygpOwotICAgIC8qKgotICAgICAqICBSZXR1cm5zIHRoZSB7QGxpbmsgSUFzc2V0U3BlY2lmaWNhdGlvbn0gd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgb3IgbnVsbAotICAgICAqICBpZiBubyBzdWNoIHNwZWNpZmljYXRpb24gZXhpc3RzLgotICAgICAqCi0gICAgICogIEBzZWUgI2FkZEFzc2V0KFN0cmluZyxJQXNzZXRTcGVjaWZpY2F0aW9uKQotICAgICAqKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgSUFzc2V0U3BlY2lmaWNhdGlvbiBnZXRBc3NldChTdHJpbmcgbmFtZSk7Ci0gICAgLyoqCi0gICAgICogIFJldHVybnMgYSA8Y29kZT5MaXN0PC9jb2RlPgotICAgICAqICBvZiB0aGUgU3RyaW5nIG5hbWVzIG9mIGFsbCBhc3NldHMsIGluIGFscGhhYmV0aWNhbAotICAgICAqICBvcmRlcgotICAgICAqCi0gICAgICoqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBMaXN0IGdldEFzc2V0TmFtZXMoKTsKLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0aGUgc3BlY2lmaWNhdGlvbiBvZiBhIGNvbnRhaW5lZCBjb21wb25lbnQgd2l0aCB0aGUgZ2l2ZW4gaWQsIG9yCi0gICAgICogIG51bGwgaWYgbm8gc3VjaCBjb250YWluZWQgY29tcG9uZW50IGV4aXN0cy4KLSAgICAgKgotICAgICAqICBAc2VlICNhZGRDb21wb25lbnQoU3RyaW5nLCBJQ29udGFpbmVkQ29tcG9uZW50KQotICAgICAqCi0gICAgICoqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBJQ29udGFpbmVkQ29tcG9uZW50IGdldENvbXBvbmVudChTdHJpbmcgaWQpOwotICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0Q29tcG9uZW50Q2xhc3NOYW1lKCk7Ci0gICAgLyoqCi0gICAgICogIFJldHVybnMgYW4gPGNvZGU+TGlzdDwvY29kZT4KLSAgICAgKiAgb2YgdGhlIFN0cmluZyBuYW1lcyBvZiB0aGUge0BsaW5rIElDb250YWluZWRDb21wb25lbnR9cwotICAgICAqICBmb3IgdGhpcyBjb21wb25lbnQuCi0gICAgICoKLSAgICAgKiAgQHNlZSAjYWRkQ29tcG9uZW50KFN0cmluZywgSUNvbnRhaW5lZENvbXBvbmVudCkKLSAgICAgKgotICAgICAqKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgTGlzdCBnZXRDb21wb25lbnRJZHMoKTsKLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0aGUgc3BlY2lmaWNhdGlvbiBvZiBhIHBhcmFtZXRlciB3aXRoIHRoZSBnaXZlbiBuYW1lLCBvcgotICAgICAqICBudWxsIGlmIG5vIHN1Y2ggcGFyYW1ldGVyIGV4aXN0cy4KLSAgICAgKgotICAgICAqICBAc2VlICNhZGRQYXJhbWV0ZXIoU3RyaW5nLCBJUGFyYW1ldGVyU3BlY2lmaWNhdGlvbikKLSAgICAgKgotICAgICAqKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgSVBhcmFtZXRlclNwZWNpZmljYXRpb24gZ2V0UGFyYW1ldGVyKFN0cmluZyBuYW1lKTsKLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyBhIExpc3Qgb2YKLSAgICAgKiAgb2YgU3RyaW5nIG5hbWVzIG9mIGFsbCBwYXJhbWV0ZXJzLiAgVGhpcyBsaXN0Ci0gICAgICogIGlzIGluIGFscGhhYmV0aWNhbCBvcmRlci4KLSAgICAgKgotICAgICAqICBAc2VlICNhZGRQYXJhbWV0ZXIoU3RyaW5nLCBJUGFyYW1ldGVyU3BlY2lmaWNhdGlvbikKLSAgICAgKgotICAgICAqKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgTGlzdCBnZXRQYXJhbWV0ZXJOYW1lcygpOwotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEFsbG93Qm9keShib29sZWFuIHZhbHVlKTsKLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRBbGxvd0luZm9ybWFsUGFyYW1ldGVycyhib29sZWFuIHZhbHVlKTsKLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRDb21wb25lbnRDbGFzc05hbWUoU3RyaW5nIHZhbHVlKTsKLSAgICAvKioKLSAgICAgKiAgQHNpbmNlIDEuMC40Ci0gICAgICoKLSAgICAgKiAgQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGJlYW4gYWxyZWFkeSBoYXMgYSBzcGVjaWZpY2F0aW9uLgotICAgICAqKi8KLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBhZGRCZWFuU3BlY2lmaWNhdGlvbihTdHJpbmcgbmFtZSwgSUJlYW5TcGVjaWZpY2F0aW9uIHNwZWNpZmljYXRpb24pOwotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHtAbGluayBJQmVhblNwZWNpZmljYXRpb259IGZvciB0aGUgZ2l2ZW4gbmFtZSwgb3IgbnVsbAotICAgICAqIGlmIG5vdCBzdWNoIHNwZWNpZmljYXRpb24gZXhpc3RzLgotICAgICAqCi0gICAgICogQHNpbmNlIDEuMC40Ci0gICAgICoKLSAgICAgKiovCi0gICAgcHVibGljIGFic3RyYWN0IElCZWFuU3BlY2lmaWNhdGlvbiBnZXRCZWFuU3BlY2lmaWNhdGlvbihTdHJpbmcgbmFtZSk7Ci0gICAgLyoqCi0gICAgICogIFJldHVybnMgYW4gdW5tb2RpZmlhYmxlIGNvbGxlY3Rpb24gb2YgdGhlIG5hbWVzIG9mIGFsbCBiZWFucy4KLSAgICAgKgotICAgICAqKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgQ29sbGVjdGlvbiBnZXRCZWFuTmFtZXMoKTsKLSAgICAvKioKLSAgICAgKiAgQWRkcyB0aGUgdmFsdWUgYXMgYSByZXNlcnZlZCBuYW1lLiAgUmVzZXJ2ZWQgbmFtZXMgYXJlIG5vdCBhbGxvd2VkCi0gICAgICogIGFzIHRoZSBuYW1lcyBvZiBpbmZvcm1hbCBwYXJhbWV0ZXJzLiAgU2luY2UgdGhlIGNvbXBhcmlzb24gaXMKLSAgICAgKiAgY2FzZWxlc3MsIHRoZSB2YWx1ZSBpcyBjb252ZXJ0ZWQgdG8gbG93ZXJjYXNlIGJlZm9yZSBiZWluZwotICAgICAqICBzdG9yZWQuCi0gICAgICoKLSAgICAgKiAgQHNpbmNlIDEuMC41Ci0gICAgICoKLSAgICAgKiovCi0gICAgcHVibGljIGFic3RyYWN0IHZvaWQgYWRkUmVzZXJ2ZWRQYXJhbWV0ZXJOYW1lKFN0cmluZyB2YWx1ZSk7Ci0gICAgLyoqCi0gICAgICogIFJldHVybnMgdHJ1ZSBpZiB0aGUgdmFsdWUgc3BlY2lmaWVkIGlzIGluIHRoZSByZXNlcnZlZCBuYW1lIGxpc3QuCi0gICAgICogIFRoZSBjb21wYXJpc29uIGlzIGNhc2VsZXNzLiAgQWxsIGZvcm1hbCBwYXJhbWV0ZXJzIGFyZSBhdXRvbWF0aWNhbGx5Ci0gICAgICogIGluIHRoZSByZXNlcnZlZCBuYW1lIGxpc3QsIGFzIHdlbGwgYXMgYW55IGFkZGl0aW9uYWwKLSAgICAgKiAgcmVzZXJ2ZWQgbmFtZXMgc3BlY2lmaWVkIGluIHRoZSBjb21wb25lbnQgc3BlY2lmaWNhdGlvbi4gIFRoZSBsYXR0ZXIKLSAgICAgKiAgcmVmZXIgdG8gSFRNTCBhdHRyaWJ1dGVzIGdlbmVyYXRlZCBkaXJlY3RseSBieSB0aGUgY29tcG9uZW50LgotICAgICAqCi0gICAgICogIEBzaW5jZSAxLjAuNQotICAgICAqCi0gICAgICoqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzUmVzZXJ2ZWRQYXJhbWV0ZXJOYW1lKFN0cmluZyB2YWx1ZSk7Ci0gICAgLyoqCi0gICAgICogIFJldHVybnMgdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoaXMgY29tcG9uZW50LgotICAgICAqIAotICAgICAqICBAc2luY2UgMS4wLjkKLSAgICAgKiovCi0gICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXREZXNjcmlwdGlvbigpOwotICAgIC8qKgotICAgICAqICBTZXRzIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGlzIGNvbXBvbmVudC4KLSAgICAgKiAKLSAgICAgKiAgQHNpbmNlIDEuMC45Ci0gICAgICoqLwotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbik7Ci0gICAgLyoqCi0gICAgICogIFJldHVybnMgdGhlIFhNTCBQdWJsaWMgSWQgZm9yIHRoZSBzcGVjaWZpY2F0aW9uIGZpbGUsIG9yIG51bGwKLSAgICAgKiAgaWYgbm90IGFwcGxpY2FibGUuCi0gICAgICogCi0gICAgICogIDxwPgotICAgICAqICBUaGlzIG1ldGhvZCBleGlzdHMgYXMgYSBjb252aWVuaWVuY2UgZm9yIHRoZSBTcGluZGxlIHBsdWdpbi4KLSAgICAgKiAgQSBwcmV2aW91cyBtZXRob2QgdXNlZCBhbiBhcmJpdHJhcnkgdmVyc2lvbiBzdHJpbmcsIHRoZQotICAgICAqICBwdWJsaWMgaWQgaXMgbW9yZSB1c2VmdWwgYW5kIGxlc3MgYW1iaWd1b3VzLgotICAgICAqICAKLSAgICAgKiAgQHNpbmNlIDIuMgotICAgICAqIAotICAgICAqKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFB1YmxpY0lkKCk7Ci0gICAgLyoqIEBzaW5jZSAyLjIgKiovCi0gICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0UHVibGljSWQoU3RyaW5nIHB1YmxpY0lkKTsKLSAgICAvKiogCi0gICAgICogCi0gICAgICogIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWNhdGlvbiBpcyBrbm93biB0byBiZSBhIHBhZ2UKLSAgICAgKiAgc3BlY2lmaWNhdGlvbiBhbmQgbm90IGEgY29tcG9uZW50IHNwZWNpZmljYXRpb24uICBFYXJsaWVyIHZlcnNpb25zCi0gICAgICogIG9mIHRoZSBmcmFtZXdvcmsgZGlkIG5vdCBkaXN0aW5ndWlzaCBiZXR3ZWVuIHRoZSB0d28sIGJ1dCBzdGFydGluZwotICAgICAqICBpbiAyLjIsIHRoZXJlIGFyZSBzZXBlcmF0ZSBYTUwgZW50aXRpZXMgZm9yIHBhZ2VzIGFuZCBjb21wb25lbnRzLgotICAgICAqICBQYWdlcyBvbWl0IHNldmVyYWwgYXR0cmlidXRlcyBhbmQgZW50aXRpZXMgcmVsYXRlZAotICAgICAqICB0byBwYXJhbWV0ZXJzLCBhcyBwYXJhbWV0ZXJzIG9ubHkgbWFrZSBzZW5zZSBmb3IgY29tcG9uZW50cy4KLSAgICAgKiAgCi0gICAgICogIEBzaW5jZSAyLjIgCi0gICAgICogCi0gICAgICoqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzUGFnZVNwZWNpZmljYXRpb24oKTsKLSAgICAvKiogQHNpbmNlIDIuMiAqKi8KLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRQYWdlU3BlY2lmaWNhdGlvbihib29sZWFuIHBhZ2VTcGVjaWZpY2F0aW9uKTsKLSAgICAvKiogQHNpbmNlIDMuMCAqKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgSVJlc291cmNlTG9jYXRpb24gZ2V0U3BlY2lmaWNhdGlvbkxvY2F0aW9uKCk7Ci0gICAgLyoqIEBzaW5jZSAzLjAgKiovCi0gICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0U3BlY2lmaWNhdGlvbkxvY2F0aW9uKElSZXNvdXJjZUxvY2F0aW9uIHNwZWNpZmljYXRpb25Mb2NhdGlvbik7Ci0gICAgLyoqCi0gICAgICogIEFkZHMgYSBuZXcgcHJvcGVydHkgc3BlY2lmaWNhdGlvbi4gIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBtdXN0Ci0gICAgICogIG5vdCBhbHJlYWR5IGJlIGRlZmluZWQgKGFuZCBtdXN0IG5vdCBjaGFuZ2UgYWZ0ZXIgYmVpbmcgYWRkZWQpLgotICAgICAqIAotICAgICAqICBAc2luY2UgMy4wCi0gICAgICogCi0gICAgICoqLwotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGFkZFByb3BlcnR5U3BlY2lmaWNhdGlvbihJUHJvcGVydHlTcGVjaWZpY2F0aW9uIHNwZWMpOwotICAgIC8qKgotICAgICAqICBSZXR1cm5zIGEgc29ydGVkLCBpbW11dGFibGUgbGlzdCBvZiB0aGUgbmFtZXMgb2YgYWxsIAotICAgICAqICB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5zcGVjLklQcm9wZXJ0eVNwZWNpZmljYXRpb259cy4KLSAgICAgKiAKLSAgICAgKiAgQHNpbmNlIDMuMAotICAgICAqIAotICAgICAqKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgTGlzdCBnZXRQcm9wZXJ0eVNwZWNpZmljYXRpb25OYW1lcygpOwotICAgIC8qKgotICAgICAqICBSZXR1cm5zIHRoZSBuYW1lZCB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5zcGVjLklQcm9wZXJ0eVNwZWNpZmljYXRpb259LAotICAgICAqICBvciBudWxsICBpZiBubyBzdWNoIHNwZWNpZmljYXRpb24gZXhpc3QuCi0gICAgICogCi0gICAgICogIEBzaW5jZSAzLjAKLSAgICAgKiAgQHNlZSAjYWRkUHJvcGVydHlTcGVjaWZpY2F0aW9uKElQcm9wZXJ0eVNwZWNpZmljYXRpb24pCi0gICAgICogCi0gICAgICoqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBJUHJvcGVydHlTcGVjaWZpY2F0aW9uIGdldFByb3BlcnR5U3BlY2lmaWNhdGlvbihTdHJpbmcgbmFtZSk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3NwZWMvSUNvbnRhaW5lZENvbXBvbmVudC5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3NwZWMvSUNvbnRhaW5lZENvbXBvbmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTMwZjgxLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9zcGVjL0lDb250YWluZWRDb21wb25lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LnNwZWM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUxvY2F0YWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklMb2NhdGlvbkhvbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnV0aWwuSVByb3BlcnR5SG9sZGVyOwotCi0vKioKLSAqIERlZmluZXMgYSBjb250YWluZWQgY29tcG9uZW50LiAgVGhpcyBpbmNsdWRlcyB0aGUgaW5mb3JtYXRpb24gbmVlZGVkIHRvCi0gKiBnZXQgdGhlIGNvbnRhaW5lZCBjb21wb25lbnQncyBzcGVjaWZpY2F0aW9uLCBhcyB3ZWxsIGFzIGFueSBiaW5kaW5ncwotICogZm9yIHRoZSBjb21wb25lbnQuCi0KLSAqIEBhdXRob3IgZ2xvbmdtYW5AaW50ZWxsaWdlbnR3b3Jrcy5jb20KLSAqIEB2ZXJzaW9uICRJZCQKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ29udGFpbmVkQ29tcG9uZW50IGV4dGVuZHMgSVByb3BlcnR5SG9sZGVyLCBJTG9jYXRpb25Ib2xkZXIsIElMb2NhdGFibGUKLXsKLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0aGUgbmFtZWQgYmluZGluZywgb3IgbnVsbCBpZiB0aGUgYmluZGluZyBkb2VzIG5vdAotICAgICAqICBleGlzdC4KLSAgICAgKgotICAgICAqKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgSUJpbmRpbmdTcGVjaWZpY2F0aW9uIGdldEJpbmRpbmcoU3RyaW5nIG5hbWUpOwotICAgIC8qKgotICAgICAqICBSZXR1cm5zIGFuIHVtb2RpZmlhYmxlIDxjb2RlPkNvbGxlY3Rpb248L2NvZGU+Ci0gICAgICogIG9mIFN0cmluZ3MsIGVhY2ggdGhlIG5hbWUgb2Ygb25lIGJpbmRpbmcKLSAgICAgKiAgZm9yIHRoZSBjb21wb25lbnQuCi0gICAgICoKLSAgICAgKiovCi0gICAgcHVibGljIGFic3RyYWN0IENvbGxlY3Rpb24gZ2V0QmluZGluZ05hbWVzKCk7Ci0gICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRUeXBlKCk7Ci0gICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0QmluZGluZyhTdHJpbmcgbmFtZSwgSUJpbmRpbmdTcGVjaWZpY2F0aW9uIHNwZWMpOwotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFR5cGUoU3RyaW5nIHZhbHVlKTsKLSAgICAvKioKLSAgICAgKiAJU2V0cyB0aGUgU3RyaW5nIElkIG9mIHRoZSBjb21wb25lbnQgYmVpbmcgY29waWVkIGZyb20uCi0gICAgICogIEZvciB1c2UgYnkgSURFIHRvb2xzIGxpa2UgU3BpbmRsZS4KLSAgICAgKiAKLSAgICAgKiAgQHNpbmNlIDEuMC45Ci0gICAgICoqLwotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldENvcHlPZihTdHJpbmcgaWQpOwotICAgIC8qKgotICAgICAqIAlSZXR1cm5zIHRoZSBpZCBvZiB0aGUgY29tcG9uZW50IGJlaW5nIGNvcGllZCBmcm9tLgotICAgICAqICBGb3IgdXNlIGJ5IElERSB0b29scyBsaWtlIFNwaW5kbGUuCi0gICAgICogCi0gICAgICogIEBzaW5jZSAxLjAuOQotICAgICAqKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldENvcHlPZigpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBjb250YWluZWQgY29tcG9uZW50IHdpbGwgaW5oZXJpdCAKLSAgICAgKiB0aGUgaW5mb3JtYWwgcGFyYW1ldGVycyBvZiBpdHMgcGFyZW50LiAKLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMy4wCi0gICAgICoqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGdldEluaGVyaXRJbmZvcm1hbFBhcmFtZXRlcnMoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgd2hldGhlciB0aGUgY29udGFpbmVkIGNvbXBvbmVudCB3aWxsIGluaGVyaXQgCi0gICAgICogdGhlIGluZm9ybWFsIHBhcmFtZXRlcnMgb2YgaXRzIHBhcmVudC4gCi0gICAgICogCi0gICAgICogQHNpbmNlIDMuMAotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEluaGVyaXRJbmZvcm1hbFBhcmFtZXRlcnMoYm9vbGVhbiB2YWx1ZSk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3NwZWMvSUV4dGVuc2lvblNwZWNpZmljYXRpb24uamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9zcGVjL0lFeHRlbnNpb25TcGVjaWZpY2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzMjZmMzkuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3NwZWMvSUV4dGVuc2lvblNwZWNpZmljYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LnNwZWM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JTG9jYXRhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUxvY2F0aW9uSG9sZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlc291cmNlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS51dGlsLklQcm9wZXJ0eUhvbGRlcjsKLQotLyoqCi0gKiAgRGVmaW5lcyBhbiAiZXh0ZW5zaW9uIiwgd2hpY2ggaXMgbXVjaCBsaWtlIGEgaGVscGVyIGJlYW4sIGJ1dCAKLSAqICBpcyBwYXJ0IG9mIGEgbGlicmFyeSBvciBhcHBsaWNhdGlvbiBzcGVjaWZpY2F0aW9uIChhbmQgaGFzIHRoZSBzYW1lCi0gKiAgbGlmZWN5Y2xlIGFzIHRoZSBhcHBsaWNhdGlvbikuCi0gKiAKLSAqIEBhdXRob3IgZ2xvbmdtYW5AaW50ZWxsaWdlbnR3b3Jrcy5jb20KLSAqIEB2ZXJzaW9uICRJZCQKLSAqLwotcHVibGljIGludGVyZmFjZSBJRXh0ZW5zaW9uU3BlY2lmaWNhdGlvbiBleHRlbmRzIElQcm9wZXJ0eUhvbGRlciwgSUxvY2F0aW9uSG9sZGVyLCBJTG9jYXRhYmxlCi17Ci0gICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRDbGFzc05hbWUoKTsKLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRDbGFzc05hbWUoU3RyaW5nIGNsYXNzTmFtZSk7Ci0gICAgcHVibGljIGFic3RyYWN0IHZvaWQgYWRkQ29uZmlndXJhdGlvbihTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgdmFsdWUpOwotICAgIC8qKgotICAgICAqICBSZXR1cm5zIGFuIGltbXV0YWJsZSBNYXAgb2YgdGhlIGNvbmZpZ3VyYXRpb247IGtleWVkIG9uIHByb3BlcnR5IG5hbWUsCi0gICAgICogIHdpdGggdmFsdWVzIGFzIHByb3BlcnRpZXMgdG8gYXNzaWduLgotICAgICAqIAotICAgICAqKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgTWFwIGdldENvbmZpZ3VyYXRpb24oKTsKLSAgICAvKioKLSAgICAgKiAgSW52b2tlZCB0byBpbnN0YW50aWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgZXh0ZW5zaW9uIGFuZCByZXR1cm4gaXQuCi0gICAgICogIEl0IGFsc28gY29uZmlndXJlcyBwcm9wZXJ0aWVzIG9mIHRoZSBleHRlbnNpb24uCi0gICAgICogCi0gICAgICoqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBPYmplY3QgaW5zdGFudGlhdGVFeHRlbnNpb24oSVJlc291cmNlUmVzb2x2ZXIgcmVzb2x2ZXIpOwotICAgIC8qKgotICAgICAqICBSZXR1cm5zIHRydWUgaWYgdGhlIGV4dGVuc2lvbnMgc2hvdWxkIGJlIGluc3RhbnRpYXRlZAotICAgICAqICBpbW1lZGlhdGVseSBhZnRlciB0aGUgY29udGFpbmluZyAKLSAgICAgKiAge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkuc3BlYy5MaWJyYXJ5U3BlY2lmaWNhdGlvbn0KLSAgICAgKiAgaWYgcGFyc2VkLiAgTm9uLWltbWVkaWF0ZSBleHRlbnNpb25zIGFyZSBpbnN0YW50aWF0ZWQKLSAgICAgKiAgb25seSBhcyBuZWVkZWQuCi0gICAgICogCi0gICAgICoqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzSW1tZWRpYXRlKCk7Ci0gICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0SW1tZWRpYXRlKGJvb2xlYW4gaW1tZWRpYXRlKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvc3BlYy9JTGlicmFyeVNwZWNpZmljYXRpb24uamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9zcGVjL0lMaWJyYXJ5U3BlY2lmaWNhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTJhM2QxLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9zcGVjL0lMaWJyYXJ5U3BlY2lmaWNhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE1ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LnNwZWM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JTG9jYXRpb25Ib2xkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVzb3VyY2VMb2NhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZXNvdXJjZVJlc29sdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkudXRpbC5JUHJvcGVydHlIb2xkZXI7Ci0KLS8qKgotICogIEludGVyZmFjZSBmb3IgdGhlIFNwZWNpZmljYXRpb24gZm9yIGEgbGlicmFyeS4gIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LnNwZWMuQXBwbGljYXRpb25TcGVjaWZpY2F0aW9ufQotICogIGlzIGEgc3BlY2lhbGl6ZWQga2luZCBvZiBsaWJyYXJ5LgotICoKLSAqICBAYXV0aG9yIEdlb2ZmcmV5IExvbmdtYW4KLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQHNpbmNlIDIuMgotICoKLSAqKi8KLQotcHVibGljIGludGVyZmFjZSBJTGlicmFyeVNwZWNpZmljYXRpb24gZXh0ZW5kcyBJUHJvcGVydHlIb2xkZXIsIElMb2NhdGlvbkhvbGRlcgotewotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgdGhlIHNwZWNpZmljYXRpb24gcGF0aCAod2l0aGluIHRoZSBjbGFzc3BhdGgpIGZvcgotICAgICAqICBhbiBlbWJlZGRlZCBsaWJyYXJ5LCBvciBudWxsIGlmCi0gICAgICogIG5vIHN1Y2ggbGlicmFyeSBoYXMgYmVlbiBkZWZpbmVkLgotICAgICAqIAotICAgICAqKi8KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldExpYnJhcnlTcGVjaWZpY2F0aW9uUGF0aChTdHJpbmcgaWQpOwotCi0gICAgLyoqCi0gICAgICogIFNldHMgdGhlIHNwZWNpZmljYXRpb24gcGF0aCBmb3IgYW4gZW1iZWRkZWQgbGlicmFyeS4KLSAgICAgKiAKLSAgICAgKiAgQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgYSBsaWJyYXJ5IHdpdGggdGhlIGdpdmVuCi0gICAgICogIGlkIGFscmVhZHkgZXhpc3RzCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgc2V0TGlicmFyeVNwZWNpZmljYXRpb25QYXRoKFN0cmluZyBpZCwgU3RyaW5nIHBhdGgpOwotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgYSBzb3J0ZWQgbGlzdCBvZiBsaWJyYXJ5IGlkcyAob3IgdGhlIGVtcHR5IGxpc3QsIGJ1dCBub3QgbnVsbCkuCi0gICAgICogCi0gICAgICoqLwotICAgIAotICAgIHB1YmxpYyBMaXN0IGdldExpYnJhcnlJZHMoKTsKLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhZ2VTcGVjaWZpY2F0aW9uUGF0aChTdHJpbmcgbmFtZSk7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYWdlU3BlY2lmaWNhdGlvblBhdGgoU3RyaW5nIG5hbWUsIFN0cmluZyBwYXRoKTsKLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIGEgc29ydGVkIGxpc3Qgb2YgcGFnZSBuYW1lcyBleHBsaWNpdGx5IGRlZmluZWQgYnkgdGhpcyBsaWJyYXJ5LAotICAgICAqICBvciBhbiBlbXB0eSBsaXN0IChidXQgbm90IG51bGwpLgotICAgICAqIAotICAgICAqKi8KLSAgICAKLSAgICBwdWJsaWMgTGlzdCBnZXRQYWdlTmFtZXMoKTsKLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRDb21wb25lbnRTcGVjaWZpY2F0aW9uUGF0aChTdHJpbmcgdHlwZSwgU3RyaW5nIHBhdGgpOwotCi0gICAgcHVibGljIFN0cmluZyBnZXRDb21wb25lbnRTcGVjaWZpY2F0aW9uUGF0aChTdHJpbmcgdHlwZSk7Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0aGUgc2ltcGxlIHR5cGVzIG9mIGFsbCBjb21wb25lbnRzIGRlZmluZWQgaW4KLSAgICAgKiAgdGhpcyBsaWJyYXJ5LiAgUmV0dXJucyBhIGxpc3Qgb2Ygc3RyaW5ncyBpbiBzb3J0ZWQgb3JkZXIsCi0gICAgICogIG9yIGFuIGVtcHR5IGxpc3QgKGJ1dCBub3QgbnVsbCkuCi0gICAgICogCi0gICAgICogIEBzaW5jZSAzLjAKLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgTGlzdCBnZXRDb21wb25lbnRUeXBlcygpOwotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmljZUNsYXNzTmFtZShTdHJpbmcgbmFtZSk7Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyBhIHNvcnRlZCBsaXN0IG9mIHNlcnZpY2UgbmFtZXMgKG9yIGFuIGVtcHR5IGxpc3QsIGJ1dAotICAgICAqICBub3QgbnVsbCkuCi0gICAgICogCi0gICAgICoqLwotICAgIAotICAgIHB1YmxpYyBMaXN0IGdldFNlcnZpY2VOYW1lcygpOwotCi0gICAgcHVibGljIHZvaWQgc2V0U2VydmljZUNsYXNzTmFtZShTdHJpbmcgbmFtZSwgU3RyaW5nIGNsYXNzTmFtZSk7Ci0KLQotICAgIC8qKgotICAgICAqIAotICAgICAqICBSZXR1cm5zIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGlzIGxpYnJhcnkuLgotICAgICAqIAotICAgICAqIAotICAgICAqKi8KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLQotICAgIC8qKgotICAgICAqICAKLSAgICAgKiAgU2V0cyB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhpcyBsaWJyYXJ5LgotICAgICAqIAotICAgICAqIAotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbik7Ci0gICAgCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgYSBNYXAgb2YgZXh0ZW5zaW9uczsga2V5IGlzIGV4dGVuc2lvbiBuYW1lLCB2YWx1ZSBpcwotICAgICAqICB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5zcGVjLklFeHRlbnNpb25TcGVjaWZpY2F0aW9ufS4KLSAgICAgKiAgTWF5IHJldHVybiBudWxsLiAgVGhlIHJldHVybmVkIE1hcCBpcyBpbW11dGFibGUuCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIE1hcCBnZXRFeHRlbnNpb25TcGVjaWZpY2F0aW9ucygpOwotCi0gICAgLyoqCi0gICAgICogIEFkZHMgYW5vdGhlciBleHRlbnNpb24gc3BlY2lmaWNhdGlvbi4KLSAgICAgKiAgCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgYWRkRXh0ZW5zaW9uU3BlY2lmaWNhdGlvbihTdHJpbmcgbmFtZSwgSUV4dGVuc2lvblNwZWNpZmljYXRpb24gZXh0ZW5zaW9uKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyBhIHNvcnRlZCBMaXN0IG9mIHRoZSBuYW1lcyBvZiBhbGwgZXh0ZW5zaW9ucy4gIE1heSByZXR1cm4gdGhlIGVtcHR5IGxpc3QsCi0gICAgICogIGJ1dCB3b24ndCByZXR1cm4gbnVsbC4KLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgTGlzdCBnZXRFeHRlbnNpb25OYW1lcygpOwotICAgIAotICAgIC8qKgotICAgICAqICBSZXR1cm5zIHRoZSBuYW1lZCBJRXh0ZW5zaW9uU3BlY2lmaWNhdGlvbiwgb3IgbnVsbCBpZiBpdCBkb2Vzbid0IGV4aXN0LgotICAgICAqIAotICAgICAqKi8KLQotICAgIHB1YmxpYyBJRXh0ZW5zaW9uU3BlY2lmaWNhdGlvbiBnZXRFeHRlbnNpb25TcGVjaWZpY2F0aW9uKFN0cmluZyBuYW1lKTsKLSAgICAKLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIGFuIGluc3RhbnRpYXRlZCBleHRlbnNpb24uICBFeHRlbnNpb25zIGFyZSBjcmVhdGVkIGFzIG5lZWRlZCBhbmQKLSAgICAgKiAgY2FjaGVkIGZvciBsYXRlciB1c2UuCi0gICAgICogCi0gICAgICogIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIG5vIGV4dGVuc2lvbiBzcGVjaWZpY2F0aW9uIGV4aXN0cyBmb3IgdGhlCi0gICAgICogIGdpdmVuIG5hbWUuCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIE9iamVjdCBnZXRFeHRlbnNpb24oU3RyaW5nIG5hbWUpOwotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgYW4gaW5zdGFudGlhdGVkIGV4dGVuc2lvbiwgcGVyZm9ybWluZyBhIGNoZWNrIHRvIGVuc3VyZQotICAgICAqICB0aGF0IHRoZSBleHRlbnNpb24gaXMgYSBzdWJ0eXBlIG9mIHRoZSBnaXZlbiBjbGFzcyAob3IgZXh0ZW5kcyB0aGUgZ2l2ZW4KLSAgICAgKiAgaW50ZXJmYWNlKS4KLSAgICAgKiAKLSAgICAgKiAgQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgbm8gZXh0ZW5zaW9uIHNwZWNpZmljYXRpb24gZXhpc3RzIGZvcgotICAgICAqICB0aGUgZ2l2ZW4gbmFtZSwgb3IgaWYgdGhlIGV4dGVuc2lvbiBmYWlscyB0aGUgdHlwZSBjaGVjay4KLSAgICAgKiAKLSAgICAgKiAgQHNpbmNlIDMuMAotICAgICAqIAotICAgICAqKi8KLSAgICAKLSAgICBwdWJsaWMgT2JqZWN0IGdldEV4dGVuc2lvbihTdHJpbmcgbmFtZSwgQ2xhc3MgdHlwZUNvbnN0cmFpbnQpOwotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgdHJ1ZSBpZiB0aGUgbmFtZWQgZXh0ZW5zaW9uIGV4aXN0cyAob3IgY2FuIGJlIGluc3RhbnRpYXRlZCksCi0gICAgICogIHJldHVybnMgZmFsc2UgaWYgdGhlIG5hbWVkIGV4dGVuc2lvbiBoYXMgbm8gc3BlY2lmaWNhdGlvbi4KLSAgICAgKiAKLSAgICAgKiovCi0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gY2hlY2tFeHRlbnNpb24oU3RyaW5nIG5hbWUpOwotCi0gICAgLyoqCi0gICAgICogIEludm9rZWQgYWZ0ZXIgdGhlIGVudGlyZSBzcGVjaWZpY2F0aW9uIGhhcyBiZWVuIGNvbnN0cnVjdGVkCi0gICAgICogIHRvIGluc3RhbnRpYXRlIGFueSBleHRlbnNpb25zIG1hcmtlZCBpbW1lZGlhdGUuCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgaW5zdGFudGlhdGVJbW1lZGlhdGVFeHRlbnNpb25zKCk7Ci0KLSAgICBwdWJsaWMgSVJlc291cmNlUmVzb2x2ZXIgZ2V0UmVzb3VyY2VSZXNvbHZlcigpOwotCi0gICAgcHVibGljIHZvaWQgc2V0UmVzb3VyY2VSZXNvbHZlcihJUmVzb3VyY2VSZXNvbHZlciByZXNvbHZlcik7Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXRQdWJsaWNJZCgpOwotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldFB1YmxpY0lkKFN0cmluZyB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0aGUgbG9jYXRpb24gZnJvbSB3aGljaCB0aGUgc3BlY2lmaWNhdGlvbiB3YXMgcmVhZC4KLSAgICAgKiAKLSAgICAgKiAgQHNpbmNlIDMuMAotICAgICAqIAotICAgICAqKi8KLSAgICAKLSAgICBwdWJsaWMgSVJlc291cmNlTG9jYXRpb24gZ2V0U3BlY2lmaWNhdGlvbkxvY2F0aW9uKCk7Ci0gICAgCi0gICAgLyoqIEBzaW5jZSAzLjAgKiovCi0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0U3BlY2lmaWNhdGlvbkxvY2F0aW9uKElSZXNvdXJjZUxvY2F0aW9uIHNwZWNpZmljYXRpb25Mb2NhdGlvbik7ICAgIAotfQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3NwZWMvSUxpc3RlbmVyQmluZGluZ1NwZWNpZmljYXRpb24uamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9zcGVjL0lMaXN0ZW5lckJpbmRpbmdTcGVjaWZpY2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjZDcwZjQuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3NwZWMvSUxpc3RlbmVyQmluZGluZ1NwZWNpZmljYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LnNwZWM7Ci0KLS8qKgotICogIFNwZWNpYWwgaW50ZXJmYWNlIG9mIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LnNwZWMuSUJpbmRpbmdTcGVjaWZpY2F0aW9ufSB1c2VkCi0gKiAgdG8gZW5jYXBzdWxhdGUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB0aGUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAKLSAqICBzcGVjaWZpYyB0byBsaXN0ZW5lciBiaW5kaW5ncy4gIEluIGFuIElMaXN0ZW5lckJpbmRpbmdTcGVjaWZpY2F0aW9uLCB0aGUKLSAqICB2YWx1ZSBwcm9wZXJ0eSBpcyB0aGUgYWN0dWFsIHNjcmlwdCAoYW5kIGlzIGFsaWFzZWQgYXMgcHJvcGVydHkgc2NyaXB0KSwgCi0gKiAgYnV0IGFuIGFkZGl0aW9uYWwgcHJvcGVydHksCi0gKiAgbGFuZ3VhZ2UsICh3aGljaCBtYXkgYmUgbnVsbCkgaXMgbmVlZGVkLiAgVGhpcyBpcyB0aGUgbGFuZ3VhZ2UKLSAqICB0aGUgc2NyaXB0IGlzIHdyaXR0ZW4gaW4uICogCi0gKiAKLSAqIEBhdXRob3IgZ2xvbmdtYW5AaW50ZWxsaWdlbnR3b3Jrcy5jb20KLSAqIEB2ZXJzaW9uICRJZCQKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJTGlzdGVuZXJCaW5kaW5nU3BlY2lmaWNhdGlvbiBleHRlbmRzIElCaW5kaW5nU3BlY2lmaWNhdGlvbgotewotICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0TGFuZ3VhZ2UoKTsKLSAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFNjcmlwdCgpOwotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldExhbmd1YWdlKFN0cmluZyBsYW5ndWFnZSk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3NwZWMvSVBhcmFtZXRlclNwZWNpZmljYXRpb24uamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9zcGVjL0lQYXJhbWV0ZXJTcGVjaWZpY2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNzcyM2IuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3NwZWMvSVBhcmFtZXRlclNwZWNpZmljYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LnNwZWM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklMb2NhdGlvbkhvbGRlcjsKLQotLyoqCi0gKiAgRGVmaW5lcyBhIGZvcm1hbCBwYXJhbWV0ZXIgdG8gYSBjb21wb25lbnQuICBBbiA8Y29kZT5JUGFyYW1ldGVyU3BlY2lmaWNhdGlvbjwvY29kZT4KLSAqICBpcyBjb250YWluZWQgYnkgYSB7QGxpbmsgSUNvbXBvbmVudFNwZWNpZmljYXRpb259LgotICoKLSAqICA8cD5UQkQ6IElkZW50aWZ5IGFycmF5cyBpbiBzb21lIHdheS4KLSAqIAotICogQGF1dGhvciBnbG9uZ21hbkBpbnRlbGxpZ2VudHdvcmtzLmNvbQotICogQHZlcnNpb24gJElkJAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQYXJhbWV0ZXJTcGVjaWZpY2F0aW9uIGV4dGVuZHMgSUxvY2F0aW9uSG9sZGVyCi17Ci0gICAgLyoqCi0gICAgICogIFJldHVybnMgdGhlIGNsYXNzIG5hbWUgb2YgdGhlIGV4cGVjdGVkIHR5cGUgb2YgdGhlIHBhcmFtZXRlci4gIFRoZSBkZWZhdWx0IHZhbHVlCi0gICAgICogIGlzIDxjb2RlPmphdmEubGFuZy5PYmplY3Q8L2NvZGU+IHdoaWNoIG1hdGNoZXMgYW55dGhpbmcuCi0gICAgICoKLSAgICAgKiovCi0gICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRUeXBlKCk7Ci0gICAgLyoqCi0gICAgICogIFJldHVybnMgdHJ1ZSBpZiB0aGUgcGFyYW1ldGVyIGlzIHJlcXVpcmVkIGJ5IHRoZSBjb21wb25lbnQuCi0gICAgICogIFRoZSBkZWZhdWx0IGlzIGZhbHNlLCBtZWFuaW5nIHRoZSBwYXJhbWV0ZXIgaXMgb3B0aW9uYWwuCi0gICAgICoKLSAgICAgKiovCi0gICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNSZXF1aXJlZCgpOwotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFJlcXVpcmVkKGJvb2xlYW4gdmFsdWUpOwotICAgIC8qKgotICAgICAqICBTZXRzIHRoZSB0eXBlIG9mIHZhbHVlIGV4cGVjdGVkIGZvciB0aGUgcGFyYW1ldGVyLiAgVGhpcyBjYW4gYmUKLSAgICAgKiAgbGVmdCBibGFuayB0byBpbmRpY2F0ZSBhbnkgdHlwZS4KLSAgICAgKiAKLSAgICAgKiovCi0gICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0VHlwZShTdHJpbmcgdmFsdWUpOwotICAgIC8qKgotICAgICAqICBSZXR1cm5zIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGlzIHBhcmFtZXRlci4KLSAgICAgKiAKLSAgICAgKiAgQHNpbmNlIDEuMC45Ci0gICAgICogCi0gICAgICoqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLSAgICAvKioKLSAgICAgKiAgU2V0cyB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhpcyBwYXJhbWV0ZXIuCi0gICAgICogCi0gICAgICogIEBzaW5jZSAxLjAuOQotICAgICAqICAgIAkgCi0gICAgICoqLwotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbik7Ci0gICAgLyoqCi0gICAgICogIFNldHMgdGhlIHByb3BlcnR5IG5hbWUgKG9mIHRoZSBjb21wb25lbnQgY2xhc3MpCi0gICAgICogIHRvIGNvbm5lY3QgdGhlIHBhcmFtZXRlciB0by4KLSAgICAgKiAKLSAgICAgKiovCi0gICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0UHJvcGVydHlOYW1lKFN0cmluZyBwcm9wZXJ0eU5hbWUpOwotICAgIC8qKgotICAgICAqICBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBKYXZhQmVhbnMgcHJvcGVydHkgdG8gY29ubmVjdCB0aGUKLSAgICAgKiAgcGFyYW1ldGVyIHRvLgotICAgICAqIAotICAgICAqKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFByb3BlcnR5TmFtZSgpOwotICAgIC8qKgotICAgICAqICBSZXR1cm5zIHRoZSBwYXJhbWV0ZXIgdmFsdWUgZGlyZWN0aW9uLCBkZWZhdWx0aW5nIHRvIHtAbGluayBEaXJlY3Rpb24jQ1VTVE9NfQotICAgICAqICBpZiBub3Qgb3RoZXJ3aXNlIHNwZWNpZmllZC4KLSAgICAgKiAKLSAgICAgKiovCi0gICAgcHVibGljIGFic3RyYWN0IERpcmVjdGlvbiBnZXREaXJlY3Rpb24oKTsKLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXREaXJlY3Rpb24oRGlyZWN0aW9uIGRpcmVjdGlvbik7Ci0gICAgLyoqCi0gICAgICogIFJldHVybnMgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIEphdmFCZWFucyBwcm9wZXJ0eSBpZiBubyBiaW5kaW5nIGlzIHByb3ZpZGVkCi0gICAgICogIG9yIG51bGwgaWYgaXQgaGFzIG5vdCBiZWVuIHNwZWNpZmllZAotICAgICAqKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldERlZmF1bHRWYWx1ZSgpOwotICAgIC8qKgotICAgICAqICBTZXRzIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBKYXZhQmVhbnMgcHJvcGVydHkgaWYgbm8gYmluZGluZyBpcyBwcm92aWRlZAotICAgICAqIAotICAgICAqKi8KLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXREZWZhdWx0VmFsdWUoU3RyaW5nIGRlZmF1bHRWYWx1ZSk7Ci0gICAgCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3NwZWMvSVByb3BlcnR5U3BlY2lmaWNhdGlvbi5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3NwZWMvSVByb3BlcnR5U3BlY2lmaWNhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWM2ZWFhLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9zcGVjL0lQcm9wZXJ0eVNwZWNpZmljYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LnNwZWM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklMb2NhdGlvbkhvbGRlcjsKLQotLyoqCi0gKiAgRGVmaW5lcyBhIHRyYW5zaWVudCBvciBwZXJzaXN0YW50IHByb3BlcnR5IG9mIGEgY29tcG9uZW50IG9yIHBhZ2UuICAKLSAqICBBIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LmVuZ2luZS5JQ29tcG9uZW50Q2xhc3NFbmhhbmNlcn0gdXNlcyB0aGlzIGluZm9ybWF0aW9uCi0gKiAgdG8gY3JlYXRlIGEgc3ViY2xhc3Mgd2l0aCB0aGUgbmVjZXNzYXJ5IGluc3RhbmNlIHZhcmlhYmxlcyBhbmQgbWV0aG9kcy4gIAotICogIAotICogQGF1dGhvciBnbG9uZ21hbkBpbnRlbGxpZ2VudHdvcmtzLmNvbQotICogQHZlcnNpb24gJElkJAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQcm9wZXJ0eVNwZWNpZmljYXRpb24gZXh0ZW5kcyBJTG9jYXRpb25Ib2xkZXIKLXsKLSAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldEluaXRpYWxWYWx1ZSgpOwotICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0TmFtZSgpOwotICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzUGVyc2lzdGVudCgpOwotICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0VHlwZSgpOwotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEluaXRpYWxWYWx1ZShTdHJpbmcgaW5pdGlhbFZhbHVlKTsKLSAgICAvKioKLSAgICAgKiAgU2V0cyB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkuICBUaGlzIHNob3VsZCBub3QgYmUgY2hhbmdlZAotICAgICAqICBvbmNlIHRoaXMgSVByb3BlcnR5U3BlY2lmaWNhdGlvbiBpcyBhZGRlZCB0bwotICAgICAqICBhIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LnNwZWMuSUNvbXBvbmVudFNwZWNpZmljYXRpb259LgotICAgICAqIAotICAgICAqKi8KLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKTsKLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRQZXJzaXN0ZW50KGJvb2xlYW4gcGVyc2lzdGFudCk7Ci0gICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0VHlwZShTdHJpbmcgdHlwZSk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3NwZWMvTGlicmFyeVNwZWNpZmljYXRpb24uamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9zcGVjL0xpYnJhcnlTcGVjaWZpY2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlNjBhNGEuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3NwZWMvTGlicmFyeVNwZWNpZmljYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzNyArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5zcGVjOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5idWlsZGVyLlRvU3RyaW5nQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LkFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklMb2NhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZXNvdXJjZUxvY2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlc291cmNlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5UYXBlc3RyeTsKLQotLyoqCi0gKiAgU3BlY2lmaWNhdGlvbiBmb3IgYSBsaWJyYXJ5LiAge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkuc3BlYy5BcHBsaWNhdGlvblNwZWNpZmljYXRpb259Ci0gKiAgaXMgYSBzcGVjaWFsaXplZCBraW5kIG9mIGxpYnJhcnkuCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQHNpbmNlIDIuMgotICoKLSAqKi8KLQotcHVibGljIGNsYXNzIExpYnJhcnlTcGVjaWZpY2F0aW9uIGV4dGVuZHMgTG9jYXRhYmxlUHJvcGVydHlIb2xkZXIgaW1wbGVtZW50cyBJTGlicmFyeVNwZWNpZmljYXRpb24KLXsKLSAgICAvKioKLSAgICAgKiAgUmVzb3VyY2UgcmVzb2x2ZXIgKHVzZWQgdG8gaW5zdGFudGlhdGUgZXh0ZW5zaW9ucykuCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHJpdmF0ZSBJUmVzb3VyY2VSZXNvbHZlciBfcmVzb2x2ZXI7Ci0KLSAgICAvKioKLSAgICAgKiAgTWFwIG9mIHBhZ2UgbmFtZSB0byBwYWdlIHNwZWNpZmljYXRpb24gcGF0aC4KLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwcml2YXRlIE1hcCBfcGFnZXM7Ci0KLSAgICAvKioKLSAgICAgKiAgTWFwIG9mIGNvbXBvbmVudCBhbGlhcyB0byBjb21wb25lbnQgc3BlY2lmaWNhdGlvbiBwYXRoLgotICAgICAqIAotICAgICAqKi8KLSAgICBwcml2YXRlIE1hcCBfY29tcG9uZW50czsKLQotICAgIC8qKgotICAgICAqICBNYXAgb2Ygc2VydmljZSBuYW1lIHRvIHNlcnZpY2UgY2xhc3MgbmFtZS4KLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwcml2YXRlIE1hcCBfc2VydmljZXM7Ci0KLSAgICAvKioKLSAgICAgKiAgTWFwIG9mIGxpYnJhcnkgaWQgdG8gbGlicmFyeSBzcGVjaWZpY2F0aW9uIHBhdGguCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHJpdmF0ZSBNYXAgX2xpYnJhcmllczsKLQotICAgIHByaXZhdGUgU3RyaW5nIF9kZXNjcmlwdGlvbjsKLQotICAgIC8qKgotICAgICAqICBNYXAgb2YgZXh0ZW5zaW9uIG5hbWUgdG8ge0BsaW5rIElFeHRlbnNpb25TcGVjaWZpY2F0aW9ufS4KLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwcml2YXRlIE1hcCBfZXh0ZW5zaW9uczsKLQotICAgIC8qKgotICAgICAqICBNYXAgb2YgZXh0ZW5zaW9uIG5hbWUgdG8gT2JqZWN0IGZvciBpbnN0YW50aWF0ZWQgZXh0ZW5zaW9ucy4KLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwcml2YXRlIE1hcCBfaW5zdGFudGlhdGVkRXh0ZW5zaW9uczsKLQotICAgIC8qKgotICAgICAqICBUaGUgWE1MIFB1YmxpYyBJZCB1c2VkIHdoZW4gdGhlIGxpYnJhcnkgc3BlY2lmaWNhdGlvbiB3YXMgcmVhZAotICAgICAqICAoaWYgYXBwbGljYWJsZSkuCi0gICAgICogCi0gICAgICogIEBzaW5jZSAyLjIKLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwcml2YXRlIFN0cmluZyBfcHVibGljSWQ7Ci0KLSAgICAvKioKLSAgICAgKiAgVGhlIGxvY2F0aW9uIG9mIHRoZSBzcGVjaWZpY2F0aW9uLgotICAgICAqIAotICAgICAqKi8KLQotICAgIHByaXZhdGUgSVJlc291cmNlTG9jYXRpb24gX3NwZWNpZmljYXRpb25Mb2NhdGlvbjsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGlicmFyeVNwZWNpZmljYXRpb25QYXRoKFN0cmluZyBpZCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoU3RyaW5nKSBnZXQoX2xpYnJhcmllcywgaWQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBTZXRzIHRoZSBzcGVjaWZpY2F0aW9uIHBhdGggZm9yIGFuIGVtYmVkZGVkIGxpYnJhcnkuCi0gICAgICogCi0gICAgICogIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGEgbGlicmFyeSB3aXRoIHRoZSBnaXZlbgotICAgICAqICBpZCBhbHJlYWR5IGV4aXN0cwotICAgICAqIAotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIHNldExpYnJhcnlTcGVjaWZpY2F0aW9uUGF0aChTdHJpbmcgaWQsIFN0cmluZyBwYXRoKQotICAgIHsKLSAgICAgICAgaWYgKF9saWJyYXJpZXMgPT0gbnVsbCkKLSAgICAgICAgICAgIF9saWJyYXJpZXMgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgICAgIGlmIChfbGlicmFyaWVzLmNvbnRhaW5zS2V5KGlkKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgVGFwZXN0cnkuZm9ybWF0KCJMaWJyYXJ5U3BlY2lmaWNhdGlvbi5kdXBsaWNhdGUtY2hpbGQtbmFtZXNwYWNlLWlkIiwgaWQpKTsKLQotICAgICAgICBfbGlicmFyaWVzLnB1dChpZCwgcGF0aCk7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3QgZ2V0TGlicmFyeUlkcygpCi0gICAgewotICAgICAgICByZXR1cm4gc29ydGVkS2V5cyhfbGlicmFyaWVzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhZ2VTcGVjaWZpY2F0aW9uUGF0aChTdHJpbmcgbmFtZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoU3RyaW5nKSBnZXQoX3BhZ2VzLCBuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYWdlU3BlY2lmaWNhdGlvblBhdGgoU3RyaW5nIG5hbWUsIFN0cmluZyBwYXRoKQotICAgIHsKLSAgICAgICAgaWYgKF9wYWdlcyA9PSBudWxsKQotICAgICAgICAgICAgX3BhZ2VzID0gbmV3IEhhc2hNYXAoKTsKLQotICAgICAgICBpZiAoX3BhZ2VzLmNvbnRhaW5zS2V5KG5hbWUpKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICBUYXBlc3RyeS5mb3JtYXQoIkxpYnJhcnlTcGVjaWZpY2F0aW9uLmR1cGxpY2F0ZS1wYWdlLW5hbWUiLCBuYW1lKSk7Ci0KLSAgICAgICAgX3BhZ2VzLnB1dChuYW1lLCBwYXRoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdCBnZXRQYWdlTmFtZXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHNvcnRlZEtleXMoX3BhZ2VzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb21wb25lbnRTcGVjaWZpY2F0aW9uUGF0aChTdHJpbmcgYWxpYXMsIFN0cmluZyBwYXRoKQotICAgIHsKLSAgICAgICAgaWYgKF9jb21wb25lbnRzID09IG51bGwpCi0gICAgICAgICAgICBfY29tcG9uZW50cyA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICAgICAgaWYgKF9jb21wb25lbnRzLmNvbnRhaW5zS2V5KGFsaWFzKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgVGFwZXN0cnkuZm9ybWF0KCJMaWJyYXJ5U3BlY2lmaWNhdGlvbi5kdXBsaWNhdGUtY29tcG9uZW50LWFsaWFzIiwgYWxpYXMpKTsKLQotICAgICAgICBfY29tcG9uZW50cy5wdXQoYWxpYXMsIHBhdGgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29tcG9uZW50U3BlY2lmaWNhdGlvblBhdGgoU3RyaW5nIGFsaWFzKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChTdHJpbmcpIGdldChfY29tcG9uZW50cywgYWxpYXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBAc2luY2UgMy4wCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIExpc3QgZ2V0Q29tcG9uZW50VHlwZXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHNvcnRlZEtleXMoX2NvbXBvbmVudHMpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmljZUNsYXNzTmFtZShTdHJpbmcgbmFtZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoU3RyaW5nKSBnZXQoX3NlcnZpY2VzLCBuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdCBnZXRTZXJ2aWNlTmFtZXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHNvcnRlZEtleXMoX3NlcnZpY2VzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlQ2xhc3NOYW1lKFN0cmluZyBuYW1lLCBTdHJpbmcgY2xhc3NOYW1lKQotICAgIHsKLSAgICAgICAgaWYgKF9zZXJ2aWNlcyA9PSBudWxsKQotICAgICAgICAgICAgX3NlcnZpY2VzID0gbmV3IEhhc2hNYXAoKTsKLQotICAgICAgICBpZiAoX3NlcnZpY2VzLmNvbnRhaW5zS2V5KG5hbWUpKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICBUYXBlc3RyeS5mb3JtYXQoIkxpYnJhcnlTcGVjaWZpY2F0aW9uLmR1cGxpY2F0ZS1zZXJ2aWNlLW5hbWUiLCBuYW1lKSk7Ci0KLSAgICAgICAgX3NlcnZpY2VzLnB1dChuYW1lLCBjbGFzc05hbWUpOwotICAgIH0KLQotICAgIHByaXZhdGUgTGlzdCBzb3J0ZWRLZXlzKE1hcCBtYXApCi0gICAgewotICAgICAgICBpZiAobWFwID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQotICAgICAgICBMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QobWFwLmtleVNldCgpKTsKLQotICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KHJlc3VsdCk7Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE9iamVjdCBnZXQoTWFwIG1hcCwgT2JqZWN0IGtleSkKLSAgICB7Ci0gICAgICAgIGlmIChtYXAgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIHJldHVybiBtYXAuZ2V0KGtleSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogIFJldHVybnMgdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoaXMgbGlicmFyeS4uCi0gICAgICogCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpCi0gICAgewotICAgICAgICByZXR1cm4gX2Rlc2NyaXB0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICAKLSAgICAgKiAgU2V0cyB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhpcyBsaWJyYXJ5LgotICAgICAqIAotICAgICAqIAotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikKLSAgICB7Ci0gICAgICAgIF9kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIGEgTWFwIG9mIGV4dGVuc2lvbnM7IGtleSBpcyBleHRlbnNpb24gbmFtZSwgdmFsdWUgaXMKLSAgICAgKiAge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkuc3BlYy5JRXh0ZW5zaW9uU3BlY2lmaWNhdGlvbn0uCi0gICAgICogIE1heSByZXR1cm4gbnVsbC4gIFRoZSByZXR1cm5lZCBNYXAgaXMgaW1tdXRhYmxlLgotICAgICAqIAotICAgICAqKi8KLQotICAgIHB1YmxpYyBNYXAgZ2V0RXh0ZW5zaW9uU3BlY2lmaWNhdGlvbnMoKQotICAgIHsKLSAgICAgICAgaWYgKF9leHRlbnNpb25zID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKF9leHRlbnNpb25zKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgQWRkcyBhbm90aGVyIGV4dGVuc2lvbiBzcGVjaWZpY2F0aW9uLgotICAgICAqIAotICAgICAqICBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBhbiBleHRlbnNpb24gd2l0aCB0aGUgZ2l2ZW4gbmFtZSBhbHJlYWR5IGV4aXN0cy4KLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCBhZGRFeHRlbnNpb25TcGVjaWZpY2F0aW9uKFN0cmluZyBuYW1lLCBJRXh0ZW5zaW9uU3BlY2lmaWNhdGlvbiBleHRlbnNpb24pCi0gICAgewotICAgICAgICBpZiAoX2V4dGVuc2lvbnMgPT0gbnVsbCkKLSAgICAgICAgICAgIF9leHRlbnNpb25zID0gbmV3IEhhc2hNYXAoKTsKLQotICAgICAgICBpZiAoX2V4dGVuc2lvbnMuY29udGFpbnNLZXkobmFtZSkpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIFRhcGVzdHJ5LmZvcm1hdCgiTGlicmFyeVNwZWNpZmljYXRpb24uZHVwbGljYXRlLWV4dGVuc2lvbi1uYW1lIiwgdGhpcywgbmFtZSkpOwotCi0gICAgICAgIF9leHRlbnNpb25zLnB1dChuYW1lLCBleHRlbnNpb24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIGEgc29ydGVkIExpc3Qgb2YgdGhlIG5hbWVzIG9mIGFsbCBleHRlbnNpb25zLiAgTWF5IHJldHVybiB0aGUgZW1wdHkgbGlzdCwKLSAgICAgKiAgYnV0IHdvbid0IHJldHVybiBudWxsLgotICAgICAqIAotICAgICAqKi8KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgTGlzdCBnZXRFeHRlbnNpb25OYW1lcygpCi0gICAgewotICAgICAgICByZXR1cm4gc29ydGVkS2V5cyhfaW5zdGFudGlhdGVkRXh0ZW5zaW9ucyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgdGhlIG5hbWVkIElFeHRlbnNpb25TcGVjaWZpY2F0aW9uLCBvciBudWxsIGlmIGl0IGRvZXNuJ3QgZXhpc3QuCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIElFeHRlbnNpb25TcGVjaWZpY2F0aW9uIGdldEV4dGVuc2lvblNwZWNpZmljYXRpb24oU3RyaW5nIG5hbWUpCi0gICAgewotICAgICAgICBpZiAoX2V4dGVuc2lvbnMgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIHJldHVybiAoSUV4dGVuc2lvblNwZWNpZmljYXRpb24pIF9leHRlbnNpb25zLmdldChuYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0cnVlIGlmIHRoaXMgbGlicmFyeSBzcGVjaWZpY2F0aW9uIGhhcyBhIHNwZWNpZmljYXRpb24KLSAgICAgKiAgZm9yIHRoZSBuYW1lZCBleHRlbnNpb24uCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIGJvb2xlYW4gY2hlY2tFeHRlbnNpb24oU3RyaW5nIG5hbWUpCi0gICAgewotICAgICAgICBpZiAoX2V4dGVuc2lvbnMgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICByZXR1cm4gX2V4dGVuc2lvbnMuY29udGFpbnNLZXkobmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgYW4gaW5zdGFudGlhdGVkIGV4dGVuc2lvbi4gIEV4dGVuc2lvbnMgYXJlIGNyZWF0ZWQgYXMgbmVlZGVkIGFuZAotICAgICAqICBjYWNoZWQgZm9yIGxhdGVyIHVzZS4KLSAgICAgKiAKLSAgICAgKiAgQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgbm8gZXh0ZW5zaW9uIHNwZWNpZmljYXRpb24gZXhpc3RzIGZvciB0aGUKLSAgICAgKiAgZ2l2ZW4gbmFtZS4KLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIE9iamVjdCBnZXRFeHRlbnNpb24oU3RyaW5nIG5hbWUpCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0RXh0ZW5zaW9uKG5hbWUsIG51bGwpOwotICAgIH0KLQotICAgIC8qKiBAc2luY2UgMy4wICoqLwotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBPYmplY3QgZ2V0RXh0ZW5zaW9uKFN0cmluZyBuYW1lLCBDbGFzcyB0eXBlQ29uc3RyYWludCkKLSAgICB7Ci0gICAgICAgIGlmIChfaW5zdGFudGlhdGVkRXh0ZW5zaW9ucyA9PSBudWxsKQotICAgICAgICAgICAgX2luc3RhbnRpYXRlZEV4dGVuc2lvbnMgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgICAgIE9iamVjdCByZXN1bHQgPSBfaW5zdGFudGlhdGVkRXh0ZW5zaW9ucy5nZXQobmFtZSk7Ci0gICAgICAgIElFeHRlbnNpb25TcGVjaWZpY2F0aW9uIHNwZWMgPSBnZXRFeHRlbnNpb25TcGVjaWZpY2F0aW9uKG5hbWUpOwotCi0gICAgICAgIGlmIChzcGVjID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIFRhcGVzdHJ5LmZvcm1hdCgiTGlicmFyeVNwZWNpZmljYXRpb24ubm8tc3VjaC1leHRlbnNpb24iLCBuYW1lKSk7Ci0KLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICB7Ci0KLSAgICAgICAgICAgIHJlc3VsdCA9IHNwZWMuaW5zdGFudGlhdGVFeHRlbnNpb24oX3Jlc29sdmVyKTsKLQotICAgICAgICAgICAgX2luc3RhbnRpYXRlZEV4dGVuc2lvbnMucHV0KG5hbWUsIHJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodHlwZUNvbnN0cmFpbnQgIT0gbnVsbCkKLSAgICAgICAgICAgIGFwcGx5VHlwZUNvbnN0cmFpbnQobmFtZSwgcmVzdWx0LCB0eXBlQ29uc3RyYWludCwgc3BlYy5nZXRMb2NhdGlvbigpKTsKLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBDaGVja3MgdGhhdCBhbiBleHRlbnNpb24gY29uZm9ybXMgdG8gdGhlIHN1cHBsaWVkIHR5cGUgY29uc3RyYWludC4KLSAgICAgKiAKLSAgICAgKiAgQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGV4dGVuc2lvbiBmYWlscyB0aGUgY2hlY2suCi0gICAgICogCi0gICAgICogIEBzaW5jZSAzLjAKLSAgICAgKiAgCi0gICAgICoqLwotCi0gICAgcHJvdGVjdGVkIHZvaWQgYXBwbHlUeXBlQ29uc3RyYWludCgKLSAgICAgICAgU3RyaW5nIG5hbWUsCi0gICAgICAgIE9iamVjdCBleHRlbnNpb24sCi0gICAgICAgIENsYXNzIHR5cGVDb25zdHJhaW50LAotICAgICAgICBJTG9jYXRpb24gbG9jYXRpb24pCi0gICAgewotICAgICAgICBDbGFzcyBleHRlbnNpb25DbGFzcyA9IGV4dGVuc2lvbi5nZXRDbGFzcygpOwotCi0gICAgICAgIC8vIENhbiB5b3UgYXNzaWduIGFuIGluc3RhbmNlIG9mIHRoZSBleHRlbnNpb24gdG8gYSB2YXJpYWJsZQotICAgICAgICAvLyBvZiB0eXBlIHR5cGVDb250cmFpbnQgbGVnYWxseT8KLQotICAgICAgICBpZiAodHlwZUNvbnN0cmFpbnQuaXNBc3NpZ25hYmxlRnJvbShleHRlbnNpb25DbGFzcykpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgU3RyaW5nIGtleSA9Ci0gICAgICAgICAgICB0eXBlQ29uc3RyYWludC5pc0ludGVyZmFjZSgpCi0gICAgICAgICAgICAgICAgPyAiTGlicmFyeVNwZWNpZmljYXRpb24uZXh0ZW5zaW9uLWRvZXMtbm90LWltcGxlbWVudC1pbnRlcmZhY2UiCi0gICAgICAgICAgICAgICAgOiAiTGlicmFyeVNwZWNpZmljYXRpb24uZXh0ZW5zaW9uLW5vdC1hLXN1YmNsYXNzIjsKLQotICAgICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICAgVGFwZXN0cnkuZm9ybWF0KGtleSwgbmFtZSwgZXh0ZW5zaW9uQ2xhc3MuZ2V0TmFtZSgpLCB0eXBlQ29uc3RyYWludC5nZXROYW1lKCkpLAotICAgICAgICAgICAgbG9jYXRpb24sCi0gICAgICAgICAgICBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgSW52b2tlZCBhZnRlciB0aGUgZW50aXJlIHNwZWNpZmljYXRpb24gaGFzIGJlZW4gY29uc3RydWN0ZWQKLSAgICAgKiAgdG8gaW5zdGFudGlhdGUgYW55IGV4dGVuc2lvbnMgbWFya2VkIGltbWVkaWF0ZS4KLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgaW5zdGFudGlhdGVJbW1lZGlhdGVFeHRlbnNpb25zKCkKLSAgICB7Ci0gICAgICAgIGlmIChfZXh0ZW5zaW9ucyA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIEl0ZXJhdG9yIGkgPSBfZXh0ZW5zaW9ucy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0KLSAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpLm5leHQoKTsKLQotICAgICAgICAgICAgSUV4dGVuc2lvblNwZWNpZmljYXRpb24gc3BlYyA9IChJRXh0ZW5zaW9uU3BlY2lmaWNhdGlvbikgZW50cnkuZ2V0VmFsdWUoKTsKLQotICAgICAgICAgICAgaWYgKCFzcGVjLmlzSW1tZWRpYXRlKCkpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZykgZW50cnkuZ2V0S2V5KCk7Ci0KLSAgICAgICAgICAgIGdldEV4dGVuc2lvbihuYW1lKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHVibGljIElSZXNvdXJjZVJlc29sdmVyIGdldFJlc291cmNlUmVzb2x2ZXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9yZXNvbHZlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZVJlc29sdmVyKElSZXNvdXJjZVJlc29sdmVyIHJlc29sdmVyKQotICAgIHsKLSAgICAgICAgX3Jlc29sdmVyID0gcmVzb2x2ZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgdGhlIGV4dGVuc2lvbnMgbWFwLgotICAgICAqICBAcmV0dXJuIE1hcCBvZiBvYmplY3RzLgotICAgICAqIAotICAgICAqKi8KLQotICAgIHByb3RlY3RlZCBNYXAgZ2V0RXh0ZW5zaW9ucygpCi0gICAgewotICAgICAgICByZXR1cm4gX2V4dGVuc2lvbnM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFVwZGF0ZXMgdGhlIGV4dGVuc2lvbiBtYXAuCi0gICAgICogIEBwYXJhbSBleHRlbnNpb24gQSBNYXAgb2YgZXh0ZW5zaW9uIHNwZWNpZmljYXRpb24gcGF0aHMKLSAgICAgKiAga2V5ZWQgb24gZXh0ZW5zaW9uIGlkLgotICAgICAqIAotICAgICAqIDxwPlRoZSBtYXAgaXMgcmV0YWluZWQsIG5vdCBjb3BpZWQuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRFeHRlbnNpb25zKE1hcCBleHRlbnNpb24pCi0gICAgewotICAgICAgICBfZXh0ZW5zaW9ucyA9IGV4dGVuc2lvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0aGUgbGlicmFyaWVzIG1hcC4KLSAgICAgKiAgQHJldHVybiBNYXAgb2Yge0BsaW5rIExpYnJhcnlTcGVjaWZpY2F0aW9ufS4KLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwcm90ZWN0ZWQgTWFwIGdldExpYnJhcmllcygpCi0gICAgewotICAgICAgICByZXR1cm4gX2xpYnJhcmllczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgVXBkYXRlcyB0aGUgbGlicmFyeSBtYXAuCi0gICAgICogIEBwYXJhbSBsaWJyYXJpZXMgQSBNYXAgb2YgbGlicmFyeSBzcGVjaWZpY2F0aW9uIHBhdGhzIAotICAgICAqICBrZXllZCBvbiBsaWJyYXJ5IGlkLgotICAgICAqIAotICAgICAqICA8cD5UaGUgbWFwIGlzIHJldGFpbmVkLCBub3QgY29waWVkLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0TGlicmFyaWVzKE1hcCBsaWJyYXJpZXMpCi0gICAgewotICAgICAgICBfbGlicmFyaWVzID0gbGlicmFyaWVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIHRoZSBwYWdlcyBtYXAuCi0gICAgICogIEByZXR1cm4gTWFwIG9mIHtAbGluayBJQ29tcG9uZW50U3BlY2lmaWNhdGlvbn0uCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHJvdGVjdGVkIE1hcCBnZXRQYWdlcygpCi0gICAgewotICAgICAgICByZXR1cm4gX3BhZ2VzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBVcGRhdGVzIHRoZSBwYWdlIG1hcC4KLSAgICAgKiAgQHBhcmFtIHBhZ2VzIEEgTWFwIG9mIHBhZ2Ugc3BlY2lmaWNhdGlvbiBwYXRocyAKLSAgICAgKiAga2V5ZWQgb24gcGFnZSBpZC4KLSAgICAgKiAKLSAgICAgKiAgPHA+VGhlIG1hcCBpcyByZXRhaW5lZCwgbm90IGNvcGllZC4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFBhZ2VzKE1hcCBwYWdlcykKLSAgICB7Ci0gICAgICAgIF9wYWdlcyA9IHBhZ2VzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNlcnZpY2VzLgotICAgICAqIEByZXR1cm4gTWFwIG9mIHNlcnZpY2UgY2xhc3MgbmFtZXMuCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHJvdGVjdGVkIE1hcCBnZXRTZXJ2aWNlcygpCi0gICAgewotICAgICAgICByZXR1cm4gX3NlcnZpY2VzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBVcGRhdGVzIHRoZSBzZXJ2aWNlcyBtYXAuCi0gICAgICogIEBwYXJhbSBzZXJ2aWNlcyBBIE1hcCBvZiB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWVzIG9mIGNsYXNzZXMgCi0gICAgICogIHdoaWNoIGltcGxlbWVudAotICAgICAqICB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5lbmdpbmUuSUVuZ2luZVNlcnZpY2V9Ci0gICAgICogIGtleWVkIG9uIHNlcnZpY2UgaWQuCi0gICAgICogCi0gICAgICogIDxwPlRoZSBtYXAgaXMgcmV0YWluZWQsIG5vdCBjb3BpZWQuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRTZXJ2aWNlcyhNYXAgc2VydmljZXMpCi0gICAgewotICAgICAgICBfc2VydmljZXMgPSBzZXJ2aWNlczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0aGUgY29tcG9uZW50cyBtYXAuCi0gICAgICogIEByZXR1cm4gTWFwIG9mIHtAbGluayBJQ29udGFpbmVkQ29tcG9uZW50fS4KLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwcm90ZWN0ZWQgTWFwIGdldENvbXBvbmVudHMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9jb21wb25lbnRzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBVcGRhdGVzIHRoZSBjb21wb25lbnRzIG1hcC4KLSAgICAgKiAgQHBhcmFtIGNvbXBvbmVudHMgQSBNYXAgb2Yge0BsaW5rIElDb250YWluZWRDb21wb25lbnR9IGtleWVkIG9uIGNvbXBvbmVudCBpZC4KLSAgICAgKiAgVGhlIG1hcCBpcyByZXRhaW5lZCwgbm90IGNvcGllZC4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldENvbXBvbmVudHMoTWFwIGNvbXBvbmVudHMpCi0gICAgewotICAgICAgICBfY29tcG9uZW50cyA9IGNvbXBvbmVudHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgdGhlIFhNTCBQdWJsaWMgSWQgZm9yIHRoZSBsaWJyYXJ5IGZpbGUsIG9yIG51bGwKLSAgICAgKiAgaWYgbm90IGFwcGxpY2FibGUuCi0gICAgICogCi0gICAgICogIDxwPgotICAgICAqICBUaGlzIG1ldGhvZCBleGlzdHMgYXMgYSBjb252aWVuaWVuY2UgZm9yIHRoZSBTcGluZGxlIHBsdWdpbi4KLSAgICAgKiAgQSBwcmV2aW91cyBtZXRob2QgdXNlZCBhbiBhcmJpdHJhcnkgdmVyc2lvbiBzdHJpbmcsIHRoZQotICAgICAqICBwdWJsaWMgaWQgaXMgbW9yZSB1c2VmdWwgYW5kIGxlc3MgYW1iaWd1b3VzLgotICAgICAqICAKLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFB1YmxpY0lkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfcHVibGljSWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UHVibGljSWQoU3RyaW5nIHB1YmxpY0lkKQotICAgIHsKLSAgICAgICAgX3B1YmxpY0lkID0gcHVibGljSWQ7Ci0gICAgfQotCi0gICAgLyoqIEBzaW5jZSAzLjAgKiovCi0KLSAgICBwdWJsaWMgSVJlc291cmNlTG9jYXRpb24gZ2V0U3BlY2lmaWNhdGlvbkxvY2F0aW9uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfc3BlY2lmaWNhdGlvbkxvY2F0aW9uOwotICAgIH0KLQotICAgIC8qKiBAc2luY2UgMy4wICoqLwotCi0gICAgcHVibGljIHZvaWQgc2V0U3BlY2lmaWNhdGlvbkxvY2F0aW9uKElSZXNvdXJjZUxvY2F0aW9uIHNwZWNpZmljYXRpb25Mb2NhdGlvbikKLSAgICB7Ci0gICAgICAgIF9zcGVjaWZpY2F0aW9uTG9jYXRpb24gPSBzcGVjaWZpY2F0aW9uTG9jYXRpb247Ci0gICAgfQotCi0gICAgLyoqIEBzaW5jZSAzLjAgKiovCi0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIFN0cmluZyB0b1N0cmluZygpCi0gICAgewotICAgICAgICBUb1N0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBUb1N0cmluZ0J1aWxkZXIodGhpcyk7Ci0KLSAgICAgICAgYnVpbGRlci5hcHBlbmQoImNvbXBvbmVudHMiLCBfY29tcG9uZW50cyk7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJkZXNjcmlwdGlvbiIsIF9kZXNjcmlwdGlvbik7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJpbnN0YW50aWF0ZWRFeHRlbnNpb25zIiwgX2luc3RhbnRpYXRlZEV4dGVuc2lvbnMpOwotICAgICAgICBidWlsZGVyLmFwcGVuZCgibGlicmFyaWVzIiwgX2xpYnJhcmllcyk7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJwYWdlcyIsIF9wYWdlcyk7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJwdWJsaWNJZCIsIF9wdWJsaWNJZCk7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJyZXNvbHZlciIsIF9yZXNvbHZlcik7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJzZXJ2aWNlcyIsIF9zZXJ2aWNlcyk7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJzcGVjaWZpY2F0aW9uTG9jYXRpb24iLCBfc3BlY2lmaWNhdGlvbkxvY2F0aW9uKTsKLQotICAgICAgICBleHRlbmREZXNjcmlwdGlvbihidWlsZGVyKTsKLQotICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBEb2VzIG5vdGhpbmcsIHN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRvIGFkZCBhZGRpdGlvbmFsCi0gICAgICogIGRlc2NyaXB0aW9uLgotICAgICAqIAotICAgICAqICBAc2VlICN0b1N0cmluZygpCi0gICAgICogIEBzaW5jZSAzLjAKLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwcm90ZWN0ZWQgdm9pZCBleHRlbmREZXNjcmlwdGlvbihUb1N0cmluZ0J1aWxkZXIgYnVpbGRlcikKLSAgICB7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvc3BlYy9MaXN0ZW5lckJpbmRpbmdTcGVjaWZpY2F0aW9uLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvc3BlYy9MaXN0ZW5lckJpbmRpbmdTcGVjaWZpY2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1ZmQ0NjguLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3NwZWMvTGlzdGVuZXJCaW5kaW5nU3BlY2lmaWNhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuc3BlYzsKLQotLyoqCi0gKiAgU3BlY2lhbCBzdWJjbGFzcyBvZiB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5zcGVjLkJpbmRpbmdTcGVjaWZpY2F0aW9ufSB1c2VkCi0gKiAgdG8gZW5jYXBzdWxhdGUgdGhlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gCi0gKiAgc3BlY2lmaWMgdG8gbGlzdGVuZXIgYmluZGluZ3MuICBJbiBhIExpc3RlbmVyQmluZGluZ1NwZWNpZmljYXRpb24sIHRoZQotICogIHZhbHVlIHByb3BlcnR5IGlzIHRoZSBhY3R1YWwgc2NyaXB0IChhbmQgaXMgYWxpYXNlZCBhcyBwcm9wZXJ0eSBzY3JpcHQpLCAKLSAqICBidXQgYW4gYWRkaXRpb25hbCBwcm9wZXJ0eSwKLSAqICBsYW5ndWFnZSwgKHdoaWNoIG1heSBiZSBudWxsKSBpcyBuZWVkZWQuICBUaGlzIGlzIHRoZSBsYW5ndWFnZQotICogIHRoZSBzY3JpcHQgaXMgd3JpdHRlbiBpbi4KLSAqCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogIEB2ZXJzaW9uICRJZCQKLSAqICBAc2luY2UgMy4wCi0gKgotICoqLwotCi1wdWJsaWMgY2xhc3MgTGlzdGVuZXJCaW5kaW5nU3BlY2lmaWNhdGlvbiBleHRlbmRzIEJpbmRpbmdTcGVjaWZpY2F0aW9uIGltcGxlbWVudHMgSUxpc3RlbmVyQmluZGluZ1NwZWNpZmljYXRpb24KLXsKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIF9sYW5ndWFnZTsKLSAgICAKLSAgICBwdWJsaWMgTGlzdGVuZXJCaW5kaW5nU3BlY2lmaWNhdGlvbigpCi0gICAgewotICAgIAlzZXRUeXBlKEJpbmRpbmdUeXBlLkxJU1RFTkVSKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXRMYW5ndWFnZSgpCi0gICAgewotICAgICAgICByZXR1cm4gX2xhbmd1YWdlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldFNjcmlwdCgpCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0VmFsdWUoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0TGFuZ3VhZ2UoU3RyaW5nIGxhbmd1YWdlKQotICAgIHsKLSAgICAgICAgX2xhbmd1YWdlID0gbGFuZ3VhZ2U7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvc3BlYy9Mb2NhdGFibGVQcm9wZXJ0eUhvbGRlci5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3NwZWMvTG9jYXRhYmxlUHJvcGVydHlIb2xkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JmN2Y1Zi4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvc3BlYy9Mb2NhdGFibGVQcm9wZXJ0eUhvbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkuc3BlYzsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUxvY2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUxvY2F0aW9uSG9sZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkudXRpbC5CYXNlUHJvcGVydHlIb2xkZXI7Ci0KLS8qKgotICogIEJhc2UgY2xhc3MgZm9yIGltcGxlbWVudGluZyBib3RoCi0gKiAgaW50ZXJmYWNlcyB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS51dGlsLklQcm9wZXJ0eUhvbGRlcn0gYW5kCi0gKiAge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkuSUxvY2F0aW9uSG9sZGVyfS4gIFRoaXMgaXMKLSAqICB1c2VkIGJ5IGFsbCB0aGUgc3BlY2lmaWNhdGlvbiBjbGFzc2VzLgotICoKLSAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiAgQHZlcnNpb24gJElkJAotICogIEBzaW5jZSAzLjAKLSAqCi0gKiovCi0KLXB1YmxpYyBjbGFzcyBMb2NhdGFibGVQcm9wZXJ0eUhvbGRlciBleHRlbmRzIEJhc2VQcm9wZXJ0eUhvbGRlciBpbXBsZW1lbnRzIElMb2NhdGlvbkhvbGRlcgotewotCXByaXZhdGUgSUxvY2F0aW9uIF9sb2NhdGlvbjsKLQkKLSAgICBwdWJsaWMgSUxvY2F0aW9uIGdldExvY2F0aW9uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfbG9jYXRpb247Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TG9jYXRpb24oSUxvY2F0aW9uIGxvY2F0aW9uKQotICAgIHsKLSAgICAgICAgX2xvY2F0aW9uID0gbG9jYXRpb247Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvc3BlYy9QYXJhbWV0ZXJTcGVjaWZpY2F0aW9uLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvc3BlYy9QYXJhbWV0ZXJTcGVjaWZpY2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxMTUwNDMuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3NwZWMvUGFyYW1ldGVyU3BlY2lmaWNhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LnNwZWM7Ci0KLS8qKgotICogIERlZmluZXMgYSBmb3JtYWwgcGFyYW1ldGVyIHRvIGEgY29tcG9uZW50LiAgQSA8Y29kZT5JUGFyYW1ldGVyU3BlY2lmaWNhdGlvbjwvY29kZT4KLSAqICBpcyBjb250YWluZWQgYnkgYSB7QGxpbmsgSUNvbXBvbmVudFNwZWNpZmljYXRpb259LgotICoKLSAqICA8cD5UQkQ6IElkZW50aWZ5IGFycmF5cyBpbiBzb21lIHdheS4KLSAqCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogIEB2ZXJzaW9uICRJZCQKLSAqIAotICoqLwotCi1wdWJsaWMgY2xhc3MgUGFyYW1ldGVyU3BlY2lmaWNhdGlvbiBleHRlbmRzIEJhc2VMb2NhdGFibGUgaW1wbGVtZW50cyBJUGFyYW1ldGVyU3BlY2lmaWNhdGlvbgotewotICAgIHByaXZhdGUgYm9vbGVhbiByZXF1aXJlZCA9IGZhbHNlOwotICAgIHByaXZhdGUgU3RyaW5nIHR5cGU7Ci0KLSAgICAvKiogQHNpbmNlIDEuMC45ICoqLwotICAgIHByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uOwotICAgIAotICAgIC8qKiBAc2luY2UgMi4wLjMgKiovCi0gICAgcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHlOYW1lOwotICAgIAotICAgIC8qKiBAc2luY2UgMy4wICoqLwotICAgIHByaXZhdGUgU3RyaW5nIGRlZmF1bHRWYWx1ZSA9IG51bGw7Ci0KLQlwcml2YXRlIERpcmVjdGlvbiBkaXJlY3Rpb24gPSBEaXJlY3Rpb24uQ1VTVE9NOwotCQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIHRoZSBjbGFzcyBuYW1lIG9mIHRoZSBleHBlY3RlZCB0eXBlIG9mIHRoZSBwYXJhbWV0ZXIuICBUaGUgZGVmYXVsdCB2YWx1ZQotICAgICAqICBpcyA8Y29kZT5qYXZhLmxhbmcuT2JqZWN0PC9jb2RlPiB3aGljaCBtYXRjaGVzIGFueXRoaW5nLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIFN0cmluZyBnZXRUeXBlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0eXBlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIHRydWUgaWYgdGhlIHBhcmFtZXRlciBpcyByZXF1aXJlZCBieSB0aGUgY29tcG9uZW50LgotICAgICAqICBUaGUgZGVmYXVsdCBpcyBmYWxzZSwgbWVhbmluZyB0aGUgcGFyYW1ldGVyIGlzIG9wdGlvbmFsLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIGJvb2xlYW4gaXNSZXF1aXJlZCgpCi0gICAgewotICAgICAgICByZXR1cm4gcmVxdWlyZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UmVxdWlyZWQoYm9vbGVhbiB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIHJlcXVpcmVkID0gdmFsdWU7Ci0gICAgfQotCi0JLyoqCi0JICogIFNldHMgdGhlIHR5cGUgb2YgdmFsdWUgZXhwZWN0ZWQgZm9yIHRoZSBwYXJhbWV0ZXIuICBUaGlzIGNhbiBiZQotCSAqICBsZWZ0IGJsYW5rIHRvIGluZGljYXRlIGFueSB0eXBlLgotCSAqIAotCSAqKi8KLQkKLSAgICBwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIHR5cGUgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhpcyBwYXJhbWV0ZXIuCi0gICAgICogCi0gICAgICogIEBzaW5jZSAxLjAuOQotICAgICAqIAotICAgICAqKi8KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGRlc2NyaXB0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBTZXRzIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGlzIHBhcmFtZXRlci4KLSAgICAgKiAKLSAgICAgKiAgQHNpbmNlIDEuMC45Ci0gICAgICogICAgCSAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pCi0gICAgewotICAgICAgICB0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqICBTZXRzIHRoZSBwcm9wZXJ0eSBuYW1lIChvZiB0aGUgY29tcG9uZW50IGNsYXNzKQotICAgICAqICB0byBjb25uZWN0IHRoZSBwYXJhbWV0ZXIgdG8uCi0gICAgICogCi0gICAgICoqLwotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5TmFtZShTdHJpbmcgcHJvcGVydHlOYW1lKQotICAgIHsKLSAgICAgICAgdGhpcy5wcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWU7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqICBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBKYXZhQmVhbnMgcHJvcGVydHkgdG8gY29ubmVjdCB0aGUKLSAgICAgKiAgcGFyYW1ldGVyIHRvLgotICAgICAqIAotICAgICAqKi8KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5TmFtZSgpCi0gICAgewotICAgICAgIHJldHVybiBwcm9wZXJ0eU5hbWU7Ci0gICAgfQotCi0JLyoqCi0JICogIFJldHVybnMgdGhlIHBhcmFtZXRlciB2YWx1ZSBkaXJlY3Rpb24sIGRlZmF1bHRpbmcgdG8ge0BsaW5rIERpcmVjdGlvbiNDVVNUT019Ci0JICogIGlmIG5vdCBvdGhlcndpc2Ugc3BlY2lmaWVkLgotCSAqIAotCSAqKi8KLQkKLSAgICBwdWJsaWMgRGlyZWN0aW9uIGdldERpcmVjdGlvbigpCi0gICAgewotICAgICAgICByZXR1cm4gZGlyZWN0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERpcmVjdGlvbihEaXJlY3Rpb24gZGlyZWN0aW9uKQotICAgIHsKLSAgICAgICAgaWYgKGRpcmVjdGlvbiA9PSBudWxsKQotICAgICAgICAJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZGlyZWN0aW9uIG1heSBub3QgYmUgbnVsbC4iKTsKLSAgICAgICAgCQotICAgICAgICB0aGlzLmRpcmVjdGlvbiA9IGRpcmVjdGlvbjsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS50YXBlc3RyeS5zcGVjLklQYXJhbWV0ZXJTcGVjaWZpY2F0aW9uI2dldERlZmF1bHRWYWx1ZSgpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXREZWZhdWx0VmFsdWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUudGFwZXN0cnkuc3BlYy5JUGFyYW1ldGVyU3BlY2lmaWNhdGlvbiNzZXREZWZhdWx0VmFsdWUoamF2YS5sYW5nLlN0cmluZykKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0VmFsdWUoU3RyaW5nIGRlZmF1bHRWYWx1ZSkKLSAgICB7Ci0gICAgICAgIHRoaXMuZGVmYXVsdFZhbHVlID0gZGVmYXVsdFZhbHVlOwotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9zcGVjL1Byb3BlcnR5U3BlY2lmaWNhdGlvbi5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3NwZWMvUHJvcGVydHlTcGVjaWZpY2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2NmEzNjQuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3NwZWMvUHJvcGVydHlTcGVjaWZpY2F0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS5zcGVjOwotLyoqCi0gKiAgRGVmaW5lcyBhIHRyYW5zaWVudCBvciBwZXJzaXN0YW50IHByb3BlcnR5IG9mIGEgY29tcG9uZW50IG9yIHBhZ2UuICAKLSAqICBBIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LmVuZ2luZS5JQ29tcG9uZW50Q2xhc3NFbmhhbmNlcn0gdXNlcyB0aGlzIGluZm9ybWF0aW9uCi0gKiAgdG8gY3JlYXRlIGEgc3ViY2xhc3Mgd2l0aCB0aGUgbmVjZXNzYXJ5IGluc3RhbmNlIHZhcmlhYmxlcyBhbmQgbWV0aG9kcy4gIAotICoKLSAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiAgQHZlcnNpb24gJElkJAotICogIEBzaW5jZSAzLjAKLSAqIAotICoqLwotCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlTcGVjaWZpY2F0aW9uIGV4dGVuZHMgQmFzZUxvY2F0YWJsZSBpbXBsZW1lbnRzIElQcm9wZXJ0eVNwZWNpZmljYXRpb24KLXsKLQlwcml2YXRlIFN0cmluZyBfbmFtZTsKLQlwcml2YXRlIFN0cmluZyBfdHlwZSA9ICJqYXZhLmxhbmcuT2JqZWN0IjsKLQlwcml2YXRlIGJvb2xlYW4gX3BlcnNpc3RlbnQ7Ci0JcHJpdmF0ZSBTdHJpbmcgX2luaXRpYWxWYWx1ZTsKLQkKLSAgICBwdWJsaWMgU3RyaW5nIGdldEluaXRpYWxWYWx1ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gX2luaXRpYWxWYWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9uYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzUGVyc2lzdGVudCgpCi0gICAgewotICAgICAgICByZXR1cm4gX3BlcnNpc3RlbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRUeXBlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfdHlwZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRJbml0aWFsVmFsdWUoU3RyaW5nIGluaXRpYWxWYWx1ZSkKLSAgICB7Ci0gICAgICAgIF9pbml0aWFsVmFsdWUgPSBpbml0aWFsVmFsdWU7Ci0gICAgfQotCi0JLyoqCi0JICogIFNldHMgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5LiAgVGhpcyBzaG91bGQgbm90IGJlIGNoYW5nZWQKLQkgKiAgb25jZSB0aGlzIElQcm9wZXJ0eVNwZWNpZmljYXRpb24gaXMgYWRkZWQgdG8KLQkgKiAgYSB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5zcGVjLkNvbXBvbmVudFNwZWNpZmljYXRpb259LgotCSAqIAotCSAqKi8KLQkKLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKQotICAgIHsKLSAgICAgICAgX25hbWUgPSBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBlcnNpc3RlbnQoYm9vbGVhbiBwZXJzaXN0YW50KQotICAgIHsKLSAgICAgICAgX3BlcnNpc3RlbnQgPSBwZXJzaXN0YW50OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIHR5cGUpCi0gICAgewotICAgICAgICBfdHlwZSA9IHR5cGU7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvc3BlYy9TcGVjRmFjdG9yeS5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3NwZWMvU3BlY0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjIxMGIwYS4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvc3BlYy9TcGVjRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgwICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LnNwZWM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmJlYW4uRXhwcmVzc2lvbkJlYW5Jbml0aWFsaXplcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmJlYW4uSUJlYW5Jbml0aWFsaXplcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmJlYW4uTWVzc2FnZUJlYW5Jbml0aWFsaXplcjsKLQotLyoqCi0gKiAgQSBGYWN0b3J5IHVzZWQgYnkge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkucGFyc2UuU3BlY2lmaWNhdGlvblBhcnNlcn0gdG8gY3JlYXRlIFRhcGVzdHJ5Ci0gKiAgZG9tYWluIG9iamVjdHMuCi0gKiAKLSAqICA8cD4KLSAqICBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBoZXJlIGNyZWF0ZXMgdGhlIGV4cGVjdGVkIHJ1bnRpbWUKLSAqICBpbnN0YW5jZXMgb2YgY2xhc3NlcyBpbiBwYWNrYWdlczoKLSAqICA8dWw+Ci0gKiAgPGxpPm9yZy5hcGFjaGUudGFwZXN0cnkuc3BlYzwvbGk+Ci0gKiAgPGxpPm9yZy5hcGFjaGUudGFwZXN0cnkuYmVhbjwvbGk+Ci0gKiAgPC91bD4KLSAqIAotICogIDxwPgotICogIFRoaXMgY2xhc3MgaXMgZXh0ZW5kZWQgYnkgU3BpbmRsZSAtIHRoZSBFY2xpcHNlIFBsdWdpbiBmb3IgVGFwZXN0cnkKLSAqIAotICogIEBhdXRob3IgR1dMCi0gKiAgQHNpbmNlIDEuMC45Ci0gKiAKLSAqKi8KLQotcHVibGljIGNsYXNzIFNwZWNGYWN0b3J5Ci17Ci0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIGNvbmNyZXRlIGluc3RhbmNlIG9mIHtAbGluayBBcHBsaWNhdGlvblNwZWNpZmljYXRpb259LgotICAgICAqKi8KLQotICAgIHB1YmxpYyBJQXBwbGljYXRpb25TcGVjaWZpY2F0aW9uIGNyZWF0ZUFwcGxpY2F0aW9uU3BlY2lmaWNhdGlvbigpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IEFwcGxpY2F0aW9uU3BlY2lmaWNhdGlvbigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHtAbGluayBMaWJyYXJ5U3BlY2lmaWNhdGlvbn0uCi0gICAgICogCi0gICAgICogIEBzaW5jZSAyLjIKLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgSUxpYnJhcnlTcGVjaWZpY2F0aW9uIGNyZWF0ZUxpYnJhcnlTcGVjaWZpY2F0aW9uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgTGlicmFyeVNwZWNpZmljYXRpb24oKTsKLSAgICB9Ci0KLQkvKioKLQkgKiAgUmV0dXJucyBhIG5ldyBpbnN0YW5jZSBvZiB7QGxpbmsgSUFzc2V0U3BlY2lmaWNhdGlvbn0uCi0JICogCi0JICogIEBzaW5jZSAzLjAKLQkgKiAKLQkgKiovCi0JCi0JcHVibGljIElBc3NldFNwZWNpZmljYXRpb24gY3JlYXRlQXNzZXRTcGVjaWZpY2F0aW9uKCkKLQl7Ci0JCXJldHVybiBuZXcgQXNzZXRTcGVjaWZpY2F0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2Yge0BsaW5rIElCZWFuU3BlY2lmaWNhdGlvbn0uCi0JICogCi0JICogIEBzaW5jZSAzLjAKLQkgKiAKLQkgKiovCi0JCi0JcHVibGljIElCZWFuU3BlY2lmaWNhdGlvbiBjcmVhdGVCZWFuU3BlY2lmaWNhdGlvbigpCi0JewotCQlyZXR1cm4gbmV3IEJlYW5TcGVjaWZpY2F0aW9uKCk7Ci0JfQotCi0JcHVibGljIElCaW5kaW5nU3BlY2lmaWNhdGlvbiBjcmVhdGVCaW5kaW5nU3BlY2lmaWNhdGlvbigpIAotCXsKLQkJcmV0dXJuIG5ldyBCaW5kaW5nU3BlY2lmaWNhdGlvbigpOwotCX0KLQotICAgIC8qKgotICAgICAqICBDcmVhdGVzIGEgbmV3IGNvbmNyZXRlIGluc3RhbmNlIG9mIHtAbGluayBJTGlzdGVuZXJCaW5kaW5nU3BlY2lmaWNhdGlvbn0gZm9yIHRoZQotICAgICAqICBnaXZlbiBsYW5ndWFnZSAod2hpY2ggaXMgb3B0aW9uKSBhbmQgc2NyaXB0LgotICAgICAqIAotICAgICAqICBAc2luY2UgMy4wCi0gICAgICogIAotICAgICAqKi8KLQotICAgIHB1YmxpYyBJTGlzdGVuZXJCaW5kaW5nU3BlY2lmaWNhdGlvbiBjcmVhdGVMaXN0ZW5lckJpbmRpbmdTcGVjaWZpY2F0aW9uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgTGlzdGVuZXJCaW5kaW5nU3BlY2lmaWNhdGlvbigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBjb25jcmV0ZSBpbnN0YW5jZSBvZiB7QGxpbmsgSUNvbXBvbmVudFNwZWNpZmljYXRpb259LgotICAgICAqKi8KLQotICAgIHB1YmxpYyBJQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBjcmVhdGVDb21wb25lbnRTcGVjaWZpY2F0aW9uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgQ29tcG9uZW50U3BlY2lmaWNhdGlvbigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBjb25jcmV0ZSBpbnN0YW5jZSBvZiB7QGxpbmsgSUNvbnRhaW5lZENvbXBvbmVudH0uCi0gICAgICoqLwotCi0gICAgcHVibGljIElDb250YWluZWRDb21wb25lbnQgY3JlYXRlQ29udGFpbmVkQ29tcG9uZW50KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgQ29udGFpbmVkQ29tcG9uZW50KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIGNvbmNyZXRlIGluc3RhbmNlIG9mIHtAbGluayBQYXJhbWV0ZXJTcGVjaWZpY2F0aW9ufS4KLSAgICAgKiovCi0KLSAgICBwdWJsaWMgSVBhcmFtZXRlclNwZWNpZmljYXRpb24gY3JlYXRlUGFyYW1ldGVyU3BlY2lmaWNhdGlvbigpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IFBhcmFtZXRlclNwZWNpZmljYXRpb24oKTsKLSAgICB9Ci0KLQkvKioKLQkgKiAgQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB7QGxpbmsgRXhwcmVzc2lvbkJlYW5Jbml0aWFsaXplcn0uCi0JICogCi0JICogIEBzaW5jZSAzLjAKLQkgKiAKLQkgKiovCi0JCi0JcHVibGljIElCZWFuSW5pdGlhbGl6ZXIgY3JlYXRlRXhwcmVzc2lvbkJlYW5Jbml0aWFsaXplcigpCi0JewotCQlyZXR1cm4gbmV3IEV4cHJlc3Npb25CZWFuSW5pdGlhbGl6ZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAgUmV0dXJucyBhIG5ldyBpbnN0YW5jZSBvZiB7QGxpbmsgTWVzc2FnZUJlYW5Jbml0aWFsaXplcn0uCi0JICogCi0JICogIEBzaW5jZSAzLjAKLQkgKiAKLQkgKiovCi0JCi0JcHVibGljIElCZWFuSW5pdGlhbGl6ZXIgY3JlYXRlTWVzc2FnZUJlYW5Jbml0aWFsaXplcigpCi0JewotCQlyZXR1cm4gbmV3IE1lc3NhZ2VCZWFuSW5pdGlhbGl6ZXIoKTsKLQl9Ci0KLSAgICAvKioKLSAgICAgKiAgQ3JlYXRlcyBhIGNvbmNyZXRlIGluc3RhbmNlIG9mIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LnNwZWMuSUV4dGVuc2lvblNwZWNpZmljYXRpb259LgotICAgICAqIAotICAgICAqICBAc2luY2UgMi4yCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIElFeHRlbnNpb25TcGVjaWZpY2F0aW9uIGNyZWF0ZUV4dGVuc2lvblNwZWNpZmljYXRpb24oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBFeHRlbnNpb25TcGVjaWZpY2F0aW9uKCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqICBDcmVhdGVzIGEgY29uY3JldGUgaW5zdGFuY2Ugb2Yge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkuc3BlYy5JUHJvcGVydHlTcGVjaWZpY2F0aW9ufS4KLSAgICAgKiAKLSAgICAgKiAgQHNpbmNlIDMuMAotICAgICAqIAotICAgICAqKi8KLSAgICAKLSAgICBwdWJsaWMgSVByb3BlcnR5U3BlY2lmaWNhdGlvbiBjcmVhdGVQcm9wZXJ0eVNwZWNpZmljYXRpb24oKQotICAgIHsKLSAgICAJcmV0dXJuIG5ldyBQcm9wZXJ0eVNwZWNpZmljYXRpb24oKTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3NwZWMvcGFja2FnZS5odG1sIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3NwZWMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGZhYTAyLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS9zcGVjL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLTwhZG9jdHlwZSBodG1sIHB1YmxpYyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci08IS0tICRJZCQgLS0+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlRhcGVzdHJ5OiBXZWIgQXBwbGljYXRpb24gRnJhbWV3b3JrPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotCi08cD5DbGFzc2VzIHRvIHJlcHJlc2VudCBhcHBsaWNhdGlvbiBhbmQgY29tcG9uZW50IHNwZWNpZmljYXRpb25zLgotCi1AYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwIDxhIGhyZWY9Im1haWx0bzpobHNoaXBAYXBhY2hlLm9yZyI+aGxzaGlwQGFwYWNoZS5vcmc8L2E+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS91dGlsL0FkYXB0b3JSZWdpc3RyeS5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3V0aWwvQWRhcHRvclJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxYWQ0NzguLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3V0aWwvQWRhcHRvclJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTkgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5UYXBlc3RyeTsKLQotLyoqCi0gKiAgQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIDxiPkFkYXB0b3I8L2I+IHBhdHRlcm4uICBUaGUgYWRhcHRvcgotICogIHBhdHRlcm4gYWxsb3dzIG5ldyBmdW5jdGlvbmFsaXR5IHRvIGJlIGFzc2lnbmVkIHRvIGFuIGV4aXN0aW5nIGNsYXNzLgotICogIEFzIGltcGxlbWVudGVkIGhlcmUsIHRoaXMgaXMgYSBzbWFydCBsb29rdXAgYmV0d2VlbgotICogIGEgcGFydGljdWxhciBjbGFzcyAodGhlIGNsYXNzIHRvIGJlIGFkYXB0ZWQsIGNhbGxlZAotICogIHRoZSA8ZW0+c3ViamVjdCBjbGFzczwvZW0+KSBhbmQgc29tZSBvYmplY3QgaW5zdGFuY2UKLSAqICB0aGF0IGNhbiBwcm92aWRlIHRoZSBleHRyYSBmdW5jdGlvbmFsaXR5IChjYWxsZWQgdGhlCi0gKiAgPGVtPmFkYXB0b3I8L2VtPikuICBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGFkYXB0b3IgaXMgbm90IHJlbGV2YW50Ci0gKiAgdG8gdGhlIEFkYXB0b3JSZWdpc3RyeSBjbGFzcy4KLSAqCi0gKiAgPHA+QWRhcHRvcnMgYXJlIHJlZ2lzdGVyZWQgYmVmb3JlIHRoZXkgY2FuIGJlIHVzZWQ7IHRoZSByZWdpc3RyYXRpb24gbWFwcyBhCi0gKiAgcGFydGljdWxhciBjbGFzcyB0byBhbiBhZGFwdG9yIGluc3RhbmNlLiAgVGhlIGFkYXB0b3IgaW5zdGFuY2Ugd2lsbCBiZSB1c2VkCi0gKiAgd2hlbiB0aGUgc3ViamVjdCBjbGFzcyBtYXRjaGVzIHRoZSByZWdpc3RlcmVkIGNsYXNzLCBvciB0aGUgc3ViamVjdCBjbGFzcwotICogIGluaGVyaXRzIGZyb20gdGhlIHJlZ2lzdGVyZWQgY2xhc3MuCi0gKgotICogIDxwPlRoaXMgbWVhbnMgdGhhdCBhIHNlYXJjaCBtdXN0IGJlIG1hZGUgdGhhdCB3YWxrcyB0aGUgaW5oZXJpdGFuY2UgdHJlZQotICogICh1cHdhcmRzIGZyb20gdGhlIHN1YmplY3QgY2xhc3MpIHRvIGZpbmQgYSByZWdpc3RlcmVkIG1hcHBpbmcuCi0gKgotICogIDxwPkluIGFkZGl0aW9uLCBhZGFwdG9ycyBjYW4gYmUgcmVnaXN0ZXJlZCBhZ2FpbnN0IDxlbT5pbnRlcmZhY2VzPC9lbT4uCi0gKiAgU2VhcmNoaW5nIG9mIGludGVyZmFjZXMgb2NjdXJzIGFmdGVyIHNlYXJjaGluZyBvZiBjbGFzc2VzLiAgVGhlIGV4YWN0IG9yZGVyIGlzOgotICoKLSAqICA8dWw+Ci0gKiAgPGxpPlNlYXJjaCBmb3IgdGhlIHN1YmplY3QgY2xhc3MsIHRoZW4gZWFjaCBzdXBlci1jbGFzcyBvZiB0aGUgc3ViamVjdCBjbGFzcwotICogICAgICAoZXhjbHVkaW5nIGphdmEubGFuZy5PYmplY3QpCi0gKiAgPGxpPlNlYXJjaCBpbnRlcmZhY2VzLCBzdGFydGluZyB3aXRoIGludGVyZmFjZXMgaW1wbGVtZW50ZWQgYnkgdGhlIHN1YmplY3QgY2xhc3MsCi0gKiAgY29udGludWluZyB3aXRoIGludGVyZmFjZXMgaW1wbGVtZW50ZWQgYnkgdGhlIHN1cGVyLWNsYXNzZXMsIHRoZW4KLSAqICBpbnRlcmZhY2VzIGV4dGVuZGVkIGJ5IGVhcmxpZXIgaW50ZXJmYWNlcyAodGhlIGV4YWN0IG9yZGVyIGlzIGEgYml0IGZ1enp5KQotICogIDxsaT5TZWFyY2ggZm9yIGEgbWF0Y2ggZm9yIGphdmEubGFuZy5PYmplY3QsIGlmIGFueQotICogIDwvdWw+Ci0gKgotICogIDxwPlRoZSBmaXJzdCBtYXRjaCB0ZXJtaW5hdGVzIHRoZSBzZWFyY2guCi0gKgotICogIDxwPlRoZSBBZGFwdG9yUmVnaXN0cnkgY2FjaGVzIHRoZSByZXN1bHRzIG9mIHNlYXJjaDsgYSBzdWJzZXF1ZW50IHNlYXJjaCBmb3IgdGhlCi0gKiAgc2FtZSBzdWJqZWN0IGNsYXNzIHdpbGwgYmUgcmVzb2x2ZWQgaW1tZWRpYXRlbHkuCi0gKiAKLSAqICA8cD5BZGFwdG9yUmVnaXN0cnkgZG9lcyBhIG1pbm9yIHR3ZWFrIG9mIHRoZSAibmF0dXJhbCIgaW5oZXJpdGFuY2UuCi0gKiAgTm9ybWFsbHksIHRoZSBwYXJlbnQgY2xhc3Mgb2YgYW4gb2JqZWN0IGFycmF5IChpLmUuLCA8Y29kZT5Gb29bXTwvY29kZT4pIGlzCi0gKiAgc2ltcGx5IDxjb2RlPk9iamVjdDwvY29kZT4sIGV2ZW4gdGhvdWdoIHlvdSBtYXkgYXNzaWduIAotICogIDxjb2RlPkZvb1tdPC9jb2RlPiB0byBhIHZhcmlhYmxlIG9mIHR5cGUgPGNvZGU+T2JqZWN0W108L2NvZGU+LiAgQWRhcHRvclJlZ2lzdHJ5Ci0gKiAgImZpeGVzIiB0aGlzIGJ5IHNlYXJjaGluZyBmb3IgPGNvZGU+T2JqZWN0W108L2NvZGU+IGFzIGlmIGl0IHdhcyB0aGUgc3VwZXJjbGFzcyBvZgotICogIGFueSBvYmplY3QgYXJyYXkuICBUaGlzIG1lYW5zIHRoYXQgdGhlIHNlYXJjaCBwYXRoIGZvciA8Y29kZT5Gb29bXTwvY29kZT4gaXMKLSAqICA8Y29kZT5Gb29bXTwvY29kZT4sIDxjb2RlPk9iamVjdFtdPC9jb2RlPiwgdGhlbiBhIGNvdXBsZSBvZiBpbnRlcmZhY2VzIAotICogIHtAbGluayBqYXZhLmxhbmcuQ2xvbmVhYmxlfSwge0BsaW5rIGphdmEuaW8uU2VyaWFsaXphYmxlfSwgZXRjLiB0aGF0IGFyZVwKLSAqICBpbXBsaWNpdGlseSBpbXBsZW1lbnRlZCBieSBhcnJhcnlzKSwgYW5kIHRoZW4sIGZpbmFsbHksIDxjb2RlPk9iamVjdDwvY29kZT4KLSAqIAotICogIDxwPgotICogIFRoaXMgdHdlYWsgZG9lc24ndCBhcHBseSB0byBzY2FsYXIgYXJyYXlzLCBzaW5jZSBzY2FsYXIgYXJyYXlzIG1heSA8ZW0+bm90PC9lbT4KLSAqICBiZSBhc3NpZ25lZCB0byA8Y29kZT5PYmplY3RbXTwvY29kZT4uIAotICoKLSAqICA8cD5UaGlzIGNsYXNzIGlzIHRocmVhZCBzYWZlLgotICoKLSAqCi0gKiAgQHZlcnNpb24gJElkJAotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqIAotICoqLwotCi1wdWJsaWMgY2xhc3MgQWRhcHRvclJlZ2lzdHJ5Ci17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIExPRyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEFkYXB0b3JSZWdpc3RyeS5jbGFzcyk7Ci0KLSAgICAvKioKLSAgICAgKiAgQSBNYXAgb2YgYWRhcHRvciBvYmplY3RzLCBrZXllZCBvbiByZWdpc3RyYXRpb24gQ2xhc3MuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwcml2YXRlIE1hcCByZWdpc3RyYXRpb25zID0gbmV3IEhhc2hNYXAoKTsKLQotICAgIC8qKgotICAgICAqICBBIE1hcCBvZiBhZGFwdG9yIG9iamVjdHMsIGtleWVkIG9uIHN1YmplY3QgQ2xhc3MuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwcml2YXRlIE1hcCBjYWNoZSA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICAvKioKLSAgICAgKiAgUmVnaXN0ZXJzIGFuIGFkYXB0b3IgZm9yIGEgcmVnaXN0cmF0aW9uIGNsYXNzLgotICAgICAqCi0gICAgICogIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGFuIGFkYXB0b3IgaGFzIGFscmVhZHkKLSAgICAgKiAgYmVlbiByZWdpc3RlcmVkIGZvciB0aGUgZ2l2ZW4gY2xhc3MuCi0gICAgICoqLwotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlZ2lzdGVyKENsYXNzIHJlZ2lzdHJhdGlvbkNsYXNzLCBPYmplY3QgYWRhcHRvcikKLSAgICB7Ci0gICAgICAgIGlmIChyZWdpc3RyYXRpb25zLmNvbnRhaW5zS2V5KHJlZ2lzdHJhdGlvbkNsYXNzKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgVGFwZXN0cnkuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAiQWRhcHRvclJlZ2lzdHJ5LmR1cGxpY2F0ZS1yZWdpc3RyYXRpb24iLAotICAgICAgICAgICAgICAgICAgICBUYXBlc3RyeS5nZXRDbGFzc05hbWUocmVnaXN0cmF0aW9uQ2xhc3MpKSk7Ci0KLSAgICAgICAgcmVnaXN0cmF0aW9ucy5wdXQocmVnaXN0cmF0aW9uQ2xhc3MsIGFkYXB0b3IpOwotCi0gICAgICAgIGlmIChMT0cuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgICAgIExPRy5kZWJ1ZygiUmVnaXN0ZXJlZCAiICsgYWRhcHRvciArICIgZm9yICIgKyBUYXBlc3RyeS5nZXRDbGFzc05hbWUocmVnaXN0cmF0aW9uQ2xhc3MpKTsKLQotICAgICAgICAvLyBDYW4ndCB0ZWxsIHdoYXQgaXMgYW5kIGlzbid0IHZhbGlkIGluIHRoZSBjYWNoZS4KLSAgICAgICAgLy8gQWxzbywgbm9ybWFsbHkgYWxsIHJlZ2lzdHJhdGlvbnMgb2NjdXIgYmVmb3JlIGFueSBhZGFwdG9ycwotICAgICAgICAvLyBhcmUgc2VhcmNoZWQgZm9yLCBzbyB0aGlzIGlzIG5vdCBhIGJpZyBkZWFsLgotCi0gICAgICAgIGNhY2hlLmNsZWFyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEdldHMgdGhlIGFkYXB0b3IgZm9yIHRoZSBzcGVjaWZpZWQgc3ViamVjdENsYXNzLgotICAgICAqCi0gICAgICogIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIG5vIGFkYXB0b3IgY291bGQgYmUgZm91bmQuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIE9iamVjdCBnZXRBZGFwdG9yKENsYXNzIHN1YmplY3RDbGFzcykKLSAgICB7Ci0gICAgICAgIE9iamVjdCByZXN1bHQ7Ci0KLSAgICAgICAgaWYgKExPRy5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICAgICAgTE9HLmRlYnVnKCJHZXR0aW5nIGFkYXB0b3IgZm9yIGNsYXNzICIgKyBUYXBlc3RyeS5nZXRDbGFzc05hbWUoc3ViamVjdENsYXNzKSk7Ci0KLSAgICAgICAgcmVzdWx0ID0gY2FjaGUuZ2V0KHN1YmplY3RDbGFzcyk7Ci0KLSAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoTE9HLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgTE9HLmRlYnVnKCJGb3VuZCAiICsgcmVzdWx0ICsgIiBpbiBjYWNoZSIpOwotCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0KLSAgICAgICAgcmVzdWx0ID0gc2VhcmNoRm9yQWRhcHRvcihzdWJqZWN0Q2xhc3MpOwotCi0gICAgICAgIC8vIFJlY29yZCB0aGUgcmVzdWx0IGluIHRoZSBjYWNoZQotCi0gICAgICAgIGNhY2hlLnB1dChzdWJqZWN0Q2xhc3MsIHJlc3VsdCk7Ci0KLSAgICAgICAgaWYgKExPRy5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICAgICAgTE9HLmRlYnVnKCJGb3VuZCAiICsgcmVzdWx0KTsKLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlYXJjaGVzIHRoZSByZWdpc3RyYXRpb24gTWFwIGZvciBhIG1hdGNoLCBiYXNlZCBvbiBpbmhlcml0YW5jZS4KLSAgICAgKgotICAgICAqIDxwPlNlYXJjaGVzIGNsYXNzIGluaGVyaXRhbmNlIGZpcnN0LCB0aGVuIGludGVyZmFjZXMgKGluIGEgcmF0aGVyIHZhZ3VlIG9yZGVyKS4KLSAgICAgKiBSZWFsbHkgc2hvdWxkIG1hdGNoIHRoZSBvcmRlciBmcm9tIHRoZSBKVk0gc3BlYy4KLSAgICAgKgotICAgICAqIDxwPlRoZXJlJ3MgYSBkZWdlbmVyYXRlIGNhc2Ugd2hlcmUgd2UgbWF5IGNoZWNrIHRoZSBzYW1lIGludGVyZmFjZSBtb3JlIHRoYW4gb25jZToKLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPlR3byBpbnRlcmZhY2VzLCBJMSBhbmQgSTIKLSAgICAgKiA8bGk+VHdvIGNsYXNzZXMsIEMxIGFuZCBDMgotICAgICAqIDxsaT5JMiBleHRlbmRzIEkxCi0gICAgICogPGxpPkMyIGV4dGVuZHMgQzEKLSAgICAgKiA8bGk+QzEgaW1wbGVtZW50cyBJMQotICAgICAqIDxsaT5DMiBpbXBsZW1lbnRzIEkyCi0gICAgICogPGxpPlRoZSBzZWFyY2ggd2lsbCBiZTogQzIsIEMxLCBJMiwgSTEsIEkxCi0gICAgICogPGxpPkkxIGlzIHNlYXJjaGVkIHR3aWNlLCBiZWNhdXNlIEMxIGltcGxlbWVudHMgaXQsIGFuZCBJMiBleHRlbmRzIGl0Ci0gICAgICogPGxpPlRoZXJlIGFyZSBvdGhlciBzdWNoIGNhc2VzLCBidXQgbm9uZSBvZiB0aGVtIGNhdXNlIGluZmluaXRlIGxvb3BzCi0gICAgICogYW5kIG1vc3QgYXJlIHJhcmUgKHdlIGNvdWxkIGd1YXJkIGFnYWluc3QgaXQsIGJ1dCBpdHMgcmVsYXRpdmVseSBleHBlbnNpdmUpLgotICAgICAqIDxsaT5NdWx0aXBsZSBjaGVja3Mgb25seSBvY2N1ciBpZiB3ZSBkb24ndCBmaW5kIGEgcmVnaXN0cmF0aW9uCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqICA8cD4KLSAgICAgKiAgVGhpcyBtZXRob2QgaXMgb25seSBjYWxsZWQgZnJvbSBhIHN5bmNocm9uaXplZCBibG9jaywgc28gaXQgaXMKLSAgICAgKiAgaW1wbGljaXRseSBzeW5jaHJvbml6ZWQuCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHJpdmF0ZSBPYmplY3Qgc2VhcmNoRm9yQWRhcHRvcihDbGFzcyBzdWJqZWN0Q2xhc3MpCi0gICAgewotICAgICAgICBMaW5rZWRMaXN0IHF1ZXVlID0gbnVsbDsKLSAgICAgICAgT2JqZWN0IHJlc3VsdCA9IG51bGw7Ci0KLSAgICAgICAgaWYgKExPRy5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICAgICAgTE9HLmRlYnVnKCJTZWFyY2hpbmcgZm9yIGFkYXB0b3IgZm9yIGNsYXNzICIgKyBUYXBlc3RyeS5nZXRDbGFzc05hbWUoc3ViamVjdENsYXNzKSk7Ci0KLSAgICAgICAgLy8gU3RlcCBvbmU6IHdvcmsgdXAgdGhyb3VnaCB0aGUgY2xhc3MgaW5oZXJpdGFuY2UuCi0KLSAgICAgICAgQ2xhc3Mgc2VhcmNoQ2xhc3MgPSBzdWJqZWN0Q2xhc3M7Ci0KLSAgICAgICAgLy8gUHJpbWl0aXZlIHR5cGVzIGhhdmUgbnVsbCwgbm90IE9iamVjdCwgYXMgdGhlaXIgcGFyZW50Ci0gICAgICAgIC8vIGNsYXNzLgotCi0gICAgICAgIHdoaWxlIChzZWFyY2hDbGFzcyAhPSBPYmplY3QuY2xhc3MgJiYgc2VhcmNoQ2xhc3MgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0ID0gcmVnaXN0cmF0aW9ucy5nZXQoc2VhcmNoQ2xhc3MpOwotICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0KLSAgICAgICAgICAgIC8vIE5vdCBhbiBleGFjdCBtYXRjaC4gIElmIHRoZSBzZWFyY2ggY2xhc3MKLSAgICAgICAgICAgIC8vIGltcGxlbWVudHMgYW55IGludGVyZmFjZXMsIGFkZCB0aGVtIHRvIHRoZSBxdWV1ZS4KLQotICAgICAgICAgICAgQ2xhc3NbXSBpbnRlcmZhY2VzID0gc2VhcmNoQ2xhc3MuZ2V0SW50ZXJmYWNlcygpOwotICAgICAgICAgICAgaW50IGxlbmd0aCA9IGludGVyZmFjZXMubGVuZ3RoOwotCi0gICAgICAgICAgICBpZiAocXVldWUgPT0gbnVsbCAmJiBsZW5ndGggPiAwKQotICAgICAgICAgICAgICAgIHF1ZXVlID0gbmV3IExpbmtlZExpc3QoKTsKLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICBxdWV1ZS5hZGRMYXN0KGludGVyZmFjZXNbaV0pOwotCi0gICAgICAgICAgICAvLyBBZHZhbmNlIHVwIHRvIHRoZSBuZXh0IHN1cGVyY2xhc3MKLQotICAgICAgICAgICAgc2VhcmNoQ2xhc3MgPSBnZXRTdXBlcmNsYXNzKHNlYXJjaENsYXNzKTsKLQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gT2ssIHRoZSBlYXN5IHBhcnQgZmFpbGVkLCBsZXRzIHN0YXJ0IHNlYXJjaGluZwotICAgICAgICAvLyBpbnRlcmZhY2VzLgotCi0gICAgICAgIGlmIChxdWV1ZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB3aGlsZSAoIXF1ZXVlLmlzRW1wdHkoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzZWFyY2hDbGFzcyA9IChDbGFzcykgcXVldWUucmVtb3ZlRmlyc3QoKTsKLQotICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlZ2lzdHJhdGlvbnMuZ2V0KHNlYXJjaENsYXNzKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0KLSAgICAgICAgICAgICAgICAvLyBJbnRlcmZhY2VzIGNhbiBleHRlbmQgb3RoZXIgaW50ZXJmYWNlczsgYWRkIHRoZW0KLSAgICAgICAgICAgICAgICAvLyB0byB0aGUgcXVldWUuCi0KLSAgICAgICAgICAgICAgICBDbGFzc1tdIGludGVyZmFjZXMgPSBzZWFyY2hDbGFzcy5nZXRJbnRlcmZhY2VzKCk7Ci0gICAgICAgICAgICAgICAgaW50IGxlbmd0aCA9IGludGVyZmFjZXMubGVuZ3RoOwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgcXVldWUuYWRkTGFzdChpbnRlcmZhY2VzW2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIE5vdCBhIG1hdGNoIG9uIGludGVyZmFjZTsgb3VyIGxhc3QgZ2FzcCBpcyB0byBjaGVjawotICAgICAgICAvLyBmb3IgYSByZWdpc3RyYXRpb24gZm9yIGphdmEubGFuZy5PYmplY3QKLQotICAgICAgICByZXN1bHQgPSByZWdpc3RyYXRpb25zLmdldChPYmplY3QuY2xhc3MpOwotICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotCi0gICAgICAgIC8vIE5vIG1hdGNoPyAgVGhhdCdzIHJhcmUgLi4uIGFuZCBhbiBlcnJvci4KLQotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgVGFwZXN0cnkuZm9ybWF0KAotICAgICAgICAgICAgICAgICJBZGFwdG9yUmVnaXN0cnkuYWRhcHRvci1ub3QtZm91bmQiLAotICAgICAgICAgICAgICAgIFRhcGVzdHJ5LmdldENsYXNzTmFtZShzdWJqZWN0Q2xhc3MpKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgdGhlIHN1cGVyY2xhc3Mgb2YgdGhlIGdpdmVuIGNsYXNzLCB3aXRoIGEgc2luZ2xlIHR3ZWFrOiAgSWYgdGhlIAotICAgICAqICBzZWFyY2ggY2xhc3MgaXMgYW4gYXJyYXkgY2xhc3MsIGFuZCB0aGUgY29tcG9uZW50IHR5cGUgaXMgYW4gb2JqZWN0IGNsYXNzCi0gICAgICogIChidXQgbm90IE9iamVjdCksIHRoZW4gdGhlIHNpbXBsZSBPYmplY3QgYXJyYXkgY2xhc3MgaXMgcmV0dXJuZWQuICBUaGlzIHJlZmxlY3RzCi0gICAgICogIHRoZSBmYWN0IHRoYXQgYW4gYXJyYXkgb2YgYW55IGNsYXNzIG1heSBiZSBhc3NpZ25hYmxlIHRvIDxjb2RlPk9iamVjdFtdPC9jb2RlPiwKLSAgICAgKiAgZXZlbiB0aG91Z2ggdGhlIHN1cGVyY2xhc3Mgb2YgYW4gYXJyYXkgaXMgYWx3YXlzIHNpbXBseSA8Y29kZT5PYmplY3Q8L2NvZGU+LgotICAgICAqIAotICAgICAqKi8KLQotICAgIHByaXZhdGUgQ2xhc3MgZ2V0U3VwZXJjbGFzcyhDbGFzcyBzZWFyY2hDbGFzcykKLSAgICB7Ci0gICAgICAgIGlmIChzZWFyY2hDbGFzcy5pc0FycmF5KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIENsYXNzIGNvbXBvbmVudFR5cGUgPSBzZWFyY2hDbGFzcy5nZXRDb21wb25lbnRUeXBlKCk7Ci0KLSAgICAgICAgICAgIGlmICghY29tcG9uZW50VHlwZS5pc1ByaW1pdGl2ZSgpICYmIGNvbXBvbmVudFR5cGUgIT0gT2JqZWN0LmNsYXNzKQotICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3RbXS5jbGFzczsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzZWFyY2hDbGFzcy5nZXRTdXBlcmNsYXNzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmcgdG9TdHJpbmcoKQotICAgIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgYnVmZmVyLmFwcGVuZCgiQWRhcHRvclJlZ2lzdHJ5WyIpOwotCi0gICAgICAgIEl0ZXJhdG9yIGkgPSByZWdpc3RyYXRpb25zLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICAgICAgYm9vbGVhbiBzaG93U2VwID0gZmFsc2U7Ci0KLSAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoc2hvd1NlcCkKLSAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCcgJyk7Ci0KLSAgICAgICAgICAgIE1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGkubmV4dCgpOwotCi0gICAgICAgICAgICBDbGFzcyByZWdpc3RlcmVkQ2xhc3MgPSAoQ2xhc3MpIGVudHJ5LmdldEtleSgpOwotCi0gICAgICAgICAgICBidWZmZXIuYXBwZW5kKFRhcGVzdHJ5LmdldENsYXNzTmFtZShyZWdpc3RlcmVkQ2xhc3MpKTsKLSAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIj0iKTsKLSAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoZW50cnkuZ2V0VmFsdWUoKSk7Ci0KLSAgICAgICAgICAgIHNob3dTZXAgPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgYnVmZmVyLmFwcGVuZCgiXSIpOwotCi0gICAgICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3V0aWwvQmFzZVByb3BlcnR5SG9sZGVyLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdXRpbC9CYXNlUHJvcGVydHlIb2xkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU3NDZlYS4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdXRpbC9CYXNlUHJvcGVydHlIb2xkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqICBCYXNlIGNsYXNzIGltcGxlbWVudGF0aW9uIGZvciB0aGUge0BsaW5rIElQcm9wZXJ0eUhvbGRlcn0gaW50ZXJmYWNlLgotICoKLSAqCi0gKiAgQHZlcnNpb24gJElkJAotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqCi0gKiovCi0KLXB1YmxpYyBjbGFzcyBCYXNlUHJvcGVydHlIb2xkZXIgaW1wbGVtZW50cyBJUHJvcGVydHlIb2xkZXIKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFQX1NJWkUgPSA3OwotICAgIHByaXZhdGUgTWFwIHByb3BlcnRpZXM7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5KFN0cmluZyBuYW1lKQotICAgIHsKLSAgICAgICAgaWYgKHByb3BlcnRpZXMgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIHJldHVybiAoU3RyaW5nKSBwcm9wZXJ0aWVzLmdldChuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKQotICAgIHsKLSAgICAgICAgaWYgKHZhbHVlID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlbW92ZVByb3BlcnR5KG5hbWUpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHByb3BlcnRpZXMgPT0gbnVsbCkKLSAgICAgICAgICAgIHByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcChNQVBfU0laRSk7Ci0KLSAgICAgICAgcHJvcGVydGllcy5wdXQobmFtZSwgdmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVByb3BlcnR5KFN0cmluZyBuYW1lKQotICAgIHsKLSAgICAgICAgaWYgKHByb3BlcnRpZXMgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBwcm9wZXJ0aWVzLnJlbW92ZShuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eU5hbWVzKCkKLSAgICB7Ci0gICAgICAgIGlmIChwcm9wZXJ0aWVzID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQotICAgICAgICBMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QocHJvcGVydGllcy5rZXlTZXQoKSk7Ci0gICAgICAgIAotICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KHJlc3VsdCk7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS91dGlsL0NvbXBvbmVudEFkZHJlc3MuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS91dGlsL0NvbXBvbmVudEFkZHJlc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhlMjgxOC4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdXRpbC9Db21wb25lbnRBZGRyZXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JQ29tcG9uZW50OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklQYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlcXVlc3RDeWNsZTsKLQotLyoqCi0gKiBUaGUgQ29tcG9uZW50QWRkcmVzcyBjbGFzcyBjb250YWlucyB0aGUgcGF0aCB0byBhIGNvbXBvbmVudCwgYWxsb3dpbmcgaXQgdG8gIAotICogbG9jYXRlIGFuIGluc3RhbmNlIG9mIHRoYXQgY29tcG9uZW50IGluIGEgZGlmZmVyZW50IAotICoge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlcXVlc3RDeWNsZX0uCi0gKiAKLSAqIDxwPlRoaXMgY2xhc3MgbmVlZHMgdG8gYmUgdXNlZCBtb3N0bHkgd2hlbiB3b3JraW5nIHdpdGggY29tcG9uZW50cwotICogYWNjZXNzZWQgdmlhIHRoZSB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVuZGVyfSBpbnRlcmZhY2UuIAotICogSXQgYWxsb3dzIHRob3NlIGNvbXBvbmVudHMgdG8gc2VyaWFsaXplIGFuZAotICogcGFzcyBhcyBhIHNlcnZpY2UgcGFyYW1ldGVyIGluZm9ybWF0aW9uIGFib3V0IHdoYXQgY29tcG9uZW50IHRoZXkgaGF2ZSB0byAKLSAqIHRhbGsgdG8gaWYgY29udHJvbCByZXR1cm5zIGJhY2sgdG8gdGhlbS4gCi0gKiAKLSAqIDxwPlRoaXMgc2l0dWF0aW9uIG9mdGVuIG9jY3VycyB3aGVuIHRoZSBjb21wb25lbnQgdXNlZCB2aWEgSVJlbmRlciBjb250YWlucwotICogRGlyZWN0IG9yIEFjdGlvbiBsaW5rcy4KLSAqIAotICogQHZlcnNpb24gJElkJAotICogQGF1dGhvciBtaW5kYnJpZGdlCi0gKiBAc2luY2UgMi4yCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIENvbXBvbmVudEFkZHJlc3MgaW1wbGVtZW50cyBTZXJpYWxpemFibGUKLXsKLSAgICBwcml2YXRlIFN0cmluZyBfcGFnZU5hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgX2lkUGF0aDsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgQ29tcG9uZW50QWRkcmVzcyBvYmplY3QgdGhhdCBjYXJyaWVzIHRoZSBpZGVudGlmaWNhdGlvbiAKLSAgICAgKiBpbmZvcm1hdGlvbiBvZiB0aGUgZ2l2ZW4gY29tcG9uZW50ICh0aGUgcGFnZSBuYW1lIGFuZCB0aGUgSUQgcGF0aCkuCi0gICAgICogQHBhcmFtIGNvbXBvbmVudCB0aGUgY29tcG9uZW50IHRvIGdldCB0aGUgYWRkcmVzcyBvZgotICAgICAqLwotICAgIHB1YmxpYyBDb21wb25lbnRBZGRyZXNzKElDb21wb25lbnQgY29tcG9uZW50KQotICAgIHsKLSAgICAgICAgdGhpcyhjb21wb25lbnQuZ2V0UGFnZSgpLmdldFBhZ2VOYW1lKCksIGNvbXBvbmVudC5nZXRJZFBhdGgoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBDb21wb25lbnRBZGRyZXNzIHVzaW5nIHRoZSBnaXZlbiBQYWdlIE5hbWUgYW5kIElEIFBhdGgKLSAgICAgKiBAcGFyYW0gcGFnZU5hbWUgdGhlIG5hbWUgb2YgdGhlIHBhZ2UgdGhhdCBjb250YWlucyB0aGUgY29tcG9uZW50Ci0gICAgICogQHBhcmFtIGlkUGF0aCB0aGUgSUQgUGF0aCBvZiB0aGUgY29tcG9uZW50Ci0gICAgICovCi0gICAgcHVibGljIENvbXBvbmVudEFkZHJlc3MoU3RyaW5nIHBhZ2VOYW1lLCBTdHJpbmcgaWRQYXRoKQotICAgIHsKLSAgICAgICAgX3BhZ2VOYW1lID0gcGFnZU5hbWU7Ci0gICAgICAgIF9pZFBhdGggPSBpZFBhdGg7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBDb21wb25lbnRBZGRyZXNzIHVzaW5nIHRoZSBnaXZlbiBQYWdlIE5hbWUgYW5kIElEIFBhdGgKLSAgICAgKiByZWxhdGl2ZSBvbiB0aGUgcHJvdmlkZWQgTmFtZXNwYWNlCi0gICAgICogQHBhcmFtIG5hbWVzcGFjZSB0aGUgbmFtZXNwYWNlIG9mIHRoZSBwYWdlIHRoYXQgY29udGFpbnMgdGhlIGNvbXBvbmVudAotICAgICAqIEBwYXJhbSBwYWdlTmFtZSB0aGUgbmFtZSBvZiB0aGUgcGFnZSB0aGF0IGNvbnRhaW5zIHRoZSBjb21wb25lbnQKLSAgICAgKiBAcGFyYW0gaWRQYXRoIHRoZSBJRCBQYXRoIG9mIHRoZSBjb21wb25lbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgQ29tcG9uZW50QWRkcmVzcygKLSAgICAgICAgSU5hbWVzcGFjZSBuYW1lc3BhY2UsCi0gICAgICAgIFN0cmluZyBwYWdlTmFtZSwKLSAgICAgICAgU3RyaW5nIGlkUGF0aCkKLSAgICB7Ci0gICAgICAgIHRoaXMobmFtZXNwYWNlLmNvbnN0cnVjdFF1YWxpZmllZE5hbWUocGFnZU5hbWUpLCBpZFBhdGgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZpbmRzIGEgY29tcG9uZW50IHdpdGggdGhlIGN1cnJlbnQgYWRkcmVzcyB1c2luZyB0aGUgZ2l2ZW4gUmVxdWVzdEN5Y2xlLgotICAgICAqIEBwYXJhbSBjeWNsZSB0aGUgUmVxdWVzdEN5Y2xlIHRvIHVzZSB0byBsb2NhdGUgdGhlIGNvbXBvbmVudAotICAgICAqIEByZXR1cm4gSUNvbXBvbmVudCBhIGNvbXBvbmVudCB0aGF0IGhhcyBiZWVuIGluaXRpYWxpemVkIGZvciB0aGUgZ2l2ZW4gUmVxdWVzdEN5Y2xlCi0gICAgICovCi0gICAgcHVibGljIElDb21wb25lbnQgZmluZENvbXBvbmVudChJUmVxdWVzdEN5Y2xlIGN5Y2xlKQotICAgIHsKLSAgICAgICAgSVBhZ2Ugb2JqUGFnZSA9IGN5Y2xlLmdldFBhZ2UoX3BhZ2VOYW1lKTsKLSAgICAgICAgcmV0dXJuIG9ialBhZ2UuZ2V0TmVzdGVkQ29tcG9uZW50KF9pZFBhdGgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGlkUGF0aCBvZiB0aGUgY29tcG9uZW50LgotICAgICAqIEByZXR1cm4gU3RyaW5nIHRoZSBJRCBwYXRoIG9mIHRoZSBjb21wb25lbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldElkUGF0aCgpCi0gICAgewotICAgICAgICByZXR1cm4gX2lkUGF0aDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBQYWdlIE5hbWUgb2YgdGhlIGNvbXBvbmVudC4KLSAgICAgKiBAcmV0dXJuIFN0cmluZyB0aGUgUGFnZSBOYW1lIG9mIHRoZSBjb21wb25lbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhZ2VOYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfcGFnZU5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2hhc2hDb2RlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkKLSAgICB7Ci0gICAgICAgIGludCBoYXNoID0gX3BhZ2VOYW1lLmhhc2hDb2RlKCkgKiAzMTsKLSAgICAgICAgaWYgKF9pZFBhdGggIT0gbnVsbCkKLSAgICAgICAgICAgIGhhc2ggKz0gX2lkUGF0aC5oYXNoQ29kZSgpOwotICAgICAgICByZXR1cm4gaGFzaDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjZXF1YWxzKE9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikKLSAgICB7Ci0gICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIENvbXBvbmVudEFkZHJlc3MpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIGlmIChvYmogPT0gdGhpcykKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgIENvbXBvbmVudEFkZHJlc3Mgb2JqQWRkcmVzcyA9IChDb21wb25lbnRBZGRyZXNzKSBvYmo7Ci0gICAgICAgIGlmICghZ2V0UGFnZU5hbWUoKS5lcXVhbHMob2JqQWRkcmVzcy5nZXRQYWdlTmFtZSgpKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBTdHJpbmcgaWRQYXRoMSA9IGdldElkUGF0aCgpOwotICAgICAgICBTdHJpbmcgaWRQYXRoMiA9IG9iakFkZHJlc3MuZ2V0SWRQYXRoKCk7Ci0gICAgICAgIHJldHVybiAoaWRQYXRoMSA9PSBpZFBhdGgyKQotICAgICAgICAgICAgfHwgKGlkUGF0aDEgIT0gbnVsbCAmJiBpZFBhdGgxLmVxdWFscyhpZFBhdGgyKSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdXRpbC9Db250ZW50VHlwZS5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3V0aWwvQ29udGVudFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFmYjU1OC4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdXRpbC9Db250ZW50VHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg5ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotLyoqCi0gKiAgUmVwcmVzZW50cyBhbiBIVFRQIGNvbnRlbnQgdHlwZS4gQWxsb3dzIHRvIHNldCB2YXJpb3VzIGVsZW1lbnRzIGxpa2UKLSAqICB0aGUgbWltZSB0eXBlLCB0aGUgY2hhcmFjdGVyIHNldCwgYW5kIG90aGVyIHBhcmFtZXRlcnMuCi0gKiAgVGhpcyBpcyBzaW1pbGFyIHRvIGEgbnVtYmVyIG9mIG90aGVyIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgc2FtZSBjb25jZXB0IGluIEpBRiwgZXRjLgotICogIFdlIGhhdmUgY3JlYXRlZCB0aGlzIHNpbXBsZSBpbXBsZW1lbnRhdGlvbiB0byBhdm9pZCBpbmNsdWRpbmcgdGhlIHdob2xlIGxpYnJhcmllcy4gCi0gKiAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQGF1dGhvciBtaW5kYnJpZGdlCi0gKiAgQHNpbmNlIDMuMAotICoqLwotcHVibGljIGNsYXNzIENvbnRlbnRUeXBlCi17Ci0gICAgcHJpdmF0ZSBTdHJpbmcgX2Jhc2VUeXBlOwotICAgIHByaXZhdGUgU3RyaW5nIF9zdWJUeXBlOwotICAgIHByaXZhdGUgTWFwIF9wYXJhbWV0ZXJzOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBlbXB0eSBjb250ZW50IHR5cGUKLSAgICAgKi8KLSAgICBwdWJsaWMgQ29udGVudFR5cGUoKQotICAgIHsKLSAgICAgICAgaW5pdGlhbGl6ZSgpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGNvbnRlbnQgdHlwZSBmcm9tIHRoZSBhcmd1bWVudC4KLSAgICAgKiBUaGUgZm9ybWF0IG9mIHRoZSBhcmd1bWVudCBoYXMgdG8gYmUgYmFzZXR5cGUvc3VidHlwZSg7a2V5PXZhbHVlKSogCi0gICAgICogCi0gICAgICogQHBhcmFtIGNvbnRlbnRUeXBlIHRoZSBjb250ZW50IHR5cGUgdGhhdCBuZWVkcyB0byBiZSByZXByZXNlbnRlZAotICAgICAqLwotICAgIHB1YmxpYyBDb250ZW50VHlwZShTdHJpbmcgY29udGVudFR5cGUpCi0gICAgewotICAgICAgICB0aGlzKCk7Ci0gICAgICAgIHBhcnNlKGNvbnRlbnRUeXBlKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoKQotICAgIHsKLSAgICAgICAgX2Jhc2VUeXBlID0gIiI7Ci0gICAgICAgIF9zdWJUeXBlID0gIiI7Ci0gICAgICAgIF9wYXJhbWV0ZXJzID0gbmV3IEhhc2hNYXAoKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgYmFzZSB0eXBlIG9mIHRoZSBjb250ZW50IHR5cGUKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEJhc2VUeXBlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfYmFzZVR5cGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGJhc2VUeXBlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0QmFzZVR5cGUoU3RyaW5nIGJhc2VUeXBlKQotICAgIHsKLSAgICAgICAgX2Jhc2VUeXBlID0gYmFzZVR5cGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgc3ViLXR5cGUgb2YgdGhlIGNvbnRlbnQgdHlwZQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3ViVHlwZSgpCi0gICAgewotICAgICAgICByZXR1cm4gX3N1YlR5cGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHN1YlR5cGUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTdWJUeXBlKFN0cmluZyBzdWJUeXBlKQotICAgIHsKLSAgICAgICAgX3N1YlR5cGUgPSBzdWJUeXBlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIE1JTUUgdHlwZSBvZiB0aGUgY29udGVudCB0eXBlCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRNaW1lVHlwZSgpCi0gICAgewotICAgICAgICByZXR1cm4gX2Jhc2VUeXBlICsgIi8iICsgX3N1YlR5cGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgbGlzdCBvZiBuYW1lcyBvZiBwYXJhbWV0ZXJzIGluIHRoaXMgY29udGVudCB0eXBlIAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRQYXJhbWV0ZXJOYW1lcygpCi0gICAgewotICAgICAgICBTZXQgcGFyYW1ldGVyTmFtZXMgPSBfcGFyYW1ldGVycy5rZXlTZXQoKTsgCi0gICAgICAgIHJldHVybiAoU3RyaW5nW10pIHBhcmFtZXRlck5hbWVzLnRvQXJyYXkobmV3IFN0cmluZ1twYXJhbWV0ZXJOYW1lcy5zaXplKCldKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0ga2V5IHRoZSBuYW1lIG9mIHRoZSBjb250ZW50IHR5cGUgcGFyYW1ldGVyCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGNvbnRlbnQgdHlwZSBwYXJhbWV0ZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhcmFtZXRlcihTdHJpbmcga2V5KQotICAgIHsKLSAgICAgICAgcmV0dXJuIChTdHJpbmcpIF9wYXJhbWV0ZXJzLmdldChrZXkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBrZXkgdGhlIG5hbWUgb2YgdGhlIGNvbnRlbnQgdHlwZSBwYXJhbWV0ZXIKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIG9mIHRoZSBjb250ZW50IHR5cGUgcGFyYW1ldGVyCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UGFyYW1ldGVyKFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIF9wYXJhbWV0ZXJzLnB1dChrZXkudG9Mb3dlckNhc2UoKSwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBhcnNlcyB0aGUgYXJndW1lbnQgYW5kIGNvbmZpZ3VyZXMgdGhlIGNvbnRlbnQgdHlwZSBhY2NvcmRpbmdseS4KLSAgICAgKiBUaGUgZm9ybWF0IG9mIHRoZSBhcmd1bWVudCBoYXMgdG8gYmUgdHlwZS9zdWJ0eXBlKDtrZXk9dmFsdWUpKiAKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29udGVudFR5cGUgdGhlIGNvbnRlbnQgdHlwZSB0aGF0IG5lZWRzIHRvIGJlIHJlcHJlc2VudGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcGFyc2UoU3RyaW5nIGNvbnRlbnRUeXBlKQotICAgIHsKLSAgICAgICAgaW5pdGlhbGl6ZSgpOwotCi0gICAgICAgIFN0cmluZ1Rva2VuaXplciB0b2tlbnMgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGNvbnRlbnRUeXBlLCAiOyIpOwotICAgICAgICBpZiAoIXRva2Vucy5oYXNNb3JlVG9rZW5zKCkpIAotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAKLSAgICAgICAgU3RyaW5nIG1pbWVUeXBlID0gdG9rZW5zLm5leHRUb2tlbigpOwotICAgICAgICBTdHJpbmdUb2tlbml6ZXIgbWltZVRva2VucyA9IG5ldyBTdHJpbmdUb2tlbml6ZXIobWltZVR5cGUsICIvIik7Ci0gICAgICAgIHNldEJhc2VUeXBlKG1pbWVUb2tlbnMuaGFzTW9yZVRva2VucygpID8gbWltZVRva2Vucy5uZXh0VG9rZW4oKSA6ICIiKTsKLSAgICAgICAgc2V0U3ViVHlwZShtaW1lVG9rZW5zLmhhc01vcmVUb2tlbnMoKSA/IG1pbWVUb2tlbnMubmV4dFRva2VuKCkgOiAiIik7Ci0gICAgICAgIAotICAgICAgICB3aGlsZSAodG9rZW5zLmhhc01vcmVUb2tlbnMoKSkgewotICAgICAgICAgICAgU3RyaW5nIHBhcmFtZXRlciA9IHRva2Vucy5uZXh0VG9rZW4oKTsKLQotICAgICAgICAgICAgU3RyaW5nVG9rZW5pemVyIHBhcmFtZXRlclRva2VucyA9IG5ldyBTdHJpbmdUb2tlbml6ZXIocGFyYW1ldGVyLCAiPSIpOwotICAgICAgICAgICAgU3RyaW5nIGtleSA9IHBhcmFtZXRlclRva2Vucy5oYXNNb3JlVG9rZW5zKCkgPyBwYXJhbWV0ZXJUb2tlbnMubmV4dFRva2VuKCkgOiAiIjsKLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IHBhcmFtZXRlclRva2Vucy5oYXNNb3JlVG9rZW5zKCkgPyBwYXJhbWV0ZXJUb2tlbnMubmV4dFRva2VuKCkgOiAiIjsKLSAgICAgICAgICAgIHNldFBhcmFtZXRlcihrZXksIHZhbHVlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIAotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgY29udGVudCB0eXBlCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyB1bnBhcnNlKCkKLSAgICB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKGdldE1pbWVUeXBlKCkpOwotCi0gICAgICAgIFN0cmluZ1tdIHBhcmFtZXRlck5hbWVzID0gZ2V0UGFyYW1ldGVyTmFtZXMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbWV0ZXJOYW1lcy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIGtleSA9IHBhcmFtZXRlck5hbWVzW2ldOwotICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gZ2V0UGFyYW1ldGVyKGtleSk7Ci0gICAgICAgICAgICBidWYuYXBwZW5kKCI7IiArIGtleSArICI9IiArIHZhbHVlKTsKLSAgICAgICAgfSAKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgY29udGVudCB0eXBlLiBTYW1lIGFzIHVucGFyc2UoKS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB1bnBhcnNlKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdXRpbC9EZWZhdWx0UmVzb3VyY2VSZXNvbHZlci5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3V0aWwvRGVmYXVsdFJlc291cmNlUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWYwNGM3Yy4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdXRpbC9EZWZhdWx0UmVzb3VyY2VSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LnV0aWw7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlc291cmNlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5UYXBlc3RyeTsKLQotLyoqCi0gKiAgRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVzb3VyY2VSZXNvbHZlcn0gYmFzZWQKLSAqICBhcm91bmQge0BsaW5rIFRocmVhZCNnZXRDb250ZXh0Q2xhc3NMb2FkZXIoKX0gKHdoaWNoIGlzIHNldCBieSB0aGUKLSAqICBzZXJ2bGV0IGNvbnRhaW5lcikuCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQHNpbmNlIDIuMwotICogCi0gKiovCi0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0UmVzb3VyY2VSZXNvbHZlciBpbXBsZW1lbnRzIElSZXNvdXJjZVJlc29sdmVyCi17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIExPRyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKERlZmF1bHRSZXNvdXJjZVJlc29sdmVyLmNsYXNzKTsKLQotICAgIHByaXZhdGUgQ2xhc3NMb2FkZXIgX2xvYWRlcjsKLQotICAgIC8qKgotICAgICAqICBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIHVzaW5nCi0gICAgICogIHtAbGluayBUaHJlYWQjZ2V0Q29udGV4dENsYXNzTG9hZGVyKCl9LgotICAgICAqIAotICAgICAqKi8KLSAgICAKLSAgICBwdWJsaWMgRGVmYXVsdFJlc291cmNlUmVzb2x2ZXIoKQotICAgIHsKLSAgICAgICAgdGhpcyhUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRGVmYXVsdFJlc291cmNlUmVzb2x2ZXIoQ2xhc3NMb2FkZXIgbG9hZGVyKQotICAgIHsKLSAgICAgICAgX2xvYWRlciA9IGxvYWRlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVVJMIGdldFJlc291cmNlKFN0cmluZyBuYW1lKQotICAgIHsKLSAgICAgICAgYm9vbGVhbiBkZWJ1ZyA9IExPRy5pc0RlYnVnRW5hYmxlZCgpOwotCi0gICAgICAgIGlmIChkZWJ1ZykKLSAgICAgICAgICAgIExPRy5kZWJ1ZygiZ2V0UmVzb3VyY2UoIiArIG5hbWUgKyAiKSIpOwotCi0gICAgICAgIFN0cmluZyBzdHJpcHBlZCA9IHJlbW92ZUxlYWRpbmdTbGFzaChuYW1lKTsKLQotICAgICAgICBVUkwgcmVzdWx0ID0gX2xvYWRlci5nZXRSZXNvdXJjZShzdHJpcHBlZCk7Ci0KLSAgICAgICAgaWYgKGRlYnVnKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgTE9HLmRlYnVnKCJOb3QgZm91bmQuIik7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgTE9HLmRlYnVnKCJGb3VuZCBhcyAiICsgcmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgcmVtb3ZlTGVhZGluZ1NsYXNoKFN0cmluZyBuYW1lKQotICAgIHsKLSAgICAgICAgaWYgKG5hbWUuc3RhcnRzV2l0aCgiLyIpKQotICAgICAgICAgICAgcmV0dXJuIG5hbWUuc3Vic3RyaW5nKDEpOwotCi0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBJbnZva2VzIHtAbGluayBDbGFzcyNmb3JOYW1lKGphdmEubGFuZy5TdHJpbmcsIGJvb2xlYW4sIGphdmEubGFuZy5DbGFzc0xvYWRlcil9LgotICAgICAqICAKLSAgICAgKiAgQHBhcmFtIG5hbWUgdGhlIGNvbXBsZXRlIGNsYXNzIG5hbWUgdG8gbG9jYXRlIGFuZCBsb2FkCi0gICAgICogIEByZXR1cm4gVGhlIGxvYWRlZCBjbGFzcwotICAgICAqICBAdGhyb3dzIEFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbiBpZiBsb2FkaW5nIHRoZSBjbGFzcyB0aHJvd3MgYW4gZXhjZXB0aW9uCi0gICAgICogICh0eXBpY2FsbHkgIHtAbGluayBDbGFzc05vdEZvdW5kRXhjZXB0aW9ufSBvciBhIHNlY3VyaXR5IGV4Y2VwdGlvbikKLSAgICAgKiAKLSAgICAgKiovCi0gICAgCi0gICAgcHVibGljIENsYXNzIGZpbmRDbGFzcyhTdHJpbmcgbmFtZSkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gQ2xhc3MuZm9yTmFtZShuYW1lLCB0cnVlLCBfbG9hZGVyKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgVGFwZXN0cnkuZm9ybWF0KCJSZXNvdXJjZVJlc29sdmVyLnVuYWJsZS10by1sb2FkLWNsYXNzIiwgbmFtZSwgX2xvYWRlciwgdC5nZXRNZXNzYWdlKCkpLAotICAgICAgICAgICAgICAgIHQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogIE9HTkwgU3VwcG9ydCBmb3IgZHluYW1pYyBjbGFzcyBsb2FkaW5nLiAgU2ltcGx5IGludm9rZXMge0BsaW5rICNmaW5kQ2xhc3MoU3RyaW5nKX0uCi0gICAgICogCi0gICAgICoqLwotICAgIAotICAgIHB1YmxpYyBDbGFzcyBjbGFzc0Zvck5hbWUoU3RyaW5nIG5hbWUsIE1hcCBtYXApIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gZmluZENsYXNzKG5hbWUpOwotICAgIH0KLQotICAgIC8qKiBAc2luY2UgMy4wICoqLwotICAgIAotICAgIHB1YmxpYyBDbGFzc0xvYWRlciBnZXRDbGFzc0xvYWRlcigpCi0gICAgewotICAgICAgICByZXR1cm4gX2xvYWRlcjsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS91dGlsL0RlbGVnYXRpbmdQcm9wZXJ0eVNvdXJjZS5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3V0aWwvRGVsZWdhdGluZ1Byb3BlcnR5U291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwODUwMDcuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3V0aWwvRGVsZWdhdGluZ1Byb3BlcnR5U291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuZW5naW5lLklQcm9wZXJ0eVNvdXJjZTsKLQotLyoqCi0gKiAgQW4gaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIElQcm9wZXJ0eVNvdXJjZX0KLSAqICB0aGF0IGRlbGVnYXRlcyB0byBhIGxpc3Qgb2Ygb3RoZXIgaW1wbGVtZW50YXRpb25zLiAgVGhpcyBtYWtlcwotICogIGl0IHBvc3NpYmxlIHRvIGNyZWF0ZSBhIHNlYXJjaCBwYXRoIGZvciBwcm9wZXJ0eSB2YWx1ZXMuCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQHNpbmNlIDIuMwotICoKLSAqKi8KLQotcHVibGljIGNsYXNzIERlbGVnYXRpbmdQcm9wZXJ0eVNvdXJjZSBpbXBsZW1lbnRzIElQcm9wZXJ0eVNvdXJjZQotewotICAgIHByaXZhdGUgTGlzdCBfc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAKLSAgICBwdWJsaWMgRGVsZWdhdGluZ1Byb3BlcnR5U291cmNlKCkKLSAgICB7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBEZWxlZ2F0aW5nUHJvcGVydHlTb3VyY2UoSVByb3BlcnR5U291cmNlIGRlbGVnYXRlKQotICAgIHsKLSAgICAgICAgYWRkU291cmNlKGRlbGVnYXRlKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogIEFkZHMgYW5vdGhlciBzb3VyY2UgdG8gdGhlIGxpc3Qgb2YgZGVsZWdhdGUgcHJvcGVydHkgc291cmNlcy4KLSAgICAgKiAgVGhpcyBpcyB0eXBpY2FsbHkgb25seSBkb25lIGR1cmluZyBpbml0aWFsaXphdGlvbgotICAgICAqICBvZiB0aGlzIERlbGVnYXRpbmdQcm9wZXJ0eVNvdXJjZS4KLSAgICAgKiAKLSAgICAgKiovCi0gICAgCi0gICAgcHVibGljIHZvaWQgYWRkU291cmNlKElQcm9wZXJ0eVNvdXJjZSBzb3VyY2UpCi0gICAgewotICAgICAgICBfc291cmNlcy5hZGQoc291cmNlKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogIFJlLWludm9rZXMgdGhlIG1ldGhvZCBvbiBlYWNoIGRlbGVnYXRlIHByb3BlcnR5IHNvdXJjZSwgCi0gICAgICogIGluIG9yZGVyLCByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHZhbHVlIGZvdW5kLgotICAgICAqIAotICAgICAqKi8KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5VmFsdWUoU3RyaW5nIHByb3BlcnR5TmFtZSkKLSAgICB7Ci0gICAgICAgIFN0cmluZyByZXN1bHQgPSBudWxsOwotICAgICAgICBpbnQgY291bnQgPSBfc291cmNlcy5zaXplKCk7Ci0gICAgICAgIAotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIElQcm9wZXJ0eVNvdXJjZSBzb3VyY2UgPSAoSVByb3BlcnR5U291cmNlKV9zb3VyY2VzLmdldChpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmVzdWx0ID0gc291cmNlLmdldFByb3BlcnR5VmFsdWUocHJvcGVydHlOYW1lKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gcmVzdWx0OyAgICAgICAgCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdXRpbC9JQ2xlYW5hYmxlLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdXRpbC9JQ2xlYW5hYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyYzA1ODUuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3V0aWwvSUNsZWFuYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkudXRpbDsKLQotLyoqCi0gKiAgQW4gaW50ZXJmYWNlIGltcGxlbWVudGVkIGJ5IG9iamVjdHMgdGhhdCBjYW4gYmUKLSAqICBjbGVhbmVkIHVwLCB3aGljaCBpcyB0byBzYXksIGNhbiByZWxlYXNlIHVubmVlZGVkCi0gKiAgb2JqZWN0IHJlZmVyZW5jZXMuICBUaGlzIGlzIHVzZWZ1bCBmb3IgbWFueSBjbGFzc2VzIHdoaWNoCi0gKiAgcHJvdmlkZSBhIHBvb2xpbmcgb3IgY2FjaGluZyBmdW5jdGlvbi4gIE92ZXIgdGltZSwgCi0gKiAgc29tZSBwb29sZWQgb3IgY2FjaGVkIG9iamVjdHMgbWF5IG5vIGxvbmdlciBiZSB1c2VmdWwKLSAqICB0byBrZWVwIGFuZCBjYW4gYmUgcmVsZWFzZWQuIAotICogIHJlZmVyZW5jZXMgdG8gdW5uZWVkZWQgb2JqZWN0cy4KLSAqICBUaGlzIGludGVyZmFjZSBpcyB0aGUgYnJpZGdlIGJldHdlZW4KLSAqICB0aGUge0BsaW5rIEphbml0b3JUaHJlYWR9IGNsYXNzIGFuZCBhbiBvYmplY3QgdGhhdAotICogIHdpc2hlcyB0byBiZSBwZXJpb2RpY2FsbHkgdG9sZCB0byAiY2xlYW4gdXAiLgotICoKLSAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiAgQHZlcnNpb24gJElkJAotICogIEBzaW5jZSAxLjAuNQotICoKLSAqKi8KLQotcHVibGljIGludGVyZmFjZSBJQ2xlYW5hYmxlCi17Ci0gICAgLyoqCi0gICAgICogIEludm9rZWQgcGVyaW9kaWNhbGx5IGJ5IHRoZSB7QGxpbmsgSmFuaXRvclRocmVhZH0KLSAgICAgKiAgdG8gcGVyZm9ybSB3aGF0ZXZlciBtZW1vcnkgY2xlYW51cHMgYXJlIHJlYXNvbmFibGUuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlQ2xlYW51cCgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS91dGlsL0lQcm9wZXJ0eUhvbGRlci5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3V0aWwvSVByb3BlcnR5SG9sZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3ZGY5ZGIuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3V0aWwvSVByb3BlcnR5SG9sZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogIEFuIGludGVyZmFjZSB0aGF0IGRlZmluZXMgYW4gb2JqZWN0IHRoYXQgY2FuIHN0b3JlIG5hbWVkIHByb3BlcnR5cy4gIFRoZSBuYW1lcwotICogIGFuZCB0aGUgcHJvcGVydGllcyBhcmUgU3RyaW5ncy4KLSAqCi0gKiAgQHZlcnNpb24gJElkJAotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqCi0gKiovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSVByb3BlcnR5SG9sZGVyCi17Ci0gICAgLyoqCi0gICAgICogIFJldHVybnMgYSBMaXN0IG9mIFN0cmluZ3MsIHRoZSBuYW1lcyBvZiBhbGwKLSAgICAgKiAgcHJvcGVydGllcyBoZWxkIGJ5IHRoZSByZWNlaXZlci4gIE1heSByZXR1cm4gYW4gZW1wdHkgbGlzdC4KLSAgICAgKiAgVGhlIExpc3QgaXMgc29ydGVkIGFscGhhYmV0aWNhbGx5LiAgVGhlIExpc3QgbWF5IGJlIG1vZGlmaWVkCi0gICAgICogIHdpdGhvdXQgYWZmZWN0aW5nIHRoaXMgcHJvcGVydHkgaG9sZGVyLgotICAgICAqCi0gICAgICogIDxwPlByaW9yIHRvIHJlbGVhc2UgMi4yLCB0aGlzIG1ldGhvZCByZXR1cm5lZCBDb2xsZWN0aW9uLgotICAgICAqIAotICAgICAqKi8KLQotICAgIHB1YmxpYyBMaXN0IGdldFByb3BlcnR5TmFtZXMoKTsKLQotICAgIC8qKgotICAgICAqICBTZXRzIGEgbmFtZWQgcHJvcGVydHkuICBUaGUgbmV3IHZhbHVlIHJlcGxhY2VzIHRoZSBleGlzdGluZyB2YWx1ZSwgaWYgYW55LgotICAgICAqICBTZXR0aW5nIGEgcHJvcGVydHkgdG8gbnVsbCBpcyB0aGUgc2FtZSBhcyByZW1vdmluZyB0aGUgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqICBSZW1vdmVzIHRoZSBuYW1lZCBwcm9wZXJ0eSwgaWYgcHJlc2VudC4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVByb3BlcnR5KFN0cmluZyBuYW1lKTsKLQotICAgIC8qKgotICAgICAqICBSZXRyaWV2ZXMgdGhlIG5hbWVkIHByb3BlcnR5LCBvciBudWxsIGlmIHRoZSBwcm9wZXJ0eSBpcyBub3QgZGVmaW5lZC4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkoU3RyaW5nIG5hbWUpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS91dGlsL0lSZW5kZXJEZXNjcmlwdGlvbi5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3V0aWwvSVJlbmRlckRlc2NyaXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjMDIxMWYuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3V0aWwvSVJlbmRlckRlc2NyaXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS51dGlsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JTWFya3VwV3JpdGVyOwotCi0vKioKLSAqICBBbiBvYmplY3Qgd2hpY2ggbWF5IHJlbmRlciBhIGRlc2NyaXB0aW9uIG9mIGl0c2VsZiwgd2hpY2ggaXMgdXNlZCBpbiBkZWJ1Z2dpbmcKLSAqICAoaS5lLiwgYnkgdGhlIEluc3BlY3RvcikuCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQHNpbmNlIDEuMC42Ci0gKiAKLSAqKi8KLQotcHVibGljIGludGVyZmFjZSBJUmVuZGVyRGVzY3JpcHRpb24KLXsKLQkvKioKLQkgKiAgT2JqZWN0IHNob3VsZCByZW5kZXIgYSBkZXNjcmlwdGlvbiBvZiBpdHNlbGYgdG8gdGhlIHdyaXRlci4KLQkgKgotCSAqKi8KLQotCXB1YmxpYyB2b2lkIHJlbmRlckRlc2NyaXB0aW9uKElNYXJrdXBXcml0ZXIgd3JpdGVyKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdXRpbC9JZEFsbG9jYXRvci5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3V0aWwvSWRBbGxvY2F0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdiYmJlMC4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdXRpbC9JZEFsbG9jYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogIFVzZWQgdG8gInVuaXF1aWZ5IiBuYW1lcyB3aXRoaW4gYSBnaXZlbiBjb250ZXh0LiAgQSBiYXNlIG5hbWUKLSAqICBpcyBwYXNzZWQgaW4sIGFuZCB0aGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBiYXNlIG5hbWUsIG9yIHRoZSBiYXNlIG5hbWUKLSAqICBleHRlbmRlZCB3aXRoIGEgc3VmZml4IHRvIG1ha2UgaXQgdW5pcXVlLgotICoKLSAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiAgQHZlcnNpb24gJElkJAotICogIEBzaW5jZSAzLjAKLSAqCi0gKiovCi0KLXB1YmxpYyBjbGFzcyBJZEFsbG9jYXRvcgotewotICAgIHByaXZhdGUgTWFwIF9nZW5lcmF0b3JNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTmFtZUdlbmVyYXRvcgotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgX2Jhc2VJZDsKLSAgICAgICAgcHJpdmF0ZSBpbnQgX2luZGV4OwotCi0gICAgICAgIE5hbWVHZW5lcmF0b3IoU3RyaW5nIGJhc2VJZCkKLSAgICAgICAgewotICAgICAgICAgICAgX2Jhc2VJZCA9IGJhc2VJZCArICIkIjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgbmV4dElkKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIF9iYXNlSWQgKyBfaW5kZXgrKzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqICBBbGxvY2F0ZXMgdGhlIGlkLiAgUmVwZWF0ZWQgY2FsbHMgZm9yIHRoZSBzYW1lIG5hbWUgd2lsbCByZXR1cm4KLSAgICAgKiAgIm5hbWUiLCAibmFtZV8wIiwgIm5hbWVfMSIsIGV0Yy4KLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgU3RyaW5nIGFsbG9jYXRlSWQoU3RyaW5nIG5hbWUpCi0gICAgewotICAgICAgICBOYW1lR2VuZXJhdG9yIGcgPSAoTmFtZUdlbmVyYXRvcikgX2dlbmVyYXRvck1hcC5nZXQobmFtZSk7Ci0gICAgICAgIFN0cmluZyByZXN1bHQgPSBudWxsOwotCi0gICAgICAgIGlmIChnID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGcgPSBuZXcgTmFtZUdlbmVyYXRvcihuYW1lKTsKLSAgICAgICAgICAgIHJlc3VsdCA9IG5hbWU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmVzdWx0ID0gZy5uZXh0SWQoKTsKLQotICAgICAgICAvLyBIYW5kbGUgdGhlIGRlZ2VuZXJhdGUgY2FzZSwgd2hlcmUgYSBiYXNlIG5hbWUgb2YgdGhlIGZvcm0gImZvbyQwIiBoYXMgYmVlbgotICAgICAgICAvLyByZXF1ZXN0ZWQuICBTa2lwIG92ZXIgYW55IGR1cGxpY2F0ZXMgdGh1cyBmb3JtZWQuCi0gICAgICAgIAotICAgICAgICB3aGlsZSAoX2dlbmVyYXRvck1hcC5jb250YWluc0tleShyZXN1bHQpKQotICAgICAgICAgICAgcmVzdWx0ID0gZy5uZXh0SWQoKTsKLQotICAgICAgICBfZ2VuZXJhdG9yTWFwLnB1dChyZXN1bHQsIGcpOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqICBDbGVhcnMgdGhlIGFsbG9jYXRvciwgcmVzZXR0aW5nIGl0IHRvIGZyZXNobHkgYWxsb2NhdGVkIHN0YXRlLgotICAgICAqIAotICAgICAqKi8KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBjbGVhcigpCi0gICAgewotICAgICAgICBfZ2VuZXJhdG9yTWFwLmNsZWFyKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3V0aWwvSmFuaXRvclRocmVhZC5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3V0aWwvSmFuaXRvclRocmVhZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTY3NDcyLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS91dGlsL0phbml0b3JUaHJlYWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNiArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS51dGlsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5UYXBlc3RyeTsKLQotLyoqCi0gKiBBIGJhc2ljIGtpbmQgb2YgamFuaXRvciwgYW4gb2JqZWN0IHRoYXQgcGVyaW9kaWNhbGx5IGludm9rZXMge0BsaW5rIElDbGVhbmFibGUjZXhlY3V0ZUNsZWFudXAoKX0KLSAqIG9uIGEgc2V0IG9mIG9iamVjdHMuCi0gKiA8cD4KLSAqIFRoZSBKYW5pdG9yVGhyZWFkIGhvbGRzIGEgPGVtPndlYWsgcmVmZXJlbmNlPC9lbT4gdG8gdGhlIG9iamVjdHMgaXQgb3BlcmF0ZXMgb24uCi0gKiAKLSAqIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqIEB2ZXJzaW9uICRJZCQKLSAqIEBzaW5jZSAxLjAuNQotICovCi0KLXB1YmxpYyBjbGFzcyBKYW5pdG9yVGhyZWFkIGV4dGVuZHMgVGhyZWFkCi17Ci0gICAgLyoqCi0gICAgICogRGVmYXVsdCBudW1iZXIgb2Ygc2Vjb25kcyBiZXR3ZWVuIGphbml0b3IgcnVucywgYWJvdXQgMzAgc2Vjb25kcy4KLSAgICAgKi8KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBERUZBVUxUX0lOVEVSVkFMX01JTExJUyA9IDMwICogMTAyNDsKLQotICAgIHByaXZhdGUgbG9uZyBpbnRlcnZhbCA9IERFRkFVTFRfSU5URVJWQUxfTUlMTElTOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIGxvY2tJbnRlcnZhbCA9IGZhbHNlOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgSmFuaXRvclRocmVhZCBzaGFyZWQgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogQSB7QGxpbmsgTGlzdH1vZiB7QGxpbmsgV2Vha1JlZmVyZW5jZX1zIHRvIHtAbGluayBJQ2xlYW5hYmxlfWluc3RhbmNlcy4KLSAgICAgKi8KLQotICAgIHByaXZhdGUgTGlzdCByZWZlcmVuY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBkYWVtb24gSmFuaXRvci4KLSAgICAgKi8KLQotICAgIHB1YmxpYyBKYW5pdG9yVGhyZWFkKCkKLSAgICB7Ci0gICAgICAgIHRoaXMobnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBuZXcgSmFuaXRvciB3aXRoIHRoZSBnaXZlbiBuYW1lLiBUaGUgdGhyZWFkIHdpbGwgaGF2ZSBtaW5pbXVtIHByaW9yaXR5IGFuZCBiZSBhCi0gICAgICogZGFlbW9uLgotICAgICAqLwotCi0gICAgcHVibGljIEphbml0b3JUaHJlYWQoU3RyaW5nIG5hbWUpCi0gICAgewotICAgICAgICBzdXBlcihuYW1lKTsKLQotICAgICAgICBzZXREYWVtb24odHJ1ZSk7Ci0gICAgICAgIHNldFByaW9yaXR5KE1JTl9QUklPUklUWSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIHNoYXJlZCBpbnN0YW5jZSBvZiBKYW5pdG9yVGhyZWFkLiBJbiBtb3N0IGNhc2VzLCB0aGUgc2hhcmVkIGluc3RhbmNlIHNob3VsZCBiZQotICAgICAqIHVzZWQsIHJhdGhlciB0aGFuIGNyZWF0aW5nIGEgbmV3IGluc3RhbmNlOyB0aGUgZXhjZXB0aW9uIGJlaW5nIHdoZW4gcGFydGljdWxhciBzY2hlZHVsaW5nIGlzCi0gICAgICogb2YgY29uY2Vybi4gSXQgaXMgYWxzbyBiYWQgcG9saWN5IHRvIGNoYW5nZSB0aGUgc2xlZXAgaW50ZXJ2YWwgb24gdGhlIHNoYXJlZCBqYW5pdG9yICh0aG91Z2gKLSAgICAgKiBub3RoaW5nIHByZXZlbnRzIHRoaXMsIGVpdGhlcikuCi0gICAgICovCi0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBKYW5pdG9yVGhyZWFkIGdldFNoYXJlZEphbml0b3JUaHJlYWQoKQotICAgIHsKLSAgICAgICAgaWYgKHNoYXJlZCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBzaGFyZWQgPSBuZXcgSmFuaXRvclRocmVhZCgiU2hhcmVkLUphbml0b3JUaHJlYWQiKTsKLSAgICAgICAgICAgIHNoYXJlZC5sb2NrSW50ZXJ2YWwgPSB0cnVlOwotCi0gICAgICAgICAgICBzaGFyZWQuc3RhcnQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzaGFyZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIGxvbmcgZ2V0SW50ZXJ2YWwoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGludGVydmFsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVwZGF0ZXMgdGhlIHByb3BlcnR5LCB3aGljaCBtYXkgbm90IHRha2UgZWZmZWN0IHVudGlsIHRoZSBuZXh0IHRpbWUgdGhlIHRocmVhZCBmaW5pc2hlcwotICAgICAqIHNsZWVwaW5nLgotICAgICAqIAotICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqICAgICAgICAgICAgdGhlIGludGVydmFsLCBpbiBtaWxsaXNlY29uZHMsIGJldHdlZW4gc3dlZXBzLgotICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgYWx3YXlzLCBpZiB0aGUgcmVjZWl2ZXIgaXMgdGhlIHNoYXJlZCBKYW5pdG9yVGhyZWFkCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB2YWx1ZSBpcyBsZXNzIHRoYW4gMQotICAgICAqLwotCi0gICAgcHVibGljIHZvaWQgc2V0SW50ZXJ2YWwobG9uZyB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIGlmIChsb2NrSW50ZXJ2YWwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKFRhcGVzdHJ5LmdldE1lc3NhZ2UoIkphbml0b3JUaHJlYWQuaW50ZXJ2YWwtbG9ja2VkIikpOwotCi0gICAgICAgIGlmICh2YWx1ZSA8IDEpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFRhcGVzdHJ5Ci0gICAgICAgICAgICAgICAgICAgIC5nZXRNZXNzYWdlKCJKYW5pdG9yVGhyZWFkLmlsbGVnYWwtaW50ZXJ2YWwiKSk7Ci0KLSAgICAgICAgaW50ZXJ2YWwgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgbmV3IGNsZWFuYWJsZSBvYmplY3QgdG8gdGhlIGxpc3Qgb2YgcmVmZXJlbmNlcy4gQ2FyZSBzaG91bGQgYmUgdGFrZW4gdGhhdCBvYmplY3RzIGFyZQotICAgICAqIG5vdCBhZGRlZCBtdWx0aXBsZSB0aW1lczsgdGhleSB3aWxsIGJlIGNsZWFuZWQgdG9vIG9mdGVuLgotICAgICAqLwotCi0gICAgcHVibGljIHZvaWQgYWRkKElDbGVhbmFibGUgY2xlYW5hYmxlKQotICAgIHsKLSAgICAgICAgV2Vha1JlZmVyZW5jZSByZWZlcmVuY2UgPSBuZXcgV2Vha1JlZmVyZW5jZShjbGVhbmFibGUpOwotCi0gICAgICAgIHN5bmNocm9uaXplZCAocmVmZXJlbmNlcykKLSAgICAgICAgewotICAgICAgICAgICAgcmVmZXJlbmNlcy5hZGQocmVmZXJlbmNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJ1bnMgdGhyb3VnaCB0aGUgbGlzdCBvZiB0YXJnZXRzIGFuZCBpbnZva2VzIHtAbGluayBJQ2xlYW5hYmxlI2V4ZWN1dGVDbGVhbnVwKCl9b24gZWFjaCBvZgotICAgICAqIHRoZW0uIHtAbGluayBXZWFrUmVmZXJlbmNlfXMgdGhhdCBoYXZlIGJlZW4gaW52YWxpZGF0ZWQgYXJlIHdlZWRlZCBvdXQuCi0gICAgICovCi0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzd2VlcCgpCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKHJlZmVyZW5jZXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEl0ZXJhdG9yIGkgPSByZWZlcmVuY2VzLml0ZXJhdG9yKCk7Ci0KLSAgICAgICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBXZWFrUmVmZXJlbmNlIHJlZiA9IChXZWFrUmVmZXJlbmNlKSBpLm5leHQoKTsKLQotICAgICAgICAgICAgICAgIElDbGVhbmFibGUgY2xlYW5hYmxlID0gKElDbGVhbmFibGUpIHJlZi5nZXQoKTsKLQotICAgICAgICAgICAgICAgIGlmIChjbGVhbmFibGUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgaS5yZW1vdmUoKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGNsZWFuYWJsZS5leGVjdXRlQ2xlYW51cCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV2FpdHMgZm9yIHRoZSBuZXh0IHJ1biwgYnkgc2xlZXBpbmcgZm9yIHRoZSBkZXNpcmVkIHBlcmlvZC4gUmV0dXJucyB0cnVlIGlmIHRoZSBzbGVlcCB3YXMKLSAgICAgKiBzdWNjZXNzZnVsLCBvciBmYWxzZSBpZiB0aGUgdGhyZWFkIHdhcyBpbnRlcnJ1cHRlZCAoYW5kIHNob3VsZCBzaHV0IGRvd24pLgotICAgICAqLwotCi0gICAgcHJvdGVjdGVkIHZvaWQgd2FpdEZvck5leHRQYXNzKCkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBzbGVlcChpbnRlcnZhbCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnRlcnJ1cHQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFsdGVybmF0ZXMgYmV0d2VlbiB7QGxpbmsgI3dhaXRGb3JOZXh0UGFzcygpfWFuZCB7QGxpbmsgI3N3ZWVwKCl9LgotICAgICAqLwotCi0gICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICB7Ci0gICAgICAgIHdoaWxlICghaXNJbnRlcnJ1cHRlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICB3YWl0Rm9yTmV4dFBhc3MoKTsKLQotICAgICAgICAgICAgc3dlZXAoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICAgIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoIkphbml0b3JUaHJlYWRAIik7Ci0gICAgICAgIGJ1ZmZlci5hcHBlbmQoSW50ZWdlci50b0hleFN0cmluZyhoYXNoQ29kZSgpKSk7Ci0KLSAgICAgICAgYnVmZmVyLmFwcGVuZCgiW2ludGVydmFsPSIpOwotICAgICAgICBidWZmZXIuYXBwZW5kKGludGVydmFsKTsKLQotICAgICAgICBidWZmZXIuYXBwZW5kKCIgY291bnQ9Iik7Ci0KLSAgICAgICAgc3luY2hyb25pemVkIChyZWZlcmVuY2VzKQotICAgICAgICB7Ci0gICAgICAgICAgICBidWZmZXIuYXBwZW5kKHJlZmVyZW5jZXMuc2l6ZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGJ1ZmZlci5hcHBlbmQoJ10nKTsKLQotICAgICAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS91dGlsL0xvY2FsaXplZENvbnRleHRSZXNvdXJjZUZpbmRlci5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3V0aWwvTG9jYWxpemVkQ29udGV4dFJlc291cmNlRmluZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlMTFmYmYuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3V0aWwvTG9jYWxpemVkQ29udGV4dFJlc291cmNlRmluZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS51dGlsOwotCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OwotCi0vKioKLSAqICBGaW5kcyBsb2NhbGl6ZWQgcmVzb3VyY2VzIHdpdGhpbiB0aGUgd2ViIGFwcGxpY2F0aW9uIGNvbnRleHQuCi0gKiAKLSAqICBAc2VlIGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQKLSAqCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogIEB2ZXJzaW9uICRJZCQKLSAqICBAc2luY2UgMy4wCi0gKgotICoqLwotCi1wdWJsaWMgY2xhc3MgTG9jYWxpemVkQ29udGV4dFJlc291cmNlRmluZGVyCi17Ci0gICAgcHJpdmF0ZSBTZXJ2bGV0Q29udGV4dCBfY29udGV4dDsKLQotICAgIHB1YmxpYyBMb2NhbGl6ZWRDb250ZXh0UmVzb3VyY2VGaW5kZXIoU2VydmxldENvbnRleHQgY29udGV4dCkKLSAgICB7Ci0gICAgICAgIF9jb250ZXh0ID0gY29udGV4dDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgUmVzb2x2ZXMgdGhlIHJlc291cmNlLCByZXR1cm5pbmcgYSBwYXRoIHJlcHJlc2VudGluZwotICAgICAqICB0aGUgY2xvc2VzdCBtYXRjaCAod2l0aCByZXNwZWN0IHRvIHRoZSBwcm92aWRlZCBsb2NhbGUpLgotICAgICAqICBSZXR1cm5zIG51bGwgaWYgbm8gbWF0Y2guCi0gICAgICogCi0gICAgICogIDxwPlRoZSBwcm92aWRlZCBwYXRoIGlzIHNwbGl0IGludG8gYSBiYXNlIHBhdGgKLSAgICAgKiAgYW5kIGEgc3VmZml4IChhdCB0aGUgbGFzdCBwZXJpb2QgY2hhcmFjdGVyKS4gIFRoZSBsb2NhbGUKLSAgICAgKiAgd2lsbCBwcm92aWRlIGRpZmZlcmVudCBzdWZmaXhlcyB0byB0aGUgYmFzZSBwYXRoCi0gICAgICogIGFuZCB0aGUgZmlyc3QgbWF0Y2ggaXMgcmV0dXJuZWQuCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIExvY2FsaXplZFJlc291cmNlIHJlc29sdmUoU3RyaW5nIGNvbnRleHRQYXRoLCBMb2NhbGUgbG9jYWxlKQotICAgIHsKLSAgICAgICAgaW50IGRvdHggPSBjb250ZXh0UGF0aC5sYXN0SW5kZXhPZignLicpOwotICAgICAgICBTdHJpbmcgYmFzZVBhdGggPSBudWxsOwotICAgICAgICBTdHJpbmcgc3VmZml4ID0gbnVsbDsKLSAgICAgICAgLy8gVGhpcyBoYW5kbGVzIGFzc2V0cyB3aXRob3V0IGV4dGVuc2lvbnMgLSBzdGlsbCBhbGxvd3MgdGhlbSB0byBiZSBsb2NhbGl6ZWQuCi0gICAgICAgIGlmIChkb3R4ID4gLTEpIHsKLSAgICAgICAgICBiYXNlUGF0aCA9IGNvbnRleHRQYXRoLnN1YnN0cmluZygwLCBkb3R4KTsKLSAgICAgICAgICBzdWZmaXggPSBjb250ZXh0UGF0aC5zdWJzdHJpbmcoZG90eCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgYmFzZVBhdGggPSBjb250ZXh0UGF0aDsKLSAgICAgICAgICBzdWZmaXggPSAiIjsKLSAgICAgICAgfQotCi0gICAgICAgIExvY2FsaXplZE5hbWVHZW5lcmF0b3IgZ2VuZXJhdG9yID0gbmV3IExvY2FsaXplZE5hbWVHZW5lcmF0b3IoYmFzZVBhdGgsIGxvY2FsZSwgc3VmZml4KTsKLQotICAgICAgICB3aGlsZSAoZ2VuZXJhdG9yLm1vcmUoKSkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIGNhbmRpZGF0ZVBhdGggPSBnZW5lcmF0b3IubmV4dCgpOwotCi0gICAgICAgICAgICBpZiAoaXNFeGlzdGluZ1Jlc291cmNlKGNhbmRpZGF0ZVBhdGgpKQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTG9jYWxpemVkUmVzb3VyY2UoY2FuZGlkYXRlUGF0aCwgZ2VuZXJhdG9yLmdldEN1cnJlbnRMb2NhbGUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNFeGlzdGluZ1Jlc291cmNlKFN0cmluZyBwYXRoKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5nZXRSZXNvdXJjZShwYXRoKSAhPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZXgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS91dGlsL0xvY2FsaXplZE5hbWVHZW5lcmF0b3IuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS91dGlsL0xvY2FsaXplZE5hbWVHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I0ZmNjNS4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdXRpbC9Mb2NhbGl6ZWROYW1lR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDggKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LlRhcGVzdHJ5OwotCi0vKioKLSAqICBVc2VkIGluIGEgd2lkZSB2YXJpZXR5IG9mIHJlc291cmNlIHNlYXJjaGVzLiAgR2VuZXJhdGVzCi0gKiAgYSBzZXJpZXMgb2YgbmFtZSB2YXJpYXRpb25zIGZyb20gYSBiYXNlIG5hbWUsIGEgCi0gKiAge0BsaW5rIGphdmEudXRpbC5Mb2NhbGV9IGFuZCBhbiBvcHRpb25hbCBzdWZmaXguCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQHNpbmNlIDMuMAotICoKLSAqKi8KLQotcHVibGljIGNsYXNzIExvY2FsaXplZE5hbWVHZW5lcmF0b3IKLXsKLSAgICBwcml2YXRlIGludCBfYmFzZU5hbWVMZW5ndGg7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgX3N1ZmZpeDsKLSAgICBwcml2YXRlIFN0cmluZ0J1ZmZlciBfYnVmZmVyOwotICAgIHByaXZhdGUgU3RyaW5nIF9sYW5ndWFnZTsKLSAgICBwcml2YXRlIFN0cmluZyBfY291bnRyeTsKLSAgICBwcml2YXRlIFN0cmluZyBfdmFyaWFudDsKLSAgICBwcml2YXRlIGludCBfc3RhdGU7Ci0gICAgcHJpdmF0ZSBpbnQgX3ByZXZTdGF0ZTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTklUSUFMID0gMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTENWID0gMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTEMgPSAyOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMViA9IDM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEwgPSA0OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCQVJFID0gNTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVhIQVVTVEVEID0gNjsKLQotICAgIHB1YmxpYyBMb2NhbGl6ZWROYW1lR2VuZXJhdG9yKFN0cmluZyBiYXNlTmFtZSwgTG9jYWxlIGxvY2FsZSwgU3RyaW5nIHN1ZmZpeCkKLSAgICB7Ci0gICAgICAgIF9iYXNlTmFtZUxlbmd0aCA9IGJhc2VOYW1lLmxlbmd0aCgpOwotCi0gICAgICAgIGlmIChsb2NhbGUgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgX2xhbmd1YWdlID0gbG9jYWxlLmdldExhbmd1YWdlKCk7Ci0gICAgICAgICAgICBfY291bnRyeSA9IGxvY2FsZS5nZXRDb3VudHJ5KCk7Ci0gICAgICAgICAgICBfdmFyaWFudCA9IGxvY2FsZS5nZXRWYXJpYW50KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBfc3RhdGUgPSBJTklUSUFMOwotICAgICAgICBfcHJldlN0YXRlID0gSU5JVElBTDsKLQotICAgICAgICBfc3VmZml4ID0gc3VmZml4OwotCi0gICAgICAgIF9idWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKGJhc2VOYW1lKTsKLQotICAgICAgICBhZHZhbmNlKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkdmFuY2UoKQotICAgIHsKLSAgICAgICAgX3ByZXZTdGF0ZSA9IF9zdGF0ZTsKLQotICAgICAgICB3aGlsZSAoX3N0YXRlICE9IEVYSEFVU1RFRCkKLSAgICAgICAgewotICAgICAgICAgICAgX3N0YXRlKys7Ci0KLSAgICAgICAgICAgIHN3aXRjaCAoX3N0YXRlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgTENWIDoKLQotICAgICAgICAgICAgICAgICAgICBpZiAoVGFwZXN0cnkuaXNCbGFuayhfdmFyaWFudCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgICAgICAgICBjYXNlIExDIDoKLQotICAgICAgICAgICAgICAgICAgICBpZiAoVGFwZXN0cnkuaXNCbGFuayhfY291bnRyeSkpCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgICAgICAgICBjYXNlIExWIDoKLQotICAgICAgICAgICAgICAgICAgICAvLyBJZiBfY291bnRyeSBpcyBudWxsLCB0aGVuIHdlJ3ZlIGFscmVhZHkgZ2VuZXJhdGVkIHRoaXMgc3RyaW5nCi0gICAgICAgICAgICAgICAgICAgIC8vIGFzIHN0YXRlIExDViBhbmQgd2UgY2FuIGNvbnRpbnVlIGRpcmVjdGx5IHRvIHN0YXRlIEwKLQotICAgICAgICAgICAgICAgICAgICBpZiAoVGFwZXN0cnkuaXNCbGFuayhfdmFyaWFudCkgfHwgVGFwZXN0cnkuaXNCbGFuayhfY291bnRyeSkpCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgICAgICAgICBjYXNlIEwgOgotCi0gICAgICAgICAgICAgICAgICAgIGlmIChUYXBlc3RyeS5pc0JsYW5rKF9sYW5ndWFnZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgICAgICAgICBkZWZhdWx0IDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSBhcmUgbW9yZSBuYW1lIHZhcmlhbnRzIHRvIGJlCi0gICAgICogIHJldHVybmVkLCBmYWxzZSBvdGhlcndpc2UuCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIGJvb2xlYW4gbW9yZSgpCi0gICAgewotICAgICAgICByZXR1cm4gX3N0YXRlICE9IEVYSEFVU1RFRDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0aGUgbmV4dCBsb2NhbGl6ZWQgdmFyaWFudC4KLSAgICAgKiAKLSAgICAgKiAgQHRocm93cyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGlmIGFsbCB2YXJpYW50cyBoYXZlIGJlZW4KLSAgICAgKiAgcmV0dXJuZWQuCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIFN0cmluZyBuZXh0KCkKLSAgICB7Ci0gICAgICAgIGlmIChfc3RhdGUgPT0gRVhIQVVTVEVEKQotICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLQotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gYnVpbGQoKTsKLQotICAgICAgICBhZHZhbmNlKCk7Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBidWlsZCgpCi0gICAgewotICAgICAgICBfYnVmZmVyLnNldExlbmd0aChfYmFzZU5hbWVMZW5ndGgpOwotCi0gICAgICAgIGlmIChfc3RhdGUgPT0gTEMgfHwgX3N0YXRlID09IExDViB8fCBfc3RhdGUgPT0gTCkKLSAgICAgICAgewotICAgICAgICAgICAgX2J1ZmZlci5hcHBlbmQoJ18nKTsKLSAgICAgICAgICAgIF9idWZmZXIuYXBwZW5kKF9sYW5ndWFnZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBGb3IgTFYsIHdlIHdhbnQgdHdvIHVuZGVyc2NvcmVzIGJldHdlZW4gbGFuZ3VhZ2UKLSAgICAgICAgLy8gYW5kIHZhcmlhbnQuCi0KLSAgICAgICAgaWYgKF9zdGF0ZSA9PSBMQyB8fCBfc3RhdGUgPT0gTENWIHx8IF9zdGF0ZSA9PSBMVikKLSAgICAgICAgewotICAgICAgICAgICAgX2J1ZmZlci5hcHBlbmQoJ18nKTsKLQotICAgICAgICAgICAgaWYgKF9zdGF0ZSAhPSBMVikKLSAgICAgICAgICAgICAgICBfYnVmZmVyLmFwcGVuZChfY291bnRyeSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoX3N0YXRlID09IExWIHx8IF9zdGF0ZSA9PSBMQ1YpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9idWZmZXIuYXBwZW5kKCdfJyk7Ci0gICAgICAgICAgICBfYnVmZmVyLmFwcGVuZChfdmFyaWFudCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoX3N1ZmZpeCAhPSBudWxsKQotICAgICAgICAgICAgX2J1ZmZlci5hcHBlbmQoX3N1ZmZpeCk7Ci0KLSAgICAgICAgcmV0dXJuIF9idWZmZXIudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTG9jYWxlIGdldEN1cnJlbnRMb2NhbGUoKQotICAgIHsKLSAgICAgICAgc3dpdGNoIChfcHJldlN0YXRlKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIExDViA6Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IExvY2FsZShfbGFuZ3VhZ2UsIF9jb3VudHJ5LCBfdmFyaWFudCk7Ci0KLSAgICAgICAgICAgIGNhc2UgTEMgOgotCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBMb2NhbGUoX2xhbmd1YWdlLCBfY291bnRyeSwgIiIpOwotCi0gICAgICAgICAgICBjYXNlIExWIDoKLQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTG9jYWxlKF9sYW5ndWFnZSwgIiIsIF92YXJpYW50KTsKLQotICAgICAgICAgICAgY2FzZSBMIDoKLQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTG9jYWxlKF9sYW5ndWFnZSwgIiIsICIiKTsKLQotICAgICAgICAgICAgZGVmYXVsdCA6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdXRpbC9Mb2NhbGl6ZWRQcm9wZXJ0eVNvdXJjZS5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3V0aWwvTG9jYWxpemVkUHJvcGVydHlTb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNmNjRjNS4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdXRpbC9Mb2NhbGl6ZWRQcm9wZXJ0eVNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5lbmdpbmUuSVByb3BlcnR5U291cmNlOwotCi0vKioKLSAqICBBIFByb3BlcnR5U291cmNlIGV4dGVuZGluZyB0aGUgRGVsZWdhdGluZ1Byb3BlcnR5U291cmNlcyBhbmQgYWRkaW5nIHRoZSAKLSAqICBjYXBhYmlsaXR5IG9mIHNlYXJjaGluZyBmb3IgbG9jYWxpemVkIHZlcnNpb25zIG9mIHRoZSBkZXNpcmVkIHByb3BlcnR5LgotICogIFVzZWZ1bCB3aGVuIHBlb3BlcnRpZXMgcmVsYXRlZCB0byBsb2NhbGl6YXRpb24gYXJlIG5lZWRlZC4KLSAqIAotICogIEBhdXRob3IgbWluZGJyaWRnZQotICogIEB2ZXJzaW9uICRJZCQKLSAqICBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2NhbGl6ZWRQcm9wZXJ0eVNvdXJjZSBleHRlbmRzIERlbGVnYXRpbmdQcm9wZXJ0eVNvdXJjZQotewotICAgIHByaXZhdGUgTG9jYWxlIF9sb2NhbGU7Ci0gICAgCi0gICAgLyoqCi0gICAgICogIENyZWF0ZXMgYSBMb2NhbGl6ZWRQcm9wZXJ0eVNvdXJjZSB3aXRoIHRoZSBkZWZhdWx0IGxvY2FsZQotICAgICAqLwotICAgIHB1YmxpYyBMb2NhbGl6ZWRQcm9wZXJ0eVNvdXJjZSgpCi0gICAgewotICAgICAgICB0aGlzKExvY2FsZS5nZXREZWZhdWx0KCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBDcmVhdGVzIGEgTG9jYWxpemVkUHJvcGVydHlTb3VyY2Ugd2l0aCB0aGUgcHJvdmlkZWQgbG9jYWxlCi0gICAgICovCi0gICAgcHVibGljIExvY2FsaXplZFByb3BlcnR5U291cmNlKExvY2FsZSBsb2NhbGUpCi0gICAgewotICAgICAgICBzdXBlcigpOwotICAgICAgICBzZXRMb2NhbGUobG9jYWxlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgQ3JlYXRlcyBhIExvY2FsaXplZFByb3BlcnR5U291cmNlIHdpdGggdGhlIGRlZmF1bHQgbG9jYWxlIGFuZCB0aGUgcHJvdmlkZWQgZGVsZWdhdGUKLSAgICAgKi8KLSAgICBwdWJsaWMgTG9jYWxpemVkUHJvcGVydHlTb3VyY2UoSVByb3BlcnR5U291cmNlIGRlbGVnYXRlKQotICAgIHsKLSAgICAgICAgdGhpcyhMb2NhbGUuZ2V0RGVmYXVsdCgpLCBkZWxlZ2F0ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIENyZWF0ZXMgYSBMb2NhbGl6ZWRQcm9wZXJ0eVNvdXJjZSB3aXRoIHRoZSBwcm92aWRlZCBsb2NhbGUgYW5kIGRlbGVnYXRlCi0gICAgICovCi0gICAgcHVibGljIExvY2FsaXplZFByb3BlcnR5U291cmNlKExvY2FsZSBsb2NhbGUsIElQcm9wZXJ0eVNvdXJjZSBkZWxlZ2F0ZSkKLSAgICB7Ci0gICAgICAgIHN1cGVyKGRlbGVnYXRlKTsKLSAgICAgICAgc2V0TG9jYWxlKGxvY2FsZSk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBsb2NhbGUgY3VycmVudGx5IHVzZWQgCi0gICAgICovCi0gICAgcHVibGljIExvY2FsZSBnZXRMb2NhbGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9sb2NhbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGxvY2FsZSB0aGUgbG9jYWxlIGN1cnJlbnRseSB1c2VkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TG9jYWxlKExvY2FsZSBsb2NhbGUpCi0gICAgewotICAgICAgICBfbG9jYWxlID0gbG9jYWxlOwotICAgIH0KLQotICAgIAotICAgIC8qKgotICAgICAqICBFeGFtaW5lcyB0aGUgcHJvcGVydGllcyBsb2NhbGl6ZWQgdXNpbmcgdGhlIHByb3ZpZGVkIGxvY2FsZSBpbiB0aGUgb3JkZXIKLSAgICAgKiAgb2YgbW9yZSBzcGVjaWZpYyB0byBtb3JlIGdlbmVyYWwgYW5kIHJldHVybnMgdGhlIGZpcnN0IHRoYXQgaGFzIGEgdmFsdWUuIAotICAgICAqICBAc2VlIG9yZy5hcGFjaGUudGFwZXN0cnkudXRpbC5EZWxlZ2F0aW5nUHJvcGVydHlTb3VyY2UjZ2V0UHJvcGVydHlWYWx1ZShqYXZhLmxhbmcuU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHlWYWx1ZShTdHJpbmcgcHJvcGVydHlOYW1lKQotICAgIHsKLSAgICAgICAgTG9jYWxpemVkTmFtZUdlbmVyYXRvciBnZW5lcmF0b3IgPSBuZXcgTG9jYWxpemVkTmFtZUdlbmVyYXRvcihwcm9wZXJ0eU5hbWUsIGdldExvY2FsZSgpLCAiIik7Ci0KLSAgICAgICAgd2hpbGUgKGdlbmVyYXRvci5tb3JlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBjYW5kaWRhdGVOYW1lID0gZ2VuZXJhdG9yLm5leHQoKTsKLQotICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gc3VwZXIuZ2V0UHJvcGVydHlWYWx1ZShjYW5kaWRhdGVOYW1lKTsgCi0gICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS91dGlsL0xvY2FsaXplZFJlc291cmNlLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdXRpbC9Mb2NhbGl6ZWRSZXNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjNmMTBhLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS91dGlsL0xvY2FsaXplZFJlc291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotLyoqCi0gKiAgQ29udGFpbnMgdGhlIHBhdGggdG8gYSBsb2NhbGl6ZWQgcmVzb3VyY2UgYW5kIHRoZSBsb2NhbGUgZm9yIHdoaWNoIGl0IGhhcyBiZWVuIGxvY2FsaXplZC4KLSAqICBUaGlzIG9iamVjdCBpcyBpbW11dGFibGUuCi0gKiAKLSAqICBAYXV0aG9yIE1pbmRicmlkZ2UKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQHNpbmNlIDMuMAotICovCi1wdWJsaWMgY2xhc3MgTG9jYWxpemVkUmVzb3VyY2UKLXsKLSAgICBwcml2YXRlIFN0cmluZyBfcmVzb3VyY2VQYXRoOwotICAgIHByaXZhdGUgTG9jYWxlIF9yZXNvdXJjZUxvY2FsZTsKLQotCi0gICAgcHVibGljIExvY2FsaXplZFJlc291cmNlKFN0cmluZyByZXNvdXJjZVBhdGgsIExvY2FsZSByZXNvdXJjZUxvY2FsZSkKLSAgICB7Ci0gICAgICAgIF9yZXNvdXJjZVBhdGggPSByZXNvdXJjZVBhdGg7Ci0gICAgICAgIF9yZXNvdXJjZUxvY2FsZSA9IHJlc291cmNlTG9jYWxlOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBsb2NhbGUgZm9yIHdoaWNoIHRoaXMgcmVzb3VyY2UgaGFzIGJlZW4gbG9jYWxpemVkIG9yIG51bGwgaWYgaXQgaGFzIG5vdCBiZWVuIGxvY2FsaXplZCBhdCBhbGwKLSAgICAgKi8KLSAgICBwdWJsaWMgTG9jYWxlIGdldFJlc291cmNlTG9jYWxlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfcmVzb3VyY2VMb2NhbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgcGF0aCB0byB0aGUgbG9jYWxpemVkIHJlc291cmNlCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZVBhdGgoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9yZXNvdXJjZVBhdGg7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdXRpbC9Mb2NhbGl6ZWRSZXNvdXJjZUZpbmRlci5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3V0aWwvTG9jYWxpemVkUmVzb3VyY2VGaW5kZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUxY2UwMy4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdXRpbC9Mb2NhbGl6ZWRSZXNvdXJjZUZpbmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZXNvdXJjZVJlc29sdmVyOwotCi0vKioKLSAqICAKLSAqICBTZWFyY2hlcyBmb3IgYSBsb2NhbGl6YXRpb24gb2YgYQotICogIHBhcnRpY3VsYXIgcmVzb3VyY2UgaW4gdGhlIGNsYXNzcGF0aCAodXNpbmcKLSAqICBhIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZXNvdXJjZVJlc29sdmVyfS4gCi0gKiAKLSAqCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogIEB2ZXJzaW9uICRJZCQKLSAqICBAc2luY2UgMy4wCi0gKgotICoqLwotCi1wdWJsaWMgY2xhc3MgTG9jYWxpemVkUmVzb3VyY2VGaW5kZXIKLXsKLSAgICBwcml2YXRlIElSZXNvdXJjZVJlc29sdmVyIF9yZXNvbHZlcjsKLQotICAgIHB1YmxpYyBMb2NhbGl6ZWRSZXNvdXJjZUZpbmRlcihJUmVzb3VyY2VSZXNvbHZlciByZXNvbHZlcikKLSAgICB7Ci0gICAgICAgIF9yZXNvbHZlciA9IHJlc29sdmVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBSZXNvbHZlcyB0aGUgcmVzb3VyY2UsIHJldHVybmluZyBhIHBhdGggcmVwcmVzZW50aW5nCi0gICAgICogIHRoZSBjbG9zZXN0IG1hdGNoICh3aXRoIHJlc3BlY3QgdG8gdGhlIHByb3ZpZGVkIGxvY2FsZSkuCi0gICAgICogIFJldHVybnMgbnVsbCBpZiBubyBtYXRjaC4KLSAgICAgKiAKLSAgICAgKiAgPHA+VGhlIHByb3ZpZGVkIHBhdGggaXMgc3BsaXQgaW50byBhIGJhc2UgcGF0aAotICAgICAqICBhbmQgYSBzdWZmaXggKGF0IHRoZSBsYXN0IHBlcmlvZCBjaGFyYWN0ZXIpLiAgVGhlIGxvY2FsZQotICAgICAqICB3aWxsIHByb3ZpZGUgZGlmZmVyZW50IHN1ZmZpeGVzIHRvIHRoZSBiYXNlIHBhdGgKLSAgICAgKiAgYW5kIHRoZSBmaXJzdCBtYXRjaCBpcyByZXR1cm5lZC4KLSAgICAgKiAKLSAgICAgKiovCi0gICAgCi0gICAgcHVibGljIExvY2FsaXplZFJlc291cmNlIHJlc29sdmUoU3RyaW5nIHJlc291cmNlUGF0aCwgTG9jYWxlIGxvY2FsZSkKLSAgICB7Ci0gICAgICAgIGludCBkb3R4ID0gcmVzb3VyY2VQYXRoLmxhc3RJbmRleE9mKCcuJyk7Ci0gICAgICAgIFN0cmluZyBiYXNlUGF0aCA9IHJlc291cmNlUGF0aC5zdWJzdHJpbmcoMCwgZG90eCk7Ci0gICAgICAgIFN0cmluZyBzdWZmaXggPSByZXNvdXJjZVBhdGguc3Vic3RyaW5nKGRvdHgpOwotCi0gICAgICAgIExvY2FsaXplZE5hbWVHZW5lcmF0b3IgZ2VuZXJhdG9yID0gbmV3IExvY2FsaXplZE5hbWVHZW5lcmF0b3IoYmFzZVBhdGgsIGxvY2FsZSwgc3VmZml4KTsKLQotICAgICAgICB3aGlsZSAoZ2VuZXJhdG9yLm1vcmUoKSkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIGNhbmRpZGF0ZVBhdGggPSBnZW5lcmF0b3IubmV4dCgpOwotCi0gICAgICAgICAgICBpZiAoX3Jlc29sdmVyLmdldFJlc291cmNlKGNhbmRpZGF0ZVBhdGgpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBMb2NhbGl6ZWRSZXNvdXJjZShjYW5kaWRhdGVQYXRoLCBnZW5lcmF0b3IuZ2V0Q3VycmVudExvY2FsZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS91dGlsL011bHRpS2V5LmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdXRpbC9NdWx0aUtleS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjI0N2EwLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS91dGlsL011bHRpS2V5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzQgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uRXh0ZXJuYWxpemFibGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0OwotaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5UYXBlc3RyeTsKLQotLyoqCi0gKiAgQSBjb21wbGV4IGtleSB0aGF0IG1heSBiZSB1c2VkIGFzIGFuIGFsdGVybmF0aXZlIHRvIG5lc3RlZAotICogIHtAbGluayBqYXZhLnV0aWwuTWFwfXMuCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKgotICoqLwotCi1wdWJsaWMgY2xhc3MgTXVsdGlLZXkgaW1wbGVtZW50cyBFeHRlcm5hbGl6YWJsZQotewotICAgIC8qKgotICAgICAqICBAc2luY2UgMi4wLjQKLSAgICAgKiAKLSAgICAgKiovCi0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNDQ2NTQ0ODYwNzQxNTc4ODgwNkw7Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEhBU0hfQ09ERV9VTlNFVCA9IC0xOwotCi0gICAgcHJpdmF0ZSB0cmFuc2llbnQgaW50IGhhc2hDb2RlID0gSEFTSF9DT0RFX1VOU0VUOwotCi0gICAgcHJpdmF0ZSBPYmplY3RbXSBrZXlzOwotCi0gICAgLyoqCi0gICAgICogIFB1YmxpYyBuby1hcmd1bWVudHMgY29uc3RydWN0b3IgbmVlZGVkIHRvIGJlIGNvbXBhdGlibGUgd2l0aAotICAgICAqICB7QGxpbmsgRXh0ZXJuYWxpemFibGV9OyB0aGlzIGxlYXZlcyB0aGUgbmV3IE11bHRpS2V5IGluIGEKLSAgICAgKiAgbm9uLXVzYWJsZSBzdGF0ZSBhbmQgc2hvdWxkbid0IGJlIHVzZWQgYnkgdXNlciBjb2RlLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIE11bHRpS2V5KCkKLSAgICB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEJ1aWxkcyBhIDxjb2RlPk11bHRpS2V5PC9jb2RlPiBmcm9tIGFuIGFycmF5IG9mIGtleXMuICBJZiB0aGUgYXJyYXkgaXMgbm90Ci0gICAgICogIGNvcGllZCwgdGhlbiBpdCBtdXN0IG5vdCBiZSBtb2RpZmllZC4KLSAgICAgKiAKLSAgICAgKiAgQHBhcmFtIGtleXMgVGhlIGNvbXBvbmVudHMgb2YgdGhlIGtleS4KLSAgICAgKiAgQHBhcmFtIG1ha2VDb3B5IElmIHRydWUsIGEgY29weSBvZiB0aGUga2V5cyBpcyBjcmVhdGVkLiAgSWYgZmFsc2UsCi0gICAgICogIHRoZSBrZXlzIGFyZSBzaW1wbGUgcmV0YWluZWQgYnkgdGhlIDxjb2RlPk11bHRpS2V5PC9jb2RlPi4KLSAgICAgKgotICAgICAqICBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBrZXlzIGlzIG51bGwsIG9mIGlmIHRoZQotICAgICAqICBmaXJzdCBlbGVtZW50IG9mIGtleXMgaXMgbnVsbC4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBNdWx0aUtleShPYmplY3RbXSBrZXlzLCBib29sZWFuIG1ha2VDb3B5KQotICAgIHsKLSAgICAgICAgc3VwZXIoKTsKLQotICAgICAgICBpZiAoa2V5cyA9PSBudWxsIHx8IGtleXMubGVuZ3RoID09IDApCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFRhcGVzdHJ5LmdldE1lc3NhZ2UoIk11bHRpS2V5Lm51bGwta2V5cyIpKTsKLQotICAgICAgICBpZiAoa2V5c1swXSA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihUYXBlc3RyeS5nZXRNZXNzYWdlKCJNdWx0aUtleS5maXJzdC1lbGVtZW50LW1heS1ub3QtYmUtbnVsbCIpKTsKLQotICAgICAgICBpZiAobWFrZUNvcHkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMua2V5cyA9IG5ldyBPYmplY3Rba2V5cy5sZW5ndGhdOwotICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShrZXlzLCAwLCB0aGlzLmtleXMsIDAsIGtleXMubGVuZ3RoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICB0aGlzLmtleXMgPSBrZXlzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIHRydWUgaWY6Ci0gICAgICogIDx1bD4KLSAgICAgKiAgPGxpPlRoZSBvdGhlciBvYmplY3QgaXMgYSA8Y29kZT5NdWx0aUtleTwvY29kZT4KLSAgICAgKiAgPGxpPlRoZXkgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2Yga2V5IGVsZW1lbnRzCi0gICAgICogIDxsaT5FdmVyeSBlbGVtZW50IGlzIGFuIGV4YWN0IG1hdGNoIG9yIGlzIGVxdWFsCi0gICAgICogIDwvdWw+Ci0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG90aGVyKQotICAgIHsKLSAgICAgICAgaW50IGk7Ci0KLSAgICAgICAgaWYgKG90aGVyID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgaWYgKGtleXMgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oVGFwZXN0cnkuZ2V0TWVzc2FnZSgiTXVsdGlLZXkubm8ta2V5cyIpKTsKLQotICAgICAgICAvLyBXb3VsZCBhIGhhc2hDb2RlIGNoZWNrIGJlIHdvcnRod2hpbGUgaGVyZT8KLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgTXVsdGlLZXkgb3RoZXJNdWx0aSA9IChNdWx0aUtleSkgb3RoZXI7Ci0KLSAgICAgICAgICAgIGlmIChrZXlzLmxlbmd0aCAhPSBvdGhlck11bHRpLmtleXMubGVuZ3RoKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gT24gYW4gZXhhY3QgbWF0Y2gsIGNvbnRpbnVlLiAgVGhpcyBtZWFucyB0aGF0IG51bGwgbWF0Y2hlcwotICAgICAgICAgICAgICAgIC8vIG51bGwuCi0KLSAgICAgICAgICAgICAgICBpZiAoa2V5c1tpXSA9PSBvdGhlck11bHRpLmtleXNbaV0pCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICAgICAgLy8gSWYgZWl0aGVyIGlzIG51bGwsIGJ1dCBub3QgYm90aCwgdGhlbgotICAgICAgICAgICAgICAgIC8vIG5vdCBhIG1hdGNoLgotCi0gICAgICAgICAgICAgICAgaWYgKGtleXNbaV0gPT0gbnVsbCB8fCBvdGhlck11bHRpLmtleXNbaV0gPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgICAgICAgICAgaWYgKCFrZXlzW2ldLmVxdWFscyhvdGhlck11bHRpLmtleXNbaV0pKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gRXZlcnkga2V5IGVxdWFsLiAgQSBtYXRjaC4KLQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgdGhlIGhhc2ggY29kZSBvZiB0aGUgcmVjZWl2ZXIsIHdoaWNoIGlzIGNvbXB1dGVkIGZyb20gYWxsIHRoZQotICAgICAqICBub24tbnVsbCBrZXkgZWxlbWVudHMuICBUaGlzIHZhbHVlIGlzIGNvbXB1dGVkIG9uY2UgYW5kCi0gICAgICogIHRoZW4gY2FjaGVkLCBzbyBlbGVtZW50cyBzaG91bGQgbm90IGNoYW5nZSB0aGVpciBoYXNoIGNvZGVzIAotICAgICAqICBvbmNlIGNyZWF0ZWQgKG5vdGUgdGhhdCB0aGlzCi0gICAgICogIGlzIHRoZSBzYW1lIGNvbnN0cmFpbnQgdGhhdCB3b3VsZCBiZSB1c2VkIGlmIHRoZSBpbmRpdmlkdWFsIAotICAgICAqICBrZXkgZWxlbWVudHMgd2VyZQotICAgICAqICB0aGVtc2VsdmVzIHtAbGluayBqYXZhLnV0aWwuTWFwfSBrZXlzLgotICAgICAqIAotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpCi0gICAgewotICAgICAgICBpZiAoaGFzaENvZGUgPT0gSEFTSF9DT0RFX1VOU0VUKQotICAgICAgICB7Ci0gICAgICAgICAgICBoYXNoQ29kZSA9IGtleXNbMF0uaGFzaENvZGUoKTsKLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChrZXlzW2ldICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIGhhc2hDb2RlIF49IGtleXNbaV0uaGFzaENvZGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBoYXNoQ29kZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqICBJZGVudGlmaWVzIGFsbCB0aGUga2V5cyBzdG9yZWQgYnkgdGhpcyA8Y29kZT5NdWx0aUtleTwvY29kZT4uCi0gICAgKgotICAgICoqLwotCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gICAgewotICAgICAgICBTdHJpbmdCdWZmZXIgYnVmZmVyOwotICAgICAgICBpbnQgaTsKLQotICAgICAgICBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCJNdWx0aUtleVsiKTsKLQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGkgPiAwKQotICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIiwgIik7Ci0KLSAgICAgICAgICAgIGlmIChrZXlzW2ldID09IG51bGwpCi0gICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiPG51bGw+Iik7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChrZXlzW2ldKTsKLSAgICAgICAgfQotCi0gICAgICAgIGJ1ZmZlci5hcHBlbmQoJ10nKTsKLQotICAgICAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFdyaXRlcyBhIGNvdW50IG9mIHRoZSBrZXlzLCB0aGVuIHdyaXRlcyBlYWNoIGluZGl2aWR1YWwga2V5LgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgd3JpdGVFeHRlcm5hbChPYmplY3RPdXRwdXQgb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIG91dC53cml0ZUludChrZXlzLmxlbmd0aCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgb3V0LndyaXRlT2JqZWN0KGtleXNbaV0pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBSZWFkcyB0aGUgc3RhdGUgcHJldmlvdXNseSB3cml0dGVuIGJ5IHtAbGluayAjd3JpdGVFeHRlcm5hbChPYmplY3RPdXRwdXQpfS4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIHJlYWRFeHRlcm5hbChPYmplY3RJbnB1dCBpbikgdGhyb3dzIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpbnQgY291bnQ7Ci0KLSAgICAgICAgY291bnQgPSBpbi5yZWFkSW50KCk7Ci0gICAgICAgIGtleXMgPSBuZXcgT2JqZWN0W2NvdW50XTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCi0gICAgICAgICAgICBrZXlzW2ldID0gaW4ucmVhZE9iamVjdCgpOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdXRpbC9Qcm9wZXJ0eUhvbGRlclByb3BlcnR5U291cmNlLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdXRpbC9Qcm9wZXJ0eUhvbGRlclByb3BlcnR5U291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjMTA5M2YuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3V0aWwvUHJvcGVydHlIb2xkZXJQcm9wZXJ0eVNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkudXRpbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuZW5naW5lLklQcm9wZXJ0eVNvdXJjZTsKLQotLyoqCi0gKiAgSW1wbGVtZW50cyB0aGUge0BsaW5rIElQcm9wZXJ0eVNvdXJjZX0gaW50ZXJmYWNlCi0gKiAgZm9yIGluc3RhbmNlcyB0aGF0IGltcGxlbWVudCB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS51dGlsLklQcm9wZXJ0eUhvbGRlcn0uCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQHNpbmNlIDIuMwotICoKLSAqKi8KLQotcHVibGljIGNsYXNzIFByb3BlcnR5SG9sZGVyUHJvcGVydHlTb3VyY2UgaW1wbGVtZW50cyBJUHJvcGVydHlTb3VyY2UKLXsKLSAgICBwcml2YXRlIElQcm9wZXJ0eUhvbGRlciBfaG9sZGVyOwotICAgIAotICAgIHB1YmxpYyBQcm9wZXJ0eUhvbGRlclByb3BlcnR5U291cmNlKElQcm9wZXJ0eUhvbGRlciBob2xkZXIpCi0gICAgewotICAgICAgICBfaG9sZGVyID0gaG9sZGVyOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHlWYWx1ZShTdHJpbmcgcHJvcGVydHlOYW1lKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9ob2xkZXIuZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS91dGlsL1JlZ2V4cE1hdGNoZXIuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS91dGlsL1JlZ2V4cE1hdGNoZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTcxNmI5ZC4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdXRpbC9SZWdleHBNYXRjaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm9yby50ZXh0LnJlZ2V4Lk1hbGZvcm1lZFBhdHRlcm5FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5vcm8udGV4dC5yZWdleC5QYXR0ZXJuOwotaW1wb3J0IG9yZy5hcGFjaGUub3JvLnRleHQucmVnZXguUGF0dGVybkNvbXBpbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUub3JvLnRleHQucmVnZXguUGF0dGVybk1hdGNoZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5vcm8udGV4dC5yZWdleC5QZXJsNUNvbXBpbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUub3JvLnRleHQucmVnZXguUGVybDVNYXRjaGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uOwotCi0vKioKLSAqICBTdHJlYW1saW5lcyB0aGUgaW50ZXJmYWNlIHRvIE9STyBieSBpbXBsaWNpdGx5IGNvbnN0cnVjdGluZyB0aGUKLSAqICBuZWNlc3NhcnkgY29tcGlsZXJzIGFuZCBtYXRjaGVycywgYW5kIGJ5Ci0gKiAgY2FjaGluZyBjb21waWxlZCBwYXR0ZXJucy4KLSAqCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogIEB2ZXJzaW9uICRJZCQKLSAqICBAc2luY2UgMy4wCi0gKgotICoqLwotCi1wdWJsaWMgY2xhc3MgUmVnZXhwTWF0Y2hlcgotewotICAgIHByaXZhdGUgUGF0dGVybkNvbXBpbGVyIF9wYXR0ZXJuQ29tcGlsZXI7Ci0KLSAgICBwcml2YXRlIFBhdHRlcm5NYXRjaGVyIF9tYXRjaGVyOwotCi0gICAgcHJpdmF0ZSBNYXAgX2NvbXBpbGVkUGF0dGVybnMgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgcHJpdmF0ZSBNYXAgX2VzY2FwZWRQYXR0ZXJuU3RyaW5ncyA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICBwcm90ZWN0ZWQgUGF0dGVybiBjb21waWxlUGF0dGVybihTdHJpbmcgcGF0dGVybikKLSAgICB7Ci0gICAgICAgIGlmIChfcGF0dGVybkNvbXBpbGVyID09IG51bGwpCi0gICAgICAgICAgICBfcGF0dGVybkNvbXBpbGVyID0gbmV3IFBlcmw1Q29tcGlsZXIoKTsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIF9wYXR0ZXJuQ29tcGlsZXIuY29tcGlsZShwYXR0ZXJuLCBQZXJsNUNvbXBpbGVyLlNJTkdMRUxJTkVfTUFTSyk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKE1hbGZvcm1lZFBhdHRlcm5FeGNlcHRpb24gZXgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24oZXgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFBhdHRlcm4gZ2V0Q29tcGlsZWRQYXR0ZXJuKFN0cmluZyBwYXR0ZXJuKQotICAgIHsKLSAgICAgICAgUGF0dGVybiByZXN1bHQgPSAoUGF0dGVybikgX2NvbXBpbGVkUGF0dGVybnMuZ2V0KHBhdHRlcm4pOwotCi0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0ID0gY29tcGlsZVBhdHRlcm4ocGF0dGVybik7Ci0gICAgICAgICAgICBfY29tcGlsZWRQYXR0ZXJucy5wdXQocGF0dGVybiwgcmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIENsZWFycyBhbnkgcHJldmlvdXNseSBjb21waWxlZCBwYXR0ZXJucy4KLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCBjbGVhcigpCi0gICAgewotICAgICAgICBfY29tcGlsZWRQYXR0ZXJucy5jbGVhcigpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBQYXR0ZXJuTWF0Y2hlciBnZXRQYXR0ZXJuTWF0Y2hlcigpCi0gICAgewotICAgICAgICBpZiAoX21hdGNoZXIgPT0gbnVsbCkKLSAgICAgICAgICAgIF9tYXRjaGVyID0gbmV3IFBlcmw1TWF0Y2hlcigpOwotCi0gICAgICAgIHJldHVybiBfbWF0Y2hlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKFN0cmluZyBwYXR0ZXJuLCBTdHJpbmcgaW5wdXQpCi0gICAgewotICAgICAgICBQYXR0ZXJuIGNvbXBpbGVkUGF0dGVybiA9IGdldENvbXBpbGVkUGF0dGVybihwYXR0ZXJuKTsKLQotICAgICAgICByZXR1cm4gZ2V0UGF0dGVybk1hdGNoZXIoKS5tYXRjaGVzKGlucHV0LCBjb21waWxlZFBhdHRlcm4pOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKFN0cmluZyBwYXR0ZXJuLCBTdHJpbmcgaW5wdXQpCi0gICAgewotICAgICAgICBQYXR0ZXJuIGNvbXBpbGVkUGF0dGVybiA9IGdldENvbXBpbGVkUGF0dGVybihwYXR0ZXJuKTsKLQotICAgICAgICByZXR1cm4gZ2V0UGF0dGVybk1hdGNoZXIoKS5jb250YWlucyhpbnB1dCwgY29tcGlsZWRQYXR0ZXJuKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEVzY2FwZWRQYXR0ZXJuU3RyaW5nKFN0cmluZyBwYXR0ZXJuKQotICAgIHsKLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9IChTdHJpbmcpIF9lc2NhcGVkUGF0dGVyblN0cmluZ3MuZ2V0KHBhdHRlcm4pOwotCi0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0ID0gUGVybDVDb21waWxlci5xdW90ZW1ldGEocGF0dGVybik7Ci0KLSAgICAgICAgICAgIF9lc2NhcGVkUGF0dGVyblN0cmluZ3MucHV0KHBhdHRlcm4sIHJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3V0aWwvUmVzb3VyY2VCdW5kbGVQcm9wZXJ0eVNvdXJjZS5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3V0aWwvUmVzb3VyY2VCdW5kbGVQcm9wZXJ0eVNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOThiNjM3Li4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS91dGlsL1Jlc291cmNlQnVuZGxlUHJvcGVydHlTb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuZW5naW5lLklQcm9wZXJ0eVNvdXJjZTsKLQotLyoqCi0gKiAgQSBwcm9wZXJ0eSBzb3VyY2UgdGhhdCBpcyBiYXNlZCBvbiBhIHtAbGluayBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGV9LgotICoKLSAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiAgQHZlcnNpb24gJElkJAotICogIEBzaW5jZSAzLjAKLSAqCi0gKiovCi0KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZUJ1bmRsZVByb3BlcnR5U291cmNlIGltcGxlbWVudHMgSVByb3BlcnR5U291cmNlCi17Ci0gICAgcHJpdmF0ZSBSZXNvdXJjZUJ1bmRsZSBfYnVuZGxlOwotCi0gICAgcHVibGljIFJlc291cmNlQnVuZGxlUHJvcGVydHlTb3VyY2UoUmVzb3VyY2VCdW5kbGUgYnVuZGxlKQotICAgIHsKLSAgICAgICAgX2J1bmRsZSA9IGJ1bmRsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgR2V0cyB0aGUgdmFsdWUgZnJvbSB0aGUgYnVuZGxlIGJ5IGludm9raW5nCi0gICAgICogIHtAbGluayBSZXNvdXJjZUJ1bmRsZSNnZXRTdHJpbmcoamF2YS5sYW5nLlN0cmluZyl9LiAgSWYKLSAgICAgKiAgdGhlIGJ1bmRsZSBkb2VzIG5vdCBjb250YWluIHRoZSBrZXkgKHRoYXQgaXMsIGl0IGl0Ci0gICAgICogIHRocm93cyB7QGxpbmsgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbn0pLCB0aGVuCi0gICAgICogIG51bGwgaXMgcmV0dXJuZWQuCi0gICAgICogCi0gICAgICoqLwotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHlWYWx1ZShTdHJpbmcgcHJvcGVydHlOYW1lKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBfYnVuZGxlLmdldFN0cmluZyhwcm9wZXJ0eU5hbWUpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZXgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdXRpbC9TZXJ2bGV0Q29udGV4dFByb3BlcnR5U291cmNlLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdXRpbC9TZXJ2bGV0Q29udGV4dFByb3BlcnR5U291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjNmM3NjguLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3V0aWwvU2VydmxldENvbnRleHRQcm9wZXJ0eVNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkudXRpbDsKLQotLyoqCi0gKiAgSW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIElQcm9wZXJ0eVNvdXJjZX0KLSAqICB0aGF0IHJldHVybnMgdmFsdWVzIGRlZmluZWQgYXMgU2VydmxldENvbnRleHQgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVycwotICogIChkZWZpbmVkIGFzIDxjb2RlPiZsdDtpbml0LXBhcmFtJmd0OzwvY29kZT4gaW4gdGhlCi0gKiAgPGNvZGU+d2ViLnhtbDwvY29kZT4gZGVwbG95bWVudCBkZXNjcmlwdG9yLgotICoKLSAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiAgQHZlcnNpb24gJElkJAotICogIEBzaW5jZSAyLjMKLSAqCi0gKiovCi0KLWltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5lbmdpbmUuSVByb3BlcnR5U291cmNlOwotCi1wdWJsaWMgY2xhc3MgU2VydmxldENvbnRleHRQcm9wZXJ0eVNvdXJjZSBpbXBsZW1lbnRzIElQcm9wZXJ0eVNvdXJjZQotewotICAgIHByaXZhdGUgU2VydmxldENvbnRleHQgX2NvbnRleHQ7Ci0KLSAgICBwdWJsaWMgU2VydmxldENvbnRleHRQcm9wZXJ0eVNvdXJjZShTZXJ2bGV0Q29udGV4dCBjb250ZXh0KQotICAgIHsKLSAgICAgICAgX2NvbnRleHQgPSBjb250ZXh0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBJbnZva2VzIHtAbGluayBTZXJ2bGV0Q29udGV4dCNnZXRJbml0UGFyYW1ldGVyKGphdmEubGFuZy5TdHJpbmcpfS4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHlWYWx1ZShTdHJpbmcgcHJvcGVydHlOYW1lKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9jb250ZXh0LmdldEluaXRQYXJhbWV0ZXIocHJvcGVydHlOYW1lKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS91dGlsL1NlcnZsZXRQcm9wZXJ0eVNvdXJjZS5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3V0aWwvU2VydmxldFByb3BlcnR5U291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1ZGNhMjguLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3V0aWwvU2VydmxldFByb3BlcnR5U291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS51dGlsOwotCi1pbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29uZmlnOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5lbmdpbmUuSVByb3BlcnR5U291cmNlOwotCi0vKioKLSAqICBJbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgSVByb3BlcnR5U291cmNlfQotICogIHRoYXQgcmV0dXJucyB2YWx1ZXMgZGVmaW5lZCBhcyBTZXJ2bGV0IGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMKLSAqICAoZGVmaW5lZCBhcyA8Y29kZT4mbHQ7aW5pdC1wYXJhbSZndDs8L2NvZGU+IGluIHRoZQotICogIDxjb2RlPndlYi54bWw8L2NvZGU+IGRlcGxveW1lbnQgZGVzY3JpcHRvci4KLSAqCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogIEB2ZXJzaW9uICRJZCQKLSAqICBAc2luY2UgMi4zCi0gKgotICoqLyAKLQotcHVibGljIGNsYXNzIFNlcnZsZXRQcm9wZXJ0eVNvdXJjZSBpbXBsZW1lbnRzIElQcm9wZXJ0eVNvdXJjZQotewotICAgIHByaXZhdGUgU2VydmxldENvbmZpZyBfY29uZmlnOwotICAgIAotICAgIHB1YmxpYyBTZXJ2bGV0UHJvcGVydHlTb3VyY2UoU2VydmxldENvbmZpZyBjb25maWcpCi0gICAgewotICAgICAgICBfY29uZmlnID0gY29uZmlnOwotICAgIH0gICAKLSAgICAKLSAgICAvKioKLSAgICAgKiAgSW52b2tlcyB7QGxpbmsgU2VydmxldENvbmZpZyNnZXRJbml0UGFyYW1ldGVyKGphdmEubGFuZy5TdHJpbmcpfS4KLSAgICAgKiAKLSAgICAgKiovCi0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eVZhbHVlKFN0cmluZyBwcm9wZXJ0eU5hbWUpCi0gICAgewotICAgICAgICByZXR1cm4gX2NvbmZpZy5nZXRJbml0UGFyYW1ldGVyKHByb3BlcnR5TmFtZSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdXRpbC9TdHJpbmdTcGxpdHRlci5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3V0aWwvU3RyaW5nU3BsaXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2U3MjVhOC4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdXRpbC9TdHJpbmdTcGxpdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LnV0aWw7Ci0KLS8qKgotICogIFVzZWQgdG8gc3BsaXQgYSBzdHJpbmcgaW50byBzdWJzdHJpbmdzIGJhc2VkIG9uIGEgc2luZ2xlIGNoYXJhY3RlcgotICogIGRlbGltaXRlci4gIEEgZmFzdCwgc2ltcGxlIHZlcnNpb24gb2YKLSAqICB7QGxpbmsgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcn0uCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAKLSAqKi8KLQotcHVibGljIGNsYXNzIFN0cmluZ1NwbGl0dGVyCi17Ci0gICAgcHJpdmF0ZSBjaGFyIGRlbGltaXRlcjsKLQotICAgIHB1YmxpYyBTdHJpbmdTcGxpdHRlcihjaGFyIGRlbGltaXRlcikKLSAgICB7Ci0gICAgICAgIHRoaXMuZGVsaW1pdGVyID0gZGVsaW1pdGVyOwotICAgIH0KLQotICAgIHB1YmxpYyBjaGFyIGdldERlbGltaXRlcigpCi0gICAgewotICAgICAgICByZXR1cm4gZGVsaW1pdGVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBTcGxpdHMgYSBzdHJpbmcgb24gdGhlIGRlbGltdGVyIGludG8gYW4gYXJyYXkgb2YgU3RyaW5nCi0gICAgICogIHRva2Vucy4gIFRoZSBkZWxpbWl0ZXJzIGFyZSBub3QgaW5jbHVkZWQgaW4gdGhlIHRva2Vucy4gIE51bGwKLSAgICAgKiAgdG9rZW5zIChjYXVzZWQgYnkgdHdvIGNvbnNlY3V0aXZlIGRlbGltaXRlcikgYXJlIHJlZHVjZWQgdG8gYW4KLSAgICAgKiAgZW1wdHkgc3RyaW5nLiBMZWFkaW5nIGRlbGltaXRlcnMgYXJlIGlnbm9yZWQuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgU3RyaW5nW10gc3BsaXRUb0FycmF5KFN0cmluZyB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIGNoYXJbXSBidWZmZXI7Ci0gICAgICAgIGludCBpOwotICAgICAgICBTdHJpbmdbXSByZXN1bHQ7Ci0gICAgICAgIGludCByZXN1bHRDb3VudCA9IDA7Ci0gICAgICAgIGludCBzdGFydDsKLSAgICAgICAgaW50IGxlbmd0aDsKLSAgICAgICAgU3RyaW5nIHRva2VuOwotICAgICAgICBTdHJpbmdbXSBuZXdSZXN1bHQ7Ci0gICAgICAgIGJvb2xlYW4gZmlyc3QgPSB0cnVlOwotCi0gICAgICAgIGJ1ZmZlciA9IHZhbHVlLnRvQ2hhckFycmF5KCk7Ci0KLSAgICAgICAgcmVzdWx0ID0gbmV3IFN0cmluZ1szXTsKLQotICAgICAgICBzdGFydCA9IDA7Ci0gICAgICAgIGxlbmd0aCA9IDA7Ci0KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IGJ1ZmZlci5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGJ1ZmZlcltpXSAhPSBkZWxpbWl0ZXIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbGVuZ3RoKys7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFRoaXMgaXMgdXNlZCB0byBpZ25vcmUgbGVhZGluZyBkZWxpbWl0ZXIocykuCi0KLSAgICAgICAgICAgIGlmIChsZW5ndGggPiAwIHx8ICFmaXJzdCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0b2tlbiA9IG5ldyBTdHJpbmcoYnVmZmVyLCBzdGFydCwgbGVuZ3RoKTsKLQotICAgICAgICAgICAgICAgIGlmIChyZXN1bHRDb3VudCA9PSByZXN1bHQubGVuZ3RoKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbmV3UmVzdWx0ID0gbmV3IFN0cmluZ1tyZXN1bHQubGVuZ3RoICogMl07Ci0KLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShyZXN1bHQsIDAsIG5ld1Jlc3VsdCwgMCwgcmVzdWx0Lmxlbmd0aCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3UmVzdWx0OwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJlc3VsdFtyZXN1bHRDb3VudCsrXSA9IHRva2VuOwotCi0gICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3RhcnQgPSBpICsgMTsKLSAgICAgICAgICAgIGxlbmd0aCA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTcGVjaWFsIGNhc2U6ICBpZiB0aGUgc3RyaW5nIGNvbnRhaW5zIG5vIGRlbGltaXRlcnMKLSAgICAgICAgLy8gdGhlbiBpdCBpc24ndCByZWFsbHkgc3BsaXQuICBXcmFwIHRoZSBpbnB1dCBzdHJpbmcKLSAgICAgICAgLy8gaW4gYW4gYXJyYXkgYW5kIHJldHVybi4gIFRoaXMgaXMgYSBsaXR0bGUgb3B0aW1pemF0aW9uCi0gICAgICAgIC8vIHRvIHByZXZlbnQgYSBuZXcgU3RyaW5nIGluc3RhbmNlIGZyb20gYmVpbmcKLSAgICAgICAgLy8gY3JlYXRlZCB1bm5lY2Vzc2FyaWx5LgotCi0gICAgICAgIGlmIChzdGFydCA9PSAwICYmIGxlbmd0aCA9PSBidWZmZXIubGVuZ3RoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQgPSBuZXcgU3RyaW5nWzFdOwotICAgICAgICAgICAgcmVzdWx0WzBdID0gdmFsdWU7Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSWYgdGhlIHN0cmluZyBpcyBhbGwgZGVsaW1pdGVycywgdGhlbiB0aGlzCi0gICAgICAgIC8vIHdpbGwgcmVzdWx0IGluIGEgc2luZ2xlIGVtcHR5IHRva2VuLgotCi0gICAgICAgIHRva2VuID0gbmV3IFN0cmluZyhidWZmZXIsIHN0YXJ0LCBsZW5ndGgpOwotCi0gICAgICAgIG5ld1Jlc3VsdCA9IG5ldyBTdHJpbmdbcmVzdWx0Q291bnQgKyAxXTsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShyZXN1bHQsIDAsIG5ld1Jlc3VsdCwgMCwgcmVzdWx0Q291bnQpOwotICAgICAgICBuZXdSZXN1bHRbcmVzdWx0Q291bnRdID0gdG9rZW47Ci0KLSAgICAgICAgcmV0dXJuIG5ld1Jlc3VsdDsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3V0aWwvU3lzdGVtUHJvcGVydGllc1Byb3BlcnR5U291cmNlLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdXRpbC9TeXN0ZW1Qcm9wZXJ0aWVzUHJvcGVydHlTb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE1ZDI3MS4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdXRpbC9TeXN0ZW1Qcm9wZXJ0aWVzUHJvcGVydHlTb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LnV0aWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmVuZ2luZS5JUHJvcGVydHlTb3VyY2U7Ci0KLS8qKgotICogIE9idGFpbiBwcm9wZXJ0aWVzIGZyb20gSlZNIHN5c3RlbSBwcm9wZXJ0aWVzLgotICogCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQHNpbmNlIDIuMwotICoKLSAqKi8KLQotcHVibGljIGNsYXNzIFN5c3RlbVByb3BlcnRpZXNQcm9wZXJ0eVNvdXJjZSBpbXBsZW1lbnRzIElQcm9wZXJ0eVNvdXJjZQotewotICAgIHByaXZhdGUgc3RhdGljIElQcm9wZXJ0eVNvdXJjZSBfc2hhcmVkOwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIElQcm9wZXJ0eVNvdXJjZSBnZXRJbnN0YW5jZSgpCi0gICAgewotICAgICAgICBpZiAoX3NoYXJlZCA9PSBudWxsKQotICAgICAgICAgICAgX3NoYXJlZCA9IG5ldyBTeXN0ZW1Qcm9wZXJ0aWVzUHJvcGVydHlTb3VyY2UoKTsKLSAgICAgICAgICAgIAotICAgICAgICByZXR1cm4gX3NoYXJlZDsgCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogIERlbGVnYXRlcyB0byB7QGxpbmsgU3lzdGVtI2dldFByb3BlcnR5KGphdmEubGFuZy5TdHJpbmcpfS4KLSAgICAgKiAKLSAgICAgKiovCi0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eVZhbHVlKFN0cmluZyBwcm9wZXJ0eU5hbWUpCi0gICAgewotICAgICAgICByZXR1cm4gU3lzdGVtLmdldFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdXRpbC9leGNlcHRpb24vRXhjZXB0aW9uQW5hbHl6ZXIuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS91dGlsL2V4Y2VwdGlvbi9FeGNlcHRpb25BbmFseXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDU2ZGM1Li4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS91dGlsL2V4Y2VwdGlvbi9FeGNlcHRpb25BbmFseXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDM1ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LnV0aWwuZXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YS5iZWFucy5CZWFuSW5mbzsKLWltcG9ydCBqYXZhLmJlYW5zLkludHJvc3BlY3Rpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5iZWFucy5JbnRyb3NwZWN0b3I7Ci1pbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgamF2YS5pby5DaGFyQXJyYXlXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkxpbmVOdW1iZXJSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqICBBbmFseXplcyBhbiBleGNlcHRpb24sIGNyZWF0aW5nIG9uZSBvciBtb3JlIAotICogIHtAbGluayBFeGNlcHRpb25EZXNjcmlwdGlvbn1zCi0gKiAgZnJvbSBpdC4KLSAqCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogIEB2ZXJzaW9uICRJZCQKLSAqIAotICoqLwotCi1wdWJsaWMgY2xhc3MgRXhjZXB0aW9uQW5hbHl6ZXIKLXsKLSAgICBwcml2YXRlIExpc3QgZXhjZXB0aW9uRGVzY3JpcHRpb25zOwotICAgIHByaXZhdGUgTGlzdCBwcm9wZXJ0eURlc2NyaXB0aW9uczsKLSAgICBwcml2YXRlIENoYXJBcnJheVdyaXRlciB3cml0ZXI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTElTVF9TSVpFID0gMzsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBleGhhdXN0aXZlID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiAgSWYgdHJ1ZSwgdGhlbiBzdGFjayB0cmFjZSBpcyBleHRyYWN0ZWQgZm9yIGVhY2ggZXhjZXB0aW9uLiAgSWYgZmFsc2UsCi0gICAgICogIHRoZSBkZWZhdWx0LCB0aGVuIHN0YWNrIHRyYWNlIGlzIGV4dHJhY3RlZCBmb3Igb25seSB0aGUgZGVlcGVzdCBleGNlcHRpb24uCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0V4aGF1c3RpdmUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGV4aGF1c3RpdmU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RXhoYXVzdGl2ZShib29sZWFuIHZhbHVlKQotICAgIHsKLSAgICAgICAgZXhoYXVzdGl2ZSA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBBbmFseXplcyB0aGUgZXhjZXB0aW9ucy4gIFRoaXMgYnVpbGRzIGFuIHtAbGluayBFeGNlcHRpb25EZXNjcmlwdGlvbn0gZm9yIHRoZQotICAgICAqICBleGNlcHRpb24uICBJdCBhbHNvIGxvb2tzIGZvciBhIG5vbi1udWxsIHtAbGluayBUaHJvd2FibGV9Ci0gICAgICogIHByb3BlcnR5LiAgSWYgb25lIGV4aXN0cywgdGhlbiBhIHNlY29uZCB7QGxpbmsgRXhjZXB0aW9uRGVzY3JpcHRpb259IAotICAgICAqICBpcyBjcmVhdGVkLiAgVGhpcyBjb250aW51ZXMgdW50aWwgbm8gbW9yZSBuZXN0ZWQgZXhjZXB0aW9ucyBjYW4gYmUgZm91bmQuCi0gICAgICoKLSAgICAgKiAgPHA+VGhlIGRlc2NyaXB0aW9uIGluY2x1ZGVzIGEgc2V0IG9mIG5hbWUvdmFsdWUgcHJvcGVydGllcyAKLSAgICAgKiAgKGFzIHtAbGluayBFeGNlcHRpb25Qcm9wZXJ0eX0pIG9iamVjdC4gIFRoaXMgbGlzdCBjb250YWlucyBhbGwKLSAgICAgKiAgbm9uLW51bGwgcHJvcGVydGllcyB0aGF0IGFyZSBub3QsIHRoZW1zZWx2ZXMsIHtAbGluayBUaHJvd2FibGV9LgotICAgICAqCi0gICAgICogIDxwPlRoZSBuYW1lIGlzIHRoZSBkaXNwbGF5IG5hbWUgKG5vdCB0aGUgbG9naWNhbCBuYW1lKSBvZiB0aGUgcHJvcGVydHkuICBUaGUgdmFsdWUKLSAgICAgKiAgaXMgdGhlIDxjb2RlPnRvU3RyaW5nKCk8L2NvZGU+IHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqICBPbmx5IHByb3BlcnRpZXMgZGVmaW5lZCBpbiBzdWJjbGFzc2VzIG9mIHtAbGluayBUaHJvd2FibGV9IGFyZSBpbmNsdWRlZC4KLSAgICAgKgotICAgICAqICA8cD5BIGZ1dHVyZSBlbmhhbmNlbWVudCB3aWxsIGJlIHRvIGFscGhhYmV0aWNhbGx5IHNvcnQgdGhlIHByb3BlcnRpZXMgYnkgbmFtZS4KLSAgICAgKiovCi0KLSAgICBwdWJsaWMgRXhjZXB0aW9uRGVzY3JpcHRpb25bXSBhbmFseXplKFRocm93YWJsZSBleGNlcHRpb24pCi0gICAgewotICAgICAgICBFeGNlcHRpb25EZXNjcmlwdGlvbltdIHJlc3VsdDsKLQotICAgICAgICBpZiAod3JpdGVyID09IG51bGwpCi0gICAgICAgICAgICB3cml0ZXIgPSBuZXcgQ2hhckFycmF5V3JpdGVyKCk7Ci0KLSAgICAgICAgaWYgKHByb3BlcnR5RGVzY3JpcHRpb25zID09IG51bGwpCi0gICAgICAgICAgICBwcm9wZXJ0eURlc2NyaXB0aW9ucyA9IG5ldyBBcnJheUxpc3QoTElTVF9TSVpFKTsKLQotICAgICAgICBpZiAoZXhjZXB0aW9uRGVzY3JpcHRpb25zID09IG51bGwpCi0gICAgICAgICAgICBleGNlcHRpb25EZXNjcmlwdGlvbnMgPSBuZXcgQXJyYXlMaXN0KExJU1RfU0laRSk7Ci0KLSAgICAgICAgd2hpbGUgKGV4Y2VwdGlvbiAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBleGNlcHRpb24gPSBidWlsZERlc2NyaXB0aW9uKGV4Y2VwdGlvbik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXN1bHQgPSBuZXcgRXhjZXB0aW9uRGVzY3JpcHRpb25bZXhjZXB0aW9uRGVzY3JpcHRpb25zLnNpemUoKV07Ci0gICAgICAgIHJlc3VsdCA9IChFeGNlcHRpb25EZXNjcmlwdGlvbltdKSBleGNlcHRpb25EZXNjcmlwdGlvbnMudG9BcnJheShyZXN1bHQpOwotCi0gICAgICAgIGV4Y2VwdGlvbkRlc2NyaXB0aW9ucy5jbGVhcigpOwotICAgICAgICBwcm9wZXJ0eURlc2NyaXB0aW9ucy5jbGVhcigpOwotCi0gICAgICAgIHdyaXRlci5yZXNldCgpOwotCi0gICAgICAgIC8vIFdlIG5ldmVyIGFjdHVhbGx5IGNsb3NlKCkgdGhlIHdyaXRlciB3aGljaCBpcyBiYWQgLi4uIEknbSBleHBlY3RpbmcgdGhhdAotICAgICAgICAvLyB0aGUgZmluYWxpemUoKSBtZXRob2Qgd2lsbCBjbG9zZSB0aGVtLCBvciB0aGF0IHRoZXkgZG9uJ3QgbmVlZCB0bwotICAgICAgICAvLyBjbG9zZS4KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHByb3RlY3RlZCBUaHJvd2FibGUgYnVpbGREZXNjcmlwdGlvbihUaHJvd2FibGUgZXhjZXB0aW9uKQotICAgIHsKLSAgICAgICAgQmVhbkluZm8gaW5mbzsKLSAgICAgICAgQ2xhc3MgZXhjZXB0aW9uQ2xhc3M7Ci0gICAgICAgIEV4Y2VwdGlvblByb3BlcnR5IHByb3BlcnR5OwotICAgICAgICBQcm9wZXJ0eURlc2NyaXB0b3JbXSBkZXNjcmlwdG9yczsKLSAgICAgICAgUHJvcGVydHlEZXNjcmlwdG9yIGRlc2NyaXB0b3I7Ci0gICAgICAgIFRocm93YWJsZSBuZXh0ID0gbnVsbDsKLSAgICAgICAgaW50IGk7Ci0gICAgICAgIE9iamVjdCB2YWx1ZTsKLSAgICAgICAgTWV0aG9kIG1ldGhvZDsKLSAgICAgICAgRXhjZXB0aW9uUHJvcGVydHlbXSBwcm9wZXJ0aWVzOwotICAgICAgICBFeGNlcHRpb25EZXNjcmlwdGlvbiBkZXNjcmlwdGlvbjsKLSAgICAgICAgU3RyaW5nIHN0cmluZ1ZhbHVlOwotICAgICAgICBTdHJpbmcgbWVzc2FnZTsKLSAgICAgICAgU3RyaW5nW10gc3RhY2tUcmFjZSA9IG51bGw7Ci0KLSAgICAgICAgcHJvcGVydHlEZXNjcmlwdGlvbnMuY2xlYXIoKTsKLQotICAgICAgICBtZXNzYWdlID0gZXhjZXB0aW9uLmdldE1lc3NhZ2UoKTsKLSAgICAgICAgZXhjZXB0aW9uQ2xhc3MgPSBleGNlcHRpb24uZ2V0Q2xhc3MoKTsKLQotICAgICAgICAvLyBHZXQgcHJvcGVydGllcywgaWdub3JpbmcgdGhvc2UgaW4gVGhyb3dhYmxlIGFuZCBoaWdoZXIKLSAgICAgICAgLy8gKGluY2x1ZGluZyB0aGUgJ21lc3NhZ2UnIHByb3BlcnR5KS4KLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgaW5mbyA9IEludHJvc3BlY3Rvci5nZXRCZWFuSW5mbyhleGNlcHRpb25DbGFzcywgVGhyb3dhYmxlLmNsYXNzKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSW50cm9zcGVjdGlvbkV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIGRlc2NyaXB0b3JzID0gaW5mby5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKCk7Ci0KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IGRlc2NyaXB0b3JzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBkZXNjcmlwdG9yID0gZGVzY3JpcHRvcnNbaV07Ci0KLSAgICAgICAgICAgIG1ldGhvZCA9IGRlc2NyaXB0b3IuZ2V0UmVhZE1ldGhvZCgpOwotICAgICAgICAgICAgaWYgKG1ldGhvZCA9PSBudWxsKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IG1ldGhvZC5pbnZva2UoZXhjZXB0aW9uLCBudWxsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICAgIC8vIFNvbWUgYW5ub3lpbmcgZXhjZXB0aW9ucyBkdXBsaWNhdGUgdGhlIG1lc3NhZ2UgcHJvcGVydHkKLSAgICAgICAgICAgIC8vIChJJ20gdGFsa2luZyB0byBZT1UgU0FYUGFyc2VFeGNlcHRpb24pLCBzbyBqdXN0IGVkaXQgdGhhdCBvdXQuCi0KLSAgICAgICAgICAgIGlmIChtZXNzYWdlICE9IG51bGwgJiYgbWVzc2FnZS5lcXVhbHModmFsdWUpKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICAvLyBTa2lwIFRocm93YWJsZXMgLi4uIGJ1dCB0aGUgZmlyc3Qgbm9uLW51bGwKLSAgICAgICAgICAgIC8vIGZvdW5kIGlzIHRoZSBuZXh0IGV4Y2VwdGlvbi4gIFdlIGtpbmQgb2YgY291bnQKLSAgICAgICAgICAgIC8vIG9uIHRoZXJlIGJlaW5nIG5vIG1vcmUgdGhhbiBvbmUgVGhyb3dhYmxlCi0gICAgICAgICAgICAvLyBwcm9wZXJ0eSBwZXIgRXhjZXB0aW9uLgotCi0gICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBUaHJvd2FibGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKG5leHQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgbmV4dCA9IChUaHJvd2FibGUpIHZhbHVlOwotCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHN0cmluZ1ZhbHVlID0gdmFsdWUudG9TdHJpbmcoKS50cmltKCk7Ci0KLSAgICAgICAgICAgIGlmIChzdHJpbmdWYWx1ZS5sZW5ndGgoKSA9PSAwKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICBwcm9wZXJ0eSA9IG5ldyBFeGNlcHRpb25Qcm9wZXJ0eShkZXNjcmlwdG9yLmdldERpc3BsYXlOYW1lKCksIHZhbHVlLnRvU3RyaW5nKCkpOwotCi0gICAgICAgICAgICBwcm9wZXJ0eURlc2NyaXB0aW9ucy5hZGQocHJvcGVydHkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSWYgZXhoYXVzdGl2ZSwgb3IgaW4gdGhlIGRlZXBlc3QgZXhjZXB0aW9uICh3aGVyZSB0aGVyZSdzIG5vIG5leHQpCi0gICAgICAgIC8vIHRoZSBleHRyYWN0IHRoZSBzdGFjayB0cmFjZS4KLQotICAgICAgICBpZiAobmV4dCA9PSBudWxsIHx8IGV4aGF1c3RpdmUpCi0gICAgICAgICAgICBzdGFja1RyYWNlID0gZ2V0U3RhY2tUcmFjZShleGNlcHRpb24pOwotCi0gICAgICAgIC8vIFdvdWxkIGJlIG5pY2UgdG8gc29ydCB0aGUgcHJvcGVydGllcyBoZXJlLgotCi0gICAgICAgIHByb3BlcnRpZXMgPSBuZXcgRXhjZXB0aW9uUHJvcGVydHlbcHJvcGVydHlEZXNjcmlwdGlvbnMuc2l6ZSgpXTsKLQotICAgICAgICBFeGNlcHRpb25Qcm9wZXJ0eVtdIHByb3BBcnJheSA9Ci0gICAgICAgICAgICAoRXhjZXB0aW9uUHJvcGVydHlbXSkgcHJvcGVydHlEZXNjcmlwdGlvbnMudG9BcnJheShwcm9wZXJ0aWVzKTsKLQotICAgICAgICBkZXNjcmlwdGlvbiA9Ci0gICAgICAgICAgICBuZXcgRXhjZXB0aW9uRGVzY3JpcHRpb24oCi0gICAgICAgICAgICAgICAgZXhjZXB0aW9uQ2xhc3MuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgcHJvcEFycmF5LAotICAgICAgICAgICAgICAgIHN0YWNrVHJhY2UpOwotCi0gICAgICAgIGV4Y2VwdGlvbkRlc2NyaXB0aW9ucy5hZGQoZGVzY3JpcHRpb24pOwotCi0gICAgICAgIHJldHVybiBuZXh0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBHZXRzIHRoZSBzdGFjayB0cmFjZSBmb3IgdGhlIGV4Y2VwdGlvbiwgYW5kIGNvbnZlcnRzIGl0IGludG8gYW4gYXJyYXkgb2Ygc3RyaW5ncy4KLSAgICAgKgotICAgICAqICA8cD5UaGlzIGludm9sdmVzIHBhcnNpbmcgdGhlIAotICAgICAqICAgc3RyaW5nIGdlbmVyYXRlZCBpbmRpcmVjdGx5IGZyb20KLSAgICAgKiAgPGNvZGU+VGhyb3dhYmxlLnByaW50U3RhY2tUcmFjZShQcmludFdyaXRlcik8L2NvZGU+LiAgVGhpcyBtZXRob2QgY2FuIGdldCBjb25mdXNlZAotICAgICAqICBpZiB0aGUgbWVzc2FnZSAocHJlc3VtYWJseSwgdGhlIGZpcnN0IGxpbmUgZW1pdHRlZCBieSBwcmludFN0YWNrVHJhY2UoKSkKLSAgICAgKiAgc3BhbnMgbXVsdGlwbGUgbGluZXMuCi0gICAgICoKLSAgICAgKiAgPHA+RGlmZmVyZW50IEpWTXMgZm9ybWF0IHRoZSBleGNlcHRpb24gaW4gZGlmZmVyZW50IHdheXMuCi0gICAgICoKLSAgICAgKiAgPHA+QSBwb3NzaWJsZSBleHBhbnNpb24gd291bGQgYmUgbW9yZSBmbGV4aWJpbGl0eSBpbiBkZWZpbmluZyB0aGUgcGF0dGVybgotICAgICAqICB1c2VkLiAgSG9wZWZ1bGx5IGFsbCAnbWFpbnN0cmVhbScgSlZNcyBhcmUgY2xvc2UgZW5vdWdoIGZvciB0aGlzIHRvIGNvbnRpbnVlCi0gICAgICogIHdvcmtpbmcuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0U3RhY2tUcmFjZShUaHJvd2FibGUgZXhjZXB0aW9uKQotICAgIHsKLSAgICAgICAgd3JpdGVyLnJlc2V0KCk7Ci0KLSAgICAgICAgUHJpbnRXcml0ZXIgcHJpbnRXcml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIod3JpdGVyKTsKLQotICAgICAgICBleGNlcHRpb24ucHJpbnRTdGFja1RyYWNlKHByaW50V3JpdGVyKTsKLQotICAgICAgICBwcmludFdyaXRlci5jbG9zZSgpOwotCi0gICAgICAgIFN0cmluZyBmdWxsVHJhY2UgPSB3cml0ZXIudG9TdHJpbmcoKTsKLQotICAgICAgICB3cml0ZXIucmVzZXQoKTsKLQotICAgICAgICAvLyBPSywgdGhlIHRyaWNrIGlzIHRvIGNvbnZlcnQgdGhlIGZ1bGwgdHJhY2UgaW50byBhbiBhcnJheSBvZiBzdGFjayBmcmFtZXMuCi0KLSAgICAgICAgU3RyaW5nUmVhZGVyIHN0cmluZ1JlYWRlciA9IG5ldyBTdHJpbmdSZWFkZXIoZnVsbFRyYWNlKTsKLSAgICAgICAgTGluZU51bWJlclJlYWRlciBsaW5lUmVhZGVyID0gbmV3IExpbmVOdW1iZXJSZWFkZXIoc3RyaW5nUmVhZGVyKTsKLSAgICAgICAgaW50IGxpbmVOdW1iZXIgPSAwOwotICAgICAgICBMaXN0IGZyYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgd2hpbGUgKHRydWUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGxpbmUgPSBsaW5lUmVhZGVyLnJlYWRMaW5lKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAobGluZSA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIC8vIEFsd2F5cyBpZ25vcmUgdGhlIGZpcnN0IGxpbmUuCi0KLSAgICAgICAgICAgICAgICBpZiAoKytsaW5lTnVtYmVyID09IDEpCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICAgICAgZnJhbWVzLmFkZChzdHJpcEZyYW1lKGxpbmUpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbGluZVJlYWRlci5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBleCkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gTm90IGxpa2VseSB0byBoYXBwZW4gd2l0aCB0aGlzIHBhcnRpY3VsYXIgc2V0Ci0gICAgICAgICAgICAvLyBvZiByZWFkZXJzLgotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIHJlc3VsdFtdID0gbmV3IFN0cmluZ1tmcmFtZXMuc2l6ZSgpXTsKLQotICAgICAgICByZXR1cm4gKFN0cmluZ1tdKSBmcmFtZXMudG9BcnJheShyZXN1bHQpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTS0lQX0xFQURJTkdfV0hJVEVTUEFDRSA9IDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNLSVBfVCA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNLSVBfT1RIRVJfV0hJVEVTUEFDRSA9IDI7Ci0KLSAgICAvKioKLSAgICAgKiAgU3VuJ3MgSlZNIHByZWZpeGVzIGVhY2ggbGluZSBpbiB0aGUgc3RhY2sgdHJhY2UKLSAgICAgKiAgd2l0aCAiPHRhYj5hdCAiLCBvdGhlciBKVk1zIGRvbid0LiAgVGhpcyBtZXRob2QKLSAgICAgKiAgbG9va3MgZm9yIGFuZCBzdHJpcHMgc3VjaCBzdHVmZi4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHByaXZhdGUgU3RyaW5nIHN0cmlwRnJhbWUoU3RyaW5nIGZyYW1lKQotICAgIHsKLSAgICAgICAgY2hhciBhcnJheVtdID0gZnJhbWUudG9DaGFyQXJyYXkoKTsKLQotICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgIGludCBzdGF0ZSA9IFNLSVBfTEVBRElOR19XSElURVNQQUNFOwotICAgICAgICBib29sZWFuIG1vcmUgPSB0cnVlOwotCi0gICAgICAgIHdoaWxlIChtb3JlKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBSYW4gb3V0IG9mIGNoYXJhY3RlcnMgdG8gc2tpcD8gIFJldHVybiB0aGUgZW1wdHkgc3RyaW5nLgotCi0gICAgICAgICAgICBpZiAoaSA9PSBhcnJheS5sZW5ndGgpCi0gICAgICAgICAgICAgICAgcmV0dXJuICIiOwotCi0gICAgICAgICAgICBjaGFyIGNoID0gYXJyYXlbaV07Ci0KLSAgICAgICAgICAgIHN3aXRjaCAoc3RhdGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gSWdub3JlIHdoaXRlc3BhY2UgYXQgdGhlIHN0YXJ0IG9mIHRoZSBsaW5lLgotCi0gICAgICAgICAgICAgICAgY2FzZSBTS0lQX0xFQURJTkdfV0hJVEVTUEFDRSA6Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKENoYXJhY3Rlci5pc1doaXRlc3BhY2UoY2gpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnYScpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gU0tJUF9UOwotICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvLyBGb3VuZCBub24td2hpdGVzcGFjZSwgbm90ICdhJwotICAgICAgICAgICAgICAgICAgICBtb3JlID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIFNraXAgb3ZlciB0aGUgJ3QnIGFmdGVyIGFuICdhJwotCi0gICAgICAgICAgICAgICAgY2FzZSBTS0lQX1QgOgotCi0gICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSAndCcpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gU0tJUF9PVEhFUl9XSElURVNQQUNFOwotICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvLyBCYWNrIG91dCB0aGUgc2tpcHBlZC1vdmVyICdhJwotCi0gICAgICAgICAgICAgICAgICAgIGktLTsKLSAgICAgICAgICAgICAgICAgICAgbW9yZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIHdoaXRlc3BhY2UgYmV0d2VlbiAnYXQnIGFuZCB0aGUgbmFtZSBvZiB0aGUgY2xhc3MKLQotICAgICAgICAgICAgICAgIGNhc2UgU0tJUF9PVEhFUl9XSElURVNQQUNFIDoKLQotICAgICAgICAgICAgICAgICAgICBpZiAoQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShjaCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gTm90IHdoaXRlc3BhY2UKLSAgICAgICAgICAgICAgICAgICAgbW9yZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gRm91bmQgbm90aGluZyB0byBzdHJpcCBvdXQuCi0KLSAgICAgICAgaWYgKGkgPT0gMCkKLSAgICAgICAgICAgIHJldHVybiBmcmFtZTsKLQotICAgICAgICByZXR1cm4gZnJhbWUuc3Vic3RyaW5nKGkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBQcm9kdWNlcyBhIHRleHQgYmFzZWQgZXhjZXB0aW9uIHJlcG9ydCB0byB0aGUgcHJvdmlkZWQgc3RyZWFtLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgcmVwb3J0RXhjZXB0aW9uKFRocm93YWJsZSBleGNlcHRpb24sIFByaW50U3RyZWFtIHN0cmVhbSkKLSAgICB7Ci0gICAgICAgIGludCBpOwotICAgICAgICBpbnQgajsKLSAgICAgICAgRXhjZXB0aW9uRGVzY3JpcHRpb25bXSBkZXNjcmlwdGlvbnM7Ci0gICAgICAgIEV4Y2VwdGlvblByb3BlcnR5W10gcHJvcGVydGllczsKLSAgICAgICAgU3RyaW5nW10gc3RhY2tUcmFjZTsKLSAgICAgICAgU3RyaW5nIG1lc3NhZ2U7Ci0KLSAgICAgICAgZGVzY3JpcHRpb25zID0gYW5hbHl6ZShleGNlcHRpb24pOwotCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBkZXNjcmlwdGlvbnMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1lc3NhZ2UgPSBkZXNjcmlwdGlvbnNbaV0uZ2V0TWVzc2FnZSgpOwotCi0gICAgICAgICAgICBpZiAobWVzc2FnZSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHN0cmVhbS5wcmludGxuKGRlc2NyaXB0aW9uc1tpXS5nZXRFeGNlcHRpb25DbGFzc05hbWUoKSk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgc3RyZWFtLnByaW50bG4oCi0gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uc1tpXS5nZXRFeGNlcHRpb25DbGFzc05hbWUoKSArICI6ICIgKyBkZXNjcmlwdGlvbnNbaV0uZ2V0TWVzc2FnZSgpKTsKLQotICAgICAgICAgICAgcHJvcGVydGllcyA9IGRlc2NyaXB0aW9uc1tpXS5nZXRQcm9wZXJ0aWVzKCk7Ci0KLSAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaisrKQotICAgICAgICAgICAgICAgIHN0cmVhbS5wcmludGxuKAotICAgICAgICAgICAgICAgICAgICAiICAgIiArIHByb3BlcnRpZXNbal0uZ2V0TmFtZSgpICsgIjogIiArIHByb3BlcnRpZXNbal0uZ2V0VmFsdWUoKSk7Ci0KLSAgICAgICAgICAgIC8vIEp1c3Qgc2hvdyB0aGUgc3RhY2sgdHJhY2Ugb24gdGhlIGRlZXBlc3QgZXhjZXB0aW9uLgotCi0gICAgICAgICAgICBpZiAoaSArIDEgPT0gZGVzY3JpcHRpb25zLmxlbmd0aCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdGFja1RyYWNlID0gZGVzY3JpcHRpb25zW2ldLmdldFN0YWNrVHJhY2UoKTsKLQotICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBzdGFja1RyYWNlLmxlbmd0aDsgaisrKQotICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHJpbnRsbihzdGFja1RyYWNlW2pdKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBzdHJlYW0ucHJpbnRsbigpOwotICAgICAgICB9Ci0gICAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3V0aWwvZXhjZXB0aW9uL0V4Y2VwdGlvbkRlc2NyaXB0aW9uLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdXRpbC9leGNlcHRpb24vRXhjZXB0aW9uRGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM5ZjNiMy4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdXRpbC9leGNlcHRpb24vRXhjZXB0aW9uRGVzY3JpcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LnV0aWwuZXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci0KLS8qKgotICogIEEgZGVzY3JpcHRpb24gb2YgYW4gPGNvZGU+RXhjZXB0aW9uPC9jb2RlPi4gIFRoaXMgaXMgdXNlZnVsIHdoZW4gcHJlc2VudGluZyBhbgotICogIGV4Y2VwdGlvbiAoaW4gb3V0cHV0IG9yIG9uIGEgd2ViIHBhZ2UpLgotICoKLSAqICA8cD5XZSBjYXB0dXJlIGFsbCB0aGUgaW5mb3JtYXRpb24gYWJvdXQgYW4gZXhjZXB0aW9uIGFzCi0gKiAgU3RyaW5ncy4KLSAqCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogIEB2ZXJzaW9uICRJZCQKLSAqIAotICoqLwotCi1wdWJsaWMgY2xhc3MgRXhjZXB0aW9uRGVzY3JpcHRpb24gaW1wbGVtZW50cyBTZXJpYWxpemFibGUKLXsKLSAgICAvKioKLSAgICAgKiAgQHNpbmNlIDIuMC40Ci0gICAgICogCi0gICAgICoqLwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTQ4NzQ5MzA3ODQzNDA3ODE1MTRMOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZXhjZXB0aW9uQ2xhc3NOYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIG1lc3NhZ2U7Ci0gICAgcHJpdmF0ZSBFeGNlcHRpb25Qcm9wZXJ0eVtdIHByb3BlcnRpZXM7Ci0gICAgcHJpdmF0ZSBTdHJpbmdbXSBzdGFja1RyYWNlOwotCi0gICAgcHVibGljIEV4Y2VwdGlvbkRlc2NyaXB0aW9uKAotICAgICAgICBTdHJpbmcgZXhjZXB0aW9uQ2xhc3NOYW1lLAotICAgICAgICBTdHJpbmcgbWVzc2FnZSwKLSAgICAgICAgRXhjZXB0aW9uUHJvcGVydHlbXSBwcm9wZXJ0aWVzLAotICAgICAgICBTdHJpbmdbXSBzdGFja1RyYWNlKQotICAgIHsKLSAgICAgICAgdGhpcy5leGNlcHRpb25DbGFzc05hbWUgPSBleGNlcHRpb25DbGFzc05hbWU7Ci0gICAgICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7Ci0gICAgICAgIHRoaXMucHJvcGVydGllcyA9IHByb3BlcnRpZXM7Ci0gICAgICAgIHRoaXMuc3RhY2tUcmFjZSA9IHN0YWNrVHJhY2U7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRFeGNlcHRpb25DbGFzc05hbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGV4Y2VwdGlvbkNsYXNzTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1lc3NhZ2U7Ci0gICAgfQotCi0gICAgcHVibGljIEV4Y2VwdGlvblByb3BlcnR5W10gZ2V0UHJvcGVydGllcygpCi0gICAgewotICAgICAgICByZXR1cm4gcHJvcGVydGllczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0U3RhY2tUcmFjZSgpCi0gICAgewotICAgICAgICByZXR1cm4gc3RhY2tUcmFjZTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3V0aWwvZXhjZXB0aW9uL0V4Y2VwdGlvblByb3BlcnR5LmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdXRpbC9leGNlcHRpb24vRXhjZXB0aW9uUHJvcGVydHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JjYzQ4NC4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdXRpbC9leGNlcHRpb24vRXhjZXB0aW9uUHJvcGVydHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LnV0aWwuZXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci0KLS8qKgotICogIENhcHR1cmVzIGEgbmFtZS92YWx1ZSBwcm9wZXJ0eSBwYWlyIGZyb20gYW4gZXhjZXB0aW9uLiAgUGFydCBvZgotICogIGFuIHtAbGluayBFeGNlcHRpb25EZXNjcmlwdGlvbn0uCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAKLSAqKi8KLQotcHVibGljIGNsYXNzIEV4Y2VwdGlvblByb3BlcnR5IGltcGxlbWVudHMgU2VyaWFsaXphYmxlCi17Ci0gICAgLyoqCi0gICAgICogIEBzaW5jZSAyLjAuNAotICAgICAqIAotICAgICAqKi8KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNDU5ODMxMjM4MjQ2NzUwNTEzNEw7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLSAgICBwcml2YXRlIFN0cmluZyB2YWx1ZTsKLQotICAgIHB1YmxpYyBFeGNlcHRpb25Qcm9wZXJ0eShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKQotICAgIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3V0aWwvZXhjZXB0aW9uL3BhY2thZ2UuaHRtbCBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS91dGlsL2V4Y2VwdGlvbi9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0MGM0N2IuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3V0aWwvZXhjZXB0aW9uL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci08IS0tICRJZCQgLS0+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlRhcGVzdHJ5OiBXZWIgQXBwbGljYXRpb24gRnJhbWV3b3JrPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotCi08cD5BIGJhc2ljIGZyYW1ld29yayBmb3IgYW5hbHl6aW5nIGEgcmVwb3J0aW5nIGV4Y2VwdGlvbnMuICBUaGUgCi17QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS51dGlsLmV4Y2VwdGlvbi5FeGNlcHRpb25BbmFseXplcn0gY2xhc3Mgd2lsbCBpZGVudGlmeQotdGhlIHR5cGUsIG1lc3NhZ2UgYW5kIG90aGVyIHByb3BlcnRpZXMgb2YgYW4gZXhjZXB0aW9uLCBhbmQgdW5kZXJzdGFuZHMgYWJvdXQgbmVzdGVkCi1leGNlcHRpb25zLgotCi1AYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwIDxhIGhyZWY9Im1haWx0bzpobHNoaXBAYXBhY2hlLm9yZyI+aGxzaGlwQGFwYWNoZS5vcmc8L2E+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS91dGlsL2lvL0JpbmFyeUR1bXBPdXRwdXRTdHJlYW0uamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS91dGlsL2lvL0JpbmFyeUR1bXBPdXRwdXRTdHJlYW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZiZDVhNC4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdXRpbC9pby9CaW5hcnlEdW1wT3V0cHV0U3RyZWFtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDggKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkudXRpbC5pbzsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLQotLyoqCi0gKiAgQSBraW5kIG9mIHN1cGVyLWZvcm1hdHRlci4gIEl0IGlzIHNlbnQgYSBzdHJlYW0gb2YgYmluYXJ5IGRhdGEgYW5kCi0gKiAgZm9ybWF0cyBpdCBpbiBhIGh1bWFuLXJlYWRhYmxlIGR1bXAgZm9ybWF0IHdoaWNoIGlzIGZvcndhcmRlZCB0bwotICogIGl0cyBvdXRwdXQgc3RyZWFtLgotICoKLSAqIDxwPkN1cnJlbnRseSwgb3V0cHV0IGlzIGluIGhleCB0aG91Z2ggb3B0aW9ucyB0byBjaGFuZ2UgdGhhdCBtYXkKLSAqIGJlIGludHJvZHVjZWQuCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAKLSAqKi8KLQotcHVibGljIGNsYXNzIEJpbmFyeUR1bXBPdXRwdXRTdHJlYW0gZXh0ZW5kcyBPdXRwdXRTdHJlYW0KLXsKLSAgICBwcml2YXRlIFByaW50V3JpdGVyIG91dDsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBsb2NrZWQgPSBmYWxzZTsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBzaG93T2Zmc2V0ID0gdHJ1ZTsKLSAgICBwcml2YXRlIGludCBieXRlc1BlckxpbmUgPSAxNjsKLSAgICBwcml2YXRlIGludCBzcGFjaW5nSW50ZXJ2YWwgPSA0OwotICAgIHByaXZhdGUgY2hhciBzdWJzdGl0dXRlQ2hhciA9ICcuJzsKLSAgICBwcml2YXRlIFN0cmluZyBvZmZzZXRTZXBlcmF0b3IgPSAiOiAiOwotICAgIHByaXZhdGUgaW50IG9mZnNldCA9IDA7Ci0gICAgcHJpdmF0ZSBpbnQgbGluZUNvdW50ID0gMDsKLSAgICBwcml2YXRlIGludCBieXRlc1NpbmNlU3BhY2UgPSAwOwotICAgIHByaXZhdGUgY2hhcltdIGFzY2lpID0gbnVsbDsKLSAgICBwcml2YXRlIGJvb2xlYW4gc2hvd0FzY2lpID0gdHJ1ZTsKLSAgICBwcml2YXRlIFN0cmluZyBhc2NpaUJlZ2luID0gIiAgfCI7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgYXNjaWlFbmQgPSAifCI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gSEVYID0KLSAgICAgICAgewotICAgICAgICAgICAgJzAnLAotICAgICAgICAgICAgJzEnLAotICAgICAgICAgICAgJzInLAotICAgICAgICAgICAgJzMnLAotICAgICAgICAgICAgJzQnLAotICAgICAgICAgICAgJzUnLAotICAgICAgICAgICAgJzYnLAotICAgICAgICAgICAgJzcnLAotICAgICAgICAgICAgJzgnLAotICAgICAgICAgICAgJzknLAotICAgICAgICAgICAgJ2EnLAotICAgICAgICAgICAgJ2InLAotICAgICAgICAgICAgJ2MnLAotICAgICAgICAgICAgJ2QnLAotICAgICAgICAgICAgJ2UnLAotICAgICAgICAgICAgJ2YnIH07Ci0KLSAgICAvKioKLSAgICAgKiAgQ3JlYXRlcyBhIDxjb2RlPlByaW50V3JpdGVyPC9jb2RlPiBmb3IgPGNvZGU+U3lzdGVtLm91dDwvY29kZT4uCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgQmluYXJ5RHVtcE91dHB1dFN0cmVhbSgpCi0gICAgewotICAgICAgICB0aGlzKG5ldyBQcmludFdyaXRlcihTeXN0ZW0ub3V0LCB0cnVlKSk7Ci0gICAgfQotCi0gICAgcHVibGljIEJpbmFyeUR1bXBPdXRwdXRTdHJlYW0oUHJpbnRXcml0ZXIgb3V0KQotICAgIHsKLSAgICAgICAgdGhpcy5vdXQgPSBvdXQ7Ci0gICAgfQotCi0gICAgcHVibGljIEJpbmFyeUR1bXBPdXRwdXRTdHJlYW0oV3JpdGVyIG91dCkKLSAgICB7Ci0gICAgICAgIHRoaXMub3V0ID0gbmV3IFByaW50V3JpdGVyKG91dCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmIChvdXQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGxpbmVDb3VudCA+IDApCi0gICAgICAgICAgICAgICAgZmluaXNoRmluYWxMaW5lKCk7Ci0KLSAgICAgICAgICAgIG91dC5jbG9zZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgb3V0ID0gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZmluaXNoRmluYWxMaW5lKCkKLSAgICB7Ci0gICAgICAgIC8vIFNpbmNlIHdlIG9ubHkgZmluaXNoIHRoZSBmaW5hbCBsaW5lIGFmdGVyIGF0IGxlYXN0IG9uZSBieXRlIGhhcwotICAgICAgICAvLyBiZWVuIHdyaXR0ZW4gdG8gaXQsIHdlIGRvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQKLSAgICAgICAgLy8gdGhlIG9mZnNldC4KLQotICAgICAgICB3aGlsZSAobGluZUNvdW50IDwgYnl0ZXNQZXJMaW5lKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBBZnRlciBldmVyeSA8bj4gYnl0ZXMsIGVtaXQgYSBzcGFjZS4KLQotICAgICAgICAgICAgaWYgKHNwYWNpbmdJbnRlcnZhbCA+IDAgJiYgYnl0ZXNTaW5jZVNwYWNlID09IHNwYWNpbmdJbnRlcnZhbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBvdXQucHJpbnQoJyAnKTsKLSAgICAgICAgICAgICAgICBieXRlc1NpbmNlU3BhY2UgPSAwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBUd28gc3BhY2VzIHRvIHN1YnN0aXR1dGUgZm9yIHRoZSB0d28gaGV4IGRpZ2l0cy4KLQotICAgICAgICAgICAgb3V0LnByaW50KCIgICIpOwotCi0gICAgICAgICAgICBpZiAoc2hvd0FzY2lpKQotICAgICAgICAgICAgICAgIGFzY2lpW2xpbmVDb3VudF0gPSAnICc7Ci0KLSAgICAgICAgICAgIGxpbmVDb3VudCsrOwotICAgICAgICAgICAgYnl0ZXNTaW5jZVNwYWNlKys7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc2hvd0FzY2lpKQotICAgICAgICB7Ci0gICAgICAgICAgICBvdXQucHJpbnQoYXNjaWlCZWdpbik7Ci0gICAgICAgICAgICBvdXQucHJpbnQoYXNjaWkpOwotICAgICAgICAgICAgb3V0LnByaW50KGFzY2lpRW5kKTsKLSAgICAgICAgfQotCi0gICAgICAgIG91dC5wcmludGxuKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEZvcndhcmRzIHRoZSA8Y29kZT5mbHVzaCgpPC9jb2RlPiB0byB0aGUgPGNvZGU+UHJpbnRXcml0ZXI8L2NvZGU+LgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgZmx1c2goKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIG91dC5mbHVzaCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXNjaWlCZWdpbigpCi0gICAgewotICAgICAgICByZXR1cm4gYXNjaWlCZWdpbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEFzY2lpRW5kKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBhc2NpaUVuZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldEJ5dGVzUGVyTGluZSgpCi0gICAgewotICAgICAgICByZXR1cm4gYnl0ZXNQZXJMaW5lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0T2Zmc2V0U2VwZXJhdG9yKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBvZmZzZXRTZXBlcmF0b3I7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0U2hvd0FzY2lpKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBzaG93QXNjaWk7Ci0gICAgfQotCi0gICAgcHVibGljIGNoYXIgZ2V0U3Vic3RpdHV0ZUNoYXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHN1YnN0aXR1dGVDaGFyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEFzY2lpQmVnaW4oU3RyaW5nIHZhbHVlKQotICAgIHsKLSAgICAgICAgaWYgKGxvY2tlZCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQotICAgICAgICBhc2NpaUJlZ2luID0gdmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QXNjaWlFbmQoU3RyaW5nIHZhbHVlKQotICAgIHsKLSAgICAgICAgaWYgKGxvY2tlZCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQotICAgICAgICBhc2NpaUVuZCA9IHZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEJ5dGVzUGVyTGluZShpbnQgdmFsdWUpCi0gICAgewotICAgICAgICBpZiAobG9ja2VkKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCi0gICAgICAgIGJ5dGVzUGVyTGluZSA9IHZhbHVlOwotCi0gICAgICAgIGFzY2lpID0gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRPZmZzZXRTZXBlcmF0b3IoU3RyaW5nIHZhbHVlKQotICAgIHsKLSAgICAgICAgaWYgKGxvY2tlZCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQotICAgICAgICBvZmZzZXRTZXBlcmF0b3IgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTaG93QXNjaWkoYm9vbGVhbiB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIGlmIChsb2NrZWQpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0KLSAgICAgICAgc2hvd0FzY2lpID0gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFNldHMgdGhlIGNoYXJhY3RlciB1c2VkIGluIHRoZSBBU0NJSSBkdW1wIHRoYXQgc3Vic3RpdHV0ZXMgZm9yIGNoYXJhY3RlcnMKLSAgICAgKiAgb3V0c2lkZSB0aGUgcmFuZ2Ugb2YgMzIuLjEyNi4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIHNldFN1YnN0aXR1dGVDaGFyKGNoYXIgdmFsdWUpCi0gICAgewotICAgICAgICBpZiAobG9ja2VkKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCi0gICAgICAgIHN1YnN0aXR1dGVDaGFyID0gdmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGUoaW50IGIpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgY2hhciBsZXR0ZXI7Ci0KLSAgICAgICAgaWYgKHNob3dBc2NpaSAmJiBhc2NpaSA9PSBudWxsKQotICAgICAgICAgICAgYXNjaWkgPSBuZXcgY2hhcltieXRlc1BlckxpbmVdOwotCi0gICAgICAgIC8vIFByZXZlbnQgZnVydGhlciBjdXN0b21pemF0aW9uIGFmdGVyIG91dHB1dCBzdGFydHMgYmVpbmcgd3JpdHRlbi4KLQotICAgICAgICBsb2NrZWQgPSB0cnVlOwotCi0gICAgICAgIGlmIChsaW5lQ291bnQgPT0gYnl0ZXNQZXJMaW5lKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoc2hvd0FzY2lpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG91dC5wcmludChhc2NpaUJlZ2luKTsKLSAgICAgICAgICAgICAgICBvdXQucHJpbnQoYXNjaWkpOwotICAgICAgICAgICAgICAgIG91dC5wcmludChhc2NpaUVuZCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG91dC5wcmludGxuKCk7Ci0KLSAgICAgICAgICAgIGJ5dGVzU2luY2VTcGFjZSA9IDA7Ci0gICAgICAgICAgICBsaW5lQ291bnQgPSAwOwotICAgICAgICAgICAgb2Zmc2V0ICs9IGJ5dGVzUGVyTGluZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChsaW5lQ291bnQgPT0gMCAmJiBzaG93T2Zmc2V0KQotICAgICAgICB7Ci0gICAgICAgICAgICB3cml0ZUhleChvZmZzZXQsIDQpOwotICAgICAgICAgICAgb3V0LnByaW50KG9mZnNldFNlcGVyYXRvcik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBBZnRlciBldmVyeSA8bj4gYnl0ZXMsIGVtaXQgYSBzcGFjZS4KLQotICAgICAgICBpZiAoc3BhY2luZ0ludGVydmFsID4gMCAmJiBieXRlc1NpbmNlU3BhY2UgPT0gc3BhY2luZ0ludGVydmFsKQotICAgICAgICB7Ci0gICAgICAgICAgICBvdXQucHJpbnQoJyAnKTsKLSAgICAgICAgICAgIGJ5dGVzU2luY2VTcGFjZSA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICB3cml0ZUhleChiLCAyKTsKLQotICAgICAgICBpZiAoc2hvd0FzY2lpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoYiA8IDMyIHwgYiA+IDEyNykKLSAgICAgICAgICAgICAgICBsZXR0ZXIgPSBzdWJzdGl0dXRlQ2hhcjsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBsZXR0ZXIgPSAoY2hhcikgYjsKLQotICAgICAgICAgICAgYXNjaWlbbGluZUNvdW50XSA9IGxldHRlcjsKLSAgICAgICAgfQotCi0gICAgICAgIGxpbmVDb3VudCsrOwotICAgICAgICBieXRlc1NpbmNlU3BhY2UrKzsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgd3JpdGVIZXgoaW50IHZhbHVlLCBpbnQgZGlnaXRzKQotICAgIHsKLSAgICAgICAgaW50IGk7Ci0gICAgICAgIGludCBueWJibGU7Ci0KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IGRpZ2l0czsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBueWJibGUgPSAodmFsdWUgPj4gNCAqIChkaWdpdHMgLSBpIC0gMSkpICYgMHgwZjsKLQotICAgICAgICAgICAgb3V0LnByaW50KEhFWFtueWJibGVdKTsKLSAgICAgICAgfQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdXRpbC9pby9Cb29sZWFuQWRhcHRvci5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3V0aWwvaW8vQm9vbGVhbkFkYXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEzOTdmMS4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdXRpbC9pby9Cb29sZWFuQWRhcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkudXRpbC5pbzsKLQotLyoqCi0gKiAgU3F1ZWV6ZXMgYSB7QGxpbmsgQm9vbGVhbn0uCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKgotICoqLwotCi1jbGFzcyBCb29sZWFuQWRhcHRvciBpbXBsZW1lbnRzIElTcXVlZXplQWRhcHRvcgotewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVggPSAiVEYiOwotCi0gICAgLyoqCi0gICAgICogIFJlZ2lzdGVycyB1c2luZyB0aGUgcHJlZml4ZXMgJ1QnIGFuZCAnRicgKGZvciBUUlVFIGFuZCBGQUxTRSkuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCByZWdpc3RlcihEYXRhU3F1ZWV6ZXIgc3F1ZWV6ZXIpCi0gICAgewotICAgICAgICBzcXVlZXplci5yZWdpc3RlcihQUkVGSVgsIEJvb2xlYW4uY2xhc3MsIHRoaXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBTcXVlZXplcyB0aGUge0BsaW5rIEJvb2xlYW59IGRhdGEgdG8gZWl0aGVyICdUJyBvciAnRicuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgU3RyaW5nIHNxdWVlemUoRGF0YVNxdWVlemVyIHNxdWVlemVyLCBPYmplY3QgZGF0YSkKLSAgICB7Ci0gICAgICAgIEJvb2xlYW4gYm9vbCA9IChCb29sZWFuKSBkYXRhOwotCi0gICAgICAgIGlmIChib29sLmJvb2xlYW5WYWx1ZSgpKQotICAgICAgICAgICAgcmV0dXJuICJUIjsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuICJGIjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgVW5zcXVlZXplcyB0aGUgc3RyaW5nIHRvIGVpdGhlciB7QGxpbmsgQm9vbGVhbiNUUlVFfSBvciB7QGxpbmsgQm9vbGVhbiNGQUxTRX0sCi0gICAgICogIGRlcGVuZGluZyBvbiB0aGUgcHJlZml4IGNoYXJhY3Rlci4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBPYmplY3QgdW5zcXVlZXplKERhdGFTcXVlZXplciBzcXVlZXplciwgU3RyaW5nIHN0cmluZykKLSAgICB7Ci0gICAgICAgIGNoYXIgY2ggPSBzdHJpbmcuY2hhckF0KDApOwotCi0gICAgICAgIGlmIChjaCA9PSAnVCcpCi0gICAgICAgICAgICByZXR1cm4gQm9vbGVhbi5UUlVFOwotCi0gICAgICAgIHJldHVybiBCb29sZWFuLkZBTFNFOwotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS91dGlsL2lvL0J5dGVBZGFwdG9yLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdXRpbC9pby9CeXRlQWRhcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmNmNDY2Li4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS91dGlsL2lvL0J5dGVBZGFwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS51dGlsLmlvOwotCi0vKioKLSAqICBTcXVlZXplcyBhIHtAbGluayBCeXRlfS4gCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKgotICoqLwotCi1jbGFzcyBCeXRlQWRhcHRvciBpbXBsZW1lbnRzIElTcXVlZXplQWRhcHRvcgotewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVggPSAiYiI7Ci0KLSAgICAvKioKLSAgICAgKiAgUmVnaXN0ZXJzIHVzaW5nIHRoZSBwcmVmaXggJ2InLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgcmVnaXN0ZXIoRGF0YVNxdWVlemVyIHNxdWVlemVyKQotICAgIHsKLSAgICAgICAgc3F1ZWV6ZXIucmVnaXN0ZXIoUFJFRklYLCBCeXRlLmNsYXNzLCB0aGlzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgSW52b2tlZCA8Y29kZT50b1N0cmluZygpPC9jb2RlPiBvbiBkYXRhICh3aGljaCBpcyB0eXBlIHtAbGluayBCeXRlfSksCi0gICAgICogIGFuZCBwcmVmaXhzIHRoZSByZXN1bHQuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgU3RyaW5nIHNxdWVlemUoRGF0YVNxdWVlemVyIHNxdWVlemVyLCBPYmplY3QgZGF0YSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBQUkVGSVggKyBkYXRhLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIENvbnN0cnVjdHMgYW4ge0BsaW5rIEJ5dGV9IGZyb20gdGhlIHN0cmluZywgYWZ0ZXIgc3RyaXBwaW5nCi0gICAgICogIHRoZSBwcmVmaXguCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgT2JqZWN0IHVuc3F1ZWV6ZShEYXRhU3F1ZWV6ZXIgc3F1ZWV6ZXIsIFN0cmluZyBzdHJpbmcpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IEJ5dGUoc3RyaW5nLnN1YnN0cmluZygxKSk7Ci0gICAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3V0aWwvaW8vQ2hhcmFjdGVyQWRhcHRvci5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3V0aWwvaW8vQ2hhcmFjdGVyQWRhcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzAzYTBmLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS91dGlsL2lvL0NoYXJhY3RlckFkYXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LnV0aWwuaW87Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi0vKioKLSAqICBTcXVlZXplcyBhIENoYXJhY3Rlci4KLSAqIAotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQHNpbmNlIDIuMgotICogCi0gKiovCi0KLXB1YmxpYyBjbGFzcyBDaGFyYWN0ZXJBZGFwdG9yIGltcGxlbWVudHMgSVNxdWVlemVBZGFwdG9yCi17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWCA9ICJjIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIFBSRUZJWF9DSCA9ICdjJzsKLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIHNxdWVlemUoRGF0YVNxdWVlemVyIHNxdWVlemVyLCBPYmplY3QgZGF0YSkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBDaGFyYWN0ZXIgY2hhckRhdGEgPSAoQ2hhcmFjdGVyKWRhdGE7Ci0gICAgICAgIGNoYXIgdmFsdWUgPSBjaGFyRGF0YS5jaGFyVmFsdWUoKTsKLSAgICAgICAgCi0gICAgICAgIGNoYXJbXSBidWZmZXIgPSBuZXcgY2hhcltdCi0gICAgICAgIHsKLSAgICAgICAgICAgIFBSRUZJWF9DSCwgdmFsdWUKLSAgICAgICAgfTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBuZXcgU3RyaW5nKGJ1ZmZlcik7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCB1bnNxdWVlemUoRGF0YVNxdWVlemVyIHNxdWVlemVyLCBTdHJpbmcgc3RyaW5nKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgQ2hhcmFjdGVyKHN0cmluZy5jaGFyQXQoMSkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyKERhdGFTcXVlZXplciBzcXVlZXplcikKLSAgICB7Ci0gICAgICAgIHNxdWVlemVyLnJlZ2lzdGVyKFBSRUZJWCwgQ2hhcmFjdGVyLmNsYXNzLCB0aGlzKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS91dGlsL2lvL0NvbXBvbmVudEFkZHJlc3NBZGFwdG9yLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdXRpbC9pby9Db21wb25lbnRBZGRyZXNzQWRhcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjBhYzUyLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS91dGlsL2lvL0NvbXBvbmVudEFkZHJlc3NBZGFwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS51dGlsLmlvOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuVGFwZXN0cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS51dGlsLkNvbXBvbmVudEFkZHJlc3M7Ci0KLS8qKgotICogIFNxdWVlemVzIGEgb3JnLmFwYWNoZS50YXBlc3RyeS5Db21wb25lbnRBZGRyZXNzLgotICogCi0gKiAgQGF1dGhvciBtaW5kYnJpZGdlCi0gKiAgQHZlcnNpb24gJElkJAotICogIEBzaW5jZSAyLjIKLSAqIAotICoqLwotCi1wdWJsaWMgY2xhc3MgQ29tcG9uZW50QWRkcmVzc0FkYXB0b3IgaW1wbGVtZW50cyBJU3F1ZWV6ZUFkYXB0b3IKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYID0gIkEiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgU0VQQVJBVE9SID0gJy8nOwotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgc3F1ZWV6ZShEYXRhU3F1ZWV6ZXIgc3F1ZWV6ZXIsIE9iamVjdCBkYXRhKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIENvbXBvbmVudEFkZHJlc3MgYWRkcmVzcyA9IChDb21wb25lbnRBZGRyZXNzKSBkYXRhOwotCi0gICAgICAgIC8vIGEgJ251bGwnIGlkIHBhdGggaXMgZW5jb2RlZCBhcyBhbiBlbXB0eSBzdHJpbmcKLSAgICAgICAgU3RyaW5nIGlkUGF0aCA9IGFkZHJlc3MuZ2V0SWRQYXRoKCk7Ci0gICAgICAgIGlmIChpZFBhdGggPT0gbnVsbCkKLSAgICAgICAgCWlkUGF0aCA9ICIiOwotCi0gICAgICAgIHJldHVybiBQUkVGSVggKyBhZGRyZXNzLmdldFBhZ2VOYW1lKCkgKyBTRVBBUkFUT1IgKyBpZFBhdGg7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCB1bnNxdWVlemUoRGF0YVNxdWVlemVyIHNxdWVlemVyLCBTdHJpbmcgc3RyaW5nKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGludCBzZXBhcmF0b3IgPSBzdHJpbmcuaW5kZXhPZihTRVBBUkFUT1IpOwotICAgICAgICBpZiAoc2VwYXJhdG9yIDwgMCkgCi0gICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oVGFwZXN0cnkuZ2V0TWVzc2FnZSgiQ29tcG9uZW50QWRkcmVzc0FkYXB0b3Iubm8tc2VwYXJhdG9yIikpOwotCi0gICAgICAgIFN0cmluZyBwYWdlTmFtZSA9IHN0cmluZy5zdWJzdHJpbmcoMSwgc2VwYXJhdG9yKTsKLSAgICAgICAgU3RyaW5nIGlkUGF0aCA9IHN0cmluZy5zdWJzdHJpbmcoc2VwYXJhdG9yICsgMSk7Ci0gICAgICAgIGlmIChpZFBhdGguZXF1YWxzKCIiKSkKLSAgICAgICAgCWlkUGF0aCA9IG51bGw7Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBDb21wb25lbnRBZGRyZXNzKHBhZ2VOYW1lLCBpZFBhdGgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyKERhdGFTcXVlZXplciBzcXVlZXplcikKLSAgICB7Ci0gICAgICAgIHNxdWVlemVyLnJlZ2lzdGVyKFBSRUZJWCwgQ29tcG9uZW50QWRkcmVzcy5jbGFzcywgdGhpcyk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdXRpbC9pby9EYXRhU3F1ZWV6ZXIuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS91dGlsL2lvL0RhdGFTcXVlZXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYmFiMTRiLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS91dGlsL2lvL0RhdGFTcXVlZXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk5ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LnV0aWwuaW87Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVzb3VyY2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LlRhcGVzdHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkudXRpbC5BZGFwdG9yUmVnaXN0cnk7Ci0KLS8qKgotICogIEEgY2xhc3MgdXNlZCB0byBjb252ZXJ0IGFyYml0cmFyeSBvYmplY3RzIHRvIFN0cmluZ3MgYW5kIGJhY2suCi0gKiAgVGhpcyBoYXMgcGFydGljdWxhciB1c2VzIGludm9sdmluZyBIVFRQIFVSTHMgYW5kIENvb2tpZXMuCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKgotICoqLwotCi1wdWJsaWMgY2xhc3MgRGF0YVNxdWVlemVyCi17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5VTExfUFJFRklYID0gIlgiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgTlVMTF9QUkVGSVhfQ0ggPSAnWCc7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQVJSQVlfU0laRSA9IDkwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGSVJTVF9BREFQVE9SX09GRlNFVCA9IDMzOwotCi0gICAgLyoqCi0gICAgICogIEFuIGFycmF5IG9mIGFkYXB0b3JzOyB0aGlzIGlzIHVzZWQgYXMgYSBjaGVhcCBsb29rdXAtdGFibGUgd2hlbiB1bnNxdWVlemluZy4gIAotICAgICAqICBFYWNoIGFkYXB0b3IgaXMgaWRlbnRpZmllZCBieSBhIHNpbmdsZSBBU0NJSSBjaGFyYWN0ZXIsIGluIHRoZSByYW5nZSBvZgotICAgICAqICAzMyAoJyEnKSB0byAxMjIgKHRoZSBsZXR0ZXIgJ3onKS4gIFRoZSBvZmZzZXQgaW50byB0aGlzIHRhYmxlCi0gICAgICogIGlzIHRoZSBjaGFyYWN0ZXIgbWludXMgMzMuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwcml2YXRlIElTcXVlZXplQWRhcHRvcltdIF9hZGFwdG9yQnlQcmVmaXggPSBuZXcgSVNxdWVlemVBZGFwdG9yW0FSUkFZX1NJWkVdOwotCi0gICAgLyoqCi0gICAgICogIEFkYXB0b3JSZWdpc3RyeSBjYWNoZSBvZiBhZGFwdG9ycy4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHByaXZhdGUgQWRhcHRvclJlZ2lzdHJ5IF9hZGFwdG9ycyA9IG5ldyBBZGFwdG9yUmVnaXN0cnkoKTsKLQotICAgIC8qKgotICAgICAqICBSZXNvdXJjZSByZXNvbHZlciB1c2VkIHRvIGRlc2VyaWFsaXplIGNsYXNzZXMuCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHJpdmF0ZSBJUmVzb3VyY2VSZXNvbHZlciBfcmVzb2x2ZXI7Ci0KLSAgICAvKioKLSAgICAgKiAgQ3JlYXRlcyBhIG5ldyBzcXVlZXplciB3aXRoIHRoZSBkZWZhdWx0IHNldCBvZiBhZGFwdG9ycy4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBEYXRhU3F1ZWV6ZXIoSVJlc291cmNlUmVzb2x2ZXIgcmVzb2x2ZXIpCi0gICAgewotICAgICAgICB0aGlzKHJlc29sdmVyLCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgQ3JlYXRlcyBhIG5ldyBkYXRhIHNxdWVlemVyLCB3aGljaCB3aWxsIGhhdmUgdGhlIGRlZmF1bHQgc2V0IG9mCi0gICAgICogIGFkYXB0b3JzLCBhbmQgbWF5IGFkZCBhZGRpdGlvbmFsIGFkYXB0b3JzLgotICAgICAqCi0gICAgICogIEBwYXJhbSBhZGFwdG9ycyBhbiBvcHRpb25hbCBsaXN0IG9mIGFkYXB0b3JzIHRoYXQgd2lsbCBiZSByZWdpc3RlcmVkIHRvCi0gICAgICogIHRoZSBkYXRhIHNxdWVlemVyIChpdCBtYXkgYmUgbnVsbCBvciBlbXB0eSkKLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBEYXRhU3F1ZWV6ZXIoSVJlc291cmNlUmVzb2x2ZXIgcmVzb2x2ZXIsIElTcXVlZXplQWRhcHRvcltdIGFkYXB0b3JzKQotICAgIHsKLSAgICAgICAgX3Jlc29sdmVyID0gcmVzb2x2ZXI7Ci0KLSAgICAgICAgcmVnaXN0ZXJEZWZhdWx0QWRhcHRvcnMoKTsKLQotICAgICAgICBpZiAoYWRhcHRvcnMgIT0gbnVsbCkKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWRhcHRvcnMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgYWRhcHRvcnNbaV0ucmVnaXN0ZXIodGhpcyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHJlZ2lzdGVyRGVmYXVsdEFkYXB0b3JzKCkKLSAgICB7Ci0gICAgICAgIG5ldyBDaGFyYWN0ZXJBZGFwdG9yKCkucmVnaXN0ZXIodGhpcyk7Ci0gICAgICAgIG5ldyBTdHJpbmdBZGFwdG9yKCkucmVnaXN0ZXIodGhpcyk7Ci0gICAgICAgIG5ldyBJbnRlZ2VyQWRhcHRvcigpLnJlZ2lzdGVyKHRoaXMpOwotICAgICAgICBuZXcgRG91YmxlQWRhcHRvcigpLnJlZ2lzdGVyKHRoaXMpOwotICAgICAgICBuZXcgQnl0ZUFkYXB0b3IoKS5yZWdpc3Rlcih0aGlzKTsKLSAgICAgICAgbmV3IEZsb2F0QWRhcHRvcigpLnJlZ2lzdGVyKHRoaXMpOwotICAgICAgICBuZXcgTG9uZ0FkYXB0b3IoKS5yZWdpc3Rlcih0aGlzKTsKLSAgICAgICAgbmV3IFNob3J0QWRhcHRvcigpLnJlZ2lzdGVyKHRoaXMpOwotICAgICAgICBuZXcgQm9vbGVhbkFkYXB0b3IoKS5yZWdpc3Rlcih0aGlzKTsKLSAgICAgICAgbmV3IFNlcmlhbGl6YWJsZUFkYXB0b3IoKS5yZWdpc3Rlcih0aGlzKTsKLSAgICAgICAgbmV3IENvbXBvbmVudEFkZHJlc3NBZGFwdG9yKCkucmVnaXN0ZXIodGhpcyk7Ci0gICAgICAgIG5ldyBFbnVtQWRhcHRvcigpLnJlZ2lzdGVyKHRoaXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBSZWdpc3RlcnMgdGhlIGFkYXB0b3Igd2l0aCBvbmUgb3IgbW9yZSBzaW5nbGUtY2hhcmFjdGVyIHByZWZpeGVzLgotICAgICAqCi0gICAgICogIEBwYXJhbSBwcmVmaXggb25lIG9yIG1vcmUgY2hhcmFjdGVycywgZWFjaCBvZiB3aGljaCB3aWxsIGJlIGEgcHJlZml4IGZvcgotICAgICAqICB0aGUgYWRhcHRvci4KLSAgICAgKiAgQHBhcmFtIGRhdGFDbGFzcyB0aGUgY2xhc3MgKG9yIGludGVyZmFjZSkgd2hpY2ggY2FuIGJlIGVuY29kZWQgYnkgdGhlIGFkYXB0b3IuCi0gICAgICogIEBwYXJhbSBhZGFwdG9yIHRoZSBhZGFwdG9yIHdoaWNoIHRvIGJlIHJlZ2lzdGVyZWQuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVnaXN0ZXIoU3RyaW5nIHByZWZpeCwgQ2xhc3MgZGF0YUNsYXNzLCBJU3F1ZWV6ZUFkYXB0b3IgYWRhcHRvcikKLSAgICB7Ci0gICAgICAgIGludCBwcmVmaXhMZW5ndGggPSBwcmVmaXgubGVuZ3RoKCk7Ci0gICAgICAgIGludCBvZmZzZXQ7Ci0KLSAgICAgICAgaWYgKHByZWZpeExlbmd0aCA8IDEpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFRhcGVzdHJ5LmdldE1lc3NhZ2UoIkRhdGFTcXVlZXplci5zaG9ydC1wcmVmaXgiKSk7Ci0KLSAgICAgICAgaWYgKGRhdGFDbGFzcyA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihUYXBlc3RyeS5nZXRNZXNzYWdlKCJEYXRhU3F1ZWV6ZXIubnVsbC1jbGFzcyIpKTsKLQotICAgICAgICBpZiAoYWRhcHRvciA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihUYXBlc3RyeS5nZXRNZXNzYWdlKCJEYXRhU3F1ZWV6ZXIubnVsbC1hZGFwdG9yIikpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJlZml4TGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoYXIgY2ggPSBwcmVmaXguY2hhckF0KGkpOwotCi0gICAgICAgICAgICBpZiAoY2ggPCAnIScgfCBjaCA+ICd6JykKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICBUYXBlc3RyeS5nZXRNZXNzYWdlKCJEYXRhU3F1ZWV6ZXIucHJlZml4LW91dC1vZi1yYW5nZSIpKTsKLQotICAgICAgICAgICAgb2Zmc2V0ID0gY2ggLSBGSVJTVF9BREFQVE9SX09GRlNFVDsKLQotICAgICAgICAgICAgaWYgKF9hZGFwdG9yQnlQcmVmaXhbb2Zmc2V0XSAhPSBudWxsKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIFRhcGVzdHJ5LmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJEYXRhU3F1ZWV6ZXIuYWRhcHRvci1wcmVmaXgtdGFrZW4iLAotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4LnN1YnN0cmluZyhpLCBpKSkpOwotCi0gICAgICAgICAgICBfYWRhcHRvckJ5UHJlZml4W29mZnNldF0gPSBhZGFwdG9yOwotCi0gICAgICAgIH0KLQotICAgICAgICBfYWRhcHRvcnMucmVnaXN0ZXIoZGF0YUNsYXNzLCBhZGFwdG9yKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgU3F1ZWV6ZXMgdGhlIGRhdGEgb2JqZWN0IGludG8gYSBTdHJpbmcgYnkgbG9jYXRpbmcgYW4gYXBwcm9wcmlhdGUKLSAgICAgKiAgYWRhcHRvciB0aGF0IGNhbiBwZXJmb3JtIHRoZSBjb252ZXJzaW9uLiAgZGF0YSBtYXkgYmUgbnVsbC4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBTdHJpbmcgc3F1ZWV6ZShPYmplY3QgZGF0YSkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBJU3F1ZWV6ZUFkYXB0b3IgYWRhcHRvcjsKLQotICAgICAgICBpZiAoZGF0YSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIE5VTExfUFJFRklYOwotCi0gICAgICAgIGFkYXB0b3IgPSAoSVNxdWVlemVBZGFwdG9yKSBfYWRhcHRvcnMuZ2V0QWRhcHRvcihkYXRhLmdldENsYXNzKCkpOwotCi0gICAgICAgIHJldHVybiBhZGFwdG9yLnNxdWVlemUodGhpcywgZGF0YSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEEgY29udmllbmNlOyBpbnZva2VzIHtAbGluayAjc3F1ZWV6ZShPYmplY3QpfSBmb3IgZWFjaCBlbGVtZW50IGluIHRoZQotICAgICAqICBkYXRhIGFycmF5LiAgSWYgZGF0YSBpcyBudWxsLCByZXR1cm5zIG51bGwuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgU3RyaW5nW10gc3F1ZWV6ZShPYmplY3RbXSBkYXRhKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmIChkYXRhID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICBpbnQgbGVuZ3RoID0gZGF0YS5sZW5ndGg7Ci0gICAgICAgIFN0cmluZ1tdIHJlc3VsdDsKLQotICAgICAgICByZXN1bHQgPSBuZXcgU3RyaW5nW2xlbmd0aF07Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKLSAgICAgICAgICAgIHJlc3VsdFtpXSA9IHNxdWVlemUoZGF0YVtpXSk7Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgVW5zcXVlZXplcyB0aGUgc3RyaW5nLiAgTm90ZSB0aGF0IGluIGEgc3BlY2lhbCBjYXNlLCB3aGVyZSB0aGUgZmlyc3QKLSAgICAgKiAgY2hhcmFjdGVyIG9mIHRoZSBzdHJpbmcgaXMgbm90IGEgcmVjb2duaXplZCBwcmVmaXgsIGl0IGlzIGFzc3VtZWQKLSAgICAgKiAgdGhhdCB0aGUgc3RyaW5nIGlzIHNpbXBseSBhIHN0cmluZywgYW5kIHJldHVybiB3aXRoIG5vCi0gICAgICogIGNoYW5nZS4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBPYmplY3QgdW5zcXVlZXplKFN0cmluZyBzdHJpbmcpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgSVNxdWVlemVBZGFwdG9yIGFkYXB0b3IgPSBudWxsOwotCi0gICAgICAgIGlmIChzdHJpbmcuZXF1YWxzKE5VTExfUFJFRklYKSkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIGludCBvZmZzZXQgPSBzdHJpbmcuY2hhckF0KDApIC0gRklSU1RfQURBUFRPUl9PRkZTRVQ7Ci0KLSAgICAgICAgaWYgKG9mZnNldCA+PSAwICYmIG9mZnNldCA8IF9hZGFwdG9yQnlQcmVmaXgubGVuZ3RoKQotICAgICAgICAgICAgYWRhcHRvciA9IF9hZGFwdG9yQnlQcmVmaXhbb2Zmc2V0XTsKLQotICAgICAgICAvLyBJZiB0aGUgYWRhcHRvciBpcyBub3Qgb3RoZXJ3aXNlIHJlY29nbml6ZWQsIHRoZSBpdCBpcyBzaW1wbHkKLSAgICAgICAgLy8gYW4gZW5jb2RlZCBTdHJpbmcgKHRoZSBTdHJpbmdBZGFwdG9yIG1heSBub3QgaGF2ZSBhZGRlZAotICAgICAgICAvLyBhIHByZWZpeCkuCi0KLSAgICAgICAgaWYgKGFkYXB0b3IgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBzdHJpbmc7Ci0KLSAgICAgICAgLy8gQWRhcHRvciBzaG91bGQgbmV2ZXIgYmUgbnVsbCwgYmVjYXVzZSB3ZSBhbHdheXMgc3VwcGx5Ci0gICAgICAgIC8vIGFuIGFkYXB0b3IgZm9yIFN0cmluZwotCi0gICAgICAgIHJldHVybiBhZGFwdG9yLnVuc3F1ZWV6ZSh0aGlzLCBzdHJpbmcpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBDb252aWVuaWVuY2UgbWV0aG9kIGZvciB1bnNxdWVlemluZyBtYW55IHN0cmluZ3MgKGJhY2sgaW50byBvYmplY3RzKS4KLSAgICAgKiAgCi0gICAgICogIDxwPklmIHN0cmluZ3MgaXMgbnVsbCwgcmV0dXJucyBudWxsLgotICAgICAqIAotICAgICAqKi8KLQotICAgIHB1YmxpYyBPYmplY3RbXSB1bnNxdWVlemUoU3RyaW5nW10gc3RyaW5ncykgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiAoc3RyaW5ncyA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgaW50IGxlbmd0aCA9IHN0cmluZ3MubGVuZ3RoOwotICAgICAgICBPYmplY3RbXSByZXN1bHQ7Ci0KLSAgICAgICAgcmVzdWx0ID0gbmV3IE9iamVjdFtsZW5ndGhdOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCi0gICAgICAgICAgICByZXN1bHRbaV0gPSB1bnNxdWVlemUoc3RyaW5nc1tpXSk7Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgQ2hlY2tzIHRvIHNlZSBpZiBhIGdpdmVuIHByZWZpeCBjaGFyYWN0ZXIgaGFzIGEgcmVnaXN0ZXJlZAotICAgICAqICBhZGFwdG9yLiAgVGhpcyBpcyB1c2VkIGJ5IHRoZSBTdHJpbmcgYWRhcHRvciB0bwotICAgICAqICBkZXRlcm1pbmUgd2hldGhlciBpdCBuZWVkcyB0byBwdXQgYSBwcmVmaXggb24gaXRzIFN0cmluZy4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBib29sZWFuIGlzUHJlZml4UmVnaXN0ZXJlZChjaGFyIHByZWZpeCkKLSAgICB7Ci0gICAgICAgIGludCBvZmZzZXQgPSBwcmVmaXggLSBGSVJTVF9BREFQVE9SX09GRlNFVDsKLQotICAgICAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIGhhbmRsaW5nIG51bGxzLgotCi0gICAgICAgIGlmIChwcmVmaXggPT0gTlVMTF9QUkVGSVhfQ0gpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgICAgICBpZiAob2Zmc2V0IDwgMCB8fCBvZmZzZXQgPj0gX2FkYXB0b3JCeVByZWZpeC5sZW5ndGgpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgcmV0dXJuIF9hZGFwdG9yQnlQcmVmaXhbb2Zmc2V0XSAhPSBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICAgIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlcjsKLQotICAgICAgICBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIGJ1ZmZlci5hcHBlbmQoIkRhdGFTcXVlZXplclthZGFwdG9ycz08Iik7Ci0gICAgICAgIGJ1ZmZlci5hcHBlbmQoX2FkYXB0b3JzLnRvU3RyaW5nKCkpOwotICAgICAgICBidWZmZXIuYXBwZW5kKCI+XSIpOwotCi0gICAgICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0aGUgcmVzb3VyY2UgcmVzb2x2ZXIgdXNlZCB3aXRoIHRoaXMgc3F1ZWV6ZXIuCi0gICAgICogCi0gICAgICogIEBzaW5jZSAyLjIKLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgSVJlc291cmNlUmVzb2x2ZXIgZ2V0UmVzb2x2ZXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9yZXNvbHZlcjsKLSAgICB9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdXRpbC9pby9Eb3VibGVBZGFwdG9yLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdXRpbC9pby9Eb3VibGVBZGFwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlNTU5MjMuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3V0aWwvaW8vRG91YmxlQWRhcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkudXRpbC5pbzsKLQotLyoqCi0gKiAgU3F1ZWV6ZXMgYSB7QGxpbmsgRG91YmxlfS4gCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKgotICoqLwotCi1jbGFzcyBEb3VibGVBZGFwdG9yIGltcGxlbWVudHMgSVNxdWVlemVBZGFwdG9yCi17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWCA9ICJkIjsKLQotICAgIC8qKgotICAgICAqICBSZWdpc3RlcnMgdXNpbmcgdGhlIHByZWZpeCAnZCcuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCByZWdpc3RlcihEYXRhU3F1ZWV6ZXIgc3F1ZWV6ZXIpCi0gICAgewotICAgICAgICBzcXVlZXplci5yZWdpc3RlcihQUkVGSVgsIERvdWJsZS5jbGFzcywgdGhpcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEludm9rZWQgPGNvZGU+dG9TdHJpbmcoKTwvY29kZT4gb24gZGF0YSAod2hpY2ggaXMgdHlwZSB7QGxpbmsgRG91YmxlfSksCi0gICAgICogIGFuZCBwcmVmaXhzIHRoZSByZXN1bHQuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgU3RyaW5nIHNxdWVlemUoRGF0YVNxdWVlemVyIHNxdWVlemVyLCBPYmplY3QgZGF0YSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBQUkVGSVggKyBkYXRhLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIENvbnN0cnVjdHMgYW4ge0BsaW5rIERvdWJsZX0gZnJvbSB0aGUgc3RyaW5nLCBhZnRlciBzdHJpcHBpbmcKLSAgICAgKiAgdGhlIHByZWZpeC4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBPYmplY3QgdW5zcXVlZXplKERhdGFTcXVlZXplciBzcXVlZXplciwgU3RyaW5nIHN0cmluZykKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgRG91YmxlKHN0cmluZy5zdWJzdHJpbmcoMSkpOwotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS91dGlsL2lvL0VudW1BZGFwdG9yLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdXRpbC9pby9FbnVtQWRhcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2JiYmViLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS91dGlsL2lvL0VudW1BZGFwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS51dGlsLmlvOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLmVudW0uRW51bTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5lbnVtLkVudW1VdGlsczsKLQotLyoqCi0gKiAgQWRhcHRvciBmb3Ige0BsaW5rIEVudW19IGNsYXNzZXMuCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQHNpbmNlIDMuMAotICoKLSAqKi8KLXB1YmxpYyBjbGFzcyBFbnVtQWRhcHRvciBpbXBsZW1lbnRzIElTcXVlZXplQWRhcHRvcgotewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVggPSAiRSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBTRVBBUkFUT1IgPSAnQCc7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHNxdWVlemUoRGF0YVNxdWVlemVyIHNxdWVlemVyLCBPYmplY3QgbykgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBFbnVtIGUgPSAoRW51bSkgbzsKLSAgICAgICAgcmV0dXJuIFBSRUZJWCArIGUuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyBTRVBBUkFUT1IgKyBlLmdldE5hbWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IHVuc3F1ZWV6ZShEYXRhU3F1ZWV6ZXIgc3F1ZWV6ZXIsIFN0cmluZyBzdHIpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaW50IHBvcyA9IHN0ci5pbmRleE9mKFNFUEFSQVRPUik7Ci0KLSAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IHN0ci5zdWJzdHJpbmcoMSwgcG9zKTsKLSAgICAgICAgU3RyaW5nIG5hbWUgPSBzdHIuc3Vic3RyaW5nKHBvcyArIDEsIHN0ci5sZW5ndGgoKSk7Ci0KLQkJQ2xhc3MgZW51bUNsYXNzID0gc3F1ZWV6ZXIuZ2V0UmVzb2x2ZXIoKS5maW5kQ2xhc3MoY2xhc3NOYW1lKTsKLQkJCi0gICAgICAgIHRyeQotICAgICAgICB7ICAgICAgICAJCi0gICAgICAgICAgICByZXR1cm4gRW51bVV0aWxzLmdldEVudW0oZW51bUNsYXNzLCBuYW1lKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oZXguZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyKERhdGFTcXVlZXplciBzcXVlZXplcikKLSAgICB7Ci0gICAgICAgIHNxdWVlemVyLnJlZ2lzdGVyKFBSRUZJWCwgRW51bS5jbGFzcywgdGhpcyk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdXRpbC9pby9GbG9hdEFkYXB0b3IuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS91dGlsL2lvL0Zsb2F0QWRhcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjBlNjI5Li4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS91dGlsL2lvL0Zsb2F0QWRhcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkudXRpbC5pbzsKLQotLyoqCi0gKiAgU3F1ZWV6ZXMgYSB7QGxpbmsgRmxvYXR9LgotICoKLSAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiAgQHZlcnNpb24gJElkJAotICoKLSAqKi8KLQotY2xhc3MgRmxvYXRBZGFwdG9yIGltcGxlbWVudHMgSVNxdWVlemVBZGFwdG9yCi17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWCA9ICJmIjsKLQotICAgIC8qKgotICAgICAqICBSZWdpc3RlcnMgdXNpbmcgdGhlIHByZWZpeCAnZicuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCByZWdpc3RlcihEYXRhU3F1ZWV6ZXIgc3F1ZWV6ZXIpCi0gICAgewotICAgICAgICBzcXVlZXplci5yZWdpc3RlcihQUkVGSVgsIEZsb2F0LmNsYXNzLCB0aGlzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgSW52b2tlZCA8Y29kZT50b1N0cmluZygpPC9jb2RlPiBvbiBkYXRhICh3aGljaCBpcyB0eXBlIHtAbGluayBGbG9hdH0pLAotICAgICAqICBhbmQgcHJlZml4cyB0aGUgcmVzdWx0LgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIFN0cmluZyBzcXVlZXplKERhdGFTcXVlZXplciBzcXVlZXplciwgT2JqZWN0IGRhdGEpCi0gICAgewotICAgICAgICByZXR1cm4gUFJFRklYICsgZGF0YS50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBDb25zdHJ1Y3RzIGEge0BsaW5rIEZsb2F0fSBmcm9tIHRoZSBzdHJpbmcsIGFmdGVyIHN0cmlwcGluZwotICAgICAqICB0aGUgcHJlZml4LgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIE9iamVjdCB1bnNxdWVlemUoRGF0YVNxdWVlemVyIHNxdWVlemVyLCBTdHJpbmcgc3RyaW5nKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBGbG9hdChzdHJpbmcuc3Vic3RyaW5nKDEpKTsKLSAgICB9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdXRpbC9pby9JU3F1ZWV6ZUFkYXB0b3IuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS91dGlsL2lvL0lTcXVlZXplQWRhcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWY2MDE0Li4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS91dGlsL2lvL0lTcXVlZXplQWRhcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkudXRpbC5pbzsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLS8qKgotICogIEludGVyZmFjZSB3aGljaCBkZWZpbmVzIGEgY2xhc3MgdXNlZCB0byBjb252ZXJ0IGRhdGEgZm9yIGEgc3BlY2lmaWMKLSAqICBKYXZhIHR5cGUgaW50byBhIFN0cmluZyBmb3JtYXQgKHNxdWVlemUgaXQpLAotICogIG9yIGNvbnZlcnQgZnJvbSBhIFN0cmluZyBiYWNrIGludG8gYSBKYXZhIHR5cGUgKHVuc3F1ZWV6ZSkuCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAKLSAqKi8KLQotcHVibGljIGludGVyZmFjZSBJU3F1ZWV6ZUFkYXB0b3IKLXsKLSAgICAvKioKLSAgICAgKiAgQ29udmVydHMgdGhlIGRhdGEgb2JqZWN0IGludG8gYSBTdHJpbmcuCi0gICAgICoKLSAgICAgKiAgQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGUgb2JqZWN0IGNhbid0IGJlIGNvbnZlcnRlZC4KLSAgICAgKiovCi0KLSAgICBwdWJsaWMgU3RyaW5nIHNxdWVlemUoRGF0YVNxdWVlemVyIHNxdWVlemVyLCBPYmplY3QgZGF0YSkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogIENvbnZlcnRzIGEgU3RyaW5nIGJhY2sgaW50byBhbiBhcHByb3ByaWF0ZSBvYmplY3QuCi0gICAgICoKLSAgICAgKiAgQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGUgU3RyaW5nIGNhbid0IGJlIGNvbnZlcnRlZC4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBPYmplY3QgdW5zcXVlZXplKERhdGFTcXVlZXplciBzcXVlZXplciwgU3RyaW5nIHN0cmluZykKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogIEludm9rZWQgdG8gYXNrIGFuIGFkYXB0b3IgdG8gcmVnaXN0ZXIgaXRzZWxmIHRvIHRoZSBzcXVlZXplci4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyKERhdGFTcXVlZXplciBzcXVlZXplcik7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3V0aWwvaW8vSW50ZWdlckFkYXB0b3IuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS91dGlsL2lvL0ludGVnZXJBZGFwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiMWZlODIuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3V0aWwvaW8vSW50ZWdlckFkYXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LnV0aWwuaW87Ci0KLS8qKgotICogIFNxdWVlemVzIGEge0BsaW5rIEludGVnZXJ9LiAgVGhpcyBhZGFwdG9yIGNsYWltcyBhbGwgdGhlIGRpZ2l0cyBhcyBwcmVmaXgKLSAqICBjaGFyYWN0ZXJzLCBzbyBpdHMgdGhlIHZlcnkgc2ltcGxlc3QgY29udmVyc2lvbiBvZiBhbGwhCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKgotICoqLwotCi1jbGFzcyBJbnRlZ2VyQWRhcHRvciBpbXBsZW1lbnRzIElTcXVlZXplQWRhcHRvcgotewotICAgIC8qKgotICAgICAqICBSZWdpc3RlcnMgdGhpcyBhZGFwdG9yIHVzaW5nIGFsbCBuaW5lIGRpZ2l0cyBhbmQgdGhlIG1pbnVzIHNpZ24uCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCByZWdpc3RlcihEYXRhU3F1ZWV6ZXIgc3F1ZWV6ZXIpCi0gICAgewotICAgICAgICBzcXVlZXplci5yZWdpc3RlcigiLTAxMjM0NTY3ODkiLCBJbnRlZ2VyLmNsYXNzLCB0aGlzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgU2ltcGx5IGludm9rZXMgPGNvZGU+dG9TdHJpbmcoKTwvY29kZT4gb24gdGhlIGRhdGEsCi0gICAgICogIHdoaWNoIGlzIGFjdHVhbGx5IHR5cGUge0BsaW5rIEludGVnZXJ9LgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIFN0cmluZyBzcXVlZXplKERhdGFTcXVlZXplciBzcXVlZXplciwgT2JqZWN0IGRhdGEpCi0gICAgewotICAgICAgICByZXR1cm4gZGF0YS50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBDb25zdHJ1Y3RzIGFuIHtAbGluayBJbnRlZ2VyfSBmcm9tIHRoZSBzdHJpbmcuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgT2JqZWN0IHVuc3F1ZWV6ZShEYXRhU3F1ZWV6ZXIgc3F1ZWV6ZXIsIFN0cmluZyBzdHJpbmcpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IEludGVnZXIoc3RyaW5nKTsKLSAgICB9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdXRpbC9pby9Mb25nQWRhcHRvci5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3V0aWwvaW8vTG9uZ0FkYXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2UxMTZhNy4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdXRpbC9pby9Mb25nQWRhcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkudXRpbC5pbzsKLQotLyoqCi0gKiAgU3F1ZWV6ZXMgYSB7QGxpbmsgTG9uZ30uIAotICoKLSAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiAgQHZlcnNpb24gJElkJAotICoKLSAqKi8KLQotY2xhc3MgTG9uZ0FkYXB0b3IgaW1wbGVtZW50cyBJU3F1ZWV6ZUFkYXB0b3IKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYID0gImwiOwotCi0gICAgLyoqCi0gICAgICogIFJlZ2lzdGVycyB1c2luZyB0aGUgcHJlZml4ICdsJy4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyKERhdGFTcXVlZXplciBzcXVlZXplcikKLSAgICB7Ci0gICAgICAgIHNxdWVlemVyLnJlZ2lzdGVyKFBSRUZJWCwgTG9uZy5jbGFzcywgdGhpcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEludm9rZWQgPGNvZGU+dG9TdHJpbmcoKTwvY29kZT4gb24gZGF0YSAod2hpY2ggaXMgdHlwZSB7QGxpbmsgTG9uZ30pLAotICAgICAqICBhbmQgcHJlZml4cyB0aGUgcmVzdWx0LgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIFN0cmluZyBzcXVlZXplKERhdGFTcXVlZXplciBzcXVlZXplciwgT2JqZWN0IGRhdGEpCi0gICAgewotICAgICAgICByZXR1cm4gUFJFRklYICsgZGF0YS50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBDb25zdHJ1Y3RzIGEge0BsaW5rIExvbmd9IGZyb20gdGhlIHN0cmluZywgYWZ0ZXIgc3RyaXBwaW5nCi0gICAgICogIHRoZSBwcmVmaXguCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgT2JqZWN0IHVuc3F1ZWV6ZShEYXRhU3F1ZWV6ZXIgc3F1ZWV6ZXIsIFN0cmluZyBzdHJpbmcpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IExvbmcoc3RyaW5nLnN1YnN0cmluZygxKSk7Ci0gICAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3V0aWwvaW8vUmVzb2x2aW5nT2JqZWN0SW5wdXRTdHJlYW0uamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS91dGlsL2lvL1Jlc29sdmluZ09iamVjdElucHV0U3RyZWFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjOGYyMGUuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3V0aWwvaW8vUmVzb2x2aW5nT2JqZWN0SW5wdXRTdHJlYW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LnV0aWwuaW87Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk9iamVjdFN0cmVhbUNsYXNzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVzb3VyY2VSZXNvbHZlcjsKLQotLyoqCi0gKiAgU3BlY2lhbGl6ZWQgc3ViY2xhc3Mgb2Yge0BsaW5rIGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW19Ci0gKiAgdGhhdCBrbm93cyBob3cgdG8gcmVzb2x2ZSBjbGFzc2VzIHdpdGggYSBub24tZGVmYXVsdAotICogIGNsYXNzIGxvYWRlciAocmVwcmVzZW50ZWQgYnkgYW4gaW5zdGFuY2Ugb2YKLSAqICB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVzb3VyY2VSZXNvbHZlcn0pLgotICoKLSAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiAgQHZlcnNpb24gJElkJAotICogIEBzaW5jZSAzLjAKLSAqCi0gKiovCi0KLXB1YmxpYyBjbGFzcyBSZXNvbHZpbmdPYmplY3RJbnB1dFN0cmVhbSBleHRlbmRzIE9iamVjdElucHV0U3RyZWFtCi17Ci0gICAgcHJpdmF0ZSBJUmVzb3VyY2VSZXNvbHZlciBfcmVzb2x2ZXI7Ci0KLSAgICBwdWJsaWMgUmVzb2x2aW5nT2JqZWN0SW5wdXRTdHJlYW0oSVJlc291cmNlUmVzb2x2ZXIgcmVzb2x2ZXIsIElucHV0U3RyZWFtIGlucHV0KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHN1cGVyKGlucHV0KTsKLQotICAgICAgICBfcmVzb2x2ZXIgPSByZXNvbHZlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgT3ZlcnJpZGVzIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHRvCi0gICAgICogIGhhdmUgdGhlIHJlc291cmNlIHJlc29sdmVyIGZpbmQgdGhlIGNsYXNzLgotICAgICAqIAotICAgICAqKi8KLQotICAgIHByb3RlY3RlZCBDbGFzcyByZXNvbHZlQ2xhc3MoT2JqZWN0U3RyZWFtQ2xhc3MgdikgdGhyb3dzIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gX3Jlc29sdmVyLmZpbmRDbGFzcyh2LmdldE5hbWUoKSk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS91dGlsL2lvL1NlcmlhbGl6YWJsZUFkYXB0b3IuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS91dGlsL2lvL1NlcmlhbGl6YWJsZUFkYXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg2NTk2ZS4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdXRpbC9pby9TZXJpYWxpemFibGVBZGFwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODMgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkudXRpbC5pbzsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5HWklQSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLnppcC5HWklQT3V0cHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5UYXBlc3RyeTsKLQotLyoqCi0gKiAgVGhlIG1vc3QgY29tcGxpY2F0ZWQgb2YgdGhlIGFkYXB0b3JzLCB0aGlzIG9uZSB0YWtlcyBhbiBhcmJpdHJhcnkgc2VyaWFsaXphYmxlCi0gKiAgb2JqZWN0LCBzZXJpYWxpemVzIGl0IHRvIGJpbmFyeSwgYW5kIGVuY29kZXMgaXQgaW4gYSBCYXNlNjQgZW5jb2RpbmcuCi0gKgotICogIDxwPkVuY29kaW5nIGFuZCBkZWNvZGluZyBvZiBCYXNlNjQgc3RyaW5ncyB1c2VzIGNvZGUgYWRhcHRlZCBmcm9tIHdvcmsgaW4gdGhlIHB1YmxpYwotICogIGRvbWFpbiBvcmlnaW5hbGx5IHdyaXR0ZW4gYnkgSm9uYXRoYW4gS251ZHNlbiBhbmQgcHVibGlzaGVkIGluCi0gKiAgTydyZWlsbHkncyAiSmF2YSBDcnlwdG9ncmFwaHkiLiBOb3RlIHRoYXQgd2UgdXNlIGEgPGVtPm1vZGlmaWVkPC9lbT4gZm9ybSBvZiBCYXNlNjQgZW5jb2RpbmcsCi0gKiAgd2l0aCBVUkwtc2FmZSBjaGFyYWN0ZXJzIHRvIGVuY29kZSB0aGUgNjIgYW5kIDYzIHZhbHVlcyBhbmQgdGhlIHBhZCBjaGFyYWN0ZXIuCi0gKgotICogIDxwPlRCRDogIFdvcmsgb3V0IHNvbWUgY2xhc3MgbG9hZGVyIGlzc3VlcyBpbnZvbHZlZCBpbiBkZXNlcmlhbGl6aW5nLgotICoKLSAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiAgQHZlcnNpb24gJElkJAotICogCi0gKiovCi0KLWNsYXNzIFNlcmlhbGl6YWJsZUFkYXB0b3IgaW1wbGVtZW50cyBJU3F1ZWV6ZUFkYXB0b3IKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYID0gIk8iOwotCi0gICAgLyoqCi0gICAgICogIFRoZSBQQUQgY2hhcmFjdGVyLCBhcHBlbmRlZCB0byB0aGUgZW5kIG9mIHRoZSBzdHJpbmcgdG8gbWFrZSB0aGluZ3MKLSAgICAgKiAgbGluZSB1cC4gIEluIG5vcm1hbCBCYXNlNjQsIHRoaXMgaXMgdGhlIGNoYXJhY3RlciAnPScuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIFBBRCA9ICcuJzsKLQotICAgIC8qKgotICAgICAqICBSZXByZXNlbnRhdGlvbiBmb3IgdGhlIDYtYml0IGNvZGUgNjMsIG5vcm1hbGx5ICcrJyBpbiBCYXNlNjQuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIENIXzYyID0gJy0nOwotCi0gICAgLyoqCi0gICAgICogIFJlcHJlc2VudGF0aW9uIGZvciB0aGUgNi1iaXQgY29kZSA2NCwgbm9ybWFsbHkgJy8nIGluIEJhc2U2NC4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgQ0hfNjMgPSAnXyc7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHNxdWVlemUoRGF0YVNxdWVlemVyIHNxdWVlemVyLCBPYmplY3QgZGF0YSkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYm9zID0gbnVsbDsKLSAgICAgICAgR1pJUE91dHB1dFN0cmVhbSBnb3MgPSBudWxsOwotICAgICAgICBPYmplY3RPdXRwdXRTdHJlYW0gb29zID0gbnVsbDsKLSAgICAgICAgYnl0ZVtdIGJ5dGVEYXRhID0gbnVsbDsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgYm9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICAgICAgZ29zID0gbmV3IEdaSVBPdXRwdXRTdHJlYW0oYm9zKTsKLSAgICAgICAgICAgIG9vcyA9IG5ldyBPYmplY3RPdXRwdXRTdHJlYW0oZ29zKTsKLQotICAgICAgICAgICAgb29zLndyaXRlT2JqZWN0KGRhdGEpOwotICAgICAgICAgICAgb29zLmNsb3NlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBjbG9zZShvb3MpOwotICAgICAgICAgICAgY2xvc2UoZ29zKTsKLSAgICAgICAgICAgIGNsb3NlKGJvcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBieXRlRGF0YSA9IGJvcy50b0J5dGVBcnJheSgpOwotCi0gICAgICAgIFN0cmluZ0J1ZmZlciBlbmNvZGVkID0gbmV3IFN0cmluZ0J1ZmZlcigyICogYnl0ZURhdGEubGVuZ3RoKTsKLSAgICAgICAgY2hhcltdIGJhc2U2NCA9IG5ldyBjaGFyWzRdOwotCi0gICAgICAgIGVuY29kZWQuYXBwZW5kKFBSRUZJWCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBieXRlRGF0YS5sZW5ndGg7IGkgKz0gMykKLSAgICAgICAgewotICAgICAgICAgICAgZW5jb2RlQmxvY2soYnl0ZURhdGEsIGksIGJhc2U2NCk7Ci0gICAgICAgICAgICBlbmNvZGVkLmFwcGVuZChiYXNlNjQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGVuY29kZWQudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2xvc2UoT3V0cHV0U3RyZWFtIHN0cmVhbSkKLSAgICB7Ci0gICAgICAgIGlmIChzdHJlYW0gIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZXgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gSWdub3JlLgotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNsb3NlKElucHV0U3RyZWFtIHN0cmVhbSkKLSAgICB7Ci0gICAgICAgIGlmIChzdHJlYW0gIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZXgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gSWdub3JlLgotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHB1YmxpYyBPYmplY3QgdW5zcXVlZXplKERhdGFTcXVlZXplciBzcXVlZXplciwgU3RyaW5nIHN0cmluZykgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBiaXMgPSBudWxsOwotICAgICAgICBHWklQSW5wdXRTdHJlYW0gZ2lzID0gbnVsbDsKLSAgICAgICAgT2JqZWN0SW5wdXRTdHJlYW0gb2lzID0gbnVsbDsKLSAgICAgICAgYnl0ZVtdIGJ5dGVEYXRhOwotCi0gICAgICAgIC8vIFN0cmlwIG9mZiB0aGUgZmlyc3QgY2hhcmFjdGVyIGFuZCBkZWNvZGUgdGhlIHJlc3QuCi0KLSAgICAgICAgYnl0ZURhdGEgPSBkZWNvZGUoc3RyaW5nLnN1YnN0cmluZygxKSk7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGJpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlRGF0YSk7Ci0gICAgICAgICAgICBnaXMgPSBuZXcgR1pJUElucHV0U3RyZWFtKGJpcyk7Ci0gICAgICAgICAgICBvaXMgPSBuZXcgUmVzb2x2aW5nT2JqZWN0SW5wdXRTdHJlYW0oc3F1ZWV6ZXIuZ2V0UmVzb2x2ZXIoKSwgZ2lzKTsKLQotICAgICAgICAgICAgcmV0dXJuIG9pcy5yZWFkT2JqZWN0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZXgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIFRoZSBtZXNzYWdlIGlzIHRoZSBuYW1lIG9mIHRoZSBjbGFzcy4KLQotICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIFRhcGVzdHJ5LmZvcm1hdCgiU2VyaWFsaXphYmxlQWRhcHRvci5jbGFzcy1ub3QtZm91bmQiLCBleC5nZXRNZXNzYWdlKCkpKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGNsb3NlKG9pcyk7Ci0gICAgICAgICAgICBjbG9zZShnaXMpOwotICAgICAgICAgICAgY2xvc2UoYmlzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyKERhdGFTcXVlZXplciBzcXVlZXplcikKLSAgICB7Ci0gICAgICAgIHNxdWVlemVyLnJlZ2lzdGVyKFBSRUZJWCwgU2VyaWFsaXphYmxlLmNsYXNzLCB0aGlzKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGVuY29kZUJsb2NrKGJ5dGVbXSByYXcsIGludCBvZmZzZXQsIGNoYXJbXSBiYXNlNjQpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaW50IGJsb2NrID0gMDsKLSAgICAgICAgaW50IHNsYWNrID0gcmF3Lmxlbmd0aCAtIG9mZnNldCAtIDE7Ci0gICAgICAgIGludCBlbmQgPSAoc2xhY2sgPj0gMikgPyAyIDogc2xhY2s7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPD0gZW5kOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJ5dGUgYiA9IHJhd1tvZmZzZXQgKyBpXTsKLSAgICAgICAgICAgIGludCBuZXV0ZXIgPSAoYiA8IDApID8gYiArIDI1NiA6IGI7Ci0gICAgICAgICAgICBibG9jayArPSBuZXV0ZXIgPDwgKDggKiAoMiAtIGkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgc2l4Yml0ID0gKGJsb2NrID4+PiAoNiAqICgzIC0gaSkpKSAmIDB4M2Y7Ci0gICAgICAgICAgICBiYXNlNjRbaV0gPSBnZXRDaGFyKHNpeGJpdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc2xhY2sgPCAxKQotICAgICAgICAgICAgYmFzZTY0WzJdID0gUEFEOwotCi0gICAgICAgIGlmIChzbGFjayA8IDIpCi0gICAgICAgICAgICBiYXNlNjRbM10gPSBQQUQ7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBjaGFyIGdldENoYXIoaW50IHNpeEJpdCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiAoc2l4Qml0ID49IDAgJiYgc2l4Qml0IDw9IDI1KQotICAgICAgICAgICAgcmV0dXJuIChjaGFyKSAoJ0EnICsgc2l4Qml0KTsKLQotICAgICAgICBpZiAoc2l4Qml0ID49IDI2ICYmIHNpeEJpdCA8PSA1MSkKLSAgICAgICAgICAgIHJldHVybiAoY2hhcikgKCdhJyArIChzaXhCaXQgLSAyNikpOwotCi0gICAgICAgIGlmIChzaXhCaXQgPj0gNTIgJiYgc2l4Qml0IDw9IDYxKQotICAgICAgICAgICAgcmV0dXJuIChjaGFyKSAoJzAnICsgKHNpeEJpdCAtIDUyKSk7Ci0KLSAgICAgICAgaWYgKHNpeEJpdCA9PSA2MikKLSAgICAgICAgICAgIHJldHVybiBDSF82MjsKLQotICAgICAgICBpZiAoc2l4Qml0ID09IDYzKQotICAgICAgICAgICAgcmV0dXJuIENIXzYzOwotCi0gICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigKLSAgICAgICAgICAgIFRhcGVzdHJ5LmZvcm1hdCgiU2VyaWFsaXphYmxlQWRhcHRvci51bmFibGUtdG8tY29udmVydCIsIEludGVnZXIudG9TdHJpbmcoc2l4Qml0KSkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIGRlY29kZShTdHJpbmcgc3RyaW5nKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGludCBwYWQgPSAwOwotICAgICAgICBjaGFyW10gYmFzZTY0ID0gc3RyaW5nLnRvQ2hhckFycmF5KCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IGJhc2U2NC5sZW5ndGggLSAxOyBiYXNlNjRbaV0gPT0gUEFEOyBpLS0pCi0gICAgICAgICAgICBwYWQrKzsKLQotICAgICAgICBpbnQgbGVuZ3RoID0gYmFzZTY0Lmxlbmd0aCAqIDYgLyA4IC0gcGFkOwotICAgICAgICBieXRlW10gcmF3ID0gbmV3IGJ5dGVbbGVuZ3RoXTsKLSAgICAgICAgaW50IHJhd0luZGV4ID0gMDsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJhc2U2NC5sZW5ndGg7IGkgKz0gNCkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IGJsb2NrID0KLSAgICAgICAgICAgICAgICAoZ2V0VmFsdWUoYmFzZTY0W2ldKSA8PCAxOCkKLSAgICAgICAgICAgICAgICAgICAgKyAoZ2V0VmFsdWUoYmFzZTY0W2kgKyAxXSkgPDwgMTIpCi0gICAgICAgICAgICAgICAgICAgICsgKGdldFZhbHVlKGJhc2U2NFtpICsgMl0pIDw8IDYpCi0gICAgICAgICAgICAgICAgICAgICsgKGdldFZhbHVlKGJhc2U2NFtpICsgM10pKTsKLQotICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAzICYmIHJhd0luZGV4ICsgaiA8IHJhdy5sZW5ndGg7IGorKykKLSAgICAgICAgICAgICAgICByYXdbcmF3SW5kZXggKyBqXSA9IChieXRlKSAoKGJsb2NrID4+ICg4ICogKDIgLSBqKSkpICYgMHhmZik7Ci0KLSAgICAgICAgICAgIHJhd0luZGV4ICs9IDM7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmF3OwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGludCBnZXRWYWx1ZShjaGFyIGMpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaWYgKGMgPj0gJ0EnICYmIGMgPD0gJ1onKQotICAgICAgICAgICAgcmV0dXJuIGMgLSAnQSc7Ci0KLSAgICAgICAgaWYgKGMgPj0gJ2EnICYmIGMgPD0gJ3onKQotICAgICAgICAgICAgcmV0dXJuIGMgLSAnYScgKyAyNjsKLQotICAgICAgICBpZiAoYyA+PSAnMCcgJiYgYyA8PSAnOScpCi0gICAgICAgICAgICByZXR1cm4gYyAtICcwJyArIDUyOwotCi0gICAgICAgIGlmIChjID09IENIXzYyKQotICAgICAgICAgICAgcmV0dXJuIDYyOwotCi0gICAgICAgIGlmIChjID09IENIXzYzKQotICAgICAgICAgICAgcmV0dXJuIDYzOwotCi0gICAgICAgIC8vIFBhZCBjaGFyYWN0ZXIKLQotICAgICAgICBpZiAoYyA9PSBQQUQpCi0gICAgICAgICAgICByZXR1cm4gMDsKLQotICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oCi0gICAgICAgICAgICBUYXBlc3RyeS5mb3JtYXQoCi0gICAgICAgICAgICAgICAgIlNlcmlhbGl6YWJsZUFkYXB0b3IudW5hYmxlLXRvLWludGVycHJldC1jaGFyIiwKLSAgICAgICAgICAgICAgICBuZXcgU3RyaW5nKG5ldyBjaGFyW10geyBjIH0pKSk7Ci0gICAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3V0aWwvaW8vU2hvcnRBZGFwdG9yLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdXRpbC9pby9TaG9ydEFkYXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY3YTFiNC4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdXRpbC9pby9TaG9ydEFkYXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LnV0aWwuaW87Ci0KLS8qKgotICogIFNxdWVlemVzIGEge0BsaW5rIFNob3J0fS4KLSAqCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogIEB2ZXJzaW9uICRJZCQKLSAqCi0gKiovCi0KLWNsYXNzIFNob3J0QWRhcHRvciBpbXBsZW1lbnRzIElTcXVlZXplQWRhcHRvcgotewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVggPSAicyI7Ci0KLSAgICAvKioKLSAgICAgKiAgUmVnaXN0ZXJzIHVzaW5nIHRoZSBwcmVmaXggJ3MnLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgcmVnaXN0ZXIoRGF0YVNxdWVlemVyIHNxdWVlemVyKQotICAgIHsKLSAgICAgICAgc3F1ZWV6ZXIucmVnaXN0ZXIoUFJFRklYLCBTaG9ydC5jbGFzcywgdGhpcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEludm9rZWQgPGNvZGU+dG9TdHJpbmcoKTwvY29kZT4gb24gZGF0YSAod2hpY2ggaXMgdHlwZSB7QGxpbmsgU2hvcnR9KSwKLSAgICAgKiAgYW5kIHByZWZpeHMgdGhlIHJlc3VsdC4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBTdHJpbmcgc3F1ZWV6ZShEYXRhU3F1ZWV6ZXIgc3F1ZWV6ZXIsIE9iamVjdCBkYXRhKQotICAgIHsKLSAgICAgICAgcmV0dXJuIFBSRUZJWCArIGRhdGEudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgQ29uc3RydWN0cyBhIHtAbGluayBTaG9ydH0gZnJvbSB0aGUgc3RyaW5nLCBhZnRlciBzdHJpcHBpbmcKLSAgICAgKiAgdGhlIHByZWZpeC4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBPYmplY3QgdW5zcXVlZXplKERhdGFTcXVlZXplciBzcXVlZXplciwgU3RyaW5nIHN0cmluZykKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgU2hvcnQoc3RyaW5nLnN1YnN0cmluZygxKSk7Ci0gICAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3V0aWwvaW8vU3RyaW5nQWRhcHRvci5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3V0aWwvaW8vU3RyaW5nQWRhcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2U2ZjAzLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS91dGlsL2lvL1N0cmluZ0FkYXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LnV0aWwuaW87Ci0KLS8qKgotICogIFNxdWVlemVzIGEgU3RyaW5nICh3aGljaCBpcyBwcmV0dHkgc2ltcGxlLCBtb3N0IG9mIHRoZSB0aW1lKS4KLSAqCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogIEB2ZXJzaW9uICRJZCQKLSAqCi0gKiovCi0KLWNsYXNzIFN0cmluZ0FkYXB0b3IgaW1wbGVtZW50cyBJU3F1ZWV6ZUFkYXB0b3IKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYID0gIlMiOwotCi0gICAgcHVibGljIHZvaWQgcmVnaXN0ZXIoRGF0YVNxdWVlemVyIHNxdWVlemVyKQotICAgIHsKLSAgICAgICAgc3F1ZWV6ZXIucmVnaXN0ZXIoUFJFRklYLCBTdHJpbmcuY2xhc3MsIHRoaXMpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgc3F1ZWV6ZShEYXRhU3F1ZWV6ZXIgc3F1ZWV6ZXIsIE9iamVjdCBkYXRhKQotICAgIHsKLSAgICAgICAgU3RyaW5nIHN0cmluZyA9IChTdHJpbmcpIGRhdGE7Ci0KLSAgICAgICAgcmV0dXJuIFBSRUZJWCArIHN0cmluZzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgU3RyaXBzIHRoZSBwcmVmaXggZnJvbSB0aGUgc3RyaW5nLiAgVGhpcyBtZXRob2QgaXMgb25seQotICAgICAqICBpbnZva2VkIGJ5IHRoZSB7QGxpbmsgRGF0YVNxdWVlemVyfSBpZiB0aGUgc3RyaW5nIGxlYWRzCi0gICAgICogIHdpdGggaXRzIG5vcm1hbCBwcmVmaXggKGFuICdTJykuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgT2JqZWN0IHVuc3F1ZWV6ZShEYXRhU3F1ZWV6ZXIgc3F1ZWV6ZXIsIFN0cmluZyBzdHJpbmcpCi0gICAgewotICAgICAgICBpZiAoc3RyaW5nLmxlbmd0aCgpID09IDEpCi0gICAgICAgICAgICByZXR1cm4gIiI7Ci0KLSAgICAgICAgcmV0dXJuIHN0cmluZy5zdWJzdHJpbmcoMSk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS91dGlsL2lvL3BhY2thZ2UuaHRtbCBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS91dGlsL2lvL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY0ZThiZS4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdXRpbC9pby9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotPCEtLSAkSWQkIC0tPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5UYXBlc3RyeTogV2ViIEFwcGxpY2F0aW9uIEZyYW1ld29yazwvdGl0bGU+Ci08L2hlYWQ+Ci0KLQotPGJvZHk+Ci0KLTxwPlNvbWUgaW50ZXJlc3RpbmcgSS9PIGNsYXNzZXMuICB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS51dGlsLmlvLkJpbmFyeUR1bXBPdXRwdXRTdHJlYW19Ci1mb3JtYXRzIGEgc3RyZWFtIG9mIGJ5dGVzIGludG8gYSBodW1hbiByZWFkYWJsZSBwcmVzZW50YXRpb24sIG11Y2ggbGlrZQotdGhlIFVuaXggY29tbWFuZCBsaW5lIHRvb2wgPGNvZGU+b2Q8L2NvZGU+LgotCi08cD57QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS51dGlsLmlvLkRhdGFTcXVlZXplcn0gaXMgdXNlZCB0byBzcXVlZXplIGFuZCB1bnNxdWVlemUgCi1iYXNpYyBzY2FsYXIgdHlwZXMsIFN0cmluZ3MgYW5kIHNlcmlhbGl6YWJsZSBvYmplY3RzIGludG8gYSBTdHJpbmcgZm9ybWF0LiAgVGhlIGV2ZW50dWFsCi1wdXJwb3NlIGlzIHRvIHNhZmVseSBlbmNvZGUgaW5mb3JtYXRpb24gaW50byBVUkxzIG9yIGFzIEhUVFAgQ29va2llcy4KLQotQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcCA8YSBocmVmPSJtYWlsdG86aGxzaGlwQGFwYWNoZS5vcmciPmhsc2hpcEBhcGFjaGUub3JnPC9hPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdXRpbC9wYWNrYWdlLmh0bWwgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdXRpbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1MzNkYWMuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3V0aWwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLTwhLS0gJElkJCAtLT4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+VGFwZXN0cnk6IFdlYiBBcHBsaWNhdGlvbiBGcmFtZXdvcms8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keT4KLQotPHA+QSBnZW5lcmFsIHNldCBvZiByZXN1YWJsZSBjbGFzc2VzIGFuZCB1dGlsaXRpZXMgZm9yIGNyZWF0aW5nIEludGVybmV0IGFuZCBYTUwgYXBwbGljYXRpb25zLgotCi1AYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwIDxhIGhyZWY9Im1haWx0bzpobHNoaXBAYXBhY2hlLm9yZyI+aGxzaGlwQGFwYWNoZS5vcmc8L2E+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS91dGlsL3Bvb2wvRGVmYXVsdFBvb2xhYmxlQWRhcHRvci5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3V0aWwvcG9vbC9EZWZhdWx0UG9vbGFibGVBZGFwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2ZWU3YzQuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3V0aWwvcG9vbC9EZWZhdWx0UG9vbGFibGVBZGFwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS51dGlsLnBvb2w7Ci0KLS8qKgotICogIEltcGxlbWVudGF0aW9uIGZvciBvYmplY3RzIHRoYXQgaW1wbGVtZW50Ci0gKiAgdGhlIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LnV0aWwucG9vbC5JUG9vbGFibGV9IGludGVyZmFjZS4KLSAqIAotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQHNpbmNlIDMuMAotICoKLSAqKi8KLQotcHVibGljIGNsYXNzIERlZmF1bHRQb29sYWJsZUFkYXB0b3IgaW1wbGVtZW50cyBJUG9vbGFibGVBZGFwdG9yCi17Ci0KLSAgICBwdWJsaWMgdm9pZCByZXNldEZvclBvb2woT2JqZWN0IG9iamVjdCkKLSAgICB7Ci0gICAgICAgIElQb29sYWJsZSBwb29sYWJsZSA9IChJUG9vbGFibGUpb2JqZWN0OwotICAgICAgICAKLSAgICAgICAgcG9vbGFibGUucmVzZXRGb3JQb29sKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGlzY2FyZEZyb21Qb29sKE9iamVjdCBvYmplY3QpCi0gICAgewotICAgICAgICBJUG9vbGFibGUgcG9vbGFibGUgPSAoSVBvb2xhYmxlKW9iamVjdDsKLSAgICAgICAgCi0gICAgICAgIHBvb2xhYmxlLmRpc2NhcmRGcm9tUG9vbCgpOyAgICAgICAgCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdXRpbC9wb29sL0lQb29sYWJsZS5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3V0aWwvcG9vbC9JUG9vbGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ZkMWRhNC4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdXRpbC9wb29sL0lQb29sYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkudXRpbC5wb29sOwotCi0vKioKLSAqICBNYXJrcyBhbiBvYmplY3QgYXMgYmVpbmcgYXdhcmUgdGhhdCBpcyB0byBiZSBzdG9yZWQgaW50byBhIHtAbGluayBQb29sfS4KLSAqICBUaGlzIGdpdmVzIHRoZSBvYmplY3QgYSBsYXN0IGNoYW5jZSB0byByZXNldCBhbnkgc3RhdGUuCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQHNpbmNlIDEuMC40Ci0gKiAKLSAqKi8KLQotcHVibGljIGludGVyZmFjZSBJUG9vbGFibGUKLXsKLSAgICAvKioKLSAgICAgKiAgSW52b2tlZCBieSBhIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LnV0aWwucG9vbC5Qb29sfSAKLSAgICAgKiAganVzdCBiZWZvcmUgdGhlIG9iamVjdCBpcyBhZGRlZCB0byB0aGUgcG9vbC4KLSAgICAgKiAgVGhlIG9iamVjdCBzaG91bGQgcmV0dXJuIGl0cyBzdGF0ZSB0byBob3cgaXQgd2FzIHdoZW4gZnJlc2hseSBpbnN0YW50aWF0ZWQKLSAgICAgKiAgKG9yIGF0IGxlYXN0LCBpdHMgc3RhdGUgc2hvdWxkIGJlIGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gYSBmcmVzaGx5Ci0gICAgICogIGluc3RhbnRpYXRlZCBpbnN0YW5jZSkuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCByZXNldEZvclBvb2woKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiAgSW52b2tlZCBqdXN0IGFzIGEgUG9vbCBkaXNjYXJkcyBhbiBvYmplY3QgKGZvciBsYWNrIG9mIHVzZSkuCi0gICAgICogIFRoaXMgYWxsb3dzIGEgbGFzdCBjaGFuY2UgdG8gcGVyZm9ybSBmaW5hbCBjbGVhbnVwCi0gICAgICogIG9uIHRoZSBvYmplY3Qgd2hpbGUgaXQgaXMgc3RpbGwgcmVmZXJlbmNhYmxlLgotICAgICAqIAotICAgICAqKi8KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBkaXNjYXJkRnJvbVBvb2woKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdXRpbC9wb29sL0lQb29sYWJsZUFkYXB0b3IuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS91dGlsL3Bvb2wvSVBvb2xhYmxlQWRhcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTNlZTcwLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS91dGlsL3Bvb2wvSVBvb2xhYmxlQWRhcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkudXRpbC5wb29sOwotCi0vKioKLSAqICBEZWZpbmVzIG1ldGhvZHMgdGhhdCBkZWZpbmUgYW4gYWRhcHRvciB0byBwcm92aWRlCi0gKiAge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkudXRpbC5wb29sLklQb29sYWJsZX0KLSAqICB0eXBlIGJlaGF2aW9yIHRvIGFyYml0cmFyeSBvYmplY3RzLgotICoKLSAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiAgQHZlcnNpb24gJElkJAotICogIEBzaW5jZSAzLjAKLSAqCi0gKiovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSVBvb2xhYmxlQWRhcHRvcgotewotICAgIC8qKgotICAgICAqICBJbnZva2VkIGp1c3QgYXMgYW4gb2JqZWN0IGlzIHJldHVybmVkIHRvIHRoZSBwb29sOyB0aGlzCi0gICAgICogIGFsbG93cyBpdCB0byByZXNldCBhbnkgc3RhdGUgYmFjayB0byBuZXdseSBpbml0aWFsaXplZC4KLSAgICAgKiAKLSAgICAgKiovCi0gICAgCi0gICAgcHVibGljIHZvaWQgcmVzZXRGb3JQb29sKE9iamVjdCBvYmplY3QpOwotICAgIAotICAgIC8qKgotICAgICAqICBJbnZva2VkIHdoZW4gYSBwb29sZWQgb2JqZWN0IGlzIGRpc2NhcmRlZCBmcm9tIHRoZSBwb29sLgotICAgICAqIAotICAgICAqKi8KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBkaXNjYXJkRnJvbVBvb2woT2JqZWN0IG9iamVjdCk7Ci19CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdXRpbC9wb29sL051bGxQb29sYWJsZUFkYXB0b3IuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS91dGlsL3Bvb2wvTnVsbFBvb2xhYmxlQWRhcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTQzOWUyLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS91dGlsL3Bvb2wvTnVsbFBvb2xhYmxlQWRhcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkudXRpbC5wb29sOwotCi0vKioKLSAqICBBIGRlZmF1bHQsIGVtcHR5IGltcGxlbWVudGF0aW9uLCBmb3Igb2JqZWN0cyB0aGF0Ci0gKiAgaGF2ZSBubyBzcGVjaWFsIGJlaGF2aW9yIHJlbGF0ZWQgdG8gYmVpbmcgcG9vbGVkLgotICoKLSAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiAgQHZlcnNpb24gJElkJAotICogIEBzaW5jZSAzLjAKLSAqCi0gKiovCi0KLXB1YmxpYyBjbGFzcyBOdWxsUG9vbGFibGVBZGFwdG9yIGltcGxlbWVudHMgSVBvb2xhYmxlQWRhcHRvcgotewotCi0gICAgcHVibGljIHZvaWQgcmVzZXRGb3JQb29sKE9iamVjdCBvYmplY3QpCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRpc2NhcmRGcm9tUG9vbChPYmplY3Qgb2JqZWN0KQotICAgIHsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS91dGlsL3Bvb2wvUG9vbC5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3V0aWwvcG9vbC9Qb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkOTZlYTIuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3V0aWwvcG9vbC9Qb29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MTYgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkudXRpbC5wb29sOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5idWlsZGVyLlRvU3RyaW5nQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LkFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklNYXJrdXBXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5UYXBlc3RyeTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnV0aWwuQWRhcHRvclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkudXRpbC5JQ2xlYW5hYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkudXRpbC5JUmVuZGVyRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS51dGlsLkphbml0b3JUaHJlYWQ7Ci0KLS8qKgotICogIEEgUG9vbCBpcyB1c2VkIHRvIHBvb2wgaW5zdGFuY2VzIG9mIGEgdXNlZnVsIGNsYXNzLiAgSXQgdXNlcwotICogIGtleXMsIG11Y2ggbGlrZSBhIHtAbGluayBNYXB9LCB0byBpZGVudGlmeSBhIGxpc3Qgb2YgcG9vbGVkIG9iamVjdHMuCi0gKiAgUmV0cmlldmluZyBhbiBvYmplY3QgZnJvbSB0aGUgUG9vbCBhdG9taWNhbGx5IHJlbW92ZXMgaXQgZnJvbSB0aGUKLSAqICBwb29sLiAgSXQgY2FuIHRoZW4gYmUgc3RvcmVkIGFnYWluIGxhdGVyLiAgSW4gdGhpcyB3YXksIGEgc2luZ2xlCi0gKiAgUG9vbCBpbnN0YW5jZSBjYW4gbWFuYWdlIG1hbnkgZGlmZmVyZW50IHR5cGVzIG9mIHBvb2xlZCBvYmplY3RzLAotICogIGZpbGVkIHVuZGVyIGRpZmZlcmVudCBrZXlzLgotICogCi0gKiAgPHA+Ci0gKiAgVW5saWtlIHRyYWRpdGlvbmFsIFBvb2xzLCB0aGlzIGNsYXNzIGRvZXMgbm90IGNyZWF0ZSBuZXcgaW5zdGFuY2VzIG9mCi0gKiAgdGhlIG9iamVjdHMgaXQgc3RvcmVzICh3aXRoIHRoZSBleGNlcHRpb24gb2Ygc2ltcGxlIEphdmEgQmVhbnMsCi0gKiAgdmlhIHtAbGluayAjcmV0cmlldmUoQ2xhc3MpfS4gIFRoZSB1c2FnZSBwYXR0ZXJuIGlzIHRvIHJldHJpZXZlIGFuIGluc3RhbmNlCi0gKiAgZnJvbSB0aGUgUG9vbCwgYW5kIGlmIHRoZSBpbnN0YW5jZSBpcyBudWxsLCBjcmVhdGUgYSBuZXcgaW5zdGFuY2UuCi0gKgotICogIDxwPlRoZSBpbXBsZW1lbnRhdGlvbiBvZiBQb29sIGlzIHRocmVhZHNhZmUuCi0gKgotICogIDxwPlBvb2wgaW1wbGVtZW50cyB7QGxpbmsgSUNsZWFuYWJsZX0sIHdpdGggYSBnb2FsIG9mCi0gKiAgb25seSBrZWVwaW5nIHBvb2xlZCBvYmplY3RzIHRoYXQgaGF2ZSBiZWVuIG5lZWRlZCB3aXRoaW4KLSAqICBhIHJlY2VudCB0aW1lIGZyYW1lLiAgQSBnZW5lcmF0aW9uYWwgc3lzdGVtIGlzIHVzZWQsIHdoZXJlIGVhY2gKLSAqICBwb29sZWQgb2JqZWN0IGlzIGFzc2lnbmVkIGEgZ2VuZXJhdGlvbiBjb3VudC4gIHtAbGluayAjZXhlY3V0ZUNsZWFudXB9Ci0gKiAgZGlzY2FyZHMgb2JqZWN0cyB3aG9zZSBnZW5lcmF0aW9uIGNvdW50IGlzIHRvbyBvbGQgKG91dHNpZGUgb2YgYQotICogIHtAbGluayAjZ2V0V2luZG93KCkgd2luZG93fSkuCi0gKiAKLSAqICA8cD4KLSAqICBPYmplY3RzIGluIHRoZSBwb29sIGNhbiByZWNlaXZlIHR3byBub3RpZmljYXRpb25zOiBvbmUgbm90aWZpY2F0aW9uCi0gKiAgd2hlbiB0aGV5IGFyZSB7QGxpbmsgI3N0b3JlKE9iamVjdCwgT2JqZWN0KSBzdG9yZWR9IGludG8gdGhlIHBvb2wsCi0gKiAgYW5kIG9uZSB3aGVuIHRoZXkgYXJlIGRpc2NhcmRlZCBmcm9tIHRoZSBwb29sLgotICogCi0gKiAgPHA+Ci0gKiAgQ2xhc3NlcyB0aGF0IGltcGxlbWVudCB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS51dGlsLnBvb2wuSVBvb2xhYmxlfQotICogIHJlY2VpdmUgbm90aWZpY2F0aW9ucyBkaXJlY3RseSwgYXMgcGVyIHRoZSB0d28gbWV0aG9kcwotICogIG9mIHRoYXQgaW50ZXJmYWNlLgotICogCi0gKiAgPHA+Ci0gKiAgQWx0ZXJuYXRlbHksIGFuIGFkYXB0b3IgZm9yIHRoZSBvdGhlciBjbGFzc2VzIGNhbiBiZQotICogIHJlZ2lzdGVyZXJlZCAodXNpbmcge0BsaW5rICNyZWdpc3RlckFkYXB0b3IoQ2xhc3MsIElQb29sYWJsZUFkYXB0b3IpfS4KLSAqICBUaGUgYWRhcHRvciB3aWxsIGJlIGludm9rZWQgdG8gaGFuZGxlIHRoZSBub3RpZmljYXRpb24gd2hlbiBhIAotICogIHBvb2xlZCBvYmplY3QgaXMgc3RvcmVkIG9yIGRpc2NhcmRlZC4KLSAqCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogIEB2ZXJzaW9uICRJZCQKLSAqCi0gKiovCi0KLXB1YmxpYyBjbGFzcyBQb29sIGltcGxlbWVudHMgSUNsZWFuYWJsZSwgSVJlbmRlckRlc2NyaXB0aW9uCi17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIExPRyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFBvb2wuY2xhc3MpOwotCi0gICAgcHJpdmF0ZSBBZGFwdG9yUmVnaXN0cnkgX2FkYXB0b3JzID0gbmV3IEFkYXB0b3JSZWdpc3RyeSgpOwotCi0gICAgLyoqCi0gICAgICogIFRoZSBnZW5lcmF0aW9uLCB1c2VkIHRvIGN1bGwgdW51c2VkIHBvb2xlZCBpdGVtcy4KLSAgICAgKgotICAgICAqICBAc2luY2UgMS4wLjUKLSAgICAgKiovCi0KLSAgICBwcml2YXRlIGludCBfZ2VuZXJhdGlvbjsKLQotICAgIC8qKgotICAgICAqICBUaGUgZ2VuZXJhdGlvbiB3aW5kb3csIHVzZWQgdG8gaWRlbnRpZnkgd2hpY2gKLSAgICAgKiAgaXRlbXMgc2hvdWxkIGJlIGN1bGxlZC4KLSAgICAgKgotICAgICAqICBAc2luY2UgMS4wLjUKLSAgICAgKiovCi0KLSAgICBwcml2YXRlIGludCBfd2luZG93ID0gMTA7Ci0KLSAgICAvKioKLSAgICAgKiAgVGhlIG51bWJlciBvZiBvYmplY3RzIHBvb2xlZC4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHByaXZhdGUgaW50IF9wb29sZWRDb3VudDsKLQotICAgIC8qKgotICAgICAqICBBIG1hcCBvZiBQb29sTGlzdHMsIGtleWVkIG9uIGFuIGFyYml0cmFyeSBvYmplY3QuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwcml2YXRlIE1hcCBfbWFwOwotCi0gICAgLyoqCi0gICAgICogIENyZWF0ZXMgYSBuZXcgUG9vbCB1c2luZyB0aGUgZGVmYXVsdCBtYXAgc2l6ZS4gIENyZWF0aW9uIG9mIHRoZSBtYXAgaXMgZGVmZXJyZWQuCi0gICAgICoKLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBQb29sKCkKLSAgICB7Ci0gICAgICAgIHRoaXModHJ1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIENyZWF0ZXMgYSBuZXcgUG9vbCB1c2luZyB0aGUgc3BlY2lmaWVkIG1hcCBzaXplLiAgVGhlIG1hcCBpcyBjcmVhdGVkIGltbWVkaWF0ZWx5LgotICAgICAqCi0gICAgICogIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI1Bvb2woKX0gaW5zdGVhZC4KLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgUG9vbChpbnQgbWFwU2l6ZSkKLSAgICB7Ci0gICAgICAgIHRoaXMobWFwU2l6ZSwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEBwYXJhbSB1c2VTaGFyZWRKYW5pdG9yIGlmIHRydWUsIHRoZW4gdGhlIFBvb2wgaXMgYWRkZWQgdG8KLSAgICAgKiAgdGhlIHtAbGluayBKYW5pdG9yVGhyZWFkI2dldFNoYXJlZEphbml0b3JUaHJlYWQoKSBzaGFyZWQgamFuaXRvcn0uCi0gICAgICoKLSAgICAgKiAgQHNpbmNlIDEuMC41Ci0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgUG9vbChib29sZWFuIHVzZVNoYXJlZEphbml0b3IpCi0gICAgewotICAgICAgICBpZiAodXNlU2hhcmVkSmFuaXRvcikKLSAgICAgICAgICAgIEphbml0b3JUaHJlYWQuZ2V0U2hhcmVkSmFuaXRvclRocmVhZCgpLmFkZCh0aGlzKTsKLQotICAgICAgICByZWdpc3RlckFkYXB0b3JzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFN0YW5kYXJkIGNvbnN0cnVjdG9yLgotICAgICAqCi0gICAgICogIEBwYXJhbSBtYXBTaXplIGluaXRpYWwgc2l6ZSBvZiB0aGUgbWFwLgotICAgICAqICBAcGFyYW0gdXNlU2hhcmVkSmFuaXRvciBpZiB0cnVlLCB0aGVuIHRoZSBQb29sIGlzIGFkZGVkIHRvCi0gICAgICogIHRoZSB7QGxpbmsgSmFuaXRvclRocmVhZCNnZXRTaGFyZWRKYW5pdG9yVGhyZWFkKCkgc2hhcmVkIGphbml0b3J9LgotICAgICAqCi0gICAgICogIEBzaW5jZSAxLjAuNQotICAgICAqICBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNQb29sKGJvb2xlYW4pfSBpbnN0ZWFkLgotICAgICAqIAotICAgICAqKi8KLQotICAgIHB1YmxpYyBQb29sKGludCBtYXBTaXplLCBib29sZWFuIHVzZVNoYXJlZEphbml0b3IpCi0gICAgewotICAgICAgICB0aGlzKHVzZVNoYXJlZEphbml0b3IpOwotCi0gICAgICAgIF9tYXAgPSBuZXcgSGFzaE1hcChtYXBTaXplKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0aGUgd2luZG93IHVzZWQgdG8gY3VsbCBwb29sZWQgb2JqZWN0cyBkdXJpbmcgYSBjbGVhbnVwLgotICAgICAqICBUaGUgZGVmYXVsdCBpcyAxMCwgd2hpY2ggd29ya3Mgb3V0IHRvIGFib3V0IGZpdmUgbWludXRlcyB3aXRoCi0gICAgICogIGEgc3RhbmRhcmQgamFuaXRvciAob24gYSAzMCBzZWNvbmQgY3ljbGUpLgotICAgICAqCi0gICAgICogIEBzaW5jZSAxLjAuNQotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIGludCBnZXRXaW5kb3coKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF93aW5kb3c7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFNldHMgdGhlIHdpbmRvdywgb3IgbnVtYmVyIG9mIGdlbmVyYXRpb25zIHRoYXQgYW4gb2JqZWN0IG1heSBzdGF5Ci0gICAgICogIGluIHRoZSBwb29sIGJlZm9yZSBiZWluZyBjdWxsZWQuCi0gICAgICoKLSAgICAgKiAgQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdmFsdWUgaXMgbGVzcyB0aGFuIDEuCi0gICAgICoKLSAgICAgKiAgQHNpbmNlIDEuMC41Ci0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgc2V0V2luZG93KGludCB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIGlmICh2YWx1ZSA8IDEpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJQb29sIHdpbmRvdyBtYXkgbm90IGJlIGxlc3MgdGhhbiAxLiIpOwotCi0gICAgICAgIF93aW5kb3cgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyBhIHByZXZpb3VzbHkgcG9vbGVkIG9iamVjdCB3aXRoIHRoZSBnaXZlbiBrZXksIG9yIG51bGwgaWYgbm8KLSAgICAgKiAgc3VjaCBvYmplY3QgZXhpc3RzLiAgR2V0dGluZyBhbiBvYmplY3QgZnJvbSBhIFBvb2wgcmVtb3ZlcyBpdCBmcm9tIHRoZSBQb29sLAotICAgICAqICBidXQgaXQgY2FuIGxhdGVyIGJlIHJlLWFkZGVkIHdpdGgge0BsaW5rICNzdG9yZShPYmplY3QsT2JqZWN0KX0uCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIE9iamVjdCByZXRyaWV2ZShPYmplY3Qga2V5KQotICAgIHsKLSAgICAgICAgT2JqZWN0IHJlc3VsdCA9IG51bGw7Ci0KLSAgICAgICAgaWYgKF9tYXAgPT0gbnVsbCkKLSAgICAgICAgICAgIF9tYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgICAgIFBvb2xMaXN0IGxpc3QgPSAoUG9vbExpc3QpIF9tYXAuZ2V0KGtleSk7Ci0KLSAgICAgICAgaWYgKGxpc3QgIT0gbnVsbCkKLSAgICAgICAgICAgIHJlc3VsdCA9IGxpc3QucmV0cmlldmUoKTsKLQotICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCi0gICAgICAgICAgICBfcG9vbGVkQ291bnQtLTsKLQotICAgICAgICBpZiAoTE9HLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgICAgICBMT0cuZGVidWcoIlJldHJpZXZlZCAiICsgcmVzdWx0ICsgIiBmcm9tICIgKyBrZXkpOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFJldHJpZXZlcyBhbiBpbnN0YW5jZSBvZiB0aGUgbmFtZWQgY2xhc3MuICBJZiBubyBwb29sZWQKLSAgICAgKiAgaW5zdGFuY2UgaXMgYXZhaWxhYmxlLCBhIG5ldyBpbnN0YW5jZSBpcyBjcmVhdGVkCi0gICAgICogICh1c2luZyB0aGUgbm8gYXJndW1lbnRzIGNvbnN0cnVjdG9yKS4gIE9iamVjdHMgYXJlCi0gICAgICogIHBvb2xlZCB1c2luZyB0aGVpciBhY3R1YWwgY2xhc3MgYXMgYSBrZXkuCi0gICAgICogCi0gICAgICogIDxwPgotICAgICAqICBIb3dldmVyLCBkb24ndCBiZSBmb29sZWQgYnkgZmFsc2UgZWNvbm9taWVzLiAgVW5sZXNzCi0gICAgICogIGFuIG9iamVjdCBpcyB2ZXJ5IGV4cGVuc2l2ZSB0byBjcmVhdGUsIHBvb2xpbmcgaXMgCi0gICAgICogIDxlbT5tb3JlPC9lbT4gZXhwZW5zaXZlIHRoYW4gc2ltcGx5IGluc3RhbnRpYXRpbmcgdGVtcG9yYXJ5Ci0gICAgICogIGluc3RhbmNlcyBhbmQgbGV0dGluZyB0aGUgZ2FyYmFnZSBjb2xsZWN0b3IgZGVhbCB3aXRoIGl0Ci0gICAgICogICh0aGlzIGlzIGNvdW50ZXIgaW50dWl0aXZlLCBidXQgdHJ1ZSkuICBGb3IgZXhhbXBsZSwKLSAgICAgKiAgdGhpcyBtZXRob2Qgd2FzIG9yaWdpbmFsbHkgY3JlYXRlZCB0byBhbGxvdyBwb29saW5nCi0gICAgICogIG9mIHtAbGluayBTdHJpbmdCdWZmZXJ9LCBidXQgdGVzdGluZyBzaG93ZWQgdGhhdCBpdAotICAgICAqICB3YXMgYSBuZXQgZGVmZWNpdC4KLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgT2JqZWN0IHJldHJpZXZlKENsYXNzIG9iamVjdENsYXNzKQotICAgIHsKLSAgICAgICAgT2JqZWN0IHJlc3VsdCA9IHJldHJpZXZlKChPYmplY3QpIG9iamVjdENsYXNzKTsKLQotICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChMT0cuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICBMT0cuZGVidWcoIk5vIGluc3RhbmNlIG9mICIgKyBvYmplY3RDbGFzcy5nZXROYW1lKCkgKyAiIGlzIGF2YWlsYWJsZSwgaW5zdGFudGlhdGluZyBvbmUuIik7Ci0KLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlc3VsdCA9IG9iamVjdENsYXNzLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIFRhcGVzdHJ5LmZvcm1hdCgiUG9vbC51bmFibGUtdG8taW5zdGFudGlhdGUtaW5zdGFuY2UiLCBvYmplY3RDbGFzcy5nZXROYW1lKCkpLAotICAgICAgICAgICAgICAgICAgICBleCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBTdG9yZXMgYW4gb2JqZWN0IHVzaW5nIGl0cyBjbGFzcyBhcyBhIGtleS4KLSAgICAgKiAKLSAgICAgKiAgQHNlZSAjcmV0cmlldmUoQ2xhc3MpCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgc3RvcmUoT2JqZWN0IG9iamVjdCkKLSAgICB7Ci0gICAgICAgIHN0b3JlKG9iamVjdC5nZXRDbGFzcygpLCBvYmplY3QpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBTdG9yZXMgYW4gb2JqZWN0IGluIHRoZSBwb29sIGZvciBsYXRlciByZXRyaWV2YWwsIHJlc2V0dGluZwotICAgICAqICB0aGUgb2JqZWN0IGZvciBzdG9yYWdlIHdpdGhpbiB0aGUgcG9vbC4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdG9yZShPYmplY3Qga2V5LCBPYmplY3Qgb2JqZWN0KQotICAgIHsKLSAgICAgICAgZ2V0QWRhcHRvcihvYmplY3QpLnJlc2V0Rm9yUG9vbChvYmplY3QpOwotCi0gICAgICAgIGlmIChfbWFwID09IG51bGwpCi0gICAgICAgICAgICBfbWFwID0gbmV3IEhhc2hNYXAoKTsKLQotICAgICAgICBQb29sTGlzdCBsaXN0ID0gKFBvb2xMaXN0KSBfbWFwLmdldChrZXkpOwotCi0gICAgICAgIGlmIChsaXN0ID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxpc3QgPSBuZXcgUG9vbExpc3QodGhpcyk7Ci0gICAgICAgICAgICBfbWFwLnB1dChrZXksIGxpc3QpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGNvdW50ID0gbGlzdC5zdG9yZShfZ2VuZXJhdGlvbiwgb2JqZWN0KTsKLQotICAgICAgICBfcG9vbGVkQ291bnQrKzsKLQotICAgICAgICBpZiAoTE9HLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgICAgICBMT0cuZGVidWcoIlN0b3JlZCAiICsgb2JqZWN0ICsgIiBpbnRvICIgKyBrZXkgKyAiICgiICsgY291bnQgKyAiIHBvb2xlZCkiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgUmVtb3ZlcyBhbGwgcHJldmlvdXNseSBwb29sZWQgb2JqZWN0cyBmcm9tIHRoaXMgUG9vbC4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBjbGVhcigpCi0gICAgewotICAgICAgICBpZiAoX21hcCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBJdGVyYXRvciBpID0gX21hcC52YWx1ZXMoKS5pdGVyYXRvcigpOwotCi0gICAgICAgICAgICB3aGlsZSAoaS5oYXNOZXh0KCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgUG9vbExpc3QgbGlzdCA9IChQb29sTGlzdCkgaS5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICBsaXN0LmRpc2NhcmRBbGwoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgX21hcC5jbGVhcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgX3Bvb2xlZENvdW50ID0gMDsKLQotICAgICAgICBpZiAoTE9HLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgICAgICBMT0cuZGVidWcoIkNsZWFyZWQiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0aGUgbnVtYmVyIG9mIG9iamVjdCBwb29sZWQsIHRoZSBzdW0gb2YgdGhlIG51bWJlcgotICAgICAqICBvZiBvYmplY3RzIGluIHBvb2xlZCB1bmRlciBlYWNoIGtleS4gCi0gICAgICoKLSAgICAgKiAgQHNpbmNlIDEuMC4yCi0gICAgICoqLwotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgZ2V0UG9vbGVkQ291bnQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9wb29sZWRDb3VudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0aGUgbnVtYmVyIG9mIGtleXMgd2l0aGluIHRoZSBwb29sLgotICAgICAqCi0gICAgICogIEBzaW5jZSAxLjAuMgotICAgICAqKi8KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGdldEtleUNvdW50KCkKLSAgICB7Ci0gICAgICAgIGlmIChfbWFwID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gMDsKLQotICAgICAgICByZXR1cm4gX21hcC5zaXplKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFBlZm9ybXMgY3VsbGluZyBvZiB1bm5lZWRlZCBwb29sZWQgb2JqZWN0cy4KLSAgICAgKgotICAgICAqICBAc2luY2UgMS4wLjUKLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBleGVjdXRlQ2xlYW51cCgpCi0gICAgewotICAgICAgICBpZiAoX21hcCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIGlmIChMT0cuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgICAgIExPRy5kZWJ1ZygiRXhlY3V0aW5nIGNsZWFudXAgb2YgIiArIHRoaXMpOwotCi0gICAgICAgIF9nZW5lcmF0aW9uKys7Ci0KLSAgICAgICAgaW50IG9sZGVzdEdlbmVyYXRpb24gPSBfZ2VuZXJhdGlvbiAtIF93aW5kb3c7Ci0KLSAgICAgICAgaWYgKG9sZGVzdEdlbmVyYXRpb24gPCAwKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIGludCBvbGRDb3VudCA9IF9wb29sZWRDb3VudDsKLSAgICAgICAgaW50IGN1bGxlZEtleXMgPSAwOwotCi0gICAgICAgIC8vIER1cmluZyB0aGUgY2xlYW51cCwgd2Uga2VlcCB0aGUgZW50aXJlIGluc3RhbmNlIHN5bmNocm9uaXplZAotICAgICAgICAvLyAobWVhbmluZyBvdGhlciB0aHJlYWRzIHdpbGwgYmxvY2sgd2hlbiB0cnlpbmcgdG8gc3RvcmUKLSAgICAgICAgLy8gb3IgcmV0cmlldmVkIHBvb2xlZCBvYmplY3RzKS4gIEZvcnR1bmF0ZWx5LCB0aGlzCi0gICAgICAgIC8vIHNob3VsZCBiZSBwcmV0dHkgZGFybiBxdWljayEKLQotICAgICAgICBpbnQgbmV3Q291bnQgPSAwOwotCi0gICAgICAgIEl0ZXJhdG9yIGkgPSBfbWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBNYXAuRW50cnkgZSA9IChNYXAuRW50cnkpIGkubmV4dCgpOwotCi0gICAgICAgICAgICBQb29sTGlzdCBsaXN0ID0gKFBvb2xMaXN0KSBlLmdldFZhbHVlKCk7Ci0KLSAgICAgICAgICAgIGludCBjb3VudCA9IGxpc3QuY2xlYW51cChvbGRlc3RHZW5lcmF0aW9uKTsKLQotICAgICAgICAgICAgaWYgKGNvdW50ID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaS5yZW1vdmUoKTsKLSAgICAgICAgICAgICAgICBjdWxsZWRLZXlzKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgbmV3Q291bnQgKz0gY291bnQ7Ci0gICAgICAgIH0KLQotICAgICAgICBfcG9vbGVkQ291bnQgPSBuZXdDb3VudDsKLQotICAgICAgICBpZiAoTE9HLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgICAgICBMT0cuZGVidWcoIkN1bGxlZCAiICsgKG9sZENvdW50IC0gX3Bvb2xlZENvdW50KSArICIgcG9vbGVkIG9iamVjdHMgYW5kICIgKyBjdWxsZWRLZXlzICsgIiBrZXlzLiIpOwotICAgIH0KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nIHRvU3RyaW5nKCkKLSAgICB7Ci0gICAgICAgIFRvU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFRvU3RyaW5nQnVpbGRlcih0aGlzKTsKLQotICAgICAgICBidWlsZGVyLmFwcGVuZCgiZ2VuZXJhdGlvbiIsIF9nZW5lcmF0aW9uKTsKLSAgICAgICAgYnVpbGRlci5hcHBlbmQoInBvb2xlZENvdW50IiwgX3Bvb2xlZENvdW50KTsKLQotICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKiBAc2luY2UgMS4wLjYgKiovCi0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVuZGVyRGVzY3JpcHRpb24oSU1hcmt1cFdyaXRlciB3cml0ZXIpCi0gICAgewotICAgICAgICB3cml0ZXIuYmVnaW4oInRhYmxlIik7Ci0gICAgICAgIHdyaXRlci5hdHRyaWJ1dGUoImJvcmRlciIsICIxIik7Ci0gICAgICAgIHdyaXRlci5wcmludGxuKCk7Ci0KLSAgICAgICAgd3JpdGVyLmJlZ2luKCJ0ciIpOwotICAgICAgICB3cml0ZXIuYmVnaW4oInRoIik7Ci0gICAgICAgIHdyaXRlci5hdHRyaWJ1dGUoImNvbHNwYW4iLCAiMiIpOwotICAgICAgICB3cml0ZXIucHJpbnQodG9TdHJpbmcoKSk7Ci0gICAgICAgIHdyaXRlci5lbmQoKTsKLSAgICAgICAgd3JpdGVyLmVuZCgpOwotICAgICAgICB3cml0ZXIucHJpbnRsbigpOwotCi0gICAgICAgIGlmIChfbWFwICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEl0ZXJhdG9yIGkgPSBfbWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLQotICAgICAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGkubmV4dCgpOwotICAgICAgICAgICAgICAgIFBvb2xMaXN0IGxpc3QgPSAoUG9vbExpc3QpIGVudHJ5LmdldFZhbHVlKCk7Ci0KLSAgICAgICAgICAgICAgICB3cml0ZXIuYmVnaW4oInRyIik7Ci0gICAgICAgICAgICAgICAgd3JpdGVyLmJlZ2luKCJ0ZCIpOwotICAgICAgICAgICAgICAgIHdyaXRlci5wcmludChlbnRyeS5nZXRLZXkoKS50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICB3cml0ZXIuZW5kKCk7Ci0gICAgICAgICAgICAgICAgd3JpdGVyLmJlZ2luKCJ0ZCIpOwotICAgICAgICAgICAgICAgIHdyaXRlci5wcmludChsaXN0LmdldFBvb2xlZENvdW50KCkpOwotICAgICAgICAgICAgICAgIHdyaXRlci5lbmQoKTsKLSAgICAgICAgICAgICAgICB3cml0ZXIuZW5kKCk7Ci0KLSAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEludm9rZWQgZnJvbSB0aGUgY29uc3RydWN0b3IgdG8gcmVnaXN0ZXIgdGhlIGRlZmF1bHQgc2V0IG9mCi0gICAgICogIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LnV0aWwucG9vbC5JUG9vbGFibGVBZGFwdG9yfS4gIFN1YmNsYXNzZXMKLSAgICAgKiAgbWF5IG92ZXJyaWRlIHRoaXMgdG8gcmVnaXN0ZXIgYSBkaWZmZXJlbnQgc2V0LgotICAgICAqIAotICAgICAqICA8cD4KLSAgICAgKiAgUmVnaXN0ZXJzOgotICAgICAqICA8dWw+Ci0gICAgICogIDxsaT57QGxpbmsgTnVsbFBvb2xhYmxlQWRhcHRvcn0gZm9yIGNsYXNzIE9iamVjdAotICAgICAqICA8bGk+e0BsaW5rIERlZmF1bHRQb29sYWJsZUFkYXB0b3J9IGZvciBpbnRlcmZhY2Uge0BsaW5rIElQb29sYWJsZX0KLSAgICAgKiAgPGxpPntAbGluayBTdHJpbmdCdWZmZXJBZGFwdG9yfSBmb3Ige0BsaW5rIFN0cmluZ0J1ZmZlcn0KLSAgICAgKiAgPC91bD4KLSAgICAgKiAKLSAgICAgKiAgQHNpbmNlIDMuMAotICAgICAqIAotICAgICAqKi8KLQotICAgIHByb3RlY3RlZCB2b2lkIHJlZ2lzdGVyQWRhcHRvcnMoKQotICAgIHsKLSAgICAgICAgcmVnaXN0ZXJBZGFwdG9yKE9iamVjdC5jbGFzcywgbmV3IE51bGxQb29sYWJsZUFkYXB0b3IoKSk7Ci0gICAgICAgIHJlZ2lzdGVyQWRhcHRvcihJUG9vbGFibGUuY2xhc3MsIG5ldyBEZWZhdWx0UG9vbGFibGVBZGFwdG9yKCkpOwotICAgICAgICByZWdpc3RlckFkYXB0b3IoU3RyaW5nQnVmZmVyLmNsYXNzLCBuZXcgU3RyaW5nQnVmZmVyQWRhcHRvcigpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgUmVnaXN0ZXJzIGFuIGFkYXB0b3IgZm9yIGEgcGFydGljdWxhciBjbGFzcyAob3IgaW50ZXJmYWNlKS4KLSAgICAgKiAKLSAgICAgKiAgQHNpbmNlIDMuMAotICAgICAqIAotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyQWRhcHRvcihDbGFzcyByZWdpc3RyYXRpb25DbGFzcywgSVBvb2xhYmxlQWRhcHRvciBhZGFwdG9yKQotICAgIHsKLSAgICAgICAgX2FkYXB0b3JzLnJlZ2lzdGVyKHJlZ2lzdHJhdGlvbkNsYXNzLCBhZGFwdG9yKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyBhbiBhZGFwdG9yIGFwcHJvcHJpYXRlIHRvIHRoZSBvYmplY3QuCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIElQb29sYWJsZUFkYXB0b3IgZ2V0QWRhcHRvcihPYmplY3Qgb2JqZWN0KQotICAgIHsKLSAgICAgICAgcmV0dXJuIChJUG9vbGFibGVBZGFwdG9yKSBfYWRhcHRvcnMuZ2V0QWRhcHRvcihvYmplY3QuZ2V0Q2xhc3MoKSk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS91dGlsL3Bvb2wvUG9vbExpc3QuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS91dGlsL3Bvb2wvUG9vbExpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZhNTBlMy4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdXRpbC9wb29sL1Bvb2xMaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDUgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkudXRpbC5wb29sOwotCi0vKioKLSAqICBBIHdyYXBwZXIgYXJvdW5kIGEgbGlzdCBvZiBvYmplY3RzIGZvciBhIGdpdmVuIGtleSBpbiBhIHtAbGluayBQb29sfS4KLSAqICBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGlzIEZJRk8uICBUaGlzIGNsYXNzIGlzIGNsb3NlbHkKLSAqICB0aWVkIHRvIHtAbGluayBQb29sfSwgd2hpY2ggY29udHJvbHMgc3luY2hyb25pemF0aW9uIGZvciBpdC4KLSAqCi0gKiAgPHA+VGhpcyBjbGFzcywgYW5kIHtAbGluayBQb29sfSwgd2VyZSBoZWF2aWx5IHJldmlzZWQgaW4gMS4wLjUKLSAqICB0byBzdXBwb3J0IGdlbmVyYXRpb25hbCBjbGVhbmluZy4gIFRoZSBQb29sTGlzdCBhY3RzIGxpa2UgYSBmaXJzdC1pbgotICogIGZpcnN0LW91dCBxdWV1ZSBhbmQgZWFjaCBwb29sZWQgb2JqZWN0IGlzIHRhZ2dlZCB3aXRoIGEgImdlbmVyYXRpb24KLSAqICBjb3VudCIsIHByb3ZpZGVkIGJ5IHRoZSB7QGxpbmsgUG9vbH0uIFRoZSBnZW5lcmF0aW9uIGNvdW50IGlzCi0gKiAgaW5jcmVtZW50ZWQgcGVyaW9kaWNhbGx5LiAgVGhpcyBhbGxvd3MgdXMgdG8gdHJhY2ssIHJvdWdobHksCi0gKiAgaG93IG9mdGVuIGEgcG9vbGVkIG9iamVjdCBoYXMgYmVlbiBhY2Nlc3NlZDsgdW51c2VkIG9iamVjdHMgd2lsbAotICogIGJlIGJ1cmllZCB3aXRoIHJlbGF0aXZlbHkgbG93IGdlbmVyYXRpb24gY291bnRzLgotICoKLSAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiAgQHZlcnNpb24gJElkJAotICoKLSAqKi8KLQotY2xhc3MgUG9vbExpc3QKLXsKLSAgICAvKiogQHNpbmNlIDMuMCAqKi8KLQotICAgIHByaXZhdGUgUG9vbCBfcG9vbDsKLQotICAgIC8qKgotICAgICAqICBMaW5rZWQgbGlzdCBvZiBwb29sZWQgb2JqZWN0cy4KLSAgICAgKgotICAgICAqIEBzaW5jZSAxLjAuNQotICAgICAqKi8KLQotICAgIHByaXZhdGUgRW50cnkgX2ZpcnN0OwotCi0gICAgLyoqCi0gICAgICogIExpbmtlZCBsaXN0IG9mICJzcGFyZSIgRW50cmllcywgcmVhZHkgdG8gYmUgcmUtdXNlZC4KLSAgICAgKgotICAgICAqIEBzaW5jZSAxLjAuNQotICAgICAqKi8KLQotICAgIHByaXZhdGUgRW50cnkgX3NwYXJlOwotCi0gICAgLyoqCi0gICAgICogIE92ZXJhbGwgY291bnQgb2YgaXRlbXMgcG9vbGVkLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHJpdmF0ZSBpbnQgX2NvdW50OwotCi0gICAgLyoqCi0gICAgICogQSBzaW1wbGUgbGlua2VkLWxpc3QgZW50cnkgZm9yIGl0ZW1zIHN0b3JlZCBpbiB0aGUgUG9vbExpc3QuCi0gICAgICoKLSAgICAgKiBAc2luY2UgMS4wLjUKLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBFbnRyeQotICAgIHsKLSAgICAgICAgaW50IGdlbmVyYXRpb247Ci0gICAgICAgIE9iamVjdCBwb29sZWQ7Ci0gICAgICAgIEVudHJ5IG5leHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEBzaW5jZSAzLjAKLSAgICAgKiAKLSAgICAgKiovCi0gICAgCi0gICAgUG9vbExpc3QoUG9vbCBwb29sKQotICAgIHsKLSAgICAgICAgX3Bvb2wgPSBwb29sOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgcG9vbGVkIG9iamVjdHMgY3VycmVudGx5IHN0b3JlZC4KLSAgICAgKgotICAgICAqICBAc2luY2UgMS4wLjUKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgaW50IGdldFBvb2xlZENvdW50KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfY291bnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgYW4gb2JqZWN0IHByZXZpb3VzbHkgc3RvcmVkIGludG8gdGhlIGxpc3QsIG9yIG51bGwgaWYgdGhlIGxpc3QKLSAgICAgKiAgaXMgZW1wdHkuICBUaGUgcmV0dXJuZWQgb2JqZWN0IGlzIHJlbW92ZWQgZnJvbSB0aGUgbGlzdC4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBPYmplY3QgcmV0cmlldmUoKQotICAgIHsKLSAgICAgICAgaWYgKF9jb3VudCA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgX2NvdW50LS07Ci0KLSAgICAgICAgRW50cnkgZSA9IF9maXJzdDsKLSAgICAgICAgT2JqZWN0IHJlc3VsdCA9IGUucG9vbGVkOwotCi0gICAgICAgIC8vIE9rYXksIHN0b3JlIGUgaW50byB0aGUgbGlzdCBvZiBzcGFyZSBlbnRyaWVzLgotCi0gICAgICAgIF9maXJzdCA9IGUubmV4dDsKLQotICAgICAgICBlLm5leHQgPSBfc3BhcmU7Ci0gICAgICAgIF9zcGFyZSA9IGU7Ci0gICAgICAgIGUuZ2VuZXJhdGlvbiA9IDA7Ci0gICAgICAgIGUucG9vbGVkID0gbnVsbDsKLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBBZGRzIHRoZSBvYmplY3QgdG8gdGhpcyBQb29sTGlzdC4gIEFuIGFyYml0cmFyeSBudW1iZXIgb2Ygb2JqZWN0cyBjYW4gYmUKLSAgICAgKiAgc3RvcmVkLiAgVGhlIG9iamVjdHMgY2FuIGxhdGVyIGJlIHJldHJpZXZlZCB1c2luZyB7QGxpbmsgI2dldCgpfS4KLSAgICAgKiAgVGhlIGxpc3QgcmVxdWlyZXMgdGhhdCBnZW5lcmF0aW9uIG5ldmVyIGRlY3JlYXNlLiAgT24gZWFjaCBzdWJzZXF1ZW50Ci0gICAgICogIGludm9jYXRpb24sIGl0IHNob3VsZCBiZSB0aGUgc2FtZSBhcywgb3IgZ3JlYXRlciwgdGhhbiB0aGUgcHJldmlvdXMgdmFsdWUuCi0gICAgICoKLSAgICAgKiAgQHJldHVybiBUaGUgbnVtYmVyIG9mIG9iamVjdHMgc3RvcmVkIGluIHRoZSBsaXN0IChhZnRlciBhZGRpbmcgdGhlIG5ldyBvYmplY3QpLgotICAgICAqKi8KLQotICAgIHB1YmxpYyBpbnQgc3RvcmUoaW50IGdlbmVyYXRpb24sIE9iamVjdCBvYmplY3QpCi0gICAgewotICAgICAgICBFbnRyeSBlOwotCi0gICAgICAgIGlmIChfc3BhcmUgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgZSA9IG5ldyBFbnRyeSgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgZSA9IF9zcGFyZTsKLSAgICAgICAgICAgIF9zcGFyZSA9IF9zcGFyZS5uZXh0OwotICAgICAgICB9Ci0KLSAgICAgICAgZS5nZW5lcmF0aW9uID0gZ2VuZXJhdGlvbjsKLSAgICAgICAgZS5wb29sZWQgPSBvYmplY3Q7Ci0gICAgICAgIGUubmV4dCA9IF9maXJzdDsKLSAgICAgICAgX2ZpcnN0ID0gZTsKLQotICAgICAgICByZXR1cm4gKytfY291bnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEludm9rZWQgdG8gY2xlYW51cCB0aGUgbGlzdCwgZnJlZWluZyB1bm5lZWRlZCBvYmplY3RzLgotICAgICAqCi0gICAgICogQHBhcmFtIGdlbmVyYXRpb24gcG9vbGVkIG9iamVjdHMgc3RvcmVkIGluIHRoaXMgZ2VuZXJhdGlvbiBvcgotICAgICAqIGVhcmxpZXIgYXJlIHJlbGVhc2VkLgotICAgICAqCi0gICAgICogQHNpbmNlIDEuMC41Ci0gICAgICoqLwotCi0gICAgcHVibGljIGludCBjbGVhbnVwKGludCBnZW5lcmF0aW9uKQotICAgIHsKLSAgICAgICAgX3NwYXJlID0gbnVsbDsKLQotICAgICAgICBfY291bnQgPSAwOwotCi0gICAgICAgIEVudHJ5IHByZXYgPSBudWxsOwotCi0gICAgICAgIC8vIFdhbGsgdGhyb3VnaCB0aGUgbGlzdC4gIFRoZXknbGwgYmUgc29ydGVkIGJ5IGdlbmVyYXRpb24uCi0KLSAgICAgICAgRW50cnkgZSA9IF9maXJzdDsKLSAgICAgICAgd2hpbGUgKHRydWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChlID09IG51bGwpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIC8vIElmIGZvdW5kIGEgdG9vLW9sZCBlbnRyeSB0aGVuIHdlIHdhbnQgdG8KLSAgICAgICAgICAgIC8vIGRlbGV0ZSBpdC4KLQotICAgICAgICAgICAgaWYgKGUuZ2VuZXJhdGlvbiA8PSBnZW5lcmF0aW9uKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE9iamVjdCBwb29sZWQgPSBlLnBvb2xlZDsKLQotICAgICAgICAgICAgICAgIC8vIE5vdGlmeSB0aGUgb2JqZWN0IHRoYXQgaXQgaXMgYmVpbmcgZHJvcHBlZAotICAgICAgICAgICAgICAgIC8vIHRocm91Z2ggdGhlIGNyYWNrcyEKLQotICAgICAgICAgICAgICAgIF9wb29sLmdldEFkYXB0b3IocG9vbGVkKS5kaXNjYXJkRnJvbVBvb2wocG9vbGVkKTsKLQotICAgICAgICAgICAgICAgIC8vIFNldCB0aGUgbmV4dCBwb2ludGVyIG9mIHRoZSBwcmV2aW91cyBub2RlIHRvIG51bGwuCi0gICAgICAgICAgICAgICAgLy8gSWYgdGhlIHZlcnkgZmlyc3Qgbm9kZSBpbnNwZWN0ZWQgd2FzIHRvbyBvbGQsCi0gICAgICAgICAgICAgICAgLy8gc2V0IHRoZSBmaXJzdCBwb2ludGVyIHRvIG51bGwuCi0KLSAgICAgICAgICAgICAgICBpZiAocHJldiA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICBfZmlyc3QgPSBudWxsOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgcHJldi5uZXh0ID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBfY291bnQrKzsKLQotICAgICAgICAgICAgcHJldiA9IGU7Ci0gICAgICAgICAgICBlID0gZS5uZXh0OwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIF9jb3VudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAiUG9vbExpc3RbIiArIF9jb3VudCArICJdIjsKLSAgICB9Ci0KLSAgICAvKiogCi0gICAgICogIE11Y2ggbGlrZSB7QGxpbmsgI2NsZWFudXAoaW50KX0sIGJ1dCBkaXNjYXJkcyBhbGwKLSAgICAgKiAgcG9vbGVkIG9iamVjdHMuCi0gICAgICogCi0gICAgICogIEBzaW5jZSAzLjAgCi0gICAgICogCi0gICAgICoqLwotCi0gICAgdm9pZCBkaXNjYXJkQWxsKCkKLSAgICB7Ci0gICAgICAgIEVudHJ5IGUgPSBfZmlyc3Q7Ci0KLSAgICAgICAgd2hpbGUgKGUgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgT2JqZWN0IHBvb2xlZCA9IGUucG9vbGVkOwotCi0gICAgICAgICAgICBfcG9vbC5nZXRBZGFwdG9yKHBvb2xlZCkuZGlzY2FyZEZyb21Qb29sKHBvb2xlZCk7Ci0KLSAgICAgICAgICAgIGUgPSBlLm5leHQ7Ci0gICAgICAgIH0KLQotICAgICAgICBfZmlyc3QgPSBudWxsOwotICAgICAgICBfc3BhcmUgPSBudWxsOwotICAgICAgICBfY291bnQgPSAwOwotCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3V0aWwvcG9vbC9TdHJpbmdCdWZmZXJBZGFwdG9yLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdXRpbC9wb29sL1N0cmluZ0J1ZmZlckFkYXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFhODc1NC4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdXRpbC9wb29sL1N0cmluZ0J1ZmZlckFkYXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LnV0aWwucG9vbDsKLQotLyoqCi0gKiAgQWRhcHRvciBmb3Ige0BsaW5rIGphdmEubGFuZy5TdHJpbmdCdWZmZXJ9LCB0aGF0IGNsZWFycwotICogIHRoZSBidWZmZXIgYXMgaXQgaXMgcmV0dXJuZWQgdG8gdGhlIHBvb2wuCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQHNpbmNlIDMuMAotICoKLSAqKi8KLQotcHVibGljIGNsYXNzIFN0cmluZ0J1ZmZlckFkYXB0b3IgZXh0ZW5kcyBOdWxsUG9vbGFibGVBZGFwdG9yCi17Ci0KLSAgICAvKioKLSAgICAgKiAgU2V0cyB0aGUgbGVuZ3RoIG9mIHRoZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ0J1ZmZlcn0KLSAgICAgKiAgdG8gemVyby4KLSAgICAgKiAKLSAgICAgKiovCi0gICAgCi0gICAgcHVibGljIHZvaWQgcmVzZXRGb3JQb29sKE9iamVjdCBvYmplY3QpCi0gICAgewotICAgICAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gKFN0cmluZ0J1ZmZlcilvYmplY3Q7Ci0gICAgICAgIAotICAgICAgICBidWZmZXIuc2V0TGVuZ3RoKDApOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3V0aWwvcG9vbC9wYWNrYWdlLmh0bWwgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdXRpbC9wb29sL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNkZTQ5OS4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdXRpbC9wb29sL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci08IS0tICRJZCQgLS0+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlRhcGVzdHJ5OiBXZWIgQXBwbGljYXRpb24gRnJhbWV3b3JrPC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHk+Ci0KLTxwPkNsYXNzZXMgZm9yIG1hbmFnaW5nIGEgcG9vbCBvZiByZXVzYWJsZSBvYmplY3RzLiAgUmF0aGVyIHRoYW4gY3JlYXRpbmcKLWV4cGVuc2l2ZSBvYmplY3RzIGFzIG5lZWRlZCwgdGhleSBhcmUgb2J0YWluZWQgZnJvbSBhCi17QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS51dGlsLnBvb2wuUG9vbH0uICBJbnN0ZWFkIG9mIGRpc2NhcmRpbmcgdGhlbSwgdGhleQotYXJlIHJldHVybmVkIHRvIHRoZSBQb29sLiAgIFRoZSBQb29sIGNsYXNzIGlzIHRocmVhZHNhZmUgYW5kIHJlYXNvbmFibHkgZWZmaWNpZW50LgotCi1AYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwIDxhIGhyZWY9Im1haWx0bzpobHNoaXBAYXBhY2hlLm9yZyI+aGxzaGlwQGFwYWNoZS5vcmc8L2E+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS91dGlsL3Byb3AvT2dubFV0aWxzLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdXRpbC9wcm9wL09nbmxVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjg1MmZjLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS91dGlsL3Byb3AvT2dubFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkudXRpbC5wcm9wOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9nbmwuQ2xhc3NSZXNvbHZlcjsKLWltcG9ydCBvZ25sLk9nbmw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LkFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LlRhcGVzdHJ5OwotCi0vKioKLSAqICBVdGlsaXRpZXMgd3JhcHBlcnMgYXJvdW5kIDxhIGhyZWY9Imh0dHA6Ly93d3cub2dubC5vcmciPk9HTkw8L2E+LgotICogCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogIEB2ZXJzaW9uICRJZCQKLSAqICBAc2luY2UgMi4yCi0gKiAKLSAqKi8KLQotcHVibGljIGNsYXNzIE9nbmxVdGlscwotewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCBfY2FjaGUgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgcHJpdmF0ZSBPZ25sVXRpbHMoKQotICAgIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgR2V0cyBhIHBhcnNlZCBPR05MIGV4cHJlc3Npb24gZnJvbSB0aGUgaW5wdXQgc3RyaW5nLgotICAgICAqIAotICAgICAqICBAdGhyb3dzIEFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbiBpZiB0aGUgZXhwcmVzc2lvbiBjYW4gbm90IGJlIHBhcnNlZC4KLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBPYmplY3QgZ2V0UGFyc2VkRXhwcmVzc2lvbihTdHJpbmcgZXhwcmVzc2lvbikKLSAgICB7Ci0gICAgICAgIE9iamVjdCByZXN1bHQgPSBfY2FjaGUuZ2V0KGV4cHJlc3Npb24pOwotCi0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gT2dubC5wYXJzZUV4cHJlc3Npb24oZXhwcmVzc2lvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIFRhcGVzdHJ5LmZvcm1hdCgiT2dubFV0aWxzLnVuYWJsZS10by1wYXJzZS1leHByZXNzaW9uIiwgZXhwcmVzc2lvbiksCi0gICAgICAgICAgICAgICAgICAgIGV4KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgX2NhY2hlLnB1dChleHByZXNzaW9uLCByZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgUGFyc2VzIGFuZCBjYWNoZXMgdGhlIGV4cHJlc3Npb24gYW5kIHVzZXMgaXQgdG8gdXBkYXRlCi0gICAgICogIHRoZSB0YXJnZXQgb2JqZWN0IHdpdGggdGhlIHByb3ZpZGVkIHZhbHVlLgotICAgICAqIAotICAgICAqICBAdGhyb3dzIEFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbiBpZiB0aGUgZXhwcmVzc2lvbgotICAgICAqICBjYW4gbm90IGJlIHBhcnNlZCwgb3IgdGhlIHRhcmdldCBjYW4gbm90IGJlIHVwZGF0ZWQuCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldChTdHJpbmcgZXhwcmVzc2lvbiwgQ2xhc3NSZXNvbHZlciByZXNvbHZlciwgT2JqZWN0IHRhcmdldCwgT2JqZWN0IHZhbHVlKQotICAgIHsKLSAgICAgICAgc2V0KGdldFBhcnNlZEV4cHJlc3Npb24oZXhwcmVzc2lvbiksIHJlc29sdmVyLCB0YXJnZXQsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKiogCi0gICAgICogIFVwZGF0ZXMgdGhlIHRhcmdldCBvYmplY3Qgd2l0aCB0aGUgcHJvdmlkZWQgdmFsdWUuCi0gICAgICogCi0gICAgICogIEBwYXJhbSBleHByZXNzaW9uIGEgcGFyc2VkIE9HTkwgZXhwcmVzc2lvbgotICAgICAqICBAdGhyb3dzIEFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbiBpZiB0aGUgdGFyZ2V0IGNhbiBub3QgYmUgdXBkYXRlZC4KLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0KE9iamVjdCBleHByZXNzaW9uLCBDbGFzc1Jlc29sdmVyIHJlc29sdmVyLCBPYmplY3QgdGFyZ2V0LCBPYmplY3QgdmFsdWUpCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgTWFwIGNvbnRleHQgPSBPZ25sLmNyZWF0ZURlZmF1bHRDb250ZXh0KHRhcmdldCwgcmVzb2x2ZXIpOwotCi0gICAgICAgICAgICBPZ25sLnNldFZhbHVlKGV4cHJlc3Npb24sIGNvbnRleHQsIHRhcmdldCwgdmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgVGFwZXN0cnkuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAiT2dubFV0aWxzLnVuYWJsZS10by11cGRhdGUtZXhwcmVzc2lvbiIsCi0gICAgICAgICAgICAgICAgICAgICI8cGFyc2VkIGV4cHJlc3Npb24+IiwKLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LAotICAgICAgICAgICAgICAgICAgICB2YWx1ZSksCi0gICAgICAgICAgICAgICAgZXgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogICBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgZXhwcmVzc2lvbiBldmFsdWF0ZWQgYWdhaW5zdAotICAgICAqICAgdGhlIG9iamVjdC4KLSAgICAgKiAKLSAgICAgKiAgIEBwYXJhbSBleHByZXNzaW9uIGEgcGFyc2VkIE9HTkwgZXhwcmVzc2lvbgotICAgICAqICAgQHBhcmFtIG9iamVjdCB0aGUgcm9vdCBvYmplY3QKLSAgICAgKiAKLSAgICAgKiAgIEB0aHJvd3MgQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uCi0gICAgICogICBpZiB0aGUgdmFsdWUgY2FuIG5vdCBiZSBvYnRhaW5lZCBmcm9tIHRoZSBvYmplY3QuCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0KE9iamVjdCBleHByZXNzaW9uLCBDbGFzc1Jlc29sdmVyIHJlc29sdmVyLCBPYmplY3Qgb2JqZWN0KQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIE1hcCBjb250ZXh0ID0gT2dubC5jcmVhdGVEZWZhdWx0Q29udGV4dChvYmplY3QsIHJlc29sdmVyKTsKLQotICAgICAgICAgICAgcmV0dXJuIE9nbmwuZ2V0VmFsdWUoZXhwcmVzc2lvbiwgY29udGV4dCwgb2JqZWN0KTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIFRhcGVzdHJ5LmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgIk9nbmxVdGlscy51bmFibGUtdG8tcmVhZC1leHByZXNzaW9uIiwKLSAgICAgICAgICAgICAgICAgICAgIjxwYXJzZWQgZXhwcmVzc2lvbj4iLAotICAgICAgICAgICAgICAgICAgICBvYmplY3QpLAotICAgICAgICAgICAgICAgIGV4KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqICAgUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGV4cHJlc3Npb24gZXZhbHVhdGVkIGFnYWluc3QKLSAgICAgKiAgIHRoZSBvYmplY3QuCi0gICAgICogCi0gICAgICogCi0gICAgICogICBAdGhyb3dzIEFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbiBpZiB0aGUKLSAgICAgKiAgIGV4cHJlc3Npb24gY2FuIG5vdCBiZSBwYXJzZWQsIG9yIHRoZSB2YWx1ZQotICAgICAqICAgbm90IG9idGFpbmVkIGZyb20gdGhlIG9iamVjdC4KLSAgICAgKiovCi0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBnZXQoU3RyaW5nIGV4cHJlc3Npb24sIENsYXNzUmVzb2x2ZXIgcmVzb2x2ZXIsIE9iamVjdCBvYmplY3QpCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0KGdldFBhcnNlZEV4cHJlc3Npb24oZXhwcmVzc2lvbiksIHJlc29sdmVyLCBvYmplY3QpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3V0aWwvcHJvcC9Qcm9wZXJ0eUZpbmRlci5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3V0aWwvcHJvcC9Qcm9wZXJ0eUZpbmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTk3N2MzLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS91dGlsL3Byb3AvUHJvcGVydHlGaW5kZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS51dGlsLnByb3A7Ci0KLWltcG9ydCBqYXZhLmJlYW5zLkJlYW5JbmZvOwotaW1wb3J0IGphdmEuYmVhbnMuSW50cm9zcGVjdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmJlYW5zLkludHJvc3BlY3RvcjsKLWltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5BcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5UYXBlc3RyeTsKLQotLyoqCi0gKiAgCi0gKiAgVXNlcyB7QGxpbmsgamF2YS5iZWFucy5JbnRyb3NwZWN0b3J9IHRvIGdldCBiZWFuIGluZm9ybWF0aW9uCi0gKiAgYW5kIGFuYWx5emUgcHJvcGVydGllcyBmb3IgdGhvc2UgYmVhbnMuCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQHNpbmNlIDIuMgotICoKLSAqKi8KLQotcHVibGljIGNsYXNzIFByb3BlcnR5RmluZGVyCi17Ci0gICAgLyoqCi0gICAgICogIEtleWVkIG9uIGJlYW4gY2xhc3MgdmFsdWUgaXMgYWxzbyBhIE1hcC4gIElubmVyIE1hcCBpcwotICAgICAqICBrZXllZCBvbiBwcm9wZXJ0eSBuYW1lLCB2YWx1ZSBpcyBhCi0gICAgICogIHtAbGluayBQcm9wZXJ0eUluZm99LgotICAgICAqIAotICAgICAqKi8KLQotICAgIHByaXZhdGUgc3RhdGljIE1hcCBfY2FjaGUgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgLyoqCi0gICAgICogIEZpbmRzIHRoZSB7QGxpbmsgUHJvcGVydHlJbmZvfSBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcyBhbmQKLSAgICAgKiAgcHJvcGVydHkuICBSZXR1cm5zIG51bGwgaWYgdGhlIGNsYXNzIGRvZXMgbm90IGltcGxlbWVudCAKLSAgICAgKiAgc3VjaCBhIHByb3BlcnR5LgotICAgICAqIAotICAgICAqKi8KLSAgICAKLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBQcm9wZXJ0eUluZm8gZ2V0UHJvcGVydHlJbmZvKENsYXNzIGJlYW5DbGFzcywgU3RyaW5nIHByb3BlcnR5TmFtZSkKLSAgICB7Ci0gICAgICAgIE1hcCBiZWFuQ2xhc3NNYXAgPSAoTWFwKSBfY2FjaGUuZ2V0KGJlYW5DbGFzcyk7Ci0KLSAgICAgICAgaWYgKGJlYW5DbGFzc01hcCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBiZWFuQ2xhc3NNYXAgPSBidWlsZEJlYW5DbGFzc01hcChiZWFuQ2xhc3MpOwotCi0gICAgICAgICAgICBfY2FjaGUucHV0KGJlYW5DbGFzcywgYmVhbkNsYXNzTWFwKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAoUHJvcGVydHlJbmZvKSBiZWFuQ2xhc3NNYXAuZ2V0KHByb3BlcnR5TmFtZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTWFwIGJ1aWxkQmVhbkNsYXNzTWFwKENsYXNzIGJlYW5DbGFzcykKLSAgICB7Ci0gICAgICAgIE1hcCByZXN1bHQgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICBCZWFuSW5mbyBiaSA9IG51bGw7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGJpID0gSW50cm9zcGVjdG9yLmdldEJlYW5JbmZvKGJlYW5DbGFzcyk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEludHJvc3BlY3Rpb25FeGNlcHRpb24gZXgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgVGFwZXN0cnkuZm9ybWF0KCJQcm9wZXJ0eUZpbmRlci51bmFibGUtdG8taW50cm9zcGVjdC1jbGFzcyIsIGJlYW5DbGFzcy5nZXROYW1lKCkpLAotICAgICAgICAgICAgICAgIGV4KTsKLSAgICAgICAgfQotCi0gICAgICAgIFByb3BlcnR5RGVzY3JpcHRvcltdIHBkID0gYmkuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycygpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGQubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFByb3BlcnR5RGVzY3JpcHRvciBkID0gcGRbaV07Ci0KLSAgICAgICAgICAgIFByb3BlcnR5SW5mbyBpbmZvID0KLSAgICAgICAgICAgICAgICBuZXcgUHJvcGVydHlJbmZvKAotICAgICAgICAgICAgICAgICAgICBkLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgZC5nZXRQcm9wZXJ0eVR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgZC5nZXRSZWFkTWV0aG9kKCkgIT0gbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgZC5nZXRXcml0ZU1ldGhvZCgpICE9IG51bGwpOwotCi0gICAgICAgICAgICByZXN1bHQucHV0KGQuZ2V0TmFtZSgpLCBpbmZvKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3V0aWwvcHJvcC9Qcm9wZXJ0eUluZm8uamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS91dGlsL3Byb3AvUHJvcGVydHlJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmZTJhZDUuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3V0aWwvcHJvcC9Qcm9wZXJ0eUluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LnV0aWwucHJvcDsKLQotLyoqCi0gKiAgVXNlZCBieSB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS51dGlsLnByb3AuUHJvcGVydHlGaW5kZXJ9Ci0gKiAgdG8gaWRlbnRpZnkgaW5mb3JtYXRpb24gYWJvdXQgYSBwcm9wZXJ0eS4gCi0gKiAKLSAqCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogIEB2ZXJzaW9uICRJZCQKLSAqICBAc2luY2UgMi4yCi0gKgotICoqLwotCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlJbmZvCi17Ci0gICAgcHJpdmF0ZSBTdHJpbmcgX25hbWU7Ci0gICAgcHJpdmF0ZSBDbGFzcyBfdHlwZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gX3JlYWQ7Ci0gICAgcHJpdmF0ZSBib29sZWFuIF93cml0ZTsKLSAgICAKLSAgICBQcm9wZXJ0eUluZm8oU3RyaW5nIG5hbWUsIENsYXNzIHR5cGUsIGJvb2xlYW4gcmVhZCwgYm9vbGVhbiB3cml0ZSkKLSAgICB7Ci0gICAgICAgIF9uYW1lID0gbmFtZTsKLSAgICAgICAgX3R5cGUgPSB0eXBlOwotICAgICAgICBfcmVhZCA9IHJlYWQ7Ci0gICAgICAgIF93cml0ZSA9IHdyaXRlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9uYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBDbGFzcyBnZXRUeXBlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfdHlwZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1JlYWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9yZWFkOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzV3JpdGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF93cml0ZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gaXNSZWFkV3JpdGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9yZWFkICYmIF93cml0ZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS91dGlsL3Byb3AvcGFja2FnZS5odG1sIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3V0aWwvcHJvcC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkODY0YWMuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3V0aWwvcHJvcC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotPCEtLSAkSWQkIC0tPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5UYXBlc3RyeTogV2ViIEFwcGxpY2F0aW9uIEZyYW1ld29yazwvdGl0bGU+Ci08L2hlYWQ+Ci0KLQotPGJvZHk+Ci0KLTxwPkNsYXNzZXMgZm9yIG9wZXJhdGluZyBvbiBKYXZhIEJlYW5zIGFzIGNvbGxlY3Rpb25zIG9mIG5hbWVkIHByb3BlcnRpZXMuCi1QcmlvciB0byByZWxlYXNlIDIuMiwgdGhlcmUgd2FzIG11Y2ggbW9yZSBoZXJlLCBidXQgd2l0aCAyLjIKLVRhcGVzdHJ5IHN3aXRjaCB0byB1c2UgdGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cub2dubC5vcmciPk9iamVjdCBHcmFwaAotTmF2aWdhdGlvbiBMaWJyYXJ5PC9hPiB3aGljaCBpcyBtdWNoIG1vcmUgcG93ZXJmdWwuCi0KLUBhdXRob3IgSG93YXJkIExld2lzIFNoaXAgPGEgaHJlZj0ibWFpbHRvOmhsc2hpcEBhcGFjaGUub3JnIj5obHNoaXBAYXBhY2hlLm9yZzwvYT4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3V0aWwveG1sL0Jhc2VSdWxlLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdXRpbC94bWwvQmFzZVJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZkNzY2YS4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdXRpbC94bWwvQmFzZVJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LnV0aWwueG1sOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5UYXBlc3RyeTsKLWltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOwotCi0vKioKLSAqIEJhc2UgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkudXRpbC54bWwuSVJ1bGV9IHRoYXQKLSAqIGRvZXMgbm90aGluZy4KLSAqCi0gKiBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiBAdmVyc2lvbiAkSWQkCi0gKiBAc2luY2UgMy4wCi0gKiovCi1wdWJsaWMgY2xhc3MgQmFzZVJ1bGUgaW1wbGVtZW50cyBJUnVsZQotewotCXByb3RlY3RlZCBTdHJpbmcgZ2V0QXR0cmlidXRlKEF0dHJpYnV0ZXMgYXR0cmlidXRlcywgU3RyaW5nIG5hbWUpCi0JewotCQlpbnQgY291bnQgPSBhdHRyaWJ1dGVzLmdldExlbmd0aCgpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLQkJewotCQkJU3RyaW5nIGF0dHJpYnV0ZU5hbWUgPSBhdHRyaWJ1dGVzLmdldExvY2FsTmFtZShpKTsKLSAgICAgICAgCQotCQkJaWYgKFRhcGVzdHJ5LmlzQmxhbmsoYXR0cmlidXRlTmFtZSkpCi0JCQkJYXR0cmlidXRlTmFtZSA9IGF0dHJpYnV0ZXMuZ2V0UU5hbWUoaSk7Ci0gICAgICAgIAkKLQkJCWlmIChhdHRyaWJ1dGVOYW1lLmVxdWFscyhuYW1lKSkKLQkJCQlyZXR1cm4gYXR0cmlidXRlcy5nZXRWYWx1ZShpKTsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChSdWxlRGlyZWN0ZWRQYXJzZXIgcGFyc2VyLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpCi0gICAgewotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZW5kRWxlbWVudChSdWxlRGlyZWN0ZWRQYXJzZXIgcGFyc2VyKQotICAgIHsKLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNvbnRlbnQoUnVsZURpcmVjdGVkUGFyc2VyIHBhcnNlciwgU3RyaW5nIGNvbnRlbnQpCi0gICAgewotCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdXRpbC94bWwvRG9jdW1lbnRQYXJzZUV4Y2VwdGlvbi5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3V0aWwveG1sL0RvY3VtZW50UGFyc2VFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU2MDQzZi4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdXRpbC94bWwvRG9jdW1lbnRQYXJzZUV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LnV0aWwueG1sOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5BcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JTG9jYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVzb3VyY2VMb2NhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LkxvY2F0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uOwotCi0vKioKLSAqICBFeGNlcHRpb24gdGhyb3duIGlmIHRoZXJlIGlzIGFueSBraW5kIG9mIGVycm9yIHBhcnNpbmcgdGhlCi0gKiAgYW4gWE1MIGRvY3VtZW50LiAKLSAqCi0gKiAgQHNlZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LnBhcnNlLlNwZWNpZmljYXRpb25QYXJzZXIKLSAqCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogIEB2ZXJzaW9uICRJZCQKLSAqICBAc2luY2UgMC4yLjEwCi0gKgotICoqLwotCi1wdWJsaWMgY2xhc3MgRG9jdW1lbnRQYXJzZUV4Y2VwdGlvbiBleHRlbmRzIEFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbgotewotICAgIHByaXZhdGUgSVJlc291cmNlTG9jYXRpb24gX2RvY3VtZW50TG9jYXRpb247Ci0KLSAgICBwdWJsaWMgRG9jdW1lbnRQYXJzZUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIHJvb3RDYXVzZSkKLSAgICB7Ci0gICAgICAgIHRoaXMobWVzc2FnZSwgbnVsbCwgbnVsbCwgcm9vdENhdXNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRG9jdW1lbnRQYXJzZUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgSVJlc291cmNlTG9jYXRpb24gZG9jdW1lbnRMb2NhdGlvbikKLSAgICB7Ci0gICAgICAgIHRoaXMobWVzc2FnZSwgZG9jdW1lbnRMb2NhdGlvbiwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIERvY3VtZW50UGFyc2VFeGNlcHRpb24oCi0gICAgICAgIFN0cmluZyBtZXNzYWdlLAotICAgICAgICBJUmVzb3VyY2VMb2NhdGlvbiBkb2N1bWVudExvY2F0aW9uLAotICAgICAgICBUaHJvd2FibGUgcm9vdENhdXNlKQotICAgIHsKLSAgICAgICAgdGhpcyhtZXNzYWdlLCBkb2N1bWVudExvY2F0aW9uLCBudWxsLCByb290Q2F1c2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBEb2N1bWVudFBhcnNlRXhjZXB0aW9uKAotICAgICAgICBTdHJpbmcgbWVzc2FnZSwKLSAgICAgICAgSVJlc291cmNlTG9jYXRpb24gZG9jdW1lbnRMb2NhdGlvbiwKLSAgICAgICAgSUxvY2F0aW9uIGxvY2F0aW9uLAotICAgICAgICBUaHJvd2FibGUgcm9vdENhdXNlKQotICAgIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSwgbnVsbCwgbG9jYXRpb24sIHJvb3RDYXVzZSk7Ci0KLSAgICAgICAgX2RvY3VtZW50TG9jYXRpb24gPSBkb2N1bWVudExvY2F0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyBEb2N1bWVudFBhcnNlRXhjZXB0aW9uKAotICAgICAgICBTdHJpbmcgbWVzc2FnZSwKLSAgICAgICAgSVJlc291cmNlTG9jYXRpb24gZG9jdW1lbnRMb2NhdGlvbiwKLSAgICAgICAgU0FYUGFyc2VFeGNlcHRpb24gcm9vdENhdXNlKQotICAgIHsKLSAgICAgICAgdGhpcygKLSAgICAgICAgICAgIG1lc3NhZ2UsCi0gICAgICAgICAgICBkb2N1bWVudExvY2F0aW9uLAotICAgICAgICAgICAgcm9vdENhdXNlID09IG51bGwKLSAgICAgICAgICAgICAgICB8fCBkb2N1bWVudExvY2F0aW9uID09IG51bGwKLSAgICAgICAgICAgICAgICAgICAgPyBudWxsCi0gICAgICAgICAgICAgICAgICAgIDogbmV3IExvY2F0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnRMb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RDYXVzZS5nZXRMaW5lTnVtYmVyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICByb290Q2F1c2UuZ2V0Q29sdW1uTnVtYmVyKCkpLAotICAgICAgICAgICAgcm9vdENhdXNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRG9jdW1lbnRQYXJzZUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkKLSAgICB7Ci0gICAgICAgIHRoaXMobWVzc2FnZSwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIERvY3VtZW50UGFyc2VFeGNlcHRpb24oVGhyb3dhYmxlIHJvb3RDYXVzZSkKLSAgICB7Ci0gICAgICAgIHRoaXMocm9vdENhdXNlLmdldE1lc3NhZ2UoKSwgcm9vdENhdXNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRG9jdW1lbnRQYXJzZUV4Y2VwdGlvbihTQVhQYXJzZUV4Y2VwdGlvbiByb290Q2F1c2UpCi0gICAgewotICAgICAgICB0aGlzKHJvb3RDYXVzZS5nZXRNZXNzYWdlKCksIChUaHJvd2FibGUpIHJvb3RDYXVzZSk7Ci0gICAgfQotCi0gICAgcHVibGljIElSZXNvdXJjZUxvY2F0aW9uIGdldERvY3VtZW50TG9jYXRpb24oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9kb2N1bWVudExvY2F0aW9uOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdXRpbC94bWwvSVJ1bGUuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS91dGlsL3htbC9JUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDBlYTQ0Li4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS91dGlsL3htbC9JUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkudXRpbC54bWw7Ci0KLWltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOwotCi0vKioKLSAqIEEgcnVsZSB0aGF0IG1heSBiZSBwdXNoZWQgb250byB0aGUge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkudXRpbC54bWwuUnVsZURpcmVjdGVkUGFyc2VyfSdzCi0gKiBydWxlIHN0YWNrLiAgQSBydWxlIGlzIGFzc29jaWF0ZWQgd2l0aCBhbiBYTUwgZWxlbWVudC4gIEl0IGlzIHB1c2hlZCBvbnRvIHRoZSBzdGFjayB3aGVuIHRoZQotICogb3BlbiB0YWcgZm9yIHRoZSBydWxlIGlzIGVuY291bnRlcmVkLiAgSXQgaXMgaXMgcG9wcGVkIG9mZiB0aGUgc3RhY2sgYWZ0ZXIgdGhlIGVuZC10YWcgaXMKLSAqIGVuY291bnRlcmVkLiAgSXQgaXMgbm90aWZpZWQgYWJvdXQgYW55IHRleHQgaXQgZGlyZWN0bHkgd3JhcHMgYXJvdW5kLgotICogCi0gKiA8cD5SdWxlcyBzaG91bGQgYmUgc3RhdGVsZXNzLCBiZWNhdXNlIGEgcnVsZSBpbnN0YW5jZSBtYXkgYXBwZWFyIG11bHRpcGxlIHRpbWVzIGluIHRoZQotICogcnVsZSBzdGFjayAoaWYgZWxlbWVudHMgY2FuIGJlIHJlY3VzaXZlbHkgbmVzdGVkKS4KLSAqCi0gKiBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiBAdmVyc2lvbiAkSWQkCi0gKiBAc2luY2UgMy4wCi0gKiovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSVJ1bGUKLXsKLQkvKioKLQkgKiBJbnZva2VkIGp1c3QgYWZ0ZXIgdGhlIHJ1bGUgaXMgcHVzaGVkIG9udG8gdGhlIHJ1bGUgc3RhY2suICBUeXBpY2FsbHksIGEgUnVsZSB3aWxsCi0JICogIHVzZSB0aGUgaW5mb3JtYXRpb24gdG8gY3JlYXRlIGEgbmV3IG9iamVjdCBhbmQgcHVzaCBpdCBvbnRvIHRoZSBvYmplY3Qgc3RhY2suCi0JICogIElmIHRoZSBydWxlIG5lZWRzIHRvIGtub3cgYWJvdXQgdGhlIGVsZW1lbnQgKHJhdGhlciB0aGFuIHRoZSBhdHRyaWJ1dGVzKSwgaXQKLQkgKiAgbWF5IG9idGFpbiB0aGUgVVJJLCBsb2NhbE5hbWUgYW5kIHFOYW1lIGZyb20gdGhlIHBhcnNlci4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoUnVsZURpcmVjdGVkUGFyc2VyIHBhcnNlciwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKTsKLQkKLQkvKioKLQkgKiBJbnZva2VkIGp1c3QgYWZ0ZXIgdGhlIHJ1bGUgaXMgcG9wcGVkIG9mZiB0aGUgcnVsZSBzdGFjay4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlbmRFbGVtZW50KFJ1bGVEaXJlY3RlZFBhcnNlciBwYXJzZXIpOwotCQotCQotCS8qKgotCSAqIEludm9rZWQgd2hlbiByZWFsIGNvbnRlbnQgaXMgZm91bmQuICBUaGUgcGFyc2VyIGlzIHJlc3BvbnNpYmxlIGZvciBhZ2dyZWdhdGluZwotCSAqIGFsbCBjb250ZW50IHByb3ZpZGVkIGJ5IHRoZSB1bmRlcmx5aW5nIFNBWCBwYXJzZXIgaW50byBhIHNpbmdsZSBzdHJpbmcuCi0JICovCi0JCi0JcHVibGljIHZvaWQgY29udGVudChSdWxlRGlyZWN0ZWRQYXJzZXIgcGFyc2VyLCBTdHJpbmcgY29udGVudCk7Ci19CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdXRpbC94bWwvSW52YWxpZFN0cmluZ0V4Y2VwdGlvbi5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3V0aWwveG1sL0ludmFsaWRTdHJpbmdFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI5Yjc5My4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdXRpbC94bWwvSW52YWxpZFN0cmluZ0V4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkudXRpbC54bWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklMb2NhdGFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JTG9jYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVzb3VyY2VMb2NhdGlvbjsKLQotLyoqCi0gKiAgRXhjZXB0aW9uIHRocm93biBpZiB0aGVyZSBpcyBhbnkga2luZCBvZiBlcnJvciB2YWxpZGF0aW5nIGEgc3RyaW5nCi0gKiAgZHVyaW5nIGRvY3VtZW50IHBhcnNpbmcKLSAqCi0gKiAgQGF1dGhvciBHZW9mZnJleSBMb25nbWFuCi0gKiAgQHZlcnNpb24gJElkJAotICogIEBzaW5jZSAyLjIKLSAqCi0gKiovCi0KLXB1YmxpYyBjbGFzcyBJbnZhbGlkU3RyaW5nRXhjZXB0aW9uIGV4dGVuZHMgRG9jdW1lbnRQYXJzZUV4Y2VwdGlvbiBpbXBsZW1lbnRzIElMb2NhdGFibGUKLXsKLSAgICBwcml2YXRlIFN0cmluZyBfaW52YWxpZFN0cmluZzsKLQotICAgIHB1YmxpYyBJbnZhbGlkU3RyaW5nRXhjZXB0aW9uKAotICAgICAgICBTdHJpbmcgbWVzc2FnZSwKLSAgICAgICAgU3RyaW5nIGludmFsaWRTdHJpbmcsCi0gICAgICAgIElSZXNvdXJjZUxvY2F0aW9uIHJlc291cmNlTG9jYXRpb24pCi0gICAgewotICAgICAgICBzdXBlcihtZXNzYWdlLCByZXNvdXJjZUxvY2F0aW9uKTsKLQotICAgICAgICBfaW52YWxpZFN0cmluZyA9IGludmFsaWRTdHJpbmc7Ci0gICAgfQotCi0gICAgcHVibGljIEludmFsaWRTdHJpbmdFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFN0cmluZyBpbnZhbGlkU3RyaW5nLCBJTG9jYXRpb24gbG9jYXRpb24pCi0gICAgewotICAgICAgICBzdXBlcihtZXNzYWdlLCBsb2NhdGlvbiA9PSBudWxsID8gbnVsbCA6IGxvY2F0aW9uLmdldFJlc291cmNlTG9jYXRpb24oKSwgbG9jYXRpb24sIG51bGwpOwotCi0gICAgICAgIF9pbnZhbGlkU3RyaW5nID0gaW52YWxpZFN0cmluZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEludmFsaWRTdHJpbmcoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9pbnZhbGlkU3RyaW5nOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS91dGlsL3htbC9SdWxlRGlyZWN0ZWRQYXJzZXIuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS91dGlsL3htbC9SdWxlRGlyZWN0ZWRQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI3OTE3Mi4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdXRpbC94bWwvUnVsZURpcmVjdGVkUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ODQgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkudXRpbC54bWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LkFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklMb2NhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZXNvdXJjZUxvY2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuTG9jYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5UYXBlc3RyeTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnV0aWwuUmVnZXhwTWF0Y2hlcjsKLWltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotaW1wb3J0IG9yZy54bWwuc2F4LkxvY2F0b3I7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuRGVmYXVsdEhhbmRsZXI7Ci0KLS8qKgotICogQSBzaW1wbGlmaWVkIHZlcnNpb24gb2Yge0BsaW5rIG9yZy5hcGFjaGUuY29tbW9ucy5kaWdlc3Rlci5EaWdlc3Rlcn0uCi0gKiBUaGlzIHZlcnNpb24gaXMgd2l0aG91dCBhcyBtYW55IGJlbGxzIGFuZCB3aGlzdGxlcyBidXQgaGFzIHNvbWUga2V5IGZlYXR1cmVzIG5lZWRlZCB3aGVuIHBhcnNpbmcKLSAqIGEgZG9jdW1lbnQgKHJhdGhlciB0aGFuIGEgY29uZmlndXJhdGlvbiBmaWxlKToKLSAqIDxicj4KLSAqIDx1bD4KLSAqICAgPGxpPk5vdGlmaWNhdGlvbnMgZm9yIGVhY2ggYml0IG9mIHRleHQ8L3VsPgotICogICA8bGk+VHJhY2tpbmcgb2YgZXhhY3QgbG9jYXRpb24gd2l0aGluIHRoZSBkb2N1bWVudC48L2xpPgotICogPC91bD4KLSAqIAotICogPHA+Ci0gKiBMaWtlIERpZ2VzdGVyLCB0aGVyZSdzIGFuIG9iamVjdCBzdGFjayBhbmQgYSBydWxlIHN0YWNrLiAgVGhlIHJ1bGVzIGFyZSBtdWNoCi0gKiBzaW1wbGVyIChtb3JlIGNvZGluZyksIGluIHRoYXQgdGhlcmUncyBhIG9uZS10by1vbmUgcmVsYXRpb25zaGlwIGJldHdlZW4KLSAqIGFuIGVsZW1lbnQgYW5kIGEgcnVsZS4KLSAqCi0gKiA8cD4KLSAqICBCYXNlZCBvbiBTQVgyLgotICogCi0gKiBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiBAdmVyc2lvbiAkSWQkCi0gKiBAc2luY2UgMy4wCi0gKi8KLQotcHVibGljIGNsYXNzIFJ1bGVEaXJlY3RlZFBhcnNlciBleHRlbmRzIERlZmF1bHRIYW5kbGVyCi17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIExPRyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFJ1bGVEaXJlY3RlZFBhcnNlci5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIElSZXNvdXJjZUxvY2F0aW9uIF9kb2N1bWVudExvY2F0aW9uOwotICAgIHByaXZhdGUgTGlzdCBfcnVsZVN0YWNrID0gbmV3IEFycmF5TGlzdCgpOwotICAgIHByaXZhdGUgTGlzdCBfb2JqZWN0U3RhY2sgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgcHJpdmF0ZSBPYmplY3QgX2RvY3VtZW50T2JqZWN0OwotCi0gICAgcHJpdmF0ZSBMb2NhdG9yIF9sb2NhdG9yOwotICAgIHByaXZhdGUgaW50IF9saW5lID0gLTE7Ci0gICAgcHJpdmF0ZSBpbnQgX2NvbHVtbiA9IC0xOwotICAgIHByaXZhdGUgSUxvY2F0aW9uIF9sb2NhdGlvbjsKLQotICAgIHByaXZhdGUgc3RhdGljIFNBWFBhcnNlckZhY3RvcnkgX3BhcnNlckZhY3Rvcnk7Ci0gICAgcHJpdmF0ZSBTQVhQYXJzZXIgX3BhcnNlcjsKLQotICAgIHByaXZhdGUgUmVnZXhwTWF0Y2hlciBfbWF0Y2hlcjsKLQotICAgIHByaXZhdGUgU3RyaW5nIF91cmk7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgX2xvY2FsTmFtZTsKLSAgICBwcml2YXRlIFN0cmluZyBfcU5hbWU7Ci0KLSAgICAvKioKLSAgICAgKiAgTWFwIG9mIHtAbGluayBJUnVsZX0ga2V5ZWQgb24gdGhlIGxvY2FsIG5hbWUKLSAgICAgKiAgb2YgdGhlIGVsZW1lbnQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBNYXAgX3J1bGVNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgLyoqCi0gICAgICogVXNlZCB0byBhY2N1bWxhdGUgY29udGVudCBwcm92aWRlZCBieQotICAgICAqIHtAbGluayBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlciNjaGFyYWN0ZXJzKGNoYXJbXSwgaW50LCBpbnQpfS4KLSAgICAgKi8KLQotICAgIHByaXZhdGUgU3RyaW5nQnVmZmVyIF9jb250ZW50QnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0gICAgLyoqCi0gICAgICogIE1hcCBvZiBwYXRocyB0byBleHRlcm5hbCBlbnRpdGllcyAoc3VjaCBhcyB0aGUgRFREKSBrZXllZCBvbiBwdWJsaWMgaWQuCi0gICAgICovCi0KLSAgICBwcml2YXRlIE1hcCBfZW50aXRpZXMgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgcHVibGljIE9iamVjdCBwYXJzZShJUmVzb3VyY2VMb2NhdGlvbiBkb2N1bWVudExvY2F0aW9uKQotICAgIHsKLSAgICAgICAgaWYgKExPRy5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICAgICAgTE9HLmRlYnVnKCJQYXJzaW5nOiAiICsgZG9jdW1lbnRMb2NhdGlvbik7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIF9kb2N1bWVudExvY2F0aW9uID0gZG9jdW1lbnRMb2NhdGlvbjsKLQotICAgICAgICAgICAgVVJMIHVybCA9IGRvY3VtZW50TG9jYXRpb24uZ2V0UmVzb3VyY2VVUkwoKTsKLQotICAgICAgICAgICAgaWYgKHVybCA9PSBudWxsKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBEb2N1bWVudFBhcnNlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICBUYXBlc3RyeS5mb3JtYXQoIlJ1bGVEcml2ZW5QYXJzZXIucmVzb3VyY2UtbWlzc2luZyIsIGRvY3VtZW50TG9jYXRpb24pLAotICAgICAgICAgICAgICAgICAgICBkb2N1bWVudExvY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICBudWxsLAotICAgICAgICAgICAgICAgICAgICBudWxsKTsKLQotICAgICAgICAgICAgcmV0dXJuIHBhcnNlKHVybCk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBfZG9jdW1lbnRMb2NhdGlvbiA9IG51bGw7Ci0gICAgICAgICAgICBfcnVsZVN0YWNrLmNsZWFyKCk7Ci0gICAgICAgICAgICBfb2JqZWN0U3RhY2suY2xlYXIoKTsKLSAgICAgICAgICAgIF9kb2N1bWVudE9iamVjdCA9IG51bGw7Ci0KLSAgICAgICAgICAgIF91cmkgPSBudWxsOwotICAgICAgICAgICAgX2xvY2FsTmFtZSA9IG51bGw7Ci0gICAgICAgICAgICBfcU5hbWUgPSBudWxsOwotCi0gICAgICAgICAgICBfbGluZSA9IC0xOwotICAgICAgICAgICAgX2NvbHVtbiA9IC0xOwotICAgICAgICAgICAgX2xvY2F0aW9uID0gbnVsbDsKLSAgICAgICAgICAgIF9sb2NhdG9yID0gbnVsbDsKLQotICAgICAgICAgICAgX2NvbnRlbnRCdWZmZXIuc2V0TGVuZ3RoKDApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIE9iamVjdCBwYXJzZShVUkwgdXJsKQotICAgIHsKLSAgICAgICAgaWYgKF9wYXJzZXIgPT0gbnVsbCkKLSAgICAgICAgICAgIF9wYXJzZXIgPSBjb25zdHJ1Y3RQYXJzZXIoKTsKLQotICAgICAgICBJbnB1dFN0cmVhbSBzdHJlYW0gPSBudWxsOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBzdHJlYW0gPSB1cmwub3BlblN0cmVhbSgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBleCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IERvY3VtZW50UGFyc2VFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgVGFwZXN0cnkuZm9ybWF0KCJSdWxlRHJpdmVuUGFyc2VyLnVuYWJsZS10by1vcGVuLXJlc291cmNlIiwgdXJsKSwKLSAgICAgICAgICAgICAgICBfZG9jdW1lbnRMb2NhdGlvbiwKLSAgICAgICAgICAgICAgICBudWxsLAotICAgICAgICAgICAgICAgIGV4KTsKLSAgICAgICAgfQotCi0gICAgICAgIElucHV0U291cmNlIHNvdXJjZSA9IG5ldyBJbnB1dFNvdXJjZShzdHJlYW0pOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBfcGFyc2VyLnBhcnNlKHNvdXJjZSwgdGhpcyk7Ci0KLSAgICAgICAgICAgIHN0cmVhbS5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBEb2N1bWVudFBhcnNlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIFRhcGVzdHJ5LmZvcm1hdCgiUnVsZURyaXZlblBhcnNlci5wYXJzZS1lcnJvciIsIHVybCwgZXguZ2V0TWVzc2FnZSgpKSwKLSAgICAgICAgICAgICAgICBfZG9jdW1lbnRMb2NhdGlvbiwKLSAgICAgICAgICAgICAgICBnZXRMb2NhdGlvbigpLAotICAgICAgICAgICAgICAgIGV4KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChMT0cuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgICAgIExPRy5kZWJ1ZygiRG9jdW1lbnQgcGFyc2VkIGFzOiAiICsgX2RvY3VtZW50T2JqZWN0KTsKLQotICAgICAgICByZXR1cm4gX2RvY3VtZW50T2JqZWN0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4ge0BsaW5rIElMb2NhdGlvbn0gcmVwcmVzZW50aW5nIHRoZQotICAgICAqIGN1cnJlbnQgcG9zaXRpb24gd2l0aGluIHRoZSBkb2N1bWVudCAoZGVwZW5kaW5nCi0gICAgICogb24gdGhlIHBhcnNlciwgdGhpcyBtYXkgYmUgYWNjdXJhdGUgdG8KLSAgICAgKiBjb2x1bW4gbnVtYmVyIGxldmVsKS4KLSAgICAgKi8KLQotICAgIHB1YmxpYyBJTG9jYXRpb24gZ2V0TG9jYXRpb24oKQotICAgIHsKLSAgICAgICAgaWYgKF9sb2NhdG9yID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICBpbnQgbGluZSA9IF9sb2NhdG9yLmdldExpbmVOdW1iZXIoKTsKLSAgICAgICAgaW50IGNvbHVtbiA9IF9sb2NhdG9yLmdldENvbHVtbk51bWJlcigpOwotCi0gICAgICAgIGlmIChfbGluZSAhPSBsaW5lIHx8IF9jb2x1bW4gIT0gY29sdW1uKQotICAgICAgICB7Ci0gICAgICAgICAgICBfbG9jYXRpb24gPSBudWxsOwotICAgICAgICAgICAgX2xpbmUgPSBsaW5lOwotICAgICAgICAgICAgX2NvbHVtbiA9IGNvbHVtbjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChfbG9jYXRpb24gPT0gbnVsbCkKLSAgICAgICAgICAgIF9sb2NhdGlvbiA9IG5ldyBMb2NhdGlvbihfZG9jdW1lbnRMb2NhdGlvbiwgX2xpbmUsIF9jb2x1bW4pOwotCi0gICAgICAgIHJldHVybiBfbG9jYXRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHVzaGVzIGFuIG9iamVjdCBvbnRvIHRoZSBvYmplY3Qgc3RhY2suICBUaGUgZmlyc3Qgb2JqZWN0Ci0gICAgICogcHVzaGVkIGlzIHRoZSAiZG9jdW1lbnQgb2JqZWN0IiwgdGhlIHJvb3Qgb2JqZWN0IHJldHVybmVkCi0gICAgICogYnkgdGhlIHBhcnNlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHB1c2goT2JqZWN0IG9iamVjdCkKLSAgICB7Ci0gICAgICAgIGlmIChfZG9jdW1lbnRPYmplY3QgPT0gbnVsbCkKLSAgICAgICAgICAgIF9kb2N1bWVudE9iamVjdCA9IG9iamVjdDsKLQotICAgICAgICBwdXNoKF9vYmplY3RTdGFjaywgb2JqZWN0LCAib2JqZWN0IHN0YWNrIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdG9wIG9iamVjdCBvbiB0aGUgb2JqZWN0IHN0YWNrLgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgcGVlaygpCi0gICAgewotICAgICAgICByZXR1cm4gcGVlayhfb2JqZWN0U3RhY2ssIDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gb2JqZWN0IHdpdGhpbiB0aGUgb2JqZWN0IHN0YWNrLCBhdCBkZXB0aC4KLSAgICAgKiBEZXB0aCAwIGlzIHRoZSB0b3Agb2JqZWN0LCBkZXB0aCAxIGlzIHRoZSBuZXh0LXRvLXRvcCBvYmplY3QsCi0gICAgICogZXRjLgotICAgICAqLwotCi0gICAgcHVibGljIE9iamVjdCBwZWVrKGludCBkZXB0aCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBwZWVrKF9vYmplY3RTdGFjaywgZGVwdGgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgYW5kIHJldHVybnMgdGhlIHRvcCBvYmplY3Qgb24gdGhlIG9iamVjdCBzdGFjay4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IHBvcCgpCi0gICAgewotICAgICAgICByZXR1cm4gcG9wKF9vYmplY3RTdGFjaywgIm9iamVjdCBzdGFjayIpOwotICAgIH0KLQotICAgIHByaXZhdGUgT2JqZWN0IHBvcChMaXN0IGxpc3QsIFN0cmluZyBuYW1lKQotICAgIHsKLSAgICAgICAgT2JqZWN0IHJlc3VsdCA9IGxpc3QucmVtb3ZlKGxpc3Quc2l6ZSgpIC0gMSk7Ci0KLSAgICAgICAgaWYgKExPRy5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICAgICAgTE9HLmRlYnVnKCJQb3BwZWQgIiArIHJlc3VsdCArICIgb2ZmICIgKyBuYW1lICsgIiAoYXQgIiArIGdldExvY2F0aW9uKCkgKyAiKSIpOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBPYmplY3QgcGVlayhMaXN0IGxpc3QsIGludCBkZXB0aCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBsaXN0LmdldChsaXN0LnNpemUoKSAtIDEgLSBkZXB0aCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHB1c2goTGlzdCBsaXN0LCBPYmplY3Qgb2JqZWN0LCBTdHJpbmcgbmFtZSkKLSAgICB7Ci0gICAgICAgIGlmIChMT0cuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgICAgIExPRy5kZWJ1ZygiUHVzaGluZyAiICsgb2JqZWN0ICsgIiBvbnRvICIgKyBuYW1lICsgIiAoYXQgIiArIGdldExvY2F0aW9uKCkgKyAiKSIpOwotCi0gICAgICAgIGxpc3QuYWRkKG9iamVjdCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHVzaGVzIGEgbmV3IHJ1bGUgb250byB0aGUgcnVsZSBzdGFjay4KLSAgICAgKi8KLQotICAgIHByb3RlY3RlZCB2b2lkIHB1c2hSdWxlKElSdWxlIHJ1bGUpCi0gICAgewotICAgICAgICBwdXNoKF9ydWxlU3RhY2ssIHJ1bGUsICJydWxlIHN0YWNrIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdG9wIHJ1bGUgb24gdGhlIHN0YWNrLgotICAgICAqLwotCi0gICAgcHJvdGVjdGVkIElSdWxlIHBlZWtSdWxlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoSVJ1bGUpIHBlZWsoX3J1bGVTdGFjaywgMCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIElSdWxlIHBvcFJ1bGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChJUnVsZSkgcG9wKF9ydWxlU3RhY2ssICJydWxlIHN0YWNrIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkUnVsZShTdHJpbmcgbG9jYWxFbGVtZW50TmFtZSwgSVJ1bGUgcnVsZSkKLSAgICB7Ci0gICAgICAgIF9ydWxlTWFwLnB1dChsb2NhbEVsZW1lbnROYW1lLCBydWxlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgUmVnaXN0ZXJzCi0gICAgICogIGEgcHVibGljIGlkIGFuZCBjb3JyZXNwb25kaW5nIGlucHV0IHNvdXJjZS4gIEdlbmVyYWxseSwgdGhlIHNvdXJjZQotICAgICAqICBpcyBhIHdyYXBwZXIgYXJvdW5kIGFuIGlucHV0IHN0cmVhbSB0byBhIHBhY2thZ2UgcmVzb3VyY2UuCi0gICAgICoKLSAgICAgKiAgQHBhcmFtIHB1YmxpY0lkIHRoZSBwdWJsaWMgaWRlbnRpZmllciB0byBiZSByZWdpc3RlcnJlZCwgZ2VuZXJhbGx5Ci0gICAgICogIHRoZSBwdWJsaWNJZCBvZiBhIERURCByZWxhdGVkIHRvIHRoZSBkb2N1bWVudCBiZWluZyBwYXJzZWQKLSAgICAgKiAgQHBhcmFtIGVudGl0eVBhdGggdGhlIHJlc291cmNlIHBhdGggb2YgdGhlIGVudGl0eSwgdHlwaWNhbGx5IGEgRFRECi0gICAgICogIGZpbGUuICBSZWxhdGl2ZSBmaWxlcyBuYW1lcyBhcmUgZXhwZWN0ZWQgdG8gYmUgc3RvcmVkIGluIHRoZSBzYW1lIHBhY2thZ2UKLSAgICAgKiAgYXMgdGhlIGNsYXNzIGZpbGUsIG90aGVyd2lzZSBhIGxlYWRpbmcgc2xhc2ggaXMgYW4gYWJzb2x1dGUgcGF0aG5hbWUKLSAgICAgKiAgd2l0aGluIHRoZSBjbGFzc3BhdGguCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCByZWdpc3RlckVudGl0eShTdHJpbmcgcHVibGljSWQsIFN0cmluZyBlbnRpdHlQYXRoKQotICAgIHsKLSAgICAgICAgaWYgKExPRy5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICAgICAgTE9HLmRlYnVnKCJSZWdpc3RlcmluZyAiICsgcHVibGljSWQgKyAiIGFzICIgKyBlbnRpdHlQYXRoKTsKLQotICAgICAgICBpZiAoX2VudGl0aWVzID09IG51bGwpCi0gICAgICAgICAgICBfZW50aXRpZXMgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgICAgIF9lbnRpdGllcy5wdXQocHVibGljSWQsIGVudGl0eVBhdGgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBJUnVsZSBzZWxlY3RSdWxlKFN0cmluZyBsb2NhbE5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykKLSAgICB7Ci0gICAgICAgIElSdWxlIHJ1bGUgPSAoSVJ1bGUpIF9ydWxlTWFwLmdldChsb2NhbE5hbWUpOwotCi0gICAgICAgIGlmIChydWxlID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgRG9jdW1lbnRQYXJzZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICBUYXBlc3RyeS5mb3JtYXQoIlJ1bGVEcml2ZW5QYXJzZXIubm8tcnVsZS1mb3ItZWxlbWVudCIsIGxvY2FsTmFtZSksCi0gICAgICAgICAgICAgICAgX2RvY3VtZW50TG9jYXRpb24sCi0gICAgICAgICAgICAgICAgZ2V0TG9jYXRpb24oKSwKLSAgICAgICAgICAgICAgICBudWxsKTsKLQotICAgICAgICByZXR1cm4gcnVsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVc2VzIHRoZSB7QGxpbmsgTG9jYXRvcn0gdG8gdHJhY2sgdGhlIHBvc2l0aW9uCi0gICAgICogaW4gdGhlIGRvY3VtZW50IGFzIGEge0BsaW5rIElMb2NhdGlvbn0uIFRoaXMgaXMgaW52b2tlZAotICAgICAqIG9uY2UgKGJlZm9yZSB0aGUgaW5pdGlhbCBlbGVtZW50IGlzIHBhcnNlZCkgYW5kCi0gICAgICogdGhlIExvY2F0b3IgaXMgcmV0YWluZWQgYW5kIHF1ZXJpZWQgYXMgdG8KLSAgICAgKiB0aGUgY3VycmVudCBmaWxlIGxvY2F0aW9uLgotICAgICAqIAotICAgICAqIEBzZWUgI2dldExvY2F0aW9uKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREb2N1bWVudExvY2F0b3IoTG9jYXRvciBsb2NhdG9yKQotICAgIHsKLSAgICAgICAgX2xvY2F0b3IgPSBsb2NhdG9yOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFjY3VtdWxhdGVzIHRoZSBjb250ZW50IGluIGEgYnVmZmVyOyB0aGUgY29uY2F0aW5hdGVkIGNvbnRlbnQKLSAgICAgKiBpcyBwcm92aWRlZCB0byB0aGUgdG9wIHJ1bGUganVzdCBiZWZvcmUgYW55IHN0YXJ0IG9yIGVuZCB0YWcuIAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNoYXJhY3RlcnMoY2hhcltdIGNoLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIF9jb250ZW50QnVmZmVyLmFwcGVuZChjaCwgc3RhcnQsIGxlbmd0aCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUG9wcyB0aGUgdG9wIHJ1bGUgb2ZmIHRoZSBzdGFjayBhbmQKLSAgICAgKiBpbnZva2VzIHtAbGluayBJUnVsZSNlbmRFbGVtZW50KFJ1bGVEaXJlY3RlZFBhcnNlcil9LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGVuZEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHFOYW1lKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaXJlQ29udGVudFJ1bGUoKTsKLQotICAgICAgICBfdXJpID0gdXJpOwotICAgICAgICBfbG9jYWxOYW1lID0gbG9jYWxOYW1lOwotICAgICAgICBfcU5hbWUgPSBxTmFtZTsKLQotICAgICAgICBwb3BSdWxlKCkuZW5kRWxlbWVudCh0aGlzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJZ25vcmFibGUgY29udGVudCBpcyBpZ25vcmVkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGlnbm9yYWJsZVdoaXRlc3BhY2UoY2hhcltdIGNoLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW52b2tlcyB7QGxpbmsgI3NlbGVjdFJ1bGUoU3RyaW5nLCBBdHRyaWJ1dGVzKX0gdG8gY2hvb3NlIGEgbmV3IHJ1bGUsCi0gICAgICogd2hpY2ggaXMgcHVzaGVkIG9udG8gdGhlIHJ1bGUgc3RhY2ssIHRoZW4gaW52b2tlcwotICAgICAqIHtAbGluayBJUnVsZSNzdGFydEVsZW1lbnQoUnVsZURpcmVjdGVkUGFyc2VyLCBBdHRyaWJ1dGVzKX0uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxTmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKQotICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaXJlQ29udGVudFJ1bGUoKTsKLQotICAgICAgICBfdXJpID0gdXJpOwotICAgICAgICBfbG9jYWxOYW1lID0gbG9jYWxOYW1lOwotICAgICAgICBfcU5hbWUgPSBxTmFtZTsKLQotICAgICAgICBTdHJpbmcgbmFtZSA9IGV4dHJhY3ROYW1lKHVyaSwgbG9jYWxOYW1lLCBxTmFtZSk7Ci0KLSAgICAgICAgSVJ1bGUgbmV3UnVsZSA9IHNlbGVjdFJ1bGUobmFtZSwgYXR0cmlidXRlcyk7Ci0KLSAgICAgICAgcHVzaFJ1bGUobmV3UnVsZSk7Ci0KLSAgICAgICAgbmV3UnVsZS5zdGFydEVsZW1lbnQodGhpcywgYXR0cmlidXRlcyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZXh0cmFjdE5hbWUoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHFOYW1lKQotICAgIHsKLSAgICAgICAgcmV0dXJuIFRhcGVzdHJ5LmlzQmxhbmsobG9jYWxOYW1lKSA/IHFOYW1lIDogbG9jYWxOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVzZXMge0BsaW5rIGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3Rvcnl9IHRvIGNyZWF0ZSBhIGluc3RhbmNlCi0gICAgICogb2YgYSB2YWxpZGF0aW9uIFNBWDIgcGFyc2VyLgotICAgICAqLwotICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgU0FYUGFyc2VyIGNvbnN0cnVjdFBhcnNlcigpCi0gICAgewotICAgICAgICBpZiAoX3BhcnNlckZhY3RvcnkgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgX3BhcnNlckZhY3RvcnkgPSBTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICBjb25maWd1cmVQYXJzZXJGYWN0b3J5KF9wYXJzZXJGYWN0b3J5KTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gX3BhcnNlckZhY3RvcnkubmV3U0FYUGFyc2VyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFNBWEV4Y2VwdGlvbiBleCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbihleCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZXgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24oZXgpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25maWd1cmVzIGEge0BsaW5rIFNBWFBhcnNlckZhY3Rvcnl9IGJlZm9yZQotICAgICAqIHtAbGluayBTQVhQYXJzZXJGYWN0b3J5I25ld1NBWFBhcnNlcigpfSBpcyBpbnZva2VkLgotICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHNldHMgdmFsaWRhdGluZyB0byB0cnVlCi0gICAgICogYW5kIG5hbWVzcGFjZUF3YXJlIHRvIGZhbHNlLAotICAgICAqLwotCi0gICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlUGFyc2VyRmFjdG9yeShTQVhQYXJzZXJGYWN0b3J5IGZhY3RvcnkpCi0gICAgewotICAgICAgICBmYWN0b3J5LnNldFZhbGlkYXRpbmcodHJ1ZSk7Ci0gICAgICAgIGZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUoZmFsc2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBUaHJvd3MgdGhlIGV4Y2VwdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBlcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBleCkgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZmF0YWxFcnJvcihleCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFRocm93cyB0aGUgZXhjZXB0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGZhdGFsRXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gZXgpIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIC8vIFNvbWV0aW1lcywgYSBiYWQgcGFyc2UgImNvcnJ1cHRzIiBhIHBhcnNlciBzbyB0aGF0IGl0IGRvZXNuJ3QKLSAgICAgICAgLy8gd29yayBwcm9wZXJseSBmb3IgZnV0dXJlIHBhcnNlcyAob2YgdmFsaWQgZG9jdW1lbnRzKSwKLSAgICAgICAgLy8gc28gZGlzY2FyZCBpdCBoZXJlLgotCi0gICAgICAgIF9wYXJzZXIgPSBudWxsOwotCi0gICAgICAgIHRocm93IGV4OwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBUaHJvd3MgdGhlIGV4Y2VwdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB3YXJuaW5nKFNBWFBhcnNlRXhjZXB0aW9uIGV4KSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmYXRhbEVycm9yKGV4KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSW5wdXRTb3VyY2UgcmVzb2x2ZUVudGl0eShTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgU3RyaW5nIGVudGl0eVBhdGggPSBudWxsOwotCi0gICAgICAgIGlmIChMT0cuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgICAgIExPRy5kZWJ1ZygKLSAgICAgICAgICAgICAgICAiQXR0ZW1wdGluZyB0byByZXNvbHZlIGVudGl0eTsgcHVibGljSWQgPSAiICsgcHVibGljSWQgKyAiIHN5c3RlbUlkID0gIiArIHN5c3RlbUlkKTsKLQotICAgICAgICBpZiAoX2VudGl0aWVzICE9IG51bGwpCi0gICAgICAgICAgICBlbnRpdHlQYXRoID0gKFN0cmluZykgX2VudGl0aWVzLmdldChwdWJsaWNJZCk7Ci0KLSAgICAgICAgaWYgKGVudGl0eVBhdGggPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKExPRy5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIExPRy5kZWJ1ZygiRW50aXR5IG5vdCBmb3VuZCwgdXNpbmcgIiArIHN5c3RlbUlkKTsKLQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBJbnB1dFN0cmVhbSBzdHJlYW0gPSBnZXRDbGFzcygpLmdldFJlc291cmNlQXNTdHJlYW0oZW50aXR5UGF0aCk7Ci0KLSAgICAgICAgSW5wdXRTb3VyY2UgcmVzdWx0ID0gbmV3IElucHV0U291cmNlKHN0cmVhbSk7Ci0KLSAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsICYmIExPRy5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICAgICAgTE9HLmRlYnVnKCJSZXNvbHZlZCAiICsgcHVibGljSWQgKyAiIGFzICIgKyByZXN1bHQgKyAiIChmb3IgIiArIGVudGl0eVBhdGggKyAiKSIpOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFZhbGlkYXRlcyB0aGF0IHRoZSBpbnB1dCB2YWx1ZSBtYXRjaGVzIGFnYWluc3QgdGhlIHNwZWNpZmllZAotICAgICAqICBQZXJsNSBwYXR0ZXJuLiAgSWYgdmFsaWQsIHRoZSBtZXRob2Qgc2ltcGx5IHJldHVybnMuCi0gICAgICogIElmIG5vdCBhIG1hdGNoLCB0aGVuIGFuIGVycm9yIG1lc3NhZ2UgaXMgZ2VuZXJhdGVkICh1c2luZyB0aGUKLSAgICAgKiAgZXJyb3JLZXkgYW5kIHRoZSBpbnB1dCB2YWx1ZSkgYW5kIGEKLSAgICAgKiAge0BsaW5rIEludmFsaWRTdHJpbmdFeGNlcHRpb259IGlzIHRocm93bi4KLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZShTdHJpbmcgdmFsdWUsIFN0cmluZyBwYXR0ZXJuLCBTdHJpbmcgZXJyb3JLZXkpCi0gICAgICAgIHRocm93cyBEb2N1bWVudFBhcnNlRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiAoX21hdGNoZXIgPT0gbnVsbCkKLSAgICAgICAgICAgIF9tYXRjaGVyID0gbmV3IFJlZ2V4cE1hdGNoZXIoKTsKLQotICAgICAgICBpZiAoX21hdGNoZXIubWF0Y2hlcyhwYXR0ZXJuLCB2YWx1ZSkpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgdGhyb3cgbmV3IEludmFsaWRTdHJpbmdFeGNlcHRpb24oVGFwZXN0cnkuZm9ybWF0KGVycm9yS2V5LCB2YWx1ZSksIHZhbHVlLCBnZXRMb2NhdGlvbigpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSVJlc291cmNlTG9jYXRpb24gZ2V0RG9jdW1lbnRMb2NhdGlvbigpCi0gICAgewotICAgICAgICByZXR1cm4gX2RvY3VtZW50TG9jYXRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbG9jYWxOYW1lIGZvciB0aGUgY3VycmVudCBlbGVtZW50LgotICAgICAqIEBzZWUgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXIjc3RhcnRFbGVtZW50KGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIG9yZy54bWwuc2F4LkF0dHJpYnV0ZXMpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRMb2NhbE5hbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9sb2NhbE5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcXVhbGlmaWVkIG5hbWUgZm9yIHRoZSBjdXJyZW50IGVsZW1lbnQuCi0gICAgICogQHNlZSBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlciNzdGFydEVsZW1lbnQoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgb3JnLnhtbC5zYXguQXR0cmlidXRlcykKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFFOYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfcU5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgVVJJIGZvciB0aGUgY3VycmVudCBlbGVtZW50LgotICAgICAqIEBzZWUgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXIjc3RhcnRFbGVtZW50KGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIG9yZy54bWwuc2F4LkF0dHJpYnV0ZXMpIAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXJpKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfdXJpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBmaXJlQ29udGVudFJ1bGUoKQotICAgIHsKLSAgICAgICAgU3RyaW5nIGNvbnRlbnQgPSBfY29udGVudEJ1ZmZlci50b1N0cmluZygpOwotICAgICAgICBfY29udGVudEJ1ZmZlci5zZXRMZW5ndGgoMCk7Ci0KLSAgICAgICAgaWYgKCFfcnVsZVN0YWNrLmlzRW1wdHkoKSkKLSAgICAgICAgICAgIHBlZWtSdWxlKCkuY29udGVudCh0aGlzLCBjb250ZW50KTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS91dGlsL3htbC9wYWNrYWdlLmh0bWwgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdXRpbC94bWwvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmRlODI3Li4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS91dGlsL3htbC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotPCEtLSAkSWQkIC0tPgotCi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlRhcGVzdHJ5OiBXZWIgQXBwbGljYXRpb24gRnJhbWV3b3JrPC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHk+Ci0KLTxwPkJhc2UgY2xhc3NlcyBmb3Igc3RyZWFtbGluaW5nIHRoZSBwcm9jZXNzIG9mIHBhcnNpbmcgYW4gWE1MIGRvY3VtZW50LiAgVGhpcyBpcyBwcmltYXJpbHkgCi11c2VkIHdpdGggYSB2YWxpZGF0aW5nIHBhcnNlciwgd2hlcmUgdGhlIERURCBpcyBzdG9yZWQgd2l0aGluIHRoZSBjbGFzc3BhdGguCi0KLUBhdXRob3IgSG93YXJkIExld2lzIFNoaXAgPGEgaHJlZj0ibWFpbHRvOmhsc2hpcEBhcGFjaGUub3JnIj5obHNoaXBAYXBhY2hlLm9yZzwvYT4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3ZhbGlkL0Jhc2VWYWxpZGF0b3IuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS92YWxpZC9CYXNlVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4ZjZiYmYuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3ZhbGlkL0Jhc2VWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1MCArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS52YWxpZDsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LkFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklFbmdpbmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JRm9ybTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklNYXJrdXBXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVxdWVzdEN5Y2xlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlc291cmNlTG9jYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JU2NyaXB0OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuVGFwZXN0cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5lbmdpbmUuSVNjcmlwdFNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmZvcm0uRm9ybUV2ZW50VHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmZvcm0uSUZvcm1Db21wb25lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5odG1sLkJvZHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5yZXNvdXJjZS5DbGFzc3BhdGhSZXNvdXJjZUxvY2F0aW9uOwotCi0vKioKLSAqICBBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciB7QGxpbmsgSVZhbGlkYXRvcn0uICBTdXBwb3J0cyBhIHJlcXVpcmVkIGFuZCBsb2NhbGUgcHJvcGVydHkuCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQHNpbmNlIDEuMC44Ci0gKgotICoqLwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzZVZhbGlkYXRvciBpbXBsZW1lbnRzIElWYWxpZGF0b3IKLXsKLSAgICAvKioKLSAgICAgKiAgSW5wdXQgU3ltYm9sIHVzZWQgdG8gcmVwcmVzZW50IHRoZSBmaWVsZCBiZWluZyB2YWxpZGF0ZWQuCi0gICAgICogCi0gICAgICogIEBzZWUgI3Byb2Nlc3NWYWxpZGF0b3JTY3JpcHQoU3RyaW5nLCBJUmVxdWVzdEN5Y2xlLCBJRm9ybUNvbXBvbmVudCwgTWFwKQotICAgICAqIAotICAgICAqICBAc2luY2UgMi4yCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklFTERfU1lNQk9MID0gImZpZWxkIjsKLQotICAgIC8qKgotICAgICAqICBJbnB1dCBzeW1ib2wgdXNlZCB0byByZXByZXNlbnQgdGhlIHZhbGlkYXRvciBpdHNlbGYgdG8gdGhlIHNjcmlwdC4KLSAgICAgKiAKLSAgICAgKiAgQHNlZSAjcHJvY2Vzc1ZhbGlkYXRvclNjcmlwdChTdHJpbmcsIElSZXF1ZXN0Q3ljbGUsIElGb3JtQ29tcG9uZW50LCBNYXApCi0gICAgICogCi0gICAgICogIEBzaW5jZSAyLjIKLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUT1JfU1lNQk9MID0gInZhbGlkYXRvciI7Ci0KLSAgICAvKioKLSAgICAgKiAgSW5wdXQgc3ltYm9sIHVzZWQgdG8gcmVwcmVzZW50IHRoZSB7QGxpbmsgSUZvcm19IGNvbnRhaW5pbmcgdGhlIGZpZWxkCi0gICAgICogIHRvIHRoZSBzY3JpcHQuCi0gICAgICogCi0gICAgICogIEBzZWUgI3Byb2Nlc3NWYWxpZGF0b3JTY3JpcHQoU3RyaW5nLCBJUmVxdWVzdEN5Y2xlLCBJRm9ybUNvbXBvbmVudCwgTWFwKQotICAgICAqICAKLSAgICAgKiAgQHNpbmNlIDIuMgotICAgICAqKi8KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1fU1lNQk9MID0gImZvcm0iOwotCi0gICAgLyoqCi0gICAgICogIE91dHB1dCBzeW1ib2wgc2V0IGJ5IHRoZSBzY3JpcHQgYXN0aGUgbmFtZSBvZiB0aGUgdmFsaWRhdG9yIAotICAgICAqICBKYXZhU2NyaXB0IGZ1bmN0aW9uLgotICAgICAqICBUaGUgZnVuY3Rpb24gaW1wbGVtZW50ZWQgbXVzdCByZXR1cm4gdHJ1ZSBvciBmYWxzZSAodHJ1ZQotICAgICAqICBpZiB0aGUgZmllbGQgaXMgdmFsaWQsIGZhbHNlIG90aGVyd2lzZSkuCi0gICAgICogIEFmdGVyIHRoZSBzY3JpcHQgaXMgZXhlY3V0ZWQsIHRoZSBmdW5jdGlvbiBpcyBhZGRlZAotICAgICAqICB0byB0aGUge0BsaW5rIElGb3JtfSBhcyBhIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LmZvcm0uRm9ybUV2ZW50VHlwZSNTVUJNSVR9LgotICAgICAqIAotICAgICAqICBAc2VlICNwcm9jZXNzVmFsaWRhdG9yU2NyaXB0KFN0cmluZywgSVJlcXVlc3RDeWNsZSwgSUZvcm1Db21wb25lbnQsIE1hcCkKLSAgICAgKiAKLSAgICAgKiAgQHNpbmNlIDIuMgotICAgICAqIAotICAgICAqKi8KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZVTkNUSU9OX1NZTUJPTCA9ICJmdW5jdGlvbiI7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gX3JlcXVpcmVkOwotCi0gICAgLyoqIEBzaW5jZSAzLjAgKi8KLQotICAgIHByaXZhdGUgU3RyaW5nIF9yZXF1aXJlZE1lc3NhZ2U7Ci0KLSAgICAvKiogCi0gICAgICogIEBzaW5jZSAyLjIKLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwcml2YXRlIGJvb2xlYW4gX2NsaWVudFNjcmlwdGluZ0VuYWJsZWQgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqICBTdGFuZGFyZCBjb25zdHJ1Y3Rvci4gIExlYXZlcyBsb2NhbGUgYXMgc3lzdGVtIGRlZmF1bHQgYW5kIHJlcXVpcmVkIGFzIGZhbHNlLgotICAgICAqIAotICAgICAqKi8KLQotICAgIHB1YmxpYyBCYXNlVmFsaWRhdG9yKCkKLSAgICB7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIEJhc2VWYWxpZGF0b3IoYm9vbGVhbiByZXF1aXJlZCkKLSAgICB7Ci0gICAgICAgIF9yZXF1aXJlZCA9IHJlcXVpcmVkOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzUmVxdWlyZWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9yZXF1aXJlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRSZXF1aXJlZChib29sZWFuIHJlcXVpcmVkKQotICAgIHsKLSAgICAgICAgX3JlcXVpcmVkID0gcmVxdWlyZWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIHBhdHRlcm4sIGVpdGhlciBhcyB0aGUgZGVmYXVsdCB2YWx1ZSwgb3IgYXMgYSBsb2NhbGl6ZWQga2V5LgotICAgICAqIElmIG92ZXJyaWRlIGlzIG51bGwsIHRoZW4gdGhlIGtleSBmcm9tIHRoZQotICAgICAqIDxjb2RlPm9yZy5hcGFjaGUudGFwZXN0cnkudmFsaWQuVmFsaWRhdGlvblN0cmluZ3M8L2NvZGU+Ci0gICAgICoge0BsaW5rIFJlc291cmNlQnVuZGxlfSAoaW4gdGhlIHNwZWNpZmllZCBsb2NhbGUpIGlzIHVzZWQuCi0gICAgICogVGhlIHBhdHRlcm4gY2FuIHRoZW4gYmUgdXNlZCB3aXRoIHtAbGluayAjZm9ybWF0U3RyaW5nKFN0cmluZywgT2JqZWN0W10pfS4KLSAgICAgKiAKLSAgICAgKiA8cD5XaHkgZG8gd2Ugbm90IGp1c3QgbHVtcCB0aGVzZSBzdHJpbmdzIGludG8gVGFwZXN0cnlTdHJpbmdzLnByb3BlcnRpZXM/ICAKLSAgICAgKiBiZWNhdXNlIFRhcGVzdHJ5U3RyaW5ncy5wcm9wZXJ0aWVzIGlzIGxvY2FsaXplZCB0byB0aGUgc2VydmVyJ3MgbG9jYWxlLCB3aGljaCBpcyBmaW5lCi0gICAgICogZm9yIHRoZSBsb2dnaW5nLCBkZWJ1Z2dpbmcgYW5kIGVycm9yIG1lc3NhZ2VzIGl0IGNvbnRhaW5zLiAgRm9yIGZpZWxkIHZhbGlkYXRpb24sIHdob3NlIGVycm9ycwotICAgICAqIGFyZSB2aXNpYmxlIHRvIHRoZSBlbmQgdXNlciBub3JtYWxseSwgd2Ugd2FudCB0byBsb2NhbGl6ZSB0byB0aGUgcGFnZSdzIGxvY2FsZS4KLSAgICAgKiAgCi0gICAgICogQHBhcmFtIG92ZXJyaWRlIFRoZSBvdmVycmlkZSB2YWx1ZSBmb3IgdGhlIGxvY2FsaXplZCBzdHJpbmcgZnJvbSB0aGUgYnVuZGxlLgotICAgICAqIEBwYXJhbSBrZXkgdXNlZCB0byBsb29rdXAgcGF0dGVybiBmcm9tIGJ1bmRsZSwgaWYgb3ZlcnJpZGUgaXMgbnVsbC4KLSAgICAgKiBAcGFyYW0gbG9jYWxlIHVzZWQgdG8gZ2V0IHJpZ2h0IGxvY2FsaXphdGlvbiBvZiBidW5kbGUuCi0gICAgICogQHNpbmNlIDMuMAotICAgICAqLwotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRQYXR0ZXJuKFN0cmluZyBvdmVycmlkZSwgU3RyaW5nIGtleSwgTG9jYWxlIGxvY2FsZSkKLSAgICB7Ci0gICAgICAgIGlmIChvdmVycmlkZSAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG92ZXJyaWRlOwotCi0gICAgICAgIFJlc291cmNlQnVuZGxlIHN0cmluZ3MgPQotICAgICAgICAgICAgUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJvcmcuYXBhY2hlLnRhcGVzdHJ5LnZhbGlkLlZhbGlkYXRpb25TdHJpbmdzIiwgbG9jYWxlKTsKLQotICAgICAgICByZXR1cm4gc3RyaW5ncy5nZXRTdHJpbmcoa2V5KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGEgc3RyaW5nIGZyb20gdGhlIHN0YW5kYXJkIHJlc291cmNlIGJ1bmRsZS4gIFRoZSBzdHJpbmcgaW4gdGhlIGJ1bmRsZQotICAgICAqIGlzIHRyZWF0ZWQgYXMgYSBwYXR0ZXJuIGZvciB7QGxpbmsgTWVzc2FnZUZvcm1hdCNmb3JtYXQoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdFtdKX0uCi0gICAgICogCi0gICAgICogQHBhcmFtIHBhdHRlcm4gc3RyaW5nIHRoZSBpbnB1dCBwYXR0ZXJuIHRvIGJlIHVzZWQgd2l0aAotICAgICAqIHtAbGluayBNZXNzYWdlRm9ybWF0I2Zvcm1hdChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0W10pfS4KLSAgICAgKiBJdCBtYXkgY29udGFpbiByZXBsYWNlYWJsZSBwYXJhbWV0ZXJzLCB7MH0sIHsxfSwgZXRjLgotICAgICAqIEBwYXJhbSBhcmdzIHRoZSBhcmd1bWVudHMgdXNlZCB0byBmaWxsIHJlcGxhY2VhYmxlIHBhcmFtZXRlcnMgezB9LCB7MX0sIGV0Yy4KLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMy4wCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBmb3JtYXRTdHJpbmcoU3RyaW5nIHBhdHRlcm4sIE9iamVjdFtdIGFyZ3MpCi0gICAgewotICAgICAgICByZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQocGF0dGVybiwgYXJncyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIENvbnZpZW5pZW5jZSBtZXRob2QgZm9yIGludm9raW5nIHtAbGluayAjZm9ybWF0U3RyaW5nKFN0cmluZywgT2JqZWN0W10pfS4KLSAgICAgKiAKLSAgICAgKiAgQHNpbmNlIDMuMAotICAgICAqIAotICAgICAqKi8KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZm9ybWF0U3RyaW5nKFN0cmluZyBwYXR0ZXJuLCBPYmplY3QgYXJnKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGZvcm1hdFN0cmluZyhwYXR0ZXJuLCBuZXcgT2JqZWN0W10geyBhcmcgfSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIENvbnZpZW5pZW5jZSBtZXRob2QgZm9yIGludm9raW5nIHtAbGluayAjZm9ybWF0U3RyaW5nKFN0cmluZywgT2JqZWN0W10pfS4KLSAgICAgKiAKLSAgICAgKiAgQHNpbmNlIDMuMAotICAgICAqIAotICAgICAqKi8KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZm9ybWF0U3RyaW5nKFN0cmluZyBwYXR0ZXJuLCBPYmplY3QgYXJnMSwgT2JqZWN0IGFyZzIpCi0gICAgewotICAgICAgICByZXR1cm4gZm9ybWF0U3RyaW5nKHBhdHRlcm4sIG5ldyBPYmplY3RbXSB7IGFyZzEsIGFyZzIgfSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEludm9rZWQgdG8gY2hlY2sgaWYgdGhlIHZhbHVlIGlzIG51bGwuICBJZiB0aGUgdmFsdWUgaXMgbnVsbCAob3IgZW1wdHkpLAotICAgICAqICBidXQgdGhlIHJlcXVpcmVkIGZsYWcgaXMgc2V0LCB0aGVuIHRoaXMgbWV0aG9kIHRocm93cyBhIHtAbGluayBWYWxpZGF0b3JFeGNlcHRpb259LgotICAgICAqICBPdGhlcndpc2UsIHJldHVybnMgdHJ1ZSBpZiB0aGUgdmFsdWUgaXMgbnVsbC4KLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjaGVja1JlcXVpcmVkKElGb3JtQ29tcG9uZW50IGZpZWxkLCBTdHJpbmcgdmFsdWUpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gaXNFbXB0eSA9IFRhcGVzdHJ5LmlzQmxhbmsodmFsdWUpOwotCi0gICAgICAgIGlmIChfcmVxdWlyZWQgJiYgaXNFbXB0eSkKLSAgICAgICAgICAgIHRocm93IG5ldyBWYWxpZGF0b3JFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgYnVpbGRSZXF1aXJlZE1lc3NhZ2UoZmllbGQpLAotICAgICAgICAgICAgICAgIFZhbGlkYXRpb25Db25zdHJhaW50LlJFUVVJUkVEKTsKLQotICAgICAgICByZXR1cm4gaXNFbXB0eTsKLSAgICB9Ci0KLSAgICAvKiogCi0gICAgICogQnVpbGRzIGFuIGVycm9yIG1lc3NhZ2UgaW5kaWNhdGluZyBhIHZhbHVlIGZvciBhIHJlcXVpcmVkCi0gICAgICogZmllbGQgd2FzIG5vdCBzdXBwbGllZC4KLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMy4wCi0gICAgICovCi0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkUmVxdWlyZWRNZXNzYWdlKElGb3JtQ29tcG9uZW50IGZpZWxkKQotICAgIHsKLSAgICAgICAgU3RyaW5nIHBhdHRlcm4gPQotICAgICAgICAgICAgZ2V0UGF0dGVybihfcmVxdWlyZWRNZXNzYWdlLCAiZmllbGQtaXMtcmVxdWlyZWQiLCBmaWVsZC5nZXRQYWdlKCkuZ2V0TG9jYWxlKCkpOwotCi0gICAgICAgIHJldHVybiBmb3JtYXRTdHJpbmcocGF0dGVybiwgZmllbGQuZ2V0RGlzcGxheU5hbWUoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFRoaXMgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nLiAgU3ViY2xhc3NlcyBtYXkgc3VwcGx5IHRoZWlyIG93biBpbXBsZW1lbnRhdGlvbi4KLSAgICAgKiAKLSAgICAgKiAgQHNpbmNlIDIuMgotICAgICAqIAotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIHJlbmRlclZhbGlkYXRvckNvbnRyaWJ1dGlvbigKLSAgICAgICAgSUZvcm1Db21wb25lbnQgZmllbGQsCi0gICAgICAgIElNYXJrdXBXcml0ZXIgd3JpdGVyLAotICAgICAgICBJUmVxdWVzdEN5Y2xlIGN5Y2xlKQotICAgIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgSW52b2tlZCAoZnJvbSBzdWItY2xhc3MKLSAgICAgKiAgaW1wbGVtZW50YXRpb25zIG9mIHtAbGluayAjcmVuZGVyVmFsaWRhdG9yQ29udHJpYnV0aW9uKElGb3JtQ29tcG9uZW50LCBJTWFya3VwV3JpdGVyLCBJUmVxdWVzdEN5Y2xlKX0KLSAgICAgKiAgdG8gcHJvY2VzcyBhIHN0YW5kYXJkIHZhbGlkYXRpb24gc2NyaXB0LiAgVGhpcyBleHBlY3RzIHRoYXQ6Ci0gICAgICogIDx1bD4KLSAgICAgKiAgPGxpPlRoZSB7QGxpbmsgSUZvcm1Db21wb25lbnR9IGlzICh1bHRpbWF0ZWx5KSB3cmFwcGVkIGJ5IGEge0BsaW5rIEJvZHl9Ci0gICAgICogIDxsaT5UaGUgc2NyaXB0IGdlbmVyYXRlcyBhIHN5bWJvbCBuYW1lZCAiZnVuY3Rpb24iIChhcyBwZXIge0BsaW5rICNGVU5DVElPTl9TWU1CT0x9KQotICAgICAqICA8L3VsPgotICAgICAqIAotICAgICAqICBAcGFyYW0gc2NyaXB0UGF0aCB0aGUgcmVzb3VyY2UgcGF0aCBvZiB0aGUgc2NyaXB0IHRvIGV4ZWN1dGUKLSAgICAgKiAgQHBhcmFtIGN5Y2xlIFRoZSBhY3RpdmUgcmVxdWVzdCBjeWNsZQotICAgICAqICBAcGFyYW0gZmllbGQgVGhlIGZpZWxkIHRvIGJlIHZhbGlkYXRlZAotICAgICAqICBAcGFyYW0gc3ltYm9scyBhIHNldCBvZiBpbnB1dCBzeW1ib2xzIG5lZWRlZCBieSB0aGUgc2NyaXB0LiAgVGhlc2Ugc3ltYm9scwotICAgICAqICBhcmUgYXVnbWVudGVkIHdpdGggc3ltYm9scyBmb3IgdGhlIGZpZWxkLCBmb3JtIGFuZCB2YWxpZGF0b3IuICBzeW1ib2xzIG1heSBiZQotICAgICAqICBudWxsLCBidXQgd2lsbCBiZSBtb2RpZmllZCBpZiBub3QgbnVsbC4KLSAgICAgKiAgQHRocm93cyBBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24gaWYgdGhlcmUncyBhbiBlcnJvciBwcm9jZXNzaW5nIHRoZSBzY3JpcHQuCi0gICAgICogCi0gICAgICogIEBzaW5jZSAyLjIKLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzVmFsaWRhdG9yU2NyaXB0KAotICAgICAgICBTdHJpbmcgc2NyaXB0UGF0aCwKLSAgICAgICAgSVJlcXVlc3RDeWNsZSBjeWNsZSwKLSAgICAgICAgSUZvcm1Db21wb25lbnQgZmllbGQsCi0gICAgICAgIE1hcCBzeW1ib2xzKQotICAgIHsKLSAgICAgICAgSUVuZ2luZSBlbmdpbmUgPSBmaWVsZC5nZXRQYWdlKCkuZ2V0RW5naW5lKCk7Ci0gICAgICAgIElTY3JpcHRTb3VyY2Ugc291cmNlID0gZW5naW5lLmdldFNjcmlwdFNvdXJjZSgpOwotICAgICAgICBJRm9ybSBmb3JtID0gZmllbGQuZ2V0Rm9ybSgpOwotCi0gICAgICAgIE1hcCBmaW5hbFN5bWJvbHMgPSAoc3ltYm9scyA9PSBudWxsKSA/IG5ldyBIYXNoTWFwKCkgOiBzeW1ib2xzOwotCi0gICAgICAgIGZpbmFsU3ltYm9scy5wdXQoRklFTERfU1lNQk9MLCBmaWVsZCk7Ci0gICAgICAgIGZpbmFsU3ltYm9scy5wdXQoRk9STV9TWU1CT0wsIGZvcm0pOwotICAgICAgICBmaW5hbFN5bWJvbHMucHV0KFZBTElEQVRPUl9TWU1CT0wsIHRoaXMpOwotCi0gICAgICAgIElSZXNvdXJjZUxvY2F0aW9uIGxvY2F0aW9uID0KLSAgICAgICAgICAgIG5ldyBDbGFzc3BhdGhSZXNvdXJjZUxvY2F0aW9uKGVuZ2luZS5nZXRSZXNvdXJjZVJlc29sdmVyKCksIHNjcmlwdFBhdGgpOwotCi0gICAgICAgIElTY3JpcHQgc2NyaXB0ID0gc291cmNlLmdldFNjcmlwdChsb2NhdGlvbik7Ci0KLSAgICAgICAgQm9keSBib2R5ID0gQm9keS5nZXQoY3ljbGUpOwotCi0gICAgICAgIGlmIChib2R5ID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIFRhcGVzdHJ5LmdldE1lc3NhZ2UoIlZhbGlkRmllbGQubXVzdC1iZS1jb250YWluZWQtYnktYm9keSIpLAotICAgICAgICAgICAgICAgIGZpZWxkLAotICAgICAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAgICAgbnVsbCk7Ci0KLSAgICAgICAgc2NyaXB0LmV4ZWN1dGUoY3ljbGUsIGJvZHksIGZpbmFsU3ltYm9scyk7Ci0KLSAgICAgICAgU3RyaW5nIGZ1bmN0aW9uTmFtZSA9IChTdHJpbmcpIGZpbmFsU3ltYm9scy5nZXQoRlVOQ1RJT05fU1lNQk9MKTsKLQotICAgICAgICBmb3JtLmFkZEV2ZW50SGFuZGxlcihGb3JtRXZlbnRUeXBlLlNVQk1JVCwgZnVuY3Rpb25OYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0cnVlIGlmIGNsaWVudCBzY3JpcHRpbmcgaXMgZW5hYmxlZC4gIFNvbWUgdmFsaWRhdG9ycyBhcmUKLSAgICAgKiAgY2FwYWJsZSBvZiBnZW5lcmF0aW5nIGNsaWVudC1zaWRlIHNjcmlwdGluZyB0byBwZXJmb3JtIHZhbGlkYXRpb24KLSAgICAgKiAgd2hlbiB0aGUgZm9ybSBpcyBzdWJtaXR0ZWQuICBCeSBkZWZhdWx0LCB0aGlzIGZsYWcgaXMgZmFsc2UgYW5kCi0gICAgICogIHN1YmNsYXNzZXMgc2hvdWxkIGNoZWNrIGl0IAotICAgICAqICAoaW4ge0BsaW5rICNyZW5kZXJWYWxpZGF0b3JDb250cmlidXRpb24oSUZvcm1Db21wb25lbnQsIElNYXJrdXBXcml0ZXIsIElSZXF1ZXN0Q3ljbGUpfSkKLSAgICAgKiAgYmVmb3JlIGdlbmVyYXRpbmcgY2xpZW50IHNpZGUgc2NyaXB0LgotICAgICAqIAotICAgICAqICBAc2luY2UgMi4yCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIGJvb2xlYW4gaXNDbGllbnRTY3JpcHRpbmdFbmFibGVkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfY2xpZW50U2NyaXB0aW5nRW5hYmxlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDbGllbnRTY3JpcHRpbmdFbmFibGVkKGJvb2xlYW4gY2xpZW50U2NyaXB0aW5nRW5hYmxlZCkKLSAgICB7Ci0gICAgICAgIF9jbGllbnRTY3JpcHRpbmdFbmFibGVkID0gY2xpZW50U2NyaXB0aW5nRW5hYmxlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFJlcXVpcmVkTWVzc2FnZSgpCi0gICAgewotICAgICAgICByZXR1cm4gX3JlcXVpcmVkTWVzc2FnZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBPdmVycmlkZXMgdGhlIDxjb2RlPmZpZWxkLWlzLXJlcXVpcmVkPC9jb2RlPiBidW5kbGUga2V5LgotICAgICAqIFBhcmFtZXRlciB7MH0gaXMgdGhlIGRpc3BsYXkgbmFtZSBvZiB0aGUgZmllbGQuCi0gICAgICogCi0gICAgICogQHNpbmNlIDMuMAotICAgICAqLwotCi0gICAgcHVibGljIHZvaWQgc2V0UmVxdWlyZWRNZXNzYWdlKFN0cmluZyBzdHJpbmcpCi0gICAgewotICAgICAgICBfcmVxdWlyZWRNZXNzYWdlID0gc3RyaW5nOwotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS92YWxpZC9EYXRlVmFsaWRhdG9yLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdmFsaWQvRGF0ZVZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGUxN2U5Li4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS92YWxpZC9EYXRlVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTEgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkudmFsaWQ7Ci0KLWltcG9ydCBqYXZhLnRleHQuRGF0ZUZvcm1hdDsKLWltcG9ydCBqYXZhLnRleHQuUGFyc2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5HcmVnb3JpYW5DYWxlbmRhcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JTWFya3VwV3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlcXVlc3RDeWNsZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmZvcm0uSUZvcm1Db21wb25lbnQ7Ci0KLS8qKgotICogIFByb3ZpZGVzIGlucHV0IHZhbGlkYXRpb24gZm9yIHN0cmluZ3MgdHJlYXRlZCBhcyBkYXRlcy4gIEluIGFkZGl0aW9uLAotICogIGFsbG93cyBhIG1pbmltdW0gYW5kIG1heGltdW0gZGF0ZSB0byBiZSBzZXQuCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQHNpbmNlIDEuMC44Ci0gKgotICoqLwotCi1wdWJsaWMgY2xhc3MgRGF0ZVZhbGlkYXRvciBleHRlbmRzIEJhc2VWYWxpZGF0b3IKLXsKLSAgICBwcml2YXRlIERhdGVGb3JtYXQgX2Zvcm1hdDsKLSAgICBwcml2YXRlIFN0cmluZyBfZGlzcGxheUZvcm1hdDsKLSAgICBwcml2YXRlIERhdGUgX21pbmltdW07Ci0gICAgcHJpdmF0ZSBEYXRlIF9tYXhpbXVtOwotICAgIHByaXZhdGUgQ2FsZW5kYXIgX2NhbGVuZGFyOwotICAgIHByaXZhdGUgU3RyaW5nIF9zY3JpcHRQYXRoID0gIi9vcmcvYXBhY2hlL3RhcGVzdHJ5L3ZhbGlkL0RhdGVWYWxpZGF0b3Iuc2NyaXB0IjsKLQotICAgIHByaXZhdGUgc3RhdGljIERhdGVGb3JtYXQgZGVmYXVsdERhdGVGb3JtYXQgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgiTU0vZGQveXl5eSIpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBkZWZhdWx0RGF0ZURpc3BsYXlGb3JtYXQgPSAiTU0vREQvWVlZWSI7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBfZGF0ZVRvb0Vhcmx5TWVzc2FnZTsKLSAgICBwcml2YXRlIFN0cmluZyBfZGF0ZVRvb0xhdGVNZXNzYWdlOwotICAgIHByaXZhdGUgU3RyaW5nIF9pbnZhbGlkRGF0ZUZvcm1hdE1lc3NhZ2U7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRGb3JtYXQoRGF0ZUZvcm1hdCB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIF9mb3JtYXQgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRGF0ZUZvcm1hdCBnZXRGb3JtYXQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9mb3JtYXQ7Ci0gICAgfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUge0BsaW5rIERhdGVGb3JtYXR9IHRoZSB2YWxpZGF0b3Igd2lsbCB1c2UsIHJldHVybmluZyB0aGUgZGVmYXVsdCBpZiBubwotCSAqIG90aGVyIGRhdGUgZm9ybWF0IGlzIHNwZWNpZmllZCB2aWEge0BsaW5rICNzZXRGb3JtYXQoRGF0ZUZvcm1hdCl9Ci0JICogCi0JICogQHNpbmNlIDMuMAotCSAqLwotICAgIHB1YmxpYyBEYXRlRm9ybWF0IGdldEVmZmVjdGl2ZUZvcm1hdCgpCi0gICAgewotICAgICAgICBpZiAoX2Zvcm1hdCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHREYXRlRm9ybWF0OwotCi0gICAgICAgIHJldHVybiBfZm9ybWF0OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheUZvcm1hdCgpCi0gICAgewotICAgICAgICByZXR1cm4gX2Rpc3BsYXlGb3JtYXQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RGlzcGxheUZvcm1hdChTdHJpbmcgdmFsdWUpCi0gICAgewotICAgICAgICBfZGlzcGxheUZvcm1hdCA9IHZhbHVlOwotICAgIH0KLQotCS8qKgotICAgICAqIEByZXR1cm4gdGhlIGRpc3BsYXkgZm9ybWF0IG1lc3NhZ2UgdGhlIHZhbGlkYXRvciB3aWxsIHVzZSwgcmV0dXJuaW5nIHRoZSBkZWZhdWx0IGlmIG5vCi0gICAgICogb3RoZXIgZGlzcGxheSBmb3JtYXQgbWVzc2FnZSBpcyBzcGVjaWZpZWQuICBUaGUgZGVmYXVsdCBpcyB0aGUge0BsaW5rIFNpbXBsZURhdGVGb3JtYXQjdG9QYXR0ZXJuKCl9Ci0gICAgICogZm9yIHtAbGluayBTaW1wbGVEYXRlRm9ybWF0fXMsIG9yICJNTS9ERC9ZWVlZIiBmb3IgdW5rbm93biB7QGxpbmsgRGF0ZUZvcm1hdH0gc3ViY2xhc3Nlcy4KLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMy4wCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRFZmZlY3RpdmVEaXNwbGF5Rm9ybWF0KCkKLSAgICB7Ci0gICAgICAgIGlmIChfZGlzcGxheUZvcm1hdCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBEYXRlRm9ybWF0IGZvcm1hdCA9IGdldEVmZmVjdGl2ZUZvcm1hdCgpOwotICAgICAgICAgICAgaWYgKGZvcm1hdCBpbnN0YW5jZW9mIFNpbXBsZURhdGVGb3JtYXQpIAotICAgICAgICAgICAgICAgIHJldHVybiAoKFNpbXBsZURhdGVGb3JtYXQpZm9ybWF0KS50b1BhdHRlcm4oKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZXR1cm4gZGVmYXVsdERhdGVEaXNwbGF5Rm9ybWF0OwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIF9kaXNwbGF5Rm9ybWF0OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoSUZvcm1Db21wb25lbnQgZmlsZSwgT2JqZWN0IHZhbHVlKQotICAgIHsKLSAgICAgICAgaWYgKHZhbHVlID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICBEYXRlIGRhdGUgPSAoRGF0ZSkgdmFsdWU7Ci0KLSAgICAgICAgRGF0ZUZvcm1hdCBmb3JtYXQgPSBnZXRFZmZlY3RpdmVGb3JtYXQoKTsKLQotICAgICAgICAvLyBEYXRlRm9ybWF0IGlzIG5vdCB0aHJlYWRzYWZlLCBzbyBndWFyZCBhY2Nlc3MgdG8gaXQuCi0KLSAgICAgICAgc3luY2hyb25pemVkIChmb3JtYXQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBmb3JtYXQuZm9ybWF0KGRhdGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCB0b09iamVjdChJRm9ybUNvbXBvbmVudCBmaWVsZCwgU3RyaW5nIHZhbHVlKSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiAoY2hlY2tSZXF1aXJlZChmaWVsZCwgdmFsdWUpKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgRGF0ZUZvcm1hdCBmb3JtYXQgPSBnZXRFZmZlY3RpdmVGb3JtYXQoKTsKLQotICAgICAgICBEYXRlIHJlc3VsdDsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gRGF0ZUZvcm1hdCBpcyBub3QgdGhyZWFkc2FmZSwgc28gZ3VhcmQgYWNjZXNzCi0gICAgICAgICAgICAvLyB0byBpdC4KLQotICAgICAgICAgICAgc3luY2hyb25pemVkIChmb3JtYXQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gZm9ybWF0LnBhcnNlKHZhbHVlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKF9jYWxlbmRhciA9PSBudWxsKQotICAgICAgICAgICAgICAgIF9jYWxlbmRhciA9IG5ldyBHcmVnb3JpYW5DYWxlbmRhcigpOwotCi0gICAgICAgICAgICBfY2FsZW5kYXIuc2V0VGltZShyZXN1bHQpOwotCi0gICAgICAgICAgICAvLyBTaW1wbGVEYXRlRm9ybWF0IGFsbG93cyB0d28tZGlnaXQgZGF0ZXMgdG8gYmUKLSAgICAgICAgICAgIC8vIGVudGVyZWQsIGkuZS4sIDEyLzI0LzY2IGlzIERlYyAyNCAwMDY2IC4uLiB0aGF0J3MKLSAgICAgICAgICAgIC8vIHByb2JhYmx5IG5vdCB3aGF0IGlzIHJlYWxseSB3YW50ZWQsIHNvIHRyZWF0Ci0gICAgICAgICAgICAvLyBpdCBhcyBhbiBpbnZhbGlkIGRhdGUuCi0KLSAgICAgICAgICAgIGlmIChfY2FsZW5kYXIuZ2V0KENhbGVuZGFyLllFQVIpIDwgMTAwMCkKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBudWxsOwotCi0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGV4KQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBQYXJzZUV4Y2VwdGlvbiBkb2VzIG5vdCBpbmNsdWRlIGEgdXNlZnVsIGVycm9yIG1lc3NhZ2UKLSAgICAgICAgICAgIC8vIGFib3V0IHdoYXQncyB3cm9uZy4KLSAgICAgICAgICAgIHJlc3VsdCA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdG9yRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIGJ1aWxkSW52YWxpZERhdGVGb3JtYXRNZXNzYWdlKGZpZWxkKSwKLSAgICAgICAgICAgICAgICBWYWxpZGF0aW9uQ29uc3RyYWludC5EQVRFX0ZPUk1BVCk7Ci0KLSAgICAgICAgLy8gT0ssIGNoZWNrIHRoYXQgdGhlIGRhdGUgaXMgaW4gcmFuZ2UuCi0KLSAgICAgICAgaWYgKF9taW5pbXVtICE9IG51bGwgJiYgX21pbmltdW0uY29tcGFyZVRvKHJlc3VsdCkgPiAwKQotICAgICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRvckV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICBidWlsZERhdGVUb29FYXJseU1lc3NhZ2UoZmllbGQsIGZvcm1hdC5mb3JtYXQoX21pbmltdW0pKSwKLSAgICAgICAgICAgICAgICBWYWxpZGF0aW9uQ29uc3RyYWludC5UT09fU01BTEwpOwotCi0gICAgICAgIGlmIChfbWF4aW11bSAhPSBudWxsICYmIF9tYXhpbXVtLmNvbXBhcmVUbyhyZXN1bHQpIDwgMCkKLSAgICAgICAgICAgIHRocm93IG5ldyBWYWxpZGF0b3JFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgYnVpbGREYXRlVG9vTGF0ZU1lc3NhZ2UoZmllbGQsIGZvcm1hdC5mb3JtYXQoX21heGltdW0pKSwKLSAgICAgICAgICAgICAgICBWYWxpZGF0aW9uQ29uc3RyYWludC5UT09fTEFSR0UpOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgRGF0ZSBnZXRNYXhpbXVtKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfbWF4aW11bTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRNYXhpbXVtKERhdGUgbWF4aW11bSkKLSAgICB7Ci0gICAgICAgIF9tYXhpbXVtID0gbWF4aW11bTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRGF0ZSBnZXRNaW5pbXVtKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfbWluaW11bTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRNaW5pbXVtKERhdGUgbWluaW11bSkKLSAgICB7Ci0gICAgICAgIF9taW5pbXVtID0gbWluaW11bTsKLSAgICB9Ci0KLSAgICAvKiogCi0gICAgICogCi0gICAgICogIEBzaW5jZSAyLjIKLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCByZW5kZXJWYWxpZGF0b3JDb250cmlidXRpb24oCi0gICAgICAgIElGb3JtQ29tcG9uZW50IGZpZWxkLAotICAgICAgICBJTWFya3VwV3JpdGVyIHdyaXRlciwKLSAgICAgICAgSVJlcXVlc3RDeWNsZSBjeWNsZSkKLSAgICB7Ci0gICAgICAgIGlmICghKGlzQ2xpZW50U2NyaXB0aW5nRW5hYmxlZCgpICYmIGlzUmVxdWlyZWQoKSkpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgTWFwIHN5bWJvbHMgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgICAgIHN5bWJvbHMucHV0KCJyZXF1aXJlZE1lc3NhZ2UiLCBidWlsZFJlcXVpcmVkTWVzc2FnZShmaWVsZCkpOwotCi0gICAgICAgIHByb2Nlc3NWYWxpZGF0b3JTY3JpcHQoX3NjcmlwdFBhdGgsIGN5Y2xlLCBmaWVsZCwgc3ltYm9scyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEBzaW5jZSAyLjIKLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNjcmlwdFBhdGgoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9zY3JpcHRQYXRoOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBBbGxvd3MgYSBkZXZlbG9wZXIgdG8gdXNlIHRoZSBleGlzdGluZyB2YWxpZGF0aW9uIGxvZ2ljIHdpdGggYSBkaWZmZXJlbnQgY2xpZW50LXNpZGUKLSAgICAgKiAgc2NyaXB0LiAgVGhpcyBpcyBvZnRlbiBzdWZmaWNpZW50IHRvIGFsbG93IGFwcGxpY2F0aW9uLXNwZWNpZmljIGVycm9yIHByZXNlbnRhdGlvbgotICAgICAqICAocGVyaGFwcyBieSB1c2luZyBESFRNTCB0byB1cGRhdGUgdGhlIGNvbnRlbnQgb2YgYSAmbHQ7c3BhbiZndDsgdGFnLCBvciB0byB1c2UKLSAgICAgKiAgYSBtb3JlIHNvcGhpc3RpY2F0ZWQgcG9wLXVwIHdpbmRvdyB0aGFuIDxjb2RlPndpbmRvdy5hbGVydCgpPC9jb2RlPikuCi0gICAgICogCi0gICAgICogIEBzaW5jZSAyLjIKLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCBzZXRTY3JpcHRQYXRoKFN0cmluZyBzY3JpcHRQYXRoKQotICAgIHsKLSAgICAgICAgX3NjcmlwdFBhdGggPSBzY3JpcHRQYXRoOwotICAgIH0KLQotICAgIC8qKiBAc2luY2UgMy4wICovCi0KLSAgICBwdWJsaWMgU3RyaW5nIGdldERhdGVUb29FYXJseU1lc3NhZ2UoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9kYXRlVG9vRWFybHlNZXNzYWdlOwotICAgIH0KLQotICAgIC8qKiBAc2luY2UgMy4wICovCi0KLSAgICBwdWJsaWMgU3RyaW5nIGdldERhdGVUb29MYXRlTWVzc2FnZSgpCi0gICAgewotICAgICAgICByZXR1cm4gX2RhdGVUb29MYXRlTWVzc2FnZTsKLSAgICB9Ci0KLSAgICAvKiogQHNpbmNlIDMuMCAqLwotCi0gICAgcHVibGljIFN0cmluZyBnZXRJbnZhbGlkRGF0ZUZvcm1hdE1lc3NhZ2UoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9pbnZhbGlkRGF0ZUZvcm1hdE1lc3NhZ2U7Ci0gICAgfQotCi0gICAgLyoqIEBzaW5jZSAzLjAgKi8KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgYnVpbGRJbnZhbGlkRGF0ZUZvcm1hdE1lc3NhZ2UoSUZvcm1Db21wb25lbnQgZmllbGQpCi0gICAgewotICAgICAgICBTdHJpbmcgcGF0dGVybiA9Ci0gICAgICAgICAgICBnZXRQYXR0ZXJuKAotICAgICAgICAgICAgICAgIF9pbnZhbGlkRGF0ZUZvcm1hdE1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgImludmFsaWQtZGF0ZS1mb3JtYXQiLAotICAgICAgICAgICAgICAgIGZpZWxkLmdldFBhZ2UoKS5nZXRMb2NhbGUoKSk7Ci0KLSAgICAgICAgcmV0dXJuIGZvcm1hdFN0cmluZyhwYXR0ZXJuLCBmaWVsZC5nZXREaXNwbGF5TmFtZSgpLCBnZXRFZmZlY3RpdmVEaXNwbGF5Rm9ybWF0KCkpOwotICAgIH0KLQotICAgIC8qKiBAc2luY2UgMy4wICoqLwotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBidWlsZERhdGVUb29FYXJseU1lc3NhZ2UoSUZvcm1Db21wb25lbnQgZmllbGQsIFN0cmluZyBlYXJsaWVzdERhdGUpCi0gICAgewotICAgICAgICBTdHJpbmcgcGF0dGVybiA9Ci0gICAgICAgICAgICBnZXRQYXR0ZXJuKF9kYXRlVG9vRWFybHlNZXNzYWdlLCAiZGF0ZS10b28tZWFybHkiLCBmaWVsZC5nZXRQYWdlKCkuZ2V0TG9jYWxlKCkpOwotCi0gICAgICAgIHJldHVybiBmb3JtYXRTdHJpbmcocGF0dGVybiwgZmllbGQuZ2V0RGlzcGxheU5hbWUoKSwgZWFybGllc3REYXRlKTsKLSAgICB9Ci0KLSAgICAvKiogQHNpbmNlIDMuMCAqLwotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBidWlsZERhdGVUb29MYXRlTWVzc2FnZShJRm9ybUNvbXBvbmVudCBmaWVsZCwgU3RyaW5nIGxhdGVzdERhdGUpCi0gICAgewotICAgICAgICBTdHJpbmcgcGF0dGVybiA9Ci0gICAgICAgICAgICBnZXRQYXR0ZXJuKF9kYXRlVG9vTGF0ZU1lc3NhZ2UsICJkYXRlLXRvby1sYXRlIiwgZmllbGQuZ2V0UGFnZSgpLmdldExvY2FsZSgpKTsKLQotICAgICAgICByZXR1cm4gZm9ybWF0U3RyaW5nKHBhdHRlcm4sIGZpZWxkLmdldERpc3BsYXlOYW1lKCksIGxhdGVzdERhdGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBPdmVycmlkZXMgdGhlIGJ1bmRsZSBrZXkKLSAgICAgKiAgPGNvZGU+ZGF0ZS10b28tZWFybHk8L2NvZGU+LgotICAgICAqICBQYXJhbWV0ZXIgezB9IGlzIHRoZSBkaXNwbGF5IG5hbWUgb2YgdGhlIGZpZWxkLgotICAgICAqICBQYXJhbWV0ZXIgezF9IGlzIHRoZSBlYXJsaWVzdCBhbGxvd2VkIGRhdGUuCi0gICAgICogCi0gICAgICogIEBzaW5jZSAzLjAKLSAgICAgKi8KLQotICAgIHB1YmxpYyB2b2lkIHNldERhdGVUb29FYXJseU1lc3NhZ2UoU3RyaW5nIHN0cmluZykKLSAgICB7Ci0gICAgICAgIF9kYXRlVG9vRWFybHlNZXNzYWdlID0gc3RyaW5nOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBPdmVycmlkZXMgdGhlIGJ1bmRsZSBrZXkKLSAgICAgKiAgPGNvZGU+ZGF0ZS10b28tbGF0ZTwvY29kZT4uCi0gICAgICogIFBhcmFtZXRlciB7MH0gaXMgdGhlIGRpc3BsYXkgbmFtZSBvZiB0aGUgZmllbGQuCi0gICAgICogIFBhcmFtZXRlciB7MX0gaXMgdGhlIGxhdGVzdCBhbGxvd2VkIGRhdGUuCi0gICAgICogCi0gICAgICogIEBzaW5jZSAzLjAKLSAgICAgKi8KLQotICAgIHB1YmxpYyB2b2lkIHNldERhdGVUb29MYXRlTWVzc2FnZShTdHJpbmcgc3RyaW5nKQotICAgIHsKLSAgICAgICAgX2RhdGVUb29MYXRlTWVzc2FnZSA9IHN0cmluZzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgT3ZlcnJpZGVzIHRoZSBidW5kbGUga2V5Ci0gICAgICogIDxjb2RlPmludmFsaWQtZGF0ZS1mb3JtYXQ8L2NvZGU+LgotICAgICAqICBQYXJhbWV0ZXIgezB9IGlzIHRoZSBkaXNwbGF5IG5hbWUgb2YgdGhlIGZpZWxkLgotICAgICAqICBQYXJhbWV0ZXIgezF9IGlzIHRoZSBhbGxvd2VkIGZvcm1hdC4KLSAgICAgKiAKLSAgICAgKiAgQHNpbmNlIDMuMAotICAgICAqLwotCi0gICAgcHVibGljIHZvaWQgc2V0SW52YWxpZERhdGVGb3JtYXRNZXNzYWdlKFN0cmluZyBzdHJpbmcpCi0gICAgewotICAgICAgICBfaW52YWxpZERhdGVGb3JtYXRNZXNzYWdlID0gc3RyaW5nOwotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS92YWxpZC9EYXRlVmFsaWRhdG9yLnNjcmlwdCBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS92YWxpZC9EYXRlVmFsaWRhdG9yLnNjcmlwdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmVjNTA5OC4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdmFsaWQvRGF0ZVZhbGlkYXRvci5zY3JpcHQKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0gJElkJCAtLT4KLTwhRE9DVFlQRSBzY3JpcHQgUFVCTElDCi0JIi0vL0FwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLy9UYXBlc3RyeSBTY3JpcHQgU3BlY2lmaWNhdGlvbiAzLjAvL0VOIgotCSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL3RhcGVzdHJ5L2R0ZC9TY3JpcHRfM18wLmR0ZCI+Ci0JCi08IS0tIAotCi0gIENyZWF0ZXMgYSBzY3JpcHQgZm9yIHZhbGlkYXRpbmcgdGhhdCBhIGRhdGUgZmllbGQgaXMgcmVxdWlyZWQuICBFdmVudHVhbGx5LAotICB0aGlzIHdpbGwgYWxzbyBkbyBjbGllbnQtc2lkZSBpbnB1dCB2YWxpZGF0aW9uLgotICAKLSAgSW5wdXQgc3ltYm9sczoKLSAgICAgZmllbGQsIGZvcm0sIHZhbGlkYXRvcjogIEFzIG5vcm1hbCBmb3IgYSB2YWxpZGF0aW9uIHNjcmlwdC4KLQkgcmVxdWlyZWRNZXNzYWdlOiBNZXNzYWdlIHRvIGRpc3BsYXkgaWYgdGhlIGZpZWxkIGlzIHJlcXVpcmVkIHlldCBibGFuay4KLSAgICAgCi0tLT4KLQkKLTxzY3JpcHQ+Ci0KLTxpbmNsdWRlLXNjcmlwdCByZXNvdXJjZS1wYXRoPSIvb3JnL2FwYWNoZS90YXBlc3RyeS92YWxpZC9WYWxpZGF0b3IuanMiLz4KLQotPGlucHV0LXN5bWJvbCBrZXk9ImZpZWxkIiBjbGFzcz0ib3JnLmFwYWNoZS50YXBlc3RyeS52YWxpZC5WYWxpZEZpZWxkIiByZXF1aXJlZD0ieWVzIi8+Ci08aW5wdXQtc3ltYm9sIGtleT0iZm9ybSIgY2xhc3M9Im9yZy5hcGFjaGUudGFwZXN0cnkuSUZvcm0iIHJlcXVpcmVkPSJ5ZXMiLz4KLTxpbnB1dC1zeW1ib2wga2V5PSJ2YWxpZGF0b3IiIGNsYXNzPSJvcmcuYXBhY2hlLnRhcGVzdHJ5LnZhbGlkLkRhdGVWYWxpZGF0b3IiIHJlcXVpcmVkPSJ5ZXMiLz4KLTxpbnB1dC1zeW1ib2wga2V5PSJyZXF1aXJlZE1lc3NhZ2UiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIi8+Ci0KLTxsZXQga2V5PSJmdW5jdGlvbiIgdW5pcXVlPSJ5ZXMiPgotdmFsaWRhdGVfJHtmaWVsZC5uYW1lfQotPC9sZXQ+Ci0KLTxib2R5PgotZnVuY3Rpb24gJHtmdW5jdGlvbn0oKQotewotICB2YXIgZmllbGQgPSBkb2N1bWVudC4ke2Zvcm0ubmFtZX0uJHtmaWVsZC5uYW1lfTsgCi0KLSAgaWYgKGZpZWxkLnZhbHVlLmxlbmd0aCA9PSAwKQotICAgICByZXR1cm4gdmFsaWRhdG9yX2ludmFsaWRfZmllbGQoZmllbGQsICIke3JlcXVpcmVkTWVzc2FnZX0iKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLTwvYm9keT4KLQotPC9zY3JpcHQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3ZhbGlkL0VtYWlsVmFsaWRhdG9yLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdmFsaWQvRW1haWxWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAzZTNjYy4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdmFsaWQvRW1haWxWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxOCArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS52YWxpZDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSU1hcmt1cFdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZXF1ZXN0Q3ljbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5mb3JtLklGb3JtQ29tcG9uZW50OwotCi0vKioKLSAqICBTaW1wbGUgdmFsaWRhdGlvbiBvZiBlbWFpbCBzdHJpbmdzLCB0byBlbmZvcmNlIHJlcXVpcmVkLCBhbmQgbWluaW11bSBsZW5ndGgKLSAqICAobWF4aW11bSBsZW5ndGggaXMgZW5mb3JjZWQgaW4gdGhlIGNsaWVudCBicm93c2VyLCBieSBzZXR0aW5nIGEgbWF4aW11bSBpbnB1dAotICogIGxlbmd0aCBvbiB0aGUgdGV4dCBmaWVsZCkuCi0gKgotICoKLSAqICBAYXV0aG9yIE1hbGNvbG0gRWRnYXIKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQHNpbmNlIDIuMwotICoKLSAqKi8KLQotcHVibGljIGNsYXNzIEVtYWlsVmFsaWRhdG9yIGV4dGVuZHMgQmFzZVZhbGlkYXRvcgotewotICAgIHByaXZhdGUgaW50IF9taW5pbXVtTGVuZ3RoOwotICAgIHByaXZhdGUgU3RyaW5nIF9taW5pbXVtTGVuZ3RoTWVzc2FnZTsKLSAgICBwcml2YXRlIFN0cmluZyBfaW52YWxpZEVtYWlsRm9ybWF0TWVzc2FnZTsKLQotICAgIHByaXZhdGUgU3RyaW5nIF9zY3JpcHRQYXRoID0gIi9vcmcvYXBhY2hlL3RhcGVzdHJ5L3ZhbGlkL0VtYWlsVmFsaWRhdG9yLnNjcmlwdCI7Ci0KLSAgICBwdWJsaWMgRW1haWxWYWxpZGF0b3IoKQotICAgIHsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEVtYWlsVmFsaWRhdG9yKGJvb2xlYW4gcmVxdWlyZWQpCi0gICAgewotICAgICAgICBzdXBlcihyZXF1aXJlZCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZyhJRm9ybUNvbXBvbmVudCBmaWVsZCwgT2JqZWN0IHZhbHVlKQotICAgIHsKLSAgICAgICAgaWYgKHZhbHVlID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICByZXR1cm4gdmFsdWUudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IHRvT2JqZWN0KElGb3JtQ29tcG9uZW50IGZpZWxkLCBTdHJpbmcgaW5wdXQpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmIChjaGVja1JlcXVpcmVkKGZpZWxkLCBpbnB1dCkpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICBpZiAoX21pbmltdW1MZW5ndGggPiAwICYmIGlucHV0Lmxlbmd0aCgpIDwgX21pbmltdW1MZW5ndGgpCi0gICAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdG9yRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIGJ1aWxkTWluaW11bUxlbmd0aE1lc3NhZ2UoZmllbGQpLAotICAgICAgICAgICAgICAgIFZhbGlkYXRpb25Db25zdHJhaW50Lk1JTklNVU1fV0lEVEgpOwotCi0gICAgICAgIGlmICghaXNWYWxpZEVtYWlsKGlucHV0KSkKLSAgICAgICAgICAgIHRocm93IG5ldyBWYWxpZGF0b3JFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgYnVpbGRJbnZhbGlkRW1haWxGb3JtYXRNZXNzYWdlKGZpZWxkKSwKLSAgICAgICAgICAgICAgICBWYWxpZGF0aW9uQ29uc3RyYWludC5FTUFJTF9GT1JNQVQpOwotCi0gICAgICAgIHJldHVybiBpbnB1dDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldE1pbmltdW1MZW5ndGgoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9taW5pbXVtTGVuZ3RoOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE1pbmltdW1MZW5ndGgoaW50IG1pbmltdW1MZW5ndGgpCi0gICAgewotICAgICAgICBfbWluaW11bUxlbmd0aCA9IG1pbmltdW1MZW5ndGg7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVuZGVyVmFsaWRhdG9yQ29udHJpYnV0aW9uKAotICAgICAgICBJRm9ybUNvbXBvbmVudCBmaWVsZCwKLSAgICAgICAgSU1hcmt1cFdyaXRlciB3cml0ZXIsCi0gICAgICAgIElSZXF1ZXN0Q3ljbGUgY3ljbGUpCi0gICAgewotICAgICAgICBpZiAoIWlzQ2xpZW50U2NyaXB0aW5nRW5hYmxlZCgpKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIE1hcCBzeW1ib2xzID0gbmV3IEhhc2hNYXAoKTsKLQotICAgICAgICBMb2NhbGUgbG9jYWxlID0gZmllbGQuZ2V0UGFnZSgpLmdldExvY2FsZSgpOwotICAgICAgICBTdHJpbmcgZGlzcGxheU5hbWUgPSBmaWVsZC5nZXREaXNwbGF5TmFtZSgpOwotCi0gICAgICAgIGlmIChpc1JlcXVpcmVkKCkpCi0gICAgICAgICAgICBzeW1ib2xzLnB1dCgicmVxdWlyZWRNZXNzYWdlIiwgYnVpbGRSZXF1aXJlZE1lc3NhZ2UoZmllbGQpKTsKLQotICAgICAgICBpZiAoX21pbmltdW1MZW5ndGggPiAwKQotICAgICAgICAgICAgc3ltYm9scy5wdXQoIm1pbmltdW1MZW5ndGhNZXNzYWdlIiwgYnVpbGRNaW5pbXVtTGVuZ3RoTWVzc2FnZShmaWVsZCkpOwotCi0gICAgICAgIFN0cmluZyBwYXR0ZXJuID0gZ2V0UGF0dGVybihnZXRJbnZhbGlkRW1haWxGb3JtYXRNZXNzYWdlKCksICJpbnZhbGlkLWVtYWlsLWZvcm1hdCIsIGxvY2FsZSk7Ci0KLSAgICAgICAgc3ltYm9scy5wdXQoImVtYWlsRm9ybWF0TWVzc2FnZSIsIGZvcm1hdFN0cmluZyhwYXR0ZXJuLCBkaXNwbGF5TmFtZSkpOwotCi0gICAgICAgIHByb2Nlc3NWYWxpZGF0b3JTY3JpcHQoX3NjcmlwdFBhdGgsIGN5Y2xlLCBmaWVsZCwgc3ltYm9scyk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRTY3JpcHRQYXRoKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfc2NyaXB0UGF0aDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgQWxsb3dzIGEgZGV2ZWxvcGVyIHRvIHVzZSB0aGUgZXhpc3RpbmcgdmFsaWRhdGlvbiBsb2dpYyB3aXRoIGEgZGlmZmVyZW50IGNsaWVudC1zaWRlCi0gICAgICogIHNjcmlwdC4gIFRoaXMgaXMgb2Z0ZW4gc3VmZmljaWVudCB0byBhbGxvdyBhcHBsaWNhdGlvbi1zcGVjaWZpYyBlcnJvciBwcmVzZW50YXRpb24KLSAgICAgKiAgKHBlcmhhcHMgYnkgdXNpbmcgREhUTUwgdG8gdXBkYXRlIHRoZSBjb250ZW50IG9mIGEgJmx0O3NwYW4mZ3Q7IHRhZywgb3IgdG8gdXNlCi0gICAgICogIGEgbW9yZSBzb3BoaXN0aWNhdGVkIHBvcC11cCB3aW5kb3cgdGhhbiA8Y29kZT53aW5kb3cuYWxlcnQoKTwvY29kZT4pLgotICAgICAqIAotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIHNldFNjcmlwdFBhdGgoU3RyaW5nIHNjcmlwdFBhdGgpCi0gICAgewotICAgICAgICBfc2NyaXB0UGF0aCA9IHNjcmlwdFBhdGg7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFJldHVybiB0cnVlIGlmIHRoZSBlbWFpbCBmb3JtYXQgaXMgdmFsaWQuCi0gICAgICogCi0gICAgICogIEBwYXJhbSBlbWFpbCB0aGUgZW1haWwgc3RyaW5nIHRvIHZhbGlkYXRlCi0gICAgICogIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZW1haWwgZm9ybWF0IGlzIHZhbGlkCi0gICAgICovCi0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1ZhbGlkRW1haWwoU3RyaW5nIGVtYWlsKQotICAgIHsKLSAgICAgICAgaW50IGF0SW5kZXggPSBlbWFpbC5pbmRleE9mKCdAJyk7Ci0KLSAgICAgICAgaWYgKChhdEluZGV4ID09IC0xKSB8fCAoYXRJbmRleCA9PSAwKSB8fCAoYXRJbmRleCA9PSBlbWFpbC5sZW5ndGgoKSAtIDEpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKiBAc2luY2UgMy4wICovCi0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEludmFsaWRFbWFpbEZvcm1hdE1lc3NhZ2UoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9pbnZhbGlkRW1haWxGb3JtYXRNZXNzYWdlOwotICAgIH0KLQotICAgIC8qKiBAc2luY2UgMy4wICovCi0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE1pbmltdW1MZW5ndGhNZXNzYWdlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfbWluaW11bUxlbmd0aE1lc3NhZ2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIE92ZXJyaWRlcyB0aGUgPGNvZGU+aW52YWxpZC1lbWFpbC1mb3JtYXQ8L2NvZGU+Ci0gICAgICogIGJ1bmRsZSBrZXkuCi0gICAgICogIFBhcmFtZXRlciB7MH0gaXMgdGhlIGRpc3BsYXkgbmFtZSBvZiB0aGUgZmllbGQuCi0gICAgICogCi0gICAgICogIEBzaW5jZSAzLjAKLSAgICAgKiAKLSAgICAgKi8KLQotICAgIHB1YmxpYyB2b2lkIHNldEludmFsaWRFbWFpbEZvcm1hdE1lc3NhZ2UoU3RyaW5nIHN0cmluZykKLSAgICB7Ci0gICAgICAgIF9pbnZhbGlkRW1haWxGb3JtYXRNZXNzYWdlID0gc3RyaW5nOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBPdmVycmlkZXMgdGhlIDxjb2RlPmZpZWxkLXRvby1zaG9ydDwvY29kZT4gYnVuZGxlIGtleS4KLSAgICAgKiAgUGFyYW1ldGVyIHswfSBpcyB0aGUgbWluaW11bSBsZW5ndGguCi0gICAgICogIFBhcmFtZXRlciB7MX0gaXMgdGhlIGRpc3BsYXkgbmFtZSBvZiB0aGUgZmllbGQuCi0gICAgICogCi0gICAgICogIEBzaW5jZSAzLjAKLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRNaW5pbXVtTGVuZ3RoTWVzc2FnZShTdHJpbmcgc3RyaW5nKQotICAgIHsKLSAgICAgICAgX21pbmltdW1MZW5ndGhNZXNzYWdlID0gc3RyaW5nOwotICAgIH0KLQotICAgIC8qKiBAc2luY2UgMy4wICovCi0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkTWluaW11bUxlbmd0aE1lc3NhZ2UoSUZvcm1Db21wb25lbnQgZmllbGQpCi0gICAgewotICAgICAgICBTdHJpbmcgcGF0dGVybiA9Ci0gICAgICAgICAgICBnZXRQYXR0ZXJuKF9taW5pbXVtTGVuZ3RoTWVzc2FnZSwgImZpZWxkLXRvby1zaG9ydCIsIGZpZWxkLmdldFBhZ2UoKS5nZXRMb2NhbGUoKSk7Ci0KLSAgICAgICAgcmV0dXJuIGZvcm1hdFN0cmluZyhwYXR0ZXJuLCBJbnRlZ2VyLnRvU3RyaW5nKF9taW5pbXVtTGVuZ3RoKSwgZmllbGQuZ2V0RGlzcGxheU5hbWUoKSk7Ci0gICAgfQotCi0gICAgLyoqIEBzaW5jZSAzLjAgKi8KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgYnVpbGRJbnZhbGlkRW1haWxGb3JtYXRNZXNzYWdlKElGb3JtQ29tcG9uZW50IGZpZWxkKQotICAgIHsKLSAgICAgICAgU3RyaW5nIHBhdHRlcm4gPQotICAgICAgICAgICAgZ2V0UGF0dGVybigKLSAgICAgICAgICAgICAgICBfaW52YWxpZEVtYWlsRm9ybWF0TWVzc2FnZSwKLSAgICAgICAgICAgICAgICAiaW52YWxpZC1lbWFpbC1mb3JtYXQiLAotICAgICAgICAgICAgICAgIGZpZWxkLmdldFBhZ2UoKS5nZXRMb2NhbGUoKSk7Ci0KLSAgICAgICAgcmV0dXJuIGZvcm1hdFN0cmluZyhwYXR0ZXJuLCBmaWVsZC5nZXREaXNwbGF5TmFtZSgpKTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3ZhbGlkL0VtYWlsVmFsaWRhdG9yLnNjcmlwdCBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS92YWxpZC9FbWFpbFZhbGlkYXRvci5zY3JpcHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmNzI0YjMuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3ZhbGlkL0VtYWlsVmFsaWRhdG9yLnNjcmlwdAorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLSAkSWQkIC0tPgotPCFET0NUWVBFIHNjcmlwdCBQVUJMSUMKLQkiLS8vQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24vL1RhcGVzdHJ5IFNjcmlwdCBTcGVjaWZpY2F0aW9uIDMuMC8vRU4iCi0JImh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvdGFwZXN0cnkvZHRkL1NjcmlwdF8zXzAuZHRkIj4KLQotPCEtLQotCi0gIENyZWF0ZXMgYSBzY3JpcHQgZm9yIHZhbGlkYXRpbmcgdGhhdCBhIGZpZWxkIGlzIHJlcXVpcmVkIGFuZC9vciBoYXMgYSBtaW5pbXVtCi0gIGZpZWxkIGxlbmd0aC4KLQotICBJbnB1dCBzeW1ib2xzOgotICAgICBmaWVsZCwgZm9ybSwgdmFsaWRhdG9yOiAgQXMgbm9ybWFsIGZvciBhIHZhbGlkYXRpb24gc2NyaXB0LgotCSByZXF1aXJlZE1lc3NhZ2U6IE1lc3NhZ2UgdG8gZGlzcGxheSBpZiB0aGUgZmllbGQgaXMgcmVxdWlyZWQgeWV0IGJsYW5rLgotCSBtaW5pbXVtTGVuZ3RoTWVzc2FnZTogTWVzc2FnZSB0byBkaXNwbGF5IGlmIHRoZSBmaWVsZCBsZW5ndGggaXMgdG9vIHNob3J0LgotCi0tLT4KLQotPHNjcmlwdD4KLQotPGluY2x1ZGUtc2NyaXB0IHJlc291cmNlLXBhdGg9Ii9vcmcvYXBhY2hlL3RhcGVzdHJ5L3ZhbGlkL1ZhbGlkYXRvci5qcyIvPgotCi08aW5wdXQtc3ltYm9sIGtleT0iZmllbGQiIGNsYXNzPSJvcmcuYXBhY2hlLnRhcGVzdHJ5LnZhbGlkLlZhbGlkRmllbGQiIHJlcXVpcmVkPSJ5ZXMiLz4KLTxpbnB1dC1zeW1ib2wga2V5PSJmb3JtIiBjbGFzcz0ib3JnLmFwYWNoZS50YXBlc3RyeS5JRm9ybSIgcmVxdWlyZWQ9InllcyIvPgotPGlucHV0LXN5bWJvbCBrZXk9InZhbGlkYXRvciIgY2xhc3M9Im9yZy5hcGFjaGUudGFwZXN0cnkudmFsaWQuRW1haWxWYWxpZGF0b3IiIHJlcXVpcmVkPSJ5ZXMiLz4KLTxpbnB1dC1zeW1ib2wga2V5PSJyZXF1aXJlZE1lc3NhZ2UiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIi8+Ci08aW5wdXQtc3ltYm9sIGtleT0ibWluaW11bUxlbmd0aE1lc3NhZ2UiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIi8+Ci08aW5wdXQtc3ltYm9sIGtleT0iZW1haWxGb3JtYXRNZXNzYWdlIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZyIvPgotCi08bGV0IGtleT0iZnVuY3Rpb24iIHVuaXF1ZT0ieWVzIj4KLXZhbGlkYXRlXyR7ZmllbGQubmFtZX0KLTwvbGV0PgotCi08Ym9keT4KLWZ1bmN0aW9uICR7ZnVuY3Rpb259KCkKLXsKLSAgdmFyIGZpZWxkID0gZG9jdW1lbnQuJHtmb3JtLm5hbWV9LiR7ZmllbGQubmFtZX07Ci0KLSAgc3RyVmFsdWUgPSBmaWVsZC52YWx1ZS5yZXBsYWNlKC8gL2csIiIpOwotCi0gIGZpZWxkLnZhbHVlID0gc3RyVmFsdWU7Ci0KLTxpZiBleHByZXNzaW9uPSJ2YWxpZGF0b3IucmVxdWlyZWQiPgotICBpZiAoc3RyVmFsdWUubGVuZ3RoID09IDApCi0gICAgIHJldHVybiB2YWxpZGF0b3JfaW52YWxpZF9maWVsZChmaWVsZCwgIiR7cmVxdWlyZWRNZXNzYWdlfSIpOwotPC9pZj4KLQotPGlmLW5vdCBleHByZXNzaW9uPSJ2YWxpZGF0b3IucmVxdWlyZWQiPgotICBpZiAoc3RyVmFsdWUubGVuZ3RoID09IDApCi0gICAgIHJldHVybiB0cnVlOwotPC9pZi1ub3Q+Ci0KLTxpZiBleHByZXNzaW9uPSJ2YWxpZGF0b3IubWluaW11bUxlbmd0aCI+Ci0gIGlmIChzdHJWYWx1ZS5sZW5ndGggJmx0OyAke3ZhbGlkYXRvci5taW5pbXVtTGVuZ3RofSkKLSAgICAgcmV0dXJuIHZhbGlkYXRvcl9pbnZhbGlkX2ZpZWxkKGZpZWxkLCAiJHttaW5pbXVtTGVuZ3RoTWVzc2FnZX0iKTsKLTwvaWY+Ci0KLSAgYXRJbmRleCA9IHN0clZhbHVlLmluZGV4T2YoIkAiKTsKLSAgaWYgKChhdEluZGV4ID09IC0xKSB8fCAoYXRJbmRleCA9PSAwKSB8fCAoYXRJbmRleCA9PSBzdHJWYWx1ZS5sZW5ndGggLTEpKQotICAgICByZXR1cm4gdmFsaWRhdG9yX2ludmFsaWRfZmllbGQoZmllbGQsICIke2VtYWlsRm9ybWF0TWVzc2FnZX0iKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLTwvYm9keT4KLQotPC9zY3JpcHQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3ZhbGlkL0ZpZWxkTGFiZWwuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS92YWxpZC9GaWVsZExhYmVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4YzM0MjYuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3ZhbGlkL0ZpZWxkTGFiZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS52YWxpZDsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuQWJzdHJhY3RDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5BcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5CaW5kaW5nRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUZvcm07Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JTWFya3VwV3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlcXVlc3RDeWNsZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LlRhcGVzdHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuZm9ybS5Gb3JtOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuZm9ybS5JRm9ybUNvbXBvbmVudDsKLQotLyoqCi0gKiAgVXNlZCB0byBsYWJlbCBhbiB7QGxpbmsgSUZvcm1Db21wb25lbnR9LiAgQmVjYXVzZSBzdWNoIGZpZWxkcwotICogIGtub3cgdGhlaXIgZGlzcGxheU5hbWUgKHVzZXItcHJlc2VudGFibGUgbmFtZSksIHRoZXJlJ3Mgbm8gcmVhc29uCi0gKiAgdG8gaGFyZCBjb2RlIHRoZSBsYWJlbCBpbiBhIHBhZ2UncyBIVE1MIHRlbXBsYXRlICh0aGlzIGFsc28gaGVscHMKLSAqICB3aXRoIGxvY2FsaXphdGlvbikuCi0gKgotICogIFs8YSBocmVmPSIuLi8uLi8uLi8uLi8uLi9Db21wb25lbnRSZWZlcmVuY2UvRmllbGRMYWJlbC5odG1sIj5Db21wb25lbnQgUmVmZXJlbmNlPC9hPl0KLQotICoKLSAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBMZXdpcyBTaGlwCi0gKiAgQHZlcnNpb24gJElkJAotICogCi0gKiovCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBGaWVsZExhYmVsIGV4dGVuZHMgQWJzdHJhY3RDb21wb25lbnQKLXsKLSAgICAvKioKLSAgICAqICBHZXRzIHRoZSB7QGxpbmsgSUZvcm1Db21wb25lbnR9Ci0gICAgKiAgYW5kIHtAbGluayBJVmFsaWRhdGlvbkRlbGVnYXRlIGRlbGVnYXRlfSwKLSAgICAqICB0aGVuIHJlbmRlcnMgdGhlIGxhYmVsIG9idGFpbmVkIGZyb20gdGhlIGZpZWxkLiAgRG9lcyBub3RoaW5nCi0gICAgKiAgd2hlbiByZXdpbmRpbmcuCi0gICAgKgotICAgICoqLwotCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVuZGVyQ29tcG9uZW50KElNYXJrdXBXcml0ZXIgd3JpdGVyLCBJUmVxdWVzdEN5Y2xlIGN5Y2xlKQotICAgIHsKLSAgICAgICAgaWYgKGN5Y2xlLmlzUmV3aW5kaW5nKCkpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgSUZvcm1Db21wb25lbnQgZmllbGQgPSBnZXRGaWVsZCgpOwotICAgICAgICBTdHJpbmcgZGlzcGxheU5hbWUgPSBnZXREaXNwbGF5TmFtZSgpOwotCi0gICAgICAgIGlmIChkaXNwbGF5TmFtZSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZmllbGQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB0aHJvdyBUYXBlc3RyeS5jcmVhdGVSZXF1aXJlZFBhcmFtZXRlckV4Y2VwdGlvbih0aGlzLCAiZmllbGQiKTsKLQotICAgICAgICAgICAgZGlzcGxheU5hbWUgPSBmaWVsZC5nZXREaXNwbGF5TmFtZSgpOwotCi0gICAgICAgICAgICBpZiAoZGlzcGxheU5hbWUgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0gVGFwZXN0cnkuZm9ybWF0KCJGaWVsZExhYmVsLm5vLWRpc3BsYXktbmFtZSIsIGZpZWxkLmdldEV4dGVuZGVkSWQoKSk7Ci0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQmluZGluZ0V4Y2VwdGlvbihtc2csIHRoaXMsIG51bGwsIGdldEJpbmRpbmcoImZpZWxkIiksIG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgSUZvcm0gZm9ybSA9IEZvcm0uZ2V0KGN5Y2xlKTsKLQotICAgICAgICBpZiAoZm9ybSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgbXNnID0gVGFwZXN0cnkuZ2V0TWVzc2FnZSgiRmllbGRMYWJlbC5tdXN0LWJlLWNvbnRhaW5lZC1ieS1mb3JtIik7Ci0KLSAgICAgICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24obXNnLCB0aGlzLCBudWxsLCBudWxsKTsKLSAgICAgICAgfQotCi0gICAgICAgIElWYWxpZGF0aW9uRGVsZWdhdGUgZGVsZWdhdGUgPSBmb3JtLmdldERlbGVnYXRlKCk7Ci0KLSAgICAgICAgaWYgKGRlbGVnYXRlID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBtc2cgPQotICAgICAgICAgICAgICAgIFRhcGVzdHJ5LmZvcm1hdCgiRmllbGRMYWJlbC5uby1kZWxlZ2F0ZSIsIGdldEV4dGVuZGVkSWQoKSwgZm9ybS5nZXRFeHRlbmRlZElkKCkpOwotCi0gICAgICAgICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uKG1zZywgdGhpcywgbnVsbCwgbnVsbCk7Ci0gICAgICAgIH0KLQotICAgICAgICBkZWxlZ2F0ZS53cml0ZUxhYmVsUHJlZml4KGZpZWxkLCB3cml0ZXIsIGN5Y2xlKTsKLQotICAgICAgICBpZiAoZ2V0UmF3KCkpIHsKLSAgICAgICAgICAgIHdyaXRlci5wcmludFJhdyhkaXNwbGF5TmFtZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB3cml0ZXIucHJpbnQoZGlzcGxheU5hbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgZGVsZWdhdGUud3JpdGVMYWJlbFN1ZmZpeChmaWVsZCwgd3JpdGVyLCBjeWNsZSk7Ci0gICAgfQotCi0gICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXREaXNwbGF5TmFtZSgpOwotCi0gICAgcHVibGljIGFic3RyYWN0IElGb3JtQ29tcG9uZW50IGdldEZpZWxkKCk7Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBnZXRSYXcoKTsKLX0KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS92YWxpZC9GaWVsZExhYmVsLmp3YyBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS92YWxpZC9GaWVsZExhYmVsLmp3YwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTc5MDQzYi4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdmFsaWQvRmllbGRMYWJlbC5qd2MKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gIAotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTwhLS0gJElkJCAtLT4KLTwhRE9DVFlQRSBjb21wb25lbnQtc3BlY2lmaWNhdGlvbiBQVUJMSUMKLSAgIi0vL0FwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLy9UYXBlc3RyeSBTcGVjaWZpY2F0aW9uIDMuMC8vRU4iCi0gICJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL3RhcGVzdHJ5L2R0ZC9UYXBlc3RyeV8zXzAuZHRkIj4KLQotPGNvbXBvbmVudC1zcGVjaWZpY2F0aW9uIGNsYXNzPSJvcmcuYXBhY2hlLnRhcGVzdHJ5LnZhbGlkLkZpZWxkTGFiZWwiCi0JYWxsb3ctYm9keT0ibm8iCi0JYWxsb3ctaW5mb3JtYWwtcGFyYW1ldGVycz0ibm8iPgotCi0gIDxkZXNjcmlwdGlvbj4KLSAgTGFiZWxzIGEgVmFsaWRGaWVsZC4KLSAgPC9kZXNjcmlwdGlvbj4KLQotICA8cGFyYW1ldGVyIG5hbWU9ImZpZWxkIiB0eXBlPSJvcmcuYXBhY2hlLnRhcGVzdHJ5LmZvcm0uSUZvcm1Db21wb25lbnQiIHJlcXVpcmVkPSJ5ZXMiIGRpcmVjdGlvbj0iaW4iLz4KLQotICA8cGFyYW1ldGVyIG5hbWU9ImRpc3BsYXlOYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIiBkaXJlY3Rpb249ImluIj4KLSAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICBPcHRpb25hbC4gIERlZmF1bHRzIHRvIHRoZSBkaXNwbGF5TmFtZSBvZiB0aGUgYXNzb2NpYXRlZCBmaWVsZC4KLSAgICAgIDwvZGVzY3JpcHRpb24+Ci0gIDwvcGFyYW1ldGVyPgotCi0gIDxwYXJhbWV0ZXIgbmFtZT0icmF3IiB0eXBlPSJib29sZWFuIiBkaXJlY3Rpb249ImluIj4KLSAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgSWYgZmFsc2UgKHRoZSBkZWZhdWx0KSwgdGhlbiBIVE1MIGNoYXJhY3RlcnMgaW4gdGhlIHZhbHVlIGFyZSBlc2NhcGVkLiAgSWYKLSAgICAgICAgdHJ1ZSwgdGhlbiB2YWx1ZSBpcyBlbWl0dGVkIGV4YWN0bHkgYXMgaXMuCi0gICAgICA8L2Rlc2NyaXB0aW9uPgotICA8L3BhcmFtZXRlcj4KLQotPC9jb21wb25lbnQtc3BlY2lmaWNhdGlvbj4KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS92YWxpZC9GaWVsZFRyYWNraW5nLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdmFsaWQvRmllbGRUcmFja2luZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDcxOTc5Li4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS92YWxpZC9GaWVsZFRyYWNraW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkudmFsaWQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZW5kZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5mb3JtLklGb3JtQ29tcG9uZW50OwotCi0vKioKLSAqICBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBJRmllbGRUcmFja2luZ30uCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQHNpbmNlIDEuMC44Ci0gKgotICoqLwotCi1wdWJsaWMgY2xhc3MgRmllbGRUcmFja2luZyBpbXBsZW1lbnRzIElGaWVsZFRyYWNraW5nCi17Ci0gICAgcHJpdmF0ZSBJRm9ybUNvbXBvbmVudCBfY29tcG9uZW50OwotICAgIHByaXZhdGUgU3RyaW5nIF9pbnB1dDsKLSAgICBwcml2YXRlIElSZW5kZXIgX3JlbmRlcmVyOwotICAgIHByaXZhdGUgU3RyaW5nIF9maWVsZE5hbWU7Ci0gICAgcHJpdmF0ZSBWYWxpZGF0aW9uQ29uc3RyYWludCBfY29uc3RyYWludDsKLQotCS8qKgotCSAqICBDb25zdHJ1Y3RvciB1c2VkIGZvciB1bmFzc29jaWF0ZWQgZXJyb3JzOyBlcnJvcnMgdGhhdCBhcmUgbm90IGFib3V0IGFueSBwYXJ0aWN1bGFyCi0JICogIGZpZWxkIHdpdGhpbiB0aGUgZm9ybS4KLQkgKiAKLQkgKiovCi0JCi0gICAgRmllbGRUcmFja2luZygpCi0gICAgewotICAgIH0KLQotCS8qKgotCSAqICBTdGFuZGFyZCBjb25zdHJ1Y3RvciBmb3IgYSBmaWVsZCAod2l0aCB0aGUgZ2l2ZW4gbmFtZSksIHJlbmRlcmVkCi0JICogIGJ5IHRoZSBzcGVjaWZpZWQgY29tcG9uZW50LgotCSAqIAotCSAqKi8KLQkKLSAgICBGaWVsZFRyYWNraW5nKFN0cmluZyBmaWVsZE5hbWUsIElGb3JtQ29tcG9uZW50IGNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIF9maWVsZE5hbWUgPSBmaWVsZE5hbWU7Ci0gICAgICAgIF9jb21wb25lbnQgPSBjb21wb25lbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIElGb3JtQ29tcG9uZW50IGdldENvbXBvbmVudCgpCi0gICAgewotICAgICAgICByZXR1cm4gX2NvbXBvbmVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSVJlbmRlciBnZXRFcnJvclJlbmRlcmVyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfcmVuZGVyZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RXJyb3JSZW5kZXJlcihJUmVuZGVyIHZhbHVlKQotICAgIHsKLSAgICAgICAgX3JlbmRlcmVyID0gdmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRJbnB1dCgpCi0gICAgewotICAgICAgICByZXR1cm4gX2lucHV0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldElucHV0KFN0cmluZyB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIF9pbnB1dCA9IHZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmllbGROYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfZmllbGROYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBWYWxpZGF0aW9uQ29uc3RyYWludCBnZXRDb25zdHJhaW50KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfY29uc3RyYWludDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb25zdHJhaW50KFZhbGlkYXRpb25Db25zdHJhaW50IGNvbnN0cmFpbnQpCi0gICAgewotICAgICAgICBfY29uc3RyYWludCA9IGNvbnN0cmFpbnQ7Ci0gICAgfQotCi0gICAgLyoqIEBzaW5jZSAzLjAgKiovCi0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0luRXJyb3IoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9yZW5kZXJlciAhPSBudWxsOwotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS92YWxpZC9JRmllbGRUcmFja2luZy5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3ZhbGlkL0lGaWVsZFRyYWNraW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkZjUwOWIuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3ZhbGlkL0lGaWVsZFRyYWNraW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS52YWxpZDsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlbmRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmZvcm0uSUZvcm1Db21wb25lbnQ7Ci0KLS8qKgotICogRGVmaW5lcyB0aGUgaW50ZXJmYWNlIGZvciBhbiBvYmplY3QgdGhhdCB0cmFja3MgaW5wdXQgZmllbGRzLiBUaGlzIGludGVyZmFjZSBpcyBub3cgcG9vcmx5IG5hbWVkLAotICogaW4gdGhhdCBpdCB0cmFja3MgZXJyb3JzIHRoYXQgbWF5IDxlbT5ub3Q8L2VtPiBiZSBhc3NvY2lhdGVkIHdpdGggYSBzcGVjaWZpYyBmaWVsZC4KLSAqIDxwPgotICogRm9yIGVhY2ggZmllbGQsIGEgZmxhZyBpcyBzdG9yZWQgaW5kaWNhdGluZyBpZiB0aGUgZmllbGQgaXMsIGluIGZhY3QsIGluIGVycm9yLiBUaGUgaW5wdXQKLSAqIHN1cHBsaWVkIGJ5IHRoZSBjbGllbnQgaXMgc3RvcmVkIHNvIHRoYXQgaWYgdGhlIGZvcm0gaXMgcmUtcmVuZGVyZWQgKGFzIGlzIHR5cGljYWxseSBkb25lIHdoZW4KLSAqIHRoZXJlIGFyZSBpbnB1dCBlcnJvcnMpLCB0aGUgdmFsdWUgZW50ZXJlZCBieSB0aGUgdXNlciBpcyBkaXNwbGF5ZWQgYmFjayB0byB0aGUgdXNlci4gQW4gZXJyb3IKLSAqIG1lc3NhZ2UgcmVuZGVyZXIgaXMgc3RvcmVkOyB0aGlzIGlzIGFuIG9iamVjdCB0aGF0IGNhbiByZW5kZXIgdGhlIGVycm9yIG1lc3NhZ2UgKGl0IGlzIHVzdWFsbHkgYQotICoge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkudmFsaWQuUmVuZGVyU3RyaW5nfXdyYXBwZXIgYXJvdW5kIGEgc2ltcGxlIHN0cmluZykuCi0gKiAKLSAqIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqIEB2ZXJzaW9uICRJZCQKLSAqIEBzaW5jZSAxLjAuOAotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSUZpZWxkVHJhY2tpbmcKLXsKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGZpZWxkIGlzIGluIGVycm9yICh0aGF0IGlzLCBpZiBpdCBoYXMgYW4gZXJyb3IgbWVzc2FnZQotICAgICAqIHtAbGluayAjZ2V0RXJyb3JSZW5kZXJlcigpIHJlbmRlcmVyfS4KLSAgICAgKi8KLQotICAgIHB1YmxpYyBib29sZWFuIGlzSW5FcnJvcigpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZmllbGQgY29tcG9uZW50LiBUaGlzIG1heSByZXR1cm4gbnVsbCBpZiB0aGUgZXJyb3IgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCBhbnkKLSAgICAgKiBwYXJ0aWN1bGFyIGZpZWxkLgotICAgICAqLwotCi0gICAgcHVibGljIElGb3JtQ29tcG9uZW50IGdldENvbXBvbmVudCgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBvYmplY3QgdGhhdCB3aWxsIHJlbmRlciB0aGUgZXJyb3IgbWVzc2FnZS4gQWx0ZXJuYXRlbHksIHRoZQotICAgICAqIDxjb2RlPnRvU3RyaW5nKCk8L2NvZGU+IG9mIHRoZSByZW5kZXJlciBjYW4gYmUgdXNlZCBhcyBhIHNpbXBsZSBlcnJvciBtZXNzYWdlLgotICAgICAqIAotICAgICAqIEBzaW5jZSAxLjAuOQotICAgICAqLwotCi0gICAgcHVibGljIElSZW5kZXIgZ2V0RXJyb3JSZW5kZXJlcigpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgaW52YWxpZCBpbnB1dCByZWNvcmRlZCBmb3IgdGhlIGZpZWxkLiBUaGlzIGlzIHN0b3JlZCBzbyB0aGF0LCBvbiBhIHN1YnNlcXVlbnQKLSAgICAgKiByZW5kZXIsIHRoZSBzbWFlIGludmFsaWQgaW5wdXQgY2FuIGJlIHByZXNlbnRlZCB0byB0aGUgY2xpZW50IHRvIGJlIGNvcnJlY3RlZC4KLSAgICAgKi8KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5wdXQoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGZpZWxkLCB0aGF0IGlzLCB0aGUgbmFtZSBhc3NpZ25lZCBieSB0aGUgZm9ybSAodGhpcyB3aWxsIGRpZmZlciBmcm9tCi0gICAgICogdGhlIGNvbXBvbmVudCdzIGlkIHdoZW4gYW55IGtpbmQgb2YgbG9vcGluZyBvcGVyYXRpb24gaXMgaW4gZWZmZWN0KS4KLSAgICAgKi8KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmllbGROYW1lKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWxpZGF0aW9uIGNvbnN0cmFpbnQgdGhhdCB3YXMgdmlvbGF0ZWQgYnkgdGhlIGlucHV0LiBUaGlzIG1heSBiZSBudWxsIGlmIHRoZQotICAgICAqIGNvbnN0cmFpbnQgaXNuJ3Qga25vd24uCi0gICAgICovCi0KLSAgICBwdWJsaWMgVmFsaWRhdGlvbkNvbnN0cmFpbnQgZ2V0Q29uc3RyYWludCgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS92YWxpZC9JVmFsaWRhdGlvbkRlbGVnYXRlLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdmFsaWQvSVZhbGlkYXRpb25EZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODY5NTM3Li4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS92YWxpZC9JVmFsaWRhdGlvbkRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTAgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkudmFsaWQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSU1hcmt1cFdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZW5kZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVxdWVzdEN5Y2xlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuZm9ybS5JRm9ybUNvbXBvbmVudDsKLQotLyoqCi0gKiBJbnRlcmZhY2UgdXNlZCB0byB0cmFjayB2YWxpZGF0aW9uIGVycm9ycyBpbiBmb3JtcyBhbmQge0BsaW5rIElGb3JtQ29tcG9uZW50fXMgKGluY2x1ZGluZwotICoge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkuZm9ybS5BYnN0cmFjdFRleHRGaWVsZH1hbmQgaXRzIHN1YmNsYXNzZXMpLgotICogPHA+Ci0gKiBJbiBhZGRpdGlvbiwgY29udHJvbHMgaG93IGZpZWxkcyB0aGF0IGFyZSBpbiBlcnJvciBhcmUgcHJlc2VudGVkICh0aGV5IGNhbiBiZSBtYXJrZWQgaW4gdmFyaW91cwotICogd2F5cyBieSB0aGUgZGVsZWdhdGU7IHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGFkZHMgdHdvIHJlZCBhc3Rlcmlza3MgdG8gdGhlIHJpZ2h0IG9mIHRoZQotICogZmllbGQpLgotICogPHA+Ci0gKiBUaGUgaW50ZXJmYWNlIGlzIGRlc2lnbmVkIHNvIHRoYXQgYSBzaW5nbGUgaW5zdGFuY2UgY2FuIGJlIHNoYXJlZCB3aXRoIG1hbnkgaW5zdGFuY2VzIG9mCi0gKiB7QGxpbmsgSUZvcm1Db21wb25lbnR9LgotICogPHA+Ci0gKiBTdGFydGluZyB3aXRoIHJlbGVhc2UgMS4wLjgsIHRoaXMgaW50ZXJmYWNlIHdhcyBleHRlbnNpdmVseSByZXZpc2VkIChpbiBhIG5vbi1iYWNrd2FyZHMKLSAqIGNvbXBhdGlibGUgd2F5KSB0byBtb3ZlIHRoZSB0cmFja2luZyBvZiBlcnJvcnMgYW5kIGludmFsaWQgdmFsdWVzIChkdXJpbmcgYSByZXF1ZXN0IGN5Y2xlKSB0byB0aGUKLSAqIGRlbGVnYXRlLiBJdCBoYXMgZXZvbHZlZCBmcm9tIGEgbGFyZ2VseSBzdGF0ZWxlc3MgY29uZHVpdCBmb3IgZXJyb3IgbWVzc2FnZXMgaW50byBhIHZlcnkgc3RhdGVmdWwKLSAqIHRyYWNrZXIgb2YgZmllbGQgc3RhdGUuCi0gKiA8cD4KLSAqIFN0YXJ0aW5nIHdpdGggcmVsZWFzZSAxLjAuOSwgdGhpcyBpbnRlcmZhY2Ugd2FzIDxlbT5hZ2FpbjwvZW0+IHJld29ya2VkLCB0byBhbGxvdyB0cmFja2luZyBvZgotICogZXJyb3JzIGluIHtAbGluayBJRm9ybUNvbXBvbmVudCBmb3JtIGNvbXBvbmVudHN9LCBhbmQgdG8gYWxsb3cgdW5hc3NvY2lhdGVkICh3aXRoIGFueSBmaWVsZCkKLSAqIGVycm9ycyB0byBiZSB0cmFja2VkLgotICogPHA+Ci0gKiA8Yj5GaWVsZHMgdnMuIEZvcm0gQ29tcG9uZW50cyA8L2I+IDxicj4KLSAqIEZvciBtb3N0IHNpbXBsZSBmb3JtcywgdGhlc2UgdGVybXMgYXJlIHByZXR0eSBtdWNoIHN5bm9ueW1vdXMuIFlvdXIgZm9ybSB3aWxsIHJlbmRlciBub3JtYWxseSwKLSAqIGFuZCBlYWNoIGZvcm0gY29tcG9uZW50IHdpbGwgcmVuZGVyIG9ubHkgb25jZS4gU29tZSBvZiB5b3VyIGZvcm0gY29tcG9uZW50cyB3aWxsIGJlCi0gKiB7QGxpbmsgVmFsaWRGaWVsZH1jb21wb25lbnRzIGFuZCBoYW5kbGUgbW9zdCBvZiB0aGVpciB2YWxpZGF0aW9uIGludGVybmFsbHkgKHdpdGggdGhlIGhlbHAgb2YKLSAqIHtAbGluayBJVmFsaWRhdG9yfW9iamVjdHMpLiBJbiBhZGRpdGlvbiwgeW91ciBmb3JtIGxpc3RlbmVyIG1heSBkbyBhZGRpdGlvbmFsIHZhbGlkYXRpb24gYW5kCi0gKiBub3RpZnkgdGhlIHZhbGlkYXRpb24gZGVsZWdhdGUgb2YgYWRkaXRpb25hbCBlcnJvcnMsIHNvbWUgb2Ygd2hpY2ggYXJlIGFzc29jaWF0ZWQgd2l0aCBhCi0gKiBwYXJ0aWN1bGFyIGZpZWxkLCBzb21lIG9mIHdoaWNoIGFyZSB1bmFzc29jaWF0ZWQgd2l0aCBhbnkgcGFydGljdWxhciBmaWVsZC4KLSAqIDxwPgotICogQnV0IHdoYXQgaGFwcGVucyBpZiB5b3UgdXNlIGEge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkuY29tcG9uZW50cy5Gb3JlYWNofW9yCi0gKiB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5mb3JtLkxpc3RFZGl0fWluc2lkZSB5b3VyIGZvcm0/IFNvbWUgb2YgeW91ciBjb21wb25lbnRzIHdpbGwgcmVuZGVyCi0gKiBtdWx0aXBsZSB0aW1lcy4gSW4gdGhpcyBjYXNlIHlvdSB3aWxsIGhhdmUgbXVsdGlwbGUgPGVtPmZpZWxkczwvZW0+LiBFYWNoIGZpZWxkIHdpbGwgaGF2ZSBhCi0gKiB1bmlxdWUgZmllbGQgbmFtZSAoeW91IGNhbiBzZWUgdGhpcyBpbiB0aGUgZ2VuZXJhdGVkIEhUTUwpLiBJdCBpcyB0aGlzIGZpZWxkIG5hbWUgdGhhdCB0aGUKLSAqIGRlbGVnYXRlIGtleXMgb2ZmIG9mLCB3aGljaCBtZWFucyB0aGF0IHNvbWUgZmllbGRzIGdlbmVyYXRlZCBieSBhIGNvbXBvbmVudCBtYXkgaGF2ZSBlcnJvcnMgYW5kCi0gKiBzb21lIG1heSBub3QsIGl0IGFsbCB3b3JrcyBmaW5lICh3aXRoIG9uZSBleGNlcHRpb24pLgotICogPHA+Ci0gKiA8Yj5UaGUgRXhjZXB0aW9uIDwvYj4gPGJyPgotICogVGhlIHByb2JsZW0gaXMgdGhhdCBhIGNvbXBvbmVudCBkb2Vzbid0IGtub3cgaXRzIGZpZWxkIG5hbWUgdW50aWwgaXRzIDxjb2RlPnJlbmRlcigpPC9jb2RlPgotICogbWV0aG9kIGlzIGludm9rZWQgKGF0IHdoaWNoIHBvaW50LCBpdCBhbGxvY2F0ZXMgYSB1bmlxdWUgZmllbGQgbmFtZSBmcm9tIHRoZQotICoge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkuSUZvcm0jZ2V0RWxlbWVudElkKG9yZy5hcGFjaGUudGFwZXN0cnkuZm9ybS5JRm9ybUNvbXBvbmVudCl9LiBUaGlzIGlzCi0gKiBub3QgYSBwcm9ibGVtIGZvciB0aGUgZmllbGQgb3IgaXRzIHtAbGluayBJVmFsaWRhdG9yfSwgYnV0IHNjcmV3cyB0aGluZ3MgdXAgZm9yIHRoZQotICoge0BsaW5rIEZpZWxkTGFiZWx9LgotICogPHA+Ci0gKiBUeXBpY2FsbHksIHRoZSBsYWJlbCBpcyByZW5kZXJlZCA8ZW0+YmVmb3JlPC9lbT4gdGhlIGNvcnJlc3BvbmRpbmcgZm9ybSBjb21wb25lbnQuIEZvcm0KLSAqIGNvbXBvbmVudHMgbGVhdmUgdGhlaXIgbGFzdCBhc3NpZ25lZCBmaWVsZCBuYW1lIGluIHRoZWlyCi0gKiB7QGxpbmsgSUZvcm1Db21wb25lbnQjZ2V0TmFtZSgpIG5hbWUgcHJvcGVydHl9LiBTbyBpZiB0aGUgZm9ybSBjb21wb25lbnQgaXMgaW4gYW55IGtpbmQgb2YgbG9vcCwKLSAqIHRoZSB7QGxpbmsgRmllbGRMYWJlbH13aWxsIGtleSBpdHMgbmFtZSwge0BsaW5rIElGb3JtQ29tcG9uZW50I2dldERpc3BsYXlOYW1lKCkgZGlzcGxheSBuYW1lfQotICogYW5kIGVycm9yIHN0YXR1cyBvZmYgb2YgaXRzIGxhc3QgcmVuZGVycmVkIHZhbHVlLiBTbyB0aGUgbW9yYWwgb2YgdGhlIHN0b3J5IGlzIGRvbid0IHVzZQotICoge0BsaW5rIEZpZWxkTGFiZWx9aW4gdGhpcyBzaXR1YXRpb24uCi0gKiAKLSAqIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElWYWxpZGF0aW9uRGVsZWdhdGUKLXsKLSAgICAvKioKLSAgICAgKiBJbnZva2VkIGJlZm9yZSBvdGhlciBtZXRob2RzIHRvIGNvbmZpZ3VyZSB0aGUgZGVsZWdhdGUgZm9yIHRoZSBnaXZlbiBmb3JtIGNvbXBvbmVudC4gU2V0cyB0aGUKLSAgICAgKiBjdXJyZW50IGZpZWxkIGJhc2VkIG9uIHRoZSB7QGxpbmsgSUZvcm1Db21wb25lbnQjZ2V0TmFtZSgpIG5hbWV9b2YgdGhlIGZvcm0gY29tcG9uZW50ICh3aGljaAotICAgICAqIGlzIGFsbW9zdCBhbHdheXMgYSB7QGxpbmsgVmFsaWRGaWVsZH0pLgotICAgICAqIDxwPgotICAgICAqIFRoZSBjYWxsZXIgc2hvdWxkIGludm9rZSB0aGlzIHdpdGggYSBwYXJhbWV0ZXIgb2YgbnVsbCB0byByZWNvcmQgdW5hc3NvY2lhdGVkIGdsb2JhbCBlcnJvcnMKLSAgICAgKiAoZXJyb3JzIG5vdCBhc3NvY2lhdGVkIHdpdGggYW55IHBhcnRpY3VsYXIgZmllbGQpLgotICAgICAqIAotICAgICAqIEBzaW5jZSAxLjAuOAotICAgICAqLwotCi0gICAgcHVibGljIHZvaWQgc2V0Rm9ybUNvbXBvbmVudChJRm9ybUNvbXBvbmVudCBjb21wb25lbnQpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBjdXJyZW50IGNvbXBvbmVudCBpcyBpbiBlcnJvciAodGhhdCBpcywgaGFkIGJhZCBpbnB1dCBzdWJtaXR0ZWQgYnkgdGhlCi0gICAgICogZW5kIHVzZXIpLgotICAgICAqIAotICAgICAqIEBzaW5jZSAxLjAuOAotICAgICAqLwotCi0gICAgcHVibGljIGJvb2xlYW4gaXNJbkVycm9yKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzdHJpbmcgc3VibWl0dGVkIGJ5IHRoZSBjbGllbnQgYXMgdGhlIHZhbHVlIGZvciB0aGUgY3VycmVudCBmaWVsZC4KLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMS4wLjgKLSAgICAgKi8KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmllbGRJbnB1dFZhbHVlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEge0BsaW5rIExpc3R9b2Yge0BsaW5rIElGaWVsZFRyYWNraW5nfSwgaW4gZGVmYXVsdCBvcmRlciAodGhlIG9yZGVyIGluIHdoaWNoCi0gICAgICogZmllbGRzIGFyZSByZW5kZXJyZWQpLiBBIGNhbGxlciBzaG91bGQgbm90IGNoYW5nZSB0aGUgdmFsdWVzICh0aGUgTGlzdCBpcyBpbW11dGFibGUpLiBNYXkKLSAgICAgKiByZXR1cm4gbnVsbCBpZiBubyBmaWVsZHMgYXJlIGluIGVycm9yLgotICAgICAqIAotICAgICAqIEBzaW5jZSAxLjAuOAotICAgICAqLwotCi0gICAgcHVibGljIExpc3QgZ2V0RmllbGRUcmFja2luZygpOwotCi0gICAgLyoqCi0gICAgICogUmVzZXRzIGFueSB0cmFja2luZyBpbmZvcm1hdGlvbiBmb3IgdGhlIGN1cnJlbnQgZmllbGQuIFRoaXMgd2lsbCBjbGVhciB0aGUgZmllbGQncyBpbkVycm9yCi0gICAgICogZmxhZywgYW5kIHNldCBpdHMgZXJyb3IgbWVzc2FnZSBhbmQgaW52YWxpZCBpbnB1dCB2YWx1ZSB0byBudWxsLgotICAgICAqIAotICAgICAqIEBzaW5jZSAxLjAuOAotICAgICAqLwotCi0gICAgcHVibGljIHZvaWQgcmVzZXQoKTsKLQotICAgIC8qKgotICAgICAqIENsZWFycyBhbGwgdHJhY2tpbmcgaW5mb3JtYXRpb24uCi0gICAgICogCi0gICAgICogQHNpbmNlIDEuMC4xMAotICAgICAqLwotCi0gICAgcHVibGljIHZvaWQgY2xlYXIoKTsKLQotICAgIC8qKgotICAgICAqIENsZWFycyBhbGwgZXJyb3JzLCBidXQgbWFpbnRhaW5zIHVzZXIgaW5wdXQuIFRoaXMgaXMgdXNlZnVsIHdoZW4gYSBmb3JtIGhhcyBiZWVuIHN1Ym1pdHRlZAotICAgICAqIGZvciBhIHNlbWFudGljIG90aGVyIHRoYW4gInByb2Nlc3MgdGhpcyBkYXRhIi4gQSBjb21tb24gZXhhbXBsZSBvZiB0aGlzIGlzIGEgZGVwZW5kZW50IGRyb3AKLSAgICAgKiBkb3duIGxpc3Q7IHNlbGVjdGluZyBhbiBvcHRpb24gaW4gb25lIGRyb3AgZG93biBsaXN0IGZvcmNlcyBhIHN1Ym1pdCB0byByZXBvcHVsYXRlIHRoZQotICAgICAqIG9wdGlvbnMgaW4gYSBzZWNvbmQsIGRlcGVuZGVudCBkcm9wIGRvd24gbGlzdC4KLSAgICAgKiA8cD4KLSAgICAgKiBJbiB0aGVzZSBjYXNlcywgdGhlIHVzZXIgaW5wdXQgcHJvdmlkZWQgaW4gdGhlIHJlcXVlc3QgaXMgbWFpbnRhaW5lZCwgYnV0IGFueSBlcnJvcnMgc2hvdWxkCi0gICAgICogYmUgY2xlYXJlZCBvdXQgKHRvIHByZXZlbnQgdW53YW50ZWQgZXJyb3IgbWVzc2FnZXMgYW5kIGRlY29yYXRpb25zKS4KLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMy4wLjEKLSAgICAgKi8KLQotICAgIHB1YmxpYyB2b2lkIGNsZWFyRXJyb3JzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZWNvcmRzIHRoZSB1c2VyJ3MgaW5wdXQgZm9yIHRoZSBjdXJyZW50IGZvcm0gY29tcG9uZW50LiBJbnB1dCBzaG91bGQgYmUgcmVjb3JkZWQgZXZlbiBpZgotICAgICAqIHRoZXJlIGlzbid0IGFuIGV4cGxpY2l0IGVycm9yLCBzaW5jZSBsYXRlciBmb3JtLXdpZGUgdmFsaWRhdGlvbnMgbWF5IGRpc2NvdmVyIGFuIGVycm9yIGluIHRoZQotICAgICAqIGZpZWxkLgotICAgICAqIAotICAgICAqIEBzaW5jZSAzLjAKLSAgICAgKi8KLQotICAgIHB1YmxpYyB2b2lkIHJlY29yZEZpZWxkSW5wdXRWYWx1ZShTdHJpbmcgaW5wdXQpOwotCi0gICAgLyoqCi0gICAgICogVGhlIGVycm9yIG5vdGlmaWNhdGlvbiBtZXRob2QsIGludm9rZWQgZHVyaW5nIHRoZSByZXdpbmQgcGhhc2UgKHRoYXQgaXMsIHdoaWxlIEhUVFAKLSAgICAgKiBwYXJhbWV0ZXJzIGFyZSBiZWluZyBleHRyYWN0ZWQgZnJvbSB0aGUgcmVxdWVzdCBhbmQgYXNzaWduZWQgdG8gdmFyaW91cyBvYmplY3QgcHJvcGVydGllcykuCi0gICAgICogPHA+Ci0gICAgICogVHlwaWNhbGx5LCB0aGUgZGVsZWdhdGUgc2ltcGx5IGludm9rZXMge0BsaW5rICNyZWNvcmQoU3RyaW5nLCBWYWxpZGF0aW9uQ29uc3RyYWludCl9b3IKLSAgICAgKiB7QGxpbmsgI3JlY29yZChJUmVuZGVyLCBWYWxpZGF0aW9uQ29uc3RyYWludCl9LCBidXQgc3BlY2lhbCBkZWxlZ2F0ZXMgbWF5IG92ZXJyaWRlIHRoaXMKLSAgICAgKiBiZWhhdmlvciB0byBwcm92aWRlIChpbiBzb21lIGNhc2VzKSBkaWZmZXJlbnQgZXJyb3IgbWVzc2FnZXMgb3IgbW9yZSBjb21wbGljYXRlZCBlcnJvcgotICAgICAqIHJlbmRlcmVycy4KLSAgICAgKi8KLQotICAgIHB1YmxpYyB2b2lkIHJlY29yZChWYWxpZGF0b3JFeGNlcHRpb24gZXgpOwotCi0gICAgLyoqCi0gICAgICogUmVjb3JkcyBhbiBlcnJvciBpbiB0aGUgY3VycmVudCBmaWVsZCwgb3IgYW4gdW5hc3NvY2lhdGVkIGVycm9yIGlmIHRoZXJlIGlzIG5vIGN1cnJlbnQgZmllbGQuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIG1lc3NhZ2UgdG8gZGlzcGxheSAoQHNlZSBSZW5kZXJTdHJpbmd9Ci0gICAgICogQHBhcmFtIGNvbnN0cmFpbnQKLSAgICAgKiAgICAgICAgICAgIHRoZSBjb25zdHJhaW50IHRoYXQgd2FzIHZpb2xhdGVkLCBvciBudWxsIGlmIG5vdCBrbm93bgotICAgICAqIEBzaW5jZSAxLjAuOQotICAgICAqLwotCi0gICAgcHVibGljIHZvaWQgcmVjb3JkKFN0cmluZyBtZXNzYWdlLCBWYWxpZGF0aW9uQ29uc3RyYWludCBjb25zdHJhaW50KTsKLQotICAgIC8qKgotICAgICAqIFJlY29yZHMgYW4gZXJyb3IgaW4gdGhlIGN1cnJlbnQgY29tcG9uZW50LCBvciBhbiB1bmFzc29jaWF0ZWQgZXJyb3IuIFRoZSBtYXhpbXVtIGZsZXhpYmlsaXR5Ci0gICAgICogcmVjb3JkZXIuCi0gICAgICogCi0gICAgICogQHBhcmFtIGVycm9yUmVuZGVyZXIKLSAgICAgKiAgICAgICAgICAgIG9iamVjdCB0aGF0IHdpbGwgcmVuZGVyIHRoZSBlcnJvciBtZXNzYWdlIChAc2VlIFJlbmRlclN0cmluZ30uIFRoZSBvYmplY3Qgc2hvdWxkCi0gICAgICogICAgICAgICAgICBpbXBsZW1lbnQgYSByZWFzb25hYmxlIDxjb2RlPnRvU3RyaW5nKCk8L2NvZGU+IGFzIHdlbGwsIHRvIGFsbG93IHRoZSBlcnJvcgotICAgICAqICAgICAgICAgICAgbWVzc2FnZSB0byBiZSByZW5kZXJlZCB1c2luZyBhbiBJbnNlcnQgY29tcG9uZW50LCBvciB1c2VkIHdoZXJlIGZ1bGwgbWFya3VwIGlzIG5vdAotICAgICAqICAgICAgICAgICAgYWxsb3dlZC4KLSAgICAgKiBAcGFyYW0gY29uc3RyYWludAotICAgICAqICAgICAgICAgICAgdGhlIGNvbnN0cmFpbnQgdGhhdCB3YXMgdmlvbGF0ZWQsIG9yIG51bGwgaWYgbm90IGtub3duCi0gICAgICovCi0KLSAgICBwdWJsaWMgdm9pZCByZWNvcmQoSVJlbmRlciBlcnJvclJlbmRlcmVyLCBWYWxpZGF0aW9uQ29uc3RyYWludCBjb25zdHJhaW50KTsKLQotICAgIC8qKgotICAgICAqIEludm9rZWQgYmVmb3JlIHRoZSBmaWVsZCBpcyByZW5kZXJlZC4gSWYgdGhlIGZpZWxkIGlzIGluIGVycm9yLCB0aGUgZGVsZWdhdGUgbWF5IGRlY29yYXRlIHRoZQotICAgICAqIGZpZWxkIGluIHNvbWUgd2F5ICh0byBoaWdobGlnaHQgaXRzIGVycm9yIHN0YXRlKS4KLSAgICAgKi8KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlUHJlZml4KElNYXJrdXBXcml0ZXIgd3JpdGVyLCBJUmVxdWVzdEN5Y2xlIGN5Y2xlLCBJRm9ybUNvbXBvbmVudCBjb21wb25lbnQsCi0gICAgICAgICAgICBJVmFsaWRhdG9yIHZhbGlkYXRvcik7Ci0KLSAgICAvKioKLSAgICAgKiBJbnZva2VkIGp1c3QgYmVmb3JlIHRoZSAmbHQ7aW5wdXQmZ3Q7IGVsZW1lbnQgaXMgY2xvc2VkLiBUaGUgZGVsZWdhdGUgY2FuIHdyaXRlIGFkZGl0aW9uYWwKLSAgICAgKiBhdHRyaWJ1dGVzLiBUaGlzIGlzIG9mdGVuIHVzZWQgdG8gc2V0IHRoZSBDU1MgY2xhc3Mgb2YgdGhlIGZpZWxkIHNvIHRoYXQgaXQgY2FuIGJlIGRpc3BsYXllZAotICAgICAqIGRpZmZlcmVudGx5LCBpZiBpbiBlcnJvciAob3IgcmVxdWlyZWQpLgotICAgICAqIAotICAgICAqIEBzaW5jZSAxLjAuNQotICAgICAqLwotCi0gICAgcHVibGljIHZvaWQgd3JpdGVBdHRyaWJ1dGVzKElNYXJrdXBXcml0ZXIgd3JpdGVyLCBJUmVxdWVzdEN5Y2xlIGN5Y2xlLAotICAgICAgICAgICAgSUZvcm1Db21wb25lbnQgY29tcG9uZW50LCBJVmFsaWRhdG9yIHZhbGlkYXRvcik7Ci0KLSAgICAvKioKLSAgICAgKiBJbnZva2VkIGFmdGVyIHRoZSBmb3JtIGNvbXBvbmVudCBpcyByZW5kZXJlZCwgc28gdGhhdCB0aGUgZGVsZWdhdGUgbWF5IGRlY29yYXRlIHRoZSBmb3JtCi0gICAgICogY29tcG9uZW50IChpZiBpdCBpcyBpbiBlcnJvcikuCi0gICAgICovCi0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZVN1ZmZpeChJTWFya3VwV3JpdGVyIHdyaXRlciwgSVJlcXVlc3RDeWNsZSBjeWNsZSwgSUZvcm1Db21wb25lbnQgY29tcG9uZW50LAotICAgICAgICAgICAgSVZhbGlkYXRvciB2YWxpZGF0b3IpOwotCi0gICAgLyoqCi0gICAgICogSW52b2tlZCBieSBhIHtAbGluayBGaWVsZExhYmVsfWp1c3QgYmVmb3JlIHdyaXRpbmcgdGhlIG5hbWUgb2YgdGhlIGZvcm0gY29tcG9uZW50LgotICAgICAqLwotCi0gICAgcHVibGljIHZvaWQgd3JpdGVMYWJlbFByZWZpeChJRm9ybUNvbXBvbmVudCBjb21wb25lbnQsIElNYXJrdXBXcml0ZXIgd3JpdGVyLCBJUmVxdWVzdEN5Y2xlIGN5Y2xlKTsKLQotICAgIC8qKgotICAgICAqIEludm9rZWQgYnkgYSB7QGxpbmsgRmllbGRMYWJlbH1qdXN0IGFmdGVyIHdyaXRpbmcgdGhlIG5hbWUgb2YgdGhlIGZvcm0gY29tcG9uZW50LgotICAgICAqLwotCi0gICAgcHVibGljIHZvaWQgd3JpdGVMYWJlbFN1ZmZpeChJRm9ybUNvbXBvbmVudCBjb21wb25lbnQsIElNYXJrdXBXcml0ZXIgd3JpdGVyLCBJUmVxdWVzdEN5Y2xlIGN5Y2xlKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiBhbnkgZm9ybSBjb21wb25lbnQgaGFzIGVycm9ycy4KLSAgICAgKi8KLQotICAgIHB1YmxpYyBib29sZWFuIGdldEhhc0Vycm9ycygpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUge0BsaW5rIElGaWVsZFRyYWNraW5nfWZvciB0aGUgY3VycmVudCBjb21wb25lbnQsIGlmIGFueS4gVXNlZnVsIHdoZW4gZGlzcGxheWluZwotICAgICAqIGVycm9yIG1lc3NhZ2VzIGZvciBpbmRpdmlkdWFsIGZpZWxkcy4KLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMy4wLjIKLSAgICAgKi8KLSAgICBwdWJsaWMgSUZpZWxkVHJhY2tpbmcgZ2V0Q3VycmVudEZpZWxkVHJhY2tpbmcoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdmFsaWQvSVZhbGlkYXRvci5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3ZhbGlkL0lWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ2MzZkNC4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdmFsaWQvSVZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkudmFsaWQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklNYXJrdXBXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVxdWVzdEN5Y2xlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuZm9ybS5JRm9ybUNvbXBvbmVudDsKLQotLyoqCi0gKiAgQW4gb2JqZWN0IHRoYXQgd29ya3Mgd2l0aCBhbiB7QGxpbmsgSUZvcm1Db21wb25lbnR9IHRvIGZvcm1hdCBvdXRwdXQKLSAqICAoY29udmVydCBvYmplY3QgdmFsdWVzIHRvIHN0cmluZ3MgdmFsdWVzKSBhbmQgdG8gcHJvY2VzcyBpbnB1dAotICogIChjb252ZXJ0IHN0cmluZ3MgdG8gb2JqZWN0IHZhbHVlcyBhbmQgdmFsaWRhdGUgdGhlbSkuCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQHNpbmNlIDEuMC44Ci0gKgotICoqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElWYWxpZGF0b3IKLXsKLSAgICAvKioKLSAgICAgKiAgQWxsIHZhbGlkYXRvcnMgbXVzdCBpbXBsZW1lbnQgYSByZXF1aXJlZCBwcm9wZXJ0eS4gIElmIHRydWUsCi0gICAgICogIHRoZSBjbGllbnQgbXVzdCBzdXBwbHkgYSBub24tbnVsbCB2YWx1ZS4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBib29sZWFuIGlzUmVxdWlyZWQoKTsKLQotICAgIC8qKgotICAgICAqICBJbnZva2VkIGR1cmluZyByZW5kZXJpbmcgdG8gY29udmVydCBhbiBvYmplY3QgdmFsdWUgKHdoaWNoIG1heSBiZSBudWxsKQotICAgICAqICB0byBhIFN0cmluZy4gIEl0IGlzIGFjY2VwdGlibGUgdG8gcmV0dXJuIG51bGwuICBUaGUgc3RyaW5nIHdpbGwgYmUgdGhlCi0gICAgICogIFZBTFVFIGF0dHJpYnV0ZSBvZiB0aGUgSFRNTCB0ZXh0IGZpZWxkLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZyhJRm9ybUNvbXBvbmVudCBmaWVsZCwgT2JqZWN0IHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqICBDb252ZXJ0cyBpbnB1dCwgc3VibWl0dGVkIGJ5IHRoZSBjbGllbnQsIGludG8gYW4gb2JqZWN0IHZhbHVlLgotICAgICAqICBNYXkgcmV0dXJuIG51bGwgaWYgdGhlIGlucHV0IGlzIG51bGwgKGFuZCB0aGUgcmVxdWlyZWQgZmxhZyBpcyBmYWxzZSkuCi0gICAgICoKLSAgICAgKiAgPHA+VGhlIGlucHV0IHN0cmluZyB3aWxsIGFscmVhZHkgaGF2ZSBiZWVuIHRyaW1tZWQuICBJdCBtYXkgYmUgbnVsbC4KLSAgICAgKgotICAgICAqICBAdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbiBpZiB0aGUgc3RyaW5nIGNhbm5vdCBiZSBjb252ZXJ0ZWQgaW50bwotICAgICAqICBhbiBvYmplY3QsIG9yIHRoZSBvYmplY3QgaXMKLSAgICAgKiAgbm90IHZhbGlkIChkdWUgdG8gb3RoZXIgY29uc3RyYWludHMpLgotICAgICAqKi8KLQotICAgIHB1YmxpYyBPYmplY3QgdG9PYmplY3QoSUZvcm1Db21wb25lbnQgZmllbGQsIFN0cmluZyBpbnB1dCkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqICBJbnZva2VkIGJ5IHRoZSBmaWVsZCBhZnRlciBpdCBmaW5pc2hlcyByZW5kZXJpbmcgaXRzIHRhZyAoYnV0IGJlZm9yZQotICAgICAqICB0aGUgdGFnIGlzIGNsb3NlZCkgdG8gYWxsb3cgdGhlIHZhbGlkYXRvciB0byBwcm92aWRlIGEgY29udHJpYnV0aW9uIHRvIHRoZQotICAgICAqICByZW5kZXJpbmcgcHJvY2Vzcy4gIFZhbGlkYXRvcnMgdHlwaWNhbGx5IGdlbmVyYXRlZCBjbGllbnQtc2lkZSBKYXZhU2NyaXB0Ci0gICAgICogIHRvIHBlZm9ybSB2YWxpZGF0aW9uLgotICAgICAqCi0gICAgICogIEBzaW5jZSAyLjIKLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIHJlbmRlclZhbGlkYXRvckNvbnRyaWJ1dGlvbigKLSAgICAgICAgSUZvcm1Db21wb25lbnQgZmllbGQsCi0gICAgICAgIElNYXJrdXBXcml0ZXIgd3JpdGVyLAotICAgICAgICBJUmVxdWVzdEN5Y2xlIGN5Y2xlKTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS92YWxpZC9OdW1iZXJWYWxpZGF0b3IuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS92YWxpZC9OdW1iZXJWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQ4ZmI0NS4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdmFsaWQvTnVtYmVyVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2ODIgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkudmFsaWQ7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LkFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklNYXJrdXBXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVxdWVzdEN5Y2xlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuVGFwZXN0cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5mb3JtLklGb3JtQ29tcG9uZW50OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkudXRpbC5BZGFwdG9yUmVnaXN0cnk7Ci0KLS8qKgotICogIFNpbXBsZSB2YWxpZGF0aW9uIGZvciBzdGFuZGFyZCBudW1iZXIgY2xhc3Nlcy4gIFRoaXMgaXMgcHJvYmFibHkgaW5zdWZmaWNpZW50Ci0gKiAgZm9yIGFueXRoaW5nIHRyaWNreSBhbmQgYXBwbGljYXRpb24gc3BlY2lmaWMsIHN1Y2ggYXMgcGFyc2luZyBjdXJyZW5jeS4gIAotICoKLSAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiAgQHZlcnNpb24gJElkJAotICogIEBzaW5jZSAxLjAuOAotICoKLSAqKi8KLQotcHVibGljIGNsYXNzIE51bWJlclZhbGlkYXRvciBleHRlbmRzIEJhc2VWYWxpZGF0b3IKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXAgVFlQRVMgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgc3RhdGljIHsKLSAgICAgICAgVFlQRVMucHV0KCJib29sZWFuIiwgYm9vbGVhbi5jbGFzcyk7Ci0gICAgICAgIFRZUEVTLnB1dCgiQm9vbGVhbiIsIEJvb2xlYW4uY2xhc3MpOwotICAgICAgICBUWVBFUy5wdXQoImphdmEubGFuZy5Cb29sZWFuIiwgQm9vbGVhbi5jbGFzcyk7Ci0gICAgICAgIFRZUEVTLnB1dCgiY2hhciIsIGNoYXIuY2xhc3MpOwotICAgICAgICBUWVBFUy5wdXQoIkNoYXJhY3RlciIsIENoYXJhY3Rlci5jbGFzcyk7Ci0gICAgICAgIFRZUEVTLnB1dCgiamF2YS5sYW5nLkNoYXJhY3RlciIsIENoYXJhY3Rlci5jbGFzcyk7Ci0gICAgICAgIFRZUEVTLnB1dCgic2hvcnQiLCBzaG9ydC5jbGFzcyk7Ci0gICAgICAgIFRZUEVTLnB1dCgiU2hvcnQiLCBTaG9ydC5jbGFzcyk7Ci0gICAgICAgIFRZUEVTLnB1dCgiamF2YS5sYW5nLlNob3J0IiwgU2hvcnQuY2xhc3MpOwotICAgICAgICBUWVBFUy5wdXQoImludCIsIGludC5jbGFzcyk7Ci0gICAgICAgIFRZUEVTLnB1dCgiSW50ZWdlciIsIEludGVnZXIuY2xhc3MpOwotICAgICAgICBUWVBFUy5wdXQoImphdmEubGFuZy5JbnRlZ2VyIiwgSW50ZWdlci5jbGFzcyk7Ci0gICAgICAgIFRZUEVTLnB1dCgibG9uZyIsIGxvbmcuY2xhc3MpOwotICAgICAgICBUWVBFUy5wdXQoIkxvbmciLCBMb25nLmNsYXNzKTsKLSAgICAgICAgVFlQRVMucHV0KCJqYXZhLmxhbmcuTG9uZyIsIExvbmcuY2xhc3MpOwotICAgICAgICBUWVBFUy5wdXQoImZsb2F0IiwgZmxvYXQuY2xhc3MpOwotICAgICAgICBUWVBFUy5wdXQoIkZsb2F0IiwgRmxvYXQuY2xhc3MpOwotICAgICAgICBUWVBFUy5wdXQoImphdmEubGFuZy5GbG9hdCIsIEZsb2F0LmNsYXNzKTsKLSAgICAgICAgVFlQRVMucHV0KCJieXRlIiwgYnl0ZS5jbGFzcyk7Ci0gICAgICAgIFRZUEVTLnB1dCgiQnl0ZSIsIEJ5dGUuY2xhc3MpOwotICAgICAgICBUWVBFUy5wdXQoImphdmEubGFuZy5CeXRlIiwgQnl0ZS5jbGFzcyk7Ci0gICAgICAgIFRZUEVTLnB1dCgiZG91YmxlIiwgZG91YmxlLmNsYXNzKTsKLSAgICAgICAgVFlQRVMucHV0KCJEb3VibGUiLCBEb3VibGUuY2xhc3MpOwotICAgICAgICBUWVBFUy5wdXQoImphdmEubGFuZy5Eb3VibGUiLCBEb3VibGUuY2xhc3MpOwotICAgICAgICBUWVBFUy5wdXQoImphdmEubWF0aC5CaWdJbnRlZ2VyIiwgQmlnSW50ZWdlci5jbGFzcyk7Ci0gICAgICAgIFRZUEVTLnB1dCgiamF2YS5tYXRoLkJpZ0RlY2ltYWwiLCBCaWdEZWNpbWFsLmNsYXNzKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXQgSU5UX1RZUEVTID0gbmV3IEhhc2hTZXQoKTsKLQotICAgIHByaXZhdGUgQ2xhc3MgX3ZhbHVlVHlwZUNsYXNzID0gaW50LmNsYXNzOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIF96ZXJvSXNOdWxsOwotICAgIHByaXZhdGUgTnVtYmVyIF9taW5pbXVtOwotICAgIHByaXZhdGUgTnVtYmVyIF9tYXhpbXVtOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgX3NjcmlwdFBhdGggPSAiL29yZy9hcGFjaGUvdGFwZXN0cnkvdmFsaWQvTnVtYmVyVmFsaWRhdG9yLnNjcmlwdCI7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBfaW52YWxpZE51bWVyaWNGb3JtYXRNZXNzYWdlOwotICAgIHByaXZhdGUgU3RyaW5nIF9pbnZhbGlkSW50ZWdlckZvcm1hdE1lc3NhZ2U7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgX251bWJlclRvb1NtYWxsTWVzc2FnZTsKLSAgICBwcml2YXRlIFN0cmluZyBfbnVtYmVyVG9vTGFyZ2VNZXNzYWdlOwotICAgIHByaXZhdGUgU3RyaW5nIF9udW1iZXJSYW5nZU1lc3NhZ2U7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBBZGFwdG9yUmVnaXN0cnkgX251bWJlckFkYXB0b3JzID0gbmV3IEFkYXB0b3JSZWdpc3RyeSgpOwotCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgTlVNQkVSX1RZUEVfSU5URUdFUiA9IDA7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgTlVNQkVSX1RZUEVfUkVBTCA9IDE7Ci0KLQkvKioKLQkgKiBUaGlzIGNsYXNzIGlzIG5vdCBtZWFudCBmb3IgdXNlIG91dHNpZGUgb2YgTnVtYmVyVmFsaWRhdG9yOyBpdAotCSAqIGlzIHB1YmxpYyBvbmx5IHRvIGZhc2NpbGl0YXRlIHNvbWUgdW5pdCB0ZXN0aW5nLgotCSAqIAotCSAqLwotICAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgTnVtYmVyQWRhcHRvcgotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqICBQYXJzZXMgYSBub24tZW1wdHkge0BsaW5rIFN0cmluZ30gaW50byB0aGUgY29ycmVjdCBzdWJjbGFzcyBvZgotICAgICAgICAgKiAge0BsaW5rIE51bWJlcn0uCi0gICAgICAgICAqCi0gICAgICAgICAqICBAdGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbiBpZiB0aGUgU3RyaW5nIGNhbiBub3QgYmUgcGFyc2VkLgotICAgICAgICAgKiovCi0KLSAgICAgICAgYWJzdHJhY3QgcHVibGljIE51bWJlciBwYXJzZShTdHJpbmcgdmFsdWUpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiAgSW5kaWNhdGVzIHRoZSB0eXBlIG9mIHRoZSBudW1iZXIgcmVwcmVzZW50ZWQgLS0gaW50ZWdlciBvciByZWFsLgotICAgICAgICAgKiAgVGhlIGluZm9ybWF0aW9uIGlzIHVzZWQgdG8gYnVpbGQgdGhlIGNsaWVudC1zaWRlIHZhbGlkYXRvci4gIAotICAgICAgICAgKiAgVGhpcyBtZXRob2QgY291bGQgcmV0dXJuIGEgYm9vbGVhbiwgYnV0IHJldHVybnMgYW4gaW50IHRvIGFsbG93Ci0gICAgICAgICAqICBmdXR1cmUgZXh0ZW5zaW9ucyBvZiB0aGUgdmFsaWRhdG9yLgotICAgICAgICAgKiAgIAotICAgICAgICAgKiAgQHJldHVybiBvbmUgb2YgdGhlIHByZWRlZmluZWQgbnVtYmVyIHR5cGVzCi0gICAgICAgICAqKi8KLSAgICAgICAgYWJzdHJhY3QgcHVibGljIGludCBnZXROdW1iZXJUeXBlKCk7Ci0KLSAgICAgICAgcHVibGljIGludCBjb21wYXJlKE51bWJlciBsZWZ0LCBOdW1iZXIgcmlnaHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghbGVmdC5nZXRDbGFzcygpLmVxdWFscyhyaWdodC5nZXRDbGFzcygpKSkKLSAgICAgICAgICAgICAgICByaWdodCA9IGNvZXJjZShyaWdodCk7Ci0KLSAgICAgICAgICAgIENvbXBhcmFibGUgbGMgPSAoQ29tcGFyYWJsZSkgbGVmdDsKLQotICAgICAgICAgICAgcmV0dXJuIGxjLmNvbXBhcmVUbyhyaWdodCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogSW52b2tlZCB3aGVuIGNvbXBhcmluZyB0d28gTnVtYmVycyBvZiBkaWZmZXJlbnQgdHlwZXMuCi0gICAgICAgICAqIFRoZSBudW1iZXIgaXMgY29vZXJjZWQgZnJvbSBpdHMgb3JkaW5hcnkgdHlwZSB0byAKLSAgICAgICAgICogdGhlIGNvcnJlY3QgdHlwZSBmb3IgY29tcGFyaXNvbi4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBzaW5jZSAzLjAKLSAgICAgICAgICovCi0gICAgICAgIHByb3RlY3RlZCBhYnN0cmFjdCBOdW1iZXIgY29lcmNlKE51bWJlciBudW1iZXIpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGFic3RyYWN0IGNsYXNzIEludGVnZXJOdW1iZXJBZGFwdG9yIGV4dGVuZHMgTnVtYmVyQWRhcHRvcgotICAgIHsKLSAgICAgICAgcHVibGljIGludCBnZXROdW1iZXJUeXBlKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIE5VTUJFUl9UWVBFX0lOVEVHRVI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBSZWFsTnVtYmVyQWRhcHRvciBleHRlbmRzIE51bWJlckFkYXB0b3IKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBpbnQgZ2V0TnVtYmVyVHlwZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBOVU1CRVJfVFlQRV9SRUFMOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQnl0ZUFkYXB0b3IgZXh0ZW5kcyBJbnRlZ2VyTnVtYmVyQWRhcHRvcgotICAgIHsKLSAgICAgICAgcHVibGljIE51bWJlciBwYXJzZShTdHJpbmcgdmFsdWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgQnl0ZSh2YWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgTnVtYmVyIGNvZXJjZShOdW1iZXIgbnVtYmVyKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEJ5dGUobnVtYmVyLmJ5dGVWYWx1ZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFNob3J0QWRhcHRvciBleHRlbmRzIEludGVnZXJOdW1iZXJBZGFwdG9yCi0gICAgewotICAgICAgICBwdWJsaWMgTnVtYmVyIHBhcnNlKFN0cmluZyB2YWx1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBTaG9ydCh2YWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgTnVtYmVyIGNvZXJjZShOdW1iZXIgbnVtYmVyKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFNob3J0KG51bWJlci5zaG9ydFZhbHVlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSW50QWRhcHRvciBleHRlbmRzIEludGVnZXJOdW1iZXJBZGFwdG9yCi0gICAgewotICAgICAgICBwdWJsaWMgTnVtYmVyIHBhcnNlKFN0cmluZyB2YWx1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBJbnRlZ2VyKHZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCBOdW1iZXIgY29lcmNlKE51bWJlciBudW1iZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgSW50ZWdlcihudW1iZXIuaW50VmFsdWUoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBMb25nQWRhcHRvciBleHRlbmRzIEludGVnZXJOdW1iZXJBZGFwdG9yCi0gICAgewotICAgICAgICBwdWJsaWMgTnVtYmVyIHBhcnNlKFN0cmluZyB2YWx1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBMb25nKHZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCBOdW1iZXIgY29lcmNlKE51bWJlciBudW1iZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgTG9uZyhudW1iZXIubG9uZ1ZhbHVlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRmxvYXRBZGFwdG9yIGV4dGVuZHMgUmVhbE51bWJlckFkYXB0b3IKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBOdW1iZXIgcGFyc2UoU3RyaW5nIHZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEZsb2F0KHZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCBOdW1iZXIgY29lcmNlKE51bWJlciBudW1iZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgRmxvYXQobnVtYmVyLmZsb2F0VmFsdWUoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBEb3VibGVBZGFwdG9yIGV4dGVuZHMgUmVhbE51bWJlckFkYXB0b3IKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBOdW1iZXIgcGFyc2UoU3RyaW5nIHZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IERvdWJsZSh2YWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgTnVtYmVyIGNvZXJjZShOdW1iZXIgbnVtYmVyKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IERvdWJsZShudW1iZXIuZG91YmxlVmFsdWUoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBCaWdEZWNpbWFsQWRhcHRvciBleHRlbmRzIFJlYWxOdW1iZXJBZGFwdG9yCi0gICAgewotICAgICAgICBwdWJsaWMgTnVtYmVyIHBhcnNlKFN0cmluZyB2YWx1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBCaWdEZWNpbWFsKHZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCBOdW1iZXIgY29lcmNlKE51bWJlciBudW1iZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgQmlnRGVjaW1hbChudW1iZXIuZG91YmxlVmFsdWUoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBCaWdJbnRlZ2VyQWRhcHRvciBleHRlbmRzIEludGVnZXJOdW1iZXJBZGFwdG9yCi0gICAgewotICAgICAgICBwdWJsaWMgTnVtYmVyIHBhcnNlKFN0cmluZyB2YWx1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBCaWdJbnRlZ2VyKHZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCBOdW1iZXIgY29lcmNlKE51bWJlciBudW1iZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgQmlnSW50ZWdlcihudW1iZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgewotICAgICAgICBOdW1iZXJBZGFwdG9yIGJ5dGVBZGFwdG9yID0gbmV3IEJ5dGVBZGFwdG9yKCk7Ci0gICAgICAgIE51bWJlckFkYXB0b3Igc2hvcnRBZGFwdG9yID0gbmV3IFNob3J0QWRhcHRvcigpOwotICAgICAgICBOdW1iZXJBZGFwdG9yIGludEFkYXB0b3IgPSBuZXcgSW50QWRhcHRvcigpOwotICAgICAgICBOdW1iZXJBZGFwdG9yIGxvbmdBZGFwdG9yID0gbmV3IExvbmdBZGFwdG9yKCk7Ci0gICAgICAgIE51bWJlckFkYXB0b3IgZmxvYXRBZGFwdG9yID0gbmV3IEZsb2F0QWRhcHRvcigpOwotICAgICAgICBOdW1iZXJBZGFwdG9yIGRvdWJsZUFkYXB0b3IgPSBuZXcgRG91YmxlQWRhcHRvcigpOwotCi0gICAgICAgIF9udW1iZXJBZGFwdG9ycy5yZWdpc3RlcihCeXRlLmNsYXNzLCBieXRlQWRhcHRvcik7Ci0gICAgICAgIF9udW1iZXJBZGFwdG9ycy5yZWdpc3RlcihieXRlLmNsYXNzLCBieXRlQWRhcHRvcik7Ci0gICAgICAgIF9udW1iZXJBZGFwdG9ycy5yZWdpc3RlcihTaG9ydC5jbGFzcywgc2hvcnRBZGFwdG9yKTsKLSAgICAgICAgX251bWJlckFkYXB0b3JzLnJlZ2lzdGVyKHNob3J0LmNsYXNzLCBzaG9ydEFkYXB0b3IpOwotICAgICAgICBfbnVtYmVyQWRhcHRvcnMucmVnaXN0ZXIoSW50ZWdlci5jbGFzcywgaW50QWRhcHRvcik7Ci0gICAgICAgIF9udW1iZXJBZGFwdG9ycy5yZWdpc3RlcihpbnQuY2xhc3MsIGludEFkYXB0b3IpOwotICAgICAgICBfbnVtYmVyQWRhcHRvcnMucmVnaXN0ZXIoTG9uZy5jbGFzcywgbG9uZ0FkYXB0b3IpOwotICAgICAgICBfbnVtYmVyQWRhcHRvcnMucmVnaXN0ZXIobG9uZy5jbGFzcywgbG9uZ0FkYXB0b3IpOwotICAgICAgICBfbnVtYmVyQWRhcHRvcnMucmVnaXN0ZXIoRmxvYXQuY2xhc3MsIGZsb2F0QWRhcHRvcik7Ci0gICAgICAgIF9udW1iZXJBZGFwdG9ycy5yZWdpc3RlcihmbG9hdC5jbGFzcywgZmxvYXRBZGFwdG9yKTsKLSAgICAgICAgX251bWJlckFkYXB0b3JzLnJlZ2lzdGVyKERvdWJsZS5jbGFzcywgZG91YmxlQWRhcHRvcik7Ci0gICAgICAgIF9udW1iZXJBZGFwdG9ycy5yZWdpc3Rlcihkb3VibGUuY2xhc3MsIGRvdWJsZUFkYXB0b3IpOwotCi0gICAgICAgIF9udW1iZXJBZGFwdG9ycy5yZWdpc3RlcihCaWdEZWNpbWFsLmNsYXNzLCBuZXcgQmlnRGVjaW1hbEFkYXB0b3IoKSk7Ci0gICAgICAgIF9udW1iZXJBZGFwdG9ycy5yZWdpc3RlcihCaWdJbnRlZ2VyLmNsYXNzLCBuZXcgQmlnSW50ZWdlckFkYXB0b3IoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZyhJRm9ybUNvbXBvbmVudCBmaWVsZCwgT2JqZWN0IHZhbHVlKQotICAgIHsKLSAgICAgICAgaWYgKHZhbHVlID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICBpZiAoX3plcm9Jc051bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE51bWJlciBudW1iZXIgPSAoTnVtYmVyKSB2YWx1ZTsKLQotICAgICAgICAgICAgaWYgKG51bWJlci5kb3VibGVWYWx1ZSgpID09IDAuMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB2YWx1ZS50b1N0cmluZygpOwotICAgIH0KLQotICAgIHByaXZhdGUgTnVtYmVyQWRhcHRvciBnZXRBZGFwdG9yKElGb3JtQ29tcG9uZW50IGZpZWxkKQotICAgIHsKLSAgICAgICAgTnVtYmVyQWRhcHRvciByZXN1bHQgPSBnZXRBZGFwdG9yKF92YWx1ZVR5cGVDbGFzcyk7Ci0KLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICBUYXBlc3RyeS5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICJOdW1iZXJWYWxpZGF0b3Iubm8tYWRhcHRvci1mb3ItZmllbGQiLAotICAgICAgICAgICAgICAgICAgICBmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgX3ZhbHVlVHlwZUNsYXNzLmdldE5hbWUoKSkpOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBhZGFwdG9yIGZvciB0aGUgZ2l2ZW4gdHlwZS4KLQkgKiAKLQkgKiA8cD4KLQkgKiBOb3RlOiB0aGlzIG1ldGhvZCBleGlzdHMgb25seSBmb3IgdGVzdGluZyBwdXJwb3Nlcy4gSXQgaXMgbm90IG1lYW50IHRvCi0JICogYmUgaW52b2tlZCBieSB1c2VyIGNvZGUgYW5kIGlzIHN1YmplY3QgdG8gY2hhbmdlIGF0IGFueSB0aW1lLgotCSAqIAotCSAqIEBwYXJhbSB0eXBlIHRoZSB0eXBlIChhIE51bWJlciBzdWJjbGFzcykgZm9yIHdoaWNoIHRvIHJldHVybiBhbiBhZGFwdG9yCi0JICogQHJldHVybiB0aGUgYWRhcHRvciwgb3IgbnVsbCBpZiBubyBzdWNoIGFkYXB0b3IgbWF5IGJlIGZvdW5kCi0JICogQHNpbmNlIDMuMAotCSAqLwotICAgIHB1YmxpYyBzdGF0aWMgTnVtYmVyQWRhcHRvciBnZXRBZGFwdG9yKENsYXNzIHR5cGUpCi0gICAgewotICAgICAgICByZXR1cm4gKE51bWJlckFkYXB0b3IpIF9udW1iZXJBZGFwdG9ycy5nZXRBZGFwdG9yKHR5cGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgdG9PYmplY3QoSUZvcm1Db21wb25lbnQgZmllbGQsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaWYgKGNoZWNrUmVxdWlyZWQoZmllbGQsIHZhbHVlKSkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIE51bWJlckFkYXB0b3IgYWRhcHRvciA9IGdldEFkYXB0b3IoZmllbGQpOwotICAgICAgICBOdW1iZXIgcmVzdWx0ID0gbnVsbDsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0ID0gYWRhcHRvci5wYXJzZSh2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBleCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRvckV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICBidWlsZEludmFsaWROdW1lcmljRm9ybWF0TWVzc2FnZShmaWVsZCksCi0gICAgICAgICAgICAgICAgVmFsaWRhdGlvbkNvbnN0cmFpbnQuTlVNQkVSX0ZPUk1BVCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoX21pbmltdW0gIT0gbnVsbCAmJiBhZGFwdG9yLmNvbXBhcmUocmVzdWx0LCBfbWluaW11bSkgPCAwKQotICAgICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRvckV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICBidWlsZE51bWJlclRvb1NtYWxsTWVzc2FnZShmaWVsZCksCi0gICAgICAgICAgICAgICAgVmFsaWRhdGlvbkNvbnN0cmFpbnQuVE9PX1NNQUxMKTsKLQotICAgICAgICBpZiAoX21heGltdW0gIT0gbnVsbCAmJiBhZGFwdG9yLmNvbXBhcmUocmVzdWx0LCBfbWF4aW11bSkgPiAwKQotICAgICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRvckV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICBidWlsZE51bWJlclRvb0xhcmdlTWVzc2FnZShmaWVsZCksCi0gICAgICAgICAgICAgICAgVmFsaWRhdGlvbkNvbnN0cmFpbnQuVE9PX0xBUkdFKTsKLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyBOdW1iZXIgZ2V0TWF4aW11bSgpCi0gICAgewotICAgICAgICByZXR1cm4gX21heGltdW07Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0SGFzTWF4aW11bSgpCi0gICAgewotICAgICAgICByZXR1cm4gX21heGltdW0gIT0gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRNYXhpbXVtKE51bWJlciBtYXhpbXVtKQotICAgIHsKLSAgICAgICAgX21heGltdW0gPSBtYXhpbXVtOwotICAgIH0KLQotICAgIHB1YmxpYyBOdW1iZXIgZ2V0TWluaW11bSgpCi0gICAgewotICAgICAgICByZXR1cm4gX21pbmltdW07Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0SGFzTWluaW11bSgpCi0gICAgewotICAgICAgICByZXR1cm4gX21pbmltdW0gIT0gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRNaW5pbXVtKE51bWJlciBtaW5pbXVtKQotICAgIHsKLSAgICAgICAgX21pbmltdW0gPSBtaW5pbXVtOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBJZiB0cnVlLCB0aGVuIHdoZW4gcmVuZGVyaW5nLCBhIHplcm8gaXMgdHJlYXRlZCBhcyBhIG5vbi12YWx1ZSwgYW5kIG51bGwgaXMgcmV0dXJuZWQuCi0gICAgICogIElmIGZhbHNlLCB0aGUgZGVmYXVsdCwgdGhlbiB6ZXJvIGlzIHJlbmRlcmVkIGFzIHplcm8uCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0WmVyb0lzTnVsbCgpCi0gICAgewotICAgICAgICByZXR1cm4gX3plcm9Jc051bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0WmVyb0lzTnVsbChib29sZWFuIHplcm9Jc051bGwpCi0gICAgewotICAgICAgICBfemVyb0lzTnVsbCA9IHplcm9Jc051bGw7Ci0gICAgfQotCi0gICAgLyoqIAotICAgICAqIAotICAgICAqICBAc2luY2UgMi4yCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgcmVuZGVyVmFsaWRhdG9yQ29udHJpYnV0aW9uKAotICAgICAgICBJRm9ybUNvbXBvbmVudCBmaWVsZCwKLSAgICAgICAgSU1hcmt1cFdyaXRlciB3cml0ZXIsCi0gICAgICAgIElSZXF1ZXN0Q3ljbGUgY3ljbGUpCi0gICAgewotICAgICAgICBpZiAoIWlzQ2xpZW50U2NyaXB0aW5nRW5hYmxlZCgpKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIGlmICghKGlzUmVxdWlyZWQoKSB8fCBfbWluaW11bSAhPSBudWxsIHx8IF9tYXhpbXVtICE9IG51bGwpKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIE1hcCBzeW1ib2xzID0gbmV3IEhhc2hNYXAoKTsKLQotICAgICAgICBpZiAoaXNSZXF1aXJlZCgpKQotICAgICAgICAgICAgc3ltYm9scy5wdXQoInJlcXVpcmVkTWVzc2FnZSIsIGJ1aWxkUmVxdWlyZWRNZXNzYWdlKGZpZWxkKSk7Ci0KLSAgICAgICAgaWYgKGlzSW50ZWdlck51bWJlcigpKQotICAgICAgICAgICAgc3ltYm9scy5wdXQoImZvcm1hdE1lc3NhZ2UiLCBidWlsZEludmFsaWRJbnRlZ2VyRm9ybWF0TWVzc2FnZShmaWVsZCkpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBzeW1ib2xzLnB1dCgiZm9ybWF0TWVzc2FnZSIsIGJ1aWxkSW52YWxpZE51bWVyaWNGb3JtYXRNZXNzYWdlKGZpZWxkKSk7Ci0KLSAgICAgICAgaWYgKF9taW5pbXVtICE9IG51bGwgfHwgX21heGltdW0gIT0gbnVsbCkKLSAgICAgICAgICAgIHN5bWJvbHMucHV0KCJyYW5nZU1lc3NhZ2UiLCBidWlsZFJhbmdlTWVzc2FnZShmaWVsZCkpOwotCi0gICAgICAgIHByb2Nlc3NWYWxpZGF0b3JTY3JpcHQoX3NjcmlwdFBhdGgsIGN5Y2xlLCBmaWVsZCwgc3ltYm9scyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgYnVpbGRSYW5nZU1lc3NhZ2UoSUZvcm1Db21wb25lbnQgZmllbGQpCi0gICAgewotICAgICAgICBpZiAoX21pbmltdW0gIT0gbnVsbCAmJiBfbWF4aW11bSAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGJ1aWxkTnVtYmVyUmFuZ2VNZXNzYWdlKGZpZWxkKTsKLQotICAgICAgICBpZiAoX21heGltdW0gIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBidWlsZE51bWJlclRvb0xhcmdlTWVzc2FnZShmaWVsZCk7Ci0KLSAgICAgICAgcmV0dXJuIGJ1aWxkTnVtYmVyVG9vU21hbGxNZXNzYWdlKGZpZWxkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgQHNpbmNlIDIuMgotICAgICAqIAotICAgICAqKi8KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2NyaXB0UGF0aCgpCi0gICAgewotICAgICAgICByZXR1cm4gX3NjcmlwdFBhdGg7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEFsbG93cyBhIGRldmVsb3BlciB0byB1c2UgdGhlIGV4aXN0aW5nIHZhbGlkYXRpb24gbG9naWMgd2l0aCBhIGRpZmZlcmVudCBjbGllbnQtc2lkZQotICAgICAqICBzY3JpcHQuICBUaGlzIGlzIG9mdGVuIHN1ZmZpY2llbnQgdG8gYWxsb3cgYXBwbGljYXRpb24tc3BlY2lmaWMgZXJyb3IgcHJlc2VudGF0aW9uCi0gICAgICogIChwZXJoYXBzIGJ5IHVzaW5nIERIVE1MIHRvIHVwZGF0ZSB0aGUgY29udGVudCBvZiBhICZsdDtzcGFuJmd0OyB0YWcsIG9yIHRvIHVzZQotICAgICAqICBhIG1vcmUgc29waGlzdGljYXRlZCBwb3AtdXAgd2luZG93IHRoYW4gPGNvZGU+d2luZG93LmFsZXJ0KCk8L2NvZGU+KS4KLSAgICAgKiAKLSAgICAgKiAgQHNpbmNlIDIuMgotICAgICAqIAotICAgICAqKi8KLQotICAgIHB1YmxpYyB2b2lkIHNldFNjcmlwdFBhdGgoU3RyaW5nIHNjcmlwdFBhdGgpCi0gICAgewotICAgICAgICBfc2NyaXB0UGF0aCA9IHNjcmlwdFBhdGg7Ci0gICAgfQotCi0gICAgLyoqIFNldHMgdGhlIHZhbHVlIHR5cGUgZnJvbSBhIHN0cmluZyB0eXBlIG5hbWUuICBUaGUgbmFtZSBtYXkgYmUKLSAgICAgKiAgYSBzY2FsYXIgbnVtZXJpYyB0eXBlLCBhIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lLCBvciB0aGUgbmFtZQotICAgICAqICBvZiBhIG51bWVyaWMgd3JhcHBlciB0eXBlIGZyb20gamF2YS5sYW5nICh3aXRoIHRoZSBwYWNrYWdlIG5hbWUgb21pdHRlZCkuCi0gICAgICogCi0gICAgICogQHNpbmNlIDMuMCAKLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZVR5cGUoU3RyaW5nIHR5cGVOYW1lKQotICAgIHsKLSAgICAgICAgQ2xhc3MgdHlwZUNsYXNzID0gKENsYXNzKSBUWVBFUy5nZXQodHlwZU5hbWUpOwotCi0gICAgICAgIGlmICh0eXBlQ2xhc3MgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgVGFwZXN0cnkuZm9ybWF0KCJOdW1iZXJWYWxpZGF0b3IudW5rbm93bi10eXBlIiwgdHlwZU5hbWUpKTsKLQotICAgICAgICBfdmFsdWVUeXBlQ2xhc3MgPSB0eXBlQ2xhc3M7Ci0gICAgfQotCi0gICAgLyoqIEBzaW5jZSAzLjAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZVR5cGVDbGFzcyhDbGFzcyB2YWx1ZVR5cGVDbGFzcykKLSAgICB7Ci0gICAgICAgIF92YWx1ZVR5cGVDbGFzcyA9IHZhbHVlVHlwZUNsYXNzOwotICAgIH0KLQotICAgIC8qKiAKLSAgICAgKiAgCi0gICAgICogIFJldHVybnMgdGhlIHZhbHVlIHR5cGUgdG8gY29udmVydCBzdHJpbmdzIGJhY2sgaW50by4gIFRoZSBkZWZhdWx0IGlzIGludC4KLSAgICAgKiAKLSAgICAgKiAgQHNpbmNlIDMuMCAKLSAgICAgKiAKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgQ2xhc3MgZ2V0VmFsdWVUeXBlQ2xhc3MoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF92YWx1ZVR5cGVDbGFzczsKLSAgICB9Ci0KLSAgICAvKiogQHNpbmNlIDMuMCAqLwotCi0gICAgcHVibGljIFN0cmluZyBnZXRJbnZhbGlkTnVtZXJpY0Zvcm1hdE1lc3NhZ2UoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9pbnZhbGlkTnVtZXJpY0Zvcm1hdE1lc3NhZ2U7Ci0gICAgfQotCi0gICAgLyoqIEBzaW5jZSAzLjAgKi8KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW52YWxpZEludGVnZXJGb3JtYXRNZXNzYWdlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfaW52YWxpZEludGVnZXJGb3JtYXRNZXNzYWdlOwotICAgIH0KLQotICAgIC8qKiBAc2luY2UgMy4wICovCi0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE51bWJlclJhbmdlTWVzc2FnZSgpCi0gICAgewotICAgICAgICByZXR1cm4gX251bWJlclJhbmdlTWVzc2FnZTsKLSAgICB9Ci0KLSAgICAvKiogQHNpbmNlIDMuMCAqLwotCi0gICAgcHVibGljIFN0cmluZyBnZXROdW1iZXJUb29MYXJnZU1lc3NhZ2UoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9udW1iZXJUb29MYXJnZU1lc3NhZ2U7Ci0gICAgfQotCi0gICAgLyoqIEBzaW5jZSAzLjAgKi8KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TnVtYmVyVG9vU21hbGxNZXNzYWdlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfbnVtYmVyVG9vU21hbGxNZXNzYWdlOwotICAgIH0KLQotICAgIC8qKiAKLSAgICAgKiBPdmVycmlkZXMgdGhlIDxjb2RlPmludmFsaWQtbnVtZXJpYy1mb3JtYXQ8L2NvZGU+IGJ1bmRsZSBrZXkuCi0gICAgICogUGFyYW1ldGVyIHswfSBpcyB0aGUgZGlzcGxheSBuYW1lIG9mIHRoZSBmaWVsZC4KLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMy4wCi0gICAgICovCi0KLSAgICBwdWJsaWMgdm9pZCBzZXRJbnZhbGlkTnVtZXJpY0Zvcm1hdE1lc3NhZ2UoU3RyaW5nIHN0cmluZykKLSAgICB7Ci0gICAgICAgIF9pbnZhbGlkTnVtZXJpY0Zvcm1hdE1lc3NhZ2UgPSBzdHJpbmc7Ci0gICAgfQotCi0gICAgLyoqIAotICAgICAqIE92ZXJyaWRlcyB0aGUgPGNvZGU+aW52YWxpZC1pbnQtZm9ybWF0PC9jb2RlPiBidW5kbGUga2V5LgotICAgICAqIFBhcmFtZXRlciB7MH0gaXMgdGhlIGRpc3BsYXkgbmFtZSBvZiB0aGUgZmllbGQuCi0gICAgICogCi0gICAgICogQHNpbmNlIDMuMAotICAgICAqLwotCi0gICAgcHVibGljIHZvaWQgc2V0SW52YWxpZEludGVnZXJGb3JtYXRNZXNzYWdlKFN0cmluZyBzdHJpbmcpCi0gICAgewotICAgICAgICBfaW52YWxpZEludGVnZXJGb3JtYXRNZXNzYWdlID0gc3RyaW5nOwotICAgIH0KLQotICAgIC8qKiBAc2luY2UgMy4wICovCi0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkSW52YWxpZE51bWVyaWNGb3JtYXRNZXNzYWdlKElGb3JtQ29tcG9uZW50IGZpZWxkKQotICAgIHsKLSAgICAgICAgU3RyaW5nIHBhdHRlcm4gPQotICAgICAgICAgICAgZ2V0UGF0dGVybigKLSAgICAgICAgICAgICAgICBnZXRJbnZhbGlkTnVtZXJpY0Zvcm1hdE1lc3NhZ2UoKSwKLSAgICAgICAgICAgICAgICAiaW52YWxpZC1udW1lcmljLWZvcm1hdCIsCi0gICAgICAgICAgICAgICAgZmllbGQuZ2V0UGFnZSgpLmdldExvY2FsZSgpKTsKLQotICAgICAgICByZXR1cm4gZm9ybWF0U3RyaW5nKHBhdHRlcm4sIGZpZWxkLmdldERpc3BsYXlOYW1lKCkpOwotICAgIH0KLQotICAgIC8qKiBAc2luY2UgMy4wICovCi0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkSW52YWxpZEludGVnZXJGb3JtYXRNZXNzYWdlKElGb3JtQ29tcG9uZW50IGZpZWxkKQotICAgIHsKLSAgICAgICAgU3RyaW5nIHBhdHRlcm4gPQotICAgICAgICAgICAgZ2V0UGF0dGVybigKLSAgICAgICAgICAgICAgICBnZXRJbnZhbGlkSW50ZWdlckZvcm1hdE1lc3NhZ2UoKSwKLSAgICAgICAgICAgICAgICAiaW52YWxpZC1pbnQtZm9ybWF0IiwKLSAgICAgICAgICAgICAgICBmaWVsZC5nZXRQYWdlKCkuZ2V0TG9jYWxlKCkpOwotCi0gICAgICAgIHJldHVybiBmb3JtYXRTdHJpbmcocGF0dGVybiwgZmllbGQuZ2V0RGlzcGxheU5hbWUoKSk7Ci0gICAgfQotCi0gICAgLyoqIAotICAgICAqIE92ZXJyaWRlcyB0aGUgPGNvZGU+bnVtYmVyLXJhbmdlPC9jb2RlPiBidW5kbGUga2V5LgotICAgICAqIFBhcmFtZXRlciBbMH0gaXMgdGhlIGRpc3BsYXkgbmFtZSBvZiB0aGUgZmllbGQuCi0gICAgICogUGFyYW1ldGVyIHsxfSBpcyB0aGUgbWluaW11bSB2YWx1ZS4KLSAgICAgKiBQYXJhbWV0ZXIgezJ9IGlzIHRoZSBtYXhpbXVtIHZhbHVlLgotICAgICAqIAotICAgICAqIEBzaW5jZSAzLjAKLSAgICAgKi8KLQotICAgIHB1YmxpYyB2b2lkIHNldE51bWJlclJhbmdlTWVzc2FnZShTdHJpbmcgc3RyaW5nKQotICAgIHsKLSAgICAgICAgX251bWJlclJhbmdlTWVzc2FnZSA9IHN0cmluZzsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkTnVtYmVyUmFuZ2VNZXNzYWdlKElGb3JtQ29tcG9uZW50IGZpZWxkKQotICAgIHsKLSAgICAgICAgU3RyaW5nIHBhdHRlcm4gPQotICAgICAgICAgICAgZ2V0UGF0dGVybihfbnVtYmVyUmFuZ2VNZXNzYWdlLCAibnVtYmVyLXJhbmdlIiwgZmllbGQuZ2V0UGFnZSgpLmdldExvY2FsZSgpKTsKLQotICAgICAgICByZXR1cm4gZm9ybWF0U3RyaW5nKHBhdHRlcm4sIG5ldyBPYmplY3RbXSB7IGZpZWxkLmdldERpc3BsYXlOYW1lKCksIF9taW5pbXVtLCBfbWF4aW11bSB9KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgT3ZlcnJpZGVzIHRoZSA8Y29kZT5udW1iZXItdG9vLWxhcmdlPC9jb2RlPiBidW5kbGUga2V5LgotICAgICAqICBQYXJhbWV0ZXIgezB9IGlzIHRoZSBkaXNwbGF5IG5hbWUgb2YgdGhlIGZpZWxkLgotICAgICAqICBQYXJhbWV0ZXIgezF9IGlzIHRoZSBtYXhpbXVtIGFsbG93ZWQgdmFsdWUuCi0gICAgICogIAotICAgICAqICBAc2luY2UgMy4wCi0gICAgICovCi0KLSAgICBwdWJsaWMgdm9pZCBzZXROdW1iZXJUb29MYXJnZU1lc3NhZ2UoU3RyaW5nIHN0cmluZykKLSAgICB7Ci0gICAgICAgIF9udW1iZXJUb29MYXJnZU1lc3NhZ2UgPSBzdHJpbmc7Ci0gICAgfQotCi0gICAgLyoqIEBzaW5jZSAzLjAgKi8KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgYnVpbGROdW1iZXJUb29MYXJnZU1lc3NhZ2UoSUZvcm1Db21wb25lbnQgZmllbGQpCi0gICAgewotICAgICAgICBTdHJpbmcgcGF0dGVybiA9Ci0gICAgICAgICAgICBnZXRQYXR0ZXJuKF9udW1iZXJUb29MYXJnZU1lc3NhZ2UsICJudW1iZXItdG9vLWxhcmdlIiwgZmllbGQuZ2V0UGFnZSgpLmdldExvY2FsZSgpKTsKLQotICAgICAgICByZXR1cm4gZm9ybWF0U3RyaW5nKHBhdHRlcm4sIGZpZWxkLmdldERpc3BsYXlOYW1lKCksIF9tYXhpbXVtKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgT3ZlcnJpZGVzIHRoZSA8Y29kZT5udW1iZXItdG9vLXNtYWxsPC9jb2RlPiBidW5kbGUga2V5LgotICAgICAqICBQYXJhbWV0ZXIgezB9IGlzIHRoZSBkaXNwbGF5IG5hbWUgb2YgdGhlIGZpZWxkLgotICAgICAqICBQYXJhbWV0ZXIgezF9IGlzIHRoZSBtaW5pbXVtIGFsbG93ZWQgdmFsdWUuCi0gICAgICogCi0gICAgICogIEBzaW5jZSAzLjAKLSAgICAgKiAKLSAgICAgKi8KLQotICAgIHB1YmxpYyB2b2lkIHNldE51bWJlclRvb1NtYWxsTWVzc2FnZShTdHJpbmcgc3RyaW5nKQotICAgIHsKLSAgICAgICAgX251bWJlclRvb1NtYWxsTWVzc2FnZSA9IHN0cmluZzsKLSAgICB9Ci0KLSAgICAvKiogQHNpbmNlIDMuMCAqLwotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBidWlsZE51bWJlclRvb1NtYWxsTWVzc2FnZShJRm9ybUNvbXBvbmVudCBmaWVsZCkKLSAgICB7Ci0gICAgICAgIFN0cmluZyBwYXR0ZXJuID0KLSAgICAgICAgICAgIGdldFBhdHRlcm4oX251bWJlclRvb1NtYWxsTWVzc2FnZSwgIm51bWJlci10b28tc21hbGwiLCBmaWVsZC5nZXRQYWdlKCkuZ2V0TG9jYWxlKCkpOwotCi0gICAgICAgIHJldHVybiBmb3JtYXRTdHJpbmcocGF0dGVybiwgZmllbGQuZ2V0RGlzcGxheU5hbWUoKSwgX21pbmltdW0pOwotICAgIH0KLQotICAgIC8qKiBAc2luY2UgMy4wICovCi0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0ludGVnZXJOdW1iZXIoKQotICAgIHsKLSAgICAgICAgTnVtYmVyQWRhcHRvciByZXN1bHQgPSAoTnVtYmVyQWRhcHRvcikgX251bWJlckFkYXB0b3JzLmdldEFkYXB0b3IoX3ZhbHVlVHlwZUNsYXNzKTsKLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIHJldHVybiByZXN1bHQuZ2V0TnVtYmVyVHlwZSgpID09IE5VTUJFUl9UWVBFX0lOVEVHRVI7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS92YWxpZC9OdW1iZXJWYWxpZGF0b3Iuc2NyaXB0IGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3ZhbGlkL051bWJlclZhbGlkYXRvci5zY3JpcHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4OTI0ZGEuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3ZhbGlkL051bWJlclZhbGlkYXRvci5zY3JpcHQKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0gJElkJCAtLT4KLTwhRE9DVFlQRSBzY3JpcHQgUFVCTElDCi0JIi0vL0FwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLy9UYXBlc3RyeSBTY3JpcHQgU3BlY2lmaWNhdGlvbiAzLjAvL0VOIgotCSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL3RhcGVzdHJ5L2R0ZC9TY3JpcHRfM18wLmR0ZCI+Ci0JCi08IS0tIAotCi0gIENyZWF0ZXMgYSBzY3JpcHQgZm9yIHZhbGlkYXRpbmcgdGhhdCBhIGZpZWxkIGlzIHJlcXVpcmVkIGFuZC9vciBoYXMgYSBtaW5pbXVtCi0gIGZpZWxkIGxlbmd0aC4KLSAgCi0gIElucHV0IHN5bWJvbHM6Ci0gICAgIGZpZWxkLCBmb3JtLCB2YWxpZGF0b3I6ICBBcyBub3JtYWwgZm9yIGEgdmFsaWRhdGlvbiBzY3JpcHQuCi0gICAgIGZvcm1hdE1lc3NhZ2U6IE1lc3NhZ2UgZGlzcGxheWVkIGlmIHRoZSBpbnB1dCBpcyBub3QgdmFsaWQuCi0JIHJlcXVpcmVkTWVzc2FnZTogTWVzc2FnZSB0byBkaXNwbGF5IGlmIHRoZSBmaWVsZCBpcyByZXF1aXJlZCB5ZXQgYmxhbmsuCi0JIHJhbmdlTWVzc2FnZTogTWVzc2FnZSB0byBkaXNwbGF5IGlmIHRoZSBmaWVsZCBpcyBub3QgaW4gdGhlIGV4cGVjdGVkIHJhbmdlLiAKLSAgICAgZm9ybWF0RXhwcmVzc2lvbjogUmVndWxhciBleHByZXNzaW9uIGZvciB0aGUgZmllbGQuCi0tLT4KLQkKLTxzY3JpcHQ+Ci0KLTxpbmNsdWRlLXNjcmlwdCByZXNvdXJjZS1wYXRoPSIvb3JnL2FwYWNoZS90YXBlc3RyeS92YWxpZC9WYWxpZGF0b3IuanMiLz4KLQotPGlucHV0LXN5bWJvbCBrZXk9ImZpZWxkIiBjbGFzcz0ib3JnLmFwYWNoZS50YXBlc3RyeS52YWxpZC5WYWxpZEZpZWxkIiByZXF1aXJlZD0ieWVzIi8+Ci08aW5wdXQtc3ltYm9sIGtleT0iZm9ybSIgY2xhc3M9Im9yZy5hcGFjaGUudGFwZXN0cnkuSUZvcm0iIHJlcXVpcmVkPSJ5ZXMiLz4KLTxpbnB1dC1zeW1ib2wga2V5PSJ2YWxpZGF0b3IiIGNsYXNzPSJvcmcuYXBhY2hlLnRhcGVzdHJ5LnZhbGlkLk51bWJlclZhbGlkYXRvciIgcmVxdWlyZWQ9InllcyIvPgotPGlucHV0LXN5bWJvbCBrZXk9ImZvcm1hdE1lc3NhZ2UiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIiByZXF1aXJlZD0ieWVzIi8+Ci08aW5wdXQtc3ltYm9sIGtleT0icmVxdWlyZWRNZXNzYWdlIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZyIvPgotPGlucHV0LXN5bWJvbCBrZXk9InJhbmdlTWVzc2FnZSIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmciLz4KLQotPGxldCBrZXk9ImZ1bmN0aW9uIiB1bmlxdWU9InllcyI+Ci12YWxpZGF0ZV8ke2ZpZWxkLm5hbWV9Ci08L2xldD4KLQotPGJvZHk+Ci1mdW5jdGlvbiAke2Z1bmN0aW9ufSgpCi17Ci0gIHZhciBmaWVsZCA9IGRvY3VtZW50LiR7Zm9ybS5uYW1lfS4ke2ZpZWxkLm5hbWV9OyAKLSAgdmFyIHN0cmluZ1ZhbHVlID0gZmllbGQudmFsdWU7ICAKLTxpZiBleHByZXNzaW9uPSJ2YWxpZGF0b3IucmVxdWlyZWQiPgotICBpZiAoc3RyaW5nVmFsdWUubGVuZ3RoID09IDApCi0gICAgIHJldHVybiB2YWxpZGF0b3JfaW52YWxpZF9maWVsZChmaWVsZCwgIiR7cmVxdWlyZWRNZXNzYWdlfSIpOwotPC9pZj4KLTxpZi1ub3QgZXhwcmVzc2lvbj0idmFsaWRhdG9yLnJlcXVpcmVkIj4KLSAgaWYgKHN0cmluZ1ZhbHVlLmxlbmd0aCA9PSAwKQotICAgICByZXR1cm4gdHJ1ZTsKLTwvaWYtbm90PgotICB2YXIgdmFsdWUgPSBzdHJpbmdWYWx1ZSAqIDE7Ci0gIGlmIChpc05hTih2YWx1ZSkpCi0gICAgICByZXR1cm4gdmFsaWRhdG9yX2ludmFsaWRfZmllbGQoZmllbGQsICIke2Zvcm1hdE1lc3NhZ2V9Iik7Ci08aWYgZXhwcmVzc2lvbj0idmFsaWRhdG9yLmludGVnZXJOdW1iZXIiPgotICB2YXIgcmVnZXggPSAvXC4vOwotICBpZiAoc3RyaW5nVmFsdWUuc2VhcmNoKHJlZ2V4KSAhPSAtMSkKLSAgICAgIHJldHVybiB2YWxpZGF0b3JfaW52YWxpZF9maWVsZChmaWVsZCwgIiR7Zm9ybWF0TWVzc2FnZX0iKTsKLTwvaWY+Ci08aWYgZXhwcmVzc2lvbj0idmFsaWRhdG9yLm1pbmltdW0gIT0gbnVsbCI+Ci0gIGlmICh2YWx1ZSAmbHQ7ICR7dmFsaWRhdG9yLm1pbmltdW19KQotICAgICByZXR1cm4gdmFsaWRhdG9yX2ludmFsaWRfZmllbGQoZmllbGQsICIke3JhbmdlTWVzc2FnZX0iKTsKLTwvaWY+Ci08aWYgZXhwcmVzc2lvbj0idmFsaWRhdG9yLm1heGltdW0gIT0gbnVsbCI+Ci0gIGlmICh2YWx1ZSAmZ3Q7ICR7dmFsaWRhdG9yLm1heGltdW19KQotICAgICByZXR1cm4gdmFsaWRhdG9yX2ludmFsaWRfZmllbGQoZmllbGQsICIke3JhbmdlTWVzc2FnZX0iKTsKLTwvaWY+Ci0gIHJldHVybiB0cnVlOwotfQotPC9ib2R5PgotCi08L3NjcmlwdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdmFsaWQvUGF0dGVybkRlbGVnYXRlLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdmFsaWQvUGF0dGVybkRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5OWVlZmYuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3ZhbGlkL1BhdHRlcm5EZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkudmFsaWQ7Ci0KLS8qKgotICogSW1wbGVtZW50YXRpb25zIG9mIHRoaXMgaW50ZXJmYWNlIHdpbGwgcHJvdmlkZSBwYXR0ZXJuIHV0aWxpdHkgc2VydmljZXMuCi0gKiAKLSAqIEBhdXRob3IgIEhhcmlzaCBLcmlzaG5hc3dhbXkKLSAqIEB2ZXJzaW9uICRJZCQKLSAqIEBzaW5jZSAgIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBhdHRlcm5EZWxlZ2F0ZQotewotICAgIC8qKgotICAgICAqIEFuc3dlcnMgdGhlIHF1ZXN0aW9uIHdoZXRoZXIgdGhlIGlucHV0IHN0cmluZyBmdWxmaWxscyB0aGUgcGF0dGVybiBzdHJpbmcgcHJvdmlkZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIHBhdHRlcm5TdHJpbmcgVGhlIHBhdHRlcm4gdGhhdCB0aGUgaW5wdXQgc3RyaW5nIGlzIGNvbXBhcmVkIGFnYWluc3QuCi0gICAgICogQHBhcmFtIGlucHV0IFRoZSBzdHJpbmcgdW5kZXIgdGVzdC4KLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdHJ1ZSBpZiB0aGUgcGF0dGVybiBleGlzdHMgaW4gdGhlIGlucHV0IHN0cmluZzsgcmV0dXJucyBmYWxzZSBvdGhlcndpc2UuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoU3RyaW5nIHBhdHRlcm5TdHJpbmcsIFN0cmluZyBpbnB1dCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZXNjYXBlZCBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIHJlcHJlc2VudGluZyB0aGUgcGF0dGVybiBzdHJpbmcgcHJvdmlkZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIHBhdHRlcm5TdHJpbmcgVGhlIHJhdyBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIHRoYXQgcmVwcmVzZW50IHRoZSBwYXR0ZXJuLgotICAgICAqIEByZXR1cm4gVGhlIGVzY2FwZWQgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycyB0aGF0IHJlcHJlc2VudCB0aGUgcGF0dGVybi4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEVzY2FwZWRQYXR0ZXJuU3RyaW5nKFN0cmluZyBwYXR0ZXJuU3RyaW5nKTsKLX0KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS92YWxpZC9QYXR0ZXJuVmFsaWRhdG9yLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdmFsaWQvUGF0dGVyblZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzVhYWNhLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS92YWxpZC9QYXR0ZXJuVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTUgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkudmFsaWQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5BcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JTWFya3VwV3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlcXVlc3RDeWNsZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LlRhcGVzdHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuZm9ybS5JRm9ybUNvbXBvbmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnV0aWwuUmVnZXhwTWF0Y2hlcjsKLQotLyoqCi0gKiA8cD5UaGUgdmFsaWRhdG9yIGJlYW4gdGhhdCBwcm92aWRlcyBhIHBhdHRlcm4gdmFsaWRhdGlvbiBzZXJ2aWNlLgotICogCi0gKiA8cD5UaGUgYWN0dWFsIHBhdHRlcm4gbWF0Y2hpbmcgYWxnb3JpdGhtIGlzIHByb3ZpZGVkIGJ5IHRoZSAKLSAqIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LnZhbGlkLlBhdHRlcm5EZWxlZ2F0ZX0uIFRoaXMgZW5hYmxlcyB0aGUgdXNlciB0byBwcm92aWRlCi0gKiBjdXN0b20gcGF0dGVybiBtYXRjaGluZyBpbXBsZW1lbnRhdGlvbnMuIEluIHRoZSBldmVudCBhIGN1c3RvbSBpbXBsZW1lbnRhdGlvbiBpcyBub3QgCi0gKiBwcm92aWRlZCwgdGhpcyB2YWxpZGF0b3Igd2lsbCB1c2UgdGhlIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LnV0aWwuUmVnZXhwTWF0Y2hlcn0uCi0gKiAKLSAqIDxwPlRoaXMgdmFsaWRhdG9yIGhhcyB0aGUgYWJpbGl0eSB0byBwcm92aWRlIGNsaWVudCBzaWRlIHZhbGlkYXRpb24gb24gZGVtYW5kLiAKLSAqIFRvIGVuYWJsZSBjbGllbnQgc2lkZSB2YWxpZGF0aW9uIHNpbXBseSBzZXQgdGhlIDxjb2RlPmNsaWVudFNjcmlwdGluZ0VuYWJsZWQ8L2NvZGU+Ci0gKiBwcm9wZXJ0eSB0byA8Y29kZT50cnVlPC9jb2RlPi4KLSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBzY3JpcHQgd2lsbCBiZSBpbiBKYXZhU2NyaXB0IGFuZCBhbGxvd3MgdGhlIHVzZXIgdG8gCi0gKiBvdmVycmlkZSB0aGlzIHdpdGggYSBjdXN0b20gaW1wbGVtZW50YXRpb24gYnkgc2V0dGluZyB0aGUgcGF0aCB0byB0aGUgY3VzdG9tICAKLSAqIHNjcmlwdCB2aWEge0BsaW5rICNzZXRTY3JpcHRQYXRoKFN0cmluZyl9LgotICogCi0gKiBAYXV0aG9yICBIYXJpc2ggS3Jpc2huYXN3YW15Ci0gKiBAdmVyc2lvbiAkSWQkCi0gKiBAc2luY2UgICAzLjAKLSAqLwotcHVibGljIGNsYXNzIFBhdHRlcm5WYWxpZGF0b3IgZXh0ZW5kcyBCYXNlVmFsaWRhdG9yCi17Ci0gICAgLyoqCi0gICAgICogVGhlIHBhdHRlcm4gdGhhdCB0aGlzIHZhbGlkYXRvciB3aWxsIHVzZSB0byB2YWxpZGF0ZSB0aGUgaW5wdXQuIFRoZSBkZWZhdWx0IAotICAgICAqIHBhdHRlcm4gaXMgYW4gZW1wdHkgc3RyaW5nLgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIF9wYXR0ZXJuU3RyaW5nID0gIiI7Ci0KLSAgICAvKioKLSAgICAgKiBBIGN1c3RvbSBtZXNzYWdlIGluIHRoZSBldmVudCBvZiBhIHZhbGlkYXRpb24gZmFpbHVyZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBfcGF0dGVybk5vdE1hdGNoZWRNZXNzYWdlOwotCi0gICAgLyoqCi0gICAgICogVGhlIG9iamVjdCB0aGF0IGhhbmRsZXMgcGF0dGVybiBtYXRjaGluZy4KLSAgICAgKi8KLSAgICBwcml2YXRlIFBhdHRlcm5EZWxlZ2F0ZSBfcGF0dGVybkRlbGVnYXRlOwotCi0gICAgLyoqCi0gICAgICogVGhlIGxvY2F0aW9uIG9mIHRoZSBzY3JpcHQgc3BlY2lmaWNhdGlvbiBmb3IgY2xpZW50IHNpZGUgdmFsaWRhdGlvbi4KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBfc2NyaXB0UGF0aCA9ICIvb3JnL2FwYWNoZS90YXBlc3RyeS92YWxpZC9QYXR0ZXJuVmFsaWRhdG9yLnNjcmlwdCI7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGN1c3RvbSB2YWxpZGF0aW9uIGZhaWx1cmUgbWVzc2FnZS4gVGhlIGRlZmF1bHQgbWVzc2FnZSBjb21lcyBmcm9tIAotICAgICAqIDxjb2RlPlZhbGlkYXRpb25TdHJpbmdzLnByb3BlcnRpZXM8L2NvZGU+IGZpbGUgZm9yIGtleSAKLSAgICAgKiA8Y29kZT5wYXR0ZXJuLW5vdC1tYXRjaGVkPC9jb2RlPi4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhdHRlcm5Ob3RNYXRjaGVkTWVzc2FnZSgpCi0gICAgewotICAgICAgICByZXR1cm4gX3BhdHRlcm5Ob3RNYXRjaGVkTWVzc2FnZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBwYXR0ZXJuIHRoYXQgdGhpcyB2YWxpZGF0b3IgdXNlcyBmb3IgdmFsaWRhdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhdHRlcm5TdHJpbmcoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9wYXR0ZXJuU3RyaW5nOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFsbG93cyBmb3IgYSBjdXN0b20gbWVzc2FnZSB0byBiZSBzZXQgdHlwaWNhbGx5IHZpYSB0aGUgYmVhbiBzcGVjaWZpY2F0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFBhdHRlcm5Ob3RNYXRjaGVkTWVzc2FnZShTdHJpbmcgbWVzc2FnZSkKLSAgICB7Ci0gICAgICAgIF9wYXR0ZXJuTm90TWF0Y2hlZE1lc3NhZ2UgPSBtZXNzYWdlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFsbG93cyB0aGUgdXNlciB0byBjaGFuZ2UgdGhlIHZhbGlkYXRpb24gcGF0dGVybi4gCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UGF0dGVyblN0cmluZyhTdHJpbmcgcGF0dGVybikKLSAgICB7Ci0gICAgICAgIF9wYXR0ZXJuU3RyaW5nID0gcGF0dGVybjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdGF0aWMgaW5uZXIgY2xhc3MgdGhhdCBhY3RzIGFzIGEgZGVsZWdhdGUgdG8gUmVnZXhwTWF0Y2hlciBhbmQgY29uZm9ybXMgdG8gdGhlIAotICAgICAqIFBhdHRlcm5EZWxlZ2F0ZSBjb250cmFjdC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBSZWdFeHBEZWxlZ2F0ZSBpbXBsZW1lbnRzIFBhdHRlcm5EZWxlZ2F0ZQotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBSZWdleHBNYXRjaGVyIF9tYXRjaGVyOwotCi0gICAgICAgIHByaXZhdGUgUmVnZXhwTWF0Y2hlciBnZXRQYXR0ZXJuTWF0Y2hlcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChfbWF0Y2hlciA9PSBudWxsKQotICAgICAgICAgICAgICAgIF9tYXRjaGVyID0gbmV3IFJlZ2V4cE1hdGNoZXIoKTsKLQotICAgICAgICAgICAgcmV0dXJuIF9tYXRjaGVyOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoU3RyaW5nIHBhdHRlcm5TdHJpbmcsIFN0cmluZyBpbnB1dCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGdldFBhdHRlcm5NYXRjaGVyKCkuY29udGFpbnMocGF0dGVyblN0cmluZywgaW5wdXQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRFc2NhcGVkUGF0dGVyblN0cmluZyhTdHJpbmcgcGF0dGVyblN0cmluZykKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGdldFBhdHRlcm5NYXRjaGVyKCkuZ2V0RXNjYXBlZFBhdHRlcm5TdHJpbmcocGF0dGVyblN0cmluZyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBbGxvd3MgZm9yIGEgY3VzdG9tIGltcGxlbWVudGF0aW9uIHRvIGRvIHRoZSBwYXR0ZXJuIG1hdGNoaW5nLiBUaGUgZGVmYXVsdCBwYXR0ZXJuIAotICAgICAqIG1hdGNoaW5nIGlzIGRvbmUgd2l0aCB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS51dGlsLlJlZ2V4cE1hdGNoZXJ9LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFBhdHRlcm5EZWxlZ2F0ZShQYXR0ZXJuRGVsZWdhdGUgcGF0dGVybkRlbGVnYXRlKQotICAgIHsKLSAgICAgICAgX3BhdHRlcm5EZWxlZ2F0ZSA9IHBhdHRlcm5EZWxlZ2F0ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjdXN0b20gcGF0dGVybiBtYXRjaGVyIGlmIG9uZSBpcyBwcm92aWRlZCBvciBjcmVhdGVzIGFuZCByZXR1cm5zIHRoZSAKLSAgICAgKiBkZWZhdWx0IG1hdGNoZXIgbGF6aWxpeS4KLSAgICAgKi8KLSAgICBwdWJsaWMgUGF0dGVybkRlbGVnYXRlIGdldFBhdHRlcm5EZWxlZ2F0ZSgpCi0gICAgewotICAgICAgICBpZiAoX3BhdHRlcm5EZWxlZ2F0ZSA9PSBudWxsKQotICAgICAgICAgICAgX3BhdHRlcm5EZWxlZ2F0ZSA9IG5ldyBSZWdFeHBEZWxlZ2F0ZSgpOwotCi0gICAgICAgIHJldHVybiBfcGF0dGVybkRlbGVnYXRlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS50YXBlc3RyeS52YWxpZC5JVmFsaWRhdG9yI3RvU3RyaW5nKG9yZy5hcGFjaGUudGFwZXN0cnkuZm9ybS5JRm9ybUNvbXBvbmVudCwgamF2YS5sYW5nLk9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKElGb3JtQ29tcG9uZW50IGZpZWxkLCBPYmplY3QgdmFsdWUpCi0gICAgewotICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIHJldHVybiB2YWx1ZS50b1N0cmluZygpOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGJ1aWxkUGF0dGVybk5vdE1hdGNoZWRNZXNzYWdlKElGb3JtQ29tcG9uZW50IGZpZWxkLCBTdHJpbmcgcGF0dGVyblN0cmluZykKLSAgICB7Ci0gICAgICAgIFN0cmluZyB0ZW1wbGF0ZU1lc3NhZ2UgPQotICAgICAgICAgICAgZ2V0UGF0dGVybigKLSAgICAgICAgICAgICAgICBfcGF0dGVybk5vdE1hdGNoZWRNZXNzYWdlLAotICAgICAgICAgICAgICAgICJwYXR0ZXJuLW5vdC1tYXRjaGVkIiwKLSAgICAgICAgICAgICAgICBmaWVsZC5nZXRQYWdlKCkuZ2V0TG9jYWxlKCkpOwotCi0gICAgICAgIHJldHVybiBmb3JtYXRTdHJpbmcodGVtcGxhdGVNZXNzYWdlLCBmaWVsZC5nZXREaXNwbGF5TmFtZSgpLCBwYXR0ZXJuU3RyaW5nKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUudGFwZXN0cnkudmFsaWQuSVZhbGlkYXRvciN0b09iamVjdChvcmcuYXBhY2hlLnRhcGVzdHJ5LmZvcm0uSUZvcm1Db21wb25lbnQsIGphdmEubGFuZy5TdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCB0b09iamVjdChJRm9ybUNvbXBvbmVudCBmaWVsZCwgU3RyaW5nIGlucHV0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiAoY2hlY2tSZXF1aXJlZChmaWVsZCwgaW5wdXQpKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgYm9vbGVhbiBtYXRjaGVkID0gZmFsc2U7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIG1hdGNoZWQgPSBnZXRQYXR0ZXJuRGVsZWdhdGUoKS5jb250YWlucyhfcGF0dGVyblN0cmluZywgaW5wdXQpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICBUYXBlc3RyeS5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICJQYXR0ZXJuVmFsaWRhdG9yLnBhdHRlcm4tbWF0Y2gtZXJyb3IiLAotICAgICAgICAgICAgICAgICAgICBfcGF0dGVyblN0cmluZywKLSAgICAgICAgICAgICAgICAgICAgZmllbGQuZ2V0RGlzcGxheU5hbWUoKSksCi0gICAgICAgICAgICAgICAgZmllbGQsCi0gICAgICAgICAgICAgICAgZmllbGQuZ2V0TG9jYXRpb24oKSwKLSAgICAgICAgICAgICAgICB0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghbWF0Y2hlZCkKLSAgICAgICAgICAgIHRocm93IG5ldyBWYWxpZGF0b3JFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgYnVpbGRQYXR0ZXJuTm90TWF0Y2hlZE1lc3NhZ2UoZmllbGQsIF9wYXR0ZXJuU3RyaW5nKSwKLSAgICAgICAgICAgICAgICBWYWxpZGF0aW9uQ29uc3RyYWludC5QQVRURVJOX01JU01BVENIKTsKLQotICAgICAgICByZXR1cm4gaW5wdXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWxsb3dzIGZvciBhIGN1c3RvbSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgY2xpZW50IHNpZGUgdmFsaWRhdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTY3JpcHRQYXRoKFN0cmluZyBzY3JpcHRQYXRoKQotICAgIHsKLSAgICAgICAgX3NjcmlwdFBhdGggPSBzY3JpcHRQYXRoOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS50YXBlc3RyeS52YWxpZC5JVmFsaWRhdG9yI3JlbmRlclZhbGlkYXRvckNvbnRyaWJ1dGlvbihvcmcuYXBhY2hlLnRhcGVzdHJ5LmZvcm0uSUZvcm1Db21wb25lbnQsIG9yZy5hcGFjaGUudGFwZXN0cnkuSU1hcmt1cFdyaXRlciwgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVxdWVzdEN5Y2xlKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbmRlclZhbGlkYXRvckNvbnRyaWJ1dGlvbigKLSAgICAgICAgSUZvcm1Db21wb25lbnQgZmllbGQsCi0gICAgICAgIElNYXJrdXBXcml0ZXIgd3JpdGVyLAotICAgICAgICBJUmVxdWVzdEN5Y2xlIGN5Y2xlKQotICAgIHsKLSAgICAgICAgaWYgKCFpc0NsaWVudFNjcmlwdGluZ0VuYWJsZWQoKSkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBNYXAgc3ltYm9scyA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICAgICAgaWYgKGlzUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIHN5bWJvbHMucHV0KCJyZXF1aXJlZE1lc3NhZ2UiLCBidWlsZFJlcXVpcmVkTWVzc2FnZShmaWVsZCkpOwotCi0gICAgICAgIHN5bWJvbHMucHV0KAotICAgICAgICAgICAgInBhdHRlcm5Ob3RNYXRjaGVkTWVzc2FnZSIsCi0gICAgICAgICAgICBidWlsZFBhdHRlcm5Ob3RNYXRjaGVkTWVzc2FnZShmaWVsZCwgZ2V0RXNjYXBlZFBhdHRlcm5TdHJpbmcoKSkpOwotCi0gICAgICAgIHByb2Nlc3NWYWxpZGF0b3JTY3JpcHQoX3NjcmlwdFBhdGgsIGN5Y2xlLCBmaWVsZCwgc3ltYm9scyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZXNjYXBlZCBzZXF1ZW5jZSBvZiB0aGUgcGF0dGVybiBzdHJpbmcgZm9yIHJlbmRlcmluZyBpbiB0aGUgZXJyb3IgbWVzc2FnZS4gCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRFc2NhcGVkUGF0dGVyblN0cmluZygpCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0UGF0dGVybkRlbGVnYXRlKCkuZ2V0RXNjYXBlZFBhdHRlcm5TdHJpbmcoX3BhdHRlcm5TdHJpbmcpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICJQYXR0ZXJuOiAiCi0gICAgICAgICAgICArIF9wYXR0ZXJuU3RyaW5nCi0gICAgICAgICAgICArICI7IFNjcmlwdCBQYXRoOiAiCi0gICAgICAgICAgICArIF9zY3JpcHRQYXRoCi0gICAgICAgICAgICArICI7IFBhdHRlcm4gRGVsZWdhdGU6ICIKLSAgICAgICAgICAgICsgX3BhdHRlcm5EZWxlZ2F0ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdmFsaWQvUGF0dGVyblZhbGlkYXRvci5zY3JpcHQgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdmFsaWQvUGF0dGVyblZhbGlkYXRvci5zY3JpcHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYWVmMjMuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3ZhbGlkL1BhdHRlcm5WYWxpZGF0b3Iuc2NyaXB0CisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+DQotPCEtLSAkSWQ6ICQgLS0+DQotPCFET0NUWVBFIHNjcmlwdCBQVUJMSUMNCi0JIi0vL0FwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLy9UYXBlc3RyeSBTY3JpcHQgU3BlY2lmaWNhdGlvbiAzLjAvL0VOIg0KLQkiaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy90YXBlc3RyeS9kdGQvU2NyaXB0XzNfMC5kdGQiPg0KLTwhLS0gDQotDQotICBDcmVhdGVzIGEgc2NyaXB0IGZvciB2YWxpZGF0aW5nIHRoYXQgYSBmaWVsZCBtYXRjaGVzIGEgcmVxdWlyZWQgcGF0dGVybi4NCi0gIA0KLSAgSW5wdXQgc3ltYm9sczoNCi0gICAgIGZpZWxkLCBmb3JtLCB2YWxpZGF0b3I6ICBBcyBub3JtYWwgZm9yIGEgdmFsaWRhdGlvbiBzY3JpcHQuDQotCSByZXF1aXJlZE1lc3NhZ2U6IE1lc3NhZ2UgdG8gZGlzcGxheSBpZiB0aGUgZmllbGQgaXMgcmVxdWlyZWQgeWV0IGJsYW5rLg0KLQkgcGF0dGVybk5vdE1hdGNoZWRNZXNzYWdlOiBNZXNzYWdlIHRvIGRpc3BsYXkgaWYgdGhlIGZpZWxkIGRvZXMgbm90IGZ1bGZpbGwgdGhlIHJlcXVpcmVkIHBhdHRlcm4uDQotICAgICANCi0tLT4NCi0JDQotPHNjcmlwdD4NCi0NCi08aW5jbHVkZS1zY3JpcHQgcmVzb3VyY2UtcGF0aD0iL29yZy9hcGFjaGUvdGFwZXN0cnkvdmFsaWQvVmFsaWRhdG9yLmpzIi8+DQotDQotPGlucHV0LXN5bWJvbCBrZXk9ImZpZWxkIiBjbGFzcz0ib3JnLmFwYWNoZS50YXBlc3RyeS52YWxpZC5WYWxpZEZpZWxkIiByZXF1aXJlZD0ieWVzIi8+DQotPGlucHV0LXN5bWJvbCBrZXk9ImZvcm0iIGNsYXNzPSJvcmcuYXBhY2hlLnRhcGVzdHJ5LklGb3JtIiByZXF1aXJlZD0ieWVzIi8+DQotPGlucHV0LXN5bWJvbCBrZXk9InZhbGlkYXRvciIgY2xhc3M9Im9yZy5hcGFjaGUudGFwZXN0cnkudmFsaWQuUGF0dGVyblZhbGlkYXRvciIgcmVxdWlyZWQ9InllcyIvPg0KLTxpbnB1dC1zeW1ib2wga2V5PSJyZXF1aXJlZE1lc3NhZ2UiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIi8+DQotPGlucHV0LXN5bWJvbCBrZXk9InBhdHRlcm5Ob3RNYXRjaGVkTWVzc2FnZSIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmciIHJlcXVpcmVkPSJ5ZXMiLz4NCi0NCi08bGV0IGtleT0iZnVuY3Rpb24iIHVuaXF1ZT0ieWVzIj4NCi0gICAgdmFsaWRhdGVfJHtmaWVsZC5uYW1lfQ0KLTwvbGV0Pg0KLQ0KLTxsZXQga2V5PSJwYXR0ZXJuIiB1bmlxdWU9InllcyI+DQotICAgIHBhdHRlcm5fJHtmaWVsZC5uYW1lfQ0KLTwvbGV0Pg0KLQ0KLTxib2R5Pg0KLXZhciAke3BhdHRlcm59ID0gbmV3IFJlZ0V4cCgiJHt2YWxpZGF0b3IuZXNjYXBlZFBhdHRlcm5TdHJpbmd9Iik7DQotDQotZnVuY3Rpb24gJHtmdW5jdGlvbn0oKQ0KLXsNCi0gICAgdmFyIGZpZWxkID0gZG9jdW1lbnQuJHtmb3JtLm5hbWV9LiR7ZmllbGQubmFtZX07DQotPGlmIGV4cHJlc3Npb249InZhbGlkYXRvci5yZXF1aXJlZCI+DQotICAgIGlmIChmaWVsZC52YWx1ZS5sZW5ndGggPT0gMCkNCi0gICAgICAgIHJldHVybiB2YWxpZGF0b3JfaW52YWxpZF9maWVsZChmaWVsZCwgIiR7cmVxdWlyZWRNZXNzYWdlfSIpOw0KLTwvaWY+DQotICAgIGlmIChmaWVsZC52YWx1ZS5sZW5ndGggJmd0OyAwICZhbXA7JmFtcDsgISR7cGF0dGVybn0udGVzdChmaWVsZC52YWx1ZSkpDQotICAgICAgICByZXR1cm4gdmFsaWRhdG9yX2ludmFsaWRfZmllbGQoZmllbGQsICIke3BhdHRlcm5Ob3RNYXRjaGVkTWVzc2FnZX0iKTsNCi0NCi0gICAgcmV0dXJuIHRydWU7DQotfQ0KLTwvYm9keT4NCi0NCi08L3NjcmlwdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdmFsaWQvUmVuZGVyU3RyaW5nLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdmFsaWQvUmVuZGVyU3RyaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwMmFhNjMuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3ZhbGlkL1JlbmRlclN0cmluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkudmFsaWQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklNYXJrdXBXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVuZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlcXVlc3RDeWNsZTsKLQotLyoqCi0gKiBBIHdyYXBwZXIgYXJvdW5kIHtAbGluayBTdHJpbmd9dGhhdCBhbGxvd3MgdGhlIFN0cmluZyB0byBiZSByZW5kZXJyZWQuIFRoaXMgaXMgcHJpbWFyaWx5IHVzZWQgdG8KLSAqIHByZXNlbnQgZXJyb3IgbWVzc2FnZXMuCi0gKiAKLSAqIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqLwotCi1wdWJsaWMgY2xhc3MgUmVuZGVyU3RyaW5nIGltcGxlbWVudHMgSVJlbmRlcgotewotICAgIHByaXZhdGUgU3RyaW5nIF9zdHJpbmc7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gX3JhdyA9IGZhbHNlOwotCi0gICAgcHVibGljIFJlbmRlclN0cmluZyhTdHJpbmcgc3RyaW5nKQotICAgIHsKLSAgICAgICAgX3N0cmluZyA9IHN0cmluZzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gc3RyaW5nCi0gICAgICogICAgICAgICAgICB0aGUgc3RyaW5nIHRvIHJlbmRlcgotICAgICAqIEBwYXJhbSByYXcKLSAgICAgKiAgICAgICAgICAgIGlmIHRydWUsIHRoZSBTdHJpbmcgaXMgcmVuZGVyZWQgYXMtaXMsIHdpdGggbm8gZmlsdGVyaW5nLiBJZiBmYWxzZSAodGhlIGRlZmF1bHQpLAotICAgICAqICAgICAgICAgICAgdGhlIFN0cmluZyBpcyBmaWx0ZXJlZC4KLSAgICAgKi8KLQotICAgIHB1YmxpYyBSZW5kZXJTdHJpbmcoU3RyaW5nIHN0cmluZywgYm9vbGVhbiByYXcpCi0gICAgewotICAgICAgICBfc3RyaW5nID0gc3RyaW5nOwotICAgICAgICBfcmF3ID0gcmF3OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbmRlcnMgdGhlIFN0cmluZyB0byB0aGUgd3JpdGVyLiBEb2VzIG5vdGhpbmcgaWYgdGhlIHN0cmluZyBpcyBudWxsLiBJZiByYXcgaXMgdHJ1ZSwgdXNlcwotICAgICAqIHtAbGluayBJTWFya3VwV3JpdGVyI3ByaW50UmF3KFN0cmluZyl9LCBvdGhlcndpc2Uge0BsaW5rIElNYXJrdXBXcml0ZXIjcHJpbnQoU3RyaW5nKX0uCi0gICAgICovCi0KLSAgICBwdWJsaWMgdm9pZCByZW5kZXIoSU1hcmt1cFdyaXRlciB3cml0ZXIsIElSZXF1ZXN0Q3ljbGUgY3ljbGUpCi0gICAgewotICAgICAgICBpZiAoX3N0cmluZyA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIGlmIChfcmF3KQotICAgICAgICAgICAgd3JpdGVyLnByaW50UmF3KF9zdHJpbmcpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICB3cml0ZXIucHJpbnQoX3N0cmluZyk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRTdHJpbmcoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9zdHJpbmc7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNSYXcoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9yYXc7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gICAgewotICAgICAgICByZXR1cm4gX3N0cmluZzsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3ZhbGlkL1N0cmluZ1ZhbGlkYXRvci5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3ZhbGlkL1N0cmluZ1ZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjFiZGI1Li4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS92YWxpZC9TdHJpbmdWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS52YWxpZDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklNYXJrdXBXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVxdWVzdEN5Y2xlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuZm9ybS5JRm9ybUNvbXBvbmVudDsKLQotLyoqCi0gKiAgU2ltcGxlIHZhbGlkYXRpb24gb2Ygc3RyaW5ncywgdG8gZW5mb3JjZSByZXF1aXJlZCwgYW5kIG1pbmltdW0gbGVuZ3RoCi0gKiAgKG1heGltdW0gbGVuZ3RoIGlzIGVuZm9yY2VkIGluIHRoZSBjbGllbnQgYnJvd3NlciwgYnkgc2V0dGluZyBhIG1heGltdW0gaW5wdXQKLSAqICBsZW5ndGggb24gdGhlIHRleHQgZmllbGQpLgotICoKLSAqCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogIEB2ZXJzaW9uICRJZCQKLSAqICBAc2luY2UgMS4wLjgKLSAqCi0gKiovCi0KLXB1YmxpYyBjbGFzcyBTdHJpbmdWYWxpZGF0b3IgZXh0ZW5kcyBCYXNlVmFsaWRhdG9yCi17Ci0gICAgcHJpdmF0ZSBpbnQgX21pbmltdW1MZW5ndGg7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBfbWluaW11bUxlbmd0aE1lc3NhZ2U7Ci0KLSAgICAvKiogQHNpbmNlIDIuMiAqKi8KLQotICAgIHByaXZhdGUgU3RyaW5nIF9zY3JpcHRQYXRoID0gIi9vcmcvYXBhY2hlL3RhcGVzdHJ5L3ZhbGlkL1N0cmluZ1ZhbGlkYXRvci5zY3JpcHQiOwotCi0gICAgcHVibGljIFN0cmluZ1ZhbGlkYXRvcigpCi0gICAgewotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nVmFsaWRhdG9yKGJvb2xlYW4gcmVxdWlyZWQpCi0gICAgewotICAgICAgICBzdXBlcihyZXF1aXJlZCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZyhJRm9ybUNvbXBvbmVudCBmaWVsZCwgT2JqZWN0IHZhbHVlKQotICAgIHsKLSAgICAgICAgaWYgKHZhbHVlID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICByZXR1cm4gdmFsdWUudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IHRvT2JqZWN0KElGb3JtQ29tcG9uZW50IGZpZWxkLCBTdHJpbmcgaW5wdXQpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmIChjaGVja1JlcXVpcmVkKGZpZWxkLCBpbnB1dCkpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICBpZiAoX21pbmltdW1MZW5ndGggPiAwICYmIGlucHV0Lmxlbmd0aCgpIDwgX21pbmltdW1MZW5ndGgpCi0gICAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdG9yRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIGJ1aWxkTWluaW11bUxlbmd0aE1lc3NhZ2UoZmllbGQpLAotICAgICAgICAgICAgICAgIFZhbGlkYXRpb25Db25zdHJhaW50Lk1JTklNVU1fV0lEVEgpOwotCi0gICAgICAgIHJldHVybiBpbnB1dDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldE1pbmltdW1MZW5ndGgoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9taW5pbXVtTGVuZ3RoOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE1pbmltdW1MZW5ndGgoaW50IG1pbmltdW1MZW5ndGgpCi0gICAgewotICAgICAgICBfbWluaW11bUxlbmd0aCA9IG1pbmltdW1MZW5ndGg7Ci0gICAgfQotCi0gICAgLyoqIAotICAgICAqIAotICAgICAqICBAc2luY2UgMi4yCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgcmVuZGVyVmFsaWRhdG9yQ29udHJpYnV0aW9uKAotICAgICAgICBJRm9ybUNvbXBvbmVudCBmaWVsZCwKLSAgICAgICAgSU1hcmt1cFdyaXRlciB3cml0ZXIsCi0gICAgICAgIElSZXF1ZXN0Q3ljbGUgY3ljbGUpCi0gICAgewotICAgICAgICBpZiAoIWlzQ2xpZW50U2NyaXB0aW5nRW5hYmxlZCgpKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIGlmICghKGlzUmVxdWlyZWQoKSB8fCBfbWluaW11bUxlbmd0aCA+IDApKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIE1hcCBzeW1ib2xzID0gbmV3IEhhc2hNYXAoKTsKLQotICAgICAgICBpZiAoaXNSZXF1aXJlZCgpKQotICAgICAgICAgICAgc3ltYm9scy5wdXQoInJlcXVpcmVkTWVzc2FnZSIsIGJ1aWxkUmVxdWlyZWRNZXNzYWdlKGZpZWxkKSk7Ci0KLSAgICAgICAgaWYgKF9taW5pbXVtTGVuZ3RoID4gMCkKLSAgICAgICAgICAgIHN5bWJvbHMucHV0KCJtaW5pbXVtTGVuZ3RoTWVzc2FnZSIsIGJ1aWxkTWluaW11bUxlbmd0aE1lc3NhZ2UoZmllbGQpKTsKLQotICAgICAgICBwcm9jZXNzVmFsaWRhdG9yU2NyaXB0KF9zY3JpcHRQYXRoLCBjeWNsZSwgZmllbGQsIHN5bWJvbHMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBAc2luY2UgMi4yCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIFN0cmluZyBnZXRTY3JpcHRQYXRoKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfc2NyaXB0UGF0aDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgQWxsb3dzIGEgZGV2ZWxvcGVyIHRvIHVzZSB0aGUgZXhpc3RpbmcgdmFsaWRhdGlvbiBsb2dpYyB3aXRoIGEgZGlmZmVyZW50IGNsaWVudC1zaWRlCi0gICAgICogIHNjcmlwdC4gIFRoaXMgaXMgb2Z0ZW4gc3VmZmljaWVudCB0byBhbGxvdyBhcHBsaWNhdGlvbi1zcGVjaWZpYyBlcnJvciBwcmVzZW50YXRpb24KLSAgICAgKiAgKHBlcmhhcHMgYnkgdXNpbmcgREhUTUwgdG8gdXBkYXRlIHRoZSBjb250ZW50IG9mIGEgJmx0O3NwYW4mZ3Q7IHRhZywgb3IgdG8gdXNlCi0gICAgICogIGEgbW9yZSBzb3BoaXN0aWNhdGVkIHBvcC11cCB3aW5kb3cgdGhhbiA8Y29kZT53aW5kb3cuYWxlcnQoKTwvY29kZT4pLgotICAgICAqIAotICAgICAqICBAc2luY2UgMi4yCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIHZvaWQgc2V0U2NyaXB0UGF0aChTdHJpbmcgc2NyaXB0UGF0aCkKLSAgICB7Ci0gICAgICAgIF9zY3JpcHRQYXRoID0gc2NyaXB0UGF0aDsKLSAgICB9Ci0KLSAgICAvKiogQHNpbmNlIDMuMCAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWluaW11bUxlbmd0aE1lc3NhZ2UoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9taW5pbXVtTGVuZ3RoTWVzc2FnZTsKLSAgICB9Ci0KLSAgICAvKiogCi0gICAgICogT3ZlcnJpZGVzIHRoZSA8Y29kZT5maWVsZC10b28tc2hvcnQ8L2NvZGU+IGJ1bmRsZSBrZXkuCi0gICAgICogUGFyYW1ldGVyIHswfSBpcyB0aGUgbWluaW11bSBsZW5ndGguCi0gICAgICogUGFyYW1ldGVyIHsxfSBpcyB0aGUgZGlzcGxheSBuYW1lIG9mIHRoZSBmaWVsZC4KLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMy4wCi0gICAgICovCi0KLSAgICBwdWJsaWMgdm9pZCBzZXRNaW5pbXVtTGVuZ3RoTWVzc2FnZShTdHJpbmcgc3RyaW5nKQotICAgIHsKLSAgICAgICAgX21pbmltdW1MZW5ndGhNZXNzYWdlID0gc3RyaW5nOwotICAgIH0KLQotICAgIC8qKiBAc2luY2UgMy4wICovCi0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkTWluaW11bUxlbmd0aE1lc3NhZ2UoSUZvcm1Db21wb25lbnQgZmllbGQpCi0gICAgewotICAgICAgICBTdHJpbmcgcGF0dGVybiA9Ci0gICAgICAgICAgICBnZXRQYXR0ZXJuKF9taW5pbXVtTGVuZ3RoTWVzc2FnZSwgImZpZWxkLXRvby1zaG9ydCIsIGZpZWxkLmdldFBhZ2UoKS5nZXRMb2NhbGUoKSk7Ci0KLSAgICAgICAgcmV0dXJuIGZvcm1hdFN0cmluZyhwYXR0ZXJuLCBJbnRlZ2VyLnRvU3RyaW5nKF9taW5pbXVtTGVuZ3RoKSwgZmllbGQuZ2V0RGlzcGxheU5hbWUoKSk7Ci0gICAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3ZhbGlkL1N0cmluZ1ZhbGlkYXRvci5zY3JpcHQgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdmFsaWQvU3RyaW5nVmFsaWRhdG9yLnNjcmlwdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY1MDhlZC4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdmFsaWQvU3RyaW5nVmFsaWRhdG9yLnNjcmlwdAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLSAkSWQkIC0tPgotPCFET0NUWVBFIHNjcmlwdCBQVUJMSUMKLQkiLS8vQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24vL1RhcGVzdHJ5IFNjcmlwdCBTcGVjaWZpY2F0aW9uIDMuMC8vRU4iCi0JImh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvdGFwZXN0cnkvZHRkL1NjcmlwdF8zXzAuZHRkIj4KLTwhLS0KLQotICBDcmVhdGVzIGEgc2NyaXB0IGZvciB2YWxpZGF0aW5nIHRoYXQgYSBmaWVsZCBpcyByZXF1aXJlZCBhbmQvb3IgaGFzIGEgbWluaW11bQotICBmaWVsZCBsZW5ndGguCi0KLSAgSW5wdXQgc3ltYm9sczoKLSAgICAgZmllbGQsIGZvcm0sIHZhbGlkYXRvcjogIEFzIG5vcm1hbCBmb3IgYSB2YWxpZGF0aW9uIHNjcmlwdC4KLQkgcmVxdWlyZWRNZXNzYWdlOiBNZXNzYWdlIHRvIGRpc3BsYXkgaWYgdGhlIGZpZWxkIGlzIHJlcXVpcmVkIHlldCBibGFuay4KLQkgbWluaW11bUxlbmd0aE1lc3NhZ2U6IE1lc3NhZ2UgdG8gZGlzcGxheSBpZiB0aGUgZmllbGQgbGVuZ3RoIGlzIHRvbyBzaG9ydC4KLQotLS0+Ci0KLTxzY3JpcHQ+Ci0KLTxpbmNsdWRlLXNjcmlwdCByZXNvdXJjZS1wYXRoPSIvb3JnL2FwYWNoZS90YXBlc3RyeS92YWxpZC9WYWxpZGF0b3IuanMiLz4KLQotPGlucHV0LXN5bWJvbCBrZXk9ImZpZWxkIiBjbGFzcz0ib3JnLmFwYWNoZS50YXBlc3RyeS52YWxpZC5WYWxpZEZpZWxkIiByZXF1aXJlZD0ieWVzIi8+Ci08aW5wdXQtc3ltYm9sIGtleT0iZm9ybSIgY2xhc3M9Im9yZy5hcGFjaGUudGFwZXN0cnkuSUZvcm0iIHJlcXVpcmVkPSJ5ZXMiLz4KLTxpbnB1dC1zeW1ib2wga2V5PSJ2YWxpZGF0b3IiIGNsYXNzPSJvcmcuYXBhY2hlLnRhcGVzdHJ5LnZhbGlkLlN0cmluZ1ZhbGlkYXRvciIgcmVxdWlyZWQ9InllcyIvPgotPGlucHV0LXN5bWJvbCBrZXk9InJlcXVpcmVkTWVzc2FnZSIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmciLz4KLTxpbnB1dC1zeW1ib2wga2V5PSJtaW5pbXVtTGVuZ3RoTWVzc2FnZSIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmciLz4KLQotPGxldCBrZXk9ImZ1bmN0aW9uIiB1bmlxdWU9InllcyI+Ci12YWxpZGF0ZV8ke2ZpZWxkLm5hbWV9Ci08L2xldD4KLQotPGJvZHk+Ci1mdW5jdGlvbiAke2Z1bmN0aW9ufSgpCi17Ci0gIHZhciBmaWVsZCA9IGRvY3VtZW50LiR7Zm9ybS5uYW1lfS4ke2ZpZWxkLm5hbWV9OwotPGlmIGV4cHJlc3Npb249InZhbGlkYXRvci5yZXF1aXJlZCI+Ci0gIGlmIChmaWVsZC52YWx1ZS5sZW5ndGggPT0gMCkKLSAgICAgcmV0dXJuIHZhbGlkYXRvcl9pbnZhbGlkX2ZpZWxkKGZpZWxkLCAiJHtyZXF1aXJlZE1lc3NhZ2V9Iik7Ci08L2lmPgotCi08aWYtbm90IGV4cHJlc3Npb249InZhbGlkYXRvci5yZXF1aXJlZCI+Ci0gIGlmIChmaWVsZC52YWx1ZS5sZW5ndGggPT0gMCkKLSAgICAgcmV0dXJuIHRydWU7Ci08L2lmLW5vdD4KLQotPGlmIGV4cHJlc3Npb249InZhbGlkYXRvci5taW5pbXVtTGVuZ3RoIj4KLSAgaWYgKGZpZWxkLnZhbHVlLmxlbmd0aCAmbHQ7ICR7dmFsaWRhdG9yLm1pbmltdW1MZW5ndGh9KQotICAgICByZXR1cm4gdmFsaWRhdG9yX2ludmFsaWRfZmllbGQoZmllbGQsICIke21pbmltdW1MZW5ndGhNZXNzYWdlfSIpOwotPC9pZj4KLSAgcmV0dXJuIHRydWU7Ci19Ci08L2JvZHk+Ci0KLTwvc2NyaXB0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS92YWxpZC9VcmxWYWxpZGF0b3IuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS92YWxpZC9VcmxWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjgwYTkwMC4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdmFsaWQvVXJsVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzYgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkudmFsaWQ7Ci0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklNYXJrdXBXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVxdWVzdEN5Y2xlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuZm9ybS5JRm9ybUNvbXBvbmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnV0aWwuU3RyaW5nU3BsaXR0ZXI7Ci0KLS8qKgotICoKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQHNpbmNlIDMuMAotICoKLSAqKi8KLXB1YmxpYyBjbGFzcyBVcmxWYWxpZGF0b3IgZXh0ZW5kcyBCYXNlVmFsaWRhdG9yIHsKLQlwcml2YXRlIGludCBfbWluaW11bUxlbmd0aDsKLQlwcml2YXRlIFN0cmluZyBfbWluaW11bUxlbmd0aE1lc3NhZ2U7Ci0JcHJpdmF0ZSBTdHJpbmcgX2ludmFsaWRVcmxGb3JtYXRNZXNzYWdlOwotCXByaXZhdGUgU3RyaW5nIF9kaXNhbGxvd2VkUHJvdG9jb2xNZXNzYWdlOwotCXByaXZhdGUgQ29sbGVjdGlvbiBfYWxsb3dlZFByb3RvY29sczsKLQotCXByaXZhdGUgU3RyaW5nIF9zY3JpcHRQYXRoID0gIi9vcmcvYXBhY2hlL3RhcGVzdHJ5L3ZhbGlkL1VybFZhbGlkYXRvci5zY3JpcHQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgVXJsVmFsaWRhdG9yKCkgewotCX0KLQotCXByaXZhdGUgVXJsVmFsaWRhdG9yKGJvb2xlYW4gcmVxdWlyZWQpIHsKLQkJc3VwZXIocmVxdWlyZWQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoSUZvcm1Db21wb25lbnQgZmllbGQsIE9iamVjdCB2YWx1ZSkgewotCQlpZiAodmFsdWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCXJldHVybiB2YWx1ZS50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgdG9PYmplY3QoSUZvcm1Db21wb25lbnQgZmllbGQsIFN0cmluZyBpbnB1dCkKLQkJdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbiB7Ci0JCWlmIChjaGVja1JlcXVpcmVkKGZpZWxkLCBpbnB1dCkpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlpZiAoX21pbmltdW1MZW5ndGggPiAwICYmIGlucHV0Lmxlbmd0aCgpIDwgX21pbmltdW1MZW5ndGgpCi0JCQl0aHJvdyBuZXcgVmFsaWRhdG9yRXhjZXB0aW9uKAotCQkJCWJ1aWxkTWluaW11bUxlbmd0aE1lc3NhZ2UoZmllbGQpLAotCQkJCVZhbGlkYXRpb25Db25zdHJhaW50Lk1JTklNVU1fV0lEVEgpOwotCi0JCWlmICghaXNWYWxpZFVybChpbnB1dCkpCi0JCQl0aHJvdyBuZXcgVmFsaWRhdG9yRXhjZXB0aW9uKAotCQkJCWJ1aWxkSW52YWxpZFVybEZvcm1hdE1lc3NhZ2UoZmllbGQpLAotCQkJCVZhbGlkYXRpb25Db25zdHJhaW50LlVSTF9GT1JNQVQpOwotCi0JCWlmICghaXNBbGxvd2VkUHJvdG9jb2woaW5wdXQpKSB7Ci0JCQl0aHJvdyBuZXcgVmFsaWRhdG9yRXhjZXB0aW9uKAotCQkJCWJ1aWxkRGlzYWxsb3dlZFByb3RvY29sTWVzc2FnZShmaWVsZCksCi0JCQkJVmFsaWRhdGlvbkNvbnN0cmFpbnQuRElTQUxMT1dFRF9QUk9UT0NPTCk7Ci0JCX0KLQotCQlyZXR1cm4gaW5wdXQ7Ci0JfQotCi0JcHVibGljIGludCBnZXRNaW5pbXVtTGVuZ3RoKCkgewotCQlyZXR1cm4gX21pbmltdW1MZW5ndGg7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TWluaW11bUxlbmd0aChpbnQgbWluaW11bUxlbmd0aCkgewotCQlfbWluaW11bUxlbmd0aCA9IG1pbmltdW1MZW5ndGg7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVuZGVyVmFsaWRhdG9yQ29udHJpYnV0aW9uKAotCQlJRm9ybUNvbXBvbmVudCBmaWVsZCwKLQkJSU1hcmt1cFdyaXRlciB3cml0ZXIsCi0JCUlSZXF1ZXN0Q3ljbGUgY3ljbGUpIHsKLQkJaWYgKCFpc0NsaWVudFNjcmlwdGluZ0VuYWJsZWQoKSkKLQkJCXJldHVybjsKLQotCQlNYXAgc3ltYm9scyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkJaWYgKGlzUmVxdWlyZWQoKSkKLQkJCXN5bWJvbHMucHV0KCJyZXF1aXJlZE1lc3NhZ2UiLCBidWlsZFJlcXVpcmVkTWVzc2FnZShmaWVsZCkpOyAvLyROT04tTkxTLTEkCi0KLQkJaWYgKF9taW5pbXVtTGVuZ3RoID4gMCkKLQkJCXN5bWJvbHMucHV0KCJtaW5pbXVtTGVuZ3RoTWVzc2FnZSIsIC8vJE5PTi1OTFMtMSQKLQkJCWJ1aWxkTWluaW11bUxlbmd0aE1lc3NhZ2UoZmllbGQpKTsKLQotCQlzeW1ib2xzLnB1dCgidXJsRm9ybWF0TWVzc2FnZSIsIGJ1aWxkSW52YWxpZFVybEZvcm1hdE1lc3NhZ2UoZmllbGQpKTsgLy8kTk9OLU5MUy0xJAotCi0JCXN5bWJvbHMucHV0KCJ1cmxEaXNhbGxvd2VkUHJvdG9jb2xNZXNzYWdlIiwgLy8kTk9OLU5MUy0xJAotCQlidWlsZERpc2FsbG93ZWRQcm90b2NvbE1lc3NhZ2UoZmllbGQpKTsKLQotCQlzeW1ib2xzLnB1dCgidXJsUmVnZXhwUHJvdG9jb2xzIiwgYnVpbGRVcmxSZWdleHBQcm90b2NvbHMoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlwcm9jZXNzVmFsaWRhdG9yU2NyaXB0KF9zY3JpcHRQYXRoLCBjeWNsZSwgZmllbGQsIHN5bWJvbHMpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkVXJsUmVnZXhwUHJvdG9jb2xzKCkgewotCQlpZihfYWxsb3dlZFByb3RvY29scyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlTdHJpbmcgcmVnZXhwID0gIi8oIjsgLy8kTk9OLU5MUy0xJAotCQlJdGVyYXRvciBpdGVyID0gX2FsbG93ZWRQcm90b2NvbHMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlTdHJpbmcgcHJvdG9jb2wgPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLQkJCXJlZ2V4cCArPSBwcm90b2NvbDsKLQkJCWlmIChpdGVyLmhhc05leHQoKSkgewotCQkJCXJlZ2V4cCArPSAifCI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlyZWdleHAgKz0gIik6Ly8vIjsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gcmVnZXhwOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U2NyaXB0UGF0aCgpIHsKLQkJcmV0dXJuIF9zY3JpcHRQYXRoOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNjcmlwdFBhdGgoU3RyaW5nIHNjcmlwdFBhdGgpIHsKLQkJX3NjcmlwdFBhdGggPSBzY3JpcHRQYXRoOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzVmFsaWRVcmwoU3RyaW5nIHVybCkgewotCQlib29sZWFuIGJJc1ZhbGlkOwotCQl0cnkgewotCQkJbmV3IFVSTCh1cmwpOwotCQkJYklzVmFsaWQgPSB0cnVlOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbXVlKSB7Ci0JCQliSXNWYWxpZCA9IGZhbHNlOwotCQl9Ci0JCXJldHVybiBiSXNWYWxpZDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0FsbG93ZWRQcm90b2NvbChTdHJpbmcgdXJsKSB7Ci0JCWJvb2xlYW4gYklzQWxsb3dlZCA9IGZhbHNlOwotCQlpZiAoX2FsbG93ZWRQcm90b2NvbHMgIT0gbnVsbCkgewotCQkJVVJMIG9Vcmw7Ci0JCQl0cnkgewotCQkJCW9VcmwgPSBuZXcgVVJMKHVybCk7Ci0JCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCVN0cmluZyBhY3R1YWxQcm90b2NvbCA9IG9VcmwuZ2V0UHJvdG9jb2woKTsKLQkJCUl0ZXJhdG9yIGl0ZXIgPSBfYWxsb3dlZFByb3RvY29scy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJU3RyaW5nIHByb3RvY29sID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKHByb3RvY29sLmVxdWFscyhhY3R1YWxQcm90b2NvbCkpIHsKLQkJCQkJYklzQWxsb3dlZCA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWJJc0FsbG93ZWQgPSB0cnVlOwotCQl9Ci0JCXJldHVybiBiSXNBbGxvd2VkOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SW52YWxpZFVybEZvcm1hdE1lc3NhZ2UoKSB7Ci0JCXJldHVybiBfaW52YWxpZFVybEZvcm1hdE1lc3NhZ2U7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRNaW5pbXVtTGVuZ3RoTWVzc2FnZSgpIHsKLQkJcmV0dXJuIF9taW5pbXVtTGVuZ3RoTWVzc2FnZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJbnZhbGlkVXJsRm9ybWF0TWVzc2FnZShTdHJpbmcgc3RyaW5nKSB7Ci0JCV9pbnZhbGlkVXJsRm9ybWF0TWVzc2FnZSA9IHN0cmluZzsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERpc2FsbG93ZWRQcm90b2NvbE1lc3NhZ2UoKSB7Ci0JCXJldHVybiBfZGlzYWxsb3dlZFByb3RvY29sTWVzc2FnZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREaXNhbGxvd2VkUHJvdG9jb2xNZXNzYWdlKFN0cmluZyBzdHJpbmcpIHsKLQkJX2Rpc2FsbG93ZWRQcm90b2NvbE1lc3NhZ2UgPSBzdHJpbmc7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TWluaW11bUxlbmd0aE1lc3NhZ2UoU3RyaW5nIHN0cmluZykgewotCQlfbWluaW11bUxlbmd0aE1lc3NhZ2UgPSBzdHJpbmc7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZE1pbmltdW1MZW5ndGhNZXNzYWdlKElGb3JtQ29tcG9uZW50IGZpZWxkKSB7Ci0JCQlTdHJpbmcgcGF0dGVybiA9IGdldFBhdHRlcm4oX21pbmltdW1MZW5ndGhNZXNzYWdlLCAiZmllbGQtdG9vLXNob3J0IiwgLy8kTk9OLU5MUy0xJAotCWZpZWxkLmdldFBhZ2UoKS5nZXRMb2NhbGUoKSk7Ci0KLQkJcmV0dXJuIGZvcm1hdFN0cmluZygKLQkJCXBhdHRlcm4sCi0JCQlJbnRlZ2VyLnRvU3RyaW5nKF9taW5pbXVtTGVuZ3RoKSwKLQkJCWZpZWxkLmdldERpc3BsYXlOYW1lKCkpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRJbnZhbGlkVXJsRm9ybWF0TWVzc2FnZShJRm9ybUNvbXBvbmVudCBmaWVsZCkgewotCQkJU3RyaW5nIHBhdHRlcm4gPSBnZXRQYXR0ZXJuKF9pbnZhbGlkVXJsRm9ybWF0TWVzc2FnZSwgImludmFsaWQtdXJsLWZvcm1hdCIsIC8vJE5PTi1OTFMtMSQKLQlmaWVsZC5nZXRQYWdlKCkuZ2V0TG9jYWxlKCkpOwotCi0JCXJldHVybiBmb3JtYXRTdHJpbmcocGF0dGVybiwgZmllbGQuZ2V0RGlzcGxheU5hbWUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZERpc2FsbG93ZWRQcm90b2NvbE1lc3NhZ2UoSUZvcm1Db21wb25lbnQgZmllbGQpIHsKLQkJaWYoX2FsbG93ZWRQcm90b2NvbHMgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCVN0cmluZyBwYXR0ZXJuID0gZ2V0UGF0dGVybihfZGlzYWxsb3dlZFByb3RvY29sTWVzc2FnZSwgImRpc2FsbG93ZWQtcHJvdG9jb2wiLCAvLyROT04tTkxTLTEkCi0JZmllbGQuZ2V0UGFnZSgpLmdldExvY2FsZSgpKTsKLQotCQlTdHJpbmcgYWxsb3dlZFByb3RvY29scyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCUl0ZXJhdG9yIGl0ZXIgPSBfYWxsb3dlZFByb3RvY29scy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCVN0cmluZyBwcm90b2NvbCA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotCQkJaWYgKCFhbGxvd2VkUHJvdG9jb2xzLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWlmKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJCWFsbG93ZWRQcm90b2NvbHMgKz0gIiwgIjsgLy8kTk9OLU5MUy0xJAotCQkJCX0gZWxzZSB7Ci0JCQkJCWFsbG93ZWRQcm90b2NvbHMgKz0gIiBvciAiOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQkJYWxsb3dlZFByb3RvY29scyArPSBwcm90b2NvbDsJCQkKLQkJfQotCi0JCXJldHVybiBmb3JtYXRTdHJpbmcocGF0dGVybiwgYWxsb3dlZFByb3RvY29scyk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQYXR0ZXJuKFN0cmluZyBvdmVycmlkZSwgU3RyaW5nIGtleSwgTG9jYWxlIGxvY2FsZSkgewotCQlpZiAob3ZlcnJpZGUgIT0gbnVsbCkKLQkJCXJldHVybiBvdmVycmlkZTsKLQotCQlSZXNvdXJjZUJ1bmRsZSBzdHJpbmdzOwotCQlTdHJpbmcgc3RyaW5nOwotCQl0cnkgewotCQkJCXN0cmluZ3MgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoIm5ldC5zZi5jZW5kaWwudGFwZXN0cnkudmFsaWQuVmFsaWRhdGlvblN0cmluZ3MiLCAvLyROT04tTkxTLTEkCi0JbG9jYWxlKTsKLQkJCXN0cmluZyA9IHN0cmluZ3MuZ2V0U3RyaW5nKGtleSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleGMpIHsKLQkJCQlzdHJpbmdzID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJvcmcuYXBhY2hlLnRhcGVzdHJ5LnZhbGlkLlZhbGlkYXRpb25TdHJpbmdzIiwgLy8kTk9OLU5MUy0xJAotCWxvY2FsZSk7Ci0JCQlzdHJpbmcgPSBzdHJpbmdzLmdldFN0cmluZyhrZXkpOwotCQl9Ci0KLQkJcmV0dXJuIHN0cmluZzsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcHJvdG9jb2xzIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIGFsbG93ZWQgcHJvdG9jb2xzCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWxsb3dlZFByb3RvY29scyhTdHJpbmcgcHJvdG9jb2xzKSB7Ci0JCVN0cmluZ1NwbGl0dGVyIHNwbGl0ZXIgPSBuZXcgU3RyaW5nU3BsaXR0ZXIoJywnKTsKLQkJLy9TdHJpbmdbXSBhUHJvdG9jb2xzID0gcHJvdG9jb2xzLnNwbGl0KCIsIik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nW10gYVByb3RvY29scyA9IHNwbGl0ZXIuc3BsaXRUb0FycmF5KHByb3RvY29scyk7IC8vJE5PTi1OTFMtMSQKLQkJX2FsbG93ZWRQcm90b2NvbHMgPSBuZXcgVmVjdG9yKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYVByb3RvY29scy5sZW5ndGg7IGkrKykgewotCQkJX2FsbG93ZWRQcm90b2NvbHMuYWRkKGFQcm90b2NvbHNbaV0pOwotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3ZhbGlkL1VybFZhbGlkYXRvci5zY3JpcHQgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdmFsaWQvVXJsVmFsaWRhdG9yLnNjcmlwdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc5NWQzZC4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdmFsaWQvVXJsVmFsaWRhdG9yLnNjcmlwdAorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCFET0NUWVBFIHNjcmlwdAotCVBVQkxJQyAiLS8vQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24vL1RhcGVzdHJ5IFNjcmlwdCBTcGVjaWZpY2F0aW9uIDMuMC8vRU4iCi0JImh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvdGFwZXN0cnkvZHRkL1NjcmlwdF8zXzAuZHRkIgotPgotCi0KLTwhLS0KLQlDcmVhdGVzIGEgc2NyaXB0IGZvciB2YWxpZGF0aW5nIHRoYXQgYSBmaWVsZCBpcyByZXF1aXJlZCBhbmQvb3IgaGFzIGEgbWluaW11bQotCWZpZWxkIGxlbmd0aC4KLQotCUlucHV0IHN5bWJvbHM6Ci0JZmllbGQsIGZvcm0sIHZhbGlkYXRvcjogIEFzIG5vcm1hbCBmb3IgYSB2YWxpZGF0aW9uIHNjcmlwdC4KLQlyZXF1aXJlZE1lc3NhZ2U6IE1lc3NhZ2UgdG8gZGlzcGxheSBpZiB0aGUgZmllbGQgaXMgcmVxdWlyZWQgeWV0IGJsYW5rLgotCW1pbmltdW1MZW5ndGhNZXNzYWdlOiBNZXNzYWdlIHRvIGRpc3BsYXkgaWYgdGhlIGZpZWxkIGxlbmd0aCBpcyB0b28gc2hvcnQuCi0JdXJsRm9ybWF0TWVzc2FnZTogTWVzc2FnZSB0byBkaXNwbGF5IGlmIHRoZSBmaWVsZCB2YWx1ZSBpcyBub3QgYSB2YWxpZCBVUkwuCi0JdXJsUmVnZXhwUHJvdG9jb2xzOiBUaGUgcmVnZXhwIHRvIGNoZWNrIHRoYXQgdGhlIHByb3RvY29sIGlzIG9uZSBvZiB0aGUgYWxsb3dlZCBwcm90b2NvbHMuCi0JdXJsRGlzYWxsb3dlZFByb3RvY29sTWVzc2FnZTogTWVzc2FnZSB0byBkaXNwbGF5IGlmIHRoZSBmaWVsZCB2YWx1ZSBkb2VzIG5vdCB1c2UgYW4gYWxsb3dlZCBwcm90b2NvbC4KLQotLS0+Ci08c2NyaXB0PgotCi0JPGluY2x1ZGUtc2NyaXB0IHJlc291cmNlLXBhdGg9Ii9vcmcvYXBhY2hlL3RhcGVzdHJ5L3ZhbGlkL1ZhbGlkYXRvci5qcyIgLz4KLQotCTxpbnB1dC1zeW1ib2wga2V5PSJmaWVsZCIgY2xhc3M9Im9yZy5hcGFjaGUudGFwZXN0cnkudmFsaWQuVmFsaWRGaWVsZCIgcmVxdWlyZWQ9InllcyIgLz4KLQk8aW5wdXQtc3ltYm9sIGtleT0iZm9ybSIgY2xhc3M9Im9yZy5hcGFjaGUudGFwZXN0cnkuSUZvcm0iIHJlcXVpcmVkPSJ5ZXMiIC8+Ci0JPGlucHV0LXN5bWJvbCBrZXk9InZhbGlkYXRvciIgY2xhc3M9Im9yZy5hcGFjaGUudGFwZXN0cnkudmFsaWQuVXJsVmFsaWRhdG9yIiByZXF1aXJlZD0ieWVzIiAvPgotCTxpbnB1dC1zeW1ib2wga2V5PSJyZXF1aXJlZE1lc3NhZ2UiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIiAvPgotCTxpbnB1dC1zeW1ib2wga2V5PSJtaW5pbXVtTGVuZ3RoTWVzc2FnZSIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmciIC8+Ci0JPGlucHV0LXN5bWJvbCBrZXk9InVybEZvcm1hdE1lc3NhZ2UiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIiAvPgotCTxpbnB1dC1zeW1ib2wga2V5PSJ1cmxSZWdleHBQcm90b2NvbHMiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIiAvPgotCTxpbnB1dC1zeW1ib2wga2V5PSJ1cmxEaXNhbGxvd2VkUHJvdG9jb2xNZXNzYWdlIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZyIgLz4KLQotCTxsZXQga2V5PSJmdW5jdGlvbiIgdW5pcXVlPSJ5ZXMiPnZhbGlkYXRlXyR7ZmllbGQubmFtZX08L2xldD4KLQotCTxib2R5PgotCQlmdW5jdGlvbiAke2Z1bmN0aW9ufSgpIHsKLQkJCXZhciBmaWVsZCA9IGRvY3VtZW50LiR7Zm9ybS5uYW1lfS4ke2ZpZWxkLm5hbWV9OwotCQkJc3RyVmFsdWUgPSBmaWVsZC52YWx1ZS5yZXBsYWNlKC8gL2csIiIpOwotCQkJZmllbGQudmFsdWUgPSBzdHJWYWx1ZTsKLQotCQk8aWYgZXhwcmVzc2lvbj0idmFsaWRhdG9yLnJlcXVpcmVkIj4KLQkJCWlmIChzdHJWYWx1ZS5sZW5ndGggPT0gMCkKLQkJCQlyZXR1cm4gdmFsaWRhdG9yX2ludmFsaWRfZmllbGQoZmllbGQsICIke3JlcXVpcmVkTWVzc2FnZX0iKTsKLQkJPC9pZj4KLQotCQk8aWYtbm90IGV4cHJlc3Npb249InZhbGlkYXRvci5yZXF1aXJlZCI+Ci0JCQlpZiAoc3RyVmFsdWUubGVuZ3RoID09IDApCi0JCQkJcmV0dXJuIHRydWU7Ci0JCTwvaWYtbm90PgotCi0JCTxpZiBleHByZXNzaW9uPSJ2YWxpZGF0b3IubWluaW11bUxlbmd0aCI+Ci0JCQlpZiAoc3RyVmFsdWUubGVuZ3RoICZsdDsgJHt2YWxpZGF0b3IubWluaW11bUxlbmd0aH0pCi0JCQkJcmV0dXJuIHZhbGlkYXRvcl9pbnZhbGlkX2ZpZWxkKGZpZWxkLCAiJHttaW5pbXVtTGVuZ3RoTWVzc2FnZX0iKTsKLQkJPC9pZj4KLQotCQkJaWYoIXJlZ2V4cFRlc3RVcmwoc3RyVmFsdWUpKQotCQkJCXJldHVybiB2YWxpZGF0b3JfaW52YWxpZF9maWVsZChmaWVsZCwgIiR7dXJsRm9ybWF0TWVzc2FnZX0iKTsKLQotCQk8aWYgZXhwcmVzc2lvbj0ibnVsbCAhPSB1cmxSZWdleHBQcm90b2NvbHMiPgotCQkJdmFyIHByb3RvUmVnRXhwID0gJHt1cmxSZWdleHBQcm90b2NvbHN9OwotCQkJaWYoIXByb3RvUmVnRXhwLnRlc3Qoc3RyVmFsdWUpKQotCQkJCXJldHVybiB2YWxpZGF0b3JfaW52YWxpZF9maWVsZChmaWVsZCwgIiR7dXJsRGlzYWxsb3dlZFByb3RvY29sTWVzc2FnZX0iKTsKLQkJPC9pZj4KLQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQk8L2JvZHk+Ci0KLTwvc2NyaXB0PgpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3ZhbGlkL1ZhbGlkRmllbGQuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS92YWxpZC9WYWxpZEZpZWxkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhODViNjQuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3ZhbGlkL1ZhbGlkRmllbGQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NyArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS52YWxpZDsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUZvcm07Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JTWFya3VwV3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlcXVlc3RDeWNsZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LlRhcGVzdHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuZm9ybS5BYnN0cmFjdFRleHRGaWVsZDsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmZvcm0uRm9ybTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmZvcm0uSUZvcm1Db21wb25lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5odG1sLkJvZHk7Ci0KLS8qKgotICoKLSAqICBBIHtAbGluayBGb3JtfSBjb21wb25lbnQgdGhhdCBjcmVhdGVzIGEgdGV4dCBmaWVsZCB0aGF0Ci0gKiAgYWxsb3dzIGZvciB2YWxpZGF0aW9uIG9mIHVzZXIgaW5wdXQgYW5kIGNvbnZlcnNpb24gYmV0d2VlbiBzdHJpbmcgYW5kIG9iamVjdAotICogIHZhbHVlcy4gCi0gKiAKLSAqICBbPGEgaHJlZj0iLi4vLi4vLi4vLi4vLi4vQ29tcG9uZW50UmVmZXJlbmNlL1ZhbGlkRmllbGQuaHRtbCI+Q29tcG9uZW50IFJlZmVyZW5jZTwvYT5dCi0gKiAKLSAqICA8cD4gQSBWYWxpZGF0aW5nVGV4dEZpZWxkIHVzZXMgYW4ge0BsaW5rIElWYWxpZGF0aW9uRGVsZWdhdGV9IHRvIAotICogIHRyYWNrIGVycm9ycyBhbmQgYW4ge0BsaW5rIElWYWxpZGF0b3J9IHRvIGNvbnZlcnQgYmV0d2VlbiBzdHJpbmdzIGFuZCBvYmplY3RzCi0gKiAgKGFzIHdlbGwgYXMgcGVyZm9ybSB2YWxpZGF0aW9ucykuICBUaGUgdmFsaWRhdGlvbiBkZWxlZ2F0ZSBpcyBzaGFyZWQgYnkgYWxsIHZhbGlkYXRpbmcKLSAqICB0ZXh0IGZpZWxkcyBpbiBhIGZvcm0sIHRoZSB2YWxpZGF0b3IgbWF5IGJlIHNoYXJlZCBteSBtdWx0aXBsZSBlbGVtZW50cyBhcyBkZXNpcmVkLgotICoKLSAqICBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiAgQHZlcnNpb24gJElkJAotICoKLSAqKi8KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFZhbGlkRmllbGQgZXh0ZW5kcyBBYnN0cmFjdFRleHRGaWVsZCBpbXBsZW1lbnRzIElGb3JtQ29tcG9uZW50Ci17Ci0gICAgcHVibGljIGFic3RyYWN0IE9iamVjdCBnZXRWYWx1ZSgpOwotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFZhbHVlKE9iamVjdCB2YWx1ZSk7Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldERpc3BsYXlOYW1lKCk7Ci0KLSAgICAvKioKLSAgICAgKgotICAgICAqICBSZW5kZXJzIHRoZSBjb21wb25lbnQsIHdoaWNoIGludm9sdmVzIHRoZSB7QGxpbmsgSVZhbGlkYXRpb25EZWxlZ2F0ZSBkZWxlZ2F0ZX0uCi0gICAgICoKLSAgICAgKiAgPHA+RHVyaW5nIGEgcmVuZGVyLCB0aGUgPGVtPmZpcnN0PC9lbT4gZmllbGQgcmVuZGVyZWQgdGhhdCBpcyBlaXRoZXIKLSAgICAgKiAgaW4gZXJyb3IsIG9yIHJlcXVpcmVkIGJ1dCBudWxsIGdldHMgc3BlY2lhbCB0cmVhdG1lbnQuICBKYXZhU2NyaXB0IGlzIGFkZGVkCi0gICAgICogIHRvIHNlbGVjdCB0aGF0IGZpZWxkIChzdWNoIHRoYXQgdGhlIGN1cnNvciBqdW1wcyByaWdodCB0byB0aGUgZmllbGQgd2hlbiB0aGUKLSAgICAgKiAgcGFnZSBsb2FkcykuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwcm90ZWN0ZWQgdm9pZCByZW5kZXJDb21wb25lbnQoSU1hcmt1cFdyaXRlciB3cml0ZXIsIElSZXF1ZXN0Q3ljbGUgY3ljbGUpCi0gICAgewotICAgICAgICBJRm9ybSBmb3JtID0gZ2V0Rm9ybShjeWNsZSk7Ci0gICAgICAgIElWYWxpZGF0aW9uRGVsZWdhdGUgZGVsZWdhdGUgPSBmb3JtLmdldERlbGVnYXRlKCk7Ci0KLSAgICAgICAgaWYgKGRlbGVnYXRlID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIFRhcGVzdHJ5LmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgIlZhbGlkRmllbGQubm8tZGVsZWdhdGUiLAotICAgICAgICAgICAgICAgICAgICBnZXRFeHRlbmRlZElkKCksCi0gICAgICAgICAgICAgICAgICAgIGdldEZvcm0oKS5nZXRFeHRlbmRlZElkKCkpLAotICAgICAgICAgICAgICAgIHRoaXMsCi0gICAgICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgICAgICBudWxsKTsKLQotICAgICAgICBJVmFsaWRhdG9yIHZhbGlkYXRvciA9IGdldFZhbGlkYXRvcigpOwotCi0gICAgICAgIGlmICh2YWxpZGF0b3IgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IFRhcGVzdHJ5LmNyZWF0ZVJlcXVpcmVkUGFyYW1ldGVyRXhjZXB0aW9uKHRoaXMsICJ2YWxpZGF0b3IiKTsKLQotICAgICAgICBib29sZWFuIHJlbmRlcmluZyA9ICFjeWNsZS5pc1Jld2luZGluZygpOwotCi0gICAgICAgIGlmIChyZW5kZXJpbmcpCi0gICAgICAgICAgICBkZWxlZ2F0ZS53cml0ZVByZWZpeCh3cml0ZXIsIGN5Y2xlLCB0aGlzLCB2YWxpZGF0b3IpOwotCi0gICAgICAgIHN1cGVyLnJlbmRlckNvbXBvbmVudCh3cml0ZXIsIGN5Y2xlKTsKLQotICAgICAgICBpZiAocmVuZGVyaW5nKQotICAgICAgICAgICAgZGVsZWdhdGUud3JpdGVTdWZmaXgod3JpdGVyLCBjeWNsZSwgdGhpcywgdmFsaWRhdG9yKTsKLQotICAgICAgICAvLyBJZiByZW5kZXJpbmcgYW5kIHRoZXJlJ3MgZWl0aGVyIGFuIGVycm9yIGluIHRoZSBmaWVsZCwKLSAgICAgICAgLy8gdGhlbiB3ZSBtYXkgaGF2ZSBpZGVudGlmaWVkIHRoZSBkZWZhdWx0IGZpZWxkICh3aGljaCB3aWxsCi0gICAgICAgIC8vIGF1dG9tYXRpY2FsbHkgcmVjZWl2ZSBmb2N1cykuCi0KLSAgICAgICAgaWYgKHJlbmRlcmluZyAmJiBkZWxlZ2F0ZS5pc0luRXJyb3IoKSkKLSAgICAgICAgICAgIGFkZFNlbGVjdChjeWNsZSk7Ci0KLSAgICAgICAgLy8gVGhhdCdzIE9LLCBidXQgYW4gaWRlYWwgc2l0dWF0aW9uIHdvdWxkIGtub3cgYWJvdXQgbm9uLXZhbGlkYXRpbmcKLSAgICAgICAgLy8gdGV4dCBmaWVsZHMsIGFuZCBhbHNvIGJlIGFibGUgdG8gcHV0IHRoZSBjdXJzb3IgaW4gdGhlCi0gICAgICAgIC8vIGZpcnN0IGZpZWxkLCBwZXJpb2QgKGV2ZW4gaWYgdGhlcmUgYXJlIG5vIHJlcXVpcmVkIG9yIGVycm9yIGZpZWxkcykuCi0gICAgICAgIC8vIFN0aWxsLCB0aGlzIHByZXR0eSBtdWNoIHJvY2tzIQotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEludm9rZXMge0BsaW5rIElWYWxpZGF0aW9uRGVsZWdhdGUjd3JpdGVBdHRyaWJ1dGVzKElNYXJrdXBXcml0ZXIsSVJlcXVlc3RDeWNsZSwgSUZvcm1Db21wb25lbnQsSVZhbGlkYXRvcil9LgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHJvdGVjdGVkIHZvaWQgYmVmb3JlQ2xvc2VUYWcoSU1hcmt1cFdyaXRlciB3cml0ZXIsIElSZXF1ZXN0Q3ljbGUgY3ljbGUpCi0gICAgewotICAgICAgICBJVmFsaWRhdG9yIHZhbGlkYXRvciA9IGdldFZhbGlkYXRvcigpOwotCi0gICAgICAgIHZhbGlkYXRvci5yZW5kZXJWYWxpZGF0b3JDb250cmlidXRpb24odGhpcywgd3JpdGVyLCBjeWNsZSk7Ci0KLSAgICAgICAgZ2V0Rm9ybSgpLmdldERlbGVnYXRlKCkud3JpdGVBdHRyaWJ1dGVzKHdyaXRlciwgY3ljbGUsIHRoaXMsIHZhbGlkYXRvcik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFTEVDVEVEX0FUVFJJQlVURV9OQU1FID0KLSAgICAgICAgIm9yZy5hcGFjaGUudGFwZXN0cnkuY29tcG9uZW50Lmh0bWwudmFsaWQuU2VsZWN0ZWRGaWVsZFNldCI7Ci0KLSAgICAvKioKLSAgICAgKiAgQ3JlYXRlcyBKYXZhU2NyaXB0IHRvIHNldCB0aGUgY3Vyc29yIG9uIHRoZSBmaXJzdCByZXF1aXJlZCBvciBlcnJvcgotICAgICAqICBmaWVsZCBlbmNvdW50ZXJlZCB3aGlsZSByZW5kZXJpbmcuICBUaGlzIG9ubHkgd29ya3MgaWYgdGhlIHRleHQgZmllbGQKLSAgICAgKiAgaXMgd3JhcHBlZCBieSBhIHtAbGluayBCb2R5fSBjb21wb25lbnQgKHdoaWNoIGlzIGFsbW9zdCBhbHdheXMgdHJ1ZSkuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRTZWxlY3QoSVJlcXVlc3RDeWNsZSBjeWNsZSkKLSAgICB7Ci0gICAgICAgIC8vIElmIHNvbWUgb3RoZXIgZmllbGQgaGFzIHRha2VuIHRoZSBob25vcnMsIHRoZW4gbGV0IGl0LgotCi0gICAgICAgIGlmIChjeWNsZS5nZXRBdHRyaWJ1dGUoU0VMRUNURURfQVRUUklCVVRFX05BTUUpICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgQm9keSBib2R5ID0gQm9keS5nZXQoY3ljbGUpOwotCi0gICAgICAgIC8vIElmIG5vdCB3cmFwcGVkIGJ5IGEgQm9keSwgdGhlbiBkbyBub3RoaW5nLgotCi0gICAgICAgIGlmIChib2R5ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgSUZvcm0gZm9ybSA9IEZvcm0uZ2V0KGN5Y2xlKTsKLQotICAgICAgICBTdHJpbmcgZm9ybU5hbWUgPSBmb3JtLmdldE5hbWUoKTsKLSAgICAgICAgU3RyaW5nIHRleHRGaWVsZE5hbWUgPSBnZXROYW1lKCk7Ci0KLSAgICAgICAgU3RyaW5nIGZ1bGxOYW1lID0gImRvY3VtZW50LiIgKyBmb3JtTmFtZSArICIuIiArIHRleHRGaWVsZE5hbWU7Ci0KLSAgICAgICAgYm9keS5hZGRJbml0aWFsaXphdGlvblNjcmlwdChmdWxsTmFtZSArICIuZm9jdXMoKTsiKTsKLSAgICAgICAgYm9keS5hZGRJbml0aWFsaXphdGlvblNjcmlwdChmdWxsTmFtZSArICIuc2VsZWN0KCk7Iik7Ci0KLSAgICAgICAgLy8gUHV0IGEgbWFya2VyIGluLCBpbmRpY2F0aW5nIHRoYXQgdGhlIHNlbGVjdGVkIGZpZWxkIGlzIGtub3duLgotCi0gICAgICAgIGN5Y2xlLnNldEF0dHJpYnV0ZShTRUxFQ1RFRF9BVFRSSUJVVEVfTkFNRSwgQm9vbGVhbi5UUlVFKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHJlYWRWYWx1ZSgpCi0gICAgewotICAgICAgICBJVmFsaWRhdGlvbkRlbGVnYXRlIGRlbGVnYXRlID0gZ2V0Rm9ybSgpLmdldERlbGVnYXRlKCk7Ci0KLSAgICAgICAgaWYgKGRlbGVnYXRlLmlzSW5FcnJvcigpKQotICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldEZpZWxkSW5wdXRWYWx1ZSgpOwotCi0gICAgICAgIE9iamVjdCB2YWx1ZSA9IGdldFZhbHVlKCk7Ci0gICAgICAgIFN0cmluZyByZXN1bHQgPSBnZXRWYWxpZGF0b3IoKS50b1N0cmluZyh0aGlzLCB2YWx1ZSk7Ci0KLSAgICAgICAgaWYgKFRhcGVzdHJ5LmlzQmxhbmsocmVzdWx0KSAmJiBnZXRWYWxpZGF0b3IoKS5pc1JlcXVpcmVkKCkpCi0gICAgICAgICAgICBhZGRTZWxlY3QoZ2V0UGFnZSgpLmdldFJlcXVlc3RDeWNsZSgpKTsKLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZVZhbHVlKFN0cmluZyB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIE9iamVjdCBvYmplY3RWYWx1ZSA9IG51bGw7Ci0gICAgICAgIElWYWxpZGF0aW9uRGVsZWdhdGUgZGVsZWdhdGUgPSBnZXRGb3JtKCkuZ2V0RGVsZWdhdGUoKTsKLQotICAgICAgICBkZWxlZ2F0ZS5yZWNvcmRGaWVsZElucHV0VmFsdWUodmFsdWUpOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBvYmplY3RWYWx1ZSA9IGdldFZhbGlkYXRvcigpLnRvT2JqZWN0KHRoaXMsIHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVmFsaWRhdG9yRXhjZXB0aW9uIGV4KQotICAgICAgICB7Ci0gICAgICAgICAgICBkZWxlZ2F0ZS5yZWNvcmQoZXgpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgc2V0VmFsdWUob2JqZWN0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBhYnN0cmFjdCBJVmFsaWRhdG9yIGdldFZhbGlkYXRvcigpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS92YWxpZC9WYWxpZEZpZWxkLmp3YyBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS92YWxpZC9WYWxpZEZpZWxkLmp3YwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAxMTQ3Ni4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdmFsaWQvVmFsaWRGaWVsZC5qd2MKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gIAotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTwhLS0gJElkJCAtLT4KLTwhRE9DVFlQRSBjb21wb25lbnQtc3BlY2lmaWNhdGlvbiBQVUJMSUMgCi0gICItLy9BcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi8vVGFwZXN0cnkgU3BlY2lmaWNhdGlvbiAzLjAvL0VOIiAKLSAgImh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvdGFwZXN0cnkvZHRkL1RhcGVzdHJ5XzNfMC5kdGQiPgotCQotPGNvbXBvbmVudC1zcGVjaWZpY2F0aW9uIGNsYXNzPSJvcmcuYXBhY2hlLnRhcGVzdHJ5LnZhbGlkLlZhbGlkRmllbGQiIGFsbG93LWJvZHk9Im5vIj4KLQotICA8ZGVzY3JpcHRpb24+Ci0gIEEgdGV4dCBpbnB1dCBmaWVsZCB0aGF0IGNhbiB2YWxpZGF0ZSBpbnB1dC4KLSAgPC9kZXNjcmlwdGlvbj4KLQotICA8cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJqYXZhLmxhbmcuT2JqZWN0IiByZXF1aXJlZD0ieWVzIiBkaXJlY3Rpb249ImF1dG8iLz4KLSAgCi0gIDxwYXJhbWV0ZXIgbmFtZT0iZGlzYWJsZWQiIHR5cGU9ImJvb2xlYW4iIGRpcmVjdGlvbj0iaW4iLz4KLSAgCi0gIDxwYXJhbWV0ZXIgbmFtZT0iaGlkZGVuIiB0eXBlPSJib29sZWFuIiBkaXJlY3Rpb249ImluIi8+Ci0gICAgCi0gIDxwYXJhbWV0ZXIgbmFtZT0idmFsaWRhdG9yIiB0eXBlPSJvcmcuYXBhY2hlLnRhcGVzdHJ5LnZhbGlkLklWYWxpZGF0b3IiIHJlcXVpcmVkPSJ5ZXMiIGRpcmVjdGlvbj0iYXV0byI+Ci0gICAgPGRlc2NyaXB0aW9uPgotICAgIENvbnZlcnRzIHZhbHVlIHRvIGEgc3RyaW5nIGFuZCBwYXJzZXMgc3RyaW5ncyBiYWNrIGludG8gb2JqZWN0IHZhbHVlcy4KLSAgICA8L2Rlc2NyaXB0aW9uPgotICA8L3BhcmFtZXRlcj4KLSAgICAKLSAgPHBhcmFtZXRlciBuYW1lPSJkaXNwbGF5TmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgcmVxdWlyZWQ9InllcyIgZGlyZWN0aW9uPSJhdXRvIj4KLSAgICA8ZGVzY3JpcHRpb24+Ci0gICAgTmFtZSB1c2VkIGJ5IEZpZWxkTGFiZWwgYW5kIHdoZW4gZ2VuZXJhdGluZyB2YWxpZGF0aW9uIGVycm9yIG1lc3NhZ2VzLgotICAgIDwvZGVzY3JpcHRpb24+Ci0gIDwvcGFyYW1ldGVyPgotICAKLSAgPHJlc2VydmVkLXBhcmFtZXRlciBuYW1lPSJ0eXBlIi8+Ci0gIDxyZXNlcnZlZC1wYXJhbWV0ZXIgbmFtZT0idmFsdWUiLz4KLSAgPHJlc2VydmVkLXBhcmFtZXRlciBuYW1lPSJuYW1lIi8+Ci0KLSAgPHByb3BlcnR5LXNwZWNpZmljYXRpb24gbmFtZT0ibmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgotICA8cHJvcGVydHktc3BlY2lmaWNhdGlvbiBuYW1lPSJmb3JtIiB0eXBlPSJvcmcuYXBhY2hlLnRhcGVzdHJ5LklGb3JtIi8+Ci0gIAotPC9jb21wb25lbnQtc3BlY2lmaWNhdGlvbj4KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS92YWxpZC9WYWxpZGF0aW9uQ29uc3RyYWludC5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3ZhbGlkL1ZhbGlkYXRpb25Db25zdHJhaW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkYzAxNDYuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3ZhbGlkL1ZhbGlkYXRpb25Db25zdHJhaW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkudmFsaWQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5lbnVtLkVudW07Ci0KLS8qKgotICogIERlZmluZXMgYW4gZW51bWVyYXRpb24gb2YgZGlmZmVyZW50IHR5cGVzIG9mIHZhbGlkYXRpb24gY29uc3RyYWludHMKLSAqICB0aGF0IG1heSBiZSB2aW9sYXRlZC4KLSAqCi0gKiAgQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogIEB2ZXJzaW9uICRJZCQKLSAqIAotICoqLwotCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGlvbkNvbnN0cmFpbnQgZXh0ZW5kcyBFbnVtCi17Ci0gICAgLyoqCi0gICAgICogIEluZGljYXRlcyB0aGF0IG5vIHZhbHVlIChvciBhIHZhbHVlIGNvbnNpc3Rpbmcgb25seSBvZiB3aGl0ZSBzcGFjZSkgd2FzCi0gICAgICogIHByb3ZpZGVkIGZvciBhIGZpZWxkIHRoYXQgcmVxdWlyZXMgYSBub24tbnVsbCB2YWx1ZS4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVmFsaWRhdGlvbkNvbnN0cmFpbnQgUkVRVUlSRUQgPSBuZXcgVmFsaWRhdGlvbkNvbnN0cmFpbnQoIlJFUVVJUkVEIik7Ci0KLSAgICAvKioKLSAgICAgKiAgSW5kaWNhdGVzIHRoYXQgYSBub24tbnVsbCB2YWx1ZSB3YXMgcHJvdmlkZWQsIGJ1dCB0aGF0IChhZnRlciByZW1vdmluZwotICAgICAqICBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlKSwgdGhlIHZhbHVlIHdhcyBub3QgbG9uZyBlbm91Z2guCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFZhbGlkYXRpb25Db25zdHJhaW50IE1JTklNVU1fV0lEVEggPQotICAgICAgICBuZXcgVmFsaWRhdGlvbkNvbnN0cmFpbnQoIk1JTlVNVU1fV0lEVEgiKTsKLQotICAgIC8qKgotICAgICAqICBJbmRpY2F0ZXMgYSBnZW5lcmFsIGVycm9yIGluIGNvbnZlcnRpbmcgYSBTdHJpbmcgaW50byBhIERhdGUuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFZhbGlkYXRpb25Db25zdHJhaW50IERBVEVfRk9STUFUID0gbmV3IFZhbGlkYXRpb25Db25zdHJhaW50KCJEQVRFX0ZPUk1BVCIpOwotCi0gICAgLyoqCi0gICAgICogIEluZGljYXRlcyBhIGdlbmVyYWwgZXJyb3IgaW4gdGhlIGZvcm1hdCBvZiBhIHN0cmluZyB0aGF0IGlzCi0gICAgICogIHRvIGJlIGludGVycHJldGVkIGFzIGEgZW1haWwuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFZhbGlkYXRpb25Db25zdHJhaW50IEVNQUlMX0ZPUk1BVCA9Ci0gICAgICAgIG5ldyBWYWxpZGF0aW9uQ29uc3RyYWludCgiRU1BSUxfRk9STUFUIik7Ci0KLSAgICAvKioKLSAgICAgKiAgSW5kaWNhdGVzIGEgZ2VuZXJhbCBlcnJvciBpbiB0aGUgZm9ybWF0IG9mIGEgc3RyaW5nIHRoYXQgaXMKLSAgICAgKiAgdG8gYmUgaW50ZXJwcmV0ZWQgYXMgYSBudW1iZXIuCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFZhbGlkYXRpb25Db25zdHJhaW50IE5VTUJFUl9GT1JNQVQgPQotICAgICAgICBuZXcgVmFsaWRhdGlvbkNvbnN0cmFpbnQoIk5VTUJFUl9GT1JNQVQiKTsKLQotICAgIC8qKgotICAgICAqICBJbmRpY2F0ZXMgdGhhdCB0aGUgdmFsdWUgd2FzIHRvbyBzbWFsbCAoZm9yIGEgRGF0ZSwgdG9vIGVhcmx5KS4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVmFsaWRhdGlvbkNvbnN0cmFpbnQgVE9PX1NNQUxMID0gbmV3IFZhbGlkYXRpb25Db25zdHJhaW50KCJUT09fU01BTEwiKTsKLQotICAgIC8qKgotICAgICAqICBJbmRpY2F0ZXMgdGhhdCB0aGUgdmFsdWUgd2FzIHRvbyBsYXJnZSAoZm9yIGEgRGF0ZSwgdG9vIGxhdGUpLgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBWYWxpZGF0aW9uQ29uc3RyYWludCBUT09fTEFSR0UgPSBuZXcgVmFsaWRhdGlvbkNvbnN0cmFpbnQoIlRPT19MQVJHRSIpOwotCi0gICAgLyoqCi0gICAgICogIEluZGljYXRlcyBhbiBlcnJvciBpbiBhIHN0cmluZyB0aGF0IGRvZXMgbm90IGZ1bGZpbGwgYSBwYXR0ZXJuLgotICAgICAqIAotICAgICAqICBAc2luY2UgMy4wCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBWYWxpZGF0aW9uQ29uc3RyYWludCBQQVRURVJOX01JU01BVENIID0KLSAgICAgICAgbmV3IFZhbGlkYXRpb25Db25zdHJhaW50KCJQQVRURVJOX01JU01BVENIIik7Ci0KLSAgICAvKioKLSAgICAgKiAgSW5kaWNhdGVzIGEgY29uc2lzdGVuY3kgZXJyb3IsIHVzdWFsbHkgYmV0d2VlbiB0b28gZGlmZmVyZW50IGZpZWxkcy4KLSAgICAgKiAKLSAgICAgKiAgQHNpbmNlIDMuMAotICAgICAqIAotICAgICAqKi8KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVmFsaWRhdGlvbkNvbnN0cmFpbnQgQ09OU0lTVEVOQ1kgPSBuZXcgVmFsaWRhdGlvbkNvbnN0cmFpbnQoIkNPTlNJU1RFTkNZIik7Ci0KLQkvKioKLQkgKiAgSW5kaWNhdGVzIHRoYXQgYSBVUkwgaXMgbm90IG9mIHRoZSBjb3JyZWN0IGZvcm1hdAotCSAqIAotCSAqIEBzaW5jZSAzLjAKLQkgKi8KLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFZhbGlkYXRpb25Db25zdHJhaW50IFVSTF9GT1JNQVQgPSBuZXcgVmFsaWRhdGlvbkNvbnN0cmFpbnQoIlVSTF9GT1JNQVQiKTsKLQotCS8qKgotCSAqICBJbmRpY2F0ZXMgdGhhdCB0aGUgVVJMIGRvZXMgbm90IHVzZSBvbmUgb2YgdGhlIHNwZWNpZmllZCBwcm90b2NvbHMKLQkgKiAKLQkgKiBAc2luY2UgMy4wCi0JICovCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFZhbGlkYXRpb25Db25zdHJhaW50IERJU0FMTE9XRURfUFJPVE9DT0wgPSBuZXcgVmFsaWRhdGlvbkNvbnN0cmFpbnQoIkRJU0FMTE9XRURfUFJPVE9DT0wiKTsKLQotCi0KLQkvKioKLQkgKiAgUHJvdGVjdGVkIGNvbnN0cnVjdG9yLCB3aGljaCBhbGxvd3MgbmV3IGNvbnN0cmFpbnRzIHRvIGJlIGNyZWF0ZWQKLQkgKiAgYXMgc3ViY2xhc3Nlcy4KLQkgKiAKLQkgKiovCi0KLSAgICBwcm90ZWN0ZWQgVmFsaWRhdGlvbkNvbnN0cmFpbnQoU3RyaW5nIG5hbWUpCi0gICAgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdmFsaWQvVmFsaWRhdGlvbkRlbGVnYXRlLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdmFsaWQvVmFsaWRhdGlvbkRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiM2MwM2UuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3ZhbGlkL1ZhbGlkYXRpb25EZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYwICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LnZhbGlkOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklGb3JtOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSU1hcmt1cFdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZW5kZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVxdWVzdEN5Y2xlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuVGFwZXN0cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5mb3JtLklGb3JtQ29tcG9uZW50OwotCi0vKioKLSAqIEEgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgSVZhbGlkYXRpb25EZWxlZ2F0ZX10aGF0IGNhbiBiZSB1c2VkIGFzIGEgaGVscGVyIGJlYW4uIFRoaXMKLSAqIGNsYXNzIGlzIG9mdGVuIHN1YmNsYXNzZWQsIHR5cGljYWxseSB0byBvdmVycmlkZSBwcmVzZW50YXRpb24gZGV0YWlscy4KLSAqIAotICogQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcAotICogQHNpbmNlIDEuMC41Ci0gKi8KLQotcHVibGljIGNsYXNzIFZhbGlkYXRpb25EZWxlZ2F0ZSBpbXBsZW1lbnRzIElWYWxpZGF0aW9uRGVsZWdhdGUKLXsKLSAgICBwcml2YXRlIElGb3JtQ29tcG9uZW50IF9jdXJyZW50Q29tcG9uZW50OwotCi0gICAgLyoqCi0gICAgICogTGlzdCBvZiB7QGxpbmsgRmllbGRUcmFja2luZ30uCi0gICAgICovCi0gICAgcHJpdmF0ZSBMaXN0IF90cmFja2luZ3M7Ci0KLSAgICAvKioKLSAgICAgKiBBIE1hcCBvZiBNYXBzLCBrZXllZCBvbiB0aGUgbmFtZSBvZiB0aGUgRm9ybS4gRWFjaCBpbm5lciBtYXAgY29udGFpbnMgdGhlIHRyYWNraW5ncyBmb3Igb25lCi0gICAgICogZm9ybSwga2V5ZWQgb24gY29tcG9uZW50IG5hbWUuIENhcmUgbXVzdCBiZSB0YWtlbiwgYmVjYXVzZSB0aGUgaW5uZXIgTWFwIGlzIG5vdCBhbHdheXMKLSAgICAgKiBwcmVzZW50LgotICAgICAqIDxwPgotICAgICAqIEVhY2ggdWx0aW1hdGUge0BsaW5rIEZpZWxkVHJhY2tpbmd9b2JqZWN0IGlzIGFsc28gaW4gdGhlIF90cmFja2luZ3MgbGlzdC4KLSAgICAgKi8KLQotICAgIHByaXZhdGUgTWFwIF90cmFja2luZ01hcDsKLQotICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkKLSAgICB7Ci0gICAgICAgIF9jdXJyZW50Q29tcG9uZW50ID0gbnVsbDsKLSAgICAgICAgX3RyYWNraW5ncyA9IG51bGw7Ci0gICAgICAgIF90cmFja2luZ01hcCA9IG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2xlYXJFcnJvcnMoKQotICAgIHsKLSAgICAgICAgaWYgKF90cmFja2luZ3MgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBJdGVyYXRvciBpID0gKEl0ZXJhdG9yKSBfdHJhY2tpbmdzLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgRmllbGRUcmFja2luZyBmdCA9IChGaWVsZFRyYWNraW5nKSBpLm5leHQoKTsKLSAgICAgICAgICAgIGZ0LnNldEVycm9yUmVuZGVyZXIobnVsbCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJZiB0aGUgZm9ybSBjb21wb25lbnQgaXMgaW4gZXJyb3IsIHBsYWNlcyBhICZsdDtmb250IGNvbG9yPSJyZWQiJmx0OyBhcm91bmQgaXQuIE5vdGU6IHRoaXMKLSAgICAgKiB3aWxsIG9ubHkgd29yayBvbiB0aGUgcmVuZGVyIHBoYXNlIGFmdGVyIGEgcmV3aW5kLCBhbmQgd2lsbCBiZSBjb25mdXNlZCBpZiBjb21wb25lbnRzIGFyZQotICAgICAqIGluc2lkZSBhbnkga2luZCBvZiBsb29wLgotICAgICAqLwotCi0gICAgcHVibGljIHZvaWQgd3JpdGVMYWJlbFByZWZpeChJRm9ybUNvbXBvbmVudCBjb21wb25lbnQsIElNYXJrdXBXcml0ZXIgd3JpdGVyLCBJUmVxdWVzdEN5Y2xlIGN5Y2xlKQotICAgIHsKLSAgICAgICAgaWYgKGlzSW5FcnJvcihjb21wb25lbnQpKQotICAgICAgICB7Ci0gICAgICAgICAgICB3cml0ZXIuYmVnaW4oImZvbnQiKTsKLSAgICAgICAgICAgIHdyaXRlci5hdHRyaWJ1dGUoImNvbG9yIiwgInJlZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2xvc2VzIHRoZSAmbHQ7Zm9udCZndDsgZWxlbWVudCxzdGFydGVkIGJ5Ci0gICAgICoge0BsaW5rICN3cml0ZUxhYmVsUHJlZml4KElGb3JtQ29tcG9uZW50LElNYXJrdXBXcml0ZXIsSVJlcXVlc3RDeWNsZSl9LCBpZiB0aGUgZm9ybSBjb21wb25lbnQKLSAgICAgKiBpcyBpbiBlcnJvci4KLSAgICAgKi8KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlTGFiZWxTdWZmaXgoSUZvcm1Db21wb25lbnQgY29tcG9uZW50LCBJTWFya3VwV3JpdGVyIHdyaXRlciwgSVJlcXVlc3RDeWNsZSBjeWNsZSkKLSAgICB7Ci0gICAgICAgIGlmIChpc0luRXJyb3IoY29tcG9uZW50KSkKLSAgICAgICAgewotICAgICAgICAgICAgd3JpdGVyLmVuZCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUge0BsaW5rIElGaWVsZFRyYWNraW5nfWZvciB0aGUgY3VycmVudCBjb21wb25lbnQsIGlmIGFueS4gVGhlCi0gICAgICoge0BsaW5rIElGaWVsZFRyYWNraW5nfWlzIHVzdWFsbHkgY3JlYXRlZCBpbiB7QGxpbmsgI3JlY29yZChTdHJpbmcsIFZhbGlkYXRpb25Db25zdHJhaW50KX1vcgotICAgICAqIGluIHtAbGluayAjcmVjb3JkKElSZW5kZXIsIFZhbGlkYXRpb25Db25zdHJhaW50KX0uCi0gICAgICogPHA+Ci0gICAgICogQ29tcG9uZW50cyBtYXkgYmUgcmVuZGVyZWQgbXVsdGlwbGUgdGltZXMsIHdpdGggbXVsdGlwbGUgbmFtZXMgKHByb3ZpZGVkIGJ5IHRoZQotICAgICAqIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LmZvcm0uRm9ybX0sIGNhcmUgbXVzdCBiZSB0YWtlbiB0aGF0IHRoaXMgbWV0aG9kIGlzIGludm9rZWQKLSAgICAgKiA8ZW0+YWZ0ZXI8L2VtPiB0aGUgRm9ybSBoYXMgcHJvdmlkZWQgYSB1bmlxdWUge0BsaW5rIElGb3JtQ29tcG9uZW50I2dldE5hbWUoKX1mb3IgdGhlCi0gICAgICogY29tcG9uZW50LgotICAgICAqIAotICAgICAqIEBzZWUgI3NldEZvcm1Db21wb25lbnQoSUZvcm1Db21wb25lbnQpCi0gICAgICogQHJldHVybiB0aGUge0BsaW5rIEZpZWxkVHJhY2tpbmd9LCBvciBudWxsIGlmIHRoZSBmaWVsZCBoYXMgbm8gdHJhY2tpbmcuCi0gICAgICovCi0KLSAgICBwcm90ZWN0ZWQgRmllbGRUcmFja2luZyBnZXRDb21wb25lbnRUcmFja2luZygpCi0gICAgewotICAgICAgICBpZiAoX3RyYWNraW5nTWFwID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICBTdHJpbmcgZm9ybU5hbWUgPSBfY3VycmVudENvbXBvbmVudC5nZXRGb3JtKCkuZ2V0TmFtZSgpOwotCi0gICAgICAgIE1hcCBmb3JtTWFwID0gKE1hcCkgX3RyYWNraW5nTWFwLmdldChmb3JtTmFtZSk7Ci0KLSAgICAgICAgaWYgKGZvcm1NYXAgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIHJldHVybiAoRmllbGRUcmFja2luZykgZm9ybU1hcC5nZXQoX2N1cnJlbnRDb21wb25lbnQuZ2V0TmFtZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRGb3JtQ29tcG9uZW50KElGb3JtQ29tcG9uZW50IGNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIF9jdXJyZW50Q29tcG9uZW50ID0gY29tcG9uZW50OwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzSW5FcnJvcigpCi0gICAgewotICAgICAgICBJRmllbGRUcmFja2luZyB0cmFja2luZyA9IGdldENvbXBvbmVudFRyYWNraW5nKCk7Ci0KLSAgICAgICAgcmV0dXJuIHRyYWNraW5nICE9IG51bGwgJiYgdHJhY2tpbmcuaXNJbkVycm9yKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRGaWVsZElucHV0VmFsdWUoKQotICAgIHsKLSAgICAgICAgSUZpZWxkVHJhY2tpbmcgdHJhY2tpbmcgPSBnZXRDb21wb25lbnRUcmFja2luZygpOwotCi0gICAgICAgIHJldHVybiB0cmFja2luZyA9PSBudWxsID8gbnVsbCA6IHRyYWNraW5nLmdldElucHV0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbGwgdGhlIGZpZWxkIHRyYWNraW5ncyBhcyBhbiB1bm1vZGlmaWFibGUgTGlzdC4KLSAgICAgKi8KLQotICAgIHB1YmxpYyBMaXN0IGdldEZpZWxkVHJhY2tpbmcoKQotICAgIHsKLSAgICAgICAgaWYgKFRhcGVzdHJ5LnNpemUoX3RyYWNraW5ncykgPT0gMCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KF90cmFja2luZ3MpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkKLSAgICB7Ci0gICAgICAgIElGaWVsZFRyYWNraW5nIHRyYWNraW5nID0gZ2V0Q29tcG9uZW50VHJhY2tpbmcoKTsKLQotICAgICAgICBpZiAodHJhY2tpbmcgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgX3RyYWNraW5ncy5yZW1vdmUodHJhY2tpbmcpOwotCi0gICAgICAgICAgICBTdHJpbmcgZm9ybU5hbWUgPSB0cmFja2luZy5nZXRDb21wb25lbnQoKS5nZXRGb3JtKCkuZ2V0TmFtZSgpOwotCi0gICAgICAgICAgICBNYXAgZm9ybU1hcCA9IChNYXApIF90cmFja2luZ01hcC5nZXQoZm9ybU5hbWUpOwotCi0gICAgICAgICAgICBpZiAoZm9ybU1hcCAhPSBudWxsKQotICAgICAgICAgICAgICAgIGZvcm1NYXAucmVtb3ZlKHRyYWNraW5nLmdldEZpZWxkTmFtZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEludm9rZXMge0BsaW5rICNyZWNvcmQoU3RyaW5nLCBWYWxpZGF0aW9uQ29uc3RyYWludCl9LCBvcgotICAgICAqIHtAbGluayAjcmVjb3JkKElSZW5kZXIsIFZhbGlkYXRpb25Db25zdHJhaW50KX1pZiB0aGUKLSAgICAgKiB7QGxpbmsgVmFsaWRhdG9yRXhjZXB0aW9uI2dldEVycm9yUmVuZGVyZXIoKSBlcnJvciByZW5kZXJlciBwcm9wZXJ0eX1pcyBub3QgbnVsbC4KLSAgICAgKi8KLQotICAgIHB1YmxpYyB2b2lkIHJlY29yZChWYWxpZGF0b3JFeGNlcHRpb24gZXgpCi0gICAgewotICAgICAgICBJUmVuZGVyIGVycm9yUmVuZGVyZXIgPSBleC5nZXRFcnJvclJlbmRlcmVyKCk7Ci0KLSAgICAgICAgaWYgKGVycm9yUmVuZGVyZXIgPT0gbnVsbCkKLSAgICAgICAgICAgIHJlY29yZChleC5nZXRNZXNzYWdlKCksIGV4LmdldENvbnN0cmFpbnQoKSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJlY29yZChlcnJvclJlbmRlcmVyLCBleC5nZXRDb25zdHJhaW50KCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEludm9rZXMge0BsaW5rICNyZWNvcmQoSVJlbmRlciwgVmFsaWRhdGlvbkNvbnN0cmFpbnQpfSwgYWZ0ZXIgd3JhcHBpbmcgdGhlIG1lc3NhZ2UgcGFyYW1ldGVyCi0gICAgICogaW4gYSB7QGxpbmsgUmVuZGVyU3RyaW5nfS4KLSAgICAgKi8KLQotICAgIHB1YmxpYyB2b2lkIHJlY29yZChTdHJpbmcgbWVzc2FnZSwgVmFsaWRhdGlvbkNvbnN0cmFpbnQgY29uc3RyYWludCkKLSAgICB7Ci0gICAgICAgIHJlY29yZChuZXcgUmVuZGVyU3RyaW5nKG1lc3NhZ2UpLCBjb25zdHJhaW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWNvcmRzIGVycm9yIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgY29tcG9uZW50LCBvciByZWNvcmRzIHVuYXNzb2NpYXRlZAotICAgICAqICh3aXRoIGFueSBmaWVsZCkgZXJyb3JzLgotICAgICAqIDxwPgotICAgICAqIEN1cnJlbnRseSwgeW91IG1heSBoYXZlIGF0IG1vc3Qgb25lIGVycm9yIHBlciA8ZW0+ZmllbGQ8L2VtPiAobm90ZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuCi0gICAgICogZmllbGQgYW5kIGNvbXBvbmVudCksIGJ1dCBhbnkgbnVtYmVyIG9mIHVuYXNzb2NpYXRlZCBlcnJvcnMuCi0gICAgICogPHA+Ci0gICAgICogU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhlIGRlZmF1bHQgZXJyb3IgbWVzc2FnZSAoYmFzZWQgb24gb3RoZXIgZmFjdG9ycywgc3VjaCBhcyB0aGUgZmllbGQKLSAgICAgKiBhbmQgY29uc3RyYWludCkgYmVmb3JlIGludm9raW5nIHRoaXMgaW1wbGVtZW50YXRpb24uCi0gICAgICogCi0gICAgICogQHNpbmNlIDEuMC45Ci0gICAgICovCi0KLSAgICBwdWJsaWMgdm9pZCByZWNvcmQoSVJlbmRlciBlcnJvclJlbmRlcmVyLCBWYWxpZGF0aW9uQ29uc3RyYWludCBjb25zdHJhaW50KQotICAgIHsKLSAgICAgICAgRmllbGRUcmFja2luZyB0cmFja2luZyA9IGZpbmRDdXJyZW50VHJhY2tpbmcoKTsKLQotICAgICAgICAvLyBOb3RlIHRoYXQgcmVjb3JkaW5nIHR3byBlcnJvcnMgZm9yIHRoZSBzYW1lIGZpZWxkIGlzIG5vdCBhZHZpc2VkOyB0aGUKLSAgICAgICAgLy8gc2Vjb25kIHdpbGwgb3ZlcnJpZGUgdGhlIGZpcnN0LgotCi0gICAgICAgIHRyYWNraW5nLnNldEVycm9yUmVuZGVyZXIoZXJyb3JSZW5kZXJlcik7Ci0gICAgICAgIHRyYWNraW5nLnNldENvbnN0cmFpbnQoY29uc3RyYWludCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVjb3JkRmllbGRJbnB1dFZhbHVlKFN0cmluZyBpbnB1dCkKLSAgICB7Ci0gICAgICAgIEZpZWxkVHJhY2tpbmcgdHJhY2tpbmcgPSBmaW5kQ3VycmVudFRyYWNraW5nKCk7Ci0KLSAgICAgICAgdHJhY2tpbmcuc2V0SW5wdXQoaW5wdXQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZpbmRzIG9yIGNyZWF0ZXMgdGhlIGZpZWxkIHRyYWNraW5nIGZvciB0aGUge0BsaW5rICNzZXRGb3JtQ29tcG9uZW50KElGb3JtQ29tcG9uZW50KX1jdXJyZW50Ci0gICAgICogY29tcG9uZW50LiBJZiBubyBjdXJyZW50IGNvbXBvbmVudCwgYW4gdW5hc3NvY2lhdGVkIGVycm9yIGlzIGNyZWF0ZWQgYW5kIHJldHVybmVkLgotICAgICAqIAotICAgICAqIEBzaW5jZSAzLjAKLSAgICAgKi8KLQotICAgIHByb3RlY3RlZCBGaWVsZFRyYWNraW5nIGZpbmRDdXJyZW50VHJhY2tpbmcoKQotICAgIHsKLSAgICAgICAgRmllbGRUcmFja2luZyByZXN1bHQgPSBudWxsOwotCi0gICAgICAgIGlmIChfdHJhY2tpbmdzID09IG51bGwpCi0gICAgICAgICAgICBfdHJhY2tpbmdzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgICAgIGlmIChfdHJhY2tpbmdNYXAgPT0gbnVsbCkKLSAgICAgICAgICAgIF90cmFja2luZ01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICAgICAgaWYgKF9jdXJyZW50Q29tcG9uZW50ID09IG51bGwgfHwgX2N1cnJlbnRDb21wb25lbnQuZ2V0TmFtZSgpID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBGaWVsZFRyYWNraW5nKCk7Ci0KLSAgICAgICAgICAgIC8vIEFkZCBpdCB0byB0aGUgZmllbGQgdHJhY2tpbmdzLCBidXQgbm90IHRvIHRoZQotICAgICAgICAgICAgLy8gbWFwLgotCi0gICAgICAgICAgICBfdHJhY2tpbmdzLmFkZChyZXN1bHQpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0ID0gZ2V0Q29tcG9uZW50VHJhY2tpbmcoKTsKLQotICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZyBmb3JtTmFtZSA9IF9jdXJyZW50Q29tcG9uZW50LmdldEZvcm0oKS5nZXROYW1lKCk7Ci0KLSAgICAgICAgICAgICAgICBNYXAgZm9ybU1hcCA9IChNYXApIF90cmFja2luZ01hcC5nZXQoZm9ybU5hbWUpOwotCi0gICAgICAgICAgICAgICAgaWYgKGZvcm1NYXAgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZvcm1NYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICAgICAgICAgICAgICBfdHJhY2tpbmdNYXAucHV0KGZvcm1OYW1lLCBmb3JtTWFwKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBTdHJpbmcgZmllbGROYW1lID0gX2N1cnJlbnRDb21wb25lbnQuZ2V0TmFtZSgpOwotCi0gICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IEZpZWxkVHJhY2tpbmcoZmllbGROYW1lLCBfY3VycmVudENvbXBvbmVudCk7Ci0KLSAgICAgICAgICAgICAgICBfdHJhY2tpbmdzLmFkZChyZXN1bHQpOwotICAgICAgICAgICAgICAgIGZvcm1NYXAucHV0KGZpZWxkTmFtZSwgcmVzdWx0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRG9lcyBub3RoaW5nLiBPdmVycmlkZSBpbiBhIHN1YmNsYXNzIHRvIGRlY29yZWF0ZSBmaWVsZHMuCi0gICAgICovCi0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZVByZWZpeChJTWFya3VwV3JpdGVyIHdyaXRlciwgSVJlcXVlc3RDeWNsZSBjeWNsZSwgSUZvcm1Db21wb25lbnQgY29tcG9uZW50LAotICAgICAgICAgICAgSVZhbGlkYXRvciB2YWxpZGF0b3IpCi0gICAgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIERvZXMgbm90aGluZy4gT3ZlcnJpZGUgaW4gYSBzdWJjbGFzcyB0byBkZWNvcmF0ZSBmaWVsZHMuCi0gICAgICovCi0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUF0dHJpYnV0ZXMoSU1hcmt1cFdyaXRlciB3cml0ZXIsIElSZXF1ZXN0Q3ljbGUgY3ljbGUsCi0gICAgICAgICAgICBJRm9ybUNvbXBvbmVudCBjb21wb25lbnQsIElWYWxpZGF0b3IgdmFsaWRhdG9yKQotICAgIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uOyBpZiB0aGUgY3VycmVudCBmaWVsZCBpcyBpbiBlcnJvciwgdGhlbiBhIHN1ZmZpeCBpcyB3cml0dGVuLiBUaGUKLSAgICAgKiBzdWZmaXggaXM6IDxjb2RlPiZhbXA7bmJzcDsmbHQ7Zm9udCBjb2xvcj0icmVkIiZndDsqKiZsdDsvZm9udCZndDs8L2NvZGU+LgotICAgICAqLwotCi0gICAgcHVibGljIHZvaWQgd3JpdGVTdWZmaXgoSU1hcmt1cFdyaXRlciB3cml0ZXIsIElSZXF1ZXN0Q3ljbGUgY3ljbGUsIElGb3JtQ29tcG9uZW50IGNvbXBvbmVudCwKLSAgICAgICAgICAgIElWYWxpZGF0b3IgdmFsaWRhdG9yKQotICAgIHsKLSAgICAgICAgaWYgKGlzSW5FcnJvcigpKQotICAgICAgICB7Ci0gICAgICAgICAgICB3cml0ZXIucHJpbnRSYXcoIiZuYnNwOyIpOwotICAgICAgICAgICAgd3JpdGVyLmJlZ2luKCJmb250Iik7Ci0gICAgICAgICAgICB3cml0ZXIuYXR0cmlidXRlKCJjb2xvciIsICJyZWQiKTsKLSAgICAgICAgICAgIHdyaXRlci5wcmludCgiKioiKTsKLSAgICAgICAgICAgIHdyaXRlci5lbmQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGdldEhhc0Vycm9ycygpCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0Rmlyc3RFcnJvcigpICE9IG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQSBjb252aWVuaWVuY2UsIGFzIG1vc3QgcGFnZXMganVzdCBzaG93IHRoZSBmaXJzdCBlcnJvciBvbiB0aGUgcGFnZS4KLSAgICAgKiA8cD4KLSAgICAgKiBBcyBvZiByZWxlYXNlIDEuMC45LCB0aGlzIHJldHVybnMgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIElSZW5kZXJ9LCBub3QgYSB7QGxpbmsgU3RyaW5nfS4KLSAgICAgKi8KLQotICAgIHB1YmxpYyBJUmVuZGVyIGdldEZpcnN0RXJyb3IoKQotICAgIHsKLSAgICAgICAgaWYgKFRhcGVzdHJ5LnNpemUoX3RyYWNraW5ncykgPT0gMCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIEl0ZXJhdG9yIGkgPSBfdHJhY2tpbmdzLml0ZXJhdG9yKCk7Ci0KLSAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBJRmllbGRUcmFja2luZyB0cmFja2luZyA9IChJRmllbGRUcmFja2luZykgaS5uZXh0KCk7Ci0KLSAgICAgICAgICAgIGlmICh0cmFja2luZy5pc0luRXJyb3IoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJhY2tpbmcuZ2V0RXJyb3JSZW5kZXJlcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIHRvIHNlZSBpZiB0aGUgZmllbGQgaXMgaW4gZXJyb3IuIFRoaXMgd2lsbCA8ZW0+bm90PC9lbT4gd29yayBwcm9wZXJseSBpbiBhIGxvb3AsIGJ1dAotICAgICAqIGlzIG9ubHkgdXNlZCBieSB7QGxpbmsgRmllbGRMYWJlbH0uIFRoZXJlZm9yZSwgdXNpbmcge0BsaW5rIEZpZWxkTGFiZWx9aW4gYSBsb29wICh3aGVyZSB0aGUKLSAgICAgKiB7QGxpbmsgSUZvcm1Db21wb25lbnR9aXMgcmVuZGVycmVkIG1vcmUgdGhhbiBvbmNlKSB3aWxsIG5vdCBwcm92aWRlIGNvcnJlY3QgcmVzdWx0cy4KLSAgICAgKi8KLQotICAgIHByb3RlY3RlZCBib29sZWFuIGlzSW5FcnJvcihJRm9ybUNvbXBvbmVudCBjb21wb25lbnQpCi0gICAgewotICAgICAgICBpZiAoX3RyYWNraW5nTWFwID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgSUZvcm0gZm9ybSA9IGNvbXBvbmVudC5nZXRGb3JtKCk7Ci0gICAgICAgIC8vIGlmIHRoZXJlIGlzIG5vIGZvcm0sIHRoZSBjb21wb25lbnQgY2Fubm90IGhhdmUgYmVlbiByZXdvdW5kIG9yIHJlbmRlcmVkIGludG8gYSBmb3JtIHlldAotICAgICAgICAvLyBzbyBhc3N1bWUgaXQgY2Fubm90IGhhdmUgZXJyb3JzLgotICAgICAgICBpZiAoZm9ybSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIFN0cmluZyBmb3JtTmFtZSA9IGZvcm0uZ2V0TmFtZSgpOwotICAgICAgICBNYXAgZm9ybU1hcCA9IChNYXApIF90cmFja2luZ01hcC5nZXQoZm9ybU5hbWUpOwotCi0gICAgICAgIGlmIChmb3JtTWFwID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgSUZpZWxkVHJhY2tpbmcgdHJhY2tpbmcgPSAoSUZpZWxkVHJhY2tpbmcpIGZvcm1NYXAuZ2V0KGNvbXBvbmVudC5nZXROYW1lKCkpOwotCi0gICAgICAgIHJldHVybiB0cmFja2luZyAhPSBudWxsICYmIHRyYWNraW5nLmlzSW5FcnJvcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSB7QGxpbmsgTGlzdH1vZiB7QGxpbmsgSUZpZWxkVHJhY2tpbmd9cy4gVGhpcyBpcyB0aGUgbWFzdGVyIGxpc3Qgb2YgdHJhY2tpbmdzLAotICAgICAqIGV4Y2VwdCB0aGF0IGl0IG9taXRzIGFuZCB0cmFja2luZ3MgdGhhdCBhcmUgbm90IGFzc29jaWF0ZWQgd2l0aCBhIHBhcnRpY3VsYXIgZmllbGQuIE1heQotICAgICAqIHJldHVybiBhbiBlbXB0eSBsaXN0LCBvciBudWxsLgotICAgICAqIDxwPgotICAgICAqIE9yZGVyIGlzIG5vdCBkZXRlcm1pbmVkLCB0aG91Z2ggaXQgaXMgbGlrZWx5IHRoZSBvcmRlciBpbiB3aGljaCBjb21wb25lbnRzIGFyZSBsYWlkIG91dCBvbiBpbgotICAgICAqIHRoZSB0ZW1wbGF0ZSAodGhpcyBpcyBzdWJqZWN0IHRvIGNoYW5nZSkuCi0gICAgICovCi0KLSAgICBwdWJsaWMgTGlzdCBnZXRBc3NvY2lhdGVkVHJhY2tpbmdzKCkKLSAgICB7Ci0gICAgICAgIGludCBjb3VudCA9IFRhcGVzdHJ5LnNpemUoX3RyYWNraW5ncyk7Ci0KLSAgICAgICAgaWYgKGNvdW50ID09IDApCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICBMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoY291bnQpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgSUZpZWxkVHJhY2tpbmcgdHJhY2tpbmcgPSAoSUZpZWxkVHJhY2tpbmcpIF90cmFja2luZ3MuZ2V0KGkpOwotCi0gICAgICAgICAgICBpZiAodHJhY2tpbmcuZ2V0RmllbGROYW1lKCkgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgICAgcmVzdWx0LmFkZCh0cmFja2luZyk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIExpa2Uge0BsaW5rICNnZXRBc3NvY2lhdGVkVHJhY2tpbmdzKCl9LCBidXQgcmV0dXJucyBvbmx5IHRoZSB1bmFzc29jaWF0ZWQgdHJhY2tpbmdzLgotICAgICAqIFVuYXNzb2NpYXRlZCB0cmFja2luZ3MgYXJlIG5ldyAoaW4gcmVsZWFzZSAxLjAuOSksIGFuZCBhcmUgd2h5IGludGVyZmFjZQotICAgICAqIHtAbGluayBJRmllbGRUcmFja2luZ31pcyBub3QgdmVyeSB3ZWxsIG5hbWVkLgotICAgICAqIDxwPgotICAgICAqIFRoZSB0cmFja2luZ3MgYXJlIHJldHVybmVkIGluIGFuIHVuc3BlY2lmaWVkIG9yZGVyLCB3aGljaCAoZm9yIHRoZSBtb21lbnQsIGFueXdheSkgaXMgdGhlCi0gICAgICogb3JkZXIgaW4gd2hpY2ggdGhleSB3ZXJlIGFkZGVkICh0aGlzIGNvdWxkIGNoYW5nZSBpbiB0aGUgZnV0dXJlLCBvciBiZWNvbWUgbW9yZSBjb25jcmV0ZSkuCi0gICAgICovCi0KLSAgICBwdWJsaWMgTGlzdCBnZXRVbmFzc29jaWF0ZWRUcmFja2luZ3MoKQotICAgIHsKLSAgICAgICAgaW50IGNvdW50ID0gVGFwZXN0cnkuc2l6ZShfdHJhY2tpbmdzKTsKLQotICAgICAgICBpZiAoY291bnQgPT0gMCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIExpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdChjb3VudCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBJRmllbGRUcmFja2luZyB0cmFja2luZyA9IChJRmllbGRUcmFja2luZykgX3RyYWNraW5ncy5nZXQoaSk7Ci0KLSAgICAgICAgICAgIGlmICh0cmFja2luZy5nZXRGaWVsZE5hbWUoKSAhPSBudWxsKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICByZXN1bHQuYWRkKHRyYWNraW5nKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUge0BsaW5rIElGaWVsZFRyYWNraW5nfWZvciB0aGUgY3VycmVudCBjb21wb25lbnQsIGlmIGFueS4gVXNlZnVsCi0gICAgICogd2hlbiBkaXNwbGF5aW5nIGVycm9yIG1lc3NhZ2VzIGZvciBpbmRpdmlkdWFsIGZpZWxkcy4KLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMy4wLjIKLSAgICAgKi8KLSAgICBwdWJsaWMgSUZpZWxkVHJhY2tpbmcgZ2V0Q3VycmVudEZpZWxkVHJhY2tpbmcoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldENvbXBvbmVudFRyYWNraW5nKCk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS92YWxpZC9WYWxpZGF0aW9uU3RyaW5ncy5wcm9wZXJ0aWVzIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3ZhbGlkL1ZhbGlkYXRpb25TdHJpbmdzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzMDA3YmQuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3ZhbGlkL1ZhbGlkYXRpb25TdHJpbmdzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jICRJZCQKLQotZmllbGQtaXMtcmVxdWlyZWQ9WW91IG11c3QgZW50ZXIgYSB2YWx1ZSBmb3IgezB9LgotZmllbGQtdG9vLXNob3J0PVlvdSBtdXN0IGVudGVyIGF0IGxlYXN0IHswfSBjaGFyYWN0ZXJzIGZvciB7MX0uCi0KLWludmFsaWQtZGF0ZS1mb3JtYXQ9SW52YWxpZCBkYXRlIGZvcm1hdCBmb3IgezB9LiAgRm9ybWF0IGlzIHsxfS4KLWludmFsaWQtaW50LWZvcm1hdD17MH0gbXVzdCBiZSBhbiBpbnRlZ2VyIHZhbHVlLgotaW52YWxpZC1mb3JtYXQ9ezB9IGlzIG5vdCBpbiBhIHJlY29nbml6ZWQgZm9ybWF0LgotaW52YWxpZC1udW1lcmljLWZvcm1hdD17MH0gbXVzdCBiZSBhIG51bWVyaWMgdmFsdWUuCi0KLWRhdGUtdG9vLWVhcmx5PXswfSBtdXN0IGJlIG9uIG9yIGFmdGVyIHsxfS4KLWRhdGUtdG9vLWxhdGU9ezB9IG11c3QgYmUgb24gb3IgYmVmb3JlIHsxfS4KLQotbnVtYmVyLXRvby1zbWFsbD17MH0gbXVzdCBub3QgYmUgc21hbGxlciB0aGFuIHsxfS4KLW51bWJlci10b28tbGFyZ2U9ezB9IG11c3Qgbm90IGJlIGxhcmdlciB0aGFuIHsxfS4KLQotbnVtYmVyLXJhbmdlPXswfSBtdXN0IGJlIGJldHdlZW4gezF9IGFuZCB7Mn0uCi0KLWludmFsaWQtZW1haWwtZm9ybWF0PUludmFsaWQgZW1haWwgZm9ybWF0IGZvciB7MH0uICBGb3JtYXQgaXMgdXNlckBob3N0bmFtZS4KLQotcGF0dGVybi1ub3QtbWF0Y2hlZD17MH0gZG9lcyBub3QgZnVsZmlsbCB0aGUgcmVxdWlyZWQgcGF0dGVybiB7MX0uCi0KLWludmFsaWQtdXJsLWZvcm1hdCA9IEludmFsaWQgVVJMLgotZGlzYWxsb3dlZC1wcm90b2NvbCA9IERpc2FsbG93ZWQgcHJvdG9jb2wgLSBwcm90b2NvbCBtdXN0IGJlIHswfS4KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS92YWxpZC9WYWxpZGF0aW9uU3RyaW5nc19kZS5wcm9wZXJ0aWVzIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3ZhbGlkL1ZhbGlkYXRpb25TdHJpbmdzX2RlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwYTQ2ODguLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3ZhbGlkL1ZhbGlkYXRpb25TdHJpbmdzX2RlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jICRJZCQKLQotZmllbGQtaXMtcmVxdWlyZWQ9RGFzIEVpbmdhYmVmZWxkICcnezB9JycgaXN0IGVpbiBQZmxpY2h0ZmVsZC4KLWZpZWxkLXRvby1zaG9ydD1TaWUgbfxzc2VuIG1pbmRlc3RlbnMgezB9IFplaWNoZW4gZvxyIGRhcyBFaW5nYWJlZmVsZCAnJ3sxfScnIGVpbmdlYmVuLgotCi1pbnZhbGlkLWRhdGUtZm9ybWF0PURhcyBFaW5nYWJlZmVsZCAnJ3swfScnIGhhdCBlaW4gZmFsc2NoZXMgRGF0dW1zZm9ybWF0IChFaW5nYWJlZm9ybWF0IGlzdCB7MX0pLgotaW52YWxpZC1pbnQtZm9ybWF0PURhcyBFaW5nYWJlZmVsZCAnJ3swfScnIGVyd2FydGV0IGVpbmVuIGdhbnp6YWhsaWdlbiBXZXJ0LgotaW52YWxpZC1mb3JtYXQ9RGFzIEVpbmdhYmVmZWxkICcnezB9JycgaGF0IG5pY2h0IGRhcyBnZXf8bnNjaHRlIEZvcm1hdC4KLWludmFsaWQtbnVtZXJpYy1mb3JtYXQ9RGFzIEVpbmdhYmVmZWxkICcnezB9JycgZXJ3YXJ0ZXQgZWluZW4gbnVtZXJpc2NoZW4gV2VydC4KLQotZGF0ZS10b28tZWFybHk9RGFzIERhdHVtIGb8ciBkYXMgRWluZ2FiZWZlbGQgJyd7MH0nJyBrYW5uIG51ciBkZXIgezF9IG9kZXIgc3DkdGVyIHNlaW4uCi1kYXRlLXRvby1sYXRlPURhcyBEYXR1bSBm/HIgZGFzIEVpbmdhYmVmZWxkICcnezB9Jycga2FubiBudXIgZGVyIHsxfSBvZGVyIGZy/GhlciBzZWluLgotCi1udW1iZXItdG9vLXNtYWxsPURlciBXZXJ0IGb8ciBkYXMgRWluZ2FiZWZlbGQgJyd7MH0nJyBkYXJmIG5pY2h0IGtsZWluZXIgYWxzIHsxfSBzZWluLgotbnVtYmVyLXRvby1sYXJnZT1EZXIgV2VydCBm/HIgZGFzIEVpbmdhYmVmZWxkICcnezB9JycgZGFyZiBuaWNodCBncvbfZXIgYWxzIHsxfSBzZWluLgotCi1udW1iZXItcmFuZ2U9RGVyIFdlcnQgZvxyIGRhcyBFaW5nYWJlZmVsZCAnJ3swfScnIGRhcmYgbnVyIHp3aXNjaGVuIHsxfSB1bmQgezJ9IGxpZWdlbi4KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS92YWxpZC9WYWxpZGF0aW9uU3RyaW5nc19lcy5wcm9wZXJ0aWVzIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3ZhbGlkL1ZhbGlkYXRpb25TdHJpbmdzX2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4ZTljNmQuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3ZhbGlkL1ZhbGlkYXRpb25TdHJpbmdzX2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jICRJZCQKLQotZmllbGQtaXMtcmVxdWlyZWQ9VGllbmUgcXVlIGluZ3Jlc2FyIHVuIHZhbG9yIHBhcmEgezB9LgotZmllbGQtdG9vLXNob3J0PVRpZW5lIHF1ZSBpbmdyZXNhciBhbCBtZW5vcyB7MH0gY2FyYWN0ZXJlcyBwYXJhIHsxfS4KLQotaW52YWxpZC1kYXRlLWZvcm1hdD1Gb3JtYXRvIGRlIGZlY2hhIG5vIHbhbGlkbyBwYXJhIHswfS4gIEVsIGZvcm1hdG8gZXMgezF9LgotaW52YWxpZC1pbnQtZm9ybWF0PXswfSB0aWVuZSBxdWUgc2VyIHVuIHZhbG9yIGVudGVyby4KLWludmFsaWQtZm9ybWF0PXswfSBubyBzZSBlbmN1ZW50cmEgZW4gdW4gZm9ybWF0byByZWNvbm9jaWRvLgotaW52YWxpZC1udW1lcmljLWZvcm1hdD17MH0gdGllbmUgcXVlIHNlciB1biB2YWxvciBudW3pcmljby4KLQotZGF0ZS10b28tZWFybHk9ezB9IHRpZW5lIHF1ZSBzZXIgYWN0dWFsIG8gZGVzcHXpcyBkZSB7MX0uCi1kYXRlLXRvby1sYXRlPXswfSB0aWVuZSBxdWUgc2VyIGFjdHVhbCBvIGFudGVzIGRlIHsxfS4KLQotbnVtYmVyLXRvby1zbWFsbD17MH0gbm8gcHVlZGUgc2VyIG1lbm9yIHF1ZSB7MX0uCi1udW1iZXItdG9vLWxhcmdlPXswfSBubyBwdWVkZSBzZXIgbWF5b3IgcXVlIHsxfS4KLQotbnVtYmVyLXJhbmdlPXswfSB0aWVuZSBxdWUgZXN0YXIgZW50cmUgezF9IHkgezJ9LgotCi1pbnZhbGlkLWVtYWlsLWZvcm1hdD1Gb3JtYXRvIGRlIGVtYWlsIGluduFsaWRvIHBhcmEgezB9LiAgRWwgZm9ybWF0byBlcyB1c3VhcmlvQHNlcnZpZG9yLgpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3ZhbGlkL1ZhbGlkYXRpb25TdHJpbmdzX2ZpLnByb3BlcnRpZXMgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdmFsaWQvVmFsaWRhdGlvblN0cmluZ3NfZmkucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQwZThjYy4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdmFsaWQvVmFsaWRhdGlvblN0cmluZ3NfZmkucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMgJElkJAotCi1maWVsZC1pcy1yZXF1aXJlZD1Bbm5hIHN59nRlIGtlbnR05ORuOiB7MH0uCi1maWVsZC10b28tc2hvcnQ9S2VudORuIHsxfSBhcnZvbiBtaW5pbWlwaXR1dXMgb24gezB9IG1lcmtraeQuCi0KLWludmFsaWQtZGF0ZS1mb3JtYXQ9S2VudORuIHswfSBw5Gl25G3k5HLkIG9uIHbk5HLk5CBtdW90b2EuIE11b3RvIG9uIHsxfS4KLWludmFsaWQtaW50LWZvcm1hdD1LZW505G4gezB9IGFydm9uIHBpdOTkIG9sbGEga29rb25haXNsdWt1LgotaW52YWxpZC1mb3JtYXQ9S2VudORuIHswfSBzefZ0ZSBvbiB25ORy5OQgbXVvdG9hLgotaW52YWxpZC1udW1lcmljLWZvcm1hdD1LZW505G4gezB9IGFydm9uIHBpdOTkIG9sbGEgbHVrdS4KLQotZGF0ZS10b28tZWFybHk9S2VudORuIHswfSBw5Gl25G3k5HLkIGVpIHNhYSBvbGxhIGVubmVuIHsxfS4KLWRhdGUtdG9vLWxhdGU9S2VudORuIHswfSBw5Gl25G3k5HLkIGVpIHNhYSBvbGxhIGrkbGtlZW4gezF9LgotCi1udW1iZXItdG9vLXNtYWxsPUtlbnTkbiB7MH0gYXJ2byBlaSBzYWEgb2xsYSBwaWVuZW1waSB7MX0uCi1udW1iZXItdG9vLWxhcmdlPUtlbnTkbiB7MH0gYXJ2byBlaSBzYWEgb2xsYSBzdXVyZW1waSBrdWluIHsxfS4KLQotbnVtYmVyLXJhbmdlPUtlbnTkbiB7MH0gYXJ2b24gdHVsZWUgb2xsYSB25GxpbGzkIHsxfS17Mn0uCi0KLWludmFsaWQtZW1haWwtZm9ybWF0PVPkaGv2cG9zdGlvc29pdGUga2VudORzc+QgezB9IG9uIHbk5HLk5CBtdW90b2EuIE11b3RvIG9uIHR1bm51c0Brb25lLmZpLgotCi1wYXR0ZXJuLW5vdC1tYXRjaGVkPUtlbnTkbiB7MH0gYXJ2byBlaSBvbGUgdmFhZGl0dXNzYSBtdW9kb3NzYSB7MX0uCi0KLWludmFsaWQtdXJsLWZvcm1hdCA9IFVSTCBvbiB25ORy5OQgbXVvdG9hLgotZGlzYWxsb3dlZC1wcm90b2NvbCA9IFByb3Rva29sbGEgZWkga2VscGFhIC0gcHJvdG9rb2xsYW4gcGl05OQgb2xsYSB7MH0uCmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdmFsaWQvVmFsaWRhdGlvblN0cmluZ3Nfc3YucHJvcGVydGllcyBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS92YWxpZC9WYWxpZGF0aW9uU3RyaW5nc19zdi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzA1OWYzLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS92YWxpZC9WYWxpZGF0aW9uU3RyaW5nc19zdi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIyAkSWQkCi0KLWZpZWxkLWlzLXJlcXVpcmVkPUR1IG3lc3RlIHNrcml2YSBpbiBldHQgduRyZGUgZvZyIHswfS4KLWZpZWxkLXRvby1zaG9ydD1EdSBt5XN0ZSBza3JpdmEgaW4gbWluc3QgezB9IHRlY2tlbiBm9nIgezF9LgotCi1pbnZhbGlkLWRhdGUtZm9ybWF0PU9naWxpdGlndCBkYXR1bWZvcm1hdCBm9nIgezB9LiBGb3JtYXRldCDkciB7MX0uCi1pbnZhbGlkLWludC1mb3JtYXQ9ezB9IG3lc3RlIHZhcmEgZXR0IGhlbHRhbHN25HJkZS4KLWludmFsaWQtZm9ybWF0PXswfSDkciBpbnRlIGkgZXR0IGvkbnQgZm9ybWF0LgotaW52YWxpZC1udW1lcmljLWZvcm1hdD17MH0gbeVzdGUgdmFyYSBldHQgbnVtZXJpc2t0IHbkcmRlLgotCi1kYXRlLXRvby1lYXJseT17MH0gbeVzdGUgdmFyYSBw5SBlbGxlciBlZnRlciB7MX0uCi1kYXRlLXRvby1sYXRlPXswfSBt5XN0ZSB2YXJhIHDlIGVsbGVyIGb2cmUgezF9LgotCi1udW1iZXItdG9vLXNtYWxsPXswfSBt5XN0ZSB2YXJhIG1pbmRyZSDkbiB7MX0uCi1udW1iZXItdG9vLWxhcmdlPXswfSBt5XN0ZSB2YXJhIHN09nJyZSDkbiB7MX0uCi0KLW51bWJlci1yYW5nZT17MH0gbeVzdGUgdmFyYSBtZWxsYW4gezF9IG9jaCB7Mn0uCi0KLWludmFsaWQtZW1haWwtZm9ybWF0PU9naWx0aWd0IGUtcG9zdCBhZGRyZXNzIGZvcm1hdCBm9nIgezB9LiBLb3JyZWt0IGZvcm1hdCDkciBhbnbkbmRhcmVAZG9t5G4uCi0KLXBhdHRlcm4tbm90LW1hdGNoZWQ9ezB9IHVwcGZ5bGxlciBpbnRlIGRldCD2bnNrYWRlIG32bnN0cmV0LiB7MX0uCi0KLWludmFsaWQtdXJsLWZvcm1hdD1PZ2lsdGlnIFVSTC4KLWRpc2FsbG93ZWQtcHJvdG9jb2w9UHJvdG9rb2xsZXQg5HIgaW50ZSB0aWxs5XRldCAtIGRldCBt5XN0ZSB2YXJhIHswfS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdmFsaWQvVmFsaWRhdGlvblN0cmluZ3NfemhfQ04ucHJvcGVydGllcyBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS92YWxpZC9WYWxpZGF0aW9uU3RyaW5nc196aF9DTi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmE4MjM5Li4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS92YWxpZC9WYWxpZGF0aW9uU3RyaW5nc196aF9DTi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotIyBDb3B5cmlnaHQgMjAwNSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotZmllbGQtaXMtcmVxdWlyZWQ9XHU4YmY3XHU4ZjkzXHU1MTY1ezB9XHU3Njg0XHU1MTg1XHU1YmI5XHUzMDAyCi1maWVsZC10b28tc2hvcnQ9ezF9XHU3Njg0XHU1MTg1XHU1YmI5XHU0ZTBkXHU4MGZkXHU1YzExXHU0ZThlezB9XHU1YjU3XHU3YjI2XHUzMDAyCi0KLWludmFsaWQtZGF0ZS1mb3JtYXQ9ezB9XHU3Njg0XHU2NWU1XHU2NzFmXHU2ODNjXHU1ZjBmXHU0ZTBkXHU2YjYzXHU3ODZlXHVmZjBjXHU2YjYzXHU3ODZlXHU2ODNjXHU1ZjBmXHU2NjJmezF9XHUzMDAyCi1pbnZhbGlkLWludC1mb3JtYXQ9ezB9XHU3Njg0XHU1MTg1XHU1YmI5XHU1ZmM1XHU5ODdiXHU2NjJmXHU2NTc0XHU2NTcwXHUzMDAyCi1pbnZhbGlkLWZvcm1hdD1cdTY1ZTBcdTZjZDVcdThiYzZcdTUyMmJ7MH1cdTc2ODRcdTY4M2NcdTVmMGZcdTMwMDIKLWludmFsaWQtbnVtZXJpYy1mb3JtYXQ9ezB9XHU3Njg0XHU1MTg1XHU1YmI5XHU1ZmM1XHU5ODdiXHU2NjJmXHU2NTcwXHU1YjU3XHUzMDAyCi0KLWRhdGUtdG9vLWVhcmx5PXswfVx1NzY4NFx1NjVlNVx1NjcxZlx1NWZjNVx1OTg3Ylx1NTcyOHsxfVx1NGU0Ylx1NTQwZVx1MzAwMgotZGF0ZS10b28tbGF0ZT17MH1cdTc2ODRcdTY1ZTVcdTY3MWZcdTVmYzVcdTk4N2JcdTU3Mjh7MX1cdTRlNGJcdTUyNGRcdTMwMDIKLQotbnVtYmVyLXRvby1zbWFsbD17MH1cdTc2ODRcdTY1NzBcdTUwM2NcdTRlMGRcdTgwZmRcdTVjMGZcdTRlOGV7MX1cdTMwMDIKLW51bWJlci10b28tbGFyZ2U9ezB9XHU3Njg0XHU2NTcwXHU1MDNjXHU0ZTBkXHU4MGZkXHU1OTI3XHU0ZThlezF9XHUzMDAyCi0KLW51bWJlci1yYW5nZT17MH1cdTc2ODRcdTY1NzBcdTUwM2NcdTVmYzVcdTk4N2JcdTU3Mjh7MX1cdTU0OGN7Mn1cdTRlNGJcdTk1ZjRcdTMwMDIKLQotaW52YWxpZC1lbWFpbC1mb3JtYXQ9XHU3NTM1XHU1YjUwXHU5MGFlXHU0ZWY2XHU1NzMwXHU1NzQwezB9XHU2ODNjXHU1ZjBmXHU0ZTBkXHU2YjYzXHU3ODZlXHVmZjBjXHU2YjYzXHU3ODZlXHU3Njg0XHU2ODNjXHU1ZjBmXHU2NjJmdXNlckBob3N0bmFtZVx1MzAwMgotCi1wYXR0ZXJuLW5vdC1tYXRjaGVkPXswfVx1NGUwZFx1N2IyNlx1NTQwOFx1NjI0MFx1ODk4MVx1NmM0Mlx1NzY4NFx1NjgzY1x1NWYwZnsxfVx1MzAwMgotCi1pbnZhbGlkLXVybC1mb3JtYXQgPSBcdTk1MTlcdThiZWZcdTc2ODRVUkxcdTMwMDIKLWRpc2FsbG93ZWQtcHJvdG9jb2wgPSBcdTRlMGRcdTg4YWJcdTUxNDFcdThiYjhcdTc2ODRcdTUzNGZcdThiYWVcdWZmMGNcdTVmYzVcdTk4N2JcdTY2MmZ7MH1cdTMwMDIKZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS92YWxpZC9WYWxpZGF0aW9uU3RyaW5nc196aF9UVy5wcm9wZXJ0aWVzIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3ZhbGlkL1ZhbGlkYXRpb25TdHJpbmdzX3poX1RXLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkZTllN2EuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3ZhbGlkL1ZhbGlkYXRpb25TdHJpbmdzX3poX1RXLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0jIENvcHlyaWdodCAyMDA1IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1maWVsZC1pcy1yZXF1aXJlZD1cdThhY2JcdThmMzhcdTUxNjV7MH1cdTZiMDRcdTRmNGRcdTc2ODRcdTUxNjdcdTViYjlcdTMwMDIKLWZpZWxkLXRvby1zaG9ydD17MX1cdTZiMDRcdTRmNGRcdTc2ODRcdTUxNjdcdTViYjlcdTRlMGRcdTgwZmRcdTVjMTFcdTY1YmN7MH1cdTViNTdcdTUxNDNcdTMwMDIKLQotaW52YWxpZC1kYXRlLWZvcm1hdD17MH1cdTZiMDRcdTRmNGRcdTc2ODRcdTY1ZTVcdTY3MWZcdTY4M2NcdTVmMGZcdTRlMGRcdTZiNjNcdTc4YmFcdWZmMGNcdTZiNjNcdTc4YmFcdTY4M2NcdTVmMGZcdTcwYmF7MX1cdTMwMDIKLWludmFsaWQtaW50LWZvcm1hdD17MH1cdTZiMDRcdTRmNGRcdTc2ODRcdTUxNjdcdTViYjlcdTVmYzVcdTk4MDhcdTY2MmZcdTY1NzRcdTY1NzhcdTMwMDIKLWludmFsaWQtZm9ybWF0PVx1NzEyMVx1NmNkNVx1OGZhOFx1OGE4ZHswfVx1NmIwNFx1NGY0ZFx1NzY4NFx1NjgzY1x1NWYwZlx1MzAwMgotaW52YWxpZC1udW1lcmljLWZvcm1hdD17MH1cdTZiMDRcdTRmNGRcdTc2ODRcdTUxNjdcdTViYjlcdTVmYzVcdTk4MDhcdTY2MmZcdTY1NzhcdTViNTdcdTMwMDIKLQotZGF0ZS10b28tZWFybHk9ezB9XHU2YjA0XHU0ZjRkXHU3Njg0XHU2NWU1XHU2NzFmXHU1ZmM1XHU5ODA4XHU1NzI4ezF9XHU0ZTRiXHU1ZjhjXHUzMDAyCi1kYXRlLXRvby1sYXRlPXswfVx1NmIwNFx1NGY0ZFx1NzY4NFx1NjVlNVx1NjcxZlx1NWZjNVx1OTgwOFx1NTcyOHsxfVx1NGU0Ylx1NTI0ZFx1MzAwMgotCi1udW1iZXItdG9vLXNtYWxsPXswfVx1NmIwNFx1NGY0ZFx1NzY4NFx1NjU3OFx1NWI1N1x1NGUwZFx1ODBmZFx1NWMwZlx1NjViY3sxfVx1MzAwMgotbnVtYmVyLXRvby1sYXJnZT17MH1cdTZiMDRcdTRmNGRcdTc2ODRcdTY1NzhcdTViNTdcdTRlMGRcdTgwZmRcdTU5MjdcdTY1YmN7MX1cdTMwMDIKLQotbnVtYmVyLXJhbmdlPXswfVx1NmIwNFx1NGY0ZFx1NzY4NFx1NjU3OFx1NWI1N1x1NWZjNVx1OTgwOFx1NTcyOHsxfVx1NTQ4Y3syfVx1NGU0Ylx1OTU5M1x1MzAwMgotCi1pbnZhbGlkLWVtYWlsLWZvcm1hdD1cdTk2ZmJcdTViNTBcdTkwZjVcdTRlZjZcdTU3MzBcdTU3NDB7MH1cdTY4M2NcdTVmMGZcdTkzMmZcdThhYTRcdWZmMGNcdTZiNjNcdTc4YmFcdTc2ODRcdTY4M2NcdTVmMGZcdTY2MmZ1c2VyQGhvc3RuYW1lXHUzMDAyCi0KLXBhdHRlcm4tbm90LW1hdGNoZWQ9ezB9XHU0ZTBkXHU3YjI2XHU1NDA4XHU2MjQwXHU4OTgxXHU2YzQyXHU3Njg0XHU2YTIzXHU1ZjBmezF9XHUzMDAyCi0KLWludmFsaWQtdXJsLWZvcm1hdCA9IFx1OTMyZlx1OGFhNFx1NzY4NFVSTFx1MzAwMgotZGlzYWxsb3dlZC1wcm90b2NvbCA9IFx1NGUwZFx1ODhhYlx1NTE0MVx1OGEzMVx1NzY4NFx1NTM1NFx1NWI5YVx1ZmYwY1x1NWZjNVx1OTgwOFx1NjYyZnswfVx1MzAwMgpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3ZhbGlkL1ZhbGlkYXRvci5qcyBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS92YWxpZC9WYWxpZGF0b3IuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1MDg0MzYuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3ZhbGlkL1ZhbGlkYXRvci5qcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8vICRJZDogVmFsaWRhdG9yLmpzLHYgMS4xIDIwMDIvMDkvMDcgMTM6MDM6MjQgaHNoaXAgRXhwICQNCi0vLw0KLS8vIFNpbXBsZSBmdW5jdGlvbnMgdG8gc3VwcG9ydCBpbnB1dCBmaWVsZCB2YWxpZGF0aW9uIGluIFRhcGVzdHJ5Lg0KLQ0KLWZ1bmN0aW9uIHZhbGlkYXRvcl9pbnZhbGlkX2ZpZWxkKGZpZWxkLCBtZXNzYWdlKQ0KLXsNCi0gIGZpZWxkLmZvY3VzKCk7DQotICBmaWVsZC5zZWxlY3QoKTsNCi0gIA0KLSAgd2luZG93LmFsZXJ0KG1lc3NhZ2UpOw0KLSAgDQotICByZXR1cm4gZmFsc2U7DQotfQ0KLQ0KLWZ1bmN0aW9uIHJlZ2V4cFRlc3RVcmwoc1VybCkgew0KLQl2YXIgcmVnZXhwID0gLyhmdHB8aHR0cHxodHRwcyk6XC9cLyhcdys6ezAsMX1cdypAKT8oXFMrKSg6WzAtOV0rKT8oXC98XC8oW1x3IyE6Lj8rPSYlQCFcLVwvXSkpPy8NCi0JcmV0dXJuIHJlZ2V4cC50ZXN0KHNVcmwpOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdmFsaWQvVmFsaWRhdG9yRXhjZXB0aW9uLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdmFsaWQvVmFsaWRhdG9yRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5ZjA2NDMuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3ZhbGlkL1ZhbGlkYXRvckV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkudmFsaWQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZW5kZXI7Ci0KLS8qKgotICogIFRocm93biBieSBhIHtAbGluayBJVmFsaWRhdG9yfSB3aGVuIHN1Ym1pdHRlZCBpbnB1dCBpcyBub3QgdmFsaWQuCi0gKgotICogIEBhdXRob3IgSG93YXJkIExld2lzIFNoaXAKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQHNpbmNlIDEuMC44Ci0gKgotICoqLwotCi1wdWJsaWMgY2xhc3MgVmFsaWRhdG9yRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uCi17Ci0gICAgcHJpdmF0ZSBJUmVuZGVyIF9lcnJvclJlbmRlcmVyOwotICAgIHByaXZhdGUgVmFsaWRhdGlvbkNvbnN0cmFpbnQgX2NvbnN0cmFpbnQ7Ci0KLSAgICBwdWJsaWMgVmFsaWRhdG9yRXhjZXB0aW9uKFN0cmluZyBlcnJvck1lc3NhZ2UpCi0gICAgewotICAgICAgICB0aGlzKGVycm9yTWVzc2FnZSwgbnVsbCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFZhbGlkYXRvckV4Y2VwdGlvbihTdHJpbmcgZXJyb3JNZXNzYWdlLCBWYWxpZGF0aW9uQ29uc3RyYWludCBjb25zdHJhaW50KQotICAgIHsKLSAgICAgICAgdGhpcyhlcnJvck1lc3NhZ2UsIG51bGwsIGNvbnN0cmFpbnQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotICAgICAqICBAcGFyYW0gZXJyb3JNZXNzYWdlIHRoZSBkZWZhdWx0IGVycm9yIG1lc3NhZ2UgdG8gYmUgdXNlZCAodGhpcyBtYXkgYmUKLSAgICAgKiAgb3ZlcnJpZGVuIGJ5IHRoZSB7QGxpbmsgSVZhbGlkYXRpb25EZWxlZ2F0ZX0pCi0gICAgICogIEBwYXJhbSBlcnJvclJlbmRlcmVyIHRvIHVzZSB0byByZW5kZXIgdGhlIGVycm9yIG1lc3NhZ2UgKG1heSBiZSBudWxsKQotICAgICAqICBAcGFyYW0gY29uc3RyYWludCBhIHZhbGlkYXRpb24gY29uc3RyYWludCB0aGF0IGhhcyBiZWVuIGNvbXByb21pc2VkLCBvcgotICAgICAqICBudWxsIGlmIG5vIGNvbnN0cmFpbnQgaXMgYXBwbGljYWJsZQotICAgICAqIAotICAgICAqKi8KLQotICAgIHB1YmxpYyBWYWxpZGF0b3JFeGNlcHRpb24oCi0gICAgICAgIFN0cmluZyBlcnJvck1lc3NhZ2UsCi0gICAgICAgIElSZW5kZXIgZXJyb3JSZW5kZXJlciwKLSAgICAgICAgVmFsaWRhdGlvbkNvbnN0cmFpbnQgY29uc3RyYWludCkKLSAgICB7Ci0gICAgICAgIHN1cGVyKGVycm9yTWVzc2FnZSk7Ci0KLSAgICAgICAgX2Vycm9yUmVuZGVyZXIgPSBlcnJvclJlbmRlcmVyOwotICAgICAgICBfY29uc3RyYWludCA9IGNvbnN0cmFpbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIFZhbGlkYXRpb25Db25zdHJhaW50IGdldENvbnN0cmFpbnQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9jb25zdHJhaW50OwotICAgIH0KLQotICAgIC8qKiBAc2luY2UgMy4wICoqLwotCi0gICAgcHVibGljIElSZW5kZXIgZ2V0RXJyb3JSZW5kZXJlcigpCi0gICAgewotICAgICAgICByZXR1cm4gX2Vycm9yUmVuZGVyZXI7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS92YWxpZC9wYWNrYWdlLmh0bWwgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvdmFsaWQvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODU4ZWRmLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS92YWxpZC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotCi08aHRtbD4KLTxib2R5PgotCi1Db21wb25lbnRzIGFuZCBjbGFzc2VzIHRoYXQgcHJvdmlkZSBzcGVjaWFsaXplZCwgdmFsaWRhdGluZyB0ZXh0IGZpZWxkcy4KLVRoZSBjb21wb25lbnQge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkudmFsaWQuVmFsaWRGaWVsZH0KLWRvZXMgbW9zdCBvZiB0aGUgd29yaywgYW5kIGlzIHBhaXJlZCB3aXRoIGFuIGltcGxlbWVudGF0aW9uIG9mCi17QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS52YWxpZC5JVmFsaWRhdG9yfSAob2Z0ZW4gYXMgYSBoZWxwZXIgYmVhbikKLXdoaWNoIHByb3ZpZGVzIHRoZSBydWxlcyBvZiB0cmFuc2xhdGlvbiAoYmV0d2VlbiBvYmplY3QgdmFsdWUgYW5kIHN0cmluZykgYW5kIHZhbGlkYXRpb24uCi0KLTxwPgotRmllbGRzIGNhbiBhbGwgYmUgc2V0IGFzIHJlcXVpcmVkIG9yIG5vdDsgbW9zdCBJVmFsaWRhdG9yIGltcGxlbWVudGF0aW9ucyBhZGQgYWRkaXRpb25hbAotdmFsaWRhdGlvbnMsIHN1Y2ggYXMgZml0dGluZyB0aGUgaW5wdXQgdmFsdWUgYmV0d2VlbiBhIG1pbmltdW0gYW5kIG1heGltdW0gdmFsdWUuCi0KLQotPHA+RmllbGRzIGNhbiBhbHNvIGhhdmUgYSB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS52YWxpZC5GaWVsZExhYmVsfSB0aGF0IHJlZmxlY3RzIHRoZSBzdGF0ZSAobm9ybWFsIG9yIGVycm9yKQotb2YgdGhlIGZpZWxkLgotCi1AYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwIDxhIGhyZWY9Im1haWx0bzpobHNoaXBAYXBhY2hlLm9yZyI+aGxzaGlwQGFwYWNoZS5vcmc8L2E+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS93bWwvQWJzdHJhY3RQb3N0ZmllbGQuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS93bWwvQWJzdHJhY3RQb3N0ZmllbGQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFkNjYxYS4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvd21sL0Fic3RyYWN0UG9zdGZpZWxkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkud21sOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5BcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JQmluZGluZzsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklGb3JtOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSU1hcmt1cFdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZXF1ZXN0Q3ljbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5UYXBlc3RyeTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmZvcm0uQWJzdHJhY3RGb3JtQ29tcG9uZW50OwotCi0vKioKLSAqICBBIGJhc2UgY2xhc3MgZm9yIGJ1aWxkaW5nIGNvbXBvbmVudHMgdGhhdCBjb3JyZXNwb25kIHRvIFdNTCBwb3N0ZmllbGQgZWxlbWVudHMuCi0gKiAgQWxsIHN1Y2ggY29tcG9uZW50cyBtdXN0IGJlIHdyYXBwZWQgKGRpcmVjdGx5IG9yIGluZGlyZWN0bHkpIGJ5Ci0gKiAgYSB7QGxpbmsgR299IGNvbXBvbmVudC4KLSAqCi0gKiAgQHZlcnNpb24gJElkJAotICogIEBhdXRob3IgRGF2aWQgU29saXMKLSAqICBAc2luY2UgMy4wCi0gKgotICoqLwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RQb3N0ZmllbGQgZXh0ZW5kcyBBYnN0cmFjdEZvcm1Db21wb25lbnQKLXsKLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIHRoZSB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS53bWwuR299IHdyYXBwaW5nIHRoaXMgY29tcG9uZW50LgotICAgICAqCi0gICAgICogIEB0aHJvd3MgIEFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbiBpZiB0aGUgY29tcG9uZW50IGlzIG5vdCB3cmFwcGVkIGJ5IGEKLSAgICAgKiB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS53bWwuR299LgotICAgICAqCi0gICAgICoqLwotCi0gICAgcHVibGljIElGb3JtIGdldEZvcm0oSVJlcXVlc3RDeWNsZSBjeWNsZSkKLSAgICB7Ci0gICAgICAgIElGb3JtIHJlc3VsdCA9IEdvLmdldChjeWNsZSk7Ci0KLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICBUYXBlc3RyeS5nZXRNZXNzYWdlKCJQb3N0ZmllbGQubXVzdC1iZS1jb250YWluZWQtYnktZ28iKSwKLSAgICAgICAgICAgICAgICB0aGlzLAotICAgICAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAgICAgbnVsbCk7Ci0KLSAgICAgICAgc2V0Rm9ybShyZXN1bHQpOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEBzZWUgb3JnLmFwYWNoZS50YXBlc3RyeS5BYnN0cmFjdENvbXBvbmVudCNyZW5kZXJDb21wb25lbnQoSU1hcmt1cFdyaXRlciwgSVJlcXVlc3RDeWNsZSkKLSAgICAgKiovCi0KLSAgICBwcm90ZWN0ZWQgdm9pZCByZW5kZXJDb21wb25lbnQoSU1hcmt1cFdyaXRlciB3cml0ZXIsIElSZXF1ZXN0Q3ljbGUgY3ljbGUpCi0gICAgewotICAgICAgICBJRm9ybSBmb3JtID0gZ2V0Rm9ybShjeWNsZSk7Ci0KLSAgICAgICAgYm9vbGVhbiByZXdpbmRpbmcgPSBmb3JtLmlzUmV3aW5kaW5nKCk7Ci0KLSAgICAgICAgaWYgKCFyZXdpbmRpbmcgJiYgY3ljbGUuaXNSZXdpbmRpbmcoKSkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBTdHJpbmcgbmFtZSA9IGZvcm0uZ2V0RWxlbWVudElkKHRoaXMpOwotCi0gICAgICAgIGlmIChyZXdpbmRpbmcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJld2luZChjeWNsZSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICB3cml0ZXIuYmVnaW5FbXB0eSgicG9zdGZpZWxkIik7Ci0KLSAgICAgICAgd3JpdGVyLmF0dHJpYnV0ZSgibmFtZSIsIG5hbWUpOwotICAgICAgICBTdHJpbmcgdmFyTmFtZSA9IGdldFZhck5hbWUoKTsKLSAgICAgICAgd3JpdGVyLmF0dHJpYnV0ZVJhdygidmFsdWUiLCB2YXJOYW1lICE9IG51bGwgPyBnZXRFbmNvZGVkVmFyTmFtZSh2YXJOYW1lKSA6ICIiKTsKLQotICAgICAgICByZW5kZXJJbmZvcm1hbFBhcmFtZXRlcnMod3JpdGVyLCBjeWNsZSk7Ci0KLSAgICAgICAgd3JpdGVyLmNsb3NlVGFnKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgcmV3aW5kKElSZXF1ZXN0Q3ljbGUgY3ljbGUpOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0RW5jb2RlZFZhck5hbWUoU3RyaW5nIHZhck5hbWUpCi0gICAgewotICAgICAgICByZXR1cm4gIiQoIiArIHZhck5hbWUgKyAiKSI7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNEaXNhYmxlZCgpCi0gICAgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRWYXJOYW1lKCk7Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgSUJpbmRpbmcgZ2V0VmFsdWVCaW5kaW5nKCk7Ci0KLSAgICBwdWJsaWMgdm9pZCB1cGRhdGVWYWx1ZShPYmplY3QgdmFsdWUpCi0gICAgewotICAgICAgICBnZXRWYWx1ZUJpbmRpbmcoKS5zZXRPYmplY3QodmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBhYnN0cmFjdCBJRm9ybSBnZXRGb3JtKCk7Ci0gICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0Rm9ybShJRm9ybSBmb3JtKTsKLQotICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0TmFtZSgpOwotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpOwotfQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3dtbC9DYXJkLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvd21sL0NhcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU3MzNmYS4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvd21sL0NhcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LndtbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuQWJzdHJhY3RDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5BcHBsaWNhdGlvblJ1bnRpbWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JTWFya3VwV3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlcXVlc3RDeWNsZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LlRhcGVzdHJ5OwotCi0vKioKLSAqICBBIGRlY2sgY29udGFpbnMgYSBjb2xsZWN0aW9uIG9mIGNhcmRzLiBUaGVyZSBpcyBhIHZhcmlldHkgb2YgY2FyZCB0eXBlcywgZWFjaCBzcGVjaWZ5aW5nIGEgZGlmZmVyZW50IG1vZGUgb2YKLSAqICB1c2VyIGludGVyYWN0aW9uLgotICoKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQGF1dGhvciBEYXZpZCBTb2xpcwotICogIEBzaW5jZSAzLjAKLSAqCi0gKiovCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDYXJkIGV4dGVuZHMgQWJzdHJhY3RDb21wb25lbnQKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX05BTUUgPSAib3JnLmFwYWNoZS50YXBlc3RyeS53bWwuQ2FyZCI7Ci0KLSAgICAvKioKLSAgICAgKiAgQHNlZSBBYnN0cmFjdENvbXBvbmVudCNyZW5kZXJDb21wb25lbnQoSU1hcmt1cFdyaXRlciwgSVJlcXVlc3RDeWNsZSkKLSAgICAgKiovCi0KLSAgICBwcm90ZWN0ZWQgdm9pZCByZW5kZXJDb21wb25lbnQoSU1hcmt1cFdyaXRlciB3cml0ZXIsIElSZXF1ZXN0Q3ljbGUgY3ljbGUpCi0gICAgewotICAgICAgICBpZiAoY3ljbGUuZ2V0QXR0cmlidXRlKEFUVFJJQlVURV9OQU1FKSAhPSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICBUYXBlc3RyeS5nZXRNZXNzYWdlKCJDYXJkLmNhcmRzLW1heS1ub3QtbmVzdCIpLAotICAgICAgICAgICAgICAgIHRoaXMsCi0gICAgICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgICAgICBudWxsKTsKLQotICAgICAgICBjeWNsZS5zZXRBdHRyaWJ1dGUoQVRUUklCVVRFX05BTUUsIHRoaXMpOwotCi0gICAgICAgIHdyaXRlci5iZWdpbigiY2FyZCIpOwotCi0gICAgICAgIFN0cmluZyB0aXRsZSA9IGdldFRpdGxlKCk7Ci0gICAgICAgIGlmIChUYXBlc3RyeS5pc05vbkJsYW5rKHRpdGxlKSkKLSAgICAgICAgICAgIHdyaXRlci5hdHRyaWJ1dGUoInRpdGxlIiwgdGl0bGUpOwotCi0gICAgICAgIHJlbmRlckluZm9ybWFsUGFyYW1ldGVycyh3cml0ZXIsIGN5Y2xlKTsKLQotICAgICAgICBJTWFya3VwV3JpdGVyIG5lc3RlZFdyaXRlciA9IHdyaXRlci5nZXROZXN0ZWRXcml0ZXIoKTsKLQotICAgICAgICByZW5kZXJCb2R5KG5lc3RlZFdyaXRlciwgY3ljbGUpOwotCi0gICAgICAgIG5lc3RlZFdyaXRlci5jbG9zZSgpOwotCi0gICAgICAgIHdyaXRlci5lbmQoKTsKLQotICAgICAgICBjeWNsZS5yZW1vdmVBdHRyaWJ1dGUoQVRUUklCVVRFX05BTUUpOwotICAgIH0KLQotICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0VGl0bGUoKTsKLX0KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS93bWwvQ2FyZC5qd2MgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvd21sL0NhcmQuandjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDExMDFhLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS93bWwvQ2FyZC5qd2MKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gIAotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTwhLS0gJElkJCAtLT4KLTwhRE9DVFlQRSBjb21wb25lbnQtc3BlY2lmaWNhdGlvbiBQVUJMSUMKLSAgIi0vL0FwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLy9UYXBlc3RyeSBTcGVjaWZpY2F0aW9uIDMuMC8vRU4iIAotICAiaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy90YXBlc3RyeS9kdGQvVGFwZXN0cnlfM18wLmR0ZCI+Ci0KLTxjb21wb25lbnQtc3BlY2lmaWNhdGlvbiBjbGFzcz0ib3JnLmFwYWNoZS50YXBlc3RyeS53bWwuQ2FyZCI+Ci0KLSAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgIEFuIFdNTCBkZWNrIGNvbnRhaW5zIGEgY29sbGVjdGlvbiBvZiBjYXJkcy4gVGhlcmUgaXMgYSB2YXJpZXR5IG9mIGNhcmQgdHlwZXMsIGVhY2ggc3BlY2lmeWluZyBhIGRpZmZlcmVudCBtb2RlCi0gICAgICAgIG9mIHVzZXIgaW50ZXJhY3Rpb24uCi0gICAgPC9kZXNjcmlwdGlvbj4KLQotICAgIDxwYXJhbWV0ZXIgbmFtZT0idGl0bGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciIGRpcmVjdGlvbj0iaW4iPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBUaGUgdGl0bGUgYXR0cmlidXRlIHNwZWNpZmllcyBhZHZpc29yeSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZWxlbWVudC4gVGhlIHRpdGxlIG1heSBiZSByZW5kZXJlZCBpbiBhCi0gICAgICAgICAgICB2YXJpZXR5IG9mIHdheXMgYnkgdGhlIHVzZXIgYWdlbnQgKGVnLCBzdWdnZXN0ZWQgYm9va21hcmsgbmFtZSwgcG9wLXVwIHRvb2x0aXAsIGV0Yy4pLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgIDwvcGFyYW1ldGVyPgotCi08L2NvbXBvbmVudC1zcGVjaWZpY2F0aW9uPgpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3dtbC9EZWNrLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvd21sL0RlY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY5ZGQ2Yi4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvd21sL0RlY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LndtbDsKLQotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5BYnN0cmFjdFBhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JTWFya3VwV3JpdGVyOwotCi0vKioKLSAqICBDb25jcmV0ZSBjbGFzcyBmb3IgV01MIGRlY2tzLiBNb3N0IGRlY2tzCi0gKiAgc2hvdWxkIGJlIGFibGUgdG8gc2ltcGx5IHN1YmNsYXNzIHRoaXMsIGFkZGluZyBuZXcgcHJvcGVydGllcyBhbmQKLSAqICBtZXRob2RzLiAgQW4gdW5saWtlbHkgZXhjZXB0aW9uIHdvdWxkIGJlIGEgZGVjayB0aGF0IHdhcyBub3QgYmFzZWQKLSAqICBvbiBhIHRlbXBsYXRlLgotICoKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQGF1dGhvciBEYXZpZCBTb2xpcwotICogIEBzaW5jZSAwLjIuOQotICogCi0gKiovCi0KLXB1YmxpYyBjbGFzcyBEZWNrIGV4dGVuZHMgQWJzdHJhY3RQYWdlCi17Ci0gICAgLyoqCi0gICAgICogIFJldHVybnMgYSBuZXcge0BsaW5rIFdNTFdyaXRlcn0uCi0gICAgICoKLSAgICAgKiovCi0gICAgcHVibGljIElNYXJrdXBXcml0ZXIgZ2V0UmVzcG9uc2VXcml0ZXIoT3V0cHV0U3RyZWFtIG91dCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgV01MV3JpdGVyKG91dCwgZ2V0T3V0cHV0RW5jb2RpbmcoKSk7Ci0gICAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3dtbC9Eby5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3dtbC9Eby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmZiZWQxLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS93bWwvRG8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LndtbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuQWJzdHJhY3RDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JTWFya3VwV3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlcXVlc3RDeWNsZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LlRhcGVzdHJ5OwotCi0vKioKLSAqICBUaGUgZG8gZWxlbWVudCBwcm92aWRlcyBhIGdlbmVyYWwgbWVjaGFuaXNtIGZvciB0aGUgdXNlciB0byBhY3QgdXBvbiB0aGUgY3VycmVudCBjYXJkLAotICogIGluIG90aGVyIHdvcmRzIGEgY2FyZC1sZXZlbCB1c2VyIGludGVyZmFjZSBlbGVtZW50LgotICogIFRoZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZG8gZWxlbWVudCBpcyB1c2VyIGFnZW50IGRlcGVuZGVudCBhbmQgdGhlIGF1dGhvciBtdXN0IG9ubHkgYXNzdW1lCi0gKiAgdGhhdCB0aGUgZWxlbWVudCBpcyBtYXBwZWQgdG8gYSB1bmlxdWUgdXNlciBpbnRlcmZhY2Ugd2lkZ2V0IHRoYXQgdGhlIHVzZXIgY2FuIGFjdGl2YXRlLgotICogIEZvciBleGFtcGxlLCB0aGUgd2lkZ2V0IG1hcHBpbmcgbWF5IGJlIHRvIGEgZ3JhcGhpY2FsbHkgcmVuZGVyZWQgYnV0dG9uLCBhIHNvZnQgb3IgZnVuY3Rpb24ga2V5LCBhIHZvaWNlLWFjdGl2YXRlZCBjb21tYW5kIHNlcXVlbmNlLCBvciBhbnkgb3RoZXIgaW50ZXJmYWNlIHRoYXQgaGFzIGEgc2ltcGxlICJhY3RpdmF0ZSIgb3BlcmF0aW9uIHdpdGggbm8gaW50ZXItb3BlcmF0aW9uIHBlcnNpc3RlbnQgc3RhdGUuCi0gKiAgVGhlIGRvIGVsZW1lbnQgbWF5IGFwcGVhciBhdCBib3RoIHRoZSBjYXJkIGFuZCBkZWNrLWxldmVsLgotICoKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQGF1dGhvciBEYXZpZCBTb2xpcwotICogIEBzaW5jZSAzLjAKLSAqCi0gKiovCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBEbyBleHRlbmRzIEFic3RyYWN0Q29tcG9uZW50Ci17Ci0gICAgLyoqCi0gICAgICogIEBzZWUgQWJzdHJhY3RDb21wb25lbnQjcmVuZGVyQ29tcG9uZW50KElNYXJrdXBXcml0ZXIsIElSZXF1ZXN0Q3ljbGUpCi0gICAgICoqLwotCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVuZGVyQ29tcG9uZW50KElNYXJrdXBXcml0ZXIgd3JpdGVyLCBJUmVxdWVzdEN5Y2xlIGN5Y2xlKQotICAgIHsKLSAgICAgICAgYm9vbGVhbiByZW5kZXIgPSAhY3ljbGUuaXNSZXdpbmRpbmcoKTsKLQotICAgICAgICBpZiAocmVuZGVyKQotICAgICAgICB7Ci0gICAgICAgICAgICB3cml0ZXIuYmVnaW4oImRvIik7Ci0KLSAgICAgICAgICAgIHdyaXRlci5hdHRyaWJ1dGUoInR5cGUiLCBnZXRUeXBlKCkpOwotCi0gICAgICAgICAgICBTdHJpbmcgbGFiZWwgPSBnZXRMYWJlbCgpOwotICAgICAgICAgICAgaWYgKFRhcGVzdHJ5LmlzTm9uQmxhbmsobGFiZWwpKQotICAgICAgICAgICAgICAgIHdyaXRlci5hdHRyaWJ1dGUoImxhYmVsIiwgbGFiZWwpOwotCi0gICAgICAgICAgICByZW5kZXJJbmZvcm1hbFBhcmFtZXRlcnMod3JpdGVyLCBjeWNsZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZW5kZXJCb2R5KHdyaXRlciwgY3ljbGUpOwotCi0gICAgICAgIGlmIChyZW5kZXIpCi0gICAgICAgICAgICB3cml0ZXIuZW5kKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRUeXBlKCk7Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldExhYmVsKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3dtbC9Eby5qd2MgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvd21sL0RvLmp3YwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjc5MmIwMy4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvd21sL0RvLmp3YworKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAgCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPCEtLSAkSWQkIC0tPgotPCFET0NUWVBFIGNvbXBvbmVudC1zcGVjaWZpY2F0aW9uIFBVQkxJQwotICAiLS8vQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24vL1RhcGVzdHJ5IFNwZWNpZmljYXRpb24gMy4wLy9FTiIgCi0gICJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL3RhcGVzdHJ5L2R0ZC9UYXBlc3RyeV8zXzAuZHRkIj4KLQotPGNvbXBvbmVudC1zcGVjaWZpY2F0aW9uIGNsYXNzPSJvcmcuYXBhY2hlLnRhcGVzdHJ5LndtbC5EbyI+Ci0KLSAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgIFRoZSBkbyBlbGVtZW50IHByb3ZpZGVzIGEgZ2VuZXJhbCBtZWNoYW5pc20gZm9yIHRoZSB1c2VyIHRvIGFjdCB1cG9uIHRoZSBjdXJyZW50IGNhcmQsIGkuZS4gYSBjYXJkLWxldmVsIHVzZXIKLSAgICAgICAgaW50ZXJmYWNlIGVsZW1lbnQuCi0gICAgPC9kZXNjcmlwdGlvbj4KLQotICAgIDxwYXJhbWV0ZXIgbmFtZT0idHlwZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgZGlyZWN0aW9uPSJpbiIgcmVxdWlyZWQ9InllcyIgPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBUaGUgZG8gZWxlbWVudCB0eXBlLiBUaGlzIGF0dHJpYnV0ZSBwcm92aWRlcyBhIGhpbnQgdG8gdGhlIHVzZXIgYWdlbnQgYWJvdXQgdGhlIGF1dGhvcidzIGludGVuZGVkIHVzZSBvZgotICAgICAgICAgICAgdGhlIGVsZW1lbnQgYW5kIGhvdyB0aGUgZWxlbWVudCBzaG91bGQgYmUgbWFwcGVkIHRvIGEgcGh5c2ljYWwgdXNlciBpbnRlcmZhY2UgY29uc3RydWN0LgotICAgICAgICAgICAgUHJlZGVmaW5lZCBETyB0eXBlcyBhcmUgYWNjZXB0LCBwcmV2LCBoZWxwLCByZXNldCwgb3B0aW9ucywgZGVsZXRlIGFuZCB1bmtvd24uCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgPC9wYXJhbWV0ZXI+Ci0KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImxhYmVsIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIiBkaXJlY3Rpb249ImluIj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgSWYgdGhlIHVzZXIgYWdlbnQgaXMgYWJsZSB0byBkeW5hbWljYWxseSBsYWJlbCB0aGUgdXNlciBpbnRlcmZhY2Ugd2lkZ2V0LCB0aGlzIGF0dHJpYnV0ZSBzcGVjaWZpZXMgYSB0ZXh0dWFsCi0gICAgICAgICAgICBzdHJpbmcgc3VpdGFibGUgZm9yIHN1Y2ggbGFiZWxsaW5nLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgIDwvcGFyYW1ldGVyPgotCi08L2NvbXBvbmVudC1zcGVjaWZpY2F0aW9uPgpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3dtbC9Hby5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3dtbC9Hby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTFjMGQ4Li4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS93bWwvR28uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LndtbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSU1hcmt1cFdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZXF1ZXN0Q3ljbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5UYXBlc3RyeTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmVuZ2luZS5JTGluazsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmZvcm0uRm9ybTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnZhbGlkLklWYWxpZGF0aW9uRGVsZWdhdGU7Ci0KLS8qKgotICogIFRoZSBnbyBlbGVtZW50IGRlY2xhcmVzIGEgZ28gdGFzaywgaW5kaWNhdGluZyBuYXZpZ2F0aW9uIHRvIGEgVVJJLiBJZiB0aGUgVVJJCi0gKiAgbmFtZXMgYSBXTUwgY2FyZCBvciBkZWNrLCBpdCBpcyBkaXNwbGF5ZWQuIAotICoKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQGF1dGhvciBEYXZpZCBTb2xpcwotICogIEBzaW5jZSAzLjAKLSAqCi0gKiovCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBHbyBleHRlbmRzIEZvcm0KLXsKLQotICAgIC8qKiBAc2luY2UgMy4wICoqLwotCi0gICAgcHJvdGVjdGVkIHZvaWQgd3JpdGVBdHRyaWJ1dGVzKElNYXJrdXBXcml0ZXIgd3JpdGVyLCBJTGluayBsaW5rKQotICAgIHsKLSAgICAgICAgU3RyaW5nIG1ldGhvZCA9IGdldE1ldGhvZCgpOwotCi0gICAgICAgIHdyaXRlci5iZWdpbihnZXRUYWcoKSk7Ci0gICAgICAgIHdyaXRlci5hdHRyaWJ1dGUoIm1ldGhvZCIsIChtZXRob2QgPT0gbnVsbCkgPyAicG9zdCIgOiBtZXRob2QpOwotICAgICAgICB3cml0ZXIuYXR0cmlidXRlKCJocmVmIiwgbGluay5nZXRVUkwobnVsbCwgZmFsc2UpKTsKLSAgICB9Ci0KLSAgICAvKiogQHNpbmNlIDMuMCAqKi8KLQotICAgIHByb3RlY3RlZCB2b2lkIHdyaXRlSGlkZGVuRmllbGQoSU1hcmt1cFdyaXRlciB3cml0ZXIsIFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpCi0gICAgewotICAgICAgICB3cml0ZXIuYmVnaW5FbXB0eSgicG9zdGZpZWxkIik7Ci0gICAgICAgIHdyaXRlci5hdHRyaWJ1dGUoIm5hbWUiLCBuYW1lKTsKLSAgICAgICAgd3JpdGVyLmF0dHJpYnV0ZSgidmFsdWUiLCB2YWx1ZSk7Ci0gICAgICAgIHdyaXRlci5wcmludGxuKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFRoaXMgY29tcG9uZW50IGRvZXNuJ3Qgc3VwcG9ydCBldmVudCBoYW5kbGVycy4KLSAgICAgKgotICAgICAqKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0RXZlbnRIYW5kbGVycyhJTWFya3VwV3JpdGVyIHdyaXRlciwgSVJlcXVlc3RDeWNsZSBjeWNsZSkKLSAgICB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFRoaXMgY29tcG9uZW50IGRvZXNuJ3Qgc3VwcG9ydCBkZWxlZ2F0ZS4KLSAgICAgKgotICAgICAqKi8KLSAgICBwdWJsaWMgSVZhbGlkYXRpb25EZWxlZ2F0ZSBnZXREZWxlZ2F0ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREZWxlZ2F0ZShJVmFsaWRhdGlvbkRlbGVnYXRlIGRlbGVnYXRlKQotICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAgIFRhcGVzdHJ5LmZvcm1hdCgidW5zdXBwb3J0ZWQtcHJvcGVydHkiLCB0aGlzLCAiZGVsZWdhdGUiKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRUYWcoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICJnbyI7Ci0gICAgfQotCi0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldERpc3BsYXlOYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAiR28iOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS93bWwvR28uandjIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3dtbC9Hby5qd2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNmJmOTYuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3dtbC9Hby5qd2MKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gIAotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTwhLS0gJElkJCAtLT4KLTwhRE9DVFlQRSBjb21wb25lbnQtc3BlY2lmaWNhdGlvbiBQVUJMSUMKLSAgIi0vL0FwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLy9UYXBlc3RyeSBTcGVjaWZpY2F0aW9uIDMuMC8vRU4iCi0gICJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL3RhcGVzdHJ5L2R0ZC9UYXBlc3RyeV8zXzAuZHRkIj4KLQotPGNvbXBvbmVudC1zcGVjaWZpY2F0aW9uIGNsYXNzPSJvcmcuYXBhY2hlLnRhcGVzdHJ5LndtbC5HbyI+Ci0KLSAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgIFRoZSBnbyBlbGVtZW50IGRlY2xhcmVzIGEgZ28gdGFzaywgaW5kaWNhdGluZyBuYXZpZ2F0aW9uIHRvIGEgVVJJLgotICAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgICA8cGFyYW1ldGVyIG5hbWU9Im1ldGhvZCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgZGlyZWN0aW9uPSJpbiI+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIFRoZSBtZXRob2QgdXNlZCBieSB0aGUgZm9ybSB3aGVuIGl0IGlzIHN1Ym1pdHRlZCwgZGVmYXVsdHMgdG8gUE9TVC4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICA8L3BhcmFtZXRlcj4KLQotICAgIDxwYXJhbWV0ZXIgbmFtZT0ibGlzdGVuZXIiIHR5cGU9Im9yZy5hcGFjaGUudGFwZXN0cnkuSUFjdGlvbkxpc3RlbmVyIiByZXF1aXJlZD0ibm8iIGRpcmVjdGlvbj0iaW4iPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBPYmplY3QgaW52b2tlZCB3aGVuIHRoZSBmb3JtIGlzIHN1Ym1pdHRlZCwgYWZ0ZXIgYWxsIGZvcm0gY29tcG9uZW50cyBoYXZlIHJlc3BvbmRlZAotICAgICAgICAgICAgdG8gdGhlIHN1Ym1pc3Npb24uCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgPC9wYXJhbWV0ZXI+Ci0KLSAgICA8cGFyYW1ldGVyIG5hbWU9InN0YXRlZnVsIiB0eXBlPSJib29sZWFuIiBkaXJlY3Rpb249ImN1c3RvbSI+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIElmIHRydWUgKHRoZSBkZWZhdWx0KSwgdGhlbiBhbiBhY3RpdmUgSHR0cFNlc3Npb24gaXMgcmVxdWlyZWQuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgPC9wYXJhbWV0ZXI+Ci0KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImRpcmVjdCIgdHlwZT0iYm9vbGVhbiIgZGlyZWN0aW9uPSJpbiI+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIElmIHRydWUgKHRoZSBkZWZhdWx0KSwgdGhlbiB0aGUgbW9yZSBlZmZpY2llbnQgZGlyZWN0IHNlcnZpY2UgaXMgdXNlZC4KLSAgICAgICAgICAgIElmIGZhbHNlLCB0aGVuIHRoZSBhY3Rpb24gc2VydmljZSBpcyB1c2VkLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgIDwvcGFyYW1ldGVyPgotCi0gICAgPHJlc2VydmVkLXBhcmFtZXRlciBuYW1lPSJocmVmIi8+Ci0KLTwvY29tcG9uZW50LXNwZWNpZmljYXRpb24+CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvd21sL0dvTGlua1JlbmRlcmVyLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvd21sL0dvTGlua1JlbmRlcmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhM2Y4M2IuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3dtbC9Hb0xpbmtSZW5kZXJlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkud21sOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5saW5rLkRlZmF1bHRMaW5rUmVuZGVyZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5saW5rLklMaW5rUmVuZGVyZXI7Ci0KLS8qKgotICogIEEgc3ViY2xhc3Mgb2Yge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkubGluay5EZWZhdWx0TGlua1JlbmRlcmVyfSBmb3IKLSAqICB0aGUgV01MIEdvIGVsZW1lbnQuCi0gKgotICogIEBhdXRob3IgRGF2aWQgU29saXMKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQHNpbmNlIDMuMAotICoqLwotcHVibGljIGNsYXNzIEdvTGlua1JlbmRlcmVyIGV4dGVuZHMgRGVmYXVsdExpbmtSZW5kZXJlcgotewotCi0JLyoqCi0JICogIEEgc2luZ2xldG9uIGZvciB0aGUgZ28gbGluay4gCi0JICoqLwotCi0JIHB1YmxpYyBzdGF0aWMgZmluYWwgSUxpbmtSZW5kZXJlciBTSEFSRURfSU5TVEFOQ0UgPSBuZXcgR29MaW5rUmVuZGVyZXIoKTsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudCgpCi0gICAgewotICAgICAgICByZXR1cm4gImdvIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRIYXNCb2R5KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvd21sL0ltYWdlLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvd21sL0ltYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2ZTZkZDkuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3dtbC9JbWFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkud21sOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5BYnN0cmFjdENvbXBvbmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklBc3NldDsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklNYXJrdXBXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVxdWVzdEN5Y2xlOwotCi0vKioKLSAqICBUaGUgSW1hZ2UgY29tcG9uZW50IGluZGljYXRlcyB0aGF0IGFuIGltYWdlIGlzIHRvIGJlIGluY2x1ZGVkIGluIHRoZSB0ZXh0IGZsb3cuIEltYWdlIGxheW91dCBpcyBkb25lIHdpdGhpbiB0aGUKLSAqICBjb250ZXh0IG9mIG5vcm1hbCB0ZXh0IGxheW91dC4KLSAqCi0gKiAgQHZlcnNpb24gJElkJAotICogIEBhdXRob3IgRGF2aWQgU29saXMKLSAqICBAc2luY2UgMy4wCi0gKgotICoqLwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSW1hZ2UgZXh0ZW5kcyBBYnN0cmFjdENvbXBvbmVudAotewotICAgIC8qKgotICAgICAqICBAc2VlIG9yZy5hcGFjaGUudGFwZXN0cnkuQWJzdHJhY3RDb21wb25lbnQjcmVuZGVyQ29tcG9uZW50KG9yZy5hcGFjaGUudGFwZXN0cnkuSU1hcmt1cFdyaXRlciwgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVxdWVzdEN5Y2xlKQotICAgICAqKi8KLQotICAgIHByb3RlY3RlZCB2b2lkIHJlbmRlckNvbXBvbmVudChJTWFya3VwV3JpdGVyIHdyaXRlciwgSVJlcXVlc3RDeWNsZSBjeWNsZSkKLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gcmVuZGVyID0gIWN5Y2xlLmlzUmV3aW5kaW5nKCk7Ci0KLSAgICAgICAgaWYgKHJlbmRlcikKLSAgICAgICAgewotICAgICAgICAgICAgd3JpdGVyLmJlZ2luRW1wdHkoImltZyIpOwotCi0gICAgICAgICAgICB3cml0ZXIuYXR0cmlidXRlKCJzcmMiLCBnZXRJbWFnZSgpLmJ1aWxkVVJMKGN5Y2xlKSk7Ci0KLSAgICAgICAgICAgIHdyaXRlci5hdHRyaWJ1dGUoImFsdCIsIGdldEFsdCgpKTsKLQotICAgICAgICAgICAgcmVuZGVySW5mb3JtYWxQYXJhbWV0ZXJzKHdyaXRlciwgY3ljbGUpOwotCi0gICAgICAgICAgICB3cml0ZXIuY2xvc2VUYWcoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBhYnN0cmFjdCBJQXNzZXQgZ2V0SW1hZ2UoKTsKLQotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0QWx0KCk7Ci19CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvd21sL0ltYWdlLmp3YyBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS93bWwvSW1hZ2UuandjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTdlNjdjLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS93bWwvSW1hZ2UuandjCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICAKLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08IS0tICRJZCQgLS0+Ci08IURPQ1RZUEUgY29tcG9uZW50LXNwZWNpZmljYXRpb24gUFVCTElDCi0gICItLy9BcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi8vVGFwZXN0cnkgU3BlY2lmaWNhdGlvbiAzLjAvL0VOIiAKLSAgImh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvdGFwZXN0cnkvZHRkL1RhcGVzdHJ5XzNfMC5kdGQiPgotCi08Y29tcG9uZW50LXNwZWNpZmljYXRpb24gY2xhc3M9Im9yZy5hcGFjaGUudGFwZXN0cnkud21sLkltYWdlIiBhbGxvdy1ib2R5PSJubyI+Ci0KLSAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgIERpc3BsYXlzIGEgd21sIGltYWdlLCBkZXJpdmluZyB0aGUgc291cmNlIFVSTCBmb3IgdGhlIGltYWdlIGZyb20gYW4gYXNzZXQuCi0gICAgPC9kZXNjcmlwdGlvbj4KLQotICAgIDxwYXJhbWV0ZXIgbmFtZT0iaW1hZ2UiIHR5cGU9Im9yZy5hcGFjaGUudGFwZXN0cnkuSUFzc2V0IiBkaXJlY3Rpb249ImluIiByZXF1aXJlZD0ieWVzIj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgVGhlIGFzc2V0IHRvIGRpc3BsYXkuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgPC9wYXJhbWV0ZXI+Ci0KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImFsdCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgZGlyZWN0aW9uPSJpbiIgcmVxdWlyZWQ9InllcyI+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIFRoaXMgYXR0cmlidXRlIHNwZWNpZmllcyBhbiBhbHRlcm5hdGl2ZSB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIGZvciB0aGUgaW1hZ2UuIFRoaXMgcmVwcmVzZW50YXRpb24gaXMgdXNlZAotICAgICAgICAgICAgd2hlbiB0aGUgaW1hZ2UgY2FuIG5vdCBiZSBkaXNwbGF5ZWQgdXNpbmcgYW55IG90aGVyIG1ldGhvZAotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgIDwvcGFyYW1ldGVyPgotCi0gICAgPHJlc2VydmVkLXBhcmFtZXRlciBuYW1lPSJzcmMiLz4KLQotPC9jb21wb25lbnQtc3BlY2lmaWNhdGlvbj4KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS93bWwvSW5wdXQuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS93bWwvSW5wdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJhODNjNS4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvd21sL0lucHV0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS53bWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LkFic3RyYWN0Q29tcG9uZW50OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUJpbmRpbmc7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JTWFya3VwV3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlcXVlc3RDeWNsZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LlRhcGVzdHJ5OwotCi0vKioKLSAqICBUaGUgSW5wdXQgZWxlbWVudCBzcGVjaWZpZXMgYSB0ZXh0IGVudHJ5IG9iamVjdC4KLSAqCi0gKiAgQHZlcnNpb24gJElkJAotICogIEBhdXRob3IgRGF2aWQgU29saXMKLSAqICBAc2luY2UgMy4wCi0gKgotICoqLwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSW5wdXQgZXh0ZW5kcyBBYnN0cmFjdENvbXBvbmVudAotewotCi0JLyoqCi0JICogIEBzZWUgQWJzdHJhY3RDb21wb25lbnQjcmVuZGVyQ29tcG9uZW50KElNYXJrdXBXcml0ZXIsIElSZXF1ZXN0Q3ljbGUpCi0JICoqLwotCi0JcHJvdGVjdGVkIHZvaWQgcmVuZGVyQ29tcG9uZW50KElNYXJrdXBXcml0ZXIgd3JpdGVyLCBJUmVxdWVzdEN5Y2xlIGN5Y2xlKQotCXsKLQkJYm9vbGVhbiByZW5kZXIgPSAhY3ljbGUuaXNSZXdpbmRpbmcoKTsKLQotCQlpZiAocmVuZGVyKQotCQl7Ci0JCQl3cml0ZXIuYmVnaW5FbXB0eSgiaW5wdXQiKTsKLQotCQkJd3JpdGVyLmF0dHJpYnV0ZSgidHlwZSIsIGlzSGlkZGVuKCkgPyAicGFzc3dvcmQiIDogInRleHQiKTsKLQotICAgICAgICAgICAgd3JpdGVyLmF0dHJpYnV0ZSgibmFtZSIsIGdldE5hbWUoKSk7Ci0KLQkJCVN0cmluZyB0aXRsZSA9IGdldFRpdGxlKCk7Ci0JCQlpZiAoVGFwZXN0cnkuaXNOb25CbGFuayh0aXRsZSkpCi0JCQkJd3JpdGVyLmF0dHJpYnV0ZSgidGl0bGUiLCB0aXRsZSk7Ci0KLQkJCVN0cmluZyBmb3JtYXQgPSBnZXRGb3JtYXQoKTsKLSAgICAgICAgICAgIGlmIChUYXBlc3RyeS5pc05vbkJsYW5rKGZvcm1hdCkpCi0JCQkJd3JpdGVyLmF0dHJpYnV0ZSgiZm9ybWF0IiwgZm9ybWF0KTsKLQotICAgICAgICAgICAgYm9vbGVhbiBlbXB0eW9rID0gaXNFbXB0eW9rKCk7Ci0gICAgICAgICAgICBpZiAoZW1wdHlvayAhPSBmYWxzZSkKLQkJCQl3cml0ZXIuYXR0cmlidXRlKCJlbXB0eW9rIiwgZW1wdHlvayk7Ci0KLQkJCXJlbmRlckluZm9ybWFsUGFyYW1ldGVycyh3cml0ZXIsIGN5Y2xlKTsKLQotCQkJU3RyaW5nIHZhbHVlID0gcmVhZFZhbHVlKCk7Ci0JCQlpZiAoVGFwZXN0cnkuaXNOb25CbGFuayh2YWx1ZSkpCi0JCQkJd3JpdGVyLmF0dHJpYnV0ZSgidmFsdWUiLCB2YWx1ZSk7Ci0KLQkJCXdyaXRlci5jbG9zZVRhZygpOwotCQl9Ci0JfQotCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRUaXRsZSgpOwotCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXROYW1lKCk7Ci0KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldEZvcm1hdCgpOwotCi0JcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNIaWRkZW4oKTsKLQotCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzRW1wdHlvaygpOwotCi0JcHVibGljIGFic3RyYWN0IElCaW5kaW5nIGdldFZhbHVlQmluZGluZygpOwotCi0JcHVibGljIFN0cmluZyByZWFkVmFsdWUoKQotICAgIHsKLQkJcmV0dXJuIGdldFZhbHVlQmluZGluZygpLmdldFN0cmluZygpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3dtbC9JbnB1dC5qd2MgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvd21sL0lucHV0Lmp3YwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZjNGM4OC4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvd21sL0lucHV0Lmp3YworKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAgCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPCEtLSAkSWQkIC0tPgotPCFET0NUWVBFIGNvbXBvbmVudC1zcGVjaWZpY2F0aW9uIFBVQkxJQwotICAiLS8vQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24vL1RhcGVzdHJ5IFNwZWNpZmljYXRpb24gMy4wLy9FTiIgCi0gICJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL3RhcGVzdHJ5L2R0ZC9UYXBlc3RyeV8zXzAuZHRkIj4KLQotPGNvbXBvbmVudC1zcGVjaWZpY2F0aW9uIGNsYXNzPSJvcmcuYXBhY2hlLnRhcGVzdHJ5LndtbC5JbnB1dCIgYWxsb3ctYm9keT0ibm8iPgotCi0gICAgPGRlc2NyaXB0aW9uPgotICAgICAgICBUaGUgSW5wdXQgZWxlbWVudCBzcGVjaWZpZXMgYSB0ZXh0IGVudHJ5IG9iamVjdC4KLSAgICA8L2Rlc2NyaXB0aW9uPgotCi0gICAgPHBhcmFtZXRlciBuYW1lPSJ0aXRsZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgZGlyZWN0aW9uPSJpbiI+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIFRoZSB0aXRsZSBhdHRyaWJ1dGUgc3BlY2lmaWVzIGFkdmlzb3J5IGluZm9ybWF0aW9uIGFib3V0IHRoZSBlbGVtZW50LiBUaGUgdGl0bGUgbWF5IGJlIHJlbmRlcmVkIGluIGEKLSAgICAgICAgICAgIHZhcmlldHkgb2Ygd2F5cyBieSB0aGUgdXNlciBhZ2VudCAoZWcsIHN1Z2dlc3RlZCBib29rbWFyayBuYW1lLCBwb3AtdXAgdG9vbHRpcCwgZXRjLikuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgPC9wYXJhbWV0ZXI+Ci0KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImhpZGRlbiIgdHlwZT0iYm9vbGVhbiIgZGlyZWN0aW9uPSJpbiIvPgotCi0gICAgPHBhcmFtZXRlciBuYW1lPSJuYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIiBkaXJlY3Rpb249ImluIiByZXF1aXJlZD0ieWVzIiA+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIFRoZSBuYW1lIGF0dHJpYnV0ZSBzcGVjaWZpZXMgYSB2YXJpYWJsZSBuYW1lLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgIDwvcGFyYW1ldGVyPgotCi0gICAgPHBhcmFtZXRlciBuYW1lPSJmb3JtYXQiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciIGRpcmVjdGlvbj0iaW4iPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBUaGUgZm9ybWF0IGF0dHJpYnV0ZSBzcGVjaWZpZXMgYW4gaW5wdXQgbWFzayBmb3IgdXNlciBpbnB1dCBlbnRyaWVzLiBUaGUgc3RyaW5nIGNvbnNpc3RzIG9mIG1hc2sgY29udHJvbAotICAgICAgICAgICAgY2hhcmFjdGVycyBhbmQgc3RhdGljIHRleHQgdGhhdCBpcyBkaXNwbGF5ZWQgaW4gdGhlIGlucHV0IGFyZWEuIFRoZSB1c2VyIGFnZW50IG1heSB1c2UgdGhlIGZvcm1hdCBtYXNrIHRvCi0gICAgICAgICAgICBmYWNpbGl0YXRlIGFjY2VsZXJhdGVkIGRhdGEgaW5wdXQuIEFuIGlucHV0IG1hc2sgaXMgb25seSB2YWxpZCB3aGVuIGl0IGNvbnRhaW5zIG9ubHkgbGVnYWwgZm9ybWF0IGNvZGVzLgotICAgICAgICAgICAgVXNlciBhZ2VudHMgbXVzdCBpZ25vcmUgaW52YWxpZCBtYXNrcy4KLSAgICAgICAgICAgIFRoZSBmb3JtYXQgY29udHJvbCBjaGFyYWN0ZXJzIHNwZWNpZnkgdGhlIGRhdGEgZm9ybWF0IGV4cGVjdGVkIHRvIGJlIGVudGVyZWQgYnkgdGhlIHVzZXIuCi0gICAgICAgICAgICBTZWUgdGhlIFdNTCBzcGVjaWZpY2F0aW9uIGZvciB2YWxpZCBmb3JtYXQgY29udHJvbCBjaGFyYWN0ZXJzLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgIDwvcGFyYW1ldGVyPgotCi0gICAgPHBhcmFtZXRlciBuYW1lPSJlbXB0eW9rIiB0eXBlPSJib29sZWFuIiBkaXJlY3Rpb249ImluIj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgVGhlIGVtcHR5b2sgYXR0cmlidXRlIGluZGljYXRlcyB0aGF0IHRoaXMgaW5wdXQgZWxlbWVudCBhY2NlcHRzIGVtcHR5IGlucHV0IGFsdGhvdWdoIGEgbm9uLWVtcHR5IGZvcm1hdAotICAgICAgICAgICAgc3RyaW5nIGhhcyBiZWVuIHNwZWNpZmllZC4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICA8L3BhcmFtZXRlcj4KLQotICAgIDxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciIHJlcXVpcmVkPSJ5ZXMiPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBCaW5kIHZhbHVlIHRvIHRoZSB2YXJpYWJsZSB0aGF0IHNob3VsZCByZWNpZXZlIHRoZSB1c2VyIGlucHV0IHN0cmluZy4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICA8L3BhcmFtZXRlcj4KLQotICAgIDxyZXNlcnZlZC1wYXJhbWV0ZXIgbmFtZT0idHlwZSIvPgotCi08L2NvbXBvbmVudC1zcGVjaWZpY2F0aW9uPgpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3dtbC9OZXN0ZWRXTUxXcml0ZXIuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS93bWwvTmVzdGVkV01MV3JpdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxNDUyNmUuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3dtbC9OZXN0ZWRXTUxXcml0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LndtbDsKLQotaW1wb3J0IGphdmEuaW8uQ2hhckFycmF5V3JpdGVyOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklNYXJrdXBXcml0ZXI7Ci0KLS8qKgotICogIFN1YmNsYXNzIG9mIHtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5LndtbC5XTUxXcml0ZXJ9IHRoYXQgaXMgbmVzdGVkLiAgQSBuZXN0ZWQgd3JpdGVyCi0gKiAgYnVmZmVycyBpdHMgb3V0cHV0LCB0aGVuIGluc2VydHMgaXQgaW50byBpdHMgcGFyZW50IHdyaXRlciB3aGVuIGl0IGlzCi0gKiAgY2xvc2VkLgotICoKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQGF1dGhvciBEYXZpZCBTb2xpcwotICogIEBzaW5jZSAwLjIuOQotICogCi0gKiovCi0KLXB1YmxpYyBjbGFzcyBOZXN0ZWRXTUxXcml0ZXIgZXh0ZW5kcyBXTUxXcml0ZXIKLXsKLSAgICBwcml2YXRlIElNYXJrdXBXcml0ZXIgX3BhcmVudDsKLSAgICBwcml2YXRlIENoYXJBcnJheVdyaXRlciBfaW50ZXJuYWxCdWZmZXI7Ci0KLSAgICBwdWJsaWMgTmVzdGVkV01MV3JpdGVyKElNYXJrdXBXcml0ZXIgcGFyZW50KQotICAgIHsKLSAgICAgICAgc3VwZXIocGFyZW50LmdldENvbnRlbnRUeXBlKCkpOwotCi0gICAgICAgIF9wYXJlbnQgPSBwYXJlbnQ7Ci0KLSAgICAgICAgX2ludGVybmFsQnVmZmVyID0gbmV3IENoYXJBcnJheVdyaXRlcigpOwotCi0gICAgICAgc2V0V3JpdGVyKG5ldyBQcmludFdyaXRlcihfaW50ZXJuYWxCdWZmZXIpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgSW52b2tlcyB0aGUge0BsaW5rIFdNTFdyaXRlciNjbG9zZSgpIHN1cGVyLWNsYXNzCi0gICAgICogIGltcGxlbWVudGF0aW9ufSwgdGhlbiBnZXRzIHRoZSBkYXRhIGFjY3VtdWxhdGVkIGluIHRoZQotICAgICAqICBpbnRlcm5hbCBidWZmZXIgYW5kIHByb3ZpZGVzIGl0IHRvIHRoZSBjb250YWluaW5nIHdyaXRlciB1c2luZwotICAgICAqICB7QGxpbmsgSU1hcmt1cFdyaXRlciNwcmludFJhdyhjaGFyW10sIGludCwgaW50KX0uCi0gICAgICoKLSAgICAgKiovCi0KLSAgICBwdWJsaWMgdm9pZCBjbG9zZSgpCi0gICAgewotICAgICAgICBzdXBlci5jbG9zZSgpOwotCi0gICAgICAgIGNoYXJbXSBkYXRhID0gX2ludGVybmFsQnVmZmVyLnRvQ2hhckFycmF5KCk7Ci0KLSAgICAgICAgX3BhcmVudC5wcmludFJhdyhkYXRhLCAwLCBkYXRhLmxlbmd0aCk7Ci0KLSAgICAgICAgX2ludGVybmFsQnVmZmVyID0gbnVsbDsKLSAgICAgICAgX3BhcmVudCA9IG51bGw7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS93bWwvT25FdmVudC5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3dtbC9PbkV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmYzkxZmEuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3dtbC9PbkV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS53bWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LkFic3RyYWN0Q29tcG9uZW50OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSU1hcmt1cFdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZXF1ZXN0Q3ljbGU7Ci0KLS8qKgotICogIFRoZSBvbmV2ZW50IGVsZW1lbnQgYmluZHMgYSB0YXNrIHRvIGEgcGFydGljdWxhciBpbnRyaW5zaWMgZXZlbnQgZm9yIHRoZSBpbW1lZGlhdGVseSBlbmNsb3NpbmcgZWxlbWVudCwgaWUsCi0gKiAgc3BlY2lmeWluZyBhbiBvbmV2ZW50IGVsZW1lbnQgaW5zaWRlIGFuICJYWVoiIGVsZW1lbnQgYXNzb2NpYXRlcyBhbiBpbnRyaW5zaWMgZXZlbnQgYmluZGluZyB3aXRoIHRoZSAiWFlaIiBlbGVtZW50LgotICogIFRoZSB1c2VyIGFnZW50IG11c3QgaWdub3JlIGFueSBvbmV2ZW50IGVsZW1lbnQgc3BlY2lmeWluZyBhIHR5cGUgdGhhdCBkb2VzIG5vdCBjb3JyZXNwb25kIHRvIGEgbGVnYWwgaW50cmluc2ljIGV2ZW50Ci0gKiAgZm9yIHRoZSBpbW1lZGlhdGVseSBlbmNsb3NpbmcgZWxlbWVudC4KLSAqCi0gKiAgQHZlcnNpb24gJElkJAotICogIEBhdXRob3IgRGF2aWQgU29saXMKLSAqICBAc2luY2UgMy4wCi0gKgotICoqLwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgT25FdmVudCBleHRlbmRzIEFic3RyYWN0Q29tcG9uZW50Ci17Ci0gICAgLyoqCi0gICAgICogIEBzZWUgQWJzdHJhY3RDb21wb25lbnQjcmVuZGVyQ29tcG9uZW50KElNYXJrdXBXcml0ZXIsIElSZXF1ZXN0Q3ljbGUpCi0gICAgICoqLwotCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVuZGVyQ29tcG9uZW50KElNYXJrdXBXcml0ZXIgd3JpdGVyLCBJUmVxdWVzdEN5Y2xlIGN5Y2xlKQotICAgIHsKLSAgICAgICAgYm9vbGVhbiByZW5kZXIgPSAhY3ljbGUuaXNSZXdpbmRpbmcoKTsKLQotICAgICAgICBpZiAocmVuZGVyKQotICAgICAgICB7Ci0gICAgICAgICAgICB3cml0ZXIuYmVnaW4oIm9uZXZlbnQiKTsKLQotICAgICAgICAgICAgd3JpdGVyLmF0dHJpYnV0ZSgidHlwZSIsIGdldFR5cGUoKSk7Ci0KLSAgICAgICAgICAgIHJlbmRlckluZm9ybWFsUGFyYW1ldGVycyh3cml0ZXIsIGN5Y2xlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJlbmRlckJvZHkod3JpdGVyLCBjeWNsZSk7Ci0KLSAgICAgICAgaWYgKHJlbmRlcikKLSAgICAgICAgewotICAgICAgICAgICAgd3JpdGVyLmVuZCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRUeXBlKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS93bWwvT25FdmVudC5qd2MgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvd21sL09uRXZlbnQuandjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzZlNDhiLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS93bWwvT25FdmVudC5qd2MKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gIAotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTwhLS0gJElkJCAtLT4KLTwhRE9DVFlQRSBjb21wb25lbnQtc3BlY2lmaWNhdGlvbiBQVUJMSUMKLSAgIi0vL0FwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLy9UYXBlc3RyeSBTcGVjaWZpY2F0aW9uIDMuMC8vRU4iIAotICAiaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy90YXBlc3RyeS9kdGQvVGFwZXN0cnlfM18wLmR0ZCI+Ci0KLTxjb21wb25lbnQtc3BlY2lmaWNhdGlvbiBjbGFzcz0ib3JnLmFwYWNoZS50YXBlc3RyeS53bWwuT25FdmVudCI+Ci0KLSAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgIFRoZSBvbmV2ZW50IGVsZW1lbnQgYmluZHMgYSB0YXNrIHRvIGEgcGFydGljdWxhciBpbnRyaW5zaWMgZXZlbnQgZm9yIHRoZSBpbW1lZGlhdGVseSBlbmNsb3NpbmcgZWxlbWVudCwgaWUsCi0gICAgICAgIHNwZWNpZnlpbmcgYW4gb25ldmVudCBlbGVtZW50IGluc2lkZSBhbiAiWFlaIiBlbGVtZW50IGFzc29jaWF0ZXMgYW4gaW50cmluc2ljIGV2ZW50IGJpbmRpbmcgd2l0aCB0aGUgIlhZWiIKLSAgICAgICAgZWxlbWVudC4KLSAgICAgICAgVGhlIHVzZXIgYWdlbnQgbXVzdCBpZ25vcmUgYW55IG9uZXZlbnQgZWxlbWVudCBzcGVjaWZ5aW5nIGEgdHlwZSB0aGF0IGRvZXMgbm90IGNvcnJlc3BvbmQgdG8gYSBsZWdhbAotICAgICAgICBpbnRyaW5zaWMgZXZlbnQgZm9yIHRoZSBpbW1lZGlhdGVseSBlbmNsb3NpbmcgZWxlbWVudC4KLSAgICA8L2Rlc2NyaXB0aW9uPgotCi0gICAgPHBhcmFtZXRlciBuYW1lPSJ0eXBlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIiBkaXJlY3Rpb249ImluIiByZXF1aXJlZD0ieWVzIj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgVGhlIHR5cGUgYXR0cmlidXRlIGluZGljYXRlcyB0aGUgbmFtZSBvZiB0aGUgaW50cmluc2ljIGV2ZW50Ci0gICAgICAgICAgICAob250aW1lciwgb25lbnRlcmZvcndhcmQsIG9uZW50ZXJiYWNrd2FyZCwgb25waWNrKS4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICA8L3BhcmFtZXRlcj4KLQotPC9jb21wb25lbnQtc3BlY2lmaWNhdGlvbj4KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS93bWwvT3B0aW9uLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvd21sL09wdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMThkN2Y3Li4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS93bWwvT3B0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS53bWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LkFic3RyYWN0Q29tcG9uZW50OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSU1hcmt1cFdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZXF1ZXN0Q3ljbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5UYXBlc3RyeTsKLQotLyoqCi0gKiAgVGhpcyBjb21wb25lbnQgc2VydmVzIGFzIGEgY29udGFpbmVyIGZvciBvbmUgaXRlbSB0aGF0IGlzIGxpc3RlZCBhcyBhIGNob2ljZSBpbiBhIHtAbGluayBTZWxlY3R9LiBBIHtAbGluayBTZWxlY3R9Ci0gKiAgb2ZmZXJzIGEgc2VsZWN0aW9uIG9mIGNob2ljZXMgZnJvbSB3aGljaCB1c2Vyc3UgbWF5IGNob29zZSBvbmUgb3IgbW9yZSBpdGVtcy4gVGhlIHNlbGVjdCBsaXN0IGlzIGNyZWF0ZWQgdXNpbmcgYQotICogIHNlbGVjdCBlbGVtZW50IHdoaWNoIGNvbnRhaW5zIGEgY29sbGVjdGlvbiBvZiBvcHRpb24gZWxlbWVudHMuIEEgc3RyaW5nIG9yIHRleHQgZGVzY3JpYmluZyB0aGUgaXRlbSBhcHBlYXJzIGJldHdlZW4KLSAqICB0aGUgb3BlbmluZyBhbmQgY2xvc2luZyBvcHRpb24gdGFncy4KLSAqCi0gKiAgSW4gb3JkZXIgdG8gaGF2ZSBhIGR5bmFtaWMgb25waWNrIGF0dHJpYnV0ZSBpdCBpcyBiZXR0ZXIgdG8gdXNlIGEgY29uY3JldGUgY2xhc3Mgb2YKLSAqICB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5saW5rLklMaW5rUmVuZGVyZXJ9IHdpdGggdGhlIHtAbGluayBPcHRpb25SZW5kZXJlcn0uCi0gKgotICogIEB2ZXJzaW9uICRJZCQKLSAqICBAYXV0aG9yIERhdmlkIFNvbGlzCi0gKiAgQHNpbmNlIDMuMAotICoKLSAqKi8KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIE9wdGlvbiBleHRlbmRzIEFic3RyYWN0Q29tcG9uZW50IHsKLQotCS8qKgotCSAqICBAc2VlIG9yZy5hcGFjaGUudGFwZXN0cnkuQWJzdHJhY3RDb21wb25lbnQjcmVuZGVyQ29tcG9uZW50KElNYXJrdXBXcml0ZXIsIElSZXF1ZXN0Q3ljbGUpCi0JICoqLwotCi0JcHJvdGVjdGVkIHZvaWQgcmVuZGVyQ29tcG9uZW50KElNYXJrdXBXcml0ZXIgd3JpdGVyLCBJUmVxdWVzdEN5Y2xlIGN5Y2xlKQotICAgIHsKLSAgICAgICAgYm9vbGVhbiByZW5kZXIgPSAhY3ljbGUuaXNSZXdpbmRpbmcoKTsKLQotICAgICAgICBpZiAocmVuZGVyKQotICAgICAgICB7Ci0gICAgICAgICAgICB3cml0ZXIuYmVnaW4oIm9wdGlvbiIpOwotCi0gICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBnZXRWYWx1ZSgpOwotICAgICAgICAgICAgaWYgKFRhcGVzdHJ5LmlzTm9uQmxhbmsodmFsdWUpKQotICAgICAgICAgICAgICAgIHdyaXRlci5hdHRyaWJ1dGUoInZhbHVlIiwgdmFsdWUpOwotCi0gICAgICAgICAgICByZW5kZXJJbmZvcm1hbFBhcmFtZXRlcnMod3JpdGVyLCBjeWNsZSk7Ci0KLSAgICAgICAgICAgIHJlbmRlckJvZHkod3JpdGVyLCBjeWNsZSk7Ci0KLSAgICAgICAgICAgIHdyaXRlci5lbmQoKTsKLSAgICAgICAgfQotCX0KLQotICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0VmFsdWUoKTsKLX0KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS93bWwvT3B0aW9uLmp3YyBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS93bWwvT3B0aW9uLmp3YwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRmNWNjNC4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvd21sL09wdGlvbi5qd2MKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gIAotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTwhLS0gJElkJCAtLT4KLTwhRE9DVFlQRSBjb21wb25lbnQtc3BlY2lmaWNhdGlvbiBQVUJMSUMKLSAgIi0vL0FwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLy9UYXBlc3RyeSBTcGVjaWZpY2F0aW9uIDMuMC8vRU4iCi0gICJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL3RhcGVzdHJ5L2R0ZC9UYXBlc3RyeV8zXzAuZHRkIj4KLQotPGNvbXBvbmVudC1zcGVjaWZpY2F0aW9uIGNsYXNzPSJvcmcuYXBhY2hlLnRhcGVzdHJ5LndtbC5PcHRpb24iPgotCi0gICAgPGRlc2NyaXB0aW9uPgotICAgICAgICBUaGlzIGNvbXBvbmVudCBzZXJ2ZXMgYXMgYSBjb250YWluZXIgZm9yIG9uZSBpdGVtIHRoYXQgaXMgbGlzdGVkIGFzIGEgY2hvaWNlIGluIGEgU2VsZWN0LiBBIFNlbGVjdAotICAgICAgICBvZmZlcnMgYSBzZWxlY3Rpb24gb2YgY2hvaWNlcyBmcm9tIHdoaWNoIHVzZXJzdSBtYXkgY2hvb3NlIG9uZSBvciBtb3JlIGl0ZW1zLiBUaGUgc2VsZWN0IGxpc3QgaXMgY3JlYXRlZCB1c2luZyBhCi0gICAgICAgIHNlbGVjdCBlbGVtZW50IHdoaWNoIGNvbnRhaW5zIGEgY29sbGVjdGlvbiBvZiBvcHRpb24gZWxlbWVudHMuIEEgc3RyaW5nIG9yIHRleHQgZGVzY3JpYmluZyB0aGUgaXRlbSBhcHBlYXJzIGJldHdlZW4KLSAgICAgICAgdGhlIG9wZW5pbmcgYW5kIGNsb3Npbmcgb3B0aW9uIHRhZ3MuCi0gICAgPC9kZXNjcmlwdGlvbj4KLQotICAgIDxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciIGRpcmVjdGlvbj0iaW4iPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBUaGUgdmFsdWUgYXR0cmlidXRlIHNwZWNpZmllcyB0aGUgdmFsdWUgdG8gYmUgdXNlZCB3aGVuIHNldHRpbmcgdGhlIG5hbWUgdmFyaWFibGUuIFdoZW4gdGhlIHVzZXIgc2VsZWN0cwotICAgICAgICAgICAgdGhpcyBvcHRpb24sIHRoZSByZXN1bHRpbmcgdmFsdWUgc3BlY2lmaWVkIGluIHRoZSB2YWx1ZSBhdHRyaWJ1dGUgaXMgdXNlZCB0byBzZXQgdGhlIFNlbGVjdCBlbGVtZW50J3MKLSAgICAgICAgICAgIG5hbWUgd21sIHZhcmlhYmxlLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgIDwvcGFyYW1ldGVyPgotCi08L2NvbXBvbmVudC1zcGVjaWZpY2F0aW9uPgpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3dtbC9PcHRpb25SZW5kZXJlci5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3dtbC9PcHRpb25SZW5kZXJlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjQxZGZjLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS93bWwvT3B0aW9uUmVuZGVyZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LndtbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkubGluay5EZWZhdWx0TGlua1JlbmRlcmVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkubGluay5JTGlua1JlbmRlcmVyOwotCi0vKioKLSAqICBJbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5saW5rLklMaW5rUmVuZGVyZXJ9IGZvcgotICogIHRoZSBXTUwgT3B0aW9uIGVsZW1lbnQuCi0gKgotICogIFRoZSB2YWx1ZSBhdHRyaWJ1dGUgaXMgcmVzZXJ2ZWQuCi0gKgotICogIEB2ZXJzaW9uICRJZCQKLSAqICBAYXV0aG9yIERhdmlkIFNvbGlzCi0gKiAgQHNpbmNlIDMuMAotICoKLSAqKi8KLQotcHVibGljIGNsYXNzIE9wdGlvblJlbmRlcmVyIGV4dGVuZHMgRGVmYXVsdExpbmtSZW5kZXJlcgotewotCS8qKgotCSAqICBBIHNpbmdsZXRvbiBmb3IgdGhlIG9wdGlvbiBsaW5rLgotCSAqKi8KLQotCSBwdWJsaWMgc3RhdGljIGZpbmFsIElMaW5rUmVuZGVyZXIgU0hBUkVEX0lOU1RBTkNFID0gbmV3IE9wdGlvblJlbmRlcmVyKCk7Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEVsZW1lbnQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICJvcHRpb24iOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VXJsQXR0cmlidXRlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAib25waWNrIjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvd21sL1Bvc3RmaWVsZC5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3dtbC9Qb3N0ZmllbGQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI0ZGIwOS4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvd21sL1Bvc3RmaWVsZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkud21sOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVxdWVzdEN5Y2xlOwotCi0vKioKLSAqICBUaGUgcG9zdGZpZWxkIGVsZW1lbnQgc3BlY2lmaWVzIGEgZmllbGQgbmFtZSBhbmQgdmFsdWUgZm9yIHRyYW5zbWlzc2lvbiB0byBhbiBvcmlnaW4gc2VydmVyIGR1cmluZyBhIFVSTCByZXF1ZXN0LgotICogIEBzZWUgR28KLSAqCi0gKiAgQHZlcnNpb24gJElkJAotICogIEBhdXRob3IgRGF2aWQgU29saXMKLSAqICBAc2luY2UgMy4wCi0gKgotICoqLwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUG9zdGZpZWxkIGV4dGVuZHMgQWJzdHJhY3RQb3N0ZmllbGQKLXsKLQotICAgIHByb3RlY3RlZCB2b2lkIHJld2luZChJUmVxdWVzdEN5Y2xlIGN5Y2xlKQotICAgIHsKLSAgICAgICAgU3RyaW5nIHZhbHVlID0gY3ljbGUuZ2V0UmVxdWVzdENvbnRleHQoKS5nZXRQYXJhbWV0ZXIoZ2V0TmFtZSgpKTsKLSAgICAgICAgdXBkYXRlVmFsdWUodmFsdWUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS93bWwvUG9zdGZpZWxkLmp3YyBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS93bWwvUG9zdGZpZWxkLmp3YwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE4ZTFiOC4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvd21sL1Bvc3RmaWVsZC5qd2MKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gIAotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTwhLS0gJElkJCAtLT4KLTwhRE9DVFlQRSBjb21wb25lbnQtc3BlY2lmaWNhdGlvbiBQVUJMSUMKLSAgIi0vL0FwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLy9UYXBlc3RyeSBTcGVjaWZpY2F0aW9uIDMuMC8vRU4iIAotICAiaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy90YXBlc3RyeS9kdGQvVGFwZXN0cnlfM18wLmR0ZCI+Ci0KLTxjb21wb25lbnQtc3BlY2lmaWNhdGlvbiBjbGFzcz0ib3JnLmFwYWNoZS50YXBlc3RyeS53bWwuUG9zdGZpZWxkIiBhbGxvdy1ib2R5PSJubyI+Ci0KLSAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgIFRoZSBwb3N0ZmllbGQgZWxlbWVudCBzcGVjaWZpZXMgYSBmaWVsZCBuYW1lIGFuZCB2YWx1ZSBmb3IgdHJhbnNtaXNzaW9uIHRvIGFuIG9yaWdpbiBzZXJ2ZXIgZHVyaW5nIGFuCi0gICAgICAgIFVSTCByZXF1ZXN0LgotICAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgICA8cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIiByZXF1aXJlZD0ieWVzIj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgQmluZCB2YWx1ZSB0byB0aGUgdmFyaWFibGUgdGhhdCBzaG91bGQgcmVjaWV2ZSB0aGUgdXNlciBpbnB1dCBzdHJpbmcuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgPC9wYXJhbWV0ZXI+Ci0KLSAgICA8cGFyYW1ldGVyIG5hbWU9Im5hbWUiIHByb3BlcnR5LW5hbWU9InZhck5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciIGRpcmVjdGlvbj0iaW4iIHJlcXVpcmVkPSJ5ZXMiPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBUaGUgbmFtZSBhdHRyaWJ1dGUgc3BlY2lmaWVzIGFuIFdNTCB2YXJpYWJsZSBuYW1lLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgIDwvcGFyYW1ldGVyPgotCi0gICAgPHJlc2VydmVkLXBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIvPgotCi0gICAgPHByb3BlcnR5LXNwZWNpZmljYXRpb24gbmFtZT0ibmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgotICAgIDxwcm9wZXJ0eS1zcGVjaWZpY2F0aW9uIG5hbWU9ImZvcm0iIHR5cGU9Im9yZy5hcGFjaGUudGFwZXN0cnkuSUZvcm0iLz4KLQotPC9jb21wb25lbnQtc3BlY2lmaWNhdGlvbj4KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS93bWwvUHJvcGVydHlTZWxlY3Rpb24uamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS93bWwvUHJvcGVydHlTZWxlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzIwY2Q4NC4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvd21sL1Byb3BlcnR5U2VsZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS53bWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LkFic3RyYWN0Q29tcG9uZW50OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSU1hcmt1cFdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZXF1ZXN0Q3ljbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5mb3JtLklQcm9wZXJ0eVNlbGVjdGlvbk1vZGVsOwotCi0vKioKLSAqICBBIGhpZ2ggbGV2ZWwgY29tcG9uZW50IHVzZWQgdG8gcmVuZGVyIGEgZHJvcC1kb3duIGxpc3Qgb2Ygb3B0aW9ucyB0aGF0IHRoZSB1c2VyIG1heSBzZWxlY3QuCi0gKgotICogIEluZm9ybWFsIHBhcmFtZXRlcnMgYXJlIGFwcGxpZWQgdG8gdGhlIDxzZWxlY3Q+IHRhZy4gIFRvIGhhdmUgZ3JlYXRlciBjb250cm9sIG92ZXIgdGhlIDxvcHRpb24+IHRhZ3MsIHlvdSBtdXN0IHVzZQotICogIGEgU2VsZWN0IGFuZCBPcHRpb24gb3IgYSBjb25jcmV0ZSBjbGFzcyBvZiB7QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS5saW5rLklMaW5rUmVuZGVyZXJ9IHdpdGggdGhlCi0gKiAge0BsaW5rIE9wdGlvblJlbmRlcmVyfS4KLSAqCi0gKiAgQHZlcnNpb24gJElkJAotICogIEBhdXRob3IgRGF2aWQgU29saXMKLSAqLwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUHJvcGVydHlTZWxlY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdENvbXBvbmVudAotewotICAgIC8qKgotICAgICAqICBAc2VlIEFic3RyYWN0Q29tcG9uZW50I3JlbmRlckNvbXBvbmVudChJTWFya3VwV3JpdGVyLCBJUmVxdWVzdEN5Y2xlKQotICAgICAqKi8KLQotICAgIHByb3RlY3RlZCB2b2lkIHJlbmRlckNvbXBvbmVudChJTWFya3VwV3JpdGVyIHdyaXRlciwgSVJlcXVlc3RDeWNsZSBjeWNsZSkKLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gcmVuZGVyID0gIWN5Y2xlLmlzUmV3aW5kaW5nKCk7Ci0KLSAgICAgICAgaWYgKHJlbmRlcikKLSAgICAgICAgewotICAgICAgICAgICAgSVByb3BlcnR5U2VsZWN0aW9uTW9kZWwgbW9kZWwgPSBnZXRNb2RlbCgpOwotCi0gICAgICAgICAgICB3cml0ZXIuYmVnaW4oInNlbGVjdCIpOwotCi0gICAgICAgICAgICB3cml0ZXIuYXR0cmlidXRlKCJuYW1lIiwgZ2V0TmFtZSgpKTsKLQotICAgICAgICAgICAgcmVuZGVySW5mb3JtYWxQYXJhbWV0ZXJzKHdyaXRlciwgY3ljbGUpOwotCi0gICAgICAgICAgICB3cml0ZXIucHJpbnRsbigpOwotCi0gICAgICAgICAgICBpbnQgY291bnQgPSBtb2RlbC5nZXRPcHRpb25Db3VudCgpOwotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCi0gICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICB3cml0ZXIuYmVnaW4oIm9wdGlvbiIpOwotICAgICAgICAgICAgICAgIHdyaXRlci5hdHRyaWJ1dGUoInZhbHVlIiwgbW9kZWwuZ2V0VmFsdWUoaSkpOwotCi0gICAgICAgICAgICAgICAgd3JpdGVyLnByaW50KG1vZGVsLmdldExhYmVsKGkpKTsKLQotICAgICAgICAgICAgICAgIHdyaXRlci5lbmQoKTsKLSAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB3cml0ZXIuZW5kKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgSVByb3BlcnR5U2VsZWN0aW9uTW9kZWwgZ2V0TW9kZWwoKTsKLQotICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0TmFtZSgpOwotfQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3dtbC9Qcm9wZXJ0eVNlbGVjdGlvbi5qd2MgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvd21sL1Byb3BlcnR5U2VsZWN0aW9uLmp3YwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGEzOGZiYy4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvd21sL1Byb3BlcnR5U2VsZWN0aW9uLmp3YworKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAgCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPCEtLSAkSWQkIC0tPgotPCFET0NUWVBFIGNvbXBvbmVudC1zcGVjaWZpY2F0aW9uIFBVQkxJQwotICAiLS8vQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24vL1RhcGVzdHJ5IFNwZWNpZmljYXRpb24gMy4wLy9FTiIKLSAgImh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvdGFwZXN0cnkvZHRkL1RhcGVzdHJ5XzNfMC5kdGQiPgotCi08Y29tcG9uZW50LXNwZWNpZmljYXRpb24gY2xhc3M9Im9yZy5hcGFjaGUudGFwZXN0cnkud21sLlByb3BlcnR5U2VsZWN0aW9uIgotICAgIGFsbG93LWJvZHk9Im5vIgotICAgIGFsbG93LWluZm9ybWFsLXBhcmFtZXRlcnM9InllcyI+Ci0KLSAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgIENyZWF0ZXMgYW4gV01MIHNlbGVjdCB0byBjaG9vc2UgYSBzaW5nbGUgcHJvcGVydHkgZnJvbSBhIGxpc3Qgb2Ygb3B0aW9ucy4KLSAgICA8L2Rlc2NyaXB0aW9uPgotCi0gICAgPHBhcmFtZXRlciBuYW1lPSJuYW1lIiByZXF1aXJlZD0ieWVzIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIiBkaXJlY3Rpb249ImluIi8+Ci0KLSAgICA8cGFyYW1ldGVyIG5hbWU9Im1vZGVsIgotICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLnRhcGVzdHJ5LmZvcm0uSVByb3BlcnR5U2VsZWN0aW9uTW9kZWwiCi0gICAgICAgIHJlcXVpcmVkPSJ5ZXMiCi0gICAgICAgIGRpcmVjdGlvbj0iYXV0byIvPgotCi08L2NvbXBvbmVudC1zcGVjaWZpY2F0aW9uPgpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3dtbC9TZWxlY3QuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS93bWwvU2VsZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjMDkyYzUuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3dtbC9TZWxlY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS53bWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LkFic3RyYWN0Q29tcG9uZW50OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSU1hcmt1cFdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklSZXF1ZXN0Q3ljbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5UYXBlc3RyeTsKLQotLyoqCi0gKiAgVGhlIFNlbGVjdCBlbGVtZW50IGxldHMgdXNlcnMgcGljayBmcm9tIGEgbGlzdCBvZiBvcHRpb25zLiBFYWNoIG9wdGlvbgotICogIGlzIHNwZWNpZmllZCBieSBhbiBPcHRpb24gZWxlbWVudC4gRWFjaCBPcHRpb24gZWxlbWVudCBtYXkgaGF2ZSBvbmUKLSAqICBsaW5lIG9mIGZvcm1hdHRlZCB0ZXh0ICh3aGljaCBtYXkgYmUgd3JhcHBlZCBvciB0cnVuY2F0ZWQgYnkgdGhlIHVzZXIKLSAqICBhZ2VudCBpZiB0b28gbG9uZykuCi0gKgotICogIFVubGVzcyBtdWx0aXBsZSBzZWxlY3Rpb25zIGFyZSByZXF1aXJlZCBpdCBpcyBnZW5lcmFsbHkgZWFzaWVyIHRvIHVzZSB0aGUge0BsaW5rIFByb3BlcnR5U2VsZWN0aW9ufSBjb21wb25lbnQuCi0gKgotICogIEB2ZXJzaW9uICRJZCQKLSAqICBAYXV0aG9yIERhdmlkIFNvbGlzCi0gKiAgQHNpbmNlIDMuMAotICoKLSAqKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTZWxlY3QgZXh0ZW5kcyBBYnN0cmFjdENvbXBvbmVudAotewotICAgIC8qKgotICAgICAqICBVc2VkIGJ5IHRoZSA8Y29kZT5TZWxlY3Q8L2NvZGU+IHRvIHJlY29yZCBpdHNlbGYgYXMgYQotICAgICAqICB7QGxpbmsgSVJlcXVlc3RDeWNsZX0gYXR0cmlidXRlLCBzbyB0aGF0IHRoZQotICAgICAqICB7QGxpbmsgT3B0aW9ufSBjb21wb25lbnRzIGl0IHdyYXBzIGNhbiBoYXZlIGFjY2VzcyB0byBpdC4KLSAgICAgKgotICAgICAqKi8KLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBBVFRSSUJVVEVfTkFNRSA9ICJvcmcuYXBhY2hlLnRhcGVzdHJ5LmFjdGl2ZS5TZWxlY3QiOwotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LkFic3RyYWN0Q29tcG9uZW50I3JlbmRlckNvbXBvbmVudChJTWFya3VwV3JpdGVyLCBJUmVxdWVzdEN5Y2xlKQotICAgICAqKi8KLQotICAgIHByb3RlY3RlZCB2b2lkIHJlbmRlckNvbXBvbmVudChJTWFya3VwV3JpdGVyIHdyaXRlciwgSVJlcXVlc3RDeWNsZSBjeWNsZSkKLSAgICB7Ci0gICAgICAgIGlmIChjeWNsZS5nZXRBdHRyaWJ1dGUoQVRUUklCVVRFX05BTUUpICE9IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25SdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIFRhcGVzdHJ5LmdldE1lc3NhZ2UoIlNlbGVjdC5tYXktbm90LW5lc3QiKSwKLSAgICAgICAgICAgICAgICB0aGlzLAotICAgICAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAgICAgbnVsbCk7Ci0KLSAgICAgICAgY3ljbGUuc2V0QXR0cmlidXRlKEFUVFJJQlVURV9OQU1FLCB0aGlzKTsKLQotICAgICAgICBib29sZWFuIHJlbmRlciA9ICFjeWNsZS5pc1Jld2luZGluZygpOwotCi0gICAgICAgIGlmIChyZW5kZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdyaXRlci5iZWdpbigic2VsZWN0Iik7Ci0KLSAgICAgICAgICAgIHdyaXRlci5hdHRyaWJ1dGUoIm5hbWUiLCBnZXROYW1lKCkpOwotCi0gICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBnZXRWYWx1ZSgpOwotICAgICAgICAgICAgaWYgKFRhcGVzdHJ5LmlzTm9uQmxhbmsodmFsdWUpKQotICAgICAgICAgICAgICAgIHdyaXRlci5hdHRyaWJ1dGUoInZhbHVlIiwgdmFsdWUpOwotCi0gICAgICAgICAgICBTdHJpbmcgdGl0bGUgPSBnZXRUaXRsZSgpOwotICAgICAgICAgICAgaWYgKFRhcGVzdHJ5LmlzTm9uQmxhbmsodGl0bGUpKQotICAgICAgICAgICAgICAgIHdyaXRlci5hdHRyaWJ1dGUoInRpdGxlIiwgdGl0bGUpOwotCi0gICAgICAgICAgICBib29sZWFuIG11bHRpcGxlID0gaXNNdWx0aXBsZSgpOwotICAgICAgICAgICAgaWYgKG11bHRpcGxlKQotICAgICAgICAgICAgICAgIHdyaXRlci5hdHRyaWJ1dGUoIm11bHRpcGxlIiwgbXVsdGlwbGUpOwotCi0gICAgICAgICAgICByZW5kZXJJbmZvcm1hbFBhcmFtZXRlcnMod3JpdGVyLCBjeWNsZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZW5kZXJCb2R5KHdyaXRlciwgY3ljbGUpOwotCi0gICAgICAgIGlmIChyZW5kZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdyaXRlci5lbmQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGN5Y2xlLnJlbW92ZUF0dHJpYnV0ZShBVFRSSUJVVEVfTkFNRSk7Ci0gICAgfQotCi0gICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNNdWx0aXBsZSgpOwotCi0gICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXROYW1lKCk7Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFZhbHVlKCk7Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFRpdGxlKCk7Ci19CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvd21sL1NlbGVjdC5qd2MgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvd21sL1NlbGVjdC5qd2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5ZjYwNDEuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3dtbC9TZWxlY3QuandjCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICAKLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08IS0tICRJZCQgLS0+Ci08IURPQ1RZUEUgY29tcG9uZW50LXNwZWNpZmljYXRpb24gUFVCTElDIAotICAiLS8vQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24vL1RhcGVzdHJ5IFNwZWNpZmljYXRpb24gMy4wLy9FTiIgCi0gICJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL3RhcGVzdHJ5L2R0ZC9UYXBlc3RyeV8zXzAuZHRkIj4KLSAgCi08Y29tcG9uZW50LXNwZWNpZmljYXRpb24gY2xhc3M9Im9yZy5hcGFjaGUudGFwZXN0cnkud21sLlNlbGVjdCI+Ci0KLQk8ZGVzY3JpcHRpb24+Ci0JCVRoZSBXTUxTZWxlY3QgZWxlbWVudCBsZXRzIHVzZXJzIHBpY2sgZnJvbSBhIGxpc3Qgb2Ygb3B0aW9ucy4gRWFjaCBvcHRpb24gaXMgc3BlY2lmaWVkIAotCQlieSBhbiBPcHRpb24gZWxlbWVudC4gRWFjaCBPcHRpb24gZWxlbWVudCBtYXkgaGF2ZSBvbmUgbGluZSBvZiBmb3JtYXR0ZWQgdGV4dCAKLQkJKHdoaWNoIG1heSBiZSB3cmFwcGVkIG9yIHRydW5jYXRlZCBieSB0aGUgdXNlciBhZ2VudCBpZiB0b28gbG9uZykuIAotCQlPcHRpb24gZWxlbWVudHMgbWF5IGJlIG9yZ2FuaXNlZCBpbnRvIGhpZXJhcmNoaWNhbCBncm91cHMgdXNpbmcgdGhlIE9wdGlvbkdyb3VwIAotCQllbGVtZW50LiAKLQk8L2Rlc2NyaXB0aW9uPgotCi0JPHBhcmFtZXRlciBuYW1lPSJtdWx0aXBsZSIgdHlwZT0iYm9vbGVhbiIgZGlyZWN0aW9uPSJpbiI+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIFRoaXMgYXR0cmlidXRlIGluZGljYXRlcyB0aGF0IHRoZSBzZWxlY3QgbGlzdCBzaG91bGQgYWNjZXB0IG11bHRpcGxlIHNlbGVjdGlvbnMuIAotICAgICAgICAgICAgV2hlbiBub3Qgc2V0LCB0aGUgc2VsZWN0IGxpc3Qgc2hvdWxkIG9ubHkgYWNjZXB0IGEgc2luZ2xlIHNlbGVjdGVkIG9wdGlvbi4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLQk8L3BhcmFtZXRlcj4KLQotCTxwYXJhbWV0ZXIgbmFtZT0idGl0bGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciIGRpcmVjdGlvbj0iaW4iPgotCQk8ZGVzY3JpcHRpb24+Ci0JCQlUaGlzIGF0dHJpYnV0ZSBzcGVjaWZpZXMgYSB0aXRsZSBmb3IgdGhpcyBlbGVtZW50LCB3aGljaCBtYXkgYmUgdXNlZCBpbiB0aGUgCi0JCQlwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuCi0JCQlUaGlzIGF0dHJpYnV0ZSBzcGVjaWZpZXMgYSB0aXRsZSBmb3IgdGhpcyBlbGVtZW50LCB3aGljaCBtYXkgYmUgdXNlZCBpbiB0aGUgCi0JCQlwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuCi0JCTwvZGVzY3JpcHRpb24+Ci0JPC9wYXJhbWV0ZXI+Ci0KLQk8cGFyYW1ldGVyIG5hbWU9Im5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciIGRpcmVjdGlvbj0iaW4iPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBUaGUgbmFtZSBhdHRyaWJ1dGUgaW5kaWNhdGVzIHRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSB0byBzZXQgd2l0aCB0aGUgcmVzdWx0IAotICAgICAgICAgICAgb2YgdGhlIHNlbGVjdGlvbi4gVGhlIHZhcmlhYmxlIGlzIHNldCB0byB0aGUgc3RyaW5nIHZhbHVlIG9mIHRoZSBjaG9zZW4gb3B0aW9uCi0gICAgICAgICAgICBlbGVtZW50LCB3aGljaCBpcyBzcGVjaWZpZWQgd2l0aCB0aGUgdmFsdWUgYXR0cmlidXRlLiBUaGUgbmFtZSB2YXJpYWJsZSdzIHZhbHVlIAotICAgICAgICAgICAgaXMgdXNlZCB0byBwcmUtc2VsZWN0IG9wdGlvbnMgaW4gdGhlIHNlbGVjdCBsaXN0LgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgIDwvcGFyYW1ldGVyPgotCi0JPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgZGlyZWN0aW9uPSJpbiI+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIFRoZSB2YWx1ZSBhdHRyaWJ1dGUgaW5kaWNhdGVzIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSB2YXJpYWJsZSBuYW1lZCBpbiB0aGUgCi0gICAgICAgICAgICBuYW1lIGF0dHJpYnV0ZS4gV2hlbiB0aGUgZWxlbWVudCBpcyBkaXNwbGF5ZWQsIGFuZCB0aGUgdmFyaWFibGUgbmFtZWQgaW4gdGhlIAotICAgICAgICAgICAgbmFtZSBhdHRyaWJ1dGUgaXMgbm90IHNldCwgdGhlIG5hbWUgdmFyaWFibGUgbWF5IGJlIGFzc2lnbmVkIHRoZSB2YWx1ZSAKLSAgICAgICAgICAgIHNwZWNpZmllZCBpbiB0aGUgdmFsdWUgYXR0cmlidXRlLCBkZXBlbmRpbmcgb24gdGhlIHZhbHVlcyBkZWZpbmVkIGluIGluYW1lIGFuZCAKLSAgICAgICAgICAgIGl2YWx1ZS4gSWYgdGhlIG5hbWUgdmFyaWFibGUgYWxyZWFkeSBjb250YWlucyBhIHZhbHVlLCB0aGUgdmFsdWUgYXR0cmlidXRlIGlzIAotICAgICAgICAgICAgaWdub3JlZC4gQW55IGFwcGxpY2F0aW9uIG9mIHRoZSBkZWZhdWx0IHZhbHVlIGlzIGRvbmUgYmVmb3JlIHRoZSBsaXN0IGlzIAotICAgICAgICAgICAgcHJlLXNlbGVjdGVkIHdpdGggdGhlIHZhbHVlIG9mIHRoZSBuYW1lIHZhcmlhYmxlLgotICAgICAgICAgICAgSWYgdGhpcyBlbGVtZW50IGFsbG93cyB0aGUgc2VsZWN0aW9uIG9mIG11bHRpcGxlIG9wdGlvbnMsIHRoZSByZXN1bHQgb2YgdGhlIAotICAgICAgICAgICAgdXNlcidzIGNob2ljZSBpcyBhIGxpc3Qgb2YgYWxsIHNlbGVjdGVkIHZhbHVlcywgc2VwYXJhdGVkIGJ5IHRoZSBzZW1pY29sb24gCi0gICAgICAgICAgICBjaGFyYWN0ZXIuIFRoZSBuYW1lIHZhcmlhYmxlIGlzIHNldCB3aXRoIHRoaXMgcmVzdWx0LiBJbiBhZGRpdGlvbiwgdGhlIHZhbHVlIAotICAgICAgICAgICAgYXR0cmlidXRlIGlzIGludGVycHJldGVkIGFzIGEgc2VtaWNvbG9uLXNlcGFyYXRlZCBsaXN0IG9mIHByZS1zZWxlY3RlZCBvcHRpb25zLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotCTwvcGFyYW1ldGVyPgotCi08L2NvbXBvbmVudC1zcGVjaWZpY2F0aW9uPgpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3dtbC9TZWxlY3Rpb25GaWVsZC5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3dtbC9TZWxlY3Rpb25GaWVsZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmZjMWM5Li4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS93bWwvU2VsZWN0aW9uRmllbGQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LndtbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlcXVlc3RDeWNsZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LmZvcm0uSVByb3BlcnR5U2VsZWN0aW9uTW9kZWw7Ci0KLS8qKgotICogIFNlbGVjdGlvbkZpZWxkIHNwZWNpZmllcyBhIHBvc3RmaWVsZCBlbGVtZW50IGFuZCBpdCBpcyB1c2VkIHRvIGNvbXBsZW1lbnQgdGhlIHtAbGluayBQcm9wZXJ0eVNlbGVjdGlvbn0gY29tcG9uZW50LgotICoKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQGF1dGhvciBEYXZpZCBTb2xpcwotICogIEBzaW5jZSAzLjAKLSAqCi0gKiovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2VsZWN0aW9uRmllbGQgZXh0ZW5kcyBBYnN0cmFjdFBvc3RmaWVsZAotewotICAgIHByb3RlY3RlZCB2b2lkIHJld2luZChJUmVxdWVzdEN5Y2xlIGN5Y2xlKQotICAgIHsKLSAgICAgICAgU3RyaW5nIG9wdGlvblZhbHVlID0gY3ljbGUuZ2V0UmVxdWVzdENvbnRleHQoKS5nZXRQYXJhbWV0ZXIoZ2V0TmFtZSgpKTsKLSAgICAgICAgSVByb3BlcnR5U2VsZWN0aW9uTW9kZWwgbW9kZWwgPSBnZXRNb2RlbCgpOwotICAgICAgICBPYmplY3QgdmFsdWUgPSAob3B0aW9uVmFsdWUgPT0gbnVsbCkgPyBudWxsIDogbW9kZWwudHJhbnNsYXRlVmFsdWUob3B0aW9uVmFsdWUpOwotCi0gICAgICAgIHVwZGF0ZVZhbHVlKHZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgSVByb3BlcnR5U2VsZWN0aW9uTW9kZWwgZ2V0TW9kZWwoKTsKLX0KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS93bWwvU2VsZWN0aW9uRmllbGQuandjIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3dtbC9TZWxlY3Rpb25GaWVsZC5qd2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmMzVmYWEuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3dtbC9TZWxlY3Rpb25GaWVsZC5qd2MKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gIAotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTwhLS0gJElkJCAtLT4KLTwhRE9DVFlQRSBjb21wb25lbnQtc3BlY2lmaWNhdGlvbiBQVUJMSUMKLSAgIi0vL0FwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLy9UYXBlc3RyeSBTcGVjaWZpY2F0aW9uIDMuMC8vRU4iCi0gICJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL3RhcGVzdHJ5L2R0ZC9UYXBlc3RyeV8zXzAuZHRkIj4KLQotPGNvbXBvbmVudC1zcGVjaWZpY2F0aW9uIGNsYXNzPSJvcmcuYXBhY2hlLnRhcGVzdHJ5LndtbC5TZWxlY3Rpb25GaWVsZCIgYWxsb3ctYm9keT0ibm8iPgotCi0gICAgPGRlc2NyaXB0aW9uPgotICAgICAgICBTZWxlY3Rpb25GaWVsZCBzcGVjaWZpZXMgYSBwb3N0ZmllbGQgZWxlbWVudCBhbmQgaXQgaXMgdXNlZCB0byBjb21wbGVtZW50IHRoZSBQcm9wZXJ0eVNlbGVjdGlvbiBjb21wb25lbnQuCi0gICAgPC9kZXNjcmlwdGlvbj4KLQotICAgIDxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHJlcXVpcmVkPSJ5ZXMiIHR5cGU9ImphdmEubGFuZy5PYmplY3QiLz4KLQotICAgIDxwYXJhbWV0ZXIgbmFtZT0ibW9kZWwiCi0gICAgICAgIHR5cGU9Im9yZy5hcGFjaGUudGFwZXN0cnkuZm9ybS5JUHJvcGVydHlTZWxlY3Rpb25Nb2RlbCIKLSAgICAgICAgcmVxdWlyZWQ9InllcyIKLSAgICAgICAgZGlyZWN0aW9uPSJhdXRvIi8+Ci0KLSAgICA8cGFyYW1ldGVyIG5hbWU9Im5hbWUiIHByb3BlcnR5LW5hbWU9InZhck5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciIGRpcmVjdGlvbj0iaW4iIHJlcXVpcmVkPSJ5ZXMiPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBUaGUgbmFtZSBhdHRyaWJ1dGUgc3BlY2lmaWVzIGFuIFdNTCB2YXJpYWJsZSBuYW1lLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgIDwvcGFyYW1ldGVyPgotCi0gICAgPHJlc2VydmVkLXBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIvPgotCi0gICAgPHByb3BlcnR5LXNwZWNpZmljYXRpb24gbmFtZT0ibmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgotICAgIDxwcm9wZXJ0eS1zcGVjaWZpY2F0aW9uIG5hbWU9ImZvcm0iIHR5cGU9Im9yZy5hcGFjaGUudGFwZXN0cnkuSUZvcm0iLz4KLQotPC9jb21wb25lbnQtc3BlY2lmaWNhdGlvbj4KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS93bWwvU2V0dmFyLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvd21sL1NldHZhci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2IzMDBlLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS93bWwvU2V0dmFyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS53bWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LkFic3RyYWN0Q29tcG9uZW50OwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSUJpbmRpbmc7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JTWFya3VwV3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuSVJlcXVlc3RDeWNsZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LlRhcGVzdHJ5OwotCi0vKioKLSAqICBUaGUgc2V0dmFyIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSB2YXJpYWJsZSB0byBzZXQgaW4gdGhlIGN1cnJlbnQgYnJvd3NlciBjb250ZXh0IGFzIGEgc2lkZSBlZmZlY3Qgb2YgZXhlY3V0aW5nIGEgdGFzay4KLSAqCi0gKiAgQHZlcnNpb24gJElkJAotICogIEBhdXRob3IgRGF2aWQgU29saXMKLSAqICBAc2luY2UgMy4wCi0gKgotICovCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTZXR2YXIgZXh0ZW5kcyBBYnN0cmFjdENvbXBvbmVudAotewotICAgIC8qKgotICAgICAqICBAc2VlIEFic3RyYWN0Q29tcG9uZW50I3JlbmRlckNvbXBvbmVudChJTWFya3VwV3JpdGVyLCBJUmVxdWVzdEN5Y2xlKQotICAgICAqKi8KLQotICAgIHByb3RlY3RlZCB2b2lkIHJlbmRlckNvbXBvbmVudChJTWFya3VwV3JpdGVyIHdyaXRlciwgSVJlcXVlc3RDeWNsZSBjeWNsZSkKLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gcmVuZGVyID0gIWN5Y2xlLmlzUmV3aW5kaW5nKCk7Ci0KLSAgICAgICAgaWYgKHJlbmRlcikKLSAgICAgICAgewotICAgICAgICAgICAgd3JpdGVyLmJlZ2luRW1wdHkoInNldHZhciIpOwotCi0gICAgICAgICAgICB3cml0ZXIuYXR0cmlidXRlKCJuYW1lIiwgZ2V0TmFtZSgpKTsKLQotICAgICAgICAgICAgcmVuZGVySW5mb3JtYWxQYXJhbWV0ZXJzKHdyaXRlciwgY3ljbGUpOwotCi0gICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSByZWFkVmFsdWUoKTsKLSAgICAgICAgICAgIGlmIChUYXBlc3RyeS5pc05vbkJsYW5rKHZhbHVlKSkKLSAgICAgICAgICAgICAgICB3cml0ZXIuYXR0cmlidXRlKCJ2YWx1ZSIsIHZhbHVlKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB3cml0ZXIuYXR0cmlidXRlKCJ2YWx1ZSIsICIiKTsKLQotICAgICAgICAgICAgd3JpdGVyLmNsb3NlVGFnKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldE5hbWUoKTsKLQotICAgIHB1YmxpYyBhYnN0cmFjdCBJQmluZGluZyBnZXRWYWx1ZUJpbmRpbmcoKTsKLQotICAgIHB1YmxpYyBTdHJpbmcgcmVhZFZhbHVlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRWYWx1ZUJpbmRpbmcoKS5nZXRTdHJpbmcoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS93bWwvU2V0dmFyLmp3YyBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS93bWwvU2V0dmFyLmp3YwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWIxN2IyMC4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvd21sL1NldHZhci5qd2MKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gIAotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTwhLS0gJElkJCAtLT4KLTwhRE9DVFlQRSBjb21wb25lbnQtc3BlY2lmaWNhdGlvbiBQVUJMSUMKLSAgIi0vL0FwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLy9UYXBlc3RyeSBTcGVjaWZpY2F0aW9uIDMuMC8vRU4iIAotICAiaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy90YXBlc3RyeS9kdGQvVGFwZXN0cnlfM18wLmR0ZCI+Ci0KLTxjb21wb25lbnQtc3BlY2lmaWNhdGlvbiBjbGFzcz0ib3JnLmFwYWNoZS50YXBlc3RyeS53bWwuU2V0dmFyIiBhbGxvdy1ib2R5PSJubyI+Ci0KLSAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgIFRoZSBzZXR2YXIgZWxlbWVudCBzcGVjaWZpZXMgdGhlIHZhcmlhYmxlIHRvIHNldCBpbiB0aGUgY3VycmVudCBicm93c2VyIGNvbnRleHQgYXMgYSBzaWRlIGVmZmVjdCBvZiBleGVjdXRpbmcKLSAgICAgICAgYSB0YXNrLgotICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJuYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIiBkaXJlY3Rpb249ImluIiByZXF1aXJlZD0ieWVzIj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgVGhlIG5hbWUgYXR0cmlidXRlIHNwZWNpZmllcyBhIFdNTCB2YXJpYWJsZSBuYW1lLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgIDwvcGFyYW1ldGVyPgotCi0gICAgPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgcmVxdWlyZWQ9InllcyI+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIEJpbmQgdmFsdWUgdG8gdGhlIHZhcmlhYmxlIHRoYXQgc2hvdWxkIHJlY2lldmUgdGhlIHVzZXIgaW5wdXQgc3RyaW5nLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgIDwvcGFyYW1ldGVyPgotCi08L2NvbXBvbmVudC1zcGVjaWZpY2F0aW9uPgpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3dtbC9UaW1lci5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3dtbC9UaW1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmJhNWE3Li4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS93bWwvVGltZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LndtbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuQWJzdHJhY3RDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JQmluZGluZzsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklNYXJrdXBXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVxdWVzdEN5Y2xlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuVGFwZXN0cnk7Ci0KLS8qKgotICogIFRoZSBUaW1lciBlbGVtZW50IGRlY2xhcmVzIGEgY2FyZCB0aW1lciwgd2hpY2ggZXhwb3NlcyBhIG1lYW5zIG9mIHByb2Nlc3NpbmcgaW5hY3Rpdml0eSBvciBpZGxlIHRpbWUuCi0gKiAgVGhlIHRpbWVyIGlzIGluaXRpYWxpc2VkIGFuZCBzdGFydGVkIGF0IGNhcmQgZW50cnkgYW5kIGlzIHN0b3BwZWQgd2hlbiB0aGUgY2FyZCBpcyBleGl0ZWQuCi0gKgotICogIEB2ZXJzaW9uICRJZCQKLSAqICBAYXV0aG9yIERhdmlkIFNvbGlzCi0gKiAgQHNpbmNlIDMuMAotICovCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUaW1lciBleHRlbmRzIEFic3RyYWN0Q29tcG9uZW50Ci17Ci0gICAgLyoqCi0gICAgICogIEBzZWUgQWJzdHJhY3RDb21wb25lbnQjcmVuZGVyQ29tcG9uZW50KElNYXJrdXBXcml0ZXIsIElSZXF1ZXN0Q3ljbGUpCi0gICAgICoqLwotCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVuZGVyQ29tcG9uZW50KElNYXJrdXBXcml0ZXIgd3JpdGVyLCBJUmVxdWVzdEN5Y2xlIGN5Y2xlKQotICAgIHsKLSAgICAgICAgYm9vbGVhbiByZW5kZXIgPSAhY3ljbGUuaXNSZXdpbmRpbmcoKTsKLQotICAgICAgICBpZiAocmVuZGVyKQotICAgICAgICB7Ci0gICAgICAgICAgICB3cml0ZXIuYmVnaW5FbXB0eSgidGltZXIiKTsKLQotICAgICAgICAgICAgd3JpdGVyLmF0dHJpYnV0ZSgibmFtZSIsIGdldE5hbWUoKSk7Ci0KLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IHJlYWRWYWx1ZSgpOwotICAgICAgICAgICAgaWYgKFRhcGVzdHJ5LmlzTm9uQmxhbmsodmFsdWUpKQotICAgICAgICAgICAgICAgIHdyaXRlci5hdHRyaWJ1dGUoInZhbHVlIiwgdmFsdWUpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHdyaXRlci5hdHRyaWJ1dGUoInZhbHVlIiwgIjAiKTsKLQotICAgICAgICAgICAgcmVuZGVySW5mb3JtYWxQYXJhbWV0ZXJzKHdyaXRlciwgY3ljbGUpOwotCi0gICAgICAgICAgICB3cml0ZXIuY2xvc2VUYWcoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0TmFtZSgpOwotCi0gICAgcHVibGljIGFic3RyYWN0IElCaW5kaW5nIGdldFZhbHVlQmluZGluZygpOwotCi0gICAgcHVibGljIFN0cmluZyByZWFkVmFsdWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldFZhbHVlQmluZGluZygpLmdldFN0cmluZygpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS93bWwvVGltZXIuandjIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3dtbC9UaW1lci5qd2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhNjc4MDUuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3dtbC9UaW1lci5qd2MKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gIAotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTwhLS0gJElkJCAtLT4KLTwhRE9DVFlQRSBjb21wb25lbnQtc3BlY2lmaWNhdGlvbiBQVUJMSUMKLSAgIi0vL0FwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLy9UYXBlc3RyeSBTcGVjaWZpY2F0aW9uIDMuMC8vRU4iIAotICAiaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy90YXBlc3RyeS9kdGQvVGFwZXN0cnlfM18wLmR0ZCI+Ci0KLTxjb21wb25lbnQtc3BlY2lmaWNhdGlvbiBjbGFzcz0ib3JnLmFwYWNoZS50YXBlc3RyeS53bWwuVGltZXIiIGFsbG93LWJvZHk9Im5vIj4KLQotICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgVGhlIFRpbWVyIGVsZW1lbnQgZGVjbGFyZXMgYSBjYXJkIHRpbWVyLCB3aGljaCBleHBvc2VzIGEgbWVhbnMgb2YgcHJvY2Vzc2luZyBpbmFjdGl2aXR5IG9yIGlkbGUgdGltZS4KLSAgICAgICAgVGhlIHRpbWVyIGlzIGluaXRpYWxpc2VkIGFuZCBzdGFydGVkIGF0IGNhcmQgZW50cnkgYW5kIGlzIHN0b3BwZWQgd2hlbiB0aGUgY2FyZCBpcyBleGl0ZWQuCi0gICAgPC9kZXNjcmlwdGlvbj4KLQotICAgIDxwYXJhbWV0ZXIgbmFtZT0ibmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgZGlyZWN0aW9uPSJpbiI+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIFRoZSBuYW1lIGF0dHJpYnV0ZSBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRvIGJlIHNldCB3aXRoIHRoZSB2YWx1ZSBvZiB0aGUgdGltZXIuIFRoZSBuYW1lCi0gICAgICAgICAgICB2YXJpYWJsZSdzIHZhbHVlIGlzIHVzZWQgdG8gc2V0IHRoZSB0aW1lb3V0IHBlcmlvZCB1cG9uIHRpbWVyIGluaXRpYWxpc2F0aW9uLiBUaGUgdmFyaWFibGUgbmFtZWQgYnkgdGhlCi0gICAgICAgICAgICBuYW1lIGF0dHJpYnV0ZSB3aWxsIGJlIHNldCB3aXRoIHRoZSBjdXJyZW50IHRpbWVyIHZhbHVlIHdoZW4gdGhlIGNhcmQgaXMgZXhpdGVkIG9yIHdoZW4gdGhlIHRpbWVyIGV4cGlyZXMuCi0gICAgICAgICAgICBGb3IgZXhhbXBsZSwgaWYgdGhlIHRpbWVyIGV4cGlyZXMsIHRoZSBuYW1lIHZhcmlhYmxlIGlzIHNldCB0byBhIHZhbHVlIG9mICIwIi4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICA8L3BhcmFtZXRlcj4KLQotICAgIDxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBUaGUgdmFsdWUgYXR0cmlidXRlIGluZGljYXRlcyB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgdmFyaWFibGUgbmFtZWQgaW4gdGhlIG5hbWUgYXR0cmlidXRlLiBXaGVuIHRoZQotICAgICAgICAgICAgdGltZXIgaXMgaW5pdGlhbGlzZWQgYW5kIHRoZSB2YXJpYWJsZSBuYW1lZCBpbiB0aGUgbmFtZSBhdHRyaWJ1dGUgaXMgbm90IHNldCwgdGhlIG5hbWUgdmFyaWFibGUgaXMgYXNzaWduZWQKLSAgICAgICAgICAgIHRoZSB2YWx1ZSBzcGVjaWZpZWQgaW4gdGhlIHZhbHVlIGF0dHJpYnV0ZS4gSWYgdGhlIG5hbWUgdmFyaWFibGUgYWxyZWFkeSBjb250YWlucyBhIHZhbHVlLCB0aGUgdmFsdWUKLSAgICAgICAgICAgIGF0dHJpYnV0ZSBpcyBpZ25vcmVkLiBJZiB0aGUgbmFtZSBhdHRyaWJ1dGUgaXMgbm90IHNwZWNpZmllZCwgdGhlIHRpbWVvdXQgaXMgYWx3YXlzIGluaXRpYWxpc2VkIHRvIHRoZQotICAgICAgICAgICAgdmFsdWUgc3BlY2lmaWVkIGluIHRoZSB2YWx1ZSBhdHRyaWJ1dGUuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgPC9wYXJhbWV0ZXI+Ci0KLTwvY29tcG9uZW50LXNwZWNpZmljYXRpb24+CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvd21sL1dNTC5saWJyYXJ5IGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3dtbC9XTUwubGlicmFyeQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFjYzU1Ny4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvd21sL1dNTC5saWJyYXJ5CisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAgCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPCEtLSAkSWQkIC0tPgotPCFET0NUWVBFIGxpYnJhcnktc3BlY2lmaWNhdGlvbiBQVUJMSUMKLSAgIi0vL0FwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLy9UYXBlc3RyeSBTcGVjaWZpY2F0aW9uIDMuMC8vRU4iCi0gICJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL3RhcGVzdHJ5L2R0ZC9UYXBlc3RyeV8zXzAuZHRkIj4KLQotPGxpYnJhcnktc3BlY2lmaWNhdGlvbj4KLSAgICA8cHJvcGVydHkgbmFtZT0ib3JnLmFwYWNoZS50YXBlc3RyeS50ZW1wbGF0ZS1leHRlbnNpb24iIHZhbHVlPSJ3bWwiLz4KLQotICAgIDxjb21wb25lbnQtdHlwZSB0eXBlPSJDYXJkIiBzcGVjaWZpY2F0aW9uLXBhdGg9Ii9vcmcvYXBhY2hlL3RhcGVzdHJ5L3dtbC9DYXJkLmp3YyIvPgotICAgIDxjb21wb25lbnQtdHlwZSB0eXBlPSJEbyIgc3BlY2lmaWNhdGlvbi1wYXRoPSIvb3JnL2FwYWNoZS90YXBlc3RyeS93bWwvRG8uandjIi8+Ci0gICAgPGNvbXBvbmVudC10eXBlIHR5cGU9IkdvIiBzcGVjaWZpY2F0aW9uLXBhdGg9Ii9vcmcvYXBhY2hlL3RhcGVzdHJ5L3dtbC9Hby5qd2MiLz4KLSAgICA8Y29tcG9uZW50LXR5cGUgdHlwZT0iSW5wdXQiIHNwZWNpZmljYXRpb24tcGF0aD0iL29yZy9hcGFjaGUvdGFwZXN0cnkvd21sL0lucHV0Lmp3YyIvPgotICAgIDxjb21wb25lbnQtdHlwZSB0eXBlPSJPbkV2ZW50IiBzcGVjaWZpY2F0aW9uLXBhdGg9Ii9vcmcvYXBhY2hlL3RhcGVzdHJ5L3dtbC9PbkV2ZW50Lmp3YyIvPgotICAgIDxjb21wb25lbnQtdHlwZSB0eXBlPSJQb3N0ZmllbGQiIHNwZWNpZmljYXRpb24tcGF0aD0iL29yZy9hcGFjaGUvdGFwZXN0cnkvd21sL1Bvc3RmaWVsZC5qd2MiLz4KLSAgICA8Y29tcG9uZW50LXR5cGUgdHlwZT0iU2V0dmFyIiBzcGVjaWZpY2F0aW9uLXBhdGg9Ii9vcmcvYXBhY2hlL3RhcGVzdHJ5L3dtbC9TZXR2YXIuandjIi8+Ci0gICAgPGNvbXBvbmVudC10eXBlIHR5cGU9IlRpbWVyIiBzcGVjaWZpY2F0aW9uLXBhdGg9Ii9vcmcvYXBhY2hlL3RhcGVzdHJ5L3dtbC9UaW1lci5qd2MiLz4KLSAgICA8Y29tcG9uZW50LXR5cGUgdHlwZT0iSW1hZ2UiIHNwZWNpZmljYXRpb24tcGF0aD0iL29yZy9hcGFjaGUvdGFwZXN0cnkvd21sL0ltYWdlLmp3YyIvPgotICAgIDxjb21wb25lbnQtdHlwZSB0eXBlPSJPcHRpb24iIHNwZWNpZmljYXRpb24tcGF0aD0iL29yZy9hcGFjaGUvdGFwZXN0cnkvd21sL09wdGlvbi5qd2MiLz4KLSAgICA8Y29tcG9uZW50LXR5cGUgdHlwZT0iUHJvcGVydHlTZWxlY3Rpb24iIHNwZWNpZmljYXRpb24tcGF0aD0iL29yZy9hcGFjaGUvdGFwZXN0cnkvd21sL1Byb3BlcnR5U2VsZWN0aW9uLmp3YyIvPgotICAgIDxjb21wb25lbnQtdHlwZSB0eXBlPSJTZWxlY3QiIHNwZWNpZmljYXRpb24tcGF0aD0iL29yZy9hcGFjaGUvdGFwZXN0cnkvd21sL1NlbGVjdC5qd2MiLz4KLSAgICA8Y29tcG9uZW50LXR5cGUgdHlwZT0iU2VsZWN0aW9uRmllbGQiIHNwZWNpZmljYXRpb24tcGF0aD0iL29yZy9hcGFjaGUvdGFwZXN0cnkvd21sL1NlbGVjdGlvbkZpZWxkLmp3YyIvPgotCi08L2xpYnJhcnktc3BlY2lmaWNhdGlvbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvd21sL1dNTEVuZ2luZS5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3dtbC9XTUxFbmdpbmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU1MTEwMS4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvd21sL1dNTEVuZ2luZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLy8gIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGFwZXN0cnkud21sOwotCi1pbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5JUmVxdWVzdEN5Y2xlOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkuVGFwZXN0cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5lbmdpbmUuQmFzZUVuZ2luZTsKLQotLyoqCi0gKiAgU3ViY2xhc3Mgb2Yge0BsaW5rIEJhc2VFbmdpbmV9IHVzZWQgZm9yIFdNTCBhcHBsaWNhdGlvbnMgdG8gY2hhbmdlIHRoZQotICogIEV4Y2VwdGlvbiwgU3RhbGVMaW5rIGFuZCBTdGFsZVNlc3Npb24gcGFnZXMuCi0gKgotICogIEBhdXRob3IgRGF2aWQgU29saXMKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQHNpbmNlIDMuMAotICogCi0gKiovCi0KLXB1YmxpYyBjbGFzcyBXTUxFbmdpbmUgZXh0ZW5kcyBCYXNlRW5naW5lCi17Ci0JcHJvdGVjdGVkIHZvaWQgYWN0aXZhdGVFeGNlcHRpb25QYWdlKAotCQlJUmVxdWVzdEN5Y2xlIGN5Y2xlLAotCQlvcmcuYXBhY2hlLnRhcGVzdHJ5LnJlcXVlc3QuUmVzcG9uc2VPdXRwdXRTdHJlYW0gb3V0cHV0LAotCQlUaHJvd2FibGUgY2F1c2UpCi0JCXRocm93cyBTZXJ2bGV0RXhjZXB0aW9uCi0JewotCQlzdXBlci5hY3RpdmF0ZUV4Y2VwdGlvblBhZ2UoY3ljbGUsIG91dHB1dCwgY2F1c2UpOwotCQkvLyBTb21ldGltZXMgdGhlIGV4Y2VwdGlvbiBwYWdlIGlzbid0IGVub3VnaAotICAgICAgICByZXBvcnRFeGNlcHRpb24oCi0gICAgICAgICAgICBUYXBlc3RyeS5nZXRNZXNzYWdlKCJBYnN0cmFjdEVuZ2luZS51bmFibGUtdG8tcHJvY2Vzcy1jbGllbnQtcmVxdWVzdCIpLAotICAgICAgICAgICAgY2F1c2UpOwotCX0KLQotCi0JLyoqIEBzaW5jZSAzLjAgKiovCi0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEV4Y2VwdGlvblBhZ2VOYW1lKCkKLQl7Ci0JCXJldHVybiBFWENFUFRJT05fUEFHRTsKLQl9Ci0JCi0JLyoqIEBzaW5jZSAzLjAgKiovCi0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFN0YWxlTGlua1BhZ2VOYW1lKCkKLQl7Ci0JCXJldHVybiBTVEFMRV9MSU5LX1BBR0U7Ci0JfQotCi0JLyoqIEBzaW5jZSAzLjAgKiovCi0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFN0YWxlU2Vzc2lvblBhZ2VOYW1lKCkKLQl7Ci0JCXJldHVybiBTVEFMRV9TRVNTSU9OX1BBR0U7Ci0JfQotCi0JLyoqCi0JICogIFRoZSBuYW1lIG9mIHRoZSBwYWdlIHVzZWQgZm9yIHJlcG9ydGluZyBleGNlcHRpb25zLgotCSAqICAKLQkgKiovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYQ0VQVElPTl9QQUdFID0gIldNTEV4Y2VwdGlvbiI7Ci0KLQkvKioKLQkgKiAgVGhlIG5hbWUgb2YgdGhlIHBhZ2UgdXNlZCBmb3IgcmVwb3J0aW5nIHN0YWxlIGxpbmtzLgotCSAqCi0JICogKi8KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFMRV9MSU5LX1BBR0UgPSAiV01MU3RhbGVMaW5rIjsKLQotCS8qKgotCSAqICBUaGUgbmFtZSBvZiB0aGUgcGFnZSB1c2VkIGZvciByZXBvcnRpbmcgc3RhdGUgc2Vzc2lvbnMuCi0JICoKLQkgKiovCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBTEVfU0VTU0lPTl9QQUdFID0gIldNTFN0YWxlU2Vzc2lvbiI7Ci19CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvd21sL1dNTFdyaXRlci5qYXZhIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3dtbC9XTUxXcml0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTNlMDM5OC4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvd21sL1dNTFdyaXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LndtbDsKLQotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS5BYnN0cmFjdE1hcmt1cFdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LklNYXJrdXBXcml0ZXI7Ci0KLS8qKgotICogIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBjcmVhdGUgV01MIG91dHB1dC4KLSAqCi0gKiAgPHA+VGhlIDxjb2RlPldNTFJlc3BvbnNlV3JpdGVyPC9jb2RlPiBoYW5kbGVzIHRoZSBuZWNlc3NhcnkgZXNjYXBpbmcgCi0gKiAgb2YgaW52YWxpZCBjaGFyYWN0ZXJzLgotICogIFNwZWNpZmljYWxseSwgdGhlICckJywgJyZsdDsnLCAnJmd0OycgYW5kICcmYW1wOycgY2hhcmFjdGVycyBhcmUgcHJvcGVybHkKLSAqICBjb252ZXJ0ZWQgdG8gdGhlaXIgV01MIGVudGl0aWVzIGJ5IHRoZSA8Y29kZT5wcmludCgpPC9jb2RlPiBtZXRob2RzLgotICogIFNpbWlsYXIgbWVhc3VyZXMgYXJlIHRha2VuIGJ5IHRoZSB7QGxpbmsgI2F0dHJpYnV0ZShTdHJpbmcsIFN0cmluZyl9IG1ldGhvZC4KLSAqICBPdGhlciBpbnZhbGlkIGNoYXJhY3RlcnMgYXJlIGNvbnZlcnRlZCB0byB0aGVpciBudW1lcmljIGVudGl0eSBlcXVpdmFsZW50LgotICoKLSAqICA8cD5UaGlzIGNsYXNzIG1ha2VzIGl0IGVhc3kgdG8gZ2VuZXJhdGUgdHJpdmlhbCBhbmQgbm9uLXRyaXZpYWwgV01MIHBhZ2VzLgotICogIEl0IGlzIGFsc28gdXNlZnVsIHRvIGdlbmVyYXRlIFdNTCBzbmlwcGV0cy4gSXQncyBhYmlsaXR5IHRvIGRvIHNpbXBsZQotICogIGZvcm1hdHRpbmcgaXMgdmVyeSB1c2VmdWwuIEEgSlNQIG1heSBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIGNsYXNzCi0gKiAgYW5kIHVzZSBpdCBhcyBhbiBhbHRlcm5hdGl2ZSB0byB0aGUgc2ltcGxlLW1pbmRlZCA8Yj4mbHQ7JT0gLi4uICUmZ3Q7PC9iPgotICogIGNvbnN0cnVjdCwgZXNwY2lhbGx5IGJlY2F1c2UgaXQgY2FuIGhhbmRsZSBudWxsIG1vcmUgY2xlYW5seS4KLSAqCi0gKiAgQHZlcnNpb24gJElkJAotICogIEBhdXRob3IgRGF2aWQgU29saXMKLSAqICBAc2luY2UgMC4yLjkKLSAqIAotICoqLwotCi1wdWJsaWMgY2xhc3MgV01MV3JpdGVyIGV4dGVuZHMgQWJzdHJhY3RNYXJrdXBXcml0ZXIKLXsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGVudGl0aWVzID0gbmV3IFN0cmluZ1s2NF07Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbltdIHNhZmUgPSBuZXcgYm9vbGVhblsxMjhdOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTQUZFX0NIQVJBQ1RFUlMgPQotICAgICAgICAiMDEyMzQ1Njc4OTAiCi0gICAgICAgICAgICArICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiIKLSAgICAgICAgICAgICsgIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIgotICAgICAgICAgICAgKyAiXHRcblxyICFcIiMlJygpKissLS4vOjs9P0BbXFxdXl9ge3x9fiI7Ci0KLSAgICBzdGF0aWMgewotICAgICAgICBlbnRpdGllc1snIiddID0gIiZxdW90OyI7Ci0gICAgICAgIGVudGl0aWVzWyc8J10gPSAiJmx0OyI7Ci0gICAgICAgIGVudGl0aWVzWyc+J10gPSAiJmd0OyI7Ci0gICAgICAgIGVudGl0aWVzWycmJ10gPSAiJmFtcDsiOwotICAgICAgICBlbnRpdGllc1snJCddID0gIiQkIjsKLQotICAgICAgICBpbnQgbGVuZ3RoID0gU0FGRV9DSEFSQUNURVJTLmxlbmd0aCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQotICAgICAgICAgICAgc2FmZVtTQUZFX0NIQVJBQ1RFUlMuY2hhckF0KGkpXSA9IHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIENyZWF0ZXMgYSByZXNwb25zZSB3cml0ZXIgZm9yIGNvbnRlbnQgdHlwZSAidGV4dC92bmQud2FwLndtbCIuCi0gICAgICogCi0gICAgICoqLwotCi0gICAgcHVibGljIFdNTFdyaXRlcihPdXRwdXRTdHJlYW0gc3RyZWFtKQotICAgIHsKLSAgICAgICAgdGhpcyhzdHJlYW0sICJVVEYtOCIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEBwYXJhbSBzdHJlYW0gdGhlIG91dHB1dCBzdHJlYW0gd2hlcmUgdG8gd3JpdGUgdGhlIHRleHQKLSAgICAgKiBAcGFyYW0gZW5jb2RpbmcgdGhlIGVuY29kaW5nIHRvIGJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIG91dHB1dAotICAgICAqIEBzaW5jZSAzLjAKLSAgICAgKiAKLSAgICAgKiovCi0gICAgcHVibGljIFdNTFdyaXRlcihPdXRwdXRTdHJlYW0gc3RyZWFtLCBTdHJpbmcgZW5jb2RpbmcpCi0gICAgewotICAgICAgICB0aGlzKCJ0ZXh0L3ZuZC53YXAud21sIiwgZW5jb2RpbmcsIHN0cmVhbSk7Ci0gICAgfQotCi0gICAgcHVibGljIFdNTFdyaXRlcihTdHJpbmcgY29udGVudFR5cGUsIE91dHB1dFN0cmVhbSBzdHJlYW0pCi0gICAgewotICAgICAgICBzdXBlcihzYWZlLCBlbnRpdGllcywgY29udGVudFR5cGUsIHN0cmVhbSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHBhcmFtIG1pbWVUeXBlIHRoZSBNSU1FIHR5cGUgdG8gYmUgdXNlZCB0byBnZW5lcmF0ZSB0aGUgY29udGVudCB0eXBlCi0gICAgICogQHBhcmFtIGVuY29kaW5nIHRoZSBlbmNvZGluZyB0byBiZSB1c2VkIHRvIGdlbmVyYXRlIHRoZSBvdXRwdXQKLSAgICAgKiBAcGFyYW0gc3RyZWFtIHRoZSBvdXRwdXQgc3RyZWFtIHdoZXJlIHRvIHdyaXRlIHRoZSB0ZXh0Ci0gICAgICogQHNpbmNlIDMuMAotICAgICAqIAotICAgICAqKi8KLSAgICBwdWJsaWMgV01MV3JpdGVyKFN0cmluZyBtaW1lVHlwZSwgU3RyaW5nIGVuY29kaW5nLCBPdXRwdXRTdHJlYW0gc3RyZWFtKQotICAgIHsKLSAgICAgICAgc3VwZXIoc2FmZSwgZW50aXRpZXMsIG1pbWVUeXBlLCBlbmNvZGluZywgc3RyZWFtKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgV01MV3JpdGVyKFN0cmluZyBjb250ZW50VHlwZSkKLSAgICB7Ci0gICAgICAgIHN1cGVyKHNhZmUsIGVudGl0aWVzLCBjb250ZW50VHlwZSk7Ci0gICAgfQotCi0gICAgcHVibGljIElNYXJrdXBXcml0ZXIgZ2V0TmVzdGVkV3JpdGVyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgTmVzdGVkV01MV3JpdGVyKHRoaXMpOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvd21sL3BhY2thZ2UuaHRtbCBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS93bWwvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTc1NzE2Li4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS93bWwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotPCFkb2N0eXBlIGh0bWwgcHVibGljICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLTwhLS0gJElkJCAtLT4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+VGFwZXN0cnk6IFdlYiBBcHBsaWNhdGlvbiBGcmFtZXdvcms8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci0KLTxwPkNsYXNzZXMgYW5kIGNvbXBvbmVudHMgZm9yIG1haW4gZWxlbWVudHMgb2YgdGhlIFdpcmVsZXNzIE1hcmt1cCBMYW5ndWFnZSAoV01MIDEuMikuCi0KLTx1bD4KLTxsaT57QGxpbmsgb3JnLmFwYWNoZS50YXBlc3RyeS53bWwuRGVja30gaXMgYW4gYWx0ZXJuYXRpdmUgdG8KLXtAbGluayBvcmcuYXBhY2hlLnRhcGVzdHJ5Lmh0bWwuQmFzZVBhZ2V9IHRoYXQgcHJvdmlkZXMgYSA8Y29kZT50ZXh0L3dtbDwvY29kZT4gcmVzcG9uc2UuPC9saT4KLTxsaT5CYXNpYyBzdXBwb3J0IGZvciBXTUxTY3JpcHQuPC9saT4KLTxsaT48Yj5ObyBzdXBwb3J0IGZvciBXTUwgc3R5bGUgdGFibGVzLjwvbGk+Ci08L3VsPgotIAotQGF1dGhvciBIb3dhcmQgTGV3aXMgU2hpcCA8YSBocmVmPSJtYWlsdG86aGxzaGlwQGFwYWNoZS5vcmciPmhsc2hpcEBhcGFjaGUub3JnPC9hPgotQGF1dGhvciBEYXZpZCBTb2xpcyA8YSBocmVmPSJtYWlsdG86ZHNvbGlzQGFwYWNoZS5vcmciPmRzb2xpc0BhcGFjaGUub3JnPC9hPgotIAotPC9ib2R5PgotPC9odG1sPgotIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS93bWwvcGFnZXMvV01MRXhjZXB0aW9uLmphdmEgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvd21sL3BhZ2VzL1dNTEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODQxOGFiLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS93bWwvcGFnZXMvV01MRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vLyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50YXBlc3RyeS53bWwucGFnZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRhcGVzdHJ5LnV0aWwuZXhjZXB0aW9uLkV4Y2VwdGlvbkFuYWx5emVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkudXRpbC5leGNlcHRpb24uRXhjZXB0aW9uRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50YXBlc3RyeS53bWwuRGVjazsKLQotLyoqCi0gKiAgRGVmYXVsdCBleGNlcHRpb24gcmVwb3J0aW5nIHBhZ2UgZm9yIFdNTCBhcHBsaWNhdGlvbnMuCi0gKgotICogIEBhdXRob3IgRGF2aWQgU29saXMKLSAqICBAdmVyc2lvbiAkSWQkCi0gKiAgQHNpbmNlIDMuMAotICogCi0gKiovCi1wdWJsaWMgY2xhc3MgV01MRXhjZXB0aW9uIGV4dGVuZHMgRGVjayAKLXsKLQlwcml2YXRlIEV4Y2VwdGlvbkRlc2NyaXB0aW9uW10gX2V4Y2VwdGlvbnM7Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKCkKLQl7Ci0JCV9leGNlcHRpb25zID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgRXhjZXB0aW9uRGVzY3JpcHRpb25bXSBnZXRFeGNlcHRpb25zKCkKLQl7Ci0JCXJldHVybiBfZXhjZXB0aW9uczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFeGNlcHRpb24oVGhyb3dhYmxlIHZhbHVlKQotCXsKLQkJRXhjZXB0aW9uQW5hbHl6ZXIgYW5hbHl6ZXI7Ci0KLQkJYW5hbHl6ZXIgPSBuZXcgRXhjZXB0aW9uQW5hbHl6ZXIoKTsKLQotCQlfZXhjZXB0aW9ucyA9IGFuYWx5emVyLmFuYWx5emUodmFsdWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS93bWwvcGFnZXMvV01MRXhjZXB0aW9uLnBhZ2UgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvd21sL3BhZ2VzL1dNTEV4Y2VwdGlvbi5wYWdlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjRmZGQ4Li4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS93bWwvcGFnZXMvV01MRXhjZXB0aW9uLnBhZ2UKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gIAotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTwhLS0gJElkJCAtLT4KLTwhRE9DVFlQRSBwYWdlLXNwZWNpZmljYXRpb24gUFVCTElDIAotICAiLS8vQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24vL1RhcGVzdHJ5IFNwZWNpZmljYXRpb24gMy4wLy9FTiIgCi0gICJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL3RhcGVzdHJ5L2R0ZC9UYXBlc3RyeV8zXzAuZHRkIj4KLQkKLTxwYWdlLXNwZWNpZmljYXRpb24gY2xhc3M9Im9yZy5hcGFjaGUudGFwZXN0cnkud21sLnBhZ2VzLldNTEV4Y2VwdGlvbiI+Ci0gIAotICA8cHJvcGVydHkgbmFtZT0ib3JnLmFwYWNoZS50YXBlc3RyeS50ZW1wbGF0ZS1leHRlbnNpb24iIHZhbHVlPSJ3bWwiLz4KLSAgCi0gIDxwcm9wZXJ0eS1zcGVjaWZpY2F0aW9uIG5hbWU9ImN1cnJlbnQiIHR5cGU9Im9yZy5hcGFjaGUudGFwZXN0cnkudXRpbC5leGNlcHRpb24uRXhjZXB0aW9uRGVzY3JpcHRpb24iLz4KLQotICA8Y29tcG9uZW50IGlkPSJyZXN0YXJ0IiB0eXBlPSJTZXJ2aWNlTGluayI+Ci0gICAgPGJpbmRpbmcgbmFtZT0ic2VydmljZSIgZXhwcmVzc2lvbj0iQG9yZy5hcGFjaGUudGFwZXN0cnkuVGFwZXN0cnlAUkVTVEFSVF9TRVJWSUNFIi8+Ci0gIDwvY29tcG9uZW50PgotCi0gIDxjb21wb25lbnQgaWQ9ImZvcmVhY2hQcm9wZXJ0eSIgdHlwZT0iRm9yZWFjaCI+Ci0gIAk8c3RhdGljLWJpbmRpbmcgbmFtZT0iZWxlbWVudCIgdmFsdWU9InRyIi8+Ci0gICAgPGJpbmRpbmcgbmFtZT0ic291cmNlIiBleHByZXNzaW9uPSJjdXJyZW50LnByb3BlcnRpZXMiLz4KLSAgPC9jb21wb25lbnQ+Ci0KLTwvcGFnZS1zcGVjaWZpY2F0aW9uPgpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3dtbC9wYWdlcy9XTUxFeGNlcHRpb24ud21sIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3dtbC9wYWdlcy9XTUxFeGNlcHRpb24ud21sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDRhN2IyLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS93bWwvcGFnZXMvV01MRXhjZXB0aW9uLndtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLSAkSWQgLS0+Ci0gICA8IURPQ1RZUEUgd21sIFBVQkxJQyAiLS8vV0FQRk9SVU0vL0RURCBXTUwgMS4yLy9FTiIKLSAgICJodHRwOi8vd3d3LndhcGZvcnVtLm9yZy9EVEQvd21sMTIuZHRkIj4KLTx3bWw+Ci0gICAgPGhlYWQ+Ci0gICAgICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNhY2hlLUNvbnRyb2wiIGNvbnRlbnQ9Im11c3QtcmV2YWxpZGF0ZSIgZm9ydWE9InRydWUiLz4KLSAgICAgICAgPG1ldGEgaHR0cC1lcXVpdj0iQ2FjaGUtQ29udHJvbCIgY29udGVudD0ibm8tY2FjaGUiIGZvcnVhPSJ0cnVlIi8+Ci0gICAgPC9oZWFkPgotCi0JPGNhcmQgaWQ9IkV4Y2VwdGlvbiIgdGl0bGU9IkV4Y2VwdGlvbiI+Ci0JCTxwPgotCQkJQW4gZXhjZXB0aW9uIGhhcyBvY2N1cmVkLgotICAgICAgICAgICAgWW91IG1heSBjb250aW51ZSBieSA8Yj48YSBqd2NpZD0icmVzdGFydCI+cmVzdGFydGluZzwvYT48L2I+IHRoZSBzZXNzaW9uLjxici8+Ci0gICAgICAgICAgICA8dGFibGUgY29sdW1ucz0iMSI+Ci0JCQkJPHAgandjaWQ9IkBGb3JlYWNoIiBzb3VyY2U9Im9nbmw6ZXhjZXB0aW9ucyIgdmFsdWU9Im9nbmw6Y3VycmVudCI+Ci0JCQkJCTx0cj48dGQ+PGIgandjaWQ9IkBJbnNlcnQiIHZhbHVlPSJvZ25sOmN1cnJlbnQuZXhjZXB0aW9uQ2xhc3NOYW1lIj5zb21lLmV4Y2VwdGlvbi5DbGFzczwvYj48L3RkPjwvdHI+Ci0JCQkJCTx0cj48dGQ+PGIgandjaWQ9IkBJbnNlcnQiIHZhbHVlPSJvZ25sOmN1cnJlbnQubWVzc2FnZSI+QSBtZXNzYWdlIGRlc2NyaWJpbmcgdGhlIGV4Y2VwdGlvbi48L2I+PC90ZD48L3RyPgotCQkJCQk8dHIgandjaWQ9ImZvcmVhY2hQcm9wZXJ0eSI+Ci0JCQkJCQk8dGQ+PGIgandjaWQ9IkBJbnNlcnQiIHZhbHVlPSJvZ25sOmNvbXBvbmVudHMuZm9yZWFjaFByb3BlcnR5LnZhbHVlLm5hbWUiPlByb3BlcnR5IE5hbWU8L2I+OjxiIGp3Y2lkPSJASW5zZXJ0IiB2YWx1ZT0ib2dubDpjb21wb25lbnRzLmZvcmVhY2hQcm9wZXJ0eS52YWx1ZS52YWx1ZSI+UHJvcGVydHkgVmFsdWU8L2I+PC90ZD4KLQkJCQkJPC90cj4KLQkJCQk8L3A+Ci0JCQk8L3RhYmxlPgotCQk8L3A+Ci0JCQkJCi0JPC9jYXJkPgotPC93bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3dtbC9wYWdlcy9XTUxTdGFsZUxpbmsuamF2YSBiL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS93bWwvcGFnZXMvV01MU3RhbGVMaW5rLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxYjhlYmIuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3dtbC9wYWdlcy9XTUxTdGFsZUxpbmsuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8vICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRhcGVzdHJ5LndtbC5wYWdlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGFwZXN0cnkud21sLkRlY2s7Ci0KLQotLyoqCi0gKiAgU3RvcmVzIGEgbWVzc2FnZSAodGFrZW4gZnJvbSB0aGUge0BsaW5rIG9yZy5hcGFjaGUudGFwZXN0cnkuU3RhbGVMaW5rRXhjZXB0aW9ufSkKLSAqICB0aGF0IGlzIGRpc3BsYXllZCBhcyBwYXJ0IG9mIHRoZSBwYWdlLgotICoKLSAqICBAYXV0aG9yIERhdmlkIFNvbGlzCi0gKiAgQHZlcnNpb24gJElkJAotICogIEBzaW5jZSAzLjAKLSAqCi0gKiovCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBXTUxTdGFsZUxpbmsgZXh0ZW5kcyBEZWNrCi17Ci0gICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0TWVzc2FnZShTdHJpbmcgbWVzc2FnZSk7Ci19CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvd21sL3BhZ2VzL1dNTFN0YWxlTGluay5wYWdlIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3dtbC9wYWdlcy9XTUxTdGFsZUxpbmsucGFnZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGVlOWQ2My4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvd21sL3BhZ2VzL1dNTFN0YWxlTGluay5wYWdlCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICAKLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08IS0tICRJZCQgLS0+Ci08IURPQ1RZUEUgcGFnZS1zcGVjaWZpY2F0aW9uIFBVQkxJQyAKLSAgIi0vL0FwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLy9UYXBlc3RyeSBTcGVjaWZpY2F0aW9uIDMuMC8vRU4iIAotICAiaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy90YXBlc3RyeS9kdGQvVGFwZXN0cnlfM18wLmR0ZCI+Ci0gIAotPHBhZ2Utc3BlY2lmaWNhdGlvbiBjbGFzcz0ib3JnLmFwYWNoZS50YXBlc3RyeS53bWwucGFnZXMuV01MU3RhbGVMaW5rIj4KLSAgCi0gIDxwcm9wZXJ0eSBuYW1lPSJvcmcuYXBhY2hlLnRhcGVzdHJ5LnRlbXBsYXRlLWV4dGVuc2lvbiIgdmFsdWU9IndtbCIvPgotCi0gIDxwcm9wZXJ0eS1zcGVjaWZpY2F0aW9uIG5hbWU9Im1lc3NhZ2UiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KLQotICA8Y29tcG9uZW50IGlkPSJob21lIiB0eXBlPSJTZXJ2aWNlTGluayI+Ci0gICAgPGJpbmRpbmcgbmFtZT0ic2VydmljZSIgZXhwcmVzc2lvbj0iQG9yZy5hcGFjaGUudGFwZXN0cnkuVGFwZXN0cnlASE9NRV9TRVJWSUNFIi8+Ci0gIDwvY29tcG9uZW50PgotICAKLTwvcGFnZS1zcGVjaWZpY2F0aW9uPgpkaWZmIC0tZ2l0IGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3dtbC9wYWdlcy9XTUxTdGFsZUxpbmsud21sIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3dtbC9wYWdlcy9XTUxTdGFsZUxpbmsud21sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWRiNWUyLi4wMDAwMDAwCi0tLSBhL2ZyYW1ld29yay9zcmMvb3JnL2FwYWNoZS90YXBlc3RyeS93bWwvcGFnZXMvV01MU3RhbGVMaW5rLndtbAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLSAkSWQgLS0+Ci0gICA8IURPQ1RZUEUgd21sIFBVQkxJQyAiLS8vV0FQRk9SVU0vL0RURCBXTUwgMS4yLy9FTiIKLSAgICJodHRwOi8vd3d3LndhcGZvcnVtLm9yZy9EVEQvd21sMTIuZHRkIj4KLTx3bWw+Ci0gICAgPGhlYWQ+Ci0gICAgICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNhY2hlLUNvbnRyb2wiIGNvbnRlbnQ9Im11c3QtcmV2YWxpZGF0ZSIgZm9ydWE9InRydWUiLz4KLSAgICAgICAgPG1ldGEgaHR0cC1lcXVpdj0iQ2FjaGUtQ29udHJvbCIgY29udGVudD0ibm8tY2FjaGUiIGZvcnVhPSJ0cnVlIi8+Ci0gICAgPC9oZWFkPgotCi0JPGNhcmQgaWQ9IlN0YWxlTGluayIgdGl0bGU9IlN0YWxlTGluayI+Ci0JCTxwPllvdSBoYXZlIGNsaWNrZWQgb24gYSA8aT5zdGFsZSBsaW5rPC9pPi48L3A+ICAKLQkJPHA+Ci0JCQk8YiBqd2NpZD0iQEluc2VydCIgdmFsdWU9Im9nbmw6bWVzc2FnZSI+RXhjZXB0aW9uIG1lc3NhZ2UgZ29lcyBoZXJlLjwvYj4KLQkJPC9wPgotCQk8cD4KLQkJCVRoaXMgaXMgbW9zdCBsaWtlbHkgdGhlIHJlc3VsdCBvZiB1c2luZyB5b3VyIGJyb3dzZXIncyA8Yj5iYWNrPC9iPiBidXR0b24sIGJ1dCBjYW4gYWxzbyBiZSBhbiBhcHBsaWNhdGlvbiBlcnJvci4KLQkJPC9wPgotCQk8cD4KLQkJCVlvdSBtYXkgY29udGludWUgYnkgcmV0dXJuaW5nIHRvIHRoZSBhcHBsaWNhdGlvbidzIDxiPjxhIGp3Y2lkPSJob21lIj5ob21lIHBhZ2U8L2E+PC9iPi4KLQkJPC9wPgkJCQkKLQk8L2NhcmQ+Ci08L3dtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvd21sL3BhZ2VzL1dNTFN0YWxlU2Vzc2lvbi5wYWdlIGIvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3dtbC9wYWdlcy9XTUxTdGFsZVNlc3Npb24ucGFnZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE4ZmViNS4uMDAwMDAwMAotLS0gYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvd21sL3BhZ2VzL1dNTFN0YWxlU2Vzc2lvbi5wYWdlCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICAKLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08IS0tICRJZCQgLS0+Ci08IURPQ1RZUEUgcGFnZS1zcGVjaWZpY2F0aW9uIFBVQkxJQyAKLSAgIi0vL0FwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLy9UYXBlc3RyeSBTcGVjaWZpY2F0aW9uIDMuMC8vRU4iIAotICAiaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy90YXBlc3RyeS9kdGQvVGFwZXN0cnlfM18wLmR0ZCI+Ci0JCi08cGFnZS1zcGVjaWZpY2F0aW9uIGNsYXNzPSJvcmcuYXBhY2hlLnRhcGVzdHJ5LndtbC5EZWNrIj4KLSAgCi0gIDxwcm9wZXJ0eSBuYW1lPSJvcmcuYXBhY2hlLnRhcGVzdHJ5LnRlbXBsYXRlLWV4dGVuc2lvbiIgdmFsdWU9IndtbCIvPgotCi0gIDxjb21wb25lbnQgaWQ9InJlc3RhcnQiIHR5cGU9IlNlcnZpY2VMaW5rIj4KLSAgICA8YmluZGluZyBuYW1lPSJzZXJ2aWNlIiBleHByZXNzaW9uPSJAb3JnLmFwYWNoZS50YXBlc3RyeS5UYXBlc3RyeUBSRVNUQVJUX1NFUlZJQ0UiLz4KLSAgPC9jb21wb25lbnQ+Ci0gIAotPC9wYWdlLXNwZWNpZmljYXRpb24+CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvd21sL3BhZ2VzL1dNTFN0YWxlU2Vzc2lvbi53bWwgYi9mcmFtZXdvcmsvc3JjL29yZy9hcGFjaGUvdGFwZXN0cnkvd21sL3BhZ2VzL1dNTFN0YWxlU2Vzc2lvbi53bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4Njk4MDQuLjAwMDAwMDAKLS0tIGEvZnJhbWV3b3JrL3NyYy9vcmcvYXBhY2hlL3RhcGVzdHJ5L3dtbC9wYWdlcy9XTUxTdGFsZVNlc3Npb24ud21sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tICRJZCAtLT4KLSAgIDwhRE9DVFlQRSB3bWwgUFVCTElDICItLy9XQVBGT1JVTS8vRFREIFdNTCAxLjIvL0VOIgotICAgImh0dHA6Ly93d3cud2FwZm9ydW0ub3JnL0RURC93bWwxMi5kdGQiPgotPHdtbD4KLSAgICA8aGVhZD4KLSAgICAgICAgPG1ldGEgaHR0cC1lcXVpdj0iQ2FjaGUtQ29udHJvbCIgY29udGVudD0ibXVzdC1yZXZhbGlkYXRlIiBmb3J1YT0idHJ1ZSIvPgotICAgICAgICA8bWV0YSBodHRwLWVxdWl2PSJDYWNoZS1Db250cm9sIiBjb250ZW50PSJuby1jYWNoZSIgZm9ydWE9InRydWUiLz4KLSAgICA8L2hlYWQ+Ci0KLQk8Y2FyZCBpZD0iU3RhbGVTZXNzaW9uIiB0aXRsZT0iU3RhbGVTZXNzaW9uIj4KLQkJPHA+WW91ciBzZXNzaW9uIGhhcyB0aW1lZCBvdXQuPC9wPgkJCQotCQk8cD5XZWIgYXBwbGljYXRpb25zIHN0b3JlIGluZm9ybWF0aW9uIGFib3V0IHdoYXQgeW91IGFyZSBkb2luZyBvbiB0aGUgc2VydmVyLiAgVGhpcyBpbmZvcm1hdGlvbgotCQlpcyBjYWxsZWQgdGhlIDxlbT5zZXNzaW9uPC9lbT4uPC9wPgotCQkKLQkJPHA+V2ViIHNlcnZlcnMgbXVzdCB0cmFjayBtYW55LCBtYW55IHNlc3Npb25zLiAgSWYgeW91Ci0JCWFyZSBpbmFjdGl2ZSBmb3IgYSBsb25nIGVub3VnaCB0aW1lICh1c3VhbGx5LCBhIGZldyBtaW51dGVzKSwgdGhpcyBpbmZvcm1hdGlvbiBpcyBkaXNjYXJkZWQgdG8KLQkJbWFrZSByb29tIGZvciBhY3RpdmUgdXNlcnMuPC9wPgotCQkKLQkJPHA+QXQgdGhpcyBwb2ludCB5b3UgbWF5IDxiPjxhIGp3Y2lkPSJyZXN0YXJ0Ij5yZXN0YXJ0PC9hPjwvYj4gdGhlIHNlc3Npb24gdG8gY29udGludWUuPC9wPgotCTwvY2FyZD4KLTwvd21sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUK