ZGlmZiAtLWdpdCBhLy5iYXplbHJjIGIvLmJhemVscmMKaW5kZXggZTI0YmU4OC4uOGMzMjY2MSAxMDA2NDQKLS0tIGEvLmJhemVscmMKKysrIGIvLmJhemVscmMKQEAgLTMsOCArMywzMyBAQAogYnVpbGQgLS1leHBlcmltZW50YWxfc3RyaWN0X2FjdGlvbl9lbnYKIGJ1aWxkIC0tYWN0aW9uX2Vudj1QQVRICiBidWlsZCAtLWRpc2tfY2FjaGU9fi8uZ2Vycml0Y29kZXJldmlldy9iYXplbC1jYWNoZS9jYXMKLWJ1aWxkIC0tamF2YV90b29sY2hhaW4gLy90b29sczplcnJvcl9wcm9uZV93YXJuaW5nc190b29sY2hhaW4KKworIyBCdWlsZHMgdXNpbmcgcmVtb3RlX2pkazExLCBleGVjdXRlcyB1c2luZyByZW1vdGVfamRrMTEgb3IgbG9jYWxfamRrCitidWlsZCAtLWphdmFfbGFuZ3VhZ2VfdmVyc2lvbj0xMQorYnVpbGQgLS1qYXZhX3J1bnRpbWVfdmVyc2lvbj1yZW1vdGVqZGtfMTEKK2J1aWxkIC0tdG9vbF9qYXZhX2xhbmd1YWdlX3ZlcnNpb249MTEKK2J1aWxkIC0tdG9vbF9qYXZhX3J1bnRpbWVfdmVyc2lvbj1yZW1vdGVqZGtfMTEKKworIyBCdWlsZHMgYW5kIGV4ZWN1dGVzIG9uIFJCRSB1c2luZyByZW1vdGVqZGtfMTEKK2J1aWxkOnJlbW90ZSAtLWphdmFfbGFuZ3VhZ2VfdmVyc2lvbj0xMQorYnVpbGQ6cmVtb3RlIC0tamF2YV9ydW50aW1lX3ZlcnNpb249cmVtb3RlamRrXzExCitidWlsZDpyZW1vdGUgLS10b29sX2phdmFfbGFuZ3VhZ2VfdmVyc2lvbj0xMQorYnVpbGQ6cmVtb3RlIC0tdG9vbF9qYXZhX3J1bnRpbWVfdmVyc2lvbj1yZW1vdGVqZGtfMTEKKworIyBCdWlsZHMgdXNpbmcgcmVtb3RlX2pkazE3LCBleGVjdXRlcyB1c2luZyByZW1vdGVfamRrMTEgb3IgbG9jYWxfamRrCitidWlsZDpqYXZhMTcgLS1qYXZhX2xhbmd1YWdlX3ZlcnNpb249MTcKK2J1aWxkOmphdmExNyAtLWphdmFfcnVudGltZV92ZXJzaW9uPXJlbW90ZWpka18xNworYnVpbGQ6amF2YTE3IC0tdG9vbF9qYXZhX2xhbmd1YWdlX3ZlcnNpb249MTcKK2J1aWxkOmphdmExNyAtLXRvb2xfamF2YV9ydW50aW1lX3ZlcnNpb249cmVtb3RlamRrXzE3CisKKyMgQnVpbGRzIGFuZCBleGVjdXRlcyBvbiBSQkUgdXNpbmcgcmVtb3RlamRrXzE3CitidWlsZDpyZW1vdGUxNyAtLWphdmFfbGFuZ3VhZ2VfdmVyc2lvbj0xNworYnVpbGQ6cmVtb3RlMTcgLS1qYXZhX3J1bnRpbWVfdmVyc2lvbj1yZW1vdGVqZGtfMTcKK2J1aWxkOnJlbW90ZTE3IC0tdG9vbF9qYXZhX2xhbmd1YWdlX3ZlcnNpb249MTcKK2J1aWxkOnJlbW90ZTE3IC0tdG9vbF9qYXZhX3J1bnRpbWVfdmVyc2lvbj1yZW1vdGVqZGtfMTcKIAogdGVzdCAtLWJ1aWxkX3Rlc3RzX29ubHkKIHRlc3QgLS10ZXN0X291dHB1dD1lcnJvcnMKIAoraW1wb3J0ICV3b3Jrc3BhY2UlL3Rvb2xzL3JlbW90ZS1iYXplbHJjCisKZGlmZiAtLWdpdCBhLy5iYXplbHZlcnNpb24gYi8uYmF6ZWx2ZXJzaW9uCmluZGV4IGZjZGIyZTEuLjAwNjJhYzkgMTAwNjQ0Ci0tLSBhLy5iYXplbHZlcnNpb24KKysrIGIvLmJhemVsdmVyc2lvbgpAQCAtMSArMSBAQAotNC4wLjAKKzUuMC4wCmRpZmYgLS1naXQgYS8ubWFpbG1hcCBiLy5tYWlsbWFwCmluZGV4IGYwYmM5OTAuLmYwYWY0OWIgMTAwNjQ0Ci0tLSBhLy5tYWlsbWFwCisrKyBiLy5tYWlsbWFwCkBAIC0xMiw2ICsxMiw3IEBACiBTYcWhYSDFvWl2a292IDxzYXNhLnppdmtvdkBzYXAuY29tPiAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhc2EgWml2a292IDxzYXNhLnppdmtvdkBzYXAuY29tPgogU2HFoWEgxb1pdmtvdiA8c2FzYS56aXZrb3ZAc2FwLmNvbT4gICAgICAgICAgICAgICAgICAgICAgICAgICBTYcWhYSDFvWl2a292IDx6aXZrb3ZAZ21haWwuY29tPgogU2HFoWEgxb1pdmtvdiA8c2FzYS56aXZrb3ZAc2FwLmNvbT4gICAgICAgICAgICAgICAgICAgICAgICAgICBTYXNhIFppdmtvdiA8eml2a292QGdtYWlsLmNvbT4KK1NlYmFzdGlhbiBTY2h1YmVydGggPHNzY2h1YmVydGhAZ21haWwuY29tPiAgICAgICAgICAgICAgICAgIFNlYmFzdGlhbiBTY2h1YmVydGggPHNlYmFzdGlhbi5zY2h1YmVydGhAYm9zY2guaW8+CiBTaGF3biBQZWFyY2UgPHNwZWFyY2VAc3BlYXJjZS5vcmc+ICAgICAgICAgICAgICAgICAgICAgICAgICBTaGF3biBPLiBQZWFyY2UgPHNvcEBnb29nbGUuY29tPgogU2hhd24gUGVhcmNlIDxzcGVhcmNlQHNwZWFyY2Uub3JnPiAgICAgICAgICAgICAgICAgICAgICAgICAgU2hhd24gUGVhcmNlIDxzb3BAZ29vZ2xlLmNvbT4KIFNoYXduIFBlYXJjZSA8c3BlYXJjZUBzcGVhcmNlLm9yZz4gICAgICAgICAgICAgICAgICAgICAgICAgIFNoYXduIE8uIFBlYXJjZSA8c3BlYXJjZUBzcGVhcmNlLm9yZz4KZGlmZiAtLWdpdCBhL0RFUEVOREVOQ0lFUyBiL0RFUEVOREVOQ0lFUwppbmRleCBlYmJlNDgwLi45M2ZhODUwIDEwMDY0NAotLS0gYS9ERVBFTkRFTkNJRVMKKysrIGIvREVQRU5ERU5DSUVTCkBAIC0xLDY5ICsxLDY4IEBACiBtYXZlbi9tYXZlbmNlbnRyYWwvYXJnczRqL2FyZ3M0ai8yLjMzLCBNSVQsIGFwcHJvdmVkLCBDUTExMDY4Ci1tYXZlbi9tYXZlbmNlbnRyYWwvY29tLmdvb2dsZS5jb2RlLmdzb24vZ3Nvbi8yLjguNywgQXBhY2hlLTIuMCwgYXBwcm92ZWQsIENRMjM0OTYKLW1hdmVuL21hdmVuY2VudHJhbC9jb20uZ29vZ2xlY29kZS5qYXZhZXdhaC9KYXZhRVdBSC8xLjEuMTIsIEFwYWNoZS0yLjAsIGFwcHJvdmVkLCBDUTExNjU4CittYXZlbi9tYXZlbmNlbnRyYWwvY29tLmdvb2dsZS5jb2RlLmdzb24vZ3Nvbi8yLjguOSwgQXBhY2hlLTIuMCwgYXBwcm92ZWQsIENRMjM0OTYKK21hdmVuL21hdmVuY2VudHJhbC9jb20uZ29vZ2xlY29kZS5qYXZhZXdhaC9KYXZhRVdBSC8xLjEuMTMsIEFwYWNoZS0yLjAsIGFwcHJvdmVkLCBDUTExNjU4CiBtYXZlbi9tYXZlbmNlbnRyYWwvY29tLmpjcmFmdC9qc2NoLzAuMS41NSwgQlNELTMtQ2xhdXNlLCBhcHByb3ZlZCwgQ1ExOTQzNQogbWF2ZW4vbWF2ZW5jZW50cmFsL2NvbS5qY3JhZnQvanpsaWIvMS4xLjEsIEJTRC0yLUNsYXVzZSwgYXBwcm92ZWQsIENRNjIxOAogbWF2ZW4vbWF2ZW5jZW50cmFsL2NvbW1vbnMtY29kZWMvY29tbW9ucy1jb2RlYy8xLjExLCBBcGFjaGUtMi4wIEFORCBCU0QtMy1DbGF1c2UsIGFwcHJvdmVkLCBDUTE1OTcxCiBtYXZlbi9tYXZlbmNlbnRyYWwvY29tbW9ucy1sb2dnaW5nL2NvbW1vbnMtbG9nZ2luZy8xLjIsIEFwYWNoZS0yLjAsIGFwcHJvdmVkLCBDUTEwMTYyCi1tYXZlbi9tYXZlbmNlbnRyYWwvamF2YXguc2VydmxldC9qYXZheC5zZXJ2bGV0LWFwaS8zLjEuMCwgQXBhY2hlLTIuMCBBTkQgKENEREwtMS4xIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMCksIGFwcHJvdmVkLCBDUTcyNDgKLW1hdmVuL21hdmVuY2VudHJhbC9qdW5pdC9qdW5pdC80LjEzLCAsIGFwcHJvdmVkLCBDUTIyNzk2Ci1tYXZlbi9tYXZlbmNlbnRyYWwvbG9nNGovbG9nNGovMS4yLjE1LCBBcGFjaGUtMi4wLCBhcHByb3ZlZCwgQ1E3ODM3CittYXZlbi9tYXZlbmNlbnRyYWwvamF2YXguc2VydmxldC9qYXZheC5zZXJ2bGV0LWFwaS80LjAuMCwgLCBhcHByb3ZlZCwgQ1ExNjEyNQorbWF2ZW4vbWF2ZW5jZW50cmFsL2p1bml0L2p1bml0LzQuMTMuMiwgRVBMLTIuMCwgYXBwcm92ZWQsIENRMjM2MzYKIG1hdmVuL21hdmVuY2VudHJhbC9uZXQuYnl0ZWJ1ZGR5L2J5dGUtYnVkZHktYWdlbnQvMS45LjAsIEFwYWNoZS0yLjAsIGFwcHJvdmVkLCBjbGVhcmx5ZGVmaW5lZAogbWF2ZW4vbWF2ZW5jZW50cmFsL25ldC5ieXRlYnVkZHkvYnl0ZS1idWRkeS8xLjkuMCwgQXBhY2hlLTIuMCwgYXBwcm92ZWQsIGNsZWFybHlkZWZpbmVkCiBtYXZlbi9tYXZlbmNlbnRyYWwvbmV0LmkycC5jcnlwdG8vZWRkc2EvMC4zLjAsIENDMC0xLjAsIGFwcHJvdmVkLCBDUTIyNTM3CittYXZlbi9tYXZlbmNlbnRyYWwvbmV0LmphdmEuZGV2LmpuYS9qbmEtcGxhdGZvcm0vNS44LjAsIEFwYWNoZS0yLjAgT1IgTEdQTC0yLjEtb3ItbGF0ZXIsIGFwcHJvdmVkLCBDUTIzMjE4CittYXZlbi9tYXZlbmNlbnRyYWwvbmV0LmphdmEuZGV2LmpuYS9qbmEvNS44LjAsIEFwYWNoZS0yLjAgT1IgTEdQTC0yLjEtb3ItbGF0ZXIsIGFwcHJvdmVkLCBDUTIzMjE3CiBtYXZlbi9tYXZlbmNlbnRyYWwvbmV0LnNmLmpvcHQtc2ltcGxlL2pvcHQtc2ltcGxlLzQuNiwgTUlULCBhcHByb3ZlZCwgY2xlYXJseWRlZmluZWQKLW1hdmVuL21hdmVuY2VudHJhbC9vcmcuYXBhY2hlLmFudC9hbnQtbGF1bmNoZXIvMS4xMC4xMCwgQXBhY2hlLTIuMCBBTkQgVzNDIEFORCBMaWNlbnNlUmVmLVB1YmxpYy1Eb21haW4sIGFwcHJvdmVkLCBDUTE1NTYwCi1tYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmFwYWNoZS5hbnQvYW50LzEuMTAuMTAsIEFwYWNoZS0yLjAgQU5EIFczQyBBTkQgTGljZW5zZVJlZi1QdWJsaWMtRG9tYWluLCBhcHByb3ZlZCwgQ1ExNTU2MAotbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5hcGFjaGUuY29tbW9ucy9jb21tb25zLWNvbXByZXNzLzEuMjAsIEFwYWNoZS0yLjAgQU5EIEJTRC0zLUNsYXVzZSBBTkQgTGljZW5zZVJlZi1QdWJsaWMtRG9tYWluLCBhcHByb3ZlZCwgQ1EyMTc3MQorbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5hcGFjaGUuYW50L2FudC1sYXVuY2hlci8xLjEwLjEyLCBBcGFjaGUtMi4wIEFORCBXM0MgQU5EIExpY2Vuc2VSZWYtUHVibGljLURvbWFpbiwgYXBwcm92ZWQsIENRMTU1NjAKK21hdmVuL21hdmVuY2VudHJhbC9vcmcuYXBhY2hlLmFudC9hbnQvMS4xMC4xMiwgQXBhY2hlLTIuMCBBTkQgVzNDIEFORCBMaWNlbnNlUmVmLVB1YmxpYy1Eb21haW4sIGFwcHJvdmVkLCBDUTE1NTYwCittYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmFwYWNoZS5jb21tb25zL2NvbW1vbnMtY29tcHJlc3MvMS4yMSwgQXBhY2hlLTIuMCBBTkQgQlNELTMtQ2xhdXNlIEFORCBiemlwMi0xLjAuNiBBTkQgTGljZW5zZVJlZi1QdWJsaWMtRG9tYWluLCBhcHByb3ZlZCwgQ1EyMzcxMAogbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5hcGFjaGUuY29tbW9ucy9jb21tb25zLW1hdGgzLzMuMiwgQXBhY2hlLTIuMCwgYXBwcm92ZWQsIGNsZWFybHlkZWZpbmVkCiBtYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmFwYWNoZS5odHRwY29tcG9uZW50cy9odHRwY2xpZW50LzQuNS4xMywgQXBhY2hlLTIuMCBBTkQgTGljZW5zZVJlZi1QdWJsaWMtRG9tYWluLCBhcHByb3ZlZCwgQ1EyMzUyNwogbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHMvaHR0cGNvcmUvNC40LjE0LCBBcGFjaGUtMi4wLCBhcHByb3ZlZCwgQ1EyMzUyOAotbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5hcGFjaGUuc3NoZC9zc2hkLWNvbW1vbi8yLjcuMCwgQXBhY2hlLTIuMCBhbmQgSVNDLCBhcHByb3ZlZCwgQ1EyMzQ2OQotbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5hcGFjaGUuc3NoZC9zc2hkLWNvcmUvMi43LjAsIEFwYWNoZS0yLjAsIGFwcHJvdmVkLCBDUTIzNDY5Ci1tYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmFwYWNoZS5zc2hkL3NzaGQtb3NnaS8yLjcuMCwgQXBhY2hlLTIuMCBhbmQgSVNDLCBhcHByb3ZlZCwgQ1EyMzQ2OQotbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5hcGFjaGUuc3NoZC9zc2hkLXNmdHAvMi43LjAsIEFwYWNoZS0yLjAsIGFwcHJvdmVkLCBDUTIzNDcwCittYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmFwYWNoZS5zc2hkL3NzaGQtb3NnaS8yLjguMCwgQXBhY2hlLTIuMCwgYXBwcm92ZWQsIENRMjM4OTIKK21hdmVuL21hdmVuY2VudHJhbC9vcmcuYXBhY2hlLnNzaGQvc3NoZC1zZnRwLzIuOC4wLCBBcGFjaGUtMi4wLCBhcHByb3ZlZCwgQ1EyMzg5MwogbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5hc3NlcnRqL2Fzc2VydGotY29yZS8zLjIwLjIsIEFwYWNoZS0yLjAsIGFwcHJvdmVkLCBjbGVhcmx5ZGVmaW5lZAotbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5ib3VuY3ljYXN0bGUvYmNwZy1qZGsxNW9uLzEuNjksIE1JVCBhbmQgQXBhY2hlLTIuMCwgYXBwcm92ZWQsIENRMjM0NzIKLW1hdmVuL21hdmVuY2VudHJhbC9vcmcuYm91bmN5Y2FzdGxlL2JjcGtpeC1qZGsxNW9uLzEuNjksIE1JVCwgYXBwcm92ZWQsIENRMjM0NzMKLW1hdmVuL21hdmVuY2VudHJhbC9vcmcuYm91bmN5Y2FzdGxlL2JjcHJvdi1qZGsxNW9uLzEuNjksIE1JVCwgYXBwcm92ZWQsIENRMjM0NzEKLW1hdmVuL21hdmVuY2VudHJhbC9vcmcuYm91bmN5Y2FzdGxlL2JjdXRpbC1qZGsxNW9uLzEuNjksIE1JVCwgYXBwcm92ZWQsIENRMjM0NzQKLW1hdmVuL21hdmVuY2VudHJhbC9vcmcuZWNsaXBzZS5qZXR0eS9qZXR0eS1odHRwLzkuNC40My52MjAyMTA2MjksICwgYXBwcm92ZWQsIGVjbGlwc2UKLW1hdmVuL21hdmVuY2VudHJhbC9vcmcuZWNsaXBzZS5qZXR0eS9qZXR0eS1pby85LjQuNDMudjIwMjEwNjI5LCAsIGFwcHJvdmVkLCBlY2xpcHNlCi1tYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmVjbGlwc2UuamV0dHkvamV0dHktc2VjdXJpdHkvOS40LjQzLnYyMDIxMDYyOSwgLCBhcHByb3ZlZCwgZWNsaXBzZQotbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5lY2xpcHNlLmpldHR5L2pldHR5LXNlcnZlci85LjQuNDMudjIwMjEwNjI5LCAsIGFwcHJvdmVkLCBlY2xpcHNlCi1tYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmVjbGlwc2UuamV0dHkvamV0dHktc2VydmxldC85LjQuNDMudjIwMjEwNjI5LCAsIGFwcHJvdmVkLCBlY2xpcHNlCi1tYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmVjbGlwc2UuamV0dHkvamV0dHktdXRpbC1hamF4LzkuNC40My52MjAyMTA2MjksICwgYXBwcm92ZWQsIGVjbGlwc2UKLW1hdmVuL21hdmVuY2VudHJhbC9vcmcuZWNsaXBzZS5qZXR0eS9qZXR0eS11dGlsLzkuNC40My52MjAyMTA2MjksICwgYXBwcm92ZWQsIGVjbGlwc2UKLW1hdmVuL21hdmVuY2VudHJhbC9vcmcuZWNsaXBzZS5qZ2l0L29yZy5lY2xpcHNlLmpnaXQuYW50LnRlc3QvNS4xMy4wLVNOQVBTSE9ULCAsIGFwcHJvdmVkLCBlY2xpcHNlCi1tYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmVjbGlwc2UuamdpdC9vcmcuZWNsaXBzZS5qZ2l0LmFudC81LjEzLjAtU05BUFNIT1QsICwgYXBwcm92ZWQsIGVjbGlwc2UKLW1hdmVuL21hdmVuY2VudHJhbC9vcmcuZWNsaXBzZS5qZ2l0L29yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZS81LjEzLjAtU05BUFNIT1QsICwgYXBwcm92ZWQsIGVjbGlwc2UKLW1hdmVuL21hdmVuY2VudHJhbC9vcmcuZWNsaXBzZS5qZ2l0L29yZy5lY2xpcHNlLmpnaXQuZ3BnLmJjLzUuMTMuMC1TTkFQU0hPVCwgLCBhcHByb3ZlZCwgZWNsaXBzZQotbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5lY2xpcHNlLmpnaXQvb3JnLmVjbGlwc2UuamdpdC5odHRwLmFwYWNoZS81LjEzLjAtU05BUFNIT1QsICwgYXBwcm92ZWQsIGVjbGlwc2UKLW1hdmVuL21hdmVuY2VudHJhbC9vcmcuZWNsaXBzZS5qZ2l0L29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvNS4xMy4wLVNOQVBTSE9ULCAsIGFwcHJvdmVkLCBlY2xpcHNlCi1tYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmVjbGlwc2UuamdpdC9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdC81LjEzLjAtU05BUFNIT1QsICwgYXBwcm92ZWQsIGVjbGlwc2UKLW1hdmVuL21hdmVuY2VudHJhbC9vcmcuZWNsaXBzZS5qZ2l0L29yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cC81LjEzLjAtU05BUFNIT1QsICwgYXBwcm92ZWQsIGVjbGlwc2UKLW1hdmVuL21hdmVuY2VudHJhbC9vcmcuZWNsaXBzZS5qZ2l0L29yZy5lY2xpcHNlLmpnaXQuanVuaXQuc3NoLzUuMTMuMC1TTkFQU0hPVCwgLCBhcHByb3ZlZCwgZWNsaXBzZQotbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5lY2xpcHNlLmpnaXQvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC81LjEzLjAtU05BUFNIT1QsICwgYXBwcm92ZWQsIGVjbGlwc2UKLW1hdmVuL21hdmVuY2VudHJhbC9vcmcuZWNsaXBzZS5qZ2l0L29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci50ZXN0LzUuMTMuMC1TTkFQU0hPVCwgLCBhcHByb3ZlZCwgZWNsaXBzZQotbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5lY2xpcHNlLmpnaXQvb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLzUuMTMuMC1TTkFQU0hPVCwgLCBhcHByb3ZlZCwgZWNsaXBzZQotbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5lY2xpcHNlLmpnaXQvb3JnLmVjbGlwc2UuamdpdC5sZnMudGVzdC81LjEzLjAtU05BUFNIT1QsICwgYXBwcm92ZWQsIGVjbGlwc2UKLW1hdmVuL21hdmVuY2VudHJhbC9vcmcuZWNsaXBzZS5qZ2l0L29yZy5lY2xpcHNlLmpnaXQubGZzLzUuMTMuMC1TTkFQU0hPVCwgLCBhcHByb3ZlZCwgZWNsaXBzZQotbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5lY2xpcHNlLmpnaXQvb3JnLmVjbGlwc2UuamdpdC5wZ20udGVzdC81LjEzLjAtU05BUFNIT1QsICwgYXBwcm92ZWQsIGVjbGlwc2UKLW1hdmVuL21hdmVuY2VudHJhbC9vcmcuZWNsaXBzZS5qZ2l0L29yZy5lY2xpcHNlLmpnaXQucGdtLzUuMTMuMC1TTkFQU0hPVCwgLCBhcHByb3ZlZCwgZWNsaXBzZQotbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5lY2xpcHNlLmpnaXQvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLnRlc3QvNS4xMy4wLVNOQVBTSE9ULCAsIGFwcHJvdmVkLCBlY2xpcHNlCi1tYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmVjbGlwc2UuamdpdC9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUvNS4xMy4wLVNOQVBTSE9ULCAsIGFwcHJvdmVkLCBlY2xpcHNlCi1tYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmVjbGlwc2UuamdpdC9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5qc2NoLzUuMTMuMC1TTkFQU0hPVCwgLCBhcHByb3ZlZCwgZWNsaXBzZQotbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5lY2xpcHNlLmpnaXQvb3JnLmVjbGlwc2UuamdpdC50ZXN0LzUuMTMuMC1TTkFQU0hPVCwgLCBhcHByb3ZlZCwgZWNsaXBzZQotbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5lY2xpcHNlLmpnaXQvb3JnLmVjbGlwc2UuamdpdC51aS81LjEzLjAtU05BUFNIT1QsICwgYXBwcm92ZWQsIGVjbGlwc2UKLW1hdmVuL21hdmVuY2VudHJhbC9vcmcuZWNsaXBzZS5qZ2l0L29yZy5lY2xpcHNlLmpnaXQvNS4xMy4wLVNOQVBTSE9ULCAsIGFwcHJvdmVkLCBlY2xpcHNlCi1tYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmhhbWNyZXN0L2hhbWNyZXN0LWNvcmUvMS4zLCBCU0QtMi1DbGF1c2UsIGFwcHJvdmVkLCBDUTcwNjMKLW1hdmVuL21hdmVuY2VudHJhbC9vcmcuaGFtY3Jlc3QvaGFtY3Jlc3QvMi4yLCBCU0QtMi1DbGF1c2UsIGFwcHJvdmVkLCBjbGVhcmx5ZGVmaW5lZAotbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5tb2NraXRvL21vY2tpdG8tY29yZS8yLjIzLjAsIE1JVCwgYXBwcm92ZWQsIENRMTc5NzYKK21hdmVuL21hdmVuY2VudHJhbC9vcmcuYm91bmN5Y2FzdGxlL2JjcGctamRrMTVvbi8xLjcwLCBBcGFjaGUtMi4wLCBhcHByb3ZlZCwgIzE3MTMKK21hdmVuL21hdmVuY2VudHJhbC9vcmcuYm91bmN5Y2FzdGxlL2JjcGtpeC1qZGsxNW9uLzEuNzAsIE1JVCwgYXBwcm92ZWQsIGNsZWFybHlkZWZpbmVkCittYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmJvdW5jeWNhc3RsZS9iY3Byb3YtamRrMTVvbi8xLjcwLCBNSVQsIGFwcHJvdmVkLCAjMTcxMgorbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5ib3VuY3ljYXN0bGUvYmN1dGlsLWpkazE1b24vMS43MCwgTUlULCBhcHByb3ZlZCwgY2xlYXJseWRlZmluZWQKK21hdmVuL21hdmVuY2VudHJhbC9vcmcuZWNsaXBzZS5qZXR0eS50b29sY2hhaW4vamV0dHktc2VydmxldC1hcGkvNC4wLjYsIEVQTC0yLjAgT1IgQXBhY2hlLTIuMCwgYXBwcm92ZWQsIHJ0LmpldHR5CittYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmVjbGlwc2UuamV0dHkvamV0dHktaHR0cC8xMC4wLjYsIEVQTC0yLjAgT1IgQXBhY2hlLTIuMCwgYXBwcm92ZWQsIHJ0LmpldHR5CittYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmVjbGlwc2UuamV0dHkvamV0dHktaW8vMTAuMC42LCBFUEwtMi4wIE9SIEFwYWNoZS0yLjAsIGFwcHJvdmVkLCBydC5qZXR0eQorbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5lY2xpcHNlLmpldHR5L2pldHR5LXNlY3VyaXR5LzEwLjAuNiwgRVBMLTIuMCBPUiBBcGFjaGUtMi4wLCBhcHByb3ZlZCwgcnQuamV0dHkKK21hdmVuL21hdmVuY2VudHJhbC9vcmcuZWNsaXBzZS5qZXR0eS9qZXR0eS1zZXJ2ZXIvMTAuMC42LCBFUEwtMi4wIE9SIEFwYWNoZS0yLjAsIGFwcHJvdmVkLCBydC5qZXR0eQorbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5lY2xpcHNlLmpldHR5L2pldHR5LXNlcnZsZXQvMTAuMC42LCBFUEwtMi4wIE9SIEFwYWNoZS0yLjAsIGFwcHJvdmVkLCBydC5qZXR0eQorbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5lY2xpcHNlLmpldHR5L2pldHR5LXV0aWwvMTAuMC42LCBFUEwtMi4wIE9SIEFwYWNoZS0yLjAsIGFwcHJvdmVkLCBydC5qZXR0eQorbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5lY2xpcHNlLmpnaXQvb3JnLmVjbGlwc2UuamdpdC5hbnQudGVzdC82LjEuMC1TTkFQU0hPVCwgQlNELTMtQ2xhdXNlLCBhcHByb3ZlZCwgdGVjaG5vbG9neS5qZ2l0CittYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmVjbGlwc2UuamdpdC9vcmcuZWNsaXBzZS5qZ2l0LmFudC82LjEuMC1TTkFQU0hPVCwgQlNELTMtQ2xhdXNlLCBhcHByb3ZlZCwgdGVjaG5vbG9neS5qZ2l0CittYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmVjbGlwc2UuamdpdC9vcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmUvNi4xLjAtU05BUFNIT1QsIEJTRC0zLUNsYXVzZSwgYXBwcm92ZWQsIHRlY2hub2xvZ3kuamdpdAorbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5lY2xpcHNlLmpnaXQvb3JnLmVjbGlwc2UuamdpdC5ncGcuYmMvNi4xLjAtU05BUFNIT1QsIEJTRC0zLUNsYXVzZSwgYXBwcm92ZWQsIHRlY2hub2xvZ3kuamdpdAorbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5lY2xpcHNlLmpnaXQvb3JnLmVjbGlwc2UuamdpdC5odHRwLmFwYWNoZS82LjEuMC1TTkFQU0hPVCwgQlNELTMtQ2xhdXNlLCBhcHByb3ZlZCwgdGVjaG5vbG9neS5qZ2l0CittYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmVjbGlwc2UuamdpdC9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyLzYuMS4wLVNOQVBTSE9ULCBCU0QtMy1DbGF1c2UsIGFwcHJvdmVkLCB0ZWNobm9sb2d5LmpnaXQKK21hdmVuL21hdmVuY2VudHJhbC9vcmcuZWNsaXBzZS5qZ2l0L29yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0LzYuMS4wLVNOQVBTSE9ULCBCU0QtMy1DbGF1c2UsIGFwcHJvdmVkLCB0ZWNobm9sb2d5LmpnaXQKK21hdmVuL21hdmVuY2VudHJhbC9vcmcuZWNsaXBzZS5qZ2l0L29yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cC82LjEuMC1TTkFQU0hPVCwgQlNELTMtQ2xhdXNlLCBhcHByb3ZlZCwgdGVjaG5vbG9neS5qZ2l0CittYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmVjbGlwc2UuamdpdC9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LnNzaC82LjEuMC1TTkFQU0hPVCwgQlNELTMtQ2xhdXNlLCBhcHByb3ZlZCwgdGVjaG5vbG9neS5qZ2l0CittYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmVjbGlwc2UuamdpdC9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LzYuMS4wLVNOQVBTSE9ULCBCU0QtMy1DbGF1c2UsIGFwcHJvdmVkLCB0ZWNobm9sb2d5LmpnaXQKK21hdmVuL21hdmVuY2VudHJhbC9vcmcuZWNsaXBzZS5qZ2l0L29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci50ZXN0LzYuMS4wLVNOQVBTSE9ULCBCU0QtMy1DbGF1c2UsIGFwcHJvdmVkLCB0ZWNobm9sb2d5LmpnaXQKK21hdmVuL21hdmVuY2VudHJhbC9vcmcuZWNsaXBzZS5qZ2l0L29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci82LjEuMC1TTkFQU0hPVCwgQlNELTMtQ2xhdXNlLCBhcHByb3ZlZCwgdGVjaG5vbG9neS5qZ2l0CittYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmVjbGlwc2UuamdpdC9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0LzYuMS4wLVNOQVBTSE9ULCBCU0QtMy1DbGF1c2UsIGFwcHJvdmVkLCB0ZWNobm9sb2d5LmpnaXQKK21hdmVuL21hdmVuY2VudHJhbC9vcmcuZWNsaXBzZS5qZ2l0L29yZy5lY2xpcHNlLmpnaXQubGZzLzYuMS4wLVNOQVBTSE9ULCBCU0QtMy1DbGF1c2UsIGFwcHJvdmVkLCB0ZWNobm9sb2d5LmpnaXQKK21hdmVuL21hdmVuY2VudHJhbC9vcmcuZWNsaXBzZS5qZ2l0L29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3QvNi4xLjAtU05BUFNIT1QsIEJTRC0zLUNsYXVzZSwgYXBwcm92ZWQsIHRlY2hub2xvZ3kuamdpdAorbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5lY2xpcHNlLmpnaXQvb3JnLmVjbGlwc2UuamdpdC5wZ20vNi4xLjAtU05BUFNIT1QsIEJTRC0zLUNsYXVzZSwgYXBwcm92ZWQsIHRlY2hub2xvZ3kuamdpdAorbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5lY2xpcHNlLmpnaXQvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLmFnZW50LzYuMS4wLVNOQVBTSE9ULCBCU0QtMy1DbGF1c2UsIGFwcHJvdmVkLCB0ZWNobm9sb2d5LmpnaXQKK21hdmVuL21hdmVuY2VudHJhbC9vcmcuZWNsaXBzZS5qZ2l0L29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS50ZXN0LzYuMS4wLVNOQVBTSE9ULCBCU0QtMy1DbGF1c2UsIGFwcHJvdmVkLCB0ZWNobm9sb2d5LmpnaXQKK21hdmVuL21hdmVuY2VudHJhbC9vcmcuZWNsaXBzZS5qZ2l0L29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS82LjEuMC1TTkFQU0hPVCwgQlNELTMtQ2xhdXNlLCBhcHByb3ZlZCwgdGVjaG5vbG9neS5qZ2l0CittYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmVjbGlwc2UuamdpdC9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5qc2NoLzYuMS4wLVNOQVBTSE9ULCBCU0QtMy1DbGF1c2UsIGFwcHJvdmVkLCB0ZWNobm9sb2d5LmpnaXQKK21hdmVuL21hdmVuY2VudHJhbC9vcmcuZWNsaXBzZS5qZ2l0L29yZy5lY2xpcHNlLmpnaXQudGVzdC82LjEuMC1TTkFQU0hPVCwgQlNELTMtQ2xhdXNlLCBhcHByb3ZlZCwgdGVjaG5vbG9neS5qZ2l0CittYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmVjbGlwc2UuamdpdC9vcmcuZWNsaXBzZS5qZ2l0LnVpLzYuMS4wLVNOQVBTSE9ULCBCU0QtMy1DbGF1c2UsIGFwcHJvdmVkLCB0ZWNobm9sb2d5LmpnaXQKK21hdmVuL21hdmVuY2VudHJhbC9vcmcuZWNsaXBzZS5qZ2l0L29yZy5lY2xpcHNlLmpnaXQvNi4xLjAtU05BUFNIT1QsIEJTRC0zLUNsYXVzZSwgYXBwcm92ZWQsIHRlY2hub2xvZ3kuamdpdAorbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5oYW1jcmVzdC9oYW1jcmVzdC1jb3JlLzEuMywgQlNELTItQ2xhdXNlLCBhcHByb3ZlZCwgQ1ExMTQyOQorbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5tb2NraXRvL21vY2tpdG8tY29yZS8yLjIzLjAsIEFwYWNoZS0yLjAgQU5EIE1JVCwgYXBwcm92ZWQsICM5NTgKIG1hdmVuL21hdmVuY2VudHJhbC9vcmcub2JqZW5lc2lzL29iamVuZXNpcy8yLjYsIEFwYWNoZS0yLjAsIGFwcHJvdmVkLCBDUTE1NDc4Ci1tYXZlbi9tYXZlbmNlbnRyYWwvb3JnLm9wZW5qZGsuam1oL2ptaC1jb3JlLzEuMzIsIEdQTC0yLjAsIGFwcHJvdmVkLCBDUTIzNDk5Ci1tYXZlbi9tYXZlbmNlbnRyYWwvb3JnLm9wZW5qZGsuam1oL2ptaC1nZW5lcmF0b3ItYW5ucHJvY2Vzcy8xLjMyLCBHUEwtMi4wLCBhcHByb3ZlZCwgQ1EyMzUwMAotbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5vc2dpL29yZy5vc2dpLmNvcmUvNC4zLjEsIEFwYWNoZS0yLjAsIGFwcHJvdmVkLCBDUTEwMTExCi1tYXZlbi9tYXZlbmNlbnRyYWwvb3JnLnNsZjRqL2pjbC1vdmVyLXNsZjRqLzEuNy4zMCwgQXBhY2hlLTIuMCwgYXBwcm92ZWQsIENRMTI4NDMKK21hdmVuL21hdmVuY2VudHJhbC9vcmcub3Blbmpkay5qbWgvam1oLWNvcmUvMS4zMiwgR1BMLTIuMC1vbmx5IHdpdGggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAsIGFwcHJvdmVkLCAjOTU5CittYXZlbi9tYXZlbmNlbnRyYWwvb3JnLm9wZW5qZGsuam1oL2ptaC1nZW5lcmF0b3ItYW5ucHJvY2Vzcy8xLjMyLCBHUEwtMi4wLW9ubHkgd2l0aCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMCwgYXBwcm92ZWQsICM5NjIKK21hdmVuL21hdmVuY2VudHJhbC9vcmcub3NnaS9vcmcub3NnaS5jb3JlLzYuMC4wLCBBcGFjaGUtMi4wLCBhcHByb3ZlZCwgIzE3OTQKK21hdmVuL21hdmVuY2VudHJhbC9vcmcuc2xmNGovamNsLW92ZXItc2xmNGovMS43LjMyLCBBcGFjaGUtMi4wLCBhcHByb3ZlZCwgQ1ExMjg0MwogbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5zbGY0ai9zbGY0ai1hcGkvMS43LjMwLCBNSVQsIGFwcHJvdmVkLCBDUTEzMzY4Ci1tYXZlbi9tYXZlbmNlbnRyYWwvb3JnLnNsZjRqL3NsZjRqLWxvZzRqMTIvMS43LjMwLCBNSVQsIGFwcHJvdmVkLCBDUTc2NjUKK21hdmVuL21hdmVuY2VudHJhbC9vcmcuc2xmNGovc2xmNGotc2ltcGxlLzEuNy4zMCwgTUlULCBhcHByb3ZlZCwgQ1E3OTUyCiBtYXZlbi9tYXZlbmNlbnRyYWwvb3JnLnR1a2FhbmkveHovMS45LCBMaWNlbnNlUmVmLVB1YmxpYy1Eb21haW4sIGFwcHJvdmVkLCBDUTIzNDk4CmRpZmYgLS1naXQgYS9XT1JLU1BBQ0UgYi9XT1JLU1BBQ0UKaW5kZXggNTFhODE1ZS4uMDQwNjE3ZSAxMDA2NDQKLS0tIGEvV09SS1NQQUNFCisrKyBiL1dPUktTUEFDRQpAQCAtMSwyMyArMSw2IEBACiB3b3Jrc3BhY2UobmFtZSA9ICJqZ2l0IikKIAogbG9hZCgiQGJhemVsX3Rvb2xzLy90b29scy9idWlsZF9kZWZzL3JlcG86aHR0cC5iemwiLCAiaHR0cF9hcmNoaXZlIikKLQotaHR0cF9hcmNoaXZlKAotICAgIG5hbWUgPSAiYmF6ZWxfc2t5bGliIiwKLSAgICBzaGEyNTYgPSAiMmVhOGE1ZWQyYjQ0OGJhZjRhNjg1NWQzY2UwNDljNGM0NTJhNjQ3MGIxZWZkMTUwNGZkYjdjMWMxMzRkMjIwYSIsCi0gICAgc3RyaXBfcHJlZml4ID0gImJhemVsLXNreWxpYi0wLjguMCIsCi0gICAgdXJscyA9IFsiaHR0cHM6Ly9naXRodWIuY29tL2JhemVsYnVpbGQvYmF6ZWwtc2t5bGliL2FyY2hpdmUvMC44LjAudGFyLmd6Il0sCi0pCi0KLSMgQ2hlY2sgQmF6ZWwgdmVyc2lvbiB3aGVuIGludm9rZWQgYnkgQmF6ZWwgZGlyZWN0bHkKLWxvYWQoIi8vdG9vbHM6YmF6ZWxpc2tfdmVyc2lvbi5iemwiLCAiYmF6ZWxpc2tfdmVyc2lvbiIpCi0KLWJhemVsaXNrX3ZlcnNpb24obmFtZSA9ICJiYXplbGlza192ZXJzaW9uIikKLQotbG9hZCgiQGJhemVsaXNrX3ZlcnNpb24vLzpjaGVjay5iemwiLCAiY2hlY2tfYmF6ZWxfdmVyc2lvbiIpCi0KLWNoZWNrX2JhemVsX3ZlcnNpb24oKQotCiBsb2FkKCIvL3Rvb2xzOmJhemxldHMuYnpsIiwgImxvYWRfYmF6bGV0cyIpCiAKIGxvYWRfYmF6bGV0cyhjb21taXQgPSAiZjMwYTk5MmRhOWZjODU1ZGNlODE5ODc1YWZiNTlmOWRkNmY4NjBjZCIpCkBAIC0yOCwzMiArMTEsMTggQEAKICkKIAogaHR0cF9hcmNoaXZlKAotICAgIG5hbWUgPSAib3BlbmpkazE1X2xpbnV4X2FyY2hpdmUiLAotICAgIGJ1aWxkX2ZpbGVfY29udGVudCA9ICIiIgotamF2YV9ydW50aW1lKG5hbWUgPSAncnVudGltZScsIHNyY3MgPSAgZ2xvYihbJyoqJ10pLCB2aXNpYmlsaXR5ID0gWycvL3Zpc2liaWxpdHk6cHVibGljJ10pCi1leHBvcnRzX2ZpbGVzKFsiV09SS1NQQUNFIl0sIHZpc2liaWxpdHkgPSBbIi8vdmlzaWJpbGl0eTpwdWJsaWMiXSkKLSIiIiwKLSAgICBzaGEyNTYgPSAiMGEzOGYxMTM4YzE1YTRmMjQzYjc1ZWI4MmY4ZWY0MDg1NWFmY2M0MDJlM2MyYTZkZTk3Y2U4MjM1MDExYjFhZCIsCi0gICAgc3RyaXBfcHJlZml4ID0gInp1bHUxNS4yNy4xNy1jYS1qZGsxNS4wLjAtbGludXhfeDY0IiwKKyAgICBuYW1lID0gInJiZV9qZGsxMSIsCisgICAgc2hhMjU2ID0gIjc2Njc5NmRlNzE5MTYxMThlNTI4YjlmNDMzNGMyOWM5YzliNGU5MjYyMjdiZjMyNjRkZWU1NTVlNmE0MzA2YzgiLAorICAgIHN0cmlwX3ByZWZpeCA9ICJyYmVfYXV0b2NvbmZpZy0yLjAuMCIsCiAgICAgdXJscyA9IFsKLSAgICAgICAgImh0dHBzOi8vbWlycm9yLmJhemVsLmJ1aWxkL2Nkbi5henVsLmNvbS96dWx1L2Jpbi96dWx1MTUuMjcuMTctY2EtamRrMTUuMC4wLWxpbnV4X3g2NC50YXIuZ3oiLAotICAgICAgICAiaHR0cHM6Ly9jZG4uYXp1bC5jb20venVsdS9iaW4venVsdTE1LjI3LjE3LWNhLWpkazE1LjAuMC1saW51eF94NjQudGFyLmd6IiwKKyAgICAgICAgImh0dHBzOi8vZ2Vycml0LWJhemVsLnN0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vcmJlX2F1dG9jb25maWcvdjIuMC4wLnRhci5neiIsCisgICAgICAgICJodHRwczovL2dpdGh1Yi5jb20vZGF2aWRvL3JiZV9hdXRvY29uZmlnL2FyY2hpdmUvdjIuMC4wLnRhci5neiIsCiAgICAgXSwKICkKIAotaHR0cF9hcmNoaXZlKAotICAgIG5hbWUgPSAib3BlbmpkazE1X2Rhcndpbl9hcmNoaXZlIiwKLSAgICBidWlsZF9maWxlX2NvbnRlbnQgPSAiIiIKLWphdmFfcnVudGltZShuYW1lID0gJ3J1bnRpbWUnLCBzcmNzID0gIGdsb2IoWycqKiddKSwgdmlzaWJpbGl0eSA9IFsnLy92aXNpYmlsaXR5OnB1YmxpYyddKQotZXhwb3J0c19maWxlcyhbIldPUktTUEFDRSJdLCB2aXNpYmlsaXR5ID0gWyIvL3Zpc2liaWxpdHk6cHVibGljIl0pCi0iIiIsCi0gICAgc2hhMjU2ID0gImY4MGIyZTA1MTJkOWQ4YTkyYmUyNDQ5NzMzNGM5NzRiZmVjYzhjODk4ZmMyMTVjZTBlNzY1OTRmMDA0Mzc0ODIiLAotICAgIHN0cmlwX3ByZWZpeCA9ICJ6dWx1MTUuMjcuMTctY2EtamRrMTUuMC4wLW1hY29zeF94NjQiLAotICAgIHVybHMgPSBbCi0gICAgICAgICJodHRwczovL21pcnJvci5iYXplbC5idWlsZC9jZG4uYXp1bC5jb20venVsdS9iaW4venVsdTE1LjI3LjE3LWNhLWpkazE1LjAuMC1tYWNvc3hfeDY0LnRhci5neiIsCi0gICAgICAgICJodHRwczovL2Nkbi5henVsLmNvbS96dWx1L2Jpbi96dWx1MTUuMjcuMTctY2EtamRrMTUuMC4wLW1hY29zeF94NjQudGFyLmd6IiwKLSAgICBdLAotKQorcmVnaXN0ZXJfdG9vbGNoYWlucygiLy90b29sczplcnJvcl9wcm9uZV93YXJuaW5nc190b29sY2hhaW5famF2YTExX2RlZmluaXRpb24iKQorCityZWdpc3Rlcl90b29sY2hhaW5zKCIvL3Rvb2xzOmVycm9yX3Byb25lX3dhcm5pbmdzX3Rvb2xjaGFpbl9qYXZhMTdfZGVmaW5pdGlvbiIpCiAKIEpNSF9WRVJTID0gIjEuMzIiCiAKQEAgLTEyMywxNCArOTIsMTQgQEAKIAogbWF2ZW5famFyKAogICAgIG5hbWUgPSAic3NoZC1vc2dpIiwKLSAgICBhcnRpZmFjdCA9ICJvcmcuYXBhY2hlLnNzaGQ6c3NoZC1vc2dpOjIuNy4wIiwKLSAgICBzaGExID0gImExMDFhYWQwZjc5YWQ0MjQ0OTgwOThmN2U5MWMzOWQzZDkyMTc3YzEiLAorICAgIGFydGlmYWN0ID0gIm9yZy5hcGFjaGUuc3NoZDpzc2hkLW9zZ2k6Mi44LjAiLAorICAgIHNoYTEgPSAiYjJhNTliNzNjMDQ1ZjQwZDU3MjJiOTE2MGQ0ZjkwOWE2NDZkODZjOSIsCiApCiAKIG1hdmVuX2phcigKICAgICBuYW1lID0gInNzaGQtc2Z0cCIsCi0gICAgYXJ0aWZhY3QgPSAib3JnLmFwYWNoZS5zc2hkOnNzaGQtc2Z0cDoyLjcuMCIsCi0gICAgc2hhMSA9ICIwYzllZmY3MTQ1ZTIwYjMzOGMxZGQ2YWNhMzZiYTkzZWQ3YzAxNDdjIiwKKyAgICBhcnRpZmFjdCA9ICJvcmcuYXBhY2hlLnNzaGQ6c3NoZC1zZnRwOjIuOC4wIiwKKyAgICBzaGExID0gImQzY2Q5YmM4ZDMzNWIzZWQxYTg2ZDI5NjVkZWI0ZDIwMmRlMjc0NDIiLAogKQogCiBtYXZlbl9qYXIoCkBAIC0yMzksOCArMjA4LDggQEAKIAogbWF2ZW5famFyKAogICAgIG5hbWUgPSAiZ3NvbiIsCi0gICAgYXJ0aWZhY3QgPSAiY29tLmdvb2dsZS5jb2RlLmdzb246Z3NvbjoyLjguOCIsCi0gICAgc2hhMSA9ICI0MzFmYzNjYmMwZmY4MWFiZGJmZGUwNzAwNjI3NDEwODljM2JhODc0IiwKKyAgICBhcnRpZmFjdCA9ICJjb20uZ29vZ2xlLmNvZGUuZ3Nvbjpnc29uOjIuOC45IiwKKyAgICBzaGExID0gIjhhNDMyYzFkNjgyNTc4MWUyMWEwMmRiMmUyYzMzYzVmZGUyODMzYjkiLAogKQogCiBKRVRUWV9WRVIgPSAiMTAuMC42IgpAQCAtMjk0LDMyICsyNjMsMzIgQEAKICAgICBzcmNfc2hhMSA9ICJmMzVmNTUyNWE1ZDMwZGMxMjM3Yjg1NDU3ZDc1OGQ1NzhlM2NlOGQwIiwKICkKIAotQk9VTkNZQ0FTVExFX1ZFUiA9ICIxLjY5IgorQk9VTkNZQ0FTVExFX1ZFUiA9ICIxLjcwIgogCiBtYXZlbl9qYXIoCiAgICAgbmFtZSA9ICJiY3BnIiwKICAgICBhcnRpZmFjdCA9ICJvcmcuYm91bmN5Y2FzdGxlOmJjcGctamRrMTVvbjoiICsgQk9VTkNZQ0FTVExFX1ZFUiwKLSAgICBzaGExID0gImQ5OWEwOGMzZjY1MWIyNmU4ZWI2NjhlOTQxYjBiYmQyYzA5ZWNlMDgiLAotICAgIHNyY19zaGExID0gImRlMWZjMjYxYjQ0YThlYjYwNTgzNDEzYTMxZmZjOThjZTNkY2UzOGIiLAorICAgIHNoYTEgPSAiMDYyZjcyZWMwNmYzMWE2YzMxYTNmMzM1NWZjZTAzODRiMjExMjZkNyIsCisgICAgc3JjX3NoYTEgPSAiOWRlZTczYWQ5MjY3NTJlZTNiNDIxYTdkYzQ1MzEyODcxNjZjY2YzNiIsCiApCiAKIG1hdmVuX2phcigKICAgICBuYW1lID0gImJjcHJvdiIsCiAgICAgYXJ0aWZhY3QgPSAib3JnLmJvdW5jeWNhc3RsZTpiY3Byb3YtamRrMTVvbjoiICsgQk9VTkNZQ0FTVExFX1ZFUiwKLSAgICBzaGExID0gIjkxZTE2MjgyNTFjZjNjYTkwMDkzY2U5ZDBmZTY3ZTViN2RhYjM4NTAiLAotICAgIHNyY19zaGExID0gIjY3ZGM2NDc2ODQ1ZjZiMjljYjUyMGI1ZGY2MWRiNjVhZTU2NzE4ZTQiLAorICAgIHNoYTEgPSAiNDYzNmEwZDAxZjc0YWNhZjI4MDgyZmI2MmIzMTdmMTA4MDExODM3MSIsCisgICAgc3JjX3NoYTEgPSAiNjI0NWUxNWRkNDdlNWZjMzNjZmYyNzVkZjYxNjYyZTBhOGU1OTU4ZiIsCiApCiAKIG1hdmVuX2phcigKICAgICBuYW1lID0gImJjdXRpbCIsCiAgICAgYXJ0aWZhY3QgPSAib3JnLmJvdW5jeWNhc3RsZTpiY3V0aWwtamRrMTVvbjoiICsgQk9VTkNZQ0FTVExFX1ZFUiwKLSAgICBzaGExID0gImMzZWRmOTNkMzQ2ZTk3ZjY0ZjA0MWU0NDhlNzQ1NWMzOWM3ZWZmNjQiLAotICAgIHNyY19zaGExID0gImRlZWIzZmJiZjM3M2UwNWUyYTIwOTQxZjlhOGNlOTBlOWFlYWIzZDIiLAorICAgIHNoYTEgPSAiNTQyODBlNzE5NWE3NDMwZDc5MTFkZWQ5M2ZjMDFlMDczMDBiOTUyNiIsCisgICAgc3JjX3NoYTEgPSAiNGFmNGE2YzkyYjhlYTA3ODg1YjI3ZDg1MzZiODFiODU1NDk3ZjRlYiIsCiApCiAKIG1hdmVuX2phcigKICAgICBuYW1lID0gImJjcGtpeCIsCiAgICAgYXJ0aWZhY3QgPSAib3JnLmJvdW5jeWNhc3RsZTpiY3BraXgtamRrMTVvbjoiICsgQk9VTkNZQ0FTVExFX1ZFUiwKLSAgICBzaGExID0gIjQ1YzM2ZmI3MmZhZmIwYjY4OGM2YWY3OTVlNmNjODAzZjZmNzllZTUiLAotICAgIHNyY19zaGExID0gIjhiYzUyMTQ0MDE0NTliZDkxZWVhODE2YjUxNjA3OWRhMzgzNzRlOTAiLAorICAgIHNoYTEgPSAiZjgxZTVhZjQ5NTcxYTlkNWExMDlhODhmMjM5YTczY2U4NzA1NTQxNyIsCisgICAgc3JjX3NoYTEgPSAiNDJmOWRlNTNhOTFiMjBiYzA2ZTg4NDgyYzU3ZmQ5N2U1YTg0MjUwZCIsCiApCmRpZmYgLS1naXQgYS9saWIvQlVJTEQgYi9saWIvQlVJTEQKaW5kZXggOTQ0MjdmNi4uNmJlOWU1NyAxMDA2NDQKLS0tIGEvbGliL0JVSUxECisrKyBiL2xpYi9CVUlMRApAQCAtOTcsNyArOTcsNyBAQAogamF2YV9saWJyYXJ5KAogICAgIG5hbWUgPSAiam5hIiwKICAgICB2aXNpYmlsaXR5ID0gWwotICAgICAgICAgIi8vb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLmFnZW50Ol9fcGtnX18iLAorICAgICAgICAiLy9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUuYWdlbnQ6X19wa2dfXyIsCiAgICAgXSwKICAgICBleHBvcnRzID0gWyJAam5hLy9qYXIiXSwKICkKQEAgLTEwNSw3ICsxMDUsNyBAQAogamF2YV9saWJyYXJ5KAogICAgIG5hbWUgPSAiam5hLXBsYXRmb3JtIiwKICAgICB2aXNpYmlsaXR5ID0gWwotICAgICAgICAgIi8vb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLmFnZW50Ol9fcGtnX18iLAorICAgICAgICAiLy9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUuYWdlbnQ6X19wa2dfXyIsCiAgICAgXSwKICAgICBleHBvcnRzID0gWyJAam5hLXBsYXRmb3JtLy9qYXIiXSwKICkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuYW50LnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5qZ2l0LmFudC50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GCmluZGV4IDk0MzM2NTguLjA5OTc1NzAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuYW50LnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5hbnQudGVzdC9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtNSwxMyArNSwxMyBAQAogQXV0b21hdGljLU1vZHVsZS1OYW1lOiBvcmcuZWNsaXBzZS5qZ2l0LmFudC50ZXN0CiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZ2l0LmFudC50ZXN0CiBCdW5kbGUtVmVuZG9yOiAlQnVuZGxlLVZlbmRvcgotQnVuZGxlLVZlcnNpb246IDYuMC4xLnF1YWxpZmllcgorQnVuZGxlLVZlcnNpb246IDYuMS4xLnF1YWxpZmllcgogQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKIEJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKYXZhU0UtMTEKIEltcG9ydC1QYWNrYWdlOiBvcmcuYXBhY2hlLnRvb2xzLmFudCwKLSBvcmcuZWNsaXBzZS5qZ2l0LmFudC50YXNrczt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0O3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudXRpbDt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmFudC50YXNrczt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0O3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudXRpbDt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKICBvcmcuaGFtY3Jlc3QuY29yZTt2ZXJzaW9uPSJbMS4xLjAsMy4wLjApIiwKICBvcmcuanVuaXQ7dmVyc2lvbj0iWzQuMTMsNS4wLjApIgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5hbnQudGVzdC9wb20ueG1sIGIvb3JnLmVjbGlwc2UuamdpdC5hbnQudGVzdC9wb20ueG1sCmluZGV4IDZhZDY0MTUuLmJhNDczZWYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuYW50LnRlc3QvcG9tLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LmFudC50ZXN0L3BvbS54bWwKQEAgLTE3LDcgKzE3LDcgQEAKICAgPHBhcmVudD4KICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0PC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjYuMC4xLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjYuMS4xLVNOQVBTSE9UPC92ZXJzaW9uPgogICA8L3BhcmVudD4KIAogICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0LmFudC50ZXN0PC9hcnRpZmFjdElkPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5hbnQvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5qZ2l0LmFudC9NRVRBLUlORi9NQU5JRkVTVC5NRgppbmRleCAxMGJmYmQyLi42MDAzYTMxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LmFudC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LmFudC9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMywxMyArMywxMyBAQAogQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZQogQXV0b21hdGljLU1vZHVsZS1OYW1lOiBvcmcuZWNsaXBzZS5qZ2l0LmFudAogQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuamdpdC5hbnQKLUJ1bmRsZS1WZXJzaW9uOiA2LjAuMS5xdWFsaWZpZXIKK0J1bmRsZS1WZXJzaW9uOiA2LjEuMS5xdWFsaWZpZXIKIEJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKYXZhU0UtMTEKIEltcG9ydC1QYWNrYWdlOiBvcmcuYXBhY2hlLnRvb2xzLmFudCwKLSAgb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIKKyAgb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIKIEJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgogQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0LmFudDt2ZXJzaW9uPSI2LjAuMSIsCi0gb3JnLmVjbGlwc2UuamdpdC5hbnQudGFza3M7dmVyc2lvbj0iNi4wLjEiOworRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpnaXQuYW50O3ZlcnNpb249IjYuMS4xIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmFudC50YXNrczt2ZXJzaW9uPSI2LjEuMSI7CiAgIHVzZXM6PSJvcmcuYXBhY2hlLnRvb2xzLmFudCwKICAgIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzIgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5hbnQvTUVUQS1JTkYvU09VUkNFLU1BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuamdpdC5hbnQvTUVUQS1JTkYvU09VUkNFLU1BTklGRVNULk1GCmluZGV4IGMzZWJmYjMuLmQwZGM1YzggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuYW50L01FVEEtSU5GL1NPVVJDRS1NQU5JRkVTVC5NRgorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LmFudC9NRVRBLUlORi9TT1VSQ0UtTUFOSUZFU1QuTUYKQEAgLTMsNSArMyw1IEBACiBCdW5kbGUtTmFtZTogb3JnLmVjbGlwc2UuamdpdC5hbnQgLSBTb3VyY2VzCiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZ2l0LmFudC5zb3VyY2UKIEJ1bmRsZS1WZW5kb3I6IEVjbGlwc2Uub3JnIC0gSkdpdAotQnVuZGxlLVZlcnNpb246IDYuMC4xLnF1YWxpZmllcgotRWNsaXBzZS1Tb3VyY2VCdW5kbGU6IG9yZy5lY2xpcHNlLmpnaXQuYW50O3ZlcnNpb249IjYuMC4xLnF1YWxpZmllciI7cm9vdHM9Ii4iCitCdW5kbGUtVmVyc2lvbjogNi4xLjEucXVhbGlmaWVyCitFY2xpcHNlLVNvdXJjZUJ1bmRsZTogb3JnLmVjbGlwc2UuamdpdC5hbnQ7dmVyc2lvbj0iNi4xLjEucXVhbGlmaWVyIjtyb290cz0iLiIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuYW50L3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0LmFudC9wb20ueG1sCmluZGV4IDQ0NDhmMmUuLmE3ZjI1OGIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuYW50L3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5hbnQvcG9tLnhtbApAQCAtMTUsNyArMTUsNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+Ni4wLjEtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+Ni4xLjEtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQuYW50PC9hcnRpZmFjdElkPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlL01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlL01FVEEtSU5GL01BTklGRVNULk1GCmluZGV4IDYyZmU1YTUuLjNmYzhkZjEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTMsNyArMyw3IEBACiBCdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lCiBBdXRvbWF0aWMtTW9kdWxlLU5hbWU6IG9yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZQogQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlCi1CdW5kbGUtVmVyc2lvbjogNi4wLjEucXVhbGlmaWVyCitCdW5kbGUtVmVyc2lvbjogNi4xLjEucXVhbGlmaWVyCiBCdW5kbGUtVmVuZG9yOiAlQnVuZGxlLVZlbmRvcgogQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCiBCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSmF2YVNFLTExCkBAIC0xMywxNyArMTMsMTcgQEAKICBvcmcuYXBhY2hlLmNvbW1vbnMuY29tcHJlc3MuY29tcHJlc3NvcnMuYnppcDI7dmVyc2lvbj0iWzEuNCwyLjApIiwKICBvcmcuYXBhY2hlLmNvbW1vbnMuY29tcHJlc3MuY29tcHJlc3NvcnMuZ3ppcDt2ZXJzaW9uPSJbMS40LDIuMCkiLAogIG9yZy5hcGFjaGUuY29tbW9ucy5jb21wcmVzcy5jb21wcmVzc29ycy54ejt2ZXJzaW9uPSJbMS40LDIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuYXBpO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubmxzO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsazt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5hcGk7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5saWI7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5ubHM7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudXRpbDt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKICBvcmcub3NnaS5mcmFtZXdvcms7dmVyc2lvbj0iWzEuMy4wLDIuMC4wKSIKIEJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5CiBCdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmUuRm9ybWF0QWN0aXZhdG9yCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlO3ZlcnNpb249IjYuMC4xIjsKK0V4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmU7dmVyc2lvbj0iNi4xLjEiOwogICB1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC5saWIsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LmFwaSwKICAgIG9yZy5hcGFjaGUuY29tbW9ucy5jb21wcmVzcy5hcmNoaXZlcnMsCiAgICBvcmcub3NnaS5mcmFtZXdvcmsiLAotIG9yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZS5pbnRlcm5hbDt2ZXJzaW9uPSI2LjAuMSI7eC1pbnRlcm5hbDo9dHJ1ZQorIG9yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZS5pbnRlcm5hbDt2ZXJzaW9uPSI2LjEuMSI7eC1pbnRlcm5hbDo9dHJ1ZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlL01FVEEtSU5GL1NPVVJDRS1NQU5JRkVTVC5NRiBiL29yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZS9NRVRBLUlORi9TT1VSQ0UtTUFOSUZFU1QuTUYKaW5kZXggZGVhYjJmYS4uOGM3ZmQwNyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlL01FVEEtSU5GL1NPVVJDRS1NQU5JRkVTVC5NRgorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmUvTUVUQS1JTkYvU09VUkNFLU1BTklGRVNULk1GCkBAIC0zLDUgKzMsNSBAQAogQnVuZGxlLU5hbWU6IG9yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZSAtIFNvdXJjZXMKIEJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZS5zb3VyY2UKIEJ1bmRsZS1WZW5kb3I6IEVjbGlwc2Uub3JnIC0gSkdpdAotQnVuZGxlLVZlcnNpb246IDYuMC4xLnF1YWxpZmllcgotRWNsaXBzZS1Tb3VyY2VCdW5kbGU6IG9yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZTt2ZXJzaW9uPSI2LjAuMS5xdWFsaWZpZXIiO3Jvb3RzPSIuIgorQnVuZGxlLVZlcnNpb246IDYuMS4xLnF1YWxpZmllcgorRWNsaXBzZS1Tb3VyY2VCdW5kbGU6IG9yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZTt2ZXJzaW9uPSI2LjEuMS5xdWFsaWZpZXIiO3Jvb3RzPSIuIgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlL3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmUvcG9tLnhtbAppbmRleCA0NWYxMWRhLi4xMmYzZTY4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmUvcG9tLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmUvcG9tLnhtbApAQCAtMTcsNyArMTcsNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+Ni4wLjEtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+Ni4xLjEtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZTwvYXJ0aWZhY3RJZD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuYmVuY2htYXJrcy9wb20ueG1sIGIvb3JnLmVjbGlwc2UuamdpdC5iZW5jaG1hcmtzL3BvbS54bWwKaW5kZXggOGIxNmQxOC4uMGY3MmY2NCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5iZW5jaG1hcmtzL3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5iZW5jaG1hcmtzL3BvbS54bWwKQEAgLTE0LDcgKzE0LDcgQEAKICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgogCiAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+Ci0gIDx2ZXJzaW9uPjYuMC4xLVNOQVBTSE9UPC92ZXJzaW9uPgorICA8dmVyc2lvbj42LjEuMS1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC5iZW5jaG1hcmtzPC9hcnRpZmFjdElkPgogICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LmNvdmVyYWdlL3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0LmNvdmVyYWdlL3BvbS54bWwKaW5kZXggNjNlYWQyNy4uYWJjMzdlYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5jb3ZlcmFnZS9wb20ueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuY292ZXJhZ2UvcG9tLnhtbApAQCAtMTQsNyArMTQsNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+Ni4wLjEtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+Ni4xLjEtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CiAKQEAgLTI3LDg4ICsyNyw4OCBAQAogICAgIDxkZXBlbmRlbmN5PgogICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQ8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj42LjAuMS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICAgIDx2ZXJzaW9uPjYuMS4xLVNOQVBTSE9UPC92ZXJzaW9uPgogICAgIDwvZGVwZW5kZW5jeT4KICAgICA8ZGVwZW5kZW5jeT4KICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0LmFudDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjYuMC4xLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgICAgPHZlcnNpb24+Ni4xLjEtU05BUFNIT1Q8L3ZlcnNpb24+CiAgICAgPC9kZXBlbmRlbmN5PgogICAgIDxkZXBlbmRlbmN5PgogICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZTwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjYuMC4xLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgICAgPHZlcnNpb24+Ni4xLjEtU05BUFNIT1Q8L3ZlcnNpb24+CiAgICAgPC9kZXBlbmRlbmN5PgogICAgIDxkZXBlbmRlbmN5PgogICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGU8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj42LjAuMS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICAgIDx2ZXJzaW9uPjYuMS4xLVNOQVBTSE9UPC92ZXJzaW9uPgogICAgIDwvZGVwZW5kZW5jeT4KICAgICA8ZGVwZW5kZW5jeT4KICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+Ni4wLjEtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgICA8dmVyc2lvbj42LjEuMS1TTkFQU0hPVDwvdmVyc2lvbj4KICAgICA8L2RlcGVuZGVuY3k+CiAgICAgPGRlcGVuZGVuY3k+CiAgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0PC9ncm91cElkPgogICAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC5sZnM8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj42LjAuMS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICAgIDx2ZXJzaW9uPjYuMS4xLVNOQVBTSE9UPC92ZXJzaW9uPgogICAgIDwvZGVwZW5kZW5jeT4KICAgICA8ZGVwZW5kZW5jeT4KICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXI8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj42LjAuMS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICAgIDx2ZXJzaW9uPjYuMS4xLVNOQVBTSE9UPC92ZXJzaW9uPgogICAgIDwvZGVwZW5kZW5jeT4KICAgICA8ZGVwZW5kZW5jeT4KICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0LnBnbTwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjYuMC4xLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgICAgPHZlcnNpb24+Ni4xLjEtU05BUFNIT1Q8L3ZlcnNpb24+CiAgICAgPC9kZXBlbmRlbmN5PgogICAgIDxkZXBlbmRlbmN5PgogICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQudWk8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj42LjAuMS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICAgIDx2ZXJzaW9uPjYuMS4xLVNOQVBTSE9UPC92ZXJzaW9uPgogICAgIDwvZGVwZW5kZW5jeT4KICAgICA8ZGVwZW5kZW5jeT4KICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGU8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj42LjAuMS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICAgIDx2ZXJzaW9uPjYuMS4xLVNOQVBTSE9UPC92ZXJzaW9uPgogICAgIDwvZGVwZW5kZW5jeT4KIAogICAgIDxkZXBlbmRlbmN5PgogICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQudGVzdDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjYuMC4xLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgICAgPHZlcnNpb24+Ni4xLjEtU05BUFNIT1Q8L3ZlcnNpb24+CiAgICAgPC9kZXBlbmRlbmN5PgogICAgIDxkZXBlbmRlbmN5PgogICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQuYW50LnRlc3Q8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj42LjAuMS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICAgIDx2ZXJzaW9uPjYuMS4xLVNOQVBTSE9UPC92ZXJzaW9uPgogICAgIDwvZGVwZW5kZW5jeT4KICAgICA8ZGVwZW5kZW5jeT4KICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjYuMC4xLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgICAgPHZlcnNpb24+Ni4xLjEtU05BUFNIT1Q8L3ZlcnNpb24+CiAgICAgPC9kZXBlbmRlbmN5PgogICAgIDxkZXBlbmRlbmN5PgogICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3Q8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj42LjAuMS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICAgIDx2ZXJzaW9uPjYuMS4xLVNOQVBTSE9UPC92ZXJzaW9uPgogICAgIDwvZGVwZW5kZW5jeT4KICAgICA8ZGVwZW5kZW5jeT4KICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0PC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+Ni4wLjEtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgICA8dmVyc2lvbj42LjEuMS1TTkFQU0hPVDwvdmVyc2lvbj4KICAgICA8L2RlcGVuZGVuY3k+CiAgICAgPGRlcGVuZGVuY3k+CiAgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0PC9ncm91cElkPgogICAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLnRlc3Q8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj42LjAuMS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICAgIDx2ZXJzaW9uPjYuMS4xLVNOQVBTSE9UPC92ZXJzaW9uPgogICAgIDwvZGVwZW5kZW5jeT4KICAgICA8ZGVwZW5kZW5jeT4KICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUudGVzdDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjYuMC4xLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgICAgPHZlcnNpb24+Ni4xLjEtU05BUFNIT1Q8L3ZlcnNpb24+CiAgICAgPC9kZXBlbmRlbmN5PgogICA8L2RlcGVuZGVuY2llcz4KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5ncGcuYmMudGVzdC9CVUlMRCBiL29yZy5lY2xpcHNlLmpnaXQuZ3BnLmJjLnRlc3QvQlVJTEQKaW5kZXggMzViMTI1Zi4uOWU1ODEzYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5ncGcuYmMudGVzdC9CVUlMRAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LmdwZy5iYy50ZXN0L0JVSUxECkBAIC0xMCw4ICsxMCw4IEBACiBqdW5pdF90ZXN0cygKICAgICBuYW1lID0gImJjIiwKICAgICBzcmNzID0gZ2xvYihbInRzdC8qKi8qLmphdmEiXSksCi0gICAgcmVzb3VyY2VfamFycyA9IFsiOnRzdF9yc3JjIl0sCiAgICAgdGFncyA9IFsiYmMiXSwKKyAgICBydW50aW1lX2RlcHMgPSBbIjp0c3RfcnNyYyJdLAogICAgIGRlcHMgPSBbCiAgICAgICAgICIvL2xpYjpiY3BnIiwKICAgICAgICAgIi8vbGliOmJjcHJvdiIsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LmdwZy5iYy50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuamdpdC5ncGcuYmMudGVzdC9NRVRBLUlORi9NQU5JRkVTVC5NRgppbmRleCBkNzAzNDMyLi5iYjliMzkzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LmdwZy5iYy50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuZ3BnLmJjLnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTMsNyArMyw3IEBACiBCdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lCiBBdXRvbWF0aWMtTW9kdWxlLU5hbWU6IG9yZy5lY2xpcHNlLmpnaXQuZ3BnLmJjLnRlc3QKIEJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpnaXQuZ3BnLmJjLnRlc3QKLUJ1bmRsZS1WZXJzaW9uOiA2LjAuMS5xdWFsaWZpZXIKK0J1bmRsZS1WZXJzaW9uOiA2LjEuMS5xdWFsaWZpZXIKIEJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yCiBCdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KIEJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKYXZhU0UtMTEKQEAgLTEyLDkgKzEyLDkgQEAKICBvcmcuYm91bmN5Y2FzdGxlLm9wZW5wZ3Aub3BlcmF0b3I7dmVyc2lvbj0iWzEuNjUuMCwyLjAuMCkiLAogIG9yZy5ib3VuY3ljYXN0bGUub3BlbnBncC5vcGVyYXRvci5qY2FqY2U7dmVyc2lvbj0iWzEuNjUuMCwyLjAuMCkiLAogIG9yZy5ib3VuY3ljYXN0bGUudXRpbC5lbmNvZGVyczt2ZXJzaW9uPSJbMS42NS4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5ncGcuYmMuaW50ZXJuYWw7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5ncGcuYmMuaW50ZXJuYWwua2V5czt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuc2hhMTt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmdwZy5iYy5pbnRlcm5hbDt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmdwZy5iYy5pbnRlcm5hbC5rZXlzO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5zaGExO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAogIG9yZy5oYW1jcmVzdDt2ZXJzaW9uPSJbMS4xLjAsMy4wLjApIiwKICBvcmcuanVuaXQ7dmVyc2lvbj0iWzQuMTMsNS4wLjApIiwKICBvcmcuanVuaXQucnVubmVyO3ZlcnNpb249Ils0LjEzLDUuMC4wKSIsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LmdwZy5iYy50ZXN0L3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0LmdwZy5iYy50ZXN0L3BvbS54bWwKaW5kZXggYWQ5NTViMC4uOTU2OGM2OCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5ncGcuYmMudGVzdC9wb20ueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuZ3BnLmJjLnRlc3QvcG9tLnhtbApAQCAtMTcsNyArMTcsNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+Ni4wLjEtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+Ni4xLjEtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQuZ3BnLmJjLnRlc3Q8L2FydGlmYWN0SWQ+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LmdwZy5iYy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL29yZy5lY2xpcHNlLmpnaXQuZ3BnLmJjL01FVEEtSU5GL01BTklGRVNULk1GCmluZGV4IDc0ZTMzMDUuLjUzNDU2OGQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuZ3BnLmJjL01FVEEtSU5GL01BTklGRVNULk1GCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuZ3BnLmJjL01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0zLDEwICszLDEwIEBACiBCdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lCiBBdXRvbWF0aWMtTW9kdWxlLU5hbWU6IG9yZy5lY2xpcHNlLmpnaXQuZ3BnLmJjCiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZ2l0LmdwZy5iYztzaW5nbGV0b246PXRydWUKLUZyYWdtZW50LUhvc3Q6IG9yZy5lY2xpcHNlLmpnaXQ7YnVuZGxlLXZlcnNpb249Ils2LjAuMSw2LjEuMCkiCitGcmFnbWVudC1Ib3N0OiBvcmcuZWNsaXBzZS5qZ2l0O2J1bmRsZS12ZXJzaW9uPSJbNi4xLjEsNi4yLjApIgogQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IKIEJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLVZlcnNpb246IDYuMC4xLnF1YWxpZmllcgorQnVuZGxlLVZlcnNpb246IDYuMS4xLnF1YWxpZmllcgogQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEphdmFTRS0xMQogSW1wb3J0LVBhY2thZ2U6IG9yZy5ib3VuY3ljYXN0bGUuYXNuMTt2ZXJzaW9uPSJbMS42OS4wLDIuMC4wKSIsCiAgb3JnLmJvdW5jeWNhc3RsZS5hc24xLmNyeXB0bGliO3ZlcnNpb249IlsxLjY5LjAsMi4wLjApIiwKQEAgLTI5LDkgKzI5LDkgQEAKICBvcmcuYm91bmN5Y2FzdGxlLnV0aWw7dmVyc2lvbj0iWzEuNjkuMCwyLjAuMCkiLAogIG9yZy5ib3VuY3ljYXN0bGUudXRpbC5lbmNvZGVyczt2ZXJzaW9uPSJbMS42OS4wLDIuMC4wKSIsCiAgb3JnLmJvdW5jeWNhc3RsZS51dGlsLmlvO3ZlcnNpb249IlsxLjY5LjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmFubm90YXRpb25zO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9yczt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmFubm90YXRpb25zO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9yczt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKICBvcmcuc2xmNGo7dmVyc2lvbj0iWzEuNy4wLDIuMC4wKSIKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0LmdwZy5iYzt2ZXJzaW9uPSI2LjAuMSIsCi0gb3JnLmVjbGlwc2UuamdpdC5ncGcuYmMuaW50ZXJuYWw7dmVyc2lvbj0iNi4wLjEiO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpnaXQuZ3BnLmJjLnRlc3QiLAotIG9yZy5lY2xpcHNlLmpnaXQuZ3BnLmJjLmludGVybmFsLmtleXM7dmVyc2lvbj0iNi4wLjEiO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpnaXQuZ3BnLmJjLnRlc3QiCitFeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC5ncGcuYmM7dmVyc2lvbj0iNi4xLjEiLAorIG9yZy5lY2xpcHNlLmpnaXQuZ3BnLmJjLmludGVybmFsO3ZlcnNpb249IjYuMS4xIjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZ2l0LmdwZy5iYy50ZXN0IiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmdwZy5iYy5pbnRlcm5hbC5rZXlzO3ZlcnNpb249IjYuMS4xIjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZ2l0LmdwZy5iYy50ZXN0IgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5ncGcuYmMvTUVUQS1JTkYvU09VUkNFLU1BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuamdpdC5ncGcuYmMvTUVUQS1JTkYvU09VUkNFLU1BTklGRVNULk1GCmluZGV4IGRlNDk2MmIuLjIwZTJkMDEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuZ3BnLmJjL01FVEEtSU5GL1NPVVJDRS1NQU5JRkVTVC5NRgorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LmdwZy5iYy9NRVRBLUlORi9TT1VSQ0UtTUFOSUZFU1QuTUYKQEAgLTMsNSArMyw1IEBACiBCdW5kbGUtTmFtZTogb3JnLmVjbGlwc2UuamdpdC5ncGcuYmMgLSBTb3VyY2VzCiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZ2l0LmdwZy5iYy5zb3VyY2UKIEJ1bmRsZS1WZW5kb3I6IEVjbGlwc2Uub3JnIC0gSkdpdAotQnVuZGxlLVZlcnNpb246IDYuMC4xLnF1YWxpZmllcgotRWNsaXBzZS1Tb3VyY2VCdW5kbGU6IG9yZy5lY2xpcHNlLmpnaXQuZ3BnLmJjO3ZlcnNpb249IjYuMC4xLnF1YWxpZmllciI7cm9vdHM9Ii4iCitCdW5kbGUtVmVyc2lvbjogNi4xLjEucXVhbGlmaWVyCitFY2xpcHNlLVNvdXJjZUJ1bmRsZTogb3JnLmVjbGlwc2UuamdpdC5ncGcuYmM7dmVyc2lvbj0iNi4xLjEucXVhbGlmaWVyIjtyb290cz0iLiIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuZ3BnLmJjL3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0LmdwZy5iYy9wb20ueG1sCmluZGV4IDRiZjgyYzYuLjEzOGY0ZTggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuZ3BnLmJjL3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5ncGcuYmMvcG9tLnhtbApAQCAtMTcsNyArMTcsNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+Ni4wLjEtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+Ni4xLjEtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQuZ3BnLmJjPC9hcnRpZmFjdElkPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLmFwYWNoZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKaW5kZXggYzUxYTg3ZS4uYWZjYWE3OCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLmFwYWNoZS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuYXBhY2hlL01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0zLDcgKzMsNyBAQAogQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZQogQXV0b21hdGljLU1vZHVsZS1OYW1lOiBvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuYXBhY2hlCiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuYXBhY2hlCi1CdW5kbGUtVmVyc2lvbjogNi4wLjEucXVhbGlmaWVyCitCdW5kbGUtVmVyc2lvbjogNi4xLjEucXVhbGlmaWVyCiBCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSmF2YVNFLTExCiBCdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KIEJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yCkBAIC0yNSwxMSArMjUsMTEgQEAKICBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jb25uO3ZlcnNpb249Ils0LjQuMCw1LjAuMCkiLAogIG9yZy5hcGFjaGUuaHR0cC5wYXJhbXM7dmVyc2lvbj0iWzQuMy4wLDUuMC4wKSIsCiAgb3JnLmFwYWNoZS5odHRwLnNzbDt2ZXJzaW9uPSJbNC4zLjAsNS4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmFubm90YXRpb25zO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubmxzO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0Lmh0dHA7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC51dGlsO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuaHR0cC5hcGFjaGU7dmVyc2lvbj0iNi4wLjEiOworIG9yZy5lY2xpcHNlLmpnaXQuYW5ub3RhdGlvbnM7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5ubHM7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuaHR0cDt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIKK0V4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5odHRwLmFwYWNoZTt2ZXJzaW9uPSI2LjEuMSI7CiAgIHVzZXM6PSJvcmcuYXBhY2hlLmh0dHAuY2xpZW50LAogICAgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuaHR0cCwKICAgIG9yZy5hcGFjaGUuaHR0cC5lbnRpdHksCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuYXBhY2hlL01FVEEtSU5GL1NPVVJDRS1NQU5JRkVTVC5NRiBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGUvTUVUQS1JTkYvU09VUkNFLU1BTklGRVNULk1GCmluZGV4IDlkNGY1ZjIuLjdiOGUxNDkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGUvTUVUQS1JTkYvU09VUkNFLU1BTklGRVNULk1GCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGUvTUVUQS1JTkYvU09VUkNFLU1BTklGRVNULk1GCkBAIC0zLDUgKzMsNSBAQAogQnVuZGxlLU5hbWU6IG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGUgLSBTb3VyY2VzCiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuYXBhY2hlLnNvdXJjZQogQnVuZGxlLVZlbmRvcjogRWNsaXBzZS5vcmcgLSBKR2l0Ci1CdW5kbGUtVmVyc2lvbjogNi4wLjEucXVhbGlmaWVyCi1FY2xpcHNlLVNvdXJjZUJ1bmRsZTogb3JnLmVjbGlwc2UuamdpdC5odHRwLmFwYWNoZTt2ZXJzaW9uPSI2LjAuMS5xdWFsaWZpZXIiO3Jvb3RzPSIuIgorQnVuZGxlLVZlcnNpb246IDYuMS4xLnF1YWxpZmllcgorRWNsaXBzZS1Tb3VyY2VCdW5kbGU6IG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGU7dmVyc2lvbj0iNi4xLjEucXVhbGlmaWVyIjtyb290cz0iLiIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGUvcG9tLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGUvcG9tLnhtbAppbmRleCA2ZTVmMjYwLi5iZDM1NTg5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuYXBhY2hlL3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLmFwYWNoZS9wb20ueG1sCkBAIC0xNSw3ICsxNSw3IEBACiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj42LjAuMS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8dmVyc2lvbj42LjEuMS1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPC9wYXJlbnQ+CiAKICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC5odHRwLmFwYWNoZTwvYXJ0aWZhY3RJZD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL01FVEEtSU5GL01BTklGRVNULk1GCmluZGV4IDUxMGM0MzkuLjRiZjY2YTIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMywxMyArMywxMyBAQAogQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZQogQXV0b21hdGljLU1vZHVsZS1OYW1lOiBvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyCiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyCi1CdW5kbGUtVmVyc2lvbjogNi4wLjEucXVhbGlmaWVyCitCdW5kbGUtVmVyc2lvbjogNi4xLjEucXVhbGlmaWVyCiBCdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KIEJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlcjt2ZXJzaW9uPSI2LjAuMSIsCi0gb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci5nbHVlO3ZlcnNpb249IjYuMC4xIjsKK0V4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyO3ZlcnNpb249IjYuMS4xIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyLmdsdWU7dmVyc2lvbj0iNi4xLjEiOwogICB1c2VzOj0iamF2YXguc2VydmxldCxqYXZheC5zZXJ2bGV0Lmh0dHAiLAotIG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIucmVzb2x2ZXI7dmVyc2lvbj0iNi4wLjEiOworIG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIucmVzb2x2ZXI7dmVyc2lvbj0iNi4xLjEiOwogICB1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQucmVzb2x2ZXIsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LmxpYiwKICAgIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LApAQCAtMTgsMTQgKzE4LDE0IEBACiBCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSmF2YVNFLTExCiBJbXBvcnQtUGFja2FnZTogamF2YXguc2VydmxldDt2ZXJzaW9uPSJbMi41LjAsNS4wLjApIiwKICBqYXZheC5zZXJ2bGV0Lmh0dHA7dmVyc2lvbj0iWzIuNS4wLDUuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5hbm5vdGF0aW9uczt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmVycm9yczt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZGZzO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5maWxlO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwudHJhbnNwb3J0LnBhcnNlcjt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmxpYjt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lm5sczt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGs7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQ7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQucmVzb2x2ZXI7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC51dGlsO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiCisgb3JnLmVjbGlwc2UuamdpdC5hbm5vdGF0aW9uczt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmVycm9yczt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZGZzO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5maWxlO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwudHJhbnNwb3J0LnBhcnNlcjt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmxpYjt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lm5sczt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGs7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQ7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQucmVzb2x2ZXI7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC51dGlsO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL01FVEEtSU5GL1NPVVJDRS1NQU5JRkVTVC5NRiBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvTUVUQS1JTkYvU09VUkNFLU1BTklGRVNULk1GCmluZGV4IDc0NTNjYjguLjJiNDcwNTUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvTUVUQS1JTkYvU09VUkNFLU1BTklGRVNULk1GCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvTUVUQS1JTkYvU09VUkNFLU1BTklGRVNULk1GCkBAIC0zLDUgKzMsNSBAQAogQnVuZGxlLU5hbWU6IG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIgLSBTb3VyY2VzCiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyLnNvdXJjZQogQnVuZGxlLVZlbmRvcjogRWNsaXBzZS5vcmcgLSBKR2l0Ci1CdW5kbGUtVmVyc2lvbjogNi4wLjEucXVhbGlmaWVyCi1FY2xpcHNlLVNvdXJjZUJ1bmRsZTogb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlcjt2ZXJzaW9uPSI2LjAuMS5xdWFsaWZpZXIiO3Jvb3RzPSIuIgorQnVuZGxlLVZlcnNpb246IDYuMS4xLnF1YWxpZmllcgorRWNsaXBzZS1Tb3VyY2VCdW5kbGU6IG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXI7dmVyc2lvbj0iNi4xLjEucXVhbGlmaWVyIjtyb290cz0iLiIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvcG9tLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvcG9tLnhtbAppbmRleCBiMDFjNzkxLi42YTc4OGUyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9wb20ueG1sCkBAIC0xOSw3ICsxOSw3IEBACiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj42LjAuMS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8dmVyc2lvbj42LjEuMS1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPC9wYXJlbnQ+CiAKICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlcjwvYXJ0aWZhY3RJZD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvR2l0U21hcnRIdHRwVG9vbHMuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvR2l0U21hcnRIdHRwVG9vbHMuamF2YQppbmRleCAwMTJmOWEzLi5mMTE1NWRjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL0dpdFNtYXJ0SHR0cFRvb2xzLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9HaXRTbWFydEh0dHBUb29scy5qYXZhCkBAIC0xNTgsMTEgKzE1OCwxMSBAQCBwdWJsaWMgc3RhdGljIHZvaWQgc2VuZEVycm9yKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsCiAJCX0KIAogCQlpZiAoaXNJbmZvUmVmcyhyZXEpKSB7Ci0JCQlzZW5kSW5mb1JlZnNFcnJvcihyZXEsIHJlcywgdGV4dEZvckdpdCk7CisJCQlzZW5kSW5mb1JlZnNFcnJvcihyZXEsIHJlcywgdGV4dEZvckdpdCwgaHR0cFN0YXR1cyk7CiAJCX0gZWxzZSBpZiAoaXNVcGxvYWRQYWNrKHJlcSkpIHsKLQkJCXNlbmRVcGxvYWRQYWNrRXJyb3IocmVxLCByZXMsIHRleHRGb3JHaXQpOworCQkJc2VuZFVwbG9hZFBhY2tFcnJvcihyZXEsIHJlcywgdGV4dEZvckdpdCwgaHR0cFN0YXR1cyk7CiAJCX0gZWxzZSBpZiAoaXNSZWNlaXZlUGFjayhyZXEpKSB7Ci0JCQlzZW5kUmVjZWl2ZVBhY2tFcnJvcihyZXEsIHJlcywgdGV4dEZvckdpdCk7CisJCQlzZW5kUmVjZWl2ZVBhY2tFcnJvcihyZXEsIHJlcywgdGV4dEZvckdpdCwgaHR0cFN0YXR1cyk7CiAJCX0gZWxzZSB7CiAJCQlpZiAoaHR0cFN0YXR1cyA8IDQwMCkKIAkJCQlTZXJ2bGV0VXRpbHMuY29uc3VtZVJlcXVlc3RCb2R5KHJlcSk7CkBAIC0xNzEsMjkgKzE3MSwzMiBAQCBwdWJsaWMgc3RhdGljIHZvaWQgc2VuZEVycm9yKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsCiAJfQogCiAJcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZW5kSW5mb1JlZnNFcnJvcihIdHRwU2VydmxldFJlcXVlc3QgcmVxLAotCQkJSHR0cFNlcnZsZXRSZXNwb25zZSByZXMsIFN0cmluZyB0ZXh0Rm9yR2l0KSB0aHJvd3MgSU9FeGNlcHRpb24geworCQkJSHR0cFNlcnZsZXRSZXNwb25zZSByZXMsIFN0cmluZyB0ZXh0Rm9yR2l0LCBpbnQgaHR0cFN0YXR1cykKKwkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBidWYgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKDEyOCk7CiAJCVBhY2tldExpbmVPdXQgcGNrID0gbmV3IFBhY2tldExpbmVPdXQoYnVmKTsKIAkJU3RyaW5nIHN2YyA9IHJlcS5nZXRQYXJhbWV0ZXIoInNlcnZpY2UiKTsKIAkJcGNrLndyaXRlU3RyaW5nKCIjIHNlcnZpY2U9IiArIHN2YyArICJcbiIpOwogCQlwY2suZW5kKCk7CiAJCXBjay53cml0ZVN0cmluZygiRVJSICIgKyB0ZXh0Rm9yR2l0KTsKLQkJc2VuZChyZXEsIHJlcywgaW5mb1JlZnNSZXN1bHRUeXBlKHN2YyksIGJ1Zi50b0J5dGVBcnJheSgpKTsKKwkJc2VuZChyZXEsIHJlcywgaW5mb1JlZnNSZXN1bHRUeXBlKHN2YyksIGJ1Zi50b0J5dGVBcnJheSgpLCBodHRwU3RhdHVzKTsKIAl9CiAKIAlwcml2YXRlIHN0YXRpYyB2b2lkIHNlbmRVcGxvYWRQYWNrRXJyb3IoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwKLQkJCUh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzLCBTdHJpbmcgdGV4dEZvckdpdCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJCUh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzLCBTdHJpbmcgdGV4dEZvckdpdCwgaW50IGh0dHBTdGF0dXMpCisJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQkvLyBEbyBub3QgdXNlIHNpZGViYW5kLiBTaWRlYmFuZCBpcyBhY2NlcHRhYmxlIG9ubHkgd2hpbGUgcGFja2ZpbGUgaXMKIAkJLy8gYmVpbmcgc2VudC4gT3RoZXIgcGxhY2VzLCBsaWtlIGFja25vd2xlZGdlbWVudCBzZWN0aW9uLCBkbyBub3QKIAkJLy8gc3VwcG9ydCBzaWRlYmFuZC4gVXNlIGFuIGVycm9yIHBhY2tldC4KIAkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJ1ZiA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oMTI4KTsKIAkJUGFja2V0TGluZU91dCBwY2tPdXQgPSBuZXcgUGFja2V0TGluZU91dChidWYpOwogCQl3cml0ZVBhY2tldChwY2tPdXQsIHRleHRGb3JHaXQpOwotCQlzZW5kKHJlcSwgcmVzLCBVUExPQURfUEFDS19SRVNVTFRfVFlQRSwgYnVmLnRvQnl0ZUFycmF5KCkpOworCQlzZW5kKHJlcSwgcmVzLCBVUExPQURfUEFDS19SRVNVTFRfVFlQRSwgYnVmLnRvQnl0ZUFycmF5KCksIGh0dHBTdGF0dXMpOwogCX0KIAogCXByaXZhdGUgc3RhdGljIHZvaWQgc2VuZFJlY2VpdmVQYWNrRXJyb3IoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwKLQkJCUh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzLCBTdHJpbmcgdGV4dEZvckdpdCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJCUh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzLCBTdHJpbmcgdGV4dEZvckdpdCwgaW50IGh0dHBTdGF0dXMpCisJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYnVmID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgxMjgpOwogCQlQYWNrZXRMaW5lT3V0IHBja091dCA9IG5ldyBQYWNrZXRMaW5lT3V0KGJ1Zik7CiAKQEAgLTIxMiw3ICsyMTUsNyBAQCBwcml2YXRlIHN0YXRpYyB2b2lkIHNlbmRSZWNlaXZlUGFja0Vycm9yKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsCiAJCQl3cml0ZVNpZGVCYW5kKGJ1ZiwgdGV4dEZvckdpdCk7CiAJCWVsc2UKIAkJCXdyaXRlUGFja2V0KHBja091dCwgdGV4dEZvckdpdCk7Ci0JCXNlbmQocmVxLCByZXMsIFJFQ0VJVkVfUEFDS19SRVNVTFRfVFlQRSwgYnVmLnRvQnl0ZUFycmF5KCkpOworCQlzZW5kKHJlcSwgcmVzLCBSRUNFSVZFX1BBQ0tfUkVTVUxUX1RZUEUsIGJ1Zi50b0J5dGVBcnJheSgpLCBodHRwU3RhdHVzKTsKIAl9CiAKIAlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzUmVjZWl2ZVBhY2tTaWRlQmFuZChIdHRwU2VydmxldFJlcXVlc3QgcmVxKSB7CkBAIC0yNDYsOSArMjQ5LDkgQEAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB3cml0ZVBhY2tldChQYWNrZXRMaW5lT3V0IHBja091dCwgU3RyaW5nIHRleHRGb3JHaXQpCiAJfQogCiAJcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZW5kKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzLAotCQkJU3RyaW5nIHR5cGUsIGJ5dGVbXSBidWYpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCQlTdHJpbmcgdHlwZSwgYnl0ZVtdIGJ1ZiwgaW50IGh0dHBTdGF0dXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCVNlcnZsZXRVdGlscy5jb25zdW1lUmVxdWVzdEJvZHkocmVxKTsKLQkJcmVzLnNldFN0YXR1cyhIdHRwU2VydmxldFJlc3BvbnNlLlNDX09LKTsKKwkJcmVzLnNldFN0YXR1cyhodHRwU3RhdHVzKTsKIAkJcmVzLnNldENvbnRlbnRUeXBlKHR5cGUpOwogCQlyZXMuc2V0Q29udGVudExlbmd0aChidWYubGVuZ3RoKTsKIAkJdHJ5IChPdXRwdXRTdHJlYW0gb3MgPSByZXMuZ2V0T3V0cHV0U3RyZWFtKCkpIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvVXBsb2FkUGFja1NlcnZsZXQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvVXBsb2FkUGFja1NlcnZsZXQuamF2YQppbmRleCBjNGY4NDVlLi4yM2EzOThmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL1VwbG9hZFBhY2tTZXJ2bGV0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9VcGxvYWRQYWNrU2VydmxldC5qYXZhCkBAIC0xMCw2ICsxMCw3IEBACiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlcjsKIAoraW1wb3J0IHN0YXRpYyBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19CQURfUkVRVUVTVDsKIGltcG9ydCBzdGF0aWMgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfRk9SQklEREVOOwogaW1wb3J0IHN0YXRpYyBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1I7CiBpbXBvcnQgc3RhdGljIGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlLlNDX1VOQVVUSE9SSVpFRDsKQEAgLTQ4LDYgKzQ5LDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5TZXJ2aWNlTWF5Tm90Q29udGludWVFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuVXBsb2FkUGFjazsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5VcGxvYWRQYWNrSW50ZXJuYWxTZXJ2ZXJFcnJvckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5XYW50Tm90VmFsaWRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQucmVzb2x2ZXIuU2VydmljZU5vdEF1dGhvcml6ZWRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQucmVzb2x2ZXIuU2VydmljZU5vdEVuYWJsZWRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQucmVzb2x2ZXIuVXBsb2FkUGFja0ZhY3Rvcnk7CkBAIC0xNTEsNiArMTUzLDE2IEBAIHB1YmxpYyB2b2lkIGRlc3Ryb3koKSB7CiAJCX0KIAl9CiAKKwlwcml2YXRlIHN0YXRpYyBpbnQgc3RhdHVzQ29kZUZvclRocm93YWJsZShUaHJvd2FibGUgZXJyb3IpIHsKKwkJaWYgKGVycm9yIGluc3RhbmNlb2YgU2VydmljZU5vdEVuYWJsZWRFeGNlcHRpb24pIHsKKwkJCXJldHVybiBTQ19GT1JCSURERU47CisJCX0KKwkJaWYgKGVycm9yIGluc3RhbmNlb2YgV2FudE5vdFZhbGlkRXhjZXB0aW9uKSB7CisJCQlyZXR1cm4gU0NfQkFEX1JFUVVFU1Q7CisJCX0KKwkJcmV0dXJuIFNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjsKKwl9CisKIAlwcml2YXRlIGZpbmFsIFVwbG9hZFBhY2tFcnJvckhhbmRsZXIgaGFuZGxlcjsKIAogCVVwbG9hZFBhY2tTZXJ2bGV0KEBOdWxsYWJsZSBVcGxvYWRQYWNrRXJyb3JIYW5kbGVyIGhhbmRsZXIpIHsKQEAgLTE2OSw2ICsxODEsNyBAQCBwdWJsaWMgdm9pZCBkb1Bvc3QoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByc3ApCiAKIAkJVXBsb2FkUGFja1J1bm5hYmxlIHIgPSAoKSAtPiB7CiAJCQlVcGxvYWRQYWNrIHVwID0gKFVwbG9hZFBhY2spIHJlcS5nZXRBdHRyaWJ1dGUoQVRUUklCVVRFX0hBTkRMRVIpOworCQkJLy8gdG8gYmUgZXhwbGljaXRseSBjbG9zZWQgYnkgY2FsbGVyCiAJCQlAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKQogCQkJU21hcnRPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IFNtYXJ0T3V0cHV0U3RyZWFtKHJlcSwgcnNwLCBmYWxzZSkgewogCQkJCUBPdmVycmlkZQpAQCAtMjE3LDkgKzIzMCwxMiBAQCBwcml2YXRlIHZvaWQgZGVmYXVsdFVwbG9hZFBhY2tIYW5kbGVyKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsCiAJCQlsb2codXAuZ2V0UmVwb3NpdG9yeSgpLCBlKTsKIAkJCWlmICghcnNwLmlzQ29tbWl0dGVkKCkpIHsKIAkJCQlyc3AucmVzZXQoKTsKLQkJCQlTdHJpbmcgbXNnID0gZSBpbnN0YW5jZW9mIFBhY2tQcm90b2NvbEV4Y2VwdGlvbiA/IGUuZ2V0TWVzc2FnZSgpCi0JCQkJCQk6IG51bGw7Ci0JCQkJc2VuZEVycm9yKHJlcSwgcnNwLCBTQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IsIG1zZyk7CisJCQkJU3RyaW5nIG1zZyA9IG51bGw7CisJCQkJaWYgKGUgaW5zdGFuY2VvZiBQYWNrUHJvdG9jb2xFeGNlcHRpb24KKwkJCQkJCXx8IGUgaW5zdGFuY2VvZiBTZXJ2aWNlTm90RW5hYmxlZEV4Y2VwdGlvbikgeworCQkJCQltc2cgPSBlLmdldE1lc3NhZ2UoKTsKKwkJCQl9CisJCQkJc2VuZEVycm9yKHJlcSwgcnNwLCBzdGF0dXNDb2RlRm9yVGhyb3dhYmxlKGUpLCBtc2cpOwogCQkJfQogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdC9NRVRBLUlORi9NQU5JRkVTVC5NRgppbmRleCAzYTY1MTdjLi40MTUwYmRiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdC9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMyw3ICszLDcgQEAKIEJ1bmRsZS1OYW1lOiAlQnVuZGxlLU5hbWUKIEF1dG9tYXRpYy1Nb2R1bGUtTmFtZTogb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QKIEJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0Ci1CdW5kbGUtVmVyc2lvbjogNi4wLjEucXVhbGlmaWVyCitCdW5kbGUtVmVyc2lvbjogNi4xLjEucXVhbGlmaWVyCiBCdW5kbGUtVmVuZG9yOiAlQnVuZGxlLVZlbmRvcgogQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCiBCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSmF2YVNFLTExCkBAIC0yNiwyNiArMjYsMjYgQEAKICBvcmcuZWNsaXBzZS5qZXR0eS51dGlsLmxvZzt2ZXJzaW9uPSJbMTAuMC4wLDExLjAuMCkiLAogIG9yZy5lY2xpcHNlLmpldHR5LnV0aWwuc2VjdXJpdHk7dmVyc2lvbj0iWzEwLjAuMCwxMS4wLjApIiwKICBvcmcuZWNsaXBzZS5qZXR0eS51dGlsLnRocmVhZDt2ZXJzaW9uPSJbMTAuMC4wLDExLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuYXBpO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXI7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci5nbHVlO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIucmVzb2x2ZXI7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbDt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZGZzO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5maWxlO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5yZWZ0YWJsZTt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0O3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cDt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmxpYjt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lm5sczt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGs7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQ7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuaHR0cDt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5odHRwLmFwYWNoZTt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5yZXNvbHZlcjt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5hcGk7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnM7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlcjt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyLmdsdWU7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci5yZXNvbHZlcjt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5kZnM7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnJlZnRhYmxlO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuanVuaXQ7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubmxzO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsazt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5odHRwO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0Lmh0dHAuYXBhY2hlO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LnJlc29sdmVyO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudXRpbDt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKICBvcmcuaGFtY3Jlc3Q7dmVyc2lvbj0iWzEuMS4wLDMuMC4wKSIsCiAgb3JnLmhhbWNyZXN0LmNvcmU7dmVyc2lvbj0iWzEuMS4wLDMuMC4wKSIsCiAgb3JnLmp1bml0O3ZlcnNpb249Ils0LjEzLDUuMC4wKSIsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdC9wb20ueG1sIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvcG9tLnhtbAppbmRleCA3Njk0YzQ0Li4zMzZmNDNiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdC9wb20ueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0L3BvbS54bWwKQEAgLTE4LDcgKzE4LDcgQEAKICAgPHBhcmVudD4KICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0PC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjYuMC4xLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjYuMS4xLVNOQVBTSE9UPC92ZXJzaW9uPgogICA8L3BhcmVudD4KIAogICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdDwvYXJ0aWZhY3RJZD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvdGVzdC9Ib29rTWVzc2FnZVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvdGVzdC9Ib29rTWVzc2FnZVRlc3QuamF2YQppbmRleCBkYjlmMmFlLi4yMGRlMjU2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9odHRwL3Rlc3QvSG9va01lc3NhZ2VUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaHR0cC90ZXN0L0hvb2tNZXNzYWdlVGVzdC5qYXZhCkBAIC05Nyw2ICs5Nyw3IEBAIHB1YmxpYyBSZWNlaXZlUGFjayBjcmVhdGUoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgUmVwb3NpdG9yeSBkYikKIAkJc2VydmVyLnNldFVwKCk7CiAKIAkJcmVtb3RlUmVwb3NpdG9yeSA9IHNyYy5nZXRSZXBvc2l0b3J5KCk7CisJCWFkZFJlcG9Ub0Nsb3NlKHJlbW90ZVJlcG9zaXRvcnkpOwogCQlyZW1vdGVVUkkgPSB0b1VSSWlzaChhcHAsIHNyY05hbWUpOwogCiAJCVN0b3JlZENvbmZpZyBjZmcgPSByZW1vdGVSZXBvc2l0b3J5LmdldENvbmZpZygpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaHR0cC90ZXN0L0h0dHBDbGllbnRUZXN0cy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaHR0cC90ZXN0L0h0dHBDbGllbnRUZXN0cy5qYXZhCmluZGV4IGRmMDkzYzEuLjM0MzhjNTIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvdGVzdC9IdHRwQ2xpZW50VGVzdHMuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9odHRwL3Rlc3QvSHR0cENsaWVudFRlc3RzLmphdmEKQEAgLTIzLDYgKzIzLDcgQEAKIGltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLm5ldC5VUkk7CiBpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCiBpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKQEAgLTMwOCw3ICszMDksMTAgQEAgcHVibGljIHZvaWQgdGVzdExpc3RSZW1vdGVfU21hcnRfVXBsb2FkUGFja0Rpc2FibGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCQkJZmFpbCgiY29ubmVjdGlvbiBvcGVuZWQgZXZlbiB0aG91Z2ggc2VydmljZSBkaXNhYmxlZCIpOwogCQkJfSBjYXRjaCAoVHJhbnNwb3J0RXhjZXB0aW9uIGVycikgewogCQkJCVN0cmluZyBleHAgPSBzbWFydEF1dGhOb25lVVJJICsgIjogIgotCQkJCQkJKyBKR2l0VGV4dC5nZXQoKS5zZXJ2aWNlTm90RW5hYmxlZE5vTmFtZTsKKwkJCQkJCSsgTWVzc2FnZUZvcm1hdC5mb3JtYXQoCisJCQkJCQkJCUpHaXRUZXh0LmdldCgpLnNlcnZpY2VOb3RQZXJtaXR0ZWQsCisJCQkJCQkJCXNtYXJ0QXV0aE5vbmVVUkkudG9TdHJpbmcoKSArICIvIiwKKwkJCQkJCQkJImdpdC11cGxvYWQtcGFjayIpOwogCQkJCWFzc2VydEVxdWFscyhleHAsIGVyci5nZXRNZXNzYWdlKCkpOwogCQkJfQogCQl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9odHRwL3Rlc3QvTWVhc3VyZVBhY2tTaXplVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaHR0cC90ZXN0L01lYXN1cmVQYWNrU2l6ZVRlc3QuamF2YQppbmRleCA5ZmZhMTllLi4wMDBlZWNkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9odHRwL3Rlc3QvTWVhc3VyZVBhY2tTaXplVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvdGVzdC9NZWFzdXJlUGFja1NpemVUZXN0LmphdmEKQEAgLTkwLDYgKzkwLDcgQEAgcHVibGljIFJlY2VpdmVQYWNrIGNyZWF0ZShIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBSZXBvc2l0b3J5IGRiKQogCQlzZXJ2ZXIuc2V0VXAoKTsKIAogCQlyZW1vdGVSZXBvc2l0b3J5ID0gc3JjLmdldFJlcG9zaXRvcnkoKTsKKwkJYWRkUmVwb1RvQ2xvc2UocmVtb3RlUmVwb3NpdG9yeSk7CiAJCXJlbW90ZVVSSSA9IHRvVVJJaXNoKGFwcCwgc3JjTmFtZSk7CiAKIAkJU3RvcmVkQ29uZmlnIGNmZyA9IHJlbW90ZVJlcG9zaXRvcnkuZ2V0Q29uZmlnKCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9odHRwL3Rlc3QvU21hcnRDbGllbnRTbWFydFNlcnZlclRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvdGVzdC9TbWFydENsaWVudFNtYXJ0U2VydmVyVGVzdC5qYXZhCmluZGV4IDg4N2U5NzAuLjhmMzg4OGUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvdGVzdC9TbWFydENsaWVudFNtYXJ0U2VydmVyVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvdGVzdC9TbWFydENsaWVudFNtYXJ0U2VydmVyVGVzdC5qYXZhCkBAIC01Nyw3ICs1Nyw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamV0dHkuc2VydmxldC5TZXJ2bGV0SG9sZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLkdpdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5UcmFuc3BvcnRDb25maWdDYWxsYmFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5SZW1vdGVSZXBvc2l0b3J5RXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLk5vUmVtb3RlUmVwb3NpdG9yeUV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5UcmFuc3BvcnRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuVW5zdXBwb3J0ZWRDcmVkZW50aWFsSXRlbTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyLkdpdFNlcnZsZXQ7CkBAIC00OTYsOCArNDk2LDkgQEAgcHVibGljIHZvaWQgdGVzdExpc3RSZW1vdGVfQmFkTmFtZSgpIHRocm93cyBJT0V4Y2VwdGlvbiwgVVJJU3ludGF4RXhjZXB0aW9uIHsKIAkJCXRyeSB7CiAJCQkJdC5vcGVuRmV0Y2goKTsKIAkJCQlmYWlsKCJmZXRjaCBjb25uZWN0aW9uIG9wZW5lZCIpOwotCQkJfSBjYXRjaCAoUmVtb3RlUmVwb3NpdG9yeUV4Y2VwdGlvbiBub3RGb3VuZCkgewotCQkJCWFzc2VydEVxdWFscyh1cmkgKyAiOiBHaXQgcmVwb3NpdG9yeSBub3QgZm91bmQiLAorCQkJfSBjYXRjaCAoTm9SZW1vdGVSZXBvc2l0b3J5RXhjZXB0aW9uIG5vdEZvdW5kKSB7CisJCQkJYXNzZXJ0RXF1YWxzKHVyaSArICI6ICIgKyB1cmkKKwkJCQkJCSsgIi9pbmZvL3JlZnM/c2VydmljZT1naXQtdXBsb2FkLXBhY2sgbm90IGZvdW5kOiBOb3QgRm91bmQiLAogCQkJCQkJbm90Rm91bmQuZ2V0TWVzc2FnZSgpKTsKIAkJCX0KIAkJfQpAQCAtNTEwLDcgKzUxMSw3IEBAIHB1YmxpYyB2b2lkIHRlc3RMaXN0UmVtb3RlX0JhZE5hbWUoKSB0aHJvd3MgSU9FeGNlcHRpb24sIFVSSVN5bnRheEV4Y2VwdGlvbiB7CiAJCWFzc2VydEVxdWFscyhqb2luKHVyaSwgImluZm8vcmVmcyIpLCBpbmZvLmdldFBhdGgoKSk7CiAJCWFzc2VydEVxdWFscygxLCBpbmZvLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOwogCQlhc3NlcnRFcXVhbHMoImdpdC11cGxvYWQtcGFjayIsIGluZm8uZ2V0UGFyYW1ldGVyKCJzZXJ2aWNlIikpOwotCQlhc3NlcnRFcXVhbHMoMjAwLCBpbmZvLmdldFN0YXR1cygpKTsKKwkJYXNzZXJ0RXF1YWxzKDQwNCwgaW5mby5nZXRTdGF0dXMoKSk7CiAJCWFzc2VydEVxdWFscygiYXBwbGljYXRpb24veC1naXQtdXBsb2FkLXBhY2stYWR2ZXJ0aXNlbWVudCIsCiAJCQkJaW5mby5nZXRSZXNwb25zZUhlYWRlcihIRFJfQ09OVEVOVF9UWVBFKSk7CiAJfQpAQCAtNTM2LDggKzUzNyw5IEBAIHB1YmxpYyB2b2lkIHRlc3RGZXRjaEJ5U0hBMVVucmVhY2hhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCQkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCgKIAkJCQkJCQkJCW5ldyBSZWZTcGVjKHVucmVhY2hhYmxlQ29tbWl0Lm5hbWUoKSkpKSk7CiAJCQlhc3NlcnRUcnVlKGUuZ2V0TWVzc2FnZSgpLmNvbnRhaW5zKAotCQkJCQkid2FudCAiICsgdW5yZWFjaGFibGVDb21taXQubmFtZSgpICsgIiBub3QgdmFsaWQiKSk7CisJCQkJCSJCYWQgUmVxdWVzdCIpKTsKIAkJfQorCQlhc3NlcnRMYXN0UmVxdWVzdFN0YXR1c0NvZGUoNDAwKTsKIAl9CiAKIAlAVGVzdApAQCAtNTU4LDggKzU2MCw5IEBAIHByb3RlY3RlZCBNYXA8U3RyaW5nLCBSZWY+IGdldEFkdmVydGlzZWRSZWZzKFJlcG9zaXRvcnkgcmVwb3NpdG9yeSwKIAkJCQkJKCkgLT4gdC5mZXRjaChOdWxsUHJvZ3Jlc3NNb25pdG9yLklOU1RBTkNFLAogCQkJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QobmV3IFJlZlNwZWMoQS5uYW1lKCkpKSkpOwogCQkJYXNzZXJ0VHJ1ZSgKLQkJCQkJZS5nZXRNZXNzYWdlKCkuY29udGFpbnMoIndhbnQgIiArIEEubmFtZSgpICsgIiBub3QgdmFsaWQiKSk7CisJCQkJCWUuZ2V0TWVzc2FnZSgpLmNvbnRhaW5zKCJCYWQgUmVxdWVzdCIpKTsKIAkJfQorCQlhc3NlcnRMYXN0UmVxdWVzdFN0YXR1c0NvZGUoNDAwKTsKIAl9CiAKIAlAVGVzdApAQCAtOTE2LDYgKzkxOSw3IEBAIHB1YmxpYyB2b2lkIHRlc3RJbml0aWFsQ2xvbmVfUmVkaXJlY3RPblBvc3RGb3JiaWRkZW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJfSBjYXRjaCAoVHJhbnNwb3J0RXhjZXB0aW9uIGUpIHsKIAkJCWFzc2VydFRydWUoZS5nZXRNZXNzYWdlKCkuY29udGFpbnMoIjMwMSIpKTsKIAkJfQorCQlhc3NlcnRMYXN0UmVxdWVzdFN0YXR1c0NvZGUoMzAxKTsKIAl9CiAKIAlAVGVzdApAQCAtOTM0LDYgKzkzOCw3IEBAIHB1YmxpYyB2b2lkIHRlc3RJbml0aWFsQ2xvbmVfUmVkaXJlY3RGb3JiaWRkZW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJCWFzc2VydFRydWUoCiAJCQkJCWUuZ2V0TWVzc2FnZSgpLmNvbnRhaW5zKCJodHRwLmZvbGxvd1JlZGlyZWN0cyBpcyBmYWxzZSIpKTsKIAkJfQorCQlhc3NlcnRMYXN0UmVxdWVzdFN0YXR1c0NvZGUoMzAxKTsKIAl9CiAKIAlwcml2YXRlIHZvaWQgYXNzZXJ0RmV0Y2hSZXF1ZXN0cyhMaXN0PEFjY2Vzc0V2ZW50PiByZXF1ZXN0cywgaW50IGluZGV4KSB7CkBAIC0xNjA1LDggKzE2MTAsOSBAQCBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZFdhbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJCWZhaWwoIlNlcnZlciBhY2NlcHRlZCB3YW50ICIgKyBpZC5uYW1lKCkpOwogCQl9IGNhdGNoIChUcmFuc3BvcnRFeGNlcHRpb24gZXJyKSB7CiAJCQlhc3NlcnRUcnVlKGVyci5nZXRNZXNzYWdlKCkKLQkJCQkJLmNvbnRhaW5zKCJ3YW50ICIgKyBpZC5uYW1lKCkgKyAiIG5vdCB2YWxpZCIpKTsKKwkJCQkJLmNvbnRhaW5zKCJCYWQgUmVxdWVzdCIpKTsKIAkJfQorCQlhc3NlcnRMYXN0UmVxdWVzdFN0YXR1c0NvZGUoNDAwKTsKIAl9CiAKIAlAVGVzdApAQCAtMTY1MCw3ICsxNjU2LDcgQEAgcHVibGljIHZvaWQgdGVzdEZldGNoX1JlZnNVbnJlYWRhYmxlT25VcGxvYWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJCQlmYWlsKCJTdWNjZXNzZnVsbHkgc2VydmVkIHJlZiB3aXRoIHZhbHVlICIgKyBjLmdldFJlZihtYXN0ZXIpKTsKIAkJCX0gY2F0Y2ggKFRyYW5zcG9ydEV4Y2VwdGlvbiBlcnIpIHsKIAkJCQlhc3NlcnRUcnVlKCJVbmV4cGVjdGVkIGV4Y2VwdGlvbiBtZXNzYWdlICIgKyBlcnIuZ2V0TWVzc2FnZSgpLAotCQkJCQkJZXJyLmdldE1lc3NhZ2UoKS5jb250YWlucygiSW50ZXJuYWwgc2VydmVyIGVycm9yIikpOworCQkJCQkJZXJyLmdldE1lc3NhZ2UoKS5jb250YWlucygiU2VydmVyIEVycm9yIikpOwogCQkJfQogCQl9IGZpbmFsbHkgewogCQkJbm9SZWZTZXJ2ZXIudGVhckRvd24oKTsKQEAgLTE4MjEsNiArMTgyNywxMSBAQCBwdWJsaWMgdm9pZCB0ZXN0UHVzaF9DaHVua2VkRW5jb2RpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJCQkuZ2V0UmVzcG9uc2VIZWFkZXIoSERSX0NPTlRFTlRfVFlQRSkpOwogCX0KIAorCXByaXZhdGUgdm9pZCBhc3NlcnRMYXN0UmVxdWVzdFN0YXR1c0NvZGUoaW50IHN0YXR1c0NvZGUpIHsKKwkJTGlzdDxBY2Nlc3NFdmVudD4gcmVxdWVzdHMgPSBnZXRSZXF1ZXN0cygpOworCQlhc3NlcnRFcXVhbHMoc3RhdHVzQ29kZSwgcmVxdWVzdHMuZ2V0KHJlcXVlc3RzLnNpemUoKSAtIDEpLmdldFN0YXR1cygpKTsKKwl9CisKIAlwcml2YXRlIHZvaWQgZW5hYmxlUmVjZWl2ZVBhY2soKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmaW5hbCBTdG9yZWRDb25maWcgY2ZnID0gcmVtb3RlUmVwb3NpdG9yeS5nZXRDb25maWcoKTsKIAkJY2ZnLnNldEJvb2xlYW4oImh0dHAiLCBudWxsLCAicmVjZWl2ZXBhY2siLCB0cnVlKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cC9NRVRBLUlORi9NQU5JRkVTVC5NRgppbmRleCBjMjFmODM1Li5kMDM1MDcyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0Lmh0dHAvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwL01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0zLDcgKzMsNyBAQAogQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZQogQXV0b21hdGljLU1vZHVsZS1OYW1lOiBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0Lmh0dHAKIEJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cAotQnVuZGxlLVZlcnNpb246IDYuMC4xLnF1YWxpZmllcgorQnVuZGxlLVZlcnNpb246IDYuMS4xLnF1YWxpZmllcgogQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCiBCdW5kbGUtVmVuZG9yOiAlQnVuZGxlLVZlbmRvcgogQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKQEAgLTIxLDE3ICsyMSwxNyBAQAogIG9yZy5lY2xpcHNlLmpldHR5LnV0aWwubG9nO3ZlcnNpb249IlsxMC4wLjAsMTEuMC4wKSIsCiAgb3JnLmVjbGlwc2UuamV0dHkudXRpbC5zZWN1cml0eTt2ZXJzaW9uPSJbMTAuMC4wLDExLjAuMCkiLAogIG9yZy5lY2xpcHNlLmpldHR5LnV0aWwuc3NsO3ZlcnNpb249IlsxMC4wLjAsMTEuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5lcnJvcnM7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlcjt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0O3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsazt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5yZXNvbHZlcjt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmVycm9yczt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5maWxlO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuanVuaXQ7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5saWI7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0O3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LnJlc29sdmVyO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAogIG9yZy5qdW5pdDt2ZXJzaW9uPSJbNC4xMyw1LjAuMCkiLAogIG9yZy5zbGY0ai5oZWxwZXJzO3ZlcnNpb249IlsxLjcuMCwyLjAuMCkiCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwO3ZlcnNpb249IjYuMC4xIjsKK0V4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0Lmh0dHA7dmVyc2lvbj0iNi4xLjEiOwogICB1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQsCiAgICBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LAogICAgamF2YXguc2VydmxldC5odHRwLApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwL01FVEEtSU5GL1NPVVJDRS1NQU5JRkVTVC5NRiBiL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cC9NRVRBLUlORi9TT1VSQ0UtTUFOSUZFU1QuTUYKaW5kZXggOThmZGUwNi4uMTkxNDJjNSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwL01FVEEtSU5GL1NPVVJDRS1NQU5JRkVTVC5NRgorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0Lmh0dHAvTUVUQS1JTkYvU09VUkNFLU1BTklGRVNULk1GCkBAIC0zLDUgKzMsNSBAQAogQnVuZGxlLU5hbWU6IG9yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cCAtIFNvdXJjZXMKIEJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cC5zb3VyY2UKIEJ1bmRsZS1WZW5kb3I6IEVjbGlwc2Uub3JnIC0gSkdpdAotQnVuZGxlLVZlcnNpb246IDYuMC4xLnF1YWxpZmllcgotRWNsaXBzZS1Tb3VyY2VCdW5kbGU6IG9yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cDt2ZXJzaW9uPSI2LjAuMS5xdWFsaWZpZXIiO3Jvb3RzPSIuIgorQnVuZGxlLVZlcnNpb246IDYuMS4xLnF1YWxpZmllcgorRWNsaXBzZS1Tb3VyY2VCdW5kbGU6IG9yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cDt2ZXJzaW9uPSI2LjEuMS5xdWFsaWZpZXIiO3Jvb3RzPSIuIgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwL3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0Lmh0dHAvcG9tLnhtbAppbmRleCBiNjY5OTFmLi5kODgzZTAzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0Lmh0dHAvcG9tLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0Lmh0dHAvcG9tLnhtbApAQCAtMTcsNyArMTcsNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+Ni4wLjEtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+Ni4xLjEtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cDwvYXJ0aWZhY3RJZD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cC9zcmMvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9odHRwL0h0dHBUZXN0Q2FzZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2p1bml0L2h0dHAvSHR0cFRlc3RDYXNlLmphdmEKaW5kZXggM2U3Yzg0Zi4uODc3YjkxOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2p1bml0L2h0dHAvSHR0cFRlc3RDYXNlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2p1bml0L2h0dHAvSHR0cFRlc3RDYXNlLmphdmEKQEAgLTIyLDYgKzIyLDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamV0dHkuc2VydmxldC5TZXJ2bGV0Q29udGV4dEhhbmRsZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmZpbGUuRmlsZVJlcG9zaXRvcnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5Mb2NhbERpc2tSZXBvc2l0b3J5VGVzdENhc2U7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5UZXN0UmVwb3NpdG9yeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5BbnlPYmplY3RJZDsKQEAgLTgwLDcgKzgxLDkgQEAgcHJvdGVjdGVkIEFwcFNlcnZlciBjcmVhdGVTZXJ2ZXIoKSB7CiAJICovCiAJcHJvdGVjdGVkIFRlc3RSZXBvc2l0b3J5PFJlcG9zaXRvcnk+IGNyZWF0ZVRlc3RSZXBvc2l0b3J5KCkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXcgVGVzdFJlcG9zaXRvcnk8PihjcmVhdGVCYXJlUmVwb3NpdG9yeSgpKTsKKwkJZmluYWwgRmlsZVJlcG9zaXRvcnkgcmVwb3NpdG9yeSA9IGNyZWF0ZUJhcmVSZXBvc2l0b3J5KCk7CisJCWFkZFJlcG9Ub0Nsb3NlKHJlcG9zaXRvcnkpOworCQlyZXR1cm4gbmV3IFRlc3RSZXBvc2l0b3J5PD4ocmVwb3NpdG9yeSk7CiAJfQogCiAJLyoqCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LnNzaC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuc3NoL01FVEEtSU5GL01BTklGRVNULk1GCmluZGV4IDhkNjI5ZWQuLjYwODU4ZDggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuc3NoL01FVEEtSU5GL01BTklGRVNULk1GCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuc3NoL01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0zLDQ2ICszLDQ2IEBACiBCdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lCiBBdXRvbWF0aWMtTW9kdWxlLU5hbWU6IG9yZy5lY2xpcHNlLmpnaXQuanVuaXQuc3NoCiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LnNzaAotQnVuZGxlLVZlcnNpb246IDYuMC4xLnF1YWxpZmllcgorQnVuZGxlLVZlcnNpb246IDYuMS4xLnF1YWxpZmllcgogQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCiBCdW5kbGUtVmVuZG9yOiAlQnVuZGxlLVZlbmRvcgogQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKIEJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKYXZhU0UtMTEKLUltcG9ydC1QYWNrYWdlOiBvcmcuYXBhY2hlLnNzaGQuY29tbW9uO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5jb21tb24uY29uZmlnLmtleXM7dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5maWxlLnZpcnR1YWxmczt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLmhlbHBlcnM7dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5pbzt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLmtleDt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLmtleXByb3ZpZGVyO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5jb21tb24uc2Vzc2lvbjt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLnNpZ25hdHVyZTt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLnV0aWwuYnVmZmVyO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5jb21tb24udXRpbC5sb2dnaW5nO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5jb21tb24udXRpbC5zZWN1cml0eTt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLnV0aWwudGhyZWFkczt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuY29yZTt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuc2VydmVyO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5zZXJ2ZXIuYXV0aDt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuc2VydmVyLmF1dGguZ3NzO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5zZXJ2ZXIuYXV0aC5rZXlib2FyZDt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuc2VydmVyLmF1dGgucGFzc3dvcmQ7dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLnNlcnZlci5jb21tYW5kO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5zZXJ2ZXIuc2Vzc2lvbjt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuc2VydmVyLnNoZWxsO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5zZXJ2ZXIuc3Vic3lzdGVtO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5zZnRwO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5zZnRwLnNlcnZlcjt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmFubm90YXRpb25zO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuYXBpO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9yczt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmVycm9yczt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0O3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsazt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCitJbXBvcnQtUGFja2FnZTogb3JnLmFwYWNoZS5zc2hkLmNvbW1vbjt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLmNvbmZpZy5rZXlzO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jb21tb24uZmlsZS52aXJ0dWFsZnM7dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5oZWxwZXJzO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jb21tb24uaW87dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5rZXg7dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5rZXlwcm92aWRlcjt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLnNlc3Npb247dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5zaWduYXR1cmU7dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi51dGlsLmJ1ZmZlcjt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLnV0aWwubG9nZ2luZzt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLnV0aWwuc2VjdXJpdHk7dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi51dGlsLnRocmVhZHM7dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLmNvcmU7dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLnNlcnZlcjt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuc2VydmVyLmF1dGg7dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLnNlcnZlci5hdXRoLmdzczt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuc2VydmVyLmF1dGgua2V5Ym9hcmQ7dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLnNlcnZlci5hdXRoLnBhc3N3b3JkO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5zZXJ2ZXIuY29tbWFuZDt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuc2VydmVyLnNlc3Npb247dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLnNlcnZlci5zaGVsbDt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuc2VydmVyLnN1YnN5c3RlbTt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuc2Z0cDt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuc2Z0cC5zZXJ2ZXI7dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5hbm5vdGF0aW9uczt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmFwaTt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnM7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnM7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5qdW5pdDt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmxpYjt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGs7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQ7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC51dGlsO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAogIG9yZy5qdW5pdDt2ZXJzaW9uPSJbNC4xMyw1LjAuMCkiLAogIG9yZy5qdW5pdC5leHBlcmltZW50YWwudGhlb3JpZXM7dmVyc2lvbj0iWzQuMTMsNS4wLjApIiwKICBvcmcuc2xmNGo7dmVyc2lvbj0iWzEuNy4wLDIuMC4wKSIKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LnNzaDt2ZXJzaW9uPSI2LjAuMSIKK0V4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LnNzaDt2ZXJzaW9uPSI2LjEuMSIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuc3NoL01FVEEtSU5GL1NPVVJDRS1NQU5JRkVTVC5NRiBiL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuc3NoL01FVEEtSU5GL1NPVVJDRS1NQU5JRkVTVC5NRgppbmRleCA3MTMyYjViLi40MTI0NmJjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LnNzaC9NRVRBLUlORi9TT1VSQ0UtTUFOSUZFU1QuTUYKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5zc2gvTUVUQS1JTkYvU09VUkNFLU1BTklGRVNULk1GCkBAIC0zLDUgKzMsNSBAQAogQnVuZGxlLU5hbWU6IG9yZy5lY2xpcHNlLmpnaXQuanVuaXQuc3NoIC0gU291cmNlcwogQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5zc2guc291cmNlCiBCdW5kbGUtVmVuZG9yOiBFY2xpcHNlLm9yZyAtIEpHaXQKLUJ1bmRsZS1WZXJzaW9uOiA2LjAuMS5xdWFsaWZpZXIKLUVjbGlwc2UtU291cmNlQnVuZGxlOiBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LnNzaDt2ZXJzaW9uPSI2LjAuMS5xdWFsaWZpZXIiO3Jvb3RzPSIuIgorQnVuZGxlLVZlcnNpb246IDYuMS4xLnF1YWxpZmllcgorRWNsaXBzZS1Tb3VyY2VCdW5kbGU6IG9yZy5lY2xpcHNlLmpnaXQuanVuaXQuc3NoO3ZlcnNpb249IjYuMS4xLnF1YWxpZmllciI7cm9vdHM9Ii4iCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LnNzaC9wb20ueG1sIGIvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5zc2gvcG9tLnhtbAppbmRleCA3NmJkY2ExLi4wN2QwMjE4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LnNzaC9wb20ueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuc3NoL3BvbS54bWwKQEAgLTE3LDcgKzE3LDcgQEAKICAgPHBhcmVudD4KICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0PC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjYuMC4xLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjYuMS4xLVNOQVBTSE9UPC92ZXJzaW9uPgogICA8L3BhcmVudD4KIAogICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LnNzaDwvYXJ0aWZhY3RJZD4KQEAgLTU1LDYgKzU1LDE2IEBACiAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLnNzaGQ8L2dyb3VwSWQ+CiAgICAgICA8YXJ0aWZhY3RJZD5zc2hkLXNmdHA8L2FydGlmYWN0SWQ+CiAgICAgICA8dmVyc2lvbj4ke2FwYWNoZS1zc2hkLXZlcnNpb259PC92ZXJzaW9uPgorICAgICAgPGV4Y2x1c2lvbnM+CisgICAgICAgICAgPGV4Y2x1c2lvbj4KKyAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5zc2hkPC9ncm91cElkPgorICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zc2hkLWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgPC9leGNsdXNpb24+CisgICAgICAgICAgPGV4Y2x1c2lvbj4KKyAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5zc2hkPC9ncm91cElkPgorICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zc2hkLWNvbW1vbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgIDwvZXhjbHVzaW9ucz4KICAgICA8L2RlcGVuZGVuY3k+CiAKICAgICA8ZGVwZW5kZW5jeT4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuanVuaXQvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0L01FVEEtSU5GL01BTklGRVNULk1GCmluZGV4IDFmMDIxZGEuLjdhM2IyMDAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuanVuaXQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMywzNSArMywzNSBAQAogQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZQogQXV0b21hdGljLU1vZHVsZS1OYW1lOiBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0CiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0Ci1CdW5kbGUtVmVyc2lvbjogNi4wLjEucXVhbGlmaWVyCitCdW5kbGUtVmVyc2lvbjogNi4xLjEucXVhbGlmaWVyCiBCdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KIEJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yCiBCdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQogQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEphdmFTRS0xMQotSW1wb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpnaXQuYW5ub3RhdGlvbnM7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5hcGk7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuZGlyY2FjaGU7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5lcnJvcnM7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnBhY2s7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5saWI7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5tZXJnZTt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGs7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQ7dmVyc2lvbj0iNi4wLjEiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGs7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5maWx0ZXI7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC51dGlsO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5pbzt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwudGltZTt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKK0ltcG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0LmFubm90YXRpb25zO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuYXBpO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9yczt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmRpcmNhY2hlO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5maWxlO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5wYWNrO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubWVyZ2U7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5maWxlO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0O3ZlcnNpb249IjYuMS4xIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuZmlsdGVyO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudXRpbDt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuaW87dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC51dGlsLnRpbWU7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCiAgb3JnLmp1bml0O3ZlcnNpb249Ils0LjEzLDUuMC4wKSIsCiAgb3JnLmp1bml0LnJ1bGVzO3ZlcnNpb249Ils0LjEzLDUuMC4wKSIsCiAgb3JnLmp1bml0LnJ1bm5lcjt2ZXJzaW9uPSJbNC4xMyw1LjAuMCkiLAogIG9yZy5qdW5pdC5ydW5uZXJzO3ZlcnNpb249Ils0LjEzLDUuMC4wKSIsCiAgb3JnLmp1bml0LnJ1bm5lcnMubW9kZWw7dmVyc2lvbj0iWzQuMTMsNS4wLjApIiwKICBvcmcuc2xmNGo7dmVyc2lvbj0iWzEuNy4wLDIuMC4wKSIKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0O3ZlcnNpb249IjYuMC4xIjsKK0V4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0O3ZlcnNpb249IjYuMS4xIjsKICAgdXNlczo9Im9yZy5lY2xpcHNlLmpnaXQuZGlyY2FjaGUsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LmxpYiwKICAgIG9yZy5lY2xpcHNlLmpnaXQucmV2d2FsaywKQEAgLTQ0LDQgKzQ0LDQgQEAKICAgIG9yZy5qdW5pdC5ydW5uZXJzLm1vZGVsLAogICAgb3JnLmp1bml0LnJ1bm5lciwKICAgIG9yZy5lY2xpcHNlLmpnaXQudXRpbC50aW1lIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LnRpbWU7dmVyc2lvbj0iNi4wLjEiO3VzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LnV0aWwudGltZSIKKyBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LnRpbWU7dmVyc2lvbj0iNi4xLjEiO3VzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LnV0aWwudGltZSIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuanVuaXQvTUVUQS1JTkYvU09VUkNFLU1BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC9NRVRBLUlORi9TT1VSQ0UtTUFOSUZFU1QuTUYKaW5kZXggMTU2ZTU5YS4uMjU4NzZjNyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC9NRVRBLUlORi9TT1VSQ0UtTUFOSUZFU1QuTUYKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC9NRVRBLUlORi9TT1VSQ0UtTUFOSUZFU1QuTUYKQEAgLTMsNSArMyw1IEBACiBCdW5kbGUtTmFtZTogb3JnLmVjbGlwc2UuamdpdC5qdW5pdCAtIFNvdXJjZXMKIEJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpnaXQuanVuaXQuc291cmNlCiBCdW5kbGUtVmVuZG9yOiBFY2xpcHNlLm9yZyAtIEpHaXQKLUJ1bmRsZS1WZXJzaW9uOiA2LjAuMS5xdWFsaWZpZXIKLUVjbGlwc2UtU291cmNlQnVuZGxlOiBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0O3ZlcnNpb249IjYuMC4xLnF1YWxpZmllciI7cm9vdHM9Ii4iCitCdW5kbGUtVmVyc2lvbjogNi4xLjEucXVhbGlmaWVyCitFY2xpcHNlLVNvdXJjZUJ1bmRsZTogb3JnLmVjbGlwc2UuamdpdC5qdW5pdDt2ZXJzaW9uPSI2LjEuMS5xdWFsaWZpZXIiO3Jvb3RzPSIuIgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC9wb20ueG1sIGIvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC9wb20ueG1sCmluZGV4IGVmMmI5NDYuLjJjMjYwZTIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuanVuaXQvcG9tLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0L3BvbS54bWwKQEAgLTE5LDcgKzE5LDcgQEAKICAgPHBhcmVudD4KICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0PC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjYuMC4xLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjYuMS4xLVNOQVBTSE9UPC92ZXJzaW9uPgogICA8L3BhcmVudD4KIAogICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0PC9hcnRpZmFjdElkPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9Mb2NhbERpc2tSZXBvc2l0b3J5VGVzdENhc2UuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQuanVuaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvanVuaXQvTG9jYWxEaXNrUmVwb3NpdG9yeVRlc3RDYXNlLmphdmEKaW5kZXggNDk0ZDJmMy4uYTNjNWIxMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9Mb2NhbERpc2tSZXBvc2l0b3J5VGVzdENhc2UuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2p1bml0L0xvY2FsRGlza1JlcG9zaXRvcnlUZXN0Q2FzZS5qYXZhCkBAIC00NSw2ICs0NSw4IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLlN5c3RlbVJlYWRlcjsKIGltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuUnVsZTsKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuVGVzdE5hbWU7CiAKIC8qKgogICogSlVuaXQgVGVzdENhc2Ugd2l0aCBzcGVjaWFsaXplZCBzdXBwb3J0IGZvciB0ZW1wb3JhcnkgbG9jYWwgcmVwb3NpdG9yeS4KQEAgLTg0LDE4ICs4NiwzMyBAQCBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgTG9jYWxEaXNrUmVwb3NpdG9yeVRlc3RDYXNlIHsKIAlwcml2YXRlIEZpbGUgdG1wOwogCiAJLyoqCisJICogVGhlIGN1cnJlbnQgdGVzdCBuYW1lLgorCSAqLworCUBSdWxlCisJcHVibGljIFRlc3ROYW1lIGN1cnJlbnRUZXN0ID0gbmV3IFRlc3ROYW1lKCk7CisKKwlwcml2YXRlIFN0cmluZyBnZXRUZXN0TmFtZSgpIHsKKwkJU3RyaW5nIG5hbWUgPSBjdXJyZW50VGVzdC5nZXRNZXRob2ROYW1lKCk7CisJCW5hbWUgPSBuYW1lLnJlcGxhY2VBbGwoIlteYS16QS1aMC05XSIsICJfIik7CisJCW5hbWUgPSBuYW1lLnJlcGxhY2VBbGwoIl9fKyIsICJfIik7CisJCWlmIChuYW1lLnN0YXJ0c1dpdGgoIl8iKSkgeworCQkJbmFtZSA9IG5hbWUuc3Vic3RyaW5nKDEpOworCQl9CisJCXJldHVybiBuYW1lOworCX0KKworCS8qKgogCSAqIFNldHVwIHRlc3QKIAkgKgogCSAqIEB0aHJvd3MgRXhjZXB0aW9uCiAJICovCiAJQEJlZm9yZQogCXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRtcCA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoImpnaXRfdGVzdF8iLCAiX3RtcCIpOworCQl0bXAgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJqZ2l0XyIgKyBnZXRUZXN0TmFtZSgpICsgJ18nLCAiX3RtcCIpOwogCQlDbGVhbnVwVGhyZWFkLmRlbGV0ZU9uU2h1dGRvd24odG1wKTsKIAkJaWYgKCF0bXAuZGVsZXRlKCkgfHwgIXRtcC5ta2RpcigpKSB7CiAJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkNhbm5vdCBjcmVhdGUgIiArIHRtcCk7CiAJCX0KLQogCQltb2NrU3lzdGVtUmVhZGVyID0gbmV3IE1vY2tTeXN0ZW1SZWFkZXIoKTsKIAkJU3lzdGVtUmVhZGVyLnNldEluc3RhbmNlKG1vY2tTeXN0ZW1SZWFkZXIpOwogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIudGVzdC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GCmluZGV4IGIyYTgyYzIuLmNiYjgxMzUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GCisrKyBiL29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0zLDcgKzMsNyBAQAogQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZQogQXV0b21hdGljLU1vZHVsZS1OYW1lOiBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIudGVzdAogQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLnRlc3QKLUJ1bmRsZS1WZXJzaW9uOiA2LjAuMS5xdWFsaWZpZXIKK0J1bmRsZS1WZXJzaW9uOiA2LjEuMS5xdWFsaWZpZXIKIEJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yCiBCdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KIEJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKYXZhU0UtMTEKQEAgLTI2LDI0ICsyNiwyNCBAQAogIG9yZy5lY2xpcHNlLmpldHR5LnV0aWwubG9nO3ZlcnNpb249IlsxMC4wLjAsMTEuMC4wKSIsCiAgb3JnLmVjbGlwc2UuamV0dHkudXRpbC5zZWN1cml0eTt2ZXJzaW9uPSJbMTAuMC4wLDExLjAuMCkiLAogIG9yZy5lY2xpcHNlLmpldHR5LnV0aWwudGhyZWFkO3ZlcnNpb249IlsxMC4wLjAsMTEuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5hcGk7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5maWxlO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuanVuaXQ7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubGZzO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubGZzLmVycm9yczt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5saWI7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci5mczt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0O3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsazt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuZmlsdGVyO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudXRpbDt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmFwaTt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnM7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5qdW5pdDt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0Lmh0dHA7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5sZnM7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5sZnMuZXJyb3JzO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGZzLmxpYjt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXI7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLmZzO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGZzLnRlc3Q7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5saWI7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5maWxlO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0O3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGs7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5maWx0ZXI7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC51dGlsO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAogIG9yZy5oYW1jcmVzdC5jb3JlO3ZlcnNpb249IlsxLjEuMCwzLjAuMCkiLAogIG9yZy5qdW5pdDt2ZXJzaW9uPSJbNC4xMyw1LjAuMCkiLAogIG9yZy5qdW5pdC5ydWxlczt2ZXJzaW9uPSJbNC4xMyw1LjAuMCkiLApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLnRlc3QvcG9tLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci50ZXN0L3BvbS54bWwKaW5kZXggZWY4NzUxZS4uMWJhYjYyMCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLnRlc3QvcG9tLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIudGVzdC9wb20ueG1sCkBAIC0xNyw3ICsxNyw3IEBACiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj42LjAuMS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8dmVyc2lvbj42LjEuMS1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPC9wYXJlbnQ+CiAKICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLnRlc3Q8L2FydGlmYWN0SWQ+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9sZnMvc2VydmVyL2ZzL1B1c2hUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9sZnMvc2VydmVyL2ZzL1B1c2hUZXN0LmphdmEKaW5kZXggNzBjMDQ2My4uMDY3MDhiMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGZzL3NlcnZlci9mcy9QdXNoVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9zZXJ2ZXIvZnMvUHVzaFRlc3QuamF2YQpAQCAtMTEsNiArMTEsNyBAQAogCiBpbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIAogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKQEAgLTI5LDYgKzMwLDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2Q29tbWl0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5SZXZXYWxrOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5maWxlLkZpbGVSZXBvc2l0b3J5QnVpbGRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5SZWZTcGVjOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlVSSWlzaDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLlRyZWVXYWxrOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuZmlsdGVyLlBhdGhGaWx0ZXI7CkBAIC0xMjgsNCArMTMwLDE4IEBAIHB1YmxpYyB2b2lkIHRlc3RQdXNoU2ltcGxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCQkJc2VydmVyLmdldFJlcXVlc3RzKCkudG9TdHJpbmcoKSk7CiAJfQogCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0RGVsZXRlQnJhbmNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBicmFuY2ggPSAibmV3LWJyYW5jaCI7CisJCWdpdC5icmFuY2hDcmVhdGUoKS5zZXROYW1lKGJyYW5jaCkuY2FsbCgpOworCisJCVN0cmluZyBkZXN0UmVmID0gQ29uc3RhbnRzLlJfSEVBRFMgKyBicmFuY2g7CisJCWdpdC5wdXNoKCkuc2V0UmVmU3BlY3MobmV3IFJlZlNwZWMoKS5zZXRTb3VyY2UoYnJhbmNoKS5zZXREZXN0aW5hdGlvbihkZXN0UmVmKSkuY2FsbCgpOworCisJCS8vIFNob3VsZCBub3QgZmFpbCBvbiBwdXNoLgorCQlnaXQuYnJhbmNoRGVsZXRlKCkuc2V0QnJhbmNoTmFtZXMoYnJhbmNoKS5zZXRGb3JjZSh0cnVlKS5jYWxsKCk7CisJCWdpdC5wdXNoKCkuc2V0UmVmU3BlY3MobmV3IFJlZlNwZWMoKS5zZXRTb3VyY2UobnVsbCkuc2V0RGVzdGluYXRpb24oZGVzdFJlZikpLmNhbGwoKTsKKworCQlhc3NlcnRUcnVlKHNlcnZlci5nZXRSZXF1ZXN0cygpLmlzRW1wdHkoKSk7CisJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyL01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyL01FVEEtSU5GL01BTklGRVNULk1GCmluZGV4IDNhNDQ0OGIuLmNkOGJkZTMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTMsMTkgKzMsMTkgQEAKIEJ1bmRsZS1OYW1lOiAlQnVuZGxlLU5hbWUKIEF1dG9tYXRpYy1Nb2R1bGUtTmFtZTogb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyCiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIKLUJ1bmRsZS1WZXJzaW9uOiA2LjAuMS5xdWFsaWZpZXIKK0J1bmRsZS1WZXJzaW9uOiA2LjEuMS5xdWFsaWZpZXIKIEJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgogQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXI7dmVyc2lvbj0iNi4wLjEiOworRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlcjt2ZXJzaW9uPSI2LjEuMSI7CiAgIHVzZXM6PSJqYXZheC5zZXJ2bGV0Lmh0dHAsCiAgICBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5saWIiLAotIG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci5mczt2ZXJzaW9uPSI2LjAuMSI7Cisgb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLmZzO3ZlcnNpb249IjYuMS4xIjsKICAgdXNlczo9ImphdmF4LnNlcnZsZXQsCiAgICBqYXZheC5zZXJ2bGV0Lmh0dHAsCiAgICBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIsCiAgICBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5saWIiLAotIG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci5pbnRlcm5hbDt2ZXJzaW9uPSI2LjAuMSI7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIuczM7dmVyc2lvbj0iNi4wLjEiOworIG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci5pbnRlcm5hbDt2ZXJzaW9uPSI2LjEuMSI7eC1pbnRlcm5hbDo9dHJ1ZSwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIuczM7dmVyc2lvbj0iNi4xLjEiOwogICB1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLAogICAgb3JnLmVjbGlwc2UuamdpdC5sZnMubGliIgogQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEphdmFTRS0xMQpAQCAtMjQsMTUgKzI0LDE1IEBACiAgamF2YXguc2VydmxldC5hbm5vdGF0aW9uO3ZlcnNpb249IlszLjEuMCw1LjAuMCkiLAogIGphdmF4LnNlcnZsZXQuaHR0cDt2ZXJzaW9uPSJbMy4xLjAsNS4wLjApIiwKICBvcmcuYXBhY2hlLmh0dHA7dmVyc2lvbj0iWzQuMy4wLDUuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5hbm5vdGF0aW9uczt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5maWxlO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubGZzLmVycm9yczt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5pbnRlcm5hbDt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5saWI7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5saWI7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5ubHM7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuaHR0cDt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5odHRwLmFwYWNoZTt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5hbm5vdGF0aW9uczt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5maWxlO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGZzLmVycm9yczt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5pbnRlcm5hbDt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5saWI7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5saWI7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5ubHM7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuaHR0cDt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5odHRwLmFwYWNoZTt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCiAgb3JnLnNsZjRqO3ZlcnNpb249IlsxLjcuMCwyLjAuMCkiCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIvTUVUQS1JTkYvU09VUkNFLU1BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyL01FVEEtSU5GL1NPVVJDRS1NQU5JRkVTVC5NRgppbmRleCA1MDExYTIyLi41YTViMjNhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIvTUVUQS1JTkYvU09VUkNFLU1BTklGRVNULk1GCisrKyBiL29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci9NRVRBLUlORi9TT1VSQ0UtTUFOSUZFU1QuTUYKQEAgLTMsNSArMyw1IEBACiBCdW5kbGUtTmFtZTogb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyIC0gU291cmNlcwogQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLnNvdXJjZQogQnVuZGxlLVZlbmRvcjogRWNsaXBzZS5vcmcgLSBKR2l0Ci1CdW5kbGUtVmVyc2lvbjogNi4wLjEucXVhbGlmaWVyCi1FY2xpcHNlLVNvdXJjZUJ1bmRsZTogb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyO3ZlcnNpb249IjYuMC4xLnF1YWxpZmllciI7cm9vdHM9Ii4iCitCdW5kbGUtVmVyc2lvbjogNi4xLjEucXVhbGlmaWVyCitFY2xpcHNlLVNvdXJjZUJ1bmRsZTogb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyO3ZlcnNpb249IjYuMS4xLnF1YWxpZmllciI7cm9vdHM9Ii4iCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIvcG9tLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci9wb20ueG1sCmluZGV4IGMyZDY1OTYuLmFlMjcxNTMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci9wb20ueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci9wb20ueG1sCkBAIC0xNyw3ICsxNyw3IEBACiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj42LjAuMS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8dmVyc2lvbj42LjEuMS1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPC9wYXJlbnQ+CiAKICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyPC9hcnRpZmFjdElkPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5sZnMudGVzdC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL29yZy5lY2xpcHNlLmpnaXQubGZzLnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYKaW5kZXggYjg3MDc5NC4uZTNjMGFmOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5sZnMudGVzdC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0zLDI0ICszLDI3IEBACiBCdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lCiBBdXRvbWF0aWMtTW9kdWxlLU5hbWU6IG9yZy5lY2xpcHNlLmpnaXQubGZzLnRlc3QKIEJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpnaXQubGZzLnRlc3QKLUJ1bmRsZS1WZXJzaW9uOiA2LjAuMS5xdWFsaWZpZXIKK0J1bmRsZS1WZXJzaW9uOiA2LjEuMS5xdWFsaWZpZXIKIEJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yCiBCdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KIEJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKYXZhU0UtMTEKLUltcG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0LmFwaTt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmF0dHJpYnV0ZXM7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmRmczt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0O3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubGZzO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubGZzLmVycm9yczt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5saWI7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5saWI7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGs7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5maWx0ZXI7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC51dGlsO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAorSW1wb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpnaXQuYXBpO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuYXR0cmlidXRlczt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZGZzO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuanVuaXQ7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5sZnM7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5sZnMuZXJyb3JzO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGZzLmludGVybmFsO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGZzLmxpYjt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmxpYjt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGs7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQ7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuaHR0cDt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuZmlsdGVyO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudXRpbDt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKICBvcmcuaGFtY3Jlc3QuY29yZTt2ZXJzaW9uPSJbMS4xLjAsMy4wLjApIiwKICBvcmcuanVuaXQ7dmVyc2lvbj0iWzQuMTMsNS4wLjApIiwKICBvcmcuanVuaXQucnVubmVyO3ZlcnNpb249Ils0LjEzLDUuMC4wKSIsCiAgb3JnLmp1bml0LnJ1bm5lcnM7dmVyc2lvbj0iWzQuMTMsNS4wLjApIgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpnaXQubGZzLnRlc3Q7dmVyc2lvbj0iNi4wLjEiO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci50ZXN0IgorRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpnaXQubGZzLnRlc3Q7dmVyc2lvbj0iNi4xLjEiO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci50ZXN0IgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5sZnMudGVzdC9wb20ueG1sIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMudGVzdC9wb20ueG1sCmluZGV4IGE4OGNhOTQuLjFkNzgyZTYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQubGZzLnRlc3QvcG9tLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0L3BvbS54bWwKQEAgLTE3LDcgKzE3LDcgQEAKICAgPHBhcmVudD4KICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0PC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjYuMC4xLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjYuMS4xLVNOQVBTSE9UPC92ZXJzaW9uPgogICA8L3BhcmVudD4KIAogICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0PC9hcnRpZmFjdElkPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5sZnMudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9sZnMvTGZzQ29uZmlnR2l0VGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9sZnMvTGZzQ29uZmlnR2l0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4YTA3MTIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9MZnNDb25maWdHaXRUZXN0LmphdmEKQEAgLTAsMCArMSwzMDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjIsIE1hdHRoaWFzIEZyb21tZSA8bWZyb21tZUBkc3BhY2UuZGU+CisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmxmczsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuR2l0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLlJlc2V0Q29tbWFuZC5SZXNldFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hdHRyaWJ1dGVzLkZpbHRlckNvbW1hbmQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hdHRyaWJ1dGVzLkZpbHRlckNvbW1hbmRSZWdpc3RyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LlJlcG9zaXRvcnlUZXN0Q2FzZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5pbnRlcm5hbC5MZnNDb25uZWN0aW9uRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5saWIuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbmZpZ0NvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZXBvc2l0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlN0b3JlZENvbmZpZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5odHRwLkh0dHBDb25uZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5IdHRwU3VwcG9ydDsKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXJDbGFzczsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworLyoqCisgKiBUZXN0IGlmIHRoZSBsZnMgY29uZmlnIGlzIHVzZWQgaW4gdGhlIGNvcnJlY3Qgd2F5IGR1cmluZyBjaGVja291dC4KKyAqCisgKiBUd28gbGZzLWZpbGVzIGFyZSBjcmVhdGVkLCBvbmUgdGhhdCBjb21lcyBiZWZvcmUgLmdpdGF0dHJpYnV0ZXMgYW5kCisgKiAubGZzY29uZmlnIGluIGdpdCBvcmRlciAoIi5hYWEudHh0IikgYW5kIG9uZSB0aGF0IGNvbWVzIGFmdGVyICgienp6LnR4dCIpLgorICoKKyAqIER1cmluZyBjaGVja291dC9yZXNldCBpdCBpcyB0ZXN0ZWQgaWYgdGhlIGNvcnJlY3QgdmVyc2lvbiBvZiB0aGUgbGZzIGNvbmZpZworICogaXMgdXNlZC4KKyAqCisgKiBUT0RPOiBUaGUgY3VycmVudCBiZWhhdmlvciBzZWVtcyBhIGxpdHRsZSBiaXQgc3RyYW5nZS91bmludHVpdGl2ZS4gU29tZSBmaWxlcworICogYXJlIGNoZWNrZWQgb3V0IGJlZm9yZSBhbmQgc29tZSBhZnRlciB0aGUgY29uZmlnIGZpbGVzLiBUaGlzIGxlYWRzIHRvIHRoZQorICogYmVoYXZpb3IsIHRoYXQgZHVyaW5nIGEgc2luZ2xlIGNvbW1hbmQgdGhlIGNvbmZpZyBjaGFuZ2VzLiBTaW5jZSB0aGlzIHNlZW1zCisgKiB0byBiZSB0aGUgc2FtZSB3YXkgaW4gbmF0aXZlIGdpdCwgdGhlIGJlaGF2aW9yIGlzIGFjY2VwdGVkIGZvciBub3cuCisgKgorICovCitwdWJsaWMgY2xhc3MgTGZzQ29uZmlnR2l0VGVzdCBleHRlbmRzIFJlcG9zaXRvcnlUZXN0Q2FzZSB7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU01VREdFX05BTUUgPSBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQlVJTFRJTl9GSUxURVJfUFJFRklYCisJCQkrIENvbnN0YW50cy5BVFRSX0ZJTFRFUl9EUklWRVJfUFJFRklYCisJCQkrIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5BVFRSX0ZJTFRFUl9UWVBFX1NNVURHRTsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMRlNfU0VSVkVSX1VSSTEgPSAiaHR0cHM6Ly9sZnMuc2VydmVyMS90ZXN0L3VyaSI7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhQRUNURURfU0VSVkVSX1VSTDEgPSBMRlNfU0VSVkVSX1VSSTEKKwkJCSsgUHJvdG9jb2wuT0JKRUNUU19MRlNfRU5EUE9JTlQ7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEZTX1NFUlZFUl9VUkkyID0gImh0dHBzOi8vbGZzLnNlcnZlcjIvdGVzdC91cmkiOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYUEVDVEVEX1NFUlZFUl9VUkwyID0gTEZTX1NFUlZFUl9VUkkyCisJCQkrIFByb3RvY29sLk9CSkVDVFNfTEZTX0VORFBPSU5UOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExGU19TRVJWRVJfVVJJMyA9ICJodHRwczovL2xmcy5zZXJ2ZXIzL3Rlc3QvdXJpIjsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFBFQ1RFRF9TRVJWRVJfVVJMMyA9IExGU19TRVJWRVJfVVJJMworCQkJKyBQcm90b2NvbC5PQkpFQ1RTX0xGU19FTkRQT0lOVDsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGQUtFX0xGU19QT0lOVEVSMSA9ICJ2ZXJzaW9uIGh0dHBzOi8vZ2l0LWxmcy5naXRodWIuY29tL3NwZWMvdjFcbiIKKwkJCSsgIm9pZCBzaGEyNTY6NmNlOWZhYjUyZWU5YTZjNGMwOTdkZWY0ZTA0OWM2YWNkZWJhNDRjOTlkMjZlODNiYTgwYWRlYzE0NzNjOWIyZFxuIgorCQkJKyAic2l6ZSAyNTM5NTJcbiI7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFLRV9MRlNfUE9JTlRFUjIgPSAidmVyc2lvbiBodHRwczovL2dpdC1sZnMuZ2l0aHViLmNvbS9zcGVjL3YxXG4iCisJCQkrICJvaWQgc2hhMjU2OmE0YjcxMWNkOTg5ODYzYWUyMDM4NzU4YTYyNjcyMTM4MzQ3YWJiYmFlNDA3NmE3YWQzYTU0NWZkYTdkMDhmODJcbiIKKwkJCSsgInNpemUgNjcwNzJcbiI7CisKKwlwcml2YXRlIHN0YXRpYyBMaXN0PFN0cmluZz4gY2hlY2tvdXRVUkxzID0gbmV3IEFycmF5TGlzdDw+KCk7CisKKwlzdGF0aWMgY2xhc3MgU211ZGdlRmlsdGVyTW9jayBleHRlbmRzIEZpbHRlckNvbW1hbmQgeworCQlwdWJsaWMgU211ZGdlRmlsdGVyTW9jayhSZXBvc2l0b3J5IGRiLCBJbnB1dFN0cmVhbSBpbiwKKwkJCQlPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24geworCQkJc3VwZXIoaW4sIG91dCk7CisJCQlIdHRwQ29ubmVjdGlvbiBsZnNTZXJ2ZXJDb25uID0gTGZzQ29ubmVjdGlvbkZhY3RvcnkuZ2V0TGZzQ29ubmVjdGlvbihkYiwKKwkJCQkJSHR0cFN1cHBvcnQuTUVUSE9EX1BPU1QsIFByb3RvY29sLk9QRVJBVElPTl9ET1dOTE9BRCk7CisJCQljaGVja291dFVSTHMuYWRkKGxmc1NlcnZlckNvbm4uZ2V0VVJMKCkudG9TdHJpbmcoKSk7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIGludCBydW4oKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQkJLy8gU3R1cGlkIG5vIGltcGwKKwkJCWluLnRyYW5zZmVyVG8ob3V0KTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCUBCZWZvcmVDbGFzcworCXB1YmxpYyBzdGF0aWMgdm9pZCBpbnN0YWxsTGZzKCkgeworCQlGaWx0ZXJDb21tYW5kUmVnaXN0cnkucmVnaXN0ZXIoU01VREdFX05BTUUsIFNtdWRnZUZpbHRlck1vY2s6Om5ldyk7CisJfQorCisJQEFmdGVyQ2xhc3MKKwlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlTGZzKCkgeworCQlGaWx0ZXJDb21tYW5kUmVnaXN0cnkudW5yZWdpc3RlcihTTVVER0VfTkFNRSk7CisJfQorCisJcHJpdmF0ZSBHaXQgZ2l0OworCisJQE92ZXJyaWRlCisJQEJlZm9yZQorCXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXN1cGVyLnNldFVwKCk7CisJCWdpdCA9IG5ldyBHaXQoZGIpOworCQkvLyBjb21taXQgc29tZXRoaW5nCisJCXdyaXRlVHJhc2hGaWxlKCJUZXN0LnR4dCIsICJIZWxsbyB3b3JsZCIpOworCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oIlRlc3QudHh0IikuY2FsbCgpOworCQlnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgiSW5pdGlhbCBjb21taXQiKS5jYWxsKCk7CisJCS8vIHByZXBhcmUgdGhlIGNvbmZpZyBmb3IgTEZTCisJCVN0b3JlZENvbmZpZyBjb25maWcgPSBnaXQuZ2V0UmVwb3NpdG9yeSgpLmdldENvbmZpZygpOworCQljb25maWcuc2V0U3RyaW5nKCJmaWx0ZXIiLCAibGZzIiwgInNtdWRnZSIsIFNNVURHRV9OQU1FKTsKKwkJY29uZmlnLnNldFN0cmluZyhDb25maWdDb25zdGFudHMuQ09ORklHX0NPUkVfU0VDVElPTiwgbnVsbCwKKwkJCQlDb25maWdDb25zdGFudHMuQ09ORklHX0tFWV9BVVRPQ1JMRiwgImZhbHNlIik7CisJCWNvbmZpZy5zYXZlKCk7CisKKwkJZmlsZUJlZm9yZSA9IG51bGw7CisJCWZpbGVBZnRlciA9IG51bGw7CisJCWNvbmZpZ0ZpbGUgPSBudWxsOworCQlnaXRBdHRyaWJ1dGVzRmlsZSA9IG51bGw7CisJfQorCisJRmlsZSBmaWxlQmVmb3JlOworCisJRmlsZSBmaWxlQWZ0ZXI7CisKKwlGaWxlIGNvbmZpZ0ZpbGU7CisKKwlGaWxlIGdpdEF0dHJpYnV0ZXNGaWxlOworCisJcHJpdmF0ZSB2b2lkIGNyZWF0ZUxmc0ZpbGVzKFN0cmluZyBsZnNQb2ludGVyKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLyoKKwkJICogRmlsZU5hbWVzICIuYWFhLnR4dCIgYW5kICJ6enoudHh0IiBzZWVtIHRvIGJlIHN1ZmZpY2llbnQgdG8gZ2V0IHRoZQorCQkgKiBkZXNpcmVkIGNoZWNrb3V0IG9yZGVyIGJlZm9yZSBhbmQgYWZ0ZXIgIi5sZnNjb25maWciLCBhdCBsZWFzdCBpbiBhCisJCSAqIG51bWJlciBvZiBtYW51YWwgdHJpZXMuIFNpbmNlIHRoZSBmaWxlcyB0byBjaGVja291dCBhcmUgY29udGFpbmVkIGluCisJCSAqIGEgc2V0IChzZWUgRGlyQ2FjaGVDaGVja291dDo6ZG9DaGVja291dCkgdGhlIG9yZGVyIGNhbm5vdCBiZQorCQkgKiBndWFyYW50ZWVkLgorCQkgKi8KKworCQkvL0ZpbGUgdG8gYmUgY2hlY2tlZCBvdXQgYmVmb3JlIGxmcyBjb25maWcKKwkJU3RyaW5nIGZpbGVOYW1lQmVmb3JlID0gIi5hYWEudHh0IjsKKwkJZmlsZUJlZm9yZSA9IHdyaXRlVHJhc2hGaWxlKGZpbGVOYW1lQmVmb3JlLCBsZnNQb2ludGVyKTsKKwkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKGZpbGVOYW1lQmVmb3JlKS5jYWxsKCk7CisKKwkJLy8gRmlsZSB0byBiZSBjaGVja2VkIG91dCBhZnRlciBsZnMgY29uZmlnCisJCVN0cmluZyBmaWxlTmFtZUFmdGVyID0gInp6ei50eHQiOworCQlmaWxlQWZ0ZXIgPSB3cml0ZVRyYXNoRmlsZShmaWxlTmFtZUFmdGVyLCBsZnNQb2ludGVyKTsKKwkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKGZpbGVOYW1lQWZ0ZXIpLmNhbGwoKTsKKworCQlnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgiQ29tbWl0IExGUyBQb2ludGVyIGZpbGVzIikuY2FsbCgpOworCX0KKworCisJcHJpdmF0ZSBTdHJpbmcgYWRkTGZzQ29uZmlnRmlsZXMoU3RyaW5nIGxmc1NlcnZlclVybCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIEFkZCBjb25maWcgZmlsZXMgdG8gdGhlIHJlcG8KKwkJU3RyaW5nIGxmc0NvbmZpZzEgPSBjcmVhdGVMZnNDb25maWcobGZzU2VydmVyVXJsKTsKKwkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKENvbnN0YW50cy5ET1RfTEZTX0NPTkZJRykuY2FsbCgpOworCQkvLyBNb2RpZnkgZ2l0YXR0cmlidXRlcyBvbiBzZWNvbmQgY2FsbCwgdG8gZm9yY2UgY2hlY2tvdXQgdG9vLgorCQlpZiAoZ2l0QXR0cmlidXRlc0ZpbGUgPT0gbnVsbCkgeworCQkJZ2l0QXR0cmlidXRlc0ZpbGUgPSB3cml0ZVRyYXNoRmlsZSgiLmdpdGF0dHJpYnV0ZXMiLAorCQkJCSIqLnR4dCBmaWx0ZXI9bGZzIik7CisJCX0gZWxzZSB7CisJCQlnaXRBdHRyaWJ1dGVzRmlsZSA9IHdyaXRlVHJhc2hGaWxlKCIuZ2l0YXR0cmlidXRlcyIsCisJCQkJCSIqLnR4dCBmaWx0ZXI9bGZzXG4iKTsKKwkJfQorCisJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybigiLmdpdGF0dHJpYnV0ZXMiKS5jYWxsKCk7CisJCWdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJDb21taXQgY29uZmlnIGZpbGVzIikuY2FsbCgpOworCQlyZXR1cm4gbGZzQ29uZmlnMTsKKwl9CisKKwlwcml2YXRlIFN0cmluZyBjcmVhdGVMZnNDb25maWcoU3RyaW5nIGxmc1NlcnZlclVybCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGxmc0NvbmZpZzEgPSAiW2xmc11cbiAgICB1cmwgPSAiICsgbGZzU2VydmVyVXJsOworCQljb25maWdGaWxlID0gd3JpdGVUcmFzaEZpbGUoQ29uc3RhbnRzLkRPVF9MRlNfQ09ORklHLCBsZnNDb25maWcxKTsKKwkJcmV0dXJuIGxmc0NvbmZpZzE7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjaGVja291dExmc09iamVjdHNfcmVzZXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlTGZzRmlsZXMoRkFLRV9MRlNfUE9JTlRFUjEpOworCQlTdHJpbmcgbGZzQ29uZmlnMSA9IGFkZExmc0NvbmZpZ0ZpbGVzKExGU19TRVJWRVJfVVJJMSk7CisKKwkJLy8gRGVsZXRlIGZpbGVzIHRvIGZvcmNlIGFjdGlvbiBvbiByZXNldAorCQlhc3NlcnRUcnVlKGNvbmZpZ0ZpbGUuZGVsZXRlKCkpOworCQlhc3NlcnRUcnVlKGZpbGVCZWZvcmUuZGVsZXRlKCkpOworCQlhc3NlcnRUcnVlKGZpbGVBZnRlci5kZWxldGUoKSk7CisKKwkJYXNzZXJ0VHJ1ZShnaXRBdHRyaWJ1dGVzRmlsZS5kZWxldGUoKSk7CisKKwkJLy8gY3JlYXRlIGNvbmZpZyBmaWxlIHdpdGggZGlmZmVyZW50IHVybAorCQljcmVhdGVMZnNDb25maWcoTEZTX1NFUlZFUl9VUkkzKTsKKworCQljaGVja291dFVSTHMuY2xlYXIoKTsKKwkJZ2l0LnJlc2V0KCkuc2V0TW9kZShSZXNldFR5cGUuSEFSRCkuY2FsbCgpOworCisJCWNoZWNrRmlsZShjb25maWdGaWxlLCBsZnNDb25maWcxKTsKKwkJY2hlY2tGaWxlKGZpbGVCZWZvcmUsIEZBS0VfTEZTX1BPSU5URVIxKTsKKwkJY2hlY2tGaWxlKGZpbGVBZnRlciwgRkFLRV9MRlNfUE9JTlRFUjEpOworCisJCWFzc2VydEVxdWFscygyLCBjaGVja291dFVSTHMuc2l6ZSgpKTsKKwkJLy8gVE9ETzogU2hvdWxkIG1heSBiZSBFWFBFQ1RFRF9TRVJWUl9VUkwxCisJCWFzc2VydEVxdWFscyhFWFBFQ1RFRF9TRVJWRVJfVVJMMywgY2hlY2tvdXRVUkxzLmdldCgwKSk7CisJCWFzc2VydEVxdWFscyhFWFBFQ1RFRF9TRVJWRVJfVVJMMSwgY2hlY2tvdXRVUkxzLmdldCgxKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjaGVja291dExmc09iamVjdHNfQnJhbmNoU3dpdGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIENyZWF0ZSBhIG5ldyBicmFuY2ggIlVSTDEiIGFuZCBhZGQgY29uZmlnIGZpbGVzCisJCWdpdC5jaGVja291dCgpLnNldENyZWF0ZUJyYW5jaCh0cnVlKS5zZXROYW1lKCJVUkwxIikuY2FsbCgpOworCisJCWNyZWF0ZUxmc0ZpbGVzKEZBS0VfTEZTX1BPSU5URVIxKTsKKwkJU3RyaW5nIGxmc0NvbmZpZzEgPSBhZGRMZnNDb25maWdGaWxlcyhMRlNfU0VSVkVSX1VSSTEpOworCisJCS8vIENyZWF0ZSBhIHNlY29uZCBuZXcgYnJhbmNoICJVUkwyIiBhbmQgYWRkIGNvbmZpZyBmaWxlcworCQlnaXQuY2hlY2tvdXQoKS5zZXRDcmVhdGVCcmFuY2godHJ1ZSkuc2V0TmFtZSgiVVJMMiIpLmNhbGwoKTsKKworCQljcmVhdGVMZnNGaWxlcyhGQUtFX0xGU19QT0lOVEVSMik7CisJCVN0cmluZyBsZnNDb25maWcyID0gYWRkTGZzQ29uZmlnRmlsZXMoTEZTX1NFUlZFUl9VUkkyKTsKKworCQljaGVja0ZpbGUoY29uZmlnRmlsZSwgbGZzQ29uZmlnMik7CisJCWNoZWNrRmlsZShmaWxlQmVmb3JlLCBGQUtFX0xGU19QT0lOVEVSMik7CisJCWNoZWNrRmlsZShmaWxlQWZ0ZXIsIEZBS0VfTEZTX1BPSU5URVIyKTsKKworCQljaGVja291dFVSTHMuY2xlYXIoKTsKKwkJZ2l0LmNoZWNrb3V0KCkuc2V0TmFtZSgiVVJMMSIpLmNhbGwoKTsKKworCQljaGVja0ZpbGUoY29uZmlnRmlsZSwgbGZzQ29uZmlnMSk7CisJCWNoZWNrRmlsZShmaWxlQmVmb3JlLCBGQUtFX0xGU19QT0lOVEVSMSk7CisJCWNoZWNrRmlsZShmaWxlQWZ0ZXIsIEZBS0VfTEZTX1BPSU5URVIxKTsKKworCQlhc3NlcnRFcXVhbHMoMiwgY2hlY2tvdXRVUkxzLnNpemUoKSk7CisJCS8vIFRPRE86IFNob3VsZCBtYXkgYmUgRVhQRUNURURfU0VSVlJfVVJMMQorCQlhc3NlcnRFcXVhbHMoRVhQRUNURURfU0VSVkVSX1VSTDIsIGNoZWNrb3V0VVJMcy5nZXQoMCkpOworCQlhc3NlcnRFcXVhbHMoRVhQRUNURURfU0VSVkVSX1VSTDEsIGNoZWNrb3V0VVJMcy5nZXQoMSkpOworCisJCWNoZWNrb3V0VVJMcy5jbGVhcigpOworCQlnaXQuY2hlY2tvdXQoKS5zZXROYW1lKCJVUkwyIikuY2FsbCgpOworCisJCWNoZWNrRmlsZShjb25maWdGaWxlLCBsZnNDb25maWcyKTsKKwkJY2hlY2tGaWxlKGZpbGVCZWZvcmUsIEZBS0VfTEZTX1BPSU5URVIyKTsKKwkJY2hlY2tGaWxlKGZpbGVBZnRlciwgRkFLRV9MRlNfUE9JTlRFUjIpOworCisJCWFzc2VydEVxdWFscygyLCBjaGVja291dFVSTHMuc2l6ZSgpKTsKKwkJLy8gVE9ETzogU2hvdWxkIG1heSBiZSBFWFBFQ1RFRF9TRVJWUl9VUkwyCisJCWFzc2VydEVxdWFscyhFWFBFQ1RFRF9TRVJWRVJfVVJMMSwgY2hlY2tvdXRVUkxzLmdldCgwKSk7CisJCWFzc2VydEVxdWFscyhFWFBFQ1RFRF9TRVJWRVJfVVJMMiwgY2hlY2tvdXRVUkxzLmdldCgxKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjaGVja291dExmc09iamVjdHNfQnJhbmNoU3dpdGNoX01vZGlmaWVkTG9jYWwoKQorCQkJdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJLy8gQ3JlYXRlIGEgbmV3IGJyYW5jaCAiVVJMMSIgYW5kIGFkZCBjb25maWcgZmlsZXMKKwkJZ2l0LmNoZWNrb3V0KCkuc2V0Q3JlYXRlQnJhbmNoKHRydWUpLnNldE5hbWUoIlVSTDEiKS5jYWxsKCk7CisKKwkJY3JlYXRlTGZzRmlsZXMoRkFLRV9MRlNfUE9JTlRFUjEpOworCQlhZGRMZnNDb25maWdGaWxlcyhMRlNfU0VSVkVSX1VSSTEpOworCisJCS8vIENyZWF0ZSBhIHNlY29uZCBuZXcgYnJhbmNoICJVUkwyIiBhbmQgYWRkIGNvbmZpZyBmaWxlcworCQlnaXQuY2hlY2tvdXQoKS5zZXRDcmVhdGVCcmFuY2godHJ1ZSkuc2V0TmFtZSgiVVJMMiIpLmNhbGwoKTsKKworCQljcmVhdGVMZnNGaWxlcyhGQUtFX0xGU19QT0lOVEVSMik7CisJCWFkZExmc0NvbmZpZ0ZpbGVzKExGU19TRVJWRVJfVVJJMSk7CisKKwkJLy8gY3JlYXRlIGNvbmZpZyBmaWxlIHdpdGggZGlmZmVyZW50IHVybAorCQlhc3NlcnRUcnVlKGNvbmZpZ0ZpbGUuZGVsZXRlKCkpOworCQlTdHJpbmcgbGZzQ29uZmlnMyA9IGNyZWF0ZUxmc0NvbmZpZyhMRlNfU0VSVkVSX1VSSTMpOworCisJCWNoZWNrRmlsZShjb25maWdGaWxlLCBsZnNDb25maWczKTsKKwkJY2hlY2tGaWxlKGZpbGVCZWZvcmUsIEZBS0VfTEZTX1BPSU5URVIyKTsKKwkJY2hlY2tGaWxlKGZpbGVBZnRlciwgRkFLRV9MRlNfUE9JTlRFUjIpOworCisJCWNoZWNrb3V0VVJMcy5jbGVhcigpOworCQlnaXQuY2hlY2tvdXQoKS5zZXROYW1lKCJVUkwxIikuY2FsbCgpOworCisJCWNoZWNrRmlsZShmaWxlQmVmb3JlLCBGQUtFX0xGU19QT0lOVEVSMSk7CisJCWNoZWNrRmlsZShmaWxlQWZ0ZXIsIEZBS0VfTEZTX1BPSU5URVIxKTsKKwkJY2hlY2tGaWxlKGNvbmZpZ0ZpbGUsIGxmc0NvbmZpZzMpOworCisJCWFzc2VydEVxdWFscygyLCBjaGVja291dFVSTHMuc2l6ZSgpKTsKKworCQlhc3NlcnRFcXVhbHMoRVhQRUNURURfU0VSVkVSX1VSTDMsIGNoZWNrb3V0VVJMcy5nZXQoMCkpOworCQlhc3NlcnRFcXVhbHMoRVhQRUNURURfU0VSVkVSX1VSTDMsIGNoZWNrb3V0VVJMcy5nZXQoMSkpOworCisJCWNoZWNrb3V0VVJMcy5jbGVhcigpOworCQlnaXQuY2hlY2tvdXQoKS5zZXROYW1lKCJVUkwyIikuY2FsbCgpOworCisJCWNoZWNrRmlsZShmaWxlQmVmb3JlLCBGQUtFX0xGU19QT0lOVEVSMik7CisJCWNoZWNrRmlsZShmaWxlQWZ0ZXIsIEZBS0VfTEZTX1BPSU5URVIyKTsKKwkJY2hlY2tGaWxlKGNvbmZpZ0ZpbGUsIGxmc0NvbmZpZzMpOworCisJCWFzc2VydEVxdWFscygyLCBjaGVja291dFVSTHMuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVYUEVDVEVEX1NFUlZFUl9VUkwzLCBjaGVja291dFVSTHMuZ2V0KDApKTsKKwkJYXNzZXJ0RXF1YWxzKEVYUEVDVEVEX1NFUlZFUl9VUkwzLCBjaGVja291dFVSTHMuZ2V0KDEpKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9MZnNHaXRUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9MZnNHaXRUZXN0LmphdmEKaW5kZXggODk2NDMxMC4uM2U4M2M4ZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5sZnMudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9sZnMvTGZzR2l0VGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQubGZzLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGZzL0xmc0dpdFRlc3QuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMjEsIFRob21hcyBXb2xmIDx0aG9tYXMud29sZkBwYXJhbm9yLmNoPiBhbmQgb3RoZXJzCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEsIDIwMjIgVGhvbWFzIFdvbGYgPHRob21hcy53b2xmQHBhcmFub3IuY2g+IGFuZCBvdGhlcnMKICAqCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKQEAgLTY4LDYgKzY4LDI3IEBAIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJfQogCiAJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0QnJhbmNoU3dpdGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWdpdC5icmFuY2hDcmVhdGUoKS5zZXROYW1lKCJhYnJhbmNoIikuY2FsbCgpOworCQlnaXQuY2hlY2tvdXQoKS5zZXROYW1lKCJhYnJhbmNoIikuY2FsbCgpOworCQlGaWxlIGFGaWxlID0gd3JpdGVUcmFzaEZpbGUoImEuYmluIiwgImFhYSIpOworCQl3cml0ZVRyYXNoRmlsZSgiLmdpdGF0dHJpYnV0ZXMiLCAiYS5iaW4gZmlsdGVyPWxmcyIpOworCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oIi4iKS5jYWxsKCk7CisJCWdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJhY29tbWl0IikuY2FsbCgpOworCQlnaXQuY2hlY2tvdXQoKS5zZXROYW1lKCJtYXN0ZXIiKS5jYWxsKCk7CisJCWdpdC5icmFuY2hDcmVhdGUoKS5zZXROYW1lKCJiYnJhbmNoIikuY2FsbCgpOworCQlnaXQuY2hlY2tvdXQoKS5zZXROYW1lKCJiYnJhbmNoIikuY2FsbCgpOworCQlGaWxlIGJGaWxlID0gd3JpdGVUcmFzaEZpbGUoImIuYmluIiwgImJiYiIpOworCQl3cml0ZVRyYXNoRmlsZSgiLmdpdGF0dHJpYnV0ZXMiLCAiYi5iaW4gZmlsdGVyPWxmcyIpOworCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oIi4iKS5jYWxsKCk7CisJCWdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJiY29tbWl0IikuY2FsbCgpOworCQlnaXQuY2hlY2tvdXQoKS5zZXROYW1lKCJhYnJhbmNoIikuY2FsbCgpOworCQljaGVja0ZpbGUoYUZpbGUsICJhYWEiKTsKKwkJZ2l0LmNoZWNrb3V0KCkuc2V0TmFtZSgiYmJyYW5jaCIpLmNhbGwoKTsKKwkJY2hlY2tGaWxlKGJGaWxlLCAiYmJiIik7CisJfQorCisJQFRlc3QKIAlwdWJsaWMgdm9pZCBjaGVja291dE5vbkxmc1BvaW50ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJU3RyaW5nIGNvbnRlbnQgPSAic2l6ZV90XG5zb21lX2Z1bmN0aW9uKHZvaWQqIHB0cik7XG4iOwogCQlGaWxlIHNtYWxsRmlsZSA9IHdyaXRlVHJhc2hGaWxlKCJUZXN0LnR4dCIsIGNvbnRlbnQpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5sZnMudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9sZnMvaW50ZXJuYWwvTGZzQ29ubmVjdGlvbkZhY3RvcnlUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9pbnRlcm5hbC9MZnNDb25uZWN0aW9uRmFjdG9yeVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWRjYjdkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9sZnMvaW50ZXJuYWwvTGZzQ29ubmVjdGlvbkZhY3RvcnlUZXN0LmphdmEKQEAgLTAsMCArMSwzMTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjIgTmFpbCBTYW1hdG92IDxzYW5haWxAeWFuZGV4LnJ1PiBhbmQgb3RoZXJzCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5pbnRlcm5hbDsKKworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuREVGQVVMVF9SRU1PVEVfTkFNRTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhyb3dzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuR2l0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLlJlbW90ZUFkZENvbW1hbmQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hdHRyaWJ1dGVzLkZpbHRlckNvbW1hbmRSZWdpc3RyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LlJlcG9zaXRvcnlUZXN0Q2FzZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5DbGVhbkZpbHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5Qcm90b2NvbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5TbXVkZ2VGaWx0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5sZnMuZXJyb3JzLkxmc0NvbmZpZ0ludmFsaWRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5sZnMubGliLkNvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWdDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5TdG9yZWRDb25maWc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuVVJJaXNoOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0Lmh0dHAuSHR0cENvbm5lY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLkh0dHBTdXBwb3J0OworaW1wb3J0IG9yZy5qdW5pdC5BZnRlckNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitwdWJsaWMgY2xhc3MgTGZzQ29ubmVjdGlvbkZhY3RvcnlUZXN0IGV4dGVuZHMgUmVwb3NpdG9yeVRlc3RDYXNlIHsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTTVVER0VfTkFNRSA9IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5CVUlMVElOX0ZJTFRFUl9QUkVGSVgKKwkJCSsgQ29uc3RhbnRzLkFUVFJfRklMVEVSX0RSSVZFUl9QUkVGSVgKKwkJCSsgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkFUVFJfRklMVEVSX1RZUEVfU01VREdFOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENMRUFOX05BTUUgPSBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQlVJTFRJTl9GSUxURVJfUFJFRklYCisJCQkrIENvbnN0YW50cy5BVFRSX0ZJTFRFUl9EUklWRVJfUFJFRklYCisJCQkrIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5BVFRSX0ZJTFRFUl9UWVBFX0NMRUFOOworCisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIExGU19TRVJWRVJfVVJMMSA9ICJodHRwczovL2xmcy5zZXJ2ZXIxL3Rlc3QvdXJpIjsKKworCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBMRlNfU0VSVkVSX1VSTDIgPSAiaHR0cHM6Ly9sZnMuc2VydmVyMi90ZXN0L3VyaSI7CisKKwlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgT1JJR0lOX1VSTCA9ICJodHRwczovL2dpdC5zZXJ2ZXIvdGVzdC91cmkiOworCisJcHJpdmF0ZSBHaXQgZ2l0OworCisJQEJlZm9yZUNsYXNzCisJcHVibGljIHN0YXRpYyB2b2lkIGluc3RhbGxMZnMoKSB7CisJCUZpbHRlckNvbW1hbmRSZWdpc3RyeS5yZWdpc3RlcihTTVVER0VfTkFNRSwgU211ZGdlRmlsdGVyLkZBQ1RPUlkpOworCQlGaWx0ZXJDb21tYW5kUmVnaXN0cnkucmVnaXN0ZXIoQ0xFQU5fTkFNRSwgQ2xlYW5GaWx0ZXIuRkFDVE9SWSk7CisJfQorCisJQEFmdGVyQ2xhc3MKKwlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlTGZzKCkgeworCQlGaWx0ZXJDb21tYW5kUmVnaXN0cnkudW5yZWdpc3RlcihTTVVER0VfTkFNRSk7CisJCUZpbHRlckNvbW1hbmRSZWdpc3RyeS51bnJlZ2lzdGVyKENMRUFOX05BTUUpOworCX0KKworCUBPdmVycmlkZQorCUBCZWZvcmUKKwlwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworCQlzdXBlci5zZXRVcCgpOworCQlnaXQgPSBuZXcgR2l0KGRiKTsKKworCQkvLyBKdXN0IHRvIGhhdmUgYSBub24gZW1wdHkgcmVwbworCQl3cml0ZVRyYXNoRmlsZSgiVGVzdC50eHQiLCAiSGVsbG8gd29ybGQgZnJvbSB0aGUgTEZTIEZhY3RvcnkgVGVzdCIpOworCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oIlRlc3QudHh0IikuY2FsbCgpOworCQlnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgiSW5pdGlhbCBjb21taXQiKS5jYWxsKCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBsZnNVcmxGcm9tUmVtb3RlVXJsV2l0aERvdEdpdCgpIHRocm93cyBFeGNlcHRpb24geworCQlhZGRSZW1vdGVVcmwoImh0dHBzOi8vbG9jYWxob3N0L3JlcG8uZ2l0Iik7CisJCWNoZWNrTGZzVXJsKCJodHRwczovL2xvY2FsaG9zdC9yZXBvLmdpdC9pbmZvL2xmcyIpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgbGZzVXJsRnJvbVJlbW90ZVVybFdpdGhvdXREb3RHaXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJYWRkUmVtb3RlVXJsKCJodHRwczovL2xvY2FsaG9zdC9yZXBvIik7CisJCWNoZWNrTGZzVXJsKCJodHRwczovL2xvY2FsaG9zdC9yZXBvLmdpdC9pbmZvL2xmcyIpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgbGZzVXJsRnJvbUxvY2FsQ29uZmlnKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWFkZFJlbW90ZVVybCgiaHR0cHM6Ly9sb2NhbGhvc3QvcmVwbyIpOworCisJCVN0b3JlZENvbmZpZyBjZmcgPSAoKFJlcG9zaXRvcnkpIGRiKS5nZXRDb25maWcoKTsKKwkJY2ZnLnNldFN0cmluZyhDb25maWdDb25zdGFudHMuQ09ORklHX1NFQ1RJT05fTEZTLAorCQkJCW51bGwsCisJCQkJQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19LRVlfVVJMLAorCQkJCSJodHRwczovL2xvY2FsaG9zdC9yZXBvL2xmcyIpOworCQljZmcuc2F2ZSgpOworCisJCWNoZWNrTGZzVXJsKCJodHRwczovL2xvY2FsaG9zdC9yZXBvL2xmcyIpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgbGZzVXJsRnJvbU9yaWdpbkNvbmZpZygpIHRocm93cyBFeGNlcHRpb24geworCQlhZGRSZW1vdGVVcmwoImh0dHBzOi8vbG9jYWxob3N0L3JlcG8iKTsKKworCQlTdG9yZWRDb25maWcgY2ZnID0gKChSZXBvc2l0b3J5KSBkYikuZ2V0Q29uZmlnKCk7CisJCWNmZy5zZXRTdHJpbmcoQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19TRUNUSU9OX0xGUywKKwkJCQlvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuREVGQVVMVF9SRU1PVEVfTkFNRSwKKwkJCQlDb25maWdDb25zdGFudHMuQ09ORklHX0tFWV9VUkwsCisJCQkJImh0dHBzOi8vbG9jYWxob3N0L3JlcG8vbGZzIik7CisJCWNmZy5zYXZlKCk7CisKKwkJY2hlY2tMZnNVcmwoImh0dHBzOi8vbG9jYWxob3N0L3JlcG8vbGZzIik7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBsZnNVcmxOb3RDb25maWd1cmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWFzc2VydFRocm93cyhMZnNDb25maWdJbnZhbGlkRXhjZXB0aW9uLmNsYXNzLAorCQkJCSgpIC0+IExmc0Nvbm5lY3Rpb25GYWN0b3J5LmdldExmc0Nvbm5lY3Rpb24oZGIsCisJCQkJSHR0cFN1cHBvcnQuTUVUSE9EX1BPU1QsIFByb3RvY29sLk9QRVJBVElPTl9ET1dOTE9BRCkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY2hlY2tHZXRMZnNDb25uZWN0aW9uX2xmc3VybF9sZnNjb25maWdGcm9tV29ya2luZ0RpcigpCisJCQl0aHJvd3MgRXhjZXB0aW9uIHsKKwkJd3JpdGVMZnNDb25maWcoKTsKKwkJY2hlY2tMZnNVcmwoTEZTX1NFUlZFUl9VUkwxKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNoZWNrR2V0TGZzQ29ubmVjdGlvbl9sZnN1cmxfbGZzY29uZmlnRnJvbUluZGV4KCkKKwkJCXRocm93cyBFeGNlcHRpb24geworCQl3cml0ZUxmc0NvbmZpZygpOworCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oQ29uc3RhbnRzLkRPVF9MRlNfQ09ORklHKS5jYWxsKCk7CisJCWRlbGV0ZVRyYXNoRmlsZShDb25zdGFudHMuRE9UX0xGU19DT05GSUcpOworCQljaGVja0xmc1VybChMRlNfU0VSVkVSX1VSTDEpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY2hlY2tHZXRMZnNDb25uZWN0aW9uX2xmc3VybF9sZnNjb25maWdGcm9tSEVBRCgpCisJCQl0aHJvd3MgRXhjZXB0aW9uIHsKKwkJd3JpdGVMZnNDb25maWcoKTsKKwkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKENvbnN0YW50cy5ET1RfTEZTX0NPTkZJRykuY2FsbCgpOworCQlnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgiQ29tbWl0IExGUyBDb25maWciKS5jYWxsKCk7CisKKwkJLyoKKwkJICogcmVhZGluZyAubGZzY29uZmlnIGZyb20gSEVBRCBzZWVtcyBvbmx5IHRlc3RhYmxlIHVzaW5nIGEgYmFyZSByZXBvLAorCQkgKiBzaW5jZSBvdGhlcndpc2Ugd29ya2luZyB0cmVlIG9yIGluZGV4IGFyZSB1c2VkCisJCSAqLworCQlGaWxlIGRpcmVjdG9yeSA9IGNyZWF0ZVRlbXBEaXJlY3RvcnkoInRlc3RCYXJlUmVwbyIpOworCQl0cnkgKFJlcG9zaXRvcnkgYmFyZVJlcG9EYiA9IEdpdC5jbG9uZVJlcG9zaXRvcnkoKQorCQkJCS5zZXREaXJlY3RvcnkoZGlyZWN0b3J5KQorCQkJCS5zZXRVUkkoZGIuZ2V0RGlyZWN0b3J5KCkudG9VUkkoKS50b1N0cmluZygpKS5zZXRCYXJlKHRydWUpCisJCQkJLmNhbGwoKS5nZXRSZXBvc2l0b3J5KCkpIHsKKworCQkJY2hlY2tMZnNVcmwoTEZTX1NFUlZFUl9VUkwxKTsKKwkJfQorCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY2hlY2tHZXRMZnNDb25uZWN0aW9uX3JlbW90ZV9sZnNjb25maWdGcm9tV29ya2luZ0RpcigpCisJCQl0aHJvd3MgRXhjZXB0aW9uIHsKKwkJYWRkUmVtb3RlVXJsKE9SSUdJTl9VUkwpOworCQl3cml0ZUxmc0NvbmZpZyhMRlNfU0VSVkVSX1VSTDEsICJsZnMiLCBERUZBVUxUX1JFTU9URV9OQU1FLCAidXJsIik7CisJCWNoZWNrTGZzVXJsKExGU19TRVJWRVJfVVJMMSk7CisJfQorCisJLyoqCisJICogVGVzdCB0aGUgY29uZmlnIGZpbGUgcHJlY2VkZW5jZS4KKwkgKgorCSAqIENoZWNraW5nIG9ubHkgd2l0aCB0aGUgbG9jYWwgcmVwb3NpdG9yeSBjb25maWcgaXMgc3VmZmljaWVudCBzaW5jZSBmcm9tCisJICogdGhhdCBwb2ludCB0aGUgIm5vcm1hbCIgcHJlY2VkZW5jZSBpcyB1c2VkLgorCSAqCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNoZWNrR2V0TGZzQ29ubmVjdGlvbl9Db25maWdGaWxlUHJlY2VkZW5jZV9sZnNjb25maWdGcm9tV29ya2luZ0RpcigpCisJCQl0aHJvd3MgRXhjZXB0aW9uIHsKKwkJd3JpdGVMZnNDb25maWcoKTsKKwkJY2hlY2tMZnNVcmwoTEZTX1NFUlZFUl9VUkwxKTsKKworCQlTdG9yZWRDb25maWcgY29uZmlnID0gZ2l0LmdldFJlcG9zaXRvcnkoKS5nZXRDb25maWcoKTsKKwkJY29uZmlnLnNldFN0cmluZyhDb25maWdDb25zdGFudHMuQ09ORklHX1NFQ1RJT05fTEZTLCBudWxsLAorCQkJCUNvbmZpZ0NvbnN0YW50cy5DT05GSUdfS0VZX1VSTCwgTEZTX1NFUlZFUl9VUkwyKTsKKwkJY29uZmlnLnNhdmUoKTsKKworCQljaGVja0xmc1VybChMRlNfU0VSVkVSX1VSTDIpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY2hlY2tHZXRMZnNDb25uZWN0aW9uX0ludmFsaWRMZnNDb25maWdfV29ya2luZ0RpcigpCisJCQl0aHJvd3MgRXhjZXB0aW9uIHsKKwkJd3JpdGVJbnZhbGlkTGZzQ29uZmlnKCk7CisJCUxmc0NvbmZpZ0ludmFsaWRFeGNlcHRpb24gYWN0dWFsRXhjZXB0aW9uID0gYXNzZXJ0VGhyb3dzKAorCQkJCUxmc0NvbmZpZ0ludmFsaWRFeGNlcHRpb24uY2xhc3MsICgpIC0+IHsKKwkJCUxmc0Nvbm5lY3Rpb25GYWN0b3J5LmdldExmc0Nvbm5lY3Rpb24oZGIsIEh0dHBTdXBwb3J0Lk1FVEhPRF9QT1NULAorCQkJCQlQcm90b2NvbC5PUEVSQVRJT05fRE9XTkxPQUQpOworCQl9KTsKKwkJYXNzZXJ0VHJ1ZShnZXRTdGFja1RyYWNlKGFjdHVhbEV4Y2VwdGlvbikKKwkJCQkuY29udGFpbnMoIkludmFsaWQgbGluZSBpbiBjb25maWcgZmlsZSIpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNoZWNrR2V0TGZzQ29ubmVjdGlvbl9JbnZhbGlkTGZzQ29uZmlnX0luZGV4KCkKKwkJCXRocm93cyBFeGNlcHRpb24geworCQl3cml0ZUludmFsaWRMZnNDb25maWcoKTsKKwkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKENvbnN0YW50cy5ET1RfTEZTX0NPTkZJRykuY2FsbCgpOworCQlkZWxldGVUcmFzaEZpbGUoQ29uc3RhbnRzLkRPVF9MRlNfQ09ORklHKTsKKwkJTGZzQ29uZmlnSW52YWxpZEV4Y2VwdGlvbiBhY3R1YWxFeGNlcHRpb24gPSBhc3NlcnRUaHJvd3MoCisJCQkJTGZzQ29uZmlnSW52YWxpZEV4Y2VwdGlvbi5jbGFzcywgKCkgLT4geworCQkJTGZzQ29ubmVjdGlvbkZhY3RvcnkuZ2V0TGZzQ29ubmVjdGlvbihkYiwgSHR0cFN1cHBvcnQuTUVUSE9EX1BPU1QsCisJCQkJCVByb3RvY29sLk9QRVJBVElPTl9ET1dOTE9BRCk7CisJCX0pOworCQlhc3NlcnRUcnVlKGdldFN0YWNrVHJhY2UoYWN0dWFsRXhjZXB0aW9uKQorCQkJCS5jb250YWlucygiSW52YWxpZCBsaW5lIGluIGNvbmZpZyBmaWxlIikpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY2hlY2tHZXRMZnNDb25uZWN0aW9uX0ludmFsaWRMZnNDb25maWdfSEVBRCgpIHRocm93cyBFeGNlcHRpb24geworCQl3cml0ZUludmFsaWRMZnNDb25maWcoKTsKKwkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKENvbnN0YW50cy5ET1RfTEZTX0NPTkZJRykuY2FsbCgpOworCQlnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgiQ29tbWl0IExGUyBDb25maWciKS5jYWxsKCk7CisKKwkJLyoKKwkJICogcmVhZGluZyAubGZzY29uZmlnIGZyb20gSEVBRCBzZWVtcyBvbmx5IHRlc3RhYmxlIHVzaW5nIGEgYmFyZSByZXBvLAorCQkgKiBzaW5jZSBvdGhlcndpc2Ugd29ya2luZyB0cmVlIG9yIGluZGV4IGFyZSB1c2VkCisJCSAqLworCQlGaWxlIGRpcmVjdG9yeSA9IGNyZWF0ZVRlbXBEaXJlY3RvcnkoInRlc3RCYXJlUmVwbyIpOworCQl0cnkgKFJlcG9zaXRvcnkgYmFyZVJlcG9EYiA9IEdpdC5jbG9uZVJlcG9zaXRvcnkoKQorCQkJCS5zZXREaXJlY3RvcnkoZGlyZWN0b3J5KQorCQkJCS5zZXRVUkkoZGIuZ2V0RGlyZWN0b3J5KCkudG9VUkkoKS50b1N0cmluZygpKS5zZXRCYXJlKHRydWUpCisJCQkJLmNhbGwoKS5nZXRSZXBvc2l0b3J5KCkpIHsKKwkJCUxmc0NvbmZpZ0ludmFsaWRFeGNlcHRpb24gYWN0dWFsRXhjZXB0aW9uID0gYXNzZXJ0VGhyb3dzKAorCQkJCQlMZnNDb25maWdJbnZhbGlkRXhjZXB0aW9uLmNsYXNzLAorCQkJCQkoKSAtPiB7CisJCQkJCQlMZnNDb25uZWN0aW9uRmFjdG9yeS5nZXRMZnNDb25uZWN0aW9uKGRiLAorCQkJCQkJCQlIdHRwU3VwcG9ydC5NRVRIT0RfUE9TVCwKKwkJCQkJCQkJUHJvdG9jb2wuT1BFUkFUSU9OX0RPV05MT0FEKTsKKwkJCQkJfSk7CisJCQlhc3NlcnRUcnVlKGdldFN0YWNrVHJhY2UoYWN0dWFsRXhjZXB0aW9uKQorCQkJCQkuY29udGFpbnMoIkludmFsaWQgbGluZSBpbiBjb25maWcgZmlsZSIpKTsKKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBhZGRSZW1vdGVVcmwoU3RyaW5nIHJlbW90VXJsKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmVtb3RlQWRkQ29tbWFuZCBhZGQgPSBnaXQucmVtb3RlQWRkKCk7CisJCWFkZC5zZXRVcmkobmV3IFVSSWlzaChyZW1vdFVybCkpOworCQlhZGQuc2V0TmFtZShvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuREVGQVVMVF9SRU1PVEVfTkFNRSk7CisJCWFkZC5jYWxsKCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgc3RhY2sgdHJhY2Ugb2YgdGhlIHByb3ZpZGVkIGV4Y2VwdGlvbiBhcyBzdHJpbmcKKwkgKgorCSAqIEBwYXJhbSBhY3R1YWxFeGNlcHRpb24KKwkgKiBAcmV0dXJuIFRoZSBleGNlcHRpb24gc3RhY2sgdHJhY2UgYXMgc3RyaW5nCisJICovCisJcHJpdmF0ZSBTdHJpbmcgZ2V0U3RhY2tUcmFjZShFeGNlcHRpb24gYWN0dWFsRXhjZXB0aW9uKSB7CisJCVN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKwkJUHJpbnRXcml0ZXIgcHcgPSBuZXcgUHJpbnRXcml0ZXIoc3cpOworCQlhY3R1YWxFeGNlcHRpb24ucHJpbnRTdGFja1RyYWNlKHB3KTsKKwkJcmV0dXJuIHN3LnRvU3RyaW5nKCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHdyaXRlTGZzQ29uZmlnKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJd3JpdGVMZnNDb25maWcoTEZTX1NFUlZFUl9VUkwxLCAibGZzIiwgInVybCIpOworCX0KKworCXByaXZhdGUgdm9pZCB3cml0ZUxmc0NvbmZpZyhTdHJpbmcgbGZzVXJsLCBTdHJpbmcgc2VjdGlvbiwgU3RyaW5nIG5hbWUpCisJCQl0aHJvd3MgSU9FeGNlcHRpb24geworCQl3cml0ZUxmc0NvbmZpZyhsZnNVcmwsIHNlY3Rpb24sIG51bGwsIG5hbWUpOworCX0KKworCS8qCisJICogV3JpdGUgc2ltcGxlIGxmcyBjb25maWcgd2l0aCBzaW5nbGUgZW50cnkuIERvIG5vdCB1c2UgRmlsZUJhc2VkQ29uZmlnIHRvCisJICogYXZvaWQgaW50cm9kdWNpbmcgbmV3IGRlcGVuZGVuY3kgKGZvciBub3cpLgorCSAqLworCXByaXZhdGUgdm9pZCB3cml0ZUxmc0NvbmZpZyhTdHJpbmcgbGZzVXJsLCBTdHJpbmcgc2VjdGlvbiwKKwkJCVN0cmluZyBzdWJzZWN0aW9uLCBTdHJpbmcgbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJU3RyaW5nQnVpbGRlciBjb25maWcgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCQljb25maWcuYXBwZW5kKCJbIik7CisJCWNvbmZpZy5hcHBlbmQoc2VjdGlvbik7CisJCWlmIChzdWJzZWN0aW9uICE9IG51bGwpIHsKKwkJCWNvbmZpZy5hcHBlbmQoIiBcIiIpOworCQkJY29uZmlnLmFwcGVuZChzdWJzZWN0aW9uKTsKKwkJCWNvbmZpZy5hcHBlbmQoIlwiIik7CisJCX0KKwkJY29uZmlnLmFwcGVuZCgiXVxuIik7CisJCWNvbmZpZy5hcHBlbmQoIiAgICAiKTsKKwkJY29uZmlnLmFwcGVuZChuYW1lKTsKKwkJY29uZmlnLmFwcGVuZCgiID0gIik7CisJCWNvbmZpZy5hcHBlbmQobGZzVXJsKTsKKwkJd3JpdGVUcmFzaEZpbGUoQ29uc3RhbnRzLkRPVF9MRlNfQ09ORklHLCBjb25maWcudG9TdHJpbmcoKSk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHdyaXRlSW52YWxpZExmc0NvbmZpZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXdyaXRlVHJhc2hGaWxlKENvbnN0YW50cy5ET1RfTEZTX0NPTkZJRywKKwkJCQkie2xmc11cbiAgICB1cmwgPSAiICsgTEZTX1NFUlZFUl9VUkwxKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgY2hlY2tMZnNVcmwoU3RyaW5nIGxmc1VybCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJSHR0cENvbm5lY3Rpb24gbGZzU2VydmVyQ29ubjsKKwkJbGZzU2VydmVyQ29ubiA9IExmc0Nvbm5lY3Rpb25GYWN0b3J5LmdldExmc0Nvbm5lY3Rpb24oZGIsCisJCQkJSHR0cFN1cHBvcnQuTUVUSE9EX1BPU1QsIFByb3RvY29sLk9QRVJBVElPTl9ET1dOTE9BRCk7CisKKwkJYXNzZXJ0RXF1YWxzKGxmc1VybCArIFByb3RvY29sLk9CSkVDVFNfTEZTX0VORFBPSU5ULAorCQkJCWxmc1NlcnZlckNvbm4uZ2V0VVJMKCkudG9TdHJpbmcoKSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5sZnMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9NRVRBLUlORi9NQU5JRkVTVC5NRgppbmRleCBmYmE1OGY4Li4wOWZmZmZiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMywzMSArMywzMyBAQAogQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZQogQXV0b21hdGljLU1vZHVsZS1OYW1lOiBvcmcuZWNsaXBzZS5qZ2l0LmxmcwogQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuamdpdC5sZnMKLUJ1bmRsZS1WZXJzaW9uOiA2LjAuMS5xdWFsaWZpZXIKK0J1bmRsZS1WZXJzaW9uOiA2LjEuMS5xdWFsaWZpZXIKIEJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgogQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0Lmxmczt2ZXJzaW9uPSI2LjAuMSIsCi0gb3JnLmVjbGlwc2UuamdpdC5sZnMuZXJyb3JzO3ZlcnNpb249IjYuMC4xIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5pbnRlcm5hbDt2ZXJzaW9uPSI2LjAuMSI7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuamdpdC5sZnMudGVzdCxvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIuZnMsb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5saWI7dmVyc2lvbj0iNi4wLjEiCitFeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC5sZnM7dmVyc2lvbj0iNi4xLjEiLAorIG9yZy5lY2xpcHNlLmpnaXQubGZzLmVycm9yczt2ZXJzaW9uPSI2LjEuMSIsCisgb3JnLmVjbGlwc2UuamdpdC5sZnMuaW50ZXJuYWw7dmVyc2lvbj0iNi4xLjEiO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpnaXQubGZzLnRlc3Qsb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLmZzLG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlciIsCisgb3JnLmVjbGlwc2UuamdpdC5sZnMubGliO3ZlcnNpb249IjYuMS4xIgogQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEphdmFTRS0xMQogSW1wb3J0LVBhY2thZ2U6IGNvbS5nb29nbGUuZ3Nvbjt2ZXJzaW9uPSJbMi44LjIsMy4wLjApIiwKICBjb20uZ29vZ2xlLmdzb24uc3RyZWFtO3ZlcnNpb249IlsyLjguMiwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuYW5ub3RhdGlvbnM7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSI7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCi0gb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuYXR0cmlidXRlczt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmRpZmY7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5lcnJvcnM7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5ob29rczt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmxpYjt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lm5sczt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGs7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLnBhY2s7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQ7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuaHR0cDt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuZmlsdGVyO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudXRpbDt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuaW87dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIKKyBvcmcuZWNsaXBzZS5qZ2l0LmFubm90YXRpb25zO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiO3Jlc29sdXRpb246PW9wdGlvbmFsLAorIG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9yczt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmF0dHJpYnV0ZXM7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5kaWZmO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuZGlyY2FjaGU7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnM7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5ob29rczt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmxpYjt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lm5sczt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGs7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLnBhY2s7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQ7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuaHR0cDt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuZmlsdGVyO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudXRpbDt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuaW87dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLnNsZjRqO3ZlcnNpb249IlsxLjcuMCwyLjAuMCkiCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9NRVRBLUlORi9TT1VSQ0UtTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9NRVRBLUlORi9TT1VSQ0UtTUFOSUZFU1QuTUYKaW5kZXggYTcxNWJlNi4uN2EyYTQ0NiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5sZnMvTUVUQS1JTkYvU09VUkNFLU1BTklGRVNULk1GCisrKyBiL29yZy5lY2xpcHNlLmpnaXQubGZzL01FVEEtSU5GL1NPVVJDRS1NQU5JRkVTVC5NRgpAQCAtMyw1ICszLDUgQEAKIEJ1bmRsZS1OYW1lOiBvcmcuZWNsaXBzZS5qZ2l0LmxmcyAtIFNvdXJjZXMKIEJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpnaXQubGZzLnNvdXJjZQogQnVuZGxlLVZlbmRvcjogRWNsaXBzZS5vcmcgLSBKR2l0Ci1CdW5kbGUtVmVyc2lvbjogNi4wLjEucXVhbGlmaWVyCi1FY2xpcHNlLVNvdXJjZUJ1bmRsZTogb3JnLmVjbGlwc2UuamdpdC5sZnM7dmVyc2lvbj0iNi4wLjEucXVhbGlmaWVyIjtyb290cz0iLiIKK0J1bmRsZS1WZXJzaW9uOiA2LjEuMS5xdWFsaWZpZXIKK0VjbGlwc2UtU291cmNlQnVuZGxlOiBvcmcuZWNsaXBzZS5qZ2l0Lmxmczt2ZXJzaW9uPSI2LjEuMS5xdWFsaWZpZXIiO3Jvb3RzPSIuIgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5sZnMvcG9tLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQubGZzL3BvbS54bWwKaW5kZXggZWI1N2RiMy4uOTQ5YzU2OCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5sZnMvcG9tLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9wb20ueG1sCkBAIC0xNyw3ICsxNyw3IEBACiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj42LjAuMS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8dmVyc2lvbj42LjEuMS1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPC9wYXJlbnQ+CiAKICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC5sZnM8L2FydGlmYWN0SWQ+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9yZXNvdXJjZXMvb3JnL2VjbGlwc2UvamdpdC9sZnMvaW50ZXJuYWwvTGZzVGV4dC5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMvcmVzb3VyY2VzL29yZy9lY2xpcHNlL2pnaXQvbGZzL2ludGVybmFsL0xmc1RleHQucHJvcGVydGllcwppbmRleCAwZTAwZjE0Li42NDJiODNkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9yZXNvdXJjZXMvb3JnL2VjbGlwc2UvamdpdC9sZnMvaW50ZXJuYWwvTGZzVGV4dC5wcm9wZXJ0aWVzCisrKyBiL29yZy5lY2xpcHNlLmpnaXQubGZzL3Jlc291cmNlcy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9pbnRlcm5hbC9MZnNUZXh0LnByb3BlcnRpZXMKQEAgLTEsMTkgKzEsMTkgQEAKIGNvcnJ1cHRMb25nT2JqZWN0PVRoZSBjb250ZW50IGhhc2ggJyd7MH0nJyBvZiB0aGUgbG9uZyBvYmplY3QgJyd7MX0nJyBkb2VzbicndCBtYXRjaCBpdHMgaWQsIHRoZSBjb3JydXB0IG9iamVjdCB3aWxsIGJlIGRlbGV0ZWQuCi1pbmNvcnJlY3RMT05HX09CSkVDVF9JRF9MRU5HVEg9SW5jb3JyZWN0IExPTkdfT0JKRUNUX0lEX0xFTkdUSC4KLWluY29uc2lzdGVudE1lZGlhZmlsZUxlbmd0aD1NZWRpYWZpbGUgezB9IGhhcyB1bmV4cGVjdGVkIGxlbmd0aDsgZXhwZWN0ZWQgezF9IGJ1dCBmb3VuZCB7Mn0uCitkb3RMZnNDb25maWdSZWFkRmFpbGVkPVJlYWRpbmcgLmxmc2NvbmZpZyBmYWlsZWQKIGluY29uc2lzdGVudENvbnRlbnRMZW5ndGg9VW5leHBlY3RlZCBjb250ZW50IGxlbmd0aCByZXBvcnRlZCBieSBMRlMgc2VydmVyICh7MH0pLCBleHBlY3RlZCB7MX0gYnV0IHJlcG9ydGVkIHdhcyB7Mn0KK2luY29uc2lzdGVudE1lZGlhZmlsZUxlbmd0aD1NZWRpYWZpbGUgezB9IGhhcyB1bmV4cGVjdGVkIGxlbmd0aDsgZXhwZWN0ZWQgezF9IGJ1dCBmb3VuZCB7Mn0uCitpbmNvcnJlY3RMT05HX09CSkVDVF9JRF9MRU5HVEg9SW5jb3JyZWN0IExPTkdfT0JKRUNUX0lEX0xFTkdUSC4KIGludmFsaWRMb25nSWQ9SW52YWxpZCBpZDogezB9CiBpbnZhbGlkTG9uZ0lkTGVuZ3RoPUludmFsaWQgaWQgbGVuZ3RoIHswfTsgc2hvdWxkIGJlIHsxfQotbGZzVW5hdmFpbGFibGU9TEZTIGlzIG5vdCBhdmFpbGFibGUgZm9yIHJlcG9zaXRvcnkgezB9Ci1wcm90b2NvbEVycm9yPUxGUyBQcm90b2NvbCBFcnJvciB7MH06IHsxfQotcmVxdWlyZWRIYXNoRnVuY3Rpb25Ob3RBdmFpbGFibGU9UmVxdWlyZWQgaGFzaCBmdW5jdGlvbiB7MH0gbm90IGF2YWlsYWJsZS4KLXJlcG9zaXRvcnlOb3RGb3VuZD1SZXBvc2l0b3J5IHswfSBub3QgZm91bmQKLXJlcG9zaXRvcnlSZWFkT25seT1SZXBvc2l0b3J5IHswfSBpcyByZWFkLW9ubHkKLWxmc1VuYXZhaWxhYmxlPUxGUyBpcyBub3QgYXZhaWxhYmxlIGZvciByZXBvc2l0b3J5IHswfQotbGZzVW5hdGhvcml6ZWQ9Tm90IGF1dGhvcml6ZWQgdG8gcGVyZm9ybSBvcGVyYXRpb24gezB9IG9uIHJlcG9zaXRvcnkgezF9CiBsZnNGYWlsZWRUb0dldFJlcG9zaXRvcnk9ZmFpbGVkIHRvIGdldCByZXBvc2l0b3J5IHswfQogbGZzTm9Eb3dubG9hZFVybD0iTmVlZCB0byBkb3dubG9hZCBvYmplY3QgZnJvbSBMRlMgc2VydmVyIGJ1dCBjb3VsZG4ndCBkZXRlcm1pbmUgTEZTIHNlcnZlciBVUkwiCitsZnNVbmF1dGhvcml6ZWQ9Tm90IGF1dGhvcml6ZWQgdG8gcGVyZm9ybSBvcGVyYXRpb24gezB9IG9uIHJlcG9zaXRvcnkgezF9CitsZnNVbmF2YWlsYWJsZT1MRlMgaXMgbm90IGF2YWlsYWJsZSBmb3IgcmVwb3NpdG9yeSB7MH0KK21pc3NpbmdMb2NhbE9iamVjdD0iTG9jYWwgT2JqZWN0IHswfSBpcyBtaXNzaW5nIgorcHJvdG9jb2xFcnJvcj1MRlMgUHJvdG9jb2wgRXJyb3IgezB9OiB7MX0KK3JlcG9zaXRvcnlOb3RGb3VuZD1SZXBvc2l0b3J5IHswfSBub3QgZm91bmQKK3JlcG9zaXRvcnlSZWFkT25seT1SZXBvc2l0b3J5IHswfSBpcyByZWFkLW9ubHkKK3JlcXVpcmVkSGFzaEZ1bmN0aW9uTm90QXZhaWxhYmxlPVJlcXVpcmVkIGhhc2ggZnVuY3Rpb24gezB9IG5vdCBhdmFpbGFibGUuCiBzZXJ2ZXJGYWlsdXJlPVdoZW4gdHJ5aW5nIHRvIG9wZW4gYSBjb25uZWN0aW9uIHRvIHswfSB0aGUgc2VydmVyIHJlc3BvbmRlZCB3aXRoIGFuIGVycm9yIGNvZGUuIHJjPXsxfQotd3JvbmdBbW91dE9mRGF0YVJlY2VpdmVkPVdoaWxlIGRvd25sb2FkaW5nIGRhdGEgZnJvbSB0aGUgY29udGVudCBzZXJ2ZXIgezB9IHsxfSBieXRlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2hpbGUgezJ9IGhhdmUgYmVlbiBleHBlY3RlZAogdXNlckNvbmZpZ0ludmFsaWQ9IlVzZXIgY29uZmlnIGZpbGUgezB9IGludmFsaWQgezF9IgotbWlzc2luZ0xvY2FsT2JqZWN0PSJMb2NhbCBPYmplY3QgezB9IGlzIG1pc3NpbmciClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQord3JvbmdBbW91bnRPZkRhdGFSZWNlaXZlZD1XaGlsZSBkb3dubG9hZGluZyBkYXRhIGZyb20gdGhlIGNvbnRlbnQgc2VydmVyIHswfSB7MX0gYnl0ZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdoaWxlIHsyfSBoYXZlIGJlZW4gZXhwZWN0ZWQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvTGZzUHJlUHVzaEhvb2suamF2YSBiL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9MZnNQcmVQdXNoSG9vay5qYXZhCmluZGV4IGQ2Y2U4NTUuLmViZjQ2ZTAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9MZnNQcmVQdXNoSG9vay5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9MZnNQcmVQdXNoSG9vay5qYXZhCkBAIC0xMTMsNiArMTEzLDkgQEAgcHJpdmF0ZSBTZXQ8TGZzUG9pbnRlcj4gZmluZE9iamVjdHNUb1B1c2goKSB0aHJvd3MgSU9FeGNlcHRpb24sCiAKIAkJdHJ5IChPYmplY3RXYWxrIHdhbGsgPSBuZXcgT2JqZWN0V2FsayhnZXRSZXBvc2l0b3J5KCkpKSB7CiAJCQlmb3IgKFJlbW90ZVJlZlVwZGF0ZSB1cCA6IHJlZnMpIHsKKwkJCQlpZiAodXAuaXNEZWxldGUoKSkgeworCQkJCQljb250aW51ZTsKKwkJCQl9CiAJCQkJd2Fsay5zZXRSZXdyaXRlUGFyZW50cyhmYWxzZSk7CiAJCQkJZXhjbHVkZVJlbW90ZVJlZnMod2Fsayk7CiAJCQkJd2Fsay5tYXJrU3RhcnQod2Fsay5wYXJzZUNvbW1pdCh1cC5nZXROZXdPYmplY3RJZCgpKSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvU211ZGdlRmlsdGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvU211ZGdlRmlsdGVyLmphdmEKaW5kZXggMzQxMTg4Ny4uYzI2YTFiZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5sZnMvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL1NtdWRnZUZpbHRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9TbXVkZ2VGaWx0ZXIuamF2YQpAQCAtMjA1LDcgKzIwNSw3IEBAIHB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbjxQYXRoPiBkb3dubG9hZExmc1Jlc291cmNlKExmcyBsZnMsIFJlcG9zaXRvcnkgZGIsCiAJCQkJCWxvbmcgYnl0ZXNDb3BpZWQgPSBGaWxlcy5jb3B5KGNvbnRlbnRJbiwgcGF0aCk7CiAJCQkJCWlmIChieXRlc0NvcGllZCAhPSBvLnNpemUpIHsKIAkJCQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdCgKLQkJCQkJCQkJTGZzVGV4dC5nZXQoKS53cm9uZ0Ftb3V0T2ZEYXRhUmVjZWl2ZWQsCisJCQkJCQkJCUxmc1RleHQuZ2V0KCkud3JvbmdBbW91bnRPZkRhdGFSZWNlaXZlZCwKIAkJCQkJCQkJY29udGVudFNlcnZlckNvbm4uZ2V0VVJMKCksCiAJCQkJCQkJCUxvbmcudmFsdWVPZihieXRlc0NvcGllZCksCiAJCQkJCQkJCUxvbmcudmFsdWVPZihvLnNpemUpKSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvZXJyb3JzL0xmc1VuYXV0aG9yaXplZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL2Vycm9ycy9MZnNVbmF1dGhvcml6ZWQuamF2YQppbmRleCAzNjg4OWRiLi4wZGM2YWVhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvZXJyb3JzL0xmc1VuYXV0aG9yaXplZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9lcnJvcnMvTGZzVW5hdXRob3JpemVkLmphdmEKQEAgLTMxLDcgKzMxLDcgQEAgcHVibGljIGNsYXNzIExmc1VuYXV0aG9yaXplZCBleHRlbmRzIExmc0V4Y2VwdGlvbiB7CiAJICogICAgICAgICAgICB0aGUgcmVwb3NpdG9yeSBuYW1lLgogCSAqLwogCXB1YmxpYyBMZnNVbmF1dGhvcml6ZWQoU3RyaW5nIG9wZXJhdGlvbiwgU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIoTWVzc2FnZUZvcm1hdC5mb3JtYXQoTGZzVGV4dC5nZXQoKS5sZnNVbmF0aG9yaXplZCwgb3BlcmF0aW9uLAorCQlzdXBlcihNZXNzYWdlRm9ybWF0LmZvcm1hdChMZnNUZXh0LmdldCgpLmxmc1VuYXV0aG9yaXplZCwgb3BlcmF0aW9uLAogCQkJCW5hbWUpKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvaW50ZXJuYWwvTGZzQ29uZmlnLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvaW50ZXJuYWwvTGZzQ29uZmlnLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFkMzk1YwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9pbnRlcm5hbC9MZnNDb25maWcuamF2YQpAQCAtMCwwICsxLDIwMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMiwgTWF0dGhpYXMgRnJvbW1lIDxtZnJvbW1lQGRzcGFjZS5kZT4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQubGZzLmludGVybmFsOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFubm90YXRpb25zLk51bGxhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZGlyY2FjaGUuRGlyQ2FjaGVFbnRyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5Db25maWdJbnZhbGlkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGZzLmVycm9ycy5MZnNDb25maWdJbnZhbGlkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGZzLmxpYi5Db25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQmxvYkJhc2VkQ29uZmlnOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbmZpZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5PYmplY3RJZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZXBvc2l0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5SZXZDb21taXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldlRyZWU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldldhbGs7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLmZpbGUuRmlsZUJhc2VkQ29uZmlnOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuVHJlZVdhbGs7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkhFQUQ7CisKKy8qKgorICogRW5jYXBzdWxhdGUgYWNjZXNzIHRvIHRoZSAubGZzY29uZmlnLgorICoKKyAqIEFjY29yZGluZyB0byB0aGUgZG9jdW1lbnQKKyAqIGh0dHBzOi8vZ2l0aHViLmNvbS9naXQtbGZzL2dpdC1sZnMvYmxvYi9tYWluL2RvY3MvbWFuL2dpdC1sZnMtY29uZmlnLjUucm9ubgorICogdGhlIG9yZGVyIHRvIGZpbmQgdGhlIC5sZnNjb25maWcgZmlsZSBpczoKKyAqCisgKiA8cHJlPgorICogICAxLiBpbiB0aGUgcm9vdCBvZiB0aGUgd29ya2luZyB0cmVlCisgKiAgIDIuIGluIHRoZSBpbmRleAorICogICAzLiBpbiB0aGUgSEVBRCwgZm9yIGJhcmUgcmVwb3NpdG9yaWVzIHRoaXMgaXMgdGhlIG9ubHkgcGxhY2UKKyAqICAgICAgdGhhdCBpcyBzZWFyY2hlZAorICogPC9wcmU+CisgKgorICogVmFsdWVzIGZyb20gdGhlIC5sZnNjb25maWcgYXJlIHVzZWQgb25seSBpZiBub3Qgc3BlY2lmaWVkIGluIGFub3RoZXIgZ2l0CisgKiBjb25maWcgZmlsZSB0byBhbGxvdyBsb2NhbCBvdmVycmlkZSB3aXRob3V0IG1vZGlmaWN0aW9uIG9mIGEgY29tbWl0dGVkIGZpbGUuCisgKi8KK3B1YmxpYyBjbGFzcyBMZnNDb25maWcgeworCXByaXZhdGUgUmVwb3NpdG9yeSBkYjsKKwlwcml2YXRlIENvbmZpZyBkZWxlZ2F0ZTsKKworCS8qKgorCSAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgTGZzQ29uZmlnLgorCSAqCisJICogQHBhcmFtIGRiCisJICogICAgICAgICAgICB0aGUgYXNzb2NpYXRlZCByZXBvCisJICogQHRocm93cyBJT0V4Y2VwdGlvbgorCSAqLworCXB1YmxpYyBMZnNDb25maWcoUmVwb3NpdG9yeSBkYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJdGhpcy5kYiA9IGRiOworCQlkZWxlZ2F0ZSA9IHRoaXMubG9hZCgpOworCX0KKworCS8qKgorCSAqIFJlYWQgdGhlIC5sZnNjb25maWcgZmlsZSBmcm9tIHRoZSByZXBvc2l0b3J5CisJICoKKwkgKiBAcmV0dXJuIFRoZSBsb2FkZWQgbGZzIGNvbmZpZyBvciBudWxsIGlmIGl0IGRvZXMgbm90IGV4aXN0CisJICoKKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisJICovCisJcHJpdmF0ZSBDb25maWcgbG9hZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCUNvbmZpZyByZXN1bHQgPSBudWxsOworCisJCWlmICghZGIuaXNCYXJlKCkpIHsKKwkJCXJlc3VsdCA9IGxvYWRGcm9tV29ya2luZ1RyZWUoKTsKKwkJCWlmIChyZXN1bHQgPT0gbnVsbCkgeworCQkJCXJlc3VsdCA9IGxvYWRGcm9tSW5kZXgoKTsKKwkJCX0KKwkJfQorCisJCWlmIChyZXN1bHQgPT0gbnVsbCkgeworCQkJcmVzdWx0ID0gbG9hZEZyb21IZWFkKCk7CisJCX0KKworCQlpZiAocmVzdWx0ID09IG51bGwpIHsKKwkJCXJlc3VsdCA9IGVtcHR5Q29uZmlnKCk7CisJCX0KKworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qKgorCSAqIFRyeSB0byByZWFkIHRoZSBsZnMgY29uZmlnIGZyb20gYSBmaWxlIGNhbGxlZCAubGZzY29uZmlnIGF0IHRoZSB0b3AgbGV2ZWwKKwkgKiBvZiB0aGUgd29ya2luZyB0cmVlLgorCSAqCisJICogQHJldHVybiB0aGUgY29uZmlnLCBvciA8Y29kZT5udWxsPC9jb2RlPgorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKwkgKi8KKwlATnVsbGFibGUKKwlwcml2YXRlIENvbmZpZyBsb2FkRnJvbVdvcmtpbmdUcmVlKCkKKwkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CisJCUZpbGUgbGZzQ29uZmlnID0gZGIuZ2V0RlMoKS5yZXNvbHZlKGRiLmdldFdvcmtUcmVlKCksCisJCQkJQ29uc3RhbnRzLkRPVF9MRlNfQ09ORklHKTsKKwkJaWYgKGxmc0NvbmZpZy5leGlzdHMoKSAmJiBsZnNDb25maWcuaXNGaWxlKCkpIHsKKwkJCUZpbGVCYXNlZENvbmZpZyBjb25maWcgPSBuZXcgRmlsZUJhc2VkQ29uZmlnKGxmc0NvbmZpZywgZGIuZ2V0RlMoKSk7CisJCQl0cnkgeworCQkJCWNvbmZpZy5sb2FkKCk7CisJCQkJcmV0dXJuIGNvbmZpZzsKKwkJCX0gY2F0Y2ggKENvbmZpZ0ludmFsaWRFeGNlcHRpb24gZSkgeworCQkJCXRocm93IG5ldyBMZnNDb25maWdJbnZhbGlkRXhjZXB0aW9uKAorCQkJCQkJTGZzVGV4dC5nZXQoKS5kb3RMZnNDb25maWdSZWFkRmFpbGVkLCBlKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBUcnkgdG8gcmVhZCB0aGUgbGZzIGNvbmZpZyBmcm9tIGFuIGVudHJ5IGNhbGxlZCAubGZzY29uZmlnIGNvbnRhaW5lZCBpbgorCSAqIHRoZSBpbmRleC4KKwkgKgorCSAqIEByZXR1cm4gdGhlIGNvbmZpZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGVudHJ5IGRvZXMgbm90IGV4aXN0CisJICogQHRocm93cyBJT0V4Y2VwdGlvbgorCSAqLworCUBOdWxsYWJsZQorCXByaXZhdGUgQ29uZmlnIGxvYWRGcm9tSW5kZXgoKQorCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJdHJ5IHsKKwkJCURpckNhY2hlRW50cnkgZW50cnkgPSBkYi5yZWFkRGlyQ2FjaGUoKQorCQkJCQkuZ2V0RW50cnkoQ29uc3RhbnRzLkRPVF9MRlNfQ09ORklHKTsKKwkJCWlmIChlbnRyeSAhPSBudWxsKSB7CisJCQkJcmV0dXJuIG5ldyBCbG9iQmFzZWRDb25maWcobnVsbCwgZGIsIGVudHJ5LmdldE9iamVjdElkKCkpOworCQkJfQorCQl9IGNhdGNoIChDb25maWdJbnZhbGlkRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBMZnNDb25maWdJbnZhbGlkRXhjZXB0aW9uKAorCQkJCQlMZnNUZXh0LmdldCgpLmRvdExmc0NvbmZpZ1JlYWRGYWlsZWQsIGUpOworCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFRyeSB0byByZWFkIHRoZSBsZnMgY29uZmlnIGZyb20gYW4gZW50cnkgY2FsbGVkIC5sZnNjb25maWcgY29udGFpbmVkIGluCisJICogdGhlIGhlYWQgcmV2aXNpb24uCisJICoKKwkgKiBAcmV0dXJuIHRoZSBjb25maWcsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0CisJICogQHRocm93cyBJT0V4Y2VwdGlvbgorCSAqLworCUBOdWxsYWJsZQorCXByaXZhdGUgQ29uZmlnIGxvYWRGcm9tSGVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXRyeSAoUmV2V2FsayByZXZXYWxrID0gbmV3IFJldldhbGsoZGIpKSB7CisJCQlPYmplY3RJZCBoZWFkQ29tbWl0SWQgPSBkYi5yZXNvbHZlKEhFQUQpOworCQkJaWYgKGhlYWRDb21taXRJZCA9PSBudWxsKSB7CisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisJCQlSZXZDb21taXQgY29tbWl0ID0gcmV2V2Fsay5wYXJzZUNvbW1pdChoZWFkQ29tbWl0SWQpOworCQkJUmV2VHJlZSB0cmVlID0gY29tbWl0LmdldFRyZWUoKTsKKwkJCVRyZWVXYWxrIHRyZWV3YWxrID0gVHJlZVdhbGsuZm9yUGF0aChkYiwgQ29uc3RhbnRzLkRPVF9MRlNfQ09ORklHLAorCQkJCQl0cmVlKTsKKwkJCWlmICh0cmVld2FsayAhPSBudWxsKSB7CisJCQkJcmV0dXJuIG5ldyBCbG9iQmFzZWRDb25maWcobnVsbCwgZGIsIHRyZWV3YWxrLmdldE9iamVjdElkKDApKTsKKwkJCX0KKwkJfSBjYXRjaCAoQ29uZmlnSW52YWxpZEV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgTGZzQ29uZmlnSW52YWxpZEV4Y2VwdGlvbigKKwkJCQkJTGZzVGV4dC5nZXQoKS5kb3RMZnNDb25maWdSZWFkRmFpbGVkLCBlKTsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGUgYW4gZW1wdHkgY29uZmlnIGFzIGZhbGxiYWNrIHRvIGF2b2lkIG51bGwgcG9pbnRlciBjaGVja3MuCisJICoKKwkgKiBAcmV0dXJuIGFuIGVtcHR5IGNvbmZpZworCSAqLworCXByaXZhdGUgQ29uZmlnIGVtcHR5Q29uZmlnKCkgeworCQlyZXR1cm4gbmV3IENvbmZpZygpOworCX0KKworCS8qKgorCSAqIEdldCBzdHJpbmcgdmFsdWUgb3IgbnVsbCBpZiBub3QgZm91bmQuCisJICoKKwkgKiBGaXJzdCB0cmllcyB0byBmaW5kIHRoZSB2YWx1ZSBpbiB0aGUgZ2l0IGNvbmZpZyBmaWxlcy4gSWYgbm90IGZvdW5kIHRyaWVzCisJICogdG8gZmluZCBkYXRhIGluIC5sZnNjb25maWcuCisJICoKKwkgKiBAcGFyYW0gc2VjdGlvbgorCSAqICAgICAgICAgICAgdGhlIHNlY3Rpb24KKwkgKiBAcGFyYW0gc3Vic2VjdGlvbgorCSAqICAgICAgICAgICAgdGhlIHN1YnNlY3Rpb24gZm9yIHRoZSB2YWx1ZQorCSAqIEBwYXJhbSBuYW1lCisJICogICAgICAgICAgICB0aGUga2V5IG5hbWUKKwkgKiBAcmV0dXJuIGEgU3RyaW5nIHZhbHVlIGZyb20gdGhlIGNvbmZpZywgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IGZvdW5kCisJICovCisJcHVibGljIFN0cmluZyBnZXRTdHJpbmcoZmluYWwgU3RyaW5nIHNlY3Rpb24sIGZpbmFsIFN0cmluZyBzdWJzZWN0aW9uLAorCQkJZmluYWwgU3RyaW5nIG5hbWUpIHsKKwkJU3RyaW5nIHJlc3VsdCA9IGRiLmdldENvbmZpZygpLmdldFN0cmluZyhzZWN0aW9uLCBzdWJzZWN0aW9uLCBuYW1lKTsKKwkJaWYgKHJlc3VsdCA9PSBudWxsKSB7CisJCQlyZXN1bHQgPSBkZWxlZ2F0ZS5nZXRTdHJpbmcoc2VjdGlvbiwgc3Vic2VjdGlvbiwgbmFtZSk7CisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvaW50ZXJuYWwvTGZzQ29ubmVjdGlvbkZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9pbnRlcm5hbC9MZnNDb25uZWN0aW9uRmFjdG9yeS5qYXZhCmluZGV4IGUyMjE5MTMuLjEyYjY4OGQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9pbnRlcm5hbC9MZnNDb25uZWN0aW9uRmFjdG9yeS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9pbnRlcm5hbC9MZnNDb25uZWN0aW9uRmFjdG9yeS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNywgTWFya3VzIER1ZnQgPG1hcmt1cy5kdWZ0QHNzaS1zY2hhZWZlci5jb20+IGFuZCBvdGhlcnMKKyAqIENvcHlyaWdodCAoQykgMjAxNywgMjAyMiBNYXJrdXMgRHVmdCA8bWFya3VzLmR1ZnRAc3NpLXNjaGFlZmVyLmNvbT4gYW5kIG90aGVycwogICoKICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdApAQCAtMzksMTIgKzM5LDEyIEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuaHR0cC5IdHRwQ29ubmVjdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuSHR0cFN1cHBvcnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLlNzaFN1cHBvcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLlN0cmluZ1V0aWxzOwogCiAvKioKICAqIFByb3ZpZGVzIG1lYW5zIHRvIGdldCBhIHZhbGlkIExGUyBjb25uZWN0aW9uIGZvciBhIGdpdmVuIHJlcG9zaXRvcnkuCiAgKi8KIHB1YmxpYyBjbGFzcyBMZnNDb25uZWN0aW9uRmFjdG9yeSB7Ci0KIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1NIX0FVVEhfVElNRU9VVF9TRUNPTkRTID0gMzA7CiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNDSEVNRV9IVFRQUyA9ICJodHRwcyI7IC8vJE5PTi1OTFMtMSQKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NIRU1FX1NTSCA9ICJzc2giOyAvLyROT04tTkxTLTEkCkBAIC02NCw3ICs2NCw3IEBAIHB1YmxpYyBjbGFzcyBMZnNDb25uZWN0aW9uRmFjdG9yeSB7CiAJICogICAgICAgICAgICBiZSB1c2VkIGZvcgogCSAqIEBwYXJhbSBwdXJwb3NlCiAJICogICAgICAgICAgICB0aGUgYWN0aW9uLCBlLmcuIFByb3RvY29sLk9QRVJBVElPTl9ET1dOTE9BRAotCSAqIEByZXR1cm4gdGhlIHVybCBmb3IgdGhlIGxmcyBzZXJ2ZXIuIGUuZy4KKwkgKiBAcmV0dXJuIHRoZSBjb25uZWN0aW9uIGZvciB0aGUgbGZzIHNlcnZlci4gZS5nLgogCSAqICAgICAgICAgImh0dHBzOi8vZ2l0aHViLmNvbS9naXRodWIvZ2l0LWxmcy5naXQvaW5mby9sZnMiCiAJICogQHRocm93cyBJT0V4Y2VwdGlvbgogCSAqLwpAQCAtOTIsMTMgKzkyLDMwIEBAIHB1YmxpYyBzdGF0aWMgSHR0cENvbm5lY3Rpb24gZ2V0TGZzQ29ubmVjdGlvbihSZXBvc2l0b3J5IGRiLCBTdHJpbmcgbWV0aG9kLAogCQlyZXR1cm4gY29ubmVjdGlvbjsKIAl9CiAKKwkvKioKKwkgKiBHZXQgTEZTIFNlcnZlciBVUkwuCisJICoKKwkgKiBAcGFyYW0gZGIKKwkgKiAgICAgICAgICAgIHRoZSByZXBvc2l0b3J5IHRvIHdvcmsgd2l0aAorCSAqIEBwYXJhbSBwdXJwb3NlCisJICogICAgICAgICAgICB0aGUgYWN0aW9uLCBlLmcuIFByb3RvY29sLk9QRVJBVElPTl9ET1dOTE9BRAorCSAqIEBwYXJhbSBhZGRpdGlvbmFsSGVhZGVycworCSAqICAgICAgICAgICAgYWRkaXRpb25hbCBoZWFkZXJzIHRoYXQgY2FuIGJlIHVzZWQgdG8gY29ubmVjdCB0byBMRlMgc2VydmVyCisJICogQHJldHVybiB0aGUgVVJMIGZvciB0aGUgTEZTIHNlcnZlci4gZS5nLgorCSAqICAgICAgICAgImh0dHBzOi8vZ2l0aHViLmNvbS9naXRodWIvZ2l0LWxmcy5naXQvaW5mby9sZnMiCisJICogQHRocm93cyBJT0V4Y2VwdGlvbgorCSAqICAgICAgICAgICAgIGlmIHRoZSBMRlMgY29uZmlnIGlzIGludmFsaWQgb3IgY2Fubm90IGJlIGFjY2Vzc2VkCisJICogQHNlZSA8YSBocmVmPQorCSAqICAgICAgImh0dHBzOi8vZ2l0aHViLmNvbS9naXQtbGZzL2dpdC1sZnMvYmxvYi9tYWluL2RvY3MvYXBpL3NlcnZlci1kaXNjb3ZlcnkubWQiPgorCSAqICAgICAgU2VydmVyIERpc2NvdmVyeSBkb2N1bWVudGF0aW9uPC9hPgorCSAqLwogCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRMZnNVcmwoUmVwb3NpdG9yeSBkYiwgU3RyaW5nIHB1cnBvc2UsCiAJCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGFkZGl0aW9uYWxIZWFkZXJzKQotCQkJdGhyb3dzIExmc0NvbmZpZ0ludmFsaWRFeGNlcHRpb24gewotCQlTdG9yZWRDb25maWcgY29uZmlnID0gZGIuZ2V0Q29uZmlnKCk7CisJCQl0aHJvd3MgSU9FeGNlcHRpb24geworCQlMZnNDb25maWcgY29uZmlnID0gbmV3IExmc0NvbmZpZyhkYik7CiAJCVN0cmluZyBsZnNVcmwgPSBjb25maWcuZ2V0U3RyaW5nKENvbmZpZ0NvbnN0YW50cy5DT05GSUdfU0VDVElPTl9MRlMsCi0JCQkJbnVsbCwKLQkJCQlDb25maWdDb25zdGFudHMuQ09ORklHX0tFWV9VUkwpOworCQkJCW51bGwsIENvbmZpZ0NvbnN0YW50cy5DT05GSUdfS0VZX1VSTCk7CisKIAkJRXhjZXB0aW9uIGV4ID0gbnVsbDsKIAkJaWYgKGxmc1VybCA9PSBudWxsKSB7CiAJCQlTdHJpbmcgcmVtb3RlVXJsID0gbnVsbDsKQEAgLTEwNiw2ICsxMjMsNyBAQCBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0TGZzVXJsKFJlcG9zaXRvcnkgZGIsIFN0cmluZyBwdXJwb3NlLAogCQkJCWxmc1VybCA9IGNvbmZpZy5nZXRTdHJpbmcoQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19TRUNUSU9OX0xGUywKIAkJCQkJCXJlbW90ZSwKIAkJCQkJCUNvbmZpZ0NvbnN0YW50cy5DT05GSUdfS0VZX1VSTCk7CisKIAkJCQkvLyBUaGlzIGNvdWxkIGJlIGRvbmUgYmV0dGVyIChtb3JlIHByZWNpc2UgbG9naWMpLCBidXQgYWNjb3JkaW5nCiAJCQkJLy8gdG8gaHR0cHM6Ly9naXRodWIuY29tL2dpdC1sZnMvZ2l0LWxmcy9pc3N1ZXMvMTc1OSBnaXQtbGZzCiAJCQkJLy8gZ2VuZXJhbGx5IG9ubHkgc3VwcG9ydHMgJ29yaWdpbicgaW4gYW4gaW50ZWdyYXRlZCB3b3JrZmxvdy4KQEAgLTEyNSw4ICsxNDMsNiBAQCBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0TGZzVXJsKFJlcG9zaXRvcnkgZGIsIFN0cmluZyBwdXJwb3NlLAogCQkJCQkJfCBDb21tYW5kRmFpbGVkRXhjZXB0aW9uIGUpIHsKIAkJCQkJZXggPSBlOwogCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJbGZzVXJsID0gbGZzVXJsICsgUHJvdG9jb2wuSU5GT19MRlNfRU5EUE9JTlQ7CiAJCQl9CiAJCX0KIAkJaWYgKGxmc1VybCA9PSBudWxsKSB7CkBAIC0xNDksNyArMTY1LDggQEAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRpc2NvdmVyTGZzVXJsKFJlcG9zaXRvcnkgZGIsIFN0cmluZyBwdXJwb3NlLAogCQkJYWRkaXRpb25hbEhlYWRlcnMucHV0QWxsKGFjdGlvbi5oZWFkZXIpOwogCQkJcmV0dXJuIGFjdGlvbi5ocmVmOwogCQl9Ci0JCXJldHVybiByZW1vdGVVcmwgKyBQcm90b2NvbC5JTkZPX0xGU19FTkRQT0lOVDsKKwkJcmV0dXJuIFN0cmluZ1V0aWxzLm5hbWVXaXRoRG90R2l0KHJlbW90ZVVybCkKKwkJCQkrIFByb3RvY29sLklORk9fTEZTX0VORFBPSU5UOwogCX0KIAogCXByaXZhdGUgc3RhdGljIFByb3RvY29sLkV4cGlyaW5nQWN0aW9uIGdldFNzaEF1dGhlbnRpY2F0aW9uKApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5sZnMvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL2ludGVybmFsL0xmc1RleHQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9pbnRlcm5hbC9MZnNUZXh0LmphdmEKaW5kZXggMWNhMzdhOS4uMDYyMzRjMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5sZnMvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL2ludGVybmFsL0xmc1RleHQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvaW50ZXJuYWwvTGZzVGV4dC5qYXZhCkBAIC0yOCwyMSArMjgsMjIgQEAgcHVibGljIHN0YXRpYyBMZnNUZXh0IGdldCgpIHsKIAogCS8vIEBmb3JtYXR0ZXI6b2ZmCiAJLyoqKi8gcHVibGljIFN0cmluZyBjb3JydXB0TG9uZ09iamVjdDsKLQkvKioqLyBwdWJsaWMgU3RyaW5nIGluY29uc2lzdGVudE1lZGlhZmlsZUxlbmd0aDsKKwkvKioqLyBwdWJsaWMgU3RyaW5nIGRvdExmc0NvbmZpZ1JlYWRGYWlsZWQ7CiAJLyoqKi8gcHVibGljIFN0cmluZyBpbmNvbnNpc3RlbnRDb250ZW50TGVuZ3RoOworCS8qKiovIHB1YmxpYyBTdHJpbmcgaW5jb25zaXN0ZW50TWVkaWFmaWxlTGVuZ3RoOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgaW5jb3JyZWN0TE9OR19PQkpFQ1RfSURfTEVOR1RIOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgaW52YWxpZExvbmdJZDsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGludmFsaWRMb25nSWRMZW5ndGg7Ci0JLyoqKi8gcHVibGljIFN0cmluZyBsZnNVbmF2YWlsYWJsZTsKLQkvKioqLyBwdWJsaWMgU3RyaW5nIHByb3RvY29sRXJyb3I7Ci0JLyoqKi8gcHVibGljIFN0cmluZyByZXF1aXJlZEhhc2hGdW5jdGlvbk5vdEF2YWlsYWJsZTsKLQkvKioqLyBwdWJsaWMgU3RyaW5nIHJlcG9zaXRvcnlOb3RGb3VuZDsKLQkvKioqLyBwdWJsaWMgU3RyaW5nIHJlcG9zaXRvcnlSZWFkT25seTsKLQkvKioqLyBwdWJsaWMgU3RyaW5nIGxmc1VuYXRob3JpemVkOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgbGZzRmFpbGVkVG9HZXRSZXBvc2l0b3J5OwogCS8qKiovIHB1YmxpYyBTdHJpbmcgbGZzTm9Eb3dubG9hZFVybDsKLQkvKioqLyBwdWJsaWMgU3RyaW5nIHNlcnZlckZhaWx1cmU7Ci0JLyoqKi8gcHVibGljIFN0cmluZyB3cm9uZ0Ftb3V0T2ZEYXRhUmVjZWl2ZWQ7Ci0JLyoqKi8gcHVibGljIFN0cmluZyB1c2VyQ29uZmlnSW52YWxpZDsKKwkvKioqLyBwdWJsaWMgU3RyaW5nIGxmc1VuYXV0aG9yaXplZDsKKwkvKioqLyBwdWJsaWMgU3RyaW5nIGxmc1VuYXZhaWxhYmxlOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgbWlzc2luZ0xvY2FsT2JqZWN0OworCS8qKiovIHB1YmxpYyBTdHJpbmcgcHJvdG9jb2xFcnJvcjsKKwkvKioqLyBwdWJsaWMgU3RyaW5nIHJlcG9zaXRvcnlOb3RGb3VuZDsKKwkvKioqLyBwdWJsaWMgU3RyaW5nIHJlcG9zaXRvcnlSZWFkT25seTsKKwkvKioqLyBwdWJsaWMgU3RyaW5nIHJlcXVpcmVkSGFzaEZ1bmN0aW9uTm90QXZhaWxhYmxlOworCS8qKiovIHB1YmxpYyBTdHJpbmcgc2VydmVyRmFpbHVyZTsKKwkvKioqLyBwdWJsaWMgU3RyaW5nIHVzZXJDb25maWdJbnZhbGlkOworCS8qKiovIHB1YmxpYyBTdHJpbmcgd3JvbmdBbW91bnRPZkRhdGFSZWNlaXZlZDsKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9saWIvQ29uc3RhbnRzLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvbGliL0NvbnN0YW50cy5qYXZhCmluZGV4IDMyMTJhNjMuLjliNDFlYzMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9saWIvQ29uc3RhbnRzLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL2xpYi9Db25zdGFudHMuamF2YQpAQCAtODIsNiArODIsMTMgQEAgcHVibGljIGZpbmFsIGNsYXNzIENvbnN0YW50cyB7CiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9GSUxURVJfRFJJVkVSX1BSRUZJWCA9ICJsZnMvIjsKIAogCS8qKgorCSAqIENvbmZpZyBmaWxlIG5hbWUgZm9yIGxmcyBzcGVjaWZpYyBjb25maWd1cmF0aW9uCisJICoKKwkgKiBAc2luY2UgNi4xCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9UX0xGU19DT05GSUcgPSAiLmxmc2NvbmZpZyI7CisKKwkvKioKIAkgKiBDcmVhdGUgYSBuZXcgZGlnZXN0IGZ1bmN0aW9uIGZvciBvYmplY3RzLgogCSAqCiAJICogQHJldHVybiBhIG5ldyBkaWdlc3Qgb2JqZWN0LgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5mZWF0dXJlL2ZlYXR1cmUueG1sCmluZGV4IGNjMWJmODUuLmNkMjJlMjQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LmZlYXR1cmUvZmVhdHVyZS54bWwKQEAgLTIsNyArMiw3IEBACiA8ZmVhdHVyZQogICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpnaXQiCiAgICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iNi4wLjEucXVhbGlmaWVyIgorICAgICAgdmVyc2lvbj0iNi4xLjEucXVhbGlmaWVyIgogICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+CiAKICAgIDxkZXNjcmlwdGlvbiB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvamdpdC8iPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5mZWF0dXJlL3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LmZlYXR1cmUvcG9tLnhtbAppbmRleCA4NzRiMjc0Li41NGZlYjlkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LmZlYXR1cmUvcG9tLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LmZlYXR1cmUvcG9tLnhtbApAQCAtMTcsNyArMTcsNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+amdpdC50eWNoby5wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+Ni4wLjEtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+Ni4xLjEtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQuZmVhdHVyZTwvZ3JvdXBJZD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuZ3BnLmJjLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LmdwZy5iYy5mZWF0dXJlL2ZlYXR1cmUueG1sCmluZGV4IGJlMDI2NjIuLjIwNjE5NDggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuZ3BnLmJjLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5ncGcuYmMuZmVhdHVyZS9mZWF0dXJlLnhtbApAQCAtMiw3ICsyLDcgQEAKIDxmZWF0dXJlCiAgICAgICBpZD0ib3JnLmVjbGlwc2UuamdpdC5ncGcuYmMiCiAgICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iNi4wLjEucXVhbGlmaWVyIgorICAgICAgdmVyc2lvbj0iNi4xLjEucXVhbGlmaWVyIgogICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+CiAKICAgIDxkZXNjcmlwdGlvbiB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvamdpdC8iPgpAQCAtMjMsNyArMjMsNyBAQAogICAgPC91cmw+CiAKICAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZ2l0IiB2ZXJzaW9uPSI2LjAuMSIgbWF0Y2g9ImVxdWl2YWxlbnQiLz4KKyAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZ2l0IiB2ZXJzaW9uPSI2LjEuMSIgbWF0Y2g9ImVxdWl2YWxlbnQiLz4KICAgIDwvcmVxdWlyZXM+CiAKICAgIDxwbHVnaW4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuZ3BnLmJjLmZlYXR1cmUvcG9tLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuZ3BnLmJjLmZlYXR1cmUvcG9tLnhtbAppbmRleCAyOTA5ZTgwLi43NjA5MDNlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LmdwZy5iYy5mZWF0dXJlL3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5ncGcuYmMuZmVhdHVyZS9wb20ueG1sCkBAIC0xNyw3ICsxNyw3IEBACiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5qZ2l0LnR5Y2hvLnBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj42LjAuMS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8dmVyc2lvbj42LjEuMS1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPC9wYXJlbnQ+CiAKICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdC5mZWF0dXJlPC9ncm91cElkPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5odHRwLmFwYWNoZS5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5odHRwLmFwYWNoZS5mZWF0dXJlL2ZlYXR1cmUueG1sCmluZGV4IDg5MzdhODMuLmU4OTlhZDUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGUuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuYXBhY2hlLmZlYXR1cmUvZmVhdHVyZS54bWwKQEAgLTIsNyArMiw3IEBACiA8ZmVhdHVyZQogICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGUiCiAgICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iNi4wLjEucXVhbGlmaWVyIgorICAgICAgdmVyc2lvbj0iNi4xLjEucXVhbGlmaWVyIgogICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+CiAKICAgIDxkZXNjcmlwdGlvbiB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvamdpdC8iPgpAQCAtMjMsNyArMjMsNyBAQAogICAgPC91cmw+CiAKICAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZ2l0IiB2ZXJzaW9uPSI2LjAuMSIgbWF0Y2g9ImVxdWl2YWxlbnQiLz4KKyAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZ2l0IiB2ZXJzaW9uPSI2LjEuMSIgbWF0Y2g9ImVxdWl2YWxlbnQiLz4KICAgIDwvcmVxdWlyZXM+CiAKICAgIDxwbHVnaW4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGUuZmVhdHVyZS9wb20ueG1sIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5odHRwLmFwYWNoZS5mZWF0dXJlL3BvbS54bWwKaW5kZXggMjI5MmMyZS4uYjcyNWRmZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5odHRwLmFwYWNoZS5mZWF0dXJlL3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5odHRwLmFwYWNoZS5mZWF0dXJlL3BvbS54bWwKQEAgLTE3LDcgKzE3LDcgQEAKICAgPHBhcmVudD4KICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0PC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPmpnaXQudHljaG8ucGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjYuMC4xLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjYuMS4xLVNOQVBTSE9UPC92ZXJzaW9uPgogICA8L3BhcmVudD4KIAogICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0LmZlYXR1cmU8L2dyb3VwSWQ+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LmZlYXR1cmUvZmVhdHVyZS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LmZlYXR1cmUvZmVhdHVyZS54bWwKaW5kZXggNmVlZTdjZC4uOTkwNzNlNCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuZmVhdHVyZS9mZWF0dXJlLnhtbApAQCAtMiw3ICsyLDcgQEAKIDxmZWF0dXJlCiAgICAgICBpZD0ib3JnLmVjbGlwc2UuamdpdC5qdW5pdCIKICAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSI2LjAuMS5xdWFsaWZpZXIiCisgICAgICB2ZXJzaW9uPSI2LjEuMS5xdWFsaWZpZXIiCiAgICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KIAogICAgPGRlc2NyaXB0aW9uIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9qZ2l0LyI+CkBAIC0yNCw3ICsyNCw3IEBACiAKICAgIDxyZXF1aXJlcz4KICAgICAgIDxpbXBvcnQgcGx1Z2luPSJjb20uamNyYWZ0LmpzY2giLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZ2l0IiB2ZXJzaW9uPSI2LjAuMSIgbWF0Y2g9ImVxdWl2YWxlbnQiLz4KKyAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZ2l0IiB2ZXJzaW9uPSI2LjEuMSIgbWF0Y2g9ImVxdWl2YWxlbnQiLz4KICAgIDwvcmVxdWlyZXM+CiAKICAgIDxwbHVnaW4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuZmVhdHVyZS9wb20ueG1sIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5mZWF0dXJlL3BvbS54bWwKaW5kZXggZGM0MTU5Yi4uMzU2NmRiYiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5mZWF0dXJlL3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5mZWF0dXJlL3BvbS54bWwKQEAgLTE3LDcgKzE3LDcgQEAKICAgPHBhcmVudD4KICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0PC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPmpnaXQudHljaG8ucGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjYuMC4xLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjYuMS4xLVNOQVBTSE9UPC92ZXJzaW9uPgogICA8L3BhcmVudD4KIAogICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0LmZlYXR1cmU8L2dyb3VwSWQ+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5sZnMuZmVhdHVyZS9mZWF0dXJlLnhtbAppbmRleCBmMGE0ODg0Li5jMDQwNTFiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQubGZzLmZlYXR1cmUvZmVhdHVyZS54bWwKQEAgLTIsNyArMiw3IEBACiA8ZmVhdHVyZQogICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpnaXQubGZzIgogICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjYuMC4xLnF1YWxpZmllciIKKyAgICAgIHZlcnNpb249IjYuMS4xLnF1YWxpZmllciIKICAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgogCiAgICA8ZGVzY3JpcHRpb24gdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2pnaXQvIj4KQEAgLTIzLDcgKzIzLDcgQEAKICAgIDwvdXJsPgogCiAgICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IGZlYXR1cmU9Im9yZy5lY2xpcHNlLmpnaXQiIHZlcnNpb249IjYuMC4xIiBtYXRjaD0iZXF1aXZhbGVudCIvPgorICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5qZ2l0IiB2ZXJzaW9uPSI2LjEuMSIgbWF0Y2g9ImVxdWl2YWxlbnQiLz4KICAgIDwvcmVxdWlyZXM+CiAKICAgIDxwbHVnaW4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQubGZzLmZlYXR1cmUvcG9tLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQubGZzLmZlYXR1cmUvcG9tLnhtbAppbmRleCBlMzQ0YzE5Li41MDMzOGE2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5mZWF0dXJlL3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5sZnMuZmVhdHVyZS9wb20ueG1sCkBAIC0xNyw3ICsxNyw3IEBACiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5qZ2l0LnR5Y2hvLnBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj42LjAuMS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8dmVyc2lvbj42LjEuMS1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPC9wYXJlbnQ+CiAKICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdC5mZWF0dXJlPC9ncm91cElkPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5wZ20uZmVhdHVyZS9mZWF0dXJlLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQucGdtLmZlYXR1cmUvZmVhdHVyZS54bWwKaW5kZXggZjU4ODllNS4uMzkzOWY1MSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5wZ20uZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnBnbS5mZWF0dXJlL2ZlYXR1cmUueG1sCkBAIC0yLDcgKzIsNyBAQAogPGZlYXR1cmUKICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZ2l0LnBnbSIKICAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSI2LjAuMS5xdWFsaWZpZXIiCisgICAgICB2ZXJzaW9uPSI2LjEuMS5xdWFsaWZpZXIiCiAgICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KIAogICAgPGRlc2NyaXB0aW9uIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9qZ2l0LyI+CkBAIC0zNSw5ICszNSw5IEBACiAgICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgogCiAgICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IGZlYXR1cmU9Im9yZy5lY2xpcHNlLmpnaXQiIHZlcnNpb249IjYuMC4xIiBtYXRjaD0iZXF1aXZhbGVudCIvPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5qZ2l0LmxmcyIgdmVyc2lvbj0iNi4wLjEiIG1hdGNoPSJlcXVpdmFsZW50Ii8+Ci0gICAgICA8aW1wb3J0IGZlYXR1cmU9Im9yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZSIgdmVyc2lvbj0iNi4wLjEiIG1hdGNoPSJlcXVpdmFsZW50Ii8+CisgICAgICA8aW1wb3J0IGZlYXR1cmU9Im9yZy5lY2xpcHNlLmpnaXQiIHZlcnNpb249IjYuMS4xIiBtYXRjaD0iZXF1aXZhbGVudCIvPgorICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5qZ2l0LmxmcyIgdmVyc2lvbj0iNi4xLjEiIG1hdGNoPSJlcXVpdmFsZW50Ii8+CisgICAgICA8aW1wb3J0IGZlYXR1cmU9Im9yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZSIgdmVyc2lvbj0iNi4xLjEiIG1hdGNoPSJlcXVpdmFsZW50Ii8+CiAgICA8L3JlcXVpcmVzPgogCiAgICA8cGx1Z2luCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnBnbS5mZWF0dXJlL3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnBnbS5mZWF0dXJlL3BvbS54bWwKaW5kZXggYWU5NTcwNC4uNGIwZTI2YSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5wZ20uZmVhdHVyZS9wb20ueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQucGdtLmZlYXR1cmUvcG9tLnhtbApAQCAtMTcsNyArMTcsNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+amdpdC50eWNoby5wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+Ni4wLjEtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+Ni4xLjEtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQuZmVhdHVyZTwvZ3JvdXBJZD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQucmVwb3NpdG9yeS9wb20ueG1sIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5yZXBvc2l0b3J5L3BvbS54bWwKaW5kZXggZTEyZTU5OS4uOWNjZjM5ZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5yZXBvc2l0b3J5L3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5yZXBvc2l0b3J5L3BvbS54bWwKQEAgLTE3LDcgKzE3LDcgQEAKICAgPHBhcmVudD4KICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0PC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPmpnaXQudHljaG8ucGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjYuMC4xLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjYuMS4xLVNOQVBTSE9UPC92ZXJzaW9uPgogICA8L3BhcmVudD4KIAogICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0LnJlcG9zaXRvcnk8L2FydGlmYWN0SWQ+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnNvdXJjZS5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5zb3VyY2UuZmVhdHVyZS9mZWF0dXJlLnhtbAppbmRleCBkNWQxNTU0Li5kM2U2NjJiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnNvdXJjZS5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuc291cmNlLmZlYXR1cmUvZmVhdHVyZS54bWwKQEAgLTIsNyArMiw3IEBACiA8ZmVhdHVyZQogICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpnaXQuc291cmNlIgogICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjYuMC4xLnF1YWxpZmllciIKKyAgICAgIHZlcnNpb249IjYuMS4xLnF1YWxpZmllciIKICAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgogCiAgICA8ZGVzY3JpcHRpb24gdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2pnaXQvIj4KQEAgLTIzLDcgKzIzLDcgQEAKICAgIDwvdXJsPgogCiAgICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IGZlYXR1cmU9Im9yZy5lY2xpcHNlLmpnaXQiIHZlcnNpb249IjYuMC4xIiBtYXRjaD0iZXF1aXZhbGVudCIvPgorICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5qZ2l0IiB2ZXJzaW9uPSI2LjEuMSIgbWF0Y2g9ImVxdWl2YWxlbnQiLz4KICAgIDwvcmVxdWlyZXM+CiAKICAgIDxwbHVnaW4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuc291cmNlLmZlYXR1cmUvcG9tLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuc291cmNlLmZlYXR1cmUvcG9tLnhtbAppbmRleCBhMjA2NDVlLi5kOGI1ZGUyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnNvdXJjZS5mZWF0dXJlL3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5zb3VyY2UuZmVhdHVyZS9wb20ueG1sCkBAIC0xNyw3ICsxNyw3IEBACiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5qZ2l0LnR5Y2hvLnBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj42LjAuMS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8dmVyc2lvbj42LjEuMS1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPC9wYXJlbnQ+CiAKICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdC5mZWF0dXJlPC9ncm91cElkPgpAQCAtMzAsNyArMzAsNyBAQAogICAgIDxkZXBlbmRlbmN5PgogICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdC5mZWF0dXJlPC9ncm91cElkPgogICAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjYuMC4xLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgICAgPHZlcnNpb24+Ni4xLjEtU05BUFNIT1Q8L3ZlcnNpb24+CiAgICAgPC9kZXBlbmRlbmN5PgogICA8L2RlcGVuZGVuY2llcz4KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUuZmVhdHVyZS9mZWF0dXJlLnhtbAppbmRleCBhZTYyZmEwLi5lMDM5NjQ3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUuZmVhdHVyZS9mZWF0dXJlLnhtbApAQCAtMiw3ICsyLDcgQEAKIDxmZWF0dXJlCiAgICAgICBpZD0ib3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlIgogICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjYuMC4xLnF1YWxpZmllciIKKyAgICAgIHZlcnNpb249IjYuMS4xLnF1YWxpZmllciIKICAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgogCiAgICA8ZGVzY3JpcHRpb24gdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2pnaXQvIj4KQEAgLTIzLDcgKzIzLDcgQEAKICAgIDwvdXJsPgogCiAgICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IGZlYXR1cmU9Im9yZy5lY2xpcHNlLmpnaXQiIHZlcnNpb249IjYuMC4xIiBtYXRjaD0iZXF1aXZhbGVudCIvPgorICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5qZ2l0IiB2ZXJzaW9uPSI2LjEuMSIgbWF0Y2g9ImVxdWl2YWxlbnQiLz4KICAgIDwvcmVxdWlyZXM+CiAKICAgIDxwbHVnaW4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS5mZWF0dXJlL3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUuZmVhdHVyZS9wb20ueG1sCmluZGV4IDZmMTJhZmEuLjU5MWI0NDggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS5mZWF0dXJlL3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLmZlYXR1cmUvcG9tLnhtbApAQCAtMTcsNyArMTcsNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+amdpdC50eWNoby5wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+Ni4wLjEtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+Ni4xLjEtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQuZmVhdHVyZTwvZ3JvdXBJZD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuc3NoLmpzY2guZmVhdHVyZS9mZWF0dXJlLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuc3NoLmpzY2guZmVhdHVyZS9mZWF0dXJlLnhtbAppbmRleCBkZjQyZTkzLi4zZGY0YTkyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5qc2NoLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5zc2guanNjaC5mZWF0dXJlL2ZlYXR1cmUueG1sCkBAIC0yLDcgKzIsNyBAQAogPGZlYXR1cmUKICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZ2l0LnNzaC5qc2NoIgogICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjYuMC4xLnF1YWxpZmllciIKKyAgICAgIHZlcnNpb249IjYuMS4xLnF1YWxpZmllciIKICAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgogCiAgICA8ZGVzY3JpcHRpb24gdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2pnaXQvIj4KQEAgLTIzLDcgKzIzLDcgQEAKICAgIDwvdXJsPgogCiAgICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamdpdCIgdmVyc2lvbj0iNi4wLjEiIG1hdGNoPSJlcXVpdmFsZW50Ii8+CisgICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamdpdCIgdmVyc2lvbj0iNi4xLjEiIG1hdGNoPSJlcXVpdmFsZW50Ii8+CiAgICA8L3JlcXVpcmVzPgogCiAgICA8cGx1Z2luCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5qc2NoLmZlYXR1cmUvcG9tLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuc3NoLmpzY2guZmVhdHVyZS9wb20ueG1sCmluZGV4IDM3YWRhNWQuLmU0NjFiZmYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuc3NoLmpzY2guZmVhdHVyZS9wb20ueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuc3NoLmpzY2guZmVhdHVyZS9wb20ueG1sCkBAIC0xNyw3ICsxNyw3IEBACiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5qZ2l0LnR5Y2hvLnBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj42LjAuMS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8dmVyc2lvbj42LjEuMS1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPC9wYXJlbnQ+CiAKICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdC5mZWF0dXJlPC9ncm91cElkPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9NRVRBLUlORi9NQU5JRkVTVC5NRgppbmRleCBkMzFjZDM3Li41ZDYxZWVmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMiw0ICsyLDQgQEAKIEJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKIEJ1bmRsZS1OYW1lOiBKR2l0IFRhcmdldCBQbGF0Zm9ybSBCdW5kbGUKIEJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpnaXQudGFyZ2V0Ci1CdW5kbGUtVmVyc2lvbjogNi4wLjEucXVhbGlmaWVyCitCdW5kbGUtVmVyc2lvbjogNi4xLjEucXVhbGlmaWVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9qZ2l0LTQuMTcudGFyZ2V0IGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvamdpdC00LjE3LnRhcmdldAppbmRleCA5MTM3MGNjLi40ZTQwMjMyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9qZ2l0LTQuMTcudGFyZ2V0CisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L2pnaXQtNC4xNy50YXJnZXQKQEAgLTEsNyArMSw3IEBACiA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4KIDw/cGRlPz4KIDwhLS0gZ2VuZXJhdGVkIHdpdGggaHR0cHM6Ly9naXRodWIuY29tL2VjbGlwc2UtY2JpL3RhcmdldHBsYXRmb3JtLWRzbCAtLT4KLTx0YXJnZXQgbmFtZT0iamdpdC00LjE3IiBzZXF1ZW5jZU51bWJlcj0iMTY0MTM5Mzk1NCI+Cis8dGFyZ2V0IG5hbWU9ImpnaXQtNC4xNyIgc2VxdWVuY2VOdW1iZXI9IjE2NDYyNTY2NTMiPgogICA8bG9jYXRpb25zPgogICAgIDxsb2NhdGlvbiBpbmNsdWRlTW9kZT0ic2xpY2VyIiBpbmNsdWRlQWxsUGxhdGZvcm1zPSJmYWxzZSIgaW5jbHVkZVNvdXJjZT0idHJ1ZSIgaW5jbHVkZUNvbmZpZ3VyZVBoYXNlPSJ0cnVlIiB0eXBlPSJJbnN0YWxsYWJsZVVuaXQiPgogICAgICAgPHVuaXQgaWQ9Impha2FydGEuc2VydmxldC1hcGkiIHZlcnNpb249IjQuMC4wIi8+CkBAIC0yMyw4ICsyMyw4IEBACiAgICAgICA8cmVwb3NpdG9yeSBpZD0iamV0dHktMTAuMC54IiBsb2NhdGlvbj0iaHR0cHM6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy9lY2xpcHNlL2pldHR5LzEwLjAuNi8iLz4KICAgICA8L2xvY2F0aW9uPgogICAgIDxsb2NhdGlvbiBpbmNsdWRlTW9kZT0ic2xpY2VyIiBpbmNsdWRlQWxsUGxhdGZvcm1zPSJmYWxzZSIgaW5jbHVkZVNvdXJjZT0idHJ1ZSIgaW5jbHVkZUNvbmZpZ3VyZVBoYXNlPSJ0cnVlIiB0eXBlPSJJbnN0YWxsYWJsZVVuaXQiPgotICAgICAgPHVuaXQgaWQ9ImNvbS5nb29nbGUuZ3NvbiIgdmVyc2lvbj0iMi44LjgudjIwMjExMDI5LTA4MzgiLz4KLSAgICAgIDx1bml0IGlkPSJjb20uZ29vZ2xlLmdzb24uc291cmNlIiB2ZXJzaW9uPSIyLjguOC52MjAyMTEwMjktMDgzOCIvPgorICAgICAgPHVuaXQgaWQ9ImNvbS5nb29nbGUuZ3NvbiIgdmVyc2lvbj0iMi44LjkudjIwMjIwMTExLTE0MDkiLz4KKyAgICAgIDx1bml0IGlkPSJjb20uZ29vZ2xlLmdzb24uc291cmNlIiB2ZXJzaW9uPSIyLjguOS52MjAyMjAxMTEtMTQwOSIvPgogICAgICAgPHVuaXQgaWQ9ImNvbS5qY3JhZnQuanNjaCIgdmVyc2lvbj0iMC4xLjU1LnYyMDE5MDQwNC0xOTAyIi8+CiAgICAgICA8dW5pdCBpZD0iY29tLmpjcmFmdC5qc2NoLnNvdXJjZSIgdmVyc2lvbj0iMC4xLjU1LnYyMDE5MDQwNC0xOTAyIi8+CiAgICAgICA8dW5pdCBpZD0iY29tLmpjcmFmdC5qemxpYiIgdmVyc2lvbj0iMS4xLjEudjIwMTIwNTEwMjMwNSIvPgpAQCAtNTEsMjIgKzUxLDIyIEBACiAgICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuc291cmNlIiB2ZXJzaW9uPSIxLjIuMC52MjAxODA0MDktMTUwMiIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHMuaHR0cGNsaWVudCIgdmVyc2lvbj0iNC41LjEzLnYyMDIxMDEyOC0yMjI1Ii8+CiAgICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5odHRwY29tcG9uZW50cy5odHRwY2xpZW50LnNvdXJjZSIgdmVyc2lvbj0iNC41LjEzLnYyMDIxMDEyOC0yMjI1Ii8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5odHRwY29tcG9uZW50cy5odHRwY29yZSIgdmVyc2lvbj0iNC40LjE0LnYyMDIxMDEyOC0yMjI1Ii8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5odHRwY29tcG9uZW50cy5odHRwY29yZS5zb3VyY2UiIHZlcnNpb249IjQuNC4xNC52MjAyMTAxMjgtMjIyNSIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuc3NoZC5vc2dpIiB2ZXJzaW9uPSIyLjcuMC52MjAyMTA2MjMtMDYxOCIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuc3NoZC5vc2dpLnNvdXJjZSIgdmVyc2lvbj0iMi43LjAudjIwMjEwNjIzLTA2MTgiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLnNzaGQuc2Z0cCIgdmVyc2lvbj0iMi43LjAudjIwMjEwNjIzLTA2MTgiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLnNzaGQuc2Z0cC5zb3VyY2UiIHZlcnNpb249IjIuNy4wLnYyMDIxMDYyMy0wNjE4Ii8+CisgICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5odHRwY29tcG9uZW50cy5odHRwY29yZSIgdmVyc2lvbj0iNC40LjE1LnYyMDIyMDIwOS0yMzQ1Ii8+CisgICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5odHRwY29tcG9uZW50cy5odHRwY29yZS5zb3VyY2UiIHZlcnNpb249IjQuNC4xNS52MjAyMjAyMDktMjM0NSIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuc3NoZC5vc2dpIiB2ZXJzaW9uPSIyLjguMC52MjAyMTEyMjctMTc1MCIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuc3NoZC5vc2dpLnNvdXJjZSIgdmVyc2lvbj0iMi44LjAudjIwMjExMjI3LTE3NTAiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLnNzaGQuc2Z0cCIgdmVyc2lvbj0iMi44LjAudjIwMjExMjI3LTE3NTAiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLnNzaGQuc2Z0cC5zb3VyY2UiIHZlcnNpb249IjIuOC4wLnYyMDIxMTIyNy0xNzUwIi8+CiAgICAgICA8dW5pdCBpZD0ib3JnLmFzc2VydGoiIHZlcnNpb249IjMuMjAuMi52MjAyMTA3MDYtMTEwNCIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy5hc3NlcnRqLnNvdXJjZSIgdmVyc2lvbj0iMy4yMC4yLnYyMDIxMDcwNi0xMTA0Ii8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3BnIiB2ZXJzaW9uPSIxLjY5LjAudjIwMjEwNzEzLTE5MjQiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjcGcuc291cmNlIiB2ZXJzaW9uPSIxLjY5LjAudjIwMjEwNzEzLTE5MjQiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjcGtpeCIgdmVyc2lvbj0iMS42OS4wLnYyMDIxMDcxMy0xOTI0Ii8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3BraXguc291cmNlIiB2ZXJzaW9uPSIxLjY5LjAudjIwMjEwNzEzLTE5MjQiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjcHJvdiIgdmVyc2lvbj0iMS42OS4wLnYyMDIxMDkyMy0xNDAxIi8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3Byb3Yuc291cmNlIiB2ZXJzaW9uPSIxLjY5LjAudjIwMjEwOTIzLTE0MDEiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjdXRpbCIgdmVyc2lvbj0iMS42OS4wLnYyMDIxMDcxMy0xOTI0Ii8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3V0aWwuc291cmNlIiB2ZXJzaW9uPSIxLjY5LjAudjIwMjEwNzEzLTE5MjQiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjcGciIHZlcnNpb249IjEuNzAuMC52MjAyMjAxMDUtMTUyMiIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmNwZy5zb3VyY2UiIHZlcnNpb249IjEuNzAuMC52MjAyMjAxMDUtMTUyMiIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmNwa2l4IiB2ZXJzaW9uPSIxLjcwLjAudjIwMjIwMTA1LTE1MjIiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjcGtpeC5zb3VyY2UiIHZlcnNpb249IjEuNzAuMC52MjAyMjAxMDUtMTUyMiIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmNwcm92IiB2ZXJzaW9uPSIxLjcwLjAudjIwMjIwMTA1LTE1MjIiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjcHJvdi5zb3VyY2UiIHZlcnNpb249IjEuNzAuMC52MjAyMjAxMDUtMTUyMiIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmN1dGlsIiB2ZXJzaW9uPSIxLjcwLjAudjIwMjIwMTA1LTE1MjIiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjdXRpbC5zb3VyY2UiIHZlcnNpb249IjEuNzAuMC52MjAyMjAxMDUtMTUyMiIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy5oYW1jcmVzdCIgdmVyc2lvbj0iMi4yLjAudjIwMjEwNzExLTA4MjEiLz4KICAgICAgIDx1bml0IGlkPSJvcmcuaGFtY3Jlc3Quc291cmNlIiB2ZXJzaW9uPSIyLjIuMC52MjAyMTA3MTEtMDgyMSIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy5oYW1jcmVzdC5jb3JlIiB2ZXJzaW9uPSIxLjMuMC52MjAxODA0MjAtMTUxOSIvPgpAQCAtODcsNyArODcsNyBAQAogICAgICAgPHVuaXQgaWQ9Im9yZy5zbGY0ai5iaW5kaW5nLnNpbXBsZS5zb3VyY2UiIHZlcnNpb249IjEuNy4zMC52MjAyMDAyMDQtMjE1MCIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy50dWthYW5pLnh6IiB2ZXJzaW9uPSIxLjkuMC52MjAyMTA2MjQtMTI1OSIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy50dWthYW5pLnh6LnNvdXJjZSIgdmVyc2lvbj0iMS45LjAudjIwMjEwNjI0LTEyNTkiLz4KLSAgICAgIDxyZXBvc2l0b3J5IGxvY2F0aW9uPSJodHRwczovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3Rvb2xzL29yYml0L2Rvd25sb2Fkcy9kcm9wcy9SMjAyMTEyMTMxNzM4MTMvcmVwb3NpdG9yeSIvPgorICAgICAgPHJlcG9zaXRvcnkgbG9jYXRpb249Imh0dHBzOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvdG9vbHMvb3JiaXQvZG93bmxvYWRzL2Ryb3BzL1IyMDIyMDMwMjE3MjIzMy9yZXBvc2l0b3J5Ii8+CiAgICAgPC9sb2NhdGlvbj4KICAgICA8bG9jYXRpb24gaW5jbHVkZU1vZGU9InNsaWNlciIgaW5jbHVkZUFsbFBsYXRmb3Jtcz0iZmFsc2UiIGluY2x1ZGVTb3VyY2U9InRydWUiIGluY2x1ZGVDb25maWd1cmVQaGFzZT0idHJ1ZSIgdHlwZT0iSW5zdGFsbGFibGVVbml0Ij4KICAgICAgIDx1bml0IGlkPSJvcmcuZWNsaXBzZS5vc2dpIiB2ZXJzaW9uPSIwLjAuMCIvPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvamdpdC00LjE3LnRwZCBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L2pnaXQtNC4xNy50cGQKaW5kZXggYzJiMTNjYy4uZGJiNDUwYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvamdpdC00LjE3LnRwZAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9qZ2l0LTQuMTcudHBkCkBAIC0xLDcgKzEsNyBAQAogdGFyZ2V0ICJqZ2l0LTQuMTciIHdpdGggc291cmNlIGNvbmZpZ3VyZVBoYXNlCiAKIGluY2x1ZGUgInByb2plY3RzL2pldHR5LTEwLjAueC50cGQiCi1pbmNsdWRlICJvcmJpdC9SMjAyMTEyMTMxNzM4MTMtMjAyMS0xMi50cGQiCitpbmNsdWRlICJvcmJpdC9SMjAyMjAzMDIxNzIyMzMtMjAyMi0wMy50cGQiCiAKIGxvY2F0aW9uICJodHRwczovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3JlbGVhc2VzLzIwMjAtMDkvIiB7CiAJb3JnLmVjbGlwc2Uub3NnaSBsYXp5CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9qZ2l0LTQuMTgudGFyZ2V0IGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvamdpdC00LjE4LnRhcmdldAppbmRleCAyODIwNGY1Li4xNjI4MjE3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9qZ2l0LTQuMTgudGFyZ2V0CisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L2pnaXQtNC4xOC50YXJnZXQKQEAgLTEsNyArMSw3IEBACiA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4KIDw/cGRlPz4KIDwhLS0gZ2VuZXJhdGVkIHdpdGggaHR0cHM6Ly9naXRodWIuY29tL2VjbGlwc2UtY2JpL3RhcmdldHBsYXRmb3JtLWRzbCAtLT4KLTx0YXJnZXQgbmFtZT0iamdpdC00LjE4IiBzZXF1ZW5jZU51bWJlcj0iMTY0MTM5NDEyMiI+Cis8dGFyZ2V0IG5hbWU9ImpnaXQtNC4xOCIgc2VxdWVuY2VOdW1iZXI9IjE2NDYyNTY2NTMiPgogICA8bG9jYXRpb25zPgogICAgIDxsb2NhdGlvbiBpbmNsdWRlTW9kZT0ic2xpY2VyIiBpbmNsdWRlQWxsUGxhdGZvcm1zPSJmYWxzZSIgaW5jbHVkZVNvdXJjZT0idHJ1ZSIgaW5jbHVkZUNvbmZpZ3VyZVBoYXNlPSJ0cnVlIiB0eXBlPSJJbnN0YWxsYWJsZVVuaXQiPgogICAgICAgPHVuaXQgaWQ9Impha2FydGEuc2VydmxldC1hcGkiIHZlcnNpb249IjQuMC4wIi8+CkBAIC0yMyw4ICsyMyw4IEBACiAgICAgICA8cmVwb3NpdG9yeSBpZD0iamV0dHktMTAuMC54IiBsb2NhdGlvbj0iaHR0cHM6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy9lY2xpcHNlL2pldHR5LzEwLjAuNi8iLz4KICAgICA8L2xvY2F0aW9uPgogICAgIDxsb2NhdGlvbiBpbmNsdWRlTW9kZT0ic2xpY2VyIiBpbmNsdWRlQWxsUGxhdGZvcm1zPSJmYWxzZSIgaW5jbHVkZVNvdXJjZT0idHJ1ZSIgaW5jbHVkZUNvbmZpZ3VyZVBoYXNlPSJ0cnVlIiB0eXBlPSJJbnN0YWxsYWJsZVVuaXQiPgotICAgICAgPHVuaXQgaWQ9ImNvbS5nb29nbGUuZ3NvbiIgdmVyc2lvbj0iMi44LjgudjIwMjExMDI5LTA4MzgiLz4KLSAgICAgIDx1bml0IGlkPSJjb20uZ29vZ2xlLmdzb24uc291cmNlIiB2ZXJzaW9uPSIyLjguOC52MjAyMTEwMjktMDgzOCIvPgorICAgICAgPHVuaXQgaWQ9ImNvbS5nb29nbGUuZ3NvbiIgdmVyc2lvbj0iMi44LjkudjIwMjIwMTExLTE0MDkiLz4KKyAgICAgIDx1bml0IGlkPSJjb20uZ29vZ2xlLmdzb24uc291cmNlIiB2ZXJzaW9uPSIyLjguOS52MjAyMjAxMTEtMTQwOSIvPgogICAgICAgPHVuaXQgaWQ9ImNvbS5qY3JhZnQuanNjaCIgdmVyc2lvbj0iMC4xLjU1LnYyMDE5MDQwNC0xOTAyIi8+CiAgICAgICA8dW5pdCBpZD0iY29tLmpjcmFmdC5qc2NoLnNvdXJjZSIgdmVyc2lvbj0iMC4xLjU1LnYyMDE5MDQwNC0xOTAyIi8+CiAgICAgICA8dW5pdCBpZD0iY29tLmpjcmFmdC5qemxpYiIgdmVyc2lvbj0iMS4xLjEudjIwMTIwNTEwMjMwNSIvPgpAQCAtNTEsMjIgKzUxLDIyIEBACiAgICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuc291cmNlIiB2ZXJzaW9uPSIxLjIuMC52MjAxODA0MDktMTUwMiIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHMuaHR0cGNsaWVudCIgdmVyc2lvbj0iNC41LjEzLnYyMDIxMDEyOC0yMjI1Ii8+CiAgICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5odHRwY29tcG9uZW50cy5odHRwY2xpZW50LnNvdXJjZSIgdmVyc2lvbj0iNC41LjEzLnYyMDIxMDEyOC0yMjI1Ii8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5odHRwY29tcG9uZW50cy5odHRwY29yZSIgdmVyc2lvbj0iNC40LjE0LnYyMDIxMDEyOC0yMjI1Ii8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5odHRwY29tcG9uZW50cy5odHRwY29yZS5zb3VyY2UiIHZlcnNpb249IjQuNC4xNC52MjAyMTAxMjgtMjIyNSIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuc3NoZC5vc2dpIiB2ZXJzaW9uPSIyLjcuMC52MjAyMTA2MjMtMDYxOCIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuc3NoZC5vc2dpLnNvdXJjZSIgdmVyc2lvbj0iMi43LjAudjIwMjEwNjIzLTA2MTgiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLnNzaGQuc2Z0cCIgdmVyc2lvbj0iMi43LjAudjIwMjEwNjIzLTA2MTgiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLnNzaGQuc2Z0cC5zb3VyY2UiIHZlcnNpb249IjIuNy4wLnYyMDIxMDYyMy0wNjE4Ii8+CisgICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5odHRwY29tcG9uZW50cy5odHRwY29yZSIgdmVyc2lvbj0iNC40LjE1LnYyMDIyMDIwOS0yMzQ1Ii8+CisgICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5odHRwY29tcG9uZW50cy5odHRwY29yZS5zb3VyY2UiIHZlcnNpb249IjQuNC4xNS52MjAyMjAyMDktMjM0NSIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuc3NoZC5vc2dpIiB2ZXJzaW9uPSIyLjguMC52MjAyMTEyMjctMTc1MCIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuc3NoZC5vc2dpLnNvdXJjZSIgdmVyc2lvbj0iMi44LjAudjIwMjExMjI3LTE3NTAiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLnNzaGQuc2Z0cCIgdmVyc2lvbj0iMi44LjAudjIwMjExMjI3LTE3NTAiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLnNzaGQuc2Z0cC5zb3VyY2UiIHZlcnNpb249IjIuOC4wLnYyMDIxMTIyNy0xNzUwIi8+CiAgICAgICA8dW5pdCBpZD0ib3JnLmFzc2VydGoiIHZlcnNpb249IjMuMjAuMi52MjAyMTA3MDYtMTEwNCIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy5hc3NlcnRqLnNvdXJjZSIgdmVyc2lvbj0iMy4yMC4yLnYyMDIxMDcwNi0xMTA0Ii8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3BnIiB2ZXJzaW9uPSIxLjY5LjAudjIwMjEwNzEzLTE5MjQiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjcGcuc291cmNlIiB2ZXJzaW9uPSIxLjY5LjAudjIwMjEwNzEzLTE5MjQiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjcGtpeCIgdmVyc2lvbj0iMS42OS4wLnYyMDIxMDcxMy0xOTI0Ii8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3BraXguc291cmNlIiB2ZXJzaW9uPSIxLjY5LjAudjIwMjEwNzEzLTE5MjQiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjcHJvdiIgdmVyc2lvbj0iMS42OS4wLnYyMDIxMDkyMy0xNDAxIi8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3Byb3Yuc291cmNlIiB2ZXJzaW9uPSIxLjY5LjAudjIwMjEwOTIzLTE0MDEiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjdXRpbCIgdmVyc2lvbj0iMS42OS4wLnYyMDIxMDcxMy0xOTI0Ii8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3V0aWwuc291cmNlIiB2ZXJzaW9uPSIxLjY5LjAudjIwMjEwNzEzLTE5MjQiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjcGciIHZlcnNpb249IjEuNzAuMC52MjAyMjAxMDUtMTUyMiIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmNwZy5zb3VyY2UiIHZlcnNpb249IjEuNzAuMC52MjAyMjAxMDUtMTUyMiIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmNwa2l4IiB2ZXJzaW9uPSIxLjcwLjAudjIwMjIwMTA1LTE1MjIiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjcGtpeC5zb3VyY2UiIHZlcnNpb249IjEuNzAuMC52MjAyMjAxMDUtMTUyMiIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmNwcm92IiB2ZXJzaW9uPSIxLjcwLjAudjIwMjIwMTA1LTE1MjIiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjcHJvdi5zb3VyY2UiIHZlcnNpb249IjEuNzAuMC52MjAyMjAxMDUtMTUyMiIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmN1dGlsIiB2ZXJzaW9uPSIxLjcwLjAudjIwMjIwMTA1LTE1MjIiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjdXRpbC5zb3VyY2UiIHZlcnNpb249IjEuNzAuMC52MjAyMjAxMDUtMTUyMiIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy5oYW1jcmVzdCIgdmVyc2lvbj0iMi4yLjAudjIwMjEwNzExLTA4MjEiLz4KICAgICAgIDx1bml0IGlkPSJvcmcuaGFtY3Jlc3Quc291cmNlIiB2ZXJzaW9uPSIyLjIuMC52MjAyMTA3MTEtMDgyMSIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy5oYW1jcmVzdC5jb3JlIiB2ZXJzaW9uPSIxLjMuMC52MjAxODA0MjAtMTUxOSIvPgpAQCAtODcsNyArODcsNyBAQAogICAgICAgPHVuaXQgaWQ9Im9yZy5zbGY0ai5iaW5kaW5nLnNpbXBsZS5zb3VyY2UiIHZlcnNpb249IjEuNy4zMC52MjAyMDAyMDQtMjE1MCIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy50dWthYW5pLnh6IiB2ZXJzaW9uPSIxLjkuMC52MjAyMTA2MjQtMTI1OSIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy50dWthYW5pLnh6LnNvdXJjZSIgdmVyc2lvbj0iMS45LjAudjIwMjEwNjI0LTEyNTkiLz4KLSAgICAgIDxyZXBvc2l0b3J5IGxvY2F0aW9uPSJodHRwczovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3Rvb2xzL29yYml0L2Rvd25sb2Fkcy9kcm9wcy9SMjAyMTEyMTMxNzM4MTMvcmVwb3NpdG9yeSIvPgorICAgICAgPHJlcG9zaXRvcnkgbG9jYXRpb249Imh0dHBzOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvdG9vbHMvb3JiaXQvZG93bmxvYWRzL2Ryb3BzL1IyMDIyMDMwMjE3MjIzMy9yZXBvc2l0b3J5Ii8+CiAgICAgPC9sb2NhdGlvbj4KICAgICA8bG9jYXRpb24gaW5jbHVkZU1vZGU9InNsaWNlciIgaW5jbHVkZUFsbFBsYXRmb3Jtcz0iZmFsc2UiIGluY2x1ZGVTb3VyY2U9InRydWUiIGluY2x1ZGVDb25maWd1cmVQaGFzZT0idHJ1ZSIgdHlwZT0iSW5zdGFsbGFibGVVbml0Ij4KICAgICAgIDx1bml0IGlkPSJvcmcuZWNsaXBzZS5vc2dpIiB2ZXJzaW9uPSIwLjAuMCIvPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvamdpdC00LjE4LnRwZCBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L2pnaXQtNC4xOC50cGQKaW5kZXggZmY2NzQxZC4uOTExYzY3YyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvamdpdC00LjE4LnRwZAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9qZ2l0LTQuMTgudHBkCkBAIC0xLDcgKzEsNyBAQAogdGFyZ2V0ICJqZ2l0LTQuMTgiIHdpdGggc291cmNlIGNvbmZpZ3VyZVBoYXNlCiAKIGluY2x1ZGUgInByb2plY3RzL2pldHR5LTEwLjAueC50cGQiCi1pbmNsdWRlICJvcmJpdC9SMjAyMTEyMTMxNzM4MTMtMjAyMS0xMi50cGQiCitpbmNsdWRlICJvcmJpdC9SMjAyMjAzMDIxNzIyMzMtMjAyMi0wMy50cGQiCiAKIGxvY2F0aW9uICJodHRwczovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3JlbGVhc2VzLzIwMjAtMTIvIiB7CiAJb3JnLmVjbGlwc2Uub3NnaSBsYXp5CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9qZ2l0LTQuMTkudGFyZ2V0IGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvamdpdC00LjE5LnRhcmdldAppbmRleCAyMGIwNTI5Li5hYjE4ZjdiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9qZ2l0LTQuMTkudGFyZ2V0CisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L2pnaXQtNC4xOS50YXJnZXQKQEAgLTEsNyArMSw3IEBACiA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4KIDw/cGRlPz4KIDwhLS0gZ2VuZXJhdGVkIHdpdGggaHR0cHM6Ly9naXRodWIuY29tL2VjbGlwc2UtY2JpL3RhcmdldHBsYXRmb3JtLWRzbCAtLT4KLTx0YXJnZXQgbmFtZT0iamdpdC00LjE5LXN0YWdpbmciIHNlcXVlbmNlTnVtYmVyPSIxNjQxMzk0MTQxIj4KKzx0YXJnZXQgbmFtZT0iamdpdC00LjE5LXN0YWdpbmciIHNlcXVlbmNlTnVtYmVyPSIxNjQ2MjU2NjUzIj4KICAgPGxvY2F0aW9ucz4KICAgICA8bG9jYXRpb24gaW5jbHVkZU1vZGU9InNsaWNlciIgaW5jbHVkZUFsbFBsYXRmb3Jtcz0iZmFsc2UiIGluY2x1ZGVTb3VyY2U9InRydWUiIGluY2x1ZGVDb25maWd1cmVQaGFzZT0idHJ1ZSIgdHlwZT0iSW5zdGFsbGFibGVVbml0Ij4KICAgICAgIDx1bml0IGlkPSJqYWthcnRhLnNlcnZsZXQtYXBpIiB2ZXJzaW9uPSI0LjAuMCIvPgpAQCAtMjMsOCArMjMsOCBAQAogICAgICAgPHJlcG9zaXRvcnkgaWQ9ImpldHR5LTEwLjAueCIgbG9jYXRpb249Imh0dHBzOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvZWNsaXBzZS9qZXR0eS8xMC4wLjYvIi8+CiAgICAgPC9sb2NhdGlvbj4KICAgICA8bG9jYXRpb24gaW5jbHVkZU1vZGU9InNsaWNlciIgaW5jbHVkZUFsbFBsYXRmb3Jtcz0iZmFsc2UiIGluY2x1ZGVTb3VyY2U9InRydWUiIGluY2x1ZGVDb25maWd1cmVQaGFzZT0idHJ1ZSIgdHlwZT0iSW5zdGFsbGFibGVVbml0Ij4KLSAgICAgIDx1bml0IGlkPSJjb20uZ29vZ2xlLmdzb24iIHZlcnNpb249IjIuOC44LnYyMDIxMTAyOS0wODM4Ii8+Ci0gICAgICA8dW5pdCBpZD0iY29tLmdvb2dsZS5nc29uLnNvdXJjZSIgdmVyc2lvbj0iMi44LjgudjIwMjExMDI5LTA4MzgiLz4KKyAgICAgIDx1bml0IGlkPSJjb20uZ29vZ2xlLmdzb24iIHZlcnNpb249IjIuOC45LnYyMDIyMDExMS0xNDA5Ii8+CisgICAgICA8dW5pdCBpZD0iY29tLmdvb2dsZS5nc29uLnNvdXJjZSIgdmVyc2lvbj0iMi44LjkudjIwMjIwMTExLTE0MDkiLz4KICAgICAgIDx1bml0IGlkPSJjb20uamNyYWZ0LmpzY2giIHZlcnNpb249IjAuMS41NS52MjAxOTA0MDQtMTkwMiIvPgogICAgICAgPHVuaXQgaWQ9ImNvbS5qY3JhZnQuanNjaC5zb3VyY2UiIHZlcnNpb249IjAuMS41NS52MjAxOTA0MDQtMTkwMiIvPgogICAgICAgPHVuaXQgaWQ9ImNvbS5qY3JhZnQuanpsaWIiIHZlcnNpb249IjEuMS4xLnYyMDEyMDUxMDIzMDUiLz4KQEAgLTUxLDIyICs1MSwyMiBAQAogICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLnNvdXJjZSIgdmVyc2lvbj0iMS4yLjAudjIwMTgwNDA5LTE1MDIiLz4KICAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLmh0dHBjb21wb25lbnRzLmh0dHBjbGllbnQiIHZlcnNpb249IjQuNS4xMy52MjAyMTAxMjgtMjIyNSIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHMuaHR0cGNsaWVudC5zb3VyY2UiIHZlcnNpb249IjQuNS4xMy52MjAyMTAxMjgtMjIyNSIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHMuaHR0cGNvcmUiIHZlcnNpb249IjQuNC4xNC52MjAyMTAxMjgtMjIyNSIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHMuaHR0cGNvcmUuc291cmNlIiB2ZXJzaW9uPSI0LjQuMTQudjIwMjEwMTI4LTIyMjUiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLnNzaGQub3NnaSIgdmVyc2lvbj0iMi43LjAudjIwMjEwNjIzLTA2MTgiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLnNzaGQub3NnaS5zb3VyY2UiIHZlcnNpb249IjIuNy4wLnYyMDIxMDYyMy0wNjE4Ii8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5zc2hkLnNmdHAiIHZlcnNpb249IjIuNy4wLnYyMDIxMDYyMy0wNjE4Ii8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5zc2hkLnNmdHAuc291cmNlIiB2ZXJzaW9uPSIyLjcuMC52MjAyMTA2MjMtMDYxOCIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHMuaHR0cGNvcmUiIHZlcnNpb249IjQuNC4xNS52MjAyMjAyMDktMjM0NSIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHMuaHR0cGNvcmUuc291cmNlIiB2ZXJzaW9uPSI0LjQuMTUudjIwMjIwMjA5LTIzNDUiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLnNzaGQub3NnaSIgdmVyc2lvbj0iMi44LjAudjIwMjExMjI3LTE3NTAiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLnNzaGQub3NnaS5zb3VyY2UiIHZlcnNpb249IjIuOC4wLnYyMDIxMTIyNy0xNzUwIi8+CisgICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5zc2hkLnNmdHAiIHZlcnNpb249IjIuOC4wLnYyMDIxMTIyNy0xNzUwIi8+CisgICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5zc2hkLnNmdHAuc291cmNlIiB2ZXJzaW9uPSIyLjguMC52MjAyMTEyMjctMTc1MCIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy5hc3NlcnRqIiB2ZXJzaW9uPSIzLjIwLjIudjIwMjEwNzA2LTExMDQiLz4KICAgICAgIDx1bml0IGlkPSJvcmcuYXNzZXJ0ai5zb3VyY2UiIHZlcnNpb249IjMuMjAuMi52MjAyMTA3MDYtMTEwNCIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmNwZyIgdmVyc2lvbj0iMS42OS4wLnYyMDIxMDcxMy0xOTI0Ii8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3BnLnNvdXJjZSIgdmVyc2lvbj0iMS42OS4wLnYyMDIxMDcxMy0xOTI0Ii8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3BraXgiIHZlcnNpb249IjEuNjkuMC52MjAyMTA3MTMtMTkyNCIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmNwa2l4LnNvdXJjZSIgdmVyc2lvbj0iMS42OS4wLnYyMDIxMDcxMy0xOTI0Ii8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3Byb3YiIHZlcnNpb249IjEuNjkuMC52MjAyMTA5MjMtMTQwMSIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmNwcm92LnNvdXJjZSIgdmVyc2lvbj0iMS42OS4wLnYyMDIxMDkyMy0xNDAxIi8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3V0aWwiIHZlcnNpb249IjEuNjkuMC52MjAyMTA3MTMtMTkyNCIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmN1dGlsLnNvdXJjZSIgdmVyc2lvbj0iMS42OS4wLnYyMDIxMDcxMy0xOTI0Ii8+CisgICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3BnIiB2ZXJzaW9uPSIxLjcwLjAudjIwMjIwMTA1LTE1MjIiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjcGcuc291cmNlIiB2ZXJzaW9uPSIxLjcwLjAudjIwMjIwMTA1LTE1MjIiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjcGtpeCIgdmVyc2lvbj0iMS43MC4wLnYyMDIyMDEwNS0xNTIyIi8+CisgICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3BraXguc291cmNlIiB2ZXJzaW9uPSIxLjcwLjAudjIwMjIwMTA1LTE1MjIiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjcHJvdiIgdmVyc2lvbj0iMS43MC4wLnYyMDIyMDEwNS0xNTIyIi8+CisgICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3Byb3Yuc291cmNlIiB2ZXJzaW9uPSIxLjcwLjAudjIwMjIwMTA1LTE1MjIiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjdXRpbCIgdmVyc2lvbj0iMS43MC4wLnYyMDIyMDEwNS0xNTIyIi8+CisgICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3V0aWwuc291cmNlIiB2ZXJzaW9uPSIxLjcwLjAudjIwMjIwMTA1LTE1MjIiLz4KICAgICAgIDx1bml0IGlkPSJvcmcuaGFtY3Jlc3QiIHZlcnNpb249IjIuMi4wLnYyMDIxMDcxMS0wODIxIi8+CiAgICAgICA8dW5pdCBpZD0ib3JnLmhhbWNyZXN0LnNvdXJjZSIgdmVyc2lvbj0iMi4yLjAudjIwMjEwNzExLTA4MjEiLz4KICAgICAgIDx1bml0IGlkPSJvcmcuaGFtY3Jlc3QuY29yZSIgdmVyc2lvbj0iMS4zLjAudjIwMTgwNDIwLTE1MTkiLz4KQEAgLTg3LDcgKzg3LDcgQEAKICAgICAgIDx1bml0IGlkPSJvcmcuc2xmNGouYmluZGluZy5zaW1wbGUuc291cmNlIiB2ZXJzaW9uPSIxLjcuMzAudjIwMjAwMjA0LTIxNTAiLz4KICAgICAgIDx1bml0IGlkPSJvcmcudHVrYWFuaS54eiIgdmVyc2lvbj0iMS45LjAudjIwMjEwNjI0LTEyNTkiLz4KICAgICAgIDx1bml0IGlkPSJvcmcudHVrYWFuaS54ei5zb3VyY2UiIHZlcnNpb249IjEuOS4wLnYyMDIxMDYyNC0xMjU5Ii8+Ci0gICAgICA8cmVwb3NpdG9yeSBsb2NhdGlvbj0iaHR0cHM6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy90b29scy9vcmJpdC9kb3dubG9hZHMvZHJvcHMvUjIwMjExMjEzMTczODEzL3JlcG9zaXRvcnkiLz4KKyAgICAgIDxyZXBvc2l0b3J5IGxvY2F0aW9uPSJodHRwczovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3Rvb2xzL29yYml0L2Rvd25sb2Fkcy9kcm9wcy9SMjAyMjAzMDIxNzIyMzMvcmVwb3NpdG9yeSIvPgogICAgIDwvbG9jYXRpb24+CiAgICAgPGxvY2F0aW9uIGluY2x1ZGVNb2RlPSJzbGljZXIiIGluY2x1ZGVBbGxQbGF0Zm9ybXM9ImZhbHNlIiBpbmNsdWRlU291cmNlPSJ0cnVlIiBpbmNsdWRlQ29uZmlndXJlUGhhc2U9InRydWUiIHR5cGU9Ikluc3RhbGxhYmxlVW5pdCI+CiAgICAgICA8dW5pdCBpZD0ib3JnLmVjbGlwc2Uub3NnaSIgdmVyc2lvbj0iMC4wLjAiLz4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L2pnaXQtNC4xOS50cGQgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9qZ2l0LTQuMTkudHBkCmluZGV4IDhmY2FhNDcuLmZkYjhiMTEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L2pnaXQtNC4xOS50cGQKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvamdpdC00LjE5LnRwZApAQCAtMSw3ICsxLDcgQEAKIHRhcmdldCAiamdpdC00LjE5LXN0YWdpbmciIHdpdGggc291cmNlIGNvbmZpZ3VyZVBoYXNlCiAKIGluY2x1ZGUgInByb2plY3RzL2pldHR5LTEwLjAueC50cGQiCi1pbmNsdWRlICJvcmJpdC9SMjAyMTEyMTMxNzM4MTMtMjAyMS0xMi50cGQiCitpbmNsdWRlICJvcmJpdC9SMjAyMjAzMDIxNzIyMzMtMjAyMi0wMy50cGQiCiAKIGxvY2F0aW9uICJodHRwczovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3N0YWdpbmcvMjAyMS0wMy8iIHsKIAlvcmcuZWNsaXBzZS5vc2dpIGxhenkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L2pnaXQtNC4yMC50YXJnZXQgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9qZ2l0LTQuMjAudGFyZ2V0CmluZGV4IDE1MzMxNGQuLjRjODQwZGMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L2pnaXQtNC4yMC50YXJnZXQKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvamdpdC00LjIwLnRhcmdldApAQCAtMSw3ICsxLDcgQEAKIDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/PgogPD9wZGU/PgogPCEtLSBnZW5lcmF0ZWQgd2l0aCBodHRwczovL2dpdGh1Yi5jb20vZWNsaXBzZS1jYmkvdGFyZ2V0cGxhdGZvcm0tZHNsIC0tPgotPHRhcmdldCBuYW1lPSJqZ2l0LTQuMjAiIHNlcXVlbmNlTnVtYmVyPSIxNjQxMzk0MTUyIj4KKzx0YXJnZXQgbmFtZT0iamdpdC00LjIwIiBzZXF1ZW5jZU51bWJlcj0iMTY0NjI1NjY1MyI+CiAgIDxsb2NhdGlvbnM+CiAgICAgPGxvY2F0aW9uIGluY2x1ZGVNb2RlPSJzbGljZXIiIGluY2x1ZGVBbGxQbGF0Zm9ybXM9ImZhbHNlIiBpbmNsdWRlU291cmNlPSJ0cnVlIiBpbmNsdWRlQ29uZmlndXJlUGhhc2U9InRydWUiIHR5cGU9Ikluc3RhbGxhYmxlVW5pdCI+CiAgICAgICA8dW5pdCBpZD0iamFrYXJ0YS5zZXJ2bGV0LWFwaSIgdmVyc2lvbj0iNC4wLjAiLz4KQEAgLTIzLDggKzIzLDggQEAKICAgICAgIDxyZXBvc2l0b3J5IGlkPSJqZXR0eS0xMC4wLngiIGxvY2F0aW9uPSJodHRwczovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL2VjbGlwc2UvamV0dHkvMTAuMC42LyIvPgogICAgIDwvbG9jYXRpb24+CiAgICAgPGxvY2F0aW9uIGluY2x1ZGVNb2RlPSJzbGljZXIiIGluY2x1ZGVBbGxQbGF0Zm9ybXM9ImZhbHNlIiBpbmNsdWRlU291cmNlPSJ0cnVlIiBpbmNsdWRlQ29uZmlndXJlUGhhc2U9InRydWUiIHR5cGU9Ikluc3RhbGxhYmxlVW5pdCI+Ci0gICAgICA8dW5pdCBpZD0iY29tLmdvb2dsZS5nc29uIiB2ZXJzaW9uPSIyLjguOC52MjAyMTEwMjktMDgzOCIvPgotICAgICAgPHVuaXQgaWQ9ImNvbS5nb29nbGUuZ3Nvbi5zb3VyY2UiIHZlcnNpb249IjIuOC44LnYyMDIxMTAyOS0wODM4Ii8+CisgICAgICA8dW5pdCBpZD0iY29tLmdvb2dsZS5nc29uIiB2ZXJzaW9uPSIyLjguOS52MjAyMjAxMTEtMTQwOSIvPgorICAgICAgPHVuaXQgaWQ9ImNvbS5nb29nbGUuZ3Nvbi5zb3VyY2UiIHZlcnNpb249IjIuOC45LnYyMDIyMDExMS0xNDA5Ii8+CiAgICAgICA8dW5pdCBpZD0iY29tLmpjcmFmdC5qc2NoIiB2ZXJzaW9uPSIwLjEuNTUudjIwMTkwNDA0LTE5MDIiLz4KICAgICAgIDx1bml0IGlkPSJjb20uamNyYWZ0LmpzY2guc291cmNlIiB2ZXJzaW9uPSIwLjEuNTUudjIwMTkwNDA0LTE5MDIiLz4KICAgICAgIDx1bml0IGlkPSJjb20uamNyYWZ0Lmp6bGliIiB2ZXJzaW9uPSIxLjEuMS52MjAxMjA1MTAyMzA1Ii8+CkBAIC01MSwyMiArNTEsMjIgQEAKICAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5zb3VyY2UiIHZlcnNpb249IjEuMi4wLnYyMDE4MDQwOS0xNTAyIi8+CiAgICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5odHRwY29tcG9uZW50cy5odHRwY2xpZW50IiB2ZXJzaW9uPSI0LjUuMTMudjIwMjEwMTI4LTIyMjUiLz4KICAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLmh0dHBjb21wb25lbnRzLmh0dHBjbGllbnQuc291cmNlIiB2ZXJzaW9uPSI0LjUuMTMudjIwMjEwMTI4LTIyMjUiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLmh0dHBjb21wb25lbnRzLmh0dHBjb3JlIiB2ZXJzaW9uPSI0LjQuMTQudjIwMjEwMTI4LTIyMjUiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLmh0dHBjb21wb25lbnRzLmh0dHBjb3JlLnNvdXJjZSIgdmVyc2lvbj0iNC40LjE0LnYyMDIxMDEyOC0yMjI1Ii8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5zc2hkLm9zZ2kiIHZlcnNpb249IjIuNy4wLnYyMDIxMDYyMy0wNjE4Ii8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5zc2hkLm9zZ2kuc291cmNlIiB2ZXJzaW9uPSIyLjcuMC52MjAyMTA2MjMtMDYxOCIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuc3NoZC5zZnRwIiB2ZXJzaW9uPSIyLjcuMC52MjAyMTA2MjMtMDYxOCIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuc3NoZC5zZnRwLnNvdXJjZSIgdmVyc2lvbj0iMi43LjAudjIwMjEwNjIzLTA2MTgiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLmh0dHBjb21wb25lbnRzLmh0dHBjb3JlIiB2ZXJzaW9uPSI0LjQuMTUudjIwMjIwMjA5LTIzNDUiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLmh0dHBjb21wb25lbnRzLmh0dHBjb3JlLnNvdXJjZSIgdmVyc2lvbj0iNC40LjE1LnYyMDIyMDIwOS0yMzQ1Ii8+CisgICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5zc2hkLm9zZ2kiIHZlcnNpb249IjIuOC4wLnYyMDIxMTIyNy0xNzUwIi8+CisgICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5zc2hkLm9zZ2kuc291cmNlIiB2ZXJzaW9uPSIyLjguMC52MjAyMTEyMjctMTc1MCIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuc3NoZC5zZnRwIiB2ZXJzaW9uPSIyLjguMC52MjAyMTEyMjctMTc1MCIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuc3NoZC5zZnRwLnNvdXJjZSIgdmVyc2lvbj0iMi44LjAudjIwMjExMjI3LTE3NTAiLz4KICAgICAgIDx1bml0IGlkPSJvcmcuYXNzZXJ0aiIgdmVyc2lvbj0iMy4yMC4yLnYyMDIxMDcwNi0xMTA0Ii8+CiAgICAgICA8dW5pdCBpZD0ib3JnLmFzc2VydGouc291cmNlIiB2ZXJzaW9uPSIzLjIwLjIudjIwMjEwNzA2LTExMDQiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjcGciIHZlcnNpb249IjEuNjkuMC52MjAyMTA3MTMtMTkyNCIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmNwZy5zb3VyY2UiIHZlcnNpb249IjEuNjkuMC52MjAyMTA3MTMtMTkyNCIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmNwa2l4IiB2ZXJzaW9uPSIxLjY5LjAudjIwMjEwNzEzLTE5MjQiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjcGtpeC5zb3VyY2UiIHZlcnNpb249IjEuNjkuMC52MjAyMTA3MTMtMTkyNCIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmNwcm92IiB2ZXJzaW9uPSIxLjY5LjAudjIwMjEwOTIzLTE0MDEiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjcHJvdi5zb3VyY2UiIHZlcnNpb249IjEuNjkuMC52MjAyMTA5MjMtMTQwMSIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmN1dGlsIiB2ZXJzaW9uPSIxLjY5LjAudjIwMjEwNzEzLTE5MjQiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjdXRpbC5zb3VyY2UiIHZlcnNpb249IjEuNjkuMC52MjAyMTA3MTMtMTkyNCIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmNwZyIgdmVyc2lvbj0iMS43MC4wLnYyMDIyMDEwNS0xNTIyIi8+CisgICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3BnLnNvdXJjZSIgdmVyc2lvbj0iMS43MC4wLnYyMDIyMDEwNS0xNTIyIi8+CisgICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3BraXgiIHZlcnNpb249IjEuNzAuMC52MjAyMjAxMDUtMTUyMiIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmNwa2l4LnNvdXJjZSIgdmVyc2lvbj0iMS43MC4wLnYyMDIyMDEwNS0xNTIyIi8+CisgICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3Byb3YiIHZlcnNpb249IjEuNzAuMC52MjAyMjAxMDUtMTUyMiIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmNwcm92LnNvdXJjZSIgdmVyc2lvbj0iMS43MC4wLnYyMDIyMDEwNS0xNTIyIi8+CisgICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3V0aWwiIHZlcnNpb249IjEuNzAuMC52MjAyMjAxMDUtMTUyMiIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmN1dGlsLnNvdXJjZSIgdmVyc2lvbj0iMS43MC4wLnYyMDIyMDEwNS0xNTIyIi8+CiAgICAgICA8dW5pdCBpZD0ib3JnLmhhbWNyZXN0IiB2ZXJzaW9uPSIyLjIuMC52MjAyMTA3MTEtMDgyMSIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy5oYW1jcmVzdC5zb3VyY2UiIHZlcnNpb249IjIuMi4wLnYyMDIxMDcxMS0wODIxIi8+CiAgICAgICA8dW5pdCBpZD0ib3JnLmhhbWNyZXN0LmNvcmUiIHZlcnNpb249IjEuMy4wLnYyMDE4MDQyMC0xNTE5Ii8+CkBAIC04Nyw3ICs4Nyw3IEBACiAgICAgICA8dW5pdCBpZD0ib3JnLnNsZjRqLmJpbmRpbmcuc2ltcGxlLnNvdXJjZSIgdmVyc2lvbj0iMS43LjMwLnYyMDIwMDIwNC0yMTUwIi8+CiAgICAgICA8dW5pdCBpZD0ib3JnLnR1a2FhbmkueHoiIHZlcnNpb249IjEuOS4wLnYyMDIxMDYyNC0xMjU5Ii8+CiAgICAgICA8dW5pdCBpZD0ib3JnLnR1a2FhbmkueHouc291cmNlIiB2ZXJzaW9uPSIxLjkuMC52MjAyMTA2MjQtMTI1OSIvPgotICAgICAgPHJlcG9zaXRvcnkgbG9jYXRpb249Imh0dHBzOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvdG9vbHMvb3JiaXQvZG93bmxvYWRzL2Ryb3BzL1IyMDIxMTIxMzE3MzgxMy9yZXBvc2l0b3J5Ii8+CisgICAgICA8cmVwb3NpdG9yeSBsb2NhdGlvbj0iaHR0cHM6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy90b29scy9vcmJpdC9kb3dubG9hZHMvZHJvcHMvUjIwMjIwMzAyMTcyMjMzL3JlcG9zaXRvcnkiLz4KICAgICA8L2xvY2F0aW9uPgogICAgIDxsb2NhdGlvbiBpbmNsdWRlTW9kZT0ic2xpY2VyIiBpbmNsdWRlQWxsUGxhdGZvcm1zPSJmYWxzZSIgaW5jbHVkZVNvdXJjZT0idHJ1ZSIgaW5jbHVkZUNvbmZpZ3VyZVBoYXNlPSJ0cnVlIiB0eXBlPSJJbnN0YWxsYWJsZVVuaXQiPgogICAgICAgPHVuaXQgaWQ9Im9yZy5lY2xpcHNlLm9zZ2kiIHZlcnNpb249IjAuMC4wIi8+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9qZ2l0LTQuMjAudHBkIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvamdpdC00LjIwLnRwZAppbmRleCAzM2FkYjcyLi4xMjBlZTY0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9qZ2l0LTQuMjAudHBkCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L2pnaXQtNC4yMC50cGQKQEAgLTEsNyArMSw3IEBACiB0YXJnZXQgImpnaXQtNC4yMCIgd2l0aCBzb3VyY2UgY29uZmlndXJlUGhhc2UKIAogaW5jbHVkZSAicHJvamVjdHMvamV0dHktMTAuMC54LnRwZCIKLWluY2x1ZGUgIm9yYml0L1IyMDIxMTIxMzE3MzgxMy0yMDIxLTEyLnRwZCIKK2luY2x1ZGUgIm9yYml0L1IyMDIyMDMwMjE3MjIzMy0yMDIyLTAzLnRwZCIKIAogbG9jYXRpb24gImh0dHBzOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvcmVsZWFzZXMvMjAyMS0wNi8iIHsKIAlvcmcuZWNsaXBzZS5vc2dpIGxhenkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L2pnaXQtNC4yMS50YXJnZXQgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9qZ2l0LTQuMjEudGFyZ2V0CmluZGV4IDA3ZGUxYWYuLjdlOGNkOTEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L2pnaXQtNC4yMS50YXJnZXQKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvamdpdC00LjIxLnRhcmdldApAQCAtMSw3ICsxLDcgQEAKIDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/PgogPD9wZGU/PgogPCEtLSBnZW5lcmF0ZWQgd2l0aCBodHRwczovL2dpdGh1Yi5jb20vZWNsaXBzZS1jYmkvdGFyZ2V0cGxhdGZvcm0tZHNsIC0tPgotPHRhcmdldCBuYW1lPSJqZ2l0LTQuMjEiIHNlcXVlbmNlTnVtYmVyPSIxNjQxMzk0MTcwIj4KKzx0YXJnZXQgbmFtZT0iamdpdC00LjIxIiBzZXF1ZW5jZU51bWJlcj0iMTY0NjI1NjY1MyI+CiAgIDxsb2NhdGlvbnM+CiAgICAgPGxvY2F0aW9uIGluY2x1ZGVNb2RlPSJzbGljZXIiIGluY2x1ZGVBbGxQbGF0Zm9ybXM9ImZhbHNlIiBpbmNsdWRlU291cmNlPSJ0cnVlIiBpbmNsdWRlQ29uZmlndXJlUGhhc2U9InRydWUiIHR5cGU9Ikluc3RhbGxhYmxlVW5pdCI+CiAgICAgICA8dW5pdCBpZD0iamFrYXJ0YS5zZXJ2bGV0LWFwaSIgdmVyc2lvbj0iNC4wLjAiLz4KQEAgLTIzLDggKzIzLDggQEAKICAgICAgIDxyZXBvc2l0b3J5IGlkPSJqZXR0eS0xMC4wLngiIGxvY2F0aW9uPSJodHRwczovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL2VjbGlwc2UvamV0dHkvMTAuMC42LyIvPgogICAgIDwvbG9jYXRpb24+CiAgICAgPGxvY2F0aW9uIGluY2x1ZGVNb2RlPSJzbGljZXIiIGluY2x1ZGVBbGxQbGF0Zm9ybXM9ImZhbHNlIiBpbmNsdWRlU291cmNlPSJ0cnVlIiBpbmNsdWRlQ29uZmlndXJlUGhhc2U9InRydWUiIHR5cGU9Ikluc3RhbGxhYmxlVW5pdCI+Ci0gICAgICA8dW5pdCBpZD0iY29tLmdvb2dsZS5nc29uIiB2ZXJzaW9uPSIyLjguOC52MjAyMTEwMjktMDgzOCIvPgotICAgICAgPHVuaXQgaWQ9ImNvbS5nb29nbGUuZ3Nvbi5zb3VyY2UiIHZlcnNpb249IjIuOC44LnYyMDIxMTAyOS0wODM4Ii8+CisgICAgICA8dW5pdCBpZD0iY29tLmdvb2dsZS5nc29uIiB2ZXJzaW9uPSIyLjguOS52MjAyMjAxMTEtMTQwOSIvPgorICAgICAgPHVuaXQgaWQ9ImNvbS5nb29nbGUuZ3Nvbi5zb3VyY2UiIHZlcnNpb249IjIuOC45LnYyMDIyMDExMS0xNDA5Ii8+CiAgICAgICA8dW5pdCBpZD0iY29tLmpjcmFmdC5qc2NoIiB2ZXJzaW9uPSIwLjEuNTUudjIwMTkwNDA0LTE5MDIiLz4KICAgICAgIDx1bml0IGlkPSJjb20uamNyYWZ0LmpzY2guc291cmNlIiB2ZXJzaW9uPSIwLjEuNTUudjIwMTkwNDA0LTE5MDIiLz4KICAgICAgIDx1bml0IGlkPSJjb20uamNyYWZ0Lmp6bGliIiB2ZXJzaW9uPSIxLjEuMS52MjAxMjA1MTAyMzA1Ii8+CkBAIC01MSwyMiArNTEsMjIgQEAKICAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5zb3VyY2UiIHZlcnNpb249IjEuMi4wLnYyMDE4MDQwOS0xNTAyIi8+CiAgICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5odHRwY29tcG9uZW50cy5odHRwY2xpZW50IiB2ZXJzaW9uPSI0LjUuMTMudjIwMjEwMTI4LTIyMjUiLz4KICAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLmh0dHBjb21wb25lbnRzLmh0dHBjbGllbnQuc291cmNlIiB2ZXJzaW9uPSI0LjUuMTMudjIwMjEwMTI4LTIyMjUiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLmh0dHBjb21wb25lbnRzLmh0dHBjb3JlIiB2ZXJzaW9uPSI0LjQuMTQudjIwMjEwMTI4LTIyMjUiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLmh0dHBjb21wb25lbnRzLmh0dHBjb3JlLnNvdXJjZSIgdmVyc2lvbj0iNC40LjE0LnYyMDIxMDEyOC0yMjI1Ii8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5zc2hkLm9zZ2kiIHZlcnNpb249IjIuNy4wLnYyMDIxMDYyMy0wNjE4Ii8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5zc2hkLm9zZ2kuc291cmNlIiB2ZXJzaW9uPSIyLjcuMC52MjAyMTA2MjMtMDYxOCIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuc3NoZC5zZnRwIiB2ZXJzaW9uPSIyLjcuMC52MjAyMTA2MjMtMDYxOCIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuc3NoZC5zZnRwLnNvdXJjZSIgdmVyc2lvbj0iMi43LjAudjIwMjEwNjIzLTA2MTgiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLmh0dHBjb21wb25lbnRzLmh0dHBjb3JlIiB2ZXJzaW9uPSI0LjQuMTUudjIwMjIwMjA5LTIzNDUiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLmh0dHBjb21wb25lbnRzLmh0dHBjb3JlLnNvdXJjZSIgdmVyc2lvbj0iNC40LjE1LnYyMDIyMDIwOS0yMzQ1Ii8+CisgICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5zc2hkLm9zZ2kiIHZlcnNpb249IjIuOC4wLnYyMDIxMTIyNy0xNzUwIi8+CisgICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5zc2hkLm9zZ2kuc291cmNlIiB2ZXJzaW9uPSIyLjguMC52MjAyMTEyMjctMTc1MCIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuc3NoZC5zZnRwIiB2ZXJzaW9uPSIyLjguMC52MjAyMTEyMjctMTc1MCIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuc3NoZC5zZnRwLnNvdXJjZSIgdmVyc2lvbj0iMi44LjAudjIwMjExMjI3LTE3NTAiLz4KICAgICAgIDx1bml0IGlkPSJvcmcuYXNzZXJ0aiIgdmVyc2lvbj0iMy4yMC4yLnYyMDIxMDcwNi0xMTA0Ii8+CiAgICAgICA8dW5pdCBpZD0ib3JnLmFzc2VydGouc291cmNlIiB2ZXJzaW9uPSIzLjIwLjIudjIwMjEwNzA2LTExMDQiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjcGciIHZlcnNpb249IjEuNjkuMC52MjAyMTA3MTMtMTkyNCIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmNwZy5zb3VyY2UiIHZlcnNpb249IjEuNjkuMC52MjAyMTA3MTMtMTkyNCIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmNwa2l4IiB2ZXJzaW9uPSIxLjY5LjAudjIwMjEwNzEzLTE5MjQiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjcGtpeC5zb3VyY2UiIHZlcnNpb249IjEuNjkuMC52MjAyMTA3MTMtMTkyNCIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmNwcm92IiB2ZXJzaW9uPSIxLjY5LjAudjIwMjEwOTIzLTE0MDEiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjcHJvdi5zb3VyY2UiIHZlcnNpb249IjEuNjkuMC52MjAyMTA5MjMtMTQwMSIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmN1dGlsIiB2ZXJzaW9uPSIxLjY5LjAudjIwMjEwNzEzLTE5MjQiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjdXRpbC5zb3VyY2UiIHZlcnNpb249IjEuNjkuMC52MjAyMTA3MTMtMTkyNCIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmNwZyIgdmVyc2lvbj0iMS43MC4wLnYyMDIyMDEwNS0xNTIyIi8+CisgICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3BnLnNvdXJjZSIgdmVyc2lvbj0iMS43MC4wLnYyMDIyMDEwNS0xNTIyIi8+CisgICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3BraXgiIHZlcnNpb249IjEuNzAuMC52MjAyMjAxMDUtMTUyMiIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmNwa2l4LnNvdXJjZSIgdmVyc2lvbj0iMS43MC4wLnYyMDIyMDEwNS0xNTIyIi8+CisgICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3Byb3YiIHZlcnNpb249IjEuNzAuMC52MjAyMjAxMDUtMTUyMiIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmNwcm92LnNvdXJjZSIgdmVyc2lvbj0iMS43MC4wLnYyMDIyMDEwNS0xNTIyIi8+CisgICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3V0aWwiIHZlcnNpb249IjEuNzAuMC52MjAyMjAxMDUtMTUyMiIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmN1dGlsLnNvdXJjZSIgdmVyc2lvbj0iMS43MC4wLnYyMDIyMDEwNS0xNTIyIi8+CiAgICAgICA8dW5pdCBpZD0ib3JnLmhhbWNyZXN0IiB2ZXJzaW9uPSIyLjIuMC52MjAyMTA3MTEtMDgyMSIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy5oYW1jcmVzdC5zb3VyY2UiIHZlcnNpb249IjIuMi4wLnYyMDIxMDcxMS0wODIxIi8+CiAgICAgICA8dW5pdCBpZD0ib3JnLmhhbWNyZXN0LmNvcmUiIHZlcnNpb249IjEuMy4wLnYyMDE4MDQyMC0xNTE5Ii8+CkBAIC04Nyw3ICs4Nyw3IEBACiAgICAgICA8dW5pdCBpZD0ib3JnLnNsZjRqLmJpbmRpbmcuc2ltcGxlLnNvdXJjZSIgdmVyc2lvbj0iMS43LjMwLnYyMDIwMDIwNC0yMTUwIi8+CiAgICAgICA8dW5pdCBpZD0ib3JnLnR1a2FhbmkueHoiIHZlcnNpb249IjEuOS4wLnYyMDIxMDYyNC0xMjU5Ii8+CiAgICAgICA8dW5pdCBpZD0ib3JnLnR1a2FhbmkueHouc291cmNlIiB2ZXJzaW9uPSIxLjkuMC52MjAyMTA2MjQtMTI1OSIvPgotICAgICAgPHJlcG9zaXRvcnkgbG9jYXRpb249Imh0dHBzOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvdG9vbHMvb3JiaXQvZG93bmxvYWRzL2Ryb3BzL1IyMDIxMTIxMzE3MzgxMy9yZXBvc2l0b3J5Ii8+CisgICAgICA8cmVwb3NpdG9yeSBsb2NhdGlvbj0iaHR0cHM6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy90b29scy9vcmJpdC9kb3dubG9hZHMvZHJvcHMvUjIwMjIwMzAyMTcyMjMzL3JlcG9zaXRvcnkiLz4KICAgICA8L2xvY2F0aW9uPgogICAgIDxsb2NhdGlvbiBpbmNsdWRlTW9kZT0ic2xpY2VyIiBpbmNsdWRlQWxsUGxhdGZvcm1zPSJmYWxzZSIgaW5jbHVkZVNvdXJjZT0idHJ1ZSIgaW5jbHVkZUNvbmZpZ3VyZVBoYXNlPSJ0cnVlIiB0eXBlPSJJbnN0YWxsYWJsZVVuaXQiPgogICAgICAgPHVuaXQgaWQ9Im9yZy5lY2xpcHNlLm9zZ2kiIHZlcnNpb249IjAuMC4wIi8+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9qZ2l0LTQuMjEudHBkIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvamdpdC00LjIxLnRwZAppbmRleCBhZGY2MmQ1Li4wZWMyYTUyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9qZ2l0LTQuMjEudHBkCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L2pnaXQtNC4yMS50cGQKQEAgLTEsNyArMSw3IEBACiB0YXJnZXQgImpnaXQtNC4yMSIgd2l0aCBzb3VyY2UgY29uZmlndXJlUGhhc2UKIAogaW5jbHVkZSAicHJvamVjdHMvamV0dHktMTAuMC54LnRwZCIKLWluY2x1ZGUgIm9yYml0L1IyMDIxMTIxMzE3MzgxMy0yMDIxLTEyLnRwZCIKK2luY2x1ZGUgIm9yYml0L1IyMDIyMDMwMjE3MjIzMy0yMDIyLTAzLnRwZCIKIAogbG9jYXRpb24gImh0dHBzOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvcmVsZWFzZXMvMjAyMS0wOS8iIHsKIAlvcmcuZWNsaXBzZS5vc2dpIGxhenkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L2pnaXQtNC4yMi50YXJnZXQgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9qZ2l0LTQuMjIudGFyZ2V0CmluZGV4IDk3YjVmYjYuLmIyMjlkYTEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L2pnaXQtNC4yMi50YXJnZXQKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvamdpdC00LjIyLnRhcmdldApAQCAtMSw3ICsxLDcgQEAKIDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/PgogPD9wZGU/PgogPCEtLSBnZW5lcmF0ZWQgd2l0aCBodHRwczovL2dpdGh1Yi5jb20vZWNsaXBzZS1jYmkvdGFyZ2V0cGxhdGZvcm0tZHNsIC0tPgotPHRhcmdldCBuYW1lPSJqZ2l0LTQuMjIiIHNlcXVlbmNlTnVtYmVyPSIxNjQxMzk0MTc3Ij4KKzx0YXJnZXQgbmFtZT0iamdpdC00LjIyIiBzZXF1ZW5jZU51bWJlcj0iMTY0NjI1NjY1MyI+CiAgIDxsb2NhdGlvbnM+CiAgICAgPGxvY2F0aW9uIGluY2x1ZGVNb2RlPSJzbGljZXIiIGluY2x1ZGVBbGxQbGF0Zm9ybXM9ImZhbHNlIiBpbmNsdWRlU291cmNlPSJ0cnVlIiBpbmNsdWRlQ29uZmlndXJlUGhhc2U9InRydWUiIHR5cGU9Ikluc3RhbGxhYmxlVW5pdCI+CiAgICAgICA8dW5pdCBpZD0iamFrYXJ0YS5zZXJ2bGV0LWFwaSIgdmVyc2lvbj0iNC4wLjAiLz4KQEAgLTIzLDggKzIzLDggQEAKICAgICAgIDxyZXBvc2l0b3J5IGlkPSJqZXR0eS0xMC4wLngiIGxvY2F0aW9uPSJodHRwczovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL2VjbGlwc2UvamV0dHkvMTAuMC42LyIvPgogICAgIDwvbG9jYXRpb24+CiAgICAgPGxvY2F0aW9uIGluY2x1ZGVNb2RlPSJzbGljZXIiIGluY2x1ZGVBbGxQbGF0Zm9ybXM9ImZhbHNlIiBpbmNsdWRlU291cmNlPSJ0cnVlIiBpbmNsdWRlQ29uZmlndXJlUGhhc2U9InRydWUiIHR5cGU9Ikluc3RhbGxhYmxlVW5pdCI+Ci0gICAgICA8dW5pdCBpZD0iY29tLmdvb2dsZS5nc29uIiB2ZXJzaW9uPSIyLjguOC52MjAyMTEwMjktMDgzOCIvPgotICAgICAgPHVuaXQgaWQ9ImNvbS5nb29nbGUuZ3Nvbi5zb3VyY2UiIHZlcnNpb249IjIuOC44LnYyMDIxMTAyOS0wODM4Ii8+CisgICAgICA8dW5pdCBpZD0iY29tLmdvb2dsZS5nc29uIiB2ZXJzaW9uPSIyLjguOS52MjAyMjAxMTEtMTQwOSIvPgorICAgICAgPHVuaXQgaWQ9ImNvbS5nb29nbGUuZ3Nvbi5zb3VyY2UiIHZlcnNpb249IjIuOC45LnYyMDIyMDExMS0xNDA5Ii8+CiAgICAgICA8dW5pdCBpZD0iY29tLmpjcmFmdC5qc2NoIiB2ZXJzaW9uPSIwLjEuNTUudjIwMTkwNDA0LTE5MDIiLz4KICAgICAgIDx1bml0IGlkPSJjb20uamNyYWZ0LmpzY2guc291cmNlIiB2ZXJzaW9uPSIwLjEuNTUudjIwMTkwNDA0LTE5MDIiLz4KICAgICAgIDx1bml0IGlkPSJjb20uamNyYWZ0Lmp6bGliIiB2ZXJzaW9uPSIxLjEuMS52MjAxMjA1MTAyMzA1Ii8+CkBAIC01MSwyMiArNTEsMjIgQEAKICAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5zb3VyY2UiIHZlcnNpb249IjEuMi4wLnYyMDE4MDQwOS0xNTAyIi8+CiAgICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5odHRwY29tcG9uZW50cy5odHRwY2xpZW50IiB2ZXJzaW9uPSI0LjUuMTMudjIwMjEwMTI4LTIyMjUiLz4KICAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLmh0dHBjb21wb25lbnRzLmh0dHBjbGllbnQuc291cmNlIiB2ZXJzaW9uPSI0LjUuMTMudjIwMjEwMTI4LTIyMjUiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLmh0dHBjb21wb25lbnRzLmh0dHBjb3JlIiB2ZXJzaW9uPSI0LjQuMTQudjIwMjEwMTI4LTIyMjUiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLmh0dHBjb21wb25lbnRzLmh0dHBjb3JlLnNvdXJjZSIgdmVyc2lvbj0iNC40LjE0LnYyMDIxMDEyOC0yMjI1Ii8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5zc2hkLm9zZ2kiIHZlcnNpb249IjIuNy4wLnYyMDIxMDYyMy0wNjE4Ii8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5zc2hkLm9zZ2kuc291cmNlIiB2ZXJzaW9uPSIyLjcuMC52MjAyMTA2MjMtMDYxOCIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuc3NoZC5zZnRwIiB2ZXJzaW9uPSIyLjcuMC52MjAyMTA2MjMtMDYxOCIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuc3NoZC5zZnRwLnNvdXJjZSIgdmVyc2lvbj0iMi43LjAudjIwMjEwNjIzLTA2MTgiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLmh0dHBjb21wb25lbnRzLmh0dHBjb3JlIiB2ZXJzaW9uPSI0LjQuMTUudjIwMjIwMjA5LTIzNDUiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLmh0dHBjb21wb25lbnRzLmh0dHBjb3JlLnNvdXJjZSIgdmVyc2lvbj0iNC40LjE1LnYyMDIyMDIwOS0yMzQ1Ii8+CisgICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5zc2hkLm9zZ2kiIHZlcnNpb249IjIuOC4wLnYyMDIxMTIyNy0xNzUwIi8+CisgICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5zc2hkLm9zZ2kuc291cmNlIiB2ZXJzaW9uPSIyLjguMC52MjAyMTEyMjctMTc1MCIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuc3NoZC5zZnRwIiB2ZXJzaW9uPSIyLjguMC52MjAyMTEyMjctMTc1MCIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuc3NoZC5zZnRwLnNvdXJjZSIgdmVyc2lvbj0iMi44LjAudjIwMjExMjI3LTE3NTAiLz4KICAgICAgIDx1bml0IGlkPSJvcmcuYXNzZXJ0aiIgdmVyc2lvbj0iMy4yMC4yLnYyMDIxMDcwNi0xMTA0Ii8+CiAgICAgICA8dW5pdCBpZD0ib3JnLmFzc2VydGouc291cmNlIiB2ZXJzaW9uPSIzLjIwLjIudjIwMjEwNzA2LTExMDQiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjcGciIHZlcnNpb249IjEuNjkuMC52MjAyMTA3MTMtMTkyNCIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmNwZy5zb3VyY2UiIHZlcnNpb249IjEuNjkuMC52MjAyMTA3MTMtMTkyNCIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmNwa2l4IiB2ZXJzaW9uPSIxLjY5LjAudjIwMjEwNzEzLTE5MjQiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjcGtpeC5zb3VyY2UiIHZlcnNpb249IjEuNjkuMC52MjAyMTA3MTMtMTkyNCIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmNwcm92IiB2ZXJzaW9uPSIxLjY5LjAudjIwMjEwOTIzLTE0MDEiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjcHJvdi5zb3VyY2UiIHZlcnNpb249IjEuNjkuMC52MjAyMTA5MjMtMTQwMSIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmN1dGlsIiB2ZXJzaW9uPSIxLjY5LjAudjIwMjEwNzEzLTE5MjQiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjdXRpbC5zb3VyY2UiIHZlcnNpb249IjEuNjkuMC52MjAyMTA3MTMtMTkyNCIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmNwZyIgdmVyc2lvbj0iMS43MC4wLnYyMDIyMDEwNS0xNTIyIi8+CisgICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3BnLnNvdXJjZSIgdmVyc2lvbj0iMS43MC4wLnYyMDIyMDEwNS0xNTIyIi8+CisgICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3BraXgiIHZlcnNpb249IjEuNzAuMC52MjAyMjAxMDUtMTUyMiIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmNwa2l4LnNvdXJjZSIgdmVyc2lvbj0iMS43MC4wLnYyMDIyMDEwNS0xNTIyIi8+CisgICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3Byb3YiIHZlcnNpb249IjEuNzAuMC52MjAyMjAxMDUtMTUyMiIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmNwcm92LnNvdXJjZSIgdmVyc2lvbj0iMS43MC4wLnYyMDIyMDEwNS0xNTIyIi8+CisgICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3V0aWwiIHZlcnNpb249IjEuNzAuMC52MjAyMjAxMDUtMTUyMiIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmN1dGlsLnNvdXJjZSIgdmVyc2lvbj0iMS43MC4wLnYyMDIyMDEwNS0xNTIyIi8+CiAgICAgICA8dW5pdCBpZD0ib3JnLmhhbWNyZXN0IiB2ZXJzaW9uPSIyLjIuMC52MjAyMTA3MTEtMDgyMSIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy5oYW1jcmVzdC5zb3VyY2UiIHZlcnNpb249IjIuMi4wLnYyMDIxMDcxMS0wODIxIi8+CiAgICAgICA8dW5pdCBpZD0ib3JnLmhhbWNyZXN0LmNvcmUiIHZlcnNpb249IjEuMy4wLnYyMDE4MDQyMC0xNTE5Ii8+CkBAIC04Nyw3ICs4Nyw3IEBACiAgICAgICA8dW5pdCBpZD0ib3JnLnNsZjRqLmJpbmRpbmcuc2ltcGxlLnNvdXJjZSIgdmVyc2lvbj0iMS43LjMwLnYyMDIwMDIwNC0yMTUwIi8+CiAgICAgICA8dW5pdCBpZD0ib3JnLnR1a2FhbmkueHoiIHZlcnNpb249IjEuOS4wLnYyMDIxMDYyNC0xMjU5Ii8+CiAgICAgICA8dW5pdCBpZD0ib3JnLnR1a2FhbmkueHouc291cmNlIiB2ZXJzaW9uPSIxLjkuMC52MjAyMTA2MjQtMTI1OSIvPgotICAgICAgPHJlcG9zaXRvcnkgbG9jYXRpb249Imh0dHBzOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvdG9vbHMvb3JiaXQvZG93bmxvYWRzL2Ryb3BzL1IyMDIxMTIxMzE3MzgxMy9yZXBvc2l0b3J5Ii8+CisgICAgICA8cmVwb3NpdG9yeSBsb2NhdGlvbj0iaHR0cHM6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy90b29scy9vcmJpdC9kb3dubG9hZHMvZHJvcHMvUjIwMjIwMzAyMTcyMjMzL3JlcG9zaXRvcnkiLz4KICAgICA8L2xvY2F0aW9uPgogICAgIDxsb2NhdGlvbiBpbmNsdWRlTW9kZT0ic2xpY2VyIiBpbmNsdWRlQWxsUGxhdGZvcm1zPSJmYWxzZSIgaW5jbHVkZVNvdXJjZT0idHJ1ZSIgaW5jbHVkZUNvbmZpZ3VyZVBoYXNlPSJ0cnVlIiB0eXBlPSJJbnN0YWxsYWJsZVVuaXQiPgogICAgICAgPHVuaXQgaWQ9Im9yZy5lY2xpcHNlLm9zZ2kiIHZlcnNpb249IjAuMC4wIi8+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9qZ2l0LTQuMjIudHBkIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvamdpdC00LjIyLnRwZAppbmRleCAzN2M5M2E3Li5lYjE3MjNjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9qZ2l0LTQuMjIudHBkCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L2pnaXQtNC4yMi50cGQKQEAgLTEsNyArMSw3IEBACiB0YXJnZXQgImpnaXQtNC4yMiIgd2l0aCBzb3VyY2UgY29uZmlndXJlUGhhc2UKIAogaW5jbHVkZSAicHJvamVjdHMvamV0dHktMTAuMC54LnRwZCIKLWluY2x1ZGUgIm9yYml0L1IyMDIxMTIxMzE3MzgxMy0yMDIxLTEyLnRwZCIKK2luY2x1ZGUgIm9yYml0L1IyMDIyMDMwMjE3MjIzMy0yMDIyLTAzLnRwZCIKIAogbG9jYXRpb24gImh0dHBzOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvcmVsZWFzZXMvMjAyMS0xMi8iIHsKIAlvcmcuZWNsaXBzZS5vc2dpIGxhenkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L29yYml0L1IyMDIyMDMwMjE3MjIzMy0yMDIyLTAzLnRwZCBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L29yYml0L1IyMDIyMDMwMjE3MjIzMy0yMDIyLTAzLnRwZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWZjNjg5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvb3JiaXQvUjIwMjIwMzAyMTcyMjMzLTIwMjItMDMudHBkCkBAIC0wLDAgKzEsNjkgQEAKK3RhcmdldCAiUjIwMjIwMzAyMTcyMjMzIiB3aXRoIHNvdXJjZSBjb25maWd1cmVQaGFzZQorLy8gc2VlIGh0dHBzOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvdG9vbHMvb3JiaXQvZG93bmxvYWRzLworCitsb2NhdGlvbiAiaHR0cHM6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy90b29scy9vcmJpdC9kb3dubG9hZHMvZHJvcHMvUjIwMjIwMzAyMTcyMjMzL3JlcG9zaXRvcnkiIHsKKwljb20uZ29vZ2xlLmdzb24gWzIuOC45LnYyMDIyMDExMS0xNDA5LDIuOC45LnYyMDIyMDExMS0xNDA5XQorCWNvbS5nb29nbGUuZ3Nvbi5zb3VyY2UgWzIuOC45LnYyMDIyMDExMS0xNDA5LDIuOC45LnYyMDIyMDExMS0xNDA5XQorCWNvbS5qY3JhZnQuanNjaCBbMC4xLjU1LnYyMDE5MDQwNC0xOTAyLDAuMS41NS52MjAxOTA0MDQtMTkwMl0KKwljb20uamNyYWZ0LmpzY2guc291cmNlIFswLjEuNTUudjIwMTkwNDA0LTE5MDIsMC4xLjU1LnYyMDE5MDQwNC0xOTAyXQorCWNvbS5qY3JhZnQuanpsaWIgWzEuMS4xLnYyMDEyMDUxMDIzMDUsMS4xLjEudjIwMTIwNTEwMjMwNV0KKwljb20uamNyYWZ0Lmp6bGliLnNvdXJjZSBbMS4xLjEudjIwMTIwNTEwMjMwNSwxLjEuMS52MjAxMjA1MTAyMzA1XQorCWNvbS5zdW4uam5hIFs1LjguMC52MjAyMTA1MDMtMDM0Myw1LjguMC52MjAyMTA1MDMtMDM0M10KKwljb20uc3VuLmpuYS5zb3VyY2UgWzUuOC4wLnYyMDIxMDUwMy0wMzQzLDUuOC4wLnYyMDIxMDUwMy0wMzQzXQorCWNvbS5zdW4uam5hLnBsYXRmb3JtIFs1LjguMC52MjAyMTA0MDYtMTAwNCw1LjguMC52MjAyMTA0MDYtMTAwNF0KKwljb20uc3VuLmpuYS5wbGF0Zm9ybS5zb3VyY2UgWzUuOC4wLnYyMDIxMDQwNi0xMDA0LDUuOC4wLnYyMDIxMDQwNi0xMDA0XQorCWphdmFld2FoIFsxLjEuMTMudjIwMjExMDI5LTA4MzksMS4xLjEzLnYyMDIxMTAyOS0wODM5XQorCWphdmFld2FoLnNvdXJjZSBbMS4xLjEzLnYyMDIxMTAyOS0wODM5LDEuMS4xMy52MjAyMTEwMjktMDgzOV0KKwluZXQuYnl0ZWJ1ZGR5LmJ5dGUtYnVkZHkgWzEuOS4wLnYyMDE4MTEwNy0xNDEwLDEuOS4wLnYyMDE4MTEwNy0xNDEwXQorCW5ldC5ieXRlYnVkZHkuYnl0ZS1idWRkeS1hZ2VudCBbMS45LjAudjIwMTgxMTA2LTE1MzQsMS45LjAudjIwMTgxMTA2LTE1MzRdCisJbmV0LmJ5dGVidWRkeS5ieXRlLWJ1ZGR5LWFnZW50LnNvdXJjZSBbMS45LjAudjIwMTgxMTA2LTE1MzQsMS45LjAudjIwMTgxMTA2LTE1MzRdCisJbmV0LmJ5dGVidWRkeS5ieXRlLWJ1ZGR5LnNvdXJjZSBbMS45LjAudjIwMTgxMTA3LTE0MTAsMS45LjAudjIwMTgxMTA3LTE0MTBdCisJbmV0LmkycC5jcnlwdG8uZWRkc2EgWzAuMy4wLnYyMDIxMDkyMy0xNDAxLDAuMy4wLnYyMDIxMDkyMy0xNDAxXQorCW5ldC5pMnAuY3J5cHRvLmVkZHNhLnNvdXJjZSBbMC4zLjAudjIwMjEwOTIzLTE0MDEsMC4zLjAudjIwMjEwOTIzLTE0MDFdCisJb3JnLmFwYWNoZS5hbnQgWzEuMTAuMTIudjIwMjExMTAyLTE0NTIsMS4xMC4xMi52MjAyMTExMDItMTQ1Ml0KKwlvcmcuYXBhY2hlLmFudC5zb3VyY2UgWzEuMTAuMTIudjIwMjExMTAyLTE0NTIsMS4xMC4xMi52MjAyMTExMDItMTQ1Ml0KKwlvcmcuYXBhY2hlLmNvbW1vbnMuY29kZWMgWzEuMTQuMC52MjAyMDA4MTgtMTQyMiwxLjE0LjAudjIwMjAwODE4LTE0MjJdCisJb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjLnNvdXJjZSBbMS4xNC4wLnYyMDIwMDgxOC0xNDIyLDEuMTQuMC52MjAyMDA4MTgtMTQyMl0KKwlvcmcuYXBhY2hlLmNvbW1vbnMuY29tcHJlc3MgWzEuMjEuMC52MjAyMTExMDMtMjEwMCwxLjIxLjAudjIwMjExMTAzLTIxMDBdCisJb3JnLmFwYWNoZS5jb21tb25zLmNvbXByZXNzLnNvdXJjZSBbMS4yMS4wLnYyMDIxMTEwMy0yMTAwLDEuMjEuMC52MjAyMTExMDMtMjEwMF0KKwlvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZyBbMS4yLjAudjIwMTgwNDA5LTE1MDIsMS4yLjAudjIwMTgwNDA5LTE1MDJdCisJb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuc291cmNlIFsxLjIuMC52MjAxODA0MDktMTUwMiwxLjIuMC52MjAxODA0MDktMTUwMl0KKwlvcmcuYXBhY2hlLmh0dHBjb21wb25lbnRzLmh0dHBjbGllbnQgWzQuNS4xMy52MjAyMTAxMjgtMjIyNSw0LjUuMTMudjIwMjEwMTI4LTIyMjVdCisJb3JnLmFwYWNoZS5odHRwY29tcG9uZW50cy5odHRwY2xpZW50LnNvdXJjZSBbNC41LjEzLnYyMDIxMDEyOC0yMjI1LDQuNS4xMy52MjAyMTAxMjgtMjIyNV0KKwlvcmcuYXBhY2hlLmh0dHBjb21wb25lbnRzLmh0dHBjb3JlIFs0LjQuMTUudjIwMjIwMjA5LTIzNDUsNC40LjE1LnYyMDIyMDIwOS0yMzQ1XQorCW9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHMuaHR0cGNvcmUuc291cmNlIFs0LjQuMTUudjIwMjIwMjA5LTIzNDUsNC40LjE1LnYyMDIyMDIwOS0yMzQ1XQorCW9yZy5hcGFjaGUuc3NoZC5vc2dpIFsyLjguMC52MjAyMTEyMjctMTc1MCwyLjguMC52MjAyMTEyMjctMTc1MF0KKwlvcmcuYXBhY2hlLnNzaGQub3NnaS5zb3VyY2UgWzIuOC4wLnYyMDIxMTIyNy0xNzUwLDIuOC4wLnYyMDIxMTIyNy0xNzUwXQorCW9yZy5hcGFjaGUuc3NoZC5zZnRwIFsyLjguMC52MjAyMTEyMjctMTc1MCwyLjguMC52MjAyMTEyMjctMTc1MF0KKwlvcmcuYXBhY2hlLnNzaGQuc2Z0cC5zb3VyY2UgWzIuOC4wLnYyMDIxMTIyNy0xNzUwLDIuOC4wLnYyMDIxMTIyNy0xNzUwXQorCW9yZy5hc3NlcnRqIFszLjIwLjIudjIwMjEwNzA2LTExMDQsMy4yMC4yLnYyMDIxMDcwNi0xMTA0XQorCW9yZy5hc3NlcnRqLnNvdXJjZSBbMy4yMC4yLnYyMDIxMDcwNi0xMTA0LDMuMjAuMi52MjAyMTA3MDYtMTEwNF0KKwlvcmcuYm91bmN5Y2FzdGxlLmJjcGcgWzEuNzAuMC52MjAyMjAxMDUtMTUyMiwxLjcwLjAudjIwMjIwMTA1LTE1MjJdCisJb3JnLmJvdW5jeWNhc3RsZS5iY3BnLnNvdXJjZSBbMS43MC4wLnYyMDIyMDEwNS0xNTIyLDEuNzAuMC52MjAyMjAxMDUtMTUyMl0KKwlvcmcuYm91bmN5Y2FzdGxlLmJjcGtpeCBbMS43MC4wLnYyMDIyMDEwNS0xNTIyLDEuNzAuMC52MjAyMjAxMDUtMTUyMl0KKwlvcmcuYm91bmN5Y2FzdGxlLmJjcGtpeC5zb3VyY2UgWzEuNzAuMC52MjAyMjAxMDUtMTUyMiwxLjcwLjAudjIwMjIwMTA1LTE1MjJdCisJb3JnLmJvdW5jeWNhc3RsZS5iY3Byb3YgWzEuNzAuMC52MjAyMjAxMDUtMTUyMiwxLjcwLjAudjIwMjIwMTA1LTE1MjJdCisJb3JnLmJvdW5jeWNhc3RsZS5iY3Byb3Yuc291cmNlIFsxLjcwLjAudjIwMjIwMTA1LTE1MjIsMS43MC4wLnYyMDIyMDEwNS0xNTIyXQorCW9yZy5ib3VuY3ljYXN0bGUuYmN1dGlsIFsxLjcwLjAudjIwMjIwMTA1LTE1MjIsMS43MC4wLnYyMDIyMDEwNS0xNTIyXQorCW9yZy5ib3VuY3ljYXN0bGUuYmN1dGlsLnNvdXJjZSBbMS43MC4wLnYyMDIyMDEwNS0xNTIyLDEuNzAuMC52MjAyMjAxMDUtMTUyMl0KKwlvcmcuaGFtY3Jlc3QgWzIuMi4wLnYyMDIxMDcxMS0wODIxLDIuMi4wLnYyMDIxMDcxMS0wODIxXQorCW9yZy5oYW1jcmVzdC5zb3VyY2UgWzIuMi4wLnYyMDIxMDcxMS0wODIxLDIuMi4wLnYyMDIxMDcxMS0wODIxXQorCW9yZy5oYW1jcmVzdC5jb3JlIFsxLjMuMC52MjAxODA0MjAtMTUxOSwxLjMuMC52MjAxODA0MjAtMTUxOV0KKwlvcmcuaGFtY3Jlc3QuY29yZS5zb3VyY2UgWzEuMy4wLnYyMDE4MDQyMC0xNTE5LDEuMy4wLnYyMDE4MDQyMC0xNTE5XQorCW9yZy5oYW1jcmVzdC5saWJyYXJ5IFsxLjMuMC52MjAxODA1MjQtMjI0NiwxLjMuMC52MjAxODA1MjQtMjI0Nl0KKwlvcmcuaGFtY3Jlc3QubGlicmFyeS5zb3VyY2UgWzEuMy4wLnYyMDE4MDUyNC0yMjQ2LDEuMy4wLnYyMDE4MDUyNC0yMjQ2XQorCW9yZy5qdW5pdCBbNC4xMy4yLnYyMDIxMTAxOC0xOTU2LDQuMTMuMi52MjAyMTEwMTgtMTk1Nl0KKwlvcmcuanVuaXQuc291cmNlIFs0LjEzLjIudjIwMjExMDE4LTE5NTYsNC4xMy4yLnYyMDIxMTAxOC0xOTU2XQorCW9yZy5rb2hzdWtlLmFyZ3M0aiBbMi4zMy4wLnYyMDE2MDMyMy0yMjE4LDIuMzMuMC52MjAxNjAzMjMtMjIxOF0KKwlvcmcua29oc3VrZS5hcmdzNGouc291cmNlIFsyLjMzLjAudjIwMTYwMzIzLTIyMTgsMi4zMy4wLnYyMDE2MDMyMy0yMjE4XQorCW9yZy5tb2NraXRvIFsyLjIzLjAudjIwMjAwMzEwLTE2NDIsMi4yMy4wLnYyMDIwMDMxMC0xNjQyXQorCW9yZy5tb2NraXRvLnNvdXJjZSBbMi4yMy4wLnYyMDIwMDMxMC0xNjQyLDIuMjMuMC52MjAyMDAzMTAtMTY0Ml0KKwlvcmcub2JqZW5lc2lzIFsyLjYuMC52MjAxODA0MjAtMTUxOSwyLjYuMC52MjAxODA0MjAtMTUxOV0KKwlvcmcub2JqZW5lc2lzLnNvdXJjZSBbMi42LjAudjIwMTgwNDIwLTE1MTksMi42LjAudjIwMTgwNDIwLTE1MTldCisJb3JnLnNsZjRqLmFwaSBbMS43LjMwLnYyMDIwMDIwNC0yMTUwLDEuNy4zMC52MjAyMDAyMDQtMjE1MF0KKwlvcmcuc2xmNGouYXBpLnNvdXJjZSBbMS43LjMwLnYyMDIwMDIwNC0yMTUwLDEuNy4zMC52MjAyMDAyMDQtMjE1MF0KKwlvcmcuc2xmNGouYmluZGluZy5zaW1wbGUgWzEuNy4zMC52MjAyMDAyMDQtMjE1MCwxLjcuMzAudjIwMjAwMjA0LTIxNTBdCisJb3JnLnNsZjRqLmJpbmRpbmcuc2ltcGxlLnNvdXJjZSBbMS43LjMwLnYyMDIwMDIwNC0yMTUwLDEuNy4zMC52MjAyMDAyMDQtMjE1MF0KKwlvcmcudHVrYWFuaS54eiBbMS45LjAudjIwMjEwNjI0LTEyNTksMS45LjAudjIwMjEwNjI0LTEyNTldCisJb3JnLnR1a2FhbmkueHouc291cmNlIFsxLjkuMC52MjAyMTA2MjQtMTI1OSwxLjkuMC52MjAyMTA2MjQtMTI1OV0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9wb20ueG1sCmluZGV4IDhiZWUxZmMuLjJhOTUwNDIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvcG9tLnhtbApAQCAtMTYsNyArMTYsNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+amdpdC50eWNoby5wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+Ni4wLjEtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+Ni4xLjEtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQudGFyZ2V0PC9hcnRpZmFjdElkPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvcG9tLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL3BvbS54bWwKaW5kZXggODBhNjRiZC4uYjY1MDU5OCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvcG9tLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9wb20ueG1sCkBAIC0xNiw3ICsxNiw3IEBACiAKICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgPGFydGlmYWN0SWQ+amdpdC50eWNoby5wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gIDx2ZXJzaW9uPjYuMC4xLVNOQVBTSE9UPC92ZXJzaW9uPgorICA8dmVyc2lvbj42LjEuMS1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KIAogICA8bmFtZT5KR2l0IFR5Y2hvIFBhcmVudDwvbmFtZT4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GCmluZGV4IGFmMDBiMGEuLmY1YzRkZTQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20udGVzdC9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMywyOCArMywzMCBAQAogQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZQogQXV0b21hdGljLU1vZHVsZS1OYW1lOiBvcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0CiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0Ci1CdW5kbGUtVmVyc2lvbjogNi4wLjEucXVhbGlmaWVyCitCdW5kbGUtVmVyc2lvbjogNi4xLjEucXVhbGlmaWVyCiBCdW5kbGUtVmVuZG9yOiAlQnVuZGxlLVZlbmRvcgogQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCiBCdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQogQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEphdmFTRS0xMQotSW1wb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpnaXQuYXBpO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9yczt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmRpZmY7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5kaXJjYWNoZTt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSI2LjAuMSIsCi0gb3JnLmVjbGlwc2UuamdpdC5qdW5pdDt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmxpYjt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lm1lcmdlO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQucGdtO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQucGdtLmludGVybmFsO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQucGdtLm9wdDt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGs7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQ7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsazt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC51dGlsLmlvO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAorSW1wb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpnaXQuYXBpO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9yczt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmRpZmY7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5kaXJjYWNoZTt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLmRpZmZtZXJnZXRvb2w7dmVyc2lvbj0iNi4xLjEiLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5maWxlO3ZlcnNpb249IjYuMS4xIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0O3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGliLmludGVybmFsO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubWVyZ2U7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5wZ207dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5wZ20uaW50ZXJuYWw7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5wZ20ub3B0O3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsazt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudXRpbDt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuaW87dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCiAgb3JnLmhhbWNyZXN0LmNvcmU7YnVuZGxlLXZlcnNpb249IlsyLjIuMCwzLjAuMCkiLAogIG9yZy5qdW5pdDt2ZXJzaW9uPSJbNC4xMyw1LjAuMCkiLAogIG9yZy5qdW5pdC5ydWxlczt2ZXJzaW9uPSJbNC4xMyw1LjAuMCkiLApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20udGVzdC9wb20ueG1sIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20udGVzdC9wb20ueG1sCmluZGV4IGNkMmJiNjMuLmM4MjQ3ODggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3QvcG9tLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0L3BvbS54bWwKQEAgLTE3LDcgKzE3LDcgQEAKICAgPHBhcmVudD4KICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0PC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjYuMC4xLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjYuMS4xLVNOQVBTSE9UPC92ZXJzaW9uPgogICA8L3BhcmVudD4KIAogICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0PC9hcnRpZmFjdElkPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20udGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9wZ20vRGVzY3JpYmVUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9EZXNjcmliZVRlc3QuamF2YQppbmRleCA0YmFkNzNiLi5jNzg1NDQzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9EZXNjcmliZVRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9EZXNjcmliZVRlc3QuamF2YQpAQCAtODksNiArODksMzEgQEAgcHVibGljIHZvaWQgdGVzdERlc2NyaWJlQ29tbWl0TWF0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAl9CiAKIAlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3REZXNjcmliZUNvbW1pdE1hdGNoQWJicmV2KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWluaXRpYWxDb21taXRBbmRUYWcoKTsKKwkJc2Vjb25kQ29tbWl0KCk7CisJCWFzc2VydEFycmF5RXF1YWxzKG5ldyBTdHJpbmdbXSB7ICJ2MS4wLTEtZzU2ZjZjZWJkZjNmNSIsICIiIH0sCisJCQkJZXhlY3V0ZSgiZ2l0IGRlc2NyaWJlIC0tYWJicmV2IDEyIC0tbWF0Y2ggdjEuKiIpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3REZXNjcmliZUNvbW1pdE1hdGNoQWJicmV2TWluKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWluaXRpYWxDb21taXRBbmRUYWcoKTsKKwkJc2Vjb25kQ29tbWl0KCk7CisJCWFzc2VydEFycmF5RXF1YWxzKG5ldyBTdHJpbmdbXSB7ICJ2MS4wLTEtZzU2ZjYiLCAiIiB9LAorCQkJCWV4ZWN1dGUoImdpdCBkZXNjcmliZSAtLWFiYnJldiAtNSAtLW1hdGNoIHYxLioiKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0RGVzY3JpYmVDb21taXRNYXRjaEFiYnJldk1heCgpIHRocm93cyBFeGNlcHRpb24geworCQlpbml0aWFsQ29tbWl0QW5kVGFnKCk7CisJCXNlY29uZENvbW1pdCgpOworCQlhc3NlcnRBcnJheUVxdWFscyhuZXcgU3RyaW5nW10geworCQkJCSJ2MS4wLTEtZzU2ZjZjZWJkZjNmNWNlZWVjZDgwMzM2NWFiZjA5OTZmYjFmYTAwNmQiLCAiIiB9LAorCQkJCWV4ZWN1dGUoImdpdCBkZXNjcmliZSAtLWFiYnJldiA1MCAtLW1hdGNoIHYxLioiKSk7CisJfQorCisJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0RGVzY3JpYmVDb21taXRNYXRjaDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJaW5pdGlhbENvbW1pdEFuZFRhZygpOwogCQlzZWNvbmRDb21taXQoKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGdtL0RpZmZUb29sVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20udGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9wZ20vRGlmZlRvb2xUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdiZjQ4NAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGdtL0RpZmZUb29sVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjA1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxLCBTaW1lb24gQW5kcmVldiA8c2ltZW9uLmRhbmFpbG92LmFuZHJlZXZAZ21haWwuY29tPiBhbmQgb3RoZXJzLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5wZ207CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5HaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5kaWZmLkRpZmZFbnRyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLmRpZmZtZXJnZXRvb2wuQ29tbWFuZExpbmVEaWZmVG9vbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5DTElSZXBvc2l0b3J5VGVzdENhc2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5wZ20ub3B0LkNtZExpbmVQYXJzZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5wZ20ub3B0LlN1YmNvbW1hbmRIYW5kbGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5SZXZDb21taXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5GaWxlVHJlZUl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuVHJlZVdhbGs7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcua29oc3VrZS5hcmdzNGouQXJndW1lbnQ7CisKKy8qKgorICogVGVzdGluZyB0aGUge0Bjb2RlIGRpZmZ0b29sfSBjb21tYW5kLgorICovCitwdWJsaWMgY2xhc3MgRGlmZlRvb2xUZXN0IGV4dGVuZHMgQ0xJUmVwb3NpdG9yeVRlc3RDYXNlIHsKKwlwdWJsaWMgc3RhdGljIGNsYXNzIEdpdENsaUpHaXRXcmFwcGVyUGFyc2VyIHsKKwkJQEFyZ3VtZW50KGluZGV4ID0gMCwgbWV0YVZhciA9ICJtZXRhVmFyX2NvbW1hbmQiLCByZXF1aXJlZCA9IHRydWUsIGhhbmRsZXIgPSBTdWJjb21tYW5kSGFuZGxlci5jbGFzcykKKwkJVGV4dEJ1aWx0aW4gc3ViY29tbWFuZDsKKworCQlAQXJndW1lbnQoaW5kZXggPSAxLCBtZXRhVmFyID0gIm1ldGFWYXJfYXJnIikKKwkJTGlzdDxTdHJpbmc+IGFyZ3VtZW50cyA9IG5ldyBBcnJheUxpc3Q8PigpOworCX0KKworCXByaXZhdGUgU3RyaW5nW10gcnVuQW5kQ2FwdHVyZVVzaW5nSW5pdFJhdyhTdHJpbmcuLi4gYXJncykKKwkJCXRocm93cyBFeGNlcHRpb24geworCQlDTElHaXRDb21tYW5kLlJlc3VsdCByZXN1bHQgPSBuZXcgQ0xJR2l0Q29tbWFuZC5SZXN1bHQoKTsKKworCQlHaXRDbGlKR2l0V3JhcHBlclBhcnNlciBiZWFuID0gbmV3IEdpdENsaUpHaXRXcmFwcGVyUGFyc2VyKCk7CisJCUNtZExpbmVQYXJzZXIgY2xwID0gbmV3IENtZExpbmVQYXJzZXIoYmVhbik7CisJCWNscC5wYXJzZUFyZ3VtZW50KGFyZ3MpOworCisJCVRleHRCdWlsdGluIGNtZCA9IGJlYW4uc3ViY29tbWFuZDsKKwkJY21kLmluaXRSYXcoZGIsIG51bGwsIG51bGwsIHJlc3VsdC5vdXQsIHJlc3VsdC5lcnIpOworCQljbWQuZXhlY3V0ZShiZWFuLmFyZ3VtZW50cy50b0FycmF5KG5ldyBTdHJpbmdbYmVhbi5hcmd1bWVudHMuc2l6ZSgpXSkpOworCQlpZiAoY21kLmdldE91dHB1dFdyaXRlcigpICE9IG51bGwpIHsKKwkJCWNtZC5nZXRPdXRwdXRXcml0ZXIoKS5mbHVzaCgpOworCQl9CisJCWlmIChjbWQuZ2V0RXJyb3JXcml0ZXIoKSAhPSBudWxsKSB7CisJCQljbWQuZ2V0RXJyb3JXcml0ZXIoKS5mbHVzaCgpOworCQl9CisJCXJldHVybiByZXN1bHQub3V0TGluZXMoKS50b0FycmF5KG5ldyBTdHJpbmdbMF0pOworCX0KKworCXByaXZhdGUgR2l0IGdpdDsKKworCUBPdmVycmlkZQorCUBCZWZvcmUKKwlwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworCQlzdXBlci5zZXRVcCgpOworCQlnaXQgPSBuZXcgR2l0KGRiKTsKKwkJZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoImluaXRpYWwgY29tbWl0IikuY2FsbCgpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFRvb2woKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmV2Q29tbWl0IGNvbW1pdCA9IGNyZWF0ZVVuc3RhZ2VkQ2hhbmdlcygpOworCQlMaXN0PERpZmZFbnRyeT4gY2hhbmdlcyA9IGdldFJlcG9zaXRvcnlDaGFuZ2VzKGNvbW1pdCk7CisJCVN0cmluZ1tdIGV4cGVjdGVkT3V0cHV0ID0gZ2V0RXhwZWN0ZWREaWZmVG9vbE91dHB1dChjaGFuZ2VzKTsKKworCQlTdHJpbmdbXSBvcHRpb25zID0geworCQkJCSItLXRvb2wiLAorCQkJCSItdCIsCisJCX07CisKKwkJZm9yIChTdHJpbmcgb3B0aW9uIDogb3B0aW9ucykgeworCQkJYXNzZXJ0QXJyYXlPZkxpbmVzRXF1YWxzKCJJbmNvcnJlY3Qgb3V0cHV0IGZvciBvcHRpb246ICIgKyBvcHRpb24sCisJCQkJCWV4cGVjdGVkT3V0cHV0LAorCQkJCQlydW5BbmRDYXB0dXJlVXNpbmdJbml0UmF3KCJkaWZmdG9vbCIsIG9wdGlvbiwKKwkJCQkJCQkic29tZV90b29sIikpOworCQl9CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0VG9vbFRydXN0RXhpdENvZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmV2Q29tbWl0IGNvbW1pdCA9IGNyZWF0ZVVuc3RhZ2VkQ2hhbmdlcygpOworCQlMaXN0PERpZmZFbnRyeT4gY2hhbmdlcyA9IGdldFJlcG9zaXRvcnlDaGFuZ2VzKGNvbW1pdCk7CisJCVN0cmluZ1tdIGV4cGVjdGVkT3V0cHV0ID0gZ2V0RXhwZWN0ZWREaWZmVG9vbE91dHB1dChjaGFuZ2VzKTsKKworCQlTdHJpbmdbXSBvcHRpb25zID0geyAiLS10b29sIiwgIi10IiwgfTsKKworCQlmb3IgKFN0cmluZyBvcHRpb24gOiBvcHRpb25zKSB7CisJCQlhc3NlcnRBcnJheU9mTGluZXNFcXVhbHMoIkluY29ycmVjdCBvdXRwdXQgZm9yIG9wdGlvbjogIiArIG9wdGlvbiwKKwkJCQkJZXhwZWN0ZWRPdXRwdXQsIHJ1bkFuZENhcHR1cmVVc2luZ0luaXRSYXcoImRpZmZ0b29sIiwKKwkJCQkJCQkiLS10cnVzdC1leGl0LWNvZGUiLCBvcHRpb24sICJzb21lX3Rvb2wiKSk7CisJCX0KKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RUb29sTm9HdWlOb1Byb21wdE5vVHJ1c3RFeGl0Y29kZSgpIHRocm93cyBFeGNlcHRpb24geworCQlSZXZDb21taXQgY29tbWl0ID0gY3JlYXRlVW5zdGFnZWRDaGFuZ2VzKCk7CisJCUxpc3Q8RGlmZkVudHJ5PiBjaGFuZ2VzID0gZ2V0UmVwb3NpdG9yeUNoYW5nZXMoY29tbWl0KTsKKwkJU3RyaW5nW10gZXhwZWN0ZWRPdXRwdXQgPSBnZXRFeHBlY3RlZERpZmZUb29sT3V0cHV0KGNoYW5nZXMpOworCisJCVN0cmluZ1tdIG9wdGlvbnMgPSB7ICItLXRvb2wiLCAiLXQiLCB9OworCisJCWZvciAoU3RyaW5nIG9wdGlvbiA6IG9wdGlvbnMpIHsKKwkJCWFzc2VydEFycmF5T2ZMaW5lc0VxdWFscygiSW5jb3JyZWN0IG91dHB1dCBmb3Igb3B0aW9uOiAiICsgb3B0aW9uLAorCQkJCQlleHBlY3RlZE91dHB1dCwgcnVuQW5kQ2FwdHVyZVVzaW5nSW5pdFJhdygiZGlmZnRvb2wiLAorCQkJCQkJCSItLW5vLWd1aSIsICItLW5vLXByb21wdCIsICItLW5vLXRydXN0LWV4aXQtY29kZSIsCisJCQkJCQkJb3B0aW9uLCAic29tZV90b29sIikpOworCQl9CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0VG9vbENhY2hlZCgpIHRocm93cyBFeGNlcHRpb24geworCQlSZXZDb21taXQgY29tbWl0ID0gY3JlYXRlU3RhZ2VkQ2hhbmdlcygpOworCQlMaXN0PERpZmZFbnRyeT4gY2hhbmdlcyA9IGdldFJlcG9zaXRvcnlDaGFuZ2VzKGNvbW1pdCk7CisJCVN0cmluZ1tdIGV4cGVjdGVkT3V0cHV0ID0gZ2V0RXhwZWN0ZWREaWZmVG9vbE91dHB1dChjaGFuZ2VzKTsKKworCQlTdHJpbmdbXSBvcHRpb25zID0geyAiLS1jYWNoZWQiLCAiLS1zdGFnZWQiLCB9OworCisJCWZvciAoU3RyaW5nIG9wdGlvbiA6IG9wdGlvbnMpIHsKKwkJCWFzc2VydEFycmF5T2ZMaW5lc0VxdWFscygiSW5jb3JyZWN0IG91dHB1dCBmb3Igb3B0aW9uOiAiICsgb3B0aW9uLAorCQkJCQlleHBlY3RlZE91dHB1dCwgcnVuQW5kQ2FwdHVyZVVzaW5nSW5pdFJhdygiZGlmZnRvb2wiLAorCQkJCQkJCW9wdGlvbiwgIi0tdG9vbCIsICJzb21lX3Rvb2wiKSk7CisJCX0KKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RUb29sSGVscCgpIHRocm93cyBFeGNlcHRpb24geworCQlDb21tYW5kTGluZURpZmZUb29sW10gZGVmYXVsdFRvb2xzID0gQ29tbWFuZExpbmVEaWZmVG9vbC52YWx1ZXMoKTsKKwkJTGlzdDxTdHJpbmc+IGV4cGVjdGVkT3V0cHV0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCWV4cGVjdGVkT3V0cHV0LmFkZCgiZ2l0IGRpZmZ0b29sIC0tdG9vbD08dG9vbD4gbWF5IGJlIHNldCB0byBvbmUgb2YgdGhlIGZvbGxvd2luZzoiKTsKKwkJZm9yIChDb21tYW5kTGluZURpZmZUb29sIGRlZmF1bHRUb29sIDogZGVmYXVsdFRvb2xzKSB7CisJCQlTdHJpbmcgdG9vbE5hbWUgPSBkZWZhdWx0VG9vbC5uYW1lKCk7CisJCQlleHBlY3RlZE91dHB1dC5hZGQodG9vbE5hbWUpOworCQl9CisJCVN0cmluZ1tdIHVzZXJEZWZpbmVkVG9vbHNIZWxwID0geworCQkJCSJ1c2VyLWRlZmluZWQ6IiwKKwkJCQkiVGhlIGZvbGxvd2luZyB0b29scyBhcmUgdmFsaWQsIGJ1dCBub3QgY3VycmVudGx5IGF2YWlsYWJsZToiLAorCQkJCSJTb21lIG9mIHRoZSB0b29scyBsaXN0ZWQgYWJvdmUgb25seSB3b3JrIGluIGEgd2luZG93ZWQiLAorCQkJCSJlbnZpcm9ubWVudC4gSWYgcnVuIGluIGEgdGVybWluYWwtb25seSBzZXNzaW9uLCB0aGV5IHdpbGwgZmFpbC4iLAorCQl9OworCQlleHBlY3RlZE91dHB1dC5hZGRBbGwoQXJyYXlzLmFzTGlzdCh1c2VyRGVmaW5lZFRvb2xzSGVscCkpOworCisJCVN0cmluZyBvcHRpb24gPSAiLS10b29sLWhlbHAiOworCQlhc3NlcnRBcnJheU9mTGluZXNFcXVhbHMoIkluY29ycmVjdCBvdXRwdXQgZm9yIG9wdGlvbjogIiArIG9wdGlvbiwKKwkJCQlleHBlY3RlZE91dHB1dC50b0FycmF5KG5ldyBTdHJpbmdbMF0pLCBydW5BbmRDYXB0dXJlVXNpbmdJbml0UmF3KCJkaWZmdG9vbCIsIG9wdGlvbikpOworCX0KKworCXByaXZhdGUgUmV2Q29tbWl0IGNyZWF0ZVVuc3RhZ2VkQ2hhbmdlcygpIHRocm93cyBFeGNlcHRpb24geworCQl3cml0ZVRyYXNoRmlsZSgiYSIsICJIZWxsbyB3b3JsZCBhIik7CisJCXdyaXRlVHJhc2hGaWxlKCJiIiwgIkhlbGxvIHdvcmxkIGIiKTsKKwkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCIuIikuY2FsbCgpOworCQlSZXZDb21taXQgY29tbWl0ID0gZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoImZpbGVzIGEgJiBiIikuY2FsbCgpOworCQl3cml0ZVRyYXNoRmlsZSgiYSIsICJOZXcgSGVsbG8gd29ybGQgYSIpOworCQl3cml0ZVRyYXNoRmlsZSgiYiIsICJOZXcgSGVsbG8gd29ybGQgYiIpOworCQlyZXR1cm4gY29tbWl0OworCX0KKworCXByaXZhdGUgUmV2Q29tbWl0IGNyZWF0ZVN0YWdlZENoYW5nZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmV2Q29tbWl0IGNvbW1pdCA9IGNyZWF0ZVVuc3RhZ2VkQ2hhbmdlcygpOworCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oIi4iKS5jYWxsKCk7CisJCXJldHVybiBjb21taXQ7CisJfQorCisJcHJpdmF0ZSBMaXN0PERpZmZFbnRyeT4gZ2V0UmVwb3NpdG9yeUNoYW5nZXMoUmV2Q29tbWl0IGNvbW1pdCkKKwkJCXRocm93cyBFeGNlcHRpb24geworCQlUcmVlV2FsayB0dyA9IG5ldyBUcmVlV2FsayhkYik7CisJCXR3LmFkZFRyZWUoY29tbWl0LmdldFRyZWUoKSk7CisJCUZpbGVUcmVlSXRlcmF0b3IgbW9kaWZpZWRUcmVlID0gbmV3IEZpbGVUcmVlSXRlcmF0b3IoZGIpOworCQl0dy5hZGRUcmVlKG1vZGlmaWVkVHJlZSk7CisJCUxpc3Q8RGlmZkVudHJ5PiBjaGFuZ2VzID0gRGlmZkVudHJ5LnNjYW4odHcpOworCQlyZXR1cm4gY2hhbmdlczsKKwl9CisKKwlwcml2YXRlIFN0cmluZ1tdIGdldEV4cGVjdGVkRGlmZlRvb2xPdXRwdXQoTGlzdDxEaWZmRW50cnk+IGNoYW5nZXMpIHsKKwkJU3RyaW5nW10gZXhwZWN0ZWRUb29sT3V0cHV0ID0gbmV3IFN0cmluZ1tjaGFuZ2VzLnNpemUoKV07CisJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hhbmdlcy5zaXplKCk7ICsraSkgeworCQkJRGlmZkVudHJ5IGNoYW5nZSA9IGNoYW5nZXMuZ2V0KGkpOworCQkJU3RyaW5nIG5ld1BhdGggPSBjaGFuZ2UuZ2V0TmV3UGF0aCgpOworCQkJU3RyaW5nIG9sZFBhdGggPSBjaGFuZ2UuZ2V0T2xkUGF0aCgpOworCQkJU3RyaW5nIG5ld0lkTmFtZSA9IGNoYW5nZS5nZXROZXdJZCgpLm5hbWUoKTsKKwkJCVN0cmluZyBvbGRJZE5hbWUgPSBjaGFuZ2UuZ2V0T2xkSWQoKS5uYW1lKCk7CisJCQlTdHJpbmcgZXhwZWN0ZWRMaW5lID0gIk1cdCIgKyBuZXdQYXRoICsgIiAoIiArIG5ld0lkTmFtZSArICIpIgorCQkJCQkrICJcdCIgKyBvbGRQYXRoICsgIiAoIiArIG9sZElkTmFtZSArICIpIjsKKwkJCWV4cGVjdGVkVG9vbE91dHB1dFtpXSA9IGV4cGVjdGVkTGluZTsKKwkJfQorCQlyZXR1cm4gZXhwZWN0ZWRUb29sT3V0cHV0OworCX0KKworCXByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0QXJyYXlPZkxpbmVzRXF1YWxzKFN0cmluZyBmYWlsTWVzc2FnZSwKKwkJCVN0cmluZ1tdIGV4cGVjdGVkLCBTdHJpbmdbXSBhY3R1YWwpIHsKKwkJYXNzZXJ0RXF1YWxzKGZhaWxNZXNzYWdlLCB0b1N0cmluZyhleHBlY3RlZCksIHRvU3RyaW5nKGFjdHVhbCkpOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGdtL0ZldGNoVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20udGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9wZ20vRmV0Y2hUZXN0LmphdmEKaW5kZXggNTY0YmQ1Zi4uMWM2Yjc4MyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20udGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9wZ20vRmV0Y2hUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20udGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9wZ20vRmV0Y2hUZXN0LmphdmEKQEAgLTMzLDYgKzMzLDcgQEAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoImluaXRpYWwgY29tbWl0IikuY2FsbCgpOwogCiAJCVJlcG9zaXRvcnkgcmVtb3RlUmVwb3NpdG9yeSA9IGNyZWF0ZVdvcmtSZXBvc2l0b3J5KCk7CisJCWFkZFJlcG9Ub0Nsb3NlKHJlbW90ZVJlcG9zaXRvcnkpOwogCQlyZW1vdGVHaXQgPSBuZXcgR2l0KHJlbW90ZVJlcG9zaXRvcnkpOwogCiAJCS8vIHNldHVwIHRoZSBmaXJzdCByZXBvc2l0b3J5IHRvIGZldGNoIGZyb20gdGhlIHNlY29uZCByZXBvc2l0b3J5CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL29yZy5lY2xpcHNlLmpnaXQucGdtL01FVEEtSU5GL01BTklGRVNULk1GCmluZGV4IGZmYWFmYzEuLmVkOTgwYjUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtL01FVEEtSU5GL01BTklGRVNULk1GCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtL01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0zLDcgKzMsNyBAQAogQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZQogQXV0b21hdGljLU1vZHVsZS1OYW1lOiBvcmcuZWNsaXBzZS5qZ2l0LnBnbQogQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuamdpdC5wZ20KLUJ1bmRsZS1WZXJzaW9uOiA2LjAuMS5xdWFsaWZpZXIKK0J1bmRsZS1WZXJzaW9uOiA2LjEuMS5xdWFsaWZpZXIKIEJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yCiBCdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KIEJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKYXZhU0UtMTEKQEAgLTE0LDQ3ICsxNCw0OSBAQAogIG9yZy5lY2xpcHNlLmpldHR5LnNlcnZsZXQ7dmVyc2lvbj0iWzEwLjAuMCwxMS4wLjApIiwKICBvcmcuZWNsaXBzZS5qZXR0eS51dGlsO3ZlcnNpb249IlsxMC4wLjAsMTEuMC4wKSIsCiAgb3JnLmVjbGlwc2UuamV0dHkudXRpbC5jb21wb25lbnQ7dmVyc2lvbj0iWzEwLjAuMCwxMS4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmFwaTt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnM7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuYXd0dWk7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5ibGFtZTt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmRpZmY7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5kaXJjYWNoZTt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmVycm9yczt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmdpdHJlcG87dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmlvO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5wYWNrO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5yZWZ0YWJsZTt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmxmczt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXI7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLmZzO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci5zMzt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmxpYjt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lm1lcmdlO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubmxzO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubm90ZXM7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5yZXZwbG90O3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsazt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuZmlsdGVyO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5maWxlO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5wYWNrO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0O3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0Lmh0dHAuYXBhY2hlO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LnJlc29sdmVyO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LnNzaC5qc2NoO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LnNzaGQ7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsazt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLmZpbHRlcjt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC51dGlsLmlvO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuYXBpO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9yczt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmU7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5hd3R1aTt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmJsYW1lO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuZGlmZjt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmRpcmNhY2hlO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuZ2l0cmVwbzt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLmRpZmZtZXJnZXRvb2w7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmlvO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5wYWNrO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5yZWZ0YWJsZTt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmxmczt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXI7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLmZzO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci5zMzt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmxpYjt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lm1lcmdlO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGliLmludGVybmFsO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubmxzO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubm90ZXM7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5yZXZwbG90O3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsazt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuZmlsdGVyO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5maWxlO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5wYWNrO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0O3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0Lmh0dHAuYXBhY2hlO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LnJlc29sdmVyO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LnNzaC5qc2NoO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LnNzaGQ7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsazt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLmZpbHRlcjt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC51dGlsLmlvO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAogIG9yZy5rb2hzdWtlLmFyZ3M0ajt2ZXJzaW9uPSJbMi4zMy4wLDMuMC4wKSIsCiAgb3JnLmtvaHN1a2UuYXJnczRqLnNwaTt2ZXJzaW9uPSJbMi4zMy4wLDMuMC4wKSIKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0LmNvbnNvbGU7dmVyc2lvbj0iNi4wLjEiOworRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpnaXQuY29uc29sZTt2ZXJzaW9uPSI2LjEuMSI7CiAgdXNlczo9Im9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LAogICBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwiLAotIG9yZy5lY2xpcHNlLmpnaXQucGdtO3ZlcnNpb249IjYuMC4xIjsKKyBvcmcuZWNsaXBzZS5qZ2l0LnBnbTt2ZXJzaW9uPSI2LjEuMSI7CiAgIHVzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydCwKICAgIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5pbywKICAgIG9yZy5lY2xpcHNlLmpnaXQuYXd0dWksCkBAIC02NiwxNCArNjgsMTQgQEAKICAgIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGssCiAgICBvcmcuZWNsaXBzZS5qZ2l0LmFwaSwKICAgIGphdmF4LnN3aW5nIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnBnbS5kZWJ1Zzt2ZXJzaW9uPSI2LjAuMSI7Cisgb3JnLmVjbGlwc2UuamdpdC5wZ20uZGVidWc7dmVyc2lvbj0iNi4xLjEiOwogICB1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC51dGlsLmlvLAogICAgb3JnLmVjbGlwc2UuamdpdC5wZ20sCiAgICBvcmcuZWNsaXBzZS5qZXR0eS5zZXJ2bGV0IiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnBnbS5pbnRlcm5hbDt2ZXJzaW9uPSI2LjAuMSI7Cisgb3JnLmVjbGlwc2UuamdpdC5wZ20uaW50ZXJuYWw7dmVyc2lvbj0iNi4xLjEiOwogICB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0LAogICAgb3JnLmVjbGlwc2UuamdpdC50ZXN0IiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnBnbS5vcHQ7dmVyc2lvbj0iNi4wLjEiOworIG9yZy5lY2xpcHNlLmpnaXQucGdtLm9wdDt2ZXJzaW9uPSI2LjEuMSI7CiAgIHVzZXM6PSJvcmcua29oc3VrZS5hcmdzNGosCiAgICBvcmcuZWNsaXBzZS5qZ2l0LmxpYiwKICAgIG9yZy5lY2xpcHNlLmpnaXQucmV2d2FsaywKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL01FVEEtSU5GL1NPVVJDRS1NQU5JRkVTVC5NRiBiL29yZy5lY2xpcHNlLmpnaXQucGdtL01FVEEtSU5GL1NPVVJDRS1NQU5JRkVTVC5NRgppbmRleCAyNjI2OWQ3Li4wYTVkZDg4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9NRVRBLUlORi9TT1VSQ0UtTUFOSUZFU1QuTUYKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vTUVUQS1JTkYvU09VUkNFLU1BTklGRVNULk1GCkBAIC0zLDUgKzMsNSBAQAogQnVuZGxlLU5hbWU6IG9yZy5lY2xpcHNlLmpnaXQucGdtIC0gU291cmNlcwogQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuamdpdC5wZ20uc291cmNlCiBCdW5kbGUtVmVuZG9yOiBFY2xpcHNlLm9yZyAtIEpHaXQKLUJ1bmRsZS1WZXJzaW9uOiA2LjAuMS5xdWFsaWZpZXIKLUVjbGlwc2UtU291cmNlQnVuZGxlOiBvcmcuZWNsaXBzZS5qZ2l0LnBnbTt2ZXJzaW9uPSI2LjAuMS5xdWFsaWZpZXIiO3Jvb3RzPSIuIgorQnVuZGxlLVZlcnNpb246IDYuMS4xLnF1YWxpZmllcgorRWNsaXBzZS1Tb3VyY2VCdW5kbGU6IG9yZy5lY2xpcHNlLmpnaXQucGdtO3ZlcnNpb249IjYuMS4xLnF1YWxpZmllciI7cm9vdHM9Ii4iCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9NRVRBLUlORi9zZXJ2aWNlcy9vcmcuZWNsaXBzZS5qZ2l0LnBnbS5UZXh0QnVpbHRpbiBiL29yZy5lY2xpcHNlLmpnaXQucGdtL01FVEEtSU5GL3NlcnZpY2VzL29yZy5lY2xpcHNlLmpnaXQucGdtLlRleHRCdWlsdGluCmluZGV4IGU2NDUyNTUuLjhjNDQ3NjQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtL01FVEEtSU5GL3NlcnZpY2VzL29yZy5lY2xpcHNlLmpnaXQucGdtLlRleHRCdWlsdGluCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtL01FVEEtSU5GL3NlcnZpY2VzL29yZy5lY2xpcHNlLmpnaXQucGdtLlRleHRCdWlsdGluCkBAIC0xMiw2ICsxMiw3IEBACiBvcmcuZWNsaXBzZS5qZ2l0LnBnbS5EYWVtb24KIG9yZy5lY2xpcHNlLmpnaXQucGdtLkRlc2NyaWJlCiBvcmcuZWNsaXBzZS5qZ2l0LnBnbS5EaWZmCitvcmcuZWNsaXBzZS5qZ2l0LnBnbS5EaWZmVG9vbAogb3JnLmVjbGlwc2UuamdpdC5wZ20uRGlmZlRyZWUKIG9yZy5lY2xpcHNlLmpnaXQucGdtLkZldGNoCiBvcmcuZWNsaXBzZS5qZ2l0LnBnbS5HYwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vcG9tLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3BvbS54bWwKaW5kZXggMDVlMGJjYy4uYzE4OWRjNyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vcG9tLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9wb20ueG1sCkBAIC0xNyw3ICsxNyw3IEBACiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj42LjAuMS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8dmVyc2lvbj42LjEuMS1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPC9wYXJlbnQ+CiAKICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC5wZ208L2FydGlmYWN0SWQ+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9yZXNvdXJjZXMvb3JnL2VjbGlwc2UvamdpdC9wZ20vaW50ZXJuYWwvQ0xJVGV4dC5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vcmVzb3VyY2VzL29yZy9lY2xpcHNlL2pnaXQvcGdtL2ludGVybmFsL0NMSVRleHQucHJvcGVydGllcwppbmRleCA5NzQ1MDAzLi5mZGEwYmY2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9yZXNvdXJjZXMvb3JnL2VjbGlwc2UvamdpdC9wZ20vaW50ZXJuYWwvQ0xJVGV4dC5wcm9wZXJ0aWVzCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3Jlc291cmNlcy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9pbnRlcm5hbC9DTElUZXh0LnByb3BlcnRpZXMKQEAgLTU4LDYgKzU4LDkgQEAKIGRhdGVJbmZvPURhdGU6ICAgezB9CiBkZWxldGVkQnJhbmNoPURlbGV0ZWQgYnJhbmNoIHswfQogZGVsZXRlZFJlbW90ZUJyYW5jaD1EZWxldGVkIHJlbW90ZSBicmFuY2ggezB9CitkaWZmVG9vbEhlbHBTZXRUb0ZvbGxvd2luZz0nZ2l0IGRpZmZ0b29sIC0tdG9vbD08dG9vbD4nIG1heSBiZSBzZXQgdG8gb25lIG9mIHRoZSBmb2xsb3dpbmc6XG57MH1cblx0dXNlci1kZWZpbmVkOlxuezF9XG5UaGUgZm9sbG93aW5nIHRvb2xzIGFyZSB2YWxpZCwgYnV0IG5vdCBjdXJyZW50bHkgYXZhaWxhYmxlOlxuezJ9XG5Tb21lIG9mIHRoZSB0b29scyBsaXN0ZWQgYWJvdmUgb25seSB3b3JrIGluIGEgd2luZG93ZWRcbmVudmlyb25tZW50LiBJZiBydW4gaW4gYSB0ZXJtaW5hbC1vbmx5IHNlc3Npb24sIHRoZXkgd2lsbCBmYWlsLgorZGlmZlRvb2xMYXVuY2g9Vmlld2luZyAoezB9L3sxfSk6ICd7Mn0nXG5MYXVuY2ggJ3szfScgW1kvbl0/CitkaWZmVG9vbERpZWQ9ZXh0ZXJuYWwgZGlmZiBkaWVkLCBzdG9wcGluZyBhdCB7MH0KIGRvZXNOb3RFeGlzdD17MH0gZG9lcyBub3QgZXhpc3QKIGRvbnRPdmVyd3JpdGVMb2NhbENoYW5nZXM9ZXJyb3I6IFlvdXIgbG9jYWwgY2hhbmdlcyB0byB0aGUgZm9sbG93aW5nIGZpbGUgd291bGQgYmUgb3ZlcndyaXR0ZW4gYnkgbWVyZ2U6CiBldmVyeXRoaW5nVXBUb0RhdGU9RXZlcnl0aGluZyB1cC10by1kYXRlCkBAIC0xNDUsNiArMTQ4LDcgQEAKIG1ldGFWYXJfc2Vjb25kcz1TRUNPTkRTCiBtZXRhVmFyX3NlcnZpY2U9U0VSVklDRQogbWV0YVZhcl90YWdMb2NhbFVzZXI9PEdQRyBrZXkgSUQ+CittZXRhVmFyX3Rvb2w9VE9PTAogbWV0YVZhcl90cmVlaXNoPXRyZWUtaXNoCiBtZXRhVmFyX3VyaWlzaD11cmktaXNoCiBtZXRhVmFyX3VybD1VUkwKQEAgLTIyNSw2ICsyMjksNyBAQAogdW5zdXBwb3J0ZWRPcGVyYXRpb249VW5zdXBwb3J0ZWQgb3BlcmF0aW9uOiB7MH0KIHVudHJhY2tlZEZpbGVzPVVudHJhY2tlZCBmaWxlczoKIHVwZGF0aW5nPVVwZGF0aW5nIHswfS4uezF9Cit1c2FnZV9BYmJyZXY9SW5zdGVhZCBvZiB1c2luZyB0aGUgZGVmYXVsdCBudW1iZXIgb2YgaGV4YWRlY2ltYWwgZGlnaXRzICh3aGljaCB3aWxsIHZhcnkgYWNjb3JkaW5nIHRvIHRoZSBudW1iZXIgb2Ygb2JqZWN0cyBpbiB0aGUgcmVwb3NpdG9yeSB3aXRoIGEgZGVmYXVsdCBvZiA3KSBvZiB0aGUgYWJicmV2aWF0ZWQgb2JqZWN0IG5hbWUsIHVzZSA8bj4gZGlnaXRzLCBvciBhcyBtYW55IGRpZ2l0cyBhcyBuZWVkZWQgdG8gZm9ybSBhIHVuaXF1ZSBvYmplY3QgbmFtZS4gQW4gPG4+IG9mIDAgd2lsbCBzdXBwcmVzcyBsb25nIGZvcm1hdCwgb25seSBzaG93aW5nIHRoZSBjbG9zZXN0IHRhZy4KIHVzYWdlX0FnZ3Jlc3NpdmU9VGhpcyBvcHRpb24gd2lsbCBjYXVzZSBnYyB0byBtb3JlIGFnZ3Jlc3NpdmVseSBvcHRpbWl6ZSB0aGUgcmVwb3NpdG9yeSBhdCB0aGUgZXhwZW5zZSBvZiB0YWtpbmcgbXVjaCBtb3JlIHRpbWUKIHVzYWdlX0Fsd2F5c0ZhbGxiYWNrPVNob3cgdW5pcXVlbHkgYWJicmV2aWF0ZWQgY29tbWl0IG9iamVjdCBhcyBmYWxsYmFjawogdXNhZ2VfYmFyZUNsb25lPU1ha2UgYSBiYXJlIEdpdCByZXBvc2l0b3J5LiBUaGF0IGlzLCBpbnN0ZWFkIG9mIGNyZWF0aW5nIFtESVJFQ1RPUlldIGFuZCBwbGFjaW5nIHRoZSBhZG1pbmlzdHJhdGl2ZSBmaWxlcyBpbiBbRElSRUNUT1JZXS8uZ2l0LCBtYWtlIHRoZSBbRElSRUNUT1JZXSBpdHNlbGYgdGhlICRHSVRfRElSLgpAQCAtMjQ5LDYgKzI1NCw4IEBACiB1c2FnZV9EaXNwbGF5VGhlVmVyc2lvbk9mSmdpdD1EaXNwbGF5IHRoZSB2ZXJzaW9uIG9mIGpnaXQKIHVzYWdlX0djPUNsZWFudXAgdW5uZWNlc3NhcnkgZmlsZXMgYW5kIG9wdGltaXplIHRoZSBsb2NhbCByZXBvc2l0b3J5CiB1c2FnZV9HbG9nPVZpZXcgY29tbWl0IGhpc3RvcnkgYXMgYSBncmFwaAordXNhZ2VfRGlmZkd1aVRvb2w9V2hlbiBnaXQtZGlmZnRvb2wgaXMgaW52b2tlZCB3aXRoIHRoZSAtZyBvciAtLWd1aSBvcHRpb24gdGhlIGRlZmF1bHQgZGlmZiB0b29sIHdpbGwgYmUgcmVhZCBmcm9tIHRoZSBjb25maWd1cmVkIGRpZmYuZ3VpdG9vbCB2YXJpYWJsZSBpbnN0ZWFkIG9mIGRpZmYudG9vbC4KK3VzYWdlX25vR3VpPVRoZSAtLW5vLWd1aSBvcHRpb24gY2FuIGJlIHVzZWQgdG8gb3ZlcnJpZGUgLWcgb3IgLS1ndWkgc2V0dGluZy4KIHVzYWdlX0luZGV4UGFjaz1CdWlsZCBwYWNrIGluZGV4IGZpbGUgZm9yIGFuIGV4aXN0aW5nIHBhY2tlZCBhcmNoaXZlCiB1c2FnZV9MRlNEaXJlY3Rvcnk9RGlyZWN0b3J5IHRvIHN0b3JlIGxhcmdlIG9iamVjdHMKIHVzYWdlX0xGU1BvcnQ9U2VydmVyIGh0dHAgcG9ydApAQCAtMjk1LDYgKzMwMiw3IEBACiB1c2FnZV9TdGF0dXM9U2hvdyB0aGUgd29ya2luZyB0cmVlIHN0YXR1cwogdXNhZ2VfU3RvcFRyYWNraW5nQUZpbGU9U3RvcCB0cmFja2luZyBhIGZpbGUKIHVzYWdlX1RleHRIYXNoRnVuY3Rpb25zPVNjYW4gcmVwb3NpdG9yeSB0byBjb21wdXRlIG1heGltdW0gbnVtYmVyIG9mIGNvbGxpc2lvbnMgZm9yIGhhc2ggZnVuY3Rpb25zCit1c2FnZV9Ub29sRm9yRGlmZj1Vc2UgdGhlIGRpZmYgdG9vbCBzcGVjaWZpZWQgYnkgPHRvb2w+LiBSdW4gZ2l0IGRpZmZ0b29sIC0tdG9vbC1oZWxwIGZvciB0aGUgbGlzdCBvZiB2YWxpZCA8dG9vbD4gc2V0dGluZ3MuXG5JZiBhIGRpZmYgdG9vbCBpcyBub3Qgc3BlY2lmaWVkLCBnaXQgZGlmZnRvb2wgd2lsbCB1c2UgdGhlIGNvbmZpZ3VyYXRpb24gdmFyaWFibGUgZGlmZi50b29sLgogdXNhZ2VfVXBkYXRlUmVtb3RlUmVwb3NpdG9yeUZyb21Mb2NhbFJlZnM9VXBkYXRlIHJlbW90ZSByZXBvc2l0b3J5IGZyb20gbG9jYWwgcmVmcwogdXNhZ2VfVXNlQWxsPVVzZSBhbGwgcmVmcyBmb3VuZCBpbiByZWZzLwogdXNhZ2VfVXNlVGFncz1Vc2UgYW55IHRhZyBpbmNsdWRpbmcgbGlnaHR3ZWlnaHQgdGFncwpAQCAtMzQxLDYgKzM0OSw3IEBACiB1c2FnZV9kYXRlPWRhdGUgZm9ybWF0LCBvbmUgb2YgZGVmYXVsdCwgcmZjLCBsb2NhbCwgaXNvLCBzaG9ydCwgcmF3IChhcyBkZWZpbmVkIGJ5IGdpdC1sb2coMSkgKSwgbG9jYWxlIG9yIGxvY2FsZWxvY2FsIChqZ2l0IGV4dGVuc2lvbnMpCiB1c2FnZV9kZXRlY3RSZW5hbWVzPWRldGVjdCByZW5hbWVkIGZpbGVzCiB1c2FnZV9kaWZmQWxnb3JpdGhtPXRoZSBkaWZmIGFsZ29yaXRobSB0byB1c2UuIEN1cnJlbnRseSBzdXBwb3J0ZWQgYXJlOiAnbXllcnMnLCAnaGlzdG9ncmFtJwordXNhZ2VfRGlmZlRvb2w9Z2l0IGRpZmZ0b29sIGlzIGEgR2l0IGNvbW1hbmQgdGhhdCBhbGxvd3MgeW91IHRvIGNvbXBhcmUgYW5kIGVkaXQgZmlsZXMgYmV0d2VlbiByZXZpc2lvbnMgdXNpbmcgY29tbW9uIGRpZmYgdG9vbHMuXG5naXQgZGlmZnRvb2wgaXMgYSBmcm9udGVuZCB0byBnaXQgZGlmZiBhbmQgYWNjZXB0cyB0aGUgc2FtZSBvcHRpb25zIGFuZCBhcmd1bWVudHMuCiB1c2FnZV9kaXJlY3Rvcmllc1RvRXhwb3J0PWRpcmVjdG9yaWVzIHRvIGV4cG9ydAogdXNhZ2VfZGlzYWJsZVRoZVNlcnZpY2VJbkFsbFJlcG9zaXRvcmllcz1kaXNhYmxlIHRoZSBzZXJ2aWNlIGluIGFsbCByZXBvc2l0b3JpZXMKIHVzYWdlX2Rpc3BsYXlBTGlzdE9mQWxsUmVnaXN0ZXJlZEpnaXRDb21tYW5kcz1EaXNwbGF5IGEgbGlzdCBvZiBhbGwgcmVnaXN0ZXJlZCBqZ2l0IGNvbW1hbmRzCkBAIC0zOTUsNiArNDA0LDggQEAKIHVzYWdlX3BlcmZvcm1Gc2NrU3R5bGVDaGVja3NPblJlY2VpdmU9cGVyZm9ybSBmc2NrIHN0eWxlIGNoZWNrcyBvbiByZWNlaXZlCiB1c2FnZV9wb3J0TnVtYmVyVG9MaXN0ZW5Pbj1wb3J0IG51bWJlciB0byBsaXN0ZW4gb24KIHVzYWdlX3ByaW50T25seUJyYW5jaGVzVGhhdENvbnRhaW5UaGVDb21taXQ9cHJpbnQgb25seSBicmFuY2hlcyB0aGF0IGNvbnRhaW4gdGhlIGNvbW1pdAordXNhZ2VfcHJvbXB0PVByb21wdCBiZWZvcmUgZWFjaCBpbnZvY2F0aW9uIG9mIHRoZSBkaWZmIHRvb2wuIFRoaXMgaXMgdGhlIGRlZmF1bHQgYmVoYXZpb3VyOyB0aGUgb3B0aW9uIGlzIHByb3ZpZGVkIHRvIG92ZXJyaWRlIGFueSBjb25maWd1cmF0aW9uIHNldHRpbmdzLgordXNhZ2Vfbm9Qcm9tcHQ9RG8gbm90IHByb21wdCBiZWZvcmUgbGF1bmNoaW5nIGEgZGlmZiB0b29sLgogdXNhZ2VfcHJ1bmVTdGFsZVRyYWNraW5nUmVmcz1wcnVuZSBzdGFsZSB0cmFja2luZyByZWZzCiB1c2FnZV9wdXNoVXJscz1wdXNoIFVSTHMgYXJlIG1hbmlwdWxhdGVkCiB1c2FnZV9xdWlldD1kb24ndCBzaG93IHByb2dyZXNzIG1lc3NhZ2VzCkBAIC00MjIsNiArNDMzLDggQEAKIHVzYWdlX3NzaERyaXZlcj1TZWxlY3RzIHRoZSBidWlsdC1pbiBzc2ggbGlicmFyeSB0byB1c2UsIEpTY2ggb3IgQXBhY2hlIE1JTkEgc3NoZC4KIHVzYWdlX3N5bWJvbGljVmVyc2lvbkZvclRoZVByb2plY3Q9U3ltYm9saWMgdmVyc2lvbiBmb3IgdGhlIHByb2plY3QKIHVzYWdlX3RhZ3M9ZmV0Y2ggYWxsIHRhZ3MKK3VzYWdlX3RydXN0RXhpdENvZGU9Z2l0LWRpZmZ0b29sIGludm9rZXMgYSBkaWZmIHRvb2wgaW5kaXZpZHVhbGx5IG9uIGVhY2ggZmlsZS4gRXJyb3JzIHJlcG9ydGVkIGJ5IHRoZSBkaWZmIHRvb2wgYXJlIGlnbm9yZWQgYnkgZGVmYXVsdC4gVXNlIC0tdHJ1c3QtZXhpdC1jb2RlIHRvIG1ha2UgZ2l0LWRpZmZ0b29sIGV4aXQgd2hlbiBhbiBpbnZva2VkIGRpZmYgdG9vbCByZXR1cm5zIGEgbm9uLXplcm8gZXhpdCBjb2RlLlxuZ2l0LWRpZmZ0b29sIHdpbGwgZm9yd2FyZCB0aGUgZXhpdCBjb2RlIG9mIHRoZSBpbnZva2VkIHRvb2wgd2hlbiAtLXRydXN0LWV4aXQtY29kZSBpcyB1c2VkLgordXNhZ2Vfbm9UcnVzdEV4aXRDb2RlPVRoaXMgb3B0aW9uIGNhbiBiZSB1c2VkIHRvIG92ZXJyaWRlIC0tdHJ1c3QtZXhpdC1jb2RlIHNldHRpbmcuCiB1c2FnZV9ub3RhZ3M9ZG8gbm90IGZldGNoIHRhZ3MKIHVzYWdlX3RhZ0Fubm90YXRlZD1jcmVhdGUgYW4gYW5ub3RhdGVkIHRhZywgdW5zaWduZWQgdW5sZXNzIC1zIG9yIC11IGFyZSBnaXZlbiwgb3IgY29uZmlnIHRhZy5ncGdTaWduIGlzIHRydWUKIHVzYWdlX3RhZ0RlbGV0ZT1kZWxldGUgdGFnCkBAIC00MzAsNiArNDQzLDcgQEAKIHVzYWdlX3RhZ1NpZ249Y3JlYXRlIGEgc2lnbmVkIGFubm90YXRlZCB0YWcKIHVzYWdlX3RhZ05vU2lnbj1zdXBwcmVzcyBzaWduaW5nIHRoZSB0YWcKIHVzYWdlX3RhZ1ZlcmlmeT1WZXJpZnkgdGhlIEdQRyBzaWduYXR1cmUKK3VzYWdlX3Rvb2xIZWxwPVByaW50IGEgbGlzdCBvZiBkaWZmIHRvb2xzIHRoYXQgbWF5IGJlIHVzZWQgd2l0aCAtLXRvb2wuCiB1c2FnZV91bnRyYWNrZWRGaWxlc01vZGU9c2hvdyB1bnRyYWNrZWQgZmlsZXMKIHVzYWdlX3VwZGF0ZVJlZj1yZWZlcmVuY2UgdG8gdXBkYXRlCiB1c2FnZV91cGRhdGVSZW1vdGVSZWZzRnJvbUFub3RoZXJSZXBvc2l0b3J5PVVwZGF0ZSByZW1vdGUgcmVmcyBmcm9tIGFub3RoZXIgcmVwb3NpdG9yeQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0JsYW1lLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vQmxhbWUuamF2YQppbmRleCAyYjQ5Y2Y3Li4xYTNhMmY2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vQmxhbWUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vQmxhbWUuamF2YQpAQCAtMTUsNiArMTUsNyBAQAogCiBpbXBvcnQgc3RhdGljIGphdmEubGFuZy5JbnRlZ2VyLnZhbHVlT2Y7CiBpbXBvcnQgc3RhdGljIGphdmEubGFuZy5Mb25nLnZhbHVlT2Y7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5PQkpFQ1RfSURfQUJCUkVWX1NUUklOR19MRU5HVEg7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5PQkpFQ1RfSURfU1RSSU5HX0xFTkdUSDsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CkBAIC0xMTYsNyArMTE3LDggQEAgcHJvdGVjdGVkIHZvaWQgcnVuKCkgewogCiAJCWJvb2xlYW4gYXV0b0FiYnJldiA9IGFiYnJldiA9PSAwOwogCQlpZiAoYWJicmV2ID09IDApIHsKLQkJCWFiYnJldiA9IGRiLmdldENvbmZpZygpLmdldEludCgiY29yZSIsICJhYmJyZXYiLCA3KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQlhYmJyZXYgPSBkYi5nZXRDb25maWcoKS5nZXRJbnQoImNvcmUiLCAiYWJicmV2IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJCU9CSkVDVF9JRF9BQkJSRVZfU1RSSU5HX0xFTkdUSCk7CiAJCX0KIAkJaWYgKCFzaG93QmxhbmtCb3VuZGFyeSkgewogCQkJcm9vdCA9IGRiLmdldENvbmZpZygpLmdldEJvb2xlYW4oImJsYW1lIiwgImJsYW5rYm91bmRhcnkiLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0Rlc2NyaWJlLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vRGVzY3JpYmUuamF2YQppbmRleCA4YWExMTlhLi4xMTZkYjAzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vRGVzY3JpYmUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vRGVzY3JpYmUuamF2YQpAQCAtNDQsNiArNDQsOSBAQCBjbGFzcyBEZXNjcmliZSBleHRlbmRzIFRleHRCdWlsdGluIHsKIAlAT3B0aW9uKG5hbWUgPSAiLS1tYXRjaCIsIHVzYWdlID0gInVzYWdlX01hdGNoIiwgbWV0YVZhciA9ICJtZXRhVmFyX3BhdHRlcm4iKQogCXByaXZhdGUgTGlzdDxTdHJpbmc+IHBhdHRlcm5zID0gbmV3IEFycmF5TGlzdDw+KCk7CiAKKwlAT3B0aW9uKG5hbWUgPSAiLS1hYmJyZXYiLCB1c2FnZSA9ICJ1c2FnZV9BYmJyZXYiKQorCXByaXZhdGUgSW50ZWdlciBhYmJyZXY7CisKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQogCXByb3RlY3RlZCB2b2lkIHJ1bigpIHsKQEAgLTU3LDYgKzYwLDkgQEAgcHJvdGVjdGVkIHZvaWQgcnVuKCkgewogCQkJY21kLnNldFRhZ3ModXNlVGFncyk7CiAJCQljbWQuc2V0QWx3YXlzKGFsd2F5cyk7CiAJCQljbWQuc2V0TWF0Y2gocGF0dGVybnMudG9BcnJheShuZXcgU3RyaW5nWzBdKSk7CisJCQlpZiAoYWJicmV2ICE9IG51bGwpIHsKKwkJCQljbWQuc2V0QWJicmV2KGFiYnJldi5pbnRWYWx1ZSgpKTsKKwkJCX0KIAkJCVN0cmluZyByZXN1bHQgPSBudWxsOwogCQkJdHJ5IHsKIAkJCQlyZXN1bHQgPSBjbWQuY2FsbCgpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0RpZmZUb29sLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vRGlmZlRvb2wuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjg4ODE3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0RpZmZUb29sLmphdmEKQEAgLTAsMCArMSwyNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTgtMjAyMSwgQW5kcmUgQm9zc2VydCA8YW5kcmUuYm9zc2VydEBzaWVtZW5zLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5wZ207CisKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkhFQUQ7CisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKK2ltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5kaWZmLkRpZmZFbnRyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmRpZmYuRGlmZkZvcm1hdHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmRpcmNhY2hlLkRpckNhY2hlSXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuQW1iaWd1b3VzT2JqZWN0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLkluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuUmV2aXNpb25TeW50YXhFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5kaWZmbWVyZ2V0b29sLkRpZmZUb29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLmRpZmZtZXJnZXRvb2wuRXh0ZXJuYWxEaWZmVG9vbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5PYmplY3RJZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5PYmplY3RSZWFkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5UZXh0UHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLmludGVybmFsLkJvb2xlYW5UcmlTdGF0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnBnbS5pbnRlcm5hbC5DTElUZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucGdtLm9wdC5QYXRoVHJlZUZpbHRlckhhbmRsZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5BYnN0cmFjdFRyZWVJdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLkNhbm9uaWNhbFRyZWVQYXJzZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5GaWxlVHJlZUl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuZmlsdGVyLlRyZWVGaWx0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLlN0cmluZ1V0aWxzOworaW1wb3J0IG9yZy5rb2hzdWtlLmFyZ3M0ai5Bcmd1bWVudDsKK2ltcG9ydCBvcmcua29oc3VrZS5hcmdzNGouT3B0aW9uOworCitAQ29tbWFuZChuYW1lID0gImRpZmZ0b29sIiwgY29tbW9uID0gdHJ1ZSwgdXNhZ2UgPSAidXNhZ2VfRGlmZlRvb2wiKQorY2xhc3MgRGlmZlRvb2wgZXh0ZW5kcyBUZXh0QnVpbHRpbiB7CisJcHJpdmF0ZSBEaWZmRm9ybWF0dGVyIGRpZmZGbXQ7CisKKwlwcml2YXRlIERpZmZUb29scyBkaWZmVG9vbHM7CisKKwlAQXJndW1lbnQoaW5kZXggPSAwLCBtZXRhVmFyID0gIm1ldGFWYXJfdHJlZWlzaCIpCisJcHJpdmF0ZSBBYnN0cmFjdFRyZWVJdGVyYXRvciBvbGRUcmVlOworCisJQEFyZ3VtZW50KGluZGV4ID0gMSwgbWV0YVZhciA9ICJtZXRhVmFyX3RyZWVpc2giKQorCXByaXZhdGUgQWJzdHJhY3RUcmVlSXRlcmF0b3IgbmV3VHJlZTsKKworCUBPcHRpb24obmFtZSA9ICItLXRvb2wiLCBhbGlhc2VzID0geworCQkJIi10IiB9LCBtZXRhVmFyID0gIm1ldGFWYXJfdG9vbCIsIHVzYWdlID0gInVzYWdlX1Rvb2xGb3JEaWZmIikKKwlwcml2YXRlIFN0cmluZyB0b29sTmFtZTsKKworCUBPcHRpb24obmFtZSA9ICItLWNhY2hlZCIsIGFsaWFzZXMgPSB7ICItLXN0YWdlZCIgfSwgdXNhZ2UgPSAidXNhZ2VfY2FjaGVkIikKKwlwcml2YXRlIGJvb2xlYW4gY2FjaGVkOworCisJcHJpdmF0ZSBCb29sZWFuVHJpU3RhdGUgcHJvbXB0ID0gQm9vbGVhblRyaVN0YXRlLlVOU0VUOworCisJQE9wdGlvbihuYW1lID0gIi0tcHJvbXB0IiwgdXNhZ2UgPSAidXNhZ2VfcHJvbXB0IikKKwl2b2lkIHNldFByb21wdChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgYm9vbGVhbiBvbikgeworCQlwcm9tcHQgPSBCb29sZWFuVHJpU3RhdGUuVFJVRTsKKwl9CisKKwlAT3B0aW9uKG5hbWUgPSAiLS1uby1wcm9tcHQiLCBhbGlhc2VzID0geyAiLXkiIH0sIHVzYWdlID0gInVzYWdlX25vUHJvbXB0IikKKwl2b2lkIG5vUHJvbXB0KEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBib29sZWFuIG9uKSB7CisJCXByb21wdCA9IEJvb2xlYW5UcmlTdGF0ZS5GQUxTRTsKKwl9CisKKwlAT3B0aW9uKG5hbWUgPSAiLS10b29sLWhlbHAiLCB1c2FnZSA9ICJ1c2FnZV90b29sSGVscCIpCisJcHJpdmF0ZSBib29sZWFuIHRvb2xIZWxwOworCisJcHJpdmF0ZSBCb29sZWFuVHJpU3RhdGUgZ3VpID0gQm9vbGVhblRyaVN0YXRlLlVOU0VUOworCisJQE9wdGlvbihuYW1lID0gIi0tZ3VpIiwgYWxpYXNlcyA9IHsgIi1nIiB9LCB1c2FnZSA9ICJ1c2FnZV9EaWZmR3VpVG9vbCIpCisJdm9pZCBzZXRHdWkoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIGJvb2xlYW4gb24pIHsKKwkJZ3VpID0gQm9vbGVhblRyaVN0YXRlLlRSVUU7CisJfQorCisJQE9wdGlvbihuYW1lID0gIi0tbm8tZ3VpIiwgdXNhZ2UgPSAidXNhZ2Vfbm9HdWkiKQorCXZvaWQgbm9HdWkoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIGJvb2xlYW4gb24pIHsKKwkJZ3VpID0gQm9vbGVhblRyaVN0YXRlLkZBTFNFOworCX0KKworCXByaXZhdGUgQm9vbGVhblRyaVN0YXRlIHRydXN0RXhpdENvZGUgPSBCb29sZWFuVHJpU3RhdGUuVU5TRVQ7CisKKwlAT3B0aW9uKG5hbWUgPSAiLS10cnVzdC1leGl0LWNvZGUiLCB1c2FnZSA9ICJ1c2FnZV90cnVzdEV4aXRDb2RlIikKKwl2b2lkIHNldFRydXN0RXhpdENvZGUoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIGJvb2xlYW4gb24pIHsKKwkJdHJ1c3RFeGl0Q29kZSA9IEJvb2xlYW5UcmlTdGF0ZS5UUlVFOworCX0KKworCUBPcHRpb24obmFtZSA9ICItLW5vLXRydXN0LWV4aXQtY29kZSIsIHVzYWdlID0gInVzYWdlX25vVHJ1c3RFeGl0Q29kZSIpCisJdm9pZCBub1RydXN0RXhpdENvZGUoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIGJvb2xlYW4gb24pIHsKKwkJdHJ1c3RFeGl0Q29kZSA9IEJvb2xlYW5UcmlTdGF0ZS5GQUxTRTsKKwl9CisKKwlAT3B0aW9uKG5hbWUgPSAiLS0iLCBtZXRhVmFyID0gIm1ldGFWYXJfcGF0aHMiLCBoYW5kbGVyID0gUGF0aFRyZWVGaWx0ZXJIYW5kbGVyLmNsYXNzKQorCXByaXZhdGUgVHJlZUZpbHRlciBwYXRoRmlsdGVyID0gVHJlZUZpbHRlci5BTEw7CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0KFJlcG9zaXRvcnkgcmVwb3NpdG9yeSwgU3RyaW5nIGdpdERpcikgeworCQlzdXBlci5pbml0KHJlcG9zaXRvcnksIGdpdERpcik7CisJCWRpZmZGbXQgPSBuZXcgRGlmZkZvcm1hdHRlcihuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0ob3V0cykpOworCQlkaWZmVG9vbHMgPSBuZXcgRGlmZlRvb2xzKHJlcG9zaXRvcnkpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHJ1bigpIHsKKwkJdHJ5IHsKKwkJCWlmICh0b29sSGVscCkgeworCQkJCXNob3dUb29sSGVscCgpOworCQkJfSBlbHNlIHsKKwkJCQlib29sZWFuIHNob3dQcm9tcHQgPSBkaWZmVG9vbHMuaXNJbnRlcmFjdGl2ZSgpOworCQkJCWlmIChwcm9tcHQgIT0gQm9vbGVhblRyaVN0YXRlLlVOU0VUKSB7CisJCQkJCXNob3dQcm9tcHQgPSBwcm9tcHQgPT0gQm9vbGVhblRyaVN0YXRlLlRSVUU7CisJCQkJfQorCQkJCVN0cmluZyB0b29sTmFtZVByb21wdCA9IHRvb2xOYW1lOworCQkJCWlmIChzaG93UHJvbXB0KSB7CisJCQkJCWlmIChTdHJpbmdVdGlscy5pc0VtcHR5T3JOdWxsKHRvb2xOYW1lUHJvbXB0KSkgeworCQkJCQkJdG9vbE5hbWVQcm9tcHQgPSBkaWZmVG9vbHMuZ2V0RGVmYXVsdFRvb2xOYW1lKGd1aSk7CisJCQkJCX0KKwkJCQl9CisJCQkJLy8gZ2V0IHRoZSBjaGFuZ2VkIGZpbGVzCisJCQkJTGlzdDxEaWZmRW50cnk+IGZpbGVzID0gZ2V0RmlsZXMoKTsKKwkJCQlpZiAoZmlsZXMuc2l6ZSgpID4gMCkgeworCQkJCQljb21wYXJlKGZpbGVzLCBzaG93UHJvbXB0LCB0b29sTmFtZVByb21wdCk7CisJCQkJfQorCQkJfQorCQkJb3V0dy5mbHVzaCgpOworCQl9IGNhdGNoIChSZXZpc2lvblN5bnRheEV4Y2VwdGlvbiB8IElPRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IGRpZShlLmdldE1lc3NhZ2UoKSwgZSk7CisJCX0gZmluYWxseSB7CisJCQlkaWZmRm10LmNsb3NlKCk7CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgY29tcGFyZShMaXN0PERpZmZFbnRyeT4gZmlsZXMsIGJvb2xlYW4gc2hvd1Byb21wdCwKKwkJCVN0cmluZyB0b29sTmFtZVByb21wdCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJZm9yIChpbnQgZmlsZUluZGV4ID0gMDsgZmlsZUluZGV4IDwgZmlsZXMuc2l6ZSgpOyBmaWxlSW5kZXgrKykgeworCQkJRGlmZkVudHJ5IGVudCA9IGZpbGVzLmdldChmaWxlSW5kZXgpOworCQkJU3RyaW5nIG1lcmdlZEZpbGVQYXRoID0gZW50LmdldE5ld1BhdGgoKTsKKwkJCWlmIChtZXJnZWRGaWxlUGF0aC5lcXVhbHMoRGlmZkVudHJ5LkRFVl9OVUxMKSkgeworCQkJCW1lcmdlZEZpbGVQYXRoID0gZW50LmdldE9sZFBhdGgoKTsKKwkJCX0KKwkJCS8vIGNoZWNrIGlmIHVzZXIgd2FudHMgdG8gbGF1bmNoIGNvbXBhcmUKKwkJCWJvb2xlYW4gbGF1bmNoQ29tcGFyZSA9IHRydWU7CisJCQlpZiAoc2hvd1Byb21wdCkgeworCQkJCWxhdW5jaENvbXBhcmUgPSBpc0xhdW5jaENvbXBhcmUoZmlsZUluZGV4ICsgMSwgZmlsZXMuc2l6ZSgpLAorCQkJCQkJbWVyZ2VkRmlsZVBhdGgsIHRvb2xOYW1lUHJvbXB0KTsKKwkJCX0KKwkJCWlmIChsYXVuY2hDb21wYXJlKSB7CisJCQkJc3dpdGNoIChlbnQuZ2V0Q2hhbmdlVHlwZSgpKSB7CisJCQkJY2FzZSBNT0RJRlk6CisJCQkJCW91dHcucHJpbnRsbigiTVx0IiArIGVudC5nZXROZXdQYXRoKCkgLy8kTk9OLU5MUy0xJAorCQkJCQkJCSsgIiAoIiArIGVudC5nZXROZXdJZCgpLm5hbWUoKSArICIpIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQkJCQkrICJcdCIgKyBlbnQuZ2V0T2xkUGF0aCgpIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkrICIgKCIgKyBlbnQuZ2V0T2xkSWQoKS5uYW1lKCkgKyAiKSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQkJaW50IHJldCA9IGRpZmZUb29scy5jb21wYXJlKGVudC5nZXROZXdQYXRoKCksCisJCQkJCQkJZW50LmdldE9sZFBhdGgoKSwgZW50LmdldE5ld0lkKCkubmFtZSgpLAorCQkJCQkJCWVudC5nZXRPbGRJZCgpLm5hbWUoKSwgdG9vbE5hbWUsIHByb21wdCwgZ3VpLAorCQkJCQkJCXRydXN0RXhpdENvZGUpOworCQkJCQlpZiAocmV0ICE9IDApIHsKKwkJCQkJCXRocm93IGRpZShNZXNzYWdlRm9ybWF0LmZvcm1hdCgKKwkJCQkJCQkJQ0xJVGV4dC5nZXQoKS5kaWZmVG9vbERpZWQsIG1lcmdlZEZpbGVQYXRoKSk7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCUBTdXBwcmVzc1dhcm5pbmdzKCJib3hpbmciKQorCXByaXZhdGUgYm9vbGVhbiBpc0xhdW5jaENvbXBhcmUoaW50IGZpbGVJbmRleCwgaW50IGZpbGVDb3VudCwKKwkJCVN0cmluZyBmaWxlTmFtZSwgU3RyaW5nIHRvb2xOYW1lUHJvbXB0KSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlib29sZWFuIGxhdW5jaENvbXBhcmUgPSB0cnVlOworCQlvdXR3LnByaW50bG4oTWVzc2FnZUZvcm1hdC5mb3JtYXQoQ0xJVGV4dC5nZXQoKS5kaWZmVG9vbExhdW5jaCwKKwkJCQlmaWxlSW5kZXgsIGZpbGVDb3VudCwgZmlsZU5hbWUsIHRvb2xOYW1lUHJvbXB0KSk7CisJCW91dHcuZmx1c2goKTsKKwkJQnVmZmVyZWRSZWFkZXIgYnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoCisJCQkJbmV3IElucHV0U3RyZWFtUmVhZGVyKGlucywgU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCkpOworCQlTdHJpbmcgbGluZSA9IG51bGw7CisJCWlmICgobGluZSA9IGJyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKKwkJCWlmICghbGluZS5lcXVhbHNJZ25vcmVDYXNlKCJZIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCWxhdW5jaENvbXBhcmUgPSBmYWxzZTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbGF1bmNoQ29tcGFyZTsKKwl9CisKKwlwcml2YXRlIHZvaWQgc2hvd1Rvb2xIZWxwKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJU3RyaW5nQnVpbGRlciBhdmFpbGFibGVUb29sTmFtZXMgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCQlmb3IgKFN0cmluZyBuYW1lIDogZGlmZlRvb2xzLmdldEF2YWlsYWJsZVRvb2xzKCkua2V5U2V0KCkpIHsKKwkJCWF2YWlsYWJsZVRvb2xOYW1lcy5hcHBlbmQoU3RyaW5nLmZvcm1hdCgiXHRcdCVzXG4iLCBuYW1lKSk7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQlTdHJpbmdCdWlsZGVyIG5vdEF2YWlsYWJsZVRvb2xOYW1lcyA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisJCWZvciAoU3RyaW5nIG5hbWUgOiBkaWZmVG9vbHMuZ2V0Tm90QXZhaWxhYmxlVG9vbHMoKS5rZXlTZXQoKSkgeworCQkJbm90QXZhaWxhYmxlVG9vbE5hbWVzLmFwcGVuZChTdHJpbmcuZm9ybWF0KCJcdFx0JXNcbiIsIG5hbWUpKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJCVN0cmluZ0J1aWxkZXIgdXNlclRvb2xOYW1lcyA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisJCU1hcDxTdHJpbmcsIEV4dGVybmFsRGlmZlRvb2w+IHVzZXJUb29scyA9IGRpZmZUb29scworCQkJCS5nZXRVc2VyRGVmaW5lZFRvb2xzKCk7CisJCWZvciAoU3RyaW5nIG5hbWUgOiB1c2VyVG9vbHMua2V5U2V0KCkpIHsKKwkJCXVzZXJUb29sTmFtZXMuYXBwZW5kKFN0cmluZy5mb3JtYXQoIlx0XHQlcy5jbWQgJXNcbiIsIC8vJE5PTi1OTFMtMSQKKwkJCQkJbmFtZSwgdXNlclRvb2xzLmdldChuYW1lKS5nZXRDb21tYW5kKCkpKTsKKwkJfQorCQlvdXR3LnByaW50bG4oTWVzc2FnZUZvcm1hdC5mb3JtYXQoCisJCQkJQ0xJVGV4dC5nZXQoKS5kaWZmVG9vbEhlbHBTZXRUb0ZvbGxvd2luZywgYXZhaWxhYmxlVG9vbE5hbWVzLAorCQkJCXVzZXJUb29sTmFtZXMsIG5vdEF2YWlsYWJsZVRvb2xOYW1lcykpOworCX0KKworCXByaXZhdGUgTGlzdDxEaWZmRW50cnk+IGdldEZpbGVzKCkKKwkJCXRocm93cyBSZXZpc2lvblN5bnRheEV4Y2VwdGlvbiwgQW1iaWd1b3VzT2JqZWN0RXhjZXB0aW9uLAorCQkJSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworCQlkaWZmRm10LnNldFJlcG9zaXRvcnkoZGIpOworCQlpZiAoY2FjaGVkKSB7CisJCQlpZiAob2xkVHJlZSA9PSBudWxsKSB7CisJCQkJT2JqZWN0SWQgaGVhZCA9IGRiLnJlc29sdmUoSEVBRCArICJee3RyZWV9Iik7IC8vJE5PTi1OTFMtMSQKKwkJCQlpZiAoaGVhZCA9PSBudWxsKSB7CisJCQkJCWRpZShNZXNzYWdlRm9ybWF0LmZvcm1hdChDTElUZXh0LmdldCgpLm5vdEFUcmVlLCBIRUFEKSk7CisJCQkJfQorCQkJCUNhbm9uaWNhbFRyZWVQYXJzZXIgcCA9IG5ldyBDYW5vbmljYWxUcmVlUGFyc2VyKCk7CisJCQkJdHJ5IChPYmplY3RSZWFkZXIgcmVhZGVyID0gZGIubmV3T2JqZWN0UmVhZGVyKCkpIHsKKwkJCQkJcC5yZXNldChyZWFkZXIsIGhlYWQpOworCQkJCX0KKwkJCQlvbGRUcmVlID0gcDsKKwkJCX0KKwkJCW5ld1RyZWUgPSBuZXcgRGlyQ2FjaGVJdGVyYXRvcihkYi5yZWFkRGlyQ2FjaGUoKSk7CisJCX0gZWxzZSBpZiAob2xkVHJlZSA9PSBudWxsKSB7CisJCQlvbGRUcmVlID0gbmV3IERpckNhY2hlSXRlcmF0b3IoZGIucmVhZERpckNhY2hlKCkpOworCQkJbmV3VHJlZSA9IG5ldyBGaWxlVHJlZUl0ZXJhdG9yKGRiKTsKKwkJfSBlbHNlIGlmIChuZXdUcmVlID09IG51bGwpIHsKKwkJCW5ld1RyZWUgPSBuZXcgRmlsZVRyZWVJdGVyYXRvcihkYik7CisJCX0KKworCQlUZXh0UHJvZ3Jlc3NNb25pdG9yIHBtID0gbmV3IFRleHRQcm9ncmVzc01vbml0b3IoZXJydyk7CisJCXBtLnNldERlbGF5U3RhcnQoMiwgVGltZVVuaXQuU0VDT05EUyk7CisJCWRpZmZGbXQuc2V0UHJvZ3Jlc3NNb25pdG9yKHBtKTsKKwkJZGlmZkZtdC5zZXRQYXRoRmlsdGVyKHBhdGhGaWx0ZXIpOworCisJCUxpc3Q8RGlmZkVudHJ5PiBmaWxlcyA9IGRpZmZGbXQuc2NhbihvbGRUcmVlLCBuZXdUcmVlKTsKKwkJcmV0dXJuIGZpbGVzOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL01lcmdlLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vTWVyZ2UuamF2YQppbmRleCBjYTQ4NzdmLi4yN2EzZDkwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vTWVyZ2UuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vTWVyZ2UuamF2YQpAQCAtMTAsNiArMTAsOCBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQucGdtOwogCitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5PQkpFQ1RfSURfQUJCUkVWX1NUUklOR19MRU5HVEg7CisKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CkBAIC0xNDQsOCArMTQ2LDEwIEBAIHByb3RlY3RlZCB2b2lkIHJ1bigpIHsKIAkJCWNhc2UgRkFTVF9GT1JXQVJEOgogCQkJCU9iamVjdElkIG9sZEhlYWRJZCA9IG9sZEhlYWQuZ2V0T2JqZWN0SWQoKTsKIAkJCQlpZiAob2xkSGVhZElkICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIG9sZElkID0gb2xkSGVhZElkLmFiYnJldmlhdGUoNykubmFtZSgpOwotCQkJCQlTdHJpbmcgbmV3SWQgPSByZXN1bHQuZ2V0TmV3SGVhZCgpLmFiYnJldmlhdGUoNykubmFtZSgpOworCQkJCQlTdHJpbmcgb2xkSWQgPSBvbGRIZWFkSWQKKwkJCQkJCQkuYWJicmV2aWF0ZShPQkpFQ1RfSURfQUJCUkVWX1NUUklOR19MRU5HVEgpLm5hbWUoKTsKKwkJCQkJU3RyaW5nIG5ld0lkID0gcmVzdWx0LmdldE5ld0hlYWQoKQorCQkJCQkJCS5hYmJyZXZpYXRlKE9CSkVDVF9JRF9BQkJSRVZfU1RSSU5HX0xFTkdUSCkubmFtZSgpOwogCQkJCQlvdXR3LnByaW50bG4oTWVzc2FnZUZvcm1hdC5mb3JtYXQoQ0xJVGV4dC5nZXQoKS51cGRhdGluZywKIAkJCQkJCQlvbGRJZCwgbmV3SWQpKTsKIAkJCQl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vUmVmbG9nLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vUmVmbG9nLmphdmEKaW5kZXggMDMwMTE5ZS4uYzYzNTMyZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL1JlZmxvZy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9SZWZsb2cuamF2YQpAQCAtOSw2ICs5LDggQEAKICAqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LnBnbTsKIAoraW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuT0JKRUNUX0lEX0FCQlJFVl9TVFJJTkdfTEVOR1RIOworCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIApAQCAtNDUsNyArNDcsOCBAQCBwcm90ZWN0ZWQgdm9pZCBydW4oKSB7CiAKIAlwcml2YXRlIFN0cmluZyB0b1N0cmluZyhSZWZsb2dFbnRyeSBlbnRyeSwgaW50IGkpIHsKIAkJZmluYWwgU3RyaW5nQnVpbGRlciBzID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJcy5hcHBlbmQoZW50cnkuZ2V0TmV3SWQoKS5hYmJyZXZpYXRlKDcpLm5hbWUoKSk7CisJCXMuYXBwZW5kKGVudHJ5LmdldE5ld0lkKCkuYWJicmV2aWF0ZShPQkpFQ1RfSURfQUJCUkVWX1NUUklOR19MRU5HVEgpCisJCQkJLm5hbWUoKSk7CiAJCXMuYXBwZW5kKCIgIik7IC8vJE5PTi1OTFMtMSQKIAkJcy5hcHBlbmQocmVmID09IG51bGwgPyBDb25zdGFudHMuSEVBRCA6IFJlcG9zaXRvcnkuc2hvcnRlblJlZk5hbWUocmVmKSk7CiAJCXMuYXBwZW5kKCJAeyIgKyBpICsgIn06Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL2ludGVybmFsL0NMSVRleHQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9pbnRlcm5hbC9DTElUZXh0LmphdmEKaW5kZXggOGU0OWE3Ni4uN2ZlNWIwZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL2ludGVybmFsL0NMSVRleHQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vaW50ZXJuYWwvQ0xJVGV4dC5qYXZhCkBAIC0xMzYsNiArMTM2LDkgQEAgcHVibGljIHN0YXRpYyBTdHJpbmcgZmF0YWxFcnJvcihTdHJpbmcgbWVzc2FnZSkgewogCS8qKiovIHB1YmxpYyBTdHJpbmcgZGF0ZUluZm87CiAJLyoqKi8gcHVibGljIFN0cmluZyBkZWxldGVkQnJhbmNoOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgZGVsZXRlZFJlbW90ZUJyYW5jaDsKKwkvKioqLyBwdWJsaWMgU3RyaW5nIGRpZmZUb29sSGVscFNldFRvRm9sbG93aW5nOworCS8qKiovIHB1YmxpYyBTdHJpbmcgZGlmZlRvb2xMYXVuY2g7CisJLyoqKi8gcHVibGljIFN0cmluZyBkaWZmVG9vbERpZWQ7CiAJLyoqKi8gcHVibGljIFN0cmluZyBkb2VzTm90RXhpc3Q7CiAJLyoqKi8gcHVibGljIFN0cmluZyBkb250T3ZlcndyaXRlTG9jYWxDaGFuZ2VzOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgZXZlcnl0aGluZ1VwVG9EYXRlOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLmFnZW50L0JVSUxEIGIvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLmFnZW50L0JVSUxECmluZGV4IDBjOGNmODMuLmYyZTRkNTUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS5hZ2VudC9CVUlMRAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUuYWdlbnQvQlVJTEQKQEAgLTE3LDYgKzE3LDYgQEAKICAgICAgICAgIi8vbGliOnNsZjRqLWFwaSIsCiAgICAgICAgICIvL2xpYjpzc2hkLW9zZ2kiLAogICAgICAgICAiLy9vcmcuZWNsaXBzZS5qZ2l0OmpnaXQiLAotICAgICAgICAiLy9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGU6c3NoLWFwYWNoZSIKKyAgICAgICAgIi8vb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlOnNzaC1hcGFjaGUiLAogICAgIF0sCiApCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUuYWdlbnQvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUuYWdlbnQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKaW5kZXggM2ZkMGY1Mi4uMWE1NzQ2ZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLmFnZW50L01FVEEtSU5GL01BTklGRVNULk1GCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS5hZ2VudC9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMiwxNSArMiwxNSBAQAogQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgogQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZQogQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLmFnZW50O3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDYuMC4xLnF1YWxpZmllcgorQnVuZGxlLVZlcnNpb246IDYuMS4xLnF1YWxpZmllcgogQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IKLUZyYWdtZW50LUhvc3Q6IG9yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZTtidW5kbGUtdmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIKK0ZyYWdtZW50LUhvc3Q6IG9yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZTtidW5kbGUtdmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIKIEJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5CiBBdXRvbWF0aWMtTW9kdWxlLU5hbWU6IG9yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS5hZ2VudAogQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEphdmFTRS0xMQotSW1wb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LnNzaGQ7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5ubHM7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC51dGlsO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiCitJbXBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuc3NoZDt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lm5sczt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIKIFJlcXVpcmUtQnVuZGxlOiBjb20uc3VuLmpuYTtidW5kbGUtdmVyc2lvbj0iWzUuOC4wLDYuMC4wKSIsCiAgY29tLnN1bi5qbmEucGxhdGZvcm07YnVuZGxlLXZlcnNpb249Ils1LjguMCw2LjAuMCkiCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC50cmFuc3BvcnQuc3NoZC5hZ2VudC5jb25uZWN0b3I7dmVyc2lvbj0iNi4wLjEiO3gtaW50ZXJuYWw6PXRydWUKK0V4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnRyYW5zcG9ydC5zc2hkLmFnZW50LmNvbm5lY3Rvcjt2ZXJzaW9uPSI2LjEuMSI7eC1pbnRlcm5hbDo9dHJ1ZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLmFnZW50L01FVEEtSU5GL1NPVVJDRS1NQU5JRkVTVC5NRiBiL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS5hZ2VudC9NRVRBLUlORi9TT1VSQ0UtTUFOSUZFU1QuTUYKaW5kZXggODA4ZGU1My4uZDA2ZTZiMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLmFnZW50L01FVEEtSU5GL1NPVVJDRS1NQU5JRkVTVC5NRgorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUuYWdlbnQvTUVUQS1JTkYvU09VUkNFLU1BTklGRVNULk1GCkBAIC0zLDUgKzMsNSBAQAogQnVuZGxlLU5hbWU6IG9yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS5hZ2VudCAtIFNvdXJjZXMKIEJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS5hZ2VudC5zb3VyY2UKIEJ1bmRsZS1WZW5kb3I6IEVjbGlwc2Uub3JnIC0gSkdpdAotQnVuZGxlLVZlcnNpb246IDYuMC4xLnF1YWxpZmllcgotRWNsaXBzZS1Tb3VyY2VCdW5kbGU6IG9yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS5hZ2VudDt2ZXJzaW9uPSI2LjAuMS5xdWFsaWZpZXIiO3Jvb3RzPSIuIgorQnVuZGxlLVZlcnNpb246IDYuMS4xLnF1YWxpZmllcgorRWNsaXBzZS1Tb3VyY2VCdW5kbGU6IG9yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS5hZ2VudDt2ZXJzaW9uPSI2LjEuMS5xdWFsaWZpZXIiO3Jvb3RzPSIuIgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLmFnZW50L1JFQURNRS5tZCBiL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS5hZ2VudC9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ2MmEyZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS5hZ2VudC9SRUFETUUubWQKQEAgLTAsMCArMSw4MiBAQAorIyBKR2l0IFNTSCBhZ2VudCB0cmFuc3BvcnQgc3VwcG9ydCBmb3IgQXBhY2hlIE1JTkEgc3NoZAorCitUaGlzIGJ1bmRsZSBwcm92aWRlcyBvcHRpb25hbCBzdXBwb3J0IGZvciBjb21tdW5pY2F0aW5nIHdpdGggYW4gU1NIIGFnZW50Citmb3IgU1NIIG9yIFNGVFAgYXV0aGVudGljYXRpb24uIEl0IGlzIGFuIE9TR2kgZnJhZ21lbnQgZm9yIGJ1bmRsZQorW29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZV0oLi4vb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlL1JFQURNRS5tZCksCithbmQgaXQgcHJvdmlkZXMgdHJhbnNwb3J0cyBmb3IgbG9jYWwgY29tbXVuaWNhdGlvbiB3aXRoIFNTSCBhZ2VudHMuCisKKyMjIFN1cHBvcnRlZCBTU0ggYWdlbnQgdHJhbnNwb3J0cworCisjIyMgTGludXgsIE9TIFgsIEJTRAorCitPbiBMaW51eCwgT1MgWCwgYW5kIEJTRCwgdGhlIG9ubHkgdHJhbnNwb3J0IG1lY2hhbmlzbSBzdXBwb3J0ZWQgaXMgdGhlIHVzdWFsCitjb21tdW5pY2F0aW9uIHZpYSBhIFVuaXggZG9tYWluIHNvY2tldC4gVGhpcyBpcyB0aGUgb25seSBwcm90b2NvbCB0aGUgT3BlblNTSAorU1NIIGFnZW50IHN1cHBvcnRzLiBBIFVuaXggZG9tYWluIHNvY2tldCBhcHBlYXJzIGFzIGEgc3BlY2lhbCBmaWxlIGluIHRoZSBmaWxlCitzeXN0ZW07IHRoaXMgZmlsZSBuYW1lIGlzIHR5cGljYWxseSBhdmFpbGFibGUgaW4gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlCitgU1NIX0FVVEhfU09DS2AuCisKK1RoZSBTU0ggY29uZmlnIGBJZGVudGl0eUFnZW50YCBjYW4gYmUgc2V0IHRvIHRoaXMgc29ja2V0IGZpbGVuYW1lIHRvIHNwZWNpZnkKK2V4YWN0bHkgd2hpY2ggVW5peCBkb21haW4gc29ja2V0IHRvIHVzZSwgb3IgaXQgY2FuIGJlIHNldCB0byBgU1NIX0FVVEhfU09DS2AKK3RvIHVzZSB0aGUgdmFsdWUgZnJvbSB0aGF0IGVudmlyb25tZW50IHZhcmlhYmxlLiBJZiBgSWRlbnRpdHlBZ2VudGAgaXMgbm90IHNldAorYXQgYWxsLCBKR2l0IHVzZXMgYFNTSF9BVVRIX1NPQ0tgIGJ5IGRlZmF1bHQuIElmIHRoZSB2YXJpYWJsZSBpcyBub3Qgc2V0LCBubworU1NIIGFnZW50IHdpbGwgYmUgdXNlZC4gYElkZW50aXR5QWdlbnRgIGNhbiBhbHNvIGJlIHNldCB0byBgbm9uZWAgdG8gbm90IHVzZQorYW55IFNTSCBhZ2VudC4KKworIyMjIFdpbmRvd3MKKworT24gV2luZG93cywgdHdvIGRpZmZlcmVudCB0cmFuc3BvcnRzIGFyZSBzdXBwb3J0ZWQ6CisKKyogQSB0cmFuc3BvcnQgb3ZlciBhIFdpbmRvd3MgbmFtZWQgcGlwZS4gVGhpcyBpcyB1c2VkIGJ5IFdpbjMyLU9wZW5TU0gsIGFuZCBpcyBhdmFpbGFibGUgZm9yIFBhZ2VhbnQgc2luY2UgdmVyc2lvbiAwLjc1LgorKiBBIFBhZ2VhbnQtc3BlY2lmaWMgbGVnYWN5IHRyYW5zcG9ydCB2aWEgc2hhcmVkIG1lbW9yeTsgdXNlZnVsIGZvciBQYWdlYW50IGFuZCBHUEcncyBncGctYWdlbnQuCisKK1Bvc3NpYmxlIHNldHRpbmdzIG9mIGBJZGVudGl0eUFnZW50YCB0byBzZWxlY3QgYSBwYXJ0aWN1bGFyIHRyYW5zcG9ydCBhcmUKKworKiBgLy8uL3BpcGUvb3BlbnNzaC1zc2gtYWdlbnRgOiB0aGUgV2luZG93cyBuYW1lZCBwaXBlIG9mIFdpbjMyLU9wZW5TU0guCisqIGAvLy4vcGFnZWFudGA6IHRoZSBzaGFyZWQtbWVtb3J5IG1lY2hhbmlzbSBvZiBQYWdlYW50LgorKiBgbm9uZWA6IGRvIG5vdCB1c2UgYW55IFNTSCBhZ2VudC4KKyogYC8vLi9waXBlLyZsdDthbnlfdmFsaWRfcGlwZV9uYW1lPmA6IHVzZSBhIHNwZWNpZmljIFdpbmRvd3MgbmFtZWQgcGlwZS4KKworVGhlIGRlZmF1bHQgdHJhbnNwb3J0IG9uIFdpbmRvd3MgaWYgYElkZW50aXR5QWdlbnRgIGlzIG5vdCBzZXQgYXQgYWxsIGlzIHRoZQorUGFnZWFudCBzaGFyZWQtbWVtb3J5IHRyYW5zcG9ydC4gRW52aXJvbm1lbnQgdmFyaWFibGUgYFNTSF9BVVRIX1NPQ0tgIG5lZWRzCitub3QgYmUgc2V0IGZvciBQYWdlYW50LCBhbmQgX211c3Qgbm90XyBiZSBzZXQgZm9yIFdpbjMyLU9wZW5TU0guCisKK0l0IGlzIGFsc28gcG9zc2libGUgdG8gdXNlIGEgbmFtZWQgcGlwZSBhcyB0cmFuc3BvcnQgZm9yIFBhZ2VhbnQgKGFzIG9mCit2ZXJzaW9uIDAuNzUpLiBVbmZvcnR1bmF0ZWx5LCBQYWdlYW50IHVubmVjZXNzYXJpbHkgY3J5cHRvZ3JhcGhpY2FsbHkKK29iZnVzY2F0ZXMgdGhlIHBpcGUgbmFtZSwgc28gaXQgaXMgbm90IHBvc3NpYmxlIGZvciBKR2l0IHRvIGRldGVybWluZSBpdAorYXV0b21hdGljYWxseS4gVGhlIHBpcGUgbmFtZSBpcyBgcGFnZWFudC48dXNlciBuYW1lPi48c2hhMjU2PmAsIGZvciBpbnN0YW5jZQorYHBhZ2VhbnQubXlzZWxmLmM1Njg3NzM2YmE3NTVhNzBiMDAwOTU1Y2IxOTE2OThhZWQ3ZGIyMjFjMmIwNzEwMTk5ZWIxZjUyOTg5MjJhYjVgLgorQSB1c2VyIGNhbiBsb29rIHVwIHRoZSBuYW1lIGJ5IHN0YXJ0aW5nIFBhZ2VhbnQgYW5kIHRoZW4gcnVubmluZyB0aGUKK2NvbW1hbmQgYGRpciBcXC5ccGlwZVxcYCBpbiBhIGNvbW1hbmQgc2hlbGwuIE9uY2UgdGhlIG5hbWUgaXMga25vd24sIHNldHRpbmcKK2BJZGVudGl0eUFnZW50YCB0byB0aGUgcGlwZSBuYW1lIGFzCitgLy8uL3BpcGUvcGFnZWFudC5teXNlbGYuYzU2ODc3MzZiYTc1NWE3MGIwMDA5NTVjYjE5MTY5OGFlZDdkYjIyMWMyYjA3MTAxOTllYjFmNTI5ODkyMmFiNWAKK21ha2VzIEpHaXQgdXNlIHRoaXMgV2luZG93cyBuYW1lZCBwaXBlIGZvciBjb21tdW5pY2F0aW9uIHdpdGggUGFnZWFudC4KKworKFlvdSBjYW4gdXNlIGZvcndhcmQgc2xhc2hlcyBpbiB0aGUgYH4vLnNzaC9jb25maWdgIGZpbGUuIFNTSCBjb25maWcgZmlsZQorcGFyc2luZyBoYXMgaXRzIG93biBydWxlcyBhYm91dCBiYWNrc2xhc2hlcyBpbiBjb25maWcgZmlsZXM7IHdoaWNoIGFyZQordHJlYXRlZCBhcyBlc2NhcGUgY2hhcmFjdGVycyBpbiBzb21lIGNvbnRleHRzLiBXaXRoIGJhY2tzbGFzaGVzIG9uZSB3b3VsZAoraGF2ZSB0byB3cml0ZSwgZS5nLiwgYFxcXFwuXHBpcGVcb3BlbnNzaC1zc2gtYWdlbnRgLikKKworV2l0aCB0aGVzZSB0d28gdHJhbnNwb3J0IG1lY2hhbmlzbXMsIFBhZ2VhbnQgYW5kIFdpbjMyLU9wZW5TU0ggYXJlIHN1cHBvcnRlZC4KK0FzIGZvciBHUEc6IHRoZSBncGctYWdlbnQgY2FuIGJlIGNvbmZpZ3VyZWQgdG8gZW11bGF0ZSBzc2gtYWdlbnQgKHByZXN1bWFibHkKK3ZpYSBhIFdpblNvY2tldHMyICJVbml4IGRvbWFpbiBzb2NrZXQiIG9uIFdpbmRvd3MpIG9yIHRvIGVtdWxhdGUgUGFnZWFudAorKHVzaW5nIHRoZSBzaGFyZWQgbWVtb3J5IG1lY2hhbmlzbSkuIFJ1bm5pbmcgZ3BnLWFnZW50IHdpdGggdGhlCitgZW5hYmxlLXNzaC1zdXBwb3J0YCBvcHRpb24gaXMKK1tyZXBvcnRlZCBub3QgdG8gd29yayBvbiBXaW5kb3dzXShodHRwczovL2Rldi5nbnVwZy5vcmcvVDM4ODMpLCB0aG91Z2guIEJ1dAordGhlIFB1VFRZIGVtdWxhdGlvbiBpbiBncGctYWdlbnQgKG9wdGlvbiBgZW5hYmxlLXB1dHR5LXN1cHBvcnRgKSBfc2hvdWxkXyB3b3JrLAorc28gaXQgc2hvdWxkIGJlIHBvc3NpYmxlIHRvIHVzZSBncGctYWdlbnQgaW5zdGVhZCBvZiBQYWdlYW50LgorCitOZWl0aGVyIFBhZ2VhbnQgKGFzIG9mIHZlcnNpb24gMC43Nikgbm9yIFdpbjMyLU9wZW5TU0ggKGFzIG9mIHZlcnNpb24gOC42KQorc3VwcG9ydCB0aGUgYGNvbmZpcm1gIG9yIGxpZmV0aW1lIGNvbnN0cmFpbnRzIGZvciBgQWRkS2V5c1RvQWdlbnRgLiBncGctYWdlbnQKK2FwcGFyZW50bHkgZG9lcywgZXZlbiB3aGVuIGNvbW11bmljYXRpbmcgb3ZlciB0aGUgUGFnZWFudCBzaGFyZWQgbWVtb3J5CittZWNoYW5pc20uCisKK1RoZSBzc2gtYWdlbnQgZnJvbSBnaXQgYmFzaCBvbiBXaW5kb3dzIGlzIGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkLiBJdCB3b3VsZAorbmVlZCBhIGNvbm5lY3RvciBoYW5kbGluZyBDeWd3aW4gc29ja2V0IGZpbGVzIGFuZCB0aGUgQ3lnd2luIGhhbmRzaGFrZSBvdmVyCithIFRDUCBzdHJlYW0gc29ja2V0IGJvdW5kIHRvIHRoZSBsb29wYmFjayBpbnRlcmZhY2UuIFRoZSBDeWd3aW4gc29ja2V0IGZpbGUKK19pc18gZXhwb3NlZCBpbiB0aGUgV2luZG93cyBmaWxlIHN5c3RlbSBhdCAlVEVNUCVcc3NoLVhYWFhYWFhYWFhcYWdlbnQuJmx0O251bWJlcj4sCitidXQgaXQgZG9lcyBub3QgaGF2ZSBhIGZpeGVkIG5hbWUgKHRoZSBYJ3MgYW5kIHRoZSBudW1iZXIgYXJlIHZhcmlhYmxlIGFuZAorY2hhbmdlIGVhY2ggdGltZSBzc2gtYWdlbnQgaXMgc3RhcnRlZCkuCisKKyMjIEltcGxlbWVudGF0aW9uCisKK1RoZSBpbXBsZW1lbnRhdGlvbiBvZiBhbGwgdHJhbnNwb3J0cyB1c2VzIEpOQS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUuYWdlbnQvcG9tLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS5hZ2VudC9wb20ueG1sCmluZGV4IDFiZDNmYWQuLjc3YjljOTUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS5hZ2VudC9wb20ueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS5hZ2VudC9wb20ueG1sCkBAIC0xNyw3ICsxNyw3IEBACiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj42LjAuMS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8dmVyc2lvbj42LjEuMS1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPC9wYXJlbnQ+CiAKICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLmFnZW50PC9hcnRpZmFjdElkPgpAQCAtMTMyLDcgKzEzMiw2IEBACiAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KICAgICAgIDwvcGx1Z2luPgogCi0gICAgICA8IS0tIE5ldyBpbiA2LjA7IHVuY29tbWVudCBpbiA2LjEKICAgICAgIDxwbHVnaW4+CiAgICAgICAgICAgPGdyb3VwSWQ+Y29tLmdpdGh1Yi5zaW9tNzkuamFwaWNtcDwvZ3JvdXBJZD4KICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXBpY21wLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KQEAgLTE1NSw2ICsxNTQsOSBAQAogICAgICAgICAgICAgICAgICAgPGluY2x1ZGVzPgogICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPm9yZy5lY2xpcHNlLmpnaXQuKjwvaW5jbHVkZT4KICAgICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+CisgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+CisgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+Ki5pbnRlcm5hbC4qPC9leGNsdWRlPgorICAgICAgICAgICAgICAgICAgPC9leGNsdWRlcz4KICAgICAgICAgICAgICAgICAgIDxhY2Nlc3NNb2RpZmllcj5wdWJsaWM8L2FjY2Vzc01vZGlmaWVyPgogICAgICAgICAgICAgICAgICAgPGJyZWFrQnVpbGRPbk1vZGlmaWNhdGlvbnM+ZmFsc2U8L2JyZWFrQnVpbGRPbk1vZGlmaWNhdGlvbnM+CiAgICAgICAgICAgICAgICAgICA8YnJlYWtCdWlsZE9uQmluYXJ5SW5jb21wYXRpYmxlTW9kaWZpY2F0aW9ucz5mYWxzZTwvYnJlYWtCdWlsZE9uQmluYXJ5SW5jb21wYXRpYmxlTW9kaWZpY2F0aW9ucz4KQEAgLTE3NCwxMSArMTc2LDkgQEAKICAgICAgICAgICA8L2V4ZWN1dGlvbj4KICAgICAgICAgPC9leGVjdXRpb25zPgogICAgICAgPC9wbHVnaW4+Ci0gICAgICAtLT4KICAgICA8L3BsdWdpbnM+CiAgIDwvYnVpbGQ+CiAKLSAgPCEtLSBOZXcgaW4gNi4wLCB1bmNvbW1lbnQgaW4gNi4xCiAgIDxyZXBvcnRpbmc+CiAgICAgPHBsdWdpbnM+CiAgICAgICA8cGx1Z2luPgpAQCAtMjEwLDYgKzIxMCw5IEBACiAgICAgICAgICAgICAgICAgICA8aW5jbHVkZXM+CiAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+b3JnLmVjbGlwc2UuamdpdC4qPC9pbmNsdWRlPgogICAgICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KKyAgICAgICAgICAgICAgICAgIDxleGNsdWRlcz4KKyAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qLmludGVybmFsLio8L2V4Y2x1ZGU+CisgICAgICAgICAgICAgICAgICA8L2V4Y2x1ZGVzPgogICAgICAgICAgICAgICAgICAgPGFjY2Vzc01vZGlmaWVyPnB1YmxpYzwvYWNjZXNzTW9kaWZpZXI+CiAgICAgICAgICAgICAgICAgICA8YnJlYWtCdWlsZE9uTW9kaWZpY2F0aW9ucz5mYWxzZTwvYnJlYWtCdWlsZE9uTW9kaWZpY2F0aW9ucz4KICAgICAgICAgICAgICAgICAgIDxicmVha0J1aWxkT25CaW5hcnlJbmNvbXBhdGlibGVNb2RpZmljYXRpb25zPmZhbHNlPC9icmVha0J1aWxkT25CaW5hcnlJbmNvbXBhdGlibGVNb2RpZmljYXRpb25zPgpAQCAtMjIzLDUgKzIyNiw0IEBACiAgICAgICA8L3BsdWdpbj4KICAgICA8L3BsdWdpbnM+CiAgIDwvcmVwb3J0aW5nPgotICAtLT4KIDwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS5hZ2VudC9yZXNvdXJjZXMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoZC9hZ2VudC9jb25uZWN0b3IvVGV4dHMucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS5hZ2VudC9yZXNvdXJjZXMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoZC9hZ2VudC9jb25uZWN0b3IvVGV4dHMucHJvcGVydGllcwppbmRleCA2ZmNlMDgzLi5hM2I0ZTkxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUuYWdlbnQvcmVzb3VyY2VzL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvdHJhbnNwb3J0L3NzaGQvYWdlbnQvY29ubmVjdG9yL1RleHRzLnByb3BlcnRpZXMKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLmFnZW50L3Jlc291cmNlcy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3RyYW5zcG9ydC9zc2hkL2FnZW50L2Nvbm5lY3Rvci9UZXh0cy5wcm9wZXJ0aWVzCkBAIC0yLDkgKzIsMTEgQEAKIGVyckxhc3RFcnJvcj1TeXN0ZW0gbWVzc2FnZSBmb3IgZXJyb3IgezB9IGNvdWxkIG5vdCBiZSByZXRyaWV2ZWQsIGdvdCB7MX0KIGVyclJlbGVhc2VTaGFyZWRNZW1vcnk9Q2Fubm90IHJlbGVhc2Ugc2hhcmVkIG1lbW9yeTogezB9IC0gezF9CiBlcnJVbmtub3duPXVua25vd24gZXJyb3IKK2VyclVua25vd25JZGVudGl0eUFnZW50PUlkZW50aXR5QWdlbnQgJyd7MH0nJyB1bmtub3duCiBsb2dFcnJvckxvYWRMaWJyYXJ5PUNhbm5vdCBsb2FkIHNvY2tldCBsaWJyYXJ5OyBTU0ggYWdlbnQgc3VwcG9ydCBpcyBzd2l0Y2hlZCBvZmYKIG1zZ0Nsb3NlRmFpbGVkPUNhbm5vdCBjbG9zZSBTU0ggYWdlbnQgc29ja2V0IHswfQogbXNnQ29ubmVjdEZhaWxlZD1Db3VsZCBub3QgY29ubmVjdCB0byBTU0ggYWdlbnQgdmlhIHNvY2tldCAnJ3swfScnCittc2dDb25uZWN0UGlwZUZhaWxlZD1Db3VsZCBub3QgY29ubmVjdCB0byBTU0ggYWdlbnQgdmlhIHBpcGUgJyd7MH0nJwogbXNnTm9NYXBwZWRGaWxlPUNvdWxkIG5vdCBjcmVhdGUgZmlsZSBtYXBwaW5nOiB7MH0gLSB7MX0KIG1zZ05vU2hhcmVkTWVtb3J5PUNvdWxkIG5vdCBpbml0aWFsaXplIHNoYXJlZCBtZW1vcnk6IHswfSAtIHsxfQogbXNnUGFnZWFudFVuYXZhaWxhYmxlPUNvdWxkIG5vdCBjb25uZWN0IHRvIFBhZ2VhbnQKQEAgLTE1LDMgKzE3LDQgQEAKIG1zZ1Nob3J0UmVhZD1TaG9ydCByZWFkIGZyb20gU1NIIGFnZW50LCBleHBlY3RlZCB7MH2gYnl0ZXMsIGdvdCB7MX0gYnl0ZXM7IGxhc3QgcmVhZCgpIHJldHVybmVkIHsyfQogcGFnZWFudD1QYWdlYW50CiB1bml4RGVmYXVsdEFnZW50PXNzaC1hZ2VudAord2luT3BlblNzaD1XaW4zMiBPcGVuU1NICmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUuYWdlbnQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvdHJhbnNwb3J0L3NzaGQvYWdlbnQvY29ubmVjdG9yL0ZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS5hZ2VudC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoZC9hZ2VudC9jb25uZWN0b3IvRmFjdG9yeS5qYXZhCmluZGV4IGQ3NDA5YjAuLjFjZWUxYmUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS5hZ2VudC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoZC9hZ2VudC9jb25uZWN0b3IvRmFjdG9yeS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS5hZ2VudC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoZC9hZ2VudC9jb25uZWN0b3IvRmFjdG9yeS5qYXZhCkBAIC0xMSwxMSArMTEsMTUgQEAKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuc3NoZC5hZ2VudC5Db25uZWN0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuc3NoZC5hZ2VudC5Db25uZWN0b3JGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5TdHJpbmdVdGlsczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuU3lzdGVtUmVhZGVyOwogCiAvKioKQEAgLTI5LDcgKzMzLDIwIEBAIHB1YmxpYyBjbGFzcyBGYWN0b3J5IGltcGxlbWVudHMgQ29ubmVjdG9yRmFjdG9yeSB7CiAJcHVibGljIENvbm5lY3RvciBjcmVhdGUoU3RyaW5nIGlkZW50aXR5QWdlbnQsIEZpbGUgaG9tZURpcikKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWlmIChTeXN0ZW1SZWFkZXIuZ2V0SW5zdGFuY2UoKS5pc1dpbmRvd3MoKSkgewotCQkJcmV0dXJuIG5ldyBQYWdlYW50Q29ubmVjdG9yKCk7CisJCQlpZiAoU3RyaW5nVXRpbHMuaXNFbXB0eU9yTnVsbChpZGVudGl0eUFnZW50KSkgeworCQkJCS8vIERlZmF1bHQuCisJCQkJcmV0dXJuIG5ldyBQYWdlYW50Q29ubmVjdG9yKCk7CisJCQl9CisJCQlTdHJpbmcgd2luUGF0aCA9IGlkZW50aXR5QWdlbnQucmVwbGFjZSgnLycsICdcXCcpOworCQkJaWYgKFBhZ2VhbnRDb25uZWN0b3IuREVTQ1JJUFRPUi5nZXRJZGVudGl0eUFnZW50KCkKKwkJCQkJLmVxdWFsc0lnbm9yZUNhc2Uod2luUGF0aCkpIHsKKwkJCQlyZXR1cm4gbmV3IFBhZ2VhbnRDb25uZWN0b3IoKTsKKwkJCX0KKwkJCWlmICh3aW5QYXRoLnRvTG93ZXJDYXNlKExvY2FsZS5ST09UKS5zdGFydHNXaXRoKCJcXFxcLlxccGlwZVxcIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCXJldHVybiBuZXcgV2luUGlwZUNvbm5lY3Rvcih3aW5QYXRoKTsKKwkJCX0KKwkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdCgKKwkJCQkJVGV4dHMuZ2V0KCkuZXJyVW5rbm93bklkZW50aXR5QWdlbnQsIGlkZW50aXR5QWdlbnQpKTsKIAkJfQogCQlyZXR1cm4gbmV3IFVuaXhEb21haW5Tb2NrZXRDb25uZWN0b3IoaWRlbnRpdHlBZ2VudCk7CiAJfQpAQCAtNTUsNyArNzIsMTEgQEAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewogCSAqLwogCUBPdmVycmlkZQogCXB1YmxpYyBDb2xsZWN0aW9uPENvbm5lY3RvckRlc2NyaXB0b3I+IGdldFN1cHBvcnRlZENvbm5lY3RvcnMoKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b24oZ2V0RGVmYXVsdENvbm5lY3RvcigpKTsKKwkJaWYgKFN5c3RlbVJlYWRlci5nZXRJbnN0YW5jZSgpLmlzV2luZG93cygpKSB7CisJCQlyZXR1cm4gTGlzdC5vZihQYWdlYW50Q29ubmVjdG9yLkRFU0NSSVBUT1IsCisJCQkJCVdpblBpcGVDb25uZWN0b3IuREVTQ1JJUFRPUik7CisJCX0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLnNpbmdsZXRvbihVbml4RG9tYWluU29ja2V0Q29ubmVjdG9yLkRFU0NSSVBUT1IpOwogCX0KIAogCUBPdmVycmlkZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLmFnZW50L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3RyYW5zcG9ydC9zc2hkL2FnZW50L2Nvbm5lY3Rvci9MaWJyYXJ5SG9sZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUuYWdlbnQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvdHJhbnNwb3J0L3NzaGQvYWdlbnQvY29ubmVjdG9yL0xpYnJhcnlIb2xkZXIuamF2YQppbmRleCBiMDliNTVmLi4wYTU5MmQwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUuYWdlbnQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvdHJhbnNwb3J0L3NzaGQvYWdlbnQvY29ubmVjdG9yL0xpYnJhcnlIb2xkZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUuYWdlbnQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvdHJhbnNwb3J0L3NzaGQvYWdlbnQvY29ubmVjdG9yL0xpYnJhcnlIb2xkZXIuamF2YQpAQCAtNTMsNiArNTMsMTAgQEAgcHJpdmF0ZSBMaWJyYXJ5SG9sZGVyKCkgewogCQlrZXJuZWwgPSBLZXJuZWwzMi5JTlNUQU5DRTsKIAl9CiAKKwlTdHJpbmcgc3lzdGVtRXJyb3IoKSB7CisJCXJldHVybiBzeXN0ZW1FcnJvcigiW3swfV0gLSB7MX0iKTsgLy8kTk9OLU5MUy0xJAorCX0KKwogCVN0cmluZyBzeXN0ZW1FcnJvcihTdHJpbmcgcGF0dGVybikgewogCQlpbnQgbGFzdEVycm9yID0ga2VybmVsLkdldExhc3RFcnJvcigpOwogCQlTdHJpbmcgbXNnOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLmFnZW50L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3RyYW5zcG9ydC9zc2hkL2FnZW50L2Nvbm5lY3Rvci9QYWdlYW50Q29ubmVjdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUuYWdlbnQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvdHJhbnNwb3J0L3NzaGQvYWdlbnQvY29ubmVjdG9yL1BhZ2VhbnRDb25uZWN0b3IuamF2YQppbmRleCBiMGUzYmNlLi4xOTY4NGVjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUuYWdlbnQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvdHJhbnNwb3J0L3NzaGQvYWdlbnQvY29ubmVjdG9yL1BhZ2VhbnRDb25uZWN0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUuYWdlbnQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvdHJhbnNwb3J0L3NzaGQvYWdlbnQvY29ubmVjdG9yL1BhZ2VhbnRDb25uZWN0b3IuamF2YQpAQCAtMjYsNyArMjYsMTAgQEAgcHVibGljIGNsYXNzIFBhZ2VhbnRDb25uZWN0b3IgZXh0ZW5kcyBBYnN0cmFjdENvbm5lY3RvciB7CiAKIAkJQE92ZXJyaWRlCiAJCXB1YmxpYyBTdHJpbmcgZ2V0SWRlbnRpdHlBZ2VudCgpIHsKLQkJCXJldHVybiAicGFnZWFudCI7IC8vJE5PTi1OTFMtMSQKKwkJCS8vIFRoaXMgbXVzdCBiZSBhbiBhYnNvbHV0ZSBXaW5kb3dzIHBhdGggbmFtZSB0byBhdm9pZCB0aGF0CisJCQkvLyBPcGVuU3NoQ29uZmlnRmlsZSB0cmVhdHMgaXQgYXMgYSByZWxhdGl2ZSBwYXRoIG5hbWUuIFVzZSBhbiBVTkMKKwkJCS8vIG5hbWUgb24gbG9jYWxob3N0LCBsaWtlIGZvciBwaXBlcy4KKwkJCXJldHVybiAiXFxcXC5cXHBhZ2VhbnQiOyAvLyROT04tTkxTLTEkCiAJCX0KIAogCQlAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS5hZ2VudC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoZC9hZ2VudC9jb25uZWN0b3IvU29ja2V0cy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLmFnZW50L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3RyYW5zcG9ydC9zc2hkL2FnZW50L2Nvbm5lY3Rvci9Tb2NrZXRzLmphdmEKaW5kZXggM2Q5NWJkYi4uNTJjZjVmMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLmFnZW50L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3RyYW5zcG9ydC9zc2hkL2FnZW50L2Nvbm5lY3Rvci9Tb2NrZXRzLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLmFnZW50L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3RyYW5zcG9ydC9zc2hkL2FnZW50L2Nvbm5lY3Rvci9Tb2NrZXRzLmphdmEKQEAgLTI0LDExICsyNCw2IEBAIHByaXZhdGUgU29ja2V0cygpIHsKIAl9CiAKIAkvKioKLQkgKiBEZWZhdWx0IFNTSCBhZ2VudCBzb2NrZXQgZW52aXJvbm1lbnQgdmFyaWFibGUgbmFtZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlZfU1NIX0FVVEhfU09DSyA9ICJTU0hfQVVUSF9TT0NLIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCiAJICogRG9tYWluIGZvciBVbml4IGRvbWFpbiBzb2NrZXRzLgogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFGX1VOSVggPSAxOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLmFnZW50L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3RyYW5zcG9ydC9zc2hkL2FnZW50L2Nvbm5lY3Rvci9UZXh0cy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLmFnZW50L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3RyYW5zcG9ydC9zc2hkL2FnZW50L2Nvbm5lY3Rvci9UZXh0cy5qYXZhCmluZGV4IGZiNDViMzAuLmYzODdjNzYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS5hZ2VudC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoZC9hZ2VudC9jb25uZWN0b3IvVGV4dHMuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUuYWdlbnQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvdHJhbnNwb3J0L3NzaGQvYWdlbnQvY29ubmVjdG9yL1RleHRzLmphdmEKQEAgLTMxLDkgKzMxLDExIEBAIHB1YmxpYyBzdGF0aWMgVGV4dHMgZ2V0KCkgewogCS8qKiovIHB1YmxpYyBTdHJpbmcgZXJyTGFzdEVycm9yOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgZXJyUmVsZWFzZVNoYXJlZE1lbW9yeTsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGVyclVua25vd247CisJLyoqKi8gcHVibGljIFN0cmluZyBlcnJVbmtub3duSWRlbnRpdHlBZ2VudDsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGxvZ0Vycm9yTG9hZExpYnJhcnk7CiAJLyoqKi8gcHVibGljIFN0cmluZyBtc2dDbG9zZUZhaWxlZDsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIG1zZ0Nvbm5lY3RGYWlsZWQ7CisJLyoqKi8gcHVibGljIFN0cmluZyBtc2dDb25uZWN0UGlwZUZhaWxlZDsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIG1zZ05vTWFwcGVkRmlsZTsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIG1zZ05vU2hhcmVkTWVtb3J5OwogCS8qKiovIHB1YmxpYyBTdHJpbmcgbXNnUGFnZWFudFVuYXZhaWxhYmxlOwpAQCAtNDQsNSArNDYsNiBAQCBwdWJsaWMgc3RhdGljIFRleHRzIGdldCgpIHsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIG1zZ1Nob3J0UmVhZDsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIHBhZ2VhbnQ7CiAJLyoqKi8gcHVibGljIFN0cmluZyB1bml4RGVmYXVsdEFnZW50OworCS8qKiovIHB1YmxpYyBTdHJpbmcgd2luT3BlblNzaDsKIAogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLmFnZW50L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3RyYW5zcG9ydC9zc2hkL2FnZW50L2Nvbm5lY3Rvci9Vbml4RG9tYWluU29ja2V0Q29ubmVjdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUuYWdlbnQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvdHJhbnNwb3J0L3NzaGQvYWdlbnQvY29ubmVjdG9yL1VuaXhEb21haW5Tb2NrZXRDb25uZWN0b3IuamF2YQppbmRleCAzYjc1ZjNhLi45NWFjMzRmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUuYWdlbnQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvdHJhbnNwb3J0L3NzaGQvYWdlbnQvY29ubmVjdG9yL1VuaXhEb21haW5Tb2NrZXRDb25uZWN0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUuYWdlbnQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvdHJhbnNwb3J0L3NzaGQvYWdlbnQvY29ubmVjdG9yL1VuaXhEb21haW5Tb2NrZXRDb25uZWN0b3IuamF2YQpAQCAtMTEsMTAgKzExLDEwIEBACiAKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC50cmFuc3BvcnQuc3NoZC5hZ2VudC5jb25uZWN0b3IuU29ja2V0cy5BRl9VTklYOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnRyYW5zcG9ydC5zc2hkLmFnZW50LmNvbm5lY3Rvci5Tb2NrZXRzLkRFRkFVTFRfUFJPVE9DT0w7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwudHJhbnNwb3J0LnNzaGQuYWdlbnQuY29ubmVjdG9yLlNvY2tldHMuRU5WX1NTSF9BVVRIX1NPQ0s7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwudHJhbnNwb3J0LnNzaGQuYWdlbnQuY29ubmVjdG9yLlNvY2tldHMuU09DS19TVFJFQU07CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwudHJhbnNwb3J0LnNzaGQuYWdlbnQuY29ubmVjdG9yLlVuaXhTb2NrZXRzLkZEX0NMT0VYRUM7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwudHJhbnNwb3J0LnNzaGQuYWdlbnQuY29ubmVjdG9yLlVuaXhTb2NrZXRzLkZfU0VURkQ7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlNzaENvbnN0YW50cy5FTlZfU1NIX0FVVEhfU09DS0VUOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CkBAIC00Niw3ICs0Niw3IEBAIHB1YmxpYyBjbGFzcyBVbml4RG9tYWluU29ja2V0Q29ubmVjdG9yIGV4dGVuZHMgQWJzdHJhY3RDb25uZWN0b3IgewogCiAJCUBPdmVycmlkZQogCQlwdWJsaWMgU3RyaW5nIGdldElkZW50aXR5QWdlbnQoKSB7Ci0JCQlyZXR1cm4gRU5WX1NTSF9BVVRIX1NPQ0s7CisJCQlyZXR1cm4gRU5WX1NTSF9BVVRIX1NPQ0tFVDsKIAkJfQogCiAJCUBPdmVycmlkZQpAQCAtOTEsOCArOTEsOSBAQCBwcml2YXRlIHN0YXRpYyBzeW5jaHJvbml6ZWQgVW5peFNvY2tldHMgZ2V0TGlicmFyeSgpIHsKIAlwdWJsaWMgVW5peERvbWFpblNvY2tldENvbm5lY3RvcihTdHJpbmcgc29ja2V0RmlsZSkgewogCQlzdXBlcigpOwogCQlTdHJpbmcgZmlsZSA9IHNvY2tldEZpbGU7Ci0JCWlmIChTdHJpbmdVdGlscy5pc0VtcHR5T3JOdWxsKGZpbGUpKSB7Ci0JCQlmaWxlID0gU3lzdGVtUmVhZGVyLmdldEluc3RhbmNlKCkuZ2V0ZW52KEVOVl9TU0hfQVVUSF9TT0NLKTsKKwkJaWYgKFN0cmluZ1V0aWxzLmlzRW1wdHlPck51bGwoZmlsZSkKKwkJCQl8fCBFTlZfU1NIX0FVVEhfU09DS0VULmVxdWFscyhmaWxlKSkgeworCQkJZmlsZSA9IFN5c3RlbVJlYWRlci5nZXRJbnN0YW5jZSgpLmdldGVudihFTlZfU1NIX0FVVEhfU09DS0VUKTsKIAkJfQogCQl0aGlzLnNvY2tldEZpbGUgPSBmaWxlOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS5hZ2VudC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoZC9hZ2VudC9jb25uZWN0b3IvV2luUGlwZUNvbm5lY3Rvci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLmFnZW50L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3RyYW5zcG9ydC9zc2hkL2FnZW50L2Nvbm5lY3Rvci9XaW5QaXBlQ29ubmVjdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JhZDkwZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS5hZ2VudC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoZC9hZ2VudC9jb25uZWN0b3IvV2luUGlwZUNvbm5lY3Rvci5qYXZhCkBAIC0wLDAgKzEsMjE2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxLCBUaG9tYXMgV29sZiA8dGhvbWFzLndvbGZAcGFyYW5vci5jaD4gYW5kIG90aGVycworICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC50cmFuc3BvcnQuc3NoZC5hZ2VudC5jb25uZWN0b3I7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0Jvb2xlYW47CisKK2ltcG9ydCBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLlNzaEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5zc2hkLmFnZW50LkFic3RyYWN0Q29ubmVjdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LnNzaGQuYWdlbnQuQ29ubmVjdG9yRmFjdG9yeS5Db25uZWN0b3JEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5TdHJpbmdVdGlsczsKKworaW1wb3J0IGNvbS5zdW4uam5hLkxhc3RFcnJvckV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uc3VuLmpuYS5wbGF0Zm9ybS53aW4zMi5XaW5CYXNlOworaW1wb3J0IGNvbS5zdW4uam5hLnBsYXRmb3JtLndpbjMyLldpbkVycm9yOworaW1wb3J0IGNvbS5zdW4uam5hLnBsYXRmb3JtLndpbjMyLldpbk5UOworaW1wb3J0IGNvbS5zdW4uam5hLnBsYXRmb3JtLndpbjMyLldpbk5ULkhBTkRMRTsKK2ltcG9ydCBjb20uc3VuLmpuYS5wdHIuSW50QnlSZWZlcmVuY2U7CisKKy8qKgorICogQSBjb25uZWN0b3IgYmFzZWQgb24gSk5BIHVzaW5nIFdpbmRvd3MnIG5hbWVkIHBpcGVzIHRvIGNvbW11bmljYXRlIHdpdGggYW4KKyAqIHNzaCBhZ2VudC4gVGhpcyBpcyB1c2VkIGJ5IE1pY3Jvc29mdCdzIFdpbjMyLU9wZW5TU0ggcG9ydC4KKyAqLworcHVibGljIGNsYXNzIFdpblBpcGVDb25uZWN0b3IgZXh0ZW5kcyBBYnN0cmFjdENvbm5lY3RvciB7CisKKwkvLyBQaXBlIG5hbWVzIGFyZSwgbGlrZSBvdGhlciBmaWxlIG5hbWVzLCBjYXNlLWluc2Vuc2l0aXZlIG9uIFdpbmRvd3MuCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENBTk9OSUNBTF9QSVBFX05BTUUgPSAiXFxcXC5cXHBpcGVcXG9wZW5zc2gtc3NoLWFnZW50IjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICoge0BsaW5rIENvbm5lY3RvckRlc2NyaXB0b3J9IGZvciB0aGUge0BsaW5rIFBhZ2VhbnRDb25uZWN0b3J9LgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29ubmVjdG9yRGVzY3JpcHRvciBERVNDUklQVE9SID0gbmV3IENvbm5lY3RvckRlc2NyaXB0b3IoKSB7CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBTdHJpbmcgZ2V0SWRlbnRpdHlBZ2VudCgpIHsKKwkJCXJldHVybiBDQU5PTklDQUxfUElQRV9OQU1FOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheU5hbWUoKSB7CisJCQlyZXR1cm4gVGV4dHMuZ2V0KCkud2luT3BlblNzaDsKKwkJfQorCX07CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRklMRV9TSEFSRV9OT05FID0gMDsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGSUxFX0FUVFJJQlVURV9OT05FID0gMDsKKworCXByaXZhdGUgZmluYWwgU3RyaW5nIHBpcGVOYW1lOworCisJcHJpdmF0ZSBmaW5hbCBBdG9taWNCb29sZWFuIGNvbm5lY3RlZCA9IG5ldyBBdG9taWNCb29sZWFuKCk7CisKKwkvLyBJdCdzIGEgYnl0ZSBwaXBlLCBzbyB0aGUgbm9ybWFsIFdpbmRvd3MgZmlsZSBtZWNoYW5pc21zIGNhbiBiZSB1c2VkLgorCS8vIFdvdWxkIG9uZSBvZiB0aGUgc3RhbmRhcmQgSmF2YSBGaWxlIEkvTyBhYnN0cmFjdGlvbnMgd29yaz8KKwlwcml2YXRlIHZvbGF0aWxlIEhBTkRMRSBmaWxlSGFuZGxlOworCisJLyoqCisJICogQ3JlYXRlcyBhIHtAbGluayBXaW5QaXBlQ29ubmVjdG9yfSBmb3IgdGhlIGdpdmVuIG5hbWVkIHBpcGUuCisJICoKKwkgKiBAcGFyYW0gcGlwZU5hbWUKKwkgKiAgICAgICAgICAgIHRvIGNvbm5lY3QgdG8KKwkgKi8KKwlwdWJsaWMgV2luUGlwZUNvbm5lY3RvcihTdHJpbmcgcGlwZU5hbWUpIHsKKwkJdGhpcy5waXBlTmFtZSA9IHBpcGVOYW1lLnJlcGxhY2UoJy8nLCAnXFwnKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBjb25uZWN0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJaWYgKFN0cmluZ1V0aWxzLmlzRW1wdHlPck51bGwocGlwZU5hbWUpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJSEFORExFIGZpbGUgPSBmaWxlSGFuZGxlOworCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKwkJCWlmIChjb25uZWN0ZWQuZ2V0KCkpIHsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJCUxpYnJhcnlIb2xkZXIgbGlicyA9IExpYnJhcnlIb2xkZXIuZ2V0TGlicmFyeSgpOworCQkJaWYgKGxpYnMgPT0gbnVsbCkgeworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJCWZpbGUgPSBsaWJzLmtlcm5lbC5DcmVhdGVGaWxlKHBpcGVOYW1lLAorCQkJCQlXaW5OVC5HRU5FUklDX1JFQUQgfCBXaW5OVC5HRU5FUklDX1dSSVRFLCBGSUxFX1NIQVJFX05PTkUsCisJCQkJCW51bGwsIFdpbk5ULk9QRU5fRVhJU1RJTkcsIEZJTEVfQVRUUklCVVRFX05PTkUsIG51bGwpOworCQkJaWYgKGZpbGUgPT0gbnVsbCB8fCBmaWxlID09IFdpbkJhc2UuSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKKwkJCQlpbnQgZXJyb3JDb2RlID0gbGlicy5rZXJuZWwuR2V0TGFzdEVycm9yKCk7CisJCQkJaWYgKGVycm9yQ29kZSA9PSBXaW5FcnJvci5FUlJPUl9GSUxFX05PVF9GT1VORAorCQkJCQkJJiYgQ0FOT05JQ0FMX1BJUEVfTkFNRS5lcXVhbHNJZ25vcmVDYXNlKHBpcGVOYW1lKSkgeworCQkJCQkvLyBPcGVuU1NIIGFnZW50IG5vdCBydW5uaW5nLiBEb24ndCB0aHJvdy4KKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0KKwkJCQlMYXN0RXJyb3JFeGNlcHRpb24gY2F1c2UgPSBuZXcgTGFzdEVycm9yRXhjZXB0aW9uKAorCQkJCQkJbGlicy5zeXN0ZW1FcnJvcigpKTsKKwkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oTWVzc2FnZUZvcm1hdAorCQkJCQkJLmZvcm1hdChUZXh0cy5nZXQoKS5tc2dDb25uZWN0UGlwZUZhaWxlZCwgcGlwZU5hbWUpLAorCQkJCQkJY2F1c2UpOworCQkJfQorCQkJY29ubmVjdGVkLnNldCh0cnVlKTsKKwkJfQorCQlmaWxlSGFuZGxlID0gZmlsZTsKKwkJcmV0dXJuIGNvbm5lY3RlZC5nZXQoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlIQU5ETEUgZmlsZSA9IGZpbGVIYW5kbGU7CisJCWlmIChjb25uZWN0ZWQuZ2V0QW5kU2V0KGZhbHNlKSAmJiBmaWxlSGFuZGxlICE9IG51bGwpIHsKKwkJCWZpbGVIYW5kbGUgPSBudWxsOworCQkJTGlicmFyeUhvbGRlciBsaWJzID0gTGlicmFyeUhvbGRlci5nZXRMaWJyYXJ5KCk7CisJCQlib29sZWFuIHN1Y2Nlc3MgPSBsaWJzLmtlcm5lbC5DbG9zZUhhbmRsZShmaWxlKTsKKwkJCWlmICghc3VjY2VzcykgeworCQkJCUxhc3RFcnJvckV4Y2VwdGlvbiBjYXVzZSA9IG5ldyBMYXN0RXJyb3JFeGNlcHRpb24oCisJCQkJCQlsaWJzLnN5c3RlbUVycm9yKCkpOworCQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihNZXNzYWdlRm9ybWF0CisJCQkJCQkuZm9ybWF0KFRleHRzLmdldCgpLm1zZ0Nsb3NlRmFpbGVkLCBwaXBlTmFtZSksIGNhdXNlKTsKKwkJCX0KKwkJfQorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBieXRlW10gcnBjKGJ5dGUgY29tbWFuZCwgYnl0ZVtdIG1lc3NhZ2UpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXByZXBhcmVNZXNzYWdlKGNvbW1hbmQsIG1lc3NhZ2UpOworCQlIQU5ETEUgZmlsZSA9IGZpbGVIYW5kbGU7CisJCWlmICghY29ubmVjdGVkLmdldCgpIHx8IGZpbGUgPT0gbnVsbCkgeworCQkJLy8gTm8gdHJhbnNsYXRpb24sIGludGVybmFsIGVycm9yCisJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJOb3QgY29ubmVjdGVkIHRvIFNTSCBhZ2VudCIpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJTGlicmFyeUhvbGRlciBsaWJzID0gTGlicmFyeUhvbGRlci5nZXRMaWJyYXJ5KCk7CisJCXdyaXRlRnVsbHkobGlicywgZmlsZSwgbWVzc2FnZSk7CisJCS8vIE5vdyByZWNlaXZlIHRoZSByZXBseQorCQlieXRlW10gbGVuZ3RoQnVmID0gbmV3IGJ5dGVbNF07CisJCXJlYWRGdWxseShsaWJzLCBmaWxlLCBsZW5ndGhCdWYpOworCQlpbnQgbGVuZ3RoID0gdG9MZW5ndGgoY29tbWFuZCwgbGVuZ3RoQnVmKTsKKwkJYnl0ZVtdIHBheWxvYWQgPSBuZXcgYnl0ZVtsZW5ndGhdOworCQlyZWFkRnVsbHkobGlicywgZmlsZSwgcGF5bG9hZCk7CisJCXJldHVybiBwYXlsb2FkOworCX0KKworCXByaXZhdGUgdm9pZCB3cml0ZUZ1bGx5KExpYnJhcnlIb2xkZXIgbGlicywgSEFORExFIGZpbGUsIGJ5dGVbXSBtZXNzYWdlKQorCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJYnl0ZVtdIGJ1ZiA9IG1lc3NhZ2U7CisJCWludCB0b1dyaXRlID0gYnVmLmxlbmd0aDsKKwkJdHJ5IHsKKwkJCXdoaWxlICh0b1dyaXRlID4gMCkgeworCQkJCUludEJ5UmVmZXJlbmNlIHdyaXR0ZW4gPSBuZXcgSW50QnlSZWZlcmVuY2UoKTsKKwkJCQlib29sZWFuIHN1Y2Nlc3MgPSBsaWJzLmtlcm5lbC5Xcml0ZUZpbGUoZmlsZSwgYnVmLCBidWYubGVuZ3RoLAorCQkJCQkJd3JpdHRlbiwgbnVsbCk7CisJCQkJaWYgKCFzdWNjZXNzKSB7CisJCQkJCXRocm93IG5ldyBMYXN0RXJyb3JFeGNlcHRpb24obGlicy5zeXN0ZW1FcnJvcigpKTsKKwkJCQl9CisJCQkJaW50IGFjdHVhbGx5V3JpdHRlbiA9IHdyaXR0ZW4uZ2V0VmFsdWUoKTsKKwkJCQl0b1dyaXRlIC09IGFjdHVhbGx5V3JpdHRlbjsKKwkJCQlpZiAoYWN0dWFsbHlXcml0dGVuID4gMCAmJiB0b1dyaXRlID4gMCkgeworCQkJCQlidWYgPSBBcnJheXMuY29weU9mUmFuZ2UoYnVmLCBhY3R1YWxseVdyaXR0ZW4sIGJ1Zi5sZW5ndGgpOworCQkJCX0KKwkJCX0KKwkJfSBjYXRjaCAoTGFzdEVycm9yRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdCgKKwkJCQkJVGV4dHMuZ2V0KCkubXNnU2VuZEZhaWxlZCwgSW50ZWdlci50b1N0cmluZyhtZXNzYWdlLmxlbmd0aCksCisJCQkJCUludGVnZXIudG9TdHJpbmcodG9Xcml0ZSkpLCBlKTsKKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCByZWFkRnVsbHkoTGlicmFyeUhvbGRlciBsaWJzLCBIQU5ETEUgZmlsZSwgYnl0ZVtdIGRhdGEpCisJCQl0aHJvd3MgSU9FeGNlcHRpb24geworCQlpbnQgbiA9IDA7CisJCWludCBvZmZzZXQgPSAwOworCQl3aGlsZSAob2Zmc2V0IDwgZGF0YS5sZW5ndGggJiYgKG4gPSByZWFkKGxpYnMsIGZpbGUsIGRhdGEsIG9mZnNldCwKKwkJCQlkYXRhLmxlbmd0aCAtIG9mZnNldCkpID4gMCkgeworCQkJb2Zmc2V0ICs9IG47CisJCX0KKwkJaWYgKG9mZnNldCA8IGRhdGEubGVuZ3RoKSB7CisJCQl0aHJvdyBuZXcgU3NoRXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAorCQkJCQlUZXh0cy5nZXQoKS5tc2dTaG9ydFJlYWQsIEludGVnZXIudG9TdHJpbmcoZGF0YS5sZW5ndGgpLAorCQkJCQlJbnRlZ2VyLnRvU3RyaW5nKG9mZnNldCksIEludGVnZXIudG9TdHJpbmcobikpKTsKKwkJfQorCX0KKworCXByaXZhdGUgaW50IHJlYWQoTGlicmFyeUhvbGRlciBsaWJzLCBIQU5ETEUgZmlsZSwgYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwKKwkJCWludCBsZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXRyeSB7CisJCQlpbnQgdG9SZWFkID0gbGVuZ3RoOworCQkJSW50QnlSZWZlcmVuY2UgcmVhZCA9IG5ldyBJbnRCeVJlZmVyZW5jZSgpOworCQkJaWYgKG9mZnNldCA9PSAwKSB7CisJCQkJYm9vbGVhbiBzdWNjZXNzID0gbGlicy5rZXJuZWwuUmVhZEZpbGUoZmlsZSwgYnVmZmVyLCB0b1JlYWQsCisJCQkJCQlyZWFkLCBudWxsKTsKKwkJCQlpZiAoIXN1Y2Nlc3MpIHsKKwkJCQkJdGhyb3cgbmV3IExhc3RFcnJvckV4Y2VwdGlvbihsaWJzLnN5c3RlbUVycm9yKCkpOworCQkJCX0KKwkJCQlyZXR1cm4gcmVhZC5nZXRWYWx1ZSgpOworCQkJfQorCQkJYnl0ZVtdIGRhdGEgPSBuZXcgYnl0ZVtsZW5ndGhdOworCQkJYm9vbGVhbiBzdWNjZXNzID0gbGlicy5rZXJuZWwuUmVhZEZpbGUoZmlsZSwgYnVmZmVyLCB0b1JlYWQsIHJlYWQsCisJCQkJCW51bGwpOworCQkJaWYgKCFzdWNjZXNzKSB7CisJCQkJdGhyb3cgbmV3IExhc3RFcnJvckV4Y2VwdGlvbihsaWJzLnN5c3RlbUVycm9yKCkpOworCQkJfQorCQkJaW50IGFjdHVhbGx5UmVhZCA9IHJlYWQuZ2V0VmFsdWUoKTsKKwkJCWlmIChhY3R1YWxseVJlYWQgPiAwKSB7CisJCQkJU3lzdGVtLmFycmF5Y29weShkYXRhLCAwLCBidWZmZXIsIG9mZnNldCwgYWN0dWFsbHlSZWFkKTsKKwkJCX0KKwkJCXJldHVybiBhY3R1YWxseVJlYWQ7CisJCX0gY2F0Y2ggKExhc3RFcnJvckV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoCisJCQkJCVRleHRzLmdldCgpLm1zZ1JlYWRGYWlsZWQsIEludGVnZXIudG9TdHJpbmcobGVuZ3RoKSksIGUpOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUudGVzdC9NRVRBLUlORi9NQU5JRkVTVC5NRgppbmRleCA4ZmY5NzM1Li40MTFkNDNjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUudGVzdC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUudGVzdC9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMywzNCArMywzNCBAQAogQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZQogQXV0b21hdGljLU1vZHVsZS1OYW1lOiBvcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUudGVzdAogQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLnRlc3QKLUJ1bmRsZS1WZXJzaW9uOiA2LjAuMS5xdWFsaWZpZXIKK0J1bmRsZS1WZXJzaW9uOiA2LjEuMS5xdWFsaWZpZXIKIEJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yCiBCdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KIEJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKYXZhU0UtMTEKLUltcG9ydC1QYWNrYWdlOiBvcmcuYXBhY2hlLnNzaGQuY2xpZW50LmNvbmZpZy5ob3N0czt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuY29tbW9uO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5jb21tb24uYXV0aDt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLmNvbmZpZy5rZXlzO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5jb21tb24uaGVscGVyczt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLmtleDt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLmtleXByb3ZpZGVyO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5jb21tb24uc2Vzc2lvbjt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLnNpZ25hdHVyZTt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLnV0aWwubmV0O3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5jb21tb24udXRpbC5zZWN1cml0eTt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuY29yZTt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuc2VydmVyO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5zZXJ2ZXIuZm9yd2FyZDt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmFwaTt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnM7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC50cmFuc3BvcnQuc3NoZC5wcm94eTt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0O3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuanVuaXQuc3NoO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0O3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LnNzaGQ7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuc3NoZC5hZ2VudDt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCitJbXBvcnQtUGFja2FnZTogb3JnLmFwYWNoZS5zc2hkLmNsaWVudC5jb25maWcuaG9zdHM7dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbjt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLmF1dGg7dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5jb25maWcua2V5czt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLmhlbHBlcnM7dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5rZXg7dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5rZXlwcm92aWRlcjt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLnNlc3Npb247dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5zaWduYXR1cmU7dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi51dGlsLm5ldDt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLnV0aWwuc2VjdXJpdHk7dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLmNvcmU7dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLnNlcnZlcjt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuc2VydmVyLmZvcndhcmQ7dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5hcGk7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwudHJhbnNwb3J0LnNzaGQucHJveHk7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5qdW5pdDt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LnNzaDt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmxpYjt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5zc2hkO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LnNzaGQuYWdlbnQ7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC51dGlsO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAogIG9yZy5oYW1jcmVzdDt2ZXJzaW9uPSJbMS4xLjAsMy4wLjApIiwKICBvcmcuanVuaXQ7dmVyc2lvbj0iWzQuMTMsNS4wLjApIiwKICBvcmcuanVuaXQuZXhwZXJpbWVudGFsLnRoZW9yaWVzO3ZlcnNpb249Ils0LjEzLDUuMC4wKSIsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUudGVzdC9wb20ueG1sIGIvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLnRlc3QvcG9tLnhtbAppbmRleCBhODhkZGFmLi4zZTk4ZTMzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUudGVzdC9wb20ueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS50ZXN0L3BvbS54bWwKQEAgLTE3LDcgKzE3LDcgQEAKICAgPHBhcmVudD4KICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0PC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjYuMC4xLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjYuMS4xLVNOQVBTSE9UPC92ZXJzaW9uPgogICA8L3BhcmVudD4KIAogICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUudGVzdDwvYXJ0aWZhY3RJZD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9zc2hkL0FwYWNoZVNzaFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9zc2hkL0FwYWNoZVNzaFRlc3QuamF2YQppbmRleCBjY2FmOThjLi4zZDdjNzY1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvc3NoZC9BcGFjaGVTc2hUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L3NzaGQvQXBhY2hlU3NoVGVzdC5qYXZhCkBAIC0xMDcsNiArMTA3LDMyIEBAIHB1YmxpYyB2b2lkIHRlc3RFZDI1NTE5SG9zdEtleSgpIHRocm93cyBFeGNlcHRpb24gewogCQkJCSJJZGVudGl0eUZpbGUgIiArIHByaXZhdGVLZXkxLmdldEFic29sdXRlUGF0aCgpKTsKIAl9CiAKKwkvKioKKwkgKiBUZXN0IGZvciBTU0hELTEyMzEuIElmIGF1dGhlbnRpY2F0aW9uIGlzIGF0dGVtcHRlZCBmaXJzdCB3aXRoIGFuIFJTQSBrZXksCisJICogd2hpY2ggaXMgcmVqZWN0ZWQsIGFuZCB0aGVuIHdpdGggc29tZSBvdGhlciBrZXkgdHlwZSAoaGVyZSBlZDI1NTE5KSwKKwkgKiBhdXRoZW50aWNhdGlvbiBmYWlscyBpbiBidWcgU1NIRC0xMjMxLgorCSAqCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKiAgICAgICAgICAgICBvbiBlcnJvcnMKKwkgKiBAc2VlIDxhIGhyZWY9CisJICogICAgICAiaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9TU0hELTEyMzEiPlNTSEQtMTIzMTwvYT4KKwkgKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RXcm9uZ0tleUZpcnN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUZpbGUgdXNlcktleSA9IG5ldyBGaWxlKGdldFRlbXBvcmFyeURpcmVjdG9yeSgpLCAidXNlcmtleSIpOworCQljb3B5VGVzdFJlc291cmNlKCJpZF9lZDI1NTE5IiwgdXNlcktleSk7CisJCUZpbGUgcHVibGljS2V5ID0gbmV3IEZpbGUoZ2V0VGVtcG9yYXJ5RGlyZWN0b3J5KCksICJ1c2Vya2V5LnB1YiIpOworCQljb3B5VGVzdFJlc291cmNlKCJpZF9lZDI1NTE5LnB1YiIsIHB1YmxpY0tleSk7CisJCXNlcnZlci5zZXRUZXN0VXNlclB1YmxpY0tleShwdWJsaWNLZXkudG9QYXRoKCkpOworCQljbG9uZVdpdGgoInNzaDovL2dpdC9kb2VzbnRtYXR0ZXIiLCBkZWZhdWx0Q2xvbmVEaXIsIG51bGwsIC8vCisJCQkJIkhvc3QgZ2l0IiwgLy8KKwkJCQkiSG9zdE5hbWUgbG9jYWxob3N0IiwgLy8KKwkJCQkiUG9ydCAiICsgdGVzdFBvcnQsIC8vCisJCQkJIlVzZXIgIiArIFRFU1RfVVNFUiwgLy8KKwkJCQkiSWRlbnRpdHlGaWxlICIgKyBwcml2YXRlS2V5MS5nZXRBYnNvbHV0ZVBhdGgoKSwgLy8gUlNBCisJCQkJIklkZW50aXR5RmlsZSAiICsgdXNlcktleS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisJfQorCiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0SGFzaGVkS25vd25Ib3N0cygpIHRocm93cyBFeGNlcHRpb24gewogCQlhc3NlcnRUcnVlKCJGYWlsZWQgdG8gZGVsZXRlIGtub3duX2hvc3RzIiwga25vd25Ib3N0cy5kZWxldGUoKSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKaW5kZXggODFlMDFjYy4uNzNmZWFlYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtNiw5ICs2LDkgQEAKIEJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yCiBCdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KIEJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5Ci1CdW5kbGUtVmVyc2lvbjogNi4wLjEucXVhbGlmaWVyCitCdW5kbGUtVmVyc2lvbjogNi4xLjEucXVhbGlmaWVyCiBCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSmF2YVNFLTExCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC50cmFuc3BvcnQuc3NoZDt2ZXJzaW9uPSI2LjAuMSI7eC1pbnRlcm5hbDo9dHJ1ZTsKK0V4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnRyYW5zcG9ydC5zc2hkO3ZlcnNpb249IjYuMS4xIjt4LWludGVybmFsOj10cnVlOwogICB1c2VzOj0ib3JnLmFwYWNoZS5zc2hkLmNsaWVudCwKICAgIG9yZy5hcGFjaGUuc3NoZC5jbGllbnQuYXV0aCwKICAgIG9yZy5hcGFjaGUuc3NoZC5jbGllbnQuYXV0aC5rZXlib2FyZCwKQEAgLTIzLDcyICsyMyw3NSBAQAogICAgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5zaWduYXR1cmUsCiAgICBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLnV0aWwuYnVmZmVyLAogICAgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQiLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwudHJhbnNwb3J0LnNzaGQuYWdlbnQ7dmVyc2lvbj0iNi4wLjEiO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC50cmFuc3BvcnQuc3NoZC5hdXRoO3ZlcnNpb249IjYuMC4xIjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwudHJhbnNwb3J0LnNzaGQucHJveHk7dmVyc2lvbj0iNi4wLjEiO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS50ZXN0IiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5zc2hkO3ZlcnNpb249IjYuMC4xIjsKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnRyYW5zcG9ydC5zc2hkLmFnZW50O3ZlcnNpb249IjYuMS4xIjt4LWludGVybmFsOj10cnVlLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwudHJhbnNwb3J0LnNzaGQuYXV0aDt2ZXJzaW9uPSI2LjEuMSI7eC1pbnRlcm5hbDo9dHJ1ZSwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnRyYW5zcG9ydC5zc2hkLnByb3h5O3ZlcnNpb249IjYuMS4xIjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUudGVzdCIsCisgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuc3NoZDt2ZXJzaW9uPSI2LjEuMSI7CiAgIHVzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydCwKICAgIG9yZy5hcGFjaGUuc3NoZC5jbGllbnQuY29uZmlnLmhvc3RzLAogICAgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5rZXlwcm92aWRlciwKICAgIG9yZy5lY2xpcHNlLmpnaXQudXRpbCwKICAgIG9yZy5hcGFjaGUuc3NoZC5jbGllbnQuc2Vzc2lvbiwKICAgIG9yZy5hcGFjaGUuc3NoZC5jbGllbnQua2V5dmVyaWZpZXIiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LnNzaGQuYWdlbnQ7dmVyc2lvbj0iNi4wLjEiCisgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuc3NoZC5hZ2VudDt2ZXJzaW9uPSI2LjEuMSIKIEltcG9ydC1QYWNrYWdlOiBuZXQuaTJwLmNyeXB0by5lZGRzYTt2ZXJzaW9uPSJbMC4zLjAsMC40LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuYWdlbnQ7dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLmNsaWVudDt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuY2xpZW50LmF1dGg7dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLmNsaWVudC5hdXRoLmtleWJvYXJkO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5jbGllbnQuYXV0aC5wYXNzd29yZDt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuY2xpZW50LmF1dGgucHVia2V5O3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5jbGllbnQuY2hhbm5lbDt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuY2xpZW50LmNvbmZpZy5ob3N0czt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuY2xpZW50LmNvbmZpZy5rZXlzO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5jbGllbnQuZnV0dXJlO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5jbGllbnQua2V5dmVyaWZpZXI7dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLmNsaWVudC5zZXNzaW9uO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5jbGllbnQuc2Vzc2lvbi5mb3J3YXJkO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5jb21tb247dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5hdXRoO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5jb21tb24uY2hhbm5lbDt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLmNvbXByZXNzaW9uO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5jb21tb24uY29uZmlnLmtleXM7dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5jb25maWcua2V5cy5sb2FkZXI7dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5jb25maWcua2V5cy5sb2FkZXIub3BlbnNzaC5rZGY7dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5kaWdlc3Q7dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5mb3J3YXJkO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5jb21tb24uZnV0dXJlO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5jb21tb24uaGVscGVyczt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLmlvO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5jb21tb24ua2V4O3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5jb21tb24ua2V4LmV4dGVuc2lvbjt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLmtleC5leHRlbnNpb24ucGFyc2VyO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5jb21tb24ua2V5cHJvdmlkZXI7dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5tYWM7dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5yYW5kb207dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5zZXNzaW9uO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5jb21tb24uc2Vzc2lvbi5oZWxwZXJzO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5jb21tb24uc2lnbmF0dXJlO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5jb21tb24udXRpbDt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLnV0aWwuYnVmZmVyO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5jb21tb24udXRpbC5jbG9zZWFibGU7dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi51dGlsLmlvO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5jb21tb24udXRpbC5pby5mdW5jdG9yczt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLnV0aWwuaW8ucmVzb3VyY2U7dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi51dGlsLmxvZ2dpbmc7dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi51dGlsLm5ldDt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLnV0aWwuc2VjdXJpdHk7dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLmNvcmU7dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLnNlcnZlci5hdXRoO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5zZnRwO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5zZnRwLmNsaWVudDt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuc2Z0cC5jb21tb247dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5hbm5vdGF0aW9uczt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmVycm9yczt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmZubWF0Y2g7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC50cmFuc3BvcnQuc3NoO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubmxzO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0O3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudXRpbDt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuYWdlbnQ7dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLmNsaWVudDt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY2xpZW50LmF1dGg7dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLmNsaWVudC5hdXRoLmtleWJvYXJkO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jbGllbnQuYXV0aC5wYXNzd29yZDt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY2xpZW50LmF1dGgucHVia2V5O3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jbGllbnQuY2hhbm5lbDt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY2xpZW50LmNvbmZpZy5ob3N0czt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY2xpZW50LmNvbmZpZy5rZXlzO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jbGllbnQuZnV0dXJlO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jbGllbnQua2V5dmVyaWZpZXI7dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLmNsaWVudC5zZXNzaW9uO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jbGllbnQuc2Vzc2lvbi5mb3J3YXJkO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jb21tb247dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5hdXRoO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jb21tb24uY2hhbm5lbDt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLmNvbXByZXNzaW9uO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jb21tb24uY29uZmlnLmtleXM7dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5jb25maWcua2V5cy5sb2FkZXI7dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5jb25maWcua2V5cy5sb2FkZXIub3BlbnNzaC5rZGY7dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5jb25maWcua2V5cy51MmY7dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5kaWdlc3Q7dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5mb3J3YXJkO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jb21tb24uZnV0dXJlO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jb21tb24uaGVscGVyczt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLmlvO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jb21tb24ua2V4O3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jb21tb24ua2V4LmV4dGVuc2lvbjt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLmtleC5leHRlbnNpb24ucGFyc2VyO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jb21tb24ua2V5cHJvdmlkZXI7dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5tYWM7dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5yYW5kb207dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5zZXNzaW9uO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jb21tb24uc2Vzc2lvbi5oZWxwZXJzO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jb21tb24uc2lnbmF0dXJlO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jb21tb24udXRpbDt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLnV0aWwuYnVmZmVyO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jb21tb24udXRpbC5idWZmZXIua2V5czt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLnV0aWwuY2xvc2VhYmxlO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jb21tb24udXRpbC5pbzt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLnV0aWwuaW8uZGVyO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jb21tb24udXRpbC5pby5mdW5jdG9yczt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLnV0aWwuaW8ucmVzb3VyY2U7dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi51dGlsLmxvZ2dpbmc7dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi51dGlsLm5ldDt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLnV0aWwuc2VjdXJpdHk7dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLmNvcmU7dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLnNlcnZlci5hdXRoO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5zZnRwO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5zZnRwLmNsaWVudDt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuc2Z0cC5jb21tb247dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5hbm5vdGF0aW9uczt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmVycm9yczt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmZubWF0Y2g7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC50cmFuc3BvcnQuc3NoO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubmxzO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0O3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudXRpbDt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKICBvcmcuc2xmNGo7dmVyc2lvbj0iWzEuNy4wLDIuMC4wKSIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS9NRVRBLUlORi9TT1VSQ0UtTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUvTUVUQS1JTkYvU09VUkNFLU1BTklGRVNULk1GCmluZGV4IGI3NzBiOTAuLjlmZWZhNmUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS9NRVRBLUlORi9TT1VSQ0UtTUFOSUZFU1QuTUYKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlL01FVEEtSU5GL1NPVVJDRS1NQU5JRkVTVC5NRgpAQCAtMyw1ICszLDUgQEAKIEJ1bmRsZS1OYW1lOiBvcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUgLSBTb3VyY2VzCiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUuc291cmNlCiBCdW5kbGUtVmVuZG9yOiBFY2xpcHNlLm9yZyAtIEpHaXQKLUJ1bmRsZS1WZXJzaW9uOiA2LjAuMS5xdWFsaWZpZXIKLUVjbGlwc2UtU291cmNlQnVuZGxlOiBvcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGU7dmVyc2lvbj0iNi4wLjEucXVhbGlmaWVyIjtyb290cz0iLiIKK0J1bmRsZS1WZXJzaW9uOiA2LjEuMS5xdWFsaWZpZXIKK0VjbGlwc2UtU291cmNlQnVuZGxlOiBvcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGU7dmVyc2lvbj0iNi4xLjEucXVhbGlmaWVyIjtyb290cz0iLiIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS9SRUFETUUubWQgYi9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUvUkVBRE1FLm1kCmluZGV4IGNiYTg3YWMuLmYwNmIyZjYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS9SRUFETUUubWQKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlL1JFQURNRS5tZApAQCAtNDMsNiArNDMsNTMgQEAKICAgLmNhbGwoKTsKIGBgYAogCisjIyBTdXBwb3J0IGZvciBTU0ggYWdlbnRzCisKK1RoZXJlIGV4aXN0IHR3byBJRVRGIGRyYWZ0IFJGQ3MgZm9yIGNvbW11bmljYXRpb24gd2l0aCBhbiBTU0ggYWdlbnQ6CisKKyogYW4gb2xkZXIgW1NTSDEgcHJvdG9jb2xdKGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9kcmFmdC1pZXRmLXNlY3NoLWFnZW50LTAyKSB0aGF0IGNhbiBkZWFsIG9ubHkgd2l0aCBEU0EgYW5kIFJTQSBrZXlzLCBhbmQKKyogYSBuZXdlciBbU1NIMiBwcm90b2NvbF0oaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL2RyYWZ0LW1pbGxlci1zc2gtYWdlbnQtMDQpIChmcm9tIE9wZW5TU0gpLgorCitKR2l0IG9ubHkgc3VwcG9ydHMgdGhlIG5ld2VyIE9wZW5TU0ggcHJvdG9jb2wuCisKK0NvbW11bmljYXRpb24gd2l0aCBhbiBTU0ggYWdlbnQgY2FuIG9jY3VyIG92ZXIgYW55IHRyYW5zcG9ydCBwcm90b2NvbCwgYW5kIGRpZmZlcmVudAorU1NIIGFnZW50cyBtYXkgdXNlIGRpZmZlcmVudCB0cmFuc3BvcnRzIGZvciBsb2NhbCBjb21tdW5pY2F0aW9uLiBKR2l0IHByb3ZpZGVzIHNvbWUKK3RyYW5zcG9ydHMgdmlhIHRoZSBbb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLmFnZW50XSguLi9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUuYWdlbnQvUkVBRE1FLm1kKQorZnJhZ21lbnQsIHdoaWNoIGFyZSBkaXNjb3ZlcmVkIGZyb20gYG9yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZWAgYWxzbyB2aWEgdGhlIGBTZXJ2aWNlTG9hZGVyYCBtZWNoYW5pc207Cit0aGUgU1BJIChzZXJ2aWNlIHByb3ZpZGVyIGludGVyZmFjZSkgaXMgYG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LnNzaGQuYWdlbnQuQ29ubmVjdG9yRmFjdG9yeWAuCisKK0lmIHN1Y2ggYSBgQ29ubmVjdG9yRmFjdG9yeWAgaW1wbGVtZW50YXRpb24gaXMgZm91bmQsIEpHaXQgbWF5IHVzZSBhbiBTU0ggYWdlbnQuIElmIG5vbmUKK2lzIGF2YWlsYWJsZSwgSkdpdCBjYW5ub3QgY29tbXVuaWNhdGUgd2l0aCBhbiBTU0ggYWdlbnQsIGFuZCB3aWxsIG5vdCBhdHRlbXB0IHRvIHVzZSBvbmUuCisKKyMjIyBTU0ggY29uZmlndXJhdGlvbnMgZm9yIFNTSCBhZ2VudHMKKworVGhlcmUgYXJlIHNldmVyYWwgU1NIIHByb3BlcnRpZXMgdGhhdCBjYW4gYmUgdXNlZCBpbiB0aGUgYH4vLnNzaC9jb25maWdgIGZpbGUgdG8gY29uZmlndXJlCit0aGUgdXNlIG9mIGFuIFNTSCBhZ2VudC4gRm9yIHRoZSBkZXRhaWxzLCBzZWUgdGhlIFtPcGVuQlNEIHNzaC1jb25maWcgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9tYW4ub3BlbmJzZC5vcmcvc3NoX2NvbmZpZy41KS4KKworKiAqKkFkZEtleXNUb0FnZW50KiogY2FuIGJlIHNldCB0byBgbm9gLCBgeWVzYCwgb3IgYGFza2AuIElmIHNldCB0byBgeWVzYCwga2V5cyB3aWxsIGJlIGFkZGVkCisgIHRvIHRoZSBhZ2VudCBpZiB0aGV5J3JlIG5vdCB5ZXQgaW4gdGhlIGFnZW50LiBJZiBzZXQgdG8gYGFza2AsIHRoZSB1c2VyIHdpbGwgYmUgcHJvbXB0ZWQKKyAgYmVmb3JlIGRvaW5nIHNvLCBhbmQgY2FuIG9wdCBvdXQgb2YgYWRkaW5nIHRoZSBrZXkuIEpHaXQgYWxzbyBzdXBwb3J0cyB0aGUgYWRkaXRpb25hbAorICBzZXR0aW5ncyBgY29uZmlybWAgYW5kIGtleSBsaWZldGltZXMuCisqICoqSWRlbnRpdHlBZ2VudCoqIGNhbiBiZSBzZXQgdG8gY2hvb3NlIHdoaWNoIFNTSCBhZ2VudCB0byB1c2UsIGlmIHRoZXJlIGFyZSBzZXZlcmFsIHJ1bm5pbmcuCisgIEl0IGNhbiBhbHNvIGJlIHNldCB0byBgbm9uZWAgdG8gZXhwbGljaXRseSBzd2l0Y2ggb2ZmIHVzaW5nIGFuIFNTSCBhZ2VudCBhdCBhbGwuCisqICoqSWRlbnRpdGllc09ubHkqKiBpZiBzZXQgdG8gYHllc2AgYW5kIGFuIFNTSCBhZ2VudCBpcyB1c2VkLCBvbmx5IGtleXMgZnJvbSB0aGUgYWdlbnQgdGhhdCBhcmUKKyAgYWxzbyBsaXN0ZWQgaW4gYW4gYElkZW50aXR5RmlsZWAgcHJvcGVydHkgd2lsbCBiZSBjb25zaWRlcmVkLiAoSXQnbGwgYWxzbyBzd2l0Y2ggb2ZmIHRyeWluZworICBkZWZhdWx0IGtleSBuYW1lcywgc3VjaCBhcyBgfi8uc3NoL2lkX3JzYWAgb3IgYH4vLnNzaC9pZF9lZDI1NTE5YDsgb25seSBrZXlzIGxpc3RlZCBleHBsaWNpdGx5CisgIHdpbGwgYmUgdXNlZC4pCisKKyMjIyBMaW1pdGF0aW9ucworCitBcyBtZW50aW9uZWQgYWJvdmUgSkdpdCBvbmx5IGltcGxlbWVudHMgdGhlIG5ld2VyIE9wZW5TU0ggcHJvdG9jb2wuIE9wZW5TU0ggZnVsbHkgaW1wbGVtZW50cyB0aGlzLAorYnV0IHNvbWUgb3RoZXIgU1NIIGFnZW50cyBvbmx5IG9mZmVyIHBhcnRpYWwgaW1wbGVtZW50YXRpb25zLiBJbiBwYXJ0aWN1bGFyIG9uIFdpbmRvd3MsIG5laXRoZXIKK1BhZ2VhbnQgbm9yIFdpbjMyLU9wZW5TU0ggaW1wbGVtZW50IHRoZSBgY29uZmlybWAgb3IgbGlmZXRpbWUgY29uc3RyYWludHMgZm9yIGBBZGRLZXlzVG9BZ2VudGAuIFdpdGgKK3N1Y2ggU1NIIGFnZW50cywgdGhlc2Ugc2V0dGluZ3Mgc2hvdWxkIG5vdCBiZSB1c2VkIGluIGB+Ly5zc2gvY29uZmlnYC4gR1BHJ3MgZ3BnLWFnZW50IGNhbiBiZSBydW4KK3dpdGggb3B0aW9uIGBlbmFibGVfcHV0dHlfc3VwcG9ydGAgYW5kIGNhbiB0aGVuIGJlIHVzZWQgYXMgYSBQYWdlYW50IHJlcGxhY2VtZW50LiBncGctYWdlbnQgYXBwZWFycwordG8gc3VwcG9ydCB0aGVzZSBrZXkgY29uc3RyYWludHMuCisKK09wZW5TU0ggZG9lcyBub3QgaW1wbGVtZW50IGVkNDQ4IGtleXMsIGFuZCBuZWl0aGVyIGRvZXMgQXBhY2hlIE1JTkEgc3NoZCwgYW5kIGhlbmNlIHN1Y2gga2V5cyBhcmUKK25vdCBzdXBwb3J0ZWQgaW4gSkdpdCBpZiBpdHMgYnVpbHQtaW4gU1NIIGltcGxlbWVudGF0aW9uIGlzIHVzZWQuIGVkNDQ4IG9yIG90aGVyIHVuc3VwcG9ydGVkIGtleXMKK3Byb3ZpZGVkIGJ5IGFuIFNTSCBhZ2VudCBhcmUgaWdub3JlZC4KKwogIyMgVXNpbmcgYSBkaWZmZXJlbnQgU1NIIGltcGxlbWVudGF0aW9uCiAKIFRvIHVzZSBhIGRpZmZlcmVudCBTU0ggaW1wbGVtZW50YXRpb246CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUvcG9tLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS9wb20ueG1sCmluZGV4IDM0MGNjYTEuLjY3NGM3YTQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS9wb20ueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS9wb20ueG1sCkBAIC0xNyw3ICsxNyw3IEBACiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj42LjAuMS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8dmVyc2lvbj42LjEuMS1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPC9wYXJlbnQ+CiAKICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlPC9hcnRpZmFjdElkPgpAQCAtNTAsNiArNTAsMTYgQEAKICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuc3NoZDwvZ3JvdXBJZD4KICAgICAgIDxhcnRpZmFjdElkPnNzaGQtc2Z0cDwvYXJ0aWZhY3RJZD4KICAgICAgIDx2ZXJzaW9uPiR7YXBhY2hlLXNzaGQtdmVyc2lvbn08L3ZlcnNpb24+CisgICAgICA8ZXhjbHVzaW9ucz4KKyAgICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLnNzaGQ8L2dyb3VwSWQ+CisgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnNzaGQtY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLnNzaGQ8L2dyb3VwSWQ+CisgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnNzaGQtY29tbW9uPC9hcnRpZmFjdElkPgorICAgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgPC9leGNsdXNpb25zPgogICAgIDwvZGVwZW5kZW5jeT4KIAogICAgIDxkZXBlbmRlbmN5PgpAQCAtMTU0LDYgKzE2NCw5IEBACiAgICAgICAgICAgICAgICAgICA8aW5jbHVkZXM+CiAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+b3JnLmVjbGlwc2UuamdpdC4qPC9pbmNsdWRlPgogICAgICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KKyAgICAgICAgICAgICAgICAgIDxleGNsdWRlcz4KKyAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qLmludGVybmFsLio8L2V4Y2x1ZGU+CisgICAgICAgICAgICAgICAgICA8L2V4Y2x1ZGVzPgogICAgICAgICAgICAgICAgICAgPGFjY2Vzc01vZGlmaWVyPnB1YmxpYzwvYWNjZXNzTW9kaWZpZXI+CiAgICAgICAgICAgICAgICAgICA8YnJlYWtCdWlsZE9uTW9kaWZpY2F0aW9ucz5mYWxzZTwvYnJlYWtCdWlsZE9uTW9kaWZpY2F0aW9ucz4KICAgICAgICAgICAgICAgICAgIDxicmVha0J1aWxkT25CaW5hcnlJbmNvbXBhdGlibGVNb2RpZmljYXRpb25zPmZhbHNlPC9icmVha0J1aWxkT25CaW5hcnlJbmNvbXBhdGlibGVNb2RpZmljYXRpb25zPgpAQCAtMjA3LDYgKzIyMCw5IEBACiAgICAgICAgICAgICAgICAgICA8aW5jbHVkZXM+CiAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+b3JnLmVjbGlwc2UuamdpdC4qPC9pbmNsdWRlPgogICAgICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KKyAgICAgICAgICAgICAgICAgIDxleGNsdWRlcz4KKyAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qLmludGVybmFsLio8L2V4Y2x1ZGU+CisgICAgICAgICAgICAgICAgICA8L2V4Y2x1ZGVzPgogICAgICAgICAgICAgICAgICAgPGFjY2Vzc01vZGlmaWVyPnB1YmxpYzwvYWNjZXNzTW9kaWZpZXI+CiAgICAgICAgICAgICAgICAgICA8YnJlYWtCdWlsZE9uTW9kaWZpY2F0aW9ucz5mYWxzZTwvYnJlYWtCdWlsZE9uTW9kaWZpY2F0aW9ucz4KICAgICAgICAgICAgICAgICAgIDxicmVha0J1aWxkT25CaW5hcnlJbmNvbXBhdGlibGVNb2RpZmljYXRpb25zPmZhbHNlPC9icmVha0J1aWxkT25CaW5hcnlJbmNvbXBhdGlibGVNb2RpZmljYXRpb25zPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlL3Jlc291cmNlcy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3RyYW5zcG9ydC9zc2hkL1NzaGRUZXh0LnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUvcmVzb3VyY2VzL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvdHJhbnNwb3J0L3NzaGQvU3NoZFRleHQucHJvcGVydGllcwppbmRleCAyYmJhNzM2Li40ZjczNWJhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUvcmVzb3VyY2VzL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvdHJhbnNwb3J0L3NzaGQvU3NoZFRleHQucHJvcGVydGllcworKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUvcmVzb3VyY2VzL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvdHJhbnNwb3J0L3NzaGQvU3NoZFRleHQucHJvcGVydGllcwpAQCAtMSw1ICsxLDYgQEAKIGF1dGhlbnRpY2F0aW9uQ2FuY2VsZWQ9U1NIIGF1dGhlbnRpY2F0aW9uIGNhbmNlbGVkOiBubyBwYXNzd29yZCBnaXZlbgogYXV0aGVudGljYXRpb25PbkNsb3NlZFNlc3Npb249QXV0aGVudGljYXRpb24gY2FuY2VsZWQ6IHNlc3Npb24gaXMgYWxyZWFkeSBjbG9zaW5nIG9yIGNsb3NlZAorY2Fubm90UmVhZFB1YmxpY0tleT1DYW5ub3QgcmVhZCBwdWJsaWMga2V5IGZyb20gZmlsZSB7MH0KIGNsb3NlTGlzdGVuZXJGYWlsZWQ9U3NoIHNlc3Npb24gY2xvc2UgbGlzdGVuZXIgZmFpbGVkCiBjb25maWdJbnZhbGlkUGF0aD1JbnZhbGlkIHBhdGggaW4gc3NoIGNvbmZpZyBrZXkgezB9OiB7MX0KIGNvbmZpZ0ludmFsaWRQYXR0ZXJuPUludmFsaWQgcGF0dGVybiBpbiBzc2ggY29uZmlnIGtleSB7MH06IHsxfQpAQCAtNzcsNiArNzgsOCBAQAogcHJveHlTb2Nrc1VuZXhwZWN0ZWRNZXNzYWdlPVVuZXhwZWN0ZWQgbWVzc2FnZSByZWNlaXZlZCBmcm9tIFNPQ0tTNSBwcm94eSB7MH07IGNsaWVudCBzdGF0ZSB7MX06IHsyfQogcHJveHlTb2Nrc1VuZXhwZWN0ZWRWZXJzaW9uPUV4cGVjdGVkIFNPQ0tTIHZlcnNpb24gNSwgZ290IHswfQogcHJveHlTb2Nrc1VzZXJuYW1lVG9vTG9uZz1Vc2VyIG5hbWUgZm9yIHByb3h5IHswfSBtdXN0IGJlIGF0IG1vc3QgMjU1IGJ5dGVzIGxvbmcsIGlzIHsxfSBieXRlczogezJ9CitwdWJrZXlBdXRoQWRkS2V5VG9BZ2VudEVycm9yPUNvdWxkIG5vdCBhZGQgezB9IGtleSB3aXRoIGZpbmdlcnByaW50IHsxfSB0byB0aGUgU1NIIGFnZW50CitwdWJrZXlBdXRoQWRkS2V5VG9BZ2VudFF1ZXN0aW9uPUFkZCB0aGUgezB9IGtleSB3aXRoIGZpbmdlcnByaW50IHsxfSB0byB0aGUgU1NIIGFnZW50PwogcHVia2V5QXV0aFdyb25nQ29tbWFuZD1QdWJsaWMga2V5IGF1dGhlbnRpY2F0aW9uIHJlY2VpdmVkIHVua25vd24gU1NIIGNvbW1hbmQgezB9IGZyb20gezF9ICh7Mn0pCiBwdWJrZXlBdXRoV3JvbmdLZXk9UHVibGljIGtleSBhdXRoZW50aWNhdGlvbiByZWNlaXZlZCB3cm9uZyBrZXk7IHNlbnQgezB9LCBnb3QgYmFjayB7MX0gZnJvbSB7Mn0gKHszfSkKIHB1YmtleUF1dGhXcm9uZ1NpZ25hdHVyZUFsZ29yaXRobT1QdWJsaWMga2V5IGF1dGhlbnRpY2F0aW9uIHJlcXVlc3RlZCBzaWduYXR1cmUgdHlwZSB7MH0gYnV0IGdvdCBiYWNrIHsxfSBmcm9tIHsyfSAoezN9KQpAQCAtODUsOSArODgsMTMgQEAKIHNlcnZlcklkV2l0aE51bD1TZXJ2ZXIgaWRlbnRpZmljYXRpb24gY29udGFpbnMgYSBOVUwgY2hhcmFjdGVyOiB7MH0KIHNlc3Npb25DbG9zZUZhaWxlZD1DbG9zaW5nIHRoZSBzZXNzaW9uIGZhaWxlZAogc2Vzc2lvbldpdGhvdXRVc2VybmFtZT1TU0ggc2Vzc2lvbiBjcmVhdGVkIHdpdGhvdXQgdXNlciBuYW1lOyBjYW5ub3QgYXV0aGVudGljYXRlCitzc2hBZ2VudEVkRFNBRm9ybWF0RXJyb3I9Q2Fubm90IGFkZCBlZDI1NTE5IGtleSB0byB0aGUgU1NIIGFnZW50IGJlY2F1c2UgaXQgaXMgZW5jb2RlZCBhcyB7MH0gaW5zdGVhZCBvZiBQS0NTIzgKK3NzaEFnZW50UGF5bG9hZExlbmd0aEVycm9yPUV4cGVjdGVkIHswLGNob2ljZSwwI25vIGJ5dGVzfDEjb25lIGJ5dGV8MTx7MH0gYnl0ZXN9IGJ1dCBnb3QgezF9CiBzc2hBZ2VudFJlcGx5TGVuZ3RoRXJyb3I9SW52YWxpZCBTU0ggYWdlbnQgcmVwbHkgbWVzc2FnZSBsZW5ndGggezB9IGFmdGVyIGNvbW1hbmQgezF9CiBzc2hBZ2VudFJlcGx5VW5leHBlY3RlZD1VbmV4cGVjdGVkIHJlcGx5IGZyb20gc3NoLWFnZW50OiB7MH0KIHNzaEFnZW50U2hvcnRSZWFkQnVmZmVyPVNob3J0IHJlYWQgZnJvbSBTU0ggYWdlbnQKK3NzaEFnZW50VW5rbm93bktleT1TU0ggYWdlbnQgZGVsaXZlcmVkIGEga2V5IHRoYXQgY2Fubm90IGJlIGhhbmRsZWQKK3NzaEFnZW50V3JvbmdLZXlMZW5ndGg9U1NIIGFnZW50IGRlbGl2ZXJlZCBpbGxvZ2ljYWwga2V5IGxlbmd0aCB7MH0gYXQgb2Zmc2V0IHsxfSBpbiBidWZmZXIgb2YgbGVuZ3RoIHsyfQogc3NoQWdlbnRXcm9uZ051bWJlck9mS2V5cz1JbnZhbGlkIG51bWJlciBvZiBTU0ggYWdlbnQga2V5czogezB9CiBzc2hDbG9zaW5nRG93bj1BcGFjaGUgTUlOQSBzc2hkIHNlc3Npb24gZmFjdG9yeSBpcyBjbG9zaW5nIGRvd247IGNhbm5vdCBjcmVhdGUgbmV3IHNzaCBzZXNzaW9ucyBvbiB0aGlzIGZhY3RvcnkKIHNzaENvbW1hbmRUaW1lb3V0PXswfSB0aW1lZCBvdXQgYWZ0ZXIgezF9IHNlY29uZHMgd2hpbGUgb3BlbmluZyB0aGUgY2hhbm5lbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3RyYW5zcG9ydC9zc2hkL0pHaXRDbGllbnRTZXNzaW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvdHJhbnNwb3J0L3NzaGQvSkdpdENsaWVudFNlc3Npb24uamF2YQppbmRleCBlMmRiYjRjLi41MTAwYmM5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvdHJhbnNwb3J0L3NzaGQvSkdpdENsaWVudFNlc3Npb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvdHJhbnNwb3J0L3NzaGQvSkdpdENsaWVudFNlc3Npb24uamF2YQpAQCAtNDIsNyArNDIsNiBAQAogaW1wb3J0IG9yZy5hcGFjaGUuc3NoZC5jb21tb24uaW8uSW9Xcml0ZUZ1dHVyZTsKIGltcG9ydCBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLmtleC5CdWlsdGluREhGYWN0b3JpZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5rZXguREhGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuc3NoZC5jb21tb24ua2V4LktleFByb3Bvc2FsT3B0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuc3NoZC5jb21tb24ua2V4LktleUV4Y2hhbmdlRmFjdG9yeTsKIGltcG9ydCBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLmtleC5leHRlbnNpb24uS2V4RXh0ZW5zaW9uSGFuZGxlcjsKIGltcG9ydCBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLmtleC5leHRlbnNpb24uS2V4RXh0ZW5zaW9uSGFuZGxlci5BdmFpbGFiaWxpdHlQaGFzZTsKQEAgLTE5OSwyNCArMTk4LDYgQEAgcHVibGljIHZvaWQgbWVzc2FnZVJlY2VpdmVkKFJlYWRhYmxlIGJ1ZmZlcikgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCX0KIAl9CiAKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgTWFwPEtleFByb3Bvc2FsT3B0aW9uLCBTdHJpbmc+IHNldE5lZ290aWF0aW9uUmVzdWx0KAotCQkJTWFwPEtleFByb3Bvc2FsT3B0aW9uLCBTdHJpbmc+IGd1ZXNzKSB7Ci0JCU1hcDxLZXhQcm9wb3NhbE9wdGlvbiwgU3RyaW5nPiByZXN1bHQgPSBzdXBlci5zZXROZWdvdGlhdGlvblJlc3VsdCgKLQkJCQlndWVzcyk7Ci0JCS8vIFRoaXMgc2hvdWxkIGJlIGRvYWJsZSB3aXRoIGEgU2Vzc2lvbkxpc3RlbmVyLCB0b28sIGJ1dCBJIGRvbid0IHNlZQotCQkvLyBob3cgdG8gYWRkIGEgbGlzdGVuZXIgaW4gdGltZSB0byBjYXRjaCB0aGUgbmVnb3RpYXRpb24gZW5kIGZvciBzdXJlCi0JCS8vIGdpdmVuIHRoYXQgdGhlIHN1cGVyLWNvbnN0cnVjdG9yIGFscmVhZHkgc3RhcnRzIEtFWC4KLQkJLy8KLQkJLy8gVE9ETzogVGhpcyBvdmVycmlkZSBjYW4gYmUgcmVtb3ZlZCBvbmNlIHdlIHVzZSBzc2hkIDIuOC4wLgotCQlpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLQkJCXJlc3VsdC5mb3JFYWNoKChvcHRpb24sIHZhbHVlKSAtPiBsb2cuZGVidWcoCi0JCQkJCSJzZXROZWdvdGlhdGlvblJlc3VsdCh7fSkgS2V4OiB7fSA9IHt9IiwgdGhpcywgLy8kTk9OLU5MUy0xJAotCQkJCQlvcHRpb24uZ2V0RGVzY3JpcHRpb24oKSwgdmFsdWUpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQogCVNldDxTdHJpbmc+IGdldEFsbEF2YWlsYWJsZVNpZ25hdHVyZUFsZ29yaXRobXMoKSB7CiAJCVNldDxTdHJpbmc+IGFsbEF2YWlsYWJsZSA9IG5ldyBIYXNoU2V0PD4oKTsKIAkJQnVpbHRpblNpZ25hdHVyZXMuVkFMVUVTLmZvckVhY2gocyAtPiBhbGxBdmFpbGFibGUuYWRkKHMuZ2V0TmFtZSgpKSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvdHJhbnNwb3J0L3NzaGQvSkdpdFB1YmxpY0tleUF1dGhlbnRpY2F0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvdHJhbnNwb3J0L3NzaGQvSkdpdFB1YmxpY0tleUF1dGhlbnRpY2F0aW9uLmphdmEKaW5kZXggYzA4MmE5YS4uOTZkYTBjYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3RyYW5zcG9ydC9zc2hkL0pHaXRQdWJsaWNLZXlBdXRoZW50aWNhdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoZC9KR2l0UHVibGljS2V5QXV0aGVudGljYXRpb24uamF2YQpAQCAtMTIsMjUgKzEyLDY4IEBACiBpbXBvcnQgc3RhdGljIGphdmEudGV4dC5NZXNzYWdlRm9ybWF0LmZvcm1hdDsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuU3NoQ29uc3RhbnRzLlBVQktFWV9BQ0NFUFRFRF9BTEdPUklUSE1TOwogCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKK2ltcG9ydCBqYXZhLm5pby5maWxlLkludmFsaWRQYXRoRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmZpbGUuTGlua09wdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5maWxlLlBhdGg7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoczsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkdlbmVyYWxTZWN1cml0eUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LktleVBhaXI7CitpbXBvcnQgamF2YS5zZWN1cml0eS5QdWJsaWNLZXk7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKIAoraW1wb3J0IG9yZy5hcGFjaGUuc3NoZC5hZ2VudC5Tc2hBZ2VudDsKK2ltcG9ydCBvcmcuYXBhY2hlLnNzaGQuYWdlbnQuU3NoQWdlbnRGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuc3NoZC5hZ2VudC5Tc2hBZ2VudEtleUNvbnN0cmFpbnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5zc2hkLmNsaWVudC5hdXRoLnB1YmtleS5LZXlBZ2VudElkZW50aXR5OwogaW1wb3J0IG9yZy5hcGFjaGUuc3NoZC5jbGllbnQuYXV0aC5wdWJrZXkuUHVibGljS2V5SWRlbnRpdHk7CiBpbXBvcnQgb3JnLmFwYWNoZS5zc2hkLmNsaWVudC5hdXRoLnB1YmtleS5Vc2VyQXV0aFB1YmxpY0tleTsKK2ltcG9ydCBvcmcuYXBhY2hlLnNzaGQuY2xpZW50LmF1dGgucHVia2V5LlVzZXJBdXRoUHVibGljS2V5SXRlcmF0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5zc2hkLmNsaWVudC5jb25maWcuaG9zdHMuSG9zdENvbmZpZ0VudHJ5OwogaW1wb3J0IG9yZy5hcGFjaGUuc3NoZC5jbGllbnQuc2Vzc2lvbi5DbGllbnRTZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3NoZC5jb21tb24uRmFjdG9yeU1hbmFnZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5OYW1lZEZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5jb25maWcua2V5cy5BdXRob3JpemVkS2V5RW50cnk7CitpbXBvcnQgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5jb25maWcua2V5cy5LZXlVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLmNvbmZpZy5rZXlzLlB1YmxpY0tleUVudHJ5UmVzb2x2ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5jb25maWcua2V5cy51MmYuU2VjdXJpdHlLZXlQdWJsaWNLZXk7CiBpbXBvcnQgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5zaWduYXR1cmUuU2lnbmF0dXJlOworaW1wb3J0IG9yZy5hcGFjaGUuc3NoZC5jb21tb24uc2lnbmF0dXJlLlNpZ25hdHVyZUZhY3Rvcmllc01hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC50cmFuc3BvcnQuc3NoLk9wZW5Tc2hDb25maWdGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LkNyZWRlbnRpYWxJdGVtOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LkNyZWRlbnRpYWxzUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuU3NoQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlVSSWlzaDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuU3RyaW5nVXRpbHM7CiAKIC8qKgogICogQ3VzdG9tIHtAbGluayBVc2VyQXV0aFB1YmxpY0tleX0gaW1wbGVtZW50YXRpb24gZm9yIGhhbmRsaW5nIFNTSCBjb25maWcKLSAqIFB1YmtleUFjY2VwdGVkQWxnb3JpdGhtcy4KKyAqIFB1YmtleUFjY2VwdGVkQWxnb3JpdGhtcyBhbmQgaW50ZXJhY3Rpb24gd2l0aCB0aGUgU1NIIGFnZW50LgogICovCiBwdWJsaWMgY2xhc3MgSkdpdFB1YmxpY0tleUF1dGhlbnRpY2F0aW9uIGV4dGVuZHMgVXNlckF1dGhQdWJsaWNLZXkgewogCisJcHJpdmF0ZSBTc2hBZ2VudCBhZ2VudDsKKworCXByaXZhdGUgSG9zdENvbmZpZ0VudHJ5IGhvc3RDb25maWc7CisKKwlwcml2YXRlIGJvb2xlYW4gYWRkS2V5c1RvQWdlbnQ7CisKKwlwcml2YXRlIGJvb2xlYW4gYXNrQmVmb3JlQWRkaW5nOworCisJcHJpdmF0ZSBTdHJpbmcgc2tQcm92aWRlcjsKKworCXByaXZhdGUgU3NoQWdlbnRLZXlDb25zdHJhaW50W10gY29uc3RyYWludHM7CisKIAlKR2l0UHVibGljS2V5QXV0aGVudGljYXRpb24oTGlzdDxOYW1lZEZhY3Rvcnk8U2lnbmF0dXJlPj4gZmFjdG9yaWVzKSB7CiAJCXN1cGVyKGZhY3Rvcmllcyk7CiAJfQpAQCAtNDMsNyArODYsNyBAQCBwdWJsaWMgdm9pZCBpbml0KENsaWVudFNlc3Npb24gcmF3U2Vzc2lvbiwgU3RyaW5nIHNlcnZpY2UpCiAJCQkJCSsgcmF3U2Vzc2lvbi5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSk7CiAJCX0KIAkJSkdpdENsaWVudFNlc3Npb24gc2Vzc2lvbiA9IChKR2l0Q2xpZW50U2Vzc2lvbikgcmF3U2Vzc2lvbjsKLQkJSG9zdENvbmZpZ0VudHJ5IGhvc3RDb25maWcgPSBzZXNzaW9uLmdldEhvc3RDb25maWdFbnRyeSgpOworCQlob3N0Q29uZmlnID0gc2Vzc2lvbi5nZXRIb3N0Q29uZmlnRW50cnkoKTsKIAkJLy8gU2V0IHNpZ25hdHVyZSBhbGdvcml0aG1zIGZvciBwdWJsaWMga2V5IGF1dGhlbnRpY2F0aW9uCiAJCVN0cmluZyBwdWJrZXlBbGdvcyA9IGhvc3RDb25maWcuZ2V0UHJvcGVydHkoUFVCS0VZX0FDQ0VQVEVEX0FMR09SSVRITVMpOwogCQlpZiAoIVN0cmluZ1V0aWxzLmlzRW1wdHlPck51bGwocHVia2V5QWxnb3MpKSB7CkBAIC02NCw0NiArMTA3LDI5MSBAQCBwdWJsaWMgdm9pZCBpbml0KENsaWVudFNlc3Npb24gcmF3U2Vzc2lvbiwgU3RyaW5nIHNlcnZpY2UpCiAJCS8vIElmIHdlIGRvbid0IHNldCBzaWduYXR1cmUgZmFjdG9yaWVzIGhlcmUsIHRoZSBkZWZhdWx0IG9uZXMgZnJvbSB0aGUKIAkJLy8gc2Vzc2lvbiB3aWxsIGJlIHVzZWQuCiAJCXN1cGVyLmluaXQoc2Vzc2lvbiwgc2VydmljZSk7Ci0JCS8vIEluIHNzaGQgMi43LjAsIHdlIGVuZCB1cCBub3cgd2l0aCBhIGtleSBpdGVyYXRvciB0aGF0IHVzZXMga2V5cwotCQkvLyBwcm92aWRlZCBieSBhbiBzc2gtYWdlbnQgZXZlbiBpZiBJZGVudGl0aWVzT25seSBpcyB0cnVlLiBTbyBpZgotCQkvLyBuZWVkZWQsIGZpbHRlciBvdXQgYW55IEtleUFnZW50SWRlbnRpdHkuCi0JCWlmIChob3N0Q29uZmlnLmlzSWRlbnRpdGllc09ubHkoKSkgewotCQkJSXRlcmF0b3I8UHVibGljS2V5SWRlbnRpdHk+IG9yaWdpbmFsID0ga2V5czsKLQkJCS8vIFRoZSBvcmlnaW5hbCBpdGVyYXRvciB3aWxsIGFscmVhZHkgaGF2ZSBnb3R0ZW4gdGhlIGlkZW50aXRpZXMKLQkJCS8vIGZyb20gdGhlIGFnZW50LiBVbmZvcnR1bmF0ZWx5IHRoZXJlJ3Mgbm90aGluZyB3ZSBjYW4gZG8gYWJvdXQKLQkJCS8vIHRoYXQ7IGl0J2xsIGhhdmUgdG8gYmUgZml4ZWQgdXBzdHJlYW0uIChBcyB3aWxsLCB1bHRpbWF0ZWx5LAotCQkJLy8gcmVzcGVjdGluZyBpc0lkZW50aXRpZXNPbmx5KCkuKSBBdCBsZWFzdCB3ZSBjYW4gc2ltcGx5IG5vdAotCQkJLy8gdXNlIHRoZSBrZXlzIHRoZSBhZ2VudCBwcm92aWRlZC4KLQkJCS8vCi0JCQkvLyBTZWUgaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9TU0hELTEyMTgKLQkJCWtleXMgPSBuZXcgSXRlcmF0b3I8PigpIHsKKwl9CiAKLQkJCQlwcml2YXRlIFB1YmxpY0tleUlkZW50aXR5IHZhbHVlOworCUBPdmVycmlkZQorCXByb3RlY3RlZCBJdGVyYXRvcjxQdWJsaWNLZXlJZGVudGl0eT4gY3JlYXRlUHVibGljS2V5SXRlcmF0b3IoCisJCQlDbGllbnRTZXNzaW9uIHNlc3Npb24sIFNpZ25hdHVyZUZhY3Rvcmllc01hbmFnZXIgbWFuYWdlcikKKwkJCXRocm93cyBFeGNlcHRpb24geworCQlhZ2VudCA9IGdldEFnZW50KHNlc3Npb24pOworCQlpZiAoYWdlbnQgIT0gbnVsbCkgeworCQkJcGFyc2VBZGRLZXlzKGhvc3RDb25maWcpOworCQkJaWYgKGFkZEtleXNUb0FnZW50KSB7CisJCQkJc2tQcm92aWRlciA9IGhvc3RDb25maWcuZ2V0UHJvcGVydHkoU3NoQ29uc3RhbnRzLlNFQ1VSSVRZX0tFWV9QUk9WSURFUik7CisJCQl9CisJCX0KKwkJcmV0dXJuIG5ldyBLZXlJdGVyYXRvcihzZXNzaW9uLCBtYW5hZ2VyKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgUHVibGljS2V5SWRlbnRpdHkgcmVzb2x2ZUF0dGVtcHRlZFB1YmxpY0tleUlkZW50aXR5KAorCQkJQ2xpZW50U2Vzc2lvbiBzZXNzaW9uLCBTdHJpbmcgc2VydmljZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVB1YmxpY0tleUlkZW50aXR5IHJlc3VsdCA9IGdldE5leHRLZXkoc2Vzc2lvbiwgc2VydmljZSk7CisJCS8vIFRoaXMgZml4ZXMgU1NIRC0xMjMxLiBDYW4gYmUgcmVtb3ZlZCBvbmNlIHdlJ3JlIHVzaW5nIEFwYWNoZSBNSU5BCisJCS8vIHNzaGQgPiAyLjguMC4KKwkJLy8KKwkJLy8gU2VlIGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvU1NIRC0xMjMxCisJCWN1cnJlbnRBbGdvcml0aG1zLmNsZWFyKCk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJcHJpdmF0ZSBQdWJsaWNLZXlJZGVudGl0eSBnZXROZXh0S2V5KENsaWVudFNlc3Npb24gc2Vzc2lvbiwgU3RyaW5nIHNlcnZpY2UpCisJCQl0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUHVibGljS2V5SWRlbnRpdHkgaWQgPSBzdXBlci5yZXNvbHZlQXR0ZW1wdGVkUHVibGljS2V5SWRlbnRpdHkoc2Vzc2lvbiwKKwkJCQlzZXJ2aWNlKTsKKwkJaWYgKGFkZEtleXNUb0FnZW50ICYmIGlkICE9IG51bGwgJiYgIShpZCBpbnN0YW5jZW9mIEtleUFnZW50SWRlbnRpdHkpKSB7CisJCQlLZXlQYWlyIGtleSA9IGlkLmdldEtleUlkZW50aXR5KCk7CisJCQlpZiAoa2V5ICE9IG51bGwgJiYga2V5LmdldFB1YmxpYygpICE9IG51bGwKKwkJCQkJJiYga2V5LmdldFByaXZhdGUoKSAhPSBudWxsKSB7CisJCQkJLy8gV2UndmUganVzdCBzdWNjZXNzZnVsbHkgbG9hZGVkIGEga2V5IHRoYXQgd2Fzbid0IGluIHRoZQorCQkJCS8vIGFnZW50LiBBZGQgaXQgdG8gdGhlIGFnZW50LgorCQkJCS8vCisJCQkJLy8gS2V5cyBhcmUgYWRkZWQgYWZ0ZXIgbG9hZGluZywgYXMgaW4gT3BlblNTSC4gVGhlIGFsdGVybmF0aXZlCisJCQkJLy8gbWlnaHQgYmUgdG8gYWRkIGEga2V5IG9ubHkgYWZ0ZXIgKHBhcnRpYWxseSkgc3VjY2Vzc2Z1bAorCQkJCS8vIGF1dGhlbnRpY2F0aW9uPworCQkJCVB1YmxpY0tleSBwayA9IGtleS5nZXRQdWJsaWMoKTsKKwkJCQlTdHJpbmcgZmluZ2VycHJpbnQgPSBLZXlVdGlscy5nZXRGaW5nZXJQcmludChwayk7CisJCQkJU3RyaW5nIGtleVR5cGUgPSBLZXlVdGlscy5nZXRLZXlUeXBlKGtleSk7CisJCQkJdHJ5IHsKKwkJCQkJLy8gQ2hlY2sgdGhhdCB0aGUga2V5IGlzIG5vdCBpbiB0aGUgYWdlbnQgYWxyZWFkeS4KKwkJCQkJaWYgKGFnZW50SGFzS2V5KHBrKSkgeworCQkJCQkJcmV0dXJuIGlkOworCQkJCQl9CisJCQkJCWlmIChhc2tCZWZvcmVBZGRpbmcKKwkJCQkJCQkmJiAoc2Vzc2lvbiBpbnN0YW5jZW9mIEpHaXRDbGllbnRTZXNzaW9uKSkgeworCQkJCQkJQ3JlZGVudGlhbHNQcm92aWRlciBwcm92aWRlciA9ICgoSkdpdENsaWVudFNlc3Npb24pIHNlc3Npb24pCisJCQkJCQkJCS5nZXRDcmVkZW50aWFsc1Byb3ZpZGVyKCk7CisJCQkJCQlDcmVkZW50aWFsSXRlbS5ZZXNOb1R5cGUgcXVlc3Rpb24gPSBuZXcgQ3JlZGVudGlhbEl0ZW0uWWVzTm9UeXBlKAorCQkJCQkJCQlmb3JtYXQoU3NoZFRleHQKKwkJCQkJCQkJCQkuZ2V0KCkucHVia2V5QXV0aEFkZEtleVRvQWdlbnRRdWVzdGlvbiwKKwkJCQkJCQkJCQlrZXlUeXBlLCBmaW5nZXJwcmludCkpOworCQkJCQkJYm9vbGVhbiByZXN1bHQgPSBwcm92aWRlciAhPSBudWxsCisJCQkJCQkJCSYmIHByb3ZpZGVyLnN1cHBvcnRzKHF1ZXN0aW9uKQorCQkJCQkJCQkmJiBwcm92aWRlci5nZXQoZ2V0VXJpKCksIHF1ZXN0aW9uKTsKKwkJCQkJCWlmICghcmVzdWx0IHx8ICFxdWVzdGlvbi5nZXRWYWx1ZSgpKSB7CisJCQkJCQkJLy8gRG9uJ3QgYWRkIHRoZSBrZXkuCisJCQkJCQkJcmV0dXJuIGlkOworCQkJCQkJfQorCQkJCQl9CisJCQkJCVNzaEFnZW50S2V5Q29uc3RyYWludFtdIHJ1bGVzID0gY29uc3RyYWludHM7CisJCQkJCWlmIChwayBpbnN0YW5jZW9mIFNlY3VyaXR5S2V5UHVibGljS2V5ICYmICFTdHJpbmdVdGlscy5pc0VtcHR5T3JOdWxsKHNrUHJvdmlkZXIpKSB7CisJCQkJCQlydWxlcyA9IEFycmF5cy5jb3B5T2YocnVsZXMsIHJ1bGVzLmxlbmd0aCArIDEpOworCQkJCQkJcnVsZXNbcnVsZXMubGVuZ3RoIC0gMV0gPQorCQkJCQkJCQluZXcgU3NoQWdlbnRLZXlDb25zdHJhaW50LkZpZG9Qcm92aWRlckV4dGVuc2lvbihza1Byb3ZpZGVyKTsKKwkJCQkJfQorCQkJCQkvLyBVbmZvcnR1bmF0ZWx5IGEgY29tbWVudCBhc3NvY2lhdGVkIHdpdGggdGhlIGtleSBpcyBsb3N0CisJCQkJCS8vIGJ5IEFwYWNoZSBNSU5BIHNzaGQsIGFuZCB0aGVyZSBpcyBhbHNvIG5vIHdheSB0byBnZXQgdGhlCisJCQkJCS8vIG9yaWdpbmFsIGZpbGUgbmFtZSBmb3Iga2V5cyBsb2FkZWQgZnJvbSBhIGZpbGUuIFNvIGFkZCBpdAorCQkJCQkvLyB3aXRob3V0IGNvbW1lbnQuCisJCQkJCWFnZW50LmFkZElkZW50aXR5KGtleSwgbnVsbCwgcnVsZXMpOworCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCQkJLy8gRG8gbm90IHJlLXRocm93OiB3ZSBkb24ndCB3YW50IGF1dGhlbnRpY2F0aW9uIHRvIGZhaWwgaWYKKwkJCQkJLy8gd2UgY2Fubm90IGFkZCB0aGUga2V5IHRvIHRoZSBhZ2VudC4KKwkJCQkJbG9nLmVycm9yKAorCQkJCQkJCWZvcm1hdChTc2hkVGV4dC5nZXQoKS5wdWJrZXlBdXRoQWRkS2V5VG9BZ2VudEVycm9yLAorCQkJCQkJCQkJa2V5VHlwZSwgZmluZ2VycHJpbnQpLAorCQkJCQkJCWUpOworCQkJCQkvLyBOb3RlIHRoYXQgYXMgb2YgV2luMzItT3BlblNTSCA4LjYgYW5kIFBhZ2VhbnQgMC43NiwKKwkJCQkJLy8gbmVpdGhlciBjYW4gaGFuZGxlIGtleSBjb25zdHJhaW50cy4gUGFnZWFudCBmYWlscworCQkJCQkvLyBncmFjZWZ1bGx5LCBub3QgYWRkaW5nIHRoZSBrZXkgYW5kIHJldHVybmluZworCQkJCQkvLyBTU0hfQUdFTlRfRkFJTFVSRS4gV2luMzItT3BlblNTSCBjbG9zZXMgdGhlIGNvbm5lY3Rpb24KKwkJCQkJLy8gd2l0aG91dCBldmVuIHJldHVybmluZyBhIGZhaWx1cmUgbWVzc2FnZSwgd2hpY2ggdmlvbGF0ZXMKKwkJCQkJLy8gdGhlIFNTSCBhZ2VudCBwcm90b2NvbCBhbmQgbWFrZXMgYWxsIHN1YnNlcXVlbnQgcmVxdWVzdHMKKwkJCQkJLy8gdG8gdGhlIGFnZW50IGZhaWwuCisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiBpZDsKKwl9CisKKwlwcml2YXRlIGJvb2xlYW4gYWdlbnRIYXNLZXkoUHVibGljS2V5IHBrKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlJdGVyYWJsZTw/IGV4dGVuZHMgTWFwLkVudHJ5PFB1YmxpY0tleSwgU3RyaW5nPj4gaWRzID0gYWdlbnQKKwkJCQkuZ2V0SWRlbnRpdGllcygpOworCQlpZiAoaWRzID09IG51bGwpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlJdGVyYXRvcjw/IGV4dGVuZHMgTWFwLkVudHJ5PFB1YmxpY0tleSwgU3RyaW5nPj4gaXRlciA9IGlkcy5pdGVyYXRvcigpOworCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKKwkJCWlmIChLZXlVdGlscy5jb21wYXJlS2V5cyhpdGVyLm5leHQoKS5nZXRLZXkoKSwgcGspKSB7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXByaXZhdGUgVVJJaXNoIGdldFVyaSgpIHsKKwkJU3RyaW5nIHVyaSA9IFNzaENvbnN0YW50cy5TU0hfU0NIRU1FICsgIjovLyI7IC8vJE5PTi1OTFMtMSQKKwkJU3RyaW5nIHVzZXJOYW1lID0gaG9zdENvbmZpZy5nZXRVc2VybmFtZSgpOworCQlpZiAoIVN0cmluZ1V0aWxzLmlzRW1wdHlPck51bGwodXNlck5hbWUpKSB7CisJCQl1cmkgKz0gdXNlck5hbWUgKyAnQCc7CisJCX0KKwkJdXJpICs9IGhvc3RDb25maWcuZ2V0SG9zdCgpOworCQlpbnQgcG9ydCA9IGhvc3RDb25maWcuZ2V0UG9ydCgpOworCQlpZiAocG9ydCA+IDAgJiYgcG9ydCAhPSBTc2hDb25zdGFudHMuU1NIX0RFRkFVTFRfUE9SVCkgeworCQkJdXJpICs9ICI6IiArIHBvcnQ7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQl0cnkgeworCQkJcmV0dXJuIG5ldyBVUklpc2godXJpKTsKKwkJfSBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIGUpIHsKKwkJCWxvZy5lcnJvcihlLmdldExvY2FsaXplZE1lc3NhZ2UoKSwgZSk7CisJCX0KKwkJcmV0dXJuIG5ldyBVUklpc2goKTsKKwl9CisKKwlwcml2YXRlIFNzaEFnZW50IGdldEFnZW50KENsaWVudFNlc3Npb24gc2Vzc2lvbikgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUZhY3RvcnlNYW5hZ2VyIG1hbmFnZXIgPSBPYmplY3RzLnJlcXVpcmVOb25OdWxsKAorCQkJCXNlc3Npb24uZ2V0RmFjdG9yeU1hbmFnZXIoKSwgIk5vIHNlc3Npb24gZmFjdG9yeSBtYW5hZ2VyIik7IC8vJE5PTi1OTFMtMSQKKwkJU3NoQWdlbnRGYWN0b3J5IGZhY3RvcnkgPSBtYW5hZ2VyLmdldEFnZW50RmFjdG9yeSgpOworCQlpZiAoZmFjdG9yeSA9PSBudWxsKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlyZXR1cm4gZmFjdG9yeS5jcmVhdGVDbGllbnQoc2Vzc2lvbiwgbWFuYWdlcik7CisJfQorCisJcHJpdmF0ZSB2b2lkIHBhcnNlQWRkS2V5cyhIb3N0Q29uZmlnRW50cnkgY29uZmlnKSB7CisJCVN0cmluZyB2YWx1ZSA9IGNvbmZpZy5nZXRQcm9wZXJ0eShTc2hDb25zdGFudHMuQUREX0tFWVNfVE9fQUdFTlQpOworCQlpZiAoU3RyaW5nVXRpbHMuaXNFbXB0eU9yTnVsbCh2YWx1ZSkpIHsKKwkJCWFkZEtleXNUb0FnZW50ID0gZmFsc2U7CisJCQlyZXR1cm47CisJCX0KKwkJU3RyaW5nW10gdmFsdWVzID0gdmFsdWUuc3BsaXQoIiwiKTsgLy8kTk9OLU5MUy0xJAorCQlMaXN0PFNzaEFnZW50S2V5Q29uc3RyYWludD4gcnVsZXMgPSBuZXcgQXJyYXlMaXN0PD4oMik7CisJCXN3aXRjaCAodmFsdWVzWzBdKSB7CisJCWNhc2UgInllcyI6IC8vJE5PTi1OTFMtMSQKKwkJCWFkZEtleXNUb0FnZW50ID0gdHJ1ZTsKKwkJCWJyZWFrOworCQljYXNlICJubyI6IC8vJE5PTi1OTFMtMSQKKwkJCWFkZEtleXNUb0FnZW50ID0gZmFsc2U7CisJCQlicmVhazsKKwkJY2FzZSAiYXNrIjogLy8kTk9OLU5MUy0xJAorCQkJYWRkS2V5c1RvQWdlbnQgPSB0cnVlOworCQkJYXNrQmVmb3JlQWRkaW5nID0gdHJ1ZTsKKwkJCWJyZWFrOworCQljYXNlICJjb25maXJtIjogLy8kTk9OLU5MUy0xJAorCQkJYWRkS2V5c1RvQWdlbnQgPSB0cnVlOworCQkJcnVsZXMuYWRkKFNzaEFnZW50S2V5Q29uc3RyYWludC5DT05GSVJNKTsKKwkJCWlmICh2YWx1ZXMubGVuZ3RoID4gMSkgeworCQkJCWludCBzZWNvbmRzID0gT3BlblNzaENvbmZpZ0ZpbGUudGltZVNwZWModmFsdWVzWzFdKTsKKwkJCQlpZiAoc2Vjb25kcyA+IDApIHsKKwkJCQkJcnVsZXMuYWRkKG5ldyBTc2hBZ2VudEtleUNvbnN0cmFpbnQuTGlmZVRpbWUoc2Vjb25kcykpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJaW50IHNlY29uZHMgPSBPcGVuU3NoQ29uZmlnRmlsZS50aW1lU3BlYyh2YWx1ZXNbMF0pOworCQkJaWYgKHNlY29uZHMgPiAwKSB7CisJCQkJYWRkS2V5c1RvQWdlbnQgPSB0cnVlOworCQkJCXJ1bGVzLmFkZChuZXcgU3NoQWdlbnRLZXlDb25zdHJhaW50LkxpZmVUaW1lKHNlY29uZHMpKTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCWNvbnN0cmFpbnRzID0gcnVsZXMudG9BcnJheShuZXcgU3NoQWdlbnRLZXlDb25zdHJhaW50WzBdKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCByZWxlYXNlS2V5cygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCWFkZEtleXNUb0FnZW50ID0gZmFsc2U7CisJCWFza0JlZm9yZUFkZGluZyA9IGZhbHNlOworCQlza1Byb3ZpZGVyID0gbnVsbDsKKwkJY29uc3RyYWludHMgPSBudWxsOworCQl0cnkgeworCQkJaWYgKGFnZW50ICE9IG51bGwpIHsKKwkJCQl0cnkgeworCQkJCQlhZ2VudC5jbG9zZSgpOworCQkJCX0gZmluYWxseSB7CisJCQkJCWFnZW50ID0gbnVsbDsKKwkJCQl9CisJCQl9CisJCX0gZmluYWxseSB7CisJCQlzdXBlci5yZWxlYXNlS2V5cygpOworCQl9CisJfQorCisJcHJpdmF0ZSBjbGFzcyBLZXlJdGVyYXRvciBleHRlbmRzIFVzZXJBdXRoUHVibGljS2V5SXRlcmF0b3IgeworCisJCXByaXZhdGUgSXRlcmFibGU8PyBleHRlbmRzIE1hcC5FbnRyeTxQdWJsaWNLZXksIFN0cmluZz4+IGFnZW50S2V5czsKKworCQkvLyBJZiBub24tbnVsbCwgYWxsIHRoZSBwdWJsaWMga2V5cyBmcm9tIGV4cGxpY2l0bHkgZ2l2ZW4ga2V5IGZpbGVzLiBBbnkKKwkJLy8gYWdlbnQga2V5IG5vdCBtYXRjaGluZyBvbmUgb2YgdGhlc2UgcHVibGljIGtleXMgd2lsbCBiZSBpZ25vcmVkIGluCisJCS8vIGdldElkZW50aXRpZXMoKS4KKwkJcHJpdmF0ZSBDb2xsZWN0aW9uPFB1YmxpY0tleT4gaWRlbnRpdHlGaWxlczsKKworCQlwdWJsaWMgS2V5SXRlcmF0b3IoQ2xpZW50U2Vzc2lvbiBzZXNzaW9uLAorCQkJCVNpZ25hdHVyZUZhY3Rvcmllc01hbmFnZXIgbWFuYWdlcikKKwkJCQl0aHJvd3MgRXhjZXB0aW9uIHsKKwkJCXN1cGVyKHNlc3Npb24sIG1hbmFnZXIpOworCQl9CisKKwkJcHJpdmF0ZSBMaXN0PFB1YmxpY0tleT4gZ2V0RXhwbGljaXRLZXlzKAorCQkJCUNvbGxlY3Rpb248U3RyaW5nPiBleHBsaWNpdEZpbGVzKSB7CisJCQlpZiAoZXhwbGljaXRGaWxlcyA9PSBudWxsKSB7CisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisJCQlyZXR1cm4gZXhwbGljaXRGaWxlcy5zdHJlYW0oKS5tYXAocyAtPiB7CisJCQkJdHJ5IHsKKwkJCQkJUGF0aCBwID0gUGF0aHMuZ2V0KHMgKyAiLnB1YiIpOyAvLyROT04tTkxTLTEkCisJCQkJCWlmIChGaWxlcy5pc1JlZ3VsYXJGaWxlKHAsIExpbmtPcHRpb24uTk9GT0xMT1dfTElOS1MpKSB7CisJCQkJCQlyZXR1cm4gQXV0aG9yaXplZEtleUVudHJ5LnJlYWRBdXRob3JpemVkS2V5cyhwKS5nZXQoMCkKKwkJCQkJCQkJLnJlc29sdmVQdWJsaWNLZXkobnVsbCwKKwkJCQkJCQkJCQlQdWJsaWNLZXlFbnRyeVJlc29sdmVyLklHTk9SSU5HKTsKKwkJCQkJfQorCQkJCX0gY2F0Y2ggKEludmFsaWRQYXRoRXhjZXB0aW9uIHwgSU9FeGNlcHRpb24KKwkJCQkJCXwgR2VuZXJhbFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKKwkJCQkJbG9nLndhcm4oZm9ybWF0KFNzaGRUZXh0LmdldCgpLmNhbm5vdFJlYWRQdWJsaWNLZXksIHMpLCBlKTsKKwkJCQl9CisJCQkJcmV0dXJuIG51bGw7CisJCQl9KS5maWx0ZXIoT2JqZWN0czo6bm9uTnVsbCkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwcm90ZWN0ZWQgSXRlcmFibGU8S2V5QWdlbnRJZGVudGl0eT4gaW5pdGlhbGl6ZUFnZW50SWRlbnRpdGllcygKKwkJCQlDbGllbnRTZXNzaW9uIHNlc3Npb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCQlpZiAoYWdlbnQgPT0gbnVsbCkgeworCQkJCXJldHVybiBudWxsOworCQkJfQorCQkJYWdlbnRLZXlzID0gYWdlbnQuZ2V0SWRlbnRpdGllcygpOworCQkJaWYgKGhvc3RDb25maWcgIT0gbnVsbCAmJiBob3N0Q29uZmlnLmlzSWRlbnRpdGllc09ubHkoKSkgeworCQkJCWlkZW50aXR5RmlsZXMgPSBnZXRFeHBsaWNpdEtleXMoaG9zdENvbmZpZy5nZXRJZGVudGl0aWVzKCkpOworCQkJfQorCQkJcmV0dXJuICgpIC0+IG5ldyBJdGVyYXRvcjw+KCkgeworCisJCQkJcHJpdmF0ZSBmaW5hbCBJdGVyYXRvcjw/IGV4dGVuZHMgTWFwLkVudHJ5PFB1YmxpY0tleSwgU3RyaW5nPj4gaXRlciA9IGFnZW50S2V5cworCQkJCQkJLml0ZXJhdG9yKCk7CisKKwkJCQlwcml2YXRlIE1hcC5FbnRyeTxQdWJsaWNLZXksIFN0cmluZz4gbmV4dDsKIAogCQkJCUBPdmVycmlkZQogCQkJCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCQkJCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCQlQdWJsaWNLZXlJZGVudGl0eSBuZXh0ID0gbnVsbDsKLQkJCQkJd2hpbGUgKG9yaWdpbmFsLmhhc05leHQoKSkgewotCQkJCQkJbmV4dCA9IG9yaWdpbmFsLm5leHQoKTsKLQkJCQkJCWlmICghKG5leHQgaW5zdGFuY2VvZiBLZXlBZ2VudElkZW50aXR5KSkgewotCQkJCQkJCXZhbHVlID0gbmV4dDsKKwkJCQkJd2hpbGUgKG5leHQgPT0gbnVsbCAmJiBpdGVyLmhhc05leHQoKSkgeworCQkJCQkJTWFwLkVudHJ5PFB1YmxpY0tleSwgU3RyaW5nPiB2YWwgPSBpdGVyLm5leHQoKTsKKwkJCQkJCVB1YmxpY0tleSBwayA9IHZhbC5nZXRLZXkoKTsKKwkJCQkJCS8vIFRoaXMgY2hlY2tzIGFnYWluc3QgYWxsIGV4cGxpY2l0IGtleXMgZm9yIGFueSBhZ2VudAorCQkJCQkJLy8ga2V5LCBidXQgc2luY2UgaWRlbnRpdHlGaWxlcy5zaXplKCkgaXMgdHlwaWNhbGx5IDEsCisJCQkJCQkvLyBpdCBzaG91bGQgYmUgZmluZS4KKwkJCQkJCWlmIChpZGVudGl0eUZpbGVzID09IG51bGwgfHwgaWRlbnRpdHlGaWxlcy5zdHJlYW0oKQorCQkJCQkJCQkuYW55TWF0Y2goayAtPiBLZXlVdGlscy5jb21wYXJlS2V5cyhrLCBwaykpKSB7CisJCQkJCQkJbmV4dCA9IHZhbDsKIAkJCQkJCQlyZXR1cm4gdHJ1ZTsKIAkJCQkJCX0KKwkJCQkJCWlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkgeworCQkJCQkJCWxvZy50cmFjZSgKKwkJCQkJCQkJCSJJZ25vcmluZyBTU0ggYWdlbnQge30ga2V5IG5vdCBpbiBleHBsaWNpdCBJZGVudGl0eUZpbGUgaW4gU1NIIGNvbmZpZzoge30iLCAvLyROT04tTkxTLTEkCisJCQkJCQkJCQlLZXlVdGlscy5nZXRLZXlUeXBlKHBrKSwKKwkJCQkJCQkJCUtleVV0aWxzLmdldEZpbmdlclByaW50KHBrKSk7CisJCQkJCQl9CiAJCQkJCX0KLQkJCQkJcmV0dXJuIGZhbHNlOworCQkJCQlyZXR1cm4gbmV4dCAhPSBudWxsOwogCQkJCX0KIAogCQkJCUBPdmVycmlkZQotCQkJCXB1YmxpYyBQdWJsaWNLZXlJZGVudGl0eSBuZXh0KCkgewotCQkJCQlpZiAoaGFzTmV4dCgpKSB7Ci0JCQkJCQlQdWJsaWNLZXlJZGVudGl0eSByZXN1bHQgPSB2YWx1ZTsKLQkJCQkJCXZhbHVlID0gbnVsbDsKLQkJCQkJCXJldHVybiByZXN1bHQ7CisJCQkJcHVibGljIEtleUFnZW50SWRlbnRpdHkgbmV4dCgpIHsKKwkJCQkJaWYgKCFoYXNOZXh0KCkpIHsKKwkJCQkJCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7CiAJCQkJCX0KLQkJCQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKKwkJCQkJS2V5QWdlbnRJZGVudGl0eSByZXN1bHQgPSBuZXcgS2V5QWdlbnRJZGVudGl0eShhZ2VudCwKKwkJCQkJCQluZXh0LmdldEtleSgpLCBuZXh0LmdldFZhbHVlKCkpOworCQkJCQluZXh0ID0gbnVsbDsKKwkJCQkJcmV0dXJuIHJlc3VsdDsKIAkJCQl9CiAJCQl9OwogCQl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvdHJhbnNwb3J0L3NzaGQvU3NoZFRleHQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoZC9Tc2hkVGV4dC5qYXZhCmluZGV4IDAwZWU2MmQuLjE5YWQ4NWMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoZC9Tc2hkVGV4dC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoZC9Tc2hkVGV4dC5qYXZhCkBAIC0zMCw2ICszMCw3IEBAIHB1YmxpYyBzdGF0aWMgU3NoZFRleHQgZ2V0KCkgewogCS8qKiovIHB1YmxpYyBTdHJpbmcgYXV0aGVudGljYXRpb25DYW5jZWxlZDsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGF1dGhlbnRpY2F0aW9uT25DbG9zZWRTZXNzaW9uOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgY2xvc2VMaXN0ZW5lckZhaWxlZDsKKwkvKioqLyBwdWJsaWMgU3RyaW5nIGNhbm5vdFJlYWRQdWJsaWNLZXk7CiAJLyoqKi8gcHVibGljIFN0cmluZyBjb25maWdJbnZhbGlkUGF0aDsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGNvbmZpZ0ludmFsaWRQYXR0ZXJuOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgY29uZmlnSW52YWxpZFBvc2l0aXZlOwpAQCAtOTgsNiArOTksOCBAQCBwdWJsaWMgc3RhdGljIFNzaGRUZXh0IGdldCgpIHsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIHByb3h5U29ja3NVbmV4cGVjdGVkTWVzc2FnZTsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIHByb3h5U29ja3NVbmV4cGVjdGVkVmVyc2lvbjsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIHByb3h5U29ja3NVc2VybmFtZVRvb0xvbmc7CisJLyoqKi8gcHVibGljIFN0cmluZyBwdWJrZXlBdXRoQWRkS2V5VG9BZ2VudEVycm9yOworCS8qKiovIHB1YmxpYyBTdHJpbmcgcHVia2V5QXV0aEFkZEtleVRvQWdlbnRRdWVzdGlvbjsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIHB1YmtleUF1dGhXcm9uZ0NvbW1hbmQ7CiAJLyoqKi8gcHVibGljIFN0cmluZyBwdWJrZXlBdXRoV3JvbmdLZXk7CiAJLyoqKi8gcHVibGljIFN0cmluZyBwdWJrZXlBdXRoV3JvbmdTaWduYXR1cmVBbGdvcml0aG07CkBAIC0xMDYsOSArMTA5LDEzIEBAIHB1YmxpYyBzdGF0aWMgU3NoZFRleHQgZ2V0KCkgewogCS8qKiovIHB1YmxpYyBTdHJpbmcgc2VydmVySWRXaXRoTnVsOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgc2Vzc2lvbkNsb3NlRmFpbGVkOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgc2Vzc2lvbldpdGhvdXRVc2VybmFtZTsKKwkvKioqLyBwdWJsaWMgU3RyaW5nIHNzaEFnZW50RWREU0FGb3JtYXRFcnJvcjsKKwkvKioqLyBwdWJsaWMgU3RyaW5nIHNzaEFnZW50UGF5bG9hZExlbmd0aEVycm9yOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgc3NoQWdlbnRSZXBseUxlbmd0aEVycm9yOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgc3NoQWdlbnRSZXBseVVuZXhwZWN0ZWQ7CiAJLyoqKi8gcHVibGljIFN0cmluZyBzc2hBZ2VudFNob3J0UmVhZEJ1ZmZlcjsKKwkvKioqLyBwdWJsaWMgU3RyaW5nIHNzaEFnZW50VW5rbm93bktleTsKKwkvKioqLyBwdWJsaWMgU3RyaW5nIHNzaEFnZW50V3JvbmdLZXlMZW5ndGg7CiAJLyoqKi8gcHVibGljIFN0cmluZyBzc2hBZ2VudFdyb25nTnVtYmVyT2ZLZXlzOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgc3NoQ2xvc2luZ0Rvd247CiAJLyoqKi8gcHVibGljIFN0cmluZyBzc2hDb21tYW5kVGltZW91dDsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoZC9hZ2VudC9KR2l0U3NoQWdlbnRGYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvdHJhbnNwb3J0L3NzaGQvYWdlbnQvSkdpdFNzaEFnZW50RmFjdG9yeS5qYXZhCmluZGV4IDFlZDJhYjkuLmEwZmZkNTQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoZC9hZ2VudC9KR2l0U3NoQWdlbnRGYWN0b3J5LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3RyYW5zcG9ydC9zc2hkL2FnZW50L0pHaXRTc2hBZ2VudEZhY3RvcnkuamF2YQpAQCAtMTcsMTAgKzE3LDE0IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5zc2hkLmFnZW50LlNzaEFnZW50OwogaW1wb3J0IG9yZy5hcGFjaGUuc3NoZC5hZ2VudC5Tc2hBZ2VudEZhY3Rvcnk7CiBpbXBvcnQgb3JnLmFwYWNoZS5zc2hkLmFnZW50LlNzaEFnZW50U2VydmVyOworaW1wb3J0IG9yZy5hcGFjaGUuc3NoZC5jbGllbnQuY29uZmlnLmhvc3RzLkhvc3RDb25maWdFbnRyeTsKIGltcG9ydCBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLkZhY3RvcnlNYW5hZ2VyOwogaW1wb3J0IG9yZy5hcGFjaGUuc3NoZC5jb21tb24uY2hhbm5lbC5DaGFubmVsRmFjdG9yeTsKIGltcG9ydCBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLnNlc3Npb24uQ29ubmVjdGlvblNlcnZpY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5zZXNzaW9uLlNlc3Npb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hbm5vdGF0aW9ucy5Ob25OdWxsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwudHJhbnNwb3J0LnNzaGQuSkdpdENsaWVudFNlc3Npb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuU3NoQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LnNzaGQuYWdlbnQuQ29ubmVjdG9yRmFjdG9yeTsKIAogLyoqCkBAIC00OSwxOCArNTMsMjQgQEAgcHVibGljIEpHaXRTc2hBZ2VudEZhY3RvcnkoQE5vbk51bGwgQ29ubmVjdG9yRmFjdG9yeSBmYWN0b3J5LAogCUBPdmVycmlkZQogCXB1YmxpYyBMaXN0PENoYW5uZWxGYWN0b3J5PiBnZXRDaGFubmVsRm9yd2FyZGluZ0ZhY3RvcmllcygKIAkJCUZhY3RvcnlNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJLy8gTm8gYWdlbnQgZm9yd2FyZGluZyBzdXBwb3J0ZWQgeWV0LgorCQkvLyBObyBhZ2VudCBmb3J3YXJkaW5nIHN1cHBvcnRlZC4KIAkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwogCX0KIAogCUBPdmVycmlkZQotCXB1YmxpYyBTc2hBZ2VudCBjcmVhdGVDbGllbnQoRmFjdG9yeU1hbmFnZXIgbWFuYWdlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gc3NoZCAyLjguMCB3aWxsIHBhc3MgdXMgdGhlIHNlc3Npb24gaGVyZS4gQXQgdGhhdCBwb2ludCwgd2UgY2FuIGdldAotCQkvLyB0aGUgSG9zdENvbmZpZ0VudHJ5IGFuZCBleHRyYWN0IGFuZCBoYW5kbGUgdGhlIElkZW50aXR5QWdlbnQgc2V0dGluZy4KLQkJLy8gRm9yIG5vdywgcGFzcyBudWxsIHRvIGxldCB0aGUgQ29ubmVjdG9yRmFjdG9yeSBkbyBpdHMgZGVmYXVsdAotCQkvLyBiZWhhdmlvciAoUGFnZWFudCBvbiBXaW5kb3dzLCBTU0hfQVVUSF9TT0NLIG9uIFVuaXhlcyB3aXRoIHRoZQotCQkvLyBqZ2l0LWJ1aWx0aW4gZmFjdG9yeSkuCi0JCXJldHVybiBuZXcgU3NoQWdlbnRDbGllbnQoZmFjdG9yeS5jcmVhdGUobnVsbCwgaG9tZURpcikpOworCXB1YmxpYyBTc2hBZ2VudCBjcmVhdGVDbGllbnQoU2Vzc2lvbiBzZXNzaW9uLCBGYWN0b3J5TWFuYWdlciBtYW5hZ2VyKQorCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGlkZW50aXR5QWdlbnQgPSBudWxsOworCQlpZiAoc2Vzc2lvbiBpbnN0YW5jZW9mIEpHaXRDbGllbnRTZXNzaW9uKSB7CisJCQlIb3N0Q29uZmlnRW50cnkgaG9zdENvbmZpZyA9ICgoSkdpdENsaWVudFNlc3Npb24pIHNlc3Npb24pCisJCQkJCS5nZXRIb3N0Q29uZmlnRW50cnkoKTsKKwkJCWlkZW50aXR5QWdlbnQgPSBob3N0Q29uZmlnLmdldFByb3BlcnR5KFNzaENvbnN0YW50cy5JREVOVElUWV9BR0VOVCwKKwkJCQkJbnVsbCk7CisJCX0KKwkJaWYgKFNzaENvbnN0YW50cy5OT05FLmVxdWFscyhpZGVudGl0eUFnZW50KSkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJcmV0dXJuIG5ldyBTc2hBZ2VudENsaWVudChmYWN0b3J5LmNyZWF0ZShpZGVudGl0eUFnZW50LCBob21lRGlyKSk7CiAJfQogCiAJQE92ZXJyaWRlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvdHJhbnNwb3J0L3NzaGQvYWdlbnQvU3NoQWdlbnRDbGllbnQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoZC9hZ2VudC9Tc2hBZ2VudENsaWVudC5qYXZhCmluZGV4IDA4NDgzZTQuLmNiY2I0ZDIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoZC9hZ2VudC9Tc2hBZ2VudENsaWVudC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoZC9hZ2VudC9Tc2hBZ2VudENsaWVudC5qYXZhCkBAIC0xMSwxMCArMTEsMTIgQEAKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5zZWN1cml0eS5LZXlQYWlyOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmF0ZUtleTsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LlB1YmxpY0tleTsKIGltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKIGltcG9ydCBqYXZhLnV0aWwuQWJzdHJhY3RNYXA7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwpAQCAtMjIsMjEgKzI0LDI3IEBACiAKIGltcG9ydCBvcmcuYXBhY2hlLnNzaGQuYWdlbnQuU3NoQWdlbnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5zc2hkLmFnZW50LlNzaEFnZW50Q29uc3RhbnRzOworaW1wb3J0IG9yZy5hcGFjaGUuc3NoZC5hZ2VudC5Tc2hBZ2VudEtleUNvbnN0cmFpbnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5Tc2hFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5jb25maWcua2V5cy5LZXlVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLmtleXByb3ZpZGVyLktleVBhaXJQcm92aWRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLnNlc3Npb24uU2Vzc2lvbkNvbnRleHQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi51dGlsLmJ1ZmZlci5CdWZmZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi51dGlsLmJ1ZmZlci5CdWZmZXJFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi51dGlsLmJ1ZmZlci5CdWZmZXJVdGlsczsKIGltcG9ydCBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLnV0aWwuYnVmZmVyLkJ5dGVBcnJheUJ1ZmZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLnV0aWwuYnVmZmVyLmtleXMuQnVmZmVyUHVibGljS2V5UGFyc2VyOworaW1wb3J0IG9yZy5hcGFjaGUuc3NoZC5jb21tb24udXRpbC5pby5kZXIuREVSUGFyc2VyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwudHJhbnNwb3J0LnNzaGQuU3NoZFRleHQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuc3NoZC5hZ2VudC5Db25uZWN0b3I7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIAogLyoqCi0gKiBBIGNsaWVudCBmb3IgYW4gU1NIMiBhZ2VudC4gVGhpcyBjbGllbnQgc3VwcG9ydHMgb25seSBxdWVyeWluZyBpZGVudGl0aWVzIGFuZAotICogc2lnbmF0dXJlIHJlcXVlc3RzLgorICogQSBjbGllbnQgZm9yIGFuIFNTSDIgYWdlbnQuIFRoaXMgY2xpZW50IHN1cHBvcnRzIHF1ZXJ5aW5nIGlkZW50aXRpZXMsCisgKiBzaWduYXR1cmUgcmVxdWVzdHMsIGFuZCBhZGRpbmcga2V5cyB0byBhbiBhZ2VudCAod2l0aCBvciB3aXRob3V0CisgKiBjb25zdHJhaW50cykuIFJlbW92aW5nIGtleXMgaXMgbm90IHN1cHBvcnRlZCwgYW5kIHRoZSBvbGRlciBTU0gxIHByb3RvY29sIGlzCisgKiBub3Qgc3VwcG9ydGVkLgogICoKICAqIEBzZWUgPGEgaHJlZj0iaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL2RyYWZ0LW1pbGxlci1zc2gtYWdlbnQtMDQiPlNTSAogICogICAgICBBZ2VudCBQcm90b2NvbCwgUkZDIGRyYWZ0PC9hPgpAQCAtNzIsMTEgKzgwLDE4IEBAIHByaXZhdGUgYm9vbGVhbiBvcGVuKGJvb2xlYW4gZGVidWdnaW5nKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJfQogCQkJcmV0dXJuIGZhbHNlOwogCQl9Ci0JCWJvb2xlYW4gY29ubmVjdGVkID0gY29ubmVjdG9yICE9IG51bGwgJiYgY29ubmVjdG9yLmNvbm5lY3QoKTsKLQkJaWYgKCFjb25uZWN0ZWQpIHsKLQkJCWlmIChkZWJ1Z2dpbmcpIHsKLQkJCQlMT0cuZGVidWcoIk5vIFNTSCBhZ2VudCAoU1NIX0FVVEhfU09DSyBub3Qgc2V0KSIpOyAvLyROT04tTkxTLTEkCisJCWJvb2xlYW4gY29ubmVjdGVkOworCQl0cnkgeworCQkJY29ubmVjdGVkID0gY29ubmVjdG9yICE9IG51bGwgJiYgY29ubmVjdG9yLmNvbm5lY3QoKTsKKwkJCWlmICghY29ubmVjdGVkICYmIGRlYnVnZ2luZykgeworCQkJCUxPRy5kZWJ1ZygiTm8gU1NIIGFnZW50Iik7IC8vJE5PTi1OTFMtMSQKIAkJCX0KKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJLy8gQWdlbnQgbm90IHJ1bm5pbmc/CisJCQlpZiAoZGVidWdnaW5nKSB7CisJCQkJTE9HLmRlYnVnKCJObyBTU0ggYWdlbnQiLCBlKTsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQkJdGhyb3cgZTsKIAkJfQogCQlyZXR1cm4gY29ubmVjdGVkOwogCX0KQEAgLTEyNywxNCArMTQyLDE3IEBAIHB1YmxpYyBJdGVyYWJsZTw/IGV4dGVuZHMgTWFwLkVudHJ5PFB1YmxpY0tleSwgU3RyaW5nPj4gZ2V0SWRlbnRpdGllcygpCiAJCQlMaXN0PE1hcC5FbnRyeTxQdWJsaWNLZXksIFN0cmluZz4+IGtleXMgPSBuZXcgQXJyYXlMaXN0PD4oCiAJCQkJCW51bWJlck9mS2V5cyk7CiAJCQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlck9mS2V5czsgaSsrKSB7Ci0JCQkJUHVibGljS2V5IGtleSA9IHJlcGx5LmdldFB1YmxpY0tleSgpOworCQkJCVB1YmxpY0tleSBrZXkgPSByZWFkS2V5KHJlcGx5KTsKIAkJCQlTdHJpbmcgY29tbWVudCA9IHJlcGx5LmdldFN0cmluZygpOwotCQkJCWlmICh0cmFjaW5nKSB7Ci0JCQkJCUxPRy50cmFjZSgiR290IFNTSCBhZ2VudCB7fSBrZXk6IHt9IHt9IiwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCUtleVV0aWxzLmdldEtleVR5cGUoa2V5KSwKLQkJCQkJCQlLZXlVdGlscy5nZXRGaW5nZXJQcmludChrZXkpLCBjb21tZW50KTsKKwkJCQlpZiAoa2V5ICE9IG51bGwpIHsKKwkJCQkJaWYgKHRyYWNpbmcpIHsKKwkJCQkJCUxPRy50cmFjZSgiR290IFNTSCBhZ2VudCB7fSBrZXk6IHt9IHt9IiwgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQlLZXlVdGlscy5nZXRLZXlUeXBlKGtleSksCisJCQkJCQkJCUtleVV0aWxzLmdldEZpbmdlclByaW50KGtleSksIGNvbW1lbnQpOworCQkJCQl9CisJCQkJCWtleXMuYWRkKG5ldyBBYnN0cmFjdE1hcC5TaW1wbGVJbW11dGFibGVFbnRyeTw+KGtleSwKKwkJCQkJCQljb21tZW50KSk7CiAJCQkJfQotCQkJCWtleXMuYWRkKG5ldyBBYnN0cmFjdE1hcC5TaW1wbGVJbW11dGFibGVFbnRyeTw+KGtleSwgY29tbWVudCkpOwogCQkJfQogCQkJcmV0dXJuIGtleXM7CiAJCX0gY2F0Y2ggKEJ1ZmZlckV4Y2VwdGlvbiBlKSB7CkBAIC0yMTYsNiArMjM0LDIyMiBAQCBwdWJsaWMgSXRlcmFibGU8PyBleHRlbmRzIE1hcC5FbnRyeTxQdWJsaWNLZXksIFN0cmluZz4+IGdldElkZW50aXRpZXMoKQogCQl9CiAJfQogCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgYWRkSWRlbnRpdHkoS2V5UGFpciBrZXksIFN0cmluZyBjb21tZW50LAorCQkJU3NoQWdlbnRLZXlDb25zdHJhaW50Li4uIGNvbnN0cmFpbnRzKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlib29sZWFuIGRlYnVnZ2luZyA9IExPRy5pc0RlYnVnRW5hYmxlZCgpOworCQlpZiAoIW9wZW4oZGVidWdnaW5nKSkgeworCQkJcmV0dXJuOworCQl9CisKKwkJLy8gTmVpdGhlciBQYWdlYW50IDAuNzYgbm9yIFdpbjMyLU9wZW5TU0ggOC42IHN1cHBvcnQgY29tbWFuZAorCQkvLyBTU0gyX0FHRU5UQ19BRERfSURfQ09OU1RSQUlORUQuIEFkZGluZyBhIGtleSB3aXRoIGNvbnN0cmFpbnRzIHdpbGwKKwkJLy8gZmFpbC4gVGhlIG9ubHkgd29yay1hcm91bmQgZm9yIHVzZXJzIGlzIG5vdCB0byB1c2UgImNvbmZpcm0iIG9yICJ0aW1lCisJCS8vIHNwZWMiIHdpdGggQWRkS2V5c1RvQWdlbnQsIGFuZCBub3QgdG8gdXNlIHNrLSoga2V5cy4KKwkJLy8KKwkJLy8gV2l0aCBhIHRydWUgT3BlblNTSCBTU0ggYWdlbnQsIGtleSBjb25zdHJhaW50cyB3b3JrLgorCQlieXRlIGNtZCA9IChjb25zdHJhaW50cyAhPSBudWxsICYmIGNvbnN0cmFpbnRzLmxlbmd0aCA+IDApCisJCQkJPyBTc2hBZ2VudENvbnN0YW50cy5TU0gyX0FHRU5UQ19BRERfSURfQ09OU1RSQUlORUQKKwkJCQk6IFNzaEFnZW50Q29uc3RhbnRzLlNTSDJfQUdFTlRDX0FERF9JREVOVElUWTsKKwkJYnl0ZVtdIG1lc3NhZ2UgPSBudWxsOworCQlCeXRlQXJyYXlCdWZmZXIgbXNnID0gbmV3IEJ5dGVBcnJheUJ1ZmZlcigpOworCQl0cnkgeworCQkJbXNnLnB1dEludCgwKTsKKwkJCW1zZy5wdXRCeXRlKGNtZCk7CisJCQlTdHJpbmcga2V5VHlwZSA9IEtleVV0aWxzLmdldEtleVR5cGUoa2V5KTsKKwkJCWlmIChLZXlQYWlyUHJvdmlkZXIuU1NIX0VEMjU1MTkuZXF1YWxzKGtleVR5cGUpKSB7CisJCQkJLy8gQXBhY2hlIE1JTkEgc3NoZCAyLjguMCBsYWNrcyBzdXBwb3J0IGZvciB3cml0aW5nIGVkMjU1MTkKKwkJCQkvLyBwcml2YXRlIGtleXMgdG8gYSBidWZmZXIuCisJCQkJcHV0RWQyNTUxOUtleShtc2csIGtleSk7CisJCQl9IGVsc2UgeworCQkJCW1zZy5wdXRLZXlQYWlyKGtleSk7CisJCQl9CisJCQltc2cucHV0U3RyaW5nKGNvbW1lbnQgPT0gbnVsbCA/ICIiIDogY29tbWVudCk7IC8vJE5PTi1OTFMtMSQKKwkJCWlmIChjb25zdHJhaW50cyAhPSBudWxsKSB7CisJCQkJZm9yIChTc2hBZ2VudEtleUNvbnN0cmFpbnQgY29uc3RyYWludCA6IGNvbnN0cmFpbnRzKSB7CisJCQkJCWNvbnN0cmFpbnQucHV0KG1zZyk7CisJCQkJfQorCQkJfQorCQkJaWYgKGRlYnVnZ2luZykgeworCQkJCUxPRy5kZWJ1ZygKKwkJCQkJCSJhZGRJZGVudGl0eTogYWRkaW5nIHt9IGtleSB7fSB0byBTU0ggYWdlbnQ7IGNvbW1lbnQge30iLCAvLyROT04tTkxTLTEkCisJCQkJCQlrZXlUeXBlLCBLZXlVdGlscy5nZXRGaW5nZXJQcmludChrZXkuZ2V0UHVibGljKCkpLAorCQkJCQkJY29tbWVudCk7CisJCQl9CisJCQltZXNzYWdlID0gbXNnLmdldENvbXBhY3REYXRhKCk7CisJCX0gZmluYWxseSB7CisJCQkvLyBUaGUgbWVzc2FnZSBjb250YWlucyB0aGUgcHJpdmF0ZSBrZXkgZGF0YSwgc28gY2xlYXIgaW50ZXJtZWRpYXJ5CisJCQkvLyBkYXRhIEFTQVAuCisJCQltc2cuY2xlYXIoKTsKKwkJfQorCQlCdWZmZXIgcmVwbHk7CisJCXRyeSB7CisJCQlyZXBseSA9IHJwYyhjbWQsIG1lc3NhZ2UpOworCQl9IGZpbmFsbHkgeworCQkJQXJyYXlzLmZpbGwobWVzc2FnZSwgKGJ5dGUpIDApOworCQl9CisJCWludCByZXBseUxlbmd0aCA9IHJlcGx5LmF2YWlsYWJsZSgpOworCQlpZiAocmVwbHlMZW5ndGggIT0gMSkgeworCQkJdGhyb3cgbmV3IFNzaEV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdCgKKwkJCQkJU3NoZFRleHQuZ2V0KCkuc3NoQWdlbnRSZXBseVVuZXhwZWN0ZWQsCisJCQkJCU1lc3NhZ2VGb3JtYXQuZm9ybWF0KAorCQkJCQkJCVNzaGRUZXh0LmdldCgpLnNzaEFnZW50UGF5bG9hZExlbmd0aEVycm9yLAorCQkJCQkJCUludGVnZXIudmFsdWVPZigxKSwgSW50ZWdlci52YWx1ZU9mKHJlcGx5TGVuZ3RoKSkpKTsKKworCQl9CisJCWNtZCA9IHJlcGx5LmdldEJ5dGUoKTsKKwkJaWYgKGNtZCAhPSBTc2hBZ2VudENvbnN0YW50cy5TU0hfQUdFTlRfU1VDQ0VTUykgeworCQkJdGhyb3cgbmV3IFNzaEV4Y2VwdGlvbigKKwkJCQkJTWVzc2FnZUZvcm1hdC5mb3JtYXQoU3NoZFRleHQuZ2V0KCkuc3NoQWdlbnRSZXBseVVuZXhwZWN0ZWQsCisJCQkJCQkJU3NoQWdlbnRDb25zdGFudHMuZ2V0Q29tbWFuZE1lc3NhZ2VOYW1lKGNtZCkpKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFdyaXRlcyBhbiBlZDI1NTE5IHtAbGluayBLZXlQYWlyfSB0byBhIHtAbGluayBCdWZmZXJ9LiBPcGVuU1NIIHNwZWNpZmllcworCSAqIHRoYXQgaXQgZXhwZWN0cyB0aGUgMzIgcHVibGljIGtleSBieXRlcywgZm9sbG93ZWQgYnkgNjQgYnl0ZXMgZm9ybWVkIGJ5CisJICogY29uY2F0ZW5hdGluZyB0aGUgMzIgcHJpdmF0ZSBrZXkgYnl0ZXMgd2l0aCB0aGUgMzIgcHVibGljIGtleSBieXRlcy4KKwkgKgorCSAqIEBwYXJhbSBtc2cKKwkgKiAgICAgICAgICAgIHtAbGluayBCdWZmZXJ9IHRvIHdyaXRlIHRvCisJICogQHBhcmFtIGtleQorCSAqICAgICAgICAgICAge0BsaW5rIEtleVBhaXJ9IHRvIHdyaXRlCisJICogQHRocm93cyBJT0V4Y2VwdGlvbgorCSAqICAgICAgICAgICAgIGlmIHRoZSBwcml2YXRlIGtleSBjYW5ub3QgYmUgd3JpdHRlbgorCSAqLworCXByaXZhdGUgc3RhdGljIHZvaWQgcHV0RWQyNTUxOUtleShCdWZmZXIgbXNnLCBLZXlQYWlyIGtleSkKKwkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CisJCUJ1ZmZlciB0bXAgPSBuZXcgQnl0ZUFycmF5QnVmZmVyKDM2KTsKKwkJdG1wLnB1dFJhd1B1YmxpY0tleUJ5dGVzKGtleS5nZXRQdWJsaWMoKSk7CisJCWJ5dGVbXSBwdWJsaWNCeXRlcyA9IHRtcC5nZXRCeXRlcygpOworCQltc2cucHV0U3RyaW5nKEtleVBhaXJQcm92aWRlci5TU0hfRUQyNTUxOSk7CisJCW1zZy5wdXRCeXRlcyhwdWJsaWNCeXRlcyk7CisJCS8vIE5leHQgaXMgdGhlIGNvbmNhdGVuYXRpb24gb2YgdGhlIDMyIGJ5dGUgcHJpdmF0ZSBrZXkgdmFsdWUgd2l0aCB0aGUKKwkJLy8gMzIgYnl0ZXMgb2YgdGhlIHB1YmxpYyBrZXkuCisJCVByaXZhdGVLZXkgcGsgPSBrZXkuZ2V0UHJpdmF0ZSgpOworCQlTdHJpbmcgZm9ybWF0ID0gcGsuZ2V0Rm9ybWF0KCk7CisJCWlmICghIlBLQ1MjOCIuZXF1YWxzSWdub3JlQ2FzZShmb3JtYXQpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihNZXNzYWdlRm9ybWF0CisJCQkJCS5mb3JtYXQoU3NoZFRleHQuZ2V0KCkuc3NoQWdlbnRFZERTQUZvcm1hdEVycm9yLCBmb3JtYXQpKTsKKwkJfQorCQlieXRlW10gcHJpdmF0ZUJ5dGVzID0gbnVsbDsKKwkJYnl0ZVtdIGVuY29kZWQgPSBway5nZXRFbmNvZGVkKCk7CisJCXRyeSB7CisJCQlwcml2YXRlQnl0ZXMgPSBhc24xUGFyc2UoZW5jb2RlZCwgMzIpOworCQkJYnl0ZVtdIGNvbWJpbmVkID0gQXJyYXlzLmNvcHlPZihwcml2YXRlQnl0ZXMsIDY0KTsKKwkJCUFycmF5cy5maWxsKHByaXZhdGVCeXRlcywgKGJ5dGUpIDApOworCQkJcHJpdmF0ZUJ5dGVzID0gY29tYmluZWQ7CisJCQlTeXN0ZW0uYXJyYXljb3B5KHB1YmxpY0J5dGVzLCAwLCBwcml2YXRlQnl0ZXMsIDMyLCAzMik7CisJCQltc2cucHV0Qnl0ZXMocHJpdmF0ZUJ5dGVzKTsKKwkJfSBmaW5hbGx5IHsKKwkJCWlmIChwcml2YXRlQnl0ZXMgIT0gbnVsbCkgeworCQkJCUFycmF5cy5maWxsKHByaXZhdGVCeXRlcywgKGJ5dGUpIDApOworCQkJfQorCQkJQXJyYXlzLmZpbGwoZW5jb2RlZCwgKGJ5dGUpIDApOworCQl9CisJfQorCisJLyoqCisJICogRXh0cmFjdHMgdGhlIHByaXZhdGUga2V5IGJ5dGVzIGZyb20gYW4gZW5jb2RlZCBlZDI1NTE5IHByaXZhdGUga2V5IGJ5CisJICogcGFyc2luZyB0aGUgYnl0ZXMgYXMgQVNOLjEgYWNjb3JkaW5nIHRvIFJGQyA1OTU4IChQS0NTICM4IGVuY29kaW5nKToKKwkgKgorCSAqIDxwcmU+CisJICogT25lQXN5bW1ldHJpY0tleSA6Oj0gU0VRVUVOQ0UgeworCSAqICAgdmVyc2lvbiBWZXJzaW9uLAorCSAqICAgcHJpdmF0ZUtleUFsZ29yaXRobSBQcml2YXRlS2V5QWxnb3JpdGhtSWRlbnRpZmllciwKKwkgKiAgIHByaXZhdGVLZXkgUHJpdmF0ZUtleSwKKwkgKiAgIC4uLgorCSAqIH0KKwkgKgorCSAqIFZlcnNpb24gOjo9IElOVEVHRVIKKwkgKiBQcml2YXRlS2V5QWxnb3JpdGhtSWRlbnRpZmllciA6Oj0gQWxnb3JpdGhtSWRlbnRpZmllcgorCSAqIFByaXZhdGVLZXkgOjo9IE9DVEVUIFNUUklORworCSAqCisJICogQWxnb3JpdGhtSWRlbnRpZmllciAgOjo9ICBTRVFVRU5DRSAgeworCSAqICAgYWxnb3JpdGhtICAgT0JKRUNUIElERU5USUZJRVIsCisJICogICBwYXJhbWV0ZXJzICBBTlkgREVGSU5FRCBCWSBhbGdvcml0aG0gT1BUSU9OQUwKKwkgKiB9CisJICogPC9wcmU+CisJICogPHA+CisJICogYW5kIFJGQyA4NDEwOiAiLi4uIHdoZW4gZW5jb2RpbmcgYSBPbmVBc3ltbWV0cmljS2V5IG9iamVjdCwgdGhlIHByaXZhdGUKKwkgKiBrZXkgaXMgd3JhcHBlZCBpbiBhIEN1cnZlUHJpdmF0ZUtleSBvYmplY3QgYW5kIHdyYXBwZWQgYnkgdGhlIE9DVEVUCisJICogU1RSSU5HIG9mIHRoZSAncHJpdmF0ZUtleScgZmllbGQuIgorCSAqIDwvcD4KKwkgKgorCSAqIDxwcmU+CisJICogQ3VydmVQcml2YXRlS2V5IDo6PSBPQ1RFVCBTVFJJTkcKKwkgKiA8L3ByZT4KKwkgKgorCSAqIEBwYXJhbSBlbmNvZGVkCisJICogICAgICAgICAgICBlbmNvZGVkIHByaXZhdGUga2V5IHRvIGV4dHJhY3QgdGhlIHByaXZhdGUga2V5IGJ5dGVzIGZyb20KKwkgKiBAcGFyYW0gbgorCSAqICAgICAgICAgICAgbnVtYmVyIG9mIGJ5dGVzIGV4cGVjdGVkCisJICogQHJldHVybiB0aGUgZXh0cmFjdGVkIHByaXZhdGUga2V5IGJ5dGVzOyBvZiBsZW5ndGgge0Bjb2RlIG59CisJICogQHRocm93cyBJT0V4Y2VwdGlvbgorCSAqICAgICAgICAgICAgIGlmIHRoZSBwcml2YXRlIGtleSBjYW5ub3QgYmUgZXh0cmFjdGVkCisJICogQHNlZSA8YSBocmVmPSJodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNTk1OCI+UkZDIDU5NTg8L2E+CisJICogQHNlZSA8YSBocmVmPSJodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjODQxMCI+UkZDIDg0MTA8L2E+CisJICovCisJcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIGFzbjFQYXJzZShieXRlW10gZW5jb2RlZCwgaW50IG4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCWJ5dGVbXSBwcml2YXRlS2V5ID0gbnVsbDsKKwkJdHJ5IChERVJQYXJzZXIgYnl0ZVBhcnNlciA9IG5ldyBERVJQYXJzZXIoZW5jb2RlZCk7CisJCQkJREVSUGFyc2VyIG9uZUFzeW1tZXRyaWNLZXkgPSBieXRlUGFyc2VyLnJlYWRPYmplY3QoKQorCQkJCQkJLmNyZWF0ZVBhcnNlcigpKSB7CisJCQlvbmVBc3ltbWV0cmljS2V5LnJlYWRPYmplY3QoKTsgLy8gc2tpcCB2ZXJzaW9uCisJCQlvbmVBc3ltbWV0cmljS2V5LnJlYWRPYmplY3QoKTsgLy8gc2tpcCBhbGdvcml0aG0gaWRlbnRpZmllcgorCQkJcHJpdmF0ZUtleSA9IG9uZUFzeW1tZXRyaWNLZXkucmVhZE9iamVjdCgpLmdldFZhbHVlKCk7CisJCQkvLyBUaGUgbGFzdCBuIGJ5dGVzIG9mIHRoaXMgbXVzdCBiZSB0aGUgcHJpdmF0ZSBrZXkgYnl0ZXMKKwkJCXJldHVybiBBcnJheXMuY29weU9mUmFuZ2UocHJpdmF0ZUtleSwKKwkJCQkJcHJpdmF0ZUtleS5sZW5ndGggLSBuLCBwcml2YXRlS2V5Lmxlbmd0aCk7CisJCX0gZmluYWxseSB7CisJCQlpZiAocHJpdmF0ZUtleSAhPSBudWxsKSB7CisJCQkJQXJyYXlzLmZpbGwocHJpdmF0ZUtleSwgKGJ5dGUpIDApOworCQkJfQorCQl9CisJfQorCisJLyoqCisJICogQSBzYWZlIHZlcnNpb24gb2Yge0BsaW5rIEJ1ZmZlciNnZXRQdWJsaWNLZXkoKX0uIFVwb24gcmV0dXJuIHRoZQorCSAqIGJ1ZmZlcnMncyByZWFkIHBvc2l0aW9uIGlzIGFsd2F5cyBhZnRlciB0aGUga2V5IGJsb2I7IGFueSBleGNlcHRpb25zCisJICogdGhyb3duIGJ5IHRyeWluZyB0byByZWFkIHRoZSBrZXkgYXJlIGxvZ2dlZCBhbmQgPGVtPm5vdDwvZW0+IHByb3BhZ2F0ZWQuCisJICogPHA+CisJICogVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSBhbiBTU0ggYWdlbnQgbWlnaHQgY29udGFpbiBhbmQgZGVsaXZlciBrZXlzIHRoYXQKKwkgKiB3ZSBjYW5ub3QgaGFuZGxlIChmb3IgaW5zdGFuY2UgZWQ0NDgga2V5cykuCisJICogPC9wPgorCSAqCisJICogQHBhcmFtIGJ1ZmZlcgorCSAqICAgICAgICAgICAgdG8gcmVhZCB0aGUga2V5IGZyb20KKwkgKiBAcmV0dXJuIHRoZSB7QGxpbmsgUHVibGljS2V5fSwgb3Ige0Bjb2RlIG51bGx9IGlmIHRoZSBrZXkgY291bGQgbm90IGJlCisJICogICAgICAgICByZWFkCisJICogQHRocm93cyBCdWZmZXJFeGNlcHRpb24KKwkgKiAgICAgICAgICAgICBpZiB0aGUgbGVuZ3RoIG9mIHRoZSBrZXkgYmxvYiBjYW5ub3QgYmUgcmVhZCBvciBpcyBjb3JydXB0ZWQKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBQdWJsaWNLZXkgcmVhZEtleShCdWZmZXIgYnVmZmVyKSB0aHJvd3MgQnVmZmVyRXhjZXB0aW9uIHsKKwkJaW50IGVuZE9mQnVmZmVyID0gYnVmZmVyLndwb3MoKTsKKwkJaW50IGtleUxlbmd0aCA9IGJ1ZmZlci5nZXRJbnQoKTsKKwkJaW50IGFmdGVyS2V5ID0gYnVmZmVyLnJwb3MoKSArIGtleUxlbmd0aDsKKwkJaWYgKGtleUxlbmd0aCA8PSAwIHx8IGFmdGVyS2V5ID4gZW5kT2ZCdWZmZXIpIHsKKwkJCXRocm93IG5ldyBCdWZmZXJFeGNlcHRpb24oCisJCQkJCU1lc3NhZ2VGb3JtYXQuZm9ybWF0KFNzaGRUZXh0LmdldCgpLnNzaEFnZW50V3JvbmdLZXlMZW5ndGgsCisJCQkJCQkJSW50ZWdlci50b1N0cmluZyhrZXlMZW5ndGgpLAorCQkJCQkJCUludGVnZXIudG9TdHJpbmcoYnVmZmVyLnJwb3MoKSksCisJCQkJCQkJSW50ZWdlci50b1N0cmluZyhlbmRPZkJ1ZmZlcikpKTsKKwkJfQorCQkvLyBMaW1pdCBzdWJzZXF1ZW50IHJlYWRzIHRvIHRoZSBwdWJsaWMga2V5IGJsb2IKKwkJYnVmZmVyLndwb3MoYWZ0ZXJLZXkpOworCQl0cnkgeworCQkJcmV0dXJuIGJ1ZmZlci5nZXRSYXdQdWJsaWNLZXkoQnVmZmVyUHVibGljS2V5UGFyc2VyLkRFRkFVTFQpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJTE9HLndhcm4oU3NoZFRleHQuZ2V0KCkuc3NoQWdlbnRVbmtub3duS2V5LCBlKTsKKwkJCXJldHVybiBudWxsOworCQl9IGZpbmFsbHkgeworCQkJLy8gUmVzdG9yZSByZWFsIGJ1ZmZlciBlbmQKKwkJCWJ1ZmZlci53cG9zKGVuZE9mQnVmZmVyKTsKKwkJCS8vIFNldCB0aGUgcmVhZCBwb3NpdGlvbiB0byBhZnRlciB0aGlzIGtleSwgZXZlbiBpZiBmYWlsZWQKKwkJCWJ1ZmZlci5ycG9zKGFmdGVyS2V5KTsKKwkJfQorCX0KKwogCXByaXZhdGUgQnVmZmVyIHJwYyhieXRlIGNvbW1hbmQsIGJ5dGVbXSBtZXNzYWdlKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlyZXR1cm4gbmV3IEJ5dGVBcnJheUJ1ZmZlcihjb25uZWN0b3IucnBjKGNvbW1hbmQsIG1lc3NhZ2UpKTsKIAl9CkBAIC0yMzAsMTEgKzQ2NCw2IEBAIHB1YmxpYyBib29sZWFuIGlzT3BlbigpIHsKIAl9CiAKIAlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRJZGVudGl0eShLZXlQYWlyIGtleSwgU3RyaW5nIGNvbW1lbnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHJlbW92ZUlkZW50aXR5KFB1YmxpY0tleSBrZXkpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvc3NoZC9Tc2hkU2Vzc2lvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9zc2hkL1NzaGRTZXNzaW9uLmphdmEKaW5kZXggYzI3MGI0NC4uYjc0MmY1ZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9zc2hkL1NzaGRTZXNzaW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9zc2hkL1NzaGRTZXNzaW9uLmphdmEKQEAgLTUxLDYgKzUxLDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnNzaGQuc2Z0cC5jb21tb24uU2Z0cEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFubm90YXRpb25zLk5vbk51bGw7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuVHJhbnNwb3J0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwudHJhbnNwb3J0LnNzaC5PcGVuU3NoQ29uZmlnRmlsZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnRyYW5zcG9ydC5zc2hkLkpHaXRTc2hDbGllbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC50cmFuc3BvcnQuc3NoZC5Tc2hkVGV4dDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5GdHBDaGFubmVsOwpAQCAtMTM4LDcgKzEzOSwxMSBAQCBwcml2YXRlIENsaWVudFNlc3Npb24gY29ubmVjdChVUklpc2ggdGFyZ2V0LCBMaXN0PFVSSWlzaD4ganVtcHMsCiAJCQkJCQlKR2l0U3NoQ2xpZW50LkxPQ0FMX0ZPUldBUkRfQUREUkVTUywKIAkJCQkJCXBvcnRGb3J3YXJkLmdldEJvdW5kQWRkcmVzcygpKTsKIAkJCX0KLQkJCXJlc3VsdFNlc3Npb24gPSBjb25uZWN0KGhvc3RDb25maWcsIGNvbnRleHQsIHRpbWVvdXQpOworCQkJaW50IHRpbWVvdXRJblNlYyA9IE9wZW5Tc2hDb25maWdGaWxlLnRpbWVTcGVjKAorCQkJCQlob3N0Q29uZmlnLmdldFByb3BlcnR5KFNzaENvbnN0YW50cy5DT05ORUNUX1RJTUVPVVQpKTsKKwkJCXJlc3VsdFNlc3Npb24gPSBjb25uZWN0KGhvc3RDb25maWcsIGNvbnRleHQsCisJCQkJCXRpbWVvdXRJblNlYyA+IDAgPyBEdXJhdGlvbi5vZlNlY29uZHModGltZW91dEluU2VjKQorCQkJCQkJCTogdGltZW91dCk7CiAJCQlpZiAocHJveHlTZXNzaW9uICE9IG51bGwpIHsKIAkJCQlmaW5hbCBQb3J0Rm9yd2FyZGluZ1RyYWNrZXIgdHJhY2tlciA9IHBvcnRGb3J3YXJkOwogCQkJCWZpbmFsIENsaWVudFNlc3Npb24gcFNlc3Npb24gPSBwcm94eVNlc3Npb247CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5qc2NoLnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5qc2NoLnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYKaW5kZXggNTJlNjliZC4uNGEwODk0MCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5zc2guanNjaC50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuc3NoLmpzY2gudGVzdC9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMywxOCArMywxOCBAQAogQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZQogQXV0b21hdGljLU1vZHVsZS1OYW1lOiBvcmcuZWNsaXBzZS5qZ2l0LnNzaC5qc2NoLnRlc3QKIEJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpnaXQuc3NoLmpzY2gudGVzdAotQnVuZGxlLVZlcnNpb246IDYuMC4xLnF1YWxpZmllcgorQnVuZGxlLVZlcnNpb246IDYuMS4xLnF1YWxpZmllcgogQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IKIEJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgogQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEphdmFTRS0xMQogSW1wb3J0LVBhY2thZ2U6IGNvbS5qY3JhZnQuanNjaDt2ZXJzaW9uPSJbMC4xLjU0LDAuMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5lcnJvcnM7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5qdW5pdDt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LnNzaDt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmxpYjt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5zc2guanNjaDt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnM7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5qdW5pdDt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LnNzaDt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmxpYjt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5zc2guanNjaDt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCiAgb3JnLmhhbWNyZXN0O3ZlcnNpb249IlsxLjEuMCwzLjAuMCkiLAogIG9yZy5qdW5pdDt2ZXJzaW9uPSJbNC4xMyw1LjAuMCkiLAogIG9yZy5qdW5pdC5leHBlcmltZW50YWwudGhlb3JpZXM7dmVyc2lvbj0iWzQuMTMsNS4wLjApIiwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuc3NoLmpzY2gudGVzdC9wb20ueG1sIGIvb3JnLmVjbGlwc2UuamdpdC5zc2guanNjaC50ZXN0L3BvbS54bWwKaW5kZXggNmYxOTllNi4uY2ExZTc0MiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5zc2guanNjaC50ZXN0L3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5zc2guanNjaC50ZXN0L3BvbS54bWwKQEAgLTE3LDcgKzE3LDcgQEAKICAgPHBhcmVudD4KICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0PC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjYuMC4xLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjYuMS4xLVNOQVBTSE9UPC92ZXJzaW9uPgogICA8L3BhcmVudD4KIAogICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0LnNzaC5qc2NoLnRlc3Q8L2FydGlmYWN0SWQ+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5qc2NoL01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuamdpdC5zc2guanNjaC9NRVRBLUlORi9NQU5JRkVTVC5NRgppbmRleCBlZDk5N2ZiLi4zMzJkOTgxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5qc2NoL01FVEEtSU5GL01BTklGRVNULk1GCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuc3NoLmpzY2gvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTMsMTkgKzMsMTkgQEAKIEJ1bmRsZS1OYW1lOiAlQnVuZGxlLU5hbWUKIEF1dG9tYXRpYy1Nb2R1bGUtTmFtZTogb3JnLmVjbGlwc2UuamdpdC5zc2guanNjaAogQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuamdpdC5zc2guanNjaDtzaW5nbGV0b246PXRydWUKLUZyYWdtZW50LUhvc3Q6IG9yZy5lY2xpcHNlLmpnaXQ7YnVuZGxlLXZlcnNpb249Ils2LjAuMSw2LjEuMCkiCitGcmFnbWVudC1Ib3N0OiBvcmcuZWNsaXBzZS5qZ2l0O2J1bmRsZS12ZXJzaW9uPSJbNi4xLjEsNi4yLjApIgogQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IKIEJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgogQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKLUJ1bmRsZS1WZXJzaW9uOiA2LjAuMS5xdWFsaWZpZXIKK0J1bmRsZS1WZXJzaW9uOiA2LjEuMS5xdWFsaWZpZXIKIEJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKYXZhU0UtMTEKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5zc2guanNjaDt2ZXJzaW9uPSI2LjAuMSIKK0V4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5zc2guanNjaDt2ZXJzaW9uPSI2LjEuMSIKIEltcG9ydC1QYWNrYWdlOiBjb20uamNyYWZ0LmpzY2g7dmVyc2lvbj0iWzAuMS4zNywwLjIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWw7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC50cmFuc3BvcnQuc3NoO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubmxzO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0O3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudXRpbDt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuaW87dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnM7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbDt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnRyYW5zcG9ydC5zc2g7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5ubHM7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQ7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC51dGlsO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5pbzt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKICBvcmcuc2xmNGo7dmVyc2lvbj0iWzEuNy4wLDIuMC4wKSIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuc3NoLmpzY2gvTUVUQS1JTkYvU09VUkNFLU1BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuamdpdC5zc2guanNjaC9NRVRBLUlORi9TT1VSQ0UtTUFOSUZFU1QuTUYKaW5kZXggM2MzZjJiMS4uYjU2YmI3YyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5zc2guanNjaC9NRVRBLUlORi9TT1VSQ0UtTUFOSUZFU1QuTUYKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5zc2guanNjaC9NRVRBLUlORi9TT1VSQ0UtTUFOSUZFU1QuTUYKQEAgLTMsNSArMyw1IEBACiBCdW5kbGUtTmFtZTogb3JnLmVjbGlwc2UuamdpdC5zc2guanNjaCAtIFNvdXJjZXMKIEJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpnaXQuc3NoLmpzY2guc291cmNlCiBCdW5kbGUtVmVuZG9yOiBFY2xpcHNlLm9yZyAtIEpHaXQKLUJ1bmRsZS1WZXJzaW9uOiA2LjAuMS5xdWFsaWZpZXIKLUVjbGlwc2UtU291cmNlQnVuZGxlOiBvcmcuZWNsaXBzZS5qZ2l0LnNzaC5qc2NoO3ZlcnNpb249IjYuMC4xLnF1YWxpZmllciI7cm9vdHM9Ii4iCitCdW5kbGUtVmVyc2lvbjogNi4xLjEucXVhbGlmaWVyCitFY2xpcHNlLVNvdXJjZUJ1bmRsZTogb3JnLmVjbGlwc2UuamdpdC5zc2guanNjaDt2ZXJzaW9uPSI2LjEuMS5xdWFsaWZpZXIiO3Jvb3RzPSIuIgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5zc2guanNjaC9wb20ueG1sIGIvb3JnLmVjbGlwc2UuamdpdC5zc2guanNjaC9wb20ueG1sCmluZGV4IDJhNWY5YjguLjNiNmQ2NmMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuc3NoLmpzY2gvcG9tLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5qc2NoL3BvbS54bWwKQEAgLTE3LDcgKzE3LDcgQEAKICAgPHBhcmVudD4KICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0PC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjYuMC4xLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjYuMS4xLVNOQVBTSE9UPC92ZXJzaW9uPgogICA8L3BhcmVudD4KIAogICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0LnNzaC5qc2NoPC9hcnRpZmFjdElkPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L0JVSUxEIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L0JVSUxECmluZGV4IDllNzg3ZmUuLjZmNmM4OGMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC9CVUlMRAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvQlVJTEQKQEAgLTEzLDYgKzEzLDcgQEAKICkgKyBbUEtHICsgYyBmb3IgYyBpbiBbCiAgICAgImFwaS9BYnN0cmFjdFJlbW90ZUNvbW1hbmRUZXN0LmphdmEiLAogICAgICJkaWZmL0Fic3RyYWN0RGlmZlRlc3RDYXNlLmphdmEiLAorICAgICJpbnRlcm5hbC9kaWZmbWVyZ2V0b29sL0V4dGVybmFsVG9vbFRlc3RDYXNlLmphdmEiLAogICAgICJpbnRlcm5hbC9yZXZ3YWxrL09iamVjdFJlYWNoYWJpbGl0eVRlc3RDYXNlLmphdmEiLAogICAgICJpbnRlcm5hbC9yZXZ3YWxrL1JlYWNoYWJpbGl0eUNoZWNrZXJUZXN0Q2FzZS5qYXZhIiwKICAgICAiaW50ZXJuYWwvc3RvcmFnZS9maWxlL0djVGVzdENhc2UuamF2YSIsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYKaW5kZXggMDQ2OTExMy4uNTgxMzk1ZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMyw3ICszLDcgQEAKIEJ1bmRsZS1OYW1lOiAlQnVuZGxlLU5hbWUKIEF1dG9tYXRpYy1Nb2R1bGUtTmFtZTogb3JnLmVjbGlwc2UuamdpdC50ZXN0CiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZ2l0LnRlc3QKLUJ1bmRsZS1WZXJzaW9uOiA2LjAuMS5xdWFsaWZpZXIKK0J1bmRsZS1WZXJzaW9uOiA2LjEuMS5xdWFsaWZpZXIKIEJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgogQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IKIEJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKYXZhU0UtMTEKQEAgLTE2LDYwICsxNiw2MSBAQAogIG9yZy5hcGFjaGUuY29tbW9ucy5jb21wcmVzcy5jb21wcmVzc29ycy5nemlwO3ZlcnNpb249IlsxLjE1LjAsMi4wKSIsCiAgb3JnLmFwYWNoZS5jb21tb25zLmNvbXByZXNzLmNvbXByZXNzb3JzLnh6O3ZlcnNpb249IlsxLjE1LjAsMi4wKSIsCiAgb3JnLmFzc2VydGouY29yZS5hcGk7dmVyc2lvbj0iWzMuMTQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuYW5ub3RhdGlvbnM7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5hcGk7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZTt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmF0dHJpYnV0ZXM7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5hd3R1aTt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmJsYW1lO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuZGlmZjt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmRpcmNhY2hlO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuZXZlbnRzO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuZm5tYXRjaDt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmdpdHJlcG87dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5ob29rczt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmlnbm9yZTt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmlnbm9yZS5pbnRlcm5hbDt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuZnNjazt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnJldndhbGs7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmRmczt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuaW87dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnBhY2s7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnJlZnRhYmxlO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwudHJhbnNwb3J0LmNvbm5lY3Rpdml0eTt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnRyYW5zcG9ydC5odHRwO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwudHJhbnNwb3J0LnBhcnNlcjt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnRyYW5zcG9ydC5zc2g7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5qdW5pdDt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LnRpbWU7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5sZnM7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5saWI7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5saWIuaW50ZXJuYWw7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5sb2dnaW5nO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubWVyZ2U7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5ubHM7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5ub3Rlczt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnBhdGNoO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQucGdtO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQucGdtLmludGVybmFsO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQucmV2cGxvdDt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGs7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLmZpbHRlcjt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UucGFjazt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnN1Ym1vZHVsZTt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5odHRwO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LnJlc29sdmVyO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGs7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5maWx0ZXI7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC51dGlsO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5pbzt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuc2hhMTt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmFubm90YXRpb25zO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuYXBpO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9yczt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmU7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5hdHRyaWJ1dGVzO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuYXd0dWk7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5ibGFtZTt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmRpZmY7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5kaXJjYWNoZTt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmVycm9yczt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmV2ZW50czt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmZubWF0Y2g7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5naXRyZXBvO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaG9va3M7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pZ25vcmU7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pZ25vcmUuaW50ZXJuYWw7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbDt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLmRpZmZtZXJnZXRvb2w7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5mc2NrO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwucmV2d2Fsazt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZGZzO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5maWxlO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5pbzt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UucGFjazt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UucmVmdGFibGU7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC50cmFuc3BvcnQuY29ubmVjdGl2aXR5O3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwudHJhbnNwb3J0Lmh0dHA7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC50cmFuc3BvcnQucGFyc2VyO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwudHJhbnNwb3J0LnNzaDt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0O3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuanVuaXQudGltZTt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmxmczt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmxpYjt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5pbnRlcm5hbDt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmxvZ2dpbmc7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5tZXJnZTt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lm5sczt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lm5vdGVzO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQucGF0Y2g7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5wZ207dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5wZ20uaW50ZXJuYWw7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5yZXZwbG90O3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsazt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuZmlsdGVyO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5maWxlO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5wYWNrO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuc3VibW9kdWxlO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0O3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0Lmh0dHA7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQucmVzb2x2ZXI7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsazt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLmZpbHRlcjt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC51dGlsLmlvO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5zaGExO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAogIG9yZy5oYW1jcmVzdDt2ZXJzaW9uPSJbMS4xLjAsMy4wLjApIiwKICBvcmcuaGFtY3Jlc3QuY29sbGVjdGlvbjt2ZXJzaW9uPSJbMS4xLjAsMy4wLjApIiwKICBvcmcuanVuaXQ7dmVyc2lvbj0iWzQuMTMsNS4wLjApIiwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC9wb20ueG1sIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3BvbS54bWwKaW5kZXggM2NhYjM2Mi4uNmI2NjkxOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3BvbS54bWwKQEAgLTE5LDcgKzE5LDcgQEAKICAgPHBhcmVudD4KICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0PC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjYuMC4xLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjYuMS4xLVNOQVBTSE9UPC92ZXJzaW9uPgogICA8L3BhcmVudD4KIAogICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0LnRlc3Q8L2FydGlmYWN0SWQ+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0FwcGx5Q29tbWFuZFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvQXBwbHlDb21tYW5kVGVzdC5qYXZhCmluZGV4IDg2NzMxMGIuLjU4NGQxNDkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvQXBwbHlDb21tYW5kVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvQXBwbHlDb21tYW5kVGVzdC5qYXZhCkBAIC0zMiw2ICszMiw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5SZXBvc2l0b3J5VGVzdENhc2U7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uZmlnOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbmZpZ0NvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuRlM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLklPOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCkBAIC00MDIsNyArNDAzLDkgQEAgcHVibGljIHZvaWQgdGVzdE1vZGlmeVcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAlwdWJsaWMgdm9pZCB0ZXN0QWRkTTEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJQXBwbHlSZXN1bHQgcmVzdWx0ID0gaW5pdCgiTTEiLCBmYWxzZSwgdHJ1ZSk7CiAJCWFzc2VydEVxdWFscygxLCByZXN1bHQuZ2V0VXBkYXRlZEZpbGVzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZXN1bHQuZ2V0VXBkYXRlZEZpbGVzKCkuZ2V0KDApLmNhbkV4ZWN1dGUoKSk7CisJCWlmIChGUy5ERVRFQ1RFRC5zdXBwb3J0c0V4ZWN1dGUoKSkgeworCQkJYXNzZXJ0VHJ1ZShGUy5ERVRFQ1RFRC5jYW5FeGVjdXRlKHJlc3VsdC5nZXRVcGRhdGVkRmlsZXMoKS5nZXQoMCkpKTsKKwkJfQogCQljaGVja0ZpbGUobmV3IEZpbGUoZGIuZ2V0V29ya1RyZWUoKSwgIk0xIiksCiAJCQkJYi5nZXRTdHJpbmcoMCwgYi5zaXplKCksIGZhbHNlKSk7CiAJfQpAQCAtNDExLDcgKzQxNCw5IEBAIHB1YmxpYyB2b2lkIHRlc3RBZGRNMSgpIHRocm93cyBFeGNlcHRpb24gewogCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlNMigpIHRocm93cyBFeGNlcHRpb24gewogCQlBcHBseVJlc3VsdCByZXN1bHQgPSBpbml0KCJNMiIsIHRydWUsIHRydWUpOwogCQlhc3NlcnRFcXVhbHMoMSwgcmVzdWx0LmdldFVwZGF0ZWRGaWxlcygpLnNpemUoKSk7Ci0JCWFzc2VydFRydWUocmVzdWx0LmdldFVwZGF0ZWRGaWxlcygpLmdldCgwKS5jYW5FeGVjdXRlKCkpOworCQlpZiAoRlMuREVURUNURUQuc3VwcG9ydHNFeGVjdXRlKCkpIHsKKwkJCWFzc2VydFRydWUoRlMuREVURUNURUQuY2FuRXhlY3V0ZShyZXN1bHQuZ2V0VXBkYXRlZEZpbGVzKCkuZ2V0KDApKSk7CisJCX0KIAkJY2hlY2tGaWxlKG5ldyBGaWxlKGRiLmdldFdvcmtUcmVlKCksICJNMiIpLAogCQkJCWIuZ2V0U3RyaW5nKDAsIGIuc2l6ZSgpLCBmYWxzZSkpOwogCX0KQEAgLTQyMCw3ICs0MjUsMTAgQEAgcHVibGljIHZvaWQgdGVzdE1vZGlmeU0yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJcHVibGljIHZvaWQgdGVzdE1vZGlmeU0zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCUFwcGx5UmVzdWx0IHJlc3VsdCA9IGluaXQoIk0zIiwgdHJ1ZSwgdHJ1ZSk7CiAJCWFzc2VydEVxdWFscygxLCByZXN1bHQuZ2V0VXBkYXRlZEZpbGVzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVzdWx0LmdldFVwZGF0ZWRGaWxlcygpLmdldCgwKS5jYW5FeGVjdXRlKCkpOworCQlpZiAoRlMuREVURUNURUQuc3VwcG9ydHNFeGVjdXRlKCkpIHsKKwkJCWFzc2VydEZhbHNlKAorCQkJCQlGUy5ERVRFQ1RFRC5jYW5FeGVjdXRlKHJlc3VsdC5nZXRVcGRhdGVkRmlsZXMoKS5nZXQoMCkpKTsKKwkJfQogCQljaGVja0ZpbGUobmV3IEZpbGUoZGIuZ2V0V29ya1RyZWUoKSwgIk0zIiksCiAJCQkJYi5nZXRTdHJpbmcoMCwgYi5zaXplKCksIGZhbHNlKSk7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9CcmFuY2hDb21tYW5kVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9CcmFuY2hDb21tYW5kVGVzdC5qYXZhCmluZGV4IGU3ZWQxMDIuLjg3YmU4MTMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvQnJhbmNoQ29tbWFuZFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0JyYW5jaENvbW1hbmRUZXN0LmphdmEKQEAgLTcxLDYgKzcxLDcgQEAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAogCXByaXZhdGUgR2l0IHNldFVwUmVwb1dpdGhSZW1vdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJUmVwb3NpdG9yeSByZW1vdGVSZXBvc2l0b3J5ID0gY3JlYXRlV29ya1JlcG9zaXRvcnkoKTsKKwkJYWRkUmVwb1RvQ2xvc2UocmVtb3RlUmVwb3NpdG9yeSk7CiAJCXRyeSAoR2l0IHJlbW90ZUdpdCA9IG5ldyBHaXQocmVtb3RlUmVwb3NpdG9yeSkpIHsKIAkJCS8vIGNvbW1pdCBzb21ldGhpbmcKIAkJCXdyaXRlVHJhc2hGaWxlKCJUZXN0LnR4dCIsICJIZWxsbyB3b3JsZCIpOwpAQCAtODUsNiArODYsNyBAQCBwcml2YXRlIEdpdCBzZXRVcFJlcG9XaXRoUmVtb3RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCQlydXAuZm9yY2VVcGRhdGUoKTsKIAogCQkJUmVwb3NpdG9yeSBsb2NhbFJlcG9zaXRvcnkgPSBjcmVhdGVXb3JrUmVwb3NpdG9yeSgpOworCQkJYWRkUmVwb1RvQ2xvc2UobG9jYWxSZXBvc2l0b3J5KTsKIAkJCUdpdCBsb2NhbEdpdCA9IG5ldyBHaXQobG9jYWxSZXBvc2l0b3J5KTsKIAkJCVN0b3JlZENvbmZpZyBjb25maWcgPSBsb2NhbFJlcG9zaXRvcnkuZ2V0Q29uZmlnKCk7CiAJCQlSZW1vdGVDb25maWcgcmMgPSBuZXcgUmVtb3RlQ29uZmlnKGNvbmZpZywgIm9yaWdpbiIpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9DaGVja291dENvbW1hbmRUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0NoZWNrb3V0Q29tbWFuZFRlc3QuamF2YQppbmRleCBlNTIwNzMyLi5hYjAxODRiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0NoZWNrb3V0Q29tbWFuZFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0NoZWNrb3V0Q29tbWFuZFRlc3QuamF2YQpAQCAtMjkyLDYgKzI5Miw3IEBAIHB1YmxpYyB2b2lkIHRlc3RDaGVja291dEFubm90YXRlZFRhZygpIHRocm93cyBFeGNlcHRpb24gewogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdENoZWNrb3V0UmVtb3RlVHJhY2tpbmdXaXRoVXBzdHJlYW0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJUmVwb3NpdG9yeSBkYjIgPSBjcmVhdGVSZXBvc2l0b3J5V2l0aFJlbW90ZSgpOworCQlhZGRSZXBvVG9DbG9zZShkYjIpOwogCiAJCUdpdC53cmFwKGRiMikuY2hlY2tvdXQoKS5zZXRDcmVhdGVCcmFuY2godHJ1ZSkuc2V0TmFtZSgidGVzdCIpCiAJCQkJLnNldFN0YXJ0UG9pbnQoIm9yaWdpbi90ZXN0IikKQEAgLTMxMSw2ICszMTIsNyBAQCBwdWJsaWMgdm9pZCB0ZXN0Q2hlY2tvdXRSZW1vdGVUcmFja2luZ1dpdGhVcHN0cmVhbSgpIHRocm93cyBFeGNlcHRpb24gewogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdENoZWNrb3V0UmVtb3RlVHJhY2tpbmdXaXRob3V0TG9jYWxCcmFuY2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJUmVwb3NpdG9yeSBkYjIgPSBjcmVhdGVSZXBvc2l0b3J5V2l0aFJlbW90ZSgpOworCQlhZGRSZXBvVG9DbG9zZShkYjIpOwogCiAJCS8vIGNoZWNrb3V0IHJlbW90ZSB0cmFja2luZyBicmFuY2ggaW4gc2Vjb25kIHJlcG9zaXRvcnkKIAkJLy8gKG5vIGxvY2FsIGJyYW5jaGVzIGV4aXN0IHlldCBpbiBzZWNvbmQgcmVwb3NpdG9yeSkKQEAgLTg2OCw3ICs4NzAsNyBAQCBwdWJsaWMgdm9pZCB0ZXN0Tm9uRGVsZXRhYmxlRmlsZXNPbldpbmRvd3MoKQogCQkJY29Db21tYW5kLnNldE5hbWUoY3J1ZENvbW1pdC5nZXROYW1lKCkpLmNhbGwoKTsKIAkJCUNoZWNrb3V0UmVzdWx0IHJlc3VsdCA9IGNvQ29tbWFuZC5nZXRSZXN1bHQoKTsKIAkJCWFzc2VydEVxdWFscyhTdGF0dXMuTk9OREVMRVRFRCwgcmVzdWx0LmdldFN0YXR1cygpKTsKLQkJCWFzc2VydEVxdWFscygiW1Rlc3QudHh0LCB0b0JlRGVsZXRlZC50eHRdIiwKKwkJCWFzc2VydEVxdWFscygiW3RvQmVEZWxldGVkLnR4dF0iLAogCQkJCQlyZXN1bHQuZ2V0UmVtb3ZlZExpc3QoKS50b1N0cmluZygpKTsKIAkJCWFzc2VydEVxdWFscygiW3RvQmVDcmVhdGVkLnR4dCwgdG9CZU1vZGlmaWVkLnR4dF0iLAogCQkJCQlyZXN1bHQuZ2V0TW9kaWZpZWRMaXN0KCkudG9TdHJpbmcoKSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0NoZXJyeVBpY2tDb21tYW5kVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9DaGVycnlQaWNrQ29tbWFuZFRlc3QuamF2YQppbmRleCBmNGYwZWNkLi4wZDM4MTk3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0NoZXJyeVBpY2tDb21tYW5kVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvQ2hlcnJ5UGlja0NvbW1hbmRUZXN0LmphdmEKQEAgLTE3NSw3ICsxNzUsOCBAQCBwdWJsaWMgdm9pZCB0ZXN0Q2hlcnJ5UGlja0NvbmZsaWN0UmVzb2x1dGlvbigpIHRocm93cyBFeGNlcHRpb24gewogCiAJCQlhc3NlcnRFcXVhbHMoQ2hlcnJ5UGlja1N0YXR1cy5DT05GTElDVElORywgcmVzdWx0LmdldFN0YXR1cygpKTsKIAkJCWFzc2VydFRydWUobmV3IEZpbGUoZGIuZ2V0RGlyZWN0b3J5KCksIENvbnN0YW50cy5NRVJHRV9NU0cpLmV4aXN0cygpKTsKLQkJCWFzc2VydEVxdWFscygic2lkZVxuXG5Db25mbGljdHM6XG5cdGFcbiIsIGRiLnJlYWRNZXJnZUNvbW1pdE1zZygpKTsKKwkJCWFzc2VydEVxdWFscygic2lkZVxuXG4jIENvbmZsaWN0czpcbiNcdGFcbiIsCisJCQkJCWRiLnJlYWRNZXJnZUNvbW1pdE1zZygpKTsKIAkJCWFzc2VydFRydWUobmV3IEZpbGUoZGIuZ2V0RGlyZWN0b3J5KCksIENvbnN0YW50cy5DSEVSUllfUElDS19IRUFEKQogCQkJCQkuZXhpc3RzKCkpOwogCQkJYXNzZXJ0RXF1YWxzKHNpZGVDb21taXQuZ2V0SWQoKSwgZGIucmVhZENoZXJyeVBpY2tIZWFkKCkpOwpAQCAtMjA3LDcgKzIwOCw3IEBAIHB1YmxpYyB2b2lkIHRlc3RDaGVycnlQaWNrQ29uZmxpY3RSZXNvbHV0aW9uTm9Db21taXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJU3RyaW5nIGV4cGVjdGVkID0gIjw8PDw8PDwgbWFzdGVyXG5hKG1hc3Rlcilcbj09PT09PT1cbmEoc2lkZSlcbj4+Pj4+Pj4gNTI3NDYwYSBzaWRlXG4iOwogCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHJlYWQoImEiKSk7CiAJCWFzc2VydFRydWUobmV3IEZpbGUoZGIuZ2V0RGlyZWN0b3J5KCksIENvbnN0YW50cy5NRVJHRV9NU0cpLmV4aXN0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzaWRlXG5cbkNvbmZsaWN0czpcblx0YVxuIiwgZGIucmVhZE1lcmdlQ29tbWl0TXNnKCkpOworCQlhc3NlcnRFcXVhbHMoInNpZGVcblxuIyBDb25mbGljdHM6XG4jXHRhXG4iLCBkYi5yZWFkTWVyZ2VDb21taXRNc2coKSk7CiAJCWFzc2VydEZhbHNlKG5ldyBGaWxlKGRiLmdldERpcmVjdG9yeSgpLCBDb25zdGFudHMuQ0hFUlJZX1BJQ0tfSEVBRCkKIAkJCQkuZXhpc3RzKCkpOwogCQlhc3NlcnRFcXVhbHMoUmVwb3NpdG9yeVN0YXRlLlNBRkUsIGRiLmdldFJlcG9zaXRvcnlTdGF0ZSgpKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvQ29tbWl0Q29tbWFuZFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvQ29tbWl0Q29tbWFuZFRlc3QuamF2YQppbmRleCA4MDg0NTA1Li4zNWRlNzNlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0NvbW1pdENvbW1hbmRUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9Db21taXRDb21tYW5kVGVzdC5qYXZhCkBAIC00Niw2ICs0Niw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVmbG9nRW50cnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVwb3NpdG9yeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5TdG9yZWRDb25maWc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29tbWl0Q29uZmlnLkNsZWFudXBNb2RlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5SZXZDb21taXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLmZpbGUuRmlsZUJhc2VkQ29uZmlnOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuc3VibW9kdWxlLlN1Ym1vZHVsZVdhbGs7CkBAIC01MTUsNiArNTE2LDYyIEBAIHB1YmxpYyB2b2lkIGNvbW1pdEFtZW5kV2l0aEF1dGhvclNob3VsZFVzZUl0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJfQogCiAJQFRlc3QKKwlwdWJsaWMgdm9pZCBjb21taXRNZXNzYWdlVmVyYmF0aW0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdHJ5IChHaXQgZ2l0ID0gbmV3IEdpdChkYikpIHsKKwkJCXdyaXRlVHJhc2hGaWxlKCJmaWxlMSIsICJmaWxlMSIpOworCQkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCJmaWxlMSIpLmNhbGwoKTsKKwkJCVJldkNvbW1pdCBjb21taXR0ZWQgPSBnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgiI2luaXRpYWwgY29tbWl0IikKKwkJCQkJLmNhbGwoKTsKKworCQkJYXNzZXJ0RXF1YWxzKCIjaW5pdGlhbCBjb21taXQiLCBjb21taXR0ZWQuZ2V0RnVsbE1lc3NhZ2UoKSk7CisJCX0KKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNvbW1pdE1lc3NhZ2VTdHJpcCgpIHRocm93cyBFeGNlcHRpb24geworCQl0cnkgKEdpdCBnaXQgPSBuZXcgR2l0KGRiKSkgeworCQkJd3JpdGVUcmFzaEZpbGUoImZpbGUxIiwgImZpbGUxIik7CisJCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oImZpbGUxIikuY2FsbCgpOworCQkJUmV2Q29tbWl0IGNvbW1pdHRlZCA9IGdpdC5jb21taXQoKS5zZXRNZXNzYWdlKAorCQkJCQkiI0NvbW1lbnRcbmluaXRpYWwgY29tbWl0XHRcblxuIGNvbW1pdCBib2R5IFxuIFx0I2Fub3RoZXIgY29tbWVudCIpCisJCQkJCS5zZXRDbGVhbnVwTW9kZShDbGVhbnVwTW9kZS5TVFJJUCkuY2FsbCgpOworCisJCQlhc3NlcnRFcXVhbHMoImluaXRpYWwgY29tbWl0XG5cbiBjb21taXQgYm9keSIsCisJCQkJCWNvbW1pdHRlZC5nZXRGdWxsTWVzc2FnZSgpKTsKKwkJfQorCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY29tbWl0TWVzc2FnZURlZmF1bHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdHJ5IChHaXQgZ2l0ID0gbmV3IEdpdChkYikpIHsKKwkJCXdyaXRlVHJhc2hGaWxlKCJmaWxlMSIsICJmaWxlMSIpOworCQkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCJmaWxlMSIpLmNhbGwoKTsKKwkJCVJldkNvbW1pdCBjb21taXR0ZWQgPSBnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgKKwkJCQkJIiNDb21tZW50XG5pbml0aWFsIGNvbW1pdFx0XG5cbiBjb21taXQgYm9keSBcblxuXG4gXHQjYW5vdGhlciBjb21tZW50ICAiKQorCQkJCQkuc2V0Q2xlYW51cE1vZGUoQ2xlYW51cE1vZGUuREVGQVVMVCkuY2FsbCgpOworCisJCQlhc3NlcnRFcXVhbHMoImluaXRpYWwgY29tbWl0XG5cbiBjb21taXQgYm9keSIsCisJCQkJCWNvbW1pdHRlZC5nZXRGdWxsTWVzc2FnZSgpKTsKKwkJfQorCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY29tbWl0TWVzc2FnZURlZmF1bHRXaGl0ZXNwYWNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRyeSAoR2l0IGdpdCA9IG5ldyBHaXQoZGIpKSB7CisJCQl3cml0ZVRyYXNoRmlsZSgiZmlsZTEiLCAiZmlsZTEiKTsKKwkJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybigiZmlsZTEiKS5jYWxsKCk7CisJCQlSZXZDb21taXQgY29tbWl0dGVkID0gZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoCisJCQkJCSIjQ29tbWVudFxuaW5pdGlhbCBjb21taXRcdFxuXG4gY29tbWl0IGJvZHkgXG5cblxuIFx0I2Fub3RoZXIgY29tbWVudCAgIikKKwkJCQkJLnNldENsZWFudXBNb2RlKENsZWFudXBNb2RlLkRFRkFVTFQpLnNldERlZmF1bHRDbGVhbihmYWxzZSkKKwkJCQkJLmNhbGwoKTsKKworCQkJYXNzZXJ0RXF1YWxzKAorCQkJCQkiI0NvbW1lbnRcbmluaXRpYWwgY29tbWl0XG5cbiBjb21taXQgYm9keVxuXG4gXHQjYW5vdGhlciBjb21tZW50IiwKKwkJCQkJY29tbWl0dGVkLmdldEZ1bGxNZXNzYWdlKCkpOworCQl9CisJfQorCisJQFRlc3QKIAlwdWJsaWMgdm9pZCBjb21taXRFbXB0eUNvbW1pdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJdHJ5IChHaXQgZ2l0ID0gbmV3IEdpdChkYikpIHsKIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9EZXNjcmliZUNvbW1hbmRUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0Rlc2NyaWJlQ29tbWFuZFRlc3QuamF2YQppbmRleCBiNDYwZTNmLi5hYjg3ZmE5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0Rlc2NyaWJlQ29tbWFuZFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0Rlc2NyaWJlQ29tbWFuZFRlc3QuamF2YQpAQCAtMTAsOSArMTAsMTAgQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5hcGk7CiAKIGltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuT0JKRUNUX0lEX0FCQlJFVl9TVFJJTkdfTEVOR1RIOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwogCiBpbXBvcnQgamF2YS5pby5CdWZmZXJlZFdyaXRlcjsKQEAgLTEwMCw2ICsxMDEsMTIgQEAgcHVibGljIHZvaWQgdGVzdERlc2NyaWJlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCQlhc3NlcnRFcXVhbHMoImFsaWNlLXQxLTItZzNlNTYzYzUiLCBkZXNjcmliZShjNCwgImFsaWNlKiIpKTsKIAkJCWFzc2VydEVxdWFscygiYm9iLXQyLTEtZzNlNTYzYzUiLCBkZXNjcmliZShjNCwgImJvYioiKSk7CiAJCQlhc3NlcnRFcXVhbHMoImJvYi10Mi0xLWczZTU2M2M1IiwgZGVzY3JpYmUoYzQsICJhKiIsICJiKiIsICJjKiIpKTsKKworCQkJYXNzZXJ0RXF1YWxzKCJib2ItdDIiLCBkZXNjcmliZShjNCwgZmFsc2UsIHRydWUsIDApKTsKKwkJCWFzc2VydEVxdWFscygiYm9iLXQyLTEtZzNlNTYiLCBkZXNjcmliZShjNCwgZmFsc2UsIHRydWUsIDEpKTsKKwkJCWFzc2VydEVxdWFscygiYm9iLXQyLTEtZzNlNTYiLCBkZXNjcmliZShjNCwgZmFsc2UsIHRydWUsIC0xMCkpOworCQkJYXNzZXJ0RXF1YWxzKCJib2ItdDItMS1nM2U1NjNjNTU5Mjc5MDVmMjFlM2JjN2MwMGEzZDgzYTMxYmY0ZWQzYSIsCisJCQkJCWRlc2NyaWJlKGM0LCBmYWxzZSwgdHJ1ZSwgNTApKTsKIAkJfSBlbHNlIHsKIAkJCWFzc2VydEVxdWFscyhudWxsLCBkZXNjcmliZShjMikpOwogCQkJYXNzZXJ0RXF1YWxzKG51bGwsIGRlc2NyaWJlKGMzKSk7CkBAIC0xMDgsNiArMTE1LDE4IEBAIHB1YmxpYyB2b2lkIHRlc3REZXNjcmliZSgpIHRocm93cyBFeGNlcHRpb24gewogCQkJYXNzZXJ0RXF1YWxzKCIzNzQ3ZGIzIiwgZGVzY3JpYmUoYzIsIGZhbHNlLCB0cnVlKSk7CiAJCQlhc3NlcnRFcXVhbHMoIjQ0NTc5ZWIiLCBkZXNjcmliZShjMywgZmFsc2UsIHRydWUpKTsKIAkJCWFzc2VydEVxdWFscygiM2U1NjNjNSIsIGRlc2NyaWJlKGM0LCBmYWxzZSwgdHJ1ZSkpOworCisJCQlhc3NlcnRFcXVhbHMoIjM3NDdkYjMyNjciLCBkZXNjcmliZShjMiwgZmFsc2UsIHRydWUsIDEwKSk7CisJCQlhc3NlcnRFcXVhbHMoIjQ0NTc5ZWJlN2YiLCBkZXNjcmliZShjMywgZmFsc2UsIHRydWUsIDEwKSk7CisJCQlhc3NlcnRFcXVhbHMoIjNlNTYzYzU1OTIiLCBkZXNjcmliZShjNCwgZmFsc2UsIHRydWUsIDEwKSk7CisKKwkJCWFzc2VydEVxdWFscygiM2U1NiIsIGRlc2NyaWJlKGM0LCBmYWxzZSwgdHJ1ZSwgLTEwKSk7CisJCQlhc3NlcnRFcXVhbHMoIjNlNTYiLCBkZXNjcmliZShjNCwgZmFsc2UsIHRydWUsIDApKTsKKwkJCWFzc2VydEVxdWFscygiM2U1NiIsIGRlc2NyaWJlKGM0LCBmYWxzZSwgdHJ1ZSwgMikpOworCQkJYXNzZXJ0RXF1YWxzKCIzZTU2M2M1NTkyNzkwNWYyMWUzYmM3YzAwYTNkODNhMzFiZjRlZDNhIiwKKwkJCQkJZGVzY3JpYmUoYzQsIGZhbHNlLCB0cnVlLCA0MCkpOworCQkJYXNzZXJ0RXF1YWxzKCIzZTU2M2M1NTkyNzkwNWYyMWUzYmM3YzAwYTNkODNhMzFiZjRlZDNhIiwKKwkJCQkJZGVzY3JpYmUoYzQsIGZhbHNlLCB0cnVlLCA0MikpOwogCQl9CiAKIAkJLy8gdGVzdCBkZWZhdWx0IHRhcmdldApAQCAtNDc0LDEwICs0OTMsMTUgQEAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB0b3VjaChGaWxlIGYsIFN0cmluZyBjb250ZW50cykgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCX0KIAl9CiAKKwlwcml2YXRlIFN0cmluZyBkZXNjcmliZShPYmplY3RJZCBjMSwgYm9vbGVhbiBsb25nRGVzYywgYm9vbGVhbiBhbHdheXMsCisJCQlpbnQgYWJicmV2KSB0aHJvd3MgR2l0QVBJRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisJCXJldHVybiBnaXQuZGVzY3JpYmUoKS5zZXRUYXJnZXQoYzEpLnNldFRhZ3MoZGVzY3JpYmVVc2VBbGxUYWdzKQorCQkJCS5zZXRMb25nKGxvbmdEZXNjKS5zZXRBbHdheXMoYWx3YXlzKS5zZXRBYmJyZXYoYWJicmV2KS5jYWxsKCk7CisJfQorCiAJcHJpdmF0ZSBTdHJpbmcgZGVzY3JpYmUoT2JqZWN0SWQgYzEsIGJvb2xlYW4gbG9uZ0Rlc2MsIGJvb2xlYW4gYWx3YXlzKQogCQkJdGhyb3dzIEdpdEFQSUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gZ2l0LmRlc2NyaWJlKCkuc2V0VGFyZ2V0KGMxKS5zZXRUYWdzKGRlc2NyaWJlVXNlQWxsVGFncykKLQkJCQkuc2V0TG9uZyhsb25nRGVzYykuc2V0QWx3YXlzKGFsd2F5cykuY2FsbCgpOworCQlyZXR1cm4gZGVzY3JpYmUoYzEsIGxvbmdEZXNjLCBhbHdheXMsIE9CSkVDVF9JRF9BQkJSRVZfU1RSSU5HX0xFTkdUSCk7CiAJfQogCiAJcHJpdmF0ZSBTdHJpbmcgZGVzY3JpYmUoT2JqZWN0SWQgYzEpIHRocm93cyBHaXRBUElFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvRW9sUmVwb3NpdG9yeVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvRW9sUmVwb3NpdG9yeVRlc3QuamF2YQppbmRleCBkMGRmZDFhLi5iOTM3YjFmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0VvbFJlcG9zaXRvcnlUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9Fb2xSZXBvc2l0b3J5VGVzdC5qYXZhCkBAIC0xLDQwICsxLDExIEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDE1LCBJdmFuIE1vdHNjaCA8aXZhbi5tb3RzY2hAYnNpYWcuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDE1LCAyMDIyIEl2YW4gTW90c2NoIDxpdmFuLm1vdHNjaEBic2lhZy5jb20+IGFuZCBvdGhlcnMKICAqCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZQotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYxLjAgd2hpY2gKLSAqIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBpcyByZXByb2R1Y2VkIGJlbG93LCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KICAqCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3IKLSAqIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZwotICogY29uZGl0aW9ucyBhcmUgbWV0OgotICoKLSAqIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIC0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZwotICogICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKLSAqICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIC0gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCBJbmMuIG5vciB0aGUKLSAqICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKLSAqICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgotICogICB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5ECi0gKiBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCAqIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCi0gKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUgotICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKLSAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYKLSAqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQogICovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuYXBpOwogCkBAIC0xNzMsMTUgKzE0NCwyMiBAQCBwcml2YXRlIHN0YXRpYyBjbGFzcyBBY3R1YWxFbnRyeSB7CiAKIAlwcml2YXRlIERpckNhY2hlIGRpckNhY2hlOwogCisJcHJpdmF0ZSBib29sZWFuIGlzRGVmYXVsdENyTGYoKSB7CisJCVN0cmluZyBlb2wgPSBtb2NrU3lzdGVtUmVhZGVyLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOworCQlyZXR1cm4gIlxyXG4iLmVxdWFscyhlb2wpOworCX0KKwogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdERlZmF1bHRTZXR1cCgpIHRocm93cyBFeGNlcHRpb24gewogCQkvLyBmb3IgRU9MIHRvIHdvcmssIHRoZSB0ZXh0IGF0dHJpYnV0ZSBtdXN0IGJlIHNldAogCQlzZXR1cEdpdEFuZERvSGFyZFJlc2V0KG51bGwsIG51bGwsIG51bGwsIG51bGwsICIqIHRleHQ9YXV0byIpOwogCQljb2xsZWN0UmVwb3NpdG9yeVN0YXRlKCk7CiAJCWFzc2VydEVxdWFscygidGV4dD1hdXRvIiwgZW50cnlDUkxGLmF0dHJzKTsKLQkJY2hlY2tFbnRyeUNvbnRlbnQoZW50cnlDUkxGLCBDT05URU5UX0xGLCBDT05URU5UX0xGKTsKLQkJY2hlY2tFbnRyeUNvbnRlbnQoZW50cnlMRiwgQ09OVEVOVF9MRiwgQ09OVEVOVF9MRik7Ci0JCWNoZWNrRW50cnlDb250ZW50KGVudHJ5TWl4ZWQsIENPTlRFTlRfTEYsIENPTlRFTlRfTEYpOworCQkvLyBlb2w9bmF0aXZlIGlzIHRoZSBkZWZhdWx0IQorCQlTdHJpbmcgZXhwZWN0ZWQgPSBpc0RlZmF1bHRDckxmKCkgPyBDT05URU5UX0NSTEYgOiBDT05URU5UX0xGOworCQljaGVja0VudHJ5Q29udGVudChlbnRyeUNSTEYsIGV4cGVjdGVkLCBDT05URU5UX0xGKTsKKwkJY2hlY2tFbnRyeUNvbnRlbnQoZW50cnlMRiwgZXhwZWN0ZWQsIENPTlRFTlRfTEYpOworCQljaGVja0VudHJ5Q29udGVudChlbnRyeU1peGVkLCBleHBlY3RlZCwgQ09OVEVOVF9MRik7CiAJfQogCiAJcHVibGljIHZvaWQgY2hlY2tFbnRyeUNvbnRlbnQoQWN0dWFsRW50cnkgZW50cnksIFN0cmluZyBmaWxlQ29udGVudCwKQEAgLTE5OSw5ICsxNzcsMTEgQEAgcHVibGljIHZvaWQgdGVzdF9Db25maWdBdXRvQ1JMRl9mYWxzZSgpIHRocm93cyBFeGNlcHRpb24gewogCQlzZXR1cEdpdEFuZERvSGFyZFJlc2V0KEF1dG9DUkxGLkZBTFNFLCBudWxsLCBudWxsLCBudWxsLCAiKiB0ZXh0PWF1dG8iKTsKIAkJY29sbGVjdFJlcG9zaXRvcnlTdGF0ZSgpOwogCQlhc3NlcnRFcXVhbHMoInRleHQ9YXV0byIsIGVudHJ5Q1JMRi5hdHRycyk7Ci0JCWNoZWNrRW50cnlDb250ZW50KGVudHJ5Q1JMRiwgQ09OVEVOVF9MRiwgQ09OVEVOVF9MRik7Ci0JCWNoZWNrRW50cnlDb250ZW50KGVudHJ5TEYsIENPTlRFTlRfTEYsIENPTlRFTlRfTEYpOwotCQljaGVja0VudHJ5Q29udGVudChlbnRyeU1peGVkLCBDT05URU5UX0xGLCBDT05URU5UX0xGKTsKKwkJLy8gZW9sPW5hdGl2ZSBpcyB0aGUgZGVmYXVsdCEKKwkJU3RyaW5nIGV4cGVjdGVkID0gaXNEZWZhdWx0Q3JMZigpID8gQ09OVEVOVF9DUkxGIDogQ09OVEVOVF9MRjsKKwkJY2hlY2tFbnRyeUNvbnRlbnQoZW50cnlDUkxGLCBleHBlY3RlZCwgQ09OVEVOVF9MRik7CisJCWNoZWNrRW50cnlDb250ZW50KGVudHJ5TEYsIGV4cGVjdGVkLCBDT05URU5UX0xGKTsKKwkJY2hlY2tFbnRyeUNvbnRlbnQoZW50cnlNaXhlZCwgZXhwZWN0ZWQsIENPTlRFTlRfTEYpOwogCX0KIAogCUBUZXN0CkBAIC0yNTAsMzQgKzIzMCwyNCBAQCBwdWJsaWMgdm9pZCB0ZXN0X0NvbmZpZ0VPTF9jcmxmKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RfQ29uZmlnRU9MX25hdGl2ZV93aW5kb3dzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBvcmlnTGluZVNlcGFyYXRvciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiLCAiXG4iKTsKLQkJU3lzdGVtLnNldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIsICJcclxuIik7Ci0JCXRyeSB7Ci0JCQkvLyBmb3IgRU9MIHRvIHdvcmssIHRoZSB0ZXh0IGF0dHJpYnV0ZSBtdXN0IGJlIHNldAotCQkJc2V0dXBHaXRBbmREb0hhcmRSZXNldChudWxsLCBFT0wuTkFUSVZFLCAiKi50eHQgdGV4dCIsIG51bGwsIG51bGwpOwotCQkJY29sbGVjdFJlcG9zaXRvcnlTdGF0ZSgpOwotCQkJYXNzZXJ0RXF1YWxzKCJ0ZXh0IiwgZW50cnlDUkxGLmF0dHJzKTsKLQkJCWNoZWNrRW50cnlDb250ZW50KGVudHJ5Q1JMRiwgQ09OVEVOVF9MRiwgQ09OVEVOVF9MRik7Ci0JCQljaGVja0VudHJ5Q29udGVudChlbnRyeUxGLCBDT05URU5UX0xGLCBDT05URU5UX0xGKTsKLQkJfSBmaW5hbGx5IHsKLQkJCVN5c3RlbS5zZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiLCBvcmlnTGluZVNlcGFyYXRvcik7Ci0JCX0KKwkJbW9ja1N5c3RlbVJlYWRlci5zZXRXaW5kb3dzKCk7CisJCS8vIGZvciBFT0wgdG8gd29yaywgdGhlIHRleHQgYXR0cmlidXRlIG11c3QgYmUgc2V0CisJCXNldHVwR2l0QW5kRG9IYXJkUmVzZXQobnVsbCwgRU9MLk5BVElWRSwgIioudHh0IHRleHQiLCBudWxsLCBudWxsKTsKKwkJY29sbGVjdFJlcG9zaXRvcnlTdGF0ZSgpOworCQlhc3NlcnRFcXVhbHMoInRleHQiLCBlbnRyeUNSTEYuYXR0cnMpOworCQljaGVja0VudHJ5Q29udGVudChlbnRyeUNSTEYsIENPTlRFTlRfQ1JMRiwgQ09OVEVOVF9MRik7CisJCWNoZWNrRW50cnlDb250ZW50KGVudHJ5TEYsIENPTlRFTlRfQ1JMRiwgQ09OVEVOVF9MRik7CiAJfQogCiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0X0NvbmZpZ0VPTF9uYXRpdmVfeG5peCgpIHRocm93cyBFeGNlcHRpb24gewotCQlTdHJpbmcgb3JpZ0xpbmVTZXBhcmF0b3IgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIiwgIlxuIik7Ci0JCVN5c3RlbS5zZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiLCAiXG4iKTsKLQkJdHJ5IHsKLQkJCS8vIGZvciBFT0wgdG8gd29yaywgdGhlIHRleHQgYXR0cmlidXRlIG11c3QgYmUgc2V0Ci0JCQlzZXR1cEdpdEFuZERvSGFyZFJlc2V0KG51bGwsIEVPTC5OQVRJVkUsICIqLnR4dCB0ZXh0IiwgbnVsbCwgbnVsbCk7Ci0JCQljb2xsZWN0UmVwb3NpdG9yeVN0YXRlKCk7Ci0JCQlhc3NlcnRFcXVhbHMoInRleHQiLCBlbnRyeUNSTEYuYXR0cnMpOwotCQkJY2hlY2tFbnRyeUNvbnRlbnQoZW50cnlDUkxGLCBDT05URU5UX0xGLCBDT05URU5UX0xGKTsKLQkJCWNoZWNrRW50cnlDb250ZW50KGVudHJ5TEYsIENPTlRFTlRfTEYsIENPTlRFTlRfTEYpOwotCQl9IGZpbmFsbHkgewotCQkJU3lzdGVtLnNldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIsIG9yaWdMaW5lU2VwYXJhdG9yKTsKLQkJfQorCQltb2NrU3lzdGVtUmVhZGVyLnNldFVuaXgoKTsKKwkJLy8gZm9yIEVPTCB0byB3b3JrLCB0aGUgdGV4dCBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQKKwkJc2V0dXBHaXRBbmREb0hhcmRSZXNldChudWxsLCBFT0wuTkFUSVZFLCAiKi50eHQgdGV4dCIsIG51bGwsIG51bGwpOworCQljb2xsZWN0UmVwb3NpdG9yeVN0YXRlKCk7CisJCWFzc2VydEVxdWFscygidGV4dCIsIGVudHJ5Q1JMRi5hdHRycyk7CisJCWNoZWNrRW50cnlDb250ZW50KGVudHJ5Q1JMRiwgQ09OVEVOVF9MRiwgQ09OVEVOVF9MRik7CisJCWNoZWNrRW50cnlDb250ZW50KGVudHJ5TEYsIENPTlRFTlRfTEYsIENPTlRFTlRfTEYpOwogCX0KIAogCUBUZXN0CkBAIC0yOTcsOSArMjY3LDEwIEBAIHB1YmxpYyB2b2lkIHRlc3RfQ29uZmlnQXV0b0NSTEZfZmFsc2VfQ29uZmlnRU9MX25hdGl2ZSgpIHRocm93cyBFeGNlcHRpb24gewogCQlzZXR1cEdpdEFuZERvSGFyZFJlc2V0KEF1dG9DUkxGLkZBTFNFLCBFT0wuTkFUSVZFLCAiKi50eHQgdGV4dCIsIG51bGwsIG51bGwpOwogCQljb2xsZWN0UmVwb3NpdG9yeVN0YXRlKCk7CiAJCWFzc2VydEVxdWFscygidGV4dCIsIGVudHJ5Q1JMRi5hdHRycyk7Ci0JCWNoZWNrRW50cnlDb250ZW50KGVudHJ5Q1JMRiwgQ09OVEVOVF9MRiwgQ09OVEVOVF9MRik7Ci0JCWNoZWNrRW50cnlDb250ZW50KGVudHJ5TEYsIENPTlRFTlRfTEYsIENPTlRFTlRfTEYpOwotCQljaGVja0VudHJ5Q29udGVudChlbnRyeU1peGVkLCBDT05URU5UX0xGLCBDT05URU5UX0xGKTsKKwkJU3RyaW5nIGV4cGVjdGVkID0gaXNEZWZhdWx0Q3JMZigpID8gQ09OVEVOVF9DUkxGIDogQ09OVEVOVF9MRjsKKwkJY2hlY2tFbnRyeUNvbnRlbnQoZW50cnlDUkxGLCBleHBlY3RlZCwgQ09OVEVOVF9MRik7CisJCWNoZWNrRW50cnlDb250ZW50KGVudHJ5TEYsIGV4cGVjdGVkLCBDT05URU5UX0xGKTsKKwkJY2hlY2tFbnRyeUNvbnRlbnQoZW50cnlNaXhlZCwgZXhwZWN0ZWQsIENPTlRFTlRfTEYpOwogCX0KIAogCUBUZXN0CkBAIC01MjQsOSArNDk1LDEyIEBAIHB1YmxpYyB2b2lkIHRlc3RfR2xvYmFsRU9MX2xmX0luZm9FT0xfdW5zcGVjX1Jvb3RFT0xfY3JsZigpCiAJCS8vIGluZm8gb3ZlcnJpZGVzIGFsbAogCQljb2xsZWN0UmVwb3NpdG9yeVN0YXRlKCk7CiAJCWFzc2VydEVxdWFscygidGV4dCIsIGVudHJ5Q1JMRi5hdHRycyk7Ci0JCWNoZWNrRW50cnlDb250ZW50KGVudHJ5Q1JMRiwgQ09OVEVOVF9MRiwgQ09OVEVOVF9MRik7Ci0JCWNoZWNrRW50cnlDb250ZW50KGVudHJ5TEYsIENPTlRFTlRfTEYsIENPTlRFTlRfTEYpOwotCQljaGVja0VudHJ5Q29udGVudChlbnRyeU1peGVkLCBDT05URU5UX0xGLCBDT05URU5UX0xGKTsKKwkJLy8gIWVvbCBtZWFucyB1bnNwZWNpZmllZCwgc28gdXNlIHRoZSBkZWZhdWx0IG9mIGNvcmUuZW9sLCB3aGljaCBpcworCQkvLyBuYXRpdmUuCisJCVN0cmluZyBleHBlY3RlZCA9IGlzRGVmYXVsdENyTGYoKSA/IENPTlRFTlRfQ1JMRiA6IENPTlRFTlRfTEY7CisJCWNoZWNrRW50cnlDb250ZW50KGVudHJ5Q1JMRiwgZXhwZWN0ZWQsIENPTlRFTlRfTEYpOworCQljaGVja0VudHJ5Q29udGVudChlbnRyeUxGLCBleHBlY3RlZCwgQ09OVEVOVF9MRik7CisJCWNoZWNrRW50cnlDb250ZW50KGVudHJ5TWl4ZWQsIGV4cGVjdGVkLCBDT05URU5UX0xGKTsKIAl9CiAKIAlAVGVzdApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9GZXRjaEFuZFB1bGxDb21tYW5kc1JlY3Vyc2VTdWJtb2R1bGVzVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9GZXRjaEFuZFB1bGxDb21tYW5kc1JlY3Vyc2VTdWJtb2R1bGVzVGVzdC5qYXZhCmluZGV4IDM2YmE3Y2UuLjllYTY0ZWYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvRmV0Y2hBbmRQdWxsQ29tbWFuZHNSZWN1cnNlU3VibW9kdWxlc1Rlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0ZldGNoQW5kUHVsbENvbW1hbmRzUmVjdXJzZVN1Ym1vZHVsZXNUZXN0LmphdmEKQEAgLTI1OSw3ICsyNTksOCBAQCBwcml2YXRlIFJldkNvbW1pdCB1cGRhdGVTdWJtb2R1bGVSZXZpc2lvbigpIHRocm93cyBFeGNlcHRpb24gewogCQkvLyB0aGUgY29tbWl0IHRoYXQgd2FzIGNyZWF0ZWQKIAkJdHJ5IChTdWJtb2R1bGVXYWxrIHcgPSBTdWJtb2R1bGVXYWxrLmZvckluZGV4KGdpdC5nZXRSZXBvc2l0b3J5KCkpKSB7CiAJCQlhc3NlcnRUcnVlKHcubmV4dCgpKTsKLQkJCXRyeSAoR2l0IGcgPSBuZXcgR2l0KHcuZ2V0UmVwb3NpdG9yeSgpKSkgeworCQkJdHJ5IChSZXBvc2l0b3J5IHJlcG9zaXRvcnkgPSB3LmdldFJlcG9zaXRvcnkoKTsKKwkJCQkJR2l0IGcgPSBuZXcgR2l0KHJlcG9zaXRvcnkpKSB7CiAJCQkJZy5mZXRjaCgpLnNldFJlbW90ZShSRU1PVEUpLnNldFJlZlNwZWNzKFJFRlNQRUMpLmNhbGwoKTsKIAkJCQlnLnJlc2V0KCkuc2V0TW9kZShSZXNldFR5cGUuSEFSRCkuc2V0UmVmKGNvbW1pdDEubmFtZSgpKS5jYWxsKCk7CiAJCQl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL01lcmdlQ29tbWFuZFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvTWVyZ2VDb21tYW5kVGVzdC5qYXZhCmluZGV4IGJjNGU5NDAuLjY0NDc1ZjUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvTWVyZ2VDb21tYW5kVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvTWVyZ2VDb21tYW5kVGVzdC5qYXZhCkBAIC01NTQsNyArNTU0LDcgQEAgcHVibGljIHZvaWQgdGVzdE1lcmdlTWVzc2FnZSgpIHRocm93cyBFeGNlcHRpb24gewogCQkJZ2l0Lm1lcmdlKCkuaW5jbHVkZShzaWRlQnJhbmNoKQogCQkJCQkuc2V0U3RyYXRlZ3koTWVyZ2VTdHJhdGVneS5SRVNPTFZFKS5jYWxsKCk7CiAKLQkJCWFzc2VydEVxdWFscygiTWVyZ2UgYnJhbmNoICdzaWRlJ1xuXG5Db25mbGljdHM6XG5cdGFcbiIsCisJCQlhc3NlcnRFcXVhbHMoIk1lcmdlIGJyYW5jaCAnc2lkZSdcblxuIyBDb25mbGljdHM6XG4jXHRhXG4iLAogCQkJCQlkYi5yZWFkTWVyZ2VDb21taXRNc2coKSk7CiAJCX0KIApAQCAtMTc4Nyw3ICsxNzg3LDcgQEAgcHVibGljIHZvaWQgdGVzdFNxdWFzaE1lcmdlQ29uZmxpY3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJCQkJCQkrIGRhdGVGb3JtYXR0ZXIuZm9ybWF0RGF0ZSh0aGlyZAogCQkJCQkJCQkJLmdldEF1dGhvcklkZW50KCkpICsgIlxuXG5cdHRoaXJkIGNvbW1pdFxuIiwKIAkJCQkJZGIucmVhZFNxdWFzaENvbW1pdE1zZygpKTsKLQkJCWFzc2VydEVxdWFscygiXG5Db25mbGljdHM6XG5cdGZpbGUyXG4iLCBkYi5yZWFkTWVyZ2VDb21taXRNc2coKSk7CisJCQlhc3NlcnRFcXVhbHMoIlxuIyBDb25mbGljdHM6XG4jXHRmaWxlMlxuIiwgZGIucmVhZE1lcmdlQ29tbWl0TXNnKCkpOwogCiAJCQlTdGF0dXMgc3RhdCA9IGdpdC5zdGF0dXMoKS5jYWxsKCk7CiAJCQlhc3NlcnRFcXVhbHMoU2V0cy5vZigiZmlsZTIiKSwgc3RhdC5nZXRDb25mbGljdGluZygpKTsKQEAgLTE4ODEsNiArMTg4MSw3IEBAIHB1YmxpYyB2b2lkIHRlc3RGYXN0Rm9yd2FyZE9ubHlOb3RQb3NzaWJsZSgpIHRocm93cyBFeGNlcHRpb24gewogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdFJlY3Vyc2l2ZU1lcmdlV2l0aENvbmZsaWN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXRyeSAoVGVzdFJlcG9zaXRvcnk8UmVwb3NpdG9yeT4gZGJfdCA9IG5ldyBUZXN0UmVwb3NpdG9yeTw+KGRiKSkgeworCQkJZGIuaW5jcmVtZW50T3BlbigpOwogCQkJQnJhbmNoQnVpbGRlciBtYXN0ZXIgPSBkYl90LmJyYW5jaCgibWFzdGVyIik7CiAJCQlSZXZDb21taXQgbTAgPSBtYXN0ZXIuY29tbWl0KCkKIAkJCQkJLmFkZCgiZiIsICIxXG4yXG4zXG40XG41XG42XG43XG44XG45XG4iKS5tZXNzYWdlKCJtMCIpCkBAIC0yMDEyLDcgKzIwMTMsNyBAQCBwdWJsaWMgdm9pZCB0ZXN0TWVyZ2VDb25mbGljdFdpdGhNZXNzYWdlT3B0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCQlnaXQubWVyZ2UoKS5pbmNsdWRlKHNpZGVCcmFuY2gpLnNldFN0cmF0ZWd5KE1lcmdlU3RyYXRlZ3kuUkVTT0xWRSkKIAkJCQkJLnNldE1lc3NhZ2UoInVzZXIgbWVzc2FnZSIpLmNhbGwoKTsKIAotCQkJYXNzZXJ0RXF1YWxzKCJ1c2VyIG1lc3NhZ2VcblxuQ29uZmxpY3RzOlxuXHRhXG4iLAorCQkJYXNzZXJ0RXF1YWxzKCJ1c2VyIG1lc3NhZ2VcblxuIyBDb25mbGljdHM6XG4jXHRhXG4iLAogCQkJCQlkYi5yZWFkTWVyZ2VDb21taXRNc2coKSk7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL1B1bGxDb21tYW5kVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9QdWxsQ29tbWFuZFRlc3QuamF2YQppbmRleCA5YWY3N2FhLi42YTg0ZjBhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL1B1bGxDb21tYW5kVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvUHVsbENvbW1hbmRUZXN0LmphdmEKQEAgLTU2Nyw2ICs1NjcsNyBAQCBwcml2YXRlIHZvaWQgZG9UZXN0UHVsbFdpdGhSZWJhc2UoQ2FsbGFibGU8UHVsbFJlc3VsdD4gcHVsbFNldHVwLAogCXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXN1cGVyLnNldFVwKCk7CiAJCWRiVGFyZ2V0ID0gY3JlYXRlV29ya1JlcG9zaXRvcnkoKTsKKwkJYWRkUmVwb1RvQ2xvc2UoZGJUYXJnZXQpOwogCQlzb3VyY2UgPSBuZXcgR2l0KGRiKTsKIAkJdGFyZ2V0ID0gbmV3IEdpdChkYlRhcmdldCk7CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvUHVsbENvbW1hbmRXaXRoUmViYXNlVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9QdWxsQ29tbWFuZFdpdGhSZWJhc2VUZXN0LmphdmEKaW5kZXggY2NlMDRmNC4uZTJkNzkyMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9QdWxsQ29tbWFuZFdpdGhSZWJhc2VUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9QdWxsQ29tbWFuZFdpdGhSZWJhc2VUZXN0LmphdmEKQEAgLTMyMyw2ICszMjMsNyBAQCBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewogCQlkYlRhcmdldCA9IGNyZWF0ZVdvcmtSZXBvc2l0b3J5KCk7CiAJCXNvdXJjZSA9IG5ldyBHaXQoZGIpOwogCQl0YXJnZXQgPSBuZXcgR2l0KGRiVGFyZ2V0KTsKKwkJYWRkUmVwb1RvQ2xvc2UoZGJUYXJnZXQpOwogCiAJCS8vIHB1dCBzb21lIGZpbGUgaW4gdGhlIHNvdXJjZSByZXBvCiAJCXNvdXJjZUZpbGUgPSBuZXcgRmlsZShkYi5nZXRXb3JrVHJlZSgpLCAiU29tZUZpbGUudHh0Iik7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL1B1c2hDb21tYW5kVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9QdXNoQ29tbWFuZFRlc3QuamF2YQppbmRleCBhNzg2MDY1Li42ZjdhYTYzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL1B1c2hDb21tYW5kVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvUHVzaENvbW1hbmRUZXN0LmphdmEKQEAgLTEwLDcgKzEwLDkgQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5hcGk7CiAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaHJvd3M7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOwogCkBAIC0xOSwxMCArMjEsMTMgQEAKIGltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnMuRGV0YWNoZWRIZWFkRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9ycy5HaXRBUElFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzLkludmFsaWRSZWZOYW1lRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9ycy5KR2l0SW50ZXJuYWxFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzLlRyYW5zcG9ydEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5NaXNzaW5nT2JqZWN0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLk5vUmVtb3RlUmVwb3NpdG9yeUV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0Lmhvb2tzLlByZVB1c2hIb29rOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuanVuaXQuSkdpdFRlc3RVdGlsOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuanVuaXQuUmVwb3NpdG9yeVRlc3RDYXNlOwpAQCAtMzIsNiArMzcsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlcG9zaXRvcnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuU3RvcmVkQ29uZmlnOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5SZXZDb21taXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuUHVzaENvbmZpZy5QdXNoRGVmYXVsdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5QdXNoUmVzdWx0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlJlZkxlYXNlU3BlYzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5SZWZTcGVjOwpAQCAtNTAsNiArNTYsNyBAQCBwdWJsaWMgdm9pZCB0ZXN0UHVzaCgpIHRocm93cyBKR2l0SW50ZXJuYWxFeGNlcHRpb24sIElPRXhjZXB0aW9uLAogCiAJCS8vIGNyZWF0ZSBvdGhlciByZXBvc2l0b3J5CiAJCVJlcG9zaXRvcnkgZGIyID0gY3JlYXRlV29ya1JlcG9zaXRvcnkoKTsKKwkJYWRkUmVwb1RvQ2xvc2UoZGIyKTsKIAkJZmluYWwgU3RvcmVkQ29uZmlnIGNvbmZpZzIgPSBkYjIuZ2V0Q29uZmlnKCk7CiAKIAkJLy8gdGhpcyB0ZXN0cyB0aGF0IHRoaXMgY29uZmlnIGNhbiBiZSBwYXJzZWQgcHJvcGVybHkKQEAgLTI4OSw2ICsyOTYsNzcwIEBAIHB1YmxpYyB2b2lkIHRlc3RQdXNoV2l0aG91dFB1c2hSZWZTcGVjKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJfQogCiAJLyoqCisJICogQ2hlY2sgdGhhdCBwdXNoaW5nIGZyb20gYSBkZXRhY2hlZCBIRUFEIHdpdGhvdXQgcmVmc3BlYyB0aHJvd3MgYQorCSAqIERldGFjaGVkSGVhZEV4Y2VwdGlvbi4KKwkgKgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0UHVzaERlZmF1bHREZXRhY2hlZEhlYWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdHJ5IChHaXQgZ2l0ID0gbmV3IEdpdChkYik7CisJCQkJR2l0IGdpdDIgPSBuZXcgR2l0KGNyZWF0ZUJhcmVSZXBvc2l0b3J5KCkpKSB7CisJCQlmaW5hbCBTdG9yZWRDb25maWcgY29uZmlnID0gZ2l0LmdldFJlcG9zaXRvcnkoKS5nZXRDb25maWcoKTsKKwkJCVJlbW90ZUNvbmZpZyByZW1vdGVDb25maWcgPSBuZXcgUmVtb3RlQ29uZmlnKGNvbmZpZywgInRlc3QiKTsKKwkJCVVSSWlzaCB1cmkgPSBuZXcgVVJJaXNoKAorCQkJCQlnaXQyLmdldFJlcG9zaXRvcnkoKS5nZXREaXJlY3RvcnkoKS50b1VSSSgpLnRvVVJMKCkpOworCQkJcmVtb3RlQ29uZmlnLmFkZFVSSSh1cmkpOworCQkJcmVtb3RlQ29uZmlnLmFkZEZldGNoUmVmU3BlYygKKwkJCQkJbmV3IFJlZlNwZWMoIityZWZzL2hlYWRzLyo6cmVmcy9yZW1vdGVzL29yaWdpbi8qIikpOworCQkJcmVtb3RlQ29uZmlnLnVwZGF0ZShjb25maWcpOworCQkJY29uZmlnLnNhdmUoKTsKKworCQkJd3JpdGVUcmFzaEZpbGUoImYiLCAiY29udGVudCBvZiBmIik7CisJCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oImYiKS5jYWxsKCk7CisJCQlSZXZDb21taXQgY29tbWl0ID0gZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoImFkZGluZyBmIikuY2FsbCgpOworCisJCQlnaXQuY2hlY2tvdXQoKS5zZXROYW1lKCJub3QtcHVzaGVkIikuc2V0Q3JlYXRlQnJhbmNoKHRydWUpLmNhbGwoKTsKKwkJCWdpdC5jaGVja291dCgpLnNldE5hbWUoImJyYW5jaHRvcHVzaCIpLnNldENyZWF0ZUJyYW5jaCh0cnVlKS5jYWxsKCk7CisJCQlnaXQuY2hlY2tvdXQoKS5zZXROYW1lKGNvbW1pdC5nZXROYW1lKCkpLmNhbGwoKTsKKwkJCVN0cmluZyBoZWFkID0gZ2l0LmdldFJlcG9zaXRvcnkoKS5nZXRGdWxsQnJhbmNoKCk7CisJCQlhc3NlcnRUcnVlKE9iamVjdElkLmlzSWQoaGVhZCkpOworCQkJYXNzZXJ0RXF1YWxzKGNvbW1pdC5nZXROYW1lKCksIGhlYWQpOworCQkJYXNzZXJ0VGhyb3dzKERldGFjaGVkSGVhZEV4Y2VwdGlvbi5jbGFzcywKKwkJCQkJKCkgLT4gZ2l0LnB1c2goKS5zZXRSZW1vdGUoInRlc3QiKS5jYWxsKCkpOworCQl9CisJfQorCisJLyoqCisJICogQ2hlY2sgdGhhdCBwdXNoLmRlZmF1bHQ9bm90aGluZyB3aXRob3V0IHJlZnNwZWMgdGhyb3dzIGFuCisJICogSW52YWxpZFJlZk5hbWVFeGNlcHRpb24uCisJICoKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFB1c2hEZWZhdWx0Tm90aGluZygpIHRocm93cyBFeGNlcHRpb24geworCQl0cnkgKEdpdCBnaXQgPSBuZXcgR2l0KGRiKTsKKwkJCQlHaXQgZ2l0MiA9IG5ldyBHaXQoY3JlYXRlQmFyZVJlcG9zaXRvcnkoKSkpIHsKKwkJCWZpbmFsIFN0b3JlZENvbmZpZyBjb25maWcgPSBnaXQuZ2V0UmVwb3NpdG9yeSgpLmdldENvbmZpZygpOworCQkJUmVtb3RlQ29uZmlnIHJlbW90ZUNvbmZpZyA9IG5ldyBSZW1vdGVDb25maWcoY29uZmlnLCAidGVzdCIpOworCQkJVVJJaXNoIHVyaSA9IG5ldyBVUklpc2goCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLmdldERpcmVjdG9yeSgpLnRvVVJJKCkudG9VUkwoKSk7CisJCQlyZW1vdGVDb25maWcuYWRkVVJJKHVyaSk7CisJCQlyZW1vdGVDb25maWcuYWRkRmV0Y2hSZWZTcGVjKAorCQkJCQluZXcgUmVmU3BlYygiK3JlZnMvaGVhZHMvKjpyZWZzL3JlbW90ZXMvb3JpZ2luLyoiKSk7CisJCQlyZW1vdGVDb25maWcudXBkYXRlKGNvbmZpZyk7CisJCQljb25maWcuc2F2ZSgpOworCisJCQl3cml0ZVRyYXNoRmlsZSgiZiIsICJjb250ZW50IG9mIGYiKTsKKwkJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybigiZiIpLmNhbGwoKTsKKwkJCWdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJhZGRpbmcgZiIpLmNhbGwoKTsKKworCQkJZ2l0LmNoZWNrb3V0KCkuc2V0TmFtZSgibm90LXB1c2hlZCIpLnNldENyZWF0ZUJyYW5jaCh0cnVlKS5jYWxsKCk7CisJCQlnaXQuY2hlY2tvdXQoKS5zZXROYW1lKCJicmFuY2h0b3B1c2giKS5zZXRDcmVhdGVCcmFuY2godHJ1ZSkuY2FsbCgpOworCisJCQlhc3NlcnRFcXVhbHMobnVsbCwKKwkJCQkJZ2l0Mi5nZXRSZXBvc2l0b3J5KCkucmVzb2x2ZSgicmVmcy9oZWFkcy9icmFuY2h0b3B1c2giKSk7CisJCQlhc3NlcnRFcXVhbHMobnVsbCwKKwkJCQkJZ2l0Mi5nZXRSZXBvc2l0b3J5KCkucmVzb2x2ZSgicmVmcy9oZWFkcy9ub3QtcHVzaGVkIikpOworCQkJYXNzZXJ0RXF1YWxzKG51bGwsCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLnJlc29sdmUoInJlZnMvaGVhZHMvbWFzdGVyIikpOworCQkJYXNzZXJ0VGhyb3dzKEludmFsaWRSZWZOYW1lRXhjZXB0aW9uLmNsYXNzLAorCQkJCQkoKSAtPiBnaXQucHVzaCgpLnNldFJlbW90ZSgidGVzdCIpCisJCQkJCQkJLnNldFB1c2hEZWZhdWx0KFB1c2hEZWZhdWx0Lk5PVEhJTkcpLmNhbGwoKSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBDaGVjayB0aGF0IHB1c2guZGVmYXVsdD1tYXRjaGluZyB3aXRob3V0IHJlZnNwZWMgcHVzaGVzIGFsbCBtYXRjaGluZworCSAqIGJyYW5jaGVzLgorCSAqCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RQdXNoRGVmYXVsdE1hdGNoaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRyeSAoR2l0IGdpdCA9IG5ldyBHaXQoZGIpOworCQkJCUdpdCBnaXQyID0gbmV3IEdpdChjcmVhdGVCYXJlUmVwb3NpdG9yeSgpKSkgeworCQkJZmluYWwgU3RvcmVkQ29uZmlnIGNvbmZpZyA9IGdpdC5nZXRSZXBvc2l0b3J5KCkuZ2V0Q29uZmlnKCk7CisJCQlSZW1vdGVDb25maWcgcmVtb3RlQ29uZmlnID0gbmV3IFJlbW90ZUNvbmZpZyhjb25maWcsICJ0ZXN0Iik7CisJCQlVUklpc2ggdXJpID0gbmV3IFVSSWlzaCgKKwkJCQkJZ2l0Mi5nZXRSZXBvc2l0b3J5KCkuZ2V0RGlyZWN0b3J5KCkudG9VUkkoKS50b1VSTCgpKTsKKwkJCXJlbW90ZUNvbmZpZy5hZGRVUkkodXJpKTsKKwkJCXJlbW90ZUNvbmZpZy5hZGRGZXRjaFJlZlNwZWMoCisJCQkJCW5ldyBSZWZTcGVjKCIrcmVmcy9oZWFkcy8qOnJlZnMvcmVtb3Rlcy9vcmlnaW4vKiIpKTsKKwkJCXJlbW90ZUNvbmZpZy51cGRhdGUoY29uZmlnKTsKKwkJCWNvbmZpZy5zYXZlKCk7CisKKwkJCXdyaXRlVHJhc2hGaWxlKCJmIiwgImNvbnRlbnQgb2YgZiIpOworCQkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCJmIikuY2FsbCgpOworCQkJUmV2Q29tbWl0IGNvbW1pdCA9IGdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJhZGRpbmcgZiIpLmNhbGwoKTsKKworCQkJZ2l0LmNoZWNrb3V0KCkuc2V0TmFtZSgibm90LXB1c2hlZCIpLnNldENyZWF0ZUJyYW5jaCh0cnVlKS5jYWxsKCk7CisJCQlnaXQuY2hlY2tvdXQoKS5zZXROYW1lKCJicmFuY2h0b3B1c2giKS5zZXRDcmVhdGVCcmFuY2godHJ1ZSkuY2FsbCgpOworCisJCQlhc3NlcnRFcXVhbHMobnVsbCwKKwkJCQkJZ2l0Mi5nZXRSZXBvc2l0b3J5KCkucmVzb2x2ZSgicmVmcy9oZWFkcy9icmFuY2h0b3B1c2giKSk7CisJCQlhc3NlcnRFcXVhbHMobnVsbCwKKwkJCQkJZ2l0Mi5nZXRSZXBvc2l0b3J5KCkucmVzb2x2ZSgicmVmcy9oZWFkcy9ub3QtcHVzaGVkIikpOworCQkJYXNzZXJ0RXF1YWxzKG51bGwsCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLnJlc29sdmUoInJlZnMvaGVhZHMvbWFzdGVyIikpOworCQkJLy8gcHVzaCBtYXN0ZXIgYW5kIGJyYW5jaHRvcHVzaAorCQkJZ2l0LnB1c2goKS5zZXRSZW1vdGUoInRlc3QiKS5zZXRSZWZTcGVjcygKKwkJCQkJbmV3IFJlZlNwZWMoInJlZnMvaGVhZHMvbWFzdGVyOnJlZnMvaGVhZHMvbWFzdGVyIiksCisJCQkJCW5ldyBSZWZTcGVjKAorCQkJCQkJCSJyZWZzL2hlYWRzL2JyYW5jaHRvcHVzaDpyZWZzL2hlYWRzL2JyYW5jaHRvcHVzaCIpKQorCQkJCQkuY2FsbCgpOworCQkJYXNzZXJ0RXF1YWxzKGNvbW1pdC5nZXRJZCgpLAorCQkJCQlnaXQyLmdldFJlcG9zaXRvcnkoKS5yZXNvbHZlKCJyZWZzL2hlYWRzL21hc3RlciIpKTsKKwkJCWFzc2VydEVxdWFscyhjb21taXQuZ2V0SWQoKSwKKwkJCQkJZ2l0Mi5nZXRSZXBvc2l0b3J5KCkucmVzb2x2ZSgicmVmcy9oZWFkcy9icmFuY2h0b3B1c2giKSk7CisJCQlhc3NlcnRFcXVhbHMobnVsbCwKKwkJCQkJZ2l0Mi5nZXRSZXBvc2l0b3J5KCkucmVzb2x2ZSgicmVmcy9oZWFkcy9ub3QtcHVzaGVkIikpOworCQkJLy8gQ3JlYXRlIHR3byBkaWZmZXJlbnQgY29tbWl0cyBvbiB0aGVzZSB0d28gYnJhbmNoZXMKKwkJCXdyaXRlVHJhc2hGaWxlKCJiIiwgIm9uIGJyYW5jaHRvcHVzaCIpOworCQkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCJiIikuY2FsbCgpOworCQkJUmV2Q29tbWl0IGJDb21taXQgPSBnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgib24gYnJhbmNodG9wdXNoIikKKwkJCQkJLmNhbGwoKTsKKwkJCWdpdC5jaGVja291dCgpLnNldE5hbWUoIm1hc3RlciIpLmNhbGwoKTsKKwkJCXdyaXRlVHJhc2hGaWxlKCJtIiwgIm9uIG1hc3RlciIpOworCQkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCJtIikuY2FsbCgpOworCQkJUmV2Q29tbWl0IG1Db21taXQgPSBnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgib24gbWFzdGVyIikuY2FsbCgpOworCQkJLy8gTm93IHB1c2ggd2l0aCBtb2RlICJtYXRjaGluZyI6IHNob3VsZCBwdXNoIGJvdGggYnJhbmNoZXMuCisJCQlJdGVyYWJsZTxQdXNoUmVzdWx0PiByZXN1bHQgPSBnaXQucHVzaCgpLnNldFJlbW90ZSgidGVzdCIpCisJCQkJCS5zZXRQdXNoRGVmYXVsdChQdXNoRGVmYXVsdC5NQVRDSElORykKKwkJCQkJLmNhbGwoKTsKKwkJCWludCBuID0gMDsKKwkJCWZvciAoUHVzaFJlc3VsdCByIDogcmVzdWx0KSB7CisJCQkJbisrOworCQkJCWFzc2VydEVxdWFscygxLCBuKTsKKwkJCQlhc3NlcnRFcXVhbHMoMiwgci5nZXRSZW1vdGVVcGRhdGVzKCkuc2l6ZSgpKTsKKwkJCQlmb3IgKFJlbW90ZVJlZlVwZGF0ZSB1cGRhdGUgOiByLmdldFJlbW90ZVVwZGF0ZXMoKSkgeworCQkJCQlhc3NlcnRGYWxzZSh1cGRhdGUuaXNNYXRjaGluZygpKTsKKwkJCQkJYXNzZXJ0VHJ1ZSh1cGRhdGUuZ2V0U3JjUmVmKCkKKwkJCQkJCQkuZXF1YWxzKCJyZWZzL2hlYWRzL2JyYW5jaHRvcHVzaCIpCisJCQkJCQkJfHwgdXBkYXRlLmdldFNyY1JlZigpLmVxdWFscygicmVmcy9oZWFkcy9tYXN0ZXIiKSk7CisJCQkJCWFzc2VydEVxdWFscyhSZW1vdGVSZWZVcGRhdGUuU3RhdHVzLk9LLCB1cGRhdGUuZ2V0U3RhdHVzKCkpOworCQkJCX0KKwkJCX0KKwkJCWFzc2VydEVxdWFscyhiQ29tbWl0LmdldElkKCksCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLnJlc29sdmUoInJlZnMvaGVhZHMvYnJhbmNodG9wdXNoIikpOworCQkJYXNzZXJ0RXF1YWxzKG51bGwsCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLnJlc29sdmUoInJlZnMvaGVhZHMvbm90LXB1c2hlZCIpKTsKKwkJCWFzc2VydEVxdWFscyhtQ29tbWl0LmdldElkKCksCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLnJlc29sdmUoInJlZnMvaGVhZHMvbWFzdGVyIikpOworCQkJYXNzZXJ0RXF1YWxzKGJDb21taXQuZ2V0SWQoKSwgZ2l0LmdldFJlcG9zaXRvcnkoKQorCQkJCQkucmVzb2x2ZSgicmVmcy9yZW1vdGVzL29yaWdpbi9icmFuY2h0b3B1c2giKSk7CisJCQlhc3NlcnRFcXVhbHMobnVsbCwgZ2l0LmdldFJlcG9zaXRvcnkoKQorCQkJCQkucmVzb2x2ZSgicmVmcy9yZW1vdGVzL29yaWdpbi9ub3QtcHVzaGVkIikpOworCQkJYXNzZXJ0RXF1YWxzKG1Db21taXQuZ2V0SWQoKSwKKwkJCQkJZ2l0LmdldFJlcG9zaXRvcnkoKS5yZXNvbHZlKCJyZWZzL3JlbW90ZXMvb3JpZ2luL21hc3RlciIpKTsKKwkJfQorCX0KKworCS8qKgorCSAqIENoZWNrIHRoYXQgcHVzaC5kZWZhdWx0PXVwc3RyZWFtIHdpdGhvdXQgcmVmc3BlYyBwdXNoZXMgb25seSB0aGUgY3VycmVudAorCSAqIGJyYW5jaCB0byB0aGUgY29uZmlndXJlZCB1cHN0cmVhbS4KKwkgKgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0UHVzaERlZmF1bHRVcHN0cmVhbSgpIHRocm93cyBFeGNlcHRpb24geworCQl0cnkgKEdpdCBnaXQgPSBuZXcgR2l0KGRiKTsKKwkJCQlHaXQgZ2l0MiA9IG5ldyBHaXQoY3JlYXRlQmFyZVJlcG9zaXRvcnkoKSkpIHsKKwkJCVN0b3JlZENvbmZpZyBjb25maWcgPSBnaXQuZ2V0UmVwb3NpdG9yeSgpLmdldENvbmZpZygpOworCQkJUmVtb3RlQ29uZmlnIHJlbW90ZUNvbmZpZyA9IG5ldyBSZW1vdGVDb25maWcoY29uZmlnLCAidGVzdCIpOworCQkJVVJJaXNoIHVyaSA9IG5ldyBVUklpc2goCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLmdldERpcmVjdG9yeSgpLnRvVVJJKCkudG9VUkwoKSk7CisJCQlyZW1vdGVDb25maWcuYWRkVVJJKHVyaSk7CisJCQlyZW1vdGVDb25maWcuYWRkRmV0Y2hSZWZTcGVjKAorCQkJCQluZXcgUmVmU3BlYygiK3JlZnMvaGVhZHMvKjpyZWZzL3JlbW90ZXMvb3JpZ2luLyoiKSk7CisJCQlyZW1vdGVDb25maWcudXBkYXRlKGNvbmZpZyk7CisJCQljb25maWcuc2F2ZSgpOworCisJCQl3cml0ZVRyYXNoRmlsZSgiZiIsICJjb250ZW50IG9mIGYiKTsKKwkJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybigiZiIpLmNhbGwoKTsKKwkJCVJldkNvbW1pdCBjb21taXQgPSBnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgiYWRkaW5nIGYiKS5jYWxsKCk7CisKKwkJCWdpdC5jaGVja291dCgpLnNldE5hbWUoIm5vdC1wdXNoZWQiKS5zZXRDcmVhdGVCcmFuY2godHJ1ZSkuY2FsbCgpOworCQkJZ2l0LmNoZWNrb3V0KCkuc2V0TmFtZSgiYnJhbmNodG9wdXNoIikuc2V0Q3JlYXRlQnJhbmNoKHRydWUpLmNhbGwoKTsKKworCQkJY29uZmlnID0gZ2l0LmdldFJlcG9zaXRvcnkoKS5nZXRDb25maWcoKTsKKwkJCWNvbmZpZy5zZXRTdHJpbmcoImJyYW5jaCIsICJicmFuY2h0b3B1c2giLCAicmVtb3RlIiwgInRlc3QiKTsKKwkJCWNvbmZpZy5zZXRTdHJpbmcoImJyYW5jaCIsICJicmFuY2h0b3B1c2giLCAibWVyZ2UiLAorCQkJCQkicmVmcy9oZWFkcy91cHN0cmVhbWJyYW5jaCIpOworCQkJY29uZmlnLnNhdmUoKTsKKworCQkJYXNzZXJ0RXF1YWxzKG51bGwsCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLnJlc29sdmUoInJlZnMvaGVhZHMvYnJhbmNodG9wdXNoIikpOworCQkJYXNzZXJ0RXF1YWxzKG51bGwsCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLnJlc29sdmUoInJlZnMvaGVhZHMvdXBzdHJlYW1icmFuY2giKSk7CisJCQlhc3NlcnRFcXVhbHMobnVsbCwKKwkJCQkJZ2l0Mi5nZXRSZXBvc2l0b3J5KCkucmVzb2x2ZSgicmVmcy9oZWFkcy9ub3QtcHVzaGVkIikpOworCQkJYXNzZXJ0RXF1YWxzKG51bGwsCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLnJlc29sdmUoInJlZnMvaGVhZHMvbWFzdGVyIikpOworCQkJZ2l0LnB1c2goKS5zZXRSZW1vdGUoInRlc3QiKS5zZXRQdXNoRGVmYXVsdChQdXNoRGVmYXVsdC5VUFNUUkVBTSkKKwkJCQkJLmNhbGwoKTsKKwkJCWFzc2VydEVxdWFscyhudWxsLAorCQkJCQlnaXQyLmdldFJlcG9zaXRvcnkoKS5yZXNvbHZlKCJyZWZzL2hlYWRzL2JyYW5jaHRvcHVzaCIpKTsKKwkJCWFzc2VydEVxdWFscyhjb21taXQuZ2V0SWQoKSwKKwkJCQkJZ2l0Mi5nZXRSZXBvc2l0b3J5KCkucmVzb2x2ZSgicmVmcy9oZWFkcy91cHN0cmVhbWJyYW5jaCIpKTsKKwkJCWFzc2VydEVxdWFscyhudWxsLAorCQkJCQlnaXQyLmdldFJlcG9zaXRvcnkoKS5yZXNvbHZlKCJyZWZzL2hlYWRzL25vdC1wdXNoZWQiKSk7CisJCQlhc3NlcnRFcXVhbHMobnVsbCwKKwkJCQkJZ2l0Mi5nZXRSZXBvc2l0b3J5KCkucmVzb2x2ZSgicmVmcy9oZWFkcy9tYXN0ZXIiKSk7CisJCQlhc3NlcnRFcXVhbHMoY29tbWl0LmdldElkKCksIGdpdC5nZXRSZXBvc2l0b3J5KCkKKwkJCQkJLnJlc29sdmUoInJlZnMvcmVtb3Rlcy9vcmlnaW4vdXBzdHJlYW1icmFuY2giKSk7CisJCQlhc3NlcnRFcXVhbHMobnVsbCwgZ2l0LmdldFJlcG9zaXRvcnkoKQorCQkJCQkucmVzb2x2ZSgicmVmcy9yZW1vdGVzL29yaWdpbi9icmFuY2h0b3B1c2giKSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBDaGVjayB0aGF0IHB1c2guZGVmYXVsdD11cHN0cmVhbSB3aXRob3V0IHJlZnNwZWMgdGhyb3dzIGFuCisJICogSW52YWxpZFJlZk5hbWVFeGNlcHRpb24gaWYgdGhlIGN1cnJlbnQgYnJhbmNoIGhhcyBubyB1cHN0cmVhbS4KKwkgKgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0UHVzaERlZmF1bHRVcHN0cmVhbU5vVHJhY2tpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdHJ5IChHaXQgZ2l0ID0gbmV3IEdpdChkYik7CisJCQkJR2l0IGdpdDIgPSBuZXcgR2l0KGNyZWF0ZUJhcmVSZXBvc2l0b3J5KCkpKSB7CisJCQlTdG9yZWRDb25maWcgY29uZmlnID0gZ2l0LmdldFJlcG9zaXRvcnkoKS5nZXRDb25maWcoKTsKKwkJCVJlbW90ZUNvbmZpZyByZW1vdGVDb25maWcgPSBuZXcgUmVtb3RlQ29uZmlnKGNvbmZpZywgInRlc3QiKTsKKwkJCVVSSWlzaCB1cmkgPSBuZXcgVVJJaXNoKAorCQkJCQlnaXQyLmdldFJlcG9zaXRvcnkoKS5nZXREaXJlY3RvcnkoKS50b1VSSSgpLnRvVVJMKCkpOworCQkJcmVtb3RlQ29uZmlnLmFkZFVSSSh1cmkpOworCQkJcmVtb3RlQ29uZmlnLmFkZEZldGNoUmVmU3BlYygKKwkJCQkJbmV3IFJlZlNwZWMoIityZWZzL2hlYWRzLyo6cmVmcy9yZW1vdGVzL29yaWdpbi8qIikpOworCQkJcmVtb3RlQ29uZmlnLnVwZGF0ZShjb25maWcpOworCQkJY29uZmlnLnNhdmUoKTsKKworCQkJd3JpdGVUcmFzaEZpbGUoImYiLCAiY29udGVudCBvZiBmIik7CisJCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oImYiKS5jYWxsKCk7CisJCQlnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgiYWRkaW5nIGYiKS5jYWxsKCk7CisKKwkJCWdpdC5jaGVja291dCgpLnNldE5hbWUoIm5vdC1wdXNoZWQiKS5zZXRDcmVhdGVCcmFuY2godHJ1ZSkuY2FsbCgpOworCQkJZ2l0LmNoZWNrb3V0KCkuc2V0TmFtZSgiYnJhbmNodG9wdXNoIikuc2V0Q3JlYXRlQnJhbmNoKHRydWUpLmNhbGwoKTsKKworCQkJY29uZmlnID0gZ2l0LmdldFJlcG9zaXRvcnkoKS5nZXRDb25maWcoKTsKKwkJCWNvbmZpZy5zZXRTdHJpbmcoImJyYW5jaCIsICJicmFuY2h0b3B1c2giLCAicmVtb3RlIiwgInRlc3QiKTsKKwkJCWNvbmZpZy5zYXZlKCk7CisKKwkJCWFzc2VydFRocm93cyhJbnZhbGlkUmVmTmFtZUV4Y2VwdGlvbi5jbGFzcywKKwkJCQkJKCkgLT4gZ2l0LnB1c2goKS5zZXRSZW1vdGUoInRlc3QiKQorCQkJCQkJCS5zZXRQdXNoRGVmYXVsdChQdXNoRGVmYXVsdC5VUFNUUkVBTSkuY2FsbCgpKTsKKwkJfQorCX0KKworCS8qKgorCSAqIENoZWNrIHRoYXQgcHVzaC5kZWZhdWx0PXVwc3RyZWFtIHdpdGhvdXQgcmVmc3BlYyB0aHJvd3MgYW4KKwkgKiBJbnZhbGlkUmVmTmFtZUV4Y2VwdGlvbiBpZiB0aGUgcHVzaCByZW1vdGUgaXMgbm90IHRoZSBzYW1lIGFzIHRoZSBmZXRjaAorCSAqIHJlbW90ZS4KKwkgKgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0UHVzaERlZmF1bHRVcHN0cmVhbVRyaWFuZ3VsYXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdHJ5IChHaXQgZ2l0ID0gbmV3IEdpdChkYik7CisJCQkJR2l0IGdpdDIgPSBuZXcgR2l0KGNyZWF0ZUJhcmVSZXBvc2l0b3J5KCkpKSB7CisJCQlTdG9yZWRDb25maWcgY29uZmlnID0gZ2l0LmdldFJlcG9zaXRvcnkoKS5nZXRDb25maWcoKTsKKwkJCVJlbW90ZUNvbmZpZyByZW1vdGVDb25maWcgPSBuZXcgUmVtb3RlQ29uZmlnKGNvbmZpZywgInRlc3QiKTsKKwkJCVVSSWlzaCB1cmkgPSBuZXcgVVJJaXNoKAorCQkJCQlnaXQyLmdldFJlcG9zaXRvcnkoKS5nZXREaXJlY3RvcnkoKS50b1VSSSgpLnRvVVJMKCkpOworCQkJcmVtb3RlQ29uZmlnLmFkZFVSSSh1cmkpOworCQkJcmVtb3RlQ29uZmlnLmFkZEZldGNoUmVmU3BlYygKKwkJCQkJbmV3IFJlZlNwZWMoIityZWZzL2hlYWRzLyo6cmVmcy9yZW1vdGVzL29yaWdpbi8qIikpOworCQkJcmVtb3RlQ29uZmlnLnVwZGF0ZShjb25maWcpOworCQkJY29uZmlnLnNhdmUoKTsKKworCQkJd3JpdGVUcmFzaEZpbGUoImYiLCAiY29udGVudCBvZiBmIik7CisJCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oImYiKS5jYWxsKCk7CisJCQlnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgiYWRkaW5nIGYiKS5jYWxsKCk7CisKKwkJCWdpdC5jaGVja291dCgpLnNldE5hbWUoIm5vdC1wdXNoZWQiKS5zZXRDcmVhdGVCcmFuY2godHJ1ZSkuY2FsbCgpOworCQkJZ2l0LmNoZWNrb3V0KCkuc2V0TmFtZSgiYnJhbmNodG9wdXNoIikuc2V0Q3JlYXRlQnJhbmNoKHRydWUpLmNhbGwoKTsKKworCQkJY29uZmlnID0gZ2l0LmdldFJlcG9zaXRvcnkoKS5nZXRDb25maWcoKTsKKwkJCS8vIERvbid0IGNvbmZpZ3VyZSBhIHJlbW90ZTsgaXQnbGwgZGVmYXVsdCB0byAib3JpZ2luIi4KKwkJCWNvbmZpZy5zZXRTdHJpbmcoImJyYW5jaCIsICJicmFuY2h0b3B1c2giLCAibWVyZ2UiLAorCQkJCQkidXBzdHJlYW1icmFuY2giKTsKKwkJCWNvbmZpZy5zYXZlKCk7CisKKwkJCWFzc2VydFRocm93cyhJbnZhbGlkUmVmTmFtZUV4Y2VwdGlvbi5jbGFzcywKKwkJCQkJKCkgLT4gZ2l0LnB1c2goKS5zZXRSZW1vdGUoInRlc3QiKQorCQkJCQkJCS5zZXRQdXNoRGVmYXVsdChQdXNoRGVmYXVsdC5VUFNUUkVBTSkuY2FsbCgpKTsKKwkJfQorCX0KKworCS8qKgorCSAqIENoZWNrIHRoYXQgcHVzaC5kZWZhdWx0PXNpbXBsZSB3aXRob3V0IHJlZnNwZWMgcHVzaGVzIG9ubHkgdGhlIGN1cnJlbnQKKwkgKiBicmFuY2ggdG8gdGhlIGNvbmZpZ3VyZWQgdXBzdHJlYW0gbmFtZS4KKwkgKgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0UHVzaERlZmF1bHRTaW1wbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdHJ5IChHaXQgZ2l0ID0gbmV3IEdpdChkYik7CisJCQkJR2l0IGdpdDIgPSBuZXcgR2l0KGNyZWF0ZUJhcmVSZXBvc2l0b3J5KCkpKSB7CisJCQlTdG9yZWRDb25maWcgY29uZmlnID0gZ2l0LmdldFJlcG9zaXRvcnkoKS5nZXRDb25maWcoKTsKKwkJCVJlbW90ZUNvbmZpZyByZW1vdGVDb25maWcgPSBuZXcgUmVtb3RlQ29uZmlnKGNvbmZpZywgInRlc3QiKTsKKwkJCVVSSWlzaCB1cmkgPSBuZXcgVVJJaXNoKAorCQkJCQlnaXQyLmdldFJlcG9zaXRvcnkoKS5nZXREaXJlY3RvcnkoKS50b1VSSSgpLnRvVVJMKCkpOworCQkJcmVtb3RlQ29uZmlnLmFkZFVSSSh1cmkpOworCQkJcmVtb3RlQ29uZmlnLmFkZEZldGNoUmVmU3BlYygKKwkJCQkJbmV3IFJlZlNwZWMoIityZWZzL2hlYWRzLyo6cmVmcy9yZW1vdGVzL29yaWdpbi8qIikpOworCQkJcmVtb3RlQ29uZmlnLnVwZGF0ZShjb25maWcpOworCQkJY29uZmlnLnNhdmUoKTsKKworCQkJd3JpdGVUcmFzaEZpbGUoImYiLCAiY29udGVudCBvZiBmIik7CisJCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oImYiKS5jYWxsKCk7CisJCQlSZXZDb21taXQgY29tbWl0ID0gZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoImFkZGluZyBmIikuY2FsbCgpOworCisJCQlnaXQuY2hlY2tvdXQoKS5zZXROYW1lKCJub3QtcHVzaGVkIikuc2V0Q3JlYXRlQnJhbmNoKHRydWUpLmNhbGwoKTsKKwkJCWdpdC5jaGVja291dCgpLnNldE5hbWUoImJyYW5jaHRvcHVzaCIpLnNldENyZWF0ZUJyYW5jaCh0cnVlKS5jYWxsKCk7CisKKwkJCWNvbmZpZyA9IGdpdC5nZXRSZXBvc2l0b3J5KCkuZ2V0Q29uZmlnKCk7CisJCQljb25maWcuc2V0U3RyaW5nKCJicmFuY2giLCAiYnJhbmNodG9wdXNoIiwgInJlbW90ZSIsICJ0ZXN0Iik7CisJCQljb25maWcuc2V0U3RyaW5nKCJicmFuY2giLCAiYnJhbmNodG9wdXNoIiwgIm1lcmdlIiwKKwkJCQkJInJlZnMvaGVhZHMvYnJhbmNodG9wdXNoIik7CisJCQljb25maWcuc2F2ZSgpOworCisJCQlhc3NlcnRFcXVhbHMobnVsbCwKKwkJCQkJZ2l0Mi5nZXRSZXBvc2l0b3J5KCkucmVzb2x2ZSgicmVmcy9oZWFkcy9icmFuY2h0b3B1c2giKSk7CisJCQlhc3NlcnRFcXVhbHMobnVsbCwKKwkJCQkJZ2l0Mi5nZXRSZXBvc2l0b3J5KCkucmVzb2x2ZSgicmVmcy9oZWFkcy9ub3QtcHVzaGVkIikpOworCQkJYXNzZXJ0RXF1YWxzKG51bGwsCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLnJlc29sdmUoInJlZnMvaGVhZHMvbWFzdGVyIikpOworCQkJZ2l0LnB1c2goKS5zZXRSZW1vdGUoInRlc3QiKS5zZXRQdXNoRGVmYXVsdChQdXNoRGVmYXVsdC5TSU1QTEUpCisJCQkJCS5jYWxsKCk7CisJCQlhc3NlcnRFcXVhbHMoY29tbWl0LmdldElkKCksCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLnJlc29sdmUoInJlZnMvaGVhZHMvYnJhbmNodG9wdXNoIikpOworCQkJYXNzZXJ0RXF1YWxzKG51bGwsCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLnJlc29sdmUoInJlZnMvaGVhZHMvbm90LXB1c2hlZCIpKTsKKwkJCWFzc2VydEVxdWFscyhudWxsLAorCQkJCQlnaXQyLmdldFJlcG9zaXRvcnkoKS5yZXNvbHZlKCJyZWZzL2hlYWRzL21hc3RlciIpKTsKKwkJCWFzc2VydEVxdWFscyhjb21taXQuZ2V0SWQoKSwgZ2l0LmdldFJlcG9zaXRvcnkoKQorCQkJCQkucmVzb2x2ZSgicmVmcy9yZW1vdGVzL29yaWdpbi9icmFuY2h0b3B1c2giKSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBDaGVjayB0aGF0IHB1c2guZGVmYXVsdD1zaW1wbGUgd2l0aG91dCByZWZzcGVjIHB1c2hlcyBvbmx5IHRoZSBjdXJyZW50CisJICogYnJhbmNoIHRvIGEgYnJhbmNoIHdpdGggdGhlIHNhbWUgbmFtZSBpbiBhIHRyaWFuZ3VsYXIgd29ya2Zsb3cuCisJICoKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFB1c2hEZWZhdWx0U2ltcGxlVHJpYW5ndWxhcigpIHRocm93cyBFeGNlcHRpb24geworCQl0cnkgKEdpdCBnaXQgPSBuZXcgR2l0KGRiKTsKKwkJCQlHaXQgZ2l0MiA9IG5ldyBHaXQoY3JlYXRlQmFyZVJlcG9zaXRvcnkoKSkpIHsKKwkJCVN0b3JlZENvbmZpZyBjb25maWcgPSBnaXQuZ2V0UmVwb3NpdG9yeSgpLmdldENvbmZpZygpOworCQkJUmVtb3RlQ29uZmlnIHJlbW90ZUNvbmZpZyA9IG5ldyBSZW1vdGVDb25maWcoY29uZmlnLCAidGVzdCIpOworCQkJVVJJaXNoIHVyaSA9IG5ldyBVUklpc2goCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLmdldERpcmVjdG9yeSgpLnRvVVJJKCkudG9VUkwoKSk7CisJCQlyZW1vdGVDb25maWcuYWRkVVJJKHVyaSk7CisJCQlyZW1vdGVDb25maWcuYWRkRmV0Y2hSZWZTcGVjKAorCQkJCQluZXcgUmVmU3BlYygiK3JlZnMvaGVhZHMvKjpyZWZzL3JlbW90ZXMvb3JpZ2luLyoiKSk7CisJCQlyZW1vdGVDb25maWcudXBkYXRlKGNvbmZpZyk7CisJCQljb25maWcuc2F2ZSgpOworCisJCQl3cml0ZVRyYXNoRmlsZSgiZiIsICJjb250ZW50IG9mIGYiKTsKKwkJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybigiZiIpLmNhbGwoKTsKKwkJCVJldkNvbW1pdCBjb21taXQgPSBnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgiYWRkaW5nIGYiKS5jYWxsKCk7CisKKwkJCWdpdC5jaGVja291dCgpLnNldE5hbWUoIm5vdC1wdXNoZWQiKS5zZXRDcmVhdGVCcmFuY2godHJ1ZSkuY2FsbCgpOworCQkJZ2l0LmNoZWNrb3V0KCkuc2V0TmFtZSgiYnJhbmNodG9wdXNoIikuc2V0Q3JlYXRlQnJhbmNoKHRydWUpLmNhbGwoKTsKKworCQkJY29uZmlnID0gZ2l0LmdldFJlcG9zaXRvcnkoKS5nZXRDb25maWcoKTsKKwkJCS8vIERvbid0IHNldCByZW1vdGUsIGl0J2xsIGRlZmF1bHQgdG8gIm9yaWdpbiIuIENvbmZpZ3VyZSBhCisJCQkvLyBkaWZmZXJlbnQgYnJhbmNoIG5hbWU7IHNob3VsZCBiZSBpZ25vcmVkLgorCQkJY29uZmlnLnNldFN0cmluZygiYnJhbmNoIiwgImJyYW5jaHRvcHVzaCIsICJtZXJnZSIsCisJCQkJCSJyZWZzL2hlYWRzL3Vwc3RyZWFtYnJhbmNoIik7CisJCQljb25maWcuc2F2ZSgpOworCisJCQlhc3NlcnRFcXVhbHMobnVsbCwKKwkJCQkJZ2l0Mi5nZXRSZXBvc2l0b3J5KCkucmVzb2x2ZSgicmVmcy9oZWFkcy9icmFuY2h0b3B1c2giKSk7CisJCQlhc3NlcnRFcXVhbHMobnVsbCwKKwkJCQkJZ2l0Mi5nZXRSZXBvc2l0b3J5KCkucmVzb2x2ZSgicmVmcy9oZWFkcy91cHN0cmVhbWJyYW5jaCIpKTsKKwkJCWFzc2VydEVxdWFscyhudWxsLAorCQkJCQlnaXQyLmdldFJlcG9zaXRvcnkoKS5yZXNvbHZlKCJyZWZzL2hlYWRzL25vdC1wdXNoZWQiKSk7CisJCQlhc3NlcnRFcXVhbHMobnVsbCwKKwkJCQkJZ2l0Mi5nZXRSZXBvc2l0b3J5KCkucmVzb2x2ZSgicmVmcy9oZWFkcy9tYXN0ZXIiKSk7CisJCQlnaXQucHVzaCgpLnNldFJlbW90ZSgidGVzdCIpLnNldFB1c2hEZWZhdWx0KFB1c2hEZWZhdWx0LlNJTVBMRSkKKwkJCQkJLmNhbGwoKTsKKwkJCWFzc2VydEVxdWFscyhjb21taXQuZ2V0SWQoKSwKKwkJCQkJZ2l0Mi5nZXRSZXBvc2l0b3J5KCkucmVzb2x2ZSgicmVmcy9oZWFkcy9icmFuY2h0b3B1c2giKSk7CisJCQlhc3NlcnRFcXVhbHMobnVsbCwKKwkJCQkJZ2l0Mi5nZXRSZXBvc2l0b3J5KCkucmVzb2x2ZSgicmVmcy9oZWFkcy91cHN0cmVhbWJyYW5jaCIpKTsKKwkJCWFzc2VydEVxdWFscyhudWxsLAorCQkJCQlnaXQyLmdldFJlcG9zaXRvcnkoKS5yZXNvbHZlKCJyZWZzL2hlYWRzL25vdC1wdXNoZWQiKSk7CisJCQlhc3NlcnRFcXVhbHMobnVsbCwKKwkJCQkJZ2l0Mi5nZXRSZXBvc2l0b3J5KCkucmVzb2x2ZSgicmVmcy9oZWFkcy9tYXN0ZXIiKSk7CisJCQlhc3NlcnRFcXVhbHMoY29tbWl0LmdldElkKCksIGdpdC5nZXRSZXBvc2l0b3J5KCkKKwkJCQkJLnJlc29sdmUoInJlZnMvcmVtb3Rlcy9vcmlnaW4vYnJhbmNodG9wdXNoIikpOworCQl9CisJfQorCisJLyoqCisJICogQ2hlY2sgdGhhdCBwdXNoLmRlZmF1bHQ9c2ltcGxlIHdpdGhvdXQgcmVmc3BlYyB0aHJvd3MgYW4KKwkgKiBJbnZhbGlkUmVmTmFtZUV4Y2VwdGlvbiBpZiB0aGUgY3VycmVudCBicmFuY2ggaGFzIG5vIHVwc3RyZWFtLgorCSAqCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RQdXNoRGVmYXVsdFNpbXBsZU5vVHJhY2tpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdHJ5IChHaXQgZ2l0ID0gbmV3IEdpdChkYik7CisJCQkJR2l0IGdpdDIgPSBuZXcgR2l0KGNyZWF0ZUJhcmVSZXBvc2l0b3J5KCkpKSB7CisJCQlTdG9yZWRDb25maWcgY29uZmlnID0gZ2l0LmdldFJlcG9zaXRvcnkoKS5nZXRDb25maWcoKTsKKwkJCVJlbW90ZUNvbmZpZyByZW1vdGVDb25maWcgPSBuZXcgUmVtb3RlQ29uZmlnKGNvbmZpZywgInRlc3QiKTsKKwkJCVVSSWlzaCB1cmkgPSBuZXcgVVJJaXNoKAorCQkJCQlnaXQyLmdldFJlcG9zaXRvcnkoKS5nZXREaXJlY3RvcnkoKS50b1VSSSgpLnRvVVJMKCkpOworCQkJcmVtb3RlQ29uZmlnLmFkZFVSSSh1cmkpOworCQkJcmVtb3RlQ29uZmlnLmFkZEZldGNoUmVmU3BlYygKKwkJCQkJbmV3IFJlZlNwZWMoIityZWZzL2hlYWRzLyo6cmVmcy9yZW1vdGVzL29yaWdpbi8qIikpOworCQkJcmVtb3RlQ29uZmlnLnVwZGF0ZShjb25maWcpOworCQkJY29uZmlnLnNhdmUoKTsKKworCQkJd3JpdGVUcmFzaEZpbGUoImYiLCAiY29udGVudCBvZiBmIik7CisJCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oImYiKS5jYWxsKCk7CisJCQlnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgiYWRkaW5nIGYiKS5jYWxsKCk7CisKKwkJCWdpdC5jaGVja291dCgpLnNldE5hbWUoIm5vdC1wdXNoZWQiKS5zZXRDcmVhdGVCcmFuY2godHJ1ZSkuY2FsbCgpOworCQkJZ2l0LmNoZWNrb3V0KCkuc2V0TmFtZSgiYnJhbmNodG9wdXNoIikuc2V0Q3JlYXRlQnJhbmNoKHRydWUpLmNhbGwoKTsKKworCQkJY29uZmlnID0gZ2l0LmdldFJlcG9zaXRvcnkoKS5nZXRDb25maWcoKTsKKwkJCWNvbmZpZy5zZXRTdHJpbmcoImJyYW5jaCIsICJicmFuY2h0b3B1c2giLCAicmVtb3RlIiwgInRlc3QiKTsKKwkJCWNvbmZpZy5zYXZlKCk7CisKKwkJCWFzc2VydFRocm93cyhJbnZhbGlkUmVmTmFtZUV4Y2VwdGlvbi5jbGFzcywKKwkJCQkJKCkgLT4gZ2l0LnB1c2goKS5zZXRSZW1vdGUoInRlc3QiKQorCQkJCQkJCS5zZXRQdXNoRGVmYXVsdChQdXNoRGVmYXVsdC5TSU1QTEUpLmNhbGwoKSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBDaGVjayB0aGF0IHB1c2guZGVmYXVsdD1zaW1wbGUgd2l0aG91dCByZWZzcGVjIHRocm93cyBhbgorCSAqIEludmFsaWRSZWZOYW1lRXhjZXB0aW9uIGlmIHRoZSBjdXJyZW50IGJyYW5jaCBoYXMgYW4gdXBzdHJlYW0gd2l0aCBhCisJICogZGlmZmVyZW50IG5hbWUuCisJICoKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFB1c2hEZWZhdWx0U2ltcGxlRGlmZmVyZW50VHJhY2tpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdHJ5IChHaXQgZ2l0ID0gbmV3IEdpdChkYik7CisJCQkJR2l0IGdpdDIgPSBuZXcgR2l0KGNyZWF0ZUJhcmVSZXBvc2l0b3J5KCkpKSB7CisJCQlTdG9yZWRDb25maWcgY29uZmlnID0gZ2l0LmdldFJlcG9zaXRvcnkoKS5nZXRDb25maWcoKTsKKwkJCVJlbW90ZUNvbmZpZyByZW1vdGVDb25maWcgPSBuZXcgUmVtb3RlQ29uZmlnKGNvbmZpZywgInRlc3QiKTsKKwkJCVVSSWlzaCB1cmkgPSBuZXcgVVJJaXNoKAorCQkJCQlnaXQyLmdldFJlcG9zaXRvcnkoKS5nZXREaXJlY3RvcnkoKS50b1VSSSgpLnRvVVJMKCkpOworCQkJcmVtb3RlQ29uZmlnLmFkZFVSSSh1cmkpOworCQkJcmVtb3RlQ29uZmlnLmFkZEZldGNoUmVmU3BlYygKKwkJCQkJbmV3IFJlZlNwZWMoIityZWZzL2hlYWRzLyo6cmVmcy9yZW1vdGVzL29yaWdpbi8qIikpOworCQkJcmVtb3RlQ29uZmlnLnVwZGF0ZShjb25maWcpOworCQkJY29uZmlnLnNhdmUoKTsKKworCQkJd3JpdGVUcmFzaEZpbGUoImYiLCAiY29udGVudCBvZiBmIik7CisJCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oImYiKS5jYWxsKCk7CisJCQlnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgiYWRkaW5nIGYiKS5jYWxsKCk7CisKKwkJCWdpdC5jaGVja291dCgpLnNldE5hbWUoIm5vdC1wdXNoZWQiKS5zZXRDcmVhdGVCcmFuY2godHJ1ZSkuY2FsbCgpOworCQkJZ2l0LmNoZWNrb3V0KCkuc2V0TmFtZSgiYnJhbmNodG9wdXNoIikuc2V0Q3JlYXRlQnJhbmNoKHRydWUpLmNhbGwoKTsKKworCQkJY29uZmlnID0gZ2l0LmdldFJlcG9zaXRvcnkoKS5nZXRDb25maWcoKTsKKwkJCWNvbmZpZy5zZXRTdHJpbmcoImJyYW5jaCIsICJicmFuY2h0b3B1c2giLCAicmVtb3RlIiwgInRlc3QiKTsKKwkJCWNvbmZpZy5zZXRTdHJpbmcoImJyYW5jaCIsICJicmFuY2h0b3B1c2giLCAibWVyZ2UiLAorCQkJCQkicmVmcy9oZWFkcy91cHN0cmVhbWJyYW5jaCIpOworCQkJY29uZmlnLnNhdmUoKTsKKworCQkJYXNzZXJ0VGhyb3dzKEludmFsaWRSZWZOYW1lRXhjZXB0aW9uLmNsYXNzLAorCQkJCQkoKSAtPiBnaXQucHVzaCgpLnNldFJlbW90ZSgidGVzdCIpCisJCQkJCQkJLnNldFB1c2hEZWZhdWx0KFB1c2hEZWZhdWx0LlNJTVBMRSkuY2FsbCgpKTsKKwkJfQorCX0KKworCS8qKgorCSAqIENoZWNrIHRoYXQgaWYgbm8gUHVzaERlZmF1bHQgaXMgc2V0LCB0aGUgdmFsdWUgaXMgcmVhZCBmcm9tIHRoZSBnaXQKKwkgKiBjb25maWcuCisJICoKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFB1c2hEZWZhdWx0RnJvbUNvbmZpZygpIHRocm93cyBFeGNlcHRpb24geworCQl0cnkgKEdpdCBnaXQgPSBuZXcgR2l0KGRiKTsKKwkJCQlHaXQgZ2l0MiA9IG5ldyBHaXQoY3JlYXRlQmFyZVJlcG9zaXRvcnkoKSkpIHsKKwkJCVN0b3JlZENvbmZpZyBjb25maWcgPSBnaXQuZ2V0UmVwb3NpdG9yeSgpLmdldENvbmZpZygpOworCQkJUmVtb3RlQ29uZmlnIHJlbW90ZUNvbmZpZyA9IG5ldyBSZW1vdGVDb25maWcoY29uZmlnLCAidGVzdCIpOworCQkJVVJJaXNoIHVyaSA9IG5ldyBVUklpc2goCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLmdldERpcmVjdG9yeSgpLnRvVVJJKCkudG9VUkwoKSk7CisJCQlyZW1vdGVDb25maWcuYWRkVVJJKHVyaSk7CisJCQlyZW1vdGVDb25maWcuYWRkRmV0Y2hSZWZTcGVjKAorCQkJCQluZXcgUmVmU3BlYygiK3JlZnMvaGVhZHMvKjpyZWZzL3JlbW90ZXMvb3JpZ2luLyoiKSk7CisJCQlyZW1vdGVDb25maWcudXBkYXRlKGNvbmZpZyk7CisJCQljb25maWcuc2V0U3RyaW5nKCJwdXNoIiwgbnVsbCwgImRlZmF1bHQiLCAidXBzdHJlYW0iKTsKKwkJCWNvbmZpZy5zYXZlKCk7CisKKwkJCXdyaXRlVHJhc2hGaWxlKCJmIiwgImNvbnRlbnQgb2YgZiIpOworCQkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCJmIikuY2FsbCgpOworCQkJUmV2Q29tbWl0IGNvbW1pdCA9IGdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJhZGRpbmcgZiIpLmNhbGwoKTsKKworCQkJZ2l0LmNoZWNrb3V0KCkuc2V0TmFtZSgibm90LXB1c2hlZCIpLnNldENyZWF0ZUJyYW5jaCh0cnVlKS5jYWxsKCk7CisJCQlnaXQuY2hlY2tvdXQoKS5zZXROYW1lKCJicmFuY2h0b3B1c2giKS5zZXRDcmVhdGVCcmFuY2godHJ1ZSkuY2FsbCgpOworCisJCQljb25maWcgPSBnaXQuZ2V0UmVwb3NpdG9yeSgpLmdldENvbmZpZygpOworCQkJY29uZmlnLnNldFN0cmluZygiYnJhbmNoIiwgImJyYW5jaHRvcHVzaCIsICJyZW1vdGUiLCAidGVzdCIpOworCQkJY29uZmlnLnNldFN0cmluZygiYnJhbmNoIiwgImJyYW5jaHRvcHVzaCIsICJtZXJnZSIsCisJCQkJCSJyZWZzL2hlYWRzL3Vwc3RyZWFtYnJhbmNoIik7CisJCQljb25maWcuc2F2ZSgpOworCisJCQlhc3NlcnRFcXVhbHMobnVsbCwKKwkJCQkJZ2l0Mi5nZXRSZXBvc2l0b3J5KCkucmVzb2x2ZSgicmVmcy9oZWFkcy9icmFuY2h0b3B1c2giKSk7CisJCQlhc3NlcnRFcXVhbHMobnVsbCwKKwkJCQkJZ2l0Mi5nZXRSZXBvc2l0b3J5KCkucmVzb2x2ZSgicmVmcy9oZWFkcy91cHN0cmVhbWJyYW5jaCIpKTsKKwkJCWFzc2VydEVxdWFscyhudWxsLAorCQkJCQlnaXQyLmdldFJlcG9zaXRvcnkoKS5yZXNvbHZlKCJyZWZzL2hlYWRzL25vdC1wdXNoZWQiKSk7CisJCQlhc3NlcnRFcXVhbHMobnVsbCwKKwkJCQkJZ2l0Mi5nZXRSZXBvc2l0b3J5KCkucmVzb2x2ZSgicmVmcy9oZWFkcy9tYXN0ZXIiKSk7CisJCQlQdXNoQ29tbWFuZCBjbWQgPSBnaXQucHVzaCgpOworCQkJY21kLnNldFJlbW90ZSgidGVzdCIpLnNldFB1c2hEZWZhdWx0KG51bGwpLmNhbGwoKTsKKwkJCWFzc2VydEVxdWFscyhQdXNoRGVmYXVsdC5VUFNUUkVBTSwgY21kLmdldFB1c2hEZWZhdWx0KCkpOworCQkJYXNzZXJ0RXF1YWxzKG51bGwsCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLnJlc29sdmUoInJlZnMvaGVhZHMvYnJhbmNodG9wdXNoIikpOworCQkJYXNzZXJ0RXF1YWxzKGNvbW1pdC5nZXRJZCgpLAorCQkJCQlnaXQyLmdldFJlcG9zaXRvcnkoKS5yZXNvbHZlKCJyZWZzL2hlYWRzL3Vwc3RyZWFtYnJhbmNoIikpOworCQkJYXNzZXJ0RXF1YWxzKG51bGwsCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLnJlc29sdmUoInJlZnMvaGVhZHMvbm90LXB1c2hlZCIpKTsKKwkJCWFzc2VydEVxdWFscyhudWxsLAorCQkJCQlnaXQyLmdldFJlcG9zaXRvcnkoKS5yZXNvbHZlKCJyZWZzL2hlYWRzL21hc3RlciIpKTsKKwkJCWFzc2VydEVxdWFscyhjb21taXQuZ2V0SWQoKSwgZ2l0LmdldFJlcG9zaXRvcnkoKQorCQkJCQkucmVzb2x2ZSgicmVmcy9yZW1vdGVzL29yaWdpbi91cHN0cmVhbWJyYW5jaCIpKTsKKwkJCWFzc2VydEVxdWFscyhudWxsLCBnaXQuZ2V0UmVwb3NpdG9yeSgpCisJCQkJCS5yZXNvbHZlKCJyZWZzL3JlbW90ZXMvb3JpZ2luL2JyYW5jaHRvcHVzaCIpKTsKKwkJfQorCX0KKworCS8qKgorCSAqIENoZWNrIHRoYXQgaWYgbm8gUHVzaERlZmF1bHQgaXMgc2V0IGFuZCBub25lIGlzIHNldCBpbiB0aGUgZ2l0IGNvbmZpZywgaXQKKwkgKiBkZWZhdWx0cyB0byAic2ltcGxlIi4KKwkgKgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0UHVzaERlZmF1bHRGcm9tQ29uZmlnRGVmYXVsdCgpIHRocm93cyBFeGNlcHRpb24geworCQl0cnkgKEdpdCBnaXQgPSBuZXcgR2l0KGRiKTsKKwkJCQlHaXQgZ2l0MiA9IG5ldyBHaXQoY3JlYXRlQmFyZVJlcG9zaXRvcnkoKSkpIHsKKwkJCVN0b3JlZENvbmZpZyBjb25maWcgPSBnaXQuZ2V0UmVwb3NpdG9yeSgpLmdldENvbmZpZygpOworCQkJUmVtb3RlQ29uZmlnIHJlbW90ZUNvbmZpZyA9IG5ldyBSZW1vdGVDb25maWcoY29uZmlnLCAidGVzdCIpOworCQkJVVJJaXNoIHVyaSA9IG5ldyBVUklpc2goCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLmdldERpcmVjdG9yeSgpLnRvVVJJKCkudG9VUkwoKSk7CisJCQlyZW1vdGVDb25maWcuYWRkVVJJKHVyaSk7CisJCQlyZW1vdGVDb25maWcuYWRkRmV0Y2hSZWZTcGVjKAorCQkJCQluZXcgUmVmU3BlYygiK3JlZnMvaGVhZHMvKjpyZWZzL3JlbW90ZXMvb3JpZ2luLyoiKSk7CisJCQlyZW1vdGVDb25maWcudXBkYXRlKGNvbmZpZyk7CisJCQljb25maWcuc2F2ZSgpOworCisJCQl3cml0ZVRyYXNoRmlsZSgiZiIsICJjb250ZW50IG9mIGYiKTsKKwkJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybigiZiIpLmNhbGwoKTsKKwkJCVJldkNvbW1pdCBjb21taXQgPSBnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgiYWRkaW5nIGYiKS5jYWxsKCk7CisKKwkJCWdpdC5jaGVja291dCgpLnNldE5hbWUoIm5vdC1wdXNoZWQiKS5zZXRDcmVhdGVCcmFuY2godHJ1ZSkuY2FsbCgpOworCQkJZ2l0LmNoZWNrb3V0KCkuc2V0TmFtZSgiYnJhbmNodG9wdXNoIikuc2V0Q3JlYXRlQnJhbmNoKHRydWUpLmNhbGwoKTsKKworCQkJY29uZmlnID0gZ2l0LmdldFJlcG9zaXRvcnkoKS5nZXRDb25maWcoKTsKKwkJCWNvbmZpZy5zZXRTdHJpbmcoImJyYW5jaCIsICJicmFuY2h0b3B1c2giLCAicmVtb3RlIiwgInRlc3QiKTsKKwkJCWNvbmZpZy5zZXRTdHJpbmcoImJyYW5jaCIsICJicmFuY2h0b3B1c2giLCAibWVyZ2UiLAorCQkJCQkicmVmcy9oZWFkcy9icmFuY2h0b3B1c2giKTsKKwkJCWNvbmZpZy5zYXZlKCk7CisKKwkJCWFzc2VydEVxdWFscyhudWxsLAorCQkJCQlnaXQyLmdldFJlcG9zaXRvcnkoKS5yZXNvbHZlKCJyZWZzL2hlYWRzL2JyYW5jaHRvcHVzaCIpKTsKKwkJCWFzc2VydEVxdWFscyhudWxsLAorCQkJCQlnaXQyLmdldFJlcG9zaXRvcnkoKS5yZXNvbHZlKCJyZWZzL2hlYWRzL25vdC1wdXNoZWQiKSk7CisJCQlhc3NlcnRFcXVhbHMobnVsbCwKKwkJCQkJZ2l0Mi5nZXRSZXBvc2l0b3J5KCkucmVzb2x2ZSgicmVmcy9oZWFkcy9tYXN0ZXIiKSk7CisJCQlQdXNoQ29tbWFuZCBjbWQgPSBnaXQucHVzaCgpOworCQkJY21kLnNldFJlbW90ZSgidGVzdCIpLnNldFB1c2hEZWZhdWx0KG51bGwpLmNhbGwoKTsKKwkJCWFzc2VydEVxdWFscyhQdXNoRGVmYXVsdC5TSU1QTEUsIGNtZC5nZXRQdXNoRGVmYXVsdCgpKTsKKwkJCWFzc2VydEVxdWFscyhjb21taXQuZ2V0SWQoKSwKKwkJCQkJZ2l0Mi5nZXRSZXBvc2l0b3J5KCkucmVzb2x2ZSgicmVmcy9oZWFkcy9icmFuY2h0b3B1c2giKSk7CisJCQlhc3NlcnRFcXVhbHMobnVsbCwKKwkJCQkJZ2l0Mi5nZXRSZXBvc2l0b3J5KCkucmVzb2x2ZSgicmVmcy9oZWFkcy9ub3QtcHVzaGVkIikpOworCQkJYXNzZXJ0RXF1YWxzKG51bGwsCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLnJlc29sdmUoInJlZnMvaGVhZHMvbWFzdGVyIikpOworCQkJYXNzZXJ0RXF1YWxzKGNvbW1pdC5nZXRJZCgpLCBnaXQuZ2V0UmVwb3NpdG9yeSgpCisJCQkJCS5yZXNvbHZlKCJyZWZzL3JlbW90ZXMvb3JpZ2luL2JyYW5jaHRvcHVzaCIpKTsKKwkJfQorCX0KKworCS8qKgorCSAqIENoZWNrIHRoYXQgYnJhbmNoLjxuYW1lPi5wdXNoUmVtb3RlIG92ZXJyaWRlcyBhbnl0aGluZyBlbHNlLgorCSAqCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RCcmFuY2hQdXNoUmVtb3RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRyeSAoR2l0IGdpdCA9IG5ldyBHaXQoZGIpOworCQkJCUdpdCBnaXQyID0gbmV3IEdpdChjcmVhdGVCYXJlUmVwb3NpdG9yeSgpKSkgeworCQkJU3RvcmVkQ29uZmlnIGNvbmZpZyA9IGdpdC5nZXRSZXBvc2l0b3J5KCkuZ2V0Q29uZmlnKCk7CisJCQlSZW1vdGVDb25maWcgcmVtb3RlQ29uZmlnID0gbmV3IFJlbW90ZUNvbmZpZyhjb25maWcsICJ0ZXN0Iik7CisJCQlVUklpc2ggdXJpID0gbmV3IFVSSWlzaCgKKwkJCQkJZ2l0Mi5nZXRSZXBvc2l0b3J5KCkuZ2V0RGlyZWN0b3J5KCkudG9VUkkoKS50b1VSTCgpKTsKKwkJCXJlbW90ZUNvbmZpZy5hZGRVUkkodXJpKTsKKwkJCXJlbW90ZUNvbmZpZy5hZGRGZXRjaFJlZlNwZWMoCisJCQkJCW5ldyBSZWZTcGVjKCIrcmVmcy9oZWFkcy8qOnJlZnMvcmVtb3Rlcy9vcmlnaW4vKiIpKTsKKwkJCXJlbW90ZUNvbmZpZy51cGRhdGUoY29uZmlnKTsKKwkJCWNvbmZpZy5zZXRTdHJpbmcoInJlbW90ZSIsIG51bGwsICJwdXNoRGVmYXVsdCIsICJ0ZXN0Iik7CisJCQljb25maWcuc2F2ZSgpOworCisJCQl3cml0ZVRyYXNoRmlsZSgiZiIsICJjb250ZW50IG9mIGYiKTsKKwkJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybigiZiIpLmNhbGwoKTsKKwkJCWdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJhZGRpbmcgZiIpLmNhbGwoKTsKKworCQkJZ2l0LmNoZWNrb3V0KCkuc2V0TmFtZSgibm90LXB1c2hlZCIpLnNldENyZWF0ZUJyYW5jaCh0cnVlKS5jYWxsKCk7CisJCQlnaXQuY2hlY2tvdXQoKS5zZXROYW1lKCJicmFuY2h0b3B1c2giKS5zZXRDcmVhdGVCcmFuY2godHJ1ZSkuY2FsbCgpOworCisJCQljb25maWcgPSBnaXQuZ2V0UmVwb3NpdG9yeSgpLmdldENvbmZpZygpOworCQkJY29uZmlnLnNldFN0cmluZygiYnJhbmNoIiwgImJyYW5jaHRvcHVzaCIsICJyZW1vdGUiLCAidGVzdCIpOworCQkJY29uZmlnLnNldFN0cmluZygiYnJhbmNoIiwgImJyYW5jaHRvcHVzaCIsICJwdXNocmVtb3RlIiwgIm9yaWdpbiIpOworCQkJY29uZmlnLnNldFN0cmluZygiYnJhbmNoIiwgImJyYW5jaHRvcHVzaCIsICJtZXJnZSIsCisJCQkJCSJyZWZzL2hlYWRzL2JyYW5jaHRvcHVzaCIpOworCQkJY29uZmlnLnNhdmUoKTsKKworCQkJYXNzZXJ0VGhyb3dzKEludmFsaWRSZWZOYW1lRXhjZXB0aW9uLmNsYXNzLCAoKSAtPiBnaXQucHVzaCgpCisJCQkJCS5zZXRQdXNoRGVmYXVsdChQdXNoRGVmYXVsdC5VUFNUUkVBTSkuY2FsbCgpKTsKKwkJfQorCX0KKworCS8qKgorCSAqIENoZWNrIHRoYXQgcmVtb3RlLnB1c2hEZWZhdWx0IG92ZXJyaWRlcyBicmFuY2guPG5hbWU+LnJlbW90ZQorCSAqCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RSZW1vdGVQdXNoRGVmYXVsdCgpIHRocm93cyBFeGNlcHRpb24geworCQl0cnkgKEdpdCBnaXQgPSBuZXcgR2l0KGRiKTsKKwkJCQlHaXQgZ2l0MiA9IG5ldyBHaXQoY3JlYXRlQmFyZVJlcG9zaXRvcnkoKSkpIHsKKwkJCVN0b3JlZENvbmZpZyBjb25maWcgPSBnaXQuZ2V0UmVwb3NpdG9yeSgpLmdldENvbmZpZygpOworCQkJUmVtb3RlQ29uZmlnIHJlbW90ZUNvbmZpZyA9IG5ldyBSZW1vdGVDb25maWcoY29uZmlnLCAidGVzdCIpOworCQkJVVJJaXNoIHVyaSA9IG5ldyBVUklpc2goCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLmdldERpcmVjdG9yeSgpLnRvVVJJKCkudG9VUkwoKSk7CisJCQlyZW1vdGVDb25maWcuYWRkVVJJKHVyaSk7CisJCQlyZW1vdGVDb25maWcuYWRkRmV0Y2hSZWZTcGVjKAorCQkJCQluZXcgUmVmU3BlYygiK3JlZnMvaGVhZHMvKjpyZWZzL3JlbW90ZXMvb3JpZ2luLyoiKSk7CisJCQlyZW1vdGVDb25maWcudXBkYXRlKGNvbmZpZyk7CisJCQljb25maWcuc2V0U3RyaW5nKCJyZW1vdGUiLCBudWxsLCAicHVzaERlZmF1bHQiLCAib3JpZ2luIik7CisJCQljb25maWcuc2F2ZSgpOworCisJCQl3cml0ZVRyYXNoRmlsZSgiZiIsICJjb250ZW50IG9mIGYiKTsKKwkJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybigiZiIpLmNhbGwoKTsKKwkJCWdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJhZGRpbmcgZiIpLmNhbGwoKTsKKworCQkJZ2l0LmNoZWNrb3V0KCkuc2V0TmFtZSgibm90LXB1c2hlZCIpLnNldENyZWF0ZUJyYW5jaCh0cnVlKS5jYWxsKCk7CisJCQlnaXQuY2hlY2tvdXQoKS5zZXROYW1lKCJicmFuY2h0b3B1c2giKS5zZXRDcmVhdGVCcmFuY2godHJ1ZSkuY2FsbCgpOworCisJCQljb25maWcgPSBnaXQuZ2V0UmVwb3NpdG9yeSgpLmdldENvbmZpZygpOworCQkJY29uZmlnLnNldFN0cmluZygiYnJhbmNoIiwgImJyYW5jaHRvcHVzaCIsICJyZW1vdGUiLCAidGVzdCIpOworCQkJY29uZmlnLnNldFN0cmluZygiYnJhbmNoIiwgImJyYW5jaHRvcHVzaCIsICJtZXJnZSIsCisJCQkJCSJyZWZzL2hlYWRzL2JyYW5jaHRvcHVzaCIpOworCQkJY29uZmlnLnNhdmUoKTsKKworCQkJYXNzZXJ0VGhyb3dzKEludmFsaWRSZWZOYW1lRXhjZXB0aW9uLmNsYXNzLCAoKSAtPiBnaXQucHVzaCgpCisJCQkJCS5zZXRQdXNoRGVmYXVsdChQdXNoRGVmYXVsdC5VUFNUUkVBTSkuY2FsbCgpKTsKKwkJfQorCX0KKworCS8qKgorCSAqIENoZWNrIHRoYXQgdWx0aW1hdGVseSB3ZSBmYWxsIGJhY2sgdG8gIm9yaWdpbiIuCisJICoKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdERlZmF1bHRSZW1vdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdHJ5IChHaXQgZ2l0ID0gbmV3IEdpdChkYik7CisJCQkJR2l0IGdpdDIgPSBuZXcgR2l0KGNyZWF0ZUJhcmVSZXBvc2l0b3J5KCkpKSB7CisJCQlTdG9yZWRDb25maWcgY29uZmlnID0gZ2l0LmdldFJlcG9zaXRvcnkoKS5nZXRDb25maWcoKTsKKwkJCVJlbW90ZUNvbmZpZyByZW1vdGVDb25maWcgPSBuZXcgUmVtb3RlQ29uZmlnKGNvbmZpZywgInRlc3QiKTsKKwkJCVVSSWlzaCB1cmkgPSBuZXcgVVJJaXNoKAorCQkJCQlnaXQyLmdldFJlcG9zaXRvcnkoKS5nZXREaXJlY3RvcnkoKS50b1VSSSgpLnRvVVJMKCkpOworCQkJcmVtb3RlQ29uZmlnLmFkZFVSSSh1cmkpOworCQkJcmVtb3RlQ29uZmlnLmFkZEZldGNoUmVmU3BlYygKKwkJCQkJbmV3IFJlZlNwZWMoIityZWZzL2hlYWRzLyo6cmVmcy9yZW1vdGVzL29yaWdpbi8qIikpOworCQkJcmVtb3RlQ29uZmlnLnVwZGF0ZShjb25maWcpOworCQkJY29uZmlnLnNhdmUoKTsKKworCQkJd3JpdGVUcmFzaEZpbGUoImYiLCAiY29udGVudCBvZiBmIik7CisJCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oImYiKS5jYWxsKCk7CisJCQlnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgiYWRkaW5nIGYiKS5jYWxsKCk7CisKKwkJCWdpdC5jaGVja291dCgpLnNldE5hbWUoIm5vdC1wdXNoZWQiKS5zZXRDcmVhdGVCcmFuY2godHJ1ZSkuY2FsbCgpOworCQkJZ2l0LmNoZWNrb3V0KCkuc2V0TmFtZSgiYnJhbmNodG9wdXNoIikuc2V0Q3JlYXRlQnJhbmNoKHRydWUpLmNhbGwoKTsKKworCQkJY29uZmlnID0gZ2l0LmdldFJlcG9zaXRvcnkoKS5nZXRDb25maWcoKTsKKwkJCWNvbmZpZy5zZXRTdHJpbmcoImJyYW5jaCIsICJicmFuY2h0b3B1c2giLCAibWVyZ2UiLAorCQkJCQkicmVmcy9oZWFkcy9icmFuY2h0b3B1c2giKTsKKwkJCWNvbmZpZy5zYXZlKCk7CisKKwkJCVB1c2hDb21tYW5kIGNtZCA9IGdpdC5wdXNoKCkuc2V0UHVzaERlZmF1bHQoUHVzaERlZmF1bHQuVVBTVFJFQU0pOworCQkJVHJhbnNwb3J0RXhjZXB0aW9uIGUgPSBhc3NlcnRUaHJvd3MoVHJhbnNwb3J0RXhjZXB0aW9uLmNsYXNzLAorCQkJCQkoKSAtPiBjbWQuY2FsbCgpKTsKKwkJCWFzc2VydEVxdWFscyhOb1JlbW90ZVJlcG9zaXRvcnlFeGNlcHRpb24uY2xhc3MsCisJCQkJCWUuZ2V0Q2F1c2UoKS5nZXRDbGFzcygpKTsKKwkJCWFzc2VydEVxdWFscygib3JpZ2luIiwgY21kLmdldFJlbW90ZSgpKTsKKwkJfQorCX0KKworCS8qKgorCSAqIENoZWNrIHRoYXQgYSBwdXNoIHdpdGhvdXQgc3BlY2lmeWluZyBhIHJlbW90ZSBvciBtb2RlIG9yIGFueXRoaW5nIGNhbgorCSAqIHN1Y2NlZWQgaWYgdGhlIGdpdCBjb25maWcgaXMgY29ycmVjdC4KKwkgKgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdFB1c2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdHJ5IChHaXQgZ2l0ID0gbmV3IEdpdChkYik7CisJCQkJR2l0IGdpdDIgPSBuZXcgR2l0KGNyZWF0ZUJhcmVSZXBvc2l0b3J5KCkpKSB7CisJCQlTdG9yZWRDb25maWcgY29uZmlnID0gZ2l0LmdldFJlcG9zaXRvcnkoKS5nZXRDb25maWcoKTsKKwkJCVJlbW90ZUNvbmZpZyByZW1vdGVDb25maWcgPSBuZXcgUmVtb3RlQ29uZmlnKGNvbmZpZywgInRlc3QiKTsKKwkJCVVSSWlzaCB1cmkgPSBuZXcgVVJJaXNoKAorCQkJCQlnaXQyLmdldFJlcG9zaXRvcnkoKS5nZXREaXJlY3RvcnkoKS50b1VSSSgpLnRvVVJMKCkpOworCQkJcmVtb3RlQ29uZmlnLmFkZFVSSSh1cmkpOworCQkJcmVtb3RlQ29uZmlnLmFkZEZldGNoUmVmU3BlYygKKwkJCQkJbmV3IFJlZlNwZWMoIityZWZzL2hlYWRzLyo6cmVmcy9yZW1vdGVzL29yaWdpbi8qIikpOworCQkJcmVtb3RlQ29uZmlnLnVwZGF0ZShjb25maWcpOworCQkJY29uZmlnLnNhdmUoKTsKKworCQkJd3JpdGVUcmFzaEZpbGUoImYiLCAiY29udGVudCBvZiBmIik7CisJCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oImYiKS5jYWxsKCk7CisJCQlSZXZDb21taXQgY29tbWl0ID0gZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoImFkZGluZyBmIikuY2FsbCgpOworCisJCQlnaXQuY2hlY2tvdXQoKS5zZXROYW1lKCJub3QtcHVzaGVkIikuc2V0Q3JlYXRlQnJhbmNoKHRydWUpLmNhbGwoKTsKKwkJCWdpdC5jaGVja291dCgpLnNldE5hbWUoImJyYW5jaHRvcHVzaCIpLnNldENyZWF0ZUJyYW5jaCh0cnVlKS5jYWxsKCk7CisKKwkJCWNvbmZpZyA9IGdpdC5nZXRSZXBvc2l0b3J5KCkuZ2V0Q29uZmlnKCk7CisJCQljb25maWcuc2V0U3RyaW5nKCJicmFuY2giLCAiYnJhbmNodG9wdXNoIiwgInJlbW90ZSIsICJ0ZXN0Iik7CisJCQljb25maWcuc2F2ZSgpOworCisJCQlhc3NlcnRFcXVhbHMobnVsbCwKKwkJCQkJZ2l0Mi5nZXRSZXBvc2l0b3J5KCkucmVzb2x2ZSgicmVmcy9oZWFkcy9icmFuY2h0b3B1c2giKSk7CisJCQlhc3NlcnRFcXVhbHMobnVsbCwKKwkJCQkJZ2l0Mi5nZXRSZXBvc2l0b3J5KCkucmVzb2x2ZSgicmVmcy9oZWFkcy9ub3QtcHVzaGVkIikpOworCQkJYXNzZXJ0RXF1YWxzKG51bGwsCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLnJlc29sdmUoInJlZnMvaGVhZHMvbWFzdGVyIikpOworCQkJLy8gU2hvdWxkIHVzZSByZW1vdGUgInRlc3QiLCBwdXNoLmRlZmF1bHQ9Y3VycmVudAorCQkJUHVzaENvbW1hbmQgY21kID0gZ2l0LnB1c2goKTsKKwkJCWNtZC5jYWxsKCk7CisJCQlhc3NlcnRFcXVhbHMoInRlc3QiLCBjbWQuZ2V0UmVtb3RlKCkpOworCQkJYXNzZXJ0RXF1YWxzKFB1c2hEZWZhdWx0LkNVUlJFTlQsIGNtZC5nZXRQdXNoRGVmYXVsdCgpKTsKKwkJCWFzc2VydEVxdWFscyhjb21taXQuZ2V0SWQoKSwKKwkJCQkJZ2l0Mi5nZXRSZXBvc2l0b3J5KCkucmVzb2x2ZSgicmVmcy9oZWFkcy9icmFuY2h0b3B1c2giKSk7CisJCQlhc3NlcnRFcXVhbHMobnVsbCwKKwkJCQkJZ2l0Mi5nZXRSZXBvc2l0b3J5KCkucmVzb2x2ZSgicmVmcy9oZWFkcy9ub3QtcHVzaGVkIikpOworCQkJYXNzZXJ0RXF1YWxzKG51bGwsCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLnJlc29sdmUoInJlZnMvaGVhZHMvbWFzdGVyIikpOworCQkJYXNzZXJ0RXF1YWxzKGNvbW1pdC5nZXRJZCgpLCBnaXQuZ2V0UmVwb3NpdG9yeSgpCisJCQkJCS5yZXNvbHZlKCJyZWZzL3JlbW90ZXMvb3JpZ2luL2JyYW5jaHRvcHVzaCIpKTsKKwkJfQorCX0KKworCS8qKgogCSAqIENoZWNrIHRoYXQgbWlzc2luZyByZWZzIGRvbid0IGNhdXNlIGVycm9ycyBkdXJpbmcgcHVzaAogCSAqCiAJICogQHRocm93cyBFeGNlcHRpb24KQEAgLTI5Nyw2ICsxMDY4LDcgQEAgcHVibGljIHZvaWQgdGVzdFB1c2hXaXRob3V0UHVzaFJlZlNwZWMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAlwdWJsaWMgdm9pZCB0ZXN0UHVzaEFmdGVyR0MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJLy8gY3JlYXRlIG90aGVyIHJlcG9zaXRvcnkKIAkJUmVwb3NpdG9yeSBkYjIgPSBjcmVhdGVXb3JrUmVwb3NpdG9yeSgpOworCQlhZGRSZXBvVG9DbG9zZShkYjIpOwogCiAJCS8vIHNldHVwIHRoZSBmaXJzdCByZXBvc2l0b3J5CiAJCWZpbmFsIFN0b3JlZENvbmZpZyBjb25maWcgPSBkYi5nZXRDb25maWcoKTsKQEAgLTM2MCw2ICsxMTMyLDcgQEAgcHVibGljIHZvaWQgdGVzdFB1c2hXaXRoTGVhc2UoKSB0aHJvd3MgSkdpdEludGVybmFsRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwKIAogCQkvLyBjcmVhdGUgb3RoZXIgcmVwb3NpdG9yeQogCQlSZXBvc2l0b3J5IGRiMiA9IGNyZWF0ZVdvcmtSZXBvc2l0b3J5KCk7CisJCWFkZFJlcG9Ub0Nsb3NlKGRiMik7CiAKIAkJLy8gc2V0dXAgdGhlIGZpcnN0IHJlcG9zaXRvcnkKIAkJZmluYWwgU3RvcmVkQ29uZmlnIGNvbmZpZyA9IGRiLmdldENvbmZpZygpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9SZWJhc2VDb21tYW5kVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9SZWJhc2VDb21tYW5kVGVzdC5qYXZhCmluZGV4IDg2MjM5MDIuLmM2NGZmMGIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvUmViYXNlQ29tbWFuZFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL1JlYmFzZUNvbW1hbmRUZXN0LmphdmEKQEAgLTI5MjcsOCArMjkyNyw4IEBAIHB1YmxpYyBTdHJpbmcgbW9kaWZ5Q29tbWl0TWVzc2FnZShTdHJpbmcgY29tbWl0KSB7CiAJCX0KIAl9CiAKLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RSZWJhc2VJbnRlcmFjdGl2ZUZpeHVwV2l0aEJsYW5rTGluZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwlwcml2YXRlIHZvaWQgc2ltcGxlRml4dXAoU3RyaW5nIGZpcnN0TWVzc2FnZSwgU3RyaW5nIHNlY29uZE1lc3NhZ2UpCisJCQl0aHJvd3MgRXhjZXB0aW9uIHsKIAkJLy8gY3JlYXRlIGZpbGUxIG9uIG1hc3RlcgogCQl3cml0ZVRyYXNoRmlsZShGSUxFMSwgRklMRTEpOwogCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oRklMRTEpLmNhbGwoKTsKQEAgLTI5MzgsMTMgKzI5MzgsMTMgQEAgcHVibGljIHZvaWQgdGVzdFJlYmFzZUludGVyYWN0aXZlRml4dXBXaXRoQmxhbmtMaW5lcygpIHRocm93cyBFeGNlcHRpb24gewogCQkvLyBjcmVhdGUgZmlsZTIgb24gbWFzdGVyCiAJCXdyaXRlVHJhc2hGaWxlKCJmaWxlMiIsICJmaWxlMiIpOwogCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oImZpbGUyIikuY2FsbCgpOwotCQlnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgiQWRkIGZpbGUyIikuY2FsbCgpOworCQlnaXQuY29tbWl0KCkuc2V0TWVzc2FnZShmaXJzdE1lc3NhZ2UpLmNhbGwoKTsKIAkJYXNzZXJ0VHJ1ZShuZXcgRmlsZShkYi5nZXRXb3JrVHJlZSgpLCAiZmlsZTIiKS5leGlzdHMoKSk7CiAKIAkJLy8gdXBkYXRlIEZJTEUxIG9uIG1hc3RlcgogCQl3cml0ZVRyYXNoRmlsZShGSUxFMSwgImJsYWgiKTsKIAkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKEZJTEUxKS5jYWxsKCk7Ci0JCWdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJ1cGRhdGVkIGZpbGUxIG9uIG1hc3RlclxuXG5zb21lIHRleHQiKS5jYWxsKCk7CisJCWdpdC5jb21taXQoKS5zZXRNZXNzYWdlKHNlY29uZE1lc3NhZ2UpLmNhbGwoKTsKIAogCQlnaXQucmViYXNlKCkuc2V0VXBzdHJlYW0oIkhFQUR+MiIpCiAJCQkJLnJ1bkludGVyYWN0aXZlbHkobmV3IEludGVyYWN0aXZlSGFuZGxlcigpIHsKQEAgLTI5NjgsOSArMjk2OCwzMSBAQCBwdWJsaWMgU3RyaW5nIG1vZGlmeUNvbW1pdE1lc3NhZ2UoU3RyaW5nIGNvbW1pdCkgewogCQl0cnkgKFJldldhbGsgd2FsayA9IG5ldyBSZXZXYWxrKGRiKSkgewogCQkJT2JqZWN0SWQgaGVhZElkID0gZGIucmVzb2x2ZShDb25zdGFudHMuSEVBRCk7CiAJCQlSZXZDb21taXQgaGVhZENvbW1pdCA9IHdhbGsucGFyc2VDb21taXQoaGVhZElkKTsKLQkJCWFzc2VydEVxdWFscygiQWRkIGZpbGUyIiwKLQkJCQkJaGVhZENvbW1pdC5nZXRGdWxsTWVzc2FnZSgpKTsKKwkJCWFzc2VydEVxdWFscyhmaXJzdE1lc3NhZ2UsIGhlYWRDb21taXQuZ2V0RnVsbE1lc3NhZ2UoKSk7CiAJCX0KKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFJlYmFzZUludGVyYWN0aXZlRml4dXBXaXRoQmxhbmtMaW5lcygpIHRocm93cyBFeGNlcHRpb24geworCQlzaW1wbGVGaXh1cCgiQWRkIGZpbGUyIiwgInVwZGF0ZWQgZmlsZTEgb24gbWFzdGVyXG5cbnNvbWUgdGV4dCIpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFJlYmFzZUludGVyYWN0aXZlRml4dXBXaXRoQmxhbmtMaW5lczIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc2ltcGxlRml4dXAoIkFkZCBmaWxlMlxuXG5Cb2R5XG4iLAorCQkJCSJ1cGRhdGVkIGZpbGUxIG9uIG1hc3RlclxuXG5zb21lIHRleHQiKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RSZWJhc2VJbnRlcmFjdGl2ZUZpeHVwV2l0aEhhc2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc2ltcGxlRml4dXAoIiNBZGQgZmlsZTIiLCAidXBkYXRlZCBmaWxlMSBvbiBtYXN0ZXIiKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RSZWJhc2VJbnRlcmFjdGl2ZUZpeHVwV2l0aEhhc2gyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNpbXBsZUZpeHVwKCIjQWRkIGZpbGUyXG5cbkhlYWRlciBoYXMgaGFzaFxuIiwKKwkJCQkiI3VwZGF0ZWQgZmlsZTEgb24gbWFzdGVyIik7CiAJfQogCiAJQFRlc3QoZXhwZWN0ZWQgPSBJbnZhbGlkUmViYXNlU3RlcEV4Y2VwdGlvbi5jbGFzcykKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvUmV2ZXJ0Q29tbWFuZFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvUmV2ZXJ0Q29tbWFuZFRlc3QuamF2YQppbmRleCBjZmE4NDg2Li4xYzdiOGQxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL1JldmVydENvbW1hbmRUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9SZXZlcnRDb21tYW5kVGVzdC5qYXZhCkBAIC05LDYgKzksNyBAQAogICovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuYXBpOwogCitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5PQkpFQ1RfSURfQUJCUkVWX1NUUklOR19MRU5HVEg7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CkBAIC0xNjYsNyArMTY3LDkgQEAgcHVibGljIHZvaWQgdGVzdFJldmVydE11bHRpcGxlV2l0aEZhaWwoKSB0aHJvd3MgSU9FeGNlcHRpb24sCiAKIAkJCWNoZWNrRmlsZShuZXcgRmlsZShkYi5nZXRXb3JrVHJlZSgpLCAiYSIpLCAiZmlyc3RcbiIKIAkJCQkJKyAiPDw8PDw8PCBtYXN0ZXJcbiIgKyAic2Vjb25kXG4iICsgInRoaXJkXG4iICsgIj09PT09PT1cbiIKLQkJCQkJKyAiPj4+Pj4+PiAiICsgc2Vjb25kQ29tbWl0LmdldElkKCkuYWJicmV2aWF0ZSg3KS5uYW1lKCkKKwkJCQkJKyAiPj4+Pj4+PiAiCisJCQkJCSsgc2Vjb25kQ29tbWl0LmdldElkKCkKKwkJCQkJCQkuYWJicmV2aWF0ZShPQkpFQ1RfSURfQUJCUkVWX1NUUklOR19MRU5HVEgpLm5hbWUoKQogCQkJCQkrICIgYWRkIHNlY29uZFxuIik7CiAJCQlJdGVyYXRvcjxSZXZDb21taXQ+IGhpc3RvcnkgPSBnaXQubG9nKCkuY2FsbCgpLml0ZXJhdG9yKCk7CiAJCQlSZXZDb21taXQgcmV2ZXJ0Q29tbWl0ID0gaGlzdG9yeS5uZXh0KCk7CkBAIC0yMzIsNyArMjM1LDcgQEAgcHVibGljIHZvaWQgdGVzdFJldmVydENvbmZsaWN0UmVzb2x1dGlvbigpIHRocm93cyBFeGNlcHRpb24gewogCQkJYXNzZXJ0VHJ1ZShuZXcgRmlsZShkYi5nZXREaXJlY3RvcnkoKSwgQ29uc3RhbnRzLk1FUkdFX01TRykuZXhpc3RzKCkpOwogCQkJYXNzZXJ0RXF1YWxzKCJSZXZlcnQgXCIiICsgc2lkZUNvbW1pdC5nZXRTaG9ydE1lc3NhZ2UoKQogCQkJCQkrICJcIlxuXG5UaGlzIHJldmVydHMgY29tbWl0ICIgKyBzaWRlQ29tbWl0LmdldElkKCkuZ2V0TmFtZSgpCi0JCQkJCSsgIi5cblxuQ29uZmxpY3RzOlxuXHRhXG4iLAorCQkJCQkrICIuXG5cbiMgQ29uZmxpY3RzOlxuI1x0YVxuIiwKIAkJCQkJZGIucmVhZE1lcmdlQ29tbWl0TXNnKCkpOwogCQkJYXNzZXJ0VHJ1ZShuZXcgRmlsZShkYi5nZXREaXJlY3RvcnkoKSwgQ29uc3RhbnRzLlJFVkVSVF9IRUFEKQogCQkJCQkuZXhpc3RzKCkpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9TdGF0dXNDb21tYW5kVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9TdGF0dXNDb21tYW5kVGVzdC5qYXZhCmluZGV4IDUzMTFlZGIuLjE5MjgxZjYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvU3RhdHVzQ29tbWFuZFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL1N0YXR1c0NvbW1hbmRUZXN0LmphdmEKQEAgLTIxLDggKzIxLDEwIEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzLk5vRmlsZXBhdHRlcm5FeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuTm9Xb3JrVHJlZUV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LlJlcG9zaXRvcnlUZXN0Q2FzZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZXBvc2l0b3J5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlNldHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLmZpbGUuRmlsZUJhc2VkQ29uZmlnOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5maWxlLkZpbGVSZXBvc2l0b3J5QnVpbGRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuRlM7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKQEAgLTE4MSw0ICsxODMsMzEgQEAgcHVibGljIHZvaWQgdGVzdEZvbGRlclByZWZpeCgpIHRocm93cyBFeGNlcHRpb24gewogCQl9CiAJfQogCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0TmVzdGVkQ29tbWl0dGVkR2l0UmVwb0FuZFBhdGhGaWx0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY29tbWl0RmlsZSgiZmlsZS50eHQiLCAiZmlsZSIsICJtYXN0ZXIiKTsKKwkJdHJ5IChSZXBvc2l0b3J5IGlubmVyID0gbmV3IEZpbGVSZXBvc2l0b3J5QnVpbGRlcigpCisJCQkJLnNldFdvcmtUcmVlKG5ldyBGaWxlKGRiLmdldFdvcmtUcmVlKCksICJzdWJnaXQiKSkuYnVpbGQoKSkgeworCQkJaW5uZXIuY3JlYXRlKCk7CisJCQl3cml0ZVRyYXNoRmlsZSgic3ViZ2l0L3N1Yi50eHQiLCAic3ViIik7CisJCQl0cnkgKEdpdCBvdXRlckdpdCA9IG5ldyBHaXQoZGIpOyBHaXQgaW5uZXJHaXQgPSBuZXcgR2l0KGlubmVyKSkgeworCQkJCWlubmVyR2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCJzdWIudHh0IikuY2FsbCgpOworCQkJCWlubmVyR2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoIklubmVyIGNvbW1pdCIpLmNhbGwoKTsKKwkJCQlvdXRlckdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybigic3ViZ2l0IikuY2FsbCgpOworCQkJCW91dGVyR2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoIk91dGVyIGNvbW1pdCIpLmNhbGwoKTsKKwkJCQlhc3NlcnRUcnVlKGlubmVyR2l0LnN0YXR1cygpLmNhbGwoKS5pc0NsZWFuKCkpOworCQkJCWFzc2VydFRydWUob3V0ZXJHaXQuc3RhdHVzKCkuY2FsbCgpLmlzQ2xlYW4oKSk7CisJCQkJd3JpdGVUcmFzaEZpbGUoInN1YmdpdC9zdWIudHh0IiwgInN1YjIiKTsKKwkJCQlhc3NlcnRGYWxzZShpbm5lckdpdC5zdGF0dXMoKS5jYWxsKCkuaXNDbGVhbigpKTsKKwkJCQlhc3NlcnRGYWxzZShvdXRlckdpdC5zdGF0dXMoKS5jYWxsKCkuaXNDbGVhbigpKTsKKwkJCQlhc3NlcnRUcnVlKAorCQkJCQkJb3V0ZXJHaXQuc3RhdHVzKCkuYWRkUGF0aCgiZmlsZS50eHQiKS5jYWxsKCkuaXNDbGVhbigpKTsKKwkJCQlhc3NlcnRUcnVlKG91dGVyR2l0LnN0YXR1cygpLmFkZFBhdGgoImRvZXNudGV4aXN0IikuY2FsbCgpCisJCQkJCQkuaXNDbGVhbigpKTsKKwkJCQlhc3NlcnRGYWxzZSgKKwkJCQkJCW91dGVyR2l0LnN0YXR1cygpLmFkZFBhdGgoInN1YmdpdCIpLmNhbGwoKS5pc0NsZWFuKCkpOworCQkJfQorCQl9CisJfQorCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvZ2l0cmVwby9CYXJlU3VwZXJwcm9qZWN0V3JpdGVyVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2dpdHJlcG8vQmFyZVN1cGVycHJvamVjdFdyaXRlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2I5Mzg3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2dpdHJlcG8vQmFyZVN1cGVycHJvamVjdFdyaXRlclRlc3QuamF2YQpAQCAtMCwwICsxLDEwNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSwgR29vZ2xlIEluYy4gYW5kIG90aGVycworICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5naXRyZXBvOworCitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVyQXNzZXJ0LmFzc2VydFRoYXQ7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVycy5jb250YWluc0luQW55T3JkZXI7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVycy5pczsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by5tb2NrOworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLndoZW47CisKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZ2l0cmVwby5CYXJlU3VwZXJwcm9qZWN0V3JpdGVyLkJhcmVXcml0ZXJDb25maWc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5naXRyZXBvLlJlcG9Db21tYW5kLlJlbW90ZVJlYWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LlJlcG9zaXRvcnlUZXN0Q2FzZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5PYmplY3RJZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5PYmplY3RSZWFkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2Q29tbWl0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitwdWJsaWMgY2xhc3MgQmFyZVN1cGVycHJvamVjdFdyaXRlclRlc3QgZXh0ZW5kcyBSZXBvc2l0b3J5VGVzdENhc2UgeworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNIQTFfQSA9ICJhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhIjsKKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXN1cGVyLnNldFVwKCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB3cml0ZV9zZXRHaXRNb2R1bGVzQ29udGVudHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdHJ5IChSZXBvc2l0b3J5IGJhcmVSZXBvID0gY3JlYXRlQmFyZVJlcG9zaXRvcnkoKSkgeworCQkJUmVwb1Byb2plY3QgcmVwb1Byb2plY3QgPSBuZXcgUmVwb1Byb2plY3QoInN1YnByb2plY3RYIiwgInBhdGgvdG8iLAorCQkJCQkicmVmcy9oZWFkcy9icmFuY2gteCIsICJyZW1vdGUiLCAiIik7CisJCQlyZXBvUHJvamVjdC5zZXRVcmwoImh0dHA6Ly9leGFtcGxlLmNvbS9hIik7CisKKwkJCVJlbW90ZVJlYWRlciBtb2NrUmVtb3RlUmVhZGVyID0gbW9jayhSZW1vdGVSZWFkZXIuY2xhc3MpOworCQkJd2hlbihtb2NrUmVtb3RlUmVhZGVyLnNoYTEoImh0dHA6Ly9leGFtcGxlLmNvbS9hIiwKKwkJCQkJInJlZnMvaGVhZHMvYnJhbmNoLXgiKSkKKwkJCQkJCQkudGhlblJldHVybihPYmplY3RJZC5mcm9tU3RyaW5nKFNIQTFfQSkpOworCisJCQlCYXJlU3VwZXJwcm9qZWN0V3JpdGVyIHcgPSBuZXcgQmFyZVN1cGVycHJvamVjdFdyaXRlcihiYXJlUmVwbywKKwkJCQkJbnVsbCwgInJlZnMvaGVhZHMvbWFzdGVyIiwgYXV0aG9yLCBtb2NrUmVtb3RlUmVhZGVyLAorCQkJCQlCYXJlV3JpdGVyQ29uZmlnLmdldERlZmF1bHQoKSwgTGlzdC5vZigpKTsKKworCQkJUmV2Q29tbWl0IGNvbW1pdCA9IHcud3JpdGUoQXJyYXlzLmFzTGlzdChyZXBvUHJvamVjdCkpOworCisJCQlTdHJpbmcgY29udGVudHMgPSByZWFkQ29udGVudHMoYmFyZVJlcG8sIGNvbW1pdCwgIi5naXRtb2R1bGVzIik7CisJCQlMaXN0PFN0cmluZz4gY29udGVudExpbmVzID0gQXJyYXlzCisJCQkJCS5hc0xpc3QoY29udGVudHMuc3BsaXQoIlxuIikpOworCQkJYXNzZXJ0VGhhdChjb250ZW50TGluZXMuZ2V0KDApLAorCQkJCQlpcygiW3N1Ym1vZHVsZSBcInN1YnByb2plY3RYXCJdIikpOworCQkJYXNzZXJ0VGhhdChjb250ZW50TGluZXMuc3ViTGlzdCgxLCBjb250ZW50TGluZXMuc2l6ZSgpKSwKKwkJCQkJY29udGFpbnNJbkFueU9yZGVyKGlzKCJcdGJyYW5jaCA9IHJlZnMvaGVhZHMvYnJhbmNoLXgiKSwKKwkJCQkJCQlpcygiXHRwYXRoID0gcGF0aC90byIpLAorCQkJCQkJCWlzKCJcdHVybCA9IGh0dHA6Ly9leGFtcGxlLmNvbS9hIikpKTsKKwkJfQorCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgd3JpdGVfc2V0RXh0cmFDb250ZW50cygpIHRocm93cyBFeGNlcHRpb24geworCQl0cnkgKFJlcG9zaXRvcnkgYmFyZVJlcG8gPSBjcmVhdGVCYXJlUmVwb3NpdG9yeSgpKSB7CisJCQlSZXBvUHJvamVjdCByZXBvUHJvamVjdCA9IG5ldyBSZXBvUHJvamVjdCgic3VicHJvamVjdFgiLCAicGF0aC90byIsCisJCQkJCSJyZWZzL2hlYWRzL2JyYW5jaC14IiwgInJlbW90ZSIsICIiKTsKKwkJCXJlcG9Qcm9qZWN0LnNldFVybCgiaHR0cDovL2V4YW1wbGUuY29tL2EiKTsKKworCQkJUmVtb3RlUmVhZGVyIG1vY2tSZW1vdGVSZWFkZXIgPSBtb2NrKFJlbW90ZVJlYWRlci5jbGFzcyk7CisJCQl3aGVuKG1vY2tSZW1vdGVSZWFkZXIuc2hhMSgiaHR0cDovL2V4YW1wbGUuY29tL2EiLAorCQkJCQkicmVmcy9oZWFkcy9icmFuY2gteCIpKQorCQkJCQkJCS50aGVuUmV0dXJuKE9iamVjdElkLmZyb21TdHJpbmcoU0hBMV9BKSk7CisKKwkJCUJhcmVTdXBlcnByb2plY3RXcml0ZXIgdyA9IG5ldyBCYXJlU3VwZXJwcm9qZWN0V3JpdGVyKGJhcmVSZXBvLAorCQkJCQludWxsLCAicmVmcy9oZWFkcy9tYXN0ZXIiLCBhdXRob3IsIG1vY2tSZW1vdGVSZWFkZXIsCisJCQkJCUJhcmVXcml0ZXJDb25maWcuZ2V0RGVmYXVsdCgpLAorCQkJCQlMaXN0Lm9mKG5ldyBCYXJlU3VwZXJwcm9qZWN0V3JpdGVyLkV4dHJhQ29udGVudCgieCIsCisJCQkJCQkJImV4dHJhLWNvbnRlbnQiKSkpOworCisJCQlSZXZDb21taXQgY29tbWl0ID0gdy53cml0ZShBcnJheXMuYXNMaXN0KHJlcG9Qcm9qZWN0KSk7CisKKwkJCVN0cmluZyBjb250ZW50cyA9IHJlYWRDb250ZW50cyhiYXJlUmVwbywgY29tbWl0LCAieCIpOworCQkJYXNzZXJ0VGhhdChjb250ZW50cywgaXMoImV4dHJhLWNvbnRlbnQiKSk7CisJCX0KKwl9CisKKwlwcml2YXRlIFN0cmluZyByZWFkQ29udGVudHMoUmVwb3NpdG9yeSByZXBvLCBSZXZDb21taXQgY29tbWl0LAorCQkJU3RyaW5nIHBhdGgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgaWRTdHIgPSBjb21taXQuZ2V0SWQoKS5uYW1lKCkgKyAiOiIgKyBwYXRoOworCQlPYmplY3RJZCBtb2RJZCA9IHJlcG8ucmVzb2x2ZShpZFN0cik7CisJCXRyeSAoT2JqZWN0UmVhZGVyIHJlYWRlciA9IHJlcG8ubmV3T2JqZWN0UmVhZGVyKCkpIHsKKwkJCXJldHVybiBuZXcgU3RyaW5nKAorCQkJCQlyZWFkZXIub3Blbihtb2RJZCkuZ2V0Q2FjaGVkQnl0ZXMoSW50ZWdlci5NQVhfVkFMVUUpLAorCQkJCQlTdGFuZGFyZENoYXJzZXRzLlVURl84KTsKKworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2dpdHJlcG8vUmVwb0NvbW1hbmRUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvZ2l0cmVwby9SZXBvQ29tbWFuZFRlc3QuamF2YQppbmRleCA1MDlhZGMyLi4zZTZkMTNhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvZ2l0cmVwby9SZXBvQ29tbWFuZFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvZ2l0cmVwby9SZXBvQ29tbWFuZFRlc3QuamF2YQpAQCAtMTUsNiArMTUsNyBAQAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzdW1lLmFzc3VtZVRydWU7CiAKIGltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CkBAIC01NDYsMjQgKzU0NywyOSBAQCBwdWJsaWMgdm9pZCB0ZXN0UmVwb01hbmlmZXN0Q29weUZpbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJLy8gVGhlIG9yaWdpbmFsIGZpbGUgc2hvdWxkIGV4aXN0CiAJCUZpbGUgaGVsbG8gPSBuZXcgRmlsZShsb2NhbERiLmdldFdvcmtUcmVlKCksICJmb28vaGVsbG8udHh0Iik7CiAJCWFzc2VydFRydWUoIlRoZSBvcmlnaW5hbCBmaWxlIHNob3VsZCBleGlzdCIsIGhlbGxvLmV4aXN0cygpKTsKLQkJYXNzZXJ0RmFsc2UoIlRoZSBvcmlnaW5hbCBmaWxlIHNob3VsZCBub3QgYmUgZXhlY3V0YWJsZSIsCi0JCQkJaGVsbG8uY2FuRXhlY3V0ZSgpKTsKKwkJaWYgKEZTLkRFVEVDVEVELnN1cHBvcnRzRXhlY3V0ZSgpKSB7CisJCQlhc3NlcnRGYWxzZSgiVGhlIG9yaWdpbmFsIGZpbGUgc2hvdWxkIG5vdCBiZSBleGVjdXRhYmxlIiwKKwkJCQkJRlMuREVURUNURUQuY2FuRXhlY3V0ZShoZWxsbykpOworCQl9CiAJCWFzc2VydENvbnRlbnRzKGhlbGxvLnRvUGF0aCgpLCAibWFzdGVyIHdvcmxkIik7CiAJCS8vIFRoZSBkZXN0IGZpbGUgc2hvdWxkIGFsc28gZXhpc3QKIAkJaGVsbG8gPSBuZXcgRmlsZShsb2NhbERiLmdldFdvcmtUcmVlKCksICJIZWxsbyIpOwogCQlhc3NlcnRUcnVlKCJUaGUgZGVzdGluYXRpb24gZmlsZSBzaG91bGQgZXhpc3QiLCBoZWxsby5leGlzdHMoKSk7Ci0JCWFzc2VydEZhbHNlKCJUaGUgZGVzdGluYXRpb24gZmlsZSBzaG91bGQgbm90IGJlIGV4ZWN1dGFibGUiLAotCQkJCWhlbGxvLmNhbkV4ZWN1dGUoKSk7CisJCWlmIChGUy5ERVRFQ1RFRC5zdXBwb3J0c0V4ZWN1dGUoKSkgeworCQkJYXNzZXJ0RmFsc2UoIlRoZSBkZXN0aW5hdGlvbiBmaWxlIHNob3VsZCBub3QgYmUgZXhlY3V0YWJsZSIsCisJCQkJCUZTLkRFVEVDVEVELmNhbkV4ZWN1dGUoaGVsbG8pKTsKKwkJfQogCQlhc3NlcnRDb250ZW50cyhoZWxsby50b1BhdGgoKSwgIm1hc3RlciB3b3JsZCIpOwogCX0KIAogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdFJlcG9NYW5pZmVzdENvcHlGaWxlX2V4ZWN1dGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJYXNzdW1lVHJ1ZShGUy5ERVRFQ1RFRC5zdXBwb3J0c0V4ZWN1dGUoKSk7CiAJCXRyeSAoR2l0IGdpdCA9IG5ldyBHaXQoZGVmYXVsdERiKSkgewogCQkJZ2l0LmNoZWNrb3V0KCkuc2V0TmFtZSgibWFzdGVyIikuY2FsbCgpOwogCQkJRmlsZSBmID0gSkdpdFRlc3RVdGlsLndyaXRlVHJhc2hGaWxlKGRlZmF1bHREYiwgImhlbGxvLnNoIiwKIAkJCQkJImNvbnRlbnQgb2YgdGhlIGV4ZWN1dGFibGUgZmlsZSIpOwotCQkJZi5zZXRFeGVjdXRhYmxlKHRydWUpOworCQkJRlMuREVURUNURUQuc2V0RXhlY3V0ZShmLCB0cnVlKTsKIAkJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybigiaGVsbG8uc2giKS5jYWxsKCk7CiAJCQlnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgiQWRkIGJpbmFyeSBmaWxlIikuY2FsbCgpOwogCQl9CkBAIC01ODgsNyArNTk0LDggQEAgcHVibGljIHZvaWQgdGVzdFJlcG9NYW5pZmVzdENvcHlGaWxlX2V4ZWN1dGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJLy8gVGhlIG9yaWdpbmFsIGZpbGUgc2hvdWxkIGV4aXN0IGFuZCBiZSBhbiBleGVjdXRhYmxlCiAJCUZpbGUgaGVsbG8gPSBuZXcgRmlsZShsb2NhbERiLmdldFdvcmtUcmVlKCksICJmb28vaGVsbG8uc2giKTsKIAkJYXNzZXJ0VHJ1ZSgiVGhlIG9yaWdpbmFsIGZpbGUgc2hvdWxkIGV4aXN0IiwgaGVsbG8uZXhpc3RzKCkpOwotCQlhc3NlcnRUcnVlKCJUaGUgb3JpZ2luYWwgZmlsZSBtdXN0IGJlIGV4ZWN1dGFibGUiLCBoZWxsby5jYW5FeGVjdXRlKCkpOworCQlhc3NlcnRUcnVlKCJUaGUgb3JpZ2luYWwgZmlsZSBtdXN0IGJlIGV4ZWN1dGFibGUiLAorCQkJCUZTLkRFVEVDVEVELmNhbkV4ZWN1dGUoaGVsbG8pKTsKIAkJdHJ5IChCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBGaWxlcy5uZXdCdWZmZXJlZFJlYWRlcihoZWxsby50b1BhdGgoKSwKIAkJCQlVVEZfOCkpIHsKIAkJCVN0cmluZyBjb250ZW50ID0gcmVhZGVyLnJlYWRMaW5lKCk7CkBAIC02MDAsNyArNjA3LDcgQEAgcHVibGljIHZvaWQgdGVzdFJlcG9NYW5pZmVzdENvcHlGaWxlX2V4ZWN1dGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJaGVsbG8gPSBuZXcgRmlsZShsb2NhbERiLmdldFdvcmtUcmVlKCksICJjb3B5LWhlbGxvLnNoIik7CiAJCWFzc2VydFRydWUoIlRoZSBkZXN0aW5hdGlvbiBmaWxlIHNob3VsZCBleGlzdCIsIGhlbGxvLmV4aXN0cygpKTsKIAkJYXNzZXJ0VHJ1ZSgiVGhlIGRlc3RpbmF0aW9uIGZpbGUgbXVzdCBiZSBleGVjdXRhYmxlIiwKLQkJCQloZWxsby5jYW5FeGVjdXRlKCkpOworCQkJCUZTLkRFVEVDVEVELmNhbkV4ZWN1dGUoaGVsbG8pKTsKIAkJdHJ5IChCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBGaWxlcy5uZXdCdWZmZXJlZFJlYWRlcihoZWxsby50b1BhdGgoKSwKIAkJCQlVVEZfOCkpIHsKIAkJCVN0cmluZyBjb250ZW50ID0gcmVhZGVyLnJlYWRMaW5lKCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvZGlmZm1lcmdldG9vbC9FeHRlcm5hbERpZmZUb29sVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL2RpZmZtZXJnZXRvb2wvRXh0ZXJuYWxEaWZmVG9vbFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWViZWM3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL2RpZmZtZXJnZXRvb2wvRXh0ZXJuYWxEaWZmVG9vbFRlc3QuamF2YQpAQCAtMCwwICsxLDE1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMC0yMDIxLCBTaW1lb24gQW5kcmVldiA8c2ltZW9uLmRhbmFpbG92LmFuZHJlZXZAZ21haWwuY29tPiBhbmQgb3RoZXJzLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5kaWZmbWVyZ2V0b29sOworCitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbmZpZ0NvbnN0YW50cy5DT05GSUdfRElGRlRPT0xfU0VDVElPTjsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19LRVlfQ01EOworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWdDb25zdGFudHMuQ09ORklHX0tFWV9HVUlUT09MOworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWdDb25zdGFudHMuQ09ORklHX0tFWV9QQVRIOworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWdDb25zdGFudHMuQ09ORklHX0tFWV9QUk9NUFQ7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbmZpZ0NvbnN0YW50cy5DT05GSUdfS0VZX1RSVVNUX0VYSVRfQ09ERTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5pbnRlcm5hbC5Cb29sZWFuVHJpU3RhdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLmZpbGUuRmlsZUJhc2VkQ29uZmlnOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisvKioKKyAqIFRlc3RpbmcgZXh0ZXJuYWwgZGlmZiB0b29scy4KKyAqLworcHVibGljIGNsYXNzIEV4dGVybmFsRGlmZlRvb2xUZXN0IGV4dGVuZHMgRXh0ZXJuYWxUb29sVGVzdENhc2UgeworCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0VG9vbE5hbWVzKCkgeworCQlEaWZmVG9vbHMgbWFuYWdlciA9IG5ldyBEaWZmVG9vbHMoZGIpOworCQlTZXQ8U3RyaW5nPiBhY3R1YWxUb29sTmFtZXMgPSBtYW5hZ2VyLmdldFRvb2xOYW1lcygpOworCQlTZXQ8U3RyaW5nPiBleHBlY3RlZFRvb2xOYW1lcyA9IENvbGxlY3Rpb25zLmVtcHR5U2V0KCk7CisJCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IHNldCBvZiBleHRlcm5hbCBkaWZmIHRvb2wgbmFtZXMiLAorCQkJCWV4cGVjdGVkVG9vbE5hbWVzLCBhY3R1YWxUb29sTmFtZXMpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEFsbFRvb2xzKCkgeworCQlEaWZmVG9vbHMgbWFuYWdlciA9IG5ldyBEaWZmVG9vbHMoZGIpOworCQlTZXQ8U3RyaW5nPiBhY3R1YWxUb29sTmFtZXMgPSBtYW5hZ2VyLmdldEF2YWlsYWJsZVRvb2xzKCkua2V5U2V0KCk7CisJCVNldDxTdHJpbmc+IGV4cGVjdGVkVG9vbE5hbWVzID0gbmV3IExpbmtlZEhhc2hTZXQ8PigpOworCQlDb21tYW5kTGluZURpZmZUb29sW10gZGVmYXVsdFRvb2xzID0gQ29tbWFuZExpbmVEaWZmVG9vbC52YWx1ZXMoKTsKKwkJZm9yIChDb21tYW5kTGluZURpZmZUb29sIGRlZmF1bHRUb29sIDogZGVmYXVsdFRvb2xzKSB7CisJCQlTdHJpbmcgdG9vbE5hbWUgPSBkZWZhdWx0VG9vbC5uYW1lKCk7CisJCQlleHBlY3RlZFRvb2xOYW1lcy5hZGQodG9vbE5hbWUpOworCQl9CisJCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IHNldCBvZiBleHRlcm5hbCBkaWZmIHRvb2xzIiwgZXhwZWN0ZWRUb29sTmFtZXMsCisJCQkJYWN0dWFsVG9vbE5hbWVzKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RPdmVycmlkZVByZWRlZmluZWRUb29sUGF0aCgpIHsKKwkJU3RyaW5nIHRvb2xOYW1lID0gQ29tbWFuZExpbmVEaWZmVG9vbC5ndWlmZnkubmFtZSgpOworCQlTdHJpbmcgY3VzdG9tVG9vbFBhdGggPSAiL3Vzci9iaW4vZWNobyI7CisKKwkJRmlsZUJhc2VkQ29uZmlnIGNvbmZpZyA9IGRiLmdldENvbmZpZygpOworCQljb25maWcuc2V0U3RyaW5nKENPTkZJR19ESUZGVE9PTF9TRUNUSU9OLCB0b29sTmFtZSwgQ09ORklHX0tFWV9DTUQsCisJCQkJImVjaG8iKTsKKwkJY29uZmlnLnNldFN0cmluZyhDT05GSUdfRElGRlRPT0xfU0VDVElPTiwgdG9vbE5hbWUsIENPTkZJR19LRVlfUEFUSCwKKwkJCQljdXN0b21Ub29sUGF0aCk7CisKKwkJRGlmZlRvb2xzIG1hbmFnZXIgPSBuZXcgRGlmZlRvb2xzKGRiKTsKKwkJTWFwPFN0cmluZywgRXh0ZXJuYWxEaWZmVG9vbD4gdG9vbHMgPSBtYW5hZ2VyLmdldFVzZXJEZWZpbmVkVG9vbHMoKTsKKwkJRXh0ZXJuYWxEaWZmVG9vbCBkaWZmVG9vbCA9IHRvb2xzLmdldCh0b29sTmFtZSk7CisJCWFzc2VydE5vdE51bGwoIkV4cGVjdGVkIHRvb2wgXCIiICsgdG9vbE5hbWUgKyAiXCIgdG8gYmUgdXNlciBkZWZpbmVkIiwKKwkJCQlkaWZmVG9vbCk7CisKKwkJU3RyaW5nIHRvb2xQYXRoID0gZGlmZlRvb2wuZ2V0UGF0aCgpOworCQlhc3NlcnRFcXVhbHMoIkV4cGVjdGVkIGV4dGVybmFsIGRpZmYgdG9vbCB0byBoYXZlIGFuIG92ZXJyaWRlbiBwYXRoIiwKKwkJCQljdXN0b21Ub29sUGF0aCwgdG9vbFBhdGgpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFVzZXJEZWZpbmVkVG9vbHMoKSB7CisJCUZpbGVCYXNlZENvbmZpZyBjb25maWcgPSBkYi5nZXRDb25maWcoKTsKKwkJU3RyaW5nIGN1c3RvbVRvb2xuYW1lID0gImN1c3RvbVRvb2wiOworCQljb25maWcuc2V0U3RyaW5nKENPTkZJR19ESUZGVE9PTF9TRUNUSU9OLCBjdXN0b21Ub29sbmFtZSwKKwkJCQlDT05GSUdfS0VZX0NNRCwgImVjaG8iKTsKKwkJY29uZmlnLnNldFN0cmluZyhDT05GSUdfRElGRlRPT0xfU0VDVElPTiwgY3VzdG9tVG9vbG5hbWUsCisJCQkJQ09ORklHX0tFWV9QQVRILCAiL3Vzci9iaW4vZWNobyIpOworCQljb25maWcuc2V0U3RyaW5nKENPTkZJR19ESUZGVE9PTF9TRUNUSU9OLCBjdXN0b21Ub29sbmFtZSwKKwkJCQlDT05GSUdfS0VZX1BST01QVCwgIi0tbm8tcHJvbXB0Iik7CisJCWNvbmZpZy5zZXRTdHJpbmcoQ09ORklHX0RJRkZUT09MX1NFQ1RJT04sIGN1c3RvbVRvb2xuYW1lLAorCQkJCUNPTkZJR19LRVlfR1VJVE9PTCwgIi0tbm8tZ3VpIik7CisJCWNvbmZpZy5zZXRTdHJpbmcoQ09ORklHX0RJRkZUT09MX1NFQ1RJT04sIGN1c3RvbVRvb2xuYW1lLAorCQkJCUNPTkZJR19LRVlfVFJVU1RfRVhJVF9DT0RFLCAiLS1uby10cnVzdC1leGl0LWNvZGUiKTsKKwkJRGlmZlRvb2xzIG1hbmFnZXIgPSBuZXcgRGlmZlRvb2xzKGRiKTsKKwkJU2V0PFN0cmluZz4gYWN0dWFsVG9vbE5hbWVzID0gbWFuYWdlci5nZXRVc2VyRGVmaW5lZFRvb2xzKCkua2V5U2V0KCk7CisJCVNldDxTdHJpbmc+IGV4cGVjdGVkVG9vbE5hbWVzID0gbmV3IExpbmtlZEhhc2hTZXQ8PigpOworCQlleHBlY3RlZFRvb2xOYW1lcy5hZGQoY3VzdG9tVG9vbG5hbWUpOworCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBzZXQgb2YgZXh0ZXJuYWwgZGlmZiB0b29scyIsIGV4cGVjdGVkVG9vbE5hbWVzLAorCQkJCWFjdHVhbFRvb2xOYW1lcyk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0Tm90QXZhaWxhYmxlVG9vbHMoKSB7CisJCURpZmZUb29scyBtYW5hZ2VyID0gbmV3IERpZmZUb29scyhkYik7CisJCVNldDxTdHJpbmc+IGFjdHVhbFRvb2xOYW1lcyA9IG1hbmFnZXIuZ2V0Tm90QXZhaWxhYmxlVG9vbHMoKS5rZXlTZXQoKTsKKwkJU2V0PFN0cmluZz4gZXhwZWN0ZWRUb29sTmFtZXMgPSBDb2xsZWN0aW9ucy5lbXB0eVNldCgpOworCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBzZXQgb2Ygbm90IGF2YWlsYWJsZSBleHRlcm5hbCBkaWZmIHRvb2xzIiwKKwkJCQlleHBlY3RlZFRvb2xOYW1lcywgYWN0dWFsVG9vbE5hbWVzKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RDb21wYXJlKCkgeworCQlEaWZmVG9vbHMgbWFuYWdlciA9IG5ldyBEaWZmVG9vbHMoZGIpOworCisJCVN0cmluZyBuZXdQYXRoID0gIiI7CisJCVN0cmluZyBvbGRQYXRoID0gIiI7CisJCVN0cmluZyBuZXdJZCA9ICIiOworCQlTdHJpbmcgb2xkSWQgPSAiIjsKKwkJU3RyaW5nIHRvb2xOYW1lID0gIiI7CisJCUJvb2xlYW5UcmlTdGF0ZSBwcm9tcHQgPSBCb29sZWFuVHJpU3RhdGUuVU5TRVQ7CisJCUJvb2xlYW5UcmlTdGF0ZSBndWkgPSBCb29sZWFuVHJpU3RhdGUuVU5TRVQ7CisJCUJvb2xlYW5UcmlTdGF0ZSB0cnVzdEV4aXRDb2RlID0gQm9vbGVhblRyaVN0YXRlLlVOU0VUOworCisJCWludCBleHBlY3RlZENvbXBhcmVSZXN1bHQgPSAwOworCQlpbnQgY29tcGFyZVJlc3VsdCA9IG1hbmFnZXIuY29tcGFyZShuZXdQYXRoLCBvbGRQYXRoLCBuZXdJZCwgb2xkSWQsCisJCQkJdG9vbE5hbWUsIHByb21wdCwgZ3VpLCB0cnVzdEV4aXRDb2RlKTsKKwkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgY29tcGFyZSByZXN1bHQgZm9yIGV4dGVybmFsIGRpZmYgdG9vbCIsCisJCQkJZXhwZWN0ZWRDb21wYXJlUmVzdWx0LCBjb21wYXJlUmVzdWx0KTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0VG9vbCgpIHRocm93cyBFeGNlcHRpb24geworCQlGaWxlQmFzZWRDb25maWcgY29uZmlnID0gZGIuZ2V0Q29uZmlnKCk7CisJCS8vIHRoZSBkZWZhdWx0IGRpZmYgdG9vbCBpcyBjb25maWd1cmVkIHdpdGhvdXQgYSBzdWJzZWN0aW9uCisJCVN0cmluZyBzdWJzZWN0aW9uID0gbnVsbDsKKwkJY29uZmlnLnNldFN0cmluZygiZGlmZiIsIHN1YnNlY3Rpb24sICJ0b29sIiwgImN1c3RvbVRvb2wiKTsKKworCQlEaWZmVG9vbHMgbWFuYWdlciA9IG5ldyBEaWZmVG9vbHMoZGIpOworCQlCb29sZWFuVHJpU3RhdGUgZ3VpID0gQm9vbGVhblRyaVN0YXRlLlVOU0VUOworCQlTdHJpbmcgZGVmYXVsdFRvb2xOYW1lID0gbWFuYWdlci5nZXREZWZhdWx0VG9vbE5hbWUoZ3VpKTsKKwkJYXNzZXJ0RXF1YWxzKAorCQkJCSJFeHBlY3RlZCBjb25maWd1cmVkIGRpZmZ0b29sIHRvIGJlIHRoZSBkZWZhdWx0IGV4dGVybmFsIGRpZmYgdG9vbCIsCisJCQkJIm15X2RlZmF1bHRfdG9vbG5hbWUiLCBkZWZhdWx0VG9vbE5hbWUpOworCisJCWd1aSA9IEJvb2xlYW5UcmlTdGF0ZS5UUlVFOworCQlTdHJpbmcgZGVmYXVsdEd1aVRvb2xOYW1lID0gbWFuYWdlci5nZXREZWZhdWx0VG9vbE5hbWUoZ3VpKTsKKwkJYXNzZXJ0RXF1YWxzKAorCQkJCSJFeHBlY3RlZCBjb25maWd1cmVkIGRpZmZ0b29sIHRvIGJlIHRoZSBkZWZhdWx0IGV4dGVybmFsIGRpZmYgdG9vbCIsCisJCQkJIm15X2d1aV90b29sIiwgZGVmYXVsdEd1aVRvb2xOYW1lKTsKKworCQljb25maWcuc2V0U3RyaW5nKCJkaWZmIiwgc3Vic2VjdGlvbiwgImd1aXRvb2wiLCAiY3VzdG9tR3VpVG9vbCIpOworCQltYW5hZ2VyID0gbmV3IERpZmZUb29scyhkYik7CisJCWRlZmF1bHRHdWlUb29sTmFtZSA9IG1hbmFnZXIuZ2V0RGVmYXVsdFRvb2xOYW1lKGd1aSk7CisJCWFzc2VydEVxdWFscygKKwkJCQkiRXhwZWN0ZWQgY29uZmlndXJlZCBkaWZmdG9vbCB0byBiZSB0aGUgZGVmYXVsdCBleHRlcm5hbCBkaWZmIGd1aXRvb2wiLAorCQkJCSJteV9ndWlfdG9vbCIsIGRlZmF1bHRHdWlUb29sTmFtZSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL2RpZmZtZXJnZXRvb2wvRXh0ZXJuYWxUb29sVGVzdENhc2UuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9kaWZmbWVyZ2V0b29sL0V4dGVybmFsVG9vbFRlc3RDYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNjMTI5NwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9kaWZmbWVyZ2V0b29sL0V4dGVybmFsVG9vbFRlc3RDYXNlLmphdmEKQEAgLTAsMCArMSw3NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMC0yMDIxLCBTaW1lb24gQW5kcmVldiA8c2ltZW9uLmRhbmFpbG92LmFuZHJlZXZAZ21haWwuY29tPiBhbmQgb3RoZXJzLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5kaWZmbWVyZ2V0b29sOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LlJlcG9zaXRvcnlUZXN0Q2FzZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuRlM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLkZTX1BPU0lYOworaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKK2ltcG9ydCBvcmcuanVuaXQuQXNzdW1lOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CisKKy8qKgorICogQmFzZSB0ZXN0IGNhc2UgZm9yIGV4dGVybmFsIG1lcmdlIGFuZCBkaWZmIHRvb2wgdGVzdHMuCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBFeHRlcm5hbFRvb2xUZXN0Q2FzZSBleHRlbmRzIFJlcG9zaXRvcnlUZXN0Q2FzZSB7CisKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0NPTlRFTlQgPSAibGluZTEiOworCisJcHJvdGVjdGVkIEZpbGUgbG9jYWxGaWxlOworCisJcHJvdGVjdGVkIEZpbGUgcmVtb3RlRmlsZTsKKworCXByb3RlY3RlZCBGaWxlIG1lcmdlZEZpbGU7CisKKwlwcm90ZWN0ZWQgRmlsZSBiYXNlRmlsZTsKKworCXByb3RlY3RlZCBGaWxlIGNvbW1hbmRSZXN1bHQ7CisKKwlAQmVmb3JlCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc3VwZXIuc2V0VXAoKTsKKworCQlsb2NhbEZpbGUgPSB3cml0ZVRyYXNoRmlsZSgibG9jYWxGaWxlLnR4dCIsIERFRkFVTFRfQ09OVEVOVCArICJcbiIpOworCQlsb2NhbEZpbGUuZGVsZXRlT25FeGl0KCk7CisJCXJlbW90ZUZpbGUgPSB3cml0ZVRyYXNoRmlsZSgicmVtb3RlRmlsZS50eHQiLCBERUZBVUxUX0NPTlRFTlQgKyAiXG4iKTsKKwkJcmVtb3RlRmlsZS5kZWxldGVPbkV4aXQoKTsKKwkJbWVyZ2VkRmlsZSA9IHdyaXRlVHJhc2hGaWxlKCJtZXJnZWRGaWxlLnR4dCIsICIiKTsKKwkJbWVyZ2VkRmlsZS5kZWxldGVPbkV4aXQoKTsKKwkJYmFzZUZpbGUgPSB3cml0ZVRyYXNoRmlsZSgiYmFzZUZpbGUudHh0IiwgIiIpOworCQliYXNlRmlsZS5kZWxldGVPbkV4aXQoKTsKKwkJY29tbWFuZFJlc3VsdCA9IHdyaXRlVHJhc2hGaWxlKCJjb21tYW5kUmVzdWx0LnR4dCIsICIiKTsKKwkJY29tbWFuZFJlc3VsdC5kZWxldGVPbkV4aXQoKTsKKwl9CisKKwlAQWZ0ZXIKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworCQlGaWxlcy5kZWxldGUobG9jYWxGaWxlLnRvUGF0aCgpKTsKKwkJRmlsZXMuZGVsZXRlKHJlbW90ZUZpbGUudG9QYXRoKCkpOworCQlGaWxlcy5kZWxldGUobWVyZ2VkRmlsZS50b1BhdGgoKSk7CisJCUZpbGVzLmRlbGV0ZShiYXNlRmlsZS50b1BhdGgoKSk7CisJCUZpbGVzLmRlbGV0ZShjb21tYW5kUmVzdWx0LnRvUGF0aCgpKTsKKworCQlzdXBlci50ZWFyRG93bigpOworCX0KKworCisJcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGFzc3VtZVBvc2l4UGxhdGZvcm0oKSB7CisJCUFzc3VtZS5hc3N1bWVUcnVlKAorCQkJCSJUaGlzIHRlc3QgY2FuIHJ1biBvbmx5IGluIExpbnV4IHRlc3RzIiwKKwkJCQlGUy5ERVRFQ1RFRCBpbnN0YW5jZW9mIEZTX1BPU0lYKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzQmxvY2tDYWNoZVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNCbG9ja0NhY2hlVGVzdC5qYXZhCmluZGV4IDRmMTMxNDAuLmFiNTg4Y2IgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNCbG9ja0NhY2hlVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNCbG9ja0NhY2hlVGVzdC5qYXZhCkBAIC0xNSwxNiArMTUsMTkgQEAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIAoraW1wb3J0IGphdmEudGltZS5EdXJhdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyOwogaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uTG9uZ1N0cmVhbTsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5DYWxsYWJsZTsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvclNlcnZpY2U7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JzOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmRmcy5EZnNCbG9ja0NhY2hlQ29uZmlnLkluZGV4RXZlbnRDb25zdW1lcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UucGFjay5QYWNrRXh0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuanVuaXQuVGVzdFJlcG9zaXRvcnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5UZXN0Um5nOwpAQCAtMTU0LDYgKzE1NywxMTkgQEAgcHVibGljIHZvaWQgaGFzQ2FjaGVIb3RNYXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAogCUBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpCiAJQFRlc3QKKwlwdWJsaWMgdm9pZCBoYXNJbmRleEV2ZW50Q29uc3VtZXJPbmx5TG9hZGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUF0b21pY0ludGVnZXIgbG9hZGVkID0gbmV3IEF0b21pY0ludGVnZXIoKTsKKwkJSW5kZXhFdmVudENvbnN1bWVyIGluZGV4RXZlbnRDb25zdW1lciA9IG5ldyBJbmRleEV2ZW50Q29uc3VtZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFjY2VwdFJlcXVlc3RlZEV2ZW50KGludCBwYWNrRXh0UG9zLCBib29sZWFuIGNhY2hlSGl0LAorCQkJCQlsb25nIGxvYWRNaWNyb3MsIGxvbmcgYnl0ZXMsCisJCQkJCUR1cmF0aW9uIGxhc3RFdmljdGlvbkR1cmF0aW9uKSB7CisJCQkJYXNzZXJ0RXF1YWxzKFBhY2tFeHQuSU5ERVguZ2V0UG9zaXRpb24oKSwgcGFja0V4dFBvcyk7CisJCQkJYXNzZXJ0VHJ1ZShjYWNoZUhpdCk7CisJCQkJYXNzZXJ0VHJ1ZShsYXN0RXZpY3Rpb25EdXJhdGlvbi5pc1plcm8oKSk7CisJCQkJbG9hZGVkLmluY3JlbWVudEFuZEdldCgpOworCQkJfQorCQl9OworCisJCURmc0Jsb2NrQ2FjaGUucmVjb25maWd1cmUobmV3IERmc0Jsb2NrQ2FjaGVDb25maWcoKS5zZXRCbG9ja1NpemUoNTEyKQorCQkJCS5zZXRCbG9ja0xpbWl0KDUxMiAqIDQpCisJCQkJLnNldEluZGV4RXZlbnRDb25zdW1lcihpbmRleEV2ZW50Q29uc3VtZXIpKTsKKwkJY2FjaGUgPSBEZnNCbG9ja0NhY2hlLmdldEluc3RhbmNlKCk7CisKKwkJRGZzUmVwb3NpdG9yeURlc2NyaXB0aW9uIHJlcG8gPSBuZXcgRGZzUmVwb3NpdG9yeURlc2NyaXB0aW9uKCJ0ZXN0Iik7CisJCUluTWVtb3J5UmVwb3NpdG9yeSByMSA9IG5ldyBJbk1lbW9yeVJlcG9zaXRvcnkocmVwbyk7CisJCWJ5dGVbXSBjb250ZW50ID0gcm5nLm5leHRCeXRlcyg0MjQyNDIpOworCQlPYmplY3RJZCBpZDsKKwkJdHJ5IChPYmplY3RJbnNlcnRlciBpbnMgPSByMS5uZXdPYmplY3RJbnNlcnRlcigpKSB7CisJCQlpZCA9IGlucy5pbnNlcnQoT0JKX0JMT0IsIGNvbnRlbnQpOworCQkJaW5zLmZsdXNoKCk7CisJCX0KKworCQl0cnkgKE9iamVjdFJlYWRlciByZHIgPSByMS5uZXdPYmplY3RSZWFkZXIoKSkgeworCQkJYnl0ZVtdIGFjdHVhbCA9IHJkci5vcGVuKGlkLCBPQkpfQkxPQikuZ2V0Qnl0ZXMoKTsKKwkJCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhjb250ZW50LCBhY3R1YWwpKTsKKwkJfQorCQkvLyBBbGwgY2FjaGUgZW50cmllcyBhcmUgaG90IGFuZCBjYWNoZSBpcyBhdCBjYXBhY2l0eS4KKwkJYXNzZXJ0VHJ1ZShMb25nU3RyZWFtLm9mKGNhY2hlLmdldEhpdENvdW50KCkpLnN1bSgpID4gMCk7CisJCWFzc2VydEVxdWFscyg5OSwgY2FjaGUuZ2V0RmlsbFBlcmNlbnRhZ2UoKSk7CisKKwkJSW5NZW1vcnlSZXBvc2l0b3J5IHIyID0gbmV3IEluTWVtb3J5UmVwb3NpdG9yeShyZXBvKTsKKwkJY29udGVudCA9IHJuZy5uZXh0Qnl0ZXMoNDI0MjQyKTsKKwkJdHJ5IChPYmplY3RJbnNlcnRlciBpbnMgPSByMi5uZXdPYmplY3RJbnNlcnRlcigpKSB7CisJCQlpbnMuaW5zZXJ0KE9CSl9CTE9CLCBjb250ZW50KTsKKwkJCWlucy5mbHVzaCgpOworCQl9CisJCWFzc2VydFRydWUoY2FjaGUuZ2V0RXZpY3Rpb25zKClbUGFja0V4dC5QQUNLLmdldFBvc2l0aW9uKCldID4gMCk7CisJCWFzc2VydEVxdWFscygxLCBjYWNoZS5nZXRFdmljdGlvbnMoKVtQYWNrRXh0LklOREVYLmdldFBvc2l0aW9uKCldKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIGxvYWRlZC5nZXQoKSk7CisJfQorCisJQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGhhc0luZGV4RXZlbnRDb25zdW1lckxvYWRlZEFuZEV2aWN0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJQXRvbWljSW50ZWdlciBsb2FkZWQgPSBuZXcgQXRvbWljSW50ZWdlcigpOworCQlBdG9taWNJbnRlZ2VyIGV2aWN0ZWQgPSBuZXcgQXRvbWljSW50ZWdlcigpOworCQlJbmRleEV2ZW50Q29uc3VtZXIgaW5kZXhFdmVudENvbnN1bWVyID0gbmV3IEluZGV4RXZlbnRDb25zdW1lcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYWNjZXB0UmVxdWVzdGVkRXZlbnQoaW50IHBhY2tFeHRQb3MsIGJvb2xlYW4gY2FjaGVIaXQsCisJCQkJCWxvbmcgbG9hZE1pY3JvcywgbG9uZyBieXRlcywKKwkJCQkJRHVyYXRpb24gbGFzdEV2aWN0aW9uRHVyYXRpb24pIHsKKwkJCQlhc3NlcnRFcXVhbHMoUGFja0V4dC5JTkRFWC5nZXRQb3NpdGlvbigpLCBwYWNrRXh0UG9zKTsKKwkJCQlhc3NlcnRUcnVlKGNhY2hlSGl0KTsKKwkJCQlhc3NlcnRUcnVlKGxhc3RFdmljdGlvbkR1cmF0aW9uLmlzWmVybygpKTsKKwkJCQlsb2FkZWQuaW5jcmVtZW50QW5kR2V0KCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYWNjZXB0RXZpY3RlZEV2ZW50KGludCBwYWNrRXh0UG9zLCBsb25nIGJ5dGVzLAorCQkJCQlpbnQgdG90YWxDYWNoZUhpdENvdW50LCBEdXJhdGlvbiBsYXN0RXZpY3Rpb25EdXJhdGlvbikgeworCQkJCWFzc2VydEVxdWFscyhQYWNrRXh0LklOREVYLmdldFBvc2l0aW9uKCksIHBhY2tFeHRQb3MpOworCQkJCWFzc2VydFRydWUodG90YWxDYWNoZUhpdENvdW50ID4gMCk7CisJCQkJYXNzZXJ0VHJ1ZShsYXN0RXZpY3Rpb25EdXJhdGlvbi5pc1plcm8oKSk7CisJCQkJZXZpY3RlZC5pbmNyZW1lbnRBbmRHZXQoKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgYm9vbGVhbiBzaG91bGRSZXBvcnRFdmljdGVkRXZlbnQoKSB7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCX07CisKKwkJRGZzQmxvY2tDYWNoZS5yZWNvbmZpZ3VyZShuZXcgRGZzQmxvY2tDYWNoZUNvbmZpZygpLnNldEJsb2NrU2l6ZSg1MTIpCisJCQkJLnNldEJsb2NrTGltaXQoNTEyICogNCkKKwkJCQkuc2V0SW5kZXhFdmVudENvbnN1bWVyKGluZGV4RXZlbnRDb25zdW1lcikpOworCQljYWNoZSA9IERmc0Jsb2NrQ2FjaGUuZ2V0SW5zdGFuY2UoKTsKKworCQlEZnNSZXBvc2l0b3J5RGVzY3JpcHRpb24gcmVwbyA9IG5ldyBEZnNSZXBvc2l0b3J5RGVzY3JpcHRpb24oInRlc3QiKTsKKwkJSW5NZW1vcnlSZXBvc2l0b3J5IHIxID0gbmV3IEluTWVtb3J5UmVwb3NpdG9yeShyZXBvKTsKKwkJYnl0ZVtdIGNvbnRlbnQgPSBybmcubmV4dEJ5dGVzKDQyNDI0Mik7CisJCU9iamVjdElkIGlkOworCQl0cnkgKE9iamVjdEluc2VydGVyIGlucyA9IHIxLm5ld09iamVjdEluc2VydGVyKCkpIHsKKwkJCWlkID0gaW5zLmluc2VydChPQkpfQkxPQiwgY29udGVudCk7CisJCQlpbnMuZmx1c2goKTsKKwkJfQorCisJCXRyeSAoT2JqZWN0UmVhZGVyIHJkciA9IHIxLm5ld09iamVjdFJlYWRlcigpKSB7CisJCQlieXRlW10gYWN0dWFsID0gcmRyLm9wZW4oaWQsIE9CSl9CTE9CKS5nZXRCeXRlcygpOworCQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGNvbnRlbnQsIGFjdHVhbCkpOworCQl9CisJCS8vIEFsbCBjYWNoZSBlbnRyaWVzIGFyZSBob3QgYW5kIGNhY2hlIGlzIGF0IGNhcGFjaXR5LgorCQlhc3NlcnRUcnVlKExvbmdTdHJlYW0ub2YoY2FjaGUuZ2V0SGl0Q291bnQoKSkuc3VtKCkgPiAwKTsKKwkJYXNzZXJ0RXF1YWxzKDk5LCBjYWNoZS5nZXRGaWxsUGVyY2VudGFnZSgpKTsKKworCQlJbk1lbW9yeVJlcG9zaXRvcnkgcjIgPSBuZXcgSW5NZW1vcnlSZXBvc2l0b3J5KHJlcG8pOworCQljb250ZW50ID0gcm5nLm5leHRCeXRlcyg0MjQyNDIpOworCQl0cnkgKE9iamVjdEluc2VydGVyIGlucyA9IHIyLm5ld09iamVjdEluc2VydGVyKCkpIHsKKwkJCWlucy5pbnNlcnQoT0JKX0JMT0IsIGNvbnRlbnQpOworCQkJaW5zLmZsdXNoKCk7CisJCX0KKwkJYXNzZXJ0VHJ1ZShjYWNoZS5nZXRFdmljdGlvbnMoKVtQYWNrRXh0LlBBQ0suZ2V0UG9zaXRpb24oKV0gPiAwKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIGNhY2hlLmdldEV2aWN0aW9ucygpW1BhY2tFeHQuSU5ERVguZ2V0UG9zaXRpb24oKV0pOworCQlhc3NlcnRFcXVhbHMoMSwgbG9hZGVkLmdldCgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIGV2aWN0ZWQuZ2V0KCkpOworCX0KKworCUBUZXN0CiAJcHVibGljIHZvaWQgbm9Db25jdXJyZW5jeVNlcmlhbGl6ZWRSZWFkc19vbmVSZXBvKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCUluTWVtb3J5UmVwb3NpdG9yeSByMSA9IGNyZWF0ZVJlcG9XaXRoQml0bWFwKCJ0ZXN0Iik7CiAJCS8vIFJlc2V0IGNhY2hlIHdpdGggY29uY3VycmVuY3kgTGV2ZWwgYXQgMSBpLmUuIG5vIGNvbmN1cnJlbmN5LgpAQCAtMjY3LDcgKzM4Myw2IEBAIHB1YmxpYyB2b2lkIGxvd0NvbmN1cnJlbmN5UGFyYWxsZWxSZWFkc190d29SZXBvc0FuZEluZGV4KCkKIAkJYXNzZXJ0RXF1YWxzKDIsIGNhY2hlLmdldE1pc3NDb3VudCgpWzBdKTsKIAl9CiAKLQlAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKQogCUBUZXN0CiAJcHVibGljIHZvaWQgaGlnaENvbmN1cnJlbmN5UGFyYWxsZWxSZWFkc19vbmVSZXBvKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCUluTWVtb3J5UmVwb3NpdG9yeSByMSA9IGNyZWF0ZVJlcG9XaXRoQml0bWFwKCJ0ZXN0Iik7CkBAIC0yOTAsNiArNDA1LDMwIEBAIHB1YmxpYyB2b2lkIGhpZ2hDb25jdXJyZW5jeVBhcmFsbGVsUmVhZHNfb25lUmVwbygpIHRocm93cyBFeGNlcHRpb24gewogCQlhc3NlcnRFcXVhbHMoMSwgY2FjaGUuZ2V0TWlzc0NvdW50KClbMF0pOwogCX0KIAorCUBUZXN0CisJcHVibGljIHZvaWQgaGlnaENvbmN1cnJlbmN5UGFyYWxsZWxSZWFkc19vbmVSZXBvUGFyYWxsZWxSZXZlcnNlSW5kZXgoKQorCQkJdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUluTWVtb3J5UmVwb3NpdG9yeSByMSA9IGNyZWF0ZVJlcG9XaXRoQml0bWFwKCJ0ZXN0Iik7CisJCXJlc2V0Q2FjaGUoKTsKKworCQlEZnNSZWFkZXIgcmVhZGVyID0gKERmc1JlYWRlcikgcjEubmV3T2JqZWN0UmVhZGVyKCk7CisJCXJlYWRlci5nZXRPcHRpb25zKCkuc2V0TG9hZFJldkluZGV4SW5QYXJhbGxlbCh0cnVlKTsKKwkJZm9yIChEZnNQYWNrRmlsZSBwYWNrIDogcjEuZ2V0T2JqZWN0RGF0YWJhc2UoKS5nZXRQYWNrcygpKSB7CisJCQkvLyBPbmx5IGxvYWQgbm9uLWdhcmJhZ2UgcGFjayB3aXRoIGJpdG1hcC4KKwkJCWlmIChwYWNrLmlzR2FyYmFnZSgpKSB7CisJCQkJY29udGludWU7CisJCQl9CisJCQlhc3luY1J1bigoKSAtPiBwYWNrLmdldEJpdG1hcEluZGV4KHJlYWRlcikpOworCQkJYXN5bmNSdW4oKCkgLT4gcGFjay5nZXRQYWNrSW5kZXgocmVhZGVyKSk7CisJCQlhc3luY1J1bigoKSAtPiBwYWNrLmdldEJpdG1hcEluZGV4KHJlYWRlcikpOworCQl9CisJCXdhaXRGb3JFeGVjdXRvclBvb2xUZXJtaW5hdGlvbigpOworCisJCWFzc2VydEVxdWFscygxLCBjYWNoZS5nZXRNaXNzQ291bnQoKVtQYWNrRXh0LkJJVE1BUF9JTkRFWC5vcmRpbmFsKCldKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIGNhY2hlLmdldE1pc3NDb3VudCgpW1BhY2tFeHQuSU5ERVgub3JkaW5hbCgpXSk7CisJCWFzc2VydEVxdWFscygxLCBjYWNoZS5nZXRNaXNzQ291bnQoKVswXSk7CisJfQorCiAJcHJpdmF0ZSB2b2lkIHJlc2V0Q2FjaGUoKSB7CiAJCXJlc2V0Q2FjaGUoMzIpOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvQmF0Y2hSZWZVcGRhdGVUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0JhdGNoUmVmVXBkYXRlVGVzdC5qYXZhCmluZGV4IDYzNTdhMGIuLmRhZjQzODIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvQmF0Y2hSZWZVcGRhdGVUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9CYXRjaFJlZlVwZGF0ZVRlc3QuamF2YQpAQCAtNDIsNiArNDIsOCBAQAogaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuUmVlbnRyYW50TG9jazsKIGltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uUHJlZGljYXRlOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmV2ZW50cy5MaXN0ZW5lckhhbmRsZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmV2ZW50cy5SZWZzQ2hhbmdlZExpc3RlbmVyOwpAQCAtMTI3LDYgKzEyOSw3IEBAIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCX0KIAogCQlkaXNrUmVwbyA9IGZpbGVSZXBvOworCQlhZGRSZXBvVG9DbG9zZShkaXNrUmVwbyk7CiAJCXNldExvZ0FsbFJlZlVwZGF0ZXModHJ1ZSk7CiAKIAkJaWYgKCF1c2VSZWZ0YWJsZSkgewpAQCAtMTE5MCw3ICsxMTkzLDggQEAgcHJpdmF0ZSB2b2lkIGFzc2VydFJlZnMoT2JqZWN0Li4uIGFyZ3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCX0KIAogCQlNYXA8U3RyaW5nLCBSZWY+IHJlZnMgPSBkaXNrUmVwby5nZXRSZWZEYXRhYmFzZSgpCi0JCQkJLmdldFJlZnMoUmVmRGF0YWJhc2UuQUxMKTsKKwkJCQkuZ2V0UmVmc0J5UHJlZml4KFJlZkRhdGFiYXNlLkFMTCkuc3RyZWFtKCkKKwkJCQkuY29sbGVjdChDb2xsZWN0b3JzLnRvTWFwKFJlZjo6Z2V0TmFtZSwgRnVuY3Rpb24uaWRlbnRpdHkoKSkpOwogCQlSZWYgYWN0dWFsSGVhZCA9IHJlZnMucmVtb3ZlKENvbnN0YW50cy5IRUFEKTsKIAkJaWYgKGFjdHVhbEhlYWQgIT0gbnVsbCkgewogCQkJU3RyaW5nIGFjdHVhbExlYWZOYW1lID0gYWN0dWFsSGVhZC5nZXRMZWFmKCkuZ2V0TmFtZSgpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9GaWxlUmVmdGFibGVTdGFja1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvRmlsZVJlZnRhYmxlU3RhY2tUZXN0LmphdmEKaW5kZXggNmM3NGYwMC4uNmM3OTkyNyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9GaWxlUmVmdGFibGVTdGFja1Rlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0ZpbGVSZWZ0YWJsZVN0YWNrVGVzdC5qYXZhCkBAIC0xNCw2ICsxNCw3IEBACiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRocm93czsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzdW1lLmFzc3VtZUZhbHNlOwogCiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwpAQCAtMzIsMTAgKzMzLDEyIEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0SWRSZWY7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVmOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5GaWxlVXRpbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLlN5c3RlbVJlYWRlcjsKIGltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAorCiBwdWJsaWMgY2xhc3MgRmlsZVJlZnRhYmxlU3RhY2tUZXN0IHsKIAogCXByaXZhdGUgc3RhdGljIFJlZiBuZXdSZWYoU3RyaW5nIG5hbWUsIE9iamVjdElkIGlkKSB7CkBAIC0xMTUsOSArMTE4LDEyIEBAIHB1YmxpYyB2b2lkIHRlc3RDb21wYWN0aW9uMTAyNCgpIHRocm93cyBFeGNlcHRpb24gewogCQl0ZXN0Q29tcGFjdGlvbigxMDI0KTsKIAl9CiAKLQlAU3VwcHJlc3NXYXJuaW5ncyh7ICJyZXNvdXJjZSIsICJ1bnVzZWQiIH0pCisJQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikKIAlAVGVzdAogCXB1YmxpYyB2b2lkIG1pc3NpbmdSZWZ0YWJsZSgpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBDYW4ndCBkZWxldGUgaW4tdXNlIGZpbGVzIG9uIFdpbmRvd3MuCisJCWFzc3VtZUZhbHNlKFN5c3RlbVJlYWRlci5nZXRJbnN0YW5jZSgpLmlzV2luZG93cygpKTsKKwogCQl0cnkgKEZpbGVSZWZ0YWJsZVN0YWNrIHN0YWNrID0gbmV3IEZpbGVSZWZ0YWJsZVN0YWNrKAogCQkJCW5ldyBGaWxlKHJlZnRhYmxlRGlyLCAicmVmcyIpLCByZWZ0YWJsZURpciwgbnVsbCwKIAkJCQkoKSAtPiBuZXcgQ29uZmlnKCkpKSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0djVGVzdENhc2UuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvR2NUZXN0Q2FzZS5qYXZhCmluZGV4IGJmYjIzM2YuLjQ4ZjZlMDYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvR2NUZXN0Q2FzZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvR2NUZXN0Q2FzZS5qYXZhCkBAIC00Miw2ICs0Miw3IEBAIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJQE92ZXJyaWRlCiAJQEFmdGVyCiAJcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdHIuY2xvc2UoKTsKIAkJc3VwZXIudGVhckRvd24oKTsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFja1dyaXRlclRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFja1dyaXRlclRlc3QuamF2YQppbmRleCAxZmYyMjY0Li4zZmU4ZjUyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1BhY2tXcml0ZXJUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9QYWNrV3JpdGVyVGVzdC5qYXZhCkBAIC03MjIsNiArNzIyLDcgQEAgcHVibGljIHZvaWQgdGVzdFBhcnRpYWxQYWNrRmlsZXNTY2FuV2hlbkRvaW5nU2VhcmNoRm9yUmV1c2VUaW1lb3V0Q2hlY2soKQogCSAqLwogCXByaXZhdGUgRmlsZVJlcG9zaXRvcnkgc2V0VXBSZXBvV2l0aE11bHRpcGxlUGFja2ZpbGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCUZpbGVSZXBvc2l0b3J5IGZpbGVSZXBvc2l0b3J5ID0gY3JlYXRlV29ya1JlcG9zaXRvcnkoKTsKKwkJYWRkUmVwb1RvQ2xvc2UoZmlsZVJlcG9zaXRvcnkpOwogCQl0cnkgKEdpdCBnaXQgPSBuZXcgR2l0KGZpbGVSZXBvc2l0b3J5KSkgewogCQkJLy8gQ3JlYXRlcyAyIG9iamVjdHMgKEMxID0gY29tbWl0LCBUMSA9IHRyZWUpCiAJCQlnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgiRmlyc3QgY29tbWl0IikuY2FsbCgpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvaW8vQ2FuY2VsbGFibGVEaWdlc3RPdXRwdXRTdHJlYW1UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9pby9DYW5jZWxsYWJsZURpZ2VzdE91dHB1dFN0cmVhbVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWE3YzBiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvaW8vQ2FuY2VsbGFibGVEaWdlc3RPdXRwdXRTdHJlYW1UZXN0LmphdmEKQEAgLTAsMCArMSwxMDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjIsIFRlbmNlbnQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5pbzsKKworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuaW8uQ2FuY2VsbGFibGVEaWdlc3RPdXRwdXRTdHJlYW0uQllURVNfVE9fV1JJVEVfQkVGT1JFX0NBTkNFTF9DSEVDSzsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhyb3dzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK2ltcG9ydCBqYXZhLmlvLkludGVycnVwdGVkSU9FeGNlcHRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Qcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLmlvLk51bGxPdXRwdXRTdHJlYW07CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBDYW5jZWxsYWJsZURpZ2VzdE91dHB1dFN0cmVhbVRlc3QgeworCXByaXZhdGUgc3RhdGljIGNsYXNzIENhbmNlbGxlZFRlc3RNb25pdG9yIGltcGxlbWVudHMgUHJvZ3Jlc3NNb25pdG9yIHsKKworCQlwcml2YXRlIGJvb2xlYW4gY2FuY2VsbGVkID0gZmFsc2U7CisKKwkJcHVibGljIHZvaWQgc2V0Q2FuY2VsbGVkKGJvb2xlYW4gY2FuY2VsbGVkKSB7CisJCQl0aGlzLmNhbmNlbGxlZCA9IGNhbmNlbGxlZDsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgdm9pZCBzdGFydChpbnQgdG90YWxUYXNrcykgeworCQkJLy8gbm90IGltcGxlbWVudGVkCisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgYmVnaW5UYXNrKFN0cmluZyB0aXRsZSwgaW50IHRvdGFsV29yaykgeworCQkJLy8gbm90IGltcGxlbWVudGVkCisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgdXBkYXRlKGludCBjb21wbGV0ZWQpIHsKKwkJCS8vIG5vdCBpbXBsZW1lbnRlZAorCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIGVuZFRhc2soKSB7CisJCQkvLyBub3QgaW1wbGVtZW50ZWQKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgYm9vbGVhbiBpc0NhbmNlbGxlZCgpIHsKKwkJCXJldHVybiBjYW5jZWxsZWQ7CisJCX0KKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RDYW5jZWxJblByb2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJQ2FuY2VsbGVkVGVzdE1vbml0b3IgbSA9IG5ldyBDYW5jZWxsZWRUZXN0TW9uaXRvcigpOworCQl0cnkgKENhbmNlbGxhYmxlRGlnZXN0T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBDYW5jZWxsYWJsZURpZ2VzdE91dHB1dFN0cmVhbSgKKwkJCQltLCBOdWxsT3V0cHV0U3RyZWFtLklOU1RBTkNFKSkgeworCQkJYnl0ZVtdIEtCID0gbmV3IGJ5dGVbMTAyNF07CisJCQlpbnQgdHJpZ2dlckNhbmNlbFdyaXRlQ250ID0gQllURVNfVE9fV1JJVEVfQkVGT1JFX0NBTkNFTF9DSEVDSworCQkJCQkvIEtCLmxlbmd0aDsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgdHJpZ2dlckNhbmNlbFdyaXRlQ250ICsgMTsgaSsrKSB7CisJCQkJb3V0LndyaXRlKEtCKTsKKwkJCX0KKwkJCWFzc2VydFRydWUob3V0Lmxlbmd0aCgpID4gQllURVNfVE9fV1JJVEVfQkVGT1JFX0NBTkNFTF9DSEVDSyk7CisJCQltLnNldENhbmNlbGxlZCh0cnVlKTsKKworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0cmlnZ2VyQ2FuY2VsV3JpdGVDbnQgLSAxOyBpKyspIHsKKwkJCQlvdXQud3JpdGUoS0IpOworCQkJfQorCisJCQlsb25nIGxhc3RMZW5ndGggPSBvdXQubGVuZ3RoKCk7CisJCQlhc3NlcnRUaHJvd3MoSW50ZXJydXB0ZWRJT0V4Y2VwdGlvbi5jbGFzcywgKCkgLT4geworCQkJCW91dC53cml0ZSgxKTsKKwkJCX0pOworCQkJYXNzZXJ0RXF1YWxzKGxhc3RMZW5ndGgsIG91dC5sZW5ndGgoKSk7CisKKwkJCWFzc2VydFRocm93cyhJbnRlcnJ1cHRlZElPRXhjZXB0aW9uLmNsYXNzLCAoKSAtPiB7CisJCQkJb3V0LndyaXRlKG5ldyBieXRlWzFdKTsKKwkJCX0pOworCQkJYXNzZXJ0RXF1YWxzKGxhc3RMZW5ndGgsIG91dC5sZW5ndGgoKSk7CisJCX0KKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RUcmlnZ2VyQ2hlY2tBZnRlclNpbmdsZUJ5dGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUNhbmNlbGxlZFRlc3RNb25pdG9yIG0gPSBuZXcgQ2FuY2VsbGVkVGVzdE1vbml0b3IoKTsKKwkJdHJ5IChDYW5jZWxsYWJsZURpZ2VzdE91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQ2FuY2VsbGFibGVEaWdlc3RPdXRwdXRTdHJlYW0oCisJCQkJbSwgTnVsbE91dHB1dFN0cmVhbS5JTlNUQU5DRSkpIHsKKworCQkJYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbQllURVNfVE9fV1JJVEVfQkVGT1JFX0NBTkNFTF9DSEVDSyArIDFdOworCQkJbS5zZXRDYW5jZWxsZWQodHJ1ZSk7CisKKwkJCWFzc2VydFRocm93cyhJbnRlcnJ1cHRlZElPRXhjZXB0aW9uLmNsYXNzLCAoKSAtPiB7CisJCQkJb3V0LndyaXRlKGJ5dGVzKTsKKwkJCX0pOworCQkJYXNzZXJ0RXF1YWxzKEJZVEVTX1RPX1dSSVRFX0JFRk9SRV9DQU5DRUxfQ0hFQ0ssIG91dC5sZW5ndGgoKSk7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvdHJhbnNwb3J0L3NzaC9PcGVuU3NoQ29uZmlnRmlsZVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoL09wZW5Tc2hDb25maWdGaWxlVGVzdC5qYXZhCmluZGV4IDExNzQxYjQuLmQwNjUyODAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoL09wZW5Tc2hDb25maWdGaWxlVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoL09wZW5Tc2hDb25maWdGaWxlVGVzdC5qYXZhCkBAIC0zNjksMjAgKzM2OSwyMSBAQCBwdWJsaWMgdm9pZCB0ZXN0SG9zdENhc2VJbnNlbnNpdGl2ZSgpIHRocm93cyBFeGNlcHRpb24gewogCiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0TGlzdFZhbHVlU2luZ2xlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNvbmZpZygiSG9zdCBvcmN6XG5Vc2VyS25vd25Ib3N0c0ZpbGUgL2Zvby9iYXJcbiIpOworCQljb25maWcoIkhvc3Qgb3JjelxuVXNlcktub3duSG9zdHNGaWxlIH4vZm9vL2JhclxuIik7CiAJCWZpbmFsIEhvc3RDb25maWcgYyA9IGxvb2t1cCgib3JjeiIpOwogCQlhc3NlcnROb3ROdWxsKGMpOwotCQlhc3NlcnRFcXVhbHMoIi9mb28vYmFyIiwgYy5nZXRWYWx1ZSgiVXNlcktub3duSG9zdHNGaWxlIikpOworCQlhc3NlcnRFcXVhbHMobmV3IEZpbGUoaG9tZSwgImZvby9iYXIiKS5nZXRQYXRoKCksCisJCQkJYy5nZXRWYWx1ZSgiVXNlcktub3duSG9zdHNGaWxlIikpOwogCX0KIAogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdExpc3RWYWx1ZU11bHRpcGxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCS8vIFRpbGRlIGV4cGFuc2lvbiBvY2N1cnMgd2l0aGluIHRoZSBwYXJzZXIKLQkJY29uZmlnKCJIb3N0IG9yY3pcblVzZXJLbm93bkhvc3RzRmlsZSBcIn4vZm9vL2JhIHpcIiAvZm9vL2JhciBcbiIpOworCQljb25maWcoIkhvc3Qgb3JjelxuVXNlcktub3duSG9zdHNGaWxlIFwifi9mb28vYmEgelwiIH4vZm9vL2JhciBcbiIpOwogCQlmaW5hbCBIb3N0Q29uZmlnIGMgPSBsb29rdXAoIm9yY3oiKTsKIAkJYXNzZXJ0Tm90TnVsbChjKTsKIAkJYXNzZXJ0QXJyYXlFcXVhbHMobmV3IE9iamVjdFtdIHsgbmV3IEZpbGUoaG9tZSwgImZvby9iYSB6IikuZ2V0UGF0aCgpLAotCQkJCSIvZm9vL2JhciIgfSwKKwkJCQluZXcgRmlsZShob21lLCAiZm9vL2JhciIpLmdldFBhdGgoKSB9LAogCQkJCWMuZ2V0VmFsdWVzKCJVc2VyS25vd25Ib3N0c0ZpbGUiKS50b0FycmF5KCkpOwogCX0KIApAQCAtNDAzLDIyICs0MDQsMjMgQEAgcHVibGljIHZvaWQgdGVzdFJlcGVhdGVkTG9va3Vwc1dpdGhNb2RpZmljYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdElkZW50aXR5RmlsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljb25maWcoIkhvc3Qgb3JjelxuSWRlbnRpdHlGaWxlIFwifi9mb28vYmEgelwiXG5JZGVudGl0eUZpbGUgL2Zvby9iYXIiKTsKKwkJY29uZmlnKCJIb3N0IG9yY3pcbklkZW50aXR5RmlsZSBcIn4vZm9vL2JhIHpcIlxuSWRlbnRpdHlGaWxlIH4vZm9vL2JhciIpOwogCQlmaW5hbCBIb3N0Q29uZmlnIGggPSBsb29rdXAoIm9yY3oiKTsKIAkJYXNzZXJ0Tm90TnVsbChoKTsKIAkJLy8gRG9lcyB0aWxkZSByZXBsYWNlbWVudAogCQlhc3NlcnRBcnJheUVxdWFscyhuZXcgT2JqZWN0W10geyBuZXcgRmlsZShob21lLCAiZm9vL2JhIHoiKS5nZXRQYXRoKCksCi0JCQkJIi9mb28vYmFyIiB9LAorCQkJCW5ldyBGaWxlKGhvbWUsICJmb28vYmFyIikuZ2V0UGF0aCgpIH0sCiAJCQkJaC5nZXRWYWx1ZXMoU3NoQ29uc3RhbnRzLklERU5USVRZX0ZJTEUpLnRvQXJyYXkoKSk7CiAJfQogCiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0TXVsdGlJZGVudGl0eUZpbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY29uZmlnKCJJZGVudGl0eUZpbGUgXCJ+L2Zvby9iYSB6XCJcbkhvc3Qgb3JjelxuSWRlbnRpdHlGaWxlIC9mb28vYmFyXG5IT1NUICpcbklkZW50aXR5RmlsZSAvZm9vL2JheiIpOworCQljb25maWcoIklkZW50aXR5RmlsZSBcIn4vZm9vL2JhIHpcIlxuSG9zdCBvcmN6XG5JZGVudGl0eUZpbGUgfi9mb28vYmFyXG5IT1NUICpcbklkZW50aXR5RmlsZSB+L2Zvby9iYXoiKTsKIAkJZmluYWwgSG9zdENvbmZpZyBoID0gbG9va3VwKCJvcmN6Iik7CiAJCWFzc2VydE5vdE51bGwoaCk7CiAJCWFzc2VydEFycmF5RXF1YWxzKG5ldyBPYmplY3RbXSB7IG5ldyBGaWxlKGhvbWUsICJmb28vYmEgeiIpLmdldFBhdGgoKSwKLQkJCQkiL2Zvby9iYXIiLCAiL2Zvby9iYXoiIH0sCisJCQkJbmV3IEZpbGUoaG9tZSwgImZvby9iYXIiKS5nZXRQYXRoKCksCisJCQkJbmV3IEZpbGUoaG9tZSwgImZvby9iYXoiKS5nZXRQYXRoKCkgfSwKIAkJCQloLmdldFZhbHVlcyhTc2hDb25zdGFudHMuSURFTlRJVFlfRklMRSkudG9BcnJheSgpKTsKIAl9CiAKQEAgLTQzNCwyMyArNDM2LDIzIEBAIHB1YmxpYyB2b2lkIHRlc3ROZWdhdGVkUGF0dGVybigpIHRocm93cyBFeGNlcHRpb24gewogCiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0UGF0dGVybigpIHRocm93cyBFeGNlcHRpb24gewotCQljb25maWcoIkhvc3QgcmVwby5vci5jelxuSWRlbnRpdHlGaWxlIH4vZm9vL2JhclxuSE9TVCAqLm9yLmN6XG5JZGVudGl0eUZpbGUgL2Zvby9iYXoiKTsKKwkJY29uZmlnKCJIb3N0IHJlcG8ub3IuY3pcbklkZW50aXR5RmlsZSB+L2Zvby9iYXJcbkhPU1QgKi5vci5jelxuSWRlbnRpdHlGaWxlIH4vZm9vL2JheiIpOwogCQlmaW5hbCBIb3N0Q29uZmlnIGggPSBsb29rdXAoInJlcG8ub3IuY3oiKTsKIAkJYXNzZXJ0Tm90TnVsbChoKTsKIAkJYXNzZXJ0SWRlbnRpdHkobmV3IEZpbGUoaG9tZSwgImZvby9iYXIiKSwgaCk7CiAJCWFzc2VydEFycmF5RXF1YWxzKG5ldyBPYmplY3RbXSB7IG5ldyBGaWxlKGhvbWUsICJmb28vYmFyIikuZ2V0UGF0aCgpLAotCQkJCSIvZm9vL2JheiIgfSwKKwkJCQluZXcgRmlsZShob21lLCAiZm9vL2JheiIpLmdldFBhdGgoKSB9LAogCQkJCWguZ2V0VmFsdWVzKFNzaENvbnN0YW50cy5JREVOVElUWV9GSUxFKS50b0FycmF5KCkpOwogCX0KIAogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdE11bHRpSG9zdCgpIHRocm93cyBFeGNlcHRpb24gewotCQljb25maWcoIkhvc3Qgb3JjeiAqLm9yLmN6XG5JZGVudGl0eUZpbGUgfi9mb28vYmFyXG5IT1NUICoub3IuY3pcbklkZW50aXR5RmlsZSAvZm9vL2JheiIpOworCQljb25maWcoIkhvc3Qgb3JjeiAqLm9yLmN6XG5JZGVudGl0eUZpbGUgfi9mb28vYmFyXG5IT1NUICoub3IuY3pcbklkZW50aXR5RmlsZSB+L2Zvby9iYXoiKTsKIAkJZmluYWwgSG9zdENvbmZpZyBoMSA9IGxvb2t1cCgicmVwby5vci5jeiIpOwogCQlhc3NlcnROb3ROdWxsKGgxKTsKIAkJYXNzZXJ0SWRlbnRpdHkobmV3IEZpbGUoaG9tZSwgImZvby9iYXIiKSwgaDEpOwogCQlhc3NlcnRBcnJheUVxdWFscyhuZXcgT2JqZWN0W10geyBuZXcgRmlsZShob21lLCAiZm9vL2JhciIpLmdldFBhdGgoKSwKLQkJCQkiL2Zvby9iYXoiIH0sCisJCQkJbmV3IEZpbGUoaG9tZSwgImZvby9iYXoiKS5nZXRQYXRoKCkgfSwKIAkJCQloMS5nZXRWYWx1ZXMoU3NoQ29uc3RhbnRzLklERU5USVRZX0ZJTEUpLnRvQXJyYXkoKSk7CiAJCWZpbmFsIEhvc3RDb25maWcgaDIgPSBsb29rdXAoIm9yY3oiKTsKIAkJYXNzZXJ0Tm90TnVsbChoMik7CkBAIC01NDcsMTggKzU0OSwzNiBAQCBwdWJsaWMgdm9pZCB0ZXN0RW9sQ29tbWVudHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdEVuVmFyU3Vic3RpdHV0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNvbmZpZygiSG9zdCBvcmN6XG5JZGVudGl0eUZpbGUgL3RtcC8ke1RTVF9WQVJ9XG4iCi0JCQkJKyAiQ2VydGlmaWNhdGVGaWxlIC90bXAvJHt9L2Zvb1xuVXNlciAke1RTVF9WQVJ9XG5JZGVudGl0eUFnZW50IC90bXAvJHtUU1RfVkFSL2JhciIpOworCQljb25maWcoIkhvc3Qgb3JjelxuSWRlbnRpdHlGaWxlIH4vdG1wLyR7VFNUX1ZBUn1cbiIKKwkJCQkrICJDZXJ0aWZpY2F0ZUZpbGUgfi90bXAvJHt9L2Zvb1xuVXNlciAke1RTVF9WQVJ9XG5JZGVudGl0eUFnZW50IH4vdG1wLyR7VFNUX1ZBUi9iYXIiKTsKIAkJSG9zdENvbmZpZyBoID0gbG9va3VwKCJvcmN6Iik7CiAJCWFzc2VydE5vdE51bGwoaCk7Ci0JCWFzc2VydEVxdWFscygiL3RtcC9URVNUIiwKKwkJRmlsZSB0bXAgPSBuZXcgRmlsZShob21lLCAidG1wIik7CisJCWFzc2VydEVxdWFscyhuZXcgRmlsZSh0bXAsICJURVNUIikuZ2V0UGF0aCgpLAogCQkJCWguZ2V0VmFsdWUoU3NoQ29uc3RhbnRzLklERU5USVRZX0ZJTEUpKTsKIAkJLy8gTm8gdmFyaWFibGUgbmFtZQotCQlhc3NlcnRFcXVhbHMoIi90bXAvJHt9L2ZvbyIsIGguZ2V0VmFsdWUoU3NoQ29uc3RhbnRzLkNFUlRJRklDQVRFX0ZJTEUpKTsKKwkJYXNzZXJ0RXF1YWxzKG5ldyBGaWxlKG5ldyBGaWxlKHRtcCwgIiR7fSIpLCAiZm9vIikuZ2V0UGF0aCgpLAorCQkJCWguZ2V0VmFsdWUoU3NoQ29uc3RhbnRzLkNFUlRJRklDQVRFX0ZJTEUpKTsKIAkJLy8gVXNlciBkb2Vzbid0IGdldCBlbnYgdmFyIHN1YnN0aXR1dGlvbjoKIAkJYXNzZXJ0VXNlcigiJHtUU1RfVkFSfSIsIGgpOwogCQkvLyBVbnRlcm1pbmF0ZWQ6Ci0JCWFzc2VydEVxdWFscygiL3RtcC8ke1RTVF9WQVIvYmFyIiwKKwkJYXNzZXJ0RXF1YWxzKG5ldyBGaWxlKG5ldyBGaWxlKHRtcCwgIiR7VFNUX1ZBUiIpLCAiYmFyIikuZ2V0UGF0aCgpLAorCQkJCWguZ2V0VmFsdWUoU3NoQ29uc3RhbnRzLklERU5USVRZX0FHRU5UKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0SWRlbnRpdHlBZ2VudE5vbmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY29uZmlnKCJIb3N0IG9yY3pcbklkZW50aXR5QWdlbnQgbm9uZVxuIik7CisJCUhvc3RDb25maWcgaCA9IGxvb2t1cCgib3JjeiIpOworCQlhc3NlcnRFcXVhbHMoU3NoQ29uc3RhbnRzLk5PTkUsCisJCQkJaC5nZXRWYWx1ZShTc2hDb25zdGFudHMuSURFTlRJVFlfQUdFTlQpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RJZGVudGl0eUFnZW50U3NoQXV0aFNvY2soKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY29uZmlnKCJIb3N0IG9yY3pcbklkZW50aXR5QWdlbnQgU1NIX0FVVEhfU09DS1xuIik7CisJCUhvc3RDb25maWcgaCA9IGxvb2t1cCgib3JjeiIpOworCQlhc3NlcnRFcXVhbHMoU3NoQ29uc3RhbnRzLkVOVl9TU0hfQVVUSF9TT0NLRVQsCiAJCQkJaC5nZXRWYWx1ZShTc2hDb25zdGFudHMuSURFTlRJVFlfQUdFTlQpKTsKIAl9CiAKQEAgLTYwNywxMyArNjI3LDE2IEBAIHB1YmxpYyB2b2lkIHRlc3ROb01hdGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZU1hdGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNvbmZpZygiSG9zdCBmb28uYmFyXG5Qb3J0IDI5NDE4XG5JZGVudGl0eUZpbGUgL2Zvb1xuXG4iCi0JCQkJKyAiSG9zdCAqLmJhclxuUG9ydCAyMlxuSWRlbnRpdHlGaWxlIC9iYXJcbiIKLQkJCQkrICJIb3N0IGZvby5iYXJcblBvcnQgNDdcbklkZW50aXR5RmlsZSAvYmF6XG4iKTsKKwkJY29uZmlnKCJIb3N0IGZvby5iYXJcblBvcnQgMjk0MThcbklkZW50aXR5RmlsZSB+L2Zvb1xuXG4iCisJCQkJKyAiSG9zdCAqLmJhclxuUG9ydCAyMlxuSWRlbnRpdHlGaWxlIH4vYmFyXG4iCisJCQkJKyAiSG9zdCBmb28uYmFyXG5Qb3J0IDQ3XG5JZGVudGl0eUZpbGUgfi9iYXpcbiIpOwogCQlIb3N0Q29uZmlnIGggPSBsb29rdXAoImZvby5iYXIiKTsKIAkJYXNzZXJ0Tm90TnVsbChoKTsKIAkJYXNzZXJ0UG9ydCgyOTQxOCwgaCk7Ci0JCWFzc2VydEFycmF5RXF1YWxzKG5ldyBPYmplY3RbXSB7ICIvZm9vIiwgIi9iYXIiLCAiL2JheiIgfSwKKwkJYXNzZXJ0QXJyYXlFcXVhbHMoCisJCQkJbmV3IE9iamVjdFtdIHsgbmV3IEZpbGUoaG9tZSwgImZvbyIpLmdldFBhdGgoKSwKKwkJCQkJCW5ldyBGaWxlKGhvbWUsICJiYXIiKS5nZXRQYXRoKCksCisJCQkJCQluZXcgRmlsZShob21lLCAiYmF6IikuZ2V0UGF0aCgpIH0sCiAJCQkJaC5nZXRWYWx1ZXMoU3NoQ29uc3RhbnRzLklERU5USVRZX0ZJTEUpLnRvQXJyYXkoKSk7CiAJfQogCkBAIC02MzMsNCArNjU2LDYxIEBAIHB1YmxpYyB2b2lkIHRlc3RXaGl0ZXNwYWNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWFzc2VydE5vdE51bGwoaCk7CiAJCWFzc2VydFBvcnQoMjIsIGgpOwogCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFRpbWVTcGVjKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWFzc2VydEVxdWFscygtMSwgT3BlblNzaENvbmZpZ0ZpbGUudGltZVNwZWMobnVsbCkpOworCQlhc3NlcnRFcXVhbHMoLTEsIE9wZW5Tc2hDb25maWdGaWxlLnRpbWVTcGVjKCIiKSk7CisJCWFzc2VydEVxdWFscygtMSwgT3BlblNzaENvbmZpZ0ZpbGUudGltZVNwZWMoIiAgIikpOworCQlhc3NlcnRFcXVhbHMoLTEsIE9wZW5Tc2hDb25maWdGaWxlLnRpbWVTcGVjKCJzIikpOworCQlhc3NlcnRFcXVhbHMoLTEsIE9wZW5Tc2hDb25maWdGaWxlLnRpbWVTcGVjKCIgIHMiKSk7CisJCWFzc2VydEVxdWFscygtMSwgT3BlblNzaENvbmZpZ0ZpbGUudGltZVNwZWMoIiArcyIpKTsKKwkJYXNzZXJ0RXF1YWxzKC0xLCBPcGVuU3NoQ29uZmlnRmlsZS50aW1lU3BlYygiIC1zIikpOworCQlhc3NlcnRFcXVhbHMoLTEsIE9wZW5Tc2hDb25maWdGaWxlLnRpbWVTcGVjKCIxbXMiKSk7CisJCWFzc2VydEVxdWFscyg2MDAsIE9wZW5Tc2hDb25maWdGaWxlLnRpbWVTcGVjKCI2MDAiKSk7CisJCWFzc2VydEVxdWFscyg2MDAsIE9wZW5Tc2hDb25maWdGaWxlLnRpbWVTcGVjKCI2MDBzIikpOworCQlhc3NlcnRFcXVhbHMoNjAwLCBPcGVuU3NoQ29uZmlnRmlsZS50aW1lU3BlYygiICA2MDBzIikpOworCQlhc3NlcnRFcXVhbHMoNjAwLCBPcGVuU3NoQ29uZmlnRmlsZS50aW1lU3BlYygiICA2MDBzICAiKSk7CisJCWFzc2VydEVxdWFscyg2MDAsIE9wZW5Tc2hDb25maWdGaWxlLnRpbWVTcGVjKCJcdDYwMHMiKSk7CisJCWFzc2VydEVxdWFscyg2MDAsIE9wZW5Tc2hDb25maWdGaWxlLnRpbWVTcGVjKCIgXHQ2MDAgICIpKTsKKwkJYXNzZXJ0RXF1YWxzKC0xLCBPcGVuU3NoQ29uZmlnRmlsZS50aW1lU3BlYygiICA2MDAgcyAgIikpOworCQlhc3NlcnRFcXVhbHMoLTEsIE9wZW5Tc2hDb25maWdGaWxlLnRpbWVTcGVjKCI2MDAgcyIpKTsKKwkJYXNzZXJ0RXF1YWxzKDYwMCwgT3BlblNzaENvbmZpZ0ZpbGUudGltZVNwZWMoIjEwbSIpKTsKKwkJYXNzZXJ0RXF1YWxzKDU0MDAsIE9wZW5Tc2hDb25maWdGaWxlLnRpbWVTcGVjKCIxaDMwbSIpKTsKKwkJYXNzZXJ0RXF1YWxzKDU0MDAsIE9wZW5Tc2hDb25maWdGaWxlLnRpbWVTcGVjKCIxaCAzMG0iKSk7CisJCWFzc2VydEVxdWFscyg1NDAwLCBPcGVuU3NoQ29uZmlnRmlsZS50aW1lU3BlYygiMWggXHQzMG0iKSk7CisJCWFzc2VydEVxdWFscyg1NDAwLCBPcGVuU3NoQ29uZmlnRmlsZS50aW1lU3BlYygiMWgrMzBtIikpOworCQlhc3NlcnRFcXVhbHMoNTQwMCwgT3BlblNzaENvbmZpZ0ZpbGUudGltZVNwZWMoIjFoICszMG0iKSk7CisJCWFzc2VydEVxdWFscygtMSwgT3BlblNzaENvbmZpZ0ZpbGUudGltZVNwZWMoIjFoICsgMzBtIikpOworCQlhc3NlcnRFcXVhbHMoLTEsIE9wZW5Tc2hDb25maWdGaWxlLnRpbWVTcGVjKCIxaCAtMzBtIikpOworCQlhc3NlcnRFcXVhbHMoMzYzMCwgT3BlblNzaENvbmZpZ0ZpbGUudGltZVNwZWMoIjFoMzBzIikpOworCQlhc3NlcnRFcXVhbHMoNTQwMCwgT3BlblNzaENvbmZpZ0ZpbGUudGltZVNwZWMoIjMwbSAxaCIpKTsKKwkJYXNzZXJ0RXF1YWxzKDM2MDAsIE9wZW5Tc2hDb25maWdGaWxlLnRpbWVTcGVjKCIzMG0gMzBtIikpOworCQlhc3NlcnRFcXVhbHMoNjAsIE9wZW5Tc2hDb25maWdGaWxlLnRpbWVTcGVjKCIzMCAzMCIpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIE9wZW5Tc2hDb25maWdGaWxlLnRpbWVTcGVjKCIwIikpOworCQlhc3NlcnRFcXVhbHMoMSwgT3BlblNzaENvbmZpZ0ZpbGUudGltZVNwZWMoIjEiKSk7CisJCWFzc2VydEVxdWFscygxLCBPcGVuU3NoQ29uZmlnRmlsZS50aW1lU3BlYygiMVMiKSk7CisJCWFzc2VydEVxdWFscygxLCBPcGVuU3NoQ29uZmlnRmlsZS50aW1lU3BlYygiMXMiKSk7CisJCWFzc2VydEVxdWFscyg2MCwgT3BlblNzaENvbmZpZ0ZpbGUudGltZVNwZWMoIjFNIikpOworCQlhc3NlcnRFcXVhbHMoNjAsIE9wZW5Tc2hDb25maWdGaWxlLnRpbWVTcGVjKCIxbSIpKTsKKwkJYXNzZXJ0RXF1YWxzKDM2MDAsIE9wZW5Tc2hDb25maWdGaWxlLnRpbWVTcGVjKCIxSCIpKTsKKwkJYXNzZXJ0RXF1YWxzKDM2MDAsIE9wZW5Tc2hDb25maWdGaWxlLnRpbWVTcGVjKCIxaCIpKTsKKwkJYXNzZXJ0RXF1YWxzKDg2NDAwLCBPcGVuU3NoQ29uZmlnRmlsZS50aW1lU3BlYygiMUQiKSk7CisJCWFzc2VydEVxdWFscyg4NjQwMCwgT3BlblNzaENvbmZpZ0ZpbGUudGltZVNwZWMoIjFkIikpOworCQlhc3NlcnRFcXVhbHMoNjA0ODAwLCBPcGVuU3NoQ29uZmlnRmlsZS50aW1lU3BlYygiMVciKSk7CisJCWFzc2VydEVxdWFscyg2MDQ4MDAsIE9wZW5Tc2hDb25maWdGaWxlLnRpbWVTcGVjKCIxdyIpKTsKKwkJYXNzZXJ0RXF1YWxzKDE3MjgwMCwgT3BlblNzaENvbmZpZ0ZpbGUudGltZVNwZWMoIjJkIikpOworCQlhc3NlcnRFcXVhbHMoNjA0ODAwLCBPcGVuU3NoQ29uZmlnRmlsZS50aW1lU3BlYygiMXciKSk7CisJCWFzc2VydEVxdWFscyg2MDQ4MDAgKyAxNzI4MDAgKyAzICogMzYwMCArIDMwICogNjAgKyAxMCwKKwkJCQlPcGVuU3NoQ29uZmlnRmlsZS50aW1lU3BlYygiMXcyZDNoMzBtMTBzIikpOworCQlhc3NlcnRFcXVhbHMoLTEsIE9wZW5Tc2hDb25maWdGaWxlLnRpbWVTcGVjKCItNyIpKTsKKwkJYXNzZXJ0RXF1YWxzKC0xLCBPcGVuU3NoQ29uZmlnRmlsZS50aW1lU3BlYygiLTlkIikpOworCQlhc3NlcnRFcXVhbHMoSW50ZWdlci5NQVhfVkFMVUUsIE9wZW5Tc2hDb25maWdGaWxlCisJCQkJLnRpbWVTcGVjKEludGVnZXIudG9TdHJpbmcoSW50ZWdlci5NQVhfVkFMVUUpKSk7CisJCWFzc2VydEVxdWFscygtMSwgT3BlblNzaENvbmZpZ0ZpbGUKKwkJCQkudGltZVNwZWMoTG9uZy50b1N0cmluZyhJbnRlZ2VyLk1BWF9WQUxVRSArIDFMKSkpOworCQlhc3NlcnRFcXVhbHMoLTEsIE9wZW5Tc2hDb25maWdGaWxlCisJCQkJLnRpbWVTcGVjKEludGVnZXIudG9TdHJpbmcoSW50ZWdlci5NQVhfVkFMVUUgLyA2MCArIDEpICsgJ00nKSk7CisJCWFzc2VydEVxdWFscygtMSwgT3BlblNzaENvbmZpZ0ZpbGUudGltZVNwZWMoIjEwMDAwMDAwMDAwMDAwMDAwMDAwMDB3IikpOworCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvQWJicmV2Q29uZmlnVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9BYmJyZXZDb25maWdUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZhY2UwOAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvQWJicmV2Q29uZmlnVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTI4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIyLCBNYXR0aGlhcyBTb2huIDxtYXR0aGlhcy5zb2huQHNhcC5jb20+IGFuZCBvdGhlcnMKKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQubGliOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRocm93czsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnMuSW52YWxpZENvbmZpZ3VyYXRpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5SZXBvc2l0b3J5VGVzdENhc2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLmZpbGUuRmlsZUJhc2VkQ29uZmlnOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitwdWJsaWMgY2xhc3MgQWJicmV2Q29uZmlnVGVzdCBleHRlbmRzIFJlcG9zaXRvcnlUZXN0Q2FzZSB7CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWFzc2VydEVxdWFscyg3LCB0ZXN0Q29yZUFiYnJldihudWxsKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0QXV0bygpIHRocm93cyBFeGNlcHRpb24geworCQlhc3NlcnRFcXVhbHMoNywgdGVzdENvcmVBYmJyZXYoImF1dG8iKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0Tm8oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJYXNzZXJ0RXF1YWxzKDQwLCB0ZXN0Q29yZUFiYnJldigibm8iKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0VmFsaWRNaW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJYXNzZXJ0RXF1YWxzKDQsIHRlc3RDb3JlQWJicmV2KCI0IikpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFZhbGlkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWFzc2VydEVxdWFscygyMiwgdGVzdENvcmVBYmJyZXYoIjIyIikpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFZhbGlkTWF4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWFzc2VydEVxdWFscyg0MCwgdGVzdENvcmVBYmJyZXYoIjQwIikpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEludmFsaWQoKSB7CisJCWFzc2VydFRocm93cyhJbnZhbGlkQ29uZmlndXJhdGlvbkV4Y2VwdGlvbi5jbGFzcywKKwkJCQkoKSAtPiB0ZXN0Q29yZUFiYnJldigiZm9vIikpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEludmFsaWQyKCkgeworCQlhc3NlcnRUaHJvd3MoSW52YWxpZENvbmZpZ3VyYXRpb25FeGNlcHRpb24uY2xhc3MsCisJCQkJKCkgLT4gdGVzdENvcmVBYmJyZXYoIjJrIikpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEludmFsaWROZWdhdGl2ZSgpIHsKKwkJYXNzZXJ0VGhyb3dzKEludmFsaWRDb25maWd1cmF0aW9uRXhjZXB0aW9uLmNsYXNzLAorCQkJCSgpIC0+IHRlc3RDb3JlQWJicmV2KCItMTAwMCIpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkQmVsb3dSYW5nZSgpIHsKKwkJYXNzZXJ0VGhyb3dzKEludmFsaWRDb25maWd1cmF0aW9uRXhjZXB0aW9uLmNsYXNzLAorCQkJCSgpIC0+IHRlc3RDb3JlQWJicmV2KCIzIikpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEludmFsaWRCZWxvd1JhbmdlMigpIHsKKwkJYXNzZXJ0VGhyb3dzKEludmFsaWRDb25maWd1cmF0aW9uRXhjZXB0aW9uLmNsYXNzLAorCQkJCSgpIC0+IHRlc3RDb3JlQWJicmV2KCItMSIpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkQWJvdmVSYW5nZSgpIHsKKwkJYXNzZXJ0VGhyb3dzKEludmFsaWRDb25maWd1cmF0aW9uRXhjZXB0aW9uLmNsYXNzLAorCQkJCSgpIC0+IHRlc3RDb3JlQWJicmV2KCI0MSIpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkQWJvdmVSYW5nZTIoKSB7CisJCWFzc2VydFRocm93cyhJbnZhbGlkQ29uZmlndXJhdGlvbkV4Y2VwdGlvbi5jbGFzcywKKwkJCQkoKSAtPiB0ZXN0Q29yZUFiYnJldigiMTAwMDAwIikpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nTm8oKQorCQkJdGhyb3dzIEludmFsaWRDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisJCWFzc2VydEVxdWFscygiNDAiLCBzZXRDb3JlQWJicmV2KCJubyIpLnRvU3RyaW5nKCkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkKKwkJCXRocm93cyBJbnZhbGlkQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworCQlhc3NlcnRFcXVhbHMoIjciLCBzZXRDb3JlQWJicmV2KCJhdXRvIikudG9TdHJpbmcoKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcxMigpCisJCQl0aHJvd3MgSW52YWxpZENvbmZpZ3VyYXRpb25FeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKwkJYXNzZXJ0RXF1YWxzKCIxMiIsIHNldENvcmVBYmJyZXYoIjEyIikudG9TdHJpbmcoKSk7CisJfQorCisJcHJpdmF0ZSBpbnQgdGVzdENvcmVBYmJyZXYoU3RyaW5nIHZhbHVlKQorCQkJdGhyb3dzIEludmFsaWRDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisJCXJldHVybiBzZXRDb3JlQWJicmV2KHZhbHVlKS5nZXQoKTsKKwl9CisKKwlwcml2YXRlIEFiYnJldkNvbmZpZyBzZXRDb3JlQWJicmV2KFN0cmluZyB2YWx1ZSkKKwkJCXRocm93cyBJT0V4Y2VwdGlvbiwgSW52YWxpZENvbmZpZ3VyYXRpb25FeGNlcHRpb24geworCQlGaWxlQmFzZWRDb25maWcgY29uZmlnID0gZGIuZ2V0Q29uZmlnKCk7CisJCWNvbmZpZy5zZXRTdHJpbmcoQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19DT1JFX1NFQ1RJT04sIG51bGwsCisJCQkJQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19LRVlfQUJCUkVWLCB2YWx1ZSk7CisJCWNvbmZpZy5zYXZlKCk7CisJCXJldHVybiBBYmJyZXZDb25maWcucGFyc2VGcm9tQ29uZmlnKGRiKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvQ29tbWl0Q29uZmlnVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9Db21taXRDb25maWdUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk1ZDc4MQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvQ29tbWl0Q29uZmlnVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTc5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIyLCBUaG9tYXMgV29sZiA8dGhvbWFzLndvbGZAcGFyYW5vci5jaD4gYW5kIG90aGVycworICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmxpYjsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaHJvd3M7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5Db25maWdJbnZhbGlkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbW1pdENvbmZpZy5DbGVhbnVwTW9kZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworcHVibGljIGNsYXNzIENvbW1pdENvbmZpZ1Rlc3QgeworCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJQ29tbWl0Q29uZmlnIGNmZyA9IHBhcnNlKCIiKTsKKwkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIGNsZWFuLXVwIG1vZGUiLCBDbGVhbnVwTW9kZS5ERUZBVUxULAorCQkJCWNmZy5nZXRDbGVhbnVwTW9kZSgpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RDb21taXRDbGVhbnVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZ1tdIHZhbHVlcyA9IHsgInN0cmlwIiwgIndoaXRlc3BhY2UiLCAidmVyYmF0aW0iLCAic2Npc3NvcnMiLAorCQkJCSJkZWZhdWx0IiB9OworCQlDbGVhbnVwTW9kZVtdIGV4cGVjdGVkID0geyBDbGVhbnVwTW9kZS5TVFJJUCwgQ2xlYW51cE1vZGUuV0hJVEVTUEFDRSwKKwkJCQlDbGVhbnVwTW9kZS5WRVJCQVRJTSwgQ2xlYW51cE1vZGUuU0NJU1NPUlMsCisJCQkJQ2xlYW51cE1vZGUuREVGQVVMVCB9OworCQlmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgeworCQkJQ29tbWl0Q29uZmlnIGNmZyA9IHBhcnNlKCJbY29tbWl0XVxuXHRjbGVhbnVwID0gIiArIHZhbHVlc1tpXSk7CisJCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgY2xlYW4tdXAgbW9kZSIsIGV4cGVjdGVkW2ldLAorCQkJCQljZmcuZ2V0Q2xlYW51cE1vZGUoKSk7CisJCX0KKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RSZXNvbHZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZ1tdIHZhbHVlcyA9IHsgInN0cmlwIiwgIndoaXRlc3BhY2UiLCAidmVyYmF0aW0iLCAic2Npc3NvcnMiLAorCQkJCSJkZWZhdWx0IiB9OworCQlDbGVhbnVwTW9kZVtdIGV4cGVjdGVkID0geyBDbGVhbnVwTW9kZS5TVFJJUCwgQ2xlYW51cE1vZGUuV0hJVEVTUEFDRSwKKwkJCQlDbGVhbnVwTW9kZS5WRVJCQVRJTSwgQ2xlYW51cE1vZGUuU0NJU1NPUlMsCisJCQkJQ2xlYW51cE1vZGUuREVGQVVMVCB9OworCQlmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgeworCQkJQ29tbWl0Q29uZmlnIGNmZyA9IHBhcnNlKCJbY29tbWl0XVxuXHRjbGVhbnVwID0gIiArIHZhbHVlc1tpXSk7CisJCQlmb3IgKENsZWFudXBNb2RlIG1vZGUgOiBDbGVhbnVwTW9kZS52YWx1ZXMoKSkgeworCQkJCWZvciAoaW50IGogPSAwOyBqIDwgMjsgaisrKSB7CisJCQkJCUNsZWFudXBNb2RlIHJlc29sdmVkID0gY2ZnLnJlc29sdmUobW9kZSwgaiA9PSAwKTsKKwkJCQkJaWYgKG1vZGUgIT0gQ2xlYW51cE1vZGUuREVGQVVMVCkgeworCQkJCQkJYXNzZXJ0RXF1YWxzKCJDbGVhbi11cCBtb2RlIHNob3VsZCBiZSB1bmNoYW5nZWQiLCBtb2RlLAorCQkJCQkJCQlyZXNvbHZlZCk7CisJCQkJCX0gZWxzZSBpZiAoaSArIDEgPCB2YWx1ZXMubGVuZ3RoKSB7CisJCQkJCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgY2xlYW4tdXAgbW9kZSIsIGV4cGVjdGVkW2ldLAorCQkJCQkJCQlyZXNvbHZlZCk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgY2xlYW4tdXAgbW9kZSIsCisJCQkJCQkJCWogPT0gMCA/IENsZWFudXBNb2RlLlNUUklQCisJCQkJCQkJCQkJOiBDbGVhbnVwTW9kZS5XSElURVNQQUNFLAorCQkJCQkJCQlyZXNvbHZlZCk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RDbGVhbkRlZmF1bHRUaHJvd3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJYXNzZXJ0VGhyb3dzKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcywgKCkgLT4gQ29tbWl0Q29uZmlnCisJCQkJLmNsZWFuVGV4dCgiV2hhdGV2ZXIiLCBDbGVhbnVwTW9kZS5ERUZBVUxULCAnIycpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RDbGVhblZlcmJhdGltKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBtZXNzYWdlID0gIlxuICBcbldoYXRldmVyICBcblxuXG4jIEEgY29tbWVudFxuXG5Nb3JlXHQgXG5cblxuIjsKKwkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIG1lc3NhZ2UgY2hhbmdlIiwgbWVzc2FnZSwKKwkJCQlDb21taXRDb25maWcuY2xlYW5UZXh0KG1lc3NhZ2UsIENsZWFudXBNb2RlLlZFUkJBVElNLCAnIycpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RDbGVhbldoaXRlc3BhY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIG1lc3NhZ2UgPSAiXG4gIFxuV2hhdGV2ZXIgIFxuXG5cbiMgQSBjb21tZW50XG5cbk1vcmVcdCBcblxuXG4iOworCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgbWVzc2FnZSBjaGFuZ2UiLAorCQkJCSJXaGF0ZXZlclxuXG4jIEEgY29tbWVudFxuXG5Nb3JlXG4iLAorCQkJCUNvbW1pdENvbmZpZy5jbGVhblRleHQobWVzc2FnZSwgQ2xlYW51cE1vZGUuV0hJVEVTUEFDRSwgJyMnKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0Q2xlYW5TdHJpcCgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgbWVzc2FnZSA9ICJcbiAgXG5XaGF0ZXZlciAgXG5cblxuIyBBIGNvbW1lbnRcblxuTW9yZVx0IFxuXG5cbiI7CisJCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBtZXNzYWdlIGNoYW5nZSIsICJXaGF0ZXZlclxuXG5Nb3JlXG4iLAorCQkJCUNvbW1pdENvbmZpZy5jbGVhblRleHQobWVzc2FnZSwgQ2xlYW51cE1vZGUuU1RSSVAsICcjJykpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdENsZWFuU3RyaXBDdXN0b21DaGFyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBtZXNzYWdlID0gIlxuICBcbldoYXRldmVyICBcblxuXG4jIE5vdCBhIGNvbW1lbnRcblxuICAgPEEgY29tbWVudFxuTW9yZVx0IFxuXG5cbiI7CisJCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBtZXNzYWdlIGNoYW5nZSIsCisJCQkJIldoYXRldmVyXG5cbiMgTm90IGEgY29tbWVudFxuXG5Nb3JlXG4iLAorCQkJCUNvbW1pdENvbmZpZy5jbGVhblRleHQobWVzc2FnZSwgQ2xlYW51cE1vZGUuU1RSSVAsICc8JykpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdENsZWFuU2Npc3NvcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIG1lc3NhZ2UgPSAiXG4gIFxuV2hhdGV2ZXIgIFxuXG5cbiMgTm90IGEgY29tbWVudFxuXG4gICA8QSBjb21tZW50XG5Nb3JlXHQgXG5cblxuIgorCQkJCSsgIiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tID44IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIgorCQkJCSsgIk1vcmVcbk1vcmVcbiI7CisJCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBtZXNzYWdlIGNoYW5nZSIsCisJCQkJIldoYXRldmVyXG5cbiMgTm90IGEgY29tbWVudFxuXG4gICA8QSBjb21tZW50XG5Nb3JlXG4iLAorCQkJCUNvbW1pdENvbmZpZy5jbGVhblRleHQobWVzc2FnZSwgQ2xlYW51cE1vZGUuU0NJU1NPUlMsICcjJykpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdENsZWFuU2Npc3NvcnNDdXN0b21DaGFyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBtZXNzYWdlID0gIlxuICBcbldoYXRldmVyICBcblxuXG4jIE5vdCBhIGNvbW1lbnRcblxuICAgPEEgY29tbWVudFxuTW9yZVx0IFxuXG5cbiIKKwkJCQkrICI8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSA+OCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIKKwkJCQkrICJNb3JlXG5Nb3JlXG4iOworCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgbWVzc2FnZSBjaGFuZ2UiLAorCQkJCSJXaGF0ZXZlclxuXG4jIE5vdCBhIGNvbW1lbnRcblxuICAgPEEgY29tbWVudFxuTW9yZVxuIiwKKwkJCQlDb21taXRDb25maWcuY2xlYW5UZXh0KG1lc3NhZ2UsIENsZWFudXBNb2RlLlNDSVNTT1JTLCAnPCcpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RDbGVhblNjaXNzb3JzQXRUb3AoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIG1lc3NhZ2UgPSAiIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gPjggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iCisJCQkJKyAiXG4gIFxuV2hhdGV2ZXIgIFxuXG5cbiMgTm90IGEgY29tbWVudFxuXG4gICA8QSBjb21tZW50XG5Nb3JlXHQgXG5cblxuIgorCQkJCSsgIk1vcmVcbk1vcmVcbiI7CisJCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBtZXNzYWdlIGNoYW5nZSIsICIiLAorCQkJCUNvbW1pdENvbmZpZy5jbGVhblRleHQobWVzc2FnZSwgQ2xlYW51cE1vZGUuU0NJU1NPUlMsICcjJykpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdENsZWFuU2Npc3NvcnNOb1NjaXNzb3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIG1lc3NhZ2UgPSAiXG4gIFxuV2hhdGV2ZXIgIFxuXG5cbiMgQSBjb21tZW50XG5cbk1vcmVcdCBcblxuXG4iOworCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgbWVzc2FnZSBjaGFuZ2UiLAorCQkJCSJXaGF0ZXZlclxuXG4jIEEgY29tbWVudFxuXG5Nb3JlXG4iLAorCQkJCUNvbW1pdENvbmZpZy5jbGVhblRleHQobWVzc2FnZSwgQ2xlYW51cE1vZGUuU0NJU1NPUlMsICcjJykpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdENsZWFuU2Npc3NvcnNOb1NjaXNzb3IyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBtZXNzYWdlID0gIlRleHRcbiIKKwkJCQkrICIjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gPjggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iCisJCQkJKyAiTW9yZVxuTW9yZVxuIjsKKwkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIG1lc3NhZ2UgY2hhbmdlIiwgbWVzc2FnZSwKKwkJCQlDb21taXRDb25maWcuY2xlYW5UZXh0KG1lc3NhZ2UsIENsZWFudXBNb2RlLlNDSVNTT1JTLCAnIycpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RDbGVhblNjaXNzb3JzTm9TY2lzc29yMygpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgbWVzc2FnZSA9ICJUZXh0XG4iCisJCQkJLy8gV3JvbmcgbnVtYmVyIG9mIGRhc2hlcworCQkJCSsgIiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gPjggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iCisJCQkJKyAiTW9yZVxuTW9yZVxuIjsKKwkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIG1lc3NhZ2UgY2hhbmdlIiwgbWVzc2FnZSwKKwkJCQlDb21taXRDb25maWcuY2xlYW5UZXh0KG1lc3NhZ2UsIENsZWFudXBNb2RlLlNDSVNTT1JTLCAnIycpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RDbGVhblNjaXNzb3JzQXRFbmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIG1lc3NhZ2UgPSAiVGV4dFxuIgorCQkJCSsgIiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tID44IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIjsKKwkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIG1lc3NhZ2UgY2hhbmdlIiwgIlRleHRcbiIsCisJCQkJQ29tbWl0Q29uZmlnLmNsZWFuVGV4dChtZXNzYWdlLCBDbGVhbnVwTW9kZS5TQ0lTU09SUywgJyMnKSk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgQ29tbWl0Q29uZmlnIHBhcnNlKFN0cmluZyBjb250ZW50KQorCQkJdGhyb3dzIENvbmZpZ0ludmFsaWRFeGNlcHRpb24geworCQlDb25maWcgYyA9IG5ldyBDb25maWcoKTsKKwkJYy5mcm9tVGV4dChjb250ZW50KTsKKwkJcmV0dXJuIGMuZ2V0KENvbW1pdENvbmZpZy5LRVkpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9Db21taXRUZW1wbGF0ZUNvbmZpZ1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvQ29tbWl0VGVtcGxhdGVDb25maWdUZXN0LmphdmEKaW5kZXggNmRiZTMwYS4uNDJiYWZiNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9Db21taXRUZW1wbGF0ZUNvbmZpZ1Rlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGliL0NvbW1pdFRlbXBsYXRlQ29uZmlnVGVzdC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAyMSBTQVAgU0UgYW5kIG90aGVycworICogQ29weXJpZ2h0IChDKSAyMDIxLCAyMDIyIFNBUCBTRSBhbmQgb3RoZXJzCiAgKgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CkBAIC00Nyw4ICs0Nyw3IEBAIHB1YmxpYyB2b2lkIHRlc3RDb21taXRUZW1wbGF0ZVBhdGhJbkhvbWVEaXJlY29yeSgpCiAJCQkJIi50bXAiLCBuZXcgRmlsZShob21lRGlyKSk7CiAJCXRlbXBGaWxlSW5Ib21lRGlyZWN0b3J5LmRlbGV0ZU9uRXhpdCgpOwogCQlKR2l0VGVzdFV0aWwud3JpdGUodGVtcEZpbGVJbkhvbWVEaXJlY3RvcnksIHRlbXBsYXRlQ29udGVudCk7Ci0JCVN0cmluZyBleHBlY3RlZFRlbXBsYXRlUGF0aCA9IHRlbXBGaWxlSW5Ib21lRGlyZWN0b3J5LmdldFBhdGgoKQotCQkJCS5yZXBsYWNlKGhvbWVEaXIsICJ+Iik7CisJCVN0cmluZyBleHBlY3RlZFRlbXBsYXRlUGF0aCA9ICJ+LyIgKyB0ZW1wRmlsZUluSG9tZURpcmVjdG9yeS5nZXROYW1lKCk7CiAJCWNvbmZpZyA9IENvbmZpZ1Rlc3QKIAkJCQkucGFyc2UoIltjb21taXRdXG5cdHRlbXBsYXRlID0gIiArIGV4cGVjdGVkVGVtcGxhdGVQYXRoICsgIlxuIik7CiAJCVN0cmluZyB0ZW1wbGF0ZVBhdGggPSBjb25maWcuZ2V0KENvbW1pdENvbmZpZy5LRVkpCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGliL0NvbmZpZ1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvQ29uZmlnVGVzdC5qYXZhCmluZGV4IDliODJjMmEuLmE4NWE0ZjQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvQ29uZmlnVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvQ29uZmlnVGVzdC5qYXZhCkBAIC0xNDg4LDcgKzE0ODgsOCBAQCBwdWJsaWMgdm9pZCB0ZXN0Q29tbWl0VGVtcGxhdGVDb25maWcoKQogCQlTdHJpbmcgZXhwZWN0ZWRUZW1wbGF0ZVBhdGggPSB0ZW1wRmlsZS5nZXRQYXRoKCk7CiAKIAkJQ29uZmlnIGNvbmZpZyA9IHBhcnNlKAotCQkJCSJbY29tbWl0XVxuXHR0ZW1wbGF0ZSA9ICIgKyBleHBlY3RlZFRlbXBsYXRlUGF0aCArICJcbiIpOworCQkJCSJbY29tbWl0XVxuXHR0ZW1wbGF0ZSA9ICIKKwkJCQkJCSsgQ29uZmlnLmVzY2FwZVZhbHVlKGV4cGVjdGVkVGVtcGxhdGVQYXRoKSArICJcbiIpOwogCiAJCVN0cmluZyB0ZW1wbGF0ZVBhdGggPSBjb25maWcuZ2V0KENvbW1pdENvbmZpZy5LRVkpCiAJCQkJLmdldENvbW1pdFRlbXBsYXRlUGF0aCgpOwpAQCAtMTUzNyw3ICsxNTM4LDggQEAgcHVibGljIHZvaWQgdGVzdENvbW1pdFRlbXBsYXRlRW5jb2RpbmcoKQogCQlKR2l0VGVzdFV0aWwud3JpdGUodGVtcEZpbGUsIHRlbXBsYXRlQ29udGVudCk7CiAJCVN0cmluZyBleHBlY3RlZFRlbXBsYXRlUGF0aCA9IHRlbXBGaWxlLmdldFBhdGgoKTsKIAkJY29uZmlnID0gcGFyc2UoIltpMThuXVxuXHRjb21taXRFbmNvZGluZyA9IHV0Zi04XG4iCi0JCQkJKyAiW2NvbW1pdF1cblx0dGVtcGxhdGUgPSAiICsgZXhwZWN0ZWRUZW1wbGF0ZVBhdGggKyAiXG4iKTsKKwkJCQkrICJbY29tbWl0XVxuXHR0ZW1wbGF0ZSA9ICIKKwkJCQkrIENvbmZpZy5lc2NhcGVWYWx1ZShleHBlY3RlZFRlbXBsYXRlUGF0aCkgKyAiXG4iKTsKIAkJYXNzZXJ0RXF1YWxzKHRlbXBsYXRlQ29udGVudCwKIAkJCQljb25maWcuZ2V0KENvbW1pdENvbmZpZy5LRVkpLmdldENvbW1pdFRlbXBsYXRlQ29udGVudChyZXBvKSk7CiAJCVN0cmluZyBjb21taXRFbmNvZGluZyA9IGNvbmZpZy5nZXQoQ29tbWl0Q29uZmlnLktFWSkKQEAgLTE1NTYsNyArMTU1OCw4IEBAIHB1YmxpYyB2b2lkIHRlc3RDb21taXRUZW1wbGF0ZVdpdGhJbnZhbGlkRW5jb2RpbmcoKQogCQlTdHJpbmcgdGVtcGxhdGVDb250ZW50ID0gImNvbnRlbnQgb2YgdGhlIHRlbXBsYXRlIjsKIAkJSkdpdFRlc3RVdGlsLndyaXRlKHRlbXBGaWxlLCB0ZW1wbGF0ZUNvbnRlbnQpOwogCQljb25maWcgPSBwYXJzZSgiW2kxOG5dXG5cdGNvbW1pdEVuY29kaW5nID0gaW52YWxpZEVjb2RpbmdcbiIKLQkJCQkrICJbY29tbWl0XVxuXHR0ZW1wbGF0ZSA9ICIgKyB0ZW1wRmlsZS5nZXRQYXRoKCkgKyAiXG4iKTsKKwkJCQkrICJbY29tbWl0XVxuXHR0ZW1wbGF0ZSA9ICIKKwkJCQkrIENvbmZpZy5lc2NhcGVWYWx1ZSh0ZW1wRmlsZS5nZXRQYXRoKCkpICsgIlxuIik7CiAJCWNvbmZpZy5nZXQoQ29tbWl0Q29uZmlnLktFWSkuZ2V0Q29tbWl0VGVtcGxhdGVDb250ZW50KHJlcG8pOwogCX0KIApAQCAtMTU3MCw3ICsxNTczLDcgQEAgcHVibGljIHZvaWQgdGVzdENvbW1pdFRlbXBsYXRlV2l0aEludmFsaWRQYXRoKCkKIAkJU3RyaW5nIHRlbXBsYXRlQ29udGVudCA9ICJjb250ZW50IG9mIHRoZSB0ZW1wbGF0ZSI7CiAJCUpHaXRUZXN0VXRpbC53cml0ZSh0ZW1wRmlsZSwgdGVtcGxhdGVDb250ZW50KTsKIAkJLy8gY29tbWl0IG1lc3NhZ2UgZW5jb2RpbmcKLQkJU3RyaW5nIGV4cGVjdGVkVGVtcGxhdGVQYXRoID0gIi9ub25FeGlzdGluZ1RlbXBsYXRlIjsKKwkJU3RyaW5nIGV4cGVjdGVkVGVtcGxhdGVQYXRoID0gIn4vbm9uRXhpc3RpbmdUZW1wbGF0ZSI7CiAJCWNvbmZpZyA9IHBhcnNlKCJbY29tbWl0XVxuXHR0ZW1wbGF0ZSA9ICIgKyBleHBlY3RlZFRlbXBsYXRlUGF0aCArICJcbiIpOwogCQlTdHJpbmcgdGVtcGxhdGVQYXRoID0gY29uZmlnLmdldChDb21taXRDb25maWcuS0VZKQogCQkJCS5nZXRDb21taXRUZW1wbGF0ZVBhdGgoKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvRGlyQ2FjaGVDaGVja291dFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvRGlyQ2FjaGVDaGVja291dFRlc3QuamF2YQppbmRleCBhZjhhNThmLi4wZmFmY2Q2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGliL0RpckNhY2hlQ2hlY2tvdXRUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9EaXJDYWNoZUNoZWNrb3V0VGVzdC5qYXZhCkBAIC0yLDcgKzIsNyBAQAogICogQ29weXJpZ2h0IChDKSAyMDA3LCBEYXZlIFdhdHNvbiA8ZHdhdHNvbkBtaW12aXN0YS5jb20+CiAgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSwgU2hhd24gTy4gUGVhcmNlIDxzcGVhcmNlQHNwZWFyY2Uub3JnPgogICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEsIFJvYmluIFJvc2VuYmVyZyA8cm9iaW4ucm9zZW5iZXJnQGRld2lyZS5jb20+Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMTAsIDIwMjAgQ2hyaXN0aWFuIEhhbHN0cmljayA8Y2hyaXN0aWFuLmhhbHN0cmlja0BzYXAuY29tPiBhbmQgb3RoZXJzCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAsIDIwMjIgQ2hyaXN0aWFuIEhhbHN0cmljayA8Y2hyaXN0aWFuLmhhbHN0cmlja0BzYXAuY29tPiBhbmQgb3RoZXJzCiAgKgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CkBAIC0yNDIsNiArMjQyLDcgQEAgcHVibGljIHZvaWQgdGVzdEluaXRpYWxDaGVja291dCgpIHRocm93cyBFeGNlcHRpb24gewogCQlMaXN0ZW5lckhhbmRsZSBoYW5kbGUgPSBudWxsOwogCQl0cnkgKEdpdCBnaXQgPSBuZXcgR2l0KGRiKTsKIAkJCQlUZXN0UmVwb3NpdG9yeTxSZXBvc2l0b3J5PiBkYl90ID0gbmV3IFRlc3RSZXBvc2l0b3J5PD4oZGIpKSB7CisJCQlkYi5pbmNyZW1lbnRPcGVuKCk7CiAJCQloYW5kbGUgPSBkYi5nZXRMaXN0ZW5lckxpc3QoKQogCQkJCQkuYWRkV29ya2luZ1RyZWVNb2RpZmllZExpc3RlbmVyKHJlY29yZGVyKTsKIAkJCUJyYW5jaEJ1aWxkZXIgbWFzdGVyID0gZGJfdC5icmFuY2goIm1hc3RlciIpOwpAQCAtMjYxLDYgKzI2Miw3IEBAIHByaXZhdGUgdm9pZCBjaGVja291dExpbmVFbmRpbmdzKFN0cmluZyBpbkluZGV4LCBTdHJpbmcgZXhwZWN0ZWQsCiAJCQlTdHJpbmcgYXR0cmlidXRlcykgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXRyeSAoR2l0IGdpdCA9IG5ldyBHaXQoZGIpOwogCQkJCVRlc3RSZXBvc2l0b3J5PFJlcG9zaXRvcnk+IGRiX3QgPSBuZXcgVGVzdFJlcG9zaXRvcnk8PihkYikpIHsKKwkJCWRiLmluY3JlbWVudE9wZW4oKTsKIAkJCUJyYW5jaEJ1aWxkZXIgbWFzdGVyID0gZGJfdC5icmFuY2goIm1hc3RlciIpOwogCQkJbWFzdGVyLmNvbW1pdCgpLmFkZCgiZiIsIGluSW5kZXgpLm1lc3NhZ2UoIm0wIikuY3JlYXRlKCk7CiAJCQlpZiAoIVN0cmluZ1V0aWxzLmlzRW1wdHlPck51bGwoYXR0cmlidXRlcykpIHsKQEAgLTMxMyw4ICszMTUsOSBAQCBwdWJsaWMgdm9pZCB0ZXN0Q2hlY2tvdXRXaXRoTEYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdENoZWNrb3V0V2l0aExGQXV0bygpIHRocm93cyBFeGNlcHRpb24gewotCQljaGVja291dExpbmVFbmRpbmdzKCJmaXJzdCBsaW5lXG5zZWNvbmQgbGluZVxuIiwKLQkJCQkiZmlyc3QgbGluZVxuc2Vjb25kIGxpbmVcbiIsICJmIHRleHQ9YXV0byIpOworCQlTdHJpbmcgZXhwZWN0ZWQgPSBTdHJpbmcuZm9ybWF0KCJmaXJzdCBsaW5lJW5zZWNvbmQgbGluZSVuIik7CisJCWNoZWNrb3V0TGluZUVuZGluZ3MoImZpcnN0IGxpbmVcbnNlY29uZCBsaW5lXG4iLCBleHBlY3RlZCwKKwkJCQkiZiB0ZXh0PWF1dG8iKTsKIAl9CiAKIAlAVGVzdApAQCAtMzI1LDkgKzMyOCw5IEBAIHB1YmxpYyB2b2lkIHRlc3RDaGVja291dFdpdGhMRkF1dG9Fb2xMZigpIHRocm93cyBFeGNlcHRpb24gewogCiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0Q2hlY2tvdXRXaXRoTEZBdXRvRW9sTmF0aXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBleHBlY3RlZCA9IFN0cmluZy5mb3JtYXQoImZpcnN0IGxpbmUlbnNlY29uZCBsaW5lJW4iKTsKIAkJY2hlY2tvdXRMaW5lRW5kaW5ncygKLQkJCQkiZmlyc3QgbGluZVxuc2Vjb25kIGxpbmVcbiIsICJmaXJzdCBsaW5lXG5zZWNvbmQgbGluZVxuIgotCQkJCQkJLnJlcGxhY2VBbGwoIlxuIiwgU3lzdGVtLmxpbmVTZXBhcmF0b3IoKSksCisJCQkJImZpcnN0IGxpbmVcbnNlY29uZCBsaW5lXG4iLCBleHBlY3RlZCwKIAkJCQkiZiB0ZXh0PWF1dG8gZW9sPW5hdGl2ZSIpOwogCX0KIApAQCAtMjA2NCw2ICsyMDY3LDcgQEAgcHVibGljIHZvaWQgdGVzdFJlc2V0V2l0aENoYW5nZUluR2l0aWdub3JlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJcHVibGljIHZvaWQgdGVzdENoZWNrb3V0V2l0aEVtcHR5SW5kZXhEb2VzbnRPdmVyd3JpdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJdHJ5IChHaXQgZ2l0ID0gbmV3IEdpdChkYik7CiAJCQkJVGVzdFJlcG9zaXRvcnk8UmVwb3NpdG9yeT4gZGJfdCA9IG5ldyBUZXN0UmVwb3NpdG9yeTw+KGRiKSkgeworCQkJZGIuaW5jcmVtZW50T3BlbigpOwogCQkJLy8gcHJlcGFyZSB0aGUgY29tbWl0cwogCQkJQnJhbmNoQnVpbGRlciBtYXN0ZXIgPSBkYl90LmJyYW5jaCgibWFzdGVyIik7CiAJCQlSZXZDb21taXQgbWVyZ2VDb21taXQgPSBtYXN0ZXIuY29tbWl0KCkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvVDAwMDFfUGVyc29uSWRlbnRUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGliL1BlcnNvbklkZW50VGVzdC5qYXZhCnNpbWlsYXJpdHkgaW5kZXggNzUlCnJlbmFtZSBmcm9tIG9yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvVDAwMDFfUGVyc29uSWRlbnRUZXN0LmphdmEKcmVuYW1lIHRvIG9yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvUGVyc29uSWRlbnRUZXN0LmphdmEKaW5kZXggZTliYWI3Yy4uOTdkYTE3NSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9UMDAwMV9QZXJzb25JZGVudFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGliL1BlcnNvbklkZW50VGVzdC5qYXZhCkBAIC0xMywxMiArMTMsMTQgQEAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIAoraW1wb3J0IGphdmEudGltZS5JbnN0YW50OworaW1wb3J0IGphdmEudGltZS5ab25lSWQ7CiBpbXBvcnQgamF2YS51dGlsLkRhdGU7CiBpbXBvcnQgamF2YS51dGlsLlRpbWVab25lOwogCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKLXB1YmxpYyBjbGFzcyBUMDAwMV9QZXJzb25JZGVudFRlc3QgeworcHVibGljIGNsYXNzIFBlcnNvbklkZW50VGVzdCB7CiAKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3QwMDFfTmV3SWRlbnQoKSB7CkBAIC00Miw2ICs0NCwzNCBAQCBwdWJsaWMgdm9pZCB0ZXN0MDAyX05ld0lkZW50KCkgewogCQkJCXAudG9FeHRlcm5hbFN0cmluZygpKTsKIAl9CiAKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3ROZXdJZGVudEluc3RhbnQoKSB7CisJCVBlcnNvbklkZW50IHAgPSBuZXcgUGVyc29uSWRlbnQoIkEgVSBUaG9yIiwgImF1dGhvckBleGFtcGxlLmNvbSIsCisJCQkJSW5zdGFudC5vZkVwb2NoTWlsbGkoMTE0Mjg3ODUwMTAwMEwpLAorCQkJCVpvbmVJZC5vZigiQW1lcmljYS9OZXdfWW9yayIpKTsKKwkJYXNzZXJ0RXF1YWxzKCJBIFUgVGhvciIsIHAuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJhdXRob3JAZXhhbXBsZS5jb20iLCBwLmdldEVtYWlsQWRkcmVzcygpKTsKKwkJYXNzZXJ0RXF1YWxzKEluc3RhbnQub2ZFcG9jaE1pbGxpKDExNDI4Nzg1MDEwMDBMKSwKKwkJCQlwLmdldFdoZW5Bc0luc3RhbnQoKSk7CisJCWFzc2VydEVxdWFscygiQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4gMTE0Mjg3ODUwMSAtMDUwMCIsCisJCQkJcC50b0V4dGVybmFsU3RyaW5nKCkpOworCQlhc3NlcnRFcXVhbHMoWm9uZUlkLm9mKCJHTVQtMDU6MDAiKSwgcC5nZXRab25lSWQoKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0TmV3SWRlbnRJbnN0YW50MigpIHsKKwkJZmluYWwgUGVyc29uSWRlbnQgcCA9IG5ldyBQZXJzb25JZGVudCgiQSBVIFRob3IiLCAiYXV0aG9yQGV4YW1wbGUuY29tIiwKKwkJCQlJbnN0YW50Lm9mRXBvY2hNaWxsaSgxMTQyODc4NTAxMDAwTCksCisJCQkJWm9uZUlkLm9mKCJBc2lhL0tvbGthdGEiKSk7CisJCWFzc2VydEVxdWFscygiQSBVIFRob3IiLCBwLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiYXV0aG9yQGV4YW1wbGUuY29tIiwgcC5nZXRFbWFpbEFkZHJlc3MoKSk7CisJCWFzc2VydEVxdWFscyhJbnN0YW50Lm9mRXBvY2hNaWxsaSgxMTQyODc4NTAxMDAwTCksCisJCQkJcC5nZXRXaGVuQXNJbnN0YW50KCkpOworCQlhc3NlcnRFcXVhbHMoIkEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+IDExNDI4Nzg1MDEgKzA1MzAiLAorCQkJCXAudG9FeHRlcm5hbFN0cmluZygpKTsKKwkJYXNzZXJ0RXF1YWxzKFpvbmVJZC5vZigiR01UKzA1OjMwIiksIHAuZ2V0Wm9uZUlkKCkpOworCX0KKwogCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQogCUBUZXN0KGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzKQogCXB1YmxpYyB2b2lkIG51bGxGb3JOYW1lU2hvdWxkVGhyb3dJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbWVyZ2UvTWVyZ2VNZXNzYWdlRm9ybWF0dGVyVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L21lcmdlL01lcmdlTWVzc2FnZUZvcm1hdHRlclRlc3QuamF2YQppbmRleCBkZWRiNTZjLi5hMjU3NmNjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbWVyZ2UvTWVyZ2VNZXNzYWdlRm9ybWF0dGVyVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9tZXJnZS9NZXJnZU1lc3NhZ2VGb3JtYXR0ZXJUZXN0LmphdmEKQEAgLTEzLDYgKzEzLDcgQEAKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLk9iamVjdElkOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLk9iamVjdElkUmVmOwpAQCAtMTU3LDggKzE1OCw4IEBAIHB1YmxpYyB2b2lkIHRlc3RJbnRvU3ltYm9saWNSZWZIZWFkUG9pbnRpbmdUb01hc3RlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJcHVibGljIHZvaWQgdGVzdEZvcm1hdFdpdGhDb25mbGljdHNOb0Zvb3RlcigpIHsKIAkJU3RyaW5nIG9yaWdpbmFsTWVzc2FnZSA9ICJIZWFkZXIgTGluZVxuXG5Db21taXQgYm9keVxuIjsKIAkJU3RyaW5nIG1lc3NhZ2UgPSBmb3JtYXR0ZXIuZm9ybWF0V2l0aENvbmZsaWN0cyhvcmlnaW5hbE1lc3NhZ2UsCi0JCQkJQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAicGF0aDEiIH0pKTsKLQkJYXNzZXJ0RXF1YWxzKCJIZWFkZXIgTGluZVxuXG5Db21taXQgYm9keVxuXG5Db25mbGljdHM6XG5cdHBhdGgxXG4iLAorCQkJCUxpc3Qub2YoInBhdGgxIiksICcjJyk7CisJCWFzc2VydEVxdWFscygiSGVhZGVyIExpbmVcblxuQ29tbWl0IGJvZHlcblxuIyBDb25mbGljdHM6XG4jXHRwYXRoMVxuIiwKIAkJCQltZXNzYWdlKTsKIAl9CiAKQEAgLTE2Niw4ICsxNjcsMTcgQEAgcHVibGljIHZvaWQgdGVzdEZvcm1hdFdpdGhDb25mbGljdHNOb0Zvb3RlcigpIHsKIAlwdWJsaWMgdm9pZCB0ZXN0Rm9ybWF0V2l0aENvbmZsaWN0c05vRm9vdGVyTm9MaW5lQnJlYWsoKSB7CiAJCVN0cmluZyBvcmlnaW5hbE1lc3NhZ2UgPSAiSGVhZGVyIExpbmVcblxuQ29tbWl0IGJvZHkiOwogCQlTdHJpbmcgbWVzc2FnZSA9IGZvcm1hdHRlci5mb3JtYXRXaXRoQ29uZmxpY3RzKG9yaWdpbmFsTWVzc2FnZSwKLQkJCQlBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJwYXRoMSIgfSkpOwotCQlhc3NlcnRFcXVhbHMoIkhlYWRlciBMaW5lXG5cbkNvbW1pdCBib2R5XG5cbkNvbmZsaWN0czpcblx0cGF0aDFcbiIsCisJCQkJTGlzdC5vZigicGF0aDEiKSwgJyMnKTsKKwkJYXNzZXJ0RXF1YWxzKCJIZWFkZXIgTGluZVxuXG5Db21taXQgYm9keVxuXG4jIENvbmZsaWN0czpcbiNcdHBhdGgxXG4iLAorCQkJCW1lc3NhZ2UpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEZvcm1hdFdpdGhDb25mbGljdHNDdXN0b21DaGFyYWN0ZXIoKSB7CisJCVN0cmluZyBvcmlnaW5hbE1lc3NhZ2UgPSAiSGVhZGVyIExpbmVcblxuQ29tbWl0IGJvZHkiOworCQlTdHJpbmcgbWVzc2FnZSA9IGZvcm1hdHRlci5mb3JtYXRXaXRoQ29uZmxpY3RzKG9yaWdpbmFsTWVzc2FnZSwKKwkJCQlMaXN0Lm9mKCJwYXRoMSIpLCAnOycpOworCQlhc3NlcnRFcXVhbHMoIkhlYWRlciBMaW5lXG5cbkNvbW1pdCBib2R5XG5cbjsgQ29uZmxpY3RzOlxuO1x0cGF0aDFcbiIsCiAJCQkJbWVzc2FnZSk7CiAJfQogCkBAIC0xNzYsOSArMTg2LDkgQEAgcHVibGljIHZvaWQgdGVzdEZvcm1hdFdpdGhDb25mbGljdHNXaXRoRm9vdGVycygpIHsKIAkJU3RyaW5nIG9yaWdpbmFsTWVzc2FnZSA9ICJIZWFkZXIgTGluZVxuXG5Db21taXQgYm9keVxuXG5DaGFuZ2VJZDoiCiAJCQkJKyAiIEkxMjM0NTY3ODkxMjM0NTY3ODkxMjM0NTY3ODkxMjM0NTY3ODlcbkJ1ZzoxMjM0NTY3XG4iOwogCQlTdHJpbmcgbWVzc2FnZSA9IGZvcm1hdHRlci5mb3JtYXRXaXRoQ29uZmxpY3RzKG9yaWdpbmFsTWVzc2FnZSwKLQkJCQlBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJwYXRoMSIgfSkpOworCQkJCUxpc3Qub2YoInBhdGgxIiksICcjJyk7CiAJCWFzc2VydEVxdWFscygKLQkJCQkiSGVhZGVyIExpbmVcblxuQ29tbWl0IGJvZHlcblxuQ29uZmxpY3RzOlxuXHRwYXRoMVxuXG4iCisJCQkJIkhlYWRlciBMaW5lXG5cbkNvbW1pdCBib2R5XG5cbiMgQ29uZmxpY3RzOlxuI1x0cGF0aDFcblxuIgogCQkJCQkJKyAiQ2hhbmdlSWQ6IEkxMjM0NTY3ODkxMjM0NTY3ODkxMjM0NTY3ODkxMjM0NTY3ODlcbkJ1ZzoxMjM0NTY3XG4iLAogCQkJCW1lc3NhZ2UpOwogCX0KQEAgLTE4OCw5ICsxOTgsOSBAQCBwdWJsaWMgdm9pZCB0ZXN0Rm9ybWF0V2l0aENvbmZsaWN0c1dpdGhGb290ZXJsaWtlTGluZUluQm9keSgpIHsKIAkJU3RyaW5nIG9yaWdpbmFsTWVzc2FnZSA9ICJIZWFkZXIgTGluZVxuXG5Db21taXQgYm9keVxuQnVnOjEyMzQ1Njdcbk1vcmUgQm9keVxuXG5DaGFuZ2VJZDoiCiAJCQkJKyAiIEkxMjM0NTY3ODkxMjM0NTY3ODkxMjM0NTY3ODkxMjM0NTY3ODlcbkJ1ZzoxMjM0NTY3XG4iOwogCQlTdHJpbmcgbWVzc2FnZSA9IGZvcm1hdHRlci5mb3JtYXRXaXRoQ29uZmxpY3RzKG9yaWdpbmFsTWVzc2FnZSwKLQkJCQlBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJwYXRoMSIgfSkpOworCQkJCUxpc3Qub2YoInBhdGgxIiksICcjJyk7CiAJCWFzc2VydEVxdWFscygKLQkJCQkiSGVhZGVyIExpbmVcblxuQ29tbWl0IGJvZHlcbkJ1ZzoxMjM0NTY3XG5Nb3JlIEJvZHlcblxuQ29uZmxpY3RzOlxuXHRwYXRoMVxuXG4iCisJCQkJIkhlYWRlciBMaW5lXG5cbkNvbW1pdCBib2R5XG5CdWc6MTIzNDU2N1xuTW9yZSBCb2R5XG5cbiMgQ29uZmxpY3RzOlxuI1x0cGF0aDFcblxuIgogCQkJCQkJKyAiQ2hhbmdlSWQ6IEkxMjM0NTY3ODkxMjM0NTY3ODkxMjM0NTY3ODkxMjM0NTY3ODlcbkJ1ZzoxMjM0NTY3XG4iLAogCQkJCW1lc3NhZ2UpOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9tZXJnZS9NZXJnZXJUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbWVyZ2UvTWVyZ2VyVGVzdC5qYXZhCmluZGV4IGRkODU3M2QuLmNiYWNhZWQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9tZXJnZS9NZXJnZXJUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L21lcmdlL01lcmdlclRlc3QuamF2YQpAQCAtMTgxMCw2ICsxODEwLDcgQEAgcHJpdmF0ZSB2b2lkIGNoZWNrTW9kaWZpY2F0aW9uVGltZVN0YW1wT3JkZXIoU3RyaW5nLi4uIHBhdGhlcykgewogCXByaXZhdGUgU3RyaW5nIHJlYWRCbG9iKE9iamVjdElkIHRyZWVpc2gsIFN0cmluZyBwYXRoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJdHJ5IChUZXN0UmVwb3NpdG9yeTw/PiB0ciA9IG5ldyBUZXN0UmVwb3NpdG9yeTw+KGRiKTsKIAkJCQlSZXZXYWxrIHJ3ID0gdHIuZ2V0UmV2V2FsaygpKSB7CisJCQlkYi5pbmNyZW1lbnRPcGVuKCk7CiAJCQlSZXZUcmVlIHRyZWUgPSBydy5wYXJzZVRyZWUodHJlZWlzaCk7CiAJCQlSZXZPYmplY3Qgb2JqID0gdHIuZ2V0KHRyZWUsIHBhdGgpOwogCQkJaWYgKG9iaiA9PSBudWxsKSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvc3VibW9kdWxlL1N1Ym1vZHVsZVdhbGtUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvc3VibW9kdWxlL1N1Ym1vZHVsZVdhbGtUZXN0LmphdmEKaW5kZXggZWE5OTRmMC4uZjQ0NmQwNyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3N1Ym1vZHVsZS9TdWJtb2R1bGVXYWxrVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9zdWJtb2R1bGUvU3VibW9kdWxlV2Fsa1Rlc3QuamF2YQpAQCAtMjE3LDcgKzIxNyw2IEBAIHB1YmxpYyB2b2lkIGFwcGx5KERpckNhY2hlRW50cnkgZW50KSB7CiAJCQkJYXNzZXJ0RXF1YWxzRmlsZShtb2R1bGVzR2l0RGlyLCBzdWJSZXBvLmdldERpcmVjdG9yeSgpKTsKIAkJCQlhc3NlcnRFcXVhbHNGaWxlKG5ldyBGaWxlKGRiLmdldFdvcmtUcmVlKCksIHBhdGgpLAogCQkJCQkJc3ViUmVwby5nZXRXb3JrVHJlZSgpKTsKLQkJCQlzdWJSZXBvLmNsb3NlKCk7CiAJCQkJYXNzZXJ0RmFsc2UoZ2VuLm5leHQoKSk7CiAJCQl9CiAJCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvQnVuZGxlV3JpdGVyVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9CdW5kbGVXcml0ZXJUZXN0LmphdmEKaW5kZXggMDU0ZWI5Yy4uYmI2MmEwZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9CdW5kbGVXcml0ZXJUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9CdW5kbGVXcml0ZXJUZXN0LmphdmEKQEAgLTgwLDYgKzgwLDcgQEAgcHVibGljIHZvaWQgdGVzdFdyaXRlU2luZ2xlUmVmKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCS8vIFRoZW4gd2UgY2xvbmUgYSBuZXcgcmVwbyBmcm9tIHRoYXQgYnVuZGxlIGFuZCBkbyBhIHNpbXBsZSB0ZXN0LiBUaGlzCiAJCS8vIG1ha2VzIHN1cmUgd2UgY291bGQgcmVhZCB0aGUgYnVuZGxlIHdlIGNyZWF0ZWQuCiAJCVJlcG9zaXRvcnkgbmV3UmVwbyA9IGNyZWF0ZUJhcmVSZXBvc2l0b3J5KCk7CisJCWFkZFJlcG9Ub0Nsb3NlKG5ld1JlcG8pOwogCQlGZXRjaFJlc3VsdCBmZXRjaFJlc3VsdCA9IGZldGNoRnJvbUJ1bmRsZShuZXdSZXBvLCBidW5kbGUpOwogCQlSZWYgYWR2ZXJ0aXNlZFJlZiA9IGZldGNoUmVzdWx0CiAJCQkJLmdldEFkdmVydGlzZWRSZWYoInJlZnMvaGVhZHMvZmlyc3Rjb21taXQiKTsKQEAgLTExNiw2ICsxMTcsNyBAQCBwdWJsaWMgdm9pZCB0ZXN0SW5jcmVtZW50YWxCdW5kbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJLy8gbWFrZXMgc3VyZQogCQkvLyB3ZSBjb3VsZCByZWFkIHRoZSBidW5kbGUgd2UgY3JlYXRlZC4KIAkJUmVwb3NpdG9yeSBuZXdSZXBvID0gY3JlYXRlQmFyZVJlcG9zaXRvcnkoKTsKKwkJYWRkUmVwb1RvQ2xvc2UobmV3UmVwbyk7CiAJCUZldGNoUmVzdWx0IGZldGNoUmVzdWx0ID0gZmV0Y2hGcm9tQnVuZGxlKG5ld1JlcG8sIGJ1bmRsZSk7CiAJCVJlZiBhZHZlcnRpc2VkUmVmID0gZmV0Y2hSZXN1bHQuZ2V0QWR2ZXJ0aXNlZFJlZigicmVmcy9oZWFkcy9hYSIpOwogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1BhY2tQYXJzZXJUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1BhY2tQYXJzZXJUZXN0LmphdmEKaW5kZXggNjBiODA5OC4uOTNiZWRiMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QYWNrUGFyc2VyVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUGFja1BhcnNlclRlc3QuamF2YQpAQCAtMTEwLDYgKzExMCw3IEBAIHB1YmxpYyB2b2lkIHRlc3QyKCkgdGhyb3dzICBJT0V4Y2VwdGlvbiB7CiAJcHVibGljIHZvaWQgdGVzdFRpbnlUaGluUGFjaygpIHRocm93cyBFeGNlcHRpb24gewogCQlSZXZCbG9iIGE7CiAJCXRyeSAoVGVzdFJlcG9zaXRvcnkgZCA9IG5ldyBUZXN0UmVwb3NpdG9yeTxSZXBvc2l0b3J5PihkYikpIHsKKwkJCWRiLmluY3JlbWVudE9wZW4oKTsKIAkJCWEgPSBkLmJsb2IoImEiKTsKIAkJfQogCkBAIC0xMzIsNiArMTMzLDcgQEAgcHVibGljIHZvaWQgdGVzdFRpbnlUaGluUGFjaygpIHRocm93cyBFeGNlcHRpb24gewogCXB1YmxpYyB2b2lkIHRlc3RQYWNrV2l0aER1cGxpY2F0ZUJsb2IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJZmluYWwgYnl0ZVtdIGRhdGEgPSBDb25zdGFudHMuZW5jb2RlKCIwMTIzNDU2Nzg5YWJjZGVmZyIpOwogCQl0cnkgKFRlc3RSZXBvc2l0b3J5PFJlcG9zaXRvcnk+IGQgPSBuZXcgVGVzdFJlcG9zaXRvcnk8PihkYikpIHsKKwkJCWRiLmluY3JlbWVudE9wZW4oKTsKIAkJCWFzc2VydFRydWUoZGIuZ2V0T2JqZWN0RGF0YWJhc2UoKS5oYXMoZC5ibG9iKGRhdGEpKSk7CiAJCX0KIApAQCAtMTUxLDYgKzE1Myw3IEBAIHB1YmxpYyB2b2lkIHRlc3RQYWNrV2l0aER1cGxpY2F0ZUJsb2IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAlwdWJsaWMgdm9pZCB0ZXN0UGFja1dpdGhUcmFpbGluZ0dhcmJhZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJUmV2QmxvYiBhOwogCQl0cnkgKFRlc3RSZXBvc2l0b3J5IGQgPSBuZXcgVGVzdFJlcG9zaXRvcnk8UmVwb3NpdG9yeT4oZGIpKSB7CisJCQlkYi5pbmNyZW1lbnRPcGVuKCk7CiAJCQlhID0gZC5ibG9iKCJhIik7CiAJCX0KIApAQCAtMTgwLDYgKzE4Myw3IEBAIHB1YmxpYyB2b2lkIHRlc3RQYWNrV2l0aFRyYWlsaW5nR2FyYmFnZSgpIHRocm93cyBFeGNlcHRpb24gewogCXB1YmxpYyB2b2lkIHRlc3RNYXhPYmplY3RTaXplRnVsbEJsb2IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJZmluYWwgYnl0ZVtdIGRhdGEgPSBDb25zdGFudHMuZW5jb2RlKCIwMTIzNDU2Nzg5Iik7CiAJCXRyeSAoVGVzdFJlcG9zaXRvcnkgZCA9IG5ldyBUZXN0UmVwb3NpdG9yeTxSZXBvc2l0b3J5PihkYikpIHsKKwkJCWRiLmluY3JlbWVudE9wZW4oKTsKIAkJCWQuYmxvYihkYXRhKTsKIAkJfQogCkBAIC0yMTMsNiArMjE3LDcgQEAgcHVibGljIHZvaWQgdGVzdE1heE9iamVjdFNpemVGdWxsQmxvYigpIHRocm93cyBFeGNlcHRpb24gewogCXB1YmxpYyB2b2lkIHRlc3RNYXhPYmplY3RTaXplRGVsdGFCbG9jaygpIHRocm93cyBFeGNlcHRpb24gewogCQlSZXZCbG9iIGE7CiAJCXRyeSAoVGVzdFJlcG9zaXRvcnkgZCA9IG5ldyBUZXN0UmVwb3NpdG9yeTxSZXBvc2l0b3J5PihkYikpIHsKKwkJCWRiLmluY3JlbWVudE9wZW4oKTsKIAkJCWEgPSBkLmJsb2IoImEiKTsKIAkJfQogCkBAIC0yNDYsNiArMjUxLDcgQEAgcHVibGljIHZvaWQgdGVzdE1heE9iamVjdFNpemVEZWx0YUJsb2NrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJcHVibGljIHZvaWQgdGVzdE1heE9iamVjdFNpemVEZWx0YVJlc3VsdFNpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJUmV2QmxvYiBhOwogCQl0cnkgKFRlc3RSZXBvc2l0b3J5IGQgPSBuZXcgVGVzdFJlcG9zaXRvcnk8UmVwb3NpdG9yeT4oZGIpKSB7CisJCQlkYi5pbmNyZW1lbnRPcGVuKCk7CiAJCQlhID0gZC5ibG9iKCIwMTIzNDU2Nzg5Iik7CiAJCX0KIApAQCAtMjc4LDYgKzI4NCw3IEBAIHB1YmxpYyB2b2lkIHRlc3RNYXhPYmplY3RTaXplRGVsdGFSZXN1bHRTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJcHVibGljIHZvaWQgdGVzdE5vbk1hcmtpbmdJbnB1dFN0cmVhbSgpIHRocm93cyBFeGNlcHRpb24gewogCQlSZXZCbG9iIGE7CiAJCXRyeSAoVGVzdFJlcG9zaXRvcnkgZCA9IG5ldyBUZXN0UmVwb3NpdG9yeTxSZXBvc2l0b3J5PihkYikpIHsKKwkJCWRiLmluY3JlbWVudE9wZW4oKTsKIAkJCWEgPSBkLmJsb2IoImEiKTsKIAkJfQogCkBAIC0zMTgsNiArMzI1LDcgQEAgcHVibGljIHZvaWQgbWFyayhpbnQgbWF4bGVuZ3RoKSB7CiAJcHVibGljIHZvaWQgdGVzdERhdGFBZnRlclBhY2tGb290ZXJTaW5nbGVSZWFkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCVJldkJsb2IgYTsKIAkJdHJ5IChUZXN0UmVwb3NpdG9yeSBkID0gbmV3IFRlc3RSZXBvc2l0b3J5PFJlcG9zaXRvcnk+KGRiKSkgeworCQkJZGIuaW5jcmVtZW50T3BlbigpOwogCQkJYSA9IGQuYmxvYigiYSIpOwogCQl9CiAKQEAgLTM3OSw2ICszODcsNyBAQCBwdWJsaWMgdm9pZCB0ZXN0RGF0YUFmdGVyUGFja0Zvb3RlclNwbGl0SGVhZGVyUmVhZCgpIHRocm93cyBFeGNlcHRpb24gewogCQlmaW5hbCBieXRlW10gZGF0YSA9IENvbnN0YW50cy5lbmNvZGUoImEiKTsKIAkJUmV2QmxvYiBiOwogCQl0cnkgKFRlc3RSZXBvc2l0b3J5IGQgPSBuZXcgVGVzdFJlcG9zaXRvcnk8UmVwb3NpdG9yeT4oZGIpKSB7CisJCQlkYi5pbmNyZW1lbnRPcGVuKCk7CiAJCQliID0gZC5ibG9iKGRhdGEpOwogCQl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUHVzaENvbmZpZ1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUHVzaENvbmZpZ1Rlc3QuamF2YQppbmRleCA2MTA5ZDZjLi5jYmMxZDU0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1B1c2hDb25maWdUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QdXNoQ29uZmlnVGVzdC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNywgRGF2aWQgUHVyc2Vob3VzZSA8ZGF2aWQucHVyc2Vob3VzZUBnbWFpbC5jb20+IGFuZCBvdGhlcnMKKyAqIENvcHlyaWdodCAoQykgMjAxNywgMjAyMiBEYXZpZCBQdXJzZWhvdXNlIDxkYXZpZC5wdXJzZWhvdXNlQGdtYWlsLmNvbT4gYW5kIG90aGVycwogICoKICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdApAQCAtMTQsMTAgKzE0LDEzIEBACiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbmZpZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5QdXNoQ29uZmlnLlB1c2hEZWZhdWx0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlB1c2hDb25maWcuUHVzaFJlY3Vyc2VTdWJtb2R1bGVzTW9kZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAogcHVibGljIGNsYXNzIFB1c2hDb25maWdUZXN0IHsKKwogCUBUZXN0CiAJcHVibGljIHZvaWQgcHVzaFJlY3Vyc2VTdWJtb2R1bGVNYXRjaCgpIHRocm93cyBFeGNlcHRpb24gewogCQlhc3NlcnRUcnVlKFB1c2hSZWN1cnNlU3VibW9kdWxlc01vZGUuQ0hFQ0subWF0Y2hDb25maWdWYWx1ZSgiY2hlY2siKSk7CkBAIC01Miw0ICs1NSw1OSBAQCBwdWJsaWMgdm9pZCBwdXNoUmVjdXJzZVN1Ym1vZHVsZVRvQ29uZmlnVmFsdWUoKSB7CiAJCWFzc2VydEVxdWFscygiY2hlY2siLCBQdXNoUmVjdXJzZVN1Ym1vZHVsZXNNb2RlLkNIRUNLLnRvQ29uZmlnVmFsdWUoKSk7CiAJCWFzc2VydEVxdWFscygiZmFsc2UiLCBQdXNoUmVjdXJzZVN1Ym1vZHVsZXNNb2RlLk5PLnRvQ29uZmlnVmFsdWUoKSk7CiAJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBwdXNoRGVmYXVsdE1hdGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWFzc2VydFRydWUoUHVzaERlZmF1bHQuTk9USElORy5tYXRjaENvbmZpZ1ZhbHVlKCJub3RoaW5nIikpOworCQlhc3NlcnRUcnVlKFB1c2hEZWZhdWx0Lk5PVEhJTkcubWF0Y2hDb25maWdWYWx1ZSgiTk9USElORyIpKTsKKwkJYXNzZXJ0VHJ1ZShQdXNoRGVmYXVsdC5DVVJSRU5ULm1hdGNoQ29uZmlnVmFsdWUoImN1cnJlbnQiKSk7CisJCWFzc2VydFRydWUoUHVzaERlZmF1bHQuQ1VSUkVOVC5tYXRjaENvbmZpZ1ZhbHVlKCJDVVJSRU5UIikpOworCQlhc3NlcnRUcnVlKFB1c2hEZWZhdWx0LlVQU1RSRUFNLm1hdGNoQ29uZmlnVmFsdWUoInVwc3RyZWFtIikpOworCQlhc3NlcnRUcnVlKFB1c2hEZWZhdWx0LlVQU1RSRUFNLm1hdGNoQ29uZmlnVmFsdWUoIlVQU1RSRUFNIikpOworCQlhc3NlcnRUcnVlKFB1c2hEZWZhdWx0LlVQU1RSRUFNLm1hdGNoQ29uZmlnVmFsdWUoInRyYWNraW5nIikpOworCQlhc3NlcnRUcnVlKFB1c2hEZWZhdWx0LlVQU1RSRUFNLm1hdGNoQ29uZmlnVmFsdWUoIlRSQUNLSU5HIikpOworCQlhc3NlcnRUcnVlKFB1c2hEZWZhdWx0LlNJTVBMRS5tYXRjaENvbmZpZ1ZhbHVlKCJzaW1wbGUiKSk7CisJCWFzc2VydFRydWUoUHVzaERlZmF1bHQuU0lNUExFLm1hdGNoQ29uZmlnVmFsdWUoIlNJTVBMRSIpKTsKKwkJYXNzZXJ0VHJ1ZShQdXNoRGVmYXVsdC5NQVRDSElORy5tYXRjaENvbmZpZ1ZhbHVlKCJtYXRjaGluZyIpKTsKKwkJYXNzZXJ0VHJ1ZShQdXNoRGVmYXVsdC5NQVRDSElORy5tYXRjaENvbmZpZ1ZhbHVlKCJNQVRDSElORyIpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHB1c2hEZWZhdWx0Tm9NYXRjaCgpIHRocm93cyBFeGNlcHRpb24geworCQlhc3NlcnRGYWxzZShQdXNoRGVmYXVsdC5OT1RISU5HLm1hdGNoQ29uZmlnVmFsdWUoIm4iKSk7CisJCWFzc2VydEZhbHNlKFB1c2hEZWZhdWx0LkNVUlJFTlQubWF0Y2hDb25maWdWYWx1ZSgiIikpOworCQlhc3NlcnRGYWxzZShQdXNoRGVmYXVsdC5VUFNUUkVBTS5tYXRjaENvbmZpZ1ZhbHVlKCJ0cmFjayIpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHB1c2hEZWZhdWx0VG9Db25maWdWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24geworCQlhc3NlcnRFcXVhbHMoIm5vdGhpbmciLCBQdXNoRGVmYXVsdC5OT1RISU5HLnRvQ29uZmlnVmFsdWUoKSk7CisJCWFzc2VydEVxdWFscygiY3VycmVudCIsIFB1c2hEZWZhdWx0LkNVUlJFTlQudG9Db25maWdWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJ1cHN0cmVhbSIsIFB1c2hEZWZhdWx0LlVQU1RSRUFNLnRvQ29uZmlnVmFsdWUoKSk7CisJCWFzc2VydEVxdWFscygic2ltcGxlIiwgUHVzaERlZmF1bHQuU0lNUExFLnRvQ29uZmlnVmFsdWUoKSk7CisJCWFzc2VydEVxdWFscygibWF0Y2hpbmciLCBQdXNoRGVmYXVsdC5NQVRDSElORy50b0NvbmZpZ1ZhbHVlKCkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEVtcHR5Q29uZmlnKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVB1c2hDb25maWcgY2ZnID0gcGFyc2UoIiIpOworCQlhc3NlcnRFcXVhbHMoUHVzaFJlY3Vyc2VTdWJtb2R1bGVzTW9kZS5OTywgY2ZnLmdldFJlY3Vyc2VTdWJtb2R1bGVzKCkpOworCQlhc3NlcnRFcXVhbHMoUHVzaERlZmF1bHQuU0lNUExFLCBjZmcuZ2V0UHVzaERlZmF1bHQoKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0Q29uZmlnKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVB1c2hDb25maWcgY2ZnID0gcGFyc2UoCisJCQkJIltwdXNoXVxuXHRkZWZhdWx0ID0gdHJhY2tpbmdcblx0cmVjdXJzZVN1Ym1vZHVsZXMgPSBvbi1kZW1hbmRcbiIpOworCQlhc3NlcnRFcXVhbHMoUHVzaFJlY3Vyc2VTdWJtb2R1bGVzTW9kZS5PTl9ERU1BTkQsCisJCQkJY2ZnLmdldFJlY3Vyc2VTdWJtb2R1bGVzKCkpOworCQlhc3NlcnRFcXVhbHMoUHVzaERlZmF1bHQuVVBTVFJFQU0sIGNmZy5nZXRQdXNoRGVmYXVsdCgpKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBQdXNoQ29uZmlnIHBhcnNlKFN0cmluZyBjb250ZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJQ29uZmlnIGMgPSBuZXcgQ29uZmlnKCk7CisJCWMuZnJvbVRleHQoY29udGVudCk7CisJCXJldHVybiBjLmdldChQdXNoQ29uZmlnOjpuZXcpOworCX0KKwogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QdXNoUHJvY2Vzc1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUHVzaFByb2Nlc3NUZXN0LmphdmEKaW5kZXggNjkyODg1OS4uMmU4YjMwZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QdXNoUHJvY2Vzc1Rlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1B1c2hQcm9jZXNzVGVzdC5qYXZhCkBAIC0xNCwxNCArMTQsMTkgQEAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiAKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzOwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnMuQWJvcnRlZEJ5SG9va0V4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5Ob3RTdXBwb3J0ZWRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuVHJhbnNwb3J0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaG9va3MuUHJlUHVzaEhvb2s7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0SWQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0SWRSZWY7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUHJvZ3Jlc3NNb25pdG9yOwpAQCAtMzEsNiArMzYsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlRleHRQcm9ncmVzc01vbml0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50ZXN0LnJlc291cmNlcy5TYW1wbGVEYXRhUmVwb3NpdG9yeVRlc3RDYXNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlJlbW90ZVJlZlVwZGF0ZS5TdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLmlvLk51bGxPdXRwdXRTdHJlYW07CiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIApAQCAtMjIwLDcgKzIyNiwxNyBAQCBwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlVW5leHBlY3RlZFJlbW90ZVZzRm9yY2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJCQkJLmZyb21TdHJpbmcoIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEiKSk7CiAJCWZpbmFsIFJlZiByZWYgPSBuZXcgT2JqZWN0SWRSZWYuVW5wZWVsZWQoUmVmLlN0b3JhZ2UuTE9PU0UsICJyZWZzL2hlYWRzL21hc3RlciIsCiAJCQkJT2JqZWN0SWQuZnJvbVN0cmluZygiYWM3ZTdlNDRjMTg4NWVmYjQ3MmFkNTRhNzgzMjdkNjZiZmM0ZWNlZiIpKTsKLQkJdGVzdE9uZVVwZGF0ZVN0YXR1cyhycnUsIHJlZiwgU3RhdHVzLlJFSkVDVEVEX1JFTU9URV9DSEFOR0VELCBudWxsKTsKKwkJdHJ5IChCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYnl0ZXMgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisJCQkJUHJpbnRTdHJlYW0gb3V0ID0gbmV3IFByaW50U3RyZWFtKGJ5dGVzLCB0cnVlLAorCQkJCQkJU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7CisJCQkJUHJpbnRTdHJlYW0gZXJyID0gbmV3IFByaW50U3RyZWFtKE51bGxPdXRwdXRTdHJlYW0uSU5TVEFOQ0UpKSB7CisJCQlNb2NrUHJlUHVzaEhvb2sgaG9vayA9IG5ldyBNb2NrUHJlUHVzaEhvb2soZGIsIG91dCwgZXJyKTsKKwkJCXRlc3RPbmVVcGRhdGVTdGF0dXMocnJ1LCByZWYsIFN0YXR1cy5SRUpFQ1RFRF9SRU1PVEVfQ0hBTkdFRCwgbnVsbCwKKwkJCQkJaG9vayk7CisJCQlvdXQuZmx1c2goKTsKKwkJCVN0cmluZyByZXN1bHQgPSBuZXcgU3RyaW5nKGJ5dGVzLnRvU3RyaW5nKFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpKTsKKwkJCWFzc2VydEVxdWFscygiIiwgcmVzdWx0KTsKKwkJfQogCX0KIAogCS8qKgpAQCAtMjU2LDEwICsyNzIsMjIgQEAgcHVibGljIHZvaWQgdGVzdFVwZGF0ZU1peGVkQ2FzZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlyZWZVcGRhdGVzLmFkZChycnVPayk7CiAJCXJlZlVwZGF0ZXMuYWRkKHJydVJlamVjdCk7CiAJCWFkdmVydGlzZWRSZWZzLmFkZChyZWZUb0NoYW5nZSk7Ci0JCWV4ZWN1dGVQdXNoKCk7Ci0JCWFzc2VydEVxdWFscyhTdGF0dXMuT0ssIHJydU9rLmdldFN0YXR1cygpKTsKLQkJYXNzZXJ0VHJ1ZShycnVPay5pc0Zhc3RGb3J3YXJkKCkpOwotCQlhc3NlcnRFcXVhbHMoU3RhdHVzLk5PTl9FWElTVElORywgcnJ1UmVqZWN0LmdldFN0YXR1cygpKTsKKwkJdHJ5IChCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYnl0ZXMgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisJCQkJUHJpbnRTdHJlYW0gb3V0ID0gbmV3IFByaW50U3RyZWFtKGJ5dGVzLCB0cnVlLAorCQkJCQkJU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7CisJCQkJUHJpbnRTdHJlYW0gZXJyID0gbmV3IFByaW50U3RyZWFtKE51bGxPdXRwdXRTdHJlYW0uSU5TVEFOQ0UpKSB7CisJCQlNb2NrUHJlUHVzaEhvb2sgaG9vayA9IG5ldyBNb2NrUHJlUHVzaEhvb2soZGIsIG91dCwgZXJyKTsKKwkJCWV4ZWN1dGVQdXNoKGhvb2spOworCQkJYXNzZXJ0RXF1YWxzKFN0YXR1cy5PSywgcnJ1T2suZ2V0U3RhdHVzKCkpOworCQkJYXNzZXJ0VHJ1ZShycnVPay5pc0Zhc3RGb3J3YXJkKCkpOworCQkJYXNzZXJ0RXF1YWxzKFN0YXR1cy5OT05fRVhJU1RJTkcsIHJydVJlamVjdC5nZXRTdGF0dXMoKSk7CisJCQlvdXQuZmx1c2goKTsKKwkJCVN0cmluZyByZXN1bHQgPSBuZXcgU3RyaW5nKGJ5dGVzLnRvU3RyaW5nKFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpKTsKKwkJCWFzc2VydEVxdWFscygKKwkJCQkJIm51bGwgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAiCisJCQkJCQkJKyAicmVmcy9oZWFkcy9tYXN0ZXIgMmMzNDkzMzViN2Y3OTcwNzJjZjcyOWM0ZjNiYjA5MTRlY2I2ZGVjOVxuIiwKKwkJCQkJcmVzdWx0KTsKKwkJfQogCX0KIAogCS8qKgpAQCAtMzQ2LDEwICszNzQsMTggQEAgcHJpdmF0ZSBQdXNoUmVzdWx0IHRlc3RPbmVVcGRhdGVTdGF0dXMoZmluYWwgUmVtb3RlUmVmVXBkYXRlIHJydSwKIAkJCWZpbmFsIFJlZiBhZHZlcnRpc2VkUmVmLCBmaW5hbCBTdGF0dXMgZXhwZWN0ZWRTdGF0dXMsCiAJCQlCb29sZWFuIGZhc3RGb3J3YXJkKSB0aHJvd3MgTm90U3VwcG9ydGVkRXhjZXB0aW9uLAogCQkJVHJhbnNwb3J0RXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRlc3RPbmVVcGRhdGVTdGF0dXMocnJ1LCBhZHZlcnRpc2VkUmVmLCBleHBlY3RlZFN0YXR1cywKKwkJCQlmYXN0Rm9yd2FyZCwgbnVsbCk7CisJfQorCisJcHJpdmF0ZSBQdXNoUmVzdWx0IHRlc3RPbmVVcGRhdGVTdGF0dXMoZmluYWwgUmVtb3RlUmVmVXBkYXRlIHJydSwKKwkJCWZpbmFsIFJlZiBhZHZlcnRpc2VkUmVmLCBmaW5hbCBTdGF0dXMgZXhwZWN0ZWRTdGF0dXMsCisJCQlCb29sZWFuIGZhc3RGb3J3YXJkLCBQcmVQdXNoSG9vayBob29rKQorCQkJdGhyb3dzIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiwgVHJhbnNwb3J0RXhjZXB0aW9uIHsKIAkJcmVmVXBkYXRlcy5hZGQocnJ1KTsKIAkJaWYgKGFkdmVydGlzZWRSZWYgIT0gbnVsbCkKIAkJCWFkdmVydGlzZWRSZWZzLmFkZChhZHZlcnRpc2VkUmVmKTsKLQkJZmluYWwgUHVzaFJlc3VsdCByZXN1bHQgPSBleGVjdXRlUHVzaCgpOworCQlmaW5hbCBQdXNoUmVzdWx0IHJlc3VsdCA9IGV4ZWN1dGVQdXNoKGhvb2spOwogCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdGF0dXMsIHJydS5nZXRTdGF0dXMoKSk7CiAJCWlmIChmYXN0Rm9yd2FyZCAhPSBudWxsKQogCQkJYXNzZXJ0RXF1YWxzKGZhc3RGb3J3YXJkLCBCb29sZWFuLnZhbHVlT2YocnJ1LmlzRmFzdEZvcndhcmQoKSkpOwpAQCAtMzU4LDcgKzM5NCwxMiBAQCBwcml2YXRlIFB1c2hSZXN1bHQgdGVzdE9uZVVwZGF0ZVN0YXR1cyhmaW5hbCBSZW1vdGVSZWZVcGRhdGUgcnJ1LAogCiAJcHJpdmF0ZSBQdXNoUmVzdWx0IGV4ZWN1dGVQdXNoKCkgdGhyb3dzIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiwKIAkJCVRyYW5zcG9ydEV4Y2VwdGlvbiB7Ci0JCXByb2Nlc3MgPSBuZXcgUHVzaFByb2Nlc3ModHJhbnNwb3J0LCByZWZVcGRhdGVzKTsKKwkJcmV0dXJuIGV4ZWN1dGVQdXNoKG51bGwpOworCX0KKworCXByaXZhdGUgUHVzaFJlc3VsdCBleGVjdXRlUHVzaChQcmVQdXNoSG9vayBob29rKQorCQkJdGhyb3dzIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiwgVHJhbnNwb3J0RXhjZXB0aW9uIHsKKwkJcHJvY2VzcyA9IG5ldyBQdXNoUHJvY2Vzcyh0cmFuc3BvcnQsIHJlZlVwZGF0ZXMsIGhvb2spOwogCQlyZXR1cm4gcHJvY2Vzcy5leGVjdXRlKG5ldyBUZXh0UHJvZ3Jlc3NNb25pdG9yKCkpOwogCX0KIApAQCAtNDE2LDQgKzQ1NywyMCBAQCBwdWJsaWMgdm9pZCBwdXNoKFByb2dyZXNzTW9uaXRvciBtb25pdG9yLAogCQkJfQogCQl9CiAJfQorCisJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTW9ja1ByZVB1c2hIb29rIGV4dGVuZHMgUHJlUHVzaEhvb2sgeworCisJCXByaXZhdGUgZmluYWwgUHJpbnRTdHJlYW0gb3V0cHV0OworCisJCXB1YmxpYyBNb2NrUHJlUHVzaEhvb2soUmVwb3NpdG9yeSByZXBvLCBQcmludFN0cmVhbSBvdXQsCisJCQkJUHJpbnRTdHJlYW0gZXJyKSB7CisJCQlzdXBlcihyZXBvLCBvdXQsIGVycik7CisJCQlvdXRwdXQgPSBvdXQ7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIHZvaWQgZG9SdW4oKSB0aHJvd3MgQWJvcnRlZEJ5SG9va0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworCQkJb3V0cHV0LnByaW50KGdldFN0ZGluQXJncygpKTsKKwkJfQorCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUmVjZWl2ZVBhY2tBZHZlcnRpc2VSZWZzSG9va1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUmVjZWl2ZVBhY2tBZHZlcnRpc2VSZWZzSG9va1Rlc3QuamF2YQppbmRleCBkMWU1NDQ2Li5hOTFiYzk1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1JlY2VpdmVQYWNrQWR2ZXJ0aXNlUmVmc0hvb2tUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9SZWNlaXZlUGFja0FkdmVydGlzZVJlZnNIb29rVGVzdC5qYXZhCkBAIC03MywxMSArNzMsMTQgQEAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJc3VwZXIuc2V0VXAoKTsKIAogCQlzcmMgPSBjcmVhdGVCYXJlUmVwb3NpdG9yeSgpOworCQlhZGRSZXBvVG9DbG9zZShzcmMpOwogCQlkc3QgPSBjcmVhdGVCYXJlUmVwb3NpdG9yeSgpOworCQlhZGRSZXBvVG9DbG9zZShkc3QpOwogCiAJCS8vIEZpbGwgZHN0IHdpdGggYSBzb21lIGNvbW1vbiBoaXN0b3J5LgogCQkvLwogCQl0cnkgKFRlc3RSZXBvc2l0b3J5PFJlcG9zaXRvcnk+IGQgPSBuZXcgVGVzdFJlcG9zaXRvcnk8Pihkc3QpKSB7CisJCQlkc3QuaW5jcmVtZW50T3BlbigpOwogCQkJYSA9IGQuYmxvYigiYSIpOwogCQkJQSA9IGQuY29tbWl0KGQudHJlZShkLmZpbGUoImEiLCBhKSkpOwogCQkJQiA9IGQuY29tbWl0KCkucGFyZW50KEEpLmNyZWF0ZSgpOwpAQCAtMTA2LDkgKzEwOSw2IEBAIHB1YmxpYyB2b2lkIHRlc3RGaWx0ZXJIaWRlc1ByaXZhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJCQlkc3QuZ2V0RGlyZWN0b3J5KCkpIHsKIAkJCUBPdmVycmlkZQogCQkJUmVjZWl2ZVBhY2sgY3JlYXRlUmVjZWl2ZVBhY2soUmVwb3NpdG9yeSBkYikgewotCQkJCWRiLmNsb3NlKCk7Ci0JCQkJZHN0LmluY3JlbWVudE9wZW4oKTsKLQogCQkJCWZpbmFsIFJlY2VpdmVQYWNrIHJwID0gc3VwZXIuY3JlYXRlUmVjZWl2ZVBhY2soZHN0KTsKIAkJCQlycC5zZXRBZHZlcnRpc2VSZWZzSG9vayhuZXcgSGlkZVByaXZhdGVIb29rKCkpOwogCQkJCXJldHVybiBycDsKQEAgLTEzNiw4ICsxMzYsNiBAQCBwdWJsaWMgdm9pZCByZXNldHNIYXZlcygpIHRocm93cyBFeGNlcHRpb24gewogCQkJCWRzdC5nZXREaXJlY3RvcnkoKSkgewogCQkJQE92ZXJyaWRlCiAJCQlSZWNlaXZlUGFjayBjcmVhdGVSZWNlaXZlUGFjayhSZXBvc2l0b3J5IGRiKSB7Ci0JCQkJZHN0LmluY3JlbWVudE9wZW4oKTsKLQogCQkJCVJlY2VpdmVQYWNrIHJwID0gc3VwZXIuY3JlYXRlUmVjZWl2ZVBhY2soZHN0KTsKIAkJCQlycC5zZXRBZHZlcnRpc2VSZWZzSG9vayhuZXcgQWR2ZXJ0aXNlUmVmc0hvb2soKSB7CiAJCQkJCUBPdmVycmlkZQpAQCAtMTczLDkgKzE3MSw2IEBAIHByaXZhdGUgVHJhbnNwb3J0TG9jYWwgbmV3VHJhbnNwb3J0TG9jYWxXaXRoU3RyaWN0VmFsaWRhdGlvbigpCiAJCXJldHVybiBuZXcgVHJhbnNwb3J0TG9jYWwoc3JjLCB1cmlPZihkc3QpLCBkc3QuZ2V0RGlyZWN0b3J5KCkpIHsKIAkJCUBPdmVycmlkZQogCQkJUmVjZWl2ZVBhY2sgY3JlYXRlUmVjZWl2ZVBhY2soUmVwb3NpdG9yeSBkYikgewotCQkJCWRiLmNsb3NlKCk7Ci0JCQkJZHN0LmluY3JlbWVudE9wZW4oKTsKLQogCQkJCWZpbmFsIFJlY2VpdmVQYWNrIHJwID0gc3VwZXIuY3JlYXRlUmVjZWl2ZVBhY2soZHN0KTsKIAkJCQlycC5zZXRDaGVja1JlY2VpdmVkT2JqZWN0cyh0cnVlKTsKIAkJCQlycC5zZXRDaGVja1JlZmVyZW5jZWRPYmplY3RzQXJlUmVhY2hhYmxlKHRydWUpOwpAQCAtMjExLDYgKzIwNiw3IEBAIHB1YmxpYyB2b2lkIHRlc3RTdWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCS8vIE5vdyB1c2UgYiBidXQgaW4gYSBkaWZmZXJlbnQgY29tbWl0IHRoYW4gd2hhdCBpcyBoaWRkZW4uCiAJCS8vCiAJCXRyeSAoVGVzdFJlcG9zaXRvcnk8UmVwb3NpdG9yeT4gcyA9IG5ldyBUZXN0UmVwb3NpdG9yeTw+KHNyYykpIHsKKwkJCXNyYy5pbmNyZW1lbnRPcGVuKCk7CiAJCQlSZXZDb21taXQgTiA9IHMuY29tbWl0KCkucGFyZW50KEIpLmFkZCgicSIsIGIpLmNyZWF0ZSgpOwogCQkJcy51cGRhdGUoUl9NQVNURVIsIE4pOwogCkBAIC0yMjgsNyArMjI0LDYgQEAgcHVibGljIHZvaWQgdGVzdFN1Y2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJCXRyeSAoVHJhbnNwb3J0TG9jYWwgdCA9IG5ld1RyYW5zcG9ydExvY2FsV2l0aFN0cmljdFZhbGlkYXRpb24oKSkgewogCQkJCXQuc2V0UHVzaFRoaW4odHJ1ZSk7CiAJCQkJciA9IHQucHVzaChQTSwgQ29sbGVjdGlvbnMuc2luZ2xldG9uKHUpKTsKLQkJCQlkc3QuY2xvc2UoKTsKIAkJCX0KIAogCQkJYXNzZXJ0Tm90TnVsbCgiaGF2ZSByZXN1bHQiLCByKTsKQEAgLTI5MCw2ICsyODUsNyBAQCBwcml2YXRlIHN0YXRpYyB2b2lkIHJlY2VpdmUoZmluYWwgUmVjZWl2ZVBhY2sgcnAsCiAJcHVibGljIHZvaWQgdGVzdFVzaW5nSGlkZGVuRGVsdGFCYXNlRmFpbHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJYnl0ZVtdIGRlbHRhID0geyAweDEsIDB4MSwgMHgxLCAnYycgfTsKIAkJdHJ5IChUZXN0UmVwb3NpdG9yeTxSZXBvc2l0b3J5PiBzID0gbmV3IFRlc3RSZXBvc2l0b3J5PD4oc3JjKSkgeworCQkJc3JjLmluY3JlbWVudE9wZW4oKTsKIAkJCVJldkNvbW1pdCBOID0gcy5jb21taXQoKS5wYXJlbnQoQikKIAkJCQkJLmFkZCgicSIsCiAJCQkJCQkJcy5ibG9iKEJpbmFyeURlbHRhLmFwcGx5KApAQCAtMzQ4LDYgKzM0NCw3IEBAIHB1YmxpYyB2b2lkIHRlc3RVc2luZ0hpZGRlbkNvbW1vbkJsb2JGYWlscygpIHRocm93cyBFeGNlcHRpb24gewogCQkvLyBUcnkgdG8gdXNlIHRoZSAnYicgYmxvYiB0aGF0IGlzIGhpZGRlbi4KIAkJLy8KIAkJdHJ5IChUZXN0UmVwb3NpdG9yeTxSZXBvc2l0b3J5PiBzID0gbmV3IFRlc3RSZXBvc2l0b3J5PD4oc3JjKSkgeworCQkJc3JjLmluY3JlbWVudE9wZW4oKTsKIAkJCVJldkNvbW1pdCBOID0gcy5jb21taXQoKS5wYXJlbnQoQikuYWRkKCJxIiwgcy5ibG9iKCJiIikpLmNyZWF0ZSgpOwogCiAJCQkvLyBCdXQgZG9uJ3QgaW5jbHVkZSBpdCBpbiB0aGUgcGFjay4KQEAgLTQwMSw2ICszOTgsNyBAQCBwdWJsaWMgdm9pZCB0ZXN0VXNpbmdVbmtub3duQmxvYkZhaWxzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCS8vIFRyeSB0byB1c2UgdGhlICduJyBibG9iIHRoYXQgaXMgbm90IG9uIHRoZSBzZXJ2ZXIuCiAJCS8vCiAJCXRyeSAoVGVzdFJlcG9zaXRvcnk8UmVwb3NpdG9yeT4gcyA9IG5ldyBUZXN0UmVwb3NpdG9yeTw+KHNyYykpIHsKKwkJCXNyYy5pbmNyZW1lbnRPcGVuKCk7CiAJCQlSZXZCbG9iIG4gPSBzLmJsb2IoIm4iKTsKIAkJCVJldkNvbW1pdCBOID0gcy5jb21taXQoKS5wYXJlbnQoQikuYWRkKCJxIiwgbikuY3JlYXRlKCk7CiAKQEAgLTQ5MSw2ICs0ODksNyBAQCBwcml2YXRlIFRlbXBvcmFyeUJ1ZmZlci5IZWFwIHNldHVwU291cmNlUmVwb0ludmFsaWRHaXRtb2R1bGVzKCkKIAkJCQkudG9TdHJpbmcoKTsKIAogCQl0cnkgKFRlc3RSZXBvc2l0b3J5PFJlcG9zaXRvcnk+IHMgPSBuZXcgVGVzdFJlcG9zaXRvcnk8PihzcmMpKSB7CisJCQlzcmMuaW5jcmVtZW50T3BlbigpOwogCQkJUmV2QmxvYiBibG9iID0gcy5ibG9iKGZha2VHaXRtb2R1bGVzKTsKIAkJCVJldkNvbW1pdCBOID0gcy5jb21taXQoKS5wYXJlbnQoQikuYWRkKCIuZ2l0bW9kdWxlcyIsIGJsb2IpCiAJCQkJCS5jcmVhdGUoKTsKQEAgLTUxNyw2ICs1MTYsNyBAQCBwcml2YXRlIFRlbXBvcmFyeUJ1ZmZlci5IZWFwIHNldHVwU291cmNlUmVwb0ludmFsaWRHaXRtb2R1bGVzKCkKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RVc2luZ1Vua25vd25UcmVlRmFpbHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJdHJ5IChUZXN0UmVwb3NpdG9yeTxSZXBvc2l0b3J5PiBzID0gbmV3IFRlc3RSZXBvc2l0b3J5PD4oc3JjKSkgeworCQkJc3JjLmluY3JlbWVudE9wZW4oKTsKIAkJCVJldkNvbW1pdCBOID0gcy5jb21taXQoKS5wYXJlbnQoQikuYWRkKCJxIiwgcy5ibG9iKCJhIikpLmNyZWF0ZSgpOwogCQkJUmV2VHJlZSB0ID0gcy5wYXJzZUJvZHkoTikuZ2V0VHJlZSgpOwogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1JlZlNwZWNUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1JlZlNwZWNUZXN0LmphdmEKaW5kZXggNTU2OWJjYS4uYjU2MzA4YyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9SZWZTcGVjVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUmVmU3BlY1Rlc3QuamF2YQpAQCAtNDY2LDQgKzQ2NiwxOCBAQCBwdWJsaWMgdm9pZCBvbmx5V2lsZENhcmQoKSB7CiAJCWFzc2VydFRydWUoYS5tYXRjaFNvdXJjZSgicmVmcy9oZWFkcy9tYXN0ZXIiKSk7CiAJCWFzc2VydE51bGwoYS5nZXREZXN0aW5hdGlvbigpKTsKIAl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIG1hdGNoaW5nKCkgeworCQlSZWZTcGVjIGEgPSBuZXcgUmVmU3BlYygiOiIpOworCQlhc3NlcnRUcnVlKGEuaXNNYXRjaGluZygpKTsKKwkJYXNzZXJ0RmFsc2UoYS5pc0ZvcmNlVXBkYXRlKCkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgbWF0Y2hpbmdGb3JjZWQoKSB7CisJCVJlZlNwZWMgYSA9IG5ldyBSZWZTcGVjKCIrOiIpOworCQlhc3NlcnRUcnVlKGEuaXNNYXRjaGluZygpKTsKKwkJYXNzZXJ0VHJ1ZShhLmlzRm9yY2VVcGRhdGUoKSk7CisJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvRmlsdGVyQ29tbWFuZHNUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9GaWx0ZXJDb21tYW5kc1Rlc3QuamF2YQppbmRleCAzNmY5NGZiLi44OWQzMWMzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9GaWx0ZXJDb21tYW5kc1Rlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9GaWx0ZXJDb21tYW5kc1Rlc3QuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYsIENocmlzdGlhbiBIYWxzdHJpY2sgPGNocmlzdGlhbi5oYWxzdHJpY2tAc2FwLmNvbT4gYW5kIG90aGVycworICogQ29weXJpZ2h0IChDKSAyMDE2LCAyMDIyIENocmlzdGlhbiBIYWxzdHJpY2sgPGNocmlzdGlhbi5oYWxzdHJpY2tAc2FwLmNvbT4gYW5kIG90aGVycwogICoKICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdApAQCAtMTAsMTIgKzEwLDE3IEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQudXRpbDsKIAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKIAoraW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLkdpdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5NZXJnZVJlc3VsdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnMuR2l0QVBJRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXR0cmlidXRlcy5GaWx0ZXJDb21tYW5kOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXR0cmlidXRlcy5GaWx0ZXJDb21tYW5kRmFjdG9yeTsKQEAgLTg2LDYgKzkxLDE0IEBAIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXNlY29uZENvbW1pdCA9IGdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJTZWNvbmQgY29tbWl0IikuY2FsbCgpOwogCX0KIAorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVNldDxTdHJpbmc+IGV4aXN0aW5nRmlsdGVycyA9IG5ldyBIYXNoU2V0PD4oCisJCQkJRmlsdGVyQ29tbWFuZFJlZ2lzdHJ5LmdldFJlZ2lzdGVyZWRGaWx0ZXJDb21tYW5kcygpKTsKKwkJZXhpc3RpbmdGaWx0ZXJzLmZvckVhY2goRmlsdGVyQ29tbWFuZFJlZ2lzdHJ5Ojp1bnJlZ2lzdGVyKTsKKwkJc3VwZXIudGVhckRvd24oKTsKKwl9CisKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RCdWlsdGluQ2xlYW5GaWx0ZXIoKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uLCBHaXRBUElFeGNlcHRpb24gewpAQCAtMjE3LDQgKzIzMCwxMzMgQEAgcHVibGljIHZvaWQgdGVzdEJ1aWx0aW5DbGVhbkFuZFNtdWRnZUZpbHRlcigpIHRocm93cyBJT0V4Y2VwdGlvbiwgR2l0QVBJRXhjZXB0aW8KIAkJY29uZmlnLnNhdmUoKTsKIAl9CiAKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RCcmFuY2hTd2l0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGJ1aWx0aW5Db21tYW5kUHJlZml4ID0gImpnaXQ6Ly9idWlsdGluL3Rlc3QvIjsKKwkJRmlsdGVyQ29tbWFuZFJlZ2lzdHJ5LnJlZ2lzdGVyKGJ1aWx0aW5Db21tYW5kUHJlZml4ICsgInNtdWRnZSIsCisJCQkJbmV3IFRlc3RDb21tYW5kRmFjdG9yeSgncycpKTsKKwkJRmlsdGVyQ29tbWFuZFJlZ2lzdHJ5LnJlZ2lzdGVyKGJ1aWx0aW5Db21tYW5kUHJlZml4ICsgImNsZWFuIiwKKwkJCQluZXcgVGVzdENvbW1hbmRGYWN0b3J5KCdjJykpOworCQlTdG9yZWRDb25maWcgY29uZmlnID0gZ2l0LmdldFJlcG9zaXRvcnkoKS5nZXRDb25maWcoKTsKKwkJY29uZmlnLnNldFN0cmluZygiZmlsdGVyIiwgInRlc3QiLCAic211ZGdlIiwKKwkJCQlidWlsdGluQ29tbWFuZFByZWZpeCArICJzbXVkZ2UiKTsKKwkJY29uZmlnLnNldFN0cmluZygiZmlsdGVyIiwgInRlc3QiLCAiY2xlYW4iLAorCQkJCWJ1aWx0aW5Db21tYW5kUHJlZml4ICsgImNsZWFuIik7CisJCWNvbmZpZy5zYXZlKCk7CisJCS8vIFdlJ3JlIG9uIHRoZSB0ZXN0IGJyYW5jaAorCQlGaWxlIGFGaWxlID0gd3JpdGVUcmFzaEZpbGUoImEudHh0IiwgImEiKTsKKwkJd3JpdGVUcmFzaEZpbGUoIi5naXRhdHRyaWJ1dGVzIiwgImEudHh0IGZpbHRlcj10ZXN0Iik7CisJCUZpbGUgY0ZpbGUgPSB3cml0ZVRyYXNoRmlsZSgiY2MvYy50eHQiLCAiQyIpOworCQl3cml0ZVRyYXNoRmlsZSgiY2MvLmdpdGF0dHJpYnV0ZXMiLCAiYy50eHQgZmlsdGVyPXRlc3QiKTsKKwkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCIuIikuY2FsbCgpOworCQlnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgiT24gdGVzdCIpLmNhbGwoKTsKKwkJZ2l0LmNoZWNrb3V0KCkuc2V0TmFtZSgibWFzdGVyIikuY2FsbCgpOworCQlnaXQuYnJhbmNoQ3JlYXRlKCkuc2V0TmFtZSgib3RoZXIiKS5jYWxsKCk7CisJCWdpdC5jaGVja291dCgpLnNldE5hbWUoIm90aGVyIikuY2FsbCgpOworCQl3cml0ZVRyYXNoRmlsZSgiYi50eHQiLCAiYiIpOworCQl3cml0ZVRyYXNoRmlsZSgiLmdpdGF0dHJpYnV0ZXMiLCAiYi50eHQgZmlsdGVyPXRlc3QiKTsKKwkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCIuIikuY2FsbCgpOworCQlnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgiT24gb3RoZXIiKS5jYWxsKCk7CisJCWdpdC5jaGVja291dCgpLnNldE5hbWUoInRlc3QiKS5jYWxsKCk7CisJCWNoZWNrRmlsZShhRmlsZSwgInNjc2EiKTsKKwkJY2hlY2tGaWxlKGNGaWxlLCAic2NzQyIpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdENoZWNrb3V0U2luZ2xlRmlsZSgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgYnVpbHRpbkNvbW1hbmRQcmVmaXggPSAiamdpdDovL2J1aWx0aW4vdGVzdC8iOworCQlGaWx0ZXJDb21tYW5kUmVnaXN0cnkucmVnaXN0ZXIoYnVpbHRpbkNvbW1hbmRQcmVmaXggKyAic211ZGdlIiwKKwkJCQluZXcgVGVzdENvbW1hbmRGYWN0b3J5KCdzJykpOworCQlGaWx0ZXJDb21tYW5kUmVnaXN0cnkucmVnaXN0ZXIoYnVpbHRpbkNvbW1hbmRQcmVmaXggKyAiY2xlYW4iLAorCQkJCW5ldyBUZXN0Q29tbWFuZEZhY3RvcnkoJ2MnKSk7CisJCVN0b3JlZENvbmZpZyBjb25maWcgPSBnaXQuZ2V0UmVwb3NpdG9yeSgpLmdldENvbmZpZygpOworCQljb25maWcuc2V0U3RyaW5nKCJmaWx0ZXIiLCAidGVzdCIsICJzbXVkZ2UiLAorCQkJCWJ1aWx0aW5Db21tYW5kUHJlZml4ICsgInNtdWRnZSIpOworCQljb25maWcuc2V0U3RyaW5nKCJmaWx0ZXIiLCAidGVzdCIsICJjbGVhbiIsCisJCQkJYnVpbHRpbkNvbW1hbmRQcmVmaXggKyAiY2xlYW4iKTsKKwkJY29uZmlnLnNhdmUoKTsKKwkJLy8gV2UncmUgb24gdGhlIHRlc3QgYnJhbmNoCisJCUZpbGUgYUZpbGUgPSB3cml0ZVRyYXNoRmlsZSgiYS50eHQiLCAiYSIpOworCQlGaWxlIGF0dHJpYnV0ZXMgPSB3cml0ZVRyYXNoRmlsZSgiLmdpdGF0dHJpYnV0ZXMiLCAiYS50eHQgZmlsdGVyPXRlc3QiKTsKKwkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCIuIikuY2FsbCgpOworCQlnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgiT24gdGVzdCIpLmNhbGwoKTsKKwkJZ2l0LmNoZWNrb3V0KCkuc2V0TmFtZSgibWFzdGVyIikuY2FsbCgpOworCQlnaXQuYnJhbmNoQ3JlYXRlKCkuc2V0TmFtZSgib3RoZXIiKS5jYWxsKCk7CisJCWdpdC5jaGVja291dCgpLnNldE5hbWUoIm90aGVyIikuY2FsbCgpOworCQl3cml0ZVRyYXNoRmlsZSgiYi50eHQiLCAiYiIpOworCQl3cml0ZVRyYXNoRmlsZSgiLmdpdGF0dHJpYnV0ZXMiLCAiYi50eHQgZmlsdGVyPXRlc3QiKTsKKwkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCIuIikuY2FsbCgpOworCQlnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgiT24gb3RoZXIiKS5jYWxsKCk7CisJCWdpdC5jaGVja291dCgpLnNldE5hbWUoIm1hc3RlciIpLmNhbGwoKTsKKwkJYXNzZXJ0RmFsc2UoYUZpbGUuZXhpc3RzKCkpOworCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVzLmV4aXN0cygpKTsKKwkJZ2l0LmNoZWNrb3V0KCkuc2V0U3RhcnRQb2ludCgidGVzdCIpLmFkZFBhdGgoImEudHh0IikuY2FsbCgpOworCQljaGVja0ZpbGUoYUZpbGUsICJzY3NhIik7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0Q2hlY2tvdXRTaW5nbGVGaWxlMigpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgYnVpbHRpbkNvbW1hbmRQcmVmaXggPSAiamdpdDovL2J1aWx0aW4vdGVzdC8iOworCQlGaWx0ZXJDb21tYW5kUmVnaXN0cnkucmVnaXN0ZXIoYnVpbHRpbkNvbW1hbmRQcmVmaXggKyAic211ZGdlIiwKKwkJCQluZXcgVGVzdENvbW1hbmRGYWN0b3J5KCdzJykpOworCQlGaWx0ZXJDb21tYW5kUmVnaXN0cnkucmVnaXN0ZXIoYnVpbHRpbkNvbW1hbmRQcmVmaXggKyAiY2xlYW4iLAorCQkJCW5ldyBUZXN0Q29tbWFuZEZhY3RvcnkoJ2MnKSk7CisJCVN0b3JlZENvbmZpZyBjb25maWcgPSBnaXQuZ2V0UmVwb3NpdG9yeSgpLmdldENvbmZpZygpOworCQljb25maWcuc2V0U3RyaW5nKCJmaWx0ZXIiLCAidGVzdCIsICJzbXVkZ2UiLAorCQkJCWJ1aWx0aW5Db21tYW5kUHJlZml4ICsgInNtdWRnZSIpOworCQljb25maWcuc2V0U3RyaW5nKCJmaWx0ZXIiLCAidGVzdCIsICJjbGVhbiIsCisJCQkJYnVpbHRpbkNvbW1hbmRQcmVmaXggKyAiY2xlYW4iKTsKKwkJY29uZmlnLnNhdmUoKTsKKwkJLy8gV2UncmUgb24gdGhlIHRlc3QgYnJhbmNoCisJCUZpbGUgYUZpbGUgPSB3cml0ZVRyYXNoRmlsZSgiYS50eHQiLCAiYSIpOworCQlGaWxlIGF0dHJpYnV0ZXMgPSB3cml0ZVRyYXNoRmlsZSgiLmdpdGF0dHJpYnV0ZXMiLCAiYS50eHQgZmlsdGVyPXRlc3QiKTsKKwkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCIuIikuY2FsbCgpOworCQlnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgiT24gdGVzdCIpLmNhbGwoKTsKKwkJZ2l0LmNoZWNrb3V0KCkuc2V0TmFtZSgibWFzdGVyIikuY2FsbCgpOworCQlnaXQuYnJhbmNoQ3JlYXRlKCkuc2V0TmFtZSgib3RoZXIiKS5jYWxsKCk7CisJCWdpdC5jaGVja291dCgpLnNldE5hbWUoIm90aGVyIikuY2FsbCgpOworCQl3cml0ZVRyYXNoRmlsZSgiYi50eHQiLCAiYiIpOworCQl3cml0ZVRyYXNoRmlsZSgiLmdpdGF0dHJpYnV0ZXMiLCAiYi50eHQgZmlsdGVyPXRlc3QiKTsKKwkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCIuIikuY2FsbCgpOworCQlnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgiT24gb3RoZXIiKS5jYWxsKCk7CisJCWdpdC5jaGVja291dCgpLnNldE5hbWUoIm1hc3RlciIpLmNhbGwoKTsKKwkJYXNzZXJ0RmFsc2UoYUZpbGUuZXhpc3RzKCkpOworCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVzLmV4aXN0cygpKTsKKwkJd3JpdGVUcmFzaEZpbGUoIi5naXRhdHRyaWJ1dGVzIiwgIiIpOworCQlnaXQuY2hlY2tvdXQoKS5zZXRTdGFydFBvaW50KCJ0ZXN0IikuYWRkUGF0aCgiYS50eHQiKS5jYWxsKCk7CisJCWNoZWNrRmlsZShhRmlsZSwgInNjc2EiKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RNZXJnZSgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgYnVpbHRpbkNvbW1hbmRQcmVmaXggPSAiamdpdDovL2J1aWx0aW4vdGVzdC8iOworCQlGaWx0ZXJDb21tYW5kUmVnaXN0cnkucmVnaXN0ZXIoYnVpbHRpbkNvbW1hbmRQcmVmaXggKyAic211ZGdlIiwKKwkJCQluZXcgVGVzdENvbW1hbmRGYWN0b3J5KCdzJykpOworCQlGaWx0ZXJDb21tYW5kUmVnaXN0cnkucmVnaXN0ZXIoYnVpbHRpbkNvbW1hbmRQcmVmaXggKyAiY2xlYW4iLAorCQkJCW5ldyBUZXN0Q29tbWFuZEZhY3RvcnkoJ2MnKSk7CisJCVN0b3JlZENvbmZpZyBjb25maWcgPSBnaXQuZ2V0UmVwb3NpdG9yeSgpLmdldENvbmZpZygpOworCQljb25maWcuc2V0U3RyaW5nKCJmaWx0ZXIiLCAidGVzdCIsICJzbXVkZ2UiLAorCQkJCWJ1aWx0aW5Db21tYW5kUHJlZml4ICsgInNtdWRnZSIpOworCQljb25maWcuc2V0U3RyaW5nKCJmaWx0ZXIiLCAidGVzdCIsICJjbGVhbiIsCisJCQkJYnVpbHRpbkNvbW1hbmRQcmVmaXggKyAiY2xlYW4iKTsKKwkJY29uZmlnLnNhdmUoKTsKKwkJLy8gV2UncmUgb24gdGhlIHRlc3QgYnJhbmNoLiBTZXQgdXAgdHdvIGJyYW5jaGVzIHRoYXQgYXJlIGV4cGVjdGVkIHRvCisJCS8vIG1lcmdlIGNsZWFubHkuCisJCUZpbGUgYUZpbGUgPSB3cml0ZVRyYXNoRmlsZSgiYS50eHQiLCAiYSIpOworCQl3cml0ZVRyYXNoRmlsZSgiLmdpdGF0dHJpYnV0ZXMiLCAiYS50eHQgZmlsdGVyPXRlc3QiKTsKKwkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCIuIikuY2FsbCgpOworCQlSZXZDb21taXQgYUNvbW1pdCA9IGdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJPbiB0ZXN0IikuY2FsbCgpOworCQlnaXQuY2hlY2tvdXQoKS5zZXROYW1lKCJtYXN0ZXIiKS5jYWxsKCk7CisJCWFzc2VydEZhbHNlKGFGaWxlLmV4aXN0cygpKTsKKwkJZ2l0LmJyYW5jaENyZWF0ZSgpLnNldE5hbWUoIm90aGVyIikuY2FsbCgpOworCQlnaXQuY2hlY2tvdXQoKS5zZXROYW1lKCJvdGhlciIpLmNhbGwoKTsKKwkJd3JpdGVUcmFzaEZpbGUoImIvYi50eHQiLCAiYiIpOworCQl3cml0ZVRyYXNoRmlsZSgiYi8uZ2l0YXR0cmlidXRlcyIsICJiLnR4dCBmaWx0ZXI9dGVzdCIpOworCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oIi4iKS5jYWxsKCk7CisJCWdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJPbiBvdGhlciIpLmNhbGwoKTsKKwkJTWVyZ2VSZXN1bHQgcmVzdWx0ID0gZ2l0Lm1lcmdlKCkuaW5jbHVkZShhQ29tbWl0KS5jYWxsKCk7CisJCWFzc2VydEVxdWFscyhNZXJnZVJlc3VsdC5NZXJnZVN0YXR1cy5NRVJHRUQsIHJlc3VsdC5nZXRNZXJnZVN0YXR1cygpKTsKKwkJY2hlY2tGaWxlKGFGaWxlLCAic2NzYSIpOworCX0KKwogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC51aS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL29yZy5lY2xpcHNlLmpnaXQudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKaW5kZXggNTdhOGJlZS4uN2JhYTIxNSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnVpL01FVEEtSU5GL01BTklGRVNULk1GCkBAIC00LDE0ICs0LDE0IEBACiBCdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lCiBBdXRvbWF0aWMtTW9kdWxlLU5hbWU6IG9yZy5lY2xpcHNlLmpnaXQudWkKIEJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpnaXQudWkKLUJ1bmRsZS1WZXJzaW9uOiA2LjAuMS5xdWFsaWZpZXIKK0J1bmRsZS1WZXJzaW9uOiA2LjEuMS5xdWFsaWZpZXIKIEJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yCiBCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSmF2YVNFLTExCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC5hd3R1aTt2ZXJzaW9uPSI2LjAuMSIKLUltcG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0LmVycm9yczt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmxpYjt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lm5sczt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnJldnBsb3Q7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0O3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudXRpbDt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIgorRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpnaXQuYXd0dWk7dmVyc2lvbj0iNi4xLjEiCitJbXBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC5lcnJvcnM7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5saWI7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5ubHM7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5yZXZwbG90O3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsazt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudWkvTUVUQS1JTkYvU09VUkNFLU1BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuamdpdC51aS9NRVRBLUlORi9TT1VSQ0UtTUFOSUZFU1QuTUYKaW5kZXggMzM1YzE1Ny4uNzVmM2QyMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC51aS9NRVRBLUlORi9TT1VSQ0UtTUFOSUZFU1QuTUYKKysrIGIvb3JnLmVjbGlwc2UuamdpdC51aS9NRVRBLUlORi9TT1VSQ0UtTUFOSUZFU1QuTUYKQEAgLTMsNSArMyw1IEBACiBCdW5kbGUtTmFtZTogb3JnLmVjbGlwc2UuamdpdC51aSAtIFNvdXJjZXMKIEJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpnaXQudWkuc291cmNlCiBCdW5kbGUtVmVuZG9yOiBFY2xpcHNlLm9yZyAtIEpHaXQKLUJ1bmRsZS1WZXJzaW9uOiA2LjAuMS5xdWFsaWZpZXIKLUVjbGlwc2UtU291cmNlQnVuZGxlOiBvcmcuZWNsaXBzZS5qZ2l0LnVpO3ZlcnNpb249IjYuMC4xLnF1YWxpZmllciI7cm9vdHM9Ii4iCitCdW5kbGUtVmVyc2lvbjogNi4xLjEucXVhbGlmaWVyCitFY2xpcHNlLVNvdXJjZUJ1bmRsZTogb3JnLmVjbGlwc2UuamdpdC51aTt2ZXJzaW9uPSI2LjEuMS5xdWFsaWZpZXIiO3Jvb3RzPSIuIgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC51aS9wb20ueG1sIGIvb3JnLmVjbGlwc2UuamdpdC51aS9wb20ueG1sCmluZGV4IGM0YTNlMmEuLjEyNWUxMjAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudWkvcG9tLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnVpL3BvbS54bWwKQEAgLTE5LDcgKzE5LDcgQEAKICAgPHBhcmVudD4KICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0PC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjYuMC4xLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjYuMS4xLVNOQVBTSE9UPC92ZXJzaW9uPgogICA8L3BhcmVudD4KIAogICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0LnVpPC9hcnRpZmFjdElkPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC8uc2V0dGluZ3MvLmFwaV9maWx0ZXJzIGIvb3JnLmVjbGlwc2UuamdpdC8uc2V0dGluZ3MvLmFwaV9maWx0ZXJzCmluZGV4IGVjMDRjNjAuLjAwYjg5YTQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvLnNldHRpbmdzLy5hcGlfZmlsdGVycworKysgYi9vcmcuZWNsaXBzZS5qZ2l0Ly5zZXR0aW5ncy8uYXBpX2ZpbHRlcnMKQEAgLTQsOSArNCw3NSBAQAogICAgICAgICA8ZmlsdGVyIGlkPSIxMTQxODk5MjY2Ij4KICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50cz4KICAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iNS4xMyIvPgotICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSI2LjAiLz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iNi4xIi8+CiAgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9Ik5vUmVtb3RlUmVwb3NpdG9yeUV4Y2VwdGlvbihVUklpc2gsIFN0cmluZywgVGhyb3dhYmxlKSIvPgogICAgICAgICAgICAgPC9tZXNzYWdlX2FyZ3VtZW50cz4KICAgICAgICAgPC9maWx0ZXI+CiAgICAgPC9yZXNvdXJjZT4KKyAgICA8cmVzb3VyY2UgcGF0aD0ic3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL1R5cGVkQ29uZmlnR2V0dGVyLmphdmEiIHR5cGU9Im9yZy5lY2xpcHNlLmpnaXQubGliLlR5cGVkQ29uZmlnR2V0dGVyIj4KKyAgICAgICAgPGZpbHRlciBpZD0iNDAzNzY3MzM2Ij4KKyAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0ib3JnLmVjbGlwc2UuamdpdC5saWIuVHlwZWRDb25maWdHZXR0ZXIiLz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iVU5TRVRfSU5UIi8+CisgICAgICAgICAgICA8L21lc3NhZ2VfYXJndW1lbnRzPgorICAgICAgICA8L2ZpbHRlcj4KKyAgICAgICAgPGZpbHRlciBpZD0iNDAzODA0MjA0Ij4KKyAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0ib3JnLmVjbGlwc2UuamdpdC5saWIuVHlwZWRDb25maWdHZXR0ZXIiLz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iZ2V0SW50SW5SYW5nZShDb25maWcsIFN0cmluZywgU3RyaW5nLCBTdHJpbmcsIGludCwgaW50LCBpbnQpIi8+CisgICAgICAgICAgICA8L21lc3NhZ2VfYXJndW1lbnRzPgorICAgICAgICA8L2ZpbHRlcj4KKyAgICA8L3Jlc291cmNlPgorICAgIDxyZXNvdXJjZSBwYXRoPSJzcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvT2JqZWN0RGF0YWJhc2UuamF2YSIgdHlwZT0ib3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0RGF0YWJhc2UiPgorICAgICAgICA8ZmlsdGVyIGlkPSIzMzY2OTUzMzciPgorICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnRzPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJvcmcuZWNsaXBzZS5qZ2l0LmxpYi5PYmplY3REYXRhYmFzZSIvPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJnZXRBcHByb3hpbWF0ZU9iamVjdENvdW50KCkiLz4KKyAgICAgICAgICAgIDwvbWVzc2FnZV9hcmd1bWVudHM+CisgICAgICAgIDwvZmlsdGVyPgorICAgIDwvcmVzb3VyY2U+CisgICAgPHJlc291cmNlIHBhdGg9InNyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9UeXBlZENvbmZpZ0dldHRlci5qYXZhIiB0eXBlPSJvcmcuZWNsaXBzZS5qZ2l0LmxpYi5UeXBlZENvbmZpZ0dldHRlciI+CisgICAgICAgIDxmaWx0ZXIgaWQ9IjQwMzgwNDIwNCI+CisgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudHM+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9Im9yZy5lY2xpcHNlLmpnaXQubGliLlR5cGVkQ29uZmlnR2V0dGVyIi8+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9ImdldEludEluUmFuZ2UoQ29uZmlnLCBTdHJpbmcsIFN0cmluZywgU3RyaW5nLCBpbnQsIGludCwgaW50KSIvPgorICAgICAgICAgICAgPC9tZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgPC9maWx0ZXI+CisgICAgPC9yZXNvdXJjZT4KKyAgICA8cmVzb3VyY2UgcGF0aD0ic3JjL29yZy9lY2xpcHNlL2pnaXQvbWVyZ2UvUmVzb2x2ZU1lcmdlci5qYXZhIiB0eXBlPSJvcmcuZWNsaXBzZS5qZ2l0Lm1lcmdlLlJlc29sdmVNZXJnZXIiPgorICAgICAgICA8ZmlsdGVyIGlkPSIzMzg3OTI1NDYiPgorICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnRzPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJvcmcuZWNsaXBzZS5qZ2l0Lm1lcmdlLlJlc29sdmVNZXJnZXIiLz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iYWRkQ2hlY2tvdXRNZXRhZGF0YShTdHJpbmcsIEF0dHJpYnV0ZXMpIi8+CisgICAgICAgICAgICA8L21lc3NhZ2VfYXJndW1lbnRzPgorICAgICAgICA8L2ZpbHRlcj4KKyAgICAgICAgPGZpbHRlciBpZD0iMzM4NzkyNTQ2Ij4KKyAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0ib3JnLmVjbGlwc2UuamdpdC5tZXJnZS5SZXNvbHZlTWVyZ2VyIi8+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9ImFkZFRvQ2hlY2tvdXQoU3RyaW5nLCBEaXJDYWNoZUVudHJ5LCBBdHRyaWJ1dGVzKSIvPgorICAgICAgICAgICAgPC9tZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgPC9maWx0ZXI+CisgICAgICAgIDxmaWx0ZXIgaWQ9IjMzODc5MjU0NiI+CisgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudHM+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9Im9yZy5lY2xpcHNlLmpnaXQubWVyZ2UuUmVzb2x2ZU1lcmdlciIvPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJwcm9jZXNzRW50cnkoQ2Fub25pY2FsVHJlZVBhcnNlciwgQ2Fub25pY2FsVHJlZVBhcnNlciwgQ2Fub25pY2FsVHJlZVBhcnNlciwgRGlyQ2FjaGVCdWlsZEl0ZXJhdG9yLCBXb3JraW5nVHJlZUl0ZXJhdG9yLCBib29sZWFuLCBBdHRyaWJ1dGVzKSIvPgorICAgICAgICAgICAgPC9tZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgPC9maWx0ZXI+CisgICAgPC9yZXNvdXJjZT4KKyAgICA8cmVzb3VyY2UgcGF0aD0ic3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0Jhc2VQYWNrUHVzaENvbm5lY3Rpb24uamF2YSIgdHlwZT0ib3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuQmFzZVBhY2tQdXNoQ29ubmVjdGlvbiI+CisgICAgICAgIDxmaWx0ZXIgaWQ9IjMzODc5MjU0NiI+CisgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudHM+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9Im9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LkJhc2VQYWNrUHVzaENvbm5lY3Rpb24iLz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0ibm9SZXBvc2l0b3J5KCkiLz4KKyAgICAgICAgICAgIDwvbWVzc2FnZV9hcmd1bWVudHM+CisgICAgICAgIDwvZmlsdGVyPgorICAgIDwvcmVzb3VyY2U+CisgICAgPHJlc291cmNlIHBhdGg9InNyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QdXNoQ29uZmlnLmphdmEiIHR5cGU9Im9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlB1c2hDb25maWciPgorICAgICAgICA8ZmlsdGVyIGlkPSIzMzg3MjI5MDciPgorICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnRzPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5QdXNoQ29uZmlnIi8+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9IlB1c2hDb25maWcoKSIvPgorICAgICAgICAgICAgPC9tZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgPC9maWx0ZXI+CisgICAgPC9yZXNvdXJjZT4KIDwvY29tcG9uZW50PgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL29yZy5lY2xpcHNlLmpnaXQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKaW5kZXggODdiNThlMS4uODA4ZDVkMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0zLDEyICszLDEyIEBACiBCdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lCiBBdXRvbWF0aWMtTW9kdWxlLU5hbWU6IG9yZy5lY2xpcHNlLmpnaXQKIEJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpnaXQKLUJ1bmRsZS1WZXJzaW9uOiA2LjAuMS5xdWFsaWZpZXIKK0J1bmRsZS1WZXJzaW9uOiA2LjEuMS5xdWFsaWZpZXIKIEJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgogQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IKIEVjbGlwc2UtRXh0ZW5zaWJsZUFQSTogdHJ1ZQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpnaXQuYW5ub3RhdGlvbnM7dmVyc2lvbj0iNi4wLjEiLAotIG9yZy5lY2xpcHNlLmpnaXQuYXBpO3ZlcnNpb249IjYuMC4xIjsKK0V4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0LmFubm90YXRpb25zO3ZlcnNpb249IjYuMS4xIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmFwaTt2ZXJzaW9uPSI2LjEuMSI7CiAgIHVzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydCwKICAgIG9yZy5lY2xpcHNlLmpnaXQubm90ZXMsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LmRpcmNhY2hlLApAQCAtMjMsMTggKzIzLDE4IEBACiAgICBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuZmlsdGVyLAogICAgb3JnLmVjbGlwc2UuamdpdC5ibGFtZSwKICAgIG9yZy5lY2xpcHNlLmpnaXQubWVyZ2UiLAotIG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9yczt2ZXJzaW9uPSI2LjAuMSI7Cisgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzO3ZlcnNpb249IjYuMS4xIjsKICAgdXNlczo9Im9yZy5lY2xpcHNlLmpnaXQubGliLAogICAgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMiLAotIG9yZy5lY2xpcHNlLmpnaXQuYXR0cmlidXRlczt2ZXJzaW9uPSI2LjAuMSI7Cisgb3JnLmVjbGlwc2UuamdpdC5hdHRyaWJ1dGVzO3ZlcnNpb249IjYuMS4xIjsKICAgdXNlczo9Im9yZy5lY2xpcHNlLmpnaXQubGliLAogICAgb3JnLmVjbGlwc2UuamdpdC50cmVld2FsayIsCi0gb3JnLmVjbGlwc2UuamdpdC5ibGFtZTt2ZXJzaW9uPSI2LjAuMSI7Cisgb3JnLmVjbGlwc2UuamdpdC5ibGFtZTt2ZXJzaW9uPSI2LjEuMSI7CiAgIHVzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LmxpYiwKICAgIG9yZy5lY2xpcHNlLmpnaXQucmV2d2FsaywKICAgIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuZmlsdGVyLAogICAgb3JnLmVjbGlwc2UuamdpdC5kaWZmIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmRpZmY7dmVyc2lvbj0iNi4wLjEiOworIG9yZy5lY2xpcHNlLmpnaXQuZGlmZjt2ZXJzaW9uPSI2LjEuMSI7CiAgIHVzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LmxpYiwKICAgIG9yZy5lY2xpcHNlLmpnaXQuYXR0cmlidXRlcywKICAgIG9yZy5lY2xpcHNlLmpnaXQucmV2d2FsaywKQEAgLTQyLDQ0ICs0Miw0OCBAQAogICAgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5maWx0ZXIsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLAogICAgb3JnLmVjbGlwc2UuamdpdC51dGlsIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmRpcmNhY2hlO3ZlcnNpb249IjYuMC4xIjsKKyBvcmcuZWNsaXBzZS5qZ2l0LmRpcmNhY2hlO3ZlcnNpb249IjYuMS4xIjsKICAgdXNlczo9Im9yZy5lY2xpcHNlLmpnaXQuZXZlbnRzLAogICAgb3JnLmVjbGlwc2UuamdpdC5saWIsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LmF0dHJpYnV0ZXMsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLAogICAgb3JnLmVjbGlwc2UuamdpdC51dGlsIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmVycm9yczt2ZXJzaW9uPSI2LjAuMSI7Cisgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnM7dmVyc2lvbj0iNi4xLjEiOwogICB1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LmRpcmNhY2hlLAogICAgb3JnLmVjbGlwc2UuamdpdC5saWIsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UucGFjayIsCi0gb3JnLmVjbGlwc2UuamdpdC5ldmVudHM7dmVyc2lvbj0iNi4wLjEiOworIG9yZy5lY2xpcHNlLmpnaXQuZXZlbnRzO3ZlcnNpb249IjYuMS4xIjsKICAgdXNlczo9Im9yZy5lY2xpcHNlLmpnaXQubGliIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmZubWF0Y2g7dmVyc2lvbj0iNi4wLjEiLAotIG9yZy5lY2xpcHNlLmpnaXQuZ2l0cmVwbzt2ZXJzaW9uPSI2LjAuMSI7Cisgb3JnLmVjbGlwc2UuamdpdC5mbm1hdGNoO3ZlcnNpb249IjYuMS4xIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmdpdHJlcG87dmVyc2lvbj0iNi4xLjEiOwogICB1c2VzOj0ib3JnLnhtbC5zYXguaGVscGVycywKICAgIG9yZy5lY2xpcHNlLmpnaXQuYXBpLAogICAgb3JnLmVjbGlwc2UuamdpdC5saWIsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGssCiAgICBvcmcueG1sLnNheCIsCi0gb3JnLmVjbGlwc2UuamdpdC5naXRyZXBvLmludGVybmFsO3ZlcnNpb249IjYuMC4xIjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpnaXQuaG9va3M7dmVyc2lvbj0iNi4wLjEiO3VzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LmxpYiIsCi0gb3JnLmVjbGlwc2UuamdpdC5pZ25vcmU7dmVyc2lvbj0iNi4wLjEiLAotIG9yZy5lY2xpcHNlLmpnaXQuaWdub3JlLmludGVybmFsO3ZlcnNpb249IjYuMC4xIjsKKyBvcmcuZWNsaXBzZS5qZ2l0LmdpdHJlcG8uaW50ZXJuYWw7dmVyc2lvbj0iNi4xLjEiO3gtaW50ZXJuYWw6PXRydWUsCisgb3JnLmVjbGlwc2UuamdpdC5ob29rczt2ZXJzaW9uPSI2LjEuMSI7dXNlczo9Im9yZy5lY2xpcHNlLmpnaXQubGliIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmlnbm9yZTt2ZXJzaW9uPSI2LjEuMSIsCisgb3JnLmVjbGlwc2UuamdpdC5pZ25vcmUuaW50ZXJuYWw7dmVyc2lvbj0iNi4xLjEiOwogICB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZ2l0LnRlc3QiLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWw7dmVyc2lvbj0iNi4wLjEiOworIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWw7dmVyc2lvbj0iNi4xLjEiOwogICB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZ2l0LnRlc3QsCiAgICBvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdCIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5mc2NrO3ZlcnNpb249IjYuMC4xIjsKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLmRpZmZtZXJnZXRvb2w7dmVyc2lvbj0iNi4xLjEiOworICB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZ2l0LnRlc3QsCisgICBvcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0LAorICAgb3JnLmVjbGlwc2UuamdpdC5wZ20iLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuZnNjazt2ZXJzaW9uPSI2LjEuMSI7CiAgIHgtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpnaXQudGVzdCIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5yZXZ3YWxrO3ZlcnNpb249IjYuMC4xIjsKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnJldndhbGs7dmVyc2lvbj0iNi4xLjEiOwogICB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZ2l0LnRlc3QiLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5kZnM7dmVyc2lvbj0iNi4wLjEiOworIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5kZnM7dmVyc2lvbj0iNi4xLjEiOwogICB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZ2l0LnRlc3QsCiAgICBvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyLAogICAgb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QsCiAgICBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0IiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSI2LjAuMSI7Cisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iNi4xLjEiOwogICB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZ2l0LnRlc3QsCiAgICBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LAogICAgb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwLApAQCAtODgsMzIgKzkyLDMyIEBACiAgICBvcmcuZWNsaXBzZS5qZ2l0LnBnbSwKICAgIG9yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3QsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUiLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5pbzt2ZXJzaW9uPSI2LjAuMSI7Cisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmlvO3ZlcnNpb249IjYuMS4xIjsKICAgeC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuamdpdC5qdW5pdCwKICAgIG9yZy5lY2xpcHNlLmpnaXQudGVzdCwKICAgIG9yZy5lY2xpcHNlLmpnaXQucGdtIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UucGFjazt2ZXJzaW9uPSI2LjAuMSI7Cisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnBhY2s7dmVyc2lvbj0iNi4xLjEiOwogICB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LAogICAgb3JnLmVjbGlwc2UuamdpdC50ZXN0LAogICAgb3JnLmVjbGlwc2UuamdpdC5wZ20iLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5yZWZ0YWJsZTt2ZXJzaW9uPSI2LjAuMSI7Cisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnJlZnRhYmxlO3ZlcnNpb249IjYuMS4xIjsKICAgeC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QsCiAgICBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LAogICAgb3JnLmVjbGlwc2UuamdpdC50ZXN0LAogICAgb3JnLmVjbGlwc2UuamdpdC5wZ20iLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3VibW9kdWxlO3ZlcnNpb249IjYuMC4xIjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwudHJhbnNwb3J0LmNvbm5lY3Rpdml0eTt2ZXJzaW9uPSI2LjAuMSI7Cisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdWJtb2R1bGU7dmVyc2lvbj0iNi4xLjEiO3gtaW50ZXJuYWw6PXRydWUsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC50cmFuc3BvcnQuY29ubmVjdGl2aXR5O3ZlcnNpb249IjYuMS4xIjsKICAgeC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuamdpdC50ZXN0IiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnRyYW5zcG9ydC5odHRwO3ZlcnNpb249IjYuMC4xIjsKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnRyYW5zcG9ydC5odHRwO3ZlcnNpb249IjYuMS4xIjsKICAgeC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuamdpdC50ZXN0IiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnRyYW5zcG9ydC5wYXJzZXI7dmVyc2lvbj0iNi4wLjEiOworIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwudHJhbnNwb3J0LnBhcnNlcjt2ZXJzaW9uPSI2LjEuMSI7CiAgIHgtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnRlc3QiLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwudHJhbnNwb3J0LnNzaDt2ZXJzaW9uPSI2LjAuMSI7Cisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC50cmFuc3BvcnQuc3NoO3ZlcnNpb249IjYuMS4xIjsKICAgeC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLAogICAgb3JnLmVjbGlwc2UuamdpdC5zc2guanNjaCwKICAgIG9yZy5lY2xpcHNlLmpnaXQudGVzdCIsCi0gb3JnLmVjbGlwc2UuamdpdC5saWI7dmVyc2lvbj0iNi4wLjEiOworIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249IjYuMS4xIjsKICAgdXNlczo9Im9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LAogICAgb3JnLmVjbGlwc2UuamdpdC51dGlsLnNoYTEsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LmRpcmNhY2hlLApAQCAtMTI3LDEwICsxMzEsMTEgQEAKICAgIG9yZy5lY2xpcHNlLmpnaXQudXRpbCwKICAgIG9yZy5lY2xpcHNlLmpnaXQuc3VibW9kdWxlLAogICAgb3JnLmVjbGlwc2UuamdpdC51dGlsLnRpbWUiLAotIG9yZy5lY2xpcHNlLmpnaXQubGliLmludGVybmFsO3ZlcnNpb249IjYuMC4xIjsKLSAgeC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuamdpdC50ZXN0IiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmxvZ2dpbmc7dmVyc2lvbj0iNi4wLjEiLAotIG9yZy5lY2xpcHNlLmpnaXQubWVyZ2U7dmVyc2lvbj0iNi4wLjEiOworIG9yZy5lY2xpcHNlLmpnaXQubGliLmludGVybmFsO3ZlcnNpb249IjYuMS4xIjsKKyAgeC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuamdpdC50ZXN0LAorICAgb3JnLmVjbGlwc2UuamdpdC5wZ20iLAorIG9yZy5lY2xpcHNlLmpnaXQubG9nZ2luZzt2ZXJzaW9uPSI2LjEuMSIsCisgb3JnLmVjbGlwc2UuamdpdC5tZXJnZTt2ZXJzaW9uPSI2LjEuMSI7CiAgIHVzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LmRpcmNhY2hlLAogICAgb3JnLmVjbGlwc2UuamdpdC5saWIsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGssCkBAIC0xMzksNDAgKzE0NCw0MCBAQAogICAgb3JnLmVjbGlwc2UuamdpdC51dGlsLAogICAgb3JnLmVjbGlwc2UuamdpdC5hcGksCiAgICBvcmcuZWNsaXBzZS5qZ2l0LmF0dHJpYnV0ZXMiLAotIG9yZy5lY2xpcHNlLmpnaXQubmxzO3ZlcnNpb249IjYuMC4xIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lm5vdGVzO3ZlcnNpb249IjYuMC4xIjsKKyBvcmcuZWNsaXBzZS5qZ2l0Lm5sczt2ZXJzaW9uPSI2LjEuMSIsCisgb3JnLmVjbGlwc2UuamdpdC5ub3Rlczt2ZXJzaW9uPSI2LjEuMSI7CiAgIHVzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LmxpYiwKICAgIG9yZy5lY2xpcHNlLmpnaXQucmV2d2FsaywKICAgIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGssCiAgICBvcmcuZWNsaXBzZS5qZ2l0Lm1lcmdlIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnBhdGNoO3ZlcnNpb249IjYuMC4xIjsKKyBvcmcuZWNsaXBzZS5qZ2l0LnBhdGNoO3ZlcnNpb249IjYuMS4xIjsKICAgdXNlczo9Im9yZy5lY2xpcHNlLmpnaXQubGliLAogICAgb3JnLmVjbGlwc2UuamdpdC5kaWZmIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnJldnBsb3Q7dmVyc2lvbj0iNi4wLjEiOworIG9yZy5lY2xpcHNlLmpnaXQucmV2cGxvdDt2ZXJzaW9uPSI2LjEuMSI7CiAgIHVzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LmxpYiwKICAgIG9yZy5lY2xpcHNlLmpnaXQucmV2d2FsayIsCi0gb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrO3ZlcnNpb249IjYuMC4xIjsKKyBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGs7dmVyc2lvbj0iNi4xLjEiOwogICB1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC5saWIsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LmRpZmYsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLmZpbHRlciwKICAgIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5maWx0ZXIsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuZmlsdGVyO3ZlcnNpb249IjYuMC4xIjsKKyBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuZmlsdGVyO3ZlcnNpb249IjYuMS4xIjsKICAgdXNlczo9Im9yZy5lY2xpcHNlLmpnaXQucmV2d2FsaywKICAgIG9yZy5lY2xpcHNlLmpnaXQubGliLAogICAgb3JnLmVjbGlwc2UuamdpdC51dGlsIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSI2LjAuMSI7Cisgb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iNi4xLjEiOwogICB1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC5saWIsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwiLAotIG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5wYWNrO3ZlcnNpb249IjYuMC4xIjsKKyBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UucGFjazt2ZXJzaW9uPSI2LjEuMSI7CiAgIHVzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LmxpYiIsCi0gb3JnLmVjbGlwc2UuamdpdC5zdWJtb2R1bGU7dmVyc2lvbj0iNi4wLjEiOworIG9yZy5lY2xpcHNlLmpnaXQuc3VibW9kdWxlO3ZlcnNpb249IjYuMS4xIjsKICAgdXNlczo9Im9yZy5lY2xpcHNlLmpnaXQubGliLAogICAgb3JnLmVjbGlwc2UuamdpdC5kaWZmLAogICAgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5maWx0ZXIsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLAogICAgb3JnLmVjbGlwc2UuamdpdC51dGlsIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDt2ZXJzaW9uPSI2LjAuMSI7Cisgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQ7dmVyc2lvbj0iNi4xLjEiOwogICB1c2VzOj0iamF2YXguY3J5cHRvLAogICAgb3JnLmVjbGlwc2UuamdpdC51dGlsLmlvLAogICAgb3JnLmVjbGlwc2UuamdpdC5saWIsCkBAIC0xODUsMjEgKzE5MCwyMSBAQAogICAgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQucmVzb2x2ZXIsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UucGFjaywKICAgIG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5odHRwO3ZlcnNpb249IjYuMC4xIjsKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5odHRwO3ZlcnNpb249IjYuMS4xIjsKICAgdXNlczo9ImphdmF4Lm5ldC5zc2wiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LnJlc29sdmVyO3ZlcnNpb249IjYuMC4xIjsKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5yZXNvbHZlcjt2ZXJzaW9uPSI2LjEuMSI7CiAgIHVzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydCwKICAgIG9yZy5lY2xpcHNlLmpnaXQubGliIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrO3ZlcnNpb249IjYuMC4xIjsKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrO3ZlcnNpb249IjYuMS4xIjsKICAgdXNlczo9Im9yZy5lY2xpcHNlLmpnaXQuZGlyY2FjaGUsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LmxpYiwKICAgIG9yZy5lY2xpcHNlLmpnaXQuYXR0cmlidXRlcywKICAgIG9yZy5lY2xpcHNlLmpnaXQucmV2d2FsaywKICAgIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuZmlsdGVyLAogICAgb3JnLmVjbGlwc2UuamdpdC51dGlsIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLmZpbHRlcjt2ZXJzaW9uPSI2LjAuMSI7Cisgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5maWx0ZXI7dmVyc2lvbj0iNi4xLjEiOwogICB1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC50cmVld2FsayIsCi0gb3JnLmVjbGlwc2UuamdpdC51dGlsO3ZlcnNpb249IjYuMC4xIjsKKyBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7dmVyc2lvbj0iNi4xLjEiOwogICB1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQsCiAgICBvcmcuZWNsaXBzZS5qZ2l0Lmhvb2tzLAogICAgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLApAQCAtMjEyLDEyICsyMTcsMTIgQEAKICAgIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGssCiAgICBqYXZheC5uZXQuc3NsLAogICAgb3JnLmVjbGlwc2UuamdpdC51dGlsLnRpbWUiLAotIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5pbzt2ZXJzaW9uPSI2LjAuMSI7Cisgb3JnLmVjbGlwc2UuamdpdC51dGlsLmlvO3ZlcnNpb249IjYuMS4xIjsKICAgdXNlczo9Im9yZy5lY2xpcHNlLmpnaXQuYXR0cmlidXRlcywKICAgIG9yZy5lY2xpcHNlLmpnaXQubGliLAogICAgb3JnLmVjbGlwc2UuamdpdC50cmVld2FsayIsCi0gb3JnLmVjbGlwc2UuamdpdC51dGlsLnNoYTE7dmVyc2lvbj0iNi4wLjEiLAotIG9yZy5lY2xpcHNlLmpnaXQudXRpbC50aW1lO3ZlcnNpb249IjYuMC4xIgorIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5zaGExO3ZlcnNpb249IjYuMS4xIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwudGltZTt2ZXJzaW9uPSI2LjEuMSIKIEJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKYXZhU0UtMTEKIEltcG9ydC1QYWNrYWdlOiBjb20uZ29vZ2xlY29kZS5qYXZhZXdhaDt2ZXJzaW9uPSJbMS4xLjYsMi4wLjApIiwKICBqYXZheC5jcnlwdG8sCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L01FVEEtSU5GL1NPVVJDRS1NQU5JRkVTVC5NRiBiL29yZy5lY2xpcHNlLmpnaXQvTUVUQS1JTkYvU09VUkNFLU1BTklGRVNULk1GCmluZGV4IDMwMmM0NTQuLjMzZTYxNTYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvTUVUQS1JTkYvU09VUkNFLU1BTklGRVNULk1GCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvTUVUQS1JTkYvU09VUkNFLU1BTklGRVNULk1GCkBAIC0zLDUgKzMsNSBAQAogQnVuZGxlLU5hbWU6IG9yZy5lY2xpcHNlLmpnaXQgLSBTb3VyY2VzCiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZ2l0LnNvdXJjZQogQnVuZGxlLVZlbmRvcjogRWNsaXBzZS5vcmcgLSBKR2l0Ci1CdW5kbGUtVmVyc2lvbjogNi4wLjEucXVhbGlmaWVyCi1FY2xpcHNlLVNvdXJjZUJ1bmRsZTogb3JnLmVjbGlwc2UuamdpdDt2ZXJzaW9uPSI2LjAuMS5xdWFsaWZpZXIiO3Jvb3RzPSIuIgorQnVuZGxlLVZlcnNpb246IDYuMS4xLnF1YWxpZmllcgorRWNsaXBzZS1Tb3VyY2VCdW5kbGU6IG9yZy5lY2xpcHNlLmpnaXQ7dmVyc2lvbj0iNi4xLjEucXVhbGlmaWVyIjtyb290cz0iLiIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvcG9tLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQvcG9tLnhtbAppbmRleCBlNzgyMjcyLi5mMGU5MmIzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9wb20ueG1sCkBAIC0yMCw3ICsyMCw3IEBACiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj42LjAuMS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8dmVyc2lvbj42LjEuMS1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPC9wYXJlbnQ+CiAKICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdDwvYXJ0aWZhY3RJZD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvcmVzb3VyY2VzL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvSkdpdFRleHQucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLmpnaXQvcmVzb3VyY2VzL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvSkdpdFRleHQucHJvcGVydGllcwppbmRleCA1NjcwMWNjLi45MjZlM2ZmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3Jlc291cmNlcy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL0pHaXRUZXh0LnByb3BlcnRpZXMKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9yZXNvdXJjZXMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9KR2l0VGV4dC5wcm9wZXJ0aWVzCkBAIC0zNTYsNiArMzU2LDggQEAKIGluTWVtb3J5QnVmZmVyTGltaXRFeGNlZWRlZD1Jbi1tZW1vcnkgYnVmZmVyIGxpbWl0IGV4Y2VlZGVkCiBpbnB1dERpZG50TWF0Y2hMZW5ndGg9SW5wdXQgZGlkIG5vdCBtYXRjaCBzdXBwbGllZCBsZW5ndGguIHswfSBieXRlcyBhcmUgbWlzc2luZy4KIGlucHV0U3RyZWFtTXVzdFN1cHBvcnRNYXJrPUlucHV0U3RyZWFtIG11c3Qgc3VwcG9ydCBtYXJrKCkKK2ludGVnZXJWYWx1ZU5vdEluUmFuZ2U9SW50ZWdlciB2YWx1ZSB7MH0uezF9ID0gezJ9IG5vdCBpbiByYW5nZSB7M30uLns0fQoraW50ZWdlclZhbHVlTm90SW5SYW5nZVN1YlNlY3Rpb249SW50ZWdlciB2YWx1ZSB7MH0uezF9LnsyfSA9IHszfSBub3QgaW4gcmFuZ2UgezR9Li57NX0KIGludGVnZXJWYWx1ZU91dE9mUmFuZ2U9SW50ZWdlciB2YWx1ZSB7MH0uezF9IG91dCBvZiByYW5nZQogaW50ZXJuYWxSZXZpc2lvbkVycm9yPWludGVybmFsIHJldmlzaW9uIGVycm9yCiBpbnRlcm5hbFNlcnZlckVycm9yPWludGVybmFsIHNlcnZlciBlcnJvcgpAQCAtMzY3LDYgKzM2OSw3IEBACiBpbnZhbGlkQm9vbGVhblZhbHVlPUludmFsaWQgYm9vbGVhbiB2YWx1ZTogezB9LnsxfT17Mn0KIGludmFsaWRDaGFubmVsPUludmFsaWQgY2hhbm5lbCB7MH0KIGludmFsaWRDb21taXRQYXJlbnROdW1iZXI9SW52YWxpZCBjb21taXQgcGFyZW50IG51bWJlcgoraW52YWxpZENvcmVBYmJyZXY9SW52YWxpZCB2YWx1ZSB7MH0gb2Ygb3B0aW9uIGNvcmUuYWJicmV2CiBpbnZhbGlkRGVwdGg9SW52YWxpZCBkZXB0aDogezB9CiBpbnZhbGlkRW5jb2Rpbmc9SW52YWxpZCBlbmNvZGluZyBmcm9tIGdpdCBjb25maWcgaTE4bi5jb21taXRFbmNvZGluZzogezB9CiBpbnZhbGlkRW5jcnlwdGlvbj1JbnZhbGlkIGVuY3J5cHRpb24KQEAgLTU2OCw2ICs1NzEsMTEgQEAKIHB1c2hDZXJ0aWZpY2F0ZUludmFsaWRGaWVsZFZhbHVlPVB1c2ggY2VydGlmaWNhdGUgaGFzIG1pc3Npbmcgb3IgaW52YWxpZCB2YWx1ZSBmb3IgezB9OiB7MX0KIHB1c2hDZXJ0aWZpY2F0ZUludmFsaWRIZWFkZXI9UHVzaCBjZXJ0aWZpY2F0ZSBoYXMgaW52YWxpZCBoZWFkZXIgZm9ybWF0CiBwdXNoQ2VydGlmaWNhdGVJbnZhbGlkU2lnbmF0dXJlPVB1c2ggY2VydGlmaWNhdGUgaGFzIGludmFsaWQgc2lnbmF0dXJlIGZvcm1hdAorcHVzaERlZmF1bHROb3RoaW5nPU5vIHJlZnNwZWMgZ2l2ZW4gYW5kIHB1c2guZGVmYXVsdD1ub3RoaW5nOyBubyB1cHN0cmVhbSBicmFuY2ggY2FuIGJlIGRldGVybWluZWQKK3B1c2hEZWZhdWx0Tm9VcHN0cmVhbT1ObyB1cHN0cmVhbSBicmFuY2ggZm91bmQgZm9yIGxvY2FsIGJyYW5jaCAnJ3swfScnCitwdXNoRGVmYXVsdFNpbXBsZT1wdXNoLmRlZmF1bHQ9c2ltcGxlIHJlcXVpcmVzIGxvY2FsIGJyYW5jaCBuYW1lICcnezB9JycgdG8gYmUgZXF1YWwgdG8gdXBzdHJlYW0gdHJhY2tlZCBicmFuY2ggbmFtZSAnJ3sxfScnCitwdXNoRGVmYXVsdFRyaWFuZ3VsYXJVcHN0cmVhbT1wdXNoLmRlZmF1bHQ9dXBzdHJlYW0gY2Fubm90IGJlIHVzZWQgd2hlbiB0aGUgcHVzaCByZW1vdGUgJyd7MH0nJyBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgZmV0Y2ggcmVtb3RlICcnezF9JycKK3B1c2hEZWZhdWx0VW5rbm93bj1Vbmtub3duIHB1c2guZGVmYXVsdD17MH07IGNhbm5vdCBwdXNoCiBwdXNoSXNOb3RTdXBwb3J0ZWRGb3JCdW5kbGVUcmFuc3BvcnQ9UHVzaCBpcyBub3Qgc3VwcG9ydGVkIGZvciBidW5kbGUgdHJhbnNwb3J0CiBwdXNoTm90UGVybWl0dGVkPXB1c2ggbm90IHBlcm1pdHRlZAogcHVzaE9wdGlvbnNOb3RTdXBwb3J0ZWQ9UHVzaCBvcHRpb25zIG5vdCBzdXBwb3J0ZWQ7IHJlY2VpdmVkIHswfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvQ2hlcnJ5UGlja0NvbW1hbmQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL0NoZXJyeVBpY2tDb21tYW5kLmphdmEKaW5kZXggNzkyMmY5ZS4uZjg4MTc5YSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvQ2hlcnJ5UGlja0NvbW1hbmQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9DaGVycnlQaWNrQ29tbWFuZC5qYXZhCkBAIC05LDYgKzksOCBAQAogICovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuYXBpOwogCitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5PQkpFQ1RfSURfQUJCUkVWX1NUUklOR19MRU5HVEg7CisKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwogaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwpAQCAtMTI0LDcgKzEyNiw3IEBAIHB1YmxpYyBDaGVycnlQaWNrUmVzdWx0IGNhbGwoKSB0aHJvd3MgR2l0QVBJRXhjZXB0aW9uLCBOb01lc3NhZ2VFeGNlcHRpb24sCiAJCQkJZmluYWwgUmV2Q29tbWl0IHNyY1BhcmVudCA9IGdldFBhcmVudENvbW1pdChzcmNDb21taXQsIHJldldhbGspOwogCiAJCQkJU3RyaW5nIG91ck5hbWUgPSBjYWxjdWxhdGVPdXJOYW1lKGhlYWRSZWYpOwotCQkJCVN0cmluZyBjaGVycnlQaWNrTmFtZSA9IHNyY0NvbW1pdC5nZXRJZCgpLmFiYnJldmlhdGUoNykubmFtZSgpCisJCQkJU3RyaW5nIGNoZXJyeVBpY2tOYW1lID0gc3JjQ29tbWl0LmdldElkKCkuYWJicmV2aWF0ZShPQkpFQ1RfSURfQUJCUkVWX1NUUklOR19MRU5HVEgpLm5hbWUoKQogCQkJCQkJKyAiICIgKyBzcmNDb21taXQuZ2V0U2hvcnRNZXNzYWdlKCk7IC8vJE5PTi1OTFMtMSQKIAogCQkJCU1lcmdlciBtZXJnZXIgPSBzdHJhdGVneS5uZXdNZXJnZXIocmVwbyk7CkBAIC0xODMsNyArMTg1LDcgQEAgcHVibGljIENoZXJyeVBpY2tSZXN1bHQgY2FsbCgpIHRocm93cyBHaXRBUElFeGNlcHRpb24sIE5vTWVzc2FnZUV4Y2VwdGlvbiwKIAkJCQkJaWYgKHVubWVyZ2VkUGF0aHMgIT0gbnVsbCkgewogCQkJCQkJbWVzc2FnZSA9IG5ldyBNZXJnZU1lc3NhZ2VGb3JtYXR0ZXIoKQogCQkJCQkJCS5mb3JtYXRXaXRoQ29uZmxpY3RzKHNyY0NvbW1pdC5nZXRGdWxsTWVzc2FnZSgpLAotCQkJCQkJCQkJCXVubWVyZ2VkUGF0aHMpOworCQkJCQkJCQkJCXVubWVyZ2VkUGF0aHMsICcjJyk7CiAJCQkJCX0gZWxzZSB7CiAJCQkJCQltZXNzYWdlID0gc3JjQ29tbWl0LmdldEZ1bGxNZXNzYWdlKCk7CiAJCQkJCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL0NvbW1pdENvbW1hbmQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL0NvbW1pdENvbW1hbmQuamF2YQppbmRleCAzN2YxZDQ4Li43YTU5MWFhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9Db21taXRDb21tYW5kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvQ29tbWl0Q29tbWFuZC5qYXZhCkBAIC0xOSw2ICsxOSw3IEBACiBpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFubm90YXRpb25zLk5vbk51bGw7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzLkFib3J0ZWRCeUhvb2tFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzLkNhbmNlbGVkRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9ycy5Db25jdXJyZW50UmVmVXBkYXRlRXhjZXB0aW9uOwpAQCAtNDYsNiArNDcsOCBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaG9va3MuUHJlQ29tbWl0SG9vazsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLkpHaXRUZXh0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbW1pdEJ1aWxkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29tbWl0Q29uZmlnOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbW1pdENvbmZpZy5DbGVhbnVwTW9kZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuRmlsZU1vZGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuR3BnQ29uZmlnOwpAQCAtMTMzLDYgKzEzNiwxMiBAQCBwdWJsaWMgY2xhc3MgQ29tbWl0Q29tbWFuZCBleHRlbmRzIEdpdENvbW1hbmQ8UmV2Q29tbWl0PiB7CiAKIAlwcml2YXRlIENyZWRlbnRpYWxzUHJvdmlkZXIgY3JlZGVudGlhbHNQcm92aWRlcjsKIAorCXByaXZhdGUgQE5vbk51bGwgQ2xlYW51cE1vZGUgY2xlYW51cE1vZGUgPSBDbGVhbnVwTW9kZS5WRVJCQVRJTTsKKworCXByaXZhdGUgYm9vbGVhbiBjbGVhbkRlZmF1bHRJc1N0cmlwID0gdHJ1ZTsKKworCXByaXZhdGUgQ2hhcmFjdGVyIGNvbW1lbnRDaGFyOworCiAJLyoqCiAJICogQ29uc3RydWN0b3IgZm9yIENvbW1pdENvbW1hbmQKIAkgKgpAQCAtMjAwLDcgKzIwOSw3IEBAIHB1YmxpYyBSZXZDb21taXQgY2FsbCgpIHRocm93cyBHaXRBUElFeGNlcHRpb24sIEFib3J0ZWRCeUhvb2tFeGNlcHRpb24sCiAJCQkJdGhyb3cgbmV3IFdyb25nUmVwb3NpdG9yeVN0YXRlRXhjZXB0aW9uKAogCQkJCQkJSkdpdFRleHQuZ2V0KCkuY29tbWl0QW1lbmRPbkluaXRpYWxOb3RQb3NzaWJsZSk7CiAKLQkJCWlmIChoZWFkSWQgIT0gbnVsbCkKKwkJCWlmIChoZWFkSWQgIT0gbnVsbCkgewogCQkJCWlmIChhbWVuZCkgewogCQkJCQlSZXZDb21taXQgcHJldmlvdXNDb21taXQgPSBydy5wYXJzZUNvbW1pdChoZWFkSWQpOwogCQkJCQlmb3IgKFJldkNvbW1pdCBwIDogcHJldmlvdXNDb21taXQuZ2V0UGFyZW50cygpKQpAQCAtMjEwLDcgKzIxOSw3IEBAIHB1YmxpYyBSZXZDb21taXQgY2FsbCgpIHRocm93cyBHaXRBUElFeGNlcHRpb24sIEFib3J0ZWRCeUhvb2tFeGNlcHRpb24sCiAJCQkJfSBlbHNlIHsKIAkJCQkJcGFyZW50cy5hZGQoMCwgaGVhZElkKTsKIAkJCQl9Ci0KKwkJCX0KIAkJCWlmICghbm9WZXJpZnkpIHsKIAkJCQltZXNzYWdlID0gSG9va3MKIAkJCQkJCS5jb21taXRNc2cocmVwbywKQEAgLTIxOSw2ICsyMjgsMTkgQEAgcHVibGljIFJldkNvbW1pdCBjYWxsKCkgdGhyb3dzIEdpdEFQSUV4Y2VwdGlvbiwgQWJvcnRlZEJ5SG9va0V4Y2VwdGlvbiwKIAkJCQkJCS5zZXRDb21taXRNZXNzYWdlKG1lc3NhZ2UpLmNhbGwoKTsKIAkJCX0KIAorCQkJQ29tbWl0Q29uZmlnIGNvbmZpZyA9IG51bGw7CisJCQlpZiAoQ2xlYW51cE1vZGUuREVGQVVMVC5lcXVhbHMoY2xlYW51cE1vZGUpKSB7CisJCQkJY29uZmlnID0gcmVwby5nZXRDb25maWcoKS5nZXQoQ29tbWl0Q29uZmlnLktFWSk7CisJCQkJY2xlYW51cE1vZGUgPSBjb25maWcucmVzb2x2ZShjbGVhbnVwTW9kZSwgY2xlYW5EZWZhdWx0SXNTdHJpcCk7CisJCQl9CisJCQljaGFyIGNvbW1lbnRzOworCQkJaWYgKGNvbW1lbnRDaGFyID09IG51bGwpIHsKKwkJCQljb21tZW50cyA9ICcjJzsgLy8gVE9ETyB1c2UgZ2l0IGNvbmZpZyBjb3JlLmNvbW1lbnRDaGFyCisJCQl9IGVsc2UgeworCQkJCWNvbW1lbnRzID0gY29tbWVudENoYXIuY2hhclZhbHVlKCk7CisJCQl9CisJCQltZXNzYWdlID0gQ29tbWl0Q29uZmlnLmNsZWFuVGV4dChtZXNzYWdlLCBjbGVhbnVwTW9kZSwgY29tbWVudHMpOworCiAJCQlSZXZDb21taXQgcmV2Q29tbWl0OwogCQkJRGlyQ2FjaGUgaW5kZXggPSByZXBvLmxvY2tEaXJDYWNoZSgpOwogCQkJdHJ5IChPYmplY3RJbnNlcnRlciBvZGkgPSByZXBvLm5ld09iamVjdEluc2VydGVyKCkpIHsKQEAgLTY1OCw2ICs2ODAsNTcgQEAgcHVibGljIENvbW1pdENvbW1hbmQgc2V0TWVzc2FnZShTdHJpbmcgbWVzc2FnZSkgewogCX0KIAogCS8qKgorCSAqIFNldHMgdGhlIHtAbGluayBDbGVhbnVwTW9kZX0gdG8gYXBwbHkgdG8gdGhlIGNvbW1pdCBtZXNzYWdlLiBJZiBub3QKKwkgKiBjYWxsZWQsIHtAbGluayBDb21taXRDb21tYW5kfSBhcHBsaWVzIHtAbGluayBDbGVhbnVwTW9kZSNWRVJCQVRJTX0uCisJICoKKwkgKiBAcGFyYW0gbW9kZQorCSAqICAgICAgICAgICAge0BsaW5rIENsZWFudXBNb2RlfSB0byBzZXQKKwkgKiBAcmV0dXJuIHtAY29kZSB0aGlzfQorCSAqIEBzaW5jZSA2LjEKKwkgKi8KKwlwdWJsaWMgQ29tbWl0Q29tbWFuZCBzZXRDbGVhbnVwTW9kZShATm9uTnVsbCBDbGVhbnVwTW9kZSBtb2RlKSB7CisJCWNoZWNrQ2FsbGFibGUoKTsKKwkJdGhpcy5jbGVhbnVwTW9kZSA9IG1vZGU7CisJCXJldHVybiB0aGlzOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIGRlZmF1bHQgY2xlYW4gbW9kZSBpZiB7QGxpbmsgI3NldENsZWFudXBNb2RlKENsZWFudXBNb2RlKQorCSAqIHNldENsZWFudXBNb2RlKENsZWFudXBNb2RlLkRFRkFVTFQpfSBpcyBzZXQgYW5kIGdpdCBjb25maWcKKwkgKiB7QGNvZGUgY29tbWl0LmNsZWFudXAgPSBkZWZhdWx0fSBvciBpcyBub3Qgc2V0LgorCSAqCisJICogQHBhcmFtIHN0cmlwCisJICogICAgICAgICAgICBpZiB7QGNvZGUgdHJ1ZX0sIGRlZmF1bHQgdG8ge0BsaW5rIENsZWFudXBNb2RlI1NUUklQfTsKKwkgKiAgICAgICAgICAgIG90aGVyd2lzZSBkZWZhdWx0IHRvIHtAbGluayBDbGVhbnVwTW9kZSNXSElURVNQQUNFfQorCSAqIEByZXR1cm4ge0Bjb2RlIHRoaXN9CisJICogQHNpbmNlIDYuMQorCSAqLworCXB1YmxpYyBDb21taXRDb21tYW5kIHNldERlZmF1bHRDbGVhbihib29sZWFuIHN0cmlwKSB7CisJCWNoZWNrQ2FsbGFibGUoKTsKKwkJdGhpcy5jbGVhbkRlZmF1bHRJc1N0cmlwID0gc3RyaXA7CisJCXJldHVybiB0aGlzOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIGNvbW1lbnQgY2hhcmFjdGVyIHRvIGFwcGx5IHdoZW4gY2xlYW5pbmcgYSBjb21taXQgbWVzc2FnZS4gSWYKKwkgKiB7QGNvZGUgbnVsbH0gKHRoZSBkZWZhdWx0KSBhbmQgdGhlIHtAbGluayAjc2V0Q2xlYW51cE1vZGUoQ2xlYW51cE1vZGUpCisJICogY2xlYW4tdXAgbW9kZX0gaXMge0BsaW5rIENsZWFudXBNb2RlI1NUUklQfSBvcgorCSAqIHtAbGluayBDbGVhbnVwTW9kZSNTQ0lTU09SU30sIHRoZSB2YWx1ZSBvZiBnaXQgY29uZmlnCisJICoge0Bjb2RlIGNvcmUuY29tbWVudENoYXJ9IHdpbGwgYmUgdXNlZC4KKwkgKgorCSAqIEBwYXJhbSBjb21tZW50Q2hhcgorCSAqICAgICAgICAgICAgdGhlIGNvbW1lbnQgY2hhcmFjdGVyLCBvciB7QGNvZGUgbnVsbH0gdG8gdXNlIHRoZSB2YWx1ZSBmcm9tCisJICogICAgICAgICAgICB0aGUgZ2l0IGNvbmZpZworCSAqIEByZXR1cm4ge0Bjb2RlIHRoaXN9CisJICogQHNpbmNlIDYuMQorCSAqLworCXB1YmxpYyBDb21taXRDb21tYW5kIHNldENvbW1lbnRDaGFyYWN0ZXIoQ2hhcmFjdGVyIGNvbW1lbnRDaGFyKSB7CisJCWNoZWNrQ2FsbGFibGUoKTsKKwkJdGhpcy5jb21tZW50Q2hhciA9IGNvbW1lbnRDaGFyOworCQlyZXR1cm4gdGhpczsKKwl9CisKKwkvKioKIAkgKiBTZXQgd2hldGhlciB0byBhbGxvdyB0byBjcmVhdGUgYW4gZW1wdHkgY29tbWl0CiAJICoKIAkgKiBAcGFyYW0gYWxsb3dFbXB0eQpAQCAtODA2LDcgKzg3OSw3IEBAIHB1YmxpYyBDb21taXRDb21tYW5kIHNldEFsbChib29sZWFuIGFsbCkgewogCSAqIGNvbW1hbmQgbGluZS4KIAkgKgogCSAqIEBwYXJhbSBhbWVuZAotCSAqICAgICAgICAgICAgd2hldGhlciB0byBhbW1lbmQgdGhlIHRpcCBvZiB0aGUgY3VycmVudCBicmFuY2gKKwkgKiAgICAgICAgICAgIHdoZXRoZXIgdG8gYW1lbmQgdGhlIHRpcCBvZiB0aGUgY3VycmVudCBicmFuY2gKIAkgKiBAcmV0dXJuIHtAY29kZSB0aGlzfQogCSAqLwogCXB1YmxpYyBDb21taXRDb21tYW5kIHNldEFtZW5kKGJvb2xlYW4gYW1lbmQpIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL0Rlc2NyaWJlQ29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvRGVzY3JpYmVDb21tYW5kLmphdmEKaW5kZXggMWU1MjRmYS4uODA1YTg4NiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvRGVzY3JpYmVDb21tYW5kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvRGVzY3JpYmVDb21tYW5kLmphdmEKQEAgLTExLDYgKzExLDcgQEAKIAogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuUl9SRUZTOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuUl9UQUdTOworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5UeXBlZENvbmZpZ0dldHRlci5VTlNFVF9JTlQ7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwpAQCAtMzMsNiArMzQsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLk1pc3NpbmdPYmplY3RFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5mbm1hdGNoLkZpbGVOYW1lTWF0Y2hlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLkpHaXRUZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkFiYnJldkNvbmZpZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0SWQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVmOwpAQCAtODksNiArOTEsMTEgQEAgcHVibGljIGNsYXNzIERlc2NyaWJlQ29tbWFuZCBleHRlbmRzIEdpdENvbW1hbmQ8U3RyaW5nPiB7CiAJcHJpdmF0ZSBib29sZWFuIGFsd2F5czsKIAogCS8qKgorCSAqIFRoZSBwcmVmaXggbGVuZ3RoIHRvIHVzZSB3aGVuIGFiYnJldmlhdGluZyBhIGNvbW1pdCBoYXNoLgorCSAqLworCXByaXZhdGUgaW50IGFiYnJldiA9IFVOU0VUX0lOVDsKKworCS8qKgogCSAqIENvbnN0cnVjdG9yIGZvciBEZXNjcmliZUNvbW1hbmQuCiAJICoKIAkgKiBAcGFyYW0gcmVwbwpAQCAtMjA1LDEyICsyMTIsMzMgQEAgcHVibGljIERlc2NyaWJlQ29tbWFuZCBzZXRBbHdheXMoYm9vbGVhbiBhbHdheXMpIHsKIAkJcmV0dXJuIHRoaXM7CiAJfQogCisJLyoqCisJICogU2V0cyB0aGUgcHJlZml4IGxlbmd0aCB0byB1c2Ugd2hlbiBhYmJyZXZpYXRpbmcgYW4gb2JqZWN0IFNIQS0xLgorCSAqCisJICogQHBhcmFtIGFiYnJldgorCSAqICAgICAgICAgICAgbWluaW11bSBsZW5ndGggb2YgdGhlIGFiYnJldmlhdGVkIHN0cmluZy4gTXVzdCBiZSBpbiB0aGUgcmFuZ2UKKwkgKiAgICAgICAgICAgIFt7QHZhbHVlIEFiYnJldkNvbmZpZyNNSU5fQUJCUkVWfSwKKwkgKiAgICAgICAgICAgIHtAdmFsdWUgQ29uc3RhbnRzI09CSkVDVF9JRF9TVFJJTkdfTEVOR1RIfV0uCisJICogQHJldHVybiB7QGNvZGUgdGhpc30KKwkgKiBAc2luY2UgNi4xCisJICovCisJcHVibGljIERlc2NyaWJlQ29tbWFuZCBzZXRBYmJyZXYoaW50IGFiYnJldikgeworCQlpZiAoYWJicmV2ID09IDApIHsKKwkJCXRoaXMuYWJicmV2ID0gMDsKKwkJfSBlbHNlIHsKKwkJCXRoaXMuYWJicmV2ID0gQWJicmV2Q29uZmlnLmNhcEFiYnJldihhYmJyZXYpOworCQl9CisJCXJldHVybiB0aGlzOworCX0KKwogCXByaXZhdGUgU3RyaW5nIGxvbmdEZXNjcmlwdGlvbihSZWYgdGFnLCBpbnQgZGVwdGgsIE9iamVjdElkIHRpcCkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBTdHJpbmcuZm9ybWF0KAotCQkJCSIlcy0lZC1nJXMiLCBmb3JtYXRSZWZOYW1lKHRhZy5nZXROYW1lKCkpLCAvLyROT04tTkxTLTEkCi0JCQkJSW50ZWdlci52YWx1ZU9mKGRlcHRoKSwgdy5nZXRPYmplY3RSZWFkZXIoKS5hYmJyZXZpYXRlKHRpcCkKLQkJCQkJCS5uYW1lKCkpOworCQlpZiAoYWJicmV2ID09IDApIHsKKwkJCXJldHVybiBmb3JtYXRSZWZOYW1lKHRhZy5nZXROYW1lKCkpOworCQl9CisJCXJldHVybiBTdHJpbmcuZm9ybWF0KCIlcy0lZC1nJXMiLCBmb3JtYXRSZWZOYW1lKHRhZy5nZXROYW1lKCkpLCAvLyROT04tTkxTLTEkCisJCQkJSW50ZWdlci52YWx1ZU9mKGRlcHRoKSwKKwkJCQl3LmdldE9iamVjdFJlYWRlcigpLmFiYnJldmlhdGUodGlwLCBhYmJyZXYpLm5hbWUoKSk7CiAJfQogCiAJLyoqCkBAIC0zMDIsNiArMzMwLDkgQEAgcHVibGljIFN0cmluZyBjYWxsKCkgdGhyb3dzIEdpdEFQSUV4Y2VwdGlvbiB7CiAJCQlpZiAodGFyZ2V0ID09IG51bGwpIHsKIAkJCQlzZXRUYXJnZXQoQ29uc3RhbnRzLkhFQUQpOwogCQkJfQorCQkJaWYgKGFiYnJldiA9PSBVTlNFVF9JTlQpIHsKKwkJCQlhYmJyZXYgPSBBYmJyZXZDb25maWcucGFyc2VGcm9tQ29uZmlnKHJlcG8pLmdldCgpOworCQkJfQogCiAJCQlDb2xsZWN0aW9uPFJlZj4gdGFnTGlzdCA9IHJlcG8uZ2V0UmVmRGF0YWJhc2UoKQogCQkJCQkuZ2V0UmVmc0J5UHJlZml4KHVzZUFsbCA/IFJfUkVGUyA6IFJfVEFHUyk7CkBAIC00MTMsNyArNDQ0LDEyIEBAIFN0cmluZyBkZXNjcmliZShPYmplY3RJZCB0aXApIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAKIAkJCS8vIGlmIGFsbCB0aGUgbm9kZXMgYXJlIGRvbWluYXRlZCBieSBhbGwgdGhlIHRhZ3MsIHRoZSB3YWxrIHN0b3BzCiAJCQlpZiAoY2FuZGlkYXRlcy5pc0VtcHR5KCkpIHsKLQkJCQlyZXR1cm4gYWx3YXlzID8gdy5nZXRPYmplY3RSZWFkZXIoKS5hYmJyZXZpYXRlKHRhcmdldCkubmFtZSgpIDogbnVsbDsKKwkJCQlyZXR1cm4gYWx3YXlzCisJCQkJCQk/IHcuZ2V0T2JqZWN0UmVhZGVyKCkKKwkJCQkJCQkJLmFiYnJldmlhdGUodGFyZ2V0LAorCQkJCQkJCQkJCUFiYnJldkNvbmZpZy5jYXBBYmJyZXYoYWJicmV2KSkKKwkJCQkJCQkJLm5hbWUoKQorCQkJCQkJOiBudWxsOwogCQkJfQogCiAJCQlDYW5kaWRhdGUgYmVzdCA9IENvbGxlY3Rpb25zLm1pbihjYW5kaWRhdGVzLApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvTWVyZ2VDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9NZXJnZUNvbW1hbmQuamF2YQppbmRleCBlZjU2ZDgwLi5jZTA2OGI2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9NZXJnZUNvbW1hbmQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9NZXJnZUNvbW1hbmQuamF2YQpAQCAtNDA1LDcgKzQwNSw3IEBAIHB1YmxpYyBNZXJnZVJlc3VsdCBjYWxsKCkgdGhyb3dzIEdpdEFQSUV4Y2VwdGlvbiwgTm9IZWFkRXhjZXB0aW9uLAogCQkJCQkJCWZhaWxpbmdQYXRocywgbnVsbCk7CiAJCQkJfQogCQkJCVN0cmluZyBtZXJnZU1lc3NhZ2VXaXRoQ29uZmxpY3RzID0gbmV3IE1lcmdlTWVzc2FnZUZvcm1hdHRlcigpCi0JCQkJCQkuZm9ybWF0V2l0aENvbmZsaWN0cyhtZXJnZU1lc3NhZ2UsIHVubWVyZ2VkUGF0aHMpOworCQkJCQkJLmZvcm1hdFdpdGhDb25mbGljdHMobWVyZ2VNZXNzYWdlLCB1bm1lcmdlZFBhdGhzLCAnIycpOwogCQkJCXJlcG8ud3JpdGVNZXJnZUNvbW1pdE1zZyhtZXJnZU1lc3NhZ2VXaXRoQ29uZmxpY3RzKTsKIAkJCQlyZXR1cm4gbmV3IE1lcmdlUmVzdWx0KG51bGwsIG1lcmdlci5nZXRCYXNlQ29tbWl0SWQoKSwKIAkJCQkJCW5ldyBPYmplY3RJZFtdIHsgaGVhZENvbW1pdC5nZXRJZCgpLApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvUHVzaENvbW1hbmQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1B1c2hDb21tYW5kLmphdmEKaW5kZXggYWE1YTYzNC4uMDgzNTNkZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvUHVzaENvbW1hbmQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9QdXNoQ29tbWFuZC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCwgQ2hyaXMgQW5pc3pjenlrIDxjYW5pc3pjenlrQGdtYWlsLmNvbT4gYW5kIG90aGVycworICogQ29weXJpZ2h0IChDKSAyMDEwLCAyMDIyIENocmlzIEFuaXN6Y3p5ayA8Y2FuaXN6Y3p5a0BnbWFpbC5jb20+IGFuZCBvdGhlcnMKICAqCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKQEAgLTIxLDcgKzIxLDkgQEAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzLkRldGFjaGVkSGVhZEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnMuR2l0QVBJRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9ycy5JbnZhbGlkUmVmTmFtZUV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnMuSW52YWxpZFJlbW90ZUV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnMuSkdpdEludGVybmFsRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLk5vdFN1cHBvcnRlZEV4Y2VwdGlvbjsKQEAgLTI5LDExICszMSwxNiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLlRvb0xhcmdlUGFja0V4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5UcmFuc3BvcnRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5KR2l0VGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5CcmFuY2hDb25maWc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uZmlnOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbmZpZ0NvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuTnVsbFByb2dyZXNzTW9uaXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Qcm9ncmVzc01vbml0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVmOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuUHVzaENvbmZpZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5QdXNoQ29uZmlnLlB1c2hEZWZhdWx0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlB1c2hSZXN1bHQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuUmVmTGVhc2VTcGVjOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlJlZlNwZWM7CkBAIC01Miw3ICs1OSw3IEBACiBwdWJsaWMgY2xhc3MgUHVzaENvbW1hbmQgZXh0ZW5kcwogCQlUcmFuc3BvcnRDb21tYW5kPFB1c2hDb21tYW5kLCBJdGVyYWJsZTxQdXNoUmVzdWx0Pj4gewogCi0JcHJpdmF0ZSBTdHJpbmcgcmVtb3RlID0gQ29uc3RhbnRzLkRFRkFVTFRfUkVNT1RFX05BTUU7CisJcHJpdmF0ZSBTdHJpbmcgcmVtb3RlOwogCiAJcHJpdmF0ZSBmaW5hbCBMaXN0PFJlZlNwZWM+IHJlZlNwZWNzOwogCkBAIC03MSw2ICs3OCwxMCBAQCBwdWJsaWMgY2xhc3MgUHVzaENvbW1hbmQgZXh0ZW5kcwogCiAJcHJpdmF0ZSBMaXN0PFN0cmluZz4gcHVzaE9wdGlvbnM7CiAKKwkvLyBMZWdhY3kgYmVoYXZpb3IgYXMgZGVmYXVsdC4gVXNlIHNldFB1c2hEZWZhdWx0KG51bGwpIHRvIGRldGVybWluZSB0aGUKKwkvLyB2YWx1ZSBmcm9tIHRoZSBnaXQgY29uZmlnLgorCXByaXZhdGUgUHVzaERlZmF1bHQgcHVzaERlZmF1bHQgPSBQdXNoRGVmYXVsdC5DVVJSRU5UOworCiAJLyoqCiAJICogPHA+CiAJICogQ29uc3RydWN0b3IgZm9yIFB1c2hDb21tYW5kLgpAQCAtOTgsMTkgKzEwOSwyMCBAQCBwdWJsaWMgSXRlcmFibGU8UHVzaFJlc3VsdD4gY2FsbCgpIHRocm93cyBHaXRBUElFeGNlcHRpb24sCiAJCQlJbnZhbGlkUmVtb3RlRXhjZXB0aW9uLAogCQkJb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzLlRyYW5zcG9ydEV4Y2VwdGlvbiB7CiAJCWNoZWNrQ2FsbGFibGUoKTsKKwkJc2V0Q2FsbGFibGUoZmFsc2UpOwogCiAJCUFycmF5TGlzdDxQdXNoUmVzdWx0PiBwdXNoUmVzdWx0cyA9IG5ldyBBcnJheUxpc3Q8PigzKTsKIAogCQl0cnkgeworCQkJQ29uZmlnIGNvbmZpZyA9IHJlcG8uZ2V0Q29uZmlnKCk7CisJCQlyZW1vdGUgPSBkZXRlcm1pbmVSZW1vdGUoY29uZmlnLCByZW1vdGUpOwogCQkJaWYgKHJlZlNwZWNzLmlzRW1wdHkoKSkgewotCQkJCVJlbW90ZUNvbmZpZyBjb25maWcgPSBuZXcgUmVtb3RlQ29uZmlnKHJlcG8uZ2V0Q29uZmlnKCksCisJCQkJUmVtb3RlQ29uZmlnIHJjID0gbmV3IFJlbW90ZUNvbmZpZyhjb25maWcsCiAJCQkJCQlnZXRSZW1vdGUoKSk7Ci0JCQkJcmVmU3BlY3MuYWRkQWxsKGNvbmZpZy5nZXRQdXNoUmVmU3BlY3MoKSk7Ci0JCQl9Ci0JCQlpZiAocmVmU3BlY3MuaXNFbXB0eSgpKSB7Ci0JCQkJUmVmIGhlYWQgPSByZXBvLmV4YWN0UmVmKENvbnN0YW50cy5IRUFEKTsKLQkJCQlpZiAoaGVhZCAhPSBudWxsICYmIGhlYWQuaXNTeW1ib2xpYygpKQotCQkJCQlyZWZTcGVjcy5hZGQobmV3IFJlZlNwZWMoaGVhZC5nZXRMZWFmKCkuZ2V0TmFtZSgpKSk7CisJCQkJcmVmU3BlY3MuYWRkQWxsKHJjLmdldFB1c2hSZWZTcGVjcygpKTsKKwkJCQlpZiAocmVmU3BlY3MuaXNFbXB0eSgpKSB7CisJCQkJCWRldGVybWluZURlZmF1bHRSZWZTcGVjcyhjb25maWcpOworCQkJCX0KIAkJCX0KIAogCQkJaWYgKGZvcmNlKSB7CkBAIC0xMTgsOCArMTMwLDggQEAgcHVibGljIEl0ZXJhYmxlPFB1c2hSZXN1bHQ+IGNhbGwoKSB0aHJvd3MgR2l0QVBJRXhjZXB0aW9uLAogCQkJCQlyZWZTcGVjcy5zZXQoaSwgcmVmU3BlY3MuZ2V0KGkpLnNldEZvcmNlVXBkYXRlKHRydWUpKTsKIAkJCX0KIAotCQkJZmluYWwgTGlzdDxUcmFuc3BvcnQ+IHRyYW5zcG9ydHM7Ci0JCQl0cmFuc3BvcnRzID0gVHJhbnNwb3J0Lm9wZW5BbGwocmVwbywgcmVtb3RlLCBUcmFuc3BvcnQuT3BlcmF0aW9uLlBVU0gpOworCQkJTGlzdDxUcmFuc3BvcnQ+IHRyYW5zcG9ydHMgPSBUcmFuc3BvcnQub3BlbkFsbChyZXBvLCByZW1vdGUsCisJCQkJCVRyYW5zcG9ydC5PcGVyYXRpb24uUFVTSCk7CiAJCQlmb3IgKEBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpIC8vIEV4cGxpY2l0bHkgY2xvc2VkIGluIGZpbmFsbHkKIAkJCQkJZmluYWwgVHJhbnNwb3J0IHRyYW5zcG9ydCA6IHRyYW5zcG9ydHMpIHsKIAkJCQl0cmFuc3BvcnQuc2V0UHVzaFRoaW4odGhpbik7CkBAIC0xNzEsNiArMTgzLDEwMiBAQCBwdWJsaWMgSXRlcmFibGU8UHVzaFJlc3VsdD4gY2FsbCgpIHRocm93cyBHaXRBUElFeGNlcHRpb24sCiAJCXJldHVybiBwdXNoUmVzdWx0czsKIAl9CiAKKwlwcml2YXRlIFN0cmluZyBkZXRlcm1pbmVSZW1vdGUoQ29uZmlnIGNvbmZpZywgU3RyaW5nIHJlbW90ZU5hbWUpCisJCQl0aHJvd3MgSU9FeGNlcHRpb24geworCQlpZiAocmVtb3RlTmFtZSAhPSBudWxsKSB7CisJCQlyZXR1cm4gcmVtb3RlTmFtZTsKKwkJfQorCQlSZWYgaGVhZCA9IHJlcG8uZXhhY3RSZWYoQ29uc3RhbnRzLkhFQUQpOworCQlTdHJpbmcgZWZmZWN0aXZlUmVtb3RlID0gbnVsbDsKKwkJQnJhbmNoQ29uZmlnIGJyYW5jaENmZyA9IG51bGw7CisJCWlmIChoZWFkICE9IG51bGwgJiYgaGVhZC5pc1N5bWJvbGljKCkpIHsKKwkJCVN0cmluZyBjdXJyZW50QnJhbmNoID0gaGVhZC5nZXRMZWFmKCkuZ2V0TmFtZSgpOworCQkJYnJhbmNoQ2ZnID0gbmV3IEJyYW5jaENvbmZpZyhjb25maWcsCisJCQkJCVJlcG9zaXRvcnkuc2hvcnRlblJlZk5hbWUoY3VycmVudEJyYW5jaCkpOworCQkJZWZmZWN0aXZlUmVtb3RlID0gYnJhbmNoQ2ZnLmdldFB1c2hSZW1vdGUoKTsKKwkJfQorCQlpZiAoZWZmZWN0aXZlUmVtb3RlID09IG51bGwpIHsKKwkJCWVmZmVjdGl2ZVJlbW90ZSA9IGNvbmZpZy5nZXRTdHJpbmcoCisJCQkJCUNvbmZpZ0NvbnN0YW50cy5DT05GSUdfUkVNT1RFX1NFQ1RJT04sIG51bGwsCisJCQkJCUNvbmZpZ0NvbnN0YW50cy5DT05GSUdfS0VZX1BVU0hfREVGQVVMVCk7CisJCQlpZiAoZWZmZWN0aXZlUmVtb3RlID09IG51bGwgJiYgYnJhbmNoQ2ZnICE9IG51bGwpIHsKKwkJCQllZmZlY3RpdmVSZW1vdGUgPSBicmFuY2hDZmcuZ2V0UmVtb3RlKCk7CisJCQl9CisJCX0KKwkJaWYgKGVmZmVjdGl2ZVJlbW90ZSA9PSBudWxsKSB7CisJCQllZmZlY3RpdmVSZW1vdGUgPSBDb25zdGFudHMuREVGQVVMVF9SRU1PVEVfTkFNRTsKKwkJfQorCQlyZXR1cm4gZWZmZWN0aXZlUmVtb3RlOworCX0KKworCXByaXZhdGUgU3RyaW5nIGdldEN1cnJlbnRCcmFuY2goKQorCQkJdGhyb3dzIElPRXhjZXB0aW9uLCBEZXRhY2hlZEhlYWRFeGNlcHRpb24geworCQlSZWYgaGVhZCA9IHJlcG8uZXhhY3RSZWYoQ29uc3RhbnRzLkhFQUQpOworCQlpZiAoaGVhZCAhPSBudWxsICYmIGhlYWQuaXNTeW1ib2xpYygpKSB7CisJCQlyZXR1cm4gaGVhZC5nZXRMZWFmKCkuZ2V0TmFtZSgpOworCQl9CisJCXRocm93IG5ldyBEZXRhY2hlZEhlYWRFeGNlcHRpb24oKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgZGV0ZXJtaW5lRGVmYXVsdFJlZlNwZWNzKENvbmZpZyBjb25maWcpCisJCQl0aHJvd3MgSU9FeGNlcHRpb24sIEdpdEFQSUV4Y2VwdGlvbiB7CisJCWlmIChwdXNoRGVmYXVsdCA9PSBudWxsKSB7CisJCQlwdXNoRGVmYXVsdCA9IGNvbmZpZy5nZXQoUHVzaENvbmZpZzo6bmV3KS5nZXRQdXNoRGVmYXVsdCgpOworCQl9CisJCXN3aXRjaCAocHVzaERlZmF1bHQpIHsKKwkJY2FzZSBDVVJSRU5UOgorCQkJcmVmU3BlY3MuYWRkKG5ldyBSZWZTcGVjKGdldEN1cnJlbnRCcmFuY2goKSkpOworCQkJYnJlYWs7CisJCWNhc2UgTUFUQ0hJTkc6CisJCQlyZWZTcGVjcy5hZGQobmV3IFJlZlNwZWMoIjoiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCWJyZWFrOworCQljYXNlIE5PVEhJTkc6CisJCQl0aHJvdyBuZXcgSW52YWxpZFJlZk5hbWVFeGNlcHRpb24oCisJCQkJCUpHaXRUZXh0LmdldCgpLnB1c2hEZWZhdWx0Tm90aGluZyk7CisJCWNhc2UgU0lNUExFOgorCQljYXNlIFVQU1RSRUFNOgorCQkJU3RyaW5nIGN1cnJlbnRCcmFuY2ggPSBnZXRDdXJyZW50QnJhbmNoKCk7CisJCQlCcmFuY2hDb25maWcgYnJhbmNoQ2ZnID0gbmV3IEJyYW5jaENvbmZpZyhjb25maWcsCisJCQkJCVJlcG9zaXRvcnkuc2hvcnRlblJlZk5hbWUoY3VycmVudEJyYW5jaCkpOworCQkJU3RyaW5nIGZldGNoUmVtb3RlID0gYnJhbmNoQ2ZnLmdldFJlbW90ZSgpOworCQkJaWYgKGZldGNoUmVtb3RlID09IG51bGwpIHsKKwkJCQlmZXRjaFJlbW90ZSA9IENvbnN0YW50cy5ERUZBVUxUX1JFTU9URV9OQU1FOworCQkJfQorCQkJYm9vbGVhbiBpc1RyaWFuZ3VsYXIgPSAhZmV0Y2hSZW1vdGUuZXF1YWxzKHJlbW90ZSk7CisJCQlpZiAoaXNUcmlhbmd1bGFyKSB7CisJCQkJaWYgKFB1c2hEZWZhdWx0LlVQU1RSRUFNLmVxdWFscyhwdXNoRGVmYXVsdCkpIHsKKwkJCQkJdGhyb3cgbmV3IEludmFsaWRSZWZOYW1lRXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAorCQkJCQkJCUpHaXRUZXh0LmdldCgpLnB1c2hEZWZhdWx0VHJpYW5ndWxhclVwc3RyZWFtLAorCQkJCQkJCXJlbW90ZSwgZmV0Y2hSZW1vdGUpKTsKKwkJCQl9CisJCQkJLy8gU3RyYW5nZSwgYnV0IGNvbnNpc3RlbnQgd2l0aCBDIGdpdDogInNpbXBsZSIgZG9lc24ndCBldmVuCisJCQkJLy8gY2hlY2sgd2hldGhlciB0aGVyZSBpcyBhIGNvbmZpZ3VyZWQgdXBzdHJlYW0sIGFuZCBpZiBzbywgdGhhdAorCQkJCS8vIGl0IGlzIGVxdWFsIHRvIHRoZSBsb2NhbCBicmFuY2ggbmFtZS4gSXQganVzdCBiZWNvbWVzCisJCQkJLy8gImN1cnJlbnQiLgorCQkJCXJlZlNwZWNzLmFkZChuZXcgUmVmU3BlYyhjdXJyZW50QnJhbmNoKSk7CisJCQl9IGVsc2UgeworCQkJCVN0cmluZyB0cmFja2VkQnJhbmNoID0gYnJhbmNoQ2ZnLmdldE1lcmdlKCk7CisJCQkJaWYgKGJyYW5jaENmZy5pc1JlbW90ZUxvY2FsKCkgfHwgdHJhY2tlZEJyYW5jaCA9PSBudWxsCisJCQkJCQl8fCAhdHJhY2tlZEJyYW5jaC5zdGFydHNXaXRoKENvbnN0YW50cy5SX0hFQURTKSkgeworCQkJCQl0aHJvdyBuZXcgSW52YWxpZFJlZk5hbWVFeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoCisJCQkJCQkJSkdpdFRleHQuZ2V0KCkucHVzaERlZmF1bHROb1Vwc3RyZWFtLAorCQkJCQkJCWN1cnJlbnRCcmFuY2gpKTsKKwkJCQl9CisJCQkJaWYgKFB1c2hEZWZhdWx0LlNJTVBMRS5lcXVhbHMocHVzaERlZmF1bHQpCisJCQkJCQkmJiAhdHJhY2tlZEJyYW5jaC5lcXVhbHMoY3VycmVudEJyYW5jaCkpIHsKKwkJCQkJdGhyb3cgbmV3IEludmFsaWRSZWZOYW1lRXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAorCQkJCQkJCUpHaXRUZXh0LmdldCgpLnB1c2hEZWZhdWx0U2ltcGxlLCBjdXJyZW50QnJhbmNoLAorCQkJCQkJCXRyYWNrZWRCcmFuY2gpKTsKKwkJCQl9CisJCQkJcmVmU3BlY3MuYWRkKG5ldyBSZWZTcGVjKGN1cnJlbnRCcmFuY2ggKyAnOicgKyB0cmFja2VkQnJhbmNoKSk7CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXRocm93IG5ldyBJbnZhbGlkUmVmTmFtZUV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0CisJCQkJCS5mb3JtYXQoSkdpdFRleHQuZ2V0KCkucHVzaERlZmF1bHRVbmtub3duLCBwdXNoRGVmYXVsdCkpOworCQl9CisJfQorCiAJLyoqCiAJICogVGhlIHJlbW90ZSAodXJpIG9yIG5hbWUpIHVzZWQgZm9yIHRoZSBwdXNoIG9wZXJhdGlvbi4gSWYgbm8gcmVtb3RlIGlzCiAJICogc2V0LCB0aGUgZGVmYXVsdCB2YWx1ZSBvZiA8Y29kZT5Db25zdGFudHMuREVGQVVMVF9SRU1PVEVfTkFNRTwvY29kZT4gd2lsbApAQCAtMzM2LDkgKzQ0NCwzNyBAQCBwdWJsaWMgUHVzaENvbW1hbmQgc2V0UmVmU3BlY3MoTGlzdDxSZWZTcGVjPiBzcGVjcykgewogCX0KIAogCS8qKgorCSAqIFJldHJpZXZlcyB0aGUge0BsaW5rIFB1c2hEZWZhdWx0fSBjdXJyZW50bHkgc2V0LgorCSAqCisJICogQHJldHVybiB0aGUge0BsaW5rIFB1c2hEZWZhdWx0fSwgb3Ige0Bjb2RlIG51bGx9IGlmIG5vdCBzZXQKKwkgKiBAc2luY2UgNi4xCisJICovCisJcHVibGljIFB1c2hEZWZhdWx0IGdldFB1c2hEZWZhdWx0KCkgeworCQlyZXR1cm4gcHVzaERlZmF1bHQ7CisJfQorCisJLyoqCisJICogU2V0cyBhbiBleHBsaWNpdCB7QGxpbmsgUHVzaERlZmF1bHR9LiBUaGUgZGVmYXVsdCB1c2VkIGlmIHRoaXMgaXMgbm90CisJICogY2FsbGVkIGlzIHtAbGluayBQdXNoRGVmYXVsdCNDVVJSRU5UfSBmb3IgY29tcGF0aWJpbGl0eSByZWFzb25zIHdpdGgKKwkgKiBlYXJsaWVyIEpHaXQgdmVyc2lvbnMuCisJICoKKwkgKiBAcGFyYW0gcHVzaERlZmF1bHQKKwkgKiAgICAgICAgICAgIHtAbGluayBQdXNoRGVmYXVsdH0gdG8gc2V0OyBpZiB7QGNvZGUgbnVsbH0gdGhlIHZhbHVlIGRlZmluZWQKKwkgKiAgICAgICAgICAgIGluIHRoZSBnaXQgY29uZmlnIHdpbGwgYmUgdXNlZC4KKwkgKgorCSAqIEByZXR1cm4ge0Bjb2RlIHRoaXN9CisJICogQHNpbmNlIDYuMQorCSAqLworCXB1YmxpYyBQdXNoQ29tbWFuZCBzZXRQdXNoRGVmYXVsdChQdXNoRGVmYXVsdCBwdXNoRGVmYXVsdCkgeworCQljaGVja0NhbGxhYmxlKCk7CisJCXRoaXMucHVzaERlZmF1bHQgPSBwdXNoRGVmYXVsdDsKKwkJcmV0dXJuIHRoaXM7CisJfQorCisJLyoqCiAJICogUHVzaCBhbGwgYnJhbmNoZXMgdW5kZXIgcmVmcy9oZWFkcy8qLgogCSAqCi0JICogQHJldHVybiB7Y29kZSB0aGlzfQorCSAqIEByZXR1cm4ge0Bjb2RlIHRoaXN9CiAJICovCiAJcHVibGljIFB1c2hDb21tYW5kIHNldFB1c2hBbGwoKSB7CiAJCXJlZlNwZWNzLmFkZChUcmFuc3BvcnQuUkVGU1BFQ19QVVNIX0FMTCk7CkBAIC0zNDgsNyArNDg0LDcgQEAgcHVibGljIFB1c2hDb21tYW5kIHNldFB1c2hBbGwoKSB7CiAJLyoqCiAJICogUHVzaCBhbGwgdGFncyB1bmRlciByZWZzL3RhZ3MvKi4KIAkgKgotCSAqIEByZXR1cm4ge2NvZGUgdGhpc30KKwkgKiBAcmV0dXJuIHtAY29kZSB0aGlzfQogCSAqLwogCXB1YmxpYyBQdXNoQ29tbWFuZCBzZXRQdXNoVGFncygpIHsKIAkJcmVmU3BlY3MuYWRkKFRyYW5zcG9ydC5SRUZTUEVDX1RBR1MpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvUmViYXNlQ29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvUmViYXNlQ29tbWFuZC5qYXZhCmluZGV4IGEyNmZmYzIuLjJiMGQ4Y2UgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1JlYmFzZUNvbW1hbmQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9SZWJhc2VDb21tYW5kLmphdmEKQEAgLTI5LDYgKzI5LDcgQEAKIGltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKIGltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYW5ub3RhdGlvbnMuTm9uTnVsbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5SZWJhc2VSZXN1bHQuU3RhdHVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLlJlc2V0Q29tbWFuZC5SZXNldFR5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzLkNoZWNrb3V0Q29uZmxpY3RFeGNlcHRpb247CkBAIC01Miw2ICs1Myw4IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5KR2l0VGV4dDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5BYmJyZXZpYXRlZE9iamVjdElkOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkFueU9iamVjdElkOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbW1pdENvbmZpZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db21taXRDb25maWcuQ2xlYW51cE1vZGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uZmlnQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5OdWxsUHJvZ3Jlc3NNb25pdG9yOwpAQCAtMjA1LDYgKzIwOCw4IEBAIHB1YmxpYyBlbnVtIE9wZXJhdGlvbiB7CiAKIAlwcml2YXRlIEludGVyYWN0aXZlSGFuZGxlciBpbnRlcmFjdGl2ZUhhbmRsZXI7CiAKKwlwcml2YXRlIENvbW1pdENvbmZpZyBjb21taXRDb25maWc7CisKIAlwcml2YXRlIGJvb2xlYW4gc3RvcEFmdGVySW5pdGlhbGl6YXRpb24gPSBmYWxzZTsKIAogCXByaXZhdGUgUmV2Q29tbWl0IG5ld0hlYWQ7CkBAIC0yNDYsNiArMjUxLDcgQEAgcHVibGljIFJlYmFzZVJlc3VsdCBjYWxsKCkgdGhyb3dzIEdpdEFQSUV4Y2VwdGlvbiwgTm9IZWFkRXhjZXB0aW9uLAogCQlsYXN0U3RlcFdhc0ZvcndhcmQgPSBmYWxzZTsKIAkJY2hlY2tDYWxsYWJsZSgpOwogCQljaGVja1BhcmFtZXRlcnMoKTsKKwkJY29tbWl0Q29uZmlnID0gcmVwby5nZXRDb25maWcoKS5nZXQoQ29tbWl0Q29uZmlnLktFWSk7CiAJCXRyeSB7CiAJCQlzd2l0Y2ggKG9wZXJhdGlvbikgewogCQkJY2FzZSBBQk9SVDoKQEAgLTQ0MSwxMSArNDQ3LDE2IEBAIHByaXZhdGUgUmViYXNlUmVzdWx0IHByb2Nlc3NTdGVwKFJlYmFzZVRvZG9MaW5lIHN0ZXAsIGJvb2xlYW4gc2hvdWxkUGljaykKIAkJCXJldHVybiBudWxsOyAvLyBjb250aW51ZSByZWJhc2UgcHJvY2VzcyBvbiBwaWNrIGNvbW1hbmQKIAkJY2FzZSBSRVdPUkQ6CiAJCQlTdHJpbmcgb2xkTWVzc2FnZSA9IGNvbW1pdFRvUGljay5nZXRGdWxsTWVzc2FnZSgpOwotCQkJU3RyaW5nIG5ld01lc3NhZ2UgPSBpbnRlcmFjdGl2ZUhhbmRsZXIKLQkJCQkJLm1vZGlmeUNvbW1pdE1lc3NhZ2Uob2xkTWVzc2FnZSk7CisJCQlDbGVhbnVwTW9kZSBtb2RlID0gY29tbWl0Q29uZmlnLnJlc29sdmUoQ2xlYW51cE1vZGUuREVGQVVMVCwgdHJ1ZSk7CisJCQlib29sZWFuW10gZG9DaGFuZ2VJZCA9IHsgZmFsc2UgfTsKKwkJCVN0cmluZyBuZXdNZXNzYWdlID0gZWRpdENvbW1pdE1lc3NhZ2UoZG9DaGFuZ2VJZCwgb2xkTWVzc2FnZSwgbW9kZSk7CiAJCQl0cnkgKEdpdCBnaXQgPSBuZXcgR2l0KHJlcG8pKSB7Ci0JCQkJbmV3SGVhZCA9IGdpdC5jb21taXQoKS5zZXRNZXNzYWdlKG5ld01lc3NhZ2UpLnNldEFtZW5kKHRydWUpCi0JCQkJCQkuc2V0Tm9WZXJpZnkodHJ1ZSkuY2FsbCgpOworCQkJCW5ld0hlYWQgPSBnaXQuY29tbWl0KCkKKwkJCQkJCS5zZXRNZXNzYWdlKG5ld01lc3NhZ2UpCisJCQkJCQkuc2V0QW1lbmQodHJ1ZSkKKwkJCQkJCS5zZXROb1ZlcmlmeSh0cnVlKQorCQkJCQkJLnNldEluc2VydENoYW5nZUlkKGRvQ2hhbmdlSWRbMF0pCisJCQkJCQkuY2FsbCgpOwogCQkJfQogCQkJcmV0dXJuIG51bGw7CiAJCWNhc2UgRURJVDoKQEAgLTQ2MCwxNyArNDcxLDQ5IEBAIHByaXZhdGUgUmViYXNlUmVzdWx0IHByb2Nlc3NTdGVwKFJlYmFzZVRvZG9MaW5lIHN0ZXAsIGJvb2xlYW4gc2hvdWxkUGljaykKIAkJCXJlc2V0U29mdFRvUGFyZW50KCk7CiAJCQlMaXN0PFJlYmFzZVRvZG9MaW5lPiBzdGVwcyA9IHJlcG8ucmVhZFJlYmFzZVRvZG8oCiAJCQkJCXJlYmFzZVN0YXRlLmdldFBhdGgoR0lUX1JFQkFTRV9UT0RPKSwgZmFsc2UpOwotCQkJUmViYXNlVG9kb0xpbmUgbmV4dFN0ZXAgPSBzdGVwcy5pc0VtcHR5KCkgPyBudWxsIDogc3RlcHMuZ2V0KDApOworCQkJYm9vbGVhbiBpc0xhc3QgPSBzdGVwcy5pc0VtcHR5KCk7CisJCQlpZiAoIWlzTGFzdCkgeworCQkJCXN3aXRjaCAoc3RlcHMuZ2V0KDApLmdldEFjdGlvbigpKSB7CisJCQkJY2FzZSBGSVhVUDoKKwkJCQljYXNlIFNRVUFTSDoKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJaXNMYXN0ID0gdHJ1ZTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQogCQkJRmlsZSBtZXNzYWdlRml4dXBGaWxlID0gcmViYXNlU3RhdGUuZ2V0RmlsZShNRVNTQUdFX0ZJWFVQKTsKIAkJCUZpbGUgbWVzc2FnZVNxdWFzaEZpbGUgPSByZWJhc2VTdGF0ZS5nZXRGaWxlKE1FU1NBR0VfU1FVQVNIKTsKLQkJCWlmIChpc1NxdWFzaCAmJiBtZXNzYWdlRml4dXBGaWxlLmV4aXN0cygpKQorCQkJaWYgKGlzU3F1YXNoICYmIG1lc3NhZ2VGaXh1cEZpbGUuZXhpc3RzKCkpIHsKIAkJCQltZXNzYWdlRml4dXBGaWxlLmRlbGV0ZSgpOwotCQkJbmV3SGVhZCA9IGRvU3F1YXNoRml4dXAoaXNTcXVhc2gsIGNvbW1pdFRvUGljaywgbmV4dFN0ZXAsCisJCQl9CisJCQluZXdIZWFkID0gZG9TcXVhc2hGaXh1cChpc1NxdWFzaCwgY29tbWl0VG9QaWNrLCBpc0xhc3QsCiAJCQkJCW1lc3NhZ2VGaXh1cEZpbGUsIG1lc3NhZ2VTcXVhc2hGaWxlKTsKIAkJfQogCQlyZXR1cm4gbnVsbDsKIAl9CiAKKwlwcml2YXRlIFN0cmluZyBlZGl0Q29tbWl0TWVzc2FnZShib29sZWFuW10gZG9DaGFuZ2VJZCwgU3RyaW5nIG1lc3NhZ2UsCisJCQlATm9uTnVsbCBDbGVhbnVwTW9kZSBtb2RlKSB7CisJCVN0cmluZyBuZXdNZXNzYWdlOworCQlDb21taXRDb25maWcuQ2xlYW51cE1vZGUgY2xlYW51cDsKKwkJaWYgKGludGVyYWN0aXZlSGFuZGxlciBpbnN0YW5jZW9mIEludGVyYWN0aXZlSGFuZGxlcjIpIHsKKwkJCUludGVyYWN0aXZlSGFuZGxlcjIuTW9kaWZ5UmVzdWx0IG1vZGlmaWNhdGlvbiA9ICgoSW50ZXJhY3RpdmVIYW5kbGVyMikgaW50ZXJhY3RpdmVIYW5kbGVyKQorCQkJCQkuZWRpdENvbW1pdE1lc3NhZ2UobWVzc2FnZSwgbW9kZSwgJyMnKTsKKwkJCW5ld01lc3NhZ2UgPSBtb2RpZmljYXRpb24uZ2V0TWVzc2FnZSgpOworCQkJY2xlYW51cCA9IG1vZGlmaWNhdGlvbi5nZXRDbGVhbnVwTW9kZSgpOworCQkJaWYgKENsZWFudXBNb2RlLkRFRkFVTFQuZXF1YWxzKGNsZWFudXApKSB7CisJCQkJY2xlYW51cCA9IG1vZGU7CisJCQl9CisJCQlkb0NoYW5nZUlkWzBdID0gbW9kaWZpY2F0aW9uLnNob3VsZEFkZENoYW5nZUlkKCk7CisJCX0gZWxzZSB7CisJCQluZXdNZXNzYWdlID0gaW50ZXJhY3RpdmVIYW5kbGVyLm1vZGlmeUNvbW1pdE1lc3NhZ2UobWVzc2FnZSk7CisJCQljbGVhbnVwID0gQ29tbWl0Q29uZmlnLkNsZWFudXBNb2RlLlNUUklQOworCQkJZG9DaGFuZ2VJZFswXSA9IGZhbHNlOworCQl9CisJCXJldHVybiBDb21taXRDb25maWcuY2xlYW5UZXh0KG5ld01lc3NhZ2UsIGNsZWFudXAsICcjJyk7CisJfQorCiAJcHJpdmF0ZSBSZWJhc2VSZXN1bHQgY2hlcnJ5UGlja0NvbW1pdChSZXZDb21taXQgY29tbWl0VG9QaWNrKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uLCBHaXRBUElFeGNlcHRpb24sIE5vTWVzc2FnZUV4Y2VwdGlvbiwKIAkJCVVubWVyZ2VkUGF0aHNFeGNlcHRpb24sIENvbmN1cnJlbnRSZWZVcGRhdGVFeGNlcHRpb24sCkBAIC03MDcsNyArNzUwLDcgQEAgcHJpdmF0ZSB2b2lkIGNoZWNrU3RlcHMoTGlzdDxSZWJhc2VUb2RvTGluZT4gc3RlcHMpCiAJfQogCiAJcHJpdmF0ZSBSZXZDb21taXQgZG9TcXVhc2hGaXh1cChib29sZWFuIGlzU3F1YXNoLCBSZXZDb21taXQgY29tbWl0VG9QaWNrLAotCQkJUmViYXNlVG9kb0xpbmUgbmV4dFN0ZXAsIEZpbGUgbWVzc2FnZUZpeHVwLCBGaWxlIG1lc3NhZ2VTcXVhc2gpCisJCQlib29sZWFuIGlzTGFzdCwgRmlsZSBtZXNzYWdlRml4dXAsIEZpbGUgbWVzc2FnZVNxdWFzaCkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiwgR2l0QVBJRXhjZXB0aW9uIHsKIAogCQlpZiAoIW1lc3NhZ2VTcXVhc2guZXhpc3RzKCkpIHsKQEAgLTcxNywyNCArNzYwLDIwIEBAIHByaXZhdGUgUmV2Q29tbWl0IGRvU3F1YXNoRml4dXAoYm9vbGVhbiBpc1NxdWFzaCwgUmV2Q29tbWl0IGNvbW1pdFRvUGljaywKIAogCQkJaW5pdGlhbGl6ZVNxdWFzaEZpeHVwRmlsZShNRVNTQUdFX1NRVUFTSCwKIAkJCQkJcHJldmlvdXNDb21taXQuZ2V0RnVsbE1lc3NhZ2UoKSk7Ci0JCQlpZiAoIWlzU3F1YXNoKQotCQkJCWluaXRpYWxpemVTcXVhc2hGaXh1cEZpbGUoTUVTU0FHRV9GSVhVUCwKLQkJCQkJcHJldmlvdXNDb21taXQuZ2V0RnVsbE1lc3NhZ2UoKSk7CisJCQlpZiAoIWlzU3F1YXNoKSB7CisJCQkJcmViYXNlU3RhdGUuY3JlYXRlRmlsZShNRVNTQUdFX0ZJWFVQLAorCQkJCQkJcHJldmlvdXNDb21taXQuZ2V0RnVsbE1lc3NhZ2UoKSk7CisJCQl9CiAJCX0KLQkJU3RyaW5nIGN1cnJTcXVhc2hNZXNzYWdlID0gcmViYXNlU3RhdGUKLQkJCQkucmVhZEZpbGUoTUVTU0FHRV9TUVVBU0gpOworCQlTdHJpbmcgY3VyclNxdWFzaE1lc3NhZ2UgPSByZWJhc2VTdGF0ZS5yZWFkRmlsZShNRVNTQUdFX1NRVUFTSCk7CiAKIAkJaW50IGNvdW50ID0gcGFyc2VTcXVhc2hGaXh1cFNlcXVlbmNlQ291bnQoY3VyclNxdWFzaE1lc3NhZ2UpICsgMTsKIAogCQlTdHJpbmcgY29udGVudCA9IGNvbXBvc2VTcXVhc2hNZXNzYWdlKGlzU3F1YXNoLAogCQkJCWNvbW1pdFRvUGljaywgY3VyclNxdWFzaE1lc3NhZ2UsIGNvdW50KTsKIAkJcmViYXNlU3RhdGUuY3JlYXRlRmlsZShNRVNTQUdFX1NRVUFTSCwgY29udGVudCk7Ci0JCWlmIChtZXNzYWdlRml4dXAuZXhpc3RzKCkpCi0JCQlyZWJhc2VTdGF0ZS5jcmVhdGVGaWxlKE1FU1NBR0VfRklYVVAsIGNvbnRlbnQpOwogCi0JCXJldHVybiBzcXVhc2hJbnRvUHJldmlvdXMoCi0JCQkJIW1lc3NhZ2VGaXh1cC5leGlzdHMoKSwKLQkJCQluZXh0U3RlcCk7CisJCXJldHVybiBzcXVhc2hJbnRvUHJldmlvdXMoIW1lc3NhZ2VGaXh1cC5leGlzdHMoKSwgaXNMYXN0KTsKIAl9CiAKIAlwcml2YXRlIHZvaWQgcmVzZXRTb2Z0VG9QYXJlbnQoKSB0aHJvd3MgSU9FeGNlcHRpb24sCkBAIC03NTYsMjYgKzc5NSwzMCBAQCBwcml2YXRlIHZvaWQgcmVzZXRTb2Z0VG9QYXJlbnQoKSB0aHJvd3MgSU9FeGNlcHRpb24sCiAJfQogCiAJcHJpdmF0ZSBSZXZDb21taXQgc3F1YXNoSW50b1ByZXZpb3VzKGJvb2xlYW4gc2VxdWVuY2VDb250YWluc1NxdWFzaCwKLQkJCVJlYmFzZVRvZG9MaW5lIG5leHRTdGVwKQorCQkJYm9vbGVhbiBpc0xhc3QpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24sIEdpdEFQSUV4Y2VwdGlvbiB7CiAJCVJldkNvbW1pdCByZXROZXdIZWFkOwotCQlTdHJpbmcgY29tbWl0TWVzc2FnZSA9IHJlYmFzZVN0YXRlCi0JCQkJLnJlYWRGaWxlKE1FU1NBR0VfU1FVQVNIKTsKLQorCQlTdHJpbmcgY29tbWl0TWVzc2FnZTsKKwkJaWYgKCFpc0xhc3QgfHwgc2VxdWVuY2VDb250YWluc1NxdWFzaCkgeworCQkJY29tbWl0TWVzc2FnZSA9IHJlYmFzZVN0YXRlLnJlYWRGaWxlKE1FU1NBR0VfU1FVQVNIKTsKKwkJfSBlbHNlIHsKKwkJCWNvbW1pdE1lc3NhZ2UgPSByZWJhc2VTdGF0ZS5yZWFkRmlsZShNRVNTQUdFX0ZJWFVQKTsKKwkJfQogCQl0cnkgKEdpdCBnaXQgPSBuZXcgR2l0KHJlcG8pKSB7Ci0JCQlpZiAobmV4dFN0ZXAgPT0gbnVsbCB8fCAoKG5leHRTdGVwLmdldEFjdGlvbigpICE9IEFjdGlvbi5GSVhVUCkKLQkJCQkJJiYgKG5leHRTdGVwLmdldEFjdGlvbigpICE9IEFjdGlvbi5TUVVBU0gpKSkgewotCQkJCS8vIHRoaXMgaXMgdGhlIGxhc3Qgc3RlcCBpbiB0aGlzIHNlcXVlbmNlCisJCQlpZiAoaXNMYXN0KSB7CisJCQkJYm9vbGVhbltdIGRvQ2hhbmdlSWQgPSB7IGZhbHNlIH07CiAJCQkJaWYgKHNlcXVlbmNlQ29udGFpbnNTcXVhc2gpIHsKLQkJCQkJY29tbWl0TWVzc2FnZSA9IGludGVyYWN0aXZlSGFuZGxlcgotCQkJCQkJCS5tb2RpZnlDb21taXRNZXNzYWdlKGNvbW1pdE1lc3NhZ2UpOworCQkJCQljb21taXRNZXNzYWdlID0gZWRpdENvbW1pdE1lc3NhZ2UoZG9DaGFuZ2VJZCwgY29tbWl0TWVzc2FnZSwKKwkJCQkJCQlDbGVhbnVwTW9kZS5TVFJJUCk7CiAJCQkJfQogCQkJCXJldE5ld0hlYWQgPSBnaXQuY29tbWl0KCkKLQkJCQkJCS5zZXRNZXNzYWdlKHN0cmlwQ29tbWVudExpbmVzKGNvbW1pdE1lc3NhZ2UpKQotCQkJCQkJLnNldEFtZW5kKHRydWUpLnNldE5vVmVyaWZ5KHRydWUpLmNhbGwoKTsKKwkJCQkJCS5zZXRNZXNzYWdlKGNvbW1pdE1lc3NhZ2UpCisJCQkJCQkuc2V0QW1lbmQodHJ1ZSkKKwkJCQkJCS5zZXROb1ZlcmlmeSh0cnVlKQorCQkJCQkJLnNldEluc2VydENoYW5nZUlkKGRvQ2hhbmdlSWRbMF0pCisJCQkJCQkuY2FsbCgpOwogCQkJCXJlYmFzZVN0YXRlLmdldEZpbGUoTUVTU0FHRV9TUVVBU0gpLmRlbGV0ZSgpOwogCQkJCXJlYmFzZVN0YXRlLmdldEZpbGUoTUVTU0FHRV9GSVhVUCkuZGVsZXRlKCk7Ci0KIAkJCX0gZWxzZSB7CiAJCQkJLy8gTmV4dCBzdGVwIGlzIGVpdGhlciBTcXVhc2ggb3IgRml4dXAKIAkJCQlyZXROZXdIZWFkID0gZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoY29tbWl0TWVzc2FnZSkKQEAgLTc4NSwyMSArODI4LDYgQEAgcHJpdmF0ZSBSZXZDb21taXQgc3F1YXNoSW50b1ByZXZpb3VzKGJvb2xlYW4gc2VxdWVuY2VDb250YWluc1NxdWFzaCwKIAkJcmV0dXJuIHJldE5ld0hlYWQ7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHN0cmlwQ29tbWVudExpbmVzKFN0cmluZyBjb21taXRNZXNzYWdlKSB7Ci0JCVN0cmluZ0J1aWxkZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJZm9yIChTdHJpbmcgbGluZSA6IGNvbW1pdE1lc3NhZ2Uuc3BsaXQoIlxuIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKCFsaW5lLnRyaW0oKS5zdGFydHNXaXRoKCIjIikpIC8vJE5PTi1OTFMtMSQKLQkJCQlyZXN1bHQuYXBwZW5kKGxpbmUpLmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmICghY29tbWl0TWVzc2FnZS5lbmRzV2l0aCgiXG4iKSkgeyAvLyROT04tTkxTLTEkCi0JCQlpbnQgYnVmZmVyU2l6ZSA9IHJlc3VsdC5sZW5ndGgoKTsKLQkJCWlmIChidWZmZXJTaXplID4gMCAmJiByZXN1bHQuY2hhckF0KGJ1ZmZlclNpemUgLSAxKSA9PSAnXG4nKSB7Ci0JCQkJcmVzdWx0LmRlbGV0ZUNoYXJBdChidWZmZXJTaXplIC0gMSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQogCUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQogCXByaXZhdGUgc3RhdGljIFN0cmluZyBjb21wb3NlU3F1YXNoTWVzc2FnZShib29sZWFuIGlzU3F1YXNoLAogCQkJUmV2Q29tbWl0IGNvbW1pdFRvUGljaywgU3RyaW5nIGN1cnJTcXVhc2hNZXNzYWdlLCBpbnQgY291bnQpIHsKQEAgLTE2MjUsMjYgKzE2NTMsMTA2IEBAIHB1YmxpYyBSZWJhc2VDb21tYW5kIHNldFByZXNlcnZlTWVyZ2VzKGJvb2xlYW4gcHJlc2VydmUpIHsKIAl9CiAKIAkvKioKLQkgKiBBbGxvd3MgY29uZmlndXJlIHJlYmFzZSBpbnRlcmFjdGl2ZSBwcm9jZXNzIGFuZCBtb2RpZnkgY29tbWl0IG1lc3NhZ2UKKwkgKiBBbGxvd3MgdG8gY29uZmlndXJlIHRoZSBpbnRlcmFjdGl2ZSByZWJhc2UgcHJvY2VzcyBzdGVwcyBhbmQgdG8gbW9kaWZ5CisJICogY29tbWl0IG1lc3NhZ2VzLgogCSAqLwogCXB1YmxpYyBpbnRlcmZhY2UgSW50ZXJhY3RpdmVIYW5kbGVyIHsKKwogCQkvKioKLQkJICogR2l2ZW4gbGlzdCBvZiB7QGNvZGUgc3RlcHN9IHNob3VsZCBiZSBtb2RpZmllZCBhY2NvcmRpbmcgdG8gdXNlcgotCQkgKiByZWJhc2UgY29uZmlndXJhdGlvbgorCQkgKiBDYWxsYmFjayBBUEkgdG8gbW9kaWZ5IHRoZSBpbml0aWFsIGxpc3Qgb2YgaW50ZXJhY3RpdmUgcmViYXNlIHN0ZXBzLgorCQkgKgogCQkgKiBAcGFyYW0gc3RlcHMKLQkJICogICAgICAgICAgICBpbml0aWFsIGNvbmZpZ3VyYXRpb24gb2YgcmViYXNlIGludGVyYWN0aXZlCisJCSAqICAgICAgICAgICAgaW5pdGlhbCBjb25maWd1cmF0aW9uIG9mIGludGVyYWN0aXZlIHJlYmFzZQogCQkgKi8KIAkJdm9pZCBwcmVwYXJlU3RlcHMoTGlzdDxSZWJhc2VUb2RvTGluZT4gc3RlcHMpOwogCiAJCS8qKgotCQkgKiBVc2VkIGZvciBlZGl0aW5nIGNvbW1pdCBtZXNzYWdlIG9uIFJFV09SRAorCQkgKiBVc2VkIGZvciBlZGl0aW5nIGNvbW1pdCBtZXNzYWdlIG9uIFJFV09SRCBvciBTUVVBU0guCiAJCSAqCi0JCSAqIEBwYXJhbSBjb21taXQKKwkJICogQHBhcmFtIG1lc3NhZ2UKKwkJICogICAgICAgICAgICBleGlzdGluZyBjb21taXQgbWVzc2FnZQogCQkgKiBAcmV0dXJuIG5ldyBjb21taXQgbWVzc2FnZQogCQkgKi8KLQkJU3RyaW5nIG1vZGlmeUNvbW1pdE1lc3NhZ2UoU3RyaW5nIGNvbW1pdCk7CisJCVN0cmluZyBtb2RpZnlDb21taXRNZXNzYWdlKFN0cmluZyBtZXNzYWdlKTsKIAl9CiAKKwkvKioKKwkgKiBFeHRlbmRzIHtAbGluayBJbnRlcmFjdGl2ZUhhbmRsZXJ9IHdpdGggYW4gZW5oYW5jZWQgY2FsbGJhY2sgZm9yIGVkaXRpbmcKKwkgKiBjb21taXQgbWVzc2FnZXMuCisJICoKKwkgKiBAc2luY2UgNi4xCisJICovCisJcHVibGljIGludGVyZmFjZSBJbnRlcmFjdGl2ZUhhbmRsZXIyIGV4dGVuZHMgSW50ZXJhY3RpdmVIYW5kbGVyIHsKKworCQkvKioKKwkJICogQ2FsbGJhY2sgQVBJIGZvciBlZGl0aW5nIGEgY29tbWl0IG1lc3NhZ2Ugb24gUkVXT1JEIG9yIFNRVUFTSC4KKwkJICogPHA+CisJCSAqIFRoZSBjYWxsYmFjayBnZXRzIHRoZSBjb21tZW50IGNoYXJhY3RlciBjdXJyZW50bHkgc2V0LCBhbmQgdGhlCisJCSAqIGNsZWFuLXVwIG1vZGUuIEl0IGNhbiB1c2UgdGhpcyBpbmZvcm1hdGlvbiB3aGVuIHByZXNlbnRpbmcgdGhlCisJCSAqIG1lc3NhZ2UgdG8gdGhlIHVzZXIsIGFuZCBpdCBhbHNvIGhhcyB0aGUgcG9zc2liaWxpdHkgdG8gY2xlYW4gdGhlCisJCSAqIG1lc3NhZ2UgaXRzZWxmIChpbiB3aGljaCBjYXNlIHRoZSByZXR1cm5lZCB7QGxpbmsgTW9kaWZ5UmVzdWx0fQorCQkgKiBzaG91bGQgaGF2ZSB7QGxpbmsgQ2xlYW51cE1vZGUjVkVSQkFUSU19IHNldCBsZXN0IEpHaXQgY2xlYW5zIHRoZQorCQkgKiBtZXNzYWdlIGFnYWluKS4gSXQgY2FuIGFsc28gb3ZlcnJpZGUgdGhlIGluaXRpYWwgY2xlYW4tdXAgbW9kZSBieQorCQkgKiByZXR1cm5pbmcgY2xlYW4tdXAgbW9kZSBvdGhlciB0aGFuIHtAbGluayBDbGVhbnVwTW9kZSNERUZBVUxUfS4gSWYgaXQKKwkJICogZG9lcyByZXR1cm4ge0Bjb2RlIERFRkFVTFR9LCB0aGUgcGFzc2VkLWluIHtAY29kZSBtb2RlfSB3aWxsIGJlCisJCSAqIGFwcGxpZWQuCisJCSAqIDwvcD4KKwkJICoKKwkJICogQHBhcmFtIG1lc3NhZ2UKKwkJICogICAgICAgICAgICBleGlzdGluZyBjb21taXQgbWVzc2FnZQorCQkgKiBAcGFyYW0gbW9kZQorCQkgKiAgICAgICAgICAgIHtAbGluayBDbGVhbnVwTW9kZX0gY3VycmVudGx5IHNldAorCQkgKiBAcGFyYW0gY29tbWVudENoYXIKKwkJICogICAgICAgICAgICBjb21tZW50IGNoYXJhY3RlciB1c2VkCisJCSAqIEByZXR1cm4gYSB7QGxpbmsgTW9kaWZ5UmVzdWx0fQorCQkgKi8KKwkJQE5vbk51bGwKKwkJTW9kaWZ5UmVzdWx0IGVkaXRDb21taXRNZXNzYWdlKEBOb25OdWxsIFN0cmluZyBtZXNzYWdlLAorCQkJCUBOb25OdWxsIENsZWFudXBNb2RlIG1vZGUsIGNoYXIgY29tbWVudENoYXIpOworCisJCUBPdmVycmlkZQorCQlkZWZhdWx0IFN0cmluZyBtb2RpZnlDb21taXRNZXNzYWdlKFN0cmluZyBtZXNzYWdlKSB7CisJCQkvLyBTaG91bGQgYWN0dWFsbHkgbm90IGJlIGNhbGxlZDsgYnV0IGRvIHNvbWV0aGluZyByZWFzb25hYmxlIGFueXdheQorCQkJTW9kaWZ5UmVzdWx0IHJlc3VsdCA9IGVkaXRDb21taXRNZXNzYWdlKAorCQkJCQltZXNzYWdlID09IG51bGwgPyAiIiA6IG1lc3NhZ2UsIENsZWFudXBNb2RlLlNUUklQLCAvLyROT04tTkxTLTEkCisJCQkJCScjJyk7CisJCQlyZXR1cm4gcmVzdWx0LmdldE1lc3NhZ2UoKTsKKwkJfQorCisJCS8qKgorCQkgKiBEZXNjcmliZXMgdGhlIHJlc3VsdCBvZiBlZGl0aW5nIGEgY29tbWl0IG1lc3NhZ2U6IHRoZSBuZXcgbWVzc2FnZSwKKwkJICogYW5kIGhvdyBpdCBzaG91bGQgYmUgY2xlYW5lZC4KKwkJICovCisJCWludGVyZmFjZSBNb2RpZnlSZXN1bHQgeworCisJCQkvKioKKwkJCSAqIFJldHJpZXZlcyB0aGUgbmV3IGNvbW1pdCBtZXNzYWdlLgorCQkJICoKKwkJCSAqIEByZXR1cm4gdGhlIG1lc3NhZ2UKKwkJCSAqLworCQkJQE5vbk51bGwKKwkJCVN0cmluZyBnZXRNZXNzYWdlKCk7CisKKwkJCS8qKgorCQkJICogVGVsbHMgaG93IHRoZSBtZXNzYWdlIHJldHVybmVkIGJ5IHtAbGluayAjZ2V0TWVzc2FnZSgpfSBzaG91bGQgYmUKKwkJCSAqIGNsZWFuZWQuCisJCQkgKgorCQkJICogQHJldHVybiB0aGUge0BsaW5rIENsZWFudXBNb2RlfQorCQkJICovCisJCQlATm9uTnVsbAorCQkJQ2xlYW51cE1vZGUgZ2V0Q2xlYW51cE1vZGUoKTsKKworCQkJLyoqCisJCQkgKiBUZWxscyB3aGV0aGVyIGEgR2Vycml0IENoYW5nZS1JZCBzaG91bGQgYmUgY29tcHV0ZWQgYW5kIGFkZGVkIHRvCisJCQkgKiB0aGUgY29tbWl0IG1lc3NhZ2UsIGFzIHdpdGgKKwkJCSAqIHtAbGluayBDb21taXRDb21tYW5kI3NldEluc2VydENoYW5nZUlkKGJvb2xlYW4pfS4KKwkJCSAqCisJCQkgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBhIENoYW5nZS1JZCBzaG91bGQgYmUgaGFuZGxlZCwKKwkJCSAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKKwkJCSAqLworCQkJYm9vbGVhbiBzaG91bGRBZGRDaGFuZ2VJZCgpOworCQl9CisJfQogCiAJUGVyc29uSWRlbnQgcGFyc2VBdXRob3IoYnl0ZVtdIHJhdykgewogCQlpZiAocmF3Lmxlbmd0aCA9PSAwKQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvUmV2ZXJ0Q29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvUmV2ZXJ0Q29tbWFuZC5qYXZhCmluZGV4IDIyZWY0ZDAuLmRiODhhZDggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1JldmVydENvbW1hbmQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9SZXZlcnRDb21tYW5kLmphdmEKQEAgLTksNiArOSw4IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5hcGk7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLk9CSkVDVF9JRF9BQkJSRVZfU1RSSU5HX0xFTkdUSDsKKwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7CiBpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CkBAIC0xMjgsOCArMTMwLDkgQEAgcHVibGljIFJldkNvbW1pdCBjYWxsKCkgdGhyb3dzIE5vTWVzc2FnZUV4Y2VwdGlvbiwgVW5tZXJnZWRQYXRoc0V4Y2VwdGlvbiwKIAkJCQlyZXZXYWxrLnBhcnNlSGVhZGVycyhzcmNQYXJlbnQpOwogCiAJCQkJU3RyaW5nIG91ck5hbWUgPSBjYWxjdWxhdGVPdXJOYW1lKGhlYWRSZWYpOwotCQkJCVN0cmluZyByZXZlcnROYW1lID0gc3JjQ29tbWl0LmdldElkKCkuYWJicmV2aWF0ZSg3KS5uYW1lKCkKLQkJCQkJCSsgIiAiICsgc3JjQ29tbWl0LmdldFNob3J0TWVzc2FnZSgpOyAvLyROT04tTkxTLTEkCisJCQkJU3RyaW5nIHJldmVydE5hbWUgPSBzcmNDb21taXQuZ2V0SWQoKQorCQkJCQkJLmFiYnJldmlhdGUoT0JKRUNUX0lEX0FCQlJFVl9TVFJJTkdfTEVOR1RIKS5uYW1lKCkgKyAiICIgLy8kTk9OLU5MUy0xJAorCQkJCQkJKyBzcmNDb21taXQuZ2V0U2hvcnRNZXNzYWdlKCk7CiAKIAkJCQlSZXNvbHZlTWVyZ2VyIG1lcmdlciA9IChSZXNvbHZlTWVyZ2VyKSBzdHJhdGVneS5uZXdNZXJnZXIocmVwbyk7CiAJCQkJbWVyZ2VyLnNldFdvcmtpbmdUcmVlSXRlcmF0b3IobmV3IEZpbGVUcmVlSXRlcmF0b3IocmVwbykpOwpAQCAtMTgzLDggKzE4Niw4IEBAIHB1YmxpYyBSZXZDb21taXQgY2FsbCgpIHRocm93cyBOb01lc3NhZ2VFeGNlcHRpb24sIFVubWVyZ2VkUGF0aHNFeGNlcHRpb24sCiAJCQkJCQkJCW1lcmdlci5nZXRNZXJnZVJlc3VsdHMoKSwgZmFpbGluZ1BhdGhzLCBudWxsKTsKIAkJCQkJaWYgKCFtZXJnZXIuZmFpbGVkKCkgJiYgIXVubWVyZ2VkUGF0aHMuaXNFbXB0eSgpKSB7CiAJCQkJCQlTdHJpbmcgbWVzc2FnZSA9IG5ldyBNZXJnZU1lc3NhZ2VGb3JtYXR0ZXIoKQotCQkJCQkJLmZvcm1hdFdpdGhDb25mbGljdHMobmV3TWVzc2FnZSwKLQkJCQkJCQkJbWVyZ2VyLmdldFVubWVyZ2VkUGF0aHMoKSk7CisJCQkJCQkJCS5mb3JtYXRXaXRoQ29uZmxpY3RzKG5ld01lc3NhZ2UsCisJCQkJCQkJCQkJbWVyZ2VyLmdldFVubWVyZ2VkUGF0aHMoKSwgJyMnKTsKIAkJCQkJCXJlcG8ud3JpdGVSZXZlcnRIZWFkKHNyY0NvbW1pdC5nZXRJZCgpKTsKIAkJCQkJCXJlcG8ud3JpdGVNZXJnZUNvbW1pdE1zZyhtZXNzYWdlKTsKIAkJCQkJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvU3Rhc2hDcmVhdGVDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9TdGFzaENyZWF0ZUNvbW1hbmQuamF2YQppbmRleCAzNWZkODk5Li5mN2ExZjRlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9TdGFzaENyZWF0ZUNvbW1hbmQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9TdGFzaENyZWF0ZUNvbW1hbmQuamF2YQpAQCAtOSw2ICs5LDggQEAKICAqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmFwaTsKIAoraW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuT0JKRUNUX0lEX0FCQlJFVl9TVFJJTkdfTEVOR1RIOworCiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKQEAgLTMwMiw3ICszMDQsOCBAQCBwdWJsaWMgdm9pZCBhcHBseShEaXJDYWNoZUVudHJ5IGVudCkgewogCQkJCWJ1aWxkZXIuc2V0UGFyZW50SWQoaGVhZENvbW1pdCk7CiAJCQkJYnVpbGRlci5zZXRUcmVlSWQoY2FjaGUud3JpdGVUcmVlKGluc2VydGVyKSk7CiAJCQkJYnVpbGRlci5zZXRNZXNzYWdlKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGluZGV4TWVzc2FnZSwgYnJhbmNoLAotCQkJCQkJaGVhZENvbW1pdC5hYmJyZXZpYXRlKDcpLm5hbWUoKSwKKwkJCQkJCWhlYWRDb21taXQuYWJicmV2aWF0ZShPQkpFQ1RfSURfQUJCUkVWX1NUUklOR19MRU5HVEgpCisJCQkJCQkJCS5uYW1lKCksCiAJCQkJCQloZWFkQ29tbWl0LmdldFNob3J0TWVzc2FnZSgpKSk7CiAJCQkJT2JqZWN0SWQgaW5kZXhDb21taXQgPSBpbnNlcnRlci5pbnNlcnQoYnVpbGRlcik7CiAKQEAgLTMxOSw3ICszMjIsMTAgQEAgcHVibGljIHZvaWQgYXBwbHkoRGlyQ2FjaGVFbnRyeSBlbnQpIHsKIAkJCQkJYnVpbGRlci5zZXRQYXJlbnRJZHMobmV3IE9iamVjdElkWzBdKTsKIAkJCQkJYnVpbGRlci5zZXRUcmVlSWQodW50cmFja2VkRGlyQ2FjaGUud3JpdGVUcmVlKGluc2VydGVyKSk7CiAJCQkJCWJ1aWxkZXIuc2V0TWVzc2FnZShNZXNzYWdlRm9ybWF0LmZvcm1hdChNU0dfVU5UUkFDS0VELAotCQkJCQkJCWJyYW5jaCwgaGVhZENvbW1pdC5hYmJyZXZpYXRlKDcpLm5hbWUoKSwKKwkJCQkJCQlicmFuY2gsCisJCQkJCQkJaGVhZENvbW1pdAorCQkJCQkJCQkJLmFiYnJldmlhdGUoT0JKRUNUX0lEX0FCQlJFVl9TVFJJTkdfTEVOR1RIKQorCQkJCQkJCQkJLm5hbWUoKSwKIAkJCQkJCQloZWFkQ29tbWl0LmdldFNob3J0TWVzc2FnZSgpKSk7CiAJCQkJCXVudHJhY2tlZENvbW1pdCA9IGluc2VydGVyLmluc2VydChidWlsZGVyKTsKIAkJCQl9CkBAIC0zMzksNyArMzQ1LDggQEAgcHVibGljIHZvaWQgYXBwbHkoRGlyQ2FjaGVFbnRyeSBlbnQpIHsKIAkJCQkJYnVpbGRlci5hZGRQYXJlbnRJZCh1bnRyYWNrZWRDb21taXQpOwogCQkJCWJ1aWxkZXIuc2V0TWVzc2FnZShNZXNzYWdlRm9ybWF0LmZvcm1hdCgKIAkJCQkJCXdvcmtpbmdEaXJlY3RvcnlNZXNzYWdlLCBicmFuY2gsCi0JCQkJCQloZWFkQ29tbWl0LmFiYnJldmlhdGUoNykubmFtZSgpLAorCQkJCQkJaGVhZENvbW1pdC5hYmJyZXZpYXRlKE9CSkVDVF9JRF9BQkJSRVZfU1RSSU5HX0xFTkdUSCkKKwkJCQkJCQkJLm5hbWUoKSwKIAkJCQkJCWhlYWRDb21taXQuZ2V0U2hvcnRNZXNzYWdlKCkpKTsKIAkJCQlidWlsZGVyLnNldFRyZWVJZChjYWNoZS53cml0ZVRyZWUoaW5zZXJ0ZXIpKTsKIAkJCQljb21taXRJZCA9IGluc2VydGVyLmluc2VydChidWlsZGVyKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXR0cmlidXRlcy9BdHRyaWJ1dGVzSGFuZGxlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hdHRyaWJ1dGVzL0F0dHJpYnV0ZXNIYW5kbGVyLmphdmEKaW5kZXggNjM4ZGQ4Mi4uN2VjNzg1OSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hdHRyaWJ1dGVzL0F0dHJpYnV0ZXNIYW5kbGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hdHRyaWJ1dGVzL0F0dHJpYnV0ZXNIYW5kbGVyLmphdmEKQEAgLTEsNDMgKzEsMTEgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUsIEl2YW4gTW90c2NoIDxpdmFuLm1vdHNjaEBic2lhZy5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTUsIDIwMjIgSXZhbiBNb3RzY2ggPGl2YW4ubW90c2NoQGJzaWFnLmNvbT4gYW5kIG90aGVycwogICoKLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlCi0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgdjEuMCB3aGljaAotICogYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGlzIHJlcHJvZHVjZWQgYmVsb3csIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocAorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgogICoKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvcgotICogd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nCi0gKiBjb25kaXRpb25zIGFyZSBtZXQ6Ci0gKgotICogLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCi0gKiAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAotICogICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogLSBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIEluYy4gbm9yIHRoZQotICogICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQotICogICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCi0gKiAgIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQKLSAqIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCi0gKiBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQotICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IKLSAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKLSAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRgotICogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCiAgKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5hdHRyaWJ1dGVzOwogCkBAIC00Niw2ICsxNCw3IEBACiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5TdXBwbGllcjsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYW5ub3RhdGlvbnMuTnVsbGFibGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hdHRyaWJ1dGVzLkF0dHJpYnV0ZS5TdGF0ZTsKQEAgLTg0LDYgKzUzLDggQEAgcHVibGljIGNsYXNzIEF0dHJpYnV0ZXNIYW5kbGVyIHsKIAogCXByaXZhdGUgZmluYWwgVHJlZVdhbGsgdHJlZVdhbGs7CiAKKwlwcml2YXRlIGZpbmFsIFN1cHBsaWVyPENhbm9uaWNhbFRyZWVQYXJzZXI+IGF0dHJpYnV0ZXNUcmVlOworCiAJcHJpdmF0ZSBmaW5hbCBBdHRyaWJ1dGVzTm9kZSBnbG9iYWxOb2RlOwogCiAJcHJpdmF0ZSBmaW5hbCBBdHRyaWJ1dGVzTm9kZSBpbmZvTm9kZTsKQEAgLTk4LDIyICs2OSw0MSBAQCBwdWJsaWMgY2xhc3MgQXR0cmlidXRlc0hhbmRsZXIgewogCSAqIEBwYXJhbSB0cmVlV2FsawogCSAqICAgICAgICAgICAgYSB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5UcmVlV2Fsa30KIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KKwkgKiBAZGVwcmVjYXRlZCBzaW5jZSA2LjEsIHVzZSB7QGxpbmsgI0F0dHJpYnV0ZXNIYW5kbGVyKFRyZWVXYWxrLCBTdXBwbGllcil9CisJICogICAgICAgICAgICAgaW5zdGVhZAogCSAqLworCUBEZXByZWNhdGVkCiAJcHVibGljIEF0dHJpYnV0ZXNIYW5kbGVyKFRyZWVXYWxrIHRyZWVXYWxrKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQl0aGlzKHRyZWVXYWxrLCAoKSAtPiB0cmVlV2Fsay5nZXRUcmVlKENhbm9uaWNhbFRyZWVQYXJzZXIuY2xhc3MpKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGUgYW4ge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQuYXR0cmlidXRlcy5BdHRyaWJ1dGVzSGFuZGxlcn0gd2l0aAorCSAqIGRlZmF1bHQgcnVsZXMgYXMgd2VsbCBhcyBtZXJnZWQgcnVsZXMgZnJvbSBnbG9iYWwsIGluZm8gYW5kIHdvcmt0cmVlIHJvb3QKKwkgKiBhdHRyaWJ1dGVzCisJICoKKwkgKiBAcGFyYW0gdHJlZVdhbGsKKwkgKiAgICAgICAgICAgIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuVHJlZVdhbGt9CisJICogQHBhcmFtIGF0dHJpYnV0ZXNUcmVlCisJICogICAgICAgICAgICB0aGUgdHJlZSB0byByZWFkIC5naXRhdHRyaWJ1dGVzIGZyb20KKwkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KKwkgKiBAc2luY2UgNi4xCisJICovCisJcHVibGljIEF0dHJpYnV0ZXNIYW5kbGVyKFRyZWVXYWxrIHRyZWVXYWxrLAorCQkJU3VwcGxpZXI8Q2Fub25pY2FsVHJlZVBhcnNlcj4gYXR0cmlidXRlc1RyZWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXRoaXMudHJlZVdhbGsgPSB0cmVlV2FsazsKLQkJQXR0cmlidXRlc05vZGVQcm92aWRlciBhdHRyaWJ1dGVzTm9kZVByb3ZpZGVyID10cmVlV2Fsay5nZXRBdHRyaWJ1dGVzTm9kZVByb3ZpZGVyKCk7CisJCXRoaXMuYXR0cmlidXRlc1RyZWUgPSBhdHRyaWJ1dGVzVHJlZTsKKwkJQXR0cmlidXRlc05vZGVQcm92aWRlciBhdHRyaWJ1dGVzTm9kZVByb3ZpZGVyID0gdHJlZVdhbGsKKwkJCQkuZ2V0QXR0cmlidXRlc05vZGVQcm92aWRlcigpOwogCQl0aGlzLmdsb2JhbE5vZGUgPSBhdHRyaWJ1dGVzTm9kZVByb3ZpZGVyICE9IG51bGwKIAkJCQk/IGF0dHJpYnV0ZXNOb2RlUHJvdmlkZXIuZ2V0R2xvYmFsQXR0cmlidXRlc05vZGUoKSA6IG51bGw7CiAJCXRoaXMuaW5mb05vZGUgPSBhdHRyaWJ1dGVzTm9kZVByb3ZpZGVyICE9IG51bGwKIAkJCQk/IGF0dHJpYnV0ZXNOb2RlUHJvdmlkZXIuZ2V0SW5mb0F0dHJpYnV0ZXNOb2RlKCkgOiBudWxsOwogCiAJCUF0dHJpYnV0ZXNOb2RlIHJvb3ROb2RlID0gYXR0cmlidXRlc05vZGUodHJlZVdhbGssCi0JCQkJcm9vdE9mKAotCQkJCQkJdHJlZVdhbGsuZ2V0VHJlZShXb3JraW5nVHJlZUl0ZXJhdG9yLmNsYXNzKSksCi0JCQkJcm9vdE9mKAotCQkJCQkJdHJlZVdhbGsuZ2V0VHJlZShEaXJDYWNoZUl0ZXJhdG9yLmNsYXNzKSksCi0JCQkJcm9vdE9mKHRyZWVXYWxrCi0JCQkJCQkuZ2V0VHJlZShDYW5vbmljYWxUcmVlUGFyc2VyLmNsYXNzKSkpOworCQkJCXJvb3RPZih0cmVlV2Fsay5nZXRUcmVlKFdvcmtpbmdUcmVlSXRlcmF0b3IuY2xhc3MpKSwKKwkJCQlyb290T2YodHJlZVdhbGsuZ2V0VHJlZShEaXJDYWNoZUl0ZXJhdG9yLmNsYXNzKSksCisJCQkJcm9vdE9mKGF0dHJpYnV0ZXNUcmVlLmdldCgpKSk7CiAKIAkJZXhwYW5zaW9ucy5wdXQoQklOQVJZX1JVTEVfS0VZLCBCSU5BUllfUlVMRV9BVFRSSUJVVEVTKTsKIAkJZm9yIChBdHRyaWJ1dGVzTm9kZSBub2RlIDogbmV3IEF0dHJpYnV0ZXNOb2RlW10geyBnbG9iYWxOb2RlLCByb290Tm9kZSwKQEAgLTE1Miw3ICsxNDIsNyBAQCBwdWJsaWMgQXR0cmlidXRlcyBnZXRBdHRyaWJ1dGVzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCQlpc0RpcmVjdG9yeSwKIAkJCQl0cmVlV2Fsay5nZXRUcmVlKFdvcmtpbmdUcmVlSXRlcmF0b3IuY2xhc3MpLAogCQkJCXRyZWVXYWxrLmdldFRyZWUoRGlyQ2FjaGVJdGVyYXRvci5jbGFzcyksCi0JCQkJdHJlZVdhbGsuZ2V0VHJlZShDYW5vbmljYWxUcmVlUGFyc2VyLmNsYXNzKSwKKwkJCQlhdHRyaWJ1dGVzVHJlZS5nZXQoKSwKIAkJCQlhdHRyaWJ1dGVzKTsKIAogCQkvLyBHZXRzIHRoZSBhdHRyaWJ1dGVzIGxvY2F0ZWQgaW4gdGhlIGdsb2JhbCBhdHRyaWJ1dGUgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL0RpZmZGb3JtYXR0ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi9EaWZmRm9ybWF0dGVyLmphdmEKaW5kZXggNDlkYTk1Yy4uMWE1Zjc0ZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL0RpZmZGb3JtYXR0ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvRGlmZkZvcm1hdHRlci5qYXZhCkBAIC0xOCw2ICsxOCw3IEBACiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQuZGlmZi5EaWZmRW50cnkuQ2hhbmdlVHlwZS5SRU5BTUU7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQuZGlmZi5EaWZmRW50cnkuU2lkZS5ORVc7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQuZGlmZi5EaWZmRW50cnkuU2lkZS5PTEQ7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5PQkpFQ1RfSURfQUJCUkVWX1NUUklOR19MRU5HVEg7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5lbmNvZGU7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5lbmNvZGVBU0NJSTsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuRmlsZU1vZGUuR0lUTElOSzsKQEAgLTkwLDcgKzkxLDcgQEAgcHVibGljIGNsYXNzIERpZmZGb3JtYXR0ZXIgaW1wbGVtZW50cyBBdXRvQ2xvc2VhYmxlIHsKIAogCXByaXZhdGUgaW50IGNvbnRleHQgPSAzOwogCi0JcHJpdmF0ZSBpbnQgYWJicmV2aWF0aW9uTGVuZ3RoID0gNzsKKwlwcml2YXRlIGludCBhYmJyZXZpYXRpb25MZW5ndGggPSBPQkpFQ1RfSURfQUJCUkVWX1NUUklOR19MRU5HVEg7CiAKIAlwcml2YXRlIERpZmZBbGdvcml0aG0gZGlmZkFsZ29yaXRobTsKIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaXJjYWNoZS9EaXJDYWNoZUNoZWNrb3V0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpcmNhY2hlL0RpckNhY2hlQ2hlY2tvdXQuamF2YQppbmRleCBjOTA0YTc4Li4zZDUwYTgyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpcmNhY2hlL0RpckNhY2hlQ2hlY2tvdXQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpcmNhY2hlL0RpckNhY2hlQ2hlY2tvdXQuamF2YQpAQCAtNCw3ICs0LDggQEAKICAqIENvcHlyaWdodCAoQykgMjAwOCwgUm9nZXIgQy4gU29hcmVzIDxyb2dlcnNvYXJlc0BpbnRlbGluZXQuY29tLmJyPgogICogQ29weXJpZ2h0IChDKSAyMDA2LCBTaGF3biBPLiBQZWFyY2UgPHNwZWFyY2VAc3BlYXJjZS5vcmc+CiAgKiBDb3B5cmlnaHQgKEMpIDIwMTAsIENocmlzaWFuIEhhbHN0cmljayA8Y2hyaXN0aWFuLmhhbHN0cmlja0BzYXAuY29tPgotICogQ29weXJpZ2h0IChDKSAyMDE5LTIwMjAsIEFuZHJlIEJvc3NlcnQgPGFuZHJlLmJvc3NlcnRAc2llbWVucy5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTksIDIwMjAsIEFuZHJlIEJvc3NlcnQgPGFuZHJlLmJvc3NlcnRAc2llbWVucy5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcsIDIwMjIsIFRob21hcyBXb2xmIDx0aG9tYXMud29sZkBwYXJhbm9yLmNoPiBhbmQgb3RoZXJzCiAgKgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CkBAIC0yOTksNyArMzAwLDcgQEAgcHVibGljIHZvaWQgcHJlU2NhblR3b1RyZWVzKCkgdGhyb3dzIENvcnJ1cHRPYmplY3RFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkJd2FsayA9IG5ldyBOYW1lQ29uZmxpY3RUcmVlV2FsayhyZXBvKTsKIAkJYnVpbGRlciA9IGRjLmJ1aWxkZXIoKTsKIAotCQlhZGRUcmVlKHdhbGssIGhlYWRDb21taXRUcmVlKTsKKwkJd2Fsay5zZXRIZWFkKGFkZFRyZWUod2FsaywgaGVhZENvbW1pdFRyZWUpKTsKIAkJYWRkVHJlZSh3YWxrLCBtZXJnZUNvbW1pdFRyZWUpOwogCQlpbnQgZGNpUG9zID0gd2Fsay5hZGRUcmVlKG5ldyBEaXJDYWNoZUJ1aWxkSXRlcmF0b3IoYnVpbGRlcikpOwogCQl3YWxrLmFkZFRyZWUod29ya2luZ1RyZWUpOwpAQCAtMzE1LDEzICszMTYsNiBAQCBwdWJsaWMgdm9pZCBwcmVTY2FuVHdvVHJlZXMoKSB0aHJvd3MgQ29ycnVwdE9iamVjdEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogCQl9CiAJfQogCi0JcHJpdmF0ZSB2b2lkIGFkZFRyZWUoVHJlZVdhbGsgdHcsIE9iamVjdElkIGlkKSB0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwgSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlpZiAoaWQgPT0gbnVsbCkKLQkJCXR3LmFkZFRyZWUobmV3IEVtcHR5VHJlZUl0ZXJhdG9yKCkpOwotCQllbHNlCi0JCQl0dy5hZGRUcmVlKGlkKTsKLQl9Ci0KIAkvKioKIAkgKiBTY2FuIGluZGV4IGFuZCBtZXJnZSB0cmVlIChubyBIRUFEKS4gVXNlZCBlLmcuIGZvciBpbml0aWFsIGNoZWNrb3V0IHdoZW4KIAkgKiB0aGVyZSBpcyBubyBoZWFkIHlldC4KQEAgLTM0MSw3ICszMzUsNyBAQCBwdWJsaWMgdm9pZCBwcmVzY2FuT25lVHJlZSgpCiAJCWJ1aWxkZXIgPSBkYy5idWlsZGVyKCk7CiAKIAkJd2FsayA9IG5ldyBOYW1lQ29uZmxpY3RUcmVlV2FsayhyZXBvKTsKLQkJYWRkVHJlZSh3YWxrLCBtZXJnZUNvbW1pdFRyZWUpOworCQl3YWxrLnNldEhlYWQoYWRkVHJlZSh3YWxrLCBtZXJnZUNvbW1pdFRyZWUpKTsKIAkJaW50IGRjaVBvcyA9IHdhbGsuYWRkVHJlZShuZXcgRGlyQ2FjaGVCdWlsZEl0ZXJhdG9yKGJ1aWxkZXIpKTsKIAkJd2Fsay5hZGRUcmVlKHdvcmtpbmdUcmVlKTsKIAkJd29ya2luZ1RyZWUuc2V0RGlyQ2FjaGVJdGVyYXRvcih3YWxrLCBkY2lQb3MpOwpAQCAtMzU2LDYgKzM1MCwxNCBAQCBwdWJsaWMgdm9pZCBwcmVzY2FuT25lVHJlZSgpCiAJCWNvbmZsaWN0cy5yZW1vdmVBbGwocmVtb3ZlZCk7CiAJfQogCisJcHJpdmF0ZSBpbnQgYWRkVHJlZShUcmVlV2FsayB0dywgT2JqZWN0SWQgaWQpIHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLAorCQkJSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworCQlpZiAoaWQgPT0gbnVsbCkgeworCQkJcmV0dXJuIHR3LmFkZFRyZWUobmV3IEVtcHR5VHJlZUl0ZXJhdG9yKCkpOworCQl9CisJCXJldHVybiB0dy5hZGRUcmVlKGlkKTsKKwl9CisKIAkvKioKIAkgKiBQcm9jZXNzaW5nIGFuIGVudHJ5IGluIHRoZSBjb250ZXh0IG9mIHtAbGluayAjcHJlc2Nhbk9uZVRyZWUoKX0gd2hlbiBvbmx5CiAJICogb25lIHRyZWUgaXMgZ2l2ZW4KQEAgLTM4MiwxNyArMzg0LDE0IEBAIHZvaWQgcHJvY2Vzc0VudHJ5KENhbm9uaWNhbFRyZWVQYXJzZXIgbSwgRGlyQ2FjaGVCdWlsZEl0ZXJhdG9yIGksCiAJCQkJCQkvLyBmYWlsT25Db25mbGljdCBpcyBmYWxzZS4gUHV0dGluZyBzb21ldGhpbmcgdG8gY29uZmxpY3RzCiAJCQkJCQkvLyB3b3VsZCBtZWFuIHdlIGRlbGV0ZSBpdC4gSW5zdGVhZCB3ZSB3YW50IHRoZSBtZXJnZUNvbW1pdAogCQkJCQkJLy8gY29udGVudCB0byBiZSBjaGVja2VkIG91dC4KLQkJCQkJCXVwZGF0ZShtLmdldEVudHJ5UGF0aFN0cmluZygpLCBtLmdldEVudHJ5T2JqZWN0SWQoKSwKLQkJCQkJCQkJbS5nZXRFbnRyeUZpbGVNb2RlKCkpOworCQkJCQkJdXBkYXRlKG0pOwogCQkJCQl9CiAJCQkJfSBlbHNlCi0JCQkJCXVwZGF0ZShtLmdldEVudHJ5UGF0aFN0cmluZygpLCBtLmdldEVudHJ5T2JqZWN0SWQoKSwKLQkJCQkJCW0uZ2V0RW50cnlGaWxlTW9kZSgpKTsKKwkJCQkJdXBkYXRlKG0pOwogCQkJfSBlbHNlIGlmIChmID09IG51bGwgfHwgIW0uaWRFcXVhbChpKSkgewogCQkJCS8vIFRoZSB3b3JraW5nIHRyZWUgZmlsZSBpcyBtaXNzaW5nIG9yIHRoZSBtZXJnZSBjb250ZW50IGRpZmZlcnMKIAkJCQkvLyBmcm9tIGluZGV4IGNvbnRlbnQKLQkJCQl1cGRhdGUobS5nZXRFbnRyeVBhdGhTdHJpbmcoKSwgbS5nZXRFbnRyeU9iamVjdElkKCksCi0JCQkJCQltLmdldEVudHJ5RmlsZU1vZGUoKSk7CisJCQkJdXBkYXRlKG0pOwogCQkJfSBlbHNlIGlmIChpLmdldERpckNhY2hlRW50cnkoKSAhPSBudWxsKSB7CiAJCQkJLy8gVGhlIGluZGV4IGNvbnRhaW5zIGEgZmlsZSAoYW5kIG5vdCBhIGZvbGRlcikKIAkJCQlpZiAoZi5pc01vZGlmaWVkKGkuZ2V0RGlyQ2FjaGVFbnRyeSgpLCB0cnVlLApAQCAtNDAwLDggKzM5OSw3IEBAIHZvaWQgcHJvY2Vzc0VudHJ5KENhbm9uaWNhbFRyZWVQYXJzZXIgbSwgRGlyQ2FjaGVCdWlsZEl0ZXJhdG9yIGksCiAJCQkJCQl8fCBpLmdldERpckNhY2hlRW50cnkoKS5nZXRTdGFnZSgpICE9IDApCiAJCQkJCS8vIFRoZSB3b3JraW5nIHRyZWUgZmlsZSBpcyBkaXJ0eSBvciB0aGUgaW5kZXggY29udGFpbnMgYQogCQkJCQkvLyBjb25mbGljdAotCQkJCQl1cGRhdGUobS5nZXRFbnRyeVBhdGhTdHJpbmcoKSwgbS5nZXRFbnRyeU9iamVjdElkKCksCi0JCQkJCQkJbS5nZXRFbnRyeUZpbGVNb2RlKCkpOworCQkJCQl1cGRhdGUobSk7CiAJCQkJZWxzZSB7CiAJCQkJCS8vIHVwZGF0ZSB0aGUgdGltZXN0YW1wIG9mIHRoZSBpbmRleCB3aXRoIHRoZSBvbmUgZnJvbSB0aGUKIAkJCQkJLy8gZmlsZSBpZiBub3Qgc2V0LCBhcyB3ZSBhcmUgc3VyZSB0byBiZSBpbiBzeW5jIGhlcmUuCkBAIC04MDIsNyArODAwLDcgQEAgdm9pZCBwcm9jZXNzRW50cnkoQ2Fub25pY2FsVHJlZVBhcnNlciBoLCBDYW5vbmljYWxUcmVlUGFyc2VyIG0sCiAJCQkJaWYgKGYgIT0gbnVsbCAmJiBpc01vZGlmaWVkU3VidHJlZV9JbmRleFdvcmtpbmd0cmVlKG5hbWUpKSB7CiAJCQkJCWNvbmZsaWN0KG5hbWUsIGRjZSwgaCwgbSk7IC8vIDEKIAkJCQl9IGVsc2UgewotCQkJCQl1cGRhdGUobmFtZSwgbUlkLCBtTW9kZSk7IC8vIDIKKwkJCQkJdXBkYXRlKDEsIG5hbWUsIG1JZCwgbU1vZGUpOyAvLyAyCiAJCQkJfQogCiAJCQkJYnJlYWs7CkBAIC04MjgsNyArODI2LDcgQEAgdm9pZCBwcm9jZXNzRW50cnkoQ2Fub25pY2FsVHJlZVBhcnNlciBoLCBDYW5vbmljYWxUcmVlUGFyc2VyIG0sCiAJCQkJLy8gYXJlIGZvdW5kIGxhdGVyCiAJCQkJYnJlYWs7CiAJCQljYXNlIDB4RDBGOiAvLyAxOQotCQkJCXVwZGF0ZShuYW1lLCBtSWQsIG1Nb2RlKTsKKwkJCQl1cGRhdGUoMSwgbmFtZSwgbUlkLCBtTW9kZSk7CiAJCQkJYnJlYWs7CiAJCQljYXNlIDB4REYwOiAvLyBjb25mbGljdCB3aXRob3V0IGEgcnVsZQogCQkJY2FzZSAweDBGRDogLy8gMTUKQEAgLTgzOSw3ICs4MzcsNyBAQCB2b2lkIHByb2Nlc3NFbnRyeShDYW5vbmljYWxUcmVlUGFyc2VyIGgsIENhbm9uaWNhbFRyZWVQYXJzZXIgbSwKIAkJCQkJaWYgKGlzTW9kaWZpZWRTdWJ0cmVlX0luZGV4V29ya2luZ3RyZWUobmFtZSkpCiAJCQkJCQljb25mbGljdChuYW1lLCBkY2UsIGgsIG0pOyAvLyA4CiAJCQkJCWVsc2UKLQkJCQkJCXVwZGF0ZShuYW1lLCBtSWQsIG1Nb2RlKTsgLy8gNworCQkJCQkJdXBkYXRlKDEsIG5hbWUsIG1JZCwgbU1vZGUpOyAvLyA3CiAJCQkJfSBlbHNlCiAJCQkJCWNvbmZsaWN0KG5hbWUsIGRjZSwgaCwgbSk7IC8vIDkKIAkJCQlicmVhazsKQEAgLTg1OSw3ICs4NTcsNyBAQCB2b2lkIHByb2Nlc3NFbnRyeShDYW5vbmljYWxUcmVlUGFyc2VyIGgsIENhbm9uaWNhbFRyZWVQYXJzZXIgbSwKIAkJCQlicmVhazsKIAkJCWNhc2UgMHgwREY6IC8vIDE2IDE3CiAJCQkJaWYgKCFpc01vZGlmaWVkU3VidHJlZV9JbmRleFdvcmtpbmd0cmVlKG5hbWUpKQotCQkJCQl1cGRhdGUobmFtZSwgbUlkLCBtTW9kZSk7CisJCQkJCXVwZGF0ZSgxLCBuYW1lLCBtSWQsIG1Nb2RlKTsKIAkJCQllbHNlCiAJCQkJCWNvbmZsaWN0KG5hbWUsIGRjZSwgaCwgbSk7CiAJCQkJYnJlYWs7CkBAIC05MjksNyArOTI3LDcgQEAgdm9pZCBwcm9jZXNzRW50cnkoQ2Fub25pY2FsVHJlZVBhcnNlciBoLCBDYW5vbmljYWxUcmVlUGFyc2VyIG0sCiAJCQkJLy8gQXQgbGVhc3Qgb25lIG9mIEhlYWQsIEluZGV4LCBNZXJnZSBpcyBub3QgZW1wdHkKIAkJCQkvLyAtPiBvbmx5IE1lcmdlIGNvbnRhaW5zIHNvbWV0aGluZyBmb3IgdGhpcyBwYXRoLiBVc2UgaXQhCiAJCQkJLy8gUG90ZW50aWFsbHkgdXBkYXRlIHRoZSBmaWxlCi0JCQkJdXBkYXRlKG5hbWUsIG1JZCwgbU1vZGUpOyAvLyAxCisJCQkJdXBkYXRlKDEsIG5hbWUsIG1JZCwgbU1vZGUpOyAvLyAxCiAJCQllbHNlIGlmIChtID09IG51bGwpCiAJCQkJLy8gTm90aGluZyBpbiBNZXJnZQogCQkJCS8vIFNvbWV0aGluZyBpbiBIZWFkCkBAIC05NDcsNyArOTQ1LDcgQEAgZWxzZSBpZiAobSA9PSBudWxsKQogCQkJCS8vIGZpbmQgaW4gTWVyZ2UuIFBvdGVudGlhbGx5IHVwZGF0ZXMgdGhlIGZpbGUuCiAJCQkJaWYgKGVxdWFsSWRBbmRNb2RlKGhJZCwgaE1vZGUsIG1JZCwgbU1vZGUpKSB7CiAJCQkJCWlmIChpbml0aWFsQ2hlY2tvdXQgfHwgZm9yY2UpIHsKLQkJCQkJCXVwZGF0ZShuYW1lLCBtSWQsIG1Nb2RlKTsKKwkJCQkJCXVwZGF0ZSgxLCBuYW1lLCBtSWQsIG1Nb2RlKTsKIAkJCQkJfSBlbHNlIHsKIAkJCQkJCWtlZXAobmFtZSwgZGNlLCBmKTsKIAkJCQkJfQpAQCAtMTEzMSw3ICsxMTI5LDcgQEAgJiYgaXNNb2RpZmllZF9JbmRleFRyZWUobmFtZSwgaUlkLCBpTW9kZSwgbUlkLCBtTW9kZSwKIAogCQkJCQkJLy8gVE9ETyBjaGVjayB0aGF0IHdlIGRvbid0IG92ZXJ3cml0ZSBzb21lIHVuc2F2ZWQKIAkJCQkJCS8vIGZpbGUgY29udGVudAotCQkJCQkJdXBkYXRlKG5hbWUsIG1JZCwgbU1vZGUpOworCQkJCQkJdXBkYXRlKDEsIG5hbWUsIG1JZCwgbU1vZGUpOwogCQkJCQl9IGVsc2UgaWYgKGRjZSAhPSBudWxsCiAJCQkJCQkJJiYgKGYgIT0gbnVsbCAmJiBmLmlzTW9kaWZpZWQoZGNlLCB0cnVlLAogCQkJCQkJCQkJdGhpcy53YWxrLmdldE9iamVjdFJlYWRlcigpKSkpIHsKQEAgLTExNTAsNyArMTE0OCw3IEBAICYmIGlzTW9kaWZpZWRfSW5kZXhUcmVlKG5hbWUsIGlJZCwgaU1vZGUsIG1JZCwgbU1vZGUsCiAJCQkJCQkvLyAtPiBTdGFuZGFyZCBjYXNlIHdoZW4gc3dpdGNoaW5nIGJldHdlZW4gYnJhbmNoZXM6CiAJCQkJCQkvLyBOb3RoaW5nIG5ldyBpbiBpbmRleCBidXQgc29tZXRoaW5nIGRpZmZlcmVudCBpbgogCQkJCQkJLy8gTWVyZ2UuIFVwZGF0ZSBpbmRleCBhbmQgZmlsZQotCQkJCQkJdXBkYXRlKG5hbWUsIG1JZCwgbU1vZGUpOworCQkJCQkJdXBkYXRlKDEsIG5hbWUsIG1JZCwgbU1vZGUpOwogCQkJCQl9CiAJCQkJfSBlbHNlIHsKIAkJCQkJLy8gSGVhZCBkaWZmZXJzIGZyb20gaW5kZXggb3IgbWVyZ2UgaXMgc2FtZSBhcyBpbmRleApAQCAtMTIzNywxMiArMTIzNSwxNyBAQCBwcml2YXRlIHZvaWQgcmVtb3ZlKFN0cmluZyBwYXRoKSB7CiAJCXJlbW92ZWQuYWRkKHBhdGgpOwogCX0KIAotCXByaXZhdGUgdm9pZCB1cGRhdGUoU3RyaW5nIHBhdGgsIE9iamVjdElkIG1JZCwgRmlsZU1vZGUgbW9kZSkKLQkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHJpdmF0ZSB2b2lkIHVwZGF0ZShDYW5vbmljYWxUcmVlUGFyc2VyIHRyZWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXVwZGF0ZSgwLCB0cmVlLmdldEVudHJ5UGF0aFN0cmluZygpLCB0cmVlLmdldEVudHJ5T2JqZWN0SWQoKSwKKwkJCQl0cmVlLmdldEVudHJ5RmlsZU1vZGUoKSk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHVwZGF0ZShpbnQgaW5kZXgsIFN0cmluZyBwYXRoLCBPYmplY3RJZCBtSWQsCisJCQlGaWxlTW9kZSBtb2RlKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlpZiAoIUZpbGVNb2RlLlRSRUUuZXF1YWxzKG1vZGUpKSB7CiAJCQl1cGRhdGVkLnB1dChwYXRoLCBuZXcgQ2hlY2tvdXRNZXRhZGF0YSgKLQkJCQkJd2Fsay5nZXRFb2xTdHJlYW1UeXBlKENIRUNLT1VUX09QKSwKLQkJCQkJd2Fsay5nZXRGaWx0ZXJDb21tYW5kKENvbnN0YW50cy5BVFRSX0ZJTFRFUl9UWVBFX1NNVURHRSkpKTsKKwkJCQkJd2Fsay5nZXRDaGVja291dEVvbFN0cmVhbVR5cGUoaW5kZXgpLAorCQkJCQl3YWxrLmdldFNtdWRnZUNvbW1hbmQoaW5kZXgpKSk7CiAKIAkJCURpckNhY2hlRW50cnkgZW50cnkgPSBuZXcgRGlyQ2FjaGVFbnRyeShwYXRoLCBEaXJDYWNoZUVudHJ5LlNUQUdFXzApOwogCQkJZW50cnkuc2V0T2JqZWN0SWQobUlkKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZ2l0cmVwby9CYXJlU3VwZXJwcm9qZWN0V3JpdGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2dpdHJlcG8vQmFyZVN1cGVycHJvamVjdFdyaXRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2NjI2YWUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2dpdHJlcG8vQmFyZVN1cGVycHJvamVjdFdyaXRlci5qYXZhCkBAIC0wLDAgKzEsMzE5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxLCBHb29nbGUgSW5jLiBhbmQgb3RoZXJzCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmdpdHJlcG87CisKK2ltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuUl9UQUdTOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnMuQ29uY3VycmVudFJlZlVwZGF0ZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnMuR2l0QVBJRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9ycy5KR2l0SW50ZXJuYWxFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5kaXJjYWNoZS5EaXJDYWNoZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmRpcmNhY2hlLkRpckNhY2hlQnVpbGRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmRpcmNhY2hlLkRpckNhY2hlRW50cnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5naXRyZXBvLlJlcG9Db21tYW5kLk1hbmlmZXN0RXJyb3JFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5naXRyZXBvLlJlcG9Db21tYW5kLlJlbW90ZUZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5naXRyZXBvLlJlcG9Db21tYW5kLlJlbW90ZVJlYWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmdpdHJlcG8uUmVwb0NvbW1hbmQuUmVtb3RlVW5hdmFpbGFibGVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5naXRyZXBvLlJlcG9Qcm9qZWN0LkNvcHlGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZ2l0cmVwby5SZXBvUHJvamVjdC5MaW5rRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmdpdHJlcG8uaW50ZXJuYWwuUmVwb1RleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5KR2l0VGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db21taXRCdWlsZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbmZpZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuRmlsZU1vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0SWQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0SW5zZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUGVyc29uSWRlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVmVXBkYXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlZlVwZGF0ZS5SZXN1bHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2Q29tbWl0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5SZXZXYWxrOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5GaWxlVXRpbHM7CisKKy8qKgorICogV3JpdGVzIC5naXRtb2R1bGVzIGFuZCBnaXRsaW5rcyBvZiBwYXJzZWQgbWFuaWZlc3QgcHJvamVjdHMgaW50byBhIGJhcmUKKyAqIHJlcG9zaXRvcnkuCisgKgorICogVG8gd3JpdGUgb24gYSByZWd1bGFyIHJlcG9zaXRvcnksIHNlZSB7QGxpbmsgUmVndWxhclN1cGVycHJvamVjdFdyaXRlcn0uCisgKi8KK2NsYXNzIEJhcmVTdXBlcnByb2plY3RXcml0ZXIgeworCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMT0NLX0ZBSUxVUkVfTUFYX1JFVFJJRVMgPSA1OworCisJLy8gUmV0cnkgZXhwb25lbnRpYWxseSB3aXRoIGRlbGF5cyBpbiB0aGlzIHJhbmdlCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExPQ0tfRkFJTFVSRV9NSU5fUkVUUllfREVMQVlfTUlMTElTID0gNTA7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTE9DS19GQUlMVVJFX01BWF9SRVRSWV9ERUxBWV9NSUxMSVMgPSA1MDAwOworCisJcHJpdmF0ZSBmaW5hbCBSZXBvc2l0b3J5IHJlcG87CisKKwlwcml2YXRlIGZpbmFsIFVSSSB0YXJnZXRVcmk7CisKKwlwcml2YXRlIGZpbmFsIFN0cmluZyB0YXJnZXRCcmFuY2g7CisKKwlwcml2YXRlIGZpbmFsIFJlbW90ZVJlYWRlciBjYWxsYmFjazsKKworCXByaXZhdGUgZmluYWwgQmFyZVdyaXRlckNvbmZpZyBjb25maWc7CisKKwlwcml2YXRlIGZpbmFsIFBlcnNvbklkZW50IGF1dGhvcjsKKworCXByaXZhdGUgTGlzdDxFeHRyYUNvbnRlbnQ+IGV4dHJhQ29udGVudHM7CisKKwlzdGF0aWMgY2xhc3MgQmFyZVdyaXRlckNvbmZpZyB7CisJCWJvb2xlYW4gaWdub3JlUmVtb3RlRmFpbHVyZXMgPSBmYWxzZTsKKworCQlib29sZWFuIHJlY29yZFJlbW90ZUJyYW5jaCA9IHRydWU7CisKKwkJYm9vbGVhbiByZWNvcmRTdWJtb2R1bGVMYWJlbHMgPSB0cnVlOworCisJCWJvb2xlYW4gcmVjb3JkU2hhbGxvd1N1Ym1vZHVsZXMgPSB0cnVlOworCisJCXN0YXRpYyBCYXJlV3JpdGVyQ29uZmlnIGdldERlZmF1bHQoKSB7CisJCQlyZXR1cm4gbmV3IEJhcmVXcml0ZXJDb25maWcoKTsKKwkJfQorCisJCXByaXZhdGUgQmFyZVdyaXRlckNvbmZpZygpIHsKKwkJfQorCX0KKworCXN0YXRpYyBjbGFzcyBFeHRyYUNvbnRlbnQgeworCQlmaW5hbCBTdHJpbmcgcGF0aDsKKworCQlmaW5hbCBTdHJpbmcgY29udGVudDsKKworCQlFeHRyYUNvbnRlbnQoU3RyaW5nIHBhdGgsIFN0cmluZyBjb250ZW50KSB7CisJCQl0aGlzLnBhdGggPSBwYXRoOworCQkJdGhpcy5jb250ZW50ID0gY29udGVudDsKKwkJfQorCX0KKworCUJhcmVTdXBlcnByb2plY3RXcml0ZXIoUmVwb3NpdG9yeSByZXBvLCBVUkkgdGFyZ2V0VXJpLAorCQkJU3RyaW5nIHRhcmdldEJyYW5jaCwKKwkJCVBlcnNvbklkZW50IGF1dGhvciwgUmVtb3RlUmVhZGVyIGNhbGxiYWNrLAorCQkJQmFyZVdyaXRlckNvbmZpZyBjb25maWcsCisJCQlMaXN0PEV4dHJhQ29udGVudD4gZXh0cmFDb250ZW50cykgeworCQlhc3NlcnQgKHJlcG8uaXNCYXJlKCkpOworCQl0aGlzLnJlcG8gPSByZXBvOworCQl0aGlzLnRhcmdldFVyaSA9IHRhcmdldFVyaTsKKwkJdGhpcy50YXJnZXRCcmFuY2ggPSB0YXJnZXRCcmFuY2g7CisJCXRoaXMuYXV0aG9yID0gYXV0aG9yOworCQl0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2s7CisJCXRoaXMuY29uZmlnID0gY29uZmlnOworCQl0aGlzLmV4dHJhQ29udGVudHMgPSBleHRyYUNvbnRlbnRzOworCX0KKworCVJldkNvbW1pdCB3cml0ZShMaXN0PFJlcG9Qcm9qZWN0PiByZXBvUHJvamVjdHMpCisJCQl0aHJvd3MgR2l0QVBJRXhjZXB0aW9uIHsKKwkJRGlyQ2FjaGUgaW5kZXggPSBEaXJDYWNoZS5uZXdJbkNvcmUoKTsKKwkJT2JqZWN0SW5zZXJ0ZXIgaW5zZXJ0ZXIgPSByZXBvLm5ld09iamVjdEluc2VydGVyKCk7CisKKwkJdHJ5IChSZXZXYWxrIHJ3ID0gbmV3IFJldldhbGsocmVwbykpIHsKKwkJCXByZXBhcmVJbmRleChyZXBvUHJvamVjdHMsIGluZGV4LCBpbnNlcnRlcik7CisJCQlPYmplY3RJZCB0cmVlSWQgPSBpbmRleC53cml0ZVRyZWUoaW5zZXJ0ZXIpOworCQkJbG9uZyBwcmV2RGVsYXkgPSAwOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBMT0NLX0ZBSUxVUkVfTUFYX1JFVFJJRVMgLSAxOyBpKyspIHsKKwkJCQl0cnkgeworCQkJCQlyZXR1cm4gY29tbWl0VHJlZU9uQ3VycmVudFRpcChpbnNlcnRlciwgcncsIHRyZWVJZCk7CisJCQkJfSBjYXRjaCAoQ29uY3VycmVudFJlZlVwZGF0ZUV4Y2VwdGlvbiBlKSB7CisJCQkJCXByZXZEZWxheSA9IEZpbGVVdGlscy5kZWxheShwcmV2RGVsYXksCisJCQkJCQkJTE9DS19GQUlMVVJFX01JTl9SRVRSWV9ERUxBWV9NSUxMSVMsCisJCQkJCQkJTE9DS19GQUlMVVJFX01BWF9SRVRSWV9ERUxBWV9NSUxMSVMpOworCQkJCQlUaHJlYWQuc2xlZXAocHJldkRlbGF5KTsKKwkJCQkJcmVwby5nZXRSZWZEYXRhYmFzZSgpLnJlZnJlc2goKTsKKwkJCQl9CisJCQl9CisJCQkvLyBJbiB0aGUgbGFzdCB0cnksIGp1c3QgcHJvcGFnYXRlIHRoZSBleGNlcHRpb25zCisJCQlyZXR1cm4gY29tbWl0VHJlZU9uQ3VycmVudFRpcChpbnNlcnRlciwgcncsIHRyZWVJZCk7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIHwgSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IE1hbmlmZXN0RXJyb3JFeGNlcHRpb24oZSk7CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgcHJlcGFyZUluZGV4KExpc3Q8UmVwb1Byb2plY3Q+IHByb2plY3RzLCBEaXJDYWNoZSBpbmRleCwKKwkJCU9iamVjdEluc2VydGVyIGluc2VydGVyKSB0aHJvd3MgSU9FeGNlcHRpb24sIEdpdEFQSUV4Y2VwdGlvbiB7CisJCUNvbmZpZyBjZmcgPSBuZXcgQ29uZmlnKCk7CisJCVN0cmluZ0J1aWxkZXIgYXR0cmlidXRlcyA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisJCURpckNhY2hlQnVpbGRlciBidWlsZGVyID0gaW5kZXguYnVpbGRlcigpOworCQlmb3IgKFJlcG9Qcm9qZWN0IHByb2ogOiBwcm9qZWN0cykgeworCQkJU3RyaW5nIG5hbWUgPSBwcm9qLmdldE5hbWUoKTsKKwkJCVN0cmluZyBwYXRoID0gcHJvai5nZXRQYXRoKCk7CisJCQlTdHJpbmcgdXJsID0gcHJvai5nZXRVcmwoKTsKKwkJCU9iamVjdElkIG9iamVjdElkOworCQkJaWYgKE9iamVjdElkLmlzSWQocHJvai5nZXRSZXZpc2lvbigpKSkgeworCQkJCW9iamVjdElkID0gT2JqZWN0SWQuZnJvbVN0cmluZyhwcm9qLmdldFJldmlzaW9uKCkpOworCQkJfSBlbHNlIHsKKwkJCQlvYmplY3RJZCA9IGNhbGxiYWNrLnNoYTEodXJsLCBwcm9qLmdldFJldmlzaW9uKCkpOworCQkJCWlmIChvYmplY3RJZCA9PSBudWxsICYmICFjb25maWcuaWdub3JlUmVtb3RlRmFpbHVyZXMpIHsKKwkJCQkJdGhyb3cgbmV3IFJlbW90ZVVuYXZhaWxhYmxlRXhjZXB0aW9uKHVybCk7CisJCQkJfQorCQkJCWlmIChjb25maWcucmVjb3JkUmVtb3RlQnJhbmNoKSB7CisJCQkJCS8vICJicmFuY2giIGZpZWxkIGlzIG9ubHkgZm9yIG5vbi10YWcgcmVmZXJlbmNlcy4KKwkJCQkJLy8gS2VlcCB0YWdzIGluICJyZWYiIGZpZWxkIGFzIGhpbnQgZm9yIG90aGVyIHRvb2xzLgorCQkJCQlTdHJpbmcgZmllbGQgPSBwcm9qLmdldFJldmlzaW9uKCkuc3RhcnRzV2l0aChSX1RBR1MpID8gInJlZiIgLy8kTk9OLU5MUy0xJAorCQkJCQkJCTogImJyYW5jaCI7IC8vJE5PTi1OTFMtMSQKKwkJCQkJY2ZnLnNldFN0cmluZygic3VibW9kdWxlIiwgbmFtZSwgZmllbGQsIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQlwcm9qLmdldFJldmlzaW9uKCkpOworCQkJCX0KKworCQkJCWlmIChjb25maWcucmVjb3JkU2hhbGxvd1N1Ym1vZHVsZXMKKwkJCQkJCSYmIHByb2ouZ2V0UmVjb21tZW5kU2hhbGxvdygpICE9IG51bGwpIHsKKwkJCQkJLy8gVGhlIHNoYWxsb3cgcmVjb21tZW5kYXRpb24gaXMgbG9zaW5nIGluZm9ybWF0aW9uLgorCQkJCQkvLyBBcyB0aGUgcmVwbyBtYW5pZmVzdHMgc3RvcmVzIHRoZSByZWNvbW1lbmRlZAorCQkJCQkvLyBkZXB0aCBpbiB0aGUgJ2Nsb25lLWRlcHRoJyBmaWVsZCwgd2hpbGUKKwkJCQkJLy8gZ2l0IGNvcmUgb25seSB1c2VzIGEgYmluYXJ5ICdzaGFsbG93ID0gdHJ1ZS9mYWxzZScKKwkJCQkJLy8gaGludCwgd2UnbGwgbWFwIGFueSBkZXB0aCB0byAnc2hhbGxvdyA9IHRydWUnCisJCQkJCWNmZy5zZXRCb29sZWFuKCJzdWJtb2R1bGUiLCBuYW1lLCAic2hhbGxvdyIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCQkJCXRydWUpOworCQkJCX0KKwkJCX0KKwkJCWlmIChjb25maWcucmVjb3JkU3VibW9kdWxlTGFiZWxzKSB7CisJCQkJU3RyaW5nQnVpbGRlciByZWMgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCQkJCXJlYy5hcHBlbmQoIi8iKTsgLy8kTk9OLU5MUy0xJAorCQkJCXJlYy5hcHBlbmQocGF0aCk7CisJCQkJZm9yIChTdHJpbmcgZ3JvdXAgOiBwcm9qLmdldEdyb3VwcygpKSB7CisJCQkJCXJlYy5hcHBlbmQoIiAiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlyZWMuYXBwZW5kKGdyb3VwKTsKKwkJCQl9CisJCQkJcmVjLmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJAorCQkJCWF0dHJpYnV0ZXMuYXBwZW5kKHJlYy50b1N0cmluZygpKTsKKwkJCX0KKworCQkJVVJJIHN1Ym1vZFVybCA9IFVSSS5jcmVhdGUodXJsKTsKKwkJCWlmICh0YXJnZXRVcmkgIT0gbnVsbCkgeworCQkJCXN1Ym1vZFVybCA9IFJlcG9Db21tYW5kLnJlbGF0aXZpemUodGFyZ2V0VXJpLCBzdWJtb2RVcmwpOworCQkJfQorCQkJY2ZnLnNldFN0cmluZygic3VibW9kdWxlIiwgbmFtZSwgInBhdGgiLCBwYXRoKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQljZmcuc2V0U3RyaW5nKCJzdWJtb2R1bGUiLCBuYW1lLCAidXJsIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJCXN1Ym1vZFVybC50b1N0cmluZygpKTsKKworCQkJLy8gY3JlYXRlIGdpdGxpbmsKKwkJCWlmIChvYmplY3RJZCAhPSBudWxsKSB7CisJCQkJRGlyQ2FjaGVFbnRyeSBkY0VudHJ5ID0gbmV3IERpckNhY2hlRW50cnkocGF0aCk7CisJCQkJZGNFbnRyeS5zZXRPYmplY3RJZChvYmplY3RJZCk7CisJCQkJZGNFbnRyeS5zZXRGaWxlTW9kZShGaWxlTW9kZS5HSVRMSU5LKTsKKwkJCQlidWlsZGVyLmFkZChkY0VudHJ5KTsKKworCQkJCWZvciAoQ29weUZpbGUgY29weWZpbGUgOiBwcm9qLmdldENvcHlGaWxlcygpKSB7CisJCQkJCVJlbW90ZUZpbGUgcmYgPSBjYWxsYmFjay5yZWFkRmlsZVdpdGhNb2RlKHVybCwKKwkJCQkJCQlwcm9qLmdldFJldmlzaW9uKCksIGNvcHlmaWxlLnNyYyk7CisJCQkJCW9iamVjdElkID0gaW5zZXJ0ZXIuaW5zZXJ0KENvbnN0YW50cy5PQkpfQkxPQiwKKwkJCQkJCQlyZi5nZXRDb250ZW50cygpKTsKKwkJCQkJZGNFbnRyeSA9IG5ldyBEaXJDYWNoZUVudHJ5KGNvcHlmaWxlLmRlc3QpOworCQkJCQlkY0VudHJ5LnNldE9iamVjdElkKG9iamVjdElkKTsKKwkJCQkJZGNFbnRyeS5zZXRGaWxlTW9kZShyZi5nZXRGaWxlTW9kZSgpKTsKKwkJCQkJYnVpbGRlci5hZGQoZGNFbnRyeSk7CisJCQkJfQorCQkJCWZvciAoTGlua0ZpbGUgbGlua2ZpbGUgOiBwcm9qLmdldExpbmtGaWxlcygpKSB7CisJCQkJCVN0cmluZyBsaW5rOworCQkJCQlpZiAobGlua2ZpbGUuZGVzdC5jb250YWlucygiLyIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCWxpbmsgPSBGaWxlVXRpbHMucmVsYXRpdml6ZUdpdFBhdGgoCisJCQkJCQkJCWxpbmtmaWxlLmRlc3Quc3Vic3RyaW5nKDAsCisJCQkJCQkJCQkJbGlua2ZpbGUuZGVzdC5sYXN0SW5kZXhPZignLycpKSwKKwkJCQkJCQkJcHJvai5nZXRQYXRoKCkgKyAiLyIgKyBsaW5rZmlsZS5zcmMpOyAvLyROT04tTkxTLTEkCisJCQkJCX0gZWxzZSB7CisJCQkJCQlsaW5rID0gcHJvai5nZXRQYXRoKCkgKyAiLyIgKyBsaW5rZmlsZS5zcmM7IC8vJE5PTi1OTFMtMSQKKwkJCQkJfQorCisJCQkJCW9iamVjdElkID0gaW5zZXJ0ZXIuaW5zZXJ0KENvbnN0YW50cy5PQkpfQkxPQiwKKwkJCQkJCQlsaW5rLmdldEJ5dGVzKFVURl84KSk7CisJCQkJCWRjRW50cnkgPSBuZXcgRGlyQ2FjaGVFbnRyeShsaW5rZmlsZS5kZXN0KTsKKwkJCQkJZGNFbnRyeS5zZXRPYmplY3RJZChvYmplY3RJZCk7CisJCQkJCWRjRW50cnkuc2V0RmlsZU1vZGUoRmlsZU1vZGUuU1lNTElOSyk7CisJCQkJCWJ1aWxkZXIuYWRkKGRjRW50cnkpOworCQkJCX0KKwkJCX0KKwkJfQorCQlTdHJpbmcgY29udGVudCA9IGNmZy50b1RleHQoKTsKKworCQkvLyBjcmVhdGUgYSBuZXcgRGlyQ2FjaGVFbnRyeSBmb3IgLmdpdG1vZHVsZXMgZmlsZS4KKwkJRGlyQ2FjaGVFbnRyeSBkY0VudHJ5ID0gbmV3IERpckNhY2hlRW50cnkoCisJCQkJQ29uc3RhbnRzLkRPVF9HSVRfTU9EVUxFUyk7CisJCU9iamVjdElkIG9iamVjdElkID0gaW5zZXJ0ZXIuaW5zZXJ0KENvbnN0YW50cy5PQkpfQkxPQiwKKwkJCQljb250ZW50LmdldEJ5dGVzKFVURl84KSk7CisJCWRjRW50cnkuc2V0T2JqZWN0SWQob2JqZWN0SWQpOworCQlkY0VudHJ5LnNldEZpbGVNb2RlKEZpbGVNb2RlLlJFR1VMQVJfRklMRSk7CisJCWJ1aWxkZXIuYWRkKGRjRW50cnkpOworCisJCWlmIChjb25maWcucmVjb3JkU3VibW9kdWxlTGFiZWxzKSB7CisJCQkvLyBjcmVhdGUgYSBuZXcgRGlyQ2FjaGVFbnRyeSBmb3IgLmdpdGF0dHJpYnV0ZXMgZmlsZS4KKwkJCURpckNhY2hlRW50cnkgZGNFbnRyeUF0dHIgPSBuZXcgRGlyQ2FjaGVFbnRyeSgKKwkJCQkJQ29uc3RhbnRzLkRPVF9HSVRfQVRUUklCVVRFUyk7CisJCQlPYmplY3RJZCBhdHRySWQgPSBpbnNlcnRlci5pbnNlcnQoQ29uc3RhbnRzLk9CSl9CTE9CLAorCQkJCQlhdHRyaWJ1dGVzLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJCWRjRW50cnlBdHRyLnNldE9iamVjdElkKGF0dHJJZCk7CisJCQlkY0VudHJ5QXR0ci5zZXRGaWxlTW9kZShGaWxlTW9kZS5SRUdVTEFSX0ZJTEUpOworCQkJYnVpbGRlci5hZGQoZGNFbnRyeUF0dHIpOworCQl9CisKKwkJZm9yIChFeHRyYUNvbnRlbnQgZWMgOiBleHRyYUNvbnRlbnRzKSB7CisJCQlEaXJDYWNoZUVudHJ5IGV4dHJhRGNFbnRyeSA9IG5ldyBEaXJDYWNoZUVudHJ5KGVjLnBhdGgpOworCisJCQlPYmplY3RJZCBvaWQgPSBpbnNlcnRlci5pbnNlcnQoQ29uc3RhbnRzLk9CSl9CTE9CLAorCQkJCQllYy5jb250ZW50LmdldEJ5dGVzKFVURl84KSk7CisJCQlleHRyYURjRW50cnkuc2V0T2JqZWN0SWQob2lkKTsKKwkJCWV4dHJhRGNFbnRyeS5zZXRGaWxlTW9kZShGaWxlTW9kZS5SRUdVTEFSX0ZJTEUpOworCQkJYnVpbGRlci5hZGQoZXh0cmFEY0VudHJ5KTsKKwkJfQorCisJCWJ1aWxkZXIuZmluaXNoKCk7CisJfQorCisJcHJpdmF0ZSBSZXZDb21taXQgY29tbWl0VHJlZU9uQ3VycmVudFRpcChPYmplY3RJbnNlcnRlciBpbnNlcnRlciwKKwkJCVJldldhbGsgcncsIE9iamVjdElkIHRyZWVJZCkKKwkJCXRocm93cyBJT0V4Y2VwdGlvbiwgQ29uY3VycmVudFJlZlVwZGF0ZUV4Y2VwdGlvbiB7CisJCU9iamVjdElkIGhlYWRJZCA9IHJlcG8ucmVzb2x2ZSh0YXJnZXRCcmFuY2ggKyAiXntjb21taXR9Iik7IC8vJE5PTi1OTFMtMSQKKwkJaWYgKGhlYWRJZCAhPSBudWxsCisJCQkJJiYgcncucGFyc2VDb21taXQoaGVhZElkKS5nZXRUcmVlKCkuZ2V0SWQoKS5lcXVhbHModHJlZUlkKSkgeworCQkJLy8gTm8gY2hhbmdlLiBEbyBub3RoaW5nLgorCQkJcmV0dXJuIHJ3LnBhcnNlQ29tbWl0KGhlYWRJZCk7CisJCX0KKworCQlDb21taXRCdWlsZGVyIGNvbW1pdCA9IG5ldyBDb21taXRCdWlsZGVyKCk7CisJCWNvbW1pdC5zZXRUcmVlSWQodHJlZUlkKTsKKwkJaWYgKGhlYWRJZCAhPSBudWxsKSB7CisJCQljb21taXQuc2V0UGFyZW50SWRzKGhlYWRJZCk7CisJCX0KKwkJY29tbWl0LnNldEF1dGhvcihhdXRob3IpOworCQljb21taXQuc2V0Q29tbWl0dGVyKGF1dGhvcik7CisJCWNvbW1pdC5zZXRNZXNzYWdlKFJlcG9UZXh0LmdldCgpLnJlcG9Db21taXRNZXNzYWdlKTsKKworCQlPYmplY3RJZCBjb21taXRJZCA9IGluc2VydGVyLmluc2VydChjb21taXQpOworCQlpbnNlcnRlci5mbHVzaCgpOworCisJCVJlZlVwZGF0ZSBydSA9IHJlcG8udXBkYXRlUmVmKHRhcmdldEJyYW5jaCk7CisJCXJ1LnNldE5ld09iamVjdElkKGNvbW1pdElkKTsKKwkJcnUuc2V0RXhwZWN0ZWRPbGRPYmplY3RJZChoZWFkSWQgIT0gbnVsbCA/IGhlYWRJZCA6IE9iamVjdElkLnplcm9JZCgpKTsKKwkJUmVzdWx0IHJjID0gcnUudXBkYXRlKHJ3KTsKKwkJc3dpdGNoIChyYykgeworCQljYXNlIE5FVzoKKwkJY2FzZSBGT1JDRUQ6CisJCWNhc2UgRkFTVF9GT1JXQVJEOgorCQkJLy8gU3VjY2Vzc2Z1bC4gRG8gbm90aGluZy4KKwkJCWJyZWFrOworCQljYXNlIFJFSkVDVEVEOgorCQljYXNlIExPQ0tfRkFJTFVSRToKKwkJCXRocm93IG5ldyBDb25jdXJyZW50UmVmVXBkYXRlRXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAorCQkJCQlKR2l0VGV4dC5nZXQoKS5jYW5ub3RMb2NrLCB0YXJnZXRCcmFuY2gpLCBydS5nZXRSZWYoKSwgcmMpOworCQlkZWZhdWx0OgorCQkJdGhyb3cgbmV3IEpHaXRJbnRlcm5hbEV4Y2VwdGlvbigKKwkJCQkJTWVzc2FnZUZvcm1hdC5mb3JtYXQoSkdpdFRleHQuZ2V0KCkudXBkYXRpbmdSZWZGYWlsZWQsCisJCQkJCQkJdGFyZ2V0QnJhbmNoLCBjb21taXRJZC5uYW1lKCksIHJjKSk7CisJCX0KKworCQlyZXR1cm4gcncucGFyc2VDb21taXQoY29tbWl0SWQpOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZ2l0cmVwby9SZWd1bGFyU3VwZXJwcm9qZWN0V3JpdGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2dpdHJlcG8vUmVndWxhclN1cGVycHJvamVjdFdyaXRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmYWI5OTQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2dpdHJlcG8vUmVndWxhclN1cGVycHJvamVjdFdyaXRlci5qYXZhCkBAIC0wLDAgKzEsMTA0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxLCBHb29nbGUgSW5jLiBhbmQgb3RoZXJzCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmdpdHJlcG87CisKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkRFRkFVTFRfUkVNT1RFX05BTUU7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5SX1JFTU9URVM7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuR2l0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLlN1Ym1vZHVsZUFkZENvbW1hbmQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzLkdpdEFQSUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmdpdHJlcG8uUmVwb0NvbW1hbmQuTWFuaWZlc3RFcnJvckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmdpdHJlcG8uUmVwb1Byb2plY3QuQ29weUZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5naXRyZXBvLlJlcG9Qcm9qZWN0LkxpbmtGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZ2l0cmVwby5pbnRlcm5hbC5SZXBvVGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLkpHaXRUZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLk9iamVjdElkOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZWY7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2Q29tbWl0OworCisvKioKKyAqIFdyaXRlcyAuZ2l0bW9kdWxlcyBhbmQgZ2l0bGlua3Mgb2YgcGFyc2VkIG1hbmlmZXN0IHByb2plY3RzIGludG8gYSByZWd1bGFyCisgKiByZXBvc2l0b3J5ICh1c2luZyBnaXQgc3VibW9kdWxlIGNvbW1hbmRzKQorICoKKyAqIFRvIHdyaXRlIG9uIGEgYmFyZSByZXBvc2l0b3J5LCB1c2Uge0BsaW5rIEJhcmVTdXBlcnByb2plY3RXcml0ZXJ9CisgKi8KK2NsYXNzIFJlZ3VsYXJTdXBlcnByb2plY3RXcml0ZXIgeworCisJcHJpdmF0ZSBSZXBvc2l0b3J5IHJlcG87CisKKwlwcml2YXRlIFByb2dyZXNzTW9uaXRvciBtb25pdG9yOworCisJUmVndWxhclN1cGVycHJvamVjdFdyaXRlcihSZXBvc2l0b3J5IHJlcG8sIFByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CisJCXRoaXMucmVwbyA9IHJlcG87CisJCXRoaXMubW9uaXRvciA9IG1vbml0b3I7CisJfQorCisJUmV2Q29tbWl0IHdyaXRlKExpc3Q8UmVwb1Byb2plY3Q+IHJlcG9Qcm9qZWN0cykKKwkJCXRocm93cyBHaXRBUElFeGNlcHRpb24geworCQl0cnkgKEdpdCBnaXQgPSBuZXcgR2l0KHJlcG8pKSB7CisJCQlmb3IgKFJlcG9Qcm9qZWN0IHByb2ogOiByZXBvUHJvamVjdHMpIHsKKwkJCQlhZGRTdWJtb2R1bGUocHJvai5nZXROYW1lKCksIHByb2ouZ2V0VXJsKCksIHByb2ouZ2V0UGF0aCgpLAorCQkJCQkJcHJvai5nZXRSZXZpc2lvbigpLCBwcm9qLmdldENvcHlGaWxlcygpLAorCQkJCQkJcHJvai5nZXRMaW5rRmlsZXMoKSwgZ2l0KTsKKwkJCX0KKwkJCXJldHVybiBnaXQuY29tbWl0KCkuc2V0TWVzc2FnZShSZXBvVGV4dC5nZXQoKS5yZXBvQ29tbWl0TWVzc2FnZSkKKwkJCQkJLmNhbGwoKTsKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IE1hbmlmZXN0RXJyb3JFeGNlcHRpb24oZSk7CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgYWRkU3VibW9kdWxlKFN0cmluZyBuYW1lLCBTdHJpbmcgdXJsLCBTdHJpbmcgcGF0aCwKKwkJCVN0cmluZyByZXZpc2lvbiwgTGlzdDxDb3B5RmlsZT4gY29weWZpbGVzLCBMaXN0PExpbmtGaWxlPiBsaW5rZmlsZXMsCisJCQlHaXQgZ2l0KSB0aHJvd3MgR2l0QVBJRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisJCWFzc2VydCAoIXJlcG8uaXNCYXJlKCkpOworCQlhc3NlcnQgKGdpdCAhPSBudWxsKTsKKwkJaWYgKCFsaW5rZmlsZXMuaXNFbXB0eSgpKSB7CisJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCisJCQkJCUpHaXRUZXh0LmdldCgpLm5vbkJhcmVMaW5rRmlsZXNOb3RTdXBwb3J0ZWQpOworCQl9CisKKwkJU3VibW9kdWxlQWRkQ29tbWFuZCBhZGQgPSBnaXQuc3VibW9kdWxlQWRkKCkuc2V0TmFtZShuYW1lKS5zZXRQYXRoKHBhdGgpCisJCQkJLnNldFVSSSh1cmwpOworCQlpZiAobW9uaXRvciAhPSBudWxsKSB7CisJCQlhZGQuc2V0UHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IpOworCQl9CisKKwkJUmVwb3NpdG9yeSBzdWJSZXBvID0gYWRkLmNhbGwoKTsKKwkJaWYgKHJldmlzaW9uICE9IG51bGwpIHsKKwkJCXRyeSAoR2l0IHN1YiA9IG5ldyBHaXQoc3ViUmVwbykpIHsKKwkJCQlzdWIuY2hlY2tvdXQoKS5zZXROYW1lKGZpbmRSZWYocmV2aXNpb24sIHN1YlJlcG8pKS5jYWxsKCk7CisJCQl9CisJCQlzdWJSZXBvLmNsb3NlKCk7CisJCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4ocGF0aCkuY2FsbCgpOworCQl9CisJCWZvciAoQ29weUZpbGUgY29weWZpbGUgOiBjb3B5ZmlsZXMpIHsKKwkJCWNvcHlmaWxlLmNvcHkoKTsKKwkJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybihjb3B5ZmlsZS5kZXN0KS5jYWxsKCk7CisJCX0KKwl9CisKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZmluZFJlZihTdHJpbmcgcmVmLCBSZXBvc2l0b3J5IHJlcG8pCisJCQl0aHJvd3MgSU9FeGNlcHRpb24geworCQlpZiAoIU9iamVjdElkLmlzSWQocmVmKSkgeworCQkJUmVmIHIgPSByZXBvLmV4YWN0UmVmKFJfUkVNT1RFUyArIERFRkFVTFRfUkVNT1RFX05BTUUgKyAiLyIgKyByZWYpOyAvLyROT04tTkxTLTEkCisJCQlpZiAociAhPSBudWxsKSB7CisJCQkJcmV0dXJuIHIuZ2V0TmFtZSgpOworCQkJfQorCQl9CisJCXJldHVybiByZWY7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9naXRyZXBvL1JlcG9Db21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2dpdHJlcG8vUmVwb0NvbW1hbmQuamF2YQppbmRleCBlMGE4MjI0Li42ZTk0M2U1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2dpdHJlcG8vUmVwb0NvbW1hbmQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2dpdHJlcG8vUmVwb0NvbW1hbmQuamF2YQpAQCAtOSwxMSArOSw2IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5naXRyZXBvOwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkRFRkFVTFRfUkVNT1RFX05BTUU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5SX1JFTU9URVM7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5SX1RBR1M7Ci0KIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKQEAgLTMxLDM0ICsyNiwyMSBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYW5ub3RhdGlvbnMuTnVsbGFibGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuR2l0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLkdpdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuU3VibW9kdWxlQWRkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnMuQ29uY3VycmVudFJlZlVwZGF0ZUV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnMuR2l0QVBJRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9ycy5JbnZhbGlkUmVmTmFtZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnMuSkdpdEludGVybmFsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZGlyY2FjaGUuRGlyQ2FjaGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5kaXJjYWNoZS5EaXJDYWNoZUJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5kaXJjYWNoZS5EaXJDYWNoZUVudHJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZ2l0cmVwby5CYXJlU3VwZXJwcm9qZWN0V3JpdGVyLkV4dHJhQ29udGVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmdpdHJlcG8uTWFuaWZlc3RQYXJzZXIuSW5jbHVkZWRGaWxlUmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZ2l0cmVwby5SZXBvUHJvamVjdC5Db3B5RmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmdpdHJlcG8uUmVwb1Byb2plY3QuTGlua0ZpbGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5naXRyZXBvLmludGVybmFsLlJlcG9UZXh0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuSkdpdFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29tbWl0QnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkZpbGVNb2RlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLk9iamVjdElkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLk9iamVjdEluc2VydGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlBlcnNvbklkZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlByb2dyZXNzTW9uaXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZWY7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVmRGF0YWJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVmVXBkYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlZlVwZGF0ZS5SZXN1bHQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVwb3NpdG9yeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2Q29tbWl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5SZXZXYWxrOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuVHJlZVdhbGs7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLkZpbGVVdGlsczsKIApAQCAtODAsMTIgKzYyLDcgQEAKICAqIEBzaW5jZSAzLjQKICAqLwogcHVibGljIGNsYXNzIFJlcG9Db21tYW5kIGV4dGVuZHMgR2l0Q29tbWFuZDxSZXZDb21taXQ+IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTE9DS19GQUlMVVJFX01BWF9SRVRSSUVTID0gNTsKIAotCS8vIFJldHJ5IGV4cG9uZW50aWFsbHkgd2l0aCBkZWxheXMgaW4gdGhpcyByYW5nZQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMT0NLX0ZBSUxVUkVfTUlOX1JFVFJZX0RFTEFZX01JTExJUyA9IDUwOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExPQ0tfRkFJTFVSRV9NQVhfUkVUUllfREVMQVlfTUlMTElTID0gNTAwMDsKIAogCXByaXZhdGUgU3RyaW5nIG1hbmlmZXN0UGF0aDsKIAlwcml2YXRlIFN0cmluZyBiYXNlVXJpOwpAQCAtOTMsMTcgKzcwLDE4IEBAIHB1YmxpYyBjbGFzcyBSZXBvQ29tbWFuZCBleHRlbmRzIEdpdENvbW1hbmQ8UmV2Q29tbWl0PiB7CiAJcHJpdmF0ZSBTdHJpbmcgZ3JvdXBzUGFyYW07CiAJcHJpdmF0ZSBTdHJpbmcgYnJhbmNoOwogCXByaXZhdGUgU3RyaW5nIHRhcmdldEJyYW5jaCA9IENvbnN0YW50cy5IRUFEOwotCXByaXZhdGUgYm9vbGVhbiByZWNvcmRSZW1vdGVCcmFuY2ggPSB0cnVlOwotCXByaXZhdGUgYm9vbGVhbiByZWNvcmRTdWJtb2R1bGVMYWJlbHMgPSB0cnVlOwotCXByaXZhdGUgYm9vbGVhbiByZWNvcmRTaGFsbG93U3VibW9kdWxlcyA9IHRydWU7CiAJcHJpdmF0ZSBQZXJzb25JZGVudCBhdXRob3I7CiAJcHJpdmF0ZSBSZW1vdGVSZWFkZXIgY2FsbGJhY2s7CiAJcHJpdmF0ZSBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbTsKIAlwcml2YXRlIEluY2x1ZGVkRmlsZVJlYWRlciBpbmNsdWRlZFJlYWRlcjsKLQlwcml2YXRlIGJvb2xlYW4gaWdub3JlUmVtb3RlRmFpbHVyZXMgPSBmYWxzZTsKKworCXByaXZhdGUgQmFyZVN1cGVycHJvamVjdFdyaXRlci5CYXJlV3JpdGVyQ29uZmlnIGJhcmVXcml0ZXJDb25maWcgPSBCYXJlU3VwZXJwcm9qZWN0V3JpdGVyLkJhcmVXcml0ZXJDb25maWcKKwkJCS5nZXREZWZhdWx0KCk7CiAKIAlwcml2YXRlIFByb2dyZXNzTW9uaXRvciBtb25pdG9yOwogCisJcHJpdmF0ZSBmaW5hbCBMaXN0PEV4dHJhQ29udGVudD4gZXh0cmFDb250ZW50cyA9IG5ldyBBcnJheUxpc3Q8PigpOworCiAJLyoqCiAJICogQSBjYWxsYmFjayB0byBnZXQgcmVmIHNoYTEgb2YgYSByZXBvc2l0b3J5IGZyb20gaXRzIHVyaS4KIAkgKgpAQCAtMjY5LDE0ICsyNDcsMTQgQEAgcHVibGljIFJlbW90ZUZpbGUgcmVhZEZpbGVXaXRoTW9kZShTdHJpbmcgdXJpLCBTdHJpbmcgcmVmLCBTdHJpbmcgcGF0aCkKIAl9CiAKIAlAU3VwcHJlc3NXYXJuaW5ncygic2VyaWFsIikKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBNYW5pZmVzdEVycm9yRXhjZXB0aW9uIGV4dGVuZHMgR2l0QVBJRXhjZXB0aW9uIHsKKwlzdGF0aWMgY2xhc3MgTWFuaWZlc3RFcnJvckV4Y2VwdGlvbiBleHRlbmRzIEdpdEFQSUV4Y2VwdGlvbiB7CiAJCU1hbmlmZXN0RXJyb3JFeGNlcHRpb24oVGhyb3dhYmxlIGNhdXNlKSB7CiAJCQlzdXBlcihSZXBvVGV4dC5nZXQoKS5pbnZhbGlkTWFuaWZlc3QsIGNhdXNlKTsKIAkJfQogCX0KIAogCUBTdXBwcmVzc1dhcm5pbmdzKCJzZXJpYWwiKQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFJlbW90ZVVuYXZhaWxhYmxlRXhjZXB0aW9uIGV4dGVuZHMgR2l0QVBJRXhjZXB0aW9uIHsKKwlzdGF0aWMgY2xhc3MgUmVtb3RlVW5hdmFpbGFibGVFeGNlcHRpb24gZXh0ZW5kcyBHaXRBUElFeGNlcHRpb24gewogCQlSZW1vdGVVbmF2YWlsYWJsZUV4Y2VwdGlvbihTdHJpbmcgdXJpKSB7CiAJCQlzdXBlcihNZXNzYWdlRm9ybWF0LmZvcm1hdChSZXBvVGV4dC5nZXQoKS5lcnJvclJlbW90ZVVuYXZhaWxhYmxlLCB1cmkpKTsKIAkJfQpAQCAtNDIxLDcgKzM5OSw3IEBAIHB1YmxpYyBSZXBvQ29tbWFuZCBzZXRUYXJnZXRCcmFuY2goU3RyaW5nIGJyYW5jaCkgewogCSAqIEBzaW5jZSA0LjIKIAkgKi8KIAlwdWJsaWMgUmVwb0NvbW1hbmQgc2V0UmVjb3JkUmVtb3RlQnJhbmNoKGJvb2xlYW4gZW5hYmxlKSB7Ci0JCXRoaXMucmVjb3JkUmVtb3RlQnJhbmNoID0gZW5hYmxlOworCQl0aGlzLmJhcmVXcml0ZXJDb25maWcucmVjb3JkUmVtb3RlQnJhbmNoID0gZW5hYmxlOwogCQlyZXR1cm4gdGhpczsKIAl9CiAKQEAgLTQzNiw3ICs0MTQsNyBAQCBwdWJsaWMgUmVwb0NvbW1hbmQgc2V0UmVjb3JkUmVtb3RlQnJhbmNoKGJvb2xlYW4gZW5hYmxlKSB7CiAJICogQHNpbmNlIDQuNAogCSAqLwogCXB1YmxpYyBSZXBvQ29tbWFuZCBzZXRSZWNvcmRTdWJtb2R1bGVMYWJlbHMoYm9vbGVhbiBlbmFibGUpIHsKLQkJdGhpcy5yZWNvcmRTdWJtb2R1bGVMYWJlbHMgPSBlbmFibGU7CisJCXRoaXMuYmFyZVdyaXRlckNvbmZpZy5yZWNvcmRTdWJtb2R1bGVMYWJlbHMgPSBlbmFibGU7CiAJCXJldHVybiB0aGlzOwogCX0KIApAQCAtNDUxLDcgKzQyOSw3IEBAIHB1YmxpYyBSZXBvQ29tbWFuZCBzZXRSZWNvcmRTdWJtb2R1bGVMYWJlbHMoYm9vbGVhbiBlbmFibGUpIHsKIAkgKiBAc2luY2UgNC40CiAJICovCiAJcHVibGljIFJlcG9Db21tYW5kIHNldFJlY29tbWVuZFNoYWxsb3coYm9vbGVhbiBlbmFibGUpIHsKLQkJdGhpcy5yZWNvcmRTaGFsbG93U3VibW9kdWxlcyA9IGVuYWJsZTsKKwkJdGhpcy5iYXJlV3JpdGVyQ29uZmlnLnJlY29yZFNoYWxsb3dTdWJtb2R1bGVzID0gZW5hYmxlOwogCQlyZXR1cm4gdGhpczsKIAl9CiAKQEAgLTQ4NSw3ICs0NjMsNyBAQCBwdWJsaWMgUmVwb0NvbW1hbmQgc2V0UHJvZ3Jlc3NNb25pdG9yKFByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CiAJICogQHNpbmNlIDQuMwogCSAqLwogCXB1YmxpYyBSZXBvQ29tbWFuZCBzZXRJZ25vcmVSZW1vdGVGYWlsdXJlcyhib29sZWFuIGlnbm9yZSkgewotCQl0aGlzLmlnbm9yZVJlbW90ZUZhaWx1cmVzID0gaWdub3JlOworCQl0aGlzLmJhcmVXcml0ZXJDb25maWcuaWdub3JlUmVtb3RlRmFpbHVyZXMgPSBpZ25vcmU7CiAJCXJldHVybiB0aGlzOwogCX0KIApAQCAtNTM0LDYgKzUxMiwyMiBAQCBwdWJsaWMgUmVwb0NvbW1hbmQgc2V0SW5jbHVkZWRGaWxlUmVhZGVyKEluY2x1ZGVkRmlsZVJlYWRlciByZWFkZXIpIHsKIAkJcmV0dXJuIHRoaXM7CiAJfQogCisJLyoqCisJICogQ3JlYXRlIGEgZmlsZSB3aXRoIHRoZSBnaXZlbiBjb250ZW50IGluIHRoZSBkZXN0aW5hdGlvbiByZXBvc2l0b3J5CisJICoKKwkgKiBAcGFyYW0gcGF0aAorCSAqICAgICAgICAgICAgd2hlcmUgdG8gY3JlYXRlIHRoZSBmaWxlIGluIHRoZSBkZXN0aW5hdGlvbiByZXBvc2l0b3J5CisJICogQHBhcmFtIGNvbnRlbnRzCisJICogICAgICAgICAgICBjb250ZW50IGZvciB0aGUgY3JlYXRlIGZpbGUKKwkgKiBAcmV0dXJuIHRoaXMgY29tbWFuZAorCSAqCisJICogQHNpbmNlIDYuMQorCSAqLworCXB1YmxpYyBSZXBvQ29tbWFuZCBhZGRUb0Rlc3RpbmF0aW9uKFN0cmluZyBwYXRoLCBTdHJpbmcgY29udGVudHMpIHsKKwkJdGhpcy5leHRyYUNvbnRlbnRzLmFkZChuZXcgRXh0cmFDb250ZW50KHBhdGgsIGNvbnRlbnRzKSk7CisJCXJldHVybiB0aGlzOworCX0KKwogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCiAJcHVibGljIFJldkNvbW1pdCBjYWxsKCkgdGhyb3dzIEdpdEFQSUV4Y2VwdGlvbiB7CkBAIC01NzAsMjQwICs1NjQsMTggQEAgcHVibGljIFJldkNvbW1pdCBjYWxsKCkgdGhyb3dzIEdpdEFQSUV4Y2VwdGlvbiB7CiAJCX0KIAogCQlpZiAocmVwby5pc0JhcmUoKSkgewotCQkJaWYgKGF1dGhvciA9PSBudWxsKQotCQkJCWF1dGhvciA9IG5ldyBQZXJzb25JZGVudChyZXBvKTsKLQkJCWlmIChjYWxsYmFjayA9PSBudWxsKQotCQkJCWNhbGxiYWNrID0gbmV3IERlZmF1bHRSZW1vdGVSZWFkZXIoKTsKIAkJCUxpc3Q8UmVwb1Byb2plY3Q+IHJlbmFtZWRQcm9qZWN0cyA9IHJlbmFtZVByb2plY3RzKGZpbHRlcmVkUHJvamVjdHMpOwotCi0JCQlEaXJDYWNoZSBpbmRleCA9IERpckNhY2hlLm5ld0luQ29yZSgpOwotCQkJT2JqZWN0SW5zZXJ0ZXIgaW5zZXJ0ZXIgPSByZXBvLm5ld09iamVjdEluc2VydGVyKCk7Ci0KLQkJCXRyeSAoUmV2V2FsayBydyA9IG5ldyBSZXZXYWxrKHJlcG8pKSB7Ci0JCQkJcHJlcGFyZUluZGV4KHJlbmFtZWRQcm9qZWN0cywgaW5kZXgsIGluc2VydGVyKTsKLQkJCQlPYmplY3RJZCB0cmVlSWQgPSBpbmRleC53cml0ZVRyZWUoaW5zZXJ0ZXIpOwotCQkJCWxvbmcgcHJldkRlbGF5ID0gMDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IExPQ0tfRkFJTFVSRV9NQVhfUkVUUklFUyAtIDE7IGkrKykgewotCQkJCQl0cnkgewotCQkJCQkJcmV0dXJuIGNvbW1pdFRyZWVPbkN1cnJlbnRUaXAoCi0JCQkJCQkJaW5zZXJ0ZXIsIHJ3LCB0cmVlSWQpOwotCQkJCQl9IGNhdGNoIChDb25jdXJyZW50UmVmVXBkYXRlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCXByZXZEZWxheSA9IEZpbGVVdGlscy5kZWxheShwcmV2RGVsYXksCi0JCQkJCQkJCUxPQ0tfRkFJTFVSRV9NSU5fUkVUUllfREVMQVlfTUlMTElTLAotCQkJCQkJCQlMT0NLX0ZBSUxVUkVfTUFYX1JFVFJZX0RFTEFZX01JTExJUyk7Ci0JCQkJCQlUaHJlYWQuc2xlZXAocHJldkRlbGF5KTsKLQkJCQkJCXJlcG8uZ2V0UmVmRGF0YWJhc2UoKS5yZWZyZXNoKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJLy8gSW4gdGhlIGxhc3QgdHJ5LCBqdXN0IHByb3BhZ2F0ZSB0aGUgZXhjZXB0aW9ucwotCQkJCXJldHVybiBjb21taXRUcmVlT25DdXJyZW50VGlwKGluc2VydGVyLCBydywgdHJlZUlkKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIHwgSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCXRocm93IG5ldyBNYW5pZmVzdEVycm9yRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0JCXRyeSAoR2l0IGdpdCA9IG5ldyBHaXQocmVwbykpIHsKLQkJCWZvciAoUmVwb1Byb2plY3QgcHJvaiA6IGZpbHRlcmVkUHJvamVjdHMpIHsKLQkJCQlhZGRTdWJtb2R1bGUocHJvai5nZXROYW1lKCksIHByb2ouZ2V0VXJsKCksIHByb2ouZ2V0UGF0aCgpLAotCQkJCQkJcHJvai5nZXRSZXZpc2lvbigpLCBwcm9qLmdldENvcHlGaWxlcygpLAotCQkJCQkJcHJvai5nZXRMaW5rRmlsZXMoKSwgZ2l0KTsKLQkJCX0KLQkJCXJldHVybiBnaXQuY29tbWl0KCkuc2V0TWVzc2FnZShSZXBvVGV4dC5nZXQoKS5yZXBvQ29tbWl0TWVzc2FnZSkKLQkJCQkJLmNhbGwoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IE1hbmlmZXN0RXJyb3JFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJlcGFyZUluZGV4KExpc3Q8UmVwb1Byb2plY3Q+IHByb2plY3RzLCBEaXJDYWNoZSBpbmRleCwKLQkJCU9iamVjdEluc2VydGVyIGluc2VydGVyKSB0aHJvd3MgSU9FeGNlcHRpb24sIEdpdEFQSUV4Y2VwdGlvbiB7Ci0JCUNvbmZpZyBjZmcgPSBuZXcgQ29uZmlnKCk7Ci0JCVN0cmluZ0J1aWxkZXIgYXR0cmlidXRlcyA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCURpckNhY2hlQnVpbGRlciBidWlsZGVyID0gaW5kZXguYnVpbGRlcigpOwotCQlmb3IgKFJlcG9Qcm9qZWN0IHByb2ogOiBwcm9qZWN0cykgewotCQkJU3RyaW5nIG5hbWUgPSBwcm9qLmdldE5hbWUoKTsKLQkJCVN0cmluZyBwYXRoID0gcHJvai5nZXRQYXRoKCk7Ci0JCQlTdHJpbmcgdXJsID0gcHJvai5nZXRVcmwoKTsKLQkJCU9iamVjdElkIG9iamVjdElkOwotCQkJaWYgKE9iamVjdElkLmlzSWQocHJvai5nZXRSZXZpc2lvbigpKSkgewotCQkJCW9iamVjdElkID0gT2JqZWN0SWQuZnJvbVN0cmluZyhwcm9qLmdldFJldmlzaW9uKCkpOwotCQkJfSBlbHNlIHsKLQkJCQlvYmplY3RJZCA9IGNhbGxiYWNrLnNoYTEodXJsLCBwcm9qLmdldFJldmlzaW9uKCkpOwotCQkJCWlmIChvYmplY3RJZCA9PSBudWxsICYmICFpZ25vcmVSZW1vdGVGYWlsdXJlcykgewotCQkJCQl0aHJvdyBuZXcgUmVtb3RlVW5hdmFpbGFibGVFeGNlcHRpb24odXJsKTsKLQkJCQl9Ci0JCQkJaWYgKHJlY29yZFJlbW90ZUJyYW5jaCkgewotCQkJCQkvLyAiYnJhbmNoIiBmaWVsZCBpcyBvbmx5IGZvciBub24tdGFnIHJlZmVyZW5jZXMuCi0JCQkJCS8vIEtlZXAgdGFncyBpbiAicmVmIiBmaWVsZCBhcyBoaW50IGZvciBvdGhlciB0b29scy4KLQkJCQkJU3RyaW5nIGZpZWxkID0gcHJvai5nZXRSZXZpc2lvbigpLnN0YXJ0c1dpdGgoUl9UQUdTKSA/ICJyZWYiIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQk6ICJicmFuY2giOyAvLyROT04tTkxTLTEkCi0JCQkJCWNmZy5zZXRTdHJpbmcoInN1Ym1vZHVsZSIsIG5hbWUsIGZpZWxkLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJcHJvai5nZXRSZXZpc2lvbigpKTsKLQkJCQl9Ci0KLQkJCQlpZiAocmVjb3JkU2hhbGxvd1N1Ym1vZHVsZXMKLQkJCQkJCSYmIHByb2ouZ2V0UmVjb21tZW5kU2hhbGxvdygpICE9IG51bGwpIHsKLQkJCQkJLy8gVGhlIHNoYWxsb3cgcmVjb21tZW5kYXRpb24gaXMgbG9zaW5nIGluZm9ybWF0aW9uLgotCQkJCQkvLyBBcyB0aGUgcmVwbyBtYW5pZmVzdHMgc3RvcmVzIHRoZSByZWNvbW1lbmRlZAotCQkJCQkvLyBkZXB0aCBpbiB0aGUgJ2Nsb25lLWRlcHRoJyBmaWVsZCwgd2hpbGUKLQkJCQkJLy8gZ2l0IGNvcmUgb25seSB1c2VzIGEgYmluYXJ5ICdzaGFsbG93ID0gdHJ1ZS9mYWxzZScKLQkJCQkJLy8gaGludCwgd2UnbGwgbWFwIGFueSBkZXB0aCB0byAnc2hhbGxvdyA9IHRydWUnCi0JCQkJCWNmZy5zZXRCb29sZWFuKCJzdWJtb2R1bGUiLCBuYW1lLCAic2hhbGxvdyIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCXRydWUpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChyZWNvcmRTdWJtb2R1bGVMYWJlbHMpIHsKLQkJCQlTdHJpbmdCdWlsZGVyIHJlYyA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCQkJcmVjLmFwcGVuZCgiLyIpOyAvLyROT04tTkxTLTEkCi0JCQkJcmVjLmFwcGVuZChwYXRoKTsKLQkJCQlmb3IgKFN0cmluZyBncm91cCA6IHByb2ouZ2V0R3JvdXBzKCkpIHsKLQkJCQkJcmVjLmFwcGVuZCgiICIpOyAvLyROT04tTkxTLTEkCi0JCQkJCXJlYy5hcHBlbmQoZ3JvdXApOwotCQkJCX0KLQkJCQlyZWMuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkCi0JCQkJYXR0cmlidXRlcy5hcHBlbmQocmVjLnRvU3RyaW5nKCkpOwotCQkJfQotCi0JCQlVUkkgc3VibW9kVXJsID0gVVJJLmNyZWF0ZSh1cmwpOwotCQkJaWYgKHRhcmdldFVyaSAhPSBudWxsKSB7Ci0JCQkJc3VibW9kVXJsID0gcmVsYXRpdml6ZSh0YXJnZXRVcmksIHN1Ym1vZFVybCk7Ci0JCQl9Ci0JCQljZmcuc2V0U3RyaW5nKCJzdWJtb2R1bGUiLCBuYW1lLCAicGF0aCIsIHBhdGgpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWNmZy5zZXRTdHJpbmcoInN1Ym1vZHVsZSIsIG5hbWUsICJ1cmwiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJc3VibW9kVXJsLnRvU3RyaW5nKCkpOwotCi0JCQkvLyBjcmVhdGUgZ2l0bGluawotCQkJaWYgKG9iamVjdElkICE9IG51bGwpIHsKLQkJCQlEaXJDYWNoZUVudHJ5IGRjRW50cnkgPSBuZXcgRGlyQ2FjaGVFbnRyeShwYXRoKTsKLQkJCQlkY0VudHJ5LnNldE9iamVjdElkKG9iamVjdElkKTsKLQkJCQlkY0VudHJ5LnNldEZpbGVNb2RlKEZpbGVNb2RlLkdJVExJTkspOwotCQkJCWJ1aWxkZXIuYWRkKGRjRW50cnkpOwotCi0JCQkJZm9yIChDb3B5RmlsZSBjb3B5ZmlsZSA6IHByb2ouZ2V0Q29weUZpbGVzKCkpIHsKLQkJCQkJUmVtb3RlRmlsZSByZiA9IGNhbGxiYWNrLnJlYWRGaWxlV2l0aE1vZGUodXJsLAotCQkJCQkJCXByb2ouZ2V0UmV2aXNpb24oKSwgY29weWZpbGUuc3JjKTsKLQkJCQkJb2JqZWN0SWQgPSBpbnNlcnRlci5pbnNlcnQoQ29uc3RhbnRzLk9CSl9CTE9CLAotCQkJCQkJCXJmLmdldENvbnRlbnRzKCkpOwotCQkJCQlkY0VudHJ5ID0gbmV3IERpckNhY2hlRW50cnkoY29weWZpbGUuZGVzdCk7Ci0JCQkJCWRjRW50cnkuc2V0T2JqZWN0SWQob2JqZWN0SWQpOwotCQkJCQlkY0VudHJ5LnNldEZpbGVNb2RlKHJmLmdldEZpbGVNb2RlKCkpOwotCQkJCQlidWlsZGVyLmFkZChkY0VudHJ5KTsKLQkJCQl9Ci0JCQkJZm9yIChMaW5rRmlsZSBsaW5rZmlsZSA6IHByb2ouZ2V0TGlua0ZpbGVzKCkpIHsKLQkJCQkJU3RyaW5nIGxpbms7Ci0JCQkJCWlmIChsaW5rZmlsZS5kZXN0LmNvbnRhaW5zKCIvIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJbGluayA9IEZpbGVVdGlscy5yZWxhdGl2aXplR2l0UGF0aCgKLQkJCQkJCQkJbGlua2ZpbGUuZGVzdC5zdWJzdHJpbmcoMCwKLQkJCQkJCQkJCQlsaW5rZmlsZS5kZXN0Lmxhc3RJbmRleE9mKCcvJykpLAotCQkJCQkJCQlwcm9qLmdldFBhdGgoKSArICIvIiArIGxpbmtmaWxlLnNyYyk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWxpbmsgPSBwcm9qLmdldFBhdGgoKSArICIvIiArIGxpbmtmaWxlLnNyYzsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0KLQkJCQkJb2JqZWN0SWQgPSBpbnNlcnRlci5pbnNlcnQoQ29uc3RhbnRzLk9CSl9CTE9CLAotCQkJCQkJCWxpbmsuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJCQkJZGNFbnRyeSA9IG5ldyBEaXJDYWNoZUVudHJ5KGxpbmtmaWxlLmRlc3QpOwotCQkJCQlkY0VudHJ5LnNldE9iamVjdElkKG9iamVjdElkKTsKLQkJCQkJZGNFbnRyeS5zZXRGaWxlTW9kZShGaWxlTW9kZS5TWU1MSU5LKTsKLQkJCQkJYnVpbGRlci5hZGQoZGNFbnRyeSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCVN0cmluZyBjb250ZW50ID0gY2ZnLnRvVGV4dCgpOwotCi0JCS8vIGNyZWF0ZSBhIG5ldyBEaXJDYWNoZUVudHJ5IGZvciAuZ2l0bW9kdWxlcyBmaWxlLgotCQlEaXJDYWNoZUVudHJ5IGRjRW50cnkgPSBuZXcgRGlyQ2FjaGVFbnRyeSgKLQkJCQlDb25zdGFudHMuRE9UX0dJVF9NT0RVTEVTKTsKLQkJT2JqZWN0SWQgb2JqZWN0SWQgPSBpbnNlcnRlci5pbnNlcnQoQ29uc3RhbnRzLk9CSl9CTE9CLAotCQkJCWNvbnRlbnQuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJZGNFbnRyeS5zZXRPYmplY3RJZChvYmplY3RJZCk7Ci0JCWRjRW50cnkuc2V0RmlsZU1vZGUoRmlsZU1vZGUuUkVHVUxBUl9GSUxFKTsKLQkJYnVpbGRlci5hZGQoZGNFbnRyeSk7Ci0KLQkJaWYgKHJlY29yZFN1Ym1vZHVsZUxhYmVscykgewotCQkJLy8gY3JlYXRlIGEgbmV3IERpckNhY2hlRW50cnkgZm9yIC5naXRhdHRyaWJ1dGVzIGZpbGUuCi0JCQlEaXJDYWNoZUVudHJ5IGRjRW50cnlBdHRyID0gbmV3IERpckNhY2hlRW50cnkoCi0JCQkJCUNvbnN0YW50cy5ET1RfR0lUX0FUVFJJQlVURVMpOwotCQkJT2JqZWN0SWQgYXR0cklkID0gaW5zZXJ0ZXIuaW5zZXJ0KENvbnN0YW50cy5PQkpfQkxPQiwKLQkJCQkJYXR0cmlidXRlcy50b1N0cmluZygpLmdldEJ5dGVzKFVURl84KSk7Ci0JCQlkY0VudHJ5QXR0ci5zZXRPYmplY3RJZChhdHRySWQpOwotCQkJZGNFbnRyeUF0dHIuc2V0RmlsZU1vZGUoRmlsZU1vZGUuUkVHVUxBUl9GSUxFKTsKLQkJCWJ1aWxkZXIuYWRkKGRjRW50cnlBdHRyKTsKKwkJCUJhcmVTdXBlcnByb2plY3RXcml0ZXIgd3JpdGVyID0gbmV3IEJhcmVTdXBlcnByb2plY3RXcml0ZXIocmVwbywgdGFyZ2V0VXJpLAorCQkJCQl0YXJnZXRCcmFuY2gsCisJCQkJCWF1dGhvciA9PSBudWxsID8gbmV3IFBlcnNvbklkZW50KHJlcG8pIDogYXV0aG9yLAorCQkJCQljYWxsYmFjayA9PSBudWxsID8gbmV3IERlZmF1bHRSZW1vdGVSZWFkZXIoKSA6IGNhbGxiYWNrLAorCQkJCQliYXJlV3JpdGVyQ29uZmlnLCBleHRyYUNvbnRlbnRzKTsKKwkJCXJldHVybiB3cml0ZXIud3JpdGUocmVuYW1lZFByb2plY3RzKTsKIAkJfQogCi0JCWJ1aWxkZXIuZmluaXNoKCk7Ci0JfQogCi0JcHJpdmF0ZSBSZXZDb21taXQgY29tbWl0VHJlZU9uQ3VycmVudFRpcChPYmplY3RJbnNlcnRlciBpbnNlcnRlciwKLQkJCVJldldhbGsgcncsIE9iamVjdElkIHRyZWVJZCkKLQkJCXRocm93cyBJT0V4Y2VwdGlvbiwgQ29uY3VycmVudFJlZlVwZGF0ZUV4Y2VwdGlvbiB7Ci0JCU9iamVjdElkIGhlYWRJZCA9IHJlcG8ucmVzb2x2ZSh0YXJnZXRCcmFuY2ggKyAiXntjb21taXR9Iik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGhlYWRJZCAhPSBudWxsICYmIHJ3LnBhcnNlQ29tbWl0KGhlYWRJZCkuZ2V0VHJlZSgpLmdldElkKCkuZXF1YWxzKHRyZWVJZCkpIHsKLQkJCS8vIE5vIGNoYW5nZS4gRG8gbm90aGluZy4KLQkJCXJldHVybiBydy5wYXJzZUNvbW1pdChoZWFkSWQpOwotCQl9Ci0KLQkJQ29tbWl0QnVpbGRlciBjb21taXQgPSBuZXcgQ29tbWl0QnVpbGRlcigpOwotCQljb21taXQuc2V0VHJlZUlkKHRyZWVJZCk7Ci0JCWlmIChoZWFkSWQgIT0gbnVsbCkKLQkJCWNvbW1pdC5zZXRQYXJlbnRJZHMoaGVhZElkKTsKLQkJY29tbWl0LnNldEF1dGhvcihhdXRob3IpOwotCQljb21taXQuc2V0Q29tbWl0dGVyKGF1dGhvcik7Ci0JCWNvbW1pdC5zZXRNZXNzYWdlKFJlcG9UZXh0LmdldCgpLnJlcG9Db21taXRNZXNzYWdlKTsKLQotCQlPYmplY3RJZCBjb21taXRJZCA9IGluc2VydGVyLmluc2VydChjb21taXQpOwotCQlpbnNlcnRlci5mbHVzaCgpOwotCi0JCVJlZlVwZGF0ZSBydSA9IHJlcG8udXBkYXRlUmVmKHRhcmdldEJyYW5jaCk7Ci0JCXJ1LnNldE5ld09iamVjdElkKGNvbW1pdElkKTsKLQkJcnUuc2V0RXhwZWN0ZWRPbGRPYmplY3RJZChoZWFkSWQgIT0gbnVsbCA/IGhlYWRJZCA6IE9iamVjdElkLnplcm9JZCgpKTsKLQkJUmVzdWx0IHJjID0gcnUudXBkYXRlKHJ3KTsKLQkJc3dpdGNoIChyYykgewotCQkJY2FzZSBORVc6Ci0JCQljYXNlIEZPUkNFRDoKLQkJCWNhc2UgRkFTVF9GT1JXQVJEOgotCQkJCS8vIFN1Y2Nlc3NmdWwuIERvIG5vdGhpbmcuCi0JCQkJYnJlYWs7Ci0JCQljYXNlIFJFSkVDVEVEOgotCQkJY2FzZSBMT0NLX0ZBSUxVUkU6Ci0JCQkJdGhyb3cgbmV3IENvbmN1cnJlbnRSZWZVcGRhdGVFeGNlcHRpb24oTWVzc2FnZUZvcm1hdAotCQkJCQkJLmZvcm1hdChKR2l0VGV4dC5nZXQoKS5jYW5ub3RMb2NrLCB0YXJnZXRCcmFuY2gpLAotCQkJCQkJcnUuZ2V0UmVmKCksIHJjKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IEpHaXRJbnRlcm5hbEV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdCgKLQkJCQkJCUpHaXRUZXh0LmdldCgpLnVwZGF0aW5nUmVmRmFpbGVkLAotCQkJCQkJdGFyZ2V0QnJhbmNoLCBjb21taXRJZC5uYW1lKCksIHJjKSk7Ci0JCX0KLQotCQlyZXR1cm4gcncucGFyc2VDb21taXQoY29tbWl0SWQpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRTdWJtb2R1bGUoU3RyaW5nIG5hbWUsIFN0cmluZyB1cmwsIFN0cmluZyBwYXRoLAotCQkJU3RyaW5nIHJldmlzaW9uLCBMaXN0PENvcHlGaWxlPiBjb3B5ZmlsZXMsIExpc3Q8TGlua0ZpbGU+IGxpbmtmaWxlcywKLQkJCUdpdCBnaXQpIHRocm93cyBHaXRBUElFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJYXNzZXJ0ICghcmVwby5pc0JhcmUoKSk7Ci0JCWFzc2VydCAoZ2l0ICE9IG51bGwpOwotCQlpZiAoIWxpbmtmaWxlcy5pc0VtcHR5KCkpIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigKLQkJCQkJSkdpdFRleHQuZ2V0KCkubm9uQmFyZUxpbmtGaWxlc05vdFN1cHBvcnRlZCk7Ci0JCX0KLQotCQlTdWJtb2R1bGVBZGRDb21tYW5kIGFkZCA9IGdpdC5zdWJtb2R1bGVBZGQoKS5zZXROYW1lKG5hbWUpLnNldFBhdGgocGF0aCkKLQkJCQkuc2V0VVJJKHVybCk7Ci0JCWlmIChtb25pdG9yICE9IG51bGwpCi0JCQlhZGQuc2V0UHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IpOwotCi0JCVJlcG9zaXRvcnkgc3ViUmVwbyA9IGFkZC5jYWxsKCk7Ci0JCWlmIChyZXZpc2lvbiAhPSBudWxsKSB7Ci0JCQl0cnkgKEdpdCBzdWIgPSBuZXcgR2l0KHN1YlJlcG8pKSB7Ci0JCQkJc3ViLmNoZWNrb3V0KCkuc2V0TmFtZShmaW5kUmVmKHJldmlzaW9uLCBzdWJSZXBvKSkuY2FsbCgpOwotCQkJfQotCQkJc3ViUmVwby5jbG9zZSgpOwotCQkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKHBhdGgpLmNhbGwoKTsKLQkJfQotCQlmb3IgKENvcHlGaWxlIGNvcHlmaWxlIDogY29weWZpbGVzKSB7Ci0JCQljb3B5ZmlsZS5jb3B5KCk7Ci0JCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oY29weWZpbGUuZGVzdCkuY2FsbCgpOwotCQl9CisJCVJlZ3VsYXJTdXBlcnByb2plY3RXcml0ZXIgd3JpdGVyID0gbmV3IFJlZ3VsYXJTdXBlcnByb2plY3RXcml0ZXIocmVwbywgbW9uaXRvcik7CisJCXJldHVybiB3cml0ZXIud3JpdGUoZmlsdGVyZWRQcm9qZWN0cyk7CiAJfQogCiAJLyoqCkBAIC05MTAsMTMgKzY4Miw0IEBAIHN0YXRpYyBVUkkgcmVsYXRpdml6ZShVUkkgY3VycmVudCwgVVJJIHRhcmdldCkgewogCQlyZXR1cm4gVVJJLmNyZWF0ZShqLnRvU3RyaW5nKCkpOwogCX0KIAotCXByaXZhdGUgc3RhdGljIFN0cmluZyBmaW5kUmVmKFN0cmluZyByZWYsIFJlcG9zaXRvcnkgcmVwbykKLQkJCXRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmICghT2JqZWN0SWQuaXNJZChyZWYpKSB7Ci0JCQlSZWYgciA9IHJlcG8uZXhhY3RSZWYoUl9SRU1PVEVTICsgREVGQVVMVF9SRU1PVEVfTkFNRSArICIvIiArIHJlZik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChyICE9IG51bGwpCi0JCQkJcmV0dXJuIHIuZ2V0TmFtZSgpOwotCQl9Ci0JCXJldHVybiByZWY7Ci0JfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9KR2l0VGV4dC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9KR2l0VGV4dC5qYXZhCmluZGV4IGI4YjFhZTIuLmJmNjVkYWUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvSkdpdFRleHQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL0pHaXRUZXh0LmphdmEKQEAgLTM4NCw2ICszODQsOCBAQCBwdWJsaWMgc3RhdGljIEpHaXRUZXh0IGdldCgpIHsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGluTWVtb3J5QnVmZmVyTGltaXRFeGNlZWRlZDsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGlucHV0RGlkbnRNYXRjaExlbmd0aDsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGlucHV0U3RyZWFtTXVzdFN1cHBvcnRNYXJrOworCS8qKiovIHB1YmxpYyBTdHJpbmcgaW50ZWdlclZhbHVlTm90SW5SYW5nZTsKKwkvKioqLyBwdWJsaWMgU3RyaW5nIGludGVnZXJWYWx1ZU5vdEluUmFuZ2VTdWJTZWN0aW9uOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgaW50ZWdlclZhbHVlT3V0T2ZSYW5nZTsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGludGVybmFsUmV2aXNpb25FcnJvcjsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGludGVybmFsU2VydmVyRXJyb3I7CkBAIC0zOTUsNiArMzk3LDcgQEAgcHVibGljIHN0YXRpYyBKR2l0VGV4dCBnZXQoKSB7CiAJLyoqKi8gcHVibGljIFN0cmluZyBpbnZhbGlkQm9vbGVhblZhbHVlOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgaW52YWxpZENoYW5uZWw7CiAJLyoqKi8gcHVibGljIFN0cmluZyBpbnZhbGlkQ29tbWl0UGFyZW50TnVtYmVyOworCS8qKiovIHB1YmxpYyBTdHJpbmcgaW52YWxpZENvcmVBYmJyZXY7CiAJLyoqKi8gcHVibGljIFN0cmluZyBpbnZhbGlkRGVwdGg7CiAJLyoqKi8gcHVibGljIFN0cmluZyBpbnZhbGlkRW5jb2Rpbmc7CiAJLyoqKi8gcHVibGljIFN0cmluZyBpbnZhbGlkRW5jcnlwdGlvbjsKQEAgLTU5Niw2ICs1OTksMTEgQEAgcHVibGljIHN0YXRpYyBKR2l0VGV4dCBnZXQoKSB7CiAJLyoqKi8gcHVibGljIFN0cmluZyBwdXNoQ2VydGlmaWNhdGVJbnZhbGlkRmllbGRWYWx1ZTsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIHB1c2hDZXJ0aWZpY2F0ZUludmFsaWRIZWFkZXI7CiAJLyoqKi8gcHVibGljIFN0cmluZyBwdXNoQ2VydGlmaWNhdGVJbnZhbGlkU2lnbmF0dXJlOworCS8qKiovIHB1YmxpYyBTdHJpbmcgcHVzaERlZmF1bHROb3RoaW5nOworCS8qKiovIHB1YmxpYyBTdHJpbmcgcHVzaERlZmF1bHROb1Vwc3RyZWFtOworCS8qKiovIHB1YmxpYyBTdHJpbmcgcHVzaERlZmF1bHRTaW1wbGU7CisJLyoqKi8gcHVibGljIFN0cmluZyBwdXNoRGVmYXVsdFRyaWFuZ3VsYXJVcHN0cmVhbTsKKwkvKioqLyBwdWJsaWMgU3RyaW5nIHB1c2hEZWZhdWx0VW5rbm93bjsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIHB1c2hJc05vdFN1cHBvcnRlZEZvckJ1bmRsZVRyYW5zcG9ydDsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIHB1c2hOb3RQZXJtaXR0ZWQ7CiAJLyoqKi8gcHVibGljIFN0cmluZyBwdXNoT3B0aW9uc05vdFN1cHBvcnRlZDsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvZGlmZm1lcmdldG9vbC9Db21tYW5kTGluZURpZmZUb29sLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL2RpZmZtZXJnZXRvb2wvQ29tbWFuZExpbmVEaWZmVG9vbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwOTUxNWMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL2RpZmZtZXJnZXRvb2wvQ29tbWFuZExpbmVEaWZmVG9vbC5qYXZhCkBAIC0wLDAgKzEsMjIxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4LTIwMjEsIEFuZHJlIEJvc3NlcnQgPGFuZHJlLmJvc3NlcnRAc2llbWVucy5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuZGlmZm1lcmdldG9vbDsKKworLyoqCisgKiBQcmUtZGVmaW5lZCBjb21tYW5kIGxpbmUgZGlmZiB0b29scy4KKyAqCisgKiBBZGRzIHNhbWUgZGlmZiB0b29scyBhcyBhbHNvIHByZS1kZWZpbmVkIGluIEMtR2l0CisgKiA8cD4KKyAqIHNlZSAiZ2l0LWNvcmVcbWVyZ2V0b29sc1wiCisgKiA8L3A+CisgKiA8cD4KKyAqIHNlZSBsaW5rcyB0byBjb21tYW5kIGxpbmUgcGFyYW1ldGVyIGRlc2NyaXB0aW9uIGZvciB0aGUgdG9vbHMKKyAqIDwvcD4KKyAqCisgKiA8cHJlPgorICogYXJheGlzCisgKiBiYworICogYmMzCisgKiBjb2RlY29tcGFyZQorICogZGVsdGF3YWxrZXIKKyAqIGRpZmZtZXJnZQorICogZGlmZnVzZQorICogZWNtZXJnZQorICogZW1lcmdlCisgKiBleGFtZGlmZgorICogZ3VpZmZ5CisgKiBndmltZGlmZgorICogZ3ZpbWRpZmYyCisgKiBndmltZGlmZjMKKyAqIGtkaWZmMworICoga29tcGFyZQorICogbWVsZAorICogb3BlbmRpZmYKKyAqIHA0bWVyZ2UKKyAqIHRrZGlmZgorICogdmltZGlmZgorICogdmltZGlmZjIKKyAqIHZpbWRpZmYzCisgKiB3aW5tZXJnZQorICogeHhkaWZmCisgKiA8L3ByZT4KKyAqCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQorcHVibGljIGVudW0gQ29tbWFuZExpbmVEaWZmVG9vbCB7CisJLyoqCisJICogU2VlOiA8YSBocmVmPQorCSAqICJodHRwczovL3d3dy5hcmF4aXMuY29tL21lcmdlL2RvY3VtZW50YXRpb24td2luZG93cy9jb21tYW5kLWxpbmUuZW4iPmh0dHBzOi8vd3d3LmFyYXhpcy5jb20vbWVyZ2UvZG9jdW1lbnRhdGlvbi13aW5kb3dzL2NvbW1hbmQtbGluZS5lbjwvYT4KKwkgKi8KKwlhcmF4aXMoImNvbXBhcmUiLCAiLXdhaXQgLTIgXCIkTE9DQUxcIiBcIiRSRU1PVEVcIiIpLAorCS8qKgorCSAqIFNlZTogPGEgaHJlZj0KKwkgKiAiaHR0cHM6Ly93d3cuc2Nvb3RlcnNvZnR3YXJlLmNvbS92NGhlbHAvaW5kZXguaHRtbD9jb21tYW5kX2xpbmVfcmVmZXJlbmNlLmh0bWwiPmh0dHBzOi8vd3d3LnNjb290ZXJzb2Z0d2FyZS5jb20vdjRoZWxwL2luZGV4Lmh0bWw/Y29tbWFuZF9saW5lX3JlZmVyZW5jZS5odG1sPC9hPgorCSAqLworCWJjKCJiY29tcCIsICJcIiRMT0NBTFwiIFwiJFJFTU9URVwiIiksCisJLyoqCisJICogU2VlOiA8YSBocmVmPQorCSAqICJodHRwczovL3d3dy5zY29vdGVyc29mdHdhcmUuY29tL3Y0aGVscC9pbmRleC5odG1sP2NvbW1hbmRfbGluZV9yZWZlcmVuY2UuaHRtbCI+aHR0cHM6Ly93d3cuc2Nvb3RlcnNvZnR3YXJlLmNvbS92NGhlbHAvaW5kZXguaHRtbD9jb21tYW5kX2xpbmVfcmVmZXJlbmNlLmh0bWw8L2E+CisJICovCisJYmMzKCJiY29tcGFyZSIsIGJjKSwKKwkvKioKKwkgKiBTZWU6IDxhIGhyZWY9CisJICogImh0dHBzOi8vd3d3LmRldmFydC5jb20vY29kZWNvbXBhcmUvZG9jcy9pbmRleC5odG1sP2NvbXBhcmluZ192aWFfY29tbWFuZF9saW5lLmh0bSI+aHR0cHM6Ly93d3cuZGV2YXJ0LmNvbS9jb2RlY29tcGFyZS9kb2NzL2luZGV4Lmh0bWw/Y29tcGFyaW5nX3ZpYV9jb21tYW5kX2xpbmUuaHRtPC9hPgorCSAqLworCWNvZGVjb21wYXJlKCJDb2RlQ29tcGFyZSIsICJcIiRMT0NBTFwiIFwiJFJFTU9URVwiIiksCisJLyoqCisJICogU2VlOiA8YSBocmVmPQorCSAqICJodHRwczovL3d3dy5kZWx0YXdhbGtlci5jb20vaW50ZWdyYXRlL2NvbW1hbmQtbGluZSI+aHR0cHM6Ly93d3cuZGVsdGF3YWxrZXIuY29tL2ludGVncmF0ZS9jb21tYW5kLWxpbmU8L2E+CisJICovCisJZGVsdGF3YWxrZXIoIkRlbHRhV2Fsa2VyIiwgIlwiJExPQ0FMXCIgXCIkUkVNT1RFXCIiKSwKKwkvKioKKwkgKiBTZWU6IDxhIGhyZWY9CisJICogImh0dHBzOi8vc291cmNlZ2Vhci5jb20vZGlmZm1lcmdlL3dlYmhlbHAvc2VjX19jbGFyZ3NfX2RpZmYuaHRtbCI+aHR0cHM6Ly9zb3VyY2VnZWFyLmNvbS9kaWZmbWVyZ2Uvd2ViaGVscC9zZWNfX2NsYXJnc19fZGlmZi5odG1sPC9hPgorCSAqLworCWRpZmZtZXJnZSgiZGlmZm1lcmdlIiwgIlwiJExPQ0FMXCIgXCIkUkVNT1RFXCIiKSwKKwkvKioKKwkgKiBTZWU6IDxhIGhyZWY9CisJICogImh0dHA6Ly9kaWZmdXNlLnNvdXJjZWZvcmdlLm5ldC9tYW51YWwuaHRtbCNpbnRyb2R1Y3Rpb24tdXNhZ2UiPmh0dHA6Ly9kaWZmdXNlLnNvdXJjZWZvcmdlLm5ldC9tYW51YWwuaHRtbCNpbnRyb2R1Y3Rpb24tdXNhZ2U8L2E+CisJICovCisJZGlmZnVzZSgiZGlmZnVzZSIsICJcIiRMT0NBTFwiIFwiJFJFTU9URVwiIiksCisJLyoqCisJICogU2VlOiA8YSBocmVmPQorCSAqICJodHRwOi8vd3d3LmVsbGllY29tcHV0aW5nLmNvbS9lbi9PbmxpbmVEb2MvZWNtZXJnZV9lbi80NDIwNTE2Ny5hc3AiPmh0dHA6Ly93d3cuZWxsaWVjb21wdXRpbmcuY29tL2VuL09ubGluZURvYy9lY21lcmdlX2VuLzQ0MjA1MTY3LmFzcDwvYT4KKwkgKi8KKwllY21lcmdlKCJlY21lcmdlIiwgIi0tZGVmYXVsdCAtLW1vZGU9ZGlmZjIgXCIkTE9DQUxcIiBcIiRSRU1PVEVcIiIpLAorCS8qKgorCSAqIFNlZTogPGEgaHJlZj0KKwkgKiAiaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9lbWFjcy9tYW51YWwvaHRtbF9ub2RlL2VtYWNzL092ZXJ2aWV3LW9mLUVtZXJnZS5odG1sIj5odHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2VtYWNzL21hbnVhbC9odG1sX25vZGUvZW1hY3MvT3ZlcnZpZXctb2YtRW1lcmdlLmh0bWw8L2E+CisJICovCisJZW1lcmdlKCJlbWFjcyIsICItZiBlbWVyZ2UtZmlsZXMtY29tbWFuZCBcIiRMT0NBTFwiIFwiJFJFTU9URVwiIiksCisJLyoqCisJICogU2VlOiA8YSBocmVmPQorCSAqICJodHRwczovL3d3dy5wcmVzdG9zb2Z0LmNvbS9wcy5hc3A/cGFnZT1odG1saGVscC9lZHAvY29tbWFuZF9saW5lX29wdGlvbnMiPmh0dHBzOi8vd3d3LnByZXN0b3NvZnQuY29tL3BzLmFzcD9wYWdlPWh0bWxoZWxwL2VkcC9jb21tYW5kX2xpbmVfb3B0aW9uczwvYT4KKwkgKi8KKwlleGFtZGlmZigiRXhhbURpZmYiLCAiXCIkTE9DQUxcIiBcIiRSRU1PVEVcIiAtbmgiKSwKKwkvKioKKwkgKiBTZWU6IDxhIGhyZWY9CisJICogImh0dHBzOi8vd3d3Lmd1aWZmeS5jb20vaGVscC9HdWlmZnlIZWxwL0d1aWZmeUNtZC5odG1sIj5odHRwczovL3d3dy5ndWlmZnkuY29tL2hlbHAvR3VpZmZ5SGVscC9HdWlmZnlDbWQuaHRtbDwvYT4KKwkgKi8KKwlndWlmZnkoImd1aWZmeSIsICJcIiRMT0NBTFwiIFwiJFJFTU9URVwiIiksCisJLyoqCisJICogU2VlOiA8YSBocmVmPQorCSAqICJodHRwOi8vdmltZG9jLnNvdXJjZWZvcmdlLm5ldC9odG1sZG9jL2RpZmYuaHRtbCI+aHR0cDovL3ZpbWRvYy5zb3VyY2Vmb3JnZS5uZXQvaHRtbGRvYy9kaWZmLmh0bWw8L2E+CisJICovCisJZ3ZpbWRpZmYoImd2aWV3ZGlmZiIsICJcIiRMT0NBTFwiIFwiJFJFTU9URVwiIiksCisJLyoqCisJICogU2VlOiA8YSBocmVmPQorCSAqICJodHRwOi8vdmltZG9jLnNvdXJjZWZvcmdlLm5ldC9odG1sZG9jL2RpZmYuaHRtbCI+aHR0cDovL3ZpbWRvYy5zb3VyY2Vmb3JnZS5uZXQvaHRtbGRvYy9kaWZmLmh0bWw8L2E+CisJICovCisJZ3ZpbWRpZmYyKGd2aW1kaWZmKSwKKwkvKioKKwkgKiBTZWU6IDxhIGhyZWY9CisJICogImh0dHA6Ly92aW1kb2Muc291cmNlZm9yZ2UubmV0L2h0bWxkb2MvZGlmZi5odG1sIj5odHRwOi8vdmltZG9jLnNvdXJjZWZvcmdlLm5ldC9odG1sZG9jL2RpZmYuaHRtbDwvYT4KKwkgKi8KKwlndmltZGlmZjMoZ3ZpbWRpZmYpLAorCS8qKgorCSAqIFNlZTogPGEgaHJlZj0KKwkgKiAiaHR0cDovL2tkaWZmMy5zb3VyY2Vmb3JnZS5uZXQvZG9jL2RvY3VtZW50YXRpb24uaHRtbCI+aHR0cDovL2tkaWZmMy5zb3VyY2Vmb3JnZS5uZXQvZG9jL2RvY3VtZW50YXRpb24uaHRtbDwvYT4KKwkgKi8KKwlrZGlmZjMoImtkaWZmMyIsCisJCQkiLS1MMSBcIiRNRVJHRUQgKEEpXCIgLS1MMiBcIiRNRVJHRUQgKEIpXCIgXCIkTE9DQUxcIiBcIiRSRU1PVEVcIiIpLAorCS8qKgorCSAqIFNlZTogPGEgaHJlZj0KKwkgKiAiaHR0cHM6Ly9kb2NzLmtkZS5vcmcvdHJ1bms1L2VuL2tkZXNkay9rb21wYXJlL2NvbW1hbmRsaW5lLW9wdGlvbnMuaHRtbCI+aHR0cHM6Ly9kb2NzLmtkZS5vcmcvdHJ1bms1L2VuL2tkZXNkay9rb21wYXJlL2NvbW1hbmRsaW5lLW9wdGlvbnMuaHRtbDwvYT4KKwkgKi8KKwlrb21wYXJlKCJrb21wYXJlIiwgIlwiJExPQ0FMXCIgXCIkUkVNT1RFXCIiKSwKKwkvKioKKwkgKiBTZWU6IDxhIGhyZWY9CisJICogInR0cDovL21lbGRtZXJnZS5vcmcvaGVscC9maWxlLW1vZGUuaHRtbCI+aHR0cDovL21lbGRtZXJnZS5vcmcvaGVscC9maWxlLW1vZGUuaHRtbDwvYT4KKwkgKi8KKwltZWxkKCJtZWxkIiwgIlwiJExPQ0FMXCIgXCIkUkVNT1RFXCIiKSwKKwkvKioKKwkgKiBTZWU6IDxhIGhyZWY9CisJICogImh0dHA6Ly93d3cubWFucGFnZXouY29tL21hbi8xL29wZW5kaWZmLyI+aHR0cDovL3d3dy5tYW5wYWdlei5jb20vbWFuLzEvb3BlbmRpZmYvPC9hPgorCSAqIDxwPgorCSAqIEhpbnQ6IGNoZWNrIHRoZSAnIHwgY2F0JyBmb3IgdGhlIGNhbGwKKwkgKiA8L3A+CisJICovCisJb3BlbmRpZmYoIm9wZW5kaWZmIiwgIlwiJExPQ0FMXCIgXCIkUkVNT1RFXCIiKSwKKwkvKioKKwkgKiBTZWU6IDxhIGhyZWY9CisJICogImh0dHBzOi8vd3d3LnBlcmZvcmNlLmNvbS9tYW51YWxzL3YxNS4xL2NtZHJlZi9wNF9tZXJnZS5odG1sIj5odHRwczovL3d3dy5wZXJmb3JjZS5jb20vbWFudWFscy92MTUuMS9jbWRyZWYvcDRfbWVyZ2UuaHRtbDwvYT4KKwkgKi8KKwlwNG1lcmdlKCJwNG1lcmdlIiwgIlwiJExPQ0FMXCIgXCIkUkVNT1RFXCIiKSwKKwkvKioKKwkgKiBTZWU6IDxhIGhyZWY9CisJICogImh0dHA6Ly9saW51eC5tYXRoLnRpZnIucmVzLmluL21hbnVhbHMvbWFuL3RrZGlmZi5odG1sIj5odHRwOi8vbGludXgubWF0aC50aWZyLnJlcy5pbi9tYW51YWxzL21hbi90a2RpZmYuaHRtbDwvYT4KKwkgKi8KKwl0a2RpZmYoInRrZGlmZiIsICJcIiRMT0NBTFwiIFwiJFJFTU9URVwiIiksCisJLyoqCisJICogU2VlOiA8YSBocmVmPQorCSAqICJodHRwOi8vdmltZG9jLnNvdXJjZWZvcmdlLm5ldC9odG1sZG9jL2RpZmYuaHRtbCI+aHR0cDovL3ZpbWRvYy5zb3VyY2Vmb3JnZS5uZXQvaHRtbGRvYy9kaWZmLmh0bWw8L2E+CisJICovCisJdmltZGlmZigidmlld2RpZmYiLCBndmltZGlmZiksCisJLyoqCisJICogU2VlOiA8YSBocmVmPQorCSAqICJodHRwOi8vdmltZG9jLnNvdXJjZWZvcmdlLm5ldC9odG1sZG9jL2RpZmYuaHRtbCI+aHR0cDovL3ZpbWRvYy5zb3VyY2Vmb3JnZS5uZXQvaHRtbGRvYy9kaWZmLmh0bWw8L2E+CisJICovCisJdmltZGlmZjIodmltZGlmZiksCisJLyoqCisJICogU2VlOiA8YSBocmVmPQorCSAqICJodHRwOi8vdmltZG9jLnNvdXJjZWZvcmdlLm5ldC9odG1sZG9jL2RpZmYuaHRtbCI+aHR0cDovL3ZpbWRvYy5zb3VyY2Vmb3JnZS5uZXQvaHRtbGRvYy9kaWZmLmh0bWw8L2E+CisJICovCisJdmltZGlmZjModmltZGlmZiksCisJLyoqCisJICogU2VlOiA8YSBocmVmPQorCSAqICJodHRwOi8vbWFudWFsLndpbm1lcmdlLm9yZy9Db21tYW5kX2xpbmUuaHRtbCI+aHR0cDovL21hbnVhbC53aW5tZXJnZS5vcmcvQ29tbWFuZF9saW5lLmh0bWw8L2E+CisJICogPHA+CisJICogSGludDogY2hlY2sgaG93ICdtZXJnZXRvb2xfZmluZF93aW4zMl9jbWQgIldpbk1lcmdlVS5leGUiICJXaW5NZXJnZSInCisJICogd29ya3MKKwkgKiA8L3A+CisJICovCisJd2lubWVyZ2UoIldpbk1lcmdlVSIsICItdSAtZSBcIiRMT0NBTFwiIFwiJFJFTU9URVwiIiksCisJLyoqCisJICogU2VlOiA8YSBocmVmPQorCSAqICJodHRwOi8vZnVyaXVzLmNhL3h4ZGlmZi9kb2MveHhkaWZmLWRvYy5odG1sIj5odHRwOi8vZnVyaXVzLmNhL3h4ZGlmZi9kb2MveHhkaWZmLWRvYy5odG1sPC9hPgorCSAqLworCXh4ZGlmZigieHhkaWZmIiwKKwkJCSItUiAnQWNjZWwuU2VhcmNoOiBcIkN0cmwrRlwiJyAtUiAnQWNjZWwuU2VhcmNoRm9yd2FyZDogXCJDdHJsK0dcIicgXCIkTE9DQUxcIiBcIiRSRU1PVEVcIiIpOworCisJQ29tbWFuZExpbmVEaWZmVG9vbChTdHJpbmcgcGF0aCwgU3RyaW5nIHBhcmFtZXRlcnMpIHsKKwkJdGhpcy5wYXRoID0gcGF0aDsKKwkJdGhpcy5wYXJhbWV0ZXJzID0gcGFyYW1ldGVyczsKKwl9CisKKwlDb21tYW5kTGluZURpZmZUb29sKENvbW1hbmRMaW5lRGlmZlRvb2wgZnJvbSkgeworCQl0aGlzKGZyb20uZ2V0UGF0aCgpLCBmcm9tLmdldFBhcmFtZXRlcnMoKSk7CisJfQorCisJQ29tbWFuZExpbmVEaWZmVG9vbChTdHJpbmcgcGF0aCwgQ29tbWFuZExpbmVEaWZmVG9vbCBmcm9tKSB7CisJCXRoaXMocGF0aCwgZnJvbS5nZXRQYXJhbWV0ZXJzKCkpOworCX0KKworCXByaXZhdGUgZmluYWwgU3RyaW5nIHBhdGg7CisKKwlwcml2YXRlIGZpbmFsIFN0cmluZyBwYXJhbWV0ZXJzOworCisJLyoqCisJICogQHJldHVybiBwYXRoCisJICovCisJcHVibGljIFN0cmluZyBnZXRQYXRoKCkgeworCQlyZXR1cm4gcGF0aDsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIHBhcmFtZXRlcnMgYXMgb25lIHN0cmluZworCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0UGFyYW1ldGVycygpIHsKKwkJcmV0dXJuIHBhcmFtZXRlcnM7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL2RpZmZtZXJnZXRvb2wvRGlmZlRvb2xDb25maWcuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvZGlmZm1lcmdldG9vbC9EaWZmVG9vbENvbmZpZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1MWY2MzQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL2RpZmZtZXJnZXRvb2wvRGlmZlRvb2xDb25maWcuamF2YQpAQCAtMCwwICsxLDExNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOC0yMDIxLCBBbmRyZSBCb3NzZXJ0IDxhbmRyZS5ib3NzZXJ0QHNpZW1lbnMuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLmRpZmZtZXJnZXRvb2w7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19ESUZGVE9PTF9TRUNUSU9OOworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWdDb25zdGFudHMuQ09ORklHX0RJRkZfU0VDVElPTjsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19LRVlfQ01EOworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWdDb25zdGFudHMuQ09ORklHX0tFWV9HVUlUT09MOworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWdDb25zdGFudHMuQ09ORklHX0tFWV9QQVRIOworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWdDb25zdGFudHMuQ09ORklHX0tFWV9QUk9NUFQ7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbmZpZ0NvbnN0YW50cy5DT05GSUdfS0VZX1RPT0w7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbmZpZ0NvbnN0YW50cy5DT05GSUdfS0VZX1RSVVNUX0VYSVRfQ09ERTsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbmZpZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWcuU2VjdGlvblBhcnNlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5pbnRlcm5hbC5Cb29sZWFuVHJpU3RhdGU7CisKKy8qKgorICogS2VlcHMgdHJhY2sgb2YgZGlmZnRvb2wgcmVsYXRlZCBjb25maWd1cmF0aW9uIG9wdGlvbnMuCisgKi8KK3B1YmxpYyBjbGFzcyBEaWZmVG9vbENvbmZpZyB7CisKKwkvKiogS2V5IGZvciB7QGxpbmsgQ29uZmlnI2dldChTZWN0aW9uUGFyc2VyKX0uICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBDb25maWcuU2VjdGlvblBhcnNlcjxEaWZmVG9vbENvbmZpZz4gS0VZID0gRGlmZlRvb2xDb25maWc6Om5ldzsKKworCXByaXZhdGUgZmluYWwgU3RyaW5nIHRvb2xOYW1lOworCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZ3VpVG9vbE5hbWU7CisKKwlwcml2YXRlIGZpbmFsIGJvb2xlYW4gcHJvbXB0OworCisJcHJpdmF0ZSBmaW5hbCBCb29sZWFuVHJpU3RhdGUgdHJ1c3RFeGl0Q29kZTsKKworCXByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgRXh0ZXJuYWxEaWZmVG9vbD4gdG9vbHM7CisKKwlwcml2YXRlIERpZmZUb29sQ29uZmlnKENvbmZpZyByYykgeworCQl0b29sTmFtZSA9IHJjLmdldFN0cmluZyhDT05GSUdfRElGRl9TRUNUSU9OLCBudWxsLCBDT05GSUdfS0VZX1RPT0wpOworCQlndWlUb29sTmFtZSA9IHJjLmdldFN0cmluZyhDT05GSUdfRElGRl9TRUNUSU9OLCBudWxsLAorCQkJCUNPTkZJR19LRVlfR1VJVE9PTCk7CisJCXByb21wdCA9IHJjLmdldEJvb2xlYW4oQ09ORklHX0RJRkZUT09MX1NFQ1RJT04sIENPTkZJR19LRVlfUFJPTVBULAorCQkJCXRydWUpOworCQlTdHJpbmcgdHJ1c3RTdHIgPSByYy5nZXRTdHJpbmcoQ09ORklHX0RJRkZUT09MX1NFQ1RJT04sIG51bGwsCisJCQkJQ09ORklHX0tFWV9UUlVTVF9FWElUX0NPREUpOworCQlpZiAodHJ1c3RTdHIgIT0gbnVsbCkgeworCQkJdHJ1c3RFeGl0Q29kZSA9IEJvb2xlYW4ucGFyc2VCb29sZWFuKHRydXN0U3RyKQorCQkJCQk/IEJvb2xlYW5UcmlTdGF0ZS5UUlVFCisJCQkJCTogQm9vbGVhblRyaVN0YXRlLkZBTFNFOworCQl9IGVsc2UgeworCQkJdHJ1c3RFeGl0Q29kZSA9IEJvb2xlYW5UcmlTdGF0ZS5VTlNFVDsKKwkJfQorCQl0b29scyA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJU2V0PFN0cmluZz4gc3Vic2VjdGlvbnMgPSByYy5nZXRTdWJzZWN0aW9ucyhDT05GSUdfRElGRlRPT0xfU0VDVElPTik7CisJCWZvciAoU3RyaW5nIG5hbWUgOiBzdWJzZWN0aW9ucykgeworCQkJU3RyaW5nIGNtZCA9IHJjLmdldFN0cmluZyhDT05GSUdfRElGRlRPT0xfU0VDVElPTiwgbmFtZSwKKwkJCQkJQ09ORklHX0tFWV9DTUQpOworCQkJU3RyaW5nIHBhdGggPSByYy5nZXRTdHJpbmcoQ09ORklHX0RJRkZUT09MX1NFQ1RJT04sIG5hbWUsCisJCQkJCUNPTkZJR19LRVlfUEFUSCk7CisJCQlpZiAoKGNtZCAhPSBudWxsKSB8fCAocGF0aCAhPSBudWxsKSkgeworCQkJCXRvb2xzLnB1dChuYW1lLCBuZXcgVXNlckRlZmluZWREaWZmVG9vbChuYW1lLCBwYXRoLCBjbWQpKTsKKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIEByZXR1cm4gdGhlIGRlZmF1bHQgZGlmZiB0b29sIG5hbWUgKGRpZmYudG9vbCkKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRUb29sTmFtZSgpIHsKKwkJcmV0dXJuIHRvb2xOYW1lOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gdGhlIGRlZmF1bHQgR1VJIGRpZmYgdG9vbCBuYW1lIChkaWZmLmd1aXRvb2wpCisJICovCisJcHVibGljIFN0cmluZyBnZXREZWZhdWx0R3VpVG9vbE5hbWUoKSB7CisJCXJldHVybiBndWlUb29sTmFtZTsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBkaWZmIHRvb2wgInByb21wdCIgb3B0aW9uIChkaWZmdG9vbC5wcm9tcHQpCisJICovCisJcHVibGljIGJvb2xlYW4gaXNQcm9tcHQoKSB7CisJCXJldHVybiBwcm9tcHQ7CisJfQorCisJLyoqCisJICogQHJldHVybiB0aGUgZGlmZiB0b29sICJ0cnVzdCBleGl0IGNvZGUiIG9wdGlvbiAoZGlmZnRvb2wudHJ1c3RFeGl0Q29kZSkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc1RydXN0RXhpdENvZGUoKSB7CisJCXJldHVybiB0cnVzdEV4aXRDb2RlID09IEJvb2xlYW5UcmlTdGF0ZS5UUlVFOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gdGhlIHRvb2xzIG1hcAorCSAqLworCXB1YmxpYyBNYXA8U3RyaW5nLCBFeHRlcm5hbERpZmZUb29sPiBnZXRUb29scygpIHsKKwkJcmV0dXJuIHRvb2xzOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gdGhlIHRvb2wgbmFtZXMKKwkgKi8KKwlwdWJsaWMgU2V0PFN0cmluZz4gZ2V0VG9vbE5hbWVzKCkgeworCQlyZXR1cm4gdG9vbHMua2V5U2V0KCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9kaWZmbWVyZ2V0b29sL0RpZmZUb29scy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9kaWZmbWVyZ2V0b29sL0RpZmZUb29scy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5NzI5YTQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL2RpZmZtZXJnZXRvb2wvRGlmZlRvb2xzLmphdmEKQEAgLTAsMCArMSwxNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTgtMjAyMSwgQW5kcmUgQm9zc2VydCA8YW5kcmUuYm9zc2VydEBzaWVtZW5zLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5kaWZmbWVyZ2V0b29sOworCitpbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuaW50ZXJuYWwuQm9vbGVhblRyaVN0YXRlOworCisvKioKKyAqIE1hbmFnZXMgZGlmZiB0b29scy4KKyAqLworcHVibGljIGNsYXNzIERpZmZUb29scyB7CisKKwlwcml2YXRlIGZpbmFsIERpZmZUb29sQ29uZmlnIGNvbmZpZzsKKworCXByaXZhdGUgTWFwPFN0cmluZywgRXh0ZXJuYWxEaWZmVG9vbD4gcHJlZGVmaW5lZFRvb2xzOworCisJcHJpdmF0ZSBNYXA8U3RyaW5nLCBFeHRlcm5hbERpZmZUb29sPiB1c2VyRGVmaW5lZFRvb2xzOworCisJLyoqCisJICogQ3JlYXRlcyB0aGUgZXh0ZXJuYWwgZGlmZi10b29scyBtYW5hZ2VyIGZvciBnaXZlbiByZXBvc2l0b3J5LgorCSAqCisJICogQHBhcmFtIHJlcG8KKwkgKiAgICAgICAgICAgIHRoZSByZXBvc2l0b3J5CisJICovCisJcHVibGljIERpZmZUb29scyhSZXBvc2l0b3J5IHJlcG8pIHsKKwkJY29uZmlnID0gcmVwby5nZXRDb25maWcoKS5nZXQoRGlmZlRvb2xDb25maWcuS0VZKTsKKwkJc2V0dXBQcmVkZWZpbmVkVG9vbHMoKTsKKwkJc2V0dXBVc2VyRGVmaW5lZFRvb2xzKCk7CisJfQorCisJLyoqCisJICogQ29tcGFyZSB0d28gdmVyc2lvbnMgb2YgYSBmaWxlLgorCSAqCisJICogQHBhcmFtIG5ld1BhdGgKKwkgKiAgICAgICAgICAgIHRoZSBuZXcgZmlsZSBwYXRoCisJICogQHBhcmFtIG9sZFBhdGgKKwkgKiAgICAgICAgICAgIHRoZSBvbGQgZmlsZSBwYXRoCisJICogQHBhcmFtIG5ld0lkCisJICogICAgICAgICAgICB0aGUgbmV3IG9iamVjdCBJRAorCSAqIEBwYXJhbSBvbGRJZAorCSAqICAgICAgICAgICAgdGhlIG9sZCBvYmplY3QgSUQKKwkgKiBAcGFyYW0gdG9vbE5hbWUKKwkgKiAgICAgICAgICAgIHRoZSBzZWxlY3RlZCB0b29sIG5hbWUgKGNhbiBiZSBudWxsKQorCSAqIEBwYXJhbSBwcm9tcHQKKwkgKiAgICAgICAgICAgIHRoZSBwcm9tcHQgb3B0aW9uCisJICogQHBhcmFtIGd1aQorCSAqICAgICAgICAgICAgdGhlIEdVSSBvcHRpb24KKwkgKiBAcGFyYW0gdHJ1c3RFeGl0Q29kZQorCSAqICAgICAgICAgICAgdGhlICJ0cnVzdCBleGl0IGNvZGUiIG9wdGlvbgorCSAqIEByZXR1cm4gdGhlIHJldHVybiBjb2RlIGZyb20gZXhlY3V0ZWQgdG9vbAorCSAqLworCXB1YmxpYyBpbnQgY29tcGFyZShTdHJpbmcgbmV3UGF0aCwgU3RyaW5nIG9sZFBhdGgsIFN0cmluZyBuZXdJZCwKKwkJCVN0cmluZyBvbGRJZCwgU3RyaW5nIHRvb2xOYW1lLCBCb29sZWFuVHJpU3RhdGUgcHJvbXB0LAorCQkJQm9vbGVhblRyaVN0YXRlIGd1aSwgQm9vbGVhblRyaVN0YXRlIHRydXN0RXhpdENvZGUpIHsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoqCisJICogQHJldHVybiB0aGUgdG9vbCBuYW1lcworCSAqLworCXB1YmxpYyBTZXQ8U3RyaW5nPiBnZXRUb29sTmFtZXMoKSB7CisJCXJldHVybiBjb25maWcuZ2V0VG9vbE5hbWVzKCk7CisJfQorCisJLyoqCisJICogQHJldHVybiB0aGUgdXNlciBkZWZpbmVkIHRvb2xzCisJICovCisJcHVibGljIE1hcDxTdHJpbmcsIEV4dGVybmFsRGlmZlRvb2w+IGdldFVzZXJEZWZpbmVkVG9vbHMoKSB7CisJCXJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAodXNlckRlZmluZWRUb29scyk7CisJfQorCisJLyoqCisJICogQHJldHVybiB0aGUgYXZhaWxhYmxlIHByZWRlZmluZWQgdG9vbHMKKwkgKi8KKwlwdWJsaWMgTWFwPFN0cmluZywgRXh0ZXJuYWxEaWZmVG9vbD4gZ2V0QXZhaWxhYmxlVG9vbHMoKSB7CisJCXJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAocHJlZGVmaW5lZFRvb2xzKTsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBOT1QgYXZhaWxhYmxlIHByZWRlZmluZWQgdG9vbHMKKwkgKi8KKwlwdWJsaWMgTWFwPFN0cmluZywgRXh0ZXJuYWxEaWZmVG9vbD4gZ2V0Tm90QXZhaWxhYmxlVG9vbHMoKSB7CisJCXJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAobmV3IFRyZWVNYXA8PigpKTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gZ3VpCisJICogICAgICAgICAgICB1c2UgdGhlIGRpZmYuZ3VpdG9vbCBzZXR0aW5nID8KKwkgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IHRvb2wgbmFtZQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFRvb2xOYW1lKEJvb2xlYW5UcmlTdGF0ZSBndWkpIHsKKwkJcmV0dXJuIGd1aSAhPSBCb29sZWFuVHJpU3RhdGUuVU5TRVQgPyAibXlfZ3VpX3Rvb2wiIC8vJE5PTi1OTFMtMSQKKwkJCQk6ICJteV9kZWZhdWx0X3Rvb2xuYW1lIjsgLy8kTk9OLU5MUy0xJAorCX0KKworCS8qKgorCSAqIEByZXR1cm4gaXMgaW50ZXJhY3RpdmUgKGNvbmZpZyBwcm9tcHQgZW5hYmxlZCkgPworCSAqLworCXB1YmxpYyBib29sZWFuIGlzSW50ZXJhY3RpdmUoKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlwcml2YXRlIHZvaWQgc2V0dXBQcmVkZWZpbmVkVG9vbHMoKSB7CisJCXByZWRlZmluZWRUb29scyA9IG5ldyBUcmVlTWFwPD4oKTsKKwkJZm9yIChDb21tYW5kTGluZURpZmZUb29sIHRvb2wgOiBDb21tYW5kTGluZURpZmZUb29sLnZhbHVlcygpKSB7CisJCQlwcmVkZWZpbmVkVG9vbHMucHV0KHRvb2wubmFtZSgpLCBuZXcgUHJlRGVmaW5lZERpZmZUb29sKHRvb2wpKTsKKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBzZXR1cFVzZXJEZWZpbmVkVG9vbHMoKSB7CisJCXVzZXJEZWZpbmVkVG9vbHMgPSBuZXcgVHJlZU1hcDw+KCk7CisJCU1hcDxTdHJpbmcsIEV4dGVybmFsRGlmZlRvb2w+IHVzZXJUb29scyA9IGNvbmZpZy5nZXRUb29scygpOworCQlmb3IgKFN0cmluZyBuYW1lIDogdXNlclRvb2xzLmtleVNldCgpKSB7CisJCQlFeHRlcm5hbERpZmZUb29sIHVzZXJUb29sID0gdXNlclRvb2xzLmdldChuYW1lKTsKKwkJCS8vIGlmIGRpZmZ0b29sLjxuYW1lPi5jbWQgaXMgZGVmaW5lZCB3ZSBoYXZlIHVzZXIgZGVmaW5lZCB0b29sCisJCQlpZiAodXNlclRvb2wuZ2V0Q29tbWFuZCgpICE9IG51bGwpIHsKKwkJCQl1c2VyRGVmaW5lZFRvb2xzLnB1dChuYW1lLCB1c2VyVG9vbCk7CisJCQl9IGVsc2UgaWYgKHVzZXJUb29sLmdldFBhdGgoKSAhPSBudWxsKSB7CisJCQkJLy8gaWYgZGlmZnRvb2wuPG5hbWU+LnBhdGggaXMgZGVmaW5lZCB3ZSBqdXN0IG92ZXJsb2FkIHRoZSBwYXRoCisJCQkJLy8gb2YgcHJlZGVmaW5lZCB0b29sCisJCQkJUHJlRGVmaW5lZERpZmZUb29sIHByZWRlZlRvb2wgPSAoUHJlRGVmaW5lZERpZmZUb29sKSBwcmVkZWZpbmVkVG9vbHMKKwkJCQkJCS5nZXQobmFtZSk7CisJCQkJaWYgKHByZWRlZlRvb2wgIT0gbnVsbCkgeworCQkJCQlwcmVkZWZUb29sLnNldFBhdGgodXNlclRvb2wuZ2V0UGF0aCgpKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvZGlmZm1lcmdldG9vbC9FeHRlcm5hbERpZmZUb29sLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL2RpZmZtZXJnZXRvb2wvRXh0ZXJuYWxEaWZmVG9vbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyZDdlODIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL2RpZmZtZXJnZXRvb2wvRXh0ZXJuYWxEaWZmVG9vbC5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTgtMjAyMSwgQW5kcmUgQm9zc2VydCA8YW5kcmUuYm9zc2VydEBzaWVtZW5zLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5kaWZmbWVyZ2V0b29sOworCisvKioKKyAqIFRoZSBleHRlcm5hbCB0b29sIGludGVyZmFjZS4KKyAqLworcHVibGljIGludGVyZmFjZSBFeHRlcm5hbERpZmZUb29sIHsKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIHRvb2wgbmFtZQorCSAqLworCVN0cmluZyBnZXROYW1lKCk7CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSB0b29sIHBhdGgKKwkgKi8KKwlTdHJpbmcgZ2V0UGF0aCgpOworCisJLyoqCisJICogQHJldHVybiB0aGUgdG9vbCBjb21tYW5kCisJICovCisJU3RyaW5nIGdldENvbW1hbmQoKTsKKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9kaWZmbWVyZ2V0b29sL1ByZURlZmluZWREaWZmVG9vbC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9kaWZmbWVyZ2V0b29sL1ByZURlZmluZWREaWZmVG9vbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjNjlmYjQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL2RpZmZtZXJnZXRvb2wvUHJlRGVmaW5lZERpZmZUb29sLmphdmEKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOC0yMDIxLCBBbmRyZSBCb3NzZXJ0IDxhbmRyZS5ib3NzZXJ0QHNpZW1lbnMuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLmRpZmZtZXJnZXRvb2w7CisKKy8qKgorICogVGhlIHByZS1kZWZpbmVkIGRpZmYgdG9vbC4KKyAqLworcHVibGljIGNsYXNzIFByZURlZmluZWREaWZmVG9vbCBleHRlbmRzIFVzZXJEZWZpbmVkRGlmZlRvb2wgeworCisJLyoqCisJICogQ3JlYXRlIGEgcHJlLWRlZmluZWQgZGlmZiB0b29sCisJICoKKwkgKiBAcGFyYW0gbmFtZQorCSAqICAgICAgICAgICAgdGhlIG5hbWUKKwkgKiBAcGFyYW0gcGF0aAorCSAqICAgICAgICAgICAgdGhlIHBhdGgKKwkgKiBAcGFyYW0gcGFyYW1ldGVycworCSAqICAgICAgICAgICAgdGhlIHRvb2wgcGFyYW1ldGVycyBhcyBvbmUgc3RyaW5nIHRoYXQgaXMgdXNlZCB0b2dldGhlciB3aXRoCisJICogICAgICAgICAgICBwYXRoIGFzIGNvbW1hbmQKKwkgKi8KKwlwdWJsaWMgUHJlRGVmaW5lZERpZmZUb29sKFN0cmluZyBuYW1lLCBTdHJpbmcgcGF0aCwgU3RyaW5nIHBhcmFtZXRlcnMpIHsKKwkJc3VwZXIobmFtZSwgcGF0aCwgcGFyYW1ldGVycyk7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyB0aGUgcHJlLWRlZmluZWQgZGlmZiB0b29sCisJICoKKwkgKiBAcGFyYW0gdG9vbAorCSAqICAgICAgICAgICAgdGhlIGNvbW1hbmQgbGluZSBkaWZmIHRvb2wKKwkgKgorCSAqLworCXB1YmxpYyBQcmVEZWZpbmVkRGlmZlRvb2woQ29tbWFuZExpbmVEaWZmVG9vbCB0b29sKSB7CisJCXRoaXModG9vbC5uYW1lKCksIHRvb2wuZ2V0UGF0aCgpLCB0b29sLmdldFBhcmFtZXRlcnMoKSk7CisJfQorCisJLyoqCisJICogQHBhcmFtIHBhdGgKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRQYXRoKFN0cmluZyBwYXRoKSB7CisJCS8vIGhhbmRsaW5nIG9mIHNwYWNlcyBpbiBwYXRoCisJCWlmIChwYXRoLmNvbnRhaW5zKCIgIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJLy8gYWRkIHF1b3RlcyBiZWZvcmUgaWYgbmVlZGVkCisJCQlpZiAoIXBhdGguc3RhcnRzV2l0aCgiXCIiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJcGF0aCA9ICJcIiIgKyBwYXRoOyAvLyROT04tTkxTLTEkCisJCQl9CisJCQkvLyBhZGQgcXVvdGVzIGFmdGVyIGlmIG5lZWRlZAorCQkJaWYgKCFwYXRoLmVuZHNXaXRoKCJcIiIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQlwYXRoID0gcGF0aCArICJcIiI7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJfQorCQlzdXBlci5zZXRQYXRoKHBhdGgpOworCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKgorCSAqIEByZXR1cm4gdGhlIGNvbmNhdGVuYXRlZCBwYXRoIGFuZCBjb21tYW5kIG9mIHRoZSBwcmUtZGVmaW5lZCBkaWZmIHRvb2wKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldENvbW1hbmQoKSB7CisJCXJldHVybiBnZXRQYXRoKCkgKyAiICIgKyBzdXBlci5nZXRDb21tYW5kKCk7IC8vJE5PTi1OTFMtMSQKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvZGlmZm1lcmdldG9vbC9Vc2VyRGVmaW5lZERpZmZUb29sLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL2RpZmZtZXJnZXRvb2wvVXNlckRlZmluZWREaWZmVG9vbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxMjI5NmUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL2RpZmZtZXJnZXRvb2wvVXNlckRlZmluZWREaWZmVG9vbC5qYXZhCkBAIC0wLDAgKzEsMTE0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4LTIwMjEsIEFuZHJlIEJvc3NlcnQgPGFuZHJlLmJvc3NlcnRAc2llbWVucy5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuZGlmZm1lcmdldG9vbDsKKworLyoqCisgKiBUaGUgdXNlci1kZWZpbmVkIGRpZmYgdG9vbC4KKyAqLworcHVibGljIGNsYXNzIFVzZXJEZWZpbmVkRGlmZlRvb2wgaW1wbGVtZW50cyBFeHRlcm5hbERpZmZUb29sIHsKKworCS8qKgorCSAqIHRoZSBkaWZmIHRvb2wgbmFtZQorCSAqLworCXByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7CisKKwkvKioKKwkgKiB0aGUgZGlmZiB0b29sIHBhdGgKKwkgKi8KKwlwcml2YXRlIFN0cmluZyBwYXRoOworCisJLyoqCisJICogdGhlIGRpZmYgdG9vbCBjb21tYW5kCisJICovCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgY21kOworCisJLyoqCisJICogQ3JlYXRlcyB0aGUgZGlmZiB0b29sCisJICoKKwkgKiBAcGFyYW0gbmFtZQorCSAqICAgICAgICAgICAgdGhlIG5hbWUKKwkgKiBAcGFyYW0gcGF0aAorCSAqICAgICAgICAgICAgdGhlIHBhdGgKKwkgKiBAcGFyYW0gY21kCisJICogICAgICAgICAgICB0aGUgY29tbWFuZAorCSAqLworCXB1YmxpYyBVc2VyRGVmaW5lZERpZmZUb29sKFN0cmluZyBuYW1lLCBTdHJpbmcgcGF0aCwgU3RyaW5nIGNtZCkgeworCQl0aGlzLm5hbWUgPSBuYW1lOworCQl0aGlzLnBhdGggPSBwYXRoOworCQl0aGlzLmNtZCA9IGNtZDsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBkaWZmIHRvb2wgbmFtZQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJcmV0dXJuIG5hbWU7CisJfQorCisJLyoqCisJICogVGhlIHBhdGggb2YgdGhlIGRpZmYgdG9vbC4KKwkgKgorCSAqIDxwPgorCSAqIFRoZSBwYXRoIHRvIGEgcHJlLWRlZmluZWQgZXh0ZXJuYWwgZGlmZiB0b29sIGNhbiBiZSBvdmVycmlkZGVuIGJ5CisJICogc3BlY2lmeWluZyB7QGNvZGUgZGlmZnRvb2wuPHRvb2w+LnBhdGh9IGluIGEgY29uZmlndXJhdGlvbiBmaWxlLgorCSAqIDwvcD4KKwkgKiA8cD4KKwkgKiBGb3IgYSB1c2VyIGRlZmluZWQgZGlmZiB0b29sICh0aGF0IGRvZXMgbm90IG92ZXJyaWRlIGEgcHJlLWRlZmluZWQgZGlmZgorCSAqIHRvb2wpLCB0aGUgcGF0aCBpcyBpZ25vcmVkIHdoZW4gaW52b2tpbmcgdGhlIHRvb2wuCisJICogPC9wPgorCSAqCisJICogQHJldHVybiB0aGUgZGlmZiB0b29sIHBhdGgKKwkgKgorCSAqIEBzZWUgPGEgaHJlZj0KKwkgKiAgICAgICJodHRwczovL2dpdC1zY20uY29tL2RvY3MvZ2l0LWRpZmZ0b29sIj5odHRwczovL2dpdC1zY20uY29tL2RvY3MvZ2l0LWRpZmZ0b29sPC9hPgorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0UGF0aCgpIHsKKwkJcmV0dXJuIHBhdGg7CisJfQorCisJLyoqCisJICogVGhlIGNvbW1hbmQgb2YgdGhlIGRpZmYgdG9vbC4KKwkgKgorCSAqIDxwPgorCSAqIEEgcHJlLWRlZmluZWQgZXh0ZXJuYWwgZGlmZiB0b29sIGNhbiBiZSBvdmVycmlkZGVuIHVzaW5nIHRoZSB0b29scyBuYW1lCisJICogaW4gYSBjb25maWd1cmF0aW9uIGZpbGUuIFRoZSBvdmVyd3JpdHRlbiB0b29sIGlzIHRoZW4gYSB1c2VyIGRlZmluZWQgdG9vbAorCSAqIGFuZCB0aGUgY29tbWFuZCBvZiB0aGUgZGlmZiB0b29sIGlzIHNwZWNpZmllZCB3aXRoCisJICoge0Bjb2RlIGRpZmZ0b29sLjx0b29sPi5jbWR9LiBUaGlzIGNvbW1hbmQgbXVzdCB3b3JrIHdpdGhvdXQgcHJlcGVuZGluZworCSAqIHRoZSB2YWx1ZSBvZiB7QGxpbmsgI2dldFBhdGgoKX0gYW5kIGNhbiBzb21ldGltZXMgaW5jbHVkZSB0b29sCisJICogcGFyYW1ldGVycy4KKwkgKiA8L3A+CisJICoKKwkgKiBAcmV0dXJuIHRoZSBkaWZmIHRvb2wgY29tbWFuZAorCSAqCisJICogQHNlZSA8YSBocmVmPQorCSAqICAgICAgImh0dHBzOi8vZ2l0LXNjbS5jb20vZG9jcy9naXQtZGlmZnRvb2wiPmh0dHBzOi8vZ2l0LXNjbS5jb20vZG9jcy9naXQtZGlmZnRvb2w8L2E+CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRDb21tYW5kKCkgeworCQlyZXR1cm4gY21kOworCX0KKworCS8qKgorCSAqIE92ZXJyaWRlcyB0aGUgcGF0aCBmb3IgdGhlIGdpdmVuIHRvb2wuIEVxdWl2YWxlbnQgdG8gc2V0dGluZworCSAqIHtAY29kZSBkaWZmdG9vbC48dG9vbD4ucGF0aH0uCisJICoKKwkgKiBAcGFyYW0gcGF0aAorCSAqICAgICAgICAgICAgdGhlIG5ldyBkaWZmIHRvb2wgcGF0aAorCSAqCisJICogQHNlZSA8YSBocmVmPQorCSAqICAgICAgImh0dHBzOi8vZ2l0LXNjbS5jb20vZG9jcy9naXQtZGlmZnRvb2wiPmh0dHBzOi8vZ2l0LXNjbS5jb20vZG9jcy9naXQtZGlmZnRvb2w8L2E+CisJICovCisJcHVibGljIHZvaWQgc2V0UGF0aChTdHJpbmcgcGF0aCkgeworCQl0aGlzLnBhdGggPSBwYXRoOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzQmxvY2tDYWNoZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNCbG9ja0NhY2hlLmphdmEKaW5kZXggNTRjNTI3Yy4uYjMwZDUwOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNCbG9ja0NhY2hlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNCbG9ja0NhY2hlLmphdmEKQEAgLTEyLDYgKzEyLDEwIEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5kZnM7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudGltZS5EdXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRIYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNMb25nOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNSZWZlcmVuY2U7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY1JlZmVyZW5jZUFycmF5OwpAQCAtMTY2LDYgKzE3MCwxMiBAQCBwdWJsaWMgc3RhdGljIERmc0Jsb2NrQ2FjaGUgZ2V0SW5zdGFuY2UoKSB7CiAJLyoqIExpbWl0cyBvZiBjYWNoZSBob3QgY291bnQgcGVyIHBhY2sgZmlsZSBleHRlbnNpb24uICovCiAJcHJpdmF0ZSBmaW5hbCBpbnRbXSBjYWNoZUhvdExpbWl0cyA9IG5ldyBpbnRbUGFja0V4dC52YWx1ZXMoKS5sZW5ndGhdOwogCisJLyoqIENvbnN1bWVyIG9mIGxvYWRpbmcgYW5kIGV2aWN0aW9uIGV2ZW50cyBvZiBpbmRleGVzLiAqLworCXByaXZhdGUgZmluYWwgRGZzQmxvY2tDYWNoZUNvbmZpZy5JbmRleEV2ZW50Q29uc3VtZXIgaW5kZXhFdmVudENvbnN1bWVyOworCisJLyoqIFN0b3JlcyB0aW1lc3RhbXBzIG9mIHRoZSBsYXN0IGV2aWN0aW9uIG9mIGluZGV4ZXMuICovCisJcHJpdmF0ZSBmaW5hbCBNYXA8RXZpY3RLZXksIExvbmc+IGluZGV4RXZpY3Rpb25NYXAgPSBuZXcgQ29uY3VycmVudEhhc2hNYXA8PigpOworCiAJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCiAJcHJpdmF0ZSBEZnNCbG9ja0NhY2hlKERmc0Jsb2NrQ2FjaGVDb25maWcgY2ZnKSB7CiAJCXRhYmxlU2l6ZSA9IHRhYmxlU2l6ZShjZmcpOwpAQCAtMjEzLDYgKzIyMyw3IEBAIHByaXZhdGUgRGZzQmxvY2tDYWNoZShEZnNCbG9ja0NhY2hlQ29uZmlnIGNmZykgewogCQkJCWNhY2hlSG90TGltaXRzW2ldID0gRGZzQmxvY2tDYWNoZUNvbmZpZy5ERUZBVUxUX0NBQ0hFX0hPVF9NQVg7CiAJCQl9CiAJCX0KKwkJaW5kZXhFdmVudENvbnN1bWVyID0gY2ZnLmdldEluZGV4RXZlbnRDb25zdW1lcigpOwogCX0KIAogCWJvb2xlYW4gc2hvdWxkQ29weVRocm91Z2hDYWNoZShsb25nIGxlbmd0aCkgewpAQCAtNDYxLDYgKzQ3Miw3IEBAIHByaXZhdGUgdm9pZCByZXNlcnZlU3BhY2UobG9uZyByZXNlcnZlLCBEZnNTdHJlYW1LZXkga2V5KSB7CiAJCQkJCWxpdmUgLT0gZGVhZC5zaXplOwogCQkJCQlnZXRTdGF0KGxpdmVCeXRlcywgZGVhZC5rZXkpLmFkZEFuZEdldCgtZGVhZC5zaXplKTsKIAkJCQkJZ2V0U3RhdChzdGF0RXZpY3QsIGRlYWQua2V5KS5pbmNyZW1lbnRBbmRHZXQoKTsKKwkJCQkJcmVwb3J0SW5kZXhFdmljdGVkKGRlYWQpOwogCQkJCX0gd2hpbGUgKG1heEJ5dGVzIDwgbGl2ZSk7CiAJCQkJY2xvY2tIYW5kID0gcHJldjsKIAkJCX0KQEAgLTUxNSwxMSArNTI3LDEzIEBAIHZvaWQgcHV0KERmc0Jsb2NrIHYpIHsKIAk8VD4gUmVmPFQ+IGdldE9yTG9hZFJlZigKIAkJCURmc1N0cmVhbUtleSBrZXksIGxvbmcgcG9zaXRpb24sIFJlZkxvYWRlcjxUPiBsb2FkZXIpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24geworCQlsb25nIHN0YXJ0ID0gU3lzdGVtLm5hbm9UaW1lKCk7CiAJCWludCBzbG90ID0gc2xvdChrZXksIHBvc2l0aW9uKTsKIAkJSGFzaEVudHJ5IGUxID0gdGFibGUuZ2V0KHNsb3QpOwogCQlSZWY8VD4gcmVmID0gc2NhblJlZihlMSwga2V5LCBwb3NpdGlvbik7CiAJCWlmIChyZWYgIT0gbnVsbCkgewogCQkJZ2V0U3RhdChzdGF0SGl0LCBrZXkpLmluY3JlbWVudEFuZEdldCgpOworCQkJcmVwb3J0SW5kZXhSZXF1ZXN0ZWQocmVmLCB0cnVlIC8qIGNhY2hlSGl0ICovLCBzdGFydCk7CiAJCQlyZXR1cm4gcmVmOwogCQl9CiAKQEAgLTUzMiw2ICs1NDYsOCBAQCA8VD4gUmVmPFQ+IGdldE9yTG9hZFJlZigKIAkJCQlyZWYgPSBzY2FuUmVmKGUyLCBrZXksIHBvc2l0aW9uKTsKIAkJCQlpZiAocmVmICE9IG51bGwpIHsKIAkJCQkJZ2V0U3RhdChzdGF0SGl0LCBrZXkpLmluY3JlbWVudEFuZEdldCgpOworCQkJCQlyZXBvcnRJbmRleFJlcXVlc3RlZChyZWYsIHRydWUgLyogY2FjaGVIaXQgKi8sCisJCQkJCQkJc3RhcnQpOwogCQkJCQlyZXR1cm4gcmVmOwogCQkJCX0KIAkJCX0KQEAgLTU1Niw2ICs1NzIsNyBAQCA8VD4gUmVmPFQ+IGdldE9yTG9hZFJlZigKIAkJfSBmaW5hbGx5IHsKIAkJCXJlZ2lvbkxvY2sudW5sb2NrKCk7CiAJCX0KKwkJcmVwb3J0SW5kZXhSZXF1ZXN0ZWQocmVmLCBmYWxzZSAvKiBjYWNoZUhpdCAqLywgc3RhcnQpOwogCQlyZXR1cm4gcmVmOwogCX0KIApAQCAtNjgyLDggKzY5OSw5IEBAIHByaXZhdGUgc3RhdGljIEF0b21pY0xvbmcgZ2V0U3RhdChBdG9taWNSZWZlcmVuY2U8QXRvbWljTG9uZ1tdPiBzdGF0cywKIAl9CiAKIAlwcml2YXRlIHN0YXRpYyBIYXNoRW50cnkgY2xlYW4oSGFzaEVudHJ5IHRvcCkgewotCQl3aGlsZSAodG9wICE9IG51bGwgJiYgdG9wLnJlZi5uZXh0ID09IG51bGwpCisJCXdoaWxlICh0b3AgIT0gbnVsbCAmJiB0b3AucmVmLm5leHQgPT0gbnVsbCkgewogCQkJdG9wID0gdG9wLm5leHQ7CisJCX0KIAkJaWYgKHRvcCA9PSBudWxsKSB7CiAJCQlyZXR1cm4gbnVsbDsKIAkJfQpAQCAtNjkxLDYgKzcwOSw0NCBAQCBwcml2YXRlIHN0YXRpYyBIYXNoRW50cnkgY2xlYW4oSGFzaEVudHJ5IHRvcCkgewogCQlyZXR1cm4gbiA9PSB0b3AubmV4dCA/IHRvcCA6IG5ldyBIYXNoRW50cnkobiwgdG9wLnJlZik7CiAJfQogCisJcHJpdmF0ZSB2b2lkIHJlcG9ydEluZGV4UmVxdWVzdGVkKFJlZjw/PiByZWYsIGJvb2xlYW4gY2FjaGVIaXQsCisJCQlsb25nIHN0YXJ0KSB7CisJCWlmIChpbmRleEV2ZW50Q29uc3VtZXIgPT0gbnVsbAorCQkJCXx8ICFpc0luZGV4T3JCaXRtYXBFeHRQb3MocmVmLmtleS5wYWNrRXh0UG9zKSkgeworCQkJcmV0dXJuOworCQl9CisJCUV2aWN0S2V5IGV2aWN0S2V5ID0gbmV3IEV2aWN0S2V5KHJlZik7CisJCUxvbmcgcHJldkV2aWN0ZWRUaW1lID0gaW5kZXhFdmljdGlvbk1hcC5nZXQoZXZpY3RLZXkpOworCQlsb25nIG5vdyA9IFN5c3RlbS5uYW5vVGltZSgpOworCQlsb25nIHNpbmNlTGFzdEV2aWN0aW9uTmFub3MgPSBwcmV2RXZpY3RlZFRpbWUgPT0gbnVsbCA/IDBMCisJCQkJOiBub3cgLSBwcmV2RXZpY3RlZFRpbWUubG9uZ1ZhbHVlKCk7CisJCWluZGV4RXZlbnRDb25zdW1lci5hY2NlcHRSZXF1ZXN0ZWRFdmVudChyZWYua2V5LnBhY2tFeHRQb3MsIGNhY2hlSGl0LAorCQkJCShub3cgLSBzdGFydCkgLyAxMDAwTCAvKiBtaWNyb3MgKi8sIHJlZi5zaXplLAorCQkJCUR1cmF0aW9uLm9mTmFub3Moc2luY2VMYXN0RXZpY3Rpb25OYW5vcykpOworCX0KKworCXByaXZhdGUgdm9pZCByZXBvcnRJbmRleEV2aWN0ZWQoUmVmPD8+IGRlYWQpIHsKKwkJaWYgKGluZGV4RXZlbnRDb25zdW1lciA9PSBudWxsCisJCQkJfHwgIWluZGV4RXZlbnRDb25zdW1lci5zaG91bGRSZXBvcnRFdmljdGVkRXZlbnQoKQorCQkJCXx8ICFpc0luZGV4T3JCaXRtYXBFeHRQb3MoZGVhZC5rZXkucGFja0V4dFBvcykpIHsKKwkJCXJldHVybjsKKwkJfQorCQlFdmljdEtleSBldmljdEtleSA9IG5ldyBFdmljdEtleShkZWFkKTsKKwkJTG9uZyBwcmV2RXZpY3RlZFRpbWUgPSBpbmRleEV2aWN0aW9uTWFwLmdldChldmljdEtleSk7CisJCWxvbmcgbm93ID0gU3lzdGVtLm5hbm9UaW1lKCk7CisJCWxvbmcgc2luY2VMYXN0RXZpY3Rpb25OYW5vcyA9IHByZXZFdmljdGVkVGltZSA9PSBudWxsID8gMEwKKwkJCQk6IG5vdyAtIHByZXZFdmljdGVkVGltZS5sb25nVmFsdWUoKTsKKwkJaW5kZXhFdmljdGlvbk1hcC5wdXQoZXZpY3RLZXksIExvbmcudmFsdWVPZihub3cpKTsKKwkJaW5kZXhFdmVudENvbnN1bWVyLmFjY2VwdEV2aWN0ZWRFdmVudChkZWFkLmtleS5wYWNrRXh0UG9zLCBkZWFkLnNpemUsCisJCQkJZGVhZC50b3RhbEhpdENvdW50LmdldCgpLAorCQkJCUR1cmF0aW9uLm9mTmFub3Moc2luY2VMYXN0RXZpY3Rpb25OYW5vcykpOworCX0KKworCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbmRleE9yQml0bWFwRXh0UG9zKGludCBwYWNrRXh0UG9zKSB7CisJCXJldHVybiBwYWNrRXh0UG9zID09IFBhY2tFeHQuSU5ERVguZ2V0UG9zaXRpb24oKQorCQkJCXx8IHBhY2tFeHRQb3MgPT0gUGFja0V4dC5CSVRNQVBfSU5ERVguZ2V0UG9zaXRpb24oKTsKKwl9CisKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBIYXNoRW50cnkgewogCQkvKiogTmV4dCBlbnRyeSBpbiB0aGUgaGFzaCB0YWJsZSdzIGNoYWluIGxpc3QuICovCiAJCWZpbmFsIEhhc2hFbnRyeSBuZXh0OwpAQCAtNzEyLDYgKzc2OCw3IEBAIHN0YXRpYyBmaW5hbCBjbGFzcyBSZWY8VD4gewogCQlSZWYgbmV4dDsKIAogCQlwcml2YXRlIHZvbGF0aWxlIGludCBob3RDb3VudDsKKwkJcHJpdmF0ZSBBdG9taWNJbnRlZ2VyIHRvdGFsSGl0Q291bnQgPSBuZXcgQXRvbWljSW50ZWdlcigpOwogCiAJCVJlZihEZnNTdHJlYW1LZXkga2V5LCBsb25nIHBvc2l0aW9uLCBsb25nIHNpemUsIFQgdikgewogCQkJdGhpcy5rZXkgPSBrZXk7CkBAIC03MzYsNiArNzkzLDcgQEAgdm9pZCBtYXJrSG90dGVyKCkgewogCQkJaW50IGNhcCA9IERmc0Jsb2NrQ2FjaGUKIAkJCQkJLmdldEluc3RhbmNlKCkuY2FjaGVIb3RMaW1pdHNba2V5LnBhY2tFeHRQb3NdOwogCQkJaG90Q291bnQgPSBNYXRoLm1pbihjYXAsIGhvdENvdW50ICsgMSk7CisJCQl0b3RhbEhpdENvdW50LmluY3JlbWVudEFuZEdldCgpOwogCQl9CiAKIAkJdm9pZCBtYXJrQ29sZGVyKCkgewpAQCAtNzQ3LDYgKzgwNSwzNCBAQCBib29sZWFuIGlzSG90KCkgewogCQl9CiAJfQogCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgRXZpY3RLZXkgeworCQlwcml2YXRlIGZpbmFsIGludCBrZXlIYXNoOworCQlwcml2YXRlIGZpbmFsIGludCBwYWNrRXh0UG9zOworCQlwcml2YXRlIGZpbmFsIGxvbmcgcG9zaXRpb247CisKKwkJRXZpY3RLZXkoUmVmPD8+IHJlZikgeworCQkJa2V5SGFzaCA9IHJlZi5rZXkuaGFzaDsKKwkJCXBhY2tFeHRQb3MgPSByZWYua2V5LnBhY2tFeHRQb3M7CisJCQlwb3NpdGlvbiA9IHJlZi5wb3NpdGlvbjsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iamVjdCkgeworCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEV2aWN0S2V5KSB7CisJCQkJRXZpY3RLZXkgb3RoZXIgPSAoRXZpY3RLZXkpIG9iamVjdDsKKwkJCQlyZXR1cm4ga2V5SGFzaCA9PSBvdGhlci5rZXlIYXNoCisJCQkJCQkmJiBwYWNrRXh0UG9zID09IG90aGVyLnBhY2tFeHRQb3MKKwkJCQkJCSYmIHBvc2l0aW9uID09IG90aGVyLnBvc2l0aW9uOworCQkJfQorCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisJCQlyZXR1cm4gRGZzQmxvY2tDYWNoZS5nZXRJbnN0YW5jZSgpLmhhc2goa2V5SGFzaCwgcG9zaXRpb24pOworCQl9CisJfQorCiAJQEZ1bmN0aW9uYWxJbnRlcmZhY2UKIAlpbnRlcmZhY2UgUmVmTG9hZGVyPFQ+IHsKIAkJUmVmPFQ+IGxvYWQoKSB0aHJvd3MgSU9FeGNlcHRpb247CkBAIC03NjMsNCArODQ5LDQgQEAgaW50ZXJmYWNlIFJlYWRhYmxlQ2hhbm5lbFN1cHBsaWVyIHsKIAkJICovCiAJCVJlYWRhYmxlQ2hhbm5lbCBnZXQoKSB0aHJvd3MgSU9FeGNlcHRpb247CiAJfQotfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzQmxvY2tDYWNoZUNvbmZpZy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNCbG9ja0NhY2hlQ29uZmlnLmphdmEKaW5kZXggMjcxNmY3OS4uNjlhMzcwNSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNCbG9ja0NhY2hlQ29uZmlnLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNCbG9ja0NhY2hlQ29uZmlnLmphdmEKQEAgLTE4LDYgKzE4LDcgQEAKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19LRVlfU1RSRUFNX1JBVElPOwogCiBpbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7CitpbXBvcnQgamF2YS50aW1lLkR1cmF0aW9uOwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Db25zdW1lcjsKQEAgLTQ2LDkgKzQ3LDEwIEBAIHB1YmxpYyBjbGFzcyBEZnNCbG9ja0NhY2hlQ29uZmlnIHsKIAlwcml2YXRlIGludCBjb25jdXJyZW5jeUxldmVsOwogCiAJcHJpdmF0ZSBDb25zdW1lcjxMb25nPiByZWZMb2NrOwotCiAJcHJpdmF0ZSBNYXA8UGFja0V4dCwgSW50ZWdlcj4gY2FjaGVIb3RNYXA7CiAKKwlwcml2YXRlIEluZGV4RXZlbnRDb25zdW1lciBpbmRleEV2ZW50Q29uc3VtZXI7CisKIAkvKioKIAkgKiBDcmVhdGUgYSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24uCiAJICovCkBAIC0yMTYsNiArMjE4LDI4IEBAIHB1YmxpYyBEZnNCbG9ja0NhY2hlQ29uZmlnIHNldENhY2hlSG90TWFwKAogCX0KIAogCS8qKgorCSAqIEdldCB0aGUgY29uc3VtZXIgb2YgY2FjaGUgaW5kZXggZXZlbnRzLgorCSAqCisJICogQHJldHVybiBjb25zdW1lciBvZiBjYWNoZSBpbmRleCBldmVudHMuCisJICovCisJcHVibGljIEluZGV4RXZlbnRDb25zdW1lciBnZXRJbmRleEV2ZW50Q29uc3VtZXIoKSB7CisJCXJldHVybiBpbmRleEV2ZW50Q29uc3VtZXI7CisJfQorCisJLyoqCisJICogU2V0IHRoZSBjb25zdW1lciBvZiBjYWNoZSBpbmRleCBldmVudHMuCisJICoKKwkgKiBAcGFyYW0gaW5kZXhFdmVudENvbnN1bWVyCisJICogICAgICAgICAgICBjb25zdW1lciBvZiBjYWNoZSBpbmRleCBldmVudHMuCisJICogQHJldHVybiB7QGNvZGUgdGhpc30KKwkgKi8KKwlwdWJsaWMgRGZzQmxvY2tDYWNoZUNvbmZpZyBzZXRJbmRleEV2ZW50Q29uc3VtZXIoCisJCQlJbmRleEV2ZW50Q29uc3VtZXIgaW5kZXhFdmVudENvbnN1bWVyKSB7CisJCXRoaXMuaW5kZXhFdmVudENvbnN1bWVyID0gaW5kZXhFdmVudENvbnN1bWVyOworCQlyZXR1cm4gdGhpczsKKwl9CisKKwkvKioKIAkgKiBVcGRhdGUgcHJvcGVydGllcyBieSBzZXR0aW5nIGZpZWxkcyBmcm9tIHRoZSBjb25maWd1cmF0aW9uLgogCSAqIDxwPgogCSAqIElmIGEgcHJvcGVydHkgaXMgbm90IGRlZmluZWQgaW4gdGhlIGNvbmZpZ3VyYXRpb24sIHRoZW4gaXQgaXMgbGVmdApAQCAtMjcyLDQgKzI5Niw1MiBAQCBwdWJsaWMgRGZzQmxvY2tDYWNoZUNvbmZpZyBmcm9tQ29uZmlnKENvbmZpZyByYykgewogCQl9CiAJCXJldHVybiB0aGlzOwogCX0KLX0KKworCS8qKiBDb25zdW1lciBvZiBEZnNCbG9ja0NhY2hlIGxvYWRpbmcgYW5kIGV2aWN0aW9uIGV2ZW50cyBmb3IgaW5kZXhlcy4gKi8KKwlwdWJsaWMgaW50ZXJmYWNlIEluZGV4RXZlbnRDb25zdW1lciB7CisJCS8qKgorCQkgKiBBY2NlcHQgYW4gZXZlbnQgb2YgYW4gaW5kZXggcmVxdWVzdGVkLiBJdCBjb3VsZCBiZSBsb2FkZWQgZnJvbSBlaXRoZXIKKwkJICogY2FjaGUgb3Igc3RvcmFnZS4KKwkJICoKKwkJICogQHBhcmFtIHBhY2tFeHRQb3MKKwkJICogICAgICAgICAgICBwb3NpdGlvbiBpbiB7QGNvZGUgUGFja0V4dH0gZW51bQorCQkgKiBAcGFyYW0gY2FjaGVIaXQKKwkJICogICAgICAgICAgICB0cnVlIGlmIGFuIGluZGV4IHdhcyBhbHJlYWR5IGluIGNhY2hlLiBPdGhlcndpc2UsIHRoZQorCQkgKiAgICAgICAgICAgIGluZGV4IHdhcyBsb2FkZWQgZnJvbSBzdG9yYWdlIGludG8gdGhlIGNhY2hlIGluIHRoZQorCQkgKiAgICAgICAgICAgIGN1cnJlbnQgcmVxdWVzdCwKKwkJICogQHBhcmFtIGxvYWRNaWNyb3MKKwkJICogICAgICAgICAgICB0aW1lIHRvIGxvYWQgYW4gaW5kZXggZnJvbSBjYWNoZSBvciBzdG9yYWdlIGluCisJCSAqICAgICAgICAgICAgbWljcm9zZWNvbmRzCisJCSAqIEBwYXJhbSBieXRlcworCQkgKiAgICAgICAgICAgIG51bWJlciBvZiBieXRlcyBsb2FkZWQKKwkJICogQHBhcmFtIGxhc3RFdmljdGlvbkR1cmF0aW9uCisJCSAqICAgICAgICAgICAgdGltZSBzaW5jZSBsYXN0IGV2aWN0aW9uLCAwIGlmIHdhcyBub3QgZXZpY3RlZCB5ZXQKKwkJICovCisJCXZvaWQgYWNjZXB0UmVxdWVzdGVkRXZlbnQoaW50IHBhY2tFeHRQb3MsIGJvb2xlYW4gY2FjaGVIaXQsCisJCQkJbG9uZyBsb2FkTWljcm9zLCBsb25nIGJ5dGVzLCBEdXJhdGlvbiBsYXN0RXZpY3Rpb25EdXJhdGlvbik7CisKKwkJLyoqCisJCSAqIEFjY2VwdCBhbiBldmVudCBvZiBhbiBpbmRleCBldmljdGVkIGZyb20gY2FjaGUuCisJCSAqCisJCSAqIEBwYXJhbSBwYWNrRXh0UG9zCisJCSAqICAgICAgICAgICAgcG9zaXRpb24gaW4ge0Bjb2RlIFBhY2tFeHR9IGVudW0KKwkJICogQHBhcmFtIGJ5dGVzCisJCSAqICAgICAgICAgICAgbnVtYmVyIG9mIGJ5dGVzIGV2aWN0ZWQKKwkJICogQHBhcmFtIHRvdGFsQ2FjaGVIaXRDb3VudAorCQkgKiAgICAgICAgICAgIG51bWJlciBvZiB0aW1lcyBhbiBpbmRleCB3YXMgYWNjZXNzZWQgd2hpbGUgaW4gY2FjaGUKKwkJICogQHBhcmFtIGxhc3RFdmljdGlvbkR1cmF0aW9uCisJCSAqICAgICAgICAgICAgdGltZSBzaW5jZSBsYXN0IGV2aWN0aW9uLCAwIGlmIHdhcyBub3QgZXZpY3RlZCB5ZXQKKwkJICovCisJCWRlZmF1bHQgdm9pZCBhY2NlcHRFdmljdGVkRXZlbnQoaW50IHBhY2tFeHRQb3MsIGxvbmcgYnl0ZXMsCisJCQkJaW50IHRvdGFsQ2FjaGVIaXRDb3VudCwgRHVyYXRpb24gbGFzdEV2aWN0aW9uRHVyYXRpb24pIHsKKwkJCS8vIE9mZiBieSBkZWZhdWx0LgorCQl9CisKKwkJLyoqCisJCSAqIEByZXR1cm4gdHJ1ZSBpZiByZXBvcnRpbmcgZXZpY3RlZCBldmVudHMgaXMgZW5hYmxlZC4KKwkJICovCisJCWRlZmF1bHQgYm9vbGVhbiBzaG91bGRSZXBvcnRFdmljdGVkRXZlbnQoKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNQYWNrRmlsZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNQYWNrRmlsZS5qYXZhCmluZGV4IGJiNzZkZjEuLmY3YTJjOTQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzUGFja0ZpbGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc1BhY2tGaWxlLmphdmEKQEAgLTEwNjEsNyArMTA2MSw4IEBAIHByaXZhdGUgRGZzQmxvY2tDYWNoZS5SZWY8UGFja0JpdG1hcEluZGV4PiBsb2FkQml0bWFwSW5kZXgoRGZzUmVhZGVyIGN0eCwKIAkJCQl9CiAJCQkJaW4gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShpbiwgYnMpOwogCQkJCWJtaWR4ID0gUGFja0JpdG1hcEluZGV4LnJlYWQoaW4sICgpIC0+IGlkeChjdHgpLAotCQkJCQkJKCkgLT4gZ2V0UmV2ZXJzZUlkeChjdHgpKTsKKwkJCQkJCSgpIC0+IGdldFJldmVyc2VJZHgoY3R4KSwKKwkJCQkJCWN0eC5nZXRPcHRpb25zKCkuc2hvdWxkTG9hZFJldkluZGV4SW5QYXJhbGxlbCgpKTsKIAkJCX0gZmluYWxseSB7CiAJCQkJc2l6ZSA9IHJjLnBvc2l0aW9uKCk7CiAJCQkJY3R4LnN0YXRzLnJlYWRCaXRtYXBJZHhCeXRlcyArPSBzaXplOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNSZWFkZXJPcHRpb25zLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc1JlYWRlck9wdGlvbnMuamF2YQppbmRleCA4OWRlNTM0Li4xNDZmNzYxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc1JlYWRlck9wdGlvbnMuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc1JlYWRlck9wdGlvbnMuamF2YQpAQCAtMzQsNiArMzQsOCBAQCBwdWJsaWMgY2xhc3MgRGZzUmVhZGVyT3B0aW9ucyB7CiAKIAlwcml2YXRlIGludCBzdHJlYW1QYWNrQnVmZmVyU2l6ZTsKIAorCXByaXZhdGUgYm9vbGVhbiBsb2FkUmV2SW5kZXhJblBhcmFsbGVsOworCiAJLyoqCiAJICogQ3JlYXRlIGEgZGVmYXVsdCByZWFkZXIgY29uZmlndXJhdGlvbi4KIAkgKi8KQEAgLTExMyw2ICsxMTUsMjggQEAgcHVibGljIERmc1JlYWRlck9wdGlvbnMgc2V0U3RyZWFtUGFja0J1ZmZlclNpemUoaW50IGJ1ZnN6KSB7CiAJfQogCiAJLyoqCisJICogQ2hlY2sgaWYgcmV2ZXJzZSBpbmRleCBzaG91bGQgYmUgbG9hZGVkIGluIHBhcmFsbGVsLgorCSAqCisJICogQHJldHVybiB0cnVlIGlmIHJldmVyc2UgaW5kZXggaXMgbG9hZGVkIGluIHBhcmFsbGVsIGZvciBiaXRtYXAgaW5kZXguCisJICovCisJcHVibGljIGJvb2xlYW4gc2hvdWxkTG9hZFJldkluZGV4SW5QYXJhbGxlbCgpIHsKKwkJcmV0dXJuIGxvYWRSZXZJbmRleEluUGFyYWxsZWw7CisJfQorCisJLyoqCisJICogRW5hYmxlIChvciBkaXNhYmxlKSBwYXJhbGxlbCBsb2FkaW5nIG9mIHJldmVyc2UgaW5kZXguCisJICoKKwkgKiBAcGFyYW0gbG9hZFJldkluZGV4SW5QYXJhbGxlbAorCSAqICAgICAgICAgICAgd2hldGhlciB0byBsb2FkIHJldmVyc2UgaW5kZXggaW4gcGFyYWxsZWwuCisJICogQHJldHVybiB7QGNvZGUgdGhpc30KKwkgKi8KKwlwdWJsaWMgRGZzUmVhZGVyT3B0aW9ucyBzZXRMb2FkUmV2SW5kZXhJblBhcmFsbGVsKAorCQkJYm9vbGVhbiBsb2FkUmV2SW5kZXhJblBhcmFsbGVsKSB7CisJCXRoaXMubG9hZFJldkluZGV4SW5QYXJhbGxlbCA9IGxvYWRSZXZJbmRleEluUGFyYWxsZWw7CisJCXJldHVybiB0aGlzOworCX0KKworCS8qKgogCSAqIFVwZGF0ZSBwcm9wZXJ0aWVzIGJ5IHNldHRpbmcgZmllbGRzIGZyb20gdGhlIGNvbmZpZ3VyYXRpb24uCiAJICogPHA+CiAJICogSWYgYSBwcm9wZXJ0eSBpcyBub3QgZGVmaW5lZCBpbiB0aGUgY29uZmlndXJhdGlvbiwgdGhlbiBpdCBpcyBsZWZ0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0luTWVtb3J5UmVwb3NpdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9Jbk1lbW9yeVJlcG9zaXRvcnkuamF2YQppbmRleCA1YjY4OTRkLi45OWRhMjIyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0luTWVtb3J5UmVwb3NpdG9yeS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvSW5NZW1vcnlSZXBvc2l0b3J5LmphdmEKQEAgLTE2NSw2ICsxNjUsMTUgQEAgcHVibGljIHZvaWQgZmx1c2goKSB7CiAJCQkJfQogCQkJfTsKIAkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgbG9uZyBnZXRBcHByb3hpbWF0ZU9iamVjdENvdW50KCkgeworCQkJbG9uZyBjb3VudCA9IDA7CisJCQlmb3IgKERmc1BhY2tEZXNjcmlwdGlvbiBwIDogcGFja3MpIHsKKwkJCQljb3VudCArPSBwLmdldE9iamVjdENvdW50KCk7CisJCQl9CisJCQlyZXR1cm4gY291bnQ7CisJCX0KIAl9CiAKIAlwcml2YXRlIHN0YXRpYyBjbGFzcyBNZW1QYWNrIGV4dGVuZHMgRGZzUGFja0Rlc2NyaXB0aW9uIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvTGFyZ2VQYWNrZWRXaG9sZU9iamVjdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9MYXJnZVBhY2tlZFdob2xlT2JqZWN0LmphdmEKaW5kZXggYjA2MTJmOS4uY2Q0ZjE2OCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9MYXJnZVBhY2tlZFdob2xlT2JqZWN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9MYXJnZVBhY2tlZFdob2xlT2JqZWN0LmphdmEKQEAgLTczLDcgKzczLDYgQEAgcHVibGljIGJvb2xlYW4gaXNMYXJnZSgpIHsKIAlwdWJsaWMgT2JqZWN0U3RyZWFtIG9wZW5TdHJlYW0oKSB0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogCQlQYWNrSW5wdXRTdHJlYW0gcGFja0luOwogCQkvLyBjdHggaXMgY2xvc2VkIGJ5IFBhY2tJbnB1dFN0cmVhbSwgb3IgZXhwbGljaXRseSBpbiB0aGUgZmluYWxseSBibG9jawotCQlAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKQogCQlEZnNSZWFkZXIgY3R4ID0gZGIubmV3UmVhZGVyKCk7CiAJCXRyeSB7CiAJCQl0cnkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvQ2FjaGVkT2JqZWN0RGlyZWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9DYWNoZWRPYmplY3REaXJlY3RvcnkuamF2YQppbmRleCA3ZGVkZWI1Li4wOTRmZGMxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9DYWNoZWRPYmplY3REaXJlY3RvcnkuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9DYWNoZWRPYmplY3REaXJlY3RvcnkuamF2YQpAQCAtMjYzLDQgKzI2MywxNyBAQCBwcml2YXRlIHN0YXRpYyBjbGFzcyBVbnBhY2tlZE9iamVjdElkIGV4dGVuZHMgT2JqZWN0SWRPd25lck1hcC5FbnRyeSB7CiAJcHJpdmF0ZSBBbHRlcm5hdGVIYW5kbGUuSWQgZ2V0QWx0ZXJuYXRlSWQoKSB7CiAJCXJldHVybiB3cmFwcGVkLmdldEFsdGVybmF0ZUlkKCk7CiAJfQorCisJQE92ZXJyaWRlCisJcHVibGljIGxvbmcgZ2V0QXBwcm94aW1hdGVPYmplY3RDb3VudCgpIHsKKwkJbG9uZyBjb3VudCA9IDA7CisJCWZvciAoUGFjayBwIDogZ2V0UGFja3MoKSkgeworCQkJdHJ5IHsKKwkJCQljb3VudCArPSBwLmdldE9iamVjdENvdW50KCk7CisJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQl9CisJCXJldHVybiBjb3VudDsKKwl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9GaWxlUmVmdGFibGVTdGFjay5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvRmlsZVJlZnRhYmxlU3RhY2suamF2YQppbmRleCBmMDJjODYxLi41MTUyMzY3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9GaWxlUmVmdGFibGVTdGFjay5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0ZpbGVSZWZ0YWJsZVN0YWNrLmphdmEKQEAgLTQwLDYgKzQwLDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UucmVmdGFibGUuUmVmdGFibGVXcml0ZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uZmlnOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5GaWxlVXRpbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLlN5c3RlbVJlYWRlcjsKIAogLyoqCiAgKiBBIG11dGFibGUgc3RhY2sgb2YgcmVmdGFibGVzIG9uIGxvY2FsIGZpbGVzeXN0ZW0gc3RvcmFnZS4gTm90IHRocmVhZC1zYWZlLgpAQCAtNTI3LDExICs1MjgsMTkgQEAgYm9vbGVhbiBjb21wYWN0UmFuZ2UoaW50IGZpcnN0LCBpbnQgbGFzdCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCQlyZXR1cm4gZmFsc2U7CiAJCQl9CiAKKwkJCXJlbG9hZCgpOwogCQkJZm9yIChGaWxlIGYgOiBkZWxldGVPblN1Y2Nlc3MpIHsKLQkJCQlGaWxlcy5kZWxldGUoZi50b1BhdGgoKSk7CisJCQkJdHJ5IHsKKwkJCQkJRmlsZXMuZGVsZXRlKGYudG9QYXRoKCkpOworCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCQkJLy8gSWdub3JlOiB0aGlzIGNhbiBoYXBwZW4gb24gV2luZG93cyBpbiBjYXNlIG9mIGNvbmN1cnJlbnQgcHJvY2Vzc2VzLgorCQkJCQkvLyBsZWF2ZSB0aGUgZ2FyYmFnZSBhbmQgY29udGludWUuCisJCQkJCWlmICghU3lzdGVtUmVhZGVyLmdldEluc3RhbmNlKCkuaXNXaW5kb3dzKCkpIHsKKwkJCQkJCXRocm93IGU7CisJCQkJCX0KKwkJCQl9CiAJCQl9CiAKLQkJCXJlbG9hZCgpOwogCQkJcmV0dXJuIHRydWU7CiAJCX0gZmluYWxseSB7CiAJCQlpZiAodG1wVGFibGUgIT0gbnVsbCkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvRmlsZVJlcG9zaXRvcnkuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0ZpbGVSZXBvc2l0b3J5LmphdmEKaW5kZXggNTNhMWNkNi4uM2ViY2U2YyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvRmlsZVJlcG9zaXRvcnkuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9GaWxlUmVwb3NpdG9yeS5qYXZhCkBAIC02NjUsMTggKzY2NSwyMCBAQCB2b2lkIGNvbnZlcnRUb1BhY2tlZFJlZnMoYm9vbGVhbiB3cml0ZUxvZ3MsIGJvb2xlYW4gYmFja3VwKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCiAJCQlpZiAod3JpdGVMb2dzKSB7CiAJCQkJTGlzdDxSZWZsb2dFbnRyeT4gbG9ncyA9IG9sZERiLmdldFJlZmxvZ1JlYWRlcihyLmdldE5hbWUoKSkKLQkJCQkJLmdldFJldmVyc2VFbnRyaWVzKCk7CisJCQkJCQkuZ2V0UmV2ZXJzZUVudHJpZXMoKTsKIAkJCQlDb2xsZWN0aW9ucy5yZXZlcnNlKGxvZ3MpOwogCQkJCWZvciAoUmVmbG9nRW50cnkgZSA6IGxvZ3MpIHsKIAkJCQkJbG9nV3JpdGVyLmxvZyhyLmdldE5hbWUoKSwgZSk7CiAJCQkJfQotCQl9CisJCQl9CiAJCX0KIAogCQl0cnkgKFJldldhbGsgcncgPSBuZXcgUmV2V2Fsayh0aGlzKSkgewogCQkJYnJ1LmV4ZWN1dGUocncsIE51bGxQcm9ncmVzc01vbml0b3IuSU5TVEFOQ0UpOwogCQl9CiAKKwkJb2xkRGIuY2xvc2UoKTsKKwogCQlMaXN0PFN0cmluZz4gZmFpbGVkID0gbmV3IEFycmF5TGlzdDw+KCk7CiAJCWZvciAoUmVjZWl2ZUNvbW1hbmQgY21kIDogYnJ1LmdldENvbW1hbmRzKCkpIHsKIAkJCWlmIChjbWQuZ2V0UmVzdWx0KCkgIT0gUmVjZWl2ZUNvbW1hbmQuUmVzdWx0Lk9LKSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9PYmplY3REaXJlY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL09iamVjdERpcmVjdG9yeS5qYXZhCmluZGV4IDYyN2ZhY2MuLjA2YzhjYWQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL09iamVjdERpcmVjdG9yeS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL09iamVjdERpcmVjdG9yeS5qYXZhCkBAIC0yMTIsNiArMjEyLDIwIEBAIHB1YmxpYyBDb2xsZWN0aW9uPFBhY2s+IGdldFBhY2tzKCkgewogCQlyZXR1cm4gcGFja2VkLmdldFBhY2tzKCk7CiAJfQogCisJLyoqIHtAaW5oZXJpdERvY30gKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgbG9uZyBnZXRBcHByb3hpbWF0ZU9iamVjdENvdW50KCkgeworCQlsb25nIGNvdW50ID0gMDsKKwkJZm9yIChQYWNrIHAgOiBnZXRQYWNrcygpKSB7CisJCQl0cnkgeworCQkJCWNvdW50ICs9IHAuZ2V0SW5kZXgoKS5nZXRPYmplY3RDb3VudCgpOworCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gY291bnQ7CisJfQorCiAJLyoqCiAJICoge0Bpbmhlcml0RG9jfQogCSAqIDxwPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFja0JpdG1hcEluZGV4LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9QYWNrQml0bWFwSW5kZXguamF2YQppbmRleCA4NDAxZjA3Li44ZmIxN2ZjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9QYWNrQml0bWFwSW5kZXguamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9QYWNrQml0bWFwSW5kZXguamF2YQpAQCAtOTUsNyArOTUsNyBAQCBwdWJsaWMgc3RhdGljIFBhY2tCaXRtYXBJbmRleCBvcGVuKEZpbGUgaWR4RmlsZSwgUGFja0luZGV4IHBhY2tJbmRleCwKIAkgKi8KIAlwdWJsaWMgc3RhdGljIFBhY2tCaXRtYXBJbmRleCByZWFkKElucHV0U3RyZWFtIGZkLCBQYWNrSW5kZXggcGFja0luZGV4LAogCQkJUGFja1JldmVyc2VJbmRleCByZXZlcnNlSW5kZXgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXcgUGFja0JpdG1hcEluZGV4VjEoZmQsICgpIC0+IHBhY2tJbmRleCwgKCkgLT4gcmV2ZXJzZUluZGV4KTsKKwkJcmV0dXJuIG5ldyBQYWNrQml0bWFwSW5kZXhWMShmZCwgcGFja0luZGV4LCByZXZlcnNlSW5kZXgpOwogCX0KIAogCS8qKgpAQCAtMTE0LDYgKzExNCw4IEBAIHB1YmxpYyBzdGF0aWMgUGFja0JpdG1hcEluZGV4IHJlYWQoSW5wdXRTdHJlYW0gZmQsIFBhY2tJbmRleCBwYWNrSW5kZXgsCiAJICogQHBhcmFtIHJldmVyc2VJbmRleFN1cHBsaWVyCiAJICogICAgICAgICAgICB0aGUgc3VwcGxpZXIgZm9yIHBhY2sgcmV2ZXJzZSBpbmRleCBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgcGFjawogCSAqICAgICAgICAgICAgZmlsZS4KKwkgKiBAcGFyYW0gbG9hZFBhcmFsbGVsUmV2SW5kZXgKKwkgKiAgICAgICAgICAgIHdoZXRoZXIgcmV2ZXJzZSBpbmRleCBzaG91bGQgYmUgbG9hZGVkIGluIHBhcmFsbGVsCiAJICogQHJldHVybiBhIGNvcHkgb2YgdGhlIGluZGV4IGluLW1lbW9yeS4KIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICB0aGUgc3RyZWFtIGNhbm5vdCBiZSByZWFkLgpAQCAtMTIyLDEwICsxMjQsMTEgQEAgcHVibGljIHN0YXRpYyBQYWNrQml0bWFwSW5kZXggcmVhZChJbnB1dFN0cmVhbSBmZCwgUGFja0luZGV4IHBhY2tJbmRleCwKIAkgKi8KIAlwdWJsaWMgc3RhdGljIFBhY2tCaXRtYXBJbmRleCByZWFkKElucHV0U3RyZWFtIGZkLAogCQkJU3VwcGxpZXJXaXRoSU9FeGNlcHRpb248UGFja0luZGV4PiBwYWNrSW5kZXhTdXBwbGllciwKLQkJCVN1cHBsaWVyV2l0aElPRXhjZXB0aW9uPFBhY2tSZXZlcnNlSW5kZXg+IHJldmVyc2VJbmRleFN1cHBsaWVyKQorCQkJU3VwcGxpZXJXaXRoSU9FeGNlcHRpb248UGFja1JldmVyc2VJbmRleD4gcmV2ZXJzZUluZGV4U3VwcGxpZXIsCisJCQlib29sZWFuIGxvYWRQYXJhbGxlbFJldkluZGV4KQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJcmV0dXJuIG5ldyBQYWNrQml0bWFwSW5kZXhWMShmZCwgcGFja0luZGV4U3VwcGxpZXIsCi0JCQkJcmV2ZXJzZUluZGV4U3VwcGxpZXIpOworCQkJCXJldmVyc2VJbmRleFN1cHBsaWVyLCBsb2FkUGFyYWxsZWxSZXZJbmRleCk7CiAJfQogCiAJLyoqIEZvb3RlciBjaGVja3N1bSBhcHBsaWVkIG9uIHRoZSBib3R0b20gb2YgdGhlIHBhY2sgZmlsZS4gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1BhY2tCaXRtYXBJbmRleFYxLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9QYWNrQml0bWFwSW5kZXhWMS5qYXZhCmluZGV4IDY4NDZlM2IuLjIxYWJhM2UgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1BhY2tCaXRtYXBJbmRleFYxLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFja0JpdG1hcEluZGV4VjEuamF2YQpAQCAtMTcsNiArMTcsMTIgQEAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yU2VydmljZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnM7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZEZhY3Rvcnk7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFubm90YXRpb25zLk51bGxhYmxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuSkdpdFRleHQ7CkBAIC00MCw2ICs0NiwyMyBAQCBjbGFzcyBQYWNrQml0bWFwSW5kZXhWMSBleHRlbmRzIEJhc2VQYWNrQml0bWFwSW5kZXggewogCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9YT1JfT0ZGU0VUID0gMTI2OwogCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgRXhlY3V0b3JTZXJ2aWNlIGV4ZWN1dG9yID0gRXhlY3V0b3JzCisJCQkubmV3Q2FjaGVkVGhyZWFkUG9vbChuZXcgVGhyZWFkRmFjdG9yeSgpIHsKKwkJCQlwcml2YXRlIGZpbmFsIFRocmVhZEZhY3RvcnkgYmFzZUZhY3RvcnkgPSBFeGVjdXRvcnMKKwkJCQkJCS5kZWZhdWx0VGhyZWFkRmFjdG9yeSgpOworCisJCQkJcHJpdmF0ZSBmaW5hbCBBdG9taWNJbnRlZ2VyIHRocmVhZE51bWJlciA9IG5ldyBBdG9taWNJbnRlZ2VyKDApOworCisJCQkJQE92ZXJyaWRlCisJCQkJcHVibGljIFRocmVhZCBuZXdUaHJlYWQoUnVubmFibGUgcnVubmFibGUpIHsKKwkJCQkJVGhyZWFkIHRocmVhZCA9IGJhc2VGYWN0b3J5Lm5ld1RocmVhZChydW5uYWJsZSk7CisJCQkJCXRocmVhZC5zZXROYW1lKCJKR2l0LVBhY2tCaXRtYXBJbmRleFYxLSIgLy8kTk9OLU5MUy0xJAorCQkJCQkJCSsgdGhyZWFkTnVtYmVyLmdldEFuZEluY3JlbWVudCgpKTsKKwkJCQkJdGhyZWFkLnNldERhZW1vbih0cnVlKTsKKwkJCQkJcmV0dXJuIHRocmVhZDsKKwkJCQl9CisJCQl9KTsKKwogCXByaXZhdGUgZmluYWwgUGFja0luZGV4IHBhY2tJbmRleDsKIAlwcml2YXRlIGZpbmFsIFBhY2tSZXZlcnNlSW5kZXggcmV2ZXJzZUluZGV4OwogCXByaXZhdGUgZmluYWwgRVdBSENvbXByZXNzZWRCaXRtYXAgY29tbWl0czsKQEAgLTQ5LDE1ICs3MiwyOCBAQCBjbGFzcyBQYWNrQml0bWFwSW5kZXhWMSBleHRlbmRzIEJhc2VQYWNrQml0bWFwSW5kZXggewogCiAJcHJpdmF0ZSBmaW5hbCBPYmplY3RJZE93bmVyTWFwPFN0b3JlZEJpdG1hcD4gYml0bWFwczsKIAorCVBhY2tCaXRtYXBJbmRleFYxKGZpbmFsIElucHV0U3RyZWFtIGZkLCBQYWNrSW5kZXggcGFja0luZGV4LAorCQkJUGFja1JldmVyc2VJbmRleCByZXZlcnNlSW5kZXgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXRoaXMoZmQsICgpIC0+IHBhY2tJbmRleCwgKCkgLT4gcmV2ZXJzZUluZGV4LCBmYWxzZSk7CisJfQorCiAJUGFja0JpdG1hcEluZGV4VjEoZmluYWwgSW5wdXRTdHJlYW0gZmQsCiAJCQlTdXBwbGllcldpdGhJT0V4Y2VwdGlvbjxQYWNrSW5kZXg+IHBhY2tJbmRleFN1cHBsaWVyLAotCQkJU3VwcGxpZXJXaXRoSU9FeGNlcHRpb248UGFja1JldmVyc2VJbmRleD4gcmV2ZXJzZUluZGV4U3VwcGxpZXIpCisJCQlTdXBwbGllcldpdGhJT0V4Y2VwdGlvbjxQYWNrUmV2ZXJzZUluZGV4PiByZXZlcnNlSW5kZXhTdXBwbGllciwKKwkJCWJvb2xlYW4gbG9hZFBhcmFsbGVsUmV2SW5kZXgpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQkvLyBBbiBlbnRyeSBpcyBvYmplY3QgaWQsIHhvciBvZmZzZXQsIGZsYWcgYnl0ZSwgYW5kIGEgbGVuZ3RoIGVuY29kZWQKIAkJLy8gYml0bWFwLiBUaGUgb2JqZWN0IGlkIGlzIGFuIGludDMyIG9mIHRoZSBudGggcG9zaXRpb24gc29ydGVkIGJ5IG5hbWUuCiAJCXN1cGVyKG5ldyBPYmplY3RJZE93bmVyTWFwPFN0b3JlZEJpdG1hcD4oKSk7CiAJCXRoaXMuYml0bWFwcyA9IGdldEJpdG1hcHMoKTsKIAorCQkvLyBPcHRpb25hbGx5IHN0YXJ0IGxvYWRpbmcgcmV2ZXJzZSBpbmRleCBpbiBwYXJhbGxlbCB0byBsb2FkaW5nIGJpdG1hcAorCQkvLyBmcm9tIHN0b3JhZ2UuCisJCUZ1dHVyZTxQYWNrUmV2ZXJzZUluZGV4PiByZXZlcnNlSW5kZXhGdXR1cmUgPSBudWxsOworCQlpZiAobG9hZFBhcmFsbGVsUmV2SW5kZXgpIHsKKwkJCXJldmVyc2VJbmRleEZ1dHVyZSA9IGV4ZWN1dG9yLnN1Ym1pdChyZXZlcnNlSW5kZXhTdXBwbGllcjo6Z2V0KTsKKwkJfQorCiAJCWZpbmFsIGJ5dGVbXSBzY3JhdGNoID0gbmV3IGJ5dGVbMzJdOwogCQlJTy5yZWFkRnVsbHkoZmQsIHNjcmF0Y2gsIDAsIHNjcmF0Y2gubGVuZ3RoKTsKIApAQCAtMTY0LDcgKzIwMCwxOCBAQCBjbGFzcyBQYWNrQml0bWFwSW5kZXhWMSBleHRlbmRzIEJhc2VQYWNrQml0bWFwSW5kZXggewogCQkJYml0bWFwcy5hZGQoc2IpOwogCQl9CiAKLQkJdGhpcy5yZXZlcnNlSW5kZXggPSByZXZlcnNlSW5kZXhTdXBwbGllci5nZXQoKTsKKwkJUGFja1JldmVyc2VJbmRleCBjb21wdXRlZFJldmVyc2VJbmRleDsKKwkJaWYgKGxvYWRQYXJhbGxlbFJldkluZGV4ICYmIHJldmVyc2VJbmRleEZ1dHVyZSAhPSBudWxsKSB7CisJCQl0cnkgeworCQkJCWNvbXB1dGVkUmV2ZXJzZUluZGV4ID0gcmV2ZXJzZUluZGV4RnV0dXJlLmdldCgpOworCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gfCBFeGVjdXRpb25FeGNlcHRpb24gZSkgeworCQkJCS8vIEZhbGxiYWNrIHRvIGxvYWRpbmcgcmV2ZXJzZSBpbmRleCB0aHJvdWdoIGEgc3VwcGxpZXIuCisJCQkJY29tcHV0ZWRSZXZlcnNlSW5kZXggPSByZXZlcnNlSW5kZXhTdXBwbGllci5nZXQoKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWNvbXB1dGVkUmV2ZXJzZUluZGV4ID0gcmV2ZXJzZUluZGV4U3VwcGxpZXIuZ2V0KCk7CisJCX0KKwkJdGhpcy5yZXZlcnNlSW5kZXggPSBjb21wdXRlZFJldmVyc2VJbmRleDsKIAl9CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2lvL0NhbmNlbGxhYmxlRGlnZXN0T3V0cHV0U3RyZWFtLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvaW8vQ2FuY2VsbGFibGVEaWdlc3RPdXRwdXRTdHJlYW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTIwOTVmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2lvL0NhbmNlbGxhYmxlRGlnZXN0T3V0cHV0U3RyZWFtLmphdmEKQEAgLTAsMCArMSwxMjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjIsIFRlbmNlbnQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5pbzsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Qcm9ncmVzc01vbml0b3I7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW50ZXJydXB0ZWRJT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5Lk1lc3NhZ2VEaWdlc3Q7CisKKy8qKgorICogQW4gT3V0cHV0U3RyZWFtIHRoYXQga2VlcHMgYSBkaWdlc3QgYW5kIGNoZWNrcyBldmVyeSBOIGJ5dGVzIGZvcgorICogY2FuY2VsbGF0aW9uLgorICovCitwdWJsaWMgY2xhc3MgQ2FuY2VsbGFibGVEaWdlc3RPdXRwdXRTdHJlYW0gZXh0ZW5kcyBPdXRwdXRTdHJlYW0geworCisJLyoqIFRoZSBPdXRwdXRTdHJlYW0gY2hlY2tzIGV2ZXJ5IHRoaXMgdmFsdWUgZm9yIGNhbmNlbGxhdGlvbiAqKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCWVRFU19UT19XUklURV9CRUZPUkVfQ0FOQ0VMX0NIRUNLID0gMTI4ICogMTAyNDsKKworCXByaXZhdGUgZmluYWwgUHJvZ3Jlc3NNb25pdG9yIHdyaXRlTW9uaXRvcjsKKworCXByaXZhdGUgZmluYWwgT3V0cHV0U3RyZWFtIG91dDsKKworCXByaXZhdGUgZmluYWwgTWVzc2FnZURpZ2VzdCBtZCA9IENvbnN0YW50cy5uZXdNZXNzYWdlRGlnZXN0KCk7CisKKwlwcml2YXRlIGxvbmcgY291bnQ7CisKKwlwcml2YXRlIGxvbmcgY2hlY2tDYW5jZWxBdDsKKworCS8qKgorCSAqIEluaXRpYWxpemUgYSBDYW5jZWxsYWJsZURpZ2VzdE91dHB1dFN0cmVhbS4KKwkgKgorCSAqIEBwYXJhbSB3cml0ZU1vbml0b3IKKwkgKiAgICAgICAgICAgIG1vbml0b3IgdG8gdXBkYXRlIG9uIG91dHB1dCBwcm9ncmVzcyBhbmQgY2hlY2sgY2FuY2VsLgorCSAqIEBwYXJhbSBvdXQKKwkgKiAgICAgICAgICAgIHRhcmdldCBzdHJlYW0gdG8gcmVjZWl2ZSBhbGwgY29udGVudHMuCisJICovCisJcHVibGljIENhbmNlbGxhYmxlRGlnZXN0T3V0cHV0U3RyZWFtKFByb2dyZXNzTW9uaXRvciB3cml0ZU1vbml0b3IsCisJCQlPdXRwdXRTdHJlYW0gb3V0KSB7CisJCXRoaXMud3JpdGVNb25pdG9yID0gd3JpdGVNb25pdG9yOworCQl0aGlzLm91dCA9IG91dDsKKwkJdGhpcy5jaGVja0NhbmNlbEF0ID0gQllURVNfVE9fV1JJVEVfQkVGT1JFX0NBTkNFTF9DSEVDSzsKKwl9CisKKwkvKioKKwkgKiBHZXQgdGhlIG1vbml0b3Igd2hpY2ggaXMgdXNlZCB0byB1cGRhdGUgb24gb3V0cHV0IHByb2dyZXNzIGFuZCBjaGVjaworCSAqIGNhbmNlbC4KKwkgKgorCSAqIEByZXR1cm4gdGhlIG1vbml0b3IKKwkgKi8KKwlwdWJsaWMgZmluYWwgUHJvZ3Jlc3NNb25pdG9yIGdldFdyaXRlTW9uaXRvcigpIHsKKwkJcmV0dXJuIHdyaXRlTW9uaXRvcjsKKwl9CisKKwkvKioKKwkgKiBPYnRhaW4gdGhlIGN1cnJlbnQgU0hBLTEgZGlnZXN0LgorCSAqCisJICogQHJldHVybiBTSEEtMSBkaWdlc3QKKwkgKi8KKwlwdWJsaWMgZmluYWwgYnl0ZVtdIGdldERpZ2VzdCgpIHsKKwkJcmV0dXJuIG1kLmRpZ2VzdCgpOworCX0KKworCS8qKgorCSAqIEdldCB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiBzaW5jZSBzdHJlYW0gc3RhcnQuCisJICoKKwkgKiBAcmV0dXJuIHRvdGFsIG51bWJlciBvZiBieXRlcyB3cml0dGVuIHNpbmNlIHN0cmVhbSBzdGFydC4KKwkgKi8KKwlwdWJsaWMgZmluYWwgbG9uZyBsZW5ndGgoKSB7CisJCXJldHVybiBjb3VudDsKKwl9CisKKwkvKioge0Bpbmhlcml0RG9jfSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlKGludCBiKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlpZiAoY2hlY2tDYW5jZWxBdCA8PSBjb3VudCkgeworCQkJaWYgKHdyaXRlTW9uaXRvci5pc0NhbmNlbGxlZCgpKSB7CisJCQkJdGhyb3cgbmV3IEludGVycnVwdGVkSU9FeGNlcHRpb24oKTsKKwkJCX0KKwkJCWNoZWNrQ2FuY2VsQXQgPSBjb3VudCArIEJZVEVTX1RPX1dSSVRFX0JFRk9SRV9DQU5DRUxfQ0hFQ0s7CisJCX0KKworCQlvdXQud3JpdGUoYik7CisJCW1kLnVwZGF0ZSgoYnl0ZSkgYik7CisJCWNvdW50Kys7CisJfQorCisJLyoqIHtAaW5oZXJpdERvY30gKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgZmluYWwgdm9pZCB3cml0ZShieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJd2hpbGUgKDAgPCBsZW4pIHsKKwkJCWlmIChjaGVja0NhbmNlbEF0IDw9IGNvdW50KSB7CisJCQkJaWYgKHdyaXRlTW9uaXRvci5pc0NhbmNlbGxlZCgpKSB7CisJCQkJCXRocm93IG5ldyBJbnRlcnJ1cHRlZElPRXhjZXB0aW9uKCk7CisJCQkJfQorCQkJCWNoZWNrQ2FuY2VsQXQgPSBjb3VudCArIEJZVEVTX1RPX1dSSVRFX0JFRk9SRV9DQU5DRUxfQ0hFQ0s7CisJCQl9CisKKwkJCWludCBuID0gTWF0aC5taW4obGVuLCBCWVRFU19UT19XUklURV9CRUZPUkVfQ0FOQ0VMX0NIRUNLKTsKKwkJCW91dC53cml0ZShiLCBvZmYsIG4pOworCQkJbWQudXBkYXRlKGIsIG9mZiwgbik7CisJCQljb3VudCArPSBuOworCisJCQlvZmYgKz0gbjsKKwkJCWxlbiAtPSBuOworCQl9CisJfQorCisJLyoqIHtAaW5oZXJpdERvY30gKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBmbHVzaCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCW91dC5mbHVzaCgpOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9wYWNrL1BhY2tPdXRwdXRTdHJlYW0uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9wYWNrL1BhY2tPdXRwdXRTdHJlYW0uamF2YQppbmRleCA3MTA0Yjk0Li4yZDBmZTI4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvcGFjay9QYWNrT3V0cHV0U3RyZWFtLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL3BhY2svUGFja091dHB1dFN0cmVhbS5qYXZhCkBAIC0xNywxMCArMTcsOCBAQAogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnNlY3VyaXR5Lk1lc3NhZ2VEaWdlc3Q7CiAKLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLkpHaXRUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuaW8uQ2FuY2VsbGFibGVEaWdlc3RPdXRwdXRTdHJlYW07CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUHJvZ3Jlc3NNb25pdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5OQjsKIApAQCAtMjgsMjUgKzI2LDE0IEBACiAgKiBDdXN0b20gb3V0cHV0IHN0cmVhbSB0byBzdXBwb3J0CiAgKiB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnBhY2suUGFja1dyaXRlcn0uCiAgKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBQYWNrT3V0cHV0U3RyZWFtIGV4dGVuZHMgT3V0cHV0U3RyZWFtIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQllURVNfVE9fV1JJVEVfQkVGT1JFX0NBTkNFTF9DSEVDSyA9IDEyOCAqIDEwMjQ7Ci0KLQlwcml2YXRlIGZpbmFsIFByb2dyZXNzTW9uaXRvciB3cml0ZU1vbml0b3I7Ci0KLQlwcml2YXRlIGZpbmFsIE91dHB1dFN0cmVhbSBvdXQ7CitwdWJsaWMgZmluYWwgY2xhc3MgUGFja091dHB1dFN0cmVhbSBleHRlbmRzIENhbmNlbGxhYmxlRGlnZXN0T3V0cHV0U3RyZWFtIHsKIAogCXByaXZhdGUgZmluYWwgUGFja1dyaXRlciBwYWNrV3JpdGVyOwogCi0JcHJpdmF0ZSBmaW5hbCBNZXNzYWdlRGlnZXN0IG1kID0gQ29uc3RhbnRzLm5ld01lc3NhZ2VEaWdlc3QoKTsKLQotCXByaXZhdGUgbG9uZyBjb3VudDsKLQogCXByaXZhdGUgZmluYWwgYnl0ZVtdIGhlYWRlckJ1ZmZlciA9IG5ldyBieXRlWzMyXTsKIAogCXByaXZhdGUgZmluYWwgYnl0ZVtdIGNvcHlCdWZmZXIgPSBuZXcgYnl0ZVs2NCA8PCAxMF07CiAKLQlwcml2YXRlIGxvbmcgY2hlY2tDYW5jZWxBdDsKLQogCXByaXZhdGUgYm9vbGVhbiBvZnNEZWx0YTsKIAogCS8qKgpAQCAtNjYsNDggKzUzLDggQEAgcHVibGljIGZpbmFsIGNsYXNzIFBhY2tPdXRwdXRTdHJlYW0gZXh0ZW5kcyBPdXRwdXRTdHJlYW0gewogCSAqLwogCXB1YmxpYyBQYWNrT3V0cHV0U3RyZWFtKGZpbmFsIFByb2dyZXNzTW9uaXRvciB3cml0ZU1vbml0b3IsCiAJCQlmaW5hbCBPdXRwdXRTdHJlYW0gb3V0LCBmaW5hbCBQYWNrV3JpdGVyIHB3KSB7Ci0JCXRoaXMud3JpdGVNb25pdG9yID0gd3JpdGVNb25pdG9yOwotCQl0aGlzLm91dCA9IG91dDsKKwkJc3VwZXIod3JpdGVNb25pdG9yLCBvdXQpOwogCQl0aGlzLnBhY2tXcml0ZXIgPSBwdzsKLQkJdGhpcy5jaGVja0NhbmNlbEF0ID0gQllURVNfVE9fV1JJVEVfQkVGT1JFX0NBTkNFTF9DSEVDSzsKLQl9Ci0KLQkvKioge0Bpbmhlcml0RG9jfSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlKGludCBiKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQljb3VudCsrOwotCQlvdXQud3JpdGUoYik7Ci0JCW1kLnVwZGF0ZSgoYnl0ZSkgYik7Ci0JfQotCi0JLyoqIHtAaW5oZXJpdERvY30gKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgZmluYWwgdm9pZCB3cml0ZShieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbikKLQkJCXRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXdoaWxlICgwIDwgbGVuKSB7Ci0JCQlmaW5hbCBpbnQgbiA9IE1hdGgubWluKGxlbiwgQllURVNfVE9fV1JJVEVfQkVGT1JFX0NBTkNFTF9DSEVDSyk7Ci0JCQljb3VudCArPSBuOwotCi0JCQlpZiAoY2hlY2tDYW5jZWxBdCA8PSBjb3VudCkgewotCQkJCWlmICh3cml0ZU1vbml0b3IuaXNDYW5jZWxsZWQoKSkgewotCQkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oCi0JCQkJCQkJSkdpdFRleHQuZ2V0KCkucGFja2luZ0NhbmNlbGxlZER1cmluZ09iamVjdHNXcml0aW5nKTsKLQkJCQl9Ci0JCQkJY2hlY2tDYW5jZWxBdCA9IGNvdW50ICsgQllURVNfVE9fV1JJVEVfQkVGT1JFX0NBTkNFTF9DSEVDSzsKLQkJCX0KLQotCQkJb3V0LndyaXRlKGIsIG9mZiwgbik7Ci0JCQltZC51cGRhdGUoYiwgb2ZmLCBuKTsKLQotCQkJb2ZmICs9IG47Ci0JCQlsZW4gLT0gbjsKLQkJfQotCX0KLQotCS8qKiB7QGluaGVyaXREb2N9ICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmx1c2goKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlvdXQuZmx1c2goKTsKIAl9CiAKIAlmaW5hbCB2b2lkIHdyaXRlRmlsZUhlYWRlcihpbnQgdmVyc2lvbiwgbG9uZyBvYmplY3RDb3VudCkKQEAgLTE2MCw3ICsxMDcsNyBAQCBwdWJsaWMgZmluYWwgdm9pZCB3cml0ZUhlYWRlcihPYmplY3RUb1BhY2sgb3RwLCBsb25nIHJhd0xlbmd0aCkKIAkJT2JqZWN0VG9QYWNrIGIgPSBvdHAuZ2V0RGVsdGFCYXNlKCk7CiAJCWlmIChiICE9IG51bGwgJiYgKGIuaXNXcml0dGVuKCkgJiBvZnNEZWx0YSkpIHsgLy8gTm9uLXNob3J0LWNpcmN1aXQgbG9naWMgaXMgaW50ZW50aW9uYWwKIAkJCWludCBuID0gb2JqZWN0SGVhZGVyKHJhd0xlbmd0aCwgT0JKX09GU19ERUxUQSwgaGVhZGVyQnVmZmVyKTsKLQkJCW4gPSBvZnNEZWx0YShjb3VudCAtIGIuZ2V0T2Zmc2V0KCksIGhlYWRlckJ1ZmZlciwgbik7CisJCQluID0gb2ZzRGVsdGEobGVuZ3RoKCkgLSBiLmdldE9mZnNldCgpLCBoZWFkZXJCdWZmZXIsIG4pOwogCQkJd3JpdGUoaGVhZGVyQnVmZmVyLCAwLCBuKTsKIAkJfSBlbHNlIGlmIChvdHAuaXNEZWx0YVJlcHJlc2VudGF0aW9uKCkpIHsKIAkJCWludCBuID0gb2JqZWN0SGVhZGVyKHJhd0xlbmd0aCwgT0JKX1JFRl9ERUxUQSwgaGVhZGVyQnVmZmVyKTsKQEAgLTIwOSwyMCArMTU2LDYgQEAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IG9mc0RlbHRhVmFySW50TGVuZ3RoKGxvbmcgdikgewogCX0KIAogCXZvaWQgZW5kT2JqZWN0KCkgewotCQl3cml0ZU1vbml0b3IudXBkYXRlKDEpOwotCX0KLQotCS8qKgotCSAqIEdldCB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiBzaW5jZSBzdHJlYW0gc3RhcnQuCi0JICoKLQkgKiBAcmV0dXJuIHRvdGFsIG51bWJlciBvZiBieXRlcyB3cml0dGVuIHNpbmNlIHN0cmVhbSBzdGFydC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgbG9uZyBsZW5ndGgoKSB7Ci0JCXJldHVybiBjb3VudDsKLQl9Ci0KLQkvKiogQHJldHVybiBvYnRhaW4gdGhlIGN1cnJlbnQgU0hBLTEgZGlnZXN0LiAqLwotCWZpbmFsIGJ5dGVbXSBnZXREaWdlc3QoKSB7Ci0JCXJldHVybiBtZC5kaWdlc3QoKTsKKwkJZ2V0V3JpdGVNb25pdG9yKCkudXBkYXRlKDEpOwogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvdHJhbnNwb3J0L3NzaC9PcGVuU3NoQ29uZmlnRmlsZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoL09wZW5Tc2hDb25maWdGaWxlLmphdmEKaW5kZXggNjQ4ZDRhMS4uNjU5Y2NiOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoL09wZW5Tc2hDb25maWdGaWxlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoL09wZW5Tc2hDb25maWdGaWxlLmphdmEKQEAgLTUwMiw2ICs1MDIsOTggQEAgcHVibGljIHN0YXRpYyBib29sZWFuIGZsYWcoU3RyaW5nIHZhbHVlKSB7CiAJfQogCiAJLyoqCisJICogQ29udmVydHMgYW4gT3BlblNTSCB0aW1lIHZhbHVlIGludG8gYSBudW1iZXIgb2Ygc2Vjb25kcy4gVGhlIGZvcm1hdCBpcworCSAqIGRlZmluZWQgYnkgT3BlblNTSCBhcyBhIHNlcXVlbmNlIG9mIChwb3NpdGl2ZSkgaW50ZWdlcnMgd2l0aCBzdWZmaXhlcyBmb3IKKwkgKiBzZWNvbmRzLCBtaW51dGVzLCBob3VycywgZGF5cywgYW5kIHdlZWtzLgorCSAqCisJICogQHBhcmFtIHZhbHVlCisJICogICAgICAgICAgICB0byBjb252ZXJ0CisJICogQHJldHVybiB0aGUgcGFyc2VkIHZhbHVlIGFzIGEgbnVtYmVyIG9mIHNlY29uZHMsIG9yIC0xIGlmIHRoZSB2YWx1ZSBpcworCSAqICAgICAgICAgbm90IGEgdmFsaWQgT3BlblNTSCB0aW1lIHZhbHVlCisJICogQHNlZSA8YSBocmVmPSJodHRwczovL21hbi5vcGVuYnNkLm9yZy9zc2hkX2NvbmZpZy41I1RJTUVfRk9STUFUUyI+T3BlbkJTRAorCSAqICAgICAgbWFuIDUgc3NoZF9jb25maWcsIHNlY3Rpb24gVElNRSBGT1JNQVRTPC9hPgorCSAqLworCXB1YmxpYyBzdGF0aWMgaW50IHRpbWVTcGVjKFN0cmluZyB2YWx1ZSkgeworCQlpZiAodmFsdWUgPT0gbnVsbCkgeworCQkJcmV0dXJuIC0xOworCQl9CisJCXRyeSB7CisJCQlpbnQgbGVuZ3RoID0gdmFsdWUubGVuZ3RoKCk7CisJCQlpbnQgaSA9IDA7CisJCQlpbnQgc2Vjb25kcyA9IDA7CisJCQlib29sZWFuIHZhbHVlU2VlbiA9IGZhbHNlOworCQkJd2hpbGUgKGkgPCBsZW5ndGgpIHsKKwkJCQkvLyBTa2lwIHdoaXRlc3BhY2UKKwkJCQljaGFyIGNoID0gdmFsdWUuY2hhckF0KGkpOworCQkJCWlmIChDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGNoKSkgeworCQkJCQlpKys7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQlpZiAoY2ggPT0gJysnKSB7CisJCQkJCS8vIE9wZW5TU0ggdXNlcyBzdHJ0b2wgd2l0aCBiYXNlIDEwOiBhIGxlYWRpbmcgcGx1cyBzaWduIGlzCisJCQkJCS8vIGFsbG93ZWQuCisJCQkJCWkrKzsKKwkJCQl9CisJCQkJaW50IHZhbCA9IDA7CisJCQkJaW50IGogPSBpOworCQkJCXdoaWxlIChqIDwgbGVuZ3RoKSB7CisJCQkJCWNoID0gdmFsdWUuY2hhckF0KGorKyk7CisJCQkJCWlmIChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKSB7CisJCQkJCQl2YWwgPSBNYXRoLmFkZEV4YWN0KE1hdGgubXVsdGlwbHlFeGFjdCh2YWwsIDEwKSwKKwkJCQkJCQkJY2ggLSAnMCcpOworCQkJCQl9IGVsc2UgeworCQkJCQkJai0tOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQkJaWYgKGkgPT0gaikgeworCQkJCQkvLyBObyBkaWdpdHMgc2VlbgorCQkJCQlyZXR1cm4gLTE7CisJCQkJfQorCQkJCWkgPSBqOworCQkJCWludCBtdWx0aXBsaWVyID0gMTsKKwkJCQlpZiAoaSA8IGxlbmd0aCkgeworCQkJCQljaCA9IHZhbHVlLmNoYXJBdChpKyspOworCQkJCQlzd2l0Y2ggKGNoKSB7CisJCQkJCWNhc2UgJ3MnOgorCQkJCQljYXNlICdTJzoKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlICdtJzoKKwkJCQkJY2FzZSAnTSc6CisJCQkJCQltdWx0aXBsaWVyID0gNjA7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSAnaCc6CisJCQkJCWNhc2UgJ0gnOgorCQkJCQkJbXVsdGlwbGllciA9IDM2MDA7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSAnZCc6CisJCQkJCWNhc2UgJ0QnOgorCQkJCQkJbXVsdGlwbGllciA9IDI0ICogMzYwMDsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlICd3JzoKKwkJCQkJY2FzZSAnVyc6CisJCQkJCQltdWx0aXBsaWVyID0gNyAqIDI0ICogMzYwMDsKKwkJCQkJCWJyZWFrOworCQkJCQlkZWZhdWx0OgorCQkJCQkJaWYgKENoYXJhY3Rlci5pc1doaXRlc3BhY2UoY2gpKSB7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCQkvLyBJbnZhbGlkIHRpbWUgc3BlYworCQkJCQkJcmV0dXJuIC0xOworCQkJCQl9CisJCQkJfQorCQkJCXNlY29uZHMgPSBNYXRoLmFkZEV4YWN0KHNlY29uZHMsCisJCQkJCQlNYXRoLm11bHRpcGx5RXhhY3QodmFsLCBtdWx0aXBsaWVyKSk7CisJCQkJdmFsdWVTZWVuID0gdHJ1ZTsKKwkJCX0KKwkJCXJldHVybiB2YWx1ZVNlZW4gPyBzZWNvbmRzIDogLTE7CisJCX0gY2F0Y2ggKEFyaXRobWV0aWNFeGNlcHRpb24gZSkgeworCQkJLy8gT3ZlcmZsb3cKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCS8qKgogCSAqIFJldHJpZXZlcyB0aGUgbG9jYWwgdXNlciBuYW1lIGFzIGdpdmVuIGluIHRoZSBjb25zdHJ1Y3Rvci4KIAkgKgogCSAqIEByZXR1cm4gdGhlIHVzZXIgbmFtZQpAQCAtNTQ5LDYgKzY0MSw3IEBAIHB1YmxpYyBzdGF0aWMgY2xhc3MgSG9zdEVudHJ5IGltcGxlbWVudHMgU3NoQ29uZmlnU3RvcmUuSG9zdENvbmZpZyB7CiAJCQlMSVNUX0tFWVMuYWRkKFNzaENvbnN0YW50cy5HTE9CQUxfS05PV05fSE9TVFNfRklMRSk7CiAJCQlMSVNUX0tFWVMuYWRkKFNzaENvbnN0YW50cy5TRU5EX0VOVik7CiAJCQlMSVNUX0tFWVMuYWRkKFNzaENvbnN0YW50cy5VU0VSX0tOT1dOX0hPU1RTX0ZJTEUpOworCQkJTElTVF9LRVlTLmFkZChTc2hDb25zdGFudHMuQUREX0tFWVNfVE9fQUdFTlQpOyAvLyBjb25maXJtIHRpbWVTcGVjCiAJCX0KIAogCQkvKioKQEAgLTg3MSw3ICs5NjQsOCBAQCB2b2lkIHN1YnN0aXR1dGUoU3RyaW5nIG9yaWdpbmFsSG9zdE5hbWUsIGludCBwb3J0LCBTdHJpbmcgdXNlck5hbWUsCiAJCQlpZiAob3B0aW9ucyAhPSBudWxsKSB7CiAJCQkJLy8gSE9TVE5BTUUgYWxyZWFkeSBkb25lIGFib3ZlCiAJCQkJU3RyaW5nIHZhbHVlID0gb3B0aW9ucy5nZXQoU3NoQ29uc3RhbnRzLklERU5USVRZX0FHRU5UKTsKLQkJCQlpZiAodmFsdWUgIT0gbnVsbCkgeworCQkJCWlmICh2YWx1ZSAhPSBudWxsICYmICFTc2hDb25zdGFudHMuTk9ORS5lcXVhbHModmFsdWUpCisJCQkJCQkmJiAhU3NoQ29uc3RhbnRzLkVOVl9TU0hfQVVUSF9TT0NLRVQuZXF1YWxzKHZhbHVlKSkgewogCQkJCQl2YWx1ZSA9IHIuc3Vic3RpdHV0ZSh2YWx1ZSwgUmVwbGFjZXIuREVGQVVMVF9UT0tFTlMsIHRydWUpOwogCQkJCQl2YWx1ZSA9IHRvRmlsZSh2YWx1ZSwgaG9tZSkuZ2V0UGF0aCgpOwogCQkJCQlvcHRpb25zLnB1dChTc2hDb25zdGFudHMuSURFTlRJVFlfQUdFTlQsIHZhbHVlKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0FiYnJldkNvbmZpZy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQWJicmV2Q29uZmlnLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTEwOWNmZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0FiYnJldkNvbmZpZy5qYXZhCkBAIC0wLDAgKzEsMTUwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIyLCAgTWF0dGhpYXMgU29obiA8bWF0dGhpYXMuc29obkBzYXAuY29tPiBhbmQgb3RoZXJzCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmxpYjsKKworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuT0JKRUNUX0lEX0FCQlJFVl9TVFJJTkdfTEVOR1RIOworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5UeXBlZENvbmZpZ0dldHRlci5VTlNFVF9JTlQ7CisKK2ltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9ycy5JbnZhbGlkQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLkpHaXRUZXh0OworCisvKioKKyAqIEdpdCBjb25maWd1cmF0aW9uIG9wdGlvbiA8YQorICogaHJlZj1odHRwczovL2dpdC1zY20uY29tL2RvY3MvZ2l0LWNvbmZpZyNEb2N1bWVudGF0aW9uL2dpdC1jb25maWcudHh0LWNvcmVhYmJyZXYiPgorICogY29yZS5hYmJyZXY8L2E+CisgKgorICogQHNpbmNlIDYuMQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQWJicmV2Q29uZmlnIHsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfTk8gPSAibm8iOyAvLyROT04tTkxTLTEkCisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfQVVUTyA9ICJhdXRvIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogVGhlIG1pbmltdW0gdmFsdWUgb2YgYWJicmV2CisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUlOX0FCQlJFViA9IDQ7CisKKwkvKioKKwkgKiBDYXAgY29uZmlndXJlZCBjb3JlLmFiYnJldiB0byByYW5nZSBiZXR3ZWVuIG1pbmltdW0gb2YgNCBhbmQgbnVtYmVyIG9mCisJICogaGV4LWRpZ2l0cyBvZiBhIGZ1bGwgb2JqZWN0IGlkLgorCSAqCisJICogQHBhcmFtIGxlbgorCSAqICAgICAgICAgICAgY29uZmlndXJlZCBudW1iZXIgb2YgaGV4LWRpZ2l0cyB0byBhYmJyZXZpYXRlIG9iamVjdCBpZHMgdG8KKwkgKiBAcmV0dXJuIGNvcmUuYWJicmV2IGNhcHBlZCB0byByYW5nZSBiZXR3ZWVuIG1pbmltdW0gb2YgNCBhbmQgbnVtYmVyIG9mCisJICogICAgICAgICBoZXgtZGlnaXRzIG9mIGEgZnVsbCBvYmplY3QgaWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGludCBjYXBBYmJyZXYoaW50IGxlbikgeworCQlyZXR1cm4gTWF0aC5taW4oTWF0aC5tYXgoTUlOX0FCQlJFViwgbGVuKSwKKwkJCQlDb25zdGFudHMuT0JKRUNUX0lEX1NUUklOR19MRU5HVEgpOworCX0KKworCS8qKgorCSAqIE5vIGFiYnJldmlhdGlvbgorCSAqLworCXB1YmxpYyBmaW5hbCBzdGF0aWMgQWJicmV2Q29uZmlnIE5PID0gbmV3IEFiYnJldkNvbmZpZygKKwkJCUNvbnN0YW50cy5PQkpFQ1RfSURfU1RSSU5HX0xFTkdUSCk7CisKKwkvKioKKwkgKiBQYXJzZSBzdHJpbmcgdmFsdWUgb2YgY29yZS5hYmJyZXYgZ2l0IG9wdGlvbiBmb3IgYSBnaXZlbiByZXBvc2l0b3J5CisJICoKKwkgKiBAcGFyYW0gcmVwbworCSAqICAgICAgICAgICAgcmVwb3NpdG9yeQorCSAqIEByZXR1cm4gdGhlIHBhcnNlZCBBYmJyZXZDb25maWcKKwkgKiBAdGhyb3dzIEludmFsaWRDb25maWd1cmF0aW9uRXhjZXB0aW9uCisJICogICAgICAgICAgICAgaWYgdmFsdWUgb2YgY29yZS5hYmJyZXYgaXMgaW52YWxpZAorCSAqLworCXB1YmxpYyBzdGF0aWMgQWJicmV2Q29uZmlnIHBhcnNlRnJvbUNvbmZpZyhSZXBvc2l0b3J5IHJlcG8pCisJCQl0aHJvd3MgSW52YWxpZENvbmZpZ3VyYXRpb25FeGNlcHRpb24geworCQlDb25maWcgY29uZmlnID0gcmVwby5nZXRDb25maWcoKTsKKwkJU3RyaW5nIHZhbHVlID0gY29uZmlnLmdldFN0cmluZyhDb25maWdDb25zdGFudHMuQ09ORklHX0NPUkVfU0VDVElPTiwKKwkJCQludWxsLCBDb25maWdDb25zdGFudHMuQ09ORklHX0tFWV9BQkJSRVYpOworCQlpZiAodmFsdWUgPT0gbnVsbCB8fCB2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKFZBTFVFX0FVVE8pKSB7CisJCQlyZXR1cm4gYXV0byhyZXBvKTsKKwkJfQorCQlpZiAodmFsdWUuZXF1YWxzSWdub3JlQ2FzZShWQUxVRV9OTykpIHsKKwkJCXJldHVybiBOTzsKKwkJfQorCQl0cnkgeworCQkJaW50IGxlbiA9IGNvbmZpZy5nZXRJbnRJblJhbmdlKENvbmZpZ0NvbnN0YW50cy5DT05GSUdfQ09SRV9TRUNUSU9OLAorCQkJCQlDb25maWdDb25zdGFudHMuQ09ORklHX0tFWV9BQkJSRVYsIE1JTl9BQkJSRVYsCisJCQkJCUNvbnN0YW50cy5PQkpFQ1RfSURfU1RSSU5HX0xFTkdUSCwgVU5TRVRfSU5UKTsKKwkJCWlmIChsZW4gPT0gVU5TRVRfSU5UKSB7CisJCQkJLy8gVW5zZXQgd2FzIGNoZWNrZWQgYWJvdmUuIElmIHdlIGdldCBVTlNFVF9JTlQgaGVyZSwgdGhlbgorCQkJCS8vIGVpdGhlciB0aGUgdmFsdWUgd2FzIFVOU0VUX0lOVCwgb3IgaXQgd2FzIGFuIGludmFsaWQgdmFsdWUKKwkJCQkvLyAobm90IGFuIGludGVnZXIsIG9yIG91dCBvZiByYW5nZSksIGFuZCBFR2l0J3MKKwkJCQkvLyBSZXBvcnRpbmdUeXBlZEdldHRlciBjYXVnaHQgdGhlIGV4Y2VwdGlvbiBhbmQgaGFzIGxvZ2dlZCBhCisJCQkJLy8gd2FybmluZy4gSW4gZWl0aGVyIGNhc2Ugd2Ugc2hvdWxkIGZhbGwgYmFjayB0byBzb21lIHNhbmUKKwkJCQkvLyBkZWZhdWx0LgorCQkJCWxlbiA9IE9CSkVDVF9JRF9BQkJSRVZfU1RSSU5HX0xFTkdUSDsKKwkJCX0KKwkJCXJldHVybiBuZXcgQWJicmV2Q29uZmlnKGxlbik7CisJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgSW52YWxpZENvbmZpZ3VyYXRpb25FeGNlcHRpb24oTWVzc2FnZUZvcm1hdAorCQkJCQkuZm9ybWF0KEpHaXRUZXh0LmdldCgpLmludmFsaWRDb3JlQWJicmV2LCB2YWx1ZSksIGUpOworCQl9CisJfQorCisJLyoqCisJICogQW4gYXBwcm9wcmlhdGUgdmFsdWUgaXMgY29tcHV0ZWQgYmFzZWQgb24gdGhlIGFwcHJveGltYXRlIG51bWJlciBvZgorCSAqIHBhY2tlZCBvYmplY3RzIGluIGEgcmVwb3NpdG9yeSwgd2hpY2ggaG9wZWZ1bGx5IGlzIGVub3VnaCBmb3IgYWJicmV2aWF0ZWQKKwkgKiBvYmplY3QgbmFtZXMgdG8gc3RheSB1bmlxdWUgZm9yIHNvbWUgdGltZS4KKwkgKgorCSAqIEBwYXJhbSByZXBvCisJICogQHJldHVybiBhcHByb3ByaWF0ZSB2YWx1ZSBjb21wdXRlZCBiYXNlZCBvbiB0aGUgYXBwcm94aW1hdGUgbnVtYmVyIG9mCisJICogICAgICAgICBwYWNrZWQgb2JqZWN0cyBpbiBhIHJlcG9zaXRvcnkKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBBYmJyZXZDb25maWcgYXV0byhSZXBvc2l0b3J5IHJlcG8pIHsKKwkJbG9uZyBjb3VudCA9IHJlcG8uZ2V0T2JqZWN0RGF0YWJhc2UoKS5nZXRBcHByb3hpbWF0ZU9iamVjdENvdW50KCk7CisJCWlmIChjb3VudCA9PSAtMSkgeworCQkJcmV0dXJuIG5ldyBBYmJyZXZDb25maWcoT0JKRUNUX0lEX0FCQlJFVl9TVFJJTkdfTEVOR1RIKTsKKwkJfQorCQkvLyBmaW5kIG1zYiwgcm91bmQgdG8gbmV4dCBwb3dlciBvZiAyCisJCWludCBsZW4gPSA2MyAtIExvbmcubnVtYmVyT2ZMZWFkaW5nWmVyb3MoY291bnQpICsgMTsKKwkJLy8gV2l0aCB0aGUgb3JkZXIgb2YgMl5sZW4gb2JqZWN0cywgd2UgZXhwZWN0IGEgY29sbGlzaW9uIGF0CisJCS8vIDJeKGxlbi8yKS4gQnV0IHdlIGFsc28gY2FyZSBhYm91dCBoZXggY2hhcnMsIG5vdCBiaXRzLCBhbmQKKwkJLy8gdGhlcmUgYXJlIDQgYml0cyBwZXIgaGV4LiBTbyBhbGwgdG9nZXRoZXIgd2UgbmVlZCB0byBkaXZpZGUKKwkJLy8gYnkgMjsgYnV0IHdlIGFsc28gd2FudCB0byByb3VuZCBvZGQgbnVtYmVycyB1cCwgaGVuY2UgYWRkaW5nCisJCS8vIG9uZSBiZWZvcmUgZGl2aWRpbmcuCisJCWxlbiA9IChsZW4gKyAxKSAvIDI7CisJCS8vIGZvciBzbWFsbCByZXBvcyB1c2UgYXQgbGVhc3QgZmFsbGJhY2sgbGVuZ3RoCisJCXJldHVybiBuZXcgQWJicmV2Q29uZmlnKE1hdGgubWF4KGxlbiwgT0JKRUNUX0lEX0FCQlJFVl9TVFJJTkdfTEVOR1RIKSk7CisJfQorCisJLyoqCisJICogQWxsIG90aGVyIHBvc3NpYmxlIGFiYnJldmlhdGlvbiBsZW5ndGhzLiBWYWxpZCByYW5nZSA0IHRvIG51bWJlciBvZgorCSAqIGhleC1kaWdpdHMgb2YgYW4gdW5hYmJyZXZpYXRlZCBvYmplY3QgaWQgKDQwIGZvciBTSEExIG9iamVjdCBpZHMsIGpnaXQKKwkgKiBkb2Vzbid0IHN1cHBvcnQgU0hBMjU2IHlldCkuCisJICovCisJcHJpdmF0ZSBpbnQgYWJicmV2OworCisJLyoqCisJICogQHBhcmFtIGFiYnJldgorCSAqLworCXByaXZhdGUgQWJicmV2Q29uZmlnKGludCBhYmJyZXYpIHsKKwkJdGhpcy5hYmJyZXYgPSBjYXBBYmJyZXYoYWJicmV2KTsKKwl9CisKKwkvKioKKwkgKiBHZXQgdGhlIGNvbmZpZ3VyZWQgYWJicmV2aWF0aW9uIGxlbmd0aCBmb3Igb2JqZWN0IGlkcy4KKwkgKgorCSAqIEByZXR1cm4gdGhlIGNvbmZpZ3VyZWQgYWJicmV2aWF0aW9uIGxlbmd0aCBmb3Igb2JqZWN0IGlkcworCSAqLworCXB1YmxpYyBpbnQgZ2V0KCkgeworCQlyZXR1cm4gYWJicmV2OworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiBJbnRlZ2VyLnRvU3RyaW5nKGFiYnJldik7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0JyYW5jaENvbmZpZy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQnJhbmNoQ29uZmlnLmphdmEKaW5kZXggNmRhNmYxMi4uYWE2MTNkMCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQnJhbmNoQ29uZmlnLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQnJhbmNoQ29uZmlnLmphdmEKQEAgLTEzOCw2ICsxMzgsMTggQEAgcHVibGljIFN0cmluZyBnZXRSZW1vdGUoKSB7CiAJfQogCiAJLyoqCisJICogR2V0IHRoZSByZW1vdGUgdGhpcyBicmFuY2ggaXMgY29uZmlndXJlZCB0byBwdXNoIHRvLgorCSAqCisJICogQHJldHVybiB0aGUgcmVtb3RlIHRoaXMgYnJhbmNoIGlzIGNvbmZpZ3VyZWQgdG8gcHVzaCB0bywgb3Ige0Bjb2RlIG51bGx9CisJICogICAgICAgICBpZiBub3QgZGVmaW5lZAorCSAqIEBzaW5jZSA2LjEKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFB1c2hSZW1vdGUoKSB7CisJCXJldHVybiBjb25maWcuZ2V0U3RyaW5nKENvbmZpZ0NvbnN0YW50cy5DT05GSUdfQlJBTkNIX1NFQ1RJT04sCisJCQkJYnJhbmNoTmFtZSwgQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19LRVlfUFVTSF9SRU1PVEUpOworCX0KKworCS8qKgogCSAqIEdldCB0aGUgbmFtZSBvZiB0aGUgdXBzdHJlYW0gYnJhbmNoIGFzIGl0IGlzIGNhbGxlZCBvbiB0aGUgcmVtb3RlCiAJICoKIAkgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSB1cHN0cmVhbSBicmFuY2ggYXMgaXQgaXMgY2FsbGVkIG9uIHRoZSByZW1vdGUsIG9yCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9Db21taXRDb25maWcuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0NvbW1pdENvbmZpZy5qYXZhCmluZGV4IDIyZTFmOTguLjU1Y2MwMjYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0NvbW1pdENvbmZpZy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0NvbW1pdENvbmZpZy5qYXZhCkBAIC0xOCwxMSArMTgsMTMgQEAKIGltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CiBpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5VbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb247CiBpbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYW5ub3RhdGlvbnMuTm9uTnVsbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFubm90YXRpb25zLk51bGxhYmxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLkNvbmZpZ0ludmFsaWRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5KR2l0VGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWcuQ29uZmlnRW51bTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWcuU2VjdGlvblBhcnNlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuRlM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLklPOwpAQCAtMzQsMjIgKzM2LDc2IEBACiAgKiBAc2luY2UgNS4xMwogICovCiBwdWJsaWMgY2xhc3MgQ29tbWl0Q29uZmlnIHsKKwogCS8qKgogCSAqIEtleSBmb3Ige0BsaW5rIENvbmZpZyNnZXQoU2VjdGlvblBhcnNlcil9LgogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29uZmlnLlNlY3Rpb25QYXJzZXI8Q29tbWl0Q29uZmlnPiBLRVkgPSBDb21taXRDb25maWc6Om5ldzsKIAorCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDVVQgPSAiIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSA+OCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIEhvdyB0byBjbGVhbiB1cCBjb21taXQgbWVzc2FnZXMgd2hlbiBjb21taXR0aW5nLgorCSAqCisJICogQHNpbmNlIDYuMQorCSAqLworCXB1YmxpYyBlbnVtIENsZWFudXBNb2RlIGltcGxlbWVudHMgQ29uZmlnRW51bSB7CisKKwkJLyoqCisJCSAqIHtAbGluayAjV0hJVEVTUEFDRX0sIGFkZGl0aW9uYWxseSByZW1vdmUgY29tbWVudCBsaW5lcy4KKwkJICovCisJCVNUUklQLAorCisJCS8qKgorCQkgKiBSZW1vdmUgdHJhaWxpbmcgd2hpdGVzcGFjZSBhbmQgbGVhZGluZyBhbmQgdHJhaWxpbmcgZW1wdHkgbGluZXM7CisJCSAqIGNvbGxhcHNlIG11bHRpcGxlIGVtcHR5IGxpbmVzIHRvIGEgc2luZ2xlIG9uZS4KKwkJICovCisJCVdISVRFU1BBQ0UsCisKKwkJLyoqCisJCSAqIE1ha2Ugbm8gY2hhbmdlcy4KKwkJICovCisJCVZFUkJBVElNLAorCisJCS8qKgorCQkgKiBPbWl0IGV2ZXJ5dGhpbmcgZnJvbSB0aGUgZmlyc3QgInNjaXNzb3IiIGxpbmUgb24sIHRoZW4gYXBwbHkKKwkJICoge0BsaW5rICNXSElURVNQQUNFfS4KKwkJICovCisJCVNDSVNTT1JTLAorCisJCS8qKgorCQkgKiBVc2Uge0BsaW5rICNTVFJJUH0gZm9yIHVzZXItZWRpdGVkIG1lc3NhZ2VzLCBvdGhlcndpc2UKKwkJICoge0BsaW5rICNXSElURVNQQUNFfSwgdW5sZXNzIG92ZXJyaWRkZW4gYnkgYSBnaXQgY29uZmlnIHNldHRpbmcgb3RoZXIKKwkJICogdGhhbiBERUZBVUxULgorCQkgKi8KKwkJREVGQVVMVDsKKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIFN0cmluZyB0b0NvbmZpZ1ZhbHVlKCkgeworCQkJcmV0dXJuIG5hbWUoKS50b0xvd2VyQ2FzZShMb2NhbGUuUk9PVCk7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIGJvb2xlYW4gbWF0Y2hDb25maWdWYWx1ZShTdHJpbmcgaW4pIHsKKwkJCXJldHVybiB0b0NvbmZpZ1ZhbHVlKCkuZXF1YWxzKGluKTsKKwkJfQorCX0KKwogCXByaXZhdGUgZmluYWwgc3RhdGljIENoYXJzZXQgREVGQVVMVF9DT01NSVRfTUVTU0FHRV9FTkNPRElORyA9IFN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CiAKIAlwcml2YXRlIFN0cmluZyBpMThuQ29tbWl0RW5jb2Rpbmc7CiAKIAlwcml2YXRlIFN0cmluZyBjb21taXRUZW1wbGF0ZVBhdGg7CiAKKwlwcml2YXRlIENsZWFudXBNb2RlIGNsZWFudXBNb2RlOworCiAJcHJpdmF0ZSBDb21taXRDb25maWcoQ29uZmlnIHJjKSB7CiAJCWNvbW1pdFRlbXBsYXRlUGF0aCA9IHJjLmdldFN0cmluZyhDb25maWdDb25zdGFudHMuQ09ORklHX0NPTU1JVF9TRUNUSU9OLAogCQkJCW51bGwsIENvbmZpZ0NvbnN0YW50cy5DT05GSUdfS0VZX0NPTU1JVF9URU1QTEFURSk7CiAJCWkxOG5Db21taXRFbmNvZGluZyA9IHJjLmdldFN0cmluZyhDb25maWdDb25zdGFudHMuQ09ORklHX1NFQ1RJT05fSTE4TiwKIAkJCQludWxsLCBDb25maWdDb25zdGFudHMuQ09ORklHX0tFWV9DT01NSVRfRU5DT0RJTkcpOworCQljbGVhbnVwTW9kZSA9IHJjLmdldEVudW0oQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19DT01NSVRfU0VDVElPTiwgbnVsbCwKKwkJCQlDb25maWdDb25zdGFudHMuQ09ORklHX0tFWV9DTEVBTlVQLCBDbGVhbnVwTW9kZS5ERUZBVUxUKTsKIAl9CiAKIAkvKioKQEAgLTc1LDYgKzEzMSw0OCBAQCBwdWJsaWMgU3RyaW5nIGdldENvbW1pdEVuY29kaW5nKCkgewogCX0KIAogCS8qKgorCSAqIFJldHJpZXZlcyB0aGUge0BsaW5rIENsZWFudXBNb2RlfSBhcyBnaXZlbiBieSBnaXQgY29uZmlnCisJICoge0Bjb2RlIGNvbW1pdC5jbGVhbnVwfS4KKwkgKgorCSAqIEByZXR1cm4gdGhlIHtAbGluayBDbGVhbnVwTW9kZX07IHtAbGluayBDbGVhbnVwTW9kZSNERUZBVUxUfSBpZiB0aGUgZ2l0CisJICogICAgICAgICBjb25maWcgaXMgbm90IHNldAorCSAqIEBzaW5jZSA2LjEKKwkgKi8KKwlATm9uTnVsbAorCXB1YmxpYyBDbGVhbnVwTW9kZSBnZXRDbGVhbnVwTW9kZSgpIHsKKwkJcmV0dXJuIGNsZWFudXBNb2RlOworCX0KKworCS8qKgorCSAqIENvbXB1dGVzIGEgbm9uLWRlZmF1bHQge0BsaW5rIENsZWFudXBNb2RlfSBmcm9tIHRoZSBnaXZlbiBtb2RlIGFuZCB0aGUKKwkgKiBnaXQgY29uZmlnLgorCSAqCisJICogQHBhcmFtIG1vZGUKKwkgKiAgICAgICAgICAgIHtAbGluayBDbGVhbnVwTW9kZX0gdG8gcmVzb2x2ZQorCSAqIEBwYXJhbSBkZWZhdWx0U3RyaXAKKwkgKiAgICAgICAgICAgIGlmIHtAY29kZSB0cnVlfSByZXR1cm4ge0BsaW5rIENsZWFudXBNb2RlI1NUUklQfSBpZiB0aGUgZ2l0CisJICogICAgICAgICAgICBjb25maWcgaXMgYWxzbyAiZGVmYXVsdCIsIG90aGVyd2lzZSByZXR1cm4KKwkgKiAgICAgICAgICAgIHtAbGluayBDbGVhbnVwTW9kZSNXSElURVNQQUNFfQorCSAqIEByZXR1cm4gdGhlIHtAY29kZSBtb2RlfSwgaWYgaXQgaXMgbm90IHtAbGluayBDbGVhbnVwTW9kZSNERUZBVUxUfSwKKwkgKiAgICAgICAgIG90aGVyd2lzZSB0aGUgcmVzb2x2ZWQgbW9kZSwgd2hpY2ggaXMgbmV2ZXIKKwkgKiAgICAgICAgIHtAbGluayBDbGVhbnVwTW9kZSNERUZBVUxUfQorCSAqIEBzaW5jZSA2LjEKKwkgKi8KKwlATm9uTnVsbAorCXB1YmxpYyBDbGVhbnVwTW9kZSByZXNvbHZlKEBOb25OdWxsIENsZWFudXBNb2RlIG1vZGUsCisJCQlib29sZWFuIGRlZmF1bHRTdHJpcCkgeworCQlpZiAoQ2xlYW51cE1vZGUuREVGQVVMVCA9PSBtb2RlKSB7CisJCQlDbGVhbnVwTW9kZSBkZWZhdWx0TW9kZSA9IGdldENsZWFudXBNb2RlKCk7CisJCQlpZiAoQ2xlYW51cE1vZGUuREVGQVVMVCA9PSBkZWZhdWx0TW9kZSkgeworCQkJCXJldHVybiBkZWZhdWx0U3RyaXAgPyBDbGVhbnVwTW9kZS5TVFJJUAorCQkJCQkJOiBDbGVhbnVwTW9kZS5XSElURVNQQUNFOworCQkJfQorCQkJcmV0dXJuIGRlZmF1bHRNb2RlOworCQl9CisJCXJldHVybiBtb2RlOworCX0KKworCS8qKgogCSAqIEdldCB0aGUgY29udGVudCB0byB0aGUgY29tbWl0IHRlbXBsYXRlIGFzIGRlZmluZWQgaW4KIAkgKiB7QGNvZGUgY29tbWl0LnRlbXBsYXRlfS4gSWYgbm8ge0Bjb2RlIGkxOG4uY29tbWl0RW5jb2Rpbmd9IGlzIHNwZWNpZmllZCwKIAkgKiBVVEYtOCBmYWxsYmFjayBpcyB1c2VkLgpAQCAtMTM1LDQgKzIzMyw4NiBAQCBwcml2YXRlIENoYXJzZXQgZ2V0RW5jb2RpbmcoKSB0aHJvd3MgQ29uZmlnSW52YWxpZEV4Y2VwdGlvbiB7CiAKIAkJcmV0dXJuIGNvbW1pdE1lc3NhZ2VFbmNvZGluZzsKIAl9CisKKwkvKioKKwkgKiBQcm9jZXNzZXMgYSB0ZXh0IGFjY29yZGluZyB0byB0aGUgZ2l2ZW4ge0BsaW5rIENsZWFudXBNb2RlfS4KKwkgKgorCSAqIEBwYXJhbSB0ZXh0CisJICogICAgICAgICAgICB0ZXh0IHRvIHByb2Nlc3MKKwkgKiBAcGFyYW0gbW9kZQorCSAqICAgICAgICAgICAge0BsaW5rIENsZWFudXBNb2RlfSB0byB1c2UKKwkgKiBAcGFyYW0gY29tbWVudENoYXIKKwkgKiAgICAgICAgICAgIGNvbW1lbnQgY2hhcmFjdGVyIChub3JtYWxseSB7QGNvZGUgI30pIHRvIHVzZSBpZiB7QGNvZGUgbW9kZX0KKwkgKiAgICAgICAgICAgIGlzIHtAbGluayBDbGVhbnVwTW9kZSNTVFJJUH0gb3Ige0BsaW5rIENsZWFudXBNb2RlI1NDSVNTT1JTfQorCSAqIEByZXR1cm4gdGhlIHByb2Nlc3NlZCB0ZXh0CisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKwkgKiAgICAgICAgICAgICBpZiB7QGNvZGUgbW9kZX0gaXMge0BsaW5rIENsZWFudXBNb2RlI0RFRkFVTFR9ICh1c2UKKwkgKiAgICAgICAgICAgICB7QGxpbmsgI3Jlc29sdmUoQ2xlYW51cE1vZGUsIGJvb2xlYW4pfSBmaXJzdCkKKwkgKiBAc2luY2UgNi4xCisJICovCisJcHVibGljIHN0YXRpYyBTdHJpbmcgY2xlYW5UZXh0KEBOb25OdWxsIFN0cmluZyB0ZXh0LAorCQkJQE5vbk51bGwgQ2xlYW51cE1vZGUgbW9kZSwgY2hhciBjb21tZW50Q2hhcikgeworCQlTdHJpbmcgdG9Qcm9jZXNzID0gdGV4dDsKKwkJYm9vbGVhbiBzdHJpcCA9IGZhbHNlOworCQlzd2l0Y2ggKG1vZGUpIHsKKwkJY2FzZSBWRVJCQVRJTToKKwkJCXJldHVybiB0ZXh0OworCQljYXNlIFNDSVNTT1JTOgorCQkJU3RyaW5nIGN1dCA9IGNvbW1lbnRDaGFyICsgQ1VUOworCQkJaWYgKHRleHQuc3RhcnRzV2l0aChjdXQpKSB7CisJCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCisJCQl9CisJCQlpbnQgY3V0UG9zID0gdGV4dC5pbmRleE9mKCdcbicgKyBjdXQpOworCQkJaWYgKGN1dFBvcyA+PSAwKSB7CisJCQkJdG9Qcm9jZXNzID0gdGV4dC5zdWJzdHJpbmcoMCwgY3V0UG9zICsgMSk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBTVFJJUDoKKwkJCXN0cmlwID0gdHJ1ZTsKKwkJCWJyZWFrOworCQljYXNlIFdISVRFU1BBQ0U6CisJCQlicmVhazsKKwkJY2FzZSBERUZBVUxUOgorCQlkZWZhdWx0OgorCQkJLy8gSW50ZXJuYWwgZXJyb3I7IG5vIHRyYW5zbGF0aW9uCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIGNsZWFuLXVwIG1vZGUgIiArIG1vZGUpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJLy8gV0hJVEVTUEFDRQorCQlTdHJpbmdCdWlsZGVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisJCWJvb2xlYW4gbGFzdFdhc0VtcHR5ID0gdHJ1ZTsKKwkJZm9yIChTdHJpbmcgbGluZSA6IHRvUHJvY2Vzcy5zcGxpdCgiXG4iKSkgeyAvLyROT04tTkxTLTEkCisJCQlsaW5lID0gbGluZS5zdHJpcFRyYWlsaW5nKCk7CisJCQlpZiAobGluZS5pc0VtcHR5KCkpIHsKKwkJCQlpZiAoIWxhc3RXYXNFbXB0eSkgeworCQkJCQlyZXN1bHQuYXBwZW5kKCdcbicpOworCQkJCQlsYXN0V2FzRW1wdHkgPSB0cnVlOworCQkJCX0KKwkJCX0gZWxzZSBpZiAoIXN0cmlwIHx8ICFpc0NvbW1lbnQobGluZSwgY29tbWVudENoYXIpKSB7CisJCQkJbGFzdFdhc0VtcHR5ID0gZmFsc2U7CisJCQkJcmVzdWx0LmFwcGVuZChsaW5lKS5hcHBlbmQoJ1xuJyk7CisJCQl9CisJCX0KKwkJaW50IGJ1ZmZlclNpemUgPSByZXN1bHQubGVuZ3RoKCk7CisJCWlmIChsYXN0V2FzRW1wdHkgJiYgYnVmZmVyU2l6ZSA+IDApIHsKKwkJCWJ1ZmZlclNpemUtLTsKKwkJCXJlc3VsdC5zZXRMZW5ndGgoYnVmZmVyU2l6ZSk7CisJCX0KKwkJaWYgKGJ1ZmZlclNpemUgPiAwICYmICF0b1Byb2Nlc3MuZW5kc1dpdGgoIlxuIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJaWYgKHJlc3VsdC5jaGFyQXQoYnVmZmVyU2l6ZSAtIDEpID09ICdcbicpIHsKKwkJCQlyZXN1bHQuc2V0TGVuZ3RoKGJ1ZmZlclNpemUgLSAxKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0NvbW1lbnQoU3RyaW5nIHRleHQsIGNoYXIgY29tbWVudENoYXIpIHsKKwkJaW50IGxlbiA9IHRleHQubGVuZ3RoKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKwkJCWNoYXIgY2ggPSB0ZXh0LmNoYXJBdChpKTsKKwkJCWlmICghQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShjaCkpIHsKKwkJCQlyZXR1cm4gY2ggPT0gY29tbWVudENoYXI7CisJCQl9CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9Db25maWcuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0NvbmZpZy5qYXZhCmluZGV4IDFjZTNlMzEuLmQxZDY2ZDIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0NvbmZpZy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0NvbmZpZy5qYXZhCkBAIC0yNzgsNiArMjc4LDU0IEBAIHB1YmxpYyBpbnQgZ2V0SW50KGZpbmFsIFN0cmluZyBzZWN0aW9uLCBTdHJpbmcgc3Vic2VjdGlvbiwKIAl9CiAKIAkvKioKKwkgKiBPYnRhaW4gYW4gaW50ZWdlciB2YWx1ZSBmcm9tIHRoZSBjb25maWd1cmF0aW9uIHdoaWNoIG11c3QgYmUgaW5zaWRlIGdpdmVuCisJICogcmFuZ2UuCisJICoKKwkgKiBAcGFyYW0gc2VjdGlvbgorCSAqICAgICAgICAgICAgc2VjdGlvbiB0aGUga2V5IGlzIGdyb3VwZWQgd2l0aGluLgorCSAqIEBwYXJhbSBuYW1lCisJICogICAgICAgICAgICBuYW1lIG9mIHRoZSBrZXkgdG8gZ2V0LgorCSAqIEBwYXJhbSBtaW5WYWx1ZQorCSAqICAgICAgICAgICAgbWluaW11bSB2YWx1ZQorCSAqIEBwYXJhbSBtYXhWYWx1ZQorCSAqICAgICAgICAgICAgbWF4aW11bSB2YWx1ZQorCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUKKwkgKiAgICAgICAgICAgIGRlZmF1bHQgdmFsdWUgdG8gcmV0dXJuIGlmIG5vIHZhbHVlIHdhcyBwcmVzZW50LgorCSAqIEByZXR1cm4gYW4gaW50ZWdlciB2YWx1ZSBmcm9tIHRoZSBjb25maWd1cmF0aW9uLCBvciBkZWZhdWx0VmFsdWUuCisJICogQHNpbmNlIDYuMQorCSAqLworCXB1YmxpYyBpbnQgZ2V0SW50SW5SYW5nZShTdHJpbmcgc2VjdGlvbiwgU3RyaW5nIG5hbWUsIGludCBtaW5WYWx1ZSwKKwkJCWludCBtYXhWYWx1ZSwgaW50IGRlZmF1bHRWYWx1ZSkgeworCQlyZXR1cm4gdHlwZWRHZXR0ZXIuZ2V0SW50SW5SYW5nZSh0aGlzLCBzZWN0aW9uLCBudWxsLCBuYW1lLCBtaW5WYWx1ZSwKKwkJCQltYXhWYWx1ZSwgZGVmYXVsdFZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiBPYnRhaW4gYW4gaW50ZWdlciB2YWx1ZSBmcm9tIHRoZSBjb25maWd1cmF0aW9uIHdoaWNoIG11c3QgYmUgaW5zaWRlIGdpdmVuCisJICogcmFuZ2UuCisJICoKKwkgKiBAcGFyYW0gc2VjdGlvbgorCSAqICAgICAgICAgICAgc2VjdGlvbiB0aGUga2V5IGlzIGdyb3VwZWQgd2l0aGluLgorCSAqIEBwYXJhbSBzdWJzZWN0aW9uCisJICogICAgICAgICAgICBzdWJzZWN0aW9uIG5hbWUsIHN1Y2ggYSByZW1vdGUgb3IgYnJhbmNoIG5hbWUuCisJICogQHBhcmFtIG5hbWUKKwkgKiAgICAgICAgICAgIG5hbWUgb2YgdGhlIGtleSB0byBnZXQuCisJICogQHBhcmFtIG1pblZhbHVlCisJICogICAgICAgICAgICBtaW5pbXVtIHZhbHVlCisJICogQHBhcmFtIG1heFZhbHVlCisJICogICAgICAgICAgICBtYXhpbXVtIHZhbHVlCisJICogQHBhcmFtIGRlZmF1bHRWYWx1ZQorCSAqICAgICAgICAgICAgZGVmYXVsdCB2YWx1ZSB0byByZXR1cm4gaWYgbm8gdmFsdWUgd2FzIHByZXNlbnQuCisJICogQHJldHVybiBhbiBpbnRlZ2VyIHZhbHVlIGZyb20gdGhlIGNvbmZpZ3VyYXRpb24sIG9yIGRlZmF1bHRWYWx1ZS4KKwkgKiBAc2luY2UgNi4xCisJICovCisJcHVibGljIGludCBnZXRJbnRJblJhbmdlKFN0cmluZyBzZWN0aW9uLCBTdHJpbmcgc3Vic2VjdGlvbiwgU3RyaW5nIG5hbWUsCisJCQlpbnQgbWluVmFsdWUsIGludCBtYXhWYWx1ZSwgaW50IGRlZmF1bHRWYWx1ZSkgeworCQlyZXR1cm4gdHlwZWRHZXR0ZXIuZ2V0SW50SW5SYW5nZSh0aGlzLCBzZWN0aW9uLCBzdWJzZWN0aW9uLCBuYW1lLAorCQkJCW1pblZhbHVlLCBtYXhWYWx1ZSwgZGVmYXVsdFZhbHVlKTsKKwl9CisKKwkvKioKIAkgKiBPYnRhaW4gYW4gaW50ZWdlciB2YWx1ZSBmcm9tIHRoZSBjb25maWd1cmF0aW9uLgogCSAqCiAJICogQHBhcmFtIHNlY3Rpb24KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0NvbmZpZ0NvbnN0YW50cy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQ29uZmlnQ29uc3RhbnRzLmphdmEKaW5kZXggMjRlZWJjNi4uODBkNzIwYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQ29uZmlnQ29uc3RhbnRzLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQ29uZmlnQ29uc3RhbnRzLmphdmEKQEAgLTEsNyArMSw4IEBACiAvKgogICogQ29weXJpZ2h0IChDKSAyMDEwLCBNYXRoaWFzIEtpbnpsZXIgPG1hdGhpYXMua2luemxlckBzYXAuY29tPgogICogQ29weXJpZ2h0IChDKSAyMDEwLCBDaHJpcyBBbmlzemN6eWsgPGNhbmlzemN6eWtAZ21haWwuY29tPgotICogQ29weXJpZ2h0IChDKSAyMDEyLCAyMDIwLCBSb2JpbiBSb3NlbmJlcmcgYW5kIG90aGVycworICogQ29weXJpZ2h0IChDKSAyMDEyLTIwMTMsIFJvYmluIFJvc2VuYmVyZworICogQ29weXJpZ2h0IChDKSAyMDE4LTIwMjEsIEFuZHJlIEJvc3NlcnQgPGFuZHJlLmJvc3NlcnRAc2llbWVucy5jb20+IGFuZCBvdGhlcnMKICAqCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKQEAgLTI5LDYgKzMwLDQ4IEBAIHB1YmxpYyBmaW5hbCBjbGFzcyBDb25maWdDb25zdGFudHMgewogCS8qKiBUaGUgImRpZmYiIHNlY3Rpb24gKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdfRElGRl9TRUNUSU9OID0gImRpZmYiOwogCisJLyoqCisJICogVGhlICJ0b29sIiBrZXkgd2l0aGluICJkaWZmIiBzZWN0aW9uCisJICoKKwkgKiBAc2luY2UgNi4xCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHX0tFWV9UT09MID0gInRvb2wiOworCisJLyoqCisJICogVGhlICJndWl0b29sIiBrZXkgd2l0aGluICJkaWZmIiBzZWN0aW9uCisJICoKKwkgKiBAc2luY2UgNi4xCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHX0tFWV9HVUlUT09MID0gImd1aXRvb2wiOworCisJLyoqCisJICogVGhlICJkaWZmdG9vbCIgc2VjdGlvbgorCSAqCisJICogQHNpbmNlIDYuMQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR19ESUZGVE9PTF9TRUNUSU9OID0gImRpZmZ0b29sIjsKKworCS8qKgorCSAqIFRoZSAicHJvbXB0IiBrZXkgd2l0aGluICJkaWZmdG9vbCIgc2VjdGlvbgorCSAqCisJICogQHNpbmNlIDYuMQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR19LRVlfUFJPTVBUID0gInByb21wdCI7CisKKwkvKioKKwkgKiBUaGUgInRydXN0RXhpdENvZGUiIGtleSB3aXRoaW4gImRpZmZ0b29sIiBzZWN0aW9uCisJICoKKwkgKiBAc2luY2UgNi4xCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHX0tFWV9UUlVTVF9FWElUX0NPREUgPSAidHJ1c3RFeGl0Q29kZSI7CisKKwkvKioKKwkgKiBUaGUgImNtZCIga2V5IHdpdGhpbiAiZGlmZnRvb2wuKi4iIHNlY3Rpb24KKwkgKgorCSAqIEBzaW5jZSA2LjEKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdfS0VZX0NNRCA9ICJjbWQiOworCiAJLyoqIFRoZSAiZGZzIiBzZWN0aW9uICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHX0RGU19TRUNUSU9OID0gImRmcyI7CiAKQEAgLTEzOSw2ICsxODIsMTMgQEAgcHVibGljIGZpbmFsIGNsYXNzIENvbmZpZ0NvbnN0YW50cyB7CiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHX1RBR19TRUNUSU9OID0gInRhZyI7CiAKIAkvKioKKwkgKiBUaGUgImNsZWFudXAiIGtleQorCSAqCisJICogQHNpbmNlIDYuMQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR19LRVlfQ0xFQU5VUCA9ICJjbGVhbnVwIjsKKworCS8qKgogCSAqIFRoZSAiZ3BnU2lnbiIga2V5CiAJICoKIAkgKiBAc2luY2UgNS4yCkBAIC0yNzksNiArMzI5LDIwIEBAIHB1YmxpYyBmaW5hbCBjbGFzcyBDb25maWdDb25zdGFudHMgewogCS8qKiBUaGUgInJlbW90ZSIga2V5ICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHX0tFWV9SRU1PVEUgPSAicmVtb3RlIjsKIAorCS8qKgorCSAqIFRoZSAicHVzaFJlbW90ZSIga2V5LgorCSAqCisJICogQHNpbmNlIDYuMQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR19LRVlfUFVTSF9SRU1PVEUgPSAicHVzaFJlbW90ZSI7CisKKwkvKioKKwkgKiBUaGUgInB1c2hEZWZhdWx0IiBrZXkuCisJICoKKwkgKiBAc2luY2UgNi4xCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHX0tFWV9QVVNIX0RFRkFVTFQgPSAicHVzaERlZmF1bHQiOworCiAJLyoqIFRoZSAibWVyZ2UiIGtleSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR19LRVlfTUVSR0UgPSAibWVyZ2UiOwogCkBAIC03NTgsNCArODIyLDI1IEBAIHB1YmxpYyBmaW5hbCBjbGFzcyBDb25maWdDb25zdGFudHMgewogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR19LRVlfU0VBUkNIX0ZPUl9SRVVTRV9USU1FT1VUID0gInNlYXJjaGZvcnJldXNldGltZW91dCI7CiAKKwkvKioKKwkgKiBUaGUgInB1c2giIHNlY3Rpb24uCisJICoKKwkgKiBAc2luY2UgNi4xCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHX1BVU0hfU0VDVElPTiA9ICJwdXNoIjsKKworCS8qKgorCSAqIFRoZSAiZGVmYXVsdCIga2V5LgorCSAqCisJICogQHNpbmNlIDYuMQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR19LRVlfREVGQVVMVCA9ICJkZWZhdWx0IjsKKworCS8qKgorCSAqIFRoZSAiYWJicmV2IiBrZXkKKwkgKgorCSAqIEBzaW5jZSA2LjEKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdfS0VZX0FCQlJFViA9ICJhYmJyZXYiOworCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9Db25zdGFudHMuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0NvbnN0YW50cy5qYXZhCmluZGV4IDkyMzY3ZWIuLmNmMmU2OWQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0NvbnN0YW50cy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0NvbnN0YW50cy5qYXZhCkBAIC00OCw2ICs0OCwxNSBAQCBwdWJsaWMgZmluYWwgY2xhc3MgQ29uc3RhbnRzIHsKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPQkpFQ1RfSURfU1RSSU5HX0xFTkdUSCA9IE9CSkVDVF9JRF9MRU5HVEggKiAyOwogCisJLyoqCisJICogVGhlIGhpc3RvcmljIGxlbmd0aCBvZiBhbiBhYmJyZXZpYXRlZCBHaXQgb2JqZWN0IGhhc2ggc3RyaW5nLiBHaXQgMi4xMQorCSAqIGNoYW5nZWQgdGhpcyBzdGF0aWMgbnVtYmVyIHRvIGEgZHluYW1pY2FsbHkgY2FsY3VsYXRlZCBvbmUgdGhhdCBzY2FsZXMKKwkgKiBhcyB0aGUgcmVwb3NpdG9yeSBncm93cy4KKwkgKgorCSAqIEBzaW5jZSA2LjEKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPQkpFQ1RfSURfQUJCUkVWX1NUUklOR19MRU5HVEggPSA3OworCiAJLyoqIFNwZWNpYWwgbmFtZSBmb3IgdGhlICJIRUFEIiBzeW1ib2xpYy1yZWYuICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBRCA9ICJIRUFEIjsKIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvRGVmYXVsdFR5cGVkQ29uZmlnR2V0dGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9EZWZhdWx0VHlwZWRDb25maWdHZXR0ZXIuamF2YQppbmRleCA5Zjk2YmNlLi44NjQwOTQwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9EZWZhdWx0VHlwZWRDb25maWdHZXR0ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9EZWZhdWx0VHlwZWRDb25maWdHZXR0ZXIuamF2YQpAQCAtMTIwLDYgKzEyMCwyNiBAQCBwdWJsaWMgaW50IGdldEludChDb25maWcgY29uZmlnLCBTdHJpbmcgc2VjdGlvbiwgU3RyaW5nIHN1YnNlY3Rpb24sCiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgZ2V0SW50SW5SYW5nZShDb25maWcgY29uZmlnLCBTdHJpbmcgc2VjdGlvbiwgU3RyaW5nIHN1YnNlY3Rpb24sCisJCQlTdHJpbmcgbmFtZSwgaW50IG1pblZhbHVlLCBpbnQgbWF4VmFsdWUsIGludCBkZWZhdWx0VmFsdWUpIHsKKwkJaW50IHZhbCA9IGdldEludChjb25maWcsIHNlY3Rpb24sIHN1YnNlY3Rpb24sIG5hbWUsIGRlZmF1bHRWYWx1ZSk7CisJCWlmICgodmFsID49IG1pblZhbHVlICYmIHZhbCA8PSBtYXhWYWx1ZSkgfHwgdmFsID09IFVOU0VUX0lOVCkgeworCQkJcmV0dXJuIHZhbDsKKwkJfQorCQlpZiAoc3Vic2VjdGlvbiA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAorCQkJCQlKR2l0VGV4dC5nZXQoKS5pbnRlZ2VyVmFsdWVOb3RJblJhbmdlLCBzZWN0aW9uLCBuYW1lLAorCQkJCQlJbnRlZ2VyLnZhbHVlT2YodmFsKSwgSW50ZWdlci52YWx1ZU9mKG1pblZhbHVlKSwKKwkJCQkJSW50ZWdlci52YWx1ZU9mKG1heFZhbHVlKSkpOworCQl9CisJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoCisJCQkJSkdpdFRleHQuZ2V0KCkuaW50ZWdlclZhbHVlTm90SW5SYW5nZVN1YlNlY3Rpb24sIHNlY3Rpb24sCisJCQkJc3Vic2VjdGlvbiwgbmFtZSwgSW50ZWdlci52YWx1ZU9mKHZhbCksCisJCQkJSW50ZWdlci52YWx1ZU9mKG1pblZhbHVlKSwgSW50ZWdlci52YWx1ZU9mKG1heFZhbHVlKSkpOworCX0KKworCS8qKiB7QGluaGVyaXREb2N9ICovCisJQE92ZXJyaWRlCiAJcHVibGljIGxvbmcgZ2V0TG9uZyhDb25maWcgY29uZmlnLCBTdHJpbmcgc2VjdGlvbiwgU3RyaW5nIHN1YnNlY3Rpb24sCiAJCQlTdHJpbmcgbmFtZSwgbG9uZyBkZWZhdWx0VmFsdWUpIHsKIAkJZmluYWwgU3RyaW5nIHN0ciA9IGNvbmZpZy5nZXRTdHJpbmcoc2VjdGlvbiwgc3Vic2VjdGlvbiwgbmFtZSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9JbmRleERpZmYuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0luZGV4RGlmZi5qYXZhCmluZGV4IDI4ZWE5MjcuLmRmOWZkNDcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0luZGV4RGlmZi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0luZGV4RGlmZi5qYXZhCkBAIC01NjgsNiArNTY4LDkgQEAgcHVibGljIGJvb2xlYW4gZGlmZihQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgaW50IGVzdFdvcmtUcmVlU2l6ZSwKIAkJaWYgKGlnbm9yZVN1Ym1vZHVsZU1vZGUgIT0gSWdub3JlU3VibW9kdWxlTW9kZS5BTEwpIHsKIAkJCXRyeSAoU3VibW9kdWxlV2FsayBzbXcgPSBuZXcgU3VibW9kdWxlV2FsayhyZXBvc2l0b3J5KSkgewogCQkJCXNtdy5zZXRUcmVlKG5ldyBEaXJDYWNoZUl0ZXJhdG9yKGRpckNhY2hlKSk7CisJCQkJaWYgKGZpbHRlciAhPSBudWxsKSB7CisJCQkJCXNtdy5zZXRGaWx0ZXIoZmlsdGVyKTsKKwkJCQl9CiAJCQkJc213LnNldEJ1aWxkZXJGYWN0b3J5KGZhY3RvcnkpOwogCQkJCXdoaWxlIChzbXcubmV4dCgpKSB7CiAJCQkJCUlnbm9yZVN1Ym1vZHVsZU1vZGUgbG9jYWxJZ25vcmVTdWJtb2R1bGVNb2RlID0gaWdub3JlU3VibW9kdWxlTW9kZTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL09iamVjdERhdGFiYXNlLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9PYmplY3REYXRhYmFzZS5qYXZhCmluZGV4IDA0MjYyYzAuLjcwMDA5Y2IgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL09iamVjdERhdGFiYXNlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvT2JqZWN0RGF0YWJhc2UuamF2YQpAQCAtMTU1LDQgKzE1NSwxNCBAQCBwdWJsaWMgT2JqZWN0TG9hZGVyIG9wZW4oQW55T2JqZWN0SWQgb2JqZWN0SWQsIGludCB0eXBlSGludCkKIAlwdWJsaWMgT2JqZWN0RGF0YWJhc2UgbmV3Q2FjaGVkRGF0YWJhc2UoKSB7CiAJCXJldHVybiB0aGlzOwogCX0KKworCS8qKgorCSAqIEdldCBhIHF1aWNrLCByb3VnaCBjb3VudCBvZiBvYmplY3RzIGluIHRoaXMgcmVwb3NpdG9yeS4gSWdub3JlcyBsb29zZQorCSAqIG9iamVjdHMuIFJldHVybnMge0Bjb2RlIC0xfSBpZiBhbiBleGNlcHRpb24gb2NjdXJzLgorCSAqCisJICogQHJldHVybiBxdWljaywgcm91Z2ggY291bnQgb2Ygb2JqZWN0cyBpbiB0aGlzIHJlcG9zaXRvcnksIHtAY29kZSAtMX0gaWYKKwkgKiAgICAgICAgIGFuIGV4Y2VwdGlvbiBvY2N1cnMKKwkgKiBAc2luY2UgNi4xCisJICovCisJcHVibGljIGFic3RyYWN0IGxvbmcgZ2V0QXBwcm94aW1hdGVPYmplY3RDb3VudCgpOwogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvT2JqZWN0UmVhZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9PYmplY3RSZWFkZXIuamF2YQppbmRleCBhMmM3MzgxLi4yNmMzZmY2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9PYmplY3RSZWFkZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9PYmplY3RSZWFkZXIuamF2YQpAQCAtMTAsNiArMTAsOCBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQubGliOwogCitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5PQkpFQ1RfSURfQUJCUkVWX1NUUklOR19MRU5HVEg7CisKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CkBAIC03Niw3ICs3OCw3IEBAIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBPYmplY3RSZWFkZXIgaW1wbGVtZW50cyBBdXRvQ2xvc2VhYmxlIHsKIAkgKi8KIAlwdWJsaWMgQWJicmV2aWF0ZWRPYmplY3RJZCBhYmJyZXZpYXRlKEFueU9iamVjdElkIG9iamVjdElkKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGFiYnJldmlhdGUob2JqZWN0SWQsIDcpOworCQlyZXR1cm4gYWJicmV2aWF0ZShvYmplY3RJZCwgT0JKRUNUX0lEX0FCQlJFVl9TVFJJTkdfTEVOR1RIKTsKIAl9CiAKIAkvKioKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL1BlcnNvbklkZW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9QZXJzb25JZGVudC5qYXZhCmluZGV4IDQyOGE2YjkuLjkzNzEwMjkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL1BlcnNvbklkZW50LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvUGVyc29uSWRlbnQuamF2YQpAQCAtMTQsNiArMTQsOCBAQAogCiBpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CiBpbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7CitpbXBvcnQgamF2YS50aW1lLkluc3RhbnQ7CitpbXBvcnQgamF2YS50aW1lLlpvbmVJZDsKIGltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKIGltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwogaW1wb3J0IGphdmEudXRpbC5UaW1lWm9uZTsKQEAgLTIwNiw2ICsyMDgsMjAgQEAgcHVibGljIFBlcnNvbklkZW50KFBlcnNvbklkZW50IHBpLCBEYXRlIGFXaGVuKSB7CiAJfQogCiAJLyoqCisJICogQ29weSBhIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5QZXJzb25JZGVudH0sIGJ1dCBhbHRlciB0aGUgY2xvbmUncworCSAqIHRpbWUgc3RhbXAKKwkgKgorCSAqIEBwYXJhbSBwaQorCSAqICAgICAgICAgICAgb3JpZ2luYWwge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQubGliLlBlcnNvbklkZW50fQorCSAqIEBwYXJhbSBhV2hlbgorCSAqICAgICAgICAgICAgbG9jYWwgdGltZSBhcyBJbnN0YW50CisJICogQHNpbmNlIDYuMQorCSAqLworCXB1YmxpYyBQZXJzb25JZGVudChQZXJzb25JZGVudCBwaSwgSW5zdGFudCBhV2hlbikgeworCQl0aGlzKHBpLmdldE5hbWUoKSwgcGkuZ2V0RW1haWxBZGRyZXNzKCksIGFXaGVuLnRvRXBvY2hNaWxsaSgpLCBwaS50ek9mZnNldCk7CisJfQorCisJLyoqCiAJICogQ29uc3RydWN0IGEgUGVyc29uSWRlbnQgZnJvbSBzaW1wbGUgZGF0YQogCSAqCiAJICogQHBhcmFtIGFOYW1lIGEge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9IG9iamVjdC4KQEAgLTIyMiw2ICsyMzgsMjcgQEAgcHVibGljIFBlcnNvbklkZW50KGZpbmFsIFN0cmluZyBhTmFtZSwgZmluYWwgU3RyaW5nIGFFbWFpbEFkZHJlc3MsCiAJfQogCiAJLyoqCisJICogQ29uc3RydWN0IGEgUGVyc29uSWRlbnQgZnJvbSBzaW1wbGUgZGF0YQorCSAqCisJICogQHBhcmFtIGFOYW1lCisJICogICAgICAgICAgICBhIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfSBvYmplY3QuCisJICogQHBhcmFtIGFFbWFpbEFkZHJlc3MKKwkgKiAgICAgICAgICAgIGEge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9IG9iamVjdC4KKwkgKiBAcGFyYW0gYVdoZW4KKwkgKiAgICAgICAgICAgIGxvY2FsIHRpbWUgc3RhbXAKKwkgKiBAcGFyYW0gem9uZUlkCisJICogICAgICAgICAgICB0aW1lIHpvbmUgaWQKKwkgKiBAc2luY2UgNi4xCisJICovCisJcHVibGljIFBlcnNvbklkZW50KGZpbmFsIFN0cmluZyBhTmFtZSwgU3RyaW5nIGFFbWFpbEFkZHJlc3MsIEluc3RhbnQgYVdoZW4sCisJCQlab25lSWQgem9uZUlkKSB7CisJCXRoaXMoYU5hbWUsIGFFbWFpbEFkZHJlc3MsIGFXaGVuLnRvRXBvY2hNaWxsaSgpLAorCQkJCVRpbWVab25lLmdldFRpbWVab25lKHpvbmVJZCkKKwkJCQkJCS5nZXRPZmZzZXQoYVdoZW4KKwkJCQkudG9FcG9jaE1pbGxpKCkpIC8gKDYwICogMTAwMCkpOworCX0KKworCS8qKgogCSAqIENvcHkgYSBQZXJzb25JZGVudCwgYnV0IGFsdGVyIHRoZSBjbG9uZSdzIHRpbWUgc3RhbXAKIAkgKgogCSAqIEBwYXJhbSBwaQpAQCAtMzA0LDYgKzM0MSwxNiBAQCBwdWJsaWMgRGF0ZSBnZXRXaGVuKCkgewogCX0KIAogCS8qKgorCSAqIEdldCB3aGVuIGF0dHJpYnV0ZSBhcyBpbnN0YW50CisJICoKKwkgKiBAcmV0dXJuIHRpbWVzdGFtcAorCSAqIEBzaW5jZSA2LjEKKwkgKi8KKwlwdWJsaWMgSW5zdGFudCBnZXRXaGVuQXNJbnN0YW50KCkgeworCQlyZXR1cm4gSW5zdGFudC5vZkVwb2NoTWlsbGkod2hlbik7CisJfQorCisJLyoqCiAJICogR2V0IHRoaXMgcGVyc29uJ3MgZGVjbGFyZWQgdGltZSB6b25lCiAJICoKIAkgKiBAcmV0dXJuIHRoaXMgcGVyc29uJ3MgZGVjbGFyZWQgdGltZSB6b25lOyBudWxsIGlmIHRpbWUgem9uZSBpcyB1bmtub3duLgpAQCAtMzEzLDYgKzM2MCwxNiBAQCBwdWJsaWMgVGltZVpvbmUgZ2V0VGltZVpvbmUoKSB7CiAJfQogCiAJLyoqCisJICogR2V0IHRoZSB0aW1lIHpvbmUgaWQKKwkgKgorCSAqIEByZXR1cm4gdGhlIHRpbWUgem9uZSBpZAorCSAqIEBzaW5jZSA2LjEKKwkgKi8KKwlwdWJsaWMgWm9uZUlkIGdldFpvbmVJZCgpIHsKKwkJcmV0dXJuIGdldFRpbWVab25lKCkudG9ab25lSWQoKTsKKwl9CisKKwkvKioKIAkgKiBHZXQgdGhpcyBwZXJzb24ncyBkZWNsYXJlZCB0aW1lIHpvbmUgYXMgbWludXRlcyBlYXN0IG9mIFVUQy4KIAkgKgogCSAqIEByZXR1cm4gdGhpcyBwZXJzb24ncyBkZWNsYXJlZCB0aW1lIHpvbmUgYXMgbWludXRlcyBlYXN0IG9mIFVUQy4gSWYgdGhlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9UeXBlZENvbmZpZ0dldHRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvVHlwZWRDb25maWdHZXR0ZXIuamF2YQppbmRleCAwZjJmNmNmLi5jNGViOGYxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9UeXBlZENvbmZpZ0dldHRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL1R5cGVkQ29uZmlnR2V0dGVyLmphdmEKQEAgLTI5LDYgKzI5LDEzIEBACiBwdWJsaWMgaW50ZXJmYWNlIFR5cGVkQ29uZmlnR2V0dGVyIHsKIAogCS8qKgorCSAqIFVzZSB7QGNvZGUgSW50ZWdlciNNSU5fVkFMVUV9IGFzIHVuc2V0IGludCB2YWx1ZQorCSAqCisJICogQHNpbmNlIDYuMQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOU0VUX0lOVCA9IEludGVnZXIuTUlOX1ZBTFVFOworCisJLyoqCiAJICogR2V0IGEgYm9vbGVhbiB2YWx1ZSBmcm9tIGEgZ2l0IHtAbGluayBDb25maWd9LgogCSAqCiAJICogQHBhcmFtIGNvbmZpZwpAQCAtODcsNiArOTQsMzIgQEAgaW50IGdldEludChDb25maWcgY29uZmlnLCBTdHJpbmcgc2VjdGlvbiwgU3RyaW5nIHN1YnNlY3Rpb24sIFN0cmluZyBuYW1lLAogCQkJaW50IGRlZmF1bHRWYWx1ZSk7CiAKIAkvKioKKwkgKiBPYnRhaW4gYW4gaW50ZWdlciB2YWx1ZSBmcm9tIGEgZ2l0IHtAbGluayBDb25maWd9IHdoaWNoIG11c3QgYmUgaW4gZ2l2ZW4KKwkgKiByYW5nZS4KKwkgKgorCSAqIEBwYXJhbSBjb25maWcKKwkgKiAgICAgICAgICAgIHRvIGdldCB0aGUgdmFsdWUgZnJvbQorCSAqIEBwYXJhbSBzZWN0aW9uCisJICogICAgICAgICAgICBzZWN0aW9uIHRoZSBrZXkgaXMgZ3JvdXBlZCB3aXRoaW4uCisJICogQHBhcmFtIHN1YnNlY3Rpb24KKwkgKiAgICAgICAgICAgIHN1YnNlY3Rpb24gbmFtZSwgc3VjaCBhIHJlbW90ZSBvciBicmFuY2ggbmFtZS4KKwkgKiBAcGFyYW0gbmFtZQorCSAqICAgICAgICAgICAgbmFtZSBvZiB0aGUga2V5IHRvIGdldC4KKwkgKiBAcGFyYW0gbWluVmFsdWUKKwkgKiAgICAgICAgICAgIG1pbmltYWwgdmFsdWUKKwkgKiBAcGFyYW0gbWF4VmFsdWUKKwkgKiAgICAgICAgICAgIG1heGltdW0gdmFsdWUKKwkgKiBAcGFyYW0gZGVmYXVsdFZhbHVlCisJICogICAgICAgICAgICBkZWZhdWx0IHZhbHVlIHRvIHJldHVybiBpZiBubyB2YWx1ZSB3YXMgcHJlc2VudC4gVXNlCisJICogICAgICAgICAgICB7QGNvZGUgI1VOU0VUX0lOVH0gdG8gc2V0IHRoZSBkZWZhdWx0IHRvIHVuc2V0LgorCSAqIEByZXR1cm4gYW4gaW50ZWdlciB2YWx1ZSBmcm9tIHRoZSBjb25maWd1cmF0aW9uLCBvciBkZWZhdWx0VmFsdWUuCisJICogICAgICAgICB7QGNvZGUgI1VOU0VUX0lOVH0gaWYgdW5zZXQuCisJICogQHNpbmNlIDYuMQorCSAqLworCWludCBnZXRJbnRJblJhbmdlKENvbmZpZyBjb25maWcsIFN0cmluZyBzZWN0aW9uLCBTdHJpbmcgc3Vic2VjdGlvbiwKKwkJCVN0cmluZyBuYW1lLCBpbnQgbWluVmFsdWUsIGludCBtYXhWYWx1ZSwgaW50IGRlZmF1bHRWYWx1ZSk7CisKKwkvKioKIAkgKiBPYnRhaW4gYSBsb25nIHZhbHVlIGZyb20gYSBnaXQge0BsaW5rIENvbmZpZ30uCiAJICoKIAkgKiBAcGFyYW0gY29uZmlnCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9pbnRlcm5hbC9Cb29sZWFuVHJpU3RhdGUuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL2ludGVybmFsL0Jvb2xlYW5UcmlTdGF0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0ZDNiYjMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9pbnRlcm5hbC9Cb29sZWFuVHJpU3RhdGUuamF2YQpAQCAtMCwwICsxLDI4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFNpbWVvbiBBbmRyZWV2IDxzaW1lb24uZGFuYWlsb3YuYW5kcmVldkBnbWFpbC5jb20+IGFuZCBvdGhlcnMKKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQubGliLmludGVybmFsOworCisvKioKKyAqIEEgYm9vbGVhbiB2YWx1ZSB0aGF0IGNhbiBhbHNvIGhhdmUgYW4gdW5zZXQgc3RhdGUuCisgKi8KK3B1YmxpYyBlbnVtIEJvb2xlYW5UcmlTdGF0ZSB7CisJLyoqCisJICogVmFsdWUgZXF1aXZhbGVudCB0byB7QGNvZGUgdHJ1ZX0uCisJICovCisJVFJVRSwKKwkvKioKKwkgKiBWYWx1ZSBlcXVpdmFsZW50IHRvIHtAY29kZSBmYWxzZX0uCisJICovCisJRkFMU0UsCisJLyoqCisJICogVmFsdWUgaXMgbm90IHNldC4KKwkgKi8KKwlVTlNFVDsKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbWVyZ2UvTWVyZ2VNZXNzYWdlRm9ybWF0dGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L21lcmdlL01lcmdlTWVzc2FnZUZvcm1hdHRlci5qYXZhCmluZGV4IGY3OTY2YTIuLmUwYzA4M2YgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbWVyZ2UvTWVyZ2VNZXNzYWdlRm9ybWF0dGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9tZXJnZS9NZXJnZU1lc3NhZ2VGb3JtYXR0ZXIuamF2YQpAQCAtOTIsMzYgKzkyLDYyIEBAIHB1YmxpYyBTdHJpbmcgZm9ybWF0KExpc3Q8UmVmPiByZWZzVG9NZXJnZSwgUmVmIHRhcmdldCkgewogCX0KIAogCS8qKgotCSAqIEFkZCBzZWN0aW9uIHdpdGggY29uZmxpY3RpbmcgcGF0aHMgdG8gbWVyZ2UgbWVzc2FnZS4KKwkgKiBBZGQgc2VjdGlvbiB3aXRoIGNvbmZsaWN0aW5nIHBhdGhzIHRvIG1lcmdlIG1lc3NhZ2UuIExpbmVzIGFyZSBwcmVmaXhlZAorCSAqIHdpdGggYSBoYXNoLgogCSAqCiAJICogQHBhcmFtIG1lc3NhZ2UKIAkgKiAgICAgICAgICAgIHRoZSBvcmlnaW5hbCBtZXJnZSBtZXNzYWdlCiAJICogQHBhcmFtIGNvbmZsaWN0aW5nUGF0aHMKIAkgKiAgICAgICAgICAgIHRoZSBwYXRocyB3aXRoIGNvbmZsaWN0cwogCSAqIEByZXR1cm4gbWVyZ2UgbWVzc2FnZSB3aXRoIGNvbmZsaWN0aW5nIHBhdGhzIGFkZGVkCisJICogQGRlcHJlY2F0ZWQgc2luY2UgNi4xOyB1c2UKKwkgKiAgICAgICAgICAgICB7QGxpbmsgI2Zvcm1hdFdpdGhDb25mbGljdHMoU3RyaW5nLCBJdGVyYWJsZSwgY2hhcil9IGluc3RlYWQKIAkgKi8KKwlARGVwcmVjYXRlZAogCXB1YmxpYyBTdHJpbmcgZm9ybWF0V2l0aENvbmZsaWN0cyhTdHJpbmcgbWVzc2FnZSwKIAkJCUxpc3Q8U3RyaW5nPiBjb25mbGljdGluZ1BhdGhzKSB7CisJCXJldHVybiBmb3JtYXRXaXRoQ29uZmxpY3RzKG1lc3NhZ2UsIGNvbmZsaWN0aW5nUGF0aHMsICcjJyk7CisJfQorCisJLyoqCisJICogQWRkIHNlY3Rpb24gd2l0aCBjb25mbGljdGluZyBwYXRocyB0byBtZXJnZSBtZXNzYWdlLgorCSAqCisJICogQHBhcmFtIG1lc3NhZ2UKKwkgKiAgICAgICAgICAgIHRoZSBvcmlnaW5hbCBtZXJnZSBtZXNzYWdlCisJICogQHBhcmFtIGNvbmZsaWN0aW5nUGF0aHMKKwkgKiAgICAgICAgICAgIHRoZSBwYXRocyB3aXRoIGNvbmZsaWN0cworCSAqIEBwYXJhbSBjb21tZW50Q2hhcgorCSAqICAgICAgICAgICAgY29tbWVudCBjaGFyYWN0ZXIgdG8gdXNlIGZvciBwcmVmaXhpbmcgdGhlIGNvbmZsaWN0IGxpbmVzCisJICogQHJldHVybiBtZXJnZSBtZXNzYWdlIHdpdGggY29uZmxpY3RpbmcgcGF0aHMgYWRkZWQKKwkgKiBAc2luY2UgNi4xCisJICovCisJcHVibGljIFN0cmluZyBmb3JtYXRXaXRoQ29uZmxpY3RzKFN0cmluZyBtZXNzYWdlLAorCQkJSXRlcmFibGU8U3RyaW5nPiBjb25mbGljdGluZ1BhdGhzLCBjaGFyIGNvbW1lbnRDaGFyKSB7CiAJCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogCQlTdHJpbmdbXSBsaW5lcyA9IG1lc3NhZ2Uuc3BsaXQoIlxuIik7IC8vJE5PTi1OTFMtMSQKIAkJaW50IGZpcnN0Rm9vdGVyTGluZSA9IENoYW5nZUlkVXRpbC5pbmRleE9mRmlyc3RGb290ZXJMaW5lKGxpbmVzKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaXJzdEZvb3RlckxpbmU7IGkrKykKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaXJzdEZvb3RlckxpbmU7IGkrKykgewogCQkJc2IuYXBwZW5kKGxpbmVzW2ldKS5hcHBlbmQoJ1xuJyk7Ci0JCWlmIChmaXJzdEZvb3RlckxpbmUgPT0gbGluZXMubGVuZ3RoICYmIG1lc3NhZ2UubGVuZ3RoKCkgIT0gMCkKKwkJfQorCQlpZiAoZmlyc3RGb290ZXJMaW5lID09IGxpbmVzLmxlbmd0aCAmJiBtZXNzYWdlLmxlbmd0aCgpICE9IDApIHsKIAkJCXNiLmFwcGVuZCgnXG4nKTsKLQkJYWRkQ29uZmxpY3RzTWVzc2FnZShjb25mbGljdGluZ1BhdGhzLCBzYik7Ci0JCWlmIChmaXJzdEZvb3RlckxpbmUgPCBsaW5lcy5sZW5ndGgpCisJCX0KKwkJYWRkQ29uZmxpY3RzTWVzc2FnZShjb25mbGljdGluZ1BhdGhzLCBzYiwgY29tbWVudENoYXIpOworCQlpZiAoZmlyc3RGb290ZXJMaW5lIDwgbGluZXMubGVuZ3RoKSB7CiAJCQlzYi5hcHBlbmQoJ1xuJyk7Ci0JCWZvciAoaW50IGkgPSBmaXJzdEZvb3RlckxpbmU7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykKKwkJfQorCQlmb3IgKGludCBpID0gZmlyc3RGb290ZXJMaW5lOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHsKIAkJCXNiLmFwcGVuZChsaW5lc1tpXSkuYXBwZW5kKCdcbicpOworCQl9CiAJCXJldHVybiBzYi50b1N0cmluZygpOwogCX0KIAotCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkQ29uZmxpY3RzTWVzc2FnZShMaXN0PFN0cmluZz4gY29uZmxpY3RpbmdQYXRocywKLQkJCVN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKCJDb25mbGljdHM6XG4iKTsgLy8kTk9OLU5MUy0xJAorCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkQ29uZmxpY3RzTWVzc2FnZShJdGVyYWJsZTxTdHJpbmc+IGNvbmZsaWN0aW5nUGF0aHMsCisJCQlTdHJpbmdCdWlsZGVyIHNiLCBjaGFyIGNvbW1lbnRDaGFyKSB7CisJCXNiLmFwcGVuZChjb21tZW50Q2hhcikuYXBwZW5kKCIgQ29uZmxpY3RzOlxuIik7IC8vJE5PTi1OTFMtMSQKIAkJZm9yIChTdHJpbmcgY29uZmxpY3RpbmdQYXRoIDogY29uZmxpY3RpbmdQYXRocykgewotCQkJc2IuYXBwZW5kKCdcdCcpLmFwcGVuZChjb25mbGljdGluZ1BhdGgpLmFwcGVuZCgnXG4nKTsKKwkJCXNiLmFwcGVuZChjb21tZW50Q2hhcikuYXBwZW5kKCdcdCcpLmFwcGVuZChjb25mbGljdGluZ1BhdGgpCisJCQkJCS5hcHBlbmQoJ1xuJyk7CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbWVyZ2UvUmVzb2x2ZU1lcmdlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9tZXJnZS9SZXNvbHZlTWVyZ2VyLmphdmEKaW5kZXggNzc2NzY2Mi4uYjlhYjFkMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9tZXJnZS9SZXNvbHZlTWVyZ2VyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9tZXJnZS9SZXNvbHZlTWVyZ2VyLmphdmEKQEAgLTMsNyArMyw3IEBACiAgKiBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMiwgTWF0dGhpYXMgU29obiA8bWF0dGhpYXMuc29obkBzYXAuY29tPgogICogQ29weXJpZ2h0IChDKSAyMDEyLCBSZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRlZAogICogQ29weXJpZ2h0IChDKSAyMDE3LCBPYmVvIChtYXRoaWV1LmNhcnRhdWRAb2Jlby5mcikKLSAqIENvcHlyaWdodCAoQykgMjAxOCwgVGhvbWFzIFdvbGYgPHRob21hcy53b2xmQHBhcmFub3IuY2g+IGFuZCBvdGhlcnMKKyAqIENvcHlyaWdodCAoQykgMjAxOCwgMjAyMiBUaG9tYXMgV29sZiA8dGhvbWFzLndvbGZAcGFyYW5vci5jaD4gYW5kIG90aGVycwogICoKICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdApAQCAtMjc2LDExICsyNzYsMTUgQEAgcHVibGljIGVudW0gTWVyZ2VGYWlsdXJlUmVhc29uIHsKIAlwcml2YXRlIENvbnRlbnRNZXJnZVN0cmF0ZWd5IGNvbnRlbnRTdHJhdGVneSA9IENvbnRlbnRNZXJnZVN0cmF0ZWd5LkNPTkZMSUNUOwogCiAJLyoqCi0JICogS2VlcHMge0BsaW5rIENoZWNrb3V0TWV0YWRhdGF9IGZvciB7QGxpbmsgI2NoZWNrb3V0KCl9IGFuZAotCSAqIHtAbGluayAjY2xlYW5VcCgpfS4KKwkgKiBLZWVwcyB7QGxpbmsgQ2hlY2tvdXRNZXRhZGF0YX0gZm9yIHtAbGluayAjY2hlY2tvdXQoKX0uCiAJICovCiAJcHJpdmF0ZSBNYXA8U3RyaW5nLCBDaGVja291dE1ldGFkYXRhPiBjaGVja291dE1ldGFkYXRhOwogCisJLyoqCisJICogS2VlcHMge0BsaW5rIENoZWNrb3V0TWV0YWRhdGF9IGZvciB7QGxpbmsgI2NsZWFuVXAoKX0uCisJICovCisJcHJpdmF0ZSBNYXA8U3RyaW5nLCBDaGVja291dE1ldGFkYXRhPiBjbGVhbnVwTWV0YWRhdGE7CisKIAlwcml2YXRlIHN0YXRpYyBNZXJnZUFsZ29yaXRobSBnZXRNZXJnZUFsZ29yaXRobShDb25maWcgY29uZmlnKSB7CiAJCVN1cHBvcnRlZEFsZ29yaXRobSBkaWZmQWxnID0gY29uZmlnLmdldEVudW0oCiAJCQkJQ09ORklHX0RJRkZfU0VDVElPTiwgbnVsbCwgQ09ORklHX0tFWV9BTEdPUklUSE0sCkBAIC0zODMsMTIgKzM4NywxNCBAQCBwcm90ZWN0ZWQgYm9vbGVhbiBtZXJnZUltcGwoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQl9CiAJCWlmICghaW5Db3JlKSB7CiAJCQljaGVja291dE1ldGFkYXRhID0gbmV3IEhhc2hNYXA8PigpOworCQkJY2xlYW51cE1ldGFkYXRhID0gbmV3IEhhc2hNYXA8PigpOwogCQl9CiAJCXRyeSB7CiAJCQlyZXR1cm4gbWVyZ2VUcmVlcyhtZXJnZUJhc2UoKSwgc291cmNlVHJlZXNbMF0sIHNvdXJjZVRyZWVzWzFdLAogCQkJCQlmYWxzZSk7CiAJCX0gZmluYWxseSB7CiAJCQljaGVja291dE1ldGFkYXRhID0gbnVsbDsKKwkJCWNsZWFudXBNZXRhZGF0YSA9IG51bGw7CiAJCQlpZiAoaW1wbGljaXREaXJDYWNoZSkgewogCQkJCWRpcmNhY2hlLnVubG9jaygpOwogCQkJfQpAQCAtNDQ3LDcgKzQ1Myw3IEBAIHByb3RlY3RlZCB2b2lkIGNsZWFuVXAoKSB0aHJvd3MgTm9Xb3JrVHJlZUV4Y2VwdGlvbiwKIAkJCURpckNhY2hlRW50cnkgZW50cnkgPSBkYy5nZXRFbnRyeShtcGF0aCk7CiAJCQlpZiAoZW50cnkgIT0gbnVsbCkgewogCQkJCURpckNhY2hlQ2hlY2tvdXQuY2hlY2tvdXRFbnRyeShkYiwgZW50cnksIHJlYWRlciwgZmFsc2UsCi0JCQkJCQljaGVja291dE1ldGFkYXRhLmdldChtcGF0aCkpOworCQkJCQkJY2xlYW51cE1ldGFkYXRhLmdldChtcGF0aCkpOwogCQkJfQogCQkJbXBhdGhzSXQucmVtb3ZlKCk7CiAJCX0KQEAgLTUwMSwyMiArNTA3LDI2IEBAIHByaXZhdGUgRGlyQ2FjaGVFbnRyeSBrZWVwKERpckNhY2hlRW50cnkgZSkgewogCSAqIFJlbWVtYmVycyB0aGUge0BsaW5rIENoZWNrb3V0TWV0YWRhdGF9IGZvciB0aGUgZ2l2ZW4gcGF0aDsgaXQgbWF5IGJlCiAJICogbmVlZGVkIGluIHtAbGluayAjY2hlY2tvdXQoKX0gb3IgaW4ge0BsaW5rICNjbGVhblVwKCl9LgogCSAqCisJICogQHBhcmFtIG1hcAorCSAqICAgICAgICAgICAgdG8gYWRkIHRoZSBtZXRhZGF0YSB0bwogCSAqIEBwYXJhbSBwYXRoCiAJICogICAgICAgICAgICBvZiB0aGUgY3VycmVudCBub2RlCiAJICogQHBhcmFtIGF0dHJpYnV0ZXMKLQkgKiAgICAgICAgICAgIGZvciB0aGUgY3VycmVudCBub2RlCisJICogICAgICAgICAgICB0byB1c2UgZm9yIGRldGVybWluaW5nIHRoZSBtZXRhZGF0YQogCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICBpZiB0aGUgc211ZGdlIGZpbHRlciBjYW5ub3QgYmUgZGV0ZXJtaW5lZAotCSAqIEBzaW5jZSA1LjEKKwkgKiBAc2luY2UgNi4xCiAJICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ2hlY2tvdXRNZXRhZGF0YShTdHJpbmcgcGF0aCwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKQorCXByb3RlY3RlZCB2b2lkIGFkZENoZWNrb3V0TWV0YWRhdGEoTWFwPFN0cmluZywgQ2hlY2tvdXRNZXRhZGF0YT4gbWFwLAorCQkJU3RyaW5nIHBhdGgsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChjaGVja291dE1ldGFkYXRhICE9IG51bGwpIHsKKwkJaWYgKG1hcCAhPSBudWxsKSB7CiAJCQlFb2xTdHJlYW1UeXBlIGVvbCA9IEVvbFN0cmVhbVR5cGVVdGlsLmRldGVjdFN0cmVhbVR5cGUoCi0JCQkJCU9wZXJhdGlvblR5cGUuQ0hFQ0tPVVRfT1AsIHdvcmtpbmdUcmVlT3B0aW9ucywgYXR0cmlidXRlcyk7CisJCQkJCU9wZXJhdGlvblR5cGUuQ0hFQ0tPVVRfT1AsIHdvcmtpbmdUcmVlT3B0aW9ucywKKwkJCQkJYXR0cmlidXRlcyk7CiAJCQlDaGVja291dE1ldGFkYXRhIGRhdGEgPSBuZXcgQ2hlY2tvdXRNZXRhZGF0YShlb2wsCi0JCQkJCXR3LmdldEZpbHRlckNvbW1hbmQoQ29uc3RhbnRzLkFUVFJfRklMVEVSX1RZUEVfU01VREdFKSk7Ci0JCQljaGVja291dE1ldGFkYXRhLnB1dChwYXRoLCBkYXRhKTsKKwkJCQkJdHcuZ2V0U211ZGdlQ29tbWFuZChhdHRyaWJ1dGVzKSk7CisJCQltYXAucHV0KHBhdGgsIGRhdGEpOwogCQl9CiAJfQogCkBAIC01MjksMTUgKzUzOSwxNyBAQCBwcm90ZWN0ZWQgdm9pZCBhZGRDaGVja291dE1ldGFkYXRhKFN0cmluZyBwYXRoLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpCiAJICogQHBhcmFtIGVudHJ5CiAJICogICAgICAgICAgICB0byBhZGQKIAkgKiBAcGFyYW0gYXR0cmlidXRlcwotCSAqICAgICAgICAgICAgZm9yIHRoZSBjdXJyZW50IGVudHJ5CisJICogICAgICAgICAgICB0aGUge0BsaW5rIEF0dHJpYnV0ZXN9IG9mIHRoZSB0cmVlcwogCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICBpZiB0aGUge0BsaW5rIENoZWNrb3V0TWV0YWRhdGF9IGNhbm5vdCBiZSBkZXRlcm1pbmVkCi0JICogQHNpbmNlIDUuMQorCSAqIEBzaW5jZSA2LjEKIAkgKi8KIAlwcm90ZWN0ZWQgdm9pZCBhZGRUb0NoZWNrb3V0KFN0cmluZyBwYXRoLCBEaXJDYWNoZUVudHJ5IGVudHJ5LAotCQkJQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQkJQXR0cmlidXRlc1tdIGF0dHJpYnV0ZXMpCisJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQl0b0JlQ2hlY2tlZE91dC5wdXQocGF0aCwgZW50cnkpOwotCQlhZGRDaGVja291dE1ldGFkYXRhKHBhdGgsIGF0dHJpYnV0ZXMpOworCQlhZGRDaGVja291dE1ldGFkYXRhKGNsZWFudXBNZXRhZGF0YSwgcGF0aCwgYXR0cmlidXRlc1tUX09VUlNdKTsKKwkJYWRkQ2hlY2tvdXRNZXRhZGF0YShjaGVja291dE1ldGFkYXRhLCBwYXRoLCBhdHRyaWJ1dGVzW1RfVEhFSVJTXSk7CiAJfQogCiAJLyoqCkBAIC01NDksNyArNTYxLDcgQEAgcHJvdGVjdGVkIHZvaWQgYWRkVG9DaGVja291dChTdHJpbmcgcGF0aCwgRGlyQ2FjaGVFbnRyeSBlbnRyeSwKIAkgKiBAcGFyYW0gaXNGaWxlCiAJICogICAgICAgICAgICB3aGV0aGVyIGl0IGlzIGEgZmlsZQogCSAqIEBwYXJhbSBhdHRyaWJ1dGVzCi0JICogICAgICAgICAgICBmb3IgdGhlIGVudHJ5CisJICogICAgICAgICAgICB0byB1c2UgZm9yIGRldGVybWluaW5nIHRoZSB7QGxpbmsgQ2hlY2tvdXRNZXRhZGF0YX0KIAkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgaWYgdGhlIHtAbGluayBDaGVja291dE1ldGFkYXRhfSBjYW5ub3QgYmUgZGV0ZXJtaW5lZAogCSAqIEBzaW5jZSA1LjEKQEAgLTU1OCw3ICs1NzAsNyBAQCBwcm90ZWN0ZWQgdm9pZCBhZGREZWxldGlvbihTdHJpbmcgcGF0aCwgYm9vbGVhbiBpc0ZpbGUsCiAJCQlBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXRvQmVEZWxldGVkLmFkZChwYXRoKTsKIAkJaWYgKGlzRmlsZSkgewotCQkJYWRkQ2hlY2tvdXRNZXRhZGF0YShwYXRoLCBhdHRyaWJ1dGVzKTsKKwkJCWFkZENoZWNrb3V0TWV0YWRhdGEoY2xlYW51cE1ldGFkYXRhLCBwYXRoLCBhdHRyaWJ1dGVzKTsKIAkJfQogCX0KIApAQCAtNTk5LDcgKzYxMSw3IEBAIHByb3RlY3RlZCB2b2lkIGFkZERlbGV0aW9uKFN0cmluZyBwYXRoLCBib29sZWFuIGlzRmlsZSwKIAkgKiAgICAgICAgICAgIHNlZQogCSAqICAgICAgICAgICAge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQubWVyZ2UuUmVzb2x2ZU1lcmdlciNtZXJnZVRyZWVzKEFic3RyYWN0VHJlZUl0ZXJhdG9yLCBSZXZUcmVlLCBSZXZUcmVlLCBib29sZWFuKX0KIAkgKiBAcGFyYW0gYXR0cmlidXRlcwotCSAqICAgICAgICAgICAgdGhlIGF0dHJpYnV0ZXMgZGVmaW5lZCBmb3IgdGhpcyBlbnRyeQorCSAqICAgICAgICAgICAgdGhlIHtAbGluayBBdHRyaWJ1dGVzfSBmb3IgdGhlIHRocmVlIHRyZWVzCiAJICogQHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhlIG1lcmdlIHdpbGwgZmFpbCBiZWNhdXNlIHRoZSBpbmRleCBlbnRyeQogCSAqICAgICAgICAgZGlkbid0IG1hdGNoIG91cnMgb3IgdGhlIHdvcmtpbmctZGlyIGZpbGUgd2FzIGRpcnR5IGFuZCBhCiAJICogICAgICAgICBjb25mbGljdCBvY2N1cnJlZApAQCAtNjA3LDEyICs2MTksMTIgQEAgcHJvdGVjdGVkIHZvaWQgYWRkRGVsZXRpb24oU3RyaW5nIHBhdGgsIGJvb2xlYW4gaXNGaWxlLAogCSAqIEB0aHJvd3Mgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbgogCSAqIEB0aHJvd3Mgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuQ29ycnVwdE9iamVjdEV4Y2VwdGlvbgogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgotCSAqIEBzaW5jZSA0LjkKKwkgKiBAc2luY2UgNi4xCiAJICovCiAJcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0VudHJ5KENhbm9uaWNhbFRyZWVQYXJzZXIgYmFzZSwKIAkJCUNhbm9uaWNhbFRyZWVQYXJzZXIgb3VycywgQ2Fub25pY2FsVHJlZVBhcnNlciB0aGVpcnMsCiAJCQlEaXJDYWNoZUJ1aWxkSXRlcmF0b3IgaW5kZXgsIFdvcmtpbmdUcmVlSXRlcmF0b3Igd29yaywKLQkJCWJvb2xlYW4gaWdub3JlQ29uZmxpY3RzLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpCisJCQlib29sZWFuIGlnbm9yZUNvbmZsaWN0cywgQXR0cmlidXRlc1tdIGF0dHJpYnV0ZXMpCiAJCQl0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwgSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwKIAkJCUNvcnJ1cHRPYmplY3RFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkJZW50ZXJTdWJ0cmVlID0gdHJ1ZTsKQEAgLTcyOSw3ICs3NDEsNyBAQCBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzRW50cnkoQ2Fub25pY2FsVHJlZVBhcnNlciBiYXNlLAogCQkJCS8vIEJhc2UsIG91cnMsIGFuZCB0aGVpcnMgYWxsIGNvbnRhaW4gYSBmb2xkZXI6IGRvbid0IGRlbGV0ZQogCQkJCXJldHVybiB0cnVlOwogCQkJfQotCQkJYWRkRGVsZXRpb24odHcuZ2V0UGF0aFN0cmluZygpLCBub25UcmVlKG1vZGVPKSwgYXR0cmlidXRlcyk7CisJCQlhZGREZWxldGlvbih0dy5nZXRQYXRoU3RyaW5nKCksIG5vblRyZWUobW9kZU8pLCBhdHRyaWJ1dGVzW1RfT1VSU10pOwogCQkJcmV0dXJuIHRydWU7CiAJCX0KIApAQCAtNzcyLDcgKzc4NCw3IEBAIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NFbnRyeShDYW5vbmljYWxUcmVlUGFyc2VyIGJhc2UsCiAJCWlmIChub25UcmVlKG1vZGVPKSAmJiBub25UcmVlKG1vZGVUKSkgewogCQkJLy8gQ2hlY2sgd29ya3RyZWUgYmVmb3JlIG1vZGlmeWluZyBmaWxlcwogCQkJYm9vbGVhbiB3b3JrdHJlZURpcnR5ID0gaXNXb3JrdHJlZURpcnR5KHdvcmssIG91ckRjZSk7Ci0JCQlpZiAoIWF0dHJpYnV0ZXMuY2FuQmVDb250ZW50TWVyZ2VkKCkgJiYgd29ya3RyZWVEaXJ0eSkgeworCQkJaWYgKCFhdHRyaWJ1dGVzW1RfT1VSU10uY2FuQmVDb250ZW50TWVyZ2VkKCkgJiYgd29ya3RyZWVEaXJ0eSkgewogCQkJCXJldHVybiBmYWxzZTsKIAkJCX0KIApAQCAtNzkxLDcgKzgwMyw3IEBAIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NFbnRyeShDYW5vbmljYWxUcmVlUGFyc2VyIGJhc2UsCiAJCQkJbWVyZ2VSZXN1bHRzLnB1dCh0dy5nZXRQYXRoU3RyaW5nKCksIHJlc3VsdCk7CiAJCQkJdW5tZXJnZWRQYXRocy5hZGQodHcuZ2V0UGF0aFN0cmluZygpKTsKIAkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0gZWxzZSBpZiAoIWF0dHJpYnV0ZXMuY2FuQmVDb250ZW50TWVyZ2VkKCkpIHsKKwkJCX0gZWxzZSBpZiAoIWF0dHJpYnV0ZXNbVF9PVVJTXS5jYW5CZUNvbnRlbnRNZXJnZWQoKSkgewogCQkJCS8vIEZpbGUgbWFya2VkIGFzIGJpbmFyeQogCQkJCXN3aXRjaCAoZ2V0Q29udGVudE1lcmdlU3RyYXRlZ3koKSkgewogCQkJCWNhc2UgT1VSUzoKQEAgLTg0MiwxMyArODU0LDE2IEBAIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NFbnRyeShDYW5vbmljYWxUcmVlUGFyc2VyIGJhc2UsCiAJCQlpZiAoaWdub3JlQ29uZmxpY3RzKSB7CiAJCQkJcmVzdWx0LnNldENvbnRhaW5zQ29uZmxpY3RzKGZhbHNlKTsKIAkJCX0KLQkJCXVwZGF0ZUluZGV4KGJhc2UsIG91cnMsIHRoZWlycywgcmVzdWx0LCBhdHRyaWJ1dGVzKTsKKwkJCXVwZGF0ZUluZGV4KGJhc2UsIG91cnMsIHRoZWlycywgcmVzdWx0LCBhdHRyaWJ1dGVzW1RfT1VSU10pOwogCQkJU3RyaW5nIGN1cnJlbnRQYXRoID0gdHcuZ2V0UGF0aFN0cmluZygpOwogCQkJaWYgKHJlc3VsdC5jb250YWluc0NvbmZsaWN0cygpICYmICFpZ25vcmVDb25mbGljdHMpIHsKIAkJCQl1bm1lcmdlZFBhdGhzLmFkZChjdXJyZW50UGF0aCk7CiAJCQl9CiAJCQltb2RpZmllZEZpbGVzLmFkZChjdXJyZW50UGF0aCk7Ci0JCQlhZGRDaGVja291dE1ldGFkYXRhKGN1cnJlbnRQYXRoLCBhdHRyaWJ1dGVzKTsKKwkJCWFkZENoZWNrb3V0TWV0YWRhdGEoY2xlYW51cE1ldGFkYXRhLCBjdXJyZW50UGF0aCwKKwkJCQkJYXR0cmlidXRlc1tUX09VUlNdKTsKKwkJCWFkZENoZWNrb3V0TWV0YWRhdGEoY2hlY2tvdXRNZXRhZGF0YSwgY3VycmVudFBhdGgsCisJCQkJCWF0dHJpYnV0ZXNbVF9USEVJUlNdKTsKIAkJfSBlbHNlIGlmIChtb2RlTyAhPSBtb2RlVCkgewogCQkJLy8gT1VSUyBvciBUSEVJUlMgaGFzIGJlZW4gZGVsZXRlZAogCQkJaWYgKCgobW9kZU8gIT0gMCAmJiAhdHcuaWRFcXVhbChUX0JBU0UsIFRfT1VSUykpIHx8IChtb2RlVCAhPSAwICYmICF0dwpAQCAtODgxLDcgKzg5Niw4IEBAIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NFbnRyeShDYW5vbmljYWxUcmVlUGFyc2VyIGJhc2UsCiAJCQkJCQkvLyBtYXJrZXJzKS4gQnV0IGFsc28gc3RhZ2UgMCBvZiB0aGUgaW5kZXggaXMgZmlsbGVkCiAJCQkJCQkvLyB3aXRoIHRoYXQgY29udGVudC4KIAkJCQkJCXJlc3VsdC5zZXRDb250YWluc0NvbmZsaWN0cyhmYWxzZSk7Ci0JCQkJCQl1cGRhdGVJbmRleChiYXNlLCBvdXJzLCB0aGVpcnMsIHJlc3VsdCwgYXR0cmlidXRlcyk7CisJCQkJCQl1cGRhdGVJbmRleChiYXNlLCBvdXJzLCB0aGVpcnMsIHJlc3VsdCwKKwkJCQkJCQkJYXR0cmlidXRlc1tUX09VUlNdKTsKIAkJCQkJfSBlbHNlIHsKIAkJCQkJCWFkZCh0dy5nZXRSYXdQYXRoKCksIGJhc2UsIERpckNhY2hlRW50cnkuU1RBR0VfMSwgRVBPQ0gsCiAJCQkJCQkJCTApOwpAQCAtODk2LDExICs5MTIsOSBAQCBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzRW50cnkoQ2Fub25pY2FsVHJlZVBhcnNlciBiYXNlLAogCQkJCQkJCWlmIChpc1dvcmt0cmVlRGlydHkod29yaywgb3VyRGNlKSkgewogCQkJCQkJCQlyZXR1cm4gZmFsc2U7CiAJCQkJCQkJfQotCQkJCQkJCWlmIChub25UcmVlKG1vZGVUKSkgewotCQkJCQkJCQlpZiAoZSAhPSBudWxsKSB7Ci0JCQkJCQkJCQlhZGRUb0NoZWNrb3V0KHR3LmdldFBhdGhTdHJpbmcoKSwgZSwKLQkJCQkJCQkJCQkJYXR0cmlidXRlcyk7Ci0JCQkJCQkJCX0KKwkJCQkJCQlpZiAobm9uVHJlZShtb2RlVCkgJiYgZSAhPSBudWxsKSB7CisJCQkJCQkJCWFkZFRvQ2hlY2tvdXQodHcuZ2V0UGF0aFN0cmluZygpLCBlLAorCQkJCQkJCQkJCWF0dHJpYnV0ZXMpOwogCQkJCQkJCX0KIAkJCQkJCX0KIApAQCAtOTQ1LDE0ICs5NTksMTYgQEAgcHJpdmF0ZSBzdGF0aWMgTWVyZ2VSZXN1bHQ8U3VibW9kdWxlQ29uZmxpY3Q+IGNyZWF0ZUdpdExpbmtzTWVyZ2VSZXN1bHQoCiAJICovCiAJcHJpdmF0ZSBNZXJnZVJlc3VsdDxSYXdUZXh0PiBjb250ZW50TWVyZ2UoQ2Fub25pY2FsVHJlZVBhcnNlciBiYXNlLAogCQkJQ2Fub25pY2FsVHJlZVBhcnNlciBvdXJzLCBDYW5vbmljYWxUcmVlUGFyc2VyIHRoZWlycywKLQkJCUF0dHJpYnV0ZXMgYXR0cmlidXRlcywgQ29udGVudE1lcmdlU3RyYXRlZ3kgc3RyYXRlZ3kpCisJCQlBdHRyaWJ1dGVzW10gYXR0cmlidXRlcywgQ29udGVudE1lcmdlU3RyYXRlZ3kgc3RyYXRlZ3kpCiAJCQl0aHJvd3MgQmluYXJ5QmxvYkV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworCQkvLyBUVzogVGhlIGF0dHJpYnV0ZXMgaGVyZSBhcmUgdXNlZCB0byBkZXRlcm1pbmUgdGhlIExGUyBzbXVkZ2UgZmlsdGVyLgorCQkvLyBJcyBkb2luZyBhIGNvbnRlbnQgbWVyZ2Ugb24gTEZTIGl0ZW1zIHJlYWxseSBhIGdvb2QgaWRlYT8/CiAJCVJhd1RleHQgYmFzZVRleHQgPSBiYXNlID09IG51bGwgPyBSYXdUZXh0LkVNUFRZX1RFWFQKLQkJCQk6IGdldFJhd1RleHQoYmFzZS5nZXRFbnRyeU9iamVjdElkKCksIGF0dHJpYnV0ZXMpOworCQkJCTogZ2V0UmF3VGV4dChiYXNlLmdldEVudHJ5T2JqZWN0SWQoKSwgYXR0cmlidXRlc1tUX0JBU0VdKTsKIAkJUmF3VGV4dCBvdXJUZXh0ID0gb3VycyA9PSBudWxsID8gUmF3VGV4dC5FTVBUWV9URVhUCi0JCQkJOiBnZXRSYXdUZXh0KG91cnMuZ2V0RW50cnlPYmplY3RJZCgpLCBhdHRyaWJ1dGVzKTsKKwkJCQk6IGdldFJhd1RleHQob3Vycy5nZXRFbnRyeU9iamVjdElkKCksIGF0dHJpYnV0ZXNbVF9PVVJTXSk7CiAJCVJhd1RleHQgdGhlaXJzVGV4dCA9IHRoZWlycyA9PSBudWxsID8gUmF3VGV4dC5FTVBUWV9URVhUCi0JCQkJOiBnZXRSYXdUZXh0KHRoZWlycy5nZXRFbnRyeU9iamVjdElkKCksIGF0dHJpYnV0ZXMpOworCQkJCTogZ2V0UmF3VGV4dCh0aGVpcnMuZ2V0RW50cnlPYmplY3RJZCgpLCBhdHRyaWJ1dGVzW1RfVEhFSVJTXSk7CiAJCW1lcmdlQWxnb3JpdGhtLnNldENvbnRlbnRNZXJnZVN0cmF0ZWd5KHN0cmF0ZWd5KTsKIAkJcmV0dXJuIG1lcmdlQWxnb3JpdGhtLm1lcmdlKFJhd1RleHRDb21wYXJhdG9yLkRFRkFVTFQsIGJhc2VUZXh0LAogCQkJCW91clRleHQsIHRoZWlyc1RleHQpOwpAQCAtMTM0Miw3ICsxMzU4LDcgQEAgcHJvdGVjdGVkIGJvb2xlYW4gbWVyZ2VUcmVlcyhBYnN0cmFjdFRyZWVJdGVyYXRvciBiYXNlVHJlZSwKIAogCQl0dyA9IG5ldyBOYW1lQ29uZmxpY3RUcmVlV2FsayhkYiwgcmVhZGVyKTsKIAkJdHcuYWRkVHJlZShiYXNlVHJlZSk7Ci0JCXR3LmFkZFRyZWUoaGVhZFRyZWUpOworCQl0dy5zZXRIZWFkKHR3LmFkZFRyZWUoaGVhZFRyZWUpKTsKIAkJdHcuYWRkVHJlZShtZXJnZVRyZWUpOwogCQlpbnQgZGNpUG9zID0gdHcuYWRkVHJlZShidWlsZEl0KTsKIAkJaWYgKHdvcmtpbmdUcmVlSXRlcmF0b3IgIT0gbnVsbCkgewpAQCAtMTQwMyw2ICsxNDE5LDEzIEBAIHByb3RlY3RlZCBib29sZWFuIG1lcmdlVHJlZVdhbGsoVHJlZVdhbGsgdHJlZVdhbGssIGJvb2xlYW4gaWdub3JlQ29uZmxpY3RzKQogCQlib29sZWFuIGhhc0F0dHJpYnV0ZU5vZGVQcm92aWRlciA9IHRyZWVXYWxrCiAJCQkJLmdldEF0dHJpYnV0ZXNOb2RlUHJvdmlkZXIoKSAhPSBudWxsOwogCQl3aGlsZSAodHJlZVdhbGsubmV4dCgpKSB7CisJCQlBdHRyaWJ1dGVzW10gYXR0cmlidXRlcyA9IHsgTk9fQVRUUklCVVRFUywgTk9fQVRUUklCVVRFUywKKwkJCQkJTk9fQVRUUklCVVRFUyB9OworCQkJaWYgKGhhc0F0dHJpYnV0ZU5vZGVQcm92aWRlcikgeworCQkJCWF0dHJpYnV0ZXNbVF9CQVNFXSA9IHRyZWVXYWxrLmdldEF0dHJpYnV0ZXMoVF9CQVNFKTsKKwkJCQlhdHRyaWJ1dGVzW1RfT1VSU10gPSB0cmVlV2Fsay5nZXRBdHRyaWJ1dGVzKFRfT1VSUyk7CisJCQkJYXR0cmlidXRlc1tUX1RIRUlSU10gPSB0cmVlV2Fsay5nZXRBdHRyaWJ1dGVzKFRfVEhFSVJTKTsKKwkJCX0KIAkJCWlmICghcHJvY2Vzc0VudHJ5KAogCQkJCQl0cmVlV2Fsay5nZXRUcmVlKFRfQkFTRSwgQ2Fub25pY2FsVHJlZVBhcnNlci5jbGFzcyksCiAJCQkJCXRyZWVXYWxrLmdldFRyZWUoVF9PVVJTLCBDYW5vbmljYWxUcmVlUGFyc2VyLmNsYXNzKSwKQEAgLTE0MTAsOSArMTQzMyw3IEBAIHByb3RlY3RlZCBib29sZWFuIG1lcmdlVHJlZVdhbGsoVHJlZVdhbGsgdHJlZVdhbGssIGJvb2xlYW4gaWdub3JlQ29uZmxpY3RzKQogCQkJCQl0cmVlV2Fsay5nZXRUcmVlKFRfSU5ERVgsIERpckNhY2hlQnVpbGRJdGVyYXRvci5jbGFzcyksCiAJCQkJCWhhc1dvcmtpbmdUcmVlSXRlcmF0b3IgPyB0cmVlV2Fsay5nZXRUcmVlKFRfRklMRSwKIAkJCQkJCQlXb3JraW5nVHJlZUl0ZXJhdG9yLmNsYXNzKSA6IG51bGwsCi0JCQkJCWlnbm9yZUNvbmZsaWN0cywgaGFzQXR0cmlidXRlTm9kZVByb3ZpZGVyCi0JCQkJCQkJPyB0cmVlV2Fsay5nZXRBdHRyaWJ1dGVzKCkKLQkJCQkJCQk6IE5PX0FUVFJJQlVURVMpKSB7CisJCQkJCWlnbm9yZUNvbmZsaWN0cywgYXR0cmlidXRlcykpIHsKIAkJCQljbGVhblVwKCk7CiAJCQkJcmV0dXJuIGZhbHNlOwogCQkJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL09iamVjdFdhbGsuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9PYmplY3RXYWxrLmphdmEKaW5kZXggZTZmOTU4MC4uNGU0OGE1YyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL09iamVjdFdhbGsuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvT2JqZWN0V2Fsay5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCwgU2hhd24gTy4gUGVhcmNlIDxzcGVhcmNlQHNwZWFyY2Uub3JnPiBhbmQgb3RoZXJzCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgsIDIwMjIgU2hhd24gTy4gUGVhcmNlIDxzcGVhcmNlQHNwZWFyY2Uub3JnPiBhbmQgb3RoZXJzCiAgKgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CkBAIC0xMzksNyArMTM5LDcgQEAgcHVibGljIHZvaWQgdmlzaXRlZChSZXZPYmplY3QgbykgewogCSAqICAgICAgICAgICAgdGhlIHJlcG9zaXRvcnkgdGhlIHdhbGtlciB3aWxsIG9idGFpbiBkYXRhIGZyb20uCiAJICovCiAJcHVibGljIE9iamVjdFdhbGsoUmVwb3NpdG9yeSByZXBvKSB7Ci0JCXRoaXMocmVwby5uZXdPYmplY3RSZWFkZXIoKSk7CisJCXRoaXMocmVwby5uZXdPYmplY3RSZWFkZXIoKSwgdHJ1ZSk7CiAJfQogCiAJLyoqCkBAIC0xNTEsNyArMTUxLDExIEBAIHB1YmxpYyBPYmplY3RXYWxrKFJlcG9zaXRvcnkgcmVwbykgewogCSAqICAgICAgICAgICAgcmVxdWlyZWQuCiAJICovCiAJcHVibGljIE9iamVjdFdhbGsoT2JqZWN0UmVhZGVyIG9yKSB7Ci0JCXN1cGVyKG9yKTsKKwkJdGhpcyhvciwgZmFsc2UpOworCX0KKworCXByaXZhdGUgT2JqZWN0V2FsayhPYmplY3RSZWFkZXIgb3IsIGJvb2xlYW4gY2xvc2VSZWFkZXIpIHsKKwkJc3VwZXIob3IsIGNsb3NlUmVhZGVyKTsKIAkJc2V0UmV0YWluQm9keShmYWxzZSk7CiAJCXJvb3RPYmplY3RzID0gbmV3IEFycmF5TGlzdDw+KCk7CiAJCXBlbmRpbmdPYmplY3RzID0gbmV3IEJsb2NrT2JqUXVldWUoKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZXYWxrLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2V2Fsay5qYXZhCmluZGV4IDhkNTcxZjUuLmE1MGVhZjEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZXYWxrLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldldhbGsuamF2YQpAQCAtMjE1LDcgKzIxNSw3IEBAIHB1YmxpYyBSZXZXYWxrKE9iamVjdFJlYWRlciBvcikgewogCQl0aGlzKG9yLCBmYWxzZSk7CiAJfQogCi0JcHJpdmF0ZSBSZXZXYWxrKE9iamVjdFJlYWRlciBvciwgYm9vbGVhbiBjbG9zZVJlYWRlcikgeworCVJldldhbGsoT2JqZWN0UmVhZGVyIG9yLCBib29sZWFuIGNsb3NlUmVhZGVyKSB7CiAJCXJlYWRlciA9IG9yOwogCQlpZEJ1ZmZlciA9IG5ldyBNdXRhYmxlT2JqZWN0SWQoKTsKIAkJb2JqZWN0cyA9IG5ldyBPYmplY3RJZE93bmVyTWFwPD4oKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1B1c2hDb25maWcuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1B1c2hDb25maWcuamF2YQppbmRleCBmZGE3YTgxLi5jODc3NGQ1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QdXNoQ29uZmlnLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUHVzaENvbmZpZy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNywgRGF2aWQgUHVyc2Vob3VzZSA8ZGF2aWQucHVyc2Vob3VzZUBnbWFpbC5jb20+IGFuZCBvdGhlcnMKKyAqIENvcHlyaWdodCAoQykgMjAxNywgMjAyMiBEYXZpZCBQdXJzZWhvdXNlIDxkYXZpZC5wdXJzZWhvdXNlQGdtYWlsLmNvbT4gYW5kIG90aGVycwogICoKICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdApAQCAtMTAsNyArMTAsMTAgQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDsKIAoraW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CisKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uZmlnQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5TdHJpbmdVdGlsczsKIAogLyoqCkBAIC0xOSw4ICsyMiw5IEBACiAgKiBAc2luY2UgNC45CiAgKi8KIHB1YmxpYyBjbGFzcyBQdXNoQ29uZmlnIHsKKwogCS8qKgotCSAqIENvbmZpZyB2YWx1ZXMgZm9yIHB1c2gucmVjdXJzZVN1Ym1vZHVsZXMuCisJICogR2l0IGNvbmZpZyB2YWx1ZXMgZm9yIHtAY29kZSBwdXNoLnJlY3Vyc2VTdWJtb2R1bGVzfS4KIAkgKi8KIAlwdWJsaWMgZW51bSBQdXNoUmVjdXJzZVN1Ym1vZHVsZXNNb2RlIGltcGxlbWVudHMgQ29uZmlnLkNvbmZpZ0VudW0gewogCQkvKioKQEAgLTU5LDQgKzYzLDEwMCBAQCBwdWJsaWMgYm9vbGVhbiBtYXRjaENvbmZpZ1ZhbHVlKFN0cmluZyBzKSB7CiAJCQkJCXx8IGNvbmZpZ1ZhbHVlLmVxdWFsc0lnbm9yZUNhc2Uocyk7CiAJCX0KIAl9CisKKwkvKioKKwkgKiBHaXQgY29uZmlnIHZhbHVlcyBmb3Ige0Bjb2RlIHB1c2guZGVmYXVsdH0uCisJICoKKwkgKiBAc2luY2UgNi4xCisJICovCisJcHVibGljIGVudW0gUHVzaERlZmF1bHQgaW1wbGVtZW50cyBDb25maWcuQ29uZmlnRW51bSB7CisKKwkJLyoqCisJCSAqIERvIG5vdCBwdXNoIGlmIHRoZXJlIGFyZSBubyBleHBsaWNpdCByZWZzcGVjcy4KKwkJICovCisJCU5PVEhJTkcsCisKKwkJLyoqCisJCSAqIFB1c2ggdGhlIGN1cnJlbnQgYnJhbmNoIHRvIGFuIHVwc3RyZWFtIGJyYW5jaCBvZiB0aGUgc2FtZSBuYW1lLgorCQkgKi8KKwkJQ1VSUkVOVCwKKworCQkvKioKKwkJICogUHVzaCB0aGUgY3VycmVudCBicmFuY2ggdG8gYW4gdXBzdHJlYW0gYnJhbmNoIGRldGVybWluZWQgYnkgZ2l0CisJCSAqIGNvbmZpZyB7QGNvZGUgYnJhbmNoLjxjdXJyZW50QnJhbmNoPi5tZXJnZX0uCisJCSAqLworCQlVUFNUUkVBTSgidHJhY2tpbmciKSwgLy8kTk9OLU5MUy0xJAorCisJCS8qKgorCQkgKiBMaWtlIHtAbGluayAjVVBTVFJFQU19LCBidXQgb25seSBpZiB0aGUgdXBzdHJlYW0gbmFtZSBpcyB0aGUgc2FtZSBhcworCQkgKiB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCBsb2NhbCBicmFuY2guCisJCSAqLworCQlTSU1QTEUsCisKKwkJLyoqCisJCSAqIFB1c2ggYWxsIGN1cnJlbnQgbG9jYWwgYnJhbmNoZXMgdGhhdCBtYXRjaCBhIGNvbmZpZ3VyZWQgcHVzaCByZWZzcGVjCisJCSAqIG9mIHRoZSByZW1vdGUgY29uZmlndXJhdGlvbi4KKwkJICovCisJCU1BVENISU5HOworCisJCXByaXZhdGUgZmluYWwgU3RyaW5nIGFsaWFzOworCisJCXByaXZhdGUgUHVzaERlZmF1bHQoKSB7CisJCQlhbGlhcyA9IG51bGw7CisJCX0KKworCQlwcml2YXRlIFB1c2hEZWZhdWx0KFN0cmluZyBhbGlhcykgeworCQkJdGhpcy5hbGlhcyA9IGFsaWFzOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBTdHJpbmcgdG9Db25maWdWYWx1ZSgpIHsKKwkJCXJldHVybiBuYW1lKCkudG9Mb3dlckNhc2UoTG9jYWxlLlJPT1QpOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBib29sZWFuIG1hdGNoQ29uZmlnVmFsdWUoU3RyaW5nIGluKSB7CisJCQlyZXR1cm4gdG9Db25maWdWYWx1ZSgpLmVxdWFsc0lnbm9yZUNhc2UoaW4pCisJCQkJCXx8IChhbGlhcyAhPSBudWxsICYmIGFsaWFzLmVxdWFsc0lnbm9yZUNhc2UoaW4pKTsKKwkJfQorCX0KKworCXByaXZhdGUgZmluYWwgUHVzaFJlY3Vyc2VTdWJtb2R1bGVzTW9kZSByZWN1cnNlU3VibW9kdWxlczsKKworCXByaXZhdGUgZmluYWwgUHVzaERlZmF1bHQgcHVzaERlZmF1bHQ7CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgorCSAqCisJICogQHBhcmFtIGNvbmZpZworCSAqICAgICAgICAgICAge0BsaW5rIENvbmZpZ30gdG8gZmlsbCB0aGUge0BsaW5rIFB1c2hDb25maWd9IGZyb20KKwkgKiBAc2luY2UgNi4xCisJICovCisJcHVibGljIFB1c2hDb25maWcoQ29uZmlnIGNvbmZpZykgeworCQlyZWN1cnNlU3VibW9kdWxlcyA9IGNvbmZpZy5nZXRFbnVtKENvbmZpZ0NvbnN0YW50cy5DT05GSUdfUFVTSF9TRUNUSU9OLAorCQkJCW51bGwsIENvbmZpZ0NvbnN0YW50cy5DT05GSUdfS0VZX1JFQ1VSU0VfU1VCTU9EVUxFUywKKwkJCQlQdXNoUmVjdXJzZVN1Ym1vZHVsZXNNb2RlLk5PKTsKKwkJcHVzaERlZmF1bHQgPSBjb25maWcuZ2V0RW51bShDb25maWdDb25zdGFudHMuQ09ORklHX1BVU0hfU0VDVElPTiwgbnVsbCwKKwkJCQlDb25maWdDb25zdGFudHMuQ09ORklHX0tFWV9ERUZBVUxULCBQdXNoRGVmYXVsdC5TSU1QTEUpOworCX0KKworCS8qKgorCSAqIFJldHJpZXZlcyB0aGUgdmFsdWUgb2YgZ2l0IGNvbmZpZyB7QGNvZGUgcHVzaC5yZWN1cnNlU3VibW9kdWxlc30uCisJICoKKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZQorCSAqIEBzaW5jZSA2LjEKKwkgKi8KKwlwdWJsaWMgUHVzaFJlY3Vyc2VTdWJtb2R1bGVzTW9kZSBnZXRSZWN1cnNlU3VibW9kdWxlcygpIHsKKwkJcmV0dXJuIHJlY3Vyc2VTdWJtb2R1bGVzOworCX0KKworCS8qKgorCSAqIFJldHJpZXZlcyB0aGUgdmFsdWUgb2YgZ2l0IGNvbmZpZyB7QGNvZGUgcHVzaC5kZWZhdWx0fS4KKwkgKgorCSAqIEByZXR1cm4gdGhlIHZhbHVlCisJICogQHNpbmNlIDYuMQorCSAqLworCXB1YmxpYyBQdXNoRGVmYXVsdCBnZXRQdXNoRGVmYXVsdCgpIHsKKwkJcmV0dXJuIHB1c2hEZWZhdWx0OworCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1B1c2hQcm9jZXNzLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QdXNoUHJvY2Vzcy5qYXZhCmluZGV4IGEyNDRjNTUuLjk0MmRhZDQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1B1c2hQcm9jZXNzLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUHVzaFByb2Nlc3MuamF2YQpAQCAtMTgsMTEgKzE4LDE1IEBACiBpbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnMuQWJvcnRlZEJ5SG9va0V4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5NaXNzaW5nT2JqZWN0RXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLk5vdFN1cHBvcnRlZEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5UcmFuc3BvcnRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5ob29rcy5QcmVQdXNoSG9vazsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLkpHaXRUZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5PYmplY3RJZDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Qcm9ncmVzc01vbml0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVmOwpAQCAtNTgsNiArNjIsOCBAQCBjbGFzcyBQdXNoUHJvY2VzcyB7CiAJLyoqIEEgbGlzdCBvZiBvcHRpb24gc3RyaW5ncyBhc3NvY2lhdGVkIHdpdGggdGhpcyBwdXNoICovCiAJcHJpdmF0ZSBMaXN0PFN0cmluZz4gcHVzaE9wdGlvbnM7CiAKKwlwcml2YXRlIGZpbmFsIFByZVB1c2hIb29rIHByZVB1c2g7CisKIAkvKioKIAkgKiBDcmVhdGUgcHJvY2VzcyBmb3Igc3BlY2lmaWVkIHRyYW5zcG9ydCBhbmQgcmVmcyB1cGRhdGVzIHNwZWNpZmljYXRpb24uCiAJICoKQEAgLTY2LDEyICs3MiwxNCBAQCBjbGFzcyBQdXNoUHJvY2VzcyB7CiAJICogICAgICAgICAgICBjb25uZWN0aW9uLgogCSAqIEBwYXJhbSB0b1B1c2gKIAkgKiAgICAgICAgICAgIHNwZWNpZmljYXRpb24gb2YgcmVmcyB1cGRhdGVzIChhbmQgbG9jYWwgdHJhY2tpbmcgYnJhbmNoZXMpLgotCSAqCisJICogQHBhcmFtIHByZVB1c2gKKwkgKiAgICAgICAgICAgIHtAbGluayBQcmVQdXNoSG9va30gdG8gcnVuIGFmdGVyIHRoZSByZW1vdGUgYWR2ZXJ0aXNlbWVudCBoYXMKKwkgKiAgICAgICAgICAgIGJlZW4gZ290dGVuCiAJICogQHRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24KIAkgKi8KLQlQdXNoUHJvY2VzcyhmaW5hbCBUcmFuc3BvcnQgdHJhbnNwb3J0LAotCQkJZmluYWwgQ29sbGVjdGlvbjxSZW1vdGVSZWZVcGRhdGU+IHRvUHVzaCkgdGhyb3dzIFRyYW5zcG9ydEV4Y2VwdGlvbiB7Ci0JCXRoaXModHJhbnNwb3J0LCB0b1B1c2gsIG51bGwpOworCVB1c2hQcm9jZXNzKFRyYW5zcG9ydCB0cmFuc3BvcnQsIENvbGxlY3Rpb248UmVtb3RlUmVmVXBkYXRlPiB0b1B1c2gsCisJCQlQcmVQdXNoSG9vayBwcmVQdXNoKSB0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uIHsKKwkJdGhpcyh0cmFuc3BvcnQsIHRvUHVzaCwgcHJlUHVzaCwgbnVsbCk7CiAJfQogCiAJLyoqCkBAIC04MiwxNiArOTAsMTkgQEAgY2xhc3MgUHVzaFByb2Nlc3MgewogCSAqICAgICAgICAgICAgY29ubmVjdGlvbi4KIAkgKiBAcGFyYW0gdG9QdXNoCiAJICogICAgICAgICAgICBzcGVjaWZpY2F0aW9uIG9mIHJlZnMgdXBkYXRlcyAoYW5kIGxvY2FsIHRyYWNraW5nIGJyYW5jaGVzKS4KKwkgKiBAcGFyYW0gcHJlUHVzaAorCSAqICAgICAgICAgICAge0BsaW5rIFByZVB1c2hIb29rfSB0byBydW4gYWZ0ZXIgdGhlIHJlbW90ZSBhZHZlcnRpc2VtZW50IGhhcworCSAqICAgICAgICAgICAgYmVlbiBnb3R0ZW4KIAkgKiBAcGFyYW0gb3V0CiAJICogICAgICAgICAgICBPdXRwdXRTdHJlYW0gdG8gd3JpdGUgbWVzc2FnZXMgdG8KIAkgKiBAdGhyb3dzIFRyYW5zcG9ydEV4Y2VwdGlvbgogCSAqLwotCVB1c2hQcm9jZXNzKGZpbmFsIFRyYW5zcG9ydCB0cmFuc3BvcnQsCi0JCQlmaW5hbCBDb2xsZWN0aW9uPFJlbW90ZVJlZlVwZGF0ZT4gdG9QdXNoLCBPdXRwdXRTdHJlYW0gb3V0KQotCQkJdGhyb3dzIFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisJUHVzaFByb2Nlc3MoVHJhbnNwb3J0IHRyYW5zcG9ydCwgQ29sbGVjdGlvbjxSZW1vdGVSZWZVcGRhdGU+IHRvUHVzaCwKKwkJCVByZVB1c2hIb29rIHByZVB1c2gsIE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24gewogCQl0aGlzLndhbGtlciA9IG5ldyBSZXZXYWxrKHRyYW5zcG9ydC5sb2NhbCk7CiAJCXRoaXMudHJhbnNwb3J0ID0gdHJhbnNwb3J0OwogCQl0aGlzLnRvUHVzaCA9IG5ldyBMaW5rZWRIYXNoTWFwPD4oKTsKKwkJdGhpcy5wcmVQdXNoID0gcHJlUHVzaDsKIAkJdGhpcy5vdXQgPSBvdXQ7CiAJCXRoaXMucHVzaE9wdGlvbnMgPSB0cmFuc3BvcnQuZ2V0UHVzaE9wdGlvbnMoKTsKIAkJZm9yIChSZW1vdGVSZWZVcGRhdGUgcnJ1IDogdG9QdXNoKSB7CkBAIC0xMjksMTAgKzE0MCwzOCBAQCBQdXNoUmVzdWx0IGV4ZWN1dGUoUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCiAJCQkJcmVzLnNldEFkdmVydGlzZWRSZWZzKHRyYW5zcG9ydC5nZXRVUkkoKSwgY29ubmVjdGlvbgogCQkJCQkJLmdldFJlZnNNYXAoKSk7CiAJCQkJcmVzLnBlZXJVc2VyQWdlbnQgPSBjb25uZWN0aW9uLmdldFBlZXJVc2VyQWdlbnQoKTsKLQkJCQlyZXMuc2V0UmVtb3RlVXBkYXRlcyh0b1B1c2gpOwogCQkJCW1vbml0b3IuZW5kVGFzaygpOwogCisJCQkJTWFwPFN0cmluZywgUmVtb3RlUmVmVXBkYXRlPiBleHBhbmRlZCA9IGV4cGFuZE1hdGNoaW5nKCk7CisJCQkJdG9QdXNoLmNsZWFyKCk7CisJCQkJdG9QdXNoLnB1dEFsbChleHBhbmRlZCk7CisKKwkJCQlyZXMuc2V0UmVtb3RlVXBkYXRlcyh0b1B1c2gpOwogCQkJCWZpbmFsIE1hcDxTdHJpbmcsIFJlbW90ZVJlZlVwZGF0ZT4gcHJlcHJvY2Vzc2VkID0gcHJlcGFyZVJlbW90ZVVwZGF0ZXMoKTsKKwkJCQlMaXN0PFJlbW90ZVJlZlVwZGF0ZT4gd2lsbEJlQXR0ZW1wdGVkID0gcHJlcHJvY2Vzc2VkLnZhbHVlcygpCisJCQkJCQkuc3RyZWFtKCkuZmlsdGVyKHUgLT4geworCQkJCQkJCXN3aXRjaCAodS5nZXRTdGF0dXMoKSkgeworCQkJCQkJCWNhc2UgTk9OX0VYSVNUSU5HOgorCQkJCQkJCWNhc2UgUkVKRUNURURfTk9ERUxFVEU6CisJCQkJCQkJY2FzZSBSRUpFQ1RFRF9OT05GQVNURk9SV0FSRDoKKwkJCQkJCQljYXNlIFJFSkVDVEVEX09USEVSX1JFQVNPTjoKKwkJCQkJCQljYXNlIFJFSkVDVEVEX1JFTU9URV9DSEFOR0VEOgorCQkJCQkJCWNhc2UgVVBfVE9fREFURToKKwkJCQkJCQkJcmV0dXJuIGZhbHNlOworCQkJCQkJCWRlZmF1bHQ6CisJCQkJCQkJCXJldHVybiB0cnVlOworCQkJCQkJCX0KKwkJCQkJCX0pLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisJCQkJaWYgKCF3aWxsQmVBdHRlbXB0ZWQuaXNFbXB0eSgpKSB7CisJCQkJCWlmIChwcmVQdXNoICE9IG51bGwpIHsKKwkJCQkJCXRyeSB7CisJCQkJCQkJcHJlUHVzaC5zZXRSZWZzKHdpbGxCZUF0dGVtcHRlZCk7CisJCQkJCQkJcHJlUHVzaC5jYWxsKCk7CisJCQkJCQl9IGNhdGNoIChBYm9ydGVkQnlIb29rRXhjZXB0aW9uIHwgSU9FeGNlcHRpb24gZSkgeworCQkJCQkJCXRocm93IG5ldyBUcmFuc3BvcnRFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQogCQkJCWlmICh0cmFuc3BvcnQuaXNEcnlSdW4oKSkKIAkJCQkJbW9kaWZ5VXBkYXRlc0ZvckRyeVJ1bigpOwogCQkJCWVsc2UgaWYgKCFwcmVwcm9jZXNzZWQuaXNFbXB0eSgpKQpAQCAtMjAxLDI1ICsyNDAsOCBAQCBwcml2YXRlIE1hcDxTdHJpbmcsIFJlbW90ZVJlZlVwZGF0ZT4gcHJlcGFyZVJlbW90ZVVwZGF0ZXMoKQogCQkJCWNvbnRpbnVlOwogCQkJfQogCi0JCQkvLyBjaGVjayBmb3IgZmFzdC1mb3J3YXJkOgotCQkJLy8gLSBib3RoIG9sZCBhbmQgbmV3IHJlZiBtdXN0IHBvaW50IHRvIGNvbW1pdHMsIEFORAotCQkJLy8gLSBib3RoIG9mIHRoZW0gbXVzdCBiZSBrbm93biBmb3IgdXMsIGV4aXN0IGluIHJlcG9zaXRvcnksIEFORAotCQkJLy8gLSBvbGQgY29tbWl0IG11c3QgYmUgYW5jZXN0b3Igb2YgbmV3IGNvbW1pdAotCQkJYm9vbGVhbiBmYXN0Rm9yd2FyZCA9IHRydWU7Ci0JCQl0cnkgewotCQkJCVJldk9iamVjdCBvbGRSZXYgPSB3YWxrZXIucGFyc2VBbnkoYWR2ZXJ0aXNlZE9sZCk7Ci0JCQkJZmluYWwgUmV2T2JqZWN0IG5ld1JldiA9IHdhbGtlci5wYXJzZUFueShycnUuZ2V0TmV3T2JqZWN0SWQoKSk7Ci0JCQkJaWYgKCEob2xkUmV2IGluc3RhbmNlb2YgUmV2Q29tbWl0KQotCQkJCQkJfHwgIShuZXdSZXYgaW5zdGFuY2VvZiBSZXZDb21taXQpCi0JCQkJCQl8fCAhd2Fsa2VyLmlzTWVyZ2VkSW50bygoUmV2Q29tbWl0KSBvbGRSZXYsCi0JCQkJCQkJCShSZXZDb21taXQpIG5ld1JldikpCi0JCQkJCWZhc3RGb3J3YXJkID0gZmFsc2U7Ci0JCQl9IGNhdGNoIChNaXNzaW5nT2JqZWN0RXhjZXB0aW9uIHgpIHsKLQkJCQlmYXN0Rm9yd2FyZCA9IGZhbHNlOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIHgpIHsKLQkJCQl0aHJvdyBuZXcgVHJhbnNwb3J0RXhjZXB0aW9uKHRyYW5zcG9ydC5nZXRVUkkoKSwgTWVzc2FnZUZvcm1hdC5mb3JtYXQoCi0JCQkJCQlKR2l0VGV4dC5nZXQoKS5yZWFkaW5nT2JqZWN0c0Zyb21Mb2NhbFJlcG9zaXRvcnlGYWlsZWQsIHguZ2V0TWVzc2FnZSgpKSwgeCk7Ci0JCQl9CisJCQlib29sZWFuIGZhc3RGb3J3YXJkID0gaXNGYXN0Rm9yd2FyZChhZHZlcnRpc2VkT2xkLAorCQkJCQlycnUuZ2V0TmV3T2JqZWN0SWQoKSk7CiAJCQlycnUuc2V0RmFzdEZvcndhcmQoZmFzdEZvcndhcmQpOwogCQkJaWYgKCFmYXN0Rm9yd2FyZCAmJiAhcnJ1LmlzRm9yY2VVcGRhdGUoKSkgewogCQkJCXJydS5zZXRTdGF0dXMoU3RhdHVzLlJFSkVDVEVEX05PTkZBU1RGT1JXQVJEKTsKQEAgLTIzMyw2ICsyNTUsMTM0IEBAIHByaXZhdGUgTWFwPFN0cmluZywgUmVtb3RlUmVmVXBkYXRlPiBwcmVwYXJlUmVtb3RlVXBkYXRlcygpCiAJCXJldHVybiByZXN1bHQ7CiAJfQogCisJLyoqCisJICogRGV0ZXJtaW5lcyB3aGV0aGVyIGFuIHVwZGF0ZSBmcm9tIHtAY29kZSBvbGRPaWR9IHRvIHtAY29kZSBuZXdPaWR9IGlzIGEKKwkgKiBmYXN0LWZvcndhcmQgdXBkYXRlOgorCSAqIDx1bD4KKwkgKiA8bGk+Ym90aCBvbGQgYW5kIG5ldyBtdXN0IGJlIGNvbW1pdHMsIEFORDwvbGk+CisJICogPGxpPmJvdGggb2YgdGhlbSBtdXN0IGJlIGtub3duIHRvIHVzIGFuZCBleGlzdCBpbiB0aGUgcmVwb3NpdG9yeSwKKwkgKiBBTkQ8L2xpPgorCSAqIDxsaT50aGUgb2xkIGNvbW1pdCBtdXN0IGJlIGFuIGFuY2VzdG9yIG9mIHRoZSBuZXcgY29tbWl0LjwvbGk+CisJICogPC91bD4KKwkgKgorCSAqIEBwYXJhbSBvbGRPaWQKKwkgKiAgICAgICAgICAgIHtAbGluayBPYmplY3RJZH3CoG9mIHRoZSBvbGQgY29tbWl0CisJICogQHBhcmFtIG5ld09pZAorCSAqICAgICAgICAgICAge0BsaW5rIE9iamVjdElkfcKgb2YgdGhlIG5ldyBjb21taXQKKwkgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgdXBkYXRlIGZhc3QtZm9yd2FyZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCisJICogQHRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24KKwkgKi8KKwlwcml2YXRlIGJvb2xlYW4gaXNGYXN0Rm9yd2FyZChPYmplY3RJZCBvbGRPaWQsIE9iamVjdElkIG5ld09pZCkKKwkJCXRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24geworCQl0cnkgeworCQkJUmV2T2JqZWN0IG9sZFJldiA9IHdhbGtlci5wYXJzZUFueShvbGRPaWQpOworCQkJUmV2T2JqZWN0IG5ld1JldiA9IHdhbGtlci5wYXJzZUFueShuZXdPaWQpOworCQkJaWYgKCEob2xkUmV2IGluc3RhbmNlb2YgUmV2Q29tbWl0KSB8fCAhKG5ld1JldiBpbnN0YW5jZW9mIFJldkNvbW1pdCkKKwkJCQkJfHwgIXdhbGtlci5pc01lcmdlZEludG8oKFJldkNvbW1pdCkgb2xkUmV2LAorCQkJCQkJCShSZXZDb21taXQpIG5ld1JldikpIHsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCX0gY2F0Y2ggKE1pc3NpbmdPYmplY3RFeGNlcHRpb24geCkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9IGNhdGNoIChFeGNlcHRpb24geCkgeworCQkJdGhyb3cgbmV3IFRyYW5zcG9ydEV4Y2VwdGlvbih0cmFuc3BvcnQuZ2V0VVJJKCksCisJCQkJCU1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpHaXRUZXh0CisJCQkJCQkJLmdldCgpLnJlYWRpbmdPYmplY3RzRnJvbUxvY2FsUmVwb3NpdG9yeUZhaWxlZCwKKwkJCQkJCQl4LmdldE1lc3NhZ2UoKSksCisJCQkJCXgpOworCQl9CisJCXJldHVybiB0cnVlOworCX0KKworCS8qKgorCSAqIEV4cGFuZHMgYWxsIHBsYWNlaG9sZGVyIHtAbGluayBSZW1vdGVSZWZVcGRhdGV9cyBmb3IgIm1hdGNoaW5nIgorCSAqIHtAbGluayBSZWZTcGVjfXMgIjoiIGluIHtAbGluayAjdG9QdXNofSBhbmQgcmV0dXJucyB0aGUgcmVzdWx0aW5nIG1hcCBpbgorCSAqIHdoaWNoIHRoZSBwbGFjZWhvbGRlcnMgaGF2ZSBiZWVuIHJlcGxhY2VkIGJ5IHRoZWlyIGV4cGFuc2lvbi4KKwkgKgorCSAqIEByZXR1cm4gYSBuZXcgbWFwIG9mIHtAbGluayBSZW1vdGVSZWZVcGRhdGV9cyBrZXllZCBieSByZW1vdGUgbmFtZQorCSAqIEB0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uCisJICogICAgICAgICAgICAgaWYgdGhlIGV4cGFuc2lvbiByZXN1bHRzIGluIGR1cGxpY2F0ZSB1cGRhdGVzCisJICovCisJcHJpdmF0ZSBNYXA8U3RyaW5nLCBSZW1vdGVSZWZVcGRhdGU+IGV4cGFuZE1hdGNoaW5nKCkKKwkJCXRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24geworCQlNYXA8U3RyaW5nLCBSZW1vdGVSZWZVcGRhdGU+IHJlc3VsdCA9IG5ldyBMaW5rZWRIYXNoTWFwPD4oKTsKKwkJYm9vbGVhbiBoYWRNYXRjaCA9IGZhbHNlOworCQlmb3IgKFJlbW90ZVJlZlVwZGF0ZSB1cGRhdGUgOiB0b1B1c2gudmFsdWVzKCkpIHsKKwkJCWlmICh1cGRhdGUuaXNNYXRjaGluZygpKSB7CisJCQkJaWYgKGhhZE1hdGNoKSB7CisJCQkJCXRocm93IG5ldyBUcmFuc3BvcnRFeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoCisJCQkJCQkJSkdpdFRleHQuZ2V0KCkuZHVwbGljYXRlUmVtb3RlUmVmVXBkYXRlSXNJbGxlZ2FsLAorCQkJCQkJCSI6IikpOyAvLyROT04tTkxTLTEkCisJCQkJfQorCQkJCWV4cGFuZE1hdGNoaW5nKHJlc3VsdCwgdXBkYXRlKTsKKwkJCQloYWRNYXRjaCA9IHRydWU7CisJCQl9IGVsc2UgaWYgKHJlc3VsdC5wdXQodXBkYXRlLmdldFJlbW90ZU5hbWUoKSwgdXBkYXRlKSAhPSBudWxsKSB7CisJCQkJdGhyb3cgbmV3IFRyYW5zcG9ydEV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdCgKKwkJCQkJCUpHaXRUZXh0LmdldCgpLmR1cGxpY2F0ZVJlbW90ZVJlZlVwZGF0ZUlzSWxsZWdhbCwKKwkJCQkJCXVwZGF0ZS5nZXRSZW1vdGVOYW1lKCkpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qKgorCSAqIEV4cGFuZHMgdGhlIHBsYWNlaG9sZGVyIHtAbGluayBSZW1vdGVSZWZVcGRhdGV9IHtAY29kZSBtYXRjaH0gZm9yIGEKKwkgKiAibWF0Y2hpbmciIHtAbGluayBSZWZTcGVjfSAiOiIgb3IgIis6IiBhbmQgcHV0cyB0aGUgZXhwYW5zaW9uIGludG8gdGhlCisJICogZ2l2ZW4gbWFwIHtAY29kZSB1cGRhdGVzfS4KKwkgKgorCSAqIEBwYXJhbSB1cGRhdGVzCisJICogICAgICAgICAgICBtYXAgdG8gcHV0IHRoZSBleHBhbnNpb24gaW4KKwkgKiBAcGFyYW0gbWF0Y2gKKwkgKiAgICAgICAgICAgIHRoZSBwbGFjZWhvbGRlciB7QGxpbmsgUmVtb3RlUmVmVXBkYXRlfSB0byBleHBhbmQKKwkgKgorCSAqIEB0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uCisJICogICAgICAgICAgICAgaWYgdGhlIGV4cGFuc2lvbiByZXN1bHRzIGluIGR1cGxpY2F0ZSB1cGRhdGVzLCBvciB0aGUgbG9jYWwKKwkgKiAgICAgICAgICAgICBicmFuY2hlcyBjYW5ub3QgYmUgZGV0ZXJtaW5lZAorCSAqLworCXByaXZhdGUgdm9pZCBleHBhbmRNYXRjaGluZyhNYXA8U3RyaW5nLCBSZW1vdGVSZWZVcGRhdGU+IHVwZGF0ZXMsCisJCQlSZW1vdGVSZWZVcGRhdGUgbWF0Y2gpIHRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24geworCQl0cnkgeworCQkJTWFwPFN0cmluZywgUmVmPiBhZHZlcnRpc2VtZW50ID0gY29ubmVjdGlvbi5nZXRSZWZzTWFwKCk7CisJCQlDb2xsZWN0aW9uPFJlZlNwZWM+IGZldGNoU3BlY3MgPSBtYXRjaC5nZXRGZXRjaFNwZWNzKCk7CisJCQlib29sZWFuIGZvcmNlVXBkYXRlID0gbWF0Y2guaXNGb3JjZVVwZGF0ZSgpOworCQkJZm9yIChSZWYgbG9jYWwgOiB0cmFuc3BvcnQubG9jYWwuZ2V0UmVmRGF0YWJhc2UoKQorCQkJCQkuZ2V0UmVmc0J5UHJlZml4KENvbnN0YW50cy5SX0hFQURTKSkgeworCQkJCWlmIChsb2NhbC5pc1N5bWJvbGljKCkpIHsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCVN0cmluZyBuYW1lID0gbG9jYWwuZ2V0TmFtZSgpOworCQkJCVJlZiBhZHZlcnRpc2VkID0gYWR2ZXJ0aXNlbWVudC5nZXQobmFtZSk7CisJCQkJaWYgKGFkdmVydGlzZWQgPT0gbnVsbCB8fCBhZHZlcnRpc2VkLmlzU3ltYm9saWMoKSkgeworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJT2JqZWN0SWQgb2xkT2lkID0gYWR2ZXJ0aXNlZC5nZXRPYmplY3RJZCgpOworCQkJCWlmIChvbGRPaWQgPT0gbnVsbCB8fCBPYmplY3RJZC56ZXJvSWQoKS5lcXVhbHMob2xkT2lkKSkgeworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJT2JqZWN0SWQgbmV3T2lkID0gbG9jYWwuZ2V0T2JqZWN0SWQoKTsKKwkJCQlpZiAobmV3T2lkID09IG51bGwgfHwgT2JqZWN0SWQuemVyb0lkKCkuZXF1YWxzKG5ld09pZCkpIHsKKwkJCQkJY29udGludWU7CisJCQkJfQorCisJCQkJUmVtb3RlUmVmVXBkYXRlIHJydSA9IG5ldyBSZW1vdGVSZWZVcGRhdGUodHJhbnNwb3J0LmxvY2FsLCBuYW1lLAorCQkJCQkJbmV3T2lkLCBuYW1lLCBmb3JjZVVwZGF0ZSwKKwkJCQkJCVRyYW5zcG9ydC5maW5kVHJhY2tpbmdSZWZOYW1lKG5hbWUsIGZldGNoU3BlY3MpLAorCQkJCQkJb2xkT2lkKTsKKwkJCQlpZiAodXBkYXRlcy5wdXQocnJ1LmdldFJlbW90ZU5hbWUoKSwgcnJ1KSAhPSBudWxsKSB7CisJCQkJCXRocm93IG5ldyBUcmFuc3BvcnRFeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoCisJCQkJCQkJSkdpdFRleHQuZ2V0KCkuZHVwbGljYXRlUmVtb3RlUmVmVXBkYXRlSXNJbGxlZ2FsLAorCQkJCQkJCXJydS5nZXRSZW1vdGVOYW1lKCkpKTsKKwkJCQl9CisJCQl9CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIHgpIHsKKwkJCXRocm93IG5ldyBUcmFuc3BvcnRFeGNlcHRpb24odHJhbnNwb3J0LmdldFVSSSgpLAorCQkJCQlNZXNzYWdlRm9ybWF0LmZvcm1hdChKR2l0VGV4dAorCQkJCQkJCS5nZXQoKS5yZWFkaW5nT2JqZWN0c0Zyb21Mb2NhbFJlcG9zaXRvcnlGYWlsZWQsCisJCQkJCQkJeC5nZXRNZXNzYWdlKCkpLAorCQkJCQl4KTsKKwkJfQorCX0KKwogCXByaXZhdGUgTWFwPFN0cmluZywgUmVtb3RlUmVmVXBkYXRlPiByZWplY3RBbGwoKSB7CiAJCWZvciAoUmVtb3RlUmVmVXBkYXRlIHJydSA6IHRvUHVzaC52YWx1ZXMoKSkgewogCQkJaWYgKHJydS5nZXRTdGF0dXMoKSA9PSBTdGF0dXMuTk9UX0FUVEVNUFRFRCkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUmVmU3BlYy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUmVmU3BlYy5qYXZhCmluZGV4IGFjMzU3YWYuLjU2ZDAwMzYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1JlZlNwZWMuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9SZWZTcGVjLmphdmEKQEAgLTEyLDExICsxMiwxMSBAQAogCiBpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CiBpbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7CitpbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLkpHaXRUZXh0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLlJlZmVyZW5jZXM7CiAKIC8qKgogICogRGVzY3JpYmVzIGhvdyByZWZzIGluIG9uZSByZXBvc2l0b3J5IGNvcHkgaW50byBhbm90aGVyIHJlcG9zaXRvcnkuCkBAIC01MCw2ICs1MCw5IEBAIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1dpbGRjYXJkKFN0cmluZyBzKSB7CiAJLyoqIElzIHRoaXMgc3BlY2lmaWNhdGlvbiBhY3R1YWxseSBhIHdpbGRjYXJkIG1hdGNoPyAqLwogCXByaXZhdGUgYm9vbGVhbiB3aWxkY2FyZDsKIAorCS8qKiBJcyB0aGlzIHRoZSBzcGVjaWFsICI6IiBSZWZTcGVjPyAqLworCXByaXZhdGUgYm9vbGVhbiBtYXRjaGluZzsKKwogCS8qKgogCSAqIEhvdyBzdHJpY3QgdG8gYmUgYWJvdXQgd2lsZGNhcmRzLgogCSAqCkBAIC03MSw2ICs3NCw3IEBAIHB1YmxpYyBlbnVtIFdpbGRjYXJkTW9kZSB7CiAJCSAqLwogCQlBTExPV19NSVNNQVRDSAogCX0KKwogCS8qKiBXaGV0aGVyIGEgd2lsZGNhcmQgaXMgYWxsb3dlZCBvbiBvbmUgc2lkZSBidXQgbm90IHRoZSBvdGhlci4gKi8KIAlwcml2YXRlIFdpbGRjYXJkTW9kZSBhbGxvd01pc21hdGNoZWRXaWxkY2FyZHM7CiAKQEAgLTg3LDYgKzkxLDcgQEAgcHVibGljIGVudW0gV2lsZGNhcmRNb2RlIHsKIAkgKiBhcHBsaWNhdGlvbnMsIGFzIGF0IGxlYXN0IG9uZSBmaWVsZCBtdXN0IGJlIHNldCB0byBtYXRjaCBhIHNvdXJjZSBuYW1lLgogCSAqLwogCXB1YmxpYyBSZWZTcGVjKCkgeworCQltYXRjaGluZyA9IGZhbHNlOwogCQlmb3JjZSA9IGZhbHNlOwogCQl3aWxkY2FyZCA9IGZhbHNlOwogCQlzcmNOYW1lID0gQ29uc3RhbnRzLkhFQUQ7CkBAIC0xMzMsMTcgKzEzOCwyNSBAQCBwdWJsaWMgUmVmU3BlYyhTdHJpbmcgc3BlYywgV2lsZGNhcmRNb2RlIG1vZGUpIHsKIAkJCXMgPSBzLnN1YnN0cmluZygxKTsKIAkJfQogCisJCWJvb2xlYW4gbWF0Y2hQdXNoU3BlYyA9IGZhbHNlOwogCQlmaW5hbCBpbnQgYyA9IHMubGFzdEluZGV4T2YoJzonKTsKIAkJaWYgKGMgPT0gMCkgewogCQkJcyA9IHMuc3Vic3RyaW5nKDEpOwotCQkJaWYgKGlzV2lsZGNhcmQocykpIHsKKwkJCWlmIChzLmlzRW1wdHkoKSkgeworCQkJCW1hdGNoUHVzaFNwZWMgPSB0cnVlOwogCQkJCXdpbGRjYXJkID0gdHJ1ZTsKLQkJCQlpZiAobW9kZSA9PSBXaWxkY2FyZE1vZGUuUkVRVUlSRV9NQVRDSCkgewotCQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQKLQkJCQkJCQkuZm9ybWF0KEpHaXRUZXh0LmdldCgpLmludmFsaWRXaWxkY2FyZHMsIHNwZWMpKTsKKwkJCQlzcmNOYW1lID0gQ29uc3RhbnRzLlJfSEVBRFMgKyAnKic7CisJCQkJZHN0TmFtZSA9IHNyY05hbWU7CisJCQl9IGVsc2UgeworCQkJCWlmIChpc1dpbGRjYXJkKHMpKSB7CisJCQkJCXdpbGRjYXJkID0gdHJ1ZTsKKwkJCQkJaWYgKG1vZGUgPT0gV2lsZGNhcmRNb2RlLlJFUVVJUkVfTUFUQ0gpIHsKKwkJCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZUZvcm1hdAorCQkJCQkJCQkuZm9ybWF0KEpHaXRUZXh0LmdldCgpLmludmFsaWRXaWxkY2FyZHMsIHNwZWMpKTsKKwkJCQkJfQogCQkJCX0KKwkJCQlkc3ROYW1lID0gY2hlY2tWYWxpZChzKTsKIAkJCX0KLQkJCWRzdE5hbWUgPSBjaGVja1ZhbGlkKHMpOwogCQl9IGVsc2UgaWYgKGMgPiAwKSB7CiAJCQlTdHJpbmcgc3JjID0gcy5zdWJzdHJpbmcoMCwgYyk7CiAJCQlTdHJpbmcgZHN0ID0gcy5zdWJzdHJpbmcoYyArIDEpOwpAQCAtMTY4LDYgKzE4MSw3IEBAIHB1YmxpYyBSZWZTcGVjKFN0cmluZyBzcGVjLCBXaWxkY2FyZE1vZGUgbW9kZSkgewogCQkJfQogCQkJc3JjTmFtZSA9IGNoZWNrVmFsaWQocyk7CiAJCX0KKwkJbWF0Y2hpbmcgPSBtYXRjaFB1c2hTcGVjOwogCX0KIAogCS8qKgpAQCAtMTk1LDYgKzIwOSw3IEBAIHB1YmxpYyBSZWZTcGVjKFN0cmluZyBzcGVjKSB7CiAJfQogCiAJcHJpdmF0ZSBSZWZTcGVjKFJlZlNwZWMgcCkgeworCQltYXRjaGluZyA9IGZhbHNlOwogCQlmb3JjZSA9IHAuaXNGb3JjZVVwZGF0ZSgpOwogCQl3aWxkY2FyZCA9IHAuaXNXaWxkY2FyZCgpOwogCQlzcmNOYW1lID0gcC5nZXRTb3VyY2UoKTsKQEAgLTIwMyw2ICsyMTgsMTcgQEAgcHJpdmF0ZSBSZWZTcGVjKFJlZlNwZWMgcCkgewogCX0KIAogCS8qKgorCSAqIFRlbGxzIHdoZXRoZXIgdGhpcyB7QGxpbmsgUmVmU3BlY30gaXMgdGhlIHNwZWNpYWwgIm1hdGNoaW5nIiBSZWZTcGVjICI6IgorCSAqIGZvciBwdXNoaW5nLgorCSAqCisJICogQHJldHVybiB3aGV0aGVyIHRoaXMgaXMgYSAibWF0Y2hpbmciIFJlZlNwZWMKKwkgKiBAc2luY2UgNi4xCisJICovCisJcHVibGljIGJvb2xlYW4gaXNNYXRjaGluZygpIHsKKwkJcmV0dXJuIG1hdGNoaW5nOworCX0KKworCS8qKgogCSAqIENoZWNrIGlmIHRoaXMgc3BlY2lmaWNhdGlvbiB3YW50cyB0byBmb3JjZWZ1bGx5IHVwZGF0ZSB0aGUgZGVzdGluYXRpb24uCiAJICoKIAkgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBzcGVjaWZpY2F0aW9uIGFza3MgZm9yIHVwZGF0ZXMgd2l0aG91dCBtZXJnZSB0ZXN0cy4KQEAgLTIyMCw2ICsyNDYsNyBAQCBwdWJsaWMgYm9vbGVhbiBpc0ZvcmNlVXBkYXRlKCkgewogCSAqLwogCXB1YmxpYyBSZWZTcGVjIHNldEZvcmNlVXBkYXRlKGJvb2xlYW4gZm9yY2VVcGRhdGUpIHsKIAkJZmluYWwgUmVmU3BlYyByID0gbmV3IFJlZlNwZWModGhpcyk7CisJCXIubWF0Y2hpbmcgPSBtYXRjaGluZzsKIAkJci5mb3JjZSA9IGZvcmNlVXBkYXRlOwogCQlyZXR1cm4gcjsKIAl9CkBAIC0zMjIsOCArMzQ5LDcgQEAgcHVibGljIFJlZlNwZWMgc2V0RGVzdGluYXRpb24oU3RyaW5nIGRlc3RpbmF0aW9uKSB7CiAJICogICAgICAgICAgICAgVGhlIHdpbGRjYXJkIHN0YXR1cyBvZiB0aGUgbmV3IHNvdXJjZSBkaXNhZ3JlZXMgd2l0aCB0aGUKIAkgKiAgICAgICAgICAgICB3aWxkY2FyZCBzdGF0dXMgb2YgdGhlIG5ldyBkZXN0aW5hdGlvbi4KIAkgKi8KLQlwdWJsaWMgUmVmU3BlYyBzZXRTb3VyY2VEZXN0aW5hdGlvbihmaW5hbCBTdHJpbmcgc291cmNlLAotCQkJZmluYWwgU3RyaW5nIGRlc3RpbmF0aW9uKSB7CisJcHVibGljIFJlZlNwZWMgc2V0U291cmNlRGVzdGluYXRpb24oU3RyaW5nIHNvdXJjZSwgU3RyaW5nIGRlc3RpbmF0aW9uKSB7CiAJCWlmIChpc1dpbGRjYXJkKHNvdXJjZSkgIT0gaXNXaWxkY2FyZChkZXN0aW5hdGlvbikpCiAJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKEpHaXRUZXh0LmdldCgpLnNvdXJjZURlc3RpbmF0aW9uTXVzdE1hdGNoKTsKIAkJZmluYWwgUmVmU3BlYyByID0gbmV3IFJlZlNwZWModGhpcyk7CkBAIC01NDEsMzcgKzU2NywzNiBAQCBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewogCQlpZiAoIShvYmogaW5zdGFuY2VvZiBSZWZTcGVjKSkKIAkJCXJldHVybiBmYWxzZTsKIAkJZmluYWwgUmVmU3BlYyBiID0gKFJlZlNwZWMpIG9iajsKLQkJaWYgKGlzRm9yY2VVcGRhdGUoKSAhPSBiLmlzRm9yY2VVcGRhdGUoKSkKKwkJaWYgKGlzRm9yY2VVcGRhdGUoKSAhPSBiLmlzRm9yY2VVcGRhdGUoKSkgewogCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoaXNXaWxkY2FyZCgpICE9IGIuaXNXaWxkY2FyZCgpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoIWVxKGdldFNvdXJjZSgpLCBiLmdldFNvdXJjZSgpKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKCFlcShnZXREZXN0aW5hdGlvbigpLCBiLmdldERlc3RpbmF0aW9uKCkpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGVxKFN0cmluZyBhLCBTdHJpbmcgYikgewotCQlpZiAoUmVmZXJlbmNlcy5pc1NhbWVPYmplY3QoYSwgYikpIHsKLQkJCXJldHVybiB0cnVlOwogCQl9Ci0JCWlmIChhID09IG51bGwgfHwgYiA9PSBudWxsKQorCQlpZiAoaXNNYXRjaGluZygpKSB7CisJCQlyZXR1cm4gYi5pc01hdGNoaW5nKCk7CisJCX0gZWxzZSBpZiAoYi5pc01hdGNoaW5nKCkpIHsKIAkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIGEuZXF1YWxzKGIpOworCQl9CisJCXJldHVybiBpc1dpbGRjYXJkKCkgPT0gYi5pc1dpbGRjYXJkKCkKKwkJCQkmJiBPYmplY3RzLmVxdWFscyhnZXRTb3VyY2UoKSwgYi5nZXRTb3VyY2UoKSkKKwkJCQkmJiBPYmplY3RzLmVxdWFscyhnZXREZXN0aW5hdGlvbigpLCBiLmdldERlc3RpbmF0aW9uKCkpOwogCX0KIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJZmluYWwgU3RyaW5nQnVpbGRlciByID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJaWYgKGlzRm9yY2VVcGRhdGUoKSkKKwkJaWYgKGlzRm9yY2VVcGRhdGUoKSkgewogCQkJci5hcHBlbmQoJysnKTsKLQkJaWYgKGdldFNvdXJjZSgpICE9IG51bGwpCi0JCQlyLmFwcGVuZChnZXRTb3VyY2UoKSk7Ci0JCWlmIChnZXREZXN0aW5hdGlvbigpICE9IG51bGwpIHsKKwkJfQorCQlpZiAoaXNNYXRjaGluZygpKSB7CiAJCQlyLmFwcGVuZCgnOicpOwotCQkJci5hcHBlbmQoZ2V0RGVzdGluYXRpb24oKSk7CisJCX0gZWxzZSB7CisJCQlpZiAoZ2V0U291cmNlKCkgIT0gbnVsbCkgeworCQkJCXIuYXBwZW5kKGdldFNvdXJjZSgpKTsKKwkJCX0KKwkJCWlmIChnZXREZXN0aW5hdGlvbigpICE9IG51bGwpIHsKKwkJCQlyLmFwcGVuZCgnOicpOworCQkJCXIuYXBwZW5kKGdldERlc3RpbmF0aW9uKCkpOworCQkJfQogCQl9CiAJCXJldHVybiByLnRvU3RyaW5nKCk7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUmVtb3RlUmVmVXBkYXRlLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9SZW1vdGVSZWZVcGRhdGUuamF2YQppbmRleCA0M2VhYWM3Li4yMThlNjJjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9SZW1vdGVSZWZVcGRhdGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9SZW1vdGVSZWZVcGRhdGUuamF2YQpAQCAtMTIsNyArMTIsOSBAQAogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYW5ub3RhdGlvbnMuTm9uTnVsbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLkpHaXRUZXh0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLk9iamVjdElkOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlZjsKQEAgLTExNiw2ICsxMTgsMTIgQEAgcHVibGljIGVudW0gU3RhdHVzIHsKIAlwcml2YXRlIFJlZlVwZGF0ZSBsb2NhbFVwZGF0ZTsKIAogCS8qKgorCSAqIElmIHNldCwgdGhlIFJlbW90ZVJlZlVwZGF0ZSBpcyBhIHBsYWNlaG9sZGVyIGZvciB0aGUgIm1hdGNoaW5nIiBSZWZTcGVjCisJICogdG8gYmUgZXhwYW5kZWQgYWZ0ZXIgdGhlIGFkdmVydGlzZW1lbnRzIGhhdmUgYmVlbiByZWNlaXZlZCBpbiBhIHB1c2guCisJICovCisJcHJpdmF0ZSBDb2xsZWN0aW9uPFJlZlNwZWM+IGZldGNoU3BlY3M7CisKKwkvKioKIAkgKiBDb25zdHJ1Y3QgcmVtb3RlIHJlZiB1cGRhdGUgcmVxdWVzdCBieSBwcm92aWRpbmcgYW4gdXBkYXRlIHNwZWNpZmljYXRpb24uCiAJICogT2JqZWN0IGlzIGNyZWF0ZWQgd2l0aCBkZWZhdWx0CiAJICoge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlJlbW90ZVJlZlVwZGF0ZS5TdGF0dXMjTk9UX0FUVEVNUFRFRH0KQEAgLTE1Nyw5ICsxNjUsOCBAQCBwdWJsaWMgZW51bSBTdGF0dXMgewogCSAqIEB0aHJvd3MgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIGlmIHNvbWUgcmVxdWlyZWQgcGFyYW1ldGVyIHdhcyBudWxsCiAJICovCi0JcHVibGljIFJlbW90ZVJlZlVwZGF0ZShmaW5hbCBSZXBvc2l0b3J5IGxvY2FsRGIsIGZpbmFsIFN0cmluZyBzcmNSZWYsCi0JCQlmaW5hbCBTdHJpbmcgcmVtb3RlTmFtZSwgZmluYWwgYm9vbGVhbiBmb3JjZVVwZGF0ZSwKLQkJCWZpbmFsIFN0cmluZyBsb2NhbE5hbWUsIGZpbmFsIE9iamVjdElkIGV4cGVjdGVkT2xkT2JqZWN0SWQpCisJcHVibGljIFJlbW90ZVJlZlVwZGF0ZShSZXBvc2l0b3J5IGxvY2FsRGIsIFN0cmluZyBzcmNSZWYsIFN0cmluZyByZW1vdGVOYW1lLAorCQkJYm9vbGVhbiBmb3JjZVVwZGF0ZSwgU3RyaW5nIGxvY2FsTmFtZSwgT2JqZWN0SWQgZXhwZWN0ZWRPbGRPYmplY3RJZCkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXRoaXMobG9jYWxEYiwgc3JjUmVmLCBzcmNSZWYgIT0gbnVsbCA/IGxvY2FsRGIucmVzb2x2ZShzcmNSZWYpCiAJCQkJOiBPYmplY3RJZC56ZXJvSWQoKSwgcmVtb3RlTmFtZSwgZm9yY2VVcGRhdGUsIGxvY2FsTmFtZSwKQEAgLTIwMyw5ICsyMTAsOCBAQCBwdWJsaWMgUmVtb3RlUmVmVXBkYXRlKGZpbmFsIFJlcG9zaXRvcnkgbG9jYWxEYiwgZmluYWwgU3RyaW5nIHNyY1JlZiwKIAkgKiBAdGhyb3dzIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KIAkgKiAgICAgICAgICAgICBpZiBzb21lIHJlcXVpcmVkIHBhcmFtZXRlciB3YXMgbnVsbAogCSAqLwotCXB1YmxpYyBSZW1vdGVSZWZVcGRhdGUoZmluYWwgUmVwb3NpdG9yeSBsb2NhbERiLCBmaW5hbCBSZWYgc3JjUmVmLAotCQkJZmluYWwgU3RyaW5nIHJlbW90ZU5hbWUsIGZpbmFsIGJvb2xlYW4gZm9yY2VVcGRhdGUsCi0JCQlmaW5hbCBTdHJpbmcgbG9jYWxOYW1lLCBmaW5hbCBPYmplY3RJZCBleHBlY3RlZE9sZE9iamVjdElkKQorCXB1YmxpYyBSZW1vdGVSZWZVcGRhdGUoUmVwb3NpdG9yeSBsb2NhbERiLCBSZWYgc3JjUmVmLCBTdHJpbmcgcmVtb3RlTmFtZSwKKwkJCWJvb2xlYW4gZm9yY2VVcGRhdGUsIFN0cmluZyBsb2NhbE5hbWUsIE9iamVjdElkIGV4cGVjdGVkT2xkT2JqZWN0SWQpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQl0aGlzKGxvY2FsRGIsIHNyY1JlZiAhPSBudWxsID8gc3JjUmVmLmdldE5hbWUoKSA6IG51bGwsCiAJCQkJc3JjUmVmICE9IG51bGwgPyBzcmNSZWYuZ2V0T2JqZWN0SWQoKSA6IG51bGwsIHJlbW90ZU5hbWUsCkBAIC0yNTUsMjggKzI2MSw0MSBAQCBwdWJsaWMgUmVtb3RlUmVmVXBkYXRlKGZpbmFsIFJlcG9zaXRvcnkgbG9jYWxEYiwgZmluYWwgUmVmIHNyY1JlZiwKIAkgKiBAdGhyb3dzIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KIAkgKiAgICAgICAgICAgICBpZiBzb21lIHJlcXVpcmVkIHBhcmFtZXRlciB3YXMgbnVsbAogCSAqLwotCXB1YmxpYyBSZW1vdGVSZWZVcGRhdGUoZmluYWwgUmVwb3NpdG9yeSBsb2NhbERiLCBmaW5hbCBTdHJpbmcgc3JjUmVmLAotCQkJZmluYWwgT2JqZWN0SWQgc3JjSWQsIGZpbmFsIFN0cmluZyByZW1vdGVOYW1lLAotCQkJZmluYWwgYm9vbGVhbiBmb3JjZVVwZGF0ZSwgZmluYWwgU3RyaW5nIGxvY2FsTmFtZSwKLQkJCWZpbmFsIE9iamVjdElkIGV4cGVjdGVkT2xkT2JqZWN0SWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChyZW1vdGVOYW1lID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKEpHaXRUZXh0LmdldCgpLnJlbW90ZU5hbWVDYW5ub3RCZU51bGwpOwotCQlpZiAoc3JjSWQgPT0gbnVsbCAmJiBzcmNSZWYgIT0gbnVsbCkKLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdCgKLQkJCQkJSkdpdFRleHQuZ2V0KCkuc291cmNlUmVmRG9lc250UmVzb2x2ZVRvQW55T2JqZWN0LCBzcmNSZWYpKTsKKwlwdWJsaWMgUmVtb3RlUmVmVXBkYXRlKFJlcG9zaXRvcnkgbG9jYWxEYiwgU3RyaW5nIHNyY1JlZiwgT2JqZWN0SWQgc3JjSWQsCisJCQlTdHJpbmcgcmVtb3RlTmFtZSwgYm9vbGVhbiBmb3JjZVVwZGF0ZSwgU3RyaW5nIGxvY2FsTmFtZSwKKwkJCU9iamVjdElkIGV4cGVjdGVkT2xkT2JqZWN0SWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXRoaXMobG9jYWxEYiwgc3JjUmVmLCBzcmNJZCwgcmVtb3RlTmFtZSwgZm9yY2VVcGRhdGUsIGxvY2FsTmFtZSwgbnVsbCwKKwkJCQlleHBlY3RlZE9sZE9iamVjdElkKTsKKwl9CiAKLQkJaWYgKHNyY1JlZiAhPSBudWxsKQorCXByaXZhdGUgUmVtb3RlUmVmVXBkYXRlKFJlcG9zaXRvcnkgbG9jYWxEYiwgU3RyaW5nIHNyY1JlZiwgT2JqZWN0SWQgc3JjSWQsCisJCQlTdHJpbmcgcmVtb3RlTmFtZSwgYm9vbGVhbiBmb3JjZVVwZGF0ZSwgU3RyaW5nIGxvY2FsTmFtZSwKKwkJCUNvbGxlY3Rpb248UmVmU3BlYz4gZmV0Y2hTcGVjcywgT2JqZWN0SWQgZXhwZWN0ZWRPbGRPYmplY3RJZCkKKwkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CisJCWlmIChmZXRjaFNwZWNzID09IG51bGwpIHsKKwkJCWlmIChyZW1vdGVOYW1lID09IG51bGwpIHsKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorCQkJCQkJSkdpdFRleHQuZ2V0KCkucmVtb3RlTmFtZUNhbm5vdEJlTnVsbCk7CisJCQl9CisJCQlpZiAoc3JjSWQgPT0gbnVsbCAmJiBzcmNSZWYgIT0gbnVsbCkgeworCQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdCgKKwkJCQkJCUpHaXRUZXh0LmdldCgpLnNvdXJjZVJlZkRvZXNudFJlc29sdmVUb0FueU9iamVjdCwKKwkJCQkJCXNyY1JlZikpOworCQkJfQorCQl9CisJCWlmIChzcmNSZWYgIT0gbnVsbCkgewogCQkJdGhpcy5zcmNSZWYgPSBzcmNSZWY7Ci0JCWVsc2UgaWYgKHNyY0lkICE9IG51bGwgJiYgIXNyY0lkLmVxdWFscyhPYmplY3RJZC56ZXJvSWQoKSkpCisJCX0gZWxzZSBpZiAoc3JjSWQgIT0gbnVsbCAmJiAhc3JjSWQuZXF1YWxzKE9iamVjdElkLnplcm9JZCgpKSkgewogCQkJdGhpcy5zcmNSZWYgPSBzcmNJZC5uYW1lKCk7Ci0JCWVsc2UKKwkJfSBlbHNlIHsKIAkJCXRoaXMuc3JjUmVmID0gbnVsbDsKLQotCQlpZiAoc3JjSWQgIT0gbnVsbCkKKwkJfQorCQlpZiAoc3JjSWQgIT0gbnVsbCkgewogCQkJdGhpcy5uZXdPYmplY3RJZCA9IHNyY0lkOwotCQllbHNlCisJCX0gZWxzZSB7CiAJCQl0aGlzLm5ld09iamVjdElkID0gT2JqZWN0SWQuemVyb0lkKCk7Ci0KKwkJfQorCQl0aGlzLmZldGNoU3BlY3MgPSBmZXRjaFNwZWNzOwogCQl0aGlzLnJlbW90ZU5hbWUgPSByZW1vdGVOYW1lOwogCQl0aGlzLmZvcmNlVXBkYXRlID0gZm9yY2VVcGRhdGU7CiAJCWlmIChsb2NhbE5hbWUgIT0gbnVsbCAmJiBsb2NhbERiICE9IG51bGwpIHsKQEAgLTI5Miw4ICszMTEsOSBAQCBlbHNlIGlmIChzcmNJZCAhPSBudWxsICYmICFzcmNJZC5lcXVhbHMoT2JqZWN0SWQuemVyb0lkKCkpKQogCQkJCQkJPyBsb2NhbFVwZGF0ZS5nZXRPbGRPYmplY3RJZCgpCiAJCQkJCQk6IE9iamVjdElkLnplcm9JZCgpLAogCQkJCQluZXdPYmplY3RJZCk7Ci0JCX0gZWxzZQorCQl9IGVsc2UgewogCQkJdHJhY2tpbmdSZWZVcGRhdGUgPSBudWxsOworCQl9CiAJCXRoaXMubG9jYWxEYiA9IGxvY2FsRGI7CiAJCXRoaXMuZXhwZWN0ZWRPbGRPYmplY3RJZCA9IGV4cGVjdGVkT2xkT2JqZWN0SWQ7CiAJCXRoaXMuc3RhdHVzID0gU3RhdHVzLk5PVF9BVFRFTVBURUQ7CkBAIC0zMTYsMTEgKzMzNiw1NyBAQCBlbHNlIGlmIChzcmNJZCAhPSBudWxsICYmICFzcmNJZC5lcXVhbHMoT2JqZWN0SWQuemVyb0lkKCkpKQogCSAqICAgICAgICAgICAgIGxvY2FsIHRyYWNraW5nIGJyYW5jaCBvciBzcmNSZWYgb2YgYmFzZSBvYmplY3Qgbm8gbG9uZ2VyIGNhbgogCSAqICAgICAgICAgICAgIGJlIHJlc29sdmVkIHRvIGFueSBvYmplY3QuCiAJICovCi0JcHVibGljIFJlbW90ZVJlZlVwZGF0ZShmaW5hbCBSZW1vdGVSZWZVcGRhdGUgYmFzZSwKLQkJCWZpbmFsIE9iamVjdElkIG5ld0V4cGVjdGVkT2xkT2JqZWN0SWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXRoaXMoYmFzZS5sb2NhbERiLCBiYXNlLnNyY1JlZiwgYmFzZS5yZW1vdGVOYW1lLCBiYXNlLmZvcmNlVXBkYXRlLAorCXB1YmxpYyBSZW1vdGVSZWZVcGRhdGUoUmVtb3RlUmVmVXBkYXRlIGJhc2UsCisJCQlPYmplY3RJZCBuZXdFeHBlY3RlZE9sZE9iamVjdElkKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQl0aGlzKGJhc2UubG9jYWxEYiwgYmFzZS5zcmNSZWYsIGJhc2UubmV3T2JqZWN0SWQsIGJhc2UucmVtb3RlTmFtZSwKKwkJCQliYXNlLmZvcmNlVXBkYXRlLAogCQkJCShiYXNlLnRyYWNraW5nUmVmVXBkYXRlID09IG51bGwgPyBudWxsIDogYmFzZS50cmFja2luZ1JlZlVwZGF0ZQotCQkJCQkJLmdldExvY2FsTmFtZSgpKSwgbmV3RXhwZWN0ZWRPbGRPYmplY3RJZCk7CisJCQkJCQkuZ2V0TG9jYWxOYW1lKCkpLAorCQkJCWJhc2UuZmV0Y2hTcGVjcywgbmV3RXhwZWN0ZWRPbGRPYmplY3RJZCk7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhICJwbGFjZWhvbGRlciIgdXBkYXRlIGZvciB0aGUgIm1hdGNoaW5nIiBSZWZTcGVjICI6Ii4KKwkgKgorCSAqIEBwYXJhbSBsb2NhbERiCisJICogICAgICAgICAgICBsb2NhbCByZXBvc2l0b3J5IHRvIHB1c2ggZnJvbQorCSAqIEBwYXJhbSBmb3JjZVVwZGF0ZQorCSAqICAgICAgICAgICAgd2hldGhlciBub24tZmFzdC1mb3J3YXJkIHVwZGF0ZXMgc2hhbGwgYmUgYWxsb3dlZAorCSAqIEBwYXJhbSBmZXRjaFNwZWNzCisJICogICAgICAgICAgICBUaGUgZmV0Y2gge0BsaW5rIFJlZlNwZWN9cyB0byB1c2Ugd2hlbiB0aGlzIHBsYWNlaG9sZGVyIGlzCisJICogICAgICAgICAgICBleHBhbmRlZCB0byBkZXRlcm1pbmUgcmVtb3RlIHRyYWNraW5nIGJyYW5jaCB1cGRhdGVzCisJICovCisJUmVtb3RlUmVmVXBkYXRlKFJlcG9zaXRvcnkgbG9jYWxEYiwgYm9vbGVhbiBmb3JjZVVwZGF0ZSwKKwkJCUBOb25OdWxsIENvbGxlY3Rpb248UmVmU3BlYz4gZmV0Y2hTcGVjcykgeworCQl0aGlzLmxvY2FsRGIgPSBsb2NhbERiOworCQl0aGlzLmZvcmNlVXBkYXRlID0gZm9yY2VVcGRhdGU7CisJCXRoaXMuZmV0Y2hTcGVjcyA9IGZldGNoU3BlY3M7CisJCXRoaXMudHJhY2tpbmdSZWZVcGRhdGUgPSBudWxsOworCQl0aGlzLnNyY1JlZiA9IG51bGw7CisJCXRoaXMucmVtb3RlTmFtZSA9IG51bGw7CisJCXRoaXMubmV3T2JqZWN0SWQgPSBudWxsOworCQl0aGlzLnN0YXR1cyA9IFN0YXR1cy5OT1RfQVRURU1QVEVEOworCX0KKworCS8qKgorCSAqIFRlbGxzIHdoZXRoZXIgdGhpcyB7QGxpbmsgUmVtb3RlUmVmVXBkYXRlfSBpcyBhIHBsYWNlaG9sZGVyIGZvciBhCisJICogIm1hdGNoaW5nIiB7QGxpbmsgUmVmU3BlY30uCisJICoKKwkgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGlzIGlzIGEgcGxhY2Vob2xkZXIsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCisJICogQHNpbmNlIDYuMQorCSAqLworCXB1YmxpYyBib29sZWFuIGlzTWF0Y2hpbmcoKSB7CisJCXJldHVybiBmZXRjaFNwZWNzICE9IG51bGw7CisJfQorCisJLyoqCisJICogUmV0cmlldmVzIHRoZSBmZXRjaCB7QGxpbmsgUmVmU3BlY31zIG9mIHRoaXMge0BsaW5rIFJlbW90ZVJlZlVwZGF0ZX0uCisJICoKKwkgKiBAcmV0dXJuIHRoZSBmZXRjaCB7QGxpbmsgUmVmU3BlY31zLCBvciB7QGNvZGUgbnVsbH0gaWYKKwkgKiAgICAgICAgIHtAY29kZSB0aGlzLn17QGxpbmsgI2lzTWF0Y2hpbmcoKX0ge0Bjb2RlID09IGZhbHNlfQorCSAqLworCUNvbGxlY3Rpb248UmVmU3BlYz4gZ2V0RmV0Y2hTcGVjcygpIHsKKwkJcmV0dXJuIGZldGNoU3BlY3M7CiAJfQogCiAJLyoqCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9Tc2hDb25zdGFudHMuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1NzaENvbnN0YW50cy5qYXZhCmluZGV4IDIxMmE0ZTQuLjQ4Y2FjZjAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1NzaENvbnN0YW50cy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1NzaENvbnN0YW50cy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAxOCwgMjAyMCBUaG9tYXMgV29sZiA8dGhvbWFzLndvbGZAcGFyYW5vci5jaD4gYW5kIG90aGVycworICogQ29weXJpZ2h0IChDKSAyMDE4LCAyMDIxIFRob21hcyBXb2xmIDx0aG9tYXMud29sZkBwYXJhbm9yLmNoPiBhbmQgb3RoZXJzCiAgKgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CkBAIC00NCw2ICs0NCwxNCBAQCBwcml2YXRlIFNzaENvbnN0YW50cygpIHsKIAogCS8vIENvbmZpZyBmaWxlIGtleXMKIAorCS8qKgorCSAqIFByb3BlcnR5IHRvIGNvbnRyb2wgd2hldGhlciBwcml2YXRlIGtleXMgYXJlIGFkZGVkIHRvIGFuIFNTSCBhZ2VudCwgaWYKKwkgKiBvbmUgaXMgcnVubmluZywgYWZ0ZXIgaGF2aW5nIGJlZW4gbG9hZGVkLgorCSAqCisJICogQHNpbmNlIDYuMQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFERF9LRVlTX1RPX0FHRU5UID0gIkFkZEtleXNUb0FnZW50IjsKKwogCS8qKiBLZXkgaW4gYW4gc3NoIGNvbmZpZyBmaWxlLiAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJBVENIX01PREUgPSAiQmF0Y2hNb2RlIjsKIApAQCAtNjIsNiArNzAsMTUgQEAgcHJpdmF0ZSBTc2hDb25zdGFudHMoKSB7CiAJLyoqIEtleSBpbiBhbiBzc2ggY29uZmlnIGZpbGUuICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OTkVDVElPTl9BVFRFTVBUUyA9ICJDb25uZWN0aW9uQXR0ZW1wdHMiOwogCisJLyoqCisJICogQW4gT3BlblNTSCB0aW1lIHZhbHVlIGZvciB0aGUgY29ubmVjdGlvbiB0aW1lb3V0LiBJbiBPcGVuU1NILCB0aGlzCisJICogaW5jbHVkZXMgZXZlcnl0aGluZyB1bnRpbCB0aGUgZW5kIG9mIHRoZSBpbml0aWFsIGtleSBleGNoYW5nZTsgaW4gSkdpdCBpdAorCSAqIGNvdmVycyBvbmx5IHRoZSB1bmRlcmx5aW5nIFRDUCBjb25uZWN0LgorCSAqCisJICogQHNpbmNlIDYuMQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTk5FQ1RfVElNRU9VVCA9ICJDb25uZWN0VGltZW91dCI7CisKIAkvKiogS2V5IGluIGFuIHNzaCBjb25maWcgZmlsZS4gKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05UUk9MX1BBVEggPSAiQ29udHJvbFBhdGgiOwogCkBAIC0xNTksNiArMTc2LDE0IEBAIHByaXZhdGUgU3NoQ29uc3RhbnRzKCkgewogCS8qKiBLZXkgaW4gYW4gc3NoIGNvbmZpZyBmaWxlLiAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTU9URV9GT1JXQVJEID0gIlJlbW90ZUZvcndhcmQiOwogCisJLyoqCisJICogKEFic29sdXRlKSBwYXRoIHRvIGEgbWlkZGxld2FyZSBsaWJyYXJ5IHRoZSBTU0ggYWdlbnQgc2hhbGwgdXNlIHRvIGxvYWQKKwkgKiBTSyAoVTJGKSBrZXlzLgorCSAqCisJICogQHNpbmNlIDYuMQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFQ1VSSVRZX0tFWV9QUk9WSURFUiA9ICJTZWN1cml0eUtleVByb3ZpZGVyIjsKKwogCS8qKiBLZXkgaW4gYW4gc3NoIGNvbmZpZyBmaWxlLiAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFTkRfRU5WID0gIlNlbmRFbnYiOwogCkBAIC0yMjksNCArMjU0LDEyIEBAIHByaXZhdGUgU3NoQ29uc3RhbnRzKCkgewogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gREVGQVVMVF9JREVOVElUSUVTID0geyAvLwogCQkJSURfUlNBLCBJRF9EU0EsIElEX0VDRFNBLCBJRF9FRDI1NTE5CiAJfTsKKworCS8qKgorCSAqIE5hbWUgb2YgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIGhvbGRpbmcgdGhlIFVuaXggZG9tYWluIHNvY2tldCBmb3IKKwkgKiBjb21tdW5pY2F0aW9uIHdpdGggYW4gU1NIIGFnZW50LgorCSAqCisJICogQHNpbmNlIDYuMQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVl9TU0hfQVVUSF9TT0NLRVQgPSAiU1NIX0FVVEhfU09DSyI7CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9UcmFja2luZ1JlZlVwZGF0ZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVHJhY2tpbmdSZWZVcGRhdGUuamF2YQppbmRleCA2OTZjYTdjLi41MWJjMDdjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9UcmFja2luZ1JlZlVwZGF0ZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1RyYWNraW5nUmVmVXBkYXRlLmphdmEKQEAgLTEyLDYgKzEyLDggQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDsKIAoraW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuT0JKRUNUX0lEX0FCQlJFVl9TVFJJTkdfTEVOR1RIOworCiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQW55T2JqZWN0SWQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0SWQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVmVXBkYXRlOwpAQCAtMTg0LDkgKzE4NiwxMyBAQCBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQlpZiAoZm9yY2VVcGRhdGUpCiAJCQlzYi5hcHBlbmQoIiAoZm9yY2VkKSIpOwogCQlzYi5hcHBlbmQoIiAiKTsKLQkJc2IuYXBwZW5kKG9sZE9iamVjdElkID09IG51bGwgPyAiIiA6IG9sZE9iamVjdElkLmFiYnJldmlhdGUoNykubmFtZSgpKTsKKwkJc2IuYXBwZW5kKG9sZE9iamVjdElkID09IG51bGwgPyAiIgorCQkJCTogb2xkT2JqZWN0SWQuYWJicmV2aWF0ZShPQkpFQ1RfSURfQUJCUkVWX1NUUklOR19MRU5HVEgpCisJCQkJCQkubmFtZSgpKTsKIAkJc2IuYXBwZW5kKCIuLiIpOwotCQlzYi5hcHBlbmQobmV3T2JqZWN0SWQgPT0gbnVsbCA/ICIiIDogbmV3T2JqZWN0SWQuYWJicmV2aWF0ZSg3KS5uYW1lKCkpOworCQlzYi5hcHBlbmQobmV3T2JqZWN0SWQgPT0gbnVsbCA/ICIiCisJCQkJOiBuZXdPYmplY3RJZC5hYmJyZXZpYXRlKE9CSkVDVF9JRF9BQkJSRVZfU1RSSU5HX0xFTkdUSCkKKwkJCQkJCS5uYW1lKCkpOwogCQlzYi5hcHBlbmQoIl0iKTsKIAkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVHJhbnNwb3J0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9UcmFuc3BvcnQuamF2YQppbmRleCA1Yjc4MWFjLi4wZWFiNDQzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9UcmFuc3BvcnQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9UcmFuc3BvcnQuamF2YQpAQCAtMiw3ICsyLDcgQEAKICAqIENvcHlyaWdodCAoQykgMjAwOCwgMjAwOSBHb29nbGUgSW5jLgogICogQ29weXJpZ2h0IChDKSAyMDA4LCBNYXJlayBaYXdpcnNraSA8bWFyZWsuemF3aXJza2lAZ21haWwuY29tPgogICogQ29weXJpZ2h0IChDKSAyMDA4LCBSb2JpbiBSb3NlbmJlcmcgPHJvYmluLnJvc2VuYmVyZ0BkZXdpcmUuY29tPgotICogQ29weXJpZ2h0IChDKSAyMDA4LCAyMDIwIFNoYXduIE8uIFBlYXJjZSA8c3BlYXJjZUBzcGVhcmNlLm9yZz4gYW5kIG90aGVycworICogQ29weXJpZ2h0IChDKSAyMDA4LCAyMDIyIFNoYXduIE8uIFBlYXJjZSA8c3BlYXJjZUBzcGVhcmNlLm9yZz4gYW5kIG90aGVycwogICoKICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdApAQCAtNDAsNyArNDAsNiBAQAogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hbm5vdGF0aW9ucy5Ob25OdWxsOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYW5ub3RhdGlvbnMuTnVsbGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzLkFib3J0ZWRCeUhvb2tFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuTm90U3VwcG9ydGVkRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLlRyYW5zcG9ydEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0Lmhvb2tzLkhvb2tzOwpAQCAtNTkwLDYgKzU4OSwxMSBAQCBwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248UmVtb3RlUmVmVXBkYXRlPiBmaW5kUmVtb3RlUmVmVXBkYXRlc0ZvcigKIAkJZmluYWwgQ29sbGVjdGlvbjxSZWZTcGVjPiBwcm9jUmVmcyA9IGV4cGFuZFB1c2hXaWxkY2FyZHNGb3IoZGIsIHNwZWNzKTsKIAogCQlmb3IgKFJlZlNwZWMgc3BlYyA6IHByb2NSZWZzKSB7CisJCQlpZiAoc3BlYy5pc01hdGNoaW5nKCkpIHsKKwkJCQlyZXN1bHQuYWRkKG5ldyBSZW1vdGVSZWZVcGRhdGUoZGIsIHNwZWMuaXNGb3JjZVVwZGF0ZSgpLAorCQkJCQkJZmV0Y2hTcGVjcykpOworCQkJCWNvbnRpbnVlOworCQkJfQogCQkJU3RyaW5nIHNyY1NwZWMgPSBzcGVjLmdldFNvdXJjZSgpOwogCQkJZmluYWwgUmVmIHNyY1JlZiA9IGRiLmZpbmRSZWYoc3JjU3BlYyk7CiAJCQlpZiAoc3JjUmVmICE9IG51bGwpCkBAIC02NTYsMTQgKzY2MCwxOCBAQCBwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248UmVtb3RlUmVmVXBkYXRlPiBmaW5kUmVtb3RlUmVmVXBkYXRlc0ZvcigKIAlwcml2YXRlIHN0YXRpYyBDb2xsZWN0aW9uPFJlZlNwZWM+IGV4cGFuZFB1c2hXaWxkY2FyZHNGb3IoCiAJCQlmaW5hbCBSZXBvc2l0b3J5IGRiLCBmaW5hbCBDb2xsZWN0aW9uPFJlZlNwZWM+IHNwZWNzKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZmluYWwgTGlzdDxSZWY+IGxvY2FsUmVmcyA9IGRiLmdldFJlZkRhdGFiYXNlKCkuZ2V0UmVmcygpOwogCQlmaW5hbCBDb2xsZWN0aW9uPFJlZlNwZWM+IHByb2NSZWZzID0gbmV3IExpbmtlZEhhc2hTZXQ8PigpOwogCisJCUxpc3Q8UmVmPiBsb2NhbFJlZnMgPSBudWxsOwogCQlmb3IgKFJlZlNwZWMgc3BlYyA6IHNwZWNzKSB7Ci0JCQlpZiAoc3BlYy5pc1dpbGRjYXJkKCkpIHsKKwkJCWlmICghc3BlYy5pc01hdGNoaW5nKCkgJiYgc3BlYy5pc1dpbGRjYXJkKCkpIHsKKwkJCQlpZiAobG9jYWxSZWZzID09IG51bGwpIHsKKwkJCQkJbG9jYWxSZWZzID0gZGIuZ2V0UmVmRGF0YWJhc2UoKS5nZXRSZWZzKCk7CisJCQkJfQogCQkJCWZvciAoUmVmIGxvY2FsUmVmIDogbG9jYWxSZWZzKSB7Ci0JCQkJCWlmIChzcGVjLm1hdGNoU291cmNlKGxvY2FsUmVmKSkKKwkJCQkJaWYgKHNwZWMubWF0Y2hTb3VyY2UobG9jYWxSZWYpKSB7CiAJCQkJCQlwcm9jUmVmcy5hZGQoc3BlYy5leHBhbmRGcm9tU291cmNlKGxvY2FsUmVmKSk7CisJCQkJCX0KIAkJCQl9CiAJCQl9IGVsc2UgewogCQkJCXByb2NSZWZzLmFkZChzcGVjKTsKQEAgLTY3Miw3ICs2ODAsNyBAQCBwcml2YXRlIHN0YXRpYyBDb2xsZWN0aW9uPFJlZlNwZWM+IGV4cGFuZFB1c2hXaWxkY2FyZHNGb3IoCiAJCXJldHVybiBwcm9jUmVmczsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZmluZFRyYWNraW5nUmVmTmFtZShmaW5hbCBTdHJpbmcgcmVtb3RlTmFtZSwKKwlzdGF0aWMgU3RyaW5nIGZpbmRUcmFja2luZ1JlZk5hbWUoZmluYWwgU3RyaW5nIHJlbW90ZU5hbWUsCiAJCQlmaW5hbCBDb2xsZWN0aW9uPFJlZlNwZWM+IGZldGNoU3BlY3MpIHsKIAkJLy8gdHJ5IHRvIGZpbmQgbWF0Y2hpbmcgdHJhY2tpbmcgcmVmcwogCQlmb3IgKFJlZlNwZWMgZmV0Y2hTcGVjIDogZmV0Y2hTcGVjcykgewpAQCAtMTM3MSwxNiArMTM3OSw5IEBAIHB1YmxpYyBQdXNoUmVzdWx0IHB1c2goZmluYWwgUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsCiAJCQlpZiAodG9QdXNoLmlzRW1wdHkoKSkKIAkJCQl0aHJvdyBuZXcgVHJhbnNwb3J0RXhjZXB0aW9uKEpHaXRUZXh0LmdldCgpLm5vdGhpbmdUb1B1c2gpOwogCQl9Ci0JCWlmIChwcmVQdXNoICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJcHJlUHVzaC5zZXRSZWZzKHRvUHVzaCk7Ci0JCQkJcHJlUHVzaC5jYWxsKCk7Ci0JCQl9IGNhdGNoIChBYm9ydGVkQnlIb29rRXhjZXB0aW9uIHwgSU9FeGNlcHRpb24gZSkgewotCQkJCXRocm93IG5ldyBUcmFuc3BvcnRFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJfQotCQl9CiAKLQkJZmluYWwgUHVzaFByb2Nlc3MgcHVzaFByb2Nlc3MgPSBuZXcgUHVzaFByb2Nlc3ModGhpcywgdG9QdXNoLCBvdXQpOworCQlmaW5hbCBQdXNoUHJvY2VzcyBwdXNoUHJvY2VzcyA9IG5ldyBQdXNoUHJvY2Vzcyh0aGlzLCB0b1B1c2gsIHByZVB1c2gsCisJCQkJb3V0KTsKIAkJcmV0dXJuIHB1c2hQcm9jZXNzLmV4ZWN1dGUobW9uaXRvcik7CiAJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9VcGxvYWRQYWNrLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9VcGxvYWRQYWNrLmphdmEKaW5kZXggNmNiOGZlNC4uMTYxN2M1MCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVXBsb2FkUGFjay5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1VwbG9hZFBhY2suamF2YQpAQCAtMjM1OCw3ICsyMzU4LDcgQEAgZWxzZSBpZiAocmVmLmdldE5hbWUoKS5zdGFydHNXaXRoKENvbnN0YW50cy5SX0hFQURTKSkKIAkJCQkJCTogcmVxLmdldERlcHRoKCkgLSAxOwogCQkJCXB3LnNldFNoYWxsb3dQYWNrKHJlcS5nZXREZXB0aCgpLCB1bnNoYWxsb3dDb21taXRzKTsKIAotCQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpIC8vIE93bmVyc2hpcCBpcyB0cmFuc2ZlcnJlZCBiZWxvdworCQkJCS8vIE93bmVyc2hpcCBpcyB0cmFuc2ZlcnJlZCBiZWxvdwogCQkJCURlcHRoV2Fsay5SZXZXYWxrIGR3ID0gbmV3IERlcHRoV2Fsay5SZXZXYWxrKAogCQkJCQkJd2Fsay5nZXRPYmplY3RSZWFkZXIoKSwgd2Fsa0RlcHRoKTsKIAkJCQlkdy5zZXREZWVwZW5TaW5jZShyZXEuZ2V0RGVlcGVuU2luY2UoKSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9yZXNvbHZlci9GaWxlUmVzb2x2ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L3Jlc29sdmVyL0ZpbGVSZXNvbHZlci5qYXZhCmluZGV4IDNkMTVlZjUuLjA0NmYzOTUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L3Jlc29sdmVyL0ZpbGVSZXNvbHZlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L3Jlc29sdmVyL0ZpbGVSZXNvbHZlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOS0yMDEwLCBHb29nbGUgSW5jLiBhbmQgb3RoZXJzCisgKiBDb3B5cmlnaHQgKEMpIDIwMDktMjAyMiwgR29vZ2xlIEluYy4gYW5kIG90aGVycwogICoKICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdApAQCAtMTgsMTEgKzE4LDExIEBACiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29weU9uV3JpdGVBcnJheUxpc3Q7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5SZXBvc2l0b3J5Tm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlcG9zaXRvcnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVwb3NpdG9yeUNhY2hlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlcG9zaXRvcnlDYWNoZS5GaWxlS2V5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5GUzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuU3RyaW5nVXRpbHM7CiAKIC8qKgogICogRGVmYXVsdCByZXNvbHZlciBzZXJ2aW5nIGZyb20gdGhlIGxvY2FsIGZpbGVzeXN0ZW0uCkBAIC02Nyw3ICs2Nyw3IEBAIHB1YmxpYyBSZXBvc2l0b3J5IG9wZW4oQyByZXEsIFN0cmluZyBuYW1lKQogCQlpZiAoaXNVbnJlYXNvbmFibGVOYW1lKG5hbWUpKQogCQkJdGhyb3cgbmV3IFJlcG9zaXRvcnlOb3RGb3VuZEV4Y2VwdGlvbihuYW1lKTsKIAotCQlSZXBvc2l0b3J5IGRiID0gZXhwb3J0cy5nZXQobmFtZVdpdGhEb3RHaXQobmFtZSkpOworCQlSZXBvc2l0b3J5IGRiID0gZXhwb3J0cy5nZXQoU3RyaW5nVXRpbHMubmFtZVdpdGhEb3RHaXQobmFtZSkpOwogCQlpZiAoZGIgIT0gbnVsbCkgewogCQkJZGIuaW5jcmVtZW50T3BlbigpOwogCQkJcmV0dXJuIGRiOwpAQCAtMTU0LDcgKzE1NCw3IEBAIHB1YmxpYyB2b2lkIHNldEV4cG9ydEFsbChib29sZWFuIGV4cG9ydCkgewogCSAqICAgICAgICAgICAgdGhlIHJlcG9zaXRvcnkgaW5zdGFuY2UuCiAJICovCiAJcHVibGljIHZvaWQgZXhwb3J0UmVwb3NpdG9yeShTdHJpbmcgbmFtZSwgUmVwb3NpdG9yeSBkYikgewotCQlleHBvcnRzLnB1dChuYW1lV2l0aERvdEdpdChuYW1lKSwgZGIpOworCQlleHBvcnRzLnB1dChTdHJpbmdVdGlscy5uYW1lV2l0aERvdEdpdChuYW1lKSwgZGIpOwogCX0KIAogCS8qKgpAQCAtMTk3LDEyICsxOTcsNiBAQCBlbHNlIGlmIChkYi5nZXREaXJlY3RvcnkoKSAhPSBudWxsKQogCQkJcmV0dXJuIGZhbHNlOwogCX0KIAotCXByaXZhdGUgc3RhdGljIFN0cmluZyBuYW1lV2l0aERvdEdpdChTdHJpbmcgbmFtZSkgewotCQlpZiAobmFtZS5lbmRzV2l0aChDb25zdGFudHMuRE9UX0dJVF9FWFQpKQotCQkJcmV0dXJuIG5hbWU7Ci0JCXJldHVybiBuYW1lICsgQ29uc3RhbnRzLkRPVF9HSVRfRVhUOwotCX0KLQogCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNVbnJlYXNvbmFibGVOYW1lKFN0cmluZyBuYW1lKSB7CiAJCWlmIChuYW1lLmxlbmd0aCgpID09IDApCiAJCQlyZXR1cm4gdHJ1ZTsgLy8gbm8gZW1wdHkgcGF0aHMKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvVHJlZVdhbGsuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvVHJlZVdhbGsuamF2YQppbmRleCAxZjYxNGUzLi44MjY5NjY2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL1RyZWVXYWxrLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9UcmVlV2Fsay5qYXZhCkBAIC0xLDYgKzEsNiBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOC0yMDA5LCBHb29nbGUgSW5jLgotICogQ29weXJpZ2h0IChDKSAyMDA4LCBTaGF3biBPLiBQZWFyY2UgPHNwZWFyY2VAc3BlYXJjZS5vcmc+IGFuZCBvdGhlcnMKKyAqIENvcHlyaWdodCAoQykgMjAwOCwgMjAwOSBHb29nbGUgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDA4LCAyMDIyIFNoYXduIE8uIFBlYXJjZSA8c3BlYXJjZUBzcGVhcmNlLm9yZz4gYW5kIG90aGVycwogICoKICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdApAQCAtMTQsNiArMTQsNyBAQAogaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwpAQCAtNzMsNiArNzQsNyBAQAogICogdGhyZWFkcy4KICAqLwogcHVibGljIGNsYXNzIFRyZWVXYWxrIGltcGxlbWVudHMgQXV0b0Nsb3NlYWJsZSwgQXR0cmlidXRlc1Byb3ZpZGVyIHsKKwogCXByaXZhdGUgc3RhdGljIGZpbmFsIEFic3RyYWN0VHJlZUl0ZXJhdG9yW10gTk9fVFJFRVMgPSB7fTsKIAogCS8qKgpAQCAtOTIsNyArOTQsNyBAQCBwdWJsaWMgZW51bSBPcGVyYXRpb25UeXBlIHsKIAl9CiAKIAkvKioKLQkgKiAgICAgICAgICAgIFR5cGUgb2Ygb3BlcmF0aW9uIHlvdSB3YW50IHRvIHJldHJpZXZlIHRoZSBnaXQgYXR0cmlidXRlcyBmb3IuCisJICogVHlwZSBvZiBvcGVyYXRpb24geW91IHdhbnQgdG8gcmV0cmlldmUgdGhlIGdpdCBhdHRyaWJ1dGVzIGZvci4KIAkgKi8KIAlwcml2YXRlIE9wZXJhdGlvblR5cGUgb3BlcmF0aW9uVHlwZSA9IE9wZXJhdGlvblR5cGUuQ0hFQ0tPVVRfT1A7CiAKQEAgLTI4NCwxMSArMjg2LDIwIEBAIHB1YmxpYyBzdGF0aWMgVHJlZVdhbGsgZm9yUGF0aChmaW5hbCBSZXBvc2l0b3J5IGRiLCBmaW5hbCBTdHJpbmcgcGF0aCwKIAogCUFic3RyYWN0VHJlZUl0ZXJhdG9yIGN1cnJlbnRIZWFkOwogCi0JLyoqIENhY2hlZCBhdHRyaWJ1dGUgZm9yIHRoZSBjdXJyZW50IGVudHJ5ICovCi0JcHJpdmF0ZSBBdHRyaWJ1dGVzIGF0dHJzID0gbnVsbDsKKwkvKioKKwkgKiBDYWNoZWQgYXR0cmlidXRlcyBmb3IgdGhlIGN1cnJlbnQgZW50cnk7IHBlciB0cmVlLiBJbmRleCBpKzEgaXMgZm9yIHRyZWUKKwkgKiBpOyBpbmRleCAwIGlzIGZvciB0aGUgZGVwcmVjYXRlZCBsZWdhY3kgYmVoYXZpb3IuCisJICovCisJcHJpdmF0ZSBBdHRyaWJ1dGVzW10gYXR0cnM7CiAKLQkvKiogQ2FjaGVkIGF0dHJpYnV0ZXMgaGFuZGxlciAqLwotCXByaXZhdGUgQXR0cmlidXRlc0hhbmRsZXIgYXR0cmlidXRlc0hhbmRsZXI7CisJLyoqCisJICogQ2FjaGVkIGF0dHJpYnV0ZXMgaGFuZGxlcjsgcGVyIHRyZWUuIEluZGV4IGkrMSBpcyBmb3IgdHJlZSBpOyBpbmRleCAwIGlzCisJICogZm9yIHRoZSBkZXByZWNhdGVkIGxlZ2FjeSBiZWhhdmlvci4KKwkgKi8KKwlwcml2YXRlIEF0dHJpYnV0ZXNIYW5kbGVyW10gYXR0cmlidXRlc0hhbmRsZXJzOworCisJLyoqIENhbiBiZSBzZXQgdG8gaWRlbnRpZnkgdGhlIHRyZWUgdG8gdXNlIGZvciB7QGxpbmsgI2dldEF0dHJpYnV0ZXMoKX0uICovCisJcHJpdmF0ZSBpbnQgaGVhZEluZGV4ID0gLTE7CiAKIAlwcml2YXRlIENvbmZpZyBjb25maWc7CiAKQEAgLTUxNSw2ICs1MjYsMjQgQEAgcHVibGljIEF0dHJpYnV0ZXNOb2RlUHJvdmlkZXIgZ2V0QXR0cmlidXRlc05vZGVQcm92aWRlcigpIHsKIAl9CiAKIAkvKioKKwkgKiBJZGVudGlmaWVzIHRoZSB0cmVlIGF0IHRoZSBnaXZlbiBpbmRleCBhcyB0aGUgaGVhZCB0cmVlLiBUaGlzIGlzIHRoZSB0cmVlCisJICogdXNlIGJ5IGRlZmF1bHQgdG8gZGV0ZXJtaW5lIGF0dHJpYnV0ZXMgYW5kIEVPTCBtb2Rlcy4KKwkgKgorCSAqIEBwYXJhbSBpbmRleAorCSAqICAgICAgICAgICAgb2YgdGhlIHRyZWUgdG8gdXNlIGFzIGhlYWQKKwkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorCSAqICAgICAgICAgICAgIGlmIHRoZSBpbmRleCBpcyBvdXQgb2YgcmFuZ2UKKwkgKiBAc2luY2UgNi4xCisJICovCisJcHVibGljIHZvaWQgc2V0SGVhZChpbnQgaW5kZXgpIHsKKwkJaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSB0cmVlcy5sZW5ndGgpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkhlYWQgaW5kZXggIiArIGluZGV4IC8vJE5PTi1OTFMtMSQKKwkJCQkJKyAiIG91dCBvZiByYW5nZSBbMCwiICsgdHJlZXMubGVuZ3RoICsgJyknKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJCWhlYWRJbmRleCA9IGluZGV4OworCX0KKworCS8qKgogCSAqIHtAaW5oZXJpdERvY30KIAkgKiA8cD4KIAkgKiBSZXRyaWV2ZSB0aGUgZ2l0IGF0dHJpYnV0ZXMgZm9yIHRoZSBjdXJyZW50IGVudHJ5LgpAQCAtNTU2LDI1ICs1ODUsNTEgQEAgcHVibGljIEF0dHJpYnV0ZXNOb2RlUHJvdmlkZXIgZ2V0QXR0cmlidXRlc05vZGVQcm92aWRlcigpIHsKIAkgKi8KIAlAT3ZlcnJpZGUKIAlwdWJsaWMgQXR0cmlidXRlcyBnZXRBdHRyaWJ1dGVzKCkgewotCQlpZiAoYXR0cnMgIT0gbnVsbCkKLQkJCXJldHVybiBhdHRyczsKKwkJcmV0dXJuIGdldEF0dHJpYnV0ZXMoaGVhZEluZGV4KTsKKwl9CiAKKwkvKioKKwkgKiBSZXRyaWV2ZXMgdGhlIGdpdCBhdHRyaWJ1dGVzIGJhc2VkIG9uIHRoZSBnaXZlbiB0cmVlLgorCSAqCisJICogQHBhcmFtIGluZGV4CisJICogICAgICAgICAgICBvZiB0aGUgdHJlZSB0byB1c2UgYXMgYmFzZSBmb3IgdGhlIGF0dHJpYnV0ZXMKKwkgKiBAcmV0dXJuIHRoZSBhdHRyaWJ1dGVzCisJICogQHNpbmNlIDYuMQorCSAqLworCXB1YmxpYyBBdHRyaWJ1dGVzIGdldEF0dHJpYnV0ZXMoaW50IGluZGV4KSB7CisJCWludCBhdHRySW5kZXggPSBpbmRleCArIDE7CisJCUF0dHJpYnV0ZXMgcmVzdWx0ID0gYXR0cnNbYXR0ckluZGV4XTsKKwkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQlyZXR1cm4gcmVzdWx0OworCQl9CiAJCWlmIChhdHRyaWJ1dGVzTm9kZVByb3ZpZGVyID09IG51bGwpIHsKLQkJCS8vIFRoZSB3b3JrIHRyZWUgc2hvdWxkIGhhdmUgYSBBdHRyaWJ1dGVzTm9kZVByb3ZpZGVyIHRvIGJlIGFibGUgdG8KLQkJCS8vIHJldHJpZXZlIHRoZSBpbmZvIGFuZCBnbG9iYWwgYXR0cmlidXRlcyBub2RlCiAJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAogCQkJCQkiVGhlIHRyZWUgd2FsayBzaG91bGQgaGF2ZSBvbmUgQXR0cmlidXRlc05vZGVQcm92aWRlciBzZXQgaW4gb3JkZXIgdG8gY29tcHV0ZSB0aGUgZ2l0IGF0dHJpYnV0ZXMuIik7IC8vJE5PTi1OTFMtMSQKIAkJfQogCiAJCXRyeSB7Ci0JCQkvLyBMYXp5IGNyZWF0ZSB0aGUgYXR0cmlidXRlc0hhbmRsZXIgb24gdGhlIGZpcnN0IGFjY2VzcyBvZgotCQkJLy8gYXR0cmlidXRlcy4gVGhpcyByZXF1aXJlcyB0aGUgaW5mbywgZ2xvYmFsIGFuZCByb290Ci0JCQkvLyBhdHRyaWJ1dGVzIG5vZGVzCi0JCQlpZiAoYXR0cmlidXRlc0hhbmRsZXIgPT0gbnVsbCkgewotCQkJCWF0dHJpYnV0ZXNIYW5kbGVyID0gbmV3IEF0dHJpYnV0ZXNIYW5kbGVyKHRoaXMpOworCQkJQXR0cmlidXRlc0hhbmRsZXIgaGFuZGxlciA9IGF0dHJpYnV0ZXNIYW5kbGVyc1thdHRySW5kZXhdOworCQkJaWYgKGhhbmRsZXIgPT0gbnVsbCkgeworCQkJCWlmIChpbmRleCA8IDApIHsKKwkJCQkJLy8gTGVnYWN5IGJlaGF2aW9yIChoZWFkSW5kZXggbm90IHNldCwgZ2V0QXR0cmlidXRlcygpIGFib3ZlCisJCQkJCS8vIGNhbGxlZCkKKwkJCQkJaGFuZGxlciA9IG5ldyBBdHRyaWJ1dGVzSGFuZGxlcih0aGlzLCAoKSAtPiB7CisJCQkJCQlyZXR1cm4gZ2V0VHJlZShDYW5vbmljYWxUcmVlUGFyc2VyLmNsYXNzKTsKKwkJCQkJfSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJaGFuZGxlciA9IG5ldyBBdHRyaWJ1dGVzSGFuZGxlcih0aGlzLCAoKSAtPiB7CisJCQkJCQlBYnN0cmFjdFRyZWVJdGVyYXRvciB0cmVlID0gdHJlZXNbaW5kZXhdOworCQkJCQkJaWYgKHRyZWUgaW5zdGFuY2VvZiBDYW5vbmljYWxUcmVlUGFyc2VyKSB7CisJCQkJCQkJcmV0dXJuIChDYW5vbmljYWxUcmVlUGFyc2VyKSB0cmVlOworCQkJCQkJfQorCQkJCQkJcmV0dXJuIG51bGw7CisJCQkJCX0pOworCQkJCX0KKwkJCQlhdHRyaWJ1dGVzSGFuZGxlcnNbYXR0ckluZGV4XSA9IGhhbmRsZXI7CiAJCQl9Ci0JCQlhdHRycyA9IGF0dHJpYnV0ZXNIYW5kbGVyLmdldEF0dHJpYnV0ZXMoKTsKLQkJCXJldHVybiBhdHRyczsKKwkJCXJlc3VsdCA9IGhhbmRsZXIuZ2V0QXR0cmlidXRlcygpOworCQkJYXR0cnNbYXR0ckluZGV4XSA9IHJlc3VsdDsKKwkJCXJldHVybiByZXN1bHQ7CiAJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKIAkJCXRocm93IG5ldyBKR2l0SW50ZXJuYWxFeGNlcHRpb24oIkVycm9yIHdoaWxlIHBhcnNpbmcgYXR0cmlidXRlcyIsIC8vJE5PTi1OTFMtMSQKIAkJCQkJZSk7CkBAIC01OTUsMTEgKzY1MCwzNCBAQCBwdWJsaWMgQXR0cmlidXRlcyBnZXRBdHRyaWJ1dGVzKCkgewogCSAqLwogCUBOdWxsYWJsZQogCXB1YmxpYyBFb2xTdHJlYW1UeXBlIGdldEVvbFN0cmVhbVR5cGUoT3BlcmF0aW9uVHlwZSBvcFR5cGUpIHsKLQkJaWYgKGF0dHJpYnV0ZXNOb2RlUHJvdmlkZXIgPT0gbnVsbCB8fCBjb25maWcgPT0gbnVsbCkKKwkJaWYgKGF0dHJpYnV0ZXNOb2RlUHJvdmlkZXIgPT0gbnVsbCB8fCBjb25maWcgPT0gbnVsbCkgewogCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBFb2xTdHJlYW1UeXBlVXRpbC5kZXRlY3RTdHJlYW1UeXBlKAotCQkJCW9wVHlwZSAhPSBudWxsID8gb3BUeXBlIDogb3BlcmF0aW9uVHlwZSwKLQkJCQkJY29uZmlnLmdldChXb3JraW5nVHJlZU9wdGlvbnMuS0VZKSwgZ2V0QXR0cmlidXRlcygpKTsKKwkJfQorCQlPcGVyYXRpb25UeXBlIG9wID0gb3BUeXBlICE9IG51bGwgPyBvcFR5cGUgOiBvcGVyYXRpb25UeXBlOworCQlyZXR1cm4gRW9sU3RyZWFtVHlwZVV0aWwuZGV0ZWN0U3RyZWFtVHlwZShvcCwKKwkJCQljb25maWcuZ2V0KFdvcmtpbmdUcmVlT3B0aW9ucy5LRVkpLCBnZXRBdHRyaWJ1dGVzKCkpOworCX0KKworCS8qKgorCSAqIEdldCB0aGUgRU9MIHN0cmVhbSB0eXBlIG9mIHRoZSBjdXJyZW50IGVudHJ5IGZvciBjaGVja2luZyBvdXQgdXNpbmcgdGhlCisJICogY29uZmlnIGFuZCB7QGxpbmsgI2dldEF0dHJpYnV0ZXMoKX0uCisJICoKKwkgKiBAcGFyYW0gdHJlZQorCSAqICAgICAgICAgICAgaW5kZXggb2YgdGhlIHRyZWUgdGhlIGNoZWNrLW91dCBpcyB0byBiZSBmcm9tCisJICogQHJldHVybiB0aGUgRU9MIHN0cmVhbSB0eXBlIG9mIHRoZSBjdXJyZW50IGVudHJ5IHVzaW5nIHRoZSBjb25maWcgYW5kCisJICogICAgICAgICB7QGxpbmsgI2dldEF0dHJpYnV0ZXMoKX0uIE5vdGUgdGhhdCB0aGlzIG1ldGhvZCBtYXkgcmV0dXJuIG51bGwKKwkgKiAgICAgICAgIGlmIHRoZSB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5UcmVlV2Fsa30gaXMgbm90IGJhc2VkIG9uCisJICogICAgICAgICBhIHdvcmtpbmcgdHJlZQorCSAqIEBzaW5jZSA2LjEKKwkgKi8KKwlATnVsbGFibGUKKwlwdWJsaWMgRW9sU3RyZWFtVHlwZSBnZXRDaGVja291dEVvbFN0cmVhbVR5cGUoaW50IHRyZWUpIHsKKwkJaWYgKGF0dHJpYnV0ZXNOb2RlUHJvdmlkZXIgPT0gbnVsbCB8fCBjb25maWcgPT0gbnVsbCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJQXR0cmlidXRlcyBhdHRyID0gZ2V0QXR0cmlidXRlcyh0cmVlKTsKKwkJcmV0dXJuIEVvbFN0cmVhbVR5cGVVdGlsLmRldGVjdFN0cmVhbVR5cGUoT3BlcmF0aW9uVHlwZS5DSEVDS09VVF9PUCwKKwkJCQljb25maWcuZ2V0KFdvcmtpbmdUcmVlT3B0aW9ucy5LRVkpLCBhdHRyKTsKIAl9CiAKIAkvKioKQEAgLTYwNyw3ICs2ODUsOCBAQCBwdWJsaWMgRW9sU3RyZWFtVHlwZSBnZXRFb2xTdHJlYW1UeXBlKE9wZXJhdGlvblR5cGUgb3BUeXBlKSB7CiAJICovCiAJcHVibGljIHZvaWQgcmVzZXQoKSB7CiAJCWF0dHJzID0gbnVsbDsKLQkJYXR0cmlidXRlc0hhbmRsZXIgPSBudWxsOworCQlhdHRyaWJ1dGVzSGFuZGxlcnMgPSBudWxsOworCQloZWFkSW5kZXggPSAtMTsKIAkJdHJlZXMgPSBOT19UUkVFUzsKIAkJYWR2YW5jZSA9IGZhbHNlOwogCQlkZXB0aCA9IDA7CkBAIC02NTEsNyArNzMwLDkgQEAgcHVibGljIHZvaWQgcmVzZXQoQW55T2JqZWN0SWQgaWQpIHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLAogCiAJCWFkdmFuY2UgPSBmYWxzZTsKIAkJZGVwdGggPSAwOwotCQlhdHRycyA9IG51bGw7CisJCWF0dHJzID0gbmV3IEF0dHJpYnV0ZXNbMl07CisJCWF0dHJpYnV0ZXNIYW5kbGVycyA9IG5ldyBBdHRyaWJ1dGVzSGFuZGxlclsyXTsKKwkJaGVhZEluZGV4ID0gLTE7CiAJfQogCiAJLyoqCkBAIC03MDEsNyArNzgyLDE0IEBAIHB1YmxpYyB2b2lkIHJlc2V0KEFueU9iamVjdElkLi4uIGlkcykgdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sCiAJCXRyZWVzID0gcjsKIAkJYWR2YW5jZSA9IGZhbHNlOwogCQlkZXB0aCA9IDA7Ci0JCWF0dHJzID0gbnVsbDsKKwkJaWYgKG9sZExlbiA9PSBuZXdMZW4pIHsKKwkJCUFycmF5cy5maWxsKGF0dHJzLCBudWxsKTsKKwkJCUFycmF5cy5maWxsKGF0dHJpYnV0ZXNIYW5kbGVycywgbnVsbCk7CisJCX0gZWxzZSB7CisJCQlhdHRycyA9IG5ldyBBdHRyaWJ1dGVzW25ld0xlbiArIDFdOworCQkJYXR0cmlidXRlc0hhbmRsZXJzID0gbmV3IEF0dHJpYnV0ZXNIYW5kbGVyW25ld0xlbiArIDFdOworCQl9CisJCWhlYWRJbmRleCA9IC0xOwogCX0KIAogCS8qKgpAQCAtNzU4LDYgKzg0NiwxNiBAQCBwdWJsaWMgaW50IGFkZFRyZWUoQWJzdHJhY3RUcmVlSXRlcmF0b3IgcCkgewogCQlwLm1hdGNoU2hpZnQgPSAwOwogCiAJCXRyZWVzID0gbmV3VHJlZXM7CisJCWlmIChhdHRycyA9PSBudWxsKSB7CisJCQlhdHRycyA9IG5ldyBBdHRyaWJ1dGVzW24gKyAyXTsKKwkJfSBlbHNlIHsKKwkJCWF0dHJzID0gQXJyYXlzLmNvcHlPZihhdHRycywgbiArIDIpOworCQl9CisJCWlmIChhdHRyaWJ1dGVzSGFuZGxlcnMgPT0gbnVsbCkgeworCQkJYXR0cmlidXRlc0hhbmRsZXJzID0gbmV3IEF0dHJpYnV0ZXNIYW5kbGVyW24gKyAyXTsKKwkJfSBlbHNlIHsKKwkJCWF0dHJpYnV0ZXNIYW5kbGVycyA9IEFycmF5cy5jb3B5T2YoYXR0cmlidXRlc0hhbmRsZXJzLCBuICsgMik7CisJCX0KIAkJcmV0dXJuIG47CiAJfQogCkBAIC04MDAsNyArODk4LDcgQEAgcHVibGljIGJvb2xlYW4gbmV4dCgpIHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLAogCQkJfQogCiAJCQlmb3IgKDs7KSB7Ci0JCQkJYXR0cnMgPSBudWxsOworCQkJCUFycmF5cy5maWxsKGF0dHJzLCBudWxsKTsKIAkJCQlmaW5hbCBBYnN0cmFjdFRyZWVJdGVyYXRvciB0ID0gbWluKCk7CiAJCQkJaWYgKHQuZW9mKCkpIHsKIAkJCQkJaWYgKGRlcHRoID4gMCkgewpAQCAtMTI1NSw3ICsxMzUzLDcgQEAgcHVibGljIGJvb2xlYW4gaXNQb3N0Q2hpbGRyZW4oKSB7CiAJICovCiAJcHVibGljIHZvaWQgZW50ZXJTdWJ0cmVlKCkgdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sCiAJCQlJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLCBDb3JydXB0T2JqZWN0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCWF0dHJzID0gbnVsbDsKKwkJQXJyYXlzLmZpbGwoYXR0cnMsIG51bGwpOwogCQlmaW5hbCBBYnN0cmFjdFRyZWVJdGVyYXRvciBjaCA9IGN1cnJlbnRIZWFkOwogCQlmaW5hbCBBYnN0cmFjdFRyZWVJdGVyYXRvcltdIHRtcCA9IG5ldyBBYnN0cmFjdFRyZWVJdGVyYXRvclt0cmVlcy5sZW5ndGhdOwogCQlmb3IgKGludCBpID0gMDsgaSA8IHRyZWVzLmxlbmd0aDsgaSsrKSB7CkBAIC0xMzc0LDExICsxNDcyLDEyIEBAIHB1YmxpYyA8VCBleHRlbmRzIEFic3RyYWN0VHJlZUl0ZXJhdG9yPiBUIGdldFRyZWUoQ2xhc3M8VD4gdHlwZSkgewogCiAJLyoqCiAJICogSW5zcGVjdCBjb25maWcgYW5kIGF0dHJpYnV0ZXMgdG8gcmV0dXJuIGEgZmlsdGVyY29tbWFuZCBhcHBsaWNhYmxlIGZvcgotCSAqIHRoZSBjdXJyZW50IHBhdGgsIGJ1dCB3aXRob3V0IGV4cGFuZGluZyAlZiBvY2N1cmVuY2VzCisJICogdGhlIGN1cnJlbnQgcGF0aC4KIAkgKgogCSAqIEBwYXJhbSBmaWx0ZXJDb21tYW5kVHlwZQogCSAqICAgICAgICAgICAgd2hpY2ggdHlwZSBvZiBmaWx0ZXJDb21tYW5kIHNob3VsZCBiZSBleGVjdXRlZC4gRS5nLiAiY2xlYW4iLAotCSAqICAgICAgICAgICAgInNtdWRnZSIKKwkgKiAgICAgICAgICAgICJzbXVkZ2UiLiBGb3IgInNtdWRnZSIgY29uc2lkZXIgdXNpbmcKKwkgKiAgICAgICAgICAgIHt7QGxpbmsgI2dldFNtdWRnZUNvbW1hbmQoaW50KX0gaW5zdGVhZC4KIAkgKiBAcmV0dXJuIGEgZmlsdGVyIGNvbW1hbmQKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKiBAc2luY2UgNC4yCkBAIC0xNDA3LDYgKzE1MDYsNTQgQEAgcHVibGljIFN0cmluZyBnZXRGaWx0ZXJDb21tYW5kKFN0cmluZyBmaWx0ZXJDb21tYW5kVHlwZSkKIAl9CiAKIAkvKioKKwkgKiBJbnNwZWN0IGNvbmZpZyBhbmQgYXR0cmlidXRlcyB0byByZXR1cm4gYSBmaWx0ZXJjb21tYW5kIGFwcGxpY2FibGUgZm9yCisJICogdGhlIGN1cnJlbnQgcGF0aC4KKwkgKgorCSAqIEBwYXJhbSBpbmRleAorCSAqICAgICAgICAgICAgb2YgdGhlIHRyZWUgdGhlIGl0ZW0gdG8gYmUgc211ZGdlZCBpcyBpbgorCSAqIEByZXR1cm4gYSBmaWx0ZXIgY29tbWFuZAorCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgorCSAqIEBzaW5jZSA2LjEKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFNtdWRnZUNvbW1hbmQoaW50IGluZGV4KQorCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJcmV0dXJuIGdldFNtdWRnZUNvbW1hbmQoZ2V0QXR0cmlidXRlcyhpbmRleCkpOworCX0KKworCS8qKgorCSAqIEluc3BlY3QgY29uZmlnIGFuZCBhdHRyaWJ1dGVzIHRvIHJldHVybiBhIGZpbHRlcmNvbW1hbmQgYXBwbGljYWJsZSBmb3IKKwkgKiB0aGUgY3VycmVudCBwYXRoLgorCSAqCisJICogQHBhcmFtIGF0dHJpYnV0ZXMKKwkgKiAgICAgICAgICAgIHRvIHVzZQorCSAqIEByZXR1cm4gYSBmaWx0ZXIgY29tbWFuZAorCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgorCSAqIEBzaW5jZSA2LjEKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFNtdWRnZUNvbW1hbmQoQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlpZiAoYXR0cmlidXRlcyA9PSBudWxsKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlBdHRyaWJ1dGUgZiA9IGF0dHJpYnV0ZXMuZ2V0KENvbnN0YW50cy5BVFRSX0ZJTFRFUik7CisJCWlmIChmID09IG51bGwpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCVN0cmluZyBmaWx0ZXJWYWx1ZSA9IGYuZ2V0VmFsdWUoKTsKKwkJaWYgKGZpbHRlclZhbHVlID09IG51bGwpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJU3RyaW5nIGZpbHRlckNvbW1hbmQgPSBnZXRGaWx0ZXJDb21tYW5kRGVmaW5pdGlvbihmaWx0ZXJWYWx1ZSwKKwkJCQlDb25zdGFudHMuQVRUUl9GSUxURVJfVFlQRV9TTVVER0UpOworCQlpZiAoZmlsdGVyQ29tbWFuZCA9PSBudWxsKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlyZXR1cm4gZmlsdGVyQ29tbWFuZC5yZXBsYWNlQWxsKCIlZiIsIC8vJE5PTi1OTFMtMSQKKwkJCQlNYXRjaGVyLnF1b3RlUmVwbGFjZW1lbnQoCisJCQkJCQlRdW90ZWRTdHJpbmcuQk9VUk5FLnF1b3RlKChnZXRQYXRoU3RyaW5nKCkpKSkpOworCX0KKworCS8qKgogCSAqIEdldCB0aGUgZmlsdGVyIGNvbW1hbmQgaG93IGl0IGlzIGRlZmluZWQgaW4gZ2l0Y29uZmlnLiBUaGUgcmV0dXJuZWQKIAkgKiBzdHJpbmcgbWF5IGNvbnRhaW4gIiVmIiB3aGljaCBuZWVkcyB0byBiZSByZXBsYWNlZCBieSB0aGUgY3VycmVudCBwYXRoCiAJICogYmVmb3JlIGV4ZWN1dGluZyB0aGUgZmlsdGVyIGNvbW1hbmQuIFRoZXNlIGZpbHRlciBkZWZpbml0aW9ucyBhcmUgY2FjaGVkCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL1dvcmtpbmdUcmVlSXRlcmF0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvV29ya2luZ1RyZWVJdGVyYXRvci5qYXZhCmluZGV4IDUwY2UxNWUuLjQyN2VhYzUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvV29ya2luZ1RyZWVJdGVyYXRvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvV29ya2luZ1RyZWVJdGVyYXRvci5qYXZhCkBAIC0yLDcgKzIsNyBAQAogICogQ29weXJpZ2h0IChDKSAyMDA4LCBTaGF3biBPLiBQZWFyY2UgPHNwZWFyY2VAc3BlYXJjZS5vcmc+CiAgKiBDb3B5cmlnaHQgKEMpIDIwMTAsIENocmlzdGlhbiBIYWxzdHJpY2sgPGNocmlzdGlhbi5oYWxzdHJpY2tAc2FwLmNvbT4KICAqIENvcHlyaWdodCAoQykgMjAxMCwgTWF0dGhpYXMgU29obiA8bWF0dGhpYXMuc29obkBzYXAuY29tPgotICogQ29weXJpZ2h0IChDKSAyMDEyLTIwMjEsIFJvYmluIFJvc2VuYmVyZyBhbmQgb3RoZXJzCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIsIDIwMjIsIFJvYmluIFJvc2VuYmVyZyBhbmQgb3RoZXJzCiAgKgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CkBAIC0zODcsOCArMzg3LDggQEAgcHVibGljIGJvb2xlYW4gaXNXb3JrVHJlZSgpIHsKIAkJCQlzdGF0ZS5pbml0aWFsaXplUmVhZEJ1ZmZlcigpOwogCiAJCQkJZmluYWwgbG9uZyBsZW4gPSBlLmdldExlbmd0aCgpOwotCQkJCUlucHV0U3RyZWFtIGZpbHRlcmVkSXMgPSBwb3NzaWJseUZpbHRlcmVkSW5wdXRTdHJlYW0oZSwgaXMsIGxlbiwKLQkJCQkJCU9wZXJhdGlvblR5cGUuQ0hFQ0tJTl9PUCk7CisJCQkJSW5wdXRTdHJlYW0gZmlsdGVyZWRJcyA9IHBvc3NpYmx5RmlsdGVyZWRJbnB1dFN0cmVhbShlLCBpcywKKwkJCQkJCWxlbik7CiAJCQkJcmV0dXJuIGNvbXB1dGVIYXNoKGZpbHRlcmVkSXMsIGNhbm9uTGVuKTsKIAkJCX0gZmluYWxseSB7CiAJCQkJc2FmZUNsb3NlKGlzKTsKQEAgLTQwMCwyMyArNDAwLDE4IEBAIHB1YmxpYyBib29sZWFuIGlzV29ya1RyZWUoKSB7CiAJfQogCiAJcHJpdmF0ZSBJbnB1dFN0cmVhbSBwb3NzaWJseUZpbHRlcmVkSW5wdXRTdHJlYW0oZmluYWwgRW50cnkgZSwKLQkJCWZpbmFsIElucHV0U3RyZWFtIGlzLCBmaW5hbCBsb25nIGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHBvc3NpYmx5RmlsdGVyZWRJbnB1dFN0cmVhbShlLCBpcywgbGVuLCBudWxsKTsKLQotCX0KLQotCXByaXZhdGUgSW5wdXRTdHJlYW0gcG9zc2libHlGaWx0ZXJlZElucHV0U3RyZWFtKGZpbmFsIEVudHJ5IGUsCi0JCQlmaW5hbCBJbnB1dFN0cmVhbSBpcywgZmluYWwgbG9uZyBsZW4sIE9wZXJhdGlvblR5cGUgb3BUeXBlKQorCQkJZmluYWwgSW5wdXRTdHJlYW0gaXMsIGZpbmFsIGxvbmcgbGVuKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJaWYgKGdldENsZWFuRmlsdGVyQ29tbWFuZCgpID09IG51bGwKLQkJCQkmJiBnZXRFb2xTdHJlYW1UeXBlKG9wVHlwZSkgPT0gRW9sU3RyZWFtVHlwZS5ESVJFQ1QpIHsKKwkJCQkmJiBnZXRFb2xTdHJlYW1UeXBlKAorCQkJCQkJT3BlcmF0aW9uVHlwZS5DSEVDS0lOX09QKSA9PSBFb2xTdHJlYW1UeXBlLkRJUkVDVCkgewogCQkJY2Fub25MZW4gPSBsZW47CiAJCQlyZXR1cm4gaXM7CiAJCX0KIAogCQlpZiAobGVuIDw9IE1BWElNVU1fRklMRV9TSVpFX1RPX1JFQURfRlVMTFkpIHsKIAkJCUJ5dGVCdWZmZXIgcmF3YnVmID0gSU8ucmVhZFdob2xlU3RyZWFtKGlzLCAoaW50KSBsZW4pOwotCQkJcmF3YnVmID0gZmlsdGVyQ2xlYW4ocmF3YnVmLmFycmF5KCksIHJhd2J1Zi5saW1pdCgpLCBvcFR5cGUpOworCQkJcmF3YnVmID0gZmlsdGVyQ2xlYW4ocmF3YnVmLmFycmF5KCksIHJhd2J1Zi5saW1pdCgpKTsKIAkJCWNhbm9uTGVuID0gcmF3YnVmLmxpbWl0KCk7CiAJCQlyZXR1cm4gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHJhd2J1Zi5hcnJheSgpLCAwLCAoaW50KSBjYW5vbkxlbik7CiAJCX0KQEAgLTQyNiwxNCArNDIxLDEzIEBAICYmIGdldEVvbFN0cmVhbVR5cGUob3BUeXBlKSA9PSBFb2xTdHJlYW1UeXBlLkRJUkVDVCkgewogCQkJCXJldHVybiBpczsKIAkJCX0KIAotCQlmaW5hbCBJbnB1dFN0cmVhbSBsZW5JcyA9IGZpbHRlckNsZWFuKGUub3BlbklucHV0U3RyZWFtKCksCi0JCQkJb3BUeXBlKTsKKwkJCWZpbmFsIElucHV0U3RyZWFtIGxlbklzID0gZmlsdGVyQ2xlYW4oZS5vcGVuSW5wdXRTdHJlYW0oKSk7CiAJCXRyeSB7CiAJCQljYW5vbkxlbiA9IGNvbXB1dGVMZW5ndGgobGVuSXMpOwogCQl9IGZpbmFsbHkgewogCQkJc2FmZUNsb3NlKGxlbklzKTsKIAkJfQotCQlyZXR1cm4gZmlsdGVyQ2xlYW4oaXMsIG9wVHlwZSk7CisJCXJldHVybiBmaWx0ZXJDbGVhbihpcyk7CiAJfQogCiAJcHJpdmF0ZSBzdGF0aWMgdm9pZCBzYWZlQ2xvc2UoSW5wdXRTdHJlYW0gaW4pIHsKQEAgLTQ1NSwyMyArNDQ5LDIwIEBAIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNCaW5hcnkoRW50cnkgZW50cnkpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCX0KIAl9CiAKLQlwcml2YXRlIEJ5dGVCdWZmZXIgZmlsdGVyQ2xlYW4oYnl0ZVtdIHNyYywgaW50IG4sIE9wZXJhdGlvblR5cGUgb3BUeXBlKQorCXByaXZhdGUgQnl0ZUJ1ZmZlciBmaWx0ZXJDbGVhbihieXRlW10gc3JjLCBpbnQgbikKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCUlucHV0U3RyZWFtIGluID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHNyYyk7CiAJCXRyeSB7Ci0JCQlyZXR1cm4gSU8ucmVhZFdob2xlU3RyZWFtKGZpbHRlckNsZWFuKGluLCBvcFR5cGUpLCBuKTsKKwkJCXJldHVybiBJTy5yZWFkV2hvbGVTdHJlYW0oZmlsdGVyQ2xlYW4oaW4pLCBuKTsKIAkJfSBmaW5hbGx5IHsKIAkJCXNhZmVDbG9zZShpbik7CiAJCX0KIAl9CiAKLQlwcml2YXRlIElucHV0U3RyZWFtIGZpbHRlckNsZWFuKElucHV0U3RyZWFtIGluKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gZmlsdGVyQ2xlYW4oaW4sIG51bGwpOwotCX0KLQotCXByaXZhdGUgSW5wdXRTdHJlYW0gZmlsdGVyQ2xlYW4oSW5wdXRTdHJlYW0gaW4sIE9wZXJhdGlvblR5cGUgb3BUeXBlKQorCXByaXZhdGUgSW5wdXRTdHJlYW0gZmlsdGVyQ2xlYW4oSW5wdXRTdHJlYW0gaW4pCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpbiA9IGhhbmRsZUF1dG9DUkxGKGluLCBvcFR5cGUpOworCQlpbiA9IEVvbFN0cmVhbVR5cGVVdGlsLndyYXBJbnB1dFN0cmVhbShpbiwKKwkJCQlnZXRFb2xTdHJlYW1UeXBlKE9wZXJhdGlvblR5cGUuQ0hFQ0tJTl9PUCkpOwogCQlTdHJpbmcgZmlsdGVyQ29tbWFuZCA9IGdldENsZWFuRmlsdGVyQ29tbWFuZCgpOwogCQlpZiAoZmlsdGVyQ29tbWFuZCAhPSBudWxsKSB7CiAJCQlpZiAoRmlsdGVyQ29tbWFuZFJlZ2lzdHJ5LmlzUmVnaXN0ZXJlZChmaWx0ZXJDb21tYW5kKSkgewpAQCAtNTA5LDExICs1MDAsNiBAQCBmaWx0ZXJDb21tYW5kLCBnZXRFbnRyeVBhdGhTdHJpbmcoKSwKIAkJcmV0dXJuIGluOwogCX0KIAotCXByaXZhdGUgSW5wdXRTdHJlYW0gaGFuZGxlQXV0b0NSTEYoSW5wdXRTdHJlYW0gaW4sIE9wZXJhdGlvblR5cGUgb3BUeXBlKQotCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIEVvbFN0cmVhbVR5cGVVdGlsLndyYXBJbnB1dFN0cmVhbShpbiwgZ2V0RW9sU3RyZWFtVHlwZShvcFR5cGUpKTsKLQl9Ci0KIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB3b3JraW5nIHRyZWUgb3B0aW9ucyB1c2VkIGJ5IHRoaXMgaXRlcmF0b3IuCiAJICoKQEAgLTY2NCw3ICs2NTAsOCBAQCBwdWJsaWMgSW5zdGFudCBnZXRFbnRyeUxhc3RNb2RpZmllZEluc3RhbnQoKSB7CiAJcHVibGljIElucHV0U3RyZWFtIG9wZW5FbnRyeVN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCUlucHV0U3RyZWFtIHJhd2lzID0gY3VycmVudCgpLm9wZW5JbnB1dFN0cmVhbSgpOwogCQlpZiAoZ2V0Q2xlYW5GaWx0ZXJDb21tYW5kKCkgPT0gbnVsbAotCQkJCSYmIGdldEVvbFN0cmVhbVR5cGUoKSA9PSBFb2xTdHJlYW1UeXBlLkRJUkVDVCkgeworCQkJCSYmIGdldEVvbFN0cmVhbVR5cGUoCisJCQkJCQlPcGVyYXRpb25UeXBlLkNIRUNLSU5fT1ApID09IEVvbFN0cmVhbVR5cGUuRElSRUNUKSB7CiAJCQlyZXR1cm4gcmF3aXM7CiAJCX0KIAkJcmV0dXJuIGZpbHRlckNsZWFuKHJhd2lzKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9GU19XaW4zMi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0ZTX1dpbjMyLmphdmEKaW5kZXggZmYwOTRmNi4uYWU3M2QzZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0ZTX1dpbjMyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0ZTX1dpbjMyLmphdmEKQEAgLTE2LDYgKzE2LDcgQEAKIGltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVWaXNpdE9wdGlvbjsKIGltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVWaXNpdFJlc3VsdDsKIGltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOworaW1wb3J0IGphdmEubmlvLmZpbGUuTGlua09wdGlvbjsKIGltcG9ydCBqYXZhLm5pby5maWxlLlBhdGg7CiBpbXBvcnQgamF2YS5uaW8uZmlsZS5TaW1wbGVGaWxlVmlzaXRvcjsKIGltcG9ydCBqYXZhLm5pby5maWxlLmF0dHJpYnV0ZS5CYXNpY0ZpbGVBdHRyaWJ1dGVzOwpAQCAtOTYsNiArOTcsOSBAQCBwdWJsaWMgYm9vbGVhbiByZXRyeUZhaWxlZExvY2tGaWxlQ29tbWl0KCkgewogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCiAJcHVibGljIEVudHJ5W10gbGlzdChGaWxlIGRpcmVjdG9yeSwgRmlsZU1vZGVTdHJhdGVneSBmaWxlTW9kZVN0cmF0ZWd5KSB7CisJCWlmICghRmlsZXMuaXNEaXJlY3RvcnkoZGlyZWN0b3J5LnRvUGF0aCgpLCBMaW5rT3B0aW9uLk5PRk9MTE9XX0xJTktTKSkgeworCQkJcmV0dXJuIE5PX0VOVFJJRVM7CisJCX0KIAkJTGlzdDxFbnRyeT4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDw+KCk7CiAJCUZTIGZzID0gdGhpczsKIAkJYm9vbGVhbiBjaGVja0V4ZWN1dGFibGUgPSBmcy5zdXBwb3J0c0V4ZWN1dGUoKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9TdHJpbmdVdGlscy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL1N0cmluZ1V0aWxzLmphdmEKaW5kZXggOGFiMTMzOC4uOTE3YWRkMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL1N0cmluZ1V0aWxzLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL1N0cmluZ1V0aWxzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDA5LTIwMTAsIEdvb2dsZSBJbmMuIGFuZCBvdGhlcnMKKyAqIENvcHlyaWdodCAoQykgMjAwOS0yMDIyLCBHb29nbGUgSW5jLiBhbmQgb3RoZXJzCiAgKgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CkBAIC0xNSw2ICsxNSw3IEBACiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFubm90YXRpb25zLk5vbk51bGw7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5KR2l0VGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHM7CiAKIC8qKgogICogTWlzY2VsbGFuZW91cyBzdHJpbmcgY29tcGFyaXNvbiB1dGlsaXR5IG1ldGhvZHMuCkBAIC0zNyw2ICszOCwxMCBAQCBwdWJsaWMgZmluYWwgY2xhc3MgU3RyaW5nVXRpbHMgewogCQkJTENbY10gPSAoY2hhcikgKCdhJyArIChjIC0gJ0EnKSk7CiAJfQogCisJcHJpdmF0ZSBTdHJpbmdVdGlscygpIHsKKwkJLy8gRG8gbm90IGNyZWF0ZSBpbnN0YW5jZXMKKwl9CisKIAkvKioKIAkgKiBDb252ZXJ0IHRoZSBpbnB1dCB0byBsb3dlcmNhc2UuCiAJICogPHA+CkBAIC0yNjksOCArMjc0LDIwIEBAIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGpvaW4oQ29sbGVjdGlvbjxTdHJpbmc+IHBhcnRzLCBTdHJpbmcgc2VwYXJhdG9yLAogCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKIAl9CiAKLQlwcml2YXRlIFN0cmluZ1V0aWxzKCkgewotCQkvLyBEbyBub3QgY3JlYXRlIGluc3RhbmNlcworCS8qKgorCSAqIEFwcGVuZHMge0BsaW5rIENvbnN0YW50cyNET1RfR0lUX0VYVH0gdW5sZXNzIHRoZSBnaXZlbiBuYW1lIGFscmVhZHkgZW5kcworCSAqIHdpdGggdGhhdCBzdWZmaXguCisJICoKKwkgKiBAcGFyYW0gbmFtZQorCSAqICAgICAgICAgICAgdG8gY29tcGxldGUKKwkgKiBAcmV0dXJuIHRoZSBuYW1lIGVuZGluZyB3aXRoIHtAbGluayBDb25zdGFudHMjRE9UX0dJVF9FWFR9CisJICogQHNpbmNlIDYuMQorCSAqLworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5hbWVXaXRoRG90R2l0KFN0cmluZyBuYW1lKSB7CisJCWlmIChuYW1lLmVuZHNXaXRoKENvbnN0YW50cy5ET1RfR0lUX0VYVCkpIHsKKwkJCXJldHVybiBuYW1lOworCQl9CisJCXJldHVybiBuYW1lICsgQ29uc3RhbnRzLkRPVF9HSVRfRVhUOwogCX0KIAogCS8qKgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL0JpbmFyeUh1bmtJbnB1dFN0cmVhbS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL0JpbmFyeUh1bmtJbnB1dFN0cmVhbS5qYXZhCmluZGV4IDRmOTQwZDcuLjJjOTcyYjUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9CaW5hcnlIdW5rSW5wdXRTdHJlYW0uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vQmluYXJ5SHVua0lucHV0U3RyZWFtLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDIxIFRob21hcyBXb2xmIDx0aG9tYXMud29sZkBwYXJhbm9yLmNoPiBhbmQgb3RoZXJzCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEsIDIwMjIgVGhvbWFzIFdvbGYgPHRob21hcy53b2xmQHBhcmFub3IuY2g+IGFuZCBvdGhlcnMKICAqCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKQEAgLTkwLDcgKzkwLDcgQEAgcHJpdmF0ZSB2b2lkIGZpbGxCdWZmZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlieXRlW10gZW5jb2RlZCA9IG5ldyBieXRlW0Jhc2U4NS5lbmNvZGVkTGVuZ3RoKGxlbmd0aCldOwogCQlmb3IgKGludCBpID0gMDsgaSA8IGVuY29kZWQubGVuZ3RoOyBpKyspIHsKIAkJCWludCBiID0gaW4ucmVhZCgpOwotCQkJaWYgKGIgPCAwIHx8IGIgPT0gJ1xuJykgeworCQkJaWYgKGIgPCAwIHx8IGIgPT0gJ1xyJyB8fCBiID09ICdcbicpIHsKIAkJCQl0aHJvdyBuZXcgRU9GRXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAogCQkJCQkJSkdpdFRleHQuZ2V0KCkuYmluYXJ5SHVua0ludmFsaWRMZW5ndGgsCiAJCQkJCQlJbnRlZ2VyLnZhbHVlT2YobGluZU51bWJlcikpKTsKQEAgLTk5LDYgKzk5LDEwIEBAIHByaXZhdGUgdm9pZCBmaWxsQnVmZmVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJfQogCQkvLyBNdXN0IGJlIGZvbGxvd2VkIGJ5IGEgbmV3bGluZTsgdG9sZXJhdGUgRU9GLgogCQlpbnQgYiA9IGluLnJlYWQoKTsKKwkJaWYgKGIgPT0gJ1xyJykgeworCQkJLy8gQmUgbGVuaWVudCBhbmQgYWNjZXB0IENSLUxGLCB0b28uCisJCQliID0gaW4ucmVhZCgpOworCQl9CiAJCWlmIChiID49IDAgJiYgYiAhPSAnXG4nKSB7CiAJCQl0aHJvdyBuZXcgU3RyZWFtQ29ycnVwdGVkRXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAogCQkJCQlKR2l0VGV4dC5nZXQoKS5iaW5hcnlIdW5rTWlzc2luZ05ld2xpbmUsCmRpZmYgLS1naXQgYS9wb20ueG1sIGIvcG9tLnhtbAppbmRleCBjNDg2NTY5Li44MTA5M2MwIDEwMDY0NAotLS0gYS9wb20ueG1sCisrKyBiL3BvbS54bWwKQEAgLTE4LDcgKzE4LDcgQEAKICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC1wYXJlbnQ8L2FydGlmYWN0SWQ+CiAgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+Ci0gIDx2ZXJzaW9uPjYuMC4xLVNOQVBTSE9UPC92ZXJzaW9uPgorICA8dmVyc2lvbj42LjEuMS1TTkFQU0hPVDwvdmVyc2lvbj4KIAogICA8bmFtZT5KR2l0IC0gUGFyZW50PC9uYW1lPgogICA8dXJsPiR7amdpdC11cmx9PC91cmw+CkBAIC0xNTAsOSArMTUwLDkgQEAKICAgICA8amF2YS52ZXJzaW9uPjExPC9qYXZhLnZlcnNpb24+CiAgICAgPGJ1bmRsZS1tYW5pZmVzdD4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9NRVRBLUlORi9NQU5JRkVTVC5NRjwvYnVuZGxlLW1hbmlmZXN0PgogCi0gICAgPGpnaXQtbGFzdC1yZWxlYXNlLXZlcnNpb24+NS4xMy4wLjIwMjEwOTA4MDgyNy1yPC9qZ2l0LWxhc3QtcmVsZWFzZS12ZXJzaW9uPgorICAgIDxqZ2l0LWxhc3QtcmVsZWFzZS12ZXJzaW9uPjYuMC4wLjIwMjExMTI5MTAwMC1yPC9qZ2l0LWxhc3QtcmVsZWFzZS12ZXJzaW9uPgogICAgIDxhbnQtdmVyc2lvbj4xLjEwLjEyPC9hbnQtdmVyc2lvbj4KLSAgICA8YXBhY2hlLXNzaGQtdmVyc2lvbj4yLjcuMDwvYXBhY2hlLXNzaGQtdmVyc2lvbj4KKyAgICA8YXBhY2hlLXNzaGQtdmVyc2lvbj4yLjguMDwvYXBhY2hlLXNzaGQtdmVyc2lvbj4KICAgICA8anNjaC12ZXJzaW9uPjAuMS41NTwvanNjaC12ZXJzaW9uPgogICAgIDxqemxpYi12ZXJzaW9uPjEuMS4xPC9qemxpYi12ZXJzaW9uPgogICAgIDxqYXZhZXdhaC12ZXJzaW9uPjEuMS4xMzwvamF2YWV3YWgtdmVyc2lvbj4KQEAgLTE2MCw3ICsxNjAsNyBAQAogICAgIDx0ZXN0LWZvcmstY291bnQ+MUM8L3Rlc3QtZm9yay1jb3VudD4KICAgICA8YXJnczRqLXZlcnNpb24+Mi4zMzwvYXJnczRqLXZlcnNpb24+CiAgICAgPGNvbW1vbnMtY29tcHJlc3MtdmVyc2lvbj4xLjIxPC9jb21tb25zLWNvbXByZXNzLXZlcnNpb24+Ci0gICAgPG9zZ2ktY29yZS12ZXJzaW9uPjQuMy4xPC9vc2dpLWNvcmUtdmVyc2lvbj4KKyAgICA8b3NnaS1jb3JlLXZlcnNpb24+Ni4wLjA8L29zZ2ktY29yZS12ZXJzaW9uPgogICAgIDxzZXJ2bGV0LWFwaS12ZXJzaW9uPjQuMC4wPC9zZXJ2bGV0LWFwaS12ZXJzaW9uPgogICAgIDxqZXR0eS12ZXJzaW9uPjEwLjAuNjwvamV0dHktdmVyc2lvbj4KICAgICA8amFwaWNtcC12ZXJzaW9uPjAuMTUuMzwvamFwaWNtcC12ZXJzaW9uPgpAQCAtMTY5LDggKzE2OSw4IEBACiAgICAgPHNsZjRqLXZlcnNpb24+MS43LjMwPC9zbGY0ai12ZXJzaW9uPgogICAgIDxtYXZlbi1qYXZhZG9jLXBsdWdpbi12ZXJzaW9uPjMuMy4xPC9tYXZlbi1qYXZhZG9jLXBsdWdpbi12ZXJzaW9uPgogICAgIDx0eWNoby1leHRyYXMtdmVyc2lvbj4yLjUuMDwvdHljaG8tZXh0cmFzLXZlcnNpb24+Ci0gICAgPGdzb24tdmVyc2lvbj4yLjguODwvZ3Nvbi12ZXJzaW9uPgotICAgIDxib3VuY3ljYXN0bGUtdmVyc2lvbj4xLjY5PC9ib3VuY3ljYXN0bGUtdmVyc2lvbj4KKyAgICA8Z3Nvbi12ZXJzaW9uPjIuOC45PC9nc29uLXZlcnNpb24+CisgICAgPGJvdW5jeWNhc3RsZS12ZXJzaW9uPjEuNzA8L2JvdW5jeWNhc3RsZS12ZXJzaW9uPgogICAgIDxzcG90YnVncy1tYXZlbi1wbHVnaW4tdmVyc2lvbj40LjMuMDwvc3BvdGJ1Z3MtbWF2ZW4tcGx1Z2luLXZlcnNpb24+CiAgICAgPG1hdmVuLXByb2plY3QtaW5mby1yZXBvcnRzLXBsdWdpbi12ZXJzaW9uPjMuMS4yPC9tYXZlbi1wcm9qZWN0LWluZm8tcmVwb3J0cy1wbHVnaW4tdmVyc2lvbj4KICAgICA8bWF2ZW4tanhyLXBsdWdpbi12ZXJzaW9uPjMuMS4xPC9tYXZlbi1qeHItcGx1Z2luLXZlcnNpb24+CkBAIC0yMDMsNiArMjAzLDE0IEBACiAgICAgICA8aWQ+cmVwby5lY2xpcHNlLm9yZy5jYmktc25hcHNob3RzPC9pZD4KICAgICAgIDx1cmw+aHR0cHM6Ly9yZXBvLmVjbGlwc2Uub3JnL2NvbnRlbnQvcmVwb3NpdG9yaWVzL2NiaS1zbmFwc2hvdHMvPC91cmw+CiAgICAgPC9wbHVnaW5SZXBvc2l0b3J5PgorICAgIDxwbHVnaW5SZXBvc2l0b3J5PgorICAgICAgPGlkPnJlcG8uZWNsaXBzZS5vcmcuZGFzaC1yZWxlYXNlczwvaWQ+CisgICAgICA8dXJsPmh0dHBzOi8vcmVwby5lY2xpcHNlLm9yZy9jb250ZW50L3JlcG9zaXRvcmllcy9kYXNoLWxpY2Vuc2VzLXJlbGVhc2VzLzwvdXJsPgorICAgIDwvcGx1Z2luUmVwb3NpdG9yeT4KKyAgICA8cGx1Z2luUmVwb3NpdG9yeT4KKyAgICAgIDxpZD5yZXBvLmVjbGlwc2Uub3JnLmRhc2gtc25hcHNob3RzPC9pZD4KKyAgICAgIDx1cmw+aHR0cHM6Ly9yZXBvLmVjbGlwc2Uub3JnL2NvbnRlbnQvcmVwb3NpdG9yaWVzL2Rhc2gtbGljZW5zZXMtc25hcHNob3RzLzwvdXJsPgorICAgIDwvcGx1Z2luUmVwb3NpdG9yeT4KICAgPC9wbHVnaW5SZXBvc2l0b3JpZXM+CiAKICAgPGJ1aWxkPgpAQCAtMzM4LDcgKzM0Niw3IEBACiAgICAgICAgICAgICA8ZGVwZW5kZW5jeT48IS0tIGFkZCBzdXBwb3J0IGZvciBzc2gvc2NwIC0tPgogICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLndhZ29uPC9ncm91cElkPgogICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD53YWdvbi1zc2g8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgIDx2ZXJzaW9uPjMuNC4zPC92ZXJzaW9uPgorICAgICAgICAgICAgICA8dmVyc2lvbj4zLjUuMTwvdmVyc2lvbj4KICAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KICAgICAgICAgICA8L2RlcGVuZGVuY2llcz4KICAgICAgICAgPC9wbHVnaW4+CkBAIC0zODIsNiArMzkwLDExIEBACiAgICAgICAgICAgPGFydGlmYWN0SWQ+c3ByaW5nLWJvb3QtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgogICAgICAgICAgIDx2ZXJzaW9uPjIuNS40PC92ZXJzaW9uPgogICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5kYXNoPC9ncm91cElkPgorICAgICAgICAgIDxhcnRpZmFjdElkPmxpY2Vuc2UtdG9vbC1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgPHZlcnNpb24+MC4wLjEtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgICAgIDwvcGx1Z2luPgogICAgICAgPC9wbHVnaW5zPgogICAgIDwvcGx1Z2luTWFuYWdlbWVudD4KIApAQCAtNTQwLDYgKzU1MywxMCBAQAogICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CiAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXJlcG9ydC1wbHVnaW48L2FydGlmYWN0SWQ+CiAgICAgICA8L3BsdWdpbj4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmRhc2g8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPmxpY2Vuc2UtdG9vbC1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICA8L3BsdWdpbj4KICAgICA8L3BsdWdpbnM+CiAgIDwvYnVpbGQ+CiAKQEAgLTg1Myw3ICs4NzAsNyBAQAogICAgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZHQ8L2dyb3VwSWQ+CiAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZWNqPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjMuMjcuMDwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4zLjI4LjA8L3ZlcnNpb24+CiAgICAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KICAgICAgICAgICAgIDwvZGVwZW5kZW5jaWVzPgogICAgICAgICAgIDwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvdG9vbHMvQlVJTEQgYi90b29scy9CVUlMRAppbmRleCAwYzZiOGVjLi5hMTA5MDE5IDEwMDY0NAotLS0gYS90b29scy9CVUlMRAorKysgYi90b29scy9CVUlMRApAQCAtMSwzNCArMSwyOCBAQAogbG9hZCgKICAgICAiQGJhemVsX3Rvb2xzLy90b29scy9qZGs6ZGVmYXVsdF9qYXZhX3Rvb2xjaGFpbi5iemwiLAotICAgICJKREs5X0pWTV9PUFRTIiwKICAgICAiZGVmYXVsdF9qYXZhX3Rvb2xjaGFpbiIsCiApCiBsb2FkKCJAcnVsZXNfamF2YS8vamF2YTpkZWZzLmJ6bCIsICJqYXZhX3BhY2thZ2VfY29uZmlndXJhdGlvbiIpCiAKLUpESzExX0pWTV9PUFRTID0gWwotICAgICItLWFkZC1leHBvcnRzPWpkay5jb21waWxlci9jb20uc3VuLnRvb2xzLmphdmFjLmFwaT1BTEwtVU5OQU1FRCIsCi0gICAgIi0tYWRkLWV4cG9ydHM9amRrLmNvbXBpbGVyL2NvbS5zdW4udG9vbHMuamF2YWMuY29kZT1BTEwtVU5OQU1FRCIsCi0gICAgIi0tYWRkLWV4cG9ydHM9amRrLmNvbXBpbGVyL2NvbS5zdW4udG9vbHMuamF2YWMuY29tcD1BTEwtVU5OQU1FRCIsCi0gICAgIi0tYWRkLWV4cG9ydHM9amRrLmNvbXBpbGVyL2NvbS5zdW4udG9vbHMuamF2YWMuZmlsZT1BTEwtVU5OQU1FRCIsCi0gICAgIi0tYWRkLWV4cG9ydHM9amRrLmNvbXBpbGVyL2NvbS5zdW4udG9vbHMuamF2YWMubWFpbj1BTEwtVU5OQU1FRCIsCi0gICAgIi0tYWRkLWV4cG9ydHM9amRrLmNvbXBpbGVyL2NvbS5zdW4udG9vbHMuamF2YWMudHJlZT1BTEwtVU5OQU1FRCIsCi0gICAgIi0tYWRkLWV4cG9ydHM9amRrLmNvbXBpbGVyL2NvbS5zdW4udG9vbHMuamF2YWMudXRpbD1BTEwtVU5OQU1FRCIsCi0gICAgIi0tYWRkLW9wZW5zPWpkay5jb21waWxlci9jb20uc3VuLnRvb2xzLmphdmFjLmZpbGU9QUxMLVVOTkFNRUQiLAotICAgICItLXBhdGNoLW1vZHVsZT1qYXZhLmNvbXBpbGVyPSQobG9jYXRpb24gQGJhemVsX3Rvb2xzLy90b29scy9qZGs6amF2YV9jb21waWxlcl9qYXIpIiwKLSAgICAiLS1wYXRjaC1tb2R1bGU9amRrLmNvbXBpbGVyPSQobG9jYXRpb24gQGJhemVsX3Rvb2xzLy90b29scy9qZGs6amRrX2NvbXBpbGVyX2phcikiLAotICAgICItLWFkZC1vcGVucz1qYXZhLmJhc2UvamF2YS5uaW89QUxMLVVOTkFNRUQiLAotICAgICItLWFkZC1vcGVucz1qYXZhLmJhc2UvamF2YS5sYW5nPUFMTC1VTk5BTUVEIiwKLV0KLQogZGVmYXVsdF9qYXZhX3Rvb2xjaGFpbigKLSAgICBuYW1lID0gImVycm9yX3Byb25lX3dhcm5pbmdzX3Rvb2xjaGFpbiIsCi0gICAgYm9vdGNsYXNzcGF0aCA9IFsiQGJhemVsX3Rvb2xzLy90b29scy9qZGs6cGxhdGZvcm1jbGFzc3BhdGguamFyIl0sCi0gICAganZtX29wdHMgPSBKREsxMV9KVk1fT1BUUywKLSAgICBzb3VyY2VfdmVyc2lvbiA9ICIxMSIsCi0gICAgdGFyZ2V0X3ZlcnNpb24gPSAiMTEiLAorICAgIG5hbWUgPSAiZXJyb3JfcHJvbmVfd2FybmluZ3NfdG9vbGNoYWluX2phdmExMSIsCiAgICAgcGFja2FnZV9jb25maWd1cmF0aW9uID0gWwogICAgICAgICAiOmVycm9yX3Byb25lIiwKICAgICBdLAorICAgIHNvdXJjZV92ZXJzaW9uID0gIjExIiwKKyAgICB0YXJnZXRfdmVyc2lvbiA9ICIxMSIsCisgICAgdmlzaWJpbGl0eSA9IFsiLy92aXNpYmlsaXR5OnB1YmxpYyJdLAorKQorCitkZWZhdWx0X2phdmFfdG9vbGNoYWluKAorICAgIG5hbWUgPSAiZXJyb3JfcHJvbmVfd2FybmluZ3NfdG9vbGNoYWluX2phdmExNyIsCisgICAgY29uZmlndXJhdGlvbiA9IGRpY3QoKSwKKyAgICBqYXZhX3J1bnRpbWUgPSAiQGJhemVsX3Rvb2xzLy90b29scy9qZGs6cmVtb3RlamRrXzE3IiwKKyAgICBwYWNrYWdlX2NvbmZpZ3VyYXRpb24gPSBbCisgICAgICAgICI6ZXJyb3JfcHJvbmUiLAorICAgIF0sCisgICAgc291cmNlX3ZlcnNpb24gPSAiMTciLAorICAgIHRhcmdldF92ZXJzaW9uID0gIjE3IiwKICAgICB2aXNpYmlsaXR5ID0gWyIvL3Zpc2liaWxpdHk6cHVibGljIl0sCiApCiAKQEAgLTEwOCwyMCArMTAyLDI1IEBACiAgICAgICAgICIvL29yZy5lY2xpcHNlLmpnaXQuYW50LnRlc3QvLi4uIiwKICAgICAgICAgIi8vb3JnLmVjbGlwc2UuamdpdC5hbnQvLi4uIiwKICAgICAgICAgIi8vb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlLy4uLiIsCisgICAgICAgICIvL29yZy5lY2xpcHNlLmpnaXQuZ3BnLmJjLnRlc3QvLi4uIiwKKyAgICAgICAgIi8vb3JnLmVjbGlwc2UuamdpdC5ncGcuYmMvLi4uIiwKICAgICAgICAgIi8vb3JnLmVjbGlwc2UuamdpdC5odHRwLmFwYWNoZS8uLi4iLAogICAgICAgICAiLy9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyLy4uLiIsCiAgICAgICAgICIvL29yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0Ly4uLiIsCi0gICAgICAgICIvL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cC8uLi4iLAorICAgICAgICAiLy9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LnNzaC8uLi4iLAogICAgICAgICAiLy9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0Ly4uLiIsCisgICAgICAgICIvL29yZy5lY2xpcHNlLmpnaXQuanVuaXQvaHR0cC8uLi4iLAogICAgICAgICAiLy9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIudGVzdC8uLi4iLAogICAgICAgICAiLy9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIvLi4uIiwKICAgICAgICAgIi8vb3JnLmVjbGlwc2UuamdpdC5sZnMudGVzdC8uLi4iLAogICAgICAgICAiLy9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy8uLi4iLAotICAgICAgICAiLy9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy8uLi4iLAogICAgICAgICAiLy9vcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0Ly4uLiIsCiAgICAgICAgICIvL29yZy5lY2xpcHNlLmpnaXQucGdtLy4uLiIsCi0gICAgICAgICIvL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS8uLi4iLAogICAgICAgICAiLy9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUuYWdlbnQvLi4uIiwKKyAgICAgICAgIi8vb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLnRlc3QvLi4uIiwKKyAgICAgICAgIi8vb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLy4uLiIsCisgICAgICAgICIvL29yZy5lY2xpcHNlLmpnaXQuc3NoLmpzY2gudGVzdC8uLi4iLAorICAgICAgICAiLy9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5qc2NoLy4uLiIsCiAgICAgICAgICIvL29yZy5lY2xpcHNlLmpnaXQudGVzdC8uLi4iLAogICAgICAgICAiLy9vcmcuZWNsaXBzZS5qZ2l0LnVpLy4uLiIsCiAgICAgICAgICIvL29yZy5lY2xpcHNlLmpnaXQvLi4uIiwKZGlmZiAtLWdpdCBhL3Rvb2xzL2JhemVsaXNrX3ZlcnNpb24uYnpsIGIvdG9vbHMvYmF6ZWxpc2tfdmVyc2lvbi5iemwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4YjNkMTAuLjAwMDAwMDAKLS0tIGEvdG9vbHMvYmF6ZWxpc2tfdmVyc2lvbi5iemwKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi1fdGVtcGxhdGUgPSAiIiIKLWxvYWQoIkBiYXplbF9za3lsaWIvL2xpYjp2ZXJzaW9ucy5iemwiLCAidmVyc2lvbnMiKQotCi1kZWYgY2hlY2tfYmF6ZWxfdmVyc2lvbigpOgotICB2ZXJzaW9ucy5jaGVjayhtaW5pbXVtX2JhemVsX3ZlcnNpb24gPSAie3ZlcnNpb259IikKLSIiIi5zdHJpcCgpCi0KLWRlZiBfaW1wbChyZXBvc2l0b3J5X2N0eCk6Ci0gICAgcmVwb3NpdG9yeV9jdHguc3ltbGluayhMYWJlbCgiQC8vOi5iYXplbHZlcnNpb24iKSwgIi5iYXplbHZlcnNpb24iKQotICAgIGJhemVsdmVyc2lvbiA9IHJlcG9zaXRvcnlfY3R4LnJlYWQoIi5iYXplbHZlcnNpb24iKS5zdHJpcCgpCi0KLSAgICByZXBvc2l0b3J5X2N0eC5maWxlKCJCVUlMRCIsIGV4ZWN1dGFibGUgPSBGYWxzZSkKLQotICAgIHJlcG9zaXRvcnlfY3R4LmZpbGUoImNoZWNrLmJ6bCIsIGV4ZWN1dGFibGUgPSBGYWxzZSwgY29udGVudCA9IF90ZW1wbGF0ZS5mb3JtYXQodmVyc2lvbiA9IGJhemVsdmVyc2lvbikpCi0KLWJhemVsaXNrX3ZlcnNpb24gPSByZXBvc2l0b3J5X3J1bGUoaW1wbGVtZW50YXRpb24gPSBfaW1wbCkKZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZS1iYXplbHJjIGIvdG9vbHMvcmVtb3RlLWJhemVscmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThmNzk0ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3JlbW90ZS1iYXplbHJjCkBAIC0wLDAgKzEsNjcgQEAKKyMgQ29weXJpZ2h0IDIwMjIgVGhlIEJhemVsIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIyBUaGlzIGZpbGUgaXMgYXV0by1nZW5lcmF0ZWQgZnJvbSByZWxlYXNlL2JhemVscmMudHBsIGFuZCBzaG91bGQgbm90IGJlCisjIG1vZGlmaWVkIGRpcmVjdGx5LgorCisjIFRoaXMgLmJhemVscmMgZmlsZSBjb250YWlucyBhbGwgb2YgdGhlIGZsYWdzIHJlcXVpcmVkIGZvciB0aGUgcHJvdmlkZWQKKyMgdG9vbGNoYWluIHdpdGggUmVtb3RlIEJ1aWxkIEV4ZWN1dGlvbi4KKyMKKyMgVGhpcyAuYmF6ZWxyYyBmaWxlIGFsc28gY29udGFpbnMgYWxsIG9mIHRoZSBmbGFncyByZXF1aXJlZCBmb3IgdGhlIGxvY2FsCisjIGRvY2tlciBzYW5kYm94aW5nLgorCisjIERlcGVuZGluZyBvbiBob3cgbWFueSBtYWNoaW5lcyBhcmUgaW4gdGhlIHJlbW90ZSBleGVjdXRpb24gaW5zdGFuY2UsIHNldHRpbmcKKyMgdGhpcyBoaWdoZXIgY2FuIG1ha2UgYnVpbGRzIGZhc3RlciBieSBhbGxvd2luZyBtb3JlIGpvYnMgdG8gcnVuIGluIHBhcmFsbGVsLgorIyBTZXR0aW5nIGl0IHRvbyBoaWdoIGNhbiByZXN1bHQgaW4gam9icyB0aGF0IHRpbWVvdXQsIGhvd2V2ZXIsIHdoaWxlIHdhaXRpbmcKKyMgZm9yIGEgcmVtb3RlIG1hY2hpbmUgdG8gZXhlY3V0ZSB0aGVtLgorYnVpbGQ6cmVtb3RlIC0tam9icz0yMDAKK2J1aWxkOnJlbW90ZSAtLWRpc2tfY2FjaGU9CisKKyMgU2V0IHNldmVyYWwgZmxhZ3MgcmVsYXRlZCB0byBzcGVjaWZ5aW5nIHRoZSBwbGF0Zm9ybSwgdG9vbGNoYWluIGFuZCBqYXZhCisjIHByb3BlcnRpZXMuCitidWlsZDpyZW1vdGUgLS1ob3N0X2phdmFiYXNlPUByYmVfamRrMTEvL2phdmE6amRrCitidWlsZDpyZW1vdGUgLS1qYXZhYmFzZT1AcmJlX2pkazExLy9qYXZhOmpkaworYnVpbGQ6cmVtb3RlIC0tY3Jvc3N0b29sX3RvcD1AcmJlX2pkazExLy9jYzp0b29sY2hhaW4KK2J1aWxkOnJlbW90ZSAtLWV4dHJhX3Rvb2xjaGFpbnM9QHJiZV9qZGsxMS8vY29uZmlnOmNjLXRvb2xjaGFpbgorYnVpbGQ6cmVtb3RlIC0tZXh0cmFfZXhlY3V0aW9uX3BsYXRmb3Jtcz1AcmJlX2pkazExLy9jb25maWc6cGxhdGZvcm0KK2J1aWxkOnJlbW90ZSAtLWhvc3RfcGxhdGZvcm09QHJiZV9qZGsxMS8vY29uZmlnOnBsYXRmb3JtCitidWlsZDpyZW1vdGUgLS1wbGF0Zm9ybXM9QHJiZV9qZGsxMS8vY29uZmlnOnBsYXRmb3JtCitidWlsZDpyZW1vdGUgLS1hY3Rpb25fZW52PUJBWkVMX0RPX05PVF9ERVRFQ1RfQ1BQX1RPT0xDSEFJTj0xCisKKyMgU2V0IHZhcmlvdXMgc3RyYXRlZ2llcyBzbyB0aGF0IGFsbCBhY3Rpb25zIGV4ZWN1dGUgcmVtb3RlbHkuIE1peGluZyByZW1vdGUKKyMgYW5kIGxvY2FsIGV4ZWN1dGlvbiB3aWxsIGxlYWQgdG8gZXJyb3JzIHVubGVzcyB0aGUgdG9vbGNoYWluIGFuZCByZW1vdGUKKyMgbWFjaGluZSBleGFjdGx5IG1hdGNoIHRoZSBob3N0IG1hY2hpbmUuCitidWlsZDpyZW1vdGUgLS1kZWZpbmU9RVhFQ1VUT1I9cmVtb3RlCisKKyMgRW5hYmxlIHRoZSByZW1vdGUgY2FjaGUgc28gYWN0aW9uIHJlc3VsdHMgY2FuIGJlIHNoYXJlZCBhY3Jvc3MgbWFjaGluZXMsCisjIGRldmVsb3BlcnMsIGFuZCB3b3Jrc3BhY2VzLgorYnVpbGQ6cmVtb3RlIC0tcmVtb3RlX2NhY2hlPXJlbW90ZWJ1aWxkZXhlY3V0aW9uLmdvb2dsZWFwaXMuY29tCisKKyMgRW5hYmxlIHJlbW90ZSBleGVjdXRpb24gc28gYWN0aW9ucyBhcmUgcGVyZm9ybWVkIG9uIHRoZSByZW1vdGUgc3lzdGVtcy4KK2J1aWxkOnJlbW90ZSAtLXJlbW90ZV9leGVjdXRvcj1yZW1vdGVidWlsZGV4ZWN1dGlvbi5nb29nbGVhcGlzLmNvbQorCisjIFNldCBhIGhpZ2hlciB0aW1lb3V0IHZhbHVlLCBqdXN0IGluIGNhc2UuCitidWlsZDpyZW1vdGUgLS1yZW1vdGVfdGltZW91dD0zNjAwCisKKyMgRW5hYmxlIGF1dGhlbnRpY2F0aW9uLiBUaGlzIHdpbGwgcGljayB1cCBhcHBsaWNhdGlvbiBkZWZhdWx0IGNyZWRlbnRpYWxzIGJ5CisjIGRlZmF1bHQuIFlvdSBjYW4gdXNlIC0tYXV0aF9jcmVkZW50aWFscz1zb21lX2ZpbGUuanNvbiB0byB1c2UgYSBzZXJ2aWNlCisjIGFjY291bnQgY3JlZGVudGlhbCBpbnN0ZWFkLgorYnVpbGQ6cmVtb3RlIC0tZ29vZ2xlX2RlZmF1bHRfY3JlZGVudGlhbHMKKworIyBUaGUgZm9sbG93aW5nIGZsYWdzIGVuYWJsZSB0aGUgcmVtb3RlIGNhY2hlIHNvIGFjdGlvbiByZXN1bHRzIGNhbiBiZSBzaGFyZWQKKyMgYWNyb3NzIG1hY2hpbmVzLCBkZXZlbG9wZXJzLCBhbmQgd29ya3NwYWNlcy4KK2J1aWxkOnJlbW90ZS1jYWNoZSAtLXJlbW90ZV9jYWNoZT1yZW1vdGVidWlsZGV4ZWN1dGlvbi5nb29nbGVhcGlzLmNvbQorYnVpbGQ6cmVtb3RlLWNhY2hlIC0tdGxzX2VuYWJsZWQ9dHJ1ZQorYnVpbGQ6cmVtb3RlLWNhY2hlIC0tcmVtb3RlX3RpbWVvdXQ9MzYwMAorYnVpbGQ6cmVtb3RlLWNhY2hlIC0tYXV0aF9lbmFibGVkPXRydWUK